Index: external/mit/ctwm/dist/CHANGES =================================================================== RCS file: external/mit/ctwm/dist/CHANGES diff -N external/mit/ctwm/dist/CHANGES --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/CHANGES 3 Sep 2015 12:19:42 -0000 @@ -0,0 +1,1753 @@ + + + Changes from version 1.0 to 1.1 + ------------------------------- + + + 1 - Correction of a few bugs + + 2 - Add the OpaqueResize flag : similar to OpaqueMove, but redraw the window + you are resizing at each motion event. Extremely resource consuming, but + beautiful with fast server/client/network. + + 3 - Now if you don't specify any background/foreground/pixmap indication for + the root window, ctwm leave it alone so you can have your own root + background pixmap. + + 4 - You can now specify on the command line a list of workspaces in which a + new client opens. The syntaxe is : + + whatever_client -xrm 'ctwm.workspace: name1 name2 ... namen' + or whatever_client -xrm 'ctwm.workspace: all' + + where 'name1', 'name2', ..., 'namen' are names of workspaces and 'all' refers +to all workspaces. + + example : + + xload -xrm 'ctwm.workspace : all' + + 5 - Add the OccupyAll command in .ctwmrc, you can now specify at startup a + list of windows that occupy all the workspaces. + + example : + +OccupyAll { + "xload" + "xconsole" + "xbiff" +} + + 6 - Add the f.gotoworkspace function. It goes the workspace specified by its + name. + + example : + +"F1" = : root : f.gotoworkspace "cognac" + + + Changes from version 1.1 to 1.2 + ------------------------------- + + + 1 - you can now directly edit workspace names in their buttons. only + printable characters, delete and backspace keys are honored. + + 2 - Ctwm now handle shaped colored icons in XPM format. This added the + variable XPMIconDirectory, and slightly modified the syntax of the Icons + command. The XPM icon file names should be prefixed by the character '@' + to distinguished them from the ordinary bitmap files. + +Example : + +XPMIconDirectory "/usr/lib/X11/X11/XPM" + +Icons { + "Axe" "@xedit.xpm" + "xterm" "@xterm.xpm" + "xrn" "@xrn.xpm" + "HPterm" "@hpterm.xpm" + "XAlarm" "@datebook.xpm" + "Xman" "@xman.xpm" +} + + These above xpm pixmap are given. + + + 3 - Many bugs fixed : + + - Icon regions now works. + - the absence of ShowIconManager is taken into account. + - The -iconic flag is honored. + - The -xrm 'ctwm.workspace' works as expected. + - I think that f.warpto[to|ring] works correctly i.e warps. + also to the correct workspace if the destination window + doesn't occupy the current workspace. + - A few minor bugs fixed. + + + Changes from version 1.2 to 1.3 + ------------------------------- + + + 1 - Many bugs fixed : + + - Partial geometry in the WorkSpaceManagerGeometry statement no longer + cause ctwm to core dump. + + - The occupy window name now is "Occupy Window" instead of "Occupy WIndow" + a typo on the uppercase I in window. + + - Several types problems that make good compilers to issue warnings. + + - The icons of the WorkSpaceManager and Occupy Window windows now behave + correctly with ButtonPress. + + - UnknownIcon can now have Xpm icons specified. + + - f.showiconmgr no longer map empty icon managers. + + - The ctwm process is smaller (even smaller than twm). + + + 2 - Add the Occupy command in .ctwmrc, you can now specify at startup + which window occupy which workspace. + + example : + +Occupy { + "xload" {"all"} + Window "xterm" {"here" "there" "elsewhere"} + "xv" {"images"} + WorkSpace "images" {"xloadimage"} +} + + + Changes from version 1.3 to 2.0 + ------------------------------- + + 1 - A few bugs fixed : + + - Resize at window creation with button2 works. + + - Some others i don't remember. + + 2 - Better support of monochrome displays : video inverse instead of 3d + buttons. + + 3 - WorkSpaceManager and Occupy Window are now resizable. Don't forget to + verify you have a powerful server before resizing the workspace manager + with OpaqueResize set. + + 4 - X11R4 support with Imakefile.X11R4 (i didn't try so tell me). + + 5 - The visibility of the workspace manager is now consistant with the + visibility of the icon managers. This mean that by default the workspace + manager is *NOT* visible at startup. Use the ShowWorkSpaceManager to + make it visible at startup. + + 6 - Two new functions : f.showworkspacemgr and f.hideworkspacemgr have been + added. They do what you imagine. + + 7 - And now, the cherry on the cake. The workspace manager has now 2 states, + the button state (the usual one) and the map state (the new one). In the + map state the buttons are replaced by windows displaying a synthetic + view of the corresponding workspaces. All the non-iconified windows of + the workspace are shown as small windows with the icon name written in + it. It looks like the virtual screen of [t]vtwm, but, of course, much + nicer. + + In this state, you can modify directly the occupation of your windows by + manipulating these little windows. + + - Button1 move a window from a workspace to another. + - Button2 copy a window from a workspace to another. + - Button3 remove a window from a workspace. + + Clicking in the "root" of these windows warps you to the corresponding + workspace. Clicking and releasing Button1 or Button2 quickly in a small + window go to the corresponding workspace and warps the pointer to the + corresponding window. + + The Control-Key (Press and Release) in workspace manager toggles the + buttons and map state. + + Four variables and Three functions manipulates this : + + - StartInMapState : The map state is selected at startup, default is + buttons state. + + - MapWindowCurrentWorkSpace : The aspect of the current workspace in + the map window. + + - MapWindowDefaultWorkSpace : Specify the aspect of the non-current + workspaces in the map window. + + - MapWindowBackground : + - MapWindowForeground : Specify the aspect of the small windows in + the map window on a per-client basis. + + - f.setbuttonsstate : You can guess. + + - f.setmapstate : You can guess. + + - f.togglestate : You can guess. + + + 8 - AutoRaise with RaiseDelay. Thanks to Johan Vromans (jv@mh.nl) who gave me + this patch. I think Warren Jessop (whj@cs.washington.edu) wrote it for + twm. + + + Changes from version 2.0 to 2.1 + ------------------------------- + + 1 - Cleanup code to make gcc happy. + + 2 - Bugs fixed + + - IconMaskHint honored. + - Workaround a bug on HP7xx/8.07 servers for RaiseLower in Map window. + The stacking order in the MapWindow was not correct on those servers. + use : + + EXTRA_DEFINES = -DBUGGY_HP700_SERVER + + in your Imakefile if you plan to use this server. It doesn't break on + others servers. + + - No longer core dump if MapWindowCurrentWorkSpace or MapWindowDefault- + WorkSpace are specified before WorkSpaces in .ctwmrc + + - Small windows handling in the WorkspaceMap window works even if the + Workspace Manager window has a title (that was not the case with + ctwm-2.0). + + - ForceIcon works for Xpm icons. + + - Occupation of "transient for" window is correct. + + - RestartPreviousState necessary to keep previous window occupation on + restart. + + - If a window dies while Occupy Window is mapped, the Occupy Window is + correctly unmapped. + + 3 - Ctwm now maintains the WM_CURRENTWORKSPACE property on the root window + and WM_OCCUPATION on every windows. They mean what you think. These + properties are string properties and are in clear text instead of an + obscure mask. If an external application changes these properties ctwm + respond with the correct actions, changing the current workspace or the + occupation of a window. I give a small example (gtw.c). An application + can manage its occupation and it is even possible to write an external + workspace manager. It is of course not ICCCM compliant because ICCCM says + nothing on multiple workspaces. The special names "all" and "current" can + be used. And you can specify relative occupations if the workspace names + list begin with a '+' or '-' (ex: +current adds a window to the current + workspace). + + 4 - 3 new functions : + + - f.pin : Pin/Unpin a menu on the screen. Only usable inside a root menu. + + - f.vanish : Remove a window from the current workspace. Works only if + the window occupies at least one other workspace. + + - f.warphere "win-name" : Adds the window whose name matches win-name to + the current workspace and warps the pointer to it. + + 5 - And a new keyword : NoShowOccupyAll : tells ctwm not to show OccupyAll + windows in the WorkSpaceMap window. + + 6 - All window names can now be specified as (shell-like) regular expressions. + + + + + Changes from version 2.1 to 2.2 + ------------------------------- + + + 1 - Bugs : + + - Redraw small windows when icon name changes. + - Kill window from the title bar menu + - Partial geometry on Workspace manager can core dump. + - AutoRaise and tiny windows in the Workspace Map. + + 2 - Transient windows and non group leader windows are now always on the top + of their leader. + + 3 - When an icon name changes, the icon itself changes automatically according + the Icons list in your .ctwmrc. This is very useful for clients that have + several states. For example xrn or some X mail readers can have two + differents icons for new mail (news) / no new mail (news). + + 4 - A new keyword : TransientHasOccupation has been added for people annoyed + by the fact that since ctwm-2.1, transient-for non group-leader windows + have the same occupation that their leader. If you specify this, these + windows have their own occupation. + + 5 - A new keyword : AutoOccupy. If specified, the occupation of a client is + changed automatically when it's name or icon name changes, according to + the Occupy list in your .ctwmrc. For example a mail reader can popup + instantly in the current workspace when mail arrives. + + 6 - A new keyword : DontPaintRootWindow. If specified, the root window is + not painted, whatever you told in the Workspaces specification. This is + useful to have pixmaps in the Workspace Map but not on the root window. + + 7 - You can use XPM pixmaps for your background root window. Use xpm:filename + instead of @filename. The latter is still accepted. Of course if your + XPM file has transparent parts, there are not transparent on the root + window, i.e. you dont see the electron gun through it. + + 8 - XPMIconDirectory is replaced by PixmapDirectory. (XPMIconDirectory is + still accepted). + + 9 - You can now use colored root background pixmap and icons in many formats. + Ctwm use the imconv library from the San Diego Supercomputer Center. + To use these formats, specify : 'im:filename' for the pixmap name. + + - The following format are supported : + + bmp Microsoft Windows bitmap image file + cur Microsoft Windows cursor image file + eps Adobe Encapsulated PostScript file + gif Compuserve Graphics image file + hdf Hierarchical Data File + ico Microsoft Windows icon image file + icon Sun Icon and Cursor file + iff Sun TAAC Image File Format + mpnt Apple Macintosh MacPaint file + pbm PBM Portable Bit Map file + pcx ZSoft IBM PC Paintbrush file + pgm PBM Portable Gray Map file + pic PIXAR picture file + pict Apple Macintosh QuickDraw/PICT file + pix Alias image file + ppm PBM Portable Pixel Map file + pnm PBM Portable aNy Map file + ps Adobe PostScript file + ras Sun Rasterfile + rgb SGI RGB image file + rla Wavefront raster image file + rle Utah Run length encoded image file + synu SDSC Synu image file + tga Truevision Targa image file + tiff Tagged image file + viff Khoros Visualization image file + x AVS X image file + xbm X11 bitmap file + xwd X Window System window dump image file + + - You can find the imconv package at ftp.sdsc.edu. in the directory + /pub/sdsc/graphics/imtools. + - If (width > screenwidth / 2) || (height > screenheight / 2) the image is + centered else it is tiled. + - If you don't have the libim library or don't want to use it, undefine + IMCONV in Imakefile. + + + But take care : + + - It is very memory consuming (on the server side). + - It is very color cells consuming. + - The ctwm executable is much larger executable. + - Startup is much much slower (but not the workspace swap). + - It works only for 8 planes pixmaps and 8 planes screens. If there is + an imconv specialist somewhere that can generelize this, he is + welcome. + + + + 10 - Two new functions : f.nextworkspace, f.prevworkspace. + + 11 - Xpm examples files are now automatically installed in $(TWMDIR) + + 12 - An example of .ctwmrc is given, showing some aspect of ctwm + (example.ctwmrc). It is not a complete .ctwmrc, only the ctwm + aspects are shown. + + 13 - A new file PROBLEMS has been added that lists some problems you + can have while using ctwm and some solutions. + + +Is there any good pixmap designer out there, that i can add beautiful +icons and background to the distribution. Don't use too many colors, +try to use the same few already used in the example icons. + + + Changes from version 2.2 to 3.0 + ------------------------------- + + 1 - A few bugs fixes. + + 2 - A 3D presentation of menus, titles and IconManagers can be selected with : + UseThreeDMenus, UseThreeDTitles and UseThreeDIconManagers. If + UseThreeDTitles is set the default values for TitleButtonBorderWidth, + FramePadding, TitlePadding, ButtonIndent are set to 0 pixels. I am not + that proud of the appearance of 3D titles but 3D menus look nice. If + UseThreeDTitles is set the flag SunkFocusWindowTitle tells ctwm to sunk + the title of the window that the focus. 3D features look ugly on + monochrome displays, but I have no such display for testing purpose. If a + monochrome display owner can have a look, he is welcome. The contrast + of the clear and dark shadows can be tuned via the ClearShadowContrast + and DarkShadowContrast parameters. These parameters are percentages. + The formulas used are : + + clear.{RGB} = (65535 - color.{RGB}) * (ClearShadowContrast / 100), + dark.{RGB} = color.{RGB} * ((100 - DarkShadowContrast) / 100), + + If you choose UseThreeDIconManagers, icon titles are also 3D. By defaults + new colors are allocated for shadows, but you can specify BeNiceToColormap + to inform ctwm to use stipple instead of new colors, the effect is + less beautiful, but acceptable. + + + 3 - A new keyword : NoIconTitle with an optionnal window list. + + 4 - A new keyword : TransientOnTop with an integer parameter. This + paramater is a percentage and tells ctwm to put transient (and + non-group leader) windows always on top of their leader only if + their surface is smaller than this fraction of the surface of + their leader. + + 5 - OpaqueMove and OpaqueResize now accept an optionnal list of windows + as parameter. They also have their NoOpaqueMove and NoOpaqueResize + counterpart with the same syntax. + + 6 - Two new keywords : OpaqueMoveThreshold and OpaqueResizeThreshold + with one integer parameter. The parameter represent a percentage of + the screen surface. If Opaque{Move,Resize} is active for a window, + (via point 4) the opaque {move, resize} is done only if the window + surface is smaller than this percentage of the screen. The default + is large enough. + + 7 - Startup is optionally piped into m4 before ctwm parse it, ypu can + now have a common startup file for ctwm, tvtwm, etc ... It can be + disabled at compile time by undefining USEM4 in Imakefile. It can + be disabled at execution time by using the -n option. Take care if + you have backquotes (`) in your .ctwmrc file. This character is + special to m4. In that case, put something like : + +changequote(,) +changequote(``,'') + + at the beginning of your .ctwmrc. + + 8 - The startup looks nicer (I think). If you use XPM and the file + welcome.xpm is present in your PixmapDirectory, it is displayed + while the startup is in progress. Unfortunately, the PixmapDirectory + is known only after the .ctwmrc is loaded, and this loading is + a large part of the startup time. So you can define the environnement + variable CTWM_WELCOME_FILE to point to an XPM file, in which case + it will be displayed very quickly. + + 9 - A new function : f.separator, valid only in menus. The effect is to + add a line separator between the previous and the following entry. + The name selector part in the menu is not used. f.separator works + only with conventionnal menus, not with 3D menus. + + 10 - Thanks to bret@essex.ac.uk, the man page is integrated with the original + twm one, and is of a much better quality. + + 11 - While moving a window, the position is displayed in a similar way as + the size when resizing. + + 12 - The info window now display the compile time options of the current + version of ctwm. + + 13 - You can now specify xpm pixmap title buttons and TitleHighlight. + There is 5 built-in scalable pixmap for buttons, :xpm:menu, :xpm:dot, + :xpm:resize, :xpm:zoom and :xpm:bar. + + 14 - Ctwm now restarts when receiving signal SIGHUP, so to restart it from + a shell, use : kill -1 the_ctwm_pid + + 15 - 2 New keywords : WMgrVertButtonIndent and WMgrHorizButtonIndent with + 1 parameter, specifying the vertical and horizontal space beetween + buttons in the workspace manager. + + 16 - Some more xpm files given. Among them several backgrounds. + + 17 - Ctwm set the property WM_WORKSPACELIST (type STRING) on the root + window, this property contains the null separated list of all the + workspaces. Now the WM_OCCUPATION property on each window is a null + separated list instead of a space separated list, it was wrong since + workspace names can contain spaces. So, the first time you will start + the this version, your windows will show up anywhere. + + 18 - A new library libctwm.a and an include file ctwm.h are given. The + library contains functions for an external program to have some + control over ctwm. The functions are : + + Bool CtwmIsRunning (); + char **CtwmWorkspaces (); + char *CtwmCurrentWorkspace (); + int CtwmChangeWorkspace (); + char **CtwmCurrentOccupation (); + int CtwmSetOccupation (); + int CtwmAddToCurrentWorkspace (); + + There is no documentation. A program demolib.c is given to help. + + + + Changes from version 3.0 to 3.1 + ------------------------------- + + 1 - Ctwm is moving. You can now have animated images for icons, root backgrounds, + title buttons and focus window title image. This adds one new keyword : + AnimationSpeed, and 4 new function :f.startanimation, f.stopanimation, + f.speedupanimation and f.slowdownanimation. An image name is considered + an animation if it contains the percent (%) character. In which case + ctwm replaces this character by numbers starting a 1, and will play + an animation with all these images. There is only 2 examples : ball%.xpm + suitable for icons, and supman%.xbm suitable for title highlight. + Another example (much more beautiful) can be found in the Mosaic + distribution. There is also one built-in animation for title buttons : + "%xpm:resize", for example : + +RightTitleButton "%xpm:resize" = f.resize + + 2 - Add the WMgrButtonShadowDepth keyword to control the depth of the + shadow of the workspace manager buttons. + + 3 - The RandomPlacement command has now an optionnal parameter : + "on", "off", "all" or "unmapped". + + 4 - Three new keywords : ChangeWorkspaceFunction, IconifyFunction and + DeIconifyFunction, the argument is the name of a function that is + executed whenever the corresponding event occurs. Useful for sounds : + +ChangeWorkspaceFunction !"cat /users/lecom/sounds/bom.au 2>/dev/null 1>/dev/audio&" + + 5 - A new keyword : IconJustification with 1 argument, either :"left", "center" + or "right". Tells ctwm how to justify the icon image on the icon title + (if any). + + 6 - flex is now supported. + + 7 - The IconRegion keyword now support an optionnal winlist argument. + Thanks to Mike Hoswell (hoswell@ncar.ucar.edu) for adding this. + + 8 - f.separator now works (does something) with 3D menus. + + 9 - The format xwd is now accepted for images (icons, background, ...). You + have to prefix the image file name with xwd: to use this format. + If the first character of an image file name is |, the filename is + supposed to be a command that output a xwd image, and it is executed. + For example, to use a gif file, use : + +"|(giftoppm | pnmtoxwd) < /users/lecom/images/2010.gif" + + 10 - A new keyword : MaxIconTitleWidth with an integer argument. If an icon + title is larger than this integer, it is truncated. + + 11 - A sound extension is supported. To use it you have to define USE_SOUND + in the Imakefile (not defined by default). In order to use this option + you need the rplay package. The documentation for this extension is in + sounds.doc. Warning : this extension is not mine, and I don't use it, so + don't expect a good support if you have problems with it. + + 12 - A new keyword : NoBorder with a window list argument. These windows + won't have borders. Thanks to J.P. Albers van der Linden + (albers@pasichva.serigate.philips.nl) for this patch. + + 13 - Ctwm has a new option selectable with the flag -w, if used, ctwm will + not take over the whole screen(s), instead it will create a new window + and manage it. The -w has an optional argument which is a window id + of an existing window, if specified, ctwm will try to manage this window. + This is totally useless, but I like it. The f.adoptwindow function can + be used to capture an existing window into such a captive ctwm. A possible + use of such mode can be to test new configuration file without restarting + ctwm. + + 14 - Now the welcome file can be of any type understood by ctwm. So + it must be prefixed with its type. The default is xpm:welcome.xpm + if the XPM option is compiled in, else it is xwd:welcome.xwd. You + use for example : + +setenv CTWM_WELCOME_FILE "|(giftoppm | pnmtoxwd) < ~/images/2010.gif" + + 15 - You can now have 3D window borders with the keyword : UseThreeDBorders. + In which case the 3D border witdh is given with : ThreeDBorderWidth. + The default value is 6. The color is BorderColor for the window that has + focus and BorderTileBackground for all others windows. Note : The 3D + borders do not merge very well with squeezed titles, as the top edge + of the window where the title is missing does not get a 3d border. + + 16 - Now, WindowRing can be specified without argument, in this case all the + windows are in the ring. (Alec Wolman ) + + 17 - New keyword : WarpRingOnScreen, if present, tells ctwm that f.warpring + should warp pointer only to windows visible in the current workspace. + + + Changes from version 3.1 to 3.2 + 1994-11-13 (or earlier) + ------------------------------- + + 1 - I have considerably reworked the focus handling. So I have probably + introduced some problems. + + 2 - New keyword : NoIconManagerFocus. Tells ctwm not to set focus on windows + when the pointer is in an IconManager. + + 3 - new option : -W. Tells ctwm not to display any welcome when starting. + To be used on slow machines. + + 4 - New keyword : StayUpMenus. Tells ctwm to use stayup menus. These menus + will stay on the screen when ButtonUp, if either the menu has not + yet been entered by the pointer, or the current item is a f.title. + + 5 - Now ctwm tries to use welcome.xwd instead of welcome.xpm if it exists. + On my machine the ctwm process size went from 2.3MB to 1MB when changing + this. Xpm is very greedy. + + 6 - New keyword : IconRegionJustification. Tells ctwm how to justify icons + inside their place in the IconRegion. This keyword needs a string + value. The acceptable values are : "left", "center", "right" and "border". + If "border" is given, the justification will be "left" if the icon + region gravity is "west" and "right" if the icon region gravity is "east". + (clever, isn't it) + + 7 - If you specify the -f filename option, ctwm will first try to load + filename.scrnum, where scrnum is the screen number. If it fails, it will + try to load filename as usual. + + 8 - TitleButtons can now have different bindings for buttons with the + following syntax : + +LeftTitleButton ":xpm:menu" { + Button1 : f.menu "WindowMenu" + Button2 : f.zoom + Button3 : f.hzoom +} + The old syntax is of course accepted. + Patch from Stefan Monnier (Stefan_Monnier@NIAGARA.NECTAR.CS.CMU.EDU). + + 9 - A lot of new animated title buttons : "%xpm:menu-up", "%xpm:menu-down", + "%xpm:resize-out-top", "%xpm:resize-in-top", "%xpm:resize-out-bot", + "%xpm:resize-in-bot", "%xpm:maze-out", "%xpm:maze-in", "%xpm:zoom-out", + "%xpm:zoom-in" and "%xpm:zoom-inout". From Stefan Monnier + (Stefan_Monnier@NIAGARA.NECTAR.CS.CMU.EDU). + + 10 - 2 new builtin menus : TwmAllWindows and TwmWorkspaces. Guess what they + do. + + 11 - You can now bind menus to keys. When a menu is visible, you can + navigate in it with the arrow keys. "Down" or space goes down, "Up" + goes up, "Left" pops down the menu, and "Right" activates the current + entry. The first letter of an entry name activates this entry (the first + one if several entries match). If the first letter is ~ then + Meta-the-second-letter activates it, if this first letter is ^ then + Control-the-second-letter activates it, and if this first letter is space, + then the second letter activates it. + + 12 - Support for VMS. Patch from Peter Chang (peterc@v2.ph.man.ac.uk). + Completely untested. If you have problems to build on VMS ask + Peter Chang. + + 13 - New keyword : MoveOffResistance. (idea borrowed to fvwm) : If you set + MoveOffResistance to a positive (n) value, dontmoveoff will only prevent + you from going off the edge if you're within n pixels off the edge. If you + go further, dontmoveoff gives up and lets you go as far as you wish. + f.forcemove still allows you to totally ignore dontmoveoff. A negative value + puts you back into "never moveoff" mode (it's the default). + + 14 - The files background[1-7].xpm and background9.xpm have been removed from + the distribution. Someone tells me that they are copyrighted. I tried to + contact him in order to join his copyright, but his mail address is invalid. + (desktop-textures@avernus.com). Most of these backgrounds and much more + can be obtained in the AIcons package on ftp.x.org. Particularly in + cl-bgnd/Textures : bg_blu.gif, concrete.gif, marble1.gif, sharks.gif + bg_grn.gif, granite_dark.gif, marble2.gif, snails.gif, coarse.gif, + granite_light.gif and pool.gif. + + 15 - New keyword : BorderResizeCursors with no parameter. If used ctwm + will put nice cursors when the cursor in on the window borders. + To be used when you have bound a button to f.resize in the frame context. + + 16 - The xpm files are now installed in $(TWMDIR)/images instead of $(TWMDIR). + + 17 - Due to the many problems I had with signals being slightly different + on different systems, I rewrote the animation handling without using + signals anymore. I hope it is more portable. The old code is still + available if you define USE_SIGNALS. + + + Changes from version 3.2 to 3.3 + 1995-02-11 (or earlier) + ------------------------------- + + 1 - Better 3D borders with SqueezeTitle. + + 2 - New keywords : BorderShadowDepth, TitleButtonShadowDepth, + TitleShadowDepth, MenuShadowDepth and IconManagerShadowDepth. You can + modify the depth of the 3D shadow of all the objects. + + 3 - f.altcontext. a new context named "alter" is introduced. The next key + or button event after a call to f.altcontext will be interpreted using + the alternate context. To define bindings in the alternate context, use + the keyword alter in the context field of the binding command. + + 4 - f.altkeymap. Up to 5 alternate modifiers (a1 to a5). The next key + or button event after a call to f.altkeymap will be interpreted with + this alternate modifies set. To define bindings with an alternate + modifier, use the keyword 'a' followed by the number of the modifier in + the modifier field of the binding command. Only the root, window, icon + and iconmgr context are allowed when an alternate modified is used. + + 5 - Default menu entry : If a menu entry name begins with a '*' (star), + this star won't be displayed and the corresponding entry will be the + default entry for this menu. When a menu has a default entry and is used + as a pull-right in another menu, this default entry action will be executed + automatically when this submenu is selected without beeing displayed. + It's hard to explain, but easy to understand. + + 6 - New keywords : ReallyMoveInWorkspaceManager and + AlwaysShowWindowWhenMovingFromWorkspaceManager. + ReallyMoveInWorkspaceManager tells ctwm to move the actual window when + the user is moving the small windows in the WorkSpaceMap window. + AlwaysShowWindowWhenMovingFromWorkspaceManager tells ctwm to always + map the actual window during the move, regardless of whether it crosses + the current workspace or not. The Shift key toggles this behaviour. + + 7 - 4 new functions :f.rightworkspace, f.leftworkspace, f.upworkspace + and f.downworkspace. Do what you expect. + + 8 - The function f.raiseicons (from Rickard Westman ). + Raises all icons. + + 9 - A new keyword : IconRegionAlignement. Like IconRegionJustification + but align vertically. The parameter is "top", "center", "bottom" or + "border". + + 10 - f.addtoworkspace, f.removefromworkspace and f.toggleoccupation. (idea + from Kai Grossjohann ). They + take one argument that is a workspace name. When applied to a window, + they add to, remove from, or toggle the occupation of this window in + this workspace. + + 11 - AlwaysOnTop (from Stefan Monnier ). Accept a list + of windows as argument. Ctwm will do it's best to keep these windows + on top of the screen. Not perfect. + + 12 - f.movepack, f.movepush, MovePackResistance. f.movepack is like f.move, + but it tries to avoid overlapping of windows on the screen. When the + moving window begin to overlap with another window, the move is stopped. + If you go too far over the other window (more that MovePackResistance + pixels), the move is resumed and the moving window can overlap with + the other window. Useful to pack windows closely. Instead of stopping + the move, f.movepush tries to push the other window to avoid overlap. + f.movepush is here mainly because I found it amusing to do it. Is is + not very useful. + + 13 - TitleJustification : Takes one string argument : "left", "center", or + "right". Tells ctwm how to justify the window titles. + + + 14 - UseThreeDWMap : Tells ctwm to use 3D decorations for the small windows + in the workspace map. + + + 15 - ReverseCurrentWorkspace : Tells ctwm to reverse the background and + foreground colors in the small windows in the workspace map for the + current workspace. + + 16 - DontWarpCursorInWMap : Tells ctwm not to warp the cursor to the + corresponding actual window when you click in a small window in the + workspace map. + + 17 - If there is neither MapWindowBackground, nor MapWindowForeground in the + config file,the window title colors are used for the small windows in the + workspace map. + + + + + Changes from version 3.3 to 3.4 + 1996-09-14 (or earlier) + ------------------------------- + + 1 - 2 new keywords : XMoveGrid and YMoveGrid with an integer parameter. + Constrains window moves so that its x and y coordinates are multiple + of the specified values. Useful to align windows easily. + + 2 - New function : f.deleteordestroy. First tries to delete the window + (send it WM_DELETE_WINDOW message), or kills it, if the client doesn't + accept such message. + + 3 - New function : f.squeeze. It squeezes a window to a null vertical + size. Works only for windows with either a title, or a 3D border + (in order to have something left on the screen). If the window is + already squeezed, it is unsqueezed. + + 4 - New built-in title button : :xpm:vbar (a vertical bar). + + 5 - CenterFeedbackWindow : The moving and resizing information window + is centered in the middle of the screen instead of the top left + corner. + + 6 - 2 New options : + + -version : Ctwm just prints its version number and exits. + -info : Ctwm prints its detailed version and compile time + options. + + 7 - WarpToDefaultMenuEntry (Useful only with StayUpMenus) : When using + StayUpMenus, and a menu does stays up, the pointer is warped to + the default entry of the menu. Try it. Can emulate double click. + For example : + +Button2 = : icon : f.menu "iconmenu" +menu "iconmenu" { + "Actions" f.title + "" f.separator + "*Restore" f.iconify + "Move" f.move + "Squeeze" f.squeeze + "Occupy ..." f.occupy + "Occupy All" f.occupyall + "" f.separator + "Delete" f.deleteordestroy +} + will result in DoubleButton2 on an icon uniconifies it. + + + 8 - When you popup a menu that is constrained by the border of the screen + the pointer is warped to the first entry. (Avoid exiting ctwm when you + just want to refresh the screen). + + 9 - When compiled with X11R6 defined, ctwm supports ICE session management. + (the code has been stolen directly from the X11R6 twm, it has not been + thoroughly tested, humm... actually, not tested at all). + + 10 - SchrinkIconTitles : A la Motif schrinking of icon titles, and expansion + when mouse is inside icon. + + 11 - AutoRaiseIcons : Icons are raised when the cursor enters it. Useful + with SchrinkIconTitles. + + +Patches from Matt Wormley + +------------------ + + 12 - XPM files for title bars or buttons may include the following symbolic + colors. These symbolic colors allow the possiblity of using the same + 3d XPM file with different colors for different titlebars. + + Background: The main color to be used by the title bar + HiShadow: The color to be used as the highlight + LoShadow: The color to be used as the dark shadow. + + Using these colors, I have built some 3d XPM files for various + titlebars while still keeping the ability to change titlebar colors. + + 13 - Added a keyword to the .ctwmrc file: "UseSunkTitlePixmap". This + makes it so the shadows are inversed for title pixmaps when focus is + lost. This is similar to having the SunkFocusWindowTitle, but it + makes your 3d XPM sink instead of just the whole bar. + + 14 - Added 3 new builtin 3d buttons for "Iconify", "Resize" and "Box". They + are available with the :xpm: identifier in the .ctwmrc file. + + 15 - Added another keyword to the .ctwmrc file: "WorkSpaceFont". This + allows you to specify the font to use in the workspace manager. + + 16 - 8 new xpm pixmaps for buttons, title highlite, etc... : + 3dcircle.xpm 3ddimple.xpm 3ddot.xpm 3dfeet.xpm 3dleopard.xpm 3dpie.xpm + 3dpyramid.xpm 3dslant.xpm + + +------------------ + + +Patches from Scott Bolte + +------------------ + + 17 - 2 new functions : f.forwmapiconmgr and f.backmapiconmgr, similar to + f.forwiconmgr and f.backiconmgr but only stops on mapped windows. + +------------------ + + + 18 - Last minute : PixmapDirectory now accept a colon separated list of + directories. + + 19 - If you use m4, ctwm now defines TWM_VERSION which is the version in + the form of floating point (e.g. 3.4). + + 20 - I forgot to tell that IconRegion has now 3 more optionnal parameters + iconjust, iconregjust and iconregalign. That can be used to give + special values to IconJustification, IconRegionJustification and + IconRegionAlignement for this IconRegion. The new syntax is : + +IconRegion geomstring vgrav hgrav gridwidth gridheight [iconjust] [iconregjust] \ + [iconregalign] [{ win-list }] + + + Changes from version 3.4 to 3.5 + 1997-11-27 (or earlier) + ------------------------------- + + + 1 - f.pack direction + Where direction is either : "right", "left", "top" or "bottom" + The current window is moved in the specified direction until it reaches + an obstacle (either another window, or the screen border). The pointer + follows the window. Example : + +"Right" = m : window : f.pack "right" +"Left" = m : window : f.pack "left" +"Up" = m : window : f.pack "top" +"Down" = m : window : f.pack "bottom" + + 2 - f.fill direction + Where direction is either : "right", "left", "top" or "bottom" + The current window is resized in the specified direction until it + reaches an obstacle (either another window, or the screen border). + +"Right" = s|m : window : f.fill "right" +"Left" = s|m : window : f.fill "left" +"Up" = s|m : window : f.fill "top" +"Down" = s|m : window : f.fill "bottom" + + 3 - f.savegeometry + The geometry of the current window is saved. The next call to + f.restoregeometry will restore this window to this geometry. + + 4 - f.restoregeometry + Restore the current window geometry to what was saved in the last + call to f.savegeometry. + + 5 - ShortAllWindowsMenus + Don't show WorkSpaceManager and IconManagers in the TwmWindows and + TwmAllWindows menus. + + 6 - f.toggleworkspacemgr + Toggle the presence of the WorkSpaceManager. If it is mapped, it will + be unmapped and vice verça. + + 7 - OpenWindowTimeout number + number is an integer representing a number of second. When a window + tries to open on an unattended display, it will be automatically + mapped after this number of seconds. + + 8 - DontSetInactive { win-list } + These windows won't be set to InactiveState when they become invisible + due to a change workspace. This has been added because some ill-behaved + clients (Frame5) don't like this. + + 9 - UnmapByMovingFarAway { win-list } + These windows will be moved out of the screen instead of beeing + unmapped when they become invisible due to a change workspace. This has + been added because some ill-behaved clients (Frame5) don't like to be + unmapped. Use this if point 8 doesn't work. + + 10 - AutoSqueeze { win-list } + These windows will be auto-squeezed. i.e. automatically unsqueezed when + they get focus, and squeezed when they loose it. Useful for the + workspace manager. (Note, it is not possible to AutoSqueeze icon managers). + + 11 - StartSqueezed { win-list } + These windows will first show up squeezed. + + 12 - RaiseWhenAutoUnSqueeze + Windows are raised when auto-unsqueezed. + + 13 - Now if the string "$currentworkspace" is present inside the string + argument of f.exec, it will be substituated with the current workspace + name. So it is possible to do something like : + + f.exec "someclient -xrm ctwm.workspace:$currentworkspace&" + + and the client will popus up in the workspace where the command was + started even if you go elsewhere before it actually shows up. + + 14 - Fixes the VMS version. From Richard Levitte - VMS Whacker + . + + 15 - Better I18N. From Toshiya Yasukawa . (Define + I18N in Imakefile to activate it). + + 16 - Better Session Management interface. Patches from Matthew McNeill + . + + 17 - new flag : -name, useful only for captive Ctwm. Sets the name of the + captive root window. Useful too for next point. If no name is specified + ctwm-n is used, where n is a number automatically generated. + + 18 - Two new client resources are now handled by Ctwm : + +ctwm.redirect: + + The new client window is open in the captive Ctwm with name : + . + +ctwm.rootWindow: + + The new client window is reparented into (whaa!!!). + It is up to you to find any usefullness to this. + + 19 - If the string "$redirect" is present inside the string + argument of f.exec, it will be substituated with a redirection + to the current captive Ctwm if any (or nothing if in a main Ctwm). + So it is possible to do something like : + + f.exec "someclient $redirect&" + + and the client will popus up in the right captive Ctwm. + + 20 - New function f.hypermove. With it, you can drag and drop a window + between 2 captives Ctwm (or between a captive and the root Ctwm). + + 21 - 2 new m4 variables defined in your startup file : + +TWM_CAPTIVE : value "Yes" if Ctwm is captive, "No" else. +TWM_CAPTIVE_NAME : The name of the captive Ctwm, if captive. + + 22 - RaiseOnClick : if present a window will be raised on top of others + when clicked on, and the ButtonPress event will be correctly forwarded + to the client that owns this window (if it asked to). + + RaiseOnClickButton : Button number to use for RaiseOnClick. + + 23 - IgnoreLockModifier : if present, all bindings (buttons and keys) will + ignore the LockMask. Useful if you often use caps lock, and don't + want to define twice all your bindings. + + 24 - AutoFocusToTransients + Transient windows get focus automatically when created. Useful with + programs that have keyboard shortcuts that pop up windows. + (patch from Kai Grossjohann ). + + 25 - PackNewWindows + Use f.movepack algorithm instead of f.move when opening a new window. + + + + Changes from version 3.5 to 3.5.1 + 1999-05-02 (or earlier) + --------------------------------- + + + 1 - f.initsize : resets a window to its initial size given by the + WM_NORMAL_HINTS hints. + + 2 - f.ring : Selects a window and adds it to the WarpRing, or removes it if + it was already in the ring. This command makes f.warpring much more + useful, by making its configuration dynamic (thanks to Philip Kizer + ). + + 3 - f.jumpleft, f.jumpright, f.jumpup, f.jumpdown : takes one integer + argument (the step). These function are designed to be bound to keys, + they move the current window (step * {X,Y}MoveGrid) pixels in the + corresponding direction. stopping when the window encounters another + window (ala f.pack). + + + Changes from version 3.5.1 to 3.5.2 + 1999-09-10 (or earlier) + ----------------------------------- + + + 1 - f.moveresize : Takes one string argument which is a geometry with the + standard X geometry syntax (e.g. 200x300+150-0). Sets the current + window to the specified geometry. The width and height are to be given + in pixel, no base size or resize increment are used. + + 2 - AutoLower et f.autolower : from Kai Großjohann + (Kai.Grossjohann@CS.Uni-Dortmund.DE). Same as autoraise but with lower. + + 3 - WindowRingExclude : Takes a window list as argument. All listed windows + will be excluded from the WarpRing. + + 4 - A new menu : 'TwmIcons' same as 'TwmWindows', but shows only iconified + windows. I did this when I got bored of having icons. Now I have no + icons and no icon managers. I use this menu to deiconify windows. + When I was young, I liked to have brightly colored icons, but now that + I am getting old(er), I prefer a bare desktop. + + + Changes from version 3.5.2 to 3.6 + 2002-08-08 (or earlier) + --------------------------------- + + 1 - Fix line numbers for errors when using m4 preprocessor. Send thanks + to Josh Wilmes . + + 2 - Fix the way menu entries are selected with the keyboard. Now + when you type a letter, the pointer moves to the next entry + whose first letter is this letter, but does not activate it. + The new keyword IgnoreCaseInMenuSelection, can be used to + ignore case for this delection. + + 3 - New keyword : DontSave, Takes a window list as argument. All listed + windows won't have their characteristics saved for the session manager. + Patch from Matthias Baake + + 4 - Also from Matthias Baake . I let him speak : + With the new keywords BorderLeft, BorderRight, BorderBottom and BorderTop + (each of them is optional with a default value of 0 and takes a + nonnegative integer as argument) you can declare a border "off limits" for + f.move etc.. These borders act the same way as the real borders of the + screen when moving windows; you can use f.forcemove to override them. + + 5 - Sloppy Focus added with keyword "SloppyFocus" in configuration file + (DINH V. Hoa ). + + 6 - the keyword "ClickToFocus" has been correctly implemented + (DINH V. Hoa ). + + 7 - the keyword "IgnoreModifier" has been added, + to use this feature, you have to add a line + "IgnoreModifier { lock m2 }" in the configuration file. + All bindings (buttons and keys) will ignore the modifiers + you specified. It is useful when you use caps locks or + num locks. You don't need IgnoreLockModifier any more with this option. + (DINH V. Hoa ). + + 8 - New keyword : WindowBox : creates a new window called a box, where + all the client windows that match the windows list are opened in, + instead of the roor window. This is useful to group small windows + in the same box (xload for instance) : + +WindowBox "xloadbox" "320x100+0-0" { + "xload" +} + + 9 - New function : f.fittocontent. Can be used only with window boxes. + The result is to have the box have the minimal size that contains + all its children windows. + + 10 - New keyword : WindowGeometries. Used to give a default geometry to some + clients : + +WindowGeometries { + "Mozilla*" "1000x800+10+10" + "jpilot*" "800x600-0-0" +} + + 11 - New keyword : IconMenuDontShow. Don't show the name of these windows + in the TwmIcons menu. + + And, as usual, a few bug fixes here and there. + + + Changes from version 3.6 to 3.7 + 2005-07-19 + ------------------------------- + + 1 - Workspace context (bkctwmws.patch) + + Makes it possible to bind keys specific to the workspace manager + (by Björn Knutsson). Use the event context 'workspace' for this. + + 2 - New keyword : AlwaysSqueezeToGravity + + If it is enabled, window squeezing always follows window gravity + (instead of northward when the window has a title). + (by Rudolph T. Maceyko). + + 3 - TwmKeys and TwmVisible menus (dlctwmmenu.patch) : + + Adds TwmKeys (rootmenu listing all keybindings) and TWM Visible (rootmenu + showing only deiconified windows) (by Dan Lilliehorn). + + + 4 - Preliminary GNOME compliance (see README.gnome and TODO.gnome) + (by Nathan Dushman). + + 5 - IconifyStyle : "normal" "mosaic" "zoomin" "zoomout" "sweep" + + A few 'fancy' graphical effects when you iconify windows, just for fun. + + 6 - Jpeg images support : You can now use jpeg image files wherever you + can use images. Use the jpeg:imagename syntaxe. + + 7 - f.showbackground. + + Since we can now use fancy jpeg image for root backgrounds, this function + unmaps all windows in the current workspace. This is a toggle function, + if all windows are unmapped, they are all remapped. Better bind this + function in the root context. + + 8 - Preliminary support for Xinerama extention. You can define 'virtual' + screens (it's better if they correspond to you actual screens). The + thing is that you can see several workspaces at the sams time, one per + virtual screen. Of course, you cannot view the same workspace (or the + same window) in 2 vscreens at the same time. The syntax is : + +VirtualScreens { + "1280x1024+0+0" + "1600x1200+1280+0" +} + + for 2 screens, the first one (on the left) is 1280x1024, the second one + (on the right) is 1600x1200. + + This is preliminary, because this has not been extensively tested. I did + this because I have now 2 screens, but I was unable to get them working + properly, so I use only one. + + + [ At this point, Claude has stopped working on CTWM, and the project + is now in the hands of Richard Levitte . ] + + 9 - Changed Imakefile to support a distribution target. + + 10 - Changed :xpm:cross to become a bit larger and have a slightly more + 3D appearance, and is visible even in very dark configurations. + + 11 - Make AlwaysSqueezeToGravity to work for all windows (if no window + list is given). + + 12 - New keyword: NoImagesInWorkSpaceManager + + If it's enabled, background images aren't displayed in the workspace + map. + + This was contributed by Thomas Linden. + + 13 - New command line option: -cfgchk + + If used, CTWM will only parse the configuration file and indicate + if it found errors or not. + + This was contributed by Matthew D. Fuller. + + 14 - DontMoveOff patch (by Björn Knutsson) + + Change the behavior of DontMoveOff/MoveOffResistance so that + when you attempt to move a window off screen, it will not move + at all until it's been moved #MoveOffResistance pixels (as + before), but at this time it will no longer "snap", but + instead it will start moving off screen. This means that you + still have the old behavior of DontMoveOff, but now with the + ability to move a window off screen less that + #MoveOffResistance pixels. + + 15 - Random placement and DontMoveOff patch (by Björn Knutsson, changed) + + When random placement was used, DontMoveOff wasn't honored. + This behavior has now changed so a window will be kept within + the screen when at all possible. When the window is too + large, it's top or left edge (or both) will be placed in + coordinate 0. + This change differs a little bit from Björns contribution by + not using rand() at all. + + 16 - f.warpring patch (by Björn Knutsson) + + If IconManagerFocus is set, there's no reason why the icon + manager should get enter and leave events. This fixes some + disturbing in the warpring that would otherwise happen. + + 17 - f.movetoprevworkspace, + f.movetonextworkspace, + f.movetoprevworkspaceandfollow, + f.movetonextworkspaceandfollow patch (by Daniel Holmström) + + Makes it possible to move a window to the previous or next + workspace and, if you like, go to that workspace and focus + the moved window. + + 18 - f.fill "vertical" patch (by Daniel Holmström) + + Expands the window vertically without overlapping any other window, + much like { f.fill "top" f.fill "bottom" } but with the exception + that it doesn't expand over window borders. It also sets the + windows 'zoomed' to F_FULLZOOM, so one can toggle between this + size, original and maximized. + + 19 - RESIZEKEEPSFOCUS bugfix patch (by Daniel Holmström) + + If a window is maximized with togglemaximize and then restored + it might loose focus if the cursor is outside the restored window. + This hack puts the cursor at the left-top corner of the window. + + 20 - f.zoom bugfix patch (by Daniel Holmström) + + f.zoom now doesn't move the window up (as it sometimes did before) + + 21 - IgnoreTransient patch (by Peter Berg Larsen) + + New keyword with list of windows for which to ignore transients. + + 22 - Workspace switch peformance optimization (by MC) + + Stops ctwm from redrawing windows that occupy all workspaces when + switching from one workspace to another. + + 23 - GTK "group leader" bugfix (by Olaf 'Rhialto' Seibert) + + Makes ctwm aware of the mysterious GTK group leader windows. + + 24 - Resize cursor with non-3D-borders bugfix (by Olaf 'Rhialto' Seibert) + + BorderResizeCursors now works also for top and left borders when + non-3D-borders are used. + + 25 - Memory leak bugfix (by Simon Burge) + + GetWMPropertyString in util.c no longer leaks memory. + + 26 - Warpring bugfix (by Takahashi Youichirou) + + Solves these two problems when warping the pointer to the + next/previous mapped window: + + o Sometimes the pointer moved right too much and ended up outside + the title bar. + + o When the active window was closed and the pointer ended up on the + root window, the pointer wouldn't warp until moved with the mouse. + + 27 - NoWarpToMenuTitle patch (by Julian Coleman) + + Fixes the sometimes annoying feature that the cursor is warped to the + menu title if the menu won't fit on the screen below the current + pointer position. + + This patch introduces a new keyword "NoWarpToMenuTitle" keyword to + turn this off. + + 28 - Scr->workSpaceMgr.windowFont font init bugfix (by Martin Stjernholm) + + The Scr->workSpaceMgr.windowFont in workmgr.c is now initialized. + + 29 - Full GNU regex patch (by Claude Lecommandeur) + + It is now possible to use full GNU regex for window or class names by + defining USE_GNU_REGEX in Imakefile. It is disabled in the default + Imakefile. + + 30 - DontToggleWorkSpaceManagerState patch (by Dan 'dl' Lilliehorn) + + New keyword to turn off the feature toggling the workspace manager + state to/from map/button state when you press ctrl and the workspace + manager window is in focus. + + 31 - TWMAllIcons patch (by Dan 'dl' Lilliehorn) + + Adds the TWMAllIcons menu, listing all iconified windows on all + workspaces. + + 32 - f.changesize patch (by Dan 'dl' Lilliehorn) + + Adds the function f.changesize which allows you to change the size + of the focused window via menus and keybindings. + + Example: + "Down" = c|s: all : f.changesize "bottom +10" + + 33 - f.changesize bugfix and improvement (by Dan 'dl' Lilliehorn) + + Fixes focusproblems with f.changesize and adds the ability to set + a new fixed size of a window. + + Example: + "F1" = c|s: all : f.changesize "640x480" + + 34 - When crashing, ctwm now refers to ctwm-bugs@free.lp.se instead of + Claude.Lecommandeur@epfl.ch. + + 35 - Changed all the code to use ANSI C prototypes instead of the old + K&R style. + [Richard Levitte] + + 36 - Only use the DefaultFunction if no function was found. + [Richard Levitte] + + 37 - Correct DontMoveOff + + The DontMoveOff checks when calculating random placement + wasn't satisfactory. It ended up placing all windows that + were small enough to fit in a random place at +50+50 with no + exception. The behavior has now been changed to only apply + to very large windows (almost as large as or larger than the + screen). At the same time, the RandomPlacement algorithm and + the DonMoveOff checks have been tweaked to keep the title + height in mind, so centering and coordinates correspond to the + realities of the rest of CTWM. + [Richard Levitte] + + 38 - Correct resizing from menu + + Choosing resize from the menu when not having 3D borders moved + the target window down and right by a border width. This was + an error in window position calculations. + [Richard Levitte] + + 39 - Enhanced info window + + Added the outer geometry. Added the 3D border width. + [Richard Levitte] + + 40 - Restart on subsequent SIGHUPs + + Reworked the code that catches a SIGHUP and has ctwm restart as + a result. The restarting code has moved from Restart() to the new + DoRestart(). Restart() now only sets a flag, and CtwmNextEvent() + has been changed to react to that flag and call DoRestart(). From + now on, CtwmNextEvent() is always used to get the next event, even + when no animations are going on. + [Richard Levitte] + + 41 - A number of VMS-related changes + + DEC/HP PC is a bit picky, the X11 environment is a little bit + different, and there were some sign/unsigned conflicts and one + too large symbol (the VMS linker truncates anything beyond the + 31 first characters of any symbol name), so some tweaks were + needed to get CTWM to build cleanly on VMS. + [Richard Levitte] + + 42 - Allow gcc users to build with paranoia + + To make it easier to find possible problems, the Imakefile macro + GCC_PEDANTIC can be defined in Imakefile.local. + [Richard Levitte] + + 43 - Allow spaces in sound files. + + The .ctwm-sounds file parser would clip sound files at the first + spaces. That won't do for sound libraries where file names may + have spaces in them. The parser now accepts spaces in file names, + and will trim spaces from the beginning and the end of both file + names and event tokens, allowing for a slightly more flexible + format. + [Richard Levitte] + + 44 - ctwm.spec + + Added a specification file for RPM building. + [Richard Levitte] + + 45 - More info for m4 + + The m4 subprocess now gets the variable PIXMAP_DIRECTORY, which + is defined to the directory where the pixmaps are installed, and + the new flags IMCONV, GNOME, SOUNDS, SESSION and I18N. + [Richard Levitte] + + 46 - Document sounds + + The sounds system is now documented in the man page. + [Richard Levitte] + + 47 - Build RPMs + + Added the target "rpm" to build an RPM directly from a distribution + tarball. + [Richard Levitte] + + 48 - Make life easier for package builders + + Added the possibility to configure where some libraries can be found + through the use of USER_* make variables in Imakefile.local. Added + a lot more commentary in Imakefile.local-template. + [Richard Levitte] + + 49 - Make it easier to configure on VMS + + Moved all the configuration definitions to descrip.local-template, + and instruct the users to copy that file to descrip.local and make + all needed changes there. + [Richard Levitte] + + 50 - Changed all relevant occurences of levitte@lp.se to + richard@levitte.org. + [Richard Levitte] + + + Changes from version 3.7 to 3.8 + 2007-02-16 + ------------------------------- + + 1 - Global cleanup + + There were some variables shadowing others, things not being + safely initialized, that sort of thing. + [Richard Levitte] + + 2 - Fixed several memory leaks found by + "Nadav Har'El" . + [Olaf "Rhialto" Seibert] + + 3 - Merged in the f.movetitlebar command. By default this is bound to + alt-left-click in the titlebar. + [Olaf "Rhialto" Seibert] + + 4 - Fixed the following issues: + Poking at the code, it looks like InitVirtualScreens() is called + before the configuration file is parsed which would explain what + I see since there's no attempt to create them after the config + file read. + + Moving the call after the config parsing causes things to work. + + I've run into a few other issues that I fixed with the attached + patch: + + - shadow menus on the right screen open the shadow on + the left screen + - shadow menus on the left screen open on top of the + window + - windows on the right screen disappear after startup + [Todd Kover] + + 5 - Adjustments to ctwm.man: + I noticed a couple of small errors. + + One is that the window list arguments for the opaque + keywords are now optional, are listed with square brackets + in the man page. The other is that the two Threshold + keywords are shown in the man page as requiring curly- + brackets, but they are not required or accepted in + configuration files. + [Ross Combs] + + 6 - improve algoritm to deal with mismatched geometry of virtual + screens + + - allow windows to be dragged from one virtual screen to another and + have them switch workspaces appropriately + + - handle restarts properly with virtual screens, including preserving + where windows were placed within workspaces regardless of which + virtual screen a window was on; preserve across restarts + [Todd Kover] + + 7 - WMapCreateCurrentBackGround() and WMapCreateDefaultBackGround() + would skip remaining virtual screens if not all parameters are present. + + - small type errors. [Olaf "Rhialto" Seibert]. + + 8 - There were some directives in the config file that wanted to set some + setting for all virtual screens. However since that list is (now) only + set up after parsing the config file, they failed to work. Moreover, + these settings were basically meant to be global to all virtual + screens, so a better place for them is somewhere in *Scr. They all + related to the Workspace Manager, so I moved them from struct + WorkSpaceWindow to struct WorkSpaceMgr. + + The affected directives are StartInMapState, WMgrVertButtonIndent, + WMgrHorizButtonIndent, MapWindowCurrentWorkSpace, + MapWindowDefaultWorkSpace. The window and icon_name, even though not + user-settable, were also moved. + + This is basically change #7 above done right. + [Olaf "Rhialto" Seibert] + + 9 - Re-introduced TwmWindow.oldvs, used to avoid calling + XReparentWindow() when possibe (it messed up the stacking order + of windows). However, maybe the use of .vs should be rethought a + bit: in Vanish() it is now set to NULL with the old value kept + in .oldvs. However the window is still a child of the same vs. + Maybe it is better not to set it to NULL and then, when *really* + changing the virtual screen, .vs can be used instead of .oldvs. + + This whole "virtual screen" thing is unexplained in the manual, + which even uses it as a synonym for "workspace" already in the + introduction paragraph. (There also does not seem to be a way + now to test virtual screens in captive windows) I suspect that + all this causes lots of confusion, and when cleared up, can + simplify the code a lot. + + I also fixed up the horrible indentation in the functions + where I changed something. + [Olaf "Rhialto" Seibert] + + 10 - Fixed interaction between "inner" and "outer" workspace + selection with "captive" windows. This was because the Gnome + "_WIN_WORKSPACE" property is used in 2 conflicting ways: for + client windows it indicates which workspace they are in, for + root windows it indicates which workspace they show. Captive + windows are both. Also, the initially selected inner workspace + is now the first, not the same as the outer workspace (this had + a different cause). + [Olaf "Rhialto" Seibert] + + 11 - Introduce Scr->XineramaRoot to store the root window that + encompasses all virtual screen rootwindows. This further reduces + any need to use RealRoot and/or CaptiveRoot. + Add a schematic drawing that clarifies the relation between the + various root-type windows. + [Olaf "Rhialto" Seibert] + + 12 - Get rid of all non-locale code and make I18N the silent default + (doesn't have to be mentioned any more). + THIS WILL BREAK CTWM ON OLDER (PRE-LOCALE) ENVIRONMENTS. + I strongly recommend an upgrade to "post-locale" standards. + [Richard Levitte] + + 13 - Enhance RandomPlacement with a displacement argument, so the + pseudo-radomness can be of displacements other than +30+30. + Here's an example for a pretty funky displacement: + + RandomPlacement "on" "-30-100" + + [Richard Levitte] + + 14 - Extend the Info window with the geometry seen from the lower + right corner as well. + [Richard Levitte] + + 15 - Extend the pointer button specification for title buttons + to take modifiers. + As part of this change, the following title pointer button + specification is deprecated: + + Button {j} : {function} + + in favor of the following, for consistency: + + Button {j} = {function} + + The old way still works, but is considered bad form and will + be removed in ctwm 4.0. + [Richard Levitte] + + 16 - Fix position of buttons in Occupy window, to make them centered. + (and spread the remaining space evenly in 4). + [Olaf "Rhialto" Seibert] + + 17 - "TwmWindow.group" was once apparently set to 0 when a window had + no group leader but this was changed to pointing to its own + window. This resulted however in many places checking for both + conditions, and several checking only for 0 which could not + occur anymore. Changed it back to 0 (so we can now distinguish + again windows that really indicate themselves as group leader, + if we wish) and this gave rise to some simplifications. + + Also, there were various loops through all TwmWindows looking + for a group leader (or a transientfor), I replaced them with + GetTwmWindow() which uses the Xlib function XFindContext() which + uses a hash table lookup. This should be more efficient. + + When you change the occupation of a group member window, it is + now applied to the group leader (which in turn affects all + members). + + I tried this with ExMH, the only program that uses a real group + leader that I could find. Iconifying the leader unmaps the + members. What should "squeezing" do? ExMH also has an icon + window (see ICCCM 4.1.9, 3rd option) which behaves weirdly; this + may be a bug in ExMH (see exmh-2.7.2/exmh.BUGS) even though fvwm + somehow handles it better. + [Olaf "Rhialto" Seibert] + + 18 - When Squeezing a window group leader, unmap the member windows, + just like happens with iconification. + [Olaf "Rhialto" Seibert] + + 19 - Simplifications c.q. de-duplications of code regarding the + WorkSpaceManager and Occupation windows. This includes coding + the layout of these windows only once instead of twice (at + initialisation and when resizing). If it's wrong now at least it + should be consistent. + When changing occupation via functions like + f.movetonextworkspace, also move complete window groups (just + like when you do it via the Occupation window). + Also fixed changing the occupation of the Occupation window. + Documented (so far) undocumented possibility to edit the labels + of workspaces on the fly (what use this is, I'm not sure). + Removed some unused variables. + [Olaf "Rhialto" Seibert] + + 20 - Get rid of the USE_SESSION and X11R6 macros and make them the + silent default. Also cleaned out a few references to the macro + X11R4, which hasn't been used for ages. + THIS WILL BREAK CTWM ON OLDER (PRE-X11R6) ENVIRONMENTS. + I strongly recommend an upgrade to a newer X11 release. + [Richard Levitte] + + 21 - Modified the random placement so a negative X displacement has + the first "random" window start near the right edge instead of + the right and a negative Y displacement has the first "random" + window start near the bottom edge instead of the top. + [Richard Levitte] + + + Changes from version 3.8 to 3.8.1 + 2012-01-05 + --------------------------------- + + 1 - Fix bug causing [de]iconified status of windows to not be + maintained across workspaces. + [Matthew Fuller] + + 2 - Quite a bunch of compiler warnings. + [Matthew Fuller] + + 3 - Make sure we fully initialize our WorkSpaceWindow structure so + we don't try to dereference uninitialized pointers later on. + [Matthew Fuller] + + 4 - Increased the number of supported mouse buttons again, having + just heard of a mouse with 9 possible buttons... + [Richard Levitte] + + 5 - Fix a bug in the warping "next" function, where if there is a + single window and the cursor is not on it, invoking 'f.warpring + "next"' does nothing. + [Martin Blais] + + 6 - Introduce a new feature called "SaveWorkspaceFocus", which when + enabled, makes ctwm remember which window has the focus within + each virtual workspace. As you switch workspaces, the cursor is + automatically warped to the window previous in focus in the + workspace. This significantly reduces the amount of mouse use. + [Martin Blais] + + 7 - From Matthias Kretschmer : + f.fill patch. + Without the patch, you might get windows which are increased by + two times the border width more than it should be. Additionally + if you place a window with no/not much size contrainst like + firefox in the upper left corner and perform f.fill "top" or + f.fill "left" the size of the window will increase by two times + the border width in width and height without changing the + top-left coordinate without the patch. Of course in such a + situation the size should not change at all... + [via Olaf Seibert] + + + Changes from version 3.8.1 to 3.8.2 + 2014-??-?? + ----------------------------------- + + 1 - Various code cleanups. + Cleanup re: raising and warping to windows (previous location of + pointer in windows), SaveWorkspaceFocus. A few extra NULL + pointer checks. + Logical hasfocusvisible cleanup. + Rename TwmWindow.list to iconmanagerlist, and various smaller + cleanups. + Eliminated TwmWindow TwmRoot from struct ScreenInfo. Mostly a + mechanical change. + I found some cases where the dummy TwmWindow was apparently + mistakenly included in a loop. Replaced .next with TwmWindow + *FirstWindow and .cmaps witn Colormaps RootColormaps. Other + members were not used. + + 2 - Fix a bug where insufficient validation of the size hints + resulted in a division by zero when considering aspect ratio. + + 3 - Lots of minor compiler warnings and build fixes, a few of which + were real current or latent bugs. Leave warnings enabled by + default. A few of the build system adjustments may break very + old systems (e.g., those with original AT&T yacc). + + 4 - Fix incorrect inclusion of $DESTDIR in some paths. + + 5 - Update for new website and mailing list at ctwm.org. + + 6 - Look at _MOTIF_WM_HINTS for titlebar-less or border-less + windows. Index: external/mit/ctwm/dist/Imakefile =================================================================== RCS file: external/mit/ctwm/dist/Imakefile diff -N external/mit/ctwm/dist/Imakefile --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/Imakefile 3 Sep 2015 12:19:42 -0000 @@ -0,0 +1,236 @@ +XCOMM $XConsortium: Imakefile,v 1.33 91/07/17 00:48:06 gildea Exp $ +XCOMM +XCOMM Here is an Imakefile for twm. It depends on having TWMDIR defined +XCOMM in Imake.tmpl. I like to use Imakefiles for everything, and I am sure +XCOMM other people do also, so perhaps you could do us all a favor and +XCOMM distribute this one. +XCOMM + +#include "Imakefile.local" + + + BYFLAGS = -d -b gram +#ifdef DEBUGPARSER + YFLAGS = $(BYFLAGS) -t -v +DEBUGPARSERDEFINES = -DYYDEBUG=1 +#else + YFLAGS = $(BYFLAGS) +#endif + DEPLIBS = $(DEPXMULIB) $(DEPEXTENSIONLIB) $(DEPXLIB) + LINTLIBS = $(LINTXMU) $(LINTEXTENSIONLIB) $(LINTXLIB) + +#ifdef XPM + XPMLIBDIR = $(USER_XPMLIBDIR) + XPMINCDIR = $(USER_XPMINCDIR) + + XPMDEFINES = -DXPM + XPMLIB = $(XPMLIBDIR) -lXpm +#else + XPMLIBDIR = + XPMINCDIR = + + XPMDEFINES = + XPMLIB = +#endif + +#ifdef JPEG + JPEGLIBDIR = $(USER_JPEGLIBDIR) + JPEGINCDIR = $(USER_JPEGINCDIR) + + JPEGDEFINES = -DJPEG + JPEGLIB = $(JPEGLIBDIR) -ljpeg +#else + JPEGLIBDIR = + JPEGINCDIR = + + JPEGDEFINES = + JPEGLIB = +#endif + +#ifdef USE_GNU_REGEX + GNUREGEXDEFS = -DUSE_GNU_REGEX +#else + GNUREGEXDEFS = +#endif + +#ifdef IMCONV + IMCONVLIBDIR = $(USER_IMCONVLIBDIR) + IMCONVINCDIR = $(USER_IMCONVINCDIR) + + IMCONVDEFINES = -DIMCONV + IMCONVLIB = $(IMCONVLIBDIR) -lim -lsdsc +#else + IMCONVLIBDIR = + IMCONVINCDIR = + + IMCONVDEFINES = + IMCONVLIB = +#endif + +#if defined USE_M4 || defined USEM4 + M4DEFINES = -DUSEM4 +#ifdef M4_CMD + M4CMD = M4_CMD +#else + M4CMD = m4 +#endif +#else + M4DEFINES = + M4CMD = +#endif + +#ifdef GNOME + GNOMEDEFINES = -DGNOME + GNOMESRC = gnome.c + GNOMEOBJ = gnome.o +#else + GNOMEDEFINES = + GNOMESRC = + GNOMEOBJ = +#endif + +#ifdef USE_SOUND + SOUNDLIBDIR = $(USER_SOUNDLIBDIR) + SOUNDINCDIR = $(USER_SOUNDINCDIR) + + SOUNDDEFINES = -DSOUNDS + SOUNDLIB = $(SOUNDLIBDIR) -lrplay + SOUNDSRC = sound.c + SOUNDOBJ = sound.o +#else + SOUNDLIBDIR = + SOUNDINCDIR = + + SOUNDDEFINES = + SOUNDLIB = + SOUNDSRC = + SOUNDOBJ = +#endif + +#ifdef DEBUG + CDEBUGFLAGS = -g -O0 +#endif + +#ifndef NO_WARNS + CCOPTIONS = -Wall \ + -Wshadow -Wstrict-prototypes -Wmissing-prototypes -Wundef \ + -Wredundant-decls -Wcast-align -Wcast-qual -Wchar-subscripts \ + -Winline -Wnested-externs -Wmissing-declarations +#endif + +PIXMAPDIR = $(TWMDIR)/images +CONFDIR = $(TWMDIR) + +LOCAL_LIBRARIES = $(IMCONVLIB) $(XPMLIB) $(JPEGLIB) $(XMULIB) $(XTOOLLIB) $(XLIB) $(SOUNDLIB) + DEFINES = $(SIGNAL_DEFINES) $(M4DEFINES) $(GNOMEDEFINES) $(IMCONVDEFINES) $(XPMDEFINES) $(JPEGDEFINES) $(SOUNDDEFINES) $(DEBUGPARSERDEFINES) $(GNUREGEXDEFS) + + EXTRA_INCLUDES = $(IMCONVINCDIR) $(XPMINCDIR) $(JPEGINCDIR) $(SOUNDINCDIR) + + SRCS = gram.tab.c lex.c deftwmrc.c add_window.c gc.c list.c ctwm.c \ + parse.c menus.c events.c resize.c util.c version.c iconmgr.c \ + cursor.c icons.c workmgr.c windowbox.c clicktofocus.c \ + vscreen.c session.c mwmhints.c $(GNOMESRC) $(SOUNDSRC) + + OBJS = gram.tab.o lex.o deftwmrc.o add_window.o gc.o list.o ctwm.o \ + parse.o menus.o events.o resize.o util.o version.o iconmgr.o \ + cursor.o icons.o workmgr.o windowbox.o clicktofocus.o \ + vscreen.o session.o mwmhints.o $(GNOMEOBJ) $(SOUNDOBJ) + + PIXMAPFILES = xpm/IslandD.xpm xpm/mail1.xpm xpm/xgopher.xpm \ + xpm/IslandW.xpm xpm/nothing.xpm xpm/xgrab.xpm \ + xpm/LRom.xpm xpm/pixmap.xpm xpm/xhpcalc.xpm \ + xpm/LRom1.xpm xpm/postit.xpm xpm/xmail.xpm \ + xpm/arthur.xpm xpm/term.xpm xpm/xman.xpm \ + xpm/cdrom1.xpm xpm/unknown.xpm xpm/xnomail.xpm \ + xpm/claude.xpm xpm/unread.xpm xpm/xrn.goodnews.xpm \ + xpm/datebook.xpm xpm/xarchie.xpm xpm/xrn.nonews.xpm \ + xpm/emacs.xpm xpm/xcalc.xpm xpm/xrn.xpm \ + xpm/hpterm.xpm xpm/xcalc2.xpm xpm/xterm.xpm \ + xpm/mail0.xpm xpm/xedit.xpm xpm/welcome.xpm \ + xpm/audio_editor.xpm xpm/clipboard.xpm xpm/ghostview.xpm \ + xpm/xirc.xpm xpm/xmosaic.xpm xpm/unknown1.xpm \ + xpm/xrn-compose.xpm xpm/gnu-emacs1.xpm xpm/gnu-emacs2.xpm \ + xpm/gnu-emacs3.xpm xpm/gnu-emacs4.xpm xpm/gnu-emacs5.xpm \ + xpm/gnu-emacs6.xpm xpm/gnu-emacs7.xpm xpm/skull.xpm \ + xpm/3D_Expand15.xpm xpm/3D_Iconify15.xpm xpm/3D_Lightning15.xpm \ + xpm/3D_Menu15.xpm xpm/3D_Resize15.xpm xpm/3D_Zoom15.xpm \ + xpm/background8.xpm xpm/spider.xpm \ + xpm/ball1.xpm xpm/ball12.xpm xpm/ball4.xpm xpm/ball7.xpm \ + xpm/ball10.xpm xpm/ball2.xpm xpm/ball5.xpm xpm/ball8.xpm \ + xpm/ball11.xpm xpm/ball3.xpm xpm/ball6.xpm xpm/ball9.xpm \ + xpm/supman1.xbm xpm/supman4.xbm xpm/supman7.xbm \ + xpm/supman2.xbm xpm/supman5.xbm xpm/supman8.xbm \ + xpm/supman3.xbm xpm/supman6.xbm xpm/supman9.xbm \ + xpm/nt1.xpm xpm/nt2.xpm xpm/xftp.xpm xpm/welcome.xwd \ + 3dcircle.xpm 3ddimple.xpm 3ddot.xpm 3dfeet.xpm 3dleopard.xpm \ + 3dpie.xpm 3dpyramid.xpm 3dslant.xpm + +SpecialObjectRule(parse.o,parse.c,'-DSYSTEM_INIT_FILE="$(CONFDIR)/system.ctwmrc"' '-DPIXMAP_DIRECTORY="$(PIXMAPDIR)"' '-DM4CMD="$(M4CMD)"') +SpecialObjectRule(ctwm.o,ctwm.c,'-DPIXMAP_DIRECTORY="$(PIXMAPDIR)"') +#if !HasPutenv +SpecialObjectRule(util.o,util.c,-DNOPUTENV) +#endif + +depend:: lex.c gram.tab.c deftwmrc.c + +NormalLibraryTarget(ctwm, libctwm.o) +ComplexProgramTarget(ctwm) +InstallNonExecFile(system.ctwmrc,$(CONFDIR)) +#ifdef XPM +install:: + MakeDir($(DESTDIR)$(PIXMAPDIR)) + @case '${MFLAGS}' in *[i]*) set +e;; esac; \ + for i in xpm/?* ; do \ + (set -x; $(INSTALL) -c $(INSTLIBFLAGS) $$i $(DESTDIR)$(PIXMAPDIR)); \ + done +#endif + +gram.tab.c: gram.tab.h + +gram.tab.h: gram.y + $(YACC) $(YFLAGS) gram.y + +clean:: + $(RM) y.tab.h y.tab.c lex.yy.c gram.tab.h gram.tab.c lex.c deftwmrc.c + $(RM) *.[chy].flc *.orig *.rej + +deftwmrc.c: system.ctwmrc + $(RM) $@ + echo '/* ' >>$@ + echo ' * This file is generated automatically from the default' >>$@ + echo ' * twm bindings file system.ctwmrc by the twm Imakefile.' >>$@ + echo ' */' >>$@ + echo '' >>$@ + echo 'char *defTwmrc[] = {' >>$@ + sed -e '/^#/d' -e 's/"/\\"/g' -e 's/^/ "/' -e 's/$$/",/' \ + system.ctwmrc >>$@ + echo ' (char *) 0 };' >>$@ + +GET_VERSION="`grep '^\#define VERSION_ID' version.c | sed -e 's/^[^"]*"\([^"]*\)".*$$/\1/'`" +dist: clean Makefile gram.tab.h gram.tab.c lex.c deftwmrc.c + ./mk_tar.sh + +rpm: hack_spec dist unhack_spec do_rpm +hack_spec: + if grep 'Debian' /etc/issue > /dev/null 2> /dev/null; then \ + mv ctwm.spec ctwm.spec.Redhat; \ + sed -e '/^BuildRequires:/d' < ctwm.spec.Redhat > ctwm.spec; \ + fi +unhack_spec: + if grep 'Debian' /etc/issue > /dev/null 2> /dev/null; then \ + mv ctwm.spec.Redhat ctwm.spec; \ + fi +do_rpm: + version=$(GET_VERSION); \ + rpmbuild -ta ../ctwm-$$version.tar.gz + +# Make all source files depend on this file, so there will be no more +# surprises. + +$(OBJS): Makefile + +#define IHaveSpecialMakefileTarget +Makefile: Imakefile Imakefile.local + echo "You need to run 'xmkmf'" + xmkmf && ${MAKE} ${MAKEFLAGS} +# exit 1 Index: external/mit/ctwm/dist/Imakefile.local-template =================================================================== RCS file: external/mit/ctwm/dist/Imakefile.local-template diff -N external/mit/ctwm/dist/Imakefile.local-template --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/Imakefile.local-template 3 Sep 2015 12:19:42 -0000 @@ -0,0 +1,119 @@ +XCOMM This is the local configuration file for Imakefile for ctwm. +XCOMM +XCOMM Some of the things you can define also come with make variables that +XCOMM can be manipulated. All such variables have names starting with\ +XCOMM USER_. + +XCOMM ---------------------------------------------------------------------- +XCOMM Feature: Use IMCONV features. +XCOMM Uhmm, I really don't know what this is about. -- Richard Levitte +XCOMM +XCOMM The make variables USER_IMCONVLIBDIR and USER_IMCONVINCDIR can be +XCOMM used to configure library search paths and include file search paths +XCOMM to find the imconv libraries and header files. +XCOMM +XCOMM Example: +XCOMM +XCOMM #define IMCONV +XCOMM USER_IMCONVLIBDIR = -L/logiciels/public/graphix/lib +XCOMM USER_IMCONVINCDIR = -I/logiciels/public/graphix/include +XCOMM +#undef IMCONV + +XCOMM ---------------------------------------------------------------------- +XCOMM Feature: Use sounds +XCOMM If you want sound support through librplay, defined USE_SOUND. +XCOMM +XCOMM The make variables USER_SOUNDLIBDIR and USER_SOUNDINCDIR can be +XCOMM used to configure library search paths and include file search paths +XCOMM to find the rplay libraries and header files. +XCOMM +XCOMM Example: +XCOMM +XCOMM #define USE_SOUND +XCOMM USER_SOUNDLIBDIR = -L/usr/local/lib +XCOMM USER_SOUNDINCDIR = -I/usr/local/include +XCOMM +#undef USE_SOUND + +XCOMM ---------------------------------------------------------------------- +XCOMM Feature: Use XPM images +XCOMM If you want XPM support, define XPM. +XCOMM +XCOMM The make variables USER_XPMLIBDIR and USER_XPMINCDIR can be +XCOMM used to configure library search paths and include file search paths +XCOMM to find the xpm libraries and header files. +XCOMM +XCOMM Example: +XCOMM +XCOMM #define XPM +XCOMM USER_XPMLIBDIR = -L/usr/local/lib +XCOMM USER_XPMINCDIR = -I/usr/local/include +XCOMM +#define XPM + +XCOMM ---------------------------------------------------------------------- +XCOMM Feature: Use Jpeg images +XCOMM If you want JPEG support, define JPEG. +XCOMM +XCOMM The make variables USER_JPEGLIBDIR and USER_JPEGINCDIR can be +XCOMM used to configure library search paths and include file search paths +XCOMM to find the jpeg libraries and header files. +XCOMM +XCOMM Example: +XCOMM +XCOMM #define JPEG +XCOMM USER_JPEGLIBDIR = -L/usr/local/lib +XCOMM USER_JPEGINCDIR = -I/usr/local/include +XCOMM +#define JPEG + +XCOMM ---------------------------------------------------------------------- +XCOMM Feature: Using M4 to process the ctwm configuration file +XCOMM If you want to process the ctwm configuration file with m4, define +XCOMM USE_M4. +XCOMM +#define USE_M4 + +XCOMM ---------------------------------------------------------------------- +XCOMM Feature: Using M4 to process the ctwm configuration file +XCOMM If you want to change the default m4 command (for example to gm4), +XCOMM set M4_CMD. +XCOMM +#define M4_CMD m4 + +XCOMM ---------------------------------------------------------------------- +XCOMM Feature: Support for Gnome extensions +XCOMM If you want to build with Gnome extensions, define GNOME. +XCOMM +#define GNOME + +XCOMM ---------------------------------------------------------------------- +XCOMM Feature: Use GNU regex +XCOMM If you want to build with GNU regex instead of the internal regex +XCOMM functions, define USE_GNU_REGEX. +XCOMM +#undef USE_GNU_REGEX + +XCOMM DEBUGGING: + +XCOMM ---------------------------------------------------------------------- +XCOMM Feature: General debugging +XCOMM If you want to get all kinds of debugging output from CTWM, define +XCOMM DEBUG. +XCOMM +#undef DEBUG + +XCOMM ---------------------------------------------------------------------- +XCOMM Feature: Debug the parser +XCOMM If you want debugging output for the configuration file parser, +XCOMM define DEBUGPARSER +XCOMM +#undef DEBUGPARSER + +XCOMM ---------------------------------------------------------------------- +XCOMM Feature: Compile with lots and lots of warnings +XCOMM This is enabled by default. Setting NO_WARNS turns it off. You +XCOMM probably shouldn't do that unless it offends you having so much +XCOMM output... +#undef NO_WARNS Index: external/mit/ctwm/dist/PROBLEMS =================================================================== RCS file: external/mit/ctwm/dist/PROBLEMS diff -N external/mit/ctwm/dist/PROBLEMS --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/PROBLEMS 3 Sep 2015 12:19:42 -0000 @@ -0,0 +1,39 @@ + This a list of some problems you can encounter while compiling or +using ctwm. + + + 1 - You have the message when compiling (static libraries) or + running (dynamic libraries) ctwm : + +ld.so: Undefined symbol: __XtInherit + +Why : You have a Sun and the mit X11R5 Xlib prior to the patch level 9, + there is an incompatibility between the Sun loader and the mit X11R5 + libs before patch 9. + +What to do : Upgrade you libs to at least patch level 9, or use : + -u __XtInherit at link time. + + + 2 - On SGI boxes, many GL applications don't behave very well with ctwm. + If an Xpert having a SGI Xserver can have a look at this, I will be + very pleased. + +What to do : Avoid carefully GL tools. + + + 3 - Xwd files created on DEC/Alpha may not be loaded correctly by ctwm. + Actually the xwd format is not completely portable. But you can load + on an Alpha a xwd file created on another system. + + 4 - On some systems (SVR4 I think), sometimes ctwm exits with no warning + (sometimes, it write 'Alarm Clock'). It is due to a problem with + signal handling on these systems. If it happens to you, set + AnimationSpeed to zero, or much better, you can try to find what + it the problem and send me a patch. + + 5 - There is a bug in the SOUND code, either in ctwm or in the rplay lib + that cause core dump. If you have unexpected core dump and compiled + with USE_SOUND on, first try to undef it and recompile before + complaining. + Index: external/mit/ctwm/dist/README =================================================================== RCS file: external/mit/ctwm/dist/README diff -N external/mit/ctwm/dist/README --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/README 3 Sep 2015 12:19:42 -0000 @@ -0,0 +1,112 @@ + CTWM + ---- + + +CTWM is an extension to twm, originally written by Claude Lecommandeur +that support multiple virtual screens, and a lot of other goodies. + +You can use and manage up to 32 virtual screens called workspaces. +You swap from one workspace to another by clicking on a button in an +optionnal panel of buttons (the workspace manager) or by invoking a +function. + +You can custom each workspace by choosing different colors, names and +pixmaps for the buttons and background root windows. + +Main features are : + + - Optional 3D window titles and border (ala Motif). + - Shaped, colored icons. + - Multiple icons for clients based on the icon name. + - Windows can belong to several workspaces. + - A map of your workspaces to move quickly windows between + different workspaces. + - Animations : icons, root backgrounds and buttons can be animated. + - Pinnable and sticky menus. + - etc... + +The sources files were once the twm ones with only workmgr.[ch] added +(written from scratch by Claude Lecommandeur). There were also some +modifications to some twm files. This was back in CTWM version 1, by +now, there are a bit more changes and a few more additions. It's +possible, thought it's doubtful, that twm patches can still be +applied... with great care. + +If you find bugs in ctwm, or just want to tell us how much you like it, +please send a report to the mailing list. + + + ---------- + +Configuration: + +Ctwm is built using xmkmf, which read Imakefile. That file includes +Imakefile.local, which is meant for local configuration, and *WHICH YOU +MUST CREATE*. For your comfort, the file Imakefile.local-template can +simply be copied to Imakefile.local, then changed. + +Configuration is done by defining any of the following C macros: + +USEM4 If defined, enables the use of the m4 preprocessor on + the run-time configuration file. Disable if m4 isn't + present. + Defined in Imakefile.local-template. +XPM If defined, enables the use of xpm images. Disable if + libxpm isn't present. + Defined in Imakefile.local-template. +JPEG If defined, enables the use of jpeg images. Disable + if libjpeg isn't present. + Defined in Imakefile.local-template. +GNOME If defined, build to work with Gnome. + Defined in Imakefile.local-template. +USE_SOUND if defined, build with sound support. Disable if + librplay isn't present. + Defined in Imakefile.local-template. +USE_GNU_REGEX if defined, build with GNU regex. Otherwise, use an + internal implementation. + Undefined in Imakefile.local-template. + +If you don't have xpm, fetch it from ftp.x.org or comment out the +#define XPM in Imakefile.local. If you don't have the m4 preprocessor +(or don't want to use it) comment out #define USEM4, if you have the +rplay package replace `#undef USE_SOUND' with `#define USE_SOUND'. + + ---------- + +Building: + +funny prompt> cp Imakefile.local-template Imakefile.local + [ edit if necessary; you probably don't have to ] +funny prompt> xmkmf +funny prompt> make + + ---------- + +Installation: + +funny prompt> make install install.man + + ---------- + +There is a manual page, which always needs more work (any volunteer ?). +Many useful informations are only in the CHANGES file, so please read it. + + ---------- + +Mailing lists: + +There is a mailing list for discussions: ctwm@ctwm.org. Subscribe at +minimalist@ctwm.org. + +Repository: + +CTWM development uses bazaar (see http://bazaar.canonical.com/) for +version control. The code is available on launchpad as lp:ctwm'. See +https://launchpad.net/ctwm for more details. + +Further information: + +http://www.ctwm.org/ + + +# vim:expandtab: Index: external/mit/ctwm/dist/README.VMS =================================================================== RCS file: external/mit/ctwm/dist/README.VMS diff -N external/mit/ctwm/dist/README.VMS --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/README.VMS 3 Sep 2015 12:19:42 -0000 @@ -0,0 +1,132 @@ +To compile and install ctwm on VMS machines: + +Unpacking and configuration: +---------------------------- + +0) You must have the X miscellaneous utilities and X extension libraries. + Possibly, also have some unix type tools such as tar and gzip + (get these from ftp.spc.edu in macros32/savesets). + +1) Get the latest xpm library (at time of writing, 3.4) and compile that + first. This is used for coloured icons. (There should be many sites that + have a copy of xpm, try using Google to find a site near you. I found + ftp://ftp2.cnam.fr/decwindows/lib/) + +2) If you don't already have a working descrip.local, copy + descrip.local-template to desrip.local: + + $ IF F$SEARCH("DESCRIP.LOCAL") .EQS. "" THEN - + COPY DESCRIP.LOCAL-TEMPLATE DESCRIP.LOCAL + +3) Edit descrip.local and change what needs to be changed. There are fairly + clear comments describing how it should be done. + + About EXIT_ENDSESSION, see warning W1 below. + +Compilation and linking: +------------------------ + +4) This item is not true any more, because support for make.com and link.com + has been removed. MMK is free and works perfectly well. + + Was: 'IF YOU DOWNLOADED A PACKAGE WITH OBJECT FILES, you only need to link + ctwm, doing "@link.com". Then go to step 7).' + +5) You do not need to rename the files with _VMS extensions any more. + +6) build ctwm by doing "mmk/ign=w" (if you have DECSET, you can use MMS + instead of MMK). If you downloaded a package with object files, it + should result in ctwm being linked only. + +[ N.B.: WHEN LINKING object files that have been compiled with VAX C + (*.VAX_VAXC_OBJ), the linker may complain about two undefined symbols. + They are however not refered to anywhere, so this is completelly harmless. + The two symbols are COLORCONVERTARGS and SCREENCONVERTARG. + /Richard Levitte ] + +[ N.B.2: The resulting executable will have the name CTWM.VAX_EXE or + CTWM.AXP_EXE! This because you may want to compile or link for both + architectures in the same directory. /Richard Levitte ] + +Installation: +------------- + +7) When ctwm has been successfully built, work out where to put the xpm + icons, say disk$users:[joe.xpm]. Edit the file ctwm.com and change it to + suit you. + +8) Create your user config file ctwm.rc and put it in DECW$USER_DEFAULTS. + Now is the time to read the man page on ctwm. Be sure to read vms.txt for + differences between the Unix ctwm and the VMS version. + (See peterc.ctwmrc or levitte_system.ctwmrc, for an example config file.) + +9) [Optional] Create your own system default config file system.ctwmrc + and put it in DECW$SYSTEM_DEFAULTS. + +10) Go to the session manager and under the Options menu pick out the + "Menus..." item. Make a menu item called "CT Window Manager" and enter the + DCL command "@disk$users:[joe.com]ctwm.com", as an example. + +11) Go to the session manager, again, and under the Options menu pick out + the "Automatic Startup..." item. Take out your current window manager + and replace it with ctwm using the "CT Window Manager" item you just + created. + +12) Now all is done. Exit from the session and log back in to try out ctwm. + + +WARNINGS: +--------- + +W1) [THIS APPLIES ON VAX ONLY!] + + It seems like some older DECwindows/Motif versions end their session + like this: + + %decw$endsession -vueimage sys$system:.exe + + this is an internal Session Manager command. If this is how it's + done on your machine, you'd better not use the session ending features + of ctwm at all, or you won't get back a login prompt when you end + your session. In such a case, EXIT_ENDSESSION must be set to 0, or + you may get into trouble. + +W2) Bitmap (xbm) files are sometimes stored in files with no extensions + on older Unix X11 releases, which makes definitions like this work + on those ("plaid" is the culprit here): + + WorkSpaces { + "One" {"#619AAE" "white" "firebrick" "white" "plaid"} + } + + Since those files have never been stored without extension on VMS, + you have to rewrite such definitions like this: + + WorkSpaces { + "One" {"#619AAE" "white" "firebrick" "white" "plaid.xbm"} + } + + I has been discussed if you couldn't add a "dna=.xbm" parameter to + the open() or fopen() that opens the bitmap file. This would of + course have been possible, if the loading of bitmap files wasn't + done through the function XmuLocateBitmapFile(). Of course, you + could as well hack ExpandFilename(), but that is less clean. The + Xmu library needs to be enhanced for this task. + + +Ctwm 3.3 ported by Peter Chang - peterc@v2.ph.man.ac.uk 4/5/94. +Ctwm 3.4pl2 and 3.5 further ported by Richard Levitte + + +Thank you: +---------- + +A thank you goes to the following people: + + Claude Lecommandeur , for making ctwm + to begin with. + Peter Chang , for the previous ports. + + Michael Lemke + +/Richard Levitte, Index: external/mit/ctwm/dist/README.gnome =================================================================== RCS file: external/mit/ctwm/dist/README.gnome diff -N external/mit/ctwm/dist/README.gnome --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/README.gnome 3 Sep 2015 12:19:42 -0000 @@ -0,0 +1,26 @@ +Notes about the GNOME-compliance patches to CTWM. + +Things that work: +multiple workspaces, and switching between them. +window shading, iconification, settings windows to sticky. +root window clicks (might be some bugs). + +Things that don't work: +layers +GNOME window-size hints, and some other hints + +These patches should be sufficient to make the gnome-pager applet work with +CTWM. However, you'll want to make a few changes to your .ctwmrc in order to +make it work well. These changes have been made to the default .ctwmrc +(system.ctwmrc) included in the distribution. The changes are: +1. Make the panel occupy all workspaces +2. Remove the borders and title bar from the panel window +3. Don't show the workspace manager and the icon manager +4. Remove the border and title from gmc windows; you might want them to occupy +all workspaces. +5. In order to have root window clicks work, don't bind anything (a menu or +other action) to mouse actions on the root window. + +These patches were written by Nathan Dushman (nhd+ctwmg@andrew.cmu.edu). +Please let me know of any problems, solutions, requests, and please send me +an email if you like and use these patches - it will make me happy. Index: external/mit/ctwm/dist/TODO =================================================================== RCS file: external/mit/ctwm/dist/TODO diff -N external/mit/ctwm/dist/TODO --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/TODO 3 Sep 2015 12:19:42 -0000 @@ -0,0 +1,14 @@ +TODO: + +Before releasing 3.7: + + - Ponder over the rest of the available patches and apply them if + reasonable. + + - Make sure it compiles and runs on VMS. + +Longer term: + + - Check the new protocols that Gnome 2 and KDE use, and implement + them. + Index: external/mit/ctwm/dist/TODO.gnome =================================================================== RCS file: external/mit/ctwm/dist/TODO.gnome diff -N external/mit/ctwm/dist/TODO.gnome --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/TODO.gnome 3 Sep 2015 12:19:42 -0000 @@ -0,0 +1,15 @@ +Should we set SKIP_WINLIST, SKIP_TASKBAR, etc. on IconManagerDontShow windows? Maybe HIDDEN? +Is there a problem with the current approach (don't tell GNOME about those windows at all)? +Layer and size hints +- layers... how does stacking order work? +autoconf (replace Imakefile) +configuration capplet or standalone application +add an option to the gnomepager-applet to move windows to other workspaces +- ideally, one would drag windows, like the workspacemanager. + however, even a pop-up menu listing workspaces and allowing movement would + be an improvement. +Why doesn't the workspace window work for some GTK apps? +- transient problem. Why are all GTK windows transient? Is this a WM bug, + or a GTK problem? Investigate. +Cleanup on exit - remove properties from root window. +Write a small utility app using libctwm so that any CTWM will work with GNOME. Index: external/mit/ctwm/dist/add_window.c =================================================================== RCS file: external/mit/ctwm/dist/add_window.c diff -N external/mit/ctwm/dist/add_window.c --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/add_window.c 3 Sep 2015 12:19:42 -0000 @@ -0,0 +1,2612 @@ +/*****************************************************************************/ +/** Copyright 1988 by Evans & Sutherland Computer Corporation, **/ +/** Salt Lake City, Utah **/ +/** Portions Copyright 1989 by the Massachusetts Institute of Technology **/ +/** Cambridge, Massachusetts **/ +/** **/ +/** All Rights Reserved **/ +/** **/ +/** Permission to use, copy, modify, and distribute this software and **/ +/** its documentation for any purpose and without fee is hereby **/ +/** granted, provided that the above copyright notice appear in all **/ +/** copies and that both that copyright notice and this permis- **/ +/** sion notice appear in supporting documentation, and that the **/ +/** names of Evans & Sutherland and M.I.T. not be used in advertising **/ +/** in publicity pertaining to distribution of the software without **/ +/** specific, written prior permission. **/ +/** **/ +/** EVANS & SUTHERLAND AND M.I.T. DISCLAIM ALL WARRANTIES WITH REGARD **/ +/** TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANT- **/ +/** ABILITY AND FITNESS, IN NO EVENT SHALL EVANS & SUTHERLAND OR **/ +/** M.I.T. BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAM- **/ +/** AGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA **/ +/** OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER **/ +/** TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE **/ +/** OR PERFORMANCE OF THIS SOFTWARE. **/ +/*****************************************************************************/ + +/* + * [ ctwm ] + * + * Copyright 1992 Claude Lecommandeur. + * + * Permission to use, copy, modify and distribute this software [ctwm] and + * its documentation for any purpose is hereby granted without fee, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting documen- + * tation, and that the name of Claude Lecommandeur not be used in adverti- + * sing or publicity pertaining to distribution of the software without + * specific, written prior permission. Claude Lecommandeur make no represen- + * tations about the suitability of this software for any purpose. It is + * provided "as is" without express or implied warranty. + * + * Claude Lecommandeur DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO + * EVENT SHALL Claude Lecommandeur BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF + * USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR + * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + * + * Author: Claude Lecommandeur [ lecom@sic.epfl.ch ][ April 1992 ] + */ + +/********************************************************************** + * + * $XConsortium: add_window.c,v 1.153 91/07/10 13:17:26 dave Exp $ + * + * Add a new window, put the titlbar and other stuff around + * the window + * + * 31-Mar-88 Tom LaStrange Initial Version. + * + * Do the necessary modification to be integrated in ctwm. + * Can no longer be used for the standard twm. + * + * 22-April-92 Claude Lecommandeur. + * + **********************************************************************/ + +#include +#include +#ifndef VMS +#include +#else +#include +#endif +#if defined(AIXV3) || defined(_SYSTYPE_SVR4) || defined(ibm) || defined __QNX__ +#include +#endif +#include "twm.h" +#ifdef VMS +#include +#else +#include +#endif +#include "add_window.h" +#include "windowbox.h" +#include "util.h" +#include "resize.h" +#include "parse.h" +#include "list.h" +#include "events.h" +#include "menus.h" +#include "screen.h" +#include "icons.h" +#include "iconmgr.h" +#include "session.h" +#include "mwmhints.h" + +#define gray_width 2 +#define gray_height 2 +static unsigned char gray_bits[] = { + 0x02, 0x01}; +static unsigned char black_bits[] = { + 0xFF, 0xFF}; + +int AddingX; +int AddingY; +unsigned int AddingW; +unsigned int AddingH; + +static int PlaceX = -1; +static int PlaceY = -1; +static void CreateWindowTitlebarButtons(TwmWindow *tmp_win); +void DealWithNonSensicalGeometries(Display *dpy, Window vroot, TwmWindow *tmp_win); + +static void splitWindowRegionEntry (WindowEntry *we, + int grav1, int grav2, + int w, int h); +static WindowEntry *findWindowEntry (WorkSpace *wl, + TwmWindow *tmp_win, + WindowRegion **wrp); +static WindowEntry *prevWindowEntry (WindowEntry *we, + WindowRegion *wr); +static void mergeWindowEntries (WindowEntry *old, WindowEntry *we); + +char NoName[] = "Untitled"; /* name if no name is specified */ +int resizeWhenAdd; + +extern Atom _OL_WIN_ATTR; + +#if defined(__hpux) && !defined(_XPG4_EXTENDED) +# define FDSET int* +#else +# define FDSET fd_set* +#endif +/************************************************************************ + * + * Procedure: + * GetGravityOffsets - map gravity to (x,y) offset signs for adding + * to x and y when window is mapped to get proper placement. + * + ************************************************************************ + */ + +void GetGravityOffsets (TwmWindow *tmp, /* window from which to get gravity */ + int *xp, int *yp) /* return values */ +{ + static struct _gravity_offset { + int x, y; + } gravity_offsets[11] = { + { 0, 0 }, /* ForgetGravity */ + { -1, -1 }, /* NorthWestGravity */ + { 0, -1 }, /* NorthGravity */ + { 1, -1 }, /* NorthEastGravity */ + { -1, 0 }, /* WestGravity */ + { 0, 0 }, /* CenterGravity */ + { 1, 0 }, /* EastGravity */ + { -1, 1 }, /* SouthWestGravity */ + { 0, 1 }, /* SouthGravity */ + { 1, 1 }, /* SouthEastGravity */ + { 0, 0 }, /* StaticGravity */ + }; + register int g = ((tmp->hints.flags & PWinGravity) + ? tmp->hints.win_gravity : NorthWestGravity); + + if (g < ForgetGravity || g > StaticGravity) { + *xp = *yp = 0; + } else { + *xp = gravity_offsets[g].x; + *yp = gravity_offsets[g].y; + } +} + + + + +/*********************************************************************** + * + * Procedure: + * AddWindow - add a new window to the twm list + * + * Returned Value: + * (TwmWindow *) - pointer to the TwmWindow structure + * + * Inputs: + * w - the window id of the window to add + * iconm - flag to tell if this is an icon manager window + * 0 --> normal window. + * 1 --> icon manager. + * 2 --> window box; + * else --> iconmgr; + * + * iconp - pointer to icon manager struct + * + *********************************************************************** + */ + +TwmWindow *AddWindow(Window w, int iconm, IconMgr *iconp) +{ + virtualScreen *vs; + TwmWindow *tmp_win; /* new twm window structure */ + int stat; + XEvent event; + unsigned long valuemask; /* mask for create windows */ + XSetWindowAttributes attributes; /* attributes for create windows */ + int width, height; /* tmp variable */ + int ask_user; /* don't know where to put the window */ + int gravx, gravy; /* gravity signs for positioning */ + int namelen; + int bw2; + short saved_x, saved_y, restore_icon_x, restore_icon_y; + unsigned short saved_width, saved_height; + Bool restore_iconified = 0; + Bool restore_icon_info_present = 0; + int restoredFromPrevSession; + Bool width_ever_changed_by_user; + Bool height_ever_changed_by_user; + int saved_occupation; /* <== [ Matthew McNeill Feb 1997 ] == */ + Bool random_placed = False; + int found = 0; +#ifndef VMS + fd_set mask; + int fd; + struct timeval timeout; +#endif + XRectangle ink_rect; + XRectangle logical_rect; + WindowBox *winbox; + int iswinbox = 0; + int iswman = 0; + Window vroot; + +#ifdef DEBUG + fprintf(stderr, "AddWindow: w = 0x%x\n", w); +#endif + + if (!captive && RedirectToCaptive (w)) return (NULL); + + /* allocate space for the twm window */ + tmp_win = (TwmWindow *)calloc(1, sizeof(TwmWindow)); + if (tmp_win == 0) + { + fprintf (stderr, "%s: Unable to allocate memory to manage window ID %lx.\n", + ProgramName, w); + return NULL; + } + switch (iconm) { + case 0 : iswinbox = 0; break; + case 1 : iswinbox = 0; break; + case 2 : iswinbox = 1; iconm = 0; break; + case 3 : iswman = 1; iconm = 0; break; + default : iswinbox = 0; iswman = 0; iconm = 1; break; + } + tmp_win->w = w; + tmp_win->zoomed = ZOOM_NONE; + tmp_win->iconmgr = iconm; + tmp_win->iconmgrp = iconp; + tmp_win->wspmgr = iswman; + tmp_win->iswinbox = iswinbox; + tmp_win->vs = NULL; + tmp_win->old_parent_vs = NULL; + tmp_win->savevs = NULL; + tmp_win->cmaps.number_cwins = 0; + tmp_win->savegeometry.width = -1; + + XSelectInput(dpy, tmp_win->w, PropertyChangeMask); + XGetWindowAttributes(dpy, tmp_win->w, &tmp_win->attr); + tmp_win->name = (char*) GetWMPropertyString(tmp_win->w, XA_WM_NAME); + tmp_win->class = NoClass; + XGetClassHint(dpy, tmp_win->w, &tmp_win->class); + FetchWmProtocols (tmp_win); + FetchWmColormapWindows (tmp_win); + + if (GetWindowConfig (tmp_win, + &saved_x, &saved_y, &saved_width, &saved_height, + &restore_iconified, &restore_icon_info_present, + &restore_icon_x, &restore_icon_y, + &width_ever_changed_by_user, &height_ever_changed_by_user, + &saved_occupation)) /* <== [ Matthew McNeill Feb 1997 ] == */ + { + tmp_win->attr.x = saved_x; + tmp_win->attr.y = saved_y; + + tmp_win->widthEverChangedByUser = width_ever_changed_by_user; + tmp_win->heightEverChangedByUser = height_ever_changed_by_user; + + if (width_ever_changed_by_user) + tmp_win->attr.width = saved_width; + + if (height_ever_changed_by_user) + tmp_win->attr.height = saved_height; + + restoredFromPrevSession = 1; + } + else + { + tmp_win->widthEverChangedByUser = False; + tmp_win->heightEverChangedByUser = False; + + restoredFromPrevSession = 0; + } + + /* + * do initial clip; should look at window gravity + */ + if (tmp_win->attr.width > Scr->MaxWindowWidth) + tmp_win->attr.width = Scr->MaxWindowWidth; + if (tmp_win->attr.height > Scr->MaxWindowHeight) + tmp_win->attr.height = Scr->MaxWindowHeight; + + tmp_win->wmhints = XGetWMHints(dpy, tmp_win->w); + + if (tmp_win->wmhints) + { + if (restore_iconified) + { + tmp_win->wmhints->initial_state = IconicState; + tmp_win->wmhints->flags |= StateHint; + } + + if (restore_icon_info_present) + { + tmp_win->wmhints->icon_x = restore_icon_x; + tmp_win->wmhints->icon_y = restore_icon_y; + tmp_win->wmhints->flags |= IconPositionHint; + } + } + + if (tmp_win->wmhints) tmp_win->wmhints->input = True; + /* CL: Having with not willing focus + cause problems with AutoSqueeze and a few others + things. So I suppress it. And the whole focus thing + is buggy anyway */ + if (tmp_win->wmhints && !(tmp_win->wmhints->flags & InputHint)) + tmp_win->wmhints->input = True; + if (tmp_win->wmhints && (tmp_win->wmhints->flags & WindowGroupHint)) { + tmp_win->group = tmp_win->wmhints->window_group; + if (tmp_win->group) { + /* + * GTK windows often have a spurious "group leader" window which is + * never reported to us and therefore does not really exist. This + * is annoying because we treat group members a lot like transient + * windows. Look for that here. It is in fact a duplicate of the + * WM_CLIENT_LEADER property. + */ + if (tmp_win->group != w && !GetTwmWindow(tmp_win->group)) { + tmp_win->group = 0; + } + } + } else + tmp_win->group = 0; + + /* + * The July 27, 1988 draft of the ICCCM ignores the size and position + * fields in the WM_NORMAL_HINTS property. + */ + + tmp_win->transient = Transient(tmp_win->w, &tmp_win->transientfor); + + tmp_win->nameChanged = 0; + if (tmp_win->name == NULL) + tmp_win->name = NoName; + if (tmp_win->class.res_name == NULL) + tmp_win->class.res_name = NoName; + if (tmp_win->class.res_class == NULL) + tmp_win->class.res_class = NoName; + + /* + * full_name seems to exist only because in the conditional code below, + * name is sometimes changed. In all other cases, name and full_name + * seem to be identical. Is that worth it? + */ + tmp_win->full_name = tmp_win->name; +#ifdef CLAUDE + if (strstr (tmp_win->name, " - Mozilla")) { + char *moz = strstr (tmp_win->name, " - Mozilla"); + *moz = '\0'; + } +#endif + namelen = strlen (tmp_win->name); + + if (LookInList(Scr->IgnoreTransientL, tmp_win->full_name, &tmp_win->class)) + tmp_win->transient = 0; + + tmp_win->highlight = Scr->Highlight && + (!LookInList(Scr->NoHighlight, tmp_win->full_name, + &tmp_win->class)); + + tmp_win->stackmode = Scr->StackMode && + (!LookInList(Scr->NoStackModeL, tmp_win->full_name, + &tmp_win->class)); + + tmp_win->ontoppriority = (LookInList(Scr->AlwaysOnTopL, + tmp_win->full_name, &tmp_win->class)) ? ONTOP_MAX : ONTOP_DEFAULT; + + tmp_win->titlehighlight = Scr->TitleHighlight && + (!LookInList(Scr->NoTitleHighlight, tmp_win->full_name, + &tmp_win->class)); + + tmp_win->auto_raise = Scr->AutoRaiseDefault || + LookInList(Scr->AutoRaise, tmp_win->full_name, + &tmp_win->class); + if (tmp_win->auto_raise) Scr->NumAutoRaises++; + + tmp_win->auto_lower = Scr->AutoLowerDefault || + LookInList(Scr->AutoLower, tmp_win->full_name, + &tmp_win->class); + if (tmp_win->auto_lower) Scr->NumAutoLowers++; + + tmp_win->iconify_by_unmapping = Scr->IconifyByUnmapping; + if (Scr->IconifyByUnmapping) + { + tmp_win->iconify_by_unmapping = iconm ? FALSE : + !LookInList(Scr->DontIconify, tmp_win->full_name, + &tmp_win->class); + } + tmp_win->iconify_by_unmapping = tmp_win->iconify_by_unmapping || + LookInList(Scr->IconifyByUn, tmp_win->full_name, &tmp_win->class); + + if (LookInList (Scr->UnmapByMovingFarAway, tmp_win->full_name, &tmp_win->class)) + tmp_win->UnmapByMovingFarAway = True; + else + tmp_win->UnmapByMovingFarAway = False; + + if (LookInList (Scr->DontSetInactive, tmp_win->full_name, &tmp_win->class)) + tmp_win->DontSetInactive = True; + else + tmp_win->DontSetInactive = False; + + if (LookInList (Scr->AutoSqueeze, tmp_win->full_name, &tmp_win->class)) + tmp_win->AutoSqueeze = True; + else + tmp_win->AutoSqueeze = False; + + if (LookInList (Scr->StartSqueezed, tmp_win->full_name, &tmp_win->class)) + tmp_win->StartSqueezed = True; + else + tmp_win->StartSqueezed = False; + + if (Scr->AlwaysSqueezeToGravity + || LookInList (Scr->AlwaysSqueezeToGravityL, tmp_win->full_name, &tmp_win->class)) + tmp_win->AlwaysSqueezeToGravity = True; + else + tmp_win->AlwaysSqueezeToGravity = False; + + if (tmp_win->transient || tmp_win->group) { + TwmWindow *t = NULL; + if (tmp_win->transient) t = GetTwmWindow(tmp_win->transientfor); + if (!t && tmp_win->group) t = GetTwmWindow(tmp_win->group); + if (t) tmp_win->UnmapByMovingFarAway = t->UnmapByMovingFarAway; + } + if ((Scr->WindowRingAll && !iswman && + !LookInList(Scr->WindowRingExcludeL, tmp_win->full_name, &tmp_win->class)) || + LookInList(Scr->WindowRingL, tmp_win->full_name, &tmp_win->class)) { + if (Scr->Ring) { + tmp_win->ring.next = Scr->Ring->ring.next; + if (Scr->Ring->ring.next->ring.prev) + Scr->Ring->ring.next->ring.prev = tmp_win; + Scr->Ring->ring.next = tmp_win; + tmp_win->ring.prev = Scr->Ring; + } else { + tmp_win->ring.next = tmp_win->ring.prev = Scr->Ring = tmp_win; + } + } else + tmp_win->ring.next = tmp_win->ring.prev = NULL; + tmp_win->ring.cursor_valid = False; + + tmp_win->squeeze_info = NULL; + tmp_win->squeeze_info_copied = 0; + /* + * get the squeeze information; note that this does not have to be freed + * since it is coming from the screen list + */ + if (HasShape) { + if (!LookInList (Scr->DontSqueezeTitleL, tmp_win->full_name, + &tmp_win->class)) { + tmp_win->squeeze_info = (SqueezeInfo *) + LookInList (Scr->SqueezeTitleL, tmp_win->full_name, + &tmp_win->class); + if (!tmp_win->squeeze_info) { + static SqueezeInfo default_squeeze = { J_LEFT, 0, 0 }; + if (Scr->SqueezeTitle) + tmp_win->squeeze_info = &default_squeeze; + } + } + } + + tmp_win->old_bw = tmp_win->attr.border_width; + + { + MotifWmHints mwmHints; + Boolean have_title; + + GetMWMHints(tmp_win->w, &mwmHints); + + tmp_win->frame_bw3D = Scr->ThreeDBorderWidth; + if (((mwmHints.flags & MWM_HINTS_DECORATIONS) && + (mwmHints.decorations & MWM_DECOR_BORDER) == 0) + || LookInList(Scr->NoBorder, tmp_win->full_name, &tmp_win->class)) { + tmp_win->frame_bw = 0; + tmp_win->frame_bw3D = 0; + } else if (tmp_win->frame_bw3D != 0) { + tmp_win->frame_bw = 0; + Scr->ClientBorderWidth = FALSE; + } else if (Scr->ClientBorderWidth) { + tmp_win->frame_bw = tmp_win->old_bw; + } else { + tmp_win->frame_bw = Scr->BorderWidth; + } + bw2 = tmp_win->frame_bw * 2; + + + have_title = True; + if (mwmHints.flags & MWM_HINTS_DECORATIONS) + have_title = (mwmHints.decorations & MWM_DECOR_TITLE) != 0; + if (Scr->NoTitlebar) + have_title = False; + if (LookInList(Scr->MakeTitle, tmp_win->full_name, &tmp_win->class)) + have_title = True; + if (LookInList(Scr->NoTitle, tmp_win->full_name, &tmp_win->class)) + have_title = False; + + if (have_title) { + tmp_win->title_height = Scr->TitleHeight + tmp_win->frame_bw; + } else { + tmp_win->title_height = 0; + } + } + + tmp_win->OpaqueMove = Scr->DoOpaqueMove; + if (LookInList(Scr->OpaqueMoveList, tmp_win->full_name, &tmp_win->class)) + tmp_win->OpaqueMove = TRUE; + else + if (LookInList(Scr->NoOpaqueMoveList, tmp_win->full_name, &tmp_win->class)) + tmp_win->OpaqueMove = FALSE; + + tmp_win->OpaqueResize = Scr->DoOpaqueResize; + if (LookInList(Scr->OpaqueResizeList, tmp_win->full_name, &tmp_win->class)) + tmp_win->OpaqueResize = TRUE; + else + if (LookInList(Scr->NoOpaqueResizeList, tmp_win->full_name, &tmp_win->class)) + tmp_win->OpaqueResize = FALSE; + + /* if it is a transient window, don't put a title on it */ + if (tmp_win->transient && !Scr->DecorateTransients) + tmp_win->title_height = 0; + + if (LookInList(Scr->StartIconified, tmp_win->full_name, &tmp_win->class)) + { + if (!tmp_win->wmhints) + { + tmp_win->wmhints = (XWMHints *)malloc(sizeof(XWMHints)); + tmp_win->wmhints->flags = 0; + } + tmp_win->wmhints->initial_state = IconicState; + tmp_win->wmhints->flags |= StateHint; + } + + GetWindowSizeHints (tmp_win); + + if (restoredFromPrevSession) + { + /* + * When restoring window positions from the previous session, + * we always use NorthWest gravity. + */ + + gravx = gravy = -1; + } + else + { + GetGravityOffsets (tmp_win, &gravx, &gravy); + } + + /* + * Don't bother user if: + * + * o the window is a transient, or + * + * o a USPosition was requested, or + * + * o a PPosition was requested and UsePPosition is ON or + * NON_ZERO if the window is at other than (0,0) + */ + ask_user = TRUE; + if (tmp_win->transient || + (tmp_win->hints.flags & USPosition) || + ((tmp_win->hints.flags & PPosition) && Scr->UsePPosition && + (Scr->UsePPosition == PPOS_ON || + tmp_win->attr.x != 0 || tmp_win->attr.y != 0))) + ask_user = FALSE; + + /*===============[ Matthew McNeill 1997 ]==========================* + * added the occupation parameter to this function call so that the + * occupation can be set up in a specific state if desired + * (restore session for example) + */ + + /* note, this is where tmp_win->vs get setup, among other things */ + + if (restoredFromPrevSession) { + SetupOccupation (tmp_win, saved_occupation); + } else + SetupOccupation (tmp_win, 0); + /*=================================================================*/ + + tmp_win->frame_width = tmp_win->attr.width + 2 * tmp_win->frame_bw3D; + tmp_win->frame_height = tmp_win->attr.height + 2 * tmp_win->frame_bw3D + + tmp_win->title_height; + ConstrainSize (tmp_win, &tmp_win->frame_width, &tmp_win->frame_height); + winbox = findWindowBox (tmp_win); + if (PlaceWindowInRegion (tmp_win, &(tmp_win->attr.x), &(tmp_win->attr.y))) { + ask_user = False; + } + if (LookInList (Scr->WindowGeometries, tmp_win->full_name, &tmp_win->class)) { + char *geom; + int mask_; + geom = LookInList (Scr->WindowGeometries, tmp_win->full_name, &tmp_win->class); + mask_ = XParseGeometry (geom, &tmp_win->attr.x, &tmp_win->attr.y, + (unsigned int*) &tmp_win->attr.width, + (unsigned int*) &tmp_win->attr.height); + + if (mask_ & XNegative) tmp_win->attr.x += Scr->rootw - tmp_win->attr.width; + if (mask_ & YNegative) tmp_win->attr.y += Scr->rooth - tmp_win->attr.height; + ask_user = False; + } + + if (XFindContext (dpy, w, VirtScreenContext, (XPointer *)&vs) == XCSUCCESS) + vroot = vs->window; + else + if (tmp_win->vs) + vroot = tmp_win->vs->window; + else + vroot = Scr->Root; + if (winbox) vroot = winbox->window; + + /* + * do any prompting for position + */ + + if (HandlingEvents && ask_user && !restoredFromPrevSession) { + if ((Scr->RandomPlacement == RP_ALL) || + ((Scr->RandomPlacement == RP_UNMAPPED) && + ((tmp_win->wmhints && (tmp_win->wmhints->initial_state == IconicState)) || + (! visible (tmp_win))))) { /* just stick it somewhere */ + +#ifdef DEBUG + fprintf(stderr, + "DEBUG[RandomPlacement]: win: %dx%d+%d+%d, screen: %dx%d, title height: %d, random: +%d+%d\n", + tmp_win->attr.width, tmp_win->attr.height, + tmp_win->attr.x, tmp_win->attr.y, + Scr->rootw, Scr->rooth, + tmp_win->title_height, + PlaceX, PlaceY); +#endif + + /* Initiallise PlaceX and PlaceY */ + if (PlaceX < 0 && PlaceY < 0) { + if (Scr->RandomDisplacementX >= 0) + PlaceX = Scr->BorderLeft + 5; + else + PlaceX = Scr->rootw - tmp_win->attr.width - Scr->BorderRight - 5; + if (Scr->RandomDisplacementY >= 0) + PlaceY = Scr->BorderTop + 5; + else + PlaceY = Scr->rooth - tmp_win->attr.height - tmp_win->title_height + - Scr->BorderBottom - 5; + } + + /* For a positive horizontal displacement, if the right edge + of the window would fall outside of the screen, start over + by placing the left edge of the window 5 pixels inside + the left edge of the screen.*/ + if (Scr->RandomDisplacementX >= 0 + && (PlaceX + tmp_win->attr.width + > Scr->rootw - Scr->BorderRight - 5)) + PlaceX = Scr->BorderLeft + 5; + + /* For a negative horizontal displacement, if the left edge + of the window would fall outside of the screen, start over + by placing the right edge of the window 5 pixels inside + the right edge of the screen.*/ + if (Scr->RandomDisplacementX < 0 && PlaceX < Scr->BorderLeft + 5) + PlaceX = Scr->rootw - tmp_win->attr.width - Scr->BorderRight - 5; + + /* For a positive vertical displacement, if the bottom edge + of the window would fall outside of the screen, start over + by placing the top edge of the window 5 pixels inside the + top edge of the screen. Because we add the title height + further down, we need to count with it here as well. */ + if (Scr->RandomDisplacementY >= 0 + && (PlaceY + tmp_win->attr.height + tmp_win->title_height + > Scr->rooth - Scr->BorderBottom - 5)) + PlaceY = Scr->BorderTop + 5; + + /* For a negative vertical displacement, if the top edge of + the window would fall outside of the screen, start over by + placing the bottom edge of the window 5 pixels inside the + bottom edge of the screen. Because we add the title height + further down, we need to count with it here as well. */ + if (Scr->RandomDisplacementY < 0 && PlaceY < Scr->BorderTop + 5) + PlaceY = Scr->rooth - tmp_win->attr.height - tmp_win->title_height + - Scr->BorderBottom - 5; + + /* Assign the current random placement to the new window, as + a preliminary measure. Add the title height so things will + look right. */ + tmp_win->attr.x = PlaceX; + tmp_win->attr.y = PlaceY + tmp_win->title_height; + + /* If the window is not supposed to move off the screen, check + that it's still within the screen, and if not, attempt to + correct the situation. */ + if (Scr->DontMoveOff) { + int available; + +#ifdef DEBUG + fprintf(stderr, + "DEBUG[DontMoveOff]: win: %dx%d+%d+%d, screen: %dx%d, bw2: %d, bw3D: %d\n", + tmp_win->attr.width, tmp_win->attr.height, + tmp_win->attr.x, tmp_win->attr.y, + Scr->rootw, Scr->rooth, + bw2, tmp_win->frame_bw3D); +#endif + + /* If the right edge of the window is outside the right edge + of the screen, we need to move the window left. Note that + this can only happen with windows that are less than 50 + pixels less wide than the screen. */ + if ((tmp_win->attr.x + tmp_win->attr.width) > Scr->rootw) { + available = Scr->rootw - tmp_win->attr.width + - 2 * (bw2 + tmp_win->frame_bw3D); + +#ifdef DEBUG + fprintf(stderr, "DEBUG[DontMoveOff]: availableX: %d\n", + available); +#endif + + /* If the window is wider than the screen or exactly the width + of the screen, the availability is exactly 0. The result + will be to have the window placed as much to the left as + possible. */ + if (available <= 0) available = 0; + + /* Place the window exactly between the left and right edge of + the screen when possible. If available was originally less + than zero, it means the window's left edge will be against + the screen's left edge, and the window's right edge will be + outside the screen. */ + tmp_win->attr.x = available / 2; + } + + /* If the bottom edge of the window is outside the bottom edge + of the screen, we need to move the window up. Note that + this can only happen with windows that are less than 50 + pixels less tall than the screen. Don't forget to count + with the title height and the frame widths. */ + if ((tmp_win->attr.y + tmp_win->attr.height) > Scr->rooth) { + available = Scr->rooth - tmp_win->attr.height + - tmp_win->title_height - 2 * (bw2 + tmp_win->frame_bw3D); + +#ifdef DEBUG + fprintf(stderr, "DEBUG[DontMoveOff]: availableY: %d\n", + available); +#endif + + /* If the window is taller than the screen or exactly the + height of the screen, the availability is exactly 0. + The result will be to have the window placed as much to + the top as possible. */ + if (available <= 0) available = 0; + + /* Place the window exactly between the top and bottom edge of + the screen when possible. If available was originally less + than zero, it means the window's top edge will be against + the screen's top edge, and the window's bottom edge will be + outside the screen. Again, don't forget to add the title + height. */ + tmp_win->attr.y = available / 2 + tmp_win->title_height; + } + +#ifdef DEBUG + fprintf(stderr, + "DEBUG[DontMoveOff]: win: %dx%d+%d+%d, screen: %dx%d\n", + tmp_win->attr.width, tmp_win->attr.height, + tmp_win->attr.x, tmp_win->attr.y, + Scr->rootw, Scr->rooth); +#endif + } + + /* We know that if the window's left edge has moved compared to + PlaceX, it will have moved to the left. If it was moved less + than 15 pixel either way, change the next "random position" + 30 pixels down and right. */ + if (PlaceX - tmp_win->attr.x < 15 + || PlaceY - (tmp_win->attr.y - tmp_win->title_height) < 15) { + PlaceX += Scr->RandomDisplacementX; + PlaceY += Scr->RandomDisplacementY; + } + + random_placed = True; + } else { /* else prompt */ + if (!(tmp_win->wmhints && tmp_win->wmhints->flags & StateHint && + tmp_win->wmhints->initial_state == IconicState)) + { + Bool firsttime = True; + + /* better wait until all the mouse buttons have been + * released. + */ + while (TRUE) + { + XUngrabServer(dpy); + XSync(dpy, 0); + XGrabServer(dpy); + + JunkMask = 0; + if (!XQueryPointer (dpy, Scr->Root, &JunkRoot, + &JunkChild, &JunkX, &JunkY, + &AddingX, &AddingY, &JunkMask)) + JunkMask = 0; + + JunkMask &= (Button1Mask | Button2Mask | Button3Mask | + Button4Mask | Button5Mask); + + /* + * watch out for changing screens + */ + if (firsttime) { + if (JunkRoot != Scr->Root) { + register int scrnum; + for (scrnum = 0; scrnum < NumScreens; scrnum++) { + if (JunkRoot == RootWindow (dpy, scrnum)) break; + } + if (scrnum != NumScreens) PreviousScreen = scrnum; + } + if (Scr->currentvs) { + vroot = Scr->currentvs->window; + } + firsttime = False; + } + if (winbox) vroot = winbox->window; + + /* + * wait for buttons to come up; yuck + */ + if (JunkMask != 0) continue; + + /* + * this will cause a warp to the indicated root + */ + stat = XGrabPointer(dpy, vroot, False, + ButtonPressMask | ButtonReleaseMask | + PointerMotionMask | PointerMotionHintMask, + GrabModeAsync, GrabModeAsync, + vroot, UpperLeftCursor, CurrentTime); + if (stat == GrabSuccess) break; + } + + XmbTextExtents(Scr->SizeFont.font_set, + tmp_win->name, namelen, + &ink_rect, &logical_rect); + width = SIZE_HINDENT + ink_rect.width; + height = logical_rect.height + SIZE_VINDENT * 2; + XmbTextExtents(Scr->SizeFont.font_set, + ": ", 2, &logical_rect, &logical_rect); + Scr->SizeStringOffset = width + logical_rect.width; + + XResizeWindow (dpy, Scr->SizeWindow, Scr->SizeStringOffset + + Scr->SizeStringWidth + SIZE_HINDENT, height); + XMapRaised(dpy, Scr->SizeWindow); + InstallRootColormap(); + FB(Scr->DefaultC.fore, Scr->DefaultC.back); + XmbDrawImageString (dpy, Scr->SizeWindow, Scr->SizeFont.font_set, + Scr->NormalGC, SIZE_HINDENT, + SIZE_VINDENT + Scr->SizeFont.ascent, + tmp_win->name, namelen); + + if (winbox) ConstrainedToWinBox (tmp_win, AddingX, AddingY, &AddingX, &AddingY); + + AddingW = tmp_win->attr.width + bw2 + 2 * tmp_win->frame_bw3D; + AddingH = tmp_win->attr.height + tmp_win->title_height + + bw2 + 2 * tmp_win->frame_bw3D; + MoveOutline(vroot,AddingX, AddingY, AddingW, AddingH, + tmp_win->frame_bw, tmp_win->title_height + tmp_win->frame_bw3D); + + XmbDrawImageString (dpy, Scr->SizeWindow, Scr->SizeFont.font_set, + Scr->NormalGC, width, + SIZE_VINDENT + Scr->SizeFont.ascent, ": ", 2); + DisplayPosition (tmp_win, AddingX, AddingY); + + tmp_win->frame_width = AddingW; + tmp_win->frame_height = AddingH; + /*SetFocus ((TwmWindow *) NULL, CurrentTime);*/ + while (TRUE) + { +#ifndef VMS /* I'll try to implement this later. RL */ + if (Scr->OpenWindowTimeout) { + fd = ConnectionNumber (dpy); + while (!XCheckMaskEvent (dpy, ButtonMotionMask | ButtonPressMask, &event)) { + FD_ZERO (&mask); + FD_SET (fd, &mask); + timeout.tv_sec = Scr->OpenWindowTimeout; + timeout.tv_usec = 0; + found = select (fd + 1, (FDSET)&mask, (FDSET)0, (FDSET)0, &timeout); + if (found == 0) break; + } + if (found == 0) break; + } else { +#else + { +#endif + found = 1; + XMaskEvent(dpy, ButtonPressMask | PointerMotionMask, &event); + } + if (event.type == MotionNotify) { + /* discard any extra motion events before a release */ + while(XCheckMaskEvent(dpy, + ButtonMotionMask | ButtonPressMask, &event)) + if (event.type == ButtonPress) + break; + } + FixRootEvent (&event); + if (event.type == ButtonPress) { + AddingX = event.xbutton.x_root; + AddingY = event.xbutton.y_root; + + TryToGrid (tmp_win, &AddingX, &AddingY); + if (Scr->PackNewWindows) TryToPack (tmp_win, &AddingX, &AddingY); + + /* DontMoveOff prohibits user form off-screen placement */ + if (Scr->DontMoveOff) + { + ConstrainByBorders (tmp_win, &AddingX, AddingW, &AddingY, AddingH); + } + break; + } + + if (event.type != MotionNotify) { + continue; + } + + XQueryPointer(dpy, vroot, &JunkRoot, &JunkChild, + &JunkX, &JunkY, &AddingX, &AddingY, &JunkMask); + + TryToGrid (tmp_win, &AddingX, &AddingY); + if (Scr->PackNewWindows) TryToPack (tmp_win, &AddingX, &AddingY); + if (Scr->DontMoveOff) + { + ConstrainByBorders (tmp_win, &AddingX, AddingW, &AddingY, AddingH); + } + MoveOutline(vroot, AddingX, AddingY, AddingW, AddingH, + tmp_win->frame_bw, tmp_win->title_height + tmp_win->frame_bw3D); + + DisplayPosition (tmp_win, AddingX, AddingY); + } + + if (found) { + if (event.xbutton.button == Button2) { + int lastx, lasty; + + XmbTextExtents(Scr->SizeFont.font_set, + ": ", 2, &logical_rect, &logical_rect); + Scr->SizeStringOffset = width + logical_rect.width; + + XResizeWindow (dpy, Scr->SizeWindow, Scr->SizeStringOffset + + Scr->SizeStringWidth + SIZE_HINDENT, height); + + XmbDrawImageString(dpy, Scr->SizeWindow, Scr->SizeFont.font_set, + Scr->NormalGC, width, + SIZE_VINDENT + Scr->SizeFont.ascent, ": ", 2); + + if (0/*Scr->AutoRelativeResize*/) { + int dx = (tmp_win->attr.width / 4); + int dy = (tmp_win->attr.height / 4); + +#define HALF_AVE_CURSOR_SIZE 8 /* so that it is visible */ + if (dx < HALF_AVE_CURSOR_SIZE + Scr->BorderLeft) + dx = HALF_AVE_CURSOR_SIZE + Scr->BorderLeft; + if (dy < HALF_AVE_CURSOR_SIZE + Scr->BorderTop) + dy = HALF_AVE_CURSOR_SIZE + Scr->BorderTop; +#undef HALF_AVE_CURSOR_SIZE + dx += (tmp_win->frame_bw + 1); + dy += (bw2 + tmp_win->title_height + 1); + if (AddingX + dx >= Scr->rootw - Scr->BorderRight) + dx = Scr->rootw - Scr->BorderRight - AddingX - 1; + if (AddingY + dy >= Scr->rooth - Scr->BorderBottom) + dy = Scr->rooth - Scr->BorderBottom - AddingY - 1; + if (dx > 0 && dy > 0) + XWarpPointer (dpy, None, None, 0, 0, 0, 0, dx, dy); + } else { + XWarpPointer (dpy, None, vroot, 0, 0, 0, 0, + AddingX + AddingW/2, AddingY + AddingH/2); + } + AddStartResize(tmp_win, AddingX, AddingY, AddingW, AddingH); + + lastx = -10000; + lasty = -10000; + while (TRUE) + { + XMaskEvent(dpy, + ButtonReleaseMask | ButtonMotionMask, &event); + + if (event.type == MotionNotify) { + /* discard any extra motion events before a release */ + while(XCheckMaskEvent(dpy, + ButtonMotionMask | ButtonReleaseMask, &event)) + if (event.type == ButtonRelease) + break; + } + FixRootEvent (&event); + + if (event.type == ButtonRelease) + { + AddEndResize(tmp_win); + break; + } + + if (event.type != MotionNotify) { + continue; + } + + /* + * XXX - if we are going to do a loop, we ought to consider + * using multiple GXxor lines so that we don't need to + * grab the server. + */ + XQueryPointer(dpy, vroot, &JunkRoot, &JunkChild, + &JunkX, &JunkY, &AddingX, &AddingY, &JunkMask); + + if (lastx != AddingX || lasty != AddingY) + { + resizeWhenAdd = TRUE; + DoResize(AddingX, AddingY, tmp_win); + resizeWhenAdd = FALSE; + + lastx = AddingX; + lasty = AddingY; + } + + } + } + else if (event.xbutton.button == Button3) + { + int maxw = Scr->rootw - Scr->BorderRight - AddingX - bw2; + int maxh = Scr->rooth - Scr->BorderBottom - AddingY - bw2; + + /* + * Make window go to bottom of screen, and clip to right edge. + * This is useful when popping up large windows and fixed + * column text windows. + */ + if (AddingW > maxw) AddingW = maxw; + AddingH = maxh; + + ConstrainSize (tmp_win, &AddingW, &AddingH); /* w/o borders */ + AddingW += bw2; + AddingH += bw2; + XMaskEvent(dpy, ButtonReleaseMask, &event); + } + else + { + XMaskEvent(dpy, ButtonReleaseMask, &event); + } + } + MoveOutline(vroot, 0, 0, 0, 0, 0, 0); + XUnmapWindow(dpy, Scr->SizeWindow); + UninstallRootColormap(); + XUngrabPointer(dpy, CurrentTime); + + tmp_win->attr.x = AddingX; + tmp_win->attr.y = AddingY + tmp_win->title_height; + tmp_win->attr.width = AddingW - bw2 - 2 * tmp_win->frame_bw3D; + tmp_win->attr.height = AddingH - tmp_win->title_height - + bw2 - 2 * tmp_win->frame_bw3D; + + XUngrabServer(dpy); + } + } + } else { /* put it where asked, mod title bar */ + /* if the gravity is towards the top, move it by the title height */ + if (gravy < 0) tmp_win->attr.y -= gravy * tmp_win->title_height; + } + +#ifdef DEBUG + fprintf(stderr, " position window %d, %d %dx%d\n", + tmp_win->attr.x, + tmp_win->attr.y, + tmp_win->attr.width, + tmp_win->attr.height); +#endif + + if (!Scr->ClientBorderWidth) { /* need to adjust for twm borders */ + int delta = tmp_win->attr.border_width - tmp_win->frame_bw - tmp_win->frame_bw3D; + tmp_win->attr.x += gravx * delta; + tmp_win->attr.y += gravy * delta; + } + + tmp_win->title_width = tmp_win->attr.width; + + tmp_win->icon_name = (char*) GetWMPropertyString(tmp_win->w, XA_WM_ICON_NAME); + if (!tmp_win->icon_name) + tmp_win->icon_name = tmp_win->name; + +#ifdef CLAUDE + if (strstr (tmp_win->icon_name, " - Mozilla")) { + char *moz = strstr (tmp_win->icon_name, " - Mozilla"); + *moz = '\0'; + } +#endif + + XmbTextExtents (Scr->TitleBarFont.font_set, tmp_win->name, namelen, &ink_rect, &logical_rect); + tmp_win->name_width = logical_rect.width; + + if (tmp_win->old_bw) XSetWindowBorderWidth (dpy, tmp_win->w, 0); + + tmp_win->squeezed = FALSE; + tmp_win->iconified = FALSE; + tmp_win->isicon = FALSE; + tmp_win->icon_on = FALSE; + + XGrabServer(dpy); + + /* + * Make sure the client window still exists. We don't want to leave an + * orphan frame window if it doesn't. Since we now have the server + * grabbed, the window can't disappear later without having been + * reparented, so we'll get a DestroyNotify for it. We won't have + * gotten one for anything up to here, however. + */ + if (XGetGeometry(dpy, tmp_win->w, &JunkRoot, &JunkX, &JunkY, + &JunkWidth, &JunkHeight, &JunkBW, &JunkDepth) == 0) + { + TwmWindow *prev = tmp_win->ring.prev, *next = tmp_win->ring.next; + + if (prev) prev->ring.next = next; + if (next) next->ring.prev = prev; + if (Scr->Ring == tmp_win) Scr->Ring = (next != tmp_win ? next : (TwmWindow *) NULL); + if (!Scr->Ring || Scr->RingLeader == tmp_win) Scr->RingLeader = Scr->Ring; + + free((char *)tmp_win); + XUngrabServer(dpy); + return(NULL); + } + + /* add the window into the twm list */ + tmp_win->next = Scr->FirstWindow; + if (Scr->FirstWindow != NULL) + Scr->FirstWindow->prev = tmp_win; + tmp_win->prev = NULL; + Scr->FirstWindow = tmp_win; + + /* get all the colors for the window */ + + tmp_win->borderC.fore = Scr->BorderColorC.fore; + tmp_win->borderC.back = Scr->BorderColorC.back; + tmp_win->border_tile.fore = Scr->BorderTileC.fore; + tmp_win->border_tile.back = Scr->BorderTileC.back; + tmp_win->title.fore = Scr->TitleC.fore; + tmp_win->title.back = Scr->TitleC.back; + + GetColorFromList(Scr->BorderColorL, tmp_win->full_name, &tmp_win->class, + &tmp_win->borderC.fore); + GetColorFromList(Scr->BorderColorL, tmp_win->full_name, &tmp_win->class, + &tmp_win->borderC.back); + GetColorFromList(Scr->BorderTileForegroundL, tmp_win->full_name, + &tmp_win->class, &tmp_win->border_tile.fore); + GetColorFromList(Scr->BorderTileBackgroundL, tmp_win->full_name, + &tmp_win->class, &tmp_win->border_tile.back); + GetColorFromList(Scr->TitleForegroundL, tmp_win->full_name, &tmp_win->class, + &tmp_win->title.fore); + GetColorFromList(Scr->TitleBackgroundL, tmp_win->full_name, &tmp_win->class, + &tmp_win->title.back); + + if (Scr->use3Dtitles && !Scr->BeNiceToColormap) GetShadeColors (&tmp_win->title); + if (Scr->use3Dborders && !Scr->BeNiceToColormap) { + GetShadeColors (&tmp_win->borderC); + GetShadeColors (&tmp_win->border_tile); + } + /* create windows */ + + tmp_win->frame_x = tmp_win->attr.x + tmp_win->old_bw - tmp_win->frame_bw + - tmp_win->frame_bw3D; + tmp_win->frame_y = tmp_win->attr.y - tmp_win->title_height + + tmp_win->old_bw - tmp_win->frame_bw - tmp_win->frame_bw3D; + tmp_win->frame_width = tmp_win->attr.width + 2 * tmp_win->frame_bw3D; + tmp_win->frame_height = tmp_win->attr.height + tmp_win->title_height + + 2 * tmp_win->frame_bw3D; + + ConstrainSize (tmp_win, &tmp_win->frame_width, &tmp_win->frame_height); + if (random_placed) + ConstrainByBorders (tmp_win, &tmp_win->frame_x, tmp_win->frame_width, + &tmp_win->frame_y, tmp_win->frame_height); + + valuemask = CWBackPixmap | CWBorderPixel | CWCursor | CWEventMask | CWBackPixel; + attributes.background_pixmap = None; + attributes.border_pixel = tmp_win->border_tile.back; + attributes.background_pixel = tmp_win->border_tile.back; + attributes.cursor = Scr->FrameCursor; + attributes.event_mask = (SubstructureRedirectMask | + ButtonPressMask | ButtonReleaseMask | + EnterWindowMask | LeaveWindowMask | ExposureMask); + if (Scr->BorderCursors) attributes.event_mask |= PointerMotionMask; + if (tmp_win->attr.save_under) { + attributes.save_under = True; + valuemask |= CWSaveUnder; + } + if (tmp_win->hints.flags & PWinGravity) { + attributes.win_gravity = tmp_win->hints.win_gravity; + valuemask |= CWWinGravity; + } + + if ((tmp_win->frame_x > Scr->rootw) || + (tmp_win->frame_y > Scr->rooth) || + ((int)(tmp_win->frame_x + tmp_win->frame_width) < 0) || + ((int)(tmp_win->frame_y + tmp_win->frame_height) < 0)) { + tmp_win->frame_x = 0; + tmp_win->frame_y = 0; + } + + DealWithNonSensicalGeometries(dpy, vroot, tmp_win); + + tmp_win->frame = XCreateWindow (dpy, vroot, tmp_win->frame_x, tmp_win->frame_y, + (unsigned int) tmp_win->frame_width, + (unsigned int) tmp_win->frame_height, + (unsigned int) tmp_win->frame_bw, + Scr->d_depth, + (unsigned int) CopyFromParent, + Scr->d_visual, valuemask, &attributes); + + if (tmp_win->title_height) + { + valuemask = (CWEventMask | CWDontPropagate | CWBorderPixel | CWBackPixel); + attributes.event_mask = (KeyPressMask | ButtonPressMask | + ButtonReleaseMask | ExposureMask); + attributes.do_not_propagate_mask = PointerMotionMask; + attributes.border_pixel = tmp_win->borderC.back; + attributes.background_pixel = tmp_win->title.back; + tmp_win->title_w = XCreateWindow (dpy, tmp_win->frame, + tmp_win->frame_bw3D - tmp_win->frame_bw, + tmp_win->frame_bw3D - tmp_win->frame_bw, + (unsigned int) tmp_win->attr.width, + (unsigned int) Scr->TitleHeight, + (unsigned int) tmp_win->frame_bw, + Scr->d_depth, + (unsigned int) CopyFromParent, + Scr->d_visual, valuemask, + &attributes); + } + else { + tmp_win->title_w = 0; + tmp_win->squeeze_info = NULL; + } + + if (tmp_win->highlight) + { + if (Scr->use3Dtitles && (Scr->Monochrome != COLOR)) + tmp_win->gray = XCreatePixmapFromBitmapData(dpy, vroot, + (char*)black_bits, gray_width, gray_height, + tmp_win->border_tile.fore, tmp_win->border_tile.back, + Scr->d_depth); + else + tmp_win->gray = XCreatePixmapFromBitmapData(dpy, vroot, + (char*)gray_bits, gray_width, gray_height, + tmp_win->border_tile.fore, tmp_win->border_tile.back, + Scr->d_depth); + + tmp_win->hasfocusvisible = True; + SetFocusVisualAttributes (tmp_win, False); + } + else + tmp_win->gray = None; + + RaiseWindow(tmp_win); + + if (tmp_win->title_w) { + ComputeTitleLocation (tmp_win); + CreateWindowTitlebarButtons (tmp_win); + XMoveWindow (dpy, tmp_win->title_w, + tmp_win->title_x, tmp_win->title_y); + XDefineCursor(dpy, tmp_win->title_w, Scr->TitleCursor); + } + else { + tmp_win->title_x = tmp_win->frame_bw3D - tmp_win->frame_bw; + tmp_win->title_y = tmp_win->frame_bw3D - tmp_win->frame_bw; + } + + valuemask = (CWEventMask | CWDontPropagate); + attributes.event_mask = (StructureNotifyMask | PropertyChangeMask | + ColormapChangeMask | VisibilityChangeMask | + FocusChangeMask | + EnterWindowMask | LeaveWindowMask); + attributes.do_not_propagate_mask = ButtonPressMask | ButtonReleaseMask | PointerMotionMask; + XChangeWindowAttributes (dpy, tmp_win->w, valuemask, &attributes); + + if (HasShape) + XShapeSelectInput (dpy, tmp_win->w, ShapeNotifyMask); + + if (tmp_win->title_w) { + XMapWindow (dpy, tmp_win->title_w); + } + + if (HasShape) { + int xws, yws, xbs, ybs; + unsigned wws, hws, wbs, hbs; + int boundingShaped, clipShaped; + + XShapeSelectInput (dpy, tmp_win->w, ShapeNotifyMask); + XShapeQueryExtents (dpy, tmp_win->w, + &boundingShaped, &xws, &yws, &wws, &hws, + &clipShaped, &xbs, &ybs, &wbs, &hbs); + tmp_win->wShaped = boundingShaped; + } + + if (!tmp_win->iconmgr &&! iswman && + (tmp_win->w != Scr->workSpaceMgr.occupyWindow->w)) + XAddToSaveSet(dpy, tmp_win->w); + + XReparentWindow(dpy, tmp_win->w, tmp_win->frame, tmp_win->frame_bw3D, + tmp_win->title_height + tmp_win->frame_bw3D); + /* + * Reparenting generates an UnmapNotify event, followed by a MapNotify. + * Set the map state to FALSE to prevent a transition back to + * WithdrawnState in HandleUnmapNotify. Map state gets set correctly + * again in HandleMapNotify. + */ + tmp_win->mapped = FALSE; + + SetupFrame (tmp_win, tmp_win->frame_x, tmp_win->frame_y, + tmp_win->frame_width, tmp_win->frame_height, -1, True); + + /* wait until the window is iconified and the icon window is mapped + * before creating the icon window + */ + tmp_win->icon = (Icon*) 0; + tmp_win->iconslist = (name_list*) 0; + + if (!tmp_win->iconmgr) + { + GrabButtons(tmp_win); + GrabKeys(tmp_win); + } + + (void) AddIconManager(tmp_win); + + XSaveContext(dpy, tmp_win->w, TwmContext, (XPointer) tmp_win); + XSaveContext(dpy, tmp_win->w, ScreenContext, (XPointer) Scr); + XSaveContext(dpy, tmp_win->frame, TwmContext, (XPointer) tmp_win); + XSaveContext(dpy, tmp_win->frame, ScreenContext, (XPointer) Scr); + + if (tmp_win->title_height) + { + int i; + int nb = Scr->TBInfo.nleft + Scr->TBInfo.nright; + + XSaveContext(dpy, tmp_win->title_w, TwmContext, (XPointer) tmp_win); + XSaveContext(dpy, tmp_win->title_w, ScreenContext, (XPointer) Scr); + for (i = 0; i < nb; i++) { + XSaveContext(dpy, tmp_win->titlebuttons[i].window, TwmContext, + (XPointer) tmp_win); + XSaveContext(dpy, tmp_win->titlebuttons[i].window, ScreenContext, + (XPointer) Scr); + } + if (tmp_win->hilite_wl) + { + XSaveContext(dpy, tmp_win->hilite_wl, TwmContext, (XPointer)tmp_win); + XSaveContext(dpy, tmp_win->hilite_wl, ScreenContext, (XPointer)Scr); + } + if (tmp_win->hilite_wr) + { + XSaveContext(dpy, tmp_win->hilite_wr, TwmContext, (XPointer)tmp_win); + XSaveContext(dpy, tmp_win->hilite_wr, ScreenContext, (XPointer)Scr); + } + if (tmp_win->lolite_wl) + { + XSaveContext(dpy, tmp_win->lolite_wl, TwmContext, (XPointer)tmp_win); + XSaveContext(dpy, tmp_win->lolite_wl, ScreenContext, (XPointer)Scr); + } + if (tmp_win->lolite_wr) + { + XSaveContext(dpy, tmp_win->lolite_wr, TwmContext, (XPointer)tmp_win); + XSaveContext(dpy, tmp_win->lolite_wr, ScreenContext, (XPointer)Scr); + } + } + + XUngrabServer(dpy); + + /* if we were in the middle of a menu activated function, regrab + * the pointer + */ + if (RootFunction) ReGrab(); + if (!iswman) WMapAddWindow (tmp_win); + SetPropsIfCaptiveCtwm (tmp_win); + savegeometry (tmp_win); + return (tmp_win); +} + +/*********************************************************************** + * + * Procedure: + * GetTwmWindow - finds the TwmWindow structure associated with + * a Window (if any), or NULL. + * + * Returned Value: + * NULL - it is not a Window we know about + * otherwise- the TwmWindow * + * + * Inputs: + * w - the window to check + * + * Note: + * This is a relatively cheap function since it does not involve + * communication with the server. Probably faster than walking + * the list of TwmWindows, since the lookup is by a hash table. + * + *********************************************************************** + */ +TwmWindow *GetTwmWindow(Window w) +{ + TwmWindow *twmwin; + int stat; + + stat = XFindContext(dpy, w, TwmContext, (XPointer *)&twmwin); + if (stat == XCNOENT) + twmwin = NULL; + + return twmwin; +} + +/*********************************************************************** + * + * Procedure: + * MappedNotOverride - checks to see if we should really + * put a twm frame on the window + * + * Returned Value: + * TRUE - go ahead and frame the window + * FALSE - don't frame the window + * + * Inputs: + * w - the window to check + * + *********************************************************************** + */ + +int MappedNotOverride(Window w) +{ + XWindowAttributes wa; + + XGetWindowAttributes(dpy, w, &wa); + return ((wa.map_state != IsUnmapped) && (wa.override_redirect != True)); +} + + +/*********************************************************************** + * + * Procedure: + * AddDefaultBindings - attach default bindings so that naive users + * don't get messed up if they provide a minimal twmrc. + */ +static void do_add_binding (int button, int context, int modifier, int func) +{ + AddFuncButton (button, context, modifier, func, NULL, NULL); +} + +void AddDefaultBindings (void) +{ +#define NoModifierMask 0 + + do_add_binding (Button1, C_TITLE, NoModifierMask, F_MOVE); + do_add_binding (Button1, C_ICON, NoModifierMask, F_ICONIFY); + do_add_binding (Button1, C_ICONMGR, NoModifierMask, F_ICONIFY); + + do_add_binding (Button2, C_TITLE, NoModifierMask, F_RAISELOWER); + do_add_binding (Button2, C_ICON, NoModifierMask, F_ICONIFY); + do_add_binding (Button2, C_ICONMGR, NoModifierMask, F_ICONIFY); + +#undef NoModifierMask +} + + + + +/*********************************************************************** + * + * Procedure: + * GrabButtons - grab needed buttons for the window + * + * Inputs: + * tmp_win - the twm window structure to use + * + *********************************************************************** + */ + +#define AltMask (Alt1Mask | Alt2Mask | Alt3Mask | Alt4Mask | Alt5Mask) +#define grabbutton(button, modifier, window, pointer_mode) \ + XGrabButton (dpy, button, modifier, window, \ + True, ButtonPressMask | ButtonReleaseMask, \ + pointer_mode, GrabModeAsync, None, \ + Scr->FrameCursor); + +void GrabButtons(TwmWindow *tmp_win) +{ + FuncButton *tmp; + int i; + unsigned int ModifierMask[8] = { ShiftMask, ControlMask, LockMask, + Mod1Mask, Mod2Mask, Mod3Mask, Mod4Mask, + Mod5Mask }; + + for (tmp = Scr->FuncButtonRoot.next; tmp != NULL; tmp = tmp->next) { + if ((tmp->cont != C_WINDOW) || (tmp->func == 0)) continue; + grabbutton (tmp->num, tmp->mods, tmp_win->frame, GrabModeAsync); + + if (Scr->IgnoreLockModifier && !(tmp->mods & LockMask)) { + grabbutton (tmp->num, tmp->mods | LockMask, tmp_win->frame, GrabModeAsync); + } + for (i = 0 ; i < 8 ; i++) { + if ((Scr->IgnoreModifier & ModifierMask [i]) && !(tmp->mods & ModifierMask [i])) + grabbutton (tmp->num, tmp->mods | ModifierMask [i], + tmp_win->frame, GrabModeAsync); + } + } + if (Scr->ClickToFocus) { + grabbutton (AnyButton, None, tmp_win->w, GrabModeSync); + for (i = 0 ; i < 8 ; i++) { + grabbutton (AnyButton, ModifierMask [i], tmp_win->w, GrabModeSync); + } + } else + if (Scr->RaiseOnClick) { + grabbutton (Scr->RaiseOnClickButton, None, tmp_win->w, GrabModeSync); + for (i = 0 ; i < 8 ; i++) { + grabbutton (Scr->RaiseOnClickButton, + ModifierMask [i], tmp_win->w, GrabModeSync); + } + } +} + +/*********************************************************************** + * + * Procedure: + * GrabKeys - grab needed keys for the window + * + * Inputs: + * tmp_win - the twm window structure to use + * + *********************************************************************** + */ + +#define MAX_KEYCODE 256 +#define grabkey(funckey, modifier, window) \ + XGrabKey(dpy, funckey->keycode, funckey->mods | modifier, window, True, \ + GrabModeAsync, GrabModeAsync); +#define ungrabkey(funckey, modifier, window) \ + XUngrabKey (dpy, funckey->keycode, funckey->mods | modifier, window); + +void GrabKeys(TwmWindow *tmp_win) +{ + FuncKey *tmp; + IconMgr *p; + int i; + unsigned int ModifierMask[8] = { ShiftMask, ControlMask, LockMask, + Mod1Mask, Mod2Mask, Mod3Mask, Mod4Mask, + Mod5Mask }; + + for (tmp = Scr->FuncKeyRoot.next; tmp != NULL; tmp = tmp->next) + { + switch (tmp->cont) + { + case C_WINDOW: + /* case C_WORKSPACE: */ + if (tmp->mods & AltMask) break; + grabkey (tmp, 0, tmp_win->w); + if (Scr->IgnoreLockModifier && !(tmp->mods & LockMask)) + grabkey (tmp, LockMask, tmp_win->w); + for (i = 0 ; i < 8 ; i++) { + if ((Scr->IgnoreModifier & ModifierMask [i]) && + !(tmp->mods & ModifierMask [i])) + grabkey (tmp, ModifierMask [i], tmp_win->w); + } + break; + + case C_ICON: + if (!tmp_win->icon || tmp_win->icon->w) break; + grabkey (tmp, 0, tmp_win->icon->w); + if (Scr->IgnoreLockModifier && !(tmp->mods & LockMask)) + grabkey (tmp, LockMask, tmp_win->icon->w); + for (i = 0 ; i < 8 ; i++) { + if ((Scr->IgnoreModifier & ModifierMask [i]) && + !(tmp->mods & ModifierMask [i])) + grabkey (tmp, ModifierMask [i], tmp_win->icon->w); + } + break; + + case C_TITLE: + if (!tmp_win->title_w) break; + grabkey (tmp, 0, tmp_win->title_w); + if (Scr->IgnoreLockModifier && !(tmp->mods & LockMask)) + grabkey (tmp, LockMask, tmp_win->title_w); + for (i = 0 ; i < 8 ; i++) { + if ((Scr->IgnoreModifier & ModifierMask [i]) && + !(tmp->mods & ModifierMask [i])) + grabkey (tmp, ModifierMask [i], tmp_win->title_w); + } + break; + + case C_NAME: + grabkey (tmp, 0, tmp_win->w); + if (Scr->IgnoreLockModifier && !(tmp->mods & LockMask)) { + grabkey (tmp, LockMask, tmp_win->w); + } + for (i = 0 ; i < 8 ; i++) { + if ((Scr->IgnoreModifier & ModifierMask [i]) && + !(tmp->mods & ModifierMask [i])) + grabkey (tmp, ModifierMask [i], tmp_win->w); + } + if (tmp_win->icon && tmp_win->icon->w) { + grabkey (tmp, 0, tmp_win->icon->w); + if (Scr->IgnoreLockModifier && !(tmp->mods & LockMask)) + grabkey (tmp, LockMask, tmp_win->icon->w); + for (i = 0 ; i < 8 ; i++) { + if ((Scr->IgnoreModifier & ModifierMask [i]) && + !(tmp->mods & ModifierMask [i])) + grabkey (tmp, ModifierMask [i], tmp_win->icon->w); + } + } + if (tmp_win->title_w) { + grabkey (tmp, 0, tmp_win->title_w); + if (Scr->IgnoreLockModifier && !(tmp->mods & LockMask)) + grabkey (tmp, LockMask, tmp_win->title_w); + for (i = 0 ; i < 8 ; i++) { + if ((Scr->IgnoreModifier & ModifierMask [i]) && + !(tmp->mods & ModifierMask [i])) + grabkey (tmp, ModifierMask [i], tmp_win->title_w); + } + } + break; + /* + case C_ROOT: + XGrabKey(dpy, tmp->keycode, tmp->mods, Scr->Root, True, + GrabModeAsync, GrabModeAsync); + break; + */ + } + } + for (tmp = Scr->FuncKeyRoot.next; tmp != NULL; tmp = tmp->next) + { + if (tmp->cont == C_ICONMGR && !Scr->NoIconManagers) + { + for (p = Scr->iconmgr; p != NULL; p = p->next) { + ungrabkey (tmp, 0, p->twm_win->w); + if (Scr->IgnoreLockModifier && !(tmp->mods & LockMask)) + ungrabkey (tmp, LockMask, p->twm_win->w); + for (i = 0 ; i < 8 ; i++) { + if ((Scr->IgnoreModifier & ModifierMask [i]) && + !(tmp->mods & ModifierMask [i])) + ungrabkey (tmp, ModifierMask [i], p->twm_win->w); + } + } + } + } +} + +void ComputeCommonTitleOffsets (void) +{ + int buttonwidth = (Scr->TBInfo.width + Scr->TBInfo.pad); + + Scr->TBInfo.leftx = Scr->TBInfo.rightoff = Scr->FramePadding; + if (Scr->TBInfo.nleft > 0) Scr->TBInfo.leftx += Scr->ButtonIndent; + if (Scr->TBInfo.nright > 0) Scr->TBInfo.rightoff += (Scr->ButtonIndent + + (Scr->TBInfo.nright * buttonwidth) - + Scr->TBInfo.pad); + + Scr->TBInfo.titlex = (Scr->TBInfo.leftx + + (Scr->TBInfo.nleft * buttonwidth) - + Scr->TBInfo.pad + + Scr->TitlePadding); +} + +static void CreateHighlightWindows (TwmWindow *tmp_win) +{ + XSetWindowAttributes attributes; /* attributes for create windows */ + GC gc; + XGCValues gcv; + unsigned long valuemask; + int h = (Scr->TitleHeight - 2 * Scr->FramePadding); + int y = Scr->FramePadding; + + if (! tmp_win->titlehighlight) { + tmp_win->hilite_wl = (Window) 0; + tmp_win->hilite_wr = (Window) 0; + return; + } + /* + * If a special highlight pixmap was given, use that. Otherwise, + * use a nice, even gray pattern. The old horizontal lines look really + * awful on interlaced monitors (as well as resembling other looks a + * little bit too closely), but can be used by putting + * + * Pixmaps { TitleHighlight "hline2" } + * + * (or whatever the horizontal line bitmap is named) in the startup + * file. If all else fails, use the foreground color to look like a + * solid line. + */ + + if (! tmp_win->HiliteImage) { + if (Scr->HighlightPixmapName) { + tmp_win->HiliteImage = GetImage (Scr->HighlightPixmapName, tmp_win->title); + } + } + if (! tmp_win->HiliteImage) { + Pixmap pm = None; + Pixmap bm = None; + + if (Scr->use3Dtitles && (Scr->Monochrome != COLOR)) + bm = XCreateBitmapFromData (dpy, tmp_win->title_w, + (char*)black_bits, gray_width, gray_height); + else + bm = XCreateBitmapFromData (dpy, tmp_win->title_w, + (char*)gray_bits, gray_width, gray_height); + + pm = XCreatePixmap (dpy, tmp_win->title_w, gray_width, gray_height, Scr->d_depth); + gcv.foreground = tmp_win->title.fore; + gcv.background = tmp_win->title.back; + gcv.graphics_exposures = False; + gc = XCreateGC (dpy, pm, (GCForeground|GCBackground|GCGraphicsExposures), &gcv); + if (gc) { + XCopyPlane (dpy, bm, pm, gc, 0, 0, gray_width, gray_height, 0, 0, 1); + tmp_win->HiliteImage = (Image*) malloc (sizeof (struct _Image)); + tmp_win->HiliteImage->pixmap = pm; + tmp_win->HiliteImage->width = gray_width; + tmp_win->HiliteImage->height = gray_height; + tmp_win->HiliteImage->mask = None; + tmp_win->HiliteImage->next = None; + XFreeGC (dpy, gc); + } else { + XFreePixmap (dpy, pm); + pm = None; + } + XFreePixmap (dpy, bm); + } + if (tmp_win->HiliteImage) { + valuemask = CWBackPixmap; + attributes.background_pixmap = tmp_win->HiliteImage->pixmap; + } else { + valuemask = CWBackPixel; + attributes.background_pixel = tmp_win->title.fore; + } + + if (Scr->use3Dtitles) { + y += Scr->TitleShadowDepth; + h -= 2 * Scr->TitleShadowDepth; + } + if (Scr->TitleJustification == J_LEFT) + tmp_win->hilite_wl = (Window) 0; + else + tmp_win->hilite_wl = XCreateWindow (dpy, tmp_win->title_w, 0, y, + (unsigned int) Scr->TBInfo.width, (unsigned int) h, + (unsigned int) 0, Scr->d_depth, (unsigned int) CopyFromParent, + Scr->d_visual, valuemask, &attributes); + + if (Scr->TitleJustification == J_RIGHT) + tmp_win->hilite_wr = (Window) 0; + else + tmp_win->hilite_wr = XCreateWindow (dpy, tmp_win->title_w, 0, y, + (unsigned int) Scr->TBInfo.width, (unsigned int) h, + (unsigned int) 0, Scr->d_depth, (unsigned int) CopyFromParent, + Scr->d_visual, valuemask, &attributes); +} + +void DeleteHighlightWindows(TwmWindow *tmp_win) +{ + if (tmp_win->HiliteImage) { + if (Scr->HighlightPixmapName) { + /* + * Image obtained from GetImage(): it is in a cache + * so we don't need to free it. There will not be multiple + * copies if the same xpm:foo image is requested again. + */ + } else { + XFreePixmap (dpy, tmp_win->HiliteImage->pixmap); + free(tmp_win->HiliteImage); + } + tmp_win->HiliteImage = NULL; + } +} + +static void CreateLowlightWindows (TwmWindow *tmp_win) +{ + XSetWindowAttributes attributes; /* attributes for create windows */ + unsigned long valuemask; + int h = (Scr->TitleHeight - 2 * Scr->FramePadding); + int y = Scr->FramePadding; + ColorPair cp; + + if (!Scr->UseSunkTitlePixmap || ! tmp_win->titlehighlight) { + tmp_win->lolite_wl = (Window) 0; + tmp_win->lolite_wr = (Window) 0; + return; + } + /* + * If a special highlight pixmap was given, use that. Otherwise, + * use a nice, even gray pattern. The old horizontal lines look really + * awful on interlaced monitors (as well as resembling other looks a + * little bit too closely), but can be used by putting + * + * Pixmaps { TitleHighlight "hline2" } + * + * (or whatever the horizontal line bitmap is named) in the startup + * file. If all else fails, use the foreground color to look like a + * solid line. + */ + + if (! tmp_win->LoliteImage) { + if (Scr->HighlightPixmapName) { + cp = tmp_win->title; + cp.shadc = tmp_win->title.shadd; + cp.shadd = tmp_win->title.shadc; + tmp_win->LoliteImage = GetImage (Scr->HighlightPixmapName, cp); + } + } + if (tmp_win->LoliteImage) { + valuemask = CWBackPixmap; + attributes.background_pixmap = tmp_win->LoliteImage->pixmap; + } else { + valuemask = CWBackPixel; + attributes.background_pixel = tmp_win->title.fore; + } + + if (Scr->use3Dtitles) { + y += 2; + h -= 4; + } + if (Scr->TitleJustification == J_LEFT) + tmp_win->lolite_wl = (Window) 0; + else + tmp_win->lolite_wl = XCreateWindow (dpy, tmp_win->title_w, 0, y, + (unsigned int) Scr->TBInfo.width, (unsigned int) h, + (unsigned int) 0, Scr->d_depth, (unsigned int) CopyFromParent, + Scr->d_visual, valuemask, &attributes); + + if (Scr->TitleJustification == J_RIGHT) + tmp_win->lolite_wr = (Window) 0; + else + tmp_win->lolite_wr = XCreateWindow (dpy, tmp_win->title_w, 0, y, + (unsigned int) Scr->TBInfo.width, (unsigned int) h, + (unsigned int) 0, Scr->d_depth, (unsigned int) CopyFromParent, + Scr->d_visual, valuemask, &attributes); +} + + +void ComputeWindowTitleOffsets (TwmWindow *tmp_win, unsigned int width, + Bool squeeze) +{ + int titlew = width - Scr->TBInfo.titlex - Scr->TBInfo.rightoff; + + switch (Scr->TitleJustification) { + case J_LEFT : + tmp_win->name_x = Scr->TBInfo.titlex; + if (Scr->use3Dtitles) tmp_win->name_x += Scr->TitleShadowDepth + 2; + break; + case J_CENTER : + tmp_win->name_x = Scr->TBInfo.titlex + (titlew - tmp_win->name_width) / 2; + break; + case J_RIGHT : + tmp_win->name_x = Scr->TBInfo.titlex + titlew - tmp_win->name_width; + if (Scr->use3Dtitles) tmp_win->name_x -= Scr->TitleShadowDepth - 2; + break; + } + if (Scr->use3Dtitles) { + if (tmp_win->name_x < (Scr->TBInfo.titlex + 2 * Scr->TitleShadowDepth)) + tmp_win->name_x = Scr->TBInfo.titlex + 2 * Scr->TitleShadowDepth; + } + else + if (tmp_win->name_x < Scr->TBInfo.titlex) { + tmp_win->name_x = Scr->TBInfo.titlex; + } + tmp_win->highlightxl = Scr->TBInfo.titlex; + tmp_win->highlightxr = tmp_win->name_x + tmp_win->name_width + 2; + + if (Scr->use3Dtitles) { + tmp_win->highlightxl += Scr->TitleShadowDepth; + } + if (tmp_win->hilite_wr || Scr->TBInfo.nright > 0) + tmp_win->highlightxr += Scr->TitlePadding; + tmp_win->rightx = width - Scr->TBInfo.rightoff; + if (squeeze && tmp_win->squeeze_info && !tmp_win->squeezed) { + int rx = (tmp_win->highlightxr + + (tmp_win->hilite_wr + ? Scr->TBInfo.width * 2 : 0) + + (Scr->TBInfo.nright > 0 ? Scr->TitlePadding : 0) + + Scr->FramePadding); + if (rx < tmp_win->rightx) tmp_win->rightx = rx; + } + return; +} + + +/* + * ComputeTitleLocation - calculate the position of the title window; we need + * to take the frame_bw into account since we want (0,0) of the title window + * to line up with (0,0) of the frame window. + */ +void ComputeTitleLocation (register TwmWindow *tmp) +{ + tmp->title_x = tmp->frame_bw3D - tmp->frame_bw; + tmp->title_y = tmp->frame_bw3D - tmp->frame_bw; + + if (tmp->squeeze_info && !tmp->squeezed) { + register SqueezeInfo *si = tmp->squeeze_info; + int basex; + int maxwidth = tmp->frame_width; + int tw = tmp->title_width + 2 * tmp->frame_bw3D; + + /* + * figure label base from squeeze info (justification fraction) + */ + if (si->denom == 0) { /* num is pixel based */ + basex = si->num; + } else { /* num/denom is fraction */ + basex = ((si->num * maxwidth) / si->denom); + } + if (si->num < 0) + basex += maxwidth; + + /* + * adjust for left (nop), center, right justify and clip + */ + switch (si->justify) { + case J_CENTER: + basex -= tw / 2; + break; + case J_RIGHT: + basex -= tw - 1; + break; + } + if (basex > maxwidth - tw) + basex = maxwidth - tw; + if (basex < 0) basex = 0; + + tmp->title_x = basex - tmp->frame_bw + tmp->frame_bw3D; + } +} + + +static void CreateWindowTitlebarButtons (TwmWindow *tmp_win) +{ + unsigned long valuemask; /* mask for create windows */ + XSetWindowAttributes attributes; /* attributes for create windows */ + int leftx, rightx, y; + TitleButton *tb; + int nb; + + if (tmp_win->title_height == 0) + { + tmp_win->hilite_wl = (Window) 0; + tmp_win->hilite_wr = (Window) 0; + tmp_win->lolite_wl = (Window) 0; + tmp_win->lolite_wr = (Window) 0; + return; + } + + + /* + * create the title bar windows; let the event handler deal with painting + * so that we don't have to spend two pixmaps (or deal with hashing) + */ + ComputeWindowTitleOffsets (tmp_win, tmp_win->attr.width, False); + + leftx = y = Scr->TBInfo.leftx; + rightx = tmp_win->rightx; + + attributes.win_gravity = NorthWestGravity; + attributes.background_pixel = tmp_win->title.back; + attributes.border_pixel = tmp_win->title.fore; + attributes.event_mask = (ButtonPressMask | ButtonReleaseMask | + ExposureMask); + attributes.cursor = Scr->ButtonCursor; + valuemask = (CWWinGravity | CWBackPixel | CWBorderPixel | CWEventMask | + CWCursor); + + tmp_win->titlebuttons = NULL; + nb = Scr->TBInfo.nleft + Scr->TBInfo.nright; + if (nb > 0) { + tmp_win->titlebuttons = (TBWindow *) malloc (nb * sizeof(TBWindow)); + if (!tmp_win->titlebuttons) { + fprintf (stderr, "%s: unable to allocate %d titlebuttons\n", + ProgramName, nb); + } else { + TBWindow *tbw; + int boxwidth = (Scr->TBInfo.width + Scr->TBInfo.pad); + unsigned int h = (Scr->TBInfo.width - Scr->TBInfo.border * 2); + + for (tb = Scr->TBInfo.head, tbw = tmp_win->titlebuttons; tb; + tb = tb->next, tbw++) { + int x; + if (tb->rightside) { + x = rightx; + rightx += boxwidth; + attributes.win_gravity = NorthEastGravity; + } else { + x = leftx; + leftx += boxwidth; + attributes.win_gravity = NorthWestGravity; + } + tbw->window = XCreateWindow (dpy, tmp_win->title_w, x, y, h, h, + (unsigned int) Scr->TBInfo.border, + 0, (unsigned int) CopyFromParent, + (Visual *) CopyFromParent, + valuemask, &attributes); + tbw->image = GetImage (tb->name, tmp_win->title); + if (! tbw->image) { + tbw->image = GetImage (TBPM_QUESTION, tmp_win->title); + if (! tbw->image) { /* cannot happen (see util.c) */ + fprintf (stderr, "%s: unable to add titlebar button \"%s\"\n", + ProgramName, tb->name); + } + } + tbw->info = tb; + } + } + } + + CreateHighlightWindows (tmp_win); + CreateLowlightWindows (tmp_win); + XMapSubwindows(dpy, tmp_win->title_w); + if (tmp_win->hilite_wl) XUnmapWindow(dpy, tmp_win->hilite_wl); + if (tmp_win->hilite_wr) XUnmapWindow(dpy, tmp_win->hilite_wr); + if (tmp_win->lolite_wl) XMapWindow(dpy, tmp_win->lolite_wl); + if (tmp_win->lolite_wr) XMapWindow(dpy, tmp_win->lolite_wr); + return; +} + +void SetHighlightPixmap (char *filename) +{ +#ifdef VMS + char *ftemp; + ftemp = (char *) malloc((strlen(filename)+1)*sizeof(char)); + Scr->HighlightPixmapName = strcpy (ftemp,filename); +#else + Scr->HighlightPixmapName = (char*) strdup (filename); +#endif +} + + +void FetchWmProtocols (TwmWindow *tmp) +{ + unsigned long flags = 0L; + Atom *protocols = NULL; + int n; + + if (XGetWMProtocols (dpy, tmp->w, &protocols, &n)) { + register int i; + register Atom *ap; + + for (i = 0, ap = protocols; i < n; i++, ap++) { + if (*ap == _XA_WM_TAKE_FOCUS) flags |= DoesWmTakeFocus; + if (*ap == _XA_WM_SAVE_YOURSELF) flags |= DoesWmSaveYourself; + if (*ap == _XA_WM_DELETE_WINDOW) flags |= DoesWmDeleteWindow; + } + if (protocols) XFree ((char *) protocols); + } + tmp->protocols = flags; +} + +TwmColormap *CreateTwmColormap(Colormap c) +{ + TwmColormap *cmap; + cmap = (TwmColormap *) malloc(sizeof(TwmColormap)); + if (!cmap || + XSaveContext(dpy, c, ColormapContext, (XPointer) cmap)) { + if (cmap) free((char *) cmap); + return (NULL); + } + cmap->c = c; + cmap->state = 0; + cmap->install_req = 0; + cmap->w = None; + cmap->refcnt = 1; + return (cmap); +} + +ColormapWindow *CreateColormapWindow(Window w, + Bool creating_parent, + Bool property_window) +{ + ColormapWindow *cwin; + TwmColormap *cmap; + XWindowAttributes attributes; + + cwin = (ColormapWindow *) malloc(sizeof(ColormapWindow)); + if (cwin) { + if (!XGetWindowAttributes(dpy, w, &attributes) || + XSaveContext(dpy, w, ColormapContext, (XPointer) cwin)) { + free((char *) cwin); + return (NULL); + } + + if (XFindContext(dpy, attributes.colormap, ColormapContext, + (XPointer *)&cwin->colormap) == XCNOENT) { + cwin->colormap = cmap = CreateTwmColormap(attributes.colormap); + if (!cmap) { + XDeleteContext(dpy, w, ColormapContext); + free((char *) cwin); + return (NULL); + } + } else { + cwin->colormap->refcnt++; + } + + cwin->w = w; + /* + * Assume that windows in colormap list are + * obscured if we are creating the parent window. + * Otherwise, we assume they are unobscured. + */ + cwin->visibility = creating_parent ? + VisibilityPartiallyObscured : VisibilityUnobscured; + cwin->refcnt = 1; + + /* + * If this is a ColormapWindow property window and we + * are not monitoring ColormapNotify or VisibilityNotify + * events, we need to. + */ + if (property_window && + (attributes.your_event_mask & + (ColormapChangeMask|VisibilityChangeMask)) != + (ColormapChangeMask|VisibilityChangeMask)) { + XSelectInput(dpy, w, attributes.your_event_mask | + (ColormapChangeMask|VisibilityChangeMask)); + } + } + + return (cwin); +} + +int FetchWmColormapWindows (TwmWindow *tmp) +{ + register int i, j; + Window *cmap_windows = NULL; + Bool can_free_cmap_windows = False; + int number_cmap_windows = 0; + ColormapWindow **cwins = NULL; + int previously_installed; + + number_cmap_windows = 0; + + if (/* SUPPRESS 560 */ + (previously_installed = + (Scr->cmapInfo.cmaps == &tmp->cmaps && tmp->cmaps.number_cwins))) { + cwins = tmp->cmaps.cwins; + for (i = 0; i < tmp->cmaps.number_cwins; i++) + cwins[i]->colormap->state = 0; + } + + if (XGetWMColormapWindows (dpy, tmp->w, &cmap_windows, + &number_cmap_windows) && + number_cmap_windows > 0) { + + can_free_cmap_windows = False; + /* + * check if the top level is in the list, add to front if not + */ + for (i = 0; i < number_cmap_windows; i++) { + if (cmap_windows[i] == tmp->w) break; + } + if (i == number_cmap_windows) { /* not in list */ + Window *new_cmap_windows = + (Window *) malloc (sizeof(Window) * (number_cmap_windows + 1)); + + if (!new_cmap_windows) { + fprintf (stderr, + "%s: unable to allocate %d element colormap window array\n", + ProgramName, number_cmap_windows+1); + goto done; + } + new_cmap_windows[0] = tmp->w; /* add to front */ + for (i = 0; i < number_cmap_windows; i++) { /* append rest */ + new_cmap_windows[i+1] = cmap_windows[i]; + } + XFree ((char *) cmap_windows); + can_free_cmap_windows = True; /* do not use XFree any more */ + cmap_windows = new_cmap_windows; + number_cmap_windows++; + } + + cwins = (ColormapWindow **) malloc(sizeof(ColormapWindow *) * + number_cmap_windows); + if (cwins) { + for (i = 0; i < number_cmap_windows; i++) { + + /* + * Copy any existing entries into new list. + */ + for (j = 0; j < tmp->cmaps.number_cwins; j++) { + if (tmp->cmaps.cwins[j]->w == cmap_windows[i]) { + cwins[i] = tmp->cmaps.cwins[j]; + cwins[i]->refcnt++; + break; + } + } + + /* + * If the colormap window is not being pointed by + * some other applications colormap window list, + * create a new entry. + */ + if (j == tmp->cmaps.number_cwins) { + if (XFindContext(dpy, cmap_windows[i], ColormapContext, + (XPointer *)&cwins[i]) == XCNOENT) { + if ((cwins[i] = CreateColormapWindow(cmap_windows[i], + (Bool) tmp->cmaps.number_cwins == 0, + True)) == NULL) { + int k; + for (k = i + 1; k < number_cmap_windows; k++) + cmap_windows[k-1] = cmap_windows[k]; + i--; + number_cmap_windows--; + } + } else + cwins[i]->refcnt++; + } + } + } + } + + /* No else here, in case we bailed out of clause above. + */ + if (number_cmap_windows == 0) { + + number_cmap_windows = 1; + + cwins = (ColormapWindow **) malloc(sizeof(ColormapWindow *)); + if (XFindContext(dpy, tmp->w, ColormapContext, (XPointer *)&cwins[0]) == + XCNOENT) + cwins[0] = CreateColormapWindow(tmp->w, + (Bool) tmp->cmaps.number_cwins == 0, False); + else + cwins[0]->refcnt++; + } + + if (tmp->cmaps.number_cwins) + free_cwins(tmp); + + tmp->cmaps.cwins = cwins; + tmp->cmaps.number_cwins = number_cmap_windows; + if (number_cmap_windows > 1) + tmp->cmaps.scoreboard = + (char *) calloc(1, ColormapsScoreboardLength(&tmp->cmaps)); + + if (previously_installed) { + InstallColormaps(PropertyNotify, NULL); + } + + done: + if (cmap_windows) { + if (can_free_cmap_windows) + free ((char *) cmap_windows); + else + XFree ((char *) cmap_windows); + } + + return (0); +} + + +void GetWindowSizeHints (TwmWindow *tmp) +{ + long supplied = 0; + XSizeHints *hints = &tmp->hints; + + if (!XGetWMNormalHints (dpy, tmp->w, hints, &supplied)) + hints->flags = 0; + + if (hints->flags & PResizeInc) { + if (hints->width_inc == 0) hints->width_inc = 1; + if (hints->height_inc == 0) hints->height_inc = 1; + } + + if (!(supplied & PWinGravity) && (hints->flags & USPosition)) { + static int gravs[] = { SouthEastGravity, SouthWestGravity, + NorthEastGravity, NorthWestGravity }; + int right = tmp->attr.x + tmp->attr.width + 2 * tmp->old_bw; + int bottom = tmp->attr.y + tmp->attr.height + 2 * tmp->old_bw; + hints->win_gravity = + gravs[((Scr->rooth - bottom < + tmp->title_height + 2 * tmp->frame_bw3D) ? 0 : 2) | + ((Scr->rootw - right < + tmp->title_height + 2 * tmp->frame_bw3D) ? 0 : 1)]; + hints->flags |= PWinGravity; + } + + /* Check for min size < max size */ + if ((hints->flags & (PMinSize|PMaxSize)) == (PMinSize|PMaxSize)) { + if (hints->max_width < hints->min_width) { + if (hints->max_width > 0) { + hints->min_width = hints->max_width; + } else if (hints->min_width > 0) { + hints->max_width = hints->min_width; + } else { + hints->max_width = hints->min_width = 1; + } + } + + if (hints->max_height < hints->min_height) { + if (hints->max_height > 0) { + hints->min_height = hints->max_height; + } else if (hints->min_height > 0) { + hints->max_height = hints->min_height; + } else { + hints->max_height = hints->min_height = 1; + } + } + } +} + +void AnimateButton (TBWindow *tbw) +{ + Image *image; + XSetWindowAttributes attr; + + image = tbw->image; + attr.background_pixmap = image->pixmap; + XChangeWindowAttributes (dpy, tbw->window, CWBackPixmap, &attr); + XClearWindow (dpy, tbw->window); + tbw->image = image->next; +} + +void AnimateHighlight (TwmWindow *t) +{ + Image *image; + XSetWindowAttributes attr; + + image = t->HiliteImage; + attr.background_pixmap = image->pixmap; + if (t->hilite_wl) { + XChangeWindowAttributes (dpy, t->hilite_wl, CWBackPixmap, &attr); + XClearWindow (dpy, t->hilite_wl); + } + if (t->hilite_wr) { + XChangeWindowAttributes (dpy, t->hilite_wr, CWBackPixmap, &attr); + XClearWindow (dpy, t->hilite_wr); + } + t->HiliteImage = image->next; +} + +name_list **AddWindowRegion (char *geom, int grav1, int grav2) +{ + WindowRegion *wr; + int mask; + + wr = (WindowRegion*) malloc (sizeof (WindowRegion)); + wr->next = NULL; + + if (!Scr->FirstWindowRegion) Scr->FirstWindowRegion = wr; + + wr->entries = NULL; + wr->clientlist = NULL; + wr->grav1 = grav1; + wr->grav2 = grav2; + wr->x = wr->y = wr->w = wr->h = 0; + + mask = XParseGeometry (geom, &wr->x, &wr->y, (unsigned int*) &wr->w, + (unsigned int*) &wr->h); + + if (mask & XNegative) wr->x += Scr->rootw - wr->w; + if (mask & YNegative) wr->y += Scr->rooth - wr->h; + + return (&(wr->clientlist)); +} + +void CreateWindowRegions (void) { + WindowRegion *wr, *wr1 = NULL, *wr2 = NULL; + WorkSpace *wl; + + for (wl = Scr->workSpaceMgr.workSpaceList; wl != NULL; wl = wl->next) { + wl->FirstWindowRegion = NULL; + wr2 = NULL; + for (wr = Scr->FirstWindowRegion; wr != NULL; wr = wr->next) { + wr1 = (WindowRegion*) malloc (sizeof (WindowRegion)); + *wr1 = *wr; + wr1->entries = (WindowEntry*) malloc (sizeof (WindowEntry)); + wr1->entries->next = 0; + wr1->entries->x = wr1->x; + wr1->entries->y = wr1->y; + wr1->entries->w = wr1->w; + wr1->entries->h = wr1->h; + wr1->entries->twm_win = (TwmWindow*) 0; + wr1->entries->used = 0; + if (wr2) wr2->next = wr1; else wl->FirstWindowRegion = wr1; + wr2 = wr1; + } + if (wr1) wr1->next = NULL; + } +} + + +Bool PlaceWindowInRegion (TwmWindow *tmp_win, int *final_x, int *final_y) +{ + WindowRegion *wr; + WindowEntry *we; + int w, h; + WorkSpace *wl; + + if (!Scr->FirstWindowRegion) return (False); + for (wl = Scr->workSpaceMgr.workSpaceList; wl != NULL; wl = wl->next) { + if (OCCUPY (tmp_win, wl)) break; + } + if (!wl) return (False); + w = tmp_win->frame_width; + h = tmp_win->frame_height; + we = (WindowEntry*) 0; + for (wr = wl->FirstWindowRegion; wr; wr = wr->next) { + if (LookInList (wr->clientlist, tmp_win->full_name, &tmp_win->class)) { + for (we = wr->entries; we; we=we->next) { + if (we->used) continue; + if (we->w >= w && we->h >= h) break; + } + if (we) break; + } + } + tmp_win->wr = (WindowRegion*) 0; + if (!we) return (False); + + splitWindowRegionEntry (we, wr->grav1, wr->grav2, w, h); + we->used = 1; + we->twm_win = tmp_win; + *final_x = we->x; + *final_y = we->y; + tmp_win->wr = wr; + return (True); +} + +static void splitWindowRegionEntry (WindowEntry *we, int grav1, int grav2, + int w, int h) +{ + WindowEntry *new; + + switch (grav1) { + case D_NORTH: + case D_SOUTH: + if (w != we->w) splitWindowRegionEntry (we, grav2, grav1, w, we->h); + if (h != we->h) { + new = (WindowEntry *) malloc (sizeof (WindowEntry)); + new->twm_win = 0; + new->used = 0; + new->next = we->next; + we->next = new; + new->x = we->x; + new->h = (we->h - h); + new->w = we->w; + we->h = h; + if (grav1 == D_SOUTH) { + new->y = we->y; + we->y = new->y + new->h; + } else + new->y = we->y + we->h; + } + break; + case D_EAST: + case D_WEST: + if (h != we->h) splitWindowRegionEntry (we, grav2, grav1, we->w, h); + if (w != we->w) { + new = (WindowEntry *) malloc (sizeof (WindowEntry)); + new->twm_win = 0; + new->used = 0; + new->next = we->next; + we->next = new; + new->y = we->y; + new->w = (we->w - w); + new->h = we->h; + we->w = w; + if (grav1 == D_EAST) { + new->x = we->x; + we->x = new->x + new->w; + } else + new->x = we->x + we->w; + } + break; + } +} + +static WindowEntry *findWindowEntry (WorkSpace *wl, TwmWindow *tmp_win, + WindowRegion **wrp) +{ + WindowRegion *wr; + WindowEntry *we; + + for (wr = wl->FirstWindowRegion; wr; wr = wr->next) { + for (we = wr->entries; we; we=we->next) { + if (we->twm_win == tmp_win) { + if (wrp) *wrp = wr; + return we; + } + } + } + return (WindowEntry*) 0; +} + +static WindowEntry *prevWindowEntry (WindowEntry *we, WindowRegion *wr) +{ + WindowEntry *wp; + + if (we == wr->entries) return 0; + for (wp = wr->entries; wp->next != we; wp=wp->next); + return wp; +} + +static void mergeWindowEntries (WindowEntry *old, WindowEntry *we) +{ + if (old->y == we->y) { + we->w = old->w + we->w; + if (old->x < we->x) we->x = old->x; + } else { + we->h = old->h + we->h; + if (old->y < we->y) we->y = old->y; + } +} + +void RemoveWindowFromRegion (TwmWindow *tmp_win) +{ + WindowEntry *we, *wp, *wn; + WindowRegion *wr; + WorkSpace *wl; + + if (!Scr->FirstWindowRegion) return; + we = (WindowEntry*) 0; + for (wl = Scr->workSpaceMgr.workSpaceList; wl != NULL; wl = wl->next) { + we = findWindowEntry (wl, tmp_win, &wr); + if (we) break; + } + if (!we) return; + + we->twm_win = 0; + we->used = 0; + wp = prevWindowEntry (we, wr); + wn = we->next; + for (;;) { + if (wp && wp->used == 0 && + ((wp->x == we->x && wp->w == we->w) || + (wp->y == we->y && wp->h == we->h))) { + wp->next = we->next; + mergeWindowEntries (we, wp); + free ((char *) we); + we = wp; + wp = prevWindowEntry (wp, wr); + } else + if (wn && wn->used == 0 && + ((wn->x == we->x && wn->w == we->w) || + (wn->y == we->y && wn->h == we->h))) { + we->next = wn->next; + mergeWindowEntries (wn, we); + free ((char *) wn); + wn = we->next; + } else break; + } +} + +/* + * This is largely for Xinerama support with VirtualScreens. + * In this case, windows may be on something other then the main screen + * on startup, or the mapping may be relative to the right side of the + * screen, which is on a different monitor, which will cause issues with + * the virtual screens. + * + * It probably needs to be congnizant of windows that are actually owned by + * other workspaces, and ignore them (this needs to be revisited), or perhaps + * that functionality is appropriate in AddWindow(). This needs to be dug into + * more deply. + * + * this approach assumes screens that are next to each other horizontally, + * Other possibilities need to be investigated and accounted for. + */ +void DealWithNonSensicalGeometries(Display *mydpy, Window vroot, TwmWindow *tmp_win) +{ + Window vvroot; + int x,y; + unsigned int w,h; + unsigned int j; + virtualScreen *myvs, *vs; + int dropx = 0; + + if(! vroot) + return; + + if(!(XGetGeometry(mydpy, vroot, &vvroot, &x, &y, &w, &h, &j, &j))) + return; + + myvs = findIfVScreenOf(x, y); + + /* + * probably need to rethink this for unmapped vs's. ugh. + */ + if(!myvs) + return; + + for(vs = myvs->next; vs; vs = vs->next) { + dropx += vs->w; + } + + for(vs = Scr->vScreenList; vs && vs != myvs; vs = vs->next) { + dropx -= vs->w; + } + + if(tmp_win->frame_x > 0 && tmp_win->frame_x >= w) { + tmp_win->frame_x -= abs(dropx); + } else { +} + +} Index: external/mit/ctwm/dist/add_window.h =================================================================== RCS file: external/mit/ctwm/dist/add_window.h diff -N external/mit/ctwm/dist/add_window.h --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/add_window.h 3 Sep 2015 12:19:42 -0000 @@ -0,0 +1,107 @@ +/*****************************************************************************/ +/** Copyright 1988 by Evans & Sutherland Computer Corporation, **/ +/** Salt Lake City, Utah **/ +/** Portions Copyright 1989 by the Massachusetts Institute of Technology **/ +/** Cambridge, Massachusetts **/ +/** **/ +/** All Rights Reserved **/ +/** **/ +/** Permission to use, copy, modify, and distribute this software and **/ +/** its documentation for any purpose and without fee is hereby **/ +/** granted, provided that the above copyright notice appear in all **/ +/** copies and that both that copyright notice and this permis- **/ +/** sion notice appear in supporting documentation, and that the **/ +/** names of Evans & Sutherland and M.I.T. not be used in advertising **/ +/** in publicity pertaining to distribution of the software without **/ +/** specific, written prior permission. **/ +/** **/ +/** EVANS & SUTHERLAND AND M.I.T. DISCLAIM ALL WARRANTIES WITH REGARD **/ +/** TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANT- **/ +/** ABILITY AND FITNESS, IN NO EVENT SHALL EVANS & SUTHERLAND OR **/ +/** M.I.T. BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAM- **/ +/** AGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA **/ +/** OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER **/ +/** TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE **/ +/** OR PERFORMANCE OF THIS SOFTWARE. **/ +/*****************************************************************************/ +/* + * [ ctwm ] + * + * Copyright 1992 Claude Lecommandeur. + * + * Permission to use, copy, modify and distribute this software [ctwm] and + * its documentation for any purpose is hereby granted without fee, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting documen- + * tation, and that the name of Claude Lecommandeur not be used in adverti- + * sing or publicity pertaining to distribution of the software without + * specific, written prior permission. Claude Lecommandeur make no represen- + * tations about the suitability of this software for any purpose. It is + * provided "as is" without express or implied warranty. + * + * Claude Lecommandeur DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO + * EVENT SHALL Claude Lecommandeur BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF + * USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR + * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + * + * Author: Claude Lecommandeur [ lecom@sic.epfl.ch ][ April 1992 ] + */ + + +/********************************************************************** + * + * $XConsortium: add_window.h,v 1.7 90/04/17 14:04:33 jim Exp $ + * + * AddWindow include file + * + * 31-Mar-88 Tom LaStrange Initial Version. + * + **********************************************************************/ + +#include "twm.h" +#include "iconmgr.h" + +#ifndef _ADD_WINDOW_ +#define _ADD_WINDOW_ + +extern char NoName[]; +extern int resizeWhenAdd; + +extern void GetGravityOffsets (TwmWindow *tmp, int *xp, int *yp); +extern TwmWindow *AddWindow(Window w, int iconm, IconMgr *iconp); +extern TwmWindow *GetTwmWindow(Window w); +extern void DeleteHighlightWindows(TwmWindow *tmp_win); +extern int MappedNotOverride(Window w); +extern void AddDefaultBindings (void); +extern void GrabButtons(TwmWindow *tmp_win); +extern void GrabKeys(TwmWindow *tmp_win); +#if 0 /* Not implemented! */ +extern void UngrabButtons(); +extern void UngrabKeys(); +#endif +extern void GetWindowSizeHints(TwmWindow *tmp_win); +extern void AnimateButton (TBWindow *tbw); +extern void AnimateHighlight (TwmWindow *t); +extern void CreateWindowRegions (void); +extern Bool PlaceWindowInRegion (TwmWindow *tmp_win, + int *final_x, int *final_y); +extern void RemoveWindowFromRegion (TwmWindow *tmp_win); +extern name_list **AddWindowRegion (char *geom, int grav1, int grav2); +extern int AddingX; +extern int AddingY; +extern unsigned int AddingW; +extern unsigned int AddingH; + +extern void SetHighlightPixmap (char *filename); +extern int FetchWmColormapWindows (TwmWindow *tmp); +extern void FetchWmProtocols (TwmWindow *tmp); + +extern TwmColormap *CreateTwmColormap(Colormap c); +extern ColormapWindow *CreateColormapWindow(Window w, + Bool creating_parent, + Bool property_window); +#endif /* _ADD_WINDOW_ */ + Index: external/mit/ctwm/dist/clicktofocus.c =================================================================== RCS file: external/mit/ctwm/dist/clicktofocus.c diff -N external/mit/ctwm/dist/clicktofocus.c --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/clicktofocus.c 3 Sep 2015 12:19:42 -0000 @@ -0,0 +1,31 @@ +#include "clicktofocus.h" + +#include "twm.h" +#include "util.h" +#include "screen.h" + +TwmWindow * get_last_window(WorkSpace *current) +{ + TwmWindow *t; + TwmWindow *first = NULL; + + if (! current) return NULL; + + for (t = Scr->FirstWindow; t != NULL; t = t->next) { + if (!first && !t->iconmgr && OCCUPY (t, current) && t->mapped) + first = t; + if (t->hasfocusvisible && OCCUPY (t, current)) + return t; + } + + return first; +} + +void set_last_window(WorkSpace *current) +{ + TwmWindow * t; + + t = get_last_window(current); + + SetFocus(t, CurrentTime); +} Index: external/mit/ctwm/dist/clicktofocus.h =================================================================== RCS file: external/mit/ctwm/dist/clicktofocus.h diff -N external/mit/ctwm/dist/clicktofocus.h --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/clicktofocus.h 3 Sep 2015 12:19:42 -0000 @@ -0,0 +1,11 @@ +#ifndef CLICKTOFOCUS_H +#define CLICKTOFOCUS_H + +#include "twm.h" +#include "iconmgr.h" +#include "workmgr.h" + +TwmWindow * get_last_window(WorkSpace *current); +void set_last_window(WorkSpace *current); + +#endif Index: external/mit/ctwm/dist/ctwm.axp_opt =================================================================== RCS file: external/mit/ctwm/dist/ctwm.axp_opt diff -N external/mit/ctwm/dist/ctwm.axp_opt --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/ctwm.axp_opt 3 Sep 2015 12:19:42 -0000 @@ -0,0 +1,25 @@ +GRAM.OBJ +LEX.OBJ +DEFTWMRC.OBJ +ADD_WINDOW.OBJ +GC.OBJ +LIST.OBJ +CTWM.OBJ +PARSE.OBJ +MENUS.OBJ +EVENTS.OBJ +RESIZE.OBJ +UTIL.OBJ +VERSION.OBJ +ICONMGR.OBJ +WORKMGR.OBJ +CURSOR.OBJ +ICONS.OBJ +VMS_CMD_SERVICES.OBJ +LNM.OBJ +XPMLIB:XPM.OLB/LIB +!X11LIB:XMU.OLB/LIB +SYS$SHARE:DECW$XMULIBSHR/SHARE +SYS$SHARE:DECW$XTSHR/SHARE +SYS$SHARE:DECW$XEXTLIBSHR/SHARE +SYS$SHARE:DECW$XLIBSHR/SHARE Index: external/mit/ctwm/dist/ctwm.c =================================================================== RCS file: external/mit/ctwm/dist/ctwm.c diff -N external/mit/ctwm/dist/ctwm.c --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/ctwm.c 3 Sep 2015 12:19:43 -0000 @@ -0,0 +1,1473 @@ +/*****************************************************************************/ +/** Copyright 1988 by Evans & Sutherland Computer Corporation, **/ +/** Salt Lake City, Utah **/ +/** Portions Copyright 1989 by the Massachusetts Institute of Technology **/ +/** Cambridge, Massachusetts **/ +/** **/ +/** All Rights Reserved **/ +/** **/ +/** Permission to use, copy, modify, and distribute this software and **/ +/** its documentation for any purpose and without fee is hereby **/ +/** granted, provided that the above copyright notice appear in all **/ +/** copies and that both that copyright notice and this permis- **/ +/** sion notice appear in supporting documentation, and that the **/ +/** names of Evans & Sutherland and M.I.T. not be used in advertising **/ +/** in publicity pertaining to distribution of the software without **/ +/** specific, written prior permission. **/ +/** **/ +/** EVANS & SUTHERLAND AND M.I.T. DISCLAIM ALL WARRANTIES WITH REGARD **/ +/** TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANT- **/ +/** ABILITY AND FITNESS, IN NO EVENT SHALL EVANS & SUTHERLAND OR **/ +/** M.I.T. BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAM- **/ +/** AGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA **/ +/** OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER **/ +/** TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE **/ +/** OR PERFORMANCE OF THIS SOFTWARE. **/ +/*****************************************************************************/ +/* + * [ ctwm ] + * + * Copyright 1992 Claude Lecommandeur. + * + * Permission to use, copy, modify and distribute this software [ctwm] and + * its documentation for any purpose is hereby granted without fee, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting documen- + * tation, and that the name of Claude Lecommandeur not be used in adverti- + * sing or publicity pertaining to distribution of the software without + * specific, written prior permission. Claude Lecommandeur make no represen- + * tations about the suitability of this software for any purpose. It is + * provided "as is" without express or implied warranty. + * + * Claude Lecommandeur DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO + * EVENT SHALL Claude Lecommandeur BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF + * USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR + * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + * + * Author: Claude Lecommandeur [ lecom@sic.epfl.ch ][ April 1992 ] + */ + + +/*********************************************************************** + * + * $XConsortium: twm.c,v 1.124 91/05/08 11:01:54 dave Exp $ + * + * twm - "Tom's Window Manager" + * + * 27-Oct-87 Thomas E. LaStrange File created + * 10-Oct-90 David M. Sternlicht Storing saved colors on root + * + * Do the necessary modification to be integrated in ctwm. + * Can no longer be used for the standard twm. + * + * 22-April-92 Claude Lecommandeur. + * + ***********************************************************************/ + +#if defined(USE_SIGNALS) && defined(__sgi) +# define _BSD_SIGNALS +#endif + +#include +#include +#include + +#ifdef __WAIT_FOR_CHILDS +# include +#endif + +#ifdef VMS +#include +#else +#include +#endif +#include "twm.h" +#include "ctwm.h" +#include "add_window.h" +#include "gc.h" +#include "parse.h" +#include "version.h" +#include "menus.h" +#include "events.h" +#include "util.h" +#include "screen.h" +#include "icons.h" +#include "iconmgr.h" +#include "session.h" +#include "cursor.h" +#include "windowbox.h" +#ifdef SOUNDS +# include "sound.h" +#endif +#ifdef VMS +# include +# include +# include +# include +# include "vms_cmd_services.h" +# include +# include + +# ifndef PIXMAP_DIRECTORY +# define PIXMAP_DIRECTORY "DECW$BITMAPS:" +# endif +#else /* VMS */ +# include +# include +# include +# include +# include + +# ifndef PIXMAP_DIRECTORY +# define PIXMAP_DIRECTORY "/usr/lib/X11/twm" +# endif /* PIXMAP_DIRECTORY */ +#endif /* VMS */ + +XtAppContext appContext; /* Xt application context */ +Display *dpy; /* which display are we talking to */ +char *display_name = NULL; /* JMO 2/13/90 for m4 */ +#ifdef USEM4 +int KeepTmpFile = False; /* JMO 3/28/90 for m4 */ +char *keepM4_filename = NULL; /* Keep M4 output here */ +int GoThroughM4 = True; +#endif +Window ResizeWindow; /* the window we are resizing */ + +int cfgchk = 0; +int captive = FALSE; +char *captivename = NULL; + +int MultiScreen = TRUE; /* try for more than one screen? */ +int Monochrome = FALSE; /* Force monochrome, for testing purpose */ +int NumScreens; /* number of screens in ScreenList */ +int HasShape; /* server supports shape extension? */ +int ShapeEventBase, ShapeErrorBase; +ScreenInfo **ScreenList; /* structures for each screen */ +ScreenInfo *Scr = NULL; /* the cur and prev screens */ +int PreviousScreen; /* last screen that we were on */ +int FirstScreen; /* TRUE ==> first screen of display */ +Bool PrintErrorMessages = False; /* controls error messages */ +#ifdef DEBUG +Bool ShowWelcomeWindow = False; +#else +Bool ShowWelcomeWindow = True; +#endif +static int RedirectError; /* TRUE ==> another window manager running */ +/* for settting RedirectError */ +static int CatchRedirectError(Display *display, XErrorEvent *event); +/* for everything else */ +static int TwmErrorHandler(Display *display, XErrorEvent *event); +char Info[INFO_LINES][INFO_SIZE]; /* info strings to print */ +int InfoLines; +unsigned int InfoWidth,InfoHeight; +char *InitFile = NULL; +static Window CreateRootWindow (int x, int y, + unsigned int width, unsigned int height); +static void DisplayInfo (void); +void InternUsefulAtoms (void); +void InitVariables(void); + +Cursor UpperLeftCursor; +Cursor TopRightCursor, + TopLeftCursor, + BottomRightCursor, + BottomLeftCursor, + LeftCursor, + RightCursor, + TopCursor, + BottomCursor; + +Cursor RightButt; +Cursor MiddleButt; +Cursor LeftButt; + +XContext TwmContext; /* context for twm windows */ +XContext MenuContext; /* context for all menu windows */ +XContext IconManagerContext; /* context for all window list windows */ +XContext ScreenContext; /* context to get screen data */ +XContext ColormapContext; /* context for colormap operations */ +XContext VirtScreenContext; /* context for virtual screen */ + +XClassHint NoClass; /* for applications with no class */ + +XGCValues Gcv; + +Window captiveroot; +char *Home; /* the HOME environment variable */ +int HomeLen; /* length of Home */ +int ParseError; /* error parsing the .twmrc file */ + +int HandlingEvents = FALSE; /* are we handling events yet? */ + +Window JunkRoot; /* junk window */ +Window JunkChild; /* junk window */ +int JunkX; /* junk variable */ +int JunkY; /* junk variable */ +unsigned int JunkWidth, JunkHeight, JunkBW, JunkDepth, JunkMask; + +char *ProgramName; +int Argc; +char **Argv; +#ifndef VMS +char **Environ; +#endif + +Bool RestartPreviousState = False; /* try to restart in previous state */ +#ifdef NOTRAP +Bool TrapExceptions = False; +#else +Bool TrapExceptions = True; +#endif + +unsigned long black, white; + +Bool RestartFlag = 0; +SIGNAL_T Restart(int signum); +SIGNAL_T Crash(int signum); +#ifdef __WAIT_FOR_CHILDS + SIGNAL_T ChildExit(int signum); +#endif + +extern Atom _XA_WM_WORKSPACESLIST; + +/*********************************************************************** + * + * Procedure: + * main - start of twm + * + *********************************************************************** + */ + +#ifdef VMS +int main(int argc, char **argv) +#else +int main(int argc, char **argv, char **environ) +#endif +{ + Window croot, parent, *children; + unsigned int nchildren; + int i, j; + unsigned long valuemask; /* mask for create windows */ + XSetWindowAttributes attributes; /* attributes for create windows */ + int numManaged, firstscrn, lastscrn, scrnum; + int zero = 0; + char *restore_filename = NULL; + char *client_id = NULL; + char *welcomefile; + int screenmasked; + static int crootx = 100; + static int crooty = 100; + static unsigned int crootw = 1280; + static unsigned int crooth = 768; +/* static unsigned int crootw = 2880; */ +/* static unsigned int crooth = 1200; */ + Window capwin = (Window) 0; + IconRegion *ir; + + XRectangle ink_rect; + XRectangle logical_rect; + + (void)setlocale(LC_ALL, ""); + +#ifdef VMS +#if 0 + vms_do_init(); +#endif + { + char *ep; + ProgramName = strrchr(argv[0], ']'); + ProgramName++; + ep = strchr(ProgramName, '.'); + if (ep != NULL) *ep = '\0'; + } + Argc = argc; + Argv = argv; + initRun(ProgramName); +#else + ProgramName = argv[0]; + Argc = argc; + Argv = argv; + Environ = environ; +#endif + + for (i = 1; i < argc; i++) { + if (argv[i][0] == '-') { + switch (argv[i][1]) { + case 'd': /* -display dpy */ + if (++i >= argc) goto usage; + display_name = argv[i]; + continue; + case 's': /* -single */ + MultiScreen = FALSE; + continue; + case 'f': /* -file twmrcfilename */ + if (++i >= argc) goto usage; + InitFile = argv[i]; + continue; + case 'm': /* -mono */ + if (strcmp(argv[i],"-mono")) goto usage; + Monochrome = TRUE; + continue; + case 'v': /* -verbose */ + if (!strcmp(argv[i],"-version")) { + (void) printf ("%s\n", VersionNumber); + exit (0); + } + PrintErrorMessages = True; + continue; + case 'c': /* -cfgchk */ + if(!strcmp(argv[i],"-cfgchk")) { + cfgchk = 1; + continue; + } + if (++i >= argc) goto usage; /* -clientId */ + client_id = argv[i]; + continue; + case 'r': /* -restore */ + if (++i >= argc) goto usage; + restore_filename = argv[i]; + continue; + case 'q': /* -quiet */ + PrintErrorMessages = False; + continue; + case 'W': /* -nowelcome */ + ShowWelcomeWindow = False; + continue; + case 'w': /* -window */ + captive = True; + MultiScreen = False; + if ((i + 1) >= argc) continue; + if (*(argv [i + 1]) == '-') continue; + if (sscanf (argv [i + 1], "%x", (unsigned int *)&capwin) != 1) + continue; + i++; + continue; +#ifdef USEM4 + case 'k': /* -keep m4 tmp file */ + KeepTmpFile = True; + continue; + case 'K': /* -keep m4 output */ + if (++i >= argc) goto usage; + keepM4_filename = argv[i]; + continue; +#endif + case 'n': /* -don't preprocess through m4 */ + if (!strcmp(argv[i],"-name")) { + if (++i >= argc) goto usage; + captivename = argv[i]; + continue; + } +#ifdef USEM4 + GoThroughM4 = False; + continue; +#endif + case 'x': /* -xrm resource */ + if (strcmp(argv[i],"-xrm")) goto usage; + if (++i >= argc) goto usage; + continue; + case 'i': + if (!strcmp(argv[i],"-info")) { + DisplayInfo (); + exit (0); + } + goto usage; + } + } + usage: + fprintf (stderr, "usage: %s [-display dpy] [-version] [-info]", ProgramName); +#ifdef USEM4 + fprintf (stderr, " [-cfgchk] [-f file] [-s] [-q] [-v] [-W] [-w [wid]] [-k] [-K file] [-n] [-name name]\n"); +#else + fprintf (stderr, " [-cfgchk] [-f file] [-s] [-q] [-v] [-W] [-w [wid]] [-name name] \n"); +#endif + exit (1); + } + +#define newhandler(sig, action) \ + if (signal (sig, SIG_IGN) != SIG_IGN) (void) signal (sig, action) + + newhandler (SIGINT, Done); + signal (SIGHUP, Restart); + newhandler (SIGQUIT, Done); + newhandler (SIGTERM, Done); +#ifdef __WAIT_FOR_CHILDS + newhandler (SIGCHLD, ChildExit); +#endif + signal (SIGALRM, SIG_IGN); + if (TrapExceptions) { + signal (SIGSEGV, Crash); + signal (SIGBUS, Crash); + } + +#undef newhandler + + Home = getenv("HOME"); + if (Home == NULL) +#ifdef VMS + Home = "[]"; +#else + Home = "./"; +#endif + + HomeLen = strlen(Home); + + NoClass.res_name = NoName; + NoClass.res_class = NoName; + + XtToolkitInitialize (); + appContext = XtCreateApplicationContext (); + + if (!(dpy = XtOpenDisplay (appContext, display_name, "twm", "twm", + NULL, 0, &zero, NULL))) { + fprintf (stderr, "%s: unable to open display \"%s\"\n", + ProgramName, XDisplayName(display_name)); + exit (1); + } + +#ifndef VMS + if (fcntl(ConnectionNumber(dpy), F_SETFD, 1) == -1) { + fprintf (stderr, + "%s: unable to mark display connection as close-on-exec\n", + ProgramName); + exit (1); + } +#endif + if (restore_filename) ReadWinConfigFile (restore_filename); + HasShape = XShapeQueryExtension (dpy, &ShapeEventBase, &ShapeErrorBase); + TwmContext = XUniqueContext(); + MenuContext = XUniqueContext(); + IconManagerContext = XUniqueContext(); + ScreenContext = XUniqueContext(); + ColormapContext = XUniqueContext(); + VirtScreenContext = XUniqueContext(); + + InternUsefulAtoms (); + + + /* Set up the per-screen global information. */ + + NumScreens = ScreenCount(dpy); + + if (MultiScreen) + { + firstscrn = 0; + lastscrn = NumScreens - 1; + } + else + { + firstscrn = lastscrn = DefaultScreen(dpy); + } + + InfoLines = 0; + + /* for simplicity, always allocate NumScreens ScreenInfo struct pointers */ + ScreenList = (ScreenInfo **) calloc (NumScreens, sizeof (ScreenInfo *)); + if (ScreenList == NULL) + { + fprintf (stderr, "%s: Unable to allocate memory for screen list, exiting.\n", + ProgramName); + exit (1); + } + numManaged = 0; + PreviousScreen = DefaultScreen(dpy); + FirstScreen = TRUE; + for (scrnum = firstscrn ; scrnum <= lastscrn; scrnum++) + { + unsigned long attrmask; + if (captive) { + XWindowAttributes wa; + if (capwin && XGetWindowAttributes (dpy, capwin, &wa)) { + Window junk; + croot = capwin; + crootw = wa.width; + crooth = wa.height; + XTranslateCoordinates (dpy, capwin, wa.root, 0, 0, &crootx, &crooty, &junk); + } + else { + croot = CreateRootWindow (crootx, crooty, crootw, crooth); + } + captiveroot = croot; + } + else { + croot = RootWindow (dpy, scrnum); + crootx = 0; + crooty = 0; + crootw = DisplayWidth (dpy, scrnum); + crooth = DisplayHeight (dpy, scrnum); + } + + /* Make sure property priority colors is empty */ + XChangeProperty (dpy, croot, _XA_MIT_PRIORITY_COLORS, + XA_CARDINAL, 32, PropModeReplace, NULL, 0); + XSync(dpy, 0); /* Flush possible previous errors */ + RedirectError = FALSE; + XSetErrorHandler(CatchRedirectError); + attrmask = ColormapChangeMask | EnterWindowMask | PropertyChangeMask | + SubstructureRedirectMask | KeyPressMask | ButtonPressMask | ButtonReleaseMask; + if (captive) attrmask |= StructureNotifyMask; + XSelectInput (dpy, croot, attrmask); + XSync(dpy, 0); + XSetErrorHandler(TwmErrorHandler); + + if (RedirectError && cfgchk==0) + { + fprintf (stderr, "%s: another window manager is already running", + ProgramName); + if (MultiScreen && NumScreens > 0) + fprintf(stderr, " on screen %d?\n", scrnum); + else + fprintf(stderr, "?\n"); + continue; + } + + numManaged ++; + + /* Note: ScreenInfo struct is calloc'ed to initialize to zero. */ + Scr = ScreenList[scrnum] = + (ScreenInfo *) calloc(1, sizeof(ScreenInfo)); + if (Scr == NULL) { + fprintf (stderr, + "%s: unable to allocate memory for ScreenInfo structure for screen %d.\n", + ProgramName, scrnum); + continue; + } + + /* initialize list pointers, remember to put an initialization + * in InitVariables also + */ + Scr->BorderColorL = NULL; + Scr->IconBorderColorL = NULL; + Scr->BorderTileForegroundL = NULL; + Scr->BorderTileBackgroundL = NULL; + Scr->TitleForegroundL = NULL; + Scr->TitleBackgroundL = NULL; + Scr->IconForegroundL = NULL; + Scr->IconBackgroundL = NULL; + Scr->NoBorder = NULL; + Scr->NoIconTitle = NULL; + Scr->NoTitle = NULL; + Scr->OccupyAll = NULL; + Scr->UnmapByMovingFarAway = NULL; + Scr->DontSetInactive = NULL; + Scr->AutoSqueeze = NULL; + Scr->StartSqueezed = NULL; + Scr->AlwaysSqueezeToGravityL = NULL; + Scr->MakeTitle = NULL; + Scr->AutoRaise = NULL; + Scr->AutoLower = NULL; + Scr->IconNames = NULL; + Scr->NoHighlight = NULL; + Scr->NoStackModeL = NULL; + Scr->AlwaysOnTopL = NULL; + Scr->NoTitleHighlight = NULL; + Scr->DontIconify = NULL; + Scr->IconMgrNoShow = NULL; + Scr->IconMgrShow = NULL; + Scr->IconifyByUn = NULL; + Scr->IconManagerFL = NULL; + Scr->IconManagerBL = NULL; + Scr->IconMgrs = NULL; + Scr->StartIconified = NULL; + Scr->SqueezeTitleL = NULL; + Scr->DontSqueezeTitleL = NULL; + Scr->WindowRingL = NULL; + Scr->WindowRingExcludeL = NULL; + Scr->WarpCursorL = NULL; + Scr->DontSave = NULL; + Scr->OpaqueMoveList = NULL; + Scr->NoOpaqueMoveList = NULL; + Scr->OpaqueResizeList = NULL; + Scr->NoOpaqueResizeList = NULL; + Scr->ImageCache = NULL; + Scr->HighlightPixmapName = NULL; + Scr->Workspaces = (MenuRoot*) 0; + Scr->IconMenuDontShow = NULL; + Scr->VirtualScreens = NULL; + Scr->IgnoreTransientL = NULL; + + /* remember to put an initialization in InitVariables also + */ + + Scr->screen = scrnum; + Scr->d_depth = DefaultDepth(dpy, scrnum); + Scr->d_visual = DefaultVisual(dpy, scrnum); + Scr->RealRoot = RootWindow (dpy, scrnum); + Scr->CaptiveRoot = captiveroot; + Scr->Root = croot; + Scr->XineramaRoot = croot; + XSaveContext (dpy, Scr->Root, ScreenContext, (XPointer) Scr); + + if (captive) { + AddToCaptiveList (); + if (captivename) { + XSetStandardProperties (dpy, croot, captivename, captivename, None, NULL, 0, NULL); + } + } else { + captivename = "Root"; + } + Scr->RootColormaps.number_cwins = 1; + Scr->RootColormaps.cwins = (ColormapWindow **) malloc(sizeof(ColormapWindow *)); + Scr->RootColormaps.cwins[0] = CreateColormapWindow(Scr->Root, True, False); + Scr->RootColormaps.cwins[0]->visibility = VisibilityPartiallyObscured; + + Scr->cmapInfo.cmaps = NULL; + Scr->cmapInfo.maxCmaps = MaxCmapsOfScreen(ScreenOfDisplay(dpy, Scr->screen)); + Scr->cmapInfo.root_pushes = 0; + InstallColormaps(0, &Scr->RootColormaps); + + Scr->StdCmapInfo.head = Scr->StdCmapInfo.tail = Scr->StdCmapInfo.mru = NULL; + Scr->StdCmapInfo.mruindex = 0; + LocateStandardColormaps(); + + Scr->TBInfo.nleft = Scr->TBInfo.nright = 0; + Scr->TBInfo.head = NULL; + Scr->TBInfo.border = -100; /* trick to have different default value if ThreeDTitles */ + Scr->TBInfo.width = 0; /* is set or not */ + Scr->TBInfo.leftx = 0; + Scr->TBInfo.titlex = 0; + + Scr->rootx = crootx; + Scr->rooty = crooty; + Scr->rootw = crootw; + Scr->rooth = crooth; + + Scr->crootx = crootx; + Scr->crooty = crooty; + Scr->crootw = crootw; + Scr->crooth = crooth; + + Scr->MaxWindowWidth = 32767 - Scr->rootw; + Scr->MaxWindowHeight = 32767 - Scr->rooth; + + Scr->XORvalue = (((unsigned long) 1) << Scr->d_depth) - 1; + + if (Monochrome || DisplayCells(dpy, scrnum) < 3) + Scr->Monochrome = MONOCHROME; + else + Scr->Monochrome = COLOR; + + /* setup default colors */ + Scr->FirstTime = TRUE; + GetColor(Scr->Monochrome, &black, "black"); + Scr->Black = black; + GetColor(Scr->Monochrome, &white, "white"); + Scr->White = white; + + if (FirstScreen) + { + SetFocus ((TwmWindow *)NULL, CurrentTime); + + /* define cursors */ + + NewFontCursor(&TopLeftCursor, "top_left_corner"); + NewFontCursor(&TopRightCursor, "top_right_corner"); + NewFontCursor(&BottomLeftCursor, "bottom_left_corner"); + NewFontCursor(&BottomRightCursor, "bottom_right_corner"); + NewFontCursor(&LeftCursor, "left_side"); + NewFontCursor(&RightCursor, "right_side"); + NewFontCursor(&TopCursor, "top_side"); + NewFontCursor(&BottomCursor, "bottom_side"); + + NewFontCursor(&UpperLeftCursor, "top_left_corner"); + NewFontCursor(&RightButt, "rightbutton"); + NewFontCursor(&LeftButt, "leftbutton"); + NewFontCursor(&MiddleButt, "middlebutton"); + } + + Scr->iconmgr = NULL; + AllocateIconManager ("TWM", "Icons", "", 1); + + Scr->IconDirectory = NULL; + Scr->PixmapDirectory = PIXMAP_DIRECTORY; + Scr->siconifyPm = None; + Scr->pullPm = None; + Scr->tbpm.xlogo = None; + Scr->tbpm.resize = None; + Scr->tbpm.question = None; + Scr->tbpm.menu = None; + Scr->tbpm.delete = None; + + Scr->WindowMask = (Window) 0; + screenmasked = 0; + if (ShowWelcomeWindow && (welcomefile = getenv ("CTWM_WELCOME_FILE"))) { + screenmasked = 1; + MaskScreen (welcomefile); + } + InitVariables(); + InitMenus(); + InitWorkSpaceManager (); + + /* Parse it once for each screen. */ + if(cfgchk) { + if(ParseTwmrc(InitFile)==0) { + /* Error return */ + fprintf (stderr, "Errors found\n"); + exit(1); + } else { + fprintf (stderr, "No errors found\n"); + exit(0); + } + } + else + { + ParseTwmrc(InitFile); + } + + InitVirtualScreens (Scr); + ConfigureWorkSpaceManager (); + + if (ShowWelcomeWindow && ! screenmasked) MaskScreen (NULL); + if (Scr->ClickToFocus) { + Scr->FocusRoot = FALSE; + Scr->TitleFocus = FALSE; + } + + + + if (Scr->use3Dtitles) { + if (Scr->FramePadding == -100) Scr->FramePadding = 0; + if (Scr->TitlePadding == -100) Scr->TitlePadding = 0; + if (Scr->ButtonIndent == -100) Scr->ButtonIndent = 0; + if (Scr->TBInfo.border == -100) Scr->TBInfo.border = 0; + } + else { + if (Scr->FramePadding == -100) Scr->FramePadding = 2; /* values that look */ + if (Scr->TitlePadding == -100) Scr->TitlePadding = 8; /* "nice" on */ + if (Scr->ButtonIndent == -100) Scr->ButtonIndent = 1; /* 75 and 100dpi displays */ + if (Scr->TBInfo.border == -100) Scr->TBInfo.border = 1; + Scr->TitleShadowDepth = 0; + Scr->TitleButtonShadowDepth = 0; + } + if (! Scr->use3Dborders) Scr->BorderShadowDepth = 0; + if (! Scr->use3Dmenus) Scr->MenuShadowDepth = 0; + if (! Scr->use3Diconmanagers) Scr->IconManagerShadowDepth = 0; + + if (Scr->use3Dtitles && !Scr->BeNiceToColormap) GetShadeColors (&Scr->TitleC); + if (Scr->use3Dmenus && !Scr->BeNiceToColormap) GetShadeColors (&Scr->MenuC); + if (Scr->use3Dmenus && !Scr->BeNiceToColormap) GetShadeColors (&Scr->MenuTitleC); + if (Scr->use3Dborders && !Scr->BeNiceToColormap) GetShadeColors (&Scr->BorderColorC); + if (! Scr->use3Dborders) Scr->ThreeDBorderWidth = 0; + + for (ir = Scr->FirstRegion; ir; ir = ir->next) { + if (ir->TitleJustification == J_UNDEF) + ir->TitleJustification = Scr->IconJustification; + if (ir->Justification == J_UNDEF) + ir->Justification = Scr->IconRegionJustification; + if (ir->Alignement == J_UNDEF) + ir->Alignement = Scr->IconRegionAlignement; + } + + assign_var_savecolor(); /* storeing pixels for twmrc "entities" */ + if (Scr->SqueezeTitle == -1) Scr->SqueezeTitle = FALSE; + if (!Scr->HaveFonts) CreateFonts(); + CreateGCs(); + MakeMenus(); + + Scr->TitleBarFont.y += Scr->FramePadding; + Scr->TitleHeight = Scr->TitleBarFont.height + Scr->FramePadding * 2; + if (Scr->use3Dtitles) Scr->TitleHeight += 2 * Scr->TitleShadowDepth; + /* make title height be odd so buttons look nice and centered */ + if (!(Scr->TitleHeight & 1)) Scr->TitleHeight++; + + InitTitlebarButtons (); /* menus are now loaded! */ + + XGrabServer(dpy); + XSync(dpy, 0); + + JunkX = 0; + JunkY = 0; + + CreateWindowRegions (); + AllocateOthersIconManagers (); + CreateIconManagers(); + CreateWorkSpaceManager (); + MakeWorkspacesMenu (); + createWindowBoxes (); +#ifdef GNOME + InitGnome (); +#endif /* GNOME */ + + XQueryTree(dpy, Scr->Root, &croot, &parent, &children, &nchildren); + /* + * weed out icon windows + */ + for (i = 0; i < nchildren; i++) { + if (children[i]) { + XWMHints *wmhintsp = XGetWMHints (dpy, children[i]); + + if (wmhintsp) { + if (wmhintsp->flags & IconWindowHint) { + for (j = 0; j < nchildren; j++) { + if (children[j] == wmhintsp->icon_window) { + children[j] = None; + break; + } + } + } + XFree ((char *) wmhintsp); + } + } + } + + /* + * map all of the non-override windows + */ + for (i = 0; i < nchildren; i++) + { + if (children[i] && MappedNotOverride(children[i])) + { + XUnmapWindow(dpy, children[i]); + SimulateMapRequest(children[i]); + } + } + if (Scr->ShowWorkspaceManager && Scr->workSpaceManagerActive) + { + virtualScreen *vs; + if (Scr->WindowMask) XRaiseWindow (dpy, Scr->WindowMask); + for (vs = Scr->vScreenList; vs != NULL; vs = vs->next) { + SetMapStateProp (vs->wsw->twm_win, NormalState); + XMapWindow (dpy, vs->wsw->twm_win->frame); + if (vs->wsw->twm_win->StartSqueezed) + Squeeze (vs->wsw->twm_win); + else + XMapWindow (dpy, vs->wsw->w); + vs->wsw->twm_win->mapped = TRUE; + } + } + + if (!Scr->BeNiceToColormap) GetShadeColors (&Scr->DefaultC); + attributes.border_pixel = Scr->DefaultC.fore; + attributes.background_pixel = Scr->DefaultC.back; + attributes.event_mask = (ExposureMask | ButtonPressMask | + KeyPressMask | ButtonReleaseMask); + attributes.backing_store = NotUseful; + attributes.cursor = XCreateFontCursor (dpy, XC_hand2); + valuemask = (CWBorderPixel | CWBackPixel | CWEventMask | + CWBackingStore | CWCursor); + Scr->InfoWindow = XCreateWindow (dpy, Scr->Root, 0, 0, + (unsigned int) 5, (unsigned int) 5, + (unsigned int) 0, 0, + (unsigned int) CopyFromParent, + (Visual *) CopyFromParent, + valuemask, &attributes); + + XmbTextExtents(Scr->SizeFont.font_set, + " 8888 x 8888 ", 13, + &ink_rect, &logical_rect); + Scr->SizeStringWidth = logical_rect.width; + valuemask = (CWBorderPixel | CWBackPixel | CWBitGravity); + attributes.bit_gravity = NorthWestGravity; + + { + int sx, sy; + if (Scr->CenterFeedbackWindow) { + sx = (Scr->rootw / 2) - (Scr->SizeStringWidth / 2); + sy = (Scr->rooth / 2) - ((Scr->SizeFont.height + SIZE_VINDENT*2) / 2); + attributes.save_under = True; + valuemask |= CWSaveUnder; + } else { + sx = 0; + sy = 0; + } + Scr->SizeWindow = XCreateWindow (dpy, Scr->Root, sx, sy, + (unsigned int) Scr->SizeStringWidth, + (unsigned int) (Scr->SizeFont.height + + SIZE_VINDENT*2), + (unsigned int) 0, 0, + (unsigned int) CopyFromParent, + (Visual *) CopyFromParent, + valuemask, &attributes); + } + Scr->ShapeWindow = XCreateSimpleWindow (dpy, Scr->Root, 0, 0, + Scr->rootw, Scr->rooth, 0, 0, 0); + + XUngrabServer(dpy); + if (ShowWelcomeWindow) UnmaskScreen (); + + FirstScreen = FALSE; + Scr->FirstTime = FALSE; + } /* for */ + + if (numManaged == 0) { + if (MultiScreen && NumScreens > 0) + fprintf (stderr, "%s: unable to find any unmanaged screens\n", + ProgramName); + exit (1); + } + (void) ConnectToSessionManager (client_id); +#ifdef SOUNDS + play_startup_sound(); +#endif + + RestartPreviousState = True; + HandlingEvents = TRUE; + InitEvents(); + StartAnimation (); + HandleEvents(); + return (0); +} + +/*********************************************************************** + * + * Procedure: + * InitVariables - initialize twm variables + * + *********************************************************************** + */ + +void InitVariables(void) +{ + FreeList(&Scr->BorderColorL); + FreeList(&Scr->IconBorderColorL); + FreeList(&Scr->BorderTileForegroundL); + FreeList(&Scr->BorderTileBackgroundL); + FreeList(&Scr->TitleForegroundL); + FreeList(&Scr->TitleBackgroundL); + FreeList(&Scr->IconForegroundL); + FreeList(&Scr->IconBackgroundL); + FreeList(&Scr->IconManagerFL); + FreeList(&Scr->IconManagerBL); + FreeList(&Scr->IconMgrs); + FreeList(&Scr->NoBorder); + FreeList(&Scr->NoIconTitle); + FreeList(&Scr->NoTitle); + FreeList(&Scr->OccupyAll); + FreeList(&Scr->MakeTitle); + FreeList(&Scr->AutoRaise); + FreeList(&Scr->AutoLower); + FreeList(&Scr->IconNames); + FreeList(&Scr->NoHighlight); + FreeList(&Scr->NoStackModeL); + FreeList(&Scr->AlwaysOnTopL); + FreeList(&Scr->NoTitleHighlight); + FreeList(&Scr->DontIconify); + FreeList(&Scr->IconMgrNoShow); + FreeList(&Scr->IconMgrShow); + FreeList(&Scr->IconifyByUn); + FreeList(&Scr->StartIconified); + FreeList(&Scr->IconManagerHighlightL); + FreeList(&Scr->SqueezeTitleL); + FreeList(&Scr->DontSqueezeTitleL); + FreeList(&Scr->WindowRingL); + FreeList(&Scr->WindowRingExcludeL); + FreeList(&Scr->WarpCursorL); + FreeList(&Scr->DontSave); + FreeList(&Scr->UnmapByMovingFarAway); + FreeList(&Scr->DontSetInactive); + FreeList(&Scr->AutoSqueeze); + FreeList(&Scr->StartSqueezed); + FreeList(&Scr->AlwaysSqueezeToGravityL); + FreeList(&Scr->IconMenuDontShow); + FreeList(&Scr->VirtualScreens); + FreeList(&Scr->IgnoreTransientL); + + NewFontCursor(&Scr->FrameCursor, "top_left_arrow"); + NewFontCursor(&Scr->TitleCursor, "top_left_arrow"); + NewFontCursor(&Scr->IconCursor, "top_left_arrow"); + NewFontCursor(&Scr->IconMgrCursor, "top_left_arrow"); + NewFontCursor(&Scr->MoveCursor, "fleur"); + NewFontCursor(&Scr->ResizeCursor, "fleur"); + NewFontCursor(&Scr->MenuCursor, "sb_left_arrow"); + NewFontCursor(&Scr->ButtonCursor, "hand2"); + NewFontCursor(&Scr->WaitCursor, "watch"); + NewFontCursor(&Scr->SelectCursor, "dot"); + NewFontCursor(&Scr->DestroyCursor, "pirate"); + NewFontCursor(&Scr->AlterCursor, "question_arrow"); + + Scr->workSpaceManagerActive = FALSE; + Scr->Ring = NULL; + Scr->RingLeader = NULL; + + Scr->DefaultC.fore = black; + Scr->DefaultC.back = white; + Scr->BorderColorC.fore = white; + Scr->BorderColorC.back = black; + Scr->BorderTileC.fore = black; + Scr->BorderTileC.back = white; + Scr->TitleC.fore = black; + Scr->TitleC.back = white; + Scr->MenuC.fore = black; + Scr->MenuC.back = white; + Scr->MenuTitleC.fore = black; + Scr->MenuTitleC.back = white; + Scr->MenuShadowColor = black; + Scr->IconC.fore = black; + Scr->IconC.back = white; + Scr->IconBorderColor = black; + Scr->IconManagerC.fore = black; + Scr->IconManagerC.back = white; + Scr->IconManagerHighlight = black; + + Scr->FramePadding = -100; /* trick to have different default value if ThreeDTitles + is set or not */ + Scr->TitlePadding = -100; + Scr->ButtonIndent = -100; + Scr->SizeStringOffset = 0; + Scr->ThreeDBorderWidth = 6; + Scr->BorderWidth = BW; + Scr->IconBorderWidth = BW; + Scr->NumAutoRaises = 0; + Scr->NumAutoLowers = 0; + Scr->TransientOnTop = 30; + Scr->NoDefaults = FALSE; + Scr->UsePPosition = PPOS_OFF; + Scr->UseSunkTitlePixmap = FALSE; + Scr->FocusRoot = TRUE; + Scr->Focus = NULL; + Scr->WarpCursor = FALSE; + Scr->ForceIcon = FALSE; + Scr->NoGrabServer = FALSE; + Scr->NoRaiseMove = FALSE; + Scr->NoRaiseResize = FALSE; + Scr->NoRaiseDeicon = FALSE; + Scr->RaiseOnWarp = TRUE; + Scr->DontMoveOff = FALSE; + Scr->DoZoom = FALSE; + Scr->TitleFocus = TRUE; + Scr->IconManagerFocus = TRUE; + Scr->StayUpMenus = FALSE; + Scr->WarpToDefaultMenuEntry = FALSE; + Scr->ClickToFocus = FALSE; + Scr->SloppyFocus = FALSE; + Scr->SaveWorkspaceFocus = FALSE; + Scr->NoIconTitlebar = FALSE; + Scr->NoTitlebar = FALSE; + Scr->DecorateTransients = FALSE; + Scr->IconifyByUnmapping = FALSE; + Scr->ShowIconManager = FALSE; + Scr->ShowWorkspaceManager = FALSE; + Scr->WMgrButtonShadowDepth = 2; + Scr->WMgrVertButtonIndent = 5; + Scr->WMgrHorizButtonIndent = 5; + Scr->BorderShadowDepth = 2; + Scr->TitleShadowDepth = 2; + Scr->TitleButtonShadowDepth = 2; + Scr->MenuShadowDepth = 2; + Scr->IconManagerShadowDepth = 2; + Scr->AutoOccupy = FALSE; + Scr->TransientHasOccupation = FALSE; + Scr->DontPaintRootWindow = FALSE; + Scr->IconManagerDontShow = FALSE; + Scr->BackingStore = TRUE; + Scr->SaveUnder = TRUE; + Scr->RandomPlacement = RP_OFF; + Scr->RandomDisplacementX = 30; + Scr->RandomDisplacementY = 30; + Scr->DoOpaqueMove = FALSE; + Scr->OpaqueMove = FALSE; + Scr->OpaqueMoveThreshold = 200; + Scr->OpaqueResize = FALSE; + Scr->DoOpaqueResize = FALSE; + Scr->OpaqueResizeThreshold = 1000; + Scr->Highlight = TRUE; + Scr->StackMode = TRUE; + Scr->TitleHighlight = TRUE; + Scr->MoveDelta = 1; /* so that f.deltastop will work */ + Scr->MoveOffResistance = -1; + Scr->MovePackResistance = 20; + Scr->ZoomCount = 8; + Scr->SortIconMgr = FALSE; + Scr->Shadow = TRUE; + Scr->InterpolateMenuColors = FALSE; + Scr->NoIconManagers = FALSE; + Scr->ClientBorderWidth = FALSE; + Scr->SqueezeTitle = -1; + Scr->FirstRegion = NULL; + Scr->LastRegion = NULL; + Scr->FirstWindowRegion = NULL; + Scr->FirstTime = TRUE; + Scr->HaveFonts = FALSE; /* i.e. not loaded yet */ + Scr->CaseSensitive = TRUE; + Scr->WarpUnmapped = FALSE; + Scr->WindowRingAll = FALSE; + Scr->WarpRingAnyWhere = TRUE; + Scr->ShortAllWindowsMenus = FALSE; + Scr->use3Diconmanagers = FALSE; + Scr->use3Dmenus = FALSE; + Scr->use3Dtitles = FALSE; + Scr->use3Dborders = FALSE; + Scr->use3Dwmap = FALSE; + Scr->SunkFocusWindowTitle = FALSE; + Scr->ClearShadowContrast = 50; + Scr->DarkShadowContrast = 40; + Scr->BeNiceToColormap = FALSE; + Scr->BorderCursors = FALSE; + Scr->IconJustification = J_CENTER; + Scr->IconRegionJustification = J_CENTER; + Scr->IconRegionAlignement = J_CENTER; + Scr->TitleJustification = J_LEFT; + Scr->IconifyStyle = ICONIFY_NORMAL; + Scr->MaxIconTitleWidth = Scr->rootw; + Scr->ReallyMoveInWorkspaceManager = FALSE; + Scr->ShowWinWhenMovingInWmgr = FALSE; + Scr->ReverseCurrentWorkspace = FALSE; + Scr->DontWarpCursorInWMap = FALSE; + Scr->XMoveGrid = 1; + Scr->YMoveGrid = 1; + Scr->FastServer = True; + Scr->CenterFeedbackWindow = False; + Scr->ShrinkIconTitles = False; + Scr->AutoRaiseIcons = False; + Scr->AutoFocusToTransients = False; /* kai */ + Scr->use3Diconborders = False; + Scr->OpenWindowTimeout = 0; + Scr->RaiseWhenAutoUnSqueeze = False; + Scr->RaiseOnClick = False; + Scr->RaiseOnClickButton = 1; + Scr->IgnoreLockModifier = False; + Scr->IgnoreModifier = 0; + Scr->IgnoreCaseInMenuSelection = False; + Scr->PackNewWindows = False; + Scr->AlwaysSqueezeToGravity = FALSE; + Scr->NoWarpToMenuTitle = FALSE; + + Scr->BorderTop = 0; + Scr->BorderBottom = 0; + Scr->BorderLeft = 0; + Scr->BorderRight = 0; + + /* setup default fonts; overridden by defaults from system.twmrc */ + +# define DEFAULT_NICE_FONT "-*-helvetica-bold-r-normal-*-*-120-*" +# define DEFAULT_FAST_FONT "-misc-fixed-medium-r-semicondensed--13-120-75-75-c-60-*" + + Scr->TitleBarFont.font_set = NULL; + Scr->TitleBarFont.basename = DEFAULT_NICE_FONT; + Scr->MenuFont.font_set = NULL; + Scr->MenuFont.basename = DEFAULT_NICE_FONT; + Scr->IconFont.font_set = NULL; + Scr->IconFont.basename = DEFAULT_NICE_FONT; + Scr->SizeFont.font_set = NULL; + Scr->SizeFont.basename = DEFAULT_FAST_FONT; + Scr->IconManagerFont.font_set = NULL; + Scr->IconManagerFont.basename = DEFAULT_NICE_FONT; + Scr->DefaultFont.font_set = NULL; + Scr->DefaultFont.basename = DEFAULT_FAST_FONT; + Scr->workSpaceMgr.windowFont.font_set = NULL; + Scr->workSpaceMgr.windowFont.basename = DEFAULT_FAST_FONT; +} + + +void CreateFonts (void) +{ + GetFont(&Scr->TitleBarFont); + GetFont(&Scr->MenuFont); + GetFont(&Scr->IconFont); + GetFont(&Scr->SizeFont); + GetFont(&Scr->IconManagerFont); + GetFont(&Scr->DefaultFont); + GetFont(&Scr->workSpaceMgr.windowFont); + Scr->HaveFonts = TRUE; +} + + +void RestoreWithdrawnLocation (TwmWindow *tmp) +{ + int gravx, gravy; + unsigned int bw, mask; + XWindowChanges xwc; + + if (tmp->UnmapByMovingFarAway && !visible(tmp)) { + XMoveWindow (dpy, tmp->frame, tmp->frame_x, tmp->frame_y); + } + if (tmp->squeezed) Squeeze (tmp); + if (XGetGeometry (dpy, tmp->w, &JunkRoot, &xwc.x, &xwc.y, + &JunkWidth, &JunkHeight, &bw, &JunkDepth)) { + + GetGravityOffsets (tmp, &gravx, &gravy); + if (gravy < 0) xwc.y -= tmp->title_height; + xwc.x += gravx * tmp->frame_bw3D; + xwc.y += gravy * tmp->frame_bw3D; + + if (bw != tmp->old_bw) { + int xoff, yoff; + + if (!Scr->ClientBorderWidth) { + xoff = gravx; + yoff = gravy; + } else { + xoff = 0; + yoff = 0; + } + + xwc.x -= (xoff + 1) * tmp->old_bw; + xwc.y -= (yoff + 1) * tmp->old_bw; + } + if (!Scr->ClientBorderWidth) { + xwc.x += gravx * tmp->frame_bw; + xwc.y += gravy * tmp->frame_bw; + } + + mask = (CWX | CWY); + if (bw != tmp->old_bw) { + xwc.border_width = tmp->old_bw; + mask |= CWBorderWidth; + } + +#if 0 + if (tmp->vs) { + xwc.x += tmp->vs->x; + xwc.y += tmp->vs->y; + } +#endif + + if (tmp->winbox && tmp->winbox->twmwin && tmp->frame) { + int xbox, ybox; + if (XGetGeometry (dpy, tmp->frame, &JunkRoot, &xbox, &ybox, + &JunkWidth, &JunkHeight, &bw, &JunkDepth)) { + XReparentWindow (dpy, tmp->frame, Scr->Root, xbox, ybox); + } + } + XConfigureWindow (dpy, tmp->w, mask, &xwc); + + if (tmp->wmhints && (tmp->wmhints->flags & IconWindowHint)) { + XUnmapWindow (dpy, tmp->wmhints->icon_window); + } + + } +} + + +/*********************************************************************** + * + * Procedure: + * Done - cleanup and exit twm + * + * Returned Value: + * none + * + * Inputs: + * none + * + * Outputs: + * none + * + * Special Considerations: + * none + * + *********************************************************************** + */ + +void Reborder (Time time) +{ + TwmWindow *tmp; /* temp twm window structure */ + int scrnum; + ScreenInfo *savedScreen; /* Its better to avoid coredumps */ + + /* put a border back around all windows */ + + XGrabServer (dpy); + savedScreen = Scr; + for (scrnum = 0; scrnum < NumScreens; scrnum++) + { + if ((Scr = ScreenList[scrnum]) == NULL) + continue; + + InstallColormaps(0, &Scr->RootColormaps); /* force reinstall */ + for (tmp = Scr->FirstWindow; tmp != NULL; tmp = tmp->next) + { + RestoreWithdrawnLocation (tmp); + XMapWindow (dpy, tmp->w); + } + } + Scr = savedScreen; + XUngrabServer (dpy); + SetFocus ((TwmWindow*)NULL, time); +} + +SIGNAL_T Done(int signum) +{ +#ifdef SOUNDS + play_exit_sound(); +#endif + Reborder (CurrentTime); +#if defined(VMS) && EXIT_ENDSESSION /* was: #ifdef VMS */ + createProcess("run sys$system:decw$endsession.exe"); + sleep(10); /* sleep until stopped */ +#else + XDeleteProperty (dpy, Scr->Root, _XA_WM_WORKSPACESLIST); + if (captive) RemoveFromCaptiveList (); + XCloseDisplay(dpy); +#ifdef VMS + exit(20); /* Will generate a fatal error, even + when compiled with DEC C 5.3 and above. */ +#else + exit(0); +#endif +#endif +} + +SIGNAL_T Crash (int signum) +{ + Reborder (CurrentTime); + XDeleteProperty (dpy, Scr->Root, _XA_WM_WORKSPACESLIST); + if (captive) RemoveFromCaptiveList (); + XCloseDisplay(dpy); + + fprintf (stderr, "\nCongratulations, you have found a bug in ctwm\n"); + fprintf (stderr, "If a core file was generated in your directory,\n"); + fprintf (stderr, "can you please try extract the stack trace,\n"); + fprintf (stderr, "and mail the results, and a description of what you were doing,\n"); + fprintf (stderr, "to ctwm@ctwm.org. Thank you for your support.\n"); + fprintf (stderr, "...exiting ctwm now.\n\n"); + + abort (); +} + + +SIGNAL_T Restart(int signum) +{ + fprintf (stderr, "%s: setting restart flag\n", ProgramName); + RestartFlag = 1; +} + +void DoRestart(Time t) +{ + RestartFlag = 0; + + StopAnimation (); + XSync (dpy, 0); + Reborder (t); + XSync (dpy, 0); + + if (smcConn) SmcCloseConnection (smcConn, 0, NULL); + + fprintf (stderr, "%s: restarting: %s\n", + ProgramName, *Argv); +#ifdef VMS + exit (1); /* Trust CTWM.COM /Richard Levitte */ +#else + execvp(*Argv, Argv); +#endif + fprintf (stderr, "%s: unable to restart: %s\n", ProgramName, *Argv); +} + +#ifdef __WAIT_FOR_CHILDS +/* + * Handler for SIGCHLD. Needed to avoid zombies when an .xinitrc + * execs ctwm as the last client. (All processes forked off from + * within .xinitrc have been inherited by ctwm during the exec.) + * Jens Schweikhardt + */ +SIGNAL_T +ChildExit (int signum) +{ + int Errno = errno; + signal (SIGCHLD, ChildExit); /* reestablish because we're a one-shot */ + waitpid (-1, NULL, WNOHANG); /* reap dead child, ignore status */ + errno = Errno; /* restore errno for interrupted sys calls */ +} +#endif + +/* + * Error Handlers. If a client dies, we'll get a BadWindow error (except for + * GetGeometry which returns BadDrawable) for most operations that we do before + * manipulating the client's window. + */ + +Bool ErrorOccurred = False; +XErrorEvent LastErrorEvent; + +static int TwmErrorHandler(Display *display, XErrorEvent *event) +{ + LastErrorEvent = *event; + ErrorOccurred = True; + + if (PrintErrorMessages && /* don't be too obnoxious */ + event->error_code != BadWindow && /* watch for dead puppies */ + (event->request_code != X_GetGeometry && /* of all styles */ + event->error_code != BadDrawable)) + XmuPrintDefaultErrorMessage (display, event, stderr); + return 0; +} + + +/* ARGSUSED*/ +static int CatchRedirectError(Display *display, XErrorEvent *event) +{ + RedirectError = TRUE; + LastErrorEvent = *event; + ErrorOccurred = True; + return 0; +} + +Atom _XA_MIT_PRIORITY_COLORS; +Atom _XA_WM_CHANGE_STATE; +Atom _XA_WM_STATE; +Atom _XA_WM_COLORMAP_WINDOWS; +Atom _XA_WM_PROTOCOLS; +Atom _XA_WM_TAKE_FOCUS; +Atom _XA_WM_SAVE_YOURSELF; +Atom _XA_WM_DELETE_WINDOW; +Atom _XA_WM_CLIENT_MACHINE; +Atom _XA_SM_CLIENT_ID; +Atom _XA_WM_CLIENT_LEADER; +Atom _XA_WM_WINDOW_ROLE; + +void InternUsefulAtoms (void) +{ + /* + * Create priority colors if necessary. + */ + _XA_MIT_PRIORITY_COLORS = XInternAtom(dpy, "_MIT_PRIORITY_COLORS", False); + _XA_WM_CHANGE_STATE = XInternAtom (dpy, "WM_CHANGE_STATE", False); + _XA_WM_STATE = XInternAtom (dpy, "WM_STATE", False); + _XA_WM_COLORMAP_WINDOWS = XInternAtom (dpy, "WM_COLORMAP_WINDOWS", False); + _XA_WM_PROTOCOLS = XInternAtom (dpy, "WM_PROTOCOLS", False); + _XA_WM_TAKE_FOCUS = XInternAtom (dpy, "WM_TAKE_FOCUS", False); + _XA_WM_SAVE_YOURSELF = XInternAtom (dpy, "WM_SAVE_YOURSELF", False); + _XA_WM_DELETE_WINDOW = XInternAtom (dpy, "WM_DELETE_WINDOW", False); + _XA_WM_CLIENT_MACHINE = XInternAtom (dpy, "WM_CLIENT_MACHINE", False); + _XA_SM_CLIENT_ID = XInternAtom (dpy, "SM_CLIENT_ID", False); + _XA_WM_CLIENT_LEADER = XInternAtom (dpy, "WM_CLIENT_LEADER", False); + _XA_WM_WINDOW_ROLE = XInternAtom (dpy, "WM_WINDOW_ROLE", False); +} + +static Window CreateRootWindow (int x, int y, + unsigned int width, unsigned int height) +{ + int scrnum; + Window ret; + XWMHints wmhints; + Atom _XA_WM_CTWM_ROOT; + + scrnum = DefaultScreen (dpy); + ret = XCreateSimpleWindow (dpy, RootWindow (dpy, scrnum), + x, y, width, height, 2, WhitePixel (dpy, scrnum), + BlackPixel (dpy, scrnum)); + XSetStandardProperties (dpy, ret, "Captive ctwm", NULL, None, NULL, 0, NULL); + wmhints.initial_state = NormalState; + wmhints.input = True; + wmhints.flags = InputHint | StateHint; + XSetWMHints (dpy, ret, &wmhints); + + _XA_WM_CTWM_ROOT = XInternAtom (dpy, "WM_CTWM_ROOT", False); + XChangeProperty (dpy, ret, _XA_WM_CTWM_ROOT, XA_WINDOW, 32, + PropModeReplace, (unsigned char *) &ret, 4); + XSelectInput (dpy, ret, StructureNotifyMask); + XMapWindow (dpy, ret); + return (ret); +} + +static void DisplayInfo (void) { + (void) printf ("Twm version: %s\n", Version); + (void) printf ("Compile time options :"); +#ifdef XPM + (void) printf (" XPM"); +#endif +#ifdef IMCONV + (void) printf (" IMCONV"); +#endif +#ifdef USEM4 + (void) printf (" USEM4"); +#endif +#ifdef SOUNDS + (void) printf (" SOUNDS"); +#endif + (void) printf (" I18N"); + (void) printf ("\n"); +} + Index: external/mit/ctwm/dist/ctwm.com =================================================================== RCS file: external/mit/ctwm/dist/ctwm.com diff -N external/mit/ctwm/dist/ctwm.com --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/ctwm.com 3 Sep 2015 12:19:43 -0000 @@ -0,0 +1,41 @@ +$! put in the right path +$ progdir := program:[x_vaxbin] +$! Make the following empty if you want no welcoming picture +$ welcome_file := program:[lib.xpm]welcome.xpm ! .xwd works as well +$ +$! No more customization ------------------------------------------------ +$ +$ if f$getsyi("CPU") .ge. 128 +$ then +$ exe := axp_exe +$ else +$ exe := vax_exe +$ endif +$ ctwm:=$'progdir'ctwm.'exe' +$ ShowWelcomeSwitch = "-W" +$ if welcome_file .nes. "" +$ then +$ t = f$edit(f$parse(welcome_file,,,"type") - ".", "lowercase") +$ define ctwm_welcome_file "''t':/''welcome_file'" +$ ShowWelcomeSwitch = "" +$ endif +$ vue$suppress_output_popup +$ +$restart: +$ args = "" +$ if ShowWelcomeSwitch .nes. "" then args = " """+ShowWelcomeSwitch+"""" +$ if p1 .nes. "" then args = args + " """+p1+"""" +$ if p2 .nes. "" then args = args + " """+p2+"""" +$ if p3 .nes. "" then args = args + " """+p3+"""" +$ if p4 .nes. "" then args = args + " """+p4+"""" +$ if p5 .nes. "" then args = args + " """+p5+"""" +$ if p6 .nes. "" then args = args + " """+p6+"""" +$ if p7 .nes. "" then args = args + " """+p7+"""" +$ if p8 .nes. "" then args = args + " """+p8+"""" +$ set noon +$ ctwm 'args' +$ if $status .eq. 1 +$ then ! We know this is a restart +$ ShowWelcomeSwitch = "-W" ! the restart does not need a welcome +$ goto restart +$ endif Index: external/mit/ctwm/dist/ctwm.h =================================================================== RCS file: external/mit/ctwm/dist/ctwm.h diff -N external/mit/ctwm/dist/ctwm.h --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/ctwm.h 3 Sep 2015 12:19:43 -0000 @@ -0,0 +1,35 @@ +/* + * [ ctwm ] + * + * Copyright 1992 Claude Lecommandeur. + * + * Permission to use, copy, modify and distribute this software [ctwm] and + * its documentation for any purpose is hereby granted without fee, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting documen- + * tation, and that the name of Claude Lecommandeur not be used in adverti- + * sing or publicity pertaining to distribution of the software without + * specific, written prior permission. Claude Lecommandeur make no represen- + * tations about the suitability of this software for any purpose. It is + * provided "as is" without express or implied warranty. + * + * Claude Lecommandeur DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO + * EVENT SHALL Claude Lecommandeur BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF + * USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR + * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + * + * Author: Claude Lecommandeur [ lecom@sic.epfl.ch ][ April 1992 ] + */ + +Bool CtwmIsRunning (Display *display, int scrnum); +char **CtwmListWorkspaces (Display *display, int scrnum); +char *CtwmCurrentWorkspace (Display *display, int scrnum); +int CtwmChangeWorkspace (Display *display, int scrnum, + char *workspace); +char **CtwmCurrentOccupation (Display *display, Window window); +int CtwmSetOccupation (Display *display, Window window, + char **occupation); +int CtwmAddToCurrentWorkspace (Display *display, Window window); Index: external/mit/ctwm/dist/ctwm.man =================================================================== RCS file: external/mit/ctwm/dist/ctwm.man diff -N external/mit/ctwm/dist/ctwm.man --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/ctwm.man 3 Sep 2015 12:19:45 -0000 @@ -0,0 +1,2548 @@ +.de EX \"Begin example +.ne 5 +.if n .sp 1 +.if t .sp .5 +.nf +.in +.5i +.. +.de EE +.fi +.in -.5i +.if n .sp 1 +.if t .sp .5 +.. +.ta .3i .6i .9i 1.2i 1.5i 1.8i +.TH CTWM 1 "Version 3.7" +.SH NAME +ctwm \- Claude's Tab Window Manager for the X Window System +.SH SYNTAX +\fIctwm \fP[\-display \fIdpy\fP] [\-s] [\-cfgchk] [\-f \fIinitfile\fP] [\-v] [\-n] [\-k] [\-K m4file] [\-w [win\-id]] +.PP +.SH DESCRIPTION +\fIctwm\fP is a window manager for the X Window System. It provides +titlebars, shaped windows, virtual screens (workspaces), +several forms of icon management, user\-defined macro functions, +click\-to\-type and pointer\-driven keyboard focus, and user\-specified +key and pointer button bindings. It is actually +\fItwm\fP(1) (Tab Window Manager) from the MIT X11 distribution +slightly modified to accommodate the use of several virtual screens +(workspaces). It is heavily inspired from the Hewlett\-Packard vuewm +window manager. In addition, \fIctwm\fP can use coloured, shaped icons +and background root pixmaps in XPM format [from Arnaud Le Hors], any +format understood by the imconv package [from the San Diego +Supercomputer Center], and xwd files. \fIctwm\fP can be compiled to +use both, either or none of the above icon/pixmap formats. +.PP +This program is usually started by the user's session manager or +startup script. When used from \fIxdm\fP(1) or \fIxinit\fP(1) without +a session manager, \fIctwm\fP is frequently executed in the foreground +as the last client. When run this way, exiting \fIctwm\fP causes the +session to be terminated (i.e. logged out). +.PP +By default, application windows are surrounded by a \(oqframe\(cq with a +titlebar at the top and a special border around the window. The titlebar +contains the window's name, a rectangle that is lit when the window is +receiving keyboard input, and function boxes known as \(oqtitlebuttons\(cq +at the left and right edges of the titlebar. +.PP +Pressing pointer Button1 (usually the left\-most button unless it has +been changed with \fIxmodmap\fP) on a titlebutton will invoke the +function associated with the button. In the default interface, +windows are iconified by clicking (pressing and then immediately +releasing) the left titlebutton (which looks like a Dot). Conversely, +windows are deiconified by clicking in the associated icon or entry in +the icon manager (see description of the variable +\fBShowIconManager\fP and of the function \fBf.showiconmgr\fP). +.PP +Windows are resized by pressing the right titlebutton (which resembles a +group of nested squares), dragging the pointer over edge that is to be +moved, and releasing the pointer when the outline of the window is the desired +size. Similarly, windows are moved by pressing in the title or highlight +region, dragging a window outline to the new location, and then releasing +when the outline is in the desired position. Just +clicking in the title or highlight region raises the window without moving it. +.PP +When new windows are created, \fIctwm\fP will honor any size and location +information requested by the user (usually through \fI\-geometry\fP +command line argument or resources for the individual applications). +Otherwise, an outline of the window's default size, its titlebar, and lines +dividing the +window into a 3x3 grid that track the pointer are displayed. +Clicking pointer Button1 +will position the window at the current position and give it the default +size. Pressing pointer Button2 (usually the middle pointer button) +and dragging the outline +will give the window its current position but allow the sides to be resized as +described above. Clicking pointer Button3 (usually the right pointer button) +will give the window its current position but attempt to make it long enough +to touch the bottom the screen. +.SH OPTIONS +\fIctwm\fP accepts the following command line options: +.PP +.TP 8 +.B \-display \fIdpy\fP +This option specifies the X server to use. +.TP 8 +.B \-s +This option indicates that only the default screen (as specified by +\fB\-display\fP or by the \fBDISPLAY\fP environment variable) should be +managed. By default, \fIctwm\fP will attempt to manage +all screens on the display. +.TP 8 +.B \-cfgchk +This option causes \fIctwm\fP to only try to parse the config file, and +indicate whether errors are found. +.TP 8 +.B \-f \fIfilename\fP +This option specifies the name of the startup file to use. +\fIctwm\fP will first try to load filename.num, where \fInum\fP is the screen number. +If it fails, it will try to load filename. +By default, \fIctwm\fP will look in the user's home directory for files +named \fI.ctwmrc.num\fP, \fI.ctwmrc\fP, \fI.twmrc.num\fP, or \fI.twmrc\fP (where \fInum\fP is a screen number). +.TP 8 +.B \-v +This option indicates that \fIctwm\fP should print error messages whenever +an unexpected X Error event is received. This can be useful when debugging +applications but can be distracting in regular use. +.TP 8 +.B \-n +This option indicates that \fIctwm\fP should not filter the startup file +through m4. Available only if \fIctwm\fP is compiled with the USEM4 flag. +.TP 8 +.B \-k +This option indicates that \fIctwm\fP should keep the definitions it +prepends to your startup file when filtering through m4 in /tmp. +Available only if \fIctwm\fP is compiled with the USEM4 flag. +.TP 8 +.B \-K \fIm4file\fP +This option indicates that \fIctwm\fP should keep the result of filtering +your startup file through m4 in the named file. +Available only if \fIctwm\fP is compiled with the USEM4 flag. + +.TP 8 +.B \-version +\fIctwm\fP just prints its version number. + +.TP 8 +.B \-info +\fIctwm\fP prints its detailed version and compile time options. + +.TP 8 +.B \-w [win\-id] +If \-w is specified without a win\-id value, \fIctwm\fP does not take over the whole +screen(s), instead it creates a new window that becomes its root window. if the +win\-id value is given, it is considered to be the id of an existing window, in +which case, \fIctwm\fP will try to use this window as root window. You can run any +number of instantiation of \fIctwm\fP at the same time. You can even have +embedded \fIctwm\fP instantiations. This is totally useless, but I like it. The +f.adoptwindow function can be used to capture an existing window belonging to +another \fIctwm\fP. A possible use of such mode can be to test new configuration file +without restarting \fIctwm\fP. +.TP 8 +.B \-W +This option tells \fIctwm\fP not to display any welcome when starting. +.SH CUSTOMIZATION +Much of \fIctwm\fP's appearance and behavior can be controlled by providing +a startup file in one of the following locations (searched in order for +each screen being managed when \fIctwm\fP begins): +.TP 8 +.B "$HOME/.ctwmrc.\fIscreennumber\fP" +The \fIscreennumber\fP is a small positive number (e.g. 0, 1, etc.) +representing the screen number (e.g. the last number in the DISPLAY environment +variable \fIhost:displaynum.screennum\fP) that would be used to contact that +screen of the display. This is intended for displays with multiple screens of +differing visual types. +.TP 8 +.B "$HOME/.ctwmrc" +This is the usual name for an individual user's startup file. +.TP 8 +.B "$HOME/.twmrc.\fIscreennumber\fP" +.TP 8 +.B "$HOME/.twmrc" +The users twm startup file. +.TP 8 +.B "/usr/lib/X11/twm/system.ctwmrc" +If none of the preceding files are found, \fIctwm\fP will look in this +file for a +default configuration. This is often tailored by the site administrator to +provide convenient menus or familiar bindings for novice users. +.PP +If no startup files are found, \fIctwm\fP will use the built\-in defaults +described above. The only resource used by \fIctwm\fP is +\fIbitmapFilePath\fP for a colon\-separated list of directories to search +when looking for bitmap files (for more information, see the \fIAthena +Widgets\fP manual and \fIxrdb\fP(1)). +.PP +\fIctwm\fP startup files are logically broken up into three types of +specifications: \fIVariables\fP, \fIBindings\fP, \fIMenus\fP. The +\fIVariables\fP section must come first and is used to describe the +fonts, colors, cursors, border widths, icon and window placement, highlighting, +autoraising, layout of titles, warping, use of the icon manager. +The \fIBindings\fP section usually comes second and is used to specify +the functions that should be +to be invoked when keyboard and pointer buttons are pressed in +windows, icons, titles, and frames. The \fIMenus\fP section gives any +user\-defined menus (containing functions to be invoked or +commands to be executed). +.PP +Variable names and keywords are case\-insensitive. Strings must be +surrounded by double quote characters (e.g. \(oqblue\(cq) and are +case\-sensitive. A pound sign (#) outside of a string causes the +remainder of the line in which the character appears to be treated as +a comment. +.SH "M4 PREPROCESSING" +\fIctwm\fP uses \fIm4\fP(1) to pre\-process its setup files. +When \fIctwm\fP starts up, it opens a file for input as described above. +But, it processes that file through \fIm4\fP before parsing it. So, you can +use \fIm4\fP macros to perform operations at runtime. This makes it very +easy to work when you use many different displays, with different characteristics. +For example, If you want to set the lower right section of the screen to be your +\fBIconRegion\fP, (see below for details on the \fBIconRegion\fP variable) +you can use \fIm4\fP directives and pre\-defined symbols to calculate the region +you want. For example: +.EX 0 +define(IRegion, translit(eval(WIDTH/3)*eval(HEIGHT/2)+eval(WIDTH\-WIDTH/3)\-0, *, x)) +IconRegion "IRegion" SOUTH EAST 75 25 +.EE +will define the lower half, and right\-hand third of the screen. The above +makes use of symbols that are predefined in \fIm4\fP by \fIctwm\fP. The symbols +WIDTH and HEIGHT are calculated by \fIctwm\fP and written into a temporary +file for \fIm4\fP to use. The following symbols are predefined by +\fIctwm\fP: +.TP 16 +.B "SERVERHOST" +This variable is set to the name of the machine that is running the X +server. +.TP 16 +.B "CLIENTHOST" +The machine that is running the clients. (ie, \fIctwm\fP) +.TP 16 +.B "HOSTNAME" +The canonical hostname running the clients. (ie. a fully\-qualified +version of \fBCLIENTHOST\fP) +.TP 16 +.B "USER" +The name of the user running the program. Gotten from the environment. +.TP 16 +.B "HOME" +The user's home directory. Gotten from the environment. +.TP 16 +.B "PIXMAP_DIRECTORY" +The directory where the \fIctwm\fP pictures are installed. +.TP 16 +.B "VERSION" +The X major protocol version. As seen by ProtocolVersion(3). +.TP 16 +.B "REVISION" +The X minor protocol revision. As seen by ProtocolRevision(3). +.TP 16 +.B "VENDOR" +The vendor of your X server. For example: \fBMIT X Consortium\fP. +.TP 16 +.B "RELEASE" +The release number of your X server. For MIT X11R5, this is \fB5\fP. +.TP 16 +.B "WIDTH" +The width of your display in pixels. +.TP 16 +.B "HEIGHT" +The height of your display in pixels. +.TP 16 +.B "X_RESOLUTION" +The X resolution of your display in pixels per meter. +.TP 16 +.B "Y_RESOLUTION" +The Y resolution of your display in pixels per meter. +.TP 16 +.B "PLANES" +The number of bit planes your display supports in the default root window. +.TP 16 +.B "BITS_PER_RGB" +The number of significant bits in an RGB color. (log base 2 of the number +of distinct colors that can be created. This is often different from the +number of colors that can be displayed at once.) +.TP 16 +.B "TWM_TYPE" +Tells which \fItwm\fP offshoot is running. It will always be set to +the string \(oqctwm\(cq in this program. This is useful for protecting +parts of your \fI.twmrc\fP file that \fIctwm\fP proper won't understand +(like \fBWorkSpaces\fP) so that it is still usable with other +\fItwm\fP programs. +.TP 16 +.B "TWM_VERSION" +Tells which \fIctwm\fP version is running in the form of a floating +point number. +.TP 16 +.B "CLASS" +Your visual class. Will return one of \fBStaticGray\fP, \fBGrayScale\fP, +\fBStaticColor\fP, \fBPseudoColor\fP, \fBTrueColor\fP, \fBDirectColor\fP, +or, if it cannot determine what you have, \fBNonStandard\fP. + +.TP 16 +.B "COLOR" +This will be either \(oqYes\(cq or \(oqNo\(cq. This is just a wrapper around the above +definition. Returns \(oqYes\(cq on \fB*Color\fP, and \(oqNo\(cq on \fBStaticGray\fP +and \fBGrayScale\fP. + +.TP 16 +.B "XPM" +Is defined only if \fIctwm\fP was compiled with XPM. + +.TP 16 +.B "JPEG" +Is defined only if \fIctwm\fP was compiled with JPEG. + +.TP 16 +.B "IMCONV" +Is defined only if \fIctwm\fP was compiled with IMCONV. + +.TP 16 +.B "GNOME" +Is defined only if \fIctwm\fP was compiled with GNOME. + +.TP 16 +.B "SOUNDS" +Is defined only if \fIctwm\fP was compiled with USE_SOUND. + +.TP 16 +.B "TWM_CAPTIVE" +This will be either \(oqYes\(cq or \(oqNo\(cq. \(oqYes\(cq if the current \fIctwm\fP is captive +(flag \-w), \(oqNo\(cq in the other case. + +.TP 16 +.B "TWM_CAPTIVE_NAME" +Defined only if TWM_CAPTIVE is also defined. Contains the name of the captive +\fIctwm\fP (\-name flag); + +.PP +You may well find that if you research the \fIm4\fP(1) manual well, +and understand the power of \fIm4\fP, this will be a \fBvery\fP +useful and powerful tool. But, if you use any of the symbols +which are predefined by \fIm4\fP, you are in severe danger! For example, +the Sun \fIm4\fP predefines shift, so if you use that name in your \fI.ctwmrc\fP, +you are out of luck. +.PP +The availability of the \fIm4\fP preprocessing is subject to the compilation +define USEM4. +.SH VARIABLES +Many of the aspects of \fIctwm\fP's user interface are controlled by variables +that may be set in the user's startup file. Some of the options are +enabled or disabled simply by the presence of a particular keyword. Other +options require keywords, numbers, strings, or lists of all of these. +.PP +Lists are surrounded by braces and are usually separated by +whitespace or a newline. For example: +.EX 0 +\fBAutoRaise\fP { "emacs" "XTerm" "Xmh" } +.EE +or +.EX 0 +\fBAutoRaise\fP +{ + "emacs" + "XTerm" + "Xmh" +} +.EE +When a variable containing a list of strings representing windows is searched +(e.g. to determine whether or not to enable autoraise as shown above), a string +must be an exact, case\-sensitive match to +the window's name (given by the WM_NAME window property), resource name +or class name (both given by the WM_CLASS window property). The preceding +example would enable autoraise on windows named \(oqemacs\(cq as well as any +\fIxterm\fP (since they are of class \(oqXTerm\(cq) or xmh windows +(which are of class \(oqXmh\(cq). +.PP +String arguments that are interpreted as filenames (see the \fBPixmaps\fP, +\fBCursors\fP, and \fBIconDirectory\fP below) will +prepend the user's directory +(specified by the \fBHOME\fP environment variable) if the first character is a +tilde (~). If, instead, the first character is a colon (:), the name is +assumed to refer to one of the internal bitmaps that are used to +create the default titlebars symbols: \fB:xlogo\fP +or \fB:iconify\fP (both refer to the +X used for the iconify button), \fB:resize\fP (the nested squares used by the +resize button), and \fB:question\fP (the question mark used for non\-existent +bitmap files). +.PP +The following variables may be specified at the top of a \fIctwm\fP startup +file. Lists of window name prefix strings are indicated by \fIwin\-list\fP. +Optional arguments are shown in square brackets: +.IP "\fBAlwaysOnTop\fP { \fIwin\-list\fP }" 8 +This variable specifies a list of windows (all windows if the list is defaulted) +that \fIctwm\fP will try its best to maintain on top of others. This doesn't +work in all case. + +.IP "\fBAlwaysShowWindowWhenMovingFromWorkspaceManager\fP" 8 +When \fBReallyMoveInWorkspaceManager\fP is present and the user is moving +a window from the WorkSpaceMap, \fIctwm\fP display the actual window only +if it crosses the current active workspace. If +\fBAlwaysShowWindowWhenMovingFromWorkspaceManager\fP is present, the actual +window is always visible during the move, regardless of whether it crosses +the current workspace or not. The Shift key toggles this behaviour. + +.IP "\fBAlwaysSqueezeToGravity\fP [{ \fIwin\-list\fP }] " 8 +This variable indicates that \fIctwm\fP should obey window gravity +when squeezing a window even when the window has a titlebar. +Normally, \fIctwm\fP will always squeeze a window that has a titlebar +toward the north. +The optional \fIwin\-list\fP may be used to control which windows +this applies on. + +.IP "\fBAnimationSpeed\fP \fIspeed\fP" 8 +The \fIspeed\fP argument is a non\-negative integer. It determines the number of +times a second animations (if any) are updated. If \fIspeed\fP is 0, animations +are freezed. The default value is 0. + + \" kai +.IP "\fBAutoFocusToTransients\fP" 8 +Transient windows get focus automatically when created. Useful with +programs that have keyboard shortcuts that pop up windows. + +.IP "\fBAutoLower\fP { \fIwin\-list\fP }" 8 +This variable specifies a list of windows (all windows if the list is +defaulted) to be automatically lowered whenever the point leaves a +window. This action can be interactively enabled or disabled on +individual windows using the function \fBf.autolower\fP. + +.IP "\fBAutoOccupy\fP" 8 +This variable specifies that clients will automatically change their occupation +when their name or icon name changes. The new occupation will be recalculated +from the Occupy and OccupyAll fields in the \fI.ctwmrc\fP file. + +.IP "\fBAutoRaise\fP { \fIwin\-list\fP }" 8 +This variable specifies a list of windows (all windows if the list is defaulted) +to be automatically raised whenever the pointer has come to rest in a window for +the amount of time specified by the \fBRaiseDelay\fP variable. This action can be +interactively enabled or disabled on individual windows using the function +\fBf.autoraise\fP. + +.IP "\fBAutoRaiseIcons\fP" 8 +Icons are raised when the cursor enters it. Useful with ShrinkIconTitles. + +.IP "\fBAutoRelativeResize\fP" 8 +This variable indicates that dragging out a window size (either when +initially sizing the window with pointer Button2 or when resizing it) +should not wait until the pointer has crossed the window edges. +Instead, moving +the pointer automatically causes the nearest edge or edges to move by the +same amount. This allows the resizing of windows that extend off +the edge of the screen. +If the pointer is +in the center of the window, or if the resize is begun by pressing a +titlebutton, \fIctwm\fP will still wait for the pointer to cross a window +edge (to prevent accidents). This option is +particularly useful for people who like the press\-drag\-release method of +sweeping out window sizes. + +.IP "\fBAutoSqueeze\fP { \fIwin\-list\fP }" 8 +These windows will be auto\-squeezed (see f.squeeze). i.e. automatically +unsqueezed when they get focus, and squeezed when they loose it. Useful for +the workspace manager. Not authorized for icon managers. + +.IP "\fBBeNiceToColormap\fP" 8 +By defaults new colors are allocated for shadows when a 3D look is used, +but when you specify \fBBeNiceToColormap\fP ctwm uses stipling instead of +new colors, the effect is less beautiful, but acceptable. In this case +ClearShadowContrast and DarkShadowContrast have no effects. + +.IP "\fBBorderBottom\fP \fIpixels\fP" 8 +This variable specifies the width in pixels of a forbidden zone at the +bottom of the screen. All constrained window functions (f.movepack, +f.move with DontMoveOff, etc...) will consider this zone as offscreen. +Default is 0. + +.IP "\fBBorderColor\fP \fIstring\fP [{ \fIwincolorlist\fP }]" 8 +This variable specifies the default color of the border to be placed around +all +non\-iconified windows, and may only be given within a \fBColor\fP or +\fBMonochrome\fP list. The optional \fIwincolorlist\fP specifies a list +of window and color name pairs for specifying particular border colors for +different types of windows. For example: +.EX 0 +\fBBorderColor\fP "gray50" +{ + "XTerm" "red" + "xmh" "green" +} +.EE +The default is \(oqblack\(cq. + +.IP "\fBBorderLeft\fP \fIpixels\fP" 8 +This variable specifies the width in pixels of a forbidden zone at the +left of the screen. All constrained window functions (f.movepack, +f.move with DontMoveOff, etc...) will consider this zone as offscreen. +Default is 0. + +.IP "\fBBorderResizeCursors\fP" 8 +This variable specifies that \fIctwm\fP should use resizing cursors when +the pointer is on the window border. To be used preferably when you have +bound a button to f.resize in the frame context. + +.IP "\fBBorderRight\fP \fIpixels\fP" 8 +This variable specifies the width in pixels of a forbidden zone at the +right of the screen. All constrained window functions (f.movepack, +f.move with DontMoveOff, etc...) will consider this zone as offscreen. +Default is 0. + +.IP "\fBBorderShadowDepth\fP \fIpixels\fP" 8 +This variable specifies the depth of the shadow \fIctwm\fP uses for +3D window borders, when UseThreeDBorders is selected. +.IP "\fBBorderTileBackground\fP \fIstring\fP [{ \fIwincolorlist\fP }]" 8 +This variable specifies the default background color in the gray pattern +used in unhighlighted borders (only if \fBNoHighlight\fP hasn't been set), +and may only be given within a \fBColor\fP or \fBMonochrome\fP list. The +optional \fIwincolorlist\fP allows per\-window colors to be specified. +The default is \(oqwhite\(cq. + +.IP "\fBBorderTileForeground\fP \fIstring\fP [{ \fIwincolorlist\fP }]" 8 +This variable specifies the default foreground color in the gray pattern +used in unhighlighted borders (only +if \fBNoHighlight\fP hasn't been set), and may only be given within a +\fBColor\fP or \fBMonochrome\fP list. The optional \fIwincolorlist\fP allows +per\-window colors to be specified. The default is \(oqblack\(cq. + +.IP "\fBBorderTop\fP \fIpixels\fP" 8 +This variable specifies the width in pixels of a forbidden zone at the +top of the screen. All constrained window functions (f.movepack, +f.move with DontMoveOff, etc...) will consider this zone as offscreen. +Default is 0. + +.IP "\fBBorderWidth\fP \fIpixels\fP" 8 +This variable specifies the width in pixels of the border surrounding +all client window frames if \fBClientBorderWidth\fP has not been specified. +This value is also used to set the border size of windows created by \fIctwm\fP +(such as the icon manager). The default is 2. + +.IP "\fBButtonIndent\fP \fIpixels\fP" 8 +This variable specifies the amount by which titlebuttons should be +indented on all sides. Positive values cause the buttons to be smaller than +the window text and highlight area so that they stand out. Setting this +and the \fBTitleButtonBorderWidth\fP variables to 0 makes titlebuttons be as +tall and wide as possible. The default is 1 if \fIUseThreeDTitles\fP is +not set, 0 if it is set. + +.IP "\fBCenterFeedbackWindow\fP" 8 +The moving and resizing information window is centered in the middle of the +screen instead of the top left corner. + +.IP "\fBClearShadowContrast\fP \fIcontrast\fP" 8 +Indicates to \fIctwm\fP how to calculate the clear shadow color for 3D items. +The value is a comprised between 0 and 100. The formula used is : +.EX 0 + clear.{RGB} = (65535 \- color.{RGB}) * (contrast / 100). +.EE +Has no effect if \fBBeNiceToColormap\fP is active. + +.IP "\fBClientBorderWidth\fP" 8 +This variable indicates that border width of a window's frame should be set to +the initial border width of the window, rather than to the value of +\fBBorderWidth\fP. + +.IP "\fBColor\fP { \fIcolors\-list\fP }" 8 +This variable specifies a list of color assignments to be made if the default +display is capable of displaying more than simple black and white. The +\fIcolors\-list\fP is made up of the following color variables and their values: +\fBDefaultBackground\fP, +\fBDefaultForeground\fP, +\fBMenuBackground\fP, +\fBMenuForeground\fP, +\fBMenuTitleBackground\fP, +\fBMenuTitleForeground\fP, and +\fBMenuShadowColor\fP. +The following +color variables may also be given a list of window and color name pairs to +allow per\-window colors to be specified (see \fBBorderColor\fP for details): +\fBBorderColor\fP, +\fBIconManagerHighlight\fP, +\fBBorderTileBackground\fP, +\fBBorderTileForeground\fP, +\fBTitleBackground\fP, +\fBTitleForeground\fP, +\fBIconBackground\fP, +\fBIconForeground\fP, +\fBIconBorderColor\fP, +\fBIconManagerBackground\fP, and +\fBIconManagerForeground\fP. +For example: +.EX 0 +\fBColor\fP +{ + MenuBackground "gray50" + MenuForeground "blue" + BorderColor "red" { "XTerm" "yellow" } + TitleForeground "yellow" + TitleBackground "blue" +} +.EE +All of these color variables may also be specified for the \fBMonochrome\fP +variable, allowing the same initialization file to be used on both color and +monochrome displays. +.IP "\fBConstrainedMoveTime\fP \fImilliseconds\fP" 8 +This variable specifies the length of time between button clicks needed to +begin +a constrained move operation. Double clicking within this amount +of time when invoking \fBf.move\fP will cause the window only be moved +in a horizontal or vertical direction. Setting this value to 0 will disable +constrained moves. The default is 400 milliseconds. +.IP "\fBCursors\fP { \fIcursor\-list\fP }" 8 +This variable specifies the glyphs that \fIctwm\fP should use for various +pointer cursors. Each cursor +may be defined either from the \fBcursor\fP font or from two bitmap files. +Shapes from the \fBcursor\fP font may be specified directly as: +.EX 0 + \fIcursorname\fP "\fIstring\fP" +.EE +where \fIcursorname\fP is one of the cursor names listed below, and +\fIstring\fP is the name of a glyph as found in the file +/usr/include/X11/cursorfont.h (without the \(oqXC_\(cq prefix). +If the cursor is to be defined +from bitmap files, the following syntax is used instead: +.EX 0 + \fIcursorname\fP "\fIimage\fP" "\fImask\fP" +.EE +The \fIimage\fP and \fImask\fP strings specify the names of files containing +the glyph image and mask in \fIbitmap\fP(1) form. +The bitmap files are located in the same manner as icon bitmap files. +The following example shows the default cursor definitions: +.EX 0 +\fBCursors\fP +{ + Frame "top_left_arrow" + Title "top_left_arrow" + Icon "top_left_arrow" + IconMgr "top_left_arrow" + Move "fleur" + Resize "fleur" + Menu "sb_left_arrow" + Button "hand2" + Wait "watch" + Select "dot" + Destroy "pirate" +} +.EE +.IP "\fBDarkShadowContrast\fP \fIcontrast\fP" 8 +Indicates to \fIctwm\fP how to calculate the dark shadow color for 3D items. +The value is a comprised between 0 and 100. The formula used is : +.EX 0 + dark.{RGB} = color.{RGB} * ((100 \- contrast) / 100), +.EE +Has no effect if \fBBeNiceToColormap\fP is active. + +.IP "\fBDecorateTransients\fP" 8 +This variable indicates that transient windows (those containing a +WM_TRANSIENT_FOR property) should have titlebars. By default, transients +are not reparented. + +.IP "\fBDefaultBackground\fP \fIstring\fP" 8 +This variable specifies the background color to be used for sizing and +information windows. The default is \(oqwhite\(cq. + +.IP "\fBDefaultForeground\fP \fIstring\fP" 8 +This variable specifies the foreground color to be used for sizing and +information windows. The default is \(oqblack\(cq. + +.IP "\fBDontIconifyByUnmapping\fP { \fIwin\-list\fP }" 8 +This variable specifies a list of windows that should not be iconified by +simply unmapping the window (as would be the case if \fBIconifyByUnmapping\fP +had been set). This is frequently used to force some windows to be treated +as icons while other windows are handled by the icon manager. + +.IP "\fBDontMoveOff\fP" 8 +This variable indicates that windows should not be allowed to be moved off the +screen. It can be overridden by the \fBf.forcemove\fP function. + +.IP "\fBDontPaintRootWindow\fP" 8 +This variable tells \fIctwm\fP not to paint the root window, whatever you told in +the Workspaces specification. This is useful to have pixmaps in the Workspace +Map but not on the root window. + +.IP "\fBDontSave\fP { \fIwin\-list\fP } " 8 +These windows won't have their characteristics saved for the session manager. + +.IP "\fBDontSetInactive\fP { \fIwin\-list\fP } " 8 +These windows won't be set to InactiveState when they become invisible +due to a change workspace. This has been added because some ill\-behaved +clients (Frame5) don't like this. + +.IP "\fBDontSqueezeTitle\fP [{ \fIwin\-list\fP }] " 8 +This variable indicates that titlebars should not be squeezed to their +minimum size as described under \fBSqueezeTitle\fP below. +If the optional window list is supplied, only those windows will be +prevented from being squeezed. + +.IP "\fBDontToggleWorkSpaceManagerState\fP" 8 +Turns off the feature toggling the workspace manager state to/from map/button +state when you press ctrl and the workspace manager window is in focus. + +.IP "\fBDontWarpCursorInWMap\fP" 8 +Tells ctwm not to warp the cursor to the corresponding actual window +when you click in a small window in the workspace map. + +.IP "\fBForceIcons\fP" 8 +This variable indicates that icon pixmaps specified in the \fBIcons\fP +variable should override any client\-supplied pixmaps. + +.IP "\fBFramePadding\fP \fIpixels\fP" 8 +This variable specifies the distance between the titlebar decorations (the +button and text) and the window frame. The default is 2 pixels if \fIUseThreeDTitles\fP is +not set, 0 if it is set. + +.IP "\fBIconBackground\fP \fIstring\fP [{ \fIwin\-list\fP }]" 8 +This variable specifies the background color of icons, and may +only be specified inside of a \fBColor\fP or \fBMonochrome\fP list. +The optional \fIwin\-list\fP is a list of window names and colors so that +per\-window colors may be specified. See the \fBBorderColor\fP +variable for a complete description of the \fIwin\-list\fP. +The default is \(oqwhite\(cq. + +.IP "\fBIconBorderColor\fP \fIstring\fP [{ \fIwin\-list\fP }]" 8 +This variable specifies the color of the border used for icon windows, and +may only be specified inside of a \fBColor\fP or \fBMonochrome\fP list. +The optional \fIwin\-list\fP is a list of window names and colors so that +per\-window colors may be specified. See the \fBBorderColor\fP +variable for a complete description of the \fIwin\-list\fP. +The default is \(oqblack\(cq. +.IP "\fBIconBorderWidth\fP \fIpixels\fP" 8 +This variable specifies the width in pixels of the border surrounding +icon windows. The default is 2. + +.IP "\fBIconDirectory\fP \fIstring\fP" 8 +This variable specifies the directory that should be searched +if a bitmap file cannot be found in any of the directories +in the \fBbitmapFilePath\fP resource. + +.IP "\fBIconFont\fP \fIstring\fP" 8 +This variable specifies the font to be used to display icon names within +icons. The default is \(oqvariable\(cq. + +.IP "\fBIconForeground\fP \fIstring\fP [{ \fIwin\-list\fP }]" 8 +This variable specifies the foreground color to be used when displaying icons, +and may only be specified inside of a +\fBColor\fP or \fBMonochrome\fP list. +The optional \fIwin\-list\fP is a list of window names and colors so that +per\-window colors may be specified. See the \fBBorderColor\fP +variable for a complete description of the \fIwin\-list\fP. +The default is \(oqblack\(cq. + +.IP "\fBIconifyByUnmapping\fP [{ \fIwin\-list\fP }]" 8 +This variable indicates that windows should be iconified by being unmapped +without trying to map any icons. This assumes that the user is will +remap the window through the icon manager, the \fBf.warpto\fP function, or +the \fITwmWindows\fP menu. +If the optional \fIwin\-list\fP is provided, only those windows will be +iconified by simply unmapping. Windows that have both this and the +\fBIconManagerDontShow\fP options set may not be accessible if no binding +to the \fITwmWindows\fP menu is set in the user's startup file. + +.IP "\fBIconifyStyle\fP \fIstring\fP" 8 +Where string is either \fB"normal"\fP, \fB"mosaic"\fP, \fB"zoomin"\fP, \fB"zoomout"\fP +or \fB"sweep"\fP. Tells \fIctwm\fP to use some fancy graphical effects when iconifying +windows. + +.IP "\fBIconJustification\fP \fIstring\fP" 8 +Where string is either \fB"left"\fP, \fB"center"\fP or \fB"right"\fP. +Tells \fIctwm\fP how to justify the icon image against the icon title (if any). + +.IP "\fBIconManagerBackground\fP \fIstring\fP [{ \fIwin\-list\fP }]" 8 +This variable specifies the background color to use for icon manager entries, +and may only be specified inside of a +\fBColor\fP or \fBMonochrome\fP list. +The optional \fIwin\-list\fP is a list of window names and colors so that +per\-window colors may be specified. See the \fBBorderColor\fP +variable for a complete description of the \fIwin\-list\fP. +The default is \(oqwhite\(cq. + +.IP "\fBIconManagerDontShow\fP [{ \fIwin\-list\fP }]" 8 +This variable indicates that the icon manager should not display any +windows. If the optional \fIwin\-list\fP is given, only those windows will +not be displayed. This variable is used to prevent windows that are rarely +iconified (such as \fIxclock\fP or \fIxload\fP) from taking up space in +the icon manager. + +.IP "\fBIconManagerFont\fP \fIstring\fP" 8 +This variable specifies the font to be used when displaying icon manager +entries. The default is \(oqvariable\(cq. + +.IP "\fBIconManagerForeground\fP \fIstring\fP [{ \fIwin\-list\fP }]" 8 +This variable specifies the foreground color to be used when displaying +icon manager entries, and may only be specified inside of a +\fBColor\fP or \fBMonochrome\fP list. +The optional \fIwin\-list\fP is a list of window names and colors so that +per\-window colors may be specified. See the \fBBorderColor\fP +variable for a complete description of the \fIwin\-list\fP. +The default is \(oqblack\(cq. + +.IP "\fBIconManagerGeometry\fP \fIstring\fP [ \fIcolumns\fP ]" 8 +This variable specifies the geometry of the icon manager window. The +\fIstring\fP argument is standard geometry specification that indicates +the initial full size of the icon manager. The icon manager window is +then broken into \fIcolumns\fP pieces and scaled according to the number +of entries in the icon manager. Extra entries are wrapped to form +additional rows. The default number of columns is 1. + +.IP "\fBIconManagerHighlight\fP \fIstring\fP [{ \fIwin\-list\fP }]" 8 +This variable specifies the border color to be used when highlighting +the icon manager entry that currently has the focus, +and can only be specified inside of a +\fBColor\fP or \fBMonochrome\fP list. +The optional \fIwin\-list\fP is a list of window names and colors so that +per\-window colors may be specified. See the \fBBorderColor\fP +variable for a complete description of the \fIwin\-list\fP. +The default is \(oqblack\(cq. + +.IP "\fBIconManagers\fP { \fIiconmgr\-list\fP }" 8 +This variable specifies a list of icon managers to create. Each item in the +\fIiconmgr\-list\fP has the following format: +.EX 0 + "\fIwinname\fP" ["\fIiconname\fP"] "\fIgeometry\fP" \fIcolumns\fP +.EE +where \fIwinname\fP is the name of the windows that should be put into this +icon manager, \fIiconname\fP is the name of that icon manager window's icon, +\fIgeometry\fP is a standard geometry specification, and \fIcolumns\fP is +the number of columns in this icon manager as described in +\fBIconManagerGeometry\fP. For example: +.EX 0 +\fBIconManagers\fP +{ + "XTerm" "=300x5+800+5" 5 + "myhost" "=400x5+100+5" 2 +} +.EE +Clients whose name or class is \(oqXTerm\(cq will have an entry created +in the \(oqXTerm\(cq icon manager. Clients whose name was \(oqmyhost\(cq would +be put into the \(oqmyhost\(cq icon manager. + +.IP "\fBIconManagerShadowDepth\fP \fIpixels\fP" 8 +This variable specifies the depth of the shadow \fIctwm\fP uses for +3D IconManager entries, when UseThreeDIconManagers is selected. + +.IP "\fBIconManagerShow\fP { \fIwin\-list\fP }" 8 +This variable specifies a list of windows that should appear in the icon +manager. When used in conjunction with the \fBIconManagerDontShow\fP +variable, only the windows in this list will be shown in the icon manager. + +.IP "\fBIconMenuDontShow\fP { \fIwin\-list\fP }" 8 +Don't show the name of these windows in the TwmIcons menu. + +.IP "\fBIconRegion\fP \fIgeomstring\fP \fIvgrav hgrav gridwidth gridheight\fP [\fIiconjust\fP]" 8 +[\fIiconregjust\fP] [\fIiconregalign\fP] [{ \fIwin\-list\fP }] +.IP "" 8 +This variable specifies an area on the root window in which icons are placed +if no specific icon location is provided by the client. The \fIgeomstring\fP +is a quoted string containing a standard geometry specification. If more than +one \fBIconRegion\fP lines are given, icons will be put into the succeeding +icon regions when the first is full. The \fIvgrav\fP argument should be either +\fBNorth\fP or \fBSouth\fP and is used to control whether icons are +first filled in from the top or bottom of the icon region. Similarly, the +\fIhgrav\fP argument should be either \fBEast\fP or \fBWest\fP and is used +to control whether icons should be filled in from left or from the right. Icons +are laid out within the region in a grid with cells \fIgridwidth\fP pixels +wide and \fIgridheight\fP pixels high. The optional win\-list argument tells +\fIctwm\fP that if such a window is iconified, and there is enough room in this +icon region for its icon, then place it here. The optional \fIiconjust\fP, +\fIiconregjust\fP and \fIiconregalign\fP can be used to give specific values +of IconJustification, IconRegionJustification and IconRegionAlignement for +this IconRegion. + +.IP "\fBIconRegionAlignement\fP \fIstring\fP" 8 +Where string is either \fB"top"\fP, \fB"center"\fP \fB"bottom"\fP or \fB"border"\fP. +Tells ctwm how to align icons inside their place in the IconRegion. +If \(oqborder\(cq is given, the justification will be \(oqtop\(cq if +the icon region gravity is \(oqnorth\(cq and \(oqbottom\(cq if the icon region gravity is \(oqsouth\(cq. + +.IP "\fBIconRegionJustification\fP \fIstring\fP" 8 +Where string is either \fB"left"\fP, \fB"center"\fP \fB"right"\fP or \fB"border"\fP. +Tells ctwm how to justify icons inside their place in the IconRegion. +If \(oqborder\(cq is given, the justification will be \(oqleft\(cq if +the icon region gravity is \(oqwest\(cq and \(oqright\(cq if the icon region gravity is \(oqeast\(cq. + +.IP "\fBIcons\fP { \fIwin\-list\fP }" 8 +This variable specifies a list of window names and the bitmap filenames that +should be used as their icons. For example: +.EX 0 +\fBIcons\fP +{ + "XTerm" "xterm.icon" + "xfd" "xfd_icon" +} +.EE +Windows that match \(oqXTerm\(cq and would not be iconified by unmapping, would try +to use the icon bitmap in the file \(oqxterm.icon\(cq.If \fBForceIcons\fP is +specified, this bitmap will be used even if the client has requested its +own icon pixmap. + +.IP "\fBIgnoreCaseInMenuSelection\fP" 8 +Used when moving the pointer inside a menu with the keyboard. When you +type a letter, the pointer goes to the next entry beginning with this +letter. If IgnoreCaseInMenuSelection is present, this selection ignores +the case of this first letter. + +.IP "\fBIgnoreLockModifier\fP" 8 +If present, all bindings (buttons and keys) will ignore the LockMask. Useful if you +often use caps lock, and don't want to define twice all your bindings. + +.IP "\fBIgnoreModifier\fP" 8 +All bindings (buttons and keys) will ignore the modifiers +you specified. It is useful when you use caps locks or +num locks. You don't need IgnoreLockModifier any more with this option. + +.EX 0 +IgnoreModifier { lock m2 } +.EE + +.IP "\fBIgnoreTransient\fP" 8 +List of windows for which to ignore transients. + +.EX 0 +IgnoreTransient { "Wine" } +.EE + +.IP "\fBInterpolateMenuColors\fP" 8 +This variable indicates that menu entry colors should be interpolated between +entry specified colors. In the example below: +.EX 0 +\fBMenu\fP "mymenu" +{ + "Title" ("black":"red") f.title + "entry1" f.nop + "entry2" f.nop + "entry3" ("white":"green") f.nop + "entry4" f.nop + "entry5" ("red":"white") f.nop +} +.EE +the foreground colors for \(oqentry1\(cq and \(oqentry2\(cq will be interpolated +between black and white, and the background colors between red and green. +Similarly, the foreground for \(oqentry4\(cq will be half\-way between white and +red, and the background will be half\-way between green and white. +.IP "\fBMakeTitle\fP { \fIwin\-list\fP }" 8 +This variable specifies a list of windows on which a titlebar should be placed +and is used to request titles on specific windows when \fBNoTitle\fP has been +set. +.IP "\fBMapWindowBackground\fP \fBcolor\fP [{ \fBwin\-list\fP }]" 8 +This variable specifies the background colors to use for small windows in the +workspace map window and may only be specified inside of a Color or Monochrome +list. The optional \fBwin\-list\fP is a list of window names and colors so +that per\-window colors may be specified. If there is neither MapWindowBackground, +nor MapWindowForeground the window title colors are used. +.IP "\fBMapWindowCurrentWorkSpace\fP { \fBborder_color\fP [\fBbackground\fP] [\fBforeground\fP] [\fBbitmap\fP] }" 8 +Specify the appearence of the map window corresponding to the current workspace. +.IP "\fBMapWindowDefaultWorkSpace\fP { \fBborder_color\fP [\fBbackground\fP] [\fBforeground\fP] [\fBbitmap\fP] }" 8 +Specify the appearence of the map window corresponding to the workspaces other +than the current workspace when no root background information has been provided +to \fIctwm\fP in the WorkSpace command. Not used in others cases. +.IP "\fBMapWindowForeground\fP \fBcolor\fP [{ \fBwin\-list\fP }]" 8 +This variable specifies the foreground colors to use for small windows in the +workspace map window and may only be specified inside of a Color or Monochrome +list. The optional \fBwin\-list\fP is a list of window names and colors so +that per\-window colors may be specified. If there is neither MapWindowBackground, +nor MapWindowForeground the window title colors are used. +.IP "\fBMaxIconTitleWidth\fP \fIwidth\fP" 8 +The integer argument tells \fIctwm\fP the maximun width to use for an +icon title. If an icon title is larger than \fIwidth\fP, it is truncated. +.IP "\fBMaxWindowSize\fP \fIstring\fP" 8 +This variable specifies a geometry in which the width and height +give the maximum size for a given window. This is typically used to +restrict windows to the size of the screen. The default is \(oq30000x30000\(cq. +.IP "\fBMenuBackground\fP \fIstring\fP" 8 +This variable specifies the background color used for menus, +and can only be specified inside of a +\fBColor\fP or \fBMonochrome\fP list. The default is \(oqwhite\(cq. +.IP "\fBMenuFont\fP \fIstring\fP" 8 +This variable specifies the font to use when displaying menus. The default +is \(oqvariable\(cq. +.IP "\fBMenuForeground\fP \fIstring\fP" 8 +This variable specifies the foreground color used for menus, +and can only be specified inside of a +\fBColor\fP or \fBMonochrome\fP list. The default is \(oqblack\(cq. +.IP "\fBMenuShadowColor\fP \fIstring\fP" 8 +This variable specifies the color of the shadow behind pull\-down menus +and can only be specified inside of a +\fBColor\fP or \fBMonochrome\fP list. The default is \(oqblack\(cq. +.IP "\fBMenuShadowDepth\fP \fIpixels\fP" 8 +This variable specifies the depth of the shadow \fIctwm\fP uses for +3D menus, when UseThreeDMenus is selected. +.IP "\fBMenuTitleBackground\fP \fIstring\fP" 8 +This variable specifies the background color for \fBf.title\fP entries in +menus, and +can only be specified inside of a +\fBColor\fP or \fBMonochrome\fP list. The default is \(oqwhite\(cq. +.IP "\fBMenuTitleForeground\fP \fIstring\fP" 8 +This variable specifies the foreground color for \fBf.title\fP entries in +menus and +can only be specified inside of a +\fBColor\fP or \fBMonochrome\fP list. The default is \(oqblack\(cq. +.IP "\fBMonochrome\fP { \fIcolors\fP }" 8 +This variable specifies a list of color assignments that should be made if +the screen has a depth of 1. See the description of \fBColor\fP. +.IP "\fBMoveDelta\fP \fIpixels\fP" 8 +This variable specifies the number of pixels the pointer +must move before the \fBf.move\fP function starts working. Also +see the \fBf.deltastop\fP function. The default is zero pixels. +.IP "\fBMovePackResistance\fP \fIpixels\fP" 8 +This variable specifies the number of pixels of the movepack and movepush +resistance. See \fIf.movepack\fP and \fIf.movepush\fP. +.IP "\fBMoveOffResistance\fP \fIpixels\fP" 8 +This variable specifies the number of pixels of the moveoff resistance. +If \fIpixels\fP is positive, \fBDontMoveOff\fP will only prevent +you from going off the edge if you're within n pixels off the edge. If you +go further, \fBDontMoveOff\fP gives up and lets you go as far as you wish. +\fBf.forcemove\fP still allows you to totally ignore \fBDontMoveOff\fP. +A negative value puts you back into \(oqnever moveoff\(cq mode (it's the default). +.IP "\fBNoBackingStore\fP" 8 +This variable indicates that \fIctwm\fP's menus should not request backing +store to minimize repainting of menus. This is typically +used with servers that can repaint faster than they can handle backing store. +.IP "\fBNoBorder\fP { \fIwin\-list\fP }" 8 +These windows won't have borders. If you want no borders on all windows, +use the BorderWidth keyword. +.IP "\fBNoCaseSensitive\fP" 8 +This variable indicates that case should be ignored when sorting icon names +in an icon manager. This option is typically used with applications that +capitalize the first letter of their icon name. +.IP "\fBNoDefaults\fP" 8 +This variable indicates that \fIctwm\fP should not supply the default +titlebuttons and bindings. This option should only be used if the startup +file contains a completely new set of bindings and definitions. +.IP "\fBNoGrabServer\fP" 8 +This variable indicates that \fIctwm\fP should not grab the server +when popping up menus and moving opaque windows. +.IP "\fBNoHighlight\fP [{ \fIwin\-list\fP }]" 8 +This variable indicates that borders should not be highlighted to track the +location of the pointer. If the optional \fIwin\-list\fP is given, highlighting +will only be disabled for those windows. +When the border is highlighted, it will +be drawn in the current \fBBorderColor\fP. When the border is not +highlighted, it will be stippled with an gray pattern using the +current \fBBorderTileForeground\fP and \fBBorderTileBackground\fP colors. +.IP "\fBNoIconTitle\fP [{ \fIwin\-list\fP }]" 8 +This variable indicates that icons should not display the icon name +of the client. If the +optional \fIwin\-list\fP is given, only those clients will not have +icon titles. +.IP "\fBNoIconManagerFocus\fP" 8 +This variable indicates that ctwm will not set the focus on the corresponding +window when the pointer is in an IconManager. +.IP "\fBNoIconManagers\fP" 8 +This variable indicates that no icon manager should be created. +.IP "\fBNoImagesInWorkSpaceManager\fP" 8 +This variable turns off displaying of background images in the WorkSpaceMap. +Instead only the colors defined in \fBWorkSpaces\fP will be used as background +in the WorkSpaceMap. +.IP "\fBNoMenuShadows\fP" 8 +This variable indicates that menus should not have drop shadows drawn behind +them. This is typically used with slower servers since it speeds up menu +drawing at the expense of making the menu slightly harder to read. +.IP "\fBNoOpaqueMove\fP [{ \fIwindow\-list\fP }]" 8 +The counterpart of \fBOpaqueMove\fP. See \fBOpaqueMove\fP. +.IP "\fBNoOpaqueResize\fP [{ \fIwindow\-list\fP }]" 8 +The counterpart of \fBOpaqueResize\fP. See \fBOpaqueResize\fP. +.IP "\fBNoRaiseOnDeiconify\fP" 8 +This variable indicates that windows that are deiconified should not be +raised. +.IP "\fBNoRaiseOnMove\fP" 8 +This variable indicates that windows should not be raised when moved. This +is typically used to allow windows to slide underneath each other. +.IP "\fBNoRaiseOnResize\fP" 8 +This variable indicates that windows should not be raised when resized. This +is typically used to allow windows to be resized underneath each other. +.IP "\fBNoRaiseOnWarp\fP" 8 +This variable indicates that windows should not be raised when the pointer +is warped into them with the \fBf.warpto\fP function. If this option is set, +warping to an occluded window may result in the pointer ending up in the +occluding window instead the desired window (which causes unexpected behavior +with \fBf.warpring\fP). +.IP "\fBNoSaveUnders\fP" 8 +This variable indicates that menus should not request save\-unders to minimize +window repainting following menu selection. It is typically used with displays +that can repaint faster than they can handle save\-unders. +.IP "\fBNoShowOccupyAll\fP" 8 +This variable specifies that OccupyAll windows won't be displayed in the +WorkSpaceMap window. +.IP "\fBNoStackMode\fP [{ \fIwin\-list\fP }]" 8 +This variable indicates that client window requests to change stacking order +should be ignored. If the optional \fIwin\-list\fP is given, only requests on +those windows will be ignored. This is typically used to prevent applications +from relentlessly popping themselves to the front of the window stack. +.IP "\fBNoTitle\fP [{ \fIwin\-list\fP }] " 8 +This variable indicates that windows should not have titlebars. If the +optional \fIwin\-list\fP is given, only those windows will not have titlebars. +\fBMakeTitle\fP may be used with this option to force titlebars to be put +on specific windows. +.IP "\fBNoTitleFocus\fP" 8 +This variable indicates that \fIctwm\fP should not set keyboard input focus to +each window as it is entered. Normally, \fIctwm\fP sets the focus +so that focus and key events from the titlebar and +icon managers are delivered to the application. If the pointer is moved +quickly and \fIctwm\fP is slow to respond, input can be directed to the old +window instead of the new. This option is typically +used to prevent this \(oqinput lag\(cq and to +work around bugs in older applications that have problems with focus events. +.IP "\fBNoTitleHighlight\fP [{ \fIwin\-list\fP }]" 8 +This variable indicates that the highlight area of the titlebar, which is +used to indicate the window that currently has the input focus, should not +be displayed. If the optional \fIwin\-list\fP is given, only those windows +will not have highlight areas. This and the \fBSqueezeTitle\fP options +can be set to substantially reduce the amount of screen space required by +titlebars. +.IP "\fBNoWarpToMenuTitle\fP" 8 +This variable indicates that the cursor should not be warped to the title +of a menu which does not have room to drop down below the current cursor +position. +.IP "\fBOccupy\fP { \fIoccupy\-list\fP }" 8 +This variable specifies which windows occupy which workspaces at startup. +.IP +\fIoccupy\-list\fP consists of entries of the form : +.EX + [Window] win\-name { wpsc1 wspc2 ... } +or Workspace wspc\-name {win1 win2 ... } +.EE +Example : +.EX +Occupy { + "xload" {"all"} + Window "xterm" {"here" "there" "elsewhere"} + "xv" {"images"} + WorkSpace "images" {"xloadimage"} +} +.EE +Note : The Occupy declaration should come after the WorkSpaces declaration. + +.IP "\fBOccupyAll\fP { \fIwindow\-list\fP }" 8 +.IP +This variable specifies a list of windows that will occupy all workspaces at startup. +.IP +\fIwindow\-list\fP is a list of window names. +.IP +Example : +.EX +OccupyAll +{ + "xload" + "xbiff" + "xconsole" +} +.EE +Note : The OccupyAll declaration should come after the WorkSpaces declaration. + +.IP "\fBOpaqueMove\fP [{ \fIwindow\-list\fP }]" 8 +This variable indicates that the \fBf.move\fP function should actually move +the window instead of just an outline so that the user can immediately see +what the window will look like in the new position. This option is typically +used on fast displays (particularly if \fBNoGrabServer\fP is set). The optional +window list parameter indicates that only windows in this list should actually +be moved in opaque mode. The \fBNoOpaqueMove\fP counterpart is also available. + +.IP "\fBOpaqueMoveThreshold\fP \fIthreshold\fP" 8 +The integer parameter is a percentage and indicates that only windows (elligible +for opaque moving) with a surface smaller than this percentage of the surface +of the screen should actually be moved in opaque mode. + +.IP "\fBOpaqueResize\fP [{ \fIwindow\-list\fP }]" 8 +The opaque version of resize. Extremely resource intensive, +but beautiful with fast server/client/network. See \fBOpaqueMove\fP. The +\fBNoOpaqueResize\fP counterpart is also available. + +.IP "\fBOpaqueResizeThreshold\fP \fIthreshold\fP" 8 +The resize version of \fBOpaqueMoveThreshold\fP. + +.IP "\fBOpenWindowTimeout\fP \fIseconds\fP" 8 +seconds is an integer representing a number of second. When a window +tries to open on an unattended display, it will be automatically +mapped after this number of seconds. + +.IP "\fBPackNewWindows\fP" 8 +Use f.movepack algorithm instead of f.move when opening a new window. + +.IP "\fBPixmaps\fP { \fIpixmaps\fP }" 8 +This variable specifies a list of pixmaps that define the appearance of various +images. Each entry is a keyword indicating the pixmap to set, followed by a +string giving the name of the bitmap file. The following pixmaps +may be specified: +.EX 0 +\fBPixmaps\fP +{ + TitleHighlight "gray1" +XCOMM TitleHighlight "supman%.xbm" +} +.EE +The default for \fITitleHighlight\fP is to use an even stipple pattern. + +.IP "\fBPixmapDirectory\fP \fIpath\fP " 8 +This variable specifies the path where \fIctwm\fP looks to find non\-X11 bitmap +files. Whenever you want to use a image file that is not an X11 bitmap, +specify : xpm:filename, for xpm files, xwd:filename for xwd files, +im:filename, for other files supported by the imconv package, jpeg:file +for jpeg file, or \(oq|command\(cq for an on the fly generated xwd file. Use the % character +to specify an animation. \fIpath\fP can be a colon separated list of directories. +Example : +.EX +PixmapDirectory "/usr/lib/X11/twm" +Icons +{ + "Axe" "xpm:edit.xpm" + "xterm" "xpm:ball%.xpm" +} +.EE +N.B This is only valid if your version of \fIctwm\fP has been compiled with the +right extension (XPM, JPEG or IMCONV options). + +.IP "\fBRaiseDelay\fP \fImilliseconds\fP" 8 +For windows that are to be automatically raised when the pointer enters +(see the \fBAutoRaise\fP variable and the \fIf.autoraise\fP function) +this variable specifies the length of time the pointer should rest in +the window before it is raised. The default is 0 milliseconds. + +.IP "\fBRaiseOnClick\fP" 8 +If present a window will be raised on top of others when clicked on, and the +ButtonPress event will be correctly forwarded to the client that owns this window +(if it asked to). See \fBRaiseOnClickButton\fP. + +.IP "\fBRaiseOnClickButton\fP \fIbutton_number\fP" 8 +Where \fIbutton_number\fP is a valid button number (generally 1 to 3). Specify +the button to use for RaiseOnClick. + +.IP "\fBRaiseWhenAutoUnSqueeze\fP" 8 +Windows are raised when auto\-unsqueezed (See AutoSqueeze). + +.IP "\fBRandomPlacement\fP [ \fIstring1\fP [ \fIstring2\fP ]]" 8 +Where \fIstring1\fP is either \(oqon\(cq, \(oqoff\(cq, \(oqall\(cq or +\(oqunmapped\(cq, and string2 is a displacement for the +pseudo\-randomly placed window compared to the previous one. +This variable indicates that windows with no specified geometry should +be placed in a pseudo\-random location instead of having the user drag +out an outline. The argument \(oqon\(cq or \(oqall\(cq tells ctwm do +do this for all such windows, \(oqoff\(cq, not to do this, and +\(oqunmapped\(cq, only for unmapped windows, e.g. iconified or not +visible in the current workspace. +If the second argument isn't given, the displacement +30+30 (30 pixels +left and down) is used. + +.IP "\fBReallyMoveInWorkspaceManager\fP" 8 +This keyword tells \fIctwm\fP to move the actual window when the user is +moving the small windows in the WorkSpaceMap window. If not present the +WorkSpaceMap can be used only to modify the occupation of a window. +Pressing the \fIshift\fP key while dragging a window in the workspace manager +temporarily toggles this option. + +.IP "\fBResizeFont\fP \fIstring\fP" 8 +This variable specifies the font to be used for in the dimensions window when +resizing windows. The default is \(oqfixed\(cq. + +.IP "\fBRestartPreviousState\fP" 8 +This variable indicates that +\fIctwm\fP should attempt to use the WM_STATE property on client windows +to tell which windows should be iconified and which should be left visible. +This is typically used to try to regenerate the state that the screen +was in before the previous window manager was shutdown. + +.IP "\fBReverseCurrentWorkspace\fP \fIstring\fP" 8 +This variable tells \fIctwm\fP to reverse the background and +foreground colors in the small windows in the workspace map for the current +workspace. + +.IP "\fBSaveColor\fP { \fIcolors\-list\fP }" 8 +This variable indicates a list of color assignments to be stored as pixel +values in the root window property _MIT_PRIORITY_COLORS. Clients may elect +to preserve these values when installing their own colormap. Note that +use of this mechanism is a way for an application to avoid the \(oqtechnicolor\(cq +problem, whereby useful screen objects such as window borders and titlebars +disappear when a program's custom colors are installed by the window +manager. +For example: +.EX 0 +\fBSaveColor\fP +{ + BorderColor + TitleBackground + TitleForeground + "red" + "green" + "blue" +} +.EE +This would place on the root window 3 pixel values for borders and titlebars, +as well as the three color strings, all taken from the default colormap. + +.IP "\fBShrinkIconTitles\fP" 8 +A la Motif shrinking of icon titles, and expansion when mouse is inside icon. +The old incorrect spelling \fBSchrinkIconTitles\fP is also still accepted. + +.IP "\fBShortAllWindowsMenus\fP" 8 +Don't show WorkSpaceManager and IconManagers in the TwmWindows and TwmAllWindows menus. + +.IP "\fBShowIconManager\fP" 8 +This variable indicates that the icon manager window should be displayed when +\fIctwm\fP is started. It can always be brought up using the +\fBf.showiconmgr\fP function. + +.IP "\fBShowWorkSpaceManager\fP" 8 +This variable specifies that the WorkSpaceManager should be visible. + +.IP "\fBSloppyFocus\fP" 8 +Use sloppy focus. + +.IP "\fBSaveWorkspaceFocus\fP" 8 +When changing to a workspace, restore the focus to the last window +that had the focus when you left the workspace by warping the mouse +into it. This essentially saves the focus window with the workspace +and restores it automatically when you switch. In many cases, it +avoids having to reach for the mouse after moving to a new workspace. + +.IP "\fBSortIconManager\fP" 8 +This variable indicates that entries in the icon manager should be +sorted alphabetically rather than by simply appending new windows to +the end. + +.IP "\fBSoundHost\fP" 8 +The host on which sounds should be played. See the SOUNDS section. + +.IP "\fBSqueezeTitle\fP [{ \fIsqueeze\-list\fP }] " 8 +This variable indicates that \fIctwm\fP should attempt to use the SHAPE +extension to make titlebars occupy only as much screen space as they need, +rather than extending all the way across the top of the window. +The optional \fIsqueeze\-list\fP +may be used to control the location of the squeezed titlebar along the +top of the window. It contains entries of the form: +.EX 0 + "\fIname\fP" \fIjustification\fP \fInum\fP \fIdenom\fP +.EE +where \fIname\fP is a window name, \fIjustification\fP is either \fBleft\fP, +\fBcenter\fP, or \fBright\fP, and \fInum\fP and \fIdenom\fP +are numbers specifying a ratio giving the relative position about which +the titlebar is justified. The ratio is measured from left to right if +the numerator is positive, and right to left if negative. A denominator +of 0 indicates that the numerator should be interpreted as pixels. +For compatibility, the pixel-position 0/0 is the relative middle of +the window (1/2) for \fBcenter\fP and the relative right side of the +window (2/2) for \fBright\fP, but this use is not recommended. +Use "right 2 2" for relative positioning, or "right -1 0" for absolute; +this makes a difference when dragging the titlebar (see +\fIf.movetitlebar\fP). +For example: + +.EX 0 +\fBSqueezeTitle\fP +{ + "XTerm" left 0 0 + "xterm1" left 1 3 + "xterm2" left 2 3 + "oclock" center 1 2 + "emacs" right 2 2 +} +.EE +The default positioning is left-justified, absolute at 0 pixels. + +The \fBDontSqueezeTitle\fP list can be used to turn off squeezing on +certain titles. + +.IP "\fBStartIconified\fP [{ \fIwin\-list\fP }] " 8 +This variable indicates that client windows should initially be left as +icons until explicitly deiconified by the user. If the optional \fIwin\-list\fP +is given, only those windows will be started iconic. This is useful for +programs that do not support an \fI\-iconic\fP command line option or +resource. + +.IP "\fBStartInMapState\fP" 8 +This variable specifies that the WorkSpaceManager should be started +in its map form when created. + +.IP "\fBStartSqueezed\fP { \fIwin\-list\fP }" 8 +These windows will first show up squeezed (see f.squeeze). + +.IP "\fBStayUpMenus\fP" 8 +Tells ctwm to use stayup menus. These menus +will stay on the screen when ButtonUp, if either the menu has not +yet been entered by the pointer, or the current item is a f.title. + +.IP "\fBSunkFocusWindowTitle\fP" 8 +This variable specifies that the title of the focus window (if exists) +should be sunken instead of raised. Only valid if UseThreeDTitles is set. + +.IP "\fBThreeDBorderWidth\fP \fIpixels\fP" 8 +The width of the 3D border in pixels, if any. + +.IP "\fBTitleBackground\fP \fIstring\fP [{ \fIwin\-list\fP }]" 8 +This variable specifies the background color used in titlebars, +and may only be specified inside of a +\fBColor\fP or \fBMonochrome\fP list. +The optional \fIwin\-list\fP is a list of window names and colors so that +per\-window colors may be specified. +The default is \(oqwhite\(cq. + +.IP "\fBTitleButtonBorderWidth\fP \fIpixels\fP" 8 +This variable specifies the width in pixels of the border surrounding +titlebuttons. This is typically set to 0 to allow titlebuttons to take up as +much space as possible and to not have a border. +The default is 1 if \fIUseThreeDTitles\fP is not set, 0 if it is set. + +.IP "\fBTitleButtonShadowDepth\fP \fIpixels\fP" 8 +This variable specifies the depth of the shadow \fIctwm\fP uses for +3D title buttons, when UseThreeDTitles is selected. + +.IP "\fBTitleFont\fP \fIstring\fP" 8 +This variable specifies the font used for displaying window names in +titlebars. The default is \(oqvariable\(cq. + +.IP "\fBTitleForeground\fP \fIstring\fP [{ \fIwin\-list\fP }]" 8 +This variable specifies the foreground color used in titlebars, and +may only be specified inside of a +\fBColor\fP or \fBMonochrome\fP list. +The optional \fIwin\-list\fP is a list of window names and colors so that +per\-window colors may be specified. +The default is \(oqblack\(cq. + +.IP "\fBTitleJustification\fP \fIstring\fP" 8 +This keyword needs a string value. The acceptable values are : \(oqleft\(cq, +\(oqcenter\(cq and \(oqright\(cq. The window titles will be justified according to +this in the title window. + +.IP "\fBTitlePadding\fP \fIpixels\fP" 8 +This variable specifies the distance between the various buttons, text, and +highlight areas in the titlebar. The default is 8 pixels if \fIUseThreeDTitles\fP +is not set, 0 if it is set. + +.IP "\fBTitleShadowDepth\fP \fIpixels\fP" 8 +This variable specifies the depth of the shadow \fIctwm\fP uses for +3D titles, when UseThreeDTitles is selected. + +.IP "\fBTransientHasOccupation\fP" 8 +This variable specifies that transient\-for and non\-group leader windows +can have their own occupation potentially different from their leader +window. The default case is that these windows follow their leader, use +this keyword if the default action doesn't please you. + +.IP "\fBTransientOnTop\fP \fIpercentage\fP" 8 +The parameter (required) is a percentage and tells \fIctwm\fP to put transient +(and non\-group leader) windows always on top of their leader if and only +if their surface is smaller than this fraction of the surface of their +leader. The surface of a window is its width times its weight. + +.IP "\fBUnknownIcon\fP \fIstring\fP" 8 +This variable specifies the filename of a bitmap file to be +used as the default icon. This bitmap will be used as the icon of all +clients which do not provide an icon bitmap and are not listed +in the \fBIcons\fP list. + +.IP "\fBUnmapByMovingFarAway\fP [{ \fIwin\-list\fP }] " 8 +These windows will be moved out of the screen instead of being unmapped +when they become invisible due to a change workspace. This has been +added because some ill\-behaved clients (Frame5) don't like to be unmapped. + +.IP "\fBUsePPosition\fP \fIstring\fP" 8 +This variable specifies whether or not \fIctwm\fP should honor +program\-requested locations (given by the \fBPPosition\fP flag in the +WM_NORMAL_HINTS property) in the absence of a user\-specified position. +The argument \fIstring\fP may have one of three values: \fB"off"\fP +(the default) indicating that \fIctwm\fP should ignore the program\-supplied +position, \fB"on"\fP indicating that the position should be used, and +\fB"non\-zero"\fP indicating that the position should used if it is other +than (0,0). The latter option is for working around a bug in older toolkits. + +.IP "\fBUseSunkTitlePixmap\fP" 8 +This makes it so the shadows are inversed for title pixmaps when focus is lost. +This is similar to having the SunkFocusWindowTitle, but it makes your xbm or +3d XPM (if any) sink instead of just the whole bar. + +.IP "\fBUseThreeDBorders\fP" 8 +Tells \fIctwm\fP to use 3D\-looking window borders. The width ot the 3D borders +is \fBThreeDBorderWidth\fP. The color of the 3D border is \fBBorderTileBackground\fP, +and if NoHighlight is not selected, the border of the Focus window is +\fBBorderColor\fP. + +.IP "\fBUseThreeDIconManagers\fP" 8 +Tells \fIctwm\fP to use 3D\-looking IconManagers if any. + +.IP "\fBUseThreeDMenus\fP" 8 +Tells \fIctwm\fP to use 3D\-looking menus. + +.IP "\fBUseThreeDTitles\fP" 8 +Tells \fIctwm\fP to use 3D\-looking windows titles. In which case the default +values of \fBTitleButtonBorderWidth\fP, \fBFramePadding\fP, \fBTitlePadding\fP +and \fBButtonIndent\fP are set to 0. +There are plenty of built\-in scalable pixmaps for buttons, :xpm:menu, :xpm:dot, +:xpm:cross, :xpm:bar, :xpm:vbar, :xpm:iconify, :xpm:resize, +:xmp:sunkresize and :xpm:box. There are several built\-in scalable +animations for buttons : %xpm:resize, %xpm:menu\-up, %xpm:menu\-down, +%xpm:resize\-out\-top, %xpm:resize\-in\-top, %xpm:resize\-out\-bot, +%xpm:resize\-in\-bot, %xpm:maze\-out, %xpm:maze\-in, %xpm:zoom\-out, +%xpm:zoom\-in and %xpm:zoom\-inout. Try them to see what they look like. + +.IP "\fBUseThreeDWMap\fP" 8 +Tells \fIctwm\fP to use 3D for the small windows in the workspace map. + +.IP "\fBVirtualScreens\fP { \fIgeometries\-list\fP }" 8 +.IP +This variable specifies a list of geometries for virtual screens. Virtual screens +are designed to be used when you have several physical screens bound together +with the Xinerama X extension. +.IP +\fIgeometries\-list\fP is a list of valid geometry strings, that correspond to +your actual physical screens. +.IP +Example : +.EX +VirtualScreens +{ + "1280x1024+0+0" + "1600x1200+1280+0" +} +.EE + +.IP "\fBWarpCursor\fP [{ \fIwin\-list\fP }]" 8 +This variable indicates that the pointer should be warped into windows when +they are deiconified. If the optional \fIwin\-list\fP is given, the pointer +will only be warped when those windows are deiconified. + +.IP "\fBWindowBox\fP [{ \fIwin\-list\fP }]" 8 +creates a new window called a box, where +all the client windows that match the windows list are opened in, +instead of the root window. This is useful to group small windows +in the same box (xload for instance) +.EX +WindowBox "xloadbox" "320x100+0\-0" { + "xload" +} +.EE + +.IP "\fBWindowGeometries\fP [{ \fIwin\-list\fP }]" 8 +Used to give a default geometry to some clients : +.EX +WindowGeometries { + "Mozilla*" "1000x800+10+10" + "jpilot*" "800x600\-0\-0" +} +.EE + +.IP "\fBWindowRegion\fP \fIgeomstring\fP \fIvgrav\fP fIhgrav\fP [{ \fIwin\-list\fP }]" 8 +Similar to IconRegion, but for windows. + +.IP "\fBWindowRing\fP [{ \fIwin\-list\fP }]" 8 +This variable specifies a list of windows along which the \fBf.warpring\fP +function cycles. If no argument is given, all the windows are in the ring. + +.IP "\fBWarpRingOnScreen\fP" 8 +Tells \fIctwm\fP that f.warpring warps pointer only to windows visible in +the current workspace. + +.IP "\fBWarpToDefaultMenuEntry\fP" 8 +(Useful only with StayUpMenus) When using StayUpMenus, and a menu does +stays up, the pointer is warped to the default entry of the menu. + +.IP "\fBWarpUnmapped\fP" 8 +This variable indicates that that the \fBf.warpto\fP function should deiconify +any iconified windows it encounters. This is typically used to make a key +binding that will pop a particular window (such as \fIxmh\fP), no matter +where it is. The default is for \fBf.warpto\fP to ignore iconified windows. + +.IP "\fBWindowRingExclude\fP [{ \fIwin\-list\fP }]" 8 +All listed windows will be excluded from the WarpRing. + +.IP "\fBWMgrButtonShadowDepth\fP \fIdepth\fP" 8 +Control the depth of the shadow of the workspace manager buttons. + +.IP "\fBWMgrHorizButtonIndent\fP \fInb_pixels\fP" 8 +Specifies the horizontal space, in pixel, between the buttons of the workspace +manager (in button mode). + +.IP "\fBWMgrVertButtonIndent\fP \fInb_pixels\fP" 8 +Specifies the vertical space, in pixel, between the buttons of the workspace +manager (in button mode). + +.IP "\fBWorkSpaceFont\fP \fIstring\fP" 8 +This allows you to specify the font to use for the small windows in the +workspace manager map. (Try \(oq\-adobe\-times\-*\-r\-*\--10\-*\-*\-*\-*\-*\-*\-*\(cq). + +.IP "\fBWorkSpaceManagerGeometry\fP \fIstring\fP [ \fIcolumns\fP ]" 8 +This variable specifies the geometry of the workspace manager window. The +\fIstring\fP argument is standard geometry specification that indicates +the initial full size of the workspace manager. The \fIcolumns\fP argument +indicates the number of columns to use for the workspace manager window. +.EX +\fBWorkSpaceManagerGeometry\fP "360x60+60\-0" 8 +.EE +.IP "\fBWorkSpaces\fP { \fIworkspace\-list\fP }" 8 +This variable specifies a list of workspaces that are created at startup, +Where \fIworkspace\-list\fP is : +.EX +name [{bg\-button [fg\-button] [bg\-root] [fg\-root] [pixmap\-root]}] +.EE +.IP +With : +.RS 8 +.TP 8 +.B "bg\-button:" +background color of the corresponding button in the workspace manager. +.TP 8 +.B "fg\-button:" +foreground color of the corresponding button in the workspace manager. +.TP 8 +.B "bg\-root:" +background color of the corresponding root screen. +.TP 8 +.B "fg\-root:" +foreground color of the corresponding root screen. +.TP 8 +.B "pixmap\-root:" +pixmap to display on the corresponding root screen, either the name of +a bitmap, xpm:xpmfile, xwd:xwdfile, jpeg:jpgfile, im:imfile or |command_that +generate_xwd. +.RE +.IP +Example : +.EX +WorkSpaces +{ + "One" {"#686B9F" "white" "DeepSkyBlue3" "white" "jpeg:shark.jpg"} + "Two" {"#619AAE" "white" "firebrick"} + "Three" {"#727786" "white" "MidnightBlue" "white" "xpm:ball%.xpm"} + "Four" {"#727786" "white" "white" "white" "|(giftoppm | pnmtoxwd) < 2010.gif"} + + "Five" {"#727786" "white" "DeepSkyBlue3" "white" "plaid"} + "Six" {"#619AAE" "white" "DeepSkyBlue3" "white" "xpm:background1"} + "Seven" {"#8C5b7A" "white" "chartreuse4"} + "Eight" {"#686B9F" "white" "MidnightBlue"} +} +.EE +.IP +The WorkSpaces declaration should come before the Occupy or OccupyAll +declarations. The maximum number of workspaces is 32. +.IP +Each workspace also has a label, which is displayed in the +WorkSpaceManager window when it is in button state. +By moving the mouse cursor over a button and typing letters and/or +backspace, you may edit the label. +The name is unaffected. +Functions that look up workspaces by name also look at the label. + +.IP "\fBXMoveGrid\fP \fInumber\fP" 8 +This variable specifies the value to use to constrain window movement. +When moving windows around, the x coordinate will always be a multiple of +this variable. Default is 1. f.forcemove ignores this variable. + +.IP "\fBXorValue\fP \fInumber\fP" 8 +This variable specifies the value to use when drawing window outlines for +moving and resizing. This should be set to a value that will result in a +variety of distinguishable colors when exclusive\-or'ed with the contents of the +user's typical screen. Setting this variable to 1 often gives nice results +if adjacent colors in the default colormap are distinct. By default, +\fIctwm\fP will attempt to cause temporary lines to appear at the opposite +end of the colormap from the graphics. + +.IP "\fBYMoveGrid\fP \fInumber\fP" 8 +This variable specifies the value to use to constrain window movement. +When moving windows around, the y coordinate will always be a multiple of +this variable. Default is 1. f.forcemove ignores this variable. + +.IP "\fBZoom\fP [ \fIcount\fP ]" 8 +This variable indicates that outlines suggesting movement of a window +to and from its iconified state should be displayed whenever a window is +iconified or deiconified. The optional \fIcount\fP argument specifies the +number of outlines to be drawn. The default count is 8. +.PP +The following variables must be set after the fonts have been +assigned, so it is usually best to put them at the end of the variables +or beginning of the bindings sections: + +.IP "\fBChangeWorkspaceFunction\fP \fIfunction\fP" 8 +This variable specifies the function to be executed when the user change +the current workspace (zap). + +.IP "\fBDefaultFunction\fP \fIfunction\fP" 8 +This variable specifies the function to be executed when a key or button +event is received for which no binding is provided. This is typically +bound to \fBf.nop\fP, \fBf.beep\fP, or a menu containing window operations. + +.IP "\fBDeIconifyFunction\fP \fIfunction\fP" 8 +This variable specifies the function to be executed when a window is +deiconified. + +.IP "\fBIconifyFunction\fP \fIfunction\fP" 8 +This variable specifies the function to be executed when a window is +iconified. + +.IP "\fBWindowFunction\fP \fIfunction\fP" 8 +This variable specifies the function to execute when a window is selected +from the \fBTwmWindows\fP menu. If this variable is not set, the window +will be deiconified and raised. +.SH BINDINGS +After the desired variables have been set, functions may be attached to +titlebuttons and key and pointer buttons. Titlebuttons may be added +from the left or right side and appear in the titlebar from left\-to\-right +according to the +order in which they are specified. Key and pointer button +bindings may be given in any order. +.IP "\fBTitle buttons\fP" 4 +.RS 4 +.PP +Titlebuttons specifications must include the name of the pixmap to use in +the button box and the function to be invoked when a pointer button is +pressed within them: +.EX 0 +\fBLeftTitleButton\fP "\fIbitmapname\fP" = \fIfunction\fP +.EE +or +.EX 0 +\fBLeftTitleButton\fP "\fIbitmapname\fP" { + Button\fIi\fP = \fImodlist\fP : \fIfunction\fP + ... + Button\fIj\fP = \fIfunction\fP +} +.EE +or +.EX 0 +\fBRightTitleButton\fP "\fIbitmapname\fP" = \fIfunction\fP +.EE +or +.EX 0 +\fBRightTitleButton\fP "\fIbitmapname\fP" { + Button\fIi\fP = \fImodlist\fP : \fIfunction\fP + ... + Button\fIj\fP = \fIfunction\fP +} +.EE +The \fIbitmapname\fP may refer to one of the built\-in bitmaps +(which are scaled to match \fBTitleFont\fP) by using the appropriate +colon\-prefixed name described above. +.PP +The pointer button specifications come in two forms, with a modifier +list or without. When the specification comes without a modifier +list, it's used for the case when no modifiers are used. In other +words, the following two lines are equivalent: +.EX 0 + Button\fIi\fP = \fIfunction\fP +.EE +.EX 0 + Button\fIi\fP = : \fIfunction\fP +.EE +.RE +.IP "\fBKey and pointer buttons\fP" 4 +.RS 4 +.PP +Key and pointer button specifications must give the modifiers that must +be pressed, over which parts of the screen the pointer must be, and what +function is to be invoked. Keys are given as strings containing the +appropriate +keysym name; buttons are given as the keywords \fBButton1\fP\-\fBButton5\fP: +.EX 0 +"FP1" = \fImodlist\fP : \fIcontext\fP : \fIfunction\fP +\fBButton1\fP = \fImodlist\fP : \fIcontext\fP : \fIfunction\fP +.EE +The \fImodlist\fP is any combination of the modifier names \fBshift\fP, +\fBcontrol\fP, \fBlock\fP, \fBmeta\fP, \fBmod1\fP, \fBmod2\fP, \fBmod3\fP, +\fBmod4\fP, or \fBmod5\fP (which may be abbreviated as +\fBs\fP, \fBc\fP, \fBl\fP, \fBm\fP, \fBm1\fP, \fBm2\fP, \fBm3\fP, \fBm4\fP, +\fBm5\fP, respectively) separated by a vertical bar (\(or). +Similarly, the \fIcontext\fP is any combination of +\fBwindow\fP, +\fBtitle\fP, +\fBicon\fP, +\fBroot\fP, +\fBframe\fP, +\fBworkspace\fP, +\fBiconmgr\fP, their first letters (\fBiconmgr\fP abbreviation is \fBm\fP), +or \fBall\fP, +separated by a vertical bar. The \fIfunction\fP is any of the \fBf.\fP +keywords described below. For example, the default startup +file contains the following bindings: +.EX 0 +Button1 = : root : f.menu "TwmWindows" +Button1 = m : window | icon : f.function "move\-or\-lower" +Button2 = m : window | icon : f.iconify +Button3 = m : window | icon : f.function "move\-or\-raise" +Button1 = : title : f.function "move\-or\-raise" +Button2 = : title : f.raiselower +Button1 = : icon : f.function "move\-or\-iconify" +Button2 = : icon : f.iconify +Button1 = : iconmgr : f.iconify +Button2 = : iconmgr : f.iconify +.EE +A user who wanted to be able to manipulate windows from the keyboard could +use the following bindings: +.EX 0 +"F1" = : all : f.iconify +"F2" = : all : f.raiselower +"F3" = : all : f.warpring "next" +"F4" = : all : f.warpto "xmh" +"F5" = : all : f.warpto "emacs" +"F6" = : all : f.colormap "next" +"F7" = : all : f.colormap "default" +"F20" = : all : f.warptoscreen "next" +"Left" = m : all : f.backiconmgr +"Right" = m | s : all : f.forwiconmgr +"Up" = m : all : f.upiconmgr +"Down" = m | s : all : f.downiconmgr +.EE +\fIctwm\fP provides many more window manipulation primitives than can be +conveniently stored in a titlebar, menu, or set of key bindings. Although +a small set of defaults are supplied (unless the \fBNoDefaults\fP is +specified), most users will want to have their most common operations +bound to key and button strokes. To do this, \fIctwm\fP associates names +with each of the primitives and provides \fIuser\-defined functions\fP for +building higher level primitives and \fImenus\fP for interactively selecting +among groups of functions. +.RE +.IP "\fBFunctions\fP" 4 +.RS 4 +.PP +User\-defined functions contain the name by which they are referenced in +calls to \fBf.function\fP and a list of other functions to execute. For +example: +.EX 0 +Function "move\-or\-lower" { f.move f.deltastop f.lower } +Function "move\-or\-raise" { f.move f.deltastop f.raise } +Function "move\-or\-iconify" { f.move f.deltastop f.iconify } +Function "restore\-colormap" { f.colormap "default" f.lower } +.EE +The function name must be used in \fBf.function\fP exactly as it appears in +the function specification. +.PP +In the descriptions below, if the function is said to operate on the selected +window, but is invoked from a root menu, the cursor will be changed to +the \fBSelect\fP cursor and the next window to receive a button press will +be chosen: +.IP "\fB!\fP \fIstring\fP" 8 +This is an abbreviation for \fBf.exec\fP \fIstring\fP. +.\"OBSOLETE \- use a clipboard client +.\".IP "\fB^\fP \fIstring\fP" 8 +.\"This is an abbreviation for \fBf.cut\fP \fIstring\fP. +.IP "\fBf.addtoworkspace\fP \fIstring\fP" 8 +This function adds the selected window to the workspace whose name is +\fIstring\fP. +.IP "\fBf.adoptwindow\fP" 8 +This function asks for the user to select a window with the mouse, and then +adopt this window if it doesn't belong to the current ctwm. Useful only +with the \-w flag. +.IP "\fBf.altcontext\fP" 8 +Set the alternate context. The next key or button event \fIctwm\fP reveives will +be interpreted using the alternate context. To define bindings in the alternate +context, use the keyword \fBalter\fP in the context field of the binding command. +For example: +.EX 0 +"Return"= m : all : f.altcontext +"n" = : alter : f.nextworkspace +"p" = : alter : f.prevworkspace +.EE + +.IP "\fBf.altkeymap\fP \fInumber\fP" 8 +Set the alternate keymap \fBnumber\fP, where \fBnumber\fP is an integer +between 1 and 5 included. The next key or button event \fIctwm\fP reveives will +be interpreted using this alternate keymap. To define bindings in an alternate +keymap, use the keyword \fBa\fP followed by \fBnumber\fP in the modifier +field of the binding command. For example: +.EX 0 +"Return"= c : all : f.altkeymap "1" +"i" = a1 : window|icon|iconmgr : f.iconify +"z" = a1 : window : f.zoom +"d" = a1 : window|icon : f.delete +"o" = a1 : window|icon : f.occupy +"r" = a1 : window|icon : f.refresh +.EE +When using an alternate keymaps, only the root, window, icon and iconmgr +contexts are allowed. + +.IP "\fBf.autolower\fP" 8 +This function toggles whether or not the selected window is lowered +whenever the pointer leaves it. See the description of the variable +\fBAutoLower\fP. + +.IP "\fBf.autoraise\fP" 8 +This function toggles whether or not the selected window is raised whenever +entered by the pointer. See the description of the variable \fBAutoRaise\fP. + +.IP "\fBf.backmapiconmgr\fI" 8 +This function warps the pointer in the same manner as \fBf.backiconmgr\fP +but only stops at windows that are mapped. + +.IP "\fBf.backiconmgr\fI" 8 +This function warps the pointer to the previous column in the +current icon manager, wrapping back to the previous row if necessary. + +.IP "\fBf.beep\fP" 8 +This function sounds the keyboard bell. + +.IP "\fBf.bottomzoom\fP" 8 +This function is similar to the \fBf.fullzoom\fP function, but +resizes the window to fill only the bottom half of the screen. + +.IP "\fBf.changesize\fP \fIstring\fP" 8 +This function allows you to change the size of the focused window. The +format of the string must be either \fB" <+|\->"\fP +(where \fBborder\fP must be one of \fBTop\fP, \fBBottom\fP, \fBLeft\fP or +\fBRight\fP) or \fB"x"\fP (where the size is the requested +new window size). The height of the window can never be set/changed to less +than the title height + 1 (or 1 if the window has no title) and the width +can never be set/changed to less than 1. + +.EX 0 +"Right" = c|s: all : f.changesize "right +10" +"Left" = c|s: all : f.changesize "right \-10" +"Down" = c|s: all : f.changesize "bottom +10" +"Up" = c|s: all : f.changesize "bottom \-10" + +"F1" = c|s: all : f.changesize "640x480" +"F2" = c|s: all : f.changesize "800x600" +"F3" = c|s: all : f.changesize "1024x768" +.EE + +.IP "\fBf.circledown\fP" 8 +This function lowers the top\-most window that occludes another window. + +.IP "\fBf.circleup\fP" 8 +This function raises the bottom\-most window that is occluded by another window. + +.IP "\fBf.colormap\fP \fIstring\fP" 8 +This function rotates the colormaps (obtained from the WM_COLORMAP_WINDOWS +property on the window) that \fIctwm\fP will display when the pointer +is in this window. The argument \fIstring\fP may have one of the following +values: \fB"next"\fP, \fB"prev"\fP, and \fB"default"\fP. It should be noted +here that in general, the installed colormap is determined by keyboard focus. +A pointer driven keyboard focus will install a private colormap upon entry +of the window owning the colormap. Using the click to type model, private +colormaps will not be installed until the user presses a mouse button on +the target window. +.\"OBSOLETE \- should go away and use a clipboard. +.\".IP "\fBf.cut\fP \fIstring\fP" 8 +.\"This function places the specified \fIstring\fP (followed by a newline +.\"character) into the root window property CUT_BUFFER0. +.\".IP "\fBf.cutfile\fP" 8 +.\"This function reads the file indicated by the contents of the CUT_BUFFER0 +.\"window property and replaces the cut buffer. +.IP "\fBf.deiconify\fP" 8 +This function deiconifies the selected window. If the window is not an icon, +this function does nothing. + +.IP "\fBf.delete\fP" 8 +This function sends the WM_DELETE_WINDOW message to the selected window if +the client application has requested it through the WM_PROTOCOLS window +property. The application is supposed to respond to the message by removing +the indicated window. If the window has not requested +WM_DELETE_WINDOW messages, the keyboard bell will be rung indicating that +the user should choose an alternative method. Note this is very different +from f.destroy. The intent here is to delete a single window, not +necessarily the entire application. + +.IP "\fBf.deleteordestroy\fP" 8 +First tries to delete the window (send it WM_DELETE_WINDOW message), +or kills it, if the client doesn't accept such message. + +.IP "\fBf.deltastop\fP" 8 +This function allows a user\-defined function to be aborted if the pointer has +been moved more than \fIMoveDelta\fP pixels. See the example definition +given for \fBFunction "move\-or\-raise"\fP at the beginning of the section. + +.IP "\fBf.destroy\fP" 8 +This function instructs the X server to close the display connection of the +client that created the selected window. This should only be used as a last +resort for shutting down runaway clients. See also f.delete. + +.IP "\fBf.downiconmgr\fI" 8 +This function warps the pointer to the next row in the current icon manger, +wrapping to the beginning of the next column if necessary. + +.IP "\fBf.downworkspace\fP" 8 +Goto the workspace immediately underneath the current workspace in the workspace +manager. If the current workspace is the bottom one, goto the top one in the +same column. The result depends on the layout of the workspace manager. + +.IP "\fBf.exec\fP \fIstring\fP" 8 +This function passes the argument \fIstring\fP to /bin/sh for execution. +In multiscreen mode, if \fIstring\fP starts a new X client without +giving a display argument, the client will appear on the screen from +which this function was invoked. If the string \(oq$currentworkspace\(cq +is present inside the string argument, it will be substituted with +the current workspace name. + +.\".IP "\fBf.file\fP \fIstring\fP" 8 +.\"This function assumes \fIstring\fP is a file name. This file is read into +.\"the window server's cut buffer. + +.IP "\fBf.fill\fI \fIstring\fP" 8 +Where string is either : \(oqright\(cq, \(oqleft\(cq, \(oqtop\(cq, \(oqbottom\(cq or \(oqvertical\(cq. +The current window is resized in the specified direction until it +reaches an obstacle (either another window, or the screen border). +f.fill \(oqvertical\(cq sets the window status to \(oqzoomed\(cq and toggles, ie +calling it again will reset the previous window size. + +.IP "\fBf.fittocontent\fI" 8 +Can be used only with window boxes. The result is to have the box have the +minimal size that contains all its children windows. + +.IP "\fBf.focus\fP" 8 +This function toggles the keyboard focus of the server to the +selected window, changing the focus rule from pointer\-driven if necessary. +If the selected window already was focused, this function executes an +\fBf.unfocus\fP. + +.IP "\fBf.forcemove\fP" 8 +This function is like \fBf.move\fP except that it ignores the \fBDontMoveOff\fP +variable. + +.IP "\fBf.forwiconmgr\fI" 8 +This function warps the pointer to the next column in the current icon +manager, wrapping to the beginning of the next row if necessary. + +.IP "\fBf.forwmapiconmgr\fI" 8 +This function warps the pointer in the same manner as \fBf.forwiconmgr\fP +but only stops at windows that are mapped. + +.IP "\fBf.fullzoom\fP" 8 +This function resizes the selected window to the full size of the display or +else restores the original size if the window was already zoomed. + +.IP "\fBf.function\fP \fIstring\fP" 8 +This function executes the user\-defined function whose name is specified +by the argument \fIstring\fP. + +.IP "\fBf.gotoworkspace\fP \fIworkspace_name\fP" 8 +This function warps you to the workspace whose name is \fIworkspace_name\fP. + +.IP "\fBf.hbzoom\fP" 8 +This function is a synonym for \fBf.bottomzoom\fP. + +.IP "\fBf.hideiconmgr\fP" 8 +This function unmaps the current icon manager. + +.IP "\fBf.hideworkspacemgr\fP" 8 +Unmap the WorkSpace manager. + +.IP "\fBf.horizoom\fP" 8 +This variable is similar to the \fBf.zoom\fP function except that the +selected window is resized to the full width of the display. + +.IP "\fBf.htzoom\fP" 8 +This function is a synonym for \fBf.topzoom\fP. + +.IP "\fBf.hypermove\fP" 8 +Use this function to \(oqmove\(cq a window between 2 captives ctwm (or between a +captive and the root ctwm). Of course 2 ctwms are completely different +universes. You have to go in hyperspace to achieve this, hence the name. + +.IP "\fBf.hzoom\fP" 8 +This function is a synonym for \fBf.horizoom\fP. + +.IP "\fBf.iconify\fP" 8 +This function iconifies or deiconifies the selected window or icon, +respectively. + +.IP "\fBf.identify\fP" 8 +This function displays a summary of the name and geometry of the +selected window. Clicking the pointer or pressing a key in the window +will dismiss it. + +.IP "\fBf.initsize\fP" 8 +This function resets a window to its initial size given by the +WM_NORMAL_HINTS hints. + +.IP "\fBf.jumpdown\fP \fIstep\fP" 8 +This function is designed to be bound to a key, it moves the current window +(step * {X,Y}MoveGrid) pixels downward. stopping if the window encounters +another window or the screen border (ala f.pack). + +.IP "\fBf.jumpleft\fP \fIstep\fP" 8 +Leftward equivalent of f.jumpdown. + +.IP "\fBf.jumpright\fP \fIstep\fP" 8 +Rightward equivalent of f.jumpdown. + +.IP "\fBf.jumpup\fP \fIstep\fP" 8 +Upward equivalent of f.jumpdown. + +.IP "\fBf.lefticonmgr\fI" 8 +This function similar to \fBf.backiconmgr\fP except that wrapping does not +change rows. + +.IP "\fBf.leftworkspace\fP" 8 +Goto the workspace immediately on the left of the current workspace in the +workspace manager. If the current workspace is the leftest one, goto the +rightest one in the same row. The result depends on the layout of the workspace +manager. + +.IP "\fBf.leftzoom\fP" 8 +This variable is similar to the \fBf.bottomzoom\fP function but causes +the selected window is only resized to the left half of the display. + +.IP "\fBf.lower\fP" 8 +This function lowers the selected window. + +.IP "\fBf.menu\fP \fIstring\fP" 8 +This function invokes the menu specified by the argument \fIstring\fP. +Cascaded menus may be built by nesting calls to \fBf.menu\fP. When a menu +is popped up, you can use the arrow keys to move the cursor around it. \(oqDown\(cq +or space goes down, \(oqUp\(cq goes up, \(oqLeft\(cq pops down the menu, and \(oqRight\(cq +activates the current entry. The first letter of an entry name activates this +entry (the first one if several entries match). If the first letter is ~ then +Meta\-the\-second\-letter activates it, if this first letter is ^ then +Control\-the\-second\-letter activates it, and if this first letter is space, +then the second letter activates it. + +.IP "\fBf.move\fP" 8 +This function drags an outline of the selected window (or the window itself +if the \fBOpaqueMove\fP variable is set) until the invoking pointer button +is released. Double clicking within the number of milliseconds given by +\fBConstrainedMoveTime\fP warps +the pointer to the center of the window and +constrains the move to be either horizontal or vertical depending on which +grid line is crossed. +To abort a move, press another button before releasing the +first button. + +.IP "\fBf.movepack\fP" 8 +This function is like \fBf.move\fP except that it tries to avoid overlapping +of windows. When the moving window begin to overlap with another window, the +move is stopped. If you go too far over the other window (more that +\fIMovePackResistance\fP pixels), the move is resumed and the moving window +can overlap with the other window. Useful to pack windows closely. + +.IP "\fBf.movepush\fP" 8 +This function is like \fBf.move\fP except that it tries to avoid overlapping +of windows. When the moving window begins to overlap with another window, the +other window is pushed. If you go too far over the other window (more that +\fIMovePackResistance\fP pixels), there is no push and the moving window +can overlap with the other window. Only available if \fIOpaqueMove\fP is +active. + +.IP "\fBf.moveresize\fP \fIgeometry\fP" 8 +Takes one string argument which is a geometry with the +standard X geometry syntax (e.g. 200x300+150\-0). Sets the current window +to the specified geometry. The width and height are to be given in pixel, +no base size or resize increment are used. + +.IP "\fBf.movetitlebar\fP" 8 +If applied to a squeezed titlebar (see \fISqueezeTitle\fP) you can drag +it along the top of the window (a feature which was first found in +BeOS). The existing justification type is preserved, as is the +positioning (relative or absolute). This means that a relatively +positioned titlebar will move when the width of a window changes, +whereas an absolutely positioned title will not. + +The default positioning is left-justified, absolute at 0 pixels. +.EX 0 +Button1 = m1 : title : f.movetitlebar +.EE +\fBf.movetitlebar\fP does nothing if the window has no title, the +window is squeezed (see f.squeeze), or the title is not squeezed +(see \fISqueezeTitle\fP). + +.IP "\fBf.movetonextworkspace\fI" 8 +Move the window to the next workspace. + +.IP "\fBf.movetoprevworkspace\fI" 8 +Move the window to the previous workspace. + +.IP "\fBf.movetonextworkspaceandfollow\fI" 8 +Move the window to the next workspace and go to that workspace. + +.IP "\fBf.movetoprevworkspaceandfollow\fI" 8 +Move the window to the previous workspace and go to that workspace. + +.IP "\fBf.nexticonmgr\fI" 8 +This function warps the pointer to the next icon manager containing any windows +on the current or any succeeding screen. + +.IP "\fBf.nextworkspace\fP" 8 +Goto the next workspace in the list, using the order given in the \fI.ctwmrc\fP file. + +.IP "\fBf.nop\fP" 8 +This function does nothing and is typically used with the \fBDefaultFunction\fP +or \fBWindowFunction\fP variables or to introduce blank lines in menus. + +.IP "\fBf.occupy\fP" 8 +This function pops up a window for the user to choose which workspaces a window +belongs to. + +.IP "\fBf.occupyall\fP" 8 +This function makes the specified window occupy all the workspaces. + +.IP "\fBf.pack\fI \fIstring\fP" 8 +Where string is either : \(oqright\(cq, \(oqleft\(cq, \(oqtop\(cq or \(oqbottom\(cq +The current window is moved in the specified direction until it reaches +an obstacle (either another window, or the screen border). The pointer +follows the window. + +.IP "\fBf.previconmgr\fI" 8 +This function warps the pointer to the previous icon manager containing any +windows on the current or preceding screens. + +.IP "\fBf.prevworkspace\fP" 8 +Goto the previous workspace in the list, using the order given in the \fI.ctwmrc\fP file. + +.IP "\fBf.pin\fP" 8 +Valid only in a root menu. Make a menu permanent on the screen. This is a toggle +function, if you select it while the menu is already permanent, it becomes +non\-permanent. + +.IP "\fBf.quit\fP" 8 +This function causes \fIctwm\fP to restore the window's borders and exit. If +\fIctwm\fP is the first client invoked from \fIxdm\fP, this will result in a +server reset. + +.IP "\fBf.raiseicons\fP" 8 +This function raises all the icons in the current workspace. + +.IP "\fBf.raise\fP" 8 +This function raises the selected window. + +.IP "\fBf.raiselower\fP" 8 +This function raises the selected window to the top of the stacking order if +it is occluded by any windows, otherwise the window will be lowered. + +.IP "\fBf.removefromworkspace\fP \fIstring\fP" 8 +This function removes the selected window from the workspace whose name +is \fIstring\fP. + +.IP "\fBf.refresh\fP" 8 +This function causes all windows to be refreshed. + +.IP "\fBf.rereadsounds\fP" 8 +This function causes the \fI.ctwm-sounds\fP file to be re-read. See +the SOUNDS section. + +.IP "\fBf.resize\fP" 8 +This function displays an outline of the selected window. Crossing a border +(or setting \fBAutoRelativeResize\fP) will cause the outline to begin to +rubber band until the invoking button is released. To abort a resize, +press another button before releasing the first button. + +.IP "\fBf.restart\fP" 8 +.IP "\fBf.twmrc\fP" 8 +This function kills and restarts \fIctwm\fP. + +.IP "\fBf.restoregeometry\fP" 8 +Restore the current window geometry to what was saved in the last +call to f.savegeometry. + +.IP "\fBf.righticonmgr\fI" 8 +This function is similar to \fBf.nexticonmgr\fP except that wrapping does +not change rows. + +.IP "\fBf.rightworkspace\fP" 8 +Goto the workspace immediately on the right of the current workspace in the +workspace manager. If the current workspace is the rightest one, goto the +leftest one in the same row. The result depends on the layout of the workspace +manager. + +.IP "\fBf.rightzoom\fP" 8 +This variable is similar to the \fBf.bottomzoom\fP function except that +the selected window is only resized to the right half of the display. + +.IP "\fBf.ring\fP" 8 +Selects a window and adds it to the WarpRing, or removes it if it +was already in the ring. This command makes \fBf.warpring\fP \fI much \fP more +useful, by making its configuration dynamic. + +.IP "\fBf.savegeometry\fP" 8 +The geometry of the current window is saved. The next call to +f.restoregeometry will restore this window to this geometry. + +.IP "\fBf.saveyourself\fP" 8 +This function sends a WM_SAVEYOURSELF message to the selected window if it +has requested the message in its WM_PROTOCOLS window property. Clients that +accept this message are supposed to checkpoint all state associated with the +window and update the WM_COMMAND property as specified in the ICCCM. If +the selected window has not selected for this message, the keyboard bell +will be rung. + +.IP "\fBf.separator\fP" 8 +Valid only in menus. The effect is to add a line separator between the +previous and the following entry. The name selector part in the menu is not +used (but must be present). + +.IP "\fBf.setbuttonsstate\fP" 8 +Set the WorkSpace manager in button state. + +.IP "\fBf.setmapstate\fP" 8 +Set the WorkSpace manager in map state. + +.IP "\fBf.showiconmgr\fP" 8 +This function maps the current icon manager. + +.IP "\fBf.sorticonmgr\fP" 8 +This function sorts the entries in the current icon manager alphabetically. +See the variable \fBSortIconManager\fP. +.\".IP "\fBf.source\fP \fIstring\fP" 8 +.\"This function assumes \fIstring\fP is a file name. The file is read +.\"and parsed as a \fIctwm\fP startup file. +.\"This +.\"function is intended to be used only to re\-build pull\-down menus. None +.\"of the \fIctwm\fP variables are changed. + +.IP "\fBf.showbackground\fP" 8 +This function unmaps all windows in the current workspace. This is a toggle +function, if all windows are unmapped, they are all remapped. Better bind this +function in the root context. + +.IP "\fBf.showworkspacemgr\fP" 8 +Map the WorkSpace manager. + +.IP "\fBf.slowdownanimation\fP" 8 +Decrease \fIAnimationSpeed\fP by 1. + +.IP "\fBf.speedupanimation\fP" 8 +Increase \fIAnimationSpeed\fP by 1. + +.IP "\fBf.squeeze\fP" 8 +f.squeeze squeezes a window to a null vertical size. Works only for windows +with either a title, or a 3D border (in order to have something left on the +screen). If the window is already squeezed, it is unsqueezed. + +.IP "\fBf.startanimation\fP" 8 +Restart freezed animations (if any). + +.IP "\fBf.stopanimation\fP" 8 +Freeze animations (if any). + +.IP "\fBf.title\fP" 8 +This function provides a centered, unselectable item in a menu definition. It +should not be used in any other context. + +.IP "\fBf.toggleoccupation\fP \fIstring\fP" 8 +This function adds the selected window to the workspace whose name +is \fIstring\fP if it doesn't already belongs to it, and removes it +from this workspace if not. + +.IP "\fBf.togglesound\fP" 8 +Toggle sound on/off. See the SOUNDS section. + +.IP "\fBf.togglestate\fP" 8 +Toggle the state of the WorkSpace manager. + +.IP "\fBf.toggleworkspacemgr\fP" 8 +Toggle the presence of the WorkSpaceManager. If +it is mapped, it will be unmapped and vice versa. + +.IP "\fBf.topzoom\fP" 8 +This variable is similar to the \fBf.bottomzoom\fP function except that +the selected window is only resized to the top half of the display. + +.\".IP "\fBf.ctwmrc\fP" 8 +.\"This function causes the startup customization file to be re\-read. This +.\"function is exactly like the \fBf.source\fP function without having to +.\"specify the filename. + +.IP "\fBf.unfocus\fP" 8 +This function resets the focus back to pointer\-driven. This should be used +when a focused window is no longer desired. + +.IP "\fBf.upiconmgr\fI" 8 +This function warps the pointer to the previous row in the current icon +manager, wrapping to the last row in the same column if necessary. + +.IP "\fBf.upworkspace\fP" 8 +Goto the workspace immediately above the current workspace in the workspace +manager. If the current workspace is the top one, goto the bottom one in the +same column. The result depends on the layout of the workspace manager. + +.IP "\fBf.vanish\fP" 8 +The specified window vanishes from the current workspace if it occupies at least +one other WorkSpace. Do nothing in the others cases. +.\".IP "\fBf.version\fI" 8 +.\"This function causes the \fIctwm\fP version window to be displayed. This +.\"window will be displayed until a pointer button is pressed or the +.\"pointer is moved from one window to another. +.IP "\fBf.vlzoom\fP" 8 +This function is a synonym for \fBf.leftzoom\fP. + +.IP "\fBf.vrzoom\fP" 8 +This function is a synonym for \fBf.rightzoom\fP. + +.IP "\fBf.warphere\fP \fIwin_name\fP" 8 +This function adds the window which has a name or class that matches string +to the current workspace and warps the pointer to it. If the window is iconified, +it will be deiconified if the variable WarpUnmapped is set or else ignored. + +.IP "\fBf.warpring\fP \fIstring\fP" 8 +This function warps the pointer to the next or previous window (as indicated +by the argument \fIstring\fP, which may be \fB"next"\fP or \fB"prev"\fP) +specified in the \fBWindowRing\fP variable. + +.IP "\fBf.warpto\fP \fIstring\fP" 8 +This function warps the pointer to the window which has a name or class +that matches \fIstring\fP. If the window is iconified, it will be deiconified +if the variable \fBWarpUnmapped\fP is set or else ignored. + +.IP "\fBf.warptoiconmgr\fP \fIstring\fP" 8 +This function warps the pointer to the icon manager entry +associated with the window containing the pointer in the icon manager +specified by the argument \fIstring\fP. If \fIstring\fP is empty (i.e. ""), +the current icon manager is chosen. + +.IP "\fBf.warptoscreen\fP \fIstring\fP" 8 +This function warps the pointer to the screen specified by the +argument \fIstring\fP. \fIString\fP may be a number (e.g. \fB"0"\fP or +\fB"1"\fP), the word \fB"next"\fP (indicating the current screen plus 1, +skipping over any unmanaged screens), +the word \fB"back"\fP (indicating the current screen minus 1, skipping over +any unmanaged screens), or the word +\fB"prev"\fP (indicating the last screen visited. +.IP "\fBf.winrefresh\fP" 8 +This function is similar to the \fBf.refresh\fP function except that only the +selected window is refreshed. +.IP "\fBf.zoom\fP" 8 +This function is similar to the \fBf.fullzoom\fP function, except that +the only the height of the selected window is changed. +.SH MENUS +Functions may be grouped and interactively selected using pop\-up +(when bound to a pointer button) or pull\-down (when associated +with a titlebutton) menus. Each menu specification contains the name of the +menu as it will be referred to by \fBf.menu\fP, optional default +foreground and background colors, the list of item names and the functions +they should invoke, and optional foreground and background colors for +individual items: +.EX 0 +\fBMenu\fP "\fImenuname\fP" [ ("\fIdeffore\fP":"\fIdefback\fP") ] +{ + \fIstring1\fP [ ("\fIfore1\fP":"\fIbackn\fP")] \fIfunction1\fP + \fIstring2\fP [ ("\fIfore2\fP":"\fIbackn\fP")] \fIfunction2\fP + . + . + . + \fIstringN\fP [ ("\fIforeN\fP":"\fIbackN\fP")] \fIfunctionN\fP +} +.EE +.PP +The \fImenuname\fP is case\-sensitive. +The optional \fIdeffore\fP and \fIdefback\fP arguments specify the foreground +and background colors used on a color display +to highlight menu entries. +The \fIstring\fP portion +of each menu entry will be the text which will appear in the menu. +The optional \fIfore\fP and \fIback\fP arguments specify the foreground +and background colors of the menu entry when the pointer is not in +the entry. These colors will only be used on a color display. The +default is to use the colors specified by the +\fBMenuForeground\fP and \fBMenuBackground\fP variables. +The \fIfunction\fP portion of the menu entry is one of the functions, +including any user\-defined functions, or additional menus. +.PP +There are 3 special menus. \fBTwmWindows\fP contains the names of +all of the client and \fIctwm\fP\-supplied windows in the current workspace. +Selecting an entry will cause the \fBWindowFunction\fP to be executed on that +window. If \fBWindowFunction\fP hasn't been set, the window will be deiconified +and raised. \fBTwmWorkspaces\fP contains the names of your workspaces, selecting +an entry goto this workspace. In addition, these entries have submenus containing +the names of all windows occupying this workspace, selecting such an entry +executes f.warpto on this window. And finally, \fBTwmAllWindows\fP contains the names +of all the windows \fIctwm\fP manages. Selecting an entry executes f.warpto on +this window. +.PP +If an entry name begins with a \(oq*\(cq (star), this star won't be displayed and +the corresponding entry will be the default entry for this menu. When a menu +has a default entry and is used as a submenu of another menu, this default entry +action will be executed automatically when this submenu is selected without being +displayed. It's hard to explain, but easy to understand. +.RE +.SH ICONS +\fIctwm\fP supports several different ways of manipulating iconified windows. +The common pixmap\-and\-text style may be laid out by hand or automatically +arranged as described by the \fBIconRegion\fP variable. In addition, a +terse grid of icon names, called an icon manager, provides a more efficient +use of screen space as well as the ability to navigate among windows from +the keyboard. +.PP +An icon manager is a window that contains names of selected or all +windows currently on the display. In addition to the window name, +a small button using the default iconify symbol will be displayed to the +left of the name when the window is iconified. By default, clicking on an +entry in the icon manager performs \fBf.iconify\fP. +To change the actions taken in the icon manager, use the +the \fBiconmgr\fP context when specifying button and keyboard bindings. +.PP +Moving the pointer into the icon manager also directs keyboard focus to +the indicated window (setting the focus explicitly or else sending synthetic +events \fBNoTitleFocus\fP is set). +Using the \fBf.upiconmgr\fP, \fBf.downiconmgr\fP +\fBf.lefticonmgr\fP, and +\fBf.righticonmgr\fP functions, +the input focus can be changed between windows directly from the +keyboard. +.SH SOUNDS +If compiled with the USE_SOUND flag, \fIctwm\fP is able to play sounds +for any X event. \fIctwm\fP will look for the file \fI.ctwm-sounds\fP +in the user's home directory to map every X event to a sound file to +be played. +.PP +Each line in \fI.ctwm-sounds\fP has the following syntax: +.EX +{X event}: {sound file} +.EE +The currently known X events that can be given are: +.EX +KeyPress +KeyRelease +ButtonPress +ButtonRelease +MotionNotify +EnterNotify +LeaveNotify +FocusIn +FocusOut +KeymapNotify +Expose +GraphicsExpose +NoExpose +VisibilityNotify +CreateNotify +DestroyNotify +UnmapNotify +MapNotify +MapRequest +ReparentNotify +ConfigureNotify +ConfigureRequest +GravityNotify +ResizeRequest +CirculateNotify +CirculateRequest +PropertyNotify +SelectionClear +SelectionRequest +SelectionNotify +ColormapNotify +ClientMessage +MappingNotify +.EE +Additionally, the following two are recognised, and represent the time +when \fIctwm\fP is started or shut down: +.EX +Startup +Shutdown +.EE +.SH BUGS +The resource manager should have been used instead of all of the window +lists. +.PP +Double clicking very fast to get the constrained move function will sometimes +cause the window to move, even though the pointer is not moved. +.PP +If \fBIconifyByUnmapping\fP is on and windows are listed in +\fBIconManagerDontShow\fP but not in \fBDontIconifyByUnmapping\fP, +they may be lost if they are iconified and no bindings to +\fBf.menu "TwmWindows"\fP or \fBf.warpto\fP are setup. +.SH FILES +.nf +$HOME/.ctwmrc. +$HOME/.ctwmrc +/usr/lib/X11/twm/system.ctwmrc +$HOME/.twmrc +.fi +.SH "ENVIRONMENT VARIABLES" +.IP "DISPLAY" 8 +This variable is used to determine which X server to use. It is also set +during \fBf.exec\fP so that programs come up on the proper screen. +.IP "HOME" 8 +This variable is used as the prefix for files that begin with a tilde and +for locating the \fIctwm\fP startup file. +.SH "SEE ALSO" +X(1), Xserver(1), xdm(1), xrdb(1) +.SH COPYRIGHT +Portions copyright 1988 Evans & Sutherland Computer Corporation; portions +copyright 1989 Hewlett\-Packard Company and the Massachusetts Institute of +Technology, See \fIX(1)\fP for a full statement of rights and permissions. +.SH AUTHORS +Tom LaStrange, Solbourne Computer; Jim Fulton, MIT X Consortium; +Steve Pitschke, Stardent Computer; Keith Packard, MIT X Consortium; +Dave Sternlicht, MIT X Consortium; Dave Payne, Apple Computer; +Claude Lecommandeur, Swiss Polytechnical Institute of Lausanne (lecom@sic.epfl.ch); +Richard Levitte (richard@levitte.org). Index: external/mit/ctwm/dist/ctwm.spec =================================================================== RCS file: external/mit/ctwm/dist/ctwm.spec diff -N external/mit/ctwm/dist/ctwm.spec --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/ctwm.spec 3 Sep 2015 12:19:45 -0000 @@ -0,0 +1,82 @@ +Summary: Ctwm is a window manager for the X Window System. +Name: ctwm +Version: 3.8.1 +Release: 1 +Source: http://www.ctwm.org/dist/%{name}-%{version}.tar.gz +Copyright: MIT +Group: User Interface/X +BuildRoot: /var/tmp/%{name}-%{version}-buildroot +URL: http://www.ctwm.org/ + +BuildRequires: xorg-x11-devel +Requires: m4 + +%description +Ctwm is a window manager for the X Window System. It provides +titlebars, shaped windows, virtual screens (workspaces), several forms +of icon management, user-defined macro functions, click-to-type and +pointer-driven keyboard focus, and user-specified key and pointer +button bindings. It is actually twm (Tab Window Manager) from the MIT +X11 distribution slightly modified to accommodate the use of several +virtual screens (workspaces). It is heavily inspired from the +Hewlett-Packard vuewm window manager. In addition, ctwm can use +coloured, shaped icons and background root pixmaps in XPM and JPG format, +as well as any format understood by the imconv package [from the +San Diego Supercomputer Center] and xwd files. Ctwm can be compiled +to use both, either or none of the above icon/pixmap formats. + +%prep + +%setup -q -n %{name}-%{version} + +%build +cp Imakefile.local-template Imakefile.local +xmkmf +make + +%install +rm -fr $RPM_BUILD_ROOT + +# Call the man page something a little more Unixly. +mkdir -p $RPM_BUILD_ROOT/usr/X11R6/man/man1 + +# RedHat-ish OSes have the configuration file in /etc/X11/ctwm, +# possibly with a symlink /usr/X11R6/lib/X11/ctwm pointing at it. +make install \ + DESTDIR=$RPM_BUILD_ROOT \ + PIXMAPDIR=/usr/X11R6/include/X11/pixmaps \ + CONFDIR=/etc/X11/ctwm +%{__mkdir_p} $RPM_BUILD_ROOT/usr/X11R6/lib/X11 +%{__ln_s} ../../../../etc/X11/ctwm $RPM_BUILD_ROOT/usr/X11R6/lib/X11/ctwm + +# Install the manual page separately. +install -c -m 0644 ctwm.man $RPM_BUILD_ROOT/usr/X11R6/man/man1/ctwm.1x + +%clean +rm -fr $RPM_BUILD_ROOT + +%files +%defattr(0644,root,root,0755) +%doc README CHANGES PROBLEMS README.gnome TODO.gnome +%doc *.ctwmrc +%doc sound.doc vms.txt vms2.txt + +%attr(0755,root,root) /usr/X11R6/bin/ctwm +%attr(0644,root,root) /usr/X11R6/man/man1/ctwm.1x.gz + +/usr/X11R6/lib/X11/ctwm +%config %attr(0644,root,root) /etc/X11/ctwm/system.ctwmrc +%attr(0644,root,root) /usr/X11R6/include/X11/pixmaps/* + +%changelog +* Thu Jan 5 2012 Richard Levitte +- Release ctwm 3.8.1. +* Fri Feb 16 2006 Richard Levitte +- Release ctwm 3.8a. +* Wed May 4 2005 Rudolph T Maceyko +- Tweaks. Added all .ctwmrc files as well as sound and VMS docs. +* Wed May 4 2005 Richard Levitte +- Changed some directory specifications to RedHat-ish standards. +* Tue May 3 2005 Richard Levitte +- Received the original from Johan Vromans. Adjusted it to become + an official .spec file. Index: external/mit/ctwm/dist/ctwm.txt =================================================================== RCS file: external/mit/ctwm/dist/ctwm.txt diff -N external/mit/ctwm/dist/ctwm.txt --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/ctwm.txt 3 Sep 2015 12:19:47 -0000 @@ -0,0 +1,2768 @@ + + + +CTWM(1) USER COMMANDS CTWM(1) + +*********************** +VMS specific: + This is an edited version of the man page. + Compilation note: this window manager has been compiled to run on VMS. + Hence file and directory specifications should be in that format. + peterc@a3.ph.man.ac.uk 21/7/93 & 15/2/95 +*********************** + + +NAME + ctwm - Tab Window Manager for the X Window System + +SYNTAX + ctwm [-display dpy] [-s] [-f initfile] [-v] [-n] [-k] [-w + [win-id]] + +DESCRIPTION + Ctwm is a window manager for the X Window System. It pro- + vides titlebars, shaped windows, virtual screens + (workspaces), several forms of icon management, user-defined + macro functions, click-to-type and pointer-driven keyboard + focus, and user-specified key and pointer button bindings. + It is actually twm (Tab Window Manager) from the MIT X11 + distribution slightly modified to accommodate the use of + several virtual screens (workspaces). It is heavily inspired + from the Hewlett-Packard vuewm window manager. In addition, + ctwm can use coloured, shaped icons and background root pix- + maps in XPM format [from Arnaud Le Hors],any format under- + stood by the imconv package [from the San Diego Supercom- + puter Center] and xwd files. Ctwm can be compiled to use + both, either or none of the above icon/pixmap formats. + + This program is usually started by the user's session + manager or startup script. When used from xdm(1) or + xinit(1) without a session manager, ctwm is frequently exe- + cuted in the foreground as the last client. When run this + way, exiting ctwm causes the session to be terminated (i.e. + logged out). + + By default, application windows are surrounded by a + ``frame'' with a titlebar at the top and a special border + around the window. The titlebar contains the window's name, + a rectangle that is lit when the window is receiving key- + board input, and function boxes known as ``titlebuttons'' at + the left and right edges of the titlebar. + + Pressing pointer Button1 (usually the left-most button + unless it has been changed with xmodmap) on a titlebutton + will invoke the function associated with the button. In the + default interface, windows are iconified by clicking (press- + ing and then immediately releasing) the left titlebutton + (which looks like a Dot). Conversely, windows are deiconi- + fied by clicking in the associated icon or entry in the icon + manager (see description of the variable ShowIconManager and + of the function f.showiconmgr). + + Windows are resized by pressing the right titlebutton (which + resembles a group of nested squares), dragging the pointer + over edge that is to be moved, and releasing the pointer + when the outline of the window is the desired size. Simi- + larly, windows are moved by pressing in the title or + highlight region, dragging a window outline to the new loca- + tion, and then releasing when the outline is in the desired + position. Just clicking in the title or highlight region + raises the window without moving it. + + When new windows are created, ctwm will honor any size and + location information requested by the user (usually through + -geometry command line argument or resources for the indivi- + dual applications). Otherwise, an outline of the window's + default size, its titlebar, and lines dividing the window + into a 3x3 grid that track the pointer are displayed. + Clicking pointer Button1 will position the window at the + current position and give it the default size. Pressing + pointer Button2 (usually the middle pointer button) and + dragging the outline will give the window its current posi- + tion but allow the sides to be resized as described above. + Clicking pointer Button3 (usually the right pointer button) + will give the window its current position but attempt to + make it long enough to touch the bottom the screen. + +OPTIONS + Ctwm accepts the following command line options: + + -display dpy + This option specifies the X server to use. + + -s This option indicates that only the default screen + (as specified by -display or by the DISPLAY environ- + ment variable) should be managed. By default, ctwm + will attempt to manage all screens on the display. + +*********************** +VMS specific: + filename.num -> filename_num + and see note below for .ctwmrc +*********************** + + -f filename + This option specifies the name of the startup file + to use. Ctwm will first try to load filename.num, + where num is the screen number. If it fails, it + will try to load filename. By default, ctwm will + look in the user's home directory for files named + .ctwmrc.num (where num is a screen number) or + .ctwmrc. + + -v This option indicates that ctwm should print error + messages whenever an unexpected X Error event is + received. This can be useful when debugging appli- + cations but can be distracting in regular use. + + -n This option indicates that ctwm should not filter + the startup file through m4. Available only if ctwm + is compiled with the USEM4 flag. + + -k This option indicates that ctwm should keep the + result of filtering your startup file through m4 in + /tmp. Available only if ctwm is compiled with the + USEM4 flag. + + + -version + ctwm just prints its version number. + + + -info ctwm prints its detailed version and compile time + options. + + + -w [win-id] + If -w is specified without a win-id value, ctwm does + not take over the whole screen(s), instead it + creates a new window that becomes its root window. + if the win-id value is given, it is considered to be + the id of an existing window, in which case, ctwm + will try to use this window as root window. You can + run any number of instantiation of ctwm at the same + time. You can even have embedded ctwm instantia- + tions. This is totally useless, but I like. The + f.adoptwindow function can be used to capture an + existing window belonging to another ctwm. A possi- + ble use of such mode can be to test new configura- + tion file without restarting ctwm. + + -W This option tells ctwm not to display any welcome + when starting. + + +CUSTOMIZATION + Much of ctwm's appearance and behavior can be controlled by + providing a startup file in one of the following locations + (searched in order for each screen being managed when ctwm + begins): + +*********************** +VMS specific: + Instead of $HOME/.[c]twmrc[.#] use DECW$USER_DEFAULTS:[C]TWM.RC[_#] + -- where the logical DECW$USER_DEFAULTS usually points to + SYS$LOGINROOT:[DECW$DEFAULTS], eg mphv2$user2:[bloggs.decw$defaults]. + and /usr/lib/X11/twm/system.ctwmrc => DECW$SYSTEM_DEFAULTS:SYSTEM.CTWMRC +*********************** + + $HOME/.ctwmrc.screennumber + The screennumber is a small positive number (e.g. 0, + 1, etc.) representing the screen number (e.g. the + last number in the DISPLAY environment variable + host:displaynum.screennum) that would be used to + contact that screen of the display. This is + intended for displays with multiple screens of + differing visual types. + + $HOME/.ctwmrc + This is the usual name for an individual user's + startup file. + + $HOME/.twmrc + The users twm startup file. + + /usr/lib/X11/twm/system.ctwmrc + If none of the preceding files are found, ctwm will + look in this file for a default configuration. This + is often tailored by the site administrator to pro- + vide convenient menus or familiar bindings for + novice users. + + If no startup files are found, ctwm will use the built-in + defaults described above. The only resource used by ctwm is + bitmapFilePath for a colon-separated list of directories to + search when looking for bitmap files (for more information, + see the Athena Widgets manual and xrdb(1)). + + Ctwm startup files are logically broken up into three types + of specifications: Variables, Bindings, Menus. The Vari- + ables section must come first and is used to describe the + fonts, colors, cursors, border widths, icon and window + placement, highlighting, autoraising, layout of titles, + warping, use of the icon manager. The Bindings section usu- + ally comes second and is used to specify the functions that + should be to be invoked when keyboard and pointer buttons + are pressed in windows, icons, titles, and frames. The + Menus section gives any user-defined menus (containing func- + tions to be invoked or commands to be executed). + + Variable names and keywords are case-insensitive. Strings + must be surrounded by double quote characters (e.g. "blue") + and are case-sensitive. A pound sign (#) outside of a + string causes the remainder of the line in which the charac- + ter appears to be treated as a comment. + +*********************** +VMS specific: + M4 processing is not supported on VMS. +*********************** + +M4 PREPROCESSING + ctwm uses m4(1) to pre-process its setup files. When ctwm + starts up, it opens a file for input as described above. + But, it processes that file through m4 before parsing it. + So, you can use m4 macro's to perform operations at runtime. + This makes it very easy to work when you use many different + display's, with different characteristics. For example, If + you want to set the lower right section of the screen to be + your IconRegion, (see below for details on the IconRegion + variable) you can use m4 directives and pre-defined symbols + to calculate the region you want. For example: + + define(IRegion, translit(eval(WIDTH/3)*eval(HEIGHT/2)+eval(WIDTH-WIDTH/3)-0, *, x)) + IconRegion "IRegion" SOUTH EAST 75 25 + + will define the lower half, and right-hand third of the + screen. The above makes use of symbols that are predefined + in m4 by ctwm. The symbols WIDTH and HEIGHT are calculated + by ctwm and written into a temporary file for m4 to use. + The following symbols are predefined by ctwm: + + SERVERHOST This variable is set to the name of + the machine that is running the X + server. + + CLIENTHOST The machine that is running the + clients. (ie, ctwm) + + HOSTNAME The canonical hostname running the + clients. (ie. a fully-qualified + version of CLIENTHOST) + + USER The name of the user running the + program. Gotten from the environ- + ment. + + HOME The user's home directory. Gotten + from the environment. + + VERSION The X major protocol version. As + seen by ProtocolVersion(3). + + REVISION The X minor protocol revision. As + seen by ProtocolRevision(3). + + VENDOR The vendor of your X server. For + example: MIT X Consortium. + + RELEASE The release number of your X server. + For MIT X11R5, this is 5. + + WIDTH The width of your display in pixels. + + HEIGHT The height of your display in pix- + els. + + X_RESOLUTION The X resolution of your display in + pixels per meter. + + Y_RESOLUTION The Y resolution of your display in + pixels per meter. + + PLANES The number of bit planes your + display supports in the default root + window. + + BITS_PER_RGB The number of significant bits in an + RGB color. (log base 2 of the + number of distinct colors that can + be created. This is often different + from the number of colors that can + be displayed at once.) + + TWM_TYPE Tells which twm offshoot is running. + It will always be set to the string + "ctwm" in this program. This is + useful for protecting parts of your + .twmrc file that ctwm proper won't + understand (like WorkSpaces) so that + it is still usable with other twm + programs. + + TWM_VERSION Tells which ctwm version is running + in the form of a floating point + number. + + CLASS Your visual class. Will return one + of StaticGray, GrayScale, Sta- + ticColor, PseudoColor, TrueColor, + DirectColor, or, if it cannot deter- + mine what you have, NonStandard. + + COLOR This will be either 'Yes' or 'No'. + This is just a wrapper around the + above definition. Returns 'Yes' on + *Color, and 'No' on StaticGray and + GrayScale. + + XPM Is defined only if ctwm was compiled + with XPM. + + TWM_CAPTIVE This will be either 'Yes' or 'No'. + 'Yes' if the current ctwm is captive + (flag -w), 'No' in the other case. + + You may well find that if you research the m4(1) manual + well, and understand the power of m4, this will be a very + useful and powerful tool. But, if you use any of the sym- + bols which are predefined by m4, you are in severe danger! + For example, the Sun m4 predefines shift, so if you use that + name in your .ctwmrc, you are out of luck. + + The availability of the m4 preprocessing is subject to the + compilation define USEM4. + +VARIABLES + Many of the aspects of ctwm's user interface are controlled + by variables that may be set in the user's startup file. + Some of the options are enabled or disabled simply by the + presence of a particular keyword. Other options require + keywords, numbers, strings, or lists of all of these. + + Lists are surrounded by braces and are usually separated by + whitespace or a newline. For example: + + AutoRaise { "emacs" "XTerm" "Xmh" } + + or + + AutoRaise + { + "emacs" + "XTerm" + "Xmh" + } + + When a variable containing a list of strings representing + windows is searched (e.g. to determine whether or not to + enable autoraise as shown above), a string must be an exact, + case-sensitive match to the window's name name (given by the + WM_NAME window property), resource name or class name (both + given by the WM_CLASS window property). The preceding exam- + ple would enable autoraise on windows named ``emacs'' as + well as any xterm (since they are of class ``XTerm'') or xmh + windows (which are of class ``Xmh''). + +*********************** +VMS specific: + The tilde (~) is taken as indicating that the file "~foo.bar" + is looked for in HOME or SYS$LOGIN, e.g. SYS$LOGIN = DISK$USERS:[BLOGGS] + implies "~foo.bar" will be DISK$USERS:[BLOGGS]FOO.BAR. + Also a leading slash (/) implies an absolute filename, + e.g. "/disk$users:[joe]foo.bar" means DISK$USERS:[JOE]FOO.BAR. +*********************** + + String arguments that are interpreted as filenames (see the + Pixmaps, Cursors, and IconDirectory below) will prepend the + user's directory (specified by the HOME environment vari- + able) if the first character is a tilde (~). If, instead, + the first character is a colon (:), the name is assumed to + refer to one of the internal bitmaps that are used to create + the default titlebars symbols: :xlogo or :iconify (both + refer to the X used for the iconify button), :resize (the + nested squares used by the resize button), and :question + (the question mark used for non-existent bitmap files). + + The following variables may be specified at the top of a + ctwm startup file. Lists of Window name prefix strings are + indicated by win-list. Optional arguments are shown in + square brackets: + + AlwaysOnTop { win-list } + This variable specifies a list of windows (all win- + dows if the list is defaulted) that ctwm will try + its best to maintain on top of others. This doesn't + work in all case. + + + AlwaysShowWindowWhenMovingFromWorkspaceManager + When ReallyMoveInWorkspaceManager is present and the + user is moving a window from the WorkSpaceMap, ctwm + display the actual window only if it crosses the + current active workspace. If AlwaysShowWindowWhenMo- + vingFromWorkspaceManager is present, the actual win- + dow is always visible during the move, regardless of + whether it crosses the current workspace or not. The + Shift key toggles this behaviour. + + + AnimationSpeed speed + The speed argument is a non-negative integer. It + determines the number of times a second animations + (if any) are updated. If speed is 0, animations are + freezed. The default value is 0. + + + AutoFocusToTransients + Transient windows get focus automatically when + created. Useful with programs that have keyboard + shortcuts that pop up windows. + + + AutoOccupy + This variable specifies that clients will automati- + cally change their occupation when their name or + icon name changes. The new occupation will be recal- + culated from the Occupy and OccupyAll fields in the + .ctwmrc file. + + + AutoRaise { win-list } + This variable specifies a list of windows (all win- + dows if the list is defaulted) to be automatically + raised whenever the pointer has come to rest in a + window for the amount of time specified by the + RaiseDelay variable. This action can be interac- + tively enabled or disabled on individual windows + using the function f.autoraise. + + + AutoRaiseIcons + Icons are raised when the cursor enters it. Useful + with SchrinkIconTitles. + + + AutoRelativeResize + This variable indicates that dragging out a window + size (either when initially sizing the window with + pointer Button2 or when resizing it) should not wait + until the pointer has crossed the window edges. + Instead, moving the pointer automatically causes the + nearest edge or edges to move by the same amount. + This allows the resizing of windows that extend off + the edge of the screen. If the pointer is in the + center of the window, or if the resize is begun by + pressing a titlebutton, ctwm will still wait for the + pointer to cross a window edge (to prevent + accidents). This option is particularly useful for + people who like the press-drag-release method of + sweeping out window sizes. + + + AutoSqueeze { win-list } + These windows will be auto-squeezed (see f.squeeze). + i.e. automatically unsqueezed when they get focus, + and squeezed when they loose it. Useful for the + workspace manager. Not authorized for icon managers. + + + BeNiceToColormap + By defaults new colors are allocated for shadows + when a 3D look is used, but when you specify BeNi- + ceToColormap ctwm uses stipling instead of new + colors, the effect is less beautiful, but accept- + able. In this case ClearShadowContrast and DarkSha- + dowContrast have no effects. + + + BorderColor string [{ wincolorlist }] + This variable specifies the default color of the + border to be placed around all non-iconified win- + dows, and may only be given within a Color or Mono- + chrome list. The optional wincolorlist specifies a + list of window and color name pairs for specifying + particular border colors for different types of win- + dows. For example: + + BorderColor "gray50" + { + "XTerm" "red" + "xmh" "green" + } + + The default is "black". + + + BorderResizeCursors + This variable specifies that ctwm should use resiz- + ing cursors when the pointer is on the window + border. To be used preferably when you have bound a + button to f.resize in the frame context. + + + BorderShadowDepth pixels + This variable specifies the depth of the shadow ctwm + uses for 3D window borders, when UseThreeDBorders is + selected. + + BorderTileBackground string [{ wincolorlist }] + This variable specifies the default background color + in the gray pattern used in unhighlighted borders + (only if NoHighlight hasn't been set), and may only + be given within a Color or Monochrome list. The + optional wincolorlist allows per-window colors to be + specified. The default is "white". + + BorderTileForeground string [{ wincolorlist }] + This variable specifies the default foreground color + in the gray pattern used in unhighlighted borders + (only if NoHighlight hasn't been set), and may only + be given within a Color or Monochrome list. The + optional wincolorlist allows per-window colors to be + specified. The default is "black". + + + BorderWidth pixels + This variable specifies the width in pixels of the + border surrounding all client window frames if + ClientBorderWidth has not been specified. This + value is also used to set the border size of windows + created by ctwm (such as the icon manager). The + default is 2. + + ButtonIndent pixels + This variable specifies the amount by which + titlebuttons should be indented on all sides. Posi- + tive values cause the buttons to be smaller than the + window text and highlight area so that they stand + out. Setting this and the TitleButtonBorderWidth + variables to 0 makes titlebuttons be as tall and + wide as possible. The default is 1 if UseThreeDTi- + tles is not set, 0 if it is set. + + + CenterFeedbackWindow + The moving and resizing information window is cen- + tered in the middle of the screen instead of the top + left corner. + + + ClearShadowContrast contrast + Indicates to ctwm how to calculate the clear shadow + color for 3D items. The value is a comprised + between 0 and 100. The formula used is : + + clear.{RGB} = (65535 - color.{RGB}) * (contrast / 100). + + Has no effect if BeNiceToColormap is active. + + + ClientBorderWidth + This variable indicates that border width of a + window's frame should be set to the initial border + width of the window, rather than to the value of + BorderWidth. + + + Color { colors-list } + This variable specifies a list of color assignments + to be made if the default display is capable of + displaying more than simple black and white. The + colors-list is made up of the following color vari- + ables and their values: DefaultBackground, Default- + Foreground, MenuBackground, MenuForeground, Menu- + TitleBackground, MenuTitleForeground, and MenuSha- + dowColor. The following color variables may also be + given a list of window and color name pairs to allow + per-window colors to be specified (see BorderColor + for details): BorderColor, IconManagerHighlight, + BorderTileBackground, BorderTileForeground, + TitleBackground, TitleForeground, IconBackground, + IconForeground, IconBorderColor, IconManagerBack- + ground, and IconManagerForeground. For example: + + Color + { + MenuBackground "gray50" + MenuForeground "blue" + BorderColor "red" { "XTerm" "yellow" } + TitleForeground "yellow" + TitleBackground "blue" + } + + All of these color variables may also be specified + for the Monochrome variable, allowing the same ini- + tialization file to be used on both color and mono- + chrome displays. + + ConstrainedMoveTime milliseconds + This variable specifies the length of time between + button clicks needed to begin a constrained move + operation. Double clicking within this amount of + time when invoking f.move will cause the window only + be moved in a horizontal or vertical direction. + Setting this value to 0 will disable constrained + moves. The default is 400 milliseconds. + + Cursors { cursor-list } + This variable specifies the glyphs that ctwm should + use for various pointer cursors. Each cursor may be + defined either from the cursor font or from two bit- + map files. Shapes from the cursor font may be + specified directly as: + + cursorname "string" + + where cursorname is one of the cursor names listed + below, and string is the name of a glyph as found in + the file /usr/include/X11/cursorfont.h (without the + ``XC_'' prefix). If the cursor is to be defined + from bitmap files, the following syntax is used + instead: + + cursorname "image" "mask" + + The image and mask strings specify the names of + files containing the glyph image and mask in bit- + map(1) form. The bitmap files are located in the + same manner as icon bitmap files. The following + example shows the default cursor definitions: + + Cursors + { + Frame "top_left_arrow" + Title "top_left_arrow" + Icon "top_left_arrow" + IconMgr "top_left_arrow" + Move "fleur" + Resize "fleur" + Menu "sb_left_arrow" + Button "hand2" + Wait "watch" + Select "dot" + Destroy "pirate" + } + + + DarkShadowContrast contrast + Indicates to ctwm hos to calculate the dark sha- + dow color for 3D items. The value is a comprised + between 0 and 100. The formula used is : + + dark.{RGB} = color.{RGB} * ((100 - contrast) / 100), + + Has no effect if BeNiceToColormap is active. + + + DecorateTransients + This variable indicates that transient windows + (those containing a WM_TRANSIENT_FOR property) + should have titlebars. By default, transients are + not reparented. + + + DefaultBackground string + This variable specifies the background color to be + used for sizing and information windows. The + default is "white". + + + DefaultForeground string + This variable specifies the foreground color to be + used for sizing and information windows. The + default is "black". + + + DontIconifyByUnmapping { win-list } + This variable specifies a list of windows that + should not be iconified by simply unmapping the win- + dow (as would be the case if IconifyByUnmapping had + been set). This is frequently used to force some + windows to be treated as icons while other windows + are handled by the icon manager. + + + DontMoveOff + This variable indicates that windows should not be + allowed to be moved off the screen. It can be over- + ridden by the f.forcemove function. + + + DontPaintRootWindow + This variable tells ctwm not to paint the root win- + dow, whatever you told in the Workspaces specifica- + tion. This is useful to have pixmaps in the + Workspace Map but not on the root window. + + + DontSetInactive { win-list } + These windows won't be set to InactiveState when + they become invisible due to a change workspace. + This has been added because some ill-behaved clients + (Frame5) don't like this. + + + DontSqueezeTitle [{ win-list }] + This variable indicates that titlebars should not be + squeezed to their minimum size as described under + SqueezeTitle below. If the optional window list is + supplied, only those windows will be prevented from + being squeezed. + + + DontWarpCursorInWMap + Tells ctwm not to warp the cursor to the correspond- + ing actual window when you click in a small window + in the workspace map. + + + ForceIcons + This variable indicates that icon pixmaps specified + in the Icons variable should override any client- + supplied pixmaps. + + + FramePadding pixels + This variable specifies the distance between the + titlebar decorations (the button and text) and the + window frame. The default is 2 pixels if + UseThreeDTitles is not set, 0 if it is set. + + + IconBackground string [{ win-list }] + This variable specifies the background color of + icons, and may only be specified inside of a Color + or Monochrome list. The optional win-list is a list + of window names and colors so that per-window colors + may be specified. See the BorderColor variable for + a complete description of the win-list. The default + is "white". + + + IconBorderColor string [{ win-list }] + This variable specifies the color of the border used + for icon windows, and may only be specified inside + of a Color or Monochrome list. The optional win- + list is a list of window names and colors so that + per-window colors may be specified. See the Border- + Color variable for a complete description of the + win-list. The default is "black". + + IconBorderWidth pixels + This variable specifies the width in pixels of the + border surrounding icon windows. The default is 2. + + IconDirectory string + This variable specifies the directory that should be + searched if if a bitmap file cannot be found in any + of the directories in the bitmapFilePath resource. + + IconFont string + This variable specifies the font to be used to + display icon names within icons. The default is + "variable". + + IconForeground string [{ win-list }] + This variable specifies the foreground color to be + used when displaying icons, and may only be speci- + fied inside of a Color or Monochrome list. The + optional win-list is a list of window names and + colors so that per-window colors may be specified. + See the BorderColor variable for a complete descrip- + tion of the win-list. The default is "black". + + IconifyByUnmapping [{ win-list }] + This variable indicates that windows should be icon- + ified by being unmapped without trying to map any + icons. This assumes that the user is will remap the + window through the icon manager, the f.warpto func- + tion, or the TwmWindows menu. If the optional win- + list is provided, only those windows will be iconi- + fied by simply unmapping. Windows that have both + this and the IconManagerDontShow options set may not + be accessible if no binding to the TwmWindows menu + is set in the user's startup file. + + IconJustification string + Where string is either "left", "center" or "right". + Tells ctwm how to justify the icon image against the + icon title (if any). + + IconManagerBackground string [{ win-list }] + This variable specifies the background color to use + for icon manager entries, and may only be specified + inside of a Color or Monochrome list. The optional + win-list is a list of window names and colors so + that per-window colors may be specified. See the + BorderColor variable for a complete description of + the win-list. The default is "white". + + IconManagerDontShow [{ win-list }] + This variable indicates that the icon manager should + not display any windows. If the optional win-list + is given, only those windows will not be displayed. + This variable is used to prevent windows that are + rarely iconified (such as xclock or xload) from tak- + ing up space in the icon manager. + + IconManagerFont string + This variable specifies the font to be used when + displaying icon manager entries. The default is + "variable". + + IconManagerForeground string [{ win-list }] + This variable specifies the foreground color to be + used when displaying icon manager entries, and may + only be specified inside of a Color or Monochrome + list. The optional win-list is a list of window + names and colors so that per-window colors may be + specified. See the BorderColor variable for a com- + plete description of the win-list. The default is + "black". + + IconManagerGeometry string [ columns ] + This variable specifies the geometry of the icon + manager window. The string argument is standard + geometry specification that indicates the initial + full size of the icon manager. The icon manager + window is then broken into columns pieces and scaled + according to the number of entries in the icon + manager. Extra entries are wrapped to form addi- + tional rows. The default number of columns is 1. + + IconManagerHighlight string [{ win-list }] + This variable specifies the border color to be used + when highlighting the icon manager entry that + currently has the focus, and can only be specified + inside of a Color or Monochrome list. The optional + win-list is a list of window names and colors so + that per-window colors may be specified. See the + BorderColor variable for a complete description of + the win-list. The default is "black". + + IconManagers { iconmgr-list } + This variable specifies a list of icon managers to + create. Each item in the iconmgr-list has the fol- + lowing format: + + "winname" ["iconname"] "geometry" columns + + where winname is the name of the windows that should + be put into this icon manager, iconname is the name + of that icon manager window's icon, geometry is a + standard geometry specification, and columns is the + number of columns in this icon manager as described + in IconManagerGeometry. For example: + + IconManagers + { + "XTerm" "=300x5+800+5" 5 + "myhost" "=400x5+100+5" 2 + } + + Clients whose name or class is ``XTerm'' will have + an entry created in the ``XTerm'' icon manager. + Clients whose name was ``myhost'' would be put into + the ``myhost'' icon manager. + + + IconManagerShadowDepth pixels + This variable specifies the depth of the shadow ctwm + uses for 3D IconManager entries, when UseThreeDIcon- + Managers is selected. + + + IconManagerShow { win-list } + This variable specifies a list of windows that + should appear in the icon manager. When used in + conjunction with the IconManagerDontShow variable, + only the windows in this list will be shown in the + icon manager. + + + IconRegion geomstring vgrav hgrav gridwidth gridheight [iconjust] + [iconregjust] [iconregalign] [{ win-list }] + + This variable specifies an area on the root window + in which icons are placed if no specific icon loca- + tion is provided by the client. The geomstring is a + quoted string containing a standard geometry specif- + ication. If more than one IconRegion lines are + given, icons will be put into the succeeding icon + regions when the first is full. The vgrav argument + should be either North or South and control and is + used to control whether icons are first filled in + from the top or bottom of the icon region. Simi- + larly, the hgrav argument should be either East or + West and is used to control whether icons should be + filled in from left from the right. Icons are laid + out within the region in a grid with cells gridwidth + pixels wide and gridheight pixels high. The + optional win-list argument tells ctwm that if such a + window is iconified, and there is enough room in + this icon region for its icon, then place it here. + The optionnal iconjust, iconregjust and iconregalign + can be used to give specific values of IconJustifi- + cation, IconRegionJustification and IconRe- + gionAlignement for this IconRegion. + + + IconRegionAlignement string + Where string is either "top", "center" "bottom" or + "border". Tells ctwm how to align icons inside + their place in the IconRegion. This keyword needs a + string value. The acceptable values are : "top", + "center", "bottom" and "border". If "border" is + given, the justification will be "top" if the icon + region gravity is "north" and "bottom" if the icon + region gravity is "south". + + + IconRegionJustification string + Where string is either "left", "center" "right" or + "border". Tells ctwm how to justify icons inside + their place in the IconRegion. This keyword needs a + string value. The acceptable values are : "left", + "center", "right" and "border". If "border" is + given, the justification will be "left" if the icon + region gravity is "west" and "right" if the icon + region gravity is "east". + + + Icons { win-list } + This variable specifies a list of window names and + the bitmap filenames that should be used as their + icons. For example: + + Icons + { + "XTerm" "xterm.icon" + "xfd" "xfd_icon" + } + + Windows that match ``XTerm'' and would not be iconi- + fied by unmapping, and would try to use the icon + bitmap in the file ``xterm.icon''. If ForceIcons id + specified, this bitmap will be used even if the + client has requested its own icon pixmap. + + + IgnoreLockModifier + If present, all bindings (buttons and keys) will + ignore the LockMask. Useful if you often use caps + lock, and don't want to define twice all your + bindings. + + + InterpolateMenuColors + This variable indicates that menu entry colors + should be interpolated between entry specified + colors. In the example below: + + Menu "mymenu" + { + "Title" ("black":"red") f.title + "entry1" f.nop + "entry2" f.nop + "entry3" ("white":"green") f.nop + "entry4" f.nop + "entry5" ("red":"white") f.nop + } + + the foreground colors for ``entry1'' and ``entry2'' + will be interpolated between black and white, and + the background colors between red and green. Simi- + larly, the foreground for ``entry4'' will be half- + way between white and red, and the background will + be half-way between green and white. + + MakeTitle { win-list } + This variable specifies a list of windows on which a + titlebar should be placed and is used to request + titles on specific windows when NoTitle has been + set. + + MapWindowBackground color [{ win-list }] + This variable specifies the background colors to use + for small windows in the workspace map window and + may only be specified inside of a Color or Mono- + chrome list. The optional win-list is a list of win- + dow names and colors so that per-window colors may + be specified. If there is neither MapWindowBack- + ground, nor MapWindowForeground the window title + colors are used. + + MapWindowCurrentWorkSpace { border_color [background] [fore- + ground] [bitmap] } + Specify the appearence of the map window correspond- + ing to the current workspace. + + MapWindowDefaultWorkSpace { border_color [background] [fore- + ground] [bitmap] } + Specify the appearence of the map window correspond- + ing to the workspaces other than the current + workspace when no root background information has + been provided to ctwm in the WorkSpace command. Not + used in others cases. + + MapWindowForeground color [{ win-list }] + This variable specifies the foreground colors to use + for small windows in the workspace map window and + may only be specified inside of a Color or Mono- + chrome list. The optional win-list is a list of win- + dow names and colors so that per-window colors may + be specified. If there is neither MapWindowBack- + ground, nor MapWindowForeground the window title + colors are used. + + MaxIconTitleWidth width + The integer argument tells ctwm the maximun width to + use for an icon title. If an icon title is larger + than width, it is truncated. + + MaxWindowSize string + This variable specifies a geometry in which the + width and height give the maximum size for a given + window. This is typically used to restrict windows + to the size of the screen. The default is + "30000x30000". + + MenuBackground string + This variable specifies the background color used + for menus, and can only be specified inside of a + Color or Monochrome list. The default is "white". + + MenuFont string + This variable specifies the font to use when + displaying menus. The default is "variable". + + MenuForeground string + This variable specifies the foreground color used + for menus, and can only be specified inside of a + Color or Monochrome list. The default is "black". + + MenuShadowColor string + This variable specifies the color of the shadow + behind pull-down menus and can only be specified + inside of a Color or Monochrome list. The default + is "black". + + MenuShadowDepth pixels + This variable specifies the depth of the shadow ctwm + uses for 3D menus, when UseThreeDMenus is selected. + + MenuTitleBackground string + This variable specifies the background color for + f.title entries in menus, and can only be specified + inside of a Color or Monochrome list. The default + is "white". + + MenuTitleForeground string + This variable specifies the foreground color for + f.title entries in menus and can only be specified + inside of a Color or Monochrome list. The default + is "black". + + Monochrome { colors } + This variable specifies a list of color assignments + that should be made if the screen has a depth of 1. + See the description of Colors. + + MoveDelta pixels + This variable specifies the number of pixels the + pointer must move before the f.move function starts + working. Also see the f.deltastop function. The + default is zero pixels. + + MovePackResistance pixels + This variable specifies the number of pixels of the + movepack and movepush resistance. See f.movepack and + f.movepush. + + MoveOffResistance pixels + This variable specifies the number of pixels of the + moveoff resistance. If pixels is positive, + DontMoveOff will only prevent you from going off the + edge if you're within n pixels off the edge. If you + go further, DontMoveOff gives up and lets you go as + far as you wish. f.forcemove still allows you to + totally ignore DontMoveOff. A negative value puts + you back into "never moveoff" mode (it's the + default). + + NoBackingStore + This variable indicates that ctwm's menus should not + request backing store to minimize repainting of + menus. This is typically used with servers that can + repaint faster than they can handle backing store. + + NoBorder { win-list } + These windows won't have border. If you want no + borders on all windows, use the BorderWidth keyword. + + NoCaseSensitive + This variable indicates that case should be ignored + when sorting icon names in an icon manager. This + option is typically used with applications that cap- + italize the first letter of their icon name. + + NoDefaults + This variable indicates that ctwm should not supply + the default titlebuttons and bindings. This option + should only be used if the startup file contains a + completely new set of bindings and definitions. + + NoGrabServer + This variable indicates that ctwm should not grab + the server when popping up menus and moving opaque + windows. + + NoHighlight [{ win-list }] + This variable indicates that borders should not be + highlighted to track the location of the pointer. + If the optional win-list is given, highlighting will + only be disabled for those windows. When the border + is highlighted, it will be drawn in the current Bor- + derColor. When the border is not highlighted, it + will be stippled with an gray pattern using the + current BorderTileForeground and BorderTileBack- + ground colors. + + NoIconTitle [{ win-list }] + This variable indicates that icons should not + display the icon name of the client. If the + optional win-list is given, only those clients will + not have icon titles. + + NoIconManagerFocus + This variable indicates that ctwm will not set the + focus on the corresponding window when the pointer + is in an IconManager. + + NoIconManagers + This variable indicates that no icon manager should + be created. + + NoMenuShadows + This variable indicates that menus should not have + drop shadows drawn behind them. This is typically + used with slower servers since it speeds up menu + drawing at the expense of making the menu slightly + harder to read. + + NoOpaqueMove { window-list } + The counterpart of OpaqueMove. See OpaqueMove. + + NoOpaqueResize { window-list } + The counterpart of OpaqueResize. See OpaqueResize. + + NoRaiseOnDeiconify + This variable indicates that windows that are + deiconified should not be raised. + + NoRaiseOnMove + This variable indicates that windows should not be + raised when moved. This is typically used to allow + windows to slide underneath each other. + + NoRaiseOnResize + This variable indicates that windows should not be + raised when resized. This is typically used to + allow windows to be resized underneath each other. + + NoRaiseOnWarp + This variable indicates that windows should not be + raised when the pointer is warped into them with the + f.warpto function. If this option is set, warping + to an occluded window may result in the pointer end- + ing up in the occluding window instead the desired + window (which causes unexpected behavior with + f.warpring). + + NoSaveUnders + This variable indicates that menus should not + request save-unders to minimize window repainting + following menu selection. It is typically used with + displays that can repaint faster than they can han- + dle save-unders. + + NoShowOccupyAll + This variable specifies that OccupyAll windows won't + be displayed in the WorkSpaceMap window. + + NoStackMode [{ win-list }] + This variable indicates that client window requests + to change stacking order should be ignored. If the + optional win-list is given, only requests on those + windows will be ignored. This is typically used to + prevent applications from relentlessly popping them- + selves to the front of the window stack. + + NoTitle [{ win-list }] + This variable indicates that windows should not have + titlebars. If the optional win-list is given, only + those windows will not have titlebars. MakeTitle + may be used with this option to force titlebars to + be put on specific windows. + + NoTitleFocus + This variable indicates that ctwm should not set + keyboard input focus to each window as it is + entered. Normally, ctwm sets the focus so that + focus and key events from the titlebar and icon + managers are delivered to the application. If the + pointer is moved quickly and ctwm is slow to + respond, input can be directed to the old window + instead of the new. This option is typically used + to prevent this ``input lag'' and to work around + bugs in older applications that have problems with + focus events. + + NoTitleHighlight [{ win-list }] + This variable indicates that the highlight area of + the titlebar, which is used to indicate the window + that currently has the input focus, should not be + displayed. If the optional win-list is given, only + those windows will not have highlight areas. This + and the SqueezeTitle options can be set to substan- + tially reduce the amount of screen space required by + titlebars. + + Occupy { occupy-list } + This variable specifies which windows occupy which + workspaces at startup. + + occupy-list consists of entries of the form : + + [Window] win-name { wpsc1 wspc2 ... } + or Workspace wspc-name {win1 win2 ... } + + Example : + + Occupy { + "xload" {"all"} + Window "xterm" {"here" "there" "elsewhere"} + "xv" {"images"} + WorkSpace "images" {"xloadimage"} + } + + Note : The Occupy declaration should come after the + WorkSpaces declaration. + + + OccupyAll { window-list } + + This variable specifies a list of windows that will + occupy all workspaces at startup. + + window-list is a list of window names. + + Example : + + OccupyAll + { + "xload" + "xbiff" + "xconsole" + } + + Note : The OccupyAll declaration should come after + the WorkSpaces declaration. + + + OpaqueMove { window-list } + This variable indicates that the f.move function + should actually move the window instead of just an + outline so that the user can immediately see what + the window will look like in the new position. This + option is typically used on fast displays (particu- + larly if NoGrabServer is set). The optional window + list parameter indicates that only windows in this + list should actually be moved in opaque mode. The + NoOpaqueMove counterpart is also available. + + + OpaqueMoveThreshold { threshold } + The integer parameter is a percentage and indicates + that only windows (elligible for opaque moving) with + a surface smaller than this percentage of the sur- + face of the screen should actually be moved in + opaque mode. + + + OpaqueResize { window-list } + The opaque version of resize. Extremely resource + intensive, but beautiful with fast + server/client/network. See OpaqueMove. The NoOpa- + queResize counterpart is also available. + + + OpaqueResizeThreshold { threshold } + The resize version of OpaqueMoveThreshold. + + +*********************** +VMS specific: + OpenWindowTimeout is currently not implemented on VMS +*********************** + + OpenWindowTimeout seconds + seconds is an integer representing a number of + second. When a window tries to open on an unattended + display, it will be automatically mapped after this + number of seconds. + + + PackNewWindows + Use f.movepack algorithm instead of f.move when + opening a new window. + + + Pixmaps { pixmaps } + This variable specifies a list of pixmaps that + define the appearance of various images. Each entry + is a keyword indicating the pixmap to set, followed + by a string giving the name of the bitmap file. The + following pixmaps may be specified: + + Pixmaps + { + TitleHighlight "gray1" + # TitleHighlight "supman%.xbm" + } + + The default for TitleHighlight is to use an even + stipple pattern. + + + PixmapDirectory path + This variable specifies the path where ctwm looks to + find non-X11 bitmap files. Whenever you want to use + a image file that is not an X11 bitmap, specify : + xpm:filename (for xpm files) or xwd:filename for xwd + files, or im:filename (for other files supported by + the imconv package), or |command for an on the file + generated xwd file. Use the % character to specify + an animation. path can be a colon separated list of + directories. Example : + + PixmapDirectory "/usr/lib/X11/twm" + Icons + { + "Axe" "xpm:edit.xpm" + "xterm" "xpm:ball%.xpm" + } + +************** +VMS specific: + PixmapDirectory "mphv2$user2:[bloggs.xpm]" +************** + + N.B This is only valid if your version of ctwm has + been compiled with the XPM and IMCONV options. + + + RaiseDelay milliseconds + For windows that are to be automatically raised when + the pointer enters (see the AutoRaise variable and + the f.autoraise function) this variable specifies + the length of time the pointer should rest in the + window before it is raised. The default is 0 mil- + liseconds. + + + RaiseOnClick + If present a window will be raised on top of others + when clicked on, and the ButtonPress event will be + correctly forwarded to the client that owns this + window (if it asked to). See RaiseOnClickButton. + + + RaiseOnClickButton button_number + Where button_number is a valid button number (gene- + rally 1 to 3). Specify the button to use for Raise- + OnClick. + + + RaiseWhenAutoUnSqueeze + Windows are raised when auto-unsqueezed (See Auto- + Squeeze). + + + RandomPlacement [ string ] + Where string is either "on", "off", "all" or + "unmapped". This variable indicates that windows + with no specified geometry should be placed in a + pseudo-random location instead of having the user + drag out an outline. The argument "on" or "all" + tells ctwm do do this for all such windows, "off", + not to do this, and "unmapped", only for unmapped + windows, e.g. iconified or not visible in the + current workspace. + + + ReallyMoveInWorkspaceManager + This keyword tells ctwm to move the actual window + when the user is moving the small windows in the + WorkSpaceMap window. If not present the WorkSpaceMap + can be used only to modify the occupation of a win- + dow. + + + ResizeFont string + This variable specifies the font to be used for in + the dimensions window when resizing windows. The + default is "fixed". + + + RestartPreviousState + This variable indicates that ctwm should attempt to + use the WM_STATE property on client windows to tell + which windows should be iconified and which should + be left visible. This is typically used to try to + regenerate the state that the screen was in before + the previous window manager was shutdown. + + + ReverseCurrentWorkspace string + This variable specifies tells ctwm to reverse the + background and foreground colors in the small win- + dows in the workspace map for the current workspace. + + + SaveColor { colors-list } + This variable indicates a list of color assignments + to be stored as pixel values in the root window pro- + perty _MIT_PRIORITY_COLORS. Clients may elect to + preserve these values when installing their own + colormap. Note that use of this mechanism is a way + an for application to avoid the "technicolor" prob- + lem, whereby useful screen objects such as window + borders and titlebars disappear when a programs cus- + tom colors are installed by the window manager. For + example: + + SaveColor + { + BorderColor + TitleBackground + TitleForeground + "red" + "green" + "blue" + } + + This would place on the root window 3 pixel values + for borders and titlebars, as well as the three + color strings, all taken from the default colormap. + + + SchrinkIconTitles + A la Motif schrinking of icon titles, and expansion + when mouse is inside icon. + + + ShortAllWindowsMenus + Don't show WorkSpaceManager and IconManagers in the + TwmWindows and TwmAllWindows menus. + + + ShowIconManager + This variable indicates that the icon manager window + should be displayed when ctwm is started. It can + always be brought up using the f.showiconmgr func- + tion. + + + ShowWorkSpaceManager + This variable specifies that the WorkSpaceManager + should be visible. + + + SortIconManager + This variable indicates that entries in the icon + manager should be sorted alphabetically rather than + by simply appending new windows to the end. + + + SqueezeTitle [{ squeeze-list }] + This variable indicates that ctwm should attempt to + use the SHAPE extension to make titlebars occupy + only as much screen space as they need, rather than + extending all the way across the top of the window. + The optional squeeze-list may be used to control the + location of the squeezed titlebar along the top of + the window. It contains entries of the form: + + "name" justification num denom + + where name is a window name, justification is either + left, center, or right, and num and denom are + numbers specifying a ratio giving the relative posi- + tion about which the titlebar is justified. The + ratio is measured from left to right if the numera- + tor is positive, and right to left if negative. A + denominator of 0 indicates that the numerator should + be measured in pixels. For convenience, the ratio + 0/0 is the same as 1/2 for center and -1/1 for + right. For example: + + SqueezeTitle + { + "XTerm" left 0 0 + "xterm1" left 1 3 + "xterm2" left 2 3 + "oclock" center 0 0 + "emacs" right 0 0 + } + + The DontSqueezeTitle list can be used to turn off + squeezing on certain titles. + + + StartIconified [{ win-list }] + This variable indicates that client windows should + initially be left as icons until explicitly deiconi- + fied by the user. If the optional win-list is + given, only those windows will be started iconic. + This is useful for programs that do not support an + -iconic command line option or resource. + + + StartInMapState + This variable specifies that the WorkSpaceManager + should be started in its map form when created. + + + StartSqueezed { win-list } + These windows will first show up squeezed (see + f.squeeze). + + + StayUpMenus + Tells ctwm to use stayup menus. These menus will + stay on the screen when ButtonUp, if either the menu + has not yet been entered by the pointer, or the + current item is a f.title. + + + SunkFocusWindowTitle + This variable specifies that the title of the focus + window (if exists) should be sunken instead of + raised. Only valid if UseThreeDTitles is set. + + + ThreeDBorderWidth pixels + The width of the 3D border in pixels, if any. + + + TitleBackground string [{ win-list }] + This variable specifies the background color used in + titlebars, and may only be specified inside of a + Color or Monochrome list. The optional win-list is + a list of window names and colors so that per-window + colors may be specified. The default is "white". + + + TitleButtonBorderWidth pixels + This variable specifies the width in pixels of the + border surrounding titlebuttons. This is typically + set to 0 to allow titlebuttons to take up as much + space as possible and to not have a border. The + default is 1 if UseThreeDTitles is not set, 0 if it + is set. + + + TitleButtonShadowDepth pixels + This variable specifies the depth of the shadow ctwm + uses for 3D title buttons, when UseThreeDTitles is + selected. + + + TitleFont string + This variable specifies the font to used for + displaying window names in titlebars. The default + is "variable". + + + TitleForeground string [{ win-list }] + This variable specifies the foreground color used in + titlebars, and may only be specified inside of a + Color or Monochrome list. The optional win-list is + a list of window names and colors so that per-window + colors may be specified. The default is "black". + + + TitleJustification string + This keyword needs a string value. The acceptable + values are : "left", "center" and "right". The win- + dow titles will be justified according to this in + the title window. + + + TitlePadding pixels + This variable specifies the distance between the + various buttons, text, and highlight areas in the + titlebar. The default is 8 pixels if UseThreeDTi- + tles is not set, 0 if it is set. + + + TitleShadowDepth pixels + This variable specifies the depth of the shadow ctwm + uses for 3D titles, when UseThreeDTitles is + selected. + + + TransientHasOccupation + This variable specifies that transient-for and non- + group leader windows can have their own occupation + potentially different from their leader window. The + default case is that these windows follow their + leader, use this keyword if the default action + doesn't please you. + + + TransientOnTop percentage + The parameter (required) is a percentage and tells + ctwm to put transient (and non-group leader) windows + always on top of their leader if and only if their + surface is smaller than this fraction of the surface + of their leader. The surface of a window is its + width times its weight. + + + UnknownIcon string + This variable specifies the filename of a bitmap + file to be used as the default icon. This bitmap + will be used as the icon of all clients which do not + provide an icon bitmap and are not listed in the + Icons list. + + + UnmapByMovingFarAway [{ win-list }] + These windows will be moved out of the screen + instead of beeing unmapped when they become invisi- + ble due to a change workspace. This has been added + because some ill-behaved clients (Frame5) don't like + to be unmapped. + + + UsePPosition string + This variable specifies whether or not ctwm should + honor program-requested locations (given by the PPo- + sition flag in the WM_NORMAL_HINTS property) in the + absence of a user-specified position. The argument + string may have one of three values: "off" (the + default) indicating that ctwm should ignore the + program-supplied position, "on" indicating that the + position should be used, and "non-zero" indicating + that the position should used if it is other than + (0,0). The latter option is for working around a + bug in older toolkits. + + + UseSunkTitlePixmap + This makes it so the shadows are inversed for title + pixmaps when focus is lost. This is similar to hav- + ing the SunkFocusWindowTitle, but it makes your xbm + or 3d XPM (if any) sink instead of just the whole + bar. + + + UseThreeDBorders + Tells ctwm to use 3D-looking window borders. The + width ot the 3D borders is ThreeDBorderWidth. The + color of the 3D border is BorderTileBackground, and + if NoHighlight is not selected, the border of the + Focus window is BorderColor. + + + UseThreeDIconManagers + Tells ctwm to use 3D-looking IconManagers if any. + + + UseThreeDMenus + Tells ctwm to use 3D-looking menus. + + + UseThreeDTitles + Tells ctwm to use 3D-looking windows titles. In + which case the default values of TitleButtonBor- + derWidth, FramePadding, TitlePadding and ButtonIn- + dent are set to 0. There are plenty of built-in + scalable pixmaps for buttons, :xpm:menu, :xpm:dot, + :xpm:resize, :xpm:bar, :xpm:vbar, :xpm:iconify, + :xpm:resize and :xpm:box. There is several built-in + scalable animation for buttons : %xpm:resize, + %xpm:menu-up, %xpm:menu-down, %xpm:resize-out-top, + %xpm:resize-in-top, %xpm:resize-out-bot, + %xpm:resize-in-bot, %xpm:maze-out, %xpm:maze-in, + %xpm:zoom-out, %xpm:zoom-in and %xpm:zoom-inout. Try + them to see what they look like. + + + UseThreeDWMap + Tells ctwm to use 3D for the small windows in the + workspace map. + + + WarpCursor [{ win-list }] + This variable indicates that the pointer should be + warped into windows when they are deiconified. If + the optional win-list is given, the pointer will + only be warped when those windows are deiconified. + + + WindowRing [{ win-list }] + This variable specifies a list of windows along + which the f.warpring function cycles. If no argument + is given, all the windows are in the ring. + + + WarpRingOnScreen + Tells ctwm that f.warpring warps pointer only to + windows visible in the current workspace. + + + WarpToDefaultMenuEntry + (Useful only with StayUpMenus) When using StayUp- + Menus, and a menu does stays up, the pointer is + warped to the default entry of the menu. + + + WarpUnmapped + This variable indicates that that the f.warpto func- + tion should deiconify any iconified windows it + encounters. This is typically used to make a key + binding that will pop a particular window (such as + xmh), no matter where it is. The default is for + f.warpto to ignore iconified windows. + + + WMgrButtonShadowDepth depth + Control the depth of the shadow of the workspace + manager buttons. + + + WMgrHorizButtonIndent nb_pixels + Specifies the horizontal space, in pixel, between + the buttons of the workspace manager (in button + mode). + + + WMgrVertButtonIndent nb_pixels + Specifies the vertical space, in pixel, between the + buttons of the workspace manager (in button mode). + + + WorkSpaceFont string + This allows you to specify the font to use for the + small windows in the workspace manager map. (Try "- + adobe-times-*-r-*--10-*-*-*-*-*-*-*"). + + + WorkSpaceManagerGeometry string [ columns ] + This variable specifies the geometry of the + workspace manager window. The string argument is + standard geometry specification that indicates the + initial full size of the workspace manager. The + columns argument indicates the number of columns to + use for the workspace manager window. + + WorkSpaceManagerGeometry "360x60+60-0" 8 + + + WorkSpaces { workspace-list } + This variable specifies a list of workspaces that + are created at startup, Where workspace-list is : + + name [{bg-button [fg-button] [bg-root] [fg-root] [pixmap-root]}] + + + With : + + bg-button: + background color of the corresponding button + in the workspace manager. + + fg-button: + foreground color of the corresponding button + in the workspace manager. + + bg-root: + background color of the corresponding root + screen. + + fg-root: + foreground color of the corresponding root + screen. + + pixmap-root: + pixmap to display on the corresponding root + screen, either the name of a bitmap, + xpm:xpmfile, xwd:xwdfile, im:imfile or + |command_that generate_xwd. + + Example : + + WorkSpaces + { + "One" {"#686B9F" "white" "DeepSkyBlue3" "white" "xlogo16"} + "Two" {"#619AAE" "white" "firebrick"} + "Three" {"#727786" "white" "MidnightBlue" "white" "xpm:ball%.xpm"} + "Four" {"#727786" "white" "white" "white" "|(giftoppm | pnmtoxwd) < 2010.gif"} + + "Five" {"#727786" "white" "DeepSkyBlue3" "white" "plaid"} + "Six" {"#619AAE" "white" "DeepSkyBlue3" "white" "xpm:background1"} + "Seven" {"#8C5b7A" "white" "chartreuse4"} + "Eight" {"#686B9F" "white" "MidnightBlue"} + } + + + The WorkSpaces declaration should come before the + Occupy or OccupyAll declarations. The maximum number + of workspaces is 32. + + + XMoveGrid number + This variable specifies the value to use to con- + strain window movement. When moving windows around, + the x coordinate will always be a multiple of this + variable. Default id 1. f.forcemove ignores this + variable. + + + YMoveGrid number + + + XorValue number + This variable specifies the value to use when draw- + ing window outlines for moving and resizing. This + should be set to a value that will result in a + variety of distinguishable colors when exclusive- + or'ed with the contents of the user's typical + screen. Setting this variable to 1 often gives nice + results if adjacent colors in the default colormap + are distinct. By default, ctwm will attempt to + cause temporary lines to appear at the opposite end + of the colormap from the graphics. + + + YMoveGrid number + This variable specifies the value to use to con- + strain window movement. When moving windows around, + the y coordinate will always be a multiple of this + variable. Default id 1. f.forcemove ignores this + variable. + + + Zoom [ count ] + This variable indicates that outlines suggesting + movement of a window to and from its iconified state + should be displayed whenever a window is iconified + or deiconified. The optional count argument speci- + fies the number of outlines to be drawn. The + default count is 8. + + The following variables must be set after the fonts have + been assigned, so it is usually best to put them at the end + of the variables or beginning of the bindings sections: + + + ChangeWorkspaceFunction function + This variable specifies the function to be executed + when the user change the current workspace (zap). + + + DefaultFunction function + This variable specifies the function to be executed + when a key or button event is received for which no + binding is provided. This is typically bound to + f.nop, f.beep, or a menu containing window opera- + tions. + + + DeIconifyFunction function + This variable specifies the function to be executed + when a window is deiconified. + + + IconifyFunction function + This variable specifies the function to be executed + when a window is iconified. + + + WindowFunction function + This variable specifies the function to execute when + a window is selected from the TwmWindows menu. If + this variable is not set, the window will be deicon- + ified and raised. + +BINDINGS + After the desired variables have been set, functions may be + attached titlebuttons and key and pointer buttons. + Titlebuttons may be added from the left or right side and + appear in the titlebar from left-to-right according to the + order in which they are specified. Key and pointer button + bindings may be given in any order. + + Titlebuttons specifications must include the name of the + pixmap to use in the button box and the function to be + invoked when a pointer button is pressed within them: + + LeftTitleButton "bitmapname" = function + + or + + LeftTitleButton "bitmapname" { + Buttoni : function + ... + Buttonj : function + } + + or + + RightTitleButton "bitmapname" = function + + or + + RightTitleButton "bitmapname" { + Buttoni : function + ... + Buttonj : function + } + + The bitmapname may refer to one of the built-in bitmaps + (which are scaled to match TitleFont) by using the appropri- + ate colon-prefixed name described above. + + Key and pointer button specifications must give the modif- + iers that must be pressed, over which parts of the screen + the pointer must be, and what function is to be invoked. + Keys are given as strings containing the appropriate keysym + name; buttons are given as the keywords Button1-Button5: + + "FP1" = modlist : context : function + Button1 = modlist : context : function + + The modlist is any combination of the modifier names shift, + control, lock, meta, mod1, mod2, mod3, mod4, or mod5 (which + may be abbreviated as s, c, l, m, m1, m2, m3, m4, m5, + respectively) separated by a vertical bar (|). Similarly, + the context is any combination of window, title, icon, root, + frame, iconmgr, their first letters (iconmgr abbreviation is + m), or all, separated by a vertical bar. The function is + any of the f. keywords described below. For example, the + default startup file contains the following bindings: + + Button1 = : root : f.menu "TwmWindows" + Button1 = m : window | icon : f.function "move-or-lower" + Button2 = m : window | icon : f.iconify + Button3 = m : window | icon : f.function "move-or-raise" + Button1 = : title : f.function "move-or-raise" + Button2 = : title : f.raiselower + Button1 = : icon : f.function "move-or-iconify" + Button2 = : icon : f.iconify + Button1 = : iconmgr : f.iconify + Button2 = : iconmgr : f.iconify + + A user who wanted to be able to manipulate windows from the + keyboard could use the following bindings: + + "F1" = : all : f.iconify + "F2" = : all : f.raiselower + "F3" = : all : f.warpring "next" + "F4" = : all : f.warpto "xmh" + "F5" = : all : f.warpto "emacs" + "F6" = : all : f.colormap "next" + "F7" = : all : f.colormap "default" + "F20" = : all : f.warptoscreen "next" + "Left" = m : all : f.backiconmgr + "Right" = m | s : all : f.forwiconmgr + "Up" = m : all : f.upiconmgr + "Down" = m | s : all : f.downiconmgr + + + Ctwm provides many more window manipulation primitives than + can be conveniently stored in a titlebar, menu, or set of + key bindings. Although a small set of defaults are supplied + (unless the NoDefaults is specified), most users will want + to have their most common operations bound to key and button + strokes. To do this, ctwm associates names with each of the + primitives and provides user-defined functions for building + higher level primitives and menus for interactively select- + ing among groups of functions. + + User-defined functions contain the name by which they are + referenced in calls to f.function and a list of other func- + tions to execute. For example: + + Function "move-or-lower" { f.move f.deltastop f.lower } + Function "move-or-raise" { f.move f.deltastop f.raise } + Function "move-or-iconify" { f.move f.deltastop f.iconify } + Function "restore-colormap" { f.colormap "default" f.lower } + + The function name must be used in f.function exactly as it + appears in the function specification. + + In the descriptions below, if the function is said to + operate on the selected window, but is invoked from a root + menu, the cursor will be changed to the Select cursor and + the next window to receive a button press will be chosen: + + ! string + This is an abbreviation for f.exec string. + + f.addtoworkspace string + This function adds the selected window to the + workspace whose name is string. + + f.adoptwindow + This function ask for the user to select a window + with the mouse, and then adopt this window is it + doesn't belong to the current ctwm. Useful only with + the -w flag. + + f.altcontext + Set the alternate context. The next key or button + event ctwm reveives will be interpreted using the + alternate context. To define bindings in the alter- + nate context, use the keyword alter in the context + field of the binding command. For example: + + "Return"= m : all : f.altcontext + "n" = : alter : f.nextworkspace + "p" = : alter : f.prevworkspace + + + f.altkeymap number + Set the alternate keymap number, where number is an + integer between 1 and 5 included. The next key or + button event ctwm reveives will be interpreted using + this alternate keymap. To define bindings in an + alternate keymap, use the keyword a followed by + number in the modifier field of the binding command. + For example: + + "Return"= c : all : f.altkeymap "1" + "i" = a1 : window|icon|iconmgr : f.iconify + "z" = a1 : window : f.zoom + "d" = a1 : window|icon : f.delete + "o" = a1 : window|icon : f.occupy + "r" = a1 : window|icon : f.refresh + + + When using an alternate keymaps, only the root, window, icon + and iconmgr contexts are allowed. + + + f.autoraise + This function toggles whether or not the selected + window is raised whenever entered by the pointer. + See the description of the variable AutoRaise. + + + f.backmapiconmgr + This function warps the pointer in the same manner + as f.backiconmgr but only stops at windows that are + mapped. + + + f.backiconmgr + This function warps the pointer to the previous + column in the current icon manager, wrapping back to + the previous row if necessary. + + + f.beep This function sounds the keyboard bell. + + + f.bottomzoom + This function is similar to the f.fullzoom function, + but resizes the window to fill only the bottom half + of the screen. + + + f.circledown + This function lowers the top-most window that + occludes another window. + + + f.circleup + This function raises the bottom-most window that is + occluded by another window. + + + f.colormap string + This function rotates the colormaps (obtained from + the WM_COLORMAP_WINDOWS property on the window) that + ctwm will display when the pointer is in this win- + dow. The argument string may have one of the fol- + lowing values: "next", "prev", and "default". It + should be noted here that in general, the installed + colormap is determined by keyboard focus. A pointer + driven keyboard focus will install a private color- + map upon entry of the window owning the colormap. + Using the click to type model, private colormaps + will not be installed until the user presses a mouse + button on the target window. + + f.deiconify + This function deiconifies the selected window. If + the window is not an icon, this function does noth- + ing. + + + f.delete + This function sends the WM_DELETE_WINDOW message to + the selected window if the client application has + requested it through the WM_PROTOCOLS window pro- + perty. The application is supposed to respond to + the message by removing the indicated window. If + the window has not requested WM_DELETE_WINDOW mes- + sages, the keyboard bell will be rung indicating + that the user should choose an alternative method. + Note this is very different from f.destroy. The + intent here is to delete a single window, not + necessarily the entire application. + + + f.deleteordestroy + First tries to delete the window (send it + WM_DELETE_WINDOW message), or kills it, if the + client doesn't accept such message. + + + f.deltastop + This function allows a user-defined function to be + aborted if the pointer has been moved more than + MoveDelta pixels. See the example definition given + for Function "move-or-raise" at the beginning of the + section. + + + f.destroy + This function instructs the X server to close the + display connection of the client that created the + selected window. This should only be used as a last + resort for shutting down runaway clients. See also + f.delete. + + + f.downiconmgr + This function warps the pointer to the next row in + the current icon manger, wrapping to the beginning + of the next column if necessary. + + + f.downworkspace + Goto the workspace immediately underneath the + current workspace in the workspace manager. If the + current workspace is the bottom one, goto the top + one in the same column. The result depends on the + layout of the workspace manager. + + + f.exec string + This function passes the argument string to /bin/sh + for execution. In multiscreen mode, if string + starts a new X client without giving a display argu- + ment, the client will appear on the screen from + which this function was invoked. If the string + "$currentworkspace" is present inside the string + argument, it will be substituated with the current + workspace name. + + + f.fill string + Where string is either : "right", "left", "top" or + "bottom". The current window is resized in the + specified direction until it reaches an obstacle + (either another window, or the screen border). + + + f.focus This function toggles the keyboard focus of the + server to the selected window, changing the focus + rule from pointer-driven if necessary. If the + selected window already was focused, this function + executes an f.unfocus. + + + f.forcemove + This function is like f.move except that it ignores + the DontMoveOff variable. + + + f.forwiconmgr + This function warps the pointer to the next column + in the current icon manager, wrapping to the begin- + ning of the next row if necessary. + + + f.forwmapiconmgr + This function warps the pointer in the same manner + as f.forwiconmgr but only stops at windows that are + mapped. + + + f.fullzoom + This function resizes the selected window to the + full size of the display or else restores the origi- + nal size if the window was already zoomed. + + + f.function string + This function executes the user-defined function + whose name is specified by the argument string. + + + f.gotoworkspace workspace_name + This function warps you to the workspace whose name + is workspace_name. + + + f.hbzoom + This function is a synonym for f.bottomzoom. + + + f.hideiconmgr + This function unmaps the current icon manager. + + + f.hideworkspacemgr + Unmap the WorkSpace manager. + + + f.horizoom + This variable is similar to the f.zoom function + except that the selected window is resized to the + full width of the display. + + + f.htzoom + This function is a synonym for f.topzoom. + + + f.hypermove + Use this function to "move" a window between 2 cap- + tives ctwm (or between a captive and the root ctwm). + Of course 2 Ctwm's are completely different univer- + ses. You have to go in hyperspace to achieve this, + hence the name. + + + f.hzoom This function is a synonym for f.horizoom. + + + f.iconify + This function iconifies or deiconifies the selected + window or icon, respectively. + + + f.identify + This function displays a summary of the name and + geometry of the selected window. Clicking the + pointer or pressing a key in the window will dismiss + it. + + + f.lefticonmgr + This function similar to f.backiconmgr except that + wrapping does not change rows. + + + f.leftworkspace + Goto the workspace immediately on the left of the + current workspace in the workspace manager. If the + current workspace is the leftest one, goto the + rightest one in the same row. The result depends on + the layout of the workspace manager. + + + f.leftzoom + This variable is similar to the f.bottomzoom func- + tion but causes the selected window is only resized + to the left half of the display. + + + f.lower This function lowers the selected window. + + + f.menu string + This function invokes the menu specified by the + argument string. Cascaded menus may be built by + nesting calls to f.menu. When a menu is popped up, + you can use the arrow keys to move the cursor around + it. "Down" or space goes down, "Up" goes up, "Left" + pops down the menu, and "Right" activates the + current entry. The first letter of an entry name + activates this entry (the first one if several + entries match). If the first letter is ~ then Meta- + the-second-letter activates it, if this first letter + is ^ then Control-the-second-letter activates it, + and if this first letter is space, then the second + letter activates it. + + + f.move This function drags an outline of the selected win- + dow (or the window itself if the OpaqueMove variable + is set) until the invoking pointer button is + released. Double clicking within the number of mil- + liseconds given by ConstrainedMoveTime warps the + pointer to the center of the window and constrains + the move to be either horizontal or vertical depend- + ing on which grid line is crossed. To abort a move, + press another button before releasing the first but- + ton. + + + f.movepack + This function is like f.move except that it tries to + avoid overlapping of windows. When the moving window + begin to overlap with another window, the move is + stopped. If you go too far over the other window + (more that MovePackResistance pixels), the move is + resumed and the moving window can overlap with the + other window. Useful to pack windows closely. + + + f.movepush + This function is like f.move except that it tries to + avoid overlapping of windows. When the moving window + begin to overlap with another window, the other win- + dow is pushed. If you go too far over the other win- + dow (more that MovePackResistance pixels), there is + no push and the moving window can overlap with the + other window. Only available if OpaqueMove is + active. + + + f.nexticonmgr + This function warps the pointer to the next icon + manager containing any windows on the current or any + succeeding screen. + + + f.nextworkspace + Goto the next workspace in the list, using the order + given in the .ctwmrc file. + + + f.nop This function does nothing and is typically used + with the DefaultFunction or WindowFunction variables + or to introduce blank lines in menus. + + + f.occupy + This function pops up a window for the user to + choose which workspaces a window belongs to. + + + f.occupyall + This function makes the specified window occupy all + the workspaces. + + + f.pack string + Where string is either : "right", "left", "top" or + "bottom" The current window is moved in the speci- + fied direction until it reaches an obstacle (either + another window, or the screen border). The pointer + follows the window. Example : + + + f.previconmgr + This function warps the pointer to the previous icon + manager containing any windows on the current or + preceding screens. + + + f.prevworkspace + Goto the previous workspace in the list, using the + order given in the .ctwmrc file. + + + f.pin Valid only in a root menu. Make a menu permanent on + the screen. This is a toggle function, if you select + it while the menu is already permanent, it becomes + non-permanent. + + + f.quit This function causes ctwm to restore the window's + borders and exit. If ctwm is the first client + invoked from xdm, this will result in a server + reset. + + + f.raiseicons + This function raises all the icons in the current + workspace. + + + f.raise This function raises the selected window. + + + f.raiselower + This function raises the selected window to the top + of the stacking order if it is occluded by any win- + dows, otherwise the window will be lowered. + + + f.removefromworkspace string + This function removes the selected window from the + workspace whose name is string. + + + f.refresh + This function causes all windows to be refreshed. + + + f.resize + This function displays an outline of the selected + window. Crossing a border (or setting AutoRela- + tiveResize) will cause the outline to begin to + rubber band until the invoking button is released. + To abort a resize, press another button before + releasing the first button. + + + f.restart + This function kills and restarts ctwm. + + + f.restoregeometry + Restore the current window geometry to what was + saved in the last call to f.savegeometry. + + + f.righticonmgr + This function is similar to f.nexticonmgr except + that wrapping does not change rows. + + + f.rightworkspace + Goto the workspace immediately on the right of the + current workspace in the workspace manager. If the + current workspace is the rightest one, goto the + leftest one in the same row. The result depends on + the layout of the workspace manager. + + + f.rightzoom + This variable is similar to the f.bottomzoom func- + tion except that the selected window is only resized + to the right half of the display. + + + f.savegeometry + The geometry of the current window is saved. The + next call to f.restoregeometry will restore this + window to this geometry. + + + f.saveyourself + This function sends a WM_SAVEYOURSELF message to the + selected window if it has requested the message in + its WM_PROTOCOLS window property. Clients that + accept this message are supposed to checkpoint all + state associated with the window and update the + WM_COMMAND property as specified in the ICCCM. If + the selected window has not selected for this mes- + sage, the keyboard bell will be rung. + + + f.separator + Valid only in menus. The effect is to add a line + separator between the previous and the following + entry. The name selector part in the menu is not + used (but must be present). + + + f.setbuttonsstate + Set the WorkSpace manager in button state. + + + f.setmapstate + Set the WorkSpace manager in map state. + + + f.showiconmgr + This function maps the current icon manager. + + + f.sorticonmgr + This function sorts the entries in the current icon + manager alphabetically. See the variable SortIcon- + Manager. + + + f.showworkspacemgr + Map the WorkSpace manager. + + + f.slowdownanimation + Decrease AnimationSpeed by 1. + + + f.speedupanimation + Increase AnimationSpeed by 1. + + + f.squeeze + f.squeeze squeezes a window to a null vertical size. + Works only for windows with either a title, or a 3D + border (in order to have something left on the + screen). If the window is already squeezed, it is + unsqueezed. + + + f.startanimation + Restart freezed animations (if any). + + + f.stopanimation + Freeze animations (if any). + + + f.title This function provides a centered, unselectable item + in a menu definition. It should not be used in any + other context. + + + f.toggleoccupation string + This function adds the selected window to the + workspace whose name is string if it doesn't already + belongs to it, and removes it from this workspace if + not. + + + f.togglestate + Toggle the state of the WorkSpace manager. + + + f.toggleworkspacemgr + Toggle the presence of the WorkSpaceManager. If it + is mapped, it will be unmapped and vice versa. + + + f.topzoom + This variable is similar to the f.bottomzoom func- + tion except that the selected window is only resized + to the top half of the display. + + + + f.unfocus + This function resets the focus back to pointer- + driven. This should be used when a focused window + is no longer desired. + + + f.upiconmgr + This function warps the pointer to the previous row + in the current icon manager, wrapping to the last + row in the same column if necessary. + + + f.upworkspace + Goto the workspace immediately above the current + workspace in the workspace manager. If the current + workspace is the top one, goto the bottom one in the + same column. The result depends on the layout of the + workspace manager. + + + f.vanish + The specified window vanishes from the current + workspace if it occupies at least one other + WorkSpace. Do nothing in the others cases. + + f.vlzoom + This function is a synonym for f.leftzoom. + + + f.vrzoom + This function is a synonym for f.rightzoom. + + + f.warphere win_name + This function adds the window which has a name or + class that matches string to the current workspace + and warps the pointer to it. If the window is iconi- + fied, it will be deiconified if the variable WarpUn- + mapped is set or else ignored. + + + f.warpring string + This function warps the pointer to the next or pre- + vious window (as indicated by the argument string, + which may be "next" or "prev") specified in the Win- + dowRing variable. + + + f.warpto string + This function warps the pointer to the window which + has a name or class that matches string. If the + window is iconified, it will be deiconified if the + variable WarpUnmapped is set or else ignored. + + + f.warptoiconmgr string + This function warps the pointer to the icon manager + entry associated with the window containing the + pointer in the icon manager specified by the argu- + ment string. If string is empty (i.e. ""), the + current icon manager is chosen. + + + f.warptoscreen string + This function warps the pointer to the screen speci- + fied by the argument string. String may be a number + (e.g. "0" or "1"), the word "next" (indicating the + current screen plus 1, skipping over any unmanaged + screens), the word "back" (indicating the current + screen minus 1, skipping over any unmanaged + screens), or the word "prev" (indicating the last + screen visited. + + f.winrefresh + This function is similar to the f.refresh function + except that only the selected window is refreshed. + + f.zoom This function is similar to the f.fullzoom function, + except that the only the height of the selected win- + dow is changed. + +MENUS + Functions may be grouped and interactively selected using + pop-up (when bound to a pointer button) or pull-down (when + associated with a titlebutton) menus. Each menu specifica- + tion contains the name of the menu as it will be referred to + by f.menu, optional default foreground and background + colors, the list of item names and the functions they should + invoke, and optional foreground and background colors for + individual items: + + Menu "menuname" [ ("deffore":"defback") ] + { + string1 [ ("fore1":"backn")] function1 + string2 [ ("fore2":"backn")] function2 + . + . + . + stringN [ ("foreN":"backN")] functionN + } + + + The menuname is case-sensitive. The optional deffore and + defback arguments specify the foreground and background + colors used on a color display to highlight menu entries. + The string portion of each menu entry will be the text which + will appear in the menu. The optional fore and back argu- + ments specify the foreground and background colors of the + menu entry when the pointer is not in the entry. These + colors will only be used on a color display. The default is + to use the colors specified by the MenuForeground and Menu- + Background variables. The function portion of the menu + entry is one of the functions, including any user-defined + functions, or additional menus. + + There is 3 special menus. TwmWindows contains the names of + all of the client and ctwm-supplied windows in the current + workspace. Selecting an entry will cause the WindowFunction + to be executed on that window. If WindowFunction hasn't + been set, the window will be deiconified and raised. + TwmWorkspaces contains the names of your workspaces, + selecting an entry goto this workspace. In addition, these + entries have submenus containing the names of all windows + occupying this workspace, selecting such an entry executes + f.warpto on this window. And finally, TwmAllWindows contains + the names of all the windows ctwm manages. Selectting an + entry executes f.warpto on this window. + + If an entry name begins with a '*' (star), this star won't + be displayed and the corresponding entry will be the default + entry for this menu. When a menu has a default entry and is + used as a submenu of another menu, this default entry action + will be executed automatically when this submenu is selected + without beeing displayed. It's hard to explain, but easy to + understand. + +ICONS + Ctwm supports several different ways of manipulating iconi- + fied windows. The common pixmap-and-text style may be laid + out by hand or automatically arranged as described by the + IconRegion variable. In addition, a terse grid of icon + names, called an icon manager, provides a more efficient use + of screen space as well as the ability to navigate among + windows from the keyboard. + + An icon manager is a window that contains names of selected + or all windows currently on the display. In addition to the + window name, a small button using the default iconify symbol + will be displayed to the left of the name when the window is + iconified. By default, clicking on an entry in the icon + manager performs f.iconify. To change the actions taken in + the icon manager, use the the iconmgr context when specify- + ing button and keyboard bindings. + + Moving the pointer into the icon manager also directs key- + board focus to the indicated window (setting the focus + explicitly or else sending synthetic events NoTitleFocus is + set). Using the f.upiconmgr, f.downiconmgr f.lefticonmgr, + and f.righticonmgr functions, the input focus can be changed + between windows directly from the keyboard. + +BUGS + The resource manager should have been used instead of all of + the window lists. + + The IconRegion variable should take a list. + + Double clicking very fast to get the constrained move func- + tion will sometimes cause the window to move, even though + the pointer is not moved. + + If IconifyByUnmapping is on and windows are listed in Icon- + ManagerDontShow but not in DontIconifyByUnmapping, they may + be lost if they are iconified and no bindings to f.menu + "TwmWindows" or f.warpto are setup. + +FILES + +*********************** +VMS specific: + see notes above +*********************** + + $HOME/.ctwmrc. + $HOME/.ctwmrc + /usr/lib/X11/twm/system.ctwmrc + $HOME/.twmrc + +ENVIRONMENT VARIABLES + DISPLAY This variable is used to determine which X server to + use. It is also set during f.exec so that programs + come up on the proper screen. + + HOME This variable is used as the prefix for files that + begin with a tilde and for locating the ctwm startup + file. + +SEE ALSO + X(1), Xserver(1), xdm(1), xrdb(1) + +COPYRIGHT + Portions copyright 1988 Evans & Sutherland Computer Corpora- + tion; portions copyright 1989 Hewlett-Packard Company and + the Massachusetts Institute of Technology, See X(1) for a + full statement of rights and permissions. + +AUTHORS + Tom LaStrange, Solbourne Computer; Jim Fulton, MIT X Consor- + tium; Steve Pitschke, Stardent Computer; Keith Packard, MIT + X Consortium; Dave Sternlicht, MIT X Consortium; Dave Payne, + Apple Computer. Claude Lecommandeur, Swiss Polytechnical + Institute of Lausanne (lecom@sic.epfl.ch). + Index: external/mit/ctwm/dist/ctwm.vax_opt =================================================================== RCS file: external/mit/ctwm/dist/ctwm.vax_opt diff -N external/mit/ctwm/dist/ctwm.vax_opt --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/ctwm.vax_opt 3 Sep 2015 12:19:47 -0000 @@ -0,0 +1,26 @@ +GRAM.OBJ +LEX.OBJ +DEFTWMRC.OBJ +ADD_WINDOW.OBJ +GC.OBJ +LIST.OBJ +CTWM.OBJ +PARSE.OBJ +MENUS.OBJ +EVENTS.OBJ +RESIZE.OBJ +UTIL.OBJ +VERSION.OBJ +ICONMGR.OBJ +WORKMGR.OBJ +CURSOR.OBJ +ICONS.OBJ +VMS_CMD_SERVICES.OBJ +LNM.OBJ +XPMLIB:XPM.OLB/LIB +!X11LIB:XMU.OLB/LIB +SYS$SHARE:DECW$XMULIBSHR/SHARE +SYS$SHARE:DECW$XTSHR/SHARE +SYS$SHARE:DECW$XEXTLIBSHR/SHARE +SYS$SHARE:DECW$XLIBSHR/SHARE +SYS$SHARE:VAXCRTL/SHARE Index: external/mit/ctwm/dist/cursor.c =================================================================== RCS file: external/mit/ctwm/dist/cursor.c diff -N external/mit/ctwm/dist/cursor.c --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/cursor.c 3 Sep 2015 12:19:47 -0000 @@ -0,0 +1,251 @@ +/* + * Copyright 1989 Massachusetts Institute of Technology + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of M.I.T. not be used in advertising + * or publicity pertaining to distribution of the software without specific, + * written prior permission. M.I.T. makes no representations about the + * suitability of this software for any purpose. It is provided "as is" + * without express or implied warranty. + * + * M.I.T. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL M.I.T. + * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ +/* + * [ ctwm ] + * + * Copyright 1992 Claude Lecommandeur. + * + * Permission to use, copy, modify and distribute this software [ctwm] and + * its documentation for any purpose is hereby granted without fee, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting documen- + * tation, and that the name of Claude Lecommandeur not be used in adverti- + * sing or publicity pertaining to distribution of the software without + * specific, written prior permission. Claude Lecommandeur make no represen- + * tations about the suitability of this software for any purpose. It is + * provided "as is" without express or implied warranty. + * + * Claude Lecommandeur DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO + * EVENT SHALL Claude Lecommandeur BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF + * USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR + * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + * + * Author: Claude Lecommandeur [ lecom@sic.epfl.ch ][ April 1992 ] + */ + +/*********************************************************************** + * + * $XConsortium: cursor.c,v 1.10 89/12/14 14:52:23 jim Exp $ + * + * cursor creation code + * + * 05-Apr-89 Thomas E. LaStrange File created + * + * Do the necessary modification to be integrated in ctwm. + * Can no longer be used for the standard twm. + * + * 22-April-92 Claude Lecommandeur. + * + * + ***********************************************************************/ + +#include +#include "twm.h" +#ifdef VMS +#include +#else +#include +#endif +#include "screen.h" +#include "util.h" +#include "cursor.h" + +static struct _CursorName { + char *name; + unsigned int shape; + Cursor cursor; +} cursor_names[] = { + +{"X_cursor", XC_X_cursor, None}, +{"arrow", XC_arrow, None}, +{"based_arrow_down", XC_based_arrow_down, None}, +{"based_arrow_up", XC_based_arrow_up, None}, +{"boat", XC_boat, None}, +{"bogosity", XC_bogosity, None}, +{"bottom_left_corner", XC_bottom_left_corner, None}, +{"bottom_right_corner", XC_bottom_right_corner, None}, +{"bottom_side", XC_bottom_side, None}, +{"bottom_tee", XC_bottom_tee, None}, +{"box_spiral", XC_box_spiral, None}, +{"center_ptr", XC_center_ptr, None}, +{"circle", XC_circle, None}, +{"clock", XC_clock, None}, +{"coffee_mug", XC_coffee_mug, None}, +{"cross", XC_cross, None}, +{"cross_reverse", XC_cross_reverse, None}, +{"crosshair", XC_crosshair, None}, +{"diamond_cross", XC_diamond_cross, None}, +{"dot", XC_dot, None}, +{"dotbox", XC_dotbox, None}, +{"double_arrow", XC_double_arrow, None}, +{"draft_large", XC_draft_large, None}, +{"draft_small", XC_draft_small, None}, +{"draped_box", XC_draped_box, None}, +{"exchange", XC_exchange, None}, +{"fleur", XC_fleur, None}, +{"gobbler", XC_gobbler, None}, +{"gumby", XC_gumby, None}, +{"hand1", XC_hand1, None}, +{"hand2", XC_hand2, None}, +{"heart", XC_heart, None}, +{"icon", XC_icon, None}, +{"iron_cross", XC_iron_cross, None}, +{"left_ptr", XC_left_ptr, None}, +{"left_side", XC_left_side, None}, +{"left_tee", XC_left_tee, None}, +{"leftbutton", XC_leftbutton, None}, +{"ll_angle", XC_ll_angle, None}, +{"lr_angle", XC_lr_angle, None}, +{"man", XC_man, None}, +{"middlebutton", XC_middlebutton, None}, +{"mouse", XC_mouse, None}, +{"pencil", XC_pencil, None}, +{"pirate", XC_pirate, None}, +{"plus", XC_plus, None}, +{"question_arrow", XC_question_arrow, None}, +{"right_ptr", XC_right_ptr, None}, +{"right_side", XC_right_side, None}, +{"right_tee", XC_right_tee, None}, +{"rightbutton", XC_rightbutton, None}, +{"rtl_logo", XC_rtl_logo, None}, +{"sailboat", XC_sailboat, None}, +{"sb_down_arrow", XC_sb_down_arrow, None}, +{"sb_h_double_arrow", XC_sb_h_double_arrow, None}, +{"sb_left_arrow", XC_sb_left_arrow, None}, +{"sb_right_arrow", XC_sb_right_arrow, None}, +{"sb_up_arrow", XC_sb_up_arrow, None}, +{"sb_v_double_arrow", XC_sb_v_double_arrow, None}, +{"shuttle", XC_shuttle, None}, +{"sizing", XC_sizing, None}, +{"spider", XC_spider, None}, +{"spraycan", XC_spraycan, None}, +{"star", XC_star, None}, +{"target", XC_target, None}, +{"tcross", XC_tcross, None}, +{"top_left_arrow", XC_top_left_arrow, None}, +{"top_left_corner", XC_top_left_corner, None}, +{"top_right_corner", XC_top_right_corner, None}, +{"top_side", XC_top_side, None}, +{"top_tee", XC_top_tee, None}, +{"trek", XC_trek, None}, +{"ul_angle", XC_ul_angle, None}, +{"umbrella", XC_umbrella, None}, +{"ur_angle", XC_ur_angle, None}, +{"watch", XC_watch, None}, +{"xterm", XC_xterm, None}, +}; + +void NewFontCursor (Cursor *cp, char *str) +{ + int i; + + for (i = 0; i < sizeof(cursor_names)/sizeof(struct _CursorName); i++) + { + if (strcmp(str, cursor_names[i].name) == 0) + { + if (cursor_names[i].cursor == None) + cursor_names[i].cursor = XCreateFontCursor(dpy, + cursor_names[i].shape); + *cp = cursor_names[i].cursor; + return; + } + } + fprintf (stderr, "%s: unable to find font cursor \"%s\"\n", + ProgramName, str); +} + +int NewBitmapCursor(Cursor *cp, char *source, char *mask) +{ + XColor fore, back; + int hotx, hoty; + int sx, sy, mx, my; + unsigned int sw, sh, mw, mh; + Pixmap spm, mpm; + Colormap cmap = Scr->RootColormaps.cwins[0]->colormap->c; + + fore.pixel = Scr->Black; + XQueryColor(dpy, cmap, &fore); + back.pixel = Scr->White; + XQueryColor(dpy, cmap, &back); + + spm = GetBitmap(source); + if ((hotx = HotX) < 0) hotx = 0; + if ((hoty = HotY) < 0) hoty = 0; + mpm = GetBitmap(mask); + + /* make sure they are the same size */ + + XGetGeometry(dpy, spm, &JunkRoot, &sx, &sy, &sw, &sh, &JunkBW,&JunkDepth); + XGetGeometry(dpy, mpm, &JunkRoot, &mx, &my, &mw, &mh, &JunkBW,&JunkDepth); + if (sw != mw || sh != mh) + { + fprintf (stderr, + "%s: cursor bitmaps \"%s\" and \"%s\" not the same size\n", + ProgramName, source, mask); + return (1); + } + *cp = XCreatePixmapCursor(dpy, spm, mpm, &fore, &back, hotx,hoty); + return (0); +} + +Cursor MakeStringCursor (char *string) +{ + Cursor cursor; + XColor black, white; + Pixmap bitmap; + unsigned int width, height, middle; + GC gc; + Colormap cmap = Scr->RootColormaps.cwins[0]->colormap->c; + MyFont myfont = Scr->TitleBarFont; + XRectangle inc_rect; + XRectangle logical_rect; + + black.pixel = Scr->Black; + XQueryColor (dpy, cmap, &black); + white.pixel = Scr->White; + XQueryColor (dpy, cmap, &white); + + XmbTextExtents (myfont.font_set, string, strlen (string), + &inc_rect, &logical_rect); + width = logical_rect.width + 4; + height = logical_rect.height + 2; + middle = myfont.ascent; + /*XQueryBestCursor (dpy, Scr->Root, width, height, &rwidth, &rheight);*/ + + bitmap = XCreatePixmap (dpy, Scr->Root, width, height, 1); + gc = XCreateGC (dpy, bitmap, 0L, NULL); + + XSetForeground (dpy, gc, 0L); + XFillRectangle (dpy, bitmap, gc, 0, 0, width, height); + XSetForeground (dpy, gc, 1L); + XDrawRectangle (dpy, bitmap, gc, 0, 0, width - 1, height - 1); + + XmbDrawString (dpy, bitmap, myfont.font_set, + gc, 2, middle, string, strlen (string)); + + cursor = XCreatePixmapCursor (dpy, bitmap, None, &black, &white, 0, 0); + XFreePixmap (dpy, bitmap); + XFreeGC (dpy, gc); + return (cursor); +} Index: external/mit/ctwm/dist/cursor.h =================================================================== RCS file: external/mit/ctwm/dist/cursor.h diff -N external/mit/ctwm/dist/cursor.h --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/cursor.h 3 Sep 2015 12:19:47 -0000 @@ -0,0 +1,45 @@ +/* + * [ ctwm ] + * + * Copyright 1992 Claude Lecommandeur. + * + * Permission to use, copy, modify and distribute this software [ctwm] and + * its documentation for any purpose is hereby granted without fee, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting documen- + * tation, and that the name of Claude Lecommandeur not be used in adverti- + * sing or publicity pertaining to distribution of the software without + * specific, written prior permission. Claude Lecommandeur make no represen- + * tations about the suitability of this software for any purpose. It is + * provided "as is" without express or implied warranty. + * + * Claude Lecommandeur DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO + * EVENT SHALL Claude Lecommandeur BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF + * USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR + * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + * + * Author: Claude Lecommandeur [ lecom@sic.epfl.ch ][ April 1992 ] + */ + + +/********************************************************************** + * + * $XConsortium: add_window.h,v 1.7 90/04/17 14:04:33 jim Exp $ + * + * Cursor include file + * + * 26-Feb-97 Richard Levitte Initial Version. + * + **********************************************************************/ + +#ifndef _CURSOR_ +#define _CURSOR_ + +extern void NewFontCursor(Cursor *cp, char *str); +extern int NewBitmapCursor(Cursor *cp, char *source, char *mask); +extern Cursor MakeStringCursor (char *string); +#endif /* _CURSOR_ */ + Index: external/mit/ctwm/dist/deftwmrc.c =================================================================== RCS file: external/mit/ctwm/dist/deftwmrc.c diff -N external/mit/ctwm/dist/deftwmrc.c --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/deftwmrc.c 3 Sep 2015 12:19:47 -0000 @@ -0,0 +1,168 @@ +/* + * This file is generated automatically from the default + * twm bindings file system.ctwmrc by the twm Imakefile. + */ + +char *defTwmrc[] = { + "", + "NoGrabServer", + "RestartPreviousState", + "DecorateTransients", + "TitleFont \"-adobe-helvetica-bold-r-normal--*-120-*-*-*-*-*-*\"", + "ResizeFont \"-adobe-helvetica-bold-r-normal--*-120-*-*-*-*-*-*\"", + "MenuFont \"-adobe-helvetica-bold-r-normal--*-120-*-*-*-*-*-*\"", + "IconFont \"-adobe-helvetica-bold-r-normal--*-100-*-*-*-*-*-*\"", + "IconManagerFont \"-adobe-helvetica-bold-r-normal--*-100-*-*-*\"", + "ShowWorkSpaceManager # start with workspace manager up", + "UseThreeDMenus", + "UseThreeDTitles", + "UseThreeDIconManagers", + "UseThreeDBorders", + "UseThreeDWMap", + "SunkFocusWindowTitle", + "", + "WorkSpaceManagerGeometry \"360x60+60-0\" 4", + "WorkSpaces {", + " \"One\" {\"#686B9F\" \"white\" \"DeepSkyBlue3\" \"white\" \"xpm:background8.xpm\"}", + " \"Two\" {\"#619AAE\" \"white\" \"firebrick\" \"white\" \"plaid\"}", + " \"Three\" {\"#727786\" \"white\" \"brown\"}", + " \"Four\" {\"#8C5b7A\" \"white\" \"MidnightBlue\"}", + "", + " \"Five\" {\"#727786\" \"white\" \"firebrick\"}", + " \"Six\" {\"#619AAE\" \"white\" \"DeepSkyBlue3\"}", + " \"Seven\" {\"#8C5b7A\" \"white\" \"chartreuse4\"}", + " \"Eight\" {\"#686B9F\" \"white\" \"MidnightBlue\"}", + "}", + "", + "Color", + "{", + " BorderColor \"Red\"", + " DefaultBackground \"blue\"", + " DefaultForeground \"gray85\"", + " BorderTileBackground \"DeepSkyBlue1\" {", + " \"xterm\" \"DeepSkyBlue3\"", + " }", + " BorderTileForeground \"Black\" {", + " \"xterm\" \"DeepSkyBlue3\"", + " }", + " TitleBackground \"DeepSkyBlue1\" {", + " \"xterm\" \"DeepSkyBlue3\"", + " }", + " TitleForeground \"Black\" {", + " \"xterm\" \"White\"", + " }", + " MenuBackground \"#686B9F\"", + " MenuForeground \"white\"", + " MenuTitleBackground \"gray70\"", + " MenuTitleForeground \"White\"", + " IconBackground \"LightSlateBlue\"", + " IconForeground \"White\"", + " IconBorderColor \"gray85\"", + " IconManagerBackground \"DeepSkyBlue1\" {\"Axe\" \"DeepSkyBlue3\" \"xload\" \"DeepSkyBlue2\"}", + " IconManagerForeground \"Black\"", + " MapWindowBackground \"DeepSkyBlue1\" {", + " \"root*\" \"Red\"", + " \"xterm\" \"DeepSkyBlue3\"", + " \"Axe\" \"Yellow\"", + " }", + " MapWindowForeground \"Black\" {", + " \"xterm\" \"White\"", + " }", + "}", + "", + "IconManagerGeometry \"202x300-0+0\" 1", + "IconManagerDontShow {", + " \"WorkSpaceManager\"", + "}", + "", + "NoTitle { # little programs that look like icons", + " \"TWM Icon Manager\"", + " \"WorkSpaceManager\"", + "}", + "MoveDelta 3", + "Function \"move-or-lower\" { f.move f.deltastop f.lower }", + "Function \"move-or-raise\" { f.move f.deltastop f.raise }", + "Function \"move-or-iconify\" { f.move f.deltastop f.iconify }", + "", + "Button1 = : root : f.menu \"defops\"", + "Button2 = : root : f.menu \"windowops\"", + "", + "Button1 = m : window|icon : f.function \"move-or-lower\"", + "Button2 = m : window|icon : f.iconify", + "Button3 = m : window|icon : f.function \"move-or-raise\"", + "", + "Button1 = : title : f.function \"move-or-raise\"", + "Button2 = : title : f.raiselower", + "Button1 = m : title : f.movetitlebar", + "", + "Button1 = : icon : f.function \"move-or-iconify\"", + "Button2 = : icon : f.iconify", + "", + "Button1 = : iconmgr : f.iconify", + "Button2 = : iconmgr : f.iconify", + "", + "Button1 = : frame : f.resize", + "Button1 = m : frame : f.move", + "Button2 = : frame : f.raiselower", + "menu \"defops\"", + "{", + " \"Twm\" f.title", + " \"Xterm\" !\"xterm&\"", + " \"Calculator\" !\"xcalc&\"", + " \"Xman\" !\"xman &\"", + " \"Xmag\" !\"xmag&\"", + " \"\" f.nop", + " \"Restart\" f.restart", + " \"Exit\" f.quit", + "}", + "", + "menu \"windowops\" {", + " \"Windows\" f.title", + " \"Occupy\" f.occupy", + " \"Occupy All\" f.occupyall", + " \"Iconify\" f.iconify", + " \"Refresh\" f.refresh", + " \"Vanish\" f.vanish", + " \"Info\" f.identify", + " \"\" f.separator", + " \"Resize\" f.resize", + " \"Move\" f.move", + " \"Adopt Window\" f.adoptwindow", + " \"Animate\" f.startanimation", + " \"Don't animate\" f.stopanimation", + " \"\" f.separator", + " \"Send Delete\" f.delete", + " \"Kill Window\" f.destroy", + " \"Pin menu\" f.pin", + "}", + "", + "menu \"windowmenu\" {", + " \"Occupy ...\" f.occupy", + " \"Occupy All\" f.occupyall", + " \"Iconify\" f.iconify", + " \"RaiseLower\" f.raiselower", + " \"Refresh\" f.winrefresh", + " \"Zoom\" f.menu \"Zoom\"", + " \"Vanish\" f.vanish", + " \"Focus\" f.focus", + " \"Unfocus\" f.unfocus", + " \"\" f.separator", + " \"Send Delete\" f.delete", + " \"Kill Window\" f.destroy", + " \"Resize...\" f.resize", + " \"Move...\" f.move", + "}", + "", + "menu \"iconmenu\" {", + " \"Actions\" f.title", + " \"\" f.separator", + " \"Restore\" f.iconify", + " \"Move\" f.move", + " \"Occupy ...\" f.occupy", + " \"Occupy All\" f.occupyall", + " \"\" f.separator", + " \"Send Delete\" f.delete", + " \"Kill Window\" f.destroy", + "}", + "", + (char *) 0 }; Index: external/mit/ctwm/dist/demolib.c =================================================================== RCS file: external/mit/ctwm/dist/demolib.c diff -N external/mit/ctwm/dist/demolib.c --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/demolib.c 3 Sep 2015 12:19:47 -0000 @@ -0,0 +1,127 @@ +/* + * [ ctwm ] + * + * Copyright 1992 Claude Lecommandeur. + * + * Permission to use, copy, modify and distribute this software [ctwm] and + * its documentation for any purpose is hereby granted without fee, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting documen- + * tation, and that the name of Claude Lecommandeur not be used in adverti- + * sing or publicity pertaining to distribution of the software without + * specific, written prior permission. Claude Lecommandeur make no represen- + * tations about the suitability of this software for any purpose. It is + * provided "as is" without express or implied warranty. + * + * Claude Lecommandeur DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO + * EVENT SHALL Claude Lecommandeur BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF + * USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR + * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + * + * Author: Claude Lecommandeur [ lecom@sic.epfl.ch ][ July 1993 ] + */ +#include +#ifdef VMS +#include +#include +#else +#include +#include +#endif + +#include "ctwm.h" + +Window awindow = 0x5c0000d; +char *awspc1 = "lecom", *awspc2 = "root"; + +main (argc, argv) +int argc; +char **argv; +{ + Display *dpy; + Window w; + char **wlist, **wl, **occupation; + char *cur; + int status; + + dpy = XOpenDisplay (NULL); + if (dpy == NULL) { + fprintf (stderr, "Can't open display\n"); + exit (1); + } + +/****************************************************************/ + + if (! CtwmIsRunning) { + fprintf (stderr, "ctwm is not running\n"); + exit (1); + } + +/****************************************************************/ + + wlist = CtwmListWorkspaces (dpy, 0); + if (wlist == (char**) 0) { + fprintf (stderr, "cannot obtain workspaces list\n"); + exit (1); + } + printf ("list of workspaces : "); + wl = wlist; + while (*wl) { + printf ("\"%s\" ", *wl++); + } + printf ("\n"); + +/****************************************************************/ + + cur = CtwmCurrentWorkspace (dpy, 0); + if (cur == NULL) { + fprintf (stderr, "cannot obtain current workspace\n"); + exit (1); + } + printf ("current workspace : %s\n", cur); + +/****************************************************************/ + + status = CtwmChangeWorkspace (dpy, 0, awspc1); + if (! status) { + fprintf (stderr, "cannot change the current workspace\n"); + exit (1); + } + +/****************************************************************/ + + wlist = CtwmCurrentOccupation (dpy, awindow); + if (wlist == (char**) 0) { + fprintf (stderr, "cannot obtain occupation of window %x\n", awindow); + exit (1); + } + printf ("Occupation of window %d : ", awindow); + wl = wlist; + while (*wl) { + printf ("\"%s\" ", *wl++); + } + printf ("\n"); + +/****************************************************************/ + + occupation = (char**) malloc (3 * sizeof (char*)); + occupation [0] = awspc1; + occupation [1] = awspc2; + occupation [2] = NULL; + status = CtwmSetOccupation (dpy, awindow, occupation); + if (! status) { + fprintf (stderr, "cannot change the occupation of window %x\n", awindow); + } + printf ("occupation of window %x changed to \"lecom\", \"root\"\n", awindow); + +/****************************************************************/ + status = CtwmAddToCurrentWorkspace (dpy, awindow); + if (! status) { + fprintf (stderr, "cannot change the occupation of window %x\n", awindow); + } + printf ("window %x now occupy the current workspace\n", awindow); +} + Index: external/mit/ctwm/dist/descrip.local-template =================================================================== RCS file: external/mit/ctwm/dist/descrip.local-template diff -N external/mit/ctwm/dist/descrip.local-template --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/descrip.local-template 3 Sep 2015 12:19:47 -0000 @@ -0,0 +1,143 @@ +# This is the local configuration file for MMS/MMK for ctwm. + +###################################################################### +# +# Libraries +# +########## + +# Xmu include files +# X11XMU=X11LIB: +X11XMU=sys$sysroot:[decw$include.xmu] + +# Xmu library to use +# X11XMULIB=X11LIB:XMU.OLB +X11XMULIB=SYS$SHARE:DECW$XMULIBSHR/SHARE + +# Xsm include files +# X11SM=X11LIB: +X11SM=sys$sysroot:[decw$include.sm] + +# Xsm library to use +# X11SMLIB=X11LIB:SM.OLB +X11SMLIB=SYS$SHARE:DECW$SMSHR/SHARE + +# ctwm exit style: +# 0 - Just exit with error code 20. +# 1 - run sys$system:decw$endsession.exe on exit +EXIT_ENDSESSION = 0 + +# if you want to put the executable and object files at some specific place, +# change this macro +GOAL= + +###################################################################### +# +# Options +# +########## + +# The following is quite similar to Imakefile.local in teh Unixly +# build, except the flags are MMS/MMK variables rather than C macros. +# To disable a feature, the flag MUST be set to the empty string. To +# enable any particular feature, the flag variable must be set to +# something non-empty, preferably 1. +# +# Some of the things you can define also come with make variables that +# can be manipulated. All such variables have names starting with +# USER_. + +# ---------------------------------------------------------------------- +# Feature: Use IMCONV features. +# Uhmm, I really don't know what this is about. -- Richard Levitte +# +# The make variables USER_IMCONVLIBDIR and USER_IMCONVINCDIR can be +# used to configure library search paths and include file search paths +# to find the imconv libraries and header files. +# +# Example: +# +# IMCONV = 1 +# USER_IMCONVLIBDIR = LOCAL_LIBRARIES: +# USER_IMCONVINCDIR = LOCAL_INCLUDES: +# +IMCONV = + +# ---------------------------------------------------------------------- +# Feature: Use sounds +# If you want sound support through librplay, defined USE_SOUND. +# +# The make variables USER_SOUNDLIBDIR and USER_SOUNDINCDIR can be +# used to configure library search paths and include file search paths +# to find the rplay libraries and header files. +# +# Example: +# +# USE_SOUND = 1 +# USER_SOUNDLIBDIR = LOCAL_LIBRARIES: +# USER_SOUNDINCDIR = LOCAL_INCLUDES: +# +USE_SOUND = + +# ---------------------------------------------------------------------- +# Feature: Use XPM images +# If you want XPM support, define XPM. +# +# The make variables USER_XPMLIBDIR and USER_XPMINCDIR can be +# used to configure library search paths and include file search paths +# to find the rplay libraries and header files. +# +# Example: +# +# XPM = 1 +# USER_XPMLIBDIR = LOCAL_LIBRARIES: +# USER_XPMINCDIR = LOCAL_INCLUDES: +# +XPM = 1 +USER_XPMLIBDIR = [-.XPM-3_4J] +USER_XPMINCDIR = [-.XPM-3_4J.LIB] + +# ---------------------------------------------------------------------- +# Feature: Use Jpeg images +# If you want JPEG support, define JPEG. +# +# The make variables USER_JPEGLIBDIR and USER_JPEGINCDIR can be +# used to configure library search paths and include file search paths +# to find the rplay libraries and header files. +# +# Example: +# +# JPEG = 1 +# USER_JPEGLIBDIR = LOCAL_LIBRARIES: +# USER_JPEGINCDIR = LOCAL_INCLUDE: +# +JPEG = 1 + +# ---------------------------------------------------------------------- +# Feature: Using M4 to process the ctwm configuration file +# If you want to process the ctwm configuration file with m4, define +# USE_M4. +# +USE_M4 = + +# ---------------------------------------------------------------------- +# Feature: Support for Gnome extensions +# If you want to build with Gnome extensions, define GNOME. +# +GNOME = 1 + +# ---------------------------------------------------------------------- +# Feature: Use GNU regex +# If you want to build with GNU regex instead of the internal regex +# functions, define USE_GNU_REGEX. +# +USE_GNU_REGEX = + +# DEBUGGING: + +# ---------------------------------------------------------------------- +# Feature: General debugging +# If you want to get all kinds of debugging output from CTWM, define +# DEBUG. +# +DEBUG = Index: external/mit/ctwm/dist/descrip.mms =================================================================== RCS file: external/mit/ctwm/dist/descrip.mms diff -N external/mit/ctwm/dist/descrip.mms --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/descrip.mms 3 Sep 2015 12:19:47 -0000 @@ -0,0 +1,438 @@ +# Description file for CTWM. + +.INCLUDE descrip.local + +.IFDEF XPM +.IFDEF USER_XPMLIBDIR +XPMLIBDIR = $(USER_XPMLIBDIR) +.ELSE +XPMLIBDIR = +.ENDIF +.IFDEF USER_XPMINCDIR +XPMINCDIR = ,$(USER_XPMINCDIR) +.ELSE +XPMINCDIR = +.ENDIF + +XPMDEFINES = ,XPM +XPMLIB = $(XPMLIBDIR)LIBXPM +.ELSE +XPMLIBDIR = +XPMINCDIR = + +XPMDEFINES = +XPMLIB = +.ENDIF + +.IFDEF JPEG +.IFDEF USER_JPEGLIBDIR +JPEGLIBDIR = $(USER_JPEGLIBDIR) +.ELSE +JPEGLIBDIR = +.ENDIF +.IFDEF USER_JPEGINCDIR +JPEGINCDIR = ,$(USER_JPEGINCDIR) +.ELSE +JPEGINCDIR = +.ENDIF + +JPEGDEFINES = ,JPEG +JPEGLIB = $(JPEGLIBDIR)LIBJPEG +.ELSE +JPEGLIBDIR = +JPEGINCDIR = + +JPEGDEFINES = +JPEGLIB = +.ENDIF + +.IFDEF IMCONV +.IFDEF USER_IMCONVLIBDIR +IMCONVLIBDIR = $(USER_IMCONVLIBDIR) +.ELSE +IMCONVLIBDIR = +.ENDIF +.IFDEF USER_IMCONVINCDIR +IMCONVINCDIR = ,$(USER_IMCONVINCDIR) +.ELSE +IMCONVINCDIR = +.ENDIF + +IMCONVDEFINES = ,IMCONV +IMCONVLIB = $(IMCONVLIBDIR)LIBIM,$(IMCONVLIBDIR)LIBSDSC +.ELSE +IMCONVLIBDIR = +IMCONVINCDIR = + +IMCONVDEFINES = +IMCONVLIB = +.ENDIF + +.IFDEF USE_M4 +M4LIBDIR = +M4INCDIR = + +M4DEFINES = ,USEM4 +M4LIB = $(M4LIBDIR) +.ELSE +M4LIBDIR = +M4INCDIR = + +M4DEFINES = +M4LIB = +.ENDIF + +.IFDEF GNOME +GNOMEDEFINES = ,GNOME +GNOMESRC = GNOME.C +GNOMEOBJ = ,$(GOAL)GNOME.$(EXT)OBJ +.ELSE +GNOMEDEFINES = +GNOMESRC = +GNOMEOBJ = +.ENDIF + +.IFDEF USE_SOUND +.IFDEF USER_SOUNDLIBDIR +SOUNDLIBDIR = $(USER_SOUNDLIBDIR) +.ELSE +SOUNDLIBDIR = +.ENDIF +.IFDEF USER_SOUNDINCDIR +SOUNDINCDIR = ,$(USER_SOUNDINCDIR) +.ELSE +SOUNDINCDIR = +.ENDIF + +SOUNDDEFINES = ,SOUNDS +SOUNDLIB = $(SOUNDLIBDIR)LIBRPLAY +SOUNDSRC = SOUND.C +SOUNDOBJ = ,$(GOAL)SOUND.$(EXT)OBJ +.ELSE +SOUNDLIBDIR = +SOUNDINCDIR = + +SOUNDDEFINES = +SOUNDLIB = +SOUNDSRC = +SOUNDOBJ = +.ENDIF + +MORE_CFLAGS = /DEBUG/DEFINE=(VMS$(M4DEFINES)$(GNOMEDEFINES)$(IMCONVDEFINES)$(XPMDEFINES)$(JPEGDEFINES)$(SOUNDDEFINES),FUNCPROTO=14,C_ALLOCA,""emacs"",BLOCK_INPUT,EXIT_ENDSESSION=$(EXIT_ENDSESSION)''extra_defs')''extra_includes' +EXTRA_INCLUDES = $(M4INCDIR)$(IMCONVINCDIR)$(XPMINCDIR)$(JPEGINCDIR)$(SOUNDINCDIR) + +LD = link +#LDFLAGS = /DEBUG +LDFLAGS = /NOTRACE + +# All the files we distribute +DISTFILES = readme.* changes. *.txt *.doc *.*mms imakefile.* *.com *.c *.c_vms *.h *.h_vms *.y *.l *.ctwmrc *.*orig *.bm [.xpm]*.* + +# Some files we distribute in the source-only archive +SRCDISTEXTRA = *.*diff + +# Some files we distribute in the .zip archive file. +ZIPDISTEXTRA = *.*_obj + +# Files we NEVER distribute. I have no idea how I will deal with this +# regarding tar, though... +NODIST = gram.tab.c gram.tab.h lex.c + +all : setup + @ ! We define the MMS/MMK macros as symbols, or we might get problems + @ ! we too long DCL lines... (suggested by Michael Lemke.) + LD="$(LD)" + LDFLAGS="$(LDFLAGS)" + GOAL="$(GOAL)" + X11XMU="$(X11XMU)" + X11XMULIB="$(X11XMULIB)" + X11SM="$(X11SM)" + X11SMLIB="$(X11SMLIB)" + XPMINCDIR="$(XPMINCDIR)" + XPMLIBDIR="$(XPMLIBDIR)" + XPMDEFINES="$(XPMDEFINES)" + XPMLIB="$(XPMLIB)" + JPEGINCDIR="$(JPEGINCDIR)" + JPEGLIBDIR="$(JPEGLIBDIR)" + JPEGDEFINES="$(JPEGDEFINES)" + JPEGLIB="$(JPEGLIB)" + IMCONVINCDIR="$(IMCONVINCDIR)" + IMCONVLIBDIR="$(IMCONVLIBDIR)" + IMCONVDEFINES="$(IMCONVDEFINES)" + IMCONVLIB="$(IMCONVLIB)" + M4INCDIR="$(M4INCDIR)" + M4LIBDIR="$(M4LIBDIR)" + M4DEFINES="$(M4DEFINES)" + M4LIB="$(M4LIB)" + GNOMEDEFINES="$(GNOMEDEFINES)" + GNOMESRC="$(GNOMESRC)" + GNOMEOBJ="$(GNOMEOBJ)" + SOUNDINCDIR="$(SOUNDINCDIR)" + SOUNDLIBDIR="$(SOUNDLIBDIR)" + SOUNDDEFINES="$(SOUNDDEFINES)" + SOUNDLIB="$(SOUNDLIB)" + SOUNDSRC="$(SOUNDSRC)" + SOUNDOBJ="$(SOUNDOBJ)" + $(MMS) $(MMSQUALIFIERS) /OVERRIDE /DESCRIPTION=DESCRIP.SUBMMS - + /MACRO=(EXT="''ext'",EXE_EXT="''exe_ext'"'do_option''dep_xwdfile') + +setup : version.opt + __axp = f$getsyi("CPU") .ge. 128 + __tmp = f$edit("$(CFLAGS)","UPCASE") + __decc = f$search("SYS$SYSTEM:DECC$COMPILER.EXE") .nes. "" - + .and. __tmp - "/VAXC" .eqs. __tmp + ext = "VAX_" + if __axp then ext = "AXP_" + exe_ext = ext + if .not. __decc then ext = ext + "VAXC_" + opt_ext = "DECC_OPT" + if .not. __decc then opt_ext = "VAXC_OPT" + CLIB = "" + if .not. __decc then CLIB = "SYS$SHARE:VAXCRTL/SHARE" + extra_defs = "" + if .not. __decc then extra_defs = extra_defs + ",NO_LOCALE" + if f$search("XWDFILE.H") .nes. "" then - + extra_defs = extra_defs + ",HAVE_XWDFILE_H" + dep_xwdfile = "" + if extra_defs - ",HAVE_XWDFILE_H" .nes. extra_defs then - + dep_xwdfile = ",DEP_XWDFILE=""XWDFILE.H""" + extra_includes = "$(EXTRA_INCLUDES)" - "," + if extra_includes .nes. "" then - + extra_includes = "/INCLUDE=(" + extra_includes + ")" + ! Consider that the default CFLAGS contains `/OBJECT=$*.OBJ' + CFLAGS = "$(CFLAGS)" - "/OBJECT=SETUP.OBJ" + "$(MORE_CFLAGS)" + do_option = ",OPTION=""$(GOAL)CTWM.''opt_ext'"",OPTIONCMD="",$(GOAL)CTWM.''opt_ext'/OPT""" + if __decc then CFLAGS = "/DECC/PREFIX=ALL " + CFLAGS + if __decc .and. __axp then CFLAGS = CFLAGS + "/L_DOUBLE=64" + +!ctwm.hlp : ctwm.rnh +! runoff ctwm.rnh + +mostlyclean : + - delete/log *.*_obj;* + - delete/log *.*_opt;*,*.opt;* + - purge/log + +clean : mostlyclean + - delete/log *.*_exe;* + - delete/log *.hlp;* + - delete/log zip.*;* + +!######################## Only for distributors ############################# + +!The clauses following are not meant to look at if you don't intend to make +!a ctwm distribution. With time, this section will most probably be filled +!with one hack after the other. I'll try to put some comments so you won't +!get too much lost... /Richard Levitte + +dist_tar : setup hackfiles versions real_dist_tar unhackfiles FRC + @ ! + +real_dist_tar : + - tar -cvf ctwm'vmsver'-src.tar $(DISTFILES) $(SRCDISTEXTRA) + +dist_zip : setup hackfiles versions zip.comment-link real_dist_zip - + unhackfiles FRC + @ ! + +real_dist_zip : + - define/user sys$input zip.comment-link + - define/user sys$output zip.log + - zip -"Vz" ctwm'vmsver'.zip $(DISTFILES) $(ZIPDISTEXTRA) -x $(NODIST) + +zip_src : setup hackfiles versions zip.comment real_zip_src unhackfiles - + FRC + @ ! + +real_zip_src : + - define/user sys$input zip.comment + - define/user sys$output zip.log + - zip -"z" ctwm'vmsver'-src.zip $(DISTFILES) $(SRCDISTEXTRA) -x $(NODIST) + +hackfiles : LEX.C_VMS GRAM.C_VMS GRAM.H_VMS + - purge LEX.C + - rename LEX.C LEX.C_VMS + - purge LEX.C_VMS + - purge GRAM.C + - rename GRAM.C GRAM.C_VMS + - purge GRAM.C_VMS + - purge GRAM.H + - rename GRAM.H GRAM.H_VMS + - purge GRAM.H_VMS + - delete XWDFILE.H;* + @ write sys$output "**************************************************" + @ write sys$output "* WARNING!!! *" + @ write sys$output "* Some of your files will be HACKED in a moment. *" +.IFDEF NONOVICE + @ write sys$output "* I'll wait five seconds before I start. *" +.ELSE + @ write sys$output "* I'll wait one minute before I start. *" +.ENDIF + @ write sys$output "* The hacked files will be restored when I've *" + @ write sys$output "* finished doing the distribution you wanted *" + @ write sys$output "* DO NOT STOP WHEN IT HAS STARTED! *" + @ write sys$output "* If you do anyway, do a `MMS unhackfiles' and *" + @ write sys$output "* all hacks will hopefully be cleared. In any *" + @ write sys$output "* case, DO NOT PURGE before this is resolved *" + @ write sys$output "* resolved (you will be told when all is OK) *" + @ write sys$output "**************************************************" +.IFDEF NONOVICE +.ELSE + @ wait 0:0:30 + @ write sys$output "*** 30 seconds left" + @ wait 0:0:15 + @ write sys$output "*** 15 seconds left" + @ wait 0:0:5 + @ write sys$output "*** 10 seconds left" + @ wait 0:0:5 + @ write sys$output "*** 5 seconds left" +.ENDIF + @ wait 0:0:5 + @ write sys$output "*** OK, here goes..." + @ write sys$output "*** Processing XPM.H" + - purge XPM.H + - rename XPM.H XPM.H_NODIST + @ !Now, to the real hackery! + @ open/write foo routine.tpu_tmp + @ write foo "input_file:=GET_INFO(COMMAND_LINE, ""file_name"");" + @ write foo "main_buffer := CREATE_BUFFER (""main"", input_file);" + @ write foo "position (beginning_of (main_buffer));" + @ write foo "loop" + @ write foo " r := search_quietly (LINE_BEGIN+(""XPMLIB=""+unanchor+"""")@r0+LINE_END, FORWARD);" + @ write foo " EXITIF r = 0;" + @ write foo " if beginning_of(r0) <> end_of(r0)" + @ write foo " then" + @ write foo " erase (r0);" + @ write foo " position (r0);" + @ write foo " copy_text (""XPMLIB=$(FAKE_XPMLIB)descrip.mms"");" + @ write foo " endif;" + @ write foo " position (end_of (r));" + @ write foo "endloop;" + @ write foo "position (beginning_of (main_buffer));" + @ write foo "loop" + @ write foo " r := search_quietly (LINE_BEGIN+(""$ define/nolog xpmlib ""+unanchor+"""")@r0+LINE_END, FORWARD);" + @ write foo " EXITIF r = 0;" + @ write foo " if beginning_of(r0) <> end_of(r0)" + @ write foo " then" + @ write foo " erase (r0);" + @ write foo " position (r0);" + @ write foo " copy_text (""$ define/nolog xpmlib $(FAKE_XPMLIB)make.com"");" + @ write foo " endif;" + @ write foo " position (end_of (r));" + @ write foo "endloop;" + @ write foo "write_file(main_buffer, get_info (command_line, ""output_file""));" + @ write foo "quit;" + @ close foo + @ save_mesg = f$environment("MESSAGE") + @ ! set message/nofacility/noidentification/noseverity/notext + @ write sys$output "*** Processing DESCRIP.MMS" + @ edit/tpu/nosection/nodisplay - + /command=routine.tpu_tmp/out=descrip.mms - + descrip.mms + @ write sys$output "*** Processing MAKE.COM" + @ edit/tpu/nosection/nodisplay - + /command=routine.tpu_tmp/out=make.com - + make.com + @ delete routine.tpu_tmp;* + @ set message'save_mesg' + +unhackfiles : + @ __globalresult := YES + @ write sys$output "*** Trying to restore DESCRIP.MMS" + @- __result = f$search("descrip.mms") .nes. "" + @- if __result then __result = f$search("descrip.mms") .nes. "" + @- if __result then search descrip.mms "$(FAKE_XPMLIB)descrip.mms"/output=descrip.search + @- if __result .and. f$file("descrip.search","eof") .ne. 0 then delete descrip.mms;/log + @- if __result .and. f$file("descrip.search","eof") .eq. 0 then - + write sys$output "*** ... didn't need to." + @- search descrip.mms "$(FAKE_XPMLIB)descrip.mms"/output=descrip.search + @- if __result .and. f$file("descrip.search","eof") .ne. 0 then __globalresult := no + @- if .not. __result .and. f$file("descrip.search","eof") .ne. 0 then - + write sys$output "You will need to change the definition of XPMLIB in DESCRIP.MMS." + @- delete descrip.search;* + @ write sys$output "*** Trying to restore MAKE.COM" + @- __result = f$search("make.com") .nes. "" + @- if __result then __result = f$search("make.com") .nes. "" + @- if __result then search make.com "$(FAKE_XPMLIB)make.com"/output=make.search + @- if __result .and. f$file("make.search","eof") .ne. 0 then delete make.com;/log + @- if __result .and. f$file("make.search","eof") .eq. 0 then - + write sys$output "*** ... didn't need to." + @- search make.com "$(FAKE_XPMLIB)make.com"/output=make.search + @- if __result .and. f$file("make.search","eof") .ne. 0 then __globalresult := no + @- if .not. __result .and. f$file("make.search","eof") .ne. 0 then - + write sys$output "You will need to change the definition of XPMLIB in MAKE.COM." + @- delete make.search;* + @ write sys$output "*** Trying to restore XPM.H" + @- __result = f$search("XPM.H") .eqs. "" + @- if __result then rename XPM.H_NODIST XPM.H/LOG + @- if .not. __result then - + write sys$output "*** ... didn't need to." + @ if .not. __globalresult then - + write sys$output "********************************************" + @ if .not. __globalresult then - + write sys$output "* WARNING!!! *" + @ if .not. __globalresult then - + write sys$output "* You need to do `MMS unhackfiles' again. *" + @ if .not. __globalresult then - + write sys$output "********************************************" + @ if __globalresult then - + write sys$output "********************************************" + @ if __globalresult then - + write sys$output "* There, done. You're safe now... *" + @ if __globalresult then - + write sys$output "* It's possible that some things will get *" + @ if __globalresult then - + write sys$output "* recompiled if you issue MMS again, but *" + @ if __globalresult then - + write sys$output "* that's less important... *" + @ if __globalresult then - + write sys$output "********************************************" + +version.opt : version.c descrip.mms + @ sear version.c "#define VERSION_ID"/out=version.tmp + @- open/read foo version.tmp + @- read foo line + @- close foo + @- delete version.tmp;* + @ version = f$extract(0,10,f$element(1,"""",line)) + open/write foo version.opt + write foo "NAME=""CTWM""" + write foo "IDENT=""V''version'""" + close foo + +versions : version.opt FRC + @- open/read foo version.opt + @- read foo line ! the name + @- read foo line ! the ident + @- close foo + @ version = f$extract(1,10,f$element(1,"""",line)) + major = f$element(0,".",version) + minor = f$element(0,"-",f$element(1,".",version)) + update = f$element(0," ",f$element(1,"-",version)) + testword = f$element(1," ",version) + vmsver = "0''major'''minor'" + if major .gt. 9 then vmsver = "''major'''minor'" + if update .nes. "-" then vmsver = "U''update'"+vmsver + if testword .nes. " " then vmsver = vmsver+"-"+testword + +zip.comment : versions descrip.mms + - open/write foo zip.comment + - write foo "" + - write foo "CTWM ''version' -- Neat window manager for Un*x and VMS" + - write foo "" + - write foo "This version runs on both OpenVMS/VAX and OpenVMS/AXP." + - write foo "" + - close foo + +zip.comment-link : versions descrip.mms + - open/write foo zip.comment-link + - write foo "" + - write foo "CTWM ''version' -- Neat window manager for Un*x and VMS" + - write foo "" + - write foo "This version runs on both OpenVMS/VAX and OpenVMS/AXP." + - write foo "" + - write foo "To get the executable, just do @LINK after you extracted" + - write foo "the files, then follow the installation instructions in" + - write foo "README.VMS." + - write foo "" + - close foo Index: external/mit/ctwm/dist/descrip.submms =================================================================== RCS file: external/mit/ctwm/dist/descrip.submms diff -N external/mit/ctwm/dist/descrip.submms --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/descrip.submms 3 Sep 2015 12:19:47 -0000 @@ -0,0 +1,221 @@ +# Submakefile for ctwm +# Do NOT use this description file directly. Instead, just type MMS, +# and this one will be included. + +OBJS = $(GOAL)GRAM.$(EXT)OBJ,$(GOAL)LEX.$(EXT)OBJ,$(GOAL)DEFTWMRC.$(EXT)OBJ,- + $(GOAL)ADD_WINDOW.$(EXT)OBJ,$(GOAL)GC.$(EXT)OBJ,$(GOAL)LIST.$(EXT)OBJ,- + $(GOAL)CTWM.$(EXT)OBJ,$(GOAL)PARSE.$(EXT)OBJ,$(GOAL)MENUS.$(EXT)OBJ,- + $(GOAL)EVENTS.$(EXT)OBJ,$(GOAL)RESIZE.$(EXT)OBJ,$(GOAL)UTIL.$(EXT)OBJ,- + $(GOAL)VERSION.$(EXT)OBJ,$(GOAL)ICONMGR.$(EXT)OBJ,- + $(GOAL)CURSOR.$(EXT)OBJ,$(GOAL)ICONS.$(EXT)OBJ,- + $(GOAL)WORKMGR.$(EXT)OBJ,$(GOAL)WINDOWBOX.$(EXT)OBJ,- + $(GOAL)CLICKTOFOCUS.$(EXT)OBJ,$(GOAL)VSCREEN.$(EXT)OBJ,- + $(GOAL)SESSION.$(EXT)OBJ$(GNOMEOBJ)$(SOUNDOBJ),- + $(GOAL)VMS_CMD_SERVICES.$(EXT)OBJ,- + $(GOAL)LNM.$(EXT)OBJ,$(GOAL)ALLOCA.$(EXT)OBJ + +.FIRST : + DEFINE X11XMU $(X11XMU) + DEFINE X11SM $(X11SM) + +.SUFFIXES : .$(EXT)OBJ .C + +.C.$(EXT)OBJ : + $(CC) $(CFLAGS) $< /OBJECT=$@ + +$(GOAL)CTWM.$(EXE_EXT)EXE : $(OBJS) $(OPTION) VERSION.OPT + $(LD) $(LDFLAGS) /exec=$*.$(EXE_EXT)exe $(OBJS),VERSION.OPT/OPT - + $(OPTIONCMD) + +LEX.C : LEX.L + @ WRITE SYS$ERROR "****" + @ WRITE SYS$ERROR "**** Ignore %DCL-W-IVVERB" + @ WRITE SYS$ERROR "****" + - FLEX LEX.L + @ WRITE SYS$ERROR "**** You can open your eyes now" + __RESULT = F$SEARCH("LEXYY.C") + IF __RESULT .NES. "" THEN RENAME LEXYY.C LEX.C/LOG + IF __RESULT .EQS. "" THEN COPY LEX.C_VMS LEX.C/LOG + +GRAM.C GRAM.H : GRAM.Y + @ WRITE SYS$ERROR "****" + @ WRITE SYS$ERROR "**** Ignore %DCL-W-IVVERB" + @ WRITE SYS$ERROR "****" + - BISON /DEF/YACC GRAM.Y + @ WRITE SYS$ERROR "**** You can open your eyes now" + __RESULT = F$SEARCH("Y_TAB.C") + IF __RESULT .NES. "" THEN RENAME Y_TAB.C GRAM.C/LOG + IF __RESULT .NES. "" THEN RENAME Y_TAB.H GRAM.H/LOG + IF __RESULT .EQS. "" THEN COPY GRAM.C_VMS GRAM.C/LOG + IF __RESULT .EQS. "" THEN COPY GRAM.H_VMS GRAM.H/LOG + +DEFTWMRC.C : SYSTEM.CTWMRC GENDEFTWMRC.COM + @GENDEFTWMRC.COM + +$(OPTION) : DESCRIP.MMS DESCRIP.SUBMMS + if "$(CLIB)" .nes. "" then write foo "$(CLIB)" + __result := $(XPMLIB).OLB + if f$search(__result) .eqs. "" then - + __result := $(XPMLIB).OLB + if "$(EXT)" .eqs. "VAX_VAXC_" .and. - + f$search("$(XPMLIB).OLB_VAXC") .nes. "" then - + __result := $(XPMLIB).OLB_VAXC + if "$(EXT)" .eqs. "VAX_" .and. - + f$search("$(XPMLIB).OLB_DECC") .nes. "" then - + __result := $(XPMLIB).OLB_DECC + if "$(EXT)" .eqs. "AXP_" .and. - + f$search("$(XPMLIB).OLB_AXP") .nes. "" then - + __result := $(XPMLIB).OLB_AXP + @ !The following will cause a proper error message, says + @ !Michael Lemke. + if f$search(__result) .eqs. "" then - + libr/list=nl: '__result' + open/write foo $(OPTION) + write foo __result,"/LIB" + write foo "$(X11XMULIB)" + write foo "$(X11SMLIB)/SHARE" + write foo "SYS$SHARE:DECW$XTSHR/SHARE" + write foo "SYS$SHARE:DECW$XEXTLIBSHR/SHARE" + write foo "SYS$SHARE:DECW$XLIBSHR/SHARE" + write foo "SYS$SHARE:DECW$ICELIB/SHARE" + close foo + +xwdfile.h : descrip.mms + @ ! This is a pure hack to circumvent a bug in the file provided by + @ ! Digital. This is so ugly we don't want the user to see what + @ ! really happens. + @ ! But perhaps we'll give him just a little hint, huh? :-) + @ write sys$output "*** Doing some hackery with XWDFile.h... Sit tight" + @ __result := NO + @ if f$search("DECW$UTILS:XWDFILE.H") .nes. "" then __result := YES + @ if __result then open/write foo xwdfile.tpu_tmp + @ if __result then write foo - + "input_file:=GET_INFO(COMMAND_LINE, ""file_name"");" + @ if __result then write foo - + "main_buffer := CREATE_BUFFER (""main"", input_file);" + @ if __result then write foo - + "position (beginning_of (main_buffer));" + @ if __result then write foo - + "loop" + @ if __result then write foo - + " r := search_quietly (""""""copyright.h"""""", FORWARD);" + @ if __result then write foo - + " EXITIF r = 0;" + @ if __result then write foo - + " if beginning_of(r) <> end_of(r)" + @ if __result then write foo - + " then" + @ if __result then write foo - + " erase (r);" + @ if __result then write foo - + " position (r);" + @ if __result then write foo - + " copy_text ("""");" + @ if __result then write foo - + " endif;" + @ if __result then write foo - + " position (end_of (r));" + @ if __result then write foo - + "endloop;" + @ if __result then write foo - + "position (beginning_of (main_buffer));" + @ if __result then write foo - + "loop" + @ if __result then write foo - + " r := search_quietly (LINE_BEGIN + ""struct {"", FORWARD);" + @ if __result then write foo - + " EXITIF r = 0;" + @ if __result then write foo - + " if beginning_of(r) <> end_of(r)" + @ if __result then write foo - + " then" + @ if __result then write foo - + " erase (r);" + @ if __result then write foo - + " position (r);" + @ if __result then write foo - + " copy_text (""typedef struct {"");" + @ if __result then write foo - + " endif;" + @ if __result then write foo - + " position (end_of (r));" + @ if __result then write foo - + "endloop;" + @ if __result then write foo - + "write_file(main_buffer, get_info (command_line, ""output_file""));" + @ if __result then write foo "quit;" + @ if __result then close foo + @ if __result then save_mesg = f$environment("MESSAGE") + @ !if __result then - + ! set message/nofacility/noidentification/noseverity/notext + @ if __result then edit/tpu/nosection/nodisplay - + /command=xwdfile.tpu_tmp/out=xwdfile.h - + decw$utils:xwdfile.h + @ if __result then delete xwdfile.tpu_tmp;* + @ if __result then set message'save_mesg' + @ if __result then write sys$output "*** There, done." + +ADD_WINDOW.$(EXT)OBJ : ADD_WINDOW.C - + TWM.H ADD_WINDOW.H UTIL.H RESIZE.H PARSE.H GRAM.H LIST.H EVENTS.H - + MENUS.H SCREEN.H ICONS.H ICONMGR.H - + LIST.H MENUS.H ICONMGR.H WORKMGR.H +CLICKTOFOCUS.$(EXT)OBJ : CLICKTOFOCUS.C - + TWM.H SCREEN.H UTIL.H - + LIST.H MENUS.H ICONMGR.H WORKMGR.H +CTWM.$(EXT)OBJ : CTWM.C - + TWM.H ADD_WINDOW.H GC.H PARSE.H VERSION.H MENUS.H EVENTS.H UTIL.H - + GRAM.H SCREEN.H ICONS.H ICONMGR.H - + LIST.H MENUS.H ICONMGR.H WORKMGR.H +CURSOR.$(EXT)OBJ : CURSOR.C - + TWM.H SCREEN.H UTIL.H - + LIST.H MENUS.H ICONMGR.H WORKMGR.H +DEFTWMRC.$(EXT)OBJ : DEFTWMRC.C +EVENTS.$(EXT)OBJ : EVENTS.C - + TWM.H ADD_WINDOW.H MENUS.H EVENTS.H RESIZE.H PARSE.H GRAM.H UTIL.H - + SCREEN.H ICONS.H ICONMGR.H VERSION.H - + LIST.H MENUS.H ICONMGR.H WORKMGR.H +GC.$(EXT)OBJ : GC.C - + TWM.H UTIL.H GRAM.H SCREEN.H - + LIST.H MENUS.H ICONMGR.H WORKMGR.H +GRAM.$(EXT)OBJ : GRAM.C - + TWM.H MENUS.H ICONS.H ADD_WINDOW.H LIST.H UTIL.H SCREEN.H PARSE.H - + LIST.H MENUS.H ICONMGR.H WORKMGR.H +ICONMGR.$(EXT)OBJ : ICONMGR.C - + TWM.H UTIL.H PARSE.H SCREEN.H RESIZE.H ADD_WINDOW.H SICONIFY.BM - + LIST.H MENUS.H ICONMGR.H WORKMGR.H +ICONS.$(EXT)OBJ : ICONS.C - + TWM.H SCREEN.H ICONS.H GRAM.H LIST.H PARSE.H UTIL.H - + LIST.H MENUS.H ICONMGR.H WORKMGR.H +LEX.$(EXT)OBJ : LEX.C - + GRAM.H PARSE.H +LIST.$(EXT)OBJ : LIST.C - + TWM.H SCREEN.H GRAM.H UTIL.H - + LIST.H MENUS.H ICONMGR.H WORKMGR.H +MENUS.$(EXT)OBJ : MENUS.C - + TWM.H GC.H MENUS.H RESIZE.H EVENTS.H UTIL.H PARSE.H GRAM.H SCREEN.H - + ICONS.H VMS_CMD_SERVICES.H VERSION.H - + LIST.H MENUS.H ICONMGR.H WORKMGR.H +PARSE.$(EXT)OBJ : PARSE.C - + TWM.H SCREEN.H MENUS.H UTIL.H GRAM.H PARSE.H VERSION.H - + LIST.H MENUS.H ICONMGR.H WORKMGR.H +RESIZE.$(EXT)OBJ : RESIZE.C - + TWM.H PARSE.H UTIL.H RESIZE.H ADD_WINDOW.H SCREEN.H - + LIST.H MENUS.H ICONMGR.H WORKMGR.H +UTIL.$(EXT)OBJ : UTIL.C - + TWM.H UTIL.H GRAM.H SCREEN.H ICONS.H SICONIFY.BM - + LIST.H MENUS.H ICONMGR.H WORKMGR.H $(DEP_XWDFILE) +VERSION.$(EXT)OBJ : VERSION.C +WINDOWBOX.$(EXT)OBJ : WINDOWBOX.C - + TWM.H SCREEN.H ADD_WINDOW.H RESIZE.H WINDOWBOX.H - + TYPES.H LIST.H - + ICONMGR.H - + GRAM.H - + MENUS.H VSCREEN.H WORKMGR.H +WORKMGR.$(EXT)OBJ : WORKMGR.C - + TWM.H UTIL.H PARSE.H SCREEN.H ICONS.H RESIZE.H ADD_WINDOW.H EVENTS.H - + GRAM.H - + LIST.H MENUS.H ICONMGR.H WORKMGR.H +VMS_CMD_SERVICES.$(EXT)OBJ : - + VMS_CMD_SERVICES.C VMS_CMD_SERVICES.H LNM.H +LNM.$(EXT)OBJ : LNM.C +ALLOCA.$(EXT)OBJ : ALLOCA.C Index: external/mit/ctwm/dist/events.c =================================================================== RCS file: external/mit/ctwm/dist/events.c diff -N external/mit/ctwm/dist/events.c --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/events.c 3 Sep 2015 12:19:48 -0000 @@ -0,0 +1,4405 @@ +/*****************************************************************************/ +/** Copyright 1988 by Evans & Sutherland Computer Corporation, **/ +/** Salt Lake City, Utah **/ +/** Portions Copyright 1989 by the Massachusetts Institute of Technology **/ +/** Cambridge, Massachusetts **/ +/** **/ +/** All Rights Reserved **/ +/** **/ +/** Permission to use, copy, modify, and distribute this software and **/ +/** its documentation for any purpose and without fee is hereby **/ +/** granted, provided that the above copyright notice appear in all **/ +/** copies and that both that copyright notice and this permis- **/ +/** sion notice appear in supporting documentation, and that the **/ +/** names of Evans & Sutherland and M.I.T. not be used in advertising **/ +/** in publicity pertaining to distribution of the software without **/ +/** specific, written prior permission. **/ +/** **/ +/** EVANS & SUTHERLAND AND M.I.T. DISCLAIM ALL WARRANTIES WITH REGARD **/ +/** TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANT- **/ +/** ABILITY AND FITNESS, IN NO EVENT SHALL EVANS & SUTHERLAND OR **/ +/** M.I.T. BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAM- **/ +/** AGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA **/ +/** OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER **/ +/** TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE **/ +/** OR PERFORMANCE OF THIS SOFTWARE. **/ +/*****************************************************************************/ +/* + * [ ctwm ] + * + * Copyright 1992 Claude Lecommandeur. + * + * Permission to use, copy, modify and distribute this software [ctwm] and + * its documentation for any purpose is hereby granted without fee, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting documen- + * tation, and that the name of Claude Lecommandeur not be used in adverti- + * sing or publicity pertaining to distribution of the software without + * specific, written prior permission. Claude Lecommandeur make no represen- + * tations about the suitability of this software for any purpose. It is + * provided "as is" without express or implied warranty. + * + * Claude Lecommandeur DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO + * EVENT SHALL Claude Lecommandeur BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF + * USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR + * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + * + * Author: Claude Lecommandeur [ lecom@sic.epfl.ch ][ April 1992 ] + */ + + +/*********************************************************************** + * + * $XConsortium: events.c,v 1.182 91/07/17 13:59:14 dave Exp $ + * + * twm event handling + * + * 17-Nov-87 Thomas E. LaStrange File created + * + * Do the necessary modification to be integrated in ctwm. + * Can no longer be used for the standard twm. + * + * 22-April-92 Claude Lecommandeur. + * + * + ***********************************************************************/ + +#include +#include +#ifndef VMS +#include +#endif +#if defined(AIXV3) || defined(_SYSTYPE_SVR4) || defined(ibm) || defined __QNX__ +#include +#endif +#include + +#include "twm.h" +#ifdef VMS +#include +#else +#include +#endif +#include "add_window.h" +#include "clicktofocus.h" +#include "menus.h" +#include "events.h" +#include "resize.h" +#include "parse.h" +#include "util.h" +#include "screen.h" +#include "icons.h" +#include "iconmgr.h" +#include "version.h" + +#ifdef VMS +#include +#include +#include +#define USE_SIGNALS +#else +#define MAX(x,y) ((x)>(y)?(x):(y)) +#define MIN(x,y) ((x)<(y)?(x):(y)) +#endif +#define ABS(x) ((x)<0?-(x):(x)) + +extern int iconifybox_width, iconifybox_height; +extern unsigned int mods_used; +extern int menuFromFrameOrWindowOrTitlebar; +extern char *CurrentSelectedWorkspace; +extern int RaiseDelay; + +#ifdef USE_SIGNALS +extern Bool AnimationPending; +#else /* USE_SIGNALS */ +extern struct timeval AnimateTimeout; +#endif /* USE_SIGNALS */ +extern int AnimationSpeed; +extern Bool AnimationActive; +extern Bool MaybeAnimate; + +extern int AlternateKeymap; +extern Bool AlternateContext; + +static void CtwmNextEvent (Display *display, XEvent *event); +static void RedoIcon(void); +static void do_key_menu (MenuRoot *menu, /* menu to pop up */ + Window w); /* invoking window or None */ +void RedoIconName(void); +extern void twmrc_error_prefix(void); + +#ifdef SOUNDS +extern void play_sound(int snd); +#endif +FILE *tracefile = NULL; + +#define MAX_X_EVENT 256 +event_proc EventHandler[MAX_X_EVENT]; /* event handler jump table */ +char *Action; +int Context = C_NO_CONTEXT; /* current button press context */ +TwmWindow *ButtonWindow; /* button press window structure */ +XEvent ButtonEvent; /* button press event */ +XEvent Event; /* the current event */ +TwmWindow *Tmp_win; /* the current twm window */ + +extern Window captiveroot; +Window DragWindow; /* variables used in moving windows */ +int origDragX; +int origDragY; +int DragX; +int DragY; +unsigned int DragWidth; +unsigned int DragHeight; +unsigned int DragBW; +int CurrentDragX; +int CurrentDragY; + +/* Vars to tell if the resize has moved. */ +extern int ResizeOrigX; +extern int ResizeOrigY; + +static int enter_flag; +static int leave_flag; +static int ColortableThrashing; +static TwmWindow *enter_win, *raise_win, *leave_win, *lower_win; + +int ButtonPressed = -1; +int Cancel = FALSE; + +void HandleCreateNotify(void); +void HandleShapeNotify (void); +void HandleFocusChange (void); +extern int ShapeEventBase, ShapeErrorBase; + +extern Window lowerontop; + +#ifdef GNOME +# include "gnomewindefs.h" + extern Atom _XA_WIN_WORKSPACE; + extern Atom _XA_WIN_STATE; +#endif /* GNOME */ + +extern Atom _XA_WM_OCCUPATION; +extern Atom _XA_WM_CURRENTWORKSPACE; + +int GnomeProxyButtonPress = -1; + +/*#define TRACE_FOCUS*/ +/*#define TRACE*/ + +static void dumpevent (XEvent *e); + +#if defined(__hpux) && !defined(_XPG4_EXTENDED) +# define FDSET int* +#else +# define FDSET fd_set* +#endif + +static unsigned int set_mask_ignore (unsigned int modifier) +{ + int i; + unsigned int ModifierMask[8] = { ShiftMask, ControlMask, LockMask, + Mod1Mask, Mod2Mask, Mod3Mask, Mod4Mask, + Mod5Mask }; + + if (Scr->IgnoreLockModifier) modifier &= ~LockMask; + for (i = 0 ; i < 8 ; i++) { + if (Scr->IgnoreModifier & ModifierMask [i]) modifier &= ~ModifierMask [i]; + } + return modifier; +} + +void AutoRaiseWindow (TwmWindow *tmp) +{ + RaiseWindow (tmp); + + if (ActiveMenu && ActiveMenu->w) XRaiseWindow (dpy, ActiveMenu->w); + XSync (dpy, 0); + enter_win = NULL; + enter_flag = TRUE; + raise_win = tmp; + WMapRaise (tmp); +} + +void SetRaiseWindow (TwmWindow *tmp) +{ + enter_flag = TRUE; + enter_win = NULL; + raise_win = tmp; + leave_win = NULL; + leave_flag = FALSE; + lower_win = NULL; + XSync (dpy, 0); +} + +void AutoLowerWindow (TwmWindow *tmp) +{ + LowerWindow (tmp); + + if (ActiveMenu && ActiveMenu->w) XRaiseWindow (dpy, ActiveMenu->w); + XSync (dpy, 0); + enter_win = NULL; + enter_flag = FALSE; + raise_win = NULL; + leave_win = NULL; + leave_flag = TRUE; + lower_win = tmp; + WMapLower (tmp); +} + + + +/*********************************************************************** + * + * Procedure: + * InitEvents - initialize the event jump table + * + *********************************************************************** + */ + +void InitEvents(void) +{ + int i; + + + ResizeWindow = (Window) 0; + DragWindow = (Window) 0; + enter_flag = FALSE; + enter_win = raise_win = NULL; + leave_flag = FALSE; + leave_win = lower_win = NULL; + + for (i = 0; i < MAX_X_EVENT; i++) + EventHandler[i] = HandleUnknown; + + EventHandler[Expose] = HandleExpose; + EventHandler[CreateNotify] = HandleCreateNotify; + EventHandler[DestroyNotify] = HandleDestroyNotify; + EventHandler[MapRequest] = HandleMapRequest; + EventHandler[MapNotify] = HandleMapNotify; + EventHandler[UnmapNotify] = HandleUnmapNotify; + EventHandler[MotionNotify] = HandleMotionNotify; + EventHandler[ButtonRelease] = HandleButtonRelease; + EventHandler[ButtonPress] = HandleButtonPress; + EventHandler[EnterNotify] = HandleEnterNotify; + EventHandler[LeaveNotify] = HandleLeaveNotify; + EventHandler[ConfigureRequest] = HandleConfigureRequest; + EventHandler[ClientMessage] = HandleClientMessage; + EventHandler[PropertyNotify] = HandlePropertyNotify; + EventHandler[KeyPress] = HandleKeyPress; + EventHandler[KeyRelease] = HandleKeyRelease; + EventHandler[ColormapNotify] = HandleColormapNotify; + EventHandler[VisibilityNotify] = HandleVisibilityNotify; + EventHandler[FocusIn] = HandleFocusChange; + EventHandler[FocusOut] = HandleFocusChange; + if (HasShape) + EventHandler[ShapeEventBase+ShapeNotify] = HandleShapeNotify; +} + + + + +Time lastTimestamp = CurrentTime; /* until Xlib does this for us */ + +Bool StashEventTime (register XEvent *ev) +{ + switch (ev->type) { + case KeyPress: + case KeyRelease: + lastTimestamp = ev->xkey.time; + return True; + case ButtonPress: + case ButtonRelease: + lastTimestamp = ev->xbutton.time; + return True; + case MotionNotify: + lastTimestamp = ev->xmotion.time; + return True; + case EnterNotify: + case LeaveNotify: + lastTimestamp = ev->xcrossing.time; + return True; + case PropertyNotify: + lastTimestamp = ev->xproperty.time; + return True; + case SelectionClear: + lastTimestamp = ev->xselectionclear.time; + return True; + case SelectionRequest: + lastTimestamp = ev->xselectionrequest.time; + return True; + case SelectionNotify: + lastTimestamp = ev->xselection.time; + return True; + } + return False; +} + + + +/* + * WindowOfEvent - return the window about which this event is concerned; this + * window may not be the same as XEvent.xany.window (the first window listed + * in the structure). + */ +Window WindowOfEvent (XEvent *e) +{ + /* + * Each window subfield is marked with whether or not it is the same as + * XEvent.xany.window or is different (which is the case for some of the + * notify events). + */ + switch (e->type) { + case KeyPress: + case KeyRelease: return e->xkey.window; /* same */ + case ButtonPress: + case ButtonRelease: return e->xbutton.window; /* same */ + case MotionNotify: return e->xmotion.window; /* same */ + case EnterNotify: + case LeaveNotify: return e->xcrossing.window; /* same */ + case FocusIn: + case FocusOut: return e->xfocus.window; /* same */ + case KeymapNotify: return e->xkeymap.window; /* same */ + case Expose: return e->xexpose.window; /* same */ + case GraphicsExpose: return e->xgraphicsexpose.drawable; /* same */ + case NoExpose: return e->xnoexpose.drawable; /* same */ + case VisibilityNotify: return e->xvisibility.window; /* same */ + case CreateNotify: return e->xcreatewindow.window; /* DIFF */ + case DestroyNotify: return e->xdestroywindow.window; /* DIFF */ + case UnmapNotify: return e->xunmap.window; /* DIFF */ + case MapNotify: return e->xmap.window; /* DIFF */ + case MapRequest: return e->xmaprequest.window; /* DIFF */ + case ReparentNotify: return e->xreparent.window; /* DIFF */ + case ConfigureNotify: return e->xconfigure.window; /* DIFF */ + case ConfigureRequest: return e->xconfigurerequest.window; /* DIFF */ + case GravityNotify: return e->xgravity.window; /* DIFF */ + case ResizeRequest: return e->xresizerequest.window; /* same */ + case CirculateNotify: return e->xcirculate.window; /* DIFF */ + case CirculateRequest: return e->xcirculaterequest.window; /* DIFF */ + case PropertyNotify: return e->xproperty.window; /* same */ + case SelectionClear: return e->xselectionclear.window; /* same */ + case SelectionRequest: return e->xselectionrequest.requestor; /* DIFF */ + case SelectionNotify: return e->xselection.requestor; /* same */ + case ColormapNotify: return e->xcolormap.window; /* same */ + case ClientMessage: return e->xclient.window; /* same */ + case MappingNotify: return None; + } + return None; +} + +void FixRootEvent (XEvent *e) +{ + if (Scr->Root == Scr->RealRoot) + return; + + switch (e->type) { + case KeyPress: + case KeyRelease: + e->xkey.x_root -= Scr->rootx; + e->xkey.y_root -= Scr->rooty; + e->xkey.root = Scr->Root; + break; + case ButtonPress: + case ButtonRelease: + e->xbutton.x_root -= Scr->rootx; + e->xbutton.y_root -= Scr->rooty; + e->xbutton.root = Scr->Root; + break; + case MotionNotify: + e->xmotion.x_root -= Scr->rootx; + e->xmotion.y_root -= Scr->rooty; + e->xmotion.root = Scr->Root; + break; + case EnterNotify: + case LeaveNotify: + e->xcrossing.x_root -= Scr->rootx; + e->xcrossing.y_root -= Scr->rooty; + e->xcrossing.root = Scr->Root; + break; + default: + break; + } +} + + + +/* Move this next to GetTwmWindow()? */ +static ScreenInfo *GetTwmScreen(XEvent *event) +{ + ScreenInfo *scr; + + if (XFindContext(dpy, event->xany.window, ScreenContext, + (XPointer *)&scr) == XCNOENT) { + scr = FindScreenInfo(WindowOfEvent(event)); + } + + return scr; +} + +/*********************************************************************** + * + * Procedure: + * DispatchEvent2 - + * handle a single X event stored in global var Event + * this routine for is for a call during an f.move + * + *********************************************************************** + */ +Bool DispatchEvent2 (void) +{ + Window w = Event.xany.window; + ScreenInfo *lastScr = Scr; /* XXX_MIKE - assume Scr OK on entry... */ + StashEventTime (&Event); + + Tmp_win = GetTwmWindow(w); + Scr = GetTwmScreen(&Event); + + dumpevent(&Event); + + if (!Scr) { + Scr = lastScr; /* XXX_MIKE - try not to leave Scr NULL */ + return False; + } + FixRootEvent (&Event); + +#ifdef SOUNDS + play_sound(Event.type); +#endif + + if (menuFromFrameOrWindowOrTitlebar) { + if (Event.type == Expose) + HandleExpose(); + } else { + if (Event.type>= 0 && Event.type < MAX_X_EVENT) + (*EventHandler[Event.type])(); + } + + return True; +} + +/*********************************************************************** + * + * Procedure: + * DispatchEvent - handle a single X event stored in global var Event + * + *********************************************************************** + */ +Bool DispatchEvent (void) +{ + Window w = Event.xany.window; + ScreenInfo *lastScr = Scr; /* XXX_MIKE - assume Scr OK on entry... */ + StashEventTime (&Event); + + Tmp_win = GetTwmWindow(w); + Scr = GetTwmScreen(&Event); + + dumpevent(&Event); + + if (!Scr) { + Scr = lastScr; /* XXX_MIKE - try not to leave Scr NULL */ + return False; + } + + if (captive) { + if ((Event.type == ConfigureNotify) && (Event.xconfigure.window == Scr->CaptiveRoot)) { + ConfigureRootWindow (&Event); + return (False); + } + } + FixRootEvent (&Event); + if (Event.type>= 0 && Event.type < MAX_X_EVENT) { +#ifdef SOUNDS + play_sound(Event.type); +#endif + (*EventHandler[Event.type])(); + } + return True; +} + + + +/*********************************************************************** + * + * Procedure: + * HandleEvents - handle X events + * + *********************************************************************** + */ + +void HandleEvents(void) +{ + while (TRUE) + { + if (enter_flag && !QLength(dpy)) { + if (enter_win && enter_win != raise_win) { + AutoRaiseWindow (enter_win); /* sets enter_flag T */ + } else { + enter_flag = FALSE; + } + } + if ( leave_flag && !QLength(dpy) ) { + if (leave_win && leave_win != lower_win) { + AutoLowerWindow (leave_win); /* sets leave_flag T */ + } else { + leave_flag = FALSE; + } + } + if (ColortableThrashing && !QLength(dpy) && Scr) { + InstallColormaps(ColormapNotify, NULL); + } + WindowMoved = FALSE; + + CtwmNextEvent (dpy, &Event); + + if (Event.type < 0 || Event.type >= MAX_X_EVENT) + XtDispatchEvent (&Event); + else + + (void) DispatchEvent (); + } +} + +#define nextEvent(event) XtAppNextEvent(appContext, event); + +#ifdef VMS +extern unsigned long timefe; +#endif + +static void CtwmNextEvent (Display *display, XEvent *event) +{ + int animate = (AnimationActive && MaybeAnimate); + +#ifdef VMS + if (QLength (display) != 0) { + nextEvent (event); + return; + } + if (animate && AnimationPending) Animate (); + while (1) { + sys$waitfr(timefe); + sys$clref(timefe); + + if (animate && AnimationPending) Animate (); + if (QLength (display) != 0) { + nextEvent (event); + return; + } + } +#else /* VMS */ + int found; + fd_set mask; + int fd; + struct timeval timeout, *tout = NULL; + + if (RestartFlag) + DoRestart(CurrentTime); + if (XEventsQueued (display, QueuedAfterFlush) != 0) { + nextEvent (event); + return; + } + fd = ConnectionNumber (display); + +#ifdef USE_SIGNALS + if (animate && AnimationPending) Animate (); + while (1) { + FD_ZERO (&mask); + FD_SET (fd, &mask); + found = select (fd + 1, (FDSET)&mask, (FDSET) 0, (FDSET) 0, 0); + if (RestartFlag) + DoRestart(CurrentTime); + if (found < 0) { + if (errno == EINTR) { + if (animate) + Animate (); + } + else perror ("select"); + continue; + } + if (FD_ISSET (fd, &mask)) { + nextEvent (event); + return; + } + } +#else /* USE_SIGNALS */ + if (animate) TryToAnimate (); + if (RestartFlag) + DoRestart(CurrentTime); + if (! MaybeAnimate) { + nextEvent (event); + return; + } + if (animate) tout = (AnimationSpeed > 0) ? &timeout : NULL; + while (1) { + FD_ZERO (&mask); + FD_SET (fd, &mask); + if (animate) { + timeout = AnimateTimeout; + } + found = select (fd + 1, (FDSET)&mask, (FDSET) 0, (FDSET) 0, tout); + if (RestartFlag) + DoRestart(CurrentTime); + if (found < 0) { + if (errno != EINTR) perror ("select"); + continue; + } + if (FD_ISSET (fd, &mask)) { + nextEvent (event); + return; + } + if (found == 0) { + if (animate) TryToAnimate (); + if (RestartFlag) + DoRestart(CurrentTime); + if (! MaybeAnimate) { + nextEvent (event); + return; + } + continue; + } + } +#endif /* USE_SIGNALS */ +#endif /* VMS */ +} + + + +/*********************************************************************** + * + * Procedure: + * HandleColormapNotify - colormap notify event handler + * + * This procedure handles both a client changing its own colormap, and + * a client explicitly installing its colormap itself (only the window + * manager should do that, so we must set it correctly). + * + *********************************************************************** + */ + +void HandleColormapNotify(void) +{ + XColormapEvent *cevent = (XColormapEvent *) &Event; + ColormapWindow *cwin, **cwins; + TwmColormap *cmap; + int lost, won, n, number_cwins; + +/* if (! Tmp_win) return; */ + if (XFindContext(dpy, cevent->window, ColormapContext, (XPointer *)&cwin) == XCNOENT) + return; + cmap = cwin->colormap; + + if (cevent->new) + { + if (XFindContext(dpy, cevent->colormap, ColormapContext, + (XPointer *)&cwin->colormap) == XCNOENT) + cwin->colormap = CreateTwmColormap(cevent->colormap); + else + cwin->colormap->refcnt++; + + cmap->refcnt--; + + if (cevent->state == ColormapUninstalled) + cmap->state &= ~CM_INSTALLED; + else + cmap->state |= CM_INSTALLED; + + if (cmap->state & CM_INSTALLABLE) { + InstallColormaps(ColormapNotify, NULL); + } + + if (cmap->refcnt == 0) + { + XDeleteContext(dpy, cmap->c, ColormapContext); + free((char *) cmap); + } + + return; + } + + if (cevent->state == ColormapUninstalled && + (cmap->state & CM_INSTALLABLE)) + { + if (!(cmap->state & CM_INSTALLED)) + return; + cmap->state &= ~CM_INSTALLED; + + if (!ColortableThrashing) + { + ColortableThrashing = TRUE; + XSync(dpy, 0); + } + + if (cevent->serial >= Scr->cmapInfo.first_req) + { + number_cwins = Scr->cmapInfo.cmaps->number_cwins; + + /* + * Find out which colortables collided. + */ + + cwins = Scr->cmapInfo.cmaps->cwins; + for (lost = won = -1, n = 0; + (lost == -1 || won == -1) && n < number_cwins; + n++) + { + if (lost == -1 && cwins[n] == cwin) + { + lost = n; /* This is the window which lost its colormap */ + continue; + } + + if (won == -1 && + cwins[n]->colormap->install_req == cevent->serial) + { + won = n; /* This is the window whose colormap caused */ + continue; /* the de-install of the previous colormap */ + } + } + + /* + ** Cases are: + ** Both the request and the window were found: + ** One of the installs made honoring the WM_COLORMAP + ** property caused another of the colormaps to be + ** de-installed, just mark the scoreboard. + ** + ** Only the request was found: + ** One of the installs made honoring the WM_COLORMAP + ** property caused a window not in the WM_COLORMAP + ** list to lose its map. This happens when the map + ** it is losing is one which is trying to be installed, + ** but is getting getting de-installed by another map + ** in this case, we'll get a scoreable event later, + ** this one is meaningless. + ** + ** Neither the request nor the window was found: + ** Somebody called installcolormap, but it doesn't + ** affect the WM_COLORMAP windows. This case will + ** probably never occur. + ** + ** Only the window was found: + ** One of the WM_COLORMAP windows lost its colormap + ** but it wasn't one of the requests known. This is + ** probably because someone did an "InstallColormap". + ** The colormap policy is "enforced" by re-installing + ** the colormaps which are believed to be correct. + */ + + if (won != -1) { + if (lost != -1) + { + /* lower diagonal index calculation */ + if (lost > won) + n = lost*(lost-1)/2 + won; + else + n = won*(won-1)/2 + lost; + Scr->cmapInfo.cmaps->scoreboard[n] = 1; + } else + { + /* + ** One of the cwin installs caused one of the cwin + ** colormaps to be de-installed, so I'm sure to get an + ** UninstallNotify for the cwin I know about later. + ** I haven't got it yet, or the test of CM_INSTALLED + ** above would have failed. Turning the CM_INSTALLED + ** bit back on makes sure we get back here to score + ** the collision. + */ + cmap->state |= CM_INSTALLED; + } + } else if (lost != -1) { + InstallColormaps(ColormapNotify, NULL); + } else { + ColortableThrashing = FALSE; /* Gross Hack for HP WABI. CL. */ + } + } + } + + else if (cevent->state == ColormapUninstalled) + cmap->state &= ~CM_INSTALLED; + + else if (cevent->state == ColormapInstalled) + cmap->state |= CM_INSTALLED; +} + + + +/* + * LastFocusEvent -- skip over focus in/out events for this + * window. + */ + +static XEvent *LastFocusEvent(Window w, XEvent *first) +{ + static XEvent current; + XEvent *last, new; + + new= *first; + last=NULL; + + do { + if ( (new.type == FocusIn || new.type == FocusOut) + && new.xfocus.mode == NotifyNormal + && (new.xfocus.detail == NotifyNonlinear + || new.xfocus.detail == NotifyPointer + || new.xfocus.detail == NotifyAncestor + || (new.xfocus.detail == NotifyNonlinearVirtual) + )) + { + current=new; + last= ¤t; +#ifdef TRACE_FOCUS + printf("! %s 0x%x mode=%d, detail=%d\n", + new.xfocus.type == FocusIn?"in":"out", + Tmp_win,new.xfocus.mode, new.xfocus.detail); +#endif + } + else + { +#ifdef TRACE_FOCUS + printf("~ %s 0x%x mode=%d, detail=%d\n", + new.xfocus.type == FocusIn?"in":"out", + Tmp_win,new.xfocus.mode, new.xfocus.detail); +#endif + } + } while (XCheckWindowEvent(dpy, w, FocusChangeMask, &new)); + return last; +} + +/* + * HandleFocusIn -- deal with the focus moving under us. + */ + +void HandleFocusIn(XFocusInEvent *event) +{ + +#ifdef TRACE_FOCUS + printf("HandleFocusIn : +0x%x (0x%x, 0x%x), mode=%d, detail=%d\n", + Tmp_win, Tmp_win->w, event->window, event->mode, event->detail); +#endif + + if (Tmp_win->iconmgr) return; + if (Tmp_win->wmhints && ! Tmp_win->wmhints->input) return; + if (Scr->Focus == Tmp_win) return; + if (Tmp_win->AutoSqueeze && Tmp_win->squeezed) AutoSqueeze (Tmp_win); + SetFocusVisualAttributes (Tmp_win, True); + Scr->Focus = Tmp_win; +} + +void HandleFocusOut(XFocusOutEvent *event) +{ +#ifdef TRACE_FOCUS + printf("HandleFocusOut : -0x%x (0x%x, 0x%x), mode=%d, detail=%d\n", + Tmp_win, Tmp_win->w, event->window, event->mode, event->detail); +#endif + + if (Tmp_win->iconmgr) return; + if (Scr->Focus != Tmp_win) return; + if (Scr->SloppyFocus) return; + if (Tmp_win->AutoSqueeze && !Tmp_win->squeezed) AutoSqueeze (Tmp_win); + SetFocusVisualAttributes (Tmp_win, False); + Scr->Focus= NULL; +} + +void HandleFocusChange(void) +{ + XEvent *event; + + if (Tmp_win) + { + event = LastFocusEvent(Event.xany.window,&Event); + + if ( event != NULL) + { + if (event->type == FocusIn) + HandleFocusIn(&event->xfocus); + else + HandleFocusOut(&event->xfocus); + } + } +} + +void SynthesiseFocusOut(Window w) +{ + XEvent event; + +#ifdef TRACE_FOCUS + printf ("Synthesizing FocusOut on %x\n", w); +#endif + + event.type=FocusOut; + event.xfocus.window=w; + event.xfocus.mode=NotifyNormal; + event.xfocus.detail=NotifyPointer; + + XPutBackEvent(dpy, &event); +} + + +void SynthesiseFocusIn(Window w) +{ + XEvent event; + +#ifdef TRACE_FOCUS + printf ("Synthesizing FocusIn on %x\n", w); +#endif + + event.type=FocusIn; + event.xfocus.window=w; + event.xfocus.mode=NotifyNormal; + event.xfocus.detail=NotifyPointer; + + XPutBackEvent(dpy, &event); + +} + + +/*********************************************************************** + * + * Procedure: + * HandleVisibilityNotify - visibility notify event handler + * + * This routine keeps track of visibility events so that colormap + * installation can keep the maximum number of useful colormaps + * installed at one time. + * + *********************************************************************** + */ + +void HandleVisibilityNotify(void) +{ + XVisibilityEvent *vevent = (XVisibilityEvent *) &Event; + ColormapWindow *cwin; + TwmColormap *cmap; + + if (XFindContext(dpy, vevent->window, ColormapContext, (XPointer *)&cwin) == XCNOENT) + return; + + /* + * when Saber complains about retreiving an from an + * just type "touch vevent->state" and "cont" + */ + cmap = cwin->colormap; + if ((cmap->state & CM_INSTALLABLE) && + vevent->state != cwin->visibility && + (vevent->state == VisibilityFullyObscured || + cwin->visibility == VisibilityFullyObscured) && + cmap->w == cwin->w) { + cwin->visibility = vevent->state; + InstallWindowColormaps(VisibilityNotify, (TwmWindow *) NULL); + } else + cwin->visibility = vevent->state; +} + + + +/*********************************************************************** + * + * Procedure: + * HandleKeyRelease - key release event handler + * + *********************************************************************** + */ + +void HandleKeyRelease(void) +{ + if (Tmp_win == Scr->currentvs->wsw->twm_win) + WMgrHandleKeyReleaseEvent (Scr->currentvs, &Event); +} +/*********************************************************************** + * + * Procedure: + * HandleKeyPress - key press event handler + * + *********************************************************************** + */ + +void HandleKeyPress(void) +{ + FuncKey *key; + int len; + unsigned int modifier; + Window w; + + if (InfoLines) XUnmapWindow(dpy, Scr->InfoWindow); + + if (ActiveMenu != NULL) { + MenuItem *item; + int offset; + char *keynam; + KeySym keysym; + int xx, yy, wx, wy; + Window junkW; + + item = (MenuItem*) 0; + + keysym = XLookupKeysym ((XKeyEvent*) &Event, 0); + if (! keysym) return; + keynam = XKeysymToString (keysym); + if (! keynam) return; + + if (!strcmp (keynam, "Down") || !strcmp (keynam, "space")) { + xx = Event.xkey.x; + yy = Event.xkey.y + Scr->EntryHeight; + XTranslateCoordinates (dpy, Scr->Root, ActiveMenu->w, xx, yy, &wx, &wy, &junkW); + if ((wy < 0) || (wy > ActiveMenu->height)) + yy -= (wy - (Scr->EntryHeight / 2) - 2); + if ((wx < 0) || (wx > ActiveMenu->width)) + xx -= (wx - (ActiveMenu->width / 2)); + XWarpPointer (dpy, Scr->Root, Scr->Root, Event.xkey.x, Event.xkey.y, + ActiveMenu->width, ActiveMenu->height, xx, yy); + return; + } + else + if (!strcmp (keynam, "Up")) { + xx = Event.xkey.x; + yy = Event.xkey.y - Scr->EntryHeight; + XTranslateCoordinates (dpy, Scr->Root, ActiveMenu->w, xx, yy, &wx, &wy, &junkW); + if ((wy < 0) || (wy > ActiveMenu->height)) + yy -= (wy - ActiveMenu->height + (Scr->EntryHeight / 2) + 2); + if ((wx < 0) || (wx > ActiveMenu->width)) + xx -= (wx - (ActiveMenu->width / 2)); + XWarpPointer (dpy, Scr->Root, Scr->Root, Event.xkey.x, Event.xkey.y, + ActiveMenu->width, ActiveMenu->height, xx, yy); + return; + } + else + if (!strcmp (keynam, "Right") || !strcmp (keynam, "Return")) { + item = ActiveItem; + } + else + if (!strcmp (keynam, "Left") || !strcmp(keynam, "Escape")) { + MenuRoot *menu; + + if (ActiveMenu->pinned) return; + if (!ActiveMenu->prev || MenuDepth == 1) { + PopDownMenu (); + XUngrabPointer (dpy, CurrentTime); + return; + } + xx = Event.xkey.x; + yy = Event.xkey.y; + menu = ActiveMenu->prev; + XTranslateCoordinates (dpy, Scr->Root, menu->w, xx, yy, &wx, &wy, &junkW); + xx -= (wx - (menu->width / 2)); + if (menu->lastactive) + yy -= (wy - menu->lastactive->item_num * Scr->EntryHeight - + (Scr->EntryHeight / 2) - 2); + else + yy -= (wy - (Scr->EntryHeight / 2) - 2); + XUnmapWindow (dpy, ActiveMenu->w); + if (Scr->Shadow) XUnmapWindow (dpy, ActiveMenu->shadow); + XWarpPointer (dpy, Scr->Root, Scr->Root, Event.xkey.x, Event.xkey.y, + menu->width, menu->height, xx, yy); + return; + } + else + if (strlen (keynam) == 1) { + MenuItem *startitem; + xx = Event.xkey.x; + yy = Event.xkey.y; + + startitem = ActiveItem ? ActiveItem : ActiveMenu->first; + item = startitem->next; + if (item == (MenuItem*) 0) item = ActiveMenu->first; + modifier = (Event.xkey.state & mods_used); + modifier = set_mask_ignore (modifier); + + while (item != startitem) { + Boolean matched = False; + offset = 0; + switch (item->item [0]) { + case '^' : + if ((modifier & ControlMask) && + (keynam [0] == Tolower (item->item [1]))) + matched = True; + break; + case '~' : + if ((modifier & Mod1Mask) && + (keynam [0] == Tolower (item->item [1]))) + matched = True; + break; + case ' ' : + offset = 1; + default : + if (((Scr->IgnoreCaseInMenuSelection) && + (keynam [0] == Tolower (item->item [offset]))) || + + ((modifier & ShiftMask) && Isupper (item->item [offset]) && + (keynam [0] == Tolower (item->item [offset]))) || + + (!(modifier & ShiftMask) && Islower (item->item [offset]) && + (keynam [0] == item->item [offset]))) matched = True; + break; + } + if (matched) break; + item = item->next; + if (item == (MenuItem*) 0) item = ActiveMenu->first; + } + if (item == startitem) return; + wx = ActiveMenu->width / 2; + wy = (item->item_num * Scr->EntryHeight) + (Scr->EntryHeight / 2) + 2; + XTranslateCoordinates (dpy, ActiveMenu->w, Scr->Root, wx, wy, &xx, &yy, &junkW); + XWarpPointer (dpy, Scr->Root, Scr->Root, Event.xkey.x, Event.xkey.y, + ActiveMenu->width, ActiveMenu->height, xx, yy); + return; + } + else return; + if (item) { + switch (item->func) { + case 0 : + case F_TITLE : + break; + + case F_MENU : + if (!strcmp (keynam, "Return")) { + if (ActiveMenu == Scr->Workspaces) { + PopDownMenu(); + XUngrabPointer (dpy, CurrentTime); + GotoWorkSpaceByName (Scr->currentvs, item->action + 8); + } + else { + ExecuteFunction (item->func, item->action, + ButtonWindow ? ButtonWindow->frame : None, + ButtonWindow, &Event, Context, FALSE); + PopDownMenu(); + } + return; + } + xx = Event.xkey.x; + yy = Event.xkey.y; + XTranslateCoordinates (dpy, Scr->Root, ActiveMenu->w, xx, yy, + &wx, &wy, &junkW); + if (ActiveItem) { + ActiveItem->state = 0; + PaintEntry (ActiveMenu, ActiveItem, False); + ActiveItem = NULL; + } + xx -= (wx - ActiveMenu->width); + yy -= (wy - item->item_num * Scr->EntryHeight - (Scr->EntryHeight / 2) - 2); + Event.xkey.x_root = xx; + Event.xkey.y_root = yy; + XWarpPointer (dpy, Scr->Root, Scr->Root, Event.xkey.x, Event.xkey.y, + ActiveMenu->width, ActiveMenu->height, xx, yy); + if (ActiveMenu == Scr->Workspaces) + CurrentSelectedWorkspace = item->item; + do_key_menu (item->sub, None); + CurrentSelectedWorkspace = NULL; + break; + + default : + if (item->func != F_PIN) PopDownMenu(); + ExecuteFunction (item->func, item->action, + ButtonWindow ? ButtonWindow->frame : None, + ButtonWindow, &Event, Context, FALSE); + } + } + else { + PopDownMenu(); + XUngrabPointer (dpy, CurrentTime); + } + return; + } + + Context = C_NO_CONTEXT; + if (Event.xany.window == Scr->Root) { + if (AlternateContext) { + XUngrabPointer (dpy, CurrentTime); + XUngrabKeyboard (dpy, CurrentTime); + AlternateContext = False; + Context = C_ALTERNATE; + } + else + if (AlternateKeymap && Event.xkey.subwindow) { + w = Event.xkey.subwindow; + Tmp_win = GetTwmWindow(w); + if (Tmp_win) Event.xany.window = Tmp_win->w; + } + else Context = C_ROOT; + } + if (Tmp_win) + { + if (Event.xany.window == Tmp_win->title_w) + Context = C_TITLE; + if (Event.xany.window == Tmp_win->w) + Context = C_WINDOW; + if (Tmp_win->icon && (Event.xany.window == Tmp_win->icon->w)) + Context = C_ICON; + if (Event.xany.window == Tmp_win->frame) + Context = C_FRAME; + if (Tmp_win->iconmanagerlist) { + if (Event.xany.window == Tmp_win->iconmanagerlist->w || + Event.xany.window == Tmp_win->iconmanagerlist->icon) + Context = C_ICONMGR; + } + if (Tmp_win->wspmgr) + Context = C_WORKSPACE; + } + + modifier = (Event.xkey.state | AlternateKeymap) & mods_used; + modifier = set_mask_ignore (modifier); + if (AlternateKeymap) { + XUngrabPointer (dpy, CurrentTime); + XUngrabKeyboard (dpy, CurrentTime); + AlternateKeymap = 0; + } + for (key = Scr->FuncKeyRoot.next; key != NULL; key = key->next) + { + if (key->keycode == Event.xkey.keycode && + key->mods == modifier && + (key->cont == Context || key->cont == C_NAME)) + { + /* weed out the functions that don't make sense to execute + * from a key press + * TODO: add keyboard moving/resizing of windows. + */ + if (key->func == F_MOVE || key->func == F_RESIZE) + return; + + if (key->cont != C_NAME) + { + if (key->func == F_MENU) { + ButtonEvent = Event; + ButtonWindow = Tmp_win; + do_key_menu (key->menu, (Window) None); + } + else { + ExecuteFunction(key->func, key->action, Event.xany.window, + Tmp_win, &Event, Context, FALSE); + if (!AlternateKeymap && !AlternateContext) + XUngrabPointer(dpy, CurrentTime); + } + return; + } + else + { + int matched = FALSE; + len = strlen(key->win_name); + + /* try and match the name first */ + for (Tmp_win = Scr->FirstWindow; Tmp_win != NULL; + Tmp_win = Tmp_win->next) + { + if (!strncmp(key->win_name, Tmp_win->name, len)) + { + matched = TRUE; + ExecuteFunction(key->func, key->action, Tmp_win->frame, + Tmp_win, &Event, C_FRAME, FALSE); + if (!AlternateKeymap && !AlternateContext) + XUngrabPointer(dpy, CurrentTime); + } + } + + /* now try the res_name */ + if (!matched) + for (Tmp_win = Scr->FirstWindow; Tmp_win != NULL; + Tmp_win = Tmp_win->next) + { + if (!strncmp(key->win_name, Tmp_win->class.res_name, len)) + { + matched = TRUE; + ExecuteFunction(key->func, key->action, Tmp_win->frame, + Tmp_win, &Event, C_FRAME, FALSE); + if (!AlternateKeymap && !AlternateContext) + XUngrabPointer(dpy, CurrentTime); + } + } + + /* now try the res_class */ + if (!matched) + for (Tmp_win = Scr->FirstWindow; Tmp_win != NULL; + Tmp_win = Tmp_win->next) + { + if (!strncmp(key->win_name, Tmp_win->class.res_class, len)) + { + matched = TRUE; + ExecuteFunction(key->func, key->action, Tmp_win->frame, + Tmp_win, &Event, C_FRAME, FALSE); + if (!AlternateKeymap && !AlternateContext) + XUngrabPointer(dpy, CurrentTime); + } + } + if (matched) + return; + } + } + } + + /* if we get here, no function key was bound to the key. Send it + * to the client if it was in a window we know about. + */ + if (Tmp_win) + { + /* if (Tmp_win == Scr->currentvs->wsw->twm_win) */ + if (Tmp_win->wspmgr) { + WMgrHandleKeyPressEvent (Scr->currentvs, &Event); + return; + } + if (Tmp_win->icon && ((Event.xany.window == Tmp_win->icon->w) || + (Event.xany.window == Tmp_win->frame) || + (Event.xany.window == Tmp_win->title_w) || + (Tmp_win->iconmanagerlist && + (Event.xany.window == Tmp_win->iconmanagerlist->w)))) + { + Event.xkey.window = Tmp_win->w; + XSendEvent(dpy, Tmp_win->w, False, KeyPressMask, &Event); + } + } + +} + + + +static void free_window_names (TwmWindow *tmp, + Bool nukefull, Bool nukename, Bool nukeicon) +{ +/* + * XXX - are we sure that nobody ever sets these to another constant (check + * twm windows)? + */ + if ((tmp->name == tmp->full_name) && (tmp->name == tmp->icon_name)) { + if (nukefull && nukename && nukeicon) + FreeWMPropertyString(tmp->name); + } else + if (tmp->name == tmp->full_name) { + if (nukename && nukefull) + FreeWMPropertyString(tmp->name); + if (nukeicon) + FreeWMPropertyString(tmp->icon_name); + } else + if (tmp->name == tmp->icon_name) { + if (nukename && nukeicon) + FreeWMPropertyString(tmp->name); + if (nukefull) + FreeWMPropertyString(tmp->full_name); + } else + if (tmp->icon_name == tmp->full_name) { + if (nukeicon && nukefull) + FreeWMPropertyString(tmp->icon_name); + if (nukename) + FreeWMPropertyString(tmp->name); + } else { + if (nukefull) + FreeWMPropertyString(tmp->full_name); + if (nukename) + FreeWMPropertyString(tmp->name); + if (nukeicon) + FreeWMPropertyString(tmp->icon_name); + } + return; +} + + + +void free_cwins (TwmWindow *tmp) +{ + int i; + TwmColormap *cmap; + + if (tmp->cmaps.number_cwins) { + for (i = 0; i < tmp->cmaps.number_cwins; i++) { + if (--tmp->cmaps.cwins[i]->refcnt == 0) { + cmap = tmp->cmaps.cwins[i]->colormap; + if (--cmap->refcnt == 0) { + XDeleteContext(dpy, cmap->c, ColormapContext); + free((char *) cmap); + } + XDeleteContext(dpy, tmp->cmaps.cwins[i]->w, ColormapContext); + free((char *) tmp->cmaps.cwins[i]); + } + } + free((char *) tmp->cmaps.cwins); + if (tmp->cmaps.number_cwins > 1) { + free(tmp->cmaps.scoreboard); + tmp->cmaps.scoreboard = NULL; + } + tmp->cmaps.number_cwins = 0; + } +} + + + +/*********************************************************************** + * + * Procedure: + * HandlePropertyNotify - property notify event handler + * + *********************************************************************** + */ + +void HandlePropertyNotify(void) +{ + unsigned char *prop = NULL; + Atom actual = None; + int actual_format; + unsigned long nitems, bytesafter; + unsigned long valuemask; /* mask for create windows */ + XSetWindowAttributes attributes; /* attributes for create windows */ + Pixmap pm; + int icon_change; + XRectangle inc_rect; + XRectangle logical_rect; + + unsigned char *gwkspc; + + /* watch for standard colormap changes */ + if (Event.xproperty.window == Scr->Root) { + XStandardColormap *maps = NULL; + int nmaps; + + if (Event.xproperty.atom == _XA_WM_CURRENTWORKSPACE) { + switch (Event.xproperty.state) { + case PropertyNewValue: + if (XGetWindowProperty (dpy, Scr->Root, _XA_WM_CURRENTWORKSPACE, + 0L, 200L, False, XA_STRING, &actual, &actual_format, + &nitems, &bytesafter, &prop) == Success) { + if (nitems == 0) return; + GotoWorkSpaceByName (Scr->vScreenList, (char*)prop); + XFree ((char*) prop); + } + return; + + default: + return; + } + } + switch (Event.xproperty.state) { + case PropertyNewValue: + if (XGetRGBColormaps (dpy, Scr->Root, &maps, &nmaps, + Event.xproperty.atom)) { + /* if got one, then replace any existing entry */ + InsertRGBColormap (Event.xproperty.atom, maps, nmaps, True); + } + return; + + case PropertyDelete: + RemoveRGBColormap (Event.xproperty.atom); + return; + } + } + + if (!Tmp_win) return; /* unknown window */ + +#define MAX_NAME_LEN 200L /* truncate to this many */ +#define MAX_ICON_NAME_LEN 200L /* ditto */ + + switch (Event.xproperty.atom) { + case XA_WM_NAME: + prop = GetWMPropertyString(Tmp_win->w, XA_WM_NAME); + if (prop == NULL) return; +#ifdef CLAUDE + if (strstr (prop, " - Mozilla")) { + char *moz = strstr (prop, " - Mozilla"); + *moz = '\0'; + } +#endif + free_window_names (Tmp_win, True, True, False); + + Tmp_win->full_name = (char*) prop; + Tmp_win->name = (char*) prop; + Tmp_win->nameChanged = 1; + XmbTextExtents(Scr->TitleBarFont.font_set, + Tmp_win->name, strlen (Tmp_win->name), + &inc_rect, &logical_rect); + Tmp_win->name_width = logical_rect.width; + + SetupWindow (Tmp_win, Tmp_win->frame_x, Tmp_win->frame_y, + Tmp_win->frame_width, Tmp_win->frame_height, -1); + + if (Tmp_win->title_w) XClearArea(dpy, Tmp_win->title_w, 0,0,0,0, True); + if (Scr->AutoOccupy) WmgrRedoOccupation (Tmp_win); + + /* Experimental, not yet working. + { + ColorPair cp; + int f, b; + + f = GetColorFromList (Scr->TitleForegroundL, Tmp_win->full_name, + &Tmp_win->class, &cp.fore); + b = GetColorFromList (Scr->TitleBackgroundL, Tmp_win->full_name, + &Tmp_win->class, &cp.back); + if (f || b) { + if (Scr->use3Dtitles && !Scr->BeNiceToColormap) GetShadeColors (&cp); + Tmp_win->title = cp; + } + f = GetColorFromList (Scr->BorderColorL, Tmp_win->full_name, + &Tmp_win->class, &cp.fore); + b = GetColorFromList (Scr->BorderColorL, Tmp_win->full_name, + &Tmp_win->class, &cp.back); + if (f || b) { + if (Scr->use3Dborders && !Scr->BeNiceToColormap) GetShadeColors (&cp); + Tmp_win->borderC = cp; + } + + f = GetColorFromList (Scr->BorderTileForegroundL, Tmp_win->full_name, + &Tmp_win->class, &cp.fore); + b = GetColorFromList (Scr->BorderTileBackgroundL, Tmp_win->full_name, + &Tmp_win->class, &cp.back); + if (f || b) { + if (Scr->use3Dborders && !Scr->BeNiceToColormap) GetShadeColors (&cp); + Tmp_win->border_tile = cp; + } + } + */ + /* + * if the icon name is NoName, set the name of the icon to be + * the same as the window + */ + if (Tmp_win->icon_name == NoName) { + Tmp_win->icon_name = Tmp_win->name; + RedoIcon(); + } + break; + + case XA_WM_ICON_NAME: + prop = GetWMPropertyString(Tmp_win->w, XA_WM_ICON_NAME); + if (prop == NULL) return; +#ifdef CLAUDE + if (strstr (prop, " - Mozilla")) { + char *moz = strstr (prop, " - Mozilla"); + *moz = '\0'; + } +#endif + icon_change = strcmp (Tmp_win->icon_name, (char*) prop); + free_window_names (Tmp_win, False, False, True); + Tmp_win->icon_name = (char*) prop; + + if (icon_change) { + RedoIcon(); + } + break; + + case XA_WM_HINTS: + if (Tmp_win->wmhints) XFree ((char *) Tmp_win->wmhints); + Tmp_win->wmhints = XGetWMHints(dpy, Event.xany.window); + + if (Tmp_win->wmhints && (Tmp_win->wmhints->flags & WindowGroupHint)) { + Tmp_win->group = Tmp_win->wmhints->window_group; + if (Tmp_win->group && !GetTwmWindow(Tmp_win->group)) + Tmp_win->group = 0; /* see comment in AddWindow() */ + } + + if (!Tmp_win->forced && Tmp_win->wmhints && + Tmp_win->wmhints->flags & IconWindowHint) { + if (Tmp_win->icon && Tmp_win->icon->w) { + int icon_x, icon_y; + + /* + * There's already an icon window. + * Try to find out where it is; if we succeed, move the new + * window to where the old one is. + */ + if (XGetGeometry (dpy, Tmp_win->icon->w, &JunkRoot, &icon_x, + &icon_y, &JunkWidth, &JunkHeight, &JunkBW, &JunkDepth)) { + /* + * Move the new icon window to where the old one was. + */ + XMoveWindow(dpy, Tmp_win->wmhints->icon_window, icon_x, + icon_y); + } + + /* + * If the window is iconic, map the new icon window. + */ + if (Tmp_win->isicon) + XMapWindow(dpy, Tmp_win->wmhints->icon_window); + + /* + * Now, if the old window isn't ours, unmap it, otherwise + * just get rid of it completely. + */ + if (Tmp_win->icon_not_ours) { + if (Tmp_win->icon->w != Tmp_win->wmhints->icon_window) + XUnmapWindow(dpy, Tmp_win->icon->w); + } else + XDestroyWindow(dpy, Tmp_win->icon->w); + + /* + * The new icon window isn't our window, so note that fact + * so that we don't treat it as ours. + */ + Tmp_win->icon_not_ours = TRUE; + + /* + * Now make the new window the icon window for this window, + * and set it up to work as such (select for key presses + * and button presses/releases, set up the contexts for it, + * and define the cursor for it). + */ + Tmp_win->icon->w = Tmp_win->wmhints->icon_window; + XSelectInput (dpy, Tmp_win->icon->w, + KeyPressMask | ButtonPressMask | ButtonReleaseMask); + XSaveContext(dpy, Tmp_win->icon->w, TwmContext, (XPointer)Tmp_win); + XSaveContext(dpy, Tmp_win->icon->w, ScreenContext, (XPointer)Scr); + XDefineCursor(dpy, Tmp_win->icon->w, Scr->IconCursor); + } + } + + if (Tmp_win->icon && Tmp_win->icon->w && !Tmp_win->forced && Tmp_win->wmhints && + (Tmp_win->wmhints->flags & IconPixmapHint)) { + int x; + if (!XGetGeometry (dpy, Tmp_win->wmhints->icon_pixmap, &JunkRoot, + &JunkX, &JunkY, (unsigned int *)&Tmp_win->icon->width, + (unsigned int *)&Tmp_win->icon->height, &JunkBW, + &JunkDepth)) { + return; + } + + pm = XCreatePixmap (dpy, Scr->Root, Tmp_win->icon->width, + Tmp_win->icon->height, Scr->d_depth); + + FB(Tmp_win->icon->iconc.fore, Tmp_win->icon->iconc.back); + + if (JunkDepth == Scr->d_depth) + XCopyArea (dpy, Tmp_win->wmhints->icon_pixmap, pm, Scr->NormalGC, + 0,0, Tmp_win->icon->width, Tmp_win->icon->height, 0, 0); + else + XCopyPlane(dpy, Tmp_win->wmhints->icon_pixmap, pm, Scr->NormalGC, + 0,0, Tmp_win->icon->width, Tmp_win->icon->height, 0, 0, 1 ); + + if (Tmp_win->icon->image) { + if (Tmp_win->icon->image->pixmap) + XFreePixmap (dpy, Tmp_win->icon->image->pixmap); + Tmp_win->icon->image->pixmap = pm; + Tmp_win->icon->image->width = Tmp_win->icon->width; + Tmp_win->icon->image->height = Tmp_win->icon->height; + Tmp_win->icon->image->mask = None; + Tmp_win->icon->image->next = None; + } + + valuemask = CWBackPixmap; + attributes.background_pixmap = pm; + + if (Tmp_win->icon->bm_w) + XDestroyWindow(dpy, Tmp_win->icon->bm_w); + + x = GetIconOffset (Tmp_win->icon); + Tmp_win->icon->bm_w = + XCreateWindow (dpy, Tmp_win->icon->w, x, 0, + (unsigned int) Tmp_win->icon->width, + (unsigned int) Tmp_win->icon->height, + (unsigned int) 0, Scr->d_depth, + (unsigned int) CopyFromParent, Scr->d_visual, + valuemask, &attributes); + + if (! (Tmp_win->wmhints->flags & IconMaskHint)) { + XRectangle rect; + + rect.x = x; + rect.y = 0; + rect.width = Tmp_win->icon->width; + rect.height = Tmp_win->icon->height; + XShapeCombineRectangles (dpy, Tmp_win->icon->w, ShapeBounding, 0, + 0, &rect, 1, ShapeUnion, 0); + } + XMapSubwindows (dpy, Tmp_win->icon->w); + RedoIconName(); + } + if (Tmp_win->icon && Tmp_win->icon->w && !Tmp_win->forced && Tmp_win->wmhints && + (Tmp_win->wmhints->flags & IconMaskHint)) { + int x; + Pixmap mask; + GC gc; + + if (!XGetGeometry (dpy, Tmp_win->wmhints->icon_mask, &JunkRoot, + &JunkX, &JunkY, &JunkWidth, &JunkHeight, &JunkBW, + &JunkDepth)) { + return; + } + if (JunkDepth != 1) return; + + mask = XCreatePixmap (dpy, Scr->Root, JunkWidth, JunkHeight, 1); + if (!mask) return; + gc = XCreateGC (dpy, mask, 0, NULL); + if (!gc) return; + XCopyArea (dpy, Tmp_win->wmhints->icon_mask, mask, gc, + 0, 0, JunkWidth, JunkHeight, 0, 0); + XFreeGC (dpy, gc); + x = GetIconOffset (Tmp_win->icon); + XShapeCombineMask (dpy, Tmp_win->icon->bm_w, ShapeBounding, 0, 0, mask, ShapeSet); + XShapeCombineMask (dpy, Tmp_win->icon->w, ShapeBounding, x, 0, mask, ShapeSet); + if (Tmp_win->icon->image) { + if (Tmp_win->icon->image->mask) XFreePixmap (dpy, Tmp_win->icon->image->mask); + Tmp_win->icon->image->mask = mask; + RedoIconName (); + } + } + break; + + case XA_WM_NORMAL_HINTS: + { + GetWindowSizeHints (Tmp_win); + break; + } + default: + if (Event.xproperty.atom == _XA_WM_COLORMAP_WINDOWS) { + FetchWmColormapWindows (Tmp_win); /* frees old data */ + break; + } else if (Event.xproperty.atom == _XA_WM_PROTOCOLS) { + FetchWmProtocols (Tmp_win); + break; + } else if (Event.xproperty.atom == _XA_WM_OCCUPATION) { + if (XGetWindowProperty (dpy, Tmp_win->w, Event.xproperty.atom, 0L, MAX_NAME_LEN, False, + XA_STRING, &actual, &actual_format, &nitems, + &bytesafter, &prop) != Success || + actual == None) return; + ChangeOccupation (Tmp_win, GetMaskFromProperty (prop, nitems)); + XFree ((char *)prop); + } +#ifdef GNOME + else if (Event.xproperty.atom == _XA_WIN_WORKSPACE){ + if(XGetWindowProperty(dpy, Tmp_win->w, Event.xproperty.atom, 0L, 32, False, + XA_CARDINAL, &actual, &actual_format, &nitems, &bytesafter, + &gwkspc) != Success || actual == None) return; + ChangeOccupation (Tmp_win, 1 << (int)(*gwkspc)); + XFree ((char *)gwkspc); + } +#endif /* GNOME */ + break; + } +} + + + +static void RedoIcon(void) +{ + Icon *icon; + char *pattern; + + if (Tmp_win->icon_not_ours) { + RedoIconName (); + return; + } + icon = (Icon*) 0; + if ((pattern = LookPatternInNameList (Scr->IconNames, Tmp_win->icon_name))) { + icon = (Icon*) LookInNameList (Tmp_win->iconslist, pattern); + } + else + if ((pattern = LookPatternInNameList (Scr->IconNames, Tmp_win->full_name))) { + icon = (Icon*) LookInNameList (Tmp_win->iconslist, pattern); + } + else + if ((pattern = LookPatternInList (Scr->IconNames, Tmp_win->full_name, &Tmp_win->class))) { + icon = (Icon*) LookInNameList (Tmp_win->iconslist, pattern); + } + if (pattern == NULL) { + RedoIconName (); + return; + } + if (icon != NULL) { + if (Tmp_win->icon == icon) { + RedoIconName (); + return; + } + if (Tmp_win->icon_on && visible (Tmp_win)) { + IconDown (Tmp_win); + if (Tmp_win->icon && Tmp_win->icon->w) XUnmapWindow (dpy, Tmp_win->icon->w); + Tmp_win->icon = icon; + IconUp (Tmp_win); + XMapRaised (dpy, Tmp_win->icon->w); + } + else { + Tmp_win->icon = icon; + } + RedoIconName (); + } + else { + if (Tmp_win->icon_on && visible (Tmp_win)) { + IconDown (Tmp_win); + if (Tmp_win->icon && Tmp_win->icon->w) XUnmapWindow (dpy, Tmp_win->icon->w); + CreateIconWindow (Tmp_win, -100, -100); + XMapRaised (dpy, Tmp_win->icon->w); + } + else { + Tmp_win->icon = (Icon*) 0; + WMapUpdateIconName (Tmp_win); + } + RedoIconName (); + } +} + +/*********************************************************************** + * + * Procedure: + * RedoIconName - procedure to re-position the icon window and name + * + *********************************************************************** + */ + +void RedoIconName(void) +{ + int x; + XRectangle ink_rect; + XRectangle logical_rect; + + if (Scr->NoIconTitlebar || + LookInNameList (Scr->NoIconTitle, Tmp_win->icon_name) || + LookInList (Scr->NoIconTitle, Tmp_win->full_name, &Tmp_win->class)) goto wmapupd; + if (Tmp_win->iconmanagerlist) + { + /* let the expose event cause the repaint */ + XClearArea(dpy, Tmp_win->iconmanagerlist->w, 0,0,0,0, True); + + if (Scr->SortIconMgr) + SortIconManager(Tmp_win->iconmanagerlist->iconmgr); + } + + if (!Tmp_win->icon || !Tmp_win->icon->w) goto wmapupd; + + if (Tmp_win->icon_not_ours) goto wmapupd; + + XmbTextExtents(Scr->IconFont.font_set, + Tmp_win->icon_name, strlen(Tmp_win->icon_name), + &ink_rect, &logical_rect); + Tmp_win->icon->w_width = logical_rect.width; + Tmp_win->icon->w_width += 2 * Scr->IconManagerShadowDepth + 6; + if (Tmp_win->icon->w_width > Scr->MaxIconTitleWidth) + Tmp_win->icon->w_width = Scr->MaxIconTitleWidth; + + if (Tmp_win->icon->w_width < Tmp_win->icon->width) + { + Tmp_win->icon->x = (Tmp_win->icon->width - Tmp_win->icon->w_width)/2; + Tmp_win->icon->x += Scr->IconManagerShadowDepth + 3; + Tmp_win->icon->w_width = Tmp_win->icon->width; + } + else + { + Tmp_win->icon->x = Scr->IconManagerShadowDepth + 3; + } + + x = GetIconOffset (Tmp_win->icon); + Tmp_win->icon->y = Tmp_win->icon->height + Scr->IconFont.height + + Scr->IconManagerShadowDepth; + Tmp_win->icon->w_height = Tmp_win->icon->height + Scr->IconFont.height + + 2 * Scr->IconManagerShadowDepth + 6; + + XResizeWindow(dpy, Tmp_win->icon->w, Tmp_win->icon->w_width, Tmp_win->icon->w_height); + if (Tmp_win->icon->bm_w) + { + XRectangle rect; + + XMoveWindow(dpy, Tmp_win->icon->bm_w, x, 0); + XMapWindow(dpy, Tmp_win->icon->bm_w); + if (Tmp_win->icon->image && Tmp_win->icon->image->mask) { + XShapeCombineMask(dpy, Tmp_win->icon->bm_w, ShapeBounding, 0, 0, + Tmp_win->icon->image->mask, ShapeSet); + XShapeCombineMask(dpy, Tmp_win->icon->w, ShapeBounding, x, 0, + Tmp_win->icon->image->mask, ShapeSet); + } else if (Tmp_win->icon->has_title) { + rect.x = x; + rect.y = 0; + rect.width = Tmp_win->icon->width; + rect.height = Tmp_win->icon->height; + XShapeCombineRectangles (dpy, Tmp_win->icon->w, ShapeBounding, + 0, 0, &rect, 1, ShapeSet, 0); + } + if (Tmp_win->icon->has_title) { + if (Scr->ShrinkIconTitles && Tmp_win->icon->title_shrunk) { + rect.x = x; + rect.y = Tmp_win->icon->height; + rect.width = Tmp_win->icon->width; + rect.height = Tmp_win->icon->w_height - Tmp_win->icon->height; + } else { + rect.x = 0; + rect.y = Tmp_win->icon->height; + rect.width = Tmp_win->icon->w_width; + rect.height = Tmp_win->icon->w_height - Tmp_win->icon->height; + } + XShapeCombineRectangles (dpy, Tmp_win->icon->w, ShapeBounding, 0, + 0, &rect, 1, ShapeUnion, 0); + } + } + if (Scr->ShrinkIconTitles && + Tmp_win->icon->title_shrunk && + Tmp_win->icon_on && (visible (Tmp_win))) { + IconDown (Tmp_win); + IconUp (Tmp_win); + } + if (Tmp_win->isicon) + { + XClearArea(dpy, Tmp_win->icon->w, 0, 0, 0, 0, True); + } +wmapupd: + WMapUpdateIconName (Tmp_win); +} + + + +/*********************************************************************** + * + * Procedure: + * HandleClientMessage - client message event handler + * + *********************************************************************** + */ + +void HandleClientMessage(void) +{ + TwmWindow *twm_win; + int i; + + if (Event.xclient.message_type == _XA_WM_CHANGE_STATE) { + if (Tmp_win != NULL) { + if (Event.xclient.data.l[0] == IconicState && !Tmp_win->isicon) { + XEvent button; + XQueryPointer (dpy, Scr->Root, &JunkRoot, &JunkChild, + &(button.xmotion.x_root), + &(button.xmotion.y_root), + &JunkX, &JunkY, &JunkMask); + + ExecuteFunction (F_ICONIFY, NULLSTR, Event.xany.window, + Tmp_win, &button, FRAME, FALSE); + XUngrabPointer (dpy, CurrentTime); + } + } + return; + } +#ifdef GNOME + /* 6/19/1999 nhd for GNOME compliance */ + if (Event.xclient.message_type == _XA_WIN_WORKSPACE) { + /* XXXXX + supposedly works with a single screen, but is less certain with + multiple screens */ + GotoWorkSpaceByNumber (Scr->currentvs, Event.xclient.data.l[0]); + return; + } + if (Event.xclient.message_type == _XA_WIN_STATE) { + unsigned long new_stuff = (unsigned long) Event.xclient.data.l [1]; + unsigned long old_stuff = (unsigned long) Event.xclient.data.l [0]; + Window tmp_win = Event.xclient.window; + for (twm_win = Scr->FirstWindow; twm_win != NULL; twm_win = twm_win->next) + if (twm_win->w == tmp_win) break; + if (twm_win == NULL) return; + for (i = 1; i < (1 << 10); i <<= 1){ + switch (old_stuff & i) { + case WIN_STATE_STICKY: /* sticky */ + if (new_stuff & i) OccupyAll (twm_win); + else ChangeOccupation (twm_win, (1<<(Scr->currentvs->wsw->currentwspc->number))); + break; + case WIN_STATE_MINIMIZED: /* minimized - reserved */ + break; + case WIN_STATE_MAXIMIZED_VERT: /* window in maximized V state */ + break; + case WIN_STATE_MAXIMIZED_HORIZ: /* maximized horizontally */ + break; + case WIN_STATE_HIDDEN: /* hidden - what does this mean?? */ + break; + case WIN_STATE_SHADED: /* shaded (squeezed) */ + Squeeze (twm_win); + break; + case WIN_STATE_HID_WORKSPACE: /* not on this workspace */ + break; + case WIN_STATE_HID_TRANSIENT: /* owner of transient hidden ? */ + break; + case WIN_STATE_FIXED_POSITION: /* position fixed, don't move */ + break; + case WIN_STATE_ARRANGE_IGNORE: /* ignore when auto-arranging */ + break; + } + } + } +#endif /* GNOME */ +} + + + +/*********************************************************************** + * + * Procedure: + * HandleExpose - expose event handler + * + *********************************************************************** + */ + +static void flush_expose(Window w); + +void HandleExpose(void) +{ + MenuRoot *tmp; + virtualScreen *vs; + + if (XFindContext(dpy, Event.xany.window, MenuContext, (XPointer *)&tmp) == 0) + { + PaintMenu(tmp, &Event); + return; + } + + if (Event.xexpose.count != 0) + return; + + if (Event.xany.window == Scr->InfoWindow && InfoLines) + { + int i; + int height; + + Draw3DBorder (Scr->InfoWindow, 0, 0, + InfoWidth, InfoHeight, 2, Scr->DefaultC, off, True, False); + + FB(Scr->DefaultC.fore, Scr->DefaultC.back); + + height = Scr->DefaultFont.height+2; + for (i = 0; i < InfoLines; i++) + { + XmbDrawString(dpy, Scr->InfoWindow, Scr->DefaultFont.font_set, + Scr->NormalGC, 5, + (i*height) + Scr->DefaultFont.y + 5, + Info[i], strlen(Info[i])); + } + flush_expose (Event.xany.window); + } + else if (Tmp_win != NULL) + { + if (Scr->use3Dborders && (Event.xany.window == Tmp_win->frame)) { + PaintBorders (Tmp_win, ((Tmp_win == Scr->Focus) ? True : False)); + flush_expose (Event.xany.window); + return; + } + else + if (Event.xany.window == Tmp_win->title_w) + { + PaintTitle (Tmp_win); + flush_expose (Event.xany.window); + return; + } + else if (Tmp_win->icon && (Event.xany.window == Tmp_win->icon->w) && + ! Scr->NoIconTitlebar && + ! LookInList (Scr->NoIconTitle, Tmp_win->full_name, &Tmp_win->class)) + { + PaintIcon (Tmp_win); + flush_expose (Event.xany.window); + return; + } else if (Tmp_win->titlebuttons) { + int i; + TBWindow *tbw; + Window w = Event.xany.window; + int nb = Scr->TBInfo.nleft + Scr->TBInfo.nright; + + for (i = 0, tbw = Tmp_win->titlebuttons; i < nb; i++, tbw++) { + if (w == tbw->window) { + PaintTitleButton (Tmp_win, tbw); + flush_expose (tbw->window); + return; + } + } + } + for (vs = Scr->vScreenList; vs != NULL; vs = vs->next) { + if (Tmp_win == vs->wsw->twm_win) { + WMgrHandleExposeEvent (vs, &Event); + flush_expose (Event.xany.window); + return; + } + } + if (Tmp_win == Scr->workSpaceMgr.occupyWindow->twm_win) { + PaintOccupyWindow (); + flush_expose (Event.xany.window); + return; + } else if (Tmp_win->iconmanagerlist) { + WList *iconmanagerlist = Tmp_win->iconmanagerlist; + + if (Event.xany.window == iconmanagerlist->w) + { + int offs; + + DrawIconManagerBorder(iconmanagerlist, True); + + FB(iconmanagerlist->cp.fore, iconmanagerlist->cp.back); + offs = Scr->use3Diconmanagers ? Scr->IconManagerShadowDepth : 2; + if (Scr->use3Diconmanagers && (Scr->Monochrome != COLOR)) + XmbDrawImageString(dpy, Event.xany.window, + Scr->IconManagerFont.font_set, + Scr->NormalGC, + iconmgr_textx, + Scr->IconManagerFont.y + offs + 2, + Tmp_win->icon_name, + strlen(Tmp_win->icon_name)); + else + XmbDrawString(dpy, Event.xany.window, + Scr->IconManagerFont.font_set, Scr->NormalGC, + iconmgr_textx, + Scr->IconManagerFont.y + offs + 2, + Tmp_win->icon_name, + strlen(Tmp_win->icon_name)); + flush_expose (Event.xany.window); + return; + } + if (Event.xany.window == iconmanagerlist->icon) + { + if (Scr->use3Diconmanagers && iconmanagerlist->iconifypm) { + XCopyArea(dpy, iconmanagerlist->iconifypm, + iconmanagerlist->icon, + Scr->NormalGC, 0, 0, + iconifybox_width, iconifybox_height, 0, 0); + } + else { + FB(iconmanagerlist->cp.fore, iconmanagerlist->cp.back); + XCopyPlane(dpy, Scr->siconifyPm, iconmanagerlist->icon, + Scr->NormalGC, 0,0, + iconifybox_width, iconifybox_height, 0, 0, 1); + } + flush_expose (Event.xany.window); + return; + } + } + } +} + + + +static void remove_window_from_ring (TwmWindow *tmp) +{ + TwmWindow *prev = tmp->ring.prev, *next = tmp->ring.next; + + if (enter_win == tmp) { + enter_flag = FALSE; + enter_win = NULL; + } + if (raise_win == Tmp_win) raise_win = NULL; + if (leave_win == tmp) { + leave_flag = FALSE; + leave_win = NULL; + } + if (lower_win == Tmp_win) lower_win = NULL; + + /* + * 1. Unlink window + * 2. If window was only thing in ring, null out ring + * 3. If window was ring leader, set to next (or null) + */ + if (prev) prev->ring.next = next; + if (next) next->ring.prev = prev; + if (Scr->Ring == tmp) + Scr->Ring = (next != tmp ? next : (TwmWindow *) NULL); + + if (!Scr->Ring || Scr->RingLeader == tmp) Scr->RingLeader = Scr->Ring; +} + + + +/*********************************************************************** + * + * Procedure: + * HandleDestroyNotify - DestroyNotify event handler + * + *********************************************************************** + */ + +void HandleDestroyNotify(void) +{ + /* + * Warning, this is also called by HandleUnmapNotify; if it ever needs to + * look at the event, HandleUnmapNotify will have to mash the UnmapNotify + * into a DestroyNotify. + */ + + if (Tmp_win == NULL) + return; + + RemoveWindowFromRegion (Tmp_win); +#ifdef GNOME + GnomeDeleteClientWindow (Tmp_win); /* Fix the gnome client list */ +#endif /* GNOME */ + if (Tmp_win == Scr->Focus) + { + Scr->Focus = (TwmWindow*) NULL; + FocusOnRoot(); + } + if (Scr->SaveWorkspaceFocus) { + struct WorkSpace *ws; + for (ws = Scr->workSpaceMgr.workSpaceList; ws != NULL; ws = ws->next) { + if (ws->save_focus == Tmp_win) + ws->save_focus = NULL; + } + } + XDeleteContext(dpy, Tmp_win->w, TwmContext); + XDeleteContext(dpy, Tmp_win->w, ScreenContext); + XDeleteContext(dpy, Tmp_win->frame, TwmContext); + XDeleteContext(dpy, Tmp_win->frame, ScreenContext); + if (Tmp_win->icon && Tmp_win->icon->w) + { + XDeleteContext(dpy, Tmp_win->icon->w, TwmContext); + XDeleteContext(dpy, Tmp_win->icon->w, ScreenContext); + } + if (Tmp_win->title_height) { + int nb = Scr->TBInfo.nleft + Scr->TBInfo.nright; + + XDeleteContext(dpy, Tmp_win->title_w, TwmContext); + XDeleteContext(dpy, Tmp_win->title_w, ScreenContext); + if (Tmp_win->hilite_wl) { + XDeleteContext(dpy, Tmp_win->hilite_wl, TwmContext); + XDeleteContext(dpy, Tmp_win->hilite_wl, ScreenContext); + } + if (Tmp_win->hilite_wr) { + XDeleteContext(dpy, Tmp_win->hilite_wr, TwmContext); + XDeleteContext(dpy, Tmp_win->hilite_wr, ScreenContext); + } + if (Tmp_win->lolite_wr) { + XDeleteContext(dpy, Tmp_win->lolite_wr, TwmContext); + XDeleteContext(dpy, Tmp_win->lolite_wr, ScreenContext); + } + if (Tmp_win->lolite_wl) { + XDeleteContext(dpy, Tmp_win->lolite_wl, TwmContext); + XDeleteContext(dpy, Tmp_win->lolite_wl, ScreenContext); + } + if (Tmp_win->titlebuttons) { + int i; + + for (i = 0; i < nb; i++) { + XDeleteContext (dpy, Tmp_win->titlebuttons[i].window, + TwmContext); + XDeleteContext (dpy, Tmp_win->titlebuttons[i].window, + ScreenContext); + } + } + /* + * The hilite_wl etc windows don't need to be XDestroyWindow()ed + * since that will happen when the parent is destroyed (??) + */ + } + + if (Scr->cmapInfo.cmaps == &Tmp_win->cmaps) { + InstallColormaps(DestroyNotify, &Scr->RootColormaps); + } + + /* + * TwmWindows contain the following pointers + * + * 1. full_name + * 2. name + * 3. icon_name + * 4. wmhints + * 5. class.res_name + * 6. class.res_class + * 7. list + * 8. iconmgrp + * 9. cwins + * 10. titlebuttons + * 11. window ring + * 12. squeeze_info (delete if squeeze_info_copied) + * 13. HiliteImage + * 14. iconslist + */ + WMapDestroyWindow (Tmp_win); + if (Tmp_win->gray) XFreePixmap (dpy, Tmp_win->gray); + + /* + * According to the manual page, the following destroys all child windows + * of the frame too, which is most of the windows we're concerned with, so + * anything related to them must be done before here. + * Icons are not child windows. + */ + XDestroyWindow(dpy, Tmp_win->frame); + if (Tmp_win->icon) { + if (Tmp_win->icon->w && !Tmp_win->icon_not_ours) { + XDestroyWindow(dpy, Tmp_win->icon->w); + IconDown (Tmp_win); + } + free (Tmp_win->icon); + Tmp_win->icon = NULL; + } + Tmp_win->occupation = 0; + RemoveIconManager(Tmp_win); /* 7 */ + if (Scr->FirstWindow == Tmp_win) + Scr->FirstWindow = Tmp_win->next; + if (Tmp_win->prev != NULL) + Tmp_win->prev->next = Tmp_win->next; + if (Tmp_win->next != NULL) + Tmp_win->next->prev = Tmp_win->prev; + if (Tmp_win->auto_raise) Scr->NumAutoRaises--; + if (Tmp_win->auto_lower) Scr->NumAutoLowers--; + if (Tmp_win->frame == lowerontop) lowerontop = -1; + + free_window_names (Tmp_win, True, True, True); /* 1, 2, 3 */ + if (Tmp_win->wmhints) /* 4 */ + XFree ((char *)Tmp_win->wmhints); + if (Tmp_win->class.res_name && Tmp_win->class.res_name != NoName) /* 5 */ + XFree ((char *)Tmp_win->class.res_name); + if (Tmp_win->class.res_class && Tmp_win->class.res_class != NoName) /* 6 */ + XFree ((char *)Tmp_win->class.res_class); + free_cwins (Tmp_win); /* 9 */ + if (Tmp_win->titlebuttons) { /* 10 */ + free(Tmp_win->titlebuttons); + Tmp_win->titlebuttons = NULL; + } + + remove_window_from_ring (Tmp_win); /* 11 */ + if (Tmp_win->squeeze_info_copied) { /* 12 */ + free(Tmp_win->squeeze_info); + Tmp_win->squeeze_info = NULL; + } + DeleteHighlightWindows(Tmp_win); /* 13 */ + DeleteIconsList (Tmp_win); /* 14 */ + + free((char *)Tmp_win); + Tmp_win = NULL; + + if (Scr->ClickToFocus || Scr->SloppyFocus) + set_last_window (Scr->currentvs->wsw->currentwspc); +} + + + +void HandleCreateNotify(void) +{ +#ifdef DEBUG_EVENTS + fprintf(stderr, "CreateNotify w = 0x%x\n", Event.xcreatewindow.window); + fflush(stderr); + XBell(dpy, 0); + XSync(dpy, 0); +#endif +} + + + +/*********************************************************************** + * + * Procedure: + * HandleMapRequest - MapRequest event handler + * + *********************************************************************** + */ + +void HandleMapRequest(void) +{ + int zoom_save; + + Event.xany.window = Event.xmaprequest.window; + Tmp_win = GetTwmWindow(Event.xany.window); + + /* If the window has never been mapped before ... */ + if (Tmp_win == NULL) + { + /* Add decorations. */ + Tmp_win = AddWindow(Event.xany.window, FALSE, (IconMgr *) NULL); + if (Tmp_win == NULL) return; +#ifdef GNOME + GnomeAddClientWindow (Tmp_win); /* add the new window to the gnome client list */ +#endif /* GNOME */ + } + else + { + /* + * If the window has been unmapped by the client, it won't be listed + * in the icon manager. Add it again, if requested. + */ + if (Tmp_win->iconmanagerlist == NULL) + (void) AddIconManager (Tmp_win); + } + + if (Tmp_win->iconmgr) return; + if (Tmp_win->squeezed) return; + + if (Scr->WindowMask) XRaiseWindow (dpy, Scr->WindowMask); + + /* If it's not merely iconified, and we have hints, use them. */ + if (! Tmp_win->isicon) + { + int state; + Window icon; + + state = NormalState; + /* use WM_STATE if enabled */ + if (!(RestartPreviousState && GetWMState(Tmp_win->w, &state, &icon) && + (state == NormalState || state == IconicState || state == InactiveState))) { + if (Tmp_win->wmhints && (Tmp_win->wmhints->flags & StateHint)) + state = Tmp_win->wmhints->initial_state; + } + switch (state) + { + case DontCareState: + case NormalState: + case ZoomState: + if (Tmp_win->StartSqueezed) + Squeeze (Tmp_win); + else + XMapWindow(dpy, Tmp_win->w); + XMapWindow(dpy, Tmp_win->frame); + SetMapStateProp(Tmp_win, NormalState); + SetRaiseWindow (Tmp_win); + Tmp_win->mapped = TRUE; + if (Scr->ClickToFocus && + Tmp_win->wmhints && + Tmp_win->wmhints->input) SetFocus (Tmp_win, CurrentTime); + /* kai */ + if (Scr->AutoFocusToTransients && + Tmp_win->transient && + Tmp_win->wmhints && + Tmp_win->wmhints->input) SetFocus (Tmp_win, CurrentTime); + break; + + case InactiveState: + Tmp_win->mapped = TRUE; + if (Tmp_win->UnmapByMovingFarAway) { + XMoveWindow (dpy, Tmp_win->frame, Scr->rootw + 1, Scr->rooth + 1); + XMapWindow (dpy, Tmp_win->w); + XMapWindow (dpy, Tmp_win->frame); + } + if (Tmp_win->StartSqueezed) Squeeze (Tmp_win); + break; + + case IconicState: + zoom_save = Scr->DoZoom; + Scr->DoZoom = FALSE; + Iconify(Tmp_win, -100, -100); + Scr->DoZoom = zoom_save; + break; + } + } + /* If no hints, or currently an icon, just "deiconify" */ + else + { + if (1/*OCCUPY (Tmp_win, Scr->workSpaceMgr.activeWSPC)*/) { + if (Tmp_win->StartSqueezed) Squeeze (Tmp_win); + DeIconify(Tmp_win); + SetRaiseWindow (Tmp_win); + } + else { + Tmp_win->mapped = TRUE; + } + } + if (Tmp_win->mapped) WMapMapWindow (Tmp_win); + MaybeAnimate = True; +} + + + +void SimulateMapRequest (Window w) +{ + Event.xmaprequest.window = w; + HandleMapRequest (); +} + + + +/*********************************************************************** + * + * Procedure: + * HandleMapNotify - MapNotify event handler + * + *********************************************************************** + */ + +void HandleMapNotify(void) +{ + if (Tmp_win == NULL) + return; + + /* + * Need to do the grab to avoid race condition of having server send + * MapNotify to client before the frame gets mapped; this is bad because + * the client would think that the window has a chance of being viewable + * when it really isn't. + */ + + XGrabServer (dpy); + if (Tmp_win->icon && Tmp_win->icon->w) XUnmapWindow(dpy, Tmp_win->icon->w); + if (Tmp_win->title_w) XMapSubwindows(dpy, Tmp_win->title_w); + XMapSubwindows(dpy, Tmp_win->frame); + if (Scr->Focus != Tmp_win && Tmp_win->hilite_wl) XUnmapWindow(dpy, Tmp_win->hilite_wl); + if (Scr->Focus != Tmp_win && Tmp_win->hilite_wr) XUnmapWindow(dpy, Tmp_win->hilite_wr); + if (Scr->Focus == Tmp_win && Tmp_win->lolite_wl) XUnmapWindow(dpy, Tmp_win->lolite_wl); + if (Scr->Focus == Tmp_win && Tmp_win->lolite_wr) XUnmapWindow(dpy, Tmp_win->lolite_wr); + + XMapWindow(dpy, Tmp_win->frame); + XUngrabServer (dpy); + XFlush (dpy); + Tmp_win->mapped = TRUE; + Tmp_win->isicon = FALSE; + Tmp_win->icon_on = FALSE; +} + + + +/*********************************************************************** + * + * Procedure: + * HandleUnmapNotify - UnmapNotify event handler + * + *********************************************************************** + */ + +void HandleUnmapNotify(void) +{ + int dstx, dsty; + Window dumwin; + + /* + * The July 27, 1988 ICCCM spec states that a client wishing to switch + * to WithdrawnState should send a synthetic UnmapNotify with the + * event field set to (pseudo-)root, in case the window is already + * unmapped (which is the case for twm for IconicState). Unfortunately, + * we looked for the TwmContext using that field, so try the window + * field also. + */ + if (Tmp_win == NULL) + { + Event.xany.window = Event.xunmap.window; + Tmp_win = GetTwmWindow(Event.xany.window); + } + + if (Tmp_win == NULL || Event.xunmap.window == Tmp_win->frame || + (Tmp_win->icon && Event.xunmap.window == Tmp_win->icon->w) || + (!Tmp_win->mapped && !Tmp_win->isicon)) + return; +/* + if (Tmp_win == NULL || (!Tmp_win->mapped && !Tmp_win->isicon)) + return; +*/ + /* + * The program may have unmapped the client window, from either + * NormalState or IconicState. Handle the transition to WithdrawnState. + * + * We need to reparent the window back to the root (so that twm exiting + * won't cause it to get mapped) and then throw away all state (pretend + * that we've received a DestroyNotify). + */ +/* Is it the correct behaviour ??? + XDeleteProperty (dpy, Tmp_win->w, _XA_WM_OCCUPATION); +*/ + XGrabServer (dpy); + if (XTranslateCoordinates (dpy, Event.xunmap.window, Tmp_win->attr.root, + 0, 0, &dstx, &dsty, &dumwin)) { + XEvent ev; + Bool reparented = XCheckTypedWindowEvent (dpy, Event.xunmap.window, + ReparentNotify, &ev); + SetMapStateProp (Tmp_win, WithdrawnState); + if (reparented) { + if (Tmp_win->old_bw) XSetWindowBorderWidth (dpy, + Event.xunmap.window, + Tmp_win->old_bw); + if (Tmp_win->wmhints && (Tmp_win->wmhints->flags & IconWindowHint)) + XUnmapWindow (dpy, Tmp_win->wmhints->icon_window); + } else { + XReparentWindow (dpy, Event.xunmap.window, Tmp_win->attr.root, + dstx, dsty); + RestoreWithdrawnLocation (Tmp_win); + } + XRemoveFromSaveSet (dpy, Event.xunmap.window); + XSelectInput (dpy, Event.xunmap.window, NoEventMask); + HandleDestroyNotify (); /* do not need to mash event before */ + } /* else window no longer exists and we'll get a destroy notify */ + XUngrabServer (dpy); + XFlush (dpy); +} + + + +/*********************************************************************** + * + * Procedure: + * HandleMotionNotify - MotionNotify event handler + * + *********************************************************************** + */ + +void HandleMotionNotify(void) +{ + if (ResizeWindow != (Window) 0) + { + XQueryPointer( dpy, Event.xany.window, + &(Event.xmotion.root), &JunkChild, + &(Event.xmotion.x_root), &(Event.xmotion.y_root), + &(Event.xmotion.x), &(Event.xmotion.y), + &JunkMask); + + FixRootEvent (&Event); + /* Set WindowMoved appropriately so that f.deltastop will + work with resize as well as move. */ + if (abs (Event.xmotion.x - ResizeOrigX) >= Scr->MoveDelta + || abs (Event.xmotion.y - ResizeOrigY) >= Scr->MoveDelta) + WindowMoved = TRUE; + + Tmp_win = GetTwmWindow(ResizeWindow); + if (Tmp_win && Tmp_win->winbox) { + XTranslateCoordinates (dpy, Scr->Root, Tmp_win->winbox->window, + Event.xmotion.x_root, Event.xmotion.y_root, + &(Event.xmotion.x_root), &(Event.xmotion.y_root), &JunkChild); + } + DoResize(Event.xmotion.x_root, Event.xmotion.y_root, Tmp_win); + } + else + if (Scr->BorderCursors && Tmp_win && Event.xany.window == Tmp_win->frame) { + SetBorderCursor (Tmp_win, Event.xmotion.x, Event.xmotion.y); + } +} + + + +/*********************************************************************** + * + * Procedure: + * HandleButtonRelease - ButtonRelease event handler + * + *********************************************************************** + */ +void HandleButtonRelease(void) +{ + int xl, yt, w, h; + unsigned mask; + +#ifdef GNOME + if (GnomeProxyButtonPress == Event.xbutton.button) { + GnomeProxyButtonPress = -1; + XSendEvent (dpy, Scr->currentvs->wsw->w, False, SubstructureNotifyMask, &Event); + } +#endif /* GNOME */ + if (InfoLines) /* delete info box on 2nd button release */ + if (Context == C_IDENTIFY) { + XUnmapWindow(dpy, Scr->InfoWindow); + InfoLines = 0; + Context = C_NO_CONTEXT; + } + + if (DragWindow != None) + { + MoveOutline(Scr->XineramaRoot, 0, 0, 0, 0, 0, 0); + + Tmp_win = GetTwmWindow(DragWindow); + if (Tmp_win->winbox) { + XTranslateCoordinates (dpy, Scr->Root, Tmp_win->winbox->window, + Event.xbutton.x_root, Event.xbutton.y_root, + &(Event.xbutton.x_root), &(Event.xbutton.y_root), &JunkChild); + } + if (DragWindow == Tmp_win->frame) + { + xl = Event.xbutton.x_root - DragX - Tmp_win->frame_bw; + yt = Event.xbutton.y_root - DragY - Tmp_win->frame_bw; + w = DragWidth + 2 * Tmp_win->frame_bw; + h = DragHeight + 2 * Tmp_win->frame_bw; + } + else + { + xl = Event.xbutton.x_root - DragX - DragBW; + yt = Event.xbutton.y_root - DragY - DragBW; + w = DragWidth + 2 * DragBW; + h = DragHeight + 2 * DragBW; + } + + if (ConstMove) + { + if (ConstMoveDir == MOVE_HORIZ) + yt = ConstMoveY; + + if (ConstMoveDir == MOVE_VERT) + xl = ConstMoveX; + + if (ConstMoveDir == MOVE_NONE) + { + yt = ConstMoveY; + xl = ConstMoveX; + } + } + + if (Scr->DontMoveOff && MoveFunction != F_FORCEMOVE) + TryToGrid (Tmp_win, &xl, &yt); + if (MoveFunction == F_MOVEPUSH && + Scr->OpaqueMove && + DragWindow == Tmp_win->frame) TryToPush (Tmp_win, xl, yt, 0); + if (MoveFunction == F_MOVEPACK || + (MoveFunction == F_MOVEPUSH && + DragWindow == Tmp_win->frame)) TryToPack (Tmp_win, &xl, &yt); + if (Scr->DontMoveOff && MoveFunction != F_FORCEMOVE) + { + ConstrainByBorders (Tmp_win, &xl, w, &yt, h); + } + + CurrentDragX = xl; + CurrentDragY = yt; + /* + * sometimes getScreenOf() replies with the wrong window when moving + * y to a negative number. Need to figure out why... [XXX] + */ + if(xl < 0 || yt < 0 || xl > Scr->rootw || yt > Scr->rooth) { + int odestx, odesty; + int destx, desty; + Window cr; + virtualScreen *newvs; + + XTranslateCoordinates(dpy, Tmp_win->vs->window, + Scr->XineramaRoot, xl, yt, &odestx, &odesty, &cr); + + newvs = findIfVScreenOf(odestx, odesty); + if(newvs && newvs->wsw && newvs->wsw->currentwspc) { + XTranslateCoordinates(dpy, Scr->XineramaRoot, + newvs->window, odestx, odesty, + &destx, &desty, &cr); + AddToWorkSpace(newvs->wsw->currentwspc->name, Tmp_win); + RemoveFromWorkSpace(Tmp_win->vs->wsw->currentwspc->name, Tmp_win); + xl = destx; + yt = desty; + } + + } + if (DragWindow == Tmp_win->frame) + SetupWindow (Tmp_win, xl, yt, + Tmp_win->frame_width, Tmp_win->frame_height, -1); + else + XMoveWindow (dpy, DragWindow, xl, yt); + + if (!Scr->NoRaiseMove) /* && !Scr->OpaqueMove) opaque already did */ + RaiseFrame(DragWindow); + + if (!Scr->OpaqueMove) + UninstallRootColormap(); + else + XSync(dpy, 0); + + if (Scr->NumAutoRaises) { + enter_flag = TRUE; + enter_win = NULL; + raise_win = ((DragWindow == Tmp_win->frame && !Scr->NoRaiseMove) + ? Tmp_win : NULL); + } + + /* CCC equivalent code for auto lower not needed? */ + +#if 0 + if (Scr->NumAutoLowers) { + leave_flag = TRUE; + leave_win = NULL; + lower_win = ((DragWindow == Tmp_win->frame) + ? Tmp_win : NULL); + } +#endif + + DragWindow = (Window) 0; + ConstMove = FALSE; + } + + if (ResizeWindow != (Window) 0) + { + EndResize(); + } + + if (ActiveMenu != NULL && RootFunction == 0) + { + if (ActiveItem) + { + int func = ActiveItem->func; + Action = ActiveItem->action; + switch (func) { + case F_TITLE: + if (Scr->StayUpMenus) { + ButtonPressed = -1; + if (Scr->WarpToDefaultMenuEntry && ActiveMenu->defaultitem) { + WarpCursorToDefaultEntry (ActiveMenu); + } + return; + } + break; + case F_MOVE: + case F_FORCEMOVE: + case F_DESTROY: + case F_DELETE: + case F_DELETEORDESTROY: + ButtonPressed = -1; + break; + case F_CIRCLEUP: + case F_CIRCLEDOWN: + case F_REFRESH: + case F_WARPTOSCREEN: + PopDownMenu(); + break; + default: + break; + } + if (func != F_PIN && func != F_MENU) PopDownMenu(); + ExecuteFunction(func, Action, + ButtonWindow ? ButtonWindow->frame : None, + ButtonWindow, &Event/*&ButtonEvent*/, Context, TRUE); + Context = C_NO_CONTEXT; + ButtonWindow = NULL; + + /* if we are not executing a defered command, then take down the + * menu + */ + if (ActiveMenu) PopDownMenu(); + } + else + if (Scr->StayUpMenus && !ActiveMenu->entered) { + ButtonPressed = -1; + if (Scr->WarpToDefaultMenuEntry && ActiveMenu->defaultitem) { + WarpCursorToDefaultEntry (ActiveMenu); + } + return; + } + else + PopDownMenu(); + } + + mask = (Button1Mask|Button2Mask|Button3Mask|Button4Mask|Button5Mask); + switch (Event.xbutton.button) + { + case Button1: mask &= ~Button1Mask; break; + case Button2: mask &= ~Button2Mask; break; + case Button3: mask &= ~Button3Mask; break; + case Button4: mask &= ~Button4Mask; break; + case Button5: mask &= ~Button5Mask; break; + } + + if (RootFunction != 0 || + ResizeWindow != None || + DragWindow != None) + ButtonPressed = -1; + + if (AlternateKeymap || AlternateContext) { + ButtonPressed = -1; + return; + } + + if (RootFunction == 0 && + (Event.xbutton.state & mask) == 0 && + DragWindow == None && + ResizeWindow == None) + { + XUngrabPointer(dpy, CurrentTime); + XUngrabServer(dpy); + XFlush(dpy); + EventHandler[EnterNotify] = HandleEnterNotify; + EventHandler[LeaveNotify] = HandleLeaveNotify; + ButtonPressed = -1; + if (DownIconManager) + { + DownIconManager->down = FALSE; + if (Scr->Highlight) DrawIconManagerBorder(DownIconManager, False); + DownIconManager = NULL; + } + Cancel = FALSE; + } +} + + + +static void do_menu (MenuRoot *menu, /* menu to pop up */ + Window w) /* invoking window or None */ +{ + int x = Event.xbutton.x_root; + int y = Event.xbutton.y_root; + Bool center; + + if (!Scr->NoGrabServer) + XGrabServer(dpy); + if (w) { + int h = Scr->TBInfo.width - Scr->TBInfo.border; + Window child; + + (void) XTranslateCoordinates (dpy, w, Scr->Root, 0, h, &x, &y, &child); + center = False; + } else { + center = True; + } + if (PopUpMenu (menu, x, y, center)) { + UpdateMenu(); + } else { + XBell (dpy, 0); + } +} + +static void do_key_menu (MenuRoot *menu, /* menu to pop up */ + Window w) /* invoking window or None */ +{ + int x = Event.xkey.x_root; + int y = Event.xkey.y_root; + Bool center; + +/* I don't think this is necessary. + if (!Scr->NoGrabServer) XGrabServer(dpy); +*/ + if (w) { + int h = Scr->TBInfo.width - Scr->TBInfo.border; + Window child; + + (void) XTranslateCoordinates (dpy, w, Scr->Root, 0, h, &x, &y, &child); + center = False; + } else { + center = True; + } + if (PopUpMenu (menu, x, y, center)) { + UpdateMenu(); + } else { + XBell (dpy, 0); + } + +} + + + +/*********************************************************************** + * + * Procedure: + * HandleButtonPress - ButtonPress event handler + * + *********************************************************************** + */ +void HandleButtonPress(void) +{ + unsigned int modifier; + Cursor cur; + MenuRoot *mr; + FuncButton *tmp = 0; + int func = 0; + Window w; + + GnomeProxyButtonPress = -1; + + /* pop down the menu, if any */ + + if (XFindContext (dpy, Event.xbutton.window, MenuContext, (XPointer *) &mr) != XCSUCCESS) { + mr = (MenuRoot*) 0; + } + if (ActiveMenu && (! ActiveMenu->pinned) && + (Event.xbutton.subwindow != ActiveMenu->w)) { + PopDownMenu(); + return; + } + if ((ActiveMenu != NULL) && (RootFunction != 0) && (mr != ActiveMenu)) PopDownMenu(); + + XSync(dpy, 0); + /* XXX - remove? */ + + if (ButtonPressed != -1 && !InfoLines) /* want menus if we have info box */ + { + /* we got another butt press in addition to one still held + * down, we need to cancel the operation we were doing + */ + Cancel = TRUE; + CurrentDragX = origDragX; + CurrentDragY = origDragY; + if (!menuFromFrameOrWindowOrTitlebar) { + if (Scr->OpaqueMove && DragWindow != None) { + XMoveWindow (dpy, DragWindow, origDragX, origDragY); + } else { + MoveOutline(Scr->Root, 0, 0, 0, 0, 0, 0); + } + } + XUnmapWindow(dpy, Scr->SizeWindow); + if (!Scr->OpaqueMove) + UninstallRootColormap(); + ResizeWindow = None; + DragWindow = None; + cur = LeftButt; + if (Event.xbutton.button == Button2) + cur = MiddleButt; + else if (Event.xbutton.button >= Button3) + cur = RightButt; + + XGrabPointer(dpy, Scr->Root, True, + ButtonReleaseMask | ButtonPressMask, + GrabModeAsync, GrabModeAsync, + Scr->Root, cur, CurrentTime); + + return; + } + else + ButtonPressed = Event.xbutton.button; + + if ((ActiveMenu != NULL) && (ActiveMenu->pinned)) { + if (Event.xbutton.window == ActiveMenu->w) { + modifier = (Event.xbutton.state & mods_used); + modifier = set_mask_ignore (modifier); + if ((ActiveItem && (ActiveItem->func == F_TITLE)) || (modifier == 8)) { + MoveMenu (&Event); + /*ButtonPressed = -1;*/ + } + } + Context = C_ROOT; + return; + } + + if (ResizeWindow != None || + DragWindow != None || + ActiveMenu != NULL) + return; + + /* check the title bar buttons */ + if (Tmp_win && Tmp_win->title_height && Tmp_win->titlebuttons) + { + register int i; + register TBWindow *tbw; + register TitleButtonFunc *tbf; + int nb = Scr->TBInfo.nleft + Scr->TBInfo.nright; + + modifier = Event.xbutton.state & mods_used; + modifier = set_mask_ignore (modifier); + + for (i = 0, tbw = Tmp_win->titlebuttons; i < nb; i++, tbw++) { + if (Event.xany.window == tbw->window) { + for (tbf = tbw->info->funs; tbf; tbf = tbf->next) { + if (tbf->num == ButtonPressed + && tbf->mods == modifier) { + switch (tbf->func) { + case F_MENU : + Context = C_TITLE; + ButtonEvent = Event; + ButtonWindow = Tmp_win; + do_menu (tbf->menuroot, tbw->window); + break; + + default : + ExecuteFunction (tbf->func, tbf->action, + Event.xany.window, Tmp_win, + &Event, C_TITLE, FALSE); + } + return; + } + } + } + } + } + + Context = C_NO_CONTEXT; + + if (Event.xany.window == Scr->InfoWindow) + Context = C_IDENTIFY; + + if (Event.xany.window == Scr->Root) { + if (AlternateContext) { + XUngrabPointer (dpy, CurrentTime); + XUngrabKeyboard (dpy, CurrentTime); + AlternateContext = False; + Context = C_ALTERNATE; + } + else + if (AlternateKeymap && Event.xbutton.subwindow) { + int dx, dy; + Window child; + + w = Event.xbutton.subwindow; + Tmp_win = GetTwmWindow(w); + if (Tmp_win) { + Event.xany.window = Tmp_win->frame; + XTranslateCoordinates (dpy, Scr->Root, Tmp_win->frame, + Event.xbutton.x, Event.xbutton.y, &dx, &dy, &child); + Event.xbutton.x = dx; + Event.xbutton.x = dy; + Event.xbutton.subwindow = child; + } + } + else + Context = C_ROOT; + } + if (Tmp_win) + { + if (Tmp_win->iconmanagerlist && (RootFunction != 0) && + ((Event.xany.window == Tmp_win->iconmanagerlist->icon) || + (Event.xany.window == Tmp_win->iconmanagerlist->w))) { + Tmp_win = Tmp_win->iconmanagerlist->iconmgr->twm_win; + XTranslateCoordinates(dpy, Event.xany.window, Tmp_win->w, + Event.xbutton.x, Event.xbutton.y, + &JunkX, &JunkY, &JunkChild); + + Event.xbutton.x = JunkX - Tmp_win->frame_bw3D; + Event.xbutton.y = JunkY - Tmp_win->title_height - Tmp_win->frame_bw3D; + Event.xany.window = Tmp_win->w; + Context = C_WINDOW; + } + else if (Event.xany.window == Tmp_win->title_w) { + if (Scr->ClickToFocus && + Tmp_win->wmhints && + Tmp_win->wmhints->input) SetFocus (Tmp_win, CurrentTime); + Context = C_TITLE; + } + else if (Event.xany.window == Tmp_win->w) { + if (Scr->ClickToFocus || Scr->RaiseOnClick) { + if (Scr->ClickToFocus && + Tmp_win->wmhints && + Tmp_win->wmhints->input) { + SetFocus (Tmp_win, CurrentTime); + } + if (Scr->RaiseOnClick) { + RaiseWindow (Tmp_win); + WMapRaise (Tmp_win); + } + XSync (dpy, 0); + XAllowEvents (dpy, ReplayPointer, CurrentTime); + XSync (dpy, 0); + ButtonPressed = -1; + return; + } + else { + printf("ERROR! ERROR! ERROR! YOU SHOULD NOT BE HERE!!!\n"); + Context = C_WINDOW; + } + } + else if (Tmp_win->icon && (Event.xany.window == Tmp_win->icon->w)) + { + Context = C_ICON; + } + else if (Event.xany.window == Tmp_win->frame) + { + /* since we now place a button grab on the frame instead + * of the window, (see GrabButtons() in add_window.c), we + * need to figure out where the pointer exactly is before + * assigning Context. If the pointer is on the application + * window we will change the event structure to look as if + * it came from the application window. + */ + if (Event.xbutton.subwindow == Tmp_win->w) { + XTranslateCoordinates (dpy, Event.xany.window, Tmp_win->w, + Event.xbutton.x, Event.xbutton.y, + &Event.xbutton.x, &Event.xbutton.y, &JunkChild); + Event.xbutton.window = Tmp_win->w; + + if (Tmp_win->iswinbox && JunkChild) { + XTranslateCoordinates (dpy, Tmp_win->w, JunkChild, + Event.xbutton.x, Event.xbutton.y, + &JunkX, &JunkY, &JunkChild); + if (JunkChild && (Tmp_win = GetTwmWindow(JunkChild))) { + Event.xany.window = JunkChild; + Event.xbutton.x = JunkX; + Event.xbutton.y = JunkY; + } + } + Context = C_WINDOW; + } + else + if (Event.xbutton.subwindow && (Event.xbutton.subwindow == Tmp_win->title_w)) { + Context = C_TITLE; + } + else { + Context = C_FRAME; + } + if (Scr->ClickToFocus && + Tmp_win->wmhints && + Tmp_win->wmhints->input) SetFocus (Tmp_win, CurrentTime); + } + else if (Tmp_win->wspmgr || + (Tmp_win == Scr->workSpaceMgr.occupyWindow->twm_win)) { + Context = C_WINDOW; + } + else if (Tmp_win->iconmanagerlist) { + if ((Event.xany.window == Tmp_win->iconmanagerlist->icon) || + (Event.xany.window == Tmp_win->iconmanagerlist->w)) { + Tmp_win->iconmanagerlist->down = TRUE; + if (Scr->Highlight) + DrawIconManagerBorder(Tmp_win->iconmanagerlist, False); + DownIconManager = Tmp_win->iconmanagerlist; + Context = C_ICONMGR; + } + } + } + + /* this section of code checks to see if we were in the middle of + * a command executed from a menu + */ + if (RootFunction != 0) + { + if (Event.xany.window == Scr->Root) + { + Window win; + /* if the window was the Root, we don't know for sure it + * it was the root. We must check to see if it happened to be + * inside of a client that was getting button press events. + */ + XTranslateCoordinates(dpy, Scr->Root, Scr->Root, + Event.xbutton.x, + Event.xbutton.y, + &JunkX, &JunkY, &Event.xany.window); + + if (Event.xany.window != 0 && + (Tmp_win = GetTwmWindow(Event.xany.window))) { + if (Tmp_win->iswinbox) { + XTranslateCoordinates (dpy, Scr->Root, Event.xany.window, + JunkX, JunkY, &JunkX, &JunkY, &win); + XTranslateCoordinates (dpy, Event.xany.window, win, + JunkX, JunkY, &JunkX, &JunkY, &win); + if (win != 0) Event.xany.window = win; + } + } + if (Event.xany.window == 0 || + !(Tmp_win = GetTwmWindow(Event.xany.window))) + { + RootFunction = 0; + XBell(dpy, 0); + return; + } + XTranslateCoordinates(dpy, Scr->Root, Event.xany.window, + Event.xbutton.x, + Event.xbutton.y, + &JunkX, &JunkY, &JunkChild); + + Event.xbutton.x = JunkX; + Event.xbutton.y = JunkY; + Context = C_WINDOW; + } + else + if (mr != (MenuRoot*) 0) { + RootFunction = 0; + XBell(dpy, 0); + return; + } + + /* make sure we are not trying to move an identify window */ + if (Event.xany.window != Scr->InfoWindow) + ExecuteFunction(RootFunction, Action, Event.xany.window, + Tmp_win, &Event, Context, FALSE); + + RootFunction = 0; + return; + } + + ButtonEvent = Event; + ButtonWindow = Tmp_win; + + /* if we get to here, we have to execute a function or pop up a + * menu + */ + modifier = (Event.xbutton.state | AlternateKeymap) & mods_used; + modifier = set_mask_ignore (modifier); + if (AlternateKeymap) { + XUngrabPointer (dpy, CurrentTime); + XUngrabKeyboard (dpy, CurrentTime); + AlternateKeymap = 0; + } + if ((Context == C_NO_CONTEXT) || (Context == C_IDENTIFY)) + return; + + RootFunction = 0; + + /* see if there already is a key defined for this context */ + for (tmp = Scr->FuncButtonRoot.next; tmp != NULL; tmp = tmp->next) { + if ((tmp->num == Event.xbutton.button) && + (tmp->cont == Context) && (tmp->mods == modifier)) + break; + } + if (tmp) { + func = tmp->func; + switch (func) { + case F_MENU : + do_menu (tmp->menu, (Window) None); + break; + + default : + if (func != 0) { + Action = tmp->item ? tmp->item->action : NULL; + ExecuteFunction (func, + Action, Event.xany.window, Tmp_win, &Event, Context, FALSE); + } + } + } + else { + if (Tmp_win == Scr->currentvs->wsw->twm_win) { + WMgrHandleButtonEvent (Scr->currentvs, &Event); + return; + } + } + if (Tmp_win == Scr->workSpaceMgr.occupyWindow->twm_win) + { + OccupyHandleButtonEvent (&Event); + } + else if (func == 0 && Scr->DefaultFunction.func != 0) + { + if (Scr->DefaultFunction.func == F_MENU) + { + do_menu (Scr->DefaultFunction.menu, (Window) None); + } + else + { + Action = Scr->DefaultFunction.item ? + Scr->DefaultFunction.item->action : NULL; + ExecuteFunction(Scr->DefaultFunction.func, Action, + Event.xany.window, Tmp_win, &Event, Context, FALSE); + } + } +#ifdef GNOME1 /* Makes DeferExecution (in menus.c) fail. TODO. */ + else { + /* GNOME: Pass on the event to any applications listening for root window clicks */ + GnomeProxyButtonPress = Event.xbutton.button; + ButtonPressed = -1; + XUngrabPointer (dpy, CurrentTime); + XSendEvent (dpy, Scr->currentvs->wsw->twm_win->w, False, + SubstructureNotifyMask, &Event); + } +#endif /* GNOME1 */ +} + + + +/*********************************************************************** + * + * Procedure: + * HENQueueScanner - EnterNotify event q scanner + * + * Looks at the queued events and determines if any matching + * LeaveNotify events or EnterEvents deriving from the + * termination of a grab are behind this event to allow + * skipping of unnecessary processing. + * + *********************************************************************** + */ + +typedef struct HENScanArgs { + Window w; /* Window we are currently entering */ + Bool leaves; /* Any LeaveNotifies found for this window */ + Bool inferior; /* Was NotifyInferior the mode for LeaveNotify */ + Bool enters; /* Any EnterNotify events with NotifyUngrab */ +} HENScanArgs; + +/* ARGSUSED*/ +static Bool HENQueueScanner(Display *display, XEvent *ev, char *_args) +{ + HENScanArgs *args = (void *)_args; + + if (ev->type == LeaveNotify) { + if (ev->xcrossing.window == args->w && + ev->xcrossing.mode == NotifyNormal) { + args->leaves = True; + /* + * Only the last event found matters for the Inferior field. + */ + args->inferior = + (ev->xcrossing.detail == NotifyInferior); + } + } else if (ev->type == EnterNotify) { + if (ev->xcrossing.mode == NotifyUngrab) + args->enters = True; + } + + return (False); +} + + + +/*********************************************************************** + * + * Procedure: + * HandleEnterNotify - EnterNotify event handler + * + *********************************************************************** + */ + +void HandleEnterNotify(void) +{ + MenuRoot *mr, *tmp; + XEnterWindowEvent *ewp = &Event.xcrossing; + HENScanArgs scanArgs; + XEvent dummy; + virtualScreen *vs; + + /* + * if we aren't in the middle of menu processing + */ + if (!ActiveMenu) { + /* + * We're not interested in pseudo Enter/Leave events generated + * from grab initiations. + */ + if (ewp->mode == NotifyGrab) + return; + + /* + * Scan for Leave and Enter Notify events to see if we can avoid some + * unnecessary processing. + */ + scanArgs.w = ewp->window; + scanArgs.leaves = scanArgs.enters = False; + (void) XCheckIfEvent(dpy, &dummy, HENQueueScanner, (void *) &scanArgs); + + /* + * if entering root window, restore twm default colormap so that + * titlebars are legible + */ + if (ewp->window == Scr->Root) { + Window forus_ret; + int focus_rev; + + if (!scanArgs.leaves && !scanArgs.enters) { + InstallColormaps(EnterNotify, &Scr->RootColormaps); + } + if (! Scr->FocusRoot) return; + XGetInputFocus (dpy, &forus_ret, &focus_rev); + if ((forus_ret != PointerRoot) && (forus_ret != None)) { + SetFocus ((TwmWindow *) NULL, Event.xcrossing.time); + } + return; + } + for (vs = Scr->vScreenList; vs != NULL; vs = vs->next) { + if (ewp->window == vs->window) { + Scr->Root = vs->window; + Scr->rootx = Scr->crootx + vs->x; + Scr->rooty = Scr->crooty + vs->y; + Scr->rootw = vs->w; + Scr->rooth = vs->h; + Scr->currentvs = vs; + /*fprintf (stderr, "entering new vs : 0x%x, 0x%x, %d, %d, %d, %d\n", + vs, Scr->Root, vs->x, vs->y, vs->w, vs->h);*/ + return; + } + } + + /* Handle RaiseDelay, if any..... + */ + if (RaiseDelay > 0) { + if (Tmp_win && Tmp_win->auto_raise && + (!Tmp_win->iconmanagerlist || + Tmp_win->iconmanagerlist->w != ewp->window)) { + ColormapWindow *cwin; +#ifdef VMS + float timeout = 0.0125; +#else + static struct timeval tout, timeout = {0,12500}; +#endif + + if (XFindContext(dpy, Tmp_win->w, ColormapContext, + (XPointer *)&cwin) == XCNOENT) { + cwin = (ColormapWindow *)NULL; + } + + if ((ewp->detail != NotifyInferior + || Tmp_win->frame == ewp->window) + && (!cwin || cwin->visibility != VisibilityUnobscured)) { + int x, y, px, py, d, i; + Window w; + + XQueryPointer(dpy, Scr->Root, &w, &w, &px, &py, + &d, &d, (unsigned int *)&d); + + /* The granularity of RaiseDelay is about 25 ms. + * The timeout variable is set to 12.5 ms since we + * pass this way twice each time a twm window is + * entered. + */ + for (i = 25; i < RaiseDelay; i += 25) { +#ifdef VMS + lib$wait(&timeout); +#else + tout = timeout; + select(0, 0, 0, 0, &tout); +#endif + /* Did we leave this window already? */ + scanArgs.w = ewp->window; + scanArgs.leaves = scanArgs.enters = False; + (void) XCheckIfEvent(dpy, &dummy, HENQueueScanner, + (void *) &scanArgs); + if (scanArgs.leaves && !scanArgs.inferior) return; + + XQueryPointer(dpy, Scr->Root, &w, &w, &x, &y, + &d, &d, (unsigned int *)&d); + + /* Has the pointer moved? If so reset the loop cnt. + * We want the pointer to be still for RaiseDelay + * milliseconds before terminating the loop + */ + if (x != px || y != py) { + i = 0; px = x; py = y; + } + } + } + } + + /* + * Scan for Leave and Enter Notify events to see if we can avoid some + * unnecessary processing. + */ + scanArgs.w = ewp->window; + scanArgs.leaves = scanArgs.enters = False; + (void) XCheckIfEvent(dpy, &dummy, HENQueueScanner, (void *) &scanArgs); + + /* + * if entering root window, restore twm default colormap so that + * titlebars are legible + */ + if (ewp->window == Scr->Root) { + if (!scanArgs.leaves && !scanArgs.enters) { + InstallColormaps(EnterNotify, &Scr->RootColormaps); + } + return; + } + } + /* End of RaiseDelay modification. */ + + /* + * if we have an event for a specific one of our windows + */ + if (Tmp_win) { + /* + * If currently in PointerRoot mode (indicated by FocusRoot), then + * focus on this window + */ + if (Scr->FocusRoot && (!scanArgs.leaves || scanArgs.inferior)) { + Bool accinput; + + if (Scr->ShrinkIconTitles && + Tmp_win->icon && + ewp->window == Tmp_win->icon->w && + ewp->detail != NotifyInferior) { + if (Scr->AutoRaiseIcons) XRaiseWindow (dpy, Tmp_win->icon->w); + ExpandIconTitle (Tmp_win); + return; + } + + if (Tmp_win->iconmanagerlist) + CurrentIconManagerEntry (Tmp_win->iconmanagerlist); + + accinput = Tmp_win->mapped && Tmp_win->wmhints && Tmp_win->wmhints->input; + if (Tmp_win->iconmanagerlist && + ewp->window == Tmp_win->iconmanagerlist->w && + !accinput && + Tmp_win->iconmanagerlist->iconmgr && + Tmp_win->iconmanagerlist->iconmgr->twm_win) { + SetFocus(Tmp_win->iconmanagerlist->iconmgr->twm_win, + CurrentTime); + return; + } + + if (Tmp_win->mapped) { + /* + * unhighlight old focus window + */ + + /* + * If entering the frame or the icon manager, then do + * "window activation things": + * + * 1. + * 2. install frame colormap + * 3. + * 4. focus on client window to forward typing + * 4a. same as 4 but for icon mgr w/with NoTitleFocus + * 5. send WM_TAKE_FOCUS if requested + */ + if (Scr->BorderCursors && ewp->window == Tmp_win->frame) { + SetBorderCursor (Tmp_win, ewp->x, ewp->y); + } + if (ewp->window == Tmp_win->frame || + (Scr->IconManagerFocus && + Tmp_win->iconmanagerlist && + ewp->window == Tmp_win->iconmanagerlist->w)) { + + if (!scanArgs.leaves && !scanArgs.enters) { + InstallColormaps (EnterNotify, /* 2 */ + &Scr->RootColormaps); + } + + /* + * Event is in the frame or the icon mgr: + * + * "4" -- TitleFocus is set: windows should get + * focus as long as they accept input. + * + * "4a" - If TitleFocus is not set, windows should get + * the focus if the event was in the icon mgr + * (as long as they accept input). + * + */ + + /* If the window takes input... */ + if (Tmp_win->wmhints && Tmp_win->wmhints->input) { + + /* if 4 or 4a, focus on the window */ + if (Scr->TitleFocus || + (Tmp_win->iconmanagerlist && + (Tmp_win->iconmanagerlist->w == ewp->window))) { + SetFocus (Tmp_win, ewp->time); + } + } + + if (Scr->TitleFocus && + (Tmp_win->protocols & DoesWmTakeFocus)){ /* 5 */ + + /* for both locally or globally active */ + SendTakeFocusMessage (Tmp_win, ewp->time); + } + else if (!Scr->TitleFocus + && Tmp_win->wmhints + && Tmp_win->wmhints->input + && Event.xcrossing.focus) { + SynthesiseFocusIn(Tmp_win->w); + } + + } else if (ewp->window == Tmp_win->w) { + /* + * If we are entering the application window, install + * its colormap(s). + */ + if (Scr->BorderCursors) SetBorderCursor (Tmp_win, -1000, -1000); + if (!scanArgs.leaves || scanArgs.inferior) { + InstallWindowColormaps(EnterNotify, Tmp_win); + } + + if (Event.xcrossing.focus) { + SynthesiseFocusIn(Tmp_win->w); + } + + /* must deal with WM_TAKE_FOCUS clients now, if + we're not in TitleFocus mode */ + + if (!(Scr->TitleFocus) && + (Tmp_win->protocols & DoesWmTakeFocus)) { + + /* locally active clients need help from WM + to get the input focus */ + + if (Tmp_win->wmhints && + Tmp_win->wmhints->input) + SetFocus(Tmp_win, ewp->time); + + /* for both locally & globally active clnts */ + + SendTakeFocusMessage(Tmp_win, ewp->time); + } + } + } /* end if Tmp_win->mapped */ + if (Tmp_win->wmhints != NULL && + ewp->window == Tmp_win->wmhints->icon_window && + (!scanArgs.leaves || scanArgs.inferior)) { + InstallWindowColormaps(EnterNotify, Tmp_win); + } + } /* end if FocusRoot */ + else + if (Scr->BorderCursors && (ewp->window == Tmp_win->w)) { + SetBorderCursor (Tmp_win, -1000, -1000); + } + /* + * If this window is to be autoraised, mark it so + */ + if (Tmp_win->auto_raise) { + enter_win = Tmp_win; + if (enter_flag == FALSE) AutoRaiseWindow (Tmp_win); + } else if (enter_flag && raise_win == Tmp_win) + enter_win = Tmp_win; + /* + * set ring leader + */ + if (Tmp_win->ring.next && (!enter_flag || raise_win == enter_win)) + Scr->RingLeader = Tmp_win; + XSync (dpy, 0); + return; + } /* end if Tmp_win */ + } /* end if !ActiveMenu */ + + /* + * Find the menu that we are dealing with now; punt if unknown + */ + if (XFindContext (dpy, ewp->window, MenuContext, (XPointer *)&mr) != XCSUCCESS) return; + + if (! ActiveMenu && mr->pinned && (RootFunction == 0)) { + PopUpMenu (mr, 0, 0, 0); + Context = C_ROOT; + UpdateMenu (); + return; + } + mr->entered = TRUE; + if (RootFunction == 0) { + for (tmp = ActiveMenu; tmp; tmp = tmp->prev) { + if (tmp == mr) break; + } + if (! tmp) return; + + for (tmp = ActiveMenu; tmp != mr; tmp = tmp->prev) { + if (tmp->pinned) break; + HideMenu (tmp); + MenuDepth--; + } + UninstallRootColormap (); + + if (ActiveItem) { + ActiveItem->state = 0; + PaintEntry (ActiveMenu, ActiveItem, False); + } + ActiveItem = NULL; + ActiveMenu = mr; + if (1/*Scr->StayUpMenus*/) { + int i, x, y, x_root, y_root, entry; + MenuItem *mi; + + XQueryPointer (dpy, ActiveMenu->w, &JunkRoot, &JunkChild, &x_root, &y_root, + &x, &y, &JunkMask); + if ((x > 0) && (y > 0) && (x < ActiveMenu->width) && (y < ActiveMenu->height)) { + entry = y / Scr->EntryHeight; + for (i = 0, mi = ActiveMenu->first; mi != NULL; i++, mi=mi->next) { + if (i == entry) break; + } + if (mi) { + ActiveItem = mi; + ActiveItem->state = 1; + PaintEntry (ActiveMenu, ActiveItem, False); + } + } + } + if (ActiveMenu->pinned) XUngrabPointer(dpy, CurrentTime); + } + return; +} + + + +/*********************************************************************** + * + * Procedure: + * HLNQueueScanner - LeaveNotify event q scanner + * + * Looks at the queued events and determines if any + * EnterNotify events are behind this event to allow + * skipping of unnecessary processing. + * + *********************************************************************** + */ + +typedef struct HLNScanArgs { + Window w; /* The window getting the LeaveNotify */ + Bool enters; /* Any EnterNotify event at all */ + Bool matches; /* Any matching EnterNotify events */ +} HLNScanArgs; + +/* ARGSUSED*/ +static Bool HLNQueueScanner(Display *display, XEvent *ev, char *_args) +{ + HLNScanArgs *args = (void *)_args; + + if (ev->type == EnterNotify && ev->xcrossing.mode != NotifyGrab) { + args->enters = True; + if (ev->xcrossing.window == args->w) + args->matches = True; + } + + return (False); +} + + + +/*********************************************************************** + * + * Procedure: + * HandleLeaveNotify - LeaveNotify event handler + * + *********************************************************************** + */ + +void HandleLeaveNotify(void) +{ + HLNScanArgs scanArgs; + XEvent dummy; + + if (ActiveMenu && ActiveMenu->pinned && (Event.xcrossing.window == ActiveMenu->w)) { + PopDownMenu (); + } + + if (Tmp_win != NULL) + { + Bool inicon; + + /* + * We're not interested in pseudo Enter/Leave events generated + * from grab initiations and terminations. + */ + if (Event.xcrossing.mode != NotifyNormal) + return; + + if (Scr->ShrinkIconTitles && + Tmp_win->icon && + Event.xcrossing.window == Tmp_win->icon->w && + Event.xcrossing.detail != NotifyInferior) { + ShrinkIconTitle (Tmp_win); + return; + } + + inicon = (Tmp_win->iconmanagerlist && + Tmp_win->iconmanagerlist->w == Event.xcrossing.window); + + if (Scr->RingLeader && Scr->RingLeader == Tmp_win && + (Event.xcrossing.detail != NotifyInferior && + Event.xcrossing.window != Tmp_win->w)) { +#ifdef DEBUG + fprintf(stderr, "HandleLeaveNotify: Event.xcrossing.window %x != Tmp_win->w %x\n", Event.xcrossing.window, Tmp_win->w); +#endif + if (!inicon) { + if (Event.xcrossing.window != Tmp_win->frame /*was: Tmp_win->mapped*/) { + Tmp_win->ring.cursor_valid = False; +#ifdef DEBUG + fprintf(stderr, "HandleLeaveNotify: cursor_valid = False\n"); +#endif + } else { /* Event.xcrossing.window == Tmp_win->frame */ + Tmp_win->ring.cursor_valid = True; + Tmp_win->ring.curs_x = (Event.xcrossing.x_root - + Tmp_win->frame_x); + Tmp_win->ring.curs_y = (Event.xcrossing.y_root - + Tmp_win->frame_y); +#ifdef DEBUG + fprintf(stderr, "HandleLeaveNotify: cursor_valid = True; x = %d (%d-%d), y = %d (%d-%d)\n", Tmp_win->ring.curs_x, Event.xcrossing.x_root, Tmp_win->frame_x, Tmp_win->ring.curs_y, Event.xcrossing.y_root, Tmp_win->frame_y); +#endif + } + } + Scr->RingLeader = (TwmWindow *) NULL; + } + if (Scr->FocusRoot) { + + if (Event.xcrossing.detail != NotifyInferior) { + + /* + * Scan for EnterNotify events to see if we can avoid some + * unnecessary processing. + */ + scanArgs.w = Event.xcrossing.window; + scanArgs.enters = scanArgs.matches = False; + (void) XCheckIfEvent(dpy, &dummy, HLNQueueScanner, + (char *) &scanArgs); + + if (Event.xcrossing.window == Tmp_win->frame && !scanArgs.matches) { + if (Scr->TitleFocus || + Tmp_win->protocols & DoesWmTakeFocus) + SetFocus ((TwmWindow *) NULL, Event.xcrossing.time); + /* pretend there was a focus out as sometimes + * we don't get one. */ + if ( Event.xcrossing.focus) + SynthesiseFocusOut(Tmp_win->w); + } + else + if (Scr->IconManagerFocus && inicon) { + if (! Tmp_win->mapped || + ! Tmp_win->wmhints || + ! Tmp_win->wmhints->input) { + return; + } + if (Scr->TitleFocus || Tmp_win->protocols & DoesWmTakeFocus) + SetFocus ((TwmWindow *) NULL, Event.xcrossing.time); + if (Event.xcrossing.focus) SynthesiseFocusOut (Tmp_win->w); + } else if (Event.xcrossing.window == Tmp_win->w && + !scanArgs.enters) { + InstallColormaps(LeaveNotify, &Scr->RootColormaps); + } + } + } + /* Autolower modification. */ + if (Tmp_win->auto_lower) { + leave_win = Tmp_win; + if (leave_flag == FALSE) AutoLowerWindow (Tmp_win); + } else if (leave_flag && lower_win == Tmp_win) + leave_win = Tmp_win; + + XSync (dpy, 0); + return; + } +} + + + +/*********************************************************************** + * + * Procedure: + * HandleConfigureRequest - ConfigureRequest event handler + * + *********************************************************************** + */ + +void HandleConfigureRequest(void) +{ + XWindowChanges xwc; + unsigned long xwcm; + int x, y, width, height, bw; + int gravx, gravy; + XConfigureRequestEvent *cre = &Event.xconfigurerequest; + Bool sendEvent; + +#ifdef DEBUG_EVENTS + fprintf(stderr, "ConfigureRequest\n"); + if (cre->value_mask & CWX) + fprintf(stderr, " x = %d\n", cre->x); + if (cre->value_mask & CWY) + fprintf(stderr, " y = %d\n", cre->y); + if (cre->value_mask & CWWidth) + fprintf(stderr, " width = %d\n", cre->width); + if (cre->value_mask & CWHeight) + fprintf(stderr, " height = %d\n", cre->height); + if (cre->value_mask & CWSibling) + fprintf(stderr, " above = 0x%x\n", cre->above); + if (cre->value_mask & CWStackMode) + fprintf(stderr, " stack = %d\n", cre->detail); +#endif + + /* + * Event.xany.window is Event.xconfigurerequest.parent, so Tmp_win will + * be wrong + */ + Event.xany.window = cre->window; /* mash parent field */ + Tmp_win = GetTwmWindow(cre->window); + + /* + * According to the July 27, 1988 ICCCM draft, we should ignore size and + * position fields in the WM_NORMAL_HINTS property when we map a window. + * Instead, we'll read the current geometry. Therefore, we should respond + * to configuration requests for windows which have never been mapped. + */ + if (!Tmp_win || (Tmp_win->icon && (Tmp_win->icon->w == cre->window))) { + xwcm = cre->value_mask & + (CWX | CWY | CWWidth | CWHeight | CWBorderWidth); + xwc.x = cre->x; + xwc.y = cre->y; + xwc.width = cre->width; + xwc.height = cre->height; + xwc.border_width = cre->border_width; + XConfigureWindow(dpy, Event.xany.window, xwcm, &xwc); + return; + } + + sendEvent = False; + if ((cre->value_mask & CWStackMode) && Tmp_win->stackmode) { + TwmWindow *otherwin; + + xwc.sibling = (((cre->value_mask & CWSibling) && + (otherwin = GetTwmWindow(cre->above))) + ? otherwin->frame : cre->above); + xwc.stack_mode = cre->detail; + XConfigureWindow (dpy, Tmp_win->frame, + cre->value_mask & (CWSibling | CWStackMode), &xwc); + sendEvent = True; + } + + + /* Don't modify frame_XXX fields before calling SetupWindow! */ + x = Tmp_win->frame_x; + y = Tmp_win->frame_y; + width = Tmp_win->frame_width; + height = Tmp_win->frame_height; + bw = Tmp_win->frame_bw; + + /* + * Section 4.1.5 of the ICCCM states that the (x,y) coordinates in the + * configure request are for the upper-left outer corner of the window. + * This means that we need to adjust for the additional title height as + * well as for any border width changes that we decide to allow. The + * current window gravity is to be used in computing the adjustments, just + * as when initially locating the window. Note that if we do decide to + * allow border width changes, we will need to send the synthetic + * ConfigureNotify event. + */ + GetGravityOffsets (Tmp_win, &gravx, &gravy); + + if (cre->value_mask & CWBorderWidth) { + int bwdelta = cre->border_width - Tmp_win->old_bw; /* posit growth */ + if (bwdelta && Scr->ClientBorderWidth) { /* if change allowed */ + x += gravx * bwdelta; /* change default values only */ + y += gravy * bwdelta; /* ditto */ + bw = cre->border_width; + if (Tmp_win->title_height) height += bwdelta; + x += (gravx < 0) ? bwdelta : -bwdelta; + y += (gravy < 0) ? bwdelta : -bwdelta; + } + Tmp_win->old_bw = cre->border_width; /* for restoring */ + } + + if (cre->value_mask & CWX) { /* override even if border change */ + x = cre->x - bw; + x -= ((gravx < 0) ? 0 : Tmp_win->frame_bw3D); + } + if (cre->value_mask & CWY) { + y = cre->y - ((gravy < 0) ? 0 : Tmp_win->title_height) - bw; + y -= ((gravy < 0) ? 0 : Tmp_win->frame_bw3D); + } + + if (cre->value_mask & CWWidth) { + width = cre->width + 2 * Tmp_win->frame_bw3D; + } + if (cre->value_mask & CWHeight) { + height = cre->height + Tmp_win->title_height + 2 * Tmp_win->frame_bw3D; + } + + if (width != Tmp_win->frame_width || height != Tmp_win->frame_height) + Tmp_win->zoomed = ZOOM_NONE; + + /* Workaround for Java 1.4 bug that freezes the application whenever + * a new window is displayed. (When UsePPosition is on and either + * UseThreeDBorders or BorderWidth 0 is set.) + */ + if (!bw) + sendEvent = True; + + /* + * SetupWindow (x,y) are the location of the upper-left outer corner and + * are passed directly to XMoveResizeWindow (frame). The (width,height) + * are the inner size of the frame. The inner width is the same as the + * requested client window width; the inner height is the same as the + * requested client window height plus any title bar slop. + */ + SetupFrame (Tmp_win, x, y, width, height, bw, sendEvent); +} + + + +/*********************************************************************** + * + * Procedure: + * HandleShapeNotify - shape notification event handler + * + *********************************************************************** + */ +void HandleShapeNotify (void) +{ + XShapeEvent *sev = (XShapeEvent *) &Event; + + if (Tmp_win == NULL) + return; + if (sev->kind != ShapeBounding) + return; + if (!Tmp_win->wShaped && sev->shaped) { + XShapeCombineMask (dpy, Tmp_win->frame, ShapeClip, 0, 0, None, + ShapeSet); + } + Tmp_win->wShaped = sev->shaped; + SetFrameShape (Tmp_win); +} + + + +/*********************************************************************** + * + * Procedure: + * HandleUnknown - unknown event handler + * + *********************************************************************** + */ + +void HandleUnknown(void) +{ +#ifdef DEBUG_EVENTS + fprintf(stderr, "type = %d\n", Event.type); +#endif +} + + + +/*********************************************************************** + * + * Procedure: + * Transient - checks to see if the window is a transient + * + * Returned Value: + * TRUE - window is a transient + * FALSE - window is not a transient + * + * Inputs: + * w - the window to check + * + *********************************************************************** + */ + +int Transient(Window w, Window *propw) +{ + return (XGetTransientForHint(dpy, w, propw)); +} + + + +/*********************************************************************** + * + * Procedure: + * FindScreenInfo - get ScreenInfo struct associated with a given window + * + * Returned Value: + * ScreenInfo struct + * + * Inputs: + * w - the window + * + *********************************************************************** + */ + +ScreenInfo *FindScreenInfo(Window w) +{ + XWindowAttributes attr; + int scrnum; + + attr.screen = NULL; + if (XGetWindowAttributes(dpy, w, &attr)) { + for (scrnum = 0; scrnum < NumScreens; scrnum++) { + if (ScreenList[scrnum] != NULL && + (ScreenOfDisplay(dpy, ScreenList[scrnum]->screen) == + attr.screen)) + return ScreenList[scrnum]; + } + } + + return NULL; +} + + + +static void flush_expose (Window w) +{ + XEvent dummy; + + /* SUPPRESS 530 */ + while (XCheckTypedWindowEvent (dpy, w, Expose, &dummy)) ; +} + + + +/*********************************************************************** + * + * Procedure: + * InstallWindowColormaps - install the colormaps for one twm window + * + * Inputs: + * type - type of event that caused the installation + * tmp - for a subset of event types, the address of the + * window structure, whose colormaps are to be installed. + * + *********************************************************************** + */ + +int InstallWindowColormaps (int type, TwmWindow *tmp) +{ + if (tmp) { + return InstallColormaps (type, &tmp->cmaps); + } else { + return InstallColormaps (type, NULL); + } +} + +int InstallColormaps (int type, Colormaps *cmaps) +{ + int i, j, n, number_cwins, state; + ColormapWindow **cwins, *cwin, **maxcwin = NULL; + TwmColormap *cmap; + char *row, *scoreboard; + + switch (type) { + case EnterNotify: + case LeaveNotify: + case DestroyNotify: + default: + /* Save the colormap to be loaded for when force loading of + * root colormap(s) ends. + */ + Scr->cmapInfo.pushed_cmaps = cmaps; + /* Don't load any new colormap if root colormap(s) has been + * force loaded. + */ + if (Scr->cmapInfo.root_pushes) + return (0); + /* Don't reload the current window colormap list. + if (Scr->cmapInfo.cmaps == cmaps) + return (0); + */ + if (Scr->cmapInfo.cmaps) { + for (i = Scr->cmapInfo.cmaps->number_cwins, + cwins = Scr->cmapInfo.cmaps->cwins; i-- > 0; cwins++) { + (*cwins)->colormap->state &= ~CM_INSTALLABLE; + } + } + Scr->cmapInfo.cmaps = cmaps; + break; + + case PropertyNotify: + case VisibilityNotify: + case ColormapNotify: + break; + } + + number_cwins = Scr->cmapInfo.cmaps->number_cwins; + cwins = Scr->cmapInfo.cmaps->cwins; + scoreboard = Scr->cmapInfo.cmaps->scoreboard; + + ColortableThrashing = FALSE; /* in case installation aborted */ + + state = CM_INSTALLED; + + for (i = n = 0; i < number_cwins; i++) { + cwins[i]->colormap->state &= ~CM_INSTALL; + } + for (i = n = 0; i < number_cwins && n < Scr->cmapInfo.maxCmaps; i++) { + cwin = cwins[i]; + cmap = cwin->colormap; + if (cmap->state & CM_INSTALL) continue; + cmap->state |= CM_INSTALLABLE; + cmap->w = cwin->w; + if (cwin->visibility != VisibilityFullyObscured) { + row = scoreboard + (i*(i-1)/2); + for (j = 0; j < i; j++) + if (row[j] && (cwins[j]->colormap->state & CM_INSTALL)) + break; + if (j != i) continue; + n++; + maxcwin = &cwins[i]; + state &= (cmap->state & CM_INSTALLED); + cmap->state |= CM_INSTALL; + } + } + Scr->cmapInfo.first_req = NextRequest(dpy); + + for ( ; n > 0 && maxcwin >= &cwins[0]; maxcwin--) { + cmap = (*maxcwin)->colormap; + if (cmap->state & CM_INSTALL) { + cmap->state &= ~CM_INSTALL; + if (!(state & CM_INSTALLED)) { + cmap->install_req = NextRequest(dpy); + /* printf ("XInstallColormap : %x, %x\n", cmap, cmap->c); */ + XInstallColormap(dpy, cmap->c); + } + cmap->state |= CM_INSTALLED; + n--; + } + } + return (1); +} + + + +/*********************************************************************** + * + * Procedures: + * nstallRootColormap - Force (un)loads root colormap(s) + * + * These matching routines provide a mechanism to insure that + * the root colormap(s) is installed during operations like + * rubber banding or menu display that require colors from + * that colormap. Calls may be nested arbitrarily deeply, + * as long as there is one UninstallRootColormap call per + * InstallRootColormap call. + * + * The final UninstallRootColormap will cause the colormap list + * which would otherwise have be loaded to be loaded, unless + * Enter or Leave Notify events are queued, indicating some + * other colormap list would potentially be loaded anyway. + *********************************************************************** + */ + +void InstallRootColormap(void) +{ + Colormaps *tmp; + if (Scr->cmapInfo.root_pushes == 0) { + /* + * The saving and restoring of cmapInfo.pushed_window here + * is a slimy way to remember the actual pushed list and + * not that of the root window. + */ + tmp = Scr->cmapInfo.pushed_cmaps; + InstallColormaps(0, &Scr->RootColormaps); + Scr->cmapInfo.pushed_cmaps = tmp; + } + Scr->cmapInfo.root_pushes++; +} + + + +/* ARGSUSED*/ +static Bool UninstallRootColormapQScanner(Display *display, XEvent *ev, char *args) +{ + if (!*args) { + if (ev->type == EnterNotify) { + if (ev->xcrossing.mode != NotifyGrab) + *args = 1; + } else if (ev->type == LeaveNotify) { + if (ev->xcrossing.mode == NotifyNormal) + *args = 1; + } + } + + return (False); +} + + + +void UninstallRootColormap(void) +{ + char args; + XEvent dummy; + + if (Scr->cmapInfo.root_pushes) + Scr->cmapInfo.root_pushes--; + + if (!Scr->cmapInfo.root_pushes) { + /* + * If we have subsequent Enter or Leave Notify events, + * we can skip the reload of pushed colormaps. + */ + XSync (dpy, 0); + args = 0; + (void) XCheckIfEvent(dpy, &dummy, UninstallRootColormapQScanner, &args); + + if (!args) + InstallColormaps(0, Scr->cmapInfo.pushed_cmaps); + } +} + +void ConfigureRootWindow (XEvent *ev) +{ + Window root, child; + int x, y; + unsigned int w, h, bw, d, oldw, oldh; + + XGetGeometry (dpy, Scr->CaptiveRoot, &root, &x, &y, &w, &h, &bw, &d); + XTranslateCoordinates (dpy, Scr->CaptiveRoot, root, 0, 0, &Scr->crootx, &Scr->crooty, &child); + + oldw = Scr->crootw; + oldh = Scr->crooth; + Scr->crootw = ev->xconfigure.width; + Scr->crooth = ev->xconfigure.height; + /* + fprintf (stderr, "ConfigureRootWindow: cx = %d, cy = %d, cw = %d, ch = %d\n", + Scr->crootx, Scr->crooty, Scr->crootw, Scr->crooth); + */ + if (Scr->currentvs) { + Scr->rootx = Scr->crootx + Scr->currentvs->x; + Scr->rooty = Scr->crooty + Scr->currentvs->y; + } + Scr->rootw = Scr->crootw; + Scr->rooth = Scr->crooth; + + if (captive && ((Scr->crootw != oldw) || (Scr->crooth != oldh))) { + twmrc_error_prefix (); + fprintf (stderr, "You cannot change root window geometry with virtual screens active,\n"); + fprintf (stderr, "from now on, the ctwm behaviour is unpredictable.\n"); + } +} + +static void dumpevent (XEvent *e) +{ + char *name = "Unknown event"; + + if (! tracefile) return; + switch (e->type) { + case KeyPress: name = "KeyPress"; break; + case KeyRelease: name = "KeyRelease"; break; + case ButtonPress: name = "ButtonPress"; break; + case ButtonRelease: name = "ButtonRelease"; break; + case MotionNotify: name = "MotionNotify"; break; + case EnterNotify: name = "EnterNotify"; break; + case LeaveNotify: name = "LeaveNotify"; break; + case FocusIn: name = "FocusIn"; break; + case FocusOut: name = "FocusOut"; break; + case KeymapNotify: name = "KeymapNotify"; break; + case Expose: name = "Expose"; break; + case GraphicsExpose: name = "GraphicsExpose"; break; + case NoExpose: name = "NoExpose"; break; + case VisibilityNotify: name = "VisibilityNotify"; break; + case CreateNotify: name = "CreateNotify"; break; + case DestroyNotify: name = "DestroyNotify"; break; + case UnmapNotify: name = "UnmapNotify"; break; + case MapNotify: name = "MapNotify"; break; + case MapRequest: name = "MapRequest"; break; + case ReparentNotify: name = "ReparentNotify"; break; + case ConfigureNotify: name = "ConfigureNotify"; break; + case ConfigureRequest: name = "ConfigureRequest"; break; + case GravityNotify: name = "GravityNotify"; break; + case ResizeRequest: name = "ResizeRequest"; break; + case CirculateNotify: name = "CirculateNotify"; break; + case CirculateRequest: name = "CirculateRequest"; break; + case PropertyNotify: name = "PropertyNotify"; break; + case SelectionClear: name = "SelectionClear"; break; + case SelectionRequest: name = "SelectionRequest"; break; + case SelectionNotify: name = "SelectionNotify"; break; + case ColormapNotify: name = "ColormapNotify"; break; + case ClientMessage: name = "ClientMessage"; break; + case MappingNotify: name = "MappingNotify"; break; + } + fprintf (tracefile, "event: %s in window 0x%x\n", name, + (unsigned int)e->xany.window); + switch (e->type) { + case KeyPress: + case KeyRelease: + fprintf (tracefile, " : +%d,+%d (+%d,+%d) state=%d, keycode=%d\n", + e->xkey.x, e->xkey.y, + e->xkey.x_root, e->xkey.y_root, + e->xkey.state, e->xkey.keycode); + break; + case ButtonPress: + case ButtonRelease: + fprintf (tracefile, " : +%d,+%d (+%d,+%d) state=%d, button=%d\n", + e->xbutton.x, e->xbutton.y, + e->xbutton.x_root, e->xbutton.y_root, + e->xbutton.state, e->xbutton.button); + break; + } +} Index: external/mit/ctwm/dist/events.h =================================================================== RCS file: external/mit/ctwm/dist/events.h diff -N external/mit/ctwm/dist/events.h --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/events.h 3 Sep 2015 12:19:48 -0000 @@ -0,0 +1,136 @@ +/*****************************************************************************/ +/** Copyright 1988 by Evans & Sutherland Computer Corporation, **/ +/** Salt Lake City, Utah **/ +/** Portions Copyright 1989 by the Massachusetts Institute of Technology **/ +/** Cambridge, Massachusetts **/ +/** **/ +/** All Rights Reserved **/ +/** **/ +/** Permission to use, copy, modify, and distribute this software and **/ +/** its documentation for any purpose and without fee is hereby **/ +/** granted, provided that the above copyright notice appear in all **/ +/** copies and that both that copyright notice and this permis- **/ +/** sion notice appear in supporting documentation, and that the **/ +/** names of Evans & Sutherland and M.I.T. not be used in advertising **/ +/** in publicity pertaining to distribution of the software without **/ +/** specific, written prior permission. **/ +/** **/ +/** EVANS & SUTHERLAND AND M.I.T. DISCLAIM ALL WARRANTIES WITH REGARD **/ +/** TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANT- **/ +/** ABILITY AND FITNESS, IN NO EVENT SHALL EVANS & SUTHERLAND OR **/ +/** M.I.T. BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAM- **/ +/** AGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA **/ +/** OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER **/ +/** TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE **/ +/** OR PERFORMANCE OF THIS SOFTWARE. **/ +/*****************************************************************************/ +/* + * [ ctwm ] + * + * Copyright 1992 Claude Lecommandeur. + * + * Permission to use, copy, modify and distribute this software [ctwm] and + * its documentation for any purpose is hereby granted without fee, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting documen- + * tation, and that the name of Claude Lecommandeur not be used in adverti- + * sing or publicity pertaining to distribution of the software without + * specific, written prior permission. Claude Lecommandeur make no represen- + * tations about the suitability of this software for any purpose. It is + * provided "as is" without express or implied warranty. + * + * Claude Lecommandeur DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO + * EVENT SHALL Claude Lecommandeur BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF + * USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR + * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + * + * Author: Claude Lecommandeur [ lecom@sic.epfl.ch ][ April 1992 ] + */ + + +/*********************************************************************** + * + * $XConsortium: events.h,v 1.14 91/05/10 17:53:58 dave Exp $ + * + * twm event handler include file + * + * 17-Nov-87 Thomas E. LaStrange File created + * + ***********************************************************************/ + +#ifndef _EVENTS_ +#define _EVENTS_ + +#include +#include + +typedef void (*event_proc)(void); + +extern void InitEvents(void); +extern Bool StashEventTime(register XEvent *ev); +extern Time lastTimestamp; +extern void SimulateMapRequest(Window w); +extern void AutoRaiseWindow(TwmWindow *tmp); +extern void SetRaiseWindow (TwmWindow *tmp); +extern void AutoLowerWindow(TwmWindow *tmp); +#define LastTimestamp() lastTimestamp +extern Window WindowOfEvent (XEvent *e); +extern void FixRootEvent (XEvent *e); +extern Bool DispatchEvent(void); +extern Bool DispatchEvent2(void); +extern void HandleEvents(void); +extern void HandleExpose(void); +extern void HandleDestroyNotify(void); +extern void HandleMapRequest(void); +extern void HandleMapNotify(void); +extern void HandleUnmapNotify(void); +extern void HandleMotionNotify(void); +extern void HandleButtonRelease(void); +extern void HandleButtonPress(void); +extern void HandleEnterNotify(void); +extern void HandleLeaveNotify(void); +extern void HandleConfigureRequest(void); +extern void HandleClientMessage(void); +extern void HandlePropertyNotify(void); +extern void HandleKeyPress(void); +extern void HandleKeyRelease(void); +extern void HandleColormapNotify(void); +extern void HandleVisibilityNotify(void); +extern void HandleUnknown(void); +extern void HandleFocusIn(XFocusInEvent *event); +extern void HandleFocusOut(XFocusOutEvent *event); +extern void SynthesiseFocusOut(Window w); +extern void SynthesiseFocusIn(Window w); +extern int Transient(Window w, Window *propw); + +extern ScreenInfo *FindScreenInfo(Window w); + +extern int InstallWindowColormaps (int type, TwmWindow *tmp); +extern int InstallColormaps (int type, Colormaps *cmaps); +extern void InstallRootColormap(void); +extern void UninstallRootColormap(void); +extern void ConfigureRootWindow (XEvent *ev); + +extern void free_cwins (TwmWindow *tmp); + +extern event_proc EventHandler[]; +extern Window DragWindow; +extern int origDragX; +extern int origDragY; +extern int DragX; +extern int DragY; +extern unsigned int DragWidth; +extern unsigned int DragHeight; +extern unsigned int DragBW; +extern int CurrentDragX; +extern int CurrentDragY; + +extern int ButtonPressed; +extern int Cancel; + +extern XEvent Event; + +#endif /* _EVENTS_ */ Index: external/mit/ctwm/dist/example.ctwmrc =================================================================== RCS file: external/mit/ctwm/dist/example.ctwmrc diff -N external/mit/ctwm/dist/example.ctwmrc --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/example.ctwmrc 3 Sep 2015 12:19:48 -0000 @@ -0,0 +1,186 @@ +####################################################################### +# # +# .ctwmrc addition # +# # +####################################################################### + +PixmapDirectory "~/images/ctwm" +UnknownIcon "xpm:unknown.xpm" +IconJustification "left" +RightTitleButton "%xpm:resize" = f.horizoom +RandomPlacement "unmapped" +UsePPosition "non-zero" +ButtonIndent 0 +OpaqueMoveThreshold 50 +OpaqueResizeThreshold 50 +WMgrVertButtonIndent 15 +WMgrHorizButtonIndent 5 +WMgrButtonShadowDepth 3 +MaxIconTitleWidth 128 +AnimationSpeed 5 +IconBorderWidth 0 +XORvalue 1 +TransientOnTop 30 + +ShowWorkSpaceManager +NoShowOccupyAll +AutoOccupy +NoMenuShadows +UseThreeDMenus +UseThreeDTitles +UseThreeDIconManagers +UseThreeDBorders +SunkFocusWindowTitle +ChangeWorkspaceFunction !"cat ~/sounds/bom.au 2>/dev/null 1>/dev/audio&" +IconifyFunction !"cat ~/sounds/splat.au 2>/dev/null 1>/dev/audio&" +DeIconifyFunction !"cat ~/sounds/drip.au 2>/dev/null 1>/dev/audio&" + +IconRegion "128x950+0+140" North West 128 1 +IconRegion "320x950+100+0" North West 320 1 +WorkSpaceManagerGeometry "500x100-500-0" 7 + +WorkSpaces +{ + "lecom" {"#686B9F" "white" "DeepSkyBlue3" "white" "boxes"} + "Cognac" {"#619AAE" "white" "firebrick" "white" "xpm:unknown.xpm"} + "Siihp1" {"#619AAE" "white" "DeepSkyBlue3" "white" "cross_weave"} + "Sicsun" {"#727786" "white" "DeepSkyBlue3" "black" "escherknot"} + "Siisg1" {"#8C5b7A" "white" "MidnightBlue"} + "Siialpha1" {"#8C5b7A" "white" "black" "white" "|(giftoppm | pnmtoxwd) < ~/images/some.gif"} + "X11" {"#8C5b7A" "white" "black" "white" "xpm:ball%.xpm"} + + "root" {"#727786" "white" "DeepSkyBlue3" "white" "icon"} + "Cagnoc" {"#619AAE" "white" "firebrick"} + "Hpline" {"#619AAE" "white" "DeepSkyBlue3" "white" "mensetmanus"} + "Nestor" {"#8C5b7A" "white" "chartreuse4"} + "Siisun" {"#8C5b7A" "white" "chartreuse4"} + "devel" {"#686B9F" "white" "MidnightBlue"} + "cognac" {"#686B9F" "white" "MidnightBlue" "white" "plaid"} +} + +MapWindowCurrentWorkSpace {"Red" "Blue" "Black"} + +OccupyAll { + "xload" + "xconsole" + "xbiff" + "mailtool" + "mixmh" +} + +Occupy { + "xmailtool" {"all"} + "xrn" {"all"} + "xgopher" {"all"} + "toto" {"devel" "lecom" "cognac"} +} + +####################################################################### +# # +# Declare some nice colors # +# # +####################################################################### + +Color { + DefaultBackground "blue" + DefaultForeground "gray85" + BorderColor "#FF0000" + TitleBackground "#0f0f0f" {"xterm" "DeepSkyBlue1"} + TitleForeground "gray85" {"xterm" "Black"} + MenuBackground "Black" + MenuForeground "white" + MenuTitleBackground "gray70" + MenuTitleForeground "maroon" + IconBackground "maroon" + IconForeground "gray85" + IconBorderColor "gray85" + IconManagerBackground "gray70" + IconManagerForeground "Black" + MapWindowBackground "White" { + "root*" "DarkSlateBlue" + "Axe" "White" + } + MapWindowForeground "Black" { + "xterm" "Black" + "Axe" "Black" + } +} +# +# Warning : You should copy supman*.xbm in your IconDirectory in order to use this +# +Pixmaps { + TitleHighlight "supman%.xbm" +} + +Icons { + "Axe" "xpm:xedit.xpm" + "Xedit" "xwd:xedit.xwd" + "xterm" "xpm:xterm.xpm" + "unread" "xpm:xrn.xpm" + "nothing" "xpm:xrn.xpm" + "Xman" "xpm:xman.xpm" + "HPterm" "im:hpterm.xpm" + "xarchie" "xpm:xarchie.xpm" + "xgopher" "xpm:xgopher.xpm" + "essai" "xpm:unknown.xpm" + "HPterm" "|(giftoppm | pnmtoxwd) < ~/images/hpterm.gif" +} + +"F1" = : root : f.speedupanimation +"F2" = : root : f.slowdownanimation +"F9" = : all : f.warphere "lecom@slhp1" +"F9" = s : window : f.vanish +"F11" = : root : f.nextworkspace +"F12" = : root : f.prevworkspace + +menu "windowops" { + "Windows" f.title + "Pin menu" f.pin + "Kill" f.menu "Kill" + "Save" f.saveyourself + "Refresh" f.refresh + "Occupy" f.occupy + "Occupy All" f.occupyall + "Vanish" f.vanish + "" f.separator + "Iconify" f.iconify + "Resize" f.resize + "Move" f.move + "Raise" f.raise + "Lower" f.lower + "Info" f.identify + "Unfocus" f.unfocus + "Toggle workspace" f.togglestate + "ShowWorkspaceManager" f.showWorkspaceMgr + "HideWorkspaceManager" f.hideWorkspaceMgr + "Adopt Window" f.adoptwindow +} + +menu "windowmenu" { + "Iconify" f.iconify + "RaiseLower" f.raiselower + "Refresh" f.winrefresh + "Focus" f.focus + "Occupy ..." f.occupy + "Occupy All" f.occupyall + "Vanish" f.vanish + "Zoom" f.menu "Zoom" + "" f.separator + "Kill" f.menu "Kill" +} + +menu "Kill" { + "Kill Window" f.destroy + "Send Delete" f.delete +} + +menu "Zoom" { + "Full" f.fullzoom + "Horizontal" f.horizoom + "Vertical" f.zoom + "Left" f.leftzoom + "Top" f.topzoom + "Right" f.rightzoom + "Bottom" f.bottomzoom +} + Index: external/mit/ctwm/dist/gc.c =================================================================== RCS file: external/mit/ctwm/dist/gc.c diff -N external/mit/ctwm/dist/gc.c --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/gc.c 3 Sep 2015 12:19:48 -0000 @@ -0,0 +1,153 @@ +/*****************************************************************************/ +/** Copyright 1988 by Evans & Sutherland Computer Corporation, **/ +/** Salt Lake City, Utah **/ +/** Portions Copyright 1989 by the Massachusetts Institute of Technology **/ +/** Cambridge, Massachusetts **/ +/** **/ +/** All Rights Reserved **/ +/** **/ +/** Permission to use, copy, modify, and distribute this software and **/ +/** its documentation for any purpose and without fee is hereby **/ +/** granted, provided that the above copyright notice appear in all **/ +/** copies and that both that copyright notice and this permis- **/ +/** sion notice appear in supporting documentation, and that the **/ +/** names of Evans & Sutherland and M.I.T. not be used in advertising **/ +/** in publicity pertaining to distribution of the software without **/ +/** specific, written prior permission. **/ +/** **/ +/** EVANS & SUTHERLAND AND M.I.T. DISCLAIM ALL WARRANTIES WITH REGARD **/ +/** TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANT- **/ +/** ABILITY AND FITNESS, IN NO EVENT SHALL EVANS & SUTHERLAND OR **/ +/** M.I.T. BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAM- **/ +/** AGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA **/ +/** OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER **/ +/** TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE **/ +/** OR PERFORMANCE OF THIS SOFTWARE. **/ +/*****************************************************************************/ +/* + * [ ctwm ] + * + * Copyright 1992 Claude Lecommandeur. + * + * Permission to use, copy, modify and distribute this software [ctwm] and + * its documentation for any purpose is hereby granted without fee, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting documen- + * tation, and that the name of Claude Lecommandeur not be used in adverti- + * sing or publicity pertaining to distribution of the software without + * specific, written prior permission. Claude Lecommandeur make no represen- + * tations about the suitability of this software for any purpose. It is + * provided "as is" without express or implied warranty. + * + * Claude Lecommandeur DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO + * EVENT SHALL Claude Lecommandeur BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF + * USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR + * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + * + * Author: Claude Lecommandeur [ lecom@sic.epfl.ch ][ April 1992 ] + */ + + +/********************************************************************** + * + * $XConsortium: gc.c,v 1.22 91/01/09 17:13:12 rws Exp $ + * + * Open the fonts and create the GCs + * + * 31-Mar-88 Tom LaStrange Initial Version. + * + * Do the necessary modification to be integrated in ctwm. + * Can no longer be used for the standard twm. + * + * 22-April-92 Claude Lecommandeur. + * + * + **********************************************************************/ + +#include +#include "twm.h" +#include "util.h" +#include "gram.tab.h" +#include "screen.h" +#include "gc.h" + +extern void twmrc_error_prefix(void); + +/*********************************************************************** + * + * Procedure: + * CreateGCs - open fonts and create all the needed GC's. I only + * want to do this once, hence the first_time flag. + * + *********************************************************************** + */ + +void CreateGCs(void) +{ + static ScreenInfo *prevScr = NULL; + XGCValues gcv; + unsigned long gcm; + static unsigned char greypattern [] = {0x0f, 0x05, 0x0f, 0x0a}; + Pixmap greypixmap; + static char dashlist [2] = {1, 1}; + + if (!Scr->FirstTime || prevScr == Scr) + return; + + prevScr = Scr; + + /* create GC's */ + + gcm = 0; + gcm |= GCFunction; gcv.function = GXxor; + gcm |= GCLineWidth; gcv.line_width = 0; + gcm |= GCForeground; gcv.foreground = Scr->XORvalue; + gcm |= GCSubwindowMode; gcv.subwindow_mode = IncludeInferiors; + + Scr->DrawGC = XCreateGC(dpy, Scr->Root, gcm, &gcv); + + gcm = 0; + gcm |= GCForeground; gcv.foreground = Scr->MenuC.fore; + gcm |= GCBackground; gcv.background = Scr->MenuC.back; + + Scr->MenuGC = XCreateGC(dpy, Scr->Root, gcm, &gcv); + + gcm = 0; + gcm |= GCPlaneMask; gcv.plane_mask = AllPlanes; + /* + * Prevent GraphicsExpose and NoExpose events. We'd only get NoExpose + * events anyway; they cause BadWindow errors from XGetWindowAttributes + * call in FindScreenInfo (events.c) (since drawable is a pixmap). + */ + gcm |= GCGraphicsExposures; gcv.graphics_exposures = False; + gcm |= GCLineWidth; gcv.line_width = 0; + + Scr->NormalGC = XCreateGC(dpy, Scr->Root, gcm, &gcv); + + greypixmap = XCreatePixmapFromBitmapData(dpy, Scr->Root, + (char *) greypattern, 4, 4, 1, 0, 1); + + if (Scr->Monochrome != COLOR) { + gcm = 0; + gcm |= GCStipple; gcv.stipple = greypixmap; + gcm |= GCFillStyle; gcv.fill_style = FillOpaqueStippled; + gcm |= GCForeground; gcv.foreground = Scr->Black; + gcm |= GCBackground; gcv.background = Scr->White; + Scr->BorderGC = XCreateGC (dpy, Scr->Root, gcm, &gcv); + XSetDashes (dpy, Scr->BorderGC, 1, dashlist, 2); + } + else + if (Scr->BeNiceToColormap) { + gcm = 0; + gcm |= GCLineStyle; + gcv.line_style = LineDoubleDash; + Scr->BorderGC = XCreateGC (dpy, Scr->Root, gcm, &gcv); + XSetDashes (dpy, Scr->BorderGC, 0, dashlist, 2); + } + else { + Scr->BorderGC = XCreateGC (dpy, Scr->Root, 0, (XGCValues*) 0); + } +} Index: external/mit/ctwm/dist/gc.h =================================================================== RCS file: external/mit/ctwm/dist/gc.h diff -N external/mit/ctwm/dist/gc.h --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/gc.h 3 Sep 2015 12:19:48 -0000 @@ -0,0 +1,44 @@ +/*****************************************************************************/ +/** Copyright 1988 by Evans & Sutherland Computer Corporation, **/ +/** Salt Lake City, Utah **/ +/** Portions Copyright 1989 by the Massachusetts Institute of Technology **/ +/** Cambridge, Massachusetts **/ +/** **/ +/** All Rights Reserved **/ +/** **/ +/** Permission to use, copy, modify, and distribute this software and **/ +/** its documentation for any purpose and without fee is hereby **/ +/** granted, provided that the above copyright notice appear in all **/ +/** copies and that both that copyright notice and this permis- **/ +/** sion notice appear in supporting documentation, and that the **/ +/** names of Evans & Sutherland and M.I.T. not be used in advertising **/ +/** in publicity pertaining to distribution of the software without **/ +/** specific, written prior permission. **/ +/** **/ +/** EVANS & SUTHERLAND AND M.I.T. DISCLAIM ALL WARRANTIES WITH REGARD **/ +/** TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANT- **/ +/** ABILITY AND FITNESS, IN NO EVENT SHALL EVANS & SUTHERLAND OR **/ +/** M.I.T. BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAM- **/ +/** AGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA **/ +/** OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER **/ +/** TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE **/ +/** OR PERFORMANCE OF THIS SOFTWARE. **/ +/*****************************************************************************/ + + +/********************************************************************** + * + * $XConsortium: gc.h,v 1.5 89/10/27 14:01:17 jim Exp $ + * + * GC related externs + * + * 8-Apr-88 Tom LaStrange Initial Version. + * + **********************************************************************/ + +#ifndef _GC_ +#define _GC_ + +extern void CreateGCs(void); + +#endif /* _GC_ */ Index: external/mit/ctwm/dist/gendeftwmrc.com =================================================================== RCS file: external/mit/ctwm/dist/gendeftwmrc.com diff -N external/mit/ctwm/dist/gendeftwmrc.com --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/gendeftwmrc.com 3 Sep 2015 12:19:48 -0000 @@ -0,0 +1,36 @@ +$ __save_ver = 'f$verify(0) +$! GENDEFTWMRC.COM -- Generates a new DEFTWMRC.C from SYSTEM.CTWMRC +$! +$ SET SYMBOL/SCOPE=NOGLOBAL +$! DELETE DEFTWMRC.C;* +$ OPEN/WRITE DEFTWMRC DEFTWMRC.C +$ WRITE DEFTWMRC "/* " +$ WRITE DEFTWMRC - + " * This file is generated automatically from the default" +$ WRITE DEFTWMRC - + " * twm bindings file system.ctwmrc by the twm Imakefile." +$ WRITE DEFTWMRC " */" +$ WRITE DEFTWMRC "" +$ WRITE DEFTWMRC "char *defTwmrc[] = {" +$ OPEN/READ CTWMRC SYSTEM.CTWMRC +$ LOOP_SYSTEM: +$ READ/END=LOOP_SYSTEM_END/ERR=LOOP_SYSTEM_END CTWMRC LINE +$ IF F$EXTRACT(0,1,LINE) .EQS. "#" THEN GOTO LOOP_SYSTEM +$ RESULT = "" +$ LOOP_QUOTE: +$ E = F$ELEMENT(0,"""",LINE) +$ RESULT = RESULT + E +$ LINE = LINE - E +$ IF LINE .NES. "" +$ THEN +$ LINE = LINE - """" +$ RESULT = RESULT + "\""" +$ GOTO LOOP_QUOTE +$ ENDIF +$ WRITE DEFTWMRC " """,RESULT,"""," +$ GOTO LOOP_SYSTEM +$ LOOP_SYSTEM_END: +$ CLOSE CTWMRC +$ WRITE DEFTWMRC " (char *) 0 };" +$ CLOSE DEFTWMRC +$ EXIT 1+0*f$verify(__save_ver) Index: external/mit/ctwm/dist/gnome.c =================================================================== RCS file: external/mit/ctwm/dist/gnome.c diff -N external/mit/ctwm/dist/gnome.c --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/gnome.c 3 Sep 2015 12:19:48 -0000 @@ -0,0 +1,151 @@ +#include +#include "twm.h" +#include "screen.h" +#ifdef VMS +#include +#include +#include +#include +#include +#include +#else +#include +#include +#include +#include +#endif + +#define PROTOCOLS_COUNT 5 + +Atom _XA_WIN_WORKSPACE; +Atom _XA_WIN_STATE; +static Atom _XA_WIN_CLIENT_LIST; + + +void InitGnome (void) { + long curws = 0; + virtualScreen *vs; + Atom _XA_WIN_SUPPORTING_WM_CHECK, _XA_WIN_PROTOCOLS, + _XA_WIN_PROTOCOLS_LIST[PROTOCOLS_COUNT], _XA_WIN_DESKTOP_BUTTON_PROXY; + XWindowAttributes winattrs; + unsigned long eventMask; + + XGetWindowAttributes(dpy, Scr->Root, &winattrs); + eventMask = winattrs.your_event_mask; + XSelectInput(dpy, Scr->Root, eventMask & ~PropertyChangeMask); + + _XA_WIN_SUPPORTING_WM_CHECK = XInternAtom (dpy, "_WIN_SUPPORTING_WM_CHECK", False); + _XA_WIN_DESKTOP_BUTTON_PROXY = XInternAtom (dpy, "_WIN_DESKTOP_BUTTON_PROXY", False); + + for (vs = Scr->vScreenList; vs != NULL; vs = vs->next) { + XChangeProperty (dpy, vs->wsw->w, _XA_WIN_SUPPORTING_WM_CHECK, XA_CARDINAL, 32, + PropModeReplace, (unsigned char *) &(vs->wsw->w), 1); + + XChangeProperty (dpy, Scr->Root, _XA_WIN_SUPPORTING_WM_CHECK, XA_CARDINAL, 32, + PropModeReplace, (unsigned char *) &(vs->wsw->w), 1); + + XChangeProperty (dpy, vs->wsw->w, _XA_WIN_DESKTOP_BUTTON_PROXY, XA_CARDINAL, 32, + PropModeReplace, (unsigned char *) &(vs->wsw->w), 1); + + XChangeProperty (dpy, Scr->Root, _XA_WIN_DESKTOP_BUTTON_PROXY, XA_CARDINAL, 32, + PropModeReplace, (unsigned char *) &(vs->wsw->w), 1); + } + _XA_WIN_PROTOCOLS = XInternAtom (dpy, "_WIN_PROTOCOLS", False); + _XA_WIN_PROTOCOLS_LIST[0] = XInternAtom(dpy, "_WIN_WORKSPACE", False); + _XA_WIN_PROTOCOLS_LIST[1] = XInternAtom(dpy, "_WIN_WORKSPACE_COUNT", False); + _XA_WIN_PROTOCOLS_LIST[2] = XInternAtom(dpy, "_WIN_WORKSPACE_NAMES", False); + _XA_WIN_PROTOCOLS_LIST[3] = XInternAtom(dpy, "_WIN_CLIENT_LIST", False); + _XA_WIN_PROTOCOLS_LIST[4] = XInternAtom(dpy, "_WIN_STATE", False); + _XA_WIN_WORKSPACE = _XA_WIN_PROTOCOLS_LIST[0]; + _XA_WIN_CLIENT_LIST = _XA_WIN_PROTOCOLS_LIST[3]; + _XA_WIN_STATE = _XA_WIN_PROTOCOLS_LIST[4]; + + XChangeProperty (dpy, Scr->Root, _XA_WIN_PROTOCOLS, XA_ATOM, 32, + PropModeReplace, (unsigned char *) _XA_WIN_PROTOCOLS_LIST, + PROTOCOLS_COUNT); + + XChangeProperty (dpy, Scr->Root, _XA_WIN_PROTOCOLS_LIST[1], XA_CARDINAL, 32, + PropModeReplace, (unsigned char *) &(Scr->workSpaceMgr.count), 1); + + if (!captive) + XChangeProperty (dpy, Scr->Root, _XA_WIN_PROTOCOLS_LIST[0], XA_CARDINAL, 32, + PropModeReplace, (unsigned char *) &curws, 1); + + XSelectInput (dpy, Scr->Root, eventMask); + + Scr->gnomedata = (GnomeData*) malloc (sizeof (GnomeData)); + Scr->gnomedata->ws = malloc (sizeof (Window)); + if (Scr->gnomedata->ws) { + Scr->gnomedata->wsSize = 1; + Scr->gnomedata->numWins = 0; + } else { + Scr->gnomedata->wsSize = 0; + Scr->gnomedata->numWins = 0; + } + XChangeProperty (dpy, Scr->Root, _XA_WIN_CLIENT_LIST, XA_CARDINAL, 32, + PropModeReplace, (unsigned char *)Scr->gnomedata->ws, + Scr->gnomedata->numWins); +} + +void GnomeAddClientWindow (TwmWindow *new_win) { + XWindowAttributes winattrs; + unsigned long eventMask; + + if (Scr->gnomedata->wsSize == 0) return; + if ((!LookInList (Scr->IconMgrNoShow, new_win->full_name, &new_win->class)) && + (new_win->w != Scr->workSpaceMgr.occupyWindow->w) && + (!new_win->iconmgr)) { + Scr->gnomedata->numWins++; + if (Scr->gnomedata->numWins > Scr->gnomedata->wsSize) { + Scr->gnomedata->wsSize *= 2; + Scr->gnomedata->ws = realloc(Scr->gnomedata->ws, sizeof(Window) * Scr->gnomedata->wsSize); + } + if (Scr->gnomedata->ws) Scr->gnomedata->ws [Scr->gnomedata->numWins - 1] = new_win->w; + else { + Scr->gnomedata->numWins--; + fprintf (stderr, "Unable to allocate memory for GNOME client list.\n"); + return; + } + XGetWindowAttributes (dpy, Scr->Root, &winattrs); + eventMask = winattrs.your_event_mask; + XSelectInput(dpy, Scr->Root, eventMask & ~PropertyChangeMask); + XChangeProperty(dpy, Scr->Root, _XA_WIN_CLIENT_LIST, XA_CARDINAL, 32, + PropModeReplace, (unsigned char *)Scr->gnomedata->ws, + Scr->gnomedata->numWins); + XSelectInput(dpy, Scr->Root, eventMask); + } +} + +void GnomeDeleteClientWindow (TwmWindow *new_win) { + XWindowAttributes winattrs; + unsigned long eventMask; + int i; + + if (Scr->gnomedata->wsSize == 0) return; + if ((!LookInList(Scr->IconMgrNoShow, new_win->full_name, &new_win->class)) && + (new_win->w != Scr->workSpaceMgr.occupyWindow->w) && + (!new_win->iconmgr)) { + for (i = 0; i < Scr->gnomedata->numWins; i++){ + if(Scr->gnomedata->ws[i] == new_win->w){ + Scr->gnomedata->numWins--; + Scr->gnomedata->ws[i] = Scr->gnomedata->ws[Scr->gnomedata->numWins]; + Scr->gnomedata->ws[Scr->gnomedata->numWins] = 0; + if(Scr->gnomedata->numWins && + (Scr->gnomedata->numWins * 3) < Scr->gnomedata->wsSize) { + Scr->gnomedata->wsSize /= 2; + Scr->gnomedata->ws = realloc (Scr->gnomedata->ws, + sizeof (Window) * Scr->gnomedata->wsSize); + /* memory shrinking, shouldn't have problems */ + } + break; + } + } + XGetWindowAttributes (dpy, Scr->Root, &winattrs); + eventMask = winattrs.your_event_mask; + XSelectInput(dpy, Scr->Root, eventMask & ~PropertyChangeMask); + XChangeProperty(dpy, Scr->Root, _XA_WIN_CLIENT_LIST, XA_CARDINAL, 32, + PropModeReplace, (unsigned char *)Scr->gnomedata->ws, + Scr->gnomedata->numWins); + XSelectInput(dpy, Scr->Root, eventMask); + } +} Index: external/mit/ctwm/dist/gnome.h =================================================================== RCS file: external/mit/ctwm/dist/gnome.h diff -N external/mit/ctwm/dist/gnome.h --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/gnome.h 3 Sep 2015 12:19:48 -0000 @@ -0,0 +1,16 @@ +#include "twm.h" + +#ifndef _GNOME_ +#define _GNOME_ + +typedef struct { + Window *ws; + int wsSize; + int numWins; +} GnomeData; + +void InitGnome (void); +void GnomeAddClientWindow (TwmWindow *new_win); +void GnomeDeleteClientWindow (TwmWindow *new_win); + +#endif /* _GNOME_ */ Index: external/mit/ctwm/dist/gnomewindefs.h =================================================================== RCS file: external/mit/ctwm/dist/gnomewindefs.h diff -N external/mit/ctwm/dist/gnomewindefs.h --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/gnomewindefs.h 3 Sep 2015 12:19:48 -0000 @@ -0,0 +1,40 @@ +/* The hints we recognize */ +#define XA_WIN_PROTOCOLS "_WIN_PROTOCOLS" +#define XA_WIN_ICONS "_WIN_ICONS" +#define XA_WIN_WORKSPACE "_WIN_WORKSPACE" +#define XA_WIN_WORKSPACE_COUNT "_WIN_WORKSPACE_COUNT" +#define XA_WIN_WORKSPACE_NAMES "_WIN_WORKSPACE_NAMES" +#define XA_WIN_LAYER "_WIN_LAYER" +#define XA_WIN_STATE "_WIN_STATE" +#define XA_WIN_HINTS "_WIN_HINTS" +#define XA_WIN_WORKAREA "_WIN_WORKAREA" +#define XA_WIN_CLIENT_LIST "_WIN_CLIENT_LIST" +#define XA_WIN_APP_STATE "_WIN_APP_STATE" +#define XA_WIN_EXPANDED_SIZE "_WIN_EXPANDED_SIZE" +#define XA_WIN_CLIENT_MOVING "_WIN_CLIENT_MOVING" +#define XA_WIN_SUPPORTING_WM_CHECK "_WIN_SUPPORTING_WM_CHECK" + +#define WIN_LAYER_DESKTOP 0 +#define WIN_LAYER_BELOW 2 +#define WIN_LAYER_NORMAL 4 +#define WIN_LAYER_ONTOP 6 +#define WIN_LAYER_DOCK 8 +#define WIN_LAYER_ABOVE_DOCK 10 + +#define WIN_STATE_STICKY (1<<0) /* everyone knows sticky */ +#define WIN_STATE_MINIMIZED (1<<1) /* ??? */ +#define WIN_STATE_MAXIMIZED_VERT (1<<2) /* window in maximized V state */ +#define WIN_STATE_MAXIMIZED_HORIZ (1<<3) /* window in maximized H state */ +#define WIN_STATE_HIDDEN (1<<4) /* not on taskbar but window visible */ +#define WIN_STATE_SHADED (1<<5) /* shaded (NeXT style) */ +#define WIN_STATE_HID_WORKSPACE (1<<6) /* not on current desktop */ +#define WIN_STATE_HID_TRANSIENT (1<<7) /* owner of transient is hidden */ +#define WIN_STATE_FIXED_POSITION (1<<8) /* window is fixed in position even */ +#define WIN_STATE_ARRANGE_IGNORE (1<<9) /* ignore for auto arranging */ + +#define WIN_HINTS_SKIP_FOCUS (1<<0) /* "alt-tab" skips this win */ +#define WIN_HINTS_SKIP_WINLIST (1<<1) /* not in win list */ +#define WIN_HINTS_SKIP_TASKBAR (1<<2) /* not on taskbar */ +#define WIN_HINTS_GROUP_TRANSIENT (1<<3) /* ??????? */ +#define WIN_HINTS_FOCUS_ON_CLICK (1<<4) /* app only accepts focus when clicked */ +#define WIN_HINTS_DO_NOT_COVER (1<<5) /* attempt to not cover this window */ Index: external/mit/ctwm/dist/gram.c_VMS =================================================================== RCS file: external/mit/ctwm/dist/gram.c_VMS diff -N external/mit/ctwm/dist/gram.c_VMS --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/gram.c_VMS 3 Sep 2015 12:19:51 -0000 @@ -0,0 +1,4918 @@ + +# line 43 "gram.y" +#include +#include +#include "twm.h" +#include "menus.h" +#include "icons.h" +#include "list.h" +#include "util.h" +#include "screen.h" +#include "parse.h" +#ifdef VMS +#include +#include +#else +#include +#include +#endif + +static char *Action = ""; +static char *Name = ""; +static char *defstring = "default"; +static MenuRoot *root, *pull = NULL; +static char *curWorkSpc; +static char *client, *workspace; +static MenuItem *lastmenuitem = (MenuItem*) 0; + +static MenuRoot *GetRoot(); + +static Bool CheckWarpScreenArg(), CheckWarpRingArg(); +static Bool CheckColormapArg(); +static void GotButton(), GotKey(), GotTitleButton(); +static char *ptr; +static name_list **list; +static int cont = 0; +static int color; +int mods = 0; +unsigned int mods_used = (ShiftMask | ControlMask | Mod1Mask); + +extern int do_single_keyword(), do_string_keyword(), do_number_keyword(); +extern name_list **do_colorlist_keyword(); +extern int do_color_keyword(), do_string_savecolor(); +extern int yylineno; + +# line 81 "gram.y" +typedef union +{ + int num; + char *ptr; +} YYSTYPE; +#ifdef __cplusplus +# include + extern "C" { + extern void yyerror(char *); + extern int yylex(); + } +#endif /* __cplusplus */ +# define LB 257 +# define RB 258 +# define LP 259 +# define RP 260 +# define MENUS 261 +# define MENU 262 +# define BUTTON 263 +# define DEFAULT_FUNCTION 264 +# define PLUS 265 +# define MINUS 266 +# define ALL 267 +# define OR 268 +# define CURSORS 269 +# define PIXMAPS 270 +# define ICONS 271 +# define COLOR 272 +# define SAVECOLOR 273 +# define MONOCHROME 274 +# define FUNCTION 275 +# define ICONMGR_SHOW 276 +# define ICONMGR 277 +# define WINDOW_FUNCTION 278 +# define ZOOM 279 +# define ICONMGRS 280 +# define ICONMGR_GEOMETRY 281 +# define ICONMGR_NOSHOW 282 +# define MAKE_TITLE 283 +# define ICONIFY_BY_UNMAPPING 284 +# define DONT_ICONIFY_BY_UNMAPPING 285 +# define NO_BORDER 286 +# define NO_ICON_TITLE 287 +# define NO_TITLE 288 +# define AUTO_RAISE 289 +# define NO_HILITE 290 +# define ICON_REGION 291 +# define META 292 +# define SHIFT 293 +# define LOCK 294 +# define CONTROL 295 +# define WINDOW 296 +# define TITLE 297 +# define ICON 298 +# define ROOT 299 +# define FRAME 300 +# define COLON 301 +# define EQUALS 302 +# define SQUEEZE_TITLE 303 +# define DONT_SQUEEZE_TITLE 304 +# define START_ICONIFIED 305 +# define NO_TITLE_HILITE 306 +# define TITLE_HILITE 307 +# define MOVE 308 +# define RESIZE 309 +# define WAITC 310 +# define SELECT 311 +# define KILL 312 +# define LEFT_TITLEBUTTON 313 +# define RIGHT_TITLEBUTTON 314 +# define NUMBER 315 +# define KEYWORD 316 +# define NKEYWORD 317 +# define CKEYWORD 318 +# define CLKEYWORD 319 +# define FKEYWORD 320 +# define FSKEYWORD 321 +# define SKEYWORD 322 +# define DKEYWORD 323 +# define JKEYWORD 324 +# define WINDOW_RING 325 +# define WARP_CURSOR 326 +# define ERRORTOKEN 327 +# define NO_STACKMODE 328 +# define WORKSPACE 329 +# define WORKSPACES 330 +# define WORKSPCMGR_GEOMETRY 331 +# define OCCUPYALL 332 +# define OCCUPYLIST 333 +# define MAPWINDOWCURRENTWORKSPACE 334 +# define MAPWINDOWDEFAULTWORKSPACE 335 +# define OPAQUEMOVE 336 +# define NOOPAQUEMOVE 337 +# define OPAQUERESIZE 338 +# define NOOPAQUERESIZE 339 +# define CHANGE_WORKSPACE_FUNCTION 340 +# define DEICONIFY_FUNCTION 341 +# define ICONIFY_FUNCTION 342 +# define STRING 343 +#define yyclearin yychar = -1 +#define yyerrok yyerrflag = 0 +extern int yychar; +#ifndef YYMAXDEPTH +#define YYMAXDEPTH 150 +#endif + +/* __YYSCLASS defines the scoping/storage class for global objects + * that are NOT renamed by the -p option. By default these names + * are going to be 'static' so that multi-definition errors + * will not occur with multiple parsers. + * If you want (unsupported) access to internal names you need + * to define this to be null so it implies 'extern' scope. + * This should not be used in conjunction with -p. + */ +#ifndef __YYSCLASS +# define __YYSCLASS static +#endif +YYSTYPE yylval; +__YYSCLASS YYSTYPE yyval; +typedef int yytabelem; +# define YYERRCODE 256 + +# line 830 "gram.y" + +yyerror(s) char *s; +{ + twmrc_error_prefix(); + fprintf (stderr, "error in input file: %s\n", s ? s : ""); + ParseError = 1; +} +RemoveDQuote(str) +char *str; +{ + register char *i, *o; + register n; + register count; + + for (i=str+1, o=str; *i && *i != '\"'; o++) + { + if (*i == '\\') + { + switch (*++i) + { + case 'n': + *o = '\n'; + i++; + break; + case 'b': + *o = '\b'; + i++; + break; + case 'r': + *o = '\r'; + i++; + break; + case 't': + *o = '\t'; + i++; + break; + case 'f': + *o = '\f'; + i++; + break; + case '0': + if (*++i == 'x') + goto hex; + else + --i; + case '1': case '2': case '3': + case '4': case '5': case '6': case '7': + n = 0; + count = 0; + while (*i >= '0' && *i <= '7' && count < 3) + { + n = (n<<3) + (*i++ - '0'); + count++; + } + *o = n; + break; + hex: + case 'x': + n = 0; + count = 0; + while (i++, count++ < 2) + { + if (*i >= '0' && *i <= '9') + n = (n<<4) + (*i - '0'); + else if (*i >= 'a' && *i <= 'f') + n = (n<<4) + (*i - 'a') + 10; + else if (*i >= 'A' && *i <= 'F') + n = (n<<4) + (*i - 'A') + 10; + else + break; + } + *o = n; + break; + case '\n': + i++; /* punt */ + o--; /* to account for o++ at end of loop */ + break; + case '\"': + case '\'': + case '\\': + default: + *o = *i++; + break; + } + } + else + *o = *i++; + } + *o = '\0'; +} + +static MenuRoot *GetRoot(name, fore, back) +char *name; +char *fore, *back; +{ + MenuRoot *tmp; + + tmp = FindMenuRoot(name); + if (tmp == NULL) + tmp = NewMenuRoot(name); + + if (fore) + { + int save; + + save = Scr->FirstTime; + Scr->FirstTime = TRUE; + GetColor(COLOR, &tmp->highlight.fore, fore); + GetColor(COLOR, &tmp->highlight.back, back); + Scr->FirstTime = save; + } + + return tmp; +} + +static void GotButton (butt, func) +int butt, func; +{ + int i; + MenuRoot *menu; + MenuItem *item; + + for (i = 0; i < NUM_CONTEXTS; i++) { + if ((cont & (1 << i)) == 0) continue; + + if (func == F_MENU) { + pull->prev = NULL; + AddFuncButton (butt, i, mods, func, pull, (MenuItem*) 0); + } + else { + root = GetRoot (TWM_ROOT, NULLSTR, NULLSTR); + item = AddToMenu (root, "x", Action, NULLSTR, func, NULLSTR, NULLSTR); + AddFuncButton (butt, i, mods, func, (MenuRoot*) 0, item); + } + } + + Action = ""; + pull = NULL; + cont = 0; + mods_used |= mods; + mods = 0; +} + +static void GotKey(key, func) +char *key; +int func; +{ + int i; + + for (i = 0; i < NUM_CONTEXTS; i++) + { + if ((cont & (1 << i)) == 0) + continue; + if (!AddFuncKey(key, i, mods, func, Name, Action)) + break; + } + + Action = ""; + pull = NULL; + cont = 0; + mods_used |= mods; + mods = 0; +} + + +static void GotTitleButton (bitmapname, func, rightside) + char *bitmapname; + int func; + Bool rightside; +{ + if (!CreateTitleButton (bitmapname, func, Action, pull, rightside, True)) { + twmrc_error_prefix(); + fprintf (stderr, + "unable to create %s titlebutton \"%s\"\n", + rightside ? "right" : "left", bitmapname); + } + Action = ""; + pull = NULL; +} + +static Bool CheckWarpScreenArg (s) + register char *s; +{ + XmuCopyISOLatin1Lowered (s, s); + + if (strcmp (s, WARPSCREEN_NEXT) == 0 || + strcmp (s, WARPSCREEN_PREV) == 0 || + strcmp (s, WARPSCREEN_BACK) == 0) + return True; + + for (; *s && isascii(*s) && isdigit(*s); s++) ; /* SUPPRESS 530 */ + return (*s ? False : True); +} + + +static Bool CheckWarpRingArg (s) + register char *s; +{ + XmuCopyISOLatin1Lowered (s, s); + + if (strcmp (s, WARPSCREEN_NEXT) == 0 || + strcmp (s, WARPSCREEN_PREV) == 0) + return True; + + return False; +} + + +static Bool CheckColormapArg (s) + register char *s; +{ + XmuCopyISOLatin1Lowered (s, s); + + if (strcmp (s, COLORMAP_NEXT) == 0 || + strcmp (s, COLORMAP_PREV) == 0 || + strcmp (s, COLORMAP_DEFAULT) == 0) + return True; + + return False; +} + + +twmrc_error_prefix () +{ + fprintf (stderr, "%s: line %d: ", ProgramName, yylineno); +} +__YYSCLASS yytabelem yyexca[] ={ +-1, 1, + 0, -1, + -2, 0, +-1, 2, + 0, 1, + -2, 0, +-1, 17, + 257, 24, + -2, 26, +-1, 18, + 257, 27, + -2, 29, +-1, 19, + 257, 30, + -2, 32, +-1, 20, + 257, 33, + -2, 35, +-1, 21, + 257, 36, + -2, 38, +-1, 30, + 257, 53, + -2, 55, +-1, 33, + 257, 60, + -2, 62, +-1, 34, + 257, 63, + -2, 65, +-1, 35, + 257, 66, + -2, 68, +-1, 37, + 257, 71, + -2, 73, +-1, 38, + 257, 74, + -2, 76, +-1, 41, + 257, 81, + -2, 83, +-1, 53, + 257, 103, + -2, 105, +-1, 54, + 257, 106, + -2, 108, +-1, 58, + 257, 192, + -2, 191, +-1, 59, + 257, 195, + -2, 194, +-1, 242, + 257, 208, + -2, 207, +-1, 267, + 257, 10, + -2, 9, +-1, 319, + 257, 179, + -2, 178, + }; +# define YYNPROD 268 +# define YYLAST 654 +__YYSCLASS yytabelem yyact[]={ + + 25, 209, 61, 331, 321, 68, 339, 175, 85, 122, + 62, 63, 64, 83, 84, 68, 376, 178, 138, 372, + 137, 364, 87, 78, 79, 80, 83, 84, 369, 303, + 304, 243, 361, 61, 325, 323, 251, 161, 312, 301, + 313, 270, 380, 104, 105, 337, 261, 268, 347, 61, + 265, 346, 254, 210, 302, 357, 352, 117, 296, 297, + 298, 299, 300, 294, 4, 252, 180, 83, 84, 246, + 42, 60, 48, 316, 248, 240, 332, 16, 15, 44, + 45, 46, 47, 43, 32, 139, 49, 14, 31, 10, + 30, 39, 17, 26, 36, 37, 38, 41, 34, 9, + 67, 61, 247, 81, 61, 61, 61, 264, 315, 132, + 330, 58, 59, 40, 33, 234, 61, 61, 220, 61, + 61, 22, 23, 61, 55, 57, 61, 176, 218, 177, + 56, 61, 61, 54, 53, 61, 35, 61, 27, 11, + 28, 29, 12, 13, 18, 19, 20, 21, 50, 51, + 52, 61, 110, 111, 112, 113, 114, 212, 118, 61, + 61, 121, 208, 173, 123, 124, 167, 169, 343, 344, + 83, 84, 203, 165, 166, 257, 150, 219, 221, 147, + 144, 222, 128, 126, 223, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 236, 199, 200, 201, 202, + 61, 72, 70, 61, 253, 204, 242, 245, 250, 140, + 255, 213, 373, 61, 256, 367, 263, 266, 68, 365, + 269, 349, 271, 351, 272, 273, 274, 275, 276, 277, + 278, 279, 280, 281, 282, 260, 259, 334, 203, 181, + 305, 195, 196, 191, 187, 333, 307, 308, 309, 244, + 206, 310, 311, 314, 235, 194, 362, 318, 186, 348, + 319, 320, 199, 200, 201, 202, 329, 306, 241, 205, + 324, 197, 326, 292, 293, 249, 217, 207, 184, 185, + 120, 183, 216, 290, 170, 119, 377, 370, 262, 188, + 189, 190, 192, 193, 215, 356, 340, 141, 291, 258, + 238, 214, 285, 286, 287, 288, 289, 283, 182, 130, + 179, 336, 129, 295, 284, 198, 239, 237, 267, 116, + 115, 109, 168, 108, 107, 164, 106, 211, 163, 162, + 131, 354, 103, 102, 101, 100, 99, 350, 98, 97, + 355, 96, 95, 94, 149, 93, 92, 146, 91, 363, + 366, 90, 143, 89, 88, 77, 368, 317, 76, 75, + 74, 73, 71, 69, 371, 127, 66, 125, 374, 65, + 375, 378, 379, 322, 8, 7, 6, 5, 3, 381, + 382, 2, 1, 384, 86, 82, 341, 327, 24, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 328, 0, + 0, 0, 0, 0, 0, 133, 134, 135, 136, 0, + 0, 335, 0, 0, 0, 0, 0, 0, 338, 142, + 0, 145, 342, 148, 0, 151, 152, 153, 154, 155, + 156, 157, 158, 159, 160, 0, 0, 353, 0, 0, + 0, 0, 358, 0, 359, 360, 171, 172, 0, 0, + 0, 174, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 383, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 345 }; +__YYSCLASS yytabelem yypact[]={ + + -3000, -3000, -192, -3000, -3000, -3000, -3000, -3000, -3000, -341, + -341, -341, -3000, -3000, -300, -55, -56, -3000, -3000, -3000, + -3000, -3000, -341, -341, -294, -280, -3000, -3000, -3000, -3000, + -3000, -3000, -3000, -3000, -3000, -3000, -3000, -3000, -3000, -3000, + -3000, -3000, -341, -341, -3000, -3000, -3000, -3000, -307, -307, + -307, -307, -307, -3000, -3000, -3000, -341, -300, -3000, -3000, + -300, -3000, -314, -300, -300, -74, -75, -3000, -3000, -3000, + -3000, -3000, -3000, -148, -148, -148, -148, -148, -282, -284, + -3000, -3000, -3000, -3000, -341, -3000, -3000, -3000, -148, -77, + -148, -78, -148, -81, -148, -148, -148, -148, -148, -148, + -148, -148, -148, -148, -222, -3000, -84, -91, -90, -91, + -3000, -3000, -3000, -3000, -3000, -148, -148, -3000, -3000, -94, + -148, -3000, -316, -3000, -3000, -3000, -341, -3000, -341, -241, + -19, -3000, -3000, -3000, -3000, -3000, -3000, -307, -307, -3000, + -30, -96, -3000, -3000, -3000, -3000, -3000, -3000, -3000, -3000, + -3000, -3000, -3000, -3000, -3000, -3000, -3000, -3000, -3000, -3000, + -3000, -341, -204, -100, -3000, -3000, -3000, -3000, -3000, -3000, + -3000, -3000, -3000, -3000, -3000, -300, -130, -140, -3000, -3000, + -341, -3000, -3000, -341, -341, -341, -341, -341, -341, -341, + -341, -341, -341, -341, -143, -3000, -3000, -3000, -3000, -300, + -3000, -3000, -3000, -3000, -3000, -183, -227, -184, -265, -3000, + -3000, -3000, -3000, -206, -83, -212, -208, -300, -3000, -211, + -3000, -217, -3000, -341, -341, -341, -341, -341, -341, -341, + -341, -341, -341, -341, -3000, -3000, -3000, 6, -3000, -238, + -3000, -3000, -3000, -3000, -3000, -3000, -341, -341, -3000, -3000, + -341, -341, -220, -150, -3000, -3000, -341, -3000, -3000, -341, + -341, -3000, -3000, -3000, -3000, -3000, -320, -3000, -3000, -223, + -3000, -224, -3000, -3000, -3000, -3000, -3000, -3000, -3000, -3000, + -3000, -3000, -3000, -307, -3000, -3000, -3000, -3000, -3000, -3000, + -3000, -3000, -3000, -3000, -307, -3000, -3000, -3000, -3000, -3000, + -3000, -3000, -3000, -3000, -3000, -3000, -147, -181, -3000, -3000, + -310, -215, -3000, -3000, -253, -3000, -3000, -3000, -3000, -3000, + -3000, -97, -148, -3000, -207, -3000, -210, -3000, -3000, -3000, + -3000, -3000, -3000, -181, -201, -3000, -300, -3000, -3000, -341, + -202, -300, -3000, -300, -300, -3000, -3000, -3000, -226, -237, + -3000, -3000, -3000, -3000, -204, -273, -3000, -3000, -3000, -3000, + -3000, -3000, -3000, -341, -3000, -3000, -3000, -239, -3000, -341, + -242, -341, -3000, -3000, -3000, -218, -3000, -3000, -341, -341, + -307, -3000, -341, -3000, -3000 }; +__YYSCLASS yytabelem yypgo[]={ + + 0, 0, 103, 388, 100, 386, 385, 384, 382, 381, + 378, 377, 376, 375, 374, 373, 330, 369, 367, 366, + 365, 363, 362, 361, 360, 359, 358, 355, 354, 353, + 352, 351, 348, 347, 346, 345, 344, 343, 342, 341, + 339, 338, 336, 335, 334, 333, 332, 331, 1, 329, + 328, 327, 326, 325, 324, 174, 323, 322, 321, 320, + 319, 209, 317, 316, 315, 314, 313, 312, 310, 309, + 308, 301, 299, 296, 295, 294, 288, 287, 286, 285, + 282, 280, 277, 275, 269, 268, 267, 266, 259, 256, + 255, 254, 250, 249, 246, 3, 245, 237, 223, 221, + 219, 215, 212, 211, 210, 204, 73, 65, 40 }; +__YYSCLASS yytabelem yyr1[]={ + + 0, 8, 9, 9, 10, 10, 10, 10, 10, 10, + 15, 10, 10, 10, 10, 10, 17, 10, 19, 10, + 10, 10, 10, 10, 23, 10, 10, 24, 10, 10, + 25, 10, 10, 26, 10, 10, 27, 10, 10, 10, + 10, 10, 10, 10, 10, 28, 10, 29, 10, 31, + 10, 32, 10, 34, 10, 10, 35, 10, 37, 10, + 38, 10, 10, 39, 10, 10, 40, 10, 10, 41, + 10, 42, 10, 10, 43, 10, 10, 44, 10, 45, + 10, 46, 10, 10, 47, 10, 49, 10, 50, 10, + 52, 10, 54, 10, 56, 10, 58, 10, 10, 10, + 10, 10, 10, 59, 10, 10, 60, 10, 10, 11, + 12, 12, 13, 6, 7, 61, 61, 64, 64, 64, + 64, 64, 64, 62, 62, 65, 65, 65, 65, 65, + 65, 65, 65, 65, 63, 63, 66, 66, 66, 66, + 66, 66, 66, 66, 66, 66, 21, 67, 67, 68, + 22, 69, 69, 70, 70, 70, 70, 70, 70, 70, + 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, + 70, 70, 70, 70, 70, 55, 71, 71, 72, 73, + 72, 72, 57, 75, 75, 76, 76, 74, 77, 77, + 78, 14, 79, 14, 14, 81, 14, 80, 80, 36, + 82, 82, 83, 83, 30, 84, 84, 85, 86, 85, + 87, 88, 88, 89, 89, 89, 89, 89, 18, 18, + 18, 18, 20, 20, 20, 20, 16, 90, 90, 91, + 33, 92, 92, 94, 93, 96, 93, 97, 93, 95, + 99, 99, 100, 98, 101, 101, 102, 53, 103, 103, + 104, 51, 105, 105, 106, 48, 107, 107, 108, 108, + 2, 2, 5, 5, 5, 3, 1, 4 }; +__YYSCLASS yytabelem yyr2[]={ + + 0, 2, 0, 4, 2, 2, 2, 2, 2, 13, + 1, 16, 7, 5, 7, 5, 1, 6, 1, 6, + 5, 3, 5, 5, 1, 6, 3, 1, 6, 3, + 1, 6, 3, 1, 6, 3, 1, 6, 3, 9, + 9, 5, 5, 5, 5, 1, 6, 1, 6, 1, + 6, 1, 6, 1, 6, 3, 1, 6, 1, 6, + 1, 6, 3, 1, 6, 3, 1, 6, 3, 1, + 6, 1, 6, 3, 1, 6, 3, 1, 6, 1, + 6, 1, 6, 3, 1, 19, 1, 9, 1, 8, + 1, 6, 1, 6, 1, 6, 1, 6, 5, 5, + 5, 5, 5, 1, 6, 3, 1, 6, 3, 3, + 5, 3, 5, 13, 13, 0, 4, 3, 3, 3, + 3, 5, 3, 0, 4, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 0, 4, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 7, 0, 4, 5, + 7, 0, 4, 7, 5, 7, 5, 7, 5, 7, + 5, 7, 5, 7, 5, 7, 5, 7, 5, 7, + 5, 7, 5, 7, 5, 7, 0, 4, 5, 1, + 8, 5, 7, 0, 4, 3, 3, 7, 0, 4, + 5, 3, 1, 10, 3, 1, 6, 0, 11, 7, + 0, 4, 7, 9, 7, 0, 4, 3, 1, 6, + 7, 0, 4, 3, 5, 7, 9, 11, 7, 9, + 11, 13, 7, 9, 11, 13, 7, 0, 4, 3, + 7, 0, 4, 1, 6, 1, 8, 1, 8, 7, + 0, 4, 3, 7, 0, 4, 3, 7, 0, 4, + 5, 7, 0, 4, 3, 7, 0, 4, 5, 15, + 3, 5, 3, 5, 5, 5, 3, 3 }; +__YYSCLASS yytabelem yychk[]={ + + -3000, -8, -9, -10, 256, -11, -12, -13, -14, 291, + 281, 331, 334, 335, 279, 270, 269, 284, 336, 337, + 338, 339, 313, 314, -3, -1, 285, 330, 332, 333, + 282, 280, 276, 306, 290, 328, 286, 287, 288, 283, + 305, 289, 262, 275, 271, 272, 273, 274, 264, 278, + 340, 341, 342, 326, 325, 316, 322, 317, 303, 304, + 263, 343, -1, -1, -1, -17, -19, -4, 315, -21, + 257, -22, 257, -23, -24, -25, -26, -27, -1, -1, + -1, -2, -6, 320, 321, 302, -7, 302, -28, -29, + -31, -32, -34, -35, -37, -38, -39, -40, -41, -42, + -43, -44, -45, -46, -1, -1, -52, -54, -56, -58, + -2, -2, -2, -2, -2, -59, -60, -1, -4, -79, + -81, -4, 323, -4, -4, -18, 257, -20, 257, -67, + -69, -16, 257, -16, -16, -16, -16, 302, 302, -1, + -61, -61, -16, -30, 257, -16, -33, 257, -16, -36, + 257, -16, -16, -16, -16, -16, -16, -16, -16, -16, + -16, 259, -49, -50, -53, 257, -55, 257, -57, 257, + -55, -16, -16, 257, -16, 323, -1, -1, 258, -68, + 307, 258, -70, 300, 297, 298, 277, 263, 308, 309, + 310, 262, 311, 312, -90, -2, -2, 301, -64, 292, + 293, 294, 295, 268, 301, -84, -92, -82, -1, -48, + 257, -51, 257, -103, -71, -75, -80, -4, 258, -1, + 258, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 258, -91, -1, -62, -4, -63, + 258, -85, -1, 258, -93, -1, 296, 329, 258, -83, + -1, 301, -107, -105, 258, -104, -1, 258, -72, 319, + 318, 258, -76, -1, 319, 258, -1, -4, 258, -1, + 258, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 301, -65, 296, 297, 298, 299, 300, + 277, 292, 267, 268, 301, -66, 296, 297, 298, 299, + 300, 277, 292, 267, 268, -1, -86, -94, -1, -1, + -1, -1, 258, -108, -1, 258, -106, -2, -1, -1, + -1, 324, -15, 258, -1, 258, -1, -2, -2, -87, + 257, -95, 257, -96, -97, -4, -1, 260, -2, 259, + -73, -5, -4, 265, 266, -16, 258, 258, -88, -99, + -95, -98, 257, -4, -47, -1, -74, 257, -4, -4, + -4, 258, -89, -1, 258, -100, -1, -101, -48, 301, + -77, -1, 258, -102, -1, -1, 258, -78, -1, -1, + 260, -1, -1, -2, -1 }; +__YYSCLASS yytabelem yydef[]={ + + 2, -2, -2, 3, 4, 5, 6, 7, 8, 0, + 0, 0, 16, 18, 21, 0, 0, -2, -2, -2, + -2, -2, 0, 0, 0, 0, 45, 47, 49, 51, + -2, 56, 58, -2, -2, -2, 69, -2, -2, 77, + 79, -2, 0, 0, 90, 92, 94, 96, 0, 0, + 0, 0, 0, -2, -2, 109, 111, 0, -2, -2, + 0, 266, 0, 13, 15, 0, 0, 20, 267, 22, + 147, 23, 151, 0, 0, 0, 0, 0, 0, 0, + 41, 42, 44, 260, 0, 115, 43, 115, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 86, 88, 0, 0, 0, 0, + 98, 99, 100, 101, 102, 0, 0, 110, 112, 0, + 0, 265, 0, 12, 14, 17, 0, 19, 0, 0, + 0, 25, 227, 28, 31, 34, 37, 0, 0, 261, + 0, 0, 46, 48, 205, 50, 52, 231, 54, 57, + 200, 59, 61, 64, 67, 70, 72, 75, 78, 80, + 82, 0, 0, 0, 91, 248, 93, 176, 95, 183, + 97, 104, 107, 197, 196, 0, 0, 0, 146, 148, + 0, 150, 152, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 39, 40, 123, 116, 117, + 118, 119, 120, 122, 134, 0, 0, 0, 0, 87, + 256, 89, 252, 0, 0, 0, 0, 0, 218, 0, + 222, 0, 149, 154, 156, 158, 160, 162, 164, 166, + 168, 170, 172, 174, 226, 228, 229, 0, 121, 0, + 204, 206, -2, 230, 232, 233, 0, 0, 199, 201, + 0, 0, 0, 0, 247, 249, 0, 175, 177, 0, + 0, 182, 184, 185, 186, 193, 0, -2, 219, 0, + 223, 0, 153, 155, 157, 159, 161, 163, 165, 167, + 169, 171, 173, 0, 124, 125, 126, 127, 128, 129, + 130, 131, 132, 133, 0, 135, 136, 137, 138, 139, + 140, 141, 142, 143, 144, 145, 0, 0, 235, 237, + 0, 0, 255, 257, 0, 251, 253, 254, 250, -2, + 181, 0, 0, 220, 0, 224, 0, 113, 114, 209, + 211, 234, 240, 0, 0, 202, 0, 84, 258, 0, + 0, 0, 262, 0, 0, 11, 221, 225, 0, 0, + 236, 238, 244, 203, 0, 0, 180, 188, 198, 263, + 264, 210, 212, 213, 239, 241, 242, 0, 85, 0, + 0, 214, 243, 245, 246, 0, 187, 189, 0, 215, + 0, 190, 216, 259, 217 }; +typedef struct { char *t_name; int t_val; } yytoktype; +#ifndef YYDEBUG +# define YYDEBUG 0 /* don't allow debugging */ +#endif + +#if YYDEBUG + +__YYSCLASS yytoktype yytoks[] = +{ + "LB", 257, + "RB", 258, + "LP", 259, + "RP", 260, + "MENUS", 261, + "MENU", 262, + "BUTTON", 263, + "DEFAULT_FUNCTION", 264, + "PLUS", 265, + "MINUS", 266, + "ALL", 267, + "OR", 268, + "CURSORS", 269, + "PIXMAPS", 270, + "ICONS", 271, + "COLOR", 272, + "SAVECOLOR", 273, + "MONOCHROME", 274, + "FUNCTION", 275, + "ICONMGR_SHOW", 276, + "ICONMGR", 277, + "WINDOW_FUNCTION", 278, + "ZOOM", 279, + "ICONMGRS", 280, + "ICONMGR_GEOMETRY", 281, + "ICONMGR_NOSHOW", 282, + "MAKE_TITLE", 283, + "ICONIFY_BY_UNMAPPING", 284, + "DONT_ICONIFY_BY_UNMAPPING", 285, + "NO_BORDER", 286, + "NO_ICON_TITLE", 287, + "NO_TITLE", 288, + "AUTO_RAISE", 289, + "NO_HILITE", 290, + "ICON_REGION", 291, + "META", 292, + "SHIFT", 293, + "LOCK", 294, + "CONTROL", 295, + "WINDOW", 296, + "TITLE", 297, + "ICON", 298, + "ROOT", 299, + "FRAME", 300, + "COLON", 301, + "EQUALS", 302, + "SQUEEZE_TITLE", 303, + "DONT_SQUEEZE_TITLE", 304, + "START_ICONIFIED", 305, + "NO_TITLE_HILITE", 306, + "TITLE_HILITE", 307, + "MOVE", 308, + "RESIZE", 309, + "WAITC", 310, + "SELECT", 311, + "KILL", 312, + "LEFT_TITLEBUTTON", 313, + "RIGHT_TITLEBUTTON", 314, + "NUMBER", 315, + "KEYWORD", 316, + "NKEYWORD", 317, + "CKEYWORD", 318, + "CLKEYWORD", 319, + "FKEYWORD", 320, + "FSKEYWORD", 321, + "SKEYWORD", 322, + "DKEYWORD", 323, + "JKEYWORD", 324, + "WINDOW_RING", 325, + "WARP_CURSOR", 326, + "ERRORTOKEN", 327, + "NO_STACKMODE", 328, + "WORKSPACE", 329, + "WORKSPACES", 330, + "WORKSPCMGR_GEOMETRY", 331, + "OCCUPYALL", 332, + "OCCUPYLIST", 333, + "MAPWINDOWCURRENTWORKSPACE", 334, + "MAPWINDOWDEFAULTWORKSPACE", 335, + "OPAQUEMOVE", 336, + "NOOPAQUEMOVE", 337, + "OPAQUERESIZE", 338, + "NOOPAQUERESIZE", 339, + "CHANGE_WORKSPACE_FUNCTION", 340, + "DEICONIFY_FUNCTION", 341, + "ICONIFY_FUNCTION", 342, + "STRING", 343, + "-unknown-", -1 /* ends search */ +}; + +__YYSCLASS char * yyreds[] = +{ + "-no such reduction-", + "twmrc : stmts", + "stmts : /* empty */", + "stmts : stmts stmt", + "stmt : error", + "stmt : noarg", + "stmt : sarg", + "stmt : narg", + "stmt : squeeze", + "stmt : ICON_REGION string DKEYWORD DKEYWORD number number", + "stmt : ICON_REGION string DKEYWORD DKEYWORD number number", + "stmt : ICON_REGION string DKEYWORD DKEYWORD number number win_list", + "stmt : ICONMGR_GEOMETRY string number", + "stmt : ICONMGR_GEOMETRY string", + "stmt : WORKSPCMGR_GEOMETRY string number", + "stmt : WORKSPCMGR_GEOMETRY string", + "stmt : MAPWINDOWCURRENTWORKSPACE", + "stmt : MAPWINDOWCURRENTWORKSPACE curwork", + "stmt : MAPWINDOWDEFAULTWORKSPACE", + "stmt : MAPWINDOWDEFAULTWORKSPACE defwork", + "stmt : ZOOM number", + "stmt : ZOOM", + "stmt : PIXMAPS pixmap_list", + "stmt : CURSORS cursor_list", + "stmt : ICONIFY_BY_UNMAPPING", + "stmt : ICONIFY_BY_UNMAPPING win_list", + "stmt : ICONIFY_BY_UNMAPPING", + "stmt : OPAQUEMOVE", + "stmt : OPAQUEMOVE win_list", + "stmt : OPAQUEMOVE", + "stmt : NOOPAQUEMOVE", + "stmt : NOOPAQUEMOVE win_list", + "stmt : NOOPAQUEMOVE", + "stmt : OPAQUERESIZE", + "stmt : OPAQUERESIZE win_list", + "stmt : OPAQUERESIZE", + "stmt : NOOPAQUERESIZE", + "stmt : NOOPAQUERESIZE win_list", + "stmt : NOOPAQUERESIZE", + "stmt : LEFT_TITLEBUTTON string EQUALS action", + "stmt : RIGHT_TITLEBUTTON string EQUALS action", + "stmt : button string", + "stmt : button action", + "stmt : string fullkey", + "stmt : button full", + "stmt : DONT_ICONIFY_BY_UNMAPPING", + "stmt : DONT_ICONIFY_BY_UNMAPPING win_list", + "stmt : WORKSPACES", + "stmt : WORKSPACES workspc_list", + "stmt : OCCUPYALL", + "stmt : OCCUPYALL win_list", + "stmt : OCCUPYLIST", + "stmt : OCCUPYLIST occupy_list", + "stmt : ICONMGR_NOSHOW", + "stmt : ICONMGR_NOSHOW win_list", + "stmt : ICONMGR_NOSHOW", + "stmt : ICONMGRS", + "stmt : ICONMGRS iconm_list", + "stmt : ICONMGR_SHOW", + "stmt : ICONMGR_SHOW win_list", + "stmt : NO_TITLE_HILITE", + "stmt : NO_TITLE_HILITE win_list", + "stmt : NO_TITLE_HILITE", + "stmt : NO_HILITE", + "stmt : NO_HILITE win_list", + "stmt : NO_HILITE", + "stmt : NO_STACKMODE", + "stmt : NO_STACKMODE win_list", + "stmt : NO_STACKMODE", + "stmt : NO_BORDER", + "stmt : NO_BORDER win_list", + "stmt : NO_ICON_TITLE", + "stmt : NO_ICON_TITLE win_list", + "stmt : NO_ICON_TITLE", + "stmt : NO_TITLE", + "stmt : NO_TITLE win_list", + "stmt : NO_TITLE", + "stmt : MAKE_TITLE", + "stmt : MAKE_TITLE win_list", + "stmt : START_ICONIFIED", + "stmt : START_ICONIFIED win_list", + "stmt : AUTO_RAISE", + "stmt : AUTO_RAISE win_list", + "stmt : AUTO_RAISE", + "stmt : MENU string LP string COLON string RP", + "stmt : MENU string LP string COLON string RP menu", + "stmt : MENU string", + "stmt : MENU string menu", + "stmt : FUNCTION string", + "stmt : FUNCTION string function", + "stmt : ICONS", + "stmt : ICONS icon_list", + "stmt : COLOR", + "stmt : COLOR color_list", + "stmt : SAVECOLOR", + "stmt : SAVECOLOR save_color_list", + "stmt : MONOCHROME", + "stmt : MONOCHROME color_list", + "stmt : DEFAULT_FUNCTION action", + "stmt : WINDOW_FUNCTION action", + "stmt : CHANGE_WORKSPACE_FUNCTION action", + "stmt : DEICONIFY_FUNCTION action", + "stmt : ICONIFY_FUNCTION action", + "stmt : WARP_CURSOR", + "stmt : WARP_CURSOR win_list", + "stmt : WARP_CURSOR", + "stmt : WINDOW_RING", + "stmt : WINDOW_RING win_list", + "stmt : WINDOW_RING", + "noarg : KEYWORD", + "sarg : SKEYWORD string", + "sarg : SKEYWORD", + "narg : NKEYWORD number", + "full : EQUALS keys COLON contexts COLON action", + "fullkey : EQUALS keys COLON contextkeys COLON action", + "keys : /* empty */", + "keys : keys key", + "key : META", + "key : SHIFT", + "key : LOCK", + "key : CONTROL", + "key : META number", + "key : OR", + "contexts : /* empty */", + "contexts : contexts context", + "context : WINDOW", + "context : TITLE", + "context : ICON", + "context : ROOT", + "context : FRAME", + "context : ICONMGR", + "context : META", + "context : ALL", + "context : OR", + "contextkeys : /* empty */", + "contextkeys : contextkeys contextkey", + "contextkey : WINDOW", + "contextkey : TITLE", + "contextkey : ICON", + "contextkey : ROOT", + "contextkey : FRAME", + "contextkey : ICONMGR", + "contextkey : META", + "contextkey : ALL", + "contextkey : OR", + "contextkey : string", + "pixmap_list : LB pixmap_entries RB", + "pixmap_entries : /* empty */", + "pixmap_entries : pixmap_entries pixmap_entry", + "pixmap_entry : TITLE_HILITE string", + "cursor_list : LB cursor_entries RB", + "cursor_entries : /* empty */", + "cursor_entries : cursor_entries cursor_entry", + "cursor_entry : FRAME string string", + "cursor_entry : FRAME string", + "cursor_entry : TITLE string string", + "cursor_entry : TITLE string", + "cursor_entry : ICON string string", + "cursor_entry : ICON string", + "cursor_entry : ICONMGR string string", + "cursor_entry : ICONMGR string", + "cursor_entry : BUTTON string string", + "cursor_entry : BUTTON string", + "cursor_entry : MOVE string string", + "cursor_entry : MOVE string", + "cursor_entry : RESIZE string string", + "cursor_entry : RESIZE string", + "cursor_entry : WAITC string string", + "cursor_entry : WAITC string", + "cursor_entry : MENU string string", + "cursor_entry : MENU string", + "cursor_entry : SELECT string string", + "cursor_entry : SELECT string", + "cursor_entry : KILL string string", + "cursor_entry : KILL string", + "color_list : LB color_entries RB", + "color_entries : /* empty */", + "color_entries : color_entries color_entry", + "color_entry : CLKEYWORD string", + "color_entry : CLKEYWORD string", + "color_entry : CLKEYWORD string win_color_list", + "color_entry : CKEYWORD string", + "save_color_list : LB s_color_entries RB", + "s_color_entries : /* empty */", + "s_color_entries : s_color_entries s_color_entry", + "s_color_entry : string", + "s_color_entry : CLKEYWORD", + "win_color_list : LB win_color_entries RB", + "win_color_entries : /* empty */", + "win_color_entries : win_color_entries win_color_entry", + "win_color_entry : string string", + "squeeze : SQUEEZE_TITLE", + "squeeze : SQUEEZE_TITLE", + "squeeze : SQUEEZE_TITLE LB win_sqz_entries RB", + "squeeze : DONT_SQUEEZE_TITLE", + "squeeze : DONT_SQUEEZE_TITLE", + "squeeze : DONT_SQUEEZE_TITLE win_list", + "win_sqz_entries : /* empty */", + "win_sqz_entries : win_sqz_entries string JKEYWORD signed_number number", + "iconm_list : LB iconm_entries RB", + "iconm_entries : /* empty */", + "iconm_entries : iconm_entries iconm_entry", + "iconm_entry : string string number", + "iconm_entry : string string string number", + "workspc_list : LB workspc_entries RB", + "workspc_entries : /* empty */", + "workspc_entries : workspc_entries workspc_entry", + "workspc_entry : string", + "workspc_entry : string", + "workspc_entry : string workapp_list", + "workapp_list : LB workapp_entries RB", + "workapp_entries : /* empty */", + "workapp_entries : workapp_entries workapp_entry", + "workapp_entry : string", + "workapp_entry : string string", + "workapp_entry : string string string", + "workapp_entry : string string string string", + "workapp_entry : string string string string string", + "curwork : LB string RB", + "curwork : LB string string RB", + "curwork : LB string string string RB", + "curwork : LB string string string string RB", + "defwork : LB string RB", + "defwork : LB string string RB", + "defwork : LB string string string RB", + "defwork : LB string string string string RB", + "win_list : LB win_entries RB", + "win_entries : /* empty */", + "win_entries : win_entries win_entry", + "win_entry : string", + "occupy_list : LB occupy_entries RB", + "occupy_entries : /* empty */", + "occupy_entries : occupy_entries occupy_entry", + "occupy_entry : string", + "occupy_entry : string occupy_workspc_list", + "occupy_entry : WINDOW string", + "occupy_entry : WINDOW string occupy_workspc_list", + "occupy_entry : WORKSPACE string", + "occupy_entry : WORKSPACE string occupy_window_list", + "occupy_workspc_list : LB occupy_workspc_entries RB", + "occupy_workspc_entries : /* empty */", + "occupy_workspc_entries : occupy_workspc_entries occupy_workspc_entry", + "occupy_workspc_entry : string", + "occupy_window_list : LB occupy_window_entries RB", + "occupy_window_entries : /* empty */", + "occupy_window_entries : occupy_window_entries occupy_window_entry", + "occupy_window_entry : string", + "icon_list : LB icon_entries RB", + "icon_entries : /* empty */", + "icon_entries : icon_entries icon_entry", + "icon_entry : string string", + "function : LB function_entries RB", + "function_entries : /* empty */", + "function_entries : function_entries function_entry", + "function_entry : action", + "menu : LB menu_entries RB", + "menu_entries : /* empty */", + "menu_entries : menu_entries menu_entry", + "menu_entry : string action", + "menu_entry : string LP string COLON string RP action", + "action : FKEYWORD", + "action : FSKEYWORD string", + "signed_number : number", + "signed_number : PLUS number", + "signed_number : MINUS number", + "button : BUTTON number", + "string : STRING", + "number : NUMBER", +}; +#endif /* YYDEBUG */ +#define YYFLAG (-3000) +/* @(#) $Revision: 1.2 $ */ + +/* +** Skeleton parser driver for yacc output +*/ + +#if defined(NLS) && !defined(NL_SETN) +#include +#endif + +#ifndef nl_msg +#define nl_msg(i,s) (s) +#endif + +/* +** yacc user known macros and defines +*/ +#define YYERROR goto yyerrlab + +#ifndef __RUNTIME_YYMAXDEPTH +#define YYACCEPT return(0) +#define YYABORT return(1) +#else +#define YYACCEPT {free_stacks(); return(0);} +#define YYABORT {free_stacks(); return(1);} +#endif + +#define YYBACKUP( newtoken, newvalue )\ +{\ + if ( yychar >= 0 || ( yyr2[ yytmp ] >> 1 ) != 1 )\ + {\ + yyerror( (nl_msg(30001,"syntax error - cannot backup")) );\ + goto yyerrlab;\ + }\ + yychar = newtoken;\ + yystate = *yyps;\ + yylval = newvalue;\ + goto yynewstate;\ +} +#define YYRECOVERING() (!!yyerrflag) +#ifndef YYDEBUG +# define YYDEBUG 1 /* make debugging available */ +#endif + +/* +** user known globals +*/ +int yydebug; /* set to 1 to get debugging */ + +/* +** driver internal defines +*/ +/* define for YYFLAG now generated by yacc program. */ +/*#define YYFLAG (FLAGVAL)*/ + +/* +** global variables used by the parser +*/ +# ifndef __RUNTIME_YYMAXDEPTH +__YYSCLASS YYSTYPE yyv[ YYMAXDEPTH ]; /* value stack */ +__YYSCLASS int yys[ YYMAXDEPTH ]; /* state stack */ +# else +__YYSCLASS YYSTYPE *yyv; /* pointer to malloc'ed value stack */ +__YYSCLASS int *yys; /* pointer to malloc'ed stack stack */ + +#if defined(__STDC__) || defined (__cplusplus) +#include +#else + extern char *malloc(); + extern char *realloc(); + extern void free(); +#endif /* __STDC__ or __cplusplus */ + + +static int allocate_stacks(); +static void free_stacks(); +# ifndef YYINCREMENT +# define YYINCREMENT (YYMAXDEPTH/2) + 10 +# endif +# endif /* __RUNTIME_YYMAXDEPTH */ +long yymaxdepth = YYMAXDEPTH; + +__YYSCLASS YYSTYPE *yypv; /* top of value stack */ +__YYSCLASS int *yyps; /* top of state stack */ + +__YYSCLASS int yystate; /* current state */ +__YYSCLASS int yytmp; /* extra var (lasts between blocks) */ + +int yynerrs; /* number of errors */ +__YYSCLASS int yyerrflag; /* error recovery flag */ +int yychar; /* current input token number */ + + + +/* +** yyparse - return 0 if worked, 1 if syntax error not recovered from +*/ +int +yyparse() +{ + register YYSTYPE *yypvt; /* top of value stack for $vars */ + + /* + ** Initialize externals - yyparse may be called more than once + */ +# ifdef __RUNTIME_YYMAXDEPTH + if (allocate_stacks()) YYABORT; +# endif + yypv = &yyv[-1]; + yyps = &yys[-1]; + yystate = 0; + yytmp = 0; + yynerrs = 0; + yyerrflag = 0; + yychar = -1; + + goto yystack; + { + register YYSTYPE *yy_pv; /* top of value stack */ + register int *yy_ps; /* top of state stack */ + register int yy_state; /* current state */ + register int yy_n; /* internal state number info */ + + /* + ** get globals into registers. + ** branch to here only if YYBACKUP was called. + */ + yynewstate: + yy_pv = yypv; + yy_ps = yyps; + yy_state = yystate; + goto yy_newstate; + + /* + ** get globals into registers. + ** either we just started, or we just finished a reduction + */ + yystack: + yy_pv = yypv; + yy_ps = yyps; + yy_state = yystate; + + /* + ** top of for (;;) loop while no reductions done + */ + yy_stack: + /* + ** put a state and value onto the stacks + */ +#if YYDEBUG + /* + ** if debugging, look up token value in list of value vs. + ** name pairs. 0 and negative (-1) are special values. + ** Note: linear search is used since time is not a real + ** consideration while debugging. + */ + if ( yydebug ) + { + register int yy_i; + + printf( "State %d, token ", yy_state ); + if ( yychar == 0 ) + printf( "end-of-file\n" ); + else if ( yychar < 0 ) + printf( "-none-\n" ); + else + { + for ( yy_i = 0; yytoks[yy_i].t_val >= 0; + yy_i++ ) + { + if ( yytoks[yy_i].t_val == yychar ) + break; + } + printf( "%s\n", yytoks[yy_i].t_name ); + } + } +#endif /* YYDEBUG */ + if ( ++yy_ps >= &yys[ yymaxdepth ] ) /* room on stack? */ + { +# ifndef __RUNTIME_YYMAXDEPTH + yyerror( (nl_msg(30002,"yacc stack overflow")) ); + YYABORT; +# else + /* save old stack bases to recalculate pointers */ + YYSTYPE * yyv_old = yyv; + int * yys_old = yys; + yymaxdepth += YYINCREMENT; + yys = (int *) realloc(yys, yymaxdepth * sizeof(int)); + yyv = (YYSTYPE *) realloc(yyv, yymaxdepth * sizeof(YYSTYPE)); + if (yys==0 || yyv==0) { + yyerror( (nl_msg(30002,"yacc stack overflow")) ); + YYABORT; + } + /* Reset pointers into stack */ + yy_ps = (yy_ps - yys_old) + yys; + yyps = (yyps - yys_old) + yys; + yy_pv = (yy_pv - yyv_old) + yyv; + yypv = (yypv - yyv_old) + yyv; +# endif + + } + *yy_ps = yy_state; + *++yy_pv = yyval; + + /* + ** we have a new state - find out what to do + */ + yy_newstate: + if ( ( yy_n = yypact[ yy_state ] ) <= YYFLAG ) + goto yydefault; /* simple state */ +#if YYDEBUG + /* + ** if debugging, need to mark whether new token grabbed + */ + yytmp = yychar < 0; +#endif + if ( ( yychar < 0 ) && ( ( yychar = yylex() ) < 0 ) ) + yychar = 0; /* reached EOF */ +#if YYDEBUG + if ( yydebug && yytmp ) + { + register int yy_i; + + printf( "Received token " ); + if ( yychar == 0 ) + printf( "end-of-file\n" ); + else if ( yychar < 0 ) + printf( "-none-\n" ); + else + { + for ( yy_i = 0; yytoks[yy_i].t_val >= 0; + yy_i++ ) + { + if ( yytoks[yy_i].t_val == yychar ) + break; + } + printf( "%s\n", yytoks[yy_i].t_name ); + } + } +#endif /* YYDEBUG */ + if ( ( ( yy_n += yychar ) < 0 ) || ( yy_n >= YYLAST ) ) + goto yydefault; + if ( yychk[ yy_n = yyact[ yy_n ] ] == yychar ) /*valid shift*/ + { + yychar = -1; + yyval = yylval; + yy_state = yy_n; + if ( yyerrflag > 0 ) + yyerrflag--; + goto yy_stack; + } + + yydefault: + if ( ( yy_n = yydef[ yy_state ] ) == -2 ) + { +#if YYDEBUG + yytmp = yychar < 0; +#endif + if ( ( yychar < 0 ) && ( ( yychar = yylex() ) < 0 ) ) + yychar = 0; /* reached EOF */ +#if YYDEBUG + if ( yydebug && yytmp ) + { + register int yy_i; + + printf( "Received token " ); + if ( yychar == 0 ) + printf( "end-of-file\n" ); + else if ( yychar < 0 ) + printf( "-none-\n" ); + else + { + for ( yy_i = 0; + yytoks[yy_i].t_val >= 0; + yy_i++ ) + { + if ( yytoks[yy_i].t_val + == yychar ) + { + break; + } + } + printf( "%s\n", yytoks[yy_i].t_name ); + } + } +#endif /* YYDEBUG */ + /* + ** look through exception table + */ + { + register int *yyxi = yyexca; + + while ( ( *yyxi != -1 ) || + ( yyxi[1] != yy_state ) ) + { + yyxi += 2; + } + while ( ( *(yyxi += 2) >= 0 ) && + ( *yyxi != yychar ) ) + ; + if ( ( yy_n = yyxi[1] ) < 0 ) + YYACCEPT; + } + } + + /* + ** check for syntax error + */ + if ( yy_n == 0 ) /* have an error */ + { + /* no worry about speed here! */ + switch ( yyerrflag ) + { + case 0: /* new error */ + yyerror( (nl_msg(30003,"syntax error")) ); + yynerrs++; + goto skip_init; + yyerrlab: + /* + ** get globals into registers. + ** we have a user generated syntax type error + */ + yy_pv = yypv; + yy_ps = yyps; + yy_state = yystate; + yynerrs++; + skip_init: + case 1: + case 2: /* incompletely recovered error */ + /* try again... */ + yyerrflag = 3; + /* + ** find state where "error" is a legal + ** shift action + */ + while ( yy_ps >= yys ) + { + yy_n = yypact[ *yy_ps ] + YYERRCODE; + if ( yy_n >= 0 && yy_n < YYLAST && + yychk[yyact[yy_n]] == YYERRCODE) { + /* + ** simulate shift of "error" + */ + yy_state = yyact[ yy_n ]; + goto yy_stack; + } + /* + ** current state has no shift on + ** "error", pop stack + */ +#if YYDEBUG +# define _POP_ "Error recovery pops state %d, uncovers state %d\n" + if ( yydebug ) + printf( _POP_, *yy_ps, + yy_ps[-1] ); +# undef _POP_ +#endif + yy_ps--; + yy_pv--; + } + /* + ** there is no state on stack with "error" as + ** a valid shift. give up. + */ + YYABORT; + case 3: /* no shift yet; eat a token */ +#if YYDEBUG + /* + ** if debugging, look up token in list of + ** pairs. 0 and negative shouldn't occur, + ** but since timing doesn't matter when + ** debugging, it doesn't hurt to leave the + ** tests here. + */ + if ( yydebug ) + { + register int yy_i; + + printf( "Error recovery discards " ); + if ( yychar == 0 ) + printf( "token end-of-file\n" ); + else if ( yychar < 0 ) + printf( "token -none-\n" ); + else + { + for ( yy_i = 0; + yytoks[yy_i].t_val >= 0; + yy_i++ ) + { + if ( yytoks[yy_i].t_val + == yychar ) + { + break; + } + } + printf( "token %s\n", + yytoks[yy_i].t_name ); + } + } +#endif /* YYDEBUG */ + if ( yychar == 0 ) /* reached EOF. quit */ + YYABORT; + yychar = -1; + goto yy_newstate; + } + }/* end if ( yy_n == 0 ) */ + /* + ** reduction by production yy_n + ** put stack tops, etc. so things right after switch + */ +#if YYDEBUG + /* + ** if debugging, print the string that is the user's + ** specification of the reduction which is just about + ** to be done. + */ + if ( yydebug ) + printf( "Reduce by (%d) \"%s\"\n", + yy_n, yyreds[ yy_n ] ); +#endif + yytmp = yy_n; /* value to switch over */ + yypvt = yy_pv; /* $vars top of value stack */ + /* + ** Look in goto table for next state + ** Sorry about using yy_state here as temporary + ** register variable, but why not, if it works... + ** If yyr2[ yy_n ] doesn't have the low order bit + ** set, then there is no action to be done for + ** this reduction. So, no saving & unsaving of + ** registers done. The only difference between the + ** code just after the if and the body of the if is + ** the goto yy_stack in the body. This way the test + ** can be made before the choice of what to do is needed. + */ + { + /* length of production doubled with extra bit */ + register int yy_len = yyr2[ yy_n ]; + + if ( !( yy_len & 01 ) ) + { + yy_len >>= 1; + yyval = ( yy_pv -= yy_len )[1]; /* $$ = $1 */ + yy_state = yypgo[ yy_n = yyr1[ yy_n ] ] + + *( yy_ps -= yy_len ) + 1; + if ( yy_state >= YYLAST || + yychk[ yy_state = + yyact[ yy_state ] ] != -yy_n ) + { + yy_state = yyact[ yypgo[ yy_n ] ]; + } + goto yy_stack; + } + yy_len >>= 1; + yyval = ( yy_pv -= yy_len )[1]; /* $$ = $1 */ + yy_state = yypgo[ yy_n = yyr1[ yy_n ] ] + + *( yy_ps -= yy_len ) + 1; + if ( yy_state >= YYLAST || + yychk[ yy_state = yyact[ yy_state ] ] != -yy_n ) + { + yy_state = yyact[ yypgo[ yy_n ] ]; + } + } + /* save until reenter driver code */ + yystate = yy_state; + yyps = yy_ps; + yypv = yy_pv; + } + /* + ** code supplied by user is placed in this switch + */ + switch( yytmp ) + { + +case 9: +# line 123 "gram.y" +{ + (void) AddIconRegion(yypvt[-4].ptr, yypvt[-3].num, yypvt[-2].num, yypvt[-1].num, yypvt[-0].num); + } break; +case 10: +# line 126 "gram.y" +{ + list = AddIconRegion(yypvt[-4].ptr, yypvt[-3].num, yypvt[-2].num, yypvt[-1].num, yypvt[-0].num); + } break; +case 12: +# line 130 "gram.y" +{ if (Scr->FirstTime) + { + Scr->iconmgr->geometry= yypvt[-1].ptr; + Scr->iconmgr->columns=yypvt[-0].num; + } + } break; +case 13: +# line 136 "gram.y" +{ if (Scr->FirstTime) + Scr->iconmgr->geometry = yypvt[-0].ptr; + } break; +case 14: +# line 139 "gram.y" +{ if (Scr->FirstTime) + { + Scr->workSpaceMgr.workspaceWindow.geometry= yypvt[-1].ptr; + Scr->workSpaceMgr.workspaceWindow.columns=yypvt[-0].num; + } + } break; +case 15: +# line 145 "gram.y" +{ if (Scr->FirstTime) + Scr->workSpaceMgr.workspaceWindow.geometry = yypvt[-0].ptr; + } break; +case 16: +# line 148 "gram.y" +{} break; +case 18: +# line 151 "gram.y" +{} break; +case 20: +# line 154 "gram.y" +{ if (Scr->FirstTime) + { + Scr->DoZoom = TRUE; + Scr->ZoomCount = yypvt[-0].num; + } + } break; +case 21: +# line 160 "gram.y" +{ if (Scr->FirstTime) + Scr->DoZoom = TRUE; } break; +case 22: +# line 162 "gram.y" +{} break; +case 23: +# line 163 "gram.y" +{} break; +case 24: +# line 164 "gram.y" +{ list = &Scr->IconifyByUn; } break; +case 26: +# line 166 "gram.y" +{ if (Scr->FirstTime) + Scr->IconifyByUnmapping = TRUE; } break; +case 27: +# line 169 "gram.y" +{ list = &Scr->OpaqueMoveList; } break; +case 29: +# line 171 "gram.y" +{ if (Scr->FirstTime) Scr->DoOpaqueMove = TRUE; } break; +case 30: +# line 172 "gram.y" +{ list = &Scr->NoOpaqueMoveList; } break; +case 32: +# line 174 "gram.y" +{ if (Scr->FirstTime) Scr->DoOpaqueMove = FALSE; } break; +case 33: +# line 175 "gram.y" +{ list = &Scr->OpaqueMoveList; } break; +case 35: +# line 177 "gram.y" +{ if (Scr->FirstTime) Scr->DoOpaqueResize = TRUE; } break; +case 36: +# line 178 "gram.y" +{ list = &Scr->NoOpaqueResizeList; } break; +case 38: +# line 180 "gram.y" +{ if (Scr->FirstTime) Scr->DoOpaqueResize = FALSE; } break; +case 39: +# line 182 "gram.y" +{ + GotTitleButton (yypvt[-2].ptr, yypvt[-0].num, False); + } break; +case 40: +# line 185 "gram.y" +{ + GotTitleButton (yypvt[-2].ptr, yypvt[-0].num, True); + } break; +case 41: +# line 188 "gram.y" +{ + root = GetRoot(yypvt[-0].ptr, NULLSTR, NULLSTR); + AddFuncButton (yypvt[-1].num, C_ROOT, 0, F_MENU, root, (MenuItem*) 0); + } break; +case 42: +# line 192 "gram.y" +{ + if (yypvt[-0].num == F_MENU) { + pull->prev = NULL; + AddFuncButton (yypvt[-1].num, C_ROOT, 0, yypvt[-0].num, pull, (MenuItem*) 0); + } + else { + MenuItem *item; + + root = GetRoot(TWM_ROOT,NULLSTR,NULLSTR); + item = AddToMenu (root, "x", Action, + NULLSTR, yypvt[-0].num, NULLSTR, NULLSTR); + AddFuncButton (yypvt[-1].num, C_ROOT, 0, yypvt[-0].num, (MenuRoot*) 0, item); + } + Action = ""; + pull = NULL; + } break; +case 43: +# line 208 "gram.y" +{ GotKey(yypvt[-1].ptr, yypvt[-0].num); } break; +case 44: +# line 209 "gram.y" +{ GotButton(yypvt[-1].num, yypvt[-0].num); } break; +case 45: +# line 211 "gram.y" +{ list = &Scr->DontIconify; } break; +case 47: +# line 213 "gram.y" +{} break; +case 49: +# line 215 "gram.y" +{ list = &Scr->OccupyAll; } break; +case 51: +# line 217 "gram.y" +{} break; +case 53: +# line 219 "gram.y" +{ list = &Scr->IconMgrNoShow; } break; +case 55: +# line 221 "gram.y" +{ Scr->IconManagerDontShow = TRUE; } break; +case 56: +# line 222 "gram.y" +{ list = &Scr->IconMgrs; } break; +case 58: +# line 224 "gram.y" +{ list = &Scr->IconMgrShow; } break; +case 60: +# line 226 "gram.y" +{ list = &Scr->NoTitleHighlight; } break; +case 62: +# line 228 "gram.y" +{ if (Scr->FirstTime) + Scr->TitleHighlight = FALSE; } break; +case 63: +# line 230 "gram.y" +{ list = &Scr->NoHighlight; } break; +case 65: +# line 232 "gram.y" +{ if (Scr->FirstTime) + Scr->Highlight = FALSE; } break; +case 66: +# line 234 "gram.y" +{ list = &Scr->NoStackModeL; } break; +case 68: +# line 236 "gram.y" +{ if (Scr->FirstTime) + Scr->StackMode = FALSE; } break; +case 69: +# line 238 "gram.y" +{ list = &Scr->NoBorder; } break; +case 71: +# line 240 "gram.y" +{ list = &Scr->NoIconTitle; } break; +case 73: +# line 242 "gram.y" +{ if (Scr->FirstTime) + Scr->NoIconTitlebar = TRUE; } break; +case 74: +# line 244 "gram.y" +{ list = &Scr->NoTitle; } break; +case 76: +# line 246 "gram.y" +{ if (Scr->FirstTime) + Scr->NoTitlebar = TRUE; } break; +case 77: +# line 248 "gram.y" +{ list = &Scr->MakeTitle; } break; +case 79: +# line 250 "gram.y" +{ list = &Scr->StartIconified; } break; +case 81: +# line 252 "gram.y" +{ list = &Scr->AutoRaise; } break; +case 83: +# line 254 "gram.y" +{ Scr->AutoRaiseDefault = TRUE; } break; +case 84: +# line 255 "gram.y" +{ + root = GetRoot(yypvt[-5].ptr, yypvt[-3].ptr, yypvt[-1].ptr); } break; +case 85: +# line 257 "gram.y" +{ root->real_menu = TRUE;} break; +case 86: +# line 258 "gram.y" +{ root = GetRoot(yypvt[-0].ptr, NULLSTR, NULLSTR); } break; +case 87: +# line 259 "gram.y" +{ root->real_menu = TRUE; } break; +case 88: +# line 260 "gram.y" +{ root = GetRoot(yypvt[-0].ptr, NULLSTR, NULLSTR); } break; +case 90: +# line 262 "gram.y" +{ list = &Scr->IconNames; } break; +case 92: +# line 264 "gram.y" +{ color = COLOR; } break; +case 94: +# line 266 "gram.y" +{} break; +case 96: +# line 268 "gram.y" +{ color = MONOCHROME; } break; +case 98: +# line 270 "gram.y" +{ Scr->DefaultFunction.func = yypvt[-0].num; + if (yypvt[-0].num == F_MENU) + { + pull->prev = NULL; + Scr->DefaultFunction.menu = pull; + } + else + { + root = GetRoot(TWM_ROOT,NULLSTR,NULLSTR); + Scr->DefaultFunction.item = + AddToMenu(root,"x",Action, + NULLSTR,yypvt[-0].num, NULLSTR, NULLSTR); + } + Action = ""; + pull = NULL; + } break; +case 99: +# line 286 "gram.y" +{ Scr->WindowFunction.func = yypvt[-0].num; + root = GetRoot(TWM_ROOT,NULLSTR,NULLSTR); + Scr->WindowFunction.item = + AddToMenu(root,"x",Action, + NULLSTR,yypvt[-0].num, NULLSTR, NULLSTR); + Action = ""; + pull = NULL; + } break; +case 100: +# line 294 "gram.y" +{ Scr->ChangeWorkspaceFunction.func = yypvt[-0].num; + root = GetRoot(TWM_ROOT,NULLSTR,NULLSTR); + Scr->ChangeWorkspaceFunction.item = + AddToMenu(root,"x",Action, + NULLSTR,yypvt[-0].num, NULLSTR, NULLSTR); + Action = ""; + pull = NULL; + } break; +case 101: +# line 302 "gram.y" +{ Scr->DeIconifyFunction.func = yypvt[-0].num; + root = GetRoot(TWM_ROOT,NULLSTR,NULLSTR); + Scr->DeIconifyFunction.item = + AddToMenu(root,"x",Action, + NULLSTR,yypvt[-0].num, NULLSTR, NULLSTR); + Action = ""; + pull = NULL; + } break; +case 102: +# line 310 "gram.y" +{ Scr->IconifyFunction.func = yypvt[-0].num; + root = GetRoot(TWM_ROOT,NULLSTR,NULLSTR); + Scr->IconifyFunction.item = + AddToMenu(root,"x",Action, + NULLSTR,yypvt[-0].num, NULLSTR, NULLSTR); + Action = ""; + pull = NULL; + } break; +case 103: +# line 318 "gram.y" +{ list = &Scr->WarpCursorL; } break; +case 105: +# line 320 "gram.y" +{ if (Scr->FirstTime) + Scr->WarpCursor = TRUE; } break; +case 106: +# line 322 "gram.y" +{ list = &Scr->WindowRingL; } break; +case 108: +# line 324 "gram.y" +{ Scr->WindowRingAll = TRUE; } break; +case 109: +# line 327 "gram.y" +{ if (!do_single_keyword (yypvt[-0].num)) { + twmrc_error_prefix(); + fprintf (stderr, + "unknown singleton keyword %d\n", + yypvt[-0].num); + ParseError = 1; + } + } break; +case 110: +# line 337 "gram.y" +{ if (!do_string_keyword (yypvt[-1].num, yypvt[-0].ptr)) { + twmrc_error_prefix(); + fprintf (stderr, + "unknown string keyword %d (value \"%s\")\n", + yypvt[-1].num, yypvt[-0].ptr); + ParseError = 1; + } + } break; +case 111: +# line 345 "gram.y" +{ if (!do_string_keyword (yypvt[-0].num, defstring)) { + twmrc_error_prefix(); + fprintf (stderr, + "unknown string keyword %d (no value)\n", + yypvt[-0].num); + ParseError = 1; + } + } break; +case 112: +# line 355 "gram.y" +{ if (!do_number_keyword (yypvt[-1].num, yypvt[-0].num)) { + twmrc_error_prefix(); + fprintf (stderr, + "unknown numeric keyword %d (value %d)\n", + yypvt[-1].num, yypvt[-0].num); + ParseError = 1; + } + } break; +case 113: +# line 367 "gram.y" +{ yyval.num = yypvt[-0].num; } break; +case 114: +# line 370 "gram.y" +{ yyval.num = yypvt[-0].num; } break; +case 117: +# line 377 "gram.y" +{ mods |= Mod1Mask; } break; +case 118: +# line 378 "gram.y" +{ mods |= ShiftMask; } break; +case 119: +# line 379 "gram.y" +{ mods |= LockMask; } break; +case 120: +# line 380 "gram.y" +{ mods |= ControlMask; } break; +case 121: +# line 381 "gram.y" +{ if (yypvt[-0].num < 1 || yypvt[-0].num > 5) { + twmrc_error_prefix(); + fprintf (stderr, + "bad modifier number (%d), must be 1-5\n", + yypvt[-0].num); + ParseError = 1; + } else { + mods |= (Mod1Mask << (yypvt[-0].num - 1)); + } + } break; +case 122: +# line 391 "gram.y" +{ } break; +case 125: +# line 398 "gram.y" +{ cont |= C_WINDOW_BIT; } break; +case 126: +# line 399 "gram.y" +{ cont |= C_TITLE_BIT; } break; +case 127: +# line 400 "gram.y" +{ cont |= C_ICON_BIT; } break; +case 128: +# line 401 "gram.y" +{ cont |= C_ROOT_BIT; } break; +case 129: +# line 402 "gram.y" +{ cont |= C_FRAME_BIT; } break; +case 130: +# line 403 "gram.y" +{ cont |= C_ICONMGR_BIT; } break; +case 131: +# line 404 "gram.y" +{ cont |= C_ICONMGR_BIT; } break; +case 132: +# line 405 "gram.y" +{ cont |= C_ALL_BITS; } break; +case 133: +# line 406 "gram.y" +{ } break; +case 136: +# line 413 "gram.y" +{ cont |= C_WINDOW_BIT; } break; +case 137: +# line 414 "gram.y" +{ cont |= C_TITLE_BIT; } break; +case 138: +# line 415 "gram.y" +{ cont |= C_ICON_BIT; } break; +case 139: +# line 416 "gram.y" +{ cont |= C_ROOT_BIT; } break; +case 140: +# line 417 "gram.y" +{ cont |= C_FRAME_BIT; } break; +case 141: +# line 418 "gram.y" +{ cont |= C_ICONMGR_BIT; } break; +case 142: +# line 419 "gram.y" +{ cont |= C_ICONMGR_BIT; } break; +case 143: +# line 420 "gram.y" +{ cont |= C_ALL_BITS; } break; +case 144: +# line 421 "gram.y" +{ } break; +case 145: +# line 422 "gram.y" +{ Name = yypvt[-0].ptr; cont |= C_NAME_BIT; } break; +case 146: +# line 426 "gram.y" +{} break; +case 149: +# line 433 "gram.y" +{ SetHighlightPixmap (yypvt[-0].ptr); } break; +case 150: +# line 437 "gram.y" +{} break; +case 153: +# line 444 "gram.y" +{ + NewBitmapCursor(&Scr->FrameCursor, yypvt[-1].ptr, yypvt[-0].ptr); } break; +case 154: +# line 446 "gram.y" +{ + NewFontCursor(&Scr->FrameCursor, yypvt[-0].ptr); } break; +case 155: +# line 448 "gram.y" +{ + NewBitmapCursor(&Scr->TitleCursor, yypvt[-1].ptr, yypvt[-0].ptr); } break; +case 156: +# line 450 "gram.y" +{ + NewFontCursor(&Scr->TitleCursor, yypvt[-0].ptr); } break; +case 157: +# line 452 "gram.y" +{ + NewBitmapCursor(&Scr->IconCursor, yypvt[-1].ptr, yypvt[-0].ptr); } break; +case 158: +# line 454 "gram.y" +{ + NewFontCursor(&Scr->IconCursor, yypvt[-0].ptr); } break; +case 159: +# line 456 "gram.y" +{ + NewBitmapCursor(&Scr->IconMgrCursor, yypvt[-1].ptr, yypvt[-0].ptr); } break; +case 160: +# line 458 "gram.y" +{ + NewFontCursor(&Scr->IconMgrCursor, yypvt[-0].ptr); } break; +case 161: +# line 460 "gram.y" +{ + NewBitmapCursor(&Scr->ButtonCursor, yypvt[-1].ptr, yypvt[-0].ptr); } break; +case 162: +# line 462 "gram.y" +{ + NewFontCursor(&Scr->ButtonCursor, yypvt[-0].ptr); } break; +case 163: +# line 464 "gram.y" +{ + NewBitmapCursor(&Scr->MoveCursor, yypvt[-1].ptr, yypvt[-0].ptr); } break; +case 164: +# line 466 "gram.y" +{ + NewFontCursor(&Scr->MoveCursor, yypvt[-0].ptr); } break; +case 165: +# line 468 "gram.y" +{ + NewBitmapCursor(&Scr->ResizeCursor, yypvt[-1].ptr, yypvt[-0].ptr); } break; +case 166: +# line 470 "gram.y" +{ + NewFontCursor(&Scr->ResizeCursor, yypvt[-0].ptr); } break; +case 167: +# line 472 "gram.y" +{ + NewBitmapCursor(&Scr->WaitCursor, yypvt[-1].ptr, yypvt[-0].ptr); } break; +case 168: +# line 474 "gram.y" +{ + NewFontCursor(&Scr->WaitCursor, yypvt[-0].ptr); } break; +case 169: +# line 476 "gram.y" +{ + NewBitmapCursor(&Scr->MenuCursor, yypvt[-1].ptr, yypvt[-0].ptr); } break; +case 170: +# line 478 "gram.y" +{ + NewFontCursor(&Scr->MenuCursor, yypvt[-0].ptr); } break; +case 171: +# line 480 "gram.y" +{ + NewBitmapCursor(&Scr->SelectCursor, yypvt[-1].ptr, yypvt[-0].ptr); } break; +case 172: +# line 482 "gram.y" +{ + NewFontCursor(&Scr->SelectCursor, yypvt[-0].ptr); } break; +case 173: +# line 484 "gram.y" +{ + NewBitmapCursor(&Scr->DestroyCursor, yypvt[-1].ptr, yypvt[-0].ptr); } break; +case 174: +# line 486 "gram.y" +{ + NewFontCursor(&Scr->DestroyCursor, yypvt[-0].ptr); } break; +case 175: +# line 490 "gram.y" +{} break; +case 178: +# line 498 "gram.y" +{ if (!do_colorlist_keyword (yypvt[-1].num, color, + yypvt[-0].ptr)) { + twmrc_error_prefix(); + fprintf (stderr, + "unhandled list color keyword %d (string \"%s\")\n", + yypvt[-1].num, yypvt[-0].ptr); + ParseError = 1; + } + } break; +case 179: +# line 507 "gram.y" +{ list = do_colorlist_keyword(yypvt[-1].num,color, + yypvt[-0].ptr); + if (!list) { + twmrc_error_prefix(); + fprintf (stderr, + "unhandled color list keyword %d (string \"%s\")\n", + yypvt[-1].num, yypvt[-0].ptr); + ParseError = 1; + } + } break; +case 181: +# line 518 "gram.y" +{ if (!do_color_keyword (yypvt[-1].num, color, + yypvt[-0].ptr)) { + twmrc_error_prefix(); + fprintf (stderr, + "unhandled color keyword %d (string \"%s\")\n", + yypvt[-1].num, yypvt[-0].ptr); + ParseError = 1; + } + } break; +case 182: +# line 529 "gram.y" +{} break; +case 185: +# line 536 "gram.y" +{ do_string_savecolor(color, yypvt[-0].ptr); } break; +case 186: +# line 537 "gram.y" +{ do_var_savecolor(yypvt[-0].num); } break; +case 187: +# line 540 "gram.y" +{} break; +case 190: +# line 547 "gram.y" +{ if (Scr->FirstTime && + color == Scr->Monochrome) + AddToList(list, yypvt[-1].ptr, yypvt[-0].ptr); } break; +case 191: +# line 552 "gram.y" +{ + if (HasShape) Scr->SqueezeTitle = TRUE; + } break; +case 192: +# line 555 "gram.y" +{ list = &Scr->SqueezeTitleL; + if (HasShape && Scr->SqueezeTitle == -1) + Scr->SqueezeTitle = TRUE; + } break; +case 194: +# line 560 "gram.y" +{ Scr->SqueezeTitle = FALSE; } break; +case 195: +# line 561 "gram.y" +{ list = &Scr->DontSqueezeTitleL; } break; +case 198: +# line 566 "gram.y" +{ + if (Scr->FirstTime) { + do_squeeze_entry (list, yypvt[-3].ptr, yypvt[-2].num, yypvt[-1].num, yypvt[-0].num); + } + } break; +case 199: +# line 574 "gram.y" +{} break; +case 202: +# line 581 "gram.y" +{ if (Scr->FirstTime) + AddToList(list, yypvt[-2].ptr, (char *) + AllocateIconManager(yypvt[-2].ptr, NULLSTR, + yypvt[-1].ptr,yypvt[-0].num)); + } break; +case 203: +# line 587 "gram.y" +{ if (Scr->FirstTime) + AddToList(list, yypvt[-3].ptr, (char *) + AllocateIconManager(yypvt[-3].ptr,yypvt[-2].ptr, + yypvt[-1].ptr, yypvt[-0].num)); + } break; +case 204: +# line 594 "gram.y" +{} break; +case 207: +# line 601 "gram.y" +{ + AddWorkSpace (yypvt[-0].ptr, NULLSTR, NULLSTR, NULLSTR, NULLSTR, NULLSTR); + } break; +case 208: +# line 604 "gram.y" +{ + curWorkSpc = yypvt[-0].ptr; + } break; +case 210: +# line 610 "gram.y" +{} break; +case 213: +# line 617 "gram.y" +{ + AddWorkSpace (curWorkSpc, yypvt[-0].ptr, NULLSTR, NULLSTR, NULLSTR, NULLSTR); + } break; +case 214: +# line 620 "gram.y" +{ + AddWorkSpace (curWorkSpc, yypvt[-1].ptr, yypvt[-0].ptr, NULLSTR, NULLSTR, NULLSTR); + } break; +case 215: +# line 623 "gram.y" +{ + AddWorkSpace (curWorkSpc, yypvt[-2].ptr, yypvt[-1].ptr, yypvt[-0].ptr, NULLSTR, NULLSTR); + } break; +case 216: +# line 626 "gram.y" +{ + AddWorkSpace (curWorkSpc, yypvt[-3].ptr, yypvt[-2].ptr, yypvt[-1].ptr, yypvt[-0].ptr, NULLSTR); + } break; +case 217: +# line 629 "gram.y" +{ + AddWorkSpace (curWorkSpc, yypvt[-4].ptr, yypvt[-3].ptr, yypvt[-2].ptr, yypvt[-1].ptr, yypvt[-0].ptr); + } break; +case 218: +# line 634 "gram.y" +{ + WMapCreateCurrentBackGround (yypvt[-1].ptr, NULL, NULL, NULL); + } break; +case 219: +# line 637 "gram.y" +{ + WMapCreateCurrentBackGround (yypvt[-2].ptr, yypvt[-1].ptr, NULL, NULL); + } break; +case 220: +# line 640 "gram.y" +{ + WMapCreateCurrentBackGround (yypvt[-3].ptr, yypvt[-2].ptr, yypvt[-1].ptr, NULL); + } break; +case 221: +# line 643 "gram.y" +{ + WMapCreateCurrentBackGround (yypvt[-4].ptr, yypvt[-3].ptr, yypvt[-2].ptr, yypvt[-1].ptr); + } break; +case 222: +# line 648 "gram.y" +{ + WMapCreateDefaultBackGround (yypvt[-1].ptr, NULL, NULL, NULL); + } break; +case 223: +# line 651 "gram.y" +{ + WMapCreateDefaultBackGround (yypvt[-2].ptr, yypvt[-1].ptr, NULL, NULL); + } break; +case 224: +# line 654 "gram.y" +{ + WMapCreateDefaultBackGround (yypvt[-3].ptr, yypvt[-2].ptr, yypvt[-1].ptr, NULL); + } break; +case 225: +# line 657 "gram.y" +{ + WMapCreateDefaultBackGround (yypvt[-4].ptr, yypvt[-3].ptr, yypvt[-2].ptr, yypvt[-1].ptr); + } break; +case 226: +# line 662 "gram.y" +{} break; +case 229: +# line 669 "gram.y" +{ if (Scr->FirstTime) + AddToList(list, yypvt[-0].ptr, 0); + } break; +case 230: +# line 674 "gram.y" +{} break; +case 233: +# line 681 "gram.y" +{client = yypvt[-0].ptr;} break; +case 235: +# line 683 "gram.y" +{client = yypvt[-0].ptr;} break; +case 237: +# line 685 "gram.y" +{workspace = yypvt[-0].ptr;} break; +case 239: +# line 689 "gram.y" +{} break; +case 242: +# line 696 "gram.y" +{ + AddToClientsList (yypvt[-0].ptr, client); + } break; +case 243: +# line 700 "gram.y" +{} break; +case 246: +# line 707 "gram.y" +{ + AddToClientsList (workspace, yypvt[-0].ptr); + } break; +case 247: +# line 711 "gram.y" +{} break; +case 250: +# line 718 "gram.y" +{ if (Scr->FirstTime) AddToList(list, yypvt[-1].ptr, yypvt[-0].ptr); } break; +case 251: +# line 721 "gram.y" +{} break; +case 254: +# line 728 "gram.y" +{ AddToMenu(root, "", Action, NULLSTR, yypvt[-0].num, + NULLSTR, NULLSTR); + Action = ""; + } break; +case 255: +# line 734 "gram.y" +{lastmenuitem = (MenuItem*) 0;} break; +case 258: +# line 741 "gram.y" +{ + if (yypvt[-0].num == F_SEPARATOR) { + if (lastmenuitem) lastmenuitem->separated = 1; + } + else { + lastmenuitem = AddToMenu(root, yypvt[-1].ptr, Action, pull, yypvt[-0].num, NULLSTR, NULLSTR); + Action = ""; + pull = NULL; + } + } break; +case 259: +# line 751 "gram.y" +{ + if (yypvt[-0].num == F_SEPARATOR) { + if (lastmenuitem) lastmenuitem->separated = 1; + } + else { + lastmenuitem = AddToMenu(root, yypvt[-6].ptr, Action, pull, yypvt[-0].num, yypvt[-4].ptr, yypvt[-2].ptr); + Action = ""; + pull = NULL; + } + } break; +case 260: +# line 763 "gram.y" +{ yyval.num = yypvt[-0].num; } break; +case 261: +# line 764 "gram.y" +{ + yyval.num = yypvt[-1].num; + Action = yypvt[-0].ptr; + switch (yypvt[-1].num) { + case F_MENU: + pull = GetRoot (yypvt[-0].ptr, NULLSTR,NULLSTR); + pull->prev = root; + break; + case F_WARPRING: + if (!CheckWarpRingArg (Action)) { + twmrc_error_prefix(); + fprintf (stderr, + "ignoring invalid f.warptoring argument \"%s\"\n", + Action); + yyval.num = F_NOP; + } + case F_WARPTOSCREEN: + if (!CheckWarpScreenArg (Action)) { + twmrc_error_prefix(); + fprintf (stderr, + "ignoring invalid f.warptoscreen argument \"%s\"\n", + Action); + yyval.num = F_NOP; + } + break; + case F_COLORMAP: + if (CheckColormapArg (Action)) { + yyval.num = F_COLORMAP; + } else { + twmrc_error_prefix(); + fprintf (stderr, + "ignoring invalid f.colormap argument \"%s\"\n", + Action); + yyval.num = F_NOP; + } + break; + } /* end switch */ + } break; +case 262: +# line 805 "gram.y" +{ yyval.num = yypvt[-0].num; } break; +case 263: +# line 806 "gram.y" +{ yyval.num = yypvt[-0].num; } break; +case 264: +# line 807 "gram.y" +{ yyval.num = -(yypvt[-0].num); } break; +case 265: +# line 810 "gram.y" +{ yyval.num = yypvt[-0].num; + if (yypvt[-0].num == 0) + yyerror("bad button 0"); + + if (yypvt[-0].num > MAX_BUTTONS) + { + yyval.num = 0; + yyerror("button number too large"); + } + } break; +case 266: +# line 822 "gram.y" +{ ptr = (char *)malloc(strlen(yypvt[-0].ptr)+1); + strcpy(ptr, yypvt[-0].ptr); + RemoveDQuote(ptr); + yyval.ptr = ptr; + } break; +case 267: +# line 827 "gram.y" +{ yyval.num = yypvt[-0].num; } break; + } + goto yystack; /* reset registers in driver code */ +} + +# ifdef __RUNTIME_YYMAXDEPTH + +static int allocate_stacks() { + /* allocate the yys and yyv stacks */ + yys = (int *) malloc(yymaxdepth * sizeof(int)); + yyv = (YYSTYPE *) malloc(yymaxdepth * sizeof(YYSTYPE)); + + if (yys==0 || yyv==0) { + yyerror( (nl_msg(30004,"unable to allocate space for yacc stacks")) ); + return(1); + } + else return(0); + +} + + +static void free_stacks() { + if (yys!=0) free((char *) yys); + if (yyv!=0) free((char *) yyv); +} + +# endif /* defined(__RUNTIME_YYMAXDEPTH) */ + + +# line 43 "gram.y" +#include +#include +#include "twm.h" +#include "menus.h" +#include "icons.h" +#include "list.h" +#include "util.h" +#include "screen.h" +#include "parse.h" +#include +#include + +static char *Action = ""; +static char *Name = ""; +static char *defstring = "default"; +static MenuRoot *root, *pull = NULL; +static char *curWorkSpc; +static char *client, *workspace; +static MenuItem *lastmenuitem = (MenuItem*) 0; + +static MenuRoot *GetRoot(); + +static Bool CheckWarpScreenArg(), CheckWarpRingArg(); +static Bool CheckColormapArg(); +static void GotButton(), GotKey(), GotTitleButton(); +static char *ptr; +static name_list **list; +static int cont = 0; +static int color; +int mods = 0; +unsigned int mods_used = (ShiftMask | ControlMask | Mod1Mask); + +extern int do_single_keyword(), do_string_keyword(), do_number_keyword(); +extern name_list **do_colorlist_keyword(); +extern int do_color_keyword(), do_string_savecolor(); +extern int yylineno; + +# line 81 "gram.y" +typedef union +{ + int num; + char *ptr; +} YYSTYPE; +#ifdef __cplusplus +# include +# include +#endif /* __cplusplus */ +# define LB 257 +# define RB 258 +# define LP 259 +# define RP 260 +# define MENUS 261 +# define MENU 262 +# define BUTTON 263 +# define DEFAULT_FUNCTION 264 +# define PLUS 265 +# define MINUS 266 +# define ALL 267 +# define OR 268 +# define CURSORS 269 +# define PIXMAPS 270 +# define ICONS 271 +# define COLOR 272 +# define SAVECOLOR 273 +# define MONOCHROME 274 +# define FUNCTION 275 +# define ICONMGR_SHOW 276 +# define ICONMGR 277 +# define WINDOW_FUNCTION 278 +# define ZOOM 279 +# define ICONMGRS 280 +# define ICONMGR_GEOMETRY 281 +# define ICONMGR_NOSHOW 282 +# define MAKE_TITLE 283 +# define ICONIFY_BY_UNMAPPING 284 +# define DONT_ICONIFY_BY_UNMAPPING 285 +# define NO_BORDER 286 +# define NO_ICON_TITLE 287 +# define NO_TITLE 288 +# define AUTO_RAISE 289 +# define NO_HILITE 290 +# define ICON_REGION 291 +# define META 292 +# define SHIFT 293 +# define LOCK 294 +# define CONTROL 295 +# define WINDOW 296 +# define TITLE 297 +# define ICON 298 +# define ROOT 299 +# define FRAME 300 +# define COLON 301 +# define EQUALS 302 +# define SQUEEZE_TITLE 303 +# define DONT_SQUEEZE_TITLE 304 +# define START_ICONIFIED 305 +# define NO_TITLE_HILITE 306 +# define TITLE_HILITE 307 +# define MOVE 308 +# define RESIZE 309 +# define WAITC 310 +# define SELECT 311 +# define KILL 312 +# define LEFT_TITLEBUTTON 313 +# define RIGHT_TITLEBUTTON 314 +# define NUMBER 315 +# define KEYWORD 316 +# define NKEYWORD 317 +# define CKEYWORD 318 +# define CLKEYWORD 319 +# define FKEYWORD 320 +# define FSKEYWORD 321 +# define SKEYWORD 322 +# define DKEYWORD 323 +# define JKEYWORD 324 +# define WINDOW_RING 325 +# define WARP_CURSOR 326 +# define ERRORTOKEN 327 +# define NO_STACKMODE 328 +# define WORKSPACE 329 +# define WORKSPACES 330 +# define WORKSPCMGR_GEOMETRY 331 +# define OCCUPYALL 332 +# define OCCUPYLIST 333 +# define MAPWINDOWCURRENTWORKSPACE 334 +# define MAPWINDOWDEFAULTWORKSPACE 335 +# define OPAQUEMOVE 336 +# define NOOPAQUEMOVE 337 +# define OPAQUERESIZE 338 +# define NOOPAQUERESIZE 339 +# define CHANGE_WORKSPACE_FUNCTION 340 +# define DEICONIFY_FUNCTION 341 +# define ICONIFY_FUNCTION 342 +# define STRING 343 +#define yyclearin yychar = -1 +#define yyerrok yyerrflag = 0 +extern int yychar; +#ifndef YYMAXDEPTH +#define YYMAXDEPTH 150 +#endif + +/* __YYSCLASS defines the scoping/storage class for global objects + * that are NOT renamed by the -p option. By default these names + * are going to be 'static' so that multi-definition errors + * will not occur with multiple parsers. + * If you want (unsupported) access to internal names you need + * to define this to be null so it implies 'extern' scope. + * This should not be used in conjunction with -p. + */ +#ifndef __YYSCLASS +# define __YYSCLASS static +#endif +YYSTYPE yylval; +__YYSCLASS YYSTYPE yyval; +typedef int yytabelem; +# define YYERRCODE 256 + +# line 845 "gram.y" + +yyerror(s) char *s; +{ + twmrc_error_prefix(); + fprintf (stderr, "error in input file: %s\n", s ? s : ""); + ParseError = 1; +} +RemoveDQuote(str) +char *str; +{ + register char *i, *o; + register n; + register count; + + for (i=str+1, o=str; *i && *i != '\"'; o++) + { + if (*i == '\\') + { + switch (*++i) + { + case 'n': + *o = '\n'; + i++; + break; + case 'b': + *o = '\b'; + i++; + break; + case 'r': + *o = '\r'; + i++; + break; + case 't': + *o = '\t'; + i++; + break; + case 'f': + *o = '\f'; + i++; + break; + case '0': + if (*++i == 'x') + goto hex; + else + --i; + case '1': case '2': case '3': + case '4': case '5': case '6': case '7': + n = 0; + count = 0; + while (*i >= '0' && *i <= '7' && count < 3) + { + n = (n<<3) + (*i++ - '0'); + count++; + } + *o = n; + break; + hex: + case 'x': + n = 0; + count = 0; + while (i++, count++ < 2) + { + if (*i >= '0' && *i <= '9') + n = (n<<4) + (*i - '0'); + else if (*i >= 'a' && *i <= 'f') + n = (n<<4) + (*i - 'a') + 10; + else if (*i >= 'A' && *i <= 'F') + n = (n<<4) + (*i - 'A') + 10; + else + break; + } + *o = n; + break; + case '\n': + i++; /* punt */ + o--; /* to account for o++ at end of loop */ + break; + case '\"': + case '\'': + case '\\': + default: + *o = *i++; + break; + } + } + else + *o = *i++; + } + *o = '\0'; +} + +static MenuRoot *GetRoot(name, fore, back) +char *name; +char *fore, *back; +{ + MenuRoot *tmp; + + tmp = FindMenuRoot(name); + if (tmp == NULL) + tmp = NewMenuRoot(name); + + if (fore) + { + int save; + + save = Scr->FirstTime; + Scr->FirstTime = TRUE; + GetColor(COLOR, &tmp->highlight.fore, fore); + GetColor(COLOR, &tmp->highlight.back, back); + Scr->FirstTime = save; + } + + return tmp; +} + +static void GotButton (butt, func) +int butt, func; +{ + int i; + MenuRoot *menu; + MenuItem *item; + + for (i = 0; i < NUM_CONTEXTS; i++) { + if ((cont & (1 << i)) == 0) continue; + + if (func == F_MENU) { + pull->prev = NULL; + AddFuncButton (butt, i, mods, func, pull, (MenuItem*) 0); + } + else { + root = GetRoot (TWM_ROOT, NULLSTR, NULLSTR); + item = AddToMenu (root, "x", Action, NULLSTR, func, NULLSTR, NULLSTR); + AddFuncButton (butt, i, mods, func, (MenuRoot*) 0, item); + } + } + + Action = ""; + pull = NULL; + cont = 0; + mods_used |= mods; + mods = 0; +} + +static void GotKey(key, func) +char *key; +int func; +{ + int i; + + for (i = 0; i < NUM_CONTEXTS; i++) + { + if ((cont & (1 << i)) == 0) + continue; + + if (func == F_MENU) { + pull->prev = NULL; + if (!AddFuncKey (key, i, mods, func, pull, Name, Action)) break; + } + else + if (!AddFuncKey(key, i, mods, func, (MenuRoot*) 0, Name, Action)) + break; + } + + Action = ""; + pull = NULL; + cont = 0; + mods_used |= mods; + mods = 0; +} + + +static void GotTitleButton (bitmapname, func, rightside) + char *bitmapname; + int func; + Bool rightside; +{ + if (!CreateTitleButton (bitmapname, func, Action, pull, rightside, True)) { + twmrc_error_prefix(); + fprintf (stderr, + "unable to create %s titlebutton \"%s\"\n", + rightside ? "right" : "left", bitmapname); + } + Action = ""; + pull = NULL; +} + +static Bool CheckWarpScreenArg (s) + register char *s; +{ + XmuCopyISOLatin1Lowered (s, s); + + if (strcmp (s, WARPSCREEN_NEXT) == 0 || + strcmp (s, WARPSCREEN_PREV) == 0 || + strcmp (s, WARPSCREEN_BACK) == 0) + return True; + + for (; *s && isascii(*s) && isdigit(*s); s++) ; /* SUPPRESS 530 */ + return (*s ? False : True); +} + + +static Bool CheckWarpRingArg (s) + register char *s; +{ + XmuCopyISOLatin1Lowered (s, s); + + if (strcmp (s, WARPSCREEN_NEXT) == 0 || + strcmp (s, WARPSCREEN_PREV) == 0) + return True; + + return False; +} + + +static Bool CheckColormapArg (s) + register char *s; +{ + XmuCopyISOLatin1Lowered (s, s); + + if (strcmp (s, COLORMAP_NEXT) == 0 || + strcmp (s, COLORMAP_PREV) == 0 || + strcmp (s, COLORMAP_DEFAULT) == 0) + return True; + + return False; +} + + +twmrc_error_prefix () +{ + fprintf (stderr, "%s: line %d: ", ProgramName, yylineno); +} +__YYSCLASS yytabelem yyexca[] ={ +-1, 1, + 0, -1, + -2, 0, +-1, 2, + 0, 1, + -2, 0, +-1, 17, + 257, 24, + -2, 26, +-1, 18, + 257, 27, + -2, 29, +-1, 19, + 257, 30, + -2, 32, +-1, 20, + 257, 33, + -2, 35, +-1, 21, + 257, 36, + -2, 38, +-1, 30, + 257, 57, + -2, 59, +-1, 33, + 257, 64, + -2, 66, +-1, 34, + 257, 67, + -2, 69, +-1, 35, + 257, 70, + -2, 72, +-1, 37, + 257, 75, + -2, 77, +-1, 38, + 257, 78, + -2, 80, +-1, 41, + 257, 85, + -2, 87, +-1, 53, + 257, 107, + -2, 109, +-1, 54, + 257, 110, + -2, 112, +-1, 58, + 257, 200, + -2, 199, +-1, 59, + 257, 203, + -2, 202, +-1, 248, + 257, 216, + -2, 215, +-1, 273, + 257, 10, + -2, 9, +-1, 328, + 257, 187, + -2, 186, + }; +# define YYNPROD 276 +# define YYLAST 548 +__YYSCLASS yytabelem yyact[]={ + + 25, 81, 214, 312, 313, 341, 61, 330, 85, 349, + 62, 63, 64, 310, 68, 177, 122, 83, 84, 353, + 354, 139, 68, 78, 79, 80, 83, 84, 311, 387, + 383, 375, 305, 306, 307, 308, 309, 303, 391, 137, + 249, 372, 61, 104, 105, 87, 180, 380, 336, 61, + 110, 111, 112, 113, 114, 347, 257, 117, 289, 357, + 334, 356, 332, 60, 163, 215, 368, 363, 342, 68, + 83, 84, 67, 132, 4, 198, 322, 267, 252, 61, + 42, 60, 48, 321, 276, 141, 274, 16, 15, 44, + 45, 46, 47, 43, 32, 182, 49, 14, 31, 10, + 30, 39, 17, 26, 36, 37, 38, 41, 34, 9, + 324, 253, 24, 271, 61, 61, 61, 260, 254, 246, + 239, 58, 59, 40, 33, 61, 61, 178, 340, 179, + 118, 22, 23, 121, 55, 57, 123, 124, 270, 197, + 56, 200, 217, 54, 53, 61, 35, 61, 27, 11, + 28, 29, 12, 13, 18, 19, 20, 21, 50, 51, + 52, 61, 61, 225, 213, 168, 223, 199, 61, 61, + 175, 61, 83, 84, 169, 171, 167, 152, 149, 224, + 226, 263, 146, 227, 128, 126, 228, 229, 230, 231, + 232, 233, 234, 235, 236, 237, 238, 241, 61, 72, + 70, 258, 61, 61, 61, 61, 325, 259, 142, 261, + 218, 248, 251, 256, 384, 131, 201, 378, 376, 262, + 360, 269, 272, 362, 344, 275, 343, 277, 316, 278, + 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, + 250, 266, 265, 211, 240, 196, 314, 373, 61, 359, + 222, 61, 339, 317, 318, 301, 302, 319, 320, 323, + 315, 326, 247, 327, 210, 299, 328, 329, 255, 212, + 120, 221, 119, 388, 208, 172, 333, 244, 335, 381, + 300, 268, 220, 367, 294, 295, 296, 297, 298, 292, + 133, 134, 135, 136, 337, 273, 143, 208, 204, 205, + 206, 207, 350, 264, 144, 338, 147, 209, 150, 219, + 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, + 346, 204, 205, 206, 207, 348, 184, 130, 181, 129, + 202, 173, 174, 290, 242, 304, 176, 293, 358, 203, + 245, 243, 116, 115, 109, 170, 108, 183, 107, 361, + 366, 193, 189, 166, 106, 291, 216, 165, 164, 365, + 374, 377, 103, 102, 101, 100, 188, 99, 379, 98, + 97, 96, 95, 94, 151, 382, 93, 92, 148, 385, + 91, 386, 389, 390, 90, 145, 186, 187, 89, 185, + 392, 393, 345, 394, 395, 88, 140, 190, 191, 192, + 194, 195, 138, 352, 77, 76, 75, 74, 73, 71, + 69, 127, 66, 125, 65, 331, 8, 7, 6, 364, + 5, 3, 2, 1, 369, 86, 370, 371, 82, 351, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 355 }; +__YYSCLASS yytabelem yypact[]={ + + -3000, -3000, -182, -3000, -3000, -3000, -3000, -3000, -3000, -337, + -337, -337, -3000, -3000, -293, -57, -58, -3000, -3000, -3000, + -3000, -3000, -337, -337, -294, -257, -3000, -3000, -3000, -3000, + -3000, -3000, -3000, -3000, -3000, -3000, -3000, -3000, -3000, -3000, + -3000, -3000, -337, -337, -3000, -3000, -3000, -3000, -303, -303, + -303, -303, -303, -3000, -3000, -3000, -337, -293, -3000, -3000, + -293, -3000, -307, -293, -293, -72, -73, -3000, -3000, -3000, + -3000, -3000, -3000, -184, -184, -184, -184, -184, -263, -281, + -3000, -3000, -3000, -3000, -337, -3000, -3000, -3000, -184, -75, + -184, -79, -184, -80, -184, -184, -184, -184, -184, -184, + -184, -184, -184, -184, -195, -3000, -81, -83, -82, -83, + -3000, -3000, -3000, -3000, -3000, -184, -184, -3000, -3000, -87, + -184, -3000, -308, -3000, -3000, -3000, -337, -3000, -337, -212, + 89, -3000, -3000, -3000, -3000, -3000, -3000, -303, -90, -303, + -90, -3000, 29, 6, -3000, -3000, -3000, -3000, -3000, -3000, + -3000, -3000, -3000, -3000, -3000, -3000, -3000, -3000, -3000, -3000, + -3000, -3000, -3000, -337, -192, -115, -3000, -3000, -3000, -3000, + -3000, -3000, -3000, -3000, -3000, -3000, -3000, -293, -92, -95, + -3000, -3000, -337, -3000, -3000, -337, -337, -337, -337, -337, + -337, -337, -337, -337, -337, -337, -138, -3000, -3000, -3000, + -3000, -3000, -3000, -3000, -293, -3000, -3000, -3000, -3000, -3000, + -139, -218, -140, -245, -3000, -3000, -3000, -3000, -141, -77, + -181, -145, -293, -3000, -172, -3000, -174, -3000, -337, -337, + -337, -337, -337, -337, -337, -337, -337, -337, -337, -3000, + -3000, -3000, -200, -12, -3000, -264, -3000, -3000, -3000, -3000, + -3000, -3000, -337, -337, -3000, -3000, -337, -337, -175, -148, + -3000, -3000, -337, -3000, -3000, -337, -337, -3000, -3000, -3000, + -3000, -3000, -317, -3000, -3000, -196, -3000, -198, -3000, -3000, + -3000, -3000, -3000, -3000, -3000, -3000, -3000, -3000, -3000, -3000, + -3000, -253, -303, -3000, -3000, -3000, -3000, -3000, -3000, -3000, + -3000, -3000, -3000, -303, -3000, -3000, -3000, -3000, -3000, -3000, + -3000, -3000, -3000, -3000, -3000, -129, -189, -3000, -3000, -301, + -205, -3000, -3000, -250, -3000, -3000, -3000, -3000, -3000, -3000, + -246, -184, -3000, -197, -3000, -199, -303, -3000, -3000, -3000, + -3000, -3000, -3000, -189, -190, -3000, -293, -3000, -3000, -337, + -191, -293, -3000, -293, -293, -3000, -3000, -3000, -3000, -217, + -227, -3000, -3000, -3000, -3000, -192, -254, -3000, -3000, -3000, + -3000, -3000, -3000, -3000, -337, -3000, -3000, -3000, -228, -3000, + -337, -229, -337, -3000, -3000, -3000, -222, -3000, -3000, -337, + -337, -303, -3000, -337, -3000, -3000 }; +__YYSCLASS yytabelem yypgo[]={ + + 0, 0, 1, 112, 72, 429, 428, 425, 423, 422, + 421, 420, 418, 417, 416, 415, 215, 414, 413, 412, + 411, 410, 409, 408, 407, 406, 405, 404, 402, 75, + 396, 395, 388, 385, 384, 380, 378, 377, 376, 374, + 373, 372, 371, 370, 369, 367, 365, 364, 363, 362, + 359, 2, 358, 357, 356, 354, 353, 348, 165, 346, + 345, 344, 343, 342, 208, 341, 340, 339, 337, 335, + 334, 333, 329, 328, 327, 326, 309, 303, 302, 283, + 282, 281, 279, 273, 272, 271, 270, 269, 268, 264, + 262, 260, 252, 249, 247, 245, 244, 243, 240, 228, + 5, 226, 224, 223, 220, 218, 217, 214, 210, 209, + 207, 206, 201, 76 }; +__YYSCLASS yytabelem yyr1[]={ + + 0, 8, 9, 9, 10, 10, 10, 10, 10, 10, + 15, 10, 10, 10, 10, 10, 17, 10, 19, 10, + 10, 10, 10, 10, 23, 10, 10, 24, 10, 10, + 25, 10, 10, 26, 10, 10, 27, 10, 10, 10, + 10, 28, 10, 30, 10, 10, 10, 10, 10, 31, + 10, 32, 10, 34, 10, 35, 10, 37, 10, 10, + 38, 10, 40, 10, 41, 10, 10, 42, 10, 10, + 43, 10, 10, 44, 10, 45, 10, 10, 46, 10, + 10, 47, 10, 48, 10, 49, 10, 10, 50, 10, + 52, 10, 53, 10, 55, 10, 57, 10, 59, 10, + 61, 10, 10, 10, 10, 10, 10, 62, 10, 10, + 63, 10, 10, 11, 12, 12, 13, 6, 7, 64, + 64, 67, 67, 67, 67, 67, 67, 65, 65, 68, + 68, 68, 68, 68, 68, 68, 68, 68, 66, 66, + 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, + 29, 70, 70, 71, 21, 72, 72, 73, 22, 74, + 74, 75, 75, 75, 75, 75, 75, 75, 75, 75, + 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, + 75, 75, 75, 58, 76, 76, 77, 78, 77, 77, + 60, 80, 80, 81, 81, 79, 82, 82, 83, 14, + 84, 14, 14, 86, 14, 85, 85, 39, 87, 87, + 88, 88, 33, 89, 89, 90, 91, 90, 92, 93, + 93, 94, 94, 94, 94, 94, 18, 18, 18, 18, + 20, 20, 20, 20, 16, 95, 95, 96, 36, 97, + 97, 99, 98, 101, 98, 102, 98, 100, 104, 104, + 105, 103, 106, 106, 107, 56, 108, 108, 109, 54, + 110, 110, 111, 51, 112, 112, 113, 113, 2, 2, + 5, 5, 5, 3, 1, 4 }; +__YYSCLASS yytabelem yyr2[]={ + + 0, 2, 0, 4, 2, 2, 2, 2, 2, 13, + 1, 16, 7, 5, 7, 5, 1, 6, 1, 6, + 5, 3, 5, 5, 1, 6, 3, 1, 6, 3, + 1, 6, 3, 1, 6, 3, 1, 6, 3, 9, + 9, 1, 8, 1, 8, 5, 5, 5, 5, 1, + 6, 1, 6, 1, 6, 1, 6, 1, 6, 3, + 1, 6, 1, 6, 1, 6, 3, 1, 6, 3, + 1, 6, 3, 1, 6, 1, 6, 3, 1, 6, + 3, 1, 6, 1, 6, 1, 6, 3, 1, 19, + 1, 9, 1, 8, 1, 6, 1, 6, 1, 6, + 1, 6, 5, 5, 5, 5, 5, 1, 6, 3, + 1, 6, 3, 3, 5, 3, 5, 13, 13, 0, + 4, 3, 3, 3, 3, 5, 3, 0, 4, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 0, 4, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 6, 0, 4, 7, 7, 0, 4, 5, 7, 0, + 4, 7, 5, 7, 5, 7, 5, 7, 5, 7, + 5, 7, 5, 7, 5, 7, 5, 7, 5, 7, + 5, 7, 5, 7, 0, 4, 5, 1, 8, 5, + 7, 0, 4, 3, 3, 7, 0, 4, 5, 3, + 1, 10, 3, 1, 6, 0, 11, 7, 0, 4, + 7, 9, 7, 0, 4, 3, 1, 6, 7, 0, + 4, 3, 5, 7, 9, 11, 7, 9, 11, 13, + 7, 9, 11, 13, 7, 0, 4, 3, 7, 0, + 4, 1, 6, 1, 8, 1, 8, 7, 0, 4, + 3, 7, 0, 4, 3, 7, 0, 4, 5, 7, + 0, 4, 3, 7, 0, 4, 5, 15, 3, 5, + 3, 5, 5, 5, 3, 3 }; +__YYSCLASS yytabelem yychk[]={ + + -3000, -8, -9, -10, 256, -11, -12, -13, -14, 291, + 281, 331, 334, 335, 279, 270, 269, 284, 336, 337, + 338, 339, 313, 314, -3, -1, 285, 330, 332, 333, + 282, 280, 276, 306, 290, 328, 286, 287, 288, 283, + 305, 289, 262, 275, 271, 272, 273, 274, 264, 278, + 340, 341, 342, 326, 325, 316, 322, 317, 303, 304, + 263, 343, -1, -1, -1, -17, -19, -4, 315, -21, + 257, -22, 257, -23, -24, -25, -26, -27, -1, -1, + -1, -2, -6, 320, 321, 302, -7, 302, -31, -32, + -34, -35, -37, -38, -40, -41, -42, -43, -44, -45, + -46, -47, -48, -49, -1, -1, -55, -57, -59, -61, + -2, -2, -2, -2, -2, -62, -63, -1, -4, -84, + -86, -4, 323, -4, -4, -18, 257, -20, 257, -72, + -74, -16, 257, -16, -16, -16, -16, 302, -28, 302, + -30, -1, -64, -64, -16, -33, 257, -16, -36, 257, + -16, -39, 257, -16, -16, -16, -16, -16, -16, -16, + -16, -16, -16, 259, -52, -53, -56, 257, -58, 257, + -60, 257, -58, -16, -16, 257, -16, 323, -1, -1, + 258, -73, 307, 258, -75, 300, 297, 298, 277, 263, + 308, 309, 310, 262, 311, 312, -95, -2, -29, 257, + -2, -29, 301, -67, 292, 293, 294, 295, 268, 301, + -89, -97, -87, -1, -51, 257, -54, 257, -108, -76, + -80, -85, -4, 258, -1, 258, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 258, + -96, -1, -70, -65, -4, -66, 258, -90, -1, 258, + -98, -1, 296, 329, 258, -88, -1, 301, -112, -110, + 258, -109, -1, 258, -77, 319, 318, 258, -81, -1, + 319, 258, -1, -4, 258, -1, 258, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 258, + -71, -3, 301, -68, 296, 297, 298, 299, 300, 277, + 292, 267, 268, 301, -69, 296, 297, 298, 299, 300, + 277, 292, 267, 268, -1, -91, -99, -1, -1, -1, + -1, 258, -113, -1, 258, -111, -2, -1, -1, -1, + 324, -15, 258, -1, 258, -1, 301, -2, -2, -92, + 257, -100, 257, -101, -102, -4, -1, 260, -2, 259, + -78, -5, -4, 265, 266, -16, 258, 258, -2, -93, + -104, -100, -103, 257, -4, -50, -1, -79, 257, -4, + -4, -4, 258, -94, -1, 258, -105, -1, -106, -51, + 301, -82, -1, 258, -107, -1, -1, 258, -83, -1, + -1, 260, -1, -1, -2, -1 }; +__YYSCLASS yytabelem yydef[]={ + + 2, -2, -2, 3, 4, 5, 6, 7, 8, 0, + 0, 0, 16, 18, 21, 0, 0, -2, -2, -2, + -2, -2, 0, 0, 0, 0, 49, 51, 53, 55, + -2, 60, 62, -2, -2, -2, 73, -2, -2, 81, + 83, -2, 0, 0, 94, 96, 98, 100, 0, 0, + 0, 0, 0, -2, -2, 113, 115, 0, -2, -2, + 0, 274, 0, 13, 15, 0, 0, 20, 275, 22, + 155, 23, 159, 0, 0, 0, 0, 0, 41, 43, + 45, 46, 48, 268, 0, 119, 47, 119, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 90, 92, 0, 0, 0, 0, + 102, 103, 104, 105, 106, 0, 0, 114, 116, 0, + 0, 273, 0, 12, 14, 17, 0, 19, 0, 0, + 0, 25, 235, 28, 31, 34, 37, 0, 0, 0, + 0, 269, 0, 0, 50, 52, 213, 54, 56, 239, + 58, 61, 208, 63, 65, 68, 71, 74, 76, 79, + 82, 84, 86, 0, 0, 0, 95, 256, 97, 184, + 99, 191, 101, 108, 111, 205, 204, 0, 0, 0, + 154, 156, 0, 158, 160, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 39, 42, 151, + 40, 44, 127, 120, 121, 122, 123, 124, 126, 138, + 0, 0, 0, 0, 91, 264, 93, 260, 0, 0, + 0, 0, 0, 226, 0, 230, 0, 157, 162, 164, + 166, 168, 170, 172, 174, 176, 178, 180, 182, 234, + 236, 237, 0, 0, 125, 0, 212, 214, -2, 238, + 240, 241, 0, 0, 207, 209, 0, 0, 0, 0, + 255, 257, 0, 183, 185, 0, 0, 190, 192, 193, + 194, 201, 0, -2, 227, 0, 231, 0, 161, 163, + 165, 167, 169, 171, 173, 175, 177, 179, 181, 150, + 152, 0, 0, 128, 129, 130, 131, 132, 133, 134, + 135, 136, 137, 0, 139, 140, 141, 142, 143, 144, + 145, 146, 147, 148, 149, 0, 0, 243, 245, 0, + 0, 263, 265, 0, 259, 261, 262, 258, -2, 189, + 0, 0, 228, 0, 232, 0, 0, 117, 118, 217, + 219, 242, 248, 0, 0, 210, 0, 88, 266, 0, + 0, 0, 270, 0, 0, 11, 229, 233, 153, 0, + 0, 244, 246, 252, 211, 0, 0, 188, 196, 206, + 271, 272, 218, 220, 221, 247, 249, 250, 0, 89, + 0, 0, 222, 251, 253, 254, 0, 195, 197, 0, + 223, 0, 198, 224, 267, 225 }; +typedef struct { char *t_name; int t_val; } yytoktype; +#ifndef YYDEBUG +# define YYDEBUG 0 /* don't allow debugging */ +#endif + +#if YYDEBUG + +__YYSCLASS yytoktype yytoks[] = +{ + "LB", 257, + "RB", 258, + "LP", 259, + "RP", 260, + "MENUS", 261, + "MENU", 262, + "BUTTON", 263, + "DEFAULT_FUNCTION", 264, + "PLUS", 265, + "MINUS", 266, + "ALL", 267, + "OR", 268, + "CURSORS", 269, + "PIXMAPS", 270, + "ICONS", 271, + "COLOR", 272, + "SAVECOLOR", 273, + "MONOCHROME", 274, + "FUNCTION", 275, + "ICONMGR_SHOW", 276, + "ICONMGR", 277, + "WINDOW_FUNCTION", 278, + "ZOOM", 279, + "ICONMGRS", 280, + "ICONMGR_GEOMETRY", 281, + "ICONMGR_NOSHOW", 282, + "MAKE_TITLE", 283, + "ICONIFY_BY_UNMAPPING", 284, + "DONT_ICONIFY_BY_UNMAPPING", 285, + "NO_BORDER", 286, + "NO_ICON_TITLE", 287, + "NO_TITLE", 288, + "AUTO_RAISE", 289, + "NO_HILITE", 290, + "ICON_REGION", 291, + "META", 292, + "SHIFT", 293, + "LOCK", 294, + "CONTROL", 295, + "WINDOW", 296, + "TITLE", 297, + "ICON", 298, + "ROOT", 299, + "FRAME", 300, + "COLON", 301, + "EQUALS", 302, + "SQUEEZE_TITLE", 303, + "DONT_SQUEEZE_TITLE", 304, + "START_ICONIFIED", 305, + "NO_TITLE_HILITE", 306, + "TITLE_HILITE", 307, + "MOVE", 308, + "RESIZE", 309, + "WAITC", 310, + "SELECT", 311, + "KILL", 312, + "LEFT_TITLEBUTTON", 313, + "RIGHT_TITLEBUTTON", 314, + "NUMBER", 315, + "KEYWORD", 316, + "NKEYWORD", 317, + "CKEYWORD", 318, + "CLKEYWORD", 319, + "FKEYWORD", 320, + "FSKEYWORD", 321, + "SKEYWORD", 322, + "DKEYWORD", 323, + "JKEYWORD", 324, + "WINDOW_RING", 325, + "WARP_CURSOR", 326, + "ERRORTOKEN", 327, + "NO_STACKMODE", 328, + "WORKSPACE", 329, + "WORKSPACES", 330, + "WORKSPCMGR_GEOMETRY", 331, + "OCCUPYALL", 332, + "OCCUPYLIST", 333, + "MAPWINDOWCURRENTWORKSPACE", 334, + "MAPWINDOWDEFAULTWORKSPACE", 335, + "OPAQUEMOVE", 336, + "NOOPAQUEMOVE", 337, + "OPAQUERESIZE", 338, + "NOOPAQUERESIZE", 339, + "CHANGE_WORKSPACE_FUNCTION", 340, + "DEICONIFY_FUNCTION", 341, + "ICONIFY_FUNCTION", 342, + "STRING", 343, + "-unknown-", -1 /* ends search */ +}; + +__YYSCLASS char * yyreds[] = +{ + "-no such reduction-", + "twmrc : stmts", + "stmts : /* empty */", + "stmts : stmts stmt", + "stmt : error", + "stmt : noarg", + "stmt : sarg", + "stmt : narg", + "stmt : squeeze", + "stmt : ICON_REGION string DKEYWORD DKEYWORD number number", + "stmt : ICON_REGION string DKEYWORD DKEYWORD number number", + "stmt : ICON_REGION string DKEYWORD DKEYWORD number number win_list", + "stmt : ICONMGR_GEOMETRY string number", + "stmt : ICONMGR_GEOMETRY string", + "stmt : WORKSPCMGR_GEOMETRY string number", + "stmt : WORKSPCMGR_GEOMETRY string", + "stmt : MAPWINDOWCURRENTWORKSPACE", + "stmt : MAPWINDOWCURRENTWORKSPACE curwork", + "stmt : MAPWINDOWDEFAULTWORKSPACE", + "stmt : MAPWINDOWDEFAULTWORKSPACE defwork", + "stmt : ZOOM number", + "stmt : ZOOM", + "stmt : PIXMAPS pixmap_list", + "stmt : CURSORS cursor_list", + "stmt : ICONIFY_BY_UNMAPPING", + "stmt : ICONIFY_BY_UNMAPPING win_list", + "stmt : ICONIFY_BY_UNMAPPING", + "stmt : OPAQUEMOVE", + "stmt : OPAQUEMOVE win_list", + "stmt : OPAQUEMOVE", + "stmt : NOOPAQUEMOVE", + "stmt : NOOPAQUEMOVE win_list", + "stmt : NOOPAQUEMOVE", + "stmt : OPAQUERESIZE", + "stmt : OPAQUERESIZE win_list", + "stmt : OPAQUERESIZE", + "stmt : NOOPAQUERESIZE", + "stmt : NOOPAQUERESIZE win_list", + "stmt : NOOPAQUERESIZE", + "stmt : LEFT_TITLEBUTTON string EQUALS action", + "stmt : RIGHT_TITLEBUTTON string EQUALS action", + "stmt : LEFT_TITLEBUTTON string", + "stmt : LEFT_TITLEBUTTON string binding_list", + "stmt : RIGHT_TITLEBUTTON string", + "stmt : RIGHT_TITLEBUTTON string binding_list", + "stmt : button string", + "stmt : button action", + "stmt : string fullkey", + "stmt : button full", + "stmt : DONT_ICONIFY_BY_UNMAPPING", + "stmt : DONT_ICONIFY_BY_UNMAPPING win_list", + "stmt : WORKSPACES", + "stmt : WORKSPACES workspc_list", + "stmt : OCCUPYALL", + "stmt : OCCUPYALL win_list", + "stmt : OCCUPYLIST", + "stmt : OCCUPYLIST occupy_list", + "stmt : ICONMGR_NOSHOW", + "stmt : ICONMGR_NOSHOW win_list", + "stmt : ICONMGR_NOSHOW", + "stmt : ICONMGRS", + "stmt : ICONMGRS iconm_list", + "stmt : ICONMGR_SHOW", + "stmt : ICONMGR_SHOW win_list", + "stmt : NO_TITLE_HILITE", + "stmt : NO_TITLE_HILITE win_list", + "stmt : NO_TITLE_HILITE", + "stmt : NO_HILITE", + "stmt : NO_HILITE win_list", + "stmt : NO_HILITE", + "stmt : NO_STACKMODE", + "stmt : NO_STACKMODE win_list", + "stmt : NO_STACKMODE", + "stmt : NO_BORDER", + "stmt : NO_BORDER win_list", + "stmt : NO_ICON_TITLE", + "stmt : NO_ICON_TITLE win_list", + "stmt : NO_ICON_TITLE", + "stmt : NO_TITLE", + "stmt : NO_TITLE win_list", + "stmt : NO_TITLE", + "stmt : MAKE_TITLE", + "stmt : MAKE_TITLE win_list", + "stmt : START_ICONIFIED", + "stmt : START_ICONIFIED win_list", + "stmt : AUTO_RAISE", + "stmt : AUTO_RAISE win_list", + "stmt : AUTO_RAISE", + "stmt : MENU string LP string COLON string RP", + "stmt : MENU string LP string COLON string RP menu", + "stmt : MENU string", + "stmt : MENU string menu", + "stmt : FUNCTION string", + "stmt : FUNCTION string function", + "stmt : ICONS", + "stmt : ICONS icon_list", + "stmt : COLOR", + "stmt : COLOR color_list", + "stmt : SAVECOLOR", + "stmt : SAVECOLOR save_color_list", + "stmt : MONOCHROME", + "stmt : MONOCHROME color_list", + "stmt : DEFAULT_FUNCTION action", + "stmt : WINDOW_FUNCTION action", + "stmt : CHANGE_WORKSPACE_FUNCTION action", + "stmt : DEICONIFY_FUNCTION action", + "stmt : ICONIFY_FUNCTION action", + "stmt : WARP_CURSOR", + "stmt : WARP_CURSOR win_list", + "stmt : WARP_CURSOR", + "stmt : WINDOW_RING", + "stmt : WINDOW_RING win_list", + "stmt : WINDOW_RING", + "noarg : KEYWORD", + "sarg : SKEYWORD string", + "sarg : SKEYWORD", + "narg : NKEYWORD number", + "full : EQUALS keys COLON contexts COLON action", + "fullkey : EQUALS keys COLON contextkeys COLON action", + "keys : /* empty */", + "keys : keys key", + "key : META", + "key : SHIFT", + "key : LOCK", + "key : CONTROL", + "key : META number", + "key : OR", + "contexts : /* empty */", + "contexts : contexts context", + "context : WINDOW", + "context : TITLE", + "context : ICON", + "context : ROOT", + "context : FRAME", + "context : ICONMGR", + "context : META", + "context : ALL", + "context : OR", + "contextkeys : /* empty */", + "contextkeys : contextkeys contextkey", + "contextkey : WINDOW", + "contextkey : TITLE", + "contextkey : ICON", + "contextkey : ROOT", + "contextkey : FRAME", + "contextkey : ICONMGR", + "contextkey : META", + "contextkey : ALL", + "contextkey : OR", + "contextkey : string", + "binding_list : LB binding_entries RB", + "binding_entries : /* empty */", + "binding_entries : binding_entries binding_entry", + "binding_entry : button COLON action", + "pixmap_list : LB pixmap_entries RB", + "pixmap_entries : /* empty */", + "pixmap_entries : pixmap_entries pixmap_entry", + "pixmap_entry : TITLE_HILITE string", + "cursor_list : LB cursor_entries RB", + "cursor_entries : /* empty */", + "cursor_entries : cursor_entries cursor_entry", + "cursor_entry : FRAME string string", + "cursor_entry : FRAME string", + "cursor_entry : TITLE string string", + "cursor_entry : TITLE string", + "cursor_entry : ICON string string", + "cursor_entry : ICON string", + "cursor_entry : ICONMGR string string", + "cursor_entry : ICONMGR string", + "cursor_entry : BUTTON string string", + "cursor_entry : BUTTON string", + "cursor_entry : MOVE string string", + "cursor_entry : MOVE string", + "cursor_entry : RESIZE string string", + "cursor_entry : RESIZE string", + "cursor_entry : WAITC string string", + "cursor_entry : WAITC string", + "cursor_entry : MENU string string", + "cursor_entry : MENU string", + "cursor_entry : SELECT string string", + "cursor_entry : SELECT string", + "cursor_entry : KILL string string", + "cursor_entry : KILL string", + "color_list : LB color_entries RB", + "color_entries : /* empty */", + "color_entries : color_entries color_entry", + "color_entry : CLKEYWORD string", + "color_entry : CLKEYWORD string", + "color_entry : CLKEYWORD string win_color_list", + "color_entry : CKEYWORD string", + "save_color_list : LB s_color_entries RB", + "s_color_entries : /* empty */", + "s_color_entries : s_color_entries s_color_entry", + "s_color_entry : string", + "s_color_entry : CLKEYWORD", + "win_color_list : LB win_color_entries RB", + "win_color_entries : /* empty */", + "win_color_entries : win_color_entries win_color_entry", + "win_color_entry : string string", + "squeeze : SQUEEZE_TITLE", + "squeeze : SQUEEZE_TITLE", + "squeeze : SQUEEZE_TITLE LB win_sqz_entries RB", + "squeeze : DONT_SQUEEZE_TITLE", + "squeeze : DONT_SQUEEZE_TITLE", + "squeeze : DONT_SQUEEZE_TITLE win_list", + "win_sqz_entries : /* empty */", + "win_sqz_entries : win_sqz_entries string JKEYWORD signed_number number", + "iconm_list : LB iconm_entries RB", + "iconm_entries : /* empty */", + "iconm_entries : iconm_entries iconm_entry", + "iconm_entry : string string number", + "iconm_entry : string string string number", + "workspc_list : LB workspc_entries RB", + "workspc_entries : /* empty */", + "workspc_entries : workspc_entries workspc_entry", + "workspc_entry : string", + "workspc_entry : string", + "workspc_entry : string workapp_list", + "workapp_list : LB workapp_entries RB", + "workapp_entries : /* empty */", + "workapp_entries : workapp_entries workapp_entry", + "workapp_entry : string", + "workapp_entry : string string", + "workapp_entry : string string string", + "workapp_entry : string string string string", + "workapp_entry : string string string string string", + "curwork : LB string RB", + "curwork : LB string string RB", + "curwork : LB string string string RB", + "curwork : LB string string string string RB", + "defwork : LB string RB", + "defwork : LB string string RB", + "defwork : LB string string string RB", + "defwork : LB string string string string RB", + "win_list : LB win_entries RB", + "win_entries : /* empty */", + "win_entries : win_entries win_entry", + "win_entry : string", + "occupy_list : LB occupy_entries RB", + "occupy_entries : /* empty */", + "occupy_entries : occupy_entries occupy_entry", + "occupy_entry : string", + "occupy_entry : string occupy_workspc_list", + "occupy_entry : WINDOW string", + "occupy_entry : WINDOW string occupy_workspc_list", + "occupy_entry : WORKSPACE string", + "occupy_entry : WORKSPACE string occupy_window_list", + "occupy_workspc_list : LB occupy_workspc_entries RB", + "occupy_workspc_entries : /* empty */", + "occupy_workspc_entries : occupy_workspc_entries occupy_workspc_entry", + "occupy_workspc_entry : string", + "occupy_window_list : LB occupy_window_entries RB", + "occupy_window_entries : /* empty */", + "occupy_window_entries : occupy_window_entries occupy_window_entry", + "occupy_window_entry : string", + "icon_list : LB icon_entries RB", + "icon_entries : /* empty */", + "icon_entries : icon_entries icon_entry", + "icon_entry : string string", + "function : LB function_entries RB", + "function_entries : /* empty */", + "function_entries : function_entries function_entry", + "function_entry : action", + "menu : LB menu_entries RB", + "menu_entries : /* empty */", + "menu_entries : menu_entries menu_entry", + "menu_entry : string action", + "menu_entry : string LP string COLON string RP action", + "action : FKEYWORD", + "action : FSKEYWORD string", + "signed_number : number", + "signed_number : PLUS number", + "signed_number : MINUS number", + "button : BUTTON number", + "string : STRING", + "number : NUMBER", +}; +#endif /* YYDEBUG */ +#define YYFLAG (-3000) +/* @(#) $Revision: 1.2 $ */ + +/* +** Skeleton parser driver for yacc output +*/ + +#if defined(NLS) && !defined(NL_SETN) +#include +#endif + +#ifndef nl_msg +#define nl_msg(i,s) (s) +#endif + +/* +** yacc user known macros and defines +*/ +#define YYERROR goto yyerrlab + +#ifndef __RUNTIME_YYMAXDEPTH +#define YYACCEPT return(0) +#define YYABORT return(1) +#else +#define YYACCEPT {free_stacks(); return(0);} +#define YYABORT {free_stacks(); return(1);} +#endif + +#define YYBACKUP( newtoken, newvalue )\ +{\ + if ( yychar >= 0 || ( yyr2[ yytmp ] >> 1 ) != 1 )\ + {\ + yyerror( (nl_msg(30001,"syntax error - cannot backup")) );\ + goto yyerrlab;\ + }\ + yychar = newtoken;\ + yystate = *yyps;\ + yylval = newvalue;\ + goto yynewstate;\ +} +#define YYRECOVERING() (!!yyerrflag) +#ifndef YYDEBUG +# define YYDEBUG 1 /* make debugging available */ +#endif + +/* +** user known globals +*/ +int yydebug; /* set to 1 to get debugging */ + +/* +** driver internal defines +*/ +/* define for YYFLAG now generated by yacc program. */ +/*#define YYFLAG (FLAGVAL)*/ + +/* +** global variables used by the parser +*/ +# ifndef __RUNTIME_YYMAXDEPTH +__YYSCLASS YYSTYPE yyv[ YYMAXDEPTH ]; /* value stack */ +__YYSCLASS int yys[ YYMAXDEPTH ]; /* state stack */ +# else +__YYSCLASS YYSTYPE *yyv; /* pointer to malloc'ed value stack */ +__YYSCLASS int *yys; /* pointer to malloc'ed stack stack */ + +#if defined(__STDC__) || defined (__cplusplus) +#include +#else + extern char *malloc(); + extern char *realloc(); + extern void free(); +#endif /* __STDC__ or __cplusplus */ + + +static int allocate_stacks(); +static void free_stacks(); +# ifndef YYINCREMENT +# define YYINCREMENT (YYMAXDEPTH/2) + 10 +# endif +# endif /* __RUNTIME_YYMAXDEPTH */ +long yymaxdepth = YYMAXDEPTH; + +__YYSCLASS YYSTYPE *yypv; /* top of value stack */ +__YYSCLASS int *yyps; /* top of state stack */ + +__YYSCLASS int yystate; /* current state */ +__YYSCLASS int yytmp; /* extra var (lasts between blocks) */ + +int yynerrs; /* number of errors */ +__YYSCLASS int yyerrflag; /* error recovery flag */ +int yychar; /* current input token number */ + + + +/* +** yyparse - return 0 if worked, 1 if syntax error not recovered from +*/ +int +yyparse() +{ + register YYSTYPE *yypvt; /* top of value stack for $vars */ + + /* + ** Initialize externals - yyparse may be called more than once + */ +# ifdef __RUNTIME_YYMAXDEPTH + if (allocate_stacks()) YYABORT; +# endif + yypv = &yyv[-1]; + yyps = &yys[-1]; + yystate = 0; + yytmp = 0; + yynerrs = 0; + yyerrflag = 0; + yychar = -1; + + goto yystack; + { + register YYSTYPE *yy_pv; /* top of value stack */ + register int *yy_ps; /* top of state stack */ + register int yy_state; /* current state */ + register int yy_n; /* internal state number info */ + + /* + ** get globals into registers. + ** branch to here only if YYBACKUP was called. + */ + yynewstate: + yy_pv = yypv; + yy_ps = yyps; + yy_state = yystate; + goto yy_newstate; + + /* + ** get globals into registers. + ** either we just started, or we just finished a reduction + */ + yystack: + yy_pv = yypv; + yy_ps = yyps; + yy_state = yystate; + + /* + ** top of for (;;) loop while no reductions done + */ + yy_stack: + /* + ** put a state and value onto the stacks + */ +#if YYDEBUG + /* + ** if debugging, look up token value in list of value vs. + ** name pairs. 0 and negative (-1) are special values. + ** Note: linear search is used since time is not a real + ** consideration while debugging. + */ + if ( yydebug ) + { + register int yy_i; + + printf( "State %d, token ", yy_state ); + if ( yychar == 0 ) + printf( "end-of-file\n" ); + else if ( yychar < 0 ) + printf( "-none-\n" ); + else + { + for ( yy_i = 0; yytoks[yy_i].t_val >= 0; + yy_i++ ) + { + if ( yytoks[yy_i].t_val == yychar ) + break; + } + printf( "%s\n", yytoks[yy_i].t_name ); + } + } +#endif /* YYDEBUG */ + if ( ++yy_ps >= &yys[ yymaxdepth ] ) /* room on stack? */ + { +# ifndef __RUNTIME_YYMAXDEPTH + yyerror( (nl_msg(30002,"yacc stack overflow")) ); + YYABORT; +# else + /* save old stack bases to recalculate pointers */ + YYSTYPE * yyv_old = yyv; + int * yys_old = yys; + yymaxdepth += YYINCREMENT; + yys = (int *) realloc(yys, yymaxdepth * sizeof(int)); + yyv = (YYSTYPE *) realloc(yyv, yymaxdepth * sizeof(YYSTYPE)); + if (yys==0 || yyv==0) { + yyerror( (nl_msg(30002,"yacc stack overflow")) ); + YYABORT; + } + /* Reset pointers into stack */ + yy_ps = (yy_ps - yys_old) + yys; + yyps = (yyps - yys_old) + yys; + yy_pv = (yy_pv - yyv_old) + yyv; + yypv = (yypv - yyv_old) + yyv; +# endif + + } + *yy_ps = yy_state; + *++yy_pv = yyval; + + /* + ** we have a new state - find out what to do + */ + yy_newstate: + if ( ( yy_n = yypact[ yy_state ] ) <= YYFLAG ) + goto yydefault; /* simple state */ +#if YYDEBUG + /* + ** if debugging, need to mark whether new token grabbed + */ + yytmp = yychar < 0; +#endif + if ( ( yychar < 0 ) && ( ( yychar = yylex() ) < 0 ) ) + yychar = 0; /* reached EOF */ +#if YYDEBUG + if ( yydebug && yytmp ) + { + register int yy_i; + + printf( "Received token " ); + if ( yychar == 0 ) + printf( "end-of-file\n" ); + else if ( yychar < 0 ) + printf( "-none-\n" ); + else + { + for ( yy_i = 0; yytoks[yy_i].t_val >= 0; + yy_i++ ) + { + if ( yytoks[yy_i].t_val == yychar ) + break; + } + printf( "%s\n", yytoks[yy_i].t_name ); + } + } +#endif /* YYDEBUG */ + if ( ( ( yy_n += yychar ) < 0 ) || ( yy_n >= YYLAST ) ) + goto yydefault; + if ( yychk[ yy_n = yyact[ yy_n ] ] == yychar ) /*valid shift*/ + { + yychar = -1; + yyval = yylval; + yy_state = yy_n; + if ( yyerrflag > 0 ) + yyerrflag--; + goto yy_stack; + } + + yydefault: + if ( ( yy_n = yydef[ yy_state ] ) == -2 ) + { +#if YYDEBUG + yytmp = yychar < 0; +#endif + if ( ( yychar < 0 ) && ( ( yychar = yylex() ) < 0 ) ) + yychar = 0; /* reached EOF */ +#if YYDEBUG + if ( yydebug && yytmp ) + { + register int yy_i; + + printf( "Received token " ); + if ( yychar == 0 ) + printf( "end-of-file\n" ); + else if ( yychar < 0 ) + printf( "-none-\n" ); + else + { + for ( yy_i = 0; + yytoks[yy_i].t_val >= 0; + yy_i++ ) + { + if ( yytoks[yy_i].t_val + == yychar ) + { + break; + } + } + printf( "%s\n", yytoks[yy_i].t_name ); + } + } +#endif /* YYDEBUG */ + /* + ** look through exception table + */ + { + register int *yyxi = yyexca; + + while ( ( *yyxi != -1 ) || + ( yyxi[1] != yy_state ) ) + { + yyxi += 2; + } + while ( ( *(yyxi += 2) >= 0 ) && + ( *yyxi != yychar ) ) + ; + if ( ( yy_n = yyxi[1] ) < 0 ) + YYACCEPT; + } + } + + /* + ** check for syntax error + */ + if ( yy_n == 0 ) /* have an error */ + { + /* no worry about speed here! */ + switch ( yyerrflag ) + { + case 0: /* new error */ + yyerror( (nl_msg(30003,"syntax error")) ); + yynerrs++; + goto skip_init; + yyerrlab: + /* + ** get globals into registers. + ** we have a user generated syntax type error + */ + yy_pv = yypv; + yy_ps = yyps; + yy_state = yystate; + yynerrs++; + skip_init: + case 1: + case 2: /* incompletely recovered error */ + /* try again... */ + yyerrflag = 3; + /* + ** find state where "error" is a legal + ** shift action + */ + while ( yy_ps >= yys ) + { + yy_n = yypact[ *yy_ps ] + YYERRCODE; + if ( yy_n >= 0 && yy_n < YYLAST && + yychk[yyact[yy_n]] == YYERRCODE) { + /* + ** simulate shift of "error" + */ + yy_state = yyact[ yy_n ]; + goto yy_stack; + } + /* + ** current state has no shift on + ** "error", pop stack + */ +#if YYDEBUG +# define _POP_ "Error recovery pops state %d, uncovers state %d\n" + if ( yydebug ) + printf( _POP_, *yy_ps, + yy_ps[-1] ); +# undef _POP_ +#endif + yy_ps--; + yy_pv--; + } + /* + ** there is no state on stack with "error" as + ** a valid shift. give up. + */ + YYABORT; + case 3: /* no shift yet; eat a token */ +#if YYDEBUG + /* + ** if debugging, look up token in list of + ** pairs. 0 and negative shouldn't occur, + ** but since timing doesn't matter when + ** debugging, it doesn't hurt to leave the + ** tests here. + */ + if ( yydebug ) + { + register int yy_i; + + printf( "Error recovery discards " ); + if ( yychar == 0 ) + printf( "token end-of-file\n" ); + else if ( yychar < 0 ) + printf( "token -none-\n" ); + else + { + for ( yy_i = 0; + yytoks[yy_i].t_val >= 0; + yy_i++ ) + { + if ( yytoks[yy_i].t_val + == yychar ) + { + break; + } + } + printf( "token %s\n", + yytoks[yy_i].t_name ); + } + } +#endif /* YYDEBUG */ + if ( yychar == 0 ) /* reached EOF. quit */ + YYABORT; + yychar = -1; + goto yy_newstate; + } + }/* end if ( yy_n == 0 ) */ + /* + ** reduction by production yy_n + ** put stack tops, etc. so things right after switch + */ +#if YYDEBUG + /* + ** if debugging, print the string that is the user's + ** specification of the reduction which is just about + ** to be done. + */ + if ( yydebug ) + printf( "Reduce by (%d) \"%s\"\n", + yy_n, yyreds[ yy_n ] ); +#endif + yytmp = yy_n; /* value to switch over */ + yypvt = yy_pv; /* $vars top of value stack */ + /* + ** Look in goto table for next state + ** Sorry about using yy_state here as temporary + ** register variable, but why not, if it works... + ** If yyr2[ yy_n ] doesn't have the low order bit + ** set, then there is no action to be done for + ** this reduction. So, no saving & unsaving of + ** registers done. The only difference between the + ** code just after the if and the body of the if is + ** the goto yy_stack in the body. This way the test + ** can be made before the choice of what to do is needed. + */ + { + /* length of production doubled with extra bit */ + register int yy_len = yyr2[ yy_n ]; + + if ( !( yy_len & 01 ) ) + { + yy_len >>= 1; + yyval = ( yy_pv -= yy_len )[1]; /* $$ = $1 */ + yy_state = yypgo[ yy_n = yyr1[ yy_n ] ] + + *( yy_ps -= yy_len ) + 1; + if ( yy_state >= YYLAST || + yychk[ yy_state = + yyact[ yy_state ] ] != -yy_n ) + { + yy_state = yyact[ yypgo[ yy_n ] ]; + } + goto yy_stack; + } + yy_len >>= 1; + yyval = ( yy_pv -= yy_len )[1]; /* $$ = $1 */ + yy_state = yypgo[ yy_n = yyr1[ yy_n ] ] + + *( yy_ps -= yy_len ) + 1; + if ( yy_state >= YYLAST || + yychk[ yy_state = yyact[ yy_state ] ] != -yy_n ) + { + yy_state = yyact[ yypgo[ yy_n ] ]; + } + } + /* save until reenter driver code */ + yystate = yy_state; + yyps = yy_ps; + yypv = yy_pv; + } + /* + ** code supplied by user is placed in this switch + */ + switch( yytmp ) + { + +case 9: +# line 123 "gram.y" +{ + (void) AddIconRegion(yypvt[-4].ptr, yypvt[-3].num, yypvt[-2].num, yypvt[-1].num, yypvt[-0].num); + } break; +case 10: +# line 126 "gram.y" +{ + list = AddIconRegion(yypvt[-4].ptr, yypvt[-3].num, yypvt[-2].num, yypvt[-1].num, yypvt[-0].num); + } break; +case 12: +# line 130 "gram.y" +{ if (Scr->FirstTime) + { + Scr->iconmgr->geometry= yypvt[-1].ptr; + Scr->iconmgr->columns=yypvt[-0].num; + } + } break; +case 13: +# line 136 "gram.y" +{ if (Scr->FirstTime) + Scr->iconmgr->geometry = yypvt[-0].ptr; + } break; +case 14: +# line 139 "gram.y" +{ if (Scr->FirstTime) + { + Scr->workSpaceMgr.workspaceWindow.geometry= yypvt[-1].ptr; + Scr->workSpaceMgr.workspaceWindow.columns=yypvt[-0].num; + } + } break; +case 15: +# line 145 "gram.y" +{ if (Scr->FirstTime) + Scr->workSpaceMgr.workspaceWindow.geometry = yypvt[-0].ptr; + } break; +case 16: +# line 148 "gram.y" +{} break; +case 18: +# line 151 "gram.y" +{} break; +case 20: +# line 154 "gram.y" +{ if (Scr->FirstTime) + { + Scr->DoZoom = TRUE; + Scr->ZoomCount = yypvt[-0].num; + } + } break; +case 21: +# line 160 "gram.y" +{ if (Scr->FirstTime) + Scr->DoZoom = TRUE; } break; +case 22: +# line 162 "gram.y" +{} break; +case 23: +# line 163 "gram.y" +{} break; +case 24: +# line 164 "gram.y" +{ list = &Scr->IconifyByUn; } break; +case 26: +# line 166 "gram.y" +{ if (Scr->FirstTime) + Scr->IconifyByUnmapping = TRUE; } break; +case 27: +# line 169 "gram.y" +{ list = &Scr->OpaqueMoveList; } break; +case 29: +# line 171 "gram.y" +{ if (Scr->FirstTime) Scr->DoOpaqueMove = TRUE; } break; +case 30: +# line 172 "gram.y" +{ list = &Scr->NoOpaqueMoveList; } break; +case 32: +# line 174 "gram.y" +{ if (Scr->FirstTime) Scr->DoOpaqueMove = FALSE; } break; +case 33: +# line 175 "gram.y" +{ list = &Scr->OpaqueMoveList; } break; +case 35: +# line 177 "gram.y" +{ if (Scr->FirstTime) Scr->DoOpaqueResize = TRUE; } break; +case 36: +# line 178 "gram.y" +{ list = &Scr->NoOpaqueResizeList; } break; +case 38: +# line 180 "gram.y" +{ if (Scr->FirstTime) Scr->DoOpaqueResize = FALSE; } break; +case 39: +# line 182 "gram.y" +{ + GotTitleButton (yypvt[-2].ptr, yypvt[-0].num, False); + } break; +case 40: +# line 185 "gram.y" +{ + GotTitleButton (yypvt[-2].ptr, yypvt[-0].num, True); + } break; +case 41: +# line 188 "gram.y" +{ CreateTitleButton(yypvt[-0].ptr, 0, NULL, NULL, FALSE, TRUE); } break; +case 43: +# line 190 "gram.y" +{ CreateTitleButton(yypvt[-0].ptr, 0, NULL, NULL, TRUE, TRUE); } break; +case 45: +# line 192 "gram.y" +{ + root = GetRoot(yypvt[-0].ptr, NULLSTR, NULLSTR); + AddFuncButton (yypvt[-1].num, C_ROOT, 0, F_MENU, root, (MenuItem*) 0); + } break; +case 46: +# line 196 "gram.y" +{ + if (yypvt[-0].num == F_MENU) { + pull->prev = NULL; + AddFuncButton (yypvt[-1].num, C_ROOT, 0, yypvt[-0].num, pull, (MenuItem*) 0); + } + else { + MenuItem *item; + + root = GetRoot(TWM_ROOT,NULLSTR,NULLSTR); + item = AddToMenu (root, "x", Action, + NULLSTR, yypvt[-0].num, NULLSTR, NULLSTR); + AddFuncButton (yypvt[-1].num, C_ROOT, 0, yypvt[-0].num, (MenuRoot*) 0, item); + } + Action = ""; + pull = NULL; + } break; +case 47: +# line 212 "gram.y" +{ GotKey(yypvt[-1].ptr, yypvt[-0].num); } break; +case 48: +# line 213 "gram.y" +{ GotButton(yypvt[-1].num, yypvt[-0].num); } break; +case 49: +# line 215 "gram.y" +{ list = &Scr->DontIconify; } break; +case 51: +# line 217 "gram.y" +{} break; +case 53: +# line 219 "gram.y" +{ list = &Scr->OccupyAll; } break; +case 55: +# line 221 "gram.y" +{} break; +case 57: +# line 223 "gram.y" +{ list = &Scr->IconMgrNoShow; } break; +case 59: +# line 225 "gram.y" +{ Scr->IconManagerDontShow = TRUE; } break; +case 60: +# line 226 "gram.y" +{ list = &Scr->IconMgrs; } break; +case 62: +# line 228 "gram.y" +{ list = &Scr->IconMgrShow; } break; +case 64: +# line 230 "gram.y" +{ list = &Scr->NoTitleHighlight; } break; +case 66: +# line 232 "gram.y" +{ if (Scr->FirstTime) + Scr->TitleHighlight = FALSE; } break; +case 67: +# line 234 "gram.y" +{ list = &Scr->NoHighlight; } break; +case 69: +# line 236 "gram.y" +{ if (Scr->FirstTime) + Scr->Highlight = FALSE; } break; +case 70: +# line 238 "gram.y" +{ list = &Scr->NoStackModeL; } break; +case 72: +# line 240 "gram.y" +{ if (Scr->FirstTime) + Scr->StackMode = FALSE; } break; +case 73: +# line 242 "gram.y" +{ list = &Scr->NoBorder; } break; +case 75: +# line 244 "gram.y" +{ list = &Scr->NoIconTitle; } break; +case 77: +# line 246 "gram.y" +{ if (Scr->FirstTime) + Scr->NoIconTitlebar = TRUE; } break; +case 78: +# line 248 "gram.y" +{ list = &Scr->NoTitle; } break; +case 80: +# line 250 "gram.y" +{ if (Scr->FirstTime) + Scr->NoTitlebar = TRUE; } break; +case 81: +# line 252 "gram.y" +{ list = &Scr->MakeTitle; } break; +case 83: +# line 254 "gram.y" +{ list = &Scr->StartIconified; } break; +case 85: +# line 256 "gram.y" +{ list = &Scr->AutoRaise; } break; +case 87: +# line 258 "gram.y" +{ Scr->AutoRaiseDefault = TRUE; } break; +case 88: +# line 259 "gram.y" +{ + root = GetRoot(yypvt[-5].ptr, yypvt[-3].ptr, yypvt[-1].ptr); } break; +case 89: +# line 261 "gram.y" +{ root->real_menu = TRUE;} break; +case 90: +# line 262 "gram.y" +{ root = GetRoot(yypvt[-0].ptr, NULLSTR, NULLSTR); } break; +case 91: +# line 263 "gram.y" +{ root->real_menu = TRUE; } break; +case 92: +# line 264 "gram.y" +{ root = GetRoot(yypvt[-0].ptr, NULLSTR, NULLSTR); } break; +case 94: +# line 266 "gram.y" +{ list = &Scr->IconNames; } break; +case 96: +# line 268 "gram.y" +{ color = COLOR; } break; +case 98: +# line 270 "gram.y" +{} break; +case 100: +# line 272 "gram.y" +{ color = MONOCHROME; } break; +case 102: +# line 274 "gram.y" +{ Scr->DefaultFunction.func = yypvt[-0].num; + if (yypvt[-0].num == F_MENU) + { + pull->prev = NULL; + Scr->DefaultFunction.menu = pull; + } + else + { + root = GetRoot(TWM_ROOT,NULLSTR,NULLSTR); + Scr->DefaultFunction.item = + AddToMenu(root,"x",Action, + NULLSTR,yypvt[-0].num, NULLSTR, NULLSTR); + } + Action = ""; + pull = NULL; + } break; +case 103: +# line 290 "gram.y" +{ Scr->WindowFunction.func = yypvt[-0].num; + root = GetRoot(TWM_ROOT,NULLSTR,NULLSTR); + Scr->WindowFunction.item = + AddToMenu(root,"x",Action, + NULLSTR,yypvt[-0].num, NULLSTR, NULLSTR); + Action = ""; + pull = NULL; + } break; +case 104: +# line 298 "gram.y" +{ Scr->ChangeWorkspaceFunction.func = yypvt[-0].num; + root = GetRoot(TWM_ROOT,NULLSTR,NULLSTR); + Scr->ChangeWorkspaceFunction.item = + AddToMenu(root,"x",Action, + NULLSTR,yypvt[-0].num, NULLSTR, NULLSTR); + Action = ""; + pull = NULL; + } break; +case 105: +# line 306 "gram.y" +{ Scr->DeIconifyFunction.func = yypvt[-0].num; + root = GetRoot(TWM_ROOT,NULLSTR,NULLSTR); + Scr->DeIconifyFunction.item = + AddToMenu(root,"x",Action, + NULLSTR,yypvt[-0].num, NULLSTR, NULLSTR); + Action = ""; + pull = NULL; + } break; +case 106: +# line 314 "gram.y" +{ Scr->IconifyFunction.func = yypvt[-0].num; + root = GetRoot(TWM_ROOT,NULLSTR,NULLSTR); + Scr->IconifyFunction.item = + AddToMenu(root,"x",Action, + NULLSTR,yypvt[-0].num, NULLSTR, NULLSTR); + Action = ""; + pull = NULL; + } break; +case 107: +# line 322 "gram.y" +{ list = &Scr->WarpCursorL; } break; +case 109: +# line 324 "gram.y" +{ if (Scr->FirstTime) + Scr->WarpCursor = TRUE; } break; +case 110: +# line 326 "gram.y" +{ list = &Scr->WindowRingL; } break; +case 112: +# line 328 "gram.y" +{ Scr->WindowRingAll = TRUE; } break; +case 113: +# line 331 "gram.y" +{ if (!do_single_keyword (yypvt[-0].num)) { + twmrc_error_prefix(); + fprintf (stderr, + "unknown singleton keyword %d\n", + yypvt[-0].num); + ParseError = 1; + } + } break; +case 114: +# line 341 "gram.y" +{ if (!do_string_keyword (yypvt[-1].num, yypvt[-0].ptr)) { + twmrc_error_prefix(); + fprintf (stderr, + "unknown string keyword %d (value \"%s\")\n", + yypvt[-1].num, yypvt[-0].ptr); + ParseError = 1; + } + } break; +case 115: +# line 349 "gram.y" +{ if (!do_string_keyword (yypvt[-0].num, defstring)) { + twmrc_error_prefix(); + fprintf (stderr, + "unknown string keyword %d (no value)\n", + yypvt[-0].num); + ParseError = 1; + } + } break; +case 116: +# line 359 "gram.y" +{ if (!do_number_keyword (yypvt[-1].num, yypvt[-0].num)) { + twmrc_error_prefix(); + fprintf (stderr, + "unknown numeric keyword %d (value %d)\n", + yypvt[-1].num, yypvt[-0].num); + ParseError = 1; + } + } break; +case 117: +# line 371 "gram.y" +{ yyval.num = yypvt[-0].num; } break; +case 118: +# line 374 "gram.y" +{ yyval.num = yypvt[-0].num; } break; +case 121: +# line 381 "gram.y" +{ mods |= Mod1Mask; } break; +case 122: +# line 382 "gram.y" +{ mods |= ShiftMask; } break; +case 123: +# line 383 "gram.y" +{ mods |= LockMask; } break; +case 124: +# line 384 "gram.y" +{ mods |= ControlMask; } break; +case 125: +# line 385 "gram.y" +{ if (yypvt[-0].num < 1 || yypvt[-0].num > 5) { + twmrc_error_prefix(); + fprintf (stderr, + "bad modifier number (%d), must be 1-5\n", + yypvt[-0].num); + ParseError = 1; + } else { + mods |= (Mod1Mask << (yypvt[-0].num - 1)); + } + } break; +case 126: +# line 395 "gram.y" +{ } break; +case 129: +# line 402 "gram.y" +{ cont |= C_WINDOW_BIT; } break; +case 130: +# line 403 "gram.y" +{ cont |= C_TITLE_BIT; } break; +case 131: +# line 404 "gram.y" +{ cont |= C_ICON_BIT; } break; +case 132: +# line 405 "gram.y" +{ cont |= C_ROOT_BIT; } break; +case 133: +# line 406 "gram.y" +{ cont |= C_FRAME_BIT; } break; +case 134: +# line 407 "gram.y" +{ cont |= C_ICONMGR_BIT; } break; +case 135: +# line 408 "gram.y" +{ cont |= C_ICONMGR_BIT; } break; +case 136: +# line 409 "gram.y" +{ cont |= C_ALL_BITS; } break; +case 137: +# line 410 "gram.y" +{ } break; +case 140: +# line 417 "gram.y" +{ cont |= C_WINDOW_BIT; } break; +case 141: +# line 418 "gram.y" +{ cont |= C_TITLE_BIT; } break; +case 142: +# line 419 "gram.y" +{ cont |= C_ICON_BIT; } break; +case 143: +# line 420 "gram.y" +{ cont |= C_ROOT_BIT; } break; +case 144: +# line 421 "gram.y" +{ cont |= C_FRAME_BIT; } break; +case 145: +# line 422 "gram.y" +{ cont |= C_ICONMGR_BIT; } break; +case 146: +# line 423 "gram.y" +{ cont |= C_ICONMGR_BIT; } break; +case 147: +# line 424 "gram.y" +{ cont |= C_ALL_BITS; } break; +case 148: +# line 425 "gram.y" +{ } break; +case 149: +# line 426 "gram.y" +{ Name = yypvt[-0].ptr; cont |= C_NAME_BIT; } break; +case 153: +# line 437 "gram.y" +{ ModifyCurrentTB(yypvt[-2].num, yypvt[-0].num, Action, pull);} break; +case 154: +# line 441 "gram.y" +{} break; +case 157: +# line 448 "gram.y" +{ SetHighlightPixmap (yypvt[-0].ptr); } break; +case 158: +# line 452 "gram.y" +{} break; +case 161: +# line 459 "gram.y" +{ + NewBitmapCursor(&Scr->FrameCursor, yypvt[-1].ptr, yypvt[-0].ptr); } break; +case 162: +# line 461 "gram.y" +{ + NewFontCursor(&Scr->FrameCursor, yypvt[-0].ptr); } break; +case 163: +# line 463 "gram.y" +{ + NewBitmapCursor(&Scr->TitleCursor, yypvt[-1].ptr, yypvt[-0].ptr); } break; +case 164: +# line 465 "gram.y" +{ + NewFontCursor(&Scr->TitleCursor, yypvt[-0].ptr); } break; +case 165: +# line 467 "gram.y" +{ + NewBitmapCursor(&Scr->IconCursor, yypvt[-1].ptr, yypvt[-0].ptr); } break; +case 166: +# line 469 "gram.y" +{ + NewFontCursor(&Scr->IconCursor, yypvt[-0].ptr); } break; +case 167: +# line 471 "gram.y" +{ + NewBitmapCursor(&Scr->IconMgrCursor, yypvt[-1].ptr, yypvt[-0].ptr); } break; +case 168: +# line 473 "gram.y" +{ + NewFontCursor(&Scr->IconMgrCursor, yypvt[-0].ptr); } break; +case 169: +# line 475 "gram.y" +{ + NewBitmapCursor(&Scr->ButtonCursor, yypvt[-1].ptr, yypvt[-0].ptr); } break; +case 170: +# line 477 "gram.y" +{ + NewFontCursor(&Scr->ButtonCursor, yypvt[-0].ptr); } break; +case 171: +# line 479 "gram.y" +{ + NewBitmapCursor(&Scr->MoveCursor, yypvt[-1].ptr, yypvt[-0].ptr); } break; +case 172: +# line 481 "gram.y" +{ + NewFontCursor(&Scr->MoveCursor, yypvt[-0].ptr); } break; +case 173: +# line 483 "gram.y" +{ + NewBitmapCursor(&Scr->ResizeCursor, yypvt[-1].ptr, yypvt[-0].ptr); } break; +case 174: +# line 485 "gram.y" +{ + NewFontCursor(&Scr->ResizeCursor, yypvt[-0].ptr); } break; +case 175: +# line 487 "gram.y" +{ + NewBitmapCursor(&Scr->WaitCursor, yypvt[-1].ptr, yypvt[-0].ptr); } break; +case 176: +# line 489 "gram.y" +{ + NewFontCursor(&Scr->WaitCursor, yypvt[-0].ptr); } break; +case 177: +# line 491 "gram.y" +{ + NewBitmapCursor(&Scr->MenuCursor, yypvt[-1].ptr, yypvt[-0].ptr); } break; +case 178: +# line 493 "gram.y" +{ + NewFontCursor(&Scr->MenuCursor, yypvt[-0].ptr); } break; +case 179: +# line 495 "gram.y" +{ + NewBitmapCursor(&Scr->SelectCursor, yypvt[-1].ptr, yypvt[-0].ptr); } break; +case 180: +# line 497 "gram.y" +{ + NewFontCursor(&Scr->SelectCursor, yypvt[-0].ptr); } break; +case 181: +# line 499 "gram.y" +{ + NewBitmapCursor(&Scr->DestroyCursor, yypvt[-1].ptr, yypvt[-0].ptr); } break; +case 182: +# line 501 "gram.y" +{ + NewFontCursor(&Scr->DestroyCursor, yypvt[-0].ptr); } break; +case 183: +# line 505 "gram.y" +{} break; +case 186: +# line 513 "gram.y" +{ if (!do_colorlist_keyword (yypvt[-1].num, color, + yypvt[-0].ptr)) { + twmrc_error_prefix(); + fprintf (stderr, + "unhandled list color keyword %d (string \"%s\")\n", + yypvt[-1].num, yypvt[-0].ptr); + ParseError = 1; + } + } break; +case 187: +# line 522 "gram.y" +{ list = do_colorlist_keyword(yypvt[-1].num,color, + yypvt[-0].ptr); + if (!list) { + twmrc_error_prefix(); + fprintf (stderr, + "unhandled color list keyword %d (string \"%s\")\n", + yypvt[-1].num, yypvt[-0].ptr); + ParseError = 1; + } + } break; +case 189: +# line 533 "gram.y" +{ if (!do_color_keyword (yypvt[-1].num, color, + yypvt[-0].ptr)) { + twmrc_error_prefix(); + fprintf (stderr, + "unhandled color keyword %d (string \"%s\")\n", + yypvt[-1].num, yypvt[-0].ptr); + ParseError = 1; + } + } break; +case 190: +# line 544 "gram.y" +{} break; +case 193: +# line 551 "gram.y" +{ do_string_savecolor(color, yypvt[-0].ptr); } break; +case 194: +# line 552 "gram.y" +{ do_var_savecolor(yypvt[-0].num); } break; +case 195: +# line 555 "gram.y" +{} break; +case 198: +# line 562 "gram.y" +{ if (Scr->FirstTime && + color == Scr->Monochrome) + AddToList(list, yypvt[-1].ptr, yypvt[-0].ptr); } break; +case 199: +# line 567 "gram.y" +{ + if (HasShape) Scr->SqueezeTitle = TRUE; + } break; +case 200: +# line 570 "gram.y" +{ list = &Scr->SqueezeTitleL; + if (HasShape && Scr->SqueezeTitle == -1) + Scr->SqueezeTitle = TRUE; + } break; +case 202: +# line 575 "gram.y" +{ Scr->SqueezeTitle = FALSE; } break; +case 203: +# line 576 "gram.y" +{ list = &Scr->DontSqueezeTitleL; } break; +case 206: +# line 581 "gram.y" +{ + if (Scr->FirstTime) { + do_squeeze_entry (list, yypvt[-3].ptr, yypvt[-2].num, yypvt[-1].num, yypvt[-0].num); + } + } break; +case 207: +# line 589 "gram.y" +{} break; +case 210: +# line 596 "gram.y" +{ if (Scr->FirstTime) + AddToList(list, yypvt[-2].ptr, (char *) + AllocateIconManager(yypvt[-2].ptr, NULLSTR, + yypvt[-1].ptr,yypvt[-0].num)); + } break; +case 211: +# line 602 "gram.y" +{ if (Scr->FirstTime) + AddToList(list, yypvt[-3].ptr, (char *) + AllocateIconManager(yypvt[-3].ptr,yypvt[-2].ptr, + yypvt[-1].ptr, yypvt[-0].num)); + } break; +case 212: +# line 609 "gram.y" +{} break; +case 215: +# line 616 "gram.y" +{ + AddWorkSpace (yypvt[-0].ptr, NULLSTR, NULLSTR, NULLSTR, NULLSTR, NULLSTR); + } break; +case 216: +# line 619 "gram.y" +{ + curWorkSpc = yypvt[-0].ptr; + } break; +case 218: +# line 625 "gram.y" +{} break; +case 221: +# line 632 "gram.y" +{ + AddWorkSpace (curWorkSpc, yypvt[-0].ptr, NULLSTR, NULLSTR, NULLSTR, NULLSTR); + } break; +case 222: +# line 635 "gram.y" +{ + AddWorkSpace (curWorkSpc, yypvt[-1].ptr, yypvt[-0].ptr, NULLSTR, NULLSTR, NULLSTR); + } break; +case 223: +# line 638 "gram.y" +{ + AddWorkSpace (curWorkSpc, yypvt[-2].ptr, yypvt[-1].ptr, yypvt[-0].ptr, NULLSTR, NULLSTR); + } break; +case 224: +# line 641 "gram.y" +{ + AddWorkSpace (curWorkSpc, yypvt[-3].ptr, yypvt[-2].ptr, yypvt[-1].ptr, yypvt[-0].ptr, NULLSTR); + } break; +case 225: +# line 644 "gram.y" +{ + AddWorkSpace (curWorkSpc, yypvt[-4].ptr, yypvt[-3].ptr, yypvt[-2].ptr, yypvt[-1].ptr, yypvt[-0].ptr); + } break; +case 226: +# line 649 "gram.y" +{ + WMapCreateCurrentBackGround (yypvt[-1].ptr, NULL, NULL, NULL); + } break; +case 227: +# line 652 "gram.y" +{ + WMapCreateCurrentBackGround (yypvt[-2].ptr, yypvt[-1].ptr, NULL, NULL); + } break; +case 228: +# line 655 "gram.y" +{ + WMapCreateCurrentBackGround (yypvt[-3].ptr, yypvt[-2].ptr, yypvt[-1].ptr, NULL); + } break; +case 229: +# line 658 "gram.y" +{ + WMapCreateCurrentBackGround (yypvt[-4].ptr, yypvt[-3].ptr, yypvt[-2].ptr, yypvt[-1].ptr); + } break; +case 230: +# line 663 "gram.y" +{ + WMapCreateDefaultBackGround (yypvt[-1].ptr, NULL, NULL, NULL); + } break; +case 231: +# line 666 "gram.y" +{ + WMapCreateDefaultBackGround (yypvt[-2].ptr, yypvt[-1].ptr, NULL, NULL); + } break; +case 232: +# line 669 "gram.y" +{ + WMapCreateDefaultBackGround (yypvt[-3].ptr, yypvt[-2].ptr, yypvt[-1].ptr, NULL); + } break; +case 233: +# line 672 "gram.y" +{ + WMapCreateDefaultBackGround (yypvt[-4].ptr, yypvt[-3].ptr, yypvt[-2].ptr, yypvt[-1].ptr); + } break; +case 234: +# line 677 "gram.y" +{} break; +case 237: +# line 684 "gram.y" +{ if (Scr->FirstTime) + AddToList(list, yypvt[-0].ptr, 0); + } break; +case 238: +# line 689 "gram.y" +{} break; +case 241: +# line 696 "gram.y" +{client = yypvt[-0].ptr;} break; +case 243: +# line 698 "gram.y" +{client = yypvt[-0].ptr;} break; +case 245: +# line 700 "gram.y" +{workspace = yypvt[-0].ptr;} break; +case 247: +# line 704 "gram.y" +{} break; +case 250: +# line 711 "gram.y" +{ + AddToClientsList (yypvt[-0].ptr, client); + } break; +case 251: +# line 715 "gram.y" +{} break; +case 254: +# line 722 "gram.y" +{ + AddToClientsList (workspace, yypvt[-0].ptr); + } break; +case 255: +# line 726 "gram.y" +{} break; +case 258: +# line 733 "gram.y" +{ if (Scr->FirstTime) AddToList(list, yypvt[-1].ptr, yypvt[-0].ptr); } break; +case 259: +# line 736 "gram.y" +{} break; +case 262: +# line 743 "gram.y" +{ AddToMenu(root, "", Action, NULLSTR, yypvt[-0].num, + NULLSTR, NULLSTR); + Action = ""; + } break; +case 263: +# line 749 "gram.y" +{lastmenuitem = (MenuItem*) 0;} break; +case 266: +# line 756 "gram.y" +{ + if (yypvt[-0].num == F_SEPARATOR) { + if (lastmenuitem) lastmenuitem->separated = 1; + } + else { + lastmenuitem = AddToMenu(root, yypvt[-1].ptr, Action, pull, yypvt[-0].num, NULLSTR, NULLSTR); + Action = ""; + pull = NULL; + } + } break; +case 267: +# line 766 "gram.y" +{ + if (yypvt[-0].num == F_SEPARATOR) { + if (lastmenuitem) lastmenuitem->separated = 1; + } + else { + lastmenuitem = AddToMenu(root, yypvt[-6].ptr, Action, pull, yypvt[-0].num, yypvt[-4].ptr, yypvt[-2].ptr); + Action = ""; + pull = NULL; + } + } break; +case 268: +# line 778 "gram.y" +{ yyval.num = yypvt[-0].num; } break; +case 269: +# line 779 "gram.y" +{ + yyval.num = yypvt[-1].num; + Action = yypvt[-0].ptr; + switch (yypvt[-1].num) { + case F_MENU: + pull = GetRoot (yypvt[-0].ptr, NULLSTR,NULLSTR); + pull->prev = root; + break; + case F_WARPRING: + if (!CheckWarpRingArg (Action)) { + twmrc_error_prefix(); + fprintf (stderr, + "ignoring invalid f.warptoring argument \"%s\"\n", + Action); + yyval.num = F_NOP; + } + case F_WARPTOSCREEN: + if (!CheckWarpScreenArg (Action)) { + twmrc_error_prefix(); + fprintf (stderr, + "ignoring invalid f.warptoscreen argument \"%s\"\n", + Action); + yyval.num = F_NOP; + } + break; + case F_COLORMAP: + if (CheckColormapArg (Action)) { + yyval.num = F_COLORMAP; + } else { + twmrc_error_prefix(); + fprintf (stderr, + "ignoring invalid f.colormap argument \"%s\"\n", + Action); + yyval.num = F_NOP; + } + break; + } /* end switch */ + } break; +case 270: +# line 820 "gram.y" +{ yyval.num = yypvt[-0].num; } break; +case 271: +# line 821 "gram.y" +{ yyval.num = yypvt[-0].num; } break; +case 272: +# line 822 "gram.y" +{ yyval.num = -(yypvt[-0].num); } break; +case 273: +# line 825 "gram.y" +{ yyval.num = yypvt[-0].num; + if (yypvt[-0].num == 0) + yyerror("bad button 0"); + + if (yypvt[-0].num > MAX_BUTTONS) + { + yyval.num = 0; + yyerror("button number too large"); + } + } break; +case 274: +# line 837 "gram.y" +{ ptr = (char *)malloc(strlen(yypvt[-0].ptr)+1); + strcpy(ptr, yypvt[-0].ptr); + RemoveDQuote(ptr); + yyval.ptr = ptr; + } break; +case 275: +# line 842 "gram.y" +{ yyval.num = yypvt[-0].num; } break; + } + goto yystack; /* reset registers in driver code */ +} + +# ifdef __RUNTIME_YYMAXDEPTH + +static int allocate_stacks() { + /* allocate the yys and yyv stacks */ + yys = (int *) malloc(yymaxdepth * sizeof(int)); + yyv = (YYSTYPE *) malloc(yymaxdepth * sizeof(YYSTYPE)); + + if (yys==0 || yyv==0) { + yyerror( (nl_msg(30004,"unable to allocate space for yacc stacks")) ); + return(1); + } + else return(0); + +} + + +static void free_stacks() { + if (yys!=0) free((char *) yys); + if (yyv!=0) free((char *) yyv); +} + +# endif /* defined(__RUNTIME_YYMAXDEPTH) */ + Index: external/mit/ctwm/dist/gram.h_VMS =================================================================== RCS file: external/mit/ctwm/dist/gram.h_VMS diff -N external/mit/ctwm/dist/gram.h_VMS --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/gram.h_VMS 3 Sep 2015 12:19:51 -0000 @@ -0,0 +1,188 @@ + +typedef union +{ + int num; + char *ptr; +} YYSTYPE; +extern YYSTYPE yylval; +# define LB 257 +# define RB 258 +# define LP 259 +# define RP 260 +# define MENUS 261 +# define MENU 262 +# define BUTTON 263 +# define DEFAULT_FUNCTION 264 +# define PLUS 265 +# define MINUS 266 +# define ALL 267 +# define OR 268 +# define CURSORS 269 +# define PIXMAPS 270 +# define ICONS 271 +# define COLOR 272 +# define SAVECOLOR 273 +# define MONOCHROME 274 +# define FUNCTION 275 +# define ICONMGR_SHOW 276 +# define ICONMGR 277 +# define WINDOW_FUNCTION 278 +# define ZOOM 279 +# define ICONMGRS 280 +# define ICONMGR_GEOMETRY 281 +# define ICONMGR_NOSHOW 282 +# define MAKE_TITLE 283 +# define ICONIFY_BY_UNMAPPING 284 +# define DONT_ICONIFY_BY_UNMAPPING 285 +# define NO_BORDER 286 +# define NO_ICON_TITLE 287 +# define NO_TITLE 288 +# define AUTO_RAISE 289 +# define NO_HILITE 290 +# define ICON_REGION 291 +# define META 292 +# define SHIFT 293 +# define LOCK 294 +# define CONTROL 295 +# define WINDOW 296 +# define TITLE 297 +# define ICON 298 +# define ROOT 299 +# define FRAME 300 +# define COLON 301 +# define EQUALS 302 +# define SQUEEZE_TITLE 303 +# define DONT_SQUEEZE_TITLE 304 +# define START_ICONIFIED 305 +# define NO_TITLE_HILITE 306 +# define TITLE_HILITE 307 +# define MOVE 308 +# define RESIZE 309 +# define WAITC 310 +# define SELECT 311 +# define KILL 312 +# define LEFT_TITLEBUTTON 313 +# define RIGHT_TITLEBUTTON 314 +# define NUMBER 315 +# define KEYWORD 316 +# define NKEYWORD 317 +# define CKEYWORD 318 +# define CLKEYWORD 319 +# define FKEYWORD 320 +# define FSKEYWORD 321 +# define SKEYWORD 322 +# define DKEYWORD 323 +# define JKEYWORD 324 +# define WINDOW_RING 325 +# define WARP_CURSOR 326 +# define ERRORTOKEN 327 +# define NO_STACKMODE 328 +# define WORKSPACE 329 +# define WORKSPACES 330 +# define WORKSPCMGR_GEOMETRY 331 +# define OCCUPYALL 332 +# define OCCUPYLIST 333 +# define MAPWINDOWCURRENTWORKSPACE 334 +# define MAPWINDOWDEFAULTWORKSPACE 335 +# define OPAQUEMOVE 336 +# define NOOPAQUEMOVE 337 +# define OPAQUERESIZE 338 +# define NOOPAQUERESIZE 339 +# define CHANGE_WORKSPACE_FUNCTION 340 +# define DEICONIFY_FUNCTION 341 +# define ICONIFY_FUNCTION 342 +# define STRING 343 + +typedef union +{ + int num; + char *ptr; +} YYSTYPE; +extern YYSTYPE yylval; +# define LB 257 +# define RB 258 +# define LP 259 +# define RP 260 +# define MENUS 261 +# define MENU 262 +# define BUTTON 263 +# define DEFAULT_FUNCTION 264 +# define PLUS 265 +# define MINUS 266 +# define ALL 267 +# define OR 268 +# define CURSORS 269 +# define PIXMAPS 270 +# define ICONS 271 +# define COLOR 272 +# define SAVECOLOR 273 +# define MONOCHROME 274 +# define FUNCTION 275 +# define ICONMGR_SHOW 276 +# define ICONMGR 277 +# define WINDOW_FUNCTION 278 +# define ZOOM 279 +# define ICONMGRS 280 +# define ICONMGR_GEOMETRY 281 +# define ICONMGR_NOSHOW 282 +# define MAKE_TITLE 283 +# define ICONIFY_BY_UNMAPPING 284 +# define DONT_ICONIFY_BY_UNMAPPING 285 +# define NO_BORDER 286 +# define NO_ICON_TITLE 287 +# define NO_TITLE 288 +# define AUTO_RAISE 289 +# define NO_HILITE 290 +# define ICON_REGION 291 +# define META 292 +# define SHIFT 293 +# define LOCK 294 +# define CONTROL 295 +# define WINDOW 296 +# define TITLE 297 +# define ICON 298 +# define ROOT 299 +# define FRAME 300 +# define COLON 301 +# define EQUALS 302 +# define SQUEEZE_TITLE 303 +# define DONT_SQUEEZE_TITLE 304 +# define START_ICONIFIED 305 +# define NO_TITLE_HILITE 306 +# define TITLE_HILITE 307 +# define MOVE 308 +# define RESIZE 309 +# define WAITC 310 +# define SELECT 311 +# define KILL 312 +# define LEFT_TITLEBUTTON 313 +# define RIGHT_TITLEBUTTON 314 +# define NUMBER 315 +# define KEYWORD 316 +# define NKEYWORD 317 +# define CKEYWORD 318 +# define CLKEYWORD 319 +# define FKEYWORD 320 +# define FSKEYWORD 321 +# define SKEYWORD 322 +# define DKEYWORD 323 +# define JKEYWORD 324 +# define WINDOW_RING 325 +# define WARP_CURSOR 326 +# define ERRORTOKEN 327 +# define NO_STACKMODE 328 +# define WORKSPACE 329 +# define WORKSPACES 330 +# define WORKSPCMGR_GEOMETRY 331 +# define OCCUPYALL 332 +# define OCCUPYLIST 333 +# define MAPWINDOWCURRENTWORKSPACE 334 +# define MAPWINDOWDEFAULTWORKSPACE 335 +# define OPAQUEMOVE 336 +# define NOOPAQUEMOVE 337 +# define OPAQUERESIZE 338 +# define NOOPAQUERESIZE 339 +# define CHANGE_WORKSPACE_FUNCTION 340 +# define DEICONIFY_FUNCTION 341 +# define ICONIFY_FUNCTION 342 +# define STRING 343 Index: external/mit/ctwm/dist/gram.tab.c =================================================================== RCS file: external/mit/ctwm/dist/gram.tab.c diff -N external/mit/ctwm/dist/gram.tab.c --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/gram.tab.c 3 Sep 2015 12:19:54 -0000 @@ -0,0 +1,3423 @@ +/* original parser id follows */ +/* yysccsid[] = "@(#)yaccpar 1.9 (Berkeley) 02/21/93" */ +/* (use YYMAJOR/YYMINOR for ifdefs dependent on parser version) */ + +#define YYBYACC 1 +#define YYMAJOR 1 +#define YYMINOR 9 +#define YYPATCH 20140409 + +#define YYEMPTY (-1) +#define yyclearin (yychar = YYEMPTY) +#define yyerrok (yyerrflag = 0) +#define YYRECOVERING() (yyerrflag != 0) +#define YYENOMEM (-2) +#define YYEOF 0 +#define YYPREFIX "yy" + +#define YYPURE 0 + +#line 68 "gram.y" +#include +#include +#include "twm.h" +#include "menus.h" +#include "icons.h" +#include "windowbox.h" +#include "add_window.h" +#include "list.h" +#include "util.h" +#include "screen.h" +#include "parse.h" +#include "cursor.h" +#ifdef VMS +# include +# include +#else +# include +# include +#endif + +static char *Action = ""; +static char *Name = ""; +static char *defstring = "default"; +static MenuRoot *root, *pull = NULL; +static char *curWorkSpc; +static char *client, *workspace; +static MenuItem *lastmenuitem = (MenuItem*) 0; + +extern void yyerror(char *s); +extern void RemoveDQuote(char *str); + +static MenuRoot *GetRoot(char *name, char *fore, char *back); + +static Bool CheckWarpScreenArg(register char *s); +static Bool CheckWarpRingArg(register char *s); +static Bool CheckColormapArg(register char *s); +static void GotButton(int butt, int func); +static void GotKey(char *key, int func); +static void GotTitleButton(char *bitmapname, int func, Bool rightside); +static char *ptr; +static name_list **list; +static int cont = 0; +static int color; +Bool donttoggleworkspacemanagerstate = FALSE; +int mods = 0; +unsigned int mods_used = (ShiftMask | ControlMask | Mod1Mask); + +extern void twmrc_error_prefix(void); + +extern int yylex(void); +extern int yyparse(void); +#line 121 "gram.y" +#ifdef YYSTYPE +#undef YYSTYPE_IS_DECLARED +#define YYSTYPE_IS_DECLARED 1 +#endif +#ifndef YYSTYPE_IS_DECLARED +#define YYSTYPE_IS_DECLARED 1 +typedef union +{ + int num; + char *ptr; +} YYSTYPE; +#endif /* !YYSTYPE_IS_DECLARED */ +#line 86 "gram.tab.c" + +/* compatibility with bison */ +#ifdef YYPARSE_PARAM +/* compatibility with FreeBSD */ +# ifdef YYPARSE_PARAM_TYPE +# define YYPARSE_DECL() yyparse(YYPARSE_PARAM_TYPE YYPARSE_PARAM) +# else +# define YYPARSE_DECL() yyparse(void *YYPARSE_PARAM) +# endif +#else +# define YYPARSE_DECL() yyparse(void) +#endif + +/* Parameters sent to lex. */ +#ifdef YYLEX_PARAM +# define YYLEX_DECL() yylex(void *YYLEX_PARAM) +# define YYLEX yylex(YYLEX_PARAM) +#else +# define YYLEX_DECL() yylex(void) +# define YYLEX yylex() +#endif + +/* Parameters sent to yyerror. */ +#ifndef YYERROR_DECL +#define YYERROR_DECL() yyerror(const char *s) +#endif +#ifndef YYERROR_CALL +#define YYERROR_CALL(msg) yyerror(msg) +#endif + +extern int YYPARSE_DECL(); + +#define LB 257 +#define RB 258 +#define LP 259 +#define RP 260 +#define MENUS 261 +#define MENU 262 +#define BUTTON 263 +#define DEFAULT_FUNCTION 264 +#define PLUS 265 +#define MINUS 266 +#define ALL 267 +#define OR 268 +#define CURSORS 269 +#define PIXMAPS 270 +#define ICONS 271 +#define COLOR 272 +#define SAVECOLOR 273 +#define MONOCHROME 274 +#define FUNCTION 275 +#define ICONMGR_SHOW 276 +#define ICONMGR 277 +#define ALTER 278 +#define WINDOW_FUNCTION 279 +#define ZOOM 280 +#define ICONMGRS 281 +#define ICONMGR_GEOMETRY 282 +#define ICONMGR_NOSHOW 283 +#define MAKE_TITLE 284 +#define ICONIFY_BY_UNMAPPING 285 +#define DONT_ICONIFY_BY_UNMAPPING 286 +#define NO_BORDER 287 +#define NO_ICON_TITLE 288 +#define NO_TITLE 289 +#define AUTO_RAISE 290 +#define NO_HILITE 291 +#define ICON_REGION 292 +#define WINDOW_REGION 293 +#define META 294 +#define SHIFT 295 +#define LOCK 296 +#define CONTROL 297 +#define WINDOW 298 +#define TITLE 299 +#define ICON 300 +#define ROOT 301 +#define FRAME 302 +#define COLON 303 +#define EQUALS 304 +#define SQUEEZE_TITLE 305 +#define DONT_SQUEEZE_TITLE 306 +#define START_ICONIFIED 307 +#define NO_TITLE_HILITE 308 +#define TITLE_HILITE 309 +#define MOVE 310 +#define RESIZE 311 +#define WAITC 312 +#define SELECT 313 +#define KILL 314 +#define LEFT_TITLEBUTTON 315 +#define RIGHT_TITLEBUTTON 316 +#define NUMBER 317 +#define KEYWORD 318 +#define NKEYWORD 319 +#define CKEYWORD 320 +#define CLKEYWORD 321 +#define FKEYWORD 322 +#define FSKEYWORD 323 +#define SKEYWORD 324 +#define SSKEYWORD 325 +#define DKEYWORD 326 +#define JKEYWORD 327 +#define WINDOW_RING 328 +#define WINDOW_RING_EXCLUDE 329 +#define WARP_CURSOR 330 +#define ERRORTOKEN 331 +#define NO_STACKMODE 332 +#define ALWAYS_ON_TOP 333 +#define WORKSPACE 334 +#define WORKSPACES 335 +#define WORKSPCMGR_GEOMETRY 336 +#define OCCUPYALL 337 +#define OCCUPYLIST 338 +#define MAPWINDOWCURRENTWORKSPACE 339 +#define MAPWINDOWDEFAULTWORKSPACE 340 +#define UNMAPBYMOVINGFARAWAY 341 +#define OPAQUEMOVE 342 +#define NOOPAQUEMOVE 343 +#define OPAQUERESIZE 344 +#define NOOPAQUERESIZE 345 +#define DONTSETINACTIVE 346 +#define CHANGE_WORKSPACE_FUNCTION 347 +#define DEICONIFY_FUNCTION 348 +#define ICONIFY_FUNCTION 349 +#define AUTOSQUEEZE 350 +#define STARTSQUEEZED 351 +#define DONT_SAVE 352 +#define AUTO_LOWER 353 +#define ICONMENU_DONTSHOW 354 +#define WINDOW_BOX 355 +#define IGNOREMODIFIER 356 +#define WINDOW_GEOMETRIES 357 +#define ALWAYSSQUEEZETOGRAVITY 358 +#define VIRTUAL_SCREENS 359 +#define IGNORE_TRANSIENT 360 +#define DONTTOGGLEWORKSPACEMANAGERSTATE 361 +#define STRING 362 +#define YYERRCODE 256 +typedef short YYINT; +static const YYINT yylhs[] = { -1, + 0, 9, 9, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 16, 10, 17, 10, 18, 10, 19, 10, + 20, 10, 21, 10, 10, 10, 10, 10, 23, 10, + 25, 10, 10, 10, 10, 10, 28, 10, 10, 29, + 10, 10, 30, 10, 10, 31, 10, 10, 32, 10, + 10, 10, 10, 34, 10, 35, 10, 10, 10, 10, + 10, 36, 10, 38, 10, 39, 41, 10, 42, 10, + 43, 10, 45, 10, 46, 10, 47, 10, 48, 10, + 10, 49, 10, 50, 10, 51, 10, 10, 53, 10, + 54, 10, 55, 10, 10, 56, 10, 10, 57, 10, + 58, 10, 10, 59, 10, 60, 10, 61, 10, 10, + 62, 10, 10, 63, 10, 10, 64, 10, 65, 10, + 66, 10, 10, 67, 10, 10, 69, 10, 70, 10, + 72, 10, 74, 10, 76, 10, 78, 10, 79, 10, + 10, 10, 10, 10, 10, 80, 10, 10, 81, 10, + 10, 82, 10, 84, 10, 86, 10, 11, 12, 12, + 12, 12, 12, 13, 6, 7, 8, 40, 40, 89, + 89, 89, 89, 89, 89, 89, 87, 87, 90, 90, + 90, 90, 90, 90, 90, 90, 90, 90, 90, 88, + 88, 91, 91, 91, 91, 91, 91, 91, 91, 91, + 91, 91, 91, 33, 92, 92, 93, 93, 93, 26, + 94, 94, 95, 27, 96, 96, 97, 97, 97, 97, + 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, + 97, 97, 97, 97, 97, 97, 97, 97, 75, 98, + 98, 99, 101, 99, 99, 77, 102, 102, 103, 103, + 100, 104, 104, 105, 83, 106, 106, 107, 85, 108, + 108, 109, 14, 110, 14, 14, 112, 14, 111, 111, + 52, 113, 113, 114, 114, 37, 115, 115, 116, 118, + 116, 117, 119, 119, 120, 120, 120, 120, 120, 22, + 22, 22, 22, 24, 24, 24, 24, 15, 121, 121, + 122, 44, 123, 123, 126, 124, 127, 124, 129, 124, + 125, 130, 130, 131, 128, 132, 132, 133, 73, 134, + 134, 135, 71, 136, 136, 137, 68, 138, 138, 139, + 139, 2, 2, 5, 5, 5, 3, 1, 4, +}; +static const YYINT yylen[] = { 2, + 1, 0, 2, 1, 1, 1, 1, 1, 6, 7, + 8, 9, 0, 8, 0, 9, 0, 10, 0, 11, + 0, 6, 0, 5, 3, 2, 3, 2, 0, 3, + 0, 3, 2, 1, 2, 2, 0, 3, 1, 0, + 3, 1, 0, 3, 1, 0, 3, 1, 0, 3, + 1, 4, 4, 0, 4, 0, 4, 2, 2, 2, + 2, 0, 3, 0, 3, 0, 0, 6, 0, 3, + 0, 3, 0, 3, 0, 3, 0, 3, 0, 3, + 1, 0, 3, 0, 3, 0, 3, 1, 0, 3, + 0, 3, 0, 3, 1, 0, 3, 1, 0, 3, + 0, 3, 1, 0, 3, 0, 3, 0, 3, 1, + 0, 3, 1, 0, 3, 1, 0, 3, 0, 3, + 0, 3, 1, 0, 3, 1, 0, 9, 0, 4, + 0, 4, 0, 3, 0, 3, 0, 3, 0, 3, + 2, 2, 2, 2, 2, 0, 3, 1, 0, 3, + 1, 0, 3, 0, 3, 0, 3, 1, 2, 1, + 3, 2, 1, 2, 4, 6, 6, 0, 2, 1, + 1, 1, 1, 2, 2, 1, 0, 2, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, + 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 3, 0, 2, 2, 3, 3, 3, + 0, 2, 2, 3, 0, 2, 3, 2, 3, 2, + 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, + 3, 2, 3, 2, 3, 2, 3, 2, 3, 0, + 2, 2, 0, 4, 2, 3, 0, 2, 1, 1, + 3, 0, 2, 2, 3, 0, 2, 2, 3, 0, + 2, 1, 1, 0, 5, 1, 0, 3, 0, 5, + 3, 0, 2, 3, 4, 3, 0, 2, 1, 0, + 3, 3, 0, 2, 1, 2, 3, 4, 5, 3, + 4, 5, 6, 3, 4, 5, 6, 3, 0, 2, + 1, 3, 0, 2, 0, 3, 0, 4, 0, 4, + 3, 0, 2, 1, 3, 0, 2, 1, 3, 0, + 2, 2, 3, 0, 2, 1, 3, 0, 2, 2, + 7, 1, 2, 1, 2, 2, 2, 1, 1, +}; +static const YYINT yydefred[] = { 2, + 0, 0, 4, 0, 0, 0, 0, 0, 133, 135, + 137, 139, 0, 91, 0, 0, 89, 0, 0, 117, + 0, 62, 104, 0, 0, 0, 0, 0, 0, 0, + 0, 119, 0, 0, 0, 158, 0, 0, 0, 0, + 152, 0, 0, 99, 64, 0, 69, 73, 29, 31, + 75, 0, 0, 0, 0, 84, 0, 0, 0, 77, + 79, 106, 0, 71, 0, 66, 154, 0, 156, 114, + 116, 338, 0, 0, 3, 5, 6, 7, 8, 0, + 339, 337, 332, 0, 141, 215, 36, 211, 35, 0, + 0, 0, 0, 131, 0, 142, 33, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 164, 159, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 143, 144, 145, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 168, 60, 168, 58, 59, 61, 0, 0, 333, 0, + 0, 320, 134, 240, 136, 247, 138, 140, 0, 299, + 92, 272, 90, 25, 87, 118, 38, 63, 105, 109, + 112, 122, 97, 0, 0, 269, 268, 120, 94, 0, + 0, 0, 0, 161, 150, 153, 147, 102, 100, 277, + 65, 27, 70, 303, 74, 0, 30, 0, 32, 76, + 41, 44, 47, 50, 85, 78, 80, 107, 125, 72, + 23, 168, 256, 155, 83, 260, 157, 115, 0, 0, + 0, 328, 130, 214, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 216, 210, 0, 212, 0, + 0, 0, 324, 132, 0, 0, 0, 21, 0, 52, + 205, 55, 53, 57, 0, 0, 0, 0, 0, 0, + 0, 0, 176, 0, 0, 171, 172, 173, 190, 169, + 177, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 213, 319, 0, 321, 239, 0, + 0, 241, 246, 250, 249, 248, 0, 298, 301, 300, + 271, 0, 273, 0, 0, 265, 0, 0, 276, 0, + 278, 302, 0, 0, 305, 304, 290, 0, 294, 0, + 24, 0, 255, 0, 257, 259, 262, 261, 174, 175, + 0, 0, 0, 327, 0, 329, 233, 225, 223, 219, + 221, 217, 227, 229, 231, 235, 237, 322, 245, 0, + 323, 326, 325, 0, 0, 22, 0, 204, 0, 206, + 0, 307, 309, 0, 291, 0, 295, 0, 68, 258, + 200, 202, 198, 201, 199, 192, 193, 194, 195, 196, + 0, 197, 203, 191, 188, 189, 185, 187, 186, 179, + 180, 181, 182, 183, 0, 184, 178, 127, 0, 330, + 0, 0, 274, 0, 0, 0, 0, 334, 0, 0, + 0, 207, 283, 281, 0, 0, 312, 306, 292, 0, + 296, 0, 167, 166, 0, 0, 252, 244, 275, 0, + 0, 14, 335, 336, 270, 209, 208, 0, 0, 308, + 316, 310, 0, 293, 297, 128, 0, 0, 0, 0, + 16, 0, 282, 0, 284, 0, 311, 314, 313, 0, + 251, 0, 253, 0, 18, 165, 0, 315, 318, 317, + 0, 254, 20, 0, 331, 0, 289, +}; +static const YYINT yydgoto[] = { 1, + 73, 85, 74, 82, 419, 422, 156, 152, 2, 75, + 76, 77, 78, 79, 171, 415, 441, 460, 474, 315, + 269, 207, 129, 209, 130, 89, 87, 102, 132, 133, + 134, 135, 262, 191, 193, 103, 201, 125, 146, 229, + 332, 127, 144, 205, 128, 131, 140, 141, 148, 136, + 100, 173, 98, 95, 114, 108, 124, 123, 104, 142, + 105, 106, 150, 101, 113, 107, 143, 233, 435, 158, + 254, 169, 163, 90, 165, 91, 167, 92, 93, 122, + 120, 121, 224, 147, 227, 149, 342, 341, 280, 407, + 394, 318, 370, 161, 249, 160, 246, 251, 302, 438, + 411, 252, 306, 458, 473, 271, 335, 272, 338, 111, + 259, 112, 256, 313, 265, 321, 424, 371, 449, 465, + 255, 310, 266, 326, 428, 374, 425, 452, 426, 453, + 469, 466, 480, 250, 298, 307, 363, 283, 346, +}; +static const YYINT yysindex[] = { 0, + 0, 3222, 0, -355, -280, -303, -204, -190, 0, 0, + 0, 0, -355, 0, -303, -280, 0, -355, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -355, -355, 0, + 0, 0, 0, -355, -355, 0, -280, -355, -355, 0, + 0, 0, 0, 0, 0, -355, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -303, -303, -303, 0, + 0, 0, 0, 0, -355, 0, 0, 0, 0, 0, + 0, 0, -261, -271, 0, 0, 0, 0, 0, -196, + 0, 0, 0, -355, 0, 0, 0, 0, 0, -189, + -180, -179, -180, 0, -178, 0, 0, -176, -280, -178, + -178, -178, -178, -178, -178, -178, -178, -178, -239, -238, + -172, -178, -178, -178, -249, -211, 0, 0, -355, -178, + -178, -178, -178, -178, -163, -280, -178, -160, -159, -157, + -178, -178, -178, -178, -178, -178, 0, 0, 0, -178, + -178, -178, -178, -178, -355, -144, -139, -178, -123, -178, + 0, 0, 0, 0, 0, 0, -355, -119, 0, 44, + -235, 0, 0, 0, 0, 0, 0, 0, -108, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -175, -156, 0, 0, 0, 0, -303, + -85, -303, -85, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, -355, 0, -355, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 45, 91, + -129, 0, 0, 0, -355, -355, -355, -355, -355, -355, + -355, -355, -355, -355, -355, 0, 0, -355, 0, -250, + -219, -252, 0, 0, -246, -245, -280, 0, -243, 0, + 0, 0, 0, 0, -242, -248, -241, -240, -178, -21, + -230, -229, 0, -280, -280, 0, 0, 0, 0, 0, + 0, -355, -222, -355, -355, -355, -355, -355, -355, -355, + -355, -355, -355, -355, 0, 0, -355, 0, 0, -355, + -355, 0, 0, 0, 0, 0, -247, 0, 0, 0, + 0, -355, 0, -280, -178, 0, -152, -209, 0, 0, + 0, 0, -355, -355, 0, 0, 0, -220, 0, -214, + 0, -77, 0, -355, 0, 0, 0, 0, 0, 0, + -91, -195, -78, 0, -227, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, -296, -355, 0, -225, 0, -244, 0, + -74, 0, 0, -73, 0, -210, 0, -202, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + -303, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -303, 0, 0, 0, -355, 0, + -72, -280, 0, -355, -178, -280, -280, 0, -280, -303, + -303, 0, 0, 0, -73, -69, 0, 0, 0, -68, + 0, -67, 0, 0, -119, -111, 0, 0, 0, -355, + -178, 0, 0, 0, 0, 0, 0, 193, -201, 0, + 0, 0, -200, 0, 0, 0, -355, -194, 0, -178, + 0, -303, 0, -355, 0, -193, 0, 0, 0, -66, + 0, -355, 0, -178, 0, 0, -355, 0, 0, 0, + -303, 0, 0, -355, 0, -355, 0, +}; +static const YYINT yyrindex[] = { 0, + 0, 195, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 2262, 0, 0, 229, 0, + 336, 0, 0, 443, 550, 657, 764, 0, 0, 871, + 978, 0, 1085, 0, 0, 0, 0, 2903, 3009, 1192, + 0, 1299, 1406, 0, 0, 0, 0, 0, 0, 0, + 0, 1513, 1620, 1727, 1834, 0, 0, 0, 0, 0, + 0, 0, 1941, 0, 0, 0, 0, 2048, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, -64, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 2369, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -61, -60, 0, 0, 3116, 0, + 0, 0, 0, 0, 0, 2476, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, -58, + 0, 0, 0, 0, -79, 0, 0, 0, 0, 0, + 0, 0, 0, 113, 119, 3327, 3333, 3351, 3357, 3414, + 3420, 3438, 3444, 3501, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, -253, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, -231, + 0, 0, 0, 0, 2583, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2689, 0, 0, 0, 0, 0, 0, + 3492, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 2796, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 2155, 0, + 0, 0, 0, -57, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, -53, 0, 0, 0, + 0, 0, 0, -52, 0, -45, 0, +}; +static const YYINT yygindex[] = { 0, + -4, -12, -120, -15, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 23, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 21, 0, 0, 0, 0, 0, 0, -151, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, -216, 0, 0, + 0, 0, 0, 0, 127, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, -203, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, +}; +#define YYTABLESIZE 3815 +static const YYINT yytable[] = { 80, + 97, 230, 96, 280, 279, 303, 72, 296, 94, 322, + 361, 308, 311, 99, 316, 319, 327, 329, 83, 84, + 81, 117, 247, 109, 110, 243, 242, 333, 336, 115, + 116, 409, 153, 118, 119, 344, 81, 375, 299, 416, + 417, 126, 151, 377, 137, 138, 139, 429, 368, 323, + 83, 84, 86, 5, 190, 431, 463, 467, 420, 421, + 145, 155, 157, 471, 478, 72, 88, 162, 304, 154, + 270, 395, 396, 248, 83, 84, 164, 166, 170, 159, + 172, 397, 398, 174, 186, 324, 184, 185, 242, 242, + 72, 81, 192, 200, 83, 84, 204, 206, 399, 208, + 300, 301, 400, 401, 402, 403, 404, 405, 279, 72, + 202, 72, 222, 72, 194, 72, 72, 223, 72, 72, + 72, 72, 175, 176, 177, 178, 179, 180, 181, 182, + 183, 72, 72, 226, 187, 188, 189, 232, 406, 72, + 221, 72, 195, 196, 197, 198, 199, 72, 253, 203, + 257, 72, 231, 210, 211, 212, 213, 214, 215, 72, + 72, 72, 216, 217, 218, 219, 220, 72, 72, 258, + 225, 261, 228, 282, 367, 381, 382, 260, 170, 263, + 379, 408, 423, 427, 437, 383, 384, 451, 170, 454, + 455, 457, 129, 481, 1, 54, 56, 369, 170, 67, + 285, 267, 385, 268, 286, 287, 386, 387, 388, 389, + 390, 391, 288, 264, 170, 170, 170, 170, 456, 168, + 0, 450, 0, 170, 0, 0, 0, 0, 88, 0, + 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, + 294, 314, 392, 295, 0, 297, 273, 305, 0, 0, + 309, 312, 0, 0, 317, 0, 274, 0, 339, 340, + 320, 325, 328, 330, 0, 0, 334, 337, 0, 448, + 72, 0, 275, 276, 277, 278, 0, 343, 345, 347, + 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, + 0, 331, 358, 0, 362, 359, 360, 0, 365, 0, + 0, 234, 0, 0, 0, 235, 236, 364, 0, 0, + 0, 0, 273, 0, 0, 0, 0, 0, 372, 373, + 237, 0, 274, 376, 0, 378, 0, 0, 0, 380, + 0, 0, 410, 0, 0, 39, 393, 366, 275, 276, + 277, 278, 238, 239, 0, 240, 0, 279, 413, 0, + 0, 418, 0, 241, 242, 243, 244, 245, 273, 412, + 414, 0, 0, 0, 0, 0, 0, 0, 274, 0, + 234, 430, 0, 432, 234, 234, 226, 0, 433, 0, + 226, 226, 0, 0, 275, 276, 277, 278, 0, 234, + 0, 0, 434, 281, 0, 226, 439, 0, 0, 0, + 443, 444, 0, 445, 436, 0, 0, 446, 447, 440, + 0, 234, 234, 0, 234, 0, 0, 226, 226, 0, + 226, 0, 234, 234, 234, 234, 234, 0, 226, 226, + 226, 226, 226, 0, 0, 459, 0, 442, 0, 0, + 0, 0, 110, 0, 464, 0, 0, 0, 468, 476, + 0, 0, 470, 472, 0, 0, 0, 0, 0, 477, + 273, 479, 0, 461, 0, 0, 0, 482, 485, 0, + 274, 0, 484, 0, 0, 0, 0, 0, 0, 486, + 0, 487, 475, 0, 88, 86, 275, 276, 277, 278, + 88, 88, 88, 0, 0, 462, 483, 88, 88, 88, + 88, 88, 88, 88, 88, 0, 0, 88, 88, 88, + 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, + 88, 88, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 88, 88, 88, 88, 0, 0, 0, + 0, 0, 0, 88, 88, 0, 88, 88, 0, 113, + 0, 0, 88, 88, 0, 0, 88, 88, 88, 0, + 88, 88, 0, 88, 88, 88, 88, 88, 88, 88, + 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, + 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, + 88, 39, 37, 0, 0, 0, 0, 39, 39, 39, + 0, 0, 0, 0, 39, 39, 39, 39, 39, 39, + 39, 39, 0, 0, 39, 39, 39, 39, 39, 39, + 39, 39, 39, 39, 39, 39, 39, 39, 39, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 39, 39, 39, 39, 0, 0, 0, 0, 0, 0, + 39, 39, 0, 39, 39, 0, 123, 0, 0, 39, + 39, 0, 0, 39, 39, 39, 0, 39, 39, 0, + 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, + 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, + 39, 39, 39, 39, 39, 39, 39, 39, 110, 108, + 0, 0, 0, 0, 110, 110, 110, 0, 0, 0, + 0, 110, 110, 110, 110, 110, 110, 110, 110, 0, + 0, 110, 110, 110, 110, 110, 110, 110, 110, 110, + 110, 110, 110, 110, 110, 110, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 110, 110, 110, + 110, 0, 0, 0, 0, 0, 0, 110, 110, 0, + 110, 110, 0, 98, 0, 0, 110, 110, 0, 0, + 110, 110, 110, 0, 110, 110, 0, 110, 110, 110, + 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, + 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, + 110, 110, 110, 110, 110, 113, 111, 0, 0, 0, + 0, 113, 113, 113, 0, 0, 0, 0, 113, 113, + 113, 113, 113, 113, 113, 113, 0, 0, 113, 113, + 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, + 113, 113, 113, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 113, 113, 113, 113, 0, 0, + 0, 0, 0, 0, 113, 113, 0, 113, 113, 0, + 263, 0, 0, 113, 113, 0, 0, 113, 113, 113, + 0, 113, 113, 0, 113, 113, 113, 113, 113, 113, + 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, + 113, 113, 113, 113, 113, 113, 113, 113, 113, 113, + 113, 113, 123, 121, 0, 0, 0, 0, 123, 123, + 123, 0, 0, 0, 0, 123, 123, 123, 123, 123, + 123, 123, 123, 0, 0, 123, 123, 123, 123, 123, + 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 123, 123, 123, 123, 0, 0, 0, 0, 0, + 0, 123, 123, 0, 123, 123, 0, 266, 0, 0, + 123, 123, 0, 0, 123, 123, 123, 0, 123, 123, + 0, 123, 123, 123, 123, 123, 123, 123, 123, 123, + 123, 123, 123, 123, 123, 123, 123, 123, 123, 123, + 123, 123, 123, 123, 123, 123, 123, 123, 123, 98, + 96, 0, 0, 0, 0, 98, 98, 98, 0, 0, + 0, 0, 98, 98, 98, 98, 98, 98, 98, 98, + 0, 0, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 98, 98, + 98, 98, 0, 0, 0, 0, 0, 0, 98, 98, + 0, 98, 98, 0, 95, 0, 0, 98, 98, 0, + 0, 98, 98, 98, 0, 98, 98, 0, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 98, 98, 98, 98, + 98, 98, 98, 98, 98, 98, 263, 264, 0, 0, + 0, 0, 263, 263, 263, 0, 0, 0, 0, 263, + 263, 263, 263, 263, 263, 263, 263, 0, 0, 263, + 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, + 263, 263, 263, 263, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 263, 263, 263, 263, 0, + 0, 0, 0, 0, 0, 263, 263, 0, 263, 263, + 0, 151, 0, 0, 263, 263, 0, 0, 263, 263, + 263, 0, 263, 263, 0, 263, 263, 263, 263, 263, + 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, + 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, + 263, 263, 263, 266, 267, 0, 0, 0, 0, 266, + 266, 266, 0, 0, 0, 0, 266, 266, 266, 266, + 266, 266, 266, 266, 0, 0, 266, 266, 266, 266, + 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, + 266, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 266, 266, 266, 266, 0, 0, 0, 0, + 0, 0, 266, 266, 0, 266, 266, 0, 148, 0, + 0, 266, 266, 0, 0, 266, 266, 266, 0, 266, + 266, 0, 266, 266, 266, 266, 266, 266, 266, 266, + 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, + 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, + 95, 93, 0, 0, 0, 0, 95, 95, 95, 0, + 0, 0, 0, 95, 95, 95, 95, 95, 95, 95, + 95, 0, 0, 95, 95, 95, 95, 95, 95, 95, + 95, 95, 95, 95, 95, 95, 95, 95, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 95, + 95, 95, 95, 0, 0, 0, 0, 0, 0, 95, + 95, 0, 95, 95, 0, 103, 0, 0, 95, 95, + 0, 0, 95, 95, 95, 0, 95, 95, 0, 95, + 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, + 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, + 95, 95, 95, 95, 95, 95, 95, 151, 149, 0, + 0, 0, 0, 151, 151, 151, 0, 0, 0, 0, + 151, 151, 151, 151, 151, 151, 151, 151, 0, 0, + 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, + 151, 151, 151, 151, 151, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 151, 151, 151, 151, + 0, 0, 0, 0, 0, 0, 151, 151, 0, 151, + 151, 0, 42, 0, 0, 151, 151, 0, 0, 151, + 151, 151, 0, 151, 151, 0, 151, 151, 151, 151, + 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, + 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, + 151, 151, 151, 151, 148, 146, 0, 0, 0, 0, + 148, 148, 148, 0, 0, 0, 0, 148, 148, 148, + 148, 148, 148, 148, 148, 0, 0, 148, 148, 148, + 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, + 148, 148, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 148, 148, 148, 148, 0, 0, 0, + 0, 0, 0, 148, 148, 0, 148, 148, 0, 45, + 0, 0, 148, 148, 0, 0, 148, 148, 148, 0, + 148, 148, 0, 148, 148, 148, 148, 148, 148, 148, + 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, + 148, 148, 148, 148, 148, 148, 148, 148, 148, 148, + 148, 103, 101, 0, 0, 0, 0, 103, 103, 103, + 0, 0, 0, 0, 103, 103, 103, 103, 103, 103, + 103, 103, 0, 0, 103, 103, 103, 103, 103, 103, + 103, 103, 103, 103, 103, 103, 103, 103, 103, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 103, 103, 103, 103, 0, 0, 0, 0, 0, 0, + 103, 103, 0, 103, 103, 0, 48, 0, 0, 103, + 103, 0, 0, 103, 103, 103, 0, 103, 103, 0, + 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, + 103, 103, 103, 103, 103, 103, 103, 103, 103, 103, + 103, 103, 103, 103, 103, 103, 103, 103, 42, 40, + 0, 0, 0, 0, 42, 42, 42, 0, 0, 0, + 0, 42, 42, 42, 42, 42, 42, 42, 42, 0, + 0, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 42, 42, 42, + 42, 0, 0, 0, 0, 0, 0, 42, 42, 0, + 42, 42, 0, 51, 0, 0, 42, 42, 0, 0, + 42, 42, 42, 0, 42, 42, 0, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, + 42, 42, 42, 42, 42, 45, 43, 0, 0, 0, + 0, 45, 45, 45, 0, 0, 0, 0, 45, 45, + 45, 45, 45, 45, 45, 45, 0, 0, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 45, 45, 45, 45, 0, 0, + 0, 0, 0, 0, 45, 45, 0, 45, 45, 0, + 126, 0, 0, 45, 45, 0, 0, 45, 45, 45, + 0, 45, 45, 0, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 48, 46, 0, 0, 0, 0, 48, 48, + 48, 0, 0, 0, 0, 48, 48, 48, 48, 48, + 48, 48, 48, 0, 0, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 48, 48, 48, 48, 0, 0, 0, 0, 0, + 0, 48, 48, 0, 48, 48, 0, 81, 0, 0, + 48, 48, 0, 0, 48, 48, 48, 0, 48, 48, + 0, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 51, + 49, 0, 0, 0, 0, 51, 51, 51, 0, 0, + 0, 0, 51, 51, 51, 51, 51, 51, 51, 51, + 0, 0, 51, 51, 51, 51, 51, 51, 51, 51, + 51, 51, 51, 51, 51, 51, 51, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 51, 51, + 51, 51, 0, 0, 0, 0, 0, 0, 51, 51, + 0, 51, 51, 0, 12, 0, 0, 51, 51, 0, + 0, 51, 51, 51, 0, 51, 51, 0, 51, 51, + 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, + 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, + 51, 51, 51, 51, 51, 51, 126, 124, 0, 0, + 0, 0, 126, 126, 126, 0, 0, 0, 0, 126, + 126, 126, 126, 126, 126, 126, 126, 0, 0, 126, + 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, + 126, 126, 126, 126, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 126, 126, 126, 126, 0, + 0, 0, 0, 0, 0, 126, 126, 0, 126, 126, + 0, 34, 0, 0, 126, 126, 0, 0, 126, 126, + 126, 0, 126, 126, 0, 126, 126, 126, 126, 126, + 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, + 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, + 126, 126, 126, 81, 82, 0, 0, 0, 0, 81, + 81, 81, 0, 0, 0, 0, 81, 81, 81, 81, + 81, 81, 81, 81, 0, 0, 81, 81, 81, 81, + 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, + 81, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 81, 81, 81, 81, 0, 0, 0, 0, + 0, 0, 81, 81, 0, 81, 81, 0, 26, 0, + 0, 81, 81, 0, 0, 81, 81, 81, 0, 81, + 81, 0, 81, 81, 81, 81, 81, 81, 81, 81, + 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, + 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, + 12, 19, 0, 0, 0, 0, 12, 12, 12, 0, + 0, 0, 0, 12, 12, 12, 12, 12, 12, 12, + 12, 0, 0, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, + 12, 12, 12, 0, 0, 0, 0, 0, 0, 12, + 12, 0, 12, 12, 0, 28, 0, 0, 12, 12, + 0, 0, 12, 12, 12, 0, 12, 12, 0, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 34, 0, 0, + 0, 0, 0, 34, 34, 34, 0, 0, 0, 0, + 34, 34, 34, 34, 34, 34, 34, 34, 0, 0, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 34, 34, 34, 34, + 0, 0, 0, 0, 0, 0, 34, 34, 0, 34, + 34, 0, 9, 0, 0, 34, 34, 0, 0, 34, + 34, 34, 0, 34, 34, 0, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 26, 0, 0, 0, 0, 0, + 26, 26, 26, 0, 0, 0, 0, 26, 26, 26, + 26, 26, 26, 26, 26, 0, 0, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 26, 26, 26, 26, 0, 0, 0, + 0, 0, 0, 26, 26, 0, 26, 26, 10, 0, + 0, 0, 26, 26, 0, 0, 26, 26, 26, 0, + 26, 26, 0, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, + 26, 28, 0, 0, 0, 0, 0, 28, 28, 28, + 0, 0, 0, 0, 28, 28, 28, 28, 28, 28, + 28, 28, 0, 0, 28, 28, 28, 28, 28, 28, + 28, 28, 28, 28, 28, 28, 28, 28, 28, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 28, 28, 28, 28, 0, 0, 0, 0, 0, 0, + 28, 28, 0, 28, 28, 11, 0, 0, 0, 28, + 28, 0, 0, 28, 28, 28, 0, 28, 28, 0, + 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, + 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, + 28, 28, 28, 28, 28, 28, 28, 28, 9, 13, + 0, 0, 0, 0, 9, 9, 9, 0, 0, 0, + 0, 9, 9, 9, 9, 9, 9, 9, 9, 0, + 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, + 9, 0, 0, 0, 0, 0, 0, 9, 9, 0, + 9, 9, 160, 0, 0, 0, 9, 9, 0, 0, + 9, 9, 9, 0, 9, 9, 0, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 10, 15, 0, 0, 0, 0, + 10, 10, 10, 0, 0, 0, 0, 10, 10, 10, + 10, 10, 10, 10, 10, 0, 0, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 10, 10, 10, 10, 0, 0, 0, + 0, 0, 0, 10, 10, 0, 10, 10, 163, 0, + 0, 0, 10, 10, 0, 0, 10, 10, 10, 0, + 10, 10, 0, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 0, 11, 17, 0, 0, 0, 0, 11, 11, 11, + 0, 0, 0, 0, 11, 11, 11, 11, 11, 11, + 11, 11, 0, 0, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 11, 11, 11, 11, 0, 0, 0, 0, 0, 0, + 11, 11, 0, 11, 11, 162, 0, 0, 0, 11, + 11, 0, 0, 11, 11, 11, 0, 11, 11, 0, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 0, 160, 0, + 0, 0, 0, 0, 160, 160, 160, 0, 0, 0, + 0, 160, 160, 160, 160, 160, 160, 160, 160, 0, + 0, 160, 160, 160, 160, 160, 160, 160, 160, 160, + 160, 160, 160, 160, 160, 160, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 160, 160, 160, + 160, 0, 0, 0, 0, 0, 0, 160, 160, 0, + 160, 160, 0, 0, 0, 0, 160, 160, 0, 0, + 160, 160, 160, 0, 160, 160, 0, 160, 160, 160, + 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, + 160, 160, 160, 160, 160, 160, 160, 160, 160, 160, + 160, 160, 160, 160, 163, 0, 0, 0, 0, 0, + 163, 163, 163, 0, 0, 0, 0, 163, 163, 163, + 163, 163, 163, 163, 163, 0, 0, 163, 163, 163, + 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, + 163, 163, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 163, 163, 163, 163, 0, 0, 0, + 0, 0, 0, 163, 163, 0, 163, 163, 0, 0, + 0, 0, 163, 163, 0, 0, 163, 163, 163, 0, + 163, 163, 0, 163, 163, 163, 163, 163, 163, 163, + 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, + 163, 163, 163, 163, 163, 163, 163, 163, 163, 163, + 0, 162, 0, 0, 0, 0, 0, 162, 162, 162, + 0, 0, 0, 0, 162, 162, 162, 162, 162, 162, + 162, 162, 0, 0, 162, 162, 162, 162, 162, 162, + 162, 162, 162, 162, 162, 162, 162, 162, 162, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 162, 162, 162, 162, 0, 0, 0, 0, 0, 0, + 162, 162, 0, 162, 162, 0, 0, 0, 0, 162, + 162, 0, 0, 162, 162, 162, 0, 162, 162, 0, + 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, + 162, 162, 162, 162, 162, 162, 162, 162, 162, 162, + 162, 162, 162, 162, 162, 162, 162, 3, 0, 0, + 0, 0, 0, 4, 5, 6, 0, 0, 0, 0, + 7, 8, 9, 10, 11, 12, 13, 14, 0, 0, + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, + 25, 26, 27, 28, 29, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 30, 31, 32, 33, + 0, 0, 0, 0, 0, 0, 34, 35, 0, 36, + 37, 0, 0, 0, 0, 38, 39, 0, 0, 40, + 41, 42, 0, 43, 44, 0, 45, 46, 47, 48, + 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, + 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, + 69, 70, 71, 72, 224, 0, 0, 0, 224, 224, + 220, 0, 0, 0, 220, 220, 0, 0, 0, 0, + 0, 0, 0, 224, 0, 0, 0, 0, 222, 220, + 0, 0, 222, 222, 218, 0, 0, 0, 218, 218, + 0, 0, 0, 0, 0, 224, 224, 222, 224, 0, + 0, 220, 220, 218, 220, 0, 224, 224, 224, 224, + 224, 0, 220, 220, 220, 220, 220, 0, 0, 222, + 222, 0, 222, 0, 0, 218, 218, 0, 218, 0, + 222, 222, 222, 222, 222, 0, 218, 218, 218, 218, + 218, 228, 0, 0, 0, 228, 228, 230, 0, 0, + 0, 230, 230, 0, 0, 0, 0, 0, 0, 0, + 228, 0, 0, 0, 0, 232, 230, 0, 0, 232, + 232, 236, 0, 0, 0, 236, 236, 0, 0, 0, + 0, 0, 228, 228, 232, 228, 0, 0, 230, 230, + 236, 230, 0, 228, 228, 228, 228, 228, 0, 230, + 230, 230, 230, 230, 0, 0, 232, 232, 0, 232, + 0, 0, 236, 236, 0, 236, 0, 232, 232, 232, + 232, 232, 0, 236, 236, 236, 236, 236, 238, 168, + 0, 0, 238, 238, 0, 0, 0, 0, 0, 168, + 0, 0, 0, 0, 0, 0, 0, 238, 0, 0, + 0, 0, 0, 0, 0, 168, 168, 168, 168, 0, + 0, 0, 0, 0, 168, 0, 0, 0, 0, 238, + 238, 0, 238, 0, 0, 0, 0, 0, 0, 0, + 238, 238, 238, 238, 238, +}; +static const YYINT yycheck[] = { 4, + 16, 153, 15, 257, 258, 258, 362, 258, 13, 258, + 258, 258, 258, 18, 258, 258, 258, 258, 322, 323, + 317, 37, 258, 28, 29, 257, 258, 258, 258, 34, + 35, 259, 304, 38, 39, 258, 317, 258, 258, 265, + 266, 46, 304, 258, 57, 58, 59, 258, 258, 298, + 322, 323, 257, 263, 304, 258, 258, 258, 303, 304, + 65, 74, 259, 258, 258, 362, 257, 257, 321, 74, + 222, 267, 268, 309, 322, 323, 257, 257, 257, 84, + 257, 277, 278, 99, 257, 334, 326, 326, 320, 321, + 362, 317, 304, 257, 322, 323, 257, 257, 294, 257, + 320, 321, 298, 299, 300, 301, 302, 303, 362, 362, + 126, 362, 257, 362, 119, 362, 362, 257, 362, 362, + 362, 362, 100, 101, 102, 103, 104, 105, 106, 107, + 108, 362, 362, 257, 112, 113, 114, 257, 334, 362, + 145, 362, 120, 121, 122, 123, 124, 362, 257, 127, + 326, 362, 157, 131, 132, 133, 134, 135, 136, 362, + 362, 362, 140, 141, 142, 143, 144, 362, 362, 326, + 148, 257, 150, 303, 327, 267, 268, 190, 258, 192, + 258, 260, 257, 257, 257, 277, 278, 257, 268, 258, + 258, 303, 257, 260, 0, 257, 257, 318, 278, 258, + 258, 206, 294, 208, 258, 258, 298, 299, 300, 301, + 302, 303, 258, 193, 294, 295, 296, 297, 435, 93, + -1, 425, -1, 303, -1, -1, -1, -1, 0, -1, + 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, + 245, 257, 334, 248, -1, 250, 268, 252, -1, -1, + 255, 256, -1, -1, 259, -1, 278, -1, 274, 275, + 265, 266, 267, 268, -1, -1, 271, 272, -1, 421, + 362, -1, 294, 295, 296, 297, -1, 282, 283, 284, + 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, + -1, 269, 297, -1, 307, 300, 301, -1, 314, -1, + -1, 258, -1, -1, -1, 262, 263, 312, -1, -1, + -1, -1, 268, -1, -1, -1, -1, -1, 323, 324, + 277, -1, 278, 328, -1, 330, -1, -1, -1, 334, + -1, -1, 345, -1, -1, 0, 341, 315, 294, 295, + 296, 297, 299, 300, -1, 302, -1, 303, 364, -1, + -1, 367, -1, 310, 311, 312, 313, 314, 268, 364, + 365, -1, -1, -1, -1, -1, -1, -1, 278, -1, + 258, 376, -1, 378, 262, 263, 258, -1, 391, -1, + 262, 263, -1, -1, 294, 295, 296, 297, -1, 277, + -1, -1, 405, 303, -1, 277, 412, -1, -1, -1, + 416, 417, -1, 419, 409, -1, -1, 420, 421, 414, + -1, 299, 300, -1, 302, -1, -1, 299, 300, -1, + 302, -1, 310, 311, 312, 313, 314, -1, 310, 311, + 312, 313, 314, -1, -1, 440, -1, 415, -1, -1, + -1, -1, 0, -1, 449, -1, -1, -1, 453, 462, + -1, -1, 457, 458, -1, -1, -1, -1, -1, 464, + 268, 466, -1, 441, -1, -1, -1, 472, 481, -1, + 278, -1, 477, -1, -1, -1, -1, -1, -1, 484, + -1, 486, 460, -1, 256, 257, 294, 295, 296, 297, + 262, 263, 264, -1, -1, 303, 474, 269, 270, 271, + 272, 273, 274, 275, 276, -1, -1, 279, 280, 281, + 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, + 292, 293, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 305, 306, 307, 308, -1, -1, -1, + -1, -1, -1, 315, 316, -1, 318, 319, -1, 0, + -1, -1, 324, 325, -1, -1, 328, 329, 330, -1, + 332, 333, -1, 335, 336, 337, 338, 339, 340, 341, + 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, + 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, + 362, 256, 257, -1, -1, -1, -1, 262, 263, 264, + -1, -1, -1, -1, 269, 270, 271, 272, 273, 274, + 275, 276, -1, -1, 279, 280, 281, 282, 283, 284, + 285, 286, 287, 288, 289, 290, 291, 292, 293, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 305, 306, 307, 308, -1, -1, -1, -1, -1, -1, + 315, 316, -1, 318, 319, -1, 0, -1, -1, 324, + 325, -1, -1, 328, 329, 330, -1, 332, 333, -1, + 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, + 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 358, 359, 360, 361, 362, 256, 257, + -1, -1, -1, -1, 262, 263, 264, -1, -1, -1, + -1, 269, 270, 271, 272, 273, 274, 275, 276, -1, + -1, 279, 280, 281, 282, 283, 284, 285, 286, 287, + 288, 289, 290, 291, 292, 293, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 305, 306, 307, + 308, -1, -1, -1, -1, -1, -1, 315, 316, -1, + 318, 319, -1, 0, -1, -1, 324, 325, -1, -1, + 328, 329, 330, -1, 332, 333, -1, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, + 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, + 358, 359, 360, 361, 362, 256, 257, -1, -1, -1, + -1, 262, 263, 264, -1, -1, -1, -1, 269, 270, + 271, 272, 273, 274, 275, 276, -1, -1, 279, 280, + 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, + 291, 292, 293, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 305, 306, 307, 308, -1, -1, + -1, -1, -1, -1, 315, 316, -1, 318, 319, -1, + 0, -1, -1, 324, 325, -1, -1, 328, 329, 330, + -1, 332, 333, -1, 335, 336, 337, 338, 339, 340, + 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, + 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 256, 257, -1, -1, -1, -1, 262, 263, + 264, -1, -1, -1, -1, 269, 270, 271, 272, 273, + 274, 275, 276, -1, -1, 279, 280, 281, 282, 283, + 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 305, 306, 307, 308, -1, -1, -1, -1, -1, + -1, 315, 316, -1, 318, 319, -1, 0, -1, -1, + 324, 325, -1, -1, 328, 329, 330, -1, 332, 333, + -1, 335, 336, 337, 338, 339, 340, 341, 342, 343, + 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 357, 358, 359, 360, 361, 362, 256, + 257, -1, -1, -1, -1, 262, 263, 264, -1, -1, + -1, -1, 269, 270, 271, 272, 273, 274, 275, 276, + -1, -1, 279, 280, 281, 282, 283, 284, 285, 286, + 287, 288, 289, 290, 291, 292, 293, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 305, 306, + 307, 308, -1, -1, -1, -1, -1, -1, 315, 316, + -1, 318, 319, -1, 0, -1, -1, 324, 325, -1, + -1, 328, 329, 330, -1, 332, 333, -1, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, + 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, + 357, 358, 359, 360, 361, 362, 256, 257, -1, -1, + -1, -1, 262, 263, 264, -1, -1, -1, -1, 269, + 270, 271, 272, 273, 274, 275, 276, -1, -1, 279, + 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, + 290, 291, 292, 293, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 305, 306, 307, 308, -1, + -1, -1, -1, -1, -1, 315, 316, -1, 318, 319, + -1, 0, -1, -1, 324, 325, -1, -1, 328, 329, + 330, -1, 332, 333, -1, 335, 336, 337, 338, 339, + 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, + 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, + 360, 361, 362, 256, 257, -1, -1, -1, -1, 262, + 263, 264, -1, -1, -1, -1, 269, 270, 271, 272, + 273, 274, 275, 276, -1, -1, 279, 280, 281, 282, + 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, + 293, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 305, 306, 307, 308, -1, -1, -1, -1, + -1, -1, 315, 316, -1, 318, 319, -1, 0, -1, + -1, 324, 325, -1, -1, 328, 329, 330, -1, 332, + 333, -1, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, + 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, + 256, 257, -1, -1, -1, -1, 262, 263, 264, -1, + -1, -1, -1, 269, 270, 271, 272, 273, 274, 275, + 276, -1, -1, 279, 280, 281, 282, 283, 284, 285, + 286, 287, 288, 289, 290, 291, 292, 293, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 305, + 306, 307, 308, -1, -1, -1, -1, -1, -1, 315, + 316, -1, 318, 319, -1, 0, -1, -1, 324, 325, + -1, -1, 328, 329, 330, -1, 332, 333, -1, 335, + 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, + 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, + 356, 357, 358, 359, 360, 361, 362, 256, 257, -1, + -1, -1, -1, 262, 263, 264, -1, -1, -1, -1, + 269, 270, 271, 272, 273, 274, 275, 276, -1, -1, + 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, + 289, 290, 291, 292, 293, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 305, 306, 307, 308, + -1, -1, -1, -1, -1, -1, 315, 316, -1, 318, + 319, -1, 0, -1, -1, 324, 325, -1, -1, 328, + 329, 330, -1, 332, 333, -1, 335, 336, 337, 338, + 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, + 359, 360, 361, 362, 256, 257, -1, -1, -1, -1, + 262, 263, 264, -1, -1, -1, -1, 269, 270, 271, + 272, 273, 274, 275, 276, -1, -1, 279, 280, 281, + 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, + 292, 293, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 305, 306, 307, 308, -1, -1, -1, + -1, -1, -1, 315, 316, -1, 318, 319, -1, 0, + -1, -1, 324, 325, -1, -1, 328, 329, 330, -1, + 332, 333, -1, 335, 336, 337, 338, 339, 340, 341, + 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, + 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, + 362, 256, 257, -1, -1, -1, -1, 262, 263, 264, + -1, -1, -1, -1, 269, 270, 271, 272, 273, 274, + 275, 276, -1, -1, 279, 280, 281, 282, 283, 284, + 285, 286, 287, 288, 289, 290, 291, 292, 293, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 305, 306, 307, 308, -1, -1, -1, -1, -1, -1, + 315, 316, -1, 318, 319, -1, 0, -1, -1, 324, + 325, -1, -1, 328, 329, 330, -1, 332, 333, -1, + 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, + 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 358, 359, 360, 361, 362, 256, 257, + -1, -1, -1, -1, 262, 263, 264, -1, -1, -1, + -1, 269, 270, 271, 272, 273, 274, 275, 276, -1, + -1, 279, 280, 281, 282, 283, 284, 285, 286, 287, + 288, 289, 290, 291, 292, 293, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 305, 306, 307, + 308, -1, -1, -1, -1, -1, -1, 315, 316, -1, + 318, 319, -1, 0, -1, -1, 324, 325, -1, -1, + 328, 329, 330, -1, 332, 333, -1, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, + 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, + 358, 359, 360, 361, 362, 256, 257, -1, -1, -1, + -1, 262, 263, 264, -1, -1, -1, -1, 269, 270, + 271, 272, 273, 274, 275, 276, -1, -1, 279, 280, + 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, + 291, 292, 293, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, 305, 306, 307, 308, -1, -1, + -1, -1, -1, -1, 315, 316, -1, 318, 319, -1, + 0, -1, -1, 324, 325, -1, -1, 328, 329, 330, + -1, 332, 333, -1, 335, 336, 337, 338, 339, 340, + 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, + 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, + 361, 362, 256, 257, -1, -1, -1, -1, 262, 263, + 264, -1, -1, -1, -1, 269, 270, 271, 272, 273, + 274, 275, 276, -1, -1, 279, 280, 281, 282, 283, + 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, 305, 306, 307, 308, -1, -1, -1, -1, -1, + -1, 315, 316, -1, 318, 319, -1, 0, -1, -1, + 324, 325, -1, -1, 328, 329, 330, -1, 332, 333, + -1, 335, 336, 337, 338, 339, 340, 341, 342, 343, + 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, + 354, 355, 356, 357, 358, 359, 360, 361, 362, 256, + 257, -1, -1, -1, -1, 262, 263, 264, -1, -1, + -1, -1, 269, 270, 271, 272, 273, 274, 275, 276, + -1, -1, 279, 280, 281, 282, 283, 284, 285, 286, + 287, 288, 289, 290, 291, 292, 293, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, 305, 306, + 307, 308, -1, -1, -1, -1, -1, -1, 315, 316, + -1, 318, 319, -1, 0, -1, -1, 324, 325, -1, + -1, 328, 329, 330, -1, 332, 333, -1, 335, 336, + 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, + 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, + 357, 358, 359, 360, 361, 362, 256, 257, -1, -1, + -1, -1, 262, 263, 264, -1, -1, -1, -1, 269, + 270, 271, 272, 273, 274, 275, 276, -1, -1, 279, + 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, + 290, 291, 292, 293, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, 305, 306, 307, 308, -1, + -1, -1, -1, -1, -1, 315, 316, -1, 318, 319, + -1, 0, -1, -1, 324, 325, -1, -1, 328, 329, + 330, -1, 332, 333, -1, 335, 336, 337, 338, 339, + 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, + 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, + 360, 361, 362, 256, 257, -1, -1, -1, -1, 262, + 263, 264, -1, -1, -1, -1, 269, 270, 271, 272, + 273, 274, 275, 276, -1, -1, 279, 280, 281, 282, + 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, + 293, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, 305, 306, 307, 308, -1, -1, -1, -1, + -1, -1, 315, 316, -1, 318, 319, -1, 0, -1, + -1, 324, 325, -1, -1, 328, 329, 330, -1, 332, + 333, -1, 335, 336, 337, 338, 339, 340, 341, 342, + 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, + 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, + 256, 257, -1, -1, -1, -1, 262, 263, 264, -1, + -1, -1, -1, 269, 270, 271, 272, 273, 274, 275, + 276, -1, -1, 279, 280, 281, 282, 283, 284, 285, + 286, 287, 288, 289, 290, 291, 292, 293, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, 305, + 306, 307, 308, -1, -1, -1, -1, -1, -1, 315, + 316, -1, 318, 319, -1, 0, -1, -1, 324, 325, + -1, -1, 328, 329, 330, -1, 332, 333, -1, 335, + 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, + 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, + 356, 357, 358, 359, 360, 361, 362, 256, -1, -1, + -1, -1, -1, 262, 263, 264, -1, -1, -1, -1, + 269, 270, 271, 272, 273, 274, 275, 276, -1, -1, + 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, + 289, 290, 291, 292, 293, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 305, 306, 307, 308, + -1, -1, -1, -1, -1, -1, 315, 316, -1, 318, + 319, -1, 0, -1, -1, 324, 325, -1, -1, 328, + 329, 330, -1, 332, 333, -1, 335, 336, 337, 338, + 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, + 359, 360, 361, 362, 256, -1, -1, -1, -1, -1, + 262, 263, 264, -1, -1, -1, -1, 269, 270, 271, + 272, 273, 274, 275, 276, -1, -1, 279, 280, 281, + 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, + 292, 293, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 305, 306, 307, 308, -1, -1, -1, + -1, -1, -1, 315, 316, -1, 318, 319, 0, -1, + -1, -1, 324, 325, -1, -1, 328, 329, 330, -1, + 332, 333, -1, 335, 336, 337, 338, 339, 340, 341, + 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, + 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, + 362, 256, -1, -1, -1, -1, -1, 262, 263, 264, + -1, -1, -1, -1, 269, 270, 271, 272, 273, 274, + 275, 276, -1, -1, 279, 280, 281, 282, 283, 284, + 285, 286, 287, 288, 289, 290, 291, 292, 293, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 305, 306, 307, 308, -1, -1, -1, -1, -1, -1, + 315, 316, -1, 318, 319, 0, -1, -1, -1, 324, + 325, -1, -1, 328, 329, 330, -1, 332, 333, -1, + 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, + 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 358, 359, 360, 361, 362, 256, 257, + -1, -1, -1, -1, 262, 263, 264, -1, -1, -1, + -1, 269, 270, 271, 272, 273, 274, 275, 276, -1, + -1, 279, 280, 281, 282, 283, 284, 285, 286, 287, + 288, 289, 290, 291, 292, 293, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 305, 306, 307, + 308, -1, -1, -1, -1, -1, -1, 315, 316, -1, + 318, 319, 0, -1, -1, -1, 324, 325, -1, -1, + 328, 329, 330, -1, 332, 333, -1, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, + 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, + 358, 359, 360, 361, 256, 257, -1, -1, -1, -1, + 262, 263, 264, -1, -1, -1, -1, 269, 270, 271, + 272, 273, 274, 275, 276, -1, -1, 279, 280, 281, + 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, + 292, 293, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 305, 306, 307, 308, -1, -1, -1, + -1, -1, -1, 315, 316, -1, 318, 319, 0, -1, + -1, -1, 324, 325, -1, -1, 328, 329, 330, -1, + 332, 333, -1, 335, 336, 337, 338, 339, 340, 341, + 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, + 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, + -1, 256, 257, -1, -1, -1, -1, 262, 263, 264, + -1, -1, -1, -1, 269, 270, 271, 272, 273, 274, + 275, 276, -1, -1, 279, 280, 281, 282, 283, 284, + 285, 286, 287, 288, 289, 290, 291, 292, 293, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 305, 306, 307, 308, -1, -1, -1, -1, -1, -1, + 315, 316, -1, 318, 319, 0, -1, -1, -1, 324, + 325, -1, -1, 328, 329, 330, -1, 332, 333, -1, + 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, + 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 358, 359, 360, 361, -1, 256, -1, + -1, -1, -1, -1, 262, 263, 264, -1, -1, -1, + -1, 269, 270, 271, 272, 273, 274, 275, 276, -1, + -1, 279, 280, 281, 282, 283, 284, 285, 286, 287, + 288, 289, 290, 291, 292, 293, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, 305, 306, 307, + 308, -1, -1, -1, -1, -1, -1, 315, 316, -1, + 318, 319, -1, -1, -1, -1, 324, 325, -1, -1, + 328, 329, 330, -1, 332, 333, -1, 335, 336, 337, + 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, + 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, + 358, 359, 360, 361, 256, -1, -1, -1, -1, -1, + 262, 263, 264, -1, -1, -1, -1, 269, 270, 271, + 272, 273, 274, 275, 276, -1, -1, 279, 280, 281, + 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, + 292, 293, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, 305, 306, 307, 308, -1, -1, -1, + -1, -1, -1, 315, 316, -1, 318, 319, -1, -1, + -1, -1, 324, 325, -1, -1, 328, 329, 330, -1, + 332, 333, -1, 335, 336, 337, 338, 339, 340, 341, + 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, + 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, + -1, 256, -1, -1, -1, -1, -1, 262, 263, 264, + -1, -1, -1, -1, 269, 270, 271, 272, 273, 274, + 275, 276, -1, -1, 279, 280, 281, 282, 283, 284, + 285, 286, 287, 288, 289, 290, 291, 292, 293, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 305, 306, 307, 308, -1, -1, -1, -1, -1, -1, + 315, 316, -1, 318, 319, -1, -1, -1, -1, 324, + 325, -1, -1, 328, 329, 330, -1, 332, 333, -1, + 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, + 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, + 355, 356, 357, 358, 359, 360, 361, 256, -1, -1, + -1, -1, -1, 262, 263, 264, -1, -1, -1, -1, + 269, 270, 271, 272, 273, 274, 275, 276, -1, -1, + 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, + 289, 290, 291, 292, 293, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, 305, 306, 307, 308, + -1, -1, -1, -1, -1, -1, 315, 316, -1, 318, + 319, -1, -1, -1, -1, 324, 325, -1, -1, 328, + 329, 330, -1, 332, 333, -1, 335, 336, 337, 338, + 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, + 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, + 359, 360, 361, 362, 258, -1, -1, -1, 262, 263, + 258, -1, -1, -1, 262, 263, -1, -1, -1, -1, + -1, -1, -1, 277, -1, -1, -1, -1, 258, 277, + -1, -1, 262, 263, 258, -1, -1, -1, 262, 263, + -1, -1, -1, -1, -1, 299, 300, 277, 302, -1, + -1, 299, 300, 277, 302, -1, 310, 311, 312, 313, + 314, -1, 310, 311, 312, 313, 314, -1, -1, 299, + 300, -1, 302, -1, -1, 299, 300, -1, 302, -1, + 310, 311, 312, 313, 314, -1, 310, 311, 312, 313, + 314, 258, -1, -1, -1, 262, 263, 258, -1, -1, + -1, 262, 263, -1, -1, -1, -1, -1, -1, -1, + 277, -1, -1, -1, -1, 258, 277, -1, -1, 262, + 263, 258, -1, -1, -1, 262, 263, -1, -1, -1, + -1, -1, 299, 300, 277, 302, -1, -1, 299, 300, + 277, 302, -1, 310, 311, 312, 313, 314, -1, 310, + 311, 312, 313, 314, -1, -1, 299, 300, -1, 302, + -1, -1, 299, 300, -1, 302, -1, 310, 311, 312, + 313, 314, -1, 310, 311, 312, 313, 314, 258, 268, + -1, -1, 262, 263, -1, -1, -1, -1, -1, 278, + -1, -1, -1, -1, -1, -1, -1, 277, -1, -1, + -1, -1, -1, -1, -1, 294, 295, 296, 297, -1, + -1, -1, -1, -1, 303, -1, -1, -1, -1, 299, + 300, -1, 302, -1, -1, -1, -1, -1, -1, -1, + 310, 311, 312, 313, 314, +}; +#define YYFINAL 1 +#ifndef YYDEBUG +#define YYDEBUG 0 +#endif +#define YYMAXTOKEN 362 +#define YYUNDFTOKEN 504 +#define YYTRANSLATE(a) ((a) > YYMAXTOKEN ? YYUNDFTOKEN : (a)) +#if YYDEBUG +static const char *const yyname[] = { + +"end-of-file",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"LB","RB","LP","RP","MENUS", +"MENU","BUTTON","DEFAULT_FUNCTION","PLUS","MINUS","ALL","OR","CURSORS", +"PIXMAPS","ICONS","COLOR","SAVECOLOR","MONOCHROME","FUNCTION","ICONMGR_SHOW", +"ICONMGR","ALTER","WINDOW_FUNCTION","ZOOM","ICONMGRS","ICONMGR_GEOMETRY", +"ICONMGR_NOSHOW","MAKE_TITLE","ICONIFY_BY_UNMAPPING", +"DONT_ICONIFY_BY_UNMAPPING","NO_BORDER","NO_ICON_TITLE","NO_TITLE","AUTO_RAISE", +"NO_HILITE","ICON_REGION","WINDOW_REGION","META","SHIFT","LOCK","CONTROL", +"WINDOW","TITLE","ICON","ROOT","FRAME","COLON","EQUALS","SQUEEZE_TITLE", +"DONT_SQUEEZE_TITLE","START_ICONIFIED","NO_TITLE_HILITE","TITLE_HILITE","MOVE", +"RESIZE","WAITC","SELECT","KILL","LEFT_TITLEBUTTON","RIGHT_TITLEBUTTON", +"NUMBER","KEYWORD","NKEYWORD","CKEYWORD","CLKEYWORD","FKEYWORD","FSKEYWORD", +"SKEYWORD","SSKEYWORD","DKEYWORD","JKEYWORD","WINDOW_RING", +"WINDOW_RING_EXCLUDE","WARP_CURSOR","ERRORTOKEN","NO_STACKMODE","ALWAYS_ON_TOP", +"WORKSPACE","WORKSPACES","WORKSPCMGR_GEOMETRY","OCCUPYALL","OCCUPYLIST", +"MAPWINDOWCURRENTWORKSPACE","MAPWINDOWDEFAULTWORKSPACE","UNMAPBYMOVINGFARAWAY", +"OPAQUEMOVE","NOOPAQUEMOVE","OPAQUERESIZE","NOOPAQUERESIZE","DONTSETINACTIVE", +"CHANGE_WORKSPACE_FUNCTION","DEICONIFY_FUNCTION","ICONIFY_FUNCTION", +"AUTOSQUEEZE","STARTSQUEEZED","DONT_SAVE","AUTO_LOWER","ICONMENU_DONTSHOW", +"WINDOW_BOX","IGNOREMODIFIER","WINDOW_GEOMETRIES","ALWAYSSQUEEZETOGRAVITY", +"VIRTUAL_SCREENS","IGNORE_TRANSIENT","DONTTOGGLEWORKSPACEMANAGERSTATE","STRING", +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"illegal-symbol", +}; +static const char *const yyrule[] = { +"$accept : twmrc", +"twmrc : stmts", +"stmts :", +"stmts : stmts stmt", +"stmt : error", +"stmt : noarg", +"stmt : sarg", +"stmt : narg", +"stmt : squeeze", +"stmt : ICON_REGION string DKEYWORD DKEYWORD number number", +"stmt : ICON_REGION string DKEYWORD DKEYWORD number number string", +"stmt : ICON_REGION string DKEYWORD DKEYWORD number number string string", +"stmt : ICON_REGION string DKEYWORD DKEYWORD number number string string string", +"$$1 :", +"stmt : ICON_REGION string DKEYWORD DKEYWORD number number $$1 win_list", +"$$2 :", +"stmt : ICON_REGION string DKEYWORD DKEYWORD number number string $$2 win_list", +"$$3 :", +"stmt : ICON_REGION string DKEYWORD DKEYWORD number number string string $$3 win_list", +"$$4 :", +"stmt : ICON_REGION string DKEYWORD DKEYWORD number number string string string $$4 win_list", +"$$5 :", +"stmt : WINDOW_REGION string DKEYWORD DKEYWORD $$5 win_list", +"$$6 :", +"stmt : WINDOW_BOX string string $$6 win_list", +"stmt : ICONMGR_GEOMETRY string number", +"stmt : ICONMGR_GEOMETRY string", +"stmt : WORKSPCMGR_GEOMETRY string number", +"stmt : WORKSPCMGR_GEOMETRY string", +"$$7 :", +"stmt : MAPWINDOWCURRENTWORKSPACE $$7 curwork", +"$$8 :", +"stmt : MAPWINDOWDEFAULTWORKSPACE $$8 defwork", +"stmt : ZOOM number", +"stmt : ZOOM", +"stmt : PIXMAPS pixmap_list", +"stmt : CURSORS cursor_list", +"$$9 :", +"stmt : ICONIFY_BY_UNMAPPING $$9 win_list", +"stmt : ICONIFY_BY_UNMAPPING", +"$$10 :", +"stmt : OPAQUEMOVE $$10 win_list", +"stmt : OPAQUEMOVE", +"$$11 :", +"stmt : NOOPAQUEMOVE $$11 win_list", +"stmt : NOOPAQUEMOVE", +"$$12 :", +"stmt : OPAQUERESIZE $$12 win_list", +"stmt : OPAQUERESIZE", +"$$13 :", +"stmt : NOOPAQUERESIZE $$13 win_list", +"stmt : NOOPAQUERESIZE", +"stmt : LEFT_TITLEBUTTON string EQUALS action", +"stmt : RIGHT_TITLEBUTTON string EQUALS action", +"$$14 :", +"stmt : LEFT_TITLEBUTTON string $$14 binding_list", +"$$15 :", +"stmt : RIGHT_TITLEBUTTON string $$15 binding_list", +"stmt : button string", +"stmt : button action", +"stmt : string fullkey", +"stmt : button full", +"$$16 :", +"stmt : DONT_ICONIFY_BY_UNMAPPING $$16 win_list", +"$$17 :", +"stmt : WORKSPACES $$17 workspc_list", +"$$18 :", +"$$19 :", +"stmt : IGNOREMODIFIER $$18 LB keys $$19 RB", +"$$20 :", +"stmt : OCCUPYALL $$20 win_list", +"$$21 :", +"stmt : ICONMENU_DONTSHOW $$21 win_list", +"$$22 :", +"stmt : OCCUPYLIST $$22 occupy_list", +"$$23 :", +"stmt : UNMAPBYMOVINGFARAWAY $$23 win_list", +"$$24 :", +"stmt : AUTOSQUEEZE $$24 win_list", +"$$25 :", +"stmt : STARTSQUEEZED $$25 win_list", +"stmt : ALWAYSSQUEEZETOGRAVITY", +"$$26 :", +"stmt : ALWAYSSQUEEZETOGRAVITY $$26 win_list", +"$$27 :", +"stmt : DONTSETINACTIVE $$27 win_list", +"$$28 :", +"stmt : ICONMGR_NOSHOW $$28 win_list", +"stmt : ICONMGR_NOSHOW", +"$$29 :", +"stmt : ICONMGRS $$29 iconm_list", +"$$30 :", +"stmt : ICONMGR_SHOW $$30 win_list", +"$$31 :", +"stmt : NO_TITLE_HILITE $$31 win_list", +"stmt : NO_TITLE_HILITE", +"$$32 :", +"stmt : NO_HILITE $$32 win_list", +"stmt : NO_HILITE", +"$$33 :", +"stmt : ALWAYS_ON_TOP $$33 win_list", +"$$34 :", +"stmt : NO_STACKMODE $$34 win_list", +"stmt : NO_STACKMODE", +"$$35 :", +"stmt : NO_BORDER $$35 win_list", +"$$36 :", +"stmt : DONT_SAVE $$36 win_list", +"$$37 :", +"stmt : NO_ICON_TITLE $$37 win_list", +"stmt : NO_ICON_TITLE", +"$$38 :", +"stmt : NO_TITLE $$38 win_list", +"stmt : NO_TITLE", +"$$39 :", +"stmt : IGNORE_TRANSIENT $$39 win_list", +"stmt : DONTTOGGLEWORKSPACEMANAGERSTATE", +"$$40 :", +"stmt : MAKE_TITLE $$40 win_list", +"$$41 :", +"stmt : START_ICONIFIED $$41 win_list", +"$$42 :", +"stmt : AUTO_RAISE $$42 win_list", +"stmt : AUTO_RAISE", +"$$43 :", +"stmt : AUTO_LOWER $$43 win_list", +"stmt : AUTO_LOWER", +"$$44 :", +"stmt : MENU string LP string COLON string RP $$44 menu", +"$$45 :", +"stmt : MENU string $$45 menu", +"$$46 :", +"stmt : FUNCTION string $$46 function", +"$$47 :", +"stmt : ICONS $$47 icon_list", +"$$48 :", +"stmt : COLOR $$48 color_list", +"$$49 :", +"stmt : SAVECOLOR $$49 save_color_list", +"$$50 :", +"stmt : MONOCHROME $$50 color_list", +"stmt : DEFAULT_FUNCTION action", +"stmt : WINDOW_FUNCTION action", +"stmt : CHANGE_WORKSPACE_FUNCTION action", +"stmt : DEICONIFY_FUNCTION action", +"stmt : ICONIFY_FUNCTION action", +"$$51 :", +"stmt : WARP_CURSOR $$51 win_list", +"stmt : WARP_CURSOR", +"$$52 :", +"stmt : WINDOW_RING $$52 win_list", +"stmt : WINDOW_RING", +"$$53 :", +"stmt : WINDOW_RING_EXCLUDE $$53 win_list", +"$$54 :", +"stmt : WINDOW_GEOMETRIES $$54 wingeom_list", +"$$55 :", +"stmt : VIRTUAL_SCREENS $$55 geom_list", +"noarg : KEYWORD", +"sarg : SKEYWORD string", +"sarg : SKEYWORD", +"sarg : SSKEYWORD string string", +"sarg : SSKEYWORD string", +"sarg : SSKEYWORD", +"narg : NKEYWORD number", +"keyaction : EQUALS keys COLON action", +"full : EQUALS keys COLON contexts COLON action", +"fullkey : EQUALS keys COLON contextkeys COLON action", +"keys :", +"keys : keys key", +"key : META", +"key : SHIFT", +"key : LOCK", +"key : CONTROL", +"key : ALTER number", +"key : META number", +"key : OR", +"contexts :", +"contexts : contexts context", +"context : WINDOW", +"context : TITLE", +"context : ICON", +"context : ROOT", +"context : FRAME", +"context : WORKSPACE", +"context : ICONMGR", +"context : META", +"context : ALTER", +"context : ALL", +"context : OR", +"contextkeys :", +"contextkeys : contextkeys contextkey", +"contextkey : WINDOW", +"contextkey : TITLE", +"contextkey : ICON", +"contextkey : ROOT", +"contextkey : FRAME", +"contextkey : WORKSPACE", +"contextkey : ICONMGR", +"contextkey : META", +"contextkey : ALL", +"contextkey : ALTER", +"contextkey : OR", +"contextkey : string", +"binding_list : LB binding_entries RB", +"binding_entries :", +"binding_entries : binding_entries binding_entry", +"binding_entry : button keyaction", +"binding_entry : button EQUALS action", +"binding_entry : button COLON action", +"pixmap_list : LB pixmap_entries RB", +"pixmap_entries :", +"pixmap_entries : pixmap_entries pixmap_entry", +"pixmap_entry : TITLE_HILITE string", +"cursor_list : LB cursor_entries RB", +"cursor_entries :", +"cursor_entries : cursor_entries cursor_entry", +"cursor_entry : FRAME string string", +"cursor_entry : FRAME string", +"cursor_entry : TITLE string string", +"cursor_entry : TITLE string", +"cursor_entry : ICON string string", +"cursor_entry : ICON string", +"cursor_entry : ICONMGR string string", +"cursor_entry : ICONMGR string", +"cursor_entry : BUTTON string string", +"cursor_entry : BUTTON string", +"cursor_entry : MOVE string string", +"cursor_entry : MOVE string", +"cursor_entry : RESIZE string string", +"cursor_entry : RESIZE string", +"cursor_entry : WAITC string string", +"cursor_entry : WAITC string", +"cursor_entry : MENU string string", +"cursor_entry : MENU string", +"cursor_entry : SELECT string string", +"cursor_entry : SELECT string", +"cursor_entry : KILL string string", +"cursor_entry : KILL string", +"color_list : LB color_entries RB", +"color_entries :", +"color_entries : color_entries color_entry", +"color_entry : CLKEYWORD string", +"$$56 :", +"color_entry : CLKEYWORD string $$56 win_color_list", +"color_entry : CKEYWORD string", +"save_color_list : LB s_color_entries RB", +"s_color_entries :", +"s_color_entries : s_color_entries s_color_entry", +"s_color_entry : string", +"s_color_entry : CLKEYWORD", +"win_color_list : LB win_color_entries RB", +"win_color_entries :", +"win_color_entries : win_color_entries win_color_entry", +"win_color_entry : string string", +"wingeom_list : LB wingeom_entries RB", +"wingeom_entries :", +"wingeom_entries : wingeom_entries wingeom_entry", +"wingeom_entry : string string", +"geom_list : LB geom_entries RB", +"geom_entries :", +"geom_entries : geom_entries geom_entry", +"geom_entry : string", +"squeeze : SQUEEZE_TITLE", +"$$57 :", +"squeeze : SQUEEZE_TITLE $$57 LB win_sqz_entries RB", +"squeeze : DONT_SQUEEZE_TITLE", +"$$58 :", +"squeeze : DONT_SQUEEZE_TITLE $$58 win_list", +"win_sqz_entries :", +"win_sqz_entries : win_sqz_entries string JKEYWORD signed_number number", +"iconm_list : LB iconm_entries RB", +"iconm_entries :", +"iconm_entries : iconm_entries iconm_entry", +"iconm_entry : string string number", +"iconm_entry : string string string number", +"workspc_list : LB workspc_entries RB", +"workspc_entries :", +"workspc_entries : workspc_entries workspc_entry", +"workspc_entry : string", +"$$59 :", +"workspc_entry : string $$59 workapp_list", +"workapp_list : LB workapp_entries RB", +"workapp_entries :", +"workapp_entries : workapp_entries workapp_entry", +"workapp_entry : string", +"workapp_entry : string string", +"workapp_entry : string string string", +"workapp_entry : string string string string", +"workapp_entry : string string string string string", +"curwork : LB string RB", +"curwork : LB string string RB", +"curwork : LB string string string RB", +"curwork : LB string string string string RB", +"defwork : LB string RB", +"defwork : LB string string RB", +"defwork : LB string string string RB", +"defwork : LB string string string string RB", +"win_list : LB win_entries RB", +"win_entries :", +"win_entries : win_entries win_entry", +"win_entry : string", +"occupy_list : LB occupy_entries RB", +"occupy_entries :", +"occupy_entries : occupy_entries occupy_entry", +"$$60 :", +"occupy_entry : string $$60 occupy_workspc_list", +"$$61 :", +"occupy_entry : WINDOW string $$61 occupy_workspc_list", +"$$62 :", +"occupy_entry : WORKSPACE string $$62 occupy_window_list", +"occupy_workspc_list : LB occupy_workspc_entries RB", +"occupy_workspc_entries :", +"occupy_workspc_entries : occupy_workspc_entries occupy_workspc_entry", +"occupy_workspc_entry : string", +"occupy_window_list : LB occupy_window_entries RB", +"occupy_window_entries :", +"occupy_window_entries : occupy_window_entries occupy_window_entry", +"occupy_window_entry : string", +"icon_list : LB icon_entries RB", +"icon_entries :", +"icon_entries : icon_entries icon_entry", +"icon_entry : string string", +"function : LB function_entries RB", +"function_entries :", +"function_entries : function_entries function_entry", +"function_entry : action", +"menu : LB menu_entries RB", +"menu_entries :", +"menu_entries : menu_entries menu_entry", +"menu_entry : string action", +"menu_entry : string LP string COLON string RP action", +"action : FKEYWORD", +"action : FSKEYWORD string", +"signed_number : number", +"signed_number : PLUS number", +"signed_number : MINUS number", +"button : BUTTON number", +"string : STRING", +"number : NUMBER", + +}; +#endif + +int yydebug; +int yynerrs; + +int yyerrflag; +int yychar; +YYSTYPE yyval; +YYSTYPE yylval; + +/* define the initial stack-sizes */ +#ifdef YYSTACKSIZE +#undef YYMAXDEPTH +#define YYMAXDEPTH YYSTACKSIZE +#else +#ifdef YYMAXDEPTH +#define YYSTACKSIZE YYMAXDEPTH +#else +#define YYSTACKSIZE 10000 +#define YYMAXDEPTH 10000 +#endif +#endif + +#define YYINITSTACKSIZE 200 + +typedef struct { + unsigned stacksize; + YYINT *s_base; + YYINT *s_mark; + YYINT *s_last; + YYSTYPE *l_base; + YYSTYPE *l_mark; +} YYSTACKDATA; +/* variables for the parser stack */ +static YYSTACKDATA yystack; +#line 1025 "gram.y" +void yyerror(char *s) +{ + twmrc_error_prefix(); + fprintf (stderr, "error in input file: %s\n", s ? s : ""); + ParseError = 1; +} + +void RemoveDQuote(char *str) +{ + register char *i, *o; + register int n; + register int count; + + for (i=str+1, o=str; *i && *i != '\"'; o++) + { + if (*i == '\\') + { + switch (*++i) + { + case 'n': + *o = '\n'; + i++; + break; + case 'b': + *o = '\b'; + i++; + break; + case 'r': + *o = '\r'; + i++; + break; + case 't': + *o = '\t'; + i++; + break; + case 'f': + *o = '\f'; + i++; + break; + case '0': + if (*++i == 'x') + goto hex; + else + --i; + case '1': case '2': case '3': + case '4': case '5': case '6': case '7': + n = 0; + count = 0; + while (*i >= '0' && *i <= '7' && count < 3) + { + n = (n<<3) + (*i++ - '0'); + count++; + } + *o = n; + break; + hex: + case 'x': + n = 0; + count = 0; + while (i++, count++ < 2) + { + if (*i >= '0' && *i <= '9') + n = (n<<4) + (*i - '0'); + else if (*i >= 'a' && *i <= 'f') + n = (n<<4) + (*i - 'a') + 10; + else if (*i >= 'A' && *i <= 'F') + n = (n<<4) + (*i - 'A') + 10; + else + break; + } + *o = n; + break; + case '\n': + i++; /* punt */ + o--; /* to account for o++ at end of loop */ + break; + case '\"': + case '\'': + case '\\': + default: + *o = *i++; + break; + } + } + else + *o = *i++; + } + *o = '\0'; +} + +static MenuRoot *GetRoot(char *name, char *fore, char *back) +{ + MenuRoot *tmp; + + tmp = FindMenuRoot(name); + if (tmp == NULL) + tmp = NewMenuRoot(name); + + if (fore) + { + int save; + + save = Scr->FirstTime; + Scr->FirstTime = TRUE; + GetColor(COLOR, &tmp->highlight.fore, fore); + GetColor(COLOR, &tmp->highlight.back, back); + Scr->FirstTime = save; + } + + return tmp; +} + +static void GotButton (int butt, int func) +{ + int i; + MenuItem *item; + + for (i = 0; i < NUM_CONTEXTS; i++) { + if ((cont & (1 << i)) == 0) continue; + + if (func == F_MENU) { + pull->prev = NULL; + AddFuncButton (butt, i, mods, func, pull, (MenuItem*) 0); + } + else { + root = GetRoot (TWM_ROOT, NULLSTR, NULLSTR); + item = AddToMenu (root, "x", Action, NULL, func, NULLSTR, NULLSTR); + AddFuncButton (butt, i, mods, func, (MenuRoot*) 0, item); + } + } + + Action = ""; + pull = NULL; + cont = 0; + mods_used |= mods; + mods = 0; +} + +static void GotKey(char *key, int func) +{ + int i; + + for (i = 0; i < NUM_CONTEXTS; i++) + { + if ((cont & (1 << i)) == 0) + continue; + + if (func == F_MENU) { + pull->prev = NULL; + if (!AddFuncKey (key, i, mods, func, pull, Name, Action)) break; + } + else + if (!AddFuncKey(key, i, mods, func, (MenuRoot*) 0, Name, Action)) + break; + } + + Action = ""; + pull = NULL; + cont = 0; + mods_used |= mods; + mods = 0; +} + + +static void GotTitleButton (char *bitmapname, int func, Bool rightside) +{ + if (!CreateTitleButton (bitmapname, func, Action, pull, rightside, True)) { + twmrc_error_prefix(); + fprintf (stderr, + "unable to create %s titlebutton \"%s\"\n", + rightside ? "right" : "left", bitmapname); + } + Action = ""; + pull = NULL; +} + +static Bool CheckWarpScreenArg (register char *s) +{ + XmuCopyISOLatin1Lowered (s, s); + + if (strcmp (s, WARPSCREEN_NEXT) == 0 || + strcmp (s, WARPSCREEN_PREV) == 0 || + strcmp (s, WARPSCREEN_BACK) == 0) + return True; + + for (; *s && Isascii(*s) && Isdigit(*s); s++) ; /* SUPPRESS 530 */ + return (*s ? False : True); +} + + +static Bool CheckWarpRingArg (register char *s) +{ + XmuCopyISOLatin1Lowered (s, s); + + if (strcmp (s, WARPSCREEN_NEXT) == 0 || + strcmp (s, WARPSCREEN_PREV) == 0) + return True; + + return False; +} + + +static Bool CheckColormapArg (register char *s) +{ + XmuCopyISOLatin1Lowered (s, s); + + if (strcmp (s, COLORMAP_NEXT) == 0 || + strcmp (s, COLORMAP_PREV) == 0 || + strcmp (s, COLORMAP_DEFAULT) == 0) + return True; + + return False; +} + + +void twmrc_error_prefix (void) +{ + fprintf (stderr, "%s: line %d: ", ProgramName, twmrc_lineno); +} +#line 1892 "gram.tab.c" + +#if YYDEBUG +#include /* needed for printf */ +#endif + +#include /* needed for malloc, etc */ +#include /* needed for memset */ + +/* allocate initial stack or double stack size, up to YYMAXDEPTH */ +static int yygrowstack(YYSTACKDATA *data) +{ + int i; + unsigned newsize; + YYINT *newss; + YYSTYPE *newvs; + + if ((newsize = data->stacksize) == 0) + newsize = YYINITSTACKSIZE; + else if (newsize >= YYMAXDEPTH) + return YYENOMEM; + else if ((newsize *= 2) > YYMAXDEPTH) + newsize = YYMAXDEPTH; + + i = (int) (data->s_mark - data->s_base); + newss = (YYINT *)realloc(data->s_base, newsize * sizeof(*newss)); + if (newss == 0) + return YYENOMEM; + + data->s_base = newss; + data->s_mark = newss + i; + + newvs = (YYSTYPE *)realloc(data->l_base, newsize * sizeof(*newvs)); + if (newvs == 0) + return YYENOMEM; + + data->l_base = newvs; + data->l_mark = newvs + i; + + data->stacksize = newsize; + data->s_last = data->s_base + newsize - 1; + return 0; +} + +#if YYPURE || defined(YY_NO_LEAKS) +static void yyfreestack(YYSTACKDATA *data) +{ + free(data->s_base); + free(data->l_base); + memset(data, 0, sizeof(*data)); +} +#else +#define yyfreestack(data) /* nothing */ +#endif + +#define YYABORT goto yyabort +#define YYREJECT goto yyabort +#define YYACCEPT goto yyaccept +#define YYERROR goto yyerrlab + +int +YYPARSE_DECL() +{ + int yym, yyn, yystate; +#if YYDEBUG + const char *yys; + + if ((yys = getenv("YYDEBUG")) != 0) + { + yyn = *yys; + if (yyn >= '0' && yyn <= '9') + yydebug = yyn - '0'; + } +#endif + + yynerrs = 0; + yyerrflag = 0; + yychar = YYEMPTY; + yystate = 0; + +#if YYPURE + memset(&yystack, 0, sizeof(yystack)); +#endif + + if (yystack.s_base == NULL && yygrowstack(&yystack) == YYENOMEM) goto yyoverflow; + yystack.s_mark = yystack.s_base; + yystack.l_mark = yystack.l_base; + yystate = 0; + *yystack.s_mark = 0; + +yyloop: + if ((yyn = yydefred[yystate]) != 0) goto yyreduce; + if (yychar < 0) + { + if ((yychar = YYLEX) < 0) yychar = YYEOF; +#if YYDEBUG + if (yydebug) + { + yys = yyname[YYTRANSLATE(yychar)]; + printf("%sdebug: state %d, reading %d (%s)\n", + YYPREFIX, yystate, yychar, yys); + } +#endif + } + if ((yyn = yysindex[yystate]) && (yyn += yychar) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == yychar) + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: state %d, shifting to state %d\n", + YYPREFIX, yystate, yytable[yyn]); +#endif + if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack) == YYENOMEM) + { + goto yyoverflow; + } + yystate = yytable[yyn]; + *++yystack.s_mark = yytable[yyn]; + *++yystack.l_mark = yylval; + yychar = YYEMPTY; + if (yyerrflag > 0) --yyerrflag; + goto yyloop; + } + if ((yyn = yyrindex[yystate]) && (yyn += yychar) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == yychar) + { + yyn = yytable[yyn]; + goto yyreduce; + } + if (yyerrflag) goto yyinrecovery; + + YYERROR_CALL("syntax error"); + + goto yyerrlab; + +yyerrlab: + ++yynerrs; + +yyinrecovery: + if (yyerrflag < 3) + { + yyerrflag = 3; + for (;;) + { + if ((yyn = yysindex[*yystack.s_mark]) && (yyn += YYERRCODE) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == YYERRCODE) + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: state %d, error recovery shifting\ + to state %d\n", YYPREFIX, *yystack.s_mark, yytable[yyn]); +#endif + if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack) == YYENOMEM) + { + goto yyoverflow; + } + yystate = yytable[yyn]; + *++yystack.s_mark = yytable[yyn]; + *++yystack.l_mark = yylval; + goto yyloop; + } + else + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: error recovery discarding state %d\n", + YYPREFIX, *yystack.s_mark); +#endif + if (yystack.s_mark <= yystack.s_base) goto yyabort; + --yystack.s_mark; + --yystack.l_mark; + } + } + } + else + { + if (yychar == YYEOF) goto yyabort; +#if YYDEBUG + if (yydebug) + { + yys = yyname[YYTRANSLATE(yychar)]; + printf("%sdebug: state %d, error recovery discards token %d (%s)\n", + YYPREFIX, yystate, yychar, yys); + } +#endif + yychar = YYEMPTY; + goto yyloop; + } + +yyreduce: +#if YYDEBUG + if (yydebug) + printf("%sdebug: state %d, reducing by rule %d (%s)\n", + YYPREFIX, yystate, yyn, yyrule[yyn]); +#endif + yym = yylen[yyn]; + if (yym) + yyval = yystack.l_mark[1-yym]; + else + memset(&yyval, 0, sizeof yyval); + switch (yyn) + { +case 9: +#line 167 "gram.y" + { + (void) AddIconRegion(yystack.l_mark[-4].ptr, yystack.l_mark[-3].num, yystack.l_mark[-2].num, yystack.l_mark[-1].num, yystack.l_mark[0].num, "undef", "undef", "undef"); + } +break; +case 10: +#line 170 "gram.y" + { + (void) AddIconRegion(yystack.l_mark[-5].ptr, yystack.l_mark[-4].num, yystack.l_mark[-3].num, yystack.l_mark[-2].num, yystack.l_mark[-1].num, yystack.l_mark[0].ptr, "undef", "undef"); + } +break; +case 11: +#line 173 "gram.y" + { + (void) AddIconRegion(yystack.l_mark[-6].ptr, yystack.l_mark[-5].num, yystack.l_mark[-4].num, yystack.l_mark[-3].num, yystack.l_mark[-2].num, yystack.l_mark[-1].ptr, yystack.l_mark[0].ptr, "undef"); + } +break; +case 12: +#line 176 "gram.y" + { + (void) AddIconRegion(yystack.l_mark[-7].ptr, yystack.l_mark[-6].num, yystack.l_mark[-5].num, yystack.l_mark[-4].num, yystack.l_mark[-3].num, yystack.l_mark[-2].ptr, yystack.l_mark[-1].ptr, yystack.l_mark[0].ptr); + } +break; +case 13: +#line 179 "gram.y" + { + list = AddIconRegion(yystack.l_mark[-4].ptr, yystack.l_mark[-3].num, yystack.l_mark[-2].num, yystack.l_mark[-1].num, yystack.l_mark[0].num, "undef", "undef", "undef"); + } +break; +case 15: +#line 183 "gram.y" + { + list = AddIconRegion(yystack.l_mark[-5].ptr, yystack.l_mark[-4].num, yystack.l_mark[-3].num, yystack.l_mark[-2].num, yystack.l_mark[-1].num, yystack.l_mark[0].ptr, "undef", "undef"); + } +break; +case 17: +#line 187 "gram.y" + { + list = AddIconRegion(yystack.l_mark[-6].ptr, yystack.l_mark[-5].num, yystack.l_mark[-4].num, yystack.l_mark[-3].num, yystack.l_mark[-2].num, yystack.l_mark[-1].ptr, yystack.l_mark[0].ptr, "undef"); + } +break; +case 19: +#line 191 "gram.y" + { + list = AddIconRegion(yystack.l_mark[-7].ptr, yystack.l_mark[-6].num, yystack.l_mark[-5].num, yystack.l_mark[-4].num, yystack.l_mark[-3].num, yystack.l_mark[-2].ptr, yystack.l_mark[-1].ptr, yystack.l_mark[0].ptr); + } +break; +case 21: +#line 196 "gram.y" + { + list = AddWindowRegion (yystack.l_mark[-2].ptr, yystack.l_mark[-1].num, yystack.l_mark[0].num); + } +break; +case 23: +#line 201 "gram.y" + { + list = addWindowBox (yystack.l_mark[-1].ptr, yystack.l_mark[0].ptr); + } +break; +case 25: +#line 206 "gram.y" + { if (Scr->FirstTime) + { + Scr->iconmgr->geometry= (char*)yystack.l_mark[-1].ptr; + Scr->iconmgr->columns=yystack.l_mark[0].num; + } + } +break; +case 26: +#line 212 "gram.y" + { if (Scr->FirstTime) + Scr->iconmgr->geometry = (char*)yystack.l_mark[0].ptr; + } +break; +case 27: +#line 215 "gram.y" + { if (Scr->FirstTime) + { + Scr->workSpaceMgr.geometry= (char*)yystack.l_mark[-1].ptr; + Scr->workSpaceMgr.columns=yystack.l_mark[0].num; + } + } +break; +case 28: +#line 221 "gram.y" + { if (Scr->FirstTime) + Scr->workSpaceMgr.geometry = (char*)yystack.l_mark[0].ptr; + } +break; +case 29: +#line 224 "gram.y" + {} +break; +case 31: +#line 227 "gram.y" + {} +break; +case 33: +#line 230 "gram.y" + { if (Scr->FirstTime) + { + Scr->DoZoom = TRUE; + Scr->ZoomCount = yystack.l_mark[0].num; + } + } +break; +case 34: +#line 236 "gram.y" + { if (Scr->FirstTime) + Scr->DoZoom = TRUE; } +break; +case 35: +#line 238 "gram.y" + {} +break; +case 36: +#line 239 "gram.y" + {} +break; +case 37: +#line 240 "gram.y" + { list = &Scr->IconifyByUn; } +break; +case 39: +#line 242 "gram.y" + { if (Scr->FirstTime) + Scr->IconifyByUnmapping = TRUE; } +break; +case 40: +#line 245 "gram.y" + { list = &Scr->OpaqueMoveList; } +break; +case 42: +#line 247 "gram.y" + { if (Scr->FirstTime) Scr->DoOpaqueMove = TRUE; } +break; +case 43: +#line 248 "gram.y" + { list = &Scr->NoOpaqueMoveList; } +break; +case 45: +#line 250 "gram.y" + { if (Scr->FirstTime) Scr->DoOpaqueMove = FALSE; } +break; +case 46: +#line 251 "gram.y" + { list = &Scr->OpaqueMoveList; } +break; +case 48: +#line 253 "gram.y" + { if (Scr->FirstTime) Scr->DoOpaqueResize = TRUE; } +break; +case 49: +#line 254 "gram.y" + { list = &Scr->NoOpaqueResizeList; } +break; +case 51: +#line 256 "gram.y" + { if (Scr->FirstTime) Scr->DoOpaqueResize = FALSE; } +break; +case 52: +#line 258 "gram.y" + { + GotTitleButton (yystack.l_mark[-2].ptr, yystack.l_mark[0].num, False); + } +break; +case 53: +#line 261 "gram.y" + { + GotTitleButton (yystack.l_mark[-2].ptr, yystack.l_mark[0].num, True); + } +break; +case 54: +#line 264 "gram.y" + { CreateTitleButton(yystack.l_mark[0].ptr, 0, NULL, NULL, FALSE, TRUE); } +break; +case 56: +#line 266 "gram.y" + { CreateTitleButton(yystack.l_mark[0].ptr, 0, NULL, NULL, TRUE, TRUE); } +break; +case 58: +#line 268 "gram.y" + { + root = GetRoot(yystack.l_mark[0].ptr, NULLSTR, NULLSTR); + AddFuncButton (yystack.l_mark[-1].num, C_ROOT, 0, F_MENU, root, (MenuItem*) 0); + } +break; +case 59: +#line 272 "gram.y" + { + if (yystack.l_mark[0].num == F_MENU) { + pull->prev = NULL; + AddFuncButton (yystack.l_mark[-1].num, C_ROOT, 0, yystack.l_mark[0].num, pull, (MenuItem*) 0); + } + else { + MenuItem *item; + + root = GetRoot(TWM_ROOT,NULLSTR,NULLSTR); + item = AddToMenu (root, "x", Action, + NULL, yystack.l_mark[0].num, NULLSTR, NULLSTR); + AddFuncButton (yystack.l_mark[-1].num, C_ROOT, 0, yystack.l_mark[0].num, (MenuRoot*) 0, item); + } + Action = ""; + pull = NULL; + } +break; +case 60: +#line 288 "gram.y" + { GotKey(yystack.l_mark[-1].ptr, yystack.l_mark[0].num); } +break; +case 61: +#line 289 "gram.y" + { GotButton(yystack.l_mark[-1].num, yystack.l_mark[0].num); } +break; +case 62: +#line 291 "gram.y" + { list = &Scr->DontIconify; } +break; +case 64: +#line 293 "gram.y" + {} +break; +case 66: +#line 295 "gram.y" + {} +break; +case 67: +#line 295 "gram.y" + { Scr->IgnoreModifier = mods; mods = 0; } +break; +case 69: +#line 296 "gram.y" + { list = &Scr->OccupyAll; } +break; +case 71: +#line 298 "gram.y" + { list = &Scr->IconMenuDontShow; } +break; +case 73: +#line 300 "gram.y" + {} +break; +case 75: +#line 302 "gram.y" + { list = &Scr->UnmapByMovingFarAway; } +break; +case 77: +#line 304 "gram.y" + { list = &Scr->AutoSqueeze; } +break; +case 79: +#line 306 "gram.y" + { list = &Scr->StartSqueezed; } +break; +case 81: +#line 308 "gram.y" + { Scr->AlwaysSqueezeToGravity = TRUE; } +break; +case 82: +#line 309 "gram.y" + { list = &Scr->AlwaysSqueezeToGravityL; } +break; +case 84: +#line 311 "gram.y" + { list = &Scr->DontSetInactive; } +break; +case 86: +#line 313 "gram.y" + { list = &Scr->IconMgrNoShow; } +break; +case 88: +#line 315 "gram.y" + { Scr->IconManagerDontShow = TRUE; } +break; +case 89: +#line 316 "gram.y" + { list = &Scr->IconMgrs; } +break; +case 91: +#line 318 "gram.y" + { list = &Scr->IconMgrShow; } +break; +case 93: +#line 320 "gram.y" + { list = &Scr->NoTitleHighlight; } +break; +case 95: +#line 322 "gram.y" + { if (Scr->FirstTime) + Scr->TitleHighlight = FALSE; } +break; +case 96: +#line 324 "gram.y" + { list = &Scr->NoHighlight; } +break; +case 98: +#line 326 "gram.y" + { if (Scr->FirstTime) + Scr->Highlight = FALSE; } +break; +case 99: +#line 328 "gram.y" + { list = &Scr->AlwaysOnTopL; } +break; +case 101: +#line 330 "gram.y" + { list = &Scr->NoStackModeL; } +break; +case 103: +#line 332 "gram.y" + { if (Scr->FirstTime) + Scr->StackMode = FALSE; } +break; +case 104: +#line 334 "gram.y" + { list = &Scr->NoBorder; } +break; +case 106: +#line 336 "gram.y" + { list = &Scr->DontSave; } +break; +case 108: +#line 338 "gram.y" + { list = &Scr->NoIconTitle; } +break; +case 110: +#line 340 "gram.y" + { if (Scr->FirstTime) + Scr->NoIconTitlebar = TRUE; } +break; +case 111: +#line 342 "gram.y" + { list = &Scr->NoTitle; } +break; +case 113: +#line 344 "gram.y" + { if (Scr->FirstTime) + Scr->NoTitlebar = TRUE; } +break; +case 114: +#line 346 "gram.y" + { list = &Scr->IgnoreTransientL; } +break; +case 116: +#line 348 "gram.y" + { donttoggleworkspacemanagerstate = TRUE; } +break; +case 117: +#line 349 "gram.y" + { list = &Scr->MakeTitle; } +break; +case 119: +#line 351 "gram.y" + { list = &Scr->StartIconified; } +break; +case 121: +#line 353 "gram.y" + { list = &Scr->AutoRaise; } +break; +case 123: +#line 355 "gram.y" + { Scr->AutoRaiseDefault = TRUE; } +break; +case 124: +#line 356 "gram.y" + { list = &Scr->AutoLower; } +break; +case 126: +#line 358 "gram.y" + { Scr->AutoLowerDefault = TRUE; } +break; +case 127: +#line 359 "gram.y" + { + root = GetRoot(yystack.l_mark[-5].ptr, yystack.l_mark[-3].ptr, yystack.l_mark[-1].ptr); } +break; +case 128: +#line 361 "gram.y" + { root->real_menu = TRUE;} +break; +case 129: +#line 362 "gram.y" + { root = GetRoot(yystack.l_mark[0].ptr, NULLSTR, NULLSTR); } +break; +case 130: +#line 363 "gram.y" + { root->real_menu = TRUE; } +break; +case 131: +#line 364 "gram.y" + { root = GetRoot(yystack.l_mark[0].ptr, NULLSTR, NULLSTR); } +break; +case 133: +#line 366 "gram.y" + { list = &Scr->IconNames; } +break; +case 135: +#line 368 "gram.y" + { color = COLOR; } +break; +case 137: +#line 370 "gram.y" + {} +break; +case 139: +#line 372 "gram.y" + { color = MONOCHROME; } +break; +case 141: +#line 374 "gram.y" + { Scr->DefaultFunction.func = yystack.l_mark[0].num; + if (yystack.l_mark[0].num == F_MENU) + { + pull->prev = NULL; + Scr->DefaultFunction.menu = pull; + } + else + { + root = GetRoot(TWM_ROOT,NULLSTR,NULLSTR); + Scr->DefaultFunction.item = + AddToMenu(root,"x",Action, + NULL,yystack.l_mark[0].num, NULLSTR, NULLSTR); + } + Action = ""; + pull = NULL; + } +break; +case 142: +#line 390 "gram.y" + { Scr->WindowFunction.func = yystack.l_mark[0].num; + root = GetRoot(TWM_ROOT,NULLSTR,NULLSTR); + Scr->WindowFunction.item = + AddToMenu(root,"x",Action, + NULL,yystack.l_mark[0].num, NULLSTR, NULLSTR); + Action = ""; + pull = NULL; + } +break; +case 143: +#line 398 "gram.y" + { Scr->ChangeWorkspaceFunction.func = yystack.l_mark[0].num; + root = GetRoot(TWM_ROOT,NULLSTR,NULLSTR); + Scr->ChangeWorkspaceFunction.item = + AddToMenu(root,"x",Action, + NULL,yystack.l_mark[0].num, NULLSTR, NULLSTR); + Action = ""; + pull = NULL; + } +break; +case 144: +#line 406 "gram.y" + { Scr->DeIconifyFunction.func = yystack.l_mark[0].num; + root = GetRoot(TWM_ROOT,NULLSTR,NULLSTR); + Scr->DeIconifyFunction.item = + AddToMenu(root,"x",Action, + NULL,yystack.l_mark[0].num, NULLSTR, NULLSTR); + Action = ""; + pull = NULL; + } +break; +case 145: +#line 414 "gram.y" + { Scr->IconifyFunction.func = yystack.l_mark[0].num; + root = GetRoot(TWM_ROOT,NULLSTR,NULLSTR); + Scr->IconifyFunction.item = + AddToMenu(root,"x",Action, + NULL,yystack.l_mark[0].num, NULLSTR, NULLSTR); + Action = ""; + pull = NULL; + } +break; +case 146: +#line 422 "gram.y" + { list = &Scr->WarpCursorL; } +break; +case 148: +#line 424 "gram.y" + { if (Scr->FirstTime) + Scr->WarpCursor = TRUE; } +break; +case 149: +#line 426 "gram.y" + { list = &Scr->WindowRingL; } +break; +case 151: +#line 428 "gram.y" + { Scr->WindowRingAll = TRUE; } +break; +case 152: +#line 429 "gram.y" + { if (!Scr->WindowRingL) + Scr->WindowRingAll = TRUE; + list = &Scr->WindowRingExcludeL; } +break; +case 154: +#line 433 "gram.y" + { } +break; +case 156: +#line 435 "gram.y" + { } +break; +case 158: +#line 439 "gram.y" + { if (!do_single_keyword (yystack.l_mark[0].num)) { + twmrc_error_prefix(); + fprintf (stderr, + "unknown singleton keyword %d\n", + yystack.l_mark[0].num); + ParseError = 1; + } + } +break; +case 159: +#line 449 "gram.y" + { if (!do_string_keyword (yystack.l_mark[-1].num, yystack.l_mark[0].ptr)) { + twmrc_error_prefix(); + fprintf (stderr, + "unknown string keyword %d (value \"%s\")\n", + yystack.l_mark[-1].num, yystack.l_mark[0].ptr); + ParseError = 1; + } + } +break; +case 160: +#line 457 "gram.y" + { if (!do_string_keyword (yystack.l_mark[0].num, defstring)) { + twmrc_error_prefix(); + fprintf (stderr, + "unknown string keyword %d (no value)\n", + yystack.l_mark[0].num); + ParseError = 1; + } + } +break; +case 161: +#line 468 "gram.y" + { if (!do_string_string_keyword (yystack.l_mark[-2].num, yystack.l_mark[-1].ptr, yystack.l_mark[0].ptr)) { + twmrc_error_prefix(); + fprintf (stderr, + "unknown strings keyword %d (value \"%s\" and \"%s\")\n", + yystack.l_mark[-2].num, yystack.l_mark[-1].ptr, yystack.l_mark[0].ptr); + ParseError = 1; + } + } +break; +case 162: +#line 476 "gram.y" + { if (!do_string_string_keyword (yystack.l_mark[-1].num, yystack.l_mark[0].ptr, defstring)) { + twmrc_error_prefix(); + fprintf (stderr, + "unknown string keyword %d (value \"%s\")\n", + yystack.l_mark[-1].num, yystack.l_mark[0].ptr); + ParseError = 1; + } + } +break; +case 163: +#line 484 "gram.y" + { if (!do_string_string_keyword (yystack.l_mark[0].num, defstring, defstring)) { + twmrc_error_prefix(); + fprintf (stderr, + "unknown string keyword %d (no value)\n", + yystack.l_mark[0].num); + ParseError = 1; + } + } +break; +case 164: +#line 494 "gram.y" + { if (!do_number_keyword (yystack.l_mark[-1].num, yystack.l_mark[0].num)) { + twmrc_error_prefix(); + fprintf (stderr, + "unknown numeric keyword %d (value %d)\n", + yystack.l_mark[-1].num, yystack.l_mark[0].num); + ParseError = 1; + } + } +break; +case 165: +#line 506 "gram.y" + { yyval.num = yystack.l_mark[0].num; } +break; +case 166: +#line 509 "gram.y" + { yyval.num = yystack.l_mark[0].num; } +break; +case 167: +#line 512 "gram.y" + { yyval.num = yystack.l_mark[0].num; } +break; +case 170: +#line 519 "gram.y" + { mods |= Mod1Mask; } +break; +case 171: +#line 520 "gram.y" + { mods |= ShiftMask; } +break; +case 172: +#line 521 "gram.y" + { mods |= LockMask; } +break; +case 173: +#line 522 "gram.y" + { mods |= ControlMask; } +break; +case 174: +#line 523 "gram.y" + { if (yystack.l_mark[0].num < 1 || yystack.l_mark[0].num > 5) { + twmrc_error_prefix(); + fprintf (stderr, + "bad modifier number (%d), must be 1-5\n", + yystack.l_mark[0].num); + ParseError = 1; + } else { + mods |= (Alt1Mask << (yystack.l_mark[0].num - 1)); + } + } +break; +case 175: +#line 533 "gram.y" + { if (yystack.l_mark[0].num < 1 || yystack.l_mark[0].num > 5) { + twmrc_error_prefix(); + fprintf (stderr, + "bad modifier number (%d), must be 1-5\n", + yystack.l_mark[0].num); + ParseError = 1; + } else { + mods |= (Mod1Mask << (yystack.l_mark[0].num - 1)); + } + } +break; +case 176: +#line 543 "gram.y" + { } +break; +case 179: +#line 550 "gram.y" + { cont |= C_WINDOW_BIT; } +break; +case 180: +#line 551 "gram.y" + { cont |= C_TITLE_BIT; } +break; +case 181: +#line 552 "gram.y" + { cont |= C_ICON_BIT; } +break; +case 182: +#line 553 "gram.y" + { cont |= C_ROOT_BIT; } +break; +case 183: +#line 554 "gram.y" + { cont |= C_FRAME_BIT; } +break; +case 184: +#line 555 "gram.y" + { cont |= C_WORKSPACE_BIT; } +break; +case 185: +#line 556 "gram.y" + { cont |= C_ICONMGR_BIT; } +break; +case 186: +#line 557 "gram.y" + { cont |= C_ICONMGR_BIT; } +break; +case 187: +#line 558 "gram.y" + { cont |= C_ALTER_BIT; } +break; +case 188: +#line 559 "gram.y" + { cont |= C_ALL_BITS; } +break; +case 189: +#line 560 "gram.y" + { } +break; +case 192: +#line 567 "gram.y" + { cont |= C_WINDOW_BIT; } +break; +case 193: +#line 568 "gram.y" + { cont |= C_TITLE_BIT; } +break; +case 194: +#line 569 "gram.y" + { cont |= C_ICON_BIT; } +break; +case 195: +#line 570 "gram.y" + { cont |= C_ROOT_BIT; } +break; +case 196: +#line 571 "gram.y" + { cont |= C_FRAME_BIT; } +break; +case 197: +#line 572 "gram.y" + { cont |= C_WORKSPACE_BIT; } +break; +case 198: +#line 573 "gram.y" + { cont |= C_ICONMGR_BIT; } +break; +case 199: +#line 574 "gram.y" + { cont |= C_ICONMGR_BIT; } +break; +case 200: +#line 575 "gram.y" + { cont |= C_ALL_BITS; } +break; +case 201: +#line 576 "gram.y" + { cont |= C_ALTER_BIT; } +break; +case 202: +#line 577 "gram.y" + { } +break; +case 203: +#line 578 "gram.y" + { Name = (char*)yystack.l_mark[0].ptr; cont |= C_NAME_BIT; } +break; +case 204: +#line 582 "gram.y" + {} +break; +case 207: +#line 589 "gram.y" + { ModifyCurrentTB(yystack.l_mark[-1].num, mods, yystack.l_mark[0].num, Action, pull); mods = 0;} +break; +case 208: +#line 590 "gram.y" + { ModifyCurrentTB(yystack.l_mark[-2].num, 0, yystack.l_mark[0].num, Action, pull);} +break; +case 209: +#line 592 "gram.y" + { ModifyCurrentTB(yystack.l_mark[-2].num, 0, yystack.l_mark[0].num, Action, pull);} +break; +case 210: +#line 596 "gram.y" + {} +break; +case 213: +#line 603 "gram.y" + { SetHighlightPixmap (yystack.l_mark[0].ptr); } +break; +case 214: +#line 607 "gram.y" + {} +break; +case 217: +#line 614 "gram.y" + { + NewBitmapCursor(&Scr->FrameCursor, yystack.l_mark[-1].ptr, yystack.l_mark[0].ptr); } +break; +case 218: +#line 616 "gram.y" + { + NewFontCursor(&Scr->FrameCursor, yystack.l_mark[0].ptr); } +break; +case 219: +#line 618 "gram.y" + { + NewBitmapCursor(&Scr->TitleCursor, yystack.l_mark[-1].ptr, yystack.l_mark[0].ptr); } +break; +case 220: +#line 620 "gram.y" + { + NewFontCursor(&Scr->TitleCursor, yystack.l_mark[0].ptr); } +break; +case 221: +#line 622 "gram.y" + { + NewBitmapCursor(&Scr->IconCursor, yystack.l_mark[-1].ptr, yystack.l_mark[0].ptr); } +break; +case 222: +#line 624 "gram.y" + { + NewFontCursor(&Scr->IconCursor, yystack.l_mark[0].ptr); } +break; +case 223: +#line 626 "gram.y" + { + NewBitmapCursor(&Scr->IconMgrCursor, yystack.l_mark[-1].ptr, yystack.l_mark[0].ptr); } +break; +case 224: +#line 628 "gram.y" + { + NewFontCursor(&Scr->IconMgrCursor, yystack.l_mark[0].ptr); } +break; +case 225: +#line 630 "gram.y" + { + NewBitmapCursor(&Scr->ButtonCursor, yystack.l_mark[-1].ptr, yystack.l_mark[0].ptr); } +break; +case 226: +#line 632 "gram.y" + { + NewFontCursor(&Scr->ButtonCursor, yystack.l_mark[0].ptr); } +break; +case 227: +#line 634 "gram.y" + { + NewBitmapCursor(&Scr->MoveCursor, yystack.l_mark[-1].ptr, yystack.l_mark[0].ptr); } +break; +case 228: +#line 636 "gram.y" + { + NewFontCursor(&Scr->MoveCursor, yystack.l_mark[0].ptr); } +break; +case 229: +#line 638 "gram.y" + { + NewBitmapCursor(&Scr->ResizeCursor, yystack.l_mark[-1].ptr, yystack.l_mark[0].ptr); } +break; +case 230: +#line 640 "gram.y" + { + NewFontCursor(&Scr->ResizeCursor, yystack.l_mark[0].ptr); } +break; +case 231: +#line 642 "gram.y" + { + NewBitmapCursor(&Scr->WaitCursor, yystack.l_mark[-1].ptr, yystack.l_mark[0].ptr); } +break; +case 232: +#line 644 "gram.y" + { + NewFontCursor(&Scr->WaitCursor, yystack.l_mark[0].ptr); } +break; +case 233: +#line 646 "gram.y" + { + NewBitmapCursor(&Scr->MenuCursor, yystack.l_mark[-1].ptr, yystack.l_mark[0].ptr); } +break; +case 234: +#line 648 "gram.y" + { + NewFontCursor(&Scr->MenuCursor, yystack.l_mark[0].ptr); } +break; +case 235: +#line 650 "gram.y" + { + NewBitmapCursor(&Scr->SelectCursor, yystack.l_mark[-1].ptr, yystack.l_mark[0].ptr); } +break; +case 236: +#line 652 "gram.y" + { + NewFontCursor(&Scr->SelectCursor, yystack.l_mark[0].ptr); } +break; +case 237: +#line 654 "gram.y" + { + NewBitmapCursor(&Scr->DestroyCursor, yystack.l_mark[-1].ptr, yystack.l_mark[0].ptr); } +break; +case 238: +#line 656 "gram.y" + { + NewFontCursor(&Scr->DestroyCursor, yystack.l_mark[0].ptr); } +break; +case 239: +#line 660 "gram.y" + {} +break; +case 242: +#line 668 "gram.y" + { if (!do_colorlist_keyword (yystack.l_mark[-1].num, color, + yystack.l_mark[0].ptr)) { + twmrc_error_prefix(); + fprintf (stderr, + "unhandled list color keyword %d (string \"%s\")\n", + yystack.l_mark[-1].num, yystack.l_mark[0].ptr); + ParseError = 1; + } + } +break; +case 243: +#line 677 "gram.y" + { list = do_colorlist_keyword(yystack.l_mark[-1].num,color, + yystack.l_mark[0].ptr); + if (!list) { + twmrc_error_prefix(); + fprintf (stderr, + "unhandled color list keyword %d (string \"%s\")\n", + yystack.l_mark[-1].num, yystack.l_mark[0].ptr); + ParseError = 1; + } + } +break; +case 245: +#line 688 "gram.y" + { if (!do_color_keyword (yystack.l_mark[-1].num, color, + yystack.l_mark[0].ptr)) { + twmrc_error_prefix(); + fprintf (stderr, + "unhandled color keyword %d (string \"%s\")\n", + yystack.l_mark[-1].num, yystack.l_mark[0].ptr); + ParseError = 1; + } + } +break; +case 246: +#line 699 "gram.y" + {} +break; +case 249: +#line 706 "gram.y" + { do_string_savecolor(color, yystack.l_mark[0].ptr); } +break; +case 250: +#line 707 "gram.y" + { do_var_savecolor(yystack.l_mark[0].num); } +break; +case 251: +#line 710 "gram.y" + {} +break; +case 254: +#line 717 "gram.y" + { if (Scr->FirstTime && + color == Scr->Monochrome) + AddToList(list, yystack.l_mark[-1].ptr, yystack.l_mark[0].ptr); } +break; +case 255: +#line 722 "gram.y" + {} +break; +case 258: +#line 729 "gram.y" + { AddToList (&Scr->WindowGeometries, yystack.l_mark[-1].ptr, yystack.l_mark[0].ptr); } +break; +case 259: +#line 732 "gram.y" + {} +break; +case 262: +#line 739 "gram.y" + { AddToList (&Scr->VirtualScreens, yystack.l_mark[0].ptr, ""); } +break; +case 263: +#line 742 "gram.y" + { + if (HasShape) Scr->SqueezeTitle = TRUE; + } +break; +case 264: +#line 745 "gram.y" + { list = &Scr->SqueezeTitleL; + if (HasShape && Scr->SqueezeTitle == -1) + Scr->SqueezeTitle = TRUE; + } +break; +case 266: +#line 750 "gram.y" + { Scr->SqueezeTitle = FALSE; } +break; +case 267: +#line 751 "gram.y" + { list = &Scr->DontSqueezeTitleL; } +break; +case 270: +#line 756 "gram.y" + { + if (Scr->FirstTime) { + do_squeeze_entry (list, yystack.l_mark[-3].ptr, yystack.l_mark[-2].num, yystack.l_mark[-1].num, yystack.l_mark[0].num); + } + } +break; +case 271: +#line 764 "gram.y" + {} +break; +case 274: +#line 771 "gram.y" + { if (Scr->FirstTime) + AddToList(list, yystack.l_mark[-2].ptr, (char *) + AllocateIconManager(yystack.l_mark[-2].ptr, NULLSTR, + yystack.l_mark[-1].ptr,yystack.l_mark[0].num)); + } +break; +case 275: +#line 777 "gram.y" + { if (Scr->FirstTime) + AddToList(list, yystack.l_mark[-3].ptr, (char *) + AllocateIconManager(yystack.l_mark[-3].ptr,yystack.l_mark[-2].ptr, + yystack.l_mark[-1].ptr, yystack.l_mark[0].num)); + } +break; +case 276: +#line 784 "gram.y" + {} +break; +case 279: +#line 791 "gram.y" + { + AddWorkSpace (yystack.l_mark[0].ptr, NULLSTR, NULLSTR, NULLSTR, NULLSTR, NULLSTR); + } +break; +case 280: +#line 794 "gram.y" + { + curWorkSpc = (char*)yystack.l_mark[0].ptr; + } +break; +case 282: +#line 800 "gram.y" + {} +break; +case 285: +#line 807 "gram.y" + { + AddWorkSpace (curWorkSpc, yystack.l_mark[0].ptr, NULLSTR, NULLSTR, NULLSTR, NULLSTR); + } +break; +case 286: +#line 810 "gram.y" + { + AddWorkSpace (curWorkSpc, yystack.l_mark[-1].ptr, yystack.l_mark[0].ptr, NULLSTR, NULLSTR, NULLSTR); + } +break; +case 287: +#line 813 "gram.y" + { + AddWorkSpace (curWorkSpc, yystack.l_mark[-2].ptr, yystack.l_mark[-1].ptr, yystack.l_mark[0].ptr, NULLSTR, NULLSTR); + } +break; +case 288: +#line 816 "gram.y" + { + AddWorkSpace (curWorkSpc, yystack.l_mark[-3].ptr, yystack.l_mark[-2].ptr, yystack.l_mark[-1].ptr, yystack.l_mark[0].ptr, NULLSTR); + } +break; +case 289: +#line 819 "gram.y" + { + AddWorkSpace (curWorkSpc, yystack.l_mark[-4].ptr, yystack.l_mark[-3].ptr, yystack.l_mark[-2].ptr, yystack.l_mark[-1].ptr, yystack.l_mark[0].ptr); + } +break; +case 290: +#line 824 "gram.y" + { + WMapCreateCurrentBackGround (yystack.l_mark[-1].ptr, NULL, NULL, NULL); + } +break; +case 291: +#line 827 "gram.y" + { + WMapCreateCurrentBackGround (yystack.l_mark[-2].ptr, yystack.l_mark[-1].ptr, NULL, NULL); + } +break; +case 292: +#line 830 "gram.y" + { + WMapCreateCurrentBackGround (yystack.l_mark[-3].ptr, yystack.l_mark[-2].ptr, yystack.l_mark[-1].ptr, NULL); + } +break; +case 293: +#line 833 "gram.y" + { + WMapCreateCurrentBackGround (yystack.l_mark[-4].ptr, yystack.l_mark[-3].ptr, yystack.l_mark[-2].ptr, yystack.l_mark[-1].ptr); + } +break; +case 294: +#line 838 "gram.y" + { + WMapCreateDefaultBackGround (yystack.l_mark[-1].ptr, NULL, NULL, NULL); + } +break; +case 295: +#line 841 "gram.y" + { + WMapCreateDefaultBackGround (yystack.l_mark[-2].ptr, yystack.l_mark[-1].ptr, NULL, NULL); + } +break; +case 296: +#line 844 "gram.y" + { + WMapCreateDefaultBackGround (yystack.l_mark[-3].ptr, yystack.l_mark[-2].ptr, yystack.l_mark[-1].ptr, NULL); + } +break; +case 297: +#line 847 "gram.y" + { + WMapCreateDefaultBackGround (yystack.l_mark[-4].ptr, yystack.l_mark[-3].ptr, yystack.l_mark[-2].ptr, yystack.l_mark[-1].ptr); + } +break; +case 298: +#line 852 "gram.y" + {} +break; +case 301: +#line 859 "gram.y" + { if (Scr->FirstTime) + AddToList(list, yystack.l_mark[0].ptr, 0); + } +break; +case 302: +#line 864 "gram.y" + {} +break; +case 305: +#line 871 "gram.y" + {client = (char*)yystack.l_mark[0].ptr;} +break; +case 307: +#line 873 "gram.y" + {client = (char*)yystack.l_mark[0].ptr;} +break; +case 309: +#line 875 "gram.y" + {workspace = (char*)yystack.l_mark[0].ptr;} +break; +case 311: +#line 879 "gram.y" + {} +break; +case 314: +#line 886 "gram.y" + { + AddToClientsList (yystack.l_mark[0].ptr, client); + } +break; +case 315: +#line 891 "gram.y" + {} +break; +case 318: +#line 898 "gram.y" + { + AddToClientsList (workspace, yystack.l_mark[0].ptr); + } +break; +case 319: +#line 903 "gram.y" + {} +break; +case 322: +#line 910 "gram.y" + { if (Scr->FirstTime) AddToList(list, yystack.l_mark[-1].ptr, yystack.l_mark[0].ptr); } +break; +case 323: +#line 913 "gram.y" + {} +break; +case 326: +#line 920 "gram.y" + { AddToMenu(root, "", Action, NULL, yystack.l_mark[0].num, + NULLSTR, NULLSTR); + Action = ""; + } +break; +case 327: +#line 926 "gram.y" + {lastmenuitem = (MenuItem*) 0;} +break; +case 330: +#line 933 "gram.y" + { + if (yystack.l_mark[0].num == F_SEPARATOR) { + if (lastmenuitem) lastmenuitem->separated = 1; + } + else { + lastmenuitem = AddToMenu(root, yystack.l_mark[-1].ptr, Action, pull, yystack.l_mark[0].num, NULLSTR, NULLSTR); + Action = ""; + pull = NULL; + } + } +break; +case 331: +#line 943 "gram.y" + { + if (yystack.l_mark[0].num == F_SEPARATOR) { + if (lastmenuitem) lastmenuitem->separated = 1; + } + else { + lastmenuitem = AddToMenu(root, yystack.l_mark[-6].ptr, Action, pull, yystack.l_mark[0].num, yystack.l_mark[-4].ptr, yystack.l_mark[-2].ptr); + Action = ""; + pull = NULL; + } + } +break; +case 332: +#line 955 "gram.y" + { yyval.num = yystack.l_mark[0].num; } +break; +case 333: +#line 956 "gram.y" + { + yyval.num = yystack.l_mark[-1].num; + Action = (char*)yystack.l_mark[0].ptr; + switch (yystack.l_mark[-1].num) { + case F_MENU: + pull = GetRoot (yystack.l_mark[0].ptr, NULLSTR,NULLSTR); + pull->prev = root; + break; + case F_WARPRING: + if (!CheckWarpRingArg (Action)) { + twmrc_error_prefix(); + fprintf (stderr, + "ignoring invalid f.warptoring argument \"%s\"\n", + Action); + yyval.num = F_NOP; + } + case F_WARPTOSCREEN: + if (!CheckWarpScreenArg (Action)) { + twmrc_error_prefix(); + fprintf (stderr, + "ignoring invalid f.warptoscreen argument \"%s\"\n", + Action); + yyval.num = F_NOP; + } + break; + case F_COLORMAP: + if (CheckColormapArg (Action)) { + yyval.num = F_COLORMAP; + } else { + twmrc_error_prefix(); + fprintf (stderr, + "ignoring invalid f.colormap argument \"%s\"\n", + Action); + yyval.num = F_NOP; + } + break; + } /* end switch */ + } +break; +case 334: +#line 997 "gram.y" + { yyval.num = yystack.l_mark[0].num; } +break; +case 335: +#line 998 "gram.y" + { yyval.num = yystack.l_mark[0].num; } +break; +case 336: +#line 999 "gram.y" + { yyval.num = -(yystack.l_mark[0].num); } +break; +case 337: +#line 1002 "gram.y" + { yyval.num = yystack.l_mark[0].num; + if (yystack.l_mark[0].num == 0) + yyerror("bad button 0"); + + if (yystack.l_mark[0].num > MAX_BUTTONS) + { + yyval.num = 0; + yyerror("button number too large"); + } + } +break; +case 338: +#line 1014 "gram.y" + { ptr = (char *)malloc(strlen((char*)yystack.l_mark[0].ptr)+1); + strcpy(ptr, yystack.l_mark[0].ptr); + RemoveDQuote(ptr); + yyval.ptr = ptr; + } +break; +case 339: +#line 1021 "gram.y" + { yyval.num = yystack.l_mark[0].num; } +break; +#line 3365 "gram.tab.c" + } + yystack.s_mark -= yym; + yystate = *yystack.s_mark; + yystack.l_mark -= yym; + yym = yylhs[yyn]; + if (yystate == 0 && yym == 0) + { +#if YYDEBUG + if (yydebug) + printf("%sdebug: after reduction, shifting from state 0 to\ + state %d\n", YYPREFIX, YYFINAL); +#endif + yystate = YYFINAL; + *++yystack.s_mark = YYFINAL; + *++yystack.l_mark = yyval; + if (yychar < 0) + { + if ((yychar = YYLEX) < 0) yychar = YYEOF; +#if YYDEBUG + if (yydebug) + { + yys = yyname[YYTRANSLATE(yychar)]; + printf("%sdebug: state %d, reading %d (%s)\n", + YYPREFIX, YYFINAL, yychar, yys); + } +#endif + } + if (yychar == YYEOF) goto yyaccept; + goto yyloop; + } + if ((yyn = yygindex[yym]) && (yyn += yystate) >= 0 && + yyn <= YYTABLESIZE && yycheck[yyn] == yystate) + yystate = yytable[yyn]; + else + yystate = yydgoto[yym]; +#if YYDEBUG + if (yydebug) + printf("%sdebug: after reduction, shifting from state %d \ +to state %d\n", YYPREFIX, *yystack.s_mark, yystate); +#endif + if (yystack.s_mark >= yystack.s_last && yygrowstack(&yystack) == YYENOMEM) + { + goto yyoverflow; + } + *++yystack.s_mark = (YYINT) yystate; + *++yystack.l_mark = yyval; + goto yyloop; + +yyoverflow: + YYERROR_CALL("yacc stack overflow"); + +yyabort: + yyfreestack(&yystack); + return (1); + +yyaccept: + yyfreestack(&yystack); + return (0); +} Index: external/mit/ctwm/dist/gram.tab.h =================================================================== RCS file: external/mit/ctwm/dist/gram.tab.h diff -N external/mit/ctwm/dist/gram.tab.h --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/gram.tab.h 3 Sep 2015 12:19:54 -0000 @@ -0,0 +1,119 @@ +#define LB 257 +#define RB 258 +#define LP 259 +#define RP 260 +#define MENUS 261 +#define MENU 262 +#define BUTTON 263 +#define DEFAULT_FUNCTION 264 +#define PLUS 265 +#define MINUS 266 +#define ALL 267 +#define OR 268 +#define CURSORS 269 +#define PIXMAPS 270 +#define ICONS 271 +#define COLOR 272 +#define SAVECOLOR 273 +#define MONOCHROME 274 +#define FUNCTION 275 +#define ICONMGR_SHOW 276 +#define ICONMGR 277 +#define ALTER 278 +#define WINDOW_FUNCTION 279 +#define ZOOM 280 +#define ICONMGRS 281 +#define ICONMGR_GEOMETRY 282 +#define ICONMGR_NOSHOW 283 +#define MAKE_TITLE 284 +#define ICONIFY_BY_UNMAPPING 285 +#define DONT_ICONIFY_BY_UNMAPPING 286 +#define NO_BORDER 287 +#define NO_ICON_TITLE 288 +#define NO_TITLE 289 +#define AUTO_RAISE 290 +#define NO_HILITE 291 +#define ICON_REGION 292 +#define WINDOW_REGION 293 +#define META 294 +#define SHIFT 295 +#define LOCK 296 +#define CONTROL 297 +#define WINDOW 298 +#define TITLE 299 +#define ICON 300 +#define ROOT 301 +#define FRAME 302 +#define COLON 303 +#define EQUALS 304 +#define SQUEEZE_TITLE 305 +#define DONT_SQUEEZE_TITLE 306 +#define START_ICONIFIED 307 +#define NO_TITLE_HILITE 308 +#define TITLE_HILITE 309 +#define MOVE 310 +#define RESIZE 311 +#define WAITC 312 +#define SELECT 313 +#define KILL 314 +#define LEFT_TITLEBUTTON 315 +#define RIGHT_TITLEBUTTON 316 +#define NUMBER 317 +#define KEYWORD 318 +#define NKEYWORD 319 +#define CKEYWORD 320 +#define CLKEYWORD 321 +#define FKEYWORD 322 +#define FSKEYWORD 323 +#define SKEYWORD 324 +#define SSKEYWORD 325 +#define DKEYWORD 326 +#define JKEYWORD 327 +#define WINDOW_RING 328 +#define WINDOW_RING_EXCLUDE 329 +#define WARP_CURSOR 330 +#define ERRORTOKEN 331 +#define NO_STACKMODE 332 +#define ALWAYS_ON_TOP 333 +#define WORKSPACE 334 +#define WORKSPACES 335 +#define WORKSPCMGR_GEOMETRY 336 +#define OCCUPYALL 337 +#define OCCUPYLIST 338 +#define MAPWINDOWCURRENTWORKSPACE 339 +#define MAPWINDOWDEFAULTWORKSPACE 340 +#define UNMAPBYMOVINGFARAWAY 341 +#define OPAQUEMOVE 342 +#define NOOPAQUEMOVE 343 +#define OPAQUERESIZE 344 +#define NOOPAQUERESIZE 345 +#define DONTSETINACTIVE 346 +#define CHANGE_WORKSPACE_FUNCTION 347 +#define DEICONIFY_FUNCTION 348 +#define ICONIFY_FUNCTION 349 +#define AUTOSQUEEZE 350 +#define STARTSQUEEZED 351 +#define DONT_SAVE 352 +#define AUTO_LOWER 353 +#define ICONMENU_DONTSHOW 354 +#define WINDOW_BOX 355 +#define IGNOREMODIFIER 356 +#define WINDOW_GEOMETRIES 357 +#define ALWAYSSQUEEZETOGRAVITY 358 +#define VIRTUAL_SCREENS 359 +#define IGNORE_TRANSIENT 360 +#define DONTTOGGLEWORKSPACEMANAGERSTATE 361 +#define STRING 362 +#ifdef YYSTYPE +#undef YYSTYPE_IS_DECLARED +#define YYSTYPE_IS_DECLARED 1 +#endif +#ifndef YYSTYPE_IS_DECLARED +#define YYSTYPE_IS_DECLARED 1 +typedef union +{ + int num; + char *ptr; +} YYSTYPE; +#endif /* !YYSTYPE_IS_DECLARED */ +extern YYSTYPE yylval; Index: external/mit/ctwm/dist/gram.y =================================================================== RCS file: external/mit/ctwm/dist/gram.y diff -N external/mit/ctwm/dist/gram.y --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/gram.y 3 Sep 2015 12:19:54 -0000 @@ -0,0 +1,1243 @@ +/*****************************************************************************/ +/** Copyright 1988 by Evans & Sutherland Computer Corporation, **/ +/** Salt Lake City, Utah **/ +/** Portions Copyright 1989 by the Massachusetts Institute of Technology **/ +/** Cambridge, Massachusetts **/ +/** **/ +/** All Rights Reserved **/ +/** **/ +/** Permission to use, copy, modify, and distribute this software and **/ +/** its documentation for any purpose and without fee is hereby **/ +/** granted, provided that the above copyright notice appear in all **/ +/** copies and that both that copyright notice and this permis- **/ +/** sion notice appear in supporting documentation, and that the **/ +/** names of Evans & Sutherland and M.I.T. not be used in advertising **/ +/** in publicity pertaining to distribution of the software without **/ +/** specific, written prior permission. **/ +/** **/ +/** EVANS & SUTHERLAND AND M.I.T. DISCLAIM ALL WARRANTIES WITH REGARD **/ +/** TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANT- **/ +/** ABILITY AND FITNESS, IN NO EVENT SHALL EVANS & SUTHERLAND OR **/ +/** M.I.T. BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAM- **/ +/** AGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA **/ +/** OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER **/ +/** TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE **/ +/** OR PERFORMANCE OF THIS SOFTWARE. **/ +/*****************************************************************************/ +/* + * [ ctwm ] + * + * Copyright 1992 Claude Lecommandeur. + * + * Permission to use, copy, modify and distribute this software [ctwm] and + * its documentation for any purpose is hereby granted without fee, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting documen- + * tation, and that the name of Claude Lecommandeur not be used in adverti- + * sing or publicity pertaining to distribution of the software without + * specific, written prior permission. Claude Lecommandeur make no represen- + * tations about the suitability of this software for any purpose. It is + * provided "as is" without express or implied warranty. + * + * Claude Lecommandeur DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO + * EVENT SHALL Claude Lecommandeur BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF + * USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR + * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + * + * Author: Claude Lecommandeur [ lecom@sic.epfl.ch ][ April 1992 ] + */ + + +/*********************************************************************** + * + * $XConsortium: gram.y,v 1.91 91/02/08 18:21:56 dave Exp $ + * + * .twmrc command grammer + * + * 07-Jan-86 Thomas E. LaStrange File created + * 11-Nov-90 Dave Sternlicht Adding SaveColors + * 10-Oct-90 David M. Sternlicht Storing saved colors on root + * 22-April-92 Claude Lecommandeur modifications for ctwm. + * + ***********************************************************************/ + +%{ +#include +#include +#include "twm.h" +#include "menus.h" +#include "icons.h" +#include "windowbox.h" +#include "add_window.h" +#include "list.h" +#include "util.h" +#include "screen.h" +#include "parse.h" +#include "cursor.h" +#ifdef VMS +# include +# include +#else +# include +# include +#endif + +static char *Action = ""; +static char *Name = ""; +static char *defstring = "default"; +static MenuRoot *root, *pull = NULL; +static char *curWorkSpc; +static char *client, *workspace; +static MenuItem *lastmenuitem = (MenuItem*) 0; + +extern void yyerror(char *s); +extern void RemoveDQuote(char *str); + +static MenuRoot *GetRoot(char *name, char *fore, char *back); + +static Bool CheckWarpScreenArg(register char *s); +static Bool CheckWarpRingArg(register char *s); +static Bool CheckColormapArg(register char *s); +static void GotButton(int butt, int func); +static void GotKey(char *key, int func); +static void GotTitleButton(char *bitmapname, int func, Bool rightside); +static char *ptr; +static name_list **list; +static int cont = 0; +static int color; +Bool donttoggleworkspacemanagerstate = FALSE; +int mods = 0; +unsigned int mods_used = (ShiftMask | ControlMask | Mod1Mask); + +extern void twmrc_error_prefix(void); + +extern int yylex(void); +extern int yyparse(void); +%} + +%union +{ + int num; + char *ptr; +}; + + +%token LB RB LP RP MENUS MENU BUTTON DEFAULT_FUNCTION PLUS MINUS +%token ALL OR CURSORS PIXMAPS ICONS COLOR SAVECOLOR MONOCHROME FUNCTION +%token ICONMGR_SHOW ICONMGR ALTER WINDOW_FUNCTION ZOOM ICONMGRS +%token ICONMGR_GEOMETRY ICONMGR_NOSHOW MAKE_TITLE +%token ICONIFY_BY_UNMAPPING DONT_ICONIFY_BY_UNMAPPING +%token NO_BORDER NO_ICON_TITLE NO_TITLE AUTO_RAISE NO_HILITE ICON_REGION +%token WINDOW_REGION META SHIFT LOCK CONTROL WINDOW TITLE ICON ROOT FRAME +%token COLON EQUALS SQUEEZE_TITLE DONT_SQUEEZE_TITLE +%token START_ICONIFIED NO_TITLE_HILITE TITLE_HILITE +%token MOVE RESIZE WAITC SELECT KILL LEFT_TITLEBUTTON RIGHT_TITLEBUTTON +%token NUMBER KEYWORD NKEYWORD CKEYWORD CLKEYWORD FKEYWORD FSKEYWORD +%token SKEYWORD SSKEYWORD DKEYWORD JKEYWORD WINDOW_RING WINDOW_RING_EXCLUDE WARP_CURSOR ERRORTOKEN +%token NO_STACKMODE ALWAYS_ON_TOP WORKSPACE WORKSPACES WORKSPCMGR_GEOMETRY +%token OCCUPYALL OCCUPYLIST MAPWINDOWCURRENTWORKSPACE MAPWINDOWDEFAULTWORKSPACE +%token UNMAPBYMOVINGFARAWAY OPAQUEMOVE NOOPAQUEMOVE OPAQUERESIZE NOOPAQUERESIZE +%token DONTSETINACTIVE CHANGE_WORKSPACE_FUNCTION DEICONIFY_FUNCTION ICONIFY_FUNCTION +%token AUTOSQUEEZE STARTSQUEEZED DONT_SAVE AUTO_LOWER ICONMENU_DONTSHOW WINDOW_BOX +%token IGNOREMODIFIER WINDOW_GEOMETRIES ALWAYSSQUEEZETOGRAVITY VIRTUAL_SCREENS +%token IGNORE_TRANSIENT DONTTOGGLEWORKSPACEMANAGERSTATE +%token STRING + +%type string +%type action button number signed_number keyaction full fullkey + +%start twmrc + +%% +twmrc : stmts + ; + +stmts : /* Empty */ + | stmts stmt + ; + +stmt : error + | noarg + | sarg + | narg + | squeeze + | ICON_REGION string DKEYWORD DKEYWORD number number { + (void) AddIconRegion($2, $3, $4, $5, $6, "undef", "undef", "undef"); + } + | ICON_REGION string DKEYWORD DKEYWORD number number string { + (void) AddIconRegion($2, $3, $4, $5, $6, $7, "undef", "undef"); + } + | ICON_REGION string DKEYWORD DKEYWORD number number string string { + (void) AddIconRegion($2, $3, $4, $5, $6, $7, $8, "undef"); + } + | ICON_REGION string DKEYWORD DKEYWORD number number string string string { + (void) AddIconRegion($2, $3, $4, $5, $6, $7, $8, $9); + } + | ICON_REGION string DKEYWORD DKEYWORD number number { + list = AddIconRegion($2, $3, $4, $5, $6, "undef", "undef", "undef"); + } + win_list + | ICON_REGION string DKEYWORD DKEYWORD number number string { + list = AddIconRegion($2, $3, $4, $5, $6, $7, "undef", "undef"); + } + win_list + | ICON_REGION string DKEYWORD DKEYWORD number number string string { + list = AddIconRegion($2, $3, $4, $5, $6, $7, $8, "undef"); + } + win_list + | ICON_REGION string DKEYWORD DKEYWORD number number string string string { + list = AddIconRegion($2, $3, $4, $5, $6, $7, $8, $9); + } + win_list + + | WINDOW_REGION string DKEYWORD DKEYWORD { + list = AddWindowRegion ($2, $3, $4); + } + win_list + + | WINDOW_BOX string string { + list = addWindowBox ($2, $3); + } + win_list + + | ICONMGR_GEOMETRY string number { if (Scr->FirstTime) + { + Scr->iconmgr->geometry= (char*)$2; + Scr->iconmgr->columns=$3; + } + } + | ICONMGR_GEOMETRY string { if (Scr->FirstTime) + Scr->iconmgr->geometry = (char*)$2; + } + | WORKSPCMGR_GEOMETRY string number { if (Scr->FirstTime) + { + Scr->workSpaceMgr.geometry= (char*)$2; + Scr->workSpaceMgr.columns=$3; + } + } + | WORKSPCMGR_GEOMETRY string { if (Scr->FirstTime) + Scr->workSpaceMgr.geometry = (char*)$2; + } + | MAPWINDOWCURRENTWORKSPACE {} + curwork + + | MAPWINDOWDEFAULTWORKSPACE {} + defwork + + | ZOOM number { if (Scr->FirstTime) + { + Scr->DoZoom = TRUE; + Scr->ZoomCount = $2; + } + } + | ZOOM { if (Scr->FirstTime) + Scr->DoZoom = TRUE; } + | PIXMAPS pixmap_list {} + | CURSORS cursor_list {} + | ICONIFY_BY_UNMAPPING { list = &Scr->IconifyByUn; } + win_list + | ICONIFY_BY_UNMAPPING { if (Scr->FirstTime) + Scr->IconifyByUnmapping = TRUE; } + + | OPAQUEMOVE { list = &Scr->OpaqueMoveList; } + win_list + | OPAQUEMOVE { if (Scr->FirstTime) Scr->DoOpaqueMove = TRUE; } + | NOOPAQUEMOVE { list = &Scr->NoOpaqueMoveList; } + win_list + | NOOPAQUEMOVE { if (Scr->FirstTime) Scr->DoOpaqueMove = FALSE; } + | OPAQUERESIZE { list = &Scr->OpaqueMoveList; } + win_list + | OPAQUERESIZE { if (Scr->FirstTime) Scr->DoOpaqueResize = TRUE; } + | NOOPAQUERESIZE { list = &Scr->NoOpaqueResizeList; } + win_list + | NOOPAQUERESIZE { if (Scr->FirstTime) Scr->DoOpaqueResize = FALSE; } + + | LEFT_TITLEBUTTON string EQUALS action { + GotTitleButton ($2, $4, False); + } + | RIGHT_TITLEBUTTON string EQUALS action { + GotTitleButton ($2, $4, True); + } + | LEFT_TITLEBUTTON string { CreateTitleButton($2, 0, NULL, NULL, FALSE, TRUE); } + binding_list + | RIGHT_TITLEBUTTON string { CreateTitleButton($2, 0, NULL, NULL, TRUE, TRUE); } + binding_list + | button string { + root = GetRoot($2, NULLSTR, NULLSTR); + AddFuncButton ($1, C_ROOT, 0, F_MENU, root, (MenuItem*) 0); + } + | button action { + if ($2 == F_MENU) { + pull->prev = NULL; + AddFuncButton ($1, C_ROOT, 0, $2, pull, (MenuItem*) 0); + } + else { + MenuItem *item; + + root = GetRoot(TWM_ROOT,NULLSTR,NULLSTR); + item = AddToMenu (root, "x", Action, + NULL, $2, NULLSTR, NULLSTR); + AddFuncButton ($1, C_ROOT, 0, $2, (MenuRoot*) 0, item); + } + Action = ""; + pull = NULL; + } + | string fullkey { GotKey($1, $2); } + | button full { GotButton($1, $2); } + + | DONT_ICONIFY_BY_UNMAPPING { list = &Scr->DontIconify; } + win_list + | WORKSPACES {} + workspc_list + | IGNOREMODIFIER {} LB keys { Scr->IgnoreModifier = mods; mods = 0; } RB + | OCCUPYALL { list = &Scr->OccupyAll; } + win_list + | ICONMENU_DONTSHOW { list = &Scr->IconMenuDontShow; } + win_list + | OCCUPYLIST {} + occupy_list + | UNMAPBYMOVINGFARAWAY { list = &Scr->UnmapByMovingFarAway; } + win_list + | AUTOSQUEEZE { list = &Scr->AutoSqueeze; } + win_list + | STARTSQUEEZED { list = &Scr->StartSqueezed; } + win_list + | ALWAYSSQUEEZETOGRAVITY { Scr->AlwaysSqueezeToGravity = TRUE; } + | ALWAYSSQUEEZETOGRAVITY { list = &Scr->AlwaysSqueezeToGravityL; } + win_list + | DONTSETINACTIVE { list = &Scr->DontSetInactive; } + win_list + | ICONMGR_NOSHOW { list = &Scr->IconMgrNoShow; } + win_list + | ICONMGR_NOSHOW { Scr->IconManagerDontShow = TRUE; } + | ICONMGRS { list = &Scr->IconMgrs; } + iconm_list + | ICONMGR_SHOW { list = &Scr->IconMgrShow; } + win_list + | NO_TITLE_HILITE { list = &Scr->NoTitleHighlight; } + win_list + | NO_TITLE_HILITE { if (Scr->FirstTime) + Scr->TitleHighlight = FALSE; } + | NO_HILITE { list = &Scr->NoHighlight; } + win_list + | NO_HILITE { if (Scr->FirstTime) + Scr->Highlight = FALSE; } + | ALWAYS_ON_TOP { list = &Scr->AlwaysOnTopL; } + win_list + | NO_STACKMODE { list = &Scr->NoStackModeL; } + win_list + | NO_STACKMODE { if (Scr->FirstTime) + Scr->StackMode = FALSE; } + | NO_BORDER { list = &Scr->NoBorder; } + win_list + | DONT_SAVE { list = &Scr->DontSave; } + win_list + | NO_ICON_TITLE { list = &Scr->NoIconTitle; } + win_list + | NO_ICON_TITLE { if (Scr->FirstTime) + Scr->NoIconTitlebar = TRUE; } + | NO_TITLE { list = &Scr->NoTitle; } + win_list + | NO_TITLE { if (Scr->FirstTime) + Scr->NoTitlebar = TRUE; } + | IGNORE_TRANSIENT { list = &Scr->IgnoreTransientL; } + win_list + | DONTTOGGLEWORKSPACEMANAGERSTATE { donttoggleworkspacemanagerstate = TRUE; } + | MAKE_TITLE { list = &Scr->MakeTitle; } + win_list + | START_ICONIFIED { list = &Scr->StartIconified; } + win_list + | AUTO_RAISE { list = &Scr->AutoRaise; } + win_list + | AUTO_RAISE { Scr->AutoRaiseDefault = TRUE; } + | AUTO_LOWER { list = &Scr->AutoLower; } + win_list + | AUTO_LOWER { Scr->AutoLowerDefault = TRUE; } + | MENU string LP string COLON string RP { + root = GetRoot($2, $4, $6); } + menu { root->real_menu = TRUE;} + | MENU string { root = GetRoot($2, NULLSTR, NULLSTR); } + menu { root->real_menu = TRUE; } + | FUNCTION string { root = GetRoot($2, NULLSTR, NULLSTR); } + function + | ICONS { list = &Scr->IconNames; } + icon_list + | COLOR { color = COLOR; } + color_list + | SAVECOLOR {} + save_color_list + | MONOCHROME { color = MONOCHROME; } + color_list + | DEFAULT_FUNCTION action { Scr->DefaultFunction.func = $2; + if ($2 == F_MENU) + { + pull->prev = NULL; + Scr->DefaultFunction.menu = pull; + } + else + { + root = GetRoot(TWM_ROOT,NULLSTR,NULLSTR); + Scr->DefaultFunction.item = + AddToMenu(root,"x",Action, + NULL,$2, NULLSTR, NULLSTR); + } + Action = ""; + pull = NULL; + } + | WINDOW_FUNCTION action { Scr->WindowFunction.func = $2; + root = GetRoot(TWM_ROOT,NULLSTR,NULLSTR); + Scr->WindowFunction.item = + AddToMenu(root,"x",Action, + NULL,$2, NULLSTR, NULLSTR); + Action = ""; + pull = NULL; + } + | CHANGE_WORKSPACE_FUNCTION action { Scr->ChangeWorkspaceFunction.func = $2; + root = GetRoot(TWM_ROOT,NULLSTR,NULLSTR); + Scr->ChangeWorkspaceFunction.item = + AddToMenu(root,"x",Action, + NULL,$2, NULLSTR, NULLSTR); + Action = ""; + pull = NULL; + } + | DEICONIFY_FUNCTION action { Scr->DeIconifyFunction.func = $2; + root = GetRoot(TWM_ROOT,NULLSTR,NULLSTR); + Scr->DeIconifyFunction.item = + AddToMenu(root,"x",Action, + NULL,$2, NULLSTR, NULLSTR); + Action = ""; + pull = NULL; + } + | ICONIFY_FUNCTION action { Scr->IconifyFunction.func = $2; + root = GetRoot(TWM_ROOT,NULLSTR,NULLSTR); + Scr->IconifyFunction.item = + AddToMenu(root,"x",Action, + NULL,$2, NULLSTR, NULLSTR); + Action = ""; + pull = NULL; + } + | WARP_CURSOR { list = &Scr->WarpCursorL; } + win_list + | WARP_CURSOR { if (Scr->FirstTime) + Scr->WarpCursor = TRUE; } + | WINDOW_RING { list = &Scr->WindowRingL; } + win_list + | WINDOW_RING { Scr->WindowRingAll = TRUE; } + | WINDOW_RING_EXCLUDE { if (!Scr->WindowRingL) + Scr->WindowRingAll = TRUE; + list = &Scr->WindowRingExcludeL; } + win_list + | WINDOW_GEOMETRIES { } + wingeom_list + | VIRTUAL_SCREENS { } + geom_list + ; + +noarg : KEYWORD { if (!do_single_keyword ($1)) { + twmrc_error_prefix(); + fprintf (stderr, + "unknown singleton keyword %d\n", + $1); + ParseError = 1; + } + } + ; + +sarg : SKEYWORD string { if (!do_string_keyword ($1, $2)) { + twmrc_error_prefix(); + fprintf (stderr, + "unknown string keyword %d (value \"%s\")\n", + $1, $2); + ParseError = 1; + } + } + | SKEYWORD { if (!do_string_keyword ($1, defstring)) { + twmrc_error_prefix(); + fprintf (stderr, + "unknown string keyword %d (no value)\n", + $1); + ParseError = 1; + } + } + ; + +sarg : SSKEYWORD string string + { if (!do_string_string_keyword ($1, $2, $3)) { + twmrc_error_prefix(); + fprintf (stderr, + "unknown strings keyword %d (value \"%s\" and \"%s\")\n", + $1, $2, $3); + ParseError = 1; + } + } + | SSKEYWORD string { if (!do_string_string_keyword ($1, $2, defstring)) { + twmrc_error_prefix(); + fprintf (stderr, + "unknown string keyword %d (value \"%s\")\n", + $1, $2); + ParseError = 1; + } + } + | SSKEYWORD { if (!do_string_string_keyword ($1, defstring, defstring)) { + twmrc_error_prefix(); + fprintf (stderr, + "unknown string keyword %d (no value)\n", + $1); + ParseError = 1; + } + } + ; + +narg : NKEYWORD number { if (!do_number_keyword ($1, $2)) { + twmrc_error_prefix(); + fprintf (stderr, + "unknown numeric keyword %d (value %d)\n", + $1, $2); + ParseError = 1; + } + } + ; + + + +keyaction : EQUALS keys COLON action { $$ = $4; } + ; + +full : EQUALS keys COLON contexts COLON action { $$ = $6; } + ; + +fullkey : EQUALS keys COLON contextkeys COLON action { $$ = $6; } + ; + +keys : /* Empty */ + | keys key + ; + +key : META { mods |= Mod1Mask; } + | SHIFT { mods |= ShiftMask; } + | LOCK { mods |= LockMask; } + | CONTROL { mods |= ControlMask; } + | ALTER number { if ($2 < 1 || $2 > 5) { + twmrc_error_prefix(); + fprintf (stderr, + "bad modifier number (%d), must be 1-5\n", + $2); + ParseError = 1; + } else { + mods |= (Alt1Mask << ($2 - 1)); + } + } + | META number { if ($2 < 1 || $2 > 5) { + twmrc_error_prefix(); + fprintf (stderr, + "bad modifier number (%d), must be 1-5\n", + $2); + ParseError = 1; + } else { + mods |= (Mod1Mask << ($2 - 1)); + } + } + | OR { } + ; + +contexts : /* Empty */ + | contexts context + ; + +context : WINDOW { cont |= C_WINDOW_BIT; } + | TITLE { cont |= C_TITLE_BIT; } + | ICON { cont |= C_ICON_BIT; } + | ROOT { cont |= C_ROOT_BIT; } + | FRAME { cont |= C_FRAME_BIT; } + | WORKSPACE { cont |= C_WORKSPACE_BIT; } + | ICONMGR { cont |= C_ICONMGR_BIT; } + | META { cont |= C_ICONMGR_BIT; } + | ALTER { cont |= C_ALTER_BIT; } + | ALL { cont |= C_ALL_BITS; } + | OR { } + ; + +contextkeys : /* Empty */ + | contextkeys contextkey + ; + +contextkey : WINDOW { cont |= C_WINDOW_BIT; } + | TITLE { cont |= C_TITLE_BIT; } + | ICON { cont |= C_ICON_BIT; } + | ROOT { cont |= C_ROOT_BIT; } + | FRAME { cont |= C_FRAME_BIT; } + | WORKSPACE { cont |= C_WORKSPACE_BIT; } + | ICONMGR { cont |= C_ICONMGR_BIT; } + | META { cont |= C_ICONMGR_BIT; } + | ALL { cont |= C_ALL_BITS; } + | ALTER { cont |= C_ALTER_BIT; } + | OR { } + | string { Name = (char*)$1; cont |= C_NAME_BIT; } + ; + + +binding_list : LB binding_entries RB {} + ; + +binding_entries : /* Empty */ + | binding_entries binding_entry + ; + +binding_entry : button keyaction { ModifyCurrentTB($1, mods, $2, Action, pull); mods = 0;} + | button EQUALS action { ModifyCurrentTB($1, 0, $3, Action, pull);} + /* The following is deprecated! */ + | button COLON action { ModifyCurrentTB($1, 0, $3, Action, pull);} + ; + + +pixmap_list : LB pixmap_entries RB {} + ; + +pixmap_entries : /* Empty */ + | pixmap_entries pixmap_entry + ; + +pixmap_entry : TITLE_HILITE string { SetHighlightPixmap ($2); } + ; + + +cursor_list : LB cursor_entries RB {} + ; + +cursor_entries : /* Empty */ + | cursor_entries cursor_entry + ; + +cursor_entry : FRAME string string { + NewBitmapCursor(&Scr->FrameCursor, $2, $3); } + | FRAME string { + NewFontCursor(&Scr->FrameCursor, $2); } + | TITLE string string { + NewBitmapCursor(&Scr->TitleCursor, $2, $3); } + | TITLE string { + NewFontCursor(&Scr->TitleCursor, $2); } + | ICON string string { + NewBitmapCursor(&Scr->IconCursor, $2, $3); } + | ICON string { + NewFontCursor(&Scr->IconCursor, $2); } + | ICONMGR string string { + NewBitmapCursor(&Scr->IconMgrCursor, $2, $3); } + | ICONMGR string { + NewFontCursor(&Scr->IconMgrCursor, $2); } + | BUTTON string string { + NewBitmapCursor(&Scr->ButtonCursor, $2, $3); } + | BUTTON string { + NewFontCursor(&Scr->ButtonCursor, $2); } + | MOVE string string { + NewBitmapCursor(&Scr->MoveCursor, $2, $3); } + | MOVE string { + NewFontCursor(&Scr->MoveCursor, $2); } + | RESIZE string string { + NewBitmapCursor(&Scr->ResizeCursor, $2, $3); } + | RESIZE string { + NewFontCursor(&Scr->ResizeCursor, $2); } + | WAITC string string { + NewBitmapCursor(&Scr->WaitCursor, $2, $3); } + | WAITC string { + NewFontCursor(&Scr->WaitCursor, $2); } + | MENU string string { + NewBitmapCursor(&Scr->MenuCursor, $2, $3); } + | MENU string { + NewFontCursor(&Scr->MenuCursor, $2); } + | SELECT string string { + NewBitmapCursor(&Scr->SelectCursor, $2, $3); } + | SELECT string { + NewFontCursor(&Scr->SelectCursor, $2); } + | KILL string string { + NewBitmapCursor(&Scr->DestroyCursor, $2, $3); } + | KILL string { + NewFontCursor(&Scr->DestroyCursor, $2); } + ; + +color_list : LB color_entries RB {} + ; + + +color_entries : /* Empty */ + | color_entries color_entry + ; + +color_entry : CLKEYWORD string { if (!do_colorlist_keyword ($1, color, + $2)) { + twmrc_error_prefix(); + fprintf (stderr, + "unhandled list color keyword %d (string \"%s\")\n", + $1, $2); + ParseError = 1; + } + } + | CLKEYWORD string { list = do_colorlist_keyword($1,color, + $2); + if (!list) { + twmrc_error_prefix(); + fprintf (stderr, + "unhandled color list keyword %d (string \"%s\")\n", + $1, $2); + ParseError = 1; + } + } + win_color_list + | CKEYWORD string { if (!do_color_keyword ($1, color, + $2)) { + twmrc_error_prefix(); + fprintf (stderr, + "unhandled color keyword %d (string \"%s\")\n", + $1, $2); + ParseError = 1; + } + } + ; + +save_color_list : LB s_color_entries RB {} + ; + +s_color_entries : /* Empty */ + | s_color_entries s_color_entry + ; + +s_color_entry : string { do_string_savecolor(color, $1); } + | CLKEYWORD { do_var_savecolor($1); } + ; + +win_color_list : LB win_color_entries RB {} + ; + +win_color_entries : /* Empty */ + | win_color_entries win_color_entry + ; + +win_color_entry : string string { if (Scr->FirstTime && + color == Scr->Monochrome) + AddToList(list, $1, $2); } + ; + +wingeom_list : LB wingeom_entries RB {} + ; + +wingeom_entries : /* Empty */ + | wingeom_entries wingeom_entry + ; +/* added a ';' after call to AddToList */ +wingeom_entry : string string { AddToList (&Scr->WindowGeometries, $1, $2); } + ; + +geom_list : LB geom_entries RB {} + ; + +geom_entries : /* Empty */ + | geom_entries geom_entry + ; + +geom_entry : string { AddToList (&Scr->VirtualScreens, $1, ""); } + ; + +squeeze : SQUEEZE_TITLE { + if (HasShape) Scr->SqueezeTitle = TRUE; + } + | SQUEEZE_TITLE { list = &Scr->SqueezeTitleL; + if (HasShape && Scr->SqueezeTitle == -1) + Scr->SqueezeTitle = TRUE; + } + LB win_sqz_entries RB + | DONT_SQUEEZE_TITLE { Scr->SqueezeTitle = FALSE; } + | DONT_SQUEEZE_TITLE { list = &Scr->DontSqueezeTitleL; } + win_list + ; + +win_sqz_entries : /* Empty */ + | win_sqz_entries string JKEYWORD signed_number number { + if (Scr->FirstTime) { + do_squeeze_entry (list, $2, $3, $4, $5); + } + } + ; + + +iconm_list : LB iconm_entries RB {} + ; + +iconm_entries : /* Empty */ + | iconm_entries iconm_entry + ; + +iconm_entry : string string number { if (Scr->FirstTime) + AddToList(list, $1, (char *) + AllocateIconManager($1, NULLSTR, + $2,$3)); + } + | string string string number + { if (Scr->FirstTime) + AddToList(list, $1, (char *) + AllocateIconManager($1,$2, + $3, $4)); + } + ; + +workspc_list : LB workspc_entries RB {} + ; + +workspc_entries : /* Empty */ + | workspc_entries workspc_entry + ; + +workspc_entry : string { + AddWorkSpace ($1, NULLSTR, NULLSTR, NULLSTR, NULLSTR, NULLSTR); + } + | string { + curWorkSpc = (char*)$1; + } + workapp_list + ; + +workapp_list : LB workapp_entries RB {} + ; + +workapp_entries : /* Empty */ + | workapp_entries workapp_entry + ; + +workapp_entry : string { + AddWorkSpace (curWorkSpc, $1, NULLSTR, NULLSTR, NULLSTR, NULLSTR); + } + | string string { + AddWorkSpace (curWorkSpc, $1, $2, NULLSTR, NULLSTR, NULLSTR); + } + | string string string { + AddWorkSpace (curWorkSpc, $1, $2, $3, NULLSTR, NULLSTR); + } + | string string string string { + AddWorkSpace (curWorkSpc, $1, $2, $3, $4, NULLSTR); + } + | string string string string string { + AddWorkSpace (curWorkSpc, $1, $2, $3, $4, $5); + } + ; + +curwork : LB string RB { + WMapCreateCurrentBackGround ($2, NULL, NULL, NULL); + } + | LB string string RB { + WMapCreateCurrentBackGround ($2, $3, NULL, NULL); + } + | LB string string string RB { + WMapCreateCurrentBackGround ($2, $3, $4, NULL); + } + | LB string string string string RB { + WMapCreateCurrentBackGround ($2, $3, $4, $5); + } + ; + +defwork : LB string RB { + WMapCreateDefaultBackGround ($2, NULL, NULL, NULL); + } + | LB string string RB { + WMapCreateDefaultBackGround ($2, $3, NULL, NULL); + } + | LB string string string RB { + WMapCreateDefaultBackGround ($2, $3, $4, NULL); + } + | LB string string string string RB { + WMapCreateDefaultBackGround ($2, $3, $4, $5); + } + ; + +win_list : LB win_entries RB {} + ; + +win_entries : /* Empty */ + | win_entries win_entry + ; + +win_entry : string { if (Scr->FirstTime) + AddToList(list, $1, 0); + } + ; + +occupy_list : LB occupy_entries RB {} + ; + +occupy_entries : /* Empty */ + | occupy_entries occupy_entry + ; + +occupy_entry : string {client = (char*)$1;} + occupy_workspc_list + | WINDOW string {client = (char*)$2;} + occupy_workspc_list + | WORKSPACE string {workspace = (char*)$2;} + occupy_window_list + ; + +occupy_workspc_list : LB occupy_workspc_entries RB {} + ; + +occupy_workspc_entries : /* Empty */ + | occupy_workspc_entries occupy_workspc_entry + ; + +occupy_workspc_entry : string { + AddToClientsList ($1, client); + } + ; + +occupy_window_list : LB occupy_window_entries RB {} + ; + +occupy_window_entries : /* Empty */ + | occupy_window_entries occupy_window_entry + ; + +occupy_window_entry : string { + AddToClientsList (workspace, $1); + } + ; + +icon_list : LB icon_entries RB {} + ; + +icon_entries : /* Empty */ + | icon_entries icon_entry + ; + +icon_entry : string string { if (Scr->FirstTime) AddToList(list, $1, $2); } + ; + +function : LB function_entries RB {} + ; + +function_entries: /* Empty */ + | function_entries function_entry + ; + +function_entry : action { AddToMenu(root, "", Action, NULL, $1, + NULLSTR, NULLSTR); + Action = ""; + } + ; + +menu : LB menu_entries RB {lastmenuitem = (MenuItem*) 0;} + ; + +menu_entries : /* Empty */ + | menu_entries menu_entry + ; + +menu_entry : string action { + if ($2 == F_SEPARATOR) { + if (lastmenuitem) lastmenuitem->separated = 1; + } + else { + lastmenuitem = AddToMenu(root, $1, Action, pull, $2, NULLSTR, NULLSTR); + Action = ""; + pull = NULL; + } + } + | string LP string COLON string RP action { + if ($7 == F_SEPARATOR) { + if (lastmenuitem) lastmenuitem->separated = 1; + } + else { + lastmenuitem = AddToMenu(root, $1, Action, pull, $7, $3, $5); + Action = ""; + pull = NULL; + } + } + ; + +action : FKEYWORD { $$ = $1; } + | FSKEYWORD string { + $$ = $1; + Action = (char*)$2; + switch ($1) { + case F_MENU: + pull = GetRoot ($2, NULLSTR,NULLSTR); + pull->prev = root; + break; + case F_WARPRING: + if (!CheckWarpRingArg (Action)) { + twmrc_error_prefix(); + fprintf (stderr, + "ignoring invalid f.warptoring argument \"%s\"\n", + Action); + $$ = F_NOP; + } + case F_WARPTOSCREEN: + if (!CheckWarpScreenArg (Action)) { + twmrc_error_prefix(); + fprintf (stderr, + "ignoring invalid f.warptoscreen argument \"%s\"\n", + Action); + $$ = F_NOP; + } + break; + case F_COLORMAP: + if (CheckColormapArg (Action)) { + $$ = F_COLORMAP; + } else { + twmrc_error_prefix(); + fprintf (stderr, + "ignoring invalid f.colormap argument \"%s\"\n", + Action); + $$ = F_NOP; + } + break; + } /* end switch */ + } + ; + + +signed_number : number { $$ = $1; } + | PLUS number { $$ = $2; } + | MINUS number { $$ = -($2); } + ; + +button : BUTTON number { $$ = $2; + if ($2 == 0) + yyerror("bad button 0"); + + if ($2 > MAX_BUTTONS) + { + $$ = 0; + yyerror("button number too large"); + } + } + ; + +string : STRING { ptr = (char *)malloc(strlen((char*)$1)+1); + strcpy(ptr, $1); + RemoveDQuote(ptr); + $$ = ptr; + } + ; + +number : NUMBER { $$ = $1; } + ; + +%% +void yyerror(char *s) +{ + twmrc_error_prefix(); + fprintf (stderr, "error in input file: %s\n", s ? s : ""); + ParseError = 1; +} + +void RemoveDQuote(char *str) +{ + register char *i, *o; + register int n; + register int count; + + for (i=str+1, o=str; *i && *i != '\"'; o++) + { + if (*i == '\\') + { + switch (*++i) + { + case 'n': + *o = '\n'; + i++; + break; + case 'b': + *o = '\b'; + i++; + break; + case 'r': + *o = '\r'; + i++; + break; + case 't': + *o = '\t'; + i++; + break; + case 'f': + *o = '\f'; + i++; + break; + case '0': + if (*++i == 'x') + goto hex; + else + --i; + case '1': case '2': case '3': + case '4': case '5': case '6': case '7': + n = 0; + count = 0; + while (*i >= '0' && *i <= '7' && count < 3) + { + n = (n<<3) + (*i++ - '0'); + count++; + } + *o = n; + break; + hex: + case 'x': + n = 0; + count = 0; + while (i++, count++ < 2) + { + if (*i >= '0' && *i <= '9') + n = (n<<4) + (*i - '0'); + else if (*i >= 'a' && *i <= 'f') + n = (n<<4) + (*i - 'a') + 10; + else if (*i >= 'A' && *i <= 'F') + n = (n<<4) + (*i - 'A') + 10; + else + break; + } + *o = n; + break; + case '\n': + i++; /* punt */ + o--; /* to account for o++ at end of loop */ + break; + case '\"': + case '\'': + case '\\': + default: + *o = *i++; + break; + } + } + else + *o = *i++; + } + *o = '\0'; +} + +static MenuRoot *GetRoot(char *name, char *fore, char *back) +{ + MenuRoot *tmp; + + tmp = FindMenuRoot(name); + if (tmp == NULL) + tmp = NewMenuRoot(name); + + if (fore) + { + int save; + + save = Scr->FirstTime; + Scr->FirstTime = TRUE; + GetColor(COLOR, &tmp->highlight.fore, fore); + GetColor(COLOR, &tmp->highlight.back, back); + Scr->FirstTime = save; + } + + return tmp; +} + +static void GotButton (int butt, int func) +{ + int i; + MenuItem *item; + + for (i = 0; i < NUM_CONTEXTS; i++) { + if ((cont & (1 << i)) == 0) continue; + + if (func == F_MENU) { + pull->prev = NULL; + AddFuncButton (butt, i, mods, func, pull, (MenuItem*) 0); + } + else { + root = GetRoot (TWM_ROOT, NULLSTR, NULLSTR); + item = AddToMenu (root, "x", Action, NULL, func, NULLSTR, NULLSTR); + AddFuncButton (butt, i, mods, func, (MenuRoot*) 0, item); + } + } + + Action = ""; + pull = NULL; + cont = 0; + mods_used |= mods; + mods = 0; +} + +static void GotKey(char *key, int func) +{ + int i; + + for (i = 0; i < NUM_CONTEXTS; i++) + { + if ((cont & (1 << i)) == 0) + continue; + + if (func == F_MENU) { + pull->prev = NULL; + if (!AddFuncKey (key, i, mods, func, pull, Name, Action)) break; + } + else + if (!AddFuncKey(key, i, mods, func, (MenuRoot*) 0, Name, Action)) + break; + } + + Action = ""; + pull = NULL; + cont = 0; + mods_used |= mods; + mods = 0; +} + + +static void GotTitleButton (char *bitmapname, int func, Bool rightside) +{ + if (!CreateTitleButton (bitmapname, func, Action, pull, rightside, True)) { + twmrc_error_prefix(); + fprintf (stderr, + "unable to create %s titlebutton \"%s\"\n", + rightside ? "right" : "left", bitmapname); + } + Action = ""; + pull = NULL; +} + +static Bool CheckWarpScreenArg (register char *s) +{ + XmuCopyISOLatin1Lowered (s, s); + + if (strcmp (s, WARPSCREEN_NEXT) == 0 || + strcmp (s, WARPSCREEN_PREV) == 0 || + strcmp (s, WARPSCREEN_BACK) == 0) + return True; + + for (; *s && Isascii(*s) && Isdigit(*s); s++) ; /* SUPPRESS 530 */ + return (*s ? False : True); +} + + +static Bool CheckWarpRingArg (register char *s) +{ + XmuCopyISOLatin1Lowered (s, s); + + if (strcmp (s, WARPSCREEN_NEXT) == 0 || + strcmp (s, WARPSCREEN_PREV) == 0) + return True; + + return False; +} + + +static Bool CheckColormapArg (register char *s) +{ + XmuCopyISOLatin1Lowered (s, s); + + if (strcmp (s, COLORMAP_NEXT) == 0 || + strcmp (s, COLORMAP_PREV) == 0 || + strcmp (s, COLORMAP_DEFAULT) == 0) + return True; + + return False; +} + + +void twmrc_error_prefix (void) +{ + fprintf (stderr, "%s: line %d: ", ProgramName, twmrc_lineno); +} Index: external/mit/ctwm/dist/gtw.c =================================================================== RCS file: external/mit/ctwm/dist/gtw.c diff -N external/mit/ctwm/dist/gtw.c --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/gtw.c 3 Sep 2015 12:19:54 -0000 @@ -0,0 +1,96 @@ +/* + * [ ctwm ] + * + * Copyright 1992 Claude Lecommandeur. + * + * Permission to use, copy, modify and distribute this software [ctwm] and + * its documentation for any purpose is hereby granted without fee, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting documen- + * tation, and that the name of Claude Lecommandeur not be used in adverti- + * sing or publicity pertaining to distribution of the software without + * specific, written prior permission. Claude Lecommandeur make no represen- + * tations about the suitability of this software for any purpose. It is + * provided "as is" without express or implied warranty. + * + * Claude Lecommandeur DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO + * EVENT SHALL Claude Lecommandeur BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF + * USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR + * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + * + * Author: Claude Lecommandeur [ lecom@sic.epfl.ch ][ April 1992 ] + */ +#include +#include +#include +/* +#include +#include +*/ +#ifdef macII +int strcmp(); /* missing from string.h in AUX 2.0 */ +#endif + +Atom _XA_WM_CURRENTWORKSPACE, _XA_WM_OCCUPATION; +Display *dpy; + +main (argc, argv) +int argc; +char **argv; +{ + Window w; + + dpy = XOpenDisplay (NULL); + if (dpy == NULL) { + fprintf (stderr, "Can't open display\n"); + exit (1); + } + + switch (argc) { + case 2: + gotoWorkspace (argv [1]); + break; + + case 3: + sscanf (argv [1], "%x", &w); + changeOccupation (w, argv [2]); + break; + + default: + fprintf (stderr, "usage %s name\n", argv [0]); + break; + + } +} + +gotoWorkspace (name) +char *name; +{ + _XA_WM_CURRENTWORKSPACE = XInternAtom (dpy, "WM_CURRENTWORKSPACE", True); + if (_XA_WM_CURRENTWORKSPACE == None) { + fprintf (stderr, "Can't get WM_CURRENTWORKSPACE atom\n"); + exit (1); + } + + XChangeProperty (dpy, RootWindow (dpy, 0), _XA_WM_CURRENTWORKSPACE, XA_STRING, 8, + PropModeReplace, (unsigned char *) name, strlen (name)); + XFlush (dpy); +} + +changeOccupation (w, occup) +Window w; +char *occup; +{ + _XA_WM_OCCUPATION = XInternAtom (dpy, "WM_OCCUPATION", True); + if (_XA_WM_OCCUPATION == None) { + fprintf (stderr, "Can't get WM_WORKSPACES atom\n"); + exit (1); + } + + XChangeProperty (dpy, w, _XA_WM_OCCUPATION, XA_STRING, 8, + PropModeReplace, (unsigned char *) occup, strlen (occup)); + XFlush (dpy); +} Index: external/mit/ctwm/dist/iconmgr.c =================================================================== RCS file: external/mit/ctwm/dist/iconmgr.c diff -N external/mit/ctwm/dist/iconmgr.c --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/iconmgr.c 3 Sep 2015 12:19:54 -0000 @@ -0,0 +1,1026 @@ +/* + * Copyright 1989 Massachusetts Institute of Technology + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of M.I.T. not be used in advertising + * or publicity pertaining to distribution of the software without specific, + * written prior permission. M.I.T. makes no representations about the + * suitability of this software for any purpose. It is provided "as is" + * without express or implied warranty. + * + * M.I.T. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL M.I.T. + * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ +/* + * [ ctwm ] + * + * Copyright 1992 Claude Lecommandeur. + * + * Permission to use, copy, modify and distribute this software [ctwm] and + * its documentation for any purpose is hereby granted without fee, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting documen- + * tation, and that the name of Claude Lecommandeur not be used in adverti- + * sing or publicity pertaining to distribution of the software without + * specific, written prior permission. Claude Lecommandeur make no represen- + * tations about the suitability of this software for any purpose. It is + * provided "as is" without express or implied warranty. + * + * Claude Lecommandeur DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO + * EVENT SHALL Claude Lecommandeur BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF + * USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR + * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + * + * Author: Claude Lecommandeur [ lecom@sic.epfl.ch ][ April 1992 ] + */ + +/*********************************************************************** + * + * $XConsortium: iconmgr.c,v 1.48 91/09/10 15:27:07 dave Exp $ + * + * Icon Manager routines + * + * 09-Mar-89 Tom LaStrange File Created + * + * Do the necessary modification to be integrated in ctwm. + * Can no longer be used for the standard twm. + * + * 22-April-92 Claude Lecommandeur. + * + * + ***********************************************************************/ + +#include +#include "twm.h" +#ifdef VMS +#include +#else +#include +#endif +#include "util.h" +#include "parse.h" +#include "screen.h" +#include "resize.h" +#include "add_window.h" +#define __WANT_SICONIFY_BITS +#include "siconify.bm" +#ifdef VMS +#include +#include +#else +#include +#include +#endif +#ifdef macII +int strcmp(); /* missing from string.h in AUX 2.0 */ +#endif + +int iconmgr_textx = siconify_width+11; +WList *Active = NULL; +WList *Current = NULL; +WList *DownIconManager = NULL; +int iconifybox_width = siconify_width; +int iconifybox_height = siconify_height; + +/*********************************************************************** + * + * Procedure: + * CreateIconManagers - creat all the icon manager windows + * for this screen. + * + * Returned Value: + * none + * + * Inputs: + * none + * + *********************************************************************** + */ + +void CreateIconManagers(void) +{ + IconMgr *p, *q; + int mask; + char str[100]; + char str1[100]; + Pixel background; + char *icon_name; + WorkSpace *ws; + XWMHints wmhints; + XSizeHints sizehints; + int gravity; + int bw; + + if (Scr->NoIconManagers) + return; + + if (Scr->use3Diconmanagers) iconmgr_textx += Scr->IconManagerShadowDepth; + if (Scr->siconifyPm == None) + { + Scr->siconifyPm = XCreatePixmapFromBitmapData(dpy, Scr->Root, + (char *)siconify_bits, siconify_width, siconify_height, 1, 0, 1); + } + + ws = Scr->workSpaceMgr.workSpaceList; + for (q = Scr->iconmgr; q != NULL; q = q->nextv) { + for (p = q; p != NULL; p = p->next) + { + sprintf(str, "%s Icon Manager", p->name); + sprintf(str1, "%s Icons", p->name); + if (p->icon_name) + icon_name = p->icon_name; + else + icon_name = str1; + + if (!p->geometry || !strlen(p->geometry)) p->geometry = "+0+0"; + mask = XParseGeometry(p->geometry, &JunkX, &JunkY, + (unsigned int *) &p->width, (unsigned int *)&p->height); + + bw = LookInList (Scr->NoBorder, str, NULL) ? 0 : + (Scr->ThreeDBorderWidth ? Scr->ThreeDBorderWidth : Scr->BorderWidth); + + if (mask & XNegative) { + JunkX += Scr->rootw - p->width - 2 * bw; + gravity = (mask & YNegative) ? SouthEastGravity : NorthEastGravity; + } else { + gravity = (mask & YNegative) ? SouthWestGravity : NorthWestGravity; + } + if (mask & YNegative) + JunkY += Scr->rooth - p->height - 2 * bw; + + background = Scr->IconManagerC.back; + GetColorFromList(Scr->IconManagerBL, p->name, (XClassHint *)NULL, + &background); + + if (p->width < 1) p->width = 1; + if (p->height < 1) p->height = 1; + p->w = XCreateSimpleWindow(dpy, Scr->Root, + JunkX, JunkY, p->width, p->height, 1, + Scr->Black, background); + + XSetStandardProperties(dpy, p->w, str, icon_name, None, NULL, 0, NULL); + + /* Scr->workSpaceMgr.activeWSPC = ws; */ + wmhints.initial_state = NormalState; + wmhints.input = True; + wmhints.flags = InputHint | StateHint; + XSetWMHints (dpy, p->w, &wmhints); + p->twm_win = AddWindow(p->w, TRUE, p); + if (ws) + p->twm_win->occupation = 1 << ws->number; + else + p->twm_win->occupation = 1; + + sizehints.flags = PWinGravity; + sizehints.win_gravity = gravity; + XSetWMSizeHints (dpy, p->w, &sizehints, XA_WM_NORMAL_HINTS); + + p->twm_win->mapped = FALSE; + SetMapStateProp (p->twm_win, WithdrawnState); + if (p->twm_win && p->twm_win->wmhints && + (p->twm_win->wmhints->initial_state == IconicState)) { + p->twm_win->isicon = TRUE; + } + else + if (!Scr->NoIconManagers && Scr->ShowIconManager) { + p->twm_win->isicon = FALSE; + } + else { + p->twm_win->isicon = TRUE; + } + } + if (ws != NULL) ws = ws->next; + } + for (p = Scr->iconmgr; p != NULL; p = p->next) { + p->twm_win->vs = Scr->vScreenList; + } + if (Scr->workSpaceManagerActive) + Scr->workSpaceMgr.workSpaceList->iconmgr = Scr->iconmgr; + + for (q = Scr->iconmgr; q != NULL; q = q->nextv) { + for (p = q; p != NULL; p = p->next) { + GrabButtons(p->twm_win); + GrabKeys(p->twm_win); + } + } + +} + +/*********************************************************************** + * + * Procedure: + * AllocateIconManager - allocate a new icon manager + * + * Inputs: + * name - the name of this icon manager + * icon_name - the name of the associated icon + * geom - a geometry string to eventually parse + * columns - the number of columns this icon manager has + * + *********************************************************************** + */ + +IconMgr *AllocateIconManager(char *name, char *icon_name, char *geom, + int columns) +{ + IconMgr *p; + +#ifdef DEBUG_ICONMGR + fprintf(stderr, "AllocateIconManager\n"); + fprintf(stderr, " name=\"%s\" icon_name=\"%s\", geom=\"%s\", col=%d\n", + name, icon_name, geom, columns); +#endif + + if (Scr->NoIconManagers) + return NULL; + + if (columns < 1) columns = 1; + p = (IconMgr *)malloc(sizeof(IconMgr)); + p->name = name; + p->icon_name = icon_name; + p->geometry = geom; + p->columns = columns; + p->first = NULL; + p->last = NULL; + p->active = NULL; + p->scr = Scr; + p->count = 0; + p->x = 0; + p->y = 0; + p->width = 150; + p->height = 10; + p->next = NULL; + p->prev = NULL; + p->nextv = NULL; + + if (Scr->iconmgr == NULL) { + Scr->iconmgr = p; + Scr->iconmgr->lasti = p; + } + else { + Scr->iconmgr->lasti->next = p; + p->prev = Scr->iconmgr->lasti; + Scr->iconmgr->lasti = p; + } + return(p); +} + +/*********************************************************************** + * + * Procedure: + * MoveIconManager - move the pointer around in an icon manager + * + * Inputs: + * dir - one of the following: + * F_FORWICONMGR - forward in the window list + * F_BACKICONMGR - backward in the window list + * F_UPICONMGR - up one row + * F_DOWNICONMGR - down one row + * F_LEFTICONMGR - left one column + * F_RIGHTICONMGR - right one column + * + * Special Considerations: + * none + * + *********************************************************************** + */ + +void MoveIconManager(int dir) +{ + IconMgr *ip; + WList *tmp = NULL; + int cur_row, cur_col, new_row, new_col; + int row_inc, col_inc; + int got_it; + + if (!Current) return; + + cur_row = Current->row; + cur_col = Current->col; + ip = Current->iconmgr; + + row_inc = 0; + col_inc = 0; + got_it = FALSE; + + switch (dir) + { + case F_FORWICONMGR: + if ((tmp = Current->next) == NULL) + tmp = ip->first; + got_it = TRUE; + break; + + case F_BACKICONMGR: + if ((tmp = Current->prev) == NULL) + tmp = ip->last; + got_it = TRUE; + break; + + case F_UPICONMGR: + row_inc = -1; + break; + + case F_DOWNICONMGR: + row_inc = 1; + break; + + case F_LEFTICONMGR: + col_inc = -1; + break; + + case F_RIGHTICONMGR: + col_inc = 1; + break; + } + + /* If got_it is FALSE ast this point then we got a left, right, + * up, or down, command. We will enter this loop until we find + * a window to warp to. + */ + new_row = cur_row; + new_col = cur_col; + + while (!got_it) + { + new_row += row_inc; + new_col += col_inc; + if (new_row < 0) + new_row = ip->cur_rows - 1; + if (new_col < 0) + new_col = ip->cur_columns - 1; + if (new_row >= ip->cur_rows) + new_row = 0; + if (new_col >= ip->cur_columns) + new_col = 0; + + /* Now let's go through the list to see if there is an entry with this + * new position + */ + for (tmp = ip->first; tmp != NULL; tmp = tmp->next) + { + if (tmp->row == new_row && tmp->col == new_col) + { + got_it = TRUE; + break; + } + } + } + + if (!got_it) + { + fprintf (stderr, + "%s: unable to find window (%d, %d) in icon manager\n", + ProgramName, new_row, new_col); + return; + } + + if (tmp == NULL) + return; + + /* raise the frame so the icon manager is visible */ + if (ip->twm_win->mapped) { + RaiseWindow(ip->twm_win); + XWarpPointer(dpy, None, tmp->icon, 0,0,0,0, 5, 5); + } else { + if (tmp->twm->title_height) { + int tbx = Scr->TBInfo.titlex; + int x = tmp->twm->highlightxr; + XWarpPointer (dpy, None, tmp->twm->title_w, 0, 0, 0, 0, + tbx + (x - tbx) / 2, + Scr->TitleHeight / 4); + } else { + XWarpPointer (dpy, None, tmp->twm->w, 0, 0, 0, 0, 5, 5); + } + } +} + +/*********************************************************************** + * + * Procedure: + * MoveMappedIconManager - move the pointer around in an icon manager + * + * Inputs: + * dir - one of the following: + * F_FORWMAPICONMGR - forward in the window list + * F_BACKMAPICONMGR - backward in the window list + * + * Special Considerations: + * none + * + *********************************************************************** + */ + +void MoveMappedIconManager(int dir) +{ + IconMgr *ip; + WList *tmp = NULL; + WList *orig = NULL; + int got_it; + + if (!Current) Current = Active; + if (!Current) return; + + ip = Current->iconmgr; + + got_it = 0; + tmp = Current; + orig = Current; + + while(!got_it) { + switch(dir) + { + case F_FORWMAPICONMGR: + if ((tmp = tmp->next) == NULL) + tmp = ip->first; + break; + + case F_BACKMAPICONMGR: + if ((tmp = tmp->prev) == NULL) + tmp = ip->last; + break; + } + if (tmp->twm->mapped) { + got_it = 1; + break; + } + if (tmp == orig) + break; + } + + if (!got_it) + { + fprintf (stderr, "%s: unable to find open window in icon manager\n", + ProgramName); + return; + } + + if (tmp == NULL) + return; + + /* raise the frame so the icon manager is visible */ + if (ip->twm_win->mapped) { + RaiseWindow(ip->twm_win); + XWarpPointer(dpy, None, tmp->icon, 0,0,0,0, 5, 5); + } else { + if (tmp->twm->title_height) { + XWarpPointer (dpy, None, tmp->twm->title_w, 0, 0, 0, 0, + tmp->twm->title_width / 2, + Scr->TitleHeight / 4); + } else { + XWarpPointer (dpy, None, tmp->twm->w, 0, 0, 0, 0, 5, 5); + } + } +} + +/*********************************************************************** + * + * Procedure: + * JumpIconManager - jump from one icon manager to another, + * possibly even on another screen + * + * Inputs: + * dir - one of the following: + * F_NEXTICONMGR - go to the next icon manager + * F_PREVICONMGR - go to the previous one + * + *********************************************************************** + */ + +void JumpIconManager(register int dir) +{ + IconMgr *ip, *tmp_ip = NULL; + int got_it = FALSE; + ScreenInfo *sp; + int screen; + + if (!Current) return; + + +#define ITER(i) (dir == F_NEXTICONMGR ? (i)->next : (i)->prev) +#define IPOFSP(sp) (dir == F_NEXTICONMGR ? sp->iconmgr : sp->iconmgr->lasti) +#define TEST(ip) if ((ip)->count != 0 && (ip)->twm_win->mapped) \ + { got_it = TRUE; break; } + + ip = Current->iconmgr; + for (tmp_ip = ITER(ip); tmp_ip; tmp_ip = ITER(tmp_ip)) { + TEST (tmp_ip); + } + + if (!got_it) { + int origscreen = ip->scr->screen; + int inc = (dir == F_NEXTICONMGR ? 1 : -1); + + for (screen = origscreen + inc; ; screen += inc) { + if (screen >= NumScreens) + screen = 0; + else if (screen < 0) + screen = NumScreens - 1; + + sp = ScreenList[screen]; + if (sp) { + for (tmp_ip = IPOFSP (sp); tmp_ip; tmp_ip = ITER(tmp_ip)) { + TEST (tmp_ip); + } + } + if (got_it || screen == origscreen) break; + } + } + +#undef ITER +#undef IPOFSP +#undef TEST + + if (!got_it) { + XBell (dpy, 0); + return; + } + + /* raise the frame so it is visible */ + RaiseWindow(tmp_ip->twm_win); + if (tmp_ip->active) + XWarpPointer(dpy, None, tmp_ip->active->icon, 0,0,0,0, 5, 5); + else + XWarpPointer(dpy, None, tmp_ip->w, 0,0,0,0, 5, 5); +} + +/*********************************************************************** + * + * Procedure: + * AddIconManager - add a window to an icon manager + * + * Inputs: + * tmp_win - the TwmWindow structure + * + *********************************************************************** + */ + +WList *AddIconManager(TwmWindow *tmp_win) +{ + WList *tmp, *old; + int h, offs; + unsigned long valuemask; /* mask for create windows */ + XSetWindowAttributes attributes; /* attributes for create windows */ + IconMgr *ip; + + if (tmp_win->iconmgr || tmp_win->transient || Scr->NoIconManagers || + tmp_win->wspmgr || + tmp_win->w == Scr->workSpaceMgr.occupyWindow->w) + return NULL; + + if (LookInList(Scr->IconMgrNoShow, tmp_win->full_name, &tmp_win->class)) + return NULL; + if (Scr->IconManagerDontShow && + !LookInList(Scr->IconMgrShow, tmp_win->full_name, &tmp_win->class)) + return NULL; + if ((ip = (IconMgr *)LookInList(Scr->IconMgrs, tmp_win->full_name, + &tmp_win->class)) == NULL) { + if (Scr->workSpaceManagerActive) + ip = Scr->workSpaceMgr.workSpaceList->iconmgr; + else + ip = Scr->iconmgr; + } + + tmp = NULL; + old = tmp_win->iconmanagerlist; + while (ip != NULL) { + if ((tmp_win->occupation & ip->twm_win->occupation) == 0) { + ip = ip->nextv; + continue; + } + tmp = (WList *) malloc(sizeof(WList)); + tmp->iconmgr = ip; + tmp->next = NULL; + tmp->active = FALSE; + tmp->down = FALSE; + + InsertInIconManager(ip, tmp, tmp_win); + + tmp->twm = tmp_win; + + tmp->cp.fore = Scr->IconManagerC.fore; + tmp->cp.back = Scr->IconManagerC.back; + tmp->highlight = Scr->IconManagerHighlight; + + GetColorFromList(Scr->IconManagerFL, tmp_win->full_name, &tmp_win->class, + &tmp->cp.fore); + GetColorFromList(Scr->IconManagerBL, tmp_win->full_name, &tmp_win->class, + &tmp->cp.back); + GetColorFromList(Scr->IconManagerHighlightL, tmp_win->full_name, + &tmp_win->class, &tmp->highlight); + + if (Scr->use3Diconmanagers) { + if (!Scr->BeNiceToColormap) GetShadeColors (&tmp->cp); + tmp->iconifypm = Create3DIconManagerIcon (tmp->cp); + h = Scr->IconManagerFont.height + 2 * Scr->IconManagerShadowDepth + 6; + } + else + h = Scr->IconManagerFont.height + 10; + if (h < (siconify_height + 4)) + h = siconify_height + 4; + + ip->height = h * ip->count; + tmp->me = ip->count; + tmp->x = -1; + tmp->y = -1; + + valuemask = (CWBackPixel | CWBorderPixel | CWEventMask | CWCursor); + attributes.background_pixel = tmp->cp.back; + attributes.border_pixel = tmp->cp.back; + attributes.event_mask = (KeyPressMask | ButtonPressMask | + ButtonReleaseMask | ExposureMask); + if (Scr->IconManagerFocus) + attributes.event_mask |= (EnterWindowMask | LeaveWindowMask); + attributes.cursor = Scr->IconMgrCursor; + tmp->w = XCreateWindow (dpy, ip->w, 0, 0, (unsigned int) 1, + (unsigned int) h, (unsigned int) 0, + CopyFromParent, (unsigned int) CopyFromParent, + (Visual *) CopyFromParent, valuemask, &attributes); + + valuemask = (CWBackPixel | CWBorderPixel | CWEventMask | CWCursor); + attributes.background_pixel = tmp->cp.back; + attributes.border_pixel = Scr->Black; + attributes.event_mask = (ButtonReleaseMask| ButtonPressMask | ExposureMask); + attributes.cursor = Scr->ButtonCursor; + offs = Scr->use3Diconmanagers ? Scr->IconManagerShadowDepth : 2; + tmp->icon = XCreateWindow (dpy, tmp->w, offs + 3, + (int) (h - siconify_height)/2, + (unsigned int) siconify_width, + (unsigned int) siconify_height, + (unsigned int) 0, CopyFromParent, + (unsigned int) CopyFromParent, + (Visual *) CopyFromParent, + valuemask, &attributes); + + ip->count += 1; + PackIconManager(ip); + if (Scr->WindowMask) XRaiseWindow (dpy, Scr->WindowMask); + XMapWindow(dpy, tmp->w); + + XSaveContext(dpy, tmp->w, IconManagerContext, (XPointer) tmp); + XSaveContext(dpy, tmp->w, TwmContext, (XPointer) tmp_win); + XSaveContext(dpy, tmp->w, ScreenContext, (XPointer) Scr); + XSaveContext(dpy, tmp->icon, TwmContext, (XPointer) tmp_win); + XSaveContext(dpy, tmp->icon, ScreenContext, (XPointer) Scr); + + if (!ip->twm_win->isicon) + { + if (visible (ip->twm_win)) { + SetMapStateProp (ip->twm_win, NormalState); + XMapWindow (dpy, ip->w); + XMapWindow (dpy, ip->twm_win->frame); + } + ip->twm_win->mapped = TRUE; + } + tmp->nextv = old; + old = tmp; + ip = ip->nextv; + } + if (tmp == NULL) return NULL; + tmp_win->iconmanagerlist = tmp; + if (! visible (tmp->iconmgr->twm_win)) { + old = tmp; + tmp = tmp->nextv; + while (tmp != NULL) { + if (visible (tmp->iconmgr->twm_win)) break; + old = tmp; + tmp = tmp->nextv; + } + if (tmp != NULL) { + old->nextv = tmp->nextv; + tmp->nextv = tmp_win->iconmanagerlist; + tmp_win->iconmanagerlist = tmp; + } + } + return tmp_win->iconmanagerlist; +} + +/*********************************************************************** + * + * Procedure: + * InsertInIconManager - put an allocated entry into an icon + * manager + * + * Inputs: + * ip - the icon manager pointer + * tmp - the entry to insert + * + *********************************************************************** + */ + +void InsertInIconManager(IconMgr *ip, WList *tmp, TwmWindow *tmp_win) +{ + WList *tmp1; + int added; + + added = FALSE; + if (ip->first == NULL) + { + ip->first = tmp; + tmp->prev = NULL; + ip->last = tmp; + added = TRUE; + } + else if (Scr->SortIconMgr) + { + for (tmp1 = ip->first; tmp1 != NULL; tmp1 = tmp1->next) + { + int compresult; + if (Scr->CaseSensitive) + compresult = strcmp(tmp_win->icon_name,tmp1->twm->icon_name); + else + compresult = XmuCompareISOLatin1(tmp_win->icon_name,tmp1->twm->icon_name); + if (compresult < 0) + { + tmp->next = tmp1; + tmp->prev = tmp1->prev; + tmp1->prev = tmp; + if (tmp->prev == NULL) + ip->first = tmp; + else + tmp->prev->next = tmp; + added = TRUE; + break; + } + } + } + + if (!added) + { + ip->last->next = tmp; + tmp->prev = ip->last; + ip->last = tmp; + } +} + +void RemoveFromIconManager(IconMgr *ip, WList *tmp) +{ + if (tmp->prev == NULL) + ip->first = tmp->next; + else + tmp->prev->next = tmp->next; + + if (tmp->next == NULL) + ip->last = tmp->prev; + else + tmp->next->prev = tmp->prev; + + /* pebl: If the list was the current and tmp was the last in the list + reset current list */ + if (Current == tmp) Current = ip->first; +} + +/*********************************************************************** + * + * Procedure: + * RemoveIconManager - remove a window from the icon manager + * + * Inputs: + * tmp_win - the TwmWindow structure + * + *********************************************************************** + */ + +void RemoveIconManager(TwmWindow *tmp_win) +{ + IconMgr *ip; + WList *tmp, *tmp1, *save; + + if (tmp_win->iconmanagerlist == NULL) + return; + + tmp = tmp_win->iconmanagerlist; + tmp1 = NULL; + + while (tmp != NULL) { + ip = tmp->iconmgr; + if ((tmp_win->occupation & ip->twm_win->occupation) != 0) { + tmp1 = tmp; + tmp = tmp->nextv; + continue; + } + RemoveFromIconManager(ip, tmp); + + XDeleteContext(dpy, tmp->icon, TwmContext); + XDeleteContext(dpy, tmp->icon, ScreenContext); + XDestroyWindow(dpy, tmp->icon); + XDeleteContext(dpy, tmp->w, IconManagerContext); + XDeleteContext(dpy, tmp->w, TwmContext); + XDeleteContext(dpy, tmp->w, ScreenContext); + XDestroyWindow(dpy, tmp->w); + ip->count -= 1; + + PackIconManager(ip); + + if (ip->count == 0) + { + XUnmapWindow(dpy, ip->twm_win->frame); + ip->twm_win->mapped = FALSE; + } + if (tmp1 == NULL) + tmp_win->iconmanagerlist = tmp_win->iconmanagerlist->nextv; + else + tmp1->nextv = tmp->nextv; + + save = tmp; + tmp = tmp->nextv; + free((char *) save); + } +} + +void CurrentIconManagerEntry (WList *current) +{ + Current = current; +} + +void ActiveIconManager(WList *active) +{ + active->active = TRUE; + Active = active; + Active->iconmgr->active = active; + Current = Active; + DrawIconManagerBorder(active, False); +} + +void NotActiveIconManager(WList *active) +{ + active->active = FALSE; + DrawIconManagerBorder(active, False); +} + +void DrawIconManagerBorder(WList *tmp, int fill) +{ + if (Scr->use3Diconmanagers) { + if (tmp->active && Scr->Highlight) + Draw3DBorder (tmp->w, 0, 0, tmp->width, tmp->height, Scr->IconManagerShadowDepth, + tmp->cp, on, fill, False); + else + Draw3DBorder (tmp->w, 0, 0, tmp->width, tmp->height, Scr->IconManagerShadowDepth, + tmp->cp, off, fill, False); + } + else { + XSetForeground(dpy, Scr->NormalGC, tmp->cp.fore); + XDrawRectangle(dpy, tmp->w, Scr->NormalGC, 2, 2, tmp->width-5, tmp->height-5); + + if (tmp->active && Scr->Highlight) + XSetForeground(dpy, Scr->NormalGC, tmp->highlight); + else + XSetForeground(dpy, Scr->NormalGC, tmp->cp.back); + + XDrawRectangle(dpy, tmp->w, Scr->NormalGC, 0, 0, tmp->width-1, tmp->height-1); + XDrawRectangle(dpy, tmp->w, Scr->NormalGC, 1, 1, tmp->width-3, tmp->height-3); + } +} + +/*********************************************************************** + * + * Procedure: + * SortIconManager - sort the dude + * + * Inputs: + * ip - a pointer to the icon manager struture + * + *********************************************************************** + */ + +void SortIconManager(IconMgr *ip) +{ + WList *tmp1, *tmp2; + int done; + + if (ip == NULL) + ip = Active->iconmgr; + + done = FALSE; + do + { + for (tmp1 = ip->first; tmp1 != NULL; tmp1 = tmp1->next) + { + int compresult; + if ((tmp2 = tmp1->next) == NULL) + { + done = TRUE; + break; + } + if (Scr->CaseSensitive) + compresult = strcmp(tmp1->twm->icon_name,tmp2->twm->icon_name); + else + compresult = XmuCompareISOLatin1(tmp1->twm->icon_name,tmp2->twm->icon_name); + if (compresult > 0) + { + /* take it out and put it back in */ + RemoveFromIconManager(ip, tmp2); + InsertInIconManager(ip, tmp2, tmp2->twm); + break; + } + } + } + while (!done); + PackIconManager(ip); +} + +/*********************************************************************** + * + * Procedure: + * PackIconManager - pack the icon manager windows following + * an addition or deletion + * + * Inputs: + * ip - a pointer to the icon manager struture + * + *********************************************************************** + */ + +void PackIconManager(IconMgr *ip) +{ + int newwidth, i, row, col, maxcol, colinc, rowinc, wheight, wwidth; + int new_x, new_y; + int savewidth; + WList *tmp; + int mask; + unsigned int JunkW, JunkH; + + if (Scr->use3Diconmanagers) { + wheight = Scr->IconManagerFont.height + 2 * Scr->IconManagerShadowDepth + 6; + } else { + wheight = Scr->IconManagerFont.height + 10; + } + if (wheight < (siconify_height + 4)) + wheight = siconify_height + 4; + + wwidth = ip->width / ip->columns; + + rowinc = wheight; + colinc = wwidth; + + row = 0; + col = ip->columns; + maxcol = 0; + for (i = 0, tmp = ip->first; tmp != NULL; i++, tmp = tmp->next) + { + tmp->me = i; + if (++col >= ip->columns) + { + col = 0; + row += 1; + } + if (col > maxcol) + maxcol = col; + + new_x = col * colinc; + new_y = (row-1) * rowinc; + + /* if the position or size has not changed, don't touch it */ + if (tmp->x != new_x || tmp->y != new_y || + tmp->width != wwidth || tmp->height != wheight) + { + XMoveResizeWindow(dpy, tmp->w, new_x, new_y, wwidth, wheight); + + tmp->row = row-1; + tmp->col = col; + tmp->x = new_x; + tmp->y = new_y; + tmp->width = wwidth; + tmp->height = wheight; + } + } + maxcol += 1; + + ip->cur_rows = row; + ip->cur_columns = maxcol; + ip->height = row * rowinc; + if (ip->height == 0) + ip->height = rowinc; + newwidth = maxcol * colinc; + if (newwidth == 0) + newwidth = colinc; + + XResizeWindow(dpy, ip->w, newwidth, ip->height); + + mask = XParseGeometry (ip->geometry, &JunkX, &JunkY, &JunkW, &JunkH); + if (mask & XNegative) { + ip->twm_win->frame_x += ip->twm_win->frame_width - newwidth - + 2 * ip->twm_win->frame_bw3D; + } + if (mask & YNegative) { + ip->twm_win->frame_y += ip->twm_win->frame_height - ip->height - + 2 * ip->twm_win->frame_bw3D - ip->twm_win->title_height; + } + savewidth = ip->width; + if (ip->twm_win) + SetupWindow (ip->twm_win, + ip->twm_win->frame_x, ip->twm_win->frame_y, + newwidth + 2 * ip->twm_win->frame_bw3D, + ip->height + ip->twm_win->title_height + 2 * ip->twm_win->frame_bw3D, -1); + ip->width = savewidth; +} Index: external/mit/ctwm/dist/iconmgr.h =================================================================== RCS file: external/mit/ctwm/dist/iconmgr.h diff -N external/mit/ctwm/dist/iconmgr.h --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/iconmgr.h 3 Sep 2015 12:19:54 -0000 @@ -0,0 +1,122 @@ +/* + * Copyright 1989 Massachusetts Institute of Technology + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of M.I.T. not be used in advertising + * or publicity pertaining to distribution of the software without specific, + * written prior permission. M.I.T. makes no representations about the + * suitability of this software for any purpose. It is provided "as is" + * without express or implied warranty. + * + * M.I.T. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL M.I.T. + * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ +/* + * [ ctwm ] + * + * Copyright 1992 Claude Lecommandeur. + * + * Permission to use, copy, modify and distribute this software [ctwm] and + * its documentation for any purpose is hereby granted without fee, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting documen- + * tation, and that the name of Claude Lecommandeur not be used in adverti- + * sing or publicity pertaining to distribution of the software without + * specific, written prior permission. Claude Lecommandeur make no represen- + * tations about the suitability of this software for any purpose. It is + * provided "as is" without express or implied warranty. + * + * Claude Lecommandeur DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO + * EVENT SHALL Claude Lecommandeur BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF + * USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR + * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + * + * Author: Claude Lecommandeur [ lecom@sic.epfl.ch ][ April 1992 ] + */ + +/*********************************************************************** + * + * $XConsortium: iconmgr.h,v 1.11 89/12/10 17:47:02 jim Exp $ + * + * Icon Manager includes + * + * 09-Mar-89 Tom LaStrange File Created + * + ***********************************************************************/ + +#ifndef _ICONMGR_ +#define _ICONMGR_ + +struct WList +{ + struct WList *next; + struct WList *prev; + struct WList *nextv; /* pointer to the next virtual Wlist C.L. */ + struct TwmWindow *twm; + struct IconMgr *iconmgr; + Window w; + Window icon; + int x, y, width, height; + int row, col; + int me; + ColorPair cp; + Pixel highlight; + Pixmap iconifypm; + unsigned top, bottom; + short active; + short down; +}; + +struct IconMgr +{ + struct IconMgr *next; /* pointer to the next icon manager */ + struct IconMgr *prev; /* pointer to the previous icon mgr */ + struct IconMgr *lasti; /* pointer to the last icon mgr */ + struct IconMgr *nextv; /* pointer to the next virtual icon mgr C.L. */ + struct WList *first; /* first window in the list */ + struct WList *last; /* last window in the list */ + struct WList *active; /* the active entry */ + TwmWindow *twm_win; /* back pointer to the new parent */ + struct ScreenInfo *scr; /* the screen this thing is on */ + int vScreen; /* the virtual screen this thing is on */ + Window w; /* this icon manager window */ + char *geometry; /* geometry string */ + char *name; + char *icon_name; + int x, y, width, height; + int columns, cur_rows, cur_columns; + int count; +}; + +extern int iconmgr_textx; +extern WList *DownIconManager; + +extern void CreateIconManagers(void); +extern IconMgr *AllocateIconManager(char *name, char *geom, char *icon_name, + int columns); +extern void MoveIconManager(int dir); +extern void MoveMappedIconManager(int dir); +extern void JumpIconManager(register int dir); +extern WList *AddIconManager(TwmWindow *tmp_win); +extern void InsertInIconManager(IconMgr *ip, WList *tmp, TwmWindow *tmp_win); +extern void RemoveFromIconManager(IconMgr *ip, WList *tmp); +extern void RemoveIconManager(TwmWindow *tmp_win); +extern void CurrentIconManagerEntry(WList *current); +extern void ActiveIconManager(WList *active); +extern void NotActiveIconManager(WList *active); +extern void DrawIconManagerBorder(WList *tmp, int fill); +extern void SortIconManager(IconMgr *ip); +extern void PackIconManager(IconMgr *ip); + + +#endif /* _ICONMGR_ */ Index: external/mit/ctwm/dist/icons.c =================================================================== RCS file: external/mit/ctwm/dist/icons.c diff -N external/mit/ctwm/dist/icons.c --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/icons.c 3 Sep 2015 12:19:55 -0000 @@ -0,0 +1,932 @@ +/* + * Copyright 1989 Massachusetts Institute of Technology + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of M.I.T. not be used in advertising + * or publicity pertaining to distribution of the software without specific, + * written prior permission. M.I.T. makes no representations about the + * suitability of this software for any purpose. It is provided "as is" + * without express or implied warranty. + * + * M.I.T. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL M.I.T. + * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ +/* + * [ ctwm ] + * + * Copyright 1992 Claude Lecommandeur. + * + * Permission to use, copy, modify and distribute this software [ctwm] and + * its documentation for any purpose is hereby granted without fee, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting documen- + * tation, and that the name of Claude Lecommandeur not be used in adverti- + * sing or publicity pertaining to distribution of the software without + * specific, written prior permission. Claude Lecommandeur make no represen- + * tations about the suitability of this software for any purpose. It is + * provided "as is" without express or implied warranty. + * + * Claude Lecommandeur DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO + * EVENT SHALL Claude Lecommandeur BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF + * USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR + * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + * + * Author: Claude Lecommandeur [ lecom@sic.epfl.ch ][ April 1992 ] + */ + +/********************************************************************** + * + * $XConsortium: icons.c,v 1.22 91/07/12 09:58:38 dave Exp $ + * + * Icon releated routines + * + * 10-Apr-89 Tom LaStrange Initial Version. + * + * Do the necessary modification to be integrated in ctwm. + * Can no longer be used for the standard twm. + * + * 22-April-92 Claude Lecommandeur. + * + * + **********************************************************************/ + +#include +#include "twm.h" +#include "screen.h" +#include "icons.h" +#include "list.h" +#include "parse.h" +#include "util.h" + +extern void twmrc_error_prefix(void); +extern Bool AnimationPending; +extern Bool AnimationActive; +extern Bool MaybeAnimate; + +#define iconWidth(w) (w->icon->border_width * 2 + \ + Scr->ShrinkIconTitles ? w->icon->width : w->icon->w_width) +#define iconHeight(w) (w->icon->border_width * 2 + w->icon->w_height) + +static void splitEntry (IconEntry *ie, int grav1, int grav2, int w, int h) +{ + IconEntry *new; + + switch (grav1) { + case D_NORTH: + case D_SOUTH: + if (w != ie->w) + splitEntry (ie, grav2, grav1, w, ie->h); + if (h != ie->h) { + new = (IconEntry *)malloc (sizeof (IconEntry)); + new->twm_win = 0; + new->used = 0; + new->next = ie->next; + ie->next = new; + new->x = ie->x; + new->h = (ie->h - h); + new->w = ie->w; + ie->h = h; + if (grav1 == D_SOUTH) { + new->y = ie->y; + ie->y = new->y + new->h; + } else + new->y = ie->y + ie->h; + } + break; + case D_EAST: + case D_WEST: + if (h != ie->h) + splitEntry (ie, grav2, grav1, ie->w, h); + if (w != ie->w) { + new = (IconEntry *)malloc (sizeof (IconEntry)); + new->twm_win = 0; + new->used = 0; + new->next = ie->next; + ie->next = new; + new->y = ie->y; + new->w = (ie->w - w); + new->h = ie->h; + ie->w = w; + if (grav1 == D_EAST) { + new->x = ie->x; + ie->x = new->x + new->w; + } else + new->x = ie->x + ie->w; + } + break; + } +} + +static int roundUp (int v, int multiple) +{ + return ((v + multiple - 1) / multiple) * multiple; +} + +static void PlaceIcon(TwmWindow *tmp_win, int def_x, int def_y, + int *final_x, int *final_y) +{ + IconRegion *ir, *oldir; + IconEntry *ie; + int w = 0, h = 0; + + /* + * First, check to see if the window is in a region's client list + */ + ie = 0; + for (ir = Scr->FirstRegion; ir; ir = ir->next) { + if (LookInList(ir->clientlist, tmp_win->full_name, &tmp_win->class)) + { + w = roundUp (iconWidth (tmp_win), ir->stepx); + h = roundUp (iconHeight (tmp_win), ir->stepy); + for (ie = ir->entries; ie; ie=ie->next) { + if (ie->used) + continue; + if (ie->w >= w && ie->h >= h) + break; + } + if (ie) + break; + } + } + + /* + * If not found in any region's client list, place anywhere + */ + if (!ie) + { + for (ir = Scr->FirstRegion; ir; ir = ir->next) { + w = roundUp (iconWidth (tmp_win), ir->stepx); + h = roundUp (iconHeight (tmp_win), ir->stepy); + for (ie = ir->entries; ie; ie=ie->next) { + if (ie->used) + continue; + if (ie->w >= w && ie->h >= h) + break; + } + if (ie) + break; + } + } + oldir = tmp_win->icon->ir; + if (ie) { + splitEntry (ie, ir->grav1, ir->grav2, w, h); + ie->used = 1; + ie->twm_win = tmp_win; + switch (ir->Justification) { + case J_LEFT : + *final_x = ie->x; + break; + case J_UNDEF : + case J_CENTER : + *final_x = ie->x + (ie->w - iconWidth (tmp_win)) / 2; + break; + case J_RIGHT : + *final_x = ie->x + ie->w - iconWidth (tmp_win); + break; + case J_BORDER : + if (ir->grav2 == D_EAST) + *final_x = ie->x + ie->w - iconWidth (tmp_win); + else + *final_x = ie->x; + break; + } + switch (ir->Alignement) { + case J_TOP : + *final_y = ie->y; + break; + case J_UNDEF : + case J_CENTER : + *final_y = ie->y + (ie->h - iconHeight (tmp_win)) / 2; + break; + case J_BOTTOM : + *final_y = ie->y + ie->h - iconHeight (tmp_win); + break; + case J_BORDER : + if (ir->grav1 == D_SOUTH) + *final_y = ie->y + ie->h - iconHeight (tmp_win); + else + *final_y = ie->y; + break; + } + tmp_win->icon->ir = ir; + } else { + *final_x = def_x; + *final_y = def_y; + tmp_win->icon->ir = (IconRegion*)0; + return; + } + if (Scr->ShrinkIconTitles && tmp_win->icon->has_title) { + *final_x -= GetIconOffset (tmp_win->icon); + if (tmp_win->icon->ir != oldir) ReshapeIcon (tmp_win->icon); + } + return; +} + +static IconEntry *FindIconEntry (TwmWindow *tmp_win, IconRegion **irp) +{ + IconRegion *ir; + IconEntry *ie; + + for (ir = Scr->FirstRegion; ir; ir = ir->next) { + for (ie = ir->entries; ie; ie=ie->next) + if (ie->twm_win == tmp_win) { + if (irp) + *irp = ir; + return ie; + } + } + return 0; +} + +int IconUp (TwmWindow *tmp_win) +{ + int x, y; + int defx, defy; + struct IconRegion *ir; + + /* + * If the client specified a particular location, let's use it (this might + * want to be an option at some point). Otherwise, try to fit within the + * icon region. + */ + if (tmp_win->wmhints && (tmp_win->wmhints->flags & IconPositionHint)) + return (0); + + if (tmp_win->icon_moved) { + if (!XGetGeometry (dpy, tmp_win->icon->w, &JunkRoot, &defx, &defy, + &JunkWidth, &JunkHeight, &JunkBW, &JunkDepth)) + return (1); + + x = defx + ((int) JunkWidth) / 2; + y = defy + ((int) JunkHeight) / 2; + + for (ir = Scr->FirstRegion; ir; ir = ir->next) { + if (x >= ir->x && x < (ir->x + ir->w) && + y >= ir->y && y < (ir->y + ir->h)) + break; + } + if (!ir) return (0); /* outside icon regions, leave alone */ + } + + defx = -100; + defy = -100; + PlaceIcon(tmp_win, defx, defy, &x, &y); + if (x != defx || y != defy) { + XMoveWindow (dpy, tmp_win->icon->w, x, y); + tmp_win->icon_moved = FALSE; /* since we've restored it */ + } + MaybeAnimate = True; + return (0); +} + +static IconEntry *prevIconEntry (IconEntry *ie, IconRegion *ir) +{ + IconEntry *ip; + + if (ie == ir->entries) + return 0; + for (ip = ir->entries; ip->next != ie; ip=ip->next) + ; + return ip; +} + +/* old is being freed; and is adjacent to ie. Merge + * regions together + */ + +static void mergeEntries (IconEntry *old, IconEntry *ie) +{ + if (old->y == ie->y) { + ie->w = old->w + ie->w; + if (old->x < ie->x) + ie->x = old->x; + } else { + ie->h = old->h + ie->h; + if (old->y < ie->y) + ie->y = old->y; + } +} + +void IconDown (TwmWindow *tmp_win) +{ + IconEntry *ie, *ip, *in; + IconRegion *ir; + + ie = FindIconEntry (tmp_win, &ir); + if (ie) { + ie->twm_win = 0; + ie->used = 0; + ip = prevIconEntry (ie, ir); + in = ie->next; + for (;;) { + if (ip && ip->used == 0 && + ((ip->x == ie->x && ip->w == ie->w) || + (ip->y == ie->y && ip->h == ie->h))) + { + ip->next = ie->next; + mergeEntries (ie, ip); + free ((char *) ie); + ie = ip; + ip = prevIconEntry (ip, ir); + } else if (in && in->used == 0 && + ((in->x == ie->x && in->w == ie->w) || + (in->y == ie->y && in->h == ie->h))) + { + ie->next = in->next; + mergeEntries (in, ie); + free ((char *) in); + in = ie->next; + } else + break; + } + } +} + +name_list **AddIconRegion(char *geom, + int grav1, int grav2, + int stepx, int stepy, + char *ijust, char *just, char *align) +{ + IconRegion *ir; + int mask, tmp; + + ir = (IconRegion *)malloc(sizeof(IconRegion)); + ir->next = NULL; + + if (Scr->LastRegion) Scr->LastRegion->next = ir; + Scr->LastRegion = ir; + if (!Scr->FirstRegion) Scr->FirstRegion = ir; + + ir->entries = NULL; + ir->clientlist = NULL; + ir->grav1 = grav1; + ir->grav2 = grav2; + if (stepx <= 0) + stepx = 1; + if (stepy <= 0) + stepy = 1; + ir->stepx = stepx; + ir->stepy = stepy; + ir->x = ir->y = ir->w = ir->h = 0; + + mask = XParseGeometry(geom, &ir->x, &ir->y, (unsigned int *)&ir->w, (unsigned int *)&ir->h); + + if (mask & XNegative) ir->x += Scr->rootw - ir->w; + if (mask & YNegative) ir->y += Scr->rooth - ir->h; + + ir->entries = (IconEntry *)malloc(sizeof(IconEntry)); + ir->entries->next = 0; + ir->entries->x = ir->x; + ir->entries->y = ir->y; + ir->entries->w = ir->w; + ir->entries->h = ir->h; + ir->entries->twm_win = 0; + ir->entries->used = 0; + + tmp = ParseJustification (ijust); + if ((tmp < 0) || (tmp == J_BORDER)) { + twmrc_error_prefix(); + fprintf (stderr, "ignoring invalid IconRegion argument \"%s\"\n", ijust); + tmp = J_UNDEF; + } + ir->TitleJustification = tmp; + + tmp = ParseJustification (just); + if ((tmp = ParseJustification (just)) < 0) { + twmrc_error_prefix(); + fprintf (stderr, "ignoring invalid IconRegion argument \"%s\"\n", just); + tmp = J_UNDEF; + } + ir->Justification = tmp; + + if ((tmp = ParseAlignement (align)) < 0) { + twmrc_error_prefix(); + fprintf (stderr, "ignoring invalid IconRegion argument \"%s\"\n", align); + tmp = J_UNDEF; + } + ir->Alignement = tmp; + + return(&(ir->clientlist)); +} + +#ifdef comment +FreeIconEntries (ir) + IconRegion *ir; +{ + IconEntry *ie, *tmp; + + for (ie = ir->entries; ie; ie=tmp) + { + tmp = ie->next; + free ((char *) ie); + } +} +FreeIconRegions() +{ + IconRegion *ir, *tmp; + + for (ir = Scr->FirstRegion; ir != NULL;) + { + tmp = ir; + FreeIconEntries (ir); + ir = ir->next; + free((char *) tmp); + } + Scr->FirstRegion = NULL; + Scr->LastRegion = NULL; +} +#endif + +int CreateIconWindow(TwmWindow *tmp_win, int def_x, int def_y) +{ + unsigned long event_mask; + unsigned long valuemask; /* mask for create windows */ + XSetWindowAttributes attributes; /* attributes for create windows */ + int final_x, final_y; + int x; + Icon *icon; + Image *image = None; + + icon = (Icon*) malloc (sizeof (struct Icon)); + + icon->border = Scr->IconBorderColor; + icon->iconc.fore = Scr->IconC.fore; + icon->iconc.back = Scr->IconC.back; + + GetColorFromList(Scr->IconBorderColorL, tmp_win->full_name, &tmp_win->class, + &icon->border); + GetColorFromList(Scr->IconForegroundL, tmp_win->full_name, &tmp_win->class, + &icon->iconc.fore); + GetColorFromList(Scr->IconBackgroundL, tmp_win->full_name, &tmp_win->class, + &icon->iconc.back); + if (Scr->use3Diconmanagers && !Scr->BeNiceToColormap) GetShadeColors (&icon->iconc); + + FB(icon->iconc.fore, icon->iconc.back); + + icon->match = match_none; + icon->pattern = NULL; + icon->image = None; + icon->ir = (IconRegion*) 0; + + tmp_win->forced = FALSE; + tmp_win->icon_not_ours = FALSE; + + /* now go through the steps to get an icon window, if ForceIcon is + * set, then no matter what else is defined, the bitmap from the + * .twmrc file is used + */ + if (Scr->ForceIcon) { + char *icon_name; + + icon_name = LookInNameList (Scr->IconNames, tmp_win->icon_name); + if (icon_name != NULL) { + icon->pattern = LookPatternInNameList (Scr->IconNames, tmp_win->icon_name); + icon->match = match_icon; + } + if (icon->match == match_none) + icon_name = LookInNameList(Scr->IconNames, tmp_win->full_name); + if ((icon->match == match_none) && (icon_name != NULL)) { + icon->pattern = LookPatternInNameList (Scr->IconNames, tmp_win->full_name); + icon->match = match_name; + } + if (icon->match == match_none) + icon_name = LookInList(Scr->IconNames, tmp_win->full_name, &tmp_win->class); + if ((icon->match == match_none) && (icon_name != NULL)) { + icon->pattern = LookPatternInList (Scr->IconNames, tmp_win->full_name, &tmp_win->class); + icon->match = match_class; + } + if ((image = GetImage (icon_name, icon->iconc)) != None) { + icon->image = image; + icon->width = image->width; + icon->height = image->height; + tmp_win->forced = TRUE; + } + } + + /* if the pixmap is still NULL, we didn't get one from the above code, + * that could mean that ForceIcon was not set, or that the window + * was not in the Icons list, now check the WM hints for an icon + */ + if (image == None && tmp_win->wmhints && + tmp_win->wmhints->flags & IconPixmapHint) { + if (XGetGeometry(dpy, tmp_win->wmhints->icon_pixmap, + &JunkRoot, &JunkX, &JunkY, &JunkWidth, &JunkHeight, &JunkBW, &JunkDepth)) { + image = (Image*) malloc (sizeof (struct _Image)); + image->width = JunkWidth; + image->height = JunkHeight; + image->pixmap = XCreatePixmap (dpy, Scr->Root, image->width, + image->height, Scr->d_depth); + image->mask = None; + image->next = None; + if (JunkDepth == Scr->d_depth) + XCopyArea (dpy, tmp_win->wmhints->icon_pixmap, image->pixmap, Scr->NormalGC, + 0, 0, image->width, image->height, 0, 0); + else + XCopyPlane (dpy, tmp_win->wmhints->icon_pixmap, image->pixmap, Scr->NormalGC, + 0, 0, image->width, image->height, 0, 0, 1 ); + + icon->width = image->width; + icon->height = image->height; + + if ((tmp_win->wmhints->flags & IconMaskHint) && + XGetGeometry(dpy, tmp_win->wmhints->icon_mask, + &JunkRoot, &JunkX, &JunkY, &JunkWidth, &JunkHeight, &JunkBW, &JunkDepth) && + (JunkDepth == 1)) { + GC gc; + + image->mask = XCreatePixmap (dpy, Scr->Root, JunkWidth, JunkHeight, 1); + if (image->mask) { + gc = XCreateGC (dpy, image->mask, 0, NULL); + if (gc) { + XCopyArea (dpy, tmp_win->wmhints->icon_mask, image->mask, gc, + 0, 0, JunkWidth, JunkHeight, 0, 0); + XFreeGC (dpy, gc); + } + } + } + icon->image = image; + } + } + + /* if we still haven't got an icon, let's look in the Icon list + * if ForceIcon is not set + */ + if (image == None && !Scr->ForceIcon) { + char *icon_name; + + icon->match = match_none; + icon->pattern = NULL; + icon_name = LookInNameList(Scr->IconNames, tmp_win->icon_name); + if (icon_name != NULL) { + icon->pattern = LookPatternInNameList (Scr->IconNames, tmp_win->icon_name); + icon->match = match_icon; + } + if (icon->match == match_none) + icon_name = LookInNameList(Scr->IconNames, tmp_win->full_name); + if ((icon->match == match_none) && (icon_name != NULL)) { + icon->pattern = LookPatternInNameList (Scr->IconNames, tmp_win->full_name); + icon->match = match_name; + } + if (icon->match == match_none) + icon_name = LookInList(Scr->IconNames, tmp_win->full_name, &tmp_win->class); + if ((icon->match == match_none) && (icon_name != NULL)) { + icon->pattern = LookPatternInList (Scr->IconNames, + tmp_win->full_name, &tmp_win->class); + icon->match = match_class; + } + if ((image = GetImage (icon_name, icon->iconc)) != None) { + icon->image = image; + icon->width = image->width; + icon->height = image->height; + tmp_win->forced = TRUE; + } + } + + /* if we still don't have an icon, assign the UnknownIcon */ + if (image == None && Scr->UnknownImage != None) + { + image = Scr->UnknownImage; + icon->width = image->width; + icon->height = image->height; + icon->image = image; + } + + if (image == None) + { + icon->height = 0; + icon->width = 0; + valuemask = 0; + } + else + { + valuemask = CWBackPixmap; + attributes.background_pixmap = image->pixmap; + } + + icon->border_width = Scr->IconBorderWidth; + if (Scr->NoIconTitlebar || + LookInNameList (Scr->NoIconTitle, tmp_win->icon_name) || + LookInList (Scr->NoIconTitle, tmp_win->full_name, &tmp_win->class)) + { + icon->w_width = icon->width; + icon->w_height = icon->height; + icon->x = 0; + icon->y = 0; + icon->has_title = False; + } + else { + XRectangle inc_rect; + XRectangle logical_rect; + + XmbTextExtents(Scr->IconFont.font_set, + tmp_win->icon_name, strlen (tmp_win->icon_name), + &inc_rect, &logical_rect); + icon->w_width = logical_rect.width; + + icon->w_width += 2 * Scr->IconManagerShadowDepth + 6; + if (icon->w_width > Scr->MaxIconTitleWidth) icon->w_width = Scr->MaxIconTitleWidth; + if (icon->w_width < icon->width) + { + icon->x = (icon->width - icon->w_width) / 2; + icon->x += Scr->IconManagerShadowDepth + 3; + icon->w_width = icon->width; + } + else + { + icon->x = Scr->IconManagerShadowDepth + 3; + } + icon->y = icon->height + Scr->IconFont.height + Scr->IconManagerShadowDepth; + icon->w_height = icon->height + Scr->IconFont.height + + 2 * Scr->IconManagerShadowDepth + 6; + icon->has_title = True; + if (icon->height) icon->border_width = 0; + } + + event_mask = 0; + if (tmp_win->wmhints && tmp_win->wmhints->flags & IconWindowHint) + { + icon->w = tmp_win->wmhints->icon_window; + if (tmp_win->forced || + XGetGeometry(dpy, icon->w, &JunkRoot, &JunkX, &JunkY, + (unsigned int *)&icon->w_width, (unsigned int *)&icon->w_height, + &JunkBW, &JunkDepth) == 0) + { + icon->w = None; + tmp_win->wmhints->flags &= ~IconWindowHint; + } + else + { + tmp_win->icon_not_ours = TRUE; + image = None; + icon->width = icon->w_width; + icon->height = icon->w_height; + icon->image = image; + icon->has_title = False; + event_mask = 0; + } + } + else + { + icon->w = None; + } + + if ((image != None) && + image->mask != None && + (! (tmp_win->wmhints && tmp_win->wmhints->flags & IconWindowHint))) { + icon->border_width = 0; + } + if (icon->w == None) + { + icon->w = XCreateSimpleWindow(dpy, Scr->Root, + 0,0, + icon->w_width, icon->w_height, + icon->border_width, icon->border, icon->iconc.back); + event_mask = ExposureMask; + } + + if (Scr->AutoRaiseIcons || Scr->ShrinkIconTitles) + event_mask |= EnterWindowMask | LeaveWindowMask; + event_mask |= KeyPressMask | ButtonPressMask | ButtonReleaseMask; + + if (tmp_win->icon_not_ours) { + XWindowAttributes wattr; + + XGetWindowAttributes(dpy, icon->w, &wattr); + if (wattr.all_event_masks & ButtonPressMask) { + event_mask &= ~ButtonPressMask; + } + } + XSelectInput (dpy, icon->w, event_mask); + + if (icon->width == 0) icon->width = icon->w_width; + icon->bm_w = None; + if (image && (! (tmp_win->wmhints && tmp_win->wmhints->flags & IconWindowHint))) { + XRectangle rect; + + x = GetIconOffset (icon); + icon->bm_w = XCreateWindow (dpy, icon->w, x, 0, + (unsigned int)icon->width, + (unsigned int)icon->height, + (unsigned int) 0, Scr->d_depth, + (unsigned int) CopyFromParent, + Scr->d_visual, valuemask, + &attributes); + if (image->mask) { + XShapeCombineMask (dpy, icon->bm_w, ShapeBounding, 0, 0, image->mask, ShapeSet); + XShapeCombineMask (dpy, icon->w, ShapeBounding, x, 0, image->mask, ShapeSet); + } else if (icon->has_title) { + rect.x = x; + rect.y = 0; + rect.width = icon->width; + rect.height = icon->height; + XShapeCombineRectangles (dpy, icon->w, ShapeBounding, + 0, 0, &rect, 1, ShapeSet, 0); + } + if (icon->has_title) { + if (Scr->ShrinkIconTitles) { + rect.x = x; + rect.y = icon->height; + rect.width = icon->width; + rect.height = icon->w_height - icon->height; + icon->title_shrunk = True; + } else { + rect.x = 0; + rect.y = icon->height; + rect.width = icon->w_width; + rect.height = icon->w_height - icon->height; + icon->title_shrunk = False; + } + XShapeCombineRectangles (dpy, icon->w, ShapeBounding, + 0, 0, &rect, 1, ShapeUnion, 0); + } + } + + if (icon->match != match_none) + AddToList (&tmp_win->iconslist, icon->pattern, (char*) icon); + + tmp_win->icon = icon; + /* I need to figure out where to put the icon window now, because + * getting here means that I am going to make the icon visible + */ + if (tmp_win->wmhints && + tmp_win->wmhints->flags & IconPositionHint) + { + final_x = tmp_win->wmhints->icon_x; + final_y = tmp_win->wmhints->icon_y; + } + else + { + if (visible (tmp_win)) + PlaceIcon(tmp_win, def_x, def_y, &final_x, &final_y); + } + + if (visible (tmp_win) || + (tmp_win->wmhints && tmp_win->wmhints->flags & IconPositionHint)) { + if (final_x > Scr->rootw) + final_x = Scr->rootw - icon->w_width - (2 * Scr->IconBorderWidth); + if (Scr->ShrinkIconTitles && icon->bm_w) { + if (final_x + (icon->w_width - icon->width) < 0) final_x = 0; + } else { + if (final_x < 0) final_x = 0; + } + if (final_y > Scr->rooth) + final_y = Scr->rooth - icon->height - + Scr->IconFont.height - 6 - (2 * Scr->IconBorderWidth); + if (final_y < 0) final_y = 0; + + XMoveWindow(dpy, icon->w, final_x, final_y); + } + tmp_win->iconified = TRUE; + + XMapSubwindows(dpy, icon->w); + XSaveContext(dpy, icon->w, TwmContext, (XPointer)tmp_win); + XSaveContext(dpy, icon->w, ScreenContext, (XPointer)Scr); + XDefineCursor(dpy, icon->w, Scr->IconCursor); + MaybeAnimate = True; + return (0); +} + +void DeleteIconsList(TwmWindow *tmp_win) +{ + /* + * Only the list itself needs to be freed, since the pointers it + * contains point into various lists that belong to Scr. + */ + FreeList(&tmp_win->iconslist); +} + +void ShrinkIconTitle (TwmWindow *tmp_win) +{ + Icon *icon; + XRectangle rect; + + if (!tmp_win || !tmp_win->icon) return; + icon = tmp_win->icon; + if (!icon->has_title) return; + if (icon->w_width == icon->width) return; + if (icon->height == 0) return; + + rect.x = GetIconOffset (icon); + rect.y = 0; + rect.width = icon->width; + rect.height = icon->w_height; + XShapeCombineRectangles (dpy, icon->w, ShapeBounding, 0, 0, &rect, 1, ShapeIntersect, 0); + icon->title_shrunk = True; + XClearArea (dpy, icon->w, 0, icon->height, icon->w_width, + icon->w_height - icon->height, True); +} + +void ExpandIconTitle (TwmWindow *tmp_win) +{ + Icon *icon; + XRectangle rect; + + if (!tmp_win || !tmp_win->icon) return; + icon = tmp_win->icon; + if (!icon->has_title) return; + if (icon->w_width == icon->width) return; + if (icon->height == 0) return; + + rect.x = 0; + rect.y = icon->height; + rect.width = icon->w_width; + rect.height = icon->w_height - icon->height; + XShapeCombineRectangles (dpy, icon->w, ShapeBounding, 0, 0, &rect, 1, ShapeUnion, 0); + icon->title_shrunk = False; + XClearArea (dpy, icon->w, 0, icon->height, icon->w_width, + icon->w_height - icon->height, True); +} + +void ReshapeIcon (Icon *icon) +{ + int x; + XRectangle rect; + + if (!icon) return; + x = GetIconOffset (icon); + XMoveWindow (dpy, icon->bm_w, x, 0); + + if (icon->image && icon->image->mask) { + XShapeCombineMask (dpy, icon->w, ShapeBounding, x, 0, icon->image->mask, ShapeSet); + } else { + rect.x = x; + rect.y = 0; + rect.width = icon->width; + rect.height = icon->height; + XShapeCombineRectangles (dpy, icon->w, ShapeBounding, 0, 0, &rect, 1, ShapeSet, 0); + } + rect.x = x; + rect.y = icon->height; + rect.width = icon->width; + rect.height = icon->w_height - icon->height; + XShapeCombineRectangles (dpy, icon->w, ShapeBounding, 0, 0, &rect, 1, ShapeUnion, 0); +} + +int GetIconOffset (Icon *icon) +{ + short justif; + + if (!icon) return (0); + + justif = icon->ir ? icon->ir->TitleJustification : Scr->IconJustification; + switch (justif) { + case J_LEFT : + return (0); + + case J_CENTER : + return ((icon->w_width - icon->width) / 2); + + case J_RIGHT : + return (icon->w_width - icon->width); + + default : + return (0); + } +} + +Bool AnimateIcons (ScreenInfo *scr, Icon *icon) +{ + Image *image; + XRectangle rect; + XSetWindowAttributes attr; + int x; + + image = icon->image; + attr.background_pixmap = image->pixmap; + XChangeWindowAttributes (dpy, icon->bm_w, CWBackPixmap, &attr); + + if (image->mask != None) { + x = GetIconOffset (icon); + XShapeCombineMask (dpy, icon->bm_w, ShapeBounding, 0, 0, image->mask, ShapeSet); + if (icon->has_title) { + rect.x = 0; + rect.y = icon->height; + rect.width = icon->w_width; + rect.height = scr->IconFont.height + 6; + + XShapeCombineShape (dpy, scr->ShapeWindow, ShapeBounding, x, 0, icon->bm_w, + ShapeBounding, ShapeSet); + XShapeCombineRectangles (dpy, scr->ShapeWindow, ShapeBounding, 0, 0, &rect, 1, + ShapeUnion, 0); + XShapeCombineShape (dpy, icon->w, ShapeBounding, 0, 0, scr->ShapeWindow, + ShapeBounding, ShapeSet); + } + else + XShapeCombineShape (dpy, icon->w, ShapeBounding, x, 0, icon->bm_w, + ShapeBounding, ShapeSet); + } + XClearWindow (dpy, icon->bm_w); + icon->image = image->next; + return (True); +} + Index: external/mit/ctwm/dist/icons.h =================================================================== RCS file: external/mit/ctwm/dist/icons.h diff -N external/mit/ctwm/dist/icons.h --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/icons.h 3 Sep 2015 12:19:55 -0000 @@ -0,0 +1,118 @@ +/* + * Copyright 1989 Massachusetts Institute of Technology + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of M.I.T. not be used in advertising + * or publicity pertaining to distribution of the software without specific, + * written prior permission. M.I.T. makes no representations about the + * suitability of this software for any purpose. It is provided "as is" + * without express or implied warranty. + * + * M.I.T. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL M.I.T. + * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ +/* + * [ ctwm ] + * + * Copyright 1992 Claude Lecommandeur. + * + * Permission to use, copy, modify and distribute this software [ctwm] and + * its documentation for any purpose is hereby granted without fee, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting documen- + * tation, and that the name of Claude Lecommandeur not be used in adverti- + * sing or publicity pertaining to distribution of the software without + * specific, written prior permission. Claude Lecommandeur make no represen- + * tations about the suitability of this software for any purpose. It is + * provided "as is" without express or implied warranty. + * + * Claude Lecommandeur DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO + * EVENT SHALL Claude Lecommandeur BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF + * USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR + * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + * + * Author: Claude Lecommandeur [ lecom@sic.epfl.ch ][ April 1992 ] + */ + +/********************************************************************** + * + * $XConsortium: icons.h,v 1.4 89/07/18 17:16:24 jim Exp $ + * + * Icon releated definitions + * + * 10-Apr-89 Tom LaStrange Initial Version. + * + **********************************************************************/ + +#include "screen.h" + +#ifndef ICONS_H +#define ICONS_H + +typedef enum {match_none, match_class, match_name, match_icon} Matchtype; + +struct Icon +{ + Matchtype match; + Window w; /* the icon window */ + Window bm_w; /* the icon bitmap window */ + Image *image; /* image icon structure */ + int x; /* icon text x coordinate */ + int y; /* icon text y coordiante */ + int w_width; /* width of the icon window */ + int w_height; /* height of the icon window */ + int width; /* width of the icon bitmap */ + int height; /* height of the icon bitmap */ + char *pattern; /* Why this icon was choosed */ + Pixel border; /* border color */ + ColorPair iconc; + Bool has_title, title_shrunk; + int border_width; + struct IconRegion *ir; +}; + +struct IconRegion +{ + struct IconRegion *next; + int x, y, w, h; + int grav1, grav2; + int stepx, stepy; /* allocation granularity */ + short TitleJustification; /* J_LEFT, J_CENTER or J_RIGHT */ + short Justification; /* J_LEFT, J_CENTER J_RIGHT or J_BORDER */ + short Alignement; /* J_TOP, J_CENTER, J_BOTTOM or J_BORDER */ + name_list *clientlist; + struct IconEntry *entries; +}; + +struct IconEntry +{ + struct IconEntry *next; + int x, y, w, h; + TwmWindow *twm_win; + short used; +}; + +extern int IconUp (TwmWindow *tmp_win); +extern void IconDown (TwmWindow *tmp_win); +extern name_list **AddIconRegion(char *geom, int grav1, int grav2, + int stepx, int stepy, + char *ijust, char *just, char *align); +extern int CreateIconWindow(TwmWindow *tmp_win, int def_x, int def_y); +extern void DeleteIconsList(TwmWindow *tmp_win); +extern void ShrinkIconTitle (TwmWindow *tmp_win); +extern void ExpandIconTitle (TwmWindow *tmp_win); +extern void ReshapeIcon (Icon *icon); +extern int GetIconOffset (Icon *icon); +extern Bool AnimateIcons (ScreenInfo *scr, Icon *icon); + +#endif /* ICONS_H */ Index: external/mit/ctwm/dist/levitte.ctwmrc =================================================================== RCS file: external/mit/ctwm/dist/levitte.ctwmrc diff -N external/mit/ctwm/dist/levitte.ctwmrc --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/levitte.ctwmrc 3 Sep 2015 12:19:55 -0000 @@ -0,0 +1,348 @@ +# +# $XConsortium: system.twmrc,v 1.8 91/04/23 21:10:58 gildea Exp $ +# +# Default twm configuration file; needs to be kept small to conserve string +# space in systems whose compilers don't handle medium-sized strings. +# +# Sites should tailor this file, providing any extra title buttons, menus, etc. +# that may be appropriate for their environment. For example, if most of the +# users were accustomed to uwm, the defaults could be set up not to decorate +# any windows and to use meta-keys. +# +# Changed by Richard Levitte for local system... + +IconDirectory "DECW$BITMAPS:" +PixmapDirectory "PROGRAM:[LIB.XPM]" + +NoDefaults +NoGrabServer +RestartPreviousState +DecorateTransients +StayUpMenus +TitleFont "-adobe-helvetica-bold-r-normal--*-120-*-*-*-*-*-*" +ResizeFont "-adobe-helvetica-bold-r-normal--*-120-*-*-*-*-*-*" +MenuFont "-adobe-helvetica-bold-r-normal--*-120-*-*-*-*-*-*" +IconFont "-adobe-helvetica-bold-r-normal--*-100-*-*-*-*-*-*" +IconManagerFont "-adobe-helvetica-bold-r-normal--*-100-*-*-*" +ShowWorkSpaceManager # start with workspcace manager up +ShowIconManager +UseThreeDMenus +UseThreeDTitles +UseThreeDIconManagers +UseThreeDBorders +UseThreeDWMap +SunkFocusWindowTitle +BorderResizeCursors +MovePackResistance 25 +AnimationSpeed 4 + +UsePPosition "on" +RandomPlacement "unmapped" + +IconManagerGeometry "360x100-0+71" 4 +IconifyByUnmapping +MaxIconTitleWidth 500 + +WorkSpaceManagerGeometry "360x60-0+0" 4 +WorkSpaces { + "One" {"#686B9F" "white" "DeepSkyBlue3"} + "Two" {"#619AAE" "white" "firebrick" "white" "plaid.xbm"} + "Three" {"#727786" "white" "brown"} + "Four" {"#8C5b7A" "white" "MidnightBlue"} + + "Five" {"#727786" "white" "firebrick"} + "Six" {"#619AAE" "white" "DeepSkyBlue3"} + "Seven" {"#8C5b7A" "white" "chartreuse4"} + "Eight" {"#686B9F" "white" "MidnightBlue"} +} + +Color +{ + BorderColor "Red" + DefaultBackground "blue" + DefaultForeground "gray85" + BorderTileBackground "DeepSkyBlue1" { + "xterm" "DeepSkyBlue3" + } + BorderTileForeground "Black" { + "xterm" "DeepSkyBlue3" + } + TitleBackground "DeepSkyBlue1" { + "xterm" "DeepSkyBlue3" + } + TitleForeground "Black" { + "xterm" "White" + } + MenuBackground "#686B9F" + MenuForeground "white" + MenuTitleBackground "gray70" + MenuTitleForeground "White" + IconBackground "LightSlateBlue" + IconForeground "White" + IconBorderColor "gray85" + IconManagerBackground "DeepSkyBlue1" {"Axe" "DeepSkyBlue3" "xload" "DeepSkyBlue2"} + IconManagerForeground "Black" + MapWindowBackground "DeepSkyBlue1" { + "root*" "Red" + "xterm" "DeepSkyBlue3" + "Axe" "Yellow" + } + MapWindowForeground "Black" { + "xterm" "White" + } +} + +Monochrome +{ + MapWindowBackground "white" + MapWindowForeground "black" + IconManagerHighlight "black" +} + +UnknownIcon "xpm:nothing.xpm" + +Icons +{ + "DECW$TERMINAL" "xpm:term.xpm" + "DECW$CALC" "xpm:xcalc.xpm" + "Emacs" "xpm:emacs.xpm" + "Tpu" "xpm:xedit.xpm" + "VUE$MASTER" "xpm:ball%.xpm" +} + +OccupyAll +{ + "VUE$MASTER" + "Decw$MessagePanel" + "Clock" +} + +IconManagerDontShow { + "WorkSpaceManager" +} + +NoTitle { # little programs that look like icons + "TWM Icon Manager" + "WorkSpaceManager" +} + +# +# Define some useful functions for motion-based actions. +# +MoveDelta 3 + +DefaultFunction f.nop + +Function "move-or-lower" { f.move f.deltastop f.lower } +Function "move-or-raise" { f.move f.deltastop f.raise } +Function "move-or-iconify" { f.move f.deltastop f.iconify } +Function "movepack-or-lower" { f.movepack f.deltastop f.lower } +Function "movepack-or-raise" { f.movepack f.deltastop f.raise } +Function "movepack-or-iconify" { f.movepack f.deltastop f.iconify } +Function "movepush-or-lower" { f.movepush f.deltastop f.lower } +Function "movepush-or-raise" { f.movepush f.deltastop f.raise } +Function "movepush-or-iconify" { f.movepush f.deltastop f.iconify } +Function "resize-or-raise" { f.resize f.deltastop f.raise } + + +# +# Set some useful bindings. Sort of uwm-ish, sort of simple-button-ish +# +LeftTitleButton ":xpm:bar" { + Button1 : f.menu "barmenu" +} +LeftTitleButton ":xpm:menu" { + Button1 : f.menu "titlemenu" +} +RightTitleButton ":xpm:dot" { + Button1 : f.iconify +} +RightTitleButton ":xpm:zoom" { + Button1 : f.fullzoom +} +RightTitleButton ":xpm:resize" { + Button1 : f.resize +} + +Button1 = : root : f.menu "defops" +Button2 = : root : f.menu "windowops" +Button3 = : root : f.menu "TwmWindows" +Button3 = s : root : f.menu "TwmWorkspaces" +Button3 = c : root : f.menu "TwmAllWindows" + +Button1 = m : window|icon : f.function "move-or-lower" +Button2 = m : window|icon : f.iconify +Button3 = m : window|icon : f.function "move-or-raise" + +Button1 = : title : f.function "move-or-raise" +Button1 = s : title : f.function "movepack-or-raise" +Button1 = c : title : f.function "movepush-or-raise" +Button2 = : title : f.raiselower +Button3 = : title : f.menu "titlemenu" + +Button1 = : icon : f.function "move-or-iconify" +Button2 = : icon : f.iconify +Button3 = : icon : f.menu "iconmenu" + +Button1 = : iconmgr : f.iconify +Button2 = : iconmgr : f.iconify +Button3 = : iconmgr : f.menu "iconmgrmenu" + +Button1 = : frame : f.function "resize-or-raise" +Button1 = s : frame : f.function "movepack-or-raise" +Button1 = c : frame : f.function "movepush-or-raise" +Button1 = m : frame : f.function "move-or-raise" +Button2 = : frame : f.raiselower +# +# And a menus with the usual things +# +menu "defops" +{ + "Utilities" f.title + "" f.separator + "Pin menu" f.pin + "" f.separator + "Bookreader" !"run sys$system:decw$bookreader" + "Calculator" !"run sys$system:decw$calc" + "DECterm" !"create/terminal/detach DECterm" + "Editor (EVE)" !"edit/tpu/display=DECwindows" + #"Editor (Emacs)" !"runemacs" + "Fileview" !"run sys$system:vue$master" + "Mail" !"run sys$system:decw$mail" + "Netscape" !"netscape -install" + "Paint" !"run sys$system:decw$paint" + "Xmag" !"run decw$utils:xmag" + "" f.separator + "Pause" !"run sys$system:decw$pausesession" + "Restart" f.restart + "Exit" f.quit + "Logout" !"run sys$system:decw$endsession" +} + +menu "windowops" { + "Windows" f.title + "" f.separator + "Pin menu" f.pin + "" f.separator + "Occupy" f.occupy + "Occupy All" f.occupyall + "Refresh All" f.refresh + "Refresh" f.winrefresh + "Vanish" f.vanish + "Info" f.identify + "CTWM version" f.version + "" f.separator + "Iconify" f.iconify + "" f.separator + "Sort icons" f.sorticonmgr + "Hide icon mgr" f.hideiconmgr + "Show icon mgr" f.showiconmgr + "Hide workspace mgr" f.hideworkspacemgr + "Show workspace mgr" f.showworkspacemgr + "" f.separator + "Squeeze" f.squeeze + "Resize" f.resize + "Move" f.move + "RaiseLower" f.raiselower + "Raise" f.raise + "Raise icons" f.raiseicons + "Lower" f.lower + "Focus" f.focus + "Unfocus" f.unfocus + "" f.separator + "Toggle autoraise" f.autoraise + "" f.separator + "Beep" f.beep + #"Adopt Window" f.adoptwindow + "Animation" f.menu "Anim" + "Zoom" f.menu "Zoom" + "" f.separator + "Send Save" f.saveyourself + "Send Delete" f.delete + "Kill Window" f.destroy +} + +menu "Anim" { + "Pin menu" f.pin + "" f.separator + "Start" f.startanimation + "*Stop" f.stopanimation + "Faster" f.speedupanimation + "Slower" f.slowdownanimation +} + +menu "Zoom" { + "Pin menu" f.pin + "" f.separator + "Full" f.fullzoom + "Horizontal" f.horizoom + "Vertical" f.zoom + "Left" f.leftzoom + "Top" f.topzoom + "Right" f.rightzoom + "Bottom" f.bottomzoom +} + +menu "barmenu" { + "Title Menu" f.title + "" f.separator + "Occupy ..." f.occupy + "Occupy All" f.occupyall + "Iconify" f.iconify + "Squeeze" f.squeeze + "RaiseLower" f.raiselower + "Refresh" f.winrefresh + "Zoom" f.menu "Zoom" + "Vanish" f.vanish + "Focus" f.focus + "Unfocus" f.unfocus + "" f.separator + "Send Delete" f.delete + "Kill Window" f.destroy + "Resize..." f.resize + "Move..." f.move +} + +menu "titlemenu" { + "Title Menu" f.title + "" f.separator + "Occupy ..." f.occupy + "Occupy All" f.occupyall + "Iconify" f.iconify + "Squeeze" f.squeeze + "RaiseLower" f.raiselower + "Refresh" f.winrefresh + "Zoom" f.menu "Zoom" + "Vanish" f.vanish + "Focus" f.focus + "Unfocus" f.unfocus + "" f.separator + "Send Delete" f.delete + "Kill Window" f.destroy + "Resize..." f.resize + "Move..." f.move +} + +menu "iconmenu" { + "Actions" f.title + "" f.separator + "Restore" f.iconify + "Move" f.move + "Occupy ..." f.occupy + "Occupy All" f.occupyall + "" f.separator + "Send Delete" f.delete + "Kill Window" f.destroy +} + +menu "iconmgrmenu" { + "Actions" f.title + "" f.separator + "Restore" f.iconify + "Occupy ..." f.occupy + "Occupy All" f.occupyall + "" f.separator + "Send Delete" f.delete + "Kill Window" f.destroy +} + Index: external/mit/ctwm/dist/lex.c =================================================================== RCS file: external/mit/ctwm/dist/lex.c diff -N external/mit/ctwm/dist/lex.c --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/lex.c 3 Sep 2015 12:19:55 -0000 @@ -0,0 +1,2002 @@ + +#line 3 "" + +#define YY_INT_ALIGNED short int + +/* A lexical scanner generated by flex */ + +#define FLEX_SCANNER +#define YY_FLEX_MAJOR_VERSION 2 +#define YY_FLEX_MINOR_VERSION 5 +#define YY_FLEX_SUBMINOR_VERSION 39 +#if YY_FLEX_SUBMINOR_VERSION > 0 +#define FLEX_BETA +#endif + +/* First, we deal with platform-specific or compiler-specific issues. */ + +/* begin standard C headers. */ +#include +#include +#include +#include + +/* end standard C headers. */ + +/* flex integer type definitions */ + +#ifndef FLEXINT_H +#define FLEXINT_H + +/* C99 systems have . Non-C99 systems may or may not. */ + +#if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L + +/* C99 says to define __STDC_LIMIT_MACROS before including stdint.h, + * if you want the limit (max/min) macros for int types. + */ +#ifndef __STDC_LIMIT_MACROS +#define __STDC_LIMIT_MACROS 1 +#endif + +#include +typedef int8_t flex_int8_t; +typedef uint8_t flex_uint8_t; +typedef int16_t flex_int16_t; +typedef uint16_t flex_uint16_t; +typedef int32_t flex_int32_t; +typedef uint32_t flex_uint32_t; +#else +typedef signed char flex_int8_t; +typedef short int flex_int16_t; +typedef int flex_int32_t; +typedef unsigned char flex_uint8_t; +typedef unsigned short int flex_uint16_t; +typedef unsigned int flex_uint32_t; + +/* Limits of integral types. */ +#ifndef INT8_MIN +#define INT8_MIN (-128) +#endif +#ifndef INT16_MIN +#define INT16_MIN (-32767-1) +#endif +#ifndef INT32_MIN +#define INT32_MIN (-2147483647-1) +#endif +#ifndef INT8_MAX +#define INT8_MAX (127) +#endif +#ifndef INT16_MAX +#define INT16_MAX (32767) +#endif +#ifndef INT32_MAX +#define INT32_MAX (2147483647) +#endif +#ifndef UINT8_MAX +#define UINT8_MAX (255U) +#endif +#ifndef UINT16_MAX +#define UINT16_MAX (65535U) +#endif +#ifndef UINT32_MAX +#define UINT32_MAX (4294967295U) +#endif + +#endif /* ! C99 */ + +#endif /* ! FLEXINT_H */ + +#ifdef __cplusplus + +/* The "const" storage-class-modifier is valid. */ +#define YY_USE_CONST + +#else /* ! __cplusplus */ + +/* C99 requires __STDC__ to be defined as 1. */ +#if defined (__STDC__) + +#define YY_USE_CONST + +#endif /* defined (__STDC__) */ +#endif /* ! __cplusplus */ + +#ifdef YY_USE_CONST +#define yyconst const +#else +#define yyconst +#endif + +/* Returned upon end-of-file. */ +#define YY_NULL 0 + +/* Promotes a possibly negative, possibly signed char to an unsigned + * integer for use as an array index. If the signed char is negative, + * we want to instead treat it as an 8-bit unsigned char, hence the + * double cast. + */ +#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c) + +/* Enter a start condition. This macro really ought to take a parameter, + * but we do it the disgusting crufty way forced on us by the ()-less + * definition of BEGIN. + */ +#define BEGIN (yy_start) = 1 + 2 * + +/* Translate the current start state into a value that can be later handed + * to BEGIN to return to the state. The YYSTATE alias is for lex + * compatibility. + */ +#define YY_START (((yy_start) - 1) / 2) +#define YYSTATE YY_START + +/* Action number for EOF rule of a given start state. */ +#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) + +/* Special action meaning "start processing a new file". */ +#define YY_NEW_FILE yyrestart(yyin ) + +#define YY_END_OF_BUFFER_CHAR 0 + +/* Size of default input buffer. */ +#ifndef YY_BUF_SIZE +#define YY_BUF_SIZE 16384 +#endif + +/* The state buf must be large enough to hold one state per character in the main buffer. + */ +#define YY_STATE_BUF_SIZE ((YY_BUF_SIZE + 2) * sizeof(yy_state_type)) + +#ifndef YY_TYPEDEF_YY_BUFFER_STATE +#define YY_TYPEDEF_YY_BUFFER_STATE +typedef struct yy_buffer_state *YY_BUFFER_STATE; +#endif + +#ifndef YY_TYPEDEF_YY_SIZE_T +#define YY_TYPEDEF_YY_SIZE_T +typedef size_t yy_size_t; +#endif + +extern yy_size_t yyleng; + +extern FILE *yyin, *yyout; + +#define EOB_ACT_CONTINUE_SCAN 0 +#define EOB_ACT_END_OF_FILE 1 +#define EOB_ACT_LAST_MATCH 2 + + /* Note: We specifically omit the test for yy_rule_can_match_eol because it requires + * access to the local variable yy_act. Since yyless() is a macro, it would break + * existing scanners that call yyless() from OUTSIDE yylex. + * One obvious solution it to make yy_act a global. I tried that, and saw + * a 5% performance hit in a non-yylineno scanner, because yy_act is + * normally declared as a register variable-- so it is not worth it. + */ + #define YY_LESS_LINENO(n) \ + do { \ + int yyl;\ + for ( yyl = n; yyl < yyleng; ++yyl )\ + if ( yytext[yyl] == '\n' )\ + --yylineno;\ + }while(0) + #define YY_LINENO_REWIND_TO(dst) \ + do {\ + const char *p;\ + for ( p = yy_cp-1; p >= (dst); --p)\ + if ( *p == '\n' )\ + --yylineno;\ + }while(0) + +/* Return all but the first "n" matched characters back to the input stream. */ +#define yyless(n) \ + do \ + { \ + /* Undo effects of setting up yytext. */ \ + int yyless_macro_arg = (n); \ + YY_LESS_LINENO(yyless_macro_arg);\ + *yy_cp = (yy_hold_char); \ + YY_RESTORE_YY_MORE_OFFSET \ + (yy_c_buf_p) = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \ + YY_DO_BEFORE_ACTION; /* set up yytext again */ \ + } \ + while ( 0 ) + +#define unput(c) yyunput( c, (yytext_ptr) ) + +#ifndef YY_STRUCT_YY_BUFFER_STATE +#define YY_STRUCT_YY_BUFFER_STATE +struct yy_buffer_state + { + FILE *yy_input_file; + + char *yy_ch_buf; /* input buffer */ + char *yy_buf_pos; /* current position in input buffer */ + + /* Size of input buffer in bytes, not including room for EOB + * characters. + */ + yy_size_t yy_buf_size; + + /* Number of characters read into yy_ch_buf, not including EOB + * characters. + */ + yy_size_t yy_n_chars; + + /* Whether we "own" the buffer - i.e., we know we created it, + * and can realloc() it to grow it, and should free() it to + * delete it. + */ + int yy_is_our_buffer; + + /* Whether this is an "interactive" input source; if so, and + * if we're using stdio for input, then we want to use getc() + * instead of fread(), to make sure we stop fetching input after + * each newline. + */ + int yy_is_interactive; + + /* Whether we're considered to be at the beginning of a line. + * If so, '^' rules will be active on the next match, otherwise + * not. + */ + int yy_at_bol; + + int yy_bs_lineno; /**< The line count. */ + int yy_bs_column; /**< The column count. */ + + /* Whether to try to fill the input buffer when we reach the + * end of it. + */ + int yy_fill_buffer; + + int yy_buffer_status; + +#define YY_BUFFER_NEW 0 +#define YY_BUFFER_NORMAL 1 + /* When an EOF's been seen but there's still some text to process + * then we mark the buffer as YY_EOF_PENDING, to indicate that we + * shouldn't try reading from the input source any more. We might + * still have a bunch of tokens to match, though, because of + * possible backing-up. + * + * When we actually see the EOF, we change the status to "new" + * (via yyrestart()), so that the user can continue scanning by + * just pointing yyin at a new input file. + */ +#define YY_BUFFER_EOF_PENDING 2 + + }; +#endif /* !YY_STRUCT_YY_BUFFER_STATE */ + +/* Stack of input buffers. */ +static size_t yy_buffer_stack_top = 0; /**< index of top of stack. */ +static size_t yy_buffer_stack_max = 0; /**< capacity of stack. */ +static YY_BUFFER_STATE * yy_buffer_stack = 0; /**< Stack as an array. */ + +/* We provide macros for accessing buffer states in case in the + * future we want to put the buffer states in a more general + * "scanner state". + * + * Returns the top of the stack, or NULL. + */ +#define YY_CURRENT_BUFFER ( (yy_buffer_stack) \ + ? (yy_buffer_stack)[(yy_buffer_stack_top)] \ + : NULL) + +/* Same as previous macro, but useful when we know that the buffer stack is not + * NULL or when we need an lvalue. For internal use only. + */ +#define YY_CURRENT_BUFFER_LVALUE (yy_buffer_stack)[(yy_buffer_stack_top)] + +/* yy_hold_char holds the character lost when yytext is formed. */ +static char yy_hold_char; +static yy_size_t yy_n_chars; /* number of characters read into yy_ch_buf */ +yy_size_t yyleng; + +/* Points to current character in buffer. */ +static char *yy_c_buf_p = (char *) 0; +static int yy_init = 0; /* whether we need to initialize */ +static int yy_start = 0; /* start state number */ + +/* Flag which is used to allow yywrap()'s to do buffer switches + * instead of setting up a fresh yyin. A bit of a hack ... + */ +static int yy_did_buffer_switch_on_eof; + +void yyrestart (FILE *input_file ); +void yy_switch_to_buffer (YY_BUFFER_STATE new_buffer ); +YY_BUFFER_STATE yy_create_buffer (FILE *file,int size ); +void yy_delete_buffer (YY_BUFFER_STATE b ); +void yy_flush_buffer (YY_BUFFER_STATE b ); +void yypush_buffer_state (YY_BUFFER_STATE new_buffer ); +void yypop_buffer_state (void ); + +static void yyensure_buffer_stack (void ); +static void yy_load_buffer_state (void ); +static void yy_init_buffer (YY_BUFFER_STATE b,FILE *file ); + +#define YY_FLUSH_BUFFER yy_flush_buffer(YY_CURRENT_BUFFER ) + +YY_BUFFER_STATE yy_scan_buffer (char *base,yy_size_t size ); +YY_BUFFER_STATE yy_scan_string (yyconst char *yy_str ); +YY_BUFFER_STATE yy_scan_bytes (yyconst char *bytes,yy_size_t len ); + +void *yyalloc (yy_size_t ); +void *yyrealloc (void *,yy_size_t ); +void yyfree (void * ); + +#define yy_new_buffer yy_create_buffer + +#define yy_set_interactive(is_interactive) \ + { \ + if ( ! YY_CURRENT_BUFFER ){ \ + yyensure_buffer_stack (); \ + YY_CURRENT_BUFFER_LVALUE = \ + yy_create_buffer(yyin,YY_BUF_SIZE ); \ + } \ + YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \ + } + +#define yy_set_bol(at_bol) \ + { \ + if ( ! YY_CURRENT_BUFFER ){\ + yyensure_buffer_stack (); \ + YY_CURRENT_BUFFER_LVALUE = \ + yy_create_buffer(yyin,YY_BUF_SIZE ); \ + } \ + YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \ + } + +#define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol) + +/* Begin user sect3 */ + +typedef unsigned char YY_CHAR; + +FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0; + +typedef int yy_state_type; + +#define YY_FLEX_LEX_COMPAT +extern int yylineno; + +int yylineno = 1; + +extern char yytext[]; + +static yy_state_type yy_get_previous_state (void ); +static yy_state_type yy_try_NUL_trans (yy_state_type current_state ); +static int yy_get_next_buffer (void ); +static void yy_fatal_error (yyconst char msg[] ); + +/* Done after the current pattern has been matched and before the + * corresponding action - sets up yytext. + */ +#define YY_DO_BEFORE_ACTION \ + (yytext_ptr) = yy_bp; \ + yyleng = (size_t) (yy_cp - yy_bp); \ + (yy_hold_char) = *yy_cp; \ + *yy_cp = '\0'; \ + if ( yyleng >= YYLMAX ) \ + YY_FATAL_ERROR( "token too large, exceeds YYLMAX" ); \ + yy_flex_strncpy( yytext, (yytext_ptr), yyleng + 1 ); \ + (yy_c_buf_p) = yy_cp; + +#define YY_NUM_RULES 18 +#define YY_END_OF_BUFFER 19 +/* This struct is not used in this scanner, + but its presence is necessary. */ +struct yy_trans_info + { + flex_int32_t yy_verify; + flex_int32_t yy_nxt; + }; +static yyconst flex_int16_t yy_accept[33] = + { 0, + 0, 0, 19, 17, 16, 16, 11, 17, 17, 3, + 4, 7, 8, 10, 14, 6, 5, 12, 1, 9, + 2, 0, 13, 0, 0, 15, 10, 14, 0, 13, + 0, 0 + } ; + +static yyconst flex_int32_t yy_ec[256] = + { 0, + 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 2, 4, 5, 6, 1, 1, 1, 1, 7, + 8, 1, 9, 1, 10, 11, 1, 12, 12, 12, + 12, 12, 12, 12, 12, 12, 12, 13, 1, 1, + 14, 1, 1, 1, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 1, 15, 1, 16, 1, 1, 11, 11, 11, 11, + + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 17, 18, 19, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1 + } ; + +static yyconst flex_int32_t yy_meta[20] = + { 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1 + } ; + +static yyconst flex_int16_t yy_base[36] = + { 0, + 0, 0, 39, 58, 58, 58, 58, 15, 35, 58, + 58, 58, 58, 26, 24, 58, 58, 58, 58, 58, + 58, 16, 58, 29, 26, 58, 17, 15, 18, 20, + 42, 58, 25, 23, 21 + } ; + +static yyconst flex_int16_t yy_def[36] = + { 0, + 32, 1, 32, 32, 32, 32, 32, 33, 34, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 33, 32, 35, 34, 32, 32, 32, 33, 33, + 35, 0, 32, 32, 32 + } ; + +static yyconst flex_int16_t yy_nxt[78] = + { 0, + 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, + 14, 15, 16, 17, 4, 18, 19, 20, 21, 23, + 23, 29, 23, 25, 23, 22, 28, 27, 26, 24, + 24, 22, 24, 30, 24, 28, 27, 26, 32, 32, + 32, 32, 32, 31, 22, 32, 30, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 31, 3, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32 + } ; + +static yyconst flex_int16_t yy_chk[78] = + { 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 8, + 22, 35, 29, 34, 30, 33, 28, 27, 25, 8, + 22, 24, 29, 24, 30, 15, 14, 9, 3, 0, + 0, 0, 0, 24, 31, 0, 31, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 31, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32 + } ; + +/* Table of booleans, true if rule could match eol. */ +static yyconst flex_int32_t yy_rule_can_match_eol[19] = + { 0, +0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, }; + +static yy_state_type yy_last_accepting_state; +static char *yy_last_accepting_cpos; + +extern int yy_flex_debug; +int yy_flex_debug = 0; + +/* The intent behind this definition is that it'll catch + * any uses of REJECT which flex missed. + */ +#define REJECT reject_used_but_not_detected +#define yymore() yymore_used_but_not_detected +#define YY_MORE_ADJ 0 +#define YY_RESTORE_YY_MORE_OFFSET +#ifndef YYLMAX +#define YYLMAX 8192 +#endif + +char yytext[YYLMAX]; +char *yytext_ptr; +#line 1 "lex.l" +#line 2 "lex.l" +/*****************************************************************************/ +/** Copyright 1988 by Evans & Sutherland Computer Corporation, **/ +/** Salt Lake City, Utah **/ +/** Portions Copyright 1989 by the Massachusetts Institute of Technology **/ +/** Cambridge, Massachusetts **/ +/** **/ +/** All Rights Reserved **/ +/** **/ +/** Permission to use, copy, modify, and distribute this software and **/ +/** its documentation for any purpose and without fee is hereby **/ +/** granted, provided that the above copyright notice appear in all **/ +/** copies and that both that copyright notice and this permis- **/ +/** sion notice appear in supporting documentation, and that the **/ +/** names of Evans & Sutherland and M.I.T. not be used in advertising **/ +/** in publicity pertaining to distribution of the software without **/ +/** specific, written prior permission. **/ +/** **/ +/** EVANS & SUTHERLAND AND M.I.T. DISCLAIM ALL WARRANTIES WITH REGARD **/ +/** TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANT- **/ +/** ABILITY AND FITNESS, IN NO EVENT SHALL EVANS & SUTHERLAND OR **/ +/** M.I.T. BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAM- **/ +/** AGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA **/ +/** OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER **/ +/** TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE **/ +/** OR PERFORMANCE OF THIS SOFTWARE. **/ +/*****************************************************************************/ +/* + * [ ctwm ] + * + * Copyright 1992 Claude Lecommandeur. + * + * Permission to use, copy, modify and distribute this software [ctwm] and + * its documentation for any purpose is hereby granted without fee, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting documen- + * tation, and that the name of Claude Lecommandeur not be used in adverti- + * sing or publicity pertaining to distribution of the software without + * specific, written prior permission. Claude Lecommandeur make no represen- + * tations about the suitability of this software for any purpose. It is + * provided "as is" without express or implied warranty. + * + * Claude Lecommandeur DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO + * EVENT SHALL Claude Lecommandeur BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF + * USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR + * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + * + * Author: Claude Lecommandeur [ lecom@sic.epfl.ch ][ April 1992 ] + */ + +/*********************************************************************** + * + * $XConsortium: lex.l,v 1.62 89/12/10 17:46:33 jim Exp $ + * + * .twmrc lex file + * + * 12-Nov-87 Thomas E. LaStrange File created + * + ***********************************************************************/ + +/* #include */ /* lex already includes stdio.h */ +#ifdef VMS +# include +# ifdef __DECC +# include +# else +# include +# endif +#endif +#include "parse.h" +extern char *ProgramName; + +extern int ParseError; +extern void twmrc_error_prefix(void); +#ifdef FLEX_SCANNER +# undef YY_INPUT +# define YY_INPUT(buf,result,max_size) {buf[0]=twmInputFunc();result=(buf[0] != 0);} +#endif + +extern int yylex(void); +#line 590 "" + +#define INITIAL 0 + +#ifndef YY_NO_UNISTD_H +/* Special case for "unistd.h", since it is non-ANSI. We include it way + * down here because we want the user's section 1 to have been scanned first. + * The user has a chance to override it with an option. + */ +#include +#endif + +#ifndef YY_EXTRA_TYPE +#define YY_EXTRA_TYPE void * +#endif + +static int yy_init_globals (void ); + +/* Accessor methods to globals. + These are made visible to non-reentrant scanners for convenience. */ + +int yylex_destroy (void ); + +int yyget_debug (void ); + +void yyset_debug (int debug_flag ); + +YY_EXTRA_TYPE yyget_extra (void ); + +void yyset_extra (YY_EXTRA_TYPE user_defined ); + +FILE *yyget_in (void ); + +void yyset_in (FILE * in_str ); + +FILE *yyget_out (void ); + +void yyset_out (FILE * out_str ); + +yy_size_t yyget_leng (void ); + +char *yyget_text (void ); + +int yyget_lineno (void ); + +void yyset_lineno (int line_number ); + +/* Macros after this point can all be overridden by user definitions in + * section 1. + */ + +#ifndef YY_SKIP_YYWRAP +#ifdef __cplusplus +extern "C" int yywrap (void ); +#else +extern int yywrap (void ); +#endif +#endif + + static void yyunput (int c,char *buf_ptr ); + +#ifndef yytext_ptr +static void yy_flex_strncpy (char *,yyconst char *,int ); +#endif + +#ifdef YY_NEED_STRLEN +static int yy_flex_strlen (yyconst char * ); +#endif + +#ifndef YY_NO_INPUT + +#ifdef __cplusplus +static int yyinput (void ); +#else +static int input (void ); +#endif + +#endif + +/* Amount of stuff to slurp up with each read. */ +#ifndef YY_READ_BUF_SIZE +#define YY_READ_BUF_SIZE 8192 +#endif + +/* Copy whatever the last rule matched to the standard output. */ +#ifndef ECHO +/* This used to be an fputs(), but since the string might contain NUL's, + * we now use fwrite(). + */ +#define ECHO do { if (fwrite( yytext, yyleng, 1, yyout )) {} } while (0) +#endif + +/* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, + * is returned in "result". + */ +#ifndef YY_INPUT +#define YY_INPUT(buf,result,max_size) \ + if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \ + { \ + int c = '*'; \ + size_t n; \ + for ( n = 0; n < max_size && \ + (c = getc( yyin )) != EOF && c != '\n'; ++n ) \ + buf[n] = (char) c; \ + if ( c == '\n' ) \ + buf[n++] = (char) c; \ + if ( c == EOF && ferror( yyin ) ) \ + YY_FATAL_ERROR( "input in flex scanner failed" ); \ + result = n; \ + } \ + else \ + { \ + errno=0; \ + while ( (result = fread(buf, 1, max_size, yyin))==0 && ferror(yyin)) \ + { \ + if( errno != EINTR) \ + { \ + YY_FATAL_ERROR( "input in flex scanner failed" ); \ + break; \ + } \ + errno=0; \ + clearerr(yyin); \ + } \ + }\ +\ + +#endif + +/* No semi-colon after return; correct usage is to write "yyterminate();" - + * we don't want an extra ';' after the "return" because that will cause + * some compilers to complain about unreachable statements. + */ +#ifndef yyterminate +#define yyterminate() return YY_NULL +#endif + +/* Number of entries by which start-condition stack grows. */ +#ifndef YY_START_STACK_INCR +#define YY_START_STACK_INCR 25 +#endif + +/* Report a fatal error. */ +#ifndef YY_FATAL_ERROR +#define YY_FATAL_ERROR(msg) yy_fatal_error( msg ) +#endif + +/* end tables serialization structures and prototypes */ + +/* Default declaration of generated scanner - a define so the user can + * easily add parameters. + */ +#ifndef YY_DECL +#define YY_DECL_IS_OURS 1 + +extern int yylex (void); + +#define YY_DECL int yylex (void) +#endif /* !YY_DECL */ + +/* Code executed at the beginning of each rule, after yytext and yyleng + * have been set up. + */ +#ifndef YY_USER_ACTION +#define YY_USER_ACTION +#endif + +/* Code executed at the end of each rule. */ +#ifndef YY_BREAK +#define YY_BREAK break; +#endif + +#define YY_RULE_SETUP \ + YY_USER_ACTION + +/** The main scanner function which does all the work. + */ +YY_DECL +{ + register yy_state_type yy_current_state; + register char *yy_cp, *yy_bp; + register int yy_act; + + if ( !(yy_init) ) + { + (yy_init) = 1; + +#ifdef YY_USER_INIT + YY_USER_INIT; +#endif + + if ( ! (yy_start) ) + (yy_start) = 1; /* first start state */ + + if ( ! yyin ) + yyin = stdin; + + if ( ! yyout ) + yyout = stdout; + + if ( ! YY_CURRENT_BUFFER ) { + yyensure_buffer_stack (); + YY_CURRENT_BUFFER_LVALUE = + yy_create_buffer(yyin,YY_BUF_SIZE ); + } + + yy_load_buffer_state( ); + } + + { +#line 88 "lex.l" + +#line 801 "" + + while ( 1 ) /* loops until end-of-file is reached */ + { + yy_cp = (yy_c_buf_p); + + /* Support of yytext. */ + *yy_cp = (yy_hold_char); + + /* yy_bp points to the position in yy_ch_buf of the start of + * the current run. + */ + yy_bp = yy_cp; + + yy_current_state = (yy_start); +yy_match: + do + { + register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)] ; + if ( yy_accept[yy_current_state] ) + { + (yy_last_accepting_state) = yy_current_state; + (yy_last_accepting_cpos) = yy_cp; + } + while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) + { + yy_current_state = (int) yy_def[yy_current_state]; + if ( yy_current_state >= 33 ) + yy_c = yy_meta[(unsigned int) yy_c]; + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; + ++yy_cp; + } + while ( yy_base[yy_current_state] != 58 ); + +yy_find_action: + yy_act = yy_accept[yy_current_state]; + if ( yy_act == 0 ) + { /* have to back up */ + yy_cp = (yy_last_accepting_cpos); + yy_current_state = (yy_last_accepting_state); + yy_act = yy_accept[yy_current_state]; + } + + YY_DO_BEFORE_ACTION; + + if ( yy_act != YY_END_OF_BUFFER && yy_rule_can_match_eol[yy_act] ) + { + yy_size_t yyl; + for ( yyl = 0; yyl < yyleng; ++yyl ) + if ( yytext[yyl] == '\n' ) + + yylineno++; +; + } + +do_action: /* This label is used only to access EOF actions. */ + + switch ( yy_act ) + { /* beginning of action switch */ + case 0: /* must back up */ + /* undo the effects of YY_DO_BEFORE_ACTION */ + *yy_cp = (yy_hold_char); + yy_cp = (yy_last_accepting_cpos); + yy_current_state = (yy_last_accepting_state); + goto yy_find_action; + +case 1: +YY_RULE_SETUP +#line 89 "lex.l" +{ return (LB); } + YY_BREAK +case 2: +YY_RULE_SETUP +#line 90 "lex.l" +{ return (RB); } + YY_BREAK +case 3: +YY_RULE_SETUP +#line 91 "lex.l" +{ return (LP); } + YY_BREAK +case 4: +YY_RULE_SETUP +#line 92 "lex.l" +{ return (RP); } + YY_BREAK +case 5: +YY_RULE_SETUP +#line 93 "lex.l" +{ return (EQUALS); } + YY_BREAK +case 6: +YY_RULE_SETUP +#line 94 "lex.l" +{ return (COLON); } + YY_BREAK +case 7: +YY_RULE_SETUP +#line 95 "lex.l" +{ return PLUS; } + YY_BREAK +case 8: +YY_RULE_SETUP +#line 96 "lex.l" +{ return MINUS; } + YY_BREAK +case 9: +YY_RULE_SETUP +#line 97 "lex.l" +{ return OR; } + YY_BREAK +case 10: +YY_RULE_SETUP +#line 99 "lex.l" +{ int token = parse_keyword (yytext, + &yylval.num); + if (token == ERRORTOKEN) { + twmrc_error_prefix(); + fprintf (stderr, + "ignoring unknown keyword: %s\n", + yytext); + ParseError = 1; + } else + return token; + } + YY_BREAK +case 11: +YY_RULE_SETUP +#line 111 "lex.l" +{ yylval.num = F_EXEC; return FSKEYWORD; } + YY_BREAK +case 12: +YY_RULE_SETUP +#line 112 "lex.l" +{ yylval.num = F_CUT; return FSKEYWORD; } + YY_BREAK +case 13: +/* rule 13 can match eol */ +YY_RULE_SETUP +#line 114 "lex.l" +{ yylval.ptr = yytext; return STRING; } + YY_BREAK +case 14: +YY_RULE_SETUP +#line 115 "lex.l" +{ (void)sscanf(yytext, "%d", &yylval.num); + return NUMBER; } + YY_BREAK +case 15: +/* rule 15 can match eol */ +YY_RULE_SETUP +#line 117 "lex.l" +{;} + YY_BREAK +case 16: +/* rule 16 can match eol */ +YY_RULE_SETUP +#line 118 "lex.l" +{;} + YY_BREAK +case 17: +YY_RULE_SETUP +#line 119 "lex.l" +{ + twmrc_error_prefix(); + fprintf (stderr, + "ignoring character \"%s\"\n", + yytext); + ParseError = 1; + } + YY_BREAK +case 18: +YY_RULE_SETUP +#line 126 "lex.l" +ECHO; + YY_BREAK +#line 978 "" +case YY_STATE_EOF(INITIAL): + yyterminate(); + + case YY_END_OF_BUFFER: + { + /* Amount of text matched not including the EOB char. */ + int yy_amount_of_matched_text = (int) (yy_cp - (yytext_ptr)) - 1; + + /* Undo the effects of YY_DO_BEFORE_ACTION. */ + *yy_cp = (yy_hold_char); + YY_RESTORE_YY_MORE_OFFSET + + if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_NEW ) + { + /* We're scanning a new file or input source. It's + * possible that this happened because the user + * just pointed yyin at a new source and called + * yylex(). If so, then we have to assure + * consistency between YY_CURRENT_BUFFER and our + * globals. Here is the right place to do so, because + * this is the first action (other than possibly a + * back-up) that will match for the new input source. + */ + (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; + YY_CURRENT_BUFFER_LVALUE->yy_input_file = yyin; + YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = YY_BUFFER_NORMAL; + } + + /* Note that here we test for yy_c_buf_p "<=" to the position + * of the first EOB in the buffer, since yy_c_buf_p will + * already have been incremented past the NUL character + * (since all states make transitions on EOB to the + * end-of-buffer state). Contrast this with the test + * in input(). + */ + if ( (yy_c_buf_p) <= &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) + { /* This was really a NUL. */ + yy_state_type yy_next_state; + + (yy_c_buf_p) = (yytext_ptr) + yy_amount_of_matched_text; + + yy_current_state = yy_get_previous_state( ); + + /* Okay, we're now positioned to make the NUL + * transition. We couldn't have + * yy_get_previous_state() go ahead and do it + * for us because it doesn't know how to deal + * with the possibility of jamming (and we don't + * want to build jamming into it because then it + * will run more slowly). + */ + + yy_next_state = yy_try_NUL_trans( yy_current_state ); + + yy_bp = (yytext_ptr) + YY_MORE_ADJ; + + if ( yy_next_state ) + { + /* Consume the NUL. */ + yy_cp = ++(yy_c_buf_p); + yy_current_state = yy_next_state; + goto yy_match; + } + + else + { + yy_cp = (yy_c_buf_p); + goto yy_find_action; + } + } + + else switch ( yy_get_next_buffer( ) ) + { + case EOB_ACT_END_OF_FILE: + { + (yy_did_buffer_switch_on_eof) = 0; + + if ( yywrap( ) ) + { + /* Note: because we've taken care in + * yy_get_next_buffer() to have set up + * yytext, we can now set up + * yy_c_buf_p so that if some total + * hoser (like flex itself) wants to + * call the scanner after we return the + * YY_NULL, it'll still work - another + * YY_NULL will get returned. + */ + (yy_c_buf_p) = (yytext_ptr) + YY_MORE_ADJ; + + yy_act = YY_STATE_EOF(YY_START); + goto do_action; + } + + else + { + if ( ! (yy_did_buffer_switch_on_eof) ) + YY_NEW_FILE; + } + break; + } + + case EOB_ACT_CONTINUE_SCAN: + (yy_c_buf_p) = + (yytext_ptr) + yy_amount_of_matched_text; + + yy_current_state = yy_get_previous_state( ); + + yy_cp = (yy_c_buf_p); + yy_bp = (yytext_ptr) + YY_MORE_ADJ; + goto yy_match; + + case EOB_ACT_LAST_MATCH: + (yy_c_buf_p) = + &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)]; + + yy_current_state = yy_get_previous_state( ); + + yy_cp = (yy_c_buf_p); + yy_bp = (yytext_ptr) + YY_MORE_ADJ; + goto yy_find_action; + } + break; + } + + default: + YY_FATAL_ERROR( + "fatal flex scanner internal error--no action found" ); + } /* end of action switch */ + } /* end of scanning one token */ + } /* end of user's declarations */ +} /* end of yylex */ + +/* yy_get_next_buffer - try to read in a new buffer + * + * Returns a code representing an action: + * EOB_ACT_LAST_MATCH - + * EOB_ACT_CONTINUE_SCAN - continue scanning from current position + * EOB_ACT_END_OF_FILE - end of file + */ +static int yy_get_next_buffer (void) +{ + register char *dest = YY_CURRENT_BUFFER_LVALUE->yy_ch_buf; + register char *source = (yytext_ptr); + register int number_to_move, i; + int ret_val; + + if ( (yy_c_buf_p) > &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] ) + YY_FATAL_ERROR( + "fatal flex scanner internal error--end of buffer missed" ); + + if ( YY_CURRENT_BUFFER_LVALUE->yy_fill_buffer == 0 ) + { /* Don't try to fill the buffer, so this is an EOF. */ + if ( (yy_c_buf_p) - (yytext_ptr) - YY_MORE_ADJ == 1 ) + { + /* We matched a single character, the EOB, so + * treat this as a final EOF. + */ + return EOB_ACT_END_OF_FILE; + } + + else + { + /* We matched some text prior to the EOB, first + * process it. + */ + return EOB_ACT_LAST_MATCH; + } + } + + /* Try to read more data. */ + + /* First move last chars to start of buffer. */ + number_to_move = (int) ((yy_c_buf_p) - (yytext_ptr)) - 1; + + for ( i = 0; i < number_to_move; ++i ) + *(dest++) = *(source++); + + if ( YY_CURRENT_BUFFER_LVALUE->yy_buffer_status == YY_BUFFER_EOF_PENDING ) + /* don't do the read, it's not guaranteed to return an EOF, + * just force an EOF + */ + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars) = 0; + + else + { + yy_size_t num_to_read = + YY_CURRENT_BUFFER_LVALUE->yy_buf_size - number_to_move - 1; + + while ( num_to_read <= 0 ) + { /* Not enough room in the buffer - grow it. */ + + /* just a shorter name for the current buffer */ + YY_BUFFER_STATE b = YY_CURRENT_BUFFER_LVALUE; + + int yy_c_buf_p_offset = + (int) ((yy_c_buf_p) - b->yy_ch_buf); + + if ( b->yy_is_our_buffer ) + { + yy_size_t new_size = b->yy_buf_size * 2; + + if ( new_size <= 0 ) + b->yy_buf_size += b->yy_buf_size / 8; + else + b->yy_buf_size *= 2; + + b->yy_ch_buf = (char *) + /* Include room in for 2 EOB chars. */ + yyrealloc((void *) b->yy_ch_buf,b->yy_buf_size + 2 ); + } + else + /* Can't grow it, we don't own it. */ + b->yy_ch_buf = 0; + + if ( ! b->yy_ch_buf ) + YY_FATAL_ERROR( + "fatal error - scanner input buffer overflow" ); + + (yy_c_buf_p) = &b->yy_ch_buf[yy_c_buf_p_offset]; + + num_to_read = YY_CURRENT_BUFFER_LVALUE->yy_buf_size - + number_to_move - 1; + + } + + if ( num_to_read > YY_READ_BUF_SIZE ) + num_to_read = YY_READ_BUF_SIZE; + + /* Read in more data. */ + YY_INPUT( (&YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]), + (yy_n_chars), num_to_read ); + + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); + } + + if ( (yy_n_chars) == 0 ) + { + if ( number_to_move == YY_MORE_ADJ ) + { + ret_val = EOB_ACT_END_OF_FILE; + yyrestart(yyin ); + } + + else + { + ret_val = EOB_ACT_LAST_MATCH; + YY_CURRENT_BUFFER_LVALUE->yy_buffer_status = + YY_BUFFER_EOF_PENDING; + } + } + + else + ret_val = EOB_ACT_CONTINUE_SCAN; + + if ((yy_size_t) ((yy_n_chars) + number_to_move) > YY_CURRENT_BUFFER_LVALUE->yy_buf_size) { + /* Extend the array by 50%, plus the number we really need. */ + yy_size_t new_size = (yy_n_chars) + number_to_move + ((yy_n_chars) >> 1); + YY_CURRENT_BUFFER_LVALUE->yy_ch_buf = (char *) yyrealloc((void *) YY_CURRENT_BUFFER_LVALUE->yy_ch_buf,new_size ); + if ( ! YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) + YY_FATAL_ERROR( "out of dynamic memory in yy_get_next_buffer()" ); + } + + (yy_n_chars) += number_to_move; + YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] = YY_END_OF_BUFFER_CHAR; + YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars) + 1] = YY_END_OF_BUFFER_CHAR; + + (yytext_ptr) = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[0]; + + return ret_val; +} + +/* yy_get_previous_state - get the state just before the EOB char was reached */ + + static yy_state_type yy_get_previous_state (void) +{ + register yy_state_type yy_current_state; + register char *yy_cp; + + yy_current_state = (yy_start); + + for ( yy_cp = (yytext_ptr) + YY_MORE_ADJ; yy_cp < (yy_c_buf_p); ++yy_cp ) + { + register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1); + if ( yy_accept[yy_current_state] ) + { + (yy_last_accepting_state) = yy_current_state; + (yy_last_accepting_cpos) = yy_cp; + } + while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) + { + yy_current_state = (int) yy_def[yy_current_state]; + if ( yy_current_state >= 33 ) + yy_c = yy_meta[(unsigned int) yy_c]; + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; + } + + return yy_current_state; +} + +/* yy_try_NUL_trans - try to make a transition on the NUL character + * + * synopsis + * next_state = yy_try_NUL_trans( current_state ); + */ + static yy_state_type yy_try_NUL_trans (yy_state_type yy_current_state ) +{ + register int yy_is_jam; + register char *yy_cp = (yy_c_buf_p); + + register YY_CHAR yy_c = 1; + if ( yy_accept[yy_current_state] ) + { + (yy_last_accepting_state) = yy_current_state; + (yy_last_accepting_cpos) = yy_cp; + } + while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) + { + yy_current_state = (int) yy_def[yy_current_state]; + if ( yy_current_state >= 33 ) + yy_c = yy_meta[(unsigned int) yy_c]; + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; + yy_is_jam = (yy_current_state == 32); + + return yy_is_jam ? 0 : yy_current_state; +} + + static void yyunput (int c, register char * yy_bp ) +{ + register char *yy_cp; + + yy_cp = (yy_c_buf_p); + + /* undo effects of setting up yytext */ + *yy_cp = (yy_hold_char); + + if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) + { /* need to shift things up to make room */ + /* +2 for EOB chars. */ + register yy_size_t number_to_move = (yy_n_chars) + 2; + register char *dest = &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[ + YY_CURRENT_BUFFER_LVALUE->yy_buf_size + 2]; + register char *source = + &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[number_to_move]; + + while ( source > YY_CURRENT_BUFFER_LVALUE->yy_ch_buf ) + *--dest = *--source; + + yy_cp += (int) (dest - source); + yy_bp += (int) (dest - source); + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = + (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_buf_size; + + if ( yy_cp < YY_CURRENT_BUFFER_LVALUE->yy_ch_buf + 2 ) + YY_FATAL_ERROR( "flex scanner push-back overflow" ); + } + + *--yy_cp = (char) c; + + if ( c == '\n' ){ + --yylineno; + } + + (yytext_ptr) = yy_bp; + (yy_hold_char) = *yy_cp; + (yy_c_buf_p) = yy_cp; +} + +#ifndef YY_NO_INPUT +#ifdef __cplusplus + static int yyinput (void) +#else + static int input (void) +#endif + +{ + int c; + + *(yy_c_buf_p) = (yy_hold_char); + + if ( *(yy_c_buf_p) == YY_END_OF_BUFFER_CHAR ) + { + /* yy_c_buf_p now points to the character we want to return. + * If this occurs *before* the EOB characters, then it's a + * valid NUL; if not, then we've hit the end of the buffer. + */ + if ( (yy_c_buf_p) < &YY_CURRENT_BUFFER_LVALUE->yy_ch_buf[(yy_n_chars)] ) + /* This was really a NUL. */ + *(yy_c_buf_p) = '\0'; + + else + { /* need more input */ + yy_size_t offset = (yy_c_buf_p) - (yytext_ptr); + ++(yy_c_buf_p); + + switch ( yy_get_next_buffer( ) ) + { + case EOB_ACT_LAST_MATCH: + /* This happens because yy_g_n_b() + * sees that we've accumulated a + * token and flags that we need to + * try matching the token before + * proceeding. But for input(), + * there's no matching to consider. + * So convert the EOB_ACT_LAST_MATCH + * to EOB_ACT_END_OF_FILE. + */ + + /* Reset buffer status. */ + yyrestart(yyin ); + + /*FALLTHROUGH*/ + + case EOB_ACT_END_OF_FILE: + { + if ( yywrap( ) ) + return EOF; + + if ( ! (yy_did_buffer_switch_on_eof) ) + YY_NEW_FILE; +#ifdef __cplusplus + return yyinput(); +#else + return input(); +#endif + } + + case EOB_ACT_CONTINUE_SCAN: + (yy_c_buf_p) = (yytext_ptr) + offset; + break; + } + } + } + + c = *(unsigned char *) (yy_c_buf_p); /* cast for 8-bit char's */ + *(yy_c_buf_p) = '\0'; /* preserve yytext */ + (yy_hold_char) = *++(yy_c_buf_p); + + if ( c == '\n' ) + + yylineno++; +; + + return c; +} +#endif /* ifndef YY_NO_INPUT */ + +/** Immediately switch to a different input stream. + * @param input_file A readable stream. + * + * @note This function does not reset the start condition to @c INITIAL . + */ + void yyrestart (FILE * input_file ) +{ + + if ( ! YY_CURRENT_BUFFER ){ + yyensure_buffer_stack (); + YY_CURRENT_BUFFER_LVALUE = + yy_create_buffer(yyin,YY_BUF_SIZE ); + } + + yy_init_buffer(YY_CURRENT_BUFFER,input_file ); + yy_load_buffer_state( ); +} + +/** Switch to a different input buffer. + * @param new_buffer The new input buffer. + * + */ + void yy_switch_to_buffer (YY_BUFFER_STATE new_buffer ) +{ + + /* TODO. We should be able to replace this entire function body + * with + * yypop_buffer_state(); + * yypush_buffer_state(new_buffer); + */ + yyensure_buffer_stack (); + if ( YY_CURRENT_BUFFER == new_buffer ) + return; + + if ( YY_CURRENT_BUFFER ) + { + /* Flush out information for old buffer. */ + *(yy_c_buf_p) = (yy_hold_char); + YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); + } + + YY_CURRENT_BUFFER_LVALUE = new_buffer; + yy_load_buffer_state( ); + + /* We don't actually know whether we did this switch during + * EOF (yywrap()) processing, but the only time this flag + * is looked at is after yywrap() is called, so it's safe + * to go ahead and always set it. + */ + (yy_did_buffer_switch_on_eof) = 1; +} + +static void yy_load_buffer_state (void) +{ + (yy_n_chars) = YY_CURRENT_BUFFER_LVALUE->yy_n_chars; + (yytext_ptr) = (yy_c_buf_p) = YY_CURRENT_BUFFER_LVALUE->yy_buf_pos; + yyin = YY_CURRENT_BUFFER_LVALUE->yy_input_file; + (yy_hold_char) = *(yy_c_buf_p); +} + +/** Allocate and initialize an input buffer state. + * @param file A readable stream. + * @param size The character buffer size in bytes. When in doubt, use @c YY_BUF_SIZE. + * + * @return the allocated buffer state. + */ + YY_BUFFER_STATE yy_create_buffer (FILE * file, int size ) +{ + YY_BUFFER_STATE b; + + b = (YY_BUFFER_STATE) yyalloc(sizeof( struct yy_buffer_state ) ); + if ( ! b ) + YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); + + b->yy_buf_size = size; + + /* yy_ch_buf has to be 2 characters longer than the size given because + * we need to put in 2 end-of-buffer characters. + */ + b->yy_ch_buf = (char *) yyalloc(b->yy_buf_size + 2 ); + if ( ! b->yy_ch_buf ) + YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); + + b->yy_is_our_buffer = 1; + + yy_init_buffer(b,file ); + + return b; +} + +/** Destroy the buffer. + * @param b a buffer created with yy_create_buffer() + * + */ + void yy_delete_buffer (YY_BUFFER_STATE b ) +{ + + if ( ! b ) + return; + + if ( b == YY_CURRENT_BUFFER ) /* Not sure if we should pop here. */ + YY_CURRENT_BUFFER_LVALUE = (YY_BUFFER_STATE) 0; + + if ( b->yy_is_our_buffer ) + yyfree((void *) b->yy_ch_buf ); + + yyfree((void *) b ); +} + +/* Initializes or reinitializes a buffer. + * This function is sometimes called more than once on the same buffer, + * such as during a yyrestart() or at EOF. + */ + static void yy_init_buffer (YY_BUFFER_STATE b, FILE * file ) + +{ + int oerrno = errno; + + yy_flush_buffer(b ); + + b->yy_input_file = file; + b->yy_fill_buffer = 1; + + /* If b is the current buffer, then yy_init_buffer was _probably_ + * called from yyrestart() or through yy_get_next_buffer. + * In that case, we don't want to reset the lineno or column. + */ + if (b != YY_CURRENT_BUFFER){ + b->yy_bs_lineno = 1; + b->yy_bs_column = 0; + } + + b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0; + + errno = oerrno; +} + +/** Discard all buffered characters. On the next scan, YY_INPUT will be called. + * @param b the buffer state to be flushed, usually @c YY_CURRENT_BUFFER. + * + */ + void yy_flush_buffer (YY_BUFFER_STATE b ) +{ + if ( ! b ) + return; + + b->yy_n_chars = 0; + + /* We always need two end-of-buffer characters. The first causes + * a transition to the end-of-buffer state. The second causes + * a jam in that state. + */ + b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR; + b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; + + b->yy_buf_pos = &b->yy_ch_buf[0]; + + b->yy_at_bol = 1; + b->yy_buffer_status = YY_BUFFER_NEW; + + if ( b == YY_CURRENT_BUFFER ) + yy_load_buffer_state( ); +} + +/** Pushes the new state onto the stack. The new state becomes + * the current state. This function will allocate the stack + * if necessary. + * @param new_buffer The new state. + * + */ +void yypush_buffer_state (YY_BUFFER_STATE new_buffer ) +{ + if (new_buffer == NULL) + return; + + yyensure_buffer_stack(); + + /* This block is copied from yy_switch_to_buffer. */ + if ( YY_CURRENT_BUFFER ) + { + /* Flush out information for old buffer. */ + *(yy_c_buf_p) = (yy_hold_char); + YY_CURRENT_BUFFER_LVALUE->yy_buf_pos = (yy_c_buf_p); + YY_CURRENT_BUFFER_LVALUE->yy_n_chars = (yy_n_chars); + } + + /* Only push if top exists. Otherwise, replace top. */ + if (YY_CURRENT_BUFFER) + (yy_buffer_stack_top)++; + YY_CURRENT_BUFFER_LVALUE = new_buffer; + + /* copied from yy_switch_to_buffer. */ + yy_load_buffer_state( ); + (yy_did_buffer_switch_on_eof) = 1; +} + +/** Removes and deletes the top of the stack, if present. + * The next element becomes the new top. + * + */ +void yypop_buffer_state (void) +{ + if (!YY_CURRENT_BUFFER) + return; + + yy_delete_buffer(YY_CURRENT_BUFFER ); + YY_CURRENT_BUFFER_LVALUE = NULL; + if ((yy_buffer_stack_top) > 0) + --(yy_buffer_stack_top); + + if (YY_CURRENT_BUFFER) { + yy_load_buffer_state( ); + (yy_did_buffer_switch_on_eof) = 1; + } +} + +/* Allocates the stack if it does not exist. + * Guarantees space for at least one push. + */ +static void yyensure_buffer_stack (void) +{ + yy_size_t num_to_alloc; + + if (!(yy_buffer_stack)) { + + /* First allocation is just for 2 elements, since we don't know if this + * scanner will even need a stack. We use 2 instead of 1 to avoid an + * immediate realloc on the next call. + */ + num_to_alloc = 1; + (yy_buffer_stack) = (struct yy_buffer_state**)yyalloc + (num_to_alloc * sizeof(struct yy_buffer_state*) + ); + if ( ! (yy_buffer_stack) ) + YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" ); + + memset((yy_buffer_stack), 0, num_to_alloc * sizeof(struct yy_buffer_state*)); + + (yy_buffer_stack_max) = num_to_alloc; + (yy_buffer_stack_top) = 0; + return; + } + + if ((yy_buffer_stack_top) >= ((yy_buffer_stack_max)) - 1){ + + /* Increase the buffer to prepare for a possible push. */ + int grow_size = 8 /* arbitrary grow size */; + + num_to_alloc = (yy_buffer_stack_max) + grow_size; + (yy_buffer_stack) = (struct yy_buffer_state**)yyrealloc + ((yy_buffer_stack), + num_to_alloc * sizeof(struct yy_buffer_state*) + ); + if ( ! (yy_buffer_stack) ) + YY_FATAL_ERROR( "out of dynamic memory in yyensure_buffer_stack()" ); + + /* zero only the new slots.*/ + memset((yy_buffer_stack) + (yy_buffer_stack_max), 0, grow_size * sizeof(struct yy_buffer_state*)); + (yy_buffer_stack_max) = num_to_alloc; + } +} + +/** Setup the input buffer state to scan directly from a user-specified character buffer. + * @param base the character buffer + * @param size the size in bytes of the character buffer + * + * @return the newly allocated buffer state object. + */ +YY_BUFFER_STATE yy_scan_buffer (char * base, yy_size_t size ) +{ + YY_BUFFER_STATE b; + + if ( size < 2 || + base[size-2] != YY_END_OF_BUFFER_CHAR || + base[size-1] != YY_END_OF_BUFFER_CHAR ) + /* They forgot to leave room for the EOB's. */ + return 0; + + b = (YY_BUFFER_STATE) yyalloc(sizeof( struct yy_buffer_state ) ); + if ( ! b ) + YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" ); + + b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */ + b->yy_buf_pos = b->yy_ch_buf = base; + b->yy_is_our_buffer = 0; + b->yy_input_file = 0; + b->yy_n_chars = b->yy_buf_size; + b->yy_is_interactive = 0; + b->yy_at_bol = 1; + b->yy_fill_buffer = 0; + b->yy_buffer_status = YY_BUFFER_NEW; + + yy_switch_to_buffer(b ); + + return b; +} + +/** Setup the input buffer state to scan a string. The next call to yylex() will + * scan from a @e copy of @a str. + * @param yystr a NUL-terminated string to scan + * + * @return the newly allocated buffer state object. + * @note If you want to scan bytes that may contain NUL values, then use + * yy_scan_bytes() instead. + */ +YY_BUFFER_STATE yy_scan_string (yyconst char * yystr ) +{ + + return yy_scan_bytes(yystr,strlen(yystr) ); +} + +/** Setup the input buffer state to scan the given bytes. The next call to yylex() will + * scan from a @e copy of @a bytes. + * @param yybytes the byte buffer to scan + * @param _yybytes_len the number of bytes in the buffer pointed to by @a bytes. + * + * @return the newly allocated buffer state object. + */ +YY_BUFFER_STATE yy_scan_bytes (yyconst char * yybytes, yy_size_t _yybytes_len ) +{ + YY_BUFFER_STATE b; + char *buf; + yy_size_t n; + yy_size_t i; + + /* Get memory for full buffer, including space for trailing EOB's. */ + n = _yybytes_len + 2; + buf = (char *) yyalloc(n ); + if ( ! buf ) + YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" ); + + for ( i = 0; i < _yybytes_len; ++i ) + buf[i] = yybytes[i]; + + buf[_yybytes_len] = buf[_yybytes_len+1] = YY_END_OF_BUFFER_CHAR; + + b = yy_scan_buffer(buf,n ); + if ( ! b ) + YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" ); + + /* It's okay to grow etc. this buffer, and we should throw it + * away when we're done. + */ + b->yy_is_our_buffer = 1; + + return b; +} + +#ifndef YY_EXIT_FAILURE +#define YY_EXIT_FAILURE 2 +#endif + +static void yy_fatal_error (yyconst char* msg ) +{ + (void) fprintf( stderr, "%s\n", msg ); + exit( YY_EXIT_FAILURE ); +} + +/* Redefine yyless() so it works in section 3 code. */ + +#undef yyless +#define yyless(n) \ + do \ + { \ + /* Undo effects of setting up yytext. */ \ + int yyless_macro_arg = (n); \ + YY_LESS_LINENO(yyless_macro_arg);\ + yytext[yyleng] = (yy_hold_char); \ + (yy_c_buf_p) = yytext + yyless_macro_arg; \ + (yy_hold_char) = *(yy_c_buf_p); \ + *(yy_c_buf_p) = '\0'; \ + yyleng = yyless_macro_arg; \ + } \ + while ( 0 ) + +/* Accessor methods (get/set functions) to struct members. */ + +/** Get the current line number. + * + */ +int yyget_lineno (void) +{ + + return yylineno; +} + +/** Get the input stream. + * + */ +FILE *yyget_in (void) +{ + return yyin; +} + +/** Get the output stream. + * + */ +FILE *yyget_out (void) +{ + return yyout; +} + +/** Get the length of the current token. + * + */ +yy_size_t yyget_leng (void) +{ + return yyleng; +} + +/** Get the current token. + * + */ + +char *yyget_text (void) +{ + return yytext; +} + +/** Set the current line number. + * @param line_number + * + */ +void yyset_lineno (int line_number ) +{ + + yylineno = line_number; +} + +/** Set the input stream. This does not discard the current + * input buffer. + * @param in_str A readable stream. + * + * @see yy_switch_to_buffer + */ +void yyset_in (FILE * in_str ) +{ + yyin = in_str ; +} + +void yyset_out (FILE * out_str ) +{ + yyout = out_str ; +} + +int yyget_debug (void) +{ + return yy_flex_debug; +} + +void yyset_debug (int bdebug ) +{ + yy_flex_debug = bdebug ; +} + +static int yy_init_globals (void) +{ + /* Initialization is the same as for the non-reentrant scanner. + * This function is called from yylex_destroy(), so don't allocate here. + */ + + /* We do not touch yylineno unless the option is enabled. */ + yylineno = 1; + + (yy_buffer_stack) = 0; + (yy_buffer_stack_top) = 0; + (yy_buffer_stack_max) = 0; + (yy_c_buf_p) = (char *) 0; + (yy_init) = 0; + (yy_start) = 0; + +/* Defined in main.c */ +#ifdef YY_STDINIT + yyin = stdin; + yyout = stdout; +#else + yyin = (FILE *) 0; + yyout = (FILE *) 0; +#endif + + /* For future reference: Set errno on error, since we are called by + * yylex_init() + */ + return 0; +} + +/* yylex_destroy is for both reentrant and non-reentrant scanners. */ +int yylex_destroy (void) +{ + + /* Pop the buffer stack, destroying each element. */ + while(YY_CURRENT_BUFFER){ + yy_delete_buffer(YY_CURRENT_BUFFER ); + YY_CURRENT_BUFFER_LVALUE = NULL; + yypop_buffer_state(); + } + + /* Destroy the stack itself. */ + yyfree((yy_buffer_stack) ); + (yy_buffer_stack) = NULL; + + /* Reset the globals. This is important in a non-reentrant scanner so the next time + * yylex() is called, initialization will occur. */ + yy_init_globals( ); + + return 0; +} + +/* + * Internal utility routines. + */ + +#ifndef yytext_ptr +static void yy_flex_strncpy (char* s1, yyconst char * s2, int n ) +{ + register int i; + for ( i = 0; i < n; ++i ) + s1[i] = s2[i]; +} +#endif + +#ifdef YY_NEED_STRLEN +static int yy_flex_strlen (yyconst char * s ) +{ + register int n; + for ( n = 0; s[n]; ++n ) + ; + + return n; +} +#endif + +void *yyalloc (yy_size_t size ) +{ + return (void *) malloc( size ); +} + +void *yyrealloc (void * ptr, yy_size_t size ) +{ + /* The cast to (char *) in the following accommodates both + * implementations that use char* generic pointers, and those + * that use void* generic pointers. It works with the latter + * because both ANSI C and C++ allow castless assignment from + * any pointer type to void*, and deal with argument conversions + * as though doing an assignment. + */ + return (void *) realloc( (char *) ptr, size ); +} + +void yyfree (void * ptr ) +{ + free( (char *) ptr ); /* see yyrealloc() for (char *) cast */ +} + +#define YYTABLES_NAME "yytables" + +#line 126 "lex.l" + + +#ifndef yywrap +int yywrap(void) { return(1);} +#endif + +#ifndef FLEX_SCANNER +#undef unput +#undef input +#undef output +#undef feof +#define unput(c) twmUnput(c) +#define input() (*twmInputFunc)() +#define output(c) TwmOutput(c) +#define feof() (1) +#endif + + Index: external/mit/ctwm/dist/lex.c_VMS =================================================================== RCS file: external/mit/ctwm/dist/lex.c_VMS diff -N external/mit/ctwm/dist/lex.c_VMS --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/lex.c_VMS 3 Sep 2015 12:19:56 -0000 @@ -0,0 +1,1382 @@ +#ifdef VMS +# include +#else +# include "stdio.h" +#endif +#ifdef __cplusplus + extern "C" { + extern int yyreject(); + extern int yywrap(); + extern int yylook(); + extern void main(); + extern int yyback(int *, int); + extern int yyinput(); + extern void yyoutput(int); + extern void yyunput(int); + extern int yylex(); + } +#endif /* __cplusplus */ +# define U(x) x +# define NLSTATE yyprevious=YYNEWLINE +# define BEGIN yybgin = yysvec + 1 + +# define INITIAL 0 +# define YYLERR yysvec +# define YYSTATE (yyestate-yysvec-1) +# define YYOPTIM 1 +# define YYLMAX 200 +# define output(c) putc(c,yyout) +# define input() (((yytchar=yysptr>yysbuf?U(*--yysptr):getc(yyin))==10?(yylineno++,yytchar):yytchar)==EOF?0:yytchar) +# define unput(c) {yytchar= (c);if(yytchar=='\n')yylineno--;*yysptr++=yytchar;} +# define yymore() (yymorfg=1) +# define ECHO fprintf(yyout, "%s",yytext) +# define REJECT { nstr = yyreject(); goto yyfussy;} +int yyleng; +int yylenguc; +extern unsigned char yytextarr[]; +extern unsigned char yytext[]; +int yyposix_point=0; +int yynls16=0; +int yynls_wchar=0; +char *yylocale = "/\001:C;\002:C;\003:C;\004:C;:C;:C;:C;/"; +int yymorfg; +extern unsigned char *yysptr, yysbuf[]; +int yytchar; +#ifdef VMS +FILE *yyin, *yyout; +int vms_did_init = 0; + +void vms_do_init() { + if(!vms_did_init) { + vms_did_init = 1; + yyin = stdin; + yyout = stdout; + } +} +#else +FILE *yyin = {stdin}, *yyout = {stdout}; +#endif +extern int yylineno; +struct yysvf { + int yystoff; + struct yysvf *yyother; + int *yystops;}; +struct yysvf *yyestate; +extern struct yysvf yysvec[], *yybgin; +/*****************************************************************************/ +/** Copyright 1988 by Evans & Sutherland Computer Corporation, **/ +/** Salt Lake City, Utah **/ +/** Portions Copyright 1989 by the Massachusetts Institute of Technology **/ +/** Cambridge, Massachusetts **/ +/** **/ +/** All Rights Reserved **/ +/** **/ +/** Permission to use, copy, modify, and distribute this software and **/ +/** its documentation for any purpose and without fee is hereby **/ +/** granted, provided that the above copyright notice appear in all **/ +/** copies and that both that copyright notice and this permis- **/ +/** sion notice appear in supporting documentation, and that the **/ +/** names of Evans & Sutherland and M.I.T. not be used in advertising **/ +/** in publicity pertaining to distribution of the software without **/ +/** specific, written prior permission. **/ +/** **/ +/** EVANS & SUTHERLAND AND M.I.T. DISCLAIM ALL WARRANTIES WITH REGARD **/ +/** TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANT- **/ +/** ABILITY AND FITNESS, IN NO EVENT SHALL EVANS & SUTHERLAND OR **/ +/** M.I.T. BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAM- **/ +/** AGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA **/ +/** OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER **/ +/** TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE **/ +/** OR PERFORMANCE OF THIS SOFTWARE. **/ +/*****************************************************************************/ + +/*********************************************************************** + * + * $XConsortium: lex.l,v 1.62 89/12/10 17:46:33 jim Exp $ + * + * .twmrc lex file + * + * 12-Nov-87 Thomas E. LaStrange File created + * + ***********************************************************************/ + +/* #include */ /* lex already includes stdio.h */ +#include "parse.h" +extern char *ProgramName; + +extern int ParseError; +#ifdef FLEX_SCANNER + int yylineno; +# undef YY_INPUT +# define YY_INPUT(buf,result,max_size) {buf[0]=twmInputFunc();result=(buf[0]>0);} +#endif + +# define YYNEWLINE 10 +yylex(){ + int nstr; extern int yyprevious; + while((nstr = yylook()) >= 0) +yyfussy: switch(nstr){ +case 0: + if(yywrap()) return(0); break; +case 1: + { return (LB); } +break; +case 2: + { return (RB); } +break; +case 3: + { return (LP); } +break; +case 4: + { return (RP); } +break; +case 5: + { return (EQUALS); } +break; +case 6: + { return (COLON); } +break; +case 7: + { return PLUS; } +break; +case 8: + { return MINUS; } +break; +case 9: + { return OR; } +break; +case 10: + { int token = parse_keyword (yytext, + &yylval.num); + if (token == ERRORTOKEN) { + twmrc_error_prefix(); + fprintf (stderr, + "ignoring unknown keyword: %s\n", + yytext); + ParseError = 1; + } else + return token; + } +break; +case 11: + { yylval.num = F_EXEC; return FSKEYWORD; } +break; +case 12: + { yylval.num = F_CUT; return FSKEYWORD; } +break; +case 13: + { yylval.ptr = (char *)yytext; return STRING; } +break; +case 14: + { (void)sscanf((char *)yytext, "%d", &yylval.num); + return (NUMBER); + } +break; +case 15: + {;} +break; +case 16: + {;} +break; +case 17: + { + twmrc_error_prefix(); + fprintf (stderr, + "ignoring character \"%s\"\n", + yytext); + ParseError = 1; + } +break; +case -1: +break; +default: + fprintf(yyout,"bad switch yylook %d",nstr); +} return(0); } +/* end of yylex */ + +static void __yy__unused() { main(); } +#ifndef FLEX_SCANNER +yywrap() { return(1);} + +#undef unput +#undef input +#undef output +#undef feof +#define unput(c) twmUnput(c) +#define input() (*twmInputFunc)() +#define output(c) TwmOutput(c) +#define feof() (1) +#endif +int yyvstop[] = { +0, + +17, +0, + +16, +17, +0, + +16, +0, + +11, +17, +0, + +17, +0, + +17, +0, + +3, +17, +0, + +4, +17, +0, + +7, +17, +0, + +8, +17, +0, + +10, +17, +0, + +14, +17, +0, + +6, +17, +0, + +5, +17, +0, + +12, +17, +0, + +1, +17, +0, + +9, +17, +0, + +2, +17, +0, + +13, +0, + +15, +0, + +10, +0, + +14, +0, + +13, +0, +0}; +# define YYTYPE unsigned char +struct yywork { YYTYPE verify, advance; } yycrank[] = { +0,0, 0,0, 1,3, 0,0, +0,0, 0,0, 0,0, 7,21, +0,0, 0,0, 1,4, 1,5, +0,0, 0,0, 0,0, 7,21, +7,21, 0,0, 0,0, 0,0, +0,0, 0,0, 0,0, 0,0, +0,0, 0,0, 0,0, 0,0, +0,0, 0,0, 8,24, 0,0, +0,0, 0,0, 1,6, 1,7, +1,8, 0,0, 8,24, 8,25, +7,22, 1,9, 1,10, 2,6, +1,11, 2,8, 1,12, 1,13, +23,28, 1,14, 2,9, 2,10, +7,21, 2,11, 7,21, 2,12, +0,0, 0,0, 0,0, 1,15, +0,0, 0,0, 1,16, 8,24, +0,0, 0,0, 0,0, 0,0, +2,15, 0,0, 0,0, 2,16, +0,0, 0,0, 0,0, 8,24, +0,0, 8,24, 14,27, 14,27, +14,27, 14,27, 14,27, 14,27, +14,27, 14,27, 14,27, 14,27, +0,0, 0,0, 0,0, 0,0, +0,0, 21,23, 28,23, 1,17, +0,0, 0,0, 7,23, 0,0, +0,0, 0,0, 0,0, 0,0, +2,17, 0,0, 23,23, 0,0, +0,0, 0,0, 0,0, 0,0, +0,0, 0,0, 0,0, 0,0, +0,0, 13,26, 0,0, 0,0, +0,0, 0,0, 0,0, 0,0, +1,18, 1,19, 1,20, 0,0, +0,0, 0,0, 0,0, 0,0, +0,0, 2,18, 2,19, 2,20, +13,26, 13,26, 13,26, 13,26, +13,26, 13,26, 13,26, 13,26, +13,26, 13,26, 13,26, 13,26, +13,26, 13,26, 13,26, 13,26, +13,26, 13,26, 13,26, 13,26, +13,26, 13,26, 13,26, 13,26, +13,26, 13,26, 0,0, 0,0, +0,0, 0,0, 0,0, 0,0, +13,26, 13,26, 13,26, 13,26, +13,26, 13,26, 13,26, 13,26, +13,26, 13,26, 13,26, 13,26, +13,26, 13,26, 13,26, 13,26, +13,26, 13,26, 13,26, 13,26, +13,26, 13,26, 13,26, 13,26, +13,26, 13,26, 0,0, 0,0, +0,0}; +struct yysvf yysvec[] = { +0, 0, 0, +-1, 0, 0, +-10, yysvec+1, 0, +0, 0, yyvstop+1, +0, 0, yyvstop+3, +0, 0, yyvstop+6, +0, 0, yyvstop+8, +-6, 0, yyvstop+11, +-29, 0, yyvstop+13, +0, 0, yyvstop+15, +0, 0, yyvstop+18, +0, 0, yyvstop+21, +0, 0, yyvstop+24, +71, 0, yyvstop+27, +30, 0, yyvstop+30, +0, 0, yyvstop+33, +0, 0, yyvstop+36, +0, 0, yyvstop+39, +0, 0, yyvstop+42, +0, 0, yyvstop+45, +0, 0, yyvstop+48, +-1, yysvec+7, 0, +0, 0, yyvstop+51, +-14, yysvec+7, 0, +0, yysvec+8, 0, +0, 0, yyvstop+53, +0, yysvec+13, yyvstop+55, +0, yysvec+14, yyvstop+57, +-2, yysvec+7, yyvstop+59, +0, 0, 0}; +struct yywork *yytop = yycrank+193; +struct yysvf *yybgin = yysvec+1; +unsigned char yymatch[] = { +00 ,01 ,01 ,01 ,01 ,01 ,01 ,01 , +01 ,011 ,012 ,01 ,01 ,01 ,01 ,01 , +01 ,01 ,01 ,01 ,01 ,01 ,01 ,01 , +01 ,01 ,01 ,01 ,01 ,01 ,01 ,01 , +011 ,01 ,'"' ,01 ,01 ,01 ,01 ,01 , +01 ,01 ,01 ,01 ,01 ,01 ,'.' ,01 , +'0' ,'0' ,'0' ,'0' ,'0' ,'0' ,'0' ,'0' , +'0' ,'0' ,01 ,01 ,01 ,01 ,01 ,01 , +01 ,'.' ,'.' ,'.' ,'.' ,'.' ,'.' ,'.' , +'.' ,'.' ,'.' ,'.' ,'.' ,'.' ,'.' ,'.' , +'.' ,'.' ,'.' ,'.' ,'.' ,'.' ,'.' ,'.' , +'.' ,'.' ,'.' ,01 ,01 ,01 ,01 ,01 , +01 ,'.' ,'.' ,'.' ,'.' ,'.' ,'.' ,'.' , +'.' ,'.' ,'.' ,'.' ,'.' ,'.' ,'.' ,'.' , +'.' ,'.' ,'.' ,'.' ,'.' ,'.' ,'.' ,'.' , +'.' ,'.' ,'.' ,01 ,01 ,01 ,01 ,01 , +01 ,01 ,01 ,01 ,01 ,01 ,01 ,01 , +01 ,01 ,01 ,01 ,01 ,01 ,01 ,01 , +01 ,01 ,01 ,01 ,01 ,01 ,01 ,01 , +01 ,01 ,01 ,01 ,01 ,01 ,01 ,01 , +01 ,01 ,01 ,01 ,01 ,01 ,01 ,01 , +01 ,01 ,01 ,01 ,01 ,01 ,01 ,01 , +01 ,01 ,01 ,01 ,01 ,01 ,01 ,01 , +01 ,01 ,01 ,01 ,01 ,01 ,01 ,01 , +01 ,01 ,01 ,01 ,01 ,01 ,01 ,01 , +01 ,01 ,01 ,01 ,01 ,01 ,01 ,01 , +01 ,01 ,01 ,01 ,01 ,01 ,01 ,01 , +01 ,01 ,01 ,01 ,01 ,01 ,01 ,01 , +01 ,01 ,01 ,01 ,01 ,01 ,01 ,01 , +01 ,01 ,01 ,01 ,01 ,01 ,01 ,01 , +01 ,01 ,01 ,01 ,01 ,01 ,01 ,01 , +01 ,01 ,01 ,01 ,01 ,01 ,01 ,01 , +0}; +unsigned char yyextra[] = { +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0}; +/* @(#) $Revision: 1.2 $ */ +int yylineno =1; +# define YYU(x) x +# define NLSTATE yyprevious=YYNEWLINE + +#ifdef YYNLS16_WCHAR +unsigned char yytextuc[YYLMAX * sizeof(wchar_t)]; +# ifdef YY_PCT_POINT /* for %pointer */ +wchar_t yytextarr[YYLMAX]; +wchar_t *yytext; +# else /* %array */ +wchar_t yytextarr[1]; +wchar_t yytext[YYLMAX]; +# endif +#else +unsigned char yytextuc; +# ifdef YY_PCT_POINT /* for %pointer */ +unsigned char yytextarr[YYLMAX]; +unsigned char *yytext; +# else /* %array */ +unsigned char yytextarr[1]; +unsigned char yytext[YYLMAX]; +# endif +#endif + +struct yysvf *yylstate [YYLMAX], **yylsp, **yyolsp; +unsigned char yysbuf[YYLMAX]; +unsigned char *yysptr = yysbuf; +int *yyfnd; +extern struct yysvf *yyestate; +int yyprevious = YYNEWLINE; +yylook(){ + register struct yysvf *yystate, **lsp; + register struct yywork *yyt; + struct yysvf *yyz; + int yych, yyfirst; + struct yywork *yyr; +# ifdef LEXDEBUG + int debug; +# endif +/* char *yylastch; + * ***** nls8 ***** */ + unsigned char *yylastch, sec; + /* start off machines */ +# ifdef LEXDEBUG + debug = 0; +# endif + yyfirst=1; + if (!yymorfg) +#ifdef YYNLS16_WCHAR + yylastch = yytextuc; +#else + yylastch = yytext; +#endif + else { + yymorfg=0; +#ifdef YYNLS16_WCHAR + yylastch = yytextuc+yylenguc; +#else + yylastch = yytext+yyleng; +#endif + } + for(;;){ + lsp = yylstate; + yyestate = yystate = yybgin; + if (yyprevious==YYNEWLINE) yystate++; + for (;;){ +# ifdef LEXDEBUG + if(debug)fprintf(yyout,"state %d\n",yystate-yysvec-1); +# endif + yyt = &yycrank[yystate->yystoff]; + if(yyt == yycrank && !yyfirst){ /* may not be any transitions */ + yyz = yystate->yyother; + if(yyz == 0)break; + if(yyz->yystoff == 0)break; + } + *yylastch++ = yych = input(); + yyfirst=0; + tryagain: +# ifdef LEXDEBUG + if(debug){ + fprintf(yyout,"char "); + allprint(yych); + putchar('\n'); + } +# endif + yyr = yyt; + if ( (int)yyt > (int)yycrank){ + yyt = yyr + yych; + if (yyt <= yytop && yyt->verify+yysvec == yystate){ + if(yyt->advance+yysvec == YYLERR) /* error transitions */ + {unput(*--yylastch);break;} + *lsp++ = yystate = yyt->advance+yysvec; + goto contin; + } + } +# ifdef YYOPTIM + else if((int)yyt < (int)yycrank) { /* r < yycrank */ + yyt = yyr = yycrank+(yycrank-yyt); +# ifdef LEXDEBUG + if(debug)fprintf(yyout,"compressed state\n"); +# endif + yyt = yyt + yych; + if(yyt <= yytop && yyt->verify+yysvec == yystate){ + if(yyt->advance+yysvec == YYLERR) /* error transitions */ + {unput(*--yylastch);break;} + *lsp++ = yystate = yyt->advance+yysvec; + goto contin; + } + yyt = yyr + YYU(yymatch[yych]); +# ifdef LEXDEBUG + if(debug){ + fprintf(yyout,"try fall back character "); + allprint(YYU(yymatch[yych])); + putchar('\n'); + } +# endif + if(yyt <= yytop && yyt->verify+yysvec == yystate){ + if(yyt->advance+yysvec == YYLERR) /* error transition */ + {unput(*--yylastch);break;} + *lsp++ = yystate = yyt->advance+yysvec; + goto contin; + } + } + if ((yystate = yystate->yyother) && (yyt = &yycrank[yystate->yystoff]) != yycrank){ +# ifdef LEXDEBUG + if(debug)fprintf(yyout,"fall back to state %d\n",yystate-yysvec-1); +# endif + goto tryagain; + } +# endif + else + {unput(*--yylastch);break;} + contin: +# ifdef LEXDEBUG + if(debug){ + fprintf(yyout,"state %d char ",yystate-yysvec-1); + allprint(yych); + putchar('\n'); + } +# endif + ; + } +# ifdef LEXDEBUG + if(debug){ + fprintf(yyout,"stopped at %d with ",*(lsp-1)-yysvec-1); + allprint(yych); + putchar('\n'); + } +# endif + while (lsp-- > yylstate){ + *yylastch-- = 0; + if (*lsp != 0 && (yyfnd= (*lsp)->yystops) && *yyfnd > 0){ + yyolsp = lsp; + if(yyextra[*yyfnd]){ /* must backup */ + while(yyback((*lsp)->yystops,-*yyfnd) != 1 && lsp > yylstate){ + lsp--; + unput(*yylastch--); + } + } + yyprevious = YYU(*yylastch); + yylsp = lsp; +#ifdef YYNLS16_WCHAR + yylenguc = yylastch-yytextuc+1; + yytextuc[yylenguc] = 0; +#else + yyleng = yylastch-yytext+1; + yytext[yyleng] = 0; +#endif +# ifdef LEXDEBUG + if(debug){ + fprintf(yyout,"\nmatch "); +#ifdef YYNLS16_WCHAR + sprint(yytextuc); +#else + sprint(yytext); +#endif + fprintf(yyout," action %d\n",*yyfnd); + } +# endif + return(*yyfnd++); + } + unput(*yylastch); + } +#ifdef YYNLS16_WCHAR + if (yytextuc[0] == 0 /* && feof(yyin) */) +#else + if (yytext[0] == 0 /* && feof(yyin) */) +#endif + { + yysptr=yysbuf; + return(0); + } +#ifdef YYNLS16_WCHAR + yyprevious = yytextuc[0] = input(); +#else + yyprevious = yytext[0] = input(); +#endif + if (yyprevious>0) { + output(yyprevious); +#ifdef YYNLS16 + if (yynls16) +#ifdef YYNLS16_WCHAR + if (FIRSTof2(yytextuc[0])) +#else + if (FIRSTof2(yytext[0])) +#endif + if (SECof2(sec = input())) +#ifdef YYNLS16_WCHAR + output(yyprevious=yytextuc[0]=sec); +#else + output(yyprevious=yytext[0]=sec); +#endif + else + unput(sec); +#endif + } +#ifdef YYNLS16_WCHAR + yylastch=yytextuc; +#else + yylastch=yytext; +#endif +# ifdef LEXDEBUG + if(debug)putchar('\n'); +# endif + } + } + +# ifdef __cplusplus +yyback(int *p, int m) +# else +yyback(p, m) + int *p; +# endif +{ +if (p==0) return(0); +while (*p) + { + if (*p++ == m) + return(1); + } +return(0); +} + /* the following are only used in the lex library */ +yyinput(){ + return(input()); + + } + +#ifdef __cplusplus +void yyoutput(int c) +#else +yyoutput(c) + int c; +# endif +{ + output(c); +} + +#ifdef __cplusplus +void yyunput(int c) +#else +yyunput(c) + int c; +#endif +{ + unput(c); +} +# include "stdio.h" +#ifdef __cplusplus + extern "C" { + extern int yyreject(); + extern int yywrap(); + extern int yylook(); + extern int main(); + extern int yyback(int *, int); + extern int yyinput(); + extern void yyoutput(int); + extern void yyunput(int); + extern int yylex(); + } +#endif /* __cplusplus */ +# define U(x) x +# define NLSTATE yyprevious=YYNEWLINE +# define BEGIN yybgin = yysvec + 1 + +# define INITIAL 0 +# define YYLERR yysvec +# define YYSTATE (yyestate-yysvec-1) +# define YYOPTIM 1 +# define YYLMAX 200 +# define output(c) putc(c,yyout) +# define input() (((yytchar=yysptr>yysbuf?U(*--yysptr):getc(yyin))==10?(yylineno++,yytchar):yytchar)==EOF?0:yytchar) +# define unput(c) {yytchar= (c);if(yytchar=='\n')yylineno--;*yysptr++=yytchar;} +# define yymore() (yymorfg=1) +# define ECHO fprintf(yyout, "%s",yytext) +# define REJECT { nstr = yyreject(); goto yyfussy;} +int yyleng; +int yylenguc; +extern unsigned char yytextarr[]; +# ifdef YYCHAR_ARRAY +extern char yytext[]; +# else +extern unsigned char yytext[]; +# endif +int yyposix_point=0; +int yynls16=0; +int yynls_wchar=0; +char *yylocale = "/\001:C;\002:C;\003:C;\004:C;:C;:C;:C;/"; +int yymorfg; +extern unsigned char *yysptr, yysbuf[]; +int yytchar; +FILE *yyin = {stdin}, *yyout = {stdout}; +extern int yylineno; +struct yysvf { + int yystoff; + struct yysvf *yyother; + int *yystops;}; +struct yysvf *yyestate; +extern struct yysvf yysvec[], *yybgin; +/*****************************************************************************/ +/** Copyright 1988 by Evans & Sutherland Computer Corporation, **/ +/** Salt Lake City, Utah **/ +/** Portions Copyright 1989 by the Massachusetts Institute of Technology **/ +/** Cambridge, Massachusetts **/ +/** **/ +/** All Rights Reserved **/ +/** **/ +/** Permission to use, copy, modify, and distribute this software and **/ +/** its documentation for any purpose and without fee is hereby **/ +/** granted, provided that the above copyright notice appear in all **/ +/** copies and that both that copyright notice and this permis- **/ +/** sion notice appear in supporting documentation, and that the **/ +/** names of Evans & Sutherland and M.I.T. not be used in advertising **/ +/** in publicity pertaining to distribution of the software without **/ +/** specific, written prior permission. **/ +/** **/ +/** EVANS & SUTHERLAND AND M.I.T. DISCLAIM ALL WARRANTIES WITH REGARD **/ +/** TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANT- **/ +/** ABILITY AND FITNESS, IN NO EVENT SHALL EVANS & SUTHERLAND OR **/ +/** M.I.T. BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAM- **/ +/** AGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA **/ +/** OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER **/ +/** TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE **/ +/** OR PERFORMANCE OF THIS SOFTWARE. **/ +/*****************************************************************************/ + +/*********************************************************************** + * + * $XConsortium: lex.l,v 1.62 89/12/10 17:46:33 jim Exp $ + * + * .twmrc lex file + * + * 12-Nov-87 Thomas E. LaStrange File created + * + ***********************************************************************/ + +/* #include */ /* lex already includes stdio.h */ +#include "gram.h" +#include "parse.h" +extern char *ProgramName; + +extern int ParseError; +#ifdef FLEX_SCANNER + int yylineno; +# undef YY_INPUT +# define YY_INPUT(buf,result,max_size) {buf[0]=twmInputFunc();result=(buf[0]>0);} +#endif + +# define YYNEWLINE 10 +yylex(){ + int nstr; extern int yyprevious; + while((nstr = yylook()) >= 0) +yyfussy: switch(nstr){ +case 0: + if(yywrap()) return(0); break; +case 1: + { return (LB); } +break; +case 2: + { return (RB); } +break; +case 3: + { return (LP); } +break; +case 4: + { return (RP); } +break; +case 5: + { return (EQUALS); } +break; +case 6: + { return (COLON); } +break; +case 7: + { return PLUS; } +break; +case 8: + { return MINUS; } +break; +case 9: + { return OR; } +break; +case 10: + { int token = parse_keyword (yytext, + &yylval.num); + if (token == ERRORTOKEN) { + twmrc_error_prefix(); + fprintf (stderr, + "ignoring unknown keyword: %s\n", + yytext); + ParseError = 1; + } else + return token; + } +break; +case 11: + { yylval.num = F_EXEC; return FSKEYWORD; } +break; +case 12: + { yylval.num = F_CUT; return FSKEYWORD; } +break; +case 13: + { yylval.ptr = (char *)yytext; return STRING; } +break; +case 14: + { (void)sscanf((char *)yytext, "%d", &yylval.num); + return (NUMBER); + } +break; +case 15: + {;} +break; +case 16: + {;} +break; +case 17: + { + twmrc_error_prefix(); + fprintf (stderr, + "ignoring character \"%s\"\n", + yytext); + ParseError = 1; + } +break; +case -1: +break; +default: + fprintf(yyout,"bad switch yylook %d",nstr); +} return(0); } +/* end of yylex */ + +static void __yy__unused() { main(); } +#ifndef yywrap +yywrap() { return(1);} +#endif + +#ifndef FLEX_SCANNER +#undef unput +#undef input +#undef output +#undef feof +#define unput(c) twmUnput(c) +#define input() (*twmInputFunc)() +#define output(c) TwmOutput(c) +#define feof() (1) +#endif +int yyvstop[] = { +0, + +17, +0, + +16, +17, +0, + +16, +0, + +11, +17, +0, + +17, +0, + +17, +0, + +3, +17, +0, + +4, +17, +0, + +7, +17, +0, + +8, +17, +0, + +10, +17, +0, + +14, +17, +0, + +6, +17, +0, + +5, +17, +0, + +12, +17, +0, + +1, +17, +0, + +9, +17, +0, + +2, +17, +0, + +13, +0, + +15, +0, + +10, +0, + +14, +0, + +13, +0, +0}; +# define YYTYPE unsigned char +struct yywork { YYTYPE verify, advance; } yycrank[] = { +{0,0}, {0,0}, {1,3}, {0,0}, +{0,0}, {0,0}, {0,0}, {7,21}, +{0,0}, {0,0}, {1,4}, {1,5}, +{0,0}, {0,0}, {0,0}, {7,21}, +{7,21}, {0,0}, {0,0}, {0,0}, +{0,0}, {0,0}, {0,0}, {0,0}, +{0,0}, {0,0}, {0,0}, {0,0}, +{0,0}, {0,0}, {8,24}, {0,0}, +{0,0}, {0,0}, {1,6}, {1,7}, +{1,8}, {0,0}, {8,24}, {8,25}, +{7,22}, {1,9}, {1,10}, {2,6}, +{1,11}, {2,8}, {1,12}, {1,13}, +{23,28}, {1,14}, {2,9}, {2,10}, +{7,21}, {2,11}, {7,21}, {2,12}, +{0,0}, {0,0}, {0,0}, {1,15}, +{0,0}, {0,0}, {1,16}, {8,24}, +{0,0}, {0,0}, {0,0}, {0,0}, +{2,15}, {0,0}, {0,0}, {2,16}, +{0,0}, {0,0}, {0,0}, {8,24}, +{0,0}, {8,24}, {14,27}, {14,27}, +{14,27}, {14,27}, {14,27}, {14,27}, +{14,27}, {14,27}, {14,27}, {14,27}, +{0,0}, {0,0}, {0,0}, {0,0}, +{0,0}, {21,23}, {28,23}, {1,17}, +{0,0}, {0,0}, {7,23}, {0,0}, +{0,0}, {0,0}, {0,0}, {0,0}, +{2,17}, {0,0}, {23,23}, {0,0}, +{0,0}, {0,0}, {0,0}, {0,0}, +{0,0}, {0,0}, {0,0}, {0,0}, +{0,0}, {13,26}, {0,0}, {0,0}, +{0,0}, {0,0}, {0,0}, {0,0}, +{1,18}, {1,19}, {1,20}, {0,0}, +{0,0}, {0,0}, {0,0}, {0,0}, +{0,0}, {2,18}, {2,19}, {2,20}, +{13,26}, {13,26}, {13,26}, {13,26}, +{13,26}, {13,26}, {13,26}, {13,26}, +{13,26}, {13,26}, {13,26}, {13,26}, +{13,26}, {13,26}, {13,26}, {13,26}, +{13,26}, {13,26}, {13,26}, {13,26}, +{13,26}, {13,26}, {13,26}, {13,26}, +{13,26}, {13,26}, {0,0}, {0,0}, +{0,0}, {0,0}, {0,0}, {0,0}, +{13,26}, {13,26}, {13,26}, {13,26}, +{13,26}, {13,26}, {13,26}, {13,26}, +{13,26}, {13,26}, {13,26}, {13,26}, +{13,26}, {13,26}, {13,26}, {13,26}, +{13,26}, {13,26}, {13,26}, {13,26}, +{13,26}, {13,26}, {13,26}, {13,26}, +{13,26}, {13,26}, {0,0}, {0,0}, +{0,0}}; +struct yysvf yysvec[] = { +{0, 0, 0}, +{-1, 0, 0}, +{-10, yysvec+1, 0}, +{0, 0, yyvstop+1}, +{0, 0, yyvstop+3}, +{0, 0, yyvstop+6}, +{0, 0, yyvstop+8}, +{-6, 0, yyvstop+11}, +{-29, 0, yyvstop+13}, +{0, 0, yyvstop+15}, +{0, 0, yyvstop+18}, +{0, 0, yyvstop+21}, +{0, 0, yyvstop+24}, +{71, 0, yyvstop+27}, +{30, 0, yyvstop+30}, +{0, 0, yyvstop+33}, +{0, 0, yyvstop+36}, +{0, 0, yyvstop+39}, +{0, 0, yyvstop+42}, +{0, 0, yyvstop+45}, +{0, 0, yyvstop+48}, +{-1, yysvec+7, 0}, +{0, 0, yyvstop+51}, +{-14, yysvec+7, 0}, +{0, yysvec+8, 0}, +{0, 0, yyvstop+53}, +{0, yysvec+13, yyvstop+55}, +{0, yysvec+14, yyvstop+57}, +{-2, yysvec+7, yyvstop+59}, +{0, 0, 0}}; +struct yywork *yytop = yycrank+193; +struct yysvf *yybgin = yysvec+1; +unsigned char yymatch[] = { +00 ,01 ,01 ,01 ,01 ,01 ,01 ,01 , +01 ,011 ,012 ,01 ,01 ,01 ,01 ,01 , +01 ,01 ,01 ,01 ,01 ,01 ,01 ,01 , +01 ,01 ,01 ,01 ,01 ,01 ,01 ,01 , +011 ,01 ,'"' ,01 ,01 ,01 ,01 ,01 , +01 ,01 ,01 ,01 ,01 ,01 ,'.' ,01 , +'0' ,'0' ,'0' ,'0' ,'0' ,'0' ,'0' ,'0' , +'0' ,'0' ,01 ,01 ,01 ,01 ,01 ,01 , +01 ,'.' ,'.' ,'.' ,'.' ,'.' ,'.' ,'.' , +'.' ,'.' ,'.' ,'.' ,'.' ,'.' ,'.' ,'.' , +'.' ,'.' ,'.' ,'.' ,'.' ,'.' ,'.' ,'.' , +'.' ,'.' ,'.' ,01 ,01 ,01 ,01 ,01 , +01 ,'.' ,'.' ,'.' ,'.' ,'.' ,'.' ,'.' , +'.' ,'.' ,'.' ,'.' ,'.' ,'.' ,'.' ,'.' , +'.' ,'.' ,'.' ,'.' ,'.' ,'.' ,'.' ,'.' , +'.' ,'.' ,'.' ,01 ,01 ,01 ,01 ,01 , +01 ,01 ,01 ,01 ,01 ,01 ,01 ,01 , +01 ,01 ,01 ,01 ,01 ,01 ,01 ,01 , +01 ,01 ,01 ,01 ,01 ,01 ,01 ,01 , +01 ,01 ,01 ,01 ,01 ,01 ,01 ,01 , +01 ,01 ,01 ,01 ,01 ,01 ,01 ,01 , +01 ,01 ,01 ,01 ,01 ,01 ,01 ,01 , +01 ,01 ,01 ,01 ,01 ,01 ,01 ,01 , +01 ,01 ,01 ,01 ,01 ,01 ,01 ,01 , +01 ,01 ,01 ,01 ,01 ,01 ,01 ,01 , +01 ,01 ,01 ,01 ,01 ,01 ,01 ,01 , +01 ,01 ,01 ,01 ,01 ,01 ,01 ,01 , +01 ,01 ,01 ,01 ,01 ,01 ,01 ,01 , +01 ,01 ,01 ,01 ,01 ,01 ,01 ,01 , +01 ,01 ,01 ,01 ,01 ,01 ,01 ,01 , +01 ,01 ,01 ,01 ,01 ,01 ,01 ,01 , +01 ,01 ,01 ,01 ,01 ,01 ,01 ,01 , +0}; +unsigned char yyextra[] = { +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0,0,0,0,0,0,0,0, +0}; +/* @(#) $Revision: 1.2 $ */ +int yylineno =1; +# define YYU(x) x +# define NLSTATE yyprevious=YYNEWLINE + +#ifdef YYNLS16_WCHAR +unsigned char yytextuc[YYLMAX * sizeof(wchar_t)]; +# ifdef YY_PCT_POINT /* for %pointer */ +wchar_t yytextarr[YYLMAX]; +wchar_t *yytext; +# else /* %array */ +wchar_t yytextarr[1]; +wchar_t yytext[YYLMAX]; +# endif +#else +unsigned char yytextuc; +# ifdef YY_PCT_POINT /* for %pointer */ +unsigned char yytextarr[YYLMAX]; +unsigned char *yytext; +# else /* %array */ +unsigned char yytextarr[1]; +# ifdef YYCHAR_ARRAY +char yytext[YYLMAX]; +# else +unsigned char yytext[YYLMAX]; +# endif +# endif +#endif + +struct yysvf *yylstate [YYLMAX], **yylsp, **yyolsp; +unsigned char yysbuf[YYLMAX]; +unsigned char *yysptr = yysbuf; +int *yyfnd; +extern struct yysvf *yyestate; +int yyprevious = YYNEWLINE; +yylook(){ + register struct yysvf *yystate, **lsp; + register struct yywork *yyt; + struct yysvf *yyz; + int yych, yyfirst; + struct yywork *yyr; +# ifdef LEXDEBUG + int debug; +# endif +/* char *yylastch; + * ***** nls8 ***** */ + unsigned char *yylastch, sec; + /* start off machines */ +# ifdef LEXDEBUG + debug = 0; +# endif + yyfirst=1; + if (!yymorfg) +#ifdef YYNLS16_WCHAR + yylastch = yytextuc; +#else +# ifdef YYCHAR_ARRAY + yylastch = (unsigned char *)yytext; +# else + yylastch = yytext; +# endif +#endif + else { + yymorfg=0; +#ifdef YYNLS16_WCHAR + yylastch = yytextuc+yylenguc; +#else +# ifdef YYCHAR_ARRAY + yylastch = (unsigned char *)yytext+yyleng; +# else + yylastch = yytext+yyleng; +# endif +#endif + } + for(;;){ + lsp = yylstate; + yyestate = yystate = yybgin; + if (yyprevious==YYNEWLINE) yystate++; + for (;;){ +# ifdef LEXDEBUG + if(debug)fprintf(yyout,"state %d\n",yystate-yysvec-1); +# endif + yyt = &yycrank[yystate->yystoff]; + if(yyt == yycrank && !yyfirst){ /* may not be any transitions */ + yyz = yystate->yyother; + if(yyz == 0)break; + if(yyz->yystoff == 0)break; + } + *yylastch++ = yych = input(); + yyfirst=0; + tryagain: +# ifdef LEXDEBUG + if(debug){ + fprintf(yyout,"char "); + allprint(yych); + putchar('\n'); + } +# endif + yyr = yyt; + if ( (int)yyt > (int)yycrank){ + yyt = yyr + yych; + if (yyt <= yytop && yyt->verify+yysvec == yystate){ + if(yyt->advance+yysvec == YYLERR) /* error transitions */ + {unput(*--yylastch);break;} + *lsp++ = yystate = yyt->advance+yysvec; + goto contin; + } + } +# ifdef YYOPTIM + else if((int)yyt < (int)yycrank) { /* r < yycrank */ + yyt = yyr = yycrank+(yycrank-yyt); +# ifdef LEXDEBUG + if(debug)fprintf(yyout,"compressed state\n"); +# endif + yyt = yyt + yych; + if(yyt <= yytop && yyt->verify+yysvec == yystate){ + if(yyt->advance+yysvec == YYLERR) /* error transitions */ + {unput(*--yylastch);break;} + *lsp++ = yystate = yyt->advance+yysvec; + goto contin; + } + yyt = yyr + YYU(yymatch[yych]); +# ifdef LEXDEBUG + if(debug){ + fprintf(yyout,"try fall back character "); + allprint(YYU(yymatch[yych])); + putchar('\n'); + } +# endif + if(yyt <= yytop && yyt->verify+yysvec == yystate){ + if(yyt->advance+yysvec == YYLERR) /* error transition */ + {unput(*--yylastch);break;} + *lsp++ = yystate = yyt->advance+yysvec; + goto contin; + } + } + if ((yystate = yystate->yyother) && (yyt = &yycrank[yystate->yystoff]) != yycrank){ +# ifdef LEXDEBUG + if(debug)fprintf(yyout,"fall back to state %d\n",yystate-yysvec-1); +# endif + goto tryagain; + } +# endif + else + {unput(*--yylastch);break;} + contin: +# ifdef LEXDEBUG + if(debug){ + fprintf(yyout,"state %d char ",yystate-yysvec-1); + allprint(yych); + putchar('\n'); + } +# endif + ; + } +# ifdef LEXDEBUG + if(debug){ + fprintf(yyout,"stopped at %d with ",*(lsp-1)-yysvec-1); + allprint(yych); + putchar('\n'); + } +# endif + while (lsp-- > yylstate){ + *yylastch-- = 0; + if (*lsp != 0 && (yyfnd= (*lsp)->yystops) && *yyfnd > 0){ + yyolsp = lsp; + if(yyextra[*yyfnd]){ /* must backup */ + while(yyback((*lsp)->yystops,-*yyfnd) != 1 && lsp > yylstate){ + lsp--; + unput(*yylastch--); + } + } + yyprevious = YYU(*yylastch); + yylsp = lsp; +#ifdef YYNLS16_WCHAR + yylenguc = yylastch-yytextuc+1; + yytextuc[yylenguc] = 0; +#else +# ifdef YYCHAR_ARRAY + yyleng = yylastch-(unsigned char*)yytext+1; +# else + yyleng = yylastch-yytext+1; +# endif + yytext[yyleng] = 0; +#endif +# ifdef LEXDEBUG + if(debug){ + fprintf(yyout,"\nmatch "); +#ifdef YYNLS16_WCHAR + sprint(yytextuc); +#else + sprint(yytext); +#endif + fprintf(yyout," action %d\n",*yyfnd); + } +# endif + return(*yyfnd++); + } + unput(*yylastch); + } +#ifdef YYNLS16_WCHAR + if (yytextuc[0] == 0 /* && feof(yyin) */) +#else + if (yytext[0] == 0 /* && feof(yyin) */) +#endif + { + yysptr=yysbuf; + return(0); + } +#ifdef YYNLS16_WCHAR + yyprevious = yytextuc[0] = input(); +#else + yyprevious = yytext[0] = input(); +#endif + if (yyprevious>0) { + output(yyprevious); +#ifdef YYNLS16 + if (yynls16) +#ifdef YYNLS16_WCHAR + if (FIRSTof2(yytextuc[0])) +#else + if (FIRSTof2(yytext[0])) +#endif + if (SECof2(sec = input())) +#ifdef YYNLS16_WCHAR + output(yyprevious=yytextuc[0]=sec); +#else + output(yyprevious=yytext[0]=sec); +#endif + else + unput(sec); +#endif + } +#ifdef YYNLS16_WCHAR + yylastch=yytextuc; +#else +# ifdef YYCHAR_ARRAY + yylastch=(unsigned char*)yytext; +# else + yylastch=yytext; +# endif +#endif +# ifdef LEXDEBUG + if(debug)putchar('\n'); +# endif + } + } + +# ifdef __cplusplus +yyback(int *p, int m) +# else +yyback(p, m) + int *p; +# endif +{ +if (p==0) return(0); +while (*p) + { + if (*p++ == m) + return(1); + } +return(0); +} + /* the following are only used in the lex library */ +yyinput(){ + return(input()); + + } + +#ifdef __cplusplus +void yyoutput(int c) +#else +yyoutput(c) + int c; +# endif +{ + output(c); +} + +#ifdef __cplusplus +void yyunput(int c) +#else +yyunput(c) + int c; +#endif +{ + unput(c); +} Index: external/mit/ctwm/dist/lex.l =================================================================== RCS file: external/mit/ctwm/dist/lex.l diff -N external/mit/ctwm/dist/lex.l --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/lex.l 3 Sep 2015 12:19:56 -0000 @@ -0,0 +1,141 @@ +%{ +/*****************************************************************************/ +/** Copyright 1988 by Evans & Sutherland Computer Corporation, **/ +/** Salt Lake City, Utah **/ +/** Portions Copyright 1989 by the Massachusetts Institute of Technology **/ +/** Cambridge, Massachusetts **/ +/** **/ +/** All Rights Reserved **/ +/** **/ +/** Permission to use, copy, modify, and distribute this software and **/ +/** its documentation for any purpose and without fee is hereby **/ +/** granted, provided that the above copyright notice appear in all **/ +/** copies and that both that copyright notice and this permis- **/ +/** sion notice appear in supporting documentation, and that the **/ +/** names of Evans & Sutherland and M.I.T. not be used in advertising **/ +/** in publicity pertaining to distribution of the software without **/ +/** specific, written prior permission. **/ +/** **/ +/** EVANS & SUTHERLAND AND M.I.T. DISCLAIM ALL WARRANTIES WITH REGARD **/ +/** TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANT- **/ +/** ABILITY AND FITNESS, IN NO EVENT SHALL EVANS & SUTHERLAND OR **/ +/** M.I.T. BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAM- **/ +/** AGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA **/ +/** OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER **/ +/** TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE **/ +/** OR PERFORMANCE OF THIS SOFTWARE. **/ +/*****************************************************************************/ +/* + * [ ctwm ] + * + * Copyright 1992 Claude Lecommandeur. + * + * Permission to use, copy, modify and distribute this software [ctwm] and + * its documentation for any purpose is hereby granted without fee, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting documen- + * tation, and that the name of Claude Lecommandeur not be used in adverti- + * sing or publicity pertaining to distribution of the software without + * specific, written prior permission. Claude Lecommandeur make no represen- + * tations about the suitability of this software for any purpose. It is + * provided "as is" without express or implied warranty. + * + * Claude Lecommandeur DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO + * EVENT SHALL Claude Lecommandeur BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF + * USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR + * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + * + * Author: Claude Lecommandeur [ lecom@sic.epfl.ch ][ April 1992 ] + */ + +/*********************************************************************** + * + * $XConsortium: lex.l,v 1.62 89/12/10 17:46:33 jim Exp $ + * + * .twmrc lex file + * + * 12-Nov-87 Thomas E. LaStrange File created + * + ***********************************************************************/ + +/* #include */ /* lex already includes stdio.h */ +#ifdef VMS +# include +# ifdef __DECC +# include +# else +# include +# endif +#endif +#include "parse.h" +extern char *ProgramName; + +extern int ParseError; +extern void twmrc_error_prefix(void); +#ifdef FLEX_SCANNER +# undef YY_INPUT +# define YY_INPUT(buf,result,max_size) {buf[0]=twmInputFunc();result=(buf[0] != 0);} +#endif + +extern int yylex(void); +%} + +string \"([^"]|\\.)*\" +number [0-9]+ +%% +"{" { return (LB); } +"}" { return (RB); } +"(" { return (LP); } +")" { return (RP); } +"=" { return (EQUALS); } +":" { return (COLON); } +"+" { return PLUS; } +"-" { return MINUS; } +"|" { return OR; } + +[a-zA-Z\.]+ { int token = parse_keyword (yytext, + &yylval.num); + if (token == ERRORTOKEN) { + twmrc_error_prefix(); + fprintf (stderr, + "ignoring unknown keyword: %s\n", + yytext); + ParseError = 1; + } else + return token; + } + +"!" { yylval.num = F_EXEC; return FSKEYWORD; } +"^" { yylval.num = F_CUT; return FSKEYWORD; } + +{string} { yylval.ptr = yytext; return STRING; } +{number} { (void)sscanf(yytext, "%d", &yylval.num); + return NUMBER; } +\#[^\n]*\n {;} +[\n\t ] {;} +. { + twmrc_error_prefix(); + fprintf (stderr, + "ignoring character \"%s\"\n", + yytext); + ParseError = 1; + } +%% +#ifndef yywrap +int yywrap(void) { return(1);} +#endif + +#ifndef FLEX_SCANNER +#undef unput +#undef input +#undef output +#undef feof +#define unput(c) twmUnput(c) +#define input() (*twmInputFunc)() +#define output(c) TwmOutput(c) +#define feof() (1) +#endif + Index: external/mit/ctwm/dist/libctwm.c =================================================================== RCS file: external/mit/ctwm/dist/libctwm.c diff -N external/mit/ctwm/dist/libctwm.c --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/libctwm.c 3 Sep 2015 12:19:56 -0000 @@ -0,0 +1,239 @@ +/* + * [ ctwm ] + * + * Copyright 1992 Claude Lecommandeur. + * + * Permission to use, copy, modify and distribute this software [ctwm] and + * its documentation for any purpose is hereby granted without fee, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting documen- + * tation, and that the name of Claude Lecommandeur not be used in adverti- + * sing or publicity pertaining to distribution of the software without + * specific, written prior permission. Claude Lecommandeur make no represen- + * tations about the suitability of this software for any purpose. It is + * provided "as is" without express or implied warranty. + * + * Claude Lecommandeur DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO + * EVENT SHALL Claude Lecommandeur BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF + * USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR + * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + * + * Author: Claude Lecommandeur [ lecom@sic.epfl.ch ][ April 1992 ] + */ +#include +#include + +#include +#include +#include "twm.h" +#include "ctwm.h" + +Atom _XA_WM_OCCUPATION; +Atom _XA_WM_CURRENTWORKSPACE; +Atom _XA_WM_WORKSPACESLIST; + +/* Note that this doesn't assure that ctwm is really running, + i should set up a communication via flipping a property */ + +Bool CtwmIsRunning (Display *display, int scrnum) +{ + unsigned char *prop; + unsigned long bytesafter; + unsigned long len; + Atom actual_type; + int actual_format; + + _XA_WM_WORKSPACESLIST = XInternAtom (display, "WM_WORKSPACESLIST", True); + if (_XA_WM_WORKSPACESLIST == None) return (False); + if (XGetWindowProperty (display, RootWindow (display, scrnum), _XA_WM_WORKSPACESLIST, 0L, 512, + False, XA_STRING, &actual_type, &actual_format, &len, + &bytesafter, &prop) != Success) return (False); + if (len == 0) return (False); + XFree ((char *)prop); + return (True); +} + +char **CtwmListWorkspaces (Display *display, int scrnum) +{ + unsigned char *prop; + char *p; + unsigned long bytesafter; + unsigned long len; + Atom actual_type; + int actual_format; + char **ret; + int count; + int i; + unsigned long l; + + _XA_WM_WORKSPACESLIST = XInternAtom (display, "_WIN_WORKSPACE_NAMES", True); + + if (XGetWindowProperty (display, RootWindow (display, scrnum), _XA_WM_WORKSPACESLIST, 0L, 512, + False, XA_STRING, &actual_type, &actual_format, &len, + &bytesafter, &prop) != Success) return 0; + if (len == 0) return 0; + + count = 0; + p = (char*)prop; + l = 0; + while (l < len) { + l += strlen (p) + 1; + p += strlen (p) + 1; + count++; + } + ret = (char**) malloc ((count + 1) * sizeof (char*)); + + p = (char*)prop; + l = 0; + i = 0; + while (l < len) { + ret [i++] = p; + l += strlen (p) + 1; + p += strlen (p) + 1; + } + ret [i] = NULL; + XFree ((char *)prop); + return (ret); +} + +char *CtwmCurrentWorkspace (Display *display, int scrnum) +{ + unsigned char *prop; + unsigned long bytesafter; + unsigned long len; + Atom actual_type; + int actual_format; + + _XA_WM_CURRENTWORKSPACE = XInternAtom (display, "WM_CURRENTWORKSPACE", True); + if (_XA_WM_CURRENTWORKSPACE == None) return ((char*) 0); + + if (XGetWindowProperty (display, RootWindow (display, scrnum), _XA_WM_CURRENTWORKSPACE, 0L, 512, + False, XA_STRING, &actual_type, &actual_format, &len, + &bytesafter, &prop) != Success) return ((char*) 0); + if (len == 0) return ((char*) 0); + return ((char*) prop); +} + +int CtwmChangeWorkspace (Display *display, int scrnum, char *workspace) +{ + _XA_WM_CURRENTWORKSPACE = XInternAtom (display, "WM_CURRENTWORKSPACE", True); + if (_XA_WM_CURRENTWORKSPACE == None) return (0); + + XChangeProperty (display, RootWindow (display, scrnum), _XA_WM_CURRENTWORKSPACE, XA_STRING, 8, + PropModeReplace, (unsigned char *) workspace, strlen (workspace)); + XFlush (display); + return (1); +} + +char **CtwmCurrentOccupation (Display *display, Window window) +{ + unsigned char *prop; + char *p; + unsigned long bytesafter; + unsigned long len; + Atom actual_type; + int actual_format; + int count, i; + unsigned long l; + char **ret; + + _XA_WM_OCCUPATION = XInternAtom (display, "WM_OCCUPATION", True); + if (_XA_WM_OCCUPATION == None) return ((char**) 0); + + if (XGetWindowProperty (display, window, _XA_WM_OCCUPATION, 0L, 512, + False, XA_STRING, &actual_type, &actual_format, &len, + &bytesafter, &prop) != Success) return 0; + if (len == 0) return 0; + + count = 0; + p = (char*)prop; + l = 0; + while (l < len) { + l += strlen (p) + 1; + p += strlen (p) + 1; + count++; + } + ret = (char**) malloc ((count + 1) * sizeof (char*)); + + p = (char*)prop; + l = 0; + i = 0; + while (l < len) { + ret [i++] = p; + l += strlen (p) + 1; + p += strlen (p) + 1; + } + ret [i] = NULL; + XFree ((char *)prop); + return (ret); +} + +int CtwmSetOccupation (Display *display, Window window, char **occupation) +{ + int len; + char **occ; + char *occup, *o; + + _XA_WM_OCCUPATION = XInternAtom (display, "WM_OCCUPATION", True); + if (_XA_WM_OCCUPATION == None) return (0); + + occ = occupation; + len = 0; + while (*occ++) { + len += strlen (*occupation) + 1; + } + occup = (char*) malloc (len * sizeof (char)); + + o = occup; + while (*occupation) { + strcpy (o, *occupation); + o += strlen (*occupation) + 1; + occupation++; + } + XChangeProperty (display, window, _XA_WM_OCCUPATION, XA_STRING, 8, + PropModeReplace, (unsigned char *) occup, len - 1); + XFlush (display); + free (occup); + return (1); +} + +int CtwmAddToCurrentWorkspace (Display *display, Window window) +{ + unsigned char *prop; + unsigned long bytesafter; + unsigned long len; + Atom actual_type; + int actual_format; + XWindowAttributes attr; + unsigned char *currentw; + + if (! XGetWindowAttributes (display, window, &attr)) return (0); + + _XA_WM_CURRENTWORKSPACE = XInternAtom (display, "WM_CURRENTWORKSPACE", True); + if (_XA_WM_CURRENTWORKSPACE == None) return (0); + + if (XGetWindowProperty (display, attr.root, _XA_WM_CURRENTWORKSPACE, 0L, 512, + False, XA_STRING, &actual_type, &actual_format, &len, + &bytesafter, ¤tw) != Success) return (0); + if (len == 0) return (0); + + _XA_WM_OCCUPATION = XInternAtom (display, "WM_OCCUPATION", True); + if (_XA_WM_OCCUPATION == None) return (0); + + if (XGetWindowProperty (display, window, _XA_WM_OCCUPATION, 0L, 512, + False, XA_STRING, &actual_type, &actual_format, &len, + &bytesafter, &prop) != Success) return (0); + if (len == 0) return (0); + + strcpy ((char*)prop + len, (char*)currentw); + XChangeProperty (display, window, _XA_WM_OCCUPATION, XA_STRING, 8, + PropModeReplace, + prop, (int) len + strlen ((char*)currentw)); + XFree ((char *)prop); + XFree ((char *)currentw); + XFlush (display); + return (1); +} Index: external/mit/ctwm/dist/link.com =================================================================== RCS file: external/mit/ctwm/dist/link.com diff -N external/mit/ctwm/dist/link.com --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/link.com 3 Sep 2015 12:19:56 -0000 @@ -0,0 +1 @@ +$ @MAKE.COM LINK Index: external/mit/ctwm/dist/list.c =================================================================== RCS file: external/mit/ctwm/dist/list.c diff -N external/mit/ctwm/dist/list.c --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/list.c 3 Sep 2015 12:19:56 -0000 @@ -0,0 +1,450 @@ +/*****************************************************************************/ +/** Copyright 1988 by Evans & Sutherland Computer Corporation, **/ +/** Salt Lake City, Utah **/ +/** Portions Copyright 1989 by the Massachusetts Institute of Technology **/ +/** Cambridge, Massachusetts **/ +/** **/ +/** All Rights Reserved **/ +/** **/ +/** Permission to use, copy, modify, and distribute this software and **/ +/** its documentation for any purpose and without fee is hereby **/ +/** granted, provided that the above copyright notice appear in all **/ +/** copies and that both that copyright notice and this permis- **/ +/** sion notice appear in supporting documentation, and that the **/ +/** names of Evans & Sutherland and M.I.T. not be used in advertising **/ +/** in publicity pertaining to distribution of the software without **/ +/** specific, written prior permission. **/ +/** **/ +/** EVANS & SUTHERLAND AND M.I.T. DISCLAIM ALL WARRANTIES WITH REGARD **/ +/** TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANT- **/ +/** ABILITY AND FITNESS, IN NO EVENT SHALL EVANS & SUTHERLAND OR **/ +/** M.I.T. BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAM- **/ +/** AGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA **/ +/** OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER **/ +/** TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE **/ +/** OR PERFORMANCE OF THIS SOFTWARE. **/ +/*****************************************************************************/ +/* + * [ ctwm ] + * + * Copyright 1992 Claude Lecommandeur. + * + * Permission to use, copy, modify and distribute this software [ctwm] and + * its documentation for any purpose is hereby granted without fee, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting documen- + * tation, and that the name of Claude Lecommandeur not be used in adverti- + * sing or publicity pertaining to distribution of the software without + * specific, written prior permission. Claude Lecommandeur make no represen- + * tations about the suitability of this software for any purpose. It is + * provided "as is" without express or implied warranty. + * + * Claude Lecommandeur DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO + * EVENT SHALL Claude Lecommandeur BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF + * USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR + * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + * + * Author: Claude Lecommandeur [ lecom@sic.epfl.ch ][ April 1992 ] + */ + + +/********************************************************************** + * + * $XConsortium: list.c,v 1.20 91/01/09 17:13:30 rws Exp $ + * + * TWM code to deal with the name lists for the NoTitle list and + * the AutoRaise list + * + * 11-Apr-88 Tom LaStrange Initial Version. + * + * Do the necessary modification to be integrated in ctwm. + * Can no longer be used for the standard twm. + * + * 22-April-92 Claude Lecommandeur. + * + * + **********************************************************************/ + +#include +#ifdef VMS +#include +#endif +#include "twm.h" +#include "screen.h" +#include "gram.tab.h" +#include "list.h" +#include "util.h" + +#ifdef USE_GNU_REGEX +# include +#endif /* USE_GNU_REGEX */ + + +extern void twmrc_error_prefix(void); + +/*********************************************************************** + * + * Procedure: + * AddToList - add a window name to the appropriate list + * + * Inputs: + * list - the address of the pointer to the head of a list + * name - a pointer to the name of the window + * ptr - pointer to list dependent data + * + * Special Considerations + * If the list does not use the ptr value, a non-null value + * should be placed in it. LookInList returns this ptr value + * and procedures calling LookInList will check for a non-null + * return value as an indication of success. + * + *********************************************************************** + */ + +#if 0 /* appears not to be used anywhere */ +static int is_pattern (char *p); +#endif + +void AddToList(name_list **list_head, char *name, char *ptr) +{ + name_list *nptr; + + if (!list_head) return; /* ignore empty inserts */ + + nptr = (name_list *)malloc(sizeof(name_list)); + if (nptr == NULL) + { + twmrc_error_prefix(); + fprintf (stderr, "unable to allocate %lu bytes for name_list\n", + (unsigned long) sizeof(name_list)); + Done(0); + } + + nptr->next = *list_head; +#ifdef VMS + { + char *ftemp; + ftemp = (char *) malloc((strlen(name)+1)*sizeof(char)); + nptr->name = strcpy (ftemp,name); + } +#else + nptr->name = (char*) strdup (name); +#endif + nptr->ptr = (ptr == NULL) ? (char *)TRUE : ptr; + *list_head = nptr; +} + +/*********************************************************************** + * + * Procedure: + * LookInList - look through a list for a window name, or class + * + * Returned Value: + * the ptr field of the list structure or NULL if the name + * or class was not found in the list + * + * Inputs: + * list - a pointer to the head of a list + * name - a pointer to the name to look for + * class - a pointer to the class to look for + * + *********************************************************************** + */ + +void *LookInList(name_list *list_head, char *name, XClassHint *class) +{ + name_list *nptr; + + /* look for the name first */ + for (nptr = list_head; nptr != NULL; nptr = nptr->next) + if (match (nptr->name, name)) + return (nptr->ptr); + + if (class) + { + /* look for the res_name next */ + for (nptr = list_head; nptr != NULL; nptr = nptr->next) + if (match (nptr->name, class->res_name)) + return (nptr->ptr); + + /* finally look for the res_class */ + for (nptr = list_head; nptr != NULL; nptr = nptr->next) + if (match (nptr->name, class->res_class)) + return (nptr->ptr); + } + return (NULL); +} + +void *LookInNameList(name_list *list_head, char *name) +{ + return (LookInList(list_head, name, NULL)); +} + +void *LookPatternInList(name_list *list_head, char *name, XClassHint *class) +{ + name_list *nptr; + + for (nptr = list_head; nptr != NULL; nptr = nptr->next) + if (match (nptr->name, name)) + return (nptr->name); + + if (class) + { + for (nptr = list_head; nptr != NULL; nptr = nptr->next) + if (match (nptr->name, class->res_name)) + return (nptr->name); + + for (nptr = list_head; nptr != NULL; nptr = nptr->next) + if (match (nptr->name, class->res_class)) + return (nptr->name); + } + return (NULL); +} + +void *LookPatternInNameList (name_list *list_head, char *name) +{ + return (LookPatternInList(list_head, name, NULL)); +} + +/*********************************************************************** + * + * Procedure: + * GetColorFromList - look through a list for a window name, or class + * + * Returned Value: + * TRUE if the name was found + * FALSE if the name was not found + * + * Inputs: + * list - a pointer to the head of a list + * name - a pointer to the name to look for + * class - a pointer to the class to look for + * + * Outputs: + * ptr - fill in the list value if the name was found + * + *********************************************************************** + */ + +int GetColorFromList(name_list *list_head, char *name, + XClassHint *class, Pixel *ptr) +{ + int save; + name_list *nptr; + + for (nptr = list_head; nptr != NULL; nptr = nptr->next) + if (match (nptr->name, name)) + { + save = Scr->FirstTime; + Scr->FirstTime = TRUE; + GetColor(Scr->Monochrome, ptr, nptr->ptr); + Scr->FirstTime = save; + return (TRUE); + } + + if (class) + { + for (nptr = list_head; nptr != NULL; nptr = nptr->next) + if (match (nptr->name, class->res_name)) + { + save = Scr->FirstTime; + Scr->FirstTime = TRUE; + GetColor(Scr->Monochrome, ptr, nptr->ptr); + Scr->FirstTime = save; + return (TRUE); + } + + for (nptr = list_head; nptr != NULL; nptr = nptr->next) + if (match (nptr->name, class->res_class)) + { + save = Scr->FirstTime; + Scr->FirstTime = TRUE; + GetColor(Scr->Monochrome, ptr, nptr->ptr); + Scr->FirstTime = save; + return (TRUE); + } + } + return (FALSE); +} + +/*********************************************************************** + * + * Procedure: + * FreeList - free up a list + * + *********************************************************************** + */ + +void FreeList(name_list **list) +{ + name_list *nptr; + name_list *tmp; + + for (nptr = *list; nptr != NULL; ) + { + tmp = nptr->next; + free((char *) nptr); + nptr = tmp; + } + *list = NULL; +} + +#ifdef USE_GNU_REGEX + +#define MAXPATLEN 256 + +int match (pattern, string) + char *pattern, *string; +{ + regex_t preg; + int error; + + if ((pattern == NULL) || (string == NULL)) return 0; + error = regcomp (&preg, pattern, REG_EXTENDED | REG_NOSUB); + if (error != 0) { + char buf [256]; + (void) regerror (error, &preg, buf, sizeof buf); + fprintf (stderr, "%s : %s\n", buf, pattern); + return 0; + } + error = regexec (&preg, string, 5, 0, 0); + regfree (&preg); + if (error == 0) return 1; + return 0; +} + +#else + + + +int regex_match (char *p, char *t); +int regex_match_after_star (char *p, char *t); + +#if 0 /* appears not to be used anywhere */ +static int is_pattern (char *p) +{ + while ( *p ) { + switch ( *p++ ) { + case '?': + case '*': + case '[': + return TRUE; + case '\\': + if ( !*p++ ) return FALSE; + } + } + return FALSE; +} +#endif + +#define ABORT 2 + +int regex_match (char *p, char *t) +{ + register char range_start, range_end; + int invert; + int member_match; + int loop; + + for ( ; *p; p++, t++ ) { + if (!*t) return ( *p == '*' && *++p == '\0' ) ? TRUE : ABORT; + switch ( *p ) { + case '?': + break; + case '*': + return regex_match_after_star (p, t); + case '[': { + p++; + invert = FALSE; + if ( *p == '!' || *p == '^') { + invert = TRUE; + p++; + } + if ( *p == ']' ) return ABORT; + member_match = FALSE; + loop = TRUE; + while ( loop ) { + if (*p == ']') { + loop = FALSE; + continue; + } + if (*p == '\\') range_start = range_end = *++p; + else range_start = range_end = *p; + if (!range_start) return ABORT; + if (*++p == '-') { + range_end = *++p; + if (range_end == '\0' || range_end == ']') return ABORT; + if (range_end == '\\') range_end = *++p; + p++; + } + if ( range_start < range_end ) { + if (*t >= range_start && *t <= range_end) { + member_match = TRUE; + loop = FALSE; + } + } + else { + if (*t >= range_end && *t <= range_start) { + member_match = TRUE; + loop = FALSE; + } + } + } + if ((invert && member_match) || !(invert || member_match)) return (FALSE); + if (member_match) { + while (*p != ']') { + if (!*p) return (ABORT); + if (*p == '\\') p++; + p++; + } + } + break; + } + case '\\': + p++; + + default: + if (*p != *t) return (FALSE); + } + } + return (!*t); +} + +int regex_match_after_star (char *p, char *t) +{ + register int mat; + register int nextp; + + while ((*p == '?') || (*p == '*')) { + if (*p == '?') { + if ( !*t++ ) return ABORT; + } + p++; + } + if ( !*p ) return TRUE; + + nextp = *p; + if (nextp == '\\') nextp = p[1]; + + mat = FALSE; + while (mat == FALSE) { + if ( nextp == *t || nextp == '[' ) mat = regex_match(p, t); + if ( !*t++ ) mat = ABORT; + } + return (mat); +} + +int match (char *p, char *t) +{ + if ((p == NULL) || (t == NULL)) return (FALSE); + return ((regex_match (p,t) == TRUE) ? TRUE : FALSE); +} + +#endif + + + + Index: external/mit/ctwm/dist/list.h =================================================================== RCS file: external/mit/ctwm/dist/list.h diff -N external/mit/ctwm/dist/list.h --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/list.h 3 Sep 2015 12:19:56 -0000 @@ -0,0 +1,88 @@ +/*****************************************************************************/ +/** Copyright 1988 by Evans & Sutherland Computer Corporation, **/ +/** Salt Lake City, Utah **/ +/** Portions Copyright 1989 by the Massachusetts Institute of Technology **/ +/** Cambridge, Massachusetts **/ +/** **/ +/** All Rights Reserved **/ +/** **/ +/** Permission to use, copy, modify, and distribute this software and **/ +/** its documentation for any purpose and without fee is hereby **/ +/** granted, provided that the above copyright notice appear in all **/ +/** copies and that both that copyright notice and this permis- **/ +/** sion notice appear in supporting documentation, and that the **/ +/** names of Evans & Sutherland and M.I.T. not be used in advertising **/ +/** in publicity pertaining to distribution of the software without **/ +/** specific, written prior permission. **/ +/** **/ +/** EVANS & SUTHERLAND AND M.I.T. DISCLAIM ALL WARRANTIES WITH REGARD **/ +/** TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANT- **/ +/** ABILITY AND FITNESS, IN NO EVENT SHALL EVANS & SUTHERLAND OR **/ +/** M.I.T. BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAM- **/ +/** AGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA **/ +/** OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER **/ +/** TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE **/ +/** OR PERFORMANCE OF THIS SOFTWARE. **/ +/*****************************************************************************/ +/* + * [ ctwm ] + * + * Copyright 1992 Claude Lecommandeur. + * + * Permission to use, copy, modify and distribute this software [ctwm] and + * its documentation for any purpose is hereby granted without fee, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting documen- + * tation, and that the name of Claude Lecommandeur not be used in adverti- + * sing or publicity pertaining to distribution of the software without + * specific, written prior permission. Claude Lecommandeur make no represen- + * tations about the suitability of this software for any purpose. It is + * provided "as is" without express or implied warranty. + * + * Claude Lecommandeur DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO + * EVENT SHALL Claude Lecommandeur BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF + * USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR + * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + * + * Author: Claude Lecommandeur [ lecom@sic.epfl.ch ][ April 1992 ] + */ + + +/********************************************************************** + * + * $XConsortium: list.h,v 1.12 90/09/14 14:54:42 converse Exp $ + * + * TWM list handling external definitions + * + * 11-Apr-88 Tom LaStrange Initial Version. + * + **********************************************************************/ + +#ifndef _LIST_ +#define _LIST_ + +struct name_list_struct +{ + name_list *next; /* pointer to the next name */ + char *name; /* the name of the window */ + char *ptr; /* list dependent data */ +}; + +extern void AddToList(name_list **list_head, char *name, char *ptr); +extern void* LookInList(name_list *list_head, char *name, + XClassHint *class); +extern void* LookInNameList(name_list *list_head, char *name); +extern void* LookPatternInList(name_list *list_head, char *name, + XClassHint *class); +extern void* LookPatternInNameList(name_list *list_head, char *name); +extern int GetColorFromList(name_list *list_head, char *name, + XClassHint *class, Pixel *ptr); +extern void FreeList(name_list **list); + +extern int match (char *pattern, char *string); + +#endif /* _LIST_ */ + Index: external/mit/ctwm/dist/lnm.c =================================================================== RCS file: external/mit/ctwm/dist/lnm.c diff -N external/mit/ctwm/dist/lnm.c --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/lnm.c 3 Sep 2015 12:19:56 -0000 @@ -0,0 +1,126 @@ +/* + * [ ctwm ] + * + * Copyright 1992 Claude Lecommandeur. + * + * Permission to use, copy, modify and distribute this software [ctwm] and + * its documentation for any purpose is hereby granted without fee, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting documen- + * tation, and that the name of Claude Lecommandeur not be used in adverti- + * sing or publicity pertaining to distribution of the software without + * specific, written prior permission. Claude Lecommandeur make no represen- + * tations about the suitability of this software for any purpose. It is + * provided "as is" without express or implied warranty. + * + * Claude Lecommandeur DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO + * EVENT SHALL Claude Lecommandeur BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF + * USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR + * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + * + * Author: Claude Lecommandeur [ lecom@sic.epfl.ch ][ April 1992 ] + */ +/* + * Tranlate (VMS) logical name from "in" to "out". + */ + +#include +#include +#include +#include + +static struct dsc$descriptor_s create_descriptor (string) +char *string; +{ + struct dsc$descriptor_s descrip_string; + + /* build it */ + + descrip_string.dsc$b_dtype = DSC$K_DTYPE_T; + descrip_string.dsc$b_class = DSC$K_CLASS_S; + descrip_string.dsc$w_length = strlen(string); + descrip_string.dsc$a_pointer = string; + + /* return it */ + + return (descrip_string); +} + +int GetLogical(Logical_Name, outbuf) +char *Logical_Name, *outbuf; +{ + static short len; + int istatus; + int i; + static char retbuf[256]; + char *rptr; + struct dsc$descriptor_s search_list = create_descriptor("LNM$FILE_DEV"); + struct dsc$descriptor_s logical_name = create_descriptor(Logical_Name); + struct { + short len; + short code; + char *buf; + short *retlen; + } ItmLst[] = { {255, LNM$_STRING, retbuf, &len}, + {0, 0, (char *)0, 0} + }; + + static long attr=LNM$M_CASE_BLIND; + + istatus = sys$trnlnm(&attr, + &search_list, + &logical_name, + 0, + ItmLst); + + if (!(istatus&1)) { + return(istatus); + } else { + retbuf[len] = '\0'; + rptr = retbuf; + if (*rptr == 27) /* process permanent file */ + rptr += 4; /* skip past it the iff */ + strcpy (outbuf, rptr); + return(1); + } +} + +CreateLogical(name,table,definition, accmode) +char *name, *table, *definition; +int accmode; +{ + struct dsc$descriptor_s table_name = create_descriptor (table); + struct dsc$descriptor_s logical_name = create_descriptor (name); + struct { + short len; + short item; + char *buffer; + short *buflen; + } itmlst[2]; + itmlst[0].len = strlen(definition); + itmlst[0].item = LNM$_STRING; + itmlst[0].buffer = definition; + itmlst[0].buflen = 0; + itmlst[1].len = itmlst[1].item = 0; + + (void) sys$crelnm(0, &table_name, + &logical_name, + &accmode, itmlst); +} + +/* + * Routine to delete logical names + */ + +DeleteLogical(name,table) +char *name, *table; +{ + struct dsc$descriptor_s table_name = create_descriptor (table); + struct dsc$descriptor_s logical_name = create_descriptor (name); + (void) sys$dellnm(&table_name, + &logical_name, + 0); +} Index: external/mit/ctwm/dist/lnm.h =================================================================== RCS file: external/mit/ctwm/dist/lnm.h diff -N external/mit/ctwm/dist/lnm.h --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/lnm.h 3 Sep 2015 12:19:56 -0000 @@ -0,0 +1,40 @@ +/* + * [ ctwm ] + * + * Copyright 1992 Claude Lecommandeur. + * + * Permission to use, copy, modify and distribute this software [ctwm] and + * its documentation for any purpose is hereby granted without fee, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting documen- + * tation, and that the name of Claude Lecommandeur not be used in adverti- + * sing or publicity pertaining to distribution of the software without + * specific, written prior permission. Claude Lecommandeur make no represen- + * tations about the suitability of this software for any purpose. It is + * provided "as is" without express or implied warranty. + * + * Claude Lecommandeur DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO + * EVENT SHALL Claude Lecommandeur BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF + * USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR + * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + * + * Author: Claude Lecommandeur [ lecom@sic.epfl.ch ][ April 1992 ] + */ +/* + * LNM.H + * + * Provides for the mode to define VMS logicals in + */ +#ifndef __LNM__ +#define __LNM__ + +#define LNM_KERNEL 0 +#define LNM_EXEC 1 +#define LNM_SUPER 2 +#define LNM_USER 3 + +extern int GetLogical(); +#endif Index: external/mit/ctwm/dist/make.com =================================================================== RCS file: external/mit/ctwm/dist/make.com diff -N external/mit/ctwm/dist/make.com --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/make.com 3 Sep 2015 12:19:56 -0000 @@ -0,0 +1,483 @@ +$! Make.com for building CTWM +$ SAVE_VERIFY='F$VERIFY(0) +$! +$! Compile the CTWM Window Manager +$! +$!--------------------------- Customization ------------------------------- +$! Define logicals pointing to the needed directories +$! +$! this is where the Xmu include files are held, +$! usually in sys$sysroot:[decw$include.xmu] +$ define/nolog x11xmu sys$sysroot:[decw$include.xmu] +$ +$! the file spec. of the Xmu library. +$ define/nolog x11xmulib "SYS$SHARE:DECW$XMULIBSHR/share" +$ +$! where the xpm object library is. +$ define/nolog xpmlib pd:[src.xpm-3_4e] +$ +$! ctwm exit style: +$! 0 - Just exit with error code 20. +$! 1 - run sys$system:decw$endsession.exe on exit +$ EXIT_ENDSESSION = 0 +$ +$!------------------------ End of Customization --------------------------- +$! +$ if p1 .Eqs. "CLEAN" then goto clean +$ if p1 .Eqs. "CLOBBER" then goto clobber +$ +$! Sanity check! suggested by Michael Lemke +$ if f$search("XPM.H") .eqs. "" +$ then +$ write sys$output "Hey, you there! Read README.VMS! It says that you have to copy XPM.H" +$ write sys$output "from somewhere, like a XPM library distribution! I can't work without it," +$ write sys$output "so I'll quit for now." +$ exit +$ endif +$ FAKE_XPMLIB:=you:[must.define.this.in] +$ l=f$trnlnm("XPMLIB") +$ if l - (FAKE_XPMLIB+"make.com") .nes. l +$ then +$ write sys$output "You must change the definition of XPMLIB in MAKE.COM." +$ exit +$ endif +$ +$ FLEX = FLEX +$ Set Symbol/Scope=NoGlobal +$ if p1 .Eqs. "LINK" +$ then +$ link_options = "/NOTRACE" +$ __axp = f$getsyi("CPU") .ge. 128 +$ __decc = f$search("SYS$SHARE:DECC$SHR.EXE") .nes. "" +$ +$ EXT = "VAX_" +$ if __axp then EXT = "AXP_" +$ OPT_EXT = "DECC_OPT" +$ CLIB = "" +$ if .not. __axp .and (.not. __decc .or. f$search("*.''EXT'OBJ") .eqs. "") +$ then +$ OPT_EXT = "VAXC_OPT" +$ EXT = EXT + "VAXC_" +$ CLIB := SYS$SHARE:VAXCRTL/SHARE +$ endif +$ if f$search("*.''EXT'OBJ") .eqs. "" +$ then +$ write sys$output "Sorry, but the object files I need are missing." +$ write sys$output "You need to compile them first. Read README.VMS" +$ write sys$output "for further instructions" +$ exit +$ endif +$ Goto Link +$ endif +$! +$! Establish the Compiling Environment +$! +$ COPTS = F$TrnLnm("COPTS") +$ extra_defs = "" +$ CLIB = "" +$ Cpu_Model = F$GetSYI("HW_MODEL") +$ If Cpu_Model .gt. 1024 ! Cross compiling +$ Then +$ CC := CC/PREFIX=ALL/L_DOUBLE=64 +$ OPT_EXT = "DECC_OPT" +$ EXT = "AXP_" +$ Else +$ write sys$error "Ignore the possible %DCL-W-IVQUAL or %CC-W-EMPTYFILE" +$ CC := CC/PREFIX=ALL +$ OPT_EXT = "DECC_OPT" +$ EXT = "VAX_" +$ CLIB = "" +$ Set Noon +$ CC NL:/OBJ=NL: +$ If $status .eq. %x00038240 +$ Then ! no DEC C or the standard is to run VAX C +$ CC := CC/DECC/PREFIX=ALL +$ CC NL:/OBJ=NL: +$ If $status .eq. %x00038240 +$ Then ! no DEC C, meaning VAX C without the /VAXC qualifier +$ CC := CC +$ OPT_EXT = "VAXC_OPT" +$ EXT = "VAX_VAXC_" +$ CLIB = "SYS$SHARE:VAXCRTL/SHARE" +$ extra_defs = extra_defs + ",NO_LOCALE" +$ Endif +$ Endif +$ write sys$error "There, you can look again now..." +$ Endif +$ +$ ! This is a pure hack to circumvent a bug in the file provided by +$ ! Digital. This is so ugly we don't want the user to see what +$ ! really happens. +$ ! But perhaps we'll give him just a little hint, huh? :-) +$ write sys$output "Doing some hackery with XWDFile.h... Sit tight" +$ DEP_XWDFILE = "" +$ if f$search("DECW$UTILS:XWDFILE.H") .nes. "" +$ then +$ open/write foo xwdfile.tpu_tmp +$ write foo "input_file:=GET_INFO(COMMAND_LINE, ""file_name"");" +$ write foo "main_buffer := CREATE_BUFFER (""main"", input_file);" +$ write foo "position (beginning_of (main_buffer));" +$ write foo "loop" +$ write foo " r := search_quietly (""""""copyright.h"""""", FORWARD);" +$ write foo " EXITIF r = 0;" +$ write foo " if beginning_of(r) <> end_of(r)" +$ write foo " then" +$ write foo " erase (r);" +$ write foo " position (r);" +$ write foo " copy_text ("""");" +$ write foo " endif;" +$ write foo " position (end_of (r));" +$ write foo "endloop;" +$ write foo "position (beginning_of (main_buffer));" +$ write foo "loop" +$ write foo " r := search_quietly (LINE_BEGIN + ""struct {"", FORWARD);" +$ write foo " EXITIF r = 0;" +$ write foo " if beginning_of(r) <> end_of(r)" +$ write foo " then" +$ write foo " erase (r);" +$ write foo " position (r);" +$ write foo " copy_text (""typedef struct {"");" +$ write foo " endif;" +$ write foo " position (end_of (r));" +$ write foo "endloop;" +$ write foo "write_file(main_buffer, get_info (command_line, ""output_file""));" +$ write foo "quit;" +$ close foo +$ save_mesg = f$environment("MESSAGE") +$ !set message/nofacility/noidentification/noseverity/notext +$ edit/tpu/nosection/nodisplay - + /command=xwdfile.tpu_tmp/out=xwdfile.h - + decw$utils:xwdfile.h +$ purge xwdfile.h +$ delete xwdfile.tpu_tmp;* +$ set message'save_mesg' +$ DEP_XWDFILE = "XWDFILE.H" +$ write sys$output "There, done." +$ endif +$ +$ if f$search("xwdfile.h") .nes. "" then - + extra_defs = extra_defs + ",HAVE_XWDFILE_H" +$! +$! Get the compiler options via the logical name COPTS +$! +$ cc_options = COPTS + - + "/define=(VMS,XPM,C_ALLOCA,""emacs"",BLOCK_INPUT," + - + "EXIT_ENDSESSION=''EXIT_ENDSESSION'''extra_defs')" + - + "/OBJ=.''EXT'OBJ" +$! +$! Get the linker options via the logical name LOPTS +$! +$ link_options = f$trnlnm("LOPTS") +$! +$! Compile the "C" files +$! +$! procedure target command depends upon +$! CALL MAKE FILE.OBJ "CC ''cc_options' FILE.C" FILE.C +$! +$ write sys$output "Building LEX.C from LEX.L using flex" +$ CALL MAKE LEX.C "FLEX LEX.L" - + LEX.L +$ if f$search("LEXYY.C") .nes. "" +$ then +$ CALL MAKE LEX.C - + "RENAME LEXYY.C LEX.C/LOG" - + LEXYY.C +$ else +$ CALL MAKE LEX.C - + "COPY LEX.C_VMS LEX.C/LOG" - + LEX.C_VMS +$ endif +$ write sys$output - + "Building GRAM.C and GRAM.H from GRAM.Y using bison/def/yacc" +$ CALL MAKE Y_TAB.C "BISON /DEF/YACC GRAM.Y" GRAM.Y +$ if f$search("Y_TAB.C") .nes. "" +$ then +$ CALL MAKE GRAM.C - + "RENAME Y_TAB.C GRAM.C/LOG; RENAME Y_TAB.H GRAM.H/LOG" - + Y_TAB.C Y_TAB.H +$ else +$ CALL MAKE GRAM.C - + "COPY GRAM.C_VMS GRAM.C/LOG; COPY GRAM.H_VMS GRAM.H/LOG" - + GRAM.C_VMS GRAM.H_VMS +$ endif +$ CALL MAKE GRAM.H - + "BISON /DEF/YACC GRAM.Y; DELETE Y_TAB.C.*" - + GRAM.Y +$ if f$search("Y_TAB.H") .nes. "" +$ then +$ CALL MAKE GRAM.H - + "RENAME Y_TAB.H GRAM.H/LOG" - + Y_TAB.H +$ else +$ CALL MAKE GRAM.H - + "COPY GRAM.H_VMS GRAM.H/LOG" - + GRAM.H_VMS +$ endif +$ write sys$output - + "Building DEFTWMRC.C from SYSTEM.CTWMRC using GENDEFTWMRC.COM" +$ CALL MAKE DEFTWMRC.C "@GENDEFTWMRC.COM" SYSTEM.CTWMRC - + GENDEFTWMRC.COM +$ write sys$output "Compiling CTWM sources with CC=",CC +$ CALL MAKE ADD_WINDOW.'EXT'OBJ "CC 'cc_options' ADD_WINDOW.C" ADD_WINDOW.C - + "TWM.H ADD_WINDOW.H UTIL.H RESIZE.H PARSE.H GRAM.H LIST.H EVENTS.H" - + "MENUS.H SCREEN.H ICONS.H ICONMGR.H" - + "LIST.H MENUS.H ICONMGR.H VSCREEN.H WORKMGR.H" +$ CALL MAKE CLICKTOFOCUS.'EXT'OBJ- + "CC 'cc_options' CLICKTOFOCUS.C" CLICKTOFOCUS.C - + "CLICKTOFOCUS.H TWM.H UTIL.H SCREEN.H" - + "LIST.H MENUS.H ICONMGR.H VSCREEN.H WORKMGR.H" +$ CALL MAKE CTWM.'EXT'OBJ "CC 'cc_options' CTWM.C" CTWM.C - + "TWM.H ADD_WINDOW.H GC.H PARSE.H VERSION.H MENUS.H EVENTS.H UTIL.H" - + "GRAM.H SCREEN.H ICONS.H ICONMGR.H" - + "LIST.H MENUS.H ICONMGR.H VSCREEN.H WORKMGR.H" +$ CALL MAKE CURSOR.'EXT'OBJ "CC 'cc_options' CURSOR.C" CURSOR.C - + "TWM.H SCREEN.H UTIL.H" - + "LIST.H MENUS.H ICONMGR.H VSCREEN.H WORKMGR.H" +$ CALL MAKE DEFTWMRC.'EXT'OBJ "CC 'cc_options' DEFTWMRC.C" DEFTWMRC.C +$ CALL MAKE EVENTS.'EXT'OBJ "CC 'cc_options' EVENTS.C" EVENTS.C - + "TWM.H ADD_WINDOW.H MENUS.H EVENTS.H RESIZE.H PARSE.H GRAM.H UTIL.H" - + "SCREEN.H ICONS.H ICONMGR.H VERSION.H" - + "LIST.H MENUS.H ICONMGR.H VSCREEN.H WORKMGR.H" +$ CALL MAKE GC.'EXT'OBJ "CC 'cc_options' GC.C" GC.C - + "TWM.H UTIL.H GRAM.H SCREEN.H" - + "LIST.H MENUS.H ICONMGR.H VSCREEN.H WORKMGR.H" +$ CALL MAKE GRAM.'EXT'OBJ "CC 'cc_options' GRAM.C" GRAM.C - + "TWM.H MENUS.H ICONS.H ADD_WINDOW.H LIST.H UTIL.H SCREEN.H PARSE.H" - + "LIST.H MENUS.H ICONMGR.H VSCREEN.H WORKMGR.H" +$ CALL MAKE ICONMGR.'EXT'OBJ "CC 'cc_options' ICONMGR.C" ICONMGR.C - + "TWM.H UTIL.H PARSE.H SCREEN.H RESIZE.H ADD_WINDOW.H SICONIFY.BM" - + "LIST.H MENUS.H ICONMGR.H VSCREEN.H WORKMGR.H" +$ CALL MAKE ICONS.'EXT'OBJ "CC 'cc_options' ICONS.C" ICONS.C - + "TWM.H SCREEN.H ICONS.H GRAM.H LIST.H PARSE.H UTIL.H" - + "LIST.H MENUS.H ICONMGR.H VSCREEN.H WORKMGR.H" +$ CALL MAKE LEX.'EXT'OBJ "CC 'cc_options' LEX.C" LEX.C - + "GRAM.H PARSE.H" +$ CALL MAKE LIST.'EXT'OBJ "CC 'cc_options' LIST.C" LIST.C - + "TWM.H SCREEN.H GRAM.H UTIL.H" - + "LIST.H MENUS.H ICONMGR.H VSCREEN.H WORKMGR.H" +$ CALL MAKE MENUS.'EXT'OBJ "CC 'cc_options' MENUS.C" MENUS.C - + "TWM.H GC.H MENUS.H RESIZE.H EVENTS.H UTIL.H PARSE.H GRAM.H SCREEN.H" - + "ICONS.H VMS_CMD_SERVICE.H VERSION.H" - + "LIST.H MENUS.H ICONMGR.H VSCREEN.H WORKMGR.H" +$ CALL MAKE PARSE.'EXT'OBJ "CC 'cc_options' PARSE.C" PARSE.C - + "TWM.H SCREEN.H MENUS.H UTIL.H GRAM.H PARSE.H VERSION.H" - + "LIST.H MENUS.H ICONMGR.H VSCREEN.H WORKMGR.H" +$ CALL MAKE RESIZE.'EXT'OBJ "CC 'cc_options' RESIZE.C" RESIZE.C - + "TWM.H PARSE.H UTIL.H RESIZE.H ADD_WINDOW.H SCREEN.H" - + "LIST.H MENUS.H ICONMGR.H VSCREEN.H WORKMGR.H" +$ CALL MAKE UTIL.'EXT'OBJ "CC 'cc_options' UTIL.C" UTIL.C - + "TWM.H UTIL.H GRAM.H SCREEN.H ICONS.H XPM.H SICONIFY.BM" - + "LIST.H MENUS.H ICONMGR.H VSCREEN.H WORKMGR.H ''DEP_XWDFILE'" +$ CALL MAKE VERSION.'EXT'OBJ "CC 'cc_options' VERSION.C" VERSION.C +$ CALL MAKE VSCREEN.'EXT'OBJ "CC 'cc_options' VSCREEN.C" VSCREEN.C - + "TWM.H SCREEN.H" - + "LIST.H MENUS.H ICONMGR.H VSCREEN.H WORKMGR.H" +$ CALL MAKE WORKMGR.'EXT'OBJ "CC 'cc_options' WORKMGR.C" WORKMGR.C - + "TWM.H UTIL.H PARSE.H SCREEN.H ICONS.H RESIZE.H ADD_WINDOW.H EVENTS.H" - + "GRAM.H CLICKTOFOCUS.H" - + "LIST.H MENUS.H ICONMGR.H VSCREEN.H WORKMGR.H" +$ CALL MAKE WINDOWBOX.'EXT'OBJ "CC 'cc_options' WINDOWBOX.C" WINDOWBOX.C - + "TWM.H SCREEN.H WINDOWBOX.H" - + "LIST.H MENUS.H ICONMGR.H VSCREEN.H WORKMGR.H" +$ CALL MAKE VMS_CMD_SERVICES.'EXT'OBJ "CC 'cc_options' VMS_CMD_SERVICES.C" - + VMS_CMD_SERVICES.C VMS_CMD_SERVICES.H LNM.H +$ CALL MAKE LNM.'EXT'OBJ "CC 'cc_options' LNM.C" LNM.C +$ CALL MAKE ALLOCA.'EXT'OBJ "CC 'cc_options' ALLOCA.C" ALLOCA.C +$! +$ Link: ! Link the executable. If all object files aren't here, +$ ! I'm deeply sorry +$ EXE_EXT = EXT - "VAXC_" +$ OPTION := CTWM.'OPT_EXT' +$ OPTION_CMD := ,CTWM.'OPT_EXT'/OPT +$ +$ CALL MAKE VERSION.OPT "CALL MAKEVEROPT VERSION.OPT" VERSION.C - + MAKE.COM +$ CALL MAKE 'OPTION' "CALL MAKELIBOPT ''OPTION' ''F$TRNLNM("X11XMULIB")' ''CLIB'" - + MAKE.COM +$ CALL MAKE OBJS.'EXT'OPT "CALL MAKEOBJOPT OBJS.''EXT'OPT *.''EXT'OBJ" - + *.'EXT'OBJ MAKE.COM +$ write sys$output "Building CTWM image" +$ CALL MAKE CTWM.'EXE_EXT'EXE - + "LINK ''link_options'/EXE=CTWM.''EXE_EXT'EXE OBJS.''EXT'OPT/OPT,VERSION.OPT/OPT ''OPTION_CMD'" - + OBJS.'EXT'OPT 'OPTION' VERSION.OPT +$! +$ deassign xpmlib +$ deassign x11xmu +$ +$ write sys$output "All done" +$! +$ exit +$! +$ Clobber: ! Delete executables, Purge directory and clean up object files and listings +$ Delete/noconfirm/log *.exe;* +$! +$ Clean: ! Purge directory, clean up object files and listings +$ Purge +$ Delete/noconfirm/log *.lis;* +$ Delete/noconfirm/log *.obj;* +$! +$ exit +$! +$MAKE: SUBROUTINE !SUBROUTINE TO CHECK DEPENDENCIES +$ V = 'F$Verify(0) +$! P1 = What we are trying to make +$! P2 = Command to make it +$! P3 - P8 What it depends on +$ +$ If F$Search(P1) .Eqs. "" Then Goto Makeit +$ Time = F$CvTime(F$File(P1,"RDT")) +$arg=3 +$Loop: +$ Argument = P'arg +$ If Argument .Eqs. "" Then Goto NoWork +$ El=0 +$Loop2: +$ File = F$Element(El," ",Argument) +$ If File .Eqs. " " Then Goto Endl +$ AFile = "" +$Loop3: +$ OFile = AFile +$ AFile = F$Search(File) +$ If AFile .Eqs. "" .Or. AFile .Eqs. OFile Then Goto NextEl +$ If F$CvTime(F$File(AFile,"RDT")) .Ges. Time Then Goto Makeit +$ Goto Loop3 +$NextEL: +$ El = El + 1 +$ Goto Loop2 +$EndL: +$ arg=arg+1 +$ If arg .Le. 8 Then Goto Loop +$NoWork: +$ Goto Exit +$ +$BailOut: +$ tmp = $status ! 'F$Verify(0) +$ If V Then Set Verify +$ write sys$error "Exiting with status code ",tmp +$ Exit tmp +$KillMe: +$ If V Then Set Verify +$ write sys$error - + "Exiting because user pressed Ctrl-Y (we do this the ugly way)" +$ Exit 20 +$Makeit: +$ On Error Then Goto BailOut +$ On Control_y Then Goto KillMe +$ _Index = 0 +$Makeit2: +$ _Command = F$Edit(F$Element(_Index,";",P2),"TRIM") +$ _Index = _Index + 1 +$ If _Command .nes. ";" +$ Then +$ If F$Edit(F$Extract(0,5,_Command),"UPCASE") .nes. "CALL " Then Set Verify +$ '_Command +$ VV='F$Verify(0) +$ Goto Makeit2 +$ Endif +$Exit: +$ If V Then Set Verify +$ENDSUBROUTINE +$ +$MAKELIBOPT: SUBROUTINE !SUBROUTINE TO BUILD A LIBRARY OPTIONS FILE +$ V = 'F$Verify(0) +$ goto Makeit2 +$BailOut2: +$ tmp = $status ! 'F$Verify(0) +$ close foo +$ If V Then Set Verify +$ write sys$error "Exiting with status code ",tmp +$ Exit tmp +$Makeit2: +$ On Error Then Goto BailOut2 +$ On Control_y Then Goto BailOut2 +$ write sys$output "Building the library option file ",P1 +$ if p3 .nes. "" then write foo p3 +$ __result := XPMLIB:XPM.OLB +$ if f$search(__result) .eqs. "" then - + __result := XPMLIB:LIBXPM.OLB +$ if EXT .eqs. "VAX_VAXC_" .and. - + f$search("XPMLIB:LIBXPM.OLB_VAXC") .nes. "" then - + __result := XPMLIB:LIBXPM.OLB_VAXC +$ if EXT .eqs. "VAX_" .and. - + f$search("XPMLIB:LIBXPM.OLB_DECC") .nes. "" then - + __result := XPMLIB:LIBXPM.OLB_DECC +$ if EXT .eqs. "AXP_" .and. - + f$search("XPMLIB:LIBXPM.OLB_AXP") .nes. "" then - + __result := XPMLIB:LIBXPM.OLB_AXP +$ if f$search(__result) .eqs. "" then - + libr/list=nl: '__result' +$ open/write foo 'P1' +$ write foo __result,"/LIB" +$ write foo p2 +$ write foo "SYS$SHARE:DECW$XTSHR/SHARE" +$ write foo "SYS$SHARE:DECW$XEXTLIBSHR/SHARE" +$ write foo "SYS$SHARE:DECW$XLIBSHR/SHARE" +$ VV='F$Verify(0) +$Exit2: +$ close foo +$ If V Then Set Verify +$ENDSUBROUTINE +$ +$MAKEVEROPT: SUBROUTINE !SUBROUTINE TO BUILD AN IDENTITY OPTIONS FILE +$ V = 'F$Verify(0) +$ goto Makeit3 +$BailOut3: +$ tmp = $status ! 'F$Verify(0) +$ close foo +$ If V Then Set Verify +$ write sys$error "Exiting with status code ",tmp +$ Exit tmp +$Makeit3: +$ On Error Then Goto BailOut3 +$ On Control_y Then Goto BailOut3 +$ write sys$output "Building the identity option file VERSION.OPT +$ sear version.c "*VersionNumber"/out=version.tmp +$ open/read foo version.tmp +$ read foo line +$ close foo +$ delete version.tmp;* +$ version = f$extract(0,10,f$element(1,"""",line)) +$ open/write foo 'p1' +$ write foo "NAME=""CTWM""" +$ write foo "IDENT=""V''version'""" +$ VV='F$Verify(0) +$Exit3: +$ close foo +$ If V Then Set Verify +$ENDSUBROUTINE +$ +$MAKEOBJOPT: SUBROUTINE !SUBROUTINE TO BUILD AN IDENTITY OPTIONS FILE +$ V = 'F$Verify(0) +$ goto OBJ_Makeit +$OBJ_BailOut: +$ tmp = $status ! 'F$Verify(0) +$ close foo +$ If V Then Set Verify +$ write sys$error "Exiting with status code ",tmp +$ Exit tmp +$OBJ_Makeit: +$ On Error Then Goto OBJ_BailOut +$ On Control_y Then Goto OBJ_BailOut +$ write sys$output "Building object option file ",p1 +$ open/write foo 'p1' +$ OFile = "" +$OBJ_Loop: +$ AFile = F$Search(P2) +$! DEBUG: P2 = 'P2' +$! DEBUG: AFile = 'AFile' +$ if OFile .nes. "" +$ then +$ if AFile .nes. "" +$ then +$ write foo OFile,",-" +$ else +$ write foo OFile +$ endif +$ endif +$ OFile = F$Parse(AFile,,,"NAME") + F$Parse(AFile,,,"TYPE") +$ if AFile .nes. "" then goto OBJ_Loop +$ VV='F$Verify(0) +$OBJ_Exit: +$ close foo +$ If V Then Set Verify +$ENDSUBROUTINE Index: external/mit/ctwm/dist/menus.c =================================================================== RCS file: external/mit/ctwm/dist/menus.c diff -N external/mit/ctwm/dist/menus.c --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/menus.c 3 Sep 2015 12:19:57 -0000 @@ -0,0 +1,5591 @@ +/*****************************************************************************/ +/** Copyright 1988 by Evans & Sutherland Computer Corporation, **/ +/** Salt Lake City, Utah **/ +/** Portions Copyright 1989 by the Massachusetts Institute of Technology **/ +/** Cambridge, Massachusetts **/ +/** **/ +/** All Rights Reserved **/ +/** **/ +/** Permission to use, copy, modify, and distribute this software and **/ +/** its documentation for any purpose and without fee is hereby **/ +/** granted, provided that the above copyright notice appear in all **/ +/** copies and that both that copyright notice and this permis- **/ +/** sion notice appear in supporting documentation, and that the **/ +/** names of Evans & Sutherland and M.I.T. not be used in advertising **/ +/** in publicity pertaining to distribution of the software without **/ +/** specific, written prior permission. **/ +/** **/ +/** EVANS & SUTHERLAND AND M.I.T. DISCLAIM ALL WARRANTIES WITH REGARD **/ +/** TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANT- **/ +/** ABILITY AND FITNESS, IN NO EVENT SHALL EVANS & SUTHERLAND OR **/ +/** M.I.T. BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAM- **/ +/** AGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA **/ +/** OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER **/ +/** TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE **/ +/** OR PERFORMANCE OF THIS SOFTWARE. **/ +/*****************************************************************************/ +/* + * [ ctwm ] + * + * Copyright 1992 Claude Lecommandeur. + * + * Permission to use, copy, modify and distribute this software [ctwm] and + * its documentation for any purpose is hereby granted without fee, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting documen- + * tation, and that the name of Claude Lecommandeur not be used in adverti- + * sing or publicity pertaining to distribution of the software without + * specific, written prior permission. Claude Lecommandeur make no represen- + * tations about the suitability of this software for any purpose. It is + * provided "as is" without express or implied warranty. + * + * Claude Lecommandeur DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO + * EVENT SHALL Claude Lecommandeur BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF + * USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR + * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + * + * Author: Claude Lecommandeur [ lecom@sic.epfl.ch ][ April 1992 ] + */ + + +/*********************************************************************** + * + * $XConsortium: menus.c,v 1.186 91/07/17 13:58:00 dave Exp $ + * + * twm menu code + * + * 17-Nov-87 Thomas E. LaStrange File created + * + * Do the necessary modification to be integrated in ctwm. + * Can no longer be used for the standard twm. + * + * 22-April-92 Claude Lecommandeur. + * + * + ***********************************************************************/ + +#if defined(USE_SIGNALS) && defined(__sgi) +# define _BSD_SIGNALS +#endif + +#include +#include + +#ifdef VMS +#include +#include +#include +#include +#include +#include +#else +#include +#include +#endif +#include "twm.h" +#include "ctwm.h" +#include "gc.h" +#include "menus.h" +#include "resize.h" +#include "events.h" +#include "list.h" +#include "util.h" +#include "parse.h" +#include "screen.h" +#include "icons.h" +#include "add_window.h" +#include "windowbox.h" +#include "workmgr.h" +#include "cursor.h" +#include "gnomewindefs.h" +#ifdef SOUNDS +# include "sound.h" +#endif +#ifdef VMS +# include +# include +# include +# include "vms_cmd_services.h" +# include +#else +# include +# include +#endif +#include "version.h" + +#if defined(MACH) || defined(__MACH__) || defined(sony_news) || defined(NeXT) +#define lrand48 random +#endif +#if defined(VMS) || defined(__DARWIN__) +#define lrand48 rand +#endif + +#ifndef VMS +#define MAX(x,y) ((x)>(y)?(x):(y)) +#define MIN(x,y) ((x)<(y)?(x):(y)) +#endif +#define ABS(x) ((x)<0?-(x):(x)) + +int RootFunction = 0; +MenuRoot *ActiveMenu = NULL; /* the active menu */ +MenuItem *ActiveItem = NULL; /* the active menu item */ +int MoveFunction; /* either F_MOVE or F_FORCEMOVE */ +int WindowMoved = FALSE; +int menuFromFrameOrWindowOrTitlebar = FALSE; +char *CurrentSelectedWorkspace; +int AlternateKeymap; +Bool AlternateContext; + +extern char *captivename; + +int ConstMove = FALSE; /* constrained move variables */ +int ConstMoveDir; +int ConstMoveX; +int ConstMoveY; +int ConstMoveXL; +int ConstMoveXR; +int ConstMoveYT; +int ConstMoveYB; + +/* Globals used to keep track of whether the mouse has moved during + a resize function. */ +int ResizeOrigX; +int ResizeOrigY; + +int MenuDepth = 0; /* number of menus up */ +static struct { + int x; + int y; +} MenuOrigins[MAXMENUDEPTH]; +static Cursor LastCursor; +static Bool addingdefaults = False; + +void jump (TwmWindow *tmp_win, int direction, char *action); +void waitamoment (float timeout); + +extern char *Action; +extern int Context; +extern TwmWindow *ButtonWindow, *Tmp_win; +extern XEvent ButtonEvent; +extern char *InitFile; +extern int ConstrainedMoveTime; +static void Identify (TwmWindow *t); + +#define SHADOWWIDTH 5 /* in pixels */ + +#ifdef GNOME + extern Atom _XA_WIN_STATE; +#endif /* GNOME */ + + + +/*********************************************************************** + * + * Procedure: + * InitMenus - initialize menu roots + * + *********************************************************************** + */ + +void InitMenus(void) +{ + Scr->DefaultFunction.func = 0; + Scr->WindowFunction.func = 0; + Scr->ChangeWorkspaceFunction.func = 0; + Scr->DeIconifyFunction.func = 0; + Scr->IconifyFunction.func = 0; + + Scr->FuncKeyRoot.next = NULL; + Scr->FuncButtonRoot.next = NULL; +} + + + +/*********************************************************************** + * + * Procedure: + * AddFuncKey - add a function key to the list + * + * Inputs: + * name - the name of the key + * cont - the context to look for the key press in + * mods - modifier keys that need to be pressed + * func - the function to perform + * win_name- the window name (if any) + * action - the action string associated with the function (if any) + * + *********************************************************************** + */ + +Bool AddFuncKey (char *name, int cont, int mods, int func, + MenuRoot *menu, char *win_name, char *action) +{ + FuncKey *tmp; + KeySym keysym; + KeyCode keycode; + + /* + * Don't let a 0 keycode go through, since that means AnyKey to the + * XGrabKey call in GrabKeys(). + */ + if ((keysym = XStringToKeysym(name)) == NoSymbol || + (keycode = XKeysymToKeycode(dpy, keysym)) == 0) + { + return False; + } + + /* see if there already is a key defined for this context */ + for (tmp = Scr->FuncKeyRoot.next; tmp != NULL; tmp = tmp->next) + { + if (tmp->keysym == keysym && + tmp->cont == cont && + tmp->mods == mods) + break; + } + if (tmp && addingdefaults) return (True); + + if (tmp == NULL) + { + tmp = (FuncKey *) malloc(sizeof(FuncKey)); + tmp->next = Scr->FuncKeyRoot.next; + Scr->FuncKeyRoot.next = tmp; + } + + tmp->name = name; + tmp->keysym = keysym; + tmp->keycode = keycode; + tmp->cont = cont; + tmp->mods = mods; + tmp->func = func; + tmp->menu = menu; + tmp->win_name = win_name; + tmp->action = action; + + return True; +} + +/*********************************************************************** + * + * Procedure: + * AddFuncButton - add a function button to the list + * + * Inputs: + * num - the num of the button + * cont - the context to look for the key press in + * mods - modifier keys that need to be pressed + * func - the function to perform + * menu - the menu (if any) + * item - the menu item (if any) + * + *********************************************************************** + */ + +Bool AddFuncButton (int num, int cont, int mods, int func, + MenuRoot *menu, MenuItem *item) +{ + FuncButton *tmp; + + /* see if there already is a key defined for this context */ + for (tmp = Scr->FuncButtonRoot.next; tmp != NULL; tmp = tmp->next) { + if ((tmp->num == num) && (tmp->cont == cont) && (tmp->mods == mods)) + break; + } + if (tmp && addingdefaults) return (True); + + if (tmp == NULL) { + tmp = (FuncButton*) malloc (sizeof (FuncButton)); + tmp->next = Scr->FuncButtonRoot.next; + Scr->FuncButtonRoot.next = tmp; + } + + tmp->num = num; + tmp->cont = cont; + tmp->mods = mods; + tmp->func = func; + tmp->menu = menu; + tmp->item = item; + + return True; +} + + + +static TitleButton *cur_tb = NULL; + +void ModifyCurrentTB(int button, int mods, int func, char *action, + MenuRoot *menuroot) +{ + TitleButtonFunc *tbf; + + if (!cur_tb) { + fprintf (stderr, "%s: can't find titlebutton\n", ProgramName); + return; + } + for (tbf = cur_tb->funs; tbf; tbf = tbf->next) { + if (tbf->num == button && tbf->mods == mods) + break; + } + if (!tbf) { + tbf = (TitleButtonFunc *)malloc(sizeof(TitleButtonFunc)); + if (!tbf) { + fprintf (stderr, "%s: out of memory\n", ProgramName); + return; + } + tbf->next = cur_tb->funs; + cur_tb->funs = tbf; + } + tbf->num = button; + tbf->mods = mods; + tbf->func = func; + tbf->action = action; + tbf->menuroot = menuroot; +} + +int CreateTitleButton (char *name, int func, char *action, MenuRoot *menuroot, + Bool rightside, Bool append) +{ + int button; + cur_tb = (TitleButton *) malloc (sizeof(TitleButton)); + + if (!cur_tb) { + fprintf (stderr, + "%s: unable to allocate %lu bytes for title button\n", + ProgramName, (unsigned long) sizeof(TitleButton)); + return 0; + } + + cur_tb->next = NULL; + cur_tb->name = name; /* note that we are not copying */ + cur_tb->image = None; /* WARNING, values not set yet */ + cur_tb->width = 0; /* see InitTitlebarButtons */ + cur_tb->height = 0; /* ditto */ + cur_tb->rightside = rightside; + cur_tb->funs = NULL; + if (rightside) { + Scr->TBInfo.nright++; + } else { + Scr->TBInfo.nleft++; + } + + for(button = 0; button < MAX_BUTTONS; button++){ + ModifyCurrentTB(button + 1, 0, func, action, menuroot); + } + + /* + * Cases for list: + * + * 1. empty list, prepend left put at head of list + * 2. append left, prepend right put in between left and right + * 3. append right put at tail of list + * + * Do not refer to widths and heights yet since buttons not created + * (since fonts not loaded and heights not known). + */ + if ((!Scr->TBInfo.head) || ((!append) && (!rightside))) { /* 1 */ + cur_tb->next = Scr->TBInfo.head; + Scr->TBInfo.head = cur_tb; + } else if (append && rightside) { /* 3 */ + register TitleButton *t; + for /* SUPPRESS 530 */ + (t = Scr->TBInfo.head; t->next; t = t->next); + t->next = cur_tb; + cur_tb->next = NULL; + } else { /* 2 */ + register TitleButton *t, *prev = NULL; + for (t = Scr->TBInfo.head; t && !t->rightside; t = t->next) { + prev = t; + } + if (prev) { + cur_tb->next = prev->next; + prev->next = cur_tb; + } else { + cur_tb->next = Scr->TBInfo.head; + Scr->TBInfo.head = cur_tb; + } + } + + return 1; +} + + + +/* + * InitTitlebarButtons - Do all the necessary stuff to load in a titlebar + * button. If we can't find the button, then put in a question; if we can't + * find the question mark, something is wrong and we are probably going to be + * in trouble later on. + */ +void InitTitlebarButtons (void) +{ + TitleButton *tb; + int h; + + /* + * initialize dimensions + */ + Scr->TBInfo.width = (Scr->TitleHeight - + 2 * (Scr->FramePadding + Scr->ButtonIndent)); + if (Scr->use3Dtitles) + Scr->TBInfo.pad = ((Scr->TitlePadding > 1) + ? ((Scr->TitlePadding + 1) / 2) : 0); + else + Scr->TBInfo.pad = ((Scr->TitlePadding > 1) + ? ((Scr->TitlePadding + 1) / 2) : 1); + h = Scr->TBInfo.width - 2 * Scr->TBInfo.border; + + /* + * add in some useful buttons and bindings so that novices can still + * use the system. + */ + if (!Scr->NoDefaults) { + /* insert extra buttons */ + if (Scr->use3Dtitles) { + if (!CreateTitleButton (TBPM_3DDOT, F_ICONIFY, "", (MenuRoot *) NULL, + False, False)) { + fprintf (stderr, "%s: unable to add iconify button\n", ProgramName); + } + if (!CreateTitleButton (TBPM_3DRESIZE, F_RESIZE, "", (MenuRoot *) NULL, + True, True)) { + fprintf (stderr, "%s: unable to add resize button\n", ProgramName); + } + } + else { + if (!CreateTitleButton (TBPM_ICONIFY, F_ICONIFY, "", (MenuRoot *) NULL, + False, False)) { + fprintf (stderr, "%s: unable to add iconify button\n", ProgramName); + } + if (!CreateTitleButton (TBPM_RESIZE, F_RESIZE, "", (MenuRoot *) NULL, + True, True)) { + fprintf (stderr, "%s: unable to add resize button\n", ProgramName); + } + } + addingdefaults = True; + AddDefaultBindings (); + addingdefaults = False; + } + ComputeCommonTitleOffsets (); + + /* + * load in images and do appropriate centering + */ + + for (tb = Scr->TBInfo.head; tb; tb = tb->next) { + tb->image = GetImage (tb->name, Scr->TitleC); + if (!tb->image) { + tb->image = GetImage (TBPM_QUESTION, Scr->TitleC); + if (!tb->image) { /* cannot happen (see util.c) */ + fprintf (stderr, "%s: unable to add titlebar button \"%s\"\n", + ProgramName, tb->name); + } + } + tb->width = tb->image->width; + tb->height = tb->image->height; + tb->dstx = (h - tb->width + 1) / 2; + if (tb->dstx < 0) { /* clip to minimize copying */ + tb->srcx = -(tb->dstx); + tb->width = h; + tb->dstx = 0; + } else { + tb->srcx = 0; + } + tb->dsty = (h - tb->height + 1) / 2; + if (tb->dsty < 0) { + tb->srcy = -(tb->dsty); + tb->height = h; + tb->dsty = 0; + } else { + tb->srcy = 0; + } + } +} + + +void PaintEntry(MenuRoot *mr, MenuItem *mi, int exposure) +{ + if (Scr->use3Dmenus) + Paint3DEntry (mr, mi, exposure); + else + PaintNormalEntry (mr, mi, exposure); + if (mi->state) mr->lastactive = mi; +} + +void Paint3DEntry(MenuRoot *mr, MenuItem *mi, int exposure) +{ + int y_offset; + int text_y; + GC gc; + + y_offset = mi->item_num * Scr->EntryHeight + Scr->MenuShadowDepth; + text_y = y_offset + Scr->MenuFont.y + 2; + + if (mi->func != F_TITLE) { + int x, y; + + gc = Scr->NormalGC; + if (mi->state) { + Draw3DBorder (mr->w, Scr->MenuShadowDepth, y_offset, + mr->width - 2 * Scr->MenuShadowDepth, Scr->EntryHeight, 1, + mi->highlight, off, True, False); + FB(mi->highlight.fore, mi->highlight.back); + XmbDrawImageString(dpy, mr->w, Scr->MenuFont.font_set, gc, + mi->x + Scr->MenuShadowDepth, text_y, mi->item, mi->strlen); + } + else { + if (mi->user_colors || !exposure) { + XSetForeground (dpy, gc, mi->normal.back); + XFillRectangle (dpy, mr->w, gc, + Scr->MenuShadowDepth, y_offset, + mr->width - 2 * Scr->MenuShadowDepth, Scr->EntryHeight); + FB (mi->normal.fore, mi->normal.back); + } + else { + gc = Scr->MenuGC; + } + XmbDrawImageString (dpy, mr->w, Scr->MenuFont.font_set, gc, + mi->x + Scr->MenuShadowDepth, text_y, + mi->item, mi->strlen); + if (mi->separated) { + FB (Scr->MenuC.shadd, Scr->MenuC.shadc); + XDrawLine (dpy, mr->w, Scr->NormalGC, + Scr->MenuShadowDepth, + y_offset + Scr->EntryHeight - 2, + mr->width - Scr->MenuShadowDepth, + y_offset + Scr->EntryHeight - 2); + FB (Scr->MenuC.shadc, Scr->MenuC.shadd); + XDrawLine (dpy, mr->w, Scr->NormalGC, + Scr->MenuShadowDepth, + y_offset + Scr->EntryHeight - 1, + mr->width - Scr->MenuShadowDepth, + y_offset + Scr->EntryHeight - 1); + } + } + + if (mi->func == F_MENU) { + /* create the pull right pixmap if needed */ + if (Scr->pullPm == None) + { + Scr->pullPm = Create3DMenuIcon (Scr->MenuFont.height, &Scr->pullW, + &Scr->pullH, Scr->MenuC); + } + x = mr->width - Scr->pullW - Scr->MenuShadowDepth - 2; + y = y_offset + ((Scr->MenuFont.height - Scr->pullH) / 2) + 2; + XCopyArea (dpy, Scr->pullPm, mr->w, gc, 0, 0, Scr->pullW, Scr->pullH, x, y); + } + } + else + { + Draw3DBorder (mr->w, Scr->MenuShadowDepth, y_offset, + mr->width - 2 * Scr->MenuShadowDepth, Scr->EntryHeight, 1, + mi->normal, off, True, False); + FB (mi->normal.fore, mi->normal.back); + XmbDrawImageString(dpy, mr->w, Scr->MenuFont.font_set, Scr->NormalGC, + mi->x + 2, text_y, mi->item, mi->strlen); + } +} + + + +void PaintNormalEntry(MenuRoot *mr, MenuItem *mi, int exposure) +{ + int y_offset; + int text_y; + GC gc; + + y_offset = mi->item_num * Scr->EntryHeight; + text_y = y_offset + Scr->MenuFont.y; + + if (mi->func != F_TITLE) + { + int x, y; + + if (mi->state) + { + XSetForeground(dpy, Scr->NormalGC, mi->highlight.back); + + XFillRectangle(dpy, mr->w, Scr->NormalGC, 0, y_offset, + mr->width, Scr->EntryHeight); + FB(mi->highlight.fore, mi->highlight.back); + XmbDrawString(dpy, mr->w, Scr->MenuFont.font_set, Scr->NormalGC, + mi->x, text_y, mi->item, mi->strlen); + + gc = Scr->NormalGC; + } + else + { + if (mi->user_colors || !exposure) + { + XSetForeground(dpy, Scr->NormalGC, mi->normal.back); + + XFillRectangle(dpy, mr->w, Scr->NormalGC, 0, y_offset, + mr->width, Scr->EntryHeight); + + FB(mi->normal.fore, mi->normal.back); + gc = Scr->NormalGC; + } + else { + gc = Scr->MenuGC; + } + XmbDrawString(dpy, mr->w, Scr->MenuFont.font_set, gc, mi->x, + text_y, mi->item, mi->strlen); + if (mi->separated) + XDrawLine (dpy, mr->w, gc, 0, y_offset + Scr->EntryHeight - 1, + mr->width, y_offset + Scr->EntryHeight - 1); + } + + if (mi->func == F_MENU) + { + /* create the pull right pixmap if needed */ + if (Scr->pullPm == None) + { + Scr->pullPm = CreateMenuIcon (Scr->MenuFont.height, + &Scr->pullW, &Scr->pullH); + } + x = mr->width - Scr->pullW - 5; + y = y_offset + ((Scr->MenuFont.height - Scr->pullH) / 2); + XCopyPlane(dpy, Scr->pullPm, mr->w, gc, 0, 0, + Scr->pullW, Scr->pullH, x, y, 1); + } + } + else + { + int y; + + XSetForeground(dpy, Scr->NormalGC, mi->normal.back); + + /* fill the rectangle with the title background color */ + XFillRectangle(dpy, mr->w, Scr->NormalGC, 0, y_offset, + mr->width, Scr->EntryHeight); + + { + XSetForeground(dpy, Scr->NormalGC, mi->normal.fore); + /* now draw the dividing lines */ + if (y_offset) + XDrawLine (dpy, mr->w, Scr->NormalGC, 0, y_offset, + mr->width, y_offset); + y = ((mi->item_num+1) * Scr->EntryHeight)-1; + XDrawLine(dpy, mr->w, Scr->NormalGC, 0, y, mr->width, y); + } + + FB(mi->normal.fore, mi->normal.back); + /* finally render the title */ + XmbDrawString(dpy, mr->w, Scr->MenuFont.font_set, Scr->NormalGC, mi->x, + text_y, mi->item, mi->strlen); + } +} + +void PaintMenu(MenuRoot *mr, XEvent *e) +{ + MenuItem *mi; + + if (Scr->use3Dmenus) { + Draw3DBorder (mr->w, 0, 0, mr->width, mr->height, + Scr->MenuShadowDepth, Scr->MenuC, off, False, False); + } + for (mi = mr->first; mi != NULL; mi = mi->next) + { + int y_offset = mi->item_num * Scr->EntryHeight; + + /* be smart about handling the expose, redraw only the entries + * that we need to + */ + if (e->xexpose.y <= (y_offset + Scr->EntryHeight) && + (e->xexpose.y + e->xexpose.height) >= y_offset) + { + PaintEntry(mr, mi, True); + } + } + XSync(dpy, 0); +} + + + +void MakeWorkspacesMenu (void) +{ + static char **actions = NULL; + WorkSpace *wlist; + char **act; + + if (! Scr->Workspaces) return; + AddToMenu (Scr->Workspaces, "TWM Workspaces", NULLSTR, NULL, F_TITLE, NULLSTR, NULLSTR); + if (! actions) { + int count = 0; + + for (wlist = Scr->workSpaceMgr.workSpaceList; wlist != NULL; wlist = wlist->next) { + count++; + } + count++; + actions = (char**) malloc (count * sizeof (char*)); + act = actions; + for (wlist = Scr->workSpaceMgr.workSpaceList; wlist != NULL; wlist = wlist->next) { + *act = (char*) malloc (strlen ("WGOTO : ") + strlen (wlist->name) + 1); + sprintf (*act, "WGOTO : %s", wlist->name); + act++; + } + *act = NULL; + } + act = actions; + for (wlist = Scr->workSpaceMgr.workSpaceList; wlist != NULL; wlist = wlist->next) { + AddToMenu (Scr->Workspaces, wlist->name, *act, Scr->Windows, F_MENU, NULL, NULL); + act++; + } + Scr->Workspaces->pinned = False; + MakeMenu (Scr->Workspaces); +} + +static Bool fromMenu; + +int UpdateMenu(void) +{ + MenuItem *mi; + int i, x, y, x_root, y_root, entry; + int done; + MenuItem *badItem = NULL; + + fromMenu = TRUE; + + while (TRUE) + { + /* block until there is an event */ + if (!menuFromFrameOrWindowOrTitlebar) { + XMaskEvent(dpy, + ButtonPressMask | ButtonReleaseMask | + KeyPressMask | KeyReleaseMask | + EnterWindowMask | ExposureMask | + VisibilityChangeMask | LeaveWindowMask | + ButtonMotionMask, &Event); + } + if (Event.type == MotionNotify) { + /* discard any extra motion events before a release */ + while(XCheckMaskEvent(dpy, + ButtonMotionMask | ButtonReleaseMask, &Event)) + if (Event.type == ButtonRelease) + break; + } + + if (!DispatchEvent ()) + continue; + + if ((! ActiveMenu) || Cancel) { + menuFromFrameOrWindowOrTitlebar = FALSE; + fromMenu = FALSE; + return (0); + } + + if (Event.type != MotionNotify) + continue; + + done = FALSE; + XQueryPointer( dpy, ActiveMenu->w, &JunkRoot, &JunkChild, + &x_root, &y_root, &x, &y, &JunkMask); + + /* if we haven't recieved the enter notify yet, wait */ + if (ActiveMenu && !ActiveMenu->entered) + continue; + + XFindContext(dpy, ActiveMenu->w, ScreenContext, (XPointer *)&Scr); + + if (x < 0 || y < 0 || + x >= ActiveMenu->width || y >= ActiveMenu->height) + { + if (ActiveItem && ActiveItem->func != F_TITLE) + { + ActiveItem->state = 0; + PaintEntry(ActiveMenu, ActiveItem, False); + } + ActiveItem = NULL; + continue; + } + + /* look for the entry that the mouse is in */ + entry = y / Scr->EntryHeight; + for (i = 0, mi = ActiveMenu->first; mi != NULL; i++, mi=mi->next) + { + if (i == entry) + break; + } + + /* if there is an active item, we might have to turn it off */ + if (ActiveItem) + { + /* is the active item the one we are on ? */ + if (ActiveItem->item_num == entry && ActiveItem->state) + done = TRUE; + + /* if we weren't on the active entry, let's turn the old + * active one off + */ + if (!done && ActiveItem->func != F_TITLE) + { + ActiveItem->state = 0; + PaintEntry(ActiveMenu, ActiveItem, False); + } + } + + /* if we weren't on the active item, change the active item and turn + * it on + */ + if (!done) + { + ActiveItem = mi; + if (ActiveItem && ActiveItem->func != F_TITLE && !ActiveItem->state) + { + ActiveItem->state = 1; + PaintEntry(ActiveMenu, ActiveItem, False); + } + } + + /* now check to see if we were over the arrow of a pull right entry */ + if (ActiveItem && ActiveItem->func == F_MENU && + ((ActiveMenu->width - x) < (ActiveMenu->width / 3))) + { + MenuRoot *save = ActiveMenu; + int savex = MenuOrigins[MenuDepth - 1].x; + int savey = MenuOrigins[MenuDepth - 1].y; + + if (MenuDepth < MAXMENUDEPTH) { + if (ActiveMenu == Scr->Workspaces) + CurrentSelectedWorkspace = ActiveItem->item; + PopUpMenu (ActiveItem->sub, + (savex + (((2 * ActiveMenu->width) / 3) - 1)), + (savey + ActiveItem->item_num * Scr->EntryHeight) + /*(savey + ActiveItem->item_num * Scr->EntryHeight + + (Scr->EntryHeight >> 1))*/, False); + CurrentSelectedWorkspace = NULL; + } else if (!badItem) { + XBell (dpy, 0); + badItem = ActiveItem; + } + + /* if the menu did get popped up, unhighlight the active item */ + if (save != ActiveMenu && ActiveItem->state) + { + ActiveItem->state = 0; + PaintEntry(save, ActiveItem, False); + ActiveItem = NULL; + } + } + if (badItem != ActiveItem) badItem = NULL; + XFlush(dpy); + } +} + + + +/*********************************************************************** + * + * Procedure: + * NewMenuRoot - create a new menu root + * + * Returned Value: + * (MenuRoot *) + * + * Inputs: + * name - the name of the menu root + * + *********************************************************************** + */ + +MenuRoot *NewMenuRoot(char *name) +{ + MenuRoot *tmp; + +#define UNUSED_PIXEL ((unsigned long) (~0)) /* more than 24 bits */ + + tmp = (MenuRoot *) malloc(sizeof(MenuRoot)); + tmp->highlight.fore = UNUSED_PIXEL; + tmp->highlight.back = UNUSED_PIXEL; + tmp->name = name; + tmp->prev = NULL; + tmp->first = NULL; + tmp->last = NULL; + tmp->defaultitem = NULL; + tmp->items = 0; + tmp->width = 0; + tmp->mapped = NEVER_MAPPED; + tmp->pull = FALSE; + tmp->w = None; + tmp->shadow = None; + tmp->real_menu = FALSE; + + if (Scr->MenuList == NULL) + { + Scr->MenuList = tmp; + Scr->MenuList->next = NULL; + } + + if (Scr->LastMenu == NULL) + { + Scr->LastMenu = tmp; + Scr->LastMenu->next = NULL; + } + else + { + Scr->LastMenu->next = tmp; + Scr->LastMenu = tmp; + Scr->LastMenu->next = NULL; + } + + if (strcmp(name, TWM_WINDOWS) == 0) + Scr->Windows = tmp; + + if (strcmp(name, TWM_ICONS) == 0) + Scr->Icons = tmp; + + if (strcmp(name, TWM_WORKSPACES) == 0) { + Scr->Workspaces = tmp; + if (!Scr->Windows) NewMenuRoot (TWM_WINDOWS); + } + if (strcmp(name, TWM_ALLWINDOWS) == 0) + Scr->AllWindows = tmp; + + /* Added by dl 2004 */ + if (strcmp(name, TWM_ALLICONS) == 0) + Scr->AllIcons = tmp; + + /* Added by Dan Lilliehorn (dl@dl.nu) 2000-02-29 */ + if (strcmp(name, TWM_KEYS) == 0) + Scr->Keys = tmp; + + if (strcmp(name, TWM_VISIBLE) == 0) + Scr->Visible = tmp; + + /* End addition */ + + return (tmp); +} + + + +/*********************************************************************** + * + * Procedure: + * AddToMenu - add an item to a root menu + * + * Returned Value: + * (MenuItem *) + * + * Inputs: + * menu - pointer to the root menu to add the item + * item - the text to appear in the menu + * action - the string to possibly execute + * sub - the menu root if it is a pull-right entry + * func - the numeric function + * fore - foreground color string + * back - background color string + * + *********************************************************************** + */ + +MenuItem *AddToMenu(MenuRoot *menu, char *item, char *action, + MenuRoot *sub, int func, char *fore, char *back) +{ + MenuItem *tmp; + int width; + char *itemname; + XRectangle ink_rect; + XRectangle logical_rect; + +#ifdef DEBUG_MENUS + fprintf(stderr, "adding menu item=\"%s\", action=%s, sub=%d, f=%d\n", + item, action, sub, func); +#endif + + tmp = (MenuItem *) malloc(sizeof(MenuItem)); + tmp->root = menu; + + if (menu->first == NULL) + { + menu->first = tmp; + tmp->prev = NULL; + } + else + { + menu->last->next = tmp; + tmp->prev = menu->last; + } + menu->last = tmp; + + if ((menu == Scr->Workspaces) || + (menu == Scr->Windows) || + (menu == Scr->Icons) || + (menu == Scr->AllWindows) || + + /* Added by dl 2004 */ + (menu == Scr->AllIcons) || + + /* Added by Dan Lillehorn (dl@dl.nu) 2000-02-29 */ + (menu == Scr->Keys) || + (menu == Scr->Visible)) { + + itemname = item; + } else + if (*item == '*') { + itemname = item + 1; + menu->defaultitem = tmp; + } + else { + itemname = item; + } + + tmp->item = itemname; + tmp->strlen = strlen(itemname); + tmp->action = action; + tmp->next = NULL; + tmp->sub = NULL; + tmp->state = 0; + tmp->func = func; + tmp->separated = 0; + + if (!Scr->HaveFonts) CreateFonts(); + + XmbTextExtents(Scr->MenuFont.font_set, + itemname, tmp->strlen, + &ink_rect, &logical_rect); + width = logical_rect.width; + + if (width <= 0) + width = 1; + if (width > menu->width) + menu->width = width; + + tmp->user_colors = FALSE; + if (Scr->Monochrome == COLOR && fore != NULL) + { + int save; + + save = Scr->FirstTime; + Scr->FirstTime = TRUE; + GetColor(COLOR, &tmp->normal.fore, fore); + GetColor(COLOR, &tmp->normal.back, back); + if (Scr->use3Dmenus && !Scr->BeNiceToColormap) GetShadeColors (&tmp->normal); + Scr->FirstTime = save; + tmp->user_colors = TRUE; + } + if (sub != NULL) + { + tmp->sub = sub; + menu->pull = TRUE; + } + tmp->item_num = menu->items++; + + return (tmp); +} + + +void MakeMenus(void) +{ + MenuRoot *mr; + + for (mr = Scr->MenuList; mr != NULL; mr = mr->next) + { + if (mr->real_menu == FALSE) + continue; + + mr->pinned = False; + MakeMenu(mr); + } +} + + + +int MakeMenu(MenuRoot *mr) +{ + MenuItem *start, *end, *cur, *tmp; + XColor f1, f2, f3; + XColor b1, b2, b3; + XColor save_fore, save_back; + int num, i; + int fred, fgreen, fblue; + int bred, bgreen, bblue; + int width, borderwidth; + unsigned long valuemask; + XSetWindowAttributes attributes; + Colormap cmap = Scr->RootColormaps.cwins[0]->colormap->c; + XRectangle ink_rect; + XRectangle logical_rect; + + Scr->EntryHeight = Scr->MenuFont.height + 4; + + /* lets first size the window accordingly */ + if (mr->mapped == NEVER_MAPPED) + { + if (mr->pull == TRUE) { + mr->width += 16 + 10; + } + width = mr->width + 10; + for (cur = mr->first; cur != NULL; cur = cur->next) { + if (cur->func != F_TITLE) + cur->x = 5; + else { + XmbTextExtents(Scr->MenuFont.font_set, cur->item, cur->strlen, + &ink_rect, &logical_rect); + cur->x = width - logical_rect.width; + cur->x /= 2; + } + } + mr->height = mr->items * Scr->EntryHeight; + mr->width += 10; + if (Scr->use3Dmenus) { + mr->width += 2 * Scr->MenuShadowDepth; + mr->height += 2 * Scr->MenuShadowDepth; + } + if (Scr->Shadow && ! mr->pinned) + { + /* + * Make sure that you don't draw into the shadow window or else + * the background bits there will get saved + */ + valuemask = (CWBackPixel | CWBorderPixel); + attributes.background_pixel = Scr->MenuShadowColor; + attributes.border_pixel = Scr->MenuShadowColor; + if (Scr->SaveUnder) { + valuemask |= CWSaveUnder; + attributes.save_under = True; + } + mr->shadow = XCreateWindow (dpy, Scr->Root, 0, 0, + (unsigned int) mr->width, + (unsigned int) mr->height, + (unsigned int)0, + CopyFromParent, + (unsigned int) CopyFromParent, + (Visual *) CopyFromParent, + valuemask, &attributes); + } + + valuemask = (CWBackPixel | CWBorderPixel | CWEventMask); + attributes.background_pixel = Scr->MenuC.back; + attributes.border_pixel = Scr->MenuC.fore; + if (mr->pinned) { + attributes.event_mask = (ExposureMask | EnterWindowMask + | LeaveWindowMask | ButtonPressMask + | ButtonReleaseMask | PointerMotionMask + | ButtonMotionMask + ); + attributes.cursor = Scr->MenuCursor; + valuemask |= CWCursor; + } + else + attributes.event_mask = (ExposureMask | EnterWindowMask); + + if (Scr->SaveUnder && ! mr->pinned) { + valuemask |= CWSaveUnder; + attributes.save_under = True; + } + if (Scr->BackingStore) { + valuemask |= CWBackingStore; + attributes.backing_store = Always; + } + borderwidth = Scr->use3Dmenus ? 0 : 1; + mr->w = XCreateWindow (dpy, Scr->Root, 0, 0, (unsigned int) mr->width, + (unsigned int) mr->height, (unsigned int) borderwidth, + CopyFromParent, (unsigned int) CopyFromParent, + (Visual *) CopyFromParent, + valuemask, &attributes); + + + XSaveContext(dpy, mr->w, MenuContext, (XPointer)mr); + XSaveContext(dpy, mr->w, ScreenContext, (XPointer)Scr); + + mr->mapped = UNMAPPED; + } + + if (Scr->use3Dmenus && (Scr->Monochrome == COLOR) && (mr->highlight.back == UNUSED_PIXEL)) { + XColor xcol; + char colname [32]; + short save; + + xcol.pixel = Scr->MenuC.back; + XQueryColor (dpy, cmap, &xcol); + sprintf (colname, "#%04x%04x%04x", + 5 * ((int)xcol.red / 6), + 5 * ((int)xcol.green / 6), + 5 * ((int)xcol.blue / 6)); + save = Scr->FirstTime; + Scr->FirstTime = True; + GetColor (Scr->Monochrome, &mr->highlight.back, colname); + Scr->FirstTime = save; + } + + if (Scr->use3Dmenus && (Scr->Monochrome == COLOR) && (mr->highlight.fore == UNUSED_PIXEL)) { + XColor xcol; + char colname [32]; + short save; + + xcol.pixel = Scr->MenuC.fore; + XQueryColor (dpy, cmap, &xcol); + sprintf (colname, "#%04x%04x%04x", + 5 * ((int)xcol.red / 6), + 5 * ((int)xcol.green / 6), + 5 * ((int)xcol.blue / 6)); + save = Scr->FirstTime; + Scr->FirstTime = True; + GetColor (Scr->Monochrome, &mr->highlight.fore, colname); + Scr->FirstTime = save; + } + if (Scr->use3Dmenus && !Scr->BeNiceToColormap) GetShadeColors (&mr->highlight); + + /* get the default colors into the menus */ + for (tmp = mr->first; tmp != NULL; tmp = tmp->next) + { + if (!tmp->user_colors) { + if (tmp->func != F_TITLE) { + tmp->normal.fore = Scr->MenuC.fore; + tmp->normal.back = Scr->MenuC.back; + } else { + tmp->normal.fore = Scr->MenuTitleC.fore; + tmp->normal.back = Scr->MenuTitleC.back; + } + } + + if (mr->highlight.fore != UNUSED_PIXEL) + { + tmp->highlight.fore = mr->highlight.fore; + tmp->highlight.back = mr->highlight.back; + } + else + { + tmp->highlight.fore = tmp->normal.back; + tmp->highlight.back = tmp->normal.fore; + } + if (Scr->use3Dmenus && !Scr->BeNiceToColormap) { + if (tmp->func != F_TITLE) + GetShadeColors (&tmp->highlight); + else + GetShadeColors (&tmp->normal); + } + } + mr->pmenu = NULL; + + if (Scr->Monochrome == MONOCHROME || !Scr->InterpolateMenuColors) + return 0; + + start = mr->first; + while (TRUE) + { + for (; start != NULL; start = start->next) + { + if (start->user_colors) + break; + } + if (start == NULL) + break; + + for (end = start->next; end != NULL; end = end->next) + { + if (end->user_colors) + break; + } + if (end == NULL) + break; + + /* we have a start and end to interpolate between */ + num = end->item_num - start->item_num; + + f1.pixel = start->normal.fore; + XQueryColor(dpy, cmap, &f1); + f2.pixel = end->normal.fore; + XQueryColor(dpy, cmap, &f2); + + b1.pixel = start->normal.back; + XQueryColor(dpy, cmap, &b1); + b2.pixel = end->normal.back; + XQueryColor(dpy, cmap, &b2); + + fred = ((int)f2.red - (int)f1.red) / num; + fgreen = ((int)f2.green - (int)f1.green) / num; + fblue = ((int)f2.blue - (int)f1.blue) / num; + + bred = ((int)b2.red - (int)b1.red) / num; + bgreen = ((int)b2.green - (int)b1.green) / num; + bblue = ((int)b2.blue - (int)b1.blue) / num; + + f3 = f1; + f3.flags = DoRed | DoGreen | DoBlue; + + b3 = b1; + b3.flags = DoRed | DoGreen | DoBlue; + + start->highlight.back = start->normal.fore; + start->highlight.fore = start->normal.back; + num -= 1; + for (i = 0, cur = start->next; i < num; i++, cur = cur->next) + { + f3.red += fred; + f3.green += fgreen; + f3.blue += fblue; + save_fore = f3; + + b3.red += bred; + b3.green += bgreen; + b3.blue += bblue; + save_back = b3; + + XAllocColor(dpy, cmap, &f3); + XAllocColor(dpy, cmap, &b3); + cur->highlight.back = cur->normal.fore = f3.pixel; + cur->highlight.fore = cur->normal.back = b3.pixel; + cur->user_colors = True; + + f3 = save_fore; + b3 = save_back; + } + start = end; + start->highlight.back = start->normal.fore; + start->highlight.fore = start->normal.back; + } + return 1; +} + + + +/*********************************************************************** + * + * Procedure: + * PopUpMenu - pop up a pull down menu + * + * Inputs: + * menu - the root pointer of the menu to pop up + * x, y - location of upper left of menu + * center - whether or not to center horizontally over position + * + *********************************************************************** + */ + +Bool PopUpMenu (MenuRoot *menu, int x, int y, Bool center) +{ + int WindowNameCount; + TwmWindow **WindowNames; + TwmWindow *tmp_win2,*tmp_win3; + int i; + int xl, yt; + Bool clipped; +#ifdef CLAUDE + char tmpname3 [256], tmpname4 [256]; + int hasmoz = 0; +#endif + if (!menu) return False; + + InstallRootColormap(); + + if ((menu == Scr->Windows) || + (menu == Scr->Icons) || + (menu == Scr->AllWindows) || + /* Added by Dan 'dl' Lilliehorn 040607 */ + (menu == Scr->AllIcons) || + /* Added by Dan Lilliehorn (dl@dl.nu) 2000-02-29 */ + (menu == Scr->Visible)) + { + TwmWindow *tmp_win; + WorkSpace *ws; + Boolean all, icons, visible_, allicons; /* visible, allicons: + Added by dl */ + int func; + + /* this is the twm windows menu, let's go ahead and build it */ + + all = (menu == Scr->AllWindows); + icons = (menu == Scr->Icons); + visible_ = (menu == Scr->Visible); /* Added by dl */ + allicons = (menu == Scr->AllIcons); + DestroyMenu (menu); + + menu->first = NULL; + menu->last = NULL; + menu->items = 0; + menu->width = 0; + menu->mapped = NEVER_MAPPED; + menu->highlight.fore = UNUSED_PIXEL; + menu->highlight.back = UNUSED_PIXEL; + if (menu == Scr->Windows) + AddToMenu(menu, "TWM Windows", NULLSTR, NULL, F_TITLE,NULLSTR,NULLSTR); + else + if (menu == Scr->Icons) + AddToMenu(menu, "TWM Icons", NULLSTR, NULL, F_TITLE, NULLSTR, NULLSTR); + else + if (menu == Scr->Visible) /* Added by dl 2000 */ + AddToMenu(menu, "TWM Visible", NULLSTR, NULL, F_TITLE, NULLSTR, NULLSTR); + else + if (menu == Scr->AllIcons) /* Added by dl 2004 */ + AddToMenu(menu, "TWM All Icons", NULLSTR, NULL, F_TITLE, NULLSTR, NULLSTR); + else + AddToMenu(menu, "TWM All Windows", NULLSTR, NULL, F_TITLE,NULLSTR,NULLSTR); + + ws = NULL; + + if (! (all || allicons) + && CurrentSelectedWorkspace && Scr->workSpaceManagerActive) { + for (ws = Scr->workSpaceMgr.workSpaceList; ws != NULL; ws = ws->next) { + if (strcmp (ws->name, CurrentSelectedWorkspace) == 0) break; + } + } + if (!Scr->currentvs) return False; + if (!ws) ws = Scr->currentvs->wsw->currentwspc; + + for (tmp_win = Scr->FirstWindow, WindowNameCount = 0; + tmp_win != NULL; + tmp_win = tmp_win->next) { + if (tmp_win == Scr->workSpaceMgr.occupyWindow->twm_win) continue; + if (Scr->ShortAllWindowsMenus && (tmp_win->wspmgr || tmp_win->iconmgr)) continue; + + if (!(all || allicons) && !OCCUPY (tmp_win, ws)) continue; + if (allicons && !tmp_win->isicon) continue; + if (icons && !tmp_win->isicon) continue; + if (visible_ && tmp_win->isicon) continue; /* added by dl */ + WindowNameCount++; + } + WindowNames = (TwmWindow **)malloc(sizeof(TwmWindow *)*WindowNameCount); + WindowNameCount = 0; + for (tmp_win = Scr->FirstWindow; + tmp_win != NULL; + tmp_win = tmp_win->next) + { + if (LookInList (Scr->IconMenuDontShow, tmp_win->full_name, &tmp_win->class)) continue; + + if (tmp_win == Scr->workSpaceMgr.occupyWindow->twm_win) continue; + if (Scr->ShortAllWindowsMenus && + tmp_win == Scr->currentvs->wsw->twm_win) continue; + if (Scr->ShortAllWindowsMenus && tmp_win->iconmgr) continue; + + if (!(all || allicons)&& ! OCCUPY (tmp_win, ws)) continue; + if (allicons && !tmp_win->isicon) continue; + if (icons && !tmp_win->isicon) continue; + if (visible_ && tmp_win->isicon) continue; /* added by dl */ + tmp_win2 = tmp_win; + + for (i = 0; i < WindowNameCount; i++) { + int compresult; + char *tmpname1, *tmpname2; + tmpname1 = tmp_win2->name; + tmpname2 = WindowNames[i]->name; +#ifdef CLAUDE + if (strlen (tmpname1) == 1) tmpname1 = " No title"; + if (strlen (tmpname2) == 1) tmpname2 = " No title"; + + if (!strncasecmp (tmp_win2->class.res_class, "navigator", 9) || + !strncasecmp (tmp_win2->class.res_class, "mozilla", 7)) { + tmpname3 [0] = ' '; tmpname3 [1] = '\0'; + strcat (tmpname3, tmpname1); + } else { + strcpy (tmpname3, tmpname1); + } + if (!strncasecmp (WindowNames[i]->class.res_class, "navigator", 9) || + !strncasecmp (WindowNames[i]->class.res_class, "mozilla", 7)) { + tmpname4 [0] = ' '; tmpname4 [1] = '\0'; + strcat (tmpname4, tmpname2); + } else { + strcpy (tmpname4, tmpname2); + } + tmpname1 = tmpname3; + tmpname2 = tmpname4; +#endif + if (Scr->CaseSensitive) + compresult = strcmp(tmpname1,tmpname2); + else + compresult = XmuCompareISOLatin1(tmpname1,tmpname2); + if (compresult < 0) { + tmp_win3 = tmp_win2; + tmp_win2 = WindowNames[i]; + WindowNames[i] = tmp_win3; + } + } + WindowNames[WindowNameCount] = tmp_win2; + WindowNameCount++; + } + func = (all || allicons || CurrentSelectedWorkspace) ? F_WINWARP : + F_POPUP; + for (i = 0; i < WindowNameCount; i++) + { + char *tmpname; + tmpname = WindowNames[i]->name; +#ifdef CLAUDE + if (!strncasecmp (WindowNames[i]->class.res_class, "navigator", 9) || + !strncasecmp (WindowNames[i]->class.res_class, "mozilla", 7) || + !strncasecmp (WindowNames[i]->class.res_class, "netscape", 8) || + !strncasecmp (WindowNames[i]->class.res_class, "konqueror", 9)) { + hasmoz = 1; + } + if (hasmoz && strncasecmp (WindowNames[i]->class.res_class, "navigator", 9) && + strncasecmp (WindowNames[i]->class.res_class, "mozilla", 7) && + strncasecmp (WindowNames[i]->class.res_class, "netscape", 8) && + strncasecmp (WindowNames[i]->class.res_class, "konqueror", 9)) { + menu->last->separated = 1; + hasmoz = 0; + } +#endif + AddToMenu(menu, tmpname, (char *)WindowNames[i], + NULL, func,NULL,NULL); + } + free(WindowNames); + + menu->pinned = False; + MakeMenu(menu); + } + + /* Keys added by dl */ + + if (menu == Scr->Keys) { + FuncKey *tmpKey; + char *tmpStr, *tmpStr2; + char modStr[5]; + char *oldact = 0; + int oldmod = 0; + int tmpLen; + + DestroyMenu (menu); + + menu->first = NULL; + menu->last = NULL; + menu->items = 0; + menu->width = 0; + menu->mapped = NEVER_MAPPED; + menu->highlight.fore = UNUSED_PIXEL; + menu->highlight.back = UNUSED_PIXEL; + + AddToMenu(menu, "Twm Keys", NULLSTR, NULL, F_TITLE, NULLSTR, NULLSTR); + + for (tmpKey = Scr->FuncKeyRoot.next; tmpKey != NULL; tmpKey = tmpKey->next) { + if (tmpKey->func != F_EXEC) continue; + if ((tmpKey->action == oldact) && (tmpKey->mods == oldmod)) continue; + strcpy (modStr, ""); + switch (tmpKey->mods) { + case 1: strcpy (modStr, "S"); break; + case 4: strcpy (modStr, "C"); break; + case 5: strcpy (modStr, "S + C"); break; + case 8: strcpy (modStr, "M"); break; + case 9: strcpy (modStr, "S + M"); break; + case 12: strcpy (modStr, "C + M"); break; + default: break; + } + tmpLen = (strlen (tmpKey->name) + strlen (modStr) + 5); + tmpStr = malloc (sizeof(char) * tmpLen); + sprintf (tmpStr,"[%s + %s]", tmpKey->name, modStr); + tmpStr2 = malloc (sizeof(char) * (strlen (tmpKey->action) + tmpLen + 2)); + sprintf (tmpStr2, "%s %s", tmpStr, tmpKey->action); + + AddToMenu (menu, tmpStr2, tmpKey->action, NULL, tmpKey->func, NULLSTR, NULLSTR); + oldact = tmpKey->action; + oldmod = tmpKey->mods; + } + menu->pinned = False; + MakeMenu(menu); + } + if (menu->w == None || menu->items == 0) return False; + + /* Prevent recursively bringing up menus. */ + if ((!menu->pinned) && (menu->mapped == MAPPED)) return False; + + /* + * Dynamically set the parent; this allows pull-ups to also be main + * menus, or to be brought up from more than one place. + */ + menu->prev = ActiveMenu; + + if (menu->pinned) { + ActiveMenu = menu; + menu->mapped = MAPPED; + menu->entered = TRUE; + MenuOrigins [MenuDepth].x = menu->x; + MenuOrigins [MenuDepth].y = menu->y; + MenuDepth++; + + XRaiseWindow (dpy, menu->w); + return (True); + } + + XGrabPointer(dpy, Scr->Root, True, + ButtonPressMask | ButtonReleaseMask | PointerMotionMask | + ButtonMotionMask | PointerMotionHintMask, + GrabModeAsync, GrabModeAsync, + Scr->Root, + Scr->MenuCursor, CurrentTime); + + XGrabKeyboard (dpy, Scr->Root, True, GrabModeAsync, GrabModeAsync, CurrentTime); + + ActiveMenu = menu; + menu->mapped = MAPPED; + menu->entered = FALSE; + + if (center) { + x -= (menu->width / 2); + y -= (Scr->EntryHeight / 2); /* sticky menus would be nice here */ + } + + /* + * clip to screen + */ + clipped = FALSE; + if (x + menu->width > Scr->rootw) { + x = Scr->rootw - menu->width; + clipped = TRUE; + } + if (x < 0) { + x = 0; + clipped = TRUE; + } + if (y + menu->height > Scr->rooth) { + y = Scr->rooth - menu->height; + clipped = TRUE; + } + if (y < 0) { + y = 0; + clipped = TRUE; + } + MenuOrigins[MenuDepth].x = x; + MenuOrigins[MenuDepth].y = y; + MenuDepth++; + + if (Scr->Root != Scr->CaptiveRoot) { + XReparentWindow (dpy, menu->shadow, Scr->Root, x, y); + XReparentWindow (dpy, menu->w, Scr->Root, x, y); + } else + XMoveWindow (dpy, menu->w, x, y); + if (Scr->Shadow) { + XMoveWindow (dpy, menu->shadow, x + SHADOWWIDTH, y + SHADOWWIDTH); + XRaiseWindow (dpy, menu->shadow); + } + XMapRaised(dpy, menu->w); +if (!Scr->NoWarpToMenuTitle && clipped && center) { + xl = x + (menu->width / 2); + yt = y + (Scr->EntryHeight / 2); + XWarpPointer (dpy, Scr->Root, Scr->Root, x, y, menu->width, menu->height, xl, yt); + } + if (Scr->Shadow) XMapWindow (dpy, menu->shadow); + XSync(dpy, 0); + return True; +} + + + +/*********************************************************************** + * + * Procedure: + * PopDownMenu - unhighlight the current menu selection and + * take down the menus + * + *********************************************************************** + */ + +int PopDownMenu(void) +{ + MenuRoot *tmp; + + if (ActiveMenu == NULL) + return (1); + + if (ActiveItem) + { + ActiveItem->state = 0; + PaintEntry(ActiveMenu, ActiveItem, False); + } + + for (tmp = ActiveMenu; tmp != NULL; tmp = tmp->prev) + { + if (! tmp->pinned) HideMenu (tmp); + UninstallRootColormap(); + } + + XFlush(dpy); + ActiveMenu = NULL; + ActiveItem = NULL; + MenuDepth = 0; + XUngrabKeyboard (dpy, CurrentTime); + if (Context == C_WINDOW || Context == C_FRAME || Context == C_TITLE || Context == C_ICON) + menuFromFrameOrWindowOrTitlebar = TRUE; + + return 1; +} + + + +Bool HideMenu (MenuRoot *menu) +{ + if (!menu) return False; + + if (Scr->Shadow) { + XUnmapWindow (dpy, menu->shadow); + } + XUnmapWindow (dpy, menu->w); + menu->mapped = UNMAPPED; + + return True; +} + +/*********************************************************************** + * + * Procedure: + * FindMenuRoot - look for a menu root + * + * Returned Value: + * (MenuRoot *) - a pointer to the menu root structure + * + * Inputs: + * name - the name of the menu root + * + *********************************************************************** + */ + +MenuRoot *FindMenuRoot(char *name) +{ + MenuRoot *tmp; + + for (tmp = Scr->MenuList; tmp != NULL; tmp = tmp->next) + { + if (strcmp(name, tmp->name) == 0) + return (tmp); + } + return NULL; +} + + + +static Bool belongs_to_twm_window (register TwmWindow *t, register Window w) +{ + if (!t) return False; + + if (w == t->frame || w == t->title_w || w == t->hilite_wl || w == t->hilite_wr || + (t->icon && (w == t->icon->w || w == t->icon->bm_w))) return True; + + if (t && t->titlebuttons) { + register TBWindow *tbw; + register int nb = Scr->TBInfo.nleft + Scr->TBInfo.nright; + for (tbw = t->titlebuttons; nb > 0; tbw++, nb--) { + if (tbw->window == w) return True; + } + } + return False; +} + + + + +/*********************************************************************** + * + * Procedure: + * resizeFromCenter - + * + *********************************************************************** + */ + +void resizeFromCenter(Window w, TwmWindow *tmp_win) +{ + int lastx, lasty, bw2; + int namelen; + XRectangle inc_rect; + XRectangle logical_rect; + + namelen = strlen (tmp_win->name); + bw2 = tmp_win->frame_bw * 2; + AddingW = tmp_win->attr.width + bw2 + 2 * tmp_win->frame_bw3D; + AddingH = tmp_win->attr.height + tmp_win->title_height + bw2 + 2 * tmp_win->frame_bw3D; + + XmbTextExtents(Scr->SizeFont.font_set, tmp_win->name, namelen, + &inc_rect, &logical_rect); + + XGetGeometry(dpy, w, &JunkRoot, &origDragX, &origDragY, + &DragWidth, &DragHeight, + &JunkBW, &JunkDepth); + + XWarpPointer(dpy, None, w, + 0, 0, 0, 0, DragWidth/2, DragHeight/2); + XQueryPointer (dpy, Scr->Root, &JunkRoot, + &JunkChild, &JunkX, &JunkY, + &AddingX, &AddingY, &JunkMask); + + lastx = -10000; + lasty = -10000; + + MenuStartResize(tmp_win, origDragX, origDragY, DragWidth, DragHeight); + while (TRUE) + { + XMaskEvent(dpy, + ButtonPressMask | PointerMotionMask | ExposureMask, &Event); + + if (Event.type == MotionNotify) { + /* discard any extra motion events before a release */ + while(XCheckMaskEvent(dpy, + ButtonMotionMask | ButtonPressMask, &Event)) + if (Event.type == ButtonPress) + break; + } + + if (Event.type == ButtonPress) + { + MenuEndResize(tmp_win); + XMoveResizeWindow(dpy, w, AddingX, AddingY, AddingW, AddingH); + break; + } + + if (Event.type != MotionNotify) { + DispatchEvent2 (); + continue; + } + + /* + * XXX - if we are going to do a loop, we ought to consider + * using multiple GXxor lines so that we don't need to + * grab the server. + */ + XQueryPointer(dpy, Scr->Root, &JunkRoot, &JunkChild, + &JunkX, &JunkY, &AddingX, &AddingY, &JunkMask); + + if (lastx != AddingX || lasty != AddingY) + { + MenuDoResize(AddingX, AddingY, tmp_win); + + lastx = AddingX; + lasty = AddingY; + } + + } +} + + + +/*********************************************************************** + * + * Procedure: + * ExecuteFunction - execute a twm root function + * + * Inputs: + * func - the function to execute + * action - the menu action to execute + * w - the window to execute this function on + * tmp_win - the twm window structure + * event - the event that caused the function + * context - the context in which the button was pressed + * pulldown- flag indicating execution from pull down menu + * + * Returns: + * TRUE if should continue with remaining actions else FALSE to abort + * + *********************************************************************** + */ + +int ExecuteFunction(int func, void *action, Window w, TwmWindow *tmp_win, + XEvent *eventp, int context, int pulldown) +{ + static Time last_time = 0; + char tmp[200]; + char *ptr; + char buff[MAX_FILE_SIZE]; + int count, fd; + Window rootw; + int origX, origY; + int do_next_action = TRUE; + int moving_icon = FALSE; + Bool fromtitlebar = False; + Bool from3dborder = False; + TwmWindow *t; + + RootFunction = 0; + if (Cancel) + return TRUE; /* XXX should this be FALSE? */ + + switch (func) + { + case F_UPICONMGR: + case F_LEFTICONMGR: + case F_RIGHTICONMGR: + case F_DOWNICONMGR: + case F_FORWICONMGR: + case F_BACKICONMGR: + case F_NEXTICONMGR: + case F_PREVICONMGR: + case F_NOP: + case F_TITLE: + case F_DELTASTOP: + case F_RAISELOWER: + case F_WARPTOSCREEN: + case F_WARPTO: + case F_WARPRING: + case F_WARPTOICONMGR: + case F_COLORMAP: + case F_ALTKEYMAP: + case F_ALTCONTEXT: + break; + + default: + XGrabPointer(dpy, Scr->Root, True, + ButtonPressMask | ButtonReleaseMask, + GrabModeAsync, GrabModeAsync, + Scr->Root, Scr->WaitCursor, CurrentTime); + break; + } + + switch (func) + { +#ifdef SOUNDS + case F_TOGGLESOUND: + toggle_sound(); + break; + case F_REREADSOUNDS: + reread_sounds(); + break; +#endif + case F_NOP: + case F_TITLE: + break; + + case F_DELTASTOP: + if (WindowMoved) do_next_action = FALSE; + break; + + case F_RESTART: { + DoRestart(eventp->xbutton.time); + break; + } + case F_UPICONMGR: + case F_DOWNICONMGR: + case F_LEFTICONMGR: + case F_RIGHTICONMGR: + case F_FORWICONMGR: + case F_BACKICONMGR: + MoveIconManager(func); + break; + + case F_FORWMAPICONMGR: + case F_BACKMAPICONMGR: + MoveMappedIconManager(func); + break; + + case F_NEXTICONMGR: + case F_PREVICONMGR: + JumpIconManager(func); + break; + + case F_SHOWLIST: + if (Scr->NoIconManagers) break; + ShowIconManager (); + break; + + case F_STARTANIMATION : + StartAnimation (); + break; + + case F_STOPANIMATION : + StopAnimation (); + break; + + case F_SPEEDUPANIMATION : + ModifyAnimationSpeed (1); + break; + + case F_SLOWDOWNANIMATION : + ModifyAnimationSpeed (-1); + break; + + case F_HIDELIST: + if (Scr->NoIconManagers) break; + HideIconManager (); + break; + + case F_SHOWWORKMGR: + if (! Scr->workSpaceManagerActive) break; + DeIconify (Scr->currentvs->wsw->twm_win); + RaiseWindow(Scr->currentvs->wsw->twm_win); + break; + + case F_HIDEWORKMGR: + if (! Scr->workSpaceManagerActive) break; + Iconify (Scr->currentvs->wsw->twm_win, eventp->xbutton.x_root - 5, + eventp->xbutton.y_root - 5); + break; + + case F_TOGGLEWORKMGR: + if (! Scr->workSpaceManagerActive) break; + if (Scr->currentvs->wsw->twm_win->mapped) + Iconify (Scr->currentvs->wsw->twm_win, eventp->xbutton.x_root - 5, + eventp->xbutton.y_root - 5); + else { + DeIconify (Scr->currentvs->wsw->twm_win); + RaiseWindow(Scr->currentvs->wsw->twm_win); + } + break; + + case F_TOGGLESTATE : + WMapToggleState (Scr->currentvs); + break; + + case F_SETBUTTONSTATE : + WMapSetButtonsState (Scr->currentvs); + break; + + case F_SETMAPSTATE : + WMapSetMapState (Scr->currentvs); + break; + + case F_PIN : + if (! ActiveMenu) break; + if (ActiveMenu->pinned) { + XUnmapWindow (dpy, ActiveMenu->w); + ActiveMenu->mapped = UNMAPPED; + } + else { + XWindowAttributes attr; + MenuRoot *menu; + + if (ActiveMenu->pmenu == NULL) { + menu = (MenuRoot*) malloc (sizeof (struct MenuRoot)); + *menu = *ActiveMenu; + menu->pinned = True; + menu->mapped = NEVER_MAPPED; + menu->width -= 10; + if (menu->pull) menu->width -= 16 + 10; + MakeMenu (menu); + ActiveMenu->pmenu = menu; + } + else menu = ActiveMenu->pmenu; + if (menu->mapped == MAPPED) break; + XGetWindowAttributes (dpy, ActiveMenu->w, &attr); + menu->x = attr.x; + menu->y = attr.y; + XMoveWindow (dpy, menu->w, menu->x, menu->y); + XMapRaised (dpy, menu->w); + menu->mapped = MAPPED; + } + PopDownMenu(); + break; + + case F_MOVEMENU: + break; + + case F_FITTOCONTENT : + if (DeferExecution (context, func, Scr->SelectCursor)) return TRUE; + if (!tmp_win->iswinbox) { + XBell (dpy, 0); + break; + } + fittocontent (tmp_win); + break; + + case F_VANISH: + if (DeferExecution (context, func, Scr->SelectCursor)) return TRUE; + + WMgrRemoveFromCurrentWorkSpace (Scr->currentvs, tmp_win); + break; + + case F_WARPHERE: + WMgrAddToCurrentWorkSpaceAndWarp (Scr->currentvs, action); + break; + + case F_ADDTOWORKSPACE: + if (DeferExecution (context, func, Scr->SelectCursor)) return TRUE; + AddToWorkSpace (action, tmp_win); + break; + + case F_REMOVEFROMWORKSPACE: + if (DeferExecution (context, func, Scr->SelectCursor)) return TRUE; + RemoveFromWorkSpace (action, tmp_win); + break; + + case F_TOGGLEOCCUPATION: + if (DeferExecution (context, func, Scr->SelectCursor)) return TRUE; + ToggleOccupation (action, tmp_win); + break; + + case F_MOVETONEXTWORKSPACE: + if (DeferExecution (context, func, Scr->SelectCursor)) return TRUE; + MoveToNextWorkSpace(Scr->currentvs,tmp_win); + break; + + case F_MOVETOPREVWORKSPACE: + if (DeferExecution (context, func, Scr->SelectCursor)) return TRUE; + MoveToPrevWorkSpace(Scr->currentvs,tmp_win); + break; + + case F_MOVETONEXTWORKSPACEANDFOLLOW: + if (DeferExecution (context, func, Scr->SelectCursor)) return TRUE; + MoveToNextWorkSpaceAndFollow(Scr->currentvs,tmp_win); + break; + + case F_MOVETOPREVWORKSPACEANDFOLLOW: + if (DeferExecution (context, func, Scr->SelectCursor)) return TRUE; + MoveToPrevWorkSpaceAndFollow(Scr->currentvs,tmp_win); + break; + + case F_SORTICONMGR: + if (DeferExecution(context, func, Scr->SelectCursor)) + return TRUE; + + { + int save_sort; + + save_sort = Scr->SortIconMgr; + Scr->SortIconMgr = TRUE; + + if (context == C_ICONMGR) + SortIconManager((IconMgr *) NULL); + else if (tmp_win->iconmgr) + SortIconManager(tmp_win->iconmgrp); + else + XBell(dpy, 0); + + Scr->SortIconMgr = save_sort; + } + break; + + case F_ALTKEYMAP: { + int alt, stat_; + + if (! action) return TRUE; + stat_ = sscanf (action, "%d", &alt); + if (stat_ != 1) return TRUE; + if ((alt < 1) || (alt > 5)) return TRUE; + AlternateKeymap = Alt1Mask << (alt - 1); + XGrabPointer (dpy, Scr->Root, True, ButtonPressMask | ButtonReleaseMask, + GrabModeAsync, GrabModeAsync, + Scr->Root, Scr->AlterCursor, CurrentTime); + XGrabKeyboard (dpy, Scr->Root, True, GrabModeAsync, GrabModeAsync, CurrentTime); + return TRUE; + } + + case F_ALTCONTEXT: { + AlternateContext = True; + XGrabPointer (dpy, Scr->Root, False, ButtonPressMask | ButtonReleaseMask, + GrabModeAsync, GrabModeAsync, + Scr->Root, Scr->AlterCursor, CurrentTime); + XGrabKeyboard (dpy, Scr->Root, False, GrabModeAsync, GrabModeAsync, CurrentTime); + return TRUE; + } + case F_IDENTIFY: + if (DeferExecution(context, func, Scr->SelectCursor)) + return TRUE; + + Identify(tmp_win); + break; + + case F_INITSIZE: { + int grav, x, y; + unsigned int width, height, swidth, sheight; + + if (DeferExecution (context, func, Scr->SelectCursor)) return TRUE; + grav = ((tmp_win->hints.flags & PWinGravity) + ? tmp_win->hints.win_gravity : NorthWestGravity); + + if (!(tmp_win->hints.flags & USSize) && !(tmp_win->hints.flags & PSize)) break; + + width = tmp_win->hints.width + 2 * tmp_win->frame_bw3D; + height = tmp_win->hints.height + 2 * tmp_win->frame_bw3D + tmp_win->title_height; + ConstrainSize (tmp_win, &width, &height); + + x = tmp_win->frame_x; + y = tmp_win->frame_y; + swidth = tmp_win->frame_width; + sheight = tmp_win->frame_height; + switch (grav) { + case ForgetGravity : + case StaticGravity : + case NorthWestGravity : + case NorthGravity : + case WestGravity : + case CenterGravity : + break; + + case NorthEastGravity : + case EastGravity : + x += swidth - width; + break; + + case SouthWestGravity : + case SouthGravity : + y += sheight - height; + break; + + case SouthEastGravity : + x += swidth - width; + y += sheight - height; + break; + } + SetupWindow (tmp_win, x, y, width, height, -1); + break; + } + + case F_MOVERESIZE: { + int x, y, mask; + unsigned int width, height; + int px = 20, py = 30; + + if (DeferExecution (context, func, Scr->SelectCursor)) return TRUE; + mask = XParseGeometry (action, &x, &y, &width, &height); + if (!(mask & WidthValue)) width = tmp_win->frame_width; + else width += 2 * tmp_win->frame_bw3D; + if (!(mask & HeightValue)) height = tmp_win->frame_height; + else height += 2 * tmp_win->frame_bw3D + tmp_win->title_height; + ConstrainSize (tmp_win, &width, &height); + if (mask & XValue) { + if (mask & XNegative) x += Scr->rootw - width; + } else x = tmp_win->frame_x; + if (mask & YValue) { + if (mask & YNegative) y += Scr->rooth - height; + } else y = tmp_win->frame_y; + + { + int junkX, junkY; + unsigned int junkK; + Window junkW; + XQueryPointer (dpy, Scr->Root, &junkW, &junkW, &junkX, &junkY, &px, &py, &junkK); + } + px -= tmp_win->frame_x; if (px > width) px = width / 2; + py -= tmp_win->frame_y; if (py > height) px = height / 2; + SetupWindow (tmp_win, x, y, width, height, -1); + XWarpPointer (dpy, Scr->Root, Scr->Root, 0, 0, 0, 0, x + px, y + py); + break; + } + + case F_VERSION: + Identify ((TwmWindow *) NULL); + break; + + case F_AUTORAISE: + if (DeferExecution(context, func, Scr->SelectCursor)) + return TRUE; + + tmp_win->auto_raise = !tmp_win->auto_raise; + if (tmp_win->auto_raise) ++(Scr->NumAutoRaises); + else --(Scr->NumAutoRaises); + break; + + case F_AUTOLOWER: + if (DeferExecution(context, func, Scr->SelectCursor)) + return TRUE; + + tmp_win->auto_lower = !tmp_win->auto_lower; + if (tmp_win->auto_lower) ++(Scr->NumAutoLowers); + else --(Scr->NumAutoLowers); + break; + + case F_BEEP: + XBell(dpy, 0); + break; + + case F_POPUP: + tmp_win = (TwmWindow *)action; + if (! tmp_win) break; + if (Scr->WindowFunction.func != 0) + { + ExecuteFunction(Scr->WindowFunction.func, + Scr->WindowFunction.item->action, + w, tmp_win, eventp, C_FRAME, FALSE); + } + else + { + DeIconify(tmp_win); + RaiseWindow (tmp_win); + } + break; + + case F_WINWARP: + tmp_win = (TwmWindow *)action; + + if (! tmp_win) break; + if (Scr->WarpUnmapped || tmp_win->mapped) { + if (!tmp_win->mapped) DeIconify (tmp_win); + WarpToWindow (tmp_win, Scr->RaiseOnWarp); + } + break; + + case F_RESIZE: + EventHandler[EnterNotify] = HandleUnknown; + EventHandler[LeaveNotify] = HandleUnknown; + if (DeferExecution(context, func, Scr->MoveCursor)) + return TRUE; + + PopDownMenu(); + if (tmp_win->squeezed) { + XBell (dpy, 0); + break; + } + if (tmp_win->OpaqueResize) { + /* + * OpaqueResize defaults to a thousand. Assume that any number + * >= 1000 is "infinity" and don't bother calculating. + */ + if (Scr->OpaqueResizeThreshold >= 1000) + Scr->OpaqueResize = TRUE; + else { + /* + * scrsz will hold the number of pixels in your resolution, + * which can get big. [signed] int may not cut it. + */ + unsigned long winsz, scrsz; + winsz = tmp_win->frame_width * tmp_win->frame_height; + scrsz = Scr->rootw * Scr->rooth; + if (winsz > (scrsz * (Scr->OpaqueResizeThreshold / 100.0))) + Scr->OpaqueResize = FALSE; + else + Scr->OpaqueResize = TRUE; + } + } + else + Scr->OpaqueResize = FALSE; + + if (pulldown) + XWarpPointer(dpy, None, Scr->Root, + 0, 0, 0, 0, eventp->xbutton.x_root, eventp->xbutton.y_root); + + if (!tmp_win->icon || (w != tmp_win->icon->w)) { /* can't resize icons */ + +/* fromMenu = False; ????? */ + if ((Context == C_FRAME || Context == C_WINDOW || Context == C_TITLE) + && fromMenu) + resizeFromCenter(w, tmp_win); + else { + /* + * see if this is being done from the titlebar + */ + from3dborder = (eventp->xbutton.window == tmp_win->frame); + fromtitlebar = !from3dborder && + belongs_to_twm_window (tmp_win, eventp->xbutton.window); + + /* Save pointer position so we can tell if it was moved or + not during the resize. */ + ResizeOrigX = eventp->xbutton.x_root; + ResizeOrigY = eventp->xbutton.y_root; + + StartResize (eventp, tmp_win, fromtitlebar, from3dborder); + + do { + XMaskEvent(dpy, + ButtonPressMask | ButtonReleaseMask | + EnterWindowMask | LeaveWindowMask | + ButtonMotionMask | VisibilityChangeMask | ExposureMask, &Event); + + if (fromtitlebar && Event.type == ButtonPress) { + fromtitlebar = False; + continue; + } + + if (Event.type == MotionNotify) { + /* discard any extra motion events before a release */ + while + (XCheckMaskEvent + (dpy, ButtonMotionMask | ButtonReleaseMask, &Event)) + if (Event.type == ButtonRelease) + break; + } + + if (!DispatchEvent2 ()) continue; + + } while (!(Event.type == ButtonRelease || Cancel)); + return TRUE; + } + } + break; + + + case F_ZOOM: + case F_HORIZOOM: + case F_FULLZOOM: + case F_LEFTZOOM: + case F_RIGHTZOOM: + case F_TOPZOOM: + case F_BOTTOMZOOM: + if (DeferExecution(context, func, Scr->SelectCursor)) + return TRUE; + if (tmp_win->squeezed) { + XBell(dpy, 0); + break; + } + fullzoom(tmp_win, func); + break; + + case F_PACK: + if (DeferExecution(context, func, Scr->SelectCursor)) return TRUE; + if (tmp_win->squeezed) { XBell(dpy, 0); break; } + packwindow (tmp_win, action); + break; + + case F_FILL: + if (DeferExecution(context, func, Scr->SelectCursor)) return TRUE; + if (tmp_win->squeezed) { XBell(dpy, 0); break; } + fillwindow (tmp_win, action); + break; + + case F_JUMPLEFT: + if (DeferExecution(context, func, Scr->MoveCursor)) return TRUE; + if (tmp_win->squeezed) { XBell(dpy, 0); break; } + jump (tmp_win, J_LEFT, action); + break; + case F_JUMPRIGHT: + if (DeferExecution(context, func, Scr->MoveCursor)) return TRUE; + if (tmp_win->squeezed) { XBell(dpy, 0); break; } + jump (tmp_win, J_RIGHT, action); + break; + case F_JUMPDOWN: + if (DeferExecution(context, func, Scr->MoveCursor)) return TRUE; + if (tmp_win->squeezed) { XBell(dpy, 0); break; } + jump (tmp_win, J_BOTTOM, action); + break; + case F_JUMPUP: + if (DeferExecution(context, func, Scr->MoveCursor)) return TRUE; + if (tmp_win->squeezed) { XBell(dpy, 0); break; } + jump (tmp_win, J_TOP, action); + break; + + case F_SAVEGEOMETRY: + if (DeferExecution(context, func, Scr->SelectCursor)) return TRUE; + savegeometry (tmp_win); + break; + + case F_RESTOREGEOMETRY: + if (DeferExecution(context, func, Scr->SelectCursor)) return TRUE; + restoregeometry (tmp_win); + break; + + case F_HYPERMOVE: { + Bool cont = True; + Window root = RootWindow (dpy, Scr->screen); + Cursor cursor; + CaptiveCTWM cctwm0, cctwm; + + if (DeferExecution(context, func, Scr->MoveCursor)) return TRUE; + + if (tmp_win->iswinbox || tmp_win->wspmgr) { + XBell (dpy, 0); + break; + } + cctwm0 = GetCaptiveCTWMUnderPointer (); + cursor = MakeStringCursor (cctwm0.name); + free (cctwm0.name); + if (DeferExecution (context, func, Scr->MoveCursor)) return TRUE; + + XGrabPointer (dpy, root, True, + ButtonPressMask | ButtonMotionMask | ButtonReleaseMask, + GrabModeAsync, GrabModeAsync, root, cursor, CurrentTime); + while (cont) { + XMaskEvent (dpy, ButtonPressMask | ButtonMotionMask | + ButtonReleaseMask, &Event); + switch (Event.xany.type) { + case ButtonPress : + cont = False; + break; + + case ButtonRelease : + cont = False; + cctwm = GetCaptiveCTWMUnderPointer (); + free (cctwm.name); + if (cctwm.root == Scr->Root) break; + SetNoRedirect (tmp_win->w); + XUngrabButton (dpy, AnyButton, AnyModifier, tmp_win->w); + XReparentWindow (dpy, tmp_win->w, cctwm.root, 0, 0); + XMapWindow (dpy, tmp_win->w); + break; + + case MotionNotify : + cctwm = GetCaptiveCTWMUnderPointer (); + if (cctwm.root != cctwm0.root) { + XFreeCursor (dpy, cursor); + cursor = MakeStringCursor (cctwm.name); + cctwm0 = cctwm; + XChangeActivePointerGrab (dpy, + ButtonPressMask | ButtonMotionMask | ButtonReleaseMask, + cursor, CurrentTime); + } + free (cctwm.name); + break; + } + } + ButtonPressed = -1; + XUngrabPointer (dpy, CurrentTime); + XFreeCursor (dpy, cursor); + break; + } + + case F_MOVE: + case F_FORCEMOVE: + case F_MOVEPACK: + case F_MOVEPUSH: { + Window grabwin, dragroot; + + if (DeferExecution(context, func, Scr->MoveCursor)) + return TRUE; + + PopDownMenu(); + if (tmp_win->OpaqueMove) { + int sw, ss; + float sf; + + sw = tmp_win->frame_width * tmp_win->frame_height; + ss = Scr->rootw * Scr->rooth; + sf = Scr->OpaqueMoveThreshold / 100.0; + if (sw > (ss * sf)) + Scr->OpaqueMove = FALSE; + else + Scr->OpaqueMove = TRUE; + } + else + Scr->OpaqueMove = FALSE; + + dragroot = Scr->XineramaRoot; + + if (tmp_win->winbox) { + XTranslateCoordinates (dpy, dragroot, tmp_win->winbox->window, + eventp->xbutton.x_root, eventp->xbutton.y_root, + &(eventp->xbutton.x_root), &(eventp->xbutton.y_root), &JunkChild); + } + rootw = eventp->xbutton.root; + MoveFunction = func; + + if (pulldown) + XWarpPointer(dpy, None, Scr->Root, + 0, 0, 0, 0, eventp->xbutton.x_root, eventp->xbutton.y_root); + + EventHandler[EnterNotify] = HandleUnknown; + EventHandler[LeaveNotify] = HandleUnknown; + + if (!Scr->NoGrabServer || !Scr->OpaqueMove) { + XGrabServer(dpy); + } + + Scr->SizeStringOffset = SIZE_HINDENT; + XResizeWindow (dpy, Scr->SizeWindow, + Scr->SizeStringWidth + SIZE_HINDENT * 2, + Scr->SizeFont.height + SIZE_VINDENT * 2); + XMapRaised (dpy, Scr->SizeWindow); + + grabwin = Scr->XineramaRoot; + if (tmp_win->winbox) grabwin = tmp_win->winbox->window; + XGrabPointer(dpy, grabwin, True, + ButtonPressMask | ButtonReleaseMask | + ButtonMotionMask | PointerMotionMask, /* PointerMotionHintMask */ + GrabModeAsync, GrabModeAsync, grabwin, Scr->MoveCursor, CurrentTime); + + if (context == C_ICON && tmp_win->icon && tmp_win->icon->w) + { + w = tmp_win->icon->w; + DragX = eventp->xbutton.x; + DragY = eventp->xbutton.y; + moving_icon = TRUE; + if (tmp_win->OpaqueMove) Scr->OpaqueMove = TRUE; + } + + else if (! tmp_win->icon || w != tmp_win->icon->w) + { + XTranslateCoordinates(dpy, w, tmp_win->frame, + eventp->xbutton.x, + eventp->xbutton.y, + &DragX, &DragY, &JunkChild); + + w = tmp_win->frame; + } + + DragWindow = None; + + /* Get x/y relative to parent window, i.e. the virtual screen, Root. + * XMoveWindow() moves are relative to this. + * MoveOutline()s however are drawn from the XineramaRoot since they + * may cross virtual screens. + */ + XGetGeometry(dpy, w, &JunkRoot, &origDragX, &origDragY, + &DragWidth, &DragHeight, &DragBW, + &JunkDepth); + + JunkBW = DragBW; + origX = eventp->xbutton.x_root; + origY = eventp->xbutton.y_root; + CurrentDragX = origDragX; + CurrentDragY = origDragY; + + /* + * only do the constrained move if timer is set; need to check it + * in case of stupid or wicked fast servers + */ + if (ConstrainedMoveTime && + (eventp->xbutton.time - last_time) < ConstrainedMoveTime) + { + int width, height; + + ConstMove = TRUE; + ConstMoveDir = MOVE_NONE; + ConstMoveX = eventp->xbutton.x_root - DragX - JunkBW; + ConstMoveY = eventp->xbutton.y_root - DragY - JunkBW; + width = DragWidth + 2 * JunkBW; + height = DragHeight + 2 * JunkBW; + ConstMoveXL = ConstMoveX + width/3; + ConstMoveXR = ConstMoveX + 2*(width/3); + ConstMoveYT = ConstMoveY + height/3; + ConstMoveYB = ConstMoveY + 2*(height/3); + + XWarpPointer(dpy, None, w, + 0, 0, 0, 0, DragWidth/2, DragHeight/2); + + XQueryPointer(dpy, w, &JunkRoot, &JunkChild, + &JunkX, &JunkY, &DragX, &DragY, &JunkMask); + } + last_time = eventp->xbutton.time; + + if (!Scr->OpaqueMove) + { + InstallRootColormap(); + if (!Scr->MoveDelta) + { + /* + * Draw initial outline. This was previously done the + * first time though the outer loop by dropping out of + * the XCheckMaskEvent inner loop down to one of the + * MoveOutline's below. + */ + MoveOutline(dragroot, + origDragX - JunkBW + Scr->currentvs->x, + origDragY - JunkBW + Scr->currentvs->y, + DragWidth + 2 * JunkBW, DragHeight + 2 * JunkBW, + tmp_win->frame_bw, + moving_icon ? 0 : tmp_win->title_height + tmp_win->frame_bw3D); + /* + * This next line causes HandleReleaseNotify to call + * XRaiseWindow(). This is solely to preserve the + * previous behaviour that raises a window being moved + * on button release even if you never actually moved + * any distance (unless you move less than MoveDelta or + * NoRaiseMove is set or OpaqueMove is set). + */ + DragWindow = w; + } + } + + /* + * see if this is being done from the titlebar + */ + fromtitlebar = belongs_to_twm_window (tmp_win, eventp->xbutton.window); + + if (menuFromFrameOrWindowOrTitlebar) { + /* warp the pointer to the middle of the window */ + XWarpPointer(dpy, None, Scr->Root, 0, 0, 0, 0, + origDragX + DragWidth / 2, + origDragY + DragHeight / 2); + XFlush(dpy); + } + + DisplayPosition (tmp_win, CurrentDragX, CurrentDragY); + while (TRUE) + { + long releaseEvent = menuFromFrameOrWindowOrTitlebar ? + ButtonPress : ButtonRelease; + long movementMask = menuFromFrameOrWindowOrTitlebar ? + PointerMotionMask : ButtonMotionMask; + + /* block until there is an interesting event */ + XMaskEvent(dpy, ButtonPressMask | ButtonReleaseMask | + EnterWindowMask | LeaveWindowMask | + ExposureMask | movementMask | + VisibilityChangeMask, &Event); + + /* throw away enter and leave events until release */ + if (Event.xany.type == EnterNotify || + Event.xany.type == LeaveNotify) continue; + + if (Event.type == MotionNotify) { + /* discard any extra motion events before a logical release */ + while(XCheckMaskEvent(dpy, + movementMask | releaseEvent, &Event)) + if (Event.type == releaseEvent) { + break; + } + } + + /* test to see if we have a second button press to abort move */ + if (!menuFromFrameOrWindowOrTitlebar) + if (Event.type == ButtonPress && DragWindow != None) { + Cursor cur; + if (Scr->OpaqueMove) { + XMoveWindow (dpy, DragWindow, origDragX, origDragY); + } else { + MoveOutline(dragroot, 0, 0, 0, 0, 0, 0); + } + DragWindow = None; + + XUnmapWindow (dpy, Scr->SizeWindow); + cur = LeftButt; + if (Event.xbutton.button == Button2) + cur = MiddleButt; + else if (Event.xbutton.button >= Button3) + cur = RightButt; + + XGrabPointer (dpy, Scr->Root, True, + ButtonReleaseMask | ButtonPressMask, + GrabModeAsync, GrabModeAsync, + Scr->Root, cur, CurrentTime); + return TRUE; + } + + if (fromtitlebar && Event.type == ButtonPress) { + fromtitlebar = False; + CurrentDragX = origX = Event.xbutton.x_root; + CurrentDragY = origY = Event.xbutton.y_root; + XTranslateCoordinates (dpy, rootw, tmp_win->frame, + origX, origY, + &DragX, &DragY, &JunkChild); + continue; + } + + if (!DispatchEvent2 ()) continue; + + if (Cancel) + { + WindowMoved = FALSE; + if (!Scr->OpaqueMove) + UninstallRootColormap(); + return TRUE; /* XXX should this be FALSE? */ + } + if (Event.type == releaseEvent) + { + MoveOutline(dragroot, 0, 0, 0, 0, 0, 0); + if (moving_icon && + ((CurrentDragX != origDragX || + CurrentDragY != origDragY))) + tmp_win->icon_moved = TRUE; + if (!Scr->OpaqueMove && menuFromFrameOrWindowOrTitlebar) { + int xl = Event.xbutton.x_root - (DragWidth / 2), + yt = Event.xbutton.y_root - (DragHeight / 2); + if (!moving_icon && + (MoveFunction == F_MOVEPACK || MoveFunction == F_MOVEPUSH)) + TryToPack (tmp_win, &xl, &yt); + XMoveWindow(dpy, DragWindow, xl, yt); + } + if (menuFromFrameOrWindowOrTitlebar) DragWindow = None; + break; + } + + /* something left to do only if the pointer moved */ + if (Event.type != MotionNotify) + continue; + + XQueryPointer(dpy, rootw, &(eventp->xmotion.root), &JunkChild, + &(eventp->xmotion.x_root), &(eventp->xmotion.y_root), + &JunkX, &JunkY, &JunkMask); + + FixRootEvent (eventp); + if (tmp_win->winbox) { + XTranslateCoordinates (dpy, dragroot, tmp_win->winbox->window, + eventp->xmotion.x_root, eventp->xmotion.y_root, + &(eventp->xmotion.x_root), &(eventp->xmotion.y_root), &JunkChild); + } + if (DragWindow == None && + abs(eventp->xmotion.x_root - origX) < Scr->MoveDelta && + abs(eventp->xmotion.y_root - origY) < Scr->MoveDelta) + continue; + + DragWindow = w; + + if (!Scr->NoRaiseMove && Scr->OpaqueMove && !WindowMoved) + RaiseFrame(DragWindow); + + WindowMoved = TRUE; + + if (ConstMove) + { + switch (ConstMoveDir) + { + case MOVE_NONE: + if (eventp->xmotion.x_root < ConstMoveXL || + eventp->xmotion.x_root > ConstMoveXR) + ConstMoveDir = MOVE_HORIZ; + + if (eventp->xmotion.y_root < ConstMoveYT || + eventp->xmotion.y_root > ConstMoveYB) + ConstMoveDir = MOVE_VERT; + + XQueryPointer(dpy, DragWindow, &JunkRoot, &JunkChild, + &JunkX, &JunkY, &DragX, &DragY, &JunkMask); + break; + + case MOVE_VERT: + ConstMoveY = eventp->xmotion.y_root - DragY - JunkBW; + break; + + case MOVE_HORIZ: + ConstMoveX= eventp->xmotion.x_root - DragX - JunkBW; + break; + } + + if (ConstMoveDir != MOVE_NONE) + { + int xl, yt, width, height; + + xl = ConstMoveX; + yt = ConstMoveY; + width = DragWidth + 2 * JunkBW; + height = DragHeight + 2 * JunkBW; + + if (Scr->DontMoveOff && MoveFunction != F_FORCEMOVE) + TryToGrid (tmp_win, &xl, &yt); + if (!moving_icon && MoveFunction == F_MOVEPUSH && Scr->OpaqueMove) + TryToPush (tmp_win, xl, yt, 0); + + if (!moving_icon && + (MoveFunction == F_MOVEPACK || MoveFunction == F_MOVEPUSH)) + TryToPack (tmp_win, &xl, &yt); + + if (Scr->DontMoveOff && MoveFunction != F_FORCEMOVE) + { + ConstrainByBorders (tmp_win, &xl, width, &yt, height); + } + CurrentDragX = xl; + CurrentDragY = yt; + if (Scr->OpaqueMove) { + if (MoveFunction == F_MOVEPUSH && !moving_icon) { + SetupWindow (tmp_win, xl, yt, + tmp_win->frame_width, tmp_win->frame_height, -1); + } else { + XMoveWindow(dpy, DragWindow, xl, yt); + } + WMapSetupWindow (tmp_win, xl, yt, -1, -1); + } + else { + MoveOutline(dragroot, xl + Scr->currentvs->x, + yt + Scr->currentvs->y, width, height, + tmp_win->frame_bw, + moving_icon ? 0 : tmp_win->title_height + tmp_win->frame_bw3D); + } + } + } + else if (DragWindow != None) + { + int xroot, yroot; + int xl, yt, width, height; + + + /* + * this is split out for virtual screens. In that case, it's + * possible to drag windows from one workspace to another, and + * as such, these need to be adjusted to the root, rather + * than this virtual screen... + */ + xroot = eventp->xmotion.x_root; + yroot = eventp->xmotion.y_root; + + if (!menuFromFrameOrWindowOrTitlebar) { + xl = xroot - DragX - JunkBW; + yt = yroot - DragY - JunkBW; + } + else { + xl = xroot - (DragWidth / 2); + yt = yroot - (DragHeight / 2); + } + width = DragWidth + 2 * JunkBW; + height = DragHeight + 2 * JunkBW; + + if (Scr->DontMoveOff && MoveFunction != F_FORCEMOVE) + TryToGrid (tmp_win, &xl, &yt); + if (!moving_icon && MoveFunction == F_MOVEPUSH && Scr->OpaqueMove) + TryToPush (tmp_win, xl, yt, 0); + + if (!moving_icon && + (MoveFunction == F_MOVEPACK || MoveFunction == F_MOVEPUSH)) + TryToPack (tmp_win, &xl, &yt); + + if (Scr->DontMoveOff && MoveFunction != F_FORCEMOVE) + { + ConstrainByBorders (tmp_win, &xl, width, &yt, height); + } + + CurrentDragX = xl; + CurrentDragY = yt; + if (Scr->OpaqueMove) { + if (MoveFunction == F_MOVEPUSH && !moving_icon) { + SetupWindow (tmp_win, xl, yt, + tmp_win->frame_width, tmp_win->frame_height, -1); + } else { + XMoveWindow(dpy, DragWindow, xl, yt); + } + if (! moving_icon) WMapSetupWindow (tmp_win, xl, yt, -1, -1); + } + else { + MoveOutline(dragroot, xl + Scr->currentvs->x, + yt + Scr->currentvs->y, width, height, + tmp_win->frame_bw, + moving_icon ? 0 : tmp_win->title_height + tmp_win->frame_bw3D); + } + } + DisplayPosition (tmp_win, CurrentDragX, CurrentDragY); + } + XUnmapWindow (dpy, Scr->SizeWindow); + + if (!Scr->OpaqueMove && DragWindow == None) + UninstallRootColormap(); + break; + } + case F_MOVETITLEBAR: + { + Window grabwin; + int deltax = 0, newx = 0; + int origNum; + SqueezeInfo *si; + + if (DeferExecution(context, func, Scr->MoveCursor)) + return TRUE; + + PopDownMenu(); + if (tmp_win->squeezed || + !tmp_win->squeeze_info || + !tmp_win->title_w || + context == C_ICON ) { + XBell (dpy, 0); + break; + } + + /* If the SqueezeInfo isn't copied yet, do it now */ + if (!tmp_win->squeeze_info_copied) { + SqueezeInfo *s = malloc(sizeof(SqueezeInfo)); + if (!s) + break; + *s = *tmp_win->squeeze_info; + tmp_win->squeeze_info = s; + tmp_win->squeeze_info_copied = 1; + } + si = tmp_win->squeeze_info; + + if (si->denom != 0) { + int target_denom = tmp_win->frame_width; + /* + * If not pixel based, scale the denominator to equal the + * window width, so the numerator equals pixels. + * That way we can just modify it by pixel units, just + * like the other case. + */ + + if (si->denom != target_denom) { + float scale = (float)target_denom / si->denom; + si->num *= scale; + si->denom = target_denom; /* s->denom *= scale; */ + } + } + + /* now move the mouse */ + if (tmp_win->winbox) { + XTranslateCoordinates (dpy, Scr->Root, tmp_win->winbox->window, + eventp->xbutton.x_root, eventp->xbutton.y_root, + &eventp->xbutton.x_root, &eventp->xbutton.y_root, &JunkChild); + } + /* + * the event is always a button event, since key events + * are "weeded out" - although incompletely only + * F_MOVE and F_RESIZE - in HandleKeyPress(). + */ + rootw = eventp->xbutton.root; + + EventHandler[EnterNotify] = HandleUnknown; + EventHandler[LeaveNotify] = HandleUnknown; + + if (!Scr->NoGrabServer) { + XGrabServer(dpy); + } + + grabwin = Scr->Root; + if (tmp_win->winbox) grabwin = tmp_win->winbox->window; + XGrabPointer(dpy, grabwin, True, + ButtonPressMask | ButtonReleaseMask | + ButtonMotionMask | PointerMotionMask, /* PointerMotionHintMask */ + GrabModeAsync, GrabModeAsync, grabwin, Scr->MoveCursor, CurrentTime); + +#if 0 /* what's this for ? */ + if (! tmp_win->icon || w != tmp_win->icon->w) + { + XTranslateCoordinates(dpy, w, tmp_win->frame, + eventp->xbutton.x, + eventp->xbutton.y, + &DragX, &DragY, &JunkChild); + + w = tmp_win->frame; + } +#endif + + DragWindow = None; + + XGetGeometry(dpy, tmp_win->title_w, &JunkRoot, &origDragX, &origDragY, + &DragWidth, &DragHeight, &DragBW, + &JunkDepth); + + origX = eventp->xbutton.x_root; + origNum = si->num; + + if (menuFromFrameOrWindowOrTitlebar) { + /* warp the pointer to the middle of the window */ + XWarpPointer(dpy, None, Scr->Root, 0, 0, 0, 0, + origDragX + DragWidth / 2, + origDragY + DragHeight / 2); + XFlush(dpy); + } + + while (TRUE) + { + long releaseEvent = menuFromFrameOrWindowOrTitlebar ? + ButtonPress : ButtonRelease; + long movementMask = menuFromFrameOrWindowOrTitlebar ? + PointerMotionMask : ButtonMotionMask; + + /* block until there is an interesting event */ + XMaskEvent(dpy, ButtonPressMask | ButtonReleaseMask | + EnterWindowMask | LeaveWindowMask | + ExposureMask | movementMask | + VisibilityChangeMask, &Event); + + /* throw away enter and leave events until release */ + if (Event.xany.type == EnterNotify || + Event.xany.type == LeaveNotify) continue; + + if (Event.type == MotionNotify) { + /* discard any extra motion events before a logical release */ + while (XCheckMaskEvent(dpy, + movementMask | releaseEvent, &Event)) { + if (Event.type == releaseEvent) { + break; + } + } + } + + if (!DispatchEvent2()) + continue; + + if (Event.type == releaseEvent) + break; + + /* something left to do only if the pointer moved */ + if (Event.type != MotionNotify) + continue; + + /* get current pointer pos, useful when there is lag */ + XQueryPointer(dpy, rootw, &eventp->xmotion.root, &JunkChild, + &eventp->xmotion.x_root, &eventp->xmotion.y_root, + &JunkX, &JunkY, &JunkMask); + + FixRootEvent(eventp); + if (tmp_win->winbox) { + XTranslateCoordinates(dpy, Scr->Root, tmp_win->winbox->window, + eventp->xmotion.x_root, eventp->xmotion.y_root, + &eventp->xmotion.x_root, &eventp->xmotion.y_root, &JunkChild); + } + + if (!Scr->NoRaiseMove && Scr->OpaqueMove && !WindowMoved) + RaiseFrame(w); + + deltax = eventp->xmotion.x_root - origX; + newx = origNum + deltax; + + /* + * Clamp to left and right. + * If we're in pixel size, keep within [ 0, frame_width >. + * If we're proportional, don't cross the 0. + * Also don't let the nominator get bigger than the denominator. + * Keep within [ -denom, -1] or [ 0, denom >. + */ + { + int wtmp = tmp_win->frame_width; /* or si->denom; if it were != 0 */ + if (origNum < 0) { + if (newx >= 0) + newx = -1; + else if (newx < -wtmp) + newx = -wtmp; + } else if (origNum >= 0) { + if (newx < 0) + newx = 0; + else if (newx >= wtmp) + newx = wtmp - 1; + } + } + + si->num = newx; + /* This, finally, actually moves the title bar */ + /* XXX pressing a second button should cancel and undo this */ + SetFrameShape(tmp_win); + } + break; + } + case F_FUNCTION: + { + MenuRoot *mroot; + MenuItem *mitem; + + if ((mroot = FindMenuRoot(action)) == NULL) + { + if (!action) action = "undef"; + fprintf (stderr, "%s: couldn't find function \"%s\"\n", + ProgramName, (char *)action); + return TRUE; + } + + if (NeedToDefer(mroot) && DeferExecution(context, func, Scr->SelectCursor)) + return TRUE; + else + { + for (mitem = mroot->first; mitem != NULL; mitem = mitem->next) + { + if (!ExecuteFunction (mitem->func, mitem->action, w, + tmp_win, eventp, context, pulldown)) + /* pebl FIXME: the focus should be updated here, + or the function would operate on the same window */ + break; + } + } + } + break; + + case F_DEICONIFY: + case F_ICONIFY: + if (DeferExecution(context, func, Scr->SelectCursor)) + return TRUE; + + if (tmp_win->isicon) + { + DeIconify(tmp_win); + } + else if (func == F_ICONIFY) + { + Iconify (tmp_win, eventp->xbutton.x_root - 5, + eventp->xbutton.y_root - 5); + } + break; + + case F_SQUEEZE: + if (DeferExecution(context, func, Scr->SelectCursor)) + return TRUE; + + Squeeze (tmp_win); + break; + + case F_SHOWBGRD: + ShowBackground (Scr->currentvs); + break; + + case F_RAISELOWER: + if (DeferExecution(context, func, Scr->SelectCursor)) + return TRUE; + + if (!WindowMoved) { + if (tmp_win->icon && w == tmp_win->icon->w) { + RaiseLowerFrame(w, ONTOP_DEFAULT); + } else { + RaiseLower(tmp_win); + WMapRaiseLower (tmp_win); + } + } + break; + + case F_RAISE: + if (DeferExecution(context, func, Scr->SelectCursor)) + return TRUE; + + /* check to make sure raise is not from the WindowFunction */ + if (tmp_win->icon && (w == tmp_win->icon->w) && Context != C_ROOT) + XRaiseWindow(dpy, tmp_win->icon->w); + else { + RaiseWindow (tmp_win); + WMapRaise (tmp_win); + } + break; + + case F_LOWER: + if (DeferExecution(context, func, Scr->SelectCursor)) + return TRUE; + + if (tmp_win->icon && (w == tmp_win->icon->w)) + XLowerWindow(dpy, tmp_win->icon->w); + else { + LowerWindow(tmp_win); + WMapLower (tmp_win); + } + break; + + case F_RAISEICONS: + for (t = Scr->FirstWindow; t != NULL; t = t->next) { + if (t->icon && t->icon->w) { + XRaiseWindow (dpy, t->icon->w); + } + } + break; + + case F_FOCUS: + if (DeferExecution(context, func, Scr->SelectCursor)) + return TRUE; + + if (tmp_win->isicon == FALSE) + { + if (!Scr->FocusRoot && Scr->Focus == tmp_win) + { + FocusOnRoot(); + } + else + { + InstallWindowColormaps (0, tmp_win); + SetFocus (tmp_win, eventp->xbutton.time); + Scr->FocusRoot = FALSE; + } + } + break; + + case F_DESTROY: + if (DeferExecution(context, func, Scr->DestroyCursor)) + return TRUE; + + if (tmp_win->iconmgr || tmp_win->iswinbox || tmp_win->wspmgr + || (Scr->workSpaceMgr.occupyWindow + && tmp_win == Scr->workSpaceMgr.occupyWindow->twm_win)) { + XBell(dpy, 0); + break; + } + XKillClient(dpy, tmp_win->w); + if (ButtonPressed != -1) { + XEvent kev; + + XMaskEvent (dpy, ButtonReleaseMask, &kev); + if (kev.xbutton.window == tmp_win->w) kev.xbutton.window = Scr->Root; + XPutBackEvent (dpy, &kev); + } + break; + + case F_DELETE: + if (DeferExecution(context, func, Scr->DestroyCursor)) + return TRUE; + + if (tmp_win->iconmgr) { /* don't send ourself a message */ + HideIconManager (); + break; + } + if (tmp_win->iswinbox || tmp_win->wspmgr + || (Scr->workSpaceMgr.occupyWindow + && tmp_win == Scr->workSpaceMgr.occupyWindow->twm_win)) { + XBell (dpy, 0); + break; + } + if (tmp_win->protocols & DoesWmDeleteWindow) { + SendDeleteWindowMessage (tmp_win, LastTimestamp()); + if (ButtonPressed != -1) { + XEvent kev; + + XMaskEvent (dpy, ButtonReleaseMask, &kev); + if (kev.xbutton.window == tmp_win->w) kev.xbutton.window = Scr->Root; + XPutBackEvent (dpy, &kev); + } + break; + } + XBell (dpy, 0); + break; + + case F_DELETEORDESTROY: + if (DeferExecution(context, func, Scr->DestroyCursor)) return TRUE; + + if (tmp_win->iconmgr) { + HideIconManager (); + break; + } + if (tmp_win->iswinbox || tmp_win->wspmgr + || (Scr->workSpaceMgr.occupyWindow + && tmp_win == Scr->workSpaceMgr.occupyWindow->twm_win)) { + XBell (dpy, 0); + break; + } + if (tmp_win->protocols & DoesWmDeleteWindow) { + SendDeleteWindowMessage (tmp_win, LastTimestamp()); + } else { + XKillClient(dpy, tmp_win->w); + } + if (ButtonPressed != -1) { + XEvent kev; + + XMaskEvent (dpy, ButtonReleaseMask, &kev); + if (kev.xbutton.window == tmp_win->w) kev.xbutton.window = Scr->Root; + XPutBackEvent (dpy, &kev); + } + break; + + case F_SAVEYOURSELF: + if (DeferExecution (context, func, Scr->SelectCursor)) + return TRUE; + + if (tmp_win->protocols & DoesWmSaveYourself) + SendSaveYourselfMessage (tmp_win, LastTimestamp()); + else + XBell (dpy, 0); + break; + + case F_CIRCLEUP: + XCirculateSubwindowsUp(dpy, Scr->Root); + break; + + case F_CIRCLEDOWN: + XCirculateSubwindowsDown(dpy, Scr->Root); + break; + + case F_EXEC: + PopDownMenu(); + if (!Scr->NoGrabServer) { + XUngrabServer (dpy); + XSync (dpy, 0); + } + XUngrabPointer (dpy, CurrentTime); + XSync (dpy, 0); + Execute(action); + break; + + case F_UNFOCUS: + FocusOnRoot(); + break; + + case F_CUT: + strcpy(tmp, action); + strcat(tmp, "\n"); + XStoreBytes(dpy, tmp, strlen(tmp)); + break; + + case F_CUTFILE: + ptr = XFetchBytes(dpy, &count); + if (ptr) { + if (sscanf (ptr, "%s", tmp) == 1) { + XFree (ptr); + ptr = ExpandFilename(tmp); + if (ptr) { +#ifdef VMS + fd = open (ptr, O_RDONLY, 0); +#else + fd = open (ptr, 0); +#endif + if (fd >= 0) { + count = read (fd, buff, MAX_FILE_SIZE - 1); + if (count > 0) XStoreBytes (dpy, buff, count); + close(fd); + } else { + fprintf (stderr, + "%s: unable to open cut file \"%s\"\n", + ProgramName, tmp); + } + if (ptr != tmp) free (ptr); + } + } else { + XFree(ptr); + } + } else { + fprintf(stderr, "%s: cut buffer is empty\n", ProgramName); + } + break; + + case F_WARPTOSCREEN: + { + if (strcmp (action, WARPSCREEN_NEXT) == 0) { + WarpToScreen (Scr->screen + 1, 1); + } else if (strcmp (action, WARPSCREEN_PREV) == 0) { + WarpToScreen (Scr->screen - 1, -1); + } else if (strcmp (action, WARPSCREEN_BACK) == 0) { + WarpToScreen (PreviousScreen, 0); + } else { + WarpToScreen (atoi (action), 0); + } + } + break; + + case F_COLORMAP: + { + if (strcmp (action, COLORMAP_NEXT) == 0) { + BumpWindowColormap (tmp_win, 1); + } else if (strcmp (action, COLORMAP_PREV) == 0) { + BumpWindowColormap (tmp_win, -1); + } else { + BumpWindowColormap (tmp_win, 0); + } + } + break; + + case F_WARPTO: + { + register TwmWindow *tw; + int len; + + len = strlen(action); + +#ifdef WARPTO_FROM_ICONMGR + if (len == 0 && tmp_win && tmp_win->iconmgr) + { + printf ("curren iconmgr entry: %s", tmp_win->iconmgr->Current); + } +#endif /* #ifdef WARPTO_FROM_ICONMGR */ + for (tw = Scr->FirstWindow; tw != NULL; tw = tw->next) { + if (!strncmp(action, tw->full_name, len)) break; + if (match (action, tw->full_name)) break; + } + if (!tw) { + for (tw = Scr->FirstWindow; tw != NULL; tw = tw->next) { + if (!strncmp(action, tw->class.res_name, len)) break; + if (match (action, tw->class.res_name)) break; + } + if (!tw) { + for (tw = Scr->FirstWindow; tw != NULL; tw = tw->next) { + if (!strncmp(action, tw->class.res_class, len)) break; + if (match (action, tw->class.res_class)) break; + } + } + } + + if (tw) { + if (Scr->WarpUnmapped || tw->mapped) { + if (!tw->mapped) DeIconify (tw); + WarpToWindow (tw, Scr->RaiseOnWarp); + } + } else { + XBell (dpy, 0); + } + } + break; + + case F_WARPTOICONMGR: + { + TwmWindow *tw; + int len; + Window raisewin = None, iconwin = None; + + len = strlen(action); + if (len == 0) { + if (tmp_win && tmp_win->iconmanagerlist) { + raisewin = tmp_win->iconmanagerlist->iconmgr->twm_win->frame; + iconwin = tmp_win->iconmanagerlist->icon; + } else if (Scr->iconmgr->active) { + raisewin = Scr->iconmgr->twm_win->frame; + iconwin = Scr->iconmgr->active->w; + } + } else { + for (tw = Scr->FirstWindow; tw != NULL; tw = tw->next) { + if (strncmp (action, tw->icon_name, len) == 0) { + if (tw->iconmanagerlist && + tw->iconmanagerlist->iconmgr->twm_win->mapped) { + raisewin = tw->iconmanagerlist->iconmgr->twm_win->frame; + break; + } + } + } + } + + if (raisewin) { + RaiseFrame(raisewin); + XWarpPointer (dpy, None, iconwin, 0,0,0,0, 5, 5); + } else { + XBell (dpy, 0); + } + } + break; + + case F_RING: /* Taken from vtwm version 5.3 */ + if (DeferExecution (context, func, Scr->SelectCursor)) return TRUE; + if ( tmp_win->ring.next || tmp_win->ring.prev ) { + /* It's in the ring, let's take it out. */ + TwmWindow *prev = tmp_win->ring.prev, *next = tmp_win->ring.next; + + /* + * 1. Unlink window + * 2. If window was only thing in ring, null out ring + * 3. If window was ring leader, set to next (or null) + */ + if (prev) prev->ring.next = next; + if (next) next->ring.prev = prev; + if (Scr->Ring == tmp_win) + Scr->Ring = (next != tmp_win ? next : (TwmWindow *) NULL); + + if (!Scr->Ring || Scr->RingLeader == tmp_win) + Scr->RingLeader = Scr->Ring; + tmp_win->ring.next = tmp_win->ring.prev = NULL; + } else { + /* Not in the ring, so put it in. */ + if (Scr->Ring) { + tmp_win->ring.next = Scr->Ring->ring.next; + if (Scr->Ring->ring.next->ring.prev) + Scr->Ring->ring.next->ring.prev = tmp_win; + Scr->Ring->ring.next = tmp_win; + tmp_win->ring.prev = Scr->Ring; + } else { + tmp_win->ring.next = tmp_win->ring.prev = Scr->Ring = tmp_win; + } + } + /*tmp_win->ring.cursor_valid = False;*/ + break; + + case F_WARPRING: + switch (((char *)action)[0]) { + case 'n': + WarpAlongRing (&eventp->xbutton, True); + break; + case 'p': + WarpAlongRing (&eventp->xbutton, False); + break; + default: + XBell (dpy, 0); + break; + } + break; + + case F_FILE: + action = ExpandFilename(action); +#ifdef VMS + fd = open (action, O_RDONLY, 0); +#else + fd = open(action, 0); +#endif + if (fd >= 0) + { + count = read(fd, buff, MAX_FILE_SIZE - 1); + if (count > 0) + XStoreBytes(dpy, buff, count); + + close(fd); + } + else + { + fprintf (stderr, "%s: unable to open file \"%s\"\n", + ProgramName, (char *)action); + } + break; + + case F_REFRESH: + { + XSetWindowAttributes attributes; + unsigned long valuemask; + + valuemask = (CWBackPixel | CWBackingStore | CWSaveUnder); + attributes.background_pixel = Scr->Black; + attributes.backing_store = NotUseful; + attributes.save_under = False; + w = XCreateWindow (dpy, Scr->Root, 0, 0, + (unsigned int) Scr->rootw, + (unsigned int) Scr->rooth, + (unsigned int) 0, + CopyFromParent, (unsigned int) CopyFromParent, + (Visual *) CopyFromParent, valuemask, + &attributes); + XMapWindow (dpy, w); + XDestroyWindow (dpy, w); + XFlush (dpy); + } + break; + + case F_OCCUPY: + if (DeferExecution(context, func, Scr->SelectCursor)) + return TRUE; + Occupy (tmp_win); + break; + + case F_OCCUPYALL: + if (DeferExecution(context, func, Scr->SelectCursor)) + return TRUE; + OccupyAll (tmp_win); + break; + + case F_GOTOWORKSPACE: + GotoWorkSpaceByName (Scr->currentvs, action); + break; + + case F_PREVWORKSPACE: + GotoPrevWorkSpace (Scr->currentvs); + break; + + case F_NEXTWORKSPACE: + GotoNextWorkSpace (Scr->currentvs); + break; + + case F_RIGHTWORKSPACE: + GotoRightWorkSpace (Scr->currentvs); + break; + + case F_LEFTWORKSPACE: + GotoLeftWorkSpace (Scr->currentvs); + break; + + case F_UPWORKSPACE: + GotoUpWorkSpace (Scr->currentvs); + break; + + case F_DOWNWORKSPACE: + GotoDownWorkSpace (Scr->currentvs); + break; + + case F_MENU: + if (action && ! strncmp (action, "WGOTO : ", 8)) { + GotoWorkSpaceByName (/* XXXXX */ Scr->currentvs, + ((char *)action) + 8); + } + else { + MenuItem *item; + + item = ActiveItem; + while (item && item->sub) { + if (!item->sub->defaultitem) break; + if (item->sub->defaultitem->func != F_MENU) break; + item = item->sub->defaultitem; + } + if (item && item->sub && item->sub->defaultitem) { + ExecuteFunction (item->sub->defaultitem->func, + item->sub->defaultitem->action, + w, tmp_win, eventp, context, pulldown); + } + } + break; + + case F_WINREFRESH: + if (DeferExecution(context, func, Scr->SelectCursor)) + return TRUE; + + if (context == C_ICON && tmp_win->icon && tmp_win->icon->w) + w = XCreateSimpleWindow(dpy, tmp_win->icon->w, + 0, 0, 9999, 9999, 0, Scr->Black, Scr->Black); + else + w = XCreateSimpleWindow(dpy, tmp_win->frame, + 0, 0, 9999, 9999, 0, Scr->Black, Scr->Black); + + XMapWindow(dpy, w); + XDestroyWindow(dpy, w); + XFlush(dpy); + break; + + case F_ADOPTWINDOW: + adoptWindow (); + break; + + case F_TRACE: + DebugTrace (action); + break; + + case F_CHANGESIZE: + ChangeSize (action, tmp_win); + break; + + case F_QUIT: + Done(0); + break; + } + + if (ButtonPressed == -1) XUngrabPointer(dpy, CurrentTime); + return do_next_action; +} + + + +/*********************************************************************** + * + * Procedure: + * DeferExecution - defer the execution of a function to the + * next button press if the context is C_ROOT + * + * Inputs: + * context - the context in which the mouse button was pressed + * func - the function to defer + * cursor - the cursor to display while waiting + * + *********************************************************************** + */ + +int DeferExecution(int context, int func, Cursor cursor) +{ + if ((context == C_ROOT) || (context == C_ALTERNATE)) + { + LastCursor = cursor; + if (func == F_ADOPTWINDOW) { + XGrabPointer(dpy, Scr->Root, True, + ButtonPressMask | ButtonReleaseMask, + GrabModeAsync, GrabModeAsync, + None, cursor, CurrentTime); + } else { + XGrabPointer(dpy, Scr->Root, True, + ButtonPressMask | ButtonReleaseMask, + GrabModeAsync, GrabModeAsync, + Scr->Root, cursor, CurrentTime); + } + RootFunction = func; + + return (TRUE); + } + + return (FALSE); +} + + + +/*********************************************************************** + * + * Procedure: + * ReGrab - regrab the pointer with the LastCursor; + * + *********************************************************************** + */ + +void ReGrab(void) +{ + XGrabPointer(dpy, Scr->Root, True, + ButtonPressMask | ButtonReleaseMask, + GrabModeAsync, GrabModeAsync, + Scr->Root, LastCursor, CurrentTime); +} + + + +/*********************************************************************** + * + * Procedure: + * NeedToDefer - checks each function in the list to see if it + * is one that needs to be defered. + * + * Inputs: + * root - the menu root to check + * + *********************************************************************** + */ + +int NeedToDefer(MenuRoot *root) +{ + MenuItem *mitem; + + for (mitem = root->first; mitem != NULL; mitem = mitem->next) + { + switch (mitem->func) + { + case F_IDENTIFY: + case F_RESIZE: + case F_MOVE: + case F_FORCEMOVE: + case F_DEICONIFY: + case F_ICONIFY: + case F_RAISELOWER: + case F_RAISE: + case F_LOWER: + case F_FOCUS: + case F_DESTROY: + case F_WINREFRESH: + case F_ZOOM: + case F_FULLZOOM: + case F_HORIZOOM: + case F_RIGHTZOOM: + case F_LEFTZOOM: + case F_TOPZOOM: + case F_BOTTOMZOOM: + case F_SQUEEZE: + case F_AUTORAISE: + case F_AUTOLOWER: + return TRUE; + } + } + return FALSE; +} + + + +/*********************************************************************** + * + * Procedure: + * Execute - execute the string by /bin/sh + * + * Inputs: + * s - the string containing the command + * + *********************************************************************** + */ + +void Execute(char *s) +{ +#ifdef VMS + createProcess(s); +#else + static char buf[256]; + char *ds = DisplayString (dpy); + char *colon, *dot1; + char oldDisplay[256]; + char *doisplay; + int restorevar = 0; + Bool replace; + char *subs, *name, *news; + int len; + + oldDisplay[0] = '\0'; + doisplay=getenv("DISPLAY"); + if (doisplay) + strcpy (oldDisplay, doisplay); + + /* + * Build a display string using the current screen number, so that + * X programs which get fired up from a menu come up on the screen + * that they were invoked from, unless specifically overridden on + * their command line. + */ + colon = strrchr (ds, ':'); + if (colon) { /* if host[:]:dpy */ + strcpy (buf, "DISPLAY="); + strcat (buf, ds); + colon = buf + 8 + (colon - ds); /* use version in buf */ + dot1 = strchr (colon, '.'); /* first period after colon */ + if (!dot1) dot1 = colon + strlen (colon); /* if not there, append */ + (void) sprintf (dot1, ".%d", Scr->screen); + putenv (buf); + restorevar = 1; + } + replace = False; + subs = strstr (s, "$currentworkspace"); + name = GetCurrentWorkSpaceName (Scr->currentvs); + if (subs && name) { + len = strlen (s) - strlen ("$currentworkspace") + strlen (name); + news = (char*) malloc (len + 1); + *subs = '\0'; + strcpy (news, s); + *subs = '$'; + strcat (news, name); + subs += strlen ("$currentworkspace"); + strcat (news, subs); + s = news; + replace = True; + } + subs = strstr (s, "$redirect"); + if (subs) { + if (captive) { + name = (char*) malloc (21 + strlen (captivename) + 1); + sprintf (name, "-xrm 'ctwm.redirect:%s'", captivename); + } else { + name = (char*) malloc (1); + *name = '\0'; + } + len = strlen (s) - strlen ("$redirect") + strlen (name); + news = (char*) malloc (len + 1); + *subs = '\0'; + strcpy (news, s); + *subs = '$'; + strcat (news, name); + subs += strlen ("$redirect"); + strcat (news, subs); + s = news; + free (name); + replace = True; + } +#ifdef USE_SIGNALS + { + SigProc sig; + + sig = signal (SIGALRM, SIG_IGN); + (void) system (s); + signal (SIGALRM, sig); + } +#else /* USE_SIGNALS */ + (void) system (s); +#endif /* USE_SIGNALS */ + + if (restorevar) { /* why bother? */ + (void) sprintf (buf, "DISPLAY=%s", oldDisplay); + putenv (buf); + } + if (replace) free (s); +#endif +} + + + +Window lowerontop = -1; + +void PlaceTransients (TwmWindow *tmp_win, int where) +{ + int sp, sc; + TwmWindow *t; + XWindowChanges xwc; + xwc.stack_mode = where; + + sp = tmp_win->frame_width * tmp_win->frame_height; + for (t = Scr->FirstWindow; t != NULL; t = t->next) { + if (t != tmp_win && + ((t->transient && t->transientfor == tmp_win->w) || + t->group == tmp_win->w)) { + if (t->frame) { + sc = t->frame_width * t->frame_height; + if (sc < ((sp * Scr->TransientOnTop) / 100)) { + xwc.sibling = tmp_win->frame; + XConfigureWindow(dpy, t->frame, CWSibling | CWStackMode, &xwc); + if (lowerontop == t->frame) { + lowerontop = (Window)-1; + } + } + } + } + } +} + +#include + +void PlaceOntop (int ontop, int where) +{ + TwmWindow *t; + XWindowChanges xwc; + xwc.stack_mode = where; + + lowerontop = (Window)-1; + + for (t = Scr->FirstWindow; t != NULL; t = t->next) { + if (t->ontoppriority > ontop) { + XConfigureWindow(dpy, t->frame, CWStackMode, &xwc); + PlaceTransients(t, Above); + if (lowerontop == (Window)-1) { + lowerontop = t->frame; + } + } + } +} + +void MapRaised (TwmWindow *tmp_win) +{ + XMapWindow(dpy, tmp_win->frame); + RaiseWindow(tmp_win); +} + +void RaiseWindow (TwmWindow *tmp_win) +{ + XWindowChanges xwc; + int xwcm; + + if (tmp_win->ontoppriority == ONTOP_MAX) { + XRaiseWindow(dpy, tmp_win->frame); + if (lowerontop == (Window)-1) { + lowerontop = tmp_win->frame; + } else if (lowerontop == tmp_win->frame) { + lowerontop = (Window)-1; + } + } else { + if (lowerontop == (Window)-1) { + PlaceOntop(tmp_win->ontoppriority, Above); + } + xwcm = CWStackMode; + if (lowerontop != (Window)-1) { + xwc.stack_mode = Below; + xwc.sibling = lowerontop; + xwcm |= CWSibling; + } else { + xwc.stack_mode = Above; + } + XConfigureWindow(dpy, tmp_win->frame, xwcm, &xwc); + } + PlaceTransients(tmp_win, Above); +} + +void RaiseLower (TwmWindow *tmp_win) +{ + XWindowChanges xwc; + + PlaceOntop(tmp_win->ontoppriority, Below); + PlaceTransients(tmp_win, Below); + lowerontop = (Window)-1; + xwc.stack_mode = Opposite; + XConfigureWindow(dpy, tmp_win->frame, CWStackMode, &xwc); + PlaceOntop(tmp_win->ontoppriority, Above); + PlaceTransients(tmp_win, Above); +} + +void RaiseLowerFrame (Window frame, int ontop) +{ + XWindowChanges xwc; + + PlaceOntop(ontop, Below); + lowerontop = (Window)-1; + xwc.stack_mode = Opposite; + XConfigureWindow(dpy, frame, CWStackMode, &xwc); + PlaceOntop(ontop, Above); +} + +void LowerWindow (TwmWindow *tmp_win) +{ + XLowerWindow(dpy, tmp_win->frame); + if (tmp_win->frame == lowerontop) { + lowerontop = (Window)-1; + } + PlaceTransients(tmp_win, Above); +} + +void RaiseFrame (Window frame) +{ + TwmWindow *tmp_win; + + tmp_win = GetTwmWindow(frame); + + if (tmp_win != NULL) { + RaiseWindow(tmp_win); + } else { + XRaiseWindow(dpy, frame); + } +} + +/*********************************************************************** + * + * Procedure: + * FocusOnRoot - put input focus on the root window + * + *********************************************************************** + */ + +void FocusOnRoot(void) +{ + SetFocus ((TwmWindow *) NULL, LastTimestamp()); + InstallColormaps(0, &Scr->RootColormaps); + if (! Scr->ClickToFocus) Scr->FocusRoot = TRUE; +} + +static void ReMapOne(TwmWindow *t, TwmWindow *leader) +{ + if (t->icon_on) + Zoom(t->icon->w, t->frame); + else if (leader->icon) + Zoom(leader->icon->w, t->frame); + + if (!t->squeezed) + XMapWindow(dpy, t->w); + t->mapped = TRUE; + if (Scr->Root != Scr->CaptiveRoot) /* XXX dubious test */ + XReparentWindow (dpy, t->frame, Scr->Root, t->frame_x, t->frame_y); + if (Scr->NoRaiseDeicon) + XMapWindow(dpy, t->frame); + else + MapRaised(t); + SetMapStateProp(t, NormalState); + + if (t->icon && t->icon->w) { + XUnmapWindow(dpy, t->icon->w); + IconDown(t); + if (Scr->ShrinkIconTitles) + t->icon->title_shrunk = True; + } + if (t->iconmanagerlist) { + WList *wl; + + for (wl = t->iconmanagerlist; wl != NULL; wl = wl->nextv) + XUnmapWindow(dpy, wl->icon); + } + t->isicon = FALSE; + t->icon_on = FALSE; + WMapDeIconify(t); +} + +static void ReMapTransients(TwmWindow *tmp_win) +{ + TwmWindow *t; + + /* find t such that it is a transient or group member window */ + for (t = Scr->FirstWindow; t != NULL; t = t->next) { + if (t != tmp_win && + ((t->transient && t->transientfor == tmp_win->w) || + (t->group == tmp_win->w && t->isicon))) { + ReMapOne(t, tmp_win); + } + } +} + +void DeIconify(TwmWindow *tmp_win) +{ + TwmWindow *t = tmp_win; + int isicon = FALSE; + + /* de-iconify the main window */ + if (Scr->WindowMask) + XRaiseWindow (dpy, Scr->WindowMask); + if (tmp_win->isicon) + { + isicon = TRUE; + if (tmp_win->icon_on && tmp_win->icon && tmp_win->icon->w) + Zoom(tmp_win->icon->w, tmp_win->frame); + else if (tmp_win->group != (Window) 0) + { + t = GetTwmWindow(tmp_win->group); + if (t && t->icon_on && t->icon && t->icon->w) + { + Zoom(t->icon->w, tmp_win->frame); + } + } + } + + ReMapOne(tmp_win, t); + + if (isicon && + (Scr->WarpCursor || + LookInList(Scr->WarpCursorL, tmp_win->full_name, &tmp_win->class))) + WarpToWindow (tmp_win, 0); + + /* now de-iconify and window group transients */ + ReMapTransients(tmp_win); + + if (! Scr->WindowMask && Scr->DeIconifyFunction.func != 0) { + char *action; + XEvent event; + + action = Scr->DeIconifyFunction.item ? + Scr->DeIconifyFunction.item->action : NULL; + ExecuteFunction (Scr->DeIconifyFunction.func, action, + (Window) 0, tmp_win, &event, C_ROOT, FALSE); + } + XSync (dpy, 0); +} + + +static void UnmapTransients(TwmWindow *tmp_win, int iconify, unsigned long eventMask) +{ + TwmWindow *t; + + for (t = Scr->FirstWindow; t != NULL; t = t->next) { + if (t != tmp_win && + ((t->transient && t->transientfor == tmp_win->w) || + t->group == tmp_win->w)) { + if (iconify) { + if (t->icon_on) + Zoom(t->icon->w, tmp_win->icon->w); + else if (tmp_win->icon) + Zoom(t->frame, tmp_win->icon->w); + } + + /* + * Prevent the receipt of an UnmapNotify, since that would + * cause a transition to the Withdrawn state. + */ + t->mapped = FALSE; + XSelectInput(dpy, t->w, eventMask & ~StructureNotifyMask); + XUnmapWindow(dpy, t->w); + XUnmapWindow(dpy, t->frame); + XSelectInput(dpy, t->w, eventMask); + if (t->icon && t->icon->w) XUnmapWindow(dpy, t->icon->w); + SetMapStateProp(t, IconicState); + if (t == Scr->Focus) { + SetFocus ((TwmWindow *) NULL, LastTimestamp()); + if (! Scr->ClickToFocus) Scr->FocusRoot = TRUE; + } + if (t->iconmanagerlist) + XMapWindow(dpy, t->iconmanagerlist->icon); + t->isicon = TRUE; + t->icon_on = FALSE; + WMapIconify (t); + } + } +} + +void Iconify(TwmWindow *tmp_win, int def_x, int def_y) +{ + TwmWindow *t; + int iconify; + XWindowAttributes winattrs; + unsigned long eventMask; + WList *wl; + Window leader = (Window)-1; + Window blanket = (Window)-1; + + iconify = (!tmp_win->iconify_by_unmapping); + t = (TwmWindow*) 0; + if (tmp_win->transient) { + leader = tmp_win->transientfor; + t = GetTwmWindow(leader); + } + else + if ((leader = tmp_win->group) != 0 && leader != tmp_win->w) { + t = GetTwmWindow(leader); + } + if (t && t->icon_on) iconify = False; + if (iconify) + { + if (!tmp_win->icon || !tmp_win->icon->w) + CreateIconWindow(tmp_win, def_x, def_y); + else + IconUp(tmp_win); + if (visible (tmp_win)) { + if (Scr->WindowMask) { + XRaiseWindow (dpy, Scr->WindowMask); + XMapWindow(dpy, tmp_win->icon->w); + } + else + XMapRaised(dpy, tmp_win->icon->w); + } + } + if (tmp_win->iconmanagerlist) { + for (wl = tmp_win->iconmanagerlist; wl != NULL; wl = wl->nextv) { + XMapWindow(dpy, wl->icon); + } + } + + XGetWindowAttributes(dpy, tmp_win->w, &winattrs); + eventMask = winattrs.your_event_mask; + + /* iconify transients and window group first */ + UnmapTransients(tmp_win, iconify, eventMask); + + if (iconify) Zoom(tmp_win->frame, tmp_win->icon->w); + + /* + * Prevent the receipt of an UnmapNotify, since that would + * cause a transition to the Withdrawn state. + */ + tmp_win->mapped = FALSE; + + if ((Scr->IconifyStyle != ICONIFY_NORMAL) && !Scr->WindowMask) { + XSetWindowAttributes attr; + XGetWindowAttributes(dpy, tmp_win->frame, &winattrs); + attr.backing_store = NotUseful; + attr.save_under = False; + blanket = XCreateWindow (dpy, Scr->Root, winattrs.x, winattrs.y, + winattrs.width, winattrs.height, (unsigned int) 0, + CopyFromParent, (unsigned int) CopyFromParent, + (Visual *) CopyFromParent, CWBackingStore | CWSaveUnder, &attr); + XMapWindow (dpy, blanket); + } + XSelectInput(dpy, tmp_win->w, eventMask & ~StructureNotifyMask); + XUnmapWindow(dpy, tmp_win->w); + XUnmapWindow(dpy, tmp_win->frame); + XSelectInput(dpy, tmp_win->w, eventMask); + SetMapStateProp(tmp_win, IconicState); + + if ((Scr->IconifyStyle != ICONIFY_NORMAL) && !Scr->WindowMask) { + switch (Scr->IconifyStyle) { + case ICONIFY_MOSAIC: MosaicFade (tmp_win, blanket); break; + case ICONIFY_ZOOMIN: ZoomInWindow (tmp_win, blanket); break; + case ICONIFY_ZOOMOUT: ZoomOutWindow (tmp_win, blanket); break; + case ICONIFY_SWEEP: SweepWindow (tmp_win, blanket); break; + } + XDestroyWindow (dpy, blanket); + } + if (tmp_win == Scr->Focus) { + SetFocus ((TwmWindow *) NULL, LastTimestamp()); + if (! Scr->ClickToFocus) Scr->FocusRoot = TRUE; + } + tmp_win->isicon = TRUE; + tmp_win->icon_on = iconify ? TRUE : FALSE; + WMapIconify (tmp_win); + if (! Scr->WindowMask && Scr->IconifyFunction.func != 0) { + char *action; + XEvent event; + + action = Scr->IconifyFunction.item ? Scr->IconifyFunction.item->action : NULL; + ExecuteFunction (Scr->IconifyFunction.func, action, + (Window) 0, tmp_win, &event, C_ROOT, FALSE); + } + XSync (dpy, 0); +} + +void AutoSqueeze (TwmWindow *tmp_win) +{ + if (tmp_win->iconmgr) return; + if (Scr->RaiseWhenAutoUnSqueeze && tmp_win->squeezed) XRaiseWindow (dpy, tmp_win->frame); + Squeeze (tmp_win); +} + +void Squeeze (TwmWindow *tmp_win) +{ + long fx, fy, savex, savey; + int neww, newh, south; + int grav = ((tmp_win->hints.flags & PWinGravity) + ? tmp_win->hints.win_gravity : NorthWestGravity); + XWindowAttributes winattrs; + unsigned long eventMask; +#ifdef GNOME + unsigned char *prop; + unsigned long nitems, bytesafter; + Atom actual_type; + int actual_format; + long gwkspc; +#endif /* GNOME */ + if (tmp_win->squeezed) { + tmp_win->squeezed = False; +#ifdef GNOME + XGetWindowAttributes (dpy, tmp_win->w, &winattrs); + eventMask = winattrs.your_event_mask; + XSelectInput (dpy, tmp_win->w, eventMask & ~PropertyChangeMask); + if (XGetWindowProperty (dpy, tmp_win->w, _XA_WIN_STATE, 0L, 32, False, + XA_CARDINAL, &actual_type, &actual_format, + &nitems, &bytesafter, &prop) + != Success || nitems == 0) { + gwkspc = 0; + } else { + gwkspc = (int)*prop; + XFree ((char *)prop); + } + gwkspc &= ~WIN_STATE_SHADED; + XChangeProperty (dpy, tmp_win->w, _XA_WIN_STATE, XA_CARDINAL, 32, + PropModeReplace, (unsigned char *)&gwkspc, 1); + XSelectInput(dpy, tmp_win->w, eventMask); +#endif /* GNOME */ + if (!tmp_win->isicon) XMapWindow (dpy, tmp_win->w); + SetupWindow (tmp_win, tmp_win->actual_frame_x, tmp_win->actual_frame_y, + tmp_win->actual_frame_width, tmp_win->actual_frame_height, -1); + ReMapTransients(tmp_win); + return; + } + + newh = tmp_win->title_height + 2 * tmp_win->frame_bw3D; + if (newh < 3) { XBell (dpy, 0); return; } + switch (grav) { + case SouthWestGravity : + case SouthGravity : + case SouthEastGravity : + south = True; break; + default : + south = False; break; + } + if (tmp_win->title_height && !tmp_win->AlwaysSqueezeToGravity) south = False; + + tmp_win->squeezed = True; + tmp_win->actual_frame_width = tmp_win->frame_width; + tmp_win->actual_frame_height = tmp_win->frame_height; + savex = fx = tmp_win->frame_x; + savey = fy = tmp_win->frame_y; + neww = tmp_win->actual_frame_width; + if (south) fy += tmp_win->frame_height - newh; + if (tmp_win->squeeze_info) { + fx += tmp_win->title_x - tmp_win->frame_bw3D; + neww = tmp_win->title_width + 2 * (tmp_win->frame_bw + tmp_win->frame_bw3D); + } + XGetWindowAttributes(dpy, tmp_win->w, &winattrs); + eventMask = winattrs.your_event_mask; +#ifdef GNOME + XSelectInput (dpy, tmp_win->w, eventMask & ~(StructureNotifyMask | PropertyChangeMask)); + if (XGetWindowProperty (dpy, tmp_win->w, _XA_WIN_STATE, 0L, 32, False, + XA_CARDINAL, &actual_type, &actual_format, &nitems, + &bytesafter, &prop) + != Success || nitems == 0) { + gwkspc = 0; + } else { + gwkspc = (int)*prop; + XFree ((char *)prop); + } + gwkspc |= WIN_STATE_SHADED; + XChangeProperty (dpy, tmp_win->w, _XA_WIN_STATE, XA_CARDINAL, 32, + PropModeReplace, (unsigned char *)&gwkspc, 1); +#else + XSelectInput (dpy, tmp_win->w, eventMask & ~StructureNotifyMask); +#endif /* GNOME */ + XUnmapWindow(dpy, tmp_win->w); + XSelectInput(dpy, tmp_win->w, eventMask); + + if (fx + neww >= Scr->rootw - Scr->BorderRight) + fx = Scr->rootw - Scr->BorderRight - neww; + if (fy + newh >= Scr->rooth - Scr->BorderBottom) + fy = Scr->rooth - Scr->BorderBottom - newh; + SetupWindow (tmp_win, fx, fy, neww, newh, -1); + tmp_win->actual_frame_x = savex; + tmp_win->actual_frame_y = savey; + + /* Now make the group members disappear */ + UnmapTransients(tmp_win, 0, eventMask); +} + +static void Identify (TwmWindow *t) +{ + int i, n, twidth, width, height; + int x, y; + unsigned int wwidth, wheight, bw, depth; + Window junk; + int px, py, dummy; + unsigned udummy; + unsigned char *prop; + unsigned long nitems, bytesafter; + Atom actual_type; + int actual_format; + XRectangle inc_rect; + XRectangle logical_rect; + Bool first = True; + + n = 0; + (void) sprintf(Info[n++], "Twm version: %s", Version); + (void) sprintf(Info[n], "Compile time options :"); +#ifdef XPM + (void) strcat (Info[n], " XPM"); + first = False; +#endif +#ifdef IMCONV + if (!first) (void) strcat(Info[n], ", "); + (void) strcat (Info[n], "IMCONV"); + first = False; +#endif +#ifdef USEM4 + if (!first) (void) strcat(Info[n], ", "); + (void) strcat (Info[n], "USEM4"); + first = False; +#endif +#ifdef GNOME + if (!first) (void) strcat(Info[n], ", "); + (void) strcat (Info[n], "GNOME"); + first = False; +#endif +#ifdef SOUNDS + if (!first) (void) strcat(Info[n], ", "); + (void) strcat (Info[n], "SOUNDS"); + first = False; +#endif +#ifdef DEBUG + if (!first) (void) strcat(Info[n], ", "); + (void) strcat (Info[n], "debug"); + first = False; +#endif + if (!first) (void) strcat(Info[n], ", "); + (void) strcat (Info[n], "I18N"); + first = False; + n++; + Info[n++][0] = '\0'; + + if (t) { + XGetGeometry (dpy, t->w, &JunkRoot, &JunkX, &JunkY, + &wwidth, &wheight, &bw, &depth); + (void) XTranslateCoordinates (dpy, t->w, Scr->Root, 0, 0, + &x, &y, &junk); + (void) sprintf(Info[n++], "Name = \"%s\"", t->full_name); + (void) sprintf(Info[n++], "Class.res_name = \"%s\"", t->class.res_name); + (void) sprintf(Info[n++], "Class.res_class = \"%s\"", t->class.res_class); + Info[n++][0] = '\0'; + (void) sprintf(Info[n++], "Geometry/root (UL) = %dx%d+%d+%d (Inner: %dx%d+%d+%d)", + wwidth + 2 * (bw + t->frame_bw3D), + wheight + 2 * (bw + t->frame_bw3D) + t->title_height, + x - (bw + t->frame_bw3D), + y - (bw + t->frame_bw3D + t->title_height), + wwidth, wheight, x, y); + (void) sprintf(Info[n++], "Geometry/root (LR) = %dx%d-%d-%d (Inner: %dx%d-%d-%d)", + wwidth + 2 * (bw + t->frame_bw3D), + wheight + 2 * (bw + t->frame_bw3D) + t->title_height, + Scr->rootw - (x + wwidth + bw + t->frame_bw3D), + Scr->rooth - (y + wheight + bw + t->frame_bw3D), + wwidth, wheight, + Scr->rootw - (x + wwidth), Scr->rooth - (y + wheight)); + (void) sprintf(Info[n++], "Border width = %d", bw); + (void) sprintf(Info[n++], "3D border width = %d", t->frame_bw3D); + (void) sprintf(Info[n++], "Depth = %d", depth); + + if (XGetWindowProperty (dpy, t->w, _XA_WM_CLIENT_MACHINE, 0L, 64, False, + XA_STRING, &actual_type, &actual_format, &nitems, + &bytesafter, &prop) == Success) { + if (nitems && prop) { + (void) sprintf(Info[n++], "Client machine = %s", (char*)prop); + XFree ((char *) prop); + } + } + Info[n++][0] = '\0'; + } + + (void) sprintf(Info[n++], "Click to dismiss...."); + + /* figure out the width and height of the info window */ + height = n * (Scr->DefaultFont.height+2); + width = 1; + for (i = 0; i < n; i++) + { + XmbTextExtents(Scr->DefaultFont.font_set, Info[i], + strlen(Info[i]), &inc_rect, &logical_rect); + + twidth = logical_rect.width; + if (twidth > width) + width = twidth; + } + if (InfoLines) XUnmapWindow(dpy, Scr->InfoWindow); + + width += 10; /* some padding */ + height += 10; /* some padding */ + if (XQueryPointer (dpy, Scr->Root, &JunkRoot, &JunkChild, + &dummy, &dummy, &px, &py, &udummy)) { + px -= (width / 2); + py -= (height / 3); + if (px + width + BW2 >= Scr->rootw) + px = Scr->rootw - width - BW2; + if (py + height + BW2 >= Scr->rooth) + py = Scr->rooth - height - BW2; + if (px < 0) px = 0; + if (py < 0) py = 0; + } else { + px = py = 0; + } + XMoveResizeWindow(dpy, Scr->InfoWindow, px, py, width, height); + XMapRaised(dpy, Scr->InfoWindow); + InfoLines = n; + InfoWidth = width; + InfoHeight = height; +} + + + + void SetMapStateProp(TwmWindow *tmp_win, int state) +{ + unsigned long data[2]; /* "suggested" by ICCCM version 1 */ + + data[0] = (unsigned long) state; + data[1] = (unsigned long) (tmp_win->iconify_by_unmapping ? None : + (tmp_win->icon ? tmp_win->icon->w : None)); + + XChangeProperty (dpy, tmp_win->w, _XA_WM_STATE, _XA_WM_STATE, 32, + PropModeReplace, (unsigned char *) data, 2); +} + + + +Bool GetWMState (Window w, int *statep, Window *iwp) +{ + Atom actual_type; + int actual_format; + unsigned long nitems, bytesafter; + unsigned long *datap = NULL; + Bool retval = False; + + if (XGetWindowProperty (dpy, w, _XA_WM_STATE, 0L, 2L, False, _XA_WM_STATE, + &actual_type, &actual_format, &nitems, &bytesafter, + (unsigned char **) &datap) != Success || !datap) + return False; + + if (nitems <= 2) { /* "suggested" by ICCCM version 1 */ + *statep = (int) datap[0]; + *iwp = (Window) datap[1]; + retval = True; + } + + XFree ((char *) datap); + return retval; +} + + + +int WarpToScreen (int n, int inc) +{ + Window dumwin; + int x, y, dumint; + unsigned int dummask; + ScreenInfo *newscr = NULL; + + while (!newscr) { + /* wrap around */ + if (n < 0) + n = NumScreens - 1; + else if (n >= NumScreens) + n = 0; + + newscr = ScreenList[n]; + if (!newscr) { /* make sure screen is managed */ + if (inc) { /* walk around the list */ + n += inc; + continue; + } + fprintf (stderr, "%s: unable to warp to unmanaged screen %d\n", + ProgramName, n); + XBell (dpy, 0); + return (1); + } + } + + if (Scr->screen == n) return (0); /* already on that screen */ + + PreviousScreen = Scr->screen; + XQueryPointer (dpy, Scr->Root, &dumwin, &dumwin, &x, &y, + &dumint, &dumint, &dummask); + + XWarpPointer (dpy, None, newscr->Root, 0, 0, 0, 0, x, y); + Scr = newscr; + return (0); +} + + + + +/* + * BumpWindowColormap - rotate our internal copy of WM_COLORMAP_WINDOWS + */ + +int BumpWindowColormap (TwmWindow *tmp, int inc) +{ + int i, j, previously_installed; + ColormapWindow **cwins; + + if (!tmp) return (1); + + if (inc && tmp->cmaps.number_cwins > 0) { + cwins = (ColormapWindow **) malloc(sizeof(ColormapWindow *)* + tmp->cmaps.number_cwins); + if (cwins) { + if ((previously_installed = + /* SUPPRESS 560 */(Scr->cmapInfo.cmaps == &tmp->cmaps && + tmp->cmaps.number_cwins))) { + for (i = tmp->cmaps.number_cwins; i-- > 0; ) + tmp->cmaps.cwins[i]->colormap->state = 0; + } + + for (i = 0; i < tmp->cmaps.number_cwins; i++) { + j = i - inc; + if (j >= tmp->cmaps.number_cwins) + j -= tmp->cmaps.number_cwins; + else if (j < 0) + j += tmp->cmaps.number_cwins; + cwins[j] = tmp->cmaps.cwins[i]; + } + + free((char *) tmp->cmaps.cwins); + + tmp->cmaps.cwins = cwins; + + if (tmp->cmaps.number_cwins > 1) + memset (tmp->cmaps.scoreboard, 0, + ColormapsScoreboardLength(&tmp->cmaps)); + + if (previously_installed) { + InstallColormaps(PropertyNotify, NULL); + } + } + } else + FetchWmColormapWindows (tmp); + return (1); +} + + + +void ShowIconManager (void) +{ + IconMgr *i; + WorkSpace *wl; + + if (! Scr->workSpaceManagerActive) return; + + if (Scr->NoIconManagers) return; + for (wl = Scr->workSpaceMgr.workSpaceList; wl != NULL; wl = wl->next) { + for (i = wl->iconmgr; i != NULL; i = i->next) { + if (i->count == 0) continue; + if (visible (i->twm_win)) { + SetMapStateProp (i->twm_win, NormalState); + XMapWindow (dpy, i->twm_win->w); + MapRaised (i->twm_win); + if (i->twm_win->icon && i->twm_win->icon->w) + XUnmapWindow (dpy, i->twm_win->icon->w); + } + i->twm_win->mapped = TRUE; + i->twm_win->isicon = FALSE; + } + } +} + + +void HideIconManager (void) +{ + IconMgr *i; + WorkSpace *wl; + + if (Scr->NoIconManagers) return; + for (wl = Scr->workSpaceMgr.workSpaceList; wl != NULL; wl = wl->next) { + for (i = wl->iconmgr; i != NULL; i = i->next) { + SetMapStateProp (i->twm_win, WithdrawnState); + XUnmapWindow(dpy, i->twm_win->frame); + if (i->twm_win->icon && i->twm_win->icon->w) XUnmapWindow (dpy, i->twm_win->icon->w); + i->twm_win->mapped = FALSE; + i->twm_win->isicon = TRUE; + } + } +} + + + + +void DestroyMenu (MenuRoot *menu) +{ + MenuItem *item; + + if (menu->w) { + XDeleteContext (dpy, menu->w, MenuContext); + XDeleteContext (dpy, menu->w, ScreenContext); + if (Scr->Shadow) XDestroyWindow (dpy, menu->shadow); + XDestroyWindow(dpy, menu->w); + } + + for (item = menu->first; item; ) { + MenuItem *tmp = item; + item = item->next; + free ((char *) tmp); + } +} + + + +/* + * warping routines + */ + +void WarpAlongRing (XButtonEvent *ev, Bool forward) +{ + TwmWindow *r, *head; + + if (Scr->RingLeader) + head = Scr->RingLeader; + else if (!(head = Scr->Ring)) + return; + + if (forward) { + for (r = head->ring.next; r != head; r = r->ring.next) { + if (!r) break; + if (r->mapped && (Scr->WarpRingAnyWhere || visible (r))) break; + } + } else { + for (r = head->ring.prev; r != head; r = r->ring.prev) { + if (!r) break; + if (r->mapped && (Scr->WarpRingAnyWhere || visible (r))) break; + } + } + + /* Note: (Scr->Focus != r) is necessary when we move to a workspace that + has a single window and we want warping to warp to it. */ + if (r && (r != head || Scr->Focus != r)) { + TwmWindow *p = Scr->RingLeader, *t; + + Scr->RingLeader = r; + WarpToWindow (r, 1); + + if (p && p->mapped && + (t = GetTwmWindow(ev->window)) && + p == t) { + p->ring.cursor_valid = True; + p->ring.curs_x = ev->x_root - t->frame_x; + p->ring.curs_y = ev->y_root - t->frame_y; +#ifdef DEBUG + fprintf(stderr, "WarpAlongRing: cursor_valid := True; x := %d (%d-%d), y := %d (%d-%d)\n", Tmp_win->ring.curs_x, ev->x_root, t->frame_x, Tmp_win->ring.curs_y, ev->y_root, t->frame_y); +#endif + /* + * The check if the cursor position is inside the window is now + * done in WarpToWindow(). + */ + } + } +} + + + +void WarpToWindow (TwmWindow *t, int must_raise) +{ + int x, y; + + if (t->ring.cursor_valid) { + x = t->ring.curs_x; + y = t->ring.curs_y; +#ifdef DEBUG + fprintf(stderr, "WarpToWindow: cursor_valid; x == %d, y == %d\n", x, y); +#endif + + /* + * XXX is this correct with 3D borders? Easier check possible? + * frame_bw is for the left border. + */ + if (x < t->frame_bw) + x = t->frame_bw; + if (x >= t->frame_width + t->frame_bw) + x = t->frame_width + t->frame_bw - 1; + if (y < t->title_height + t->frame_bw) + y = t->title_height + t->frame_bw; + if (y >= t->frame_height + t->frame_bw) + y = t->frame_height + t->frame_bw - 1; +#ifdef DEBUG + fprintf(stderr, "WarpToWindow: adjusted ; x := %d, y := %d\n", x, y); +#endif + } else { + x = t->frame_width / 2; + y = t->frame_height / 2; +#ifdef DEBUG + fprintf(stderr, "WarpToWindow: middle; x := %d, y := %d\n", x, y); +#endif + } +#if 0 + int dest_x, dest_y; + Window child; + + /* + * Check if the proposed position actually is visible. If not, raise the window. + * "If the coordinates are contained in a mapped + * child of dest_w, that child is returned to child_return." + * We'll need to check for the right child window; the frame probably. + * (What about XXX window boxes?) + * + * Alternatively, use XQueryPointer() which returns the root window + * the pointer is in, but XXX that won't work for VirtualScreens. + */ + if (XTranslateCoordinates(dpy, t->frame, Scr->Root, x, y, &dest_x, &dest_y, &child)) { + if (child != t->frame) + must_raise = 1; + } +#endif + if (t->auto_raise || must_raise) AutoRaiseWindow (t); + if (! visible (t)) { + WorkSpace *wlist; + + for (wlist = Scr->workSpaceMgr.workSpaceList; wlist != NULL; wlist = wlist->next) { + if (OCCUPY (t, wlist)) break; + } + if (wlist != NULL) GotoWorkSpace (Scr->currentvs, wlist); + } + XWarpPointer (dpy, None, Scr->Root, 0, 0, 0, 0, x + t->frame_x, y + t->frame_y); +#ifdef DEBUG + { + Window root_return; + Window child_return; + int root_x_return; + int root_y_return; + int win_x_return; + int win_y_return; + unsigned int mask_return; + + if (XQueryPointer(dpy, t->frame, &root_return, &child_return, &root_x_return, &root_y_return, &win_x_return, &win_y_return, &mask_return)) { + fprintf(stderr, "XQueryPointer: root_return=%x, child_return=%x, root_x_return=%d, root_y_return=%d, win_x_return=%d, win_y_return=%d\n", root_return, child_return, root_x_return, root_y_return, win_x_return, win_y_return); + } + } +#endif +} + + + + +/* + * ICCCM Client Messages - Section 4.2.8 of the ICCCM dictates that all + * client messages will have the following form: + * + * event type ClientMessage + * message type _XA_WM_PROTOCOLS + * window tmp->w + * format 32 + * data[0] message atom + * data[1] time stamp + */ +static void send_clientmessage (Window w, Atom a, Time timestamp) +{ + XClientMessageEvent ev; + + ev.type = ClientMessage; + ev.window = w; + ev.message_type = _XA_WM_PROTOCOLS; + ev.format = 32; + ev.data.l[0] = a; + ev.data.l[1] = timestamp; + XSendEvent (dpy, w, False, 0L, (XEvent *) &ev); +} + +void SendDeleteWindowMessage (TwmWindow *tmp, Time timestamp) +{ + send_clientmessage (tmp->w, _XA_WM_DELETE_WINDOW, timestamp); +} + +void SendSaveYourselfMessage (TwmWindow *tmp, Time timestamp) +{ + send_clientmessage (tmp->w, _XA_WM_SAVE_YOURSELF, timestamp); +} + + +void SendTakeFocusMessage (TwmWindow *tmp, Time timestamp) +{ + send_clientmessage (tmp->w, _XA_WM_TAKE_FOCUS, timestamp); +} + +int MoveMenu (XEvent *eventp) +{ + int XW, YW, newX, newY, cont; + Bool newev; + unsigned long event_mask; + XEvent ev; + + if (! ActiveMenu) return (1); + if (! ActiveMenu->pinned) return (1); + + XW = eventp->xbutton.x_root - ActiveMenu->x; + YW = eventp->xbutton.y_root - ActiveMenu->y; + XGrabPointer (dpy, ActiveMenu->w, True, + ButtonPressMask | ButtonReleaseMask | ButtonMotionMask, + GrabModeAsync, GrabModeAsync, + None, Scr->MoveCursor, CurrentTime); + + newX = ActiveMenu->x; + newY = ActiveMenu->y; + cont = TRUE; + event_mask = ButtonPressMask | ButtonMotionMask | ButtonReleaseMask | ExposureMask; + XMaskEvent (dpy, event_mask, &ev); + while (cont) { + ev.xbutton.x_root -= Scr->rootx; + ev.xbutton.y_root -= Scr->rooty; + switch (ev.xany.type) { + case ButtonRelease : + cont = FALSE; + case MotionNotify : + if (!cont) { + newev = False; + while (XCheckMaskEvent (dpy, ButtonMotionMask | ButtonReleaseMask, &ev)) { + newev = True; + if (ev.type == ButtonRelease) break; + } + if (ev.type == ButtonRelease) continue; + if (newev) { + ev.xbutton.x_root -= Scr->rootx; + ev.xbutton.y_root -= Scr->rooty; + } + } + newX = ev.xbutton.x_root - XW; + newY = ev.xbutton.y_root - YW; + if (Scr->DontMoveOff) + { + ConstrainByBorders1 (&newX, ActiveMenu->width, + &newY, ActiveMenu->height); + } + XMoveWindow (dpy, ActiveMenu->w, newX, newY); + XMaskEvent (dpy, event_mask, &ev); + break; + case ButtonPress : + cont = FALSE; + newX = ActiveMenu->x; + newY = ActiveMenu->y; + break; + case Expose: + case NoExpose: + Event = ev; + DispatchEvent (); + XMaskEvent (dpy, event_mask, &ev); + break; + } + } + XUngrabPointer (dpy, CurrentTime); + if (ev.xany.type == ButtonRelease) ButtonPressed = -1; + /*XPutBackEvent (dpy, &ev);*/ + XMoveWindow (dpy, ActiveMenu->w, newX, newY); + ActiveMenu->x = newX; + ActiveMenu->y = newY; + MenuOrigins [MenuDepth - 1].x = newX; + MenuOrigins [MenuDepth - 1].y = newY; + + return (1); +} + +/*********************************************************************** + * + * Procedure: + * DisplayPosition - display the position in the dimensions window + * + * Inputs: + * tmp_win - the current twm window + * x, y - position of the window + * + *********************************************************************** + */ + +void DisplayPosition (TwmWindow *tmp_win, int x, int y) +{ + char str [100]; + char signx = '+'; + char signy = '+'; + + if (x < 0) { + x = -x; + signx = '-'; + } + if (y < 0) { + y = -y; + signy = '-'; + } + (void) sprintf (str, " %c%-4d %c%-4d ", signx, x, signy, y); + XRaiseWindow (dpy, Scr->SizeWindow); + + Draw3DBorder (Scr->SizeWindow, 0, 0, + Scr->SizeStringOffset + Scr->SizeStringWidth + SIZE_HINDENT, + Scr->SizeFont.height + SIZE_VINDENT * 2, + 2, Scr->DefaultC, off, False, False); + + FB(Scr->DefaultC.fore, Scr->DefaultC.back); + XmbDrawImageString (dpy, Scr->SizeWindow, Scr->SizeFont.font_set, + Scr->NormalGC, Scr->SizeStringOffset, + Scr->SizeFont.ascent + SIZE_VINDENT , str, 13); +} + +void MosaicFade (TwmWindow *tmp_win, Window blanket) +{ + int srect; + int i, j, nrects; + Pixmap mask; + GC gc; + XGCValues gcv; + XRectangle *rectangles; + int width = tmp_win->frame_width; + int height = tmp_win->frame_height; + + srect = (width < height) ? (width / 20) : (height / 20); + mask = XCreatePixmap (dpy, blanket, width, height, 1); + + gcv.foreground = 1; + gc = XCreateGC (dpy, mask, GCForeground, &gcv); + XFillRectangle (dpy, mask, gc, 0, 0, width, height); + gcv.function = GXclear; + XChangeGC (dpy, gc, GCFunction, &gcv); + + nrects = ((width * height) / (srect * srect)) / 10; + rectangles = (XRectangle*) malloc (nrects * sizeof (XRectangle)); + for (j = 0; j < nrects; j++) { + rectangles [j].width = srect; + rectangles [j].height = srect; + } + for (i = 0; i < 10; i++) { + for (j = 0; j < nrects; j++) { + rectangles [j].x = ((lrand48 () % width) / srect) * srect; + rectangles [j].y = ((lrand48 () % height) / srect) * srect; + } + XFillRectangles (dpy, mask, gc, rectangles, nrects); + XShapeCombineMask (dpy, blanket, ShapeBounding, 0, 0, mask, ShapeSet); + XFlush (dpy); + waitamoment (0.020); + } + XFreePixmap (dpy, mask); + XFreeGC (dpy, gc); + free (rectangles); +} + +void ZoomInWindow (TwmWindow *tmp_win, Window blanket) +{ + Pixmap mask; + GC gc, gcn; + XGCValues gcv; + + int i, nsteps = 20; + int w = tmp_win->frame_width; + int h = tmp_win->frame_height; + int step = (MAX (w, h)) / (2.0 * nsteps); + + mask = XCreatePixmap (dpy, blanket, w, h, 1); + gcv.foreground = 1; + gc = XCreateGC (dpy, mask, GCForeground, &gcv); + gcv.function = GXclear; + gcn = XCreateGC (dpy, mask, GCForeground | GCFunction, &gcv); + + for (i = 0; i < nsteps; i++) { + XFillRectangle (dpy, mask, gcn, 0, 0, w, h); + XFillArc (dpy, mask, gc, (w / 2) - ((nsteps - i) * step), + (h / 2) - ((nsteps - i) * step), + 2 * (nsteps - i) * step, + 2 * (nsteps - i) * step, + 0, 360*64); + XShapeCombineMask (dpy, blanket, ShapeBounding, 0, 0, mask, ShapeSet); + XFlush (dpy); + waitamoment (0.020); + } +} + +void ZoomOutWindow (TwmWindow *tmp_win, Window blanket) +{ + Pixmap mask; + GC gc; + XGCValues gcv; + + int i, nsteps = 20; + int w = tmp_win->frame_width; + int h = tmp_win->frame_height; + int step = (MAX (w, h)) / (2.0 * nsteps); + + mask = XCreatePixmap (dpy, blanket, w, h, 1); + gcv.foreground = 1; + gc = XCreateGC (dpy, mask, GCForeground, &gcv); + XFillRectangle (dpy, mask, gc, 0, 0, w, h); + gcv.function = GXclear; + XChangeGC (dpy, gc, GCFunction, &gcv); + + for (i = 0; i < nsteps; i++) { + XFillArc (dpy, mask, gc, (w / 2) - (i * step), + (h / 2) - (i * step), + 2 * i * step, + 2 * i * step, + 0, 360*64); + XShapeCombineMask (dpy, blanket, ShapeBounding, 0, 0, mask, ShapeSet); + XFlush (dpy); + waitamoment (0.020); + } +} + +void FadeWindow (TwmWindow *tmp_win, Window blanket) +{ + Pixmap mask, stipple; + GC gc; + XGCValues gcv; + static unsigned char stipple_bits[] = { 0x0F, 0x0F, + 0xF0, 0xF0, + 0x0F, 0x0F, + 0xF0, 0xF0, + 0x0F, 0x0F, + 0xF0, 0xF0, + 0x0F, 0x0F, + 0xF0, 0xF0, + }; + int w = tmp_win->frame_width; + int h = tmp_win->frame_height; + + stipple = XCreateBitmapFromData (dpy, blanket, (char *)stipple_bits, 8, 8); + mask = XCreatePixmap (dpy, blanket, w, h, 1); + gcv.background = 0; + gcv.foreground = 1; + gcv.stipple = stipple; + gcv.fill_style = FillOpaqueStippled; + gc = XCreateGC (dpy, mask, GCBackground | GCForeground | GCFillStyle | GCStipple, &gcv); + XFillRectangle (dpy, mask, gc, 0, 0, w, h); + + XShapeCombineMask (dpy, blanket, ShapeBounding, 0, 0, mask, ShapeSet); + XFlush (dpy); + waitamoment (10.0); + XFreePixmap (dpy, stipple); +} + +void SweepWindow (TwmWindow *tmp_win, Window blanket) +{ + float step = 0.0; + int i, nsteps = 20; + int dir = 0, dist = tmp_win->frame_x, dist1; + + dist1 = tmp_win->frame_y; + if (dist1 < dist) { dir = 1; dist = dist1; } + dist1 = tmp_win->vs->w - (tmp_win->frame_x + tmp_win->frame_width); + if (dist1 < dist) { dir = 2; dist = dist1; } + dist1 = tmp_win->vs->h - (tmp_win->frame_y + tmp_win->frame_height); + if (dist1 < dist) { dir = 3; dist = dist1; } + + switch (dir) { + case 0: step = tmp_win->frame_x + tmp_win->frame_width; break; + case 1: step = tmp_win->frame_y + tmp_win->frame_height; break; + case 2: step = tmp_win->vs->w - tmp_win->frame_x; break; + case 3: step = tmp_win->vs->h - tmp_win->frame_y; break; + } + step /= (float) nsteps; + step /= (float) nsteps; + for (i = 0; i < 20; i++) { + int x = tmp_win->frame_x; + int y = tmp_win->frame_y; + switch (dir) { + case 0: x -= i * i * step; break; + case 1: y -= i * i * step; break; + case 2: x += i * i * step; break; + case 3: y += i * i * step; break; + } + XMoveWindow (dpy, blanket, x, y); + XFlush (dpy); + waitamoment (0.020); + } +} + +void waitamoment (float timeout) +{ +#ifdef VMS + lib$wait (&timeout); +#else + struct timeval timeoutstruct; + int usec = timeout * 1000000; + timeoutstruct.tv_usec = usec % (unsigned long) 1000000; + timeoutstruct.tv_sec = usec / (unsigned long) 1000000; + select (0, (void *) 0, (void *) 0, (void *) 0, &timeoutstruct); +#endif +} + +void packwindow (TwmWindow *tmp_win, char *direction) +{ + int cons, newx, newy; + int x, y, px, py, junkX, junkY; + unsigned int junkK; + Window junkW; + + if (!strcmp (direction, "left")) { + cons = FindConstraint (tmp_win, J_LEFT); + if (cons == -1) return; + newx = cons; + newy = tmp_win->frame_y; + } else + if (!strcmp (direction, "right")) { + cons = FindConstraint (tmp_win, J_RIGHT); + if (cons == -1) return; + newx = cons; + newx -= tmp_win->frame_width + 2 * tmp_win->frame_bw; + newy = tmp_win->frame_y; + } else + if (!strcmp (direction, "top")) { + cons = FindConstraint (tmp_win, J_TOP); + if (cons == -1) return; + newx = tmp_win->frame_x; + newy = cons; + } else + if (!strcmp (direction, "bottom")) { + cons = FindConstraint (tmp_win, J_BOTTOM); + if (cons == -1) return; + newx = tmp_win->frame_x; + newy = cons; + newy -= tmp_win->frame_height + 2 * tmp_win->frame_bw; + } else return; + + XQueryPointer (dpy, Scr->Root, &junkW, &junkW, &junkX, &junkY, &x, &y, &junkK); + px = x - tmp_win->frame_x + newx; + py = y - tmp_win->frame_y + newy; + XWarpPointer (dpy, Scr->Root, Scr->Root, 0, 0, 0, 0, px, py); + XRaiseWindow(dpy, tmp_win->frame); + XMoveWindow (dpy, tmp_win->frame, newx, newy); + SetupWindow (tmp_win, newx, newy, tmp_win->frame_width, tmp_win->frame_height, -1); +} + +void fillwindow (TwmWindow *tmp_win, char *direction) +{ + int cons, newx, newy, save; + unsigned int neww, newh; + int i; + int winx = tmp_win->frame_x; + int winy = tmp_win->frame_y; + int winw = tmp_win->frame_width + 2 * tmp_win->frame_bw; + int winh = tmp_win->frame_height + 2 * tmp_win->frame_bw; + + if (!strcmp (direction, "left")) { + cons = FindConstraint (tmp_win, J_LEFT); + if (cons == -1) return; + newx = cons; + newy = tmp_win->frame_y; + neww = winw + winx - newx; + newh = winh; + neww -= 2 * tmp_win->frame_bw; + newh -= 2 * tmp_win->frame_bw; + ConstrainSize (tmp_win, &neww, &newh); + } else + if (!strcmp (direction, "right")) { + for (i = 0; i < 2; i++) { + cons = FindConstraint (tmp_win, J_RIGHT); + if (cons == -1) return; + newx = tmp_win->frame_x; + newy = tmp_win->frame_y; + neww = cons - winx; + newh = winh; + save = neww; + neww -= 2 * tmp_win->frame_bw; + newh -= 2 * tmp_win->frame_bw; + ConstrainSize (tmp_win, &neww, &newh); + if ((neww != winw) || (newh != winh) || + (cons == Scr->rootw - Scr->BorderRight)) + break; + neww = save; + SetupWindow (tmp_win, newx, newy, neww, newh, -1); + } + } else + if (!strcmp (direction, "top")) { + cons = FindConstraint (tmp_win, J_TOP); + if (cons == -1) return; + newx = tmp_win->frame_x; + newy = cons; + neww = winw; + newh = winh + winy - newy; + neww -= 2 * tmp_win->frame_bw; + newh -= 2 * tmp_win->frame_bw; + ConstrainSize (tmp_win, &neww, &newh); + } else + if (!strcmp (direction, "bottom")) { + for (i = 0; i < 2; i++) { + cons = FindConstraint (tmp_win, J_BOTTOM); + if (cons == -1) return; + newx = tmp_win->frame_x; + newy = tmp_win->frame_y; + neww = winw; + newh = cons - winy; + save = newh; + neww -= 2 * tmp_win->frame_bw; + newh -= 2 * tmp_win->frame_bw; + ConstrainSize (tmp_win, &neww, &newh); + if ((neww != winw) || (newh != winh) || + (cons == Scr->rooth - Scr->BorderBottom)) + break; + newh = save; + SetupWindow (tmp_win, newx, newy, neww, newh, -1); + } + } + else if (!strcmp (direction, "vertical")) + { + if (tmp_win->zoomed == ZOOM_NONE) + { + tmp_win->save_frame_height = tmp_win->frame_height; + tmp_win->save_frame_width = tmp_win->frame_width; + tmp_win->save_frame_y = tmp_win->frame_y; + tmp_win->save_frame_x = tmp_win->frame_x; + + tmp_win->frame_y++; + newy = FindConstraint (tmp_win, J_TOP); + tmp_win->frame_y--; + newh = FindConstraint (tmp_win, J_BOTTOM) - newy; + newh -= 2 * tmp_win->frame_bw; + + newx = tmp_win->frame_x; + neww = tmp_win->frame_width; + + ConstrainSize (tmp_win, &neww, &newh); + + /* if the bottom of the window has moved up + * it will be pushed down */ + if (newy + newh < + tmp_win->save_frame_y + tmp_win->save_frame_height) + newy = tmp_win->save_frame_y + + tmp_win->save_frame_height - newh; + tmp_win->zoomed = F_ZOOM; + SetupWindow (tmp_win, newx, newy, neww, newh, -1); + } + else + { + fullzoom (tmp_win, tmp_win->zoomed); + } + return; + } + else return; + SetupWindow (tmp_win, newx, newy, neww, newh, -1); +} + +void jump (TwmWindow *tmp_win, int direction, char *action) +{ + int fx, fy, px, py, step, status, cons; + int fwidth, fheight; + int junkX, junkY; + unsigned int junkK; + Window junkW; + + if (! action) return; + status = sscanf (action, "%d", &step); + if (status != 1) return; + if (step < 1) return; + + fx = tmp_win->frame_x; + fy = tmp_win->frame_y; + XQueryPointer (dpy, Scr->Root, &junkW, &junkW, &junkX, &junkY, &px, &py, &junkK); + px -= fx; py -= fy; + + fwidth = tmp_win->frame_width + 2 * tmp_win->frame_bw; + fheight = tmp_win->frame_height + 2 * tmp_win->frame_bw; + switch (direction) { + case J_LEFT : + cons = FindConstraint (tmp_win, J_LEFT); + if (cons == -1) return; + fx -= step * Scr->XMoveGrid; + if (fx < cons) fx = cons; + break; + case J_RIGHT : + cons = FindConstraint (tmp_win, J_RIGHT); + if (cons == -1) return; + fx += step * Scr->XMoveGrid; + if (fx + fwidth > cons) fx = cons - fwidth; + break; + case J_TOP : + cons = FindConstraint (tmp_win, J_TOP); + if (cons == -1) return; + fy -= step * Scr->YMoveGrid; + if (fy < cons) fy = cons; + break; + case J_BOTTOM : + cons = FindConstraint (tmp_win, J_BOTTOM); + if (cons == -1) return; + fy += step * Scr->YMoveGrid; + if (fy + fheight > cons) fy = cons - fheight; + break; + } + /* Pebl Fixme: don't warp if jump happens through iconmgr */ + XWarpPointer (dpy, Scr->Root, Scr->Root, 0, 0, 0, 0, fx + px, fy + py); + if (!Scr->NoRaiseMove) + XRaiseWindow (dpy, tmp_win->frame); + SetupWindow (tmp_win, fx, fy, tmp_win->frame_width, tmp_win->frame_height, -1); +} + +int FindConstraint (TwmWindow *tmp_win, int direction) +{ + TwmWindow *t; + int w, h; + int winx = tmp_win->frame_x; + int winy = tmp_win->frame_y; + int winw = tmp_win->frame_width + 2 * tmp_win->frame_bw; + int winh = tmp_win->frame_height + 2 * tmp_win->frame_bw; + int ret; + + switch (direction) { + case J_LEFT : if (winx < Scr->BorderLeft) return -1; + ret = Scr->BorderLeft; break; + case J_RIGHT : if (winx + winw > Scr->rootw - Scr->BorderRight) return -1; + ret = Scr->rootw - Scr->BorderRight; break; + case J_TOP : if (winy < Scr->BorderTop) return -1; + ret = Scr->BorderTop; break; + case J_BOTTOM : if (winy + winh > Scr->rooth - Scr->BorderBottom) return -1; + ret = Scr->rooth - Scr->BorderBottom; break; + default : return -1; + } + for (t = Scr->FirstWindow; t != NULL; t = t->next) { + if (t == tmp_win) continue; + if (!visible (t)) continue; + if (!t->mapped) continue; + w = t->frame_width + 2 * t->frame_bw; + h = t->frame_height + 2 * t->frame_bw; + + switch (direction) { + case J_LEFT : + if (winx <= t->frame_x + w) continue; + if (winy >= t->frame_y + h) continue; + if (winy + winh <= t->frame_y ) continue; + ret = MAX (ret, t->frame_x + w); + break; + case J_RIGHT : + if (winx + winw >= t->frame_x ) continue; + if (winy >= t->frame_y + h) continue; + if (winy + winh <= t->frame_y ) continue; + ret = MIN (ret, t->frame_x); + break; + case J_TOP : + if (winy <= t->frame_y + h) continue; + if (winx >= t->frame_x + w) continue; + if (winx + winw <= t->frame_x ) continue; + ret = MAX (ret, t->frame_y + h); + break; + case J_BOTTOM : + if (winy + winh >= t->frame_y ) continue; + if (winx >= t->frame_x + w) continue; + if (winx + winw <= t->frame_x ) continue; + ret = MIN (ret, t->frame_y); + break; + } + } + return ret; +} + +void TryToPack (TwmWindow *tmp_win, int *x, int *y) +{ + TwmWindow *t; + int newx, newy; + int w, h; + int winw = tmp_win->frame_width + 2 * tmp_win->frame_bw; + int winh = tmp_win->frame_height + 2 * tmp_win->frame_bw; + + newx = *x; + newy = *y; + for (t = Scr->FirstWindow; t != NULL; t = t->next) { + if (t == tmp_win) continue; + if (t->winbox != tmp_win->winbox) continue; + if (t->vs != tmp_win->vs) continue; + if (!t->mapped) continue; + + w = t->frame_width + 2 * t->frame_bw; + h = t->frame_height + 2 * t->frame_bw; + if (newx >= t->frame_x + w) continue; + if (newy >= t->frame_y + h) continue; + if (newx + winw <= t->frame_x) continue; + if (newy + winh <= t->frame_y) continue; + + if (newx + Scr->MovePackResistance > t->frame_x + w) { /* left */ + newx = MAX (newx, t->frame_x + w); + continue; + } + if (newx + winw < t->frame_x + Scr->MovePackResistance) { /* right */ + newx = MIN (newx, t->frame_x - winw); + continue; + } + if (newy + Scr->MovePackResistance > t->frame_y + h) { /* top */ + newy = MAX (newy, t->frame_y + h); + continue; + } + if (newy + winh < t->frame_y + Scr->MovePackResistance) { /* bottom */ + newy = MIN (newy, t->frame_y - winh); + continue; + } + } + *x = newx; + *y = newy; +} + +void TryToPush (TwmWindow *tmp_win, int x, int y, int dir) +{ + TwmWindow *t; + int newx, newy, ndir; + Boolean move; + int w, h; + int winw = tmp_win->frame_width + 2 * tmp_win->frame_bw; + int winh = tmp_win->frame_height + 2 * tmp_win->frame_bw; + + for (t = Scr->FirstWindow; t != NULL; t = t->next) { + if (t == tmp_win) continue; + if (t->winbox != tmp_win->winbox) continue; + if (t->vs != tmp_win->vs) continue; + if (!t->mapped) continue; + + w = t->frame_width + 2 * t->frame_bw; + h = t->frame_height + 2 * t->frame_bw; + if (x >= t->frame_x + w) continue; + if (y >= t->frame_y + h) continue; + if (x + winw <= t->frame_x) continue; + if (y + winh <= t->frame_y) continue; + + move = False; + if ((dir == 0 || dir == J_LEFT) && + (x + Scr->MovePackResistance > t->frame_x + w)) { + newx = x - w; + newy = t->frame_y; + ndir = J_LEFT; + move = True; + } + else + if ((dir == 0 || dir == J_RIGHT) && + (x + winw < t->frame_x + Scr->MovePackResistance)) { + newx = x + winw; + newy = t->frame_y; + ndir = J_RIGHT; + move = True; + } + else + if ((dir == 0 || dir == J_TOP) && + (y + Scr->MovePackResistance > t->frame_y + h)) { + newx = t->frame_x; + newy = y - h; + ndir = J_TOP; + move = True; + } + else + if ((dir == 0 || dir == J_BOTTOM) && + (y + winh < t->frame_y + Scr->MovePackResistance)) { + newx = t->frame_x; + newy = y + winh; + ndir = J_BOTTOM; + move = True; + } + if (move) { + TryToPush (t, newx, newy, ndir); + TryToPack (t, &newx, &newy); + ConstrainByBorders (tmp_win, + &newx, t->frame_width + 2 * t->frame_bw, + &newy, t->frame_height + 2 * t->frame_bw); + SetupWindow (t, newx, newy, t->frame_width, t->frame_height, -1); + } + } +} + +void TryToGrid (TwmWindow *tmp_win, int *x, int *y) +{ + int w = tmp_win->frame_width + 2 * tmp_win->frame_bw; + int h = tmp_win->frame_height + 2 * tmp_win->frame_bw; + int grav = ((tmp_win->hints.flags & PWinGravity) + ? tmp_win->hints.win_gravity : NorthWestGravity); + + switch (grav) { + case ForgetGravity : + case StaticGravity : + case NorthWestGravity : + case NorthGravity : + case WestGravity : + case CenterGravity : + *x = ((*x - Scr->BorderLeft) / Scr->XMoveGrid) * Scr->XMoveGrid + + Scr->BorderLeft; + *y = ((*y - Scr->BorderTop) / Scr->YMoveGrid) * Scr->YMoveGrid + + Scr->BorderTop; + break; + case NorthEastGravity : + case EastGravity : + *x = (((*x + w - Scr->BorderLeft) / Scr->XMoveGrid) * + Scr->XMoveGrid) - w + Scr->BorderLeft; + *y = ((*y - Scr->BorderTop) / Scr->YMoveGrid) * + Scr->YMoveGrid + Scr->BorderTop; + break; + case SouthWestGravity : + case SouthGravity : + *x = ((*x - Scr->BorderLeft) / Scr->XMoveGrid) * Scr->XMoveGrid + + Scr->BorderLeft; + *y = (((*y + h - Scr->BorderTop) / Scr->YMoveGrid) * Scr->YMoveGrid) + - h + Scr->BorderTop; + break; + case SouthEastGravity : + *x = (((*x + w - Scr->BorderLeft) / Scr->XMoveGrid) * + Scr->XMoveGrid) - w + Scr->BorderLeft; + *y = (((*y + h - Scr->BorderTop) / Scr->YMoveGrid) * + Scr->YMoveGrid) - h + Scr->BorderTop; + break; + } +} + +int WarpCursorToDefaultEntry (MenuRoot *menu) +{ + MenuItem *item; + Window root; + int i, x, y, xl, yt; + unsigned int w, h, bw, d; + + for (i = 0, item = menu->first; item != menu->last; item = item->next) { + if (item == menu->defaultitem) break; + i++; + } + if (!XGetGeometry (dpy, menu->w, &root, &x, &y, &w, &h, &bw, &d)) return 0; + xl = x + (menu->width / 2); + yt = y + (i + 0.5) * Scr->EntryHeight; + + XWarpPointer (dpy, Scr->Root, Scr->Root, + Event.xbutton.x_root, Event.xbutton.y_root, + menu->width, menu->height, xl, yt); + return 1; +} + Index: external/mit/ctwm/dist/menus.h =================================================================== RCS file: external/mit/ctwm/dist/menus.h diff -N external/mit/ctwm/dist/menus.h --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/menus.h 3 Sep 2015 12:19:57 -0000 @@ -0,0 +1,270 @@ +/*****************************************************************************/ +/** Copyright 1988 by Evans & Sutherland Computer Corporation, **/ +/** Salt Lake City, Utah **/ +/** Portions Copyright 1989 by the Massachusetts Institute of Technology **/ +/** Cambridge, Massachusetts **/ +/** **/ +/** All Rights Reserved **/ +/** **/ +/** Permission to use, copy, modify, and distribute this software and **/ +/** its documentation for any purpose and without fee is hereby **/ +/** granted, provided that the above copyright notice appear in all **/ +/** copies and that both that copyright notice and this permis- **/ +/** sion notice appear in supporting documentation, and that the **/ +/** names of Evans & Sutherland and M.I.T. not be used in advertising **/ +/** in publicity pertaining to distribution of the software without **/ +/** specific, written prior permission. **/ +/** **/ +/** EVANS & SUTHERLAND AND M.I.T. DISCLAIM ALL WARRANTIES WITH REGARD **/ +/** TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANT- **/ +/** ABILITY AND FITNESS, IN NO EVENT SHALL EVANS & SUTHERLAND OR **/ +/** M.I.T. BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAM- **/ +/** AGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA **/ +/** OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER **/ +/** TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE **/ +/** OR PERFORMANCE OF THIS SOFTWARE. **/ +/*****************************************************************************/ +/* + * [ ctwm ] + * + * Copyright 1992 Claude Lecommandeur. + * + * Permission to use, copy, modify and distribute this software [ctwm] and + * its documentation for any purpose is hereby granted without fee, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting documen- + * tation, and that the name of Claude Lecommandeur not be used in adverti- + * sing or publicity pertaining to distribution of the software without + * specific, written prior permission. Claude Lecommandeur make no represen- + * tations about the suitability of this software for any purpose. It is + * provided "as is" without express or implied warranty. + * + * Claude Lecommandeur DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO + * EVENT SHALL Claude Lecommandeur BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF + * USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR + * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + * + * Author: Claude Lecommandeur [ lecom@sic.epfl.ch ][ April 1992 ] + */ + + +/*********************************************************************** + * + * $XConsortium: menus.h,v 1.24 89/12/10 17:46:26 jim Exp $ + * + * twm menus include file + * + * 17-Nov-87 Thomas E. LaStrange File created + * + ***********************************************************************/ + +#ifndef _MENUS_ +#define _MENUS_ + +#define TWM_ROOT "bLoB_GoOp" /* my private root menu */ +#define TWM_WINDOWS "TwmWindows" /* for f.menu "TwmWindows" */ +#define TWM_ICONS "TwmIcons" /* for f.menu "TwmIcons" */ +#define TWM_WORKSPACES "TwmWorkspaces" /* for f.menu "TwmWorkspaces" */ +#define TWM_ALLWINDOWS "TwmAllWindows" /* for f.menu "TwmAllWindows" */ + +/* Added by dl 2004 */ +#define TWM_ALLICONS "TwmAllIcons" /* for f.menu "TwmAllIcons" */ + +/*******************************************************************/ +/* Added by Dan Lilliehorn (dl@dl.nu) 2000-02-29 */ +#define TWM_KEYS "TwmKeys" /* for f.menu "TwmKeys" */ +#define TWM_VISIBLE "TwmVisible" /* for f.menu "TwmVisible" */ + +#define MAX_FILE_SIZE 4096 /* max chars to read from file for cut */ + +struct MenuItem +{ + struct MenuItem *next; /* next menu item */ + struct MenuItem *prev; /* prev menu item */ + struct MenuRoot *sub; /* MenuRoot of a pull right menu */ + struct MenuRoot *root; /* back pointer to my MenuRoot */ + char *item; /* the character string displayed */ + char *action; /* action to be performed */ + ColorPair normal; /* unhiglight colors */ + ColorPair highlight; /* highlight colors */ + short item_num; /* item number of this menu */ + short x; /* x coordinate for text */ + short func; /* twm built in function */ + short state; /* video state, 0 = normal, 1 = reversed */ + short strlen; /* strlen(item) */ + short user_colors; /* colors were specified */ + short separated; /* separated from the next item */ +}; + +struct MenuRoot +{ + struct MenuItem *first; /* first item in menu */ + struct MenuItem *last; /* last item in menu */ + struct MenuItem *lastactive; /* last active item in menu */ + struct MenuItem *defaultitem; /* default item in menu */ + struct MenuRoot *prev; /* previous root menu if pull right */ + struct MenuRoot *next; /* next in list of root menus */ + char *name; /* name of root */ + Window w; /* the window of the menu */ + Window shadow; /* the shadow window */ + ColorPair highlight; /* highlight colors */ + short mapped; /* NEVER_MAPPED, UNMAPPED, or MAPPED */ + short height; /* height of the menu */ + short width; /* width of the menu */ + short items; /* number of items in the menu */ + short pull; /* is there a pull right entry ? */ + short entered; /* EnterNotify following pop up */ + short real_menu; /* this is a real menu */ + short x, y; /* position (for pinned menus) */ + short pinned; /* is this a pinned menu*/ + struct MenuRoot *pmenu; /* the associated pinned menu */ +}; + +#define NEVER_MAPPED 0 /* constants for mapped field of MenuRoot */ +#define UNMAPPED 1 +#define MAPPED 2 + + +struct MouseButton +{ + int func; /* the function number */ + int mask; /* modifier mask */ + MenuRoot *menu; /* menu if func is F_MENU */ + MenuItem *item; /* action to perform if func != F_MENU */ +}; + +struct FuncButton +{ + struct FuncButton *next; /* next in the list of function buttons */ + int num; /* button number */ + int cont; /* context */ + int mods; /* modifiers */ + int func; /* the function number */ + MenuRoot *menu; /* menu if func is F_MENU */ + MenuItem *item; /* action to perform if func != F_MENU */ +}; + +struct FuncKey +{ + struct FuncKey *next; /* next in the list of function keys */ + char *name; /* key name */ + KeySym keysym; /* X keysym */ + KeyCode keycode; /* X keycode */ + int cont; /* context */ + int mods; /* modifiers */ + int func; /* function to perform */ + char *win_name; /* window name (if any) */ + char *action; /* action string (if any) */ + MenuRoot *menu; /* menu if func is F_MENU */ +}; + +extern int RootFunction; +extern MenuRoot *ActiveMenu; +extern MenuItem *ActiveItem; +extern int MoveFunction; +extern int WindowMoved; +extern int ConstMove; +extern int ConstMoveDir; +extern int ConstMoveX; +extern int ConstMoveY; +extern int ConstMoveXL; +extern int ConstMoveXR; +extern int ConstMoveYT; +extern int ConstMoveYB; + +#define MAXMENUDEPTH 10 /* max number of nested menus */ +extern int MenuDepth; + +#define MOVE_NONE 0 /* modes of constrained move */ +#define MOVE_VERT 1 +#define MOVE_HORIZ 2 + +#define WARPSCREEN_NEXT "next" +#define WARPSCREEN_PREV "prev" +#define WARPSCREEN_BACK "back" + +#define COLORMAP_NEXT "next" +#define COLORMAP_PREV "prev" +#define COLORMAP_DEFAULT "default" + +extern void InitTitlebarButtons(void); +extern void InitMenus(void); +extern MenuRoot *NewMenuRoot(char *name); +extern MenuItem *AddToMenu(MenuRoot *menu, char *item, char *action, + MenuRoot *sub, int func, char *fore, char *back); +extern Bool PopUpMenu(MenuRoot *menu, int x, int y, Bool center); +extern void MakeWorkspacesMenu (void); +extern MenuRoot *FindMenuRoot(char *name); +extern Bool AddFuncKey(char *name, int cont, int mods, int func, + MenuRoot *menu, char *win_name, char *action); +extern Bool AddFuncButton(int num, int cont, int mods, int func, + MenuRoot *menu, MenuItem *item); +extern void DestroyMenu (MenuRoot *menu); +extern int PopDownMenu(void); +extern int HideMenu(MenuRoot *menu); +extern int ExecuteFunction(int func, void *action, + Window w, TwmWindow *tmp_win, + XEvent *eventp, + int context, int pulldown); +extern int DeferExecution(int context, int func, Cursor cursor); +extern int NeedToDefer(MenuRoot *root); +extern void ReGrab(void); +extern int CreateTitleButton(char *name, int func, char *action, + MenuRoot *menuroot, Bool rightside, + Bool append); +extern void PaintEntry(MenuRoot *mr, MenuItem *mi, int exposure); +extern void Paint3DEntry(MenuRoot *mr, MenuItem *mi, int exposure); +extern void PaintNormalEntry(MenuRoot *mr, MenuItem *mi, int exposure); +extern void PaintMenu(MenuRoot *mr, XEvent *e); +extern int UpdateMenu(void); +extern void MakeMenus(void); +extern int MakeMenu(MenuRoot *mr); +extern int MoveMenu(XEvent *eventp); +extern void DeIconify(TwmWindow *tmp_win); +extern void Iconify(TwmWindow *tmp_win, int def_x, int def_y); +extern int WarpToScreen(int n, int inc); +extern int BumpWindowColormap(TwmWindow *tmp, int inc); +extern void SetMapStateProp(TwmWindow *tmp_win, int state); +extern void SendDeleteWindowMessage (TwmWindow *tmp, Time timestamp); +extern void SendSaveYourselfMessage (TwmWindow *tmp, Time timestamp); +extern void SendTakeFocusMessage (TwmWindow *tmp, Time timestamp); +extern int FindConstraint (TwmWindow *tmp_win, int direction); +extern void MosaicFade (TwmWindow *tmp_win, Window blanket); +extern void ZoomInWindow (TwmWindow *tmp_win, Window blanket); +extern void ZoomOutWindow (TwmWindow *tmp_win, Window blanket); +extern void FadeWindow (TwmWindow *tmp_win, Window blanket); +extern void SweepWindow (TwmWindow *tmp_win, Window blanket); +extern int WarpCursorToDefaultEntry (MenuRoot *menu); +extern void PlaceTransients(TwmWindow *tmp_win, int where); +extern void PlaceOntop (int ontop, int where); +extern void ModifyCurrentTB(int button, int mods, int func, char *action, + MenuRoot *menuroot); +extern void Execute(char *s); +extern void ShowIconManager (void); +extern void HideIconManager (void); +extern void RaiseWindow(TwmWindow *tmp_win); +extern void LowerWindow(TwmWindow *tmp_win); +extern void RaiseLower(TwmWindow *tmp_win); +extern void RaiseLowerFrame(Window frame, int ontop); +extern void MapRaised(TwmWindow *tmp_win); +extern void RaiseFrame(Window frame); +extern void FocusOnRoot(void); +extern void TryToPack (TwmWindow *tmp_win, int *x, int *y); +extern void TryToPush (TwmWindow *tmp_win, int x, int y, int dir); +extern void TryToGrid (TwmWindow *tmp_win, int *x, int *y); +extern void resizeFromCenter(Window w, TwmWindow *tmp_win); +extern void WarpAlongRing (XButtonEvent *ev, Bool forward); +extern void WarpToWindow (TwmWindow *t, int must_raise); +extern void DisplayPosition (TwmWindow *tmp_win, int x, int y); +extern void packwindow (TwmWindow *tmp_win, char *direction); +extern void fillwindow (TwmWindow *tmp_win, char *direction); +#if 0 /* Not implemented!!! */ +extern Boolean TryNotToMoveOff (); +#endif +extern void AutoSqueeze (TwmWindow *tmp_win); +extern void Squeeze(TwmWindow *tmp_win); + +#endif /* _MENUS_ */ Index: external/mit/ctwm/dist/mk_tar.sh =================================================================== RCS file: external/mit/ctwm/dist/mk_tar.sh diff -N external/mit/ctwm/dist/mk_tar.sh --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/mk_tar.sh 3 Sep 2015 12:19:57 -0000 @@ -0,0 +1,45 @@ +#!/bin/sh +# +# Setup and generate a release tarball + +# Version +version=`grep '^\#define VERSION_ID' version.c | cut -d'"' -f2` + +# If it's a non-release, append date +if echo $version | grep -q '[^0-9]$'; then + version="$version.`date '+%Y%m%d'`" +fi + +# Setup the dir +dir="ctwm-$version" +if [ -d $dir ] ; then + echo "Dir '$dir' already exists!" + exit; +fi +if [ -r $dir.tar ] ; then + echo "Tarball '$dir.tar' already exists!" + exit; +fi +mkdir -m755 $dir + +# Copy the pertinent files in +find * \ + \! -name STATUS \! -name TABLE \ + \! -name Makefile \ + \! -name Imakefile.local \! -name descrip.local \ + \! -name '*.o.info' \! -name '*.flc' \! -name semantic.cache \ + \! -name y.output \ + | cpio -pmdu $dir + +# Edit the set version file in-place +revid=`bzr revision-info --tree | cut -d' ' -f2` +sed -i '' -e "s/%%REVISION%%/$revid/" $dir/version.c + +# Tar it up +tar \ + --uid 0 --uname ctwm --gid 0 --gname ctwm \ + -cvf $dir.tar $dir + +# Cleanup +rm -rf $dir +ls -l $dir.tar Index: external/mit/ctwm/dist/mwmhints.c =================================================================== RCS file: external/mit/ctwm/dist/mwmhints.c diff -N external/mit/ctwm/dist/mwmhints.c --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/mwmhints.c 3 Sep 2015 12:19:57 -0000 @@ -0,0 +1,112 @@ +/* + * [ ctwm ] + * + * Copyright 2014 Olaf Seibert + * + * Permission to use, copy, modify and distribute this software [ctwm] + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies and + * that both that copyright notice and this permission notice appear in + * supporting documentation, and that the name of Olaf Seibert not be + * used in advertising or publicity pertaining to distribution of the + * software without specific, written prior permission. Olaf Seibert + * makes no representations about the suitability of this software for + * any purpose. It is provided "as is" without express or implied + * warranty. + * + * Olaf Seibert DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN + * NO EVENT SHALL Olaf Seibert BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS + * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE + * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE + * USE OR PERFORMANCE OF THIS SOFTWARE. + * + * Author: Olaf Seibert [ rhialto@falu.nl ][ May 2014 ] + */ + +/* + * Code to look at a few Motif Window Manager hints. + * + * Only the bits marked [v] are actually looked at. + * For the rest, ctwm has no concept, really. + * + * For some information about the meaning of the flags, see + * the manual page VendorShell(3) from the Motif library. + */ + +#include + +#include "twm.h" +#include "mwmhints.h" + +static Atom MOTIF_WM_HINTS = None; + +int GetMWMHints(Window w, MotifWmHints *mwmHints) +{ + int success; + Atom actual_type; + int actual_format; + unsigned long nitems; + unsigned long bytes_after; + unsigned long *prop = NULL; + + /* Defaults for when not found */ + mwmHints->flags = 0; + mwmHints->functions = 0; + mwmHints->decorations = 0; +#ifdef FULL_MWM_DATA + mwmHints->input_mode = 0; + mwmHints->status = 0; +#endif + + if (MOTIF_WM_HINTS == (Atom)None) { + MOTIF_WM_HINTS = XInternAtom(dpy, "_MOTIF_WM_HINTS", True); + } + + success = XGetWindowProperty( + dpy, w, MOTIF_WM_HINTS, + 0, 5, /* long_offset, long long_length, */ + False, /* Bool delete, */ + AnyPropertyType,/* Atom req_type */ + &actual_type, /* Atom *actual_type_return, */ + &actual_format, /* int *actual_format_return, */ + &nitems, /* unsigned long *nitems_return, */ + &bytes_after, /* unsigned long * */ + (unsigned char **)&prop); /* unsigned char ** */ + + if (success == Success && + actual_type == MOTIF_WM_HINTS && + actual_format == 32 && + nitems >= 3) { + mwmHints->flags = (int)prop[0]; + mwmHints->functions = (int)prop[1]; + mwmHints->decorations = (int)prop[2]; +#ifdef FULL_MWM_DATA + mwmHints->input_mode = (int)prop[3]; + mwmHints->status = (int)prop[4]; +#endif + + if (mwmHints->flags & MWM_HINTS_FUNCTIONS) { + if (mwmHints->functions & MWM_FUNC_ALL) { + mwmHints->functions ^= ~0; + } + } + if (mwmHints->flags & MWM_HINTS_DECORATIONS) { + if (mwmHints->decorations & MWM_DECOR_ALL) { + mwmHints->decorations ^= ~0; + } + } + + success = True; + } else { + success = False; + } + + if (prop != NULL) { + XFree(prop); + } + + return success; +} + Index: external/mit/ctwm/dist/mwmhints.h =================================================================== RCS file: external/mit/ctwm/dist/mwmhints.h diff -N external/mit/ctwm/dist/mwmhints.h --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/mwmhints.h 3 Sep 2015 12:19:57 -0000 @@ -0,0 +1,70 @@ +#ifndef _MWMHINTS_ +#define _MWMHINTS_ + +#include +#include "types.h" + +/* + * Contents of the _MOTIF_WM_HINTS property. + */ + +#undef FULL_MWM_DATA + +typedef struct +{ + int flags; + int functions; + int decorations; +#ifdef FULL_MWM_DATA + int input_mode; + int status; +#endif +} MotifWmHints; + +/* bit definitions for MwmHints.flags */ +#define MWM_HINTS_FUNCTIONS (1L << 0) +#define MWM_HINTS_DECORATIONS (1L << 1) +#define MWM_HINTS_INPUT_MODE (1L << 2) +#define MWM_HINTS_STATUS (1L << 3) + +/* bit definitions for MwmHints.functions */ +#define MWM_FUNC_ALL (1L << 0) +#define MWM_FUNC_RESIZE (1L << 1) +#define MWM_FUNC_MOVE (1L << 2) +#define MWM_FUNC_MINIMIZE (1L << 3) +#define MWM_FUNC_MAXIMIZE (1L << 4) +#define MWM_FUNC_CLOSE (1L << 5) + +/* bit definitions for MwmHints.decorations */ +#define MWM_DECOR_ALL (1L << 0) /* [v] */ +#define MWM_DECOR_BORDER (1L << 1) /* [v] */ +#define MWM_DECOR_RESIZEH (1L << 2) +#define MWM_DECOR_TITLE (1L << 3) /* [v] */ +#define MWM_DECOR_MENU (1L << 4) +#define MWM_DECOR_MINIMIZE (1L << 5) +#define MWM_DECOR_MAXIMIZE (1L << 6) + +/* values for MwmHints.input_mode */ +#define MWM_INPUT_MODELESS 0 +#define MWM_INPUT_PRIMARY_APPLICATION_MODAL 1 +#define MWM_INPUT_SYSTEM_MODAL 2 +#define MWM_INPUT_FULL_APPLICATION_MODAL 3 + +/* bit definitions for MwmHints.status */ +#define MWM_TEAROFF_WINDOW (1L << 0) + +/* + * The above includes some contents from . + * + * Copyright (c) 1987-2012, The Open Group. All rights reserved. + * + * These libraries and programs are free software; you can + * redistribute them and/or modify them under the terms of the GNU + * Lesser General Public License as published by the Free Software + * Foundation; either version 2 of the License, or (at your option) + * any later version. + */ + +extern int GetMWMHints(Window w, MotifWmHints *mwmHints); + +#endif /* include guard */ Index: external/mit/ctwm/dist/parse.c =================================================================== RCS file: external/mit/ctwm/dist/parse.c diff -N external/mit/ctwm/dist/parse.c --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/parse.c 3 Sep 2015 12:19:58 -0000 @@ -0,0 +1,2308 @@ +/*****************************************************************************/ +/** Copyright 1988 by Evans & Sutherland Computer Corporation, **/ +/** Salt Lake City, Utah **/ +/** Portions Copyright 1989 by the Massachusetts Institute of Technology **/ +/** Cambridge, Massachusetts **/ +/** **/ +/** All Rights Reserved **/ +/** **/ +/** Permission to use, copy, modify, and distribute this software and **/ +/** its documentation for any purpose and without fee is hereby **/ +/** granted, provided that the above copyright notice appear in all **/ +/** copies and that both that copyright notice and this permis- **/ +/** sion notice appear in supporting documentation, and that the **/ +/** names of Evans & Sutherland and M.I.T. not be used in advertising **/ +/** in publicity pertaining to distribution of the software without **/ +/** specific, written prior permission. **/ +/** **/ +/** EVANS & SUTHERLAND AND M.I.T. DISCLAIM ALL WARRANTIES WITH REGARD **/ +/** TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANT- **/ +/** ABILITY AND FITNESS, IN NO EVENT SHALL EVANS & SUTHERLAND OR **/ +/** M.I.T. BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAM- **/ +/** AGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA **/ +/** OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER **/ +/** TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE **/ +/** OR PERFORMANCE OF THIS SOFTWARE. **/ +/*****************************************************************************/ +/* + * [ ctwm ] + * + * Copyright 1992 Claude Lecommandeur. + * + * Permission to use, copy, modify and distribute this software [ctwm] and + * its documentation for any purpose is hereby granted without fee, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting documen- + * tation, and that the name of Claude Lecommandeur not be used in adverti- + * sing or publicity pertaining to distribution of the software without + * specific, written prior permission. Claude Lecommandeur make no represen- + * tations about the suitability of this software for any purpose. It is + * provided "as is" without express or implied warranty. + * + * Claude Lecommandeur DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO + * EVENT SHALL Claude Lecommandeur BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF + * USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR + * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + * + * Author: Claude Lecommandeur [ lecom@sic.epfl.ch ][ April 1992 ] + */ + + +/*********************************************************************** + * + * $XConsortium: parse.c,v 1.52 91/07/12 09:59:37 dave Exp $ + * + * parse the .twmrc file + * + * 17-Nov-87 Thomas E. LaStrange File created + * 10-Oct-90 David M. Sternlicht Storing saved colors on root + * + * Do the necessary modification to be integrated in ctwm. + * Can no longer be used for the standard twm. + * + * 22-April-92 Claude Lecommandeur. + * + ***********************************************************************/ + +#include +#include +#include +#if defined(sony_news) || defined __QNX__ +# include +#endif +#ifdef VMS +#include +#include +#include +#include +#else +#include +#include +#include +#endif +#include "twm.h" +#include "screen.h" +#include "menus.h" +#include "util.h" +#include "parse.h" +#include "version.h" +#ifdef SOUNDS +# include "sound.h" +#endif +#ifdef VMS +# include +#else +# include +#endif + +/* For m4... */ +#ifdef USEM4 +#include +#include +#include +#include + +extern int GoThroughM4; +extern char *keepM4_filename; +extern int KeepTmpFile; +#endif + +#if defined(ultrix) +#define NOSTEMP +#endif + +#ifndef SYSTEM_INIT_FILE +#ifdef VMS +#define SYSTEM_INIT_FILE "DECW$SYSTEM_DEFAULTS:SYSTEM.CTWMRC" +#else +#define SYSTEM_INIT_FILE "/usr/lib/X11/twm/system.twmrc" +#endif +#endif +#define BUF_LEN 300 + +static int ParseRandomPlacement (register char *s); +static int ParseButtonStyle (register char *s); +extern int yyparse(void); +extern void twmrc_error_prefix(void); + +static FILE *twmrc; +static int ptr = 0; +static int len = 0; +static char buff[BUF_LEN+1]; +static char overflowbuff[20]; /* really only need one */ +static int overflowlen; +static char **stringListSource, *currentString; +static int ParseUsePPosition (register char *s); +#ifdef USEM4 +static FILE *start_m4(FILE *fraw); +static char *m4_defs(Display *display, char *host); +#endif + +extern int mods; + +int ConstrainedMoveTime = 400; /* milliseconds, event times */ + +int RaiseDelay = 0; /* msec, for AutoRaise */ + +static int twmStringListInput(void); +#ifndef USEM4 +static int twmFileInput(void); +#else +static int m4twmFileInput (void); +#endif +int (*twmInputFunc)(void); + +extern char *defTwmrc[]; /* default bindings */ + +extern char *captivename; + +/*********************************************************************** + * + * Procedure: + * ParseTwmrc - parse the .twmrc file + * + * Inputs: + * filename - the filename to parse. A NULL indicates $HOME/.twmrc + * + *********************************************************************** + */ + +#ifdef YYDEBUG +int yydebug = 1; +#endif + +static int doparse (int (*ifunc)(void), char *srctypename, char *srcname) +{ + mods = 0; + ptr = 0; + len = 0; + twmrc_lineno = 0; + ParseError = FALSE; + twmInputFunc = ifunc; + overflowlen = 0; + + yyparse(); + + if (ParseError) { + fprintf (stderr, "%s: errors found in twm %s", + ProgramName, srctypename); + if (srcname) fprintf (stderr, " \"%s\"", srcname); + fprintf (stderr, "\n"); + } + return (ParseError ? 0 : 1); +} + + +int ParseTwmrc (char *filename) +{ + int i; + char *home = NULL; + int homelen = 0; + char *cp = NULL; + char tmpfilename[257]; +#ifdef USEM4 + static FILE *raw; +#endif + + /* + * Check for the twmrc file in the following order: + * Unix | VMS + * 0. -f filename.# | -f filename_# + * 1. -f filename | -f filename + * 2. .ctwmrc.# | ctwm.rc_# + * 3. .ctwmrc | ctwm.rc + * 4. .twmrc.# | twm.rc_# + * 5. .twmrc | twm.rc + * 6. system.ctwmrc | system.ctwmrc + */ + for (twmrc = NULL, i = 0; !twmrc && i < 7; i++) { + switch (i) { +#ifdef VMS + case 0: + if (filename != NULL) { + cp = tmpfilename; + (void) sprintf (tmpfilename, "%s_%d", filename, Scr->screen); + } else + cp = filename; + break; + + case 1: + cp = filename; + break; + + case 2: + if (!filename) { + home = getenv ("DECW$USER_DEFAULTS"); + if (home) { + homelen = strlen (home); + cp = tmpfilename; + (void) sprintf (tmpfilename, "%sctwm.rc_%d", + home, Scr->screen); + break; + } + } + continue; + + case 3: + if (home) { + tmpfilename[homelen + 7] = '\0'; + } + break; + + case 4: + if (!filename) { + home = getenv ("DECW$USER_DEFAULTS"); + if (home) { + homelen = strlen (home); + cp = tmpfilename; + (void) sprintf (tmpfilename, "%stwm.rc_%d", + home, Scr->screen); + break; + } + } + continue; + + case 5: + if (home) { + tmpfilename[homelen + 6] = '\0'; + } + break; +#else + case 0: /* -f filename.# */ + if (filename) { + cp = tmpfilename; + (void) sprintf (tmpfilename, "%s.%d", filename, Scr->screen); + } + else cp = filename; + break; + + case 1: /* -f filename */ + cp = filename; + break; + + case 2: /* ~/.ctwmrc.screennum */ + if (!filename) { + home = getenv ("HOME"); + if (home) { + homelen = strlen (home); + cp = tmpfilename; + (void) sprintf (tmpfilename, "%s/.ctwmrc.%d", + home, Scr->screen); + break; + } + } + continue; + + case 3: /* ~/.ctwmrc */ + if (home) { + tmpfilename[homelen + 8] = '\0'; + } + break; + + case 4: /* ~/.twmrc.screennum */ + if (!filename) { + home = getenv ("HOME"); + if (home) { + homelen = strlen (home); + cp = tmpfilename; + (void) sprintf (tmpfilename, "%s/.twmrc.%d", + home, Scr->screen); + break; + } + } + continue; + + case 5: /* ~/.twmrc */ + if (home) { + tmpfilename[homelen + 7] = '\0'; /* C.L. */ + } + break; +#endif + + case 6: /* system.twmrc */ + cp = SYSTEM_INIT_FILE; + break; + } + + if (cp) { + twmrc = fopen (cp, "r"); +#ifdef USEM4 + raw = twmrc; +#endif + + } + } + +#ifdef USEM4 + if (raw) { +#else + if (twmrc) { +#endif + + int status; + + if (filename && strncmp (cp, filename, strlen (filename))) { + fprintf (stderr, + "%s: unable to open twmrc file %s, using %s instead\n", + ProgramName, filename, cp); + } +#ifdef USEM4 + if (GoThroughM4) twmrc = start_m4(raw); + status = doparse (m4twmFileInput, "file", cp); + wait (0); + fclose (twmrc); + if (GoThroughM4) fclose (raw); +#else + status = doparse (twmFileInput, "file", cp); + fclose (twmrc); +#endif + return status; + } else { + if (filename) { + fprintf (stderr, + "%s: unable to open twmrc file %s, using built-in defaults instead\n", + ProgramName, filename); + } + return ParseStringList (defTwmrc); + } +} + +int ParseStringList (char **sl) +{ + stringListSource = sl; + currentString = *sl; + return doparse (twmStringListInput, "string list", (char *)NULL); +} + + +/*********************************************************************** + * + * Procedure: + * twmFileInput - redefinition of the lex input routine for file input + * + * Returned Value: + * the next input character + * + *********************************************************************** + */ + + +#ifndef USEM4 + +/* This has Tom's include() funtionality. This is utterly useless if you + * can use m4 for the same thing. Chris P. Ross */ + +#define MAX_INCLUDES 10 + +static struct incl { + FILE *fp; + char *name; + int lineno; +} rc_includes[MAX_INCLUDES]; +static int include_file = 0; + + +static int twmFileInput() +{ + if (overflowlen) return (int) overflowbuff[--overflowlen]; + + while (ptr == len) + { + while (include_file) { + if (fgets(buff, BUF_LEN, rc_includes[include_file].fp) == NULL) { + free(rc_includes[include_file].name); + fclose(rc_includes[include_file].fp); + twmrc_lineno = rc_includes[include_file--].lineno; + } else + break; + } + + if (!include_file) + if (fgets(buff, BUF_LEN, twmrc) == NULL) + return 0; + twmrc_lineno++; + + if (strncmp(buff, "include", 7) == 0) { + /* Whoops, an include file! */ + char *p = buff + 7, *q; + FILE *fp; + + while (isspace(*p)) p++; + for (q = p; *q && !isspace(*q); q++) + continue; + *q = 0; + + if ((fp = fopen(p, "r")) == NULL) { + fprintf(stderr, "%s: Unable to open included init file %s\n", + ProgramName, p); + continue; + } + if (++include_file >= MAX_INCLUDES) { + fprintf(stderr, "%s: init file includes nested too deep\n", + ProgramName); + continue; + } + rc_includes[include_file].fp = fp; + rc_includes[include_file].lineno = twmrc_lineno; + twmrc_lineno = 0; + rc_includes[include_file].name = malloc(strlen(p)+1); + strcpy(rc_includes[include_file].name, p); + continue; + } + ptr = 0; + len = strlen(buff); + } + return ((int)buff[ptr++]); +} +#else /* USEM4 */ +/* If you're going to use m4, use this version instead. Much simpler. + * m4 ism's credit to Josh Osborne (stripes) */ + +static int m4twmFileInput(void) +{ + int line; + static FILE *cp = NULL; + + if ( cp == NULL && keepM4_filename ) { + cp = fopen (keepM4_filename,"w"); + if ( cp == NULL ) { + fprintf (stderr, + "%s: unable to create m4 output %s, ignoring\n", + ProgramName, keepM4_filename); + keepM4_filename = NULL; + } + } + + if (overflowlen){ + return((int) overflowbuff[--overflowlen]); + } + + while (ptr == len) { + nextline: + if (fgets(buff, BUF_LEN, twmrc) == NULL) { + if ( cp ) fclose (cp); + return(0); + } + if ( cp ) fputs (buff, cp); + + if (sscanf(buff, "#line %d", &line)) { + twmrc_lineno = line - 1; + goto nextline; + } else { + twmrc_lineno++; + } + + ptr = 0; + len = strlen(buff); + } + return ((int)buff[ptr++]); +} +#endif /* USEM4 */ + + +static int twmStringListInput(void) +{ + if (overflowlen) return (int) overflowbuff[--overflowlen]; + + /* + * return the character currently pointed to + */ + if (currentString) { + unsigned int c = (unsigned int) *currentString++; + + if (c) return c; /* if non-nul char */ + currentString = *++stringListSource; /* advance to next bol */ + return '\n'; /* but say that we hit last eol */ + } + return 0; /* eof */ +} + + +/*********************************************************************** + * + * Procedure: + * twmUnput - redefinition of the lex unput routine + * + * Inputs: + * c - the character to push back onto the input stream + * + *********************************************************************** + */ + +void twmUnput (int c) +{ + if (overflowlen < sizeof overflowbuff) { + overflowbuff[overflowlen++] = (char) c; + } else { + twmrc_error_prefix (); + fprintf (stderr, "unable to unput character (%c)\n", + c); + } +} + + +/*********************************************************************** + * + * Procedure: + * TwmOutput - redefinition of the lex output routine + * + * Inputs: + * c - the character to print + * + *********************************************************************** + */ + +void TwmOutput(int c) +{ + putchar(c); +} + + +/********************************************************************** + * + * Parsing table and routines + * + ***********************************************************************/ + +typedef struct _TwmKeyword { + char *name; + int value; + int subnum; +} TwmKeyword; + +#define kw0_NoDefaults 1 +#define kw0_AutoRelativeResize 2 +#define kw0_ForceIcons 3 +#define kw0_NoIconManagers 4 +#define kw0_InterpolateMenuColors 6 +#define kw0_NoVersion 7 +#define kw0_SortIconManager 8 +#define kw0_NoGrabServer 9 +#define kw0_NoMenuShadows 10 +#define kw0_NoRaiseOnMove 11 +#define kw0_NoRaiseOnResize 12 +#define kw0_NoRaiseOnDeiconify 13 +#define kw0_DontMoveOff 14 +#define kw0_NoBackingStore 15 +#define kw0_NoSaveUnders 16 +#define kw0_RestartPreviousState 17 +#define kw0_ClientBorderWidth 18 +#define kw0_NoTitleFocus 19 +#define kw0_DecorateTransients 21 +#define kw0_ShowIconManager 22 +#define kw0_NoCaseSensitive 23 +#define kw0_NoRaiseOnWarp 24 +#define kw0_WarpUnmapped 25 +#define kw0_ShowWorkspaceManager 27 +#define kw0_StartInMapState 28 +#define kw0_NoShowOccupyAll 29 +#define kw0_AutoOccupy 30 +#define kw0_TransientHasOccupation 31 +#define kw0_DontPaintRootWindow 32 +#define kw0_Use3DMenus 33 +#define kw0_Use3DTitles 34 +#define kw0_Use3DIconManagers 35 +#define kw0_Use3DBorders 36 +#define kw0_SunkFocusWindowTitle 37 +#define kw0_BeNiceToColormap 38 +#define kw0_WarpRingOnScreen 40 +#define kw0_NoIconManagerFocus 41 +#define kw0_StayUpMenus 42 +#define kw0_ClickToFocus 43 +#define kw0_BorderResizeCursors 44 +#define kw0_ReallyMoveInWorkspaceManager 45 +#define kw0_ShowWinWhenMovingInWmgr 46 +#define kw0_Use3DWMap 47 +#define kw0_ReverseCurrentWorkspace 48 +#define kw0_DontWarpCursorInWMap 49 +#define kw0_CenterFeedbackWindow 50 +#define kw0_WarpToDefaultMenuEntry 51 +#define kw0_ShrinkIconTitles 52 +#define kw0_AutoRaiseIcons 53 +#define kw0_use3DIconBorders 54 +#define kw0_UseSunkTitlePixmap 55 +#define kw0_ShortAllWindowsMenus 56 +#define kw0_RaiseWhenAutoUnSqueeze 57 +#define kw0_RaiseOnClick 58 +#define kw0_IgnoreLockModifier 59 +#define kw0_AutoFocusToTransients 60 /* kai */ +#define kw0_PackNewWindows 61 +#define kw0_IgnoreCaseInMenuSelection 62 +#define kw0_SloppyFocus 63 +#define kw0_NoImagesInWorkSpaceManager 64 +#define kw0_NoWarpToMenuTitle 65 +#define kw0_SaveWorkspaceFocus 66 /* blais */ +#define kw0_RaiseOnWarp 67 + +#define kws_UsePPosition 1 +#define kws_IconFont 2 +#define kws_ResizeFont 3 +#define kws_MenuFont 4 +#define kws_TitleFont 5 +#define kws_IconManagerFont 6 +#define kws_UnknownIcon 7 +#define kws_IconDirectory 8 +#define kws_MaxWindowSize 9 +#define kws_PixmapDirectory 10 +/* RandomPlacement moved because it's now a string string keyword */ +#define kws_IconJustification 12 +#define kws_TitleJustification 13 +#define kws_IconRegionJustification 14 +#define kws_IconRegionAlignement 15 +#ifdef SOUNDS +#define kws_SoundHost 16 +#endif +#define kws_WMgrButtonStyle 17 +#define kws_WorkSpaceFont 18 +#define kws_IconifyStyle 19 + +#define kwss_RandomPlacement 1 + +#define kwn_ConstrainedMoveTime 1 +#define kwn_MoveDelta 2 +#define kwn_XorValue 3 +#define kwn_FramePadding 4 +#define kwn_TitlePadding 5 +#define kwn_ButtonIndent 6 +#define kwn_BorderWidth 7 +#define kwn_IconBorderWidth 8 +#define kwn_TitleButtonBorderWidth 9 +#define kwn_RaiseDelay 10 +#define kwn_TransientOnTop 11 +#define kwn_OpaqueMoveThreshold 12 +#define kwn_OpaqueResizeThreshold 13 +#define kwn_WMgrVertButtonIndent 14 +#define kwn_WMgrHorizButtonIndent 15 +#define kwn_ClearShadowContrast 16 +#define kwn_DarkShadowContrast 17 +#define kwn_WMgrButtonShadowDepth 18 +#define kwn_MaxIconTitleWidth 19 +#define kwn_AnimationSpeed 20 +#define kwn_ThreeDBorderWidth 21 +#define kwn_MoveOffResistance 22 +#define kwn_BorderShadowDepth 23 +#define kwn_TitleShadowDepth 24 +#define kwn_TitleButtonShadowDepth 25 +#define kwn_MenuShadowDepth 26 +#define kwn_IconManagerShadowDepth 27 +#define kwn_MovePackResistance 28 +#define kwn_XMoveGrid 29 +#define kwn_YMoveGrid 30 +#define kwn_OpenWindowTimeout 31 +#define kwn_RaiseOnClickButton 32 + +#define kwn_BorderTop 33 +#define kwn_BorderBottom 34 +#define kwn_BorderLeft 35 +#define kwn_BorderRight 36 + +#define kwcl_BorderColor 1 +#define kwcl_IconManagerHighlight 2 +#define kwcl_BorderTileForeground 3 +#define kwcl_BorderTileBackground 4 +#define kwcl_TitleForeground 5 +#define kwcl_TitleBackground 6 +#define kwcl_IconForeground 7 +#define kwcl_IconBackground 8 +#define kwcl_IconBorderColor 9 +#define kwcl_IconManagerForeground 10 +#define kwcl_IconManagerBackground 11 +#define kwcl_MapWindowBackground 12 +#define kwcl_MapWindowForeground 13 + +#define kwc_DefaultForeground 1 +#define kwc_DefaultBackground 2 +#define kwc_MenuForeground 3 +#define kwc_MenuBackground 4 +#define kwc_MenuTitleForeground 5 +#define kwc_MenuTitleBackground 6 +#define kwc_MenuShadowColor 7 + +/* + * The following is sorted alphabetically according to name (which must be + * in lowercase and only contain the letters a-z). It is fed to a binary + * search to parse keywords. + */ +static TwmKeyword keytable[] = { + { "a", ALTER, 0 }, + { "all", ALL, 0 }, + { "alter", ALTER, 0 }, + { "alwaysontop", ALWAYS_ON_TOP, 0 }, + { "alwaysshowwindowwhenmovingfromworkspacemanager", KEYWORD, kw0_ShowWinWhenMovingInWmgr }, + { "alwayssqueezetogravity", ALWAYSSQUEEZETOGRAVITY, 0 }, + { "animationspeed", NKEYWORD, kwn_AnimationSpeed }, + { "autofocustotransients", KEYWORD, kw0_AutoFocusToTransients }, /* kai */ + { "autolower", AUTO_LOWER, 0 }, + { "autooccupy", KEYWORD, kw0_AutoOccupy }, + { "autoraise", AUTO_RAISE, 0 }, + { "autoraiseicons", KEYWORD, kw0_AutoRaiseIcons }, + { "autorelativeresize", KEYWORD, kw0_AutoRelativeResize }, + { "autosqueeze", AUTOSQUEEZE, 0 }, + { "benicetocolormap", KEYWORD, kw0_BeNiceToColormap }, + { "borderbottom", NKEYWORD, kwn_BorderBottom }, + { "bordercolor", CLKEYWORD, kwcl_BorderColor }, + { "borderleft", NKEYWORD, kwn_BorderLeft }, + { "borderresizecursors", KEYWORD, kw0_BorderResizeCursors }, + { "borderright", NKEYWORD, kwn_BorderRight }, + { "bordershadowdepth", NKEYWORD, kwn_BorderShadowDepth }, + { "bordertilebackground", CLKEYWORD, kwcl_BorderTileBackground }, + { "bordertileforeground", CLKEYWORD, kwcl_BorderTileForeground }, + { "bordertop", NKEYWORD, kwn_BorderTop }, + { "borderwidth", NKEYWORD, kwn_BorderWidth }, + { "button", BUTTON, 0 }, + { "buttonindent", NKEYWORD, kwn_ButtonIndent }, + { "c", CONTROL, 0 }, + { "center", JKEYWORD, J_CENTER }, + { "centerfeedbackwindow", KEYWORD, kw0_CenterFeedbackWindow }, + { "changeworkspacefunction", CHANGE_WORKSPACE_FUNCTION, 0 }, + { "clearshadowcontrast", NKEYWORD, kwn_ClearShadowContrast }, + { "clicktofocus", KEYWORD, kw0_ClickToFocus }, + { "clientborderwidth", KEYWORD, kw0_ClientBorderWidth }, + { "color", COLOR, 0 }, + { "constrainedmovetime", NKEYWORD, kwn_ConstrainedMoveTime }, + { "control", CONTROL, 0 }, + { "cursors", CURSORS, 0 }, + { "darkshadowcontrast", NKEYWORD, kwn_DarkShadowContrast }, + { "decoratetransients", KEYWORD, kw0_DecorateTransients }, + { "defaultbackground", CKEYWORD, kwc_DefaultBackground }, + { "defaultforeground", CKEYWORD, kwc_DefaultForeground }, + { "defaultfunction", DEFAULT_FUNCTION, 0 }, + { "deiconifyfunction", DEICONIFY_FUNCTION, 0 }, + { "destroy", KILL, 0 }, + { "donticonifybyunmapping", DONT_ICONIFY_BY_UNMAPPING, 0 }, + { "dontmoveoff", KEYWORD, kw0_DontMoveOff }, + { "dontpaintrootwindow", KEYWORD, kw0_DontPaintRootWindow }, + { "dontsave", DONT_SAVE, 0 }, + { "dontsetinactive", DONTSETINACTIVE, 0 }, + { "dontsqueezetitle", DONT_SQUEEZE_TITLE, 0 }, + { "donttoggleworkspacemanagerstate", DONTTOGGLEWORKSPACEMANAGERSTATE, 0 }, + { "dontwarpcursorinwmap", KEYWORD, kw0_DontWarpCursorInWMap }, + { "east", DKEYWORD, D_EAST }, + { "f", FRAME, 0 }, + { "f.addtoworkspace", FSKEYWORD, F_ADDTOWORKSPACE }, + { "f.adoptwindow", FKEYWORD, F_ADOPTWINDOW }, + { "f.altcontext", FKEYWORD, F_ALTCONTEXT }, + { "f.altkeymap", FSKEYWORD, F_ALTKEYMAP }, + { "f.autolower", FKEYWORD, F_AUTOLOWER }, + { "f.autoraise", FKEYWORD, F_AUTORAISE }, + { "f.backiconmgr", FKEYWORD, F_BACKICONMGR }, + { "f.backmapiconmgr", FKEYWORD, F_BACKMAPICONMGR }, + { "f.beep", FKEYWORD, F_BEEP }, + { "f.bottomzoom", FKEYWORD, F_BOTTOMZOOM }, + { "f.changesize", FSKEYWORD, F_CHANGESIZE }, + { "f.circledown", FKEYWORD, F_CIRCLEDOWN }, + { "f.circleup", FKEYWORD, F_CIRCLEUP }, + { "f.colormap", FSKEYWORD, F_COLORMAP }, + { "f.cut", FSKEYWORD, F_CUT }, + { "f.cutfile", FKEYWORD, F_CUTFILE }, + { "f.deiconify", FKEYWORD, F_DEICONIFY }, + { "f.delete", FKEYWORD, F_DELETE }, + { "f.deleteordestroy", FKEYWORD, F_DELETEORDESTROY }, + { "f.deltastop", FKEYWORD, F_DELTASTOP }, + { "f.destroy", FKEYWORD, F_DESTROY }, + { "f.downiconmgr", FKEYWORD, F_DOWNICONMGR }, + { "f.downworkspace", FKEYWORD, F_DOWNWORKSPACE }, + { "f.exec", FSKEYWORD, F_EXEC }, + { "f.file", FSKEYWORD, F_FILE }, + { "f.fill", FSKEYWORD, F_FILL }, + { "f.fittocontent", FKEYWORD, F_FITTOCONTENT }, + { "f.focus", FKEYWORD, F_FOCUS }, + { "f.forcemove", FKEYWORD, F_FORCEMOVE }, + { "f.forwiconmgr", FKEYWORD, F_FORWICONMGR }, + { "f.forwmapiconmgr", FKEYWORD, F_FORWMAPICONMGR }, + { "f.fullzoom", FKEYWORD, F_FULLZOOM }, + { "f.function", FSKEYWORD, F_FUNCTION }, + { "f.gotoworkspace", FSKEYWORD, F_GOTOWORKSPACE }, + { "f.hbzoom", FKEYWORD, F_BOTTOMZOOM }, + { "f.hideiconmgr", FKEYWORD, F_HIDELIST }, + { "f.hideworkspacemgr", FKEYWORD, F_HIDEWORKMGR }, + { "f.horizoom", FKEYWORD, F_HORIZOOM }, + { "f.htzoom", FKEYWORD, F_TOPZOOM }, + { "f.hypermove", FKEYWORD, F_HYPERMOVE }, + { "f.hzoom", FKEYWORD, F_HORIZOOM }, + { "f.iconify", FKEYWORD, F_ICONIFY }, + { "f.identify", FKEYWORD, F_IDENTIFY }, + { "f.initsize", FKEYWORD, F_INITSIZE }, + { "f.jumpdown", FSKEYWORD, F_JUMPDOWN }, + { "f.jumpleft", FSKEYWORD, F_JUMPLEFT }, + { "f.jumpright", FSKEYWORD, F_JUMPRIGHT }, + { "f.jumpup", FSKEYWORD, F_JUMPUP }, + { "f.lefticonmgr", FKEYWORD, F_LEFTICONMGR }, + { "f.leftworkspace", FKEYWORD, F_LEFTWORKSPACE }, + { "f.leftzoom", FKEYWORD, F_LEFTZOOM }, + { "f.lower", FKEYWORD, F_LOWER }, + { "f.menu", FSKEYWORD, F_MENU }, + { "f.move", FKEYWORD, F_MOVE }, + { "f.movemenu", FKEYWORD, F_MOVEMENU }, + { "f.movepack", FKEYWORD, F_MOVEPACK }, + { "f.movepush", FKEYWORD, F_MOVEPUSH }, + { "f.moveresize", FSKEYWORD, F_MOVERESIZE }, + { "f.movetitlebar", FKEYWORD, F_MOVETITLEBAR }, + { "f.movetonextworkspace", FKEYWORD, F_MOVETONEXTWORKSPACE }, + { "f.movetonextworkspaceandfollow", FKEYWORD, F_MOVETONEXTWORKSPACEANDFOLLOW }, + { "f.movetoprevworkspace", FKEYWORD, F_MOVETOPREVWORKSPACE }, + { "f.movetoprevworkspaceandfollow", FKEYWORD, F_MOVETOPREVWORKSPACEANDFOLLOW }, + { "f.nexticonmgr", FKEYWORD, F_NEXTICONMGR }, + { "f.nextworkspace", FKEYWORD, F_NEXTWORKSPACE }, + { "f.nop", FKEYWORD, F_NOP }, + { "f.occupy", FKEYWORD, F_OCCUPY }, + { "f.occupyall", FKEYWORD, F_OCCUPYALL }, + { "f.pack", FSKEYWORD, F_PACK }, + { "f.pin", FKEYWORD, F_PIN }, + { "f.previconmgr", FKEYWORD, F_PREVICONMGR }, + { "f.prevworkspace", FKEYWORD, F_PREVWORKSPACE }, + { "f.quit", FKEYWORD, F_QUIT }, + { "f.raise", FKEYWORD, F_RAISE }, + { "f.raiseicons", FKEYWORD, F_RAISEICONS }, + { "f.raiselower", FKEYWORD, F_RAISELOWER }, + { "f.refresh", FKEYWORD, F_REFRESH }, + { "f.removefromworkspace", FSKEYWORD, F_REMOVEFROMWORKSPACE }, +#ifdef SOUNDS + { "f.rereadsounds", FKEYWORD, F_REREADSOUNDS }, +#endif + { "f.resize", FKEYWORD, F_RESIZE }, + { "f.restart", FKEYWORD, F_RESTART }, + { "f.restoregeometry", FKEYWORD, F_RESTOREGEOMETRY }, + { "f.righticonmgr", FKEYWORD, F_RIGHTICONMGR }, + { "f.rightworkspace", FKEYWORD, F_RIGHTWORKSPACE }, + { "f.rightzoom", FKEYWORD, F_RIGHTZOOM }, + { "f.ring", FKEYWORD, F_RING }, + { "f.savegeometry", FKEYWORD, F_SAVEGEOMETRY }, + { "f.saveyourself", FKEYWORD, F_SAVEYOURSELF }, + { "f.separator", FKEYWORD, F_SEPARATOR }, + { "f.setbuttonsstate", FKEYWORD, F_SETBUTTONSTATE }, + { "f.setmapstate", FKEYWORD, F_SETMAPSTATE }, + { "f.showbackground", FKEYWORD, F_SHOWBGRD }, + { "f.showiconmgr", FKEYWORD, F_SHOWLIST }, + { "f.showworkspacemgr", FKEYWORD, F_SHOWWORKMGR }, + { "f.slowdownanimation", FKEYWORD, F_SLOWDOWNANIMATION }, + { "f.sorticonmgr", FKEYWORD, F_SORTICONMGR }, + { "f.source", FSKEYWORD, F_BEEP }, /* XXX - don't work */ + { "f.speedupanimation", FKEYWORD, F_SPEEDUPANIMATION }, + { "f.squeeze", FKEYWORD, F_SQUEEZE }, + { "f.startanimation", FKEYWORD, F_STARTANIMATION }, + { "f.stopanimation", FKEYWORD, F_STOPANIMATION }, + { "f.title", FKEYWORD, F_TITLE }, + { "f.toggleoccupation", FSKEYWORD, F_TOGGLEOCCUPATION }, +#ifdef SOUNDS + { "f.togglesound", FKEYWORD, F_TOGGLESOUND }, +#endif + { "f.togglestate", FKEYWORD, F_TOGGLESTATE }, + { "f.toggleworkspacemgr", FKEYWORD, F_TOGGLEWORKMGR }, + { "f.topzoom", FKEYWORD, F_TOPZOOM }, + { "f.trace", FSKEYWORD, F_TRACE }, + { "f.twmrc", FKEYWORD, F_RESTART }, + { "f.unfocus", FKEYWORD, F_UNFOCUS }, + { "f.upiconmgr", FKEYWORD, F_UPICONMGR }, + { "f.upworkspace", FKEYWORD, F_UPWORKSPACE }, + { "f.vanish", FKEYWORD, F_VANISH }, + { "f.version", FKEYWORD, F_VERSION }, + { "f.vlzoom", FKEYWORD, F_LEFTZOOM }, + { "f.vrzoom", FKEYWORD, F_RIGHTZOOM }, + { "f.warphere", FSKEYWORD, F_WARPHERE }, + { "f.warpring", FSKEYWORD, F_WARPRING }, + { "f.warpto", FSKEYWORD, F_WARPTO }, + { "f.warptoiconmgr", FSKEYWORD, F_WARPTOICONMGR }, + { "f.warptoscreen", FSKEYWORD, F_WARPTOSCREEN }, + { "f.winrefresh", FKEYWORD, F_WINREFRESH }, + { "f.zoom", FKEYWORD, F_ZOOM }, + { "forceicons", KEYWORD, kw0_ForceIcons }, + { "frame", FRAME, 0 }, + { "framepadding", NKEYWORD, kwn_FramePadding }, + { "function", FUNCTION, 0 }, + { "i", ICON, 0 }, + { "icon", ICON, 0 }, + { "iconbackground", CLKEYWORD, kwcl_IconBackground }, + { "iconbordercolor", CLKEYWORD, kwcl_IconBorderColor }, + { "iconborderwidth", NKEYWORD, kwn_IconBorderWidth }, + { "icondirectory", SKEYWORD, kws_IconDirectory }, + { "iconfont", SKEYWORD, kws_IconFont }, + { "iconforeground", CLKEYWORD, kwcl_IconForeground }, + { "iconifybyunmapping", ICONIFY_BY_UNMAPPING, 0 }, + { "iconifyfunction", ICONIFY_FUNCTION, 0 }, + { "iconifystyle", SKEYWORD, kws_IconifyStyle }, + { "iconjustification", SKEYWORD, kws_IconJustification }, + { "iconmanagerbackground", CLKEYWORD, kwcl_IconManagerBackground }, + { "iconmanagerdontshow", ICONMGR_NOSHOW, 0 }, + { "iconmanagerfont", SKEYWORD, kws_IconManagerFont }, + { "iconmanagerforeground", CLKEYWORD, kwcl_IconManagerForeground }, + { "iconmanagergeometry", ICONMGR_GEOMETRY, 0 }, + { "iconmanagerhighlight", CLKEYWORD, kwcl_IconManagerHighlight }, + { "iconmanagers", ICONMGRS, 0 }, + { "iconmanagershadowdepth", NKEYWORD, kwn_IconManagerShadowDepth }, + { "iconmanagershow", ICONMGR_SHOW, 0 }, + { "iconmenudontshow", ICONMENU_DONTSHOW, 0 }, + { "iconmgr", ICONMGR, 0 }, + { "iconregion", ICON_REGION, 0 }, + { "iconregionalignement", SKEYWORD, kws_IconRegionAlignement }, + { "iconregionjustification",SKEYWORD, kws_IconRegionJustification }, + { "icons", ICONS, 0 }, + { "ignorecaseinmenuselection", KEYWORD, kw0_IgnoreCaseInMenuSelection }, + { "ignorelockmodifier", KEYWORD, kw0_IgnoreLockModifier }, + { "ignoremodifier", IGNOREMODIFIER, 0 }, + { "ignoretransient", IGNORE_TRANSIENT, 0 }, + { "interpolatemenucolors", KEYWORD, kw0_InterpolateMenuColors }, + { "l", LOCK, 0 }, + { "left", JKEYWORD, J_LEFT }, + { "lefttitlebutton", LEFT_TITLEBUTTON, 0 }, + { "lock", LOCK, 0 }, + { "m", META, 0 }, + { "maketitle", MAKE_TITLE, 0 }, + { "mapwindowbackground", CLKEYWORD, kwcl_MapWindowBackground }, + { "mapwindowcurrentworkspace", MAPWINDOWCURRENTWORKSPACE, 0}, + { "mapwindowdefaultworkspace", MAPWINDOWDEFAULTWORKSPACE, 0}, + { "mapwindowforeground", CLKEYWORD, kwcl_MapWindowForeground }, + { "maxicontitlewidth", NKEYWORD, kwn_MaxIconTitleWidth }, + { "maxwindowsize", SKEYWORD, kws_MaxWindowSize }, + { "menu", MENU, 0 }, + { "menubackground", CKEYWORD, kwc_MenuBackground }, + { "menufont", SKEYWORD, kws_MenuFont }, + { "menuforeground", CKEYWORD, kwc_MenuForeground }, + { "menushadowcolor", CKEYWORD, kwc_MenuShadowColor }, + { "menushadowdepth", NKEYWORD, kwn_MenuShadowDepth }, + { "menutitlebackground", CKEYWORD, kwc_MenuTitleBackground }, + { "menutitleforeground", CKEYWORD, kwc_MenuTitleForeground }, + { "meta", META, 0 }, + { "mod", META, 0 }, /* fake it */ + { "monochrome", MONOCHROME, 0 }, + { "move", MOVE, 0 }, + { "movedelta", NKEYWORD, kwn_MoveDelta }, + { "moveoffresistance", NKEYWORD, kwn_MoveOffResistance }, + { "movepackresistance", NKEYWORD, kwn_MovePackResistance }, + { "nobackingstore", KEYWORD, kw0_NoBackingStore }, + { "noborder", NO_BORDER, 0 }, + { "nocasesensitive", KEYWORD, kw0_NoCaseSensitive }, + { "nodefaults", KEYWORD, kw0_NoDefaults }, + { "nograbserver", KEYWORD, kw0_NoGrabServer }, + { "nohighlight", NO_HILITE, 0 }, + { "noiconmanagerfocus", KEYWORD, kw0_NoIconManagerFocus }, + { "noiconmanagers", KEYWORD, kw0_NoIconManagers }, + { "noicontitle", NO_ICON_TITLE, 0 }, + { "noimagesinworkspacemanager", KEYWORD, kw0_NoImagesInWorkSpaceManager }, + { "nomenushadows", KEYWORD, kw0_NoMenuShadows }, + { "noopaquemove", NOOPAQUEMOVE, 0 }, + { "noopaqueresize", NOOPAQUERESIZE, 0 }, + { "noraiseondeiconify", KEYWORD, kw0_NoRaiseOnDeiconify }, + { "noraiseonmove", KEYWORD, kw0_NoRaiseOnMove }, + { "noraiseonresize", KEYWORD, kw0_NoRaiseOnResize }, + { "noraiseonwarp", KEYWORD, kw0_NoRaiseOnWarp }, + { "north", DKEYWORD, D_NORTH }, + { "nosaveunders", KEYWORD, kw0_NoSaveUnders }, + { "noshowoccupyall", KEYWORD, kw0_NoShowOccupyAll }, + { "nostackmode", NO_STACKMODE, 0 }, + { "notitle", NO_TITLE, 0 }, + { "notitlefocus", KEYWORD, kw0_NoTitleFocus }, + { "notitlehighlight", NO_TITLE_HILITE, 0 }, + { "noversion", KEYWORD, kw0_NoVersion }, + { "nowarptomenutitle", KEYWORD, kw0_NoWarpToMenuTitle }, + { "occupy", OCCUPYLIST, 0 }, + { "occupyall", OCCUPYALL, 0 }, + { "opaquemove", OPAQUEMOVE, 0 }, + { "opaquemovethreshold", NKEYWORD, kwn_OpaqueMoveThreshold }, + { "opaqueresize", OPAQUERESIZE, 0 }, + { "opaqueresizethreshold", NKEYWORD, kwn_OpaqueResizeThreshold }, + { "openwindowtimeout", NKEYWORD, kwn_OpenWindowTimeout }, + { "packnewwindows", KEYWORD, kw0_PackNewWindows }, + { "pixmapdirectory", SKEYWORD, kws_PixmapDirectory }, + { "pixmaps", PIXMAPS, 0 }, + { "r", ROOT, 0 }, + { "raisedelay", NKEYWORD, kwn_RaiseDelay }, + { "raiseonclick", KEYWORD, kw0_RaiseOnClick }, + { "raiseonclickbutton", NKEYWORD, kwn_RaiseOnClickButton }, + { "raiseonwarp", KEYWORD, kw0_RaiseOnWarp }, + { "raisewhenautounsqueeze", KEYWORD, kw0_RaiseWhenAutoUnSqueeze }, + { "randomplacement", SSKEYWORD, kwss_RandomPlacement }, + { "reallymoveinworkspacemanager", KEYWORD, kw0_ReallyMoveInWorkspaceManager }, + { "resize", RESIZE, 0 }, + { "resizefont", SKEYWORD, kws_ResizeFont }, + { "restartpreviousstate", KEYWORD, kw0_RestartPreviousState }, + { "reversecurrentworkspace",KEYWORD, kw0_ReverseCurrentWorkspace }, + { "right", JKEYWORD, J_RIGHT }, + { "righttitlebutton", RIGHT_TITLEBUTTON, 0 }, + { "root", ROOT, 0 }, + { "s", SHIFT, 0 }, + { "savecolor", SAVECOLOR, 0}, + { "saveworkspacefocus", KEYWORD, kw0_SaveWorkspaceFocus }, + { "schrinkicontitles", KEYWORD, kw0_ShrinkIconTitles }, + { "select", SELECT, 0 }, + { "shift", SHIFT, 0 }, + { "shortallwindowsmenus", KEYWORD, kw0_ShortAllWindowsMenus }, + { "showiconmanager", KEYWORD, kw0_ShowIconManager }, + { "showworkspacemanager", KEYWORD, kw0_ShowWorkspaceManager }, + { "shrinkicontitles", KEYWORD, kw0_ShrinkIconTitles }, + { "sloppyfocus", KEYWORD, kw0_SloppyFocus }, + { "sorticonmanager", KEYWORD, kw0_SortIconManager }, +#ifdef SOUNDS + { "soundhost", SKEYWORD, kws_SoundHost }, +#endif + { "south", DKEYWORD, D_SOUTH }, + { "squeezetitle", SQUEEZE_TITLE, 0 }, + { "starticonified", START_ICONIFIED, 0 }, + { "startinmapstate", KEYWORD, kw0_StartInMapState }, + { "startsqueezed", STARTSQUEEZED, 0 }, + { "stayupmenus", KEYWORD, kw0_StayUpMenus }, + { "sunkfocuswindowtitle", KEYWORD, kw0_SunkFocusWindowTitle }, + { "t", TITLE, 0 }, + { "threedborderwidth", NKEYWORD, kwn_ThreeDBorderWidth }, + { "title", TITLE, 0 }, + { "titlebackground", CLKEYWORD, kwcl_TitleBackground }, + { "titlebuttonborderwidth", NKEYWORD, kwn_TitleButtonBorderWidth }, + { "titlebuttonshadowdepth", NKEYWORD, kwn_TitleButtonShadowDepth }, + { "titlefont", SKEYWORD, kws_TitleFont }, + { "titleforeground", CLKEYWORD, kwcl_TitleForeground }, + { "titlehighlight", TITLE_HILITE, 0 }, + { "titlejustification", SKEYWORD, kws_TitleJustification }, + { "titlepadding", NKEYWORD, kwn_TitlePadding }, + { "titleshadowdepth", NKEYWORD, kwn_TitleShadowDepth }, + { "transienthasoccupation", KEYWORD, kw0_TransientHasOccupation }, + { "transientontop", NKEYWORD, kwn_TransientOnTop }, + { "unknownicon", SKEYWORD, kws_UnknownIcon }, + { "unmapbymovingfaraway", UNMAPBYMOVINGFARAWAY, 0 }, + { "usepposition", SKEYWORD, kws_UsePPosition }, + { "usesunktitlepixmap", KEYWORD, kw0_UseSunkTitlePixmap }, + { "usethreedborders", KEYWORD, kw0_Use3DBorders }, + { "usethreediconborders", KEYWORD, kw0_use3DIconBorders }, + { "usethreediconmanagers", KEYWORD, kw0_Use3DIconManagers }, + { "usethreedmenus", KEYWORD, kw0_Use3DMenus }, + { "usethreedtitles", KEYWORD, kw0_Use3DTitles }, + { "usethreedwmap", KEYWORD, kw0_Use3DWMap }, + { "virtualscreens", VIRTUAL_SCREENS, 0 }, + { "w", WINDOW, 0 }, + { "wait", WAITC, 0 }, + { "warpcursor", WARP_CURSOR, 0 }, + { "warpringonscreen", KEYWORD, kw0_WarpRingOnScreen }, + { "warptodefaultmenuentry", KEYWORD, kw0_WarpToDefaultMenuEntry }, + { "warpunmapped", KEYWORD, kw0_WarpUnmapped }, + { "west", DKEYWORD, D_WEST }, + { "window", WINDOW, 0 }, + { "windowbox", WINDOW_BOX, 0 }, + { "windowfunction", WINDOW_FUNCTION, 0 }, + { "windowgeometries", WINDOW_GEOMETRIES, 0 }, + { "windowregion", WINDOW_REGION, 0 }, + { "windowring", WINDOW_RING, 0 }, + { "windowringexclude", WINDOW_RING_EXCLUDE, 0}, + { "wmgrbuttonshadowdepth", NKEYWORD, kwn_WMgrButtonShadowDepth }, + { "wmgrbuttonstyle", SKEYWORD, kws_WMgrButtonStyle }, + { "wmgrhorizbuttonindent", NKEYWORD, kwn_WMgrHorizButtonIndent }, + { "wmgrvertbuttonindent", NKEYWORD, kwn_WMgrVertButtonIndent }, + { "workspace", WORKSPACE, 0 }, + { "workspacefont", SKEYWORD, kws_WorkSpaceFont }, + { "workspacemanagergeometry", WORKSPCMGR_GEOMETRY, 0 }, + { "workspaces", WORKSPACES, 0}, + { "xmovegrid", NKEYWORD, kwn_XMoveGrid }, + { "xorvalue", NKEYWORD, kwn_XorValue }, + { "xpmicondirectory", SKEYWORD, kws_PixmapDirectory }, + { "ymovegrid", NKEYWORD, kwn_YMoveGrid }, + { "zoom", ZOOM, 0 }, +}; + +static int numkeywords = (sizeof(keytable)/sizeof(keytable[0])); + +int parse_keyword (char *s, int *nump) +{ + register int lower = 0, upper = numkeywords - 1; + + XmuCopyISOLatin1Lowered (s, s); + while (lower <= upper) { + int middle = (lower + upper) / 2; + TwmKeyword *p = &keytable[middle]; + int res = strcmp (p->name, s); + + if (res < 0) { + lower = middle + 1; + } else if (res == 0) { + *nump = p->subnum; + return p->value; + } else { + upper = middle - 1; + } + } + return ERRORTOKEN; +} + + + +/* + * action routines called by grammar + */ + +int do_single_keyword (int keyword) +{ + switch (keyword) { + case kw0_NoDefaults: + Scr->NoDefaults = TRUE; + return 1; + + case kw0_AutoRelativeResize: + Scr->AutoRelativeResize = TRUE; + return 1; + + case kw0_ForceIcons: + if (Scr->FirstTime) Scr->ForceIcon = TRUE; + return 1; + + case kw0_NoIconManagers: + Scr->NoIconManagers = TRUE; + return 1; + + case kw0_InterpolateMenuColors: + if (Scr->FirstTime) Scr->InterpolateMenuColors = TRUE; + return 1; + + case kw0_NoVersion: + /* obsolete */ + return 1; + + case kw0_SortIconManager: + if (Scr->FirstTime) Scr->SortIconMgr = TRUE; + return 1; + + case kw0_NoGrabServer: + Scr->NoGrabServer = TRUE; + return 1; + + case kw0_NoMenuShadows: + if (Scr->FirstTime) Scr->Shadow = FALSE; + return 1; + + case kw0_NoRaiseOnMove: + if (Scr->FirstTime) Scr->NoRaiseMove = TRUE; + return 1; + + case kw0_NoRaiseOnResize: + if (Scr->FirstTime) Scr->NoRaiseResize = TRUE; + return 1; + + case kw0_NoRaiseOnDeiconify: + if (Scr->FirstTime) Scr->NoRaiseDeicon = TRUE; + return 1; + + case kw0_DontMoveOff: + Scr->DontMoveOff = TRUE; + return 1; + + case kw0_NoBackingStore: + Scr->BackingStore = FALSE; + return 1; + + case kw0_NoSaveUnders: + Scr->SaveUnder = FALSE; + return 1; + + case kw0_RestartPreviousState: + RestartPreviousState = True; + return 1; + + case kw0_ClientBorderWidth: + if (Scr->FirstTime) Scr->ClientBorderWidth = TRUE; + return 1; + + case kw0_NoTitleFocus: + Scr->TitleFocus = TRUE /*FALSE*/; + return 1; + + case kw0_DecorateTransients: + Scr->DecorateTransients = TRUE; + return 1; + + case kw0_ShowIconManager: + Scr->ShowIconManager = TRUE; + return 1; + + case kw0_ShowWorkspaceManager: + Scr->ShowWorkspaceManager = TRUE; + return 1; + + case kw0_StartInMapState: + Scr->workSpaceMgr.initialstate = MAPSTATE; + return 1; + + case kw0_NoShowOccupyAll: + Scr->workSpaceMgr.noshowoccupyall = TRUE; + return 1; + + case kw0_AutoOccupy: + Scr->AutoOccupy = TRUE; + return 1; + + case kw0_TransientHasOccupation: + Scr->TransientHasOccupation = TRUE; + return 1; + + case kw0_DontPaintRootWindow: + Scr->DontPaintRootWindow = TRUE; + return 1; + + case kw0_UseSunkTitlePixmap: + Scr->UseSunkTitlePixmap = TRUE; + return 1; + + case kw0_Use3DBorders: + Scr->use3Dborders = TRUE; + return 1; + + case kw0_Use3DIconManagers: + Scr->use3Diconmanagers = TRUE; + return 1; + + case kw0_Use3DMenus: + Scr->use3Dmenus = TRUE; + return 1; + + case kw0_Use3DTitles: + Scr->use3Dtitles = TRUE; + return 1; + + case kw0_Use3DWMap: + Scr->use3Dwmap = TRUE; + return 1; + + case kw0_SunkFocusWindowTitle: + Scr->SunkFocusWindowTitle = TRUE; + return 1; + + case kw0_BeNiceToColormap: + Scr->BeNiceToColormap = TRUE; + return 1; + + case kw0_BorderResizeCursors: + Scr->BorderCursors = TRUE; + return 1; + + case kw0_NoCaseSensitive: + Scr->CaseSensitive = FALSE; + return 1; + + case kw0_NoRaiseOnWarp: + Scr->RaiseOnWarp = FALSE; + return 1; + + case kw0_RaiseOnWarp: + Scr->RaiseOnWarp = TRUE; + return 1; + + case kw0_WarpUnmapped: + Scr->WarpUnmapped = TRUE; + return 1; + + case kw0_WarpRingOnScreen: + Scr->WarpRingAnyWhere = FALSE; + return 1; + + case kw0_NoIconManagerFocus: + Scr->IconManagerFocus = FALSE; + return 1; + + case kw0_StayUpMenus: + Scr->StayUpMenus = TRUE; + return 1; + + case kw0_ClickToFocus: + Scr->ClickToFocus = TRUE; + return 1; + + case kw0_ReallyMoveInWorkspaceManager: + Scr->ReallyMoveInWorkspaceManager = TRUE; + return 1; + + case kw0_ShowWinWhenMovingInWmgr: + Scr->ShowWinWhenMovingInWmgr = TRUE; + return 1; + + case kw0_ReverseCurrentWorkspace: + Scr->ReverseCurrentWorkspace = TRUE; + return 1; + + case kw0_DontWarpCursorInWMap: + Scr->DontWarpCursorInWMap = TRUE; + return 1; + + case kw0_CenterFeedbackWindow: + Scr->CenterFeedbackWindow = TRUE; + return 1; + + case kw0_WarpToDefaultMenuEntry: + Scr->WarpToDefaultMenuEntry = TRUE; + return 1; + + case kw0_ShrinkIconTitles: + Scr->ShrinkIconTitles = TRUE; + return 1; + + case kw0_AutoRaiseIcons: + Scr->AutoRaiseIcons = TRUE; + return 1; + + /* kai */ + case kw0_AutoFocusToTransients: + Scr->AutoFocusToTransients = TRUE; + return 1; + + case kw0_use3DIconBorders: + Scr->use3Diconborders = TRUE; + return 1; + + case kw0_ShortAllWindowsMenus: + Scr->ShortAllWindowsMenus = TRUE; + return 1; + + case kw0_RaiseWhenAutoUnSqueeze: + Scr->RaiseWhenAutoUnSqueeze = TRUE; + return 1; + + case kw0_RaiseOnClick: + Scr->RaiseOnClick = TRUE; + return 1; + + case kw0_IgnoreLockModifier: + Scr->IgnoreLockModifier = TRUE; + return 1; + + case kw0_PackNewWindows: + Scr->PackNewWindows = TRUE; + return 1; + + case kw0_IgnoreCaseInMenuSelection: + Scr->IgnoreCaseInMenuSelection = TRUE; + return 1; + + case kw0_SloppyFocus: + Scr->SloppyFocus = TRUE; + return 1; + + case kw0_SaveWorkspaceFocus: + Scr->SaveWorkspaceFocus = TRUE; + return 1; + + case kw0_NoImagesInWorkSpaceManager: + Scr->NoImagesInWorkSpaceManager = TRUE; + return 1; + + case kw0_NoWarpToMenuTitle: + Scr->NoWarpToMenuTitle = TRUE; + return 1; + + } + return 0; +} + + +int do_string_string_keyword (int keyword, char *s1, char *s2) +{ + switch (keyword) { + case kwss_RandomPlacement: + { + int rp = ParseRandomPlacement (s1); + if (rp < 0) { + twmrc_error_prefix(); + fprintf (stderr, + "ignoring invalid RandomPlacement argument 1 \"%s\"\n", s1); + } else { + Scr->RandomPlacement = rp; + } + } + { + if (strcmp (s2, "default") == 0) return 1; + JunkMask = XParseGeometry (s2, &JunkX, &JunkY, &JunkWidth, &JunkHeight); +#ifdef DEBUG + fprintf (stderr, "DEBUG:: JunkMask = %x, WidthValue = %x, HeightValue = %x\n", JunkMask, WidthValue, HeightValue); + fprintf (stderr, "DEBUG:: JunkX = %d, JunkY = %d\n", JunkX, JunkY); +#endif + if ((JunkMask & (XValue | YValue)) != + (XValue | YValue)) { + twmrc_error_prefix(); + fprintf (stderr, + "ignoring invalid RandomPlacement displacement \"%s\"\n", s2); + } else { + Scr->RandomDisplacementX = JunkX; + Scr->RandomDisplacementY = JunkY; + } + return 1; + } + } + return 0; +} + + +int do_string_keyword (int keyword, char *s) +{ + switch (keyword) { + case kws_UsePPosition: + { + int ppos = ParseUsePPosition (s); + if (ppos < 0) { + twmrc_error_prefix(); + fprintf (stderr, + "ignoring invalid UsePPosition argument \"%s\"\n", s); + } else { + Scr->UsePPosition = ppos; + } + return 1; + } + + case kws_IconFont: + if (!Scr->HaveFonts) Scr->IconFont.basename = s; + return 1; + + case kws_ResizeFont: + if (!Scr->HaveFonts) Scr->SizeFont.basename = s; + return 1; + + case kws_MenuFont: + if (!Scr->HaveFonts) Scr->MenuFont.basename = s; + return 1; + + case kws_WorkSpaceFont: + if (!Scr->HaveFonts) Scr->workSpaceMgr.windowFont.basename = s; + return 1; + + case kws_TitleFont: + if (!Scr->HaveFonts) Scr->TitleBarFont.basename = s; + return 1; + + case kws_IconManagerFont: + if (!Scr->HaveFonts) Scr->IconManagerFont.basename = s; + return 1; + + case kws_UnknownIcon: + if (Scr->FirstTime) GetUnknownIcon (s); + return 1; + + case kws_IconDirectory: + if (Scr->FirstTime) Scr->IconDirectory = ExpandFilePath (s); + return 1; + + case kws_PixmapDirectory: + if (Scr->FirstTime) Scr->PixmapDirectory = ExpandFilePath (s); + return 1; + + case kws_MaxWindowSize: + JunkMask = XParseGeometry (s, &JunkX, &JunkY, &JunkWidth, &JunkHeight); + if ((JunkMask & (WidthValue | HeightValue)) != + (WidthValue | HeightValue)) { + twmrc_error_prefix(); + fprintf (stderr, "bad MaxWindowSize \"%s\"\n", s); + return 0; + } + if (JunkWidth == 0 || JunkHeight == 0) { + twmrc_error_prefix(); + fprintf (stderr, "MaxWindowSize \"%s\" must be non-zero\n", s); + return 0; + } + Scr->MaxWindowWidth = JunkWidth; + Scr->MaxWindowHeight = JunkHeight; + return 1; + + case kws_IconJustification: + { + int just = ParseJustification (s); + + if ((just < 0) || (just == J_BORDER)) { + twmrc_error_prefix(); + fprintf (stderr, + "ignoring invalid IconJustification argument \"%s\"\n", s); + } else { + Scr->IconJustification = just; + } + return 1; + } + case kws_IconRegionJustification: + { + int just = ParseJustification (s); + + if (just < 0) { + twmrc_error_prefix(); + fprintf (stderr, + "ignoring invalid IconRegionJustification argument \"%s\"\n", s); + } else { + Scr->IconRegionJustification = just; + } + return 1; + } + case kws_IconRegionAlignement: + { + int just = ParseAlignement (s); + + if (just < 0) { + twmrc_error_prefix(); + fprintf (stderr, + "ignoring invalid IconRegionAlignement argument \"%s\"\n", s); + } else { + Scr->IconRegionAlignement = just; + } + return 1; + } + + case kws_TitleJustification: + { + int just = ParseJustification (s); + + if ((just < 0) || (just == J_BORDER)) { + twmrc_error_prefix(); + fprintf (stderr, + "ignoring invalid TitleJustification argument \"%s\"\n", s); + } else { + Scr->TitleJustification = just; + } + return 1; + } +#ifdef SOUNDS + case kws_SoundHost: + if (Scr->FirstTime) set_sound_host(s); + return 1; +#endif + + case kws_WMgrButtonStyle: + { + int style = ParseButtonStyle (s); + + if (style < 0) { + twmrc_error_prefix(); + fprintf (stderr, + "ignoring invalid WMgrButtonStyle argument \"%s\"\n", s); + } else { + Scr->workSpaceMgr.buttonStyle = style; + } + return 1; + } + + case kws_IconifyStyle: + { + if (strlen (s) == 0) { + twmrc_error_prefix(); + fprintf (stderr, "ignoring invalid IconifyStyle argument \"%s\"\n", s); + } + if (strcmp (s, "default") == 0) Scr->IconifyStyle = ICONIFY_NORMAL; + XmuCopyISOLatin1Lowered (s, s); + if (strcmp (s, "normal") == 0) Scr->IconifyStyle = ICONIFY_NORMAL; + if (strcmp (s, "mosaic") == 0) Scr->IconifyStyle = ICONIFY_MOSAIC; + if (strcmp (s, "zoomin") == 0) Scr->IconifyStyle = ICONIFY_ZOOMIN; + if (strcmp (s, "zoomout") == 0) Scr->IconifyStyle = ICONIFY_ZOOMOUT; + if (strcmp (s, "sweep") == 0) Scr->IconifyStyle = ICONIFY_SWEEP; + return 1; + } + } + return 0; +} + + +int do_number_keyword (int keyword, int num) +{ + switch (keyword) { + case kwn_ConstrainedMoveTime: + ConstrainedMoveTime = num; + return 1; + + case kwn_MoveDelta: + Scr->MoveDelta = num; + return 1; + + case kwn_MoveOffResistance: + Scr->MoveOffResistance = num; + return 1; + + case kwn_MovePackResistance: + if (num < 0) num = 20; + Scr->MovePackResistance = num; + return 1; + + case kwn_XMoveGrid: + if (num < 1) num = 1; + if (num > 100) num = 100; + Scr->XMoveGrid = num; + return 1; + + case kwn_YMoveGrid: + if (num < 1) num = 1; + if (num > 100) num = 100; + Scr->YMoveGrid = num; + return 1; + + case kwn_XorValue: + if (Scr->FirstTime) Scr->XORvalue = num; + return 1; + + case kwn_FramePadding: + if (Scr->FirstTime) Scr->FramePadding = num; + return 1; + + case kwn_TitlePadding: + if (Scr->FirstTime) { + Scr->TitlePadding = num; + } + return 1; + + case kwn_ButtonIndent: + if (Scr->FirstTime) Scr->ButtonIndent = num; + return 1; + + case kwn_ThreeDBorderWidth: + if (Scr->FirstTime) Scr->ThreeDBorderWidth = num; + return 1; + + case kwn_BorderWidth: + if (Scr->FirstTime) Scr->BorderWidth = num; + return 1; + + case kwn_IconBorderWidth: + if (Scr->FirstTime) Scr->IconBorderWidth = num; + return 1; + + case kwn_TitleButtonBorderWidth: + if (Scr->FirstTime) Scr->TBInfo.border = num; + return 1; + + case kwn_RaiseDelay: + RaiseDelay = num; + return 1; + + case kwn_TransientOnTop: + if (Scr->FirstTime) Scr->TransientOnTop = num; + return 1; + + case kwn_OpaqueMoveThreshold: + if (Scr->FirstTime) Scr->OpaqueMoveThreshold = num; + return 1; + + case kwn_OpaqueResizeThreshold: + if (Scr->FirstTime) Scr->OpaqueResizeThreshold = num; + return 1; + + case kwn_WMgrVertButtonIndent: + if (Scr->FirstTime) Scr->WMgrVertButtonIndent = num; + if (Scr->WMgrVertButtonIndent < 0) Scr->WMgrVertButtonIndent = 0; + Scr->workSpaceMgr.vspace = Scr->WMgrVertButtonIndent; + Scr->workSpaceMgr.occupyWindow->vspace = Scr->WMgrVertButtonIndent; + return 1; + + case kwn_WMgrHorizButtonIndent: + if (Scr->FirstTime) Scr->WMgrHorizButtonIndent = num; + if (Scr->WMgrHorizButtonIndent < 0) Scr->WMgrHorizButtonIndent = 0; + Scr->workSpaceMgr.hspace = Scr->WMgrHorizButtonIndent; + Scr->workSpaceMgr.occupyWindow->hspace = Scr->WMgrHorizButtonIndent; + return 1; + + case kwn_WMgrButtonShadowDepth: + if (Scr->FirstTime) Scr->WMgrButtonShadowDepth = num; + if (Scr->WMgrButtonShadowDepth < 1) Scr->WMgrButtonShadowDepth = 1; + return 1; + + case kwn_MaxIconTitleWidth: + if (Scr->FirstTime) Scr->MaxIconTitleWidth = num; + return 1; + + case kwn_ClearShadowContrast: + if (Scr->FirstTime) Scr->ClearShadowContrast = num; + if (Scr->ClearShadowContrast < 0) Scr->ClearShadowContrast = 0; + if (Scr->ClearShadowContrast > 100) Scr->ClearShadowContrast = 100; + return 1; + + case kwn_DarkShadowContrast: + if (Scr->FirstTime) Scr->DarkShadowContrast = num; + if (Scr->DarkShadowContrast < 0) Scr->DarkShadowContrast = 0; + if (Scr->DarkShadowContrast > 100) Scr->DarkShadowContrast = 100; + return 1; + + case kwn_AnimationSpeed: + if (num < 0) num = 0; + SetAnimationSpeed (num); + return 1; + + case kwn_BorderShadowDepth: + if (Scr->FirstTime) Scr->BorderShadowDepth = num; + if (Scr->BorderShadowDepth < 0) Scr->BorderShadowDepth = 2; + return 1; + + case kwn_BorderLeft: + if (Scr->FirstTime) Scr->BorderLeft = num; + if (Scr->BorderLeft < 0) Scr->BorderLeft = 0; + return 1; + + case kwn_BorderRight: + if (Scr->FirstTime) Scr->BorderRight = num; + if (Scr->BorderRight < 0) Scr->BorderRight = 0; + return 1; + + case kwn_BorderTop: + if (Scr->FirstTime) Scr->BorderTop = num; + if (Scr->BorderTop < 0) Scr->BorderTop = 0; + return 1; + + case kwn_BorderBottom: + if (Scr->FirstTime) Scr->BorderBottom = num; + if (Scr->BorderBottom < 0) Scr->BorderBottom = 0; + return 1; + + case kwn_TitleButtonShadowDepth: + if (Scr->FirstTime) Scr->TitleButtonShadowDepth = num; + if (Scr->TitleButtonShadowDepth < 0) Scr->TitleButtonShadowDepth = 2; + return 1; + + case kwn_TitleShadowDepth: + if (Scr->FirstTime) Scr->TitleShadowDepth = num; + if (Scr->TitleShadowDepth < 0) Scr->TitleShadowDepth = 2; + return 1; + + case kwn_IconManagerShadowDepth: + if (Scr->FirstTime) Scr->IconManagerShadowDepth = num; + if (Scr->IconManagerShadowDepth < 0) Scr->IconManagerShadowDepth = 2; + return 1; + + case kwn_MenuShadowDepth: + if (Scr->FirstTime) Scr->MenuShadowDepth = num; + if (Scr->MenuShadowDepth < 0) Scr->MenuShadowDepth = 2; + return 1; + + case kwn_OpenWindowTimeout: + if (Scr->FirstTime) Scr->OpenWindowTimeout = num; + if (Scr->OpenWindowTimeout < 0) Scr->OpenWindowTimeout = 0; + return 1; + + case kwn_RaiseOnClickButton: + if (Scr->FirstTime) Scr->RaiseOnClickButton = num; + if (Scr->RaiseOnClickButton < 1) Scr->RaiseOnClickButton = 1; + if (Scr->RaiseOnClickButton > MAX_BUTTONS) Scr->RaiseOnClickButton = MAX_BUTTONS; + return 1; + + } + + return 0; +} + +name_list **do_colorlist_keyword (int keyword, int colormode, char *s) +{ + switch (keyword) { + case kwcl_BorderColor: + GetColor (colormode, &Scr->BorderColorC.back, s); + return &Scr->BorderColorL; + + case kwcl_IconManagerHighlight: + GetColor (colormode, &Scr->IconManagerHighlight, s); + return &Scr->IconManagerHighlightL; + + case kwcl_BorderTileForeground: + GetColor (colormode, &Scr->BorderTileC.fore, s); + return &Scr->BorderTileForegroundL; + + case kwcl_BorderTileBackground: + GetColor (colormode, &Scr->BorderTileC.back, s); + return &Scr->BorderTileBackgroundL; + + case kwcl_TitleForeground: + GetColor (colormode, &Scr->TitleC.fore, s); + return &Scr->TitleForegroundL; + + case kwcl_TitleBackground: + GetColor (colormode, &Scr->TitleC.back, s); + return &Scr->TitleBackgroundL; + + case kwcl_IconForeground: + GetColor (colormode, &Scr->IconC.fore, s); + return &Scr->IconForegroundL; + + case kwcl_IconBackground: + GetColor (colormode, &Scr->IconC.back, s); + return &Scr->IconBackgroundL; + + case kwcl_IconBorderColor: + GetColor (colormode, &Scr->IconBorderColor, s); + return &Scr->IconBorderColorL; + + case kwcl_IconManagerForeground: + GetColor (colormode, &Scr->IconManagerC.fore, s); + return &Scr->IconManagerFL; + + case kwcl_IconManagerBackground: + GetColor (colormode, &Scr->IconManagerC.back, s); + return &Scr->IconManagerBL; + + case kwcl_MapWindowBackground: + GetColor (colormode, &Scr->workSpaceMgr.windowcp.back, s); + Scr->workSpaceMgr.windowcpgiven = True; + return &Scr->workSpaceMgr.windowBackgroundL; + + case kwcl_MapWindowForeground: + GetColor (colormode, &Scr->workSpaceMgr.windowcp.fore, s); + Scr->workSpaceMgr.windowcpgiven = True; + return &Scr->workSpaceMgr.windowForegroundL; + } + return NULL; +} + +int do_color_keyword (int keyword, int colormode, char *s) +{ + switch (keyword) { + case kwc_DefaultForeground: + GetColor (colormode, &Scr->DefaultC.fore, s); + return 1; + + case kwc_DefaultBackground: + GetColor (colormode, &Scr->DefaultC.back, s); + return 1; + + case kwc_MenuForeground: + GetColor (colormode, &Scr->MenuC.fore, s); + return 1; + + case kwc_MenuBackground: + GetColor (colormode, &Scr->MenuC.back, s); + return 1; + + case kwc_MenuTitleForeground: + GetColor (colormode, &Scr->MenuTitleC.fore, s); + return 1; + + case kwc_MenuTitleBackground: + GetColor (colormode, &Scr->MenuTitleC.back, s); + return 1; + + case kwc_MenuShadowColor: + GetColor (colormode, &Scr->MenuShadowColor, s); + return 1; + + } + + return 0; +} + +/* + * put_pixel_on_root() Save a pixel value in twm root window color property. + */ +static void put_pixel_on_root(Pixel pixel) +{ + int i, addPixel = 1; + Atom retAtom; + int retFormat; + unsigned long nPixels, retAfter; + Pixel *retProp; + + if (XGetWindowProperty(dpy, Scr->Root, _XA_MIT_PRIORITY_COLORS, 0, 8192, + False, XA_CARDINAL, &retAtom, + &retFormat, &nPixels, &retAfter, + (unsigned char **)&retProp) != Success || !retProp) + return; + + for (i=0; i< nPixels; i++) + if (pixel == retProp[i]) addPixel = 0; + + XFree((char *)retProp); + + if (addPixel) + XChangeProperty (dpy, Scr->Root, _XA_MIT_PRIORITY_COLORS, + XA_CARDINAL, 32, PropModeAppend, + (unsigned char *)&pixel, 1); +} + +/* + * do_string_savecolor() save a color from a string in the twmrc file. + */ +int do_string_savecolor(int colormode, char *s) +{ + Pixel p; + GetColor(colormode, &p, s); + put_pixel_on_root(p); + return 0; +} + +/* + * do_var_savecolor() save a color from a var in the twmrc file. + */ +typedef struct _cnode {int i; struct _cnode *next;} Cnode, *Cptr; +Cptr chead = NULL; + +int do_var_savecolor(int key) +{ + Cptr cptrav, cpnew; + if (!chead) { + chead = (Cptr)malloc(sizeof(Cnode)); + chead->i = key; chead->next = NULL; + } + else { + cptrav = chead; + while (cptrav->next != NULL) { cptrav = cptrav->next; } + cpnew = (Cptr)malloc(sizeof(Cnode)); + cpnew->i = key; cpnew->next = NULL; cptrav->next = cpnew; + } + return 0; +} + +/* + * assign_var_savecolor() traverse the var save color list placeing the pixels + * in the root window property. + */ +void assign_var_savecolor(void) +{ + Cptr cp = chead; + while (cp != NULL) { + switch (cp->i) { + case kwcl_BorderColor: + put_pixel_on_root(Scr->BorderColorC.back); + break; + case kwcl_IconManagerHighlight: + put_pixel_on_root(Scr->IconManagerHighlight); + break; + case kwcl_BorderTileForeground: + put_pixel_on_root(Scr->BorderTileC.fore); + break; + case kwcl_BorderTileBackground: + put_pixel_on_root(Scr->BorderTileC.back); + break; + case kwcl_TitleForeground: + put_pixel_on_root(Scr->TitleC.fore); + break; + case kwcl_TitleBackground: + put_pixel_on_root(Scr->TitleC.back); + break; + case kwcl_IconForeground: + put_pixel_on_root(Scr->IconC.fore); + break; + case kwcl_IconBackground: + put_pixel_on_root(Scr->IconC.back); + break; + case kwcl_IconBorderColor: + put_pixel_on_root(Scr->IconBorderColor); + break; + case kwcl_IconManagerForeground: + put_pixel_on_root(Scr->IconManagerC.fore); + break; + case kwcl_IconManagerBackground: + put_pixel_on_root(Scr->IconManagerC.back); + break; + case kwcl_MapWindowForeground: + put_pixel_on_root(Scr->workSpaceMgr.windowcp.fore); + break; + case kwcl_MapWindowBackground: + put_pixel_on_root(Scr->workSpaceMgr.windowcp.back); + break; + } + cp = cp->next; + } + if (chead) { + free(chead); + chead = NULL; + } +} + +static int ParseRandomPlacement (register char *s) +{ + if (strlen (s) == 0) return RP_ALL; + if (strcmp (s, "default") == 0) return RP_ALL; + XmuCopyISOLatin1Lowered (s, s); + + if (strcmp (s, "off") == 0) return RP_OFF; + if (strcmp (s, "on") == 0) return RP_ALL; + if (strcmp (s, "all") == 0) return RP_ALL; + if (strcmp (s, "unmapped") == 0) return RP_UNMAPPED; + return (-1); +} + +int ParseJustification (register char *s) +{ + if (strlen (s) == 0) return (-1); + if (strcmp (s, "default") == 0) return J_CENTER; + if (strcmp (s, "undef") == 0) return J_UNDEF; + XmuCopyISOLatin1Lowered (s, s); + + if (strcmp (s, "undef") == 0) return J_UNDEF; + if (strcmp (s, "default") == 0) return J_CENTER; + if (strcmp (s, "left") == 0) return J_LEFT; + if (strcmp (s, "center") == 0) return J_CENTER; + if (strcmp (s, "right") == 0) return J_RIGHT; + if (strcmp (s, "border") == 0) return J_BORDER; + return (-1); +} + +int ParseAlignement (register char *s) +{ + if (strlen (s) == 0) return (-1); + if (strcmp (s, "default") == 0) return J_CENTER; + if (strcmp (s, "undef") == 0) return J_UNDEF; + XmuCopyISOLatin1Lowered (s, s); + + if (strcmp (s, "undef") == 0) return J_UNDEF; + if (strcmp (s, "default") == 0) return J_CENTER; + if (strcmp (s, "top") == 0) return J_TOP; + if (strcmp (s, "center") == 0) return J_CENTER; + if (strcmp (s, "bottom") == 0) return J_BOTTOM; + if (strcmp (s, "border") == 0) return J_BORDER; + return (-1); +} + +static int ParseUsePPosition (register char *s) +{ + if (strlen (s) == 0) return (-1); + if (strcmp (s, "default") == 0) return PPOS_OFF; + XmuCopyISOLatin1Lowered (s, s); + + if (strcmp (s, "default") == 0) return PPOS_OFF; + if (strcmp (s, "off") == 0) return PPOS_OFF; + if (strcmp (s, "on") == 0) return PPOS_ON; + if (strcmp (s, "non-zero") == 0) return PPOS_NON_ZERO; + if (strcmp (s, "nonzero") == 0) return PPOS_NON_ZERO; + return (-1); +} + +static int ParseButtonStyle (register char *s) +{ + if (strlen (s) == 0) return (-1); + if (strcmp (s, "default") == 0) return STYLE_NORMAL; + XmuCopyISOLatin1Lowered (s, s); + + if (strcmp (s, "normal") == 0) return STYLE_NORMAL; + if (strcmp (s, "style1") == 0) return STYLE_STYLE1; + if (strcmp (s, "style2") == 0) return STYLE_STYLE2; + if (strcmp (s, "style3") == 0) return STYLE_STYLE3; + return (-1); +} + +int do_squeeze_entry (name_list **list, /* squeeze or dont-squeeze list */ + char *name, /* window name */ + int justify, /* left, center, right */ + int num, /* signed num */ + int denom) /* 0 or indicates fraction denom */ +{ + int absnum = (num < 0 ? -num : num); + + if (denom < 0) { + twmrc_error_prefix(); + fprintf (stderr, "negative SqueezeTitle denominator %d\n", denom); + return (1); + } + if (absnum > denom && denom != 0) { + twmrc_error_prefix(); + fprintf (stderr, "SqueezeTitle fraction %d/%d outside window\n", + num, denom); + return (1); + } + /* Process the special cases from the manual here rather than + * each time we calculate the position of the title bar + * in add_window.c:ComputeTitleLocation(). + * In fact, it's better to get rid of them entirely, but we + * probably should not do that for compatibility's sake. + * By using a non-zero denominator the position will be relative. + */ + if (denom == 0 && num == 0) { + if (justify == J_CENTER) { + num = 1; + denom = 2; + } else if (justify == J_RIGHT) { + num = 2; + denom = 2; + } + twmrc_error_prefix(); + fprintf (stderr, "deprecated SqueezeTitle faction 0/0, assuming %d/%d\n", + num, denom); + } + + if (HasShape) { + SqueezeInfo *sinfo; + sinfo = (SqueezeInfo *) malloc (sizeof(SqueezeInfo)); + + if (!sinfo) { + twmrc_error_prefix(); + fprintf (stderr, "unable to allocate %lu bytes for squeeze info\n", + (unsigned long) sizeof(SqueezeInfo)); + return (1); + } + sinfo->justify = justify; + sinfo->num = num; + sinfo->denom = denom; + AddToList (list, name, (char *) sinfo); + } + return (0); +} + +#ifdef USEM4 + +static FILE *start_m4(FILE *fraw) +{ + int fno; + int fids[2]; + int fres; /* Fork result */ + + fno = fileno(fraw); + /* if (-1 == fcntl(fno, F_SETFD, 0)) perror("fcntl()"); */ + pipe(fids); + fres = fork(); + if (fres < 0) { + perror("Fork for " M4CMD " failed"); + exit(23); + } + if (fres == 0) { + char *tmp_file; + + /* Child */ + close(0); /* stdin */ + close(1); /* stdout */ + dup2(fno, 0); /* stdin = fraw */ + dup2(fids[1], 1); /* stdout = pipe to parent */ + /* get_defs("m4", dpy, display_name) */ + tmp_file = m4_defs(dpy, display_name); + execlp(M4CMD, M4CMD, "-s", tmp_file, "-", NULL); + + /* If we get here we are screwed... */ + perror("Can't execlp() " M4CMD); + exit(124); + } + /* Parent */ + close(fids[1]); + return ((FILE*)fdopen(fids[0], "r")); +} + +/* Code taken and munged from xrdb.c */ +#define MAXHOSTNAME 255 +#define Resolution(pixels, mm) ((((pixels) * 100000 / (mm)) + 50) / 100) +#define EXTRA 16 + +static char *MkDef(char *name, char *def) +{ + static char *cp = NULL; + static int maxsize = 0; + int n, nl; + + if (def == NULL) return (""); /* XXX JWS: prevent segfaults */ + /* The char * storage only lasts for 1 call... */ + if ((n = EXTRA + ((nl = strlen(name)) + strlen(def))) > maxsize) { + maxsize = n; + if (cp) free(cp); + + cp = malloc(n); + } + /* Otherwise cp is aready big 'nuf */ + if (cp == NULL) { + fprintf(stderr, "Can't get %d bytes for arg parm\n", n); + exit(468); + } + strcpy (cp, "define(`"); + strcat (cp, name); + strcat (cp, "', `"); + strcat (cp, def); + strcat (cp, "')\n"); + + return(cp); +} + +static char *MkNum(char *name, int def) +{ + char num[20]; + + sprintf(num, "%d", def); + return(MkDef(name, num)); +} + +#ifdef NOSTEMP +int mkstemp(str) +char *str; +{ + int fd; + + mktemp(str); + fd = creat(str, 0744); + if (fd == -1) perror("mkstemp's creat"); + return(fd); +} +#endif + +static char *m4_defs(Display *display, char *host) +{ + Screen *screen; + Visual *visual; + char client[MAXHOSTNAME], server[MAXHOSTNAME], *colon; + struct hostent *hostname; + char *vc; /* Visual Class */ + static char tmp_name[] = "/tmp/twmrcXXXXXX"; + int fd; + FILE *tmpf; + char *user; + + fd = mkstemp(tmp_name); /* I *hope* mkstemp exists, because */ + /* I tried to find the "portable" */ + /* mktmp... */ + if (fd < 0) { + perror("mkstemp failed in m4_defs"); + exit(377); + } + tmpf = (FILE*) fdopen(fd, "w+"); + XmuGetHostname(client, MAXHOSTNAME); + hostname = gethostbyname(client); + strcpy(server, XDisplayName(host)); + colon = strchr(server, ':'); + if (colon != NULL) *colon = '\0'; + if ((server[0] == '\0') || (!strcmp(server, "unix"))) + strcpy(server, client); /* must be connected to :0 or unix:0 */ + /* The machine running the X server */ + fputs(MkDef("SERVERHOST", server), tmpf); + /* The machine running the window manager process */ + fputs(MkDef("CLIENTHOST", client), tmpf); + if (hostname) + fputs(MkDef("HOSTNAME", hostname->h_name), tmpf); + else + fputs(MkDef("HOSTNAME", client), tmpf); + + if (!(user=getenv("USER")) && !(user=getenv("LOGNAME"))) user = "unknown"; + fputs(MkDef("USER", user), tmpf); + fputs(MkDef("HOME", getenv("HOME")), tmpf); + fputs(MkDef("PIXMAP_DIRECTORY", PIXMAP_DIRECTORY), tmpf); + fputs(MkNum("VERSION", ProtocolVersion(display)), tmpf); + fputs(MkNum("REVISION", ProtocolRevision(display)), tmpf); + fputs(MkDef("VENDOR", ServerVendor(display)), tmpf); + fputs(MkNum("RELEASE", VendorRelease(display)), tmpf); + screen = ScreenOfDisplay(display, Scr->screen); + visual = DefaultVisualOfScreen(screen); + fputs(MkNum("WIDTH", screen->width), tmpf); + fputs(MkNum("HEIGHT", screen->height), tmpf); + fputs(MkNum("X_RESOLUTION",Resolution(screen->width,screen->mwidth)), tmpf); + fputs(MkNum("Y_RESOLUTION",Resolution(screen->height,screen->mheight)),tmpf); + fputs(MkNum("PLANES",DisplayPlanes(display, Scr->screen)), tmpf); + fputs(MkNum("BITS_PER_RGB", visual->bits_per_rgb), tmpf); + fputs(MkDef("TWM_TYPE", "ctwm"), tmpf); + fputs(MkDef("TWM_VERSION", VersionNumber), tmpf); + switch(visual->class) { + case(StaticGray): vc = "StaticGray"; break; + case(GrayScale): vc = "GrayScale"; break; + case(StaticColor): vc = "StaticColor"; break; + case(PseudoColor): vc = "PseudoColor"; break; + case(TrueColor): vc = "TrueColor"; break; + case(DirectColor): vc = "DirectColor"; break; + default: vc = "NonStandard"; break; + } + fputs(MkDef("CLASS", vc), tmpf); + if (visual->class != StaticGray && visual->class != GrayScale) { + fputs(MkDef("COLOR", "Yes"), tmpf); + } else { + fputs(MkDef("COLOR", "No"), tmpf); + } +#ifdef XPM + fputs(MkDef("XPM", "Yes"), tmpf); +#endif +#ifdef JPEG + fputs(MkDef("JPEG", "Yes"), tmpf); +#endif +#ifdef IMCONV + fputs(MkDef("IMCONV", "Yes"), tmpf); +#endif +#ifdef GNOME + fputs(MkDef("GNOME", "Yes"), tmpf); +#endif +#ifdef SOUNDS + fputs(MkDef("SOUNDS", "Yes"), tmpf); +#endif + fputs(MkDef("I18N", "Yes"), tmpf); + if (captive && captivename) { + fputs (MkDef ("TWM_CAPTIVE", "Yes"), tmpf); + fputs (MkDef ("TWM_CAPTIVE_NAME", captivename), tmpf); + } else { + fputs (MkDef ("TWM_CAPTIVE", "No"), tmpf); + } + if (KeepTmpFile) { + fprintf(stderr, "Left file: %s\n", tmp_name); + } else { + fprintf(tmpf, "syscmd(/bin/rm %s)\n", tmp_name); + } + fclose(tmpf); + return(tmp_name); +} +#endif /* USEM4 */ Index: external/mit/ctwm/dist/parse.h =================================================================== RCS file: external/mit/ctwm/dist/parse.h diff -N external/mit/ctwm/dist/parse.h --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/parse.h 3 Sep 2015 12:19:58 -0000 @@ -0,0 +1,226 @@ +/*****************************************************************************/ +/** Copyright 1988 by Evans & Sutherland Computer Corporation, **/ +/** Salt Lake City, Utah **/ +/** Portions Copyright 1989 by the Massachusetts Institute of Technology **/ +/** Cambridge, Massachusetts **/ +/** **/ +/** All Rights Reserved **/ +/** **/ +/** Permission to use, copy, modify, and distribute this software and **/ +/** its documentation for any purpose and without fee is hereby **/ +/** granted, provided that the above copyright notice appear in all **/ +/** copies and that both that copyright notice and this permis- **/ +/** sion notice appear in supporting documentation, and that the **/ +/** names of Evans & Sutherland and M.I.T. not be used in advertising **/ +/** in publicity pertaining to distribution of the software without **/ +/** specific, written prior permission. **/ +/** **/ +/** EVANS & SUTHERLAND AND M.I.T. DISCLAIM ALL WARRANTIES WITH REGARD **/ +/** TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANT- **/ +/** ABILITY AND FITNESS, IN NO EVENT SHALL EVANS & SUTHERLAND OR **/ +/** M.I.T. BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAM- **/ +/** AGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA **/ +/** OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER **/ +/** TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE **/ +/** OR PERFORMANCE OF THIS SOFTWARE. **/ +/*****************************************************************************/ +/* + * [ ctwm ] + * + * Copyright 1992 Claude Lecommandeur. + * + * Permission to use, copy, modify and distribute this software [ctwm] and + * its documentation for any purpose is hereby granted without fee, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting documen- + * tation, and that the name of Claude Lecommandeur not be used in adverti- + * sing or publicity pertaining to distribution of the software without + * specific, written prior permission. Claude Lecommandeur make no represen- + * tations about the suitability of this software for any purpose. It is + * provided "as is" without express or implied warranty. + * + * Claude Lecommandeur DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO + * EVENT SHALL Claude Lecommandeur BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF + * USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR + * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + * + * Author: Claude Lecommandeur [ lecom@sic.epfl.ch ][ April 1992 ] + */ + + +/********************************************************************** + * + * $XConsortium: parse.h,v 1.14 89/12/14 14:51:25 jim Exp $ + * + * .twmrc parsing externs + * + * 8-Apr-88 Tom LaStrange Initial Version. + * + **********************************************************************/ + +#include "types.h" +#include "gram.tab.h" + +#ifndef _PARSE_ +#define _PARSE_ + +extern int ParseTwmrc(char *filename); +extern int ParseStringList(char **sl); +extern int (*twmInputFunc)(void); +extern void twmUnput(int c); +extern void TwmOutput(int c); + +#define F_NOP 0 +#define F_BEEP 1 +#define F_RESTART 2 +#define F_QUIT 3 +#define F_FOCUS 4 +#define F_REFRESH 5 +#define F_WINREFRESH 6 +#define F_DELTASTOP 7 +#define F_MOVE 8 +#define F_POPUP 9 +#define F_FORCEMOVE 10 +#define F_AUTORAISE 11 +#define F_IDENTIFY 12 +#define F_ICONIFY 13 +#define F_DEICONIFY 14 +#define F_UNFOCUS 15 +#define F_RESIZE 16 +#define F_ZOOM 17 +#define F_LEFTZOOM 18 +#define F_RIGHTZOOM 19 +#define F_TOPZOOM 20 +#define F_BOTTOMZOOM 21 +#define F_HORIZOOM 22 +#define F_FULLZOOM 23 +#define F_RAISE 24 +#define F_RAISELOWER 25 +#define F_LOWER 26 +#define F_DESTROY 27 +#define F_DELETE 28 +#define F_SAVEYOURSELF 29 +#define F_VERSION 30 +#define F_TITLE 31 +#define F_RIGHTICONMGR 32 +#define F_LEFTICONMGR 33 +#define F_UPICONMGR 34 +#define F_DOWNICONMGR 35 +#define F_FORWICONMGR 36 +#define F_BACKICONMGR 37 +#define F_NEXTICONMGR 38 +#define F_PREVICONMGR 39 +#define F_SORTICONMGR 40 +#define F_CIRCLEUP 41 +#define F_CIRCLEDOWN 42 +#define F_CUTFILE 43 +#define F_SHOWLIST 44 +#define F_HIDELIST 45 +#define F_OCCUPY 46 +#define F_OCCUPYALL 47 +#define F_SHOWWORKMGR 48 +#define F_HIDEWORKMGR 49 +#define F_SETBUTTONSTATE 50 +#define F_SETMAPSTATE 51 +#define F_TOGGLESTATE 52 +#define F_PIN 53 +#define F_MOVEMENU 54 +#define F_VANISH 55 +#define F_NEXTWORKSPACE 56 +#define F_PREVWORKSPACE 57 +#define F_SEPARATOR 58 +#define F_ADOPTWINDOW 59 +#define F_STARTANIMATION 60 +#define F_STOPANIMATION 61 +#define F_SPEEDUPANIMATION 62 +#define F_SLOWDOWNANIMATION 63 +#ifdef SOUNDS +#define F_TOGGLESOUND 64 +#define F_REREADSOUNDS 65 +#endif +#define F_TRACE 66 +#define F_WINWARP 67 +#define F_ALTCONTEXT 68 +#define F_LEFTWORKSPACE 69 +#define F_RIGHTWORKSPACE 70 +#define F_UPWORKSPACE 71 +#define F_DOWNWORKSPACE 72 +#define F_RAISEICONS 73 +#define F_MOVEPACK 74 +#define F_MOVEPUSH 75 +#define F_DELETEORDESTROY 76 +#define F_SQUEEZE 77 +#define F_FORWMAPICONMGR 78 +#define F_BACKMAPICONMGR 79 +#define F_SAVEGEOMETRY 80 +#define F_RESTOREGEOMETRY 81 +#define F_TOGGLEWORKMGR 82 +#define F_HYPERMOVE 83 +#define F_INITSIZE 84 +#define F_RING 85 +#define F_AUTOLOWER 86 +#define F_FITTOCONTENT 87 +#define F_SHOWBGRD 88 + + +#define F_MENU 101 /* string */ +#define F_WARPTO 102 /* string */ +#define F_WARPTOICONMGR 103 /* string */ +#define F_WARPRING 104 /* string */ +#define F_FILE 105 /* string */ +#define F_EXEC 106 /* string */ +#define F_CUT 107 /* string */ +#define F_FUNCTION 108 /* string */ +#define F_WARPTOSCREEN 109 /* string */ +#define F_COLORMAP 110 /* string */ +#define F_GOTOWORKSPACE 111 /* string */ +#define F_WARPHERE 112 /* string */ +#define F_ALTKEYMAP 113 /* string */ +#define F_ADDTOWORKSPACE 114 /* string */ +#define F_REMOVEFROMWORKSPACE 115 /* string */ +#define F_TOGGLEOCCUPATION 116 /* string */ +#define F_PACK 117 /* string */ +#define F_FILL 118 /* string */ +#define F_JUMPRIGHT 119 /* string */ +#define F_JUMPLEFT 120 /* string */ +#define F_JUMPUP 121 /* string */ +#define F_JUMPDOWN 122 /* string */ +#define F_MOVERESIZE 123 /* string */ +#define F_MOVETONEXTWORKSPACE 124 +#define F_MOVETOPREVWORKSPACE 125 +#define F_MOVETONEXTWORKSPACEANDFOLLOW 126 +#define F_MOVETOPREVWORKSPACEANDFOLLOW 127 +#define F_CHANGESIZE 128 /* string */ +#define F_MOVETITLEBAR 129 + +#define D_NORTH 1 +#define D_SOUTH 2 +#define D_EAST 3 +#define D_WEST 4 + +int ParseJustification (register char *s); +int ParseAlignement (register char *s); + +int parse_keyword (char *s, int *nump); + +int do_single_keyword(int keyword); +int do_string_keyword(int keyword, char *s); +int do_string_string_keyword(int keyword, char *s1, char *s2); +int do_number_keyword(int keyword, int num); +name_list **do_colorlist_keyword(int keyword, int colormode, char *s); +int do_color_keyword(int keyword, int colormode, char *s); +int do_string_savecolor(int colormode, char *s); +int do_var_savecolor(int key); +void assign_var_savecolor(void); +int do_squeeze_entry(name_list **list, /* squeeze or dont-squeeze list */ + char *name, /* window name */ + int justify, /* left, center, right */ + int num, /* signed num */ + int denom /* 0 or indicates fraction denom */ + ); +int twmrc_lineno; + +#endif /* _PARSE_ */ Index: external/mit/ctwm/dist/peterc.ctwmrc =================================================================== RCS file: external/mit/ctwm/dist/peterc.ctwmrc diff -N external/mit/ctwm/dist/peterc.ctwmrc --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/peterc.ctwmrc 3 Sep 2015 12:19:58 -0000 @@ -0,0 +1,378 @@ +#**************** +# ctwm.rc +#**************** + +PixmapDirectory "MPHA7$USER1:[THEORY.PETERC.XPM.ctwmicons]" +NoDefaults +#NoVersion +NoGrabServer +#NoRaiseOnMove +#NoRaiseOnResize +NoMenuShadows +NoTitleHighlight +#NoHighlight +#NoTitleFocus +NoSaveUnders +DontSqueezeTitle +ConstrainedMoveTime 300 +DecorateTransients +Zoom +#TitleButtonBorderWidth 0 +#ButtonIndent 2 +LeftTitleButton ":xpm:bar" = f.menu "titleops" +RightTitleButton ":xpm:dot" = f.iconify +RightTitleButton "%xpm:resize" = f.resize +#OpaqueMove +#ClientBorderWidth +RaiseDelay 700 +#BorderWidth 3 +RandomPlacement +IconRegion "150x500-0-0" North West 75 70 +IconRegion "320x200-0-500" North West 160 70 +UsePPosition "on" +UseThreeDIconManagers +UseThreeDMenus +UseThreeDTitles +SunkFocusWindowTitle +#BeNiceToColormap +#ClearShadowContrast 25 +#DarkShadowContrast 75 +AnimationSpeed 3 +MaxIconTitleWidth 500 +BorderWidth 5 +UseThreeDBorders +NoTitleHighlight + +NoShowOccupyAll +AutoOccupy +MapWindowCurrentWorkSpace {"Red" "SkyBlue" "Blue" +"mphv2$user2:[peterc.x]ants.xbm"} + + +TitleFont "-*-helvetica-bold-o-normal--*-140-*-*-*-*-iso8859-1" +MenuFont "-*-helvetica-bold-r-normal--*-140-*-*-*-*-iso8859-1" +IconFont "-*-helvetica-bold-r-normal--*-140-*-*-*-*-iso8859-1" +ResizeFont "-*-helvetica-bold-r-normal--*-120-*-*-*-*-iso8859-1" +IconManagerFont "-*-helvetica-bold-r-normal--*-120-*-*-*-*-iso8859-1" +ShowIconManager +SortIconManager +IconManagerGeometry "200x100-0+0" + +ShowWorkSpaceManager +StartInMapState +workspacemanagergeometry "523x111-0-0" 4 +WorkSpaces { + "One" {"grey" "black" "DeepSkyBlue3" "Wheat" + "mphv2$user2:[peterc.x]pf.xbm" } + "Two" {"grey" "white" "Wheat" "LightCoral" + "mphv2$user2:[peterc.x]votes.xbm" } + "Three" {"grey" "white" "Wheat" "Sienna" + "mphv2$user2:[peterc.x]eight.xbm" } + "Four" {"grey" "white" "Wheat" "OliveDrab" + "mphv2$user2:[peterc.x]tiger.xbm" } +} + + +# nice colors: background of wheat, foreground of #d36 + +Cursors +{ + Frame "left_ptr" + Title "left_ptr" + Icon "left_ptr" + IconMgr "left_ptr" + Move "fleur" + Resize "sizing" + Menu "X_cursor" + Button "left_ptr" + Wait "clock" + Select "target" + Destroy "pirate" +} + +Color +{ + BorderColor "Black" + BorderTileBackground "Wheat" + TitleBackground "SteelBlue" + TitleForeground "Black" + MenuBackground "Wheat" + MenuForeground "Black" + MenuTitleBackground "SteelBlue" + MenuTitleForeground "Black" + IconBackground "LightBlue" + IconForeground "Black" + IconBorderColor "Wheat" + IconManagerBackground "LightGray" + IconManagerForeground "Black" + IconManagerHighlight "Wheat" + MapWindowBackground "Khaki" + MapWindowForeground "Black" +} + + +Monochrome +{ + MapWindowBackground "white" + MapWindowForeground "black" + IconManagerHighlight "black" +} + + +ForceIcons + +NoTitle +{ + "WorkSpaceManager" + "TWM Icon Manager" +} + +UnknownIcon "xpm:nothing.xpm" + +Icons +{ + "XTerm" "xpm:xterm.xpm" + "DECW$TERMINAL" "xpm:term.xpm" + "DECW$CALC" "xpm:xcalc.xpm" + "HPterm" "xpm:hpterm.xpm" + "Emacs" "xpm:emacs.xpm" + "XJed" "xpm:xedit.xpm" + "Tpu" "xpm:xedit.xpm" +# "VUE$MASTER" "xpm:peter.xpm" + "VUE$MASTER" "xpm:ball%.xpm" + "Ghostview" "xpm:ghostview.xpm" + "ApplicationShell" "xpm:cdrom1.xpm" + "Mosaic" "xpm:xmosaic.xpm" +# "MXRN" "xpm:xrn.xpm" +# "" "xpm:.xpm" +} + +WindowRing # f.warpring acts along these windows +{ + "XTerm" + "DECW$TERMINAL" + "HPterm" + "Emacs" + "XJed" + "Tpu" + "Ved" +} + +AutoRaise +{ +"Untitled" +} + +NoTitle +{ + "Clock" + "XDaliClock" +} + +OccupyAll +{ + "Clock" + "XDaliClock" +} + +IconManagerDontShow { + "WorkSpaceManager" + "Clock" + "XDaliClock" +} + +# define key bindings + +MoveDelta 3 + +Function "move-or-raise" +{ + f.move + f.deltastop + f.raise +} + +Function "raise-n-focus" +{ + f.raise +} + +Function "raise-or-resize" +{ + f.raise + f.deltastop + f.resize +} + +Function "move-or-raiselower" +{ + f.move + f.deltastop + f.raiselower +} + +Function "move-or-iconify" +{ + f.move + f.deltastop + f.iconify +} + +DefaultFunction f.nop + +Button1 = : title : f.function "move-or-raise" +Button2 = : title : f.menu "TMenu" +Button3 = : title : f.resize +Button1 = : frame : f.function "raise-or-resize" +Button2 = : frame : f.function "move-or-raise" +Button1 = : icon : f.function "move-or-iconify" +Button2 = : icon : f.iconify +Button1 = : iconmgr : f.iconify +Button1 = : root : f.menu "ctwmops" +Button2 = : root : f.menu "windowops" +Button3 = : root : f.menu "DECstuff" +"F4" = s : window : f.destroy +"F5" = : all : f.warpring "next" +"F7" = : window|icon : f.function "raise-n-focus" +"F9" = : icon|iconmgr : f.iconify +"F10" = s : window : f.vanish +"F11" = : all : f.prevworkspace +"F12" = : all : f.nextworkspace +"F11" = s : all : f.prevworkspace +"F12" = s : all : f.nextworkspace +#"Up" = s|c : all : f.upiconmgr +#"Down" = s|c : all : f.downiconmgr + +menu "TMenu" { + "Title Menu" f.title + "Iconify" f.iconify + "" f.separator + "Occupy" f.occupy + "Occupy all" f.occupyall +} + +menu "ctwmops" +{ + "PeterC" f.title + "DECterm" !"create/terminal/nobroadcast/detach DECterm" + "Eve" !"edit/tpu/display=DECwindows/init=MPHV2$USER2:[PETERC.C]PREF.EWE" + "Xterm" !"xterm -j -rw -s -sb -ah -sl 512" + "Xterm (small)" !"xterm -fn fixed -fb fixed -j -rw -s -sb -ah -sl 512" +# "News" !"mxrn" +# "HH" f.menu "hh" + "" f.separator + "More stuff" f.menu "DECstuff" + "Workspace ops" f.menu "workspace" + "Animation" f.menu "Anim" + "" f.separator + "Pause" !"run sys$system:decw$pausesession" + "" f.separator + "" f.nop + "" f.separator + "Exit CTwm" f.quit +} + +menu "windowops" +{ + "Windows" f.title + "Pin menu" f.pin + "Kill" f.menu "Kill" + "Save" f.saveyourself + "Refresh All" f.refresh + "Refresh" f.winrefresh + "Occupy" f.occupy + "Occupy All" f.occupyall + "Vanish" f.vanish + "" f.separator + "Iconify" f.iconify + "Resize" f.resize + "RaiseLower" f.raiselower + "Move" f.move + "Raise" f.raise + "Lower" f.lower + "Info" f.identify + "Focus" f.focus + "Unfocus" f.unfocus + "Animation" f.menu "Anim" + "Zoom" f.menu "Zoom" +} + +menu "DECstuff" +{ + "Odds and Ends" f.title + "CD Player" !"@decw$examples:decw$cdplayer.com" + "Calculator" !"run sys$system:decw$calc" + "DECterm" !"create/terminal/detatch DECTERM" + "Editor" !"edit/tpu/display=DECwindows" + "Fileview" !"run sys$system:vue$master" + "Mail" !"run sys$system:decw$mail" + "Paint" !"run sys$system:decw$paint" + "XMosaic" !"xmosaic" + "Xterm" !"xterm -j -rw -s -sb -ah -sl 512" + "Xv" !"run manc$x11:xv" + "" f.separator + "Games" f.menu "games" +} + +menu "Kill" +{ + "Pin menu" f.pin + "Kill Window" f.destroy + "Send Delete" f.delete +} + +menu "games" +{ + "Games" f.title + "Puzzle" !"run sys$system:decw$puzzle" + "Xchomp" !"run manc$x11:xchomp" + "Xroach" !"@manc$x11:xroach" +} + +menu "workspace" +{ + "Show Icon Box" f.showiconmgr + "Hide Icon Box" f.hideiconmgr + "" f.separator + "Toggle Manager" f.togglestate + "Show Manager" f.showworkspacemgr + "Hide Manager" f.hideworkspacemgr + "" f.separator + "Occupy" f.occupy + "Occupy all" f.occupyall +} + +menu "Zoom" { + "Full" f.fullzoom + "Horizontal" f.horizoom + "Vertical" f.zoom + "Left" f.leftzoom + "Top" f.topzoom + "Right" f.rightzoom + "Bottom" f.bottomzoom +} + +menu "Anim" { + "Start" f.startanimation + "Stop" f.stopanimation + "Faster" f.speedupanimation + "Slower" f.slowdownanimation +} + +menu "titleops" +{ + "Title Bar" f.title + "RaiseLower" f.raiselower + "Iconify" f.iconify + "Info" f.identify + "Focus" f.focus + "Unfocus" f.unfocus + "Refresh" f.winrefresh + "Occupy" f.occupy + "Occupy All" f.occupyall + "Vanish" f.vanish + "" f.separator + "Send Delete" f.delete + "Kill Window" f.destroy + "Zoom" f.menu "Zoom" +} Index: external/mit/ctwm/dist/resize.c =================================================================== RCS file: external/mit/ctwm/dist/resize.c diff -N external/mit/ctwm/dist/resize.c --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/resize.c 3 Sep 2015 12:19:59 -0000 @@ -0,0 +1,1526 @@ +/*****************************************************************************/ +/** Copyright 1988 by Evans & Sutherland Computer Corporation, **/ +/** Salt Lake City, Utah **/ +/** Portions Copyright 1989 by the Massachusetts Institute of Technology **/ +/** Cambridge, Massachusetts **/ +/** **/ +/** All Rights Reserved **/ +/** **/ +/** Permission to use, copy, modify, and distribute this software and **/ +/** its documentation for any purpose and without fee is hereby **/ +/** granted, provided that the above copyright notice appear in all **/ +/** copies and that both that copyright notice and this permis- **/ +/** sion notice appear in supporting documentation, and that the **/ +/** names of Evans & Sutherland and M.I.T. not be used in advertising **/ +/** in publicity pertaining to distribution of the software without **/ +/** specific, written prior permission. **/ +/** **/ +/** EVANS & SUTHERLAND AND M.I.T. DISCLAIM ALL WARRANTIES WITH REGARD **/ +/** TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANT- **/ +/** ABILITY AND FITNESS, IN NO EVENT SHALL EVANS & SUTHERLAND OR **/ +/** M.I.T. BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAM- **/ +/** AGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA **/ +/** OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER **/ +/** TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE **/ +/** OR PERFORMANCE OF THIS SOFTWARE. **/ +/*****************************************************************************/ +/* + * [ ctwm ] + * + * Copyright 1992 Claude Lecommandeur. + * + * Permission to use, copy, modify and distribute this software [ctwm] and + * its documentation for any purpose is hereby granted without fee, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting documen- + * tation, and that the name of Claude Lecommandeur not be used in adverti- + * sing or publicity pertaining to distribution of the software without + * specific, written prior permission. Claude Lecommandeur make no represen- + * tations about the suitability of this software for any purpose. It is + * provided "as is" without express or implied warranty. + * + * Claude Lecommandeur DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO + * EVENT SHALL Claude Lecommandeur BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF + * USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR + * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + * + * Author: Claude Lecommandeur [ lecom@sic.epfl.ch ][ April 1992 ] + */ + + +/*********************************************************************** + * + * $XConsortium: resize.c,v 1.80 91/05/11 17:35:42 dave Exp $ + * + * window resizing borrowed from the "wm" window manager + * + * 11-Dec-87 Thomas E. LaStrange File created + * + * Do the necessary modification to be integrated in ctwm. + * Can no longer be used for the standard twm. + * + * 22-April-92 Claude Lecommandeur. + * + * + ***********************************************************************/ + +#include +#include +#include "twm.h" +#include "parse.h" +#include "events.h" +#include "util.h" +#include "resize.h" +#include "add_window.h" +#include "screen.h" + +#define MINHEIGHT 0 /* had been 32 */ +#define MINWIDTH 0 /* had been 60 */ + +static int dragx; /* all these variables are used */ +static int dragy; /* in resize operations */ +static unsigned int dragWidth; +static unsigned int dragHeight; + +static int origx; +static int origy; +static int origWidth; +static int origHeight; + +static int clampTop; +static int clampBottom; +static int clampLeft; +static int clampRight; +static int clampDX; +static int clampDY; + +static int last_width; +static int last_height; + +static unsigned int resizeGrabMask; + +extern Cursor TopRightCursor, TopLeftCursor, BottomRightCursor, BottomLeftCursor, + LeftCursor, RightCursor, TopCursor, BottomCursor; + +static void do_auto_clamp (TwmWindow *tmp_win, XEvent *evp) +{ + Window junkRoot; + int x, y, h, v, junkbw; + unsigned int junkMask; + + switch (evp->type) { + case ButtonPress: + x = evp->xbutton.x_root; + y = evp->xbutton.y_root; + break; + case KeyPress: + x = evp->xkey.x_root; + y = evp->xkey.y_root; + break; + default: + if (!XQueryPointer (dpy, Scr->Root, &junkRoot, &junkRoot, + &x, &y, &junkbw, &junkbw, &junkMask)) + return; + } + + /* + * Determine in which of the 9 "quadrants" of the window we are. + * Cast the values to signed int: if the numerator is negative + * we don't want them converted to unsigned due to the default + * promotion rules: that would produce a very large quotient. + */ + h = (int)(x - dragx) / (int)(dragWidth < 3 ? 1 : (dragWidth / 3)); + v = (int)(y - dragy - tmp_win->title_height) / + (int)(dragHeight < 3 ? 1 : (dragHeight / 3)); + + if (h <= 0) { + clampLeft = 1; + clampDX = (x - dragx); + } else if (h >= 2) { + clampRight = 1; + clampDX = (x - dragx - dragWidth); + } + + if (v <= 0) { + clampTop = 1; + clampDY = (y - dragy); + } else if (v >= 2) { + clampBottom = 1; + clampDY = (y - dragy - dragHeight); + } +} + + +/*********************************************************************** + * + * Procedure: + * StartResize - begin a window resize operation + * + * Inputs: + * ev - the event structure (button press) + * tmp_win - the TwmWindow pointer + * fromtitlebar - action invoked from titlebar button + * + *********************************************************************** + */ + +void StartResize(XEvent *evp, TwmWindow *tmp_win, + Bool fromtitlebar, Bool from3dborder) +{ + Window junkRoot, grabwin; + unsigned int junkbw, junkDepth; + Cursor cursor; + + cursor = (Scr->BorderCursors && tmp_win->curcurs) ? tmp_win->curcurs : Scr->ResizeCursor; + ResizeWindow = tmp_win->frame; + if (! Scr->OpaqueResize || resizeWhenAdd) XGrabServer(dpy); + resizeGrabMask = ButtonPressMask | ButtonReleaseMask | + ButtonMotionMask | PointerMotionHintMask; + + grabwin = Scr->Root; + if (tmp_win->winbox) grabwin = tmp_win->winbox->window; + XGrabPointer(dpy, grabwin, True, resizeGrabMask, + GrabModeAsync, GrabModeAsync, grabwin, cursor, CurrentTime); + + XGetGeometry(dpy, (Drawable) tmp_win->frame, &junkRoot, + &dragx, &dragy, &dragWidth, &dragHeight, &junkbw, + &junkDepth); + dragx += tmp_win->frame_bw; + dragy += tmp_win->frame_bw; + origx = dragx; + origy = dragy; + origWidth = dragWidth; + origHeight = dragHeight; + clampTop = clampBottom = clampLeft = clampRight = clampDX = clampDY = 0; + + if (Scr->AutoRelativeResize && (from3dborder || !fromtitlebar)) + do_auto_clamp (tmp_win, evp); + + Scr->SizeStringOffset = SIZE_HINDENT; + XResizeWindow (dpy, Scr->SizeWindow, + Scr->SizeStringWidth + SIZE_HINDENT * 2, + Scr->SizeFont.height + SIZE_VINDENT * 2); + XMapRaised(dpy, Scr->SizeWindow); + InstallRootColormap(); + last_width = 0; + last_height = 0; + DisplaySize(tmp_win, origWidth, origHeight); + + if (! Scr->OpaqueResize || resizeWhenAdd) + MoveOutline (Scr->Root, dragx - tmp_win->frame_bw, + dragy - tmp_win->frame_bw, dragWidth + 2 * tmp_win->frame_bw, + dragHeight + 2 * tmp_win->frame_bw, + tmp_win->frame_bw, tmp_win->title_height + tmp_win->frame_bw3D); +} + + + +void MenuStartResize(TwmWindow *tmp_win, int x, int y, int w, int h) +{ + if (! Scr->OpaqueResize) XGrabServer(dpy); + resizeGrabMask = ButtonPressMask | ButtonMotionMask | PointerMotionMask; + XGrabPointer(dpy, Scr->Root, True, resizeGrabMask, + GrabModeAsync, GrabModeAsync, + Scr->Root, Scr->ResizeCursor, CurrentTime); + dragx = x + tmp_win->frame_bw; + dragy = y + tmp_win->frame_bw; + origx = dragx; + origy = dragy; + dragWidth = origWidth = w; /* - 2 * tmp_win->frame_bw; */ + dragHeight = origHeight = h; /* - 2 * tmp_win->frame_bw; */ + clampTop = clampBottom = clampLeft = clampRight = clampDX = clampDY = 0; + last_width = 0; + last_height = 0; + Scr->SizeStringOffset = SIZE_HINDENT; + XResizeWindow (dpy, Scr->SizeWindow, + Scr->SizeStringWidth + SIZE_HINDENT * 2, + Scr->SizeFont.height + SIZE_VINDENT * 2); + XMapRaised(dpy, Scr->SizeWindow); + DisplaySize(tmp_win, origWidth, origHeight); + if (! Scr->OpaqueResize) + MoveOutline (Scr->Root, dragx - tmp_win->frame_bw, + dragy - tmp_win->frame_bw, + dragWidth + 2 * tmp_win->frame_bw, + dragHeight + 2 * tmp_win->frame_bw, + tmp_win->frame_bw, tmp_win->title_height + tmp_win->frame_bw3D); +} + +/*********************************************************************** + * + * Procedure: + * AddStartResize - begin a windorew resize operation from AddWindow + * + * Inputs: + * tmp_win - the TwmWindow pointer + * + *********************************************************************** + */ + +void AddStartResize(TwmWindow *tmp_win, int x, int y, int w, int h) +{ + XGrabServer(dpy); + resizeGrabMask = ButtonReleaseMask | ButtonMotionMask | PointerMotionHintMask; + XGrabPointer(dpy, Scr->Root, True, resizeGrabMask, + GrabModeAsync, GrabModeAsync, + Scr->Root, Scr->ResizeCursor, CurrentTime); + + dragx = x + tmp_win->frame_bw; + dragy = y + tmp_win->frame_bw; + origx = dragx; + origy = dragy; + dragWidth = origWidth = w - 2 * tmp_win->frame_bw; + dragHeight = origHeight = h - 2 * tmp_win->frame_bw; + clampTop = clampBottom = clampLeft = clampRight = clampDX = clampDY = 0; +/***** + if (Scr->AutoRelativeResize) { + clampRight = clampBottom = 1; + } +*****/ + last_width = 0; + last_height = 0; + DisplaySize(tmp_win, origWidth, origHeight); +} + + + +void MenuDoResize(int x_root, int y_root, TwmWindow *tmp_win) +{ + int action; + Cursor cursor = 0; + + action = 0; + + x_root -= clampDX; + y_root -= clampDY; + + if (clampTop) { + int delta = y_root - dragy; + if ((int)(dragHeight - delta) < MINHEIGHT) { + delta = dragHeight - MINHEIGHT; + clampTop = 0; + } + dragy += delta; + dragHeight -= delta; + action = 1; + cursor = TopCursor; + } + else if (y_root <= dragy/* || + y_root == findRootInfo(root)->rooty*/) { + dragy = y_root; + dragHeight = origy + origHeight - + y_root; + clampBottom = 0; + clampTop = 1; + clampDY = 0; + action = 1; + cursor = TopCursor; + } + if (clampLeft) { + int delta = x_root - dragx; + if ((int)(dragWidth - delta) < MINWIDTH) { + delta = dragWidth - MINWIDTH; + clampLeft = 0; + } + dragx += delta; + dragWidth -= delta; + action = 1; + cursor = clampTop ? TopLeftCursor : LeftCursor; + } + else if (x_root <= dragx/* || + x_root == findRootInfo(root)->rootx*/) { + dragx = x_root; + dragWidth = origx + origWidth - + x_root; + clampRight = 0; + clampLeft = 1; + clampDX = 0; + action = 1; + cursor = clampTop ? TopLeftCursor : LeftCursor; + } + if (clampBottom) { + int delta = y_root - dragy - dragHeight; + if ((int)(dragHeight + delta) < MINHEIGHT) { + delta = MINHEIGHT - dragHeight; + clampBottom = 0; + } + dragHeight += delta; + action = 1; + cursor = clampLeft ? BottomLeftCursor : BottomCursor; + } + else if (y_root >= dragy + dragHeight) { + dragy = origy; + dragHeight = 1 + y_root - dragy; + clampTop = 0; + clampBottom = 1; + clampDY = 0; + action = 1; + cursor = clampLeft ? BottomLeftCursor : BottomCursor; + } + if (clampRight) { + int delta = x_root - dragx - dragWidth; + if ((int)(dragWidth + delta) < MINWIDTH) { + delta = MINWIDTH - dragWidth; + clampRight = 0; + } + dragWidth += delta; + action = 1; + cursor = clampBottom ? BottomRightCursor : RightCursor; + cursor = clampTop ? TopRightCursor : cursor; + } + else if (x_root >= dragx + dragWidth) { + dragx = origx; + dragWidth = 1 + x_root - origx; + clampLeft = 0; + clampRight = 1; + clampDX = 0; + action = 1; + cursor = clampBottom ? BottomRightCursor : RightCursor; + cursor = clampTop ? TopRightCursor : cursor; + } + + if (action) { + ConstrainSize (tmp_win, &dragWidth, &dragHeight); + if (clampLeft) + dragx = origx + origWidth - dragWidth; + if (clampTop) + dragy = origy + origHeight - dragHeight; + if (Scr->OpaqueResize) + SetupWindow (tmp_win, dragx - tmp_win->frame_bw, dragy - tmp_win->frame_bw, + dragWidth, dragHeight, -1); + else + MoveOutline(Scr->Root, + dragx - tmp_win->frame_bw, + dragy - tmp_win->frame_bw, + dragWidth + 2 * tmp_win->frame_bw, + dragHeight + 2 * tmp_win->frame_bw, + tmp_win->frame_bw, tmp_win->title_height + tmp_win->frame_bw3D); + if (Scr->BorderCursors && (cursor != tmp_win->curcurs)) { + tmp_win->curcurs = cursor; + XChangeActivePointerGrab (dpy, resizeGrabMask, cursor, CurrentTime); + } + } + + DisplaySize(tmp_win, dragWidth, dragHeight); +} + +/*********************************************************************** + * + * Procedure: + * DoResize - move the rubberband around. This is called for + * each motion event when we are resizing + * + * Inputs: + * x_root - the X corrdinate in the root window + * y_root - the Y corrdinate in the root window + * tmp_win - the current twm window + * + *********************************************************************** + */ + +void DoResize(int x_root, int y_root, TwmWindow *tmp_win) +{ + int action; + Cursor cursor = 0; + + action = 0; + + x_root -= clampDX; + y_root -= clampDY; + + if (clampTop) { + int delta = y_root - dragy; + if ((int)(dragHeight - delta) < MINHEIGHT) { + delta = dragHeight - MINHEIGHT; + clampTop = 0; + } + dragy += delta; + dragHeight -= delta; + action = 1; + cursor = TopCursor; + } + else if (y_root <= dragy/* || + y_root == findRootInfo(root)->rooty*/) { + dragy = y_root; + dragHeight = origy + origHeight - + y_root; + clampBottom = 0; + clampTop = 1; + clampDY = 0; + action = 1; + cursor = TopCursor; + } + if (clampLeft) { + int delta = x_root - dragx; + if ((int)(dragWidth - delta) < MINWIDTH) { + delta = dragWidth - MINWIDTH; + clampLeft = 0; + } + dragx += delta; + dragWidth -= delta; + action = 1; + cursor = clampTop ? TopLeftCursor : LeftCursor; + } + else if (x_root <= dragx/* || + x_root == findRootInfo(root)->rootx*/) { + dragx = x_root; + dragWidth = origx + origWidth - + x_root; + clampRight = 0; + clampLeft = 1; + clampDX = 0; + action = 1; + cursor = clampTop ? TopLeftCursor : LeftCursor; + } + if (clampBottom) { + int delta = y_root - dragy - dragHeight; + if ((int)(dragHeight + delta) < MINHEIGHT) { + delta = MINHEIGHT - dragHeight; + clampBottom = 0; + } + dragHeight += delta; + action = 1; + cursor = clampLeft ? BottomLeftCursor : BottomCursor; + } + else if (y_root >= dragy + dragHeight - 1/* || + y_root == findRootInfo(root)->rooty + + findRootInfo(root)->rootheight - 1*/) { + dragy = origy; + dragHeight = 1 + y_root - dragy; + clampTop = 0; + clampBottom = 1; + clampDY = 0; + action = 1; + cursor = clampLeft ? BottomLeftCursor : BottomCursor; + } + if (clampRight) { + int delta = x_root - dragx - dragWidth; + if ((int)(dragWidth + delta) < MINWIDTH) { + delta = MINWIDTH - dragWidth; + clampRight = 0; + } + dragWidth += delta; + action = 1; + cursor = clampBottom ? BottomRightCursor : RightCursor; + cursor = clampTop ? TopRightCursor : cursor; + } + else if (x_root >= dragx + dragWidth - 1/* || + x_root == findRootInfo(root)->rootx + + findRootInfo(root)->rootwidth - 1*/) { + dragx = origx; + dragWidth = 1 + x_root - origx; + clampLeft = 0; + clampRight = 1; + clampDX = 0; + action = 1; + cursor = clampBottom ? BottomRightCursor : RightCursor; + cursor = clampTop ? TopRightCursor : cursor; + } + + if (action) { + ConstrainSize (tmp_win, &dragWidth, &dragHeight); + if (clampLeft) + dragx = origx + origWidth - dragWidth; + if (clampTop) + dragy = origy + origHeight - dragHeight; + if (Scr->OpaqueResize && ! resizeWhenAdd) + SetupWindow (tmp_win, dragx - tmp_win->frame_bw, dragy - tmp_win->frame_bw, + dragWidth, dragHeight, -1); + else + MoveOutline(Scr->Root, + dragx - tmp_win->frame_bw, + dragy - tmp_win->frame_bw, + dragWidth + 2 * tmp_win->frame_bw, + dragHeight + 2 * tmp_win->frame_bw, + tmp_win->frame_bw, tmp_win->title_height + tmp_win->frame_bw3D); + if (Scr->BorderCursors && (cursor != tmp_win->curcurs)) { + tmp_win->curcurs = cursor; + XChangeActivePointerGrab (dpy, resizeGrabMask, cursor, CurrentTime); + } + } + + DisplaySize(tmp_win, dragWidth, dragHeight); +} + +/*********************************************************************** + * + * Procedure: + * DisplaySize - display the size in the dimensions window + * + * Inputs: + * tmp_win - the current twm window + * width - the width of the rubber band + * height - the height of the rubber band + * + *********************************************************************** + */ + +void DisplaySize(TwmWindow *tmp_win, int width, int height) +{ + char str[100]; + int dwidth; + int dheight; + + if (last_width == width && last_height == height) + return; + + last_width = width; + last_height = height; + + dheight = height - tmp_win->title_height - 2 * tmp_win->frame_bw3D; + dwidth = width - 2 * tmp_win->frame_bw3D; + + /* + * ICCCM says that PMinSize is the default is no PBaseSize is given, + * and vice-versa. + */ + if (tmp_win->hints.flags&(PMinSize|PBaseSize) && tmp_win->hints.flags & PResizeInc) + { + if (tmp_win->hints.flags & PBaseSize) { + dwidth -= tmp_win->hints.base_width; + dheight -= tmp_win->hints.base_height; + } else { + dwidth -= tmp_win->hints.min_width; + dheight -= tmp_win->hints.min_height; + } + } + + if (tmp_win->hints.flags & PResizeInc) + { + dwidth /= tmp_win->hints.width_inc; + dheight /= tmp_win->hints.height_inc; + } + + (void) sprintf (str, " %4d x %-4d ", dwidth, dheight); + XRaiseWindow(dpy, Scr->SizeWindow); + + Draw3DBorder (Scr->SizeWindow, 0, 0, + Scr->SizeStringOffset + Scr->SizeStringWidth + SIZE_HINDENT, + Scr->SizeFont.height + SIZE_VINDENT * 2, + 2, Scr->DefaultC, off, False, False); + + FB(Scr->DefaultC.fore, Scr->DefaultC.back); + XmbDrawImageString (dpy, Scr->SizeWindow, Scr->SizeFont.font_set, + Scr->NormalGC, Scr->SizeStringOffset, + Scr->SizeFont.ascent + SIZE_VINDENT, str, 13); +} + +/*********************************************************************** + * + * Procedure: + * EndResize - finish the resize operation + * + *********************************************************************** + */ + +void EndResize(void) +{ + TwmWindow *tmp_win; + +#ifdef DEBUG + fprintf(stderr, "EndResize\n"); +#endif + + MoveOutline(Scr->Root, 0, 0, 0, 0, 0, 0); + XUnmapWindow(dpy, Scr->SizeWindow); + + tmp_win = GetTwmWindow(ResizeWindow); + if (!tmp_win) return; + + ConstrainSize (tmp_win, &dragWidth, &dragHeight); + + if (dragWidth != tmp_win->frame_width || + dragHeight != tmp_win->frame_height) + tmp_win->zoomed = ZOOM_NONE; + + SetupWindow (tmp_win, dragx - tmp_win->frame_bw, dragy - tmp_win->frame_bw, + dragWidth, dragHeight, -1); + + if (tmp_win->iconmgr) + { + int ncols = tmp_win->iconmgrp->cur_columns; + if (ncols == 0) ncols = 1; + + tmp_win->iconmgrp->width = (int) (((dragWidth - 2 * tmp_win->frame_bw3D) * + (long) tmp_win->iconmgrp->columns) + / ncols); + PackIconManager(tmp_win->iconmgrp); + } + + if (!Scr->NoRaiseResize) { + RaiseWindow(tmp_win); + WMapRaise (tmp_win); + } + UninstallRootColormap(); + + ResizeWindow = None; +} + +void MenuEndResize(TwmWindow *tmp_win) +{ + MoveOutline(Scr->Root, 0, 0, 0, 0, 0, 0); + XUnmapWindow(dpy, Scr->SizeWindow); + ConstrainSize (tmp_win, &dragWidth, &dragHeight); + AddingX = dragx - tmp_win->frame_bw; + AddingY = dragy - tmp_win->frame_bw; + AddingW = dragWidth; + AddingH = dragHeight; + SetupWindow (tmp_win, AddingX, AddingY, AddingW, AddingH, -1); +} + + + +/*********************************************************************** + * + * Procedure: + * AddEndResize - finish the resize operation for AddWindoframe_bw); + AddingH = dragHeight + (2 * tmp_win->frame_bw); +} + +/*********************************************************************** + * + * Procedure: + * ConstrainSize - adjust the given width and height to account for the + * constraints imposed by size hints + * + * The general algorithm, especially the aspect ratio stuff, is + * borrowed from uwm's CheckConsistency routine. + * + ***********************************************************************/ + +void ConstrainSize (TwmWindow *tmp_win, + unsigned int *widthp, unsigned int *heightp) +{ +#define makemult(a,b) ((b==1) ? (a) : (((int)((a)/(b))) * (b)) ) +#define _min(a,b) (((a) < (b)) ? (a) : (b)) + + int minWidth, minHeight, maxWidth, maxHeight, xinc, yinc, delta; + int baseWidth, baseHeight; + int dwidth = *widthp, dheight = *heightp; + + + dwidth -= 2 * tmp_win->frame_bw3D; + dheight -= (tmp_win->title_height + 2 * tmp_win->frame_bw3D); + + if (tmp_win->hints.flags & PMinSize) { + minWidth = tmp_win->hints.min_width; + minHeight = tmp_win->hints.min_height; + } else if (tmp_win->hints.flags & PBaseSize) { + minWidth = tmp_win->hints.base_width; + minHeight = tmp_win->hints.base_height; + } else { + minWidth = minHeight = 1; + } + + if (tmp_win->hints.flags & PBaseSize) { + baseWidth = tmp_win->hints.base_width; + baseHeight = tmp_win->hints.base_height; + } else if (tmp_win->hints.flags & PMinSize) { + baseWidth = tmp_win->hints.min_width; + baseHeight = tmp_win->hints.min_height; + } else { + baseWidth = baseHeight = 0; + } + + + if (tmp_win->hints.flags & PMaxSize) { + maxWidth = _min (Scr->MaxWindowWidth, tmp_win->hints.max_width); + maxHeight = _min (Scr->MaxWindowHeight, tmp_win->hints.max_height); + } else { + maxWidth = Scr->MaxWindowWidth; + maxHeight = Scr->MaxWindowHeight; + } + + if (tmp_win->hints.flags & PResizeInc) { + xinc = tmp_win->hints.width_inc; + yinc = tmp_win->hints.height_inc; + if (xinc == 0) xinc = 1; + if (yinc == 0) yinc = 1; + } else { + xinc = yinc = 1; + } + + /* + * First, clamp to min and max values + */ + if (dwidth < minWidth) dwidth = minWidth; + if (dheight < minHeight) dheight = minHeight; + + if (dwidth > maxWidth) dwidth = maxWidth; + if (dheight > maxHeight) dheight = maxHeight; + + + /* + * Second, fit to base + N * inc + */ + dwidth = ((dwidth - baseWidth) / xinc * xinc) + baseWidth; + dheight = ((dheight - baseHeight) / yinc * yinc) + baseHeight; + + + /* + * Third, adjust for aspect ratio + */ + /* + * The math looks like this: + * + * minAspectX dwidth maxAspectX + * ---------- <= ------- <= ---------- + * minAspectY dheight maxAspectY + * + * If that is multiplied out, then the width and height are + * invalid in the following situations: + * + * minAspectX * dheight > minAspectY * dwidth + * maxAspectX * dheight < maxAspectY * dwidth + * + */ + + if (tmp_win->hints.flags & PAspect) { + int minAspectX = tmp_win->hints.min_aspect.x; + int minAspectY = tmp_win->hints.min_aspect.y; + int maxAspectX = tmp_win->hints.max_aspect.x; + int maxAspectY = tmp_win->hints.max_aspect.y; + + if (minAspectX && minAspectY && maxAspectX && maxAspectY) { + if (minAspectX * dheight > minAspectY * dwidth) { + delta = makemult(minAspectX * dheight / minAspectY - dwidth, + xinc); + if (dwidth + delta <= maxWidth) { + dwidth += delta; + } else { + delta = makemult(dheight - dwidth*minAspectY/minAspectX, + yinc); + if (dheight - delta >= minHeight) { + dheight -= delta; + } + } + } + + if (maxAspectX * dheight < maxAspectY * dwidth) { + delta = makemult(dwidth * maxAspectY / maxAspectX - dheight, + yinc); + if (dheight + delta <= maxHeight) { + dheight += delta; + } else { + delta = makemult(dwidth - maxAspectX*dheight/maxAspectY, + xinc); + if (dwidth - delta >= minWidth) { + dwidth -= delta; + } + } + } + } + } + + + /* + * Fourth, account for border width and title height + */ + *widthp = dwidth + 2 * tmp_win->frame_bw3D; + *heightp = dheight + tmp_win->title_height + 2 * tmp_win->frame_bw3D; +} + + +/*********************************************************************** + * + * Procedure: + * SetupWindow - set window sizes, this was called from either + * AddWindow, EndResize, or HandleConfigureNotify. + * + * Inputs: + * tmp_win - the TwmWindow pointer + * x - the x coordinate of the upper-left outer corner of the frame + * y - the y coordinate of the upper-left outer corner of the frame + * w - the width of the frame window w/o border + * h - the height of the frame window w/o border + * bw - the border width of the frame window or -1 not to change + * + * Special Considerations: + * This routine will check to make sure the window is not completely + * off the display, if it is, it'll bring some of it back on. + * + * The tmp_win->frame_XXX variables should NOT be updated with the + * values of x,y,w,h prior to calling this routine, since the new + * values are compared against the old to see whether a synthetic + * ConfigureNotify event should be sent. (It should be sent if the + * window was moved but not resized.) + * + *********************************************************************** + */ + +void SetupWindow (TwmWindow *tmp_win, int x, int y, int w, int h, int bw) +{ + SetupFrame (tmp_win, x, y, w, h, bw, False); +} + +void SetupFrame (TwmWindow *tmp_win, int x, int y, int w, int h, int bw, + Bool sendEvent) /* whether or not to force a send */ +{ + XEvent client_event; + XWindowChanges frame_wc, xwc; + unsigned long frame_mask, xwcm; + int title_width, title_height; + int reShape; + +#ifdef DEBUG + fprintf (stderr, "SetupWindow: x=%d, y=%d, w=%d, h=%d, bw=%d\n", + x, y, w, h, bw); +#endif + + if (x >= Scr->rootw) + x = Scr->rootw - 16; /* one "average" cursor width */ + if (y >= Scr->rooth) + y = Scr->rooth - 16; /* one "average" cursor width */ + if (bw < 0) + bw = tmp_win->frame_bw; /* -1 means current frame width */ + + if (tmp_win->iconmgr) { + tmp_win->iconmgrp->width = w - (2 * tmp_win->frame_bw3D); + h = tmp_win->iconmgrp->height + tmp_win->title_height + (2 * tmp_win->frame_bw3D); + } + + /* + * According to the July 27, 1988 ICCCM draft, we should send a + * "synthetic" ConfigureNotify event to the client if the window + * was moved but not resized. + */ + if (((x != tmp_win->frame_x || y != tmp_win->frame_y) && + (w == tmp_win->frame_width && h == tmp_win->frame_height)) || + (bw != tmp_win->frame_bw)) + sendEvent = TRUE; + + xwcm = CWWidth; + title_width = xwc.width = w - (2 * tmp_win->frame_bw3D); + title_height = Scr->TitleHeight + bw; + ComputeWindowTitleOffsets (tmp_win, xwc.width, True); + + reShape = (tmp_win->wShaped ? TRUE : FALSE); + if (tmp_win->squeeze_info/* && !tmp_win->squeezed*/) /* check for title shaping */ + { + title_width = tmp_win->rightx + Scr->TBInfo.rightoff; + if (title_width < xwc.width) + { + xwc.width = title_width; + if (tmp_win->frame_height != h || + tmp_win->frame_width != w || + tmp_win->frame_bw != bw || + title_width != tmp_win->title_width) + reShape = TRUE; + } + else + { + if (!tmp_win->wShaped) reShape = TRUE; + title_width = xwc.width; + } + } + + tmp_win->title_width = title_width; + if (tmp_win->title_height) tmp_win->title_height = title_height; + + if (tmp_win->title_w) { + if (bw != tmp_win->frame_bw) { + xwc.border_width = bw; + tmp_win->title_x = xwc.x = tmp_win->frame_bw3D - bw; + tmp_win->title_y = xwc.y = tmp_win->frame_bw3D - bw; + xwcm |= (CWX | CWY | CWBorderWidth); + } + + XConfigureWindow(dpy, tmp_win->title_w, xwcm, &xwc); + } + if (tmp_win->attr.width != w) + tmp_win->widthEverChangedByUser = True; + + if (tmp_win->attr.height != (h - tmp_win->title_height)) + tmp_win->heightEverChangedByUser = True; + + if (!tmp_win->squeezed) { + tmp_win->attr.width = w - (2 * tmp_win->frame_bw3D); + tmp_win->attr.height = h - tmp_win->title_height - (2 * tmp_win->frame_bw3D); + } + if (tmp_win->squeezed) { + if (x != tmp_win->frame_x) tmp_win->actual_frame_x += x - tmp_win->frame_x; + if (y != tmp_win->frame_y) tmp_win->actual_frame_y += y - tmp_win->frame_y; + } + /* + * fix up frame and assign size/location values in tmp_win + */ + frame_mask = 0; + if (bw != tmp_win->frame_bw) { + frame_wc.border_width = tmp_win->frame_bw = bw; + frame_mask |= CWBorderWidth; + } + tmp_win->frame_x = x; + tmp_win->frame_y = y; + if (tmp_win->UnmapByMovingFarAway && !visible(tmp_win)) { + frame_wc.x = Scr->rootw + 1; + frame_wc.y = Scr->rooth + 1; + } else { + frame_wc.x = tmp_win->frame_x; + frame_wc.y = tmp_win->frame_y; + } + frame_wc.width = tmp_win->frame_width = w; + frame_wc.height = tmp_win->frame_height = h; + frame_mask |= (CWX | CWY | CWWidth | CWHeight); + XConfigureWindow (dpy, tmp_win->frame, frame_mask, &frame_wc); + + XMoveResizeWindow (dpy, tmp_win->w, tmp_win->frame_bw3D, + tmp_win->title_height + tmp_win->frame_bw3D, + tmp_win->attr.width, tmp_win->attr.height); + + /* + * fix up highlight window + */ + if (tmp_win->title_height && tmp_win->hilite_wl) + { + xwc.width = (tmp_win->name_x - tmp_win->highlightxl - 2); + if (xwc.width <= 0) { + xwc.x = Scr->rootw; /* move offscreen */ + xwc.width = 1; + } else { + xwc.x = tmp_win->highlightxl; + } + + xwcm = CWX | CWWidth; + XConfigureWindow(dpy, tmp_win->hilite_wl, xwcm, &xwc); + } + if (tmp_win->title_height && tmp_win->hilite_wr) + { + xwc.width = (tmp_win->rightx - tmp_win->highlightxr); + if (Scr->TBInfo.nright > 0) xwc.width -= 2 * Scr->TitlePadding; + if (Scr->use3Dtitles) xwc.width -= Scr->TitleButtonShadowDepth; + if (xwc.width <= 0) { + xwc.x = Scr->rootw; /* move offscreen */ + xwc.width = 1; + } else { + xwc.x = tmp_win->highlightxr; + } + + xwcm = CWX | CWWidth; + XConfigureWindow(dpy, tmp_win->hilite_wr, xwcm, &xwc); + } + if (tmp_win->title_height && tmp_win->lolite_wl) + { + xwc.width = (tmp_win->name_x - tmp_win->highlightxl); + if (Scr->use3Dtitles) xwc.width -= 4; + if (xwc.width <= 0) { + xwc.x = Scr->rootw; /* move offscreen */ + xwc.width = 1; + } else { + xwc.x = tmp_win->highlightxl; + } + + xwcm = CWX | CWWidth; + XConfigureWindow(dpy, tmp_win->lolite_wl, xwcm, &xwc); + } + if (tmp_win->title_height && tmp_win->lolite_wr) + { + xwc.width = (tmp_win->rightx - tmp_win->highlightxr); + if (Scr->TBInfo.nright > 0) xwc.width -= Scr->TitlePadding; + if (Scr->use3Dtitles) xwc.width -= 4; + if (xwc.width <= 0) { + xwc.x = Scr->rootw; /* move offscreen */ + xwc.width = 1; + } else { + xwc.x = tmp_win->highlightxr; + } + + xwcm = CWX | CWWidth; + XConfigureWindow(dpy, tmp_win->lolite_wr, xwcm, &xwc); + } + if (HasShape && reShape) { + SetFrameShape (tmp_win); + } + WMapSetupWindow (tmp_win, x, y, w, h); + if (sendEvent) + { + client_event.type = ConfigureNotify; + client_event.xconfigure.display = dpy; + client_event.xconfigure.event = tmp_win->w; + client_event.xconfigure.window = tmp_win->w; + client_event.xconfigure.x = (x + tmp_win->frame_bw - tmp_win->old_bw + + tmp_win->frame_bw3D); + client_event.xconfigure.y = (y + tmp_win->frame_bw + + tmp_win->title_height - tmp_win->old_bw + + tmp_win->frame_bw3D); + client_event.xconfigure.width = tmp_win->attr.width; + client_event.xconfigure.height = tmp_win->attr.height; + client_event.xconfigure.border_width = tmp_win->old_bw; + /* Real ConfigureNotify events say we're above title window, so ... */ + /* what if we don't have a title ????? */ + client_event.xconfigure.above = tmp_win->frame; + client_event.xconfigure.override_redirect = False; + XSendEvent(dpy, tmp_win->w, False, StructureNotifyMask, &client_event); + } +} + + +/********************************************************************** + * Rutgers mod #1 - rocky. + * Procedure: + * fullzoom - zooms window to full height of screen or + * to full height and width of screen. (Toggles + * so that it can undo the zoom - even when switching + * between fullzoom and vertical zoom.) + * + * Inputs: + * tmp_win - the TwmWindow pointer + * + * + ********************************************************************** + */ + +void fullzoom(TwmWindow *tmp_win, int flag) +{ + Window junkRoot; + unsigned int junkbw, junkDepth; + int basex, basey; + int border_x, border_y; + int frame_bw_times_2; + int zwidth = Scr->rootw; + int zheight = Scr->rooth; + int tmpX, tmpY, tmpW, tmpH; + + + + XGetGeometry(dpy, (Drawable) tmp_win->frame, &junkRoot, + &dragx, &dragy, (unsigned int *)&dragWidth, (unsigned int *)&dragHeight, &junkbw, + &junkDepth); + + basex = Scr->BorderLeft; + basey = Scr->BorderTop; + + border_x = Scr->BorderLeft + Scr->BorderRight; + border_y = Scr->BorderTop + Scr->BorderBottom; + + if (tmp_win->winbox) { + XWindowAttributes winattrs; + if (XGetWindowAttributes(dpy, tmp_win->winbox->window, &winattrs)) { + zwidth = winattrs.width; + zheight = winattrs.height; + } + basex = 0; + basey = 0; + border_x = 0; + border_y = 0; + } + if (tmp_win->zoomed == flag) + { + dragHeight = tmp_win->save_frame_height; + dragWidth = tmp_win->save_frame_width; + dragx = tmp_win->save_frame_x; + dragy = tmp_win->save_frame_y; + tmp_win->zoomed = ZOOM_NONE; + } + else + { + if (tmp_win->zoomed == ZOOM_NONE) + { + tmp_win->save_frame_x = dragx; + tmp_win->save_frame_y = dragy; + tmp_win->save_frame_width = dragWidth; + tmp_win->save_frame_height = dragHeight; + tmp_win->zoomed = flag; + } + else + tmp_win->zoomed = flag; + + frame_bw_times_2 = 2*tmp_win->frame_bw; + + switch (flag) + { + case ZOOM_NONE: + break; + case F_ZOOM: + dragHeight = zheight - border_y - frame_bw_times_2; + dragy=basey; + break; + case F_HORIZOOM: + dragx = basex; + dragWidth = zwidth - border_x - frame_bw_times_2; + break; + case F_FULLZOOM: + dragx = basex; + dragy = basey; + dragHeight = zheight - border_y - frame_bw_times_2; + dragWidth = zwidth - border_x - frame_bw_times_2; + break; + case F_LEFTZOOM: + dragx = basex; + dragy = basey; + dragHeight = zheight - border_y - frame_bw_times_2; + dragWidth = (zwidth - border_x)/2 - frame_bw_times_2; + break; + case F_RIGHTZOOM: + dragx = basex + (zwidth - border_x)/2; + dragy = basey; + dragHeight = zheight - border_y - frame_bw_times_2; + dragWidth = (zwidth - border_x)/2 - frame_bw_times_2; + break; + case F_TOPZOOM: + dragx = basex; + dragy = basey; + dragHeight = (zheight - border_y)/2 - frame_bw_times_2; + dragWidth = zwidth - border_x - frame_bw_times_2; + break; + case F_BOTTOMZOOM: + dragx = basex; + dragy = basey + (zheight - border_y)/2; + dragHeight = (zheight - border_y)/2 - frame_bw_times_2; + dragWidth = zwidth - border_x - frame_bw_times_2; + break; + } + } + + if (!Scr->NoRaiseResize) + RaiseWindow(tmp_win); + + ConstrainSize(tmp_win, &dragWidth, &dragHeight); +#ifdef BETTERZOOM + if (flag == F_ZOOM) + { + if (dragy + dragHeight < tmp_win->save_frame_y + tmp_win->save_frame_height) + dragy = tmp_win->save_frame_y + tmp_win->save_frame_height - dragHeight; + } +#endif + SetupWindow (tmp_win, dragx , dragy , dragWidth, dragHeight, -1); +/* I don't understand the reason of this. Claude. + XUngrabPointer (dpy, CurrentTime); +*/ + XUngrabServer (dpy); + + XQueryPointer(dpy, + tmp_win->w, + &junkRoot, &junkRoot, + &tmpX, &tmpY, &tmpW, &tmpH, &junkDepth); + if (tmp_win->frame_x > tmpX || + tmp_win->frame_x + tmp_win->frame_width < tmpX || + tmp_win->frame_y > tmpY || + tmp_win->frame_y + tmp_win->frame_height < tmpY) { + XWarpPointer(dpy, Scr->Root, tmp_win->w, 0, 0, 0, 0, 0, 0); + } +} + +void savegeometry (TwmWindow *tmp_win) +{ + if (!tmp_win) return; + tmp_win->savegeometry.x = tmp_win->frame_x; + tmp_win->savegeometry.y = tmp_win->frame_y; + tmp_win->savegeometry.width = tmp_win->frame_width; + tmp_win->savegeometry.height = tmp_win->frame_height; +} + +void restoregeometry (TwmWindow *tmp_win) +{ + int x, y; + unsigned int w, h; + + if (!tmp_win) return; + if (tmp_win->savegeometry.width == (unsigned int)-1) return; + x = tmp_win->savegeometry.x; + y = tmp_win->savegeometry.y; + w = tmp_win->savegeometry.width; + h = tmp_win->savegeometry.height; + SetupWindow (tmp_win, x, y, w, h, -1); +} + +void SetFrameShape (TwmWindow *tmp) +{ + /* + * see if the titlebar needs to move + */ + if (tmp->title_w) { + int oldx = tmp->title_x, oldy = tmp->title_y; + ComputeTitleLocation (tmp); + if (oldx != tmp->title_x || oldy != tmp->title_y) + XMoveWindow (dpy, tmp->title_w, tmp->title_x, tmp->title_y); + } + + /* + * The frame consists of the shape of the contents window offset by + * title_height or'ed with the shape of title_w (which is always + * rectangular). + */ + if (tmp->wShaped) { + /* + * need to do general case + */ + XShapeCombineShape (dpy, tmp->frame, ShapeBounding, + tmp->frame_bw3D, tmp->title_height + tmp->frame_bw3D, tmp->w, + ShapeBounding, ShapeSet); + if (tmp->title_w) { + XShapeCombineShape (dpy, tmp->frame, ShapeBounding, + tmp->title_x + tmp->frame_bw, + tmp->title_y + tmp->frame_bw, + tmp->title_w, ShapeBounding, + ShapeUnion); + } + } else { + /* + * can optimize rectangular contents window + */ + if (tmp->squeeze_info && !tmp->squeezed) { + XRectangle newBounding[2]; + XRectangle newClip[2]; + int fbw2 = 2 * tmp->frame_bw; + + /* + * Build the border clipping rectangles; one around title, one + * around window. The title_[xy] field already have had frame_bw + * subtracted off them so that they line up properly in the frame. + * + * The frame_width and frame_height do *not* include borders. + */ + /* border */ + newBounding[0].x = tmp->title_x - tmp->frame_bw3D; + newBounding[0].y = tmp->title_y - tmp->frame_bw3D; + newBounding[0].width = tmp->title_width + fbw2 + 2 * tmp->frame_bw3D; + newBounding[0].height = tmp->title_height; + newBounding[1].x = -tmp->frame_bw; + newBounding[1].y = Scr->TitleHeight; + newBounding[1].width = tmp->attr.width + fbw2 + 2 * tmp->frame_bw3D; + newBounding[1].height = tmp->attr.height + fbw2 + 2 * tmp->frame_bw3D; + XShapeCombineRectangles (dpy, tmp->frame, ShapeBounding, 0, 0, + newBounding, 2, ShapeSet, YXBanded); + /* insides */ + newClip[0].x = tmp->title_x + tmp->frame_bw - tmp->frame_bw3D; + newClip[0].y = 0; + newClip[0].width = tmp->title_width + 2 * tmp->frame_bw3D; + newClip[0].height = Scr->TitleHeight + tmp->frame_bw3D; + newClip[1].x = 0; + newClip[1].y = tmp->title_height; + newClip[1].width = tmp->attr.width + 2 * tmp->frame_bw3D; + newClip[1].height = tmp->attr.height + 2 * tmp->frame_bw3D; + XShapeCombineRectangles (dpy, tmp->frame, ShapeClip, 0, 0, + newClip, 2, ShapeSet, YXBanded); + } else { + (void) XShapeCombineMask (dpy, tmp->frame, ShapeBounding, 0, 0, + None, ShapeSet); + (void) XShapeCombineMask (dpy, tmp->frame, ShapeClip, 0, 0, + None, ShapeSet); + } + } +} + +void ChangeSize (char *in_string, TwmWindow *tmp_win) +{ + int i=0, j=0, change=0, size=0; + char tmp_string[10], tmp_string2[10]; + char operator ='\0'; + char size_string[10]; + int rx, ry, wx, wy, mr; + Window rr, cr; + + if (Isdigit(in_string[0])) + { + while(in_string[i] != 'x') + { + tmp_string[i] = in_string[i]; + i++; + } + tmp_string[i]='\0'; + i++; + while(in_string[i] != '\0') + { + tmp_string2[j] = in_string[i]; + i++; + j++; + } + + wx = atoi(tmp_string); + wy = atoi(tmp_string2); + + if (wy < tmp_win->title_height+1) + wy = tmp_win->title_height+1; + + SetupWindow (tmp_win, tmp_win->frame_x, tmp_win->frame_y, + wx, wy+tmp_win->title_height, -1); + } + else + { + while(in_string[i] != ' ') + { + tmp_string[i] = in_string[i]; + i++; + } + tmp_string[i]='\0'; + + i++; + operator = in_string[i]; + i++; + + while(in_string[i] != '\0') + { + size_string[j] = in_string[i]; + i++; + j++; + } + size_string[j] = '\0'; + + change = atoi(size_string); + + if (operator == '-') + { + change = 0 - change; + } + else if (operator != '+') + { + /* error */ + fprintf (stderr, "%s: Bad argument to f.changesize\n", ProgramName); + return; + } + + if (strcmp("bottom", tmp_string) == 0) + { + size = tmp_win->frame_height + change; + + if (size < (tmp_win->title_height+1)) + size = tmp_win->title_height+1; + + SetupWindow (tmp_win, tmp_win->frame_x, tmp_win->frame_y, + tmp_win->frame_width, size , + -1); + + XQueryPointer(dpy, tmp_win->w, &rr, &cr, &rx, &ry, &wx, &wy, + (unsigned int*)&mr); + + if ((wy+tmp_win->title_height) > size) + XWarpPointer(dpy, None, tmp_win->w, 0, 0, 0, 0, 0, 0); + } + else if (strcmp("top", tmp_string) == 0) + { + size = tmp_win->frame_height + change; + + if (size < (tmp_win->title_height+1)) + size = tmp_win->title_height+1; + + SetupWindow (tmp_win, tmp_win->frame_x, (tmp_win->frame_y - change), + tmp_win->frame_width, size, + -1); + + XQueryPointer(dpy, tmp_win->w, &rr, &cr, &rx, &ry, &wx, &wy, + (unsigned int*)&mr); + + if ((wy + tmp_win->title_height) > size) + XWarpPointer(dpy, None, tmp_win->w, 0, 0, 0, 0, 0, 0); + + + } + else if (strcmp("left", tmp_string) == 0) + { + size = tmp_win->frame_width + change; + + if (size < 1) + size = 1; + + SetupWindow (tmp_win, (tmp_win->frame_x - change), tmp_win->frame_y, + size, tmp_win->frame_height, + -1); + + XQueryPointer(dpy, tmp_win->w, &rr, &cr, &rx, &ry, &wx, &wy, + (unsigned int*)&mr); + + if (wx > size) + XWarpPointer(dpy, None, tmp_win->w, 0, 0, 0, 0, 0, 0); + + + } + else if (strcmp("right", tmp_string) == 0) + { + size = tmp_win->frame_width + change; + + if (size < 1) + size = 1; + + SetupWindow (tmp_win, tmp_win->frame_x, tmp_win->frame_y, + size, tmp_win->frame_height, + -1); + + XQueryPointer(dpy, tmp_win->w, &rr, &cr, &rx, &ry, &wx, &wy, + (unsigned int*)&mr); + + if (wx > size) + XWarpPointer(dpy, None, tmp_win->w, 0, 0, 0, 0, 0, 0); + + } + else + { + /* error */ + fprintf (stderr, "%s: Bad argument to f.changesize\n", ProgramName); + return; + } + } +} + +/* + * Squeezed Title: + * + * tmp->title_x + * 0 | + * tmp->title_y ........+--------------+......... -+,- tmp->frame_bw + * 0 : ......| +----------+ |....... : -++ + * : : | | | | : : ||-Scr->TitleHeight + * : : | | | | : : || + * +-------+ +----------+ +--------+ -+|-tmp->title_height + * | +---------------------------+ | --+ + * | | | | + * | | | | + * | | | | + * | | | | + * | | | | + * | +---------------------------+ | + * +-------------------------------+ + * + * + * Unsqueezed Title: + * + * tmp->title_x + * | 0 + * tmp->title_y +-------------------------------+ -+,tmp->frame_bw + * 0 | +---------------------------+ | -+' + * | | | | |-Scr->TitleHeight + * | | | | | + * + +---------------------------+ + -+ + * |-+---------------------------+-| + * | | | | + * | | | | + * | | | | + * | | | | + * | | | | + * | +---------------------------+ | + * +-------------------------------+ + * + * + * + * Dimensions and Positions: + * + * frame orgin (0, 0) + * frame upper left border (-tmp->frame_bw, -tmp->frame_bw) + * frame size w/o border tmp->frame_width , tmp->frame_height + * frame/title border width tmp->frame_bw + * extra title height w/o bdr tmp->title_height = TitleHeight + frame_bw + * title window height Scr->TitleHeight + * title origin w/o border (tmp->title_x, tmp->title_y) + * client origin (0, Scr->TitleHeight + tmp->frame_bw) + * client size tmp->attr.width , tmp->attr.height + * + * When shaping, need to remember that the width and height of rectangles + * are really deltax and deltay to lower right handle corner, so they need + * to have -1 subtracted from would normally be the actual extents. + */ Index: external/mit/ctwm/dist/resize.h =================================================================== RCS file: external/mit/ctwm/dist/resize.h diff -N external/mit/ctwm/dist/resize.h --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/resize.h 3 Sep 2015 12:19:59 -0000 @@ -0,0 +1,92 @@ +/*****************************************************************************/ +/** Copyright 1988 by Evans & Sutherland Computer Corporation, **/ +/** Salt Lake City, Utah **/ +/** Portions Copyright 1989 by the Massachusetts Institute of Technology **/ +/** Cambridge, Massachusetts **/ +/** **/ +/** All Rights Reserved **/ +/** **/ +/** Permission to use, copy, modify, and distribute this software and **/ +/** its documentation for any purpose and without fee is hereby **/ +/** granted, provided that the above copyright notice appear in all **/ +/** copies and that both that copyright notice and this permis- **/ +/** sion notice appear in supporting documentation, and that the **/ +/** names of Evans & Sutherland and M.I.T. not be used in advertising **/ +/** in publicity pertaining to distribution of the software without **/ +/** specific, written prior permission. **/ +/** **/ +/** EVANS & SUTHERLAND AND M.I.T. DISCLAIM ALL WARRANTIES WITH REGARD **/ +/** TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANT- **/ +/** ABILITY AND FITNESS, IN NO EVENT SHALL EVANS & SUTHERLAND OR **/ +/** M.I.T. BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAM- **/ +/** AGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA **/ +/** OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER **/ +/** TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE **/ +/** OR PERFORMANCE OF THIS SOFTWARE. **/ +/*****************************************************************************/ +/* + * [ ctwm ] + * + * Copyright 1992 Claude Lecommandeur. + * + * Permission to use, copy, modify and distribute this software [ctwm] and + * its documentation for any purpose is hereby granted without fee, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting documen- + * tation, and that the name of Claude Lecommandeur not be used in adverti- + * sing or publicity pertaining to distribution of the software without + * specific, written prior permission. Claude Lecommandeur make no represen- + * tations about the suitability of this software for any purpose. It is + * provided "as is" without express or implied warranty. + * + * Claude Lecommandeur DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO + * EVENT SHALL Claude Lecommandeur BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF + * USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR + * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + * + * Author: Claude Lecommandeur [ lecom@sic.epfl.ch ][ April 1992 ] + */ + + +/********************************************************************** + * + * $XConsortium: resize.h,v 1.7 90/03/23 11:42:32 jim Exp $ + * + * resize function externs + * + * 8-Apr-88 Tom LaStrange Initial Version. + * + **********************************************************************/ + +#ifndef _RESIZE_ +#define _RESIZE_ + +extern void MenuStartResize(TwmWindow *tmp_win, int x, int y, int w, int h); +extern void StartResize(XEvent *evp, TwmWindow *tmp_win, + Bool fromtitlebar, Bool from3dborder); +extern void AddStartResize(TwmWindow *tmp_win, int x, int y, int w, int h); +extern void MenuDoResize(int x_root, int y_root, TwmWindow *tmp_win); +extern void DoResize(int x_root, int y_root, TwmWindow *tmp_win); +extern void DisplaySize(TwmWindow *tmp_win, int width, int height); +extern void EndResize(void); +extern void MenuEndResize(TwmWindow *tmp_win); +extern void AddEndResize(TwmWindow *tmp_win); +extern void SetupWindow(TwmWindow *tmp_win, + int x, int y, int w, int h, int bw); +extern void SetupFrame(TwmWindow *tmp_win, + int x, int y, int w, int h, int bw, + Bool sendEvent); +extern void ConstrainSize (TwmWindow *tmp_win, unsigned + int *widthp, unsigned int *heightp); + +extern void fullzoom(TwmWindow *tmp_win, int flag); +extern void savegeometry (TwmWindow *tmp_win); +extern void restoregeometry (TwmWindow *tmp_win); +extern void SetFrameShape (TwmWindow *tmp); + +extern void ChangeSize (char *in_string, TwmWindow *tmp_win); + +#endif /* _RESIZE_ */ Index: external/mit/ctwm/dist/screen.h =================================================================== RCS file: external/mit/ctwm/dist/screen.h diff -N external/mit/ctwm/dist/screen.h --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/screen.h 3 Sep 2015 12:19:59 -0000 @@ -0,0 +1,482 @@ +/* + * Copyright 1989 Massachusetts Institute of Technology + * + * Permission to use, copy, modify, and distribute this software and its + * documentation for any purpose and without fee is hereby granted, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting + * documentation, and that the name of M.I.T. not be used in advertising + * or publicity pertaining to distribution of the software without specific, + * written prior permission. M.I.T. makes no representations about the + * suitability of this software for any purpose. It is provided "as is" + * without express or implied warranty. + * + * M.I.T. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL M.I.T. + * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ +/* + * [ ctwm ] + * + * Copyright 1992 Claude Lecommandeur. + * + * Permission to use, copy, modify and distribute this software [ctwm] and + * its documentation for any purpose is hereby granted without fee, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting documen- + * tation, and that the name of Claude Lecommandeur not be used in adverti- + * sing or publicity pertaining to distribution of the software without + * specific, written prior permission. Claude Lecommandeur make no represen- + * tations about the suitability of this software for any purpose. It is + * provided "as is" without express or implied warranty. + * + * Claude Lecommandeur DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO + * EVENT SHALL Claude Lecommandeur BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF + * USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR + * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + * + * Author: Claude Lecommandeur [ lecom@sic.epfl.ch ][ April 1992 ] + */ + +/*********************************************************************** + * + * $XConsortium: screen.h,v 1.62 91/05/01 17:33:09 keith Exp $ + * + * twm per-screen data include file + * + * 11-3-88 Dave Payne, Apple Computer File created + * + ***********************************************************************/ + +#ifndef _SCREEN_ +#define _SCREEN_ + +#ifdef VMS +#include +#include +#include +#else +#include +#include +#include +#endif + +#ifdef GNOME +# include "gnome.h" +#endif /* GNOME */ +#include "list.h" +#include "menus.h" +#include "iconmgr.h" +#include "vscreen.h" +#include "workmgr.h" + +#define ICONIFY_NORMAL 0 +#define ICONIFY_MOSAIC 1 +#define ICONIFY_ZOOMIN 2 +#define ICONIFY_ZOOMOUT 3 +#define ICONIFY_SWEEP 4 + +struct _StdCmap { + struct _StdCmap *next; /* next link in chain */ + Atom atom; /* property from which this came */ + int nmaps; /* number of maps below */ + XStandardColormap *maps; /* the actual maps */ +}; + +#define SIZE_HINDENT 10 +#define SIZE_VINDENT 2 + +struct _TitlebarPixmaps { + Pixmap xlogo; + Pixmap resize; + Pixmap question; + Pixmap menu; + Pixmap delete; +}; + +struct ScreenInfo +{ + int screen; /* the default screen */ + int d_depth; /* copy of DefaultDepth(dpy, screen) */ + Visual *d_visual; /* copy of DefaultVisual(dpy, screen) */ + int Monochrome; /* is the display monochrome ? */ + int rootx; /* The x coordinate of the root window (virtual screen) relative to RealRoot */ + int rooty; /* The y coordinate of the root window (virtual screen) relative to RealRoot */ + int rootw; /* my copy of DisplayWidth(dpy, screen) */ + int rooth; /* my copy of DisplayHeight(dpy, screen) */ + + int crootx; /* The x coordinate of the captive root window if any */ + int crooty; /* The y coordinate of the captive root window if any */ + int crootw; /* my copy of DisplayWidth(dpy, screen) */ + int crooth; /* my copy of DisplayHeight(dpy, screen) */ + + int MaxWindowWidth; /* largest window to allow */ + int MaxWindowHeight; /* ditto */ + + TwmWindow *FirstWindow; /* the head of the twm window list */ + Colormaps RootColormaps; /* the colormaps of the root window */ + + Window Root; /* the root window: the current virual screen */ + Window XineramaRoot; /* the root window, may be CaptiveRoot or otherwise RealRoot */ + Window CaptiveRoot; /* the captive root window, if any, or 0 */ + Window RealRoot; /* the actual root window of the display */ + +/* + * +--RealRoot-----------------------------------------------------------+ + * | the root of the display (most uses of this are probably incorrect!) | + * | | + * | +--CaptiveRoot--------------------------------------------------+ | + * | | when captive window is used (most uses are likely incorrect!) | | + * | | | | + * | | +--XineramaRoot---------------------------------------------+ | | + * | | | the root that encompasses all virual screens | | | + * | | | | | | + * | | | +--Root-----------+ +--Root--------+ +--Root------------+ | | | + * | | | | one or more | | Most cases | | | | | | + * | | | | virtual screens | | use Root. | | | | | | + * | | | | | | | | | | | | + * | | | | | | | | | | | | + * | | | +-----------------+ +--------------+ +------------------+ | | | + * | | +-----------------------------------------------------------+ | | + * | +---------------------------------------------------------------+ | + * +---------------------------------------------------------------------+ + */ + + Window SizeWindow; /* the resize dimensions window */ + Window InfoWindow; /* the information window */ + Window WindowMask; /* the window masking the screen at startup */ + Window ShapeWindow; /* an utilitary window for animated icons */ + + Image *WelcomeImage; + GC WelcomeGC; + Colormap WelcomeCmap; + Visual *WelcomeVisual; + + name_list *ImageCache; /* list of pixmaps */ + TitlebarPixmaps tbpm; /* titlebar pixmaps */ + Image *UnknownImage; /* the unknown icon pixmap */ + Pixmap siconifyPm; /* the icon manager iconify pixmap */ + Pixmap pullPm; /* pull right menu icon */ + unsigned int pullW, pullH; /* size of pull right menu icon */ + char *HighlightPixmapName; /* name of the hilite image if any */ + + MenuRoot *MenuList; /* head of the menu list */ + MenuRoot *LastMenu; /* the last menu (mostly unused?) */ + MenuRoot *Windows; /* the TwmWindows menu */ + MenuRoot *Icons; /* the TwmIcons menu */ + MenuRoot *Workspaces; /* the TwmWorkspaces menu */ + MenuRoot *AllWindows; /* the TwmAllWindows menu */ + + /*Added by dl 2004 */ + MenuRoot *AllIcons; /* the TwmAllIcons menu */ + + /******************************************************/ + /* Added by Dan Lilliehorn (dl@dl.nu) 2000-02-29) */ + MenuRoot *Keys; /* the TwmKeys menu */ + MenuRoot *Visible; /* thw TwmVisible menu */ + + TwmWindow *Ring; /* one of the windows in window ring */ + TwmWindow *RingLeader; /* current window in ring */ + + MouseButton DefaultFunction; + MouseButton WindowFunction; + MouseButton ChangeWorkspaceFunction; + MouseButton DeIconifyFunction; + MouseButton IconifyFunction; + + struct { + Colormaps *cmaps; /* current list of colormap windows */ + int maxCmaps; /* maximum number of installed colormaps */ + unsigned long first_req; /* seq # for first XInstallColormap() req in + pass thru loading a colortable list */ + int root_pushes; /* current push level to install root + colormap windows */ + Colormaps *pushed_cmaps; /* saved colormaps to install when pushes + drops to zero */ + } cmapInfo; + + struct { + StdCmap *head, *tail; /* list of maps */ + StdCmap *mru; /* most recently used in list */ + int mruindex; /* index of mru in entry */ + } StdCmapInfo; + + struct { + int nleft, nright; /* numbers of buttons in list */ + TitleButton *head; /* start of list */ + int border; /* button border */ + int pad; /* button-padding */ + int width; /* width of single button & border */ + int leftx; /* start of left buttons */ + int titlex; /* start of title */ + int rightoff; /* offset back from right edge */ + int titlew; /* width of title part */ + } TBInfo; + ColorPair BorderTileC; /* border tile colors */ + ColorPair TitleC; /* titlebar colors */ + ColorPair MenuC; /* menu colors */ + ColorPair MenuTitleC; /* menu title colors */ + ColorPair IconC; /* icon colors */ + ColorPair IconManagerC; /* icon manager colors */ + ColorPair DefaultC; /* default colors */ + ColorPair BorderColorC; /* color of window borders */ + Pixel MenuShadowColor; /* menu shadow color */ + Pixel IconBorderColor; /* icon border color */ + Pixel IconManagerHighlight; /* icon manager highlight */ + short ClearShadowContrast; /* The contrast of the clear shadow */ + short DarkShadowContrast; /* The contrast of the dark shadow */ + short IconJustification; /* J_LEFT, J_CENTER or J_RIGHT */ + short IconRegionJustification; /* J_LEFT, J_CENTER J_RIGHT or J_BORDER */ + short IconRegionAlignement; /* J_TOP, J_CENTER, J_BOTTOM or J_BORDER */ + short TitleJustification; /* J_LEFT, J_CENTER or J_RIGHT */ + short IconifyStyle; /* ICONIFY_* */ + int MaxIconTitleWidth; /* */ + + Cursor TitleCursor; /* title bar cursor */ + Cursor FrameCursor; /* frame cursor */ + Cursor IconCursor; /* icon cursor */ + Cursor IconMgrCursor; /* icon manager cursor */ + Cursor ButtonCursor; /* title bar button cursor */ + Cursor MoveCursor; /* move cursor */ + Cursor ResizeCursor; /* resize cursor */ + Cursor WaitCursor; /* wait a while cursor */ + Cursor MenuCursor; /* menu cursor */ + Cursor SelectCursor; /* dot cursor for f.move, etc. from menus */ + Cursor DestroyCursor; /* skull and cross bones, f.destroy */ + Cursor AlterCursor; /* cursor for alternate keymaps */ + + WorkSpaceMgr workSpaceMgr; + short workSpaceManagerActive; + + virtualScreen *vScreenList; + virtualScreen *currentvs; + name_list *VirtualScreens; + + name_list *OccupyAll; /* list of window names occupying all workspaces at startup */ + name_list *UnmapByMovingFarAway; + name_list *DontSetInactive; + name_list *AutoSqueeze; + name_list *StartSqueezed; + short use3Dmenus; + short use3Dtitles; + short use3Diconmanagers; + short use3Dborders; + short use3Dwmap; + short use3Diconborders; + short SunkFocusWindowTitle; + short WMgrVertButtonIndent; + short WMgrHorizButtonIndent; + short WMgrButtonShadowDepth; + short BeNiceToColormap; + short BorderCursors; + short BorderShadowDepth; + short TitleButtonShadowDepth; + short TitleShadowDepth; + short MenuShadowDepth; + short IconManagerShadowDepth; + short ReallyMoveInWorkspaceManager; + short ShowWinWhenMovingInWmgr; + short ReverseCurrentWorkspace; + short DontWarpCursorInWMap; + short XMoveGrid, YMoveGrid; + short FastServer; + short CenterFeedbackWindow; + short ShrinkIconTitles; + short AutoRaiseIcons; + short AutoFocusToTransients; /* kai */ + short PackNewWindows; + + name_list *BorderColorL; + name_list *IconBorderColorL; + name_list *BorderTileForegroundL; + name_list *BorderTileBackgroundL; + name_list *TitleForegroundL; + name_list *TitleBackgroundL; + name_list *IconForegroundL; + name_list *IconBackgroundL; + name_list *IconManagerFL; + name_list *IconManagerBL; + name_list *IconMgrs; + name_list *NoBorder; /* list of window without borders */ + name_list *NoIconTitle; /* list of window names with no icon title */ + name_list *NoTitle; /* list of window names with no title bar */ + name_list *MakeTitle; /* list of window names with title bar */ + name_list *AutoRaise; /* list of window names to auto-raise */ + name_list *AutoLower; /* list of window names to auto-lower */ + name_list *IconNames; /* list of window names and icon names */ + name_list *NoHighlight; /* list of windows to not highlight */ + name_list *NoStackModeL; /* windows to ignore stack mode requests */ + name_list *AlwaysOnTopL; /* windows to keep on top */ + name_list *NoTitleHighlight;/* list of windows to not highlight the TB*/ + name_list *DontIconify; /* don't iconify by unmapping */ + name_list *IconMgrNoShow; /* don't show in the icon manager */ + name_list *IconMgrShow; /* show in the icon manager */ + name_list *IconifyByUn; /* windows to iconify by unmapping */ + name_list *StartIconified; /* windows to start iconic */ + name_list *IconManagerHighlightL; /* icon manager highlight colors */ + name_list *SqueezeTitleL; /* windows of which to squeeze title */ + name_list *DontSqueezeTitleL; /* windows of which not to squeeze */ + name_list *AlwaysSqueezeToGravityL; /* windows which should squeeze toward gravity */ + name_list *WindowRingL; /* windows in ring */ + name_list *WindowRingExcludeL; /* windows excluded from ring */ + name_list *WarpCursorL; /* windows to warp cursor to on deiconify */ + name_list *DontSave; + name_list *WindowGeometries; + name_list *IgnoreTransientL; + + name_list *OpaqueMoveList; + name_list *NoOpaqueMoveList; + name_list *OpaqueResizeList; + name_list *NoOpaqueResizeList; + name_list *IconMenuDontShow; + + GC NormalGC; /* normal GC for everything */ + GC MenuGC; /* gc for menus */ + GC DrawGC; /* GC to draw lines for move and resize */ + GC BorderGC; /* for drawing 3D borders */ + GC rootGC; /* used for allocating pixmaps in FindPixmap (util.c) */ + + unsigned long Black; + unsigned long White; + unsigned long XORvalue; /* number to use when drawing xor'ed */ + MyFont TitleBarFont; /* title bar font structure */ + MyFont MenuFont; /* menu font structure */ + MyFont IconFont; /* icon font structure */ + MyFont SizeFont; /* resize font structure */ + MyFont IconManagerFont; /* window list font structure */ + MyFont DefaultFont; + IconMgr *iconmgr; /* default icon manager */ + struct IconRegion *FirstRegion; /* pointer to icon regions */ + struct IconRegion *LastRegion; /* pointer to the last icon region */ + struct WindowRegion *FirstWindowRegion; /* pointer to window regions */ + WindowBox *FirstWindowBox; /* pointer to window boxes list */ + char *IconDirectory; /* icon directory to search */ + char *PixmapDirectory; /* Pixmap directory to search */ + int SizeStringOffset; /* x offset in size window for drawing */ + int SizeStringWidth; /* minimum width of size window */ + int BorderWidth; /* border width of twm windows */ + int BorderLeft; + int BorderRight; + int BorderTop; + int BorderBottom; + int ThreeDBorderWidth; /* 3D border width of twm windows */ + int IconBorderWidth; /* border width of icon windows */ + int TitleHeight; /* height of the title bar window */ + TwmWindow *Focus; /* the twm window that has focus */ + int EntryHeight; /* menu entry height */ + int FramePadding; /* distance between decorations and border */ + int TitlePadding; /* distance between items in titlebar */ + int ButtonIndent; /* amount to shrink buttons on each side */ + int NumAutoRaises; /* number of autoraise windows on screen */ + int NumAutoLowers; /* number of autolower windows on screen */ + int TransientOnTop; /* Percentage of the surface of it's leader */ + short AutoRaiseDefault; /* AutoRaise all windows if true */ + short AutoLowerDefault; /* AutoLower all windows if true */ + short NoDefaults; /* do not add in default UI stuff */ + short UsePPosition; /* what do with PPosition, see values below */ + short UseSunkTitlePixmap; + short AutoRelativeResize; /* start resize relative to position in quad */ + short FocusRoot; /* is the input focus on the root ? */ + short WarpCursor; /* warp cursor on de-iconify ? */ + short ForceIcon; /* force the icon to the user specified */ + short NoGrabServer; /* don't do server grabs */ + short NoRaiseMove; /* don't raise window following move */ + short NoRaiseResize; /* don't raise window following resize */ + short NoRaiseDeicon; /* don't raise window on deiconify */ + short RaiseOnWarp; /* do raise window on warp */ + short DontMoveOff; /* don't allow windows to be moved off */ + int MoveOffResistance; /* nb of pixel before moveOff gives up */ + int MovePackResistance; /* nb of pixel before f.movepack gives up */ + short DoZoom; /* zoom in and out of icons */ + short TitleFocus; /* focus on window in title bar ? */ + short IconManagerFocus; /* focus on iconified window ? */ + short NoIconTitlebar; /* put title bars on icons */ + short NoTitlebar; /* put title bars on windows */ + short DecorateTransients; /* put title bars on transients */ + short IconifyByUnmapping; /* simply unmap windows when iconifying */ + short ShowIconManager; /* display the window list */ + short ShowWorkspaceManager; /* display the workspace manager */ + short IconManagerDontShow; /* show nothing in the icon manager */ + short AutoOccupy; /* Do we automatically change occupation when name changes */ + short TransientHasOccupation; /* Do transient-for windows have their own occupation */ + short DontPaintRootWindow; /* don't paint anything on the root window */ + short BackingStore; /* use backing store for menus */ + short SaveUnder; /* use save under's for menus */ + short RandomPlacement; /* randomly place windows that no give hints */ + short RandomDisplacementX; /* randomly displace by this much horizontally */ + short RandomDisplacementY; /* randomly displace by this much vertically */ + short OpaqueMove; /* move the window rather than outline */ + short DoOpaqueMove; /* move the window rather than outline */ + short OpaqueMoveThreshold; /* */ + short DoOpaqueResize; /* resize the window rather than outline */ + short OpaqueResize; /* resize the window rather than outline */ + short OpaqueResizeThreshold; /* */ + short Highlight; /* should we highlight the window borders */ + short StackMode; /* should we honor stack mode requests */ + short TitleHighlight; /* should we highlight the titlebar */ + short MoveDelta; /* number of pixels before f.move starts */ + short ZoomCount; /* zoom outline count */ + short SortIconMgr; /* sort entries in the icon manager */ + short Shadow; /* show the menu shadow */ + short InterpolateMenuColors;/* make pretty menus */ + short StayUpMenus; /* stay up menus */ + short WarpToDefaultMenuEntry; /* warp cursor to default menu entry, if any */ + short ClickToFocus; /* click to focus */ + short SloppyFocus; /* "sloppy" focus */ + short SaveWorkspaceFocus; /* Save and restore focus on workspace change. */ + short NoIconManagers; /* Don't create any icon managers */ + short ClientBorderWidth; /* respect client window border width */ + short SqueezeTitle; /* make title as small as possible */ + short AlwaysSqueezeToGravity; /* squeeze toward gravity */ + short HaveFonts; /* set if fonts have been loaded */ + short FirstTime; /* first time we've read .twmrc */ + short CaseSensitive; /* be case-sensitive when sorting names */ + short WarpUnmapped; /* allow warping to unmapped windows */ + short WindowRingAll; /* add all windows to the ring */ + short WarpRingAnyWhere; /* warp to ring even if window is not visible */ + short ShortAllWindowsMenus; /* Eliminates Icon and Workspace Managers */ + short OpenWindowTimeout; /* Timeout when a window tries to open */ + short RaiseWhenAutoUnSqueeze; + short RaiseOnClick; /* Raise a window when clieked into */ + short RaiseOnClickButton; /* Raise a window when clieked into */ + short IgnoreLockModifier; /* Should we ignore the lock modifier */ + unsigned int IgnoreModifier; + short IgnoreCaseInMenuSelection; /* Should we ignore case in menu selection */ + short NoWarpToMenuTitle; /* warp cursor to clipped menu title */ + short NoImagesInWorkSpaceManager; /* do not display mini images of the desktop background images on WSmap */ + + FuncKey FuncKeyRoot; + FuncButton FuncButtonRoot; + +#ifdef GNOME + GnomeData *gnomedata; +#endif /* GNOME */ +}; + +extern int captive; +extern int MultiScreen; +extern int NumScreens; +extern ScreenInfo **ScreenList; +extern ScreenInfo *Scr; +extern int FirstScreen; + +#define PPOS_OFF 0 +#define PPOS_ON 1 +#define PPOS_NON_ZERO 2 +/* may eventually want an option for having the PPosition be the initial + location for the drag lines */ + +#define RP_OFF 0 +#define RP_ALL 1 +#define RP_UNMAPPED 2 + +#define ONTOP_MAX 16 +#define ONTOP_DEFAULT 8 + +#endif /* _SCREEN_ */ Index: external/mit/ctwm/dist/session.c =================================================================== RCS file: external/mit/ctwm/dist/session.c diff -N external/mit/ctwm/dist/session.c --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/session.c 3 Sep 2015 12:19:59 -0000 @@ -0,0 +1,1166 @@ +/*****************************************************************************/ +/** Copyright 1988 by Evans & Sutherland Computer Corporation, **/ +/** Salt Lake City, Utah **/ +/** Portions Copyright 1989 by the Massachusetts Institute of Technology **/ +/** Cambridge, Massachusetts **/ +/** **/ +/** All Rights Reserved **/ +/** **/ +/** Permission to use, copy, modify, and distribute this software and **/ +/** its documentation for any purpose and without fee is hereby **/ +/** granted, provided that the above copyright notice appear in all **/ +/** copies and that both that copyright notice and this permis- **/ +/** sion notice appear in supporting documentation, and that the **/ +/** names of Evans & Sutherland and M.I.T. not be used in advertising **/ +/** in publicity pertaining to distribution of the software without **/ +/** specific, written prior permission. **/ +/** **/ +/** EVANS & SUTHERLAND AND M.I.T. DISCLAIM ALL WARRANTIES WITH REGARD **/ +/** TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANT- **/ +/** ABILITY AND FITNESS, IN NO EVENT SHALL EVANS & SUTHERLAND OR **/ +/** M.I.T. BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAM- **/ +/** AGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA **/ +/** OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER **/ +/** TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE **/ +/** OR PERFORMANCE OF THIS SOFTWARE. **/ +/*****************************************************************************/ +/* + * [ ctwm ] + * + * Copyright 1992 Claude Lecommandeur. + * + * Permission to use, copy, modify and distribute this software [ctwm] and + * its documentation for any purpose is hereby granted without fee, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting documen- + * tation, and that the name of Claude Lecommandeur not be used in adverti- + * sing or publicity pertaining to distribution of the software without + * specific, written prior permission. Claude Lecommandeur make no represen- + * tations about the suitability of this software for any purpose. It is + * provided "as is" without express or implied warranty. + * + * Claude Lecommandeur DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO + * EVENT SHALL Claude Lecommandeur BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF + * USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR + * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + * + * Author: Claude Lecommandeur [ lecom@sic.epfl.ch ][ April 1992 ] + */ + +/********************************************************************* + * + * This module has been modified by + * Matthew McNeill (21 Mar 1997) - University of Durham (UK) + * for the support of the X Session Management Protocol + * + ********************************************************************* + * + * Copyright (c) 1996-1997 The University of Durham, UK - + * Department of Computer Science. + * All rights reserved. + * + * Permission is hereby granted, without written agreement and without + * licence or royalty fees, to use, copy, modify, and distribute this + * software and its documentation, provided that usage, copying, modification + * or distribution is not for direct commercial advantage and that the + * above copyright notice and the following two paragraphs appear in + * all copies of this software. To use, copy, modify or distribute this + * software and its documentation otherwise requires a fee and/or specific + * permission. + * + * IN NO EVENT SHALL THE UNIVERSITY OF DURHAM BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT + * OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF THE UNIVERSITY OF + * DURHAM HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * THE UNIVERSITY OF DURHAM SPECIFICALLY DISCLAIMS ANY WARRANTIES, + * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE UNIVERSITY OF DURHAM HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + * + ********************************************************************/ + +/********************************************************************** + * + * $XConsortium: session.c,v 1.18 95/01/04 22:28:37 mor Exp $ + * + * Session support for the X11R6 XSMP (X Session Management Protocol) + * + * 95/01/04 Ralph Mor, X Consortium Initial Version. + * + * Do the necessary modification to be integrated in ctwm. + * Can no longer be used for the standard twm. + * + * 21 Mar 1997 Matthew McNeill, Durham University Modified Version. + * + **********************************************************************/ + +#include + +#ifndef X_NOT_POSIX +#ifdef _POSIX_SOURCE +#include +#else +#define _POSIX_SOURCE +#include +#undef _POSIX_SOURCE +#endif +#endif /* X_NOT_POSIX */ +#ifndef PATH_MAX +#include +#ifndef PATH_MAX +#ifdef MAXPATHLEN +#define PATH_MAX MAXPATHLEN +#else +#define PATH_MAX 1024 +#endif +#endif +#endif /* PATH_MAX */ + +#include +#include +#include +#include "twm.h" +#include "icons.h" +#include "screen.h" +#include "session.h" + +SmcConn smcConn = NULL; +XtInputId iceInputId; +char *twm_clientId; +TWMWinConfigEntry *winConfigHead = NULL; +Bool gotFirstSave = 0; +Bool sent_save_done = 0; + +#define SAVEFILE_VERSION 2 + + +/*===[ Get Client SM_CLIENT_ID ]=============================================*/ + +char *GetClientID (Window window) +/* This function returns the value of the session manager client ID property + * given a valid window handle. If no such property exists on a window then + * null is returned + */ +{ + char *client_id = NULL; + Window client_leader; + XTextProperty tp; + Atom actual_type; + int actual_format; + unsigned long nitems; + unsigned long bytes_after; + Window *prop = NULL; + + if (XGetWindowProperty (dpy, window, _XA_WM_CLIENT_LEADER, + 0L, 1L, False, AnyPropertyType, &actual_type, &actual_format, + &nitems, &bytes_after, (unsigned char **)&prop) == Success) + { + if (actual_type == XA_WINDOW && actual_format == 32 && + nitems == 1 && bytes_after == 0) + { + client_leader = *prop; + + if (XGetTextProperty (dpy, client_leader, &tp, _XA_SM_CLIENT_ID)) + { + if (tp.encoding == XA_STRING && + tp.format == 8 && tp.nitems != 0) + client_id = (char *) tp.value; + } + } + + if (prop) + XFree (prop); + } + + return client_id; +} + +/*===[ Get Window Role ]=====================================================*/ + +char *GetWindowRole (Window window) +/* this function returns the WM_WINDOW_ROLE property of a window + */ +{ + XTextProperty tp; + + if (XGetTextProperty (dpy, window, &tp, _XA_WM_WINDOW_ROLE)) + { + if (tp.encoding == XA_STRING && tp.format == 8 && tp.nitems != 0) + return ((char *) tp.value); + } + + return NULL; +} + +/*===[ Various file write procedures ]=======================================*/ + +static int write_byte (FILE *file, unsigned char b) +{ + if (fwrite ((char *) &b, 1, 1, file) != 1) + return 0; + return 1; +} + +/*---------------------------------------------------------------------------*/ + +static int write_ushort (FILE *file, unsigned short s) +{ + unsigned char file_short[2]; + + file_short[0] = (s & (unsigned)0xff00) >> 8; + file_short[1] = s & 0xff; + if (fwrite ((char *) file_short, (int) sizeof (file_short), 1, file) != 1) + return 0; + return 1; +} + +/*---------------------------------------------------------------------------*/ + +static int write_short (FILE *file, short s) +{ + unsigned char file_short[2]; + + file_short[0] = (s & (unsigned)0xff00) >> 8; + file_short[1] = s & 0xff; + if (fwrite ((char *) file_short, (int) sizeof (file_short), 1, file) != 1) + return 0; + return 1; +} + +/*---------------------------------------------------------------------------* + * Matthew McNeill Feb 1997 - required to save the occupation state as an + * integer. + */ + +static int write_int (FILE *file, int i) +{ + unsigned char file_int[4]; + + file_int[0] = (i & (unsigned)0xff000000) >> 24; + file_int[1] = (i & (unsigned)0x00ff0000) >> 16; + file_int[2] = (i & (unsigned)0x0000ff00) >> 8; + file_int[3] = (i & (unsigned)0x000000ff); + if (fwrite ((char *) file_int, (int) sizeof (file_int), 1, file) != 1) + return 0; + return 1; +} + +/*---------------------------------------------------------------------------*/ + +static int write_counted_string (FILE *file, char *string) +{ + if (string) + { + unsigned char count = strlen (string); + + if (write_byte (file, count) == 0) + return 0; + if (fwrite (string, (int) sizeof (char), (int) count, file) != count) + return 0; + } + else + { + if (write_byte (file, 0) == 0) + return 0; + } + + return 1; +} + +/*===[ various file read procedures ]========================================*/ + +static int read_byte (FILE *file, unsigned char *bp) +{ + if (fread ((char *) bp, 1, 1, file) != 1) + return 0; + return 1; +} + +/*---------------------------------------------------------------------------*/ + +static int read_ushort (FILE *file, unsigned short *shortp) +{ + unsigned char file_short[2]; + + if (fread ((char *) file_short, (int) sizeof (file_short), 1, file) != 1) + return 0; + *shortp = file_short[0] * 256 + file_short[1]; + return 1; +} + +/*---------------------------------------------------------------------------*/ + +static int read_short (FILE *file, short *shortp) +{ + unsigned char file_short[2]; + + if (fread ((char *) file_short, (int) sizeof (file_short), 1, file) != 1) + return 0; + *shortp = file_short[0] * 256 + file_short[1]; + return 1; +} + +/*---------------------------------------------------------------------------* + * Matthew McNeill Feb 1997 - required to save the occupation state as an + * integer. + */ + +static int read_int (FILE *file, int *intp) +{ + unsigned char file_int[4]; + + if (fread ((char *) file_int, (int) sizeof (file_int), 1, file) != 1) + return 0; + *intp = (((int) file_int[0]) << 24) & 0xff000000; + *intp += (((int) file_int[1]) << 16) & 0x00ff0000; + *intp += (((int) file_int[2]) << 8) & 0x0000ff00; + *intp += ((int) file_int[3]); + return 1; +} + +/*---------------------------------------------------------------------------*/ + +static int read_counted_string (FILE *file, char **stringp) +{ + unsigned char len; + char *data; + + if (read_byte (file, &len) == 0) + return 0; + if (len == 0) { + data = 0; + } else { + data = malloc ((unsigned) len + 1); + if (!data) + return 0; + if (fread (data, (int) sizeof (char), (int) len, file) != len) { + free (data); + return 0; + } + data[len] = '\0'; + } + *stringp = data; + return 1; +} + +/*===[ Definition of a window config entry ]=================================== + * + * An entry in the saved window config file looks like this: + * + * FIELD BYTES + * ----- ---- + * SM_CLIENT_ID ID len 1 (may be 0) + * SM_CLIENT_ID LIST of bytes (may be NULL) + * + * WM_WINDOW_ROLE length 1 (may be 0) + * WM_WINDOW_ROLE LIST of bytes (may be NULL) + * + * if no WM_WINDOW_ROLE (length = 0) + * + * WM_CLASS "res name" length 1 + * WM_CLASS "res name" LIST of bytes + * WM_CLASS "res class" length 1 + * WM_CLASS "res class" LIST of bytes + * WM_NAME length 1 (0 if name changed) + * WM_NAME LIST of bytes + * WM_COMMAND arg count 1 (0 if no SM_CLIENT_ID) + * For each arg in WM_COMMAND + * arg length 1 + * arg LIST of bytes + * + * Iconified bool 1 + * Icon info present bool 1 + * + * if icon info present + * icon x 2 + * icon y 2 + * + * Geom x 2 + * Geom y 2 + * Geom width 2 + * Geom height 2 + * + * Width ever changed by user 1 + * Height ever changed by user 1 + * + * ------------------[ Matthew McNeill Feb 1997 ]---------------------------- + * + * Workspace Occupation 4 + * + */ + + +/*===[ Write Window Config Entry to file ]===================================*/ + +int WriteWinConfigEntry (FILE *configFile, TwmWindow *theWindow, + char *clientId, char *windowRole) +/* this function writes a window configuration entry of a given window to + * the given configuration file + */ +{ + char **wm_command; + int wm_command_count, i; + + /* ...unless the config file says otherwise. */ + if (LookInList (Scr == NULL ? ScreenList [0]->DontSave : Scr->DontSave, + theWindow->full_name, &theWindow->class)) + return 1; + + if (!write_counted_string (configFile, clientId)) + return 0; + + if (!write_counted_string (configFile, windowRole)) + return 0; + + if (!windowRole) + { + if (!write_counted_string (configFile, theWindow->class.res_name)) + return 0; + if (!write_counted_string (configFile, theWindow->class.res_class)) + return 0; + if (theWindow->nameChanged) + { + /* + * If WM_NAME changed on this window, we can't use it as + * a criteria for looking up window configurations. See the + * longer explanation in the GetWindowConfig() function below. + */ + + if (!write_counted_string (configFile, NULL)) + return 0; + } + else + { + if (!write_counted_string (configFile, theWindow->name)) + return 0; + } + + wm_command = NULL; + wm_command_count = 0; + XGetCommand (dpy, theWindow->w, &wm_command, &wm_command_count); + + if (clientId || !wm_command || wm_command_count == 0) + { + if (!write_byte (configFile, 0)) + return 0; + } + else + { + if (!write_byte (configFile, (char) wm_command_count)) + return 0; + for (i = 0; i < wm_command_count; i++) + if (!write_counted_string (configFile, wm_command[i])) + return 0; + XFreeStringList (wm_command); + } + } + + /* ===================[ Matthew McNeill Feb 1997 ]========================= * + * there has been a structural change to TwmWindow in ctwm. The Icon information + * is in a sub-structure now. The presence of icon information is not indicative + * of its current state. There is a new boolean condition for this (isicon) + */ + + if (!write_byte (configFile, theWindow->isicon ? 1 : 0)) return 0; /* iconified */ + + /* ===================[ Matthew McNeill Feb 1997 ]========================= * + * there has been a structural change to TwmWindow in ctwm. The Icon information + * is in a sub-structure now, if there is no icon, this sub-structure does + * not exist and the attempted access (below) causes a core dump. + * we need to check that the structure exists before trying to access it + */ + if (theWindow->icon) + { + if (!write_byte (configFile, theWindow->icon->w ? 1 : 0)) return 0; /* icon info exists */ + if (theWindow->icon->w) + { + int icon_x, icon_y; + XGetGeometry (dpy, theWindow->icon->w, &JunkRoot, &icon_x, + &icon_y, &JunkWidth, &JunkHeight, &JunkBW, &JunkDepth); + if (!write_short (configFile, (short) icon_x)) return 0; + if (!write_short (configFile, (short) icon_y)) return 0; + } + } + else + { + if (!write_byte (configFile, 0)) return 0; /* icon does not have any information */ + } + /* ======================================================================= */ + + if (!write_short (configFile, (short) theWindow->frame_x)) + return 0; + if (!write_short (configFile, (short) theWindow->frame_y)) + return 0; + if (!write_ushort (configFile, (unsigned short) theWindow->attr.width)) + return 0; + if (!write_ushort (configFile, (unsigned short) theWindow->attr.height)) + return 0; + if (!write_byte (configFile, theWindow->widthEverChangedByUser ? 1 : 0)) + return 0; + if (!write_byte (configFile, theWindow->heightEverChangedByUser ? 1 : 0)) + return 0; + + /* ===================[ Matthew McNeill Feb 1997 ]=======================* + * write an extra piece of information to the file, this is the occupation + * number and is a bit field of the workspaces occupied by the client. + */ + + if (!write_int (configFile, theWindow->occupation)) + return 0; + + /* ======================================================================*/ + + return 1; +} + +/*===[ Read Window Configuration Entry ]=====================================*/ + +int ReadWinConfigEntry (FILE *configFile, unsigned short version, + TWMWinConfigEntry **pentry) +/* this function reads the next window configuration entry from the given file + * else it returns FALSE if none exists or there is a problem + */ +{ + TWMWinConfigEntry *entry; + unsigned char byte; + int i; + + *pentry = entry = (TWMWinConfigEntry *) malloc ( + sizeof (TWMWinConfigEntry)); + if (!*pentry) + return 0; + + entry->tag = 0; + entry->client_id = NULL; + entry->window_role = NULL; + entry->class.res_name = NULL; + entry->class.res_class = NULL; + entry->wm_name = NULL; + entry->wm_command = NULL; + entry->wm_command_count = 0; + + if (!read_counted_string (configFile, &entry->client_id)) + goto give_up; + + if (!read_counted_string (configFile, &entry->window_role)) + goto give_up; + + if (!entry->window_role) + { + if (!read_counted_string (configFile, &entry->class.res_name)) + goto give_up; + if (!read_counted_string (configFile, &entry->class.res_class)) + goto give_up; + if (!read_counted_string (configFile, &entry->wm_name)) + goto give_up; + + if (!read_byte (configFile, &byte)) + goto give_up; + entry->wm_command_count = byte; + + if (entry->wm_command_count == 0) + entry->wm_command = NULL; + else + { + entry->wm_command = (char **) malloc (entry->wm_command_count * + sizeof (char *)); + + if (!entry->wm_command) + goto give_up; + + for (i = 0; i < entry->wm_command_count; i++) + if (!read_counted_string (configFile, &entry->wm_command[i])) + goto give_up; + } + } + + if (!read_byte (configFile, &byte)) + goto give_up; + + entry->iconified = byte; + + if (!read_byte (configFile, &byte)) + goto give_up; + + entry->icon_info_present = byte; + + if (entry->icon_info_present) + { + if (!read_short (configFile, (short *) &entry->icon_x)) + goto give_up; + if (!read_short (configFile, (short *) &entry->icon_y)) + goto give_up; + } + + if (!read_short (configFile, (short *) &entry->x)) + goto give_up; + if (!read_short (configFile, (short *) &entry->y)) + goto give_up; + if (!read_ushort (configFile, &entry->width)) + goto give_up; + if (!read_ushort (configFile, &entry->height)) + goto give_up; + + if (version > 1) + { + if (!read_byte (configFile, &byte)) + goto give_up; + entry->width_ever_changed_by_user = byte; + + if (!read_byte (configFile, &byte)) + goto give_up; + entry->height_ever_changed_by_user = byte; + } + else + { + entry->width_ever_changed_by_user = False; + entry->height_ever_changed_by_user = False; + } + + /* ===================[ Matthew McNeill Feb 1997 ]======================= * + * read in the occupation information to restore the windows to the + * correct workspaces. + */ + + if (!read_int (configFile, &entry->occupation)) + goto give_up; + + /* ====================================================================== */ + + return 1; + +give_up: + + if (entry->client_id) + free (entry->client_id); + if (entry->window_role) + free (entry->window_role); + if (entry->class.res_name) + free (entry->class.res_name); + if (entry->class.res_class) + free (entry->class.res_class); + if (entry->wm_name) + free (entry->wm_name); + if (entry->wm_command_count) + { + for (i = 0; i < entry->wm_command_count; i++) + if (entry->wm_command[i]) + free (entry->wm_command[i]); + } + if (entry->wm_command) + free ((char *) entry->wm_command); + + free ((char *) entry); + *pentry = NULL; + + return 0; +} + +/*===[ Read In Win Config File ]=============================================*/ + +void ReadWinConfigFile (char *filename) +/* this function reads the window configuration file and stores the information + * in a data structure which is returned + */ +{ + FILE *configFile; + TWMWinConfigEntry *entry; + int done = 0; + unsigned short version; + + configFile = fopen (filename, "rb"); + if (!configFile) + return; + + if (!read_ushort (configFile, &version) || + version > SAVEFILE_VERSION) + { + done = 1; + } + + while (!done) + { + if (ReadWinConfigEntry (configFile, version, &entry)) + { + entry->next = winConfigHead; + winConfigHead = entry; + } + else + done = 1; + } + + fclose (configFile); +} + +/*===[ Get Window Configuration ]============================================* + * Matthew McNeill Feb 1997 - added extra parameter (occupation) to return + * restored occupation of the window + */ + +int GetWindowConfig (TwmWindow *theWindow, short *x, short *y, + unsigned short *width, unsigned short *height, + Bool *iconified, Bool *icon_info_present, + short *icon_x, short *icon_y, + Bool *width_ever_changed_by_user, + Bool *height_ever_changed_by_user, + int *occupation) /* <== [ Matthew McNeill Feb 1997 ] == */ +/* This function attempts to extract all the relevant information from the + * given window and return values via the rest of the parameters to the + * function + */ +{ + char *clientId, *windowRole; + TWMWinConfigEntry *ptr; + int found = 0; + + ptr = winConfigHead; + + if (!ptr) + return 0; + + clientId = GetClientID (theWindow->w); + windowRole = GetWindowRole (theWindow->w); + + while (ptr && !found) + { + int client_id_match = (!clientId && !ptr->client_id) || + (clientId && ptr->client_id && + strcmp (clientId, ptr->client_id) == 0); + + if (!ptr->tag && client_id_match) + { + if (windowRole || ptr->window_role) + { + found = (windowRole && ptr->window_role && + strcmp (windowRole, ptr->window_role) == 0); + } + else + { + /* + * Compare WM_CLASS + only compare WM_NAME if the + * WM_NAME in the saved file is non-NULL. If the + * WM_NAME in the saved file is NULL, this means that + * the client changed the value of WM_NAME during the + * session, and we can not use it as a criteria for + * our search. For example, with xmh, at save time + * the window name might be "xmh: folderY". However, + * if xmh does not properly restore state when it is + * restarted, the initial window name might be + * "xmh: folderX". This would cause the window manager + * to fail in finding the saved window configuration. + * The best we can do is ignore WM_NAME if its value + * changed in the previous session. + */ + + if (strcmp (theWindow->class.res_name, + ptr->class.res_name) == 0 && + strcmp (theWindow->class.res_class, + ptr->class.res_class) == 0 && + (ptr->wm_name == NULL || + strcmp (theWindow->name, ptr->wm_name) == 0)) + { + if (clientId) + { + /* + * If a client ID was present, we should not check + * WM_COMMAND because Xt will put a -xtsessionID arg + * on the command line. + */ + + found = 1; + } + else + { + /* + * For non-XSMP clients, also check WM_COMMAND. + */ + + char **wm_command = NULL; + int wm_command_count = 0, i; + + XGetCommand (dpy, theWindow->w, + &wm_command, &wm_command_count); + + if (wm_command_count == ptr->wm_command_count) + { + for (i = 0; i < wm_command_count; i++) + if (strcmp (wm_command[i], + ptr->wm_command[i]) != 0) + break; + + if (i == wm_command_count) + found = 1; + } + } + } + } + } + + if (!found) + ptr = ptr->next; + } + + if (found) + { + *x = ptr->x; + *y = ptr->y; + *width = ptr->width; + *height = ptr->height; + *iconified = ptr->iconified; + *icon_info_present = ptr->icon_info_present; + *width_ever_changed_by_user = ptr->width_ever_changed_by_user; + *height_ever_changed_by_user = ptr->height_ever_changed_by_user; + + if (*icon_info_present) + { + *icon_x = ptr->icon_x; + *icon_y = ptr->icon_y; + } + + *occupation = ptr->occupation; /* <== [ Matthew McNeill Feb 1997 ] == */ + + ptr->tag = 1; + } + else + *iconified = 0; + + if (clientId) + XFree (clientId); + + if (windowRole) + XFree (windowRole); + + return found; +} + +/*===[ Unique Filename Generator ]===========================================*/ + +static char *unique_filename (char *path, char *prefix) +/* this function attempts to allocate a temporary filename to store the + * information of the windows + */ +{ + +#ifndef X_NOT_POSIX + return ((char *) tempnam (path, prefix)); +#else + char tempFile[PATH_MAX]; + char *tmp; + + sprintf (tempFile, "%s/%sXXXXXX", path, prefix); + tmp = (char *) mktemp (tempFile); + if (tmp) + { + char *ptr = (char *) malloc (strlen (tmp) + 1); + strcpy (ptr, tmp); + return (ptr); + } + else + return (NULL); +#endif +} + +/*===[ SAVE WINDOW INFORMATION ]=============================================*/ + +#ifndef PATH_MAX +# define PATH_MAX 1023 +#endif + +void SaveYourselfPhase2CB (SmcConn smcCon, SmPointer clientData) +/* this is where all the work is done in saving the state of the windows. + * it is not done in Phase One because phase one is used for the other clients + * to make sure that all the property information on their windows is correct + * and up to date + */ +{ + int scrnum; + ScreenInfo *theScreen; + TwmWindow *theWindow; + char *clientId, *windowRole; + FILE *configFile = NULL; + char *path; + char *filename = NULL; + Bool success = False; + SmProp prop1, prop2, prop3, *props[3]; + SmPropValue prop1val, prop2val, prop3val; + char discardCommand[PATH_MAX + 4]; + int numVals, i; + static int first_time = 1; + + if (first_time) + { + char userId[20]; + char hint = SmRestartIfRunning; + + prop1.name = SmProgram; + prop1.type = SmARRAY8; + prop1.num_vals = 1; + prop1.vals = &prop1val; + prop1val.value = Argv[0]; + prop1val.length = strlen (Argv[0]); + + sprintf (userId, "%d", getuid()); + prop2.name = SmUserID; + prop2.type = SmARRAY8; + prop2.num_vals = 1; + prop2.vals = &prop2val; + prop2val.value = (SmPointer) userId; + prop2val.length = strlen (userId); + + prop3.name = SmRestartStyleHint; + prop3.type = SmCARD8; + prop3.num_vals = 1; + prop3.vals = &prop3val; + prop3val.value = (SmPointer) &hint; + prop3val.length = 1; + + props[0] = &prop1; + props[1] = &prop2; + props[2] = &prop3; + + SmcSetProperties (smcCon, 3, props); + + first_time = 0; + } + + path = getenv ("SM_SAVE_DIR"); + if (!path) + { + path = getenv ("HOME"); + if (!path) + path = "."; + } + /*==============[ Matthew McNeill Feb 1997 ]==============* + * changed the unique name to CTWM rather than TWM + * this is tidier and more functional and prevents + * TWM picking up CTWM config files. The format is + * no longer the same since the new format supports + * virtaul workspaces. + *========================================================*/ + if ((filename = unique_filename (path, ".ctwm")) == NULL) + goto bad; + + if (!(configFile = fopen (filename, "wb"))) /* wb = write bytes ? */ + goto bad; + + if (!write_ushort (configFile, SAVEFILE_VERSION)) + goto bad; + + success = True; + + for (scrnum = 0; scrnum < NumScreens && success; scrnum++) + { + if (ScreenList[scrnum] != NULL) + { + theScreen = ScreenList[scrnum]; + theWindow = theScreen->FirstWindow; + + while (theWindow && success) + { + clientId = GetClientID (theWindow->w); + windowRole = GetWindowRole (theWindow->w); + + if (!WriteWinConfigEntry (configFile, theWindow, + clientId, windowRole)) + success = False; + + if (clientId) + XFree (clientId); + + if (windowRole) + XFree (windowRole); + + theWindow = theWindow->next; + } + } + } + + prop1.name = SmRestartCommand; + prop1.type = SmLISTofARRAY8; + + prop1.vals = (SmPropValue *) malloc ( + (Argc + 4) * sizeof (SmPropValue)); + + if (!prop1.vals) + { + success = False; + goto bad; + } + + numVals = 0; + + for (i = 0; i < Argc; i++) + { + if (strcmp (Argv[i], "-clientId") == 0 || + strcmp (Argv[i], "-restore") == 0) + { + i++; + } + else + { + prop1.vals[numVals].value = (SmPointer) Argv[i]; + prop1.vals[numVals++].length = strlen (Argv[i]); + } + } + + prop1.vals[numVals].value = (SmPointer) "-clientId"; + prop1.vals[numVals++].length = 9; + + prop1.vals[numVals].value = (SmPointer) twm_clientId; + prop1.vals[numVals++].length = strlen (twm_clientId); + + prop1.vals[numVals].value = (SmPointer) "-restore"; + prop1.vals[numVals++].length = 8; + + prop1.vals[numVals].value = (SmPointer) filename; + prop1.vals[numVals++].length = strlen (filename); + + prop1.num_vals = numVals; + + sprintf (discardCommand, "rm %s", filename); + prop2.name = SmDiscardCommand; + prop2.type = SmARRAY8; + prop2.num_vals = 1; + prop2.vals = &prop2val; + prop2val.value = (SmPointer) discardCommand; + prop2val.length = strlen (discardCommand); + + props[0] = &prop1; + props[1] = &prop2; + + SmcSetProperties (smcCon, 2, props); + free ((char *) prop1.vals); + + bad: + SmcSaveYourselfDone (smcCon, success); + sent_save_done = 1; + + if (configFile) + fclose (configFile); + + if (filename) + free (filename); +} + +/*===[ Save Yourself SM CallBack ]===========================================*/ + +void SaveYourselfCB (SmcConn smcCon, SmPointer clientData, + int saveType, Bool shutdown, int interactStyle, Bool fast) +/* this procedure is called by the session manager when requesting the + * window manager to save its status, ie all the window configurations + */ +{ + if (!SmcRequestSaveYourselfPhase2 (smcCon, SaveYourselfPhase2CB, NULL)) + { + SmcSaveYourselfDone (smcCon, False); + sent_save_done = 1; + } + else + sent_save_done = 0; +} + +/*===[ Die SM Call Back ]====================================================*/ + +void DieCB (SmcConn smcCon, SmPointer clientData) +/* this procedure is called by the session manager when requesting that the + * application shut istelf down + */ +{ + SmcCloseConnection (smcCon, 0, NULL); + XtRemoveInput (iceInputId); + Done(0); +} + +/*===[ Save Complete SM Call Back ]==========================================*/ + +void SaveCompleteCB (SmcConn smcCon, SmPointer clientData) +/* This function is called to say that the save has been completed and that + * the program can continue its operation + */ +{ + ; +} + +/*===[ Shutdown Cancelled SM Call Back ]=====================================*/ + +void ShutdownCancelledCB (SmcConn smcCon, SmPointer clientData) + +{ + if (!sent_save_done) + { + SmcSaveYourselfDone (smcCon, False); + sent_save_done = 1; + } +} + +/*===[ Process ICE Message ]=================================================*/ + +void ProcessIceMsgProc (XtPointer client_data, int *source, XtInputId *id) + +{ + IceConn ice_conn = (IceConn) client_data; + IceProcessMessages (ice_conn, NULL, NULL); +} + + +/*===[ Connect To Session Manager ]==========================================*/ + +void ConnectToSessionManager (char *previous_id) +/* This procedure attempts to connect to the session manager and setup the + * interclent exchange via the Call Backs + */ +{ + char errorMsg[256]; + unsigned long mask; + SmcCallbacks callbacks; + IceConn iceConn; + + mask = SmcSaveYourselfProcMask | SmcDieProcMask | + SmcSaveCompleteProcMask | SmcShutdownCancelledProcMask; + + callbacks.save_yourself.callback = SaveYourselfCB; + callbacks.save_yourself.client_data = (SmPointer) NULL; + + callbacks.die.callback = DieCB; + callbacks.die.client_data = (SmPointer) NULL; + + callbacks.save_complete.callback = SaveCompleteCB; + callbacks.save_complete.client_data = (SmPointer) NULL; + + callbacks.shutdown_cancelled.callback = ShutdownCancelledCB; + callbacks.shutdown_cancelled.client_data = (SmPointer) NULL; + + smcConn = SmcOpenConnection ( + NULL, /* use SESSION_MANAGER env */ + (SmPointer) appContext, + SmProtoMajor, + SmProtoMinor, + mask, + &callbacks, + previous_id, + &twm_clientId, + 256, errorMsg); + + if (smcConn == NULL) + { +#ifdef DEBUG + /* == [ Matthew McNeill Feb 1997 ] == */ + fprintf (stderr, "%s : Connection to session manager failed. (%s)",ProgramName, errorMsg); +#endif + return; + } + + iceConn = SmcGetIceConnection (smcConn); + + iceInputId = XtAppAddInput ( + appContext, + IceConnectionNumber (iceConn), + (XtPointer) XtInputReadMask, + ProcessIceMsgProc, + (XtPointer) iceConn); +} Index: external/mit/ctwm/dist/session.h =================================================================== RCS file: external/mit/ctwm/dist/session.h diff -N external/mit/ctwm/dist/session.h --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/session.h 3 Sep 2015 12:19:59 -0000 @@ -0,0 +1,73 @@ +/* + * [ ctwm ] + * + * Copyright 2004 Richard Levitte + * + * Permission to use, copy, modify and distribute this software [ctwm] and + * its documentation for any purpose is hereby granted without fee, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting documen- + * tation, and that the name of Claude Lecommandeur not be used in adverti- + * sing or publicity pertaining to distribution of the software without + * specific, written prior permission. Claude Lecommandeur make no represen- + * tations about the suitability of this software for any purpose. It is + * provided "as is" without express or implied warranty. + * + * Claude Lecommandeur DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO + * EVENT SHALL Claude Lecommandeur BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF + * USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR + * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + * + * Author: Richard Levitte [ richard@levitte.org ][ June 2004 ] + */ + +#include +#ifdef VMS +# include +#else +# include +#endif +#include "types.h" + +#ifndef _SESSION_ +#define _SESSION_ + +extern SmcConn smcConn; +extern XtInputId iceInputId; +extern char *twm_clientId; +extern TWMWinConfigEntry *winConfigHead; +extern Bool gotFirstSave; +extern Bool sent_save_done; + +char *GetClientID (Window window); +char *GetWindowRole (Window window); +int WriteWinConfigEntry (FILE *configFile, TwmWindow *theWindow, + char *clientId, char *windowRole); +int ReadWinConfigEntry (FILE *configFile, unsigned short version, + TWMWinConfigEntry **pentry); +void ReadWinConfigFile (char *filename); +int GetWindowConfig (TwmWindow *theWindow, + short *x, short *y, + unsigned short *width, unsigned short *height, + Bool *iconified, + Bool *icon_info_present, + short *icon_x, short *icon_y, + Bool *width_ever_changed_by_user, + Bool *height_ever_changed_by_user, + int *occupation /* <== [ Matthew McNeill Feb 1997 ] == */ + ); +void SaveYourselfPhase2CB (SmcConn smcCon, SmPointer clientData); +void SaveYourselfCB (SmcConn smcCon, SmPointer clientData, + int saveType, Bool shutdown, + int interactStyle, Bool fast); +void DieCB (SmcConn smcCon, SmPointer clientData); +void SaveCompleteCB (SmcConn smcCon, SmPointer clientData); +void ShutdownCancelledCB (SmcConn smcCon, SmPointer clientData); +void ProcessIceMsgProc (XtPointer client_data, int *source, XtInputId *id); +void ConnectToSessionManager (char *previous_id); + +#endif /* _SESSION_ */ + Index: external/mit/ctwm/dist/siconify.bm =================================================================== RCS file: external/mit/ctwm/dist/siconify.bm diff -N external/mit/ctwm/dist/siconify.bm --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/siconify.bm 3 Sep 2015 12:19:59 -0000 @@ -0,0 +1,8 @@ +#define siconify_width 11 +#define siconify_height 11 + +#ifdef __WANT_SICONIFY_BITS +static unsigned char siconify_bits[] = { + 0xff, 0x07, 0x01, 0x04, 0x0d, 0x05, 0x9d, 0x05, 0xb9, 0x04, 0x51, 0x04, + 0xe9, 0x04, 0xcd, 0x05, 0x85, 0x05, 0x01, 0x04, 0xff, 0x07}; +#endif Index: external/mit/ctwm/dist/sound.c =================================================================== RCS file: external/mit/ctwm/dist/sound.c diff -N external/mit/ctwm/dist/sound.c --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/sound.c 3 Sep 2015 12:19:59 -0000 @@ -0,0 +1,237 @@ +/* + * [ ctwm ] + * + * Copyright 1992 Claude Lecommandeur. + * + * Permission to use, copy, modify and distribute this software [ctwm] and + * its documentation for any purpose is hereby granted without fee, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting documen- + * tation, and that the name of Claude Lecommandeur not be used in adverti- + * sing or publicity pertaining to distribution of the software without + * specific, written prior permission. Claude Lecommandeur make no represen- + * tations about the suitability of this software for any purpose. It is + * provided "as is" without express or implied warranty. + * + * Claude Lecommandeur DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO + * EVENT SHALL Claude Lecommandeur BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF + * USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR + * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + * + * Author: Claude Lecommandeur [ lecom@sic.epfl.ch ][ April 1992 ] + */ +/* + * These routines were extracted from the sound hack for olvwm3.3 by + * Andrew "Ender" Scherpbier (turtle@sciences.sdsu.edu) + * and modified by J.E. Sacco (jsacco @ssl.com) + */ + +#include +#include +#include +#include + +#include "sound.h" + +char *eventNames[] = +{ + "", + "", + "KeyPress", + "KeyRelease", + "ButtonPress", + "ButtonRelease", + "MotionNotify", + "EnterNotify", + "LeaveNotify", + "FocusIn", + "FocusOut", + "KeymapNotify", + "Expose", + "GraphicsExpose", + "NoExpose", + "VisibilityNotify", + "CreateNotify", + "DestroyNotify", + "UnmapNotify", + "MapNotify", + "MapRequest", + "ReparentNotify", + "ConfigureNotify", + "ConfigureRequest", + "GravityNotify", + "ResizeRequest", + "CirculateNotify", + "CirculateRequest", + "PropertyNotify", + "SelectionClear", + "SelectionRequest", + "SelectionNotify", + "ColormapNotify", + "ClientMessage", + "MappingNotify", + "Startup", + "Shutdown" +}; + +#define NEVENTS (sizeof(eventNames) / sizeof(char *)) + +RPLAY *rp[NEVENTS]; + +static int need_sound_init = 1; +static int sound_fd = 0; +static int sound_state = 1; +static int startup_sound = NEVENTS -2; +static int exit_sound = NEVENTS -1; +static char hostname[200]; + +/* + * Function to trim away spaces at the start and end of a string + */ +static char * +trim_spaces(char *str) +{ + if (str != NULL) { + char *p = str + strlen(str); + while(*str != '\0' && *str != '\r' && *str != '\n' && isspace(*str)) + str++; + /* Assume all line end characters are at the end */ + while(p > str && isspace(p[-1])) + p--; + *p = '\0'; + } + return str; +} + +/* + * initialize + */ +static void +sound_init (void) +{ + int i; + FILE *fl; + char buffer[100]; + char *token; + char *home; + char soundfile [256]; + + need_sound_init = 0; + if (sound_fd == 0) { + if (hostname[0] == '\0') { + strcpy(hostname, rplay_default_host()); + } + + if ((sound_fd = rplay_open (hostname)) < 0) + rplay_perror ("create"); + } + + /* + * Destroy any old sounds + */ + for (i = 0; i < NEVENTS; i++) { + if (rp[i] != NULL) + rplay_destroy (rp[i]); + rp[i] = NULL; + } + + /* + * Now read the file which contains the sounds + */ + soundfile [0] = '\0'; + if ((home = getenv ("HOME")) != NULL) strcpy (soundfile, home); + strcat (soundfile, "/.ctwm-sounds"); + fl = fopen (soundfile, "r"); + if (fl == NULL) + return; + while (fgets (buffer, 100, fl) != NULL) { + token = trim_spaces(strtok (buffer, ": \t")); + if (token == NULL || *token == '#') + continue; + for (i = 0; i < NEVENTS; i++) { + if (strcmp (token, eventNames[i]) == 0) { + token = trim_spaces(strtok (NULL, "\r\n")); + if (token == NULL || *token == '#') + continue; + rp[i] = rplay_create (RPLAY_PLAY); + if (rp[i] == NULL) { + rplay_perror ("create"); + continue; + } + if (rplay_set(rp[i], RPLAY_INSERT, 0, RPLAY_SOUND, token, NULL) + < 0) + rplay_perror ("rplay"); + } + } + } + fclose (fl); +} + + +/* + * Play sound + */ +void +play_sound (int snd) +{ + if (snd > NEVENTS) return; + if (sound_state == 0) + return; + + if (need_sound_init) + sound_init (); + + if (rp[snd] == NULL) + return; + if (rplay (sound_fd, rp[snd]) < 0) + rplay_perror ("create"); +} + +void +play_startup_sound(void) +{ + play_sound(startup_sound); +} + +void +play_exit_sound(void) +{ + play_sound(exit_sound); +} + +/* + * Toggle the sound on/off + */ +void +toggle_sound (void) +{ + sound_state ^= 1; +} + + +/* + * Re-read the sounds mapping file + */ +void +reread_sounds (void) +{ + sound_init (); +} + +/* + * Set the SoundHost and force the sound_fd to be re-opened. + */ +void +set_sound_host(char *host) +{ + strcpy(hostname, host); + if (sound_fd != 0) + { + rplay_close(sound_fd); + } + sound_fd = 0; +} + Index: external/mit/ctwm/dist/sound.doc =================================================================== RCS file: external/mit/ctwm/dist/sound.doc diff -N external/mit/ctwm/dist/sound.doc --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/sound.doc 3 Sep 2015 12:19:59 -0000 @@ -0,0 +1,104 @@ +Here are some rplay sound patches for ctwm 3.0. Just in case you don't know +what rplay is, here's some information from the README file: + +[README INFO] +WHAT IS RPLAY? +-------------- +rplay is a sound package that supports both local and remote sound control. +rplay is based on client/server communication using two protocols. The first +protocol that can be used is RPLAY, which is UDP based and allows sounds to +be played, paused, continued, and stopped. The second protocol is RPTP +(the Remote Play Transfer Protocol) which is TCP based and allows sounds to be +played, paused, continued, stopped, and transferred. + +The rplay system can be described as follows. An rplay client sends an RPLAY +UDP packet to an rplay server. The RPLAY packet sent contains the name of a +sound file and various other sound attributes. The rplay server receives the +RPLAY packet and looks up the sound in a sound file database. If the sound +is found in the database it will be immediately played on the host the rplay +server is running on. If the sound is not found in the database the rplay +server can be configured to search other rplay servers for the desired sound +file. rplay servers communicate using the RPTP protocol. rplay clients can +also use RPTP to upload sounds to an rplay server. When an rplay server +receives sounds from a server or a client the sounds are stored in a sound +cache directory. The size in bytes of the cache directory can be limited +by the rplay server. When the cache is full, the rplay server will remove +sounds using a "least recently used" algorithm. Sound files that are larger +than the maximum cache size will not be accepted by the rplay server. + +rplay can be used to easily add sound to any application. For example, +if you want to play a sound when a button is pressed, all you need to do +is this: + + rplay_local("sound_name.au"); + +If you want to specify a hostname: + + rplay_host("bozo.sdsu.edu", "sound_name.au"); + +The above routines along with many others are included in the rplay library. +See the KNOWN RPLAY APPLICATIONS section of this file for a list of applications +that use the rplay library. + +Currently the rplay server only supports u-law 8000hz sound files. + +PORTING: +-------- +rplay is known to work on the following systems: + + * Sun SPARCstations running SunOS 4.1.x + + * Sun SPARCstations running Solaris 2.x + + * HP-UX + + * Linux + + * BSDI/386 + + * 386bsd using Steve Haehnichen's soundblaster driver version 1.5 + + * SGI Indigo + +All rplay requires is an audio device where sounds can be played using the +write system call. For example, if you can "cat sound_file > /dev/audio", +then rplay should work. If your system has an audio device that does not work +with the above "cat" command, there is still hope but you might need to do some +programming. You will probably only need to modify rplayd/audio.c. +If you port rplay to another system please send me patches. +[END OF README INFO] + +rplay support has been added to the olvwm, twm, tvtwm, and ctwm window managers +and many games like XTank, XPilot, and XBoing just to name a few. + +If you are interested, you can obtain rplay at sounds.sdsu.edu in the /pub/rplay +directory or I can mail you a copy. + +I would also like to give proper credit for the window manager patches. +Olvwm patches where originally implemented by Andrew "Ender" Scherpbier (Andrew@SDSU.Edu) +and were later modified to support tvtwm and twm by J.E. Sacco (jsacco @ssl.com). +I slightly modified the tvtwm patches to support ctwm. + +Oops, I forgot to tell you what has been changed in ctwm. Two new functions have +been added: + + f.rereadsounds - rereads the .ctwm-sounds file + f.togglesound - turns on/off the sound + +and I added: + + SoundHost "hostname" - where hostname is the host to play sounds on. + +The .ctwm-sounds file has the following format : + +KeyPress: Cork.au +MapNotify: turbbeep.au +ResizeRequest: failure.au +Startup: 2lust.au +Shutdown: 1sadeness.au + +-- +Mark Boyns +boyns@sdsu.edu + + Index: external/mit/ctwm/dist/sound.h =================================================================== RCS file: external/mit/ctwm/dist/sound.h diff -N external/mit/ctwm/dist/sound.h --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/sound.h 3 Sep 2015 12:19:59 -0000 @@ -0,0 +1,32 @@ +/* + * [ ctwm ] + * + * Copyright 1992 Claude Lecommandeur. + * + * Permission to use, copy, modify and distribute this software [ctwm] and + * its documentation for any purpose is hereby granted without fee, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting documen- + * tation, and that the name of Claude Lecommandeur not be used in adverti- + * sing or publicity pertaining to distribution of the software without + * specific, written prior permission. Claude Lecommandeur make no represen- + * tations about the suitability of this software for any purpose. It is + * provided "as is" without express or implied warranty. + * + * Claude Lecommandeur DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO + * EVENT SHALL Claude Lecommandeur BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF + * USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR + * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + * + * Author: Claude Lecommandeur [ lecom@sic.epfl.ch ][ April 1992 ] + */ + +extern void play_sound(int snd); +extern void play_startup_sound(void); +extern void play_exit_sound(void); +extern void toggle_sound(void); +extern void reread_sounds(void); +extern void set_sound_host(char *host); Index: external/mit/ctwm/dist/system.ctwmrc =================================================================== RCS file: external/mit/ctwm/dist/system.ctwmrc diff -N external/mit/ctwm/dist/system.ctwmrc --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/system.ctwmrc 3 Sep 2015 12:19:59 -0000 @@ -0,0 +1,181 @@ +# +# $XConsortium: system.twmrc,v 1.8 91/04/23 21:10:58 gildea Exp $ +# +# Default twm configuration file; needs to be kept small to conserve string +# space in systems whose compilers don't handle medium-sized strings. +# +# Sites should tailor this file, providing any extra title buttons, menus, etc. +# that may be appropriate for their environment. For example, if most of the +# users were accustomed to uwm, the defaults could be set up not to decorate +# any windows and to use meta-keys. +# + +NoGrabServer +RestartPreviousState +DecorateTransients +TitleFont "-adobe-helvetica-bold-r-normal--*-120-*-*-*-*-*-*" +ResizeFont "-adobe-helvetica-bold-r-normal--*-120-*-*-*-*-*-*" +MenuFont "-adobe-helvetica-bold-r-normal--*-120-*-*-*-*-*-*" +IconFont "-adobe-helvetica-bold-r-normal--*-100-*-*-*-*-*-*" +IconManagerFont "-adobe-helvetica-bold-r-normal--*-100-*-*-*" +ShowWorkSpaceManager # start with workspace manager up +UseThreeDMenus +UseThreeDTitles +UseThreeDIconManagers +UseThreeDBorders +UseThreeDWMap +SunkFocusWindowTitle + +WorkSpaceManagerGeometry "360x60+60-0" 4 +WorkSpaces { + "One" {"#686B9F" "white" "DeepSkyBlue3" "white" "xpm:background8.xpm"} + "Two" {"#619AAE" "white" "firebrick" "white" "plaid"} + "Three" {"#727786" "white" "brown"} + "Four" {"#8C5b7A" "white" "MidnightBlue"} + + "Five" {"#727786" "white" "firebrick"} + "Six" {"#619AAE" "white" "DeepSkyBlue3"} + "Seven" {"#8C5b7A" "white" "chartreuse4"} + "Eight" {"#686B9F" "white" "MidnightBlue"} +} + +Color +{ + BorderColor "Red" + DefaultBackground "blue" + DefaultForeground "gray85" + BorderTileBackground "DeepSkyBlue1" { + "xterm" "DeepSkyBlue3" + } + BorderTileForeground "Black" { + "xterm" "DeepSkyBlue3" + } + TitleBackground "DeepSkyBlue1" { + "xterm" "DeepSkyBlue3" + } + TitleForeground "Black" { + "xterm" "White" + } + MenuBackground "#686B9F" + MenuForeground "white" + MenuTitleBackground "gray70" + MenuTitleForeground "White" + IconBackground "LightSlateBlue" + IconForeground "White" + IconBorderColor "gray85" + IconManagerBackground "DeepSkyBlue1" {"Axe" "DeepSkyBlue3" "xload" "DeepSkyBlue2"} + IconManagerForeground "Black" + MapWindowBackground "DeepSkyBlue1" { + "root*" "Red" + "xterm" "DeepSkyBlue3" + "Axe" "Yellow" + } + MapWindowForeground "Black" { + "xterm" "White" + } +} + +IconManagerGeometry "202x300-0+0" 1 +IconManagerDontShow { + "WorkSpaceManager" +} + +NoTitle { # little programs that look like icons + "TWM Icon Manager" + "WorkSpaceManager" +} +# +# Define some useful functions for motion-based actions. +# +MoveDelta 3 +Function "move-or-lower" { f.move f.deltastop f.lower } +Function "move-or-raise" { f.move f.deltastop f.raise } +Function "move-or-iconify" { f.move f.deltastop f.iconify } + +# +# Set some useful bindings. Sort of uwm-ish, sort of simple-button-ish +# +Button1 = : root : f.menu "defops" +Button2 = : root : f.menu "windowops" + +Button1 = m : window|icon : f.function "move-or-lower" +Button2 = m : window|icon : f.iconify +Button3 = m : window|icon : f.function "move-or-raise" + +Button1 = : title : f.function "move-or-raise" +Button2 = : title : f.raiselower +Button1 = m : title : f.movetitlebar + +Button1 = : icon : f.function "move-or-iconify" +Button2 = : icon : f.iconify + +Button1 = : iconmgr : f.iconify +Button2 = : iconmgr : f.iconify + +Button1 = : frame : f.resize +Button1 = m : frame : f.move +Button2 = : frame : f.raiselower +# +# And a menus with the usual things +# +menu "defops" +{ + "Twm" f.title + "Xterm" !"xterm&" + "Calculator" !"xcalc&" + "Xman" !"xman &" + "Xmag" !"xmag&" + "" f.nop + "Restart" f.restart + "Exit" f.quit +} + +menu "windowops" { + "Windows" f.title + "Occupy" f.occupy + "Occupy All" f.occupyall + "Iconify" f.iconify + "Refresh" f.refresh + "Vanish" f.vanish + "Info" f.identify + "" f.separator + "Resize" f.resize + "Move" f.move + "Adopt Window" f.adoptwindow + "Animate" f.startanimation + "Don't animate" f.stopanimation + "" f.separator + "Send Delete" f.delete + "Kill Window" f.destroy + "Pin menu" f.pin +} + +menu "windowmenu" { + "Occupy ..." f.occupy + "Occupy All" f.occupyall + "Iconify" f.iconify + "RaiseLower" f.raiselower + "Refresh" f.winrefresh + "Zoom" f.menu "Zoom" + "Vanish" f.vanish + "Focus" f.focus + "Unfocus" f.unfocus + "" f.separator + "Send Delete" f.delete + "Kill Window" f.destroy + "Resize..." f.resize + "Move..." f.move +} + +menu "iconmenu" { + "Actions" f.title + "" f.separator + "Restore" f.iconify + "Move" f.move + "Occupy ..." f.occupy + "Occupy All" f.occupyall + "" f.separator + "Send Delete" f.delete + "Kill Window" f.destroy +} + Index: external/mit/ctwm/dist/system.ctwmrc.gnome =================================================================== RCS file: external/mit/ctwm/dist/system.ctwmrc.gnome diff -N external/mit/ctwm/dist/system.ctwmrc.gnome --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/system.ctwmrc.gnome 3 Sep 2015 12:19:59 -0000 @@ -0,0 +1,24 @@ +# Changes relative to system.ctwmrc for gnome + +# Don't enable this +#ShowWorkSpaceManager + +# Additional things to hide/ignore +NoTitle { + "panel" + "gmc-desktop-icon" +} +OccupyAll { + "panel" +} +NoBorder { + "panel" + "gmc-desktop-icon" +} + +# Don't use icon manager +NoIconManagers + +# May need different bindings +Button1 = m : root : f.menu "defops" +Button2 = m : root : f.menu "windowops" Index: external/mit/ctwm/dist/twm.h =================================================================== RCS file: external/mit/ctwm/dist/twm.h diff -N external/mit/ctwm/dist/twm.h --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/twm.h 3 Sep 2015 12:19:59 -0000 @@ -0,0 +1,564 @@ +/*****************************************************************************/ +/** Copyright 1988 by Evans & Sutherland Computer Corporation, **/ +/** Salt Lake City, Utah **/ +/** Portions Copyright 1989 by the Massachusetts Institute of Technology **/ +/** Cambridge, Massachusetts **/ +/** **/ +/** All Rights Reserved **/ +/** **/ +/** Permission to use, copy, modify, and distribute this software and **/ +/** its documentation for any purpose and without fee is hereby **/ +/** granted, provided that the above copyright notice appear in all **/ +/** copies and that both that copyright notice and this permis- **/ +/** sion notice appear in supporting documentation, and that the **/ +/** names of Evans & Sutherland and M.I.T. not be used in advertising **/ +/** in publicity pertaining to distribution of the software without **/ +/** specific, written prior permission. **/ +/** **/ +/** EVANS & SUTHERLAND AND M.I.T. DISCLAIM ALL WARRANTIES WITH REGARD **/ +/** TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANT- **/ +/** ABILITY AND FITNESS, IN NO EVENT SHALL EVANS & SUTHERLAND OR **/ +/** M.I.T. BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAM- **/ +/** AGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA **/ +/** OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER **/ +/** TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE **/ +/** OR PERFORMANCE OF THIS SOFTWARE. **/ +/*****************************************************************************/ +/* + * [ ctwm ] + * + * Copyright 1992 Claude Lecommandeur. + * + * Permission to use, copy, modify and distribute this software [ctwm] and + * its documentation for any purpose is hereby granted without fee, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting documen- + * tation, and that the name of Claude Lecommandeur not be used in adverti- + * sing or publicity pertaining to distribution of the software without + * specific, written prior permission. Claude Lecommandeur make no represen- + * tations about the suitability of this software for any purpose. It is + * provided "as is" without express or implied warranty. + * + * Claude Lecommandeur DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO + * EVENT SHALL Claude Lecommandeur BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF + * USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR + * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + * + * Author: Claude Lecommandeur [ lecom@sic.epfl.ch ][ April 1992 ] + */ + + +/*********************************************************************** + * + * $XConsortium: twm.h,v 1.74 91/05/31 17:38:30 dave Exp $ + * + * twm include file + * + * 28-Oct-87 Thomas E. LaStrange File created + * 10-Oct-90 David M. Sternlicht Storeing saved colors on root + ***********************************************************************/ + +#ifndef _TWM_ +#define _TWM_ + +#ifdef DMALLOC +#include +#endif + +#ifdef VMS +#include +#include +#include +#include +#include +#include +#else +#include +#include +#include +#include +#include +#include +#endif /* VMS */ +#include "types.h" +#include "list.h" + +#ifndef WithdrawnState +#define WithdrawnState 0 +#endif + +#define MAXVIRTUALSCREENS (sizeof (int)) + +#define PIXEL_ALREADY_TYPEDEFED /* for Xmu/Drawing.h */ + +#ifdef SIGNALRETURNSINT +#define SIGNAL_T int +#define SIGNAL_RETURN return 0 +#else +#define SIGNAL_T void +#define SIGNAL_RETURN return +#endif + +typedef SIGNAL_T (*SigProc)(int); /* type of function returned by signal() */ + +#if defined(USE_SIGNALS) && defined(SVR4) && !defined(__sgi) +#define signal sigset +#endif /* SVR4 */ + +#define BW 2 /* border width */ +#define BW2 4 /* border width * 2 */ + +#ifndef TRUE +#define TRUE 1 +#define FALSE 0 +#endif + +#define NULLSTR ((char *) NULL) + +#define MAX_BUTTONS 11 /* max mouse buttons supported */ + +/* info stings defines */ +#define INFO_LINES 30 +#define INFO_SIZE 200 + +/* contexts for button presses */ +#define Alt1Mask (1<<8) +#define Alt2Mask (1<<9) +#define Alt3Mask (1<<10) +#define Alt4Mask (1<<11) +#define Alt5Mask (1<<12) + +#define C_NO_CONTEXT -1 +#define C_WINDOW 0 +#define C_TITLE 1 +#define C_ICON 2 +#define C_ROOT 3 +#define C_FRAME 4 +#define C_ICONMGR 5 +#define C_NAME 6 +#define C_IDENTIFY 7 +#define C_ALTERNATE 8 +#define C_WORKSPACE 9 +#define NUM_CONTEXTS 10 + +#define C_WINDOW_BIT (1 << C_WINDOW) +#define C_TITLE_BIT (1 << C_TITLE) +#define C_ICON_BIT (1 << C_ICON) +#define C_ROOT_BIT (1 << C_ROOT) +#define C_FRAME_BIT (1 << C_FRAME) +#define C_ICONMGR_BIT (1 << C_ICONMGR) +#define C_NAME_BIT (1 << C_NAME) +#define C_ALTER_BIT (1 << C_ALTERNATE) +#define C_WORKSPACE_BIT (1 << C_WORKSPACE) + +#define C_ALL_BITS (C_WINDOW_BIT | C_TITLE_BIT | C_ICON_BIT |\ + C_ROOT_BIT | C_FRAME_BIT | C_ICONMGR_BIT |\ + C_WORKSPACE_BIT) + +/* modifiers for button presses */ +#define MOD_SIZE ((ShiftMask | ControlMask | Mod1Mask \ + | Mod2Mask | Mod3Mask | Mod4Mask | Mod5Mask) + 1) + +#define TITLE_BAR_SPACE 1 /* 2 pixel space bordering chars */ +#define TITLE_BAR_FONT_HEIGHT 15 /* max of 15 pixel high chars */ +#define TITLE_BAR_HEIGHT (TITLE_BAR_FONT_HEIGHT+(2*TITLE_BAR_SPACE)) + +/* defines for zooming/unzooming */ +#define ZOOM_NONE 0 + +#define FBF(fix_fore, fix_back, fix_font)\ + Gcv.foreground = fix_fore;\ + Gcv.background = fix_back;\ + Gcv.font = fix_font;\ + XChangeGC(dpy, Scr->NormalGC, GCFont|GCForeground|GCBackground,&Gcv) + +#define FB(fix_fore, fix_back)\ + Gcv.foreground = fix_fore;\ + Gcv.background = fix_back;\ + XChangeGC(dpy, Scr->NormalGC, GCForeground|GCBackground,&Gcv) + +#define MaxSize(a, b) (((a) < (b)) ? (b) : (a)) +#define MinSize(a, b) (((a) > (b)) ? (b) : (a)) + +struct MyFont +{ + char *basename; /* name of the font */ + XFontSet font_set; + int ascent; + int descent; + int height; /* height of the font */ + int y; /* Y coordinate to draw characters */ +}; + +struct ColorPair +{ + Pixel fore, back, shadc, shadd; +}; + +typedef enum {on, off} ButtonState; + +struct _TitleButtonFunc { + struct _TitleButtonFunc *next; /* next in the list of function buttons */ + int num; /* button number */ + int mods; /* modifiers */ + int func; /* function to execute */ + char *action; /* optional action arg */ + struct MenuRoot *menuroot; /* menu to pop on F_MENU */ +}; + +struct _TitleButton { + struct _TitleButton *next; /* next link in chain */ + char *name; /* bitmap name in case of deferal */ + Image *image; /* image to display in button */ + int srcx, srcy; /* from where to start copying */ + unsigned int width, height; /* size of pixmap */ + int dstx, dsty; /* to where to start copying */ + Bool rightside; /* t: on right, f: on left */ + TitleButtonFunc *funs; /* funcs assoc'd to each button */ +}; + +struct _TBWindow { + Window window; /* which window in this frame */ + Image *image; /* image to display in button */ + TitleButton *info; /* description of this window */ +}; + +struct _SqueezeInfo { + int justify; /* left, center, right */ + int num; /* signed pixel count or numerator */ + int denom; /* 0 for pix count or denominator */ +}; + +#define J_UNDEF 0 +#define J_LEFT 1 +#define J_CENTER 2 +#define J_RIGHT 3 +#define J_BORDER 4 +#define J_TOP 5 +#define J_BOTTOM 6 + +/* Colormap window entry for each window in WM_COLORMAP_WINDOWS + * ICCCM property. + */ +struct TwmColormap +{ + Colormap c; /* Colormap id */ + int state; /* install(ability) state */ + unsigned long install_req; /* request number which installed it */ + Window w; /* window causing load of color table */ + int refcnt; +}; + +#define CM_INSTALLABLE 1 +#define CM_INSTALLED 2 +#define CM_INSTALL 4 + +struct ColormapWindow +{ + Window w; /* Window id */ + TwmColormap *colormap; /* Colormap for this window */ + int visibility; /* Visibility of this window */ + int refcnt; +}; + +struct Colormaps +{ + ColormapWindow **cwins; /* current list of colormap windows */ + int number_cwins; /* number of elements in current list */ + char *scoreboard; /* conflicts between installable colortables */ +}; + +#define ColormapsScoreboardLength(cm) ((cm)->number_cwins * \ + ((cm)->number_cwins - 1) / 2) + +struct WindowRegion { + struct WindowRegion *next; + int x, y, w, h; + int grav1, grav2; + name_list *clientlist; + struct WindowEntry *entries; +}; + +struct WindowEntry { + struct WindowEntry *next; + int x, y, w, h; + struct TwmWindow *twm_win; + short used; +}; + +struct _WindowBox { + struct _WindowBox *next; + char *name; + char *geometry; + name_list *winlist; + Window window; + struct TwmWindow *twmwin; +}; + +/* for each window that is on the display, one of these structures + * is allocated and linked into a list + */ +struct TwmWindow +{ + struct TwmWindow *next; /* next twm window */ + struct TwmWindow *prev; /* previous twm window */ + Window w; /* the child window */ + int old_bw; /* border width before reparenting */ + Window frame; /* the frame window */ + Window title_w; /* the title bar window */ + Window hilite_wl; /* the left hilite window */ + Window hilite_wr; /* the right hilite window */ + Window lolite_wl; /* the left lolite window */ + Window lolite_wr; /* the right lolite window */ + Cursor curcurs; /* current resize cursor */ + Pixmap gray; + struct Icon *icon; /* the curent icon */ + name_list *iconslist; /* the current list of icons */ + int frame_x; /* x position of frame */ + int frame_y; /* y position of frame */ + unsigned int frame_width; /* width of frame */ + unsigned int frame_height; /* height of frame */ + int frame_bw; /* borderwidth of frame */ + int frame_bw3D; /* 3D borderwidth of frame */ + int actual_frame_x; /* save frame_y of frame when squeezed */ + int actual_frame_y; /* save frame_x of frame when squeezed */ + unsigned int actual_frame_width; /* save width of frame when squeezed */ + unsigned int actual_frame_height; /* save height of frame when squeezed */ + int title_x; + int title_y; + unsigned int title_height; /* height of the title bar */ + unsigned int title_width; /* width of the title bar */ + char *full_name; /* full name of the window */ + char *name; /* name of the window */ + char *icon_name; /* name of the icon */ + int name_x; /* start x of name text */ + unsigned int name_width; /* width of name text */ + int highlightxl; /* start of left highlight window */ + int highlightxr; /* start of right highlight window */ + int rightx; /* start of right buttons */ + XWindowAttributes attr; /* the child window attributes */ + XSizeHints hints; /* normal hints */ + XWMHints *wmhints; /* WM hints */ + Window group; /* group ID */ + XClassHint class; + struct WList *iconmanagerlist;/* iconmanager subwindows */ + /*********************************************************************** + * color definitions per window + **********************************************************************/ + ColorPair borderC; /* border color */ + ColorPair border_tile; + ColorPair title; + short iconified; /* has the window ever been iconified? */ + short isicon; /* is the window an icon now ? */ + short icon_on; /* is the icon visible */ + short mapped; /* is the window mapped ? */ + short squeezed; /* is the window squeezed ? */ + short auto_raise; /* should we auto-raise this window ? */ + short auto_lower; /* should we auto-lower this window ? */ + short forced; /* has had an icon forced upon it */ + short icon_not_ours; /* icon pixmap or window supplied to us */ + short icon_moved; /* user explicitly moved the icon */ + short highlight; /* should highlight this window */ + short stackmode; /* honor stackmode requests */ + short ontoppriority; /* how much on top should that be */ + short iconify_by_unmapping; /* unmap window to iconify it */ + short iconmgr; /* this is an icon manager window */ + short wspmgr; /* this is a workspace manager manager window */ + short transient; /* this is a transient window */ + Window transientfor; /* window contained in XA_XM_TRANSIENT_FOR */ + short titlehighlight; /* should I highlight the title bar */ + struct IconMgr *iconmgrp; /* pointer to it if this is an icon manager */ + int save_frame_x; /* x position of frame */ + int save_frame_y; /* y position of frame */ + unsigned int save_frame_width; /* width of frame */ + unsigned int save_frame_height; /* height of frame */ + short zoomed; /* is the window zoomed? */ + short wShaped; /* this window has a bounding shape */ + unsigned long protocols; /* which protocols this window handles */ + Colormaps cmaps; /* colormaps for this application */ + TBWindow *titlebuttons; + SqueezeInfo *squeeze_info; /* should the title be squeezed? */ + int squeeze_info_copied; /* must above SqueezeInfo be freed? */ + struct { + struct TwmWindow *next, *prev; + Bool cursor_valid; + int curs_x, curs_y; + } ring; + + short OpaqueMove; + short OpaqueResize; + short UnmapByMovingFarAway; + short AutoSqueeze; + short StartSqueezed; + short AlwaysSqueezeToGravity; + short DontSetInactive; + Bool hasfocusvisible; /* The window has visivle focus*/ + int occupation; + Image *HiliteImage; /* focus highlight window background */ + Image *LoliteImage; /* focus lowlight window background */ + WindowRegion *wr; + WindowBox *winbox; + Bool iswinbox; + struct { + int x, y; + unsigned int width, height; + } savegeometry; + struct virtualScreen *vs; + struct virtualScreen *old_parent_vs; + struct virtualScreen *savevs; + + Bool nameChanged; /* did WM_NAME ever change? */ + /* did the user ever change the width/height? {yes, no, or unknown} */ + Bool widthEverChangedByUser; + Bool heightEverChangedByUser; + +}; + +struct TWMWinConfigEntry +{ + struct TWMWinConfigEntry *next; + int tag; + char *client_id; + char *window_role; + XClassHint class; + char *wm_name; + int wm_command_count; + char **wm_command; + short x, y; + unsigned short width, height; + short icon_x, icon_y; + Bool iconified; + Bool icon_info_present; + Bool width_ever_changed_by_user; + Bool height_ever_changed_by_user; + /* ===================[ Matthew McNeill Feb 1997 ]======================= * + * Added this property to facilitate restoration of workspaces when + * restarting a session. + */ + int occupation; + /* ====================================================================== */ + +}; + +#define DoesWmTakeFocus (1L << 0) +#define DoesWmSaveYourself (1L << 1) +#define DoesWmDeleteWindow (1L << 2) + +#define TBPM_DOT ":dot" /* name of titlebar pixmap for dot */ +#define TBPM_ICONIFY ":iconify" /* same image as dot */ +#define TBPM_RESIZE ":resize" /* name of titlebar pixmap for resize button */ +#define TBPM_XLOGO ":xlogo" /* name of titlebar pixmap for xlogo */ +#define TBPM_DELETE ":delete" /* same image as xlogo */ +#define TBPM_MENU ":menu" /* name of titlebar pixmap for menus */ +#define TBPM_QUESTION ":question" /* name of unknown titlebar pixmap */ + +#define TBPM_3DCROSS ":xpm:cross" +#define TBPM_3DICONIFY ":xpm:iconify" +#define TBPM_3DSUNKEN_RESIZE ":xpm:sunkresize" +#define TBPM_3DBOX ":xpm:box" + +#define TBPM_3DDOT ":xpm:dot" /* name of titlebar pixmap for dot */ +#define TBPM_3DRESIZE ":xpm:resize" /* name of titlebar pixmap for resize button */ +#define TBPM_3DMENU ":xpm:menu" /* name of titlebar pixmap for menus */ +#define TBPM_3DZOOM ":xpm:zoom" +#define TBPM_3DBAR ":xpm:bar" +#define TBPM_3DVBAR ":xpm:vbar" + +#ifdef VMS +# include +#else +# include +#endif +#ifndef X_NOT_STDC_ENV +#include +#else +#ifdef VMS +#include +#else +extern char *malloc(), *calloc(), *realloc(), *getenv(); +extern void free(); +#endif +#endif +extern void Reborder(Time tim); +extern SIGNAL_T Done(int signum); +void ComputeCommonTitleOffsets(void); +void ComputeWindowTitleOffsets(TwmWindow *tmp_win, unsigned int width, + Bool squeeze); +void ComputeTitleLocation(register TwmWindow *tmp); +void CreateFonts(void); +void RestoreWithdrawnLocation (TwmWindow *tmp); +extern char *ProgramName; +extern Display *dpy; +extern char *display_name; +extern XtAppContext appContext; +extern Window ResizeWindow; /* the window we are resizing */ +extern int HasShape; /* this server supports Shape extension */ + +extern int PreviousScreen; + +extern Cursor UpperLeftCursor; +extern Cursor RightButt; +extern Cursor MiddleButt; +extern Cursor LeftButt; + +extern XClassHint NoClass; + +extern XContext TwmContext; +extern XContext MenuContext; +extern XContext IconManagerContext; +extern XContext ScreenContext; +extern XContext ColormapContext; +extern XContext VirtScreenContext; + +extern char *Home; +extern int HomeLen; +extern int ParseError; + +extern int HandlingEvents; + +extern Window JunkRoot; +extern Window JunkChild; +extern int JunkX; +extern int JunkY; +extern unsigned int JunkWidth, JunkHeight, JunkBW, JunkDepth, JunkMask; +extern XGCValues Gcv; +extern int InfoLines; +extern unsigned int InfoWidth,InfoHeight; +extern char Info[][INFO_SIZE]; +extern int Argc; +extern char **Argv; +#ifndef VMS +extern char **Environ; +#endif + +extern Bool ErrorOccurred; +extern XErrorEvent LastErrorEvent; + +#define ResetError() (ErrorOccurred = False) + +extern Bool RestartPreviousState; +extern Bool GetWMState(Window w, int *statep, Window *iwp); + +extern Bool RestartFlag; /* Flag that is set when SIGHUP is caught */ +extern void DoRestart(Time t); /* Function to perform a restart */ + +extern Atom _XA_MIT_PRIORITY_COLORS; +extern Atom _XA_WM_CHANGE_STATE; +extern Atom _XA_WM_STATE; +extern Atom _XA_WM_COLORMAP_WINDOWS; +extern Atom _XA_WM_PROTOCOLS; +extern Atom _XA_WM_TAKE_FOCUS; +extern Atom _XA_WM_SAVE_YOURSELF; +extern Atom _XA_WM_DELETE_WINDOW; +extern Atom _XA_WM_CLIENT_MACHINE; +extern Atom _XA_SM_CLIENT_ID; +extern Atom _XA_WM_CLIENT_LEADER; +extern Atom _XA_WM_WINDOW_ROLE; + +#define OCCUPY(w, b) ((b == NULL) ? 1 : (w->occupation & (1 << b->number))) +#define VISIBLE(w) OCCUPY(w, Scr->workSpaceMgr.activeWSPC) + +#endif /* _TWM_ */ Index: external/mit/ctwm/dist/types.h =================================================================== RCS file: external/mit/ctwm/dist/types.h diff -N external/mit/ctwm/dist/types.h --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/types.h 3 Sep 2015 12:19:59 -0000 @@ -0,0 +1,86 @@ +/* + * [ ctwm ] + * + * Copyright 2004 Richard Levitte. + * + * Permission to use, copy, modify and distribute this software [ctwm] and + * its documentation for any purpose is hereby granted without fee, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting documen- + * tation, and that the name of Claude Lecommandeur not be used in adverti- + * sing or publicity pertaining to distribution of the software without + * specific, written prior permission. Claude Lecommandeur make no represen- + * tations about the suitability of this software for any purpose. It is + * provided "as is" without express or implied warranty. + * + * Claude Lecommandeur DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO + * EVENT SHALL Claude Lecommandeur BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF + * USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR + * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + * + * Author: Richard Levitte [ richard@levitte.org ][ June 2004 ] + */ + +#ifndef _TYPES_ +#define _TYPES_ + +/* From icons.h */ +typedef struct Icon Icon; +typedef struct IconRegion IconRegion; +typedef struct IconEntry IconEntry; + +/* From menus.h */ +typedef struct MenuItem MenuItem; +typedef struct MenuRoot MenuRoot; +typedef struct MouseButton MouseButton; +typedef struct FuncButton FuncButton; +typedef struct FuncKey FuncKey; + +/* From iconmgr.h */ +typedef struct WList WList; +typedef struct IconMgr IconMgr; + +/* From list.h */ +typedef struct name_list_struct name_list; + +/* From screen.h */ +typedef struct _StdCmap StdCmap; +typedef struct _TitlebarPixmaps TitlebarPixmaps; +typedef struct ScreenInfo ScreenInfo; + +/* from twm.h */ +typedef struct MyFont MyFont; +typedef struct ColorPair ColorPair; +typedef struct _TitleButtonFunc TitleButtonFunc; +typedef struct _TitleButton TitleButton; +typedef struct _TBWindow TBWindow; +typedef struct _SqueezeInfo SqueezeInfo; +typedef struct TwmColormap TwmColormap; +typedef struct ColormapWindow ColormapWindow; +typedef struct Colormaps Colormaps; +typedef struct WindowRegion WindowRegion; +typedef struct WindowEntry WindowEntry; +typedef struct _WindowBox WindowBox; +typedef struct TwmWindow TwmWindow; +typedef struct TWMWinConfigEntry TWMWinConfigEntry; + +/* From util.h */ +typedef struct _Image Image; + +/* From vscreen.h */ +typedef struct virtualScreen virtualScreen; + +/* From workmgr.h */ +typedef struct winList *WinList; +typedef struct WorkSpaceMgr WorkSpaceMgr; +typedef struct WorkSpace WorkSpace; +typedef struct MapSubwindow MapSubwindow; +typedef struct ButtonSubwindow ButtonSubwindow; +typedef struct WorkSpaceWindow WorkSpaceWindow; +typedef struct OccupyWindow OccupyWindow; +typedef struct CaptiveCTWM CaptiveCTWM; + +#endif /* _TYPES_ */ Index: external/mit/ctwm/dist/util.c =================================================================== RCS file: external/mit/ctwm/dist/util.c diff -N external/mit/ctwm/dist/util.c --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/util.c 3 Sep 2015 12:20:00 -0000 @@ -0,0 +1,4095 @@ +/*****************************************************************************/ +/** Copyright 1988 by Evans & Sutherland Computer Corporation, **/ +/** Salt Lake City, Utah **/ +/** Portions Copyright 1989 by the Massachusetts Institute of Technology **/ +/** Cambridge, Massachusetts **/ +/** **/ +/** All Rights Reserved **/ +/** **/ +/** Permission to use, copy, modify, and distribute this software and **/ +/** its documentation for any purpose and without fee is hereby **/ +/** granted, provided that the above copyright notice appear in all **/ +/** copies and that both that copyright notice and this permis- **/ +/** sion notice appear in supporting documentation, and that the **/ +/** names of Evans & Sutherland and M.I.T. not be used in advertising **/ +/** in publicity pertaining to distribution of the software without **/ +/** specific, written prior permission. **/ +/** **/ +/** EVANS & SUTHERLAND AND M.I.T. DISCLAIM ALL WARRANTIES WITH REGARD **/ +/** TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANT- **/ +/** ABILITY AND FITNESS, IN NO EVENT SHALL EVANS & SUTHERLAND OR **/ +/** M.I.T. BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAM- **/ +/** AGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA **/ +/** OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER **/ +/** TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE **/ +/** OR PERFORMANCE OF THIS SOFTWARE. **/ +/*****************************************************************************/ +/* + * [ ctwm ] + * + * Copyright 1992 Claude Lecommandeur. + * + * Permission to use, copy, modify and distribute this software [ctwm] and + * its documentation for any purpose is hereby granted without fee, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting documen- + * tation, and that the name of Claude Lecommandeur not be used in adverti- + * sing or publicity pertaining to distribution of the software without + * specific, written prior permission. Claude Lecommandeur make no represen- + * tations about the suitability of this software for any purpose. It is + * provided "as is" without express or implied warranty. + * + * Claude Lecommandeur DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO + * EVENT SHALL Claude Lecommandeur BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF + * USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR + * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + * + * Author: Claude Lecommandeur [ lecom@sic.epfl.ch ][ April 1992 ] + */ + + +/*********************************************************************** + * + * $XConsortium: util.c,v 1.47 91/07/14 13:40:37 rws Exp $ + * + * utility routines for twm + * + * 28-Oct-87 Thomas E. LaStrange File created + * + * Do the necessary modification to be integrated in ctwm. + * Can no longer be used for the standard twm. + * + * 22-April-92 Claude Lecommandeur. + * + * Changed behavior of DontMoveOff/MoveOffResistance to allow + * moving a window off screen less than #MoveOffResistance pixels. + * New code will no longer "snap" windows to #MoveOffResistance + * pixels off screen and instead movements will just be stopped and + * then resume once movement of #MoveOffResistance have been attempted. + * + * 15-December-02 Bjorn Knutsson + * + ***********************************************************************/ + +#define LEVITTE_TEST + +#include "twm.h" +#include "util.h" +#include "events.h" +#include "add_window.h" +#include "gram.tab.h" +#include "screen.h" +#include "icons.h" +#include "cursor.h" +#include + +/* + * Need this for the fixed-size uint_*'s used below. stdint.h would be + * the more appropriate include, but there exist systems that don't have + * it, but do have inttypes.h (FreeBSD 4, Solaris 7-9 I've heard of, + * probably more). + */ +#include + +#ifdef VMS +#include +#include +#include +#include +#include +#include +#ifdef HAVE_XWDFILE_H +#include "XWDFile.h" /* We do some tricks, since the original + has bugs... /Richard Levitte */ +#endif /* HAVE_XWDFILE_H */ +#include +#include +#include +#include +#include +#ifdef __DECC +#include +#endif /* __DECC */ +#define USE_SIGNALS +#ifndef F_OK +# define F_OK 0 +#endif +#ifndef X_OK +# define X_OK 1 +#endif +#ifndef W_OK +# define W_OK 2 +#endif +#ifndef R_OK +# define R_OK 4 +#endif +#else /* !VMS */ +#include +#include +#include +#include +#include +#include +#endif /* VMS */ + +#if defined(USE_SIGNALS) && defined(__sgi) +# define _BSD_SIGNALS +#endif + +#include +#ifndef VMS +#include +#endif + +#if defined (XPM) +#ifdef VMS +#include "xpm.h" +#else +# include +#endif +#endif + +#ifdef JPEG +# include +# include +# include + static Image *LoadJpegImage (char *name); + static Image *GetJpegImage (char *name); + + struct jpeg_error { + struct jpeg_error_mgr pub; + sigjmp_buf setjmp_buffer; + }; + + typedef struct jpeg_error *jerr_ptr; +#endif /* JPEG */ + +#ifdef IMCONV +# include "im.h" +# include "sdsc.h" +#endif + +#define MAXANIMATIONSPEED 20 + +extern Atom _XA_WM_WORKSPACESLIST; + +static Image *LoadBitmapImage (char *name, ColorPair cp); +static Image *GetBitmapImage (char *name, ColorPair cp); +#if !defined(VMS) || defined(HAVE_XWDFILE_H) +static Image *LoadXwdImage (char *filename, ColorPair cp); +static Image *GetXwdImage (char *name, ColorPair cp); +#endif +#ifdef XPM +static Image *LoadXpmImage (char *name, ColorPair cp); +static Image *GetXpmImage (char *name, ColorPair cp); +static void xpmErrorMessage (int status, char *name, char *fullname); +#endif +#ifdef IMCONV +static Image *GetImconvImage (char *filename, + unsigned int *widthp, unsigned int *heightp); +#endif +static Pixmap CreateXLogoPixmap(unsigned int *widthp, unsigned int *heightp); +static Pixmap CreateResizePixmap(unsigned int *widthp, unsigned int *heightp); +static Pixmap CreateQuestionPixmap(unsigned int *widthp, unsigned int *heightp); +static Pixmap CreateMenuPixmap(unsigned int *widthp, unsigned int *heightp); +static Pixmap CreateDotPixmap (unsigned int *widthp, unsigned int *heightp); +static Image *Create3DMenuImage (ColorPair cp); +static Image *Create3DDotImage (ColorPair cp); +static Image *Create3DResizeImage (ColorPair cp); +static Image *Create3DZoomImage (ColorPair cp); +static Image *Create3DBarImage (ColorPair cp); +static Image *Create3DVertBarImage (ColorPair cp); +static Image *Create3DResizeAnimation (Bool in, Bool left, Bool top, + ColorPair cp); +static Image *Create3DCrossImage (ColorPair cp); +static Image *Create3DIconifyImage (ColorPair cp); +static Image *Create3DSunkenResizeImage (ColorPair cp); +static Image *Create3DBoxImage (ColorPair cp); + +extern FILE *tracefile; + +void FreeImage (Image *image); + +void _swapshort (register char *bp, register unsigned n); +void _swaplong (register char *bp, register unsigned n); + +static int reportfilenotfound = 1; +static Colormap AlternateCmap = None; + +int HotX, HotY; + +int AnimationSpeed = 0; +Bool AnimationActive = False; +Bool MaybeAnimate = True; +#ifdef USE_SIGNALS + Bool AnimationPending = False; +#else + struct timeval AnimateTimeout; +#endif /* USE_SIGNALS */ + +/*********************************************************************** + * + * Procedure: + * MoveOutline - move a window outline + * + * Inputs: + * root - the window we are outlining + * x - upper left x coordinate + * y - upper left y coordinate + * width - the width of the rectangle + * height - the height of the rectangle + * bw - the border width of the frame + * th - title height + * + *********************************************************************** + */ + +/* ARGSUSED */ +void MoveOutline(Window root, + int x, int y, int width, int height, int bw, int th) +{ + static int lastx = 0; + static int lasty = 0; + static int lastWidth = 0; + static int lastHeight = 0; + static int lastBW = 0; + static int lastTH = 0; + int xl, xr, yt, yb, xinnerl, xinnerr, yinnert, yinnerb; + int xthird, ythird; + XSegment outline[18]; + register XSegment *r; + + if (x == lastx && y == lasty && width == lastWidth && height == lastHeight + && lastBW == bw && th == lastTH) + return; + + r = outline; + +#define DRAWIT() \ + if (lastWidth || lastHeight) \ + { \ + xl = lastx; \ + xr = lastx + lastWidth - 1; \ + yt = lasty; \ + yb = lasty + lastHeight - 1; \ + xinnerl = xl + lastBW; \ + xinnerr = xr - lastBW; \ + yinnert = yt + lastTH + lastBW; \ + yinnerb = yb - lastBW; \ + xthird = (xinnerr - xinnerl) / 3; \ + ythird = (yinnerb - yinnert) / 3; \ + \ + r->x1 = xl; \ + r->y1 = yt; \ + r->x2 = xr; \ + r->y2 = yt; \ + r++; \ + \ + r->x1 = xl; \ + r->y1 = yb; \ + r->x2 = xr; \ + r->y2 = yb; \ + r++; \ + \ + r->x1 = xl; \ + r->y1 = yt; \ + r->x2 = xl; \ + r->y2 = yb; \ + r++; \ + \ + r->x1 = xr; \ + r->y1 = yt; \ + r->x2 = xr; \ + r->y2 = yb; \ + r++; \ + \ + r->x1 = xinnerl + xthird; \ + r->y1 = yinnert; \ + r->x2 = r->x1; \ + r->y2 = yinnerb; \ + r++; \ + \ + r->x1 = xinnerl + (2 * xthird); \ + r->y1 = yinnert; \ + r->x2 = r->x1; \ + r->y2 = yinnerb; \ + r++; \ + \ + r->x1 = xinnerl; \ + r->y1 = yinnert + ythird; \ + r->x2 = xinnerr; \ + r->y2 = r->y1; \ + r++; \ + \ + r->x1 = xinnerl; \ + r->y1 = yinnert + (2 * ythird); \ + r->x2 = xinnerr; \ + r->y2 = r->y1; \ + r++; \ + \ + if (lastTH != 0) { \ + r->x1 = xl; \ + r->y1 = yt + lastTH; \ + r->x2 = xr; \ + r->y2 = r->y1; \ + r++; \ + } \ + } + + /* undraw the old one, if any */ + DRAWIT (); + + lastx = x; + lasty = y; + lastWidth = width; + lastHeight = height; + lastBW = bw; + lastTH = th; + + /* draw the new one, if any */ + DRAWIT (); + +#undef DRAWIT + + + if (r != outline) + { + XDrawSegments(dpy, root, Scr->DrawGC, outline, r - outline); + } +} + +/*********************************************************************** + * + * Procedure: + * Zoom - zoom in or out of an icon + * + * Inputs: + * wf - window to zoom from + * wt - window to zoom to + * + *********************************************************************** + */ + +void Zoom(Window wf, Window wt) +{ + int fx, fy, tx, ty; /* from, to */ + unsigned int fw, fh, tw, th; /* from, to */ + long dx, dy, dw, dh; + long z; + int j; + + if ((Scr->IconifyStyle != ICONIFY_NORMAL) || !Scr->DoZoom || Scr->ZoomCount < 1) return; + + if (wf == None || wt == None) return; + + XGetGeometry (dpy, wf, &JunkRoot, &fx, &fy, &fw, &fh, &JunkBW, &JunkDepth); + XGetGeometry (dpy, wt, &JunkRoot, &tx, &ty, &tw, &th, &JunkBW, &JunkDepth); + + dx = (long) tx - (long) fx; /* going from -> to */ + dy = (long) ty - (long) fy; /* going from -> to */ + dw = (long) tw - (long) fw; /* going from -> to */ + dh = (long) th - (long) fh; /* going from -> to */ + z = (long) (Scr->ZoomCount + 1); + + for (j = 0; j < 2; j++) { + long i; + + XDrawRectangle (dpy, Scr->Root, Scr->DrawGC, fx, fy, fw, fh); + for (i = 1; i < z; i++) { + int x = fx + (int) ((dx * i) / z); + int y = fy + (int) ((dy * i) / z); + unsigned width = (unsigned) (((long) fw) + (dw * i) / z); + unsigned height = (unsigned) (((long) fh) + (dh * i) / z); + + XDrawRectangle (dpy, Scr->Root, Scr->DrawGC, + x, y, width, height); + } + XDrawRectangle (dpy, Scr->Root, Scr->DrawGC, tx, ty, tw, th); + } +} + + +char *ExpandFilePath (char *path) +{ + char *ret, *colon, *p; + int len; + + len = 0; + p = path; + while ((colon = strchr (p, ':'))) { + len += colon - p + 1; + if (*p == '~') len += HomeLen - 1; + p = colon + 1; + } + if (*p == '~') len += HomeLen - 1; + len += strlen (p); + ret = (char*) malloc (len + 1); + *ret = 0; + + p = path; + while ((colon = strchr (p, ':'))) { + *colon = '\0'; + if (*p == '~') { + strcat (ret, Home); + strcat (ret, p + 1); + } else { + strcat (ret, p); + } + *colon = ':'; + strcat (ret, ":"); + p = colon + 1; + } + if (*p == '~') { + strcat (ret, Home); + strcat (ret, p + 1); + } else { + strcat (ret, p); + } + return ret; +} + +/*********************************************************************** + * + * Procedure: + * ExpandFilename - expand the tilde character to HOME + * if it is the first character of the filename + * + * Returned Value: + * a pointer to the new name + * + * Inputs: + * name - the filename to expand + * + *********************************************************************** + */ + +char *ExpandFilename(char *name) +{ + char *newname; + + if (name[0] != '~') return name; + +#ifdef VMS + newname = (char *) malloc (HomeLen + strlen(name) + 1); + if (!newname) { + fprintf (stderr, + "%s: unable to allocate %d bytes to expand filename %s%s\n", + ProgramName, HomeLen + strlen(name) + 1, Home, &name[1]); + } else { + (void) sprintf (newname, "%s%s", Home, &name[1]); + } +#else + newname = (char *) malloc (HomeLen + strlen(name) + 2); + if (!newname) { + fprintf (stderr, + "%s: unable to allocate %lu bytes to expand filename %s/%s\n", + ProgramName, (unsigned long) HomeLen + strlen(name) + 2, + Home, &name[1]); + } else { + (void) sprintf (newname, "%s/%s", Home, &name[1]); + } +#endif + + return newname; +} + +char *ExpandPixmapPath (char *name) +{ + char *ret, *colon; + + ret = NULL; +#ifdef VMS + if (name[0] == '~') { + ret = (char *) malloc (HomeLen + strlen (name) + 1); + sprintf (ret, "%s%s", Home, &name[1]); + } + if (name[0] == '/') { + ret = (char *) malloc (strlen (name)); + sprintf (ret, "%s", &name[1]); + } + else + if (Scr->PixmapDirectory) { + char *p = Scr->PixmapDirectory; + while (colon = strchr (p, ':')) { + *colon = '\0'; + ret = (char *) malloc (strlen (p) + strlen (name) + 1); + sprintf (ret, "%s%s", p, name); + *colon = ':'; + if (!access (ret, R_OK)) return (ret); + p = colon + 1; + } + ret = (char *) malloc (strlen (Scr->PixmapDirectory) + strlen (name) + 1); + sprintf (ret, "%s%s", Scr->PixmapDirectory, name); + } +#else + if (name[0] == '~') { + ret = (char *) malloc (HomeLen + strlen (name) + 2); + sprintf (ret, "%s/%s", Home, &name[1]); + } + else + if (name[0] == '/') { + ret = (char *) malloc (strlen (name) + 1); + strcpy (ret, name); + } + else + if (Scr->PixmapDirectory) { + char *p = Scr->PixmapDirectory; + while ((colon = strchr (p, ':'))) { + *colon = '\0'; + ret = (char *) malloc (strlen (p) + strlen (name) + 2); + sprintf (ret, "%s/%s", p, name); + *colon = ':'; + if (!access (ret, R_OK)) return (ret); + p = colon + 1; + } + ret = (char *) malloc (strlen (p) + strlen (name) + 2); + sprintf (ret, "%s/%s", p, name); + } +#endif + return (ret); +} + +/*********************************************************************** + * + * Procedure: + * GetUnknownIcon - read in the bitmap file for the unknown icon + * + * Inputs: + * name - the filename to read + * + *********************************************************************** + */ + +void GetUnknownIcon(char *name) +{ + Scr->UnknownImage = GetImage (name, Scr->IconC); +} + +/*********************************************************************** + * + * Procedure: + * FindBitmap - read in a bitmap file and return size + * + * Returned Value: + * the pixmap associated with the bitmap + * widthp - pointer to width of bitmap + * heightp - pointer to height of bitmap + * + * Inputs: + * name - the filename to read + * + *********************************************************************** + */ + +Pixmap FindBitmap (char *name, unsigned int *widthp, unsigned int *heightp) +{ + char *bigname; + Pixmap pm; + + if (!name) return None; + + /* + * Names of the form :name refer to hardcoded images that are scaled to + * look nice in title buttons. Eventually, it would be nice to put in a + * menu symbol as well.... + */ + if (name[0] == ':') { + int i; + static struct { + char *name; + Pixmap (*proc)(unsigned int *wp, unsigned int *hp); + } pmtab[] = { + { TBPM_DOT, CreateDotPixmap }, + { TBPM_ICONIFY, CreateDotPixmap }, + { TBPM_RESIZE, CreateResizePixmap }, + { TBPM_XLOGO, CreateXLogoPixmap }, + { TBPM_DELETE, CreateXLogoPixmap }, + { TBPM_MENU, CreateMenuPixmap }, + { TBPM_QUESTION, CreateQuestionPixmap }, + }; + + for (i = 0; i < (sizeof pmtab)/(sizeof pmtab[0]); i++) { + if (XmuCompareISOLatin1 (pmtab[i].name, name) == 0) + return (*pmtab[i].proc) (widthp, heightp); + } + fprintf (stderr, "%s: no such built-in bitmap \"%s\"\n", + ProgramName, name); + return None; + } + + /* + * Generate a full pathname if any special prefix characters (such as ~) + * are used. If the bigname is different from name, bigname will need to + * be freed. + */ + bigname = ExpandFilename (name); + if (!bigname) return None; + + /* + * look along bitmapFilePath resource same as toolkit clients + */ + pm = XmuLocateBitmapFile (ScreenOfDisplay(dpy, Scr->screen), bigname, NULL, + 0, (int *)widthp, (int *)heightp, &HotX, &HotY); + if (pm == None && Scr->IconDirectory && bigname[0] != '/') { + if (bigname != name) free (bigname); + /* + * Attempt to find icon in old IconDirectory (now obsolete) + */ +#ifdef VMS + bigname = (char *) malloc (strlen(name) + strlen(Scr->IconDirectory) + 1); + if (!bigname) { + fprintf (stderr, + "%s: unable to allocate memory for \"%s%s\"\n", + ProgramName, Scr->IconDirectory, name); + return None; + } + (void) sprintf (bigname, "%s%s", Scr->IconDirectory, name); +#else + bigname = (char *) malloc (strlen(name) + strlen(Scr->IconDirectory) + 2); + if (!bigname) { + fprintf (stderr, + "%s: unable to allocate memory for \"%s/%s\"\n", + ProgramName, Scr->IconDirectory, name); + return None; + } + (void) sprintf (bigname, "%s/%s", Scr->IconDirectory, name); +#endif + if (XReadBitmapFile (dpy, Scr->Root, bigname, widthp, heightp, &pm, + &HotX, &HotY) != BitmapSuccess) { + pm = None; + } + } + if (bigname != name) free (bigname); + if ((pm == None) && reportfilenotfound) { + fprintf (stderr, "%s: unable to find bitmap \"%s\"\n", ProgramName, name); + } + + return pm; +} + +Pixmap GetBitmap (char *name) +{ + return FindBitmap (name, &JunkWidth, &JunkHeight); +} + +static Image *LoadBitmapImage (char *name, ColorPair cp) +{ + Image *image; + Pixmap bm; + unsigned int width, height; + XGCValues gcvalues; + + if (Scr->rootGC == (GC) 0) Scr->rootGC = XCreateGC (dpy, Scr->Root, 0, &gcvalues); + bm = FindBitmap (name, &width, &height); + if (bm == None) return (None); + + image = (Image*) malloc (sizeof (struct _Image)); + image->pixmap = XCreatePixmap (dpy, Scr->Root, width, height, Scr->d_depth); + gcvalues.background = cp.back; + gcvalues.foreground = cp.fore; + XChangeGC (dpy, Scr->rootGC, GCForeground | GCBackground, &gcvalues); + XCopyPlane (dpy, bm, image->pixmap, Scr->rootGC, 0, 0, width, height, + 0, 0, (unsigned long) 1); + XFreePixmap (dpy, bm); + image->mask = None; + image->width = width; + image->height = height; + image->next = None; + return (image); +} + +static Image *GetBitmapImage (char *name, ColorPair cp) +{ + Image *image, *r, *s; + char path [128], pref [128]; + char *perc; + int i; + + if (! strchr (name, '%')) return (LoadBitmapImage (name, cp)); + s = image = None; + strcpy (pref, name); + perc = strchr (pref, '%'); + *perc = '\0'; + reportfilenotfound = 0; + for (i = 1;; i++) { + sprintf (path, "%s%d%s", pref, i, perc + 1); + r = LoadBitmapImage (path, cp); + if (r == None) break; + r->next = None; + if (image == None) s = image = r; + else { + s->next = r; + s = r; + } + } + reportfilenotfound = 1; + if (s != None) s->next = image; + if (image == None) { + fprintf (stderr, "Cannot open any %s bitmap file\n", name); + } + return (image); +} + +#ifdef XPM +static int reportxpmerror = 1; + +static Image *LoadXpmImage (char *name, ColorPair cp) +{ + char *fullname; + Image *image; + int status; + Colormap stdcmap = Scr->RootColormaps.cwins[0]->colormap->c; + XpmAttributes attributes; + static XpmColorSymbol overrides[] = { + {"Foreground", NULL, 0}, + {"Background", NULL, 0}, + {"HiShadow", NULL, 0}, + {"LoShadow", NULL, 0} + }; + + fullname = ExpandPixmapPath (name); + if (! fullname) return (None); + + image = (Image*) malloc (sizeof (struct _Image)); + if (image == None) return (None); + + attributes.valuemask = 0; + attributes.valuemask |= XpmSize; + attributes.valuemask |= XpmReturnPixels; + attributes.valuemask |= XpmColormap; + attributes.valuemask |= XpmDepth; + attributes.valuemask |= XpmVisual; + attributes.valuemask |= XpmCloseness; + attributes.valuemask |= XpmColorSymbols; + + attributes.numsymbols = 4; + attributes.colorsymbols = overrides; + overrides[0].pixel = cp.fore; + overrides[1].pixel = cp.back; + overrides[2].pixel = cp.shadd; + overrides[3].pixel = cp.shadc; + + + attributes.colormap = AlternateCmap ? AlternateCmap : stdcmap; + attributes.depth = Scr->d_depth; + attributes.visual = Scr->d_visual; + attributes.closeness = 65535; /* Never fail */ + status = XpmReadFileToPixmap(dpy, Scr->Root, fullname, + &(image->pixmap), &(image->mask), &attributes); + if (status != XpmSuccess) { + xpmErrorMessage (status, name, fullname); + free (image); + return (None); + } + free (fullname); + image->width = attributes.width; + image->height = attributes.height; + image->next = None; + return (image); +} + +static Image *GetXpmImage (char *name, ColorPair cp) +{ + char path [128], pref [128]; + Image *image, *r, *s; + char *perc; + int i; + + if (! strchr (name, '%')) return (LoadXpmImage (name, cp)); + s = image = None; + strcpy (pref, name); + perc = strchr (pref, '%'); + *perc = '\0'; + reportfilenotfound = 0; + for (i = 1;; i++) { + sprintf (path, "%s%d%s", pref, i, perc + 1); + r = LoadXpmImage (path, cp); + if (r == None) break; + r->next = None; + if (image == None) s = image = r; + else { + s->next = r; + s = r; + } + } + reportfilenotfound = 1; + if (s != None) s->next = image; + if (image == None) { + fprintf (stderr, "Cannot open any %s XPM file\n", name); + } + return (image); +} + +static void xpmErrorMessage (int status, char *name, char *fullname) +{ + switch (status) { + case XpmSuccess: + break; + + case XpmColorError: + if (reportxpmerror) + fprintf (stderr, + "Could not parse or alloc requested color : %s\n", + fullname); + return; + + case XpmOpenFailed: + if (reportxpmerror && reportfilenotfound) + fprintf (stderr, "unable to locate XPM file : %s\n", fullname); + return; + + case XpmFileInvalid: + fprintf (stderr, "invalid XPM file : %s\n", fullname); + return; + + case XpmNoMemory: + if (reportxpmerror) + fprintf (stderr, "Not enough memory for XPM file : %s\n", fullname); + return; + + case XpmColorFailed: + if (reportxpmerror) + fprintf (stderr, "Color not found in : %s\n", fullname); + return; + + default : + fprintf (stderr, "Unknown error in : %s\n", fullname); + return; + } +} + +#endif + +void MaskScreen (char *file) +{ + unsigned long valuemask; + XSetWindowAttributes attributes; + XEvent event; + Cursor waitcursor; + int x, y; + ColorPair WelcomeCp; + XColor black; + + NewFontCursor (&waitcursor, "watch"); + + valuemask = (CWBackingStore | CWSaveUnder | CWBackPixel | + CWOverrideRedirect | CWEventMask | CWCursor); + attributes.backing_store = NotUseful; + attributes.save_under = False; + attributes.override_redirect = True; + attributes.event_mask = ExposureMask; + attributes.cursor = waitcursor; + attributes.background_pixel = Scr->Black; + Scr->WindowMask = XCreateWindow (dpy, Scr->Root, 0, 0, + (unsigned int) Scr->rootw, + (unsigned int) Scr->rooth, + (unsigned int) 0, + CopyFromParent, (unsigned int) CopyFromParent, + (Visual *) CopyFromParent, valuemask, + &attributes); + XMapWindow (dpy, Scr->WindowMask); + XMaskEvent (dpy, ExposureMask, &event); + + if (Scr->Monochrome != COLOR) return; + + WelcomeCp.fore = Scr->Black; + WelcomeCp.back = Scr->White; + Scr->WelcomeCmap = XCreateColormap (dpy, Scr->WindowMask, Scr->d_visual, AllocNone); + if (! Scr->WelcomeCmap) return; + XSetWindowColormap (dpy, Scr->WindowMask, Scr->WelcomeCmap); + black.red = 0; + black.green = 0; + black.blue = 0; + XAllocColor (dpy, Scr->WelcomeCmap, &black); + + reportfilenotfound = 0; + AlternateCmap = Scr->WelcomeCmap; + if (! file) { + Scr->WelcomeImage = GetImage ("xwd:welcome.xwd", WelcomeCp); +#ifdef XPM + if (Scr->WelcomeImage == None) + Scr->WelcomeImage = GetImage ("xpm:welcome.xpm", WelcomeCp); +#endif + } + else { + Scr->WelcomeImage = GetImage (file, WelcomeCp); + } + AlternateCmap = None; + reportfilenotfound = 1; + if (Scr->WelcomeImage == None) return; + + if (captive) { + XSetWindowColormap (dpy, Scr->WindowMask, Scr->WelcomeCmap); + XSetWMColormapWindows (dpy, Scr->Root, &(Scr->WindowMask), 1); + } + else XInstallColormap (dpy, Scr->WelcomeCmap); + + Scr->WelcomeGC = XCreateGC (dpy, Scr->WindowMask, 0, NULL); + x = (Scr->rootw - Scr->WelcomeImage->width) / 2; + y = (Scr->rooth - Scr->WelcomeImage->height) / 2; + + XSetWindowBackground (dpy, Scr->WindowMask, black.pixel); + XClearWindow (dpy, Scr->WindowMask); + XCopyArea (dpy, Scr->WelcomeImage->pixmap, Scr->WindowMask, Scr->WelcomeGC, 0, 0, + Scr->WelcomeImage->width, Scr->WelcomeImage->height, x, y); +} + +void UnmaskScreen (void) +{ +#ifdef VMS + float timeout; +#else + struct timeval timeout; +#endif + Colormap stdcmap = Scr->RootColormaps.cwins[0]->colormap->c; + Colormap cmap; + XColor colors [256], stdcolors [256]; + int i, j, usec; + +#ifdef VMS + timeout = 0.017; +#else + usec = 10000; + timeout.tv_usec = usec % (unsigned long) 1000000; + timeout.tv_sec = usec / (unsigned long) 1000000; +#endif + + if (Scr->WelcomeImage) { + Pixel pixels [256]; + + cmap = Scr->WelcomeCmap; + for (i = 0; i < 256; i++) { + pixels [i] = i; + colors [i].pixel = i; + } + XQueryColors (dpy, cmap, colors, 256); + XFreeColors (dpy, cmap, pixels, 256, 0L); + XFreeColors (dpy, cmap, pixels, 256, 0L); /* Ah Ah */ + + for (i = 0; i < 256; i++) { + colors [i].pixel = i; + colors [i].flags = DoRed | DoGreen | DoBlue; + stdcolors [i].red = colors [i].red; + stdcolors [i].green = colors [i].green; + stdcolors [i].blue = colors [i].blue; + } + for (i = 0; i < 128; i++) { + for (j = 0; j < 256; j++) { + colors [j].red = stdcolors [j].red * ((127.0 - i) / 128.0); + colors [j].green = stdcolors [j].green * ((127.0 - i) / 128.0); + colors [j].blue = stdcolors [j].blue * ((127.0 - i) / 128.0); + } + XStoreColors (dpy, cmap, colors, 256); +#ifdef VMS + lib$wait(&timeout); +#else + select (0, (void *) 0, (void *) 0, (void *) 0, &timeout); +#endif + } + XFreeColors (dpy, cmap, pixels, 256, 0L); + XFreeGC (dpy, Scr->WelcomeGC); + FreeImage (Scr->WelcomeImage); + } + if (Scr->Monochrome != COLOR) goto fin; + + cmap = XCreateColormap (dpy, Scr->Root, Scr->d_visual, AllocNone); + if (! cmap) goto fin; + for (i = 0; i < 256; i++) { + colors [i].pixel = i; + colors [i].red = 0; + colors [i].green = 0; + colors [i].blue = 0; + colors [i].flags = DoRed | DoGreen | DoBlue; + } + XStoreColors (dpy, cmap, colors, 256); + + if (captive) XSetWindowColormap (dpy, Scr->Root, cmap); + else XInstallColormap (dpy, cmap); + + XUnmapWindow (dpy, Scr->WindowMask); + XClearWindow (dpy, Scr->Root); + XSync (dpy, 0); + PaintAllDecoration (); + + for (i = 0; i < 256; i++) stdcolors [i].pixel = i; + XQueryColors (dpy, stdcmap, stdcolors, 256); + for (i = 0; i < 128; i++) { + for (j = 0; j < 256; j++) { + colors [j].pixel = j; + colors [j].red = stdcolors [j].red * (i / 127.0); + colors [j].green = stdcolors [j].green * (i / 127.0); + colors [j].blue = stdcolors [j].blue * (i / 127.0); + colors [j].flags = DoRed | DoGreen | DoBlue; + } + XStoreColors (dpy, cmap, colors, 256); +#ifdef VMS + lib$wait(&timeout); +#else + select (0, (void *) 0, (void *) 0, (void *) 0, &timeout); +#endif + } + + if (captive) XSetWindowColormap (dpy, Scr->Root, stdcmap); + else XInstallColormap (dpy, stdcmap); + + XFreeColormap (dpy, cmap); + +fin: + if (Scr->WelcomeCmap) XFreeColormap (dpy, Scr->WelcomeCmap); + XDestroyWindow (dpy, Scr->WindowMask); + Scr->WindowMask = (Window) 0; +} + +#ifdef VMS + +/* use the VMS system services to request the timer to issue an AST */ +void AnimateHandler (void); + +unsigned int tv[2]; +int status; +static unsigned long timefi; +/* unsigned long timefe = 17; */ +unsigned long timefe; + +#define TIMID 12L + +void StartAnimation (void) +{ + if (AnimationSpeed > MAXANIMATIONSPEED) AnimationSpeed = MAXANIMATIONSPEED; + if (AnimationSpeed <= 0) return; + if (AnimationActive) return; + + if (!timefi) lib$get_ef(&timefi); + if (!timefe) lib$get_ef(&timefe); + + tv[1] = 0xFFFFFFFF; /* quadword negative for relative */ + tv[0] = -(10000000 / AnimationSpeed); /* time. In units of 100ns. */ + sys$clref(timefe); + status = sys$setimr (timefi, &tv, AnimateHandler, TIMID ); + if (status != SS$_NORMAL) lib$signal(status); + AnimationActive = True; +} + +void StopAnimation () { + if (AnimationSpeed <= 0) return; + if (! AnimationActive) return; + AnimationActive = False; + + status = sys$cantim(TIMID, PSL$C_USER); + if (status != SS$_NORMAL) lib$signal(status); +} + +void SetAnimationSpeed (int speed) +{ + AnimationSpeed = speed; + if (AnimationSpeed > MAXANIMATIONSPEED) AnimationSpeed = MAXANIMATIONSPEED; +} + +void ModifyAnimationSpeed (int incr) +{ + if ((AnimationSpeed + incr) < 0) return; + if ((AnimationSpeed + incr) == 0) { + if (AnimationActive) StopAnimation (); + AnimationSpeed = 0; + return; + } + AnimationSpeed += incr; + + status = sys$cantim(TIMID, PSL$C_USER); + if (status != SS$_NORMAL) lib$signal(status); + + tv[1] = 0xFFFFFFFF; + tv[0] = -(10000000 / AnimationSpeed); + + sys$clref(timefe); + status = sys$setimr (timefi, &tv, AnimateHandler, TIMID); + if (status != SS$_NORMAL) lib$signal(status); + + AnimationActive = True; +} + +void AnimateHandler (void) { + AnimationPending = True; + + sys$setef(timefe); + status = sys$setimr (timefi, &tv, AnimateHandler, TIMID); + if (status != SS$_NORMAL) lib$signal(status); +} +#else /* VMS */ + +#ifdef USE_SIGNALS +SIGNAL_T AnimateHandler (); +#endif + +#ifndef USE_SIGNALS +void TryToAnimate (void) +{ + struct timeval tp; + struct timezone tzp; + static unsigned long lastsec; + static long lastusec; + unsigned long gap; + + gettimeofday (&tp, &tzp); + gap = ((tp.tv_sec - lastsec) * 1000000) + (tp.tv_usec - lastusec); + if (tracefile) { + fprintf (tracefile, "Time = %lu, %ld, %ld, %ld, %lu\n", lastsec, + lastusec, (long)tp.tv_sec, (long)tp.tv_usec, gap); + fflush (tracefile); + } + gap *= AnimationSpeed; + if (gap < 1000000) return; + if (tracefile) { + fprintf (tracefile, "Animate\n"); + fflush (tracefile); + } + Animate (); + lastsec = tp.tv_sec; + lastusec = tp.tv_usec; +} +#endif /* USE_SIGNALS */ + +void StartAnimation (void) +{ +#ifdef USE_SIGNALS + struct itimerval tv; +#endif + + if (AnimationSpeed > MAXANIMATIONSPEED) AnimationSpeed = MAXANIMATIONSPEED; + if (AnimationSpeed <= 0) AnimationSpeed = 0; + if (AnimationActive) return; +#ifdef USE_SIGNALS + if (AnimationSpeed == 0) return; + signal (SIGALRM, AnimateHandler); + if (AnimationSpeed == 1) { + tv.it_interval.tv_sec = 1; + tv.it_interval.tv_usec = 0; + tv.it_value.tv_sec = 1; + tv.it_value.tv_usec = 0; + } + else { + tv.it_interval.tv_sec = 0; + tv.it_interval.tv_usec = 1000000 / AnimationSpeed; + tv.it_value.tv_sec = 0; + tv.it_value.tv_usec = 1000000 / AnimationSpeed; + } + setitimer (ITIMER_REAL, &tv, (struct itimerval*) NULL); +#else /* USE_SIGNALS */ + switch (AnimationSpeed) { + case 0 : + return; + case 1 : + AnimateTimeout.tv_sec = 1; + AnimateTimeout.tv_usec = 0; + break; + default : + AnimateTimeout.tv_sec = 0; + AnimateTimeout.tv_usec = 1000000 / AnimationSpeed; + } +#endif /* USE_SIGNALS */ + AnimationActive = True; +} + +void StopAnimation (void) +{ +#ifdef USE_SIGNALS + struct itimerval tv; + + if (AnimationSpeed <= 0) return; + if (! AnimationActive) return; + signal (SIGALRM, SIG_IGN); + + tv.it_value.tv_sec = 0; + tv.it_value.tv_usec = 0; + setitimer (ITIMER_REAL, &tv, (struct itimerval*) NULL); +#endif + AnimationActive = False; +} + +void SetAnimationSpeed (int speed) +{ + AnimationSpeed = speed; + if (AnimationSpeed > MAXANIMATIONSPEED) AnimationSpeed = MAXANIMATIONSPEED; +} + +void ModifyAnimationSpeed (int incr) +{ +#ifdef USE_SIGNALS + struct itimerval tv; +#endif + + if ((AnimationSpeed + incr) < 0) return; + if ((AnimationSpeed + incr) == 0) { + if (AnimationActive) StopAnimation (); + AnimationSpeed = 0; + return; + } + AnimationSpeed += incr; + if (AnimationSpeed > MAXANIMATIONSPEED) AnimationSpeed = MAXANIMATIONSPEED; + +#ifdef USE_SIGNALS + signal (SIGALRM, AnimateHandler); + if (AnimationSpeed == 1) { + tv.it_interval.tv_sec = 1; + tv.it_interval.tv_usec = 0; + tv.it_value.tv_sec = 1; + tv.it_value.tv_usec = 0; + } + else { + tv.it_interval.tv_sec = 0; + tv.it_interval.tv_usec = 1000000 / AnimationSpeed; + tv.it_value.tv_sec = 0; + tv.it_value.tv_usec = 1000000 / AnimationSpeed; + } + setitimer (ITIMER_REAL, &tv, (struct itimerval*) NULL); +#else /* USE_SIGNALS */ + if (AnimationSpeed == 1) { + AnimateTimeout.tv_sec = 1; + AnimateTimeout.tv_usec = 0; + } + else { + AnimateTimeout.tv_sec = 0; + AnimateTimeout.tv_usec = 1000000 / AnimationSpeed; + } +#endif /* USE_SIGNALS */ + AnimationActive = True; +} + +#ifdef USE_SIGNALS +SIGNAL_T AnimateHandler (int dummy) +{ + signal (SIGALRM, AnimateHandler); + AnimationPending = True; +} +#endif +#endif /* VMS */ + +void Animate (void) +{ + TwmWindow *t; + int scrnum; + ScreenInfo *scr; + int i; + TBWindow *tbw; + int nb; + + if (AnimationSpeed == 0) return; +#ifdef USE_SIGNALS + AnimationPending = False; +#endif + + MaybeAnimate = False; + for (scrnum = 0; scrnum < NumScreens; scrnum++) { + if ((scr = ScreenList [scrnum]) == NULL) continue; + + for (t = scr->FirstWindow; t != NULL; t = t->next) { + if (! visible (t)) continue; + if (t->icon_on && t->icon && t->icon->bm_w && t->icon->image && + t->icon->image->next) { + AnimateIcons (scr, t->icon); + MaybeAnimate = True; + } + else + if (t->mapped && t->titlebuttons) { + nb = scr->TBInfo.nleft + scr->TBInfo.nright; + for (i = 0, tbw = t->titlebuttons; i < nb; i++, tbw++) { + if (tbw->image && tbw->image->next) { + AnimateButton (tbw); + MaybeAnimate = True; + } + } + } + } + if (scr->Focus) { + t = scr->Focus; + if (t->mapped && t->titlehighlight && t->title_height && + t->HiliteImage && t->HiliteImage->next) { + AnimateHighlight (t); + MaybeAnimate = True; + } + } + } + MaybeAnimate |= AnimateRoot (); + XFlush (dpy); + return; +} + +void InsertRGBColormap (Atom a, XStandardColormap *maps, int nmaps, + Bool replace) +{ + StdCmap *sc = NULL; + + if (replace) { /* locate existing entry */ + for (sc = Scr->StdCmapInfo.head; sc; sc = sc->next) { + if (sc->atom == a) break; + } + } + + if (!sc) { /* no existing, allocate new */ + sc = (StdCmap *) malloc (sizeof (StdCmap)); + if (!sc) { + fprintf (stderr, "%s: unable to allocate %lu bytes for StdCmap\n", + ProgramName, (unsigned long) sizeof(StdCmap)); + return; + } + } + + if (replace) { /* just update contents */ + if (sc->maps) XFree ((char *) maps); + if (sc == Scr->StdCmapInfo.mru) Scr->StdCmapInfo.mru = NULL; + } else { /* else appending */ + sc->next = NULL; + sc->atom = a; + if (Scr->StdCmapInfo.tail) { + Scr->StdCmapInfo.tail->next = sc; + } else { + Scr->StdCmapInfo.head = sc; + } + Scr->StdCmapInfo.tail = sc; + } + sc->nmaps = nmaps; + sc->maps = maps; + + return; +} + +void RemoveRGBColormap (Atom a) +{ + StdCmap *sc, *prev; + + prev = NULL; + for (sc = Scr->StdCmapInfo.head; sc; sc = sc->next) { + if (sc->atom == a) break; + prev = sc; + } + if (sc) { /* found one */ + if (sc->maps) XFree ((char *) sc->maps); + if (prev) prev->next = sc->next; + if (Scr->StdCmapInfo.head == sc) Scr->StdCmapInfo.head = sc->next; + if (Scr->StdCmapInfo.tail == sc) Scr->StdCmapInfo.tail = prev; + if (Scr->StdCmapInfo.mru == sc) Scr->StdCmapInfo.mru = NULL; + } + return; +} + +void LocateStandardColormaps(void) +{ + Atom *atoms; + int natoms; + int i; + + atoms = XListProperties (dpy, Scr->Root, &natoms); + for (i = 0; i < natoms; i++) { + XStandardColormap *maps = NULL; + int nmaps; + + if (XGetRGBColormaps (dpy, Scr->Root, &maps, &nmaps, atoms[i])) { + /* if got one, then append to current list */ + InsertRGBColormap (atoms[i], maps, nmaps, False); + } + } + if (atoms) XFree ((char *) atoms); + return; +} + +void GetColor(int kind, Pixel *what, char *name) +{ + XColor color; + Colormap cmap = Scr->RootColormaps.cwins[0]->colormap->c; + +#ifndef TOM + if (!Scr->FirstTime) + return; +#endif + + if (Scr->Monochrome != kind) + return; + + if (! XParseColor (dpy, cmap, name, &color)) { + fprintf (stderr, "%s: invalid color name \"%s\"\n", ProgramName, name); + return; + } + if (! XAllocColor (dpy, cmap, &color)) + { + /* if we could not allocate the color, let's see if this is a + * standard colormap + */ + XStandardColormap *stdcmap = NULL; + + if (! XParseColor (dpy, cmap, name, &color)) { + fprintf (stderr, "%s: invalid color name \"%s\"\n", ProgramName, name); + return; + } + + /* + * look through the list of standard colormaps (check cache first) + */ + if (Scr->StdCmapInfo.mru && Scr->StdCmapInfo.mru->maps && + (Scr->StdCmapInfo.mru->maps[Scr->StdCmapInfo.mruindex].colormap == + cmap)) { + stdcmap = &(Scr->StdCmapInfo.mru->maps[Scr->StdCmapInfo.mruindex]); + } else { + StdCmap *sc; + + for (sc = Scr->StdCmapInfo.head; sc; sc = sc->next) { + int i; + + for (i = 0; i < sc->nmaps; i++) { + if (sc->maps[i].colormap == cmap) { + Scr->StdCmapInfo.mru = sc; + Scr->StdCmapInfo.mruindex = i; + stdcmap = &(sc->maps[i]); + goto gotit; + } + } + } + } + + gotit: + if (stdcmap) { + color.pixel = (stdcmap->base_pixel + + ((Pixel)(((float)color.red / 65535.0) * + stdcmap->red_max + 0.5) * + stdcmap->red_mult) + + ((Pixel)(((float)color.green /65535.0) * + stdcmap->green_max + 0.5) * + stdcmap->green_mult) + + ((Pixel)(((float)color.blue / 65535.0) * + stdcmap->blue_max + 0.5) * + stdcmap->blue_mult)); + } else { + fprintf (stderr, "%s: unable to allocate color \"%s\"\n", + ProgramName, name); + return; + } + } + + *what = color.pixel; + return; +} + +void GetShadeColors (ColorPair *cp) +{ + XColor xcol; + Colormap cmap = Scr->RootColormaps.cwins[0]->colormap->c; + int save; + float clearfactor; + float darkfactor; + char clearcol [32], darkcol [32]; + + clearfactor = (float) Scr->ClearShadowContrast / 100.0; + darkfactor = (100.0 - (float) Scr->DarkShadowContrast) / 100.0; + xcol.pixel = cp->back; + XQueryColor (dpy, cmap, &xcol); + + sprintf (clearcol, "#%04x%04x%04x", + xcol.red + (unsigned short) ((65535 - xcol.red) * clearfactor), + xcol.green + (unsigned short) ((65535 - xcol.green) * clearfactor), + xcol.blue + (unsigned short) ((65535 - xcol.blue) * clearfactor)); + sprintf (darkcol, "#%04x%04x%04x", + (unsigned short) (xcol.red * darkfactor), + (unsigned short) (xcol.green * darkfactor), + (unsigned short) (xcol.blue * darkfactor)); + + save = Scr->FirstTime; + Scr->FirstTime = True; + GetColor (Scr->Monochrome, &cp->shadc, clearcol); + GetColor (Scr->Monochrome, &cp->shadd, darkcol); + Scr->FirstTime = save; +} + +void GetFont(MyFont *font) +{ + char *deffontname = "fixed,*"; + char **missing_charset_list_return; + int missing_charset_count_return; + char *def_string_return; + XFontSetExtents *font_extents; + XFontStruct **xfonts; + char **font_names; + register int i; + int ascent; + int descent; + int fnum; + char *basename2; + + if (font->font_set != NULL){ + XFreeFontSet(dpy, font->font_set); + } + + basename2 = (char *)malloc(strlen(font->basename) + 3); + if (basename2) sprintf(basename2, "%s,*", font->basename); + else basename2 = font->basename; + if( (font->font_set = XCreateFontSet(dpy, basename2, + &missing_charset_list_return, + &missing_charset_count_return, + &def_string_return)) == NULL) { + if (Scr->DefaultFont.basename) { + deffontname = Scr->DefaultFont.basename; + } + if ((font->font_set = XCreateFontSet(dpy, deffontname, + &missing_charset_list_return, + &missing_charset_count_return, + &def_string_return)) == NULL) + { + fprintf (stderr, "%s: unable to open fonts \"%s\" or \"%s\"\n", + ProgramName, font->basename, deffontname); + exit(1); + } + } + if (basename2 != font->basename) free(basename2); + font_extents = XExtentsOfFontSet(font->font_set); + + fnum = XFontsOfFontSet(font->font_set, &xfonts, &font_names); + for( i = 0, ascent = 0, descent = 0; iascent); + descent = MaxSize(descent, (*xfonts)->descent); + xfonts++; + } + + font->height = font_extents->max_logical_extent.height; + font->y = ascent; + font->ascent = ascent; + font->descent = descent; +} + + +void SetFocusVisualAttributes (TwmWindow *tmp_win, Bool focus) +{ + if (! tmp_win) return; + + if (focus == tmp_win->hasfocusvisible) return; + if (tmp_win->highlight) { + if (Scr->use3Dborders) { + PaintBorders (tmp_win, focus); + } + else { + if (focus) { + XSetWindowBorder (dpy, tmp_win->frame, tmp_win->borderC.back); + if (tmp_win->title_w) + XSetWindowBorder (dpy, tmp_win->title_w, tmp_win->borderC.back); + } else { + XSetWindowBorderPixmap (dpy, tmp_win->frame, tmp_win->gray); + if (tmp_win->title_w) + XSetWindowBorderPixmap (dpy, tmp_win->title_w, tmp_win->gray); + } + } + } + + if (focus) { + Bool hil = False; + + if (tmp_win->lolite_wl) XUnmapWindow (dpy, tmp_win->lolite_wl); + if (tmp_win->lolite_wr) XUnmapWindow (dpy, tmp_win->lolite_wr); + if (tmp_win->hilite_wl) { + XMapWindow (dpy, tmp_win->hilite_wl); + hil = True; + } + if (tmp_win->hilite_wr) { + XMapWindow (dpy, tmp_win->hilite_wr); + hil = True; + } + if (hil && tmp_win->HiliteImage && tmp_win->HiliteImage->next) { + MaybeAnimate = True; + } + if (tmp_win->iconmanagerlist) + ActiveIconManager (tmp_win->iconmanagerlist); + } + else { + if (tmp_win->hilite_wl) XUnmapWindow (dpy, tmp_win->hilite_wl); + if (tmp_win->hilite_wr) XUnmapWindow (dpy, tmp_win->hilite_wr); + if (tmp_win->lolite_wl) XMapWindow (dpy, tmp_win->lolite_wl); + if (tmp_win->lolite_wr) XMapWindow (dpy, tmp_win->lolite_wr); + if (tmp_win->iconmanagerlist) + NotActiveIconManager (tmp_win->iconmanagerlist); + } + if (Scr->use3Dtitles && Scr->SunkFocusWindowTitle && tmp_win->title_height) { + ButtonState bs; + + bs = focus ? on : off; + Draw3DBorder (tmp_win->title_w, Scr->TBInfo.titlex, 0, + tmp_win->title_width - Scr->TBInfo.titlex - + Scr->TBInfo.rightoff - Scr->TitlePadding, + Scr->TitleHeight, Scr->TitleShadowDepth, + tmp_win->title, bs, False, False); + } + tmp_win->hasfocusvisible = focus; +} + +static void move_to_head (TwmWindow *t) +{ + if (t == NULL) return; + if (Scr->FirstWindow == t) return; + + if (t->prev) t->prev->next = t->next; + if (t->next) t->next->prev = t->prev; + + t->next = Scr->FirstWindow; + if (Scr->FirstWindow != NULL) + Scr->FirstWindow->prev = t; + t->prev = NULL; + Scr->FirstWindow = t; +} + +/* + * SetFocus - separate routine to set focus to make things more understandable + * and easier to debug + */ +void SetFocus (TwmWindow *tmp_win, Time tim) +{ + Window w = (tmp_win ? tmp_win->w : PointerRoot); + int f_iconmgr = 0; + + if (Scr->Focus && (Scr->Focus->iconmgr)) f_iconmgr = 1; + if (Scr->SloppyFocus && (w == PointerRoot) && (!f_iconmgr)) return; + + XSetInputFocus (dpy, w, RevertToPointerRoot, tim); + if (Scr->Focus == tmp_win) return; + + if (Scr->Focus) { + if (Scr->Focus->AutoSqueeze && !Scr->Focus->squeezed) { + AutoSqueeze (Scr->Focus); + } + SetFocusVisualAttributes (Scr->Focus, False); + } + if (tmp_win) { + if (tmp_win->AutoSqueeze && tmp_win->squeezed) { + AutoSqueeze (tmp_win); + } + SetFocusVisualAttributes (tmp_win, True); + } + Scr->Focus = tmp_win; + move_to_head (tmp_win); +} + +# +#ifdef NOPUTENV +/* + * define our own putenv() if the system doesn't have one. + * putenv(s): place s (a string of the form "NAME=value") in + * the environment; replacing any existing NAME. s is placed in + * environment, so if you change s, the environment changes (like + * putenv on a sun). Binding removed if you putenv something else + * called NAME. + */ +int +putenv(s) + char *s; +{ + char *v; + int varlen, idx; + extern char **environ; + char **newenv; + static int virgin = 1; /* true while "environ" is a virgin */ + + v = strchr(s, '='); + if(v == 0) + return 0; /* punt if it's not of the right form */ + varlen = (v + 1) - s; + + for (idx = 0; environ[idx] != 0; idx++) { + if (strncmp(environ[idx], s, varlen) == 0) { + if(v[1] != 0) { /* true if there's a value */ + environ[idx] = s; + return 0; + } else { + do { + environ[idx] = environ[idx+1]; + } while(environ[++idx] != 0); + return 0; + } + } + } + + /* add to environment (unless no value; then just return) */ + if(v[1] == 0) + return 0; + if(virgin) { + register i; + + newenv = (char **) malloc((unsigned) ((idx + 2) * sizeof(char*))); + if(newenv == 0) + return -1; + for(i = idx-1; i >= 0; --i) + newenv[i] = environ[i]; + virgin = 0; /* you're not a virgin anymore, sweety */ + } else { + newenv = (char **) realloc((char *) environ, + (unsigned) ((idx + 2) * sizeof(char*))); + if (newenv == 0) + return -1; + } + + environ = newenv; + environ[idx] = s; + environ[idx+1] = 0; + + return 0; +} +#endif /* NOPUTENV */ + + +static Pixmap CreateXLogoPixmap (unsigned int *widthp, unsigned int *heightp) +{ + int h = Scr->TBInfo.width - Scr->TBInfo.border * 2; + if (h < 0) h = 0; + + *widthp = *heightp = (unsigned int) h; + if (Scr->tbpm.xlogo == None) { + GC gc, gcBack; + + Scr->tbpm.xlogo = XCreatePixmap (dpy, Scr->Root, h, h, 1); + gc = XCreateGC (dpy, Scr->tbpm.xlogo, 0L, NULL); + XSetForeground (dpy, gc, 0); + XFillRectangle (dpy, Scr->tbpm.xlogo, gc, 0, 0, h, h); + XSetForeground (dpy, gc, 1); + gcBack = XCreateGC (dpy, Scr->tbpm.xlogo, 0L, NULL); + XSetForeground (dpy, gcBack, 0); + + /* + * draw the logo large so that it gets as dense as possible; then white + * out the edges so that they look crisp + */ + XmuDrawLogo (dpy, Scr->tbpm.xlogo, gc, gcBack, -1, -1, h + 2, h + 2); + XDrawRectangle (dpy, Scr->tbpm.xlogo, gcBack, 0, 0, h - 1, h - 1); + + /* + * done drawing + */ + XFreeGC (dpy, gc); + XFreeGC (dpy, gcBack); + } + return Scr->tbpm.xlogo; +} + + +static Pixmap CreateResizePixmap (unsigned int *widthp, unsigned int *heightp) +{ + int h = Scr->TBInfo.width - Scr->TBInfo.border * 2; + if (h < 1) h = 1; + + *widthp = *heightp = (unsigned int) h; + if (Scr->tbpm.resize == None) { + XPoint points[3]; + GC gc; + int w; + int lw; + + /* + * create the pixmap + */ + Scr->tbpm.resize = XCreatePixmap (dpy, Scr->Root, h, h, 1); + gc = XCreateGC (dpy, Scr->tbpm.resize, 0L, NULL); + XSetForeground (dpy, gc, 0); + XFillRectangle (dpy, Scr->tbpm.resize, gc, 0, 0, h, h); + XSetForeground (dpy, gc, 1); + lw = h / 16; + if (lw == 1) + lw = 0; + XSetLineAttributes (dpy, gc, lw, LineSolid, CapButt, JoinMiter); + + /* + * draw the resize button, + */ + w = (h * 2) / 3; + points[0].x = w; + points[0].y = 0; + points[1].x = w; + points[1].y = w; + points[2].x = 0; + points[2].y = w; + XDrawLines (dpy, Scr->tbpm.resize, gc, points, 3, CoordModeOrigin); + w = w / 2; + points[0].x = w; + points[0].y = 0; + points[1].x = w; + points[1].y = w; + points[2].x = 0; + points[2].y = w; + XDrawLines (dpy, Scr->tbpm.resize, gc, points, 3, CoordModeOrigin); + + /* + * done drawing + */ + XFreeGC(dpy, gc); + } + return Scr->tbpm.resize; +} + +static Pixmap CreateDotPixmap (unsigned int *widthp, unsigned int *heightp) +{ + int h = Scr->TBInfo.width - Scr->TBInfo.border * 2; + + h = h * 3 / 4; + if (h < 1) h = 1; + if (!(h & 1)) + h--; + *widthp = *heightp = (unsigned int) h; + if (Scr->tbpm.delete == None) { + GC gc; + Pixmap pix; + + pix = Scr->tbpm.delete = XCreatePixmap (dpy, Scr->Root, h, h, 1); + gc = XCreateGC (dpy, pix, 0L, NULL); + XSetLineAttributes (dpy, gc, h, LineSolid, CapRound, JoinRound); + XSetForeground (dpy, gc, 0L); + XFillRectangle (dpy, pix, gc, 0, 0, h, h); + XSetForeground (dpy, gc, 1L); + XDrawLine (dpy, pix, gc, h/2, h/2, h/2, h/2); + XFreeGC (dpy, gc); + } + return Scr->tbpm.delete; +} + +static Image *Create3DCrossImage (ColorPair cp) +{ + Image *image; + int h; + int point; + int midpoint; + + h = Scr->TBInfo.width - Scr->TBInfo.border * 2; + if (!(h & 1)) h--; + point = 4; + midpoint = h/2; + + image = (Image*) malloc (sizeof (struct _Image)); + if (! image) return (None); + image->pixmap = XCreatePixmap (dpy, Scr->Root, h, h, Scr->d_depth); + if (image->pixmap == None) return (None); + + Draw3DBorder (image->pixmap, 0, 0, h, h, Scr->TitleButtonShadowDepth, cp, off, True, False); + +#ifdef LEVITTE_TEST + FB (cp.shadc, cp.shadd); + XDrawLine (dpy, image->pixmap, Scr->NormalGC, point+1, point-1, point-1, point+1); + XDrawLine (dpy, image->pixmap, Scr->NormalGC, point+1, point, point, point+1); + XDrawLine (dpy, image->pixmap, Scr->NormalGC, point-1, point+1, midpoint-2, midpoint); + XDrawLine (dpy, image->pixmap, Scr->NormalGC, midpoint, midpoint+2, h-point-3, h-point-1); + XDrawLine (dpy, image->pixmap, Scr->NormalGC, point, point+1, h-point-3, h-point-2); + XDrawLine (dpy, image->pixmap, Scr->NormalGC, point-1, h-point-2, midpoint-2, midpoint); + XDrawLine (dpy, image->pixmap, Scr->NormalGC, midpoint, midpoint-2, h-point-2, point-1); + XDrawLine (dpy, image->pixmap, Scr->NormalGC, point, h-point-2, h-point-2, point); +#endif + + FB (cp.shadd, cp.shadc); +#ifdef LEVITTE_TEST + XDrawLine (dpy, image->pixmap, Scr->NormalGC, point+2, point+1, h-point-1, h-point-2); + XDrawLine (dpy, image->pixmap, Scr->NormalGC, point+2, point, midpoint, midpoint-2); + XDrawLine (dpy, image->pixmap, Scr->NormalGC, midpoint+2, midpoint, h-point, h-point-2); + XDrawLine (dpy, image->pixmap, Scr->NormalGC, h-point, h-point-2, h-point-2, h-point); + XDrawLine (dpy, image->pixmap, Scr->NormalGC, h-point-1, h-point-2, h-point-2, h-point-1); +#else + XDrawLine (dpy, image->pixmap, Scr->NormalGC, point, point, h-point-1, h-point-1); + XDrawLine (dpy, image->pixmap, Scr->NormalGC, point-1, point, h-point-1, h-point); + XDrawLine (dpy, image->pixmap, Scr->NormalGC, point, point-1, h-point, h-point-1); +#endif + +#ifdef LEVITTE_TEST + XDrawLine (dpy, image->pixmap, Scr->NormalGC, point, h-point-1, point, h-point-1); + XDrawLine (dpy, image->pixmap, Scr->NormalGC, h-point-1, point, h-point-1, point); +#else + XDrawLine (dpy, image->pixmap, Scr->NormalGC, point, h-point-1, h-point-1, point); +#endif +#ifdef LEVITTE_TEST + XDrawLine (dpy, image->pixmap, Scr->NormalGC, point+1, h-point-1, h-point-1, point+1); + XDrawLine (dpy, image->pixmap, Scr->NormalGC, point+1, h-point, midpoint, midpoint+2); + XDrawLine (dpy, image->pixmap, Scr->NormalGC, midpoint+2, midpoint, h-point, point+1); +#else + XDrawLine (dpy, image->pixmap, Scr->NormalGC, point-1, h-point-1, h-point-1, point-1); + XDrawLine (dpy, image->pixmap, Scr->NormalGC, point, h-point, h-point, point); +#endif + + image->mask = None; + image->width = h; + image->height = h; + image->next = None; + + return (image); +} + +static Image *Create3DIconifyImage (ColorPair cp) +{ + Image *image; + int h; + int point; + + h = Scr->TBInfo.width - Scr->TBInfo.border * 2; + if (!(h & 1)) h--; + point = ((h/2-2) * 2+1) / 3; + + image = (Image*) malloc (sizeof (struct _Image)); + if (! image) return (None); + image->pixmap = XCreatePixmap (dpy, Scr->Root, h, h, Scr->d_depth); + if (image->pixmap == None) return (None); + + Draw3DBorder (image->pixmap, 0, 0, h, h, Scr->TitleButtonShadowDepth, cp, off, True, False); + FB (cp.shadd, cp.shadc); + XDrawLine (dpy, image->pixmap, Scr->NormalGC, point, point, h/2, h-point); + XDrawLine (dpy, image->pixmap, Scr->NormalGC, point, point, h-point, point); + + FB (cp.shadc, cp.shadd); + XDrawLine (dpy, image->pixmap, Scr->NormalGC, h-point, point, h/2+1, h-point); + XDrawLine (dpy, image->pixmap, Scr->NormalGC, h-point-1, point+1, h/2+1, h-point-1); + + image->mask = None; + image->width = h; + image->height = h; + image->next = None; + + return (image); +} + +static Image *Create3DSunkenResizeImage (ColorPair cp) +{ + int h; + Image *image; + + h = Scr->TBInfo.width - Scr->TBInfo.border * 2; + if (!(h & 1)) h--; + + image = (Image*) malloc (sizeof (struct _Image)); + if (! image) return (None); + image->pixmap = XCreatePixmap (dpy, Scr->Root, h, h, Scr->d_depth); + if (image->pixmap == None) return (None); + + Draw3DBorder (image->pixmap, 0, 0, h, h, Scr->TitleButtonShadowDepth, cp, off, True, False); + Draw3DBorder (image->pixmap, 3, 3, h-6, h-6, 1, cp, on, True, False); + Draw3DBorder (image->pixmap, 3, ((h-6)/3)+3, ((h-6)*2/3)+1, + ((h-6)*2/3)+1, 1, cp, on, True, False); + Draw3DBorder (image->pixmap, 3, ((h-6)*2/3)+3, ((h-6)/3)+1, + ((h-6)/3)+1, 1, cp, on, True, False); + + image->mask = None; + image->width = h; + image->height = h; + image->next = None; + + return (image); +} + +static Image *Create3DBoxImage (ColorPair cp) +{ + int h; + Image *image; + + h = Scr->TBInfo.width - Scr->TBInfo.border * 2; + if (! (h & 1)) h--; + + image = (Image*) malloc (sizeof (struct _Image)); + if (! image) return (None); + image->pixmap = XCreatePixmap (dpy, Scr->Root, h, h, Scr->d_depth); + if (image->pixmap == None) return (None); + + Draw3DBorder (image->pixmap, 0, 0, h, h, Scr->TitleButtonShadowDepth, cp, off, True, False); + Draw3DBorder (image->pixmap, (h / 2) - 4, (h / 2) - 4, 9, 9, 1, cp, + off, True, False); + + image->mask = None; + image->width = h; + image->height = h; + image->next = None; + + return (image); +} + +static Image *Create3DDotImage (ColorPair cp) +{ + Image *image; + int h; + static int idepth = 2; + + h = Scr->TBInfo.width - Scr->TBInfo.border * 2; + if (!(h & 1)) h--; + + image = (Image*) malloc (sizeof (struct _Image)); + if (! image) return (None); + image->pixmap = XCreatePixmap (dpy, Scr->Root, h, h, Scr->d_depth); + if (image->pixmap == None) return (None); + + Draw3DBorder (image->pixmap, 0, 0, h, h, Scr->TitleButtonShadowDepth, cp, off, True, False); + Draw3DBorder (image->pixmap, (h / 2) - idepth, + (h / 2) - idepth, + 2 * idepth + 1, + 2 * idepth + 1, + idepth, cp, off, True, False); + image->mask = None; + image->width = h; + image->height = h; + image->next = None; + return (image); +} + +static Image *Create3DBarImage (ColorPair cp) +{ + Image *image; + int h; + static int idepth = 2; + + h = Scr->TBInfo.width - Scr->TBInfo.border * 2; + if (!(h & 1)) h--; + + image = (Image*) malloc (sizeof (struct _Image)); + if (! image) return (None); + image->pixmap = XCreatePixmap (dpy, Scr->Root, h, h, Scr->d_depth); + if (image->pixmap == None) return (None); + + Draw3DBorder (image->pixmap, 0, 0, h, h, Scr->TitleButtonShadowDepth, cp, off, True, False); + Draw3DBorder (image->pixmap, + Scr->TitleButtonShadowDepth + 2, + (h / 2) - idepth, + h - 2 * (Scr->TitleButtonShadowDepth + 2), + 2 * idepth + 1, + idepth, cp, off, True, False); + image->mask = None; + image->width = h; + image->height = h; + image->next = None; + return (image); +} + +static Image *Create3DVertBarImage (ColorPair cp) +{ + Image *image; + int h; + static int idepth = 2; + + h = Scr->TBInfo.width - Scr->TBInfo.border * 2; + if (!(h & 1)) h--; + + image = (Image*) malloc (sizeof (struct _Image)); + if (! image) return (None); + image->pixmap = XCreatePixmap (dpy, Scr->Root, h, h, Scr->d_depth); + if (image->pixmap == None) return (None); + + Draw3DBorder (image->pixmap, 0, 0, h, h, Scr->TitleButtonShadowDepth, cp, off, True, False); + Draw3DBorder (image->pixmap, + (h / 2) - idepth, + Scr->TitleButtonShadowDepth + 2, + 2 * idepth + 1, + h - 2 * (Scr->TitleButtonShadowDepth + 2), + idepth, cp, off, True, False); + image->mask = None; + image->width = h; + image->height = h; + image->next = None; + return (image); +} + +static Image *Create3DMenuImage (ColorPair cp) +{ + Image *image; + int h, i; + + h = Scr->TBInfo.width - Scr->TBInfo.border * 2; + if (!(h & 1)) h--; + + image = (Image*) malloc (sizeof (struct _Image)); + if (! image) return (None); + image->pixmap = XCreatePixmap (dpy, Scr->Root, h, h, Scr->d_depth); + if (image->pixmap == None) return (None); + + Draw3DBorder (image->pixmap, 0, 0, h, h, Scr->TitleButtonShadowDepth, cp, off, True, False); + for (i = 4; i < h - 7; i += 5) { + Draw3DBorder (image->pixmap, 4, i, h - 8, 4, 2, cp, off, True, False); + } + image->mask = None; + image->width = h; + image->height = h; + image->next = None; + return (image); +} + +static Image *Create3DResizeImage (ColorPair cp) +{ + Image *image; + int h; + + h = Scr->TBInfo.width - Scr->TBInfo.border * 2; + if (!(h & 1)) h--; + + image = (Image*) malloc (sizeof (struct _Image)); + if (! image) return (None); + image->pixmap = XCreatePixmap (dpy, Scr->Root, h, h, Scr->d_depth); + if (image->pixmap == None) return (None); + + Draw3DBorder (image->pixmap, 0, 0, h, h, Scr->TitleButtonShadowDepth, cp, off, True, False); + Draw3DBorder (image->pixmap, 0, h / 4, ((3 * h) / 4) + 1, ((3 * h) / 4) + 1, 2, + cp, off, True, False); + Draw3DBorder (image->pixmap, 0, h / 2, (h / 2) + 1, (h / 2) + 1, 2, cp, off, True, False); + image->mask = None; + image->width = h; + image->height = h; + image->next = None; + return (image); +} + +static Image *Create3DZoomImage (ColorPair cp) +{ + Image *image; + int h; + static int idepth = 2; + + h = Scr->TBInfo.width - Scr->TBInfo.border * 2; + if (!(h & 1)) h--; + + image = (Image*) malloc (sizeof (struct _Image)); + if (! image) return (None); + image->pixmap = XCreatePixmap (dpy, Scr->Root, h, h, Scr->d_depth); + if (image->pixmap == None) return (None); + + Draw3DBorder (image->pixmap, 0, 0, h, h, Scr->TitleButtonShadowDepth, cp, off, True, False); + Draw3DBorder (image->pixmap, Scr->TitleButtonShadowDepth + 2, + Scr->TitleButtonShadowDepth + 2, + h - 2 * (Scr->TitleButtonShadowDepth + 2), + h - 2 * (Scr->TitleButtonShadowDepth + 2), + idepth, cp, off, True, False); + + image->mask = None; + image->width = h; + image->height = h; + image->next = None; + return (image); +} + +struct Colori { + Pixel color; + Pixmap pix; + struct Colori *next; +}; + +Pixmap Create3DMenuIcon (unsigned int height, + unsigned int *widthp, unsigned int *heightp, + ColorPair cp) +{ + unsigned int h, w; + int i; + struct Colori *col; + static struct Colori *colori = NULL; + + h = height; + w = h * 7 / 8; + if (h < 1) h = 1; + if (w < 1) w = 1; + *widthp = w; + *heightp = h; + + for (col = colori; col; col = col->next) { + if (col->color == cp.back) break; + } + if (col != NULL) { + return (col->pix); + } + col = (struct Colori*) malloc (sizeof (struct Colori)); + col->color = cp.back; + col->pix = XCreatePixmap (dpy, Scr->Root, h, h, Scr->d_depth); + col->next = colori; + colori = col; + + Draw3DBorder (col->pix, 0, 0, w, h, 1, cp, off, True, False); + for (i = 3; i + 5 < h; i += 5) { + Draw3DBorder (col->pix, 4, i, w - 8, 3, 1, Scr->MenuC, off, True, False); + } + return (colori->pix); +} + +#include "siconify.bm" + +Pixmap Create3DIconManagerIcon (ColorPair cp) +{ + unsigned int w, h; + struct Colori *col; + static struct Colori *colori = NULL; + + w = (unsigned int) siconify_width; + h = (unsigned int) siconify_height; + + for (col = colori; col; col = col->next) { + if (col->color == cp.back) break; + } + if (col != NULL) { + return (col->pix); + } + col = (struct Colori*) malloc (sizeof (struct Colori)); + col->color = cp.back; + col->pix = XCreatePixmap (dpy, Scr->Root, w, h, Scr->d_depth); + Draw3DBorder (col->pix, 0, 0, w, h, 4, cp, off, True, False); + col->next = colori; + colori = col; + + return (colori->pix); +} + +static Image *Create3DResizeAnimation (Bool in, Bool left, Bool top, + ColorPair cp) +{ + int h, i, j; + Image *image, *im, *im1; + + h = Scr->TBInfo.width - Scr->TBInfo.border * 2; + if (!(h & 1)) h--; + + image = im1 = None; + for (i = (in ? 0 : (h/4)-1); (i < h/4) && (i >= 0); i += (in ? 1 : -1)) { + im = (Image*) malloc (sizeof (struct _Image)); + if (! im) return (None); + im->pixmap = XCreatePixmap (dpy, Scr->Root, h, h, Scr->d_depth); + if (im->pixmap == None) { + free (im); + return (None); + } + Draw3DBorder (im->pixmap, 0, 0, h, h, Scr->TitleButtonShadowDepth, cp, off, True, False); + for (j = i; j <= h; j += (h/4)){ + Draw3DBorder (im->pixmap, (left ? 0 : j), (top ? 0 : j), + h - j, h - j, 2, cp, off, True, False); + } + im->mask = None; + im->width = h; + im->height = h; + im->next = None; + if (image == None) { + image = im1 = im; + } + else { + im1->next = im; + im1 = im; + } + } + if (im1 != None) im1->next = image; + return (image); +} + +static Image *Create3DResizeInTopAnimation (ColorPair cp) +{ + return Create3DResizeAnimation (TRUE, FALSE, TRUE, cp); +} + +static Image *Create3DResizeOutTopAnimation (ColorPair cp) +{ + return Create3DResizeAnimation (False, FALSE, TRUE, cp); +} + +static Image *Create3DResizeInBotAnimation (ColorPair cp) +{ + return Create3DResizeAnimation (TRUE, TRUE, FALSE, cp); +} + +static Image *Create3DResizeOutBotAnimation (ColorPair cp) +{ + return Create3DResizeAnimation (False, TRUE, FALSE, cp); +} + +static Image *Create3DMenuAnimation (Bool up, ColorPair cp) +{ + int h, i, j; + Image *image, *im, *im1; + + h = Scr->TBInfo.width - Scr->TBInfo.border * 2; + if (!(h & 1)) h--; + + image = im1 = None; + for (j = (up ? 4 : 0); j != (up ? -1 : 5); j+= (up ? -1 : 1)) { + im = (Image*) malloc (sizeof (struct _Image)); + if (! im) return (None); + im->pixmap = XCreatePixmap (dpy, Scr->Root, h, h, Scr->d_depth); + if (im->pixmap == None) { + free (im); + return (None); + } + Draw3DBorder (im->pixmap, 0, 0, h, h, Scr->TitleButtonShadowDepth, cp, off, True, False); + for (i = j; i < h - 3; i += 5) { + Draw3DBorder (im->pixmap, 4, i, h - 8, 4, 2, cp, off, True, False); + } + im->mask = None; + im->width = h; + im->height = h; + im->next = None; + if (image == None) { + image = im1 = im; + } + else { + im1->next = im; + im1 = im; + } + } + if (im1 != None) im1->next = image; + return (image); +} + +static Image *Create3DMenuUpAnimation (ColorPair cp) +{ + return Create3DMenuAnimation (TRUE, cp); +} + +static Image *Create3DMenuDownAnimation (ColorPair cp) +{ + return Create3DMenuAnimation (False, cp); +} + +static Image *Create3DZoomAnimation (Bool in, Bool out, int n, ColorPair cp) +{ + int h, i, j, k; + Image *image, *im, *im1; + + h = Scr->TBInfo.width - Scr->TBInfo.border * 2; + if (!(h & 1)) h--; + + if (n == 0) n = (h/2) - 2; + + image = im1 = None; + for (j = (out ? -1 : 1) ; j < (in ? 2 : 0); j += 2){ + for(k = (j > 0 ? 0 : n-1) ; (k >= 0) && (k < n); k += j){ + im = (Image*) malloc (sizeof (struct _Image)); + im->pixmap = XCreatePixmap (dpy, Scr->Root, h, h, Scr->d_depth); + Draw3DBorder (im->pixmap, 0, 0, h, h, Scr->TitleButtonShadowDepth, cp, off, True, False); + for (i = 2 + k; i < (h / 2); i += n) { + Draw3DBorder (im->pixmap, i, i, h - (2 * i), h - (2 * i), 2, cp, off, True, False); + } + im->mask = None; + im->width = h; + im->height = h; + im->next = None; + if (image == None) { + image = im1 = im; + } + else { + im1->next = im; + im1 = im; + } + } + } + if (im1 != None) im1->next = image; + return (image); +} + +static Image *Create3DMazeInAnimation (ColorPair cp) +{ + return Create3DZoomAnimation(TRUE, FALSE, 6, cp); +} + +static Image *Create3DMazeOutAnimation (ColorPair cp) +{ + return Create3DZoomAnimation(FALSE, TRUE, 6, cp); +} + +static Image *Create3DZoomInAnimation (ColorPair cp) +{ + return Create3DZoomAnimation(TRUE, FALSE, 0, cp); +} + +static Image *Create3DZoomOutAnimation (ColorPair cp) +{ + return Create3DZoomAnimation(FALSE, TRUE, 0, cp); +} + +static Image *Create3DZoomInOutAnimation (ColorPair cp) +{ + return Create3DZoomAnimation(TRUE, TRUE, 0, cp); +} + +#define questionmark_width 8 +#define questionmark_height 8 +static char questionmark_bits[] = { + 0x38, 0x7c, 0x64, 0x30, 0x18, 0x00, 0x18, 0x18}; + +static Pixmap CreateQuestionPixmap (unsigned int *widthp, + unsigned int *heightp) +{ + *widthp = questionmark_width; + *heightp = questionmark_height; + if (Scr->tbpm.question == None) { + Scr->tbpm.question = XCreateBitmapFromData (dpy, Scr->Root, + questionmark_bits, + questionmark_width, + questionmark_height); + } + /* + * this must succeed or else we are in deep trouble elsewhere + */ + return Scr->tbpm.question; +} + + +static Pixmap CreateMenuPixmap (unsigned int *widthp, unsigned int *heightp) +{ + return (CreateMenuIcon (Scr->TBInfo.width - Scr->TBInfo.border * 2,widthp,heightp)); +} + +Pixmap CreateMenuIcon (int height, unsigned int *widthp, unsigned int *heightp) +{ + int h, w; + int ih, iw; + int ix, iy; + int mh, mw; + int tw, th; + int lw, lh; + int lx, ly; + int lines, dly; + int offset; + int bw; + + h = height; + w = h * 7 / 8; + if (h < 1) + h = 1; + if (w < 1) + w = 1; + *widthp = w; + *heightp = h; + if (Scr->tbpm.menu == None) { + Pixmap pix; + GC gc; + + pix = Scr->tbpm.menu = XCreatePixmap (dpy, Scr->Root, w, h, 1); + gc = XCreateGC (dpy, pix, 0L, NULL); + XSetForeground (dpy, gc, 0L); + XFillRectangle (dpy, pix, gc, 0, 0, w, h); + XSetForeground (dpy, gc, 1L); + ix = 1; + iy = 1; + ih = h - iy * 2; + iw = w - ix * 2; + offset = ih / 8; + mh = ih - offset; + mw = iw - offset; + bw = mh / 16; + if (bw == 0 && mw > 2) + bw = 1; + tw = mw - bw * 2; + th = mh - bw * 2; + XFillRectangle (dpy, pix, gc, ix, iy, mw, mh); + XFillRectangle (dpy, pix, gc, ix + iw - mw, iy + ih - mh, mw, mh); + XSetForeground (dpy, gc, 0L); + XFillRectangle (dpy, pix, gc, ix+bw, iy+bw, tw, th); + XSetForeground (dpy, gc, 1L); + lw = tw / 2; + if ((tw & 1) ^ (lw & 1)) + lw++; + lx = ix + bw + (tw - lw) / 2; + + lh = th / 2 - bw; + if ((lh & 1) ^ ((th - bw) & 1)) + lh++; + ly = iy + bw + (th - bw - lh) / 2; + + lines = 3; + if ((lh & 1) && lh < 6) + { + lines--; + } + dly = lh / (lines - 1); + while (lines--) + { + XFillRectangle (dpy, pix, gc, lx, ly, lw, bw); + ly += dly; + } + XFreeGC (dpy, gc); + } + return Scr->tbpm.menu; +} + +#define FBGC(gc, fix_fore, fix_back)\ + Gcv.foreground = fix_fore;\ + Gcv.background = fix_back;\ + XChangeGC(dpy, gc, GCForeground|GCBackground,&Gcv) + +void Draw3DBorder (Window w, int x, int y, int width, int height, int bw, + ColorPair cp, int state, int fill, int forcebw) +{ + int i; + XGCValues gcv; + unsigned long gcm; + + if ((width < 1) || (height < 1)) return; + if (Scr->Monochrome != COLOR) { + if (fill) { + gcm = GCFillStyle; + gcv.fill_style = FillOpaqueStippled; + XChangeGC (dpy, Scr->BorderGC, gcm, &gcv); + XFillRectangle (dpy, w, Scr->BorderGC, x, y, width, height); + } + gcm = 0; + gcm |= GCLineStyle; + gcv.line_style = (state == on) ? LineSolid : LineDoubleDash; + gcm |= GCFillStyle; + gcv.fill_style = FillSolid; + XChangeGC (dpy, Scr->BorderGC, gcm, &gcv); + for (i = 0; i < bw; i++) { + XDrawLine (dpy, w, Scr->BorderGC, x, y + i, + x + width - i - 1, y + i); + XDrawLine (dpy, w, Scr->BorderGC, x + i, y, + x + i, y + height - i - 1); + } + + gcm = 0; + gcm |= GCLineStyle; + gcv.line_style = (state == on) ? LineDoubleDash : LineSolid; + gcm |= GCFillStyle; + gcv.fill_style = FillSolid; + XChangeGC (dpy, Scr->BorderGC, gcm, &gcv); + for (i = 0; i < bw; i++) { + XDrawLine (dpy, w, Scr->BorderGC, x + width - i - 1, y + i, + x + width - i - 1, y + height - 1); + XDrawLine (dpy, w, Scr->BorderGC, x + i, y + height - i - 1, + x + width - 1, y + height - i - 1); + } + return; + } + + if (fill) { + FBGC (Scr->BorderGC, cp.back, cp.fore); + XFillRectangle (dpy, w, Scr->BorderGC, x, y, width, height); + } + if (Scr->BeNiceToColormap) { + int dashoffset = 0; + + gcm = 0; + gcm |= GCLineStyle; + gcv.line_style = (forcebw) ? LineSolid : LineDoubleDash; + gcm |= GCBackground; + gcv.background = cp.back; + XChangeGC (dpy, Scr->BorderGC, gcm, &gcv); + + if (state == on) + XSetForeground (dpy, Scr->BorderGC, Scr->Black); + else + XSetForeground (dpy, Scr->BorderGC, Scr->White); + for (i = 0; i < bw; i++) { + XDrawLine (dpy, w, Scr->BorderGC, x + i, y + dashoffset, + x + i, y + height - i - 1); + XDrawLine (dpy, w, Scr->BorderGC, x + dashoffset, y + i, + x + width - i - 1, y + i); + dashoffset = 1 - dashoffset; + } + XSetForeground (dpy, Scr->BorderGC, ((state == on) ? Scr->White : Scr->Black)); + for (i = 0; i < bw; i++) { + XDrawLine (dpy, w, Scr->BorderGC, x + i, y + height - i - 1, + x + width - 1, y + height - i - 1); + XDrawLine (dpy, w, Scr->BorderGC, x + width - i - 1, y + i, + x + width - i - 1, y + height - 1); + } + return; + } + if (state == on) { FBGC (Scr->BorderGC, cp.shadd, cp.shadc); } + else { FBGC (Scr->BorderGC, cp.shadc, cp.shadd); } + for (i = 0; i < bw; i++) { + XDrawLine (dpy, w, Scr->BorderGC, x, y + i, + x + width - i - 1, y + i); + XDrawLine (dpy, w, Scr->BorderGC, x + i, y, + x + i, y + height - i - 1); + } + + if (state == on) { FBGC (Scr->BorderGC, cp.shadc, cp.shadd); } + else { FBGC (Scr->BorderGC, cp.shadd, cp.shadc); } + for (i = 0; i < bw; i++) { + XDrawLine (dpy, w, Scr->BorderGC, x + width - i - 1, y + i, + x + width - i - 1, y + height - 1); + XDrawLine (dpy, w, Scr->BorderGC, x + i, y + height - i - 1, + x + width - 1, y + height - i - 1); + } + return; +} + +void Draw3DCorner (Window w, + int x, int y, int width, int height, int thick, int bw, + ColorPair cp, int type) +{ + XRectangle rects [2]; + + switch (type) { + case 0 : + Draw3DBorder (w, x, y, width, height, bw, cp, off, True, False); + Draw3DBorder (w, x + thick - bw, y + thick - bw, + width - thick + 2 * bw, height - thick + 2 * bw, + bw, cp, on, True, False); + break; + case 1 : + Draw3DBorder (w, x, y, width, height, bw, cp, off, True, False); + Draw3DBorder (w, x, y + thick - bw, + width - thick + bw, height - thick, + bw, cp, on, True, False); + break; + case 2 : + rects [0].x = x + width - thick; + rects [0].y = y; + rects [0].width = thick; + rects [0].height = height; + rects [1].x = x; + rects [1].y = y + width - thick; + rects [1].width = width - thick; + rects [1].height = thick; + XSetClipRectangles (dpy, Scr->BorderGC, 0, 0, rects, 2, Unsorted); + Draw3DBorder (w, x, y, width, height, bw, cp, off, True, False); + Draw3DBorder (w, x, y, + width - thick + bw, height - thick + bw, + bw, cp, on, True, False); + XSetClipMask (dpy, Scr->BorderGC, None); + break; + case 3 : + rects [0].x = x; + rects [0].y = y; + rects [0].width = thick; + rects [0].height = height; + rects [1].x = x + thick; + rects [1].y = y + height - thick; + rects [1].width = width - thick; + rects [1].height = thick; + XSetClipRectangles (dpy, Scr->BorderGC, 0, 0, rects, 2, Unsorted); + Draw3DBorder (w, x, y, width, height, bw, cp, off, True, False); + Draw3DBorder (w, x + thick - bw, y, + width - thick, height - thick + bw, + bw, cp, on, True, False); + XSetClipMask (dpy, Scr->BorderGC, None); + break; + } + return; +} + +void PaintAllDecoration (void) +{ + TwmWindow *tmp_win; + virtualScreen *vs; + + for (tmp_win = Scr->FirstWindow; tmp_win != NULL; tmp_win = tmp_win->next) { + if (! visible (tmp_win)) continue; + if (tmp_win->mapped == TRUE) { + if (tmp_win->frame_bw3D) { + if (tmp_win->highlight && tmp_win == Scr->Focus) + PaintBorders (tmp_win, True); + else + PaintBorders (tmp_win, False); + } + if (tmp_win->title_w) PaintTitle (tmp_win); + if (tmp_win->titlebuttons) PaintTitleButtons (tmp_win); + } + else + if ((tmp_win->icon_on == TRUE) && + !tmp_win->icon_not_ours && + !Scr->NoIconTitlebar && + tmp_win->icon && + tmp_win->icon->w && + ! LookInList (Scr->NoIconTitle, tmp_win->full_name, &tmp_win->class)) { + PaintIcon (tmp_win); + } + } + for (vs = Scr->vScreenList; vs != NULL; vs = vs->next) { + PaintWorkSpaceManager (vs); + } +} + +void PaintBorders (TwmWindow *tmp_win, Bool focus) +{ + ColorPair cp; + + cp = (focus && tmp_win->highlight) ? tmp_win->borderC : tmp_win->border_tile; + if (tmp_win->title_height == 0) { + Draw3DBorder (tmp_win->frame, + 0, + 0, + tmp_win->frame_width, + tmp_win->frame_height, + Scr->BorderShadowDepth, cp, off, True, False); + Draw3DBorder (tmp_win->frame, + tmp_win->frame_bw3D - Scr->BorderShadowDepth, + tmp_win->frame_bw3D - Scr->BorderShadowDepth, + tmp_win->frame_width - 2 * tmp_win->frame_bw3D + 2 * Scr->BorderShadowDepth, + tmp_win->frame_height - 2 * tmp_win->frame_bw3D + 2 * Scr->BorderShadowDepth, + Scr->BorderShadowDepth, cp, on, True, False); + return; + } + Draw3DCorner (tmp_win->frame, + tmp_win->title_x - tmp_win->frame_bw3D, + 0, + Scr->TitleHeight + tmp_win->frame_bw3D, + Scr->TitleHeight + tmp_win->frame_bw3D, + tmp_win->frame_bw3D, Scr->BorderShadowDepth, cp, 0); + Draw3DCorner (tmp_win->frame, + tmp_win->title_x + tmp_win->title_width - Scr->TitleHeight, + 0, + Scr->TitleHeight + tmp_win->frame_bw3D, + Scr->TitleHeight + tmp_win->frame_bw3D, + tmp_win->frame_bw3D, Scr->BorderShadowDepth, cp, 1); + Draw3DCorner (tmp_win->frame, + tmp_win->frame_width - (Scr->TitleHeight + tmp_win->frame_bw3D), + tmp_win->frame_height - (Scr->TitleHeight + tmp_win->frame_bw3D), + Scr->TitleHeight + tmp_win->frame_bw3D, + Scr->TitleHeight + tmp_win->frame_bw3D, + tmp_win->frame_bw3D, Scr->BorderShadowDepth, cp, 2); + Draw3DCorner (tmp_win->frame, + 0, + tmp_win->frame_height - (Scr->TitleHeight + tmp_win->frame_bw3D), + Scr->TitleHeight + tmp_win->frame_bw3D, + Scr->TitleHeight + tmp_win->frame_bw3D, + tmp_win->frame_bw3D, Scr->BorderShadowDepth, cp, 3); + + Draw3DBorder (tmp_win->frame, + tmp_win->title_x + Scr->TitleHeight, + 0, + tmp_win->title_width - 2 * Scr->TitleHeight, + tmp_win->frame_bw3D, + Scr->BorderShadowDepth, cp, off, True, False); + Draw3DBorder (tmp_win->frame, + tmp_win->frame_bw3D + Scr->TitleHeight, + tmp_win->frame_height - tmp_win->frame_bw3D, + tmp_win->frame_width - 2 * (Scr->TitleHeight + tmp_win->frame_bw3D), + tmp_win->frame_bw3D, + Scr->BorderShadowDepth, cp, off, True, False); + Draw3DBorder (tmp_win->frame, + 0, + Scr->TitleHeight + tmp_win->frame_bw3D, + tmp_win->frame_bw3D, + tmp_win->frame_height - 2 * (Scr->TitleHeight + tmp_win->frame_bw3D), + Scr->BorderShadowDepth, cp, off, True, False); + Draw3DBorder (tmp_win->frame, + tmp_win->frame_width - tmp_win->frame_bw3D, + Scr->TitleHeight + tmp_win->frame_bw3D, + tmp_win->frame_bw3D, + tmp_win->frame_height - 2 * (Scr->TitleHeight + tmp_win->frame_bw3D), + Scr->BorderShadowDepth, cp, off, True, False); + + if (tmp_win->squeeze_info && !tmp_win->squeezed) { + Draw3DBorder (tmp_win->frame, + 0, + Scr->TitleHeight, + tmp_win->title_x, + tmp_win->frame_bw3D, + Scr->BorderShadowDepth, cp, off, True, False); + Draw3DBorder (tmp_win->frame, + tmp_win->title_x + tmp_win->title_width, + Scr->TitleHeight, + tmp_win->frame_width - tmp_win->title_x - tmp_win->title_width, + tmp_win->frame_bw3D, + Scr->BorderShadowDepth, cp, off, True, False); + } +} + +void PaintTitle (TwmWindow *tmp_win) +{ + int width, mwidth, len; + XRectangle inc_rect; + XRectangle logical_rect; + + if (Scr->use3Dtitles) { + if (Scr->SunkFocusWindowTitle && (Scr->Focus == tmp_win) && + (tmp_win->title_height != 0)) + Draw3DBorder (tmp_win->title_w, Scr->TBInfo.titlex, 0, + tmp_win->title_width - Scr->TBInfo.titlex - + Scr->TBInfo.rightoff - Scr->TitlePadding, + Scr->TitleHeight, Scr->TitleShadowDepth, + tmp_win->title, on, True, False); + else + Draw3DBorder (tmp_win->title_w, Scr->TBInfo.titlex, 0, + tmp_win->title_width - Scr->TBInfo.titlex - + Scr->TBInfo.rightoff - Scr->TitlePadding, + Scr->TitleHeight, Scr->TitleShadowDepth, + tmp_win->title, off, True, False); + } + FB(tmp_win->title.fore, tmp_win->title.back); + if (Scr->use3Dtitles) { + len = strlen(tmp_win->name); + XmbTextExtents(Scr->TitleBarFont.font_set, + tmp_win->name, strlen (tmp_win->name), + &inc_rect, &logical_rect); + width = logical_rect.width; + mwidth = tmp_win->title_width - Scr->TBInfo.titlex - + Scr->TBInfo.rightoff - Scr->TitlePadding - + Scr->TitleShadowDepth - 4; + while ((len > 0) && (width > mwidth)) { + len--; + XmbTextExtents(Scr->TitleBarFont.font_set, + tmp_win->name, len, + &inc_rect, &logical_rect); + width = logical_rect.width; + } + if (Scr->Monochrome != COLOR) { + XmbDrawImageString(dpy, tmp_win->title_w, Scr->TitleBarFont.font_set, + Scr->NormalGC, + tmp_win->name_x, + Scr->TitleBarFont.y + Scr->TitleShadowDepth, + tmp_win->name, len); + } + else { + XmbDrawString (dpy, tmp_win->title_w, Scr->TitleBarFont.font_set, + Scr->NormalGC, tmp_win->name_x, + Scr->TitleBarFont.y + Scr->TitleShadowDepth, + tmp_win->name, len); + } + } + else + XmbDrawString (dpy, tmp_win->title_w, Scr->TitleBarFont.font_set, + Scr->NormalGC, + tmp_win->name_x, Scr->TitleBarFont.y, + tmp_win->name, strlen(tmp_win->name)); +} + +void PaintIcon (TwmWindow *tmp_win) +{ + int width, twidth, mwidth, len, x; + Icon *icon; + XRectangle inc_rect; + XRectangle logical_rect; + + if (!tmp_win || !tmp_win->icon) return; + icon = tmp_win->icon; + if (!icon->has_title) return; + + x = 0; + width = icon->w_width; + if (Scr->ShrinkIconTitles && icon->title_shrunk) { + x = GetIconOffset (icon); + width = icon->width; + } + len = strlen (tmp_win->icon_name); + XmbTextExtents(Scr->IconFont.font_set, + tmp_win->icon_name, len, + &inc_rect, &logical_rect); + twidth = logical_rect.width; + mwidth = width - 2 * Scr->IconManagerShadowDepth - 6; + if (Scr->use3Diconmanagers) { + Draw3DBorder (icon->w, x, icon->height, width, + Scr->IconFont.height + 2 * Scr->IconManagerShadowDepth + 6, + Scr->IconManagerShadowDepth, icon->iconc, off, False, False); + } + while ((len > 0) && (twidth > mwidth)) { + len--; + XmbTextExtents(Scr->IconFont.font_set, + tmp_win->icon_name, len, + &inc_rect, &logical_rect); + twidth = logical_rect.width; + } + FB (icon->iconc.fore, icon->iconc.back); + XmbDrawString(dpy, icon->w, Scr->IconFont.font_set, Scr->NormalGC, + x + ((mwidth - twidth)/2) + Scr->IconManagerShadowDepth + 3, + icon->y, tmp_win->icon_name, len); +} + +void PaintTitleButton (TwmWindow *tmp_win, TBWindow *tbw) +{ + TitleButton *tb = tbw->info; + + XCopyArea (dpy, tbw->image->pixmap, tbw->window, Scr->NormalGC, + tb->srcx, tb->srcy, tb->width, tb->height, + tb->dstx, tb->dsty); + return; +} + +void PaintTitleButtons (TwmWindow *tmp_win) +{ + int i; + TBWindow *tbw; + int nb = Scr->TBInfo.nleft + Scr->TBInfo.nright; + + for (i = 0, tbw = tmp_win->titlebuttons; i < nb; i++, tbw++) { + if (tbw) PaintTitleButton (tmp_win, tbw); + } +} + +void adoptWindow (void) +{ + unsigned long data [2]; + Window localroot, w; + unsigned char *prop; + unsigned long bytesafter; + unsigned long len; + Atom actual_type; + int actual_format; + XEvent event; + Window root, parent, child, *children; + unsigned int nchildren, key_buttons; + int root_x, root_y, win_x, win_y; + int ret; + + localroot = w = RootWindow (dpy, Scr->screen); + XGrabPointer (dpy, localroot, False, + ButtonPressMask | ButtonReleaseMask, + GrabModeAsync, GrabModeAsync, + None, Scr->SelectCursor, CurrentTime); + + XMaskEvent (dpy, ButtonPressMask | ButtonReleaseMask, &event); + child = event.xbutton.subwindow; + while (1) { + if (child == (Window) 0) break; + + w = XmuClientWindow (dpy, child); + ret = XGetWindowProperty (dpy, w, _XA_WM_WORKSPACESLIST, 0L, 512, + False, XA_STRING, &actual_type, &actual_format, &len, + &bytesafter, &prop); + XFree ((char *)prop); /* Don't ever do anything with it */ + if (ret != Success) + break; + if (len == 0) /* it is not a local root window */ + break; /* it is not a local root window */ + localroot = w; + XQueryPointer (dpy, localroot, &root, &child, &root_x, &root_y, + &win_x, &win_y, &key_buttons); + } + XMaskEvent (dpy, ButtonPressMask | ButtonReleaseMask, &event); + XUngrabPointer (dpy, CurrentTime); + + if (localroot == Scr->Root) return; + if (w == localroot) { /* try to not adopt an ancestor */ + XQueryTree (dpy, Scr->Root, &root, &parent, &children, &nchildren); + while (parent != (Window) 0) { + XFree ((char *) children); + if (w == parent) return; + XQueryTree (dpy, parent, &root, &parent, &children, &nchildren); + } + XFree ((char *) children); + if (w == root) return; + } + if (localroot == RootWindow (dpy, Scr->screen)) { + XWithdrawWindow (dpy, w, Scr->screen); + } + else { + XUnmapWindow (dpy, w); + } + XReparentWindow (dpy, w, Scr->Root, 0, 0); + + data [0] = (unsigned long) NormalState; + data [1] = (unsigned long) None; + + XChangeProperty (dpy, w, _XA_WM_STATE, _XA_WM_STATE, 32, + PropModeReplace, (unsigned char *) data, 2); + XFlush (dpy); + SimulateMapRequest (w); + return; +} + +void DebugTrace (char *file) +{ + if (!file) return; + if (tracefile) { + fprintf (stderr, "stop logging events\n"); + if (tracefile != stderr) fclose (tracefile); + tracefile = NULL; + } + else { + if (strcmp (file, "stderr")) + tracefile = fopen (file, "w"); + else + tracefile = stderr; + fprintf (stderr, "logging events to : %s\n", file); + } +} + +extern Cursor TopRightCursor, TopLeftCursor, BottomRightCursor, BottomLeftCursor, + LeftCursor, RightCursor, TopCursor, BottomCursor; + +void SetBorderCursor (TwmWindow *tmp_win, int x, int y) +{ + Cursor cursor; + XSetWindowAttributes attr; + int h, fw, fh, wd; + + if (!tmp_win) + return; + + /* Use the max of these, but since one is always 0 we can add them. */ + wd = tmp_win->frame_bw + tmp_win->frame_bw3D; + h = Scr->TitleHeight + wd; + fw = tmp_win->frame_width; + fh = tmp_win->frame_height; + +#if defined DEBUG && DEBUG + fprintf(stderr, "wd=%d h=%d, fw=%d fh=%d x=%d y=%d\n", + wd, h, fw, fh, x, y); +#endif + + /* + * If not using 3D borders: + * + * The left border has negative x coordinates, + * The top border (above the title) has negative y coordinates. + * The title is TitleHeight high, the next wd pixels are border. + * The bottom border has coordinates >= the frame height. + * The right border has coordinates >= the frame width. + * + * If using 3D borders: all coordinates are >= 0, and all coordinates + * are higher by the border width. + * + * Since we only get events when we're actually in the border, we simply + * allow for both cases at the same time. + */ + + if ((x < -wd) || (y < -wd)) { + cursor = Scr->FrameCursor; + } else if (x < h) { + if (y < h) + cursor = TopLeftCursor; + else if (y >= fh - h) + cursor = BottomLeftCursor; + else + cursor = LeftCursor; + } else if (x >= fw - h) { + if (y < h) + cursor = TopRightCursor; + else if (y >= fh - h) + cursor = BottomRightCursor; + else + cursor = RightCursor; + } else if (y < h) { /* also include title bar in top border area */ + cursor = TopCursor; + } else if (y >= fh - h) { + cursor = BottomCursor; + } else { + cursor = Scr->FrameCursor; + } + attr.cursor = cursor; + XChangeWindowAttributes (dpy, tmp_win->frame, CWCursor, &attr); + tmp_win->curcurs = cursor; +} + +Image *GetImage (char *name, ColorPair cp) +{ + name_list **list; + char fullname [256]; + Image *image; + + if (name == NULL) return (None); + image = None; + + list = &Scr->ImageCache; +#ifdef XPM + if ((name [0] == '@') || (strncmp (name, "xpm:", 4) == 0)) { + sprintf (fullname, "%s%dx%d", name, (int) cp.fore, (int) cp.back); + + if ((image = (Image*) LookInNameList (*list, fullname)) == None) { + int startn = (name [0] == '@') ? 1 : 4; + if ((image = GetXpmImage (name + startn, cp)) != None) { + AddToList (list, fullname, (char*) image); + } + } + } + else +#endif +#ifdef JPEG + if (strncmp (name, "jpeg:", 5) == 0) { + if ((image = (Image*) LookInNameList (*list, name)) == None) { + if ((image = GetJpegImage (&name [5])) != None) { + AddToList (list, name, (char*) image); + } + } + } + else +#endif +#ifdef IMCONV + if (strncmp (name, "im:", 3) == 0) { + if ((image = (Image*) LookInNameList (*list, name)) == None) { + if ((image = GetImconvImage (&name [3])) != None) { + AddToList (list, name, (char*) image); + } + } + } + else +#endif +#if !defined(VMS) || defined(HAVE_XWDFILE_H) + if ((strncmp (name, "xwd:", 4) == 0) || (name [0] == '|')) { + int startn = (name [0] == '|') ? 0 : 4; + if ((image = (Image*) LookInNameList (*list, name)) == None) { + if ((image = GetXwdImage (&name [startn], cp)) != None) { + AddToList (list, name, (char*) image); + } + } + } + else +#endif + if (strncmp (name, ":xpm:", 5) == 0) { + int i; + static struct { + char *name; + Image* (*proc)(ColorPair colorpair); + } pmtab[] = { + { TBPM_3DDOT, Create3DDotImage }, + { TBPM_3DRESIZE, Create3DResizeImage }, + { TBPM_3DMENU, Create3DMenuImage }, + { TBPM_3DZOOM, Create3DZoomImage }, + { TBPM_3DBAR, Create3DBarImage }, + { TBPM_3DVBAR, Create3DVertBarImage }, + { TBPM_3DCROSS, Create3DCrossImage }, + { TBPM_3DICONIFY, Create3DIconifyImage }, + { TBPM_3DSUNKEN_RESIZE, Create3DSunkenResizeImage }, + { TBPM_3DBOX, Create3DBoxImage } + }; + + sprintf (fullname, "%s%dx%d", name, (int) cp.fore, (int) cp.back); + if ((image = (Image*) LookInNameList (*list, fullname)) == None) { + for (i = 0; i < (sizeof pmtab) / (sizeof pmtab[0]); i++) { + if (XmuCompareISOLatin1 (pmtab[i].name, name) == 0) { + image = (*pmtab[i].proc) (cp); + if (image == None) { + fprintf (stderr, + "%s: unable to build pixmap \"%s\"\n", ProgramName, name); + return (None); + } + break; + } + } + if (image == None) { + fprintf (stderr, "%s: no such built-in pixmap \"%s\"\n", ProgramName, name); + return (None); + } + AddToList (list, fullname, (char*) image); + } + } + else + if (strncmp (name, "%xpm:", 5) == 0) { + int i; + static struct { + char *name; + Image* (*proc)(ColorPair colorpair); + } pmtab[] = { + { "%xpm:menu-up", Create3DMenuUpAnimation }, + { "%xpm:menu-down", Create3DMenuDownAnimation }, + { "%xpm:resize", Create3DZoomOutAnimation }, /* compatibility */ + { "%xpm:resize-out-top", Create3DResizeInTopAnimation }, + { "%xpm:resize-in-top", Create3DResizeOutTopAnimation }, + { "%xpm:resize-out-bot", Create3DResizeInBotAnimation }, + { "%xpm:resize-in-bot", Create3DResizeOutBotAnimation }, + { "%xpm:maze-out", Create3DMazeOutAnimation }, + { "%xpm:maze-in", Create3DMazeInAnimation }, + { "%xpm:zoom-out", Create3DZoomOutAnimation }, + { "%xpm:zoom-in", Create3DZoomInAnimation }, + { "%xpm:zoom-inout", Create3DZoomInOutAnimation } + }; + + sprintf (fullname, "%s%dx%d", name, (int) cp.fore, (int) cp.back); + if ((image = (Image*) LookInNameList (*list, fullname)) == None) { + for (i = 0; i < (sizeof pmtab) / (sizeof pmtab[0]); i++) { + if (XmuCompareISOLatin1 (pmtab[i].name, name) == 0) { + image = (*pmtab[i].proc) (cp); + if (image == None) { + fprintf (stderr, + "%s: unable to build pixmap \"%s\"\n", ProgramName, name); + return (None); + } + break; + } + } + if (image == None) { + fprintf (stderr, "%s: no such built-in pixmap \"%s\"\n", ProgramName, name); + return (None); + } + AddToList (list, fullname, (char*) image); + } + } + else + if (name [0] == ':') { + int i; + unsigned int width, height; + Pixmap pm = 0; + XGCValues gcvalues; + static struct { + char *name; + Pixmap (*proc)(unsigned int *widthp, unsigned int *heightp); + } pmtab[] = { + { TBPM_DOT, CreateDotPixmap }, + { TBPM_ICONIFY, CreateDotPixmap }, + { TBPM_RESIZE, CreateResizePixmap }, + { TBPM_XLOGO, CreateXLogoPixmap }, + { TBPM_DELETE, CreateXLogoPixmap }, + { TBPM_MENU, CreateMenuPixmap }, + { TBPM_QUESTION, CreateQuestionPixmap }, + }; + + sprintf (fullname, "%s%dx%d", name, (int) cp.fore, (int) cp.back); + if ((image = (Image*) LookInNameList (*list, fullname)) == None) { + for (i = 0; i < (sizeof pmtab) / (sizeof pmtab[0]); i++) { + if (XmuCompareISOLatin1 (pmtab[i].name, name) == 0) { + pm = (*pmtab[i].proc) (&width, &height); + if (pm == None) { + fprintf (stderr, + "%s: unable to build pixmap \"%s\"\n", ProgramName, name); + return (None); + } + break; + } + } + if (pm == None) { + fprintf (stderr, "%s: no such built-in bitmap \"%s\"\n", ProgramName, name); + return (None); + } + image = (Image*) malloc (sizeof (struct _Image)); + image->pixmap = XCreatePixmap (dpy, Scr->Root, width, height, Scr->d_depth); + if (Scr->rootGC == (GC) 0) Scr->rootGC = XCreateGC (dpy, Scr->Root, 0, &gcvalues); + gcvalues.background = cp.back; + gcvalues.foreground = cp.fore; + XChangeGC (dpy, Scr->rootGC, GCForeground | GCBackground, &gcvalues); + XCopyPlane (dpy, pm, image->pixmap, Scr->rootGC, 0, 0, width, height, 0, 0, + (unsigned long) 1); + image->mask = None; + image->width = width; + image->height = height; + image->next = None; + AddToList (list, fullname, (char*) image); + } + } + else { + sprintf (fullname, "%s%dx%d", name, (int) cp.fore, (int) cp.back); + if ((image = (Image*) LookInNameList (*list, fullname)) == None) { + if ((image = GetBitmapImage (name, cp)) != None) { + AddToList (list, fullname, (char*) image); + } + } + } + return (image); +} + +void FreeImage (Image *image) +{ + Image *im, *im2; + + im = image; + while (im != None) { + if (im->pixmap) XFreePixmap (dpy, im->pixmap); + if (im->mask) XFreePixmap (dpy, im->mask); + im2 = im->next; + free (im); + im = im2; + } +} + +#if !defined(VMS) || defined(HAVE_XWDFILE_H) +static void compress (XImage *image, XColor *colors, int *ncolors); + +static Image *LoadXwdImage (char *filename, ColorPair cp) +{ + FILE *file; + char *fullname; + XColor colors [256]; + XWDColor xwdcolors [256]; + unsigned buffer_size; + XImage *image; + unsigned char *imagedata; + Pixmap pixret; + Visual *visual; + char win_name [256]; + int win_name_size; + int ispipe; + int i, len; + int w, h, depth, ncolors; + int scrn; + Colormap cmap; + Colormap stdcmap = Scr->RootColormaps.cwins[0]->colormap->c; + GC gc; + XGCValues gcvalues; + XWDFileHeader header; + Image *ret; + Bool anim; + unsigned long swaptest = 1; + + ispipe = 0; + anim = False; +#ifndef VMS + if (filename [0] == '|') { + file = (FILE*) popen (filename + 1, "r"); + if (file == NULL) return (None); + ispipe = 1; + anim = AnimationActive; + if (anim) StopAnimation (); + goto file_opened; + } +#endif + fullname = ExpandPixmapPath (filename); + if (! fullname) return (None); + file = fopen (fullname, "r"); + free (fullname); + if (file == NULL) { + if (reportfilenotfound) fprintf (stderr, "unable to locate %s\n", filename); + return (None); + } +file_opened: + len = fread ((char *) &header, sizeof (header), 1, file); + if (len != 1) { + fprintf (stderr, "ctwm: cannot read %s\n", filename); +#ifdef USE_SIGNALS + if (ispipe && anim) StartAnimation (); +#endif + return (None); + } + if (*(char *) &swaptest) _swaplong ((char *) &header, sizeof (header)); + if (header.file_version != XWD_FILE_VERSION) { + fprintf(stderr,"ctwm: XWD file format version mismatch : %s\n", filename); + return (None); + } + win_name_size = header.header_size - sizeof (header); + len = fread (win_name, win_name_size, 1, file); + if (len != 1) { + fprintf (stderr, "file %s has not the correct format\n", filename); +#ifdef USE_SIGNALS + if (ispipe && anim) StartAnimation (); +#endif + return (None); + } + + if (header.pixmap_format == XYPixmap) { + fprintf (stderr,"ctwm: XYPixmap XWD file not supported : %s\n", filename); + return (None); + } + w = header.pixmap_width; + h = header.pixmap_height; + depth = header.pixmap_depth; + ncolors = header.ncolors; + len = fread ((char *) xwdcolors, sizeof (XWDColor), ncolors, file); + if (len != ncolors) { + fprintf (stderr, "file %s has not the correct format\n", filename); +#ifdef USE_SIGNALS + if (ispipe && anim) StartAnimation (); +#endif + return (None); + } + if (*(char *) &swaptest) { + for (i = 0; i < ncolors; i++) { + _swaplong ((char *) &xwdcolors [i].pixel, 4); + _swapshort ((char *) &xwdcolors [i].red, 3 * 2); + } + } + for (i = 0; i < ncolors; i++) { + colors [i].pixel = xwdcolors [i].pixel; + colors [i].red = xwdcolors [i].red; + colors [i].green = xwdcolors [i].green; + colors [i].blue = xwdcolors [i].blue; + colors [i].flags = xwdcolors [i].flags; + colors [i].pad = xwdcolors [i].pad; + } + + scrn = Scr->screen; + cmap = AlternateCmap ? AlternateCmap : stdcmap; + visual = Scr->d_visual; + gc = DefaultGC (dpy, scrn); + + buffer_size = header.bytes_per_line * h; + imagedata = (unsigned char*) malloc (buffer_size); + if (! imagedata) { + fprintf (stderr, "cannot allocate memory for image %s\n", filename); +#ifdef USE_SIGNALS + if (ispipe && anim) StartAnimation (); +#endif + return (None); + } + len = fread (imagedata, (int) buffer_size, 1, file); + if (len != 1) { + free (imagedata); + fprintf (stderr, "file %s has not the correct format\n", filename); +#ifdef USE_SIGNALS + if (ispipe && anim) StartAnimation (); +#endif + return (None); + } +#ifndef VMS + if (ispipe) + pclose (file); + else +#endif + fclose (file); + + image = XCreateImage (dpy, visual, depth, header.pixmap_format, + 0, (char*) imagedata, w, h, + header.bitmap_pad, header.bytes_per_line); + if (image == None) { + free (imagedata); + fprintf (stderr, "cannot create image for %s\n", filename); +#ifdef USE_SIGNALS + if (ispipe && anim) StartAnimation (); +#endif + return (None); + } + if (header.pixmap_format == ZPixmap) { + compress (image, colors, &ncolors); + } + if (header.pixmap_format != XYBitmap) { + for (i = 0; i < ncolors; i++) { + XAllocColor (dpy, cmap, &(colors [i])); + } + for (i = 0; i < buffer_size; i++) { + imagedata [i] = (unsigned char) colors [imagedata [i]].pixel; + } + } + if (w > Scr->rootw) w = Scr->rootw; + if (h > Scr->rooth) h = Scr->rooth; + + ret = (Image*) malloc (sizeof (struct _Image)); + if (! ret) { + fprintf (stderr, "unable to allocate memory for image : %s\n", filename); + free (image); + free (imagedata); + for (i = 0; i < ncolors; i++) { + XFreeColors (dpy, cmap, &(colors [i].pixel), 1, 0L); + } +#ifdef USE_SIGNALS + if (ispipe && anim) StartAnimation (); +#endif + return (None); + } + if (header.pixmap_format == XYBitmap) { + gcvalues.foreground = cp.fore; + gcvalues.background = cp.back; + XChangeGC (dpy, gc, GCForeground | GCBackground, &gcvalues); + } + if ((w > (Scr->rootw / 2)) || (h > (Scr->rooth / 2))) { + int x, y; + + pixret = XCreatePixmap (dpy, Scr->Root, Scr->rootw, + Scr->rooth, Scr->d_depth); + x = (Scr->rootw - w) / 2; + y = (Scr->rooth - h) / 2; + XFillRectangle (dpy, pixret, gc, 0, 0, Scr->rootw, Scr->rooth); + XPutImage (dpy, pixret, gc, image, 0, 0, x, y, w, h); + ret->width = Scr->rootw; + ret->height = Scr->rooth; + } + else { + pixret = XCreatePixmap (dpy, Scr->Root, w, h, depth); + XPutImage (dpy, pixret, gc, image, 0, 0, 0, 0, w, h); + ret->width = w; + ret->height = h; + } + XDestroyImage (image); + + ret->pixmap = pixret; + ret->mask = None; + ret->next = None; +#ifdef USE_SIGNALS + if (ispipe && anim) StartAnimation (); +#endif + return (ret); +} + +static Image *GetXwdImage (char *name, ColorPair cp) +{ + Image *image, *r, *s; + char path [128]; + char pref [128], *perc; + int i; + + if (! strchr (name, '%')) return (LoadXwdImage (name, cp)); + s = image = None; + strcpy (pref, name); + perc = strchr (pref, '%'); + *perc = '\0'; + reportfilenotfound = 0; + for (i = 1;; i++) { + sprintf (path, "%s%d%s", pref, i, perc + 1); + r = LoadXwdImage (path, cp); + if (r == None) break; + r->next = None; + if (image == None) s = image = r; + else { + s->next = r; + s = r; + } + } + reportfilenotfound = 1; + if (s != None) s->next = image; + if (image == None) { + fprintf (stderr, "Cannot open any %s xwd file\n", name); + } + return (image); +} + +static void compress (XImage *image, XColor *colors, int *ncolors) +{ + unsigned char ind [256]; + unsigned int used [256]; + int i, j, size, nused; + unsigned char color; + XColor newcolors [256]; + unsigned char *imagedata; + + for (i = 0; i < 256; i++) { + used [i] = 0; + ind [i] = 0; + } + nused = 0; + size = image->bytes_per_line * image->height; + imagedata = (unsigned char *) image->data; + for (i = 0; i < size; i++) { + if ((i % image->bytes_per_line) > image->width) continue; + color = imagedata [i]; + if (used [color] == 0) { + for (j = 0; j < nused; j++) { + if ((colors [color].red == newcolors [j].red) && + (colors [color].green == newcolors [j].green) && + (colors [color].blue == newcolors [j].blue)) break; + } + ind [color] = j; + used [color] = 1; + if (j == nused) { + newcolors [j].red = colors [color].red; + newcolors [j].green = colors [color].green; + newcolors [j].blue = colors [color].blue; + nused++; + } + } + } + for (i = 0; i < size; i++) { + imagedata [i] = ind [imagedata [i]]; + } + for (i = 0; i < nused; i++) { + colors [i] = newcolors [i]; + } + *ncolors = nused; +} +#endif + +#ifdef IMCONV + +static void free_images (); + +static Image *GetImconvImage (char *filename, + unsigned int *widthp, unsigned int *heightp) +{ + TagTable *toolInTable; + ImVfb *sourceVfb; + ImVfbPtr vptr; + ImClt *clt; + int i, j, ij, k, retval; + + XColor colors [256]; + unsigned buffer_size; + XImage *image; + unsigned char *imagedata; + Pixmap pixret; + Visual *visual; + int w, h, depth, ncolors; + int scrn; + Colormap cmap; + Colormap stdcmap = Scr->RootColormaps.cwins[0]->colormap->c; + GC gc; + unsigned char red, green, blue; + int icol; + char *fullname; + + TagEntry *dataEntry; + FILE *fp; + char the_format[1024]; + char *tmp_format; + Image *ret; + + if (*filename == NULL) return (None); + fullname = ExpandPixmapPath (filename); + if (! fullname) return (None); + + fp = fopen (fullname, "r"); + if (!fp) { + if (reportfilenotfound) fprintf (stderr, "Cannot open the image %s\n", filename); + free (fullname); + return (None); + } + if ((toolInTable = TagTableAlloc ()) == TAGTABLENULL ) { + fprintf (stderr, "TagTableAlloc failed\n"); + free_images (toolInTable); + free (fullname); + return (None); + } + if ((tmp_format = ImFileQFFormat (fp, fullname)) == NULL) { + fprintf (stderr, "Cannot determine image type of %s\n", filename); + free_images (toolInTable); + free (fullname); + return (None); + } + strcpy (the_format, tmp_format); + retval = ImFileFRead (fp, the_format, NULL, toolInTable); + if(retval < 0) { + fprintf(stderr, "Cannot read image file %s: ", fullname); + switch(ImErrNo) { + case IMESYS: + fprintf (stderr, "System call error\n"); + break; + case IMEMALLOC: + fprintf (stderr, "Cannot allocate memory\n"); + break; + case IMEFORMAT: + fprintf (stderr, "Data in file is corrupt\n"); + break; + case IMENOREAD: + fprintf (stderr, "Sorry, this format is write-only\n"); + break; + case IMEMAGIC: + fprintf (stderr, "Bad magic number in image file\n"); + break; + case IMEDEPTH: + fprintf (stderr, "Unknown image depth\n"); + break; + default: + fprintf(stderr, "Unknown error\n"); + break; + } + free_images (toolInTable); + free (fullname); + return (None); + } + + if (TagTableQNEntry (toolInTable, "image vfb") == 0) { + fprintf (stderr, "Image file %s contains no images\n", fullname); + free_images (toolInTable); + free (fullname); + return (None); + } + dataEntry = TagTableQDirect (toolInTable, "image vfb", 0); + TagEntryQValue (dataEntry, &sourceVfb); + fclose (fp); + + w = ImVfbQWidth (sourceVfb); + h = ImVfbQHeight (sourceVfb); + depth = 8 * ImVfbQNBytes (sourceVfb); + if (depth != 8) { + fprintf (stderr, "I don't know yet how to deal with images not of 8 planes depth\n"); + free_images (toolInTable); + return (None); + } + + *width = w; + *height = h; + + scrn = Scr->screen; + cmap = AlternateCmap ? AlternateCmap : stdcmap; + visual = Scr->d_visual; + gc = DefaultGC (dpy, scrn); + + buffer_size = w * h; + imagedata = (unsigned char*) malloc (buffer_size); + if (imagedata == (unsigned char*) 0) { + fprintf (stderr, "Can't alloc enough space for background images\n"); + free_images (toolInTable); + return (None); + } + + clt = ImVfbQClt (sourceVfb); + vptr = ImVfbQFirst (sourceVfb); + ncolors = 0; + for (i = 0; i < h - 1; i++) { + for (j = 0; j < w; j++) { + ij = (i * w) + j; + red = ImCltQRed (ImCltQPtr (clt, ImVfbQIndex (sourceVfb, vptr))); + green = ImCltQGreen (ImCltQPtr (clt, ImVfbQIndex (sourceVfb, vptr))); + blue = ImCltQBlue (ImCltQPtr (clt, ImVfbQIndex (sourceVfb, vptr))); + for (k = 0; k < ncolors; k++) { + if ((colors [k].red == red) && + (colors [k].green == green) && + (colors [k].blue == blue)) { + icol = k; + break; + } + } + if (k == ncolors) { + icol = ncolors; + ncolors++; + } + imagedata [ij] = icol; + colors [icol].red = red; + colors [icol].green = green; + colors [icol].blue = blue; + ImVfbSInc (sourceVfb, vptr); + } + } + for (i = 0; i < ncolors; i++) { + colors [i].red *= 256; + colors [i].green *= 256; + colors [i].blue *= 256; + } + for (i = 0; i < ncolors; i++) { + if (! XAllocColor (dpy, cmap, &(colors [i]))) { + fprintf (stderr, "can't alloc color for image %s\n", filename); + } + } + for (i = 0; i < buffer_size; i++) { + imagedata [i] = (unsigned char) colors [imagedata [i]].pixel; + } + + image = XCreateImage (dpy, visual, depth, ZPixmap, 0, (char*) imagedata, w, h, 8, 0); + if (w > Scr->rootw) w = Scr->rootw; + if (h > Scr->rooth) h = Scr->rooth; + + if ((w > (Scr->rootw / 2)) || (h > (Scr->rooth / 2))) { + int x, y; + + pixret = XCreatePixmap (dpy, Scr->Root, Scr->rootw, Scr->rooth, depth); + x = (Scr->rootw - w) / 2; + y = (Scr->rooth - h) / 2; + XFillRectangle (dpy, pixret, gc, 0, 0, Scr->rootw, Scr->rooth); + XPutImage (dpy, pixret, gc, image, 0, 0, x, y, w, h); + ret->width = Scr->rootw; + ret->height = Scr->rooth; + } + else { + pixret = XCreatePixmap (dpy, Scr->Root, w, h, depth); + XPutImage (dpy, pixret, gc, image, 0, 0, 0, 0, w, h); + ret->width = w; + ret->height = h; + } + XFree (image); + ret = (Image*) malloc (sizeof (struct _Image)); + ret->pixmap = pixret; + ret->mask = None; + ret->next = None; + return (ret); + +} + +static void free_images (table) +TagTable *table; +{ + int i, n; + ImVfb *v; + ImClt *c; + TagEntry *dataEntry; + + n = TagTableQNEntry (table, "image vfb"); + for (i = 0 ; i < n ; i++) { + dataEntry = TagTableQDirect (table, "image vfb", i); + TagEntryQValue (dataEntry, &v); + ImVfbFree (v); + } + n = TagTableQNEntry (table, "image clt"); + for (i = 0 ; i < n ; i++) { + dataEntry = TagTableQDirect (table, "image clt", i ); + TagEntryQValue (dataEntry, &c); + ImCltFree (c); + } + TagTableFree (table); +} + +#endif + +void _swapshort (register char *bp, register unsigned n) +{ + register char c; + register char *ep = bp + n; + + while (bp < ep) { + c = *bp; + *bp = *(bp + 1); + bp++; + *bp++ = c; + } +} + +void _swaplong (register char *bp, register unsigned n) +{ + register char c; + register char *ep = bp + n; + register char *sp; + + while (bp < ep) { + sp = bp + 3; + c = *sp; + *sp = *bp; + *bp++ = c; + sp = bp + 1; + c = *sp; + *sp = *bp; + *bp++ = c; + bp += 2; + } +} + +/*********************************************************************** + * + * Procedure: + * GetWMPropertyString - Get Window Manager text property and + * convert it to a string. + * + * Returned Value: + * (char *) - pointer to the malloc'd string or NULL + * + * Inputs: + * w - the id of the window whose property is to be retrieved + * prop - property atom (typically WM_NAME or WM_ICON_NAME) + * + *********************************************************************** + */ + +unsigned char *GetWMPropertyString(Window w, Atom prop) +{ + XTextProperty text_prop; + char **text_list; + int text_list_count; + Atom XA_COMPOUND_TEXT = XInternAtom(dpy, "COMPOUND_TEXT", False); + unsigned char *stringptr; + int status, len = -1; + + (void)XGetTextProperty(dpy, w, &text_prop, prop); + if (text_prop.value != NULL) { + if (text_prop.encoding == XA_STRING + || text_prop.encoding == XA_COMPOUND_TEXT) { + /* property is encoded as compound text - convert to locale string */ + status = XmbTextPropertyToTextList(dpy, &text_prop, + &text_list, &text_list_count); + if (text_list_count == 0) { + stringptr = NULL; + } else + if (text_list == (char **)0) { + stringptr = NULL; + } else + if (text_list [0] == (char *)0) { + stringptr = NULL; + } else + if (status < 0 || text_list_count < 0) { + switch (status) { + case XConverterNotFound: + fprintf (stderr, "%s: Converter not found; unable to convert property %s of window ID %lx.\n", + ProgramName, XGetAtomName(dpy, prop), w); + break; + case XNoMemory: + fprintf (stderr, "%s: Insufficient memory; unable to convert property %s of window ID %lx.\n", + ProgramName, XGetAtomName(dpy, prop), w); + break; + case XLocaleNotSupported: + fprintf (stderr, "%s: Locale not supported; unable to convert property %s of window ID %lx.\n", + ProgramName, XGetAtomName(dpy, prop), w); + break; + } + stringptr = NULL; + /* + don't call XFreeStringList - text_list appears to have + invalid address if status is bad + XFreeStringList(text_list); + */ + } else { + len = strlen(text_list[0]); + stringptr = memcpy(malloc(len+1), text_list[0], len+1); + XFreeStringList(text_list); + } + } else { + /* property is encoded in a format we don't understand */ + fprintf (stderr, "%s: Encoding not STRING or COMPOUND_TEXT; unable to decode property %s of window ID %lx.\n", + ProgramName, XGetAtomName(dpy, prop), w); + stringptr = NULL; + } + XFree (text_prop.value); + } else { + stringptr = NULL; + } + + return stringptr; +} + +void FreeWMPropertyString(char *prop) +{ + if (prop && (char *)prop != NoName) { + free(prop); + } +} + +static void ConstrainLeftTop (int *value, int border) +{ + if (*value < border) { + if (Scr->MoveOffResistance < 0 || + *value > border - Scr->MoveOffResistance) + { + *value = border; + } else if (Scr->MoveOffResistance > 0 && + *value <= border - Scr->MoveOffResistance) + { + *value = *value + Scr->MoveOffResistance; + } + } +} + +static void ConstrainRightBottom (int *value, int size1, int border, int size2) +{ + if (*value + size1 > size2 - border) { + if (Scr->MoveOffResistance < 0 || + *value + size1 < size2 - border + Scr->MoveOffResistance) + { + *value = size2 - size1 - border; + } else if (Scr->MoveOffResistance > 0 && + *value + size1 >= size2 - border + Scr->MoveOffResistance) { + *value = *value - Scr->MoveOffResistance; + } + } +} + +void ConstrainByBorders1 (int *left, int width, int *top, int height) +{ + ConstrainRightBottom (left, width, Scr->BorderRight, Scr->rootw); + ConstrainLeftTop (left, Scr->BorderLeft); + ConstrainRightBottom (top, height, Scr->BorderBottom, Scr->rooth); + ConstrainLeftTop (top, Scr->BorderTop); +} + +void ConstrainByBorders (TwmWindow *twmwin, + int *left, int width, int *top, int height) +{ + if (twmwin->winbox) { + XWindowAttributes attr; + XGetWindowAttributes (dpy, twmwin->winbox->window, &attr); + ConstrainRightBottom (left, width, 0, attr.width); + ConstrainLeftTop (left, 0); + ConstrainRightBottom (top, height, 0, attr.height); + ConstrainLeftTop (top, 0); + } else { + ConstrainByBorders1 (left, width, top, height); + } +} + +#ifdef JPEG + +uint16_t *buffer_16bpp; +uint32_t *buffer_32bpp; + +static void convert_for_16 (int w, int x, int y, int r, int g, int b) { + buffer_16bpp [y * w + x] = ((r >> 3) << 11) + ((g >> 2) << 5) + (b >> 3); +} + +static void convert_for_32 (int w, int x, int y, int r, int g, int b) { + buffer_32bpp [y * w + x] = ((r << 16) + (g << 8) + b) & 0xFFFFFFFF; +} + +static void jpeg_error_exit (j_common_ptr cinfo) { + jerr_ptr errmgr = (jerr_ptr) cinfo->err; + cinfo->err->output_message (cinfo); + siglongjmp (errmgr->setjmp_buffer, 1); + return; +} + +static Image *GetJpegImage (char *name) +{ + Image *image, *r, *s; + char path [128]; + char pref [128], *perc; + int i; + + if (! strchr (name, '%')) return (LoadJpegImage (name)); + s = image = None; + strcpy (pref, name); + perc = strchr (pref, '%'); + *perc = '\0'; + reportfilenotfound = 0; + for (i = 1;; i++) { + sprintf (path, "%s%d%s", pref, i, perc + 1); + r = LoadJpegImage (path); + if (r == None) break; + r->next = None; + if (image == None) s = image = r; + else { + s->next = r; + s = r; + } + } + reportfilenotfound = 1; + if (s != None) s->next = image; + if (image == None) { + fprintf (stderr, "Cannot open any %s jpeg file\n", name); + } + return (image); +} + +static Image *LoadJpegImage (char *name) +{ + char *fullname; + XImage *ximage; + FILE *infile; + Image *image; + Pixmap pixret; + void (*store_data) (int w, int x, int y, int r, int g, int b); + struct jpeg_decompress_struct cinfo; + struct jpeg_error jerr; + JSAMPARRAY buffer; + int width, height; + int row_stride; + int g, i, a; + int bpix; + GC gc; + + fullname = ExpandPixmapPath (name); + if (! fullname) return (None); + + image = (Image*) malloc (sizeof (struct _Image)); + if (image == None) return (None); + + if ((infile = fopen (fullname, "rb")) == NULL) { + if (!reportfilenotfound) fprintf (stderr, "unable to locate %s\n", fullname); + fflush (stdout); + return None; + } + cinfo.err = jpeg_std_error (&jerr.pub); + jerr.pub.error_exit = jpeg_error_exit; + + if (sigsetjmp(jerr.setjmp_buffer, 1)) { + jpeg_destroy_decompress (&cinfo); + fclose (infile); + return None; + } + jpeg_create_decompress (&cinfo); + jpeg_stdio_src (&cinfo, infile); + jpeg_read_header (&cinfo, FALSE); + cinfo.do_fancy_upsampling = FALSE; + cinfo.do_block_smoothing = FALSE; + jpeg_start_decompress (&cinfo); + width = cinfo.output_width; + height = cinfo.output_height; + + if (Scr->d_depth == 16) { + store_data = &convert_for_16; + buffer_16bpp = (unsigned short int *) malloc ((width) * (height) * 2); + ximage = XCreateImage (dpy, CopyFromParent, Scr->d_depth, ZPixmap, 0, + (char *) buffer_16bpp, width, height, 16, width * 2); + } else { + if (Scr->d_depth == 24) { + store_data = &convert_for_32; + buffer_32bpp = malloc (width * height * 4); + ximage = XCreateImage (dpy, CopyFromParent, Scr->d_depth, ZPixmap, 0, + (char *) buffer_32bpp, width, height, 32, width * 4); + } else + if (Scr->d_depth == 32) { + store_data = &convert_for_32; + buffer_32bpp = malloc (width * height * 4); + ximage = XCreateImage (dpy, CopyFromParent, Scr->d_depth, ZPixmap, 0, + (char *) buffer_32bpp, width, height, 32, width * 4); + } else { + fprintf (stderr, "Image %s unsupported depth : %d\n", name, Scr->d_depth); + return None; + } + } + if (ximage == None) { + fprintf (stderr, "cannot create image for %s\n", name); + } + g = 0; + row_stride = cinfo.output_width * cinfo.output_components; + buffer = (*cinfo.mem->alloc_sarray) + ((j_common_ptr) & cinfo, JPOOL_IMAGE, row_stride, 1); + + bpix = cinfo.output_components; + while (cinfo.output_scanline < cinfo.output_height) { + jpeg_read_scanlines (&cinfo, buffer, 1); + a = 0; + for (i = 0; i < bpix * cinfo.output_width; i += bpix) { + (*store_data) (width, a, g, buffer[0][i], buffer[0][i + 1], buffer[0][i + 2]); + a++; + } + g++; + } + jpeg_finish_decompress (&cinfo); + jpeg_destroy_decompress (&cinfo); + fclose (infile); + + gc = DefaultGC (dpy, Scr->screen); + if ((width > (Scr->rootw / 2)) || (height > (Scr->rooth / 2))) { + int x, y; + + pixret = XCreatePixmap (dpy, Scr->Root, Scr->rootw, Scr->rooth, Scr->d_depth); + x = (Scr->rootw - width) / 2; + y = (Scr->rooth - height) / 2; + XFillRectangle (dpy, pixret, gc, 0, 0, Scr->rootw, Scr->rooth); + XPutImage (dpy, pixret, gc, ximage, 0, 0, x, y, width, height); + image->width = Scr->rootw; + image->height = Scr->rooth; + } else { + pixret = XCreatePixmap (dpy, Scr->Root, width, height, Scr->d_depth); + XPutImage (dpy, pixret, gc, ximage, 0, 0, 0, 0, width, height); + image->width = width; + image->height = height; + } + XDestroyImage (ximage); + image->pixmap = pixret; + image->mask = None; + image->next = None; + + return image; +} + +#endif /* JPEG */ Index: external/mit/ctwm/dist/util.h =================================================================== RCS file: external/mit/ctwm/dist/util.h diff -N external/mit/ctwm/dist/util.h --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/util.h 3 Sep 2015 12:20:00 -0000 @@ -0,0 +1,163 @@ +/*****************************************************************************/ +/** Copyright 1988 by Evans & Sutherland Computer Corporation, **/ +/** Salt Lake City, Utah **/ +/** Portions Copyright 1989 by the Massachusetts Institute of Technology **/ +/** Cambridge, Massachusetts **/ +/** **/ +/** All Rights Reserved **/ +/** **/ +/** Permission to use, copy, modify, and distribute this software and **/ +/** its documentation for any purpose and without fee is hereby **/ +/** granted, provided that the above copyright notice appear in all **/ +/** copies and that both that copyright notice and this permis- **/ +/** sion notice appear in supporting documentation, and that the **/ +/** names of Evans & Sutherland and M.I.T. not be used in advertising **/ +/** in publicity pertaining to distribution of the software without **/ +/** specific, written prior permission. **/ +/** **/ +/** EVANS & SUTHERLAND AND M.I.T. DISCLAIM ALL WARRANTIES WITH REGARD **/ +/** TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANT- **/ +/** ABILITY AND FITNESS, IN NO EVENT SHALL EVANS & SUTHERLAND OR **/ +/** M.I.T. BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAM- **/ +/** AGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA **/ +/** OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER **/ +/** TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE **/ +/** OR PERFORMANCE OF THIS SOFTWARE. **/ +/*****************************************************************************/ +/* + * [ ctwm ] + * + * Copyright 1992 Claude Lecommandeur. + * + * Permission to use, copy, modify and distribute this software [ctwm] and + * its documentation for any purpose is hereby granted without fee, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting documen- + * tation, and that the name of Claude Lecommandeur not be used in adverti- + * sing or publicity pertaining to distribution of the software without + * specific, written prior permission. Claude Lecommandeur make no represen- + * tations about the suitability of this software for any purpose. It is + * provided "as is" without express or implied warranty. + * + * Claude Lecommandeur DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO + * EVENT SHALL Claude Lecommandeur BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF + * USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR + * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + * + * Author: Claude Lecommandeur [ lecom@sic.epfl.ch ][ April 1992 ] + */ + + +/*********************************************************************** + * + * $XConsortium: util.h,v 1.10 89/12/10 17:47:04 jim Exp $ + * + * utility routines header file + * + * 28-Oct-87 Thomas E. LaStrange File created + * + ***********************************************************************/ + +#include +#include +#include "types.h" + +#ifndef _UTIL_ +#define _UTIL_ + +#if defined(VMS) || defined(ultrix) || defined(sequent) || defined(sony_news) || defined(riscix) +# define strdup(s) ((char*) strcpy ((char*) malloc (strlen (s) + 1), s)) +#endif + +/* + * Define some helper macros, because "The argument to toupper() must be + * EOF or representable as an unsigned char; otherwise, the behavior is + * undefined." In particular, an argument of type "char" is problematic + * (gcc: warning: array subscript has type 'char'). + */ +#define Isascii(c) isascii((int)(unsigned char)(c)) +#define Isdigit(c) isdigit((int)(unsigned char)(c)) +#define Islower(c) islower((int)(unsigned char)(c)) +#define Isupper(c) isupper((int)(unsigned char)(c)) +#define Tolower(c) tolower((int)(unsigned char)(c)) +#define Toupper(c) toupper((int)(unsigned char)(c)) + +extern void Zoom(Window wf, Window wt); +extern void MoveOutline(Window root, + int x, int y, int width, int height, + int bw, int th); +extern Pixmap GetBitmap(char *name); +extern Pixmap FindBitmap(char *name, + unsigned int *widthp, unsigned int *heightp); +extern void GetUnknownIcon(char *name); +extern char *ExpandFilename(char *name); +extern char *ExpandFilePath(char *path); +extern char *ExpandPixmapPath (char *name); + +void MaskScreen (char *file); +void UnmaskScreen (void); +void StartAnimation (void); +void StopAnimation (void); +void SetAnimationSpeed (int speed); +void ModifyAnimationSpeed (int incr); +void Animate (void); +void TryToAnimate (void); +void InsertRGBColormap (Atom a, XStandardColormap *maps, int nmaps, + Bool replace); +void RemoveRGBColormap (Atom a); +void LocateStandardColormaps (void); +void GetColor (int kind, Pixel *what, char *name); +void GetShadeColors (ColorPair *cp); +void GetFont(MyFont *font); +void SetFocusVisualAttributes (TwmWindow *tmp_win, Bool focus); +void SetFocus (TwmWindow *tmp_win, Time tim); +Pixmap CreateMenuIcon(int height, unsigned int *widthp, unsigned int *heightp); +Pixmap Create3DMenuIcon (unsigned int height, + unsigned int *widthp, unsigned int *heightp, + ColorPair cp); +Pixmap Create3DIconManagerIcon (ColorPair cp); +void Draw3DBorder (Window w, + int x, int y, int width, int height, int bw, + ColorPair cp, + int state, int fill, int forcebw); +void Draw3DCorner (Window w, + int x, int y, int width, int height, int thick, int bw, + ColorPair cp, + int type); +void PaintBorders (TwmWindow *tmp_win, Bool focus); +void PaintAllDecoration (void); +void PaintTitle (TwmWindow *tmp_win); +void PaintIcon (TwmWindow *tmp_win); +void PaintTitleButton (TwmWindow *tmp_win, TBWindow *tbw); +void PaintTitleButtons (TwmWindow *tmp_win); +void adoptWindow (void); +void DebugTrace (char *file); +void SetBorderCursor (TwmWindow *tmp_win, int x, int y); +#if 0 /* These aren't implemented anywhere! */ +void ChangeFocusGrab (); +Cursor CalculateBorderCursor (); +#endif + +extern int HotX, HotY; + +struct _Image { + Pixmap pixmap; + Pixmap mask; + int width; + int height; + struct _Image *next; +}; + +extern Image *GetImage (char *name, ColorPair cp); + +extern unsigned char *GetWMPropertyString(Window w, Atom prop); +extern void FreeWMPropertyString(char *prop); +extern void ConstrainByBorders1 (int *left, int width, int *top, int height); +extern void ConstrainByBorders (TwmWindow *twmwin, + int *left, int width, + int *top, int height); + +#endif /* _UTIL_ */ Index: external/mit/ctwm/dist/version.c =================================================================== RCS file: external/mit/ctwm/dist/version.c diff -N external/mit/ctwm/dist/version.c --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/version.c 3 Sep 2015 12:20:00 -0000 @@ -0,0 +1,57 @@ +/*****************************************************************************/ +/** Copyright 1988 by Evans & Sutherland Computer Corporation, **/ +/** Salt Lake City, Utah **/ +/** Portions Copyright 1989 by the Massachusetts Institute of Technology **/ +/** Cambridge, Massachusetts **/ +/** **/ +/** All Rights Reserved **/ +/** **/ +/** Permission to use, copy, modify, and distribute this software and **/ +/** its documentation for any purpose and without fee is hereby **/ +/** granted, provided that the above copyright notice appear in all **/ +/** copies and that both that copyright notice and this permis- **/ +/** sion notice appear in supporting documentation, and that the **/ +/** names of Evans & Sutherland and M.I.T. not be used in advertising **/ +/** in publicity pertaining to distribution of the software without **/ +/** specific, written prior permission. **/ +/** **/ +/** EVANS & SUTHERLAND AND M.I.T. DISCLAIM ALL WARRANTIES WITH REGARD **/ +/** TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANT- **/ +/** ABILITY AND FITNESS, IN NO EVENT SHALL EVANS & SUTHERLAND OR **/ +/** M.I.T. BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAM- **/ +/** AGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA **/ +/** OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER **/ +/** TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE **/ +/** OR PERFORMANCE OF THIS SOFTWARE. **/ +/*****************************************************************************/ +/* + * [ ctwm ] + * + * Copyright 1992 Claude Lecommandeur. + * + * Permission to use, copy, modify and distribute this software [ctwm] and + * its documentation for any purpose is hereby granted without fee, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting documen- + * tation, and that the name of Claude Lecommandeur not be used in adverti- + * sing or publicity pertaining to distribution of the software without + * specific, written prior permission. Claude Lecommandeur make no represen- + * tations about the suitability of this software for any purpose. It is + * provided "as is" without express or implied warranty. + * + * Claude Lecommandeur DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO + * EVENT SHALL Claude Lecommandeur BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF + * USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR + * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + * + * Author: Claude Lecommandeur [ lecom@sic.epfl.ch ][ April 1992 ] + */ + +#define VERSION_ID "3.8.2" + +char *Version = "MIT X Consortium, R6, ctwm " VERSION_ID; +char *VersionNumber = VERSION_ID; +char *VCSRevision = "fullermd@over-yonder.net-20140518122320-rxuq1zjtur7u0c78"; Index: external/mit/ctwm/dist/version.h =================================================================== RCS file: external/mit/ctwm/dist/version.h diff -N external/mit/ctwm/dist/version.h --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/version.h 3 Sep 2015 12:20:00 -0000 @@ -0,0 +1,70 @@ +/*****************************************************************************/ +/** Copyright 1988 by Evans & Sutherland Computer Corporation, **/ +/** Salt Lake City, Utah **/ +/** Portions Copyright 1989 by the Massachusetts Institute of Technology **/ +/** Cambridge, Massachusetts **/ +/** **/ +/** All Rights Reserved **/ +/** **/ +/** Permission to use, copy, modify, and distribute this software and **/ +/** its documentation for any purpose and without fee is hereby **/ +/** granted, provided that the above copyright notice appear in all **/ +/** copies and that both that copyright notice and this permis- **/ +/** sion notice appear in supporting documentation, and that the **/ +/** names of Evans & Sutherland and M.I.T. not be used in advertising **/ +/** in publicity pertaining to distribution of the software without **/ +/** specific, written prior permission. **/ +/** **/ +/** EVANS & SUTHERLAND AND M.I.T. DISCLAIM ALL WARRANTIES WITH REGARD **/ +/** TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANT- **/ +/** ABILITY AND FITNESS, IN NO EVENT SHALL EVANS & SUTHERLAND OR **/ +/** M.I.T. BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAM- **/ +/** AGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA **/ +/** OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER **/ +/** TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE **/ +/** OR PERFORMANCE OF THIS SOFTWARE. **/ +/*****************************************************************************/ +/* + * [ ctwm ] + * + * Copyright 1992 Claude Lecommandeur. + * + * Permission to use, copy, modify and distribute this software [ctwm] and + * its documentation for any purpose is hereby granted without fee, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting documen- + * tation, and that the name of Claude Lecommandeur not be used in adverti- + * sing or publicity pertaining to distribution of the software without + * specific, written prior permission. Claude Lecommandeur make no represen- + * tations about the suitability of this software for any purpose. It is + * provided "as is" without express or implied warranty. + * + * Claude Lecommandeur DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO + * EVENT SHALL Claude Lecommandeur BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF + * USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR + * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + * + * Author: Claude Lecommandeur [ lecom@sic.epfl.ch ][ April 1992 ] + */ + +/********************************************************************** + * + * $XConsortium: version.h,v 1.7 89/10/27 14:01:42 jim Exp $ + * + * TWM version externs + * + * 8-Apr-88 Tom LaStrange Initial Version. + * + **********************************************************************/ + +#ifndef _VERSION_ +#define _VERSION_ + +extern char *Version; +extern char *VersionNumber; +extern char *VCSRevision; + +#endif /* _VERSION_ */ Index: external/mit/ctwm/dist/vms.txt =================================================================== RCS file: external/mit/ctwm/dist/vms.txt diff -N external/mit/ctwm/dist/vms.txt --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/vms.txt 3 Sep 2015 12:20:00 -0000 @@ -0,0 +1,84 @@ +Stuff for ctwm: (By Peter Chang - peterc@v2.ph.man.ac.uk 3/5/94) +=============== + +Differences: No xwd colour bitmaps, no m4 preparsing, nor other Unix things, + such as sound, pipes, etc. + + +Apart from getting the things compiled the following was changed: + +in several files replaced strdup() +got rid of environ stuff +used lib$wait instead of select() for timing routines + +[ A lot of things had to be declared to compile with no warning at all when + you compile with DEC C /Richard Levitte ] + +ctwm.c: +- PIXMAP_DIRECTORY changed to "DECW$BITMAPS:" +- changed home to "[]" if getenv("HOME"); returns NULL +- hopefully Done() should exit gracefully from ctwm (by running + decw$endsession) + [ I have changed this to be optional. Either DECW$ENDSESSION.EXE is + run, or ctwm exits with the status code 20. This is correctly handled + by CTWM.COM /Richard Levitte ] +- still no restart code + [ This is no longer true. See my comment below. /Richard Levitte ] + +events.c: +- changed CtwmNextEvent to wait for an event flag set by the + AnimateHandler(). Bit of a hack, won't handle X events until the flags is + set. Question: have I done this properly? See util.c. + +menus.c: +- still no restart code + [ This is no longer true. ctwm will simply exit with status code 1. + Since CTWM.COM checks for exactly that code to restart, things are + nicely taken care of /Richard Levitte ] + +parse.c: +- SYSTEM_INIT_FILE changed to "DECW$SYSTEM_DEFAULTS:SYSTEM.CTWMRC" +- user config files should reside in "DECW$USER_DEFAULTS" (not "HOME") + and now called ctwm.rc, ctwm.rc_(screen no), etc. + +util.c: +- ExpandPixmapPath() now looks for "~foo.bar" = file at home or sys$login, + "/disk$users:[joe]foo.bar" = absolute filename and any other "foo.bar" = + a file in the directory defined by PixmapDirectory in config file. +- Animate*() now use system calls such as sys$setimr() to do the timing. + Use two local events flag for the timing - a) for the sys$setimr() + b) when the timer is sprung, the second flag is set. + There are two variations, I tried to use: + 1) The 2nd flag is used by CtwmNextEvent() [in event.c] in a + sys$waitfr() call which waits for this flag alone, ignoring + X events, I think. + 2) The 2nd flag [from cluster 0, = 17] is used by CtwmNextEvent() + in a sys$wflor() call which waits for either this flag or the + ef associated with the X display. + At the moment, I can't get method to work, it seems to ignore timer events. +- got rid of xwd stuff because there is no such stuff in the latest + DecWindows. + [ This is no longer true. Since DECWindows version 6.0 (at least), + you can find xwdfile.h in decw$utils:, which is plenty enough. + /Richard Levitte ] + +Stuff from twm conversion: +========================== + +Apart from getting the things compiled the following was changed: + +twm.c: + +- call to fcntl() was removed +- add call to vms_do_init() inserted into main() + [ Removed. See below. /Richard Levitte ] + +lex.c: + +- the way yyinput and yyoutput are initialized is changed (vms_do_init()) + [ Nope, not any longer. I regenerated lex.c with GN bison for VMS, + which does this correctly, thank you. /Richard Levitte ] + +Xmu/CloseHook.c: + +- in _MakeExtension all code removed (where is XAddExtension() ??) Index: external/mit/ctwm/dist/vms2.txt =================================================================== RCS file: external/mit/ctwm/dist/vms2.txt diff -N external/mit/ctwm/dist/vms2.txt --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/vms2.txt 3 Sep 2015 12:20:00 -0000 @@ -0,0 +1,75 @@ +What did I do for ctwm? (Richard Levitte) +----------------------- + +>>>> ctwm 3.5 beta 1: + +19970301: + + Well, some bug fixes (a missing return at one place... Baaaad...), fixing + the restart code for VMS, a lot of extra declarations to make DEC C shut up, + A real descrip.mms (and a descrip.submms), so you can compile for VAX and + AXP without any file conflict, enhancements of make.com, ctwm.com and of + the docs... + + Well, that's about it. + +19970309: + + Peter Chang mentioned that XWD files are supported in DECWindows. All + you have to do is include decw$utils:xwdfile.h. Unfortunatelly, that + is not completelly true since that file has a fatal bug. Fortunatelly, + it's pretty easy to correct. I do it the hard way though, by editing + the places that are wrong and saving the result in the current directory. + On the fly, of course :-). + + I also added support for the new file conventions that are used in the + VMS port of xpm (version 3.4J). This is also checked on the fly. + + A few bugs in the build procedures were removed at the same time. + +19970318: + + DESCRIP.SUBMMS and MAKE.COM now deal with the copying of *.%_VMS on + their own. No more need for the user to rename those. + + A few quirks with the library option file making cleared. + + A few bugs with older X window system include files cleared. + + A .HLP file created (Thank you Michael Lemke!). + +>>>> ctwm 3.5 beta 3: + +19971115: + + Readded the following files that I have hacked on since the latest + release of Ctwm 3.5 beta 1 for VMS (or that were forgotten back then): + + ALLOCA.C, CTWM.COM, DESCRIP.MMS, GENDEFTWMRC.COM, + LEVITTE_SYSTEM.CTWMRC, MAKE.COM, README.VMS, VMS.TXT + + Added a few function declarations in the following files: + + CURSOR.H, MENUS.H, WORKMGR.H + + MENUS.C needed to include CURSOR.H for correct declaration of + MakeStringCursor(). Also, I've removed (with #if 0..#endif) some code + that Claude claims is already done in Done() (found in CTWM.C). Tests + have proved that he's right. + + I readded the sanity code in TWM.H for now, currently commented, to + have if I need it on other platforms. + + WORKMGR.C: In VMS older than version 7.0, strdup() is not implemented, + so I changed the code for VMS to do a malloc() and strcpy(). + [ N.B.: this was redesigned by Claude to redefine strdup() in UTIL.H + instead. ] + +Todo: +----- + +There is some code around a select() in add_window.c that I have simply +#ifdef'ed out for VMS. I'll deal with it as soon as I understand what +it is supposed to do. + +/Richard Levitte Index: external/mit/ctwm/dist/vms_cmd_services.c =================================================================== RCS file: external/mit/ctwm/dist/vms_cmd_services.c diff -N external/mit/ctwm/dist/vms_cmd_services.c --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/vms_cmd_services.c 3 Sep 2015 12:20:00 -0000 @@ -0,0 +1,541 @@ +/* + * VMS_CMD_SERVICES.C + * + * Author: Patrick L. Mahan + * Location: TGV, Inc + * Date: 01-Sep-1991 + * + * Purpose: Provides utilities needed to create, send and + * receive messages to the process create by $CREPRC. + * This allows us to implement the user custom- + * izable root window normally associated with + * the most PD Window Managers. This is needed + * because DECW$LOGINOUT.EXE starts the Window Manger + * without DCL. + * + * Modification History + * + * Date | Who | Version | Reason + * ------------+-----------+---------------+------------------------------- + * 18-Mar-1991 | PLM | 1.0 | First Write + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "lnm.h" + +#define MAXPROCESS 256 +#define DEFAULT_RUN_NAME "X_" +#define TRM_NAME "MBX_TRM" +#define STOP_CMD "DUMMY:==" +#define STOP_CMD2 "STOP/ID=0" + +#define $INITDESCRIP(name) struct dsc$descriptor_s name = \ + { 0, DSC$K_DTYPE_T, DSC$K_CLASS_S, 0} + +static char RunName[15]; + +typedef struct _vmsaccount { + unsigned short int msgtype; /* Type of message */ + unsigned short int unused0; /* padding */ + unsigned long int status; /* final exit status */ + unsigned long int pid; /* Process ID */ + unsigned long int timestamp[2];/* System time at process termination */ + unsigned char account[8]; /* Account name */ + unsigned char username[12]; /* User name */ + unsigned long int cputime; /* used cpu time in milliseconds */ + unsigned long int pagefaults; /* number of page faults incurred */ + unsigned long int pgflpeak; /* peak number of page faults */ + unsigned long int wspeak; /* peak working set size */ + unsigned long int biocnt; /* # of buffer I/O operations */ + unsigned long int diocnt; /* # of direct I/O operations */ + unsigned long int volumes; /* # of volumes mounted by process */ + unsigned long int login[2]; /* time logged in */ + unsigned long int owner; /* Process ID of owner */ +} VMSAccounting; + +typedef struct _iosb { + unsigned short int status; /* I/O status */ + unsigned short int bytes; /* number of bytes read/write */ + unsigned long int pid; /* Process ID of sender/receiver */ +} MbxIOSB; + +typedef struct _prcblk { + struct _prcblk *forward; /* forward link */ + struct _prcblk *backward; /* backward link */ + unsigned long int pid; /* Process ID of the user command */ + unsigned short int chan; /* mailbox channel for input */ + unsigned short int pad0; /* padding to force longword boundary */ +} PrcBLK; + +static struct _trmmbxinfo { + unsigned short int trmMbxChan; /* termination mailbox channel number */ + unsigned short int trmMbxUnit; /* termination mailbox unit number */ + MbxIOSB trmIOSB; /* termination mailbox I/O status block */ + struct dsc$descriptor_s trmMbxName; /* termination mailbox logical name */ +} TrmMbxInfo = { 0, 0, { 0, 0, 0 }, {sizeof(TRM_NAME), DSC$K_DTYPE_T, DSC$K_CLASS_S, TRM_NAME}}; + +typedef struct { + unsigned short int length; + unsigned short int code; + unsigned long int buffaddr; + unsigned long int retaddrlen; +} ItmLst3; + +static PrcBLK *PrcHead = (PrcBLK *)NULL, *PrcCurrent = (PrcBLK *)NULL; + +$DESCRIPTOR(BitBucket, "NLA0:"); /* null device */ +$DESCRIPTOR(image, "SYS$SYSTEM:LOGINOUT.EXE"); /* image to be run by $CREPRC */ + +static struct dsc$descriptor_s wsaDevice; /* VMS string descriptor for the WorkStation Device */ +static struct dsc$descriptor_s prcname; /* VMS string descriptor for run process name */ +static struct dsc$descriptor_s asciitime; /* VMS string descriptor for getting the returned time */ +static unsigned char TrmMbxBuffer[ACC$K_TERMLEN]; /* Termination Mailbox's input buffer */ +static unsigned char VMSAsciiTime[24]; /* VMS Ascii Time returned by $ASCTIM */ +static unsigned char wsaName[20]; /* VMS null terminate name for WorkStation Device */ +static unsigned short TrmMbxBufferLen = ACC$K_TERMLEN; /* length of the termination's mailbox */ +static unsigned short trmmbxchan = 0; /* termination mailbox channel */ + +/* + * saveProcess - saves the pid and input mailbox channel of the created + * process for deallocation at process termination + */ + +static void saveProcess (pid, chan) +unsigned long int pid; +unsigned short int chan; +{ + PrcBLK *new; + + /* allocate the process slot storage */ + + new = (PrcBLK *) calloc(1, sizeof(PrcBLK)); + + /* initialize the internal process slot */ + + new->forward = (PrcBLK *)NULL; + new->backward = (PrcBLK *)NULL; + new->pid = pid; + new->chan = chan; + new->pad0 = 0; + + /* insert it into the list */ + + if (!(PrcHead)) /* first one */ + { + PrcHead = new; + PrcCurrent = new; + } + else /* not the first one! */ + { + PrcCurrent->forward = new; + new->backward = PrcCurrent; + PrcCurrent = new; + } +} + +/* + * TrmProcedure - AST routine called when a process is terminated + */ + +void TrmProcedure () +{ + int i, trmlen; + unsigned long int istatus; + unsigned short int process_id; + unsigned short int retlen; + char logbuffer[256]; + char accountname[9]; + char username[13]; + VMSAccounting *accptr; + PrcBLK *currptr; + + /* check the status of the IO */ + + if (!(TrmMbxInfo.trmIOSB.status&1)) + { + sys$exit(TrmMbxInfo.trmIOSB.status); + } + + /* transfer the message */ + + accptr = (VMSAccounting *)TrmMbxBuffer; + + if (accptr->msgtype != MSG$_DELPROC) goto ReQueueIt; + + /* loop through the processes and find matching pid */ + + currptr = PrcHead; + + while (currptr) + { + if (currptr->pid == TrmMbxInfo.trmIOSB.pid) + { + sys$dassgn(currptr->chan); /* deassign the channel to the Mailbox */ + if (currptr != PrcHead && currptr != PrcCurrent) + { + currptr->backward->forward = currptr->forward; + currptr->forward->backward = currptr->backward; + } + else if (currptr == PrcHead && currptr == PrcCurrent) + { + PrcHead = (PrcBLK *)NULL; + PrcCurrent = (PrcBLK *)NULL; + } + else if (currptr == PrcHead) + { + PrcHead = currptr->forward; + if (PrcHead) PrcHead->backward = (PrcBLK *)NULL; + } + else + { + PrcCurrent = currptr->backward; + PrcCurrent->forward = NULL; + } + + free (currptr); + + break; + } + + currptr = currptr->forward; + } + +ReQueueIt: + /* requeue the AST */ + + istatus = sys$qio (0, /* event flag (NONE) */ + TrmMbxInfo.trmMbxChan, /* channel */ + IO$_READVBLK, /* function code */ + &TrmMbxInfo.trmIOSB, /* I/O Status Block */ + TrmProcedure, /* AST procedure */ + 0, /* AST parameter (NONE) */ + TrmMbxBuffer, /* buffer */ + TrmMbxBufferLen, /* buffer length */ + 0, 0, 0, 0); /* P3-P6 not used */ + + if (!(istatus&1)) sys$exit (istatus); +} + +/* + * initRun - intializes the internal datastructures required for creating + * user processes on the fly for handling the root menu background + */ + +unsigned long int +initRun(ProcName) +char *ProcName; +{ + unsigned long int istatus; /* vms returned error */ + unsigned long int i; + unsigned long int retry_cnt; + unsigned long int mbxunit; /* mailbox unit number */ + static unsigned long int devclass; + static unsigned long int retdevlen; + unsigned long int ItemCode; + char logname[15]; + char logbuffer[256]; + ItmLst3 ItemList[] = { + { 4, DVI$_DEVCLASS, (unsigned long int)&devclass, (unsigned long int)&retdevlen}, + { 0, 0, 0, 0} + }; + + /* set the logical we want to look at */ + + retry_cnt = 0; + strcpy (logname, "SYS$OUTPUT"); + + /* translate the logical SYS$OUTPUT, this will be the workstation device */ +try_again: + istatus = GetLogical (logname, wsaName); + + if (!(istatus&1)) return (istatus); + + wsaDevice.dsc$b_dtype = DSC$K_DTYPE_T; + wsaDevice.dsc$b_class = DSC$K_CLASS_S; + wsaDevice.dsc$w_length = strlen((char *)wsaName); + wsaDevice.dsc$a_pointer = (char *)wsaName; + + /* make sure that the device is a workstation device */ + + istatus = sys$getdviw (0, /* event flag (NONE) */ + 0, /* channel number (NONE) */ + &wsaDevice, /* device name */ + &ItemList, /* item list */ + 0, /* I/O status block (NONE) */ + 0, /* AST routine (NONE) */ + 0, /* AST parameter (NONE) */ + 0); /* Reserved by DIGITAL */ + + if (!(istatus&1)) return (istatus); + + if (devclass != DC$_WORKSTATION && retry_cnt++ == 0) + { + strcpy (logname, "DECW$DISPLAY"); + goto try_again; + } + else if (devclass != DC$_WORKSTATION) + return (SS$_IVDEVNAM); + + /* create the termination mailbox */ + + istatus = sys$crembx (0, /* create a temporary mailbox */ + &TrmMbxInfo.trmMbxChan, /* channel number for mailbox */ + 0, /* maximum message size (DEFAULT) */ + 0, /* buffer quota (BUFQUO) (DEFAULT) */ + 0, /* protection mask (DEFAULT) */ + 0, /* access mode (DEFAULT) */ + &TrmMbxInfo.trmMbxName); /* logical name for this mailbox */ + + if (!(istatus&1)) return (istatus); + + /* set the item code */ + + ItemCode = DVI$_UNIT; + + /* get the unit number of the termination mailbox */ + + istatus = lib$getdvi(&ItemCode, /* item code */ + &TrmMbxInfo.trmMbxChan, /* device channel */ + 0, /* device name */ + &mbxunit, /* returned numeric val */ + 0, /* return str descrip */ + 0); /* len str return */ + + if (!(istatus&1)) return (istatus); + + TrmMbxInfo.trmMbxUnit = (unsigned short int) mbxunit; /* set the unit number */ + + /* que a read AST on the termination mailbox */ + + istatus = sys$qio (0, /* event flag (NONE) */ + TrmMbxInfo.trmMbxChan, /* channel */ + IO$_READVBLK, /* function code */ + &TrmMbxInfo.trmIOSB, /* I/O Status Block */ + TrmProcedure, /* AST procedure */ + 0, /* AST parameter (NONE) */ + TrmMbxBuffer, /* buffer */ + TrmMbxBufferLen, /* buffer length */ + 0, 0, 0, 0); /* P3-P6 not used */ + + if (!(istatus&1)) return (istatus); + + /* the run name */ + + if (ProcName != NULL && ProcName[0] != 0) + sprintf(RunName, "%s_", ProcName); + else + strcpy(RunName, DEFAULT_RUN_NAME); + + /* return success */ + + return (1); +} + +/* + * createProcess - creates a process for the user's program to + * execute within. This is via the LOGINOUT.EXE image which gives + * the process DCL. + */ + +unsigned long int +createProcess (command) +char *command; +{ + unsigned short int inmbxchan; + unsigned long int istatus; + static unsigned long int i; + unsigned long int pid; + unsigned long int protection_mask = 0x0000FF00; + static unsigned long int base_priority; + static unsigned long int MbxUnit; + static unsigned long int MbxNameLen = 0; + static unsigned long int MbxUnitLen = 0; + char *inMbxPtr; + static char MbxName[64]; + char process_name[16]; + char logbuffer[256]; + $INITDESCRIP(InMbxDevice); + MbxIOSB iosb; + ItmLst3 ItemList[] = { + { 64, DVI$_DEVNAM, (unsigned long int)MbxName, (unsigned long int)&MbxNameLen}, + { 4, DVI$_UNIT, (unsigned long int)&MbxUnit, (unsigned long int)&MbxUnitLen}, + { 0, 0, 0, 0} + }; + ItmLst3 JpiItemList[] = { + { 4, JPI$_PRIB, (unsigned long int)&base_priority, (unsigned long int)&i}, + { 0, 0, 0, 0} + }; + + /* get the base priority of the process */ + + istatus = sys$getjpiw (0, /* event flag (NONE) */ + 0, /* pid address */ + 0, /* process name */ + &JpiItemList, /* item list */ + 0, /* I/O Status Block (NONE)*/ + 0, /* AST routine (NONE) */ + 0); /* AST parameter (NONE) */ + + if (!(istatus&1)) return (istatus); + + /* create the input mailbox */ + + istatus = sys$crembx (0, /* create a temporary mailbox */ + &inmbxchan, /* channel number assigned to this Mailbox */ + 1024, /* maximum message size (DEFAULT) */ + 1024, /* buffer quota (BUFQUO) (DEFAULT) */ + protection_mask, /* protection mask (DEFAULT) */ + PSL$C_USER, /* access mode (DEFAULT) */ + 0); /* logical name for this Mailbox (NONE) */ + + if (!(istatus & 1)) return (istatus); /* return on error */ + + /* get the device name and unit number of the MailBox */ + + istatus = sys$getdviw (0, /* event flag (NONE) */ + inmbxchan, /* channel number */ + 0, /* device name (NONE) */ + &ItemList, /* what we want */ + 0, /* I/O status block (NONE) */ + 0, /* AST routine (NONE) */ + 0, /* AST parameter (NONE) */ + 0); /* reserved by DIGITAL */ + + if (!(istatus&1)) return (istatus); + + MbxName[MbxNameLen] = '\0'; + inMbxPtr = (char *) calloc(strlen(MbxName)+1, sizeof(char)); + strcpy (inMbxPtr, MbxName); + InMbxDevice.dsc$w_length = strlen(inMbxPtr); + InMbxDevice.dsc$a_pointer = inMbxPtr; + + /* que up the command to be read by the process */ + +#ifdef DEBUG + fprintf (stdout, "Queueing user command (\"%s\") to input Mailbox\n", command); +#endif + istatus = sys$qiow (0, /* event flags (NONE) */ + inmbxchan, /* channel number */ + IO$_WRITEVBLK|IO$M_NOW|IO$M_NORSWAIT, /* function code */ + &iosb, /* I/O status block */ + 0, /* AST routine (NONE) */ + 0, /* AST parameter (NONE) */ + command, /* buffer to be sent */ + strlen(command), /* length of buffer */ + 0,0,0,0); /* P3-P6 not used */ + + if (!(istatus&1)) return (istatus); + + if (!(iosb.status&1)) return (iosb.status); + + if(iosb.bytes != strlen(command)) return (SS$_MBFULL); + + /* que up a dummy command so that we know the process has ended */ + +#ifdef DEBUG + fprintf (stdout, "Queueing dummy command (\"%s\") to input Mailbox\n", STOP_CMD); +#endif + istatus = sys$qiow (0, /* event flags (NONE) */ + inmbxchan, /* channel number */ + IO$_WRITEVBLK|IO$M_NOW|IO$M_NORSWAIT, /* function code */ + &iosb, /* I/O status block */ + 0, /* AST routine (NONE) */ + 0, /* AST parameter (NONE) */ + STOP_CMD, /* buffer to be sent */ + strlen(STOP_CMD), /* length of buffer */ + 0,0,0,0); /* P3-P6 not used */ + + if (!(istatus&1)) return (istatus); + + if (!(iosb.status&1)) return (iosb.status); + + if(iosb.bytes != strlen(STOP_CMD)) return (SS$_MBFULL); + + /* que up the stop command to end the process */ + +#ifdef DEBUG + fprintf (stdout, "Queueing stop command (\"%s\") to input Mailbox\n", STOP_CMD2); +#endif + istatus = sys$qiow (0, /* event flags (NONE) */ + inmbxchan, /* channel number */ + IO$_WRITEVBLK|IO$M_NOW|IO$M_NORSWAIT, /* function code */ + &iosb, /* I/O status block */ + 0, /* AST routine (NONE) */ + 0, /* AST parameter (NONE) */ + STOP_CMD2, /* buffer to be sent */ + strlen(STOP_CMD2), /* length of buffer */ + 0,0,0,0); /* P3-P6 not used */ + + if (!(istatus&1)) return (istatus); + + if (!(iosb.status&1)) return (iosb.status); + + if(iosb.bytes != strlen(STOP_CMD2)) return (SS$_MBFULL); + + /* create the process name buffer */ + + prcname.dsc$b_dtype = DSC$K_DTYPE_T; + prcname.dsc$b_class = DSC$K_CLASS_S; + prcname.dsc$a_pointer = process_name; + + /* create the process and let it run */ + + i = 1; + do { + sprintf (process_name, "%s%d", RunName, i); + prcname.dsc$w_length = strlen(process_name); + + istatus = sys$creprc (&pid, /* created process ID */ + &image, /* image to run in process */ + &InMbxDevice, /* input */ + &BitBucket, /* output */ + &wsaDevice, /* error */ + 0, /* privileges (DEFAULT) */ + 0, /* quotas (DEFAULT) */ + &prcname, /* process name */ + base_priority, /* base priority */ + 0, /* UIC */ + TrmMbxInfo.trmMbxUnit, /* termination mailbox */ + (PRC$M_DETACH | PRC$M_INTER | PRC$M_NOPASSWORD)); /* process status flags */ + + i++; /* bump the count up */ + } while (istatus == SS$_DUPLNAM); + + if (!(istatus&1)) + { + sys$dassgn(inmbxchan); + return (istatus); + } + else + saveProcess (pid, inmbxchan); + +#ifdef DEBUG + fprintf (stdout, "Created process \"%s\" identification 0x%x\n", process_name, pid); +#endif + /* free allocated memory */ + + free (inMbxPtr); + + return (SS$_NORMAL); +} Index: external/mit/ctwm/dist/vms_cmd_services.h =================================================================== RCS file: external/mit/ctwm/dist/vms_cmd_services.h diff -N external/mit/ctwm/dist/vms_cmd_services.h --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/vms_cmd_services.h 3 Sep 2015 12:20:00 -0000 @@ -0,0 +1,21 @@ +/* + * VMS_CMD_SERVICES.H + * + * Author: Patrick L. Mahan + * Location: TGV, Incorporated + * Date: 01-Sep-1991 + * + * Purpose: Defines the external references for the + * VMS Command Services. + * + * Modification History + * + * Date | Who | Version | Reason + * ------------+-----------+---------------+------------------------------ + * 18-Mar-1992 | PLM | 1.0 | First Write + * + */ + +extern unsigned long int initRun (); /* initializes the process, and the input/output Mailboxes */ +extern unsigned long int createProcess (); /* creates a user process to execute the command in */ + Index: external/mit/ctwm/dist/vscreen.c =================================================================== RCS file: external/mit/ctwm/dist/vscreen.c diff -N external/mit/ctwm/dist/vscreen.c --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/vscreen.c 3 Sep 2015 12:20:00 -0000 @@ -0,0 +1,191 @@ +/* + * [ ctwm ] + * + * Copyright 1992 Claude Lecommandeur. + * + * Permission to use, copy, modify and distribute this software [ctwm] and + * its documentation for any purpose is hereby granted without fee, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting documen- + * tation, and that the name of Claude Lecommandeur not be used in adverti- + * sing or publicity pertaining to distribution of the software without + * specific, written prior permission. Claude Lecommandeur make no represen- + * tations about the suitability of this software for any purpose. It is + * provided "as is" without express or implied warranty. + * + * Claude Lecommandeur DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO + * EVENT SHALL Claude Lecommandeur BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF + * USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR + * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + * + * Author: Claude Lecommandeur [ lecom@sic.epfl.ch ][ April 1992 ] + */ + +#include +#include +#include "twm.h" +#include "cursor.h" +#include "screen.h" + +extern void twmrc_error_prefix(void); + +void InitVirtualScreens (ScreenInfo *scr) { + Cursor cursor; + unsigned long valuemask, attrmask; + XSetWindowAttributes attributes; + name_list *nptr; + Atom _XA_WM_VIRTUALROOT = XInternAtom (dpy, "WM_VIRTUALROOT", False); + Bool userealroot = True; + + NewFontCursor (&cursor, "X_cursor"); + + if (scr->VirtualScreens == NULL) { + if (userealroot) { + virtualScreen *vs = (virtualScreen*) malloc (sizeof (virtualScreen)); + + vs->x = 0; + vs->y = 0; + vs->w = scr->rootw; + vs->h = scr->rooth; + vs->window = scr->Root; + vs->next = NULL; + scr->vScreenList = vs; + scr->currentvs = vs; + return; + } else { + scr->VirtualScreens = (name_list*) malloc (sizeof (name_list)); + scr->VirtualScreens->next = NULL; + scr->VirtualScreens->name = (char*) malloc (64); + sprintf (scr->VirtualScreens->name, "%dx%d+0+0", scr->rootw, scr->rooth); + } + } + + attrmask = ColormapChangeMask | EnterWindowMask | PropertyChangeMask | + SubstructureRedirectMask | KeyPressMask | ButtonPressMask | + ButtonReleaseMask; + + valuemask = CWBackingStore | CWSaveUnder | CWBackPixel | CWOverrideRedirect | + CWEventMask | CWCursor; + attributes.backing_store = NotUseful; + attributes.save_under = False; + attributes.override_redirect = True; + attributes.event_mask = attrmask; + attributes.cursor = cursor; + attributes.background_pixel = Scr->Black; + + scr->vScreenList = NULL; + for (nptr = Scr->VirtualScreens; nptr != NULL; nptr = nptr->next) { + virtualScreen *vs; + char *geometry = (char*) nptr->name; + int x = 0, y = 0; + unsigned int w = 0, h = 0; + + XParseGeometry (geometry, &x, &y, &w, &h); + + if ((x < 0) || (y < 0) || (w > scr->rootw) || (h > scr->rooth)) { + twmrc_error_prefix (); + fprintf (stderr, "InitVirtualScreens : invalid geometry : %s\n", geometry); + continue; + } + vs = (virtualScreen*) malloc (sizeof (virtualScreen)); + vs->x = x; + vs->y = y; + vs->w = w; + vs->h = h; + vs->window = XCreateWindow (dpy, Scr->Root, x, y, w, h, + 0, CopyFromParent, (unsigned int) CopyFromParent, + (Visual *) CopyFromParent, valuemask, &attributes); + + XSync (dpy, 0); + XMapWindow (dpy, vs->window); + XChangeProperty (dpy, vs->window, _XA_WM_VIRTUALROOT, XA_STRING, 8, + PropModeReplace, (unsigned char *) "Yes", 4); + + vs->next = scr->vScreenList; + scr->vScreenList = vs; + } + + if (scr->vScreenList == NULL) { + twmrc_error_prefix (); + fprintf (stderr, "no valid VirtualScreens found, exiting...\n"); + exit (1); + } +} + +virtualScreen *findIfVScreenOf (int x, int y) +{ + virtualScreen *vs; + for (vs = Scr->vScreenList; vs != NULL; vs = vs->next) { + if ((x >= vs->x) && ((x - vs->x) < vs->w) && + (y >= vs->y) && ((y - vs->y) < vs->h)) { + return vs; + } + } + return NULL; +} + +virtualScreen *getVScreenOf (int x, int y) +{ + virtualScreen *vs; + if ((vs = findIfVScreenOf(x, y))) + return vs; + return Scr->vScreenList; +} + +/* + * Returns the order that virtual screens are displayed for the vscreen + * list. This is stored this way so everything ends up in the right place + * on a ctwm restart. + */ +Bool CtwmGetVScreenMap (Display *display, Window rootw, + char *outbuf, int *outbuf_len) +{ + Atom _XA_WM_CTWM_VSCREENMAP; + unsigned char *prop; + unsigned long bytesafter; + unsigned long len; + Atom actual_type; + int actual_format; + + _XA_WM_CTWM_VSCREENMAP = XInternAtom (display, "WM_CTWM_VSCREENMAP", True); + if (_XA_WM_CTWM_VSCREENMAP == None) return (False); + if (XGetWindowProperty (display, rootw, _XA_WM_CTWM_VSCREENMAP, 0L, 512, + False, XA_STRING, &actual_type, &actual_format, &len, + &bytesafter, &prop) != Success) return (False); + if (len == 0) return (False); + *outbuf_len = (len>=*outbuf_len)?*outbuf_len-1:len; + memcpy(outbuf, prop, *outbuf_len); + outbuf[*outbuf_len] = '\0'; + XFree((char *)prop); + return True; +} + +Bool CtwmSetVScreenMap(Display *display, Window rootw, + struct virtualScreen *firstvs) +{ + char buf[1024]; + int tally = 0; + Atom _XA_WM_CTWM_VSCREENMAP; + struct virtualScreen *vs; + + _XA_WM_CTWM_VSCREENMAP = XInternAtom (display, "WM_CTWM_VSCREENMAP", True); + if(_XA_WM_CTWM_VSCREENMAP == None) return(False); + + memset(buf, 0, sizeof(buf)); + for(vs = firstvs; vs; vs = vs->next) { + if(tally) strcat(buf, ","); + if(vs->wsw&&vs->wsw->currentwspc&&vs->wsw->currentwspc->name) { + strcat(buf, vs->wsw->currentwspc->name); + tally++; + } + } + + if(! tally) return(False); + + XChangeProperty(display, rootw, _XA_WM_CTWM_VSCREENMAP, XA_STRING, 8, + PropModeReplace, (unsigned char *)buf, strlen(buf)); + return(True); +} Index: external/mit/ctwm/dist/vscreen.h =================================================================== RCS file: external/mit/ctwm/dist/vscreen.h diff -N external/mit/ctwm/dist/vscreen.h --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/vscreen.h 3 Sep 2015 12:20:00 -0000 @@ -0,0 +1,47 @@ +/* + * [ ctwm ] + * + * Copyright 1992 Claude Lecommandeur. + * + * Permission to use, copy, modify and distribute this software [ctwm] and + * its documentation for any purpose is hereby granted without fee, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting documen- + * tation, and that the name of Claude Lecommandeur not be used in adverti- + * sing or publicity pertaining to distribution of the software without + * specific, written prior permission. Claude Lecommandeur make no represen- + * tations about the suitability of this software for any purpose. It is + * provided "as is" without express or implied warranty. + * + * Claude Lecommandeur DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO + * EVENT SHALL Claude Lecommandeur BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF + * USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR + * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + * + * Author: Claude Lecommandeur [ lecom@sic.epfl.ch ][ April 1992 ] + */ +#include "types.h" + +#ifndef _VSCREEN_ +#define _VSCREEN_ + +struct virtualScreen { + int x, y, w, h; /* x,y relative to XineramaRoot */ + Window window; + /* Boolean main; */ + struct WorkSpaceWindow *wsw; + struct virtualScreen *next; +}; + +void InitVirtualScreens (ScreenInfo *scr); +virtualScreen *findIfVScreenOf (int x, int y); +virtualScreen *getVScreenOf (int x, int y); +Bool CtwmGetVScreenMap (Display *display, Window rootw, + char *outbuf, int *outbuf_len); +Bool CtwmSetVScreenMap(Display *display, Window rootw, + struct virtualScreen *firstvs); + +#endif /* -VSCREEN- */ Index: external/mit/ctwm/dist/windowbox.c =================================================================== RCS file: external/mit/ctwm/dist/windowbox.c diff -N external/mit/ctwm/dist/windowbox.c --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/windowbox.c 3 Sep 2015 12:20:00 -0000 @@ -0,0 +1,163 @@ +/* + * [ ctwm ] + * + * Copyright 1992 Claude Lecommandeur. + * + * Permission to use, copy, modify and distribute this software [ctwm] and + * its documentation for any purpose is hereby granted without fee, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting documen- + * tation, and that the name of Claude Lecommandeur not be used in adverti- + * sing or publicity pertaining to distribution of the software without + * specific, written prior permission. Claude Lecommandeur make no represen- + * tations about the suitability of this software for any purpose. It is + * provided "as is" without express or implied warranty. + * + * Claude Lecommandeur DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO + * EVENT SHALL Claude Lecommandeur BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF + * USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR + * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + * + * Author: Claude Lecommandeur [ lecom@sic.epfl.ch ][ April 1992 ] + */ + + +#include +#include "twm.h" +#ifdef VMS +#include +#else +#include +#endif +#include "screen.h" +#include "add_window.h" +#include "resize.h" +#include "windowbox.h" + +name_list **addWindowBox (char *boxname, char *geometry) +{ + WindowBox *winbox; + +#if 0 + printf ("addWindowBox : name = %s, geometry = %s\n", boxname, geometry); +#endif + winbox = (WindowBox*) malloc (sizeof (WindowBox)); + winbox->next = NULL; + winbox->name = strdup (boxname); + winbox->geometry = strdup (geometry); + winbox->winlist = NULL; + if (!Scr->FirstWindowBox) Scr->FirstWindowBox = winbox; + return (&(winbox->winlist)); +} + +void createWindowBoxes (void) +{ + WindowBox *winbox; + char title [128]; + XWMHints wmhints; + XSizeHints sizehints; + + for (winbox = Scr->FirstWindowBox; winbox; winbox = winbox->next) { + int mask, x, y, gravity; + unsigned int w, h; + Window win; + + mask = XParseGeometry (winbox->geometry, &x, &y, &w, &h); + if (mask & XNegative) { + x += Scr->rootw - w; + gravity = (mask & YNegative) ? SouthEastGravity : NorthEastGravity; + } else { + gravity = (mask & YNegative) ? SouthWestGravity : NorthWestGravity; + } + if (mask & YNegative) y += Scr->rooth - h; + + win = XCreateSimpleWindow (dpy, Scr->Root, x, y, w, h, 0, Scr->Black, Scr->White); + /*printf ("createWindowBoxes : name = %s, win = 0x%x, x = %d, y = %d, w = %d, h = %d\n", + winbox->name, win, x, y, w, h); */ + sprintf (title, "%s", winbox->name); + XSetStandardProperties (dpy, win, title, title, None, NULL, 0, NULL); + sizehints.flags = USPosition | USSize | PWinGravity; + sizehints.x = x; + sizehints.y = y; + sizehints.width = w; + sizehints.height = h; + sizehints.win_gravity = gravity; + XSetWMSizeHints (dpy, win, &sizehints, XA_WM_NORMAL_HINTS); + + wmhints.initial_state = NormalState; + wmhints.input = True; + wmhints.flags = InputHint | StateHint; + XSetWMHints (dpy, win, &wmhints); + + winbox->window = win; + winbox->twmwin = AddWindow (win, 2, NULL); + if (!winbox->twmwin) { + fprintf (stderr, "cannot create %s window box, exiting...\n", winbox->name); + exit (1); + } + winbox->twmwin->iswinbox = TRUE; + XMapWindow (dpy, win); + } +} + +WindowBox *findWindowBox (TwmWindow *twmwin) +{ + WindowBox *winbox; + if (twmwin->iswinbox) return ((WindowBox*)0); + if (!Scr->FirstWindowBox) return ((WindowBox*)0); + for (winbox = Scr->FirstWindowBox; winbox; winbox = winbox->next) { + if (LookInList (winbox->winlist, twmwin->full_name, &twmwin->class)) { + if (visible (winbox->twmwin)) { + twmwin->winbox = winbox; + return (winbox); + } + } + } + return ((WindowBox*)0); +} + +void ConstrainedToWinBox (TwmWindow *twmwin, int x, int y, int *nx, int *ny) +{ + XWindowAttributes attr; + + *nx = x; *ny = y; + XGetWindowAttributes (dpy, twmwin->winbox->window, &attr); + if (x < 0) *nx = 0; + if (y < 0) *ny = 0; + if (x > attr.width - 1) *nx = attr.width - 1; + if (y > attr.height - 1) *ny = attr.height - 1; +} + +void fittocontent (TwmWindow *twmwin) +{ + TwmWindow *t; + int minx, miny, maxx, maxy, x, y, w, h; + minx = Scr->rootw; + miny = Scr->rooth; + maxx = 0; + maxy = 0; + for (t = Scr->FirstWindow; t != NULL; t = t->next) { + if (t->winbox && (t->winbox->twmwin == twmwin)) { + if (t->frame_x < minx) minx = t->frame_x; + if (t->frame_y < miny) miny = t->frame_y; + w = t->frame_width + 2 * t->frame_bw; + h = t->frame_height + 2 * t->frame_bw; + if (t->frame_x + w > maxx) maxx = t->frame_x + w; + if (t->frame_y + h > maxy) maxy = t->frame_y + h; + } + } + x = twmwin->frame_x + minx; + y = twmwin->frame_y + miny; + w = maxx - minx + 2 * twmwin->frame_bw3D; + h = maxy - miny + 2 * twmwin->frame_bw3D; + SetupWindow (twmwin, x, y, w, h, -1); + for (t = Scr->FirstWindow; t != NULL; t = t->next) { + if (t->winbox && (t->winbox->twmwin == twmwin)) { + SetupWindow (t, t->frame_x - minx, t->frame_y - miny, + t->frame_width, t->frame_height, -1); + } + } +} Index: external/mit/ctwm/dist/windowbox.h =================================================================== RCS file: external/mit/ctwm/dist/windowbox.h diff -N external/mit/ctwm/dist/windowbox.h --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/windowbox.h 3 Sep 2015 12:20:00 -0000 @@ -0,0 +1,52 @@ +/* + * [ ctwm ] + * + * Copyright 1992 Claude Lecommandeur. + * + * Permission to use, copy, modify and distribute this software [ctwm] and + * its documentation for any purpose is hereby granted without fee, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting documen- + * tation, and that the name of Claude Lecommandeur not be used in adverti- + * sing or publicity pertaining to distribution of the software without + * specific, written prior permission. Claude Lecommandeur make no represen- + * tations about the suitability of this software for any purpose. It is + * provided "as is" without express or implied warranty. + * + * Claude Lecommandeur DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO + * EVENT SHALL Claude Lecommandeur BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF + * USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR + * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + * + * Author: Claude Lecommandeur [ lecom@sic.epfl.ch ][ April 1992 ] + */ + + +/********************************************************************** + * + * $XConsortium: add_window.h,v 1.7 90/04/17 14:04:33 jim Exp $ + * + * AddWindow include file + * + * 31-Mar-88 Tom LaStrange Initial Version. + * + **********************************************************************/ + +#include "types.h" + +#ifndef _WINDOW_BOX_ +#define _WINDOW_BOX_ + +extern name_list **addWindowBox (char *boxname, char *geometry); +extern void createWindowBoxes (void); +extern WindowBox *findWindowBox (TwmWindow *twmwin); + +extern void ConstrainedToWinBox (TwmWindow *twmwin, + int x, int y, int *nx, int *ny); +extern void fittocontent (TwmWindow *twmwin); + +#endif /* _WINDOW_BOX_ */ + Index: external/mit/ctwm/dist/workmgr.c =================================================================== RCS file: external/mit/ctwm/dist/workmgr.c diff -N external/mit/ctwm/dist/workmgr.c --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/workmgr.c 3 Sep 2015 12:20:00 -0000 @@ -0,0 +1,3641 @@ +/* + * [ ctwm ] + * + * Copyright 1992 Claude Lecommandeur. + * + * Permission to use, copy, modify and distribute this software [ctwm] and + * its documentation for any purpose is hereby granted without fee, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting documen- + * tation, and that the name of Claude Lecommandeur not be used in adverti- + * sing or publicity pertaining to distribution of the software without + * specific, written prior permission. Claude Lecommandeur make no represen- + * tations about the suitability of this software for any purpose. It is + * provided "as is" without express or implied warranty. + * + * Claude Lecommandeur DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO + * EVENT SHALL Claude Lecommandeur BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF + * USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR + * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + * + * Author: Claude Lecommandeur [ lecom@sic.epfl.ch ][ April 1992 ] + */ +#include +#include +#include "twm.h" +#include "util.h" +#include "parse.h" +#include "screen.h" +#include "icons.h" +#include "resize.h" +#include "add_window.h" +#include "events.h" +#include "clicktofocus.h" +#include "cursor.h" +#include "list.h" +#include "workmgr.h" +#ifdef VMS +#include +#include +#include +#include +#include +#else +#include +#include +#include +#include +#endif +#ifdef macII +int strcmp(); /* missing from string.h in AUX 2.0 */ +#endif +#ifdef BUGGY_HP700_SERVER +static void fakeRaiseLower (); +#endif + +#ifdef GNOME +# include "gnomewindefs.h" /* include GNOME hints definitions */ + extern Atom _XA_WIN_WORKSPACE; + extern Atom _XA_WIN_STATE; +#endif /* GNOME */ + +extern void twmrc_error_prefix (void); /* in gram.c */ +extern char *captivename; + +/*********************************************************************** + * + * Procedure: + * CreateWorkSpaceManager - create the workspace manager window + * for this screen. + * + * Returned Value: + * none + * + * Inputs: + * none + * + *********************************************************************** + */ +#define WSPCWINDOW 0 +#define OCCUPYWINDOW 1 +#define OCCUPYBUTTON 2 + +static void Vanish (virtualScreen *vs, + TwmWindow *tmp_win); +static void DisplayWin (virtualScreen *vs, + TwmWindow *tmp_win); +static void CreateWorkSpaceManagerWindow (virtualScreen *vs); +static void CreateOccupyWindow (void); +static unsigned int GetMaskFromResource (TwmWindow *win, char *res); +static int GetPropertyFromMask (unsigned int mask, char *prop, + long *gwkspc); +static void PaintWorkSpaceManagerBorder (virtualScreen *vs); +static void PaintButton (int which, + virtualScreen *vs, Window w, + char *label, + ColorPair cp, int state); +static void WMapRemoveFromList (TwmWindow *win, WorkSpace *ws); +static int WMapWindowMayBeAdded (TwmWindow *win); +static void WMapAddToList (TwmWindow *win, WorkSpace *ws); +static void ResizeWorkSpaceManager (virtualScreen *vs, TwmWindow *win); +static void ResizeOccupyWindow (TwmWindow *win); +static WorkSpace *GetWorkspace (char *wname); +static void WMapRedrawWindow (Window window, int width, int height, + ColorPair cp, char *label); +static int CanChangeOccupation (TwmWindow **twm_winp); +void safecopy (char *dest, char *src, int size); + +Atom _XA_WM_OCCUPATION; +Atom _XA_WM_CURRENTWORKSPACE; +Atom _XA_WM_WORKSPACESLIST; +Atom _XA_WM_CTWMSLIST; +Atom _XA_WM_CTWM_VSCREENMAP; +Atom _OL_WIN_ATTR; + +int fullOccupation = 0; +int useBackgroundInfo = False; +XContext MapWListContext = (XContext) 0; +static Cursor handCursor = (Cursor) 0; +static Bool DontRedirect (Window window); + +extern Bool donttoggleworkspacemanagerstate; +extern Bool MaybeAnimate; +extern FILE *tracefile; + +void InitWorkSpaceManager (void) +{ + Scr->workSpaceMgr.count = 0; + Scr->workSpaceMgr.workSpaceList = NULL; + Scr->workSpaceMgr.initialstate = BUTTONSSTATE; + Scr->workSpaceMgr.geometry = NULL; + Scr->workSpaceMgr.buttonStyle = STYLE_NORMAL; + Scr->workSpaceMgr.windowcp.back = Scr->White; + Scr->workSpaceMgr.windowcp.fore = Scr->Black; + Scr->workSpaceMgr.windowcpgiven = False; + + Scr->workSpaceMgr.occupyWindow = calloc(1, sizeof (OccupyWindow)); + Scr->workSpaceMgr.occupyWindow->name = "Occupy Window"; + Scr->workSpaceMgr.occupyWindow->icon_name = "Occupy Window Icon"; + Scr->workSpaceMgr.occupyWindow->geometry = NULL; + Scr->workSpaceMgr.occupyWindow->columns = 0; + Scr->workSpaceMgr.occupyWindow->twm_win = (TwmWindow*) 0; + Scr->workSpaceMgr.occupyWindow->vspace = Scr->WMgrVertButtonIndent; + Scr->workSpaceMgr.occupyWindow->hspace = Scr->WMgrHorizButtonIndent; + + Scr->workSpaceMgr.curColors.back = Scr->Black; + Scr->workSpaceMgr.curColors.fore = Scr->White; + Scr->workSpaceMgr.defColors.back = Scr->White; + Scr->workSpaceMgr.defColors.fore = Scr->Black; + Scr->workSpaceMgr.curImage = None; + Scr->workSpaceMgr.curPaint = False; + Scr->workSpaceMgr.defImage = None; + Scr->workSpaceMgr.vspace = Scr->WMgrVertButtonIndent; + Scr->workSpaceMgr.hspace = Scr->WMgrHorizButtonIndent; + Scr->workSpaceMgr.name = "WorkSpaceManager"; + Scr->workSpaceMgr.icon_name = "WorkSpaceManager Icon"; + + Scr->workSpaceMgr.windowFont.basename = + "-adobe-courier-medium-r-normal--10-100-75-75-m-60-iso8859-1"; + /*"-adobe-courier-bold-r-normal--8-80-75-75-m-50-iso8859-1";*/ + + XrmInitialize (); + if (MapWListContext == (XContext) 0) MapWListContext = XUniqueContext (); +} + +void ConfigureWorkSpaceManager (void) { + virtualScreen *vs; + + for (vs = Scr->vScreenList; vs != NULL; vs = vs->next) { + /* + * Make sure this is all properly initialized to nothing. Otherwise + * bad and undefined behavior can show up in certain cases (e.g., + * with no Workspaces {} defined in .ctwmrc, the only defined + * workspace will be random memory bytes, which can causes crashes on + * e.g. f.menu "TwmWindows".) + */ + WorkSpaceWindow *wsw = (WorkSpaceWindow*) calloc (1, sizeof (WorkSpaceWindow)); + wsw->state = Scr->workSpaceMgr.initialstate; /* BUTTONSSTATE */ + vs->wsw = wsw; + } +} + +void CreateWorkSpaceManager (void) +{ + char wrkSpcList [512]; + char vsmapbuf [1024], *vsmap; + virtualScreen *vs; + WorkSpace *ws, *fws; + int len, vsmaplen; + long junk; + + if (! Scr->workSpaceManagerActive) return; + + Scr->workSpaceMgr.windowFont.basename = + "-adobe-courier-medium-r-normal--10-100-75-75-m-60-iso8859-1"; + Scr->workSpaceMgr.buttonFont = Scr->IconManagerFont; + Scr->workSpaceMgr.cp = Scr->IconManagerC; + if (!Scr->BeNiceToColormap) GetShadeColors (&Scr->workSpaceMgr.cp); + + _XA_WM_OCCUPATION = XInternAtom (dpy, "WM_OCCUPATION", False); + _XA_WM_CURRENTWORKSPACE = XInternAtom (dpy, "WM_CURRENTWORKSPACE", False); + _XA_WM_CTWM_VSCREENMAP = XInternAtom (dpy, "WM_CTWM_VSCREENMAP", False); +#ifdef GNOME + _XA_WM_WORKSPACESLIST = XInternAtom (dpy, "_WIN_WORKSPACE_NAMES", False); +#else /* GNOME */ + _XA_WM_WORKSPACESLIST = XInternAtom (dpy, "WM_WORKSPACESLIST", False); +#endif /* GNOME */ + _OL_WIN_ATTR = XInternAtom (dpy, "_OL_WIN_ATTR", False); + + NewFontCursor (&handCursor, "top_left_arrow"); + + vsmaplen = sizeof(vsmapbuf); + if(CtwmGetVScreenMap(dpy, Scr->Root, vsmapbuf, &vsmaplen) == True) + vsmap = strtok(vsmapbuf, ","); + else + vsmap = NULL; + + /* + * weird things can happen if the config file is changed or the atom + * returned above is messed with. Sometimes windows may disappear in + * that case depending on what's changed. (depending on where they were + * on the actual screen. + */ + ws = Scr->workSpaceMgr.workSpaceList; + for (vs = Scr->vScreenList; vs != NULL; vs = vs->next) { + WorkSpaceWindow *wsw = vs->wsw; + if(vsmap) + fws = GetWorkspace(vsmap); + else + fws = NULL; + if(fws) { + wsw->currentwspc = fws; + vsmap = strtok(NULL, ","); + } else { + wsw->currentwspc = ws; + ws = ws->next; + } + CreateWorkSpaceManagerWindow (vs); + } + CreateOccupyWindow (); + + for (vs = Scr->vScreenList; vs != NULL; vs = vs->next) { + WorkSpaceWindow *wsw = vs->wsw; + WorkSpace *ws2 = wsw->currentwspc; + MapSubwindow *msw = wsw->mswl [ws2->number]; + if (Scr->workSpaceMgr.curImage == None) { + if (Scr->workSpaceMgr.curPaint) { + XSetWindowBackground (dpy, msw->w, Scr->workSpaceMgr.curColors.back); + } + } else { + XSetWindowBackgroundPixmap (dpy, msw->w, Scr->workSpaceMgr.curImage->pixmap); + } + XSetWindowBorder (dpy, msw->w, Scr->workSpaceMgr.curBorderColor); + XClearWindow (dpy, msw->w); + + if (useBackgroundInfo && ! Scr->DontPaintRootWindow) { + if (ws2->image == None) + XSetWindowBackground (dpy, vs->window, ws2->backcp.back); + else + XSetWindowBackgroundPixmap (dpy, vs->window, ws2->image->pixmap); + XClearWindow (dpy, vs->window); + } + } + len = GetPropertyFromMask (0xFFFFFFFFu, wrkSpcList, &junk); + XChangeProperty (dpy, Scr->Root, _XA_WM_WORKSPACESLIST, XA_STRING, 8, + PropModeReplace, (unsigned char *) wrkSpcList, len); +} + +void GotoWorkSpaceByName (virtualScreen *vs, char *wname) +{ + WorkSpace *ws; + + if (! Scr->workSpaceManagerActive) return; + if (!vs) return; + ws = GetWorkspace(wname); + if (ws == NULL) return; + GotoWorkSpace (vs, ws); +} + +/* 6/19/1999 nhd for GNOME compliance */ +void GotoWorkSpaceByNumber(virtualScreen *vs, int workspacenum) +{ + WorkSpace *ws; + if(! Scr->workSpaceManagerActive) return; + if (!vs) return; + for (ws = Scr->workSpaceMgr.workSpaceList; ws != NULL; ws = ws->next) { + if (ws->number == workspacenum) break; + } + if (ws == NULL) return; + GotoWorkSpace (vs, ws); +} + /* */ + +void GotoPrevWorkSpace (virtualScreen *vs) +{ + WorkSpace *ws1, *ws2; + + if (! Scr->workSpaceManagerActive) return; + if (!vs) return; + ws1 = Scr->workSpaceMgr.workSpaceList; + if (ws1 == NULL) return; + ws2 = ws1->next; + + while ((ws2 != vs->wsw->currentwspc) && (ws2 != NULL)) { + ws1 = ws2; + ws2 = ws2->next; + } + GotoWorkSpace (vs, ws1); +} + +void GotoNextWorkSpace (virtualScreen *vs) +{ + WorkSpace *ws; + if (! Scr->workSpaceManagerActive) return; + if (!vs) return; + + ws = vs->wsw->currentwspc; + ws = (ws->next != NULL) ? ws->next : Scr->workSpaceMgr.workSpaceList; + GotoWorkSpace (vs, ws); +} + +void GotoRightWorkSpace (virtualScreen *vs) +{ + WorkSpace *ws; + int number, columns, count; + + if (!Scr->workSpaceManagerActive) + return; + if (!vs) + return; + + ws = vs->wsw->currentwspc; + number = ws->number; + columns = Scr->workSpaceMgr.columns; + count = Scr->workSpaceMgr.count; + number++; + if ((number % columns) == 0) + number -= columns; + else if (number >= count) + number = (number / columns) * columns; + + GotoWorkSpaceByNumber(vs, number); +} + +void GotoLeftWorkSpace (virtualScreen *vs) +{ + WorkSpace *ws; + int number, columns, count; + + if (!Scr->workSpaceManagerActive) + return; + if (!vs) + return; + + ws = vs->wsw->currentwspc; + number = ws->number; + columns = Scr->workSpaceMgr.columns; + count = Scr->workSpaceMgr.count; + number += (number % columns) ? -1 : (columns - 1); + if (number >= count) + number = count - 1; + GotoWorkSpaceByNumber(vs, number); +} + +void GotoUpWorkSpace (virtualScreen *vs) +{ + WorkSpace *ws; + int number, lines, columns, count; + + if (!Scr->workSpaceManagerActive) + return; + if (!vs) + return; + + ws = vs->wsw->currentwspc; + number = ws->number; + lines = Scr->workSpaceMgr.lines; + columns = Scr->workSpaceMgr.columns; + count = Scr->workSpaceMgr.count; + number -= columns; + if (number < 0) { + number += lines * columns; + /* If the number of workspaces is not a multiple of nr of columns */ + if (number >= count) + number -= columns; + } + GotoWorkSpaceByNumber(vs, number); +} + +void GotoDownWorkSpace (virtualScreen *vs) +{ + WorkSpace *ws; + int number, columns, count; + + if (!Scr->workSpaceManagerActive) + return; + if (!vs) + return; + + ws = vs->wsw->currentwspc; + number = ws->number; + columns = Scr->workSpaceMgr.columns; + count = Scr->workSpaceMgr.count; + number += columns; + if (number >= count) { + number %= columns; + } + GotoWorkSpaceByNumber(vs, number); +} + +void ShowBackground (virtualScreen *vs) +{ + static int state = 0; + TwmWindow *twmWin; + + if (state) { + for (twmWin = Scr->FirstWindow; twmWin != NULL; twmWin = twmWin->next) { + if (twmWin->savevs == vs) { + DisplayWin (vs, twmWin); + } + twmWin->savevs = NULL; + } + state = 0; + } else { + for (twmWin = Scr->FirstWindow; twmWin != NULL; twmWin = twmWin->next) { + if (twmWin->vs == vs) { + twmWin->savevs = twmWin->vs; + Vanish (vs, twmWin); + } + } + state = 1; + } +} + +void GotoWorkSpace (virtualScreen *vs, WorkSpace *ws) +{ + TwmWindow *twmWin; + WorkSpace *oldws, *newws; + WList *wl, *wl1; + WinList winl; + XSetWindowAttributes attr; + XWindowAttributes winattrs; + unsigned long eventMask; + IconMgr *iconmgr; + Window oldw; + Window neww; + TwmWindow *focuswindow; + TwmWindow *last_twmWin = NULL; + virtualScreen *tmpvs; + + if (! Scr->workSpaceManagerActive) return; + for (tmpvs = Scr->vScreenList; tmpvs != NULL; tmpvs = tmpvs->next) { + if (ws == tmpvs->wsw->currentwspc) { + XBell (dpy, 0); + return; + } + } + oldws = vs->wsw->currentwspc; + newws = ws; + if (oldws == newws) return; + + attr.backing_store = NotUseful; + attr.save_under = False; + + if (useBackgroundInfo && ! Scr->DontPaintRootWindow) { + if (newws->image == None) + XSetWindowBackground (dpy, vs->window, newws->backcp.back); + else + XSetWindowBackgroundPixmap (dpy, vs->window, newws->image->pixmap); + XClearWindow (dpy, vs->window); + } + + /* If SaveWorkspaceFocus is on, save the focus of the last window. */ + if ( Scr->SaveWorkspaceFocus ) { + oldws->save_focus = Scr->Focus; + } + + focuswindow = (TwmWindow *)NULL; + for (twmWin = Scr->FirstWindow; twmWin != NULL; twmWin = twmWin->next) { + if (twmWin->vs == vs) { + if (!OCCUPY (twmWin, newws)) { + virtualScreen *tvs; + Vanish (vs, twmWin); + for (tvs = Scr->vScreenList; tvs != NULL; tvs = tvs->next) { + if (tvs == vs) continue; + if (OCCUPY (twmWin, tvs->wsw->currentwspc)) { + DisplayWin (tvs, twmWin); + break; + } + } + } else if (twmWin->hasfocusvisible) { + focuswindow = twmWin; + SetFocusVisualAttributes (focuswindow, False); + } + } + } + /* Move to the end of the twmWin list */ + for (twmWin = Scr->FirstWindow; twmWin != NULL; twmWin = twmWin->next) { + last_twmWin = twmWin; + } + /* Iconise in reverse order */ + for (twmWin = last_twmWin; twmWin != NULL; twmWin = twmWin->prev) { + if (OCCUPY (twmWin, newws) && !twmWin->vs) DisplayWin (vs, twmWin); + } +/* + Reorganize icon manager window lists +*/ + for (twmWin = Scr->FirstWindow; twmWin != NULL; twmWin = twmWin->next) { + wl = twmWin->iconmanagerlist; + if (wl == NULL) continue; + if (OCCUPY (wl->iconmgr->twm_win, newws)) continue; + wl1 = wl; + wl = wl->nextv; + while (wl != NULL) { + if (OCCUPY (wl->iconmgr->twm_win, newws)) break; + wl1 = wl; + wl = wl->nextv; + } + if (wl != NULL) { + wl1->nextv = wl->nextv; + wl->nextv = twmWin->iconmanagerlist; + twmWin->iconmanagerlist = wl; + } + } + wl = (WList*)0; + for (iconmgr = newws->iconmgr; iconmgr; iconmgr = iconmgr->next) { + if (iconmgr->first) { + wl = iconmgr->first; + break; + } + } + CurrentIconManagerEntry (wl); + if (focuswindow) { + SetFocusVisualAttributes (focuswindow, True); + } + vs->wsw->currentwspc = newws; + if (Scr->ReverseCurrentWorkspace && vs->wsw->state == MAPSTATE) { + MapSubwindow *msw = vs->wsw->mswl [oldws->number]; + for (winl = msw->wl; winl != NULL; winl = winl->next) { + WMapRedrawName (vs, winl); + } + msw = vs->wsw->mswl [newws->number]; + for (winl = msw->wl; winl != NULL; winl = winl->next) { + WMapRedrawName (vs, winl); + } + } else + if (vs->wsw->state == BUTTONSSTATE) { + ButtonSubwindow *bsw = vs->wsw->bswl [oldws->number]; + PaintButton (WSPCWINDOW, vs, bsw->w, oldws->label, oldws->cp, off); + bsw = vs->wsw->bswl [newws->number]; + PaintButton (WSPCWINDOW, vs, bsw->w, newws->label, newws->cp, on); + } + oldws->iconmgr = Scr->iconmgr; + Scr->iconmgr = newws->iconmgr; + + oldw = vs->wsw->mswl [oldws->number]->w; + neww = vs->wsw->mswl [newws->number]->w; + if (useBackgroundInfo) { + if (oldws->image == None || Scr->NoImagesInWorkSpaceManager) + XSetWindowBackground (dpy, oldw, oldws->backcp.back); + else + XSetWindowBackgroundPixmap (dpy, oldw, oldws->image->pixmap); + } + else { + if (Scr->workSpaceMgr.defImage == None || Scr->NoImagesInWorkSpaceManager) + XSetWindowBackground (dpy, oldw, Scr->workSpaceMgr.defColors.back); + else + XSetWindowBackgroundPixmap (dpy, oldw, Scr->workSpaceMgr.defImage->pixmap); + } + attr.border_pixel = Scr->workSpaceMgr.defBorderColor; + XChangeWindowAttributes (dpy, oldw, CWBorderPixel, &attr); + + if (Scr->workSpaceMgr.curImage == None) { + if (Scr->workSpaceMgr.curPaint) XSetWindowBackground (dpy, neww, Scr->workSpaceMgr.curColors.back); + } + else { + XSetWindowBackgroundPixmap (dpy, neww, Scr->workSpaceMgr.curImage->pixmap); + } + attr.border_pixel = Scr->workSpaceMgr.curBorderColor; + XChangeWindowAttributes (dpy, neww, CWBorderPixel, &attr); + + XClearWindow (dpy, oldw); + XClearWindow (dpy, neww); + + XGetWindowAttributes(dpy, Scr->Root, &winattrs); + eventMask = winattrs.your_event_mask; + XSelectInput(dpy, Scr->Root, eventMask & ~PropertyChangeMask); + + XChangeProperty (dpy, Scr->Root, _XA_WM_CURRENTWORKSPACE, XA_STRING, 8, + PropModeReplace, (unsigned char *) newws->name, strlen (newws->name)); +#ifdef GNOME +/* nhd 6/19/1999 for GNOME compliance + * Publish which workspace the root window shows/contains. + * Olaf Rhialto Seibert: However, don't do it when the root window is + * captive, since it will be moved itself: for non-root windows this + * property is used to indicate in which workspace it is contained. + */ + + if (!Scr->CaptiveRoot) + XChangeProperty (dpy, Scr->Root, _XA_WIN_WORKSPACE, XA_CARDINAL, 32, + PropModeReplace, (unsigned char *) &(newws->number), 1); +#endif /* GNOME */ + XSelectInput(dpy, Scr->Root, eventMask); + + /* XDestroyWindow (dpy, cachew);*/ + if (Scr->ChangeWorkspaceFunction.func != 0) { + char *action; + XEvent event; + + action = Scr->ChangeWorkspaceFunction.item ? + Scr->ChangeWorkspaceFunction.item->action : NULL; + ExecuteFunction (Scr->ChangeWorkspaceFunction.func, action, + (Window) 0, (TwmWindow*) 0, &event, C_ROOT, FALSE); + } + + /* If SaveWorkspaceFocus is on, try to restore the focus to the last + window which was focused when we left this workspace. */ + if (Scr->SaveWorkspaceFocus && newws->save_focus) { + twmWin = newws->save_focus; + if (OCCUPY(twmWin, newws)) { /* check should not even be needed anymore */ + WarpToWindow(twmWin, 0); + } else { + newws->save_focus = NULL; + } + } + + /* keep track of the order of the workspaces across restarts */ + CtwmSetVScreenMap(dpy, Scr->Root, Scr->vScreenList); + + XSync (dpy, 0); + if (Scr->ClickToFocus || Scr->SloppyFocus) set_last_window (newws); + MaybeAnimate = True; +} + +char *GetCurrentWorkSpaceName (virtualScreen *vs) +{ + if (! Scr->workSpaceManagerActive) return (NULL); + if (!vs) vs = Scr->vScreenList; + return vs->wsw->currentwspc->name; +} + +void AddWorkSpace (char *name, char *background, char *foreground, + char *backback, char *backfore, char *backpix) +{ + WorkSpace *ws; + int wsnum; + Image *image; + + wsnum = Scr->workSpaceMgr.count; + if (wsnum == MAXWORKSPACE) return; + + fullOccupation |= (1 << wsnum); + ws = (WorkSpace*) malloc (sizeof (WorkSpace)); + ws->FirstWindowRegion = NULL; +#if 0 /* def VMS */ + { + char *ftemp; + ftemp = (char *) malloc((strlen(name)+1)*sizeof(char)); + ws->name = strcpy (ftemp,name); + ftemp = (char *) malloc((strlen(name)+1)*sizeof(char)); + ws->label = strcpy (ftemp,name); + } +#else + ws->name = (char*) strdup (name); + ws->label = (char*) strdup (name); +#endif + ws->clientlist = NULL; + ws->save_focus = NULL; + + if (background == NULL) + ws->cp.back = Scr->IconManagerC.back; + else + GetColor (Scr->Monochrome, &(ws->cp.back), background); + + if (foreground == NULL) + ws->cp.fore = Scr->IconManagerC.fore; + else + GetColor (Scr->Monochrome, &(ws->cp.fore), foreground); + +#ifdef COLOR_BLIND_USER + ws->cp.shadc = Scr->White; + ws->cp.shadd = Scr->Black; +#else + if (!Scr->BeNiceToColormap) GetShadeColors (&ws->cp); +#endif + + if (backback == NULL) + GetColor (Scr->Monochrome, &(ws->backcp.back), "Black"); + else { + GetColor (Scr->Monochrome, &(ws->backcp.back), backback); + useBackgroundInfo = True; + } + + if (backfore == NULL) + GetColor (Scr->Monochrome, &(ws->backcp.fore), "White"); + else { + GetColor (Scr->Monochrome, &(ws->backcp.fore), backfore); + useBackgroundInfo = True; + } + if ((image = GetImage (backpix, ws->backcp)) != None) { + ws->image = image; + useBackgroundInfo = True; + } + else { + ws->image = None; + } + ws->next = NULL; + ws->number = wsnum; + Scr->workSpaceMgr.count++; + + if (Scr->workSpaceMgr.workSpaceList == NULL) { + Scr->workSpaceMgr.workSpaceList = ws; + } + else { + WorkSpace *wstmp = Scr->workSpaceMgr.workSpaceList; + while (wstmp->next != NULL) { wstmp = wstmp->next; } + wstmp->next = ws; + } + Scr->workSpaceManagerActive = 1; +} + +static XrmOptionDescRec table [] = { + {"-xrm", NULL, XrmoptionResArg, (XPointer) NULL}, +}; + +void SetupOccupation (TwmWindow *twm_win, + int occupation_hint) /* <== [ Matthew McNeill Feb 1997 ] == */ +{ + TwmWindow *t; + unsigned char *prop; + unsigned long nitems, bytesafter; + Atom actual_type; + int actual_format; + int state; + Window icon; + char **cliargv = NULL; + int cliargc; + Bool status; + char *str_type; + XrmValue value; + char wrkSpcList [512]; + int len; + WorkSpace *ws; + XWindowAttributes winattrs; + unsigned long eventMask; + XrmDatabase db = NULL; + virtualScreen *vs; + long gwkspc = 0; /* for GNOME - which workspace we occupy */ + + if (! Scr->workSpaceManagerActive) { + twm_win->occupation = 1 << 0; /* occupy workspace #0 */ + /* + * Choose some valid virtual screen. + * InitVirtualScreens() always seems to set this to non-NULL. + */ + twm_win->vs = Scr->vScreenList; /* only one virtual screen */ + /* more?... */ + + return; + } + if (twm_win->wspmgr) return; + + /*twm_win->occupation = twm_win->iswinbox ? fullOccupation : 0;*/ + twm_win->occupation = 0; + + for (ws = Scr->workSpaceMgr.workSpaceList; ws != NULL; ws = ws->next) { + if (LookInList (ws->clientlist, twm_win->full_name, &twm_win->class)) { + twm_win->occupation |= 1 << ws->number; + } + } + + if (LookInList (Scr->OccupyAll, twm_win->full_name, &twm_win->class)) { + twm_win->occupation = fullOccupation; + } + + if (XGetCommand (dpy, twm_win->w, &cliargv, &cliargc)) { + XrmParseCommand (&db, table, 1, "ctwm", &cliargc, cliargv); + status = XrmGetResource (db, "ctwm.workspace", "Ctwm.Workspace", &str_type, &value); + if ((status == True) && (value.size != 0)) { + strncpy (wrkSpcList, value.addr, value.size); + twm_win->occupation = GetMaskFromResource (twm_win, wrkSpcList); + } + XrmDestroyDatabase (db); + XFreeStringList (cliargv); + } + + if (RestartPreviousState) { + if (XGetWindowProperty (dpy, twm_win->w, _XA_WM_OCCUPATION, 0L, 2500, False, + XA_STRING, &actual_type, &actual_format, &nitems, + &bytesafter, &prop) == Success) { + if (nitems != 0) { + twm_win->occupation = GetMaskFromProperty (prop, nitems); + XFree ((char *) prop); + } + } + } + + if (twm_win->iconmgr) return; /* someone tried to modify occupation of icon managers */ + + if (! Scr->TransientHasOccupation) { + if (twm_win->transient) { + t = GetTwmWindow(twm_win->transientfor); + if (t != NULL) twm_win->occupation = t->occupation; + } + else + if (twm_win->group != 0) { + t = GetTwmWindow(twm_win->group); + if (t != NULL) twm_win->occupation = t->occupation; + } + } + + /*============[ Matthew McNeill Feb 1997 ]========================* + * added in functionality of specific occupation state. The value + * should be a valid occupation bit-field or 0 for the default action + */ + + if (occupation_hint != 0) + twm_win->occupation = occupation_hint; + + /*================================================================*/ + + if ((twm_win->occupation & fullOccupation) == 0) { + vs = Scr->currentvs; + if (vs && vs->wsw->currentwspc) + twm_win->occupation = 1 << vs->wsw->currentwspc->number; + else { + twm_win->occupation = 1; + } + } + twm_win->vs = NULL; + for (vs = Scr->vScreenList; vs != NULL; vs = vs->next) { + if (OCCUPY (twm_win, vs->wsw->currentwspc)) { + twm_win->vs = vs; + break; + } + } + + len = GetPropertyFromMask (twm_win->occupation, wrkSpcList, &gwkspc); + + if (!XGetWindowAttributes(dpy, twm_win->w, &winattrs)) return; + eventMask = winattrs.your_event_mask; + XSelectInput(dpy, twm_win->w, eventMask & ~PropertyChangeMask); + + XChangeProperty (dpy, twm_win->w, _XA_WM_OCCUPATION, XA_STRING, 8, + PropModeReplace, (unsigned char *) wrkSpcList, len); +#ifdef GNOME + XChangeProperty (dpy, twm_win->w, _XA_WIN_WORKSPACE, XA_CARDINAL, 32, + PropModeReplace, (unsigned char *)(&gwkspc), 1); + if (XGetWindowProperty (dpy, twm_win->w, _XA_WIN_STATE, 0L, 32, False, + XA_CARDINAL, &actual_type, &actual_format, &nitems, + &bytesafter, &prop) + != Success || nitems == 0) { + gwkspc = 0; + } else { + gwkspc = (int)*prop; + XFree ((char *)prop); + } + if (twm_win->occupation == fullOccupation) + gwkspc |= WIN_STATE_STICKY; + else + gwkspc &= ~WIN_STATE_STICKY; + XChangeProperty (dpy, twm_win->w, _XA_WIN_STATE, XA_CARDINAL, 32, + PropModeReplace, (unsigned char *)&gwkspc, 1); +#endif /* GNOME */ + XSelectInput (dpy, twm_win->w, eventMask); + +/* kludge */ + state = NormalState; + if (!(RestartPreviousState && GetWMState (twm_win->w, &state, &icon) && + (state == NormalState || state == IconicState || state == InactiveState))) { + if (twm_win->wmhints && (twm_win->wmhints->flags & StateHint)) + state = twm_win->wmhints->initial_state; + } + if (visible (twm_win)) { + if (state == InactiveState) SetMapStateProp (twm_win, NormalState); + } else { + if (state == NormalState) SetMapStateProp (twm_win, InactiveState); + } +} + +void safecopy(char *dest, char *src, int size) +{ + strncpy(dest, src, size - 1); + dest[size - 1] = '\0'; +} + +Bool RedirectToCaptive (Window window) +{ + unsigned long nitems, bytesafter; + Atom actual_type; + int actual_format; + char **cliargv = NULL; + int cliargc; + Bool status; + char *str_type; + XrmValue value; + int ret; + Atom _XA_WM_CTWM_ROOT; + char *atomname; + Window newroot; + XWindowAttributes wa; + XrmDatabase db = NULL; + + if (DontRedirect (window)) return (False); + if (!XGetCommand (dpy, window, &cliargv, &cliargc)) return (False); + XrmParseCommand (&db, table, 1, "ctwm", &cliargc, cliargv); + if (db == NULL) { + if (cliargv) XFreeStringList (cliargv); + return False; + } + ret = False; + status = XrmGetResource (db, "ctwm.redirect", "Ctwm.Redirect", &str_type, &value); + if ((status == True) && (value.size != 0)) { + char cctwm [64]; + Window *prop; + + safecopy (cctwm, value.addr, sizeof(cctwm)); + atomname = (char*) malloc (strlen ("WM_CTWM_ROOT_") + strlen (cctwm) + 1); + sprintf (atomname, "WM_CTWM_ROOT_%s", cctwm); + _XA_WM_CTWM_ROOT = XInternAtom (dpy, atomname, False); + + if (XGetWindowProperty (dpy, Scr->Root, _XA_WM_CTWM_ROOT, + 0L, 1L, False, AnyPropertyType, &actual_type, &actual_format, + &nitems, &bytesafter, (unsigned char **)&prop) == Success) { + if (actual_type == XA_WINDOW && actual_format == 32 && + nitems == 1 /*&& bytesafter == 0*/) { + newroot = *prop; + if (XGetWindowAttributes (dpy, newroot, &wa)) { + XReparentWindow (dpy, window, newroot, 0, 0); + XMapWindow (dpy, window); + ret = True; + } + } + XFree ((char *)prop); + } + } + status = XrmGetResource (db, "ctwm.rootWindow", "Ctwm.RootWindow", &str_type, &value); + if ((status == True) && (value.size != 0)) { + char rootw [32]; + unsigned int scanned; + + safecopy (rootw, value.addr, sizeof(rootw)); + if (sscanf (rootw, "%x", &scanned) == 1) { + newroot = scanned; + if (XGetWindowAttributes (dpy, newroot, &wa)) { + XReparentWindow (dpy, window, newroot, 0, 0); + XMapWindow (dpy, window); + ret = True; + } + } + } + XrmDestroyDatabase (db); + XFreeStringList (cliargv); + return (ret); +} + +/* + * The window whose occupation is being manipulated. + */ +static TwmWindow *occupyWin = (TwmWindow*) 0; + +static int CanChangeOccupation(TwmWindow **twm_winp) +{ + TwmWindow *twm_win; + + if (!Scr->workSpaceManagerActive) + return 0; + if (occupyWin != NULL) + return 0; + twm_win = *twm_winp; + if (twm_win->iconmgr) + return 0; + if (!Scr->TransientHasOccupation) { + if (twm_win->transient) + return 0; + if (twm_win->group != (Window) 0 && twm_win->group != twm_win->w) { + /* + * When trying to modify a group member window, + * operate on the group leader instead + * (and thereby on all group member windows as well). + * If we can't find the group leader, pretend it isn't set. + */ + twm_win = GetTwmWindow(twm_win->group); + if (!twm_win) + return 1; + *twm_winp = twm_win; + } + } + return 1; +} + +void Occupy (TwmWindow *twm_win) +{ + int x, y, junkX, junkY; + unsigned int junkB, junkD; + unsigned int width, height; + int xoffset, yoffset; + Window junkW, w; + unsigned int junkK; + struct OccupyWindow *occupyWindow; + + if (!CanChangeOccupation(&twm_win)) + return; + + occupyWindow = Scr->workSpaceMgr.occupyWindow; + occupyWindow->tmpOccupation = twm_win->occupation; + w = occupyWindow->w; + XGetGeometry (dpy, w, &junkW, &junkX, &junkY, &width, &height, &junkB, &junkD); + XQueryPointer (dpy, Scr->Root, &junkW, &junkW, &junkX, &junkY, &x, &y, &junkK); + x -= (width / 2); + y -= (height / 2); + if (x < 0) x = 0; + if (y < 0) y = 0; + xoffset = width + 2 * Scr->BorderWidth; + yoffset = height + 2 * Scr->BorderWidth + Scr->TitleHeight; + if ((x + xoffset) > Scr->rootw) x = Scr->rootw - xoffset; + if ((y + yoffset) > Scr->rooth) y = Scr->rooth - yoffset; + + occupyWindow->twm_win->occupation = twm_win->occupation; + if (occupyWindow->twm_win->vs != Scr->currentvs) { + XReparentWindow(dpy, occupyWindow->twm_win->frame, Scr->Root, x, y); + occupyWindow->twm_win->vs = Scr->currentvs; + } else + XMoveWindow(dpy, occupyWindow->twm_win->frame, x, y); + + SetMapStateProp (occupyWindow->twm_win, NormalState); + XMapWindow (dpy, occupyWindow->w); + XMapRaised (dpy, occupyWindow->twm_win->frame); + occupyWindow->twm_win->mapped = TRUE; + occupyWin = twm_win; +} + +void OccupyHandleButtonEvent (XEvent *event) +{ + WorkSpace *ws; + OccupyWindow *occupyW; + Window buttonW; + + if (! Scr->workSpaceManagerActive) return; + if (occupyWin == (TwmWindow*) 0) return; + + buttonW = event->xbutton.window; + if (buttonW == 0) return; /* icon */ + + XGrabPointer (dpy, Scr->Root, True, + ButtonPressMask | ButtonReleaseMask, + GrabModeAsync, GrabModeAsync, + Scr->Root, None, CurrentTime); + + occupyW = Scr->workSpaceMgr.occupyWindow; + for (ws = Scr->workSpaceMgr.workSpaceList; ws != NULL; ws = ws->next) { + if (occupyW->obuttonw [ws->number] == buttonW) break; + } + if (ws != NULL) { + int mask = 1 << ws->number; + if ((occupyW->tmpOccupation & mask) == 0) { + PaintButton (OCCUPYWINDOW, NULL, occupyW->obuttonw [ws->number], + ws->label, ws->cp, on); + } else { + PaintButton (OCCUPYWINDOW, NULL, occupyW->obuttonw [ws->number], + ws->label, ws->cp, off); + } + occupyW->tmpOccupation ^= mask; + } + else + if (buttonW == occupyW->OK) { + if (occupyW->tmpOccupation == 0) return; + ChangeOccupation (occupyWin, occupyW->tmpOccupation); + XUnmapWindow (dpy, occupyW->twm_win->frame); + occupyW->twm_win->mapped = FALSE; + occupyW->twm_win->occupation = 0; + occupyWin = (TwmWindow*) 0; + XSync (dpy, 0); + } + else + if (buttonW == occupyW->cancel) { + XUnmapWindow (dpy, occupyW->twm_win->frame); + occupyW->twm_win->mapped = FALSE; + occupyW->twm_win->occupation = 0; + occupyWin = (TwmWindow*) 0; + XSync (dpy, 0); + } + else + if (buttonW == occupyW->allworkspc) { + for (ws = Scr->workSpaceMgr.workSpaceList; ws != NULL; ws = ws->next) { + PaintButton (OCCUPYWINDOW, NULL, occupyW->obuttonw [ws->number], + ws->label, ws->cp, on); + } + occupyW->tmpOccupation = fullOccupation; + } + if (ButtonPressed == -1) XUngrabPointer (dpy, CurrentTime); +} + +void OccupyAll (TwmWindow *twm_win) +{ + IconMgr *save; + + if (!CanChangeOccupation(&twm_win)) + return; + save = Scr->iconmgr; + Scr->iconmgr = Scr->workSpaceMgr.workSpaceList->iconmgr; + ChangeOccupation (twm_win, fullOccupation); + Scr->iconmgr = save; +} + +void AddToWorkSpace (char *wname, TwmWindow *twm_win) +{ + WorkSpace *ws; + int newoccupation; + + if (!CanChangeOccupation(&twm_win)) + return; + ws = GetWorkspace (wname); + if (!ws) + return; + + if (twm_win->occupation & (1 << ws->number)) + return; + newoccupation = twm_win->occupation | (1 << ws->number); + ChangeOccupation (twm_win, newoccupation); +} + +void RemoveFromWorkSpace (char *wname, TwmWindow *twm_win) +{ + WorkSpace *ws; + int newoccupation; + + if (!CanChangeOccupation(&twm_win)) + return; + ws = GetWorkspace (wname); + if (!ws) + return; + + newoccupation = twm_win->occupation & ~(1 << ws->number); + if (!newoccupation) return; + ChangeOccupation (twm_win, newoccupation); +} + +void ToggleOccupation (char *wname, TwmWindow *twm_win) +{ + WorkSpace *ws; + int newoccupation; + + if (!CanChangeOccupation(&twm_win)) + return; + ws = GetWorkspace (wname); + if (!ws) return; + + newoccupation = twm_win->occupation ^ (1 << ws->number); + if (!newoccupation) return; + ChangeOccupation (twm_win, newoccupation); +} + +void MoveToNextWorkSpace (virtualScreen *vs, TwmWindow *twm_win) +{ + WorkSpace *wlist1, *wlist2; + int newoccupation; + + if (!CanChangeOccupation(&twm_win)) + return; + + wlist1 = vs->wsw->currentwspc; + wlist2 = wlist1->next; + wlist2 = wlist2 ? wlist2 : Scr->workSpaceMgr.workSpaceList; + + newoccupation = (twm_win->occupation ^ (1 << wlist1->number)) + | (1 << wlist2->number); + ChangeOccupation (twm_win, newoccupation); +} + + +void MoveToNextWorkSpaceAndFollow (virtualScreen *vs, TwmWindow *twm_win) +{ + if (!CanChangeOccupation(&twm_win)) + return; + + MoveToNextWorkSpace(vs, twm_win); + GotoNextWorkSpace(vs); +#if 0 + RaiseWindow(twm_win); /* XXX really do this? */ +#endif +} + + +void MoveToPrevWorkSpace (virtualScreen *vs, TwmWindow *twm_win) +{ + WorkSpace *wlist1, *wlist2; + int newoccupation; + + if (!CanChangeOccupation(&twm_win)) + return; + + wlist1 = Scr->workSpaceMgr.workSpaceList; + wlist2 = vs->wsw->currentwspc; + if (wlist1 == NULL) return; + + while (wlist1->next != wlist2 && wlist1->next != NULL) { + wlist1 = wlist1->next; + } + + newoccupation = (twm_win->occupation ^ (1 << wlist2->number)) + | (1 << wlist1->number); + ChangeOccupation (twm_win, newoccupation); +} + +void MoveToPrevWorkSpaceAndFollow (virtualScreen *vs, TwmWindow *twm_win) +{ + if (!CanChangeOccupation(&twm_win)) + return; + + MoveToPrevWorkSpace(vs, twm_win); + GotoPrevWorkSpace(vs); +#if 0 + RaiseWindow(twm_win); /* XXX really do this? */ +#endif +} + +static WorkSpace *GetWorkspace (char *wname) +{ + WorkSpace *ws; + + if (!wname) return (NULL); + for (ws = Scr->workSpaceMgr.workSpaceList; ws != NULL; ws = ws->next) { + if (strcmp (ws->label, wname) == 0) break; + } + if (ws == NULL) { + for (ws = Scr->workSpaceMgr.workSpaceList; ws != NULL; ws = ws->next) { + if (strcmp (ws->name, wname) == 0) break; + } + } + return (ws); +} + +void AllocateOthersIconManagers (void) +{ + IconMgr *p = NULL, *ip, *oldp, *oldv; + WorkSpace *ws; + + if (! Scr->workSpaceManagerActive) return; + + oldp = Scr->iconmgr; + for (ws = Scr->workSpaceMgr.workSpaceList->next; ws != NULL; ws = ws->next) { + ws->iconmgr = (IconMgr *) malloc (sizeof (IconMgr)); + *ws->iconmgr = *oldp; + oldv = ws->iconmgr; + oldp->nextv = ws->iconmgr; + oldv->nextv = NULL; + + for (ip = oldp->next; ip != NULL; ip = ip->next) { + p = (IconMgr *) malloc (sizeof (IconMgr)); + *p = *ip; + ip->nextv = p; + p->next = NULL; + p->prev = oldv; + p->nextv = NULL; + oldv->next = p; + oldv = p; + } + for (ip = ws->iconmgr; ip != NULL; ip = ip->next) { + ip->lasti = p; + } + oldp = ws->iconmgr; + } + Scr->workSpaceMgr.workSpaceList->iconmgr = Scr->iconmgr; +} + +static void Vanish (virtualScreen *vs, TwmWindow *tmp_win) +{ + XWindowAttributes winattrs; + unsigned long eventMask; + + if (vs && tmp_win->vs && tmp_win->vs != vs) + return; + if (tmp_win->UnmapByMovingFarAway) { + XMoveWindow (dpy, tmp_win->frame, Scr->rootw + 1, Scr->rooth + 1); + } else if (tmp_win->mapped) { + XGetWindowAttributes(dpy, tmp_win->w, &winattrs); + eventMask = winattrs.your_event_mask; + XSelectInput (dpy, tmp_win->w, eventMask & ~StructureNotifyMask); + XUnmapWindow (dpy, tmp_win->w); + XUnmapWindow (dpy, tmp_win->frame); + XSelectInput (dpy, tmp_win->w, eventMask); + + if (!tmp_win->DontSetInactive) + SetMapStateProp (tmp_win, InactiveState); + } else if (tmp_win->icon_on && tmp_win->icon && tmp_win->icon->w) { + XUnmapWindow (dpy, tmp_win->icon->w); + IconDown (tmp_win); + } + + /* + * XXX - this may need to be tweaked to find the real window at 0x0. + * Most people will setup virtualscreens left to right, but some + * may not. The purpose of this is in the event of a ctwm death/restart, + * geometries of windows that were on unmapped workspaces will show + * up where they belong. + * XXX - XReparentWindow() messes up the stacking order of windows. + * It should be avoided as much as possible. This already affects + * switching away from and back to a workspace. Therefore do this only + * if there are at least 2 virtual screens AND the new one (firstvs) + * differs from where the window currently is. (Olaf Seibert). + */ + + if (Scr->vScreenList && Scr->vScreenList->next) { + int x, y; + unsigned int junk; + Window junkW, w = tmp_win->frame; + virtualScreen *firstvs = NULL; + + for (firstvs = Scr->vScreenList; firstvs; firstvs = firstvs->next) + if (firstvs->x == 0 && firstvs->y == 0) + break; + if (firstvs && firstvs != vs) { + XGetGeometry (dpy, w, &junkW, &x, &y, &junk, &junk, &junk, &junk); + XReparentWindow(dpy, w, firstvs->window, x, y); + tmp_win->vs = firstvs; + } + } + + tmp_win->old_parent_vs = tmp_win->vs; + tmp_win->vs = NULL; +} + +static void DisplayWin (virtualScreen *vs, TwmWindow *tmp_win) +{ + XWindowAttributes winattrs; + unsigned long eventMask; + + /* + * A window cannot be shown in multiple virtual screens, even if + * it occupies both corresponding workspaces. + */ + if (vs && tmp_win->vs) + return; + tmp_win->vs = vs; + + if (!tmp_win->mapped) { + if (tmp_win->isicon) { + if (tmp_win->icon_on) { + if (tmp_win->icon && tmp_win->icon->w) { + if (vs != tmp_win->old_parent_vs) { + int x, y; + unsigned int junk; + Window junkW, w = tmp_win->icon->w; + XGetGeometry (dpy, w, &junkW, &x, &y, &junk, &junk, &junk, &junk); + XReparentWindow (dpy, w, vs->window, x, y); + } + + IconUp (tmp_win); + XMapWindow (dpy, tmp_win->icon->w); + return; + } + } + } + return; + } + if (tmp_win->UnmapByMovingFarAway) { + if (vs) /* XXX I don't believe the handling of UnmapByMovingFarAway is quite correct */ + XReparentWindow (dpy, tmp_win->frame, vs->window, + tmp_win->frame_x, tmp_win->frame_y); + else + XMoveWindow (dpy, tmp_win->frame, tmp_win->frame_x, tmp_win->frame_y); + } else { + if (!tmp_win->squeezed) { + XGetWindowAttributes(dpy, tmp_win->w, &winattrs); + eventMask = winattrs.your_event_mask; + XSelectInput (dpy, tmp_win->w, eventMask & ~StructureNotifyMask); + XMapWindow (dpy, tmp_win->w); + XSelectInput (dpy, tmp_win->w, eventMask); + } + if (vs != tmp_win->old_parent_vs) { + XReparentWindow (dpy, tmp_win->frame, vs->window, tmp_win->frame_x, tmp_win->frame_y); + } + XMapWindow (dpy, tmp_win->frame); + SetMapStateProp (tmp_win, NormalState); + } +} + +void ChangeOccupation (TwmWindow *tmp_win, int newoccupation) +{ + TwmWindow *t; + virtualScreen *vs; + WorkSpace *ws; + int oldoccupation; + char namelist [512]; + int len; + int final_x, final_y; + XWindowAttributes winattrs; + unsigned long eventMask; + long gwkspc = 0; /* for gnome - the workspace of this window */ + int changedoccupation; +#ifdef GNOME + unsigned char *prop; + unsigned long bytesafter, numitems; + Atom actual_type; + int actual_format; +#endif /* GNOME */ + + if ((newoccupation == 0) || /* in case the property has been broken by another client */ + (newoccupation == tmp_win->occupation)) { + len = GetPropertyFromMask (tmp_win->occupation, namelist, &gwkspc); + XGetWindowAttributes(dpy, tmp_win->w, &winattrs); + eventMask = winattrs.your_event_mask; + XSelectInput(dpy, tmp_win->w, eventMask & ~PropertyChangeMask); + + XChangeProperty (dpy, tmp_win->w, _XA_WM_OCCUPATION, XA_STRING, 8, + PropModeReplace, (unsigned char *) namelist, len); +#ifdef GNOME + XChangeProperty (dpy, tmp_win->w, _XA_WIN_WORKSPACE, XA_CARDINAL, 32, + PropModeReplace, (unsigned char *)(&gwkspc), 1); + if (XGetWindowProperty(dpy, tmp_win->w, _XA_WIN_STATE, 0L, 32, False, + XA_CARDINAL, &actual_type, &actual_format, &numitems, + &bytesafter, &prop) + != Success || numitems == 0) { + gwkspc = 0; + } else { + gwkspc = (int)*prop; + XFree((char *)prop); + } + if (tmp_win->occupation == fullOccupation) + gwkspc |= WIN_STATE_STICKY; + else + gwkspc &= ~WIN_STATE_STICKY; + XChangeProperty (dpy, tmp_win->w, _XA_WIN_STATE, XA_CARDINAL, 32, + PropModeReplace, (unsigned char *)&gwkspc, 1); +#endif /* GNOME */ + XSelectInput (dpy, tmp_win->w, eventMask); + return; + } + oldoccupation = tmp_win->occupation; + tmp_win->occupation = newoccupation & ~oldoccupation; + AddIconManager (tmp_win); + tmp_win->occupation = newoccupation; + RemoveIconManager (tmp_win); + + if (tmp_win->vs && !OCCUPY (tmp_win, tmp_win->vs->wsw->currentwspc)) { + Vanish (tmp_win->vs, tmp_win); + } + /* + * If a window occupies multiple workspaces, try to find another workspace + * which is currently in another virtual screen, so that the window + * can be shown there now. + */ + if (!tmp_win->vs) { + for (vs = Scr->vScreenList; vs != NULL; vs = vs->next) { + if (OCCUPY (tmp_win, vs->wsw->currentwspc)) { + DisplayWin (vs, tmp_win); + break; + } + } + } + for (ws = Scr->workSpaceMgr.workSpaceList; ws != NULL; ws = ws->next) { + int mask = 1 << ws->number; + if (oldoccupation & mask) { + if (!(newoccupation & mask)) { + RemoveWindowFromRegion (tmp_win); + if (PlaceWindowInRegion (tmp_win, &final_x, &final_y)) + XMoveWindow (dpy, tmp_win->frame, final_x, final_y); + } + break; + } + } + len = GetPropertyFromMask (newoccupation, namelist, &gwkspc); + XGetWindowAttributes(dpy, tmp_win->w, &winattrs); + eventMask = winattrs.your_event_mask; + XSelectInput(dpy, tmp_win->w, eventMask & ~PropertyChangeMask); + + XChangeProperty (dpy, tmp_win->w, _XA_WM_OCCUPATION, XA_STRING, 8, + PropModeReplace, (unsigned char *) namelist, len); + +#ifdef GNOME + /* Tell GNOME where this window lives */ + XChangeProperty (dpy, tmp_win->w, _XA_WIN_WORKSPACE, XA_CARDINAL, 32, + PropModeReplace, (unsigned char *)(&gwkspc), 1); + if (XGetWindowProperty (dpy, tmp_win->w, _XA_WIN_STATE, 0L, 32, False, + XA_CARDINAL, &actual_type, &actual_format, &numitems, + &bytesafter, &prop) + != Success || numitems == 0) { + gwkspc = 0; + } else { + gwkspc = (int)*prop; + XFree ((char *)prop); + } + if (tmp_win->occupation == fullOccupation) + gwkspc |= WIN_STATE_STICKY; + else + gwkspc &= ~WIN_STATE_STICKY; + XChangeProperty (dpy, tmp_win->w, _XA_WIN_STATE, XA_CARDINAL, 32, + PropModeReplace, (unsigned char *)&gwkspc, 1); +#endif /* GNOME */ + XSelectInput(dpy, tmp_win->w, eventMask); + + if (!WMapWindowMayBeAdded(tmp_win)) { + newoccupation = 0; + } + if (Scr->workSpaceMgr.noshowoccupyall) { + /* We can safely change new/oldoccupation here, it's only used + * for WMapAddToList()/WMapRemoveFromList() from here on. + */ + /* if (newoccupation == fullOccupation) + newoccupation = 0; */ + if (oldoccupation == fullOccupation) + oldoccupation = 0; + } + changedoccupation = oldoccupation ^ newoccupation; + for (ws = Scr->workSpaceMgr.workSpaceList; ws != NULL; ws = ws->next) { + int mask = 1 << ws->number; + if (changedoccupation & mask) { + if (newoccupation & mask) { + WMapAddToList (tmp_win, ws); + } else { + WMapRemoveFromList (tmp_win, ws); + if (Scr->SaveWorkspaceFocus && ws->save_focus == tmp_win) { + ws->save_focus = NULL; + } + } + } + } + + if (! Scr->TransientHasOccupation) { + for (t = Scr->FirstWindow; t != NULL; t = t->next) { + if (t != tmp_win && + ((t->transient && t->transientfor == tmp_win->w) || + t->group == tmp_win->w)) { + ChangeOccupation (t, tmp_win->occupation); + } + } + } +} + +void WmgrRedoOccupation (TwmWindow *win) +{ + WorkSpace *ws; + int newoccupation; + + if (LookInList (Scr->OccupyAll, win->full_name, &win->class)) { + newoccupation = fullOccupation; + } + else { + newoccupation = 0; + for (ws = Scr->workSpaceMgr.workSpaceList; ws != NULL; ws = ws->next) { + if (LookInList (ws->clientlist, win->full_name, &win->class)) { + newoccupation |= 1 << ws->number; + } + } + } + if (newoccupation != 0) ChangeOccupation (win, newoccupation); +} + +void WMgrRemoveFromCurrentWorkSpace (virtualScreen *vs, TwmWindow *win) +{ + WorkSpace *ws; + int newoccupation; + + ws = vs->wsw->currentwspc; + if (! OCCUPY (win, ws)) return; + + newoccupation = win->occupation & ~(1 << ws->number); + if (newoccupation == 0) return; + + ChangeOccupation (win, newoccupation); +} + +void WMgrAddToCurrentWorkSpaceAndWarp (virtualScreen *vs, char *winname) +{ + TwmWindow *tw; + int newoccupation; + + for (tw = Scr->FirstWindow; tw != NULL; tw = tw->next) { + if (match (winname, tw->full_name)) break; + } + if (!tw) { + for (tw = Scr->FirstWindow; tw != NULL; tw = tw->next) { + if (match (winname, tw->class.res_name)) break; + } + if (!tw) { + for (tw = Scr->FirstWindow; tw != NULL; tw = tw->next) { + if (match (winname, tw->class.res_class)) break; + } + } + } + if (!tw) { + XBell (dpy, 0); + return; + } + if ((! Scr->WarpUnmapped) && (! tw->mapped)) { + XBell (dpy, 0); + return; + } + if (! OCCUPY (tw, vs->wsw->currentwspc)) { + newoccupation = tw->occupation | (1 << vs->wsw->currentwspc->number); + ChangeOccupation (tw, newoccupation); + } + + if (! tw->mapped) DeIconify (tw); + WarpToWindow (tw, Scr->RaiseOnWarp); +} + +static void CreateWorkSpaceManagerWindow (virtualScreen *vs) +{ + int mask; + int lines, vspace, hspace, count, columns; + unsigned int width, height, bwidth, bheight; + char *name, *icon_name, *geometry; + int i, j; + ColorPair cp; + MyFont font; + WorkSpace *ws; + int x, y, strWid, wid; + unsigned long border; + TwmWindow *tmp_win; + XSetWindowAttributes attr; + XWindowAttributes wattr; + unsigned long attrmask; + XSizeHints sizehints; + XWMHints wmhints; + int gravity; + XRectangle inc_rect; + XRectangle logical_rect; + + name = Scr->workSpaceMgr.name; + icon_name = Scr->workSpaceMgr.icon_name; + geometry = Scr->workSpaceMgr.geometry; + columns = Scr->workSpaceMgr.columns; + vspace = Scr->workSpaceMgr.vspace; + hspace = Scr->workSpaceMgr.hspace; + font = Scr->workSpaceMgr.buttonFont; + cp = Scr->workSpaceMgr.cp; + border = Scr->workSpaceMgr.defBorderColor; + + count = 0; + for (ws = Scr->workSpaceMgr.workSpaceList; ws != NULL; ws = ws->next) count++; + Scr->workSpaceMgr.count = count; + + if (columns == 0) { + lines = 2; + columns = ((count - 1) / lines) + 1; + } + else { + lines = ((count - 1) / columns) + 1; + } + Scr->workSpaceMgr.lines = lines; + Scr->workSpaceMgr.columns = columns; + + strWid = 0; + for (ws = Scr->workSpaceMgr.workSpaceList; ws != NULL; ws = ws->next) { + XmbTextExtents(font.font_set, ws->label, strlen (ws->label), + &inc_rect, &logical_rect); + wid = logical_rect.width; + if (wid > strWid) strWid = wid; + } + if (geometry != NULL) { + mask = XParseGeometry (geometry, &x, &y, &width, &height); + bwidth = (mask & WidthValue) ? ((width - (columns * hspace)) / columns) : strWid + 10; + bheight = (mask & HeightValue) ? ((height - (lines * vspace)) / lines) : 22; + width = columns * (bwidth + hspace); + height = lines * (bheight + vspace); + + if (! (mask & YValue)) { + y = 0; + mask |= YNegative; + } + if (mask & XValue) { + if (mask & XNegative) { + x += vs->w - width; + gravity = (mask & YNegative) ? SouthEastGravity : NorthEastGravity; + } + else { + gravity = (mask & YNegative) ? SouthWestGravity : NorthWestGravity; + } + } + else { + x = (vs->w - width) / 2; + gravity = (mask & YValue) ? ((mask & YNegative) ? + SouthGravity : NorthGravity) : SouthGravity; + } + if (mask & YNegative) y += vs->h - height; + } + else { + bwidth = strWid + 2 * Scr->WMgrButtonShadowDepth + 6; + bheight = 22; + width = columns * (bwidth + hspace); + height = lines * (bheight + vspace); + x = (vs->w - width) / 2; + y = vs->h - height; + gravity = NorthWestGravity; + } + +#define Dummy 1 + + vs->wsw->width = Dummy; + vs->wsw->height = Dummy; + vs->wsw->bswl = (ButtonSubwindow**) + malloc (Scr->workSpaceMgr.count * sizeof (ButtonSubwindow*)); + vs->wsw->mswl = (MapSubwindow**) + malloc (Scr->workSpaceMgr.count * sizeof (MapSubwindow*)); + + vs->wsw->w = XCreateSimpleWindow (dpy, Scr->Root, x, y, width, height, 0, + Scr->Black, cp.back); + i = 0; j = 0; + for (ws = Scr->workSpaceMgr.workSpaceList; ws != NULL; ws = ws->next) { + Window mapsw, butsw; + MapSubwindow *msw; + ButtonSubwindow *bsw; + + vs->wsw->bswl [ws->number] = bsw = + (ButtonSubwindow*) malloc (sizeof (ButtonSubwindow)); + vs->wsw->mswl [ws->number] = msw = + (MapSubwindow*) malloc (sizeof (MapSubwindow)); + + butsw = bsw->w = + XCreateSimpleWindow (dpy, vs->wsw->w, + Dummy /* x */, Dummy /* y */, + Dummy /* width */, Dummy /* height */, + 0, Scr->Black, ws->cp.back); + + mapsw = msw->w = + XCreateSimpleWindow (dpy, vs->wsw->w, + Dummy /* x */, Dummy /* y */, + Dummy /* width */, Dummy /* height */, + 1, border, ws->cp.back); + + if (vs->wsw->state == BUTTONSSTATE) + XMapWindow (dpy, butsw); + else + XMapWindow (dpy, mapsw); + + vs->wsw->mswl [ws->number]->wl = NULL; + if (useBackgroundInfo) { + if (ws->image == None || Scr->NoImagesInWorkSpaceManager) + XSetWindowBackground (dpy, mapsw, ws->backcp.back); + else + XSetWindowBackgroundPixmap (dpy, mapsw, ws->image->pixmap); + } + else { + if (Scr->workSpaceMgr.defImage == None || Scr->NoImagesInWorkSpaceManager) + XSetWindowBackground (dpy, mapsw, Scr->workSpaceMgr.defColors.back); + else + XSetWindowBackgroundPixmap (dpy, mapsw, Scr->workSpaceMgr.defImage->pixmap); + } + XClearWindow (dpy, butsw); + i++; + if (i == columns) {i = 0; j++;}; + } + + sizehints.flags = USPosition | PBaseSize | PMinSize | PResizeInc | PWinGravity; + sizehints.x = x; + sizehints.y = y; + sizehints.base_width = columns * hspace; + sizehints.base_height = lines * vspace; + sizehints.width_inc = columns; + sizehints.height_inc = lines; + sizehints.min_width = columns * (hspace + 2); + sizehints.min_height = lines * (vspace + 2); + sizehints.win_gravity = gravity; + + XSetStandardProperties (dpy, vs->wsw->w, + name, icon_name, None, NULL, 0, NULL); + XSetWMSizeHints (dpy, vs->wsw->w, &sizehints, XA_WM_NORMAL_HINTS); + + wmhints.flags = InputHint | StateHint; + wmhints.input = True; + wmhints.initial_state = NormalState; + XSetWMHints (dpy, vs->wsw->w, &wmhints); + XSaveContext (dpy, vs->wsw->w, VirtScreenContext, (XPointer) vs); + tmp_win = AddWindow (vs->wsw->w, 3, Scr->iconmgr); + if (! tmp_win) { + fprintf (stderr, "cannot create workspace manager window, exiting...\n"); + exit (1); + } + tmp_win->occupation = fullOccupation; + tmp_win->vs = vs; + tmp_win->attr.width = width; + tmp_win->attr.height = height; + ResizeWorkSpaceManager(vs, tmp_win); + + attrmask = 0; + attr.cursor = Scr->ButtonCursor; + attrmask |= CWCursor; + attr.win_gravity = gravity; + attrmask |= CWWinGravity; + XChangeWindowAttributes (dpy, vs->wsw->w, attrmask, &attr); + + XGetWindowAttributes (dpy, vs->wsw->w, &wattr); + attrmask = wattr.your_event_mask | KeyPressMask | KeyReleaseMask | ExposureMask; + XSelectInput (dpy, vs->wsw->w, attrmask); + + for (ws = Scr->workSpaceMgr.workSpaceList; ws != NULL; ws = ws->next) { + Window buttonw = vs->wsw->bswl [ws->number]->w; + Window mapsubw = vs->wsw->mswl [ws->number]->w; + XSelectInput (dpy, buttonw, ButtonPressMask | ButtonReleaseMask | ExposureMask); + XSaveContext (dpy, buttonw, TwmContext, (XPointer) tmp_win); + XSaveContext (dpy, buttonw, ScreenContext, (XPointer) Scr); + + XSelectInput (dpy, mapsubw, ButtonPressMask | ButtonReleaseMask); + XSaveContext (dpy, mapsubw, TwmContext, (XPointer) tmp_win); + XSaveContext (dpy, mapsubw, ScreenContext, (XPointer) Scr); + } + SetMapStateProp (tmp_win, WithdrawnState); + vs->wsw->twm_win = tmp_win; + + ws = Scr->workSpaceMgr.workSpaceList; + if (useBackgroundInfo && ! Scr->DontPaintRootWindow) { + if (ws->image == None) + XSetWindowBackground (dpy, Scr->Root, ws->backcp.back); + else + XSetWindowBackgroundPixmap (dpy, Scr->Root, ws->image->pixmap); + XClearWindow (dpy, Scr->Root); + } + PaintWorkSpaceManager (vs); +} + +void WMgrHandleExposeEvent (virtualScreen *vs, XEvent *event) +{ + WorkSpace *ws; + Window buttonw; + + if (vs->wsw->state == BUTTONSSTATE) { + for (ws = Scr->workSpaceMgr.workSpaceList; ws != NULL; ws = ws->next) { + buttonw = vs->wsw->bswl [ws->number]->w; + if (event->xexpose.window == buttonw) break; + } + if (ws == NULL) { + PaintWorkSpaceManagerBorder (vs); + } + else + if (ws == vs->wsw->currentwspc) + PaintButton (WSPCWINDOW, vs, buttonw, ws->label, ws->cp, on); + else + PaintButton (WSPCWINDOW, vs, buttonw, ws->label, ws->cp, off); + } + else { + WinList wl; + + if (XFindContext (dpy, event->xexpose.window, MapWListContext, + (XPointer *) &wl) == XCNOENT) return; + if (wl && wl->twm_win && wl->twm_win->mapped) { + WMapRedrawName (vs, wl); + } + } +} + +void PaintWorkSpaceManager (virtualScreen *vs) +{ + WorkSpace *ws; + + PaintWorkSpaceManagerBorder (vs); + for (ws = Scr->workSpaceMgr.workSpaceList; ws != NULL; ws = ws->next) { + Window buttonw = vs->wsw->bswl [ws->number]->w; + if (ws == vs->wsw->currentwspc) + PaintButton (WSPCWINDOW, vs, buttonw, ws->label, ws->cp, on); + else + PaintButton (WSPCWINDOW, vs, buttonw, ws->label, ws->cp, off); + } +} + +static void PaintWorkSpaceManagerBorder (virtualScreen *vs) +{ + int width, height; + + width = vs->wsw->width; + height = vs->wsw->height; + Draw3DBorder (vs->wsw->w, 0, 0, width, height, 2, Scr->workSpaceMgr.cp, off, True, False); +} + +ColorPair occupyButtoncp; + +char *ok_string = "OK", + *cancel_string = "Cancel", + *everywhere_string = "All"; + +/* + * Create the Occupy window. Do not do the layout of the parts, only + * calculate the inial total size. For the layout, call ResizeOccupyWindow() + * at the end. + * There is only one Occupy window (per Screen), it is reparented to each + * virtual screen as needed. + */ +static void CreateOccupyWindow (void) { + int width, height, lines, columns; + int bwidth, bheight, owidth, oheight, hspace, vspace; + int min_bwidth, min_width; + int i, j; + Window w, OK, cancel, allworkspc; + char *name, *icon_name; + ColorPair cp; + TwmWindow *tmp_win; + WorkSpace *ws; + XSizeHints sizehints; + XWMHints wmhints; + MyFont font; + XSetWindowAttributes attr; + XWindowAttributes wattr; + unsigned long attrmask; + OccupyWindow *occwin; + virtualScreen *vs; + XRectangle inc_rect; + XRectangle logical_rect; + + occwin = Scr->workSpaceMgr.occupyWindow; + occwin->font = Scr->IconManagerFont; + occwin->cp = Scr->IconManagerC; +#ifdef COLOR_BLIND_USER + occwin->cp.shadc = Scr->White; + occwin->cp.shadd = Scr->Black; +#else + if (!Scr->BeNiceToColormap) GetShadeColors (&occwin->cp); +#endif + vs = Scr->vScreenList; + name = occwin->name; + icon_name = occwin->icon_name; + lines = Scr->workSpaceMgr.lines; + columns = Scr->workSpaceMgr.columns; + bwidth = vs->wsw->bwidth; + bheight = vs->wsw->bheight; + oheight = bheight; + vspace = occwin->vspace; + hspace = occwin->hspace; + cp = occwin->cp; + height = ((bheight + vspace) * lines) + oheight + (2 * vspace); + font = occwin->font; + XmbTextExtents(font.font_set, ok_string, strlen(ok_string), + &inc_rect, &logical_rect); + min_bwidth = logical_rect.width; + XmbTextExtents(font.font_set, cancel_string, strlen (cancel_string), + &inc_rect, &logical_rect); + i = logical_rect.width; + if (i > min_bwidth) min_bwidth = i; + XmbTextExtents(font.font_set,everywhere_string, strlen (everywhere_string), + &inc_rect, &logical_rect); + i = logical_rect.width; + if (i > min_bwidth) min_bwidth = i; + min_bwidth = (min_bwidth + hspace); /* normal width calculation */ + width = columns * (bwidth + hspace); + min_width = 3 * (min_bwidth + hspace); /* width by text width */ + + if (columns < 3) { + owidth = min_bwidth + 2 * Scr->WMgrButtonShadowDepth + 2; + if (width < min_width) width = min_width; + bwidth = (width - columns * hspace) / columns; + } + else { + owidth = min_bwidth + 2 * Scr->WMgrButtonShadowDepth + 2; + width = columns * (bwidth + hspace); + } + occwin->lines = lines; + occwin->columns = columns; + occwin->owidth = owidth; + + w = occwin->w = XCreateSimpleWindow (dpy, Scr->Root, 0, 0, width, height, + 1, Scr->Black, cp.back); + occwin->obuttonw = (Window*) malloc (Scr->workSpaceMgr.count * sizeof (Window)); + i = 0; j = 0; + for (ws = Scr->workSpaceMgr.workSpaceList; ws != NULL; ws = ws->next) { + Window bw = + occwin->obuttonw [j * columns + i] = + XCreateSimpleWindow(dpy, w, + Dummy /* x */, + Dummy /* y */, + Dummy /* width */, + Dummy /* height */, + 0, Scr->Black, ws->cp.back); + XMapWindow (dpy, bw); + i++; + if (i == columns) {i = 0; j++;} + } + GetColor (Scr->Monochrome, &(occupyButtoncp.back), "gray50"); + occupyButtoncp.fore = Scr->White; + if (!Scr->BeNiceToColormap) GetShadeColors (&occupyButtoncp); + + OK = XCreateSimpleWindow (dpy, w, Dummy, Dummy, Dummy, Dummy, 0, + Scr->Black, occupyButtoncp.back); + XMapWindow (dpy, OK); + cancel = XCreateSimpleWindow (dpy, w, Dummy, Dummy, Dummy, Dummy, 0, + Scr->Black, occupyButtoncp.back); + XMapWindow (dpy, cancel); + allworkspc = XCreateSimpleWindow (dpy, w, Dummy, Dummy, Dummy, Dummy, 0, + Scr->Black, occupyButtoncp.back); + XMapWindow (dpy, allworkspc); + + occwin->OK = OK; + occwin->cancel = cancel; + occwin->allworkspc = allworkspc; + + sizehints.flags = PBaseSize | PMinSize | PResizeInc; + sizehints.base_width = columns; + sizehints.base_height = lines; + sizehints.width_inc = columns; + sizehints.height_inc = lines; + sizehints.min_width = 2 * columns; + sizehints.min_height = 2 * lines; + XSetStandardProperties (dpy, w, name, icon_name, None, NULL, 0, &sizehints); + + wmhints.flags = InputHint | StateHint; + wmhints.input = True; + wmhints.initial_state = NormalState; + XSetWMHints (dpy, w, &wmhints); + tmp_win = AddWindow (w, FALSE, Scr->iconmgr); + if (! tmp_win) { + fprintf (stderr, "cannot create occupy window, exiting...\n"); + exit (1); + } + tmp_win->vs = None; + tmp_win->occupation = 0; + + attrmask = 0; + attr.cursor = Scr->ButtonCursor; + attrmask |= CWCursor; + XChangeWindowAttributes (dpy, w, attrmask, &attr); + + XGetWindowAttributes (dpy, w, &wattr); + attrmask = wattr.your_event_mask | KeyPressMask | KeyReleaseMask | ExposureMask; + XSelectInput (dpy, w, attrmask); + + for (ws = Scr->workSpaceMgr.workSpaceList; ws != NULL; ws = ws->next) { + Window bw = occwin->obuttonw [ws->number]; + XSelectInput (dpy, bw, ButtonPressMask | ButtonReleaseMask | ExposureMask); + XSaveContext (dpy, bw, TwmContext, (XPointer) tmp_win); + XSaveContext (dpy, bw, ScreenContext, (XPointer) Scr); + } + XSelectInput (dpy, occwin->OK, ButtonPressMask | ButtonReleaseMask | ExposureMask); + XSaveContext (dpy, occwin->OK, TwmContext, (XPointer) tmp_win); + XSaveContext (dpy, occwin->OK, ScreenContext, (XPointer) Scr); + XSelectInput (dpy, occwin->cancel, ButtonPressMask | ButtonReleaseMask | ExposureMask); + XSaveContext (dpy, occwin->cancel, TwmContext, (XPointer) tmp_win); + XSaveContext (dpy, occwin->cancel, ScreenContext, (XPointer) Scr); + XSelectInput (dpy, occwin->allworkspc, ButtonPressMask | ButtonReleaseMask | ExposureMask); + XSaveContext (dpy, occwin->allworkspc, TwmContext, (XPointer) tmp_win); + XSaveContext (dpy, occwin->allworkspc, ScreenContext, (XPointer) Scr); + + SetMapStateProp (tmp_win, WithdrawnState); + occwin->twm_win = tmp_win; + Scr->workSpaceMgr.occupyWindow = occwin; + + tmp_win->attr.width = width; + tmp_win->attr.height = height; + ResizeOccupyWindow(tmp_win); /* place all parts in the right place */ +} + +void PaintOccupyWindow (void) +{ + WorkSpace *ws; + OccupyWindow *occwin; + int width, height; + + occwin = Scr->workSpaceMgr.occupyWindow; + width = occwin->width; + height = occwin->height; + + Draw3DBorder (occwin->w, 0, 0, width, height, 2, occwin->cp, off, True, False); + + for (ws = Scr->workSpaceMgr.workSpaceList; ws != NULL; ws = ws->next) { + Window bw = occwin->obuttonw [ws->number]; + if (occwin->tmpOccupation & (1 << ws->number)) + PaintButton (OCCUPYWINDOW, NULL, bw, ws->label, ws->cp, on); + else + PaintButton (OCCUPYWINDOW, NULL, bw, ws->label, ws->cp, off); + } + PaintButton (OCCUPYBUTTON, NULL, occwin->OK, ok_string, occupyButtoncp, off); + PaintButton (OCCUPYBUTTON, NULL, occwin->cancel, cancel_string, occupyButtoncp, off); + PaintButton (OCCUPYBUTTON, NULL, occwin->allworkspc, everywhere_string, occupyButtoncp, off); +} + +static void PaintButton (int which, + virtualScreen *vs, Window w, + char *label, + ColorPair cp, int state) +{ + OccupyWindow *occwin; + int bwidth, bheight; + MyFont font; + int strWid, strHei, hspace, vspace; + XRectangle inc_rect; + XRectangle logical_rect; + + occwin = Scr->workSpaceMgr.occupyWindow; + if (which == WSPCWINDOW) { + bwidth = vs->wsw->bwidth; + bheight = vs->wsw->bheight; + font = Scr->workSpaceMgr.buttonFont; + } + else + if (which == OCCUPYWINDOW) { + bwidth = occwin->bwidth; + bheight = occwin->bheight; + font = occwin->font; + } + else + if (which == OCCUPYBUTTON) { + bwidth = occwin->owidth; + bheight = occwin->bheight; + font = occwin->font; + } + else return; + + XmbTextExtents(font.font_set, label, strlen (label), &inc_rect, &logical_rect); + strHei = logical_rect.height; + vspace = ((bheight + strHei - font.descent) / 2); + strWid = logical_rect.width; + hspace = (bwidth - strWid) / 2; + if (hspace < (Scr->WMgrButtonShadowDepth + 1)) hspace = Scr->WMgrButtonShadowDepth + 1; + XClearWindow (dpy, w); + + if (Scr->Monochrome == COLOR) { + Draw3DBorder (w, 0, 0, bwidth, bheight, Scr->WMgrButtonShadowDepth, + cp, state, True, False); + + switch (Scr->workSpaceMgr.buttonStyle) { + case STYLE_NORMAL : + break; + + case STYLE_STYLE1 : + Draw3DBorder (w, + Scr->WMgrButtonShadowDepth - 1, + Scr->WMgrButtonShadowDepth - 1, + bwidth - 2 * Scr->WMgrButtonShadowDepth + 2, + bheight - 2 * Scr->WMgrButtonShadowDepth + 2, + 1, cp, (state == on) ? off : on, True, False); + break; + + case STYLE_STYLE2 : + Draw3DBorder (w, + Scr->WMgrButtonShadowDepth / 2, + Scr->WMgrButtonShadowDepth / 2, + bwidth - Scr->WMgrButtonShadowDepth, + bheight - Scr->WMgrButtonShadowDepth, + 1, cp, (state == on) ? off : on, True, False); + break; + + case STYLE_STYLE3 : + Draw3DBorder (w, + 1, + 1, + bwidth - 2, + bheight - 2, + 1, cp, (state == on) ? off : on, True, False); + break; + } + FB (cp.fore, cp.back); + XmbDrawString (dpy, w, font.font_set, Scr->NormalGC, hspace, vspace, + label, strlen (label)); + } + else { + Draw3DBorder (w, 0, 0, bwidth, bheight, Scr->WMgrButtonShadowDepth, + cp, state, True, False); + if (state == on) { + FB (cp.fore, cp.back); + XmbDrawImageString (dpy, w, font.font_set, Scr->NormalGC, hspace, vspace, + label, strlen (label)); + } + else { + FB (cp.back, cp.fore); + XmbDrawImageString (dpy, w, font.font_set, Scr->NormalGC, hspace, vspace, + label, strlen (label)); + } + } +} + +static unsigned int GetMaskFromResource (TwmWindow *win, char *res) +{ + char *name; + char wrkSpcName [64]; + WorkSpace *ws; + int mask, num, mode; + + mode = 0; + if (*res == '+') { + mode = 1; + res++; + } + else + if (*res == '-') { + mode = 2; + res++; + } + mask = 0; + while (*res != '\0') { + while (*res == ' ') res++; + if (*res == '\0') break; + name = wrkSpcName; + while ((*res != '\0') && (*res != ' ')) { + if (*res == '\\') res++; + *name = *res; + name++; res++; + } + *name = '\0'; + if (strcmp (wrkSpcName, "all") == 0) { + mask = fullOccupation; + break; + } + if (strcmp (wrkSpcName, "current") == 0) { + virtualScreen *vs = Scr->currentvs; + if (vs) mask |= (1 << vs->wsw->currentwspc->number); + continue; + } + num = 0; + for (ws = Scr->workSpaceMgr.workSpaceList; ws != NULL; ws = ws->next) { + if (strcmp (wrkSpcName, ws->label) == 0) break; + num++; + } + if (ws != NULL) mask |= (1 << num); + else { + twmrc_error_prefix (); + fprintf (stderr, "unknown workspace : %s\n", wrkSpcName); + } + } + switch (mode) { + case 0 : + return (mask); + case 1 : + return (mask | win->occupation); + case 2 : + return (win->occupation & ~mask); + } + return (0); /* Never supposed to reach here, but just + in case... */ +} + +unsigned int GetMaskFromProperty (unsigned char *prop, unsigned long len) +{ + char wrkSpcName [256]; + WorkSpace *ws; + unsigned int mask; + int num, l; + + mask = 0; + l = 0; + while (l < len) { + strcpy (wrkSpcName, (char *)prop); + l += strlen ((char *)prop) + 1; + prop += strlen ((char *)prop) + 1; + if (strcmp (wrkSpcName, "all") == 0) { + mask = fullOccupation; + break; + } + num = 0; + for (ws = Scr->workSpaceMgr.workSpaceList; ws != NULL; ws = ws->next) { + if (strcmp (wrkSpcName, ws->label) == 0) break; + num++; + } + if (ws == NULL) { + fprintf (stderr, "unknown workspace : %s\n", wrkSpcName); + } + else { + mask |= (1 << num); + } + } + return (mask); +} + +static int GetPropertyFromMask (unsigned int mask, char *prop, long *gwkspc) +{ + WorkSpace *ws; + int len; + char *p; + + if (mask == fullOccupation) { + strcpy (prop, "all"); + return (3); + } + len = 0; + p = prop; + for (ws = Scr->workSpaceMgr.workSpaceList; ws != NULL; ws = ws->next) { + if (mask & (1 << ws->number)) { + strcpy (p, ws->label); + p += strlen (ws->label) + 1; + len += strlen (ws->label) + 1; + *gwkspc = ws->number; + } + } + return (len); +} + +void AddToClientsList (char *workspace, char *client) +{ + WorkSpace *ws; + + if (strcmp (workspace, "all") == 0) { + for (ws = Scr->workSpaceMgr.workSpaceList; ws != NULL; ws = ws->next) { + AddToList (&ws->clientlist, client, ""); + } + return; + } + + for (ws = Scr->workSpaceMgr.workSpaceList; ws != NULL; ws = ws->next) { + if (strcmp (ws->label, workspace) == 0) break; + } + if (ws == NULL) return; + AddToList (&ws->clientlist, client, ""); +} + +void WMapToggleState (virtualScreen *vs) +{ + if (vs->wsw->state == BUTTONSSTATE) { + WMapSetMapState (vs); + } else { + WMapSetButtonsState (vs); + } +} + +void WMapSetMapState (virtualScreen *vs) +{ + WorkSpace *ws; + + if (vs->wsw->state == MAPSTATE) return; + for (ws = Scr->workSpaceMgr.workSpaceList; ws != NULL; ws = ws->next) { + XUnmapWindow (dpy, vs->wsw->bswl [ws->number]->w); + XMapWindow (dpy, vs->wsw->mswl [ws->number]->w); + } + vs->wsw->state = MAPSTATE; + MaybeAnimate = True; +} + +void WMapSetButtonsState (virtualScreen *vs) +{ + WorkSpace *ws; + + if (vs->wsw->state == BUTTONSSTATE) return; + for (ws = Scr->workSpaceMgr.workSpaceList; ws != NULL; ws = ws->next) { + XUnmapWindow (dpy, vs->wsw->mswl [ws->number]->w); + XMapWindow (dpy, vs->wsw->bswl [ws->number]->w); + } + vs->wsw->state = BUTTONSSTATE; +} + +/* + * Verify if a window may be added to the workspace map. + * This is not allowed for + * - icon managers + * - the occupy window + * - workspace manager windows + * - or, optionally, windows with full occupation. + */ +int WMapWindowMayBeAdded(TwmWindow *win) +{ + if (win->iconmgr) + return 0; + if (win == Scr->workSpaceMgr.occupyWindow->twm_win) + return 0; + if (win->wspmgr) + return 0; + if (Scr->workSpaceMgr.noshowoccupyall && + win->occupation == fullOccupation) + return 0; + return 1; +} + +void WMapAddWindow (TwmWindow *win) +{ + WorkSpace *ws; + + if (!WMapWindowMayBeAdded(win)) + return; + + for (ws = Scr->workSpaceMgr.workSpaceList; ws != NULL; ws = ws->next) { + if (OCCUPY (win, ws)) WMapAddToList (win, ws); + } +} + +void WMapDestroyWindow (TwmWindow *win) +{ + WorkSpace *ws; + + for (ws = Scr->workSpaceMgr.workSpaceList; ws != NULL; ws = ws->next) { + if (OCCUPY (win, ws)) WMapRemoveFromList (win, ws); + } + if (win == occupyWin) { + OccupyWindow *occwin = Scr->workSpaceMgr.occupyWindow; + XUnmapWindow (dpy, occwin->twm_win->frame); + occwin->twm_win->mapped = FALSE; + occwin->twm_win->occupation = 0; + occupyWin = (TwmWindow*) 0; + } +} + +void WMapMapWindow (TwmWindow *win) +{ + virtualScreen *vs; + WorkSpace *ws; + WinList wl; + + for (vs = Scr->vScreenList; vs != NULL; vs = vs->next) { + for (ws = Scr->workSpaceMgr.workSpaceList; ws != NULL; ws = ws->next) { + for (wl = vs->wsw->mswl [ws->number]->wl; wl != NULL; wl = wl->next) { + if (wl->twm_win == win) { + XMapWindow (dpy, wl->w); + WMapRedrawName (vs, wl); + break; + } + } + } + } +} + +void WMapSetupWindow (TwmWindow *win, int x, int y, int w, int h) +{ + virtualScreen *vs; + WorkSpace *ws; + WinList wl; + float wf, hf; + + if (win->iconmgr) return; + if (!win->vs) return; + + if (win->wspmgr) { + if (w == -1) return; + ResizeWorkSpaceManager (win->vs, win); + return; + } + if (win == Scr->workSpaceMgr.occupyWindow->twm_win) { + if (w == -1) return; + ResizeOccupyWindow (win); + return; + } + for (vs = Scr->vScreenList; vs != NULL; vs = vs->next) { + WorkSpaceWindow *wsw = vs->wsw; + wf = (float) (wsw->wwidth - 2) / (float) vs->w; + hf = (float) (wsw->wheight - 2) / (float) vs->h; + for (ws = Scr->workSpaceMgr.workSpaceList; ws != NULL; ws = ws->next) { + for (wl = wsw->mswl [ws->number]->wl; wl != NULL; wl = wl->next) { + if (win == wl->twm_win) { + wl->x = (int) (x * wf); + wl->y = (int) (y * hf); + if (w == -1) { + XMoveWindow (dpy, wl->w, wl->x, wl->y); + } + else { + wl->width = (unsigned int) ((w * wf) + 0.5); + wl->height = (unsigned int) ((h * hf) + 0.5); + if (!Scr->use3Dwmap) { + wl->width -= 2; + wl->height -= 2; + } + if (wl->width < 1) wl->width = 1; + if (wl->height < 1) wl->height = 1; + XMoveResizeWindow (dpy, wl->w, wl->x, wl->y, wl->width, wl->height); + } + break; + } + } + } + } +} + +void WMapIconify (TwmWindow *win) +{ + WorkSpace *ws; + WinList wl; + + if (!win->vs) return; + for (ws = Scr->workSpaceMgr.workSpaceList; ws != NULL; ws = ws->next) { + for (wl = win->vs->wsw->mswl [ws->number]->wl; wl != NULL; wl = wl->next) { + if (win == wl->twm_win) { + XUnmapWindow (dpy, wl->w); + break; + } + } + } +} + +void WMapDeIconify (TwmWindow *win) +{ + WorkSpace *ws; + WinList wl; + + if (!win->vs) return; + for (ws = Scr->workSpaceMgr.workSpaceList; ws != NULL; ws = ws->next) { + for (wl = win->vs->wsw->mswl [ws->number]->wl; wl != NULL; wl = wl->next) { + if (win == wl->twm_win) { + if (Scr->NoRaiseDeicon) + XMapWindow (dpy, wl->w); + else + XMapRaised (dpy, wl->w); + WMapRedrawName (win->vs, wl); + break; + } + } + } +} + +void WMapRaiseLower (TwmWindow *win) +{ + WorkSpace *ws; + + for (ws = Scr->workSpaceMgr.workSpaceList; ws != NULL; ws = ws->next) { + if (OCCUPY (win, ws)) WMapRestack (ws); + } +} + +void WMapLower (TwmWindow *win) +{ + WorkSpace *ws; + + for (ws = Scr->workSpaceMgr.workSpaceList; ws != NULL; ws = ws->next) { + if (OCCUPY (win, ws)) WMapRestack (ws); + } +} + +void WMapRaise (TwmWindow *win) +{ + WorkSpace *ws; + + for (ws = Scr->workSpaceMgr.workSpaceList; ws != NULL; ws = ws->next) { + if (OCCUPY (win, ws)) WMapRestack (ws); + } +} + +void WMapRestack (WorkSpace *ws) +{ + virtualScreen *vs; + TwmWindow *win; + WinList wl; + Window root; + Window parent; + Window *children, *smallws; + unsigned int number; + int i, j; + + number = 0; + XQueryTree (dpy, Scr->Root, &root, &parent, &children, &number); + smallws = (Window*) malloc (number * sizeof (Window)); + + for (vs = Scr->vScreenList; vs != NULL; vs = vs->next) { + j = 0; + for (i = number - 1; i >= 0; i--) { + if (!(win = GetTwmWindow(children [i]))) { + continue; + } + if (win->frame != children [i]) continue; /* skip icons */ + if (! OCCUPY (win, ws)) continue; + if (tracefile) { + fprintf (tracefile, "WMapRestack : w = %lx, win = %p\n", children [i], (void *)win); + fflush (tracefile); + } + for (wl = vs->wsw->mswl [ws->number]->wl; wl != NULL; wl = wl->next) { + if (tracefile) { + fprintf (tracefile, "WMapRestack : wl = %p, twm_win = %p\n", (void *)wl, (void *)wl->twm_win); + fflush (tracefile); + } + if (win == wl->twm_win) { + smallws [j++] = wl->w; + break; + } + } + } + XRestackWindows (dpy, smallws, j); + } + XFree ((char *) children); + free (smallws); + return; +} + +void WMapUpdateIconName (TwmWindow *win) +{ + virtualScreen *vs; + WorkSpace *ws; + WinList wl; + + for (vs = Scr->vScreenList; vs != NULL; vs = vs->next) { + for (ws = Scr->workSpaceMgr.workSpaceList; ws != NULL; ws = ws->next) { + for (wl = vs->wsw->mswl [ws->number]->wl; wl != NULL; wl = wl->next) { + if (win == wl->twm_win) { + WMapRedrawName (vs, wl); + break; + } + } + } + } +} + +void WMgrHandleKeyReleaseEvent (virtualScreen *vs, XEvent *event) +{ + char *keyname; + KeySym keysym; + + keysym = XLookupKeysym ((XKeyEvent*) event, 0); + if (! keysym) return; + keyname = XKeysymToString (keysym); + if (! keyname) return; + if ((strcmp (keyname, "Control_R") == 0) || + (strcmp (keyname, "Control_L") == 0)) + { + /* DontToggleWorkSpaceManagerState added 20040607 by dl*/ + if (!donttoggleworkspacemanagerstate) + { + WMapToggleState (vs); + } + return; + } +} + +void WMgrHandleKeyPressEvent (virtualScreen *vs, XEvent *event) +{ + WorkSpace *ws; + int len, i, lname; + char key [16]; + unsigned char k; + char name [128]; + char *keyname; + KeySym keysym; + + keysym = XLookupKeysym ((XKeyEvent*) event, 0); + if (! keysym) return; + keyname = XKeysymToString (keysym); + if (! keyname) return; + if ((strcmp (keyname, "Control_R") == 0) || + (strcmp (keyname, "Control_L") == 0)) + { + /* DontToggleWorkSpaceManagerState added 20040607 by dl*/ + if (!donttoggleworkspacemanagerstate) + { + WMapToggleState (vs); + } + return; + } + if (vs->wsw->state == MAPSTATE) return; + + for (ws = Scr->workSpaceMgr.workSpaceList; ws != NULL; ws = ws->next) { + if (vs->wsw->bswl [ws->number]->w == event->xkey.subwindow) break; + } + if (ws == NULL) return; + + strcpy (name, ws->label); + lname = strlen (name); + len = XLookupString (&(event->xkey), key, 16, NULL, NULL); + for (i = 0; i < len; i++) { + k = key [i]; + if (isprint (k)) { + name [lname++] = k; + } + else + if ((k == 127) || (k == 8)) { + if (lname != 0) lname--; + } + else + break; + } + name [lname] = '\0'; + ws->label = realloc (ws->label, (strlen (name) + 1)); + strcpy (ws->label, name); + if (ws == vs->wsw->currentwspc) + PaintButton (WSPCWINDOW, vs, vs->wsw->bswl [ws->number]->w, ws->label, ws->cp, on); + else + PaintButton (WSPCWINDOW, vs, vs->wsw->bswl [ws->number]->w, ws->label, ws->cp, off); +} + +void WMgrHandleButtonEvent (virtualScreen *vs, XEvent *event) +{ + WorkSpaceWindow *mw; + WorkSpace *ws, *oldws, *newws, *cws; + WinList wl; + TwmWindow *win; + int occupation; + unsigned int W0, H0, bw; + int cont; + XEvent ev; + Window w, sw, parent; + int X0, Y0, X1, Y1, XW, YW, XSW, YSW; + Position newX = 0, newY = 0, winX = 0, winY = 0; + Window junkW; + unsigned int junk; + unsigned int button; + unsigned int modifier; + XSetWindowAttributes attrs; + float wf, hf; + Boolean alreadyvivible, realmovemode, startincurrent; + Time etime; + + parent = event->xbutton.window; + sw = event->xbutton.subwindow; + mw = vs->wsw; + button = event->xbutton.button; + modifier = event->xbutton.state; + etime = event->xbutton.time; + + if (vs->wsw->state == BUTTONSSTATE) { + for (ws = Scr->workSpaceMgr.workSpaceList; ws != NULL; ws = ws->next) { + if (vs->wsw->bswl [ws->number]->w == parent) break; + } + if (ws == NULL) return; + GotoWorkSpace (vs, ws); + return; + } + + for (ws = Scr->workSpaceMgr.workSpaceList; ws != NULL; ws = ws->next) { + if (vs->wsw->mswl [ws->number]->w == parent) break; + } + if (ws == NULL) return; + if (sw == (Window) 0) { + GotoWorkSpace (vs, ws); + return; + } + oldws = ws; + + if (XFindContext (dpy, sw, MapWListContext, (XPointer *) &wl) == XCNOENT) return; + win = wl->twm_win; + if ((! Scr->TransientHasOccupation) && win->transient) return; + + XTranslateCoordinates (dpy, Scr->Root, sw, event->xbutton.x_root, event->xbutton.y_root, + &XW, &YW, &junkW); + realmovemode = ( Scr->ReallyMoveInWorkspaceManager && !(modifier & ShiftMask)) || + (!Scr->ReallyMoveInWorkspaceManager && (modifier & ShiftMask)); + startincurrent = (oldws == vs->wsw->currentwspc); + if (win->OpaqueMove) { + int sw2, ss; + + sw2 = win->frame_width * win->frame_height; + ss = vs->w * vs->h; + if (sw2 > ((ss * Scr->OpaqueMoveThreshold) / 100)) + Scr->OpaqueMove = FALSE; + else + Scr->OpaqueMove = TRUE; + } else { + Scr->OpaqueMove = FALSE; + } + switch (button) { + case 1 : + XUnmapWindow (dpy, sw); + + case 2 : + XGetGeometry (dpy, sw, &junkW, &X0, &Y0, &W0, &H0, &bw, &junk); + XTranslateCoordinates (dpy, vs->wsw->mswl [oldws->number]->w, + mw->w, X0, Y0, &X1, &Y1, &junkW); + + attrs.event_mask = ExposureMask; + attrs.background_pixel = wl->cp.back; + attrs.border_pixel = wl->cp.back; + w = XCreateWindow (dpy, mw->w, X1, Y1, W0, H0, bw, + CopyFromParent, + (unsigned int) CopyFromParent, + (Visual *) CopyFromParent, + CWEventMask | CWBackPixel | CWBorderPixel, &attrs); + + XMapRaised (dpy, w); + WMapRedrawWindow (w, W0, H0, wl->cp, wl->twm_win->icon_name); + if (realmovemode && Scr->ShowWinWhenMovingInWmgr) { + if (Scr->OpaqueMove) { + DisplayWin (vs, win); + } else { + MoveOutline (Scr->Root, + win->frame_x - win->frame_bw, + win->frame_y - win->frame_bw, + win->frame_width + 2 * win->frame_bw, + win->frame_height + 2 * win->frame_bw, + win->frame_bw, + win->title_height + win->frame_bw3D); + } + } + break; + + case 3 : + occupation = win->occupation & ~(1 << oldws->number); + ChangeOccupation (win, occupation); + return; + default : + return; + } + + wf = (float) (mw->wwidth - 1) / (float) vs->w; + hf = (float) (mw->wheight - 1) / (float) vs->h; + XGrabPointer (dpy, mw->w, False, ButtonPressMask | ButtonMotionMask | ButtonReleaseMask, + GrabModeAsync, GrabModeAsync, mw->w, Scr->MoveCursor, CurrentTime); + + alreadyvivible = False; + cont = TRUE; + while (cont) { + MapSubwindow *msw; + XMaskEvent (dpy, ButtonPressMask | ButtonMotionMask | + ButtonReleaseMask | ExposureMask, &ev); + switch (ev.xany.type) { + case ButtonPress : + case ButtonRelease : + if (ev.xbutton.button != button) break; + cont = FALSE; + newX = ev.xbutton.x; + newY = ev.xbutton.y; + + case MotionNotify : + if (cont) { + newX = ev.xmotion.x; + newY = ev.xmotion.y; + } + if (realmovemode) { + for (cws = Scr->workSpaceMgr.workSpaceList; + cws != NULL; + cws = cws->next) { + msw = vs->wsw->mswl [cws->number]; + if ((newX >= msw->x) && (newX < msw->x + mw->wwidth) && + (newY >= msw->y) && (newY < msw->y + mw->wheight)) { + break; + } + } + if (!cws) break; + winX = newX - XW; + winY = newY - YW; + msw = vs->wsw->mswl [cws->number]; + XTranslateCoordinates (dpy, mw->w, msw->w, + winX, winY, &XSW, &YSW, &junkW); + winX = (int) (XSW / wf); + winY = (int) (YSW / hf); + if (Scr->DontMoveOff) { + int width = win->frame_width; + int height = win->frame_height; + + if ((winX < Scr->BorderLeft) && ((Scr->MoveOffResistance < 0) || + (winX > Scr->BorderLeft - Scr->MoveOffResistance))) { + winX = Scr->BorderLeft; + newX = msw->x + XW + Scr->BorderLeft * mw->wwidth / vs->w; + } + if (((winX + width) > vs->w - Scr->BorderRight) && + ((Scr->MoveOffResistance < 0) || + ((winX + width) < vs->w - Scr->BorderRight + Scr->MoveOffResistance))) { + winX = vs->w - Scr->BorderRight - width; + newX = msw->x + mw->wwidth * + (1 - Scr->BorderRight / (double) vs->w) - wl->width + XW - 2; + } + if ((winY < Scr->BorderTop) && ((Scr->MoveOffResistance < 0) || + (winY > Scr->BorderTop - Scr->MoveOffResistance))) { + winY = Scr->BorderTop; + newY = msw->y + YW + Scr->BorderTop * mw->height / vs->h; + } + if (((winY + height) > vs->h - Scr->BorderBottom) && + ((Scr->MoveOffResistance < 0) || + ((winY + height) < vs->h - Scr->BorderBottom + Scr->MoveOffResistance))) { + winY = vs->h - Scr->BorderBottom - height; + newY = msw->y + mw->wheight * + (1 - Scr->BorderBottom / (double) vs->h) - wl->height + YW - 2; + } + } + WMapSetupWindow (win, winX, winY, -1, -1); + if (Scr->ShowWinWhenMovingInWmgr) goto movewin; + if (cws == vs->wsw->currentwspc) { + if (alreadyvivible) goto movewin; + if (Scr->OpaqueMove) { + XMoveWindow (dpy, win->frame, winX, winY); + DisplayWin (vs, win); + } else { + MoveOutline (Scr->Root, + winX - win->frame_bw, winY - win->frame_bw, + win->frame_width + 2 * win->frame_bw, + win->frame_height + 2 * win->frame_bw, + win->frame_bw, + win->title_height + win->frame_bw3D); + } + alreadyvivible = True; + goto move; + } + if (!alreadyvivible) goto move; + if (!OCCUPY (win, vs->wsw->currentwspc) || + (startincurrent && (button == 1))) { + if (Scr->OpaqueMove) { + Vanish (vs, win); + XMoveWindow (dpy, win->frame, winX, winY); + } else { + MoveOutline (Scr->Root, 0, 0, 0, 0, 0, 0); + } + alreadyvivible = False; + goto move; + } +movewin: if (Scr->OpaqueMove) { + XMoveWindow (dpy, win->frame, winX, winY); + } else { + MoveOutline (Scr->Root, + winX - win->frame_bw, winY - win->frame_bw, + win->frame_width + 2 * win->frame_bw, + win->frame_height + 2 * win->frame_bw, + win->frame_bw, + win->title_height + win->frame_bw3D); + } + } +move: XMoveWindow (dpy, w, newX - XW, newY - YW); + break; + case Expose : + if (ev.xexpose.window == w) { + WMapRedrawWindow (w, W0, H0, wl->cp, wl->twm_win->icon_name); + break; + } + Event = ev; + DispatchEvent (); + break; + } + } + if (realmovemode) { + if (Scr->ShowWinWhenMovingInWmgr || alreadyvivible) { + if (Scr->OpaqueMove && !OCCUPY (win, vs->wsw->currentwspc)) { + Vanish (vs, win); + } + if (!Scr->OpaqueMove) { + MoveOutline (Scr->Root, 0, 0, 0, 0, 0, 0); + WMapRedrawName (vs, wl); + } + } + SetupWindow (win, winX, winY, win->frame_width, win->frame_height, -1); + } + ev.xbutton.subwindow = (Window) 0; + ev.xbutton.window = parent; + XPutBackEvent (dpy, &ev); + XUngrabPointer (dpy, CurrentTime); + + if ((ev.xbutton.time - etime) < 250) { + KeyCode control_L_code, control_R_code; + KeySym control_L_sym, control_R_sym; + char keys [32]; + + XMapWindow (dpy, sw); + XDestroyWindow (dpy, w); + GotoWorkSpace (vs, ws); + if (!Scr->DontWarpCursorInWMap) WarpToWindow (win, Scr->RaiseOnWarp); + control_L_sym = XStringToKeysym ("Control_L"); + control_R_sym = XStringToKeysym ("Control_R"); + control_L_code = XKeysymToKeycode (dpy, control_L_sym); + control_R_code = XKeysymToKeycode (dpy, control_R_sym); + XQueryKeymap (dpy, keys); + if ((keys [control_L_code / 8] & ((char) 0x80 >> (control_L_code % 8))) || + keys [control_R_code / 8] & ((char) 0x80 >> (control_R_code % 8))) { + WMapToggleState (vs); + } + return; + } + + for (ws = Scr->workSpaceMgr.workSpaceList; ws != NULL; ws = ws->next) { + MapSubwindow *msw = vs->wsw->mswl [ws->number]; + if ((newX >= msw->x) && (newX < msw->x + mw->wwidth) && + (newY >= msw->y) && (newY < msw->y + mw->wheight)) { + break; + } + } + newws = ws; + switch (button) { + case 1 : + if ((newws == NULL) || (newws == oldws) || OCCUPY (wl->twm_win, newws)) { + XMapWindow (dpy, sw); + break; + } + occupation = (win->occupation | (1 << newws->number)) & ~(1 << oldws->number); + ChangeOccupation (win, occupation); + if (newws == vs->wsw->currentwspc) { + RaiseWindow (win); + WMapRaise (win); + } + else WMapRestack (newws); + break; + + case 2 : + if ((newws == NULL) || (newws == oldws) || + OCCUPY (wl->twm_win, newws)) break; + + occupation = win->occupation | (1 << newws->number); + ChangeOccupation (win, occupation); + if (newws == vs->wsw->currentwspc) { + RaiseWindow (win); + WMapRaise (win); + } + else WMapRestack (newws); + break; + + default : + return; + } + XDestroyWindow (dpy, w); +} + +void InvertColorPair (ColorPair *cp) +{ + Pixel save; + + save = cp->fore; + cp->fore = cp->back; + cp->back = save; + save = cp->shadc; + cp->shadc = cp->shadd; + cp->shadd = save; +} + +void WMapRedrawName (virtualScreen *vs, WinList wl) +{ + int w = wl->width; + int h = wl->height; + ColorPair cp; + char *label; + + label = wl->twm_win->icon_name; + cp = wl->cp; + + if (Scr->ReverseCurrentWorkspace && wl->wlist == vs->wsw->currentwspc) { + InvertColorPair (&cp); + } + WMapRedrawWindow (wl->w, w, h, cp, label); +} + +static void WMapRedrawWindow (Window window, int width, int height, + ColorPair cp, char *label) +{ + int x, y, strhei, strwid; + MyFont font; + XFontSetExtents *font_extents; + XRectangle inc_rect; + XRectangle logical_rect; + XFontStruct **xfonts; + char **font_names; + register int i; + int descent; + int fnum; + + XClearWindow (dpy, window); + font = Scr->workSpaceMgr.windowFont; + + font_extents = XExtentsOfFontSet(font.font_set); + strhei = font_extents->max_logical_extent.height; + + if (strhei > height) return; + + XmbTextExtents(font.font_set, label, strlen (label), + &inc_rect, &logical_rect); + strwid = logical_rect.width; + x = (width - strwid) / 2; + if (x < 1) x = 1; + + fnum = XFontsOfFontSet(font.font_set, &xfonts, &font_names); + for( i = 0, descent = 0; i < fnum; i++){ + /* xf = xfonts[i]; */ + descent = ((descent < (xfonts[i]->max_bounds.descent)) ? (xfonts[i]->max_bounds.descent): descent); + } + + y = ((height + strhei) / 2) - descent; + + if (Scr->use3Dwmap) { + Draw3DBorder (window, 0, 0, width, height, 1, cp, off, True, False); + FB(cp.fore, cp.back); + } else { + FB (cp.back, cp.fore); + XFillRectangle (dpy, window, Scr->NormalGC, 0, 0, width, height); + FB (cp.fore, cp.back); + } + if (Scr->Monochrome != COLOR) { + XmbDrawImageString (dpy, window, font.font_set, Scr->NormalGC, x, y, label, strlen (label)); + } else { + XmbDrawString (dpy, window, font.font_set,Scr->NormalGC, x, y, label, strlen (label)); + } +} + +static void WMapAddToList (TwmWindow *win, WorkSpace *ws) +{ + virtualScreen *vs; + WinList wl; + float wf, hf; + ColorPair cp; + XSetWindowAttributes attr; + unsigned long attrmask; + unsigned int bw; + + cp.back = win->title.back; + cp.fore = win->title.fore; + if (Scr->workSpaceMgr.windowcpgiven) { + cp.back = Scr->workSpaceMgr.windowcp.back; + GetColorFromList (Scr->workSpaceMgr.windowBackgroundL, + win->full_name, &win->class, &cp.back); + cp.fore = Scr->workSpaceMgr.windowcp.fore; + GetColorFromList (Scr->workSpaceMgr.windowForegroundL, + win->full_name, &win->class, &cp.fore); + } + if (Scr->use3Dwmap && !Scr->BeNiceToColormap) { + GetShadeColors (&cp); + } + for (vs = Scr->vScreenList; vs != NULL; vs = vs->next) { + wf = (float) (vs->wsw->wwidth - 2) / (float) vs->w; + hf = (float) (vs->wsw->wheight - 2) / (float) vs->h; + wl = (WinList) malloc (sizeof (struct winList)); + wl->wlist = ws; + wl->x = (int) (win->frame_x * wf); + wl->y = (int) (win->frame_y * hf); + wl->width = (unsigned int) ((win->frame_width * wf) + 0.5); + wl->height = (unsigned int) ((win->frame_height * hf) + 0.5); + bw = 0; + if (!Scr->use3Dwmap) { + bw = 1; + wl->width -= 2; + wl->height -= 2; + } + if (wl->width < 1) wl->width = 1; + if (wl->height < 1) wl->height = 1; + wl->w = XCreateSimpleWindow (dpy, vs->wsw->mswl [ws->number]->w, wl->x, wl->y, + wl->width, wl->height, bw, Scr->Black, cp.back); + attrmask = 0; + if (Scr->BackingStore) { + attr.backing_store = WhenMapped; + attrmask |= CWBackingStore; + } + attr.cursor = handCursor; + attrmask |= CWCursor; + XChangeWindowAttributes (dpy, wl->w, attrmask, &attr); + XSelectInput (dpy, wl->w, ExposureMask); + XSaveContext (dpy, wl->w, TwmContext, (XPointer) vs->wsw->twm_win); + XSaveContext (dpy, wl->w, ScreenContext, (XPointer) Scr); + XSaveContext (dpy, wl->w, MapWListContext, (XPointer) wl); + wl->twm_win = win; + wl->cp = cp; + wl->next = vs->wsw->mswl [ws->number]->wl; + vs->wsw->mswl [ws->number]->wl = wl; + if (win->mapped) XMapWindow (dpy, wl->w); + } +} + +static void WMapRemoveFromList (TwmWindow *win, WorkSpace *ws) +{ + virtualScreen *vs; + WinList wl, *prev; + + for (vs = Scr->vScreenList; vs != NULL; vs = vs->next) { + prev = &vs->wsw->mswl [ws->number]->wl; + wl = *prev; + while (wl != NULL) { + if (win == wl->twm_win) { + *prev = wl->next; + XDeleteContext (dpy, wl->w, TwmContext); + XDeleteContext (dpy, wl->w, ScreenContext); + XDeleteContext (dpy, wl->w, MapWListContext); + XDestroyWindow (dpy, wl->w); + free (wl); + break; + } + prev = &wl->next; + wl = *prev; + } + } +} + +static void ResizeWorkSpaceManager (virtualScreen *vs, TwmWindow *win) +{ + int bwidth, bheight; + int wwidth, wheight; + int hspace, vspace; + int lines, columns; + int neww, newh; + WorkSpace *ws; + TwmWindow *tmp_win; + WinList wl; + int i, j; + float wf, hf; + + neww = win->attr.width; + newh = win->attr.height; + if (neww == vs->wsw->width && newh == vs->wsw->height) + return; + + hspace = Scr->workSpaceMgr.hspace; + vspace = Scr->workSpaceMgr.vspace; + lines = Scr->workSpaceMgr.lines; + columns = Scr->workSpaceMgr.columns; + bwidth = (neww - (columns * hspace)) / columns; + bheight = (newh - (lines * vspace)) / lines; + wwidth = neww / columns; + wheight = newh / lines; + wf = (float) (wwidth - 2) / (float) vs->w; + hf = (float) (wheight - 2) / (float) vs->h; + + i = 0; + j = 0; + for (ws = Scr->workSpaceMgr.workSpaceList; ws != NULL; ws = ws->next) { + MapSubwindow *msw = vs->wsw->mswl [ws->number]; + XMoveResizeWindow (dpy, vs->wsw->bswl [ws->number]->w, + i * (bwidth + hspace) + (hspace / 2), + j * (bheight + vspace) + (vspace / 2), + bwidth, bheight); + msw->x = i * wwidth; + msw->y = j * wheight; + XMoveResizeWindow (dpy, msw->w, msw->x, msw->y, wwidth - 2, wheight - 2); + for (wl = msw->wl; wl != NULL; wl = wl->next) { + tmp_win = wl->twm_win; + wl->x = (int) (tmp_win->frame_x * wf); + wl->y = (int) (tmp_win->frame_y * hf); + wl->width = (unsigned int) ((tmp_win->frame_width * wf) + 0.5); + wl->height = (unsigned int) ((tmp_win->frame_height * hf) + 0.5); + XMoveResizeWindow (dpy, wl->w, wl->x, wl->y, wl->width, wl->height); + } + i++; + if (i == columns) {i = 0; j++;}; + } + vs->wsw->bwidth = bwidth; + vs->wsw->bheight = bheight; + vs->wsw->width = neww; + vs->wsw->height = newh; + vs->wsw->wwidth = wwidth; + vs->wsw->wheight = wheight; + PaintWorkSpaceManager (vs); +} + +static void ResizeOccupyWindow (TwmWindow *win) +{ + int bwidth, bheight, owidth, oheight; + int hspace, vspace; + int lines, columns; + int neww, newh; + WorkSpace *ws; + int i, j, x, y; + OccupyWindow *occwin = Scr->workSpaceMgr.occupyWindow; + + neww = win->attr.width; + newh = win->attr.height; + if (occwin->width == neww && occwin->height == newh) + return; + + hspace = occwin->hspace; + vspace = occwin->vspace; + lines = Scr->workSpaceMgr.lines; + columns = Scr->workSpaceMgr.columns; + bwidth = (neww - columns * hspace) / columns; + bheight = (newh - (lines + 2) * vspace) / (lines + 1); + owidth = occwin->owidth; + oheight = bheight; + + i = 0; + j = 0; + for (ws = Scr->workSpaceMgr.workSpaceList; ws != NULL; ws = ws->next) { + XMoveResizeWindow (dpy, occwin->obuttonw [j * columns + i], + i * (bwidth + hspace) + (hspace / 2), + j * (bheight + vspace) + (vspace / 2), + bwidth, bheight); + i++; + if (i == columns) {i = 0; j++;} + } + hspace = (neww - 3 * owidth) / 4; + x = hspace; + y = ((bheight + vspace) * lines) + ((3 * vspace) / 2); + XMoveResizeWindow (dpy, occwin->OK, x, y, owidth, oheight); + x += owidth + hspace; + XMoveResizeWindow (dpy, occwin->cancel, x, y, owidth, oheight); + x += owidth + hspace; + XMoveResizeWindow (dpy, occwin->allworkspc, x, y, owidth, oheight); + + occwin->width = neww; + occwin->height = newh; + occwin->bwidth = bwidth; + occwin->bheight = bheight; + occwin->owidth = owidth; + PaintOccupyWindow (); +} + +void WMapCreateCurrentBackGround (char *border, + char *background, char *foreground, + char *pixmap) +{ + Image *image; + WorkSpaceMgr *ws = &Scr->workSpaceMgr; + + ws->curBorderColor = Scr->Black; + ws->curColors.back = Scr->White; + ws->curColors.fore = Scr->Black; + ws->curImage = None; + + if (border == NULL) + return; + GetColor (Scr->Monochrome, &ws->curBorderColor, border); + if (background == NULL) + return; + ws->curPaint = True; + GetColor (Scr->Monochrome, &ws->curColors.back, background); + if (foreground == NULL) + return; + GetColor (Scr->Monochrome, &ws->curColors.fore, foreground); + + if (pixmap == NULL) + return; + if ((image = GetImage (pixmap, Scr->workSpaceMgr.curColors)) == None) { + fprintf (stderr, "Can't find pixmap %s\n", pixmap); + return; + } + ws->curImage = image; +} + +void WMapCreateDefaultBackGround (char *border, + char *background, char *foreground, + char *pixmap) +{ + Image *image; + WorkSpaceMgr *ws = &Scr->workSpaceMgr; + + ws->defBorderColor = Scr->Black; + ws->defColors.back = Scr->White; + ws->defColors.fore = Scr->Black; + ws->defImage = None; + + if (border == NULL) + return; + GetColor (Scr->Monochrome, &ws->defBorderColor, border); + if (background == NULL) + return; + GetColor (Scr->Monochrome, &ws->defColors.back, background); + if (foreground == NULL) + return; + GetColor (Scr->Monochrome, &ws->defColors.fore, foreground); + if (pixmap == NULL) + return; + if ((image = GetImage (pixmap, ws->defColors)) == None) + return; + ws->defImage = image; +} + +Bool AnimateRoot (void) +{ + virtualScreen *vs; + ScreenInfo *scr; + int scrnum; + Image *image; + WorkSpace *ws; + Bool maybeanimate; + + maybeanimate = False; + for (scrnum = 0; scrnum < NumScreens; scrnum++) { + if ((scr = ScreenList [scrnum]) == NULL) continue; + if (! scr->workSpaceManagerActive) continue; + + for (vs = scr->vScreenList; vs != NULL; vs = vs->next) { + if (! vs->wsw->currentwspc) continue; + image = vs->wsw->currentwspc->image; + if ((image == None) || (image->next == None)) continue; + if (scr->DontPaintRootWindow) continue; + + XSetWindowBackgroundPixmap (dpy, vs->window, image->pixmap); + XClearWindow (dpy, scr->Root); + vs->wsw->currentwspc->image = image->next; + maybeanimate = True; + } + } + for (scrnum = 0; scrnum < NumScreens; scrnum++) { + if ((scr = ScreenList [scrnum]) == NULL) continue; + + for (vs = scr->vScreenList; vs != NULL; vs = vs->next) { + if (vs->wsw->state == BUTTONSSTATE) continue; + for (ws = scr->workSpaceMgr.workSpaceList; ws != NULL; ws = ws->next) { + image = ws->image; + + if ((image == None) || (image->next == None)) continue; + if (ws == vs->wsw->currentwspc) continue; + XSetWindowBackgroundPixmap (dpy, vs->wsw->mswl [ws->number]->w, image->pixmap); + XClearWindow (dpy, vs->wsw->mswl [ws->number]->w); + ws->image = image->next; + maybeanimate = True; + } + } + } + return (maybeanimate); +} + +static char **GetCaptivesList (int scrnum) +{ + unsigned char *prop, *p; + unsigned long bytesafter; + unsigned long len; + Atom actual_type; + int actual_format; + char **ret; + int count; + int i, l; + Window root; + + _XA_WM_CTWMSLIST = XInternAtom (dpy, "WM_CTWMSLIST", True); + if (_XA_WM_CTWMSLIST == None) return ((char**)0); + + root = RootWindow (dpy, scrnum); + if (XGetWindowProperty (dpy, root, _XA_WM_CTWMSLIST, 0L, 512, + False, XA_STRING, &actual_type, &actual_format, &len, + &bytesafter, &prop) != Success) return ((char**) 0); + if (len == 0) return ((char**) 0); + + count = 0; + p = prop; + l = 0; + while (l < len) { + l += strlen ((char*)p) + 1; + p += strlen ((char*)p) + 1; + count++; + } + ret = (char**) malloc ((count + 1) * sizeof (char*)); + + p = prop; + l = 0; + i = 0; + while (l < len) { + ret [i++] = (char*) strdup ((char*) p); + l += strlen ((char*)p) + 1; + p += strlen ((char*)p) + 1; + } + ret [i] = (char*) 0; + XFree ((char *)prop); + + return (ret); +} + +static void SetCaptivesList (int scrnum, char **clist) +{ + unsigned long len; + char **cl; + char *s, *slist; + Window root = RootWindow (dpy, scrnum); + + _XA_WM_CTWMSLIST = XInternAtom (dpy, "WM_CTWMSLIST", False); + cl = clist; len = 0; + while (*cl) { len += strlen (*cl++) + 1; } + if (len == 0) { + XDeleteProperty (dpy, root, _XA_WM_CTWMSLIST); + return; + } + slist = (char*) malloc (len * sizeof (char)); + cl = clist; s = slist; + while (*cl) { + strcpy (s, *cl); + s += strlen (*cl); + *s++ = '\0'; + cl++; + } + XChangeProperty (dpy, root, _XA_WM_CTWMSLIST, XA_STRING, 8, + PropModeReplace, (unsigned char *) slist, len); +} + +static void freeCaptiveList (char **clist) +{ + while (clist && *clist) { free (*clist++); } +} + +void AddToCaptiveList (void) +{ + int i, count; + char **clist, **cl, **newclist; + int busy [32]; + Atom _XA_WM_CTWM_ROOT; + char *atomname; + int scrnum = Scr->screen; + Window croot = Scr->Root; + Window root = RootWindow (dpy, scrnum); + + for (i = 0; i < 32; i++) { busy [i] = 0; } + clist = GetCaptivesList (scrnum); + cl = clist; + count = 0; + while (cl && *cl) { + count++; + if (!captivename) { + if (!strncmp (*cl, "ctwm-", 5)) { + int r, n; + r = sscanf (*cl, "ctwm-%d", &n); + cl++; + if (r != 1) continue; + if ((n < 0) || (n > 31)) continue; + busy [n] = 1; + } else cl++; + continue; + } + if (!strcmp (*cl, captivename)) { + fprintf (stderr, "A captive ctwm with name %s is already running\n", captivename); + exit (1); + } + cl++; + } + if (!captivename) { + for (i = 0; i < 32; i++) { + if (!busy [i]) break; + } + if (i == 32) { /* no one can tell we didn't try hard */ + fprintf (stderr, "Cannot find a suitable name for captive ctwm\n"); + exit (1); + } + captivename = (char*) malloc (8); + sprintf (captivename, "ctwm-%d", i); + } + newclist = (char**) malloc ((count + 2) * sizeof (char*)); + for (i = 0; i < count; i++) { + newclist [i] = (char*) strdup (clist [i]); + } + newclist [count] = (char*) strdup (captivename); + newclist [count + 1] = (char*) 0; + SetCaptivesList (scrnum, newclist); + freeCaptiveList (clist); + freeCaptiveList (newclist); + free (clist); free (newclist); + + root = RootWindow (dpy, scrnum); + atomname = (char*) malloc (strlen ("WM_CTWM_ROOT_") + strlen (captivename) +1); + sprintf (atomname, "WM_CTWM_ROOT_%s", captivename); + _XA_WM_CTWM_ROOT = XInternAtom (dpy, atomname, False); + XChangeProperty (dpy, root, _XA_WM_CTWM_ROOT, XA_WINDOW, 32, + PropModeReplace, (unsigned char *) &croot, 4); +} + +void RemoveFromCaptiveList (void) +{ + int count; + char **clist, **cl, **newclist; + Atom _XA_WM_CTWM_ROOT; + char *atomname; + int scrnum = Scr->screen; + Window root = RootWindow (dpy, scrnum); + + if (!captivename) return; + clist = GetCaptivesList (scrnum); + cl = clist; count = 0; + while (*cl) { + count++; + cl++; + } + newclist = (char**) malloc (count * sizeof (char*)); + cl = clist; count = 0; + while (*cl) { + if (!strcmp (*cl, captivename)) { cl++; continue; } + newclist [count++] = *cl; + cl++; + } + newclist [count] = (char*) 0; + SetCaptivesList (scrnum, newclist); + freeCaptiveList (clist); + free (clist); free (newclist); + + atomname = (char*) malloc (strlen ("WM_CTWM_ROOT_") + strlen (captivename) +1); + sprintf (atomname, "WM_CTWM_ROOT_%s", captivename); + _XA_WM_CTWM_ROOT = XInternAtom (dpy, atomname, True); + if (_XA_WM_CTWM_ROOT == None) return; + XDeleteProperty (dpy, root, _XA_WM_CTWM_ROOT); +} + +void SetPropsIfCaptiveCtwm (TwmWindow *win) +{ + Window window = win->w; + Window frame = win->frame; + Atom _XA_WM_CTWM_ROOT; + + if (!CaptiveCtwmRootWindow (window)) return; + _XA_WM_CTWM_ROOT = XInternAtom (dpy, "WM_CTWM_ROOT", True); + if (_XA_WM_CTWM_ROOT == None) return; + + XChangeProperty (dpy, frame, _XA_WM_CTWM_ROOT, XA_WINDOW, 32, + PropModeReplace, (unsigned char *) &window, 4); +} + +Window CaptiveCtwmRootWindow (Window window) +{ + Window *prop; + Window w; + unsigned long bytesafter; + unsigned long len; + Atom actual_type; + int actual_format; + Atom _XA_WM_CTWM_ROOT; + + _XA_WM_CTWM_ROOT = XInternAtom (dpy, "WM_CTWM_ROOT", True); + if (_XA_WM_CTWM_ROOT == None) return ((Window)0); + + if (XGetWindowProperty (dpy, window, _XA_WM_CTWM_ROOT, 0L, 1L, + False, XA_WINDOW, &actual_type, &actual_format, &len, + &bytesafter, (unsigned char **)&prop) != Success) + return ((Window)0); + if (len == 0) return ((Window)0); + w = *prop; + XFree ((char *)prop); + return w; +} + +CaptiveCTWM GetCaptiveCTWMUnderPointer (void) +{ + int scrnum = Scr->screen; + Window root; + Window child, croot; + CaptiveCTWM cctwm; + + root = RootWindow (dpy, scrnum); + while (1) { + XQueryPointer (dpy, root, &JunkRoot, &child, + &JunkX, &JunkY, &JunkX, &JunkY, &JunkMask); + if (child && (croot = CaptiveCtwmRootWindow (child))) { + root = croot; + continue; + } + cctwm.root = root; + XFetchName (dpy, root, &cctwm.name); + if (!cctwm.name) cctwm.name = (char*) strdup ("Root"); + return (cctwm); + } +} + +void SetNoRedirect (Window window) +{ + Atom _XA_WM_NOREDIRECT; + + _XA_WM_NOREDIRECT = XInternAtom (dpy, "WM_NOREDIRECT", False); + if (_XA_WM_NOREDIRECT == None) return; + + XChangeProperty (dpy, window, _XA_WM_NOREDIRECT, XA_STRING, 8, + PropModeReplace, (unsigned char *) "Yes", 4); +} + +static Bool DontRedirect (Window window) +{ + unsigned char *prop; + unsigned long bytesafter; + unsigned long len; + Atom actual_type; + int actual_format; + Atom _XA_WM_NOREDIRECT; + + _XA_WM_NOREDIRECT = XInternAtom (dpy, "WM_NOREDIRECT", True); + if (_XA_WM_NOREDIRECT == None) return (False); + + if (XGetWindowProperty (dpy, window, _XA_WM_NOREDIRECT, 0L, 1L, + False, XA_STRING, &actual_type, &actual_format, &len, + &bytesafter, &prop) != Success) return (False); + if (len == 0) return (False); + XFree ((char *)prop); + return (True); +} + +Bool visible (TwmWindow *tmp_win) +{ + return (tmp_win->vs != NULL); +} + +#ifdef BUGGY_HP700_SERVER +static void fakeRaiseLower (display, window) +Display *display; +Window window; +{ + Window root; + Window parent; + Window grandparent; + Window *children; + unsigned int number; + XWindowChanges changes; + + number = 0; + XQueryTree (display, window, &root, &parent, &children, &number); + XFree ((char *) children); + XQueryTree (display, parent, &root, &grandparent, &children, &number); + + changes.stack_mode = (children [number-1] == window) ? Below : Above; + XFree ((char *) children); + XConfigureWindow (display, window, CWStackMode, &changes); +} +#endif + + + Index: external/mit/ctwm/dist/workmgr.h =================================================================== RCS file: external/mit/ctwm/dist/workmgr.h diff -N external/mit/ctwm/dist/workmgr.h --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/workmgr.h 3 Sep 2015 12:20:00 -0000 @@ -0,0 +1,229 @@ +/* + * [ ctwm ] + * + * Copyright 1992 Claude Lecommandeur. + * + * Permission to use, copy, modify and distribute this software [ctwm] and + * its documentation for any purpose is hereby granted without fee, provided + * that the above copyright notice appear in all copies and that both that + * copyright notice and this permission notice appear in supporting documen- + * tation, and that the name of Claude Lecommandeur not be used in adverti- + * sing or publicity pertaining to distribution of the software without + * specific, written prior permission. Claude Lecommandeur make no represen- + * tations about the suitability of this software for any purpose. It is + * provided "as is" without express or implied warranty. + * + * Claude Lecommandeur DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO + * EVENT SHALL Claude Lecommandeur BE LIABLE FOR ANY SPECIAL, INDIRECT OR + * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF + * USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR + * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + * + * Author: Claude Lecommandeur [ lecom@sic.epfl.ch ][ April 1992 ] + */ + +#ifdef GNOME +/* 6/19/1999 nhd for GNOME compliance */ +#include "gnome.h" +#endif /* GNOME */ +#include "vscreen.h" + +#ifndef _WORKMGR_ +#define _WORKMGR_ + +#define MAXWORKSPACE 32 +#define MAPSTATE 0 +#define BUTTONSSTATE 1 + +#define STYLE_NORMAL 0 +#define STYLE_STYLE1 1 +#define STYLE_STYLE2 2 +#define STYLE_STYLE3 3 + +struct winList { + struct WorkSpace *wlist; + Window w; + int x, y; + int width, height; + TwmWindow *twm_win; + ColorPair cp; + MyFont font; + struct winList *next; +}; + +struct WorkSpaceMgr { + struct WorkSpace *workSpaceList; + struct WorkSpaceWindow *workSpaceWindowList; + struct OccupyWindow *occupyWindow; + MyFont buttonFont; + MyFont windowFont; + ColorPair windowcp; + Bool windowcpgiven; + ColorPair cp; + long count; + char *geometry; + int lines, columns; + int noshowoccupyall; + int initialstate; + short buttonStyle; + name_list *windowBackgroundL; + name_list *windowForegroundL; + /* The fields below have been moved from WorkSpaceWindow */ + ColorPair curColors; + Image *curImage; + unsigned long curBorderColor; + Bool curPaint; + + ColorPair defColors; + Image *defImage; + unsigned long defBorderColor; + int hspace, vspace; + char *name; + char *icon_name; +}; + +struct WorkSpace { + long number; + char *name; + char *label; + Image *image; + name_list *clientlist; + IconMgr *iconmgr; + ColorPair cp; + ColorPair backcp; + TwmWindow *save_focus; /* Used by SaveWorkspaceFocus feature */ + struct WindowRegion *FirstWindowRegion; + struct WorkSpace *next; +}; + +struct MapSubwindow { + Window w; + int x, y; + WinList wl; +}; + +struct ButtonSubwindow { + Window w; +}; + +struct WorkSpaceWindow { /* There is one per virtual screen */ + virtualScreen *vs; + Window w; + TwmWindow *twm_win; + MapSubwindow **mswl; /* MapSubWindow List */ + ButtonSubwindow **bswl; /* ButtonSubwindow List */ + WorkSpace *currentwspc; + + int state; + + int width, height; + int bwidth, bheight; + int wwidth, wheight; +}; + +struct OccupyWindow { + Window w; + TwmWindow *twm_win; + char *geometry; + Window *obuttonw; + Window OK, cancel, allworkspc; + int width, height; + char *name; + char *icon_name; + int lines, columns; + int hspace, vspace; /* space between workspaces */ + int bwidth, bheight; + int owidth; /* oheight == bheight */ + ColorPair cp; + MyFont font; + int tmpOccupation; +}; + +struct CaptiveCTWM { + Window root; + String name; +}; + +void InitWorkSpaceManager (void); +void ConfigureWorkSpaceManager (void); +void CreateWorkSpaceManager (void); +void GotoWorkSpaceByName (virtualScreen *vs, char *wname); +void GotoWorkSpaceByNumber (virtualScreen *vs, int workspacenum); +void GotoPrevWorkSpace (virtualScreen *vs); +void GotoNextWorkSpace (virtualScreen *vs); +void GotoRightWorkSpace (virtualScreen *vs); +void GotoLeftWorkSpace (virtualScreen *vs); +void GotoUpWorkSpace (virtualScreen *vs); +void GotoDownWorkSpace (virtualScreen *vs); +void GotoWorkSpace (virtualScreen *vs, WorkSpace *ws); +void AddWorkSpace (char *name, + char *background, char *foreground, + char *backback, char *backfore, char *backpix); +void SetupOccupation (TwmWindow *twm_win, int occupation_hint); +void Occupy (TwmWindow *twm_win); +void OccupyHandleButtonEvent (XEvent *event); +void OccupyAll (TwmWindow *twm_win); +void AddToWorkSpace (char *wname, TwmWindow *twm_win); +void RemoveFromWorkSpace (char *wname, TwmWindow *twm_win); +void ToggleOccupation (char *wname, TwmWindow *twm_win); +void AllocateOthersIconManagers (void); +void ChangeOccupation (TwmWindow *tmp_win, int newoccupation); +void WmgrRedoOccupation (TwmWindow *win); +void WMgrRemoveFromCurrentWorkSpace (virtualScreen *vs, TwmWindow *win); +#ifdef VMS /* Because that name is longer than 31 characters */ +#define WMgrAddToCurrentWorkSpaceAndWarp WMgrAddToCurrWorkSpaceAndWarp +#endif +void WMgrAddToCurrentWorkSpaceAndWarp (virtualScreen *vs, char *winname); +void WMgrHandleExposeEvent (virtualScreen *vs, XEvent *event); +void PaintWorkSpaceManager (virtualScreen *vs); +void PaintOccupyWindow (void); +unsigned int GetMaskFromProperty (unsigned char *prop, unsigned long len); +void AddToClientsList (char *workspace, char *client); +void WMapToggleState (virtualScreen *vs); +void WMapSetMapState (virtualScreen *vs); +void WMapSetButtonsState (virtualScreen *vs); +void WMapAddWindow (TwmWindow *win); +void WMapDestroyWindow (TwmWindow *win); +void WMapMapWindow (TwmWindow *win); +void WMapSetupWindow (TwmWindow *win, int x, int y, int w, int h); +void WMapIconify (TwmWindow *win); +void WMapDeIconify (TwmWindow *win); +void WMapRaiseLower (TwmWindow *win); +void WMapLower (TwmWindow *win); +void WMapRaise (TwmWindow *win); +void WMapRestack (WorkSpace *ws); +void WMapUpdateIconName (TwmWindow *win); +void WMgrHandleKeyReleaseEvent (virtualScreen *vs, XEvent *event); +void WMgrHandleKeyPressEvent (virtualScreen *vs, XEvent *event); +void WMgrHandleButtonEvent (virtualScreen *vs, XEvent *event); +void InvertColorPair (ColorPair *cp); +void WMapRedrawName (virtualScreen *vs, WinList wl); +void WMapCreateCurrentBackGround (char *border, + char *background, char *foreground, + char *pixmap); +void WMapCreateDefaultBackGround (char *border, + char *background, char *foreground, + char *pixmap); +char *GetCurrentWorkSpaceName (virtualScreen *vs); +Bool AnimateRoot (void); +void AddToCaptiveList (void); +void RemoveFromCaptiveList (void); +Bool RedirectToCaptive (Window window); +void SetPropsIfCaptiveCtwm (TwmWindow *win); +Window CaptiveCtwmRootWindow (Window window); + +void MoveToNextWorkSpace (virtualScreen *vs, TwmWindow *twm_win); +void MoveToPrevWorkSpace (virtualScreen *vs, TwmWindow *twm_win); +void MoveToNextWorkSpaceAndFollow (virtualScreen *vs, TwmWindow *twm_win); +void MoveToPrevWorkSpaceAndFollow (virtualScreen *vs, TwmWindow *twm_win); + +CaptiveCTWM GetCaptiveCTWMUnderPointer (void); +void SetNoRedirect (Window window); + +extern void ShowBackground (virtualScreen *vs); + +Bool visible (TwmWindow *tmp_win); + +#endif /* _WORKMGR_ */ Index: external/mit/ctwm/dist/xpm/3D_Expand15.xpm =================================================================== RCS file: external/mit/ctwm/dist/xpm/3D_Expand15.xpm diff -N external/mit/ctwm/dist/xpm/3D_Expand15.xpm --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/xpm/3D_Expand15.xpm 3 Sep 2015 12:20:00 -0000 @@ -0,0 +1,26 @@ +/* XPM */ +static char * 3D_Expand15_xpm[] = { +"16 16 7 1", +" c #D2D2B4B48C8C", +". c #FFFFEBEBCDCD", +"X c #8B8B77776565", +"o c white", +"O c #6A6A5A5ACDCD", +"+ c #FFFFE4E4E1E1", +"@ c #EEEE8282EEEE", +" ..............X", +". ............XX", +".. ooooooooooX X", +"..oOOOOOOOOOO. X", +"..oO++++++++O. X", +"..oO+++@@+++O. X", +"..oO++@@@@++O. X", +"..oO+++@@+++O. X", +"..oO+++@@+++O. X", +"..oO++@@@@++O. X", +"..oO+++@@+++O. X", +"..oO++++++++O. X", +"..oOOOOOOOOOO. X", +"..X..........X X", +".X XX", +"XXXXXXXXXXXXXXXX"}; Index: external/mit/ctwm/dist/xpm/3D_Iconify15.xpm =================================================================== RCS file: external/mit/ctwm/dist/xpm/3D_Iconify15.xpm diff -N external/mit/ctwm/dist/xpm/3D_Iconify15.xpm --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/xpm/3D_Iconify15.xpm 3 Sep 2015 12:20:01 -0000 @@ -0,0 +1,26 @@ +/* XPM */ +static char * 3D_Iconify15_xpm[] = { +"16 16 7 1", +" c #D2D2B4B48C8C", +". c #FFFFEBEBCDCD", +"X c #8B8B77776565", +"o c white", +"O c #6A6A5A5ACDCD", +"+ c #FFFFE4E4E1E1", +"@ c #EEEE8282EEEE", +" ..............X", +". ............XX", +".. ooooooooooX X", +"..oOOOOOOOOOO. X", +"..oO++++++++O. X", +"..oO+++@@+++O. X", +"..oO++@@@@++O. X", +"..oO+@@@@@@+O. X", +"..oO+@@@@@@+O. X", +"..oO++@@@@++O. X", +"..oO+++@@+++O. X", +"..oO++++++++O. X", +"..oOOOOOOOOOO. X", +"..X..........X X", +".X XX", +"XXXXXXXXXXXXXXXX"}; Index: external/mit/ctwm/dist/xpm/3D_Lightning15.xpm =================================================================== RCS file: external/mit/ctwm/dist/xpm/3D_Lightning15.xpm diff -N external/mit/ctwm/dist/xpm/3D_Lightning15.xpm --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/xpm/3D_Lightning15.xpm 3 Sep 2015 12:20:01 -0000 @@ -0,0 +1,26 @@ +/* XPM */ +static char * 3D_Lightning15_xpm[] = { +"16 16 7 1", +" c #D2D2B4B48C8C", +". c #FFFFEBEBCDCD", +"X c #8B8B77776565", +"o c white", +"O c #6A6A5A5ACDCD", +"+ c #FFFFE4E4E1E1", +"@ c #EEEE8282EEEE", +" ..............X", +". ............XX", +".. ooooooooooX X", +"..oOOOOOOOOOO. X", +"..oO++++@@@+O. X", +"..oO+++@@@++O. X", +"..oO++@@@+++O. X", +"..oO+@@@@@@+O. X", +"..oO++++@@++O. X", +"..oO+++@@+++O. X", +"..oO+++@++++O. X", +"..oO++@+++++O. X", +"..oOOOOOOOOOO. X", +"..X..........X X", +".X XX", +"XXXXXXXXXXXXXXXX"}; Index: external/mit/ctwm/dist/xpm/3D_Menu15.xpm =================================================================== RCS file: external/mit/ctwm/dist/xpm/3D_Menu15.xpm diff -N external/mit/ctwm/dist/xpm/3D_Menu15.xpm --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/xpm/3D_Menu15.xpm 3 Sep 2015 12:20:01 -0000 @@ -0,0 +1,26 @@ +/* XPM */ +static char * 3D_Menu15_xpm[] = { +"16 16 7 1", +" c #D2D2B4B48C8C", +". c #FFFFEBEBCDCD", +"X c #8B8B77776565", +"o c white", +"O c #6A6A5A5ACDCD", +"+ c #FFFFE4E4E1E1", +"@ c #EEEE8282EEEE", +" ..............X", +". ............XX", +".. ooooooooooX X", +"..oOOOOOOOOOO. X", +"..oO++++++++O. X", +"..oO+@@@@@@+O. X", +"..oO++++++++O. X", +"..oO+@@@@@@+O. X", +"..oO++++++++O. X", +"..oO+@@@@@@+O. X", +"..oO++++++++O. X", +"..oO++++++++O. X", +"..oOOOOOOOOOO. X", +"..X..........X X", +".X XX", +"XXXXXXXXXXXXXXXX"}; Index: external/mit/ctwm/dist/xpm/3D_Resize15.xpm =================================================================== RCS file: external/mit/ctwm/dist/xpm/3D_Resize15.xpm diff -N external/mit/ctwm/dist/xpm/3D_Resize15.xpm --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/xpm/3D_Resize15.xpm 3 Sep 2015 12:20:01 -0000 @@ -0,0 +1,26 @@ +/* XPM */ +static char * 3D_Resize15_xpm[] = { +"16 16 7 1", +" c #D2D2B4B48C8C", +". c #FFFFEBEBCDCD", +"X c #8B8B77776565", +"o c white", +"O c #6A6A5A5ACDCD", +"+ c #FFFFE4E4E1E1", +"@ c #EEEE8282EEEE", +" ..............X", +". ............XX", +".. ooooooooooX X", +"..oOOOOOOOOOO. X", +"..oO++@+@+@+O. X", +"..oO++@+@+@+O. X", +"..oO@@@+@+@+O. X", +"..oO++++@+@+O. X", +"..oO@@@@@+@+O. X", +"..oO++++++@+O. X", +"..oO@@@@@@@+O. X", +"..oO++++++++O. X", +"..oOOOOOOOOOO. X", +"..X..........X X", +".X XX", +"XXXXXXXXXXXXXXXX"}; Index: external/mit/ctwm/dist/xpm/3D_Zoom15.xpm =================================================================== RCS file: external/mit/ctwm/dist/xpm/3D_Zoom15.xpm diff -N external/mit/ctwm/dist/xpm/3D_Zoom15.xpm --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/xpm/3D_Zoom15.xpm 3 Sep 2015 12:20:01 -0000 @@ -0,0 +1,26 @@ +/* XPM */ +static char * 3D_Zoom15_xpm[] = { +"16 16 7 1", +" c #D2D2B4B48C8C", +". c #FFFFEBEBCDCD", +"X c #8B8B77776565", +"o c white", +"O c #6A6A5A5ACDCD", +"+ c #FFFFE4E4E1E1", +"@ c #EEEE8282EEEE", +" ..............X", +". ............XX", +".. ooooooooooX X", +"..oOOOOOOOOOO. X", +"..oO++++++++O. X", +"..oO+@@++@@+O. X", +"..oO+@@++@@+O. X", +"..oO+++@@+++O. X", +"..oO+++@@+++O. X", +"..oO+@@++@@+O. X", +"..oO+@@++@@+O. X", +"..oO++++++++O. X", +"..oOOOOOOOOOO. X", +"..X..........X X", +".X XX", +"XXXXXXXXXXXXXXXX"}; Index: external/mit/ctwm/dist/xpm/3dcircle.xpm =================================================================== RCS file: external/mit/ctwm/dist/xpm/3dcircle.xpm diff -N external/mit/ctwm/dist/xpm/3dcircle.xpm --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/xpm/3dcircle.xpm 3 Sep 2015 12:20:01 -0000 @@ -0,0 +1,22 @@ +/* XPM */ +static char * 3dcircle_xpm[] = { +"14 16 3 1", +" c #659510403CF3 s Background", +". c #B2CA8A289E79 s HiShadow", +"X c #3CF308202492 s LoShadow", +" ", +" ", +" ", +" ..... ", +" .. . ", +" .. X ", +" . X ", +" . X ", +" . X ", +" . X ", +" . X ", +" X X ", +" XXXX ", +" ", +" ", +" "}; Index: external/mit/ctwm/dist/xpm/3ddimple.xpm =================================================================== RCS file: external/mit/ctwm/dist/xpm/3ddimple.xpm diff -N external/mit/ctwm/dist/xpm/3ddimple.xpm --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/xpm/3ddimple.xpm 3 Sep 2015 12:20:01 -0000 @@ -0,0 +1,20 @@ +/* XPM */ +static char * 3ddimple_xpm[] = { +"12 14 3 1", +" c #BDBDB7B76B6B s Background", +". c #71716E6E4040 s LoShadow", +"X c #DEDEDBDBB5B5 s HiShadow", +" ", +" ", +" .. .. .. .. ", +" XX XX XX XX", +" ", +" ", +" .. .. .. .. ", +" XX XX XX XX", +" ", +" ", +" .. .. .. .. ", +" XX XX XX XX", +" ", +" "}; Index: external/mit/ctwm/dist/xpm/3ddot.xpm =================================================================== RCS file: external/mit/ctwm/dist/xpm/3ddot.xpm diff -N external/mit/ctwm/dist/xpm/3ddot.xpm --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/xpm/3ddot.xpm 3 Sep 2015 12:20:01 -0000 @@ -0,0 +1,20 @@ +/* XPM */ +static char * 3ddot_xpm[] = { +"11 14 3 1", +" c #659510403CF3 s Background", +". c #B2CA8A289E79 s HiShadow", +"X c #30C208201C71 s LoShadow", +" ", +" ", +" ", +" .......X ", +" ......XX ", +" .. XX ", +" .. XX ", +" .. XX ", +" .. XX ", +" ..XXXXXX ", +" .XXXXXXX ", +" ", +" ", +" "}; Index: external/mit/ctwm/dist/xpm/3dfeet.xpm =================================================================== RCS file: external/mit/ctwm/dist/xpm/3dfeet.xpm diff -N external/mit/ctwm/dist/xpm/3dfeet.xpm --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/xpm/3dfeet.xpm 3 Sep 2015 12:20:01 -0000 @@ -0,0 +1,22 @@ +/* XPM */ +static char * 3dfeet_xpm[] = { +"50 17 2 1", +" c #659510403CF3", +". c #B2CA8A289E79", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ... ", +" ... .. ... ", +" ...... ..... . ", +" ................. . ", +" ................. . ", +" ................. . ", +" ................ . ", +" .............. .. ", +" ...... . ", +" "}; Index: external/mit/ctwm/dist/xpm/3dleopard.xpm =================================================================== RCS file: external/mit/ctwm/dist/xpm/3dleopard.xpm diff -N external/mit/ctwm/dist/xpm/3dleopard.xpm --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/xpm/3dleopard.xpm 3 Sep 2015 12:20:01 -0000 @@ -0,0 +1,23 @@ +/* XPM */ +static char * 3dleopard_xpm[] = { +"100 16 4 1", +" c #A8A88C8CCFCF s Background", +". c #545446466767 s HiShadow", +"X c #D4D4C6C6E7E7 s LoShadow", +"o c #000000000000", +" ... XX ... XXX. X X .. X . X . XXXXX X ", +" XX XX X X XX . XX XXXXXXX XXXX. X .... XXXXX X . X . X . X ", +" X X. X XXXX X XXX X . X . XX .. XX .. X . X . X . X . X . XX ..", +" X . X . X . X . X . X . X .. X . XXXX. X . X . X . X . X .. ", +" X . X . X .. X ... X .. X ... X . X . X . X . .. ... XX . X .XX.... XX", +"X . X . X .. X . X . X... X . X.. X .. X .. . X . X.. ... X ", +" . X .. X .. X. X . X. XXX. X . X . X .. XXXXX X . XX ", +" . .... X ..... X . X . X . XX. X . XX . X.. XX .. XXX XX X ", +" .. X... XXX XX .. . X .. X .. X X X . X . .X . X .. X . X ", +" .. XXX. X. XX .. X XXX XX . X . X.. XX . X.... .. X . XXXX X . X .... X ", +" . XX .. XX . X . X ..X. .XX. XX . .. . X.. X . X . XX . X ", +" . XX . XX . X .. X . . . X . XX .. . XX . X . X . XX ", +". X . X.. . X . ..... . . X . XXX . . . XXXX X X . XX . XX. XX", +" XX . ........ . .. .. . XX . X .. . X .. X .. X ..X .. ", +" XX . XX XX ...... XXXXXXXX . . X .. X . X . X .. XX .. X . ", +"X . X . XXXXXXX XX .. . . X . X . X .. X.. X.... X .. "}; Index: external/mit/ctwm/dist/xpm/3dpie.xpm =================================================================== RCS file: external/mit/ctwm/dist/xpm/3dpie.xpm diff -N external/mit/ctwm/dist/xpm/3dpie.xpm --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/xpm/3dpie.xpm 3 Sep 2015 12:20:01 -0000 @@ -0,0 +1,22 @@ +/* XPM */ +static char * 3dpie_xpm[] = { +"19 16 3 1", +" c #659510403CF3 s Background", +". c #B2CA8A289E79 s HiShadow", +"X c #3CF308202492 s LoShadow", +" ..X ", +" ...XXXX ", +" ... XXX ", +" .. XX ", +" .. XX ", +" .. XX ", +" .. XX ", +" .. XX ", +" .. XX ", +" .. XX ", +" .. XX ", +".. XX", +".. XX", +"..XXXXXXXXXXXXXXXXX", +"..XXXXXXXXXXXXXXXXX", +" "}; Index: external/mit/ctwm/dist/xpm/3dpyramid.xpm =================================================================== RCS file: external/mit/ctwm/dist/xpm/3dpyramid.xpm diff -N external/mit/ctwm/dist/xpm/3dpyramid.xpm --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/xpm/3dpyramid.xpm 3 Sep 2015 12:20:01 -0000 @@ -0,0 +1,23 @@ +/* XPM */ +static char * 3dpyramid_xpm[] = { +"14 16 4 1", +" c #EEEE1313E8E8", +". c #AEAE9696F8F8", +"X c #3C3C08082424", +"o c #545446466767", +" ", +" ", +" .X ", +" .X ", +" ..XX ", +" ...Xo ", +" ...Xoo ", +" ....Xoo ", +" ...XXooo ", +" ...XXXXXX ", +" ...XXXXXXX ", +" .XXXXXXXXX ", +" XXXXXXXX X ", +" ", +" ", +" "}; Index: external/mit/ctwm/dist/xpm/3dslant.xpm =================================================================== RCS file: external/mit/ctwm/dist/xpm/3dslant.xpm diff -N external/mit/ctwm/dist/xpm/3dslant.xpm --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/xpm/3dslant.xpm 3 Sep 2015 12:20:01 -0000 @@ -0,0 +1,10 @@ +/* XPM */ +static char * 3dslant_xpm[] = { +"4 5 2 1", +" c #3CF308202492 s LoShadow", +". c #B2CA8A289E79 s HiShadow", +" ..", +" .. ", +".. ", +". .", +" .."}; Index: external/mit/ctwm/dist/xpm/IslandD.xpm =================================================================== RCS file: external/mit/ctwm/dist/xpm/IslandD.xpm diff -N external/mit/ctwm/dist/xpm/IslandD.xpm --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/xpm/IslandD.xpm 3 Sep 2015 12:20:01 -0000 @@ -0,0 +1,60 @@ +/* XPM */ +static char * IslandD_xpm[] = { +"64 38 19 1", +" s None c None", +". c #8787C4C47474", +"X c aquamarine4", +"o c slate gray", +"O c gray85", +"+ c gray", +"@ c dark olive green", +"# c gray70", +"$ c peachpuff4", +"% c tan", +"& c orange red", +"* c red", +"= c black", +"- c slate blue", +"; c coral", +": c dark slate grey", +"? c #727277778585", +"> c gray50", +", c light sky blue", +" ... ..... ", +" ..... X..... ", +" .. X.XXX. ", +" ..XX..XXXXXX. oooO ", +" .....XX.XXX. Oo+ooO ", +" ......XXX@X..... O+++oo ", +" .XXXXXXXXX.XXXX. ooo OO++++oO", +" ..XXXXXX@@X.X@@@X. OOOooO++++oo+", +" . ..X.X.@.@.@XX@@. O+++oo+++oooo", +" . .X@.X@....@@X @ O++++o+++oooo", +" ..X@.@@X@@XX@. O#### OOO+oooooo+++", +" .X @@ @@@XX OOOOO##OO##ooo++oo++", +" .X .@ @@@X.$ OOOOO##OOOoo++++ooo+", +" . ... @ %$ OOOOOOOOOoooo++++oo+", +" .. %$ O######OOO+++Oo++++oo+", +" %$ OOOO####OOOOO++OOOO++++", +" %$OOOOOO####OOOO++OOOOO+++", +" %$OOOOOOO#O###OO++OOOOOOO+", +" %$OOOOOOOOOOOOOOOOOOOOOOOO", +" %$ OOOOOOO###############O", +" &&&&& %$ OOOOOOOO#OOOOOOOOOO# ", +" &&***&& %$ ", +" &&*****&& %$ ", +" &*******& %$ ", +" &*******& %%$ ", +" &*******& %$= ", +" &&*****&& ...%%==@@@@@@ ", +" &&***&& ......%$=$XXXX@@@. ", +"--------;&&&&&-----------.........$$=$@@@@@@@@@-----------------", +"---------;;-;;---------..............@@@@&&&&@@@----------------", +"--------;;-;-;;-------................@.@$&@@&@@::::::----------", +"-------;;-;;---------..........@@@.@@@...@&@@&@@@::::?----------", +"---------;;-;-;-----..............@@...XXX&XX&@&-&&>::&&&--&---&", +"-------;-;-;;;------......XXXXXX@@@@@XXX@@&@@&X&&::&:::::&-&---&", +"--------;;;;-;;---------....XXX@@@@@@@@@X@&@@&X&::>:::&&&&:&-&-&", +"---------;-;;---------------......XXXXX@@@&::&:&:::::&:::&-&-&-&", +"-------------------------------------::::-&::&:&:::::&::-&-&-&-&", +"-------------------------------------,:::&&&&::&::::::&&&&--&-&-"}; Index: external/mit/ctwm/dist/xpm/IslandW.xpm =================================================================== RCS file: external/mit/ctwm/dist/xpm/IslandW.xpm diff -N external/mit/ctwm/dist/xpm/IslandW.xpm --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/xpm/IslandW.xpm 3 Sep 2015 12:20:01 -0000 @@ -0,0 +1,59 @@ +/* XPM */ +static char * IslandW_xpm[] = { +"64 38 18 1", +" s None c None", +". c #8787C4C47474", +"X c aquamarine4", +"o c slate gray", +"O c gray85", +"+ c gray", +"@ c dark olive green", +"# c gray70", +"$ c peachpuff4", +"% c tan", +"& c orange red", +"* c red", +"= c black", +"- c slate blue", +"; c coral", +": c yellow", +"? c gray50", +"> c #727277778585", +" ... ..... ", +" ..... X..... ", +" .. X.XXX. ", +" ..XX..XXXXXX. oooO ", +" .....XX.XXX. Oo+ooO ", +" ......XXX@X..... O+++oo ", +" .XXXXXXXXX.XXXX. ooo OO++++oO", +" ..XXXXXX@@X.X@@@X. OOOooO++++oo+", +" . ..X.X.@.@.@XX@@. O+++oo+++oooo", +" . .X@.X@....@@X @ O++++o+++oooo", +" ..X@.@@X@@XX@. O#### OOO+oooooo+++", +" .X @@ @@@XX OOOOO##OO##ooo++oo++", +" .X .@ @@@X.$ OOOOO##OOOoo++++ooo+", +" . ... @ %$ OOOOOOOOOoooo++++oo+", +" .. %$ O######OOO+++Oo++++oo+", +" %$ OOOO####OOOOO++OOOO++++", +" %$OOOOOO####OOOO++OOOOO+++", +" %$OOOOOOO#O###OO++OOOOOOO+", +" %$OOOOOOOOOOOOOOOOOOOOOOOO", +" %$ OOOOOOO###############O", +" &&&&& %$ OOOOOOOO#OOOOOOOOOO# ", +" &&***&& %$ ", +" &&*****&& %$ ", +" &*******& %$ ", +" &*******& %%$ ", +" &*******& %$= ", +" &&*****&& ...%%==@@@@@@ ", +" &&***&& ......%$=$XXXX@@@. ", +"--------;&&&&&-----------.........$$=$@@@@@@@@@-----------------", +"---------;;-;;---------............:.@@:@XX@@@@@----------------", +"--------;;-;-;;-------.............:..@:@$XX@@@@?:?>--:---------", +"-------;;-;;---------..............:...:.@@@X@@@@????>:---------", +"---------;;-;-;-----...............:...:.:X::X@@::???::::---:::-", +"-------;-;-;;;------......XXXXXX...:.:X:X::XX:X@?:?>>-:----:---:", +"--------;;;;-;;---------....XXXXXXX:X:X:X:XX.????:??>>:>>--:::::", +"---------;-;;---------------......X:X:X:X:.??????:>>>>:>---:----", +"-----------------------------------::>::?:????>>>:----:--:-:---:", +"-----------------------------------:---:-:------:::----::---:::-"}; Index: external/mit/ctwm/dist/xpm/LRom.xpm =================================================================== RCS file: external/mit/ctwm/dist/xpm/LRom.xpm diff -N external/mit/ctwm/dist/xpm/LRom.xpm --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/xpm/LRom.xpm 3 Sep 2015 12:20:01 -0000 @@ -0,0 +1,55 @@ +/* XPM */ +static char * LRom_xpm[] = { +"68 34 18 1", +" s None c None", +". c peachpuff4", +"X c dark slate grey", +"o c tan", +"O c gray85", +"+ c yellow", +"@ c cyan", +"# c green", +"$ c lime green", +"% c light sky blue", +"& c orange", +"* c orange red", +"= c slate gray", +"- c black", +"; c blue", +": c gray", +"? c violet", +"> c coral", +" .. ... ", +" .. ............ .. .. ", +" ..XXXXXXX............ . . ", +" XXXXXXXX..XoXXXX..o..... . . ", +" OOO+@@@@@ .....XXXXXXXXXXXXXXoXXXXXXX.... ... ", +" #OOOO+@@@@@@@ ...oo..oooXXXXXXXXXoXXXoXX...XX.. ", +" $$$#OOO+@@@@@@@@@ .....oXXXXXXXXXXXXXXXooXXXXXX. ", +" $$$$#OOO+@@@@@@@@@@ ....XXXXXXXXXXXXXXXXXXXXXXXooXXXX. ", +" $$$$$$#OO+@@@@@@@@@@@ ....XXX.XXXXXXXXXXXXXXXXXXXXXXXXX.. ", +" %$$$$$$#OO+@@@@@@@@@@@@ XXXXX...XXXXXXXXXXXXXXXXXXXX. ", +" &%$$$$$$#O+@@@@@@@@@@@@@ X ...oooXXXXXXXXXXXXXXXXXXXX. ", +" &&&%%$$$$#OO+@@@@@@@@@@@@ oooooo.XXXXXXXXXXXXXXXXXXX. ", +" &&&&&%$$$$#O+@@@@@@@@@@@@ oooooooo.XXXXXXXXXXXXXXXXX. ", +" **&&&&&%$$$=====@@@@@@@@@@@ -----------XXXXXXXXXXXXXXXXX. ", +" @@***&&&%%==#+@==@@@@@@@@@@ -$-$$$$$$$--XXXXXXX-XXXXXXXX. ", +" @@@@@****==$XXX@==@@@@@@@@@ -$-$$$-----..XXXXXXXXXXXXXXX ", +" @@@@@@@@@=*XXXXX@=@@@@@@@@@ -$----oooooo.XXXXX==XXXXXXXX ", +" @@@@@@@@@=@XXXXX@=@@@@@@@@@ -$-;==oooooo..XX=oo==XXXXXXX ", +" @@@@@@@@@=@XXXXX*=@@@@@@@@@ o-$-;==ooooooo..Xo:oo=XXXXXX. ", +" @@@@@@@@@==@XXX%==****@@@@@ oo-$-oooooooooo..Xo::o=XXXXXX. ", +" @@@@@@@@@@==@+O==%&&&&***@@ ooo-$-oooooooooooooo::o=XXXXXX. ", +" @@@@@@@@@@@=====$$%&&&&&&** ooo---ooooooooooooo::===XXXXXX ", +" @@@@@@@@@@@@+OO#$$%&&&&&& ooooooo.oooooooooooo:==..XXXXXX ", +" @@@@@@@@@@@@+OO#$$$%%&&&& oo::ooo..ooooooooooo:...oXXXXXX ", +" @@@@@@@@@@@@+OO#$$$$%&& ::oo..oooooooooooo.oooXXXXX ", +" @@@@@@@@@@@@+OO#$$$$$%& ooooo::ooooooooooo.oooXXXXo ", +" @@@@@@@@@@@+OOO#$$$$$ oooooooooooooooooooooooXXXo ", +" @@@@@@@@@@+OOO#$$$$ oo???>oooooooooooooooooooooo ", +" @@@@@@@@@+OOOO#$$ ???oooooooooooo.ooooooooooooo ", +" @@@@@@@+OOOO# ooooooooooooo.ooooooooooooo ", +" @@@@@+OOO ooooooooooo...ooooooooooo ", +" oooooooooo.....oooooooooo ", +" oooooooooo ..oooooooooo ", +" ooooo .ooooooooo "}; Index: external/mit/ctwm/dist/xpm/LRom1.xpm =================================================================== RCS file: external/mit/ctwm/dist/xpm/LRom1.xpm diff -N external/mit/ctwm/dist/xpm/LRom1.xpm --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/xpm/LRom1.xpm 3 Sep 2015 12:20:01 -0000 @@ -0,0 +1,57 @@ +/* XPM */ +static char * LRom1_xpm[] = { +"68 34 20 1", +" s None c None", +". c maroon", +"X c gray15", +"o c #8B8B5B5B7A7A", +"O c peachpuff4", +"+ c dark slate grey", +"@ c white", +"# c tan", +"$ c slate blue", +"% c gray85", +"& c yellow", +"* c cyan", +"= c blue", +"- c green", +"; c lime green", +": c light sky blue", +"? c orange", +"> c orange red", +", c slate gray", +"< c black", +" ..... ", +" ..... XXXXXXXXX oooooooo ", +" ..... XXXXXXXXX oooooooo ", +" OOOOOOO..... XX+++++XX oooooooo ", +" OOOOOOO..... XX+@@@+XX oooooooo ", +" OO+++OO..... XX+@@@+XX oooooooo ######### ", +" OO+@+OO.....$$$$$$$$XX+@@@+XX%%%&***** oooooooo ######### ", +" OO+@+OO.....$======$XX+++++-%%%%&******* oooooooo ##OOOOO## ", +" OO+@+OO.....$======$XXXXX;;;-%%%&********* oooooooo ##O@@@O## ", +" OO+@+OO.....$======$XXXX;;;;-%%%&***********ooooooo ##O@@@O## ", +" OO+++OO.....$======$XXX;;;;;;-%%&***********ooooooo ##O@@@O## ", +" OOOOOOO.....$======$XX:;;;;;;-%%&************oooooo ##O@@@O## ", +" OOOOOOO.....$======$XX?:;;;;;;-%&*************ooooo ##OOOOO## ", +" OOOOOOO.....$======$X???::;;;;-%%&************ooooo ######### ", +" OOOOOOO.....$======$X?????:;;;;-%&************ooooo ######### ", +" OOOOOOO.....$======$>>?????:;;;,,,,,***********oooo ######### ", +" OOOOOOO.....$======$**>>>???::,,-&*,,**********oooo ######### ", +" OOOOOOO.....$======$*****>>>>,,;+++*,,*********oooo ######### ", +" OOOOOOO.....$======$*********,>+++++*,*********oooo ######### ", +" OOOOOOO.....$======$*********,*+++++*,*********OOOo ######### ", +" OOOOOOO.....$======$*********,*+++++>,*********oooo ######### ", +" O+++++O.....$======$*********,,*+++:,,>>>>*****oooo ######### ", +" O@@@@@O.<<<.$@@@@@@$**********,,*&%,,:????>>>**OOOo ######### ", +" O+++++O.@@@.$@@@@@@$***********,,,,,;;:??????>>@@@o #OOOOOOO# ", +" OOOOOOO.<<<.$@@@@@@$X************&%%-;;:??????OOOOo #@@@@@@@# ", +" O+++++O.....$@@@@@@$X************&%%-;;;::????ooooo #@@@@@@@# ", +" OOOOOOO.....$======$X ************&%%-;;;;::?oooooo #OOOOOOO# ", +" OOOOOOO.....$======$X ************&%%-;;;;;:?oooooo ######### ", +" OOOOOOO.....$$$$$$$$XXX***********&%%%-;;;;;ooooooo ######### ", +" ???????????????????????????**********&%%%-;;;;??????????????????? ", +" ????????????????????????????*********&%%%%-;;???????????????????? ", +" *******&%%%%- ", +" *****&%%% ", +" "}; Index: external/mit/ctwm/dist/xpm/arthur.xpm =================================================================== RCS file: external/mit/ctwm/dist/xpm/arthur.xpm diff -N external/mit/ctwm/dist/xpm/arthur.xpm --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/xpm/arthur.xpm 3 Sep 2015 12:20:01 -0000 @@ -0,0 +1,48 @@ +/* XPM */ +static char * arthur [] = { +"64 38 7 1", +" s None c None", +". c gray85", +"X c lightskyblue", +"o c blue", +"O c gray100", +"+ c black", +"@ c red", +" ...............XXXXXXXXX............ ", +" ...........XXXXXXXXXXXXXXXXX.......... ", +" ..........XXXXXXXoooooooXXXXXX......... ", +" ........XXXXXXXoooooooooooXXXXX.......... ", +" .......XXXXXoooooooooooooooXXXXX......... ", +" ......XXXXXooooooOOOoooooooXXXXX......... ", +" ......XXXXXoooooOOOOOOooooooXXXXX......... ", +" .......XXXXoooooOOOOOOOooooooXXXXX......... ", +" .......XXXXooooooOOOOOOOoooooXXXXXX......... ", +" ......XXXXXoooooOOOOOOOoooooXXXXXX......... ", +" ......XXXXooooooOOOOOOooooooXXXXXX......... ", +" ......XXXXXoooooOOOOOOOooooooXXXXX......... ", +" ......XXXXXXooooOOOOOOOOOOooooXXXXX........ ", +" .....XXXXXXXoooooOOOOOOOOOOOooooXXXX....... ", +" .....XXXXXXXooooooOOOOOOOOOOOoooooXXXX..... ", +" ....XXXXXooooooooooOOOOO++O++OOooooXXXX.... ", +" ....XXXXXoooooooooooOOOOO++O++OOooooXXXX... ", +" ....XXXXoooooOOOOoooOOOOOOOOOOOOooooXXXX.. ", +" ...XXXXoooooOOOOOOOoOOOOOO@@@OOOooooXXX... ", +" ...XXXXooooOOOOOOOOOOOOOOO@@@OOOoooXXXX... ", +" ...XXXXoooOOOOOOOOOOOOOOOOOOOOOooooXXX.... ", +" ....XXXXoooOOOO+OOOOOOOOOOOOOOOooooXXX...... ", +" ....XXXXoooOOO+OOOOOOOOOOOOOOooooooXXX...... ", +" ......XXXooooOO+OOOOOOOOOOOOOOoooooXXXXX..... ", +" ........XXXooooooOOOOOOOOOOOOOOOOooooXXXXXX..... ", +" .........XXXooooooOOOOOOOOOOOOOOOOoooooXXXXXX.... ", +" .........XXXoooooooOOOOOOOOOOOOOOOOoooooXXXXXX.... ", +" .........XXXooooooooOOOOOOOOOOOOOOOOOOooooXXXXX.... ", +" ........XXXooooOooooOOOOOOOOOOOOooOOOOOoooXXXXX.... ", +" .........XXXoooOOOoooOOOOOOOOOOOOooOOOOOoooXXXX..... ", +" .........XXXoooOOOooOOOOOOOOOOOOooooOOOooooXXX...... ", +" .........XXXoooOOOOOOOOOOOOOOOOoooooooooooXXXX..... ", +" ........XXXXXooOOOOOOOOOoooooooooXXXoooooXXXX...... ", +" .......XXXXXXooOOOOOOoooooooXXXXXXXXXXXXXXX...... ", +" .......XXXXXoooooooooXXXXXXXXXXXXXXXXXXXX..... ", +" .........XXXXoooooXXXXXXXXXXX......XXXX... ", +" ........XXXXXXXXXXXXXXXXXX.............. ", +" ........XXXXXXXXXXXXX................ "}; Index: external/mit/ctwm/dist/xpm/audio_editor.xpm =================================================================== RCS file: external/mit/ctwm/dist/xpm/audio_editor.xpm diff -N external/mit/ctwm/dist/xpm/audio_editor.xpm --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/xpm/audio_editor.xpm 3 Sep 2015 12:20:01 -0000 @@ -0,0 +1,63 @@ +/* XPM */ +static char * audio_editor_xpm[] = { +"48 48 12 1", +" s None c None", +". c #000000000000", +"X c #7F7F7F7F7F7F", +"o c gray70", +"O c #FFFFFFFF0000", +"+ c #A6A6A6A6A6A6", +"@ c #FFFF14149393", +"# c dark olive green", +"$ c lightskyblue", +"% c gray100", +"& c dark slate grey", +"* c #727277778585", +" ", +" ", +" ", +" ............ ............ ", +" ..XXXXXXXX..X. ..XXXXXXXX..X. ", +" ............XXX. ............XXX. ", +" .ooOoOoOoo.XXXX. .ooOoOoOoo.XXXX. ", +" .oooO+Oooo.XXXX. .oooO+Oooo.XXXX. ", +" .ooOOOOOoo.XXXX. .ooOOOOOoo.XXXX. ", +" .oooO+Oooo.XXXX. .oooO+Oooo.XXXX. ", +" .ooOoOoOoo.XXXX. .ooOoOoOoo.XXXX. ", +" .ooooooooo.XXXX. .ooooooooo.XXXX. ", +" .ooooOoooo.XXXX. .ooooOoooo.XXXX. ", +" .OoOoOoOoO.XXXX. .OoOoOoOoO.XXXX. ", +" .oOoOOOoOo.XXXX. .oOoOOOoOo.XXXX. ", +" .OoOOOOOoO.XXXX. .OoOOOOOoO.XXXX. ", +" .oOOOOOOOo.XXXX. .oOOOOOOOo.XXXX. ", +" OOOOOOOOOOOOOXXX. OOOOOOOOOOOOOXXX. ", +" .oOOOOOOOo.XXXX. .oOOOOOOOo.XXXX. ", +" .OOO+O+OOO.XXX.. .OOO+O+OOO.XXX.. ", +" .oOoOOOoOo.X.. .oOoOOOoOo.X.. ", +" .O...O...O.. .O...O...O.. ", +" O@ ######### O@ ", +" @ #$$$$$$$$$# @ ", +" @ #$%%$$$$$$# @ ", +" @ #$%$$$$$$$# @ ", +" @ #$$$$$$$$$# @ ", +" @@@@@@@#$$$$$$$$$#@@@@@@@@ ", +" #$$$$$$$$$# .. ", +" ########### .. . ", +" &&&&&&&&&&&&& .. .. ", +" &ooooooooooo& .. .. . ", +" &&&&&&&&&&&&& . .. . ", +" &%*%*%*%*%*%*%& .. . ", +" ... &%*%*%*%*%*%*%*%& . .... ", +" ..... &&&&&&&&&&&&&&&&& . ..... ", +" ..... . ..... ", +" .... ... .... ... ", +" . ..... ..... ", +" . ..... ..... ", +" . .... ... ", +" .. . ", +" . .. . ", +" .. .. . ", +" .. .. ", +" .. . ", +" .. ", +" "}; Index: external/mit/ctwm/dist/xpm/background1.xpm =================================================================== RCS file: external/mit/ctwm/dist/xpm/background1.xpm diff -N external/mit/ctwm/dist/xpm/background1.xpm --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/xpm/background1.xpm 3 Sep 2015 12:20:01 -0000 @@ -0,0 +1,41 @@ +/* XPM */ +static char *background_xpm[] = { +/* width height ncolors chars_per_pixel */ +"32 32 3 1", +/* colors */ +" c #868686", +". c #ABABAB", +"X c #656565", +/* pixels */ +" ..XXXX.. . ..XXXX.. .", +" ..XX XX.. ..XX XX.. ", +"..XX X XX....XX X XX..", +" X . XX X . XX", +". X. X", +". X X X. X X X", +". . . X. . . X", +". X. X", +". X. X", +". X. X", +". X. X", +". X. X", +". X X X. X X X", +". . . X. . . X", +". X. X", +".. X . .. X . ", +"XX.. . ..XXXX.. . ..XX", +" XX.. ..XX XX.. ..XX ", +"X XX....XX X XX....XX ", +" XX X . XX X .", +" X. X. ", +" X X. X X X. X ", +" . X. . . X. . ", +" X. X. ", +" X. X. ", +" X. X. ", +" X. X. ", +" X. X. ", +" X X. X X X. X ", +" . X. . . X. . ", +" X. X. ", +"X . .. X . .. "}; Index: external/mit/ctwm/dist/xpm/background2.xpm =================================================================== RCS file: external/mit/ctwm/dist/xpm/background2.xpm diff -N external/mit/ctwm/dist/xpm/background2.xpm --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/xpm/background2.xpm 3 Sep 2015 12:20:01 -0000 @@ -0,0 +1,154 @@ +/* XPM */ +static char *background2_xpm[] = { +/* width height ncolors chars_per_pixel */ +"128 128 19 1", +/* colors */ +"` c #191315", +"a c #846342", +"b c #342114", +"c c #806B61", +"d c #110F0E", +"e c #8D7360", +"f c #594123", +"g c #3F343B", +"h c #372915", +"i c #988067", +"j c #6C4E35", +"k c #725C58", +"l c #A58C72", +"m c #231A1D", +"n c #2D262A", +"o c #4A3118", +"p c #594544", +"q c #615259", +"r c #030203", +/* pixels */ +"fohofffohffobofffohbbmbhfjaeeiiiiiiiiieajfohhbbhfjjjfhbmhffjffoohbdrrmpqqqpggggqkccqgmmngggggpkcccqpggggg`dnpccecckpgggnmmrr`qaj", +"ooofjfoooffoboffohbbbbbofjaakccccccceaajfhbbbmmhffffobbboffjjffobmdrdggppqqpgggqcecqgm`nggggpqkcccqpgnnnnddnpceecccqpggm`mdrdgfo", +"offjffoofffohoffobbbbbhffpgm```````mgpjfohbbbbbbooooobbbofjjjjfob`rr`nggpqqpgggqceekgm`mngppqqqqqqqpgnmm`ddmpceeecckpgn`mn`rrmbb", +"hofffohffjfohofobhohhhohm`drrrrrrrrrd`mhhhhhhhhbbhofoohhofjajfobh`rrmmmnpkkqpgpkceckgm``ngpkkqqppqqpgn`d`ddmgkeeeeccqgm`ngmrr`bb", +"hhooohofjjfohooohofohm`drrrdgkcqpndrrrrd`mhoooobbofffohhfjaajfbbhdrdmd`ngqkqpppkcccqpgn`mgpkkqppppppgndd```mgqceeeccqgmmgpgdrdho", +"ohhbbhofjjfobbbhohm`drrrdgqccqkpppqpndrrrrd`mhbhojjjfhbhfjaajohhmrr``rdmgpqqpqqkckqqqpg`dnpkkqpggpppgmddmm``npceeeckpn`mgpq`rrmo", +"oohbbhfjjjfobmbm`drrrdnqccqkcckpgngppqpndrrrrddmgpajfbbofaajfoof`rrmdddmggppqkcckqpqqkpndmpqqppggggggmd`nm``ngkceckqpn`mgppmrr`h", +"ffhbbhfjjjfhmddrrrdnqcckkceeeckpgnnggngpqpndrrrrd`mhombojajfhhfhdrdmddd`mngpqcccqppqcckg`mgpppppggggn`dmnm``ngqcccqpgm`mgggndrdh", +"ffhbbhfpgm`drrrdnpccqpqqkceeecqgggggn`dmgqqqgndrrrrd``bojjfobhfmrr``dd`d`mngqcccqppqcccpnmnggpppgggnm```m```ngpqkqppgm``ngnmdrrm", +"fobmbhm`drrrrnpcckgngpkccccccqpgggggn`d`gqccqqqgmdrrrrd`mhobbof`rr`dd`````mgpcccqppqceekgm`mggppggn`dd```d`mnggppppggmdd```ddrr`", +"mhb``drrrrmpcckkkgnngqccccckqpggggggndd`gpceeekqqqgmrrrrrd`mhhndrdnmmnnmm`mnpqcckqqkceecpnd`ngggggn`dddddd`mnngggggggn`ddd```drd", +"dddrrrrmpcckqpqkqgmngqccccqpgggggggnmddmgpkccckpggpqpgmrrrrrdddrrdgggggnm``ngpqccccceeecqgmd`mgggnmddddddd`mmmmmnngggnm```mmmdrr", +"rrrr`pcccccckqqqpn`mgqccckpggnggggnnmd`ngppqppppgnnmgpqpg`rrrrrrrdgpppggn``mggpkceeeeeeckpg`d`nggnm`dddddd``````mnggggnnnnnnndrr", +"rdgkcqggqceeckqpgm`mgqkckqgnnnngnnm`ddmngggggggggm`d``mgpqpgdrrrrrdmgqpgndddngpceeceeecckqpn`d`mnnnmmddd``dd``dddmngggggnngmdrrr", +"rckgmd`gqceeccpgn`mngppqqpgnnmnnm``dd`mnggnnnnnnn`dd`d`mggppqrrrrrrrd`mgn`ddmnpceckkcccckqqgg`ddmnnnn`d`m`d`mm`dd`ngpppgm`drrrrr", +"rkgdddmgqcelecpn`dmngggggggnnmm``````mnnnm````mmmdd```d`ngqcndrmldrrrrrd`m`dmnpcecqqcccckkkqgn`d`mgggmdmnmdmnm`dddmggm`drrrrrddr", +"rgkdd`ngqceeckgmddnnngnnnnnnnm``mnnnnnmmmddd`mmmm`mmmmm`mgqcmrrpajfmdrrrrrd`mgqcecpqkcccccckpgn``mgggmd`mm`mnnmdddm`drrrrrmpilnd", +"r`cmmngpqccckpg`ddmnnmm````mm`dmnggggnm`ddd`nnggnnmmnnn``gqq`rrijfjaajo`rrrrrd`mgqqpkcecccccqpgm`mggnmdd`dd`mnmdddrrrrrmpiliajfm", +"drkgggpppqqqpgndddmmmm`ddd````mngqppgn`d``nggppppgnnnnn``gqgdrmlfffffjjajfmrrrrrd`mgqceecccckpgm`mngn`dddddd``drrrrrmpilijjfffoh", +"`rgkgqqqpgggnm`ddddd`dddddd```ngqckqgnddmnggpkkkqpgnnnn`dnqmrrqiffohofaeaaajphdrrrrd`mgqcccckpgmd`nnmm`dddddrrrrrmpiliafbofohhoh", +"mr`cpkkqgnm``ddddddd````mmmnnngpqcckpmddnggqkccckqpggnn``gq`rrijfooofaiiiiicaaajfmrrrrd`mgqckpg`ddmmmmmddrrrrrmpilieaffhoofhbboh", +"bdrcqkkpnm`d`dddddd`mm``mngggggpkcecpmd`ggpkcceeccqpgnmdmggdrmlohbofjilliiilllckjajfbdrrrd`mgpgmdd`m`drrrrrmpiliaaaajfohohhhoofo", +"o`rpkqpgn`mmnmm```mnnnm`ngqkkqppkcccpn`mgpqkceeeeccqgn`dmgmrrqebbhfaelllillliillicjjjajodrrrd`mm`ddrrrrrmpilijffjjjjjfohhbbffjfo", +"omrmcpgn``mnngnm``nggnmmgqceecqqkcckpnmnpqqcceeeeeckgmddnp`rdipbhfjeillliiiiiiiieajfffjjajfmrrrdrrrrrmpiliajfffjjjjjfohbbbojjjfo", +"fgdrcpn`ddmggggn`mnnnnngpceeecckkccqgmmnpqqcceecceecg`d`ggdrnloofaaiiiiiiieiiiieajfffffoofjaajhdrrmpiliejfffffjjfffffobmbofjajfo", +"jq`rpq`dddmgpppn``nnnngpceeeeeeckqqpgm`npqqcccccceecg`d`gmrrjehfjaiiiiieeeeiiieajffffffoobbofpjaaaliieajffffjjfoohhhhbbmhfjaajff", +"aemrmc`dd`mgpqpn`dm`mnpceeccceeckqpgg`dmgpqcccccccckgm`ng`rdijfjaiiieeaaeiiiiiajjfffffffohoffjffjaaeaajffoffffohbbbbbbbbofjajfff", +"aegdrcgd`mngpqpnmd`dmgqccckkceecqpggn`dmggpccccccccqgmmngdrhlfjaiiiieaaeiillieajjjjffffoooffjjjjjaaajfobbhoohoofoohhbmmhfjjjfffj", +"jap`rpq`mngpppggn``dmpcckqqkceecqpggnm``ngpceccccckpn`mnmrrkefaiiiiieeeillllieaajjjffffohoffjffjjjjjfhbbbhhmbofjjjffobbhffffffff", +"fffmrnc`ngpqpgggnmm`nqccqpqceeccqpggnmm`mgpceececcqgn`mn`rdlaaillliieiiillllieaaajjffffobhffffffffooooooooohofaeeajfobbboffoooof", +"oofhddcgnpqkpggngmmmgkeckqkceeckkqpggnn``npceeeeckpnm`mndrglaiilllliiilllllliieaajjffffobhofffffobbofjjjjfffjeiiiejfobbbhoooohhh", +"bofp`rppgqccqgnngmdmpceeccceeckkkqppggn``npccecckqgmddmmrrcieillilliiillillliieaajjjjjfohbhhohhoooffjaaaajjaeillieafobbbbhhhhbbb", +"ofjamrncpcccqggnnddnpceeeeeeccccckqppgg``npqkckkqpgmddm`rdliiiiiiiliiilliillliiaaajjjjjffhbbbbbofjaaaeeaaaaeillliejfhbbbbhhhhbbb", +"fjaagddcpceekpgm`d`gqccccccccccccckqpgg`d`gppppppgn`ddmdrgliliieiiliiiliiiillieaaaaaajjjfohmbbofaeeieeeeeeeilllliajobmbhhooohbbh", +"fjaap`rpqccccpg`d`ngqkkkqqkkccccccckqgn`ddnngggpggn```mrrciiieaeiiiiiiiieeillieaaaaaajjjjfobbojaeiiiiiiiieiilllliafhbbooooooohof", +"jaajfmrncqcccqgm`ngppppppppqkcccceccqgnm``m``mgggnm````rdleieaailiiiiieaaeiliieeeeeaaaaajfobofaiiiiiiiiiiiilllliejobhofffffoooof", +"jjjjfhddcpcccpgnnggpggggggpqkcceeeecpggnggnmd`nggnm```drpiliaaailieilieaeilliiiiiieaaaaajfohfjeiliiiiiiiiiilllliafohfffffffffffj", +"jjjjjp`rqpkckpnnngggnmmmnggpqkceeeckpgggppgn`d`nnnm`ddrrcelieeiliieilieeiiliiiiiiiaaaaaajooojaillliiillllliiiiieafbofjjjfffffjjj", +"jaaaeemrncqqpgmmnnnm`dd`ngggpkceeecqpppqkcqpgmdmnnm`ddrdleiiiilieaeiliiilliiilliieaaaaajfoofailllliiillliiieeeeajoofaaajjjjjajjj", +"aeiliigddcppgn`d`mmm`dd`ngggpqceeckppqceeeckpnd`nnm`ddrpiilliiieaaeillilllliilllieaaaaajfofjaillliiiilliieaaaaafhofaeeaaaaaaaaaa", +"eillliq`rqpgnm`d``mnn`d`nggggqceccqqkceeeeecqn`mnnm`drriiillieaaaailllllllliilllieaaajjffffjeilliiiiiiieajjffjjobfaiiiieeiiiieaa", +"illliicmrgcnmmmmnnngn`d`nggggqkccqqcceecceeekg``nnm`dr`laeiieaaaaeillliiiiiiillieajjjjfffffjeiiieeeeeeajfohhohhboailllliilllliii", +"lieeiiigddcgmnnggppggmd`nggggpqqqqkceckqccecqgm`mm``drpijaaaaaaeiiilliieeeeiilieajfffffffffjaeeaaaaaaajfobbbbmbfailliillllllliil", +"iaaaaiiq`rqpnggpqqqpgmddnngggppppqccckppqcecqgnm`dddrrijfjjjaaiiilliieaaaeiiiieajfooofffoffjjaaajaaajfohhhohhbojilliiiiiiiilllii", +"ajjjaiicmrgkgpqkkkqpgmddmnnggppppkcckpppqcccpggnn`ddrrlpfjjaeiillllieaaaeillieajfoohofffooffjjjjjjjjfhbhffjfffjeiieaaaaeeeiiiiii", +"jfffjilenddcgqcccckpgmddd`nggppgpcecqggpkccqgggggn`drdijfjaiilllllieaaaeiiliiajffhhoofffohoofffjjjjfobofjaajjjailiajjjjaaaaeeiea", +"jfffailcmr`cgkceeckpgm`dddmggpppqcecqgpkccqpggpqpgn`rrpifaillliiiieaaaeilliieajffooofffohbbhoffjjjfoofjaaaaaaaeiiejfffjjaaaaaeaa", +"jffaiiiq`rgkgkeeeckpnm```ddngqqkkeecqpqcccpgggqccqgmrrmlaiilliiieaaaaaiilllieajffoofffoohbhbhoffffoofjaeeeaaaeiiiafffffjjaaaaaaa", +"ajjiliagdrkpgkeeeckpnmmmnddmpkccceeckkccckpggpqcccqndrdiiiiieeeaaaaaaeiillliiajffooofoohooohbofffoofaaaeaaaaaeiiejfoffjjaaaeeiea", +"ieiiiajmr`cngqceeckpgnnnn`dmgkeeceeecccckppgpqkeeekndrrqllieaaajjjaaeeiiillliajfohhooooofffhmhfohofjaaaaaaaaailiajfoffjaeiiiiiii", +"ilieaff`rgkmgpceeecqgnnnn``mgceeceeeecckpppppqceeekg`rrnliaajjjjjjaaaaeeillleafobbbbhhofjjfohofobofjajjjjjjaailiajjfjaeiilllllll", +"iieajfhdrcpmngqceeckpgnmmddmpceeccecckqppgppqkceeckgmdrdiijjffffjaaaaaaailliajobbbbbbhffffoofffobofjjffffjaaillleajjaiiiiillllli", +"aajjjfmrmcgnngpceeecqgn``ddnpceeccckpggggppqqkccccqpg`rrqijffoffjjajjjaeilieafobbbhbbofffhbojjjfohoooooffjaeiillieeeilliiiiiiiie", +"jjjjjf`rpkgnmngkeeecqgnd`dmgpcceeecqgnnngpqqqkccckqpgmrrnljohhofjjjffjailliajfoooohbbbhoooojaaafohhbhbofjaeiiiiiliiilliieeeieaaj", +"ffjjjhdrcqgnnngqcecckgmdmnggpqkceecpn``ngpqqqqqkkkqqpgdrdiabbhffjffffjailleajfffoohbbmbbofjaaajfobbbbhfjaeieeaeiillliieaaaeeajff", +"ofjjjmrmcpggnngqceeeknddngppggpkcckgmddmgqkqpppqkkkkkq`rrqibbhfffffffaillieajjffohbbbbhhofjaaajfhbbbhojaeieaajaailllieaaaaaajohb", +"fjjjf`rpkpggggpqceecqndmgppggnggqkqg`ddmgqqqpppqkcccccmrrnlobooffoffjeiliieajjfohbbbooffffjaajfobmhhofjaaaajffjaeiiieaaaaaafobbh", +"faajhdrcpggppqqkccccpn`npqpgnmmggpgn`ddmgpppggpqkkcceegdrdijhooooofjaillieaajfobbmboffffffjjjjfbmmhofjjaajjffofjaeieaajaajjob`mo", +"aaaamrmcggpqkccccckqgnngqqggm`mnngnmdd`mgggggppqqkccccq`rrqihhohoofaiiiieaajfhbbbhoffffoffjjjfobbmbofjjjjffooofjaeeeaaaajjfhbmof", +"aiep`rpqngpkceeckqpgmmgpqpgn`d`````ddd`mnnggppqpqkcccppmrrnlfbhbofaiiieaaajfhmmmhfffffooffjjffhbbmbofjjjffohhofjaeeeaaaajffbbhfj", +"iiigddcgngpceeeckpgmdmgppgnm`ddddd`ddd``mmngpqqqqcccqgggdrdijbhhfjeiieaajjfob`bhffjjfoooffjjfohhhbbofjjjfffooofjaiieeaaajffoofje", +"liemrncnngqceeeckgn``nggggn`dddddd```````mngpqqqqcecpggq`rrpimhfjeiiajjjjffbmbofjjjfobbhfffffoohhbhffjjjfffoofjaeiiiieeajffofjai", +"llq`rpqggpccceecqgm`nngggnn`dd```mnngnm`mngpqqqqkcecpgpqmrrhlofjaiiajjjjjffhoffjjjfobmboffffooohhhofjjjjjffoffjeiiiiiieajfffjail", +"llgddcpgpqceeeecqgmmngggnnm`ddm`mmngpgnmmggpqqqkceecpppkgdrdijfaiiajfjjjjjfffjjajfobbmbhooooooobbhfjjajjfffofjaiillliieajffjaill", +"icmrncppqcceeeccqgmmnnnnnnm`ddmmmngpqpgnngpqqqqkceecqqqcq`rrpiaiiajfjaaaajjjjaajfobbhbbhooooooobbojjaajjffffjaeilllliieajjjaiili", +"egdrqqqqkceeecckpgn``mnnnnmdddmmngpkcqgnngqkkqqkcceckkcccmrrmliiajffaaaaajjjaajfhbhbbbbhooffohbbofjaaaajjffjaeillllliieaaaiiiiie", +"amrdcpkccccecckqpgn`d`nggnn`ddnngpqccqgnnpkccqqqkceccccccgdrriiijfjaaeeaajjjjjfobbohbbbhofhm``d````mgqajjjjaeilllllliiieeilieaaa", +"p`rnccccccccccqpggnm`d`nggn`d`ngpkcckpgnnpccckppqceeccecckmrrpiajjaaeieaajjjjfobmmbbbmbhm`drrrrrrrrrd`mgpjaeillllllllliiiiieajjj", +"gdrqkcccccccccqgnnnnn`dmgggmdmgpkcccqgnmnpccckpppceeccecccgdrmlajaeeieeaajjffoobbbhhhmddrrrdgkcqpndrrrrd`mgqcllllllllllliieajjjj", +"mrdckcckkcceecpgm`nggm`mgpgmdmpkccckpgmmgpkcckpgpkeccccceeq`rrieaeeiieaajjfffoobbhm`drrrdnqccqgpppqpndrrrrd`mgqcllllliiiieajjjja", +"`rgccckqkcceecpn`dmggnmngppmdnqceccqpn``ggpkkqpggqccckcceecmrrpiiiiieeaajffofohm`drrrrnpcckpgggggm`gpqpndrrrrd`mgqciieeeeaaaaaaq", +"drqqeckqqceeekgn`d`nggnmngpndgceeekpgmd`nggpqqpggpkkkkkceeegdrmliiiiieajfoohm`drrrrmpccqqqqpgggnmd`mngppqpndrrrrd`mgqaeeeeaaaaeg", +"rdckcckqkceecqgm`d`mnnnmmngm`gceecqgnd``nngpqqpgggqkcccccccq`rriiiiiieaphm`drrrr`gcckg`mgqqqpgn``mgggppppppqpndrrrrd`mgqciieeecm", +"rgccccckcceccqgm`dd`mnnm``mdmgceecpn`ddd`mggpppgggqccecckqkcmrrpiiicqgm`drrrrdgkckpggm`mgpqkpn`dmnggppqkqqpggpqpndrrrrd`mgqciiq`", +"rkqeecccccccqpgm`ddd`mnnmdddmgkeecpndddddmggppggggqceeeckqkcgdrmlggm`drrrrdgqccpm`mnnm`mgpqqpmd`gggppkcccqpgm`mgpqpndrrrrd`mggnd", +"rcqeeeeccckqqpgmddddd`nnnnm`mgqcccpmdddddmgggggggpqcceecckkcpdrrdddrrrrdnqccqpnmdd`mm`dmgpqpgmdmgggpqcceckpn`dddd`gpqpndrrrrdddr", +"rdgceeeeccqqpgn`dd`dd`nggpgnnngqckpn`ddddmgggggggppqqkcccckkgdrrrrrrrmpcckpppggnmdd`mddmggpgnmmnggpqcceeekgmddmm`d`ngppqpndrrrrr", +"rrdmgqceecqpgn`d``mdd`ngpqpgnngpqqpgmdddd`ngggggggggppkccqgmdrrrrr`pcckpgppqqpgnm`dddddmnggn``mngppkceeeekgmd`nnmmnggpgggpqpndrr", +"rrrrd`mgqcqgg`d`mm```ngpqqpggnngpppgn`ddddmngggggggggpqgm`drrrrrrdccpnngpqkkqpggnmmddddmnnm`ddnggpqcceeecqgmmmgggggggggnm`mgpqrr", +"rdrrrrrd`mggmd`mnm``mggqqqpggnnngppggmddddmnggggnmmmnm`drrrrrdrrrcppgnggqcccqpggnnnmddd```ddd`nggpkceeeecqgmmngpppgnnmmm`d``mdrr", +"ajpmdrrrrrd```ngn`d`ngpqqqpggnnngggggn`ddd`nggggm```drrrrrmpil`rrkqpgggqccccqpgggggnm`ddddddmnggpqkcceeckpgmmnpqqpgm`d``dd`mndrm", +"icaajpmdrrrrrd`mn`dmgpqqqppggggnnggggnmdddmnngnm`drrrrrmqiliicgdrgcqpgqcceckqpggggggn`dddddmngggpqkcccccqgnmmgpkqpnm`ddddd`nmrrp", +"elliajajpmdrrrrrd``ngpqqqpggggggnngggnm`d`mmm`drrrrdnqiliiilllcmrdckqqcceeckpggggggggmdd`mmnggggppqkcckqpgnmngqkqgm`m``dddmg`rri", +"lllijoojaajpmdrrrrrd`mgqqpggggggnmnnggnm```drrrrdhkiliiilllllllgdrqkcceeeecqpggggpppgmddmnnggppggpqkkkqpgm``npqqpn``mm`dd`ngdrml", +"lliafffjaieaajpmdrrrrrd`mgpgggggnmmnnnm`drrrrdgclliiiiillliiillq`rncceeeeecqpggggpppgn``nggppgggggpqqqpgn`dmgpppgm`mnnmmmngmrrqi", +"llijoojaiillieaajpmdrrrrrd`mgggnnm```drrrrdpclliiiiliilliieeeilcmrrcceeeeeckpnnngpppgn`mngpqpgnnggpqppgm`d`ngpgn``mmnnnnggp`rrii", +"liafhojeillllllieaajpmdrrrrrd`mnm`drrrr`pcliejaeilllllliaaaaaeilgdrpkceeeeckgnmngpppgn`mgpqqgnmmngpppgn`d`ngggnmdmngnnnggpgdrnll", +"iiafbfaillllliiiilieaajpmdrrrrrdrrrr`pilieajjjeilllllliajjjjaeilq`rmcceeeeckgmmmgpppgmdmgqqqgmddmggpgn`dmngggn`d`nggggggpkmrrqil", +"iejfojilllliiiieilllieajajpmdrrdmpjeiiaajjjjjaiilliiiieajfjjaiilcmrrcqceeecqgnmnggppg`dmgqpgn`ddmngggmdmggggn`d`ngppppppqgdrdiii", +"eafofaillliiieeiiliieajfofjajfpaiajfofjjjjjjaeillliiiiajjjjaiiiligdrgcceeckpgnnnggggn`dngpgn`ddddmnnm`dngggn`ddmgpqkqqqqkmrrhlii", +"ajffailliiieeaeilliaaajfhhofjjjfohbhffjjjjjjaeillliiieaajjaiiliiajmrdckcckppgggnnnnnm`mgggn`dd`dd`m```nggggmddmngqccckqqq`rrciaa", +"jfojillliiieeiilliaajjfobhofoooohbbhfffffffjjaillliiieaaaaiilliajfhdrqkccqggppggnm`d`mnnnn`dd```dd`d`mngggn`ddngpkceeckkgdrdliaa", +"fffailiiiiiiiiliiaajjjfobhoffoohbbhoooofffffjaiiiiiiieeaeiiliieajobdrgcckpggpppgndddmnnnm``mnnmmmmmmnngggnm``mgpqceeeeccmrrgljjj", +"oojillllliiillliajjffffobhffoobbbbbbbhooffffjeiiieeeeeeeeilliiajfobmrdckqgggpppgn`d`nnnm``mnggnnnmnnggggnm`dmnpqcceeeeeq`rrciffo", +"bfaiillllllllliajjfffffhbhffobbbhbbmbboofffjaiiiaaaeeiiiilllieajfhhhdrpkqggggppgnmmngnm``mggggggnngggggnn``mnpkcccceeeegdrdlaffb", +"hfaeiiiiillllieajfffjffhbhoohbbbbhbmmboofffaiieajjaiilllllliiajfhbbh`rncqgggggggnmnngmddmngppppggggppggnmd`npkceccceelcmrrplfoob", +"ofjaaaeeiilliiajfffjjjfobbhbbbbbbhobbbooffailijjjaeillllllieajfhbmbbmrrckpgggggnmmmnn`d`nggpqqppggpppggnm`mgqceecccceeq`rrcifooh", +"hffjjaaeiilliajffffjjjfhbmbmbbhhhoobbhoffjeiiajjaiiiiilliiaajfobhhhbbdrpcgggnnnm`d```ddmngpqqqqpppppppgmd`gqceeecccccegdr`ljfohb", +"bhffjjaeiiiieajfffjjjfobbmbbbhoooohbhoffjaiiiaaeiiieaeeeaajffhhofohbbdrmcgggnnm`dddd`mmnggpqqqqqqqqpppgmdmpceeeeccccccmrrplffoob", +"hbofjjaeiiieajfffjjjjfobbbbhooooohbbhoffjeiiiiiiieajjaaajjfohboffobmbmrrkqggnmdddd`mnngggppqqqqqqkqqpgg``gkeeeeeecckqq`rrciffooh", +"ohofjaaeeieajfffjjjjfohbbbooofoohbbbboffaeiillliajffjjjjffobboffobbmhhdrgcnnn`dd`mnggpgggpppppqqkckkpgnmgpcceeeeeckqpgdr`lafffff", +"foofjjaaeeajfffjjjjffohbbhooooohbbbbbofjaeiilliajfofffffobbbhofohmbhfp`rdcgm`ddddmgpqqqppppppppqkcckpnmngqccceeeecqpgmrrpljfffff", +"ooffjjaaaaajjjjjjjjffohbbhoohhbbhbbbhofjjaeiiiajfooffffohbbbooohbmhfjamrrqp`dddddngqkckqpppgpppqkccqgnmgqkkkcceeecpgn`rriefoffff", +"bofjjjjaaaaajaaaajjjffhbbhhhbbhhhbbboffjjaeieajfoooooohbbmmbhhbmbbfjaegdrgc``dddmgpkccckqppgggpqkccqgnngkkqqkceecqpgndrmljooffjf", +"bojjjjaaeeeeeeaaaajjjfohbhhbbbooobbhfffjjaeeaaffoooooohbbbbbbbbmbofjaap`rdcgmdd`gpqccccckqpgggppqkqgnngpkkqqqkcckpgnmrrpiohhfffo", +"hfjjjjaeiiiiiieaaaaajfooooohbhohbboofffjaaeeajfooofooohhhbbbhoobbofjjjjmrrpqn`dnpqcccccckqpggggppppnmmgqkkqppqqqpggn`rriambhfffo", +"fjjjjaaiilllliieeeaajfffffohhoohboffffjjaeeaajffffffoooooooofffohoffffohdrncn``gqcccckkkkkqpgggggggmdmgpkkqpggggggnmdrmlfmboffoo", +"fjjjaaiillllliiieeeajjfffohhhhhoofffjjjaaeeajfffffffoooooofffjjfhhoohbbh`rrcg`mgkccckqqqkckqgggnnm`ddmgpqkqpgnnnnnm`rrpimmhfffho", +"jjaaaeilliillliiieeajjfffhbbohoffjjjjjaaaeaajfffjfffoooooffjjjjfhbbbbmbo`rrpcmnpkccckppqkckqpgnmmddd`mngqqpgnm``mmm`rrijbhffjobo", +"jaaaeiliiiiilliiiieaajjfhbbbooffjjjjjaaaaaajjfjjffohhbbhofjaajfobbbmbbof`rrgcmgpkcccqpppqkkkpgnm`d``mmngpqpgmd`d```drrlpoffjfobf", +"aaaeiiiieaiilliiieeajjfhbmhhofjjjjjjaaaaajjjfffffobbbbbhfjjajjfhbbhhoffp`rrppmgpqcckqppppqkkpgn`mmnnmmnggpgn``m``dddrriaffjffofj", +"eiiiiieaaaeilliiieeajfobbbhofjjjjjjaaajjjffffffoooooobmofjaajfobbboofjjgdr`cpngpqkqqppgppqqqpgm`mnnnnmnngggmd`nm`ddddrpifffoooja", +"illlieajaaeilliieeaajobbooofjjjjjjjaajffffffffohhfffohofjaajjfhbhoffjjamrrpcgggpppppggpppppppnm`mnnnmmmnnnm``mnnm`dd`r`ljffhofai", +"lllieaajaeillieeeeajohobbofjjjjjjjaajffoofffohhhofffhofjaaajfobbhofjjjp`rrkkgggppgggggpppppggm`dmmmmmmmmnm``mnnnm````rriahoofail", +"lliieaaaeillieaaaajobhfobfjajjjjjajjfohhoffoohoffjfobfjaaajffhbbhoffjjgdr`cqpppppgnmnggpppggn`dd```````mm`d`mnnnm````drpibofaiil", +"liiieaeiiliieaaaaafobboofjaaajjaaajfobbboohbhofjjffoojaaajfoobbbhfffffmrrgcppqppgn`d`ngqqpgn`ddd````ddd``dd`nnnmmdddddrdlffjeill", +"liiiiiilliiaaaaaajfoobbojaaaaaaajjfohbbhohbhffjjjfoofjjjjfoohbbboffffo`rrkqgpqqpgmdrdngqqpnm`dd`mnnmmddd`dd`mnnm`dddd`rrcajaeill", +"lllllllllieaaaaajfhbohofaeaaaaajfohbbbbhooofjaaajfbofjffohbbhbbhoffoohdr`cggpqqpgmdddmgqqgnmmdd`ngggnm`ddddd`mm`dd````drpljaeiil", +"llllllllieaaaaaajobmbofjaaaaajjfobhhoooffjjaaeeajobhffohbbbhobbhofohbmrrgc`ngppgnmm``mgppgmmm`dmggppggn`dddd`mm`dmnnmm`rdljaaiil", +"lllllllieajjaaajfbb`bofjaaajjfoooffffjjaaaeiiiiajobbhhbmmmbhobmboohbb`rrqp``mgggnmm``mnggnm``ddmgpqqpgnmdddddd```nggnmmrrcejeiil", +"iiiiiieaajjjjjjfhbhbbhfjjjjffoofjajjaaeiiiiliieajfobbbbbbbhoobbbhhbbbdrdcgm``mgnmm````mnnnm`dd`mgpqkqpgnmdd`mmmmngggnnndrglaeiil", +"iiiieaajjfjjjffhbhohbhoffffooofaaeeeiiilllllliajffobmmbbbhooohbbbbbbmrrgcnnm``````d`````mnnm`d`ngqkccqggndd`nnggggggggg`rdleiiii", +"iiieajjfffffffhhoooohbhoffoofjaiiiiilliillliiaajffobbboooooooohbbbbb`rrqqgggnmdd`dd`m````nnnnmmngqcccqpgn`dmgpppgggggggmrrciiiii", +"iieajffooffffhbboffoobhoohbojailiiilllillliiaajffohhoffooooffoobbbbhdrdcpggggn`dddd`mmm``ngggnngpqccckppg`dmpkckpggggppgdrgliiii", +"iiajfoohoffffhbhfffohbhoohofaiilllllliillieajjfffhbfjjfohoffffobbbhmrrgcggggggnnm`mmnnmmnggggnggqkcckqppg`dmpccckpgggppp`rdliiii", +"iejfhmbbhfffohhoffohbbhbbbfjeillllllllllieajfffohhfjjjfohoffffobbbh`rrqcppggggggnnnnnm`mgggggggqkckqqpppgmdnqceecqgggpppmrrkiiii", +"eafhbmbbhfffooofffobbbhbbojaiiillllllllieajffffhbfjajfobboffffobbbbdrdckqpgggggggggggmdmgpggggpkcckqppppgmdnqceeecpggppggdrhliii", +"jfohhoohbofoboffffhbmmbbhfaeiiiillllllieaffoohhbofjajobmboffffohbbmrrgcqqppggggpqqqpgm`ngpggggqcccqpgggggmdnqceeecqgggpgn`rdliia" +}; Index: external/mit/ctwm/dist/xpm/background3.xpm =================================================================== RCS file: external/mit/ctwm/dist/xpm/background3.xpm diff -N external/mit/ctwm/dist/xpm/background3.xpm --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/xpm/background3.xpm 3 Sep 2015 12:20:01 -0000 @@ -0,0 +1,151 @@ +/* XPM */ +static char *background3_xpm[] = { +/* width height ncolors chars_per_pixel */ +"128 128 16 1", +/* colors */ +"` c #000000", +"a c #7B7B7B", +"b c #737373", +"c c #6B6B6B", +"d c #636363", +"e c #393939", +"f c #313131", +"g c #292929", +"h c #212121", +"i c #5A5A5A", +"j c #525252", +"k c #4A4A4A", +"l c #424242", +"m c #181818", +"n c #101010", +"o c #080808", +/* pixels */ +"fghhflkleeeefhhhggffellleeeefgggghhgfeleghmgfffgho`onmflllkjlghhnmhfellfgmooooo`````onmmoongllleeffhhhhgfekkkefhhhhhmnoooonmhgff", +"ffgmhflleeeefghhhgggfeellleeeeeeffghfelegmnmhgggmnnmmhfellkiklfghhhhgfelehnnono``````onnoongeelllefghmmmhejcdlefgggghmoooonnmhgf", +"fefghhfeeeeeefhhhhhhgfeeeefffelllefggfeeghmmmhhhhhhgggfeellkkjlffghmhgfllfghmmno`````onmnnmgfelllefghmoonglddleefggfghmnnnnmmhgf", +"feefhhgffeeelegmmnnmhgfffffffeeeeeefggggghhhmmnmhgggggfeeeeellleeffhmhhgelefgghmo````onmmmhgfekijlfghmnnomgljklefggffghmnnmmhhhh", +"hfefghhgffffllehnooomhgffffggggfffeefghgghhhhmnnhgggggfeleffffeeeeeffgnngellleefhnno``onmmhgfekddkefghhhmnmglllefgggffghmmmhhhmm", +"nmgffhhhggffeelehnonmmggfffgghhgggffefgghhgghhmmhggggffekkeggfffellllehmhgelkkklfhmmnnnnmhhgfelkklleffffghmhgellefgggffghhhhgghm", +"nonhghhhhgggffelehmmmmhgffffggggggggfefggggggghhmhggfffekjlffggfflkjjklfhmgellkkefhhmhmmmmhhgfeeeelkleeeleghhhflefhhggffggghgggg", +"hmnnmhhhhhhggffelfghmmhgfffffggggghhgfeefgffffghhhggffffllleffggfljiikklhmgelkjklefhmhhmmmnnmfeeeelkleelllfgmmhfefhmmhgffggghgff", +"fgmnmhhhmmmhgggfeeeghhhgffffffffggghhgelefffeefghggggggffeeeeefffekijlllfggfekkkkleghhmmno``ngfeeelklfffeeefhmnhgfgmnnmgggghmmhg", +"fghmhhhhmmmhgggffeeeghhgffeeffffffgghgflleeeeeffgggggggffffeeelleekcjleefgggflllkkklfghmn```ngfelllkefggfffghmnnhgfhnoomhhhmnnmg", +"ggghhhhhmmmhhggfffelegggfeeeeeeeefffggfeelleeefffggghhggfffffflklekdkeeeefghgeeellkklefgn``omhfekkjklfhhhgghhhnonhggmnooonmnoonh", +"hggghmmhhmmmmmhgffellefgffffeeeeefffggffekklleefffgghhhgfffgggeklelkllleeegmhfffeelllkklgnomhhgekkijlfghhhhhhmmnnnmhhmoooooonnmm", +"mhgghmnmhhhmnnmggfeeeeefffffeeeeeeeffffflkkklleeeffghhhhgfffgggelleellllklfhhhgffffelkdilghhhhhflkdijlfghhhhmmmmnonmmmnooooonmmm", +"mhhhhmnmmhhhhhmhhgffeeeeeeeeffffeeeefffeelkkkkllleefgghhgfffghhgelleeelkjjlfhhhggfffellkklfhmmhgekdidjlfgghhnonno`onmnnoooonmmmm", +"hhhhhhmmmmmhgghmmmgfeelllllleffeelleeeeeelllkjkllllefghhgfffgmmhfeeeeeeljkkeghmhhhgfffffeleghmmgekiidjlefffgmnonooonnnooonnmmmmh", +"ghhhhhhhmmmhhggghmhgfeelllkkefelkkleeeelllllkikllllleghhhgffhmnmhgfeeellklklfhnnmhggffgfflleghmhfljjkklleeefgmnnnnooonmmnnnnnmhh", +"gghhhhhhhmmmmhggghmhgffellkleelkjjlleellllllkjkllllllfhhhhgghnmhhhgfelllelllegnnmhggffggfflklghhgelkllllllleefghhmnonmhhhmnnnnhg", +"hhhhhhhhhmnnmmhgghmmhgfeeeeellkjjklkleelllllkkkllelllfghmhggmmhghhgggffeelkklgmmmhggffgggfldkfhhhgelllkkkkkleffghmmhmmhgghhmnnmh", +"hhhhmmhhmnonnmmhhhhhhhgfeffflkijllljkleeellllkkkleelleghmmhhmmhgffggmmhfeelleghmmhhgfffghgljjlfghgflkkjjkklleeffhmhgghhgggghmmmm", +"hhhhhhmnoooonmmmhhghmmhfffffekkllllkkleellllelkileelleghnnmhmmhfeeffghhgggfffgmmmhhggffghhfljjklfffekiiklleeeeefghhgggghgfgghhmm", +"hhhhghmoooonnnnmhhghmnhfffeelllllllllllllklleejckeeelefhnnnmnnmgfeelleefghhgghmnnmhhgffghhhfljjkleelkdjleeffffeefgghgghhhgfgghhh", +"gggggghnnnnnnnnnmhgghmhhgfelllllkkeeeelkkklleelkkeeellegmnnmnnnhfelkkllefghhmnoonnnmhgfghnomfeleeeelkkleffffffffffghhghhhgffgggg", +"ggggfgghhhhhmmnnnmhggghhhgfelkkkkkeffelkklllleellleeellfhmnmmmnnhfellleleeghnnnnnnnnhggghnonhffffellklleffffggffffgghhhhgggfffgg", +"ggffffffggggggmnonhgffgmnmmhfljjklefeelllelkleeeelefellefhmmhhmnnhgfeelllleghmhhhmmmhggggmnmhgfellllllleeeffgggffffghmhhhhgfffff", +"fggffeeeffffffgmnnhfeeefmnonhekkleelllleeelklleelleffeelefhhhhhmnnmhgfeeleeffgggggghhhgffghhhgekjkllllllklllefgfffffhmmhmmhfffff", +"fgggfelleeeeeeefhmhflkjlfhmmmhgelkkkkkleeelllllllleffeeeefgggghhmnnmhgfeeeefffffeffgghhffffgggeidkkkkkkjiiijleffgfffghmmmhhgffff", +"fghhgfeeeeeelkjlfhhflicdjlefhmhgekikklllllllllllllefffefffgghhhhhhmhhgfeeefffffeleefghhgfeffggekkkjdikkjiiddikeffggggghmhghhgfff", +"fghmhgfefffekcbjlfgfliccdiklfgghgffelllkkkleellllleeffffffghhhhhggggggeeeeeefffeellefghhgfffgggelkdcdklkkicccikefggggghhhghhhgff", +"fgmmhggfffffldcjleffekjjidikklfgmmmggfelkleeelllleeefffffghmmhhhggggffekleeeeeeeelkklfhmmhgghmmgfliijleeekiidiklefgggghhhhhghhhf", +"hhmmmhgggghgfliijlfgfekjdddijklfhnnmmhgeleeeeelkkleefffeefhmmmmhggfffflkleeeeeeelkiikeghmmmmmnnmhfellefffelkkkkllfghhhhhmmggghmm", +"nmmmmmhhhhmmhflkjlfggflkjjjjkklefhmmnmhgffeffflkjlefffeeefghmmmmhgffffllefffellkkidijleghmmnnoonnnhffffgggfeeellklfhmhmmnmhffgmo", +"mmmnnnnnmmmnnmgellfggfellkkkjkkefghhhhmhgfffffelkleefffeeefghmmmmgfeefeeeeffflkiiidddjlfghnoonnnnnmhgghhmhhgfeellleghhmhmmhgeegm", +"ghmmmnoonmmnnnmgfffggffeellkkklefggggghhhffffffeelleffffeeffgmnnnhfeefffeleffekddiiidiklfgmoommmhhhhhhhmmmhhgfeeeeefghhhhhmhfeef", +"fgggghmnoooo`onhgffggffeeellkkklfgggfgghhgffffffeeeeeffffeefghnnomgfeffgeleffekccijjidjlefmnomhggggghhhhmmmmmhfeeeeefhhhhmmmgele", +"eeeeeffhmnooonmhhgggggfeeeeelkklefgggffghhgfffffeeeeeefeeeeefgmnonmgeefgfeeleeldcijkkkkklegmnmhgggggggggggghnnhfeellefhhmmnmhgee", +"elllllkleghmmhhmmmmmmhgffeelkikleffgffffghgffffffeeeeeeleeeeffhmnnnhgffggfekleliijkllllkklefhmhggghhgffffgfghmmhflkkkefhmmmmhhge", +"feljjkidjlfffgghmnnmmmhggfelkjkllefgffffghhgfffffeeeeelkleeeffghmnnmgfffggekleelkkleeeljjkleghhgghmmhgfeefffffhnhellklfghmmhhhgf", +"fflijllklleeellefghhhhhhmmmhfeelllefgffffhmhgfffeeeffellleeeefghmmmhgfffggflleeeelleellkklllefghmmnnnhflkleeeefghhgelleghhhhhggg", +"gfljkefggfeelkjikleffgghmnonhffellefggfffghmgffeeeeefffeeellefgghhhggffeeeeeeefffeeelkkkleeeeeghmnnnnmglkkleeeeeghhfeefgghhhhggg", +"fflkklfghggffelkklleeeffhhmhhgggfeffgggfffmmhfeelelefgffelkllffghhhgffelllllleffffeekjikleffffhmnnnmnmgelleeeeeeefgghgggghhhgggg", +"feelkkefghhhhhggffffelleeffffghhgffgggggfghhhfeellllefggekkllefghhhgfelkklllllefgfffelkklfghhmmnnmmhmmgfeeeeeeeelleghhhghhmhhgff", +"eellkklfghmmnnmhhgggffeeellleegghhhhgghhgghmmgfeeelklfggfellllefghmhgekkkleeeeefffggffekikfhnnnmmmhhhhgfllefffffelleghmmmmmmhhgf", +"feellklefghmnnnmhhgghggfekjkkllefhhmmhhhggghmhffeelklefggfelllleffmmhfllleeeeeffffgghggekkegmmmmmmmhhghglklffffeeekjlgmnnmmmmmhg", +"hgfelllllefmoooomhhhhmhfekjkkkklefgmnnnmhgghmmgfelllleffgfellllleeghmhfeeellefgfffghmmnmgfeffgmmnmmmhhmmgellefellljikehnommmmnnm", +"mhgfeellkklgmo`onmhhhmmhflkkklllleefhnnmhgghmhhfekleeleeffellellleefhmhfelkkeghhggghmooonhgelegmmmmhhhmmhgeklelkjkkllefhnnmhhmnm", +"mmmhfeeellklfhnnnnmhmmmhgekjklllkkklfhmmmhhhhmmgellellleeeeeeeellleeghhgfekkeghmmhhhn``ommmhfefghhhghmmmmhgellkjkkeeeefgmonggghm", +"ghmmgffffflkkeghmmmhmmmmhfljjkkkiddklfhmmmhhhmmhfeellllleeeeeeellllefgghgfllefghmmhhmoonmnnomgelfgggghhmnmmgeljjkleggffgmongffff", +"lfhhmhfffgfellefghmmmmnnnmfkdddiddcdilfhnnmhhhnnhfellllllllleeelllleffhmmgeeeefghhmmmmnnnnnnnmfllffggghhmmnhfelkklegggffhnnhfell", +"klfghmgffgggfeeefgmnnnno`omfkdcddddddjlfmnmhhhmmmgeeellllkklleeeleeeffhmmgffeeefghmmmmmmnonnnnmfllefgggghhmmhfeellefggffghmmgelk", +"kllegmhggfggfeelefhmooo```omglkjddddcijegmmmhhhhmmgfelllllkkkleeeeeeefhmmhgfellfghmnnmmmnonnnonhelkllfgghhmmhgfeeeeffgfffghmhflk", +"llkjeghggggggffellegmnoooooonhflkidddjklfgmmmhgghmhffeeeeelkjkleelllefghmmgfekkefgmnnmmnnnooo`omgekiilefghmmhgffeeffffffefghmhel", +"llkklefghhhhhgfelkklfhmmmmnoonhgekiiikklefhmmhhghmhggffffellkkkkkkjklfgmoomflklefghmmmmmnno```onhflkjjklfghhhhgfffffgggfeefgmmge", +"lklflklghhmmmhgfeellefgghhmnnmhgfekkklllleghmmmhhhhhhgffgfeeelkiiidileghnongelleefghmmmnnno```onhgfelljkefgghhhgfffgghggfffgmnmg", +"eklfekklfghhhmmhgfeeeeeffghhhhhggfellllllefghmmhhhhmhggghhgfellkkkklllegmhmhgfelleffhmnooo`o`oonmgfffelkkeffgghhhhhmmmhhhhghmnom", +"flkefekklfffghmmhgffelllleffgggfffeelllllefghhhhhhhmhhgghhggfeeeleeelklfggghggelleefgmo````onnonmhgffffelkleffhmmmnnmmmmmmmmnnom", +"glllefelleefffghhhgfelkkjkleeefffeeeeeeeeffgghhhhhhmmmhggggggffeeeeeellefgghmmfeeeeefho````onnnnmhgggghgflllllfghmnmhghmnnnnnmnm", +"felkeffeeeeeeefghhhgfelkkkkllllelllllefffffgghmmmmhmnnmggggggffeeeeeeellefggnnhfellllfn````onmmmhggggggggflkiklfghhgfeffhmmmmmhh", +"fekjlfffelllllleghhgfelkkllllllllklllefffggghmnnmmmmnnmhgggggfffffelllkklfggmnmgfkijdkgn`onmmhhhhgfeeffffekdcjleghgfeeleghmmmhgg", +"fljjlefeellkjijlfghhgflkleeeeeeelllllllefgghmmnnmhhhmmhhgggggggfffflkiikefgghhmmglkjdilgnnmmhmmhgfelleeeelkikeffhhhgfeefghhmmhgf", +"fekjkeeelkjiddilefhhhfeleeeeeeffeelkkkleefghmmnnmggghhhhhhhhgggggggflkjklfgggghmmgflkkleghhhmnnmgeeeeeeeelleefhmnmnmgeefghmmhggg", +"gfelllllkjiiijklefgmmgfeeeeffffggfekkllllefghmnnmgfggggghhhhhggghhhgfelllfgggggmnnhfffeeefhhmoongeeffffeeeffghnoonnnmfffghmmhggg", +"gffellllkjjkllleefghmhgfeleeffgghhfellkkklfgghnnhfeffggghhhhhmhhhmhhgellefggggghmnmhhfeelefhno`omfeefggffffghmnnmhmnnhfffhmhhhhg", +"gfffellllllleeeeeefghhgfellefffgghhfeljiikefggmmhgfeefghggfghmmhhhmhgfeeefgghhhhmmmmhgffellfmooonhelefggggggmmnhfefgmmgffghhmmmh", +"gfffelleelllllllklefghhggfeeeeffgghgfejdcjlffgghhhgeefghhgffghmmmhmmhgfffghmmnnnnmnnmgfflkdkgmnnnngeeeffgghhmmnhflkehmhgffghnnmg", +"gfffelllellkkkjkjklfghmhhgffllleffgggfljdiklfffgmnmfffgmmhgffghmmhhhhhggghmnoooonnnnmhgelliieghmmnmgeleffggghmnmgljlfghgfffhmmhg", +"gffellllllkkkkkjkllefghmmmhgelkleffggfeljiklefffhnmhgfgmmhggffghhhggghggghnoonnnnnnnnmhfelkkleghmnngelklefgghhnnhljkkeghhgfghhhg", +"gfeellllkkkkklllleeefghmmmmhgflkkleefffelkkleeffghhmhgghhhhhgffgghggfggffgmnonmmmmmnnnnhgfeelleghmhgfljjlegghhnomekiciehmhgghhhg", +"hgfeellkjiijkleeeeeefghmmmmmmgelkkkleffeellleeffgghmmhghmmmhggffghhhgeeeefgmoomhghmnnooomgffeleefggfekdikeghhmoonfliciklfhmnnmmm", +"hgffeelkkjjkklefellefghhhhhhhgfelkjkleffeellleefggmmmgghmmmmmhgefgmmgelllefgnonhffghno`omggffeeeeffeljiklfghmnoongldjlidkfmoonnm", +"mhgfeeelllllllleeeeefghhhggghgfelkkleefffeelleeffgmmhggghmnnonhfeeghhgfeeeefhnnmfllfgmmmhgggffeeeellkjklefhnnnnnmgldjeljkefghmmm", +"hhhgfeeeeeeeeelkleeleghhgffffffelleeeffffeeeeeeefghhhgggghmooongeeefgggffeeefgmmhelefgggggggfffeelkkkllefgmoommhhfkcjefeelkleggg", +"fghhgfefffffffelllleeegmhfffffeeleeffffffffeeeeeefhmmhgfffghnoomflleghhgffeeleghmgfeeffggggggffekiilefffghnnnhgffejdjefffeeeeeef", +"efghhfffffffgggglklekjfmmgfffeeeeeeffffffffeeeeelegmnhgfffefhmnmgekkehmmhgfeleefmnhfffffffgggffljikeffffghmmmhgfelidjlffffffeell", +"lefghhgffffgggghgelliilghhgfffeeeeeeeeeefffeeellkkehnnmhgfeefgmmhfkklfmnnhhgellegmmhgggffffggfekjklleffffghmnnhflkddjleeffgffell", +"elefghhgggggggghhhekiklehhhggfffeelleeeeeeellllkiikfhnnmhhgfffghhgellegmmmnmhfeefhmmhhggffffgfljkllllleeffghnongflidjlleefffffff", +"feeefhhhggggfgghmmhekkjlghhhgggfelkklleeelllklllkjjlfhmmnnmmgffghgfeleghnnnnnmgffgmmmhhgfeeeffekkllellllllefhmnmhejikleeeeffffgf", +"ggfeefhhhghggfghmnnhflklfhmmmhggflkjkleellkkkklellkklfghnnoomhggggfelefhmnnmnnmhgghmmhhhgfeefggelkleelkkjklefgmnnflkleeeeeffffff", +"ggfeeefhhhmmmgfghnonhfefghmmnmmgfljjklllllkkkkklelkdkefghmnnonmhgggfeefgmnnmnnmhhhhmmmmmhfeleghgflllkjjjjklefghnoheklefffeeeefff", +"fggfeleghhmmmhgghmmmhgfgghmmmmmhflkkllllllkkkkkkllkdkffggghmnoomhgffffghmmmmmmhhhmmhhmmnmgeefgmmhflkijkllleffgghnmglleffffffeeff", +"fghgellffggghhhhhhhhhhhhhhhghmmhfelllllklllkkkkkkkijlfggggghnoomhgfffghmmmmhmmmhhhhhmmnnnmgffgmnnhfeeeffeeffgggghhgfeeeffgggffef", +"fgggfeleeffffghhhhhhhmnmmhgffghgfeeelllkklllkkkkjddkfghhhhhmmnnnmgeeefghmmhhmmmmhgghmmnnnnhfffhmnmhgggggffgghhhghhhgeeleffgggfee", +"fggggfeleeeeefghhhhhhmnmmgffeeffffeelllkjklllkkjiijlfhmnnmmmmmoomflkklfhmhhmmmnmhgfghmnoonhfefghmhhgggghhhhhmmmhhhmhgelllefggffe", +"ffgggfeeefeellefghhhhhmmhgfellefffellllkijkllljdiklefgnooonmmnoomfliadlghhmnnnnmhgfefgnoomgellefgggfffghhhhmmnnmmmnnmgflleffgffe", +"lefggffefffelllefghhhghhmhgellleffekkllkjjkkkkkkkkleegmo`oonmnonmglccklefghnnnnnmgellegmmhgekjikeffffffgghhmnoonmmnonmgfeeeeffel", +"klefgfeefggffeeeffghggghmmhfellleelkkklkkkkkkkkllkllefhnooonnnnmmhejkfelefgmnmnmmhfellefggflkjddkeeeelleefghmnoonnnnnmhggfellelk", +"llllefeefhhhggfffgggggghmnmgfelllellkjklkkllelllkkleefhnooonnmhhmmglleeeeefhmmmmmmgelkleffelllkkkkkkkkkkklefhmonnmmmmmhhhgfellll", +"ffelleeegmmhmmhgggggggghmmmhgfeellllkjkllklefeelkklefghmooonmmhhmmhfeeffellefghhhhgflkklllkkleffekjikkkidjklfhmmmhhhhhhhhhhgelle", +"fggeellegmmhhhhhhhhhhhhhmmmmhgfeellllllllllefffelllefhmnnmnoomhhhhhgflefelklllleffgfljijkkiilegggellllkiiiiklfhhhhhhhhhhhmnmgele", +"fghgflklgmmgggggghmmmmmmhhhmmhgfellleeeeelllefgfeeefhmnnmghnonmhhhhgflkklelkiiiklleelkiijkidkegghhgfelkkkkkkkefgghhhhhhhmnnnmgee", +"fghhgekkfhmhgffgggghmnnmhgghhhgfelklleeeelkjleggfeegmonhgggmnonmmmmhgekjkkkkkklllkkklkjdijddkefghhhgfellllllllefgghhhmhhhmmnnmgf", +"ghmnmgellgmmhffffffgghmmhgggghhgflkllleeeljjklfffffgnnhgfeefgmnnonmhfelkjjkleeeeelkjklkiijiijlefghhggfeeeeeelleffggghmmmhhhhmmhh", +"hmnoomgelehnmgggfffgghhhhhhgghmmhflllllellkkklffffghnnhflkklefhmnnnhfelllleefeeeeekiikkjjjjjjklfggggggffeeeeeleffffghmnmmhhhmmmh", +"hmoo`omgeegnnhhggggggggghmmhhhmnmgfeelllleeeeeffffggmnmekkleeefghmmhfekleffffellleekjjjjkkkkjjlfggggggggfffeeeeeefffgmmmmmmhhhgh", +"hmoooonmgfghmmhggghhhggghmmmhhmmmhgfelklleeeeefffffghmmejkleeeefghmhgekllefggfeklefelkjjkkkjiklfghgggghhhggffeeleffffghmmmmhhggg", +"ghmnnnoonhghhmhgggghhggghhhhmmmhmhhfelkleeeeeeeeefffhhmflkeffeeefghhgekkklefhhgelleffllkkkkjjkefhhhgggghhhggffellfffffghmhhhgggg", +"fghmnnonnmhhhhggfffghhgggghmnmmmmmhgfellleeeefeeeeeefgmhfllffffelefgfekidklegmmgljlggfeeeellkleghhhhggghmmhggfekleffffghhmmhhggf", +"ffggmmmhhmmmhggffeefghhggghnnmmmmmhgfeellllleeeeeellefhmhelefffekjleeekddjjlfhnhejlfgffeeeelllefghhhgggghhhhhgelleffffgghhmhhggf", +"fffgghhhhmnnmhgfeeeefhhhgfhmmhhhmmhgfellllllllefeelllegmnheleffekdjleelidddjfhnnmfeeefellkkkklefghhhgfffgghmmhfelefgggghhhgghhgf", +"feefffgghhmmmhhgfelefgmmhgghmhhghhhfflkkleeellefeelllefhnngleeeekkleellkidcjehnnomfeeelkiddkklklfghggfeefghmmhffeefggghhhggfffff", +"lleeffffffgghmnnhfeeeghnnmmmmmhggggfekiklefffeeeelleleegmnmfelkkkllllkklkjdjehmmmhggfeeelkllllkklefggfeeeegmmhgfeefggghmmhflleee", +"lleefeeeeeefghnnnhfffghnonmmmmhgfffelkjklefggfeelleeeeefgmmhflijlelkjjkllkjkeghhgghmhgfffffffellleffgfeekkeghhgfeeefgghhnnglklll", +"leeeeelllleeeffghmmmhhmnnhhghhhffeelkkkllefgggfeeeeeffeefhoomelleelkjkklllkleghmgfgmmhhhgggggffeelllefelidkeghhfellfggggmnhekjkl", +"eeeelllklleeeeeefgmnnmnmhfffgggffellleeelefghhhgffffhgfeegnonhfffeelllllllllefhmhffghmmhhhhmhhggfekilfekijlefghgejkfggffhmmgljke", +"effellllkkleeeeeeefghhmmgfffffffellefgfffeffghmhhggghhgfllgnomhggffeelllleeeefgmhffghmmgggghhhhhhgelllkdikleefggejkfgggffhmmgkjl", +"lffelkllkjkleffeelefffgggfeeeeeelklfghhggfffghhhhhhhhmmheklgmmhhhhggfellefffeegggggghmhgeeefghmmmmhgfkdjkeeeeeffeklfhhhgffmnmfkk", +"kkeflkleelleeeelllefeefffffelllljjlgmmmhhggggghhmmmmmnonglkeghhhmmhgfelleeffeefgghhhmnnhfeeefgmnnmhhhgelleeeeeeeellfhmhgffgmmhfl", +"kdkelklefffeelllleefffffffffellkjklfmnmmmmhggghhmmmmno`onhllfghhmmmhgfelllefeeffhmmhmnnmhfeeefhmmmmmnmgfeeeffellllefghhhgggghhgf", +"ekklkklfffffeeeefffgggffffggfelkiklehmmmmmmhhhhhmmmnnooonhflegmnmmmmmgfelkleeeffhmmmmnnmhgffefhmmhmnmhhhfeeefekikeefghmhgggghhhg", +"gfellleffffffgggggghhmhggggggfelkllefhmmmmmmmmhhhhmnnmnnmhgelfhnnhmnmhfelkleeeefhmmhmmmhhhgfffghhhmmhhmmhfeeeekikeeeghmmhhhhhhhh", +"hgfeeleeffgfgghhmmhhhhhhhhhhhhgfeellefhmmmnnnmmhhhhmmmnnnmmgllfmnmnmmhgfllleeeefgmmhhhhhhhgffffgmmmhhhhhmhfeeelklelefhhhmmmhhmmm", +"mggfeeeeeffffgghmmmhgghhmmmhhmhggfeelegmmnnnnnmhhhhmmno```ohelehmnmmhhgfeeeeeeefghhhggghggffeeefhmhghmgghmgfeeeeellleghhmnmmmmnm", +"mmhgfelleffffgghmmmhggghmmmhhhhhhhgfeeeghmnnnnmmhhghhmo```omfeegmmmhhhggffffeeefghhhhgffffffeeeeghhghhgfgmhgffeeeeeeefgmnmmhmnmm", +"mmnmhfelleffffghhmmhggggghhhhggghmhggfeefhmmnmmmhgggghmnonnhgfeeghmhmhgfffffeeeefghmmhgffffeellefgghhggggghhgfeeleefelegmhhhmnmh", +"hmoonhgfeeffffghmmmgfffggggggggghhmhhgflefghhhhhhggfffffgghhhgelfghhhhgfeeeeelllefghhhhggfeekkkeefghhggghgmmgffekkefekkeggghmomh", +"hhmnnnmhgffffghmnmhfefffffffffffffghhggelefgggggggffffeeeefggfeefghhhgfelleeeellleffgghmhggflkleeeghgfghhhhhgffekjleekkleffgmnmh", +"mgghnoonmmhhggmmnhfeeeeeeeeeeelkkklfghhgellefggffffffeelleeeellefgmmmgflllleeeeeeeeeeefhmnnhgeelllfhhgghhhmmgffflkklllkklleeghnn", +"mggghnonnnmmhhmmmhfeeeeellleelkjikklfghhgflleffeeefffellefflkklfghmmmgelleeeeffffeelkjkeho`nmgflkleghgggghmmhggffelkklllkkllefmo", +"mhgggmnnnnnmmmmmmhfeefffeleeellleeeeeeghmhfelllleeeeeeeefghgfffghhhhhgellefeffgggfelklklfmnnmhgekjkeghhhhhmmmhhggfekklllkkklefgm", +"hmmgfghmmmmnnnmhmhgeeffffeeeefffgggfellfmnmfelkleeelleeefhmmmhhhhhgggfelefffffgggffefffeleghmmmgljilfhhhhhhhmmhgggfellllllleeefg", +"hmnmgffghmnnonhhhhhgfeefgffffgggghhgfellfhmmglkleeeeeelefhmhmhhhgggggflleffffffggfeeefgfllfhmmnmflikfhhmhhghmmhghhgfeeeeeeeeeeff", +"hmnmgfeefhmmmhhggghgfllfffffffgghhhhhgfelegmmgeeeeeeeellehhhhhggfffffelkefgfffffffelleggelefghmmhflleghmhhhhhhhhhhgffeeffffeeefg", +"hmnhgfeelefghhhggfggggfellleeefgghmmhgfeeeegmmgfeffelkikeghhhhgfellleekjlfgggffffeljilfffeeffgmnmhelefhhmmmmmhhhhhggffeffgfffffg", +"mmhggffelllefggffeffhmhelllellefgghmhhgfeeleghhfffffliillfhmmhhgejiklljdkfhhmhggfflkjleffeeffghhnmgeefghmmmmmmmmhhggfffffggffffg", +"hhhgggellleeeeeeeelefhhgffffeeeeefghhhgfeelefghhgggfejlellfhhhmhejdjkkddkfhmnmnmmgellleeeeeffgghnnhfeffghhhmmmmmmhhhgffffgggfffg", +"hhgffffeeefffllllllkkeghmhggggffllfgggffeeeeefghmhggflefeleghhnngliidddilfhmno```ngfeeeeeeeeeffgmmhfffffgggghmmmmmmmhgffffgggffg", +"hhgfefffeeffffelllkkkleghhhhhhhhfeeefgfeeeeeeefhmmmhgfffelefghnomfjccjkleghmoo````nhffffffelleffghhggffffffggmmnnnoomhgfffggggfg", +"hhgfeeffelefgggfellelllefgghhhmmhgfeefeleeeelefghmonmgeeleefghmmmhlddllefhmnoo`````omhggggekkleffghhhgffffeffhmmnnnnmhhhggggggff", +"ggggfleeeeefghhgffeelllleefgghhhhhfeelleeffeleefho`onhfllellfhmmnmglkklfgmnooo``````onmmmmhekleeefghhggffellefhmnmmmmmnnnmhhggff" +}; Index: external/mit/ctwm/dist/xpm/background4.xpm =================================================================== RCS file: external/mit/ctwm/dist/xpm/background4.xpm diff -N external/mit/ctwm/dist/xpm/background4.xpm --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/xpm/background4.xpm 3 Sep 2015 12:20:01 -0000 @@ -0,0 +1,91 @@ +/* XPM */ +static char *background4_xpm[] = { +/* width height ncolors chars_per_pixel */ +"128 64 20 1", +/* colors */ +"` c #000000", +"a c #ADADAD", +"b c #7B7B7B", +"c c #737373", +"d c #A37474", +"e c #6B6B6B", +"f c #636363", +"g c #966A6A", +"h c #634848", +"i c #DADADA", +"j c #CF8A8A", +"k c #9E9E9E", +"l c #7B4A4A", +"m c #848484", +"n c #5A5A5A", +"o c #8B5F5F", +"p c #845454", +"q c #BDBDBD", +"r c #362828", +"s c #B5B5B5", +/* pixels */ +"hr`````fmmmfbbmccemfbfemfmme`sqsqqqakskskmfrr`````lggpopdoolloplplppgp`rbmmcemmebfbmcfnr`````rqqaskqakaqsqasqaqq`rooppgpgppppolh", +"```hqir`hmmceffbfcbmmmcmcbbm`bqsqqsqqkmnr````hksk``rggololglpgglodllggr`efcecmbmfnnrr``````lr`rqqqkaaasqsqkaaaqqe`opppdplllhhrrr", +"fiiiiqqr`rmmfmccemfmbecffmbm`hqqqkmbnr```reaqqskmcr`rggdplopggllggllggo`ebccennrrr`````odjjjgr`fqqqaaqqsqqasakaqa`poolhhhhrr````", +"iqqkasqqe`rcmceffmmcmbeffebmh`qmbnr```rmqqsamfbfembh``ogolgldllolglpogp`rfnhrr`````oddjjjjgoggr`fqqsqaqqaqqqqqaqq`rhhlprr````mqi", +"asqkqsssqk``fmmcmefemmbfccfmc`nr```hkqqakmccecmebfebn``pgplgglpglpllgoor`rr````pddjjjjdgdgoppggr`fqqqkakaaasakaqqn`pr````csiiiii", +"kakkqksssqsr`hmeebffbncmmebbm```nkqskbfeecccemnmnffeber`rgpldoggpllglogo```hpdjjjjddpdlgplddgppgr`nqqsaqasqqqksaqk```hkqiiiiiiqa", +"akaasssasqqqn`rbbmfbnfcccfmemeqqamecembfceccbbmnncefebbr`roolpoggoppdlgpgjjjjjjollddoplolpolglpogr`nqqaaaqsksqskqqsiiiiiiiqqskqs", +"skqsqskkqaqqqb``embbcembffcccbccfecmbfmebcbfffbceembmbbbn``pgplggpggpplgjjjggooopgldldpldlgppgplogr`fqqasasasasqaqiiiqsqsakqsasq", +"qqqsasqaqqskqqk``nbmffbfffcffffbbmebfebfffmffbemfmfbffmcbf``hppppgpgdpglggpolplpgplggogpplgpldppopgr`nqqqsakakqqakssqsasaassqaqa", +"aqkqsassqqksaqqq``mbembbbfffnbecebnbfcbcbfbemmmeccmemfmfbbc``ggplpooodlddloppogpgolpoldppgldpllppopgr`fqqqaskkaasqqqkasqakaasqqq", +"kqaaassqqqsaqkqqs`bmembcmfcemfmfcfmbecebemfcecffbmnbebmccbbr`rolgggpgglpdllllodlpdloopolpgglpgoldpgpor`nqqkqssskqakkasqaaqqskskk", +"kaqqaaasskqaskqmr`efcffccffbfffenmeemcfmmefcffmmnffmebcebnhr``dllpggooopgpdogglgppdpgllpollpgplpgloglh``qqsqqaaasakaaqasaaasasqa", +"saqqkasqqaqskae``fqmbnfmmfmfmmbmemmfccfmecbbmbfbmcffbffmfhr``pgdgooopggogpoolppggplppgdddlpldppodophh``ciisssaaqqakkqsaqssssakqs", +"kssaaaskkasskn``mqkfffbcfbfefmfbfmfbbfemcecmccmmffcfffbnhr``gdggdlodgdpgoppllpdddlooppgooddplpglgphr``kiiisaaakakasaakkasksasska", +"assqakaskkqmr``aqknmfmefcmfmnnffbfbfeeebcecmmemfmcbmfbnhr`rjddpgdggpglhhlloooodoppopgolldpooglgphhr``siiqqkasqkaaackakskkqsskaqk", +"aksqqsssaacr`rqqbembmceemmmnrrrhhnnnnffbmeecfemebmmefnr``rjglgollpgpplhhllhlllgpoglpoldoldoglglhhr``qiisaqqakasabmmmecmkaasasqsq", +"qkkaskkakn``rqscnfmemneefbfnr````rrrhhnnfecfnbfcemffnr``pjodogooollpplr```rrlhhllpgdoppllpoglhhr```iiikskaskakaqen``hfbcemkkkaqq", +"asskqkkmh``fqsmmfffbbfmfcenh`rikr````rrrhhhnnnecebchr``djdlologglopdohr`kfr``rrhlhhlllpogpdlhhr``kiiqsskaksqasskc``p````hfcebkaq", +"bkaaqscr``kqafbbbfmmmcbfccnr`eiiiiiqmr````rrrhhnnfhr`rjjoddgoldppolpoh`hskksbr```rrhlhhhllphhr``qiiqsasqqaqaasamm`rjjdpr````hfec", +"rhfcbfr``sqkcffcmmmneefnefnr`qisqssiiiiikfrr``rrrn``rjjgolpplppddlpllh`bkmemmkskn```rrhllhhhr``iiiaakqkqaqskaqkcn`gjddjjjjpr```r", +"```kn``rsqmefbmmmbfbmccbcfh`riqakkqaasaqiiiir``````pjjogdggoodglgolohr`smefeffbbksaer```rrr```iiiaakkaasqsqsaske``jggoopodjjjjpr", +"j`````rqqkmeeefbbeemfmbmfnh`fikaqkqkqaakakqqm`````pjjpdppdlopolpologh`rqeebcfcmccckkssh`````kiiikaqsqaqssaaqqkkb`rjpldgoogllgdjj", +"gr```nqsmcfcemmfmebnefebcnr`qiaqqaksksqkssqqsr```djjgdlpdglgllgolplph`famfbbffcmcemfmbm````qiiqaaqasaqaaqqaakscb`gjoloogpdoldlll", +"gl``bqsmcbcmfmeefemefmefehrriqsaqsqqqsasqsqqqf``djjglpdgplgdpoggpldlr`kkfmffmmmeemffcnmh``iiiqskqkaqaksakqsksae``jgollgpodololod", +"ggr`qkbbfmcemffmcmcefnccfh`fisaaaqksqaaasqqqqm`hjddppoggpggddgpglglhr`qmmccnfbfbbnfemcmm`niiskaqsaqkaqakkasaakc`rjdlgooggoolgopp", +"ggl`nbbmembceefefmbfccbcnr`qiskkkqkqaskkkqaaqq`rpoggggglpldppgollgph`habmebemfbcmfcfefcm`rqakaaqaaaaakakaqqsamc`gjplopppgglloodp", +"dggr`beccbmfbbfecemfmfbchrriissaqkkqqasakaasqqhrodlpllgolgdgglgoloph`mkcmmbbnmemfbccmbbmn`qqkqaqkqqqsassqkkaqe``jgppoglgddpggpog", +"lggl`nbebeeccfbbemmenmbfh`nisqasaaqqkakaqkasqqm`olgdogplpgglllgopohr`skcfbmbecbefmfmbmbmc`aqsskqkskaaqkasaqakc`rjpggllpoglpopgod", +"lppgr`beeebbcbcffnmmfbbnr`qiqssssqkqsaaaqqqsaqq`hoplggpogodglpdoloh`rqemfneecmffbnbcfemcm`mqsasqqqaasakqkkskmc`gjgppdlloodpgoggg", +"goggl`nbcfmfmeefmemcfmbnrriqkkasaasqsakkkqaasqqr`glpogdlglpppgpgglh`fammffefnmemcbbfbememr`qqsaqakasaakkqssqc``jdldodllogllpodlo", +"lgppg`rbeefffmfnnfcbeffh`niqqqqaskkaakaasssqsqqb`gpdlgldgoglggglghr`amnmfmeemffbcbneffefmh`qqqsakaskqqasksqke`rjgopodpglggoppdgl", +"lgllgl`nmbfceefmmffnnnnh``hsqqssssssqqaaaasssqqs`hodllppogpldopophr`remmmmfmfmffefbbfmcebf`qqskqaaasqakqassme``ppgopgllooglolgop", +"pgplgg`rbmmmfbenfnnnhr``````kqqsasaaaqqqaqsaaaqqr`glgldggolodlllhh````rmmccecfmfefeeeceefb``qqaaqsaaskakskmer```loggoglopplgoopg", +"gdoppgh`nbfnnnnnrr````````r``mqqasaqssasqakasksqf`gplgggllllhhlhrr`````rmmmmfebefcfmmmfcbb``qqqsqsasskmbecer`````rogggddogpoplpo", +"oldlopg`rcnhrr```````lggjjjjr`nqqaqaqssaqskkasaqa`lgpplhhhhrrr````reiiq``cmmfmffmbmfnffemmr`aqqkakkbcfnhr````rnae``lggplglpldppp", +"plloopgr`rr`````hoogjjjjjjgpgr`rqqsqsssqaksqkqaqqr`hhphrr````rhiiiiiiqqk``nmbenfmbcfmfmmmmhr`skmcnhr````rnksqakkkn``hggplloplpdl", +"plgglggg```rldgjjjjjjgoppoldggh`raqssasksaqakaaqqf`hr````raiiiiiqskaaqqqq``nmecfebmcmmbbebn``hrr```rhkqqakkccmncbefr`hpggllldpog", +"gdplolgggdjjjjjgdpllpopdgpgoppop``mqaqaqqsaqaakqqk``rmqiiiiiqsqqakqqqskqqq``rmcbbcfcbebbmff```rhmsskkkmcemmeccebmcmbr`rpggoploog", +"dgggddgjjjggpopgllggogogpplpoodgor`nqqksssqqqqkqqqqiiiiqssksqkaakaqkaqaaqqqh`rbbbfmmcfnccmcmqsakkebmmmbbmnefmbecmmfemr``gggglpdl", +"ppdgdodgdoplolgpplggpdplddgploppggr`rqsqaqsaaqkasqaqaaaqqkqsaqaqqqqasqsaasqqn``emmmffmmbcbecmbfmfmmfbebmemffcccbbbmmmcn``hggggdp", +"glpgldooggglppggdopplppggdlpppolgpgl``kqsqaqaqqkskaaqqaqkakakkkskaksakaaaqaqqb``nmfbcebmnefmcnfeffefcnmnmmmbbmmffemefcbn``rggglp", +"gpdloldpllgloppgdglpplogdpploloodopgp``iqskaaqkskqakqaksqksqsakaaskqssasasaaqqq``mcffembmcebcmmbmnemmcefcebenmeemmbenbmmer`rgggg", +"goggplpgdoogoplopodloldpplopodllllolor`rqaaqsqqaasqqqkqsskqkkqqssqsaqqassqsaqqaar`nmeebmbbeefebbmmnfbbbmcbmemmcmfmbbmbbmbmr`gggg", +"lldpgdldpgpoopoopgpgpdldlopgdddppppdpr`iisaakakaassaqaaqqssassksssasakkqaassqasabr`efbfeenemffmbmfcfmebefmeeefmeefbmffnmcnr`jjpl", +"odlpgplgpopgpoppgpdlpggdpoplppooggplr`biaaasqsaqasasqkkkqasaqkaqkqqqsskqskksaqaf``nsmmffeefbcmfcceecbfebbmmmccbemebmbbmfh``ljjlg", +"pgollggldoglpogdggpolplpgogllloopoh``miiqsakaaqakaksaaaaaqkqkksasqaqksqaqksaskh``mskbbmmbbecbbmbmmefmbffcfbbeefffmmfmfcr``gjogpo", +"ddgllollhhhlpgpplplgdlgggloppdgdoh``kiikasskaaaqqssasassksakqsaaqssaaasssaakbr``kamfbfbbcffehhheeeemfmememmebcfbfemmmnr``djollop", +"pglggoghr`hhhhhlhpoopploplpgpdopr``kiissqqksqkakaaecbmkaqakaqksqqsskaasaqkkfr`rskmmnemmmmfmfhnnhhhnenebfecfbbmembmmenr``jjdogpdg", +"pgllldhhr```rrrhhhhhhhllllplpgpr``aiiasksqaqsaqksc````rnfcmkkkaqkaaqqaaskmn``nskmmfemmnbcmcnn```rrrrrhhncecbfmffeffhr`rjjpoplppo", +"lloogohp`nmerr```rrrrhhhhhllgor``qiiqqssqaqqqksaqh`gor`````hnecmkkassaqsbr``ksbcmeccbbemebehr`ab``````rrrhnfccfffnh``rjjpgdlpogd", +"plpoolh``ackasqkbhr````rrrrhhr``qiikqsksaaaaasaskr`jjjjdghr`````nfeecmbfr`raakmeembefbbbmeeh`niiiiiqk``````rrrhenr``pjgpglplodlo", +"lpgdohh`rsefnfbmksqqsmh````hr``iiiasaqasqsaksassb``jjogdjjjjjglr`````nh``hskemfccmmnbffmmfhh`aiqiiiiiiiiiqrr```hr``gjgplldglppgo", +"dgdlohl`mkbcmfmfbffmkaqq``````iiissakaqqaasqaksan`pjdgpoldoldddjjj``````cskfmbeffmmbfcbcnmhr`iikaqsaqqqiiiiii`````jjolgllgoddlgp", +"glpplh``qcbfffbcecmffnemc````iiikqqsaaaqqqaqaaakr`gjpgpolgpgolgllgp````aabmbcfbemncfcmffmch`hiqsakaqassaqqqqa````jjgollpgoogdpod", +"gogohh`hafmcfcmmfembffmmm```iiiaaaasaaakqaksskqcr`jdlglgpgollgpdpgg``hskmffcmfffcfffmcffmnh`kissaqsskasssqsqq``rjjgoplogogdgodll", +"pllohl`kmfebemcbbcmbfefbm``iiisaasqqskaaaaqassae`rjddlodgogllglllpg``skeebfmmmmcbcfmfbfnnhr`iiaassaqqakksskqq``jdgogogppldpldopd", +"poloh`rqbmfemenmeenffbecmn`sisqsssakkasassaqaqmn`gjloglgpogopppllpgl`nceeeeccbfemcffefeffh`hiqsssssksssqsqkqqk`plglglllgogplollp", +"dpgll`fambecbnbbeefemfccmb`bqasssasaskaqqqksssch`jjdgpgdllggppppgpgo`rcbbeemcmfnfnmcmfcmeh`kisaassssqakkskqkqq`rogpgpdlglolgdogp", +"odghr`akmbfbbmcbfcmccmffbm`hqqskssaaasskqaaqkke`rjgdlpgppglplpgggpgo`rfcbmfmbmmfbcfffffmnr`iiaaqkqasaqkaksasqq`rodpogllppdlgpggp", +"ollh`rqfffbbmfffmmbmebbemm`rqskssqqskaqqksasamc`pjdglppgpglogoogopogh`ecefmemcceceffemmnhr`iqskaakaaqksqqqaqqqm`oggogogllplpooop", +"glhh`bkmefcfmfmbcfecccbeemf`sqqkqaqkkqaakaqqsee`jjlddplppolopdoopolgl`nccmmcebnecbmcfecch`miqkqkskaaskskkqqqqqq`hodpopgogppgoloo", +"oph``qkfmbmmfeemccmcmcbbfmb`bqaqqqkqqqsaaqkkkc`rjdpdppggoologogpdopgg`rnfbbbfmfmffemfcehr`iiaassqqssqasssqkaqqq`rolggoopglpgdpld", +"oph``emmbffmefemmfecmbbfmbm`hqksqaaqksssaqssbm``jgoppllpgllgdolllologr`mmemcembmcfmccmbhr``fqqqqasasqkaaksssqqqc`odpgpppgdpgpogp", +"hhr```bmmemffcbeecfmcccffem``qsasakaqaaqqsqee````pgggllpglpllpgllggogg`hcfcebfmbbcbfbcch````fqqakskqqsqkskqsasqs`hplolgpggodpgld" +}; Index: external/mit/ctwm/dist/xpm/background5.xpm =================================================================== RCS file: external/mit/ctwm/dist/xpm/background5.xpm diff -N external/mit/ctwm/dist/xpm/background5.xpm --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/xpm/background5.xpm 3 Sep 2015 12:20:01 -0000 @@ -0,0 +1,155 @@ +/* XPM */ +static char *background5_xpm[] = { +/* width height ncolors chars_per_pixel */ +"128 128 20 1", +/* colors */ +"` c #63217C", +"a c #391042", +"b c #6D2A88", +"c c #42185A", +"d c #1C0724", +"e c #4A185A", +"f c #421852", +"g c #421052", +"h c #291039", +"i c #290839", +"j c #210831", +"k c #52186B", +"l c #4A1863", +"m c #391052", +"n c #311039", +"o c #290831", +"p c #521863", +"q c #39104A", +"r c #311042", +"s c #5A1E71", +/* pixels */ +"nhhioddddddddoojddddddohhnrqglsbbb`kpecgggcelksbbseqrihnrqrrhhnrqfeeeecgqqqqqqe`bscmmqqqrrqqqqqrrrqfcgrojdjohnnnrqflks`bbbb`keqr", +"nhnhoddddddddoojddddddoooonafp`bbb`specgggcepsbb`kgrhoohrqrnhhnrgcelefgqggfqqqes`pggfcfmqaqqqqqrrnrqffqnoddjihnhnrgeks`b`bbb`kca", +"nhhhijdddddddoooddddddddjonqek`bbb`kpecgffelkbbbkeqrnoohnrrnhhrqfelecqqqceegqglsseggelefgqqqqqqrrnnrqggrhojjohnnnrqcks```bbbb`pq", +"rhiooodddddddooojddddddddorqeps`bbskpecffcek`bbsegqrhooihhhhhnqgeplegqqmepeqqgkskcgcpklefqqqqqqrnhhnrgfqriooohnnnnrglsbbbbbbbbkg", +"qhoooodddddddjihoooojddddorgelpsb`skleeceepsbbslfqarnhhhhihhnrmelklgqqqgeleqqcsspcfepklecgqqqqarnhhhrqfgqrhoohnrrnrqes`bbb```bse", +"qhojjjdddddddjhnhnnijddddorqgcls`sklleeeepk`b`pcmqrnnnnhhhhnrqflppeqrrqceefqqlb`lffclplecgqqqqrnnhhhnrqfgqriohrrrnnrfksb``sssb`p", +"gnojjjdddddddonrrrrhjddddorrqflsskleeellpk`bbsegqrrrrrrrrrrrqgellegrnrgccgqqgkb`lfgfelleefgqqqrrnhhhnrqgcgrhihrqqrrrmekssskks``k", +"frhojddddddddjhrrqrhjdddoohnrglsspeccelpk`bb`kfqqrrrrrraqqqqgcelemrnrqgfgqrrgsb`lfggeeeeecfggqqrnhnhnrrmffqnhhrqqqrrqglkkkkkk``k", +"eqrhoddddddddohrrrrhoooooooirglkklcfcelksbbbkefqqrrrqqqqmggfceecgarraqqqqnnrfsb`pcggceeeeeeecfgqrnrrrraqgfqrhnrqqmqaaqclpkkks``k", +"egqnodddjddddoinrrrnnnnhodjorgkklefgcepsbbbspegqqqqqqqgfceeeeecgqrrrqqqrnhnrcs``kefggfeelllplefqrrrqqqqqgfgrnnrqgfgqqqfelpkks``k", +"lfqnojddjjddjohhnrrrrqrhojoorfkkecffeek`bbspecfgmqgggfceeelleegqrrrqqqrhiirqes`sklegggcepkkkkpeqarqqgqqgfcgrnnqgcefqqqgelksss`sk", +"lfqrhjddjjjjoohhnraqqqrhojohaflefgffelk``slecffffceeeeecelllegqrrrqqqrhooorqes`skplfggcekss`skeqaqgcecfccegrnnqgceegqqgcpks```sk", +"egqnijdddddjohnnraqqqrrhiohrqfffgggfeks`speffgceelppeecfcelegqrrraqqrnooohrmes`skplefgclk````keqqqclppllllfrnnqgceegmmgeks````sk", +"eqrnojdddddjohnrrqqqarnhhhnqmggqqqgfes``kefgggelkkkleffgfcefqrnnrqqrnhooohrmek`skkpecfels`bb`kcqqglsssskkpcannqgcecgqqfeks````sk", +"fqrhojddddddohraqqqrrnrnrrqqqqqqqqgflsb`pefggfekssklcgggfcfqrnhnrqrrhhhhnnrqeksskkpeefepsbbbslgqqcksssssskeqrrqqfcfqqqcls``b``sp", +"ganhojddddddohrqggqrnnrrrqgqqqqqqqgeks`klcfgfclkskpecggfcfqarhihrrnhhnnnrraqekssskpeefepsbbbkfqqglsskkssskeqrrrqgfgqaqcls`bb`ske", +"qrnhojddddddohrqfgqrnnraqggqaaqqggclkskpeeccelksskpeeffeefqrnhhhnhhhnrrrrrqqclksskpeefcls``spmqqfksklepkkklfqrraqmqarqcps`bb`spc", +"qrhooojdddddoonqefqrnnrqfcgqrrqqgclkkkleeeeelkssssklecceegqrnhhhhhhnrraaarqqfepkskpeegfeksskeqrqckklccelkkpegrrrqqqrrqclk`bbsklg", +"rnhoooojjjjjoonqefqrrrqgecqarrqgepkskpeeeelpkks`sskpleeecgqrnnnnnnnrrrqaaaqqgclkskpleggclkklcqrqelleffelpkkpcqqraqqqqqclk`b`skeq", +"rhioooooooojoonqfgqrrrqepeqrrrqflksspeeeelpkkssssskkpleefmqrrnnnrrrrrrrrarqqmgepkkplegggceefqarqeecgggfelkkklfqqqqqqmgclk```klfq", +"rhioooooooooohrqmqarqqgekeqqqqgeksskllllpkkkkkskkkkkkleecgqqqrrrqqqrrrrrrrqqqgclkkplecgggffmqqqclegqqqgelkssklcgggggfcelk``spegq", +"nhioooooihhhhrrqqqrrqqflpeqqqmckssklllpkkkkkkkkkkkkkkleeecfgqqqqqqqrrnnnrrrqqqfepplllefggmmqqqgepeqraqmclks``skleccceelkssskegqr", +"nhhooooohhnnraqqqraaqgellcgmgcpksklelpkssskkplppkkkskpeceeeecggmqqqrrhhihnrqqgfeelllleecfggmggfpkeqrrrqfls`b``skplllllks`skefqqr", +"nhhooooohnraqqqqqrqqqgelpleceksskleelkss`skpleelpkssklefceeleecgqqqrnoooohraqgfcceellleeecfgffckkeqrnnqgls`b````skkpkks``sefqqrr", +"nhhooooonrqqqqaaqqqqmgelkpllks`splelpks``skpleelksssklcggfeeelefqqrnhoojohrqmfcfgfeellllllleeelkpcqrnnrqesb`sss```skss``skcmqrrr", +"nnhoojoonrqqrrrrqqqgggcelppkkssklellks```skleeelk``skefqmgfcellcqrnoojjjoonqgcfmqmfelpppkkkkkkkklgqrnnrqesb`kks`bbbbbbb`kegqrrrr", +"nnhoooohrrrnnhnrqqgggggfceelllllllpkks``sskplelks``slcgmgggcellcqrhojdjdoonqffgqqqgclkkkksssssskegqrrnrqck``kkksbbbbbb`slfqarrrr", +"nnhoooohrrnhoohnaqgffggqmggfffcellkkss``sskkkkks``skefgmmmgclplfqnodddddjonqcfqqqqmflpks``````spcqqrrrrqfksskkks`bbbb`slcqqrrrrr", +"nnhooohrqrhoooihrqgggmqqqaqqqmgcelkss``sssskss```sklecfgffelplegqnojddddoonqcgqaqqqfeks```ssskkecgqrrrqqflkskkkkkssskklegqqaarrr", +"nhioihnrqnojjjohnaqgqqrrnnrraqmgelkss`ssss``````skpeecccellplefqqnijddddoonqgqqraqqgeks`skkppllecgmqrraqgepkkplllleeecfggqqqqrrr", +"rhoohnrqqnojjdoohrqqqrrhhhnraqgfelkkssss```bb``skkleeeelpkkpefgqqrhojjjjohnrqqrrraqgekssklecffceecgqqrrqqflkkleccffgggggggqqqqar", +"rhoohraqrhodddjoohnnnnhhhhhnaqmgcelpkkss`bbb`sskklleeelkssklcgqqqrnhooooohnrrrrrrrqmeksklcgqqqgfeecgqrrrqgellegqqggffgfffggqqqqr", +"rhoohrqqrhojdddjoohhhhhhnhnrqqggfceelpk`bb``sskkkpplllks``kecggqqqrnnhhhhnrrrnnhnrqqcpkkegmqqqqgceefqarramelegqqqgelleeecfgmmqqq", +"rnhonqgqrhojddddjoihnnnnnhnrqggggggfelk``b`sskkkkkkpkks``skecgggqqqrrnnnnrrrrhhihnrqflklfmqrrrqmfeecgqrrrmelfqrrmclpkpleefggggmq", +"rnnhrqgqnoojjdjjoonrrarrnhnrqffggqqmflkssssskkkkkkskss```skleccfgmqarrrrraqqrhooihrqglklgqqrrrqqgccfgqrrageemrrqflpkkkpeefgggggq", +"rrrrrqqrhojjjjoohnrqqqqrnhnrgcfgmqqqgekkkkkkkkkkssss``b`ssklleeeecgqarrrrqqqrhojoonrqepeqqarrrqqmgggqqaaqfcgqrrqclpkkkplefgggggq", +"rraqqqqnojjdoohnrqqggqqrnhrqgccfmqqqmcllllpkkkkkss```bbb`skkpllllefqqrrramfgrhojjohrqelcqrrrraqqqmmqqqqqggmrrrrqcllpkkplefgmmgmq", +"qqqgcgrhodddohrqqffcfmqnhhrqmffgqqqqqgccccepkksss``bbbbbb`skkpppplegqrrragefrijjooonqcegarrraqqqqqqqqqqffgqnhhrqfelllpllefgmqqqq", +"qqgelfrojdddonagcllefqanhhrqqgggmqqqqqgggfelkkss````bbbbbbb`skklleegqrrrqfcmroooooinqeegrrrrqqqmqqqqqqgcgqrhhhnamcelllleefgqqqqq", +"qqglpfrojdjjhrqflkklcqrhhhrqqqmgmqqqqqqqqmfepkss````````bbb`skpleecgqqaqfcgrhooohohrmecqrnrrqqqmqqqqqgcfqrnhiohnqgcelleecgqqqrrr", +"qmcllmnojjoinrqclkklcqrhhhraqqqmgmqggqqrqqgelksssssssss``bbb`klecgggmqqcefqniihhhhnaflegqrrraqqqqqqqgfcgqrrnhoihrqgeeeecgqqqqrrr", +"qgelcqhooohnrrqclkklfqrhhhrrqqqqmqmgfqrrrqmfepksssskkkks`bbb`klfgqqqqgelcanihhnhhhrqepefqrrrrqqqqqmgccgqrrnnnioohrqfcefgqqqqqarr", +"qclemrhihnrrrqqfeplefqrnhhnrqqmggggffgqrrrqgcepkkkkkkkks`bbb`kegqqqqqelcqnhhnrrhhnrglkpegqqqqqqqqmgelcmqrrrrnhhohnrqgggqqqqqqqqa", +"mepcqnihnrraqqmfeeecgqrnhhhrqgfffggfcgqrrrqqgfelllllppkk`bbbskegqaqqgecahhnrrrrhhnqcpkkklcgqqqqqqgcllegqqrrrrnhooohnraqqqqqqqqqq", +"flegrhhhrraqqqgfcecfgqrnhihrqceecggffgqarrraqqgfeellpkks`bbbspegqqqgfgahihaqqrnnnagepkkskpefgqqqqgceeefgmqqrrnnhooihnrrqqqqqqqqg", +"llganihnrrqqqqmgfccfgqrnhoirqceefgggggqqrrrrrraqgceepkk`bbb`kleggqgccahohrqgqrnnrqelppkkkkpefmqqmgceeeeecgqarnhhhihhnraqqqqqqqge", +"keqnhihnrraqqqmgfcccgqanhoirgcfgqqmmmqqqqrrnnnrrqgelkssbbbbskeeffceegnoirqmqqnnrmellleeepkkpefggggccecellegqrnnnnrrrqqqqmqqqqgcp", +"emrhhohnrrrrqqqgfcccgqrhojorffqqaqqqqqqqqrnnnnrraqclk`bbbb`speecepklqninqggarnrqclllecccek`sleeccffggggelegqrnnrqqgffggmqqqmgelp", +"qrrnhihhrrrrqqqggfcfgqriojhqfqrnrrqqqqqqrrnrrrrrrqepsbbbbb`skllels`eqnrrqgqnhnqclplecgggek``klleefgqqqqgeegqarrqgclplecggqggellc", +"rrnhhhhhnrrrraqqgffgqqnojjhaqrhhhnrrqarrrrrrqqrrrqek`bbbb``sskkks`sfrnrqmqrhhrglppegmqmgesb`kkleefqqrramcfgqqqgfeellpplcggfeeefq", +"rnnhhhnnrrrrraqqqgggqrnooonrrnooihnrrrrnnrrqqqrrrqls`b``bb```ss``slqrrqqqrnhnqfllegqqqqgesbbsklecgqqrrqgecgqmfeecfgcekklececfqar", +"nnnnhhnnnraqarrrrqqqqrrhhnrrnoojoohnnnnhhnaqqqrrqgps`sssbbbbbbbb`keqrnrrrnnnrqceegqqqrqgl`bbsklefgqarrqgeecfcccfgqqgclkklefqannn", +"nnnnnhhhnrqqqrrrrqqqqqqrrqqrijddjoohhhhhhnrqqrrrqeksskss`bbbbbbbskeqrrrrrnnrqqgfgqarqaqgp`bbsplcfgqqqqgceeecfmqqqqqqfelpegqnhohh", +"hnnnhhhhhrrarrrraqgfffggggmroddddjooooooihnrrrrrgeksssss``bbbbb`slemqrrrrrrrqqqqqrrqqaqgkbb`klecfggqmgceeefmqrrnrrqqgcccgqroojoo", +"hhnnhhhohnrrrrrqgelpplleeemnjdddddjjooooihhnnnrqflkssssssssss`sskpecgqqqaaqqqqarrrqqqqqesb`speeeeccceeeecgqrnhhhrrqqggmqqrhojdjo", +"ohhhhhioohnrrqqekssskkkkpeqhddddddddjjooohhhnnrqflkkskkkkpkkksskkpllecggqqqqrnnnraqqaqgkbbspeceeellppplegqrhioihnrqqqqrrrhojjdjo", +"oooihhhiihnrqgek```skkkplfqhddddddddjooihhnnnrqqfelkkkplllppkkkkkkkkkplefgqrnhhnrqqrrqe`b`keeceekks`sklfqnhihhhhnrqqqrrrrnoojjoo", +"ojjooohhhhragps```skleeecgroddddddddjoihnnnnnrqqgfeelllellpkkkkkkkkssskpegqnhihrarrrqesb`keceeepk`bb`slqrioihnnhnraqarrrrniojjoo", +"ojjjoohnrrqges``sklecggmqqnoddddddddjonrrrrrrrrqqmgceelllpkkkkskkkssssskegqnhhrrrrrqcs`speeceekk`bbbbseqnihhrrnnnrraqqggqrhojooo", +"ojddoohrqgeelkskpeefgqqrrnojddddddddohrqqqqrrnrrqqqgfelkkkksssskkksss`skegannnrrrnafksklefccepk`bbbbbseqnihnrrrnnrrqqgcegrhojjoo", +"oojjoinrqellecccccfgmqrrniojddddddddonamggqrrnnnrrqgfekkkkkkssskkpkksskpeqarrrrnrrgpkpcgggcepk`bbbbb`seqrnnnrrrrrraqfellfqnojjoo", +"ooooonaqgfccggmqqqqqqqrrnhioodddddddonqgffqqrnhhnrqmclkklllkkskklllkkkklcqrrrnrrqflkegqqqgelksbbbbbbskeqrrrrrrrrraqmclpkeqnojjoo", +"oooinrqqqqqqqqqqqqqqmmqqqrrhojdddddjhrqgffgqrnnnnrqgepleffelkkkpeeellllegqqrrrrqcppeqqqqqgeks`bbbbb`spegqrrrrrraqqgcepkkeqrooooo", +"hhhhnrarrrrrrrrraqqgfccfgqrnhjddddjonrqmggggqarnramceefmqqfekkpefffceecggqqaqqflppeqarrrqglk`bbbbbbsklegqqarrrrqgfeelkkpeqrhiohh", +"rnhhnnnnnhnnrrrrqqgelkplegqrhjdddjonrqqqggffgqqqqqgccfqqqqflkkefgmggffgggqmgfekklfqrrrqqqflsbbbbbb`skpefgqqrrrqqfelkkkplcqrnnnrr", +"rhooihhhhhhhnrrqqgepkssskeqridddjonrqqqqqfeecfgqqqqgmqqraqgekpcgqqqqgggqmgclksklgqararaqqfpsbbbbbb`skplefqqrrrqgelkskklegrnnrqqq", +"rhoooohhhoihnrqfeeks`b``keqnodddonrqqqmmgfecgqqqarraqqqqqqgeplfmqqqqqggggclsskemqrqqqqrqgek`bbbbbbb`skplefmqqqqgepkssklfqrrrqgfg", +"anioooohhooonqflpk`bbbbbkeqnodddhrqmgffcccgqarrrnnnnrrqqqmfeefgqqqqqqqgelllplfqqqqqqqqaqfek`bbbbbbb`skklecfqqqmflkkskkegqrrqgccg", +"qrnhiohhioohrglk`bbbbbb`kcqhoddjhrqgcelleganhooooihnrrqqgccfgqqqqqqqqgclklfmqrrqqmmqqqqqclk`bbbbbbb``skpleegqqgfepkkklegqqqgfcgq", +"arrrnhhoojohqek`bbbbbb`slgrijddjhrqclkkpcqnojdddjoihrrqgceefqqqaqaqqqfelefqrrrrqgggqqqqqcls`bbbbbbbb`skkplefgggcellecffggfeeegqa", +"raqqrrniooirgp`bbbbbb`klcqrojdjohrqepkpemrnojddddjonraqfelecgqqrarqqmfcgqarnnrqggfgqqqqgcls`bbbbbbbb`sskkklecgfceeefggcekkkklgqr", +"raqqqqrhoonqesbbbbbb`klfqanojdjohaglppegarnhojddddohrqqfelecgqarrrqqqqqrrnnnrrqgffgqqqqgeps`bbbbbbbb````ssklegggggfffclksb`slgqr", +"rrqqqqrhohrgp`bbbbb`kefqqrnojddonqceecmqrrrrrhodddohrqgfceecgqqrrrqqrrnhhhhnrqqggfgqqqgfeps`bbbbbbbbbbbb``skefgmggcepks`bbb`pfqr", +"qqqqqqrhihqckbbbbb`kegqarrnojddonmeegqrrrqqqqrodddohrqqgggfggqqrnnrnhooooohnrqqqgggqqqgfeps````bbbbbb`sss``slcfgfeps`bbbbbb`kegq", +"mqqqqqrnhnqck`bbb`kefqarrnhojddorggmqrrrqgfgqrhjddohrqqqqqqmqqarnhioojjdjohnraqqmgmqqqgceps````bbbbb`kpepsb`kllepk`bbbbbbbb`kleg", +"fmqqqqrnhnqfks`b`klfqrrnhhhooddiqgqrnnrqfeeegqnojjohrrrraqqqqqrnhojddddddjohnraqqqqqqqgfepks````bbb`spefek``skksbbbbb```bb``skle", +"cggqqqrrnrqgekkskpegqrnhhhiojdjnqqrhhrqceplefqroooihnrrrrraqqrrhojdddddddjoohnrqqqqqqqgfelks``````skpefgfeks```bbbskkkks``bb`ske", +"cfggqqqrrrrqgelplefqqrnhioojjdorqroohrglpkklcqrhoohnnnnnnnrrrrnijddddddddjooihrrqqqqqqqgelks`sssskpecggqgflk```bbspeeepks`bb`ske", +"effffggqqaaqqgcecfgqqrrnhooddjhrqhoorqcpkkkpemrhiohnnnnhhnnrrnhojddddddddjooohnrqqqqqqqgepkssskklecgmqqqqgclkskklecfcelks`bbbskl", +"cfcceellegqqqqmgggqqqqrnhojddjnrrooiqgekkskkegqnhihnnnhhhhhnnniodddddddddjoooihrqqqqqqqqcpkssklecgqqrrrrqqgfceefgmgggfeks`bbbske", +"ecelkksskklcgqqqmqqqqqqrnodddjrrhohrqcekkkkpefqrnhhnnnnhhihhnhiojddddddddjoooohrqqqmqqaqcksskpefgqrrnnrraqqmggmqqqgmggeps`bb`skl", +"eels```sssskcgqqqqqqqqqanodddoqnjorqfelpkkkpefqrrhhnnnnhiooohhhhojdddddddjoooohnaqqmqarqck`spefqqrnhhhnrrqqqqqqqqmgqqgelk```sskl", +"ppsbbbskks``kegqqqqqqqqqrojddhaodoqfelllllllecgqrnnnrrnhhoooihnhojjdddddddjjoohnaqqqqraqes`sefgqrrnhhhnrrqqmggffcfgmqgclksssskkl", +"ksbbbskllksb`kcqqqqqqqrrnoooinnodoqelleeccceecgqrrnnrrnhiooohhoojdddddddddddjoinrqarrrqglsskcgqqrrrnhhnnrqqgfceeecfmqqgelkkkkpkp", +"sbbbkleceek`b`lfmqqqqarnnhhrrrioonqelecggggfffgqqrrrrrrhhoohhodddddddjdddddddoohrrrnnrqflkklcqqqqqrrnhnnrqgceeeeecfmqqgfelllllkk", +"bbbslcgggfl`bbkegqqqqrrnnnrmgrojirmeeegqqqqqgggqqrrrrrnhhoihidddddddjjddddddddooihnnnrqekkpegqqqqqqrnnnnrqgcelllecgmqqqqgfceeeks", +"bbspeggmggek`b`kefggqqqrqqgecroohrqffgqqaraqqqqqqrrrrrrnhhnhjdddddddjojdddddddjooinrqqglkklegqqqgmqrrnnnraqgceeeecggqqqqqggfeekb", +"b`kcggggggfek`b`pecffggmgellgnoohrqqmqqrrrrrqqqqarrrrrrnnrroddddddddoijdddddddjoinrqmgclkklcgqqqggqarhhhnrqqgceeefgmqqqqqqqgclsb", +"kpefggeeefgflsbbsklllelllkklqnoohnrqqqrrrnrrrrrrrraaqrrrrrnjddddddddohoddddddoinraqgfcelkklfgqqgfgqarhhohnrqqfceccfggmqqqqqgekss", +"effggclplefgcp`bb`sssssssskcqnhooihnnrrnnnnnrrrrrrraqqqqgqidddddddddihjdddddjhrqqqgceeepkkefqqqgffqrnooohhnrqmfcccfgggmqqaqmeksk", +"gqggelkkkkefgek`bbb``bb`skefqrniooohhnnrrrrrrnnnnnrrqqmecrjdddddddddhidddddjhrqqqqqgeeelkpegqqqgffqrhooohhhnrqgceeecfggqqaqgekkl", +"qaqflksssspcgflk`bbbbb`sklefgqrnhooohnrrrrrrrnnhhhnrqfepgnddddddddddiodddjinrqrrrrqqfcelplegqqqgggahooohnnhhnrmceleecgmqarqglkpf", +"arqeks````klcfelks```sklleeecgqrrhhhnrrqqqqqrrrnhhrrqekeqodddddddddohojdjirqqrhohnrqmgfelecgqaaqqqrhoohnrrnhhnqcellecgqqrraglklg", +"rrgls`bbb`skefgclkkkkkpeeelllecgqrrrrraqqqqqqrrnnhrqckpfrodddddddddinnhihnrrrhojohrqqggfccgqqrrrarrnnnrrrrnoohqfepplcgqrrnrglkeq", +"rrfpsbbbbb`kpcggeellllllelpkkkplefgqqqqqqqqqqqqrrrqfllcqnoddddddddjhrrrrnhioooooonrqmgqqmggqqqrrraqqqqqarrnooirgelllcgqrrnrglpcq", +"rqek`bbbbb`skefggfceeeeelpks```skpecgqqrqqqqqqqqgfeeegqrijddddddddjhrrniodddddjoonrqqqqaqqqqqqqqqqggggqqrrnojonqfllefmqnnnrgllgq", +"qfps`bbbbbbsklegggffccelpks`bbb``sklcgqqqqqqggcelkpcqrrhiodddddddddoihojddddddjohraqqqqrrrqmggffceeeeefqqrnojohrqcccgqrnhnackeqq", +"mek``bbbbbb`kpefggggfcelks`bbbbb``skegqqqaqqgeksklfqrnhhoojddddddddddjjjddddddoinraqqqrrrrqfellllpkkkpegqrhojdohrqggmqrhhnqekfrr", +"gek````bbbb`kpefggggfcelksbbbb`````klfgqqqqgek``pfqrrnnnhiojddddddddddjooojdddohrraaarrrrqgeppleelpkkklcmqrhoddonrqqqrrhhrqelqrr", +"glkssss``b`skleggggffcelk`bbb````b`slcgqqqgek`skcgqrnnrrrrnojddddddddjonnhoddjhnrrrrrrrrrqcleefggfelkkplcqrnojddohrrrnhhnrqecrnr", +"qelkkkkkssskpefmmgffccelk`bbb````b`skecggfes``pcggfqrrqmgqrhjdddddddjinrrhojoonrrrrrrnrrqflegqqqqqgfelllefqrnoojjohhhiohrqgcgrhn", +"qgellllpkkkpegqqmgccccelk`bb````bbbskleelk`b`pcfceeqrqfcgqrhjdddddddonrarhooinrrrrnnnnrrqfefqqrrrrqqgceeeefqrnoojoooojohrgecqhoh", +"rqqgfceellecgqqqgfccffceksbbb```bbb`skkksbb`pffekkegqfleqrnhodddddjohnrrnooonrrrrnnhnnrqqfcgqarrrrrqqqmggffgqrnhioojjjohrfleqhih", +"hhrrqggceefqqrrqmgffggfels`bb```bbbbbbb```slcfekkpcgflkeqrnhodddddohnnhooohrrqqrnhhhhnrqgffqqrrrnnnnrraqqqgggmqrnhojjdohrcpeqnio", +"iohhraqgfgmqrrraqggggggclk`bb```bbbbbbbbslegfekkkefclkkcqrrnoddddoohhiojoirqqqrrnhhhnnrqfcfmqrrnnhhhnnrrraqqqggmqrniojoorfleqrni", +"hiooinrqqqqrnnrrqqqmgmggek`bb````bbbbbspefffepkkeffekskcqqqnodddohhiojddonaqqqrnhhhhnraqfefgqrnhhhnnnhhnnrraqmgfgqrniooormeegqrn", +"rrnooonrqqrnhhnrrraqgggfek`bb``s````sklfgfelpplecfek``keggqnoddjohiojddonrqqqrnhhhnnrrqqfeegqrhhhnrrrnhhnnrrrqqfecqrnooonqgcfgqq", +"gqriojohrrnhhhnnnnrqqggfls`bb`ssssskeccfcepkkecgfclsb`slccgnjdjohoodddohrqqarnhoihnrrqqqgcegqnionrqqqrnhhhnnrrqqfefqrhiohrqggfgf", +"fgqnojjohnhhihhnnnrrqmfepsbbb`sskkpeffelkkkklcggelk`bb`klegnojooiojjoirqqqrrniooohrrqqqgfccgqhohrqqgmqqrnhnnrrrqmcegqnhoihnrqqgf", +"qgqrijjjoooooohhhhnrqgelk`bbb`skkleffclks`klcgfclks`bbb`spgrojjjojjohrqgmqrnoojjohrqqmgceegqrhihrqmgggqrrhhhrrrqqfecqrnoooohnrqq", +"rqqrhojdjjjjooohnnrqmclks`bbb`skkeffeks``skeffelkkss`bbbspgrnoojoohrqgfcgqrhojdjohrqgfceleqrrhhnrqqgffgqqnhhrrqqqgccgqriojjjoohn", +"hrqrhojddddddjohnrqqclks`bbbbb`klcfcksbb`spcfcpksssss```slgqrhhohhrqceccgqnojdddohrqgelplfqrhihnrqqgfccfqrnhnrqqggcecqrijdddddoo", +"ohrrniodddddddohrqgclks```bbbb`klcepsbbb`kecclkssskkksssklfqqrrrqqfeeeccgqnojdddohrqflkpcgqnhihnraqmfeeegqrnnrqgfcelegrhjddddddj", +"jonrnhodddddddonqflkks``````bbbkeclkbbbbslffeks``skkppkkpecffgfelllleeccgqnojdddohrgellegqrnhooinrrqgellcgqnnrqfeelplgrhjddddddd", +"dohnnhojddddddorqekkks``skkksbbkeck`bbbbsegfps```sklleellelellpkskpeeellcqroodjjonqflegqqqrrnooohhragellegqnnrmclkkklgqnoddddddd", +"ddohrrnioddddjnrqfeels`skllpkbbkfckbbbb`kcgck````sklefffelkkkkkkkkplllppemrhojjohrqcefqrrrrrrniooohrqcllegqnnrgcls`slfqnojdddddd", +"dddohnnniojddonraqqgekskeceekbbpgcsbbbbslccls````skecgggepsskkpllellpkkkpcqrhooonrgcgqarrraqqqrojjonqfelcmqrnrgeps`spcqrniojdddd", +"ddddjihnhiojjjihnnrqelleggfep`blge`bbb`pefeks```skpefqqgepkkpleeeelpkkksklfqnhhhnqccqarnrrqqggqnodjorqfcgqrnrrgeps`spegqrrnhojdd", +"ddddddjooojddddjihrgecgqqqgek``lfe`bbbsefclk````sklcgqmgeeccfffceelkkksssklgqnnnrgecqarrrqqfcegqhjdjhrqgqqrnrrgeksssklefgmqqrhjd", +"ddddddddddddddddonammqrrrqqek`seflsb`skcgcks````kpefgggfcgqqqqgfcelpkkkssskefqqrqfefqrrrqgclpklgrjddonrqqrrnnrmepsskkppkkpleqrod", +"ddddddddddddddddorqqrnhhrrgls`kecekssklffeks```skleffccfmarraqmgcelpkkkkkkkklcggfeegqqqqgelkkkkeqoddjohnrrrnnrqcpssskkss`skkeqhd", +"dddddddddddddddohrrnojoohrgkb`pcgclklecgfekssssklefffelfahhhnrqgfellpkkppkkkkpllleefggfelllllkkeqhjdddjohnnhhnqgls``ss```ssspqhd", +"dddddddddddddddinnoojddjhrfsb`lfgfeeefggelkksskpecfceplgrooonrqmfeellpppllllpkkkkpleeelppleccelefahddddjohnhnnames`````sskkskqhd", +"ddddddddddddddjihojdddddiqes`slfggfffggfelpkkkkleffepkeqhooohnrqgceellllleeellpkkkkpeeeeefggggclegroddddjohhnnrqeks```sskksskqhj", +"ojddddddddddddoooddddddjhqlkkpleecfffffceelpkkklecclkpgrhihhhnrqgfcelllleccfccepksskegmqqqqqmggelcqnoddddohnnnrqflkssskkss``kqno", +"iojddddddddddjoodddddddorgeeeellleeecfccceellppllllplfqrnhhhhhnrqgcelllecgmqgfeksskegqrrrqqqqqmfelcqnjddddohnnnrmclkkkkksbbbkmni", +"hoojdddddddddohodddddddirqmgfepkkkkpeecffceelpkkkkkegqrrrrnhhhnrqgcelllefqqqqgek`slfqarrrrqqqqqqgcefahodddohnnnrqgelkkss`bbbkgrn", +"nhhodddddddddoojddddddjhrrrqgeks``sklecfggcelpks``pgannnrrrnhhnrqgcellefmqqaqqesbsegqarrrraqqqqqqmfegahdddjohnnnrqclkks`bbb`kfqr" +}; Index: external/mit/ctwm/dist/xpm/background6.xpm =================================================================== RCS file: external/mit/ctwm/dist/xpm/background6.xpm diff -N external/mit/ctwm/dist/xpm/background6.xpm --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/xpm/background6.xpm 3 Sep 2015 12:20:01 -0000 @@ -0,0 +1,174 @@ +/* XPM */ +static char *background6_xpm[] = { +/* width height ncolors chars_per_pixel */ +"128 128 39 2", +/* colors */ +"`` c #98969F", +"`a c #D1CCCD", +"`b c #BEB0B7", +"`c c #686B62", +"`d c #857785", +"`e c #797979", +"`f c #322E30", +"`g c #616161", +"`h c #C9C0C0", +"`i c #BCBBBD", +"`j c #3C3B3C", +"`k c #1C1C37", +"`l c #828487", +"`m c #51404D", +"`n c #7C706D", +"`o c #685B60", +"`p c #371C1C", +"`q c #4D504F", +"`r c #756069", +"`s c #B1A1A7", +"`t c #ADA9A6", +"`u c #6A6A6A", +"`v c #9A848C", +"`w c #727275", +"`x c #635159", +"`y c #585858", +"`z c #816E73", +"a` c #484848", +"aa c #888E94", +"ab c #E1DFDE", +"ac c #918E8C", +"ad c #564D52", +"ae c #A1A1AC", +"af c #70647C", +"ag c #282828", +"ah c #B2B2B6", +"ai c #8F8279", +"aj c #A69496", +"ak c #5B5C6A", +/* pixels */ +"`u`mak`w`lak`wae`w`l`iae`w`j`fagag`yae`i```g`y`lah```a`h`l`lah`w`y`u`e`e`lahab`iah```l`l`u`j`fagag`j`u`u`u`w`u`g`y`g`y`y`y`g`u`w`u`g`y`y`w`uac```u`e`e`u`ya`agag`f`c`sad`j`o`o`y`c`r`y`x`x`x`cac`h`h`h`a`b`h`b`s`t`n`eacaia`agagag`j`wah`iae`i`i`i```l`e`l`eak`u", +"`yakak`waa`w`u`````lae`w`fagagagagagaga``l`u`y`g`lacacah`tae`h`w`y`q`w`l`eac`i`i`i`a`t`gagagagagagagag`y`l`w`u`g`u`g`g`g`u`w`u`w`w`y`y`g`g`w`l`e`w`l`wa`agagagagagag`f`j`jad`q`y`x`n`cada``x`oajababab`h`h`haj`bac`n`n`qagagagagagagag`uae`i`iaeahae`e`o`u`u`y`m", +"`m`e`eaf`l`d`eaaae`u`fagag`f`d`a`l`fagagag`ja``y`g`e`l```t`a`h`w`q`q`y`w`e`l```````u`fagagag`y`i`e`fagagaga``w`w`g`g`g`u`e`w`w`w`u`g`g`g`u`w`u`g`l`qagagagag`g`i`w`fagagag`f`qad`y`n`o`j`q`x`oaj`a`bab`b`hajaj`h`n`fagagagag`u`a`uagagag`f`eae``aeae`w`q`m`q`m`q", +"`g`````e`w`eaaak`fagag`f`l`aae``ae`h`l`fagagag`j`q`g`u`l`t`i`l`y`qa``y`g`w`l`e`qagagagag`g`aaj`caiah`w`fagagag`q`w`u`u`wac`e`g`u`u`u`u`u`u`ya``jagagagag`gab`s`o`nah`w`fagagag`j`y`oadad`y`y`c`b`t`v`t`h`saiaj`yagagagag`uabab`aab`h`g`fagag`f`g``ae`e`q`q`m`w`w", +"aa`w`iae`w`qagagag`f`l`a`d`uaf`d```i`b`i`l`jagagag`j`g`u`l`t`e`y`w`u`g`y`y`qagagag`f`wabaj`q`q`oai`zai`t`u`fagagag`j`q`g`w`g`g`u`u`g`g`ga``jagagagag`wab`haj`r`o`r`naiah`e`fagagag`f`y`y`n`nai`b`s`t`t`h`t`jagagag`f`wab`a`a`a`aab`a`bah`gagagag`f`u`l`q`q`g``ah", +"aeakae`eagagag`f`l`a`lakaf`u`raf`````v`d``ah`l`fagagag`j`u`l`w`y`lae`l`yagagagagacababaj`ya`ad`c`n`n`x`xai`t`uagagagag`j`g`y`g`u`y`y`u`jagagag`f`nab`iai`xai`r`o`oai`r`oai`b`e`fagagag`maiaiai`t`bacacadagagag`f`e`a`aah`habababababac`eae`i`yagagag`f`j`qafae`h", +"ae`uagagag`fac`a`lak`x`xakafaf`d`dafaf`d`d`vah`a`l`jagagaga``u`y`g`y`fagag`jaeab`h`aabaj`x`mad`oaiac`c`x`cad`nah`gagagagag`j`g`u`ga`agagag`f`labajai`z`o`oai`n`x`o`r`o`najaiac`b`w`fagagagadaj`h`ia`agagag`facab`h`uahae`iabababab`a`l`lac``ahah`yagagagagakaeae", +"`fagag`f`l`a```dak`o`y`y`yaf```v`o`x`w`d`d```hab`h`t`l`jagagagagagagag`jah`a`t`sacaj`aaj`y`qad`x`eac`o`xa`a`ad`xacah`yagagagag`fagagag`f`lab`hai`o`zai`zajaj`vai`r`oai`h`haj`v`n`e`t`w`fagag`f`jagagag`facab`t``ah`l`i```iab`aabab`aacae`l`l`dac`a`i`qagagag`f`f", +"ag`facabah`e`e`dafak`y`m`m`eae`d`y`y`raf`d`babab`iak`xae`l`jagagag`q`h`h`n`n`naiaiaj`baj`oa`a``yaiaj`n`y`ma`a``y`c`oaiah`yagagagag`j``ab`saiai`z`x`zajaj`saj`sai`r`z`sabaj`v`r`x`xad`n`i`e`fagagag`j``ab``aaaa`s`t`t`h`tah`a`h`hab`aac```e`l`e`e`aab`aah`qagagag", +"ag`hab`aaeafaf`daf`yak`qakak`vaa`x`yafaaaeabababah`daf`y`oahagag`u`i`n`najac`n`n`naiajaj`oa``m`yajaj`n`yada`ad`y`o`nai`naj`i`jagagab`h`sajaiai`z`raiajaj`v`v`z`r`rai`v`s`z`zad`o`o`raj`vaj`bagag`jabae`e``ae``ae`lah`a`i`i`a`hah`b`aaeaa`w`e```t`hab`i`iah`t`jag", +"ag`iah`b`s`d`e`d`dakakak`v`d`d``af`r`d`b`aabab`b`s```d`mak``agagac`oaiaj`a`bac`n`n`nai`n`cada``n`vai`n`x`qa``r`o`y`naj`n`n`b`nagag`a`h`b`a`s`vai`s`b`b`sai`z`r`o`naiai`z`r`r`r`o`r`v`vaiaiaiagag``aeae``ahah```e```a`a`a`a`a`hah`i`a`t`e`u`nah`h`t`a`saa`i`l`jag", +"ag```b`i`daf`d`d`d`d`d``ae`d`raeae`v`d```i`h`iae```d``ak`raeagagae`n`t`hab`hai`r`n`n`oad`yadad`nac`n`n`r`q`x`n`yad`najaiaj`b`bagag`i`sabab`h`v`v`s`a`aai`r`e`z`r`o`eai`r`o`x`o`o`r`z`n`o`oadagagahaeae`i`aae`w`g```iahah`a`aah`iab`a`e`r`y`l`i`h`t`a`tac`a`t`wag", +"ag`yabab`rakafaf`d`s`b`sae`dak``ae```daf`daeahae```d`d`````rag`jaj`v`hababaj`n`n`n`n`ya`ad`y`caiacai`n`n`o`o`y`o`nac`h`h`taj`tagag`l`s`a`b`h`s`vaj`s`s`o`o`r`o`x`o`r`o`o`o`o`o`r`r`x`x`gad`jag`faeacah`a`aae`g`uacac`d`eac``ac`aab`h`w`y`uac`i`h`i`a`i```h`h`uag", +"aga`ab`i`x`m`x`e`v`vaf```v`e`d`d`daf`u`x`u`v`````saa`dae`b`yag`g`t`t`h`h`bac`n`n`n`cadad`x`xaiaiai`n`naiai`c`x`n`t`sab`hac`nai`jag`w`h`saj`h`haj`s`sai`x`xad`q`x`r`yad`o`r`z`r`o`x`o`xadad`jag`c`eacahae```e`y`n`l`w`l`e`u`e`lababah`gad`waa`b`a`a`i`i`h`h`a```j", +"ag`j`h`d`q`j`m`v```y`y`d`dakaa`d`o`m`q`m`rah`b`vaeae`d`d`b`jag`u`h`h`hajaiai`n`n`xadad`y`y`n`n`n`naiac`t`tai`nac`h`hab`hai`o`ra`ag`x`saj`b`h`aabab`h`vai`r`x`o`r`oad`m`rai`oadad`r`o`m`mad`jag`l`uacae`w`g`y`y`w`wacaa`lac`l```aabah`eak`wac`i`h`h`t`i`a`a`a`h`j", +"agagahak`ma`akae`da``m`d`d`x`v`d`y`m`m`qaf`a`a``ah`b`daf`dagagac`aab`s`n`nai`vac`ca`adad`y`c`c`oai`h`b`b`aai`x`tabab`haj`n`y`n`xag`f`saj`h`h`aab`saj`saj`z`o`z`z`xad`x`o`z`oad`x`r`o`q`madagag```e`w`e`y`g`g`y`gah`iacacae`eac`i`a`hae`w`w```h`iahahah`aababab`q", +"agagae`m`xafaf`vafa``x`saf`q`d```y`m`y`mafah`bah`h`b`daf`dagag`i`s`a`t`n`nacajac`xa`a`ad`x`y`x`n`tab`a`h`v`n`eaj`s`h`t`nadadac`sagag`sai`s`hab`s`vaj`saj`ead`xad`x`r`n`oaiai`r`zai`oadadadagag`b```g`y`y`w`e`g```a`iaa`dac`e`e`iab`aah````ah`a`tae`iah`iababab`e", +"agag`w`r`dae```d`r`m`d`iaf`maf`d`y`q`x`xaf`````aabae`eafakag`f`t`v`h`tai`naiaiai`yadad`y`y`o`oai`b`s`a`h`n`oajajaiajaiai`y`y`s`tagagac`n`z`s`a`saj`b`saj`r`m`mad`o`zaiai`b`saiai`z`ma``m`jag`f`i```e`g`uac`e`l`h`hae```l`e`d`e`aab`a`h`b`tah`h`t`s`a`i```hab`i`o", +"`fag`q`d`d````ae`d`dah`baf`x`y`y`m`m`yakak`d``ababae`d`e`yag`qacacaj`t`bac`naiac`n`x`y`o`o`n`naiac`tab`sai`n`taj`n`n`eaj`n`naj`t`fag`nai`z`z`vaj`v`v`v`z`r`x`x`r`n`z`v`h`a`baj`r`m`m`m`j`pag`g`iaeac`daaac`uae`a`t`e```e`wac`l`a`a`a`a`hae``ahaeac`a`i```i`a`t`c", +"`qaga`aaak`dae`b`b`bah```d`l`r`m`m`y`m`xak`dahababae`dak`mag`uac`n`n`tab`tac`tajaj`r`y`nacacac`zac`h`h`t`t`tajai`c`oajajaiaiaiaj`xagakajai`x`x`z`o`xai`z`rai`s`sai`z`s`b`a`v`zad`m`madad`jag`l`sae`t`tah`e```h`h```w```e`u`````aab`aabah`lacahaj`l`a`i`t`h`iae`w", +"`qag`faeak`dah`a`a`b``aa`saeaf`m`yafak`yak`daeabab`saf`oagag`l`b`v`n`tab`taj`sajaj`n`naj`b`t`n`naj`h`taj`h`s`c`x`cac`t`b`baiac`t`cag`jaj`z`radadad`o`s`v`n`v`saj`s`b`iaj`v`r`r`x`x`rai`zagag``aa`````t`h```i`iahae`l`tac`e`````habab`a```d```tae```a`a`a`i`tae`e", +"`yagag`saf``ah`hab`i`d`d`i`i`e`m`r`dakakakaf`d`s```dafakagag`i`a`t`vac`tajaj`sai`naj`b`a`sai`n`n`t`b`n`n`v`nad`x`naj`b`s`baj`t`s`oagag`s`o`r`xad`m`n`v`z`z`n`o`z`s`s`v`v`z`r`zaiac`b`h`bagagahac`l```a`h`s`i`i`i`i`b`iaeah``ac`aababahac``acacah`iahah`hah``aeac", +"`uagag```d```s`aab`bakafae``ak`x`wafafafafafafakak`x`u`rag`f`a`h`bajaiaiaj`b`v`naiaj`bajaiai`n`n`b`tai`n`n`x`yad`oacaj`t`t`bajajacagag```xadad`xadai`zaiai`x`x`r`r`r`o`o`x`r`v`vaiaj`a`sag`f`haj`uaaab`iac`i`h`a`a`i`t`h`a`lahababahacae```w`l`i`h`````tah``````", +"`eagag`g`d`dae`i`i```u`d```dak`daf`oaf`dafak`y`m`y`mafakaga``h`b`t`n`nai`t`baiaiacaiai`n`eacai`nacaj`h`v`o`r`n`y`x`naiac`t`sacajajagag`lad`mad`r`rai`s`b`v`r`o`x`o`oad`x`x`z`saj`z`raiadag`y`a```waeabahac`a`h`a`i``ah`a`a`w`bab`h`eac`t`l`e`l``ac`````l``ae``ac", +"ae`lag`q`daa`v`d`daf`d`````r`dae`dakakafaf`y`y`o`x`m`d`dag`uabaj`n`c`e`vajajai`nac`b`v`naiacai`n`naj`t`t`n`n`r`o`o`n`n`naiacacajaj`mag`u`oa`ad`r`o`z`h`hai`o`o`o`r`x`m`o`v`h`a`v`z`o`r`mag`lahae``ahab`i`t`aab`iajah`i`t```e`hab`t`eacaa`e`d`l`l`w`````u`u``ae``", +"`i`eag`j```d`d`uak`w`d```d`d`bah`daf`raf`x`mafaf`y`y`d`uag`l`h`nad`nac`taiai`nai`b`aab`sai`vaj`n`n`o`najai`n`cad`y`nai`n`n`nai`s`tadag`q`d`x`o`o`o`zai`s`rad`x`xad`m`o`h`h`a`vaiai`n`r`fagae```s`t`iab`t`i`a`a``ae`a`t`e`eaaah`bahae`l`wacacah`i`w``aa`c`y`waaah", +"ah`yagag`i`d`r`y`r`v`d`raf`h`a`s`v`dafak`maf`daf`y`oakagag`taiad`xai`t`tac`n`naj`b`bab`h`t`tai`rai`n`n`tac`n`xad`x`nac`nadadai`tac`qag`f`b`v`n`oai`vaiaj`x`mad`mad`o`h`a`s`v`eaiaiai`ragag`h`hahah`a`a```t`a`aaeah`iac`h`h`s`l```hah`e`u`laa`hah`u`e`eak`y`o```a", +"`d`yagagah`dak`y`eah`d`m`d`h`haeaeaeaf`y`dah``af`o`o`yag`f`b`n`y`o`nac`t`e`oai`t`saj`s`a`haj`n`n`najacacai`c`y`c`r`cacaia`adaiai`r`nagag`i`bai`r`v`haj`v`oad`mad`r`s`h`s`b`v`z`rai`vaiag`fab`aah`h`aah`e`l`h`a`h`t`e`tabab`t`eae`iae`l`w`dah`hae`g`uak`g`g`w```h", +"`w`gagag`laf`xak`d`baf`q`dae`s`i`a`iafaf`b`h``af`uak`yaga``s`x`o`n`najai`n`nac`t`tacaj`b`t`naiai`n`n`eai`nad`g`x`n`oac`n`qad`u`xad`nagagacaiaj`zai`v`z`r`o`x`m`xai`s`s`h`h`n`x`o`s`hadag`qab`h`i`aah``ai`u`iabab`l`s`h`a`aae`tahac`w`l`l`t`a`i`e`u`gad`o`l`lac`s", +"`eac`qag`q`y`q`y`r`dak`yak`raf`d`d```g`d```dak`o`yad`qag`gacad`c`v`e`n`n`n`taj`tajaj`b`bai`najac`v`n`c`o`x`y`x`x`o`n`n`oadadada`a``c`pag`g`oai`z`r`oa``m`m`m`y`o`o`r`nai`xa``m`o`z`z`fag`eab`h`a`iaaac`d`w`hab`a`sah`h`h`i`i`a`b`u`n`dacahabah`e`e```e`eaeac````", +"`i`a`jagagagagagagagagagagagagagagagagagagagagagagagagagagad`x`nai`x`oai`v`h`tajaj`t`a`b`n`nacacajac`n`yadadad`c`y`x`y`c`x`y`y`j`m`yagagagagagagagagagagagagagagagagagagagagagagagagagag`f`h`a`haeacaa`w`l`aabah```t`t`i`aababae`w`w`eac`i`hae`eac`t`lac``acae`t", +"ab``agaga``g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gagag`f`cai`u`xaiaj`v`t`s`tac`s`bajai`n`n`s`tajai`o`qa``y`xadadad`c`n`nad`m`y`jagag`m`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`g`gagag`uab`h`t```d`gac`h`i`l`lac`t`iabab`a```u`w`w`lae`sae````aeac`l``aeah`a", +"`iagag`j`a`x`rai`r`o`r`o`o`o`oaiajaj`zaiaj`ra`ad`rai`n`jagag`j`n`n`n`n`nai`vajaiaj`tajaj`baj`v`a`saiai`n`oad`yad`y`yad`caj`radad`magag`gab`n`l`sah`i`i`h`i`h`b`tae`n`u`n`wad`q`g`o`u`u`jagagac`aah```w`c`e```lai`w`eae`iabab`aac`eaa`l``ae`````saeaeac`e``ah`aab", +"`kagag`aac`z`r`x`o`x`o`z`r`o`z`vai`z`v`b`v`ma`ad`r`z`v`r`fagag`y`n`c`y`n`o`n`nac`t`t`s`b`h`h`t`hai`nacai`nadadad`n`oad`raj`xadadagag`f`a`n`gai`bah`s`tah`t`iah`sac`w`u`r`q`q`w`n`w`o`g`g`fag`f`iahac`eak`o`wac```e`n`t`a`aab`aac`l`i`t`sahaeaeaeaeae`l`d`tah`a`i", +"agagac`t`o`o`x`x`o`x`r`vai`z`z`s`baj`vai`ead`o`rai`s`a`v`xagag`j`r`xad`o`y`xac`a`h`h`a`b`h`b`s`t`naiac`v`n`ca`adai`n`y`n`n`x`c`jagagae`t`g`w`taeacacajaeae`bae`l`n`g`ya`a``r`e`w`g`q`y`r`yagag`yaeac`d`n`w`w`lae```w`e`iah`h`a`s```a`i`iah````ac``ac`t`tac```aa`", +"ag`y`a`xa``m`z`e`z`rai`s`s`r`r`v`baj`r`o`vaiai`r`v`aab`b`s`xagag`j`n`q`m`y`cajababab`h`h`haj`baj`n`z`t`t`n`cad`oajai`xad`c`nadagag`g`a`n`eae`s`e`r`l````ahaj`w`u`y`q`y`j`m`o`n`g`q`q`raiae`yagag`u`tae```l`eai`tae`u`y`laeah`h`a`h`hac`h`h`hah```e```hae`e```qag", +"`f`a`z`x`mad`r`v`n`r`s`s`z`o`r`z`z`o`x`n`vai`r`r`z`b`bai`v`z`fagagada`a``x`y`v`h`t`a`h`bajaj`h`n`oac`aaj`n`yad`c`taj`c`x`naiagag`jab`tae`tah`l`y`g`eac`s`s`w`yad`y`g`oa`a``g`u`g`y`naa`s`i`eagagagae`iaeacaaae```e`uak`waeah`a`aabah``ahah`i`a`i`rae`b`l`l`wagag", +"ah`v`radadadad`x`x`zaj`r`x`x`r`xad`xai`vai`z`o`x`o`r`r`x`o`vaiagag`fad`y`y`o`b`t`v`t`h`tai`t`sai`cac`t`n`xad`yaiajajai`nac`qagag`t`a`i`i`hae`x`j`g`eac`i`l`y`q`q`g`u`y`j`y`e`e`r`w```t`b`l`q`fagag`o`aae```i`i`e`u`g`g`gacah`i`iabaeaeae`lahab`a`eaeaeac`t`fagag", +"`h`r`x`ma`adad`m`m`z`r`m`m`xadad`x`oaj`saiai`r`xad`xadad`z`saj`oagag`j`n`n`e`b`baj`t`b`taiai`tai`o`rai`n`yad`cajajajac`n`xagag`wab`t`i`a`i`lad`j`gai`tac`ya`a``q`x`q`j`y`eac`e`wac`b`bac`ya``q`fagagacahah`a`bae`l`g`g`y`e``ah`iab`s`e`w`e``ab`a`l``aeah`yagagac", +"`v`r`xad`x`oadad`x`r`x`m`j`m`m`x`x`raj`saj`radad`xad`x`r`s`s`zaia`agag`naiaiaj`b`vai`t`s`naiai`o`n`naiai`o`y`cajac`n`n`oagag`fab`t`s`h`h`s`ua`a``r`s```y`ja`a``q`q`y`y`o`n`d`u`w`s`bae`n`y`q`q`jagagagahah`aaeae`dak`g`g`u`l`t`h`aah`l`eac`lah`a`sacae``agag`jab", +"aj`v`r`r`r`o`x`o`o`o`o`m`m`q`mad`m`n`v`v`z`y`m`m`mad`x`r`vai`zaiaiagag`f`naj`a`aai`n`tajajaj`n`oaiajac`n`xad`zaj`n`y`c`fagagah`hacae`i`s`wada``y`````ya`a`a``y`r`w`g`m`q`u`g`g`e`i`tac`n`g`qa``jagagag`y```a`lac`e`g`r`w`y`uac`h`h`i```taj`wac`tah`l`t`jagag`h`v", +"`v`hai`n`r`o`o`xad`o`rad`x`x`ma``q`zai`oad`mada`a``m`m`x`r`z`zai`s`dagag`j`n`taj`o`c`n`c`n`nad`q`c`n`yada``q`o`ra`a``fagag`wab`e`wac```l`e`w`wacaj`ga`a``q`r``ac`u`q`m`q`g`x`u`s`taj`l`u`m`qa``ja``jagag`q`l`y`y`y`q`g`g`ya``gac```l`e`e`w`y`y`u`wak`jagagaiah`r", +"aiaj`z`xadadadadad`x`o`o`o`x`x`o`o`radadad`x`ma``m`mad`o`z`n`rai`haj`jagagagagagagagagagagagagagagagagagagagagagagagagag`jab`e`g`d`s`saeah`b`t`t`ua``q`y`e`t`bai`qa`a``q`g`cac`tac`l`r`qa``q`m`q`xac`jagagagagagagagagagagagagagagagagagagagagagagagagag`f`a`z`r", +"`zai`o`xad`m`madad`o`r`o`x`x`oaiai`x`qad`o`xadad`x`o`x`raiaiaj`h`h`vagag`j`w`n`u`w`r`w`u`w`w`w`w`n`w`w`w`w`n`w`n`w`na`agagah`lac`t`h`t`n`nah`h`n`q`x`g`eah`haeaka``q`m`m`y`w`taeai`w`y`qa`a``q`r`l`iagaga``w`w`w`w`w`w`u`n`u`n`u`u`u`w`u`w`u`w`w`w`w`jag`f`s`r`o", +"`s`vaiai`o`mad`x`o`o`o`o`o`o`o`n`oad`m`x`x`x`x`o`zai`n`x`oaj`b`a`a`hagagac`l````ah```l```u`y`u`u```w`y`u``aeaaaaah`i`uagag`h`h`t`l`u`m`j`r`baea``y`u`uac`bae`u`j`x`g`ya``y`l`iaj`l`e`ua``j`m`l```s`iagagaj`w`l`e`e`n`eac`t`h`aabababab`a`h`a`aaj`wai`uagag`s`o`e", +"`haj`v`e`o`x`m`r`z`r`oaiaj`z`r`xada``m`xadad`x`x`x`r`o`x`r`v`v`s`a`hagagah`w`g`m`wae``aeaaakak`y`w`u`y`u`l```l`u`waa`eagag`t`e`oad`j`j`x`s`i`r`q`x`y`q`w`l`u`j`g`e`wada``gai`i`s``aa`r`ja``eacaiahacagagae`lajaj```l`w`e`daj`t`t`b`hab`i`sac`w`u`b`h`tagag`saiab", +"`s`v`r`x`xad`o`vai`zaj`s`bai`z`o`m`mad`xadad`xad`x`z`zaj`b`v`r`b`a`rag`fah`lak`q`makaeah```lak`q`uak`y`uaa``aaak`q`yakagag`w`w`y`q`m`gac`taca``ja``j`j`y`ga``o`e`r`uada``gac`t`i`tac`ga``y`n`e`l`iadag`jaeac`s`t`l`o`y`g`u`w`e`e`l``aeai`w`y`gac`a`h``agagac`s`a", +"ai`n`x`o`o`rajajaiajaj`v`vaj`zadad`xad`o`o`x`o`x`xaiaiaj`h`sai`h`h`oag`yaeaa`u`m`gak`q`w`e``aaakak`y`m`y`wahah`e`m`wak`jag`u`e`y`g`r`w`n`w`ga``j`g`e`gad`q`g`e`u`u`w`g`j`x`e```i```r`y`m`q`x`u`saj`jag`waj`lac```e`u`yad`y`y`c`r`n`w`o`y`uai`s`a`a`iai`jagai`saj", +"`r`o`r`r`oai`vaiai`z`r`v`v`v`o`m`mad`m`x`m`x`z`r`x`s`sai`s`v`h`b`v`magakae```wak`qak`wak`y`waa`w`mak`uak`y`l`iae`u`lae`maga`ai`y`w`g`q`q`r`e`w`n``ae`r`q`g`l`e`u`eac`ga``y`u`sac`g`q`x`ya``yac`i`eagag`l`l`e`l`e`r`g`y`y`y`y`g`y`y`l`l`d`s`i`aab`aaj`e`jag`xaj`z", +"`o`o`x`o`r`z`n`o`o`y`oajaj`r`ma``mad`ma``m`oaj`s`s`a`hai`v`sabaj`ragag`l``aeaa`l`w`q`w``aaakakak`q`q`w`lakafaeaeaa`uah`uagagaeak`oa``j`o`s`i`t`t`bah`e`uacac`o`uac`e`m`q`gacae`y`j`o`w`q`m`gae`t`wagagae``ac`e`uak`g`g`x`x`g`x`q`caiacajah`aabab`t`l```qagag`s`o", +"`x`o`r`r`r`x`x`x`xad`o`o`oad`ma``x`oadad`x`z`s`a`a`a`haj`s`hab`vaiagag`i`l``ahaeae`u`y`l```l`wak`y`m`e```e`e``ah```u`laeagagae`u`qa``gah`tah`i`t``ahaeacaiaka``y`u`q`y`o`e`i`u`j`gac`ua``m`g`s`s`uagag`a`bac`r`u`c`g`g`g`g`g`ma``qak`u`l`iabab`haeahababagag`s`o", +"`n`n`r`x`x`o`xadadadad`qad`o`r`r`n`z`z`r`raiaj`s`s`h`s`h`h`b`sai`oag`f`baaaaae`iah``ak`w`w`u`l``aa`uak```laaaeaeae`w`q`eagag`l`u`o`w`bac`wac``aiac`b`s`e`xa`a`a``m`q`u`e`bac`q`q`e`e`j`j`q`g`tae`jag`j`h`tac`n`w`n`w`r`u`gad`q`q`q`ma``r`iabab`a`h`aababagagae`o", +"ai`radad`r`r`m`m`m`xad`m`q`oaiaj`vaiai`vajaiai`s`b`saj`h`a`sai`z`xag`q```e``ahae``ae`eakaf`q`y``ah`l`y`l`laaae``aeaa`q`m`fag`wac```i```y`q`n`l`daeah`l`qa`ad`y`qa``y`e`t`i`l`mad`u`qa`a`a``oahaj`jag`g`tacai`w`n`e`e`n`w`gad`q`q`qa`a``w`tabab`a`h`h`aab`jagac`n", +"`n`o`x`x`r`oad`mad`x`x`m`j`oai`vai`o`rai`v`z`n`bab`s`b`a`h`b`n`oadag`u```uaa`iae`lae```q`w`m`m`wah```yak`w``aeaeaeaeak`j`jag`u`i`h```y`j`y`l`s`t`iaj`q`q`g`e`e`w`o`lah`h`t`y`j`j`j`ja`a`a``e`iaj`jag`lac`l`w`n`w`eai`l`n`nak`g`qa`a``g`e`tababab`hah`tah`jag`n`z", +"ai`v`r`z`v`oadadadad`x`mad`z`z`o`r`o`o`x`z`r`o`v`h`s`h`s`h`b`radagag`lah`w`waeahaa``ahak`y`y`q`u`````y`yakaa`iaeah`i```y`jag`f`hae`o`q`gac`i`h`h`b`wa``n``ah`bae```i`i`s`wa``j`j`f`j`ja``qae`b`wagag```n`w`r`w`e`lac`l`e`w`r`y`m`jad`wacaj`tabab`haj`e`w`jag`jai", +"`s`baiai`zada``m`mad`x`x`r`vai`y`x`oad`raj`z`o`zaiaiajaj`vai`r`oagagaeaa```waaae``aaae`d`q`yakak`````u`y`w`lahae`i`iahaa`magag`h`l`waiae`b`i`bah```q`w`saeac`i`b`h`taj`l`qa`a``j`j`j`ja``n`iac`jagagae`g`u`u`r`e`e`n`w`u`uak`m`ja`ak`r`l`l```iab`hac`u`e`gag`f`b", +"ab`h`s`r`m`m`m`j`jad`x`y`rai`rad`x`x`oaiaj`r`r`r`r`zaj`v`o`oai`rag`fae`laeaa`e``ae``aeae`y`qakak`l```e`y`uaaaeae``ahahae`lagag`t`laiah`i`i`i`s```w`xae`lad`n`h`aahajac`oa``q`q`qa``ja``x```s`qa`ag`jac`y`y`y`x`x`y`q`y`yada``ja``y`u`e`e`d````ac`e`u`g`w`nagag`i", +"`h`v`z`x`m`m`xad`mad`x`o`r`n`r`r`z`o`o`r`x`o`r`r`nai`s`ead`oai`raga`aeaa``aeaaaa``aeah`h`l`y`m`y`y`l`lak`qafaeaeaa``ah`iaaagag`eac`s`h`i`bae`e`r`qac`wa`adae`i`sai`l`w`y`y`o`w`u`x`yad`u`t`e`q`jag`g`ra``j`ja``qa``ja`a`a``j`q`g`e`dacac`e`n`c`y`y`y`o`u`gagagae", +"aj`r`o`o`o`naiaiai`z`r`r`r`o`nai`o`x`x`madad`x`n`z`z`v`o`x`oai`oag`u`waa``ae``aa``ah`i`iae`l`y`q`xak`u`y`yakaaae```e```i```qag`w`t`i`i`tae`u`q`q`e`lad`m`eahaj`w`w`n`eaiacacacai`e`u`g`lah`u`q`jag`l`q`ja``ja`a``ja``j`ja``x`u`eacacaiac`w`g`yad`m`q`qad`y`fag``", +"`v`oaiai`v`b`a`h`s`vai`r`z`z`v`r`m`mad`q`m`m`x`z`z`n`r`r`o`oai`mag`l`y`u```iae`````i`iaeaeaa`e`qak`wak`mak`u`uaaae`l`waeae`yag`y`i`s`tacad`y`g`wah`ga``q`lac`g`q`uac`sahah`i`b```l`w`naj`t`y`y`fag``a`a``qad`y`m`y`q`ja``g`w`l`e`w`w`lai`e`r`g`ya``j`j`ja``fag`w", +"aj`r`v`vai`v`h`i`vaiaj`v`sab`v`x`madadad`m`m`x`x`zai`o`r`o`r`sagag`taa`q`eah`iaeah`i`iaeaa`laa`w`y`u`u`m`u`e`w`o`l``afaa`iakagag`t`e`ra``x`e`eajaj`y`jad`w`y`j`gaj`hahae`sah`h`tacac```taead`eagag```q`yak`y`y`yada`a``y`r`l`e`u`u`w`e`l`l`l`w`ya``j`j`ja``fag`f", +"`t`z`s`sai`o`z`v`vai`v`b`sai`xadad`x`xad`mad`m`oai`r`o`o`zaj`bag`f`taeaa`y```b`i`iah`bae`laf`w`w`u`qak`yak`waa`u`w```l`lahaeagagah`r`qa``u`w`n`taj`q`ja`ad`q`xae`iac`e`e`e`lahah`s`taeah`e`wacag`jac`o`n`w`r`u`y`qa``g`r`e`l`n`u`n`lai`lacai`w`y`q`ma``qad`yagag", +"ac`a`aaj`z`r`rai`bajaiaj`r`ma``madad`o`x`x`r`x`e`z`xadai`s`s`oaga``e`uae`u`w```iahaeaeae`e`q`m`y`m`q`m`w`w`waa`l`w``ae``aeaeagagac`g`j`q`u`nac`i`la``j`ja``xac`i```r`g`y`y`n`i`h`hae`eah`r`y`jag`g``ai`l`dacajaa`y`g`w`e`l`e`wac`t`tae`e`n`u`y`y`yak`g`o`r`wagag", +"`u`a`vaiai`z`o`z`b`s`z`r`m`j`m`m`m`x`z`o`nai`n`v`zad`o`saj`z`xag`g`y`q`w```m`l````aaaeae`l`m`q`qak`u`g``aa`w`w`laa``ae`iahae`jag`g`q`q`raiae`bac`qa``ma``q`l`i`s`w`qa`a``m`e`h`a`b`w`xah`ea``jag`l`h`h`i`i`h`h`s`raiacacai`eacah`iahac`n`ya``mad`g`u`w`laiac`fag", +"ag`p`o`zaiai`n`zai`v`z`r`x`x`xadad`o`xad`x`oaiai`x`o`zai`r`jagagag`f`j`yaa`wakaa`lak`l``aa`y`q`y`lae`e`laeaaaf`u`laeaeae`l`jagagag`p`w`tahah```xa``qa``q`e`bae`e`q`m`gad`yac`h`i`w`j`qah`r`fagagag`u`h`a`bae`l`c``ah```l`lajah`b`i`t```w`ya`a``q`x`nac`t`e`jagag", +"agagag`k`oajai`r`r`z`r`x`m`m`m`x`o`x`m`mad`rai`x`xai`r`fagagagagagagag`f`u```y`u`l`x`y`l`l`y`qakaa`h``akahah`lak`w```l`jagagagagagagaga``lac`ua``q`m`q`eahaeai`g`j`w`ra``w`t`h`e`j`jad`jagagagagagagag`j`w`e`g`e`b`sai`r`e```b`h`i`iae`e`w`o`y`q`g`d`l`fagagagag", +"ae`yagagag`j`x`x`o`x`y`x`x`xad`o`o`x`x`o`najai`m`m`fagag`f`l`a`t`e`fagagag`j`q`qak`wak`g`uak`q`waeahae`l`e`hae`wak`jagagag`q`habaea`agagag`f`x`g`y`y`e`b`t```ea``g`na`ad`e`baea``j`fagagag`y`h`i`wagagagag`j`x`tae`l`e`u`l`s`i`h`i`sac`e```l`u`gad`jagagag`g`a`a", +"`uacae`qagagag`fad`x`x`r`z`oad`yad`oai`s`a`b`r`jagag`f`l`aac`q`q`w`t`e`fagagagag`jak`w`yak`u`y`eah````aeak`````jagagag`q`habababababaea`agagag`j`gaiae`iahac`gad`n`u`j`y`e`i`u`fagagag`y`h`h`daf`lae`wagagagag`qaiac`n`eac```sah```r`g`r`e`n`y`pagagag`g`h`iaeae", +"`y`naj`tae`qagagag`p`y`z`r`m`m`x`zaiajab`b`jagag`f`l`aaj`o`g`x`y`y`y`n`t`e`fagagag`f`y`y`y`e`wafahaa`````e`jagagag`q`hab`sah`a`aabab`aahaea`agagag`jac`i`s`w`q`n`l`q`fak`e`jagagag`y`h`hahae`wakak`m`w`t`wagagagag`j`wai`e`e`eai`u`u`w`n`q`fagagag`g`h`a`````taj", +"`uac`l`y`x``ae`qagagag`fa`ad`r`eaiaj`s`yagag`f`lab`t`n`g`g`y`g`g`g`gada``wah`l`fagagag`fa``w`l`w``aa`w`jagagag`y`h`aah`h`tah`a`h`h`a`a`````taea`agagaga``o`q`e`e`y`ja``jagagag`g`h`b`d```b`v`r`xakak`m`m`wae`n`fagagag`jak`u`c`g`r`l`uagagagag`g`aab`bae`taeah`w", +"`y`xa`a`ad`g`uah`t`qagagag`f`x`zaiadagagagacab`a`t`e`r`w`n`u`o`g`gad`q`q`q`q`w`i`l`fagagag`j`u`wak`jagagag`y`h`aae`dahab`a`h`a`hahah`a`tac`w`eahaea`agagag`j`g`y`j`fagagag`g`hae`oak`raa`vaf`yak`d`d`x`ma``g`l`t`w`fagagag`j`q`q`j`fagagag`o`hae`e`i`h`hae`eah`o", +"a`a``m`y`w`eac`i`s`t`t`qagagagagagagag`lab`a`b`t```l`n`e`e`w`w`u`y`qa``q`qa``q`l`aab`l`fagagagagagagag`y`hab`iac`wac`a`a`a`a`a`hah`h`a`t`e`u`wah`h`iaea`agagagagagagag`x`h`t`m`m`o`x`y`yak`m`y`d`a```x`q`makakakaaah`w`fagagagagagagag`g`hae`qa``l`i`a`t`r`g`b`w", +"`q`y`g`u`l`s`iahae`t`b`i`t`qagag`f`labab`iaeacac`l`n`w`n`e`l`e`w`o`y`y`ma`a``x`l`iabab`a`l`fagagag`y`h`a`h`aah`w`g`l`b`t```h`a`t`iab`a`l`u`y`e`i`hah`a`haea`agagag`x`hahak`m`m`rak`yak`m`qa`ak`hab`d`q`m`y`y`r`d`v`d`s`i`e`fagagag`g`haead`gad`yaj`a`b`n`j`yah`n", +"`y`e`n`l`t`i`iah`t`i`iahah`iagag`uababab`baeai`e`w`u`r`eaiai`l`w`w`u`xa``j`y`n```t`aabab`i`i`yagag`i```t`a`aae`y`uac`l`e`n`e`d`l`aab`a`w`y`uacah`h`h`a`iae`hagag`q`iaf`q`m`m`yak`qak`rak`x`yaf`a`haf`m`q`yak`d`````dae`b`h`aa`agag`a`g`j`w`ua``wah`i`e`j`j`r`sak", +"`eac`l`t`iah`t`t`i`iah`i`t`tagagah`aababae`e`r`u`u`r`n`l`l`l`n`w`r`g`q`j`q`g`eacaiaeababah`l`gagagae`dah```l`w`y`w`e`w`l`l`w`e`labab`iakad`wacah`a`a`i`i`a`hagagae`r`ya``m`y`y`makafaf`lafakaf`v`d`r`y`mak`d`v`d```d```i`a`a`eagag`t`j`o`wa``y`l`baj`j`ja``s`e`g", +"ac```s`i`t`t`tah`t``ajah`taeagag`aabab`t`e`oak`g`g`g`u`u`o`g`g`g`y`m`ja``y`u`n`eac`s`i`bac`r`oagagac`l```u`g`y`y`r`waeac`lacacac`aab`i`lak`uac`h`h`i`tah`aaeagagae`q`m`xafak`makaf`d`v`daf`yakaf`eafakakakaf`w`d``ae`v`b`h`i`dagagae`y`e`g`jadai`i`r`ja`ai`s`y`w", +"ac`t`i`t`t`s`t`s`e`waj`i`h`eag`j`a`aae`n`g`yad`q`ma``q`q`ma``q`qa``ja``y`r`lacai`eai`w`g`g`g`uagag`u`e`w`y`g`u`y`g`i`hacac```e`l`i`a`a`t`e`e```hah`tah`t`a`wag`j`v`y`y`e`dak`o`d`d``ae`dak`y`x`eaf`r`rafakakakaf`b`a`d```s``afagagac`e`e`q`j`g`s```q`m`u`b`e`q`w", +"ae`i`tah`t`t`s`n`q`e`t`i`i`eag`x`iac`r`g`gada``j`j`ja`a``j`j`j`ja``q`o`e``acac`l`n`x`y`q`qad`g`jag`g`l`y`y`e`e`g```a`i```dac`e`e`bab`a`iae``ah`hahae`hahah`uag`w``afaf`vaf`maf`d`d`d`dak`o`y`yafakak`w`rak`y`y`rae`aaf`e```d`r`jag`lai`y`j`xae`i`e`q`yaeae`oad`e", +"ah`s`t`i`i`iaia``oacae`t`i`mag`w`s`w`u`g`x`qa``j`m`q`q`q`qa``ja``g`w`e`l`l`eaiai`w`g`y`q`m`qa``faga``t`u`wac`e`d`h`h`````l`e`d`e`aab`a`a`i`t`t`i`tae`a`haj`jag`lae`````d`y`y`r`dafak`r`xakak`xafak`oak`x`yakafak`d`h`dafaa`d`d`jag`y`n`q`r`t`h`t`e`u`e`bai`q`gae", +"`saj`i`a`aae`g`y`waiae`bacagag```l`u`g`g`g`q`q`yak`y`y`yada`a``g`w`e`e`r`u`w`l`l`e`e`u`q`j`j`j`fagagahaa``ac`uah`a`t`wac`e`u`l`l`h`a`a`a`h``aaahae`l`a`h``agag``ae```v`d`yak`raf`r`o`wak`oak`maf`dak`y`m`y`raf`e``ab`s`d`d`d`d`jag`faj`lah`h`i`i`b```tae`g`qai`i", +"aeah`h`hah`l`x`g`uac`bae`wagagah`e`w`w`u`x`y`x`u`u`c`xad`qa``x`u`eai`nak`r`e`eaiac`e`u`qa``ja`a`agag`i`s`i`l```h`iae`w```l`uac```habab`aahai`dahae`l`h`hahagagah`d`d`d`oakafaf`d`d`d`dafak`y`maf`l`o`m`m`oaf`dae`iab`h``af`w`dafagag`i`t`t`tac`l`h`b`i`l`m`eah`t", +"`b`i`b`t```u`x`u`e`tahaj`xag`jah``aeaj`l`w`w`w`e`e`e`e`u`q`y`w`e`l`e`waiajaeac`e`l`w`g`yad`q`y`xagag`eah`hae`b`iahaeacae```e``ac`iabab`a```laa`tae```h`a`wag`j``akaf`d`y`o`v```d`daf`d`d`r`m`o`eaf`y`yafaf`o`d`b`i`b`i``af`e`dafagagae`tac`w`x`w`i`i`t`x`w```tah", +"`i`bah`tac`e`e`e`s`b`iae`yag`qah`b`i`i`sajaeajae`t`i`i```x`e`lai`e`nacah`b`tac`w`yad`q`y`g`o`u`e`jag`uab`aae`i`i`h`h`i`iah`iaeac`aabab`tac``ai`lah`h`t`t`uag`u`d`o`daf`yaf`iae`vak`raf`eak`qafaf`y`y`d`dak`u`d`d`d`b`b`d`daf`d`d`jagacac`w`q`q`e`b`i`e`yaiacac`t", +"`t`t`i`b`b`t``acaeah`i```mag`u`t`i`i`i`hababab`a`hah```w``aeac`l`l```t`b`i`t`l`o`qa`a`ad`g`nac```oag`gab`h`l`i`h`a`aah`s`hab`laeababah`lae```w`eah`i``aa`yag`l`d`e`d`d`u```aae`rak`u`rak`m`y`daf`xak`s``ak`o`y`xafab`i`uakaf`d`d`mag`lac`y`qa``n`t```y`e```eacah", +"`eai`s`h`a`tac`lac`t`i``agagac`i`i`i`habab`h`t`````l`u`e`i`s`l`n`l`s`i`i`i`tac`u`xad`q`q`uacahah`oagagab`hac`a`a`a`iaeah`a`a`wahab`h`wac`s`l`e`laa`l````agagaeaa`d``ae`d`b`b`d`yakafak`m`mak`e`d`d`dafafak`y`o`xafab`b`y`q`oaf`v`qag`j`ea``g`q`y`w`y`najacacahac", +"`o`eae`i`bac`w`u`l`tahacagag`i`a`a`h`t`sac`e`n`w`w`c`x`saeai`w`uac`t`i`h`i`tac`lac`w`x`y`waeah`t`lagagab`iah`aabah``ah`haeac`e`iabah`l`lac`l`laiac`w````agagah`v```b`s`d`baeaf`yafaf`oaf`r`y`x``abae`x`y`y`makak`w`h`d`ma``y```d`magagac`wac`o`q`m`w``ajae`tac`g", +"`uacah`s`l`u`x`g`l`t`iaaag`f`h`b`s`w`y`qad`q`y`yad`uah`b```e`w`e```t`i`i`s`w`u`eac`e`u`r`nai``ac`eagag`tahah`a`a``ae`a`t`e`l```saeah`t`l`nacacah`i`wac`wag`jah```aab``af``ae`d`r`oakah`h`l`y`x```h`v`y`m`m`yak`oaf`daka``jakahafa`agagae`bahac`l`lacajah`iac`u`o", +"`l`t```c`x`y`q`q`uac`iaiaga`ae`u`l`n`g`q`q`q`q`oaeabab`b```l`eai`lai``ac`u`g`r`w`g`r`e`lai`e`r`u`uagag`w``ae`a`a`t`tahac`h`a`t`eac`h`b`e`u`eac`h`b`w`e`qag`uae`iab`i```d`d```dafak`d`iabaeakakaf`eak`y`m`y`o`oakak`y`m`yak`d``ak`jagag```i`i`i`bae```t`i```w`n`w", +"`tacad`ja`a`a``ja`ad`w`uag`u`o`w`````r`y`x`g`l`aab`hajai`e`n`e`l`n`r`w`r`w`l`l`g`y`uai``ac`e`u`r`wa`ag`u```e`i`a`aae`e`tababah`laeah```l`w`lah`h```g`g`jagac`h`aae``ae`d`dae```l`d`````iae`eafak`m`y`m`y`r`d`uakafaf`o`d```d`dak`m`jag`lacaiah`i`sah`b```e`e`l``", +"`lad`qa`a``j`g`e`ga``g`jag`l`u`eacai`n`w`l`tabab`t`e`e`e`w`n`e`w`u`g`y`y`g`w`uad`x`wacacac`l`lai`wa`aga`ae`uahabab```s`h`a`haeah`b`l`w`l`lae`a`i`e`w`u`fagah`a`a`d`d`d`e```b`vaf`d`d`d````af`r`y`m`x`y`xaf```dafaa`dak`vae```v`w`d`mag`gaa`l`t`h`i`iaj`l`eaj`t`s", +"`q`u`e`xa``r`tah`u`q`eagagae`n`l`e`r`laj`b`a`aaj`n`r`w`w`n`e`e`r`g`x`q`j`q`ma``q`g`w`e`e`w`n`e`w`g`jagagah`w`iab`a`tah`i`h`i`h`a`i`w`u`eacahabah`n`e``agag`aab`s`d`d`uak`saeaf`y`raf`d`daaafak`y`makakak`dae`s`````d`oaf`daeah`s`s`yag`faeai`b`hahacac`sahahai`g", +"aiac`e`u`r`t`a`b`q`g``ag`f`t`w`n`eai``aj`s`sac`r`g`g`u`u`w`l`e`w`o`q`m`j`ja`a``q`g`u`o`g`g`o`g`q`ma`agag```e`aabaeac```t`iabababah`w`w`e`lah`h```lac`taga``b`h`s`daf`oak``af`y`y`y`d`dafaf`r`y`m`y`oak`d`v``ae`vaf`o`yak`d`b`a`a`b``agag`s`l``ai`e```t`tae`u`q`w", +"`s```e`eae`a`a`e`xac`raga`ai`g`g`l`t`t`tae`l`uak`x`g`g`w`e`n`r`u`g`ya``q`y`x`y`y`x`g`g`y`q`q`yak`u`oagag`l`l`iah`l`e`l`t`iababab```w`w`w`laeaeaeaeae`yag`u`dahae`d`w`oak`u`xak`x`x`v`safakaf`o`y`u`rak`dae```daf`y`m`yafae`b`aabah`dagag```u`w`u```t`e`uad`w`s`t", +"ada`a``qad`g`y`f`j`q`jag`yac`u`gai`sah`tac`u`y`g`u`w`e`n`w`u`u`u`u`y`x`eacac`w`y`q`q`mad`y`g`nacajaa`jag`ja``qa`a``j`jad`yak`w`g`q`ja`a`a``qa``q`q`q`jag`yaf`v```vaaaf`y`y`oafakak`w``aa`e`daa`raf`daf`d`d`daf`x`m`mak`d``ahabab`sak`fag`q`j`j`j`g`j`f`ja``y`y`y", +"agagagagagagagagagagagagag`q`w`e`lacaeaj`e`u`u`n`e`n`w`u`u`o`o`g`y`y`u`w`lai`w`q`ja``y`w`eac`s`i`i`eagagagagagagagagagagagagagagagagagagagagagagagagagagag`m`u`d`````d`o`yak`d`dak`maf``ae`i`h`````vaf`v`eafakak`yakaf`d`v`s`a`a`v`qagagagagagagagagagagagagagag", +"`t`t`t`t`t`t`t`t`t`t`t`fag`f`l``acaiacacacac`e`w`w`w`w`u`oakada``g`c`u`e`l`e`xa`a``q`raiae`i`h`i`t`jag`j`t`t`t`tah`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`t`tagag`jakak`d`d`daf`o`oaf`r`x`m`oaeababab`a`i`d`d`daf`raf`o`y`daf`e`d`````daf`faga``t`t`t`tae`t`t`t`t`t`t`t", +"ahaeae``ae``aaaf`y`e`u`qagaga``s``ac`laiai`e`r`g`g`u`u`g`m`j`q`o`u`xak`r`o`q`m`m`y`y`u`l`t`a`a`i`gagag`i`w`g`g`qa``u`e`y`y`q`qa`a``g`ya``q`q`y`ya`a``y`jagag`mak`r`d`d`d`daf`y`m`y`xak``ab`a`s`i`aaf`dak`y`r`dak`o`dafaf`d`daf`r`jagag`a``aaak`e`haeaeaaae`iah`i", +"aeaeaa`w`e```iaeaf`yaka``jagag`u`tajac```l`w`u`y`g`gad`ja``q`o`u`ya`a`a``j`ja``y`g`g`u`e`tab`aacagag`eae`q`ya`a``g`w`u`g`y`y`qa``q`q`g`y`g`y`g`ya``q`q`q`jagag`maf`d`d`vah`d`y`o`rak`xafaeahae`b`b`oak`m`q`u```d`oaf`r`d`d`r`x`qagag``ah`l`````wae`haeae`i`i`iae", +"aeae```w`qakaeaeae`u`q`m`yagag`j`b`bahajai`w`c`g`g`ya``ja``q`q`m`j`j`ja`a``q`q`x`g`o`u`e`s`a`h`jag`j`ha``ya``q`u`e`g`q`y`y`qa`a``q`q`u`g`g`q`q`q`y`g`g`u`gagag`f`d```v`v`vafak`d`dak`x`xaf```i`a`saf`m`m`mak`s``ak`uafaa`d`x`y`fag`q`iakaf`lae`eakaa``aeahaeaeah", +"aeaeaeae`u`qakae`i```e`u`u`qagag`gab`a`tac`n`u`g`x`qa``j`ja``q`qa``q`y`x`x`o`u`r`u`g`g`wai```gagag`h`g`q`y`g`w`e`ga`a``qa`a``q`q`y`u`w`u`u`y`y`u`u`w`w`w`wa`agag`o`iae`d`l`d`x`daf`o`w`x`yaf`bab`h`d`y`y`y`oaeae`eakaf`d`eak`jagag`a`ya``qak`w`u`y`q`yaaaeaeae`i", +"ah````ah``ak`q`e````ae```w`y`jagagae`a`bac`n`u`u`ya``j`ja``x`u`w`r`w`u`g`u`e`lai`u`x`y`gakadagag`l``a``q`u`e`l`ga`a``q`ja``q`y`y`u`u`g`g`y`g`u`w`u`u`g`u`u`m`fagag```h`v`daf`y`u`xakaf`w`x`y`dababaaafafakakaf`dafafaaaf`oa`agagae`haaak`q`y`y`makak`uak```hah`i", +"ae``aeaeae``aa`w`w`l``aeaa`y`qagag`j`haeai`e`uada``q`yadad`w`n`u`y`y`u`eacajae`e`x`y`y`y`q`faga``aa``g`e`````u`qa`a`a``j`q`y`y`g`u`ya``j`q`w```e`u`u`u`u`y`j`jagaga``i`v`daf`yak`rak`d`dak`yaf`i`a```d`d`d`e`rafaf`e`daf`x`fag`y`aaeah```m`m`q`g`lak`e`w`uae`h`i", +"aeae``aaaaaeah```l`l``ah```w`ya`agaga``e`w`g`q`q`y`g`x`q`q`q`g`n`y`q`g`eac`e`oacacak`qa``jagag`h`c`w```t`t`w`qa`a``j`j`q`y`g`u`u`g`qa``q`gaeab```w`u`u`g`q`j`j`jagag`y`dafafafafafak`d``af`m`o`dah``af`dae``af`u`raf`eak`jag`fab``aeahae```y`q`y`l`u`yaa`uakaeah", +"aa``ahaa`w```iaeaaaaaeaeae`e`y`m`jagag`j`q`y`o`u`o`y`qa``fa``g`e`u`q`qa``y`w```h`hai`o`magagac`t`l`````w`y`y`y`qa``j`q`g`u`w`w`u`g`y`g`g`uac`hac`u`y`y`q`qa``qa``fagag`yak`e`d`d`w`xaf```d`q`m`oafafak`daeae`````d`waka`agag`t`i``aeae``aeaa`mak`w`uak`waa`gakaa", +"`y`w``ae`l```iae````ahahahaa`y`qakagagag`q`o`u`u`ya`a``j`j`q`y`g`w`e`r`u`nac`t`h`h`d`nagag`q`a``ae`w`g`y`u`e`e`ya``q`g`w`l`e`u`u`u`u`w`u`g`u`l`w`y`qa``q`q`qa``qa`agag`f`oaf`d`v`d`x`y`````ya`ak`o`yak`e`v`b`hab`baf`magag`u`t`e`iaeae````ae`e`y`w`wak`maaaaak`y", +"`uakak`l``aeah`iae```iae`iae`ua``y`yagag`f`j`j`j`f`f`f`f`f`j`j`j`j`m`j`j`ja``q`q`q`j`fagag`a```e`g`y`u`e`lae`e`g`g`u`e`l`e`g`u`g`g`u`w`g`y`g`w`e`g`y`q`qa``ja`a`a``jagag`k`j`ja`a``j`j`q`m`j`k`j`j`j`j`ja``m`m`y`m`jagag`f`a`j`m``ahae``aaae```y`waa`l`g`l```l`w", +"aa`l`e`wakae`i`h`iahahaeae`iaaak`mak`jagagagagagagagagagagagagagagagagagagagagagagagagag`wah`r`u`u`e`eaiaeah`lacacac`l`w`u`u`u`g`y`g`w`g`y`g`g`u`g`g`y`q`qa``j`ja``y`jagagagagagagagagagagagagagagagagagagagagagagagagag``ah`q`q`w```````laaae`w`qaaah`l`y````aa", +"``aa``ae`l`yae`iahaeahaeae`iae`lakakagag`y`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`wagagae`g`l```l`e```h`i`t`t`t`h```e`e`u`g`q`y`u`y`y`ya`a`a``q`y`g`y`j`ja`a``q`uagag`j`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`i`yagagah```e`u`u`eaa`l`e``aeakakah`i`wak``ae", +"ah````ahae``akaaah`iae````aeae```w`magagac`g`y`wacahaeacac`w`y`q`q`y`w`w`u`g`qa`a``q`qagagaeac`tac`n`lah`h```l`e```a`t`e`w`g`y`q`g`g`g`y`j`j`ja``y`u`u`qa`a``q`q`g`uagag`t`nacabab`h`h`bacaiai`n`n`xa`adad`y`n`o`n`naiagagahaeaeae`l`g`u`l`l`eae``ak`e`iahaf`uae", +"``aeaeaeae`iae`u`e``aeae`e``ae```ea`agag`t`u`u`e```t`a`h`tae`u`q`y`u`w`w`w`e`ya`a`a``yagag`lahahac`l```hahac`e`wac`tae`e`u`y`g`g`w`w`u`q`ja`a``q`wac`e`g`q`y`y`g`u`magag`hacaj`b`h`aab`t`n`nai`vac`yadadad`x`o`c`naj`aagagae`waa`l`````u`waa`e`lae`eak`laeahaf`w", +"ak``aeae``aeae```yak`e````aa`iah`l`jagagah`l`lac````ahabab`iae`u`y`g`l`w`u`l`wa``q`q`qagag`u`hah`taeah`aah```n`w`lah`t`w`w`g`u`u`e`e`u`q`qa`a``u`l`e`w`u`g`g`g`u`wa`ag`f`bacai`vaj`s`h`t`n`nacajai`x`qadad`y`y`xai`b`hagag`l`w`e`uak``aeaaaeaa`uaa```y`y`wae``ak", +"`y`u``aeaaaaah`i`e`y`qakaeahah`aah`qag`q```eac``acac`i`aabab`hac`w`gae`t`w`w`e`ga``q`y`qag`u`t`i`a`h`h`a```l`l`w`wah`hac`u`g`u`g`e`w`g`y`qa``q`g`u`l`e`u`u`g`u`e`wa`ag`nac`c`r`c`naj`b`sajai`naiai`xad`y`y`o`o`nac`t`s`yag`l`e`m`w`u`uaa``aeae`e`l``ak`yak`eae`u", +"`yak`l```l`u`laeaaakak`y`w`l`w``ae`jag`yae`u`u`e`e`eahab`h`t`t`hah`w`lae`l`u`u`g`q`q`u`qag`j`t`l`t`i`i`l`e`e`e`g`u`hab```u`u`u`u`u`y`y`q`ja``y`u```tac`l`l`e``ac`e`fag`e`n`n`n`c`oacac`t`hac`najac`n`c`y`o`n`n`zaiac`h`oaga```ak`y`e`e`wak`yaaaeaa``af`yakak`l`u", +"`y`uaa``aa`u`mak`uakak`y`q`x`q`yakagag`e`t`l`u`u`l`lae`aahac`eac`aae`g`w`u`u`g`q`q`q`u`gagag`t`g`w`l`l`e`l`w`g`y`e`a`a```w`u`u`ya`a`a``ja`a``w`tab`t```tae`aabae`eagag```cacajacaj`n`r`hab`taj`tajaj`o`yaiajajaiaiaj`a`cagagaeak`m`uaa`eak`q`m`lahah```eak`q`uak", +"`mak`eaeae`w`qak`y`q`y`q`y`m`q`w`uagag`t`l`a`l`e`e`t`h`a`a`t`w`u`eac`g`q`y`y`q`q`q`q`g``agag```g`u`e`e`e`e`g`y`u```iae`u`y`u`y`j`ja``ja``q`g```h`t`w`w`u`w`i`t`e`gagagae`x`naj`t`bajaiajabaj`t`sacacaiai`b`baj`n`n`t`hajagagae`j`q`waa`dak`qak`y`u`laa```e`y`oak", +"ak`y`yaa`iaeak`laa`o`q`y`u`q`m`wakagagah`lah`t`t`l```a`hah```w`g`y`g`g`qa`a`a``q`y`y`g`lagag`e`w`u`w`e`w`y`qa``uae```g`q`y`ya``j`j`ja`a``q`l`t`e`y`y`y`y`u`w`g`u`jag`jacad`n`v`a`a`s`tacajac`t`t`n`n`t`h`hajai`n`n`h`t`nagag```w`uaaaeaa`uakak`u`u`m`yaa```u`q`g", +"`r`e`y`uaeaeaa`uah```w`e```w`q`eakag`qah````ac``ac`l`iab`l`w`g`q`q`qa``qa`a``q`y`u`w`u`l`yag`g`e`y`y`g`y`qa``q`e```g`q`g`u`q`j`j`j`j`j`q`yae`e`g`q`g`u`g`u`g`g`u`jag`u`n`y`naj`h`h`bacaiaiaj`bac`nacai`saiaiac`n`z`tajaj`jagacae``aeaeae`l`eak`y`e```wak`wak`q`q", +"`e```e`w``aeae`uaaahae`i`i``ak`l`yag`gah`tacacac``acae`a`l`g`qa`a`a``ja`a`a`a``q`u`l`eac`uag`q`ea``q`y`g`g`g`q`g`g`q`q`y`y`q`q`q`ja``y`y`g`w`g`y`y`u`u`y`y`g`w`u`jag`l`c`oac`h`b`s`v`n`nai`t`taiacaiac`n`nacacai`nai`t`hadag`l`iahaeaaaeae``aa`yakaa```eak`y`q`m", +"`u``aa`laeahah`w`yaaae```e``aaakagag`e``ahac`eae`t```lac`e`q`qa`a`a`a`a`a`a``ja``y`u`e`e`yagag``a``y`e``ahac`u`g`u`g`y`y`y`g`g`q`q`g`w`q`y`y`u`y`q`y`y`q`y`w`u`yagagaj`najabababac`o`nacajajac`n`naj`h`s`vaiaiac`n`nacaja`ag`p`i`iae`l``ah`iah`lak`e`e`w`laa`eak", +"`m`laaaaaeaeaeaa`q`y`lah`q`x```wagag`tahabah`e`l`tahac`l`l`g`q`y`q`q`q`y`g`qa`a``q`g`w`w`uagagae`u`u`lae`h`aaeae`l`e`w`w`w`u`g`q`u`e`u`q`q`g`w`g`y`g`u`w`l`e`g`yagag`i`s`bab`t`s`y`y`naj`tai`n`nac`h`aab`tacajac`nai`o`nacagag`iaeaa`l``aeaeaeae`u`u`u`qakaeae`w", +"ak`u`eaaae``aeaeaka`ak```w`j`l`lag`f`t`tab`aac`g`w`l`l`l`e`u`q`u`w`y`y`w`e`ua`a`a``u`w`w`uagagac`w`g`g`eae`iahac`e`e`w`u`u`g`q`y`e`w`q`q`y`y`u`u`u`y`wahae`g`y`jag`j`t`sab`iaj`n`x`oai`t`tai`r`n`t`b`tab`h`t`s`n`raiaiaiajagagaeae`d`wae`i``aaae`e`m`u`m`y`lahaa", +"ak`yak`d`iaeae`iaa`q`maaae`waf`waga`ac`l`h`aac`g`g`u`u`w`w`g`y`y`l`e`q`u`lac`w`y`q`y`w`e`wagag`w`g`wac`tahaeac`u`w`w`u`u`ya``q`g`u`y`q`y`y`y`u`l`u`u`e`l`g`y`u`jag`u`tabab`haj`c`y`c`nacaj`n`cac`t`tajaj`a`hai`n`n`zajacaiagagacaaae`o`e`iah`laeaeakak`y`q`waeaa", +"`u`y`w`lahae`i`iae`l`yaaaeaa```eag`g```uah`a`l`u`y`g`u`w`e`u`q`q`u`e`g`y`w``aeac`w`y`w`l`la`ag`gae```i`a```l`u`u`u`g`g`ya``q`q`qa``q`g`g`q`g`e`u`y`g`g`y`y`w`w`jagac`babab`taiad`rai`naj`n`naiaj`sajac`t`bac`nacai`e`n`n`n`jag`e`e``aa`w``aeaa``ae`w`q`y`yaf``aa", +"`e`q`waaaeaeae`iahaeaf`eah``ae`jagac`i`w`e`i`l`u`g`u`g`u`e`g`qa``g`u`g`y`wacah`h`t`l`g`lac`qag`j`t`l`taeac`e`g`g`y`q`qa`a`a`a``j`q`u`w`g`y`w`w`y`y`g`g`y`y`g`yagagae`hab`haj`nad`n`v`n`r`nac`saj`taj`t`h`b`n`najacaj`n`c`y`jag`yaaaa```l`lae````ae`d`m`yakak``ae", +"aaak`y`eaeaeaa``ah`i```qaeae`iagag`t`tac`g``ah`g`u`e`w`y`w`w`qa``y`u`u`g`wah`i`t`t```e`u```gagagae`wacae`l`g`y`q`qa`a``qa``ja`a``q`y`q`q`g`u`g`g`y`g`u`y`g`q`yagag`h`a`aaj`n`x`y`e`n`y`nacaj`h`t`taj`t`a`s`n`naiajaj`v`n`x`jag`f``aaaeae`laa``ae`i`i`w`m`y`qakaa", +"`wak`m`oaaaeaa`l```iae`waaaeaeag`f`iaeae`w`u`i`l`g`e```w`y`w`qa``y`g`w`w`labahac`lac`l`y`w`tagagaeacae```u`ya``j`ja``ya`a``j`j`j`q`j`ja``q`g`u`g`y`u`g`w`w`g`uag`q`h`a`b`nad`x`nai`c`oacacac`s`taj`v`b`sacac`nai`b`tacai`nadagag``aaaeaeaaaa```i`i`i```w`q`q`y`u", +"ak`makak`waaae`e`l``ae`w`x```waga``a`h`iac`y`eah`e`l```l`g`u`u`q`y`u`e`lae`aaeac`w`e`l`u`gacagag`l`t`e`g`y`q`ja``q`ya`a`a``ja``qa``j`q`q`q`g`w`u`u`y`wac`u`wa`ag`w`h`a`n`qad`n`r`n`n`n`n`n`naiacai`t`saj`t`h`t`t`aaj`nai`n`cagag```waeahae``ae`i`iae``aaak`m`u`u", +"`u`m`u`waf`uaaaa`uaa`i``akak`yag`y`i`h`a```g`gae``ae`hah`w`w```g`y`w`e`e```h`h`t```e`e`e`g`u`yag`q`g`y`y`g`y`y`y`g`y`q`q`q`q`y`g`u`g`y`q`g`w`eac`w`u`l`w`y`wa`ag`r`b`h`ya``x`n`o`n`n`x`x`n`x`n`n`t`t`s`h`b`b`h`t`b`naiacai`n`jag`l`maa`iaeaeae`i`i````aaaa`u`y`w" +}; Index: external/mit/ctwm/dist/xpm/background7.xpm =================================================================== RCS file: external/mit/ctwm/dist/xpm/background7.xpm diff -N external/mit/ctwm/dist/xpm/background7.xpm --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/xpm/background7.xpm 3 Sep 2015 12:20:01 -0000 @@ -0,0 +1,155 @@ +/* XPM */ +static char *background7_xpm[] = { +/* width height ncolors chars_per_pixel */ +"128 128 20 1", +/* colors */ +"` c #000000", +"a c #00001D", +"b c #682A9A", +"c c #8C63FF", +"d c #0D0022", +"e c #5E1989", +"f c #764AB7", +"g c #7353C4", +"h c #6B52C6", +"i c #8F38AE", +"j c #5C0D68", +"k c #7343B0", +"l c #852BA0", +"m c #4B086A", +"n c #633CB6", +"o c #975AA0", +"p c #130049", +"q c #BA82A4", +"r c #2D0455", +"s c #450541", +/* pixels */ +"rfdrhghggmarfghghedasddmnghh``n``ccmrrmjjjcc``jjk``mnnnnnnnradkrsmsseiiiljsjjmsso`a`cghhhghc```esjejsarngh``g``cclmbkdrhcc``md`r", +"meapnghhnraphggneddleopdmnghh`gn``ccprmmmmmcc``rs`mnghhhgneddksmmelsmbiiiejjjjsjs`r`chhhggec`p`asssdarngh``g``ccljmbeapcc``hra`s", +"saapnghggrarngheddlesjipdeng``hgn``ccmeeeeejcc``a``ghhhgnmddkrmmemrlsmbiiijsdrmsa`n`chhggedc`n`daaadrngh``g``cclrjmbbdcc``ggma`s", +"aa`pnghhnrargheddlesdslopdm``h```n``ccooqqolscc``n``hhgneddisrmemrrrlsmbibmssjsar`g`chghedac`g`eeeebngh``g``ccbmmjmbbcc``h```d`a", +"epapnhhgfrarneddlesssjjjlp``n``c``h``ccoqqojsscc``h``ghmddijsmemssmrrlsmemrmelmde`g`cggedamc`h`hhhhhgh``g``ccljjmjmbcc``g``c`e`e", +"nmarfghghrapeddlessjlllll``d``ccc``n``ccoojmsamcc``h``mddoosmejspmjjjjlsrrmeiipam`g`chedarnc`h`hhhhhh``g``ccbjjmjjmcc``g``cc`h`h", +"hrapnhhgnr`aadkesseliiii``k``ccgcc``n``ccjmsamngcc``n``diqosjjmdssmjjjmsdmeiiimde`h`cnr``amc`h`hhhhh``g``ccbjjmjljcc``p``ccc`h`g", +"gmarnghggma`dlesmeiiiii``l``ccmngcc``n``ccpamnghhcc``d``qqosjjmsjjrrrrrsseiiiipae`g`cba`sdac`h`hhhh``h``ccljjmjoqcc``d``cchc`h`g", +"nrapkghhnradlesssellll``m``ccpdmhgcc``n``ccmnghhhgcc``i``iiiijmsoljjjjjjeiiilesde`h`cnpsoosc`b`bbb``b``ccbiiiiiicc``e``cchhc`h`g", +"brapnhhgfraeesssjeeee``s``ccmlpdengcc`gn``ccghhhgnmcc``d``jjjjmsoqooojjeiiibjsrde`g`cnpdpsoc`d`dd``d``ccljjjjjjcc``b``ccbbbc`b`b", +"daarfghghraemjoqqqqq``l``cclllopdmcc``hgn``cchhgneddcc``j``lejmsloooljeiiibmrjram`g`cbdafjlc`d`d``d``ccbllllllcc``m``ccddddc`d`d", +"sd`pnhhghraelqqqqqq``s``cciiiiiipcc``h```h``ccgnmddiicc``i``iejmssssljiiibmsjqmde`h`cnpsslic`g```g``cciiiiiiicc``mm`ccsssssc`s`s", +"mkdrhghggmdbqqqqqq``o``ccliiiiiicc``n``h``h``ccmddkiibcc``i``iejsjjjobiiljslqqdam`g`cbaakbic`iiii``cciiiiiiicc``lmm`ciejliic`i`m", +"meapkghhnraeqqqqq``q``ccmliilllcc``d``ghh``h``ccdkeiibscc``l``iejsmmleiibsjqqqsde`g`cnpdsbic`lll``cclllllllcc``ljsm`ciemjllc`i`b", +"bbdpnghggrdeqqqqo`o``cclmlilescc``i``mnghh``n``ccmeiibsscc``b``iejmjjeiiesjqqqrae`g`cbpdfbic`js``ccmmssjjecc``e```m`ciesjejc`i`i", +"ibdrhghgnramoqqoj`s`ccslmlibmcc``m``damfghg``d``cceiibsslcc``b`iieeeeeeeeeeeemaam`g`cnddreec`e``cceeekdsecc``q``l`m`ciejlslc`e`i", +"ibapnhhghmadjoojs`m`cmmlmlibcc``m``llpdengnm``i``cciibsjoocc`m`iisaaaaaaaaaaaa`ae`g`cnpaaaac`a`ccaaaadoscc``q``js`m`cieeoooc`j`i", +"ikdrfghhgnedpissm`e`ceelmlicc``j``liiopdmkmdd``s``ccibsjqqoc`s`osadddddddddddd`am`g`cbd`dddc`d`cdddddadcc``j``jsm`m`cielqqoc`m`e", +"ebapnghhhghmdpome`j`cjjlmlic``j``jeliikppradil``j``ccbsjqqoc`l`pamkggggggggggkpde`h`cnpdeggc`g`cggggfmcc``m``lmrj`m`cielqqoc`o`j", +"josamnghhhgnmdpom`s`csslmlic`e``sjjeliiopadosjs``l``cbsjqqoc`o`arngggggggggggbdae`g`cbdaeggc`g`cgggggcc``i``smrrj`m`cielqqoc`j`m", +"mjepamnghhhgnedpi`o`coolmlic`e`mmsjjeliiosklmsdm``e`cbsjoooc`p`mkghhhhhhhhhhgndae`g`cnpamghc`h`chhhhcc``d``jmsdpj`m`cieloooc`j`o", +"omjopamnghhhghmdp`o`cqqlmlic`e`mjjmjjeliilejlmdrj`e`cbsjmmsc`a`nghhhhhhhhhhhgnpde`g`cnpdeggc`h`chhhcc``f``dojmppj`m`cielmmmc`j`s", +"oomjopamfghhhgnma`i`cqqlmlic`e`smjjjjjeliilejlsrj`e`cbsjrroc`m`ghhhghnnnnnnnhbdam`g`cbdarknc`n`cnncc``h``eddljppj`m`cielrrrc`m`j", +"qqomjraameeeeeeep`p`cqqlmlic`j`ejmjjlsseliilejlmj`e`cbsjjopc`n`hhhgherrrrrrrrpade`h`cnpaprrc`r`crcc``h``ghmddojpj`m`cieljjjc`m`o", +"ddddsa``addddaada```cddddddc`d`ddddddddddsoilejjj`e`cbsjopac`g`hhghedaaaaaaaaa`am`g`cba`aaac`a`ccc``n``hhgheddijj`m`cieljsdc`d`d", +"ddddddddddddddddd`d`cddddddc`d`ddddddddddapkiles``e`cbsopamc`h`hggedameeeeeeempde`g`cnpareec`e`cc``a``ghhhghedpkd`m`cielsadc`d`d", +"bbbbbbbbbbbbbbbbb`b`cbbbbbbc`b`bbbbbbbbbbrapiil``s``cbopamnc`h`ggeddbdpmeiiiljrae`g`cbpdkbic`l`c``o``mnghhhgfmddo`m`ciesambc`b`b", +"hhhhhhhhhhhhhhhhh`h`chhhhhhc`h`hhhhhhhhhgnmapo``e``ccopamngc`h`hedablsspmeiiilsa``g`cnddfbic`i```i``samngghhgnedp`s`clsamkhc`h`h", +"hhhhhhhhhhhhhhhhh`h`chhhhhhc`h`hhhhhhhhhhgnma``i``ccgpamnghc`g`mdabjoeespmeiiim``gg`cnpdslic`iiii``ioramnghhhghmd`o`csamnghc`h`h", +"hhhhhhhhhhhhhhhhh`h`chhhhhhc`h`hhhhhhhhhhhgn``p``ccskdrnghcc`n`aabjmoeiespmeii``mgg`cbdakjlc`llll`llllsamnghhhgne`d`camkghhc`h`h", +"hhhhhhhhhhhhhhhhh`h`chhhhhhc`h`hhhhhhhhhhhh``m``ccleearngcc``m`dbsmjoeiijsdmb``degh`cnpsjelc`llll`````````````````d`crnghhhc`h`h", +"nnnnnnnnnnnnnnnnn`n`cnnnnnnc`n`nnnnnnnbngh``g``ccoiledrncc``e``osmjeoeiils`d``r```g`cbddfjjc`jmsssmjjmjosamnghhhgfm`crnghhgc`n`n", +"ddddddddddddddddd`d`cddddddc`d`ddddddddmn``h``ccaroiearcc``n``esmjemoeiiesd``s``c`g`cnpdjjjc````````````````````````camngghc`d`d", +"ssssssssssssssssd```cddddddc```sssssssda``g``ccnmasomacc``g``aesjejsoeiies``r``cc`g`cnpdrrrccccccccccccccccccccccccccdamngec`s`s", +"jejsemlilmlsdomjb`a`cnnbbnbc`a``emrsjoo``m``cchgnmadacc``h``rdbmjejsoeiie``s``ccc`g`cbdakssspdsmjjmsjoljmjjsamngghhgnedamedc`s`s", +"mjjmemlilmljsrome`p`cnghhhgc``p``rpdss``p``cchhhgnmacc``g``kpaesjjjmoeii``j``ccdc`g`cnpsooojssmjjmrdsmsmjjjoramnghhhghmdaadc`j`j", +"jmjjemlilmljsmjjm`o`cmnghhhcc``p``mrr``j``ccnghhhgncc``h``ggrdbjsjjjoei``s``ccarc`h`cbaakqojrmjjmsmmrrmjjmsjldamnghhhghedaec`o`l", +"ljmjemlilmlsmemlm`i`camnghhhcc``p``j``j``ccamnghhhcc``r``hhnpadssssssss`s``ccarnc`h`cnpdqqospmjmssjjjjjjmsjosaaamnghhhghedpc`q`q", +"qljmemlilmlmemmlm`i`ccamnghhhcc``p```m``ccipaenghcc``a``ghgfraadddddddd`d`ccdmngc`h`ceadqqosrmjsssjjmmjmsjosammdamnghhhgfmdc`q`q", +"qqljjmlilmlemsjlm`i``ccamfghhhcc``pkr``ccqqqpamfcc``r``fghgnrarbbbbbbbb`b`cbbnghc`g`cddlqqosrjjsjjsrrrrsjosamnhedamngghhgnec`l`q", +"eeejsmlilmlmsjolm``b``ccamnghhhcc``po`ccqqqqipacc``h``rnghgkparngghhhhh`h`chhhhhc`h`cccccccccccccccccccccccccccccccccccccccc`p`e", +"mmmsmelilmlsjoqlml``m``ccamnghhhcc``p``ccqqqqocc``g``argghggramgghhhhhh`h`chhhhhc`e``````````````````````````````````````````d`k", +"kllllliilmljoqqlmli``m``ccamnghhhcc``p``ccqqqcc``m``rarhghgnpar```hhhhh`h`chhhhgc`ddlllljjbllllllllllemsamnghhhghea`amnghhhghe`p", +"doiiiiiilmloqqqlmlib``s``ccamnghhhcc``p``ccqcc``p``kmarnghgfra``h``hhhh`h`chhhhhc``l```````````````````````````````````````````d", +"dpliiiiilmlqqqqlmlibr``e``ccamnghhhcc``p``ccc``s``drparfghhnp``bbb``bbb`b`cbbbbecc`i`sseliiiiiiiiiiiisamkghhhgneddliisamnghhhgne", +"mdpolllleseqqqqlmbbmrm`ii``ccamnghhhcc``p``c``s``kpaaapnghgk``a```d``dd`d`cddddadc`e`meliiilllllllllsamnghhhgheddiiiloramnghhhgh", +"n``````````````````````iib``ccamhghhhcc``p```s``iiosaargghg``a``c``d``d`d`cddddplc`j`eliiiejlllllllsamkghhhgheddliiejsssamngghhg", +"``mdpksssjoqqqqerrrmeiiibms``ccamnghhhcc``pkr``iiiejrarkhh``p``ccc``s```s`cqqqqjsc`m`liiiejlrjjdrmsamnghhhgheddiiiemsssoramnghhh", +"`g`````````````````````````s``ccamhghhhcc``po`iiiejjbdrhg``g``ccjcc``jjjm`coqqljsc`e`iiiejlsrjjsjsamkghhhgheddliiemsejjlosamngh`", +"h``ccccccccccccccccccccccc``m``ccpbhhhhhcc``m``iejjeearf``h``cceeecc``eej`ceoojjsc`l`iiessosrjjssamnghhhgheddliiemsleelliiramn``", +"``ccfmddoljsjlsjjeiiibmrscc``j``ccnghhhghcc``i``jljjeap``h``ccellllcc``ll`cclosljc`i`iemsslsrmjsamnghhhgheddiiiemsljjjjeiiosa``g", +"`cchgneddlslssjjeiiibmrmjmcc``p``cchhhgnmacc``e``lssbd``g``ccdbeeeeecc``j``ccjojec`i`emmjjjlrjsamkghhhgheddliiemdjssssejeiii``m`", +"ccggggheadlsssjeiiibmrmelbmcc``m``cchgnmapocc``s``oom``n``ccpamiiiiiicc``e``ccjelc`i`jmellejlsamnghhhghedpoiiemdssooooojjei``p``", +"cggggggkrasrdseiiibmpsjiiibocc``g``ccnmapoiicc``d``d``r``ccgraadddddddcc``p``cciic`e`sjliilesamkghhhgheddbiiempmjmsoqqqqjj``i``c", +"dddddddda``ssssssssssijeiiopacc``h``ccapoiiejcc``d``````cchnp`addddddddcc``s``ccic`s`ssssssdamnghhhghed``dsssssssssssssss``s``cc", +"pppppppppppppppppprpppojeopamncc``g``ccoiiejopcc``nbr``cchgfrarbnnnnnnnncc``e``ccc`d`ddda``amnghhhghedappppppppppppppppp``p``ccp", +"gggggcccccccccccccccccccccccccccc`nm``cciejopamcc``nr`ccghhnpargghhhhhhhncc``i``cc`b`bbbraamkghhhghedamfggggggggggggggg``g``ccgg", +"ggggcc````````````````````````````map``ccjopamngcc``r``cchgkpaccccchhhhggmcc``s``c`h`ghedamnghhhghedamnggggggggggggggg``g``ccggg", +"hhhcc``hhhhhhhhhhhhhgnraamnghhhgnm```i``ccpamnghhcc``a``ccghrcc```cchhhggedcc``m```h`hedamkghhhghedamkghhhhhhhhhhhhhh``h``cchhhh", +"hhcc``h````````````````````````````o``e``ccmnghhhhcc``r``cckcc``g``cchhgfraacc``ghhg`edamnghhhghedamkghhhhhhhhhhhhhh``h``cchhhhh", +"fcc``f``fffffffffhgnmaamnghhhgnmapoii``o``ccghhhgnncc``h``ccc``bnn``cchggma`acc``hgh`damkghhhghedarngffffffffffffff``f``ccffffff", +"cc``r``rrrrrrrrrrmnedamnghhhgnmapollej``a``cchhgnmddcc``g``c``a```d``cchhraarncc``he`amkghhhghed`aprrrrrrrrrrrrrrr``r``ccrrrrrrr", +"c``s``sssssssssssppaamnghhhgnmapoooolop``n``ccgnmadsdcc``h``````s``p``ccgmapnghcc``p``bghhhhhbp``dsssssssssssssss``a``ccdddddaac", +"``j``iiilerjjosjlbdamnghhhghmadksmjeopam``h``ccmadkibdcc``gnr``sso``f``ccmarfghhcc`````nghhhgheddbmjmrsmmjjjjjjj``s``ccgggggedcc", +"`m``eiiiiesjjmsslsarkghhhggedarsmjemrarkg`hh``ccdbeiearcc``np`esmba`ng``ccapnghghcc``p``nghhhghmasjmrrsjjmmmmmm``j``ccgggggepcc`", +"m``smbiiibjjjjsjsarnghhhggedadapsssdarng``hgh``ccleiedrncc``r``mjk``ngh``ccpngggbpcc``p``hghhhgnmasodsjjjjjjsr``s``cchhhghepcc``", +"``rlsmbiiiesssmsarnghhhghedambmaaaaarng``h```d``cceiearfgcc``a``s``p```h``cckghbpaecc``p``hghhhgnmarolooooool``s``cchhhghedcc``m", +"`mrslsmbiiespmjarnghhhggedamngnemmmeng``h``c``b``ccieapnhhcc``a``````c``g``ccgbpaeescc``p``nghhhgnmasoqqqqqq``s``cchhhghedcc``je", +"```````````````````````````````hhhhhg``h``ccc``j``ccbdrgghhcc``eer``ccc``m``ccdaeesdscc``d```````````````````s``cchhhggedcc``jej", +"srmmjjlssssmbisdeghhggedapnghh`hhhhh``h``ccdcc``j``ccarnghhhcc``n``ccgcc``a``cceesdselcc``pdenghhgghmapeooljj``cchhhghedcc``rjjm", +"`````````````````````````````h`hhhhh`h``ccdljcc``l``ccrhghhhhcc```ccnghcc``a``ccsdseiiicc````````````````jjs``cchhhggepcc``s````", +"cccccccccccccccccccccccccccc`g`hhhhh`g`ccdbjjmcc``e``ccfghhhhhcccccpkghgcc``a``ccseiiiiicccccccccccccccc`es``cchhhghedcc``o``ccc", +"oojssslsmbiiierdeghhgedsekpc`n`nnnnn`n`cdljjmjocc`ei``ccgghhhhhggmapnghggcc`ee``ccebbbeeeeeeipdenghhhcc``d``cchhhghedcc``q``ccjs", +"oqooolsmbiiiessaeghggbddmjkc`d`ddddd`d`cblllllcc``eib``ccffffffffmapnghgcc``esd``ccssssssjjjjopdmhghcc``m``cchhhghedcc``j``ccljs", +"loooosmbiiiejsrdeghhgbdsmelc`d`ddddd`d`cllllllc``j```a``ccddddddda`pnghcc``r```j``ccjjjdsjlllllpdencc``g``cchhhghedcc``m``ccejso", +"osssjmbiiiejjqpaeggggeadmlic`i`iiiii`i`ciiiiiic`l``i``d``ccddddddaapngcc``d``q``q``ccsjjsbiiiiiopdcc``h``cchhhghepcc``e``cciiejm", +"mojjemliibjjqqsdeghhgbdrmlic`i`iiiii`i`ciiiiiic`l`eii``k``cckkkkkmapncc``r``qqq``q``ccjjsbiiiiiikcc``g``cchhhggedcc``i``cciiiiej", +"jmeejmliiejqqqpaegghgeapmlic`l`lllll`l`cllllllc`j`eiib``j``cciiejkdpcc``g``mqqqq``q``ccjsbiiilllcc``m``cchhhghepcc``i``ccllliiie", +"cccccccccccccccccccccbdpmlic`s`sssss`s`cssssssc`s`eiibs``s``cciiekdcc``h``amqqqqo``o``ccccccccccc``p``cchhhghedcc``bi`cccccccccc", +"````````````````````cbdpbffc`f`fffff`d`cjjjjjjc`j`eiibss``j``cciibcc``h``marqqqojs``s`````````````s``ccnghghedcc``mbi```````````", +"isdddddddddddd`aegh`cea`dddc`d`ddddd`s`cljoqqqc`s`eiibsjo``l``ccicc``g``heddkqojsrr``rrjsbiiesssse``ccdmfghedcc``jmbiieeooolsmbi", +"``````````````````h`cbdapppc`p`ppppp`a`clmjoqoc`m`eiibsjqq``l``ccc``n``hgfmapojsmmjj``````````llj``ccipdekbdcc``j```````````````", +"arbnnnnnnnnnneaae`g`ceaamnnc`n`nnnnn`m`cslmjooc`j`eiibsjqqo``l``c``p``hhhgnmapimjjmmmmmjsbiie`mm``cciiopardcc``r``mbiielqqosmlss", +"rnghhhhhhhhhgnpde`h`cbddeghc`h`hhhhh`n`crslmjjc`j`eiibsjqqos``l```p``nghhhgnmdpomrsssssjsbii``d``cceiiiopacc``s``jmbiielqqosmjsa", +"nghhhhhhhhhhgbdde`h`ceddeggc`h`hhhhh`g`casslmsc`j`eiibsjqqosj``lje``amnghhhgnmaposjeeeejsbi``l``ccljeiiikcc``s``jjmbiielqqosjsar", +"ghhhhggggggggbdae`h`cbdaeggc`g`ggggh`h`cmasolsc`j`eiibsjlljsje``l``lpamhghhhgneapioqqqqjsb``e``ccjmljeiicc``l``pjjmbiiellljssarn", +"hhhghggggggggbpde`h`cbddbggc`g`ggggg`h`ckrasslc`j`eiibsjsssmemm```jeisamngggggfmdpoqqqqjs``i``ccjjjmljecc``e``prjjmbiielssssarng", +"hhgherrrrrrrrpaae`g`ceaaprrc`r`rrref`h`cgnmasoc`e`eiibsjjjjjmmjoqqljeodamfffffgkmapkoqqj``i``ccljjjjjlcc``i``jlrmjmbiieljjsarngh", +"hgged`aaaaaaaaade`h`cbd`aaac`a`aaade`g`chgnmarc`j`eiibsjjssssssssssssd``addddddda``asss``s``ccssssssscc``s``lejljjmbiieljsarnghh", +"ggedasssssssssade`g`ceaapssc`s`sssdd`h`chhgkmac`s`eiibsjsaaaaaaaaaaaaaaaaaaaaaaaaaaaaa``a``ccaaaaaaacc``a``oilejssjliielsarnghhh", +"hedabdpmbiiiejsae`h`cbdrmlic`l`lllkd`m`chhhgnmc`o`jiibssareeeeeeeeeeeeeeeeeeeeeeeeeee``e``cceeeeeeecc``e``dpkilessjliiesarnghhhg", +"eddblprrmbiiierde`h`cbdsmlic`i`iiiil`d`cghhhgkc`s`seibsamnghhhhhhhhhhhhhhhhhhhhhhhhh``h``cchhhhhhhcc``h``nmasiilesmeilsarnghhhgg", +"ddljemjjrmbiiipae`h`ceadmiic`i`iiiii`d`cgghhhgc`a`osesamkghhhhhhhhhhhhhhhhhhhhhhhhh``h``cchhhhhhhcc``h``hgnmapiilesmesarnghhhghe", +"dbjmemlejrmbiisde`h`cbdsmelc`l`lllll`l`cehghhhc`m`rbramnghhhhhhhhhhhhhhhhhhhhhhhhh``h``cchhhhhhhcc``h``hhhgnmaroileseapnghhhgged", +"lssjemliespmbidae`g`ceadpmmc`m`mmmm``m`cdefghhc`k`ddarnghhhhhhhhhhhhhhhhhhhhhhhhh``h``cchhhhhhhcc``h``hhhhhgnmapoilekdrhghhghedd", +"dsjjemlilmdpmbsde`h`cbdreeec`e`eee``e``cddegghc`g`maamgghhgnnnnnnnnnnnnnnnnnnnnnn`n``ccnnnnnnncc``n``nnhghhhgnmapoilbarfghhgedab", +"sjejemlilmssmmrde`h`cedseeec`j`ss``j``cclddengc`h`nmadehggheddddddddddddddddddddd`d`ccdddddddcc``d``dddmnghhhgnmapiibapnghggmamr", +"jejmemlil`````````h`ceddmmmc`m````j``ccljkddefc`h`gnmadeghedaddddddddddddddddddda```caaaaaaacc``d``dddadmhghhhgnmarkkdrfghghrams", +"jejsemli``lsdlrdegh`cbdssssc`dsjej``ccljmjlddcc`h`hgkmademddekkkkkkkkkkkkkkkkkkkb`a`cemmmmmcc``b``kkkkbpamnghhhgnmadd`pngggframs", +"jjjmeml``m````````g`ceadoooc`s`````ccjjmjjmicc``g`hhgnmadadissssmejsoeiiesjjsslsj`s`cngggggc``p``mssjljopamfghhhgnma`arhghggmdes", +"smjjem``l``cccccc`h`cbdrqqoc`m`cccccssmjjmscc``e``hhhgnmaammjoojmmemoeiiesjjsmjjs`o`cmngghgc`m``osrrsssmopamnghhhgnma`pkgggnrarj", +"sssss``s``ccdamnc`h`ceadqqoc`j`crsjjjjjjmscc``a``hghhhgnmapeoqqojmmjoeiiesjsmjmjs`i`camnghhc`n`apomjjjjemopamnghhhgnrapnghggmaas", +"aaaa``a``ccaarngc`h`cedpqqoc`e`cssmjjjjmscc``r``degghhhgnmaroqqqojsmoeiiesjmjmsjs`i`cpamhggc`g`mapkjjjjmsjopamhghhgnrarfghghraaa", +"mmm``m``ccmmenghc`g`cddlqqoc`e`cjjrrrrrrcc``m``madenghhhgkrasqqqqojsleiiesjjmsjjs`i`ciramngc`h`hmaprrrrrjoqipamnghgfrapngggfrapm", +"gh``h``cchhhhhhhc`h`cdlqqqoc`j`coojsssmcc``m``gnmadegghhhgnmasqqqqoojeiiesjmsjojs`i`clqpamfc`h`gnmapismjoqqqopamfgggmarfghggmarf", +"g``h``cchhhhhhhhc`e`clqqljlc`l`cllllejcc``m``hggnradehghhhgnmarlllljeliiesjsjoqjs`i`cccccccc`h`hghmapoloqqqqqipaengnrapkggghrapk", +"``h``cchhhhhhhhgc`d`cjllmjec`l`cllllecc``m``hhhggmaa``````````````````````````````i``````````g`````````````````````````````````n", +"`h``cchhhhhhhcccc`d`cssjelic`i`ccccccc``m``hhhghedd``pegghhhgnmapiiiiiiiesjoqqqjseiiejssmopamnghhhgnmdpkjqqqqqqopamnrarfghgnra``", +"b``ccbbbbbbbcc````l`cdseliic`i`````````m``hhhghedd``l````````````````````````````````````````````````````````````````````````apb", +"``ccdddddddcc``adll`cseliiic`lllllllsam``hhhghedd``i``cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc`aad", +"`ccssssssscc``s```e`celiilec`mm`````````hhhghedd``i``ccdpehghhhgfmdpommmmrlqqqqjseemrmbiiiejkramnghhhgfmapojjjjeiiisd`pkggcc``a`", +"cclllllllcc``q``r`s`cliilejc`ll`llsamnghhhghedd``i``ccdlddefghhhgneddlllllqqqqqjssmrmbiiiejselsamnghhhgnmapksjeiiibmbdrhgcc``d``", +"cmmmmmmmcc``q``ep`s`ciilejlc``m``samkghhhghedd``i``ccsseipdegghhhghedpimsjoqqqojddrmbiiiejjsrjopamnghhhgnmdpkeiiibmseapfcc``r``c", +"eeeeeeecc``e``jjd`e`cilessocc``s``mnghhhghedd``i``ccijmlilddehghhhghmdpommjoqojjddmbiiiessjsrjjeddegghhhgnrariiibmslbapcc``g``cc", +"eeeeeecc``m``lsjs`l`clesdslscc``a``ghhhghedd``i``ccjjereiioddmgghhhgnedpllmjoosjpmbiiiemddjsrjjsarkghhhghedabiibmmljkdcc``g``cce", +"mmmmmcc``s``jjlme`i`ccssmmmomcc``n``hhghedd``i``ccsssssmbiilddenghhhgfmdpojmjjlsmbiiiemrrrslrjsarnghhhggedabiibmpjssecc``g``ccmm", +"bbbbcc``l``mjjmel`i``ccelejmoscc``h``ghedd``i``ccjoooolscccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc``g``ccdeb", +"ssscc``s``sodseli``e``cciiejsamcc``h``ed```k``ccnnnnnnncc```````````````````````````````````````````````````````````c``k``ccraas", +"aacc``a``aabseliis``d``ccssdamngcc``h`````d``ccdddddddcc``da``aaaaaaaaa```ddddddddddposeiiisarnghhhggeddbiibmrsaaaa```p``ccgma`a", +"ecc``e``epaeeliisaa``a``cc`amkghhcc``d```p``ccpppppppcc``p````````````````````````p``````````n````````````````````eepa``ccgnrape", +"cc``h``gfraeliisaree``e``ccmnghhhgcc``mkg``ccfffffffcc``f``ffffffffffffffffffffff`f`cccccccc`g`hhggedabiibmssarng`gfr``ccggfrapn", +"c``h``hghrdeiisamnhnn``m``ccghhhghecc``gg`ccgggggggcc``g``ggggggggggggggggggggggg`g`ceaddarc`h`hghedabiibmssarngg`gh``ccghggmarc", +"``h``hhghramksamnghhgh``a``cchhghedacc``h``cchhhhhcc``h``hhhhhhhhhhhhhhhhhhhhhhhh`h`cfraarnc`h`ggedabiibmssarngh``g``cckgggfracc", +"`h``hhhggmaadamnghhghed``n``ccghedamkcc``g``ccgggcc``g``ggggggggggggggggggggggggg`h`cedarngc`h`hedabiibmssarngh``h``ccrnghggmcc`", +"b``hghhhnra`amnghhghedam``h``ccedarngfcc``f``ccfcc``f``ffffffffffffffffffffffffff`g`cdarnghc`g`eddbiibmssarngh``g``ccaphggghcc``", +"``dehghggraamnghhggedamng``h``cc`aprrrrcc``r``ccc``r``rrrrrrrrrrrrrrrrrrrrrrrrrrr`k`carnghhc`g`dabllemssarngh``g``ccaapnghgcc``d", +"`aarfghghrarkghhhgbdarkghh``g``cc`aaaaaacc``a``c``a``aaaaaaaaaaaaaaaaaaaaaaaaaaaa`p`crnghhhc`e`dbjjjjjsarngh``g``ccdaarfghcc``a`", +"kmapnhhghrapkghhghed`aenghh``h``ccreeeeeecc``e```p``pppppprpa`dmeeeeeeeeeeeeeeeem`a`cnghhhgc`d`eiiiiisamngh``g``ccekmapngcc``a``" +}; Index: external/mit/ctwm/dist/xpm/background8.xpm =================================================================== RCS file: external/mit/ctwm/dist/xpm/background8.xpm diff -N external/mit/ctwm/dist/xpm/background8.xpm --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/xpm/background8.xpm 3 Sep 2015 12:20:01 -0000 @@ -0,0 +1,155 @@ +/* XPM */ +static char *background8_xpm[] = { +/* width height ncolors chars_per_pixel */ +"128 128 20 1", +/* colors */ +"` c #502C1D", +"a c #603926", +"b c #683920", +"c c #582E1A", +"d c #663121", +"e c #82412C", +"f c #874F34", +"g c #6B3929", +"h c #905839", +"i c #73462D", +"j c #743727", +"k c #7A4026", +"l c #502717", +"m c #86492E", +"n c #3F1D12", +"o c #5A2F1F", +"p c #733C20", +"q c #6B3D28", +"r c #734229", +"s c #642E1D", +/* pixels */ +"efhkeldsddekmkeeemejbrrigdgjmiioo`ssppsbbisdgfihfkggdgigollbddbggqaolosqbbbqs`obdpjrbo``ospmmmrrkid`acoagl`prgaoaaigollbpbeekrss", +"pkbbalnclogekkmejkkrermemrrrqpbgo`nospcgkisoiifhhkdoooqcocabadgpppjo`ccbbbeii`o`ddpprgslocbjeiipfhfo``oogoliiiaairbgc`lbbsdbgocj", +"ddg`annnnldskfhmmmfhkjiemierjbbca``lcssbbsssdpkfhmgjgggdobbcspbbrkqoodbgjkkfiid`lospkkdoo`cbbrgjmhfiaooaqaaphffihgaadllcccooao`d", +"ajgaonnnn`ojkhhhimhmkpjibrpjgqaono``no`all`ogkiehfehffic`cddqarkmhkqgdgjjifmmiraaosspkigdcoobqrqmmmiqagqbgasjfiijg`nllnnlaobqb`g", +"beehhg`nnnorffhhhmheisaagdppkkkb`llnnlccln`ogjrfmhfhffiosaasbgppjefkrfkpbimkipbgoolosjbribbbjkrieiikkrrgbaq`bihmg``nadddjjdbgfii", +"isskep`nnndjmhhhemmmrbgqgqbjjkpd`nn`nnllnlodihffhffehhkbjpgpmikmkkmfhhferihmkpbcaooccsjrqgqrpkrimekekprid`a`cremidnnbrkskdddgbbp", +"gigfffglnldskmhmeemergireirpbbbjdc`ocnllc`bkmhhhhfimhhiirgpeekkfhpihfhhijjhfrigoloooloogao`absjkhfmmejkffo``o`mmhipqqiejggdgfigg", +"`caairfc`adbcbrjjhfmffemmfjjbdaqb`gqa``nlokmfhhhhhhmhmhppgemefkfhhhhhffhfmffmrpolclllcbbqfodqfjehmmmjekhfia`l`skmfpirifkdoooiqig", +"`oo`giiborerboosjmmmhekeheppbrgrjdgqgsccllsjemfhhhemmmkkbpppkefmmmhhhffhhmmmiqc`nn``l`odrfibfiepfhmppkmmmiiaaosspmmipefmggggggoa", +"nnnniibbopjikiiqkmkhmfmhhmkmjkmmedjeijpgblccssemhfekejjbadkkkehhhhhhhhefeipppbsclcafoloppffrffepfhfepkmfikpjdoloskprkehfeffficn`", +"o`naifgqbpiiriqgjpkmhhhfmmimkmhherkjkmkiiqaacbcbrjgmjjoooojjejefhemehffbddsscooo``gfi``drippffmsmmfjkjeeeppbgbblcssdjjehhhfhfg`o", +"hiiirmikbrffrigrfhkehhhfefjimmeefrkiekmkfhfiiiboolokjdocdogrkjpmhmeemmegdgggdsdclsddaoarkijqqfmkekppdgdkeijaoadoldaejpbmhkhheifq", +"fhfhiiifemmmhifphhmphhfkkjmmffkkeiifiereefmeggriq``figdsccsqrpdkerjgjbdgjdkgoloccsaaocdrffejemmkpsjrfibrkpjadccodsihfijihhfhhhhp", +"fmekkmmfhmmhhhfihhmkhhhmkjmfhhhbiegdiefmekmkigrfioakhkrbcorpsddqcddqmfeeejigssbbgdggdcqeehhmhhebbmmmrbdqcdcarkpijgifhiirhhfmhhhk", +"kjjpjgjkkmeehhiihhhphhhkmjkmmmkkredloereemkpiiqibagdefrisjippjjcccggfeeppbdbqgqdjgqgdspkmhhmhmkkmhhmkpibbsggmmmppcobkffmhhffiiki", +"golbbggqjjjjeheqrhhmhhfmkjbeejgsigg``oibfhhmrriagagdkfpkdbembjqblcaqkepjsssjpkjpmemicdgmhmhfkmrmfhmhmrkrsbaqempjsllcbkkkmfhkjlab", +"lblqbjpspdjjmfmrfhfmfmhfijdiejooaaga``oskhfmrrkirqqdphfkkkkpsbrsllodpppbclllbdpehfmejlimpkeemefmhfemhmidclodpppbcnnldoobsbssdlad", +"ddsgjjbbsqkkkmhhhhhmmhhmpbdrrga`ddrgalllrefmipfffhjjrhhikepgsqag`nlcbpbglnnnlbbemhhhfqffssssbpkepmmhfidolnlbpkbbclnclccnnlllocpo", +"saoiefiebbppkkhmhhhimhhkkqariiaagrpqc`lldrrejkmhffhfmfhfmpjooaoaanl`grigonnnnlgdkmhhffijdsbscpbdeeffmkd`ln`kfmkpgcpjmeja`l`cgbpd", +"iaaapbmkmdkkggmmfhhhmhhmbgojfiiifgjbo``ldbrqrrffmihhmhhhkesa`aaigollbrpid`nnnloosmmhmhhfqaiaoocjiifmhhgoolomkpkkpjkmfeeiolscsjmg", +"pbooggkmpppeicpefmfemmmpbdbsdijrkjso```ccddqqikmiimemkekpjdoarrbgcolapkpslnnnnlloimieemkbgjrgjgrffffhhfii`immfmbefmmmjhembssskki", +"kaaldgfmjbpkrcsrpmejkeddcooobiemeejda`qiqbqjirikeejjjjdbcggaqfgaagccdrikba`nnnl`lgifmerkjimeppprhhfhefmiacbfhmieaarkpkmhhmpssdmi", +"sqqocirejjprbcgasbdsrggl````sbjpmmkjdooiggkrggpgjppdddgddogodgd````looiqrqannnnnnlkreempqerppprpekmefmhgiiihmpijiikfhkehhmpsdgjg", +"oaq`cqogfoabbco```l`aao```oobbgefmmfrbrmprkjrjrppsddddgegooggdl`n``anlbrpiqonnn`nloibfhhmpkebssdseffjhmiffqhkmfhfhkhhmphhmscdrbo", +"gogodcskiocagoosolllbaacdgbabbjpmfmfhfhhmkkmepbgbodocsekisssdbonn```llbprgq`nnnnl``oskhfmrkkaooggbmmhfhhhigiihhhhhihhmkhhfjcsesd", +"alaoclddjosdjpjbdccoaigbdjjjbirpmmmmhmhhmkkhebbqeggolcgjerdscggsoaaa`aarrrolnl``ddlllrefmipmiglolopmhmphfioobfhhhiihhhphhhkrcbga", +"biqbloodollsgdgoibgoggdoojdgeiogjmmhhhhhhfkhmisqjqbalnllgqpblspsoaqa`laspsglnnloscolldrrejjmfkacclodmegmhadlbfhhheqrhhmhhfmjsjpb", +"mirbooolllllssdgddbgdcoodosjeirllsjemfhhhemmebdbiiiollllbdddncbradqqo``sbbo`nlbdgdoocdprqrrfekrbsqclbjbeead`bfhhhmrfhfmfmhfigsbp", +"keiegg`llbcsddgfiggjragqgrrfhhfqcclssemhfekesosdkkrdd`nllllcclbsajjbg``lccllncsbpboodcdgqqikipbcssclsdpjjijbdhhfhhhhhhmmhhmpgsbp", +"ppikiballbbdoooiqiaocgrjimmfhhffiaacbcbrjgkjg`oagperrascllllcddboaqpga`llclclsrkkablddrqgriikpsslllclclbsqjobmmfhhhhhhimhhkkrpcs", +"biimiioosjkggggggoa`oreekmmhfhmhhfiiiboolopgdabgbpikpbccll`cdbao`l``ollnll`lodgjsqqocabjbdgrigao`n`lclnlsri`dihhhhhhhhhmhhhbiqos", +"odjkpjgrkmmeffficn`nlcpemkkfmieefmeggria`liggqqgbpfmpbdoolcsbpqqccnnnnnnnllccqdooaq`cbcagagikkpslnnnclcosjkdlifjemfhhhemmmkpbbcl", +"lsbdbegrekhhhfhfgl``oskhmkkeifmekmkigrfqoobiqqiirkhmksdslloodbaolnnnnnnnnllllkpdgogodcspbddbqbalnnnnlobbjjgddimcssemhfekejgsqad`", +"nldpprmepbmhkhheifqfiiffmjjgkreemkpiiqidaoccarkfjmmepsccccbadbccccnnnnnnlclcsgiaalaoclddgcsbsbdlnnnnnodgbdoocbdacbcbrjgmejooaooc", +"clcbkfhmirihhfhhhfpmhifmekdooibfhhmrgidbaalncbimjkejdsaddcdbaolnnnnnlnllccsbckkbbiqblood`lcccloabb`gadgegocllbjiiibooloiigaoaago", +"llloeehhiirhhfmhhhmffjeppjao`oskhfmrgrqdoolllcbggmejooaobaoddalloo`oo`ccaddpggqpmirboooll`ocspmpeeegireekppclldjdgriq`lieraajpdo", +"olprmhffhhfhhffiikrbrjjjpdddlllrefmipmipccllll`loiigaoaagdocdoclabooa`olqbbkrsrkeeiegg`nnnnldefhffmfjrfedbdgbclsdsbib``pirrpedo`", +"lcskffffhhmhhhkeldscldaoadblllldrrejrkijdoodsia``ffiaaipbdcooaoodgoaaigbgrpppbbpppikibalnlnlspjpjmhhfpedddgsccnnllldl`llsrppgoln", +"lcsjmhhefeikkbbalnlnn`olodc`l`ldbrqqbmjadaabriiaakhffihgaodcbjiibccoarkbekegb``dbiifrroll`ll`jbdjhihfkggdgigo`nnnnllnnlldbejdc`n", +"losdpmmmdddddd`annnnnlllllo``lccddqbqbgdoadgpkpaasjfiijg```odefffgdigieipbssolnlgbpkpbl`l`cllabaiifhhkdoooiba`nnnnnnnnnlbbjpsbcl", +"ln`ssjppdcagfgb`nnnnn`gbocl``aaacbgggqgdddbsdgjag`bihmg``n``gsffekfifbddddo``lnlcssssdbd`l`loaggiikfhmgggggd``nnnnnnnnnbpipddsdc", +"lllllocsddsirrclnnnlpekkpsll```lodbdbrjgagoccaaao`cremidnn`oagkffffkmjdggfia``lolbodsbbacccoaprdimfmhfefffilnnnnnnnnnnnjiirbjgdo", +"o`lnllssadoagaolnnodehhejsccnncccaoaggqiiiiaqgigo`o`mmhibagaigrkfmfkrjgbmifbaccqgbrgpqraolabaikbjjemehhhfhfalnnnnnnllnlpbopsjjbo", +"boolnnlclscllallnnspkepjkbdo`lclssddgbgerihhmmmidal`skmfpgaqaabipikmmfigifffggdffrjejrrrcooscjibkhmpbmhkhheqicaonlllll`bccdcsmpd", +"blaoccdlollnnllnlncdejdgebsllnnlcddsbkiemehmhhhiraaosspmmibqraqbjlgpkifaggffhfmmhmipgspbbllllldqfhffrihhfhhficbas`onnnlccspbdpra", +"biqqbbbbclnnnnnnnlloiqairqa`nnnnn`dddjjemmeeeefhkrgon`skbrerbglcollbrrrmemmfhhkhhfpjldsao`nl``lgifhgirhhfmhmiqiqggalnl`bbrppskkb", +"mirbgbbcdb`nnnnlacbdiigjrppgaollnl`dgsspeemkfkkmiiiaolcssbqppgo``llbqpkemmhefeikkbballc```ocdbjgimehfmhhmfiibqbggo`nnnospbppggqp", +"eejegjddpjo`n`qqemmemidiiimibdqool`ooddiimekempifigqo`no`al``d`o``oqefjeefmmbddddd`annlllcosrfmmiimmmpfhhkeldsdjgadnnn`appemrsrk", +"ppipgsbcbdblsihemmhhhmrejkeikjjdabaalcaaqrfprfhfhfboclnlcccnllclolcsmmmjjekkgdggfiaonnln`labaprkjeeeemkkppgl`bpjpkkdaccbmpkkebbp", +"biiibjbiiiiifhpmekeefhkihepbkmdadooo`oo`biffbpkmfmbol`llllnn```oodojekkgdjbddgbfiisonnnlncapbeffmmmmeejjjggolcagdggfiisjkmmfralb", +"dssbeeerqjkphemmmmhkkmfhhfirkhirbcn`nnnniikkadjmfmes`lclsccnnlabaaodgbddgkfmfegiffid`nllccrpjjgpkjjjeeejjkpgssgsssgbbpksspkpplll", +"lsbremekpiifhemmmmhhpihfhhieehhffg`oo`naifda`scspeppoo`cl`llllcbddcbkmpijmmmppcooiiqcnlccjrpggsddjssjejdjkdbbsoosdkjgggjgrrejglo", +"llpkmefmimfffbpemjfhhhhhffhhhehfeifqhiiirralnll`dsbdgdgccclnnn`lcldgmkpbgrmpjsclcbpgollodbbsgcoogoccaqqoirbpjsllcdgbbdllaorpkcln", +"bjpmmemhhmago`spkmmmmhhhffmfhhfhhhhphhfhqqblnnnlsdsgsdsbcdlllclllcogkkssspppbcnnno`clclsccbjgaiiiiaqgijdgbsbssocdpjibdl```gjmgcb", +"rpppeehmkd`lllpjehhhhhhhhefehhmmhhhmhhffiffo`n`oddgiidooaaocabac```spbbccbpbglnnnnnnlcddlcdqbdgpihhmmmksadcollncokkqdo`llngjjscb", +"ibdeemmkpolln`pejkfhemehffppefmfiikikmmhhhrr`loalcoiqaoll`lcckifollcspcolbgigonnnnn`odgolcddqijeehmhhhebjcccnnnlsiergjaolcaesods", +"acrriejekcllndppjpmhmeemmejpmmhkeldsddikmmemqddggdgga``n`l`cgpffio`ldggclcqpid`nnnnloagqrddbkgbpmmeeeffpbpslnnnldpkpikibaccsoodd", +"irikijikrbdc`sppddkerjgjbddrpkbbalnclooggjjeiaddgqrqlnnnnllbbkkeir``obsaldbkpslnnnnlcdriidskppbkeikmpjekiislnnncdrpiifiiodcccgdi", +"iiifiiikipbbccssdsqcddqmfmejddd`annnnnnncojjmddjeiega```nn`bqbrqpdg`ocgsccgikbalnnncbdigcqbrkqrkpgremjqejgolnnns`djbpkkrdddlgbpk", +"eikpkikkirqaabobgjcccggfmmppdggaonnnnnnllikeeppepekgdrqfigbbdgdbbbca`ooscoogbrqannnobskgggdkjjjedgdrfheeis`lnnlqcbcsdddegrqdsbpk", +"ppsdpppppejgjjacagblcaqkmpjssdqssnnnnnllbgpejdjkkrerriqhhifbbbddqbono`ololldbsiqonlddbkbsdsjpdpdbspmmmfmkbclnngqlclccssbbbbsdsbp", +"scssssscssbdbdbcsrslcdgkppscloajdonlnlcbjipkddskpirirrpfhfmqifbcbdollllllccdsbda`nlccpkbgdsgjiiiiimhemmeekd`nnibobc`l`cdagdoodss", +"llllllcccdrfiiqbiijgasrkfkgdllddqbslccrqeekggopkiiiggbrpmmhhmkrcaconnn`lllcodsd`lnooskkiqcsdprpjkphmmemmmmpcl`poobbclnnlcllccll`", +"`llnlllommmrqjkpejkebjpkmfjrqdccsadacgkfhhkdcosjjjejsossdikmmffrbdolllllllcdscldonlcsbfipooldkpiiihemmmfhepblopccdscclnnnnllnllc", +"l`locskfhhmkpiiemrmmepmjjemfhiiaqbqjgiikfhmggssspppdclll`oggeehiboollllllbppslldalcbjkjdsaclsprkfmmppekmmgpjsbdcdgblgo`nnnllcclc", +"clclccmhhmhmremmipkekkefpifmffmfmmmidimfmhfkiasspppdcnnnnnncojppddlcclcjimmebcosolcljiboocblcrkmagddbikekloddobrikpcsbbba``dddsc", +"looqkmmhfemhkkpkpmkpjpmfhhhfmmhmhhhmrejemehhfrjgddddollnlnnnasbdddcclccmfhmhkssscldcsmpdgogosbrgolllpejij`loodoppikadakia`cl`ssl", +"llcbkkejmmmmjgbpekpbdrkmmhhfmhmeeefhkihmpbmhkmkbddsssocllolbabllodccqkmmhfeemiiqdbrqdriaalaccspd`lnofiibjlnlscoppmmgsqpkdcccsbcc", +"ccasibdjkmmmrspkeeiejikefhhhhmmmhkkmfhhffrihfimiipbirpkrrpsqisoncclcbkkepmehfmgbpkkkskkbbiqdcbrgdolbmdcooonlcclkpkmesbbpbcsssdcs", +"oqgsacqbkkkmmbbpppikqbqjpkpmmekkhhpihfhhiirhhikfiipffpkhmfkfegdllllgsibdjkfffeksqrrkgggpmipddbprjbldposldscggccbkehia`ddbbdbbpic", +"ifqqeibqpkehiq`bbiifikdgpscddbrpmhhhhhffhhfhhmfiikiemmmiipipkkeiclabdacrgifmfhmiprpkbsbkeereggddssccslnncsddpllcbkkkc`csdcccsiib", +"mikmmmsdbbkkkc`cgbpkkpddonnnnlcrkmmhhhffhhmhhhkejkpmhhjjn`lllocssogqiiiifmhmmemmkbrbbsbpppijgsssssccblnnllsspsllopppilocc``csbdp", +"jmmhfhpccdpppilocddddjbdlnnnnnldeemhhhhefeikkbpgdgppkss`nnnnnlllbbgkifkkmmemmmmkjrggbaobsppkbgcnllllllllnlllsllllbssclnlllsccsqp", +"jkmmmfp`llbssclnllcssbsclnnnnnnlojpppmmmssdsdgdbddsddonnnnnnnlnlsdgpmmkkkjekmmppjpjgiggosspssbsllnnnnobslcnncllnlsbsc`cclnllbpps", +"jpmmkhksl`sbsc`acll`cddcnnnnnnnnlocsjjppscdgekjgdodgiaonnnnnllo`dogbbmpgsiiimmkrpppikibbllcoodsoccolclllllllclllllsdldbalnlobpdd", +"csiffhm`llcsgcgibllnnlllnnnnnnnn`nccsspssdckefjgssdjjsllnnlclcsbs`acsdjeeimffiiobbiifiicllllslsco`abclnlnllcllll`lclllooolcsppsc", +"ldkfefpocalolllagallnnnnnnnnnnnl`cogllsscockkjgjcoogdcl``llaabiffo``dopejrmmmes`cgbpkkrddonllllll````b`nlnllcccccdcclocsllcsqqdd", +"`skfhjglod`nnlocclao`nnnnnnnnn`aagga`lolclbpmefiaqggqbbsdo`dbjehfia`l`sjpjrpeprlocddddegradcclnlcnlccbo```ripsosppssooccllsdrpjo", +"rjehhjdosdnnldbpbolbcs``nnnnnn`daaoolnlssoskmmfrgrjihmekkqdgrrmmmiiaaosdbrsjpsclnllcssbbbbcclll```lccsblbfhmepbppjieggolcsskiigq", +"idbfhrgldsllclcsbaoaibcoqbqogadgegab`nnlaakehhfffemmhmhmhkjibrkeikbgd`losbjbpss`acll`cdagdooollnlnnlcdggmhempbssppikgbbcccgbbbii", +"cqrffebccslllllccbcgpekmimeegireekkkbacbkmmmmmmhekehmeeefhkifeppkpbba`lllppppgsgibllnnlcllccll``nnnnlobdmmmeegsbbiimribdsskiibfg", +"gdgkhkoo`llnnnnnnlspjmmfhffmfjrfedggfiibeemmmkhmfmhhfmhkkmfhhferriiol`ln`hfkpcllagallnnnnllnlla````llloaejppssscdddkkrjdjjemipmg", +"darehmrp```ln`nnnlcsdjeepjmhhfpedddgbbpisspkpkmhhhfmmmhhpihfhhiipfmgllcldhepdocdcclao`nnnllcccdiol`a`lccclllnllocdbgrmejrkfmrpea", +"iaiemjibdlol`nnll``lssjddjhihfkggdgfigggigefhkehhhfmhkfhhhhhffhfmmia`loojffkssdbpbolbbdol`ddqbdgilogaoococclnnlcssbbkkppjjmebkmg", +"ekjmmmpgbbllllnscccsccdbciifhhkdoooiqig`cbbffmkhhmkkefmmmhhhffhhmmerdoobkmmd`sssddddgqqo`cl`bq`oiaad`oobqpbcn`l`cdsddjpjikmkpmkm", +"mpmmfkjlccsslnnlllllscooogkkmhmggggggoa`oooehhehhhmkefhfhhhhhefeippbdodriekgoslcsbdbdbbscccnccaoiiidbsgdgjgibclcbsscldjkkpmeekfm", +"jikpbbalncld`lnllclnlll`lgmfmhfeffficn`nn`orhhmmhfkkjjmfeeehffbddssddbdjbmfjscllsdiqgggrsccclnlqoogbiprfkdspicccsddddjehmmhfhhee", +"ddssd`annnnnllll`llnnnnccjbemehhhfhfg`oooaimhhmmmmkejbkekjemmegdgdjggdqrqpirbc`eempbjjskppds`lldgdgdkifhfibrfialcogdrskmhkekhmmb", +"dggfiaonnnnnnllcsclnnnncsrhmpbmhkhheifqhffmmmmfkelgprsddbggjbddgbirgssbqobkjqpimhmkpqqrmmmkpbdbgdggbgffhhiijhfbclldbsjpmhmeemmeg", +"gbfiisonnnnnnnl`bscnnnnoqfhfirihhfhhhhkhfferkkbbal`aagdcsbqmfmfegggbdgogodsbpeemmhfimiimppkpsppjjgiiifhffhhmmfgc`lgirjdkerjgjbdd", +"egiffid`nnnnnnldpis`ccldiihhiirhhfmhfmmfhjddddd`annncarabggemmpjbooabblaocldjjmmemhhmogpemmbkieekprpmhfmfhhmmkgccsrpsgdqcddqmfmf", +"pcooiiicnnnnnnoopkdccgbkiepihhfhhffiikeeegdggfqaolnllbgjcqqrekrssdsbcdkqblodgjsmmhfmgocefkieaarjbrimmhhhefeipbccobkppiicccggfmmp", +"scsdrmign``nnoifbiggggddiirkfhmhhhkjddjdddgbfersdllnllsbbbjrkkqsscoodpkrbooocsjkffmkgdqmepijiikffjkeepfmmbddsssobimmsiqblcaiempj", +"cnnlrrjbibfiiqrrascdiboobiqpejikkbbdcbemefegiiriqocolllddbdgrrgao`nodjjiegg`lsgkfmhhjibfpmfhfhkhhepeejekpdsddegdgkmkpbrsllodpppb", +"lllobiifmbfhfhbbbolsmpdgojgkssddddlcagfmmppcsdgjrdpbsl``dbggikkppollsppikibalormfmhhmibjihhhhhihhmpmiqgbsdadiikbjejgsqag`nlcbpbd", +"cl`obgfmfehhffiifgboriaalbdsodggiblcaiempjsssbdjkikibocdbjdjsgbqc`nncdiifiioosremmefeidobfhhhiihhhjmfiiekjrbrkjdmejooaoaanl`abgd", +"soogbriikikmmhhfiipskkbbiqbcogbkksllodpppbsoirgjjemjfggoasssbsbbsclnldbpkkrddadpeefmerglbfhhheqrhhmfhememjkcsoloiigaoaaigollcbsa", +"bsddgdeldsddikmmemkagqpmirbbgjdigg`nlcbpbgcobfpihmpbkicbdolollllbdol`cddddegpcdgeejmergobfhhhmrfhfmfemffmms`l`n`ffiaairbgc`nlcsd", +"iadscsolnclooggekmmgsrkeeiejgdcooaanl`griggdbkihhffjpfis`lc`lnllscllnllcssbbbcsqpkppprjadhhfhhhhhhmehhmmmkdllloakhffihgaaolnlldr", +"ikgdol`nnnnnnnllkkmkbbpppikgdcccoggollbrpikiprffhhiibhfb``lnnnnnscc`acll`cdbq`cbsdjbjbksbmmfhhhhhhimhfmmhhgoolagsjirijglnnnnn`pm", +"mmmegc`nnnnnnnnbpehiq`bbiimiqcnlddgcolapejemhfhhffhhmmmbo`lnlnnnsacgibllnnlcsoscsppqbjecgrhhhhhhhhhmhhmkhhfii`qidbrhmgl`nnnncimp", +"emkkscnnnnnnnnlapkkqc`cgbpkkq`locbodlcdrimpmmfhhffhhmmmro`nnnllnolllagalllnncoclddjggjkrllsjemfhhhemmmmmefmiacbjbspjkronnnnliisj", +"pkrlooolllnnnl`obkpjjlccjdbpjbbdgc```loojimmhhhhhefeikpsocnnnn`nllcosslgdocgbdloodssbkfirsclssemhfekejkpfmhgiirebdskpkgccllsibgi", +"cbqblll`nllccnlnspmpbclcbppkpkkpqgc``onlbmmmemehffbddddssjsclcaalsdbpbocbpkrrbooolcspemmiiaacbcbrjgmjjagghmiffbksscssppdlldrgsdc", +"ooblnnodsoadc```skeiidbcgjbprkkeejjdo`llpkmmmeemmegdgjedgaeikdgssggspkgsgkeeregg`lcgppmpmefigibooloiigqpmfhhhidacscccspsscrribdl", +"caconlllcliilcsckkmkpripqppppjpppikqbalcpkkepjdgbddgbmjbsdbbbrscdjsspkkbbpppikiballcbrdjiekkggriq``ffjbqmfrhfillcclcekpdspkkpjso", +"gggo`cclllelnllgeekjpeikrjkgglbbiimridacqsbccolbkpirbggddkijjqgqprdgperq`bbiifiio`llbibdjbjjjgrfiaakhfikmmifhaslsskffmepsriiejrr", +"sdoaoaclnnlnnndjmmpkkekpkjpbcllgbpkjrgddssdal`nocscdlllclrrkfgbiejqrbbkc`cgbpkkrddllcgdsggqpjrqibaasjirrkhiffaolcsmhhmfiqmkkikem", +"kggllodlnnnnnnspempppppijgdsdnlcdddsesdcdsrrgd`lllllsl`oogijeaaiefkkpbsrlocddddegbocsodsdirkprkaaaq`bkfkkhhhmejapmmhfemhmmagdamh", +"kqsa`a`llnl`nndjeii`bbiimiroclnllcssdccclsjbbacnnllscoerkprrigabhfekppsclnllcssbbbpscassdpkekpkid`a`cjemmhmhpkdbkkepmmhfmdolllpm", +"hfioo`olonl`lnlbpkc`cgbpkkrsclcclnllolllssagiqosnldsffhmffemfmrihmmerpsllacll`cdagdclascsjmerpmffo``ookeepmmeeeskbdeeffmkd`lldff", +"ihhba`ololn`nnlsppilocdddgejcdbbllnnlnnnaarggiadrrsskhrhmemmhhhhhfmempdldibllnnldccsloooqmkpjekffia`losagjemmigddciiifehhgo`laai", +"fhhgioqcgonnnnlssscnnllcssbbalco`llllnlcrfhfsgoifiiqihhfffmffhhhhhimmmdllbdallllcosoccoiqhkiiffmeiiaolspppppmfriiiiffffhmfga`o`g", +"fmhgaoqbbbcllnlsbsc`clnnnldddolln`l`obddejmfg`o`aiggrhhmefhhhhhhhhmmhmpsdsscbsocdcc`odrigiimfmhirpbdolcbdsdpmiiifiihhmhemea`nnni", +"fjfaiiqrimpcdbdjdgcoo`nnnnlcsllnllcoddpkssbbcll`caiemmhfibdjemfhhhjkeejpdppdsjjppdoccqiioobmfhhkpkqblolclsrepmffmmkmkmjmemdd`nai", +"rioogfrjffibrpdddsoc`lnnnnnnnlnl```iggggidqo`n`nnnogpmfhkdllssemhfjppbpscsjqjjpppbdldifddlbmhhhkrrrb`clnlpksjefkmpjdemebmkgfiiir", +"qqdoqfikiijbdjdsdgoo`nnnnlnnnlll`l`qqig`lc``nnnnnnn`cbpsbqodcbcbrjgijgdgsbkkjjbbbbaasreia`bfmhhmkeeeggllcibgipkksgefpmmmmfmmfmhq", +"ihgcrfmpeldsdbbcqqbqbnnnlll`cssddddggool`l`lnnnnnnnnlloddiiqaiboolopdcsscsrjmkjgda`gbjefkadhhmhmmiikqsocdsssccqibdisbpkekpkkjjmj", +"errbbpbballcoagdiibkpcllolssccbgifficnnnnnnnnnnnnnnnlloadjrjdgriq``iidl`sdsdkrggqd`a`spiebbmmmffkmifrjsbsbsoncdqddjslscsssbpbdki", +"sjkbodd`anlcbprsimikrb`oosbdcsbrmfhfg```nnnnnnnnnnnnnlcbddjpigrfiaakfrddgboomeriffo``dgmfogihmmmibppkbddolll`bdbdsbdslllccssolls", +"lsjjgiiaolldqhkrejiegiiqaggolcspshheifqfqb`nnnnnnnn`nldbbjpbiiqibaasprgdgqaokfiiffiaocqkerllsjkmrjsbpjdda`lcgbgbgspibsllccdegcnn", +"logpiiisolncjehkihmbspidqgdgoocbkmhhhhpmmgannnnnnnl`coacbkmkrriaaaq`brergbaasjrmimiqaagkmiqcclssppppbdcsdscsbrrrdspjbddcskfmjsnn", +"cgrjgiaaollbbpmfhhffrihiegggoc`depehhhmffgg`nnnnn`aagga`sjrkrrkid`a`creradogobieiiqbgabqmifiaacbsbbdsbdspejpmhkpgsqccccbsmhmkpcl", +"bpkrgdoaaolbiprhfhhiirhhekkkba`cbkiiipijjjgonnnnn`daaoollsjkkpfhfo``o`kkqd`a`srkkrbbcbapmehhfiigsodsdpdspjqkhfkkiicccggemmhmjjds", +"ddekjgiqfiarmhhhhffhhfmhebjgbododpkeldsssgbgbqogadgegab`nldjdemhfia`l`skifo``odkrgqgolajrjefmeggpiqadpgsgdkkhhhbiqblcbgkkepmekds", +"skeffffpffmmkmhhhffhhmmfeddjd`o`cbbbllllclbpeeegireekkkb`cabgjfmmiiaaossifiaocoprpbboldgieekmkigrfigakfisbdemmkpbrsllospbsjkmksc", +"rfiihhhmhhkfkmhhhhefeikpddrifo``o`bgclnllnljkfmfjrfedggigdobbqjiipbgo`lbjkiraadbrfoo``lggjemkpiiqiqiisjqbsgrejgsqag`nlcbsriifrqd", +"pmmmiikikmmmmkeehffbddsdoodifib`llcbsbccolocgmhhfpedddgbdlcaigkkrbbca`asbppbboosrfibol`cqsmhhmrriagaiobrdockejooaoaanl`gjriffgrp" +}; Index: external/mit/ctwm/dist/xpm/background9.xpm =================================================================== RCS file: external/mit/ctwm/dist/xpm/background9.xpm diff -N external/mit/ctwm/dist/xpm/background9.xpm --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/xpm/background9.xpm 3 Sep 2015 12:20:01 -0000 @@ -0,0 +1,155 @@ +/* XPM */ +static char *background9_xpm[] = { +/* width height ncolors chars_per_pixel */ +"128 128 20 1", +/* colors */ +"` c #35354E", +"a c #DADADF", +"b c #9090A0", +"c c #00000F", +"d c #0F0F2E", +"e c #242442", +"f c #A4A4B2", +"g c #7D7D8F", +"h c #080829", +"i c #4A4A63", +"j c #080818", +"k c #6E6E7F", +"l c #55556D", +"m c #101029", +"n c #080821", +"o c #616174", +"p c #40405A", +"q c #2B2B4C", +"r c #191937", +"s c #6B6B84", +/* pixels */ +"fffoiobfbsllossgbbbfffffffffbbbbgggskkkoolollipp`i`qeerq`mmhhhnnnhhnjjjnnjjnhnjjnnnnnhdhnhdpphnnnhhhhmdddrekbblddddeedhhhhhhhhhl", +"ffoer`kgkllokkggbbbfffffffbbbbbgggsksoolllliipp`lpqeer`iqmhhhnnnhhnnnnnjnnnhhnjjnnnnnnnjnh`ehnnnhhhhmdddrr`ffb`ddd`l`rhhhhhhhh`f", +"afpreqlsolokksggbbbffffffbbbbbgggskskolllllippplp`eerrpprhhhhnnnhnnhmmnjjnnnnjjjjnnnnjjjhe`hnnnhhhhmdddrrrlffordddil`mhhhhhhhhba", +"afpeq`ikolossggbbbffffffbbbbbgggsskkoollllippp```qerreqedmhhnnnnhhhhnhhnjjnnjnnjjjjjjjjhe`dnnnnhhhmdddrrrrgabedddrlimhhhhhhhh`aa", +"abpq`plgkossggbbbbfffffbbbbbgggskskoolllliipp```qeerermddrmnnnhnnhmnjhdnccjjnnnjjjjccjh`l`hnnnhhhmdddrrrr`bfodddde`dhhhhhhhhrfaa", +"agq`pplbskkgggbbbbbbbbbbbbggggkkskolllllippp```qeee`edmdeemnnnnnnnnnnmdjccjnnnjjnnnjjn`oldnnhhhhmmddrrrrelbb`dddddmmhhhhhhh`faaa", +"fl``pikbkssggfbbbbbbbbbbbggggkkskoolllliipp````ee`p`dmme`dnnnnjjjjjnmdhjcjhmhjcnmdhhheliehnhhhhmmddrrreeelsordddddmmmmmhhdoaaaaa", +"l``pilboskggaabbbbbbbbbbggggkskooolllliippp```qe`l`rmhdqennnnjjjnnnhhhnccnrmnjjheqrdrpidnnhhhhhmddrrreeee`iprddddmmmmhmmpbaaaaaf", +"``pillsssggfaabbbbbbbbgggggkkkkoollllliipp```qee`qrmhhdrhnnnjjjnnhhhnjjjjmqnjjmq``eeq`rnnhedhhmddrrreeeeee`prddddmmmmelbfaaaaaag", +"`pillokkggbaabbbbbbbbgggggkkskolllllliipp```qeerrdmhhhhhnnnjnnhhmhnjjcjjnmmnjn`i`````rhnnhqmhmddrreeeeeeeeileddddmmrobfaaaaaaafp", +"pillokssggaaabbbbbbbgggggkkskoollllliipp```qeerddmmhhhnnnnnnnhdrmnccccjnnnnjnmii````emhhhddhmddrreeeeeeee`ssedddddibaaaaaaaaafl`", +"illokskggbaabbbbbbgggggkkskkolllllliipp````eerrdmmhhhnnnnnhhmrdhnjccccjjjjjnhr``qpll`mhhhmhmmddreeeeeeeeelbordddpgfaaaaaaaaaag`p", +"llooskggggfbbbbbbgggggkkskkoollllliiipp```qeerddmhhhhnnnnhhdddhjccccjjjcccjnmreq`lol`dhhhhhmddrreeeeeeee`gb`rdesfaaaaaaaaaaag`pi", +"llokskggggggbgggggggskskkoolllllliippp```qeeqedmhhhhnnnnnnhmhnjccccjjjccccjnhdepogskirhhhhmddrreeeeeeeeesfgerdkfaaaaaaaaaafo`pil", +"loksksgggggggggggggskskkooollllliiipp```qeee``mhhhhnnnnjjjnnnjccccjjjjccccjnhrigbbkl`mhhhmddrreeeqqqqeeeggirr`bfffbbffaaabp`pill", +"kfbkggggggggggggggkkskooolllllliiipp```qeerpiqmhhhnnnnjjjjjjjccccjjnnjccjjjndigfffk`mhhmeddrreeeqqqqqeeigprrrigfbggbfaaas``pilll", +"ffgggggggggggggggkkskkoollllllliippp```eereoirhhhnnnnjjjjjccccccjnnhnnjjnnhdigfafg`hhhhd`drreeqq````qeeolrrrelkskosfaaak``pilllg", +"fksgggggggggggskkkskooolllllliiippp```qeerigihhhnnnnjjjjjcccccccjhhnjjnhmr`lbfafblmnhhhdddreeq``````qe`perrrpooologfaaf``ppillof", +"skgggggggggggskkkskoolllllliiiippp```qeerdog`hhhnnnnjjjjjccccccjnhhjcnepiogffafbimnhhhmddreeq```````qqeeeer`okkllogfafl`ppillokg", +"ksggggggggggsksskkoolllllliiiippp```qeerdegkdhhnnnnjjjjjjccccccnhnjcjrgbbffaafgimnhhhmddreeeq``````qqeeeerigbbkiplkffg`ppillooks", +"sggggggggggkkskkkoolllllliiiippp```qeerrdpsihhnnnnjjnnnjjcccccjhhjcjebaafffafgpmnnhhmmdreeq`````````qqeeeigfbslqe`lbg`ppillookkk", +"sggggggggkksskooolllllliiiipppp````eerrddiirhnnnnjnnnnjjjccccjnnncchgaaafffbkphnnhhhmddreeq`````````qqqepkbbkpeeeqiklppilllokkkk", +"sggggggskkskkoolllllllliiipppp````qeerdddqrhnnnnnnnnjjjjjjcjnnnjcjnlfaaafslpehnnhhhmddreeqlsi````````qq`lolpeeeq``poppilllookskk", +"ssgggskkskkoollllllllliiipppp````eeerddmhdmmhnnnjjjjjjjnnnjnhnjccnqfaaafbspdnnnhhhmddreeqibbp```````qqq```eeeeqq``ilpilllookskkk", +"gggsskksskooolllllllliiipppp````qeerddmhhhhdmnnjjjjjjjjnnnnhhjccndofaaffgo`hnnnhhmddreeqlffs`````````qqeeeeeqq````ipilllooksksgg", +"skkkksskkoollllllliiiiipppp````qeerddmhhhhnhnnjjjjjjjjjnhmhnjcjndigfaaffgimnnnhhhmdrreq`gaf````````````qqqqq`````ppilllloksgksss", +"kkkkskkkoolllllllliiiipppp````qeerrddmhhhnnnnnnnnnnnnjjnhdhjccheiokbffffkennnhhhmdrree``bfs`````````````````````ppilllloogbskkkk", +"kksskkooollllliiiiiiipppp`````eerrdemhhhnnhhhhhhhnnjjccnrmncjn`kkolkbffblhnnhhhmddreeq`lffi```````````````````ppiillllokfffkkkkk", +"ksskkoolllllliiiiiippppp`````eerrderhhhnnhr``rhhnjjcccjhqhjjmpkslpplgffg`nnnhhmmdreeq``lbsppppp`````````````pppiillllgbfffkkkkkk", +"skkooollllliiiiiippppp````l`qeerddehhhhnhepl`rhjjcjjjjnrpnjnlgkiedeisfbornnhhhmdrreq```ogpppppppp`````````ppppiilllgfaffbskkkkks", +"kkooollllliiipppppppp````k`qeerddmhhhhnmepp`dhjcccjnnnheqhnegbirhhrigfblrnhhhmdrreq````iopppppppppp```p`ppppiiillgfffbgksskkkssk", +"ooolllllliiiipppppppp```oiqeerddmhhhhnhq``rmhnjcccnjjh`mnnmlbk`mhhdpkfbo`dhhmddreq````ppppppppppp```lppppppiiilloffgokkksskssssk", +"oollllllliiiipppppp````ipqeerrdmmhhhnnmrdhnnnjjcjjjjjhphjhlbgo`eerqlgfbgiqdmddreq```ppppppppppppppikipppppiilllllookkssssskssskk", +"olllllliipppppppp``````iqeerdddmhhhnnhmhnjnnnjjjjccccnddroffbgsllllkbffblmhmdree```pppppipppppppppgopppppiiilllllookksssssskkkko", +"llllliiiippppp`lp``````qeerrddmhhhhnnhhjjjnhhnjjjcccjnmofaaafffbgggbffboehmdrre```ppppiiiiiiippppolpppiiiillllllookkkkskkkkkkooo", +"lllliiipppppplgk`````qqeerrddmhhhnnnnnjjjjne`nccjjjndpgaaaaaaaffbgbffflhhmddreq```pppiiiiiiiiiipiiipiiiillllllloookkkkkkkkkooool", +"llliiippppppoffl`````qeerrddmhhhhnnnnjjjjnmiinccnhdpgaaaaaaaafbsookbbkrhhmr`ee```pppiiiigkiiiiiiiiiiillllllllloookkkkkkkkkooooll", +"liiiippppp`oaaf````qq`errddmhhhhnnnnjjjjjhplenjn`kbaaaaaaaaafbop`iloidhhmdreeq``pppiiiigfsllliiillllllllllllloooookkkkkoooolllll", +"iippppp`p`pfaal```q`eeerddmmhhhnnnnnjjjjjml`hheofaaaaaafffffs`dhmr`emhhmdrreq``pppiilllfflllllllllllllllllllooooookkkoooolllllll", +"ppppp`````faag```q`l`rrddmmhhhhnnhnjjjjjjm`rm`faaaaaafbbbbgidnjjnnnhhhhdrree``ppiiiillfabllllllllllllllllloookooookoooolllllllii", +"ppppp````kaaa```q```erddmmhhhhnhhnjjjjjjnhmdpfaaaaafglilllqhnjjnnnnhme`eree``ppiilllllfflllllllllllllllloooookkkkkkoooolllllliip", +"ppp``````faao`qqei`rrddmmhhhhnmrhnjjjjjcjnhpbaaaaabl`rddmhnjjjjnnnhme``eee```piilllllsfglllllllllllllllloooooooooogoolllllliiiip", +"p```````safo`qqeeerrdd`lpdhhhmdhnjjjjjcccn`faaaaflehhhhnnjjjjjhr`ppp``qreq``ppillllllsglllllllllllllllooooooooooooglllllliiiiipp", +"```````lbfgqqeeeerrddlbgehhnhmhnjjjjjcccnegaaaabphnjjjjjjjjjnrisklp`eq`````ppiillllllollllllllllllooooooooooooooollllllliiiippp`", +"```````kgk`qeeeerrddsfg`hhnnnnnjjjjjjjnhpbaaaagqhjjjjjjjjnnd`kgglqdmdqpi``ppiillllllooooooooooooooooooooooooooooolllllliipppppp`", +"``````iol`eeeeerrddpkihhhnnnnnnjjjjjnhrofaaaakmjjcccjjnnnnm`ogkpdhmdrpl```ppillllllooooooooooooooooooooooooooollllllliiippp`````", +"``````ii`eeeerrrddd`rhhhhnnnnnjjjjnnmeofaaaflhjcccccnhhmhmrplprhhhdd`lp``piillllooooookkkkkkkkkoookoooooooooollllllliiippp``````", +"`q`qqpp`eeeerrrddmmhhhhnnnnnnjjjnnnheigfafsenjcccccjhddddre`qmhhhmd`l```piilllloooookkkkkkkkkkkokkkkkkkooooollllloliipip````````", +"`q`qq`qeeeerrrdddmhhhhhnnnnnjjjnnnhd`lkbgphjccjcccjndeddmddmhhhhmdrip``pilllllookkkkkkkkkfbkkkkkkkkkkkkkoooollllkbklppp`````````", +"qqqeeeeeeerrrddmmhhhhhnnnnnjjjnnnnhrlggldnnjccccccjndeedhhhnnhhhddqe``ppilllooookkkkssssfabkkkkkkkkkkkoooollllllffgoip`````````q", +"qeeeeeeeerrrdddmmhhhhnnnnnnjjjnnnnh`kfgenjnnjcccccjnd``dhnnnhhhmdreq``pillloookksssskkgffbssssskkkkssoooollllllsaaglp``````````q", +"eeeeeeerrrdddmmhhhhhnnnnnnjjjjjjjjmoffshccjnnjccccjh`lidnnnhhhmdreq``plilllokkkskkkkkgffbkksssskkkkbgooolllllllaaagoi````qqqqqqq", +"eeeeeerrrdddmmhhhhhnnnnnnjjjjjjjjn`fafinjjnnnnjccjnelkphnnhhhmdree``plllllokkskkffgkkkkkkkkkksssskkfgoollllllifaafop`````qqqqqqe", +"eeeerrrrdddmmhhhmhnnnnnnjjjjjjjcjdgaafenjnnnjjjccjmlgsennnhhhmdreq`ppollookkskkfafgsssskkkkkksskkkffkolllllilfaaag````qeeeeeeeee", +"errrrrrdddmmhhhhmnnnnnnjjjjjjjjchkaaakmnnhhnjjjjjneskihnnhhhmdreq`ppillloksskkgffgggggggskkkksskkgffollllliigfffbi```qqeeeeeeeee", +"errrerdddmmhhhhhnnnnnnjjjjjjjjcj`faaaihjnnhhhnnjnmpoimnnhhhmddee`ppilllokskksgfafgggggggskkkksskkfabllllliipobbbl`qeeeeeeeeeeeee", +"rrre`dddmmhhhhhnnnnhhnjjjjjjjjjmbaaabrnjjnnr`rhnnmqqmnnnhhmddre``pillookskksggfaggggggggskkkksskgffollllliipp`ii`qqeqii`eeeeeeee", +"rrrpqddmmhhhhhnnnnhhnjjjjjjjjcnlaaaalnjcjndil`hnnhhhnnnhhhmdre``pilllokskkggggafggggggggskkksskkkbglllliipp````qqee`lieeeeeeeeer", +"rd`pddmmhhhhhnnnnhhnnjjjjjjjjjdfaaafdjccjhpsoqnjjjnnnnhhhmdree`pilllokkkggggggfggggggggggkkkskkookollliipp`````qeee`eeeeereeeerr", +"ddpemmmhhhhhnnnnnhnjjjjjjjjjcnoaaaaoncccnrlbkqnjjjnnnnhhmmdre``pillokskggggggggggggggggggkkgskkookklliipp`````qeeeeeeeerrrrrrrrr", +"ddemmhhhhhhnnnnnnnnjjjjjjjjjjrfaaafejcjjh`kbornjnnnnnhhhmdre``pillokskggggggbbbbbggggggggkbbkkoolbblliipp````qeeeeerrrrrrrrpprrd", +"dmmmhhhhhhhnnnnnnnjjjjjjjjjcnoaaaalnccjjhpgfomjjnnnnhhhmdreq`pilloksksggggbbbbbbbgggggggsffbkooloffiipo````qeeeerrrrrrrrrr``rddd", +"mmmhhhhhhhhnnnhnnjjjjjjjjjjn`faaaghjjcjjhlbflhjnnnnhhhmdreqi`pllooskggggbbbbbbbbbbgggggssafkoollbfsippl```qeeeqrrrrrrrrrrrrddddd", +"mhhhhhhhdrmhhhnnjjjjjjjjnnnqbaaaaqjcjccjhkffinnnnnnhhhddr`l`pillkskggggbbbbbbbbbbggggggkfafkollgfsipp````eeeeperrrrrrrrddddddddd", +"mhhhhhhmeedmhnnnjjjjjjnnhhegaaaaknccjcjjrbffejnnnnhhhmdr`l`pllokksggggbbbbbbbbbbbgggggggafkoollbgippp```qeee`prrrrrrrddddddddddm", +"hhhhhhmq`ehnnnnjjnnnnhdreeifaaaghjccjcjn`ffgmnnnnhhhmdre``pillossgggbbbbbbbbbbbbbggggskffboolllkipp````qeeeei`rddddddddddddddmmm", +"hhhhhhr`ednnnnnhmmhhde```eifaafejcjcjjjhlfflhnnnhhhmdreq`pilloskgggbbbbbbbbbbbbbbggggkkbgoollllipp````qeeeepprrddddddddddddmmmmh", +"hhhhhhmhhhhnnndq`errrrrddeifaasnccccjjjdsfb`nnnnhhhmdre`pillokkgggbbbbbbbbbbbbbbggggskskolllllipp````qeeer`leddddddddddddmmmmhhh", +"hhhhhhhnnnhmdeeermhhhnnnhribfgenccjjjjn`gfgdnnnhhhmdre``pllokkggbbbbbbbbbbbbbbbbggggkskkolllolipp```qeeee`lirddddddddddmmmmhhhhh", +"hhnhhhhnnnnnhhhnnjjjjjjnhelggldjjjjjjjhigflnnnnhhmdree`pilloskggbbbbbbffffbbbbbggggkkkoolllgglp````eeeerpkkidddddddmmmmmmmhhhhhh", +"hnnnnhdmhnnnjjjjjjjjjjnhrplsopmjjjjnnnmpkkqnnnhhhmrre`pillossggbbbbfffffffbbbbbggggkskollkbbkpp``qqeee`osbgpdddddmmmmmmmhhrqhhhh", +"nnnnnnhhhhnjjjjjjjjjnnnmpllkl`hnjnhhnhhep`hnnhhhmdee`pilloskggbbbbfffffffbbbbbggggkskoolkfffi```qeeerlgfffbrdddmmmmmmmhhhmpdhhhh", +"nnnnnnhrqrhnnnnnnhhhhhdpksllidnnnhhnnnnmrrhnhhhmdre``illossggbbbfffffffffbbbbbgggskskolgfafgp```qeepkbfaafoddddmmmmmmhhhhrehhhmh", +"nnnnnh`ggldnnnnnhhhnndlbbgll`hjnhnjjjjjnhmhnhhmdreq`pilokkggbbbfffffffffbbbbbggggkskolkfffbp```e`kbfffaaaodmmrdmmmhhhhhhhhhhhnhh", +"hhmhdlbfbihnnnnnnjjjn`ffbspqdnjjnjjjjjnhderhhhmdeq`pilokkggbbbffffffffffbbbbbgggkskookgfbgi```qkbfffffffgmmmp`mmhhhhhhhhhhhhhnnn", +"de`poffgehnjjjjjjjjnhgaablehnjjjjjjjjjnmpoiehmdre`pillkkggbbbbffffffffffbbbbgggkkkoolgkgs`````faaaaffffkqmmekehhhhhhhhhhhhhnnnnn", +"`llgbfgdnnjjjjjjjjndifafoehjjjjjjjnnjndlgboqmdre``pllosggbbbffffffffffffbbbggggkskolllilp```lfaaaafbbfgemmeolhhhhhhhhhhhhnnnnnnh", +"lskffg`nnjjjjjjnnhepsffbrnjjjjjjjjjjnmsffflmmdre`pilokkgbbbffffffffffffbbbbgggkskolllipp```laaaaafggbglmmmok`hhhhhhhhhhnnnnnnnnr", +"oggbkennnnnjjjhde`plobbinjjjjjjjnjjnhofafsrmdre`pilokkggbbfffffffffffffbbbgggkskollliip```pfaaaabolkspmmmeslhhhhhhhhhhnnnnnnnnmp", +"ogggpnnnnjjjjnmrdmm`lkimjjjjjjjjjjnegaaakmmdre`pilokkggbbfffffffffffffbbbgggskkoolliip```qoaaafgp``i`mmhhloehhhhhhhhnnnnnnnnnnri", +"sgkldnnnnnjjjhdmnjnh`pehnnhnjjnjnmlfaafkmmdre`pilossggbbfffffffffffffbbbbgggkskolllipp``qeofffidddddmmhhqlehhhhhhhnnnnnnnnnnnh`l", +"bbkphnnnnnjjnmdhnjnheedreedhnhrqlbaaaaohhmdeq`plokkggbbffffffffffffffbbbgggkskolliipp``qeeofg`dddmmmmhhhqehhhhhhnnnnnnnnnnhrpokb", +"fboehnnnnnnnhdmhnnnhrreil`dhmekfaaaaflhhmdre`pllosggbbffffffffffffffbbbgggkskolllskl```eeelk`ddmmmmhhhepehhhhhhnnnnnme`ee`obffff", +"fkpdhnhhhhnhddmddhnhmeplledd`sfaaafkrhhmdre`pilosggbbffffffffffffffbbbbggkskollgfafi``qeeplpdddmmmhhhellemhhmmhhhhelkggkgfaaaaaf", +"spdnnnhhhhnhhmme`dnnhr`qdhhmpsbbkirnhhmdre`piloksgbbfffffffffffffffbbbgggkkoolbaaag``qeell`dddmmmhhhelllp````edmrigffbggfaaaaffb", +"ehnnnnnnnhhnnnhhhhhnnhhnnjjhei`dnnnhhhmril`pllokgbbbffffffffffffffbbbggggkollofafl``qeiggldddmmhhhhh`loollllperelgfbkllkfffgolp`", +"nnnnnnnnnnhnnnnnnnhhnjjjjjjnhhnnnnhhhmpkolpilosggbbfffffffffffffffbbbggksoollilop``q`gffk`ddmmhhhhhheilolliedhhd`liemhd`llqdhhhh", +"nnnnnnnnnhnnnnnnnhhhjjjjjjjnnnnnnhhhmigbopilosggbbfffffffffffffffbbbggsskolllipp``qebaaakddmmhhhhhhdpoksl`dnnnnnnnnnnnnmrdhnnnnn", +"nnnnnnnnhhnnnnnhrrhnjjjjjjnnnnnnhhhmelklpilosggbbfffffffffffffffbbbgggkkollliip``qqfaaab`dmmhhhhhhd`lklpdhnnnnnnnnnnnnnnhnnnnnnn", +"nnnnnnnnhnnnnjh`penjjjjjjnhnnnnnhhhmqlp`ilokkgbbfffffffffffffffbbbgggksoolliip```efaaafidmmhhhhhhelkklennnnnnnnnnnnjnnnnnnnnnhnn", +"nnnnnnnnhnnnnh`opmjjjjnhmdhnnnhhhhmdre`pllkkggbbfffffffffffffffbbbggkskolllipp``qfaaaflmmmhhhhhhrlsglrnnnnnnnnnnnnnjnhnnnnhdddhn", +"nnnnnnnnnnnnneog`njjjhrqrhnnnherhmdre`pilokggbbfffffffffffffffbbbggkskolliipp``qgaaaf`dmmhhhhhheiggkrnnnnnnnnnnjjjnmeedhnmpso`hn", +"nnnnnnnnnnnnmlgsrjjjm``ehnnnm`pemdre`pilosggbbfffffffffffffffbbbggskkolllipp```lfaaapdmmmhhhhdeplslrnnnnnnnnnjjjndpskop`psbfg`hn", +"nnnnnnnnnnnh`bflhjjh``hnnnnhqllqddeq`pllkkgbbfffffffffffffffbbbggskkolllipp```esaaaldmmhderrre`pipdnnnnnnnnjjjjh`kffffgbfffbimnn", +"nnnnnnhhhnhekfbennr`ehnnnnndpliedrq`pllkkgbbffffffffffffffffbbgggksoollipp```qekaabdmmmeq`errreerhnnnnnnnjjjnheobaaaffbfffg`hnnn", +"nnnnnnmdhhroffkhjdgkrnnnnnhrplprre`pllkkggbbfffffffffffffffbbbggkskolllpp```qeegff`mmm`l`edmhmmmhnnnnhdmnjjjnrlfaaaaafgklehnnnnn", +"nnnnnherdd`bfg`hhofshnhhhhhdplpee`pllkkgbbffffffffffffffffbbbggskkolllipp``qeeegfldmd`ipehhhhhhnnnnndpiehjjnh`sfaaaabl`dhnnnnnnn", +"nnnhd``er`lbbrnhoaainnddhhhrilp``pilosggbbfffffffffffffffbbbgggkkollllip``qeer`bbrmm`liehhhnhhhnnnhelopehjjjmibaaaflhnnnnnnnnnnn", +"nnnrppqdd`loinn`aabdnn`rhhm`lslp`iloksgbbffffffffffffffffbbgggkkolllilp``qeeer`slmmhpirhhnnhhmhnnnelkpdddnjjrsfaaflhnnnnnnhnnnnn", +"nnhe`emhme`edh`faalhnh`dhhdisgkppllkkgbbffffffffffffffffbbgggkkoollill```qeerreemmh`lphhhnhredhnnmlgorhmenjnoaaafennnnnnnnnnnhhn", +"nnnhhhhnhhdhhlfaakdhhdemhh`kbfspllkkgbbffffffffffffffffbbbggsskollllllp`qeerrddmmhikldhhnnrp`mnnn`koehhmennefaaf`nnn``hnnnnnhhhh", +"hnnnnnnnnnhhrkffkdnnhrrmhdlbffkilosggbbfffffffffffffffbbbggskkolliiolllpeerrdddmh`ss`hnnndilennnhobphhddhnhgaaapnnnrlrnnnnhhhhhh", +"hhnnnnnnnnnh`lllrnnnhrerepgaaaoloksgbbfffffffffffffffbbbgggkkolllilllooperrdddmm`lophnnnmpl`hnjneggdjhpdnhpfaaknnnri`nnnnhmhhhhh", +"hnnnnnnnnnnnhdeehnnnhqp`pgaaaallksgbbfffffffffffffffbbbgggkkolllipiiiskeerddmmmd`p`hnnnh`lidnjjhlbohjhimnmbaaghjnnhdhnnherhhhhhh", +"hnnnnnnnhnnnnndrhnnnrlksgfaaaflksgbbffffffffffffffffbbbggkskolllip```olerdei`rmmdrmnnnhellenjjjdosqnjn`hn`fabdnnnnnnnm`l`mhhhhhh", +"hnnnnnnhhnnnnhdrhnnhlgbfaaaaalokgbbbffffaffffffffffbbbggkskolllip```qqerrrkkqhhhhhhnnheoklmjjjn`kphjjjhhmofflnnnnnhhd``dhhhhhmhh", +"hnnnnnhdhnnnneqrnnhdbfaaaaaagoksgbbffffaffffffffffbbbggskkolllipp``qeerriggihhhhdeerepkbk`hjjjh`lrnjjjhdpkgs`hnnnhr`p`mhhhhhmhhh", +"hnnnnnnnnnnndp`hnhhlfaaaaaablkkgbbffffaafffffffffbbbggkskolllipp```eerribfkehhhekggggfffsrnjnhr``hnnhme`lggkpmnnnmerhhhhhhhhhhhh", +"hnnnnnnnnnd``iqnhhifaaaaaaalkkgbbffffaaaffffffffbbfbgskkoolllip```qeerpgfbldhhpbaaaaaafbphnjhdq`rmmeloologgglrhnnhhhhhhhhhhhhhhh", +"hnnnnnhmd`lkopdnhhsaaaaaaagosggbbffffaaffffffffbbffgsskoolliipp``qeerigffblq`ofaaaaaaafihjjnmeqer`lgbgolsbfodnnnnhhhhhhhhhhhhhhh", +"hnnnnhepilllidhhhegaaaaaaboksgbbffffaaffffffffbfffggkkkolllipp```e`plgfafbkobaaaaaaafkphjjjndeee`kbfgpe`obgqnnnnhhhhrqhhhhhhhhhh", +"nnnnnr`p``qrhnhhhpbaaaaaaossgbbfffffaafffffffbbfbggkskolllipp``qe`plgfaafbgfaaaaabl`rhnjjjjnhdepobbkenndiirhnnnnhhhh`ehhhhhhhhhh", +"nnnnmrdhnnnnnhhhdlfaaaaabsggbbfffffaaffffffffbbgggskkoolliipp``e``ilgfffbggfaaaaomnjjjjjjjjnhr`kbgphnjjnrhnnhhhhhhhrehhhhhhhhhhh", +"nnnhhhnnnnnnhhhhrgaaaaaabkgbbffffffafffffffbbbgggskkoollipp```qe``lkgfbgklsbfgiemnnjjjjjjjnnm`off`jjnjjjhhhrehhhhhhrhhmhhhhhhhhh", +"nhdmnnnnnnnhhhhmpfaaaaaabggbbfffffaafffffffbbbggskkoolllipp```ee``iokslp`q`pqhnnnhhhnhhjjnmr`obfbnjjdnjnnm`pehhhhhhhmmmhhhhmhhhh", +"hrrhnnnnnnhhhhm`faaaaaaafgbbffffffafffffffbbbggskkoolllip``p```pillli`edhhnnnnnnhhhnnnnjjhe`lbfbpnjnmnnnnherhhhhhhmmmmmhhhmhhhhn", +"dehnnnnnhhhhhmrbaaaaaaafgbbffffffaaffffffbbbggskskolllipp`````pppp`edhhhhnnnnnhrdhnnnjjjnm`lsffphnhhhjnnnnhhhhhhhmmmmmmhhhhhhhhn", +"rmnnnnnnhhhhmefaaaaaaafggbbfffffaaffffffbbbggskkkollliipp```pp`eddmhhhhhnnnnnhrehnjjjccjhqisgbkmjnhhnnnnnnhhhhhhmmmmmmmhhhhhhhhm", +"hnnnnnhhhhhmdfaaaaaaafggbbfffaaaaffffffbbbgggkskollllipp```eerrddmhhhhhnnnnnd`ehnjjjjccjdplgkk`njjhhnnnnnhhhmmmmmmdmmmmhhhhhhhdd", +"nnnnnnhhhhmrbaaaaaaafsgbbbffaaaafffffbbbbggskskoolliipp```qerrddmhhhhhnnnnheilrnjjcccccndiogkimjjnhhnnnnhhdermmmmddmmmmhhhhhmeem", +"nnnnhhhhhmefaaaaaaagggbbbffaaaafffffbbbbgggkskoollliipp``qeerddmmhhhhnnnnme``rhjjcccccjnrlsgkenjnhdhnnnnhripdmmdddddmmmhhhhdrrhn", +"nnhhhhmhmifaaaaaafkkggbbffaaaffffffbbbbggskskoollliipp``qeerrdmmhhhhnnnnhdrehjjjccjcccjn`sgbohjjheehnnnhmiiemmddddddmmmhhhdedhhn", +"hhhhr`qpkaaaaaaabkkggbbbfffffffffffbbbgggkkkkollliipp```eerrddddhhhnnnnnnhhnjjjcjjjjjcjhibbg`njn`pdnnnhh`prmddrdddddmmmhhhmhhhhh", +"hhh`sgsfaaaaaaagosggbbbffffffffffbbbbgggkskoollliipp```qeerddmhhhhnnnnhnnnjjjjjnhnjjjcjmofb`njneoennnhhmpmmmd`eddddmmmhhhhhhhhhh", +"hdkffffaaaaaafoosggbbbffffffffffbbbbgggkkkkollllipp```qeerrdmmhhhhnnnhnnjjjjjnmedhjjjjnegfkhjn`klhnnhhhdrmddloqddddmmmhhhhhhhhhh", +"ebaaaaaaaaaafllkkggbbbfffffffffbbbbgggkskoolllliipp``qeerrdmmhhhhnnnhhnjjjjjjhedhnnjcjhlbsrnn`gomnnhhhmmmdddkk`qrddmmmhhhhhhhhhh", +"baaaffaaaafkllosggbbbffffffffbbbbbgggkkkkolllliipp```eerrddmhhhhnnnhhnjjjjjjhddnjnhjcjmlkenhpgsdnnhhhhdmdddpokiedddmmmhhhhhhhhhq", +"faafgbfaffkllosggbbbfffffffffbbbbgggskkoollkliipp```qeeredmhhhhnnhhnnjjjjjcnhmnjjnhjjne`ehnekldnnnhhhmmdddrlkblddddmdmhhhhhhhhhp" +}; Index: external/mit/ctwm/dist/xpm/ball1.xpm =================================================================== RCS file: external/mit/ctwm/dist/xpm/ball1.xpm diff -N external/mit/ctwm/dist/xpm/ball1.xpm --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/xpm/ball1.xpm 3 Sep 2015 12:20:01 -0000 @@ -0,0 +1,71 @@ +/* XPM */ +static char * b1_xpm[] = { +"64 64 4 1", +" s None c None", +". c gray70", +"X c gray100", +"o c gray50", +" ....... ", +" ............. ", +" ............... ", +" ................... ", +" ..................... ", +" .....XXX............. ", +" .....XXXXX............. ", +" .....XXXXXXX............o ", +" ....XXXXXXXXX...........o ", +" ....XXXXXXXXX...........o ", +" .....XXXXXXXXX...........oo ", +" ......XXXXXXX............oo ", +" .......XXXXX.............oo ", +" ........XXX.............ooo ", +" ........................ooo ", +" ........................ooo ", +" ........................ooo ", +" ......................ooo ", +" ......................ooo ", +" .....................oooo ", +" ...................oooo ", +" .................oooo ", +" ................ooooo ", +" .............oooooo ", +" .......oooooooo ", +" ooooooooooooo ", +" ooooooo ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" "}; Index: external/mit/ctwm/dist/xpm/ball10.xpm =================================================================== RCS file: external/mit/ctwm/dist/xpm/ball10.xpm diff -N external/mit/ctwm/dist/xpm/ball10.xpm --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/xpm/ball10.xpm 3 Sep 2015 12:20:01 -0000 @@ -0,0 +1,71 @@ +/* XPM */ +static char * bb_xpm[] = { +"64 64 4 1", +" s None c None", +". c gray70", +"X c gray100", +"o c gray50", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ....... ", +" ............. ", +" ............... ", +" ................... ", +" ..................... ", +" .....XXX............. ", +" .....XXXXX............. ", +" .....XXXXXXX............o ", +" ....XXXXXXXXX...........o ", +" ....XXXXXXXXX...........o ", +" .....XXXXXXXXX...........oo ", +" ......XXXXXXX............oo ", +" .......XXXXX.............oo ", +" ........XXX.............ooo ", +" ........................ooo ", +" ........................ooo ", +" ........................ooo ", +" ......................ooo ", +" ......................ooo ", +" .....................oooo ", +" ...................oooo ", +" .................oooo ", +" ................ooooo ", +" .............oooooo ", +" .......oooooooo ", +" ooooooooooooo ", +" ooooooo ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" "}; Index: external/mit/ctwm/dist/xpm/ball11.xpm =================================================================== RCS file: external/mit/ctwm/dist/xpm/ball11.xpm diff -N external/mit/ctwm/dist/xpm/ball11.xpm --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/xpm/ball11.xpm 3 Sep 2015 12:20:01 -0000 @@ -0,0 +1,71 @@ +/* XPM */ +static char * b6_xpm[] = { +"64 64 4 1", +" s None c None", +". c gray70", +"X c gray100", +"o c gray50", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ....... ", +" ............. ", +" ............... ", +" ................... ", +" ..................... ", +" .....XXX............. ", +" .....XXXXX............. ", +" .....XXXXXXX............o ", +" ....XXXXXXXXX...........o ", +" ....XXXXXXXXX...........o ", +".....XXXXXXXXX...........oo ", +"......XXXXXXX............oo ", +".......XXXXX.............oo ", +"........XXX.............ooo ", +"........................ooo ", +"........................ooo ", +"........................ooo ", +" ......................ooo ", +" ......................ooo ", +" .....................oooo ", +" ...................oooo ", +" .................oooo ", +" ................ooooo ", +" .............oooooo ", +" .......oooooooo ", +" ooooooooooooo ", +" ooooooo ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" "}; Index: external/mit/ctwm/dist/xpm/ball12.xpm =================================================================== RCS file: external/mit/ctwm/dist/xpm/ball12.xpm diff -N external/mit/ctwm/dist/xpm/ball12.xpm --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/xpm/ball12.xpm 3 Sep 2015 12:20:01 -0000 @@ -0,0 +1,71 @@ +/* XPM */ +static char * bb_xpm[] = { +"64 64 4 1", +" s None c None", +". c gray70", +"X c gray100", +"o c gray50", +" ", +" ", +" ", +" ", +" ", +" ", +" ....... ", +" ............. ", +" ............... ", +" ................... ", +" ..................... ", +" .....XXX............. ", +" .....XXXXX............. ", +" .....XXXXXXX............o ", +" ....XXXXXXXXX...........o ", +" ....XXXXXXXXX...........o ", +" .....XXXXXXXXX...........oo ", +" ......XXXXXXX............oo ", +" .......XXXXX.............oo ", +" ........XXX.............ooo ", +" ........................ooo ", +" ........................ooo ", +" ........................ooo ", +" ......................ooo ", +" ......................ooo ", +" .....................oooo ", +" ...................oooo ", +" .................oooo ", +" ................ooooo ", +" .............oooooo ", +" .......oooooooo ", +" ooooooooooooo ", +" ooooooo ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" "}; Index: external/mit/ctwm/dist/xpm/ball2.xpm =================================================================== RCS file: external/mit/ctwm/dist/xpm/ball2.xpm diff -N external/mit/ctwm/dist/xpm/ball2.xpm --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/xpm/ball2.xpm 3 Sep 2015 12:20:01 -0000 @@ -0,0 +1,71 @@ +/* XPM */ +static char * b2_xpm[] = { +"64 64 4 1", +" s None c None", +". c gray70", +"X c gray100", +"o c gray50", +" ", +" ", +" ", +" ", +" ", +" ", +" ....... ", +" ............. ", +" ............... ", +" ................... ", +" ..................... ", +" .....XXX............. ", +" .....XXXXX............. ", +" .....XXXXXXX............o ", +" ....XXXXXXXXX...........o ", +" ....XXXXXXXXX...........o ", +" .....XXXXXXXXX...........oo ", +" ......XXXXXXX............oo ", +" .......XXXXX.............oo ", +" ........XXX.............ooo ", +" ........................ooo ", +" ........................ooo ", +" ........................ooo ", +" ......................ooo ", +" ......................ooo ", +" .....................oooo ", +" ...................oooo ", +" .................oooo ", +" ................ooooo ", +" .............oooooo ", +" .......oooooooo ", +" ooooooooooooo ", +" ooooooo ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" "}; Index: external/mit/ctwm/dist/xpm/ball3.xpm =================================================================== RCS file: external/mit/ctwm/dist/xpm/ball3.xpm diff -N external/mit/ctwm/dist/xpm/ball3.xpm --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/xpm/ball3.xpm 3 Sep 2015 12:20:01 -0000 @@ -0,0 +1,71 @@ +/* XPM */ +static char * b2_xpm[] = { +"64 64 4 1", +" s None c None", +". c gray70", +"X c gray100", +"o c gray50", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ....... ", +" ............. ", +" ............... ", +" ................... ", +" ..................... ", +" .....XXX............. ", +" .....XXXXX............. ", +" .....XXXXXXX............o ", +" ....XXXXXXXXX...........o ", +" ....XXXXXXXXX...........o ", +" .....XXXXXXXXX...........oo ", +" ......XXXXXXX............oo ", +" .......XXXXX.............oo ", +" ........XXX.............ooo ", +" ........................ooo ", +" ........................ooo ", +" ........................ooo ", +" ......................ooo ", +" ......................ooo ", +" .....................oooo ", +" ...................oooo ", +" .................oooo ", +" ................ooooo ", +" .............oooooo ", +" .......oooooooo ", +" ooooooooooooo ", +" ooooooo ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" "}; Index: external/mit/ctwm/dist/xpm/ball4.xpm =================================================================== RCS file: external/mit/ctwm/dist/xpm/ball4.xpm diff -N external/mit/ctwm/dist/xpm/ball4.xpm --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/xpm/ball4.xpm 3 Sep 2015 12:20:01 -0000 @@ -0,0 +1,71 @@ +/* XPM */ +static char * bb_xpm[] = { +"64 64 4 1", +" s None c None", +". c gray70", +"X c gray100", +"o c gray50", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ....... ", +" ............. ", +" ............... ", +" ................... ", +" ..................... ", +" .....XXX............. ", +" .....XXXXX............. ", +" .....XXXXXXX............o ", +" ....XXXXXXXXX...........o ", +" ....XXXXXXXXX...........o ", +" .....XXXXXXXXX...........oo ", +" ......XXXXXXX............oo ", +" .......XXXXX.............oo ", +" ........XXX.............ooo ", +" ........................ooo ", +" ........................ooo ", +" ........................ooo ", +" ......................ooo ", +" ......................ooo ", +" .....................oooo ", +" ...................oooo ", +" .................oooo ", +" ................ooooo ", +" .............oooooo ", +" .......oooooooo ", +" ooooooooooooo ", +" ooooooo ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" "}; Index: external/mit/ctwm/dist/xpm/ball5.xpm =================================================================== RCS file: external/mit/ctwm/dist/xpm/ball5.xpm diff -N external/mit/ctwm/dist/xpm/ball5.xpm --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/xpm/ball5.xpm 3 Sep 2015 12:20:01 -0000 @@ -0,0 +1,71 @@ +/* XPM */ +static char * b3_xpm[] = { +"64 64 4 1", +" s None c None", +". c gray70", +"X c gray100", +"o c gray50", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ....... ", +" ............. ", +" ............... ", +" ................... ", +" ..................... ", +" .....XXX............. ", +" .....XXXXX............. ", +" .....XXXXXXX............o ", +" ....XXXXXXXXX...........o ", +" ....XXXXXXXXX...........o ", +" .....XXXXXXXXX...........oo", +" ......XXXXXXX............oo", +" .......XXXXX.............oo", +" ........XXX.............ooo", +" ........................ooo", +" ........................ooo", +" ........................ooo", +" ......................ooo ", +" ......................ooo ", +" .....................oooo ", +" ...................oooo ", +" .................oooo ", +" ................ooooo ", +" .............oooooo ", +" .......oooooooo ", +" ooooooooooooo ", +" ooooooo ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" "}; Index: external/mit/ctwm/dist/xpm/ball6.xpm =================================================================== RCS file: external/mit/ctwm/dist/xpm/ball6.xpm diff -N external/mit/ctwm/dist/xpm/ball6.xpm --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/xpm/ball6.xpm 3 Sep 2015 12:20:01 -0000 @@ -0,0 +1,71 @@ +/* XPM */ +static char * bb_xpm[] = { +"64 64 4 1", +" s None c None", +". c gray70", +"X c gray100", +"o c gray50", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ....... ", +" ............. ", +" ............... ", +" ................... ", +" ..................... ", +" .....XXX............. ", +" .....XXXXX............. ", +" .....XXXXXXX............o ", +" ....XXXXXXXXX...........o ", +" ....XXXXXXXXX...........o ", +" .....XXXXXXXXX...........oo ", +" ......XXXXXXX............oo ", +" .......XXXXX.............oo ", +" ........XXX.............ooo ", +" ........................ooo ", +" ........................ooo ", +" ........................ooo ", +" ......................ooo ", +" ......................ooo ", +" .....................oooo ", +" ...................oooo ", +" .................oooo ", +" ................ooooo ", +" .............oooooo ", +" .......oooooooo ", +" ooooooooooooo ", +" ooooooo ", +" ", +" ", +" ", +" ", +" ", +" "}; Index: external/mit/ctwm/dist/xpm/ball7.xpm =================================================================== RCS file: external/mit/ctwm/dist/xpm/ball7.xpm diff -N external/mit/ctwm/dist/xpm/ball7.xpm --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/xpm/ball7.xpm 3 Sep 2015 12:20:01 -0000 @@ -0,0 +1,71 @@ +/* XPM */ +static char * b4_xpm[] = { +"64 64 4 1", +" s None c None", +". c gray70", +"X c gray100", +"o c gray50", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ....... ", +" ............. ", +" ............... ", +" ................... ", +" ..................... ", +" .....XXX............. ", +" .....XXXXX............. ", +" .....XXXXXXX............o ", +" ....XXXXXXXXX...........o ", +" ....XXXXXXXXX...........o ", +" .....XXXXXXXXX...........oo ", +" ......XXXXXXX............oo ", +" .......XXXXX.............oo ", +" ........XXX.............ooo ", +" ........................ooo ", +" ........................ooo ", +" ........................ooo ", +" ......................ooo ", +" ......................ooo ", +" .....................oooo ", +" ...................oooo ", +" .................oooo ", +" ................ooooo ", +" .............oooooo ", +" .......oooooooo ", +" ooooooooooooo ", +" ooooooo "}; Index: external/mit/ctwm/dist/xpm/ball8.xpm =================================================================== RCS file: external/mit/ctwm/dist/xpm/ball8.xpm diff -N external/mit/ctwm/dist/xpm/ball8.xpm --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/xpm/ball8.xpm 3 Sep 2015 12:20:01 -0000 @@ -0,0 +1,71 @@ +/* XPM */ +static char * bb_xpm[] = { +"64 64 4 1", +" s None c None", +". c gray70", +"X c gray100", +"o c gray50", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ....... ", +" ............. ", +" ............... ", +" ................... ", +" ..................... ", +" .....XXX............. ", +" .....XXXXX............. ", +" .....XXXXXXX............o ", +" ....XXXXXXXXX...........o ", +" ....XXXXXXXXX...........o ", +" .....XXXXXXXXX...........oo ", +" ......XXXXXXX............oo ", +" .......XXXXX.............oo ", +" ........XXX.............ooo ", +" ........................ooo ", +" ........................ooo ", +" ........................ooo ", +" ......................ooo ", +" ......................ooo ", +" .....................oooo ", +" ...................oooo ", +" .................oooo ", +" ................ooooo ", +" .............oooooo ", +" .......oooooooo ", +" ooooooooooooo ", +" ooooooo ", +" ", +" ", +" ", +" ", +" ", +" "}; Index: external/mit/ctwm/dist/xpm/ball9.xpm =================================================================== RCS file: external/mit/ctwm/dist/xpm/ball9.xpm diff -N external/mit/ctwm/dist/xpm/ball9.xpm --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/xpm/ball9.xpm 3 Sep 2015 12:20:01 -0000 @@ -0,0 +1,71 @@ +/* XPM */ +static char * b5_xpm[] = { +"64 64 4 1", +" s None c None", +". c gray70", +"X c gray100", +"o c gray50", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ....... ", +" ............. ", +" ............... ", +" ................... ", +" ..................... ", +" .....XXX............. ", +" .....XXXXX............. ", +" .....XXXXXXX............o ", +" ....XXXXXXXXX...........o ", +" ....XXXXXXXXX...........o ", +" .....XXXXXXXXX...........oo ", +" ......XXXXXXX............oo ", +" .......XXXXX.............oo ", +" ........XXX.............ooo ", +" ........................ooo ", +" ........................ooo ", +" ........................ooo ", +" ......................ooo ", +" ......................ooo ", +" .....................oooo ", +" ...................oooo ", +" .................oooo ", +" ................ooooo ", +" .............oooooo ", +" .......oooooooo ", +" ooooooooooooo ", +" ooooooo ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" "}; Index: external/mit/ctwm/dist/xpm/cdrom1.xpm =================================================================== RCS file: external/mit/ctwm/dist/xpm/cdrom1.xpm diff -N external/mit/ctwm/dist/xpm/cdrom1.xpm --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/xpm/cdrom1.xpm 3 Sep 2015 12:20:01 -0000 @@ -0,0 +1,56 @@ +/* XPM */ +static char * cdrom1_xpm[] = { +/*blue*/ +"64 38 14 1", +" s None c None", +". c gray", +"X c navy", +"o c slate blue", +"O c gray70", +"+ c violet", +"@ c gray85", +"# c yellow", +"$ c #727277778585", +"% c orange", +"& c white", +"* c black", +"= c light sky blue", +"- c cyan", +" .......................................X ", +" ......................................XX ", +" ..ooooooooooooooooooooooooooooooooooooXX ", +" ..ooooooooooooooooOOOOOoooooooooooooooXX ", +" ..oooooooooooooOOO+++++OOOooooooooooooXX ", +" ..oooooooooooOO@++++++++++OOooooooooooXX ", +" ##$.oooooooooOO@@@@+++++++++++OOooooooooXX ", +" ###$ ##$$$.ooooooooO@@@@@@+++++++++++++OoooooooXX ", +" ##$$ #$ ..oooooooO@@@@@@@++++++++++++++OooooooXX ", +" ##$ #$ ..ooooooO@@@@@@@@@++++++++++++++OoooooXX ", +" #$ #$ ..ooooooO@@@@@@@@@++++++++++++++OoooooXX ", +" $#$ %# ..oooooO@@@@@@@@@@@++++++++++++++OooooXX ", +" $#$ $%%#..oooooO+@@@@@@@@@@++++++++++++++OooooXX ", +" $%# $$%##ooooO++++@@@@@@@@&&&++++++++++++OoooXX ", +" $%# $%%#oooO++++++@@@@OO@++&&++++++++++OoooXX ", +" $# $$%%#oO++++++++@OO@***++&+++++++++OoooXX ", +" $# ..$$%##++++#####&@*ooo*+&++++++++++OooXX ", +" $% ..oo$%%#++##===##*ooooo*+&+++++++++OooXX ", +" $% ..ooo$$%###=&&&==#ooooo*+&+++++++++O*oXX ", +" $%# ..oooO+$###===&==##oooo*+&+++++++++O*oXX ", +" $%# ##### ..oooO+$#==&&&==&-#ooo*@@@+++++++++O*oXX ", +" $%# ##=====##.ooooO#=====&&&-&##**@@@O@@@+++++O**oXX ", +" $%# ##==&&&==##oooo$#=======&&==#++@OOO@@@@@@@+O**oXX ", +" $# #=====&&==##ooo$#========&#=#&&+@@@@@@@@@@@O*ooXX ", +" $% ##=&&&&--&==##oo$#==========###++@@@@@@@@@@O**ooXX ", +" $%# #=====&&--&==#oo$#============#+++@@@@@@@@@O*oooXX ", +" $%# #=======&&===##$##==========###+++@@@@@@@@O**oooXX ", +" $%# #========&====#$#=======####$$$+++@@@@@@@@O*ooooXX ", +" $%# #=============#$#===####$$$$$$$++++@@@@@@O**ooooXX ", +" $%###==============####$$$$$$$$$+++++++@@@@@O**oooooXX ", +" $$%#===========####$$$$$$$$$++++++++++++@@OO**ooooooXX ", +" $%#========##$$$$$$$$$oo**OO+++++++++++OO***oooooooXX ", +" $%#===##$$$$$$$$$$oooooooo**OOO+++++OOO****ooooooooXX ", +" $%##$$$$$$$$$..ooooooooooooo***OOOOO*****ooooooooooXX ", +" $$$$$$$$ ..oooooooooooooooo*******oooooooooooooXX ", +" $$$ ..ooooooooooooooooooooooooooooooooooooXX ", +" ..XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ", +" .XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX "}; Index: external/mit/ctwm/dist/xpm/claude.xpm =================================================================== RCS file: external/mit/ctwm/dist/xpm/claude.xpm diff -N external/mit/ctwm/dist/xpm/claude.xpm --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/xpm/claude.xpm 3 Sep 2015 12:20:01 -0000 @@ -0,0 +1,53 @@ +/* XPM */ +static char * claude_xpm[] = { +"64 38 12 1", +" s None c None", +". c black", +"X c peachpuff4", +"o c #727277778585", +"O c gray100", +"+ c tan", +"@ c lightyellow", +"# c red", +"$ c wheat", +"% c gray85", +"& c cornflower blue", +"* c lightskyblue", +" .XXXXXXXXX. oOOOOOOOOOOOOOOOo ", +" ...+++++++++XXX. oOOOOOOOOOOOOOOOOOo ", +" ++++@@@+++@@+XXX. oOOO#OOO#OOO#OOO#OOoo ", +" ++$@@@++@++@@@++XXX. oOOOO#OOO#OOOOOOO#OOOo ", +" ++X@@@@@++@@@@@@.++X. oOOOO#OOO#OO##OOO#OOOOo ", +" +X@@@@@++++@@@@@@.+XX oOOOO#####OOO#OOO#OOOoo ", +" X+@@@@@@@+++@@@@@@@X+X+ oOOOO#OOO#OOO#OOO#OOOo ", +" +++@@@@@@+++@@@@@@@@.+XX oOOOO#OOO#OOO#OOOOOOOoooo ", +" ++X.@@@@@@++@@@@@@@@@.++X oOOOO#OOO#OO###OO#OOOOOO o ", +" X+X@@@@@@@@@@@@@@@@@@@.++.oOOOOOOOOOOOOOOOOOOOOOOOOooo ", +" XX.@@@@@@@@@@@@@@@@@@@@+XXooOOOOOOOOOOOOOOOOOOOOOOOOOoo ", +" XX@@@@@@@@@@@@@@@@@@@@@+XX oOOO###OOOOOOOOOOOOOOOOOOOOo ", +" +XX@@@@@@@@@@@@@@@@@@@@@XXXXoOOOO#OOOOOOOOOOOOOOOOOOOOOo ", +" XXX@@@+++@@@@@++++@@@@@@@+XXooOOO#OOOOOO###OO##O#OOOOOOo ", +" XXX@......@@@@.......@@...XX oOOO#OOOOOOOOO#O#O#O#OOOOOo ", +" XXX%%%%%%%@@@@%%%%%%%@..@.XX oOOO#OOOOOO####O#O#O#OOOOOo ", +" XXX%%%XX%.@.@.%XX%%%%.@@@XXX oOOO#OOOOO#OOO#O#O#O#OOOOoo ooo ", +" XX.%%%XX%.@@@.%XX%%%%.@@@XX. oOO###OOOOO####O#OOO#OOOOooooOooo ", +" XX@%%%%%%.@@@.%%%%%%..@@@.X oOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoo", +" .X...%%...@@@@.%%%%..@@@@@@.OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOo", +" .@@....@@@@@@@....@@@@@.@.O###OOO##OOOOOOOOOOOOOOOOOOO#OOOOOOO", +" ..@@@@@@@@@@@@@@@@@@@@@.@O#OOO#OOO#OOOOOOOOOOOOOOOOOOO#OOOOOOO", +" .@@@@@@@@@@@@@@@@@@@@. O#OOOOOOO#OOOO###OO#OOO#OO##O#OO###OO", +" .@@@@@@.....@@@@@@@@@...#OOOOOOO#OOOOOOO#O#OOO#O#OO##O#OOO#O", +" .@@@@@@...@@@@.@@@@....#OOOOOOO#OOOO####O#OOO#O#OOO#O#####O", +" .@@..@@@@@@@@...@@@...O#OOO#OOO#OOO#OOO#O#OO##O#OO##O#OOOOO", +" O.@@.........@@@@@.%..OO###OOO###OOO####OO##O#OO##O#OO###OO", +" ..@@@@@@@@@@@@@@@.%%..OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOo", +" .&.@@@@....@@@@@.%%.&..OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO ", +" ...&&.@@@@@@@@@@..%%%.&....OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOo ", +".......&&..@@@@@@..%%%%.&&&&&.....OooooooOOOOOOOOOOOOOOOOOoooo ", +".&&&&&..&.%......%%%%...&&&..&&&&... oooOOOOOOOOOOOooooo ", +"&&&&&&..&&.%%%%%%%%%..&&&&&.&&&&&&&... oooooooooooo ", +"&&&&&&&&.&&..%%%%%%..$&&...&.&&&&&&&&... ", +"&&&&&&&&.&&&..%%%%..&&&$.$.&.****.&&.&... ", +"&&&&&*&&&.&&&..%%..$&&&.$&&..*****..&&&.. ", +"&*&&***&&..$&&....*&&&.*&&..*****..&&&&&. ", +"&*********..***...***.**&..******.&&.***. "}; Index: external/mit/ctwm/dist/xpm/clipboard.xpm =================================================================== RCS file: external/mit/ctwm/dist/xpm/clipboard.xpm diff -N external/mit/ctwm/dist/xpm/clipboard.xpm --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/xpm/clipboard.xpm 3 Sep 2015 12:20:01 -0000 @@ -0,0 +1,57 @@ +/* XPM */ +static char * clipboard_xpm[] = { +"48 48 6 1", +" s None m None g None c None", +". m black g black c black", +"X m white g gray65 c gray65", +"o m white g gray80 c yellow", +"O m white g gray90 c gray90", +"+ m white g white c gray100", +" ", +" ", +" ", +" ", +" ...... ", +" .XXXXXX. ", +" .XXXXXXXX. ", +" .. .XXX....XX. ", +" .XX... .XXX. ..XX. ", +" ..XXX... .XXX....XXXX. ", +" ..XXXX.... .XXX.XXXXXXX. ", +" ...XXXXX... .XXXXXXXXXX.. ", +" ..XXXXXX....XXXXXXX... ", +" ...XXXXXXX..XXX.. ", +" ...XXXXXX... ", +" ...XXX..XXXXXX... ", +" ..XXXXX.....XXXXXXX... ", +" ...XXXX... .XXXXXXXXXX.. ", +" ..XXXX... .XXX.XXXXXXX. ", +" ..XXX... .XXX....XXXX. ", +" .XX... .XXX. ..XX. ", +" .. .XXX....XX. ", +" .XXXXXXXX. ", +" .XXXXXX. ", +" ...... ", +" ", +" ", +" . ", +" .......................... ", +" .oooooooooooooooooooooooo.. ", +" .ooooooo...o.ooooooooooooo.. ", +" .......ooooooo.ooo.ooooooooooooo.. ", +" ...OOOOO.ooooooo.ooo.o.o.o...ooooo.. ", +" ..OOOOOOOO.ooooooo.o.o.o.o.o.o.ooooo.. ", +" O ...OOOOO.ooooooo.o.o.o.o.o...ooooo.. ", +" O+O .......ooooooo.o.o.o.o.o.ooooooo.. ", +" O+O .ooooooo...o.o...o...ooooo.. ", +" O+O .oooooooooooooooooooooooo.. ", +" O O .......................... ", +" O+O . ", +" O ", +" OOO ", +" O+++OO ", +" O+++++O ", +" OO+++O ", +" OOO ", +" ", +" "}; Index: external/mit/ctwm/dist/xpm/datebook.xpm =================================================================== RCS file: external/mit/ctwm/dist/xpm/datebook.xpm diff -N external/mit/ctwm/dist/xpm/datebook.xpm --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/xpm/datebook.xpm 3 Sep 2015 12:20:01 -0000 @@ -0,0 +1,60 @@ +/* XPM */ +/*****************************************************************************/ +/** This pixmap is kindly offered by Ion Cionca - 1992 - **/ +/** Swiss Federal Institute of Technology **/ +/** Central Computing Service **/ +/*****************************************************************************/ +static char * image_name [] = { +"64 38 13 1", +/**/ +" s None c None", +". c black", +"X c blue", +"o c red", +"O c white", +"+ c lightskyblue", +"@ c navy", +"# c darkslategrey", +"$ c lightyellow", +"% c gray85", +"& c peachpuff4", +"* c gray70", +"= c tan", +" ", +" ", +" ..................... XXXXXXXX ", +" ..ooooooooooooooooooo. XOO+XXXXXXX ", +" .o.ooooooooooooooooooo. XOO+XXXXXXXXX ", +" .o.ooooooooooooooooooo. XXO++XXXXXXXXXXXX ", +" .o.ooooooooooooooooooo. XX++++++++++XXXXXXX ", +" .o.ooooooooooooooooooo. @@@@@@@@@@@@@@@@@@@ ", +" .o..................... ################### ", +" .o.$$$$$$$$$$$$$$$$$$. XXXXXX%%%XXXXXX ", +" ..&.$$$$$$$$$$$$$$$$$. XXX%%***@****%XXX ", +" .&&.$$$$$$$$@@@$$$$$$. XXX%%%%%%@%%***%XXX ", +" .&=.$$$@@$$@@$@@$$$$$. XX%%%%%%%@@@%%***%%XX ", +" .&=.$$$@@$$@@$@@$$$$$. XX%%%%%%%%@@@%%%***%%XX ", +" .&=.$$$@@@$$$$@@@@$$$. #XXX%%%%%%%%@@@%%%%%**%XXX ", +" .&=.$$$@$@$$$@@$$@@$$$. ##XX%%%%%%%%%@@@%%%%%***%XX ", +" .&=.$$$@$@$$$$$$$$@@$$. ##X%%%%%%%%%%@@@%%%%%****%XX ", +" .&=.$$$@$@@$$$$$$$$@$$.##XX%%%%%%%%%%@@@%%%%%%***%XX ", +" .&=.$$$$$$@$$$$$$$$@$$$##XX%%%%%%%%%%%@%%%%%%%%**%XXX ", +" .&=..$$$$$@@$$$$$$$@$$###X%%%%%%%%%%%%@%%%%%%%%***%XX ", +" .&=..$$$$$$@@$$@@$@@$$##XX%%%%%%%%%%%%@%%%%%%%%%**%XX ", +" .&=.=.$$$$$$@@$$@@@$$$##XX%%%%%%%%%%%@%@%%%%%%%%**%XX ", +" .&=.=.$$$$$$$@@$$$$$$$##XX%%%%%%%%%%%%@%%%%%%%%%**%XX ", +" .&=..=.$$$$$$$$$$$$$$$##XX%%%%%%%%%%%%%%@@%%%%%%*%%XX ", +" .&=..=.$$$$$$$$$$$$$$$###XX%%%%%%%%%%%%%@@@%%%%%*%XXX ", +" .&=.=.=.$$$$$$$$$.$$$$###XX%%%%%%%%%%%%%%@@%%%%%%%XXX ", +" .&=.=.==.$$$$$$$..$$$$$##XX%%%%%%%%%%%%%%%%@%%%%%%XX ", +" .&=.=.===..$$$$.$$.$$$$###XX%%%%%%%%%%%%%%%%%%%%%XX ", +" .&==.=.$==*....$$$$.....##XXX%%%%%%%%%%%%%%%%%%%XXX ", +" .&&=..=.$==**.$$$$$$$..$###XX%%%%%%%%%%%%%%%%%%%XX ", +" .&&==.==.$===*.......*$..###XX%%%%%%%%%%%%%%%%%XX ", +" .&&&=..$.$=======$$$.... ###XXX%%%%%%%%%%%%%XXX ", +" .&&&&=..............&. ##XXXX%%%%%%%%%%%XXXX ", +" .&&&&&=============&&. ##XX#XXXXX%%%XXXXXXXX ", +" ...................... #XX#####XXXXXX##X####X ", +" ##X ########### ###XX ", +" #X ##X ", +" "}; Index: external/mit/ctwm/dist/xpm/emacs.xpm =================================================================== RCS file: external/mit/ctwm/dist/xpm/emacs.xpm diff -N external/mit/ctwm/dist/xpm/emacs.xpm --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/xpm/emacs.xpm 3 Sep 2015 12:20:01 -0000 @@ -0,0 +1,52 @@ +/* XPM */ +static char * emacs_xpm[] = { +"64 38 11 1", +" s None c None", +". c gray30", +"X c gray100", +"o c #808080808080", +"O c #727277778585", +"+ c gray70", +"@ c red", +"# c gray85", +"$ c tan", +"% c gray50", +"& c peachpuff4", +" .XXXXo...... ", +" .XXXXXXXXXXX....... ", +" .XXOOXXXXXXXXXXXXX...... ", +" ..XXXXOOOOXXXXXXXXXXXXXo...... ", +" ++++++++++++++++++.XXXXXXXXXOOOOXXXXXXXXXXXXXXXX.. ", +" ++++++++++++++++++..XXX@@@XX@@X@XOO@@@XXX@@@XXX@@@X. ", +" ++++++++++++++++++o.XXX@XXX@X@X@X@XXXXX@O@XXX@X@XXX@X. ", +" ++++OOOOOOOOOOOOOO.XXXX@@@@@X@X@X@XX@@@@X@OOOXXX@@XX . ", +" +++OO############..XXXX@XXXXX@X@X@X@XXX@X@XXXOOOXX@XXX. ", +" +++O##XXXXXXXX###.XXXoo@XXX@X@X@X@X@XXX@X@XXX@X@XXX@X . ", +" +++O#XXXX#######.XXXXXXX@@@XX@XXX@XX@@@@XX@@@XXX@@@XX . ", +" +++O#XX########..XXXXXXXXXXOOXXXXXXXXOOXXXXXXXXXXXXX.X. ", +" +++O#XX########.XXXXXXXXXXXXXOOOOXXXXXXOOOXXXXXXXXX. .. ", +" +++O#X########..XXXXXXXXXXXXXXXXXOOOXXXXXXXXXXXXXX.. . ", +" +++O#X#######..XXXXooXXX@@@XX@@X@XXX@@@XXX@@@XXX@@@ ", +" ++oo#########.XXXXXXXoo@XXX@X@X@X@XXXXX@X@XXX@X@X. @ ", +" +o$$ooo#####..XXXooXXXX@@@@@X@X@X@XX@@@@X@XXXXXX@@ ", +" o$$$$$$oooo#.XXXXXXoooo@XXXXX@X@X@X@XXX@X@XXXXXX. @ ", +" o$$$$$$$$$$ooooXXXXXXXXX@OXX@X@X@X@X@XXX@X@XXX@X@ @ ", +" o$$$$$$$$oooo$$oo XXXXXX@@@XX@XXX@XX@@@@XX@@@X. @@@ ", +" o$$$$$$$$$$$$oooo$%% ooXXXXXXOOOXXXXOOOXXXXXXXX.. ", +" o$$$$$$$$$$$$$$$$ooo%%XXXooXXXXXXXOOOXXXXOOOOXXX.. ", +" o$$$$$$$$$$$$$oooo$$$$ooo XXXXXXXXXXXXXXXXXXXXXXX. ", +"o$$$$$$$$$$$$$$$$$$ooo$$%%oXXX@@@XX@@X@XXX@@@XXX@@@ @@@ ", +"$$$$$$$$$$$$$$$$$$$$$$oo$%%Xo@XXX@X@X@X@XXXXX@X@X. @ @ @ ", +"$$$$$$$$$$$$$$$$$$$$$$$ooo%XX@@@@@X@X@X@XX@@@@X@X. @@ ", +"$$$$$$$$$$$$$$$$&&&&&&&$$ooXX@XXXXX@X@X@X@XXX@X@.. @ ", +"$$$$$$$$$$$$$$&&&ooooooooX%XX@XXX@X@X@X@X@XXX@X@ @ @ @ ", +"$$$$$$$$$$$$$$&&oXXXXXXoooo%X @@@XX@XXX@XX@@@@X.@@@ @@@ ", +"$$$$$$$$$$$$$$&&oXXXoooo$$$$%XXXXXXXXXXXXXXXXXo. ", +"$$$$$$$$$$$$$$$$ooo&&$$$$$$%XXXXXXXXXXXXXXXXXX.. ", +"$$$$$$$$$$$$$$$$$$$&$$$$$o%XXXXXXXXXXXXXXXXXX.. ", +"$$$$$$$$$$$$$$$$$$$$$$$ooXXXX @@@XX@@X@XXX@@@. @@@ @@@ ", +"$$$$$$$$$$$$$$$$$$$$$ooXXXXXX@XXX@X@X@X@XXXX.@ @ @ @ @ ", +"$$$$$$$$$$$$$$$$$$$ooXXXXXXXX@@@@@X@X@X@XX@@@@ @ @@ ", +"$$$oooooooooooooooooXXXXXXXXX@XXXXX@X@X@X@.. @ @ @ ", +"$ooo .....oXXXX@XXX@X@X@X@X@. @ @ @ @ @ ", +"o ....oX @@@XX@XXX@X.@@@@ @@@ @@@ "}; Index: external/mit/ctwm/dist/xpm/ghostview.xpm =================================================================== RCS file: external/mit/ctwm/dist/xpm/ghostview.xpm diff -N external/mit/ctwm/dist/xpm/ghostview.xpm --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/xpm/ghostview.xpm 3 Sep 2015 12:20:01 -0000 @@ -0,0 +1,57 @@ +/* XPM */ +static char * ghostview_xpm[] = { +"48 48 6 1", +" s None c None g None m None", +". c black g black m black", +"X c #FEFEFEFEEFEF g #FEFEFEFEEFEF m white", +"o c white g white m white", +"O c red g gray60 m black", +"+ c blue g gray70 m black", +" ", +" ", +" ......................... ", +" .XXXXXXXXXXXXXXXXXXXXXXX. ", +" .XX..XXX.XXXX.X...XX.XXX. ", +" .........................X. ", +" .......XXXXXXXXXXXXXXXXXXXX. ", +" ..ooooo..X.X........X..XXXXX. ", +" ..ooooooo..XXXXXXXXXXXXXXXXXX. ", +" ..ooooooooo...X.XX.XXX.......X. ", +" ..ooOoooOoo..XXXXXXXXXXXXXXXXX. ", +" ..ooOOOoOOOo..XXXXXXXXXXXXXXXXX. ", +" ..ooOOOoOOOo..X...XX.X.X..XXXXX. ", +" ..oooOoooOoo..XXXXXXXXXXXXXXXXX. ", +" .ooooooooooo...XXXXXXXXXXXXXXXX. ", +" ..oooooooooooo.....X.XX.XX.X.XXX. ", +" ..oooooooooooo..XXXXXXXXXXXXXXXX. ", +" ..ooo++ooo++oo.......XXX..X.X.XX. ", +" ...ooooo+++oooo..XXXXXXXXXXXXXXXX. ", +" ..ooooooooooooo..X...........XXXX. ", +" ..ooooooooooooo..XXXXXXXXXXXXXXXX. ", +" ..ooooooooooooo..XXXXXXXXXXXXXXXX. ", +" ..ooooooooooooo.....XX.XX.X...XXX. ", +" ...oooooooooooooo..XXXXXXXXXXXXXXX. ", +" ..ooooooooooooooo..XXXXXXXXXXXXXXX. ", +" ..ooooooooooooooo..X...X.X.X.X..XX. ", +" ..ooooooooooooooo...XXXXXXXXXXXXXX. ", +" ..oooooooooooooooo..XXXXXXX.XXXXXX. ", +" ..oooooooooooooooo..XXXXXXXXXXXXXX. ", +" ..oooooooooooooooo...XX..X.XX.XX.X. ", +" ..oooooooooooooooooo..XXXXXXXXXXXXX. ", +" ...oooooooooooooooooo...XXXXXXXXXXXX. ", +" ....oooo.oooo.oooo.ooooo...XX..XX.XX.X. ", +" ...oooooo.oooo.ooooo.ooooo...XXXXXXXXXX. ", +" ...ooooooo.oooo.ooooo..ooooo.....XXXXXXX. ", +" ...ooooooo.oooo..ooooo..ooooo.......XX.X. ", +" ...ooooo.oooooo.oooooo..ooooooo....XXXX. ", +" ...ooo..ooooooo.oooooo.ooooooooo...XXX. ", +" ....o.oooooooo..oooooo..oooooooo..XXX. ", +" ....ooooooooo.ooooooo..ooooooo...XX. ", +" ....ooooooo.ooooooooo....oooo..XX. ", +" .....ooooo..ooooooooooo..oo...XX. ", +" ......oo.oooooooooooo..o..XXX. ", +" ........ooooooooooo.....XXX. ", +" ..................XXXXXXX. ", +" ......................... ", +" ", +" "}; Index: external/mit/ctwm/dist/xpm/hpterm.xpm =================================================================== RCS file: external/mit/ctwm/dist/xpm/hpterm.xpm diff -N external/mit/ctwm/dist/xpm/hpterm.xpm --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/xpm/hpterm.xpm 3 Sep 2015 12:20:01 -0000 @@ -0,0 +1,58 @@ +/* XPM */ +/*****************************************************************************/ +/** This pixmap is kindly offered by Ion Cionca - 1992 - **/ +/** Swiss Federal Institute of Technology **/ +/** Central Computing Service **/ +/*****************************************************************************/ + +static char * image_name [] = { +/**/ +"64 38 9 1", +/**/ +" s mask c none", +". c cyan", +"X c lightskyblue", +"o c gray70", +"O c gray85", +"+ c gray50", +"@ c darkolivegreen", +"# c white", +"$ c black", +" ", +" . ..... ...X ", +" ... .... ......ooooooooooooooooooooooooooo ", +" .... .... ....OOOOOOOOOOOOOOOOOOOOOOOOOo ", +" ... .... oo...OOOOOOOOOOOOOOOOOOOOOOOOO++ ", +" .. .... oOOO..@@@@@@@@@@@@@@@@@@@@OOOO++ ", +" .. .... oOO@@..@@@@@@@@@@@@@@@@@@@@OOO+++ ", +" .. ..... oOO@@#..##@######@@#@@@@@@@OOO+++ ", +" .. .... oOO@@@..@@@@@@@@@@@@@@@@@@@OOO++++ ", +" .. .... oOO@@##..@@#####@@@@@@@@@@@OOO++++ ", +" .. .... oOO@@@@..@@@@@@@@@@@@@@@@@@OOO+++++ ", +" .. .... oOO@@#@@..@####@#####@@@@@@OOO+++++ ", +" .. ........ ........@@..@@@@@@@@@@@@@@@@@OOO+++++ ", +" X.. ......... ..........@..@##@##@@###@@@@@@OOO+++++ ", +" ..X ......... ..........@..@@@@@@@@@@@@@@@@@OOO+++++ ", +" .. .... ... ....oOO....@#..@##@@@@@@@@@@@@@OOO+++++ ", +" .. .... ... ....oOO....@@..@@@@@@@@@@@@@@@@OOO+++++ ", +" .. .... ... .... oO....#@@..####@#@@@@@@@@@@OOO+++++ ", +" .. .... ... .... oO...@@@..X@@@@@@@@@@@@@@@@OOO+++++ ", +" ... ... ... .... o....#@@..X###@@@#####@@@@@OOO+++++ ", +" X.. .... ... ..........@@@@..@@@@@@@@@@@@@@@@OOOO++++ ", +" .. ... ... ...........OOOO..OOOOOOOOOOOOOOOOOOOO+++ ", +" X. .... ... ..........OOOO..OOOOOOOOOOOOOOOOOOOO+++ ", +" .. .... +++++..++++++++++++++++++++ooo++ ", +" .. .... ..ooooooooooooooooooooooo+++ ", +" .. ..... ++++..++++++++++++++++++++++++++ ", +" .. .... +OO..OOOOOOOOOOOOOOOOOOOOOOO++++oo oo ", +" .. ..... +O..OOOOOOOOOOOOOOO$$$$$$$OO++++ o o", +" ... .... ++...++++++++++++++++++++++OOO+++ o ", +" ... ..... +....OOOOOOOOOOOOOOOOOOOOOO+++++ o ", +" . .... .....OOOOOOOOOOOOOOOOOOOOOOO++ ++++++ ", +" ..... ......OOO#################OOOOO++ +++++ooo+ ", +" ...++OOOOOOOOOOOOOOOOOOOOOOOOOO++ ++OOO++oo+ ", +" +OO####################OOOO++ +OOOOOoo+ ", +" +OOOOOOOOOOOOOOOOOOOOOOOOOO++ +ooooo++ ", +" ++++++++++++++++++++++++++++ +++++++ ", +" ", +" "}; Index: external/mit/ctwm/dist/xpm/mail0.xpm =================================================================== RCS file: external/mit/ctwm/dist/xpm/mail0.xpm diff -N external/mit/ctwm/dist/xpm/mail0.xpm --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/xpm/mail0.xpm 3 Sep 2015 12:20:01 -0000 @@ -0,0 +1,52 @@ +/* XPM */ +static char * maol0_xpm[] = { +"64 38 11 1", +" s None c None", +". c #727277778585", +"X c yellow", +"o c tan", +"O c red", +"+ c cyan", +"@ c black", +"# c dark slate grey", +"$ c gray50", +"% c gray70", +"& c gray30", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" ", +" .............................. ", +" .XXXXXXXXXXXXXXXXXXXXXXXXXXXXX. ", +" .........XXXXXXXXXXXXXXXXXXXXXXXXXXXXX. ", +" .oooooooo.XXXXXXXXXXXXXXXXXXXXXXXXXXXXX. ", +" ........o.XXXXOOOOOXOOOOOOXOOOOOOXXXXXX. ", +" .++++++.o.XXXXOOOOOXOOOOOOXOOOOOOXXXXXX. ", +" .+++@@+.o.XXXXOOXOOXXXOOXXXXXOOXXXXXXXX. ", +" .+++@@+.o.XXXXOOOOOXXXOOXXXXXOOXXXXXXXX. ", +" ... .+#++##.o.XXXXOOOOOXXXOOXXXXXOOXXXXXXXX. ", +" .ooo.....o.#####.o.XXXXOOXXXXXXOOXXXXXOOXXXXXXXX. $$$$ ", +" .ooooooooooo.+##.o.XXXXOOXXXXXXOOXXXXXOOXXXXXXXX. $$$$$ ", +" .oooooooooooo....o.XXXXXXXXXXXXXXXXXXXXXXXXXXXXX. %%% $$$$$% ", +" .ooooooooooooooooo.XXXXXXXXXXXXXXXXXXXXXXXXXXXXX. $$$$$$%$$% ", +" .ooo.......ooooooo.XXXXXXXXXXXXXXXXXXXXXXXXXXXXX. $$$$$$%%% ", +" .ooo..&&&...oooooo.XXXXXXXXXXXXXXXXXX............ $$%%%%%%% ", +" .oo.&&&@&&..oooooo.XXXXXXXXXXXXXXXXX. @@@ %% $$%%%$$$ ", +" ...&&@@@@@&..ooooo.XXXXXXXXXXXXXXXXX.@@@@@ $$$$$%%$$$$ ", +" ..&&@@@%@@@&&.oooo.XXXXXXXXXXXXXXXX.@@@%@@@%%% $%%%$$$$%$$ ", +" @@%%%@@&&&&&&&&&................@@%%%@@%%%%%$$$$$$$$$$% ", +" @@@%@@@ %%%%% @@@%@@@%%$$$$$$$%%%$%% ", +" $$$$$@@@@@ %$$$$$$$$$$$$$$$$%%$$%@@@@@%%$%%$$$$$$$$$$ ", +"%%%%%$%@@@%$$$$$$$$%%%%$$$$$$$$$$$$$$$$@@@$$$$$$$%$$$$$$$ ", +" %$$$$$$$$$$$$$$$$$$%%%%$$$$$$$$$$$$$$$$$%%%%%%$$ ", +" $$$$$$$$$$$$$$$ $%$$$$$$$$$$%$$ ", +" $$$$$$$$$$ $$$$ ", +" $$$$$ ", +" ", +" ", +" ", +" "}; Index: external/mit/ctwm/dist/xpm/mail1.xpm =================================================================== RCS file: external/mit/ctwm/dist/xpm/mail1.xpm diff -N external/mit/ctwm/dist/xpm/mail1.xpm --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/xpm/mail1.xpm 3 Sep 2015 12:20:01 -0000 @@ -0,0 +1,50 @@ +/* XPM */ +static char * mail1_xpm[] = { +"64 38 9 1", +" s None c None", +". c gray70", +"X c white", +"o c #727277778585", +"O c yellow", +"+ c tan", +"@ c gray50", +"# c gray30", +"$ c black", +" .XX.XXX.. ", +" .XXXX.XXXX.. ", +" .XXXX.XXXXXX.. ", +" .XXXXXX.XXXXXXX.. ", +" .XXXXXX.XXXXXXXXX.. ", +" .XXXXXXXX.XXXXXXXXXX... ", +" .XXXXXXXX.XXXXXXXXXXXXX.. ", +" .XXXXXXXXXX.XXXXXXXXXXXXXX.. ", +" .XXXXXXXXXXX.XXXXXXXXXXXXXXXX..ooooooooo ", +" .XXXXXXXXXXXX.XXXXXXXXXXXXXXXXX..OOOOOOOo ", +" .XXXXXXXXXXXXX.XXXXXXXXXXXXXXXXXXX..OOOOOo ", +" .XXXXXXXXXXXXXX.XXXXXXXXXXXXXXXXXXXX...OOo ", +" .XXXXXXXXXXXXXXX.XXXXXXXXXXXXXXXXXXXXXXX..o ", +" .XXXXXXXXXXXXXXXX.XXXXXXXXXXXXXXXXXXXXXXXX.. ", +" .XXXXXXXXXXXXXXXXX.XXXXXXXXXXXXXXXXXXXXXXXXXX.. ", +" .....................XXXXXXXXXXXXXXXXXXXXXXXXXXX.. ", +" ooo ..XXXXXXXXXXXXXXXXX.XXXXXXXXXXXXXXXXXXXXXXXXXXXXX.. ", +" o+++ooo..XXXXXXXXXXXXXXXX.XXXXXXXXXXXXXXXXXXXXXXXXX..... @@@@ ", +" o++++++++..XXXXXXXXXXXXXX.XXXXXXXXXXXXXXX..........XXX. @@@@@ ", +" o++++++++++..XXXXXXXXXXXXX.XXXX..........XXXXXXXXXXXXX. @@@@@. ", +" o++++++++++++..XXXXXXXXXXX.....XXX.XXXXXXXXXXXXXXXXXX.@@@@.@@. ", +" o+++ooooooo++++..XXXXXXXXXXXXXXXXXX.XXXXXXXXXXXXXXXX.@@@@@... ", +" o+++oo###ooo+++++..XXXXXXXXXXXXXXXX.XXXXXXXXXXXXXXXX.@....... ", +" o++o###$##oo++++++o..XXXXXXXXXXXXXXX.XXXXXXXXXXXXXX.@@...@@@ ", +" ooo##$$$$$#oo+++++oOO..XXXXXXXXXXXXXX.XXXXXXXXXXXXX.@..@@@@ ", +" oo##$$$.$$$##o++++oOOOO..XXXXXXXXXXXX.XXXXXXXXXXXXX.@@@@.@@ ", +" $$...$$#########ooooo.XXXXXXXXXXXX.XXXXXXXXXXX.@@@@@@@. ", +" $$$.$$$ ..XXXXXXXXXXX.XXXXXXXXX.@@...@.. ", +" @@@@@$$$$$ .@@@@@@@@@@@...@XXXXXXXX.XXXXXXXXX.@@@@@@@ ", +".....@.$$$.@@@@@@@@....@@@@@@@@..XXXXXXXX.XXXXXXX.@@@@@@@ ", +" .@@@@@@@@@@@@@@@@@@....@@@@@@..XXXXXXX.XXXXXX.@@ ", +" @@@@@@@@@@@@@@@..XXXXX.XXXXX.@@ ", +" @@@..XXXX.XXXX.@ ", +" ..XXX.XX. ", +" ..X.XX. ", +" .... ", +" . ", +" "}; Index: external/mit/ctwm/dist/xpm/nothing.xpm =================================================================== RCS file: external/mit/ctwm/dist/xpm/nothing.xpm diff -N external/mit/ctwm/dist/xpm/nothing.xpm --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/xpm/nothing.xpm 3 Sep 2015 12:20:01 -0000 @@ -0,0 +1,55 @@ +/* XPM */ +static char * xrn_xpm[] = { +/*blue*/ +"64 38 13 1", +" s None c None", +". c blue", +"X c green", +"o c orange red", +"O c light sky blue", +"+ c cyan", +"@ c violet", +"# c gray", +"$ c #727277778585", +"% c yellow", +"& c gray70", +"* c gray85", +"= c navy", +" ..... ", +" ............. ", +" ................. ", +" ................... ", +" ....................... ", +" .XX....XX.............oo. ", +" .XXX....XXX............ooo. ", +" .XXX....XXX...........oooo. ", +" .XXXX...XXXX...........ooooo. ", +" .XXXXXX..XXX............oooooo. ", +" .XXXXXXX.XX......X...ooooooooo. ", +" .XXXXXXXX.........XXX.oooooooooo. ", +" .XXXXXXX..........XXXOOOoooooooo. ", +" .XXXXXX..........XXXOOOOooX++++X. ", +" .XXXXXX..........XXXOOOOXX+++++X. ", +" .XXX.XXX..........XXOOOOOXX+++++... ", +" .X...XX............XO.@@OXX+++XXXX. ", +" #####..............X....X..@@XXX+++XXXX. ", +" ### #$$$$$..............XX......@@@XXX+XXXXX. ", +" $$$# #$$ .X.............XXX....@@@XXXXXXXXX. ", +" $# $## #$ ..............XX..o@@@@@XXXX...X. ", +" $# $$$#$$ .X...........XXX.oo@@@%%XXX...... ", +" $$ $$$ .XX.............oooo%%%%XXXXX.... ", +" $# .XX.............ooooo%ooXXXXXX... ", +" $# .XXX...........oooooooo....XXX. ", +" $$#######$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ", +" $$$$$$$$&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&$$ ", +" $$&&***********=====**********===**=*=*=*=$$$ ", +" $&&&&==============================*=*====$$$$ ", +" $&&****************************=&*=*=*=&&&$$$$$ ", +" $&&&============================&&*=*=*=&&$$$$$ ", +" $&&**=*************************=&&*=*=*=&&$$$$$=== ", +" $$&&&============================&&*=*=*=&&$$$$==== ", +" $&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&$$$$==== ", +" $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$=== ", +" $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$==== ", +" $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$=== ", +" =========================================== "}; Index: external/mit/ctwm/dist/xpm/nt1.xpm =================================================================== RCS file: external/mit/ctwm/dist/xpm/nt1.xpm diff -N external/mit/ctwm/dist/xpm/nt1.xpm --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/xpm/nt1.xpm 3 Sep 2015 12:20:01 -0000 @@ -0,0 +1,24 @@ +/* XPM */ +static char * nt1_xpm[] = { +"20 18 3 1", +" c #000000000000", +". c #FFFFFFFF0000", +"X c #00000000FFFF", +" ", +" .. XX ", +" .. XX ", +" .. XX ", +" .. XX ", +" .. XX ", +" .. XX ", +" .. XX ", +" .. XX", +" .. XX", +" .. XX ", +" .. XX ", +" .. XX ", +" .. XX ", +" .. XX ", +" .. XX ", +" .. XX ", +" "}; Index: external/mit/ctwm/dist/xpm/nt2.xpm =================================================================== RCS file: external/mit/ctwm/dist/xpm/nt2.xpm diff -N external/mit/ctwm/dist/xpm/nt2.xpm --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/xpm/nt2.xpm 3 Sep 2015 12:20:01 -0000 @@ -0,0 +1,26 @@ +/* XPM */ +static char * nt2_xpm[] = { +"20 18 3 1", +" c #000000000000", +". c #00000000FFFF", +"X c #FFFFFFFF0000", +" ", +" .. XX ", +" .. XX ", +" .. XX ", +" .. XX ", +" .. XX ", +" .. XX ", +" .. XX ", +" .. XX", +" .. XX", +" .. XX ", +" .. XX ", +" .. XX ", +" .. XX ", +" .. XX ", +" .. XX ", +" .. XX ", +" "}; + + Index: external/mit/ctwm/dist/xpm/pixmap.xpm =================================================================== RCS file: external/mit/ctwm/dist/xpm/pixmap.xpm diff -N external/mit/ctwm/dist/xpm/pixmap.xpm --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/xpm/pixmap.xpm 3 Sep 2015 12:20:02 -0000 @@ -0,0 +1,58 @@ +/* XPM */ +static char * pixmap_xpm[] = { +"64 38 17 1", +" s None c None", +". c tan", +"X c blue", +"o c #8B8B5B5B7A7A", +"O c gray70", +"+ c red", +"@ c black", +"# c yellow", +"$ c green", +"% c peachpuff4", +"& c gray50", +"* c violet", +"= c gray100", +"- c gray85", +"; c cyan", +": c #727277778585", +"? c gray30", +" ", +" ", +" ................. ", +" ......................... ", +" .............XXXXXX........... ", +" oO .......++++++....XXXXXXXXX......... ", +" @ooOO .......++++++++....XXXXXXXXX.......... ", +" @@ooOO ........++++++++........XXX............. ", +" @@ooOO ........................................... ", +" @@ooOO....####.........................$$$....... ", +" @oooOO######....................$$$$$$$$$$$.... ", +" @@oooOO####....................$$$$$$$$$$$.... ", +" ..@@oooO#........................$$$$$$$$$.... ", +" ....@oooOO.................................... ", +" %&....@@oooOO................................. ", +" %&&&....@@oooOO............................... ", +" %%&&&&&....@@oooOO...............**........... ", +" %...&&&&& @ooooOO.........*********......%% ", +" %%....&&&&& @@ooooO.......**********.....%% ", +" %......&&&&&...@@oooOO.....***********...%% ", +" %%.......&&&&&...@@oo=--....*********..%% ", +" ..........&&&&;;;@-===--............%% ", +" ...............&&&&&;@--===--.........%% ", +" ...........@@@.......&&&&&;@--===--.....%%% ", +" ........@@@@@@@@@.......&&&&&;@-====--..%% ", +" ......@@@@@@@@@@@.........&&&&&@--====-- :::::: ", +" %.......@@@@@@@@@@.............&&&@--===:?OO---O: ", +" %................................&&&@-==:?O????:::: ", +" %..............................%%%%% :@::?????:?--:: ", +" %%%......................%%%%%%%%% :????OO::--:: ", +" %%%%%.......%%%%%%%%%%%%%%% ???????O::::O ", +" %%%%%%%%%%%%%%%%%%% ????::???O::::O ", +" ????:::::??O:::: ", +" ???????:OOO:OOO: ", +" ????????::: ", +" ", +" ", +" "}; Index: external/mit/ctwm/dist/xpm/postit.xpm =================================================================== RCS file: external/mit/ctwm/dist/xpm/postit.xpm diff -N external/mit/ctwm/dist/xpm/postit.xpm --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/xpm/postit.xpm 3 Sep 2015 12:20:02 -0000 @@ -0,0 +1,48 @@ +/* XPM */ +static char * postit_xpm[] = { +"64 38 7 1", +" s None c None", +". c #727277778585", +"X c dark olive green", +"o c yellow", +"O c gray50", +"+ c dark slate grey", +"@ c red", +" ", +" .. ", +" X .oo. ", +" XX ..oo.. ", +" X XX ...ooooo.. ", +" XXXXXXXXXXooX ...oooooooo... ", +" XooooooooooX .ooooooooooooo....... ", +" XooooooooooX .ooooooooooooooooooo. OOO ", +" XooooooooooX .ooooooooooooooooo.OoooOOOOO ", +" XooooooooooX ..oooooooooooooooo.oooooooooOOOO ", +" XooooooooooX .oooooooooooooooo.ooooooooooooOOOO ", +" XooooooooooX .ooooooooooooooo.oooooooooooooooOOOO ", +" XooooooooooX .ooooooooooooooo.oooooooooooooooooo.. ", +" XXoooooooooXX OOOOO.oooooooooooooo..oooooooooooooooo... ", +" XooooooooooX XOOooo.oooooooooooooo.ooooooooooooooo.O.++ ", +" XXoooooooooXX X OOooo...oooooooooooo..ooooooooooooO..++@ ", +" XXXXoXXXXXXX X OOoooo..oooooooooooo..oooooooooO..++@ ", +" XXX XX XX OOooooo....oooooo...oooooooooO...+@@ ", +" XX OOooooooo......ooooooooooo....++@ ", +" XoX OOOoooooooooooooooooooo....++@@ ", +" XXoX ..oooooooooooooooooo..o.++@@ ", +" XXooX O.oo.oooooooooooooo...ooO.+@@ ", +" XXXXX XXXXXooooX O.oooo..ooooooooo...ooooO.++@@ ", +" XooooXXXooooooooXX O.ooooooo...ooo...oooooo.O++@@ ", +" XXoooooooooooooooX O.ooooooooooo...oooooooooO++@@@ ", +" XXooooooooooooooX .ooooooooooooooooooooooo..+@@@ ", +" XooooooooooooooX +OOoooooooooooooooooooo..++@@ ", +" XooooooooooooooX @+++OOooooooooooooooooo..++@@ ", +" XooooooooooooooXX @@+++OOooooooooooooooo.++@@@ ", +" XooooooooooooooX @@@+++OOoooooooooooo..+@@@ ", +" XooooooooooooooX @@@@+++OOooooooooo.O+@@@ ", +" XooooooooooooooX @@@@@+++..oooooo.O++@@ ", +" XooooooooooooooXX @@@@@++++..ooooO++@@@ ", +" XoooooooooooooooX @@@@@@++++..o..+@@@ ", +" XoooooooooooooooX @@@@@@@++++..+@@@ ", +" XXoXXXXXXXXoooooX @@@@@@@+++++@@ ", +" XX XXXXXXX @@@@@@@++@@@ ", +" XX @@@@@@@@@ "}; Index: external/mit/ctwm/dist/xpm/skull.xpm =================================================================== RCS file: external/mit/ctwm/dist/xpm/skull.xpm diff -N external/mit/ctwm/dist/xpm/skull.xpm --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/xpm/skull.xpm 3 Sep 2015 12:20:02 -0000 @@ -0,0 +1,25 @@ +/* XPM */ +static char * pirate_xpm[] = { +/* width height ncolors chars_per_pixel */ +"16 16 3 1", +/* colors */ +" c peru", +". c peach puff", +"X c black", +/* pixels */ +" ... XXX ", +" .. XX ", +" .. XX ", +" . .. .. X ", +" . .X .X X ", +" .. XX ", +" .. XX ", +"... .. XX .. ", +". X . X . X", +". X . X . X", +" . X.. X.. X ", +" . XXXX X ", +" .XX XX. ", +" . . ", +". XXXXXXXX X", +". XXXX XXXX X"}; Index: external/mit/ctwm/dist/xpm/spider.xpm =================================================================== RCS file: external/mit/ctwm/dist/xpm/spider.xpm diff -N external/mit/ctwm/dist/xpm/spider.xpm --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/xpm/spider.xpm 3 Sep 2015 12:20:02 -0000 @@ -0,0 +1,72 @@ +/* XPM */ +static char * spider [] = { +"64 63 6 1", +" s None c None", +". c peru", +"X c #4D4D57575E5E", +"o c #C7C7B6B6A4A4", +"O c #6C6C62625959", +"+ c darkOliveGreen1", +" ", +" . ", +" . .. . .. ", +" ... . .. . .. . ", +" . .. .. .. .. . ", +" . .. .. .. ... . . ", +" . . .. .. . .. . .. ", +" . . ... .. .. ... . . ", +" . . .... . Xoooo.OOo .. . . ", +" . . ...Xo......OO. . . ", +" . ............... Xoo.......OO............... . ", +" . . .Xoo.......XO .. .. ", +" .. . ....XXo.......OO... .. . ", +" . . .. ooooo..ooOOOX ... . . ", +" .. . .. ooX......oooOOX .... . . . ", +"++ . + . ++ ... oo.....X....oXXOX ... + . + . . +", +" . . . ... + oX.....XX....ooXOO + + + . . . ", +" . . . .. + o......X......ooXOX + + + + ... . . .", +". .. . ... + + .o....XXXXXX....o.OX + + . . .. ", +" . . .. +++ oo...XX.X..X....o.OO + + + . .. . ", +" . . . + ++ + o.......X.......ooXO + + + . . . ", +" . . . + + + o.......X.......ooXO + ++ ++ +++ . + .. .. ", +"+ .. .. . + + + ++ o.......X.......o.XO + + . . . ", +" . . . + + + o.......X......ooOOO + + . + . . ", +"+ .. . + + ++ +oo......X......oOOOX ++++ + + . . ", +"+ . . + + + oo.....X.....ooOOO + ++++ . + + . + ", +" .. + . + + ++ oo........oo.OOO + + + . . ", +"++ . . + + ooooooooooOOOO + ++ + + . .. ", +" . + . + ++ + + ooOOOOOOOOO + ++ . . ", +" . + . ++ + + + + ++ + . + .. ", +"+ . . + ++ + ++ + + ++ + ++ +++ . . ", +" . . + + + + ++ ++ + + . + ", +" . + + + + + + . + + ", +" ++ . + +++ + + + . ++ ", +" ++ . ++ + ++ + +++ + + + + . ++ ", +" + . + + + + + + . + +", +" + . + + ++ + +++ + ++ + . ", +"++ . + + + + + + + . ++ ", +" ++ . + ++ + . ", +" + . ++ +++ + + +++ + . + ", +" + . + ++ + + + + ", +" + + ++ + + ++ + ", +" + + + + + ++ + + + +", +" + + + + ++ + + + ", +" + + + + + +++++ ++ + ", +" +++ ++ + + ++ + + ", +" + +++ + + + ", +" ++ + + + + + ", +" + + + + ++ + + ", +" + + + + ++ ", +" + + + + + + ", +" + + + ++ ++ + ++ + ", +"+ +++ ++ +++ ++ +++ + + ", +" ++ + + + +++ + + ++ ", +" ++ + + ++ +", +" ++ + + ++ ", +" + + + +++ ", +" + + + + ", +" + + + + ", +" + + ++++ + +++ + + ", +" + + ++ +++ + + ", +" + ++ ++ + ", +" + + "}; Index: external/mit/ctwm/dist/xpm/supman1.xbm =================================================================== RCS file: external/mit/ctwm/dist/xpm/supman1.xbm diff -N external/mit/ctwm/dist/xpm/supman1.xbm --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/xpm/supman1.xbm 3 Sep 2015 12:20:02 -0000 @@ -0,0 +1,64 @@ +#define supman1_width 200 +#define supman1_height 29 +static char supman1_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x0f, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x1f, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xe8, 0xff, 0x1f, 0x00, 0x00, 0x00, 0xf0, 0x1f, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x40, 0x00, 0xe0, 0xff, 0x07, 0x00, 0xf0, 0x31, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0xf8, 0xff, 0x7f, 0x19, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0xff, 0xff, 0xff, 0x07, 0xfc, 0x4f, + 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, + 0x3f, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00, 0x80, 0xd0, + 0xff, 0xff, 0x11, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfb, 0x7b, 0x80, 0xff, + 0xd1, 0xff, 0xff, 0x7f, 0x80, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xc7, 0x87, 0xff, + 0xff, 0xd1, 0xff, 0xff, 0xff, 0x7f, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x50, 0xc5, + 0xff, 0xff, 0xd1, 0xff, 0xff, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0xff, + 0xcb, 0xff, 0xf3, 0xf1, 0xff, 0xff, 0xff, 0xff, 0x02, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, + 0x00, 0xfc, 0xfb, 0xff, 0xd4, 0xfb, 0xff, 0xff, 0xff, 0x0d, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xfc, 0xff, 0xf7, 0xdf, 0xf0, 0x07, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x2f, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00}; Index: external/mit/ctwm/dist/xpm/supman2.xbm =================================================================== RCS file: external/mit/ctwm/dist/xpm/supman2.xbm diff -N external/mit/ctwm/dist/xpm/supman2.xbm --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/xpm/supman2.xbm 3 Sep 2015 12:20:02 -0000 @@ -0,0 +1,64 @@ +#define superman2_width 200 +#define superman2_height 29 +static char superman2_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x0f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, + 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe8, 0xff, 0x1f, 0x00, 0x00, 0x00, + 0xf0, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0xe0, 0xff, 0x07, + 0x00, 0xf0, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, + 0xf8, 0xff, 0x7f, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0xff, 0xff, + 0xff, 0x07, 0xfc, 0x4f, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xff, 0xff, 0x3f, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, + 0x00, 0x00, 0x80, 0xd0, 0xff, 0xff, 0x11, 0x00, 0x07, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, + 0xfb, 0x7b, 0x80, 0xff, 0xd1, 0xff, 0xff, 0x7f, 0x80, 0x0e, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xa0, 0xc7, 0x87, 0xff, 0xff, 0xd1, 0xff, 0xff, 0xff, 0x7f, 0x01, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x60, 0x50, 0xc5, 0xff, 0xff, 0xd1, 0xff, 0xff, 0xff, 0xff, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x80, 0xff, 0xcb, 0xff, 0xf3, 0xf1, 0xff, 0xff, 0xff, 0xff, + 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xfb, 0xff, 0xd4, 0xfb, 0xff, 0xff, + 0xff, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xff, 0xf7, 0xdf, + 0xf0, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, + 0x2f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00}; Index: external/mit/ctwm/dist/xpm/supman3.xbm =================================================================== RCS file: external/mit/ctwm/dist/xpm/supman3.xbm diff -N external/mit/ctwm/dist/xpm/supman3.xbm --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/xpm/supman3.xbm 3 Sep 2015 12:20:02 -0000 @@ -0,0 +1,64 @@ +#define superman3_width 200 +#define superman3_height 29 +static char superman3_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xf8, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xfc, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfd, 0xff, 0x03, + 0x00, 0x00, 0x00, 0xfe, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, + 0xfc, 0xff, 0x00, 0x00, 0x3e, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, + 0x00, 0x00, 0x00, 0xff, 0xff, 0x2f, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xe4, 0xff, 0xff, 0xff, 0x80, 0xff, 0x09, 0x02, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0x07, 0x04, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x80, 0x03, 0x00, 0x00, 0x10, 0xfa, 0xff, 0x3f, 0x02, 0xe0, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x78, 0x7f, 0x0f, 0xf0, 0x3f, 0xfa, 0xff, 0xff, 0x0f, 0xd0, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xf4, 0xf8, 0xf0, 0xff, 0x3f, 0xfa, 0xff, 0xff, 0xff, + 0x2f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x0c, 0xaa, 0xf8, 0xff, 0x3f, 0xfa, 0xff, 0xff, + 0xff, 0x9f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x7f, 0xf9, 0x7f, 0x3e, 0xfe, 0xff, + 0xff, 0xff, 0x5f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x7f, 0xff, 0x9f, 0x7a, + 0xff, 0xff, 0xff, 0xbf, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, + 0xff, 0xfe, 0x1b, 0xfe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xf0, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00}; Index: external/mit/ctwm/dist/xpm/supman4.xbm =================================================================== RCS file: external/mit/ctwm/dist/xpm/supman4.xbm diff -N external/mit/ctwm/dist/xpm/supman4.xbm --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/xpm/supman4.xbm 3 Sep 2015 12:20:02 -0000 @@ -0,0 +1,64 @@ +#define superman4_width 200 +#define superman4_height 29 +static char superman4_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, + 0xff, 0x7f, 0x00, 0x00, 0x00, 0xc0, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x01, 0x80, 0xff, 0x1f, 0x00, 0xc0, 0xc7, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x02, 0x00, 0x00, 0xe0, 0xff, 0xff, 0x65, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x80, 0xfc, 0xff, 0xff, 0x1f, 0xf0, 0x3f, 0x41, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xff, 0xff, 0x80, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0x42, 0xff, 0xff, 0x47, + 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xef, 0xef, 0x01, 0xfe, 0x47, 0xff, 0xff, + 0xff, 0x01, 0x3a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x1e, 0x1f, 0xfe, 0xff, 0x47, 0xff, + 0xff, 0xff, 0xff, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x41, 0x15, 0xff, 0xff, 0x47, + 0xff, 0xff, 0xff, 0xff, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x2f, 0xff, 0xcf, + 0xc7, 0xff, 0xff, 0xff, 0xff, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xef, + 0xff, 0x53, 0xef, 0xff, 0xff, 0xff, 0x37, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xf0, 0xff, 0xdf, 0x7f, 0xc3, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00}; Index: external/mit/ctwm/dist/xpm/supman5.xbm =================================================================== RCS file: external/mit/ctwm/dist/xpm/supman5.xbm diff -N external/mit/ctwm/dist/xpm/supman5.xbm --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/xpm/supman5.xbm 3 Sep 2015 12:20:02 -0000 @@ -0,0 +1,64 @@ +#define superman5_width 200 +#define superman5_height 29 +static char superman5_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x07, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x0f, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xf4, 0xff, 0x0f, 0x00, 0x00, 0x00, 0xf8, 0x0f, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x20, 0x00, 0xf0, 0xff, 0x03, 0x00, 0xf8, 0x18, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0xfc, 0xff, 0xbf, 0x0c, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, 0xff, 0xff, 0xff, 0x03, 0xfe, 0x27, + 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, + 0x1f, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x40, 0xe8, + 0xff, 0xff, 0x08, 0x80, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xfd, 0x3d, 0xc0, 0xff, + 0xe8, 0xff, 0xff, 0x3f, 0x40, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd0, 0xe3, 0xc3, 0xff, + 0xff, 0xe8, 0xff, 0xff, 0xff, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0xa8, 0xe2, + 0xff, 0xff, 0xe8, 0xff, 0xff, 0xff, 0x7f, 0x02, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, + 0xe5, 0xff, 0xf9, 0xf8, 0xff, 0xff, 0xff, 0x7f, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xfe, 0xfd, 0x7f, 0xea, 0xfd, 0xff, 0xff, 0xff, 0x06, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xfb, 0x6f, 0xf8, 0x03, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x17, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00}; Index: external/mit/ctwm/dist/xpm/supman6.xbm =================================================================== RCS file: external/mit/ctwm/dist/xpm/supman6.xbm diff -N external/mit/ctwm/dist/xpm/supman6.xbm --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/xpm/supman6.xbm 3 Sep 2015 12:20:02 -0000 @@ -0,0 +1,64 @@ +#define superman6_width 200 +#define superman6_height 29 +static char superman6_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x80, 0xfe, 0xff, 0x01, 0x00, 0x00, 0x00, 0xff, + 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0xfe, 0x7f, 0x00, 0x00, + 0x1f, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x80, 0xff, + 0xff, 0x97, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf2, 0xff, 0xff, 0x7f, + 0xc0, 0xff, 0x04, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xf0, 0xff, 0xff, 0x03, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x01, 0x00, + 0x00, 0x08, 0xfd, 0xff, 0x1f, 0x01, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbc, 0xbf, + 0x07, 0xf8, 0x1f, 0xfd, 0xff, 0xff, 0x07, 0xe8, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7a, + 0x7c, 0xf8, 0xff, 0x1f, 0xfd, 0xff, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x06, 0x55, 0xfc, 0xff, 0x1f, 0xfd, 0xff, 0xff, 0xff, 0x4f, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xf8, 0xbf, 0xfc, 0x3f, 0x1f, 0xff, 0xff, 0xff, 0xff, 0x2f, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xc0, 0xbf, 0xff, 0x4f, 0xbd, 0xff, 0xff, 0xff, 0xdf, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0x7f, 0xff, 0x0d, 0x7f, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x02, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00}; Index: external/mit/ctwm/dist/xpm/supman7.xbm =================================================================== RCS file: external/mit/ctwm/dist/xpm/supman7.xbm diff -N external/mit/ctwm/dist/xpm/supman7.xbm --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/xpm/supman7.xbm 3 Sep 2015 12:20:02 -0000 @@ -0,0 +1,64 @@ +#define supman7_width 200 +#define supman7_height 29 +static char supman7_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, + 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xc0, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd0, 0xff, 0x3f, 0x00, 0x00, + 0x00, 0xe0, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0xc0, 0xff, + 0x0f, 0x00, 0xe0, 0x63, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, + 0x00, 0xf0, 0xff, 0xff, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0xfe, + 0xff, 0xff, 0x0f, 0xf8, 0x9f, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xfe, 0xff, 0x7f, 0x40, 0x00, 0x0e, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x00, 0x00, 0x00, 0xa1, 0xff, 0xff, 0x23, 0x00, 0x1d, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0xf7, 0xf7, 0x00, 0xff, 0xa3, 0xff, 0xff, 0xff, 0xff, 0x02, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x40, 0x8f, 0x0f, 0xff, 0xff, 0xa3, 0xff, 0xff, 0xff, 0xff, 0x09, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xc0, 0xa0, 0x8a, 0xff, 0xff, 0xa3, 0xff, 0xff, 0xff, 0xff, + 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xff, 0x97, 0xff, 0xe7, 0xe3, 0xff, 0xff, 0xff, + 0xff, 0x1b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xf7, 0xff, 0xa9, 0xf7, 0xff, + 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, 0xef, + 0xbf, 0xe1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x5f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00}; Index: external/mit/ctwm/dist/xpm/supman8.xbm =================================================================== RCS file: external/mit/ctwm/dist/xpm/supman8.xbm diff -N external/mit/ctwm/dist/xpm/supman8.xbm --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/xpm/supman8.xbm 3 Sep 2015 12:20:02 -0000 @@ -0,0 +1,64 @@ +#define supman8_width 200 +#define supman8_height 29 +static char supman8_bits[] = { + 0x00, 0xf0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xf8, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xfc, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfa, 0xff, + 0x07, 0x00, 0x00, 0x00, 0x7c, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, + 0x00, 0xf8, 0xff, 0x01, 0xff, 0x5f, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x20, 0x00, 0x00, 0x00, 0xfe, 0xff, 0x13, 0x04, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0xc8, 0xff, 0xff, 0xff, 0x01, 0xff, 0x0f, 0x08, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0x7f, 0x04, 0xc0, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x20, 0xf4, 0xff, 0xff, 0x1f, 0xa0, + 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0xf0, 0xfe, 0x1e, 0xe0, 0x7f, 0xf4, 0xff, 0xff, 0xff, + 0x5f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xe8, 0xf1, 0xe1, 0xff, 0x7f, 0xf4, 0xff, 0xff, + 0xff, 0x3f, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x54, 0xf1, 0xff, 0x7f, 0xf4, 0xff, + 0xff, 0xff, 0xbf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xf2, 0xff, 0x7c, 0xfc, + 0xfe, 0xff, 0xff, 0x7f, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xfe, 0x3f, + 0xf5, 0xfd, 0x37, 0xfc, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xe0, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00}; Index: external/mit/ctwm/dist/xpm/supman9.xbm =================================================================== RCS file: external/mit/ctwm/dist/xpm/supman9.xbm diff -N external/mit/ctwm/dist/xpm/supman9.xbm --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/xpm/supman9.xbm 3 Sep 2015 12:20:02 -0000 @@ -0,0 +1,64 @@ +#define supman9_width 200 +#define supman9_height 29 +static char supman9_bits[] = { + 0x00, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x40, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x80, 0x8f, 0x01, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x02, 0x00, 0x00, 0xc0, 0xff, 0xff, 0xcb, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x04, 0x00, 0xff, 0x3f, 0xe0, 0x7f, 0x82, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xf9, 0xff, 0x00, 0xf8, 0xff, 0xff, 0x01, 0x01, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x84, 0xfe, 0xff, 0x8f, + 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0xfc, 0x8f, 0xfe, 0xff, + 0xff, 0x03, 0x74, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xde, 0xdf, 0x03, 0xff, 0x8f, 0xfe, + 0xff, 0xff, 0xff, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3d, 0x3e, 0xfc, 0xff, 0x8f, + 0xfe, 0xff, 0xff, 0xff, 0x27, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x83, 0x2a, 0xfe, 0x9f, + 0x8f, 0xff, 0xff, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x5f, 0xfe, + 0xff, 0xa7, 0xde, 0xff, 0xff, 0xff, 0x6f, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, + 0xdf, 0xe0, 0xff, 0xbf, 0xff, 0x86, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00}; Index: external/mit/ctwm/dist/xpm/term.xpm =================================================================== RCS file: external/mit/ctwm/dist/xpm/term.xpm diff -N external/mit/ctwm/dist/xpm/term.xpm --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/xpm/term.xpm 3 Sep 2015 12:20:02 -0000 @@ -0,0 +1,48 @@ +/* XPM */ +static char * term [] = { +"64 38 7 1", +" c none s mask", +". c black", +"X c gray85", +"o c gray70", +"O c blue", +"+ c gray100", +"@ c gray50", +" ", +" ....................... ", +" .XXXXXXXXXXXXXXXXXXXXXX.. ", +" .XXXXXXXXXXXXXXXXXXXXXX.X. ", +" .oooooooooooooooooooooo.XX. ", +" ......................o.oXX. ", +" .........................oXX. ", +" ...OOOOOOOOOOOOOOOOOOOO...oXX. ", +" ..OOOOOOOOOOOOOOOOOOOOOO..oXX. ", +" ..OO+++++++++++OOOOOOOOO..oXX. ", +" ..OOOOOOOOOOOOOOOOOOOOOO..oXX. ", +" ..OO++++++++++++++++OOOO..oXX. ", +" ..OOOOOOOOOOOOOOOOOOOOOO..oXX. ", +" ..OO+++OOOOOOOOOOOOOOOOO..oXX. ", +" ..OOOOOOOOOOOOOOOOOOOOOO..oXX. ", +" ..OO++++++++O++OO+OOOOOO..oXX. ", +" ..OOOOOOOOOOOOOOOOOOOOOO..oXX. ", +" ..OO+++++++++OOOOOOOOOOO..oXX. ", +" ..OOOOOOOOOOOOOOOOOOOOOO..oXX. ", +" ..OO++++OOOO+++OOO++++OO..oX. ", +" ..OOOOOOOOOOOOOOOOOOOOOO..o.. ", +" ..OO+OOOOOOOOOOOOOOOOOOO... . ", +" ...OOOOOOOOOOOOOOOOOOOO... . ", +" ........................ . ", +" ...................... . ", +" ooooooo . ", +" oooooooooooooooooooooooooooooo . ", +" ooo.....ooooooooo.....oo...ooo . ", +" ooooooooooooooooooooooo.ooo.oo . ", +" ..............................oo.o . ", +" .+@+@+@+@+@+@+@+@+@+@+@+@+@@@.oooo.. ", +" .@@@@@@@@@@@@@@@@@@@@@@@@@@@@. ", +" .@@+@+@+@+@+@+@+@+@+@+@+@+@@@. ", +" .@@@@@@@@@@@@@@@@@@@@@@@@@@@@. ", +" .@@@@@@@@@@@@@@@@@@@@@@@@@@@@. ", +" ............................. ", +" ", +" "}; Index: external/mit/ctwm/dist/xpm/unknown.xpm =================================================================== RCS file: external/mit/ctwm/dist/xpm/unknown.xpm diff -N external/mit/ctwm/dist/xpm/unknown.xpm --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/xpm/unknown.xpm 3 Sep 2015 12:20:02 -0000 @@ -0,0 +1,53 @@ +/* XPM */ +static char * claude_xpm[] = { +"64 38 12 1", +" s None c None", +". c black", +"X c peachpuff4", +"o c #727277778585", +"O c gray100", +"+ c tan", +"@ c lightyellow", +"# c red", +"$ c wheat", +"% c gray85", +"& c cornflower blue", +"* c lightskyblue", +" .XXXXXXXXX. oOOOOOOOOOOOOOOOo ", +" ...+++++++++XXX. oOOOOOOOOOOOOOOOOOo ", +" ++++@@@+++@@+XXX. oOOO#OOO#OOO#OOO#OOoo ", +" ++$@@@++@++@@@++XXX. oOOOO#OOO#OOOOOOO#OOOo ", +" ++X@@@@@++@@@@@@.++X. oOOOO#OOO#OO##OOO#OOOOo ", +" +X@@@@@++++@@@@@@.+XX oOOOO#####OOO#OOO#OOOoo ", +" X+@@@@@@@+++@@@@@@@X+X+ oOOOO#OOO#OOO#OOO#OOOo ", +" +++@@@@@@+++@@@@@@@@.+XX oOOOO#OOO#OOO#OOOOOOOoooo ", +" ++X.@@@@@@++@@@@@@@@@.++X oOOOO#OOO#OO###OO#OOOOOO o ", +" X+X@@@@@@@@@@@@@@@@@@@.++.oOOOOOOOOOOOOOOOOOOOOOOOOooo ", +" XX.@@@@@@@@@@@@@@@@@@@@+XXooOOOOOOOOOOOOOOOOOOOOOOOOOoo ", +" XX@@@@@@@@@@@@@@@@@@@@@+XX oOOO###OOOOOOOOOOOOOOOOOOOOo ", +" +XX@@@@@@@@@@@@@@@@@@@@@XXXXoOOOO#OOOOOOOOOOOOOOOOOOOOOo ", +" XXX@@@+++@@@@@++++@@@@@@@+XXooOOO#OOOOOO###OO##O#OOOOOOo ", +" XXX@......@@@@.......@@...XX oOOO#OOOOOOOOO#O#O#O#OOOOOo ", +" XXX%%%%%%%@@@@%%%%%%%@..@.XX oOOO#OOOOOO####O#O#O#OOOOOo ", +" XXX%%%XX%.@.@.%XX%%%%.@@@XXX oOOO#OOOOO#OOO#O#O#O#OOOOoo ooo ", +" XX.%%%XX%.@@@.%XX%%%%.@@@XX. oOO###OOOOO####O#OOO#OOOOooooOooo ", +" XX@%%%%%%.@@@.%%%%%%..@@@.X oOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoo", +" .X...%%...@@@@.%%%%..@@@@@@.OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOo", +" .@@....@@@@@@@....@@@@@.@.O###OOO##OOOOOOOOOOOOOOOOOOO#OOOOOOO", +" ..@@@@@@@@@@@@@@@@@@@@@.@O#OOO#OOO#OOOOOOOOOOOOOOOOOOO#OOOOOOO", +" .@@@@@@@@@@@@@@@@@@@@. O#OOOOOOO#OOOO###OO#OOO#OO##O#OO###OO", +" .@@@@@@.....@@@@@@@@@...#OOOOOOO#OOOOOOO#O#OOO#O#OO##O#OOO#O", +" .@@@@@@...@@@@.@@@@....#OOOOOOO#OOOO####O#OOO#O#OOO#O#####O", +" .@@..@@@@@@@@...@@@...O#OOO#OOO#OOO#OOO#O#OO##O#OO##O#OOOOO", +" O.@@.........@@@@@.%..OO###OOO###OOO####OO##O#OO##O#OO###OO", +" ..@@@@@@@@@@@@@@@.%%..OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOo", +" .&.@@@@....@@@@@.%%.&..OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO ", +" ...&&.@@@@@@@@@@..%%%.&....OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOo ", +".......&&..@@@@@@..%%%%.&&&&&.....OooooooOOOOOOOOOOOOOOOOOoooo ", +".&&&&&..&.%......%%%%...&&&..&&&&... oooOOOOOOOOOOOooooo ", +"&&&&&&..&&.%%%%%%%%%..&&&&&.&&&&&&&... oooooooooooo ", +"&&&&&&&&.&&..%%%%%%..$&&...&.&&&&&&&&... ", +"&&&&&&&&.&&&..%%%%..&&&$.$.&.****.&&.&... ", +"&&&&&*&&&.&&&..%%..$&&&.$&&..*****..&&&.. ", +"&*&&***&&..$&&....*&&&.*&&..*****..&&&&&. ", +"&*********..***...***.**&..******.&&.***. "}; Index: external/mit/ctwm/dist/xpm/unknown1.xpm =================================================================== RCS file: external/mit/ctwm/dist/xpm/unknown1.xpm diff -N external/mit/ctwm/dist/xpm/unknown1.xpm --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/xpm/unknown1.xpm 3 Sep 2015 12:20:02 -0000 @@ -0,0 +1,59 @@ +/* XPM */ +static char * unknown_xpm[] = { +"48 48 8 1", +" s None c none", +". c black", +"X c yellow", +"o c deeppink", +"O c midnightblue", +"+ c deepskyblue3", +"@ c firebrick", +"# c tan", +" ", +" ", +" ........ ", +" ....XXXXXX... ", +" ..XXXX.......... ", +" ..XX............... ooo ", +" ..XX................. o o ", +" ..XX................... o ", +" . ..XX...... ........ o ", +" ... ..XX..... ....... o ", +" . .XX..... ...... o ", +" .X..... ...... ", +" ... .X..... OO ...... o ", +" ... ..X... OOOO ...... ", +" ... .... OO O ...... ", +" ... OO ...... ", +" ... OO ....... ", +" ... OO ........ ", +"... ..X..... +++ ", +".. OO ..XX..... + + ", +".. .. OO ..XX..... + ", +".. .. ..XX...... + ", +"... .. ..XX...... + ", +"... ... ...XX...... + ", +" ........ ..XXX...... ", +" ...... ..XX....... + ", +" ... ..XX....... @ ", +" .XX...... @@@ ", +" ..X..... @ ", +" .XX.... ", +" .X.... ", +" ### .X.... @@@ ", +" # # .X.... @@@ ", +" # .X.... @@@ ", +" # .X.... @@@ ", +" # .X.... @@@ ", +" ... # ...... @@@ ", +" . . .... @@@ ", +" . # @@ ", +" . @@ @@ ", +" . .... @@ @@ ", +" . .XX... @@@ @@ ", +" .X.... @@@ @@@ ", +" . .X.... @@@@@@@@ ", +" ...... @@@@@@ ", +" .... @@@ ", +" ", +" "}; Index: external/mit/ctwm/dist/xpm/unread.xpm =================================================================== RCS file: external/mit/ctwm/dist/xpm/unread.xpm diff -N external/mit/ctwm/dist/xpm/unread.xpm --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/xpm/unread.xpm 3 Sep 2015 12:20:02 -0000 @@ -0,0 +1,55 @@ +/* XPM */ +static char * xrn_xpm[] = { +/*blue*/ +"64 38 13 1", +" s None c None", +". c blue", +"X c green", +"o c orange red", +"O c light sky blue", +"+ c cyan", +"@ c violet", +"# c gray", +"$ c #727277778585", +"% c yellow", +"& c gray70", +"* c gray85", +"= c navy", +" ..... ", +" ............. ", +" ................. ", +" ................... ", +" ....................... ", +" .XX....XX.............oo. ", +" .XXX....XXX............ooo. ", +" .XXX....XXX...........oooo. ", +" .XXXX...XXXX...........ooooo. ", +" .XXXXXX..XXX............oooooo. ", +" .XXXXXXX.XX......X...ooooooooo. ", +" .XXXXXXXX.........XXX.oooooooooo. ", +" .XXXXXXX..........XXXOOOoooooooo. ", +" .XXXXXX..........XXXOOOOooX++++X. ", +" .XXXXXX..........XXXOOOOXX+++++X. ", +" .XXX.XXX..........XXOOOOOXX+++++... ", +" .X...XX............XO.@@OXX+++XXXX. ", +" #####..............X....X..@@XXX+++XXXX. ", +" ### #$$$$$..............XX......@@@XXX+XXXXX. ", +" $$$# #$$ .X.............XXX....@@@XXXXXXXXX. ", +" $# $## #$ ..............XX..o@@@@@XXXX...X. ", +" $# $$$#$$ .X...........XXX.oo@@@%%XXX...... ", +" $$ $$$ .XX.............oooo%%%%XXXXX.... ", +" $# .XX.............ooooo%ooXXXXXX... ", +" $# .XXX...........oooooooo....XXX. ", +" $$#######$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ", +" $$$$$$$$&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&$$ ", +" $$&&***********=====**********===**=*=*=*=$$$ ", +" $&&&&==============================*=*====$$$$ ", +" $&&****************************=&*=*=*=&&&$$$$$ ", +" $&&&============================&&*=*=*=&&$$$$$ ", +" $&&**=*************************=&&*=*=*=&&$$$$$=== ", +" $$&&&============================&&*=*=*=&&$$$$==== ", +" $&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&$$$$==== ", +" $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$=== ", +" $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$==== ", +" $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$=== ", +" =========================================== "}; Index: external/mit/ctwm/dist/xpm/welcome.xpm =================================================================== RCS file: external/mit/ctwm/dist/xpm/welcome.xpm diff -N external/mit/ctwm/dist/xpm/welcome.xpm --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/xpm/welcome.xpm 3 Sep 2015 12:20:03 -0000 @@ -0,0 +1,506 @@ +/* XPM */ +static char *ctwmflag_xpm[] = { + "621 449 53 2", + "`` c #008d55", + "`a c #492455", + "`b c #8efbfb", + "`c c #8ed7a5", + "`d c #6d6da6", + "`e c #6d49a6", + "`f c #002555", + "`g c #49b2a6", + "`h c #6db2a5", + "`i c #6db4fb", + "`j c #496ea6", + "`k c #6d8efb", + "`l c #24d7fb", + "`m c #49d7a5", + "`n c #49d7fb", + "`o c #24b3fb", + "`p c #248da5", + "`q c #246da5", + "`r c #244ba5", + "`s c #248d55", + "`t c #b2fbfb", + "`u c #24b2a4", + "`v c #d7fbfb", + "`w c #246d55", + "`x c #4a6d00", + "`y c #496d55", + "`z c #d7d7fb", + "`{ c #494955", + "`| c #49b254", + "`} m white c #ff143f", + "`~ c #6d8ea6", + "a` c #498e54", + "aa c #8ed8fb", + "ab c #8eb2fb", + "ac c #6dd7fb", + "ad c #498fa6", + "ae c #4949a6", + "af c #b2d7a6", + "ag c #49b4fb", + "ah c #6d6d55", + "ai c #2490fb", + "aj c #4990fb", + "ak c #6d4955", + "al c #8d6da6", + "am c #4970fb", + "an c #24d7a4", + "ao c #6e8e55", + "ap c #b2d8fb", + "aq c #8eb2a6", + "ar c #244a55", + "as c #6dd7a6", + "at c #b2b2fb", + "au c #8e8ea6", +"atatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatat`a", +"atatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatat`a`a", +"atatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatat`a`a`a", +"atatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatatat`a`a`a`a", +"atatatat`y`r`{`{`yar`y`r`yae`yae`{ad`jad`j`jad`j`j`jadadadadadad`w`y`j`{`wae`yae`w`y`{`y`q`y`jad`j`j`jad`j`j`{`~ad`dad`~`j`j`j`y`j`y`y`yae`j`y`w`j`j`yar`j`j`yae`y`j`w`j`j`{`wae`yae`yae`{`y`r`y`w`{`{ae`y`j`{`w`{ae`y`jar`j`{`w`yae`y`j`{`jar`yae`yae`yae`y`{ae`y`r`y`r`y`{ar`j`{`w`yae`w`y`j`y`q`{`y`y`wae`y`q`y`{`j`j`y`j`{`j`{`y`{`j`ja`ad`yad`j`y`j`y`y`{`y`q`y`y`j`y`q`y`j`yadaj`gad`jad`qad`ja`ad`j`y`j`w`j`yad`w`j`j`s`j`jad`p`y`jad`jadadadadag`gadad`gadadajad`padadadadadada``jadadad`jad`gadadadadadagadadad`j`y`j`w`j`j`w`j`yae`w`j`j`yae`y`j`y`j`y`q`{`j`y`yae`w`j`{`{`y`j`w`{ae`j`{`y`r`y`{`yae`y`y`j`y`q`y`yae`wae`y`j`w`{`yae`y`wae`w`j`y`r`y`j`{`j`y`yae`w`{`y`j`{`j`{`w`y`jar`j`{`j`y`{`q`{`j`j`{`yae`y`j`w`j`y`{ae`y`q`{`j`y`y`{`j`qa``j`j`j`y`j`{`y`{`j`{`w`y`j`w`{`j`w`j`y`j`y`wae`{`jar`j`y`w`j`y`{`yae`y`y`j`y`j`y`{`j`y`jar`j`{`y`{`j`wae`y`y`r`y`jar`yae`y`{`q`y`{`j`{`y`j`y`r`y`j`y`y`j`j`y`jad`j`jadad`jad`y`j`j`w`yae`w`{`wae`w`y`yae`w`y`yae`y`y`j`j`y`j`y`q`y`y`j`y`y`j`{`j`w`j`y`j`y`j`y`y`j`y`j`y`j`jad`yadad`j`jad`ja``j`y`ja``j`j`j`j`y`j`j`y`j`w`j`yae`w`j`{`j`y`j`y`y`j`y`j`y`j`y`jar`y`d`q`{`j`y`j`{`j`y`j`y`y`j`j`y`y`j`j`yah`j`{`y`j`{`y`y`j`y`y`j`yah`j`y`dad`dad`~adao`j`~ad`jad`~ad`~ad`~ad`dad`~ad`~ad`~ad`~`~`~`~ad`~ad`~ad`~ad`~`~ad`a`a`a`a", +"atatatat`{`{`y`jae`{`{`y`yar`y`jad`yad`w`y`ja`ad`yadad`~ad`g`j`y`y`{`yae`yar`y`{ae`wae`{`y`y`y`y`g`jaoadao`jad`~adadada``jad`y`j`j`j`w`y`j`y`{`{`y`y`j`{`{`y`y`q`{`y`y`j`w`y`j`yar`yar`y`y`wae`{`yae`w`yar`yae`y`{`w`{`y`{`q`y`j`{`w`{`y`r`y`y`r`y`{`wae`y`wae`y`y`y`j`{`y`y`{`wae`y`{`j`wae`w`y`yaear`y`{`{`j`y`wae`y`{ar`y`jar`j`{`y`y`j`y`j`yad`j`y`{`j`y`w`{`yae`y`{`w`j`y`w`j`yadad`gadadad`y`j`y`q`y`j`y`j`y`ja``j`y`y`j`y`j`yad`j`yadadadad`gagadad`gajad`gadadadad`y`jada`ad`jadadadadadadadadadadadad`g`gad`gadad`j`y`j`y`y`j`w`j`y`{`w`y`y`y`q`y`y`q`{`y`q`{`j`w`{`y`w`j`{ar`yae`y`w`{`j`y`y`r`y`{`wae`yar`j`{`j`w`y`j`y`{`yae`w`j`yae`y`yae`w`y`y`{`w`j`wae`y`y`j`{`w`j`w`yae`yar`y`yar`yar`j`y`{`w`{`w`yae`w`y`yaear`y`w`j`y`y`jar`j`yar`y`j`y`q`y`j`y`q`y`j`yae`y`j`y`j`y`y`j`y`y`r`y`j`y`y`j`y`y`r`y`j`y`q`y`y`yae`y`y`{`y`j`w`{`y`{`y`yae`{`y`yae`yae`y`y`{`{`jar`y`y`j`{`w`yae`w`{`j`y`yar`{`j`w`y`j`y`w`yadad`yadad`y`y`{`q`y`j`y`j`y`{`j`{`j`{`y`j`wae`y`j`w`y`{`j`yae`y`j`y`q`y`y`j`y`j`y`q`y`w`jar`j`y`j`y`j`yad`y`jad`ja`adadadadadadad`j`yad`yad`y`j`y`y`j`y`y`y`j`y`y`q`y`yar`j`yae`w`y`y`j`{`j`y`jar`y`y`j`y`y`j`y`y`j`y`y`j`yae`y`{`yae`y`y`j`y`j`y`j`y`{`j`y`j`{`j`y`j`y`jad`yad`jadad`d`y`~a``~`jao`dad`~ad`~ad`~`~ad`h`~ad`had`~ad`h`~ad`~`~ad`haj`had`a`a`a`a", +"atatatat`y`yae`{`w`y`y`y`r`{`j`y`q`y`j`j`jad`y`jadadad`gag`y`{`yae`yae`yar`yae`{`{`y`{`{`w`y`j`y`yad`j`j`g`jadad`~ad`~adad`y`jad`y`y`j`y`{`j`w`jae`wae`y`q`y`jar`y`y`jar`y`j`w`j`y`j`{`j`w`a`j`{`yar`j`{`y`j`{ar`yaear`yae`y`{ar`j`{`j`{`y`{`w`yae`{`y`yae`y`{`jar`j`y`q`yae`wae`y`{`j`{ar`y`j`{ar`y`jae`y`j`yar`j`y`{`wae`y`j`y`y`w`j`q`{adad`j`ya``jad`j`y`q`{`j`yae`wae`y`yae`w`y`jadagadad`gad`j`p`ja``j`j`y`q`y`q`y`y`j`qad`s`j`y`qadadadajad`gadadadadadad`gadadadadadadadadad`jadadadad`gadadadadadadadadadadadadaj`yad`y`j`j`w`j`y`j`{`j`y`q`{`j`{`w`{`j`y`y`{`w`j`y`jae`yar`j`y`j`y`q`y`y`r`y`j`{`w`j`{`j`y`j`{`w`y`j`{`{`q`y`r`y`j`jar`y`r`y`j`{ae`w`j`{`j`{`w`j`{`w`j`{ae`y`w`j`{`j`{`jae`y`j`w`j`yae`y`q`y`j`{`jar`yae`yae`y`q`yae`y`wae`y`j`y`j`yadar`j`j`y`q`j`y`wae`y`w`j`j`w`j`y`j`j`yae`w`yae`y`j`y`yae`y`j`{`j`y`yae`q`{`yae`j`w`jae`w`y`{`q`y`y`{`y`{`wae`y`{`y`{`jar`yae`y`j`{`j`w`{`j`y`j`y`j`j`y`j`jad`jadad`j`yae`y`j`yae`w`{`jar`j`y`j`w`j`{`y`j`y`q`yae`j`y`w`j`y`w`y`j`y`j`j`y`q`y`j`y`j`yad`j`y`j`q`yad`j`j`yad`jad`g`iag`g`iag`~adad`jad`y`j`j`y`j`y`j`q`yae`y`w`{`j`y`j`{`w`j`y`{`j`y`y`j`j`{`y`j`y`j`y`j`j`yae`y`j`yae`w`y`j`y`j`y`j`y`j`{`y`j`y`d`y`j`j`y`j`y`j`yad`ja``dad`da``~adadad`dadad`~ad`~ad`~ad`~`had`had`~`g`kad`had`~`g`~ag`~`g`h`~`g`~`a`a`a`a", +"atatatat`yar`j`yae`{ae`y`y`{`j`y`jad`ya``j`j`ja`adaj`gadad`j`{`{ar`y`{`{`{`w`yar`jar`y`{`{aear`j`y`j`yad`yadadad`had`~adad`{ad`y`j`{`y`p`j`{`y`y`j`{`y`w`{`{`j`{ae`y`j`y`j`y`j`y`q`y`j`{`y`w`{`j`y`{`w`{`yar`j`y`{ae`y`w`{ar`y`y`y`j`y`wae`y`{`y`wae`w`{`w`{`w`{`yar`{`{`w`y`{`r`y`y`r`y`yar`{`j`{`yar`y`w`{ae`y`{`j`{`y`w`{`yae`{`y`yar`y`j`s`j`j`y`j`y`q`y`j`{ar`y`y`y`yae`y`j`y`w`yadadadad`gadad`y`y`q`y`ja``j`y`j`w`j`y`y`j`y`ja`adadad`g`gadadadadadadadad`gadajadadadadadadadadadadadadadadadadadad`jadadadadadad`gad`j`y`w`y`j`y`j`w`yae`y`y`wae`y`jar`y`j`w`j`y`{`w`j`y`y`{`jar`{`{`{`q`{`y`{`yae`y`q`yar`y`wae`y`j`w`yae`y`j`y`w`{`y`j`y`yar`y`q`y`j`y`w`j`{`yar`j`{`y`w`{ae`y`w`yar`y`{`y`wae`{`w`j`y`{`y`r`y`w`y`j`{ar`y`j`{`y`w`j`y`j`y`q`y`y`j`j`yad`j`w`j`yae`y`y`j`y`j`y`j`y`j`y`qad`y`q`{`j`yae`y`y`y`{`w`{`j`yae`y`y`{`y`j`w`{`y`y`j`y`{`j`{`y`r`y`r`y`{`j`wae`{`j`{`w`j`{`y`y`j`{`y`q`{`w`{`j`y`y`j`y`jadadad`j`y`q`y`yae`y`yae`y`y`y`r`y`yae`w`yae`y`{`y`q`y`y`j`y`j`y`j`{`w`j`y`q`y`j`y`q`y`y`j`y`y`j`y`j`y`p`j`yadadadadad`g`i`g`gagadada``j`jad`y`j`y`j`j`y`y`w`j`j`{`q`y`j`w`j`{`y`j`y`q`y`{`w`y`j`yae`y`y`j`y`j`y`j`y`y`j`y`{`j`y`j`{`y`y`j`y`j`y`j`y`y`j`yah`y`jah`j`y`d`ja`ad`dadad`~`jaoad`~`~ad`haj`h`h`k`g`k`g`~`k`g`~ad`h`~ag`~`g`~`~ad`hadad`~`~ad`a`a`a`a", +"atatatatae`y`{`jar`{`yae`y`jar`y`j`y`jad`ja`adad`jadadad`{`y`y`{`j`{`y`r`yae`{`yae`y`{`{`r`y`y`yad`j`y`j`yad`~ada`adad`j`y`j`y`wad`{`q`y`{`y`yae`y`w`j`yae`y`jar`y`w`y`{`j`y`yae`yad`y`j`j`y`j`{`y`wae`yae`y`{`j`y`{`q`{`y`{`r`yar`{ar`yae`yar`yae`y`{`y`{`j`{`{`j`{`{`y`j`{`j`{`yar`yae`y`{`j`y`{ar`yae`y`{`j`w`y`{`j`w`{`j`{`w`{`jar`yae`y`yad`j`{`s`j`{ad`y`y`j`y`j`yae`y`{`q`y`j`{`jadadadagadad`~`qad`j`y`j`{`w`j`y`j`y`j`w`jadadajad`gadadadadad`jadadadaj`gadadadadadad`jadadadad`gajad`gadadadadad`j`wadadadadadadad`yadam`y`j`w`j`{`j`y`jar`j`{ad`{`yae`w`y`j`{`q`yae`y`q`{`q`y`{`j`q`y`{`y`jar`y`r`y`yae`yae`y`jar`j`{`q`y`y`j`{`j`y`j`y`q`{`j`{`y`y`q`{`j`w`{`j`{`y`q`y`j`{`w`{`wae`y`jar`j`{`y`y`j`{`y`q`y`{`j`{`jar`y`j`yae`wae`y`j`y`wae`yar`j`w`y`qa``j`y`y`j`w`j`{`jar`y`j`{`q`y`j`y`j`y`j`j`w`y`j`yae`j`y`j`yae`w`j`yae`j`w`{`y`j`{ar`yae`w`{`yar`j`y`{`jar`y`{`j`w`y`j`{`y`q`{`jar`yae`y`j`{`j`w`j`{`qa`ad`jada``j`j`yae`w`{`j`w`j`wae`y`j`{`q`yae`y`w`j`j`y`y`j`w`j`y`j`w`j`j`{`j`y`y`j`yae`y`j`w`j`qa``j`j`yad`jadadadad`gad`gadadadad`yad`yad`j`y`j`j`y`j`y`j`w`j`{`j`y`y`jae`y`{`j`{`wae`y`j`y`j`j`y`{`j`y`j`{`j`y`y`j`y`j`yae`y`y`j`{`j`y`j`{`j`y`j`y`j`{`j`y`j`y`j`y`j`j`yad`y`dad`y`~ad`~ad`~adad`~ag`~ad`haj`g`h`~aj`h`g`~`hag`~ad`~ad`~ad`~ad`dad`da`ad`a`a`a`a", +"atatatat`yae`y`j`y`w`j`y`j`{`j`wadad`j`yad`j`j`y`gadad`y`jar`jar`{`q`{`y`w`{`{`w`{`j`w`{`y`r`y`{`yad`jadadad`jad`jao`ja``j`{`{`y`{`{`{`w`{`j`{`w`{`{`j`w`{`j`y`j`{`j`w`{`yae`y`jar`yae`y`q`y`q`y`j`{`yar`y`r`y`y`w`j`{`y`j`{`y`j`{`j`{`y`j`{`w`j`yae`w`j`{`y`q`{`j`yarae`y`w`yae`{`yar`{ar`yar`{`j`yar`y`j`y`{`yae`y`{`{`j`{`q`y`y`{`yar`y`j`y`y`j`y`y`w`j`j`y`j`w`yar`y`y`w`yae`y`w`j`yadadadadadadadadad`j`y`p`y`j`j`y`j`y`j`y`yadadadadadadadadadad`yadadadadad`gadadadadadadadadadadad`gadadadad`jad`padada``jadadad`jad`wadad`yad`j`w`y`jar`y`{`y`q`{`q`yae`y`j`y`{`w`j`y`y`y`j`{`y`w`{`jar`yae`w`y`{`j`{`w`j`y`yar`y`yae`yae`w`y`w`j`w`{`q`y`{`{`q`y`{`{`j`w`yae`y`wae`y`{`y`{`j`wae`{`y`j`{`y`q`yae`w`yae`y`j`y`{`q`y`{`j`{`w`j`y`yar`{`j`y`r`y`j`yae`y`j`y`j`j`y`j`y`j`w`j`y`y`j`{`y`y`q`{`yad`j`y`y`j`{`y`q`yae`w`y`y`{`y`y`j`y`y`j`w`{`y`j`j`y`yae`yar`yae`w`y`{`j`yar`{ae`yar`yae`y`y`{`j`{`y`j`w`y`j`y`j`y`j`yad`jad`j`y`y`q`y`y`{`y`j`{`y`y`w`y`j`y`{`y`j`y`j`y`q`j`y`y`q`y`y`j`y`w`j`y`q`y`w`j`y`j`j`y`j`y`jadad`jadad`jadad`jadad`ja`ad`j`y`j`w`j`y`y`j`y`j`yad`j`y`y`q`j`y`y`j`y`w`y`j`y`y`yae`y`w`yae`y`j`y`{`y`yae`y`j`y`j`y`y`j`y`j`y`y`{`y`j`{`y`j`y`yae`y`j`y`j`y`j`y`d`yah`j`yad`y`j`ja``~ad`~ad`iad`hadag`had`h`k`g`~ad`~`~ad`~ad`~a``~`y`d`y`~a`ah`j`d`yah`a`a`a`a", +"atatatatae`yae`y`{`{`j`{`w`{`j`ya``j`ja`ad`j`ja`ad`j`j`yar`{`y`{`{`yar`y`{ae`w`yae`y`{`{`j`{`y`{`j`y`ja``ja`ad`ja``j`{`{`y`yar`y`yar`j`{`j`{`w`{`jar`y`y`q`{`y`yar`y`{`jar`j`w`{`y`j`w`j`y`y`j`{`w`j`{`j`{`yae`yae`y`{`y`{`q`{`jar`y`yae`w`{`y`j`y`q`y`{`yar`y`jar`y`j`{`y`{`y`{`y`w`j`{`j`y`j`{`w`y`{`jar`yae`y`y`{`r`y`y`q`{`y`{`{`q`yae`{`w`jad`j`q`yae`y`wa`ae`j`y`j`{`j`{`yar`y`y`jadadadad`gadadada`ad`jad`j`y`j`yad`w`jadadadadadad`jadad`y`p`yadadadadadadadadadadadadad`jadadadad`gajadad`jadadada``jad`w`jadad`pa``j`y`j`y`s`j`j`y`y`j`w`j`j`{`j`yae`y`{`yarae`y`y`q`{`j`w`{`p`{`j`{`y`y`q`{`yae`yar`j`y`{`q`yae`q`y`{`w`j`yae`j`y`j`{`j`y`w`{`j`j`y`q`{`j`{`w`j`y`{`j`wae`wae`y`{`q`y`q`{`j`yar`j`{`q`{`w`{`q`{`j`yae`w`j`{`y`r`y`jar`j`y`{`y`q`y`{`j`y`q`y`p`j`y`j`y`j`{`j`wae`y`r`y`j`q`y`j`w`j`y`q`j`j`w`y`j`{`w`j`j`j`{`w`j`{`j`j`y`r`yar`yar`j`{`y`j`{`y`{`r`y`{`j`y`w`yae`y`w`{ae`w`y`q`{`j`w`{`j`w`y`j`qa`adadad`w`{`j`y`{`q`jar`y`j`j`yae`yae`y`q`{`j`w`j`j`yar`j`y`j`y`j`y`j`j`w`jae`y`j`j`y`q`y`jad`ja``jad`yad`yad`y`j`y`y`y`j`{`w`y`j`y`y`j`j`y`q`yad`q`y`j`ja``j`w`j`y`j`yae`y`q`yae`y`j`j`y`jar`y`{`j`y`j`y`j`j`y`j`j`y`j`y`j`y`j`j`j`y`j`j`{`y`j`y`y`jah`j`y`d`y`j`y`j`j`j`y`j`~`y`dad`~ad`had`had`h`haj`h`~ad`had`~adad`~`y`~`y`j`d`jahad`y`d`j`d`y`~`j`a`a`a`a", +"atatatat`{`yar`j`yae`y`j`y`wae`j`yad`y`j`y`jadad`y`y`y`j`yaear`yae`{`y`{`q`y`{`{`{`w`y`{ar`y`r`yar`y`j`jad`y`y`j`wad`j`{`j`{ae`j`y`j`{`y`w`{`j`{`y`j`{`{`y`r`yae`y`r`y`j`y`j`y`j`{`y`y`w`{`j`y`j`j`y`w`{`y`q`y`{`w`jar`j`y`y`{`j`y`r`y`y`j`{`j`{`y`{`j`{`j`{`y`{`jar`y`jar`{`j`{`j`{`w`{`{`q`{`j`{`wae`y`y`j`wae`w`{`{`q`{`yae`w`j`{`{`y`wae`y`y`jad`j`y`j`j`y`j`y`y`q`j`yar`jae`y`r`y`j`j`gad`jadadadadadadadadad`jad`y`jad`jadadadadadad`y`jad`jad`jad`jadadadaj`gadad`jada`adadadadadadad`g`gadad`jadadad`jadadad`ja`ad`jad`y`q`j`y`j`j`j`w`j`y`y`w`j`{`w`y`j`{`wae`y`yar`j`{`y`j`yae`y`q`{`{`j`{`w`jar`y`{`y`r`y`y`{`yae`w`j`{`w`y`{`q`y`w`j`y`{`j`j`w`yae`y`w`yae`yar`yae`y`{`yae`w`yae`{`y`y`r`y`y`{`j`y`y`jae`y`yar`j`y`yae`w`y`{`j`y`{`y`w`jar`y`j`y`y`q`y`j`y`jad`j`y`j`w`j`y`y`j`y`y`{`j`y`y`j`y`j`y`j`y`y`j`j`y`j`y`j`y`w`d`{`y`w`{`y`y`yae`y`j`{`q`{`yar`j`{`y`{`{`yarae`y`y`{`j`{`w`j`{`y`{`j`y`{`j`y`j`y`y`j`ja`adad`j`y`j`y`j`{`y`j`{`w`j`y`wae`y`j`y`j`y`y`j`y`j`y`j`w`y`j`w`j`y`y`j`y`j`y`q`y`jad`ja``jad`yad`y`j`j`y`y`j`y`j`{`y`y`j`y`r`y`y`j`w`y`{`j`y`y`y`j`y`y`j`jad`y`q`j`y`y`j`y`j`y`y`y`y`wae`y`{`jar`j`y`j`y`y`j`yae`y`j`y`y`{`y`y`y`yae`y`y`j`{`j`y`j`y`d`y`j`y`j`y`y`jah`j`y`j`~a``dadad`~ag`~`g`k`g`~`g`~ad`~ad`~adahad`d`yahadah`j`d`y`da`ah`j`yah`y`a`a`a`a", +"atatatat`yae`{`j`{`yar`yar`j`y`y`jad`j`yadad`j`w`y`jae`yar`{`yar`{`y`{`q`{`{`yae`w`j`{ae`{`j`y`{`j`j`yae`ya``q`j`y`y`y`j`yar`j`y`yar`y`jar`yae`y`yar`{`yar`{`y`{ar`y`y`y`{`j`s`{`y`j`q`{`j`y`y`w`j`y`j`{`q`y`{`y`j`{`y`{`w`j`{`w`j`y`j`w`yae`y`wae`w`{`yar`y`j`wae`y`y`{`{`jar`y`{`w`y`j`{`y`{`{`y`y`j`{`{`y`{`y`{`yae`y`{`y`{`y`{`yar`y`{`y`{`q`yad`gad`y`y`j`y`w`jad`y`j`y`y`j`y`y`yaea`adad`ja``p`y`jadadadad`sad`jadad`jad`sad`jada``jad`ya`ad`jada`ad`g`gad`gadadadadad`padada``jadad`gadajadadadadadadadad`gadadadadad`p`j`y`ja``jad`s`j`yae`w`j`y`y`j`yae`yar`j`y`q`yae`w`jar`j`y`q`y`{`j`y`wae`y`y`j`j`y`j`{`q`{`j`w`y`{`y`j`j`j`y`j`y`j`{`q`y`q`y`{`y`r`y`y`yae`y`{`r`y`wae`w`y`y`{`j`w`{`j`yar`j`y`y`j`{`w`yar`j`j`w`jar`y`j`{`q`y`wae`yae`yae`y`y`q`{`j`yae`yad`w`j`y`j`y`j`y`j`{`q`y`q`y`jar`y`j`w`j`yad`w`j`y`j`w`j`y`y`j`w`j`{`j`{`wae`{`yar`j`{`y`yae`yar`y`{`jar`j`{`yar`j`{`w`j`{`j`y`{`jar`y`{`q`y`y`q`j`yad`jad`y`j`yae`w`y`j`w`yae`y`yae`y`q`y`w`jad`y`j`w`j`y`j`y`j`w`j`j`y`j`y`j`y`j`j`yadad`yad`jad`y`j`y`j`w`y`j`w`j`{`q`j`w`j`yae`y`j`j`{`j`y`y`q`{`j`y`j`j`y`j`y`y`j`j`y`j`j`y`j`y`q`j`yae`j`y`j`y`d`w`y`j`y`j`y`ja``j`y`j`j`yae`j`j`{`j`y`j`y`j`y`y`j`y`j`y`j`y`j`y`j`y`j`y`dad`y`j`jad`~ad`~`g`kad`had`~`~ad`~`y`~`jao`j`da``d`j`jao`j`y`d`y`jao`j`d`j`a`a`a`a", +"atatatat`j`y`j`y`j`j`yae`yar`j`{ad`jadad`w`{`j`y`jar`y`y`jae`y`{`r`{`y`{`yae`w`{`{`y`{`w`{ar`y`y`r`y`y`j`j`y`j`j`j`j`wae`y`y`r`y`j`y`{`y`jar`{`j`yae`j`y`{ae`w`{`{ae`w`{`yae`y`wae`y`y`q`{`j`yae`y`y`q`yae`y`q`j`y`j`y`j`y`j`{`y`y`yae`y`w`yae`y`y`{ae`j`y`r`{`y`jar`jar`y`{`jarae`yar`j`w`{`q`{ar`yar`{`q`yae`{`y`q`y`q`{`q`{`j`{ae`y`q`{`j`y`y`j`j`gad`j`j`y`j`{`yad`j`q`y`y`r`y`{`y`q`yadadad`y`jad`yadad`jadadad`ja`ad`yadadad`jadadad`j`jadadadadadadaj`gadagadad`y`ja``y`jad`wadadadadadag`g`gag`gag`gag`iag`gag`hadad`j`y`w`y`j`j`yad`ja``j`y`jar`y`j`w`j`{`j`y`j`y`j`{`y`y`jar`y`j`j`w`j`yae`w`{`yar`j`w`y`{`y`wae`{`j`wae`y`w`y`q`{`y`q`{`y`y`{`q`y`yae`w`{`q`y`j`y`{`q`y`yae`{`w`{`yae`w`{ae`yar`{`r`y`{`j`y`{`y`{`{`w`j`y`jar`yae`y`y`r`y`yae`j`y`{`j`w`y`j`y`j`j`y`q`yae`y`q`{`j`y`y`{`j`w`j`{`y`j`j`y`j`y`j`y`j`y`j`y`q`y`j`y`y`r`y`{`j`y`{`{`jar`j`{`yae`y`q`{`y`{`j`{`{`{`q`{`y`jar`y`{`q`{`y`j`{`y`j`y`{`j`y`padad`j`yae`y`j`y`{`j`w`j`y`w`j`y`{`j`y`j`y`q`y`j`y`w`j`j`y`y`y`j`y`p`y`y`jad`jad`y`jad`y`y`y`j`yar`j`y`j`y`y`y`y`y`j`y`j`w`y`y`w`y`j`{`j`y`y`jar`j`w`y`q`y`j`yad`y`j`y`j`y`y`j`y`wae`y`j`{`y`q`y`j`y`j`y`q`y`j`w`j`y`j`y`y`y`{`j`y`d`{`y`j`y`j`yak`j`y`y`j`j`y`jah`j`y`y`j`yah`ja``dad`~ad`had`~ag`~ad`~ad`~`~`yah`jao`j`yah`~`jao`j`~`y`d`jah`jao`y`a`a`a`a", +"atatatat`y`{`wae`{`y`y`{`j`y`j`y`y`y`j`{a``j`{ad`j`y`{aear`y`{`y`{`y`{`w`{`y`{`y`r`{`yar`{`y`{`j`{`y`q`{`y`q`y`ja``w`y`{`y`j`y`{`y`wae`{`w`y`j`w`j`{`w`{`w`{`{`w`{`{`y`{`q`{`y`j`{`j`w`{`y`j`w`y`q`y`yae`y`j`y`y`j`w`yae`y`w`{`j`q`y`r`y`{`j`{`y`{ae`y`yar`y`j`yar`j`y`y`y`r`y`y`yae`y`{`{`w`{`y`{`y`yae`y`yar`y`q`y`{`{`y`y`{`{`w`yar`y`y`{`q`{`w`ja`ag`g`j`w`yae`w`y`j`yad`j`y`j`y`q`j`yadadadadad`j`wadad`ja`ad`p`yad`p`jadadad`jadadadadad`gadadad`gajad`gadadada``qad`wad`j`ja``jadadadadad`gag`hagad`i`gac`gag`hagad`s`j`y`jae`qa``jadad`q`y`j`wae`y`q`y`{`j`y`w`yae`w`y`wae`w`yae`y`j`y`{`j`yar`j`{`j`{`y`jar`j`y`j`{`q`yae`y`yae`y`jar`j`y`w`j`j`y`j`yae`y`yae`yar`yae`yar`yae`y`j`yae`w`yae`y`w`yae`y`w`j`{`q`y`j`r`y`j`yae`w`yae`y`y`r`y`{`y`r`y`y`q`y`y`q`y`jad`w`j`j`y`yae`y`q`y`{`j`j`{`j`y`y`q`y`y`q`y`j`w`j`y`p`y`j`y`j`y`{`j`y`{`q`y`jar`~ar`j`{`y`wae`y`{`j`{`y`yae`y`q`y`{`j`{`yae`y`yae`y`{`y`r`y`y`j`y`y`jadada``jad`w`y`{`j`w`y`j`{`j`y`{`j`y`y`j`j`y`j`j`y`j`j`y`y`q`j`y`yae`yad`jadada``jad`j`w`j`j`yar`j`y`j`y`y`j`y`j`j`{`w`{`j`{`wae`j`{`y`y`j`{`w`j`y`{`j`y`{`w`j`y`j`y`j`y`j`j`y`j`j`y`y`j`y`j`y`j`{`y`j`{`y`j`j`y`y`j`j`y`j`j`j`y`j`y`j`y`{`d`y`y`j`j`y`j`j`y`y`j`y`jah`j`y`j`y`j`d`yadad`~`~ad`had`~`g`~ad`~`y`d`~`y`j`d`y`~`j`y`dadah`jah`jah`jah`j`a`a`a`a", +"atatatat`y`j`y`{`q`{ae`y`j`{`wae`w`j`j`y`j`y`j`y`j`y`y`yar`j`{`wae`{ae`yae`w`{`y`{`j`y`jar`yar`y`j`y`y`j`{`y`w`j`y`j`j`w`y`{`jar`{`{`j`{`yae`y`{`wae`yae`y`q`{`y`r`{`{`w`{`{`w`y`{`{`jar`{`y`j`yae`w`j`y`j`wae`y`j`j`y`j`j`{`q`y`{`j`y`j`wae`q`y`j`wae`y`j`{`{`j`w`{`j`{`j`{`y`r`y`j`w`j`{`j`{ar`j`{`j`yae`y`j`{`w`j`w`{`q`{`j`y`{`j`{`yar`{`y`j`y`{`jad`g`j`j`y`y`j`w`y`ja`adad`j`y`y`q`y`jadad`gadag`~ad`gadajadadad`jadadad`gad`gad`gagag`i`gagag`g`gagadadad`jadad`y`j`j`y`jadad`j`j`pad`jadad`gad`gad`gadad`gadadadad`j`j`w`j`y`j`yadadadad`j`y`j`y`j`y`q`yae`y`j`y`j`yae`y`j`y`j`y`q`y`j`j`w`j`y`q`y`q`y`j`{`y`r`y`w`y`y`j`wae`y`q`y`j`y`j`{`j`w`jar`y`w`jar`j`{`j`y`{`j`y`j`yar`y`yae`y`{`w`j`{`yae`w`{`y`j`{`y`w`j`{`y`{`r`y`y`{`q`{`yae`y`r`y`{`j`{`yae`y`yae`wad`ja``j`p`y`q`y`y`q`j`w`{`j`j`y`j`{`j`y`y`j`y`j`y`j`j`y`q`y`jar`j`y`q`y`{`y`j`y`{`j`{`j`{`y`{`y`{`wae`w`{`j`{`y`q`{`w`{`jar`y`y`q`yae`yae`w`j`y`q`y`{`jadad`y`j`j`yae`w`{`y`j`w`yae`y`q`y`j`y`jad`y`j`y`y`j`w`j`y`q`j`y`j`j`y`jadad`y`j`y`y`j`w`y`j`{`q`{`w`j`j`yar`j`{`j`y`j`y`j`{`j`w`jar`j`y`yae`j`y`y`j`j`y`j`w`j`y`w`j`y`ja``j`y`y`j`w`j`y`yae`y`q`y`y`j`y`y`y`j`y`j`y`y`y`y`j`y`{`j`y`j`y`j`y`y`j`y`y`jah`j`y`j`y`j`y`y`d`y`j`y`jah`jadad`~ad`~ad`~ad`~ad`~`jadah`jahad`d`y`~`y`d`y`~`y`d`j`yah`jah`a`a`a`a", +"atatatat`{`y`{`yae`y`y`q`{`wae`yae`y`y`j`y`j`w`j`y`y`r`{`jar`{ae`y`{`y`q`y`{`yaear`{`yar`{`{`w`j`{`{`waear`y`y`j`{`y`y`{ae`w`{`j`y`j`{`w`{`w`{`{`y`{`j`w`y`yaear`y`y`{`wae`y`{`{ae`w`{`y`jar`yar`y`j`y`y`y`j`y`{`p`y`y`{`p`y`{`j`s`yae`w`y`j`y`y`w`y`j`y`w`{`j`w`{`j`{`w`yae`w`y`{`{`w`{`j`y`w`j`{`y`yar`yar`{`w`{`y`{`{`j`y`{ae`yar`j`y`{`y`r`y`y`y`j`wadada``yae`y`{`j`{`wad`jadadad`j`dadadadag`gag`m`iagag`gad`g`gadad`gadadad`gagag`h`i`m`i`g`hag`hag`~adadadadad`jadadadadada`adadada`adad`s`j`y`j`p`y`j`pa``jadada`adadad`yad`j`y`jadadad`j`q`y`y`q`j`y`y`j`w`j`w`y`j`w`j`y`q`y`y`j`w`y`j`y`w`j`y`jar`y`j`y`r`y`yae`y`r`y`j`y`w`yae`y`w`{`j`w`y`j`{ae`yae`y`y`j`y`{`w`jar`y`w`j`{`jar`y`r`y`jar`y`wae`y`{`w`jar`j`{`y`y`q`{`y`q`yae`y`q`y`q`y`{`j`w`y`q`y`j`q`y`{ad`w`jad`y`j`y`j`yae`y`{`y`y`w`jar`y`j`w`yae`y`w`j`y`q`y`j`y`j`y`j`y`j`{`y`j`{`{`j`y`w`{`w`j`yae`wae`y`{`jar`y`j`{`yae`y`r`y`yae`yar`yar`y`y`{`w`{`j`w`jadadad`j`y`q`{`y`jar`j`{`j`w`j`ja``jad`w`j`y`j`q`y`j`j`y`y`j`y`wad`yadadad`y`j`w`j`q`y`y`{`j`w`y`y`j`y`q`y`j`y`j`y`y`j`{`y`q`y`y`{`j`y`y`j`w`y`y`r`yar`y`y`j`y`y`j`j`y`j`w`j`y`j`j`y`j`y`j`w`j`y`{`j`{`j`y`j`y`j`y`j`j`y`j`j`y`j`yae`y`y`j`y`j`{`y`j`y`j`y`j`y`d`y`y`j`j`y`y`d`y`ja``jahad`~ad`~ad`~adao`j`~adah`jao`j`~`y`d`jahad`d`j`ja``d`d`yad`a`a`a`a", +"atatatat`j`{`q`y`j`y`y`{`j`y`j`{`j`y`j`j`q`y`j`yae`y`y`{`j`{`{`y`r`y`{`{`q`y`{`y`{`r`y`yae`{`{`w`{ae`y`yae`y`{`jar`j`y`j`y`{`{`j`{`wae`{`q`yae`yar`y`{`{`y`{`y`{aear`j`yarae`y`w`{`{ar`{`yae`y`yae`y`{`q`y`w`j`j`{`p`j`y`y`j`y`j`y`{`j`{`w`j`{`j`y`y`r`y`j`y`j`y`y`r`y`j`y`j`{`y`jae`y`{`{ae`yar`j`{`yae`{`j`yae`j`w`j`{`{`w`{`j`y`{`{`q`y`{`jar`jar`y`jadadad`j`w`y`j`w`j`{`w`jadadag`gad`gadadadadadag`g`g`gadadagadad`gajad`gagad`gag`gag`gagadad`gad`gadadadadadadadadadadadajadadad`jad`y`j`j`y`q`y`y`{`q`j`ja``jad`jadadadadadadadadadad`gad`j`j`y`j`y`j`yae`y`j`{`j`y`y`r`y`j`wae`y`j`q`y`j`y`{`j`y`j`y`jar`yae`w`yae`y`w`{`j`{`w`j`{`j`w`yae`y`w`y`j`wae`w`jar`j`w`{`j`yae`y`j`w`yae`y`y`q`{`j`y`jar`j`yae`y`{`wae`yae`yae`{`y`wae`y`{`y`j`y`y`j`j`y`y`r`y`yae`j`yad`y`j`ja`ae`j`y`y`q`j`yae`j`y`y`j`{`j`{`q`y`j`y`j`y`j`y`j`jad`y`q`y`j`q`y`q`{`yae`yae`w`{`jar`y`{`jar`yae`yar`j`{`y`j`y`{`j`wae`y`j`y`{`j`j`{`j`y`j`w`jadad`j`y`y`jar`y`j`y`y`j`y`j`y`j`j`jada``j`y`y`j`j`w`j`j`j`y`j`jadadad`y`j`y`y`j`y`q`yae`y`yae`{`y`yae`w`yae`w`y`y`r`y`{`y`q`y`yar`j`{`y`j`j`y`y`j`y`j`y`r`yar`y`j`y`j`y`q`j`y`j`j`y`j`y`j`y`j`y`q`{`j`wae`y`y`j`w`j`y`y`y`j`y`j`y`j`j`{`y`j`j`y`jah`j`y`y`j`y`jah`j`y`d`y`j`y`d`y`dad`j`~ad`~`~ad`iad`~`y`~adah`jah`jadahad`dahadah`y`jao`j`dah`a`a`a`a", +"atatatat`{`j`y`{`j`{`j`{`j`{ar`y`{ad`j`w`y`y`y`j`yar`{`j`w`yae`y`y`{ae`w`{`{`{`wae`{`y`{`w`{`q`{ae`{`yar`yae`w`j`{`y`yae`yar`j`y`w`{`y`{`y`{`y`{`j`{`wae`w`{`q`{`w`j`y`{`y`{`y`y`{ae`y`y`{ar`yaear`yar`j`{`{`y`yar`y`y`j`j`y`waead`w`j`y`j`y`q`y`jar`j`y`y`q`{`w`j`y`j`y`wae`y`w`j`y`y`y`q`y`y`y`{`j`y`wae`y`y`{`y`w`{`{`w`j`yar`{`yar`y`q`{`y`{`y`y`j`y`w`y`q`y`yae`w`y`y`yaea`adag`i`m`iagadad`yadad`wadadadadadadadadadadadadadadadad`gad`yadad`yadad`w`jadadadadadadadadadadadada`ad`jad`w`j`y`y`j`y`j`w`j`{`y`w`j`yad`w`jadadad`gad`gadag`gadad`yad`y`q`y`y`w`j`y`y`j`w`j`j`y`j`y`y`jad`y`y`j`y`q`y`j`y`{`q`y`y`j`w`j`{`q`y`jar`y`j`{`y`q`y`j`w`yae`y`j`w`y`y`j`y`yae`y`j`{`y`q`y`{`j`w`jar`y`j`{`q`{`j`{`w`y`y`{`j`yae`y`w`{`w`y`j`{`y`wae`yar`y`jar`y`yae`y`y`q`y`w`y`j`jad`w`j`w`j`w`j`y`y`q`y`y`jar`j`y`w`j`y`{`y`q`y`yar`ja``wae`y`y`j`y`j`y`{`j`yar`j`{`j`y`y`j`w`{`yae`yar`j`y`{`j`w`{`y`j`{`yar`j`yar`j`y`w`{`j`y`yadadadad`y`j`w`y`j`y`y`j`w`j`y`ja``jad`y`j`y`q`y`j`w`y`j`y`j`y`ja``jad`y`j`y`j`y`j`{`y`j`y`w`{`j`y`q`y`r`y`y`j`y`jar`y`j`y`r`y`{`j`yae`y`j`{`q`{`y`j`{`q`y`y`j`y`j`j`{`w`j`j`y`yada``j`y`j`y`j`y`j`{`y`y`j`y`yae`y`j`y`y`j`j`j`y`j`y`j`y`j`y`j`y`y`j`y`j`y`j`y`j`d`y`ja``j`y`j`y`y`j`j`yahad`~adad`~ad`~ad`~`jao`j`dad`jah`jah`yad`jahad`d`y`d`ja``a`a`a`a", +"atatatat`{`j`{`yae`y`w`{`j`y`{`j`ja``j`y`j`j`y`j`{`j`{`y`{ar`y`q`{`y`{`j`{`wae`y`j`{`q`{`{`y`y`yar`j`yae`{`y`{`wae`y`yarae`y`{`j`{`q`yae`w`y`r`y`{`{`{`{`y`{`{`j`{`{`w`{`q`{ae`w`yae`w`{`j`{`w`y`{`{`j`{`y`q`j`{`y`r`yar`y`j`yaea``j`j`y`j`y`j`y`j`y`j`q`y`j`y`j`y`j`{`y`j`{`j`y`wae`j`y`{`r`y`y`r`{`y`yar`j`w`{ae`y`{`j`yar`yae`yar`j`{`yarae`yar`j`{`y`j`y`jad`y`yae`wae`{`w`ja`ag`g`gad`gadad`j`ya`ae`yad`j`j`pa``j`jadadadadadadadad`yad`y`j`w`j`jad`j`yad`jadadad`gadadadadadadadadada`ad`qad`yadae`y`ja``j`y`y`q`y`y`j`w`jadadadagadag`iag`gajad`j`j`y`j`j`y`q`j`y`j`y`s`j`j`yad`r`y`y`j`j`w`y`j`j`j`w`y`j`y`q`y`j`y`y`j`q`y`j`{`q`y`j`y`{`j`{ad`y`j`y`j`{`w`j`wae`y`w`jar`j`y`j`{`y`y`j`{`q`y`j`y`y`yae`jar`j`j`y`q`{`j`y`jae`y`wae`{`y`j`{`j`w`yae`y`w`j`y`y`j`j`{`j`w`y`jad`j`y`j`y`j`j`y`{`j`y`{`j`y`{`y`j`w`yae`y`j`y`jar`j`y`q`y`q`y`j`w`j`y`j`y`y`r`y`y`r`j`{`y`j`w`y`{`y`jar`y`j`{`wae`y`y`{`j`{`j`y`{`j`y`wae`w`j`yadadad`j`j`j`y`q`j`y`{`j`y`j`j`jad`ja``q`y`j`j`y`j`y`q`y`jadad`jad`y`w`j`y`w`y`j`y`{`q`{`j`wae`y`y`{`j`y`j`y`j`y`jar`y`j`y`jar`y`j`w`y`y`j`y`w`{`j`w`y`j`yae`y`y`j`y`y`j`y`j`j`jad`y`j`y`j`y`y`j`yae`y`y`j`y`j`y`{`j`j`y`y`j`y`j`y`j`y`y`j`y`j`y`y`j`y`y`j`y`j`y`j`y`j`y`d`jah`y`y`d`y`jahad`~ad`~ad`had`~ad`jahah`y`~`jadah`jahadah`j`~`y`dah`j`a`a`a`a", +"atatatat`j`{`y`j`y`j`y`j`{`y`wae`y`j`y`j`j`yadae`y`w`{`yar`j`y`{`{`y`r`{`y`{`{`yar`y`{`w`{`jae`y`j`w`{`y`{`w`{`y`{`j`{`y`j`y`j`w`{`j`y`{`yar`{`{`w`yae`w`{`r`y`{`w`j`{`q`{`y`{`yae`y`{`j`yar`{`yae`y`{`w`j`{`y`yae`y`y`y`{`j`y`j`w`j`y`j`wa``j`jad`y`j`j`y`y`j`y`r`y`w`j`y`q`y`w`{`j`y`j`{`j`y`{`j`y`q`yae`y`y`j`{`y`waear`y`yae`y`{`yae`y`y`{`q`y`yar`j`y`w`j`yad`{`q`y`yar`j`{`w`jadad`y`jad`s`j`j`y`w`j`y`y`w`y`y`j`y`w`y`j`y`q`y`j`{`y`w`j`y`y`j`y`yadadadadadad`gadadadadadadadad`p`jadad`j`y`q`y`{`wa``j`{`w`j`y`{`q`y`j`y`y`w`jad`g`h`nas`iacada`ad`ja``j`w`ja``w`j`q`y`j`{ad`q`y`j`q`y`wae`y`y`j`w`y`j`{`w`y`j`j`yar`j`y`y`r`y`y`j`w`{`j`w`j`w`j`yar`y`q`{`j`y`y`jae`y`yae`y`y`{`w`j`{`q`y`y`{`j`y`r`y`w`j`y`{`w`y`{`{`y`{`w`y`{`j`y`wae`yar`{`j`{`q`{`yaear`yae`w`y`jad`j`sad`j`y`w`j`y`w`j`y`y`j`w`{`q`yae`yae`yar`y`j`w`j`{`y`y`j`y`j`y`j`y`j`y`j`w`j`y`j`y`j`y`w`j`yae`yae`w`j`y`{`y`{`y`q`{`j`{`y`w`{`j`{`w`yae`y`y`jadadadad`q`y`y`j`y`y`j`qa``jadada``y`j`y`j`j`y`w`j`y`j`y`j`wad`y`j`y`j`{`j`y`j`wae`y`j`y`j`y`yae`y`q`{`y`y`r`y`jar`y`j`{`y`w`j`{`y`j`y`jar`j`{`j`y`j`{`y`j`w`y`j`j`y`j`y`j`y`j`ya``j`y`j`y`j`yae`y`w`y`j`{`wae`y`w`j`y`y`j`y`j`y`y`j`y`j`j`y`d`y`j`{`j`y`j`y`y`j`y`y`d`y`y`j`y`j`d`y`jahad`y`j`~ad`~`g`~ad`~ad`~`j`~`j`y`d`y`~`jah`j`~`jah`jad`d`a`a`a`a", +"atatatat`y`j`{`y`{`q`y`yae`j`y`y`q`y`y`j`yadad`y`{ae`{`j`{`{`{`jar`y`{`jar`j`yar`j`{`y`y`{`w`{`{`yae`wae`y`{`q`{`y`r`y`yae`y`y`{`w`{`q`{`j`y`{ae`y`y`{`yae`y`{`q`{`y`{`{`j`w`{`y`{ar`j`{`j`yae`w`{`y`{`y`{aear`y`{`q`{`jar`y`y`yae`w`y`j`y`j`w`y`j`s`j`y`j`j`y`ja``j`y`j`y`y`j`j`w`j`{`w`j`y`j`y`j`{`yae`yaear`y`j`{`y`yae`yar`{`w`y`{`w`{`y`{`{`y`j`{`y`q`y`j`wad`{`jar`y`{`y`w`{`j`wadad`yad`ja``j`j`y`r`yad`{`q`{`y`j`j`y`y`j`y`{`y`q`j`y`jar`jad`j`padadadadadadadadadadadadadadadadad`pad`j`jad`w`j`j`y`wae`y`j`yae`y`yae`y`j`y`w`jadadagacacaaac`hagad`ja``j`j`y`j`y`ja``q`j`yad`j`y`j`y`j`y`r`y`yae`yae`j`{`w`{`q`y`y`r`y`y`j`y`j`w`j`y`j`yae`y`y`r`j`{`y`r`y`j`w`{`j`w`j`y`j`q`{ae`yar`y`j`w`j`y`{`y`{ae`w`j`y`j`q`y`q`j`yae`y`r`y`{`q`y`j`y`{`j`w`yae`w`y`j`w`j`y`j`w`j`y`jad`y`jad`q`y`j`y`r`y`y`j`y`y`j`{`q`y`j`{`j`y`{`j`y`q`j`y`q`y`j`q`y`j`q`y`yae`j`w`{`j`j`yar`j`y`y`j`{ar`{`j`j`{`yae`w`{`j`{`j`w`y`j`{`j`yar`j`y`jadadadad`y`j`j`yad`y`j`ja``jad`jad`y`j`w`y`j`j`y`jad`jad`j`ja``q`y`y`q`{`j`y`j`yar`{`j`{`j`{`w`j`y`r`y`jah`j`w`j`{`q`y`j`y`j`yae`w`j`y`j`y`w`j`y`y`q`{`j`{`y`j`w`j`y`j`y`y`q`j`ja``j`j`y`y`j`j`y`j`{`j`y`y`j`{`yae`y`{`w`j`y`j`y`j`y`y`j`y`j`y`j`y`d`y`j`y`j`y`d`y`j`y`jah`j`y`y`jah`j`d`y`j`~ad`~`~ad`~`~ad`~`y`~`jah`j`d`jao`j`y`d`y`~ah`jad`a`a`a`a", +"atatatatae`y`y`j`y`j`y`jar`y`j`{`j`j`j`y`j`y`wae`j`y`j`{`w`y`{`j`y`{`j`{`yar`{`j`{`{ae`w`{`jar`y`{`w`{`y`yae`y`{`q`{`y`y`j`j`y`j`{`j`y`yae`w`y`{`j`w`jae`w`y`{ar`y`y`{`q`y`{`{`r`y`{`j`y`y`{`q`{`yae`y`r`{`w`{`y`{`{`y`w`yae`yae`w`j`y`{`j`w`j`y`q`y`j`yad`y`q`y`j`j`j`q`y`j`w`y`j`y`yad`y`j`w`y`r`y`j`w`j`y`y`{ae`w`y`jar`y`{`j`{`q`{ae`y`j`wae`y`w`{ae`w`yae`yad`w`j`y`yae`yae`y`q`yad`y`j`y`p`jad`j`y`j`{`w`j`y`j`yae`w`y`y`q`y`j`w`d`w`y`y`jad`s`jada`adadadadadadadadadadadadadadadadadada``j`y`y`j`yar`y`j`y`y`q`{`y`j`w`j`w`j`{`j`w`jad`gas`n`hac`i`gad`j`q`y`j`y`j`w`y`j`j`w`j`y`j`y`w`j`j`y`w`j`{`w`{`y`q`y`j`{`w`j`{`j`y`wae`w`y`{`j`yar`j`y`{`w`j`y`y`y`j`wae`y`j`w`y`jar`y`y`w`y`j`yae`y`yae`y`q`{`q`y`y`{`q`yar`j`{`y`{`q`y`{`{`j`y`yae`w`j`y`{`j`yae`y`j`y`y`j`y`y`jad`j`j`j`s`j`{`y`j`y`j`w`j`{`j`w`y`y`j`w`j`y`w`j`j`y`{`j`y`j`y`j`y`j`y`j`y`j`j`y`y`yae`w`yae`y`j`{`q`{`y`j`w`{`j`wae`y`yae`w`{`yae`y`{`w`jae`y`w`jadadadad`j`y`j`w`j`y`jadadadada``j`w`j`y`j`j`y`y`p`j`y`yad`y`q`y`{`j`y`y`y`{`w`j`y`j`y`w`{`w`yae`y`y`{`w`{`{`yae`y`y`j`yae`y`y`j`y`yae`y`y`j`y`w`j`{`y`q`y`y`j`{`y`j`y`q`y`j`y`y`jadad`j`y`j`y`j`y`j`wae`yar`jar`y`j`y`j`y`j`y`yae`y`y`j`y`j`y`j`y`y`y`y`jak`y`y`j`y`d`y`j`y`y`jah`j`y`y`da``jahad`~ag`~`g`~ad`~`y`~`jao`ja``d`y`~`jao`j`y`d`y`a`a`a`a", +"atatatat`{`j`{`yae`{`y`j`{`{`y`jada``j`j`y`j`y`yar`y`{ae`y`{`jar`y`wae`yar`y`{`{`yar`j`{`yar`{arae`{`j`{`yar`y`y`{`q`{`j`y`j`y`y`j`y`j`y`j`{`j`y`{`j`y`{`j`w`j`{`q`yae`y`{`j`y`j`y`yar`{`j`{`y`w`{`yae`y`{ae`yae`wae`y`{`{`w`y`{`{`wae`w`j`y`y`j`y`{`w`j`y`j`w`j`y`yad`yad`j`j`w`j`j`y`j`j`y`j`y`j`y`j`yar`j`y`q`y`{`j`{`jar`y`{`y`y`yae`{`w`{`y`{`y`{`j`{`w`{`y`j`j`w`j`w`{ar`y`yae`y`w`j`ja``j`padad`j`j`y`j`w`j`y`wahae`w`yae`y`y`j`y`j`w`j`j`yadadadad`jadadad`jad`p`yad`jadadadadadadadad`p`y`q`y`y`j`j`w`{`j`y`j`y`q`y`y`{`j`w`j`y`y`j`w`j`g`gag`g`n`g`g`had`j`jad`yae`w`y`j`y`w`j`y`j`yae`w`y`j`{`j`y`q`y`{`j`{`j`y`w`j`yar`j`y`j`y`q`{`j`y`q`y`y`j`{`j`w`{`j`y`wae`y`j`w`j`yae`j`j`{`y`j`y`q`y`q`j`y`y`j`y`q`y`j`y`yar`j`y`{`j`q`yar`j`y`r`y`j`yar`j`y`jar`y`q`{`j`q`y`j`y`p`ja`ad`j`j`j`w`j`yae`y`j`wae`{`j`{`y`j`w`j`y`y`q`y`y`j`y`w`y`q`y`w`j`w`ja``q`j`y`j`y`j`w`yae`w`y`yae`y`{`j`y`{`y`{`j`w`{`j`y`wae`y`j`{`y`j`y`j`y`jadad`ja``j`j`y`j`yadadadad`j`ja``j`j`y`j`j`j`y`jad`p`y`j`j`y`j`{`jar`j`y`j`{`y`r`y`j`{`j`j`y`w`j`{`j`j`w`{`j`y`j`y`j`w`j`y`r`y`j`y`q`y`j`{`j`j`w`j`yae`y`q`y`jar`y`j`y`{`j`j`y`y`ja``j`j`y`j`y`j`y`j`y`j`j`y`yae`y`j`{`j`y`j`y`j`y`y`j`j`y`y`j`j`{`j`{`j`y`j`j`y`y`j`y`d`y`j`y`jah`j`j`y`d`jahadad`~ad`~`g`~ad`~`j`~`y`~`jadah`j`d`y`dad`y`d`a`a`a`a", +"atatatat`j`y`{`y`jah`q`y`jar`y`q`y`j`y`y`w`j`yae`y`jar`yae`w`y`{`j`y`{ar`{`y`{ar`j`{`{`y`y`{ae`{`y`j`yar`yae`y`j`{`j`yadadadadad`j`jad`j`jad`j`j`j`y`w`j`j`j`d`j`j`y`yae`y`w`j`y`q`yae`j`{`y`j`yae`y`j`w`y`{`q`y`y`yar`j`{`j`{`y`j`q`y`{`y`{`w`{`j`y`j`{`q`y`j`y`y`q`y`j`w`j`y`jad`y`jada``j`j`y`j`w`j`y`j`j`j`y`{`j`y`j`{`y`j`w`j`{ar`j`w`{`yae`y`j`q`{`w`yae`y`q`y`j`y`{`y`j`{`j`yar`y`j`j`j`y`y`jada`ad`j`y`yae`y`y`r`y`j`yae`w`j`y`q`jad`jadadadadad`p`yad`jad`y`q`yadadad`sadadad`p`yad`ja``j`j`y`q`y`j`y`y`q`y`jar`j`y`j`y`j`y`j`y`j`j`y`w`jad`j`g`gaj`gaj`gadad`y`q`j`y`j`y`y`j`y`r`y`j`w`y`j`y`r`y`w`yae`y`jar`y`w`j`{`{`j`y`jar`y`y`j`w`y`yar`j`y`j`w`y`j`{`q`y`j`y`w`j`y`j`y`w`{`y`w`jar`y`{`j`y`y`{`j`w`yae`y`yar`j`y`j`y`r`y`y`{`jar`yaear`y`yae`w`{`y`j`y`j`y`j`y`y`j`y`yadad`ja``w`j`j`w`y`j`w`y`j`y`{`w`j`y`j`{`y`r`y`{`j`y`r`y`j`{`j`y`j`y`j`y`j`y`q`y`q`{`y`j`y`y`j`{`j`y`q`y`{ae`w`jar`y`{`jar`y`yae`y`y`q`y`y`y`j`wadadada``j`yad`yadaj`gadad`j`y`y`j`{`p`y`w`ja`ad`jad`y`j`y`y`{`w`j`y`{`yae`y`w`j`y`yae`y`w`yae`yae`yar`y`{`y`q`y`{`w`{`y`j`y`j`w`y`j`y`j`y`j`y`y`jar`y`j`y`{`q`y`y`j`y`j`y`j`y`y`j`y`ja``j`y`j`y`y`j`y`j`{`y`{`y`j`y`y`y`j`{`y`y`j`y`j`yah`y`j`{`j`y`j`y`y`j`y`y`y`j`y`j`y`d`y`d`y`jah`y`jaha``d`y`~ad`had`i`~ad`~a``~`jah`jah`j`~`y`jah`jao`a`a`a`a", +"atatatat`yae`yar`{`y`y`{`j`{`y`j`w`j`j`y`j`y`w`{`{`y`{`y`{`y`r`{`{`wae`yar`j`y`{ar`y`jar`y`{`y`yar`{`y`j`{`{`q`y`y`j`jadag`i`magadada``jadada`adadad`jadada`ad`j`p`y`j`w`j`yae`y`y`j`y`{`w`j`{`w`jar`j`y`{`j`{`w`jae`y`y`q`y`jar`yae`w`yae`yae`wae`y`y`w`j`y`yae`y`yad`yad`yad`yad`j`yad`w`jad`y`yad`w`yad`yad`q`y`y`w`{`y`r`y`y`{`q`y`{`y`{`w`{`w`y`yae`{`w`y`{`yad`j`w`jar`y`y`wae`y`yad`yadad`w`j`yad`j`j`p`y`y`q`y`y`{`y`q`y`j`y`y`ja``jadadadad`jad`y`p`ja``p`jad`j`wad`jada``jadadadadad`y`y`j`y`y`q`y`jar`j`y`y`y`{`w`jar`j`w`y`q`y`y`j`j`y`w`j`jada`adadagadadadad`y`j`w`j`{`w`j`y`w`j`y`r`y`j`yae`y`q`{`y`y`jae`y`q`j`y`{`j`y`j`wae`y`{`j`j`{`q`yae`y`q`y`j`y`wae`y`y`w`j`y`yae`q`y`j`y`j`w`j`{`j`w`j`j`y`w`{`j`y`j`y`q`y`{`yae`w`j`y`y`{`y`j`w`{`j`y`q`{`j`w`y`j`y`q`y`r`y`q`yadad`j`y`j`y`j`y`j`y`j`w`j`j`y`j`y`w`j`{`y`j`w`j`y`y`j`j`w`j`j`y`j`y`p`j`j`y`y`j`y`j`{`q`{`y`q`{`y`y`r`y`yae`yae`y`w`{`j`y`{`wae`yae`y`j`y`j`ja`ajadad`y`jadadadadadadad`j`y`q`y`j`y`j`j`ja``j`w`y`j`y`q`y`j`{`j`y`j`q`y`{`j`{`q`y`j`{`y`q`y`j`w`{`jae`y`{`j`w`jae`y`j`y`j`y`j`y`j`w`y`j`y`j`y`j`y`j`y`j`y`j`{`q`y`y`q`y`j`y`j`y`j`y`j`y`j`y`j`j`y`j`w`j`y`j`{`yae`y`j`y`j`j`y`j`{`j`y`j`y`y`j`y`y`j`y`{`j`y`e`y`j`y`y`j`y`j`y`d`y`jah`j`y`d`d`y`~ad`~ad`h`~`k`g`dadahadah`ja``d`jahad`d`y`a`a`a`a", +"atatatat`y`j`yae`yae`j`j`{`yae`y`j`j`y`j`j`{`{`j`y`r`yae`w`j`{`j`wae`{`y`j`yar`{`j`w`{`{`y`jarae`yae`{`j`w`j`{`y`j`jad`gag`gadad`ja`adad`ja`ad`p`j`yad`y`y`yar`y`yad`q`y`j`yad`j`j`w`j`jad`j`j`j`y`y`j`y`q`y`j`y`{`j`y`w`yae`y`j`y`j`y`j`y`q`j`{`y`yar`yae`y`w`j`y`q`y`j`qa``j`qada``jadad`j`yad`jad`j`j`y`j`j`y`y`q`j`yae`y`{`j`{`j`{`w`{`q`{`j`{`y`j`{`w`j`yae`y`p`{`j`y`{`{`qae`yar`j`w`jad`y`j`y`qadadadad`y`j`j`y`j`j`q`ya``j`jadad`jadadad`yadad`y`p`j`y`jad`y`j`yadad`w`jad`j`padadad`ja``q`j`y`j`yae`w`y`j`{`w`yae`j`yae`w`yae`y`j`y`r`y`{`j`y`ja``y`qadad`gad`p`yad`jad`yae`j`y`yae`y`j`y`y`j`{`w`{`y`j`{`q`{`w`y`y`y`q`y`w`jar`j`{`y`q`y`q`{`y`q`y`j`y`j`{`w`jar`y`{`jae`y`q`{`y`y`y`q`{`j`y`jar`yae`w`y`j`{`q`j`y`r`yae`y`q`y`y`y`yae`y`wae`y`{`w`j`y`j`w`yae`y`j`y`y`j`j`y`jad`j`s`jad`q`y`j`j`y`wae`y`y`y`r`y`yae`yae`w`j`{`y`j`j`w`{`y`y`j`w`j`j`y`y`j`y`j`y`j`w`y`y`y`j`{`yae`y`{`w`j`{`w`yae`y`j`y`q`{`y`j`yar`j`w`j`yadad`gadadadagad`hajadada``j`j`y`y`j`w`j`yad`w`j`y`j`w`{`j`yae`y`j`w`{`y`y`jar`j`y`{`y`j`w`yae`y`y`y`j`y`w`yae`y`y`{`y`y`w`{`j`y`{`qah`j`w`j`yar`j`y`y`wae`y`{`y`j`y`j`y`j`y`y`j`j`y`j`jad`y`j`j`y`j`y`y`{`j`{`wae`y`j`y`y`j`y`j`{`j`y`y`j`y`j`j`y`y`j`y`j`j`y`y`j`y`jah`j`y`y`d`y`jah`j`y`d`y`y`d`ja``d`~ad`k`g`had`~adah`j`d`y`da``jah`j`y`a`a`a`a", +"atatatat`y`{`j`y`y`y`y`yar`{`w`{ad`y`ja``j`w`{`y`{`y`y`{`{`y`{`{`y`yar`{`y`{`y`{`{`{ar`{`y`y`{`yar`y`{`yar`j`y`j`yadadadadad`y`w`j`{`w`yar`y`{`yar`y`wae`{`{`y`r`{`y`yar`j`s`y`ja`ad`j`wa`ad`q`y`q`y`j`y`y`j`{`q`y`j`y`j`y`{`w`yae`y`y`y`j`yar`y`j`y`j`{`jar`{`y`j`yar`j`y`y`y`j`y`p`j`yadad`jada``j`y`p`y`j`w`j`y`y`q`y`y`j`y`w`{`y`j`{`y`{`w`{`jar`yae`y`w`j`{`j`y`y`j`y`q`y`y`y`j`y`y`j`yad`pad`ja``j`pa`adad`ja``q`y`j`yad`jad`yadadadadadadad`wad`jada``j`y`p`y`j`qa`ad`j`yadadad`yadadad`j`y`q`y`w`j`y`j`w`{`j`y`j`w`y`y`{`j`w`yae`w`y`y`r`y`y`q`y`jar`j`y`w`jadadad`pad`jad`w`j`y`w`j`w`yae`w`y`j`{`q`y`y`j`yae`y`r`y`j`{`j`y`y`j`w`j`{`y`j`y`q`y`y`q`y`y`wae`y`j`j`y`q`y`j`y`{`q`{`j`y`y`jar`y`j`y`jar`j`y`y`j`{`y`q`yar`y`j`{`jar`jae`y`{`{`q`y`j`{`y`y`yae`w`y`j`j`w`y`j`w`ja``qad`ja``jad`y`j`y`j`y`j`j`w`j`y`j`y`w`j`{`j`y`r`yar`j`y`j`r`y`j`y`j`j`w`j`y`q`y`j`y`j`j`r`y`j`wae`yae`j`{`yae`yae`w`j`{`y`jar`jar`j`y`j`y`j`yadajag`gadaj`gadagadadad`y`j`w`j`j`yad`jad`y`j`y`j`y`j`y`q`y`y`r`y`j`wae`y`y`jar`j`w`j`{`j`{`jar`{`j`{`j`y`{`q`y`j`yae`y`j`y`j`y`yae`y`y`{`j`y`y`q`j`{`y`q`j`y`q`y`y`j`j`y`j`y`y`j`y`yad`jad`y`j`j`y`j`j`y`j`y`y`y`{`j`yae`y`y`d`y`y`j`jah`j`y`y`j`y`j`y`y`j`jah`y`j`y`j`y`j`y`d`j`y`jah`jah`ja``dah`jad`~ad`had`i`~`g`~adah`j`d`y`jah`jah`j`a`a`a`a", +"atatatat`y`j`y`jar`yaear`j`{`{`j`y`j`y`j`y`j`{`wae`{`j`w`{ae`wae`y`r`y`{ae`y`jar`j`{`j`{`j`wae`yae`yae`j`y`j`{adadadadadad`j`yar`{`y`{`wae`{`yarae`yae`{`{`{`w`{`{`yarae`y`y`j`{`w`j`y`j`w`j`{`j`y`jar`y`j`{`q`y`yaear`yar`j`y`yae`wad`w`j`j`y`j`{`q`y`q`y`j`y`j`{ar`yae`y`j`y`j`j`y`jadad`yadadadadad`y`j`j`j`y`j`j`j`j`{`j`w`j`y`r`y`y`j`{`j`yae`y`y`{`q`j`y`y`y`q`y`j`q`y`{`j`w`y`r`j`y`qadad`y`y`jad`jadadadad`jadad`jad`jadadadadadad`pa``j`wad`j`y`y`p`j`ja``j`j`yad`j`jad`wadadadadad`qa``q`y`j`y`j`{`w`yae`w`j`y`yae`y`q`{`y`j`{`j`y`j`{`d`w`yae`y`y`j`y`j`y`jada``jad`qa``j`j`j`yae`y`q`y`j`j`w`j`y`j`y`r`y`q`{`y`q`y`{`w`j`yar`j`y`w`j`y`w`j`y`j`j`y`j`j`{`j`y`y`r`y`j`y`y`q`y`j`j`{`q`y`j`y`j`y`j`y`y`j`{`q`y`q`y`y`j`jar`j`y`wae`y`y`j`wae`y`y`jar`j`y`r`y`y`j`{`y`j`{`j`w`y`j`ja``j`ja``q`j`y`q`y`j`y`j`yae`y`wae`j`y`yar`j`y`y`j`{`y`y`j`y`w`j`s`j`y`j`j`y`w`j`j`w`y`j`y`{`ya``j`{`y`q`y`j`w`{`y`j`y`q`{`y`y`{`w`j`y`j`yadag`hag`hag`gadadad`j`y`q`y`j`y`j`j`yad`j`w`j`y`q`{`y`q`{`y`y`j`y`{`j`{`y`j`w`j`y`y`{`j`y`j`y`y`j`wae`y`wae`y`{`j`y`j`y`yae`w`yae`w`j`y`j`j`w`yae`y`y`j`j`y`y`y`j`j`y`j`y`y`jae`w`j`y`j`j`yad`y`y`j`y`j`y`yae`j`y`j`j`y`y`j`y`j`{`y`j`y`j`y`{`jak`j`y`j`y`d`y`y`j`y`j`y`y`d`y`y`jah`y`jah`j`y`dahad`y`d`y`~ad`had`~ad`~ad`d`y`y`y`d`y`d`y`d`a`a`a`a", +"atatatat`y`yae`y`y`{ae`y`wae`yar`y`j`j`y`q`yae`y`yar`y`{`{`y`{`w`{`yae`yar`y`y`{`yar`y`{`y`{ar`{`y`w`{`j`y`q`yad`y`j`y`y`j`y`{`jar`{`j`{`yar`y`y`{ar`y`wae`y`{`w`{`y`yarae`yar`y`{`w`j`y`j`y`y`w`j`yae`y`y`y`{`w`{`j`{`yar`jar`y`y`j`y`y`j`w`y`j`y`y`j`y`{`j`w`{`j`y`yae`y`yar`j`y`y`j`y`wad`jada`ad`jad`y`y`j`ya``y`ja`ar`j`y`j`y`{`q`y`w`{`yar`j`{`w`{`y`yarae`y`y`j`y`j`y`yae`{`y`y`j`w`jadad`j`q`ya``j`yadadadadad`gadadada``qad`y`j`y`jad`j`yada``q`j`yad`w`j`y`p`y`ja`adad`j`jadad`gad`jad`y`j`w`y`q`{`j`y`j`yar`j`q`{`y`j`y`{`w`{ar`yar`j`{`y`yar`j`yar`j`w`y`j`w`ja`adad`yad`y`p`y`j`{`y`q`y`y`y`jar`y`y`j`y`y`q`{`{`q`y`{`{`j`y`yae`yar`j`y`j`w`y`y`q`y`q`y`w`j`y`j`y`q`yae`y`w`y`j`y`j`{`q`y`j`w`{`j`q`y`y`j`{`j`y`r`y`y`y`q`{`j`w`jar`y`j`y`r`y`yae`y`j`y`jar`y`j`y`q`y`j`y`j`w`y`qadad`jadad`j`y`j`q`y`y`q`y`j`y`j`y`q`y`j`y`q`y`j`y`q`y`j`y`y`j`yad`j`j`w`j`y`j`y`yae`y`q`yae`w`y`j`y`y`{`j`{`wae`y`j`y`wae`j`y`y`j`y`q`j`gagac`i`i`g`gadad`y`p`y`j`y`j`w`j`ja``jad`y`y`j`{`y`j`y`jar`j`{`w`j`y`j`{ar`yae`yae`w`jar`yae`w`y`y`j`{`y`yae`w`y`r`{`y`j`y`j`{`y`{`w`y`y`{`j`y`j`w`{`y`q`y`j`{`y`j`y`j`y`j`y`y`j`y`j`ya``j`j`j`y`y`j`y`j`y`y`y`j`{`yae`y`y`j`y`j`y`y`j`y`j`y`j`y`j`y`j`y`j`y`d`y`jah`j`y`j`y`j`y`jah`y`j`yah`j`y`d`y`d`y`j`~ad`~ad`~`g`~ad`~`d`y`~`j`~`y`d`a`a`a`a", +"atatatat`yae`w`{`{`j`w`{`j`{`{`{`y`j`ja``j`j`{`wae`{`y`{ae`y`r`yae`{`yar`{`j`{`{`r`y`{`{`r`yae`y`j`yae`y`ja``jad`ja``j`j`w`yar`y`y`j`{`w`{`yae`{`{ae`w`{`{`yar`j`{ae`{`j`{`w`y`r`y`j`{`y`j`w`y`j`{`j`y`y`jar`jae`w`y`y`q`{`y`{`yae`{`w`j`y`j`y`yae`q`y`w`j`q`{`j`w`j`{`wae`w`y`j`y`j`wad`j`y`qa``j`jada``jad`ja``j`j`wad`j`j`y`j`y`j`y`y`{`j`j`y`j`w`{`y`j`{`j`y`j`y`w`j`y`j`{`w`y`y`r`y`j`yadadada``j`j`p`jad`padadadadad`yadad`jad`j`p`ja``ja``j`qad`j`yad`j`y`j`p`y`jad`p`j`y`padadadad`jadad`y`j`{`j`y`y`j`y`w`{`j`y`j`y`w`yae`w`j`{`j`{`j`y`j`w`jae`y`w`j`{`j`y`q`{`y`j`j`pa``j`jad`j`j`q`j`y`yae`w`j`{`j`y`j`{`r`y`{`j`y`{`q`j`w`{`r`y`wae`y`w`yae`y`q`{`j`w`y`j`y`j`w`y`j`y`y`j`w`j`y`j`w`y`y`j`w`y`j`q`y`y`j`j`y`q`y`j`y`r`y`j`y`j`y`y`j`y`q`{`y`yae`y`y`w`jar`y`jar`j`y`j`y`j`w`y`j`jad`yadadad`j`ja``j`y`j`y`j`y`j`w`j`{`yae`j`y`y`{`q`y`{`j`y`q`j`y`j`w`y`j`y`y`j`y`j`y`j`y`yae`y`j`yae`j`w`j`{`j`y`y`q`{`yae`w`y`j`q`y`jad`i`iacac`gada``jad`j`y`j`y`y`j`ja``j`yad`j`y`j`w`j`{`w`jar`y`j`y`{`y`r`yar`y`j`y`{`w`j`{`y`j`y`y`j`{`jar`yae`y`yae`y`y`jar`j`{`w`y`j`j`y`r`j`y`{`q`y`j`y`j`{`j`yae`y`y`j`y`q`y`j`y`j`y`j`j`y`j`yad`y`j`j`y`y`qae`y`y`y`j`y`j`y`{`y`yae`y`y`j`y`y`j`y`y`jah`jah`j`y`j`{`j`y`j`y`y`d`y`d`y`j`y`j`y`d`yah`j`jah`jahadad`~ad`had`~ad`~`jah`y`d`y`a`a`a`a", +"atatatat`y`yae`y`y`{`{`y`{`w`j`{ar`y`j`y`j`y`j`y`w`{ae`w`{`{`y`{`yae`y`yar`{`{`y`{`q`{`y`{`y`q`{`y`j`w`j`jad`j`ja``j`{`y`y`{aear`y`{`yaear`{`y`w`{`yae`w`{`{`yar`yar`y`{`j`{`y`{`{`q`y`w`j`{`jar`y`y`q`y`y`j`{`y`j`{`{`y`r`j`{`w`yae`{`y`j`{`w`y`j`y`j`y`y`y`y`j`{a``yae`y`j`wae`y`y`y`q`y`j`yadadadad`jadad`j`jad`j`j`s`yad`j`y`j`j`qad`w`{`y`y`{`j`y`j`w`j`w`j`j`y`y`j`q`y`j`{`q`y`y`j`y`jadadadad`ja``yadad`ja`ad`ja``p`jada``wad`yad`y`j`p`y`ja``ja``jad`y`jad`j`y`jada``q`ja`adadadadad`y`p`y`j`w`y`j`w`y`{`q`y`y`{ae`{`yar`{`j`y`w`{`j`w`{`y`y`w`j`y`j`w`j`{`w`y`j`w`y`j`y`j`s`j`y`yad`y`y`j`y`j`yar`j`y`w`y`{`yar`j`y`j`{`y`y`yae`y`yae`y`j`y`q`y`j`y`{`j`y`q`y`j`y`jar`y`j`y`{`j`y`r`y`j`y`j`y`j`y`y`y`q`{`y`y`y`j`y`q`y`j`y`q`{`j`y`w`y`j`{`j`y`q`y`{`j`y`y`j`{`j`y`j`y`q`y`j`j`y`y`j`y`qa``ja``jad`y`q`{ad`wae`w`y`j`j`y`w`j`{`y`j`j`{`w`j`y`j`y`y`q`y`j`j`y`j`w`j`y`w`j`y`j`y`q`y`y`y`wae`y`y`q`y`j`{`j`y`y`j`y`j`{`j`ya`agasac`m`iadad`y`q`y`y`j`j`w`j`y`jadad`q`y`w`j`y`y`{`j`{`y`j`{`w`j`y`{`y`j`{`j`yar`j`y`y`j`{`wae`y`j`y`j`y`q`y`j`w`yae`w`y`y`{`j`yae`y`{`y`y`q`y`{`j`y`w`j`y`w`y`j`w`{`j`y`j`y`q`y`y`j`y`j`w`y`j`j`y`j`y`j`y`j`y`y`jae`y`y`j`{`j`y`j`j`{`j`{`y`j`y`j`j`y`y`j`y`y`jahad`y`jah`j`y`d`y`d`y`jah`y`d`jah`j`yahadah`j`jaoad`~`j`~ad`~adao`j`d`y`jah`a`a`a`a", +"atatatat`{`yar`j`{`yae`w`yae`{`{`y`{ad`ja``jae`y`yaear`y`{ae`y`yarae`w`{`j`y`jarae`y`yar`j`j`yae`y`q`yad`ja`ad`y`q`y`{`wae`w`{`j`y`{`r`y`y`{ar`y`{`{`{`y`{`{`q`{`{`j`y`jar`{`y`wae`y`y`{ae`y`y`y`j`w`y`{`jar`y`jar`y`y`q`y`y`{`j`w`{`y`q`{`wae`w`j`y`y`q`j`j`y`j`y`j`w`j`y`y`y`{`y`j`w`j`y`q`j`yad`jadad`g`jad`gadad`j`jad`jad`qadada``j`j`j`w`j`jar`y`w`j`y`j`y`y`qad`y`j`yar`y`j`w`y`j`w`y`jadadad`jad`qa``j`j`s`j`jad`y`j`y`p`j`j`ja``j`ja``jad`j`s`j`j`ja``qad`yad`wad`yad`jadadadadad`p`jad`j`yae`j`y`y`j`q`{`y`j`j`w`y`q`yae`y`wae`y`q`{`y`{`jae`y`y`q`{`yae`y`j`{`w`j`y`j`yad`j`yad`j`q`jad`q`{`y`y`r`y`j`{`r`y`j`{`j`w`{`q`{`j`y`q`{`y`q`{`j`y`{`r`y`y`q`y`j`{ae`w`y`j`j`w`j`{`q`y`j`y`j`w`j`j`w`yae`q`y`j`y`j`j`y`q`y`y`j`y`j`{`y`j`yae`y`j`y`r`y`j`yae`y`q`{`y`j`y`j`w`j`y`j`y`y`q`y`p`jad`jad`j`yad`j`y`j`{`j`y`j`{`j`w`j`yae`w`j`w`j`y`j`j`j`y`j`j`ja``j`q`y`j`j`j`y`jar`j`y`{`j`y`jae`w`j`yae`y`{`y`q`y`y`q`j`y`y`j`yad`i`i`n`i`gad`j`y`j`y`q`y`j`y`j`y`jad`y`j`y`j`{`j`{`j`w`j`{`w`{`j`y`jar`j`y`y`j`yae`y`y`j`{`w`j`y`{`y`r`y`{`y`j`y`j`{`y`y`j`y`jar`j`y`{`q`y`j`{`j`w`y`{`j`yae`yae`j`y`j`w`j`y`j`y`{`j`y`j`y`y`j`y`j`y`j`j`y`j`j`y`j`y`j`y`r`y`j`y`{`y`j`y`y`y`j`y`y`j`y`j`y`j`j`y`d`j`y`jah`j`jah`j`j`y`yah`jah`j`yah`y`j`d`yah`jah`j`dadad`~ad`~ad`~ad`dadah`j`a`a`a`a", +"atatatat`{`j`{`jar`y`{`{`y`yae`y`r`y`j`y`j`y`j`y`{`{`yar`{`w`{`j`{`yae`w`{`y`y`y`r`{`yae`y`w`yae`ja``j`jad`y`j`y`yar`{`{`y`{ar`y`{`y`{ar`yae`{`wae`{`q`y`j`{`yar`{`{ar`yae`w`{`{`jar`j`y`j`jar`y`j`yar`j`y`yar`j`yaear`{`yae`y`w`{`j`{`y`w`{`j`{`y`r`y`y`wae`y`q`y`{`y`y`r`j`y`q`{`y`y`{`j`y`p`y`ja``jadadadadad`gad`gadadad`yad`y`jadadad`jad`y`j`j`ja`ae`yad`yaea``jad`y`j`j`j`{`yae`{`y`w`j`ja``p`y`jadad`y`ja``j`jad`yad`j`y`y`p`y`ja``jad`y`jad`yad`j`qad`y`j`ja``jad`w`j`yadadadad`gad`y`j`w`y`y`q`yae`y`y`q`{`y`yae`y`y`w`{`j`y`y`{`y`q`yar`y`wae`y`y`wae`y`w`j`y`j`w`jarad`wad`ja``j`y`s`j`j`y`q`y`j`w`y`j`yae`w`j`y`y`{`j`w`{`{`y`r`y`y`w`y`j`j`y`wae`y`w`y`rah`j`w`y`j`y`wae`y`yar`j`y`y`w`j`y`q`y`{`w`j`w`j`y`j`y`q`y`q`y`j`w`j`w`j`y`q`y`y`j`y`w`{`j`y`y`r`y`w`j`{`j`w`y`q`y`j`{`j`y`y`qadad`j`ja``j`w`jad`y`y`q`y`y`j`y`q`y`y`y`j`y`y`w`y`j`y`j`ja``j`y`y`j`w`y`j`y`{`j`y`y`q`{`w`y`{`{`y`w`j`{`q`yae`w`y`j`y`j`y`jadad`n`h`n`gadada``j`y`j`y`j`j`y`j`jadad`y`j`y`w`y`j`y`y`j`{`y`j`{`y`w`{`j`y`wae`y`y`{`q`y`w`j`{`j`w`j`y`{`j`{`q`{`y`w`j`{ar`y`j`y`yae`sae`y`j`y`y`{`jar`y`y`j`y`j`w`yae`y`y`j`y`y`j`j`y`q`y`j`y`j`y`wad`y`j`y`y`j`y`y`j`y`j`y`y`j`j`y`y`j`{`j`y`j`y`y`j`y`y`j`y`j`y`j`y`j`y`j`y`y`jah`j`j`j`y`jah`y`d`y`d`y`d`j`yah`jao`j`~`j`~ad`~ad`~ad`~a``d`y`a`a`a`a", +"atatatat`y`y`j`y`{`y`r`{`yar`{`{`{`jar`ja``j`ja`ae`w`{ae`yae`{`yarae`w`y`{`{ae`wae`y`y`{`j`y`j`y`jadadadad`q`y`w`{`y`{ae`w`{`{`j`w`{`r`y`jar`{`y`{`y`{`yar`j`{`wae`{`j`w`{`{`j`y`y`j`y`q`{`y`y`{`j`{`y`j`{`yar`j`y`y`y`j`{`w`{`{`jar`y`j`yae`w`{`y`{`y`j`y`ja``j`yae`j`wae`y`y`yae`y`j`j`w`j`y`y`j`wad`j`yadadadad`gadadadad`jad`y`j`wad`yad`yadadadadad`jadadadadad`jadad`ja``y`q`y`j`w`j`y`y`j`gad`jada``j`j`y`p`j`y`p`yad`j`sad`j`y`p`j`yad`wad`j`w`yad`yada``jadad`w`j`jadadadad`jadadad`yad`y`j`{`j`y`yar`j`y`yar`j`yar`j`{`j`w`{`j`wae`{`j`y`j`j`yar`j`y`jar`y`j`{`j`{`q`y`y`j`y`j`p`j`w`j`y`j`y`j`j`yae`y`j`{`q`y`y`r`y`j`w`{`j`y`r`y`yae`yae`w`j`w`{`y`j`{`j`y`jar`y`jar`y`j`{`y`w`{`q`y`y`r`j`y`{`j`y`j`yae`y`y`r`y`j`yae`y`q`y`j`y`y`r`y`y`jar`j`y`j`j`w`r`y`yae`y`j`y`y`j`{`j`w`j`j`w`j`y`j`p`yad`p`j`j`j`y`j`y`j`j`{`q`y`j`y`j`{`j`y`q`y`j`j`w`ja``j`y`q`j`j`y`j`j`y`j`y`j`y`j`y`j`{`j`j`y`jae`y`j`y`j`y`j`j`y`q`y`jadag`gac`gadad`y`j`w`j`y`y`j`y`ja``jadada``j`q`y`j`{`j`wae`y`jar`j`w`j`{`jar`j`yae`w`yae`j`y`{`j`{`y`yae`y`q`y`j`y`{`j`{`j`y`j`w`j`{`q`{`y`y`jar`y`q`y`j`yae`y`q`y`j`y`j`w`j`y`j`y`j`y`y`y`j`y`j`y`j`y`j`y`j`j`y`j`j`y`j`y`j`y`y`j`j`y`j`j`y`j`y`j`yae`j`y`j`y`j`y`d`yad`da``jah`jah`j`j`yah`jah`j`d`y`j`y`d`y`d`y`d`jah`y`jaoad`~`jaoad`~ad`~ad`~`a`a`a`a", +"atatatat`{`{`wae`y`{`y`r`y`yae`w`y`{`j`y`j`j`ja``j`y`{`w`{`{`y`{`y`{`{`q`{`y`y`yae`y`q`y`{`qa``jadad`y`ja``j`yaear`yar`{`{`{`{`j`{`y`{`w`y`j`{ar`y`r`y`{`y`{`j`{`wae`{`y`r`yar`{`y`q`{`{`j`w`j`{`q`y`{`j`w`j`yae`w`yae`w`{`j`y`j`w`yae`y`y`yae`y`q`yae`y`wae`y`w`j`y`j`y`y`rad`yar`j`y`j`y`q`y`j`yad`y`qad`yadadagadadadad`y`y`j`w`j`j`yad`{`j`sad`y`jad`gadad`gadad`gadadad`y`j`{`y`j`y`y`q`y`jadadadad`jadad`jada``q`yad`jad`y`jad`ja``q`j`yad`y`qad`j`jad`w`ja``jad`yadada``j`padadadadad`q`y`y`q`y`j`w`{`j`w`j`yae`y`yarae`y`y`j`y`{`y`jar`y`{`w`y`j`y`r`y`yae`w`y`y`q`y`y`jar`y`j`wa``j`j`j`y`w`j`y`j`j`y`y`j`y`{`j`y`{`y`j`yae`w`y`{`q`y`{`q`y`{`{ae`w`y`r`yar`y`{`y`{`j`jar`y`{`j`y`yae`w`{`yae`y`w`jar`y`y`q`y`y`j`w`y`j`y`j`y`y`q`y`j`yae`y`y`j`y`w`{`j`y`yae`w`y`jar`y`q`y`j`y`y`j`y`j`y`ja``j`yad`ja``y`q`y`q`y`j`y`y`j`y`y`{`j`y`wae`y`j`y`y`j`w`j`j`yad`y`j`y`w`j`y`j`w`j`{`q`y`j`w`yae`w`y`w`y`j`y`j`y`y`j`j`y`jadadadag`gadad`j`y`y`y`q`y`q`y`j`wad`yadad`y`{`y`q`yae`y`y`wae`y`y`{`j`w`y`{`y`y`y`r`y`y`yae`w`y`r`y`j`w`y`{`j`{`y`w`{`j`y`{`j`{`{`y`y`j`y`r`y`y`{`j`{`w`y`{`q`y`y`jar`y`j`y`jar`y`j`y`j`{`y`y`j`y`j`y`w`j`y`w`j`y`y`q`y`y`j`y`j`y`j`y`j`y`j`y`y`j`y`j`y`j`y`y`jah`j`y`j`y`j`y`jad`y`jahad`y`ja``jah`j`y`d`y`jah`y`jao`y`jah`ja``dad`dadao`j`~ad`~ad`a`a`a`a", +"atatatat`{`w`{`j`{`y`j`{`{ar`y`{`y`{`y`jad`y`w`yae`{`{`yae`y`j`{`q`{`j`{`j`{`{`jar`j`y`y`j`jad`ja``jad`j`y`{`{ar`{`y`{`j`{`w`{`{`warae`yar`{`{`jar`y`{`y`{`q`{`y`{`y`{`w`yae`y`y`r`{`y`y`yae`ya`ae`y`q`{`j`yar`j`{`y`yae`w`y`j`y`{`yae`yar`yae`w`{`{`j`w`j`{`y`y`j`y`j`w`{`y`q`y`j`y`y`w`j`y`j`y`j`p`y`y`j`yad`j`gadad`jad`y`j`w`j`y`{`j`y`w`y`j`y`j`yadag`gadajadad`gajadagad`y`y`q`y`q`j`y`j`{`y`p`g`jadad`p`yadad`j`j`wad`y`j`s`j`y`jadad`y`ja``j`ja``y`j`ja``q`ja``j`ja``qad`jad`gad`jad`yae`y`{`j`w`y`yae`y`y`{`q`y`q`{`j`y`q`yae`w`j`{`y`j`yae`w`{`j`y`y`y`r`y`yar`j`y`{ae`y`q`y`{`j`w`yadad`j`y`q`y`s`j`j`w`y`r`y`wae`wae`w`{`j`y`q`{`y`q`{`y`jar`j`y`j`{`w`yae`yae`w`jar`y`yae`w`y`qae`y`j`w`j`y`yae`y`j`{`j`{`q`{`j`{`w`j`j`yar`j`j`y`j`j`w`y`q`y`j`y`j`y`w`yae`j`y`yae`y`y`j`y`q`y`q`y`y`q`j`y`q`jad`jad`j`j`y`j`y`q`y`q`y`jar`j`w`j`y`j`y`y`q`yad`y`ja``q`y`j`w`j`j`y`q`y`{`j`y`y`y`j`{`j`y`j`j`{`q`y`j`y`j`ja``jadadad`g`gagadad`y`j`y`j`j`y`j`y`j`y`jadadad`{`q`y`j`y`j`{`yae`y`{`y`q`y`{`yae`y`q`{`j`y`{`y`q`y`{`y`j`y`yae`j`y`wae`y`j`yae`w`y`j`jar`j`y`j`y`yae`w`y`j`y`j`j`y`j`y`{`j`j`y`{`j`y`j`y`j`y`j`y`r`y`j`y`j`{`j`y`j`y`j`y`j`j`j`y`j`y`j`y`j`y`j`y`y`j`{`j`y`y`j`{`y`j`j`y`y`j`j`y`d`y`d`y`~`j`y`jah`jah`j`y`d`y`jah`j`y`d`y`d`y`d`y`d`jaoad`~ad`da``~`~ad`a`a`a`a", +"atatatatae`y`yar`{`j`{`yae`y`r`{`r`y`{ar`j`j`jadadadae`j`y`{`j`y`y`r`y`y`w`j`y`{`jae`j`ja`adadad`ja`ad`j`w`j`{`y`r`{`{`yae`yaear`{`y`{`j`{`q`y`{`j`{ar`{`yaear`y`{ae`y`{`wae`y`y`{`q`yar`j`y`q`{`{`y`y`jar`y`yae`j`w`y`j`y`y`r`j`y`yar`j`y`{`{`j`y`y`{`yar`j`j`w`yae`y`j`j`j`y`wae`j`y`y`q`j`y`{ar`j`j`y`jadad`jad`g`j`jad`w`y`{`y`wae`w`yae`y`ja`ar`j`y`yad`j`sadad`i`g`iag`h`j`j`y`y`y`w`j`y`q`y`jadadad`yadadad`y`jadad`y`jadad`j`wad`y`p`jad`q`yad`qad`yad`jad`ja``qad`j`~adada`ad`p`yad`w`j`y`y`yae`y`w`yae`y`y`{`{`y`y`w`{`y`{`w`{`y`q`{`y`j`yae`w`yae`j`w`{`j`{`y`r`y`w`y`{`y`r`y`j`y`wae`sad`j`j`y`j`yad`j`y`j`j`y`yae`y`w`j`{`yae`y`j`yarae`y`yar`j`y`{`jar`yae`y`j`y`{`j`y`yae`y`y`yar`yae`wae`w`yae`w`y`q`y`{`j`y`yar`y`{`j`y`j`w`y`j`y`j`yae`y`w`j`j`y`jar`y`y`q`{`yaearae`y`y`y`j`y`w`j`y`j`y`qa``y`jad`w`j`y`j`y`j`y`j`y`yae`y`y`q`y`j`{`j`w`j`j`j`y`j`y`q`y`y`y`j`y`j`w`{`j`{`q`y`y`w`j`y`j`y`y`q`y`j`y`j`yad`jadad`i`gadad`j`y`j`y`w`j`y`j`w`j`jadadadad`j`y`j`w`y`r`y`j`y`q`{`yae`y`q`y`{`y`y`jar`j`{`j`{`y`q`{`y`q`yae`w`y`{`j`y`yae`y`y`{`j`y`yar`j`{`w`j`j`y`{`q`y`y`wae`y`w`j`y`y`q`y`j`y`q`y`w`j`y`j`yar`y`q`{`y`j`y`j`y`j`y`y`jad`j`y`j`y`jah`j`y`j`y`j`y`j`y`j`y`j`y`y`y`j`yah`j`y`jad`y`j`y`d`yad`j`yah`j`y`y`d`y`d`y`jah`jah`jah`jao`y`jahad`dad`jad`~ad`a`a`a`a", +"atatatat`{`q`{`j`{`y`wae`y`{`{`y`yar`{`j`yad`hadadad`j`y`y`j`{`w`j`y`j`yae`y`j`wadadada``j`ja`adad`q`y`{`{`{`y`{`yar`y`{ar`yar`{ae`w`y`{ar`y`{`{`y`w`{`j`{`y`y`{`{`w`{`wae`y`{ar`{`y`{`j`yae`y`yae`y`q`{`{a``jar`y`{`yaear`y`{`{`w`{`j`{`y`w`{`y`w`yae`w`j`{`w`y`{`j`y`w`y`y`y`y`j`y`w`j`{`y`q`y`j`y`w`yad`ja``j`g`ga``j`y`y`j`{`jar`yae`y`y`{`j`yae`y`y`w`j`{`y`yadad`gag`gacadad`y`j`wae`y`j`y`y`ja``padadadadadad`p`ja`adad`jad`yad`jad`j`y`ja`ad`ja``jad`j`wad`y`j`ja``j`sadadadad`jad`p`y`y`j`y`r`y`q`yae`j`wa`ae`j`w`j`{`j`w`j`{`q`{`yae`y`yae`w`yae`y`y`w`j`{`j`y`j`y`y`jae`w`y`{ar`j`y`{`j`y`y`p`j`y`y`j`w`j`yad`q`{`q`y`j`{`y`j`y`q`y`yae`y`j`y`j`y`{`q`{`y`j`w`{`yar`y`j`w`jar`y`j`wae`y`j`{`y`y`jar`y`{ae`y`j`w`{`q`yae`j`y`w`j`{`j`y`j`y`w`j`yae`w`{`j`{`y`j`q`y`y`j`w`y`j`yae`y`r`j`y`j`{`p`y`j`j`y`j`p`ja``j`j`y`y`j`j`wae`y`j`w`y`j`j`w`j`y`j`y`y`qad`y`j`j`yae`y`j`y`y`j`y`q`y`j`yae`y`j`w`{`j`y`j`y`q`y`jadadad`gad`gad`ja``j`j`w`j`y`j`y`y`j`yadadad`jad`y`{`j`y`j`y`w`{`j`{`y`y`j`{`y`j`{`q`j`{`y`j`y`wae`y`j`{`y`j`y`y`{`j`yar`j`w`yae`w`j`{`y`j`{`j`y`j`y`y`y`j`j`{`j`j`y`j`{`q`j`y`j`y`j`y`{`j`y`{`j`{`y`j`{`j`y`j`y`j`y`j`y`j`j`y`j`y`j`y`j`y`j`y`j`j`y`j`y`j`y`j`y`y`j`j`y`y`j`j`y`y`jah`y`d`jadah`jao`j`dadah`d`y`d`yao`j`d`y`d`y`j`y`jah`j`~`yad`~ad`~ad`a`a`a`a", +"atatatat`y`{`y`yae`y`{`wae`y`j`{`j`{`y`{`qadadadadag`g`jad`yae`y`yae`w`ja``j`jadad`jad`jad`j`j`y`j`y`y`jar`y`{`j`{`yar`{`{`y`{`y`{`{ar`y`jar`{`{`{`j`{ar`{`jar`j`yae`{`y`yae`y`j`y`r`y`yar`j`w`y`j`{`y`j`{`y`yae`y`j`y`y`j`w`j`j`y`{`q`{`y`jarae`y`j`{`y`w`jae`y`q`y`j`y`qae`j`y`{`j`j`y`j`{ad`y`q`j`yae`wadadadadajad`j`ja``w`j`y`j`w`{`j`w`y`{`y`wae`y`{`wae`y`yar`yad`yadag`gajadad`y`j`w`j`{`j`w`j`yadad`p`j`gad`yad`j`y`qa`adad`y`ja``jad`wad`j`ja`ad`y`jad`qa``j`pad`j`yadadadadad`j`y`q`y`j`y`y`j`yarad`{`y`q`{`y`j`y`{`yae`y`j`yar`jar`y`q`yae`yar`j`{`yae`w`yae`w`{`w`j`y`j`y`j`y`wae`y`j`w`j`j`qad`{`j`y`yae`ya``j`j`y`w`j`{`w`{`jae`w`y`jar`y`{`q`y`{`q`y`{`j`{`j`yar`y`{`{`y`r`y`{`{`w`j`w`j`{`y`{`q`y`{`w`y`{`j`{`q`y`y`j`y`q`y`y`q`yae`y`q`y`y`j`w`{`q`yae`y`j`{`j`y`w`j`y`w`y`{`j`y`y`j`y`w`j`y`pa``j`jad`y`q`j`y`{`j`y`j`y`j`y`{`w`j`yar`j`y`j`ja``ja``j`j`s`j`j`y`j`j`y`y`y`j`y`j`yae`y`j`y`j`w`y`j`jad`yadadadajadad`g`j`y`y`j`y`j`y`w`j`jad`jadadadad`y`j`y`yae`y`y`j`w`{adar`j`w`{`yae`y`y`y`r`y`y`j`y`{`wae`y`{`wae`y`j`yae`y`y`j`w`y`y`j`w`j`y`q`{`y`j`j`y`q`y`w`j`y`j`{`y`j`y`y`j`y`j`y`y`j`y`j`wae`y`yae`y`y`y`j`w`{`y`j`y`y`j`y`jad`y`j`y`j`j`y`j`y`j`y`y`j`y`j`y`y`j`y`jah`y`j`y`j`yad`ja``d`j`y`j`ja``j`da``y`d`j`y`d`y`d`y`d`y`~ah`j`y`d`jao`j`~a``~ad`a`a`a`a", +"atatatat`j`yae`w`{`yar`{`y`{`y`j`{`yae`y`j`yadagagacac`iad`jad`j`y`j`y`j`y`jadadad`yada`a`ad`y`y`y`{`w`{`{`{`w`{`{ae`{`j`{ar`y`{`q`{`j`{ar`y`{`wae`yar`y`jar`{`{`{`{`w`{`{`w`{`wae`y`{`wae`y`{`y`{aradar`y`j`w`j`{`y`wae`{`y`yar`ja``{`j`w`{`y`y`{`w`q`{`j`y`j`y`y`j`y`j`y`ja``q`y`j`wa``w`j`y`w`j`y`y`j`yada``jad`ga``j`y`p`yae`y`y`y`{`y`wae`{`wae`y`{`q`yae`w`y`{`j`w`y`qa`ad`gadad`j`y`j`y`j`w`j`y`y`j`q`yadadadadadadad`jadada``jadad`p`j`ja``j`yad`jad`yadad`y`jad`y`padadadadadad`j`yad`{`w`j`{`q`{`y`y`{`r`y`{`y`j`y`wae`w`y`{`w`j`{`y`j`yae`y`w`j`y`j`w`j`y`y`w`j`{`j`yar`j`y`jar`j`yae`wa``j`ya``y`j`jad`wae`w`y`j`wadad`j`w`j`y`q`y`y`y`j`y`jar`j`y`y`{`j`w`y`y`jar`yae`w`jar`j`y`{`q`j`{`y`{`y`yar`j`yar`yae`yae`w`y`y`{`wae`y`y`q`y`y`j`w`j`y`j`j`y`j`y`y`y`y`w`j`w`{`j`y`{`q`yae`y`w`j`q`y`j`j`w`j`y`jada``jad`yad`j`y`j`y`j`w`y`qae`y`w`j`j`y`w`j`j`w`j`q`j`y`j`y`q`y`j`y`j`y`j`j`y`q`y`q`y`j`ja``j`jad`yad`jadadadad`gad`j`j`y`y`j`j`wae`y`j`yadadadadad`j`j`{`q`y`jar`j`{`y`yae`y`{`y`j`{`y`q`{`yae`y`q`y`{`j`y`q`y`j`{`q`yae`y`q`y`j`yae`w`j`{`j`y`y`j`y`j`y`j`y`y`j`j`y`j`y`q`y`j`j`y`j`y`j`yae`j`w`{`y`j`y`y`q`y`j`y`j`y`{`j`w`j`w`j`y`y`j`jada``j`yad`y`j`y`j`y`j`y`y`j`y`j`y`y`j`y`d`y`d`y`jah`ja`ad`da``d`y`d`y`d`jah`jah`jahad`d`y`d`y`d`jah`y`j`da``dad`~`a`a`a`a", +"atatatat`j`j`y`{ae`{`y`r`y`{`w`jae`w`y`j`j`yad`g`i`gac`g`gadad`jad`j`jadad`y`j`s`j`j`j`j`yar`jar`{`j`{`yae`j`yar`{`yar`{`yaear`{`{`y`y`{`j`{`y`{`w`{`yae`y`{ar`j`y`{`{ae`y`{`j`y`{`j`{`y`y`r`y`j`j`y`y`jar`j`y`yar`j`y`q`y`j`{ae`y`q`y`{`j`{ae`w`j`{`y`j`w`j`{`w`j`y`j`w`y`j`y`y`wae`y`j`j`q`y`jad`y`wad`j`w`jadaj`gad`j`j`y`y`q`{`j`wae`y`y`yae`yar`j`{`w`y`j`{`q`{`j`y`y`{`q`yadadadad`q`j`y`yae`yad`y`j`y`j`p`ja``padadadadadadad`q`ja`ad`yad`p`y`jad`p`jad`j`p`yadadad`jadadadadadad`p`y`y`j`{`y`y`q`{`j`y`{`j`w`jar`y`j`y`j`y`r`y`j`y`q`{`y`y`w`{`yae`y`w`j`{`j`y`w`j`y`w`j`j`{`w`j`j`y`wae`y`q`y`j`w`jad`ja``j`y`jar`y`{`j`y`j`j`y`j`y`q`yar`j`y`w`{`j`w`j`{`j`{`q`{`j`y`j`j`y`j`y`{`q`y`j`y`wae`q`{`j`yar`jad`{`q`y`{`j`y`q`{`j`w`j`yae`w`j`{`j`y`q`y`q`yae`q`y`r`y`{`yae`w`j`{ad`y`j`wae`y`y`j`y`y`j`j`y`q`j`y`p`j`ja``jad`j`y`j`j`y`j`y`j`y`j`y`j`w`j`y`y`ja``j`j`y`j`j`y`y`q`j`y`q`y`j`y`y`j`y`j`w`j`ja``j`yadad`jadad`jadad`g`j`q`y`q`y`j`y`j`ja``jadadadadada``y`j`y`j`y`y`j`w`j`y`y`q`yae`w`j`y`{`q`y`y`j`y`q`y`{`j`{`j`y`y`y`q`y`y`j`y`y`j`y`j`y`y`j`j`y`y`j`y`w`j`w`j`y`y`j`y`j`y`j`y`y`j`j`y`y`j`y`y`j`j`y`{`w`j`{`yar`j`y`y`j`{`y`j`y`j`y`y`j`y`j`~`j`y`jad`j`y`j`j`y`j`j`y`j`y`j`y`j`y`j`y`j`y`jad`dad`yad`dad`y`d`y`y`d`y`d`y`d`y`y`j`d`yad`yah`jah`j`yad`d`y`~`a`a`a`a", +"atatatat`j`{`y`j`{`j`yahae`r`y`{`j`y`y`j`y`wad`k`g`g`g`gadadad`jada`adadadadad`y`ja``{`y`wae`y`{`yar`{`w`{ar`y`{`y`r`y`y`{`w`{`y`r`yar`{`{`w`{ar`j`{ar`{`{`w`{`{`y`q`{`w`yar`j`{`w`{`q`j`y`{`j`w`y`{`r`y`j`y`y`q`{`j`y`y`j`w`j`y`y`{`yae`y`yar`j`y`yae`y`y`yae`y`j`yar`y`j`{`r`y`{`j`y`j`y`y`y`y`q`y`j`yad`jadad`gad`g`j`y`y`y`j`y`w`{`j`y`yae`{`w`y`{`{`y`{`r`y`{`y`{`y`{`q`{`yaradad`ja``j`y`q`y`j`w`y`q`y`j`y`y`j`yadadadadadadadad`yadad`j`ja``j`jadada``qa`a``j`jad`yad`ja`adadadad`yae`w`yar`y`q`y`{`y`j`w`y`j`{`y`yae`yar`{`y`j`{`q`y`y`y`r`yae`y`w`{`j`y`{`j`wae`yaear`y`j`w`y`j`y`y`j`y`q`y`y`j`{ad`w`j`j`s`j`j`y`y`q`j`y`w`y`padae`yae`y`j`y`yae`w`j`y`wae`w`yae`y`w`yae`w`y`y`q`y`w`{`j`{`q`y`y`yar`j`y`{`j`y`y`j`y`r`y`y`j`y`y`y`q`y`y`j`y`w`j`y`y`j`y`j`y`yae`y`j`yae`y`y`{`q`y`{`y`j`w`yae`w`y`j`w`y`j`y`j`y`wad`jad`p`ja``j`w`j`y`j`w`j`y`r`y`j`y`q`y`j`w`j`yadad`yad`j`y`j`y`y`q`y`j`j`y`j`y`ja`ad`j`jad`jad`yadadadadad`j`y`y`j`y`y`q`y`yadad`gadadadadad`j`yae`j`y`{`q`y`{`y`q`{`y`j`yar`y`j`y`y`j`{`w`yae`yae`w`y`j`wae`y`yae`w`j`{`q`y`j`w`y`j`y`y`j`y`j`{`j`y`j`y`q`y`q`y`j`y`j`j`y`j`y`j`y`j`y`j`y`j`yae`y`j`j`y`j`{`j`y`j`j`y`j`y`y`j`j`yad`y`jad`y`j`y`jao`j`yad`y`j`yadah`j`j`y`j`ja``d`j`~a``j`~adad`~`jao`j`da``d`y`dadah`j`da``j`y`d`jah`jah`jah`j`d`y`a`a`a`a", +"atatatat`j`y`{`yae`y`j`w`y`j`{`y`q`{`j`w`j`yadadad`~ad`~adadad`ja``j`yad`p`j`jadad`j`{`{`yar`j`{`{ae`y`{`{ae`y`w`{`{`jarae`{`y`{`{`{`yarae`{`y`{`yae`yarae`y`{`r`{`yae`{`y`{`w`j`{`y`{`y`r`y`y`jar`y`yae`yae`y`yae`y`q`y`{`jar`{`q`yar`yae`yar`j`y`q`y`jar`y`j`y`j`y`j`y`w`j`{`ja`ae`w`y`j`j`j`y`j`q`yad`ja`ad`jad`gadad`q`y`j`{`j`y`{`yar`j`w`{`y`r`y`j`w`y`y`r`y`r`y`j`{`j`y`j`y`{`wad`jad`y`j`w`j`j`y`j`y`q`y`j`wad`y`jadadad`jadadadadad`padadad`yadad`j`y`qadadad`jad`yadadadadad`g`y`j`j`y`j`y`j`w`j`w`yae`w`y`j`{`q`y`jae`w`j`yae`y`j`w`j`y`q`{`j`y`r`y`j`w`{`j`y`w`y`j`y`j`y`q`y`j`y`j`{`j`j`w`j`{`y`j`w`j`y`j`j`j`q`y`j`w`j`j`y`s`j`j`w`j`j`w`j`yae`y`y`j`{`j`y`j`j`y`yae`y`r`y`j`{`y`r`y`y`y`r`j`{`yae`w`yae`w`j`y`j`y`q`y`j`{`q`yae`w`y`j`j`{`wae`y`w`j`y`j`w`j`w`yar`j`y`r`y`{`q`y`{`y`j`y`j`{`j`y`j`y`q`y`j`y`j`y`p`y`jadad`y`j`y`q`y`j`y`j`y`q`y`j`y`j`y`j`wad`y`j`j`yad`j`y`j`j`y`j`y`j`j`yad`jada``j`yadad`j`}`}`}`}`}`}`}`q`y`y`j`y`j`y`jadadajadadadad`ja``w`j`y`q`y`j`y`jae`y`j`{`q`y`j`yae`y`w`j`j`{`y`j`y`y`j`j`y`y`y`j`y`yae`y`j`y`wae`y`j`j`y`j`y`j`j`y`j`y`j`y`j`y`y`qa``j`y`j`y`j`j`y`q`y`j`y`j`w`j`y`j`y`y`y`j`y`y`{`j`y`y`j`j`y`y`j`y`j`yad`jadad`jad`y`j`j`y`jad`d`y`j`jah`j`j`y`ja``jad`~ad`~adao`jao`j`yad`d`y`~`y`jao`jah`jah`j`y`j`yad`y`y`jao`j`y`a`a`a`a", +"atatatat`y`yae`y`j`y`yae`y`j`w`jae`y`y`{`j`w`yadad`g`jad`ja``j`yad`jad`ja`ad`jada``y`j`y`wae`y`{`w`{ar`y`y`{ar`{`yae`w`{`{`{`y`{`q`{`wae`yar`yaear`yar`{`y`{ar`{`y`yar`{`w`{`{`j`y`{`{`j`y`y`r`y`y`{`j`yar`y`{`j`w`y`j`y`j`{`y`j`y`{`y`j`y`j`w`y`j`y`{`w`j`j`y`j`w`y`q`{`y`j`y`y`y`r`y`y`j`y`j`s`j`y`yad`w`jadadadadad`y`j`y`y`jar`y`wae`y`y`{`{`j`y`{`{`y`{`r`y`y`{`j`w`yar`y`{`w`{`j`ya``jada``j`{a``j`y`qa``j`y`j`y`{`j`wa``ja`a``qadadadadadada``jada``jadadada``jadad`qadadadad`gad`y`q`yar`y`{`q`y`{`j`{`y`{`j`yae`yar`y`{`j`yar`y`y`y`{`w`{`{`y`yar`y`yar`y`j`y`w`{ae`y`j`{`j`y`{`y`q`{`w`y`q`y`y`y`q`y`y`y`j`yad`s`y`j`y`y`y`j`y`j`y`jad`w`j`y`j`w`j`y`w`{`j`w`y`{`w`j`w`w`j`yae`y`j`w`y`j`w`j`j`y`w`j`j`y`{`j`y`q`y`y`j`yae`y`q`y`y`j`y`j`{`y`q`{`j`y`j`y`j`w`y`j`{`j`y`{`j`y`{`j`y`yae`j`y`yar`j`y`y`j`w`y`j`y`j`w`j`yad`ja``jad`y`j`j`y`j`y`q`y`j`y`y`j`yad`w`j`y`j`jadad`j`yadad`y`j`yad`ja`adad`ja``jad`j`}`}`}`}`}`}`}`}`}`}`}`}`}`y`j`y`jadadad`gadadadad`j`y`j`y`j`y`y`j`{`y`w`j`w`yae`y`y`{`j`w`j`{`y`j`y`y`j`w`y`j`w`yae`q`y`{`j`y`w`y`j`y`j`y`j`y`q`y`ja``j`y`j`y`j`y`j`y`j`y`j`wad`y`j`w`y`j`y`y`j`y`j`y`j`y`r`y`r`y`j`y`j`y`j`y`j`y`j`y`jad`y`j`ja``yad`da`ad`da``j`y`j`y`jada`ad`y`~`jao`j`~ad`~`gad`~`jad`j`y`d`y`da``jahadah`jah`ja``d`y`da``d`j`~ah`jadah`a`a`a`a", +"atatatat`j`j`{`w`j`{`y`j`y`{`j`y`q`{`j`j`{`y`{`j`ja``~`j`yad`y`ja``jadad`ja``jad`y`q`{`{`yarae`y`yae`{`j`{ae`yar`{`{`{`w`jar`{`y`{`y`{`wae`y`{ar`y`{`yaear`y`j`y`{`{`j`{`yar`{`w`j`{`w`{`j`{`y`q`yae`w`y`j`r`yad`{`j`y`q`y`j`y`j`q`{`j`y`j`yae`w`j`y`j`{`j`w`yae`y`j`{`q`y`j`q`{`y`j`jar`j`yarad`y`j`ja``jad`y`jadadadad`{`q`y`yae`y`{`q`{`w`j`{`{`q`{`wae`y`y`{`w`y`{ae`y`jar`j`y`q`{`y`jad`j`jad`j`w`y`j`y`j`w`jad`j`y`j`j`s`jae`yad`j`yadadadadadadadadad`j`jadadadadadadadadadajadad`y`j`{`j`wae`y`yar`j`yar`j`y`w`yae`y`w`j`{`y`qae`y`j`y`j`j`y`r`j`j`yae`j`w`{`j`y`j`w`y`q`{`y`q`j`y`j`j`y`j`y`q`j`{`j`j`w`j`y`q`y`j`w`j`q`{`q`y`j`w`j`y`ja``j`q`y`j`y`j`w`j`yae`w`j`j`y`j`j`y`w`j`j`y`j`wae`y`y`j`y`j`yar`j`y`q`y`y`q`j`y`j`w`j`y`j`y`j`y`q`j`y`y`j`q`j`y`j`y`j`y`j`y`j`w`j`{`wae`y`j`w`jar`j`y`j`y`r`y`j`y`j`y`q`y`j`y`j`y`jad`jadadadad`j`j`y`j`y`j`q`y`j`w`j`j`y`q`yad`yad`jadadadad`jad`~adad`jadad`jad`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`jadad`gadadadad`gad`j`y`q`j`y`q`y`j`y`j`{`j`y`w`j`jar`y`j`y`y`j`q`y`jae`y`j`y`j`j`y`j`y`j`y`j`j`y`j`j`y`w`y`j`y`y`j`y`y`j`j`y`j`y`j`w`j`y`j`y`j`w`j`y`j`j`y`j`y`j`y`y`j`y`y`j`y`j`y`j`y`j`y`y`j`y`j`j`y`j`~`y`j`j`j`ja`ad`jadad`j`~`yad`jaoad`jadad`jadad`y`jad`hadadadao`j`~`j`~`jah`j`d`jah`j`dadah`j`y`d`y`dadahad`dad`d`y`a`a`a`a", +"atatatat`j`y`j`y`j`y`j`y`{`j`y`y`{`y`w`yar`yae`y`j`sad`y`j`s`j`j`jad`wad`ja``jad`j`y`{`y`y`{`{`w`{`{`w`{`yar`{`y`jar`y`{`j`{`y`{`{`r`y`{`{ar`y`{ae`{`yar`{`y`{aear`yar`yae`y`j`{`yar`yae`w`yar`j`y`y`{`j`y`y`j`w`y`j`wad`{ad`jar`y`j`y`jar`j`y`y`j`q`y`q`y`y`j`y`j`w`{`y`y`y`y`j`j`{`y`y`w`y`j`j`y`j`y`y`ja``qa``jadad`j`y`j`y`j`{`y`q`y`{`y`{`{`q`y`yae`y`y`{`wae`{`jar`yar`y`{`yae`y`{`p`y`ja`ad`w`j`y`j`{`y`wae`y`s`j`w`j`y`j`w`yad`w`ja``qad`yadadadad`yad`jada``qadadadadad`gaj`gadadar`yad`{`w`y`j`{`j`w`yae`w`yae`yar`j`{`y`w`j`{`y`{`wae`y`j`y`y`w`{`y`j`y`y`j`y`w`{ae`y`q`y`j`y`{`q`y`yar`j`y`y`y`j`w`y`j`w`j`y`j`j`y`y`j`y`j`w`j`wae`y`q`y`ja``j`j`w`j`y`j`w`y`j`{`w`y`yae`y`j`y`w`y`{`j`y`j`w`j`y`w`y`j`w`y`j`j`yae`y`q`y`j`y`j`y`j`w`y`j`y`j`w`j`y`y`w`j`y`y`r`j`w`y`y`j`y`y`j`w`{`wae`y`y`q`{`j`y`{`j`y`w`j`j`y`j`y`qa`ad`ja``jadada`adad`q`y`j`y`y`j`j`y`j`yad`j`y`jadadadadad`kad`gadadadadad`yada``}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}adadadadadadadadad`jad`y`j`y`y`y`j`y`q`y`{`y`w`j`y`{`j`y`j`y`q`y`j`y`y`j`y`q`y`q`y`y`w`j`y`y`w`y`j`y`w`j`y`j`j`y`q`y`j`j`y`w`ja``q`y`j`y`y`j`{`w`j`y`j`y`j`y`y`j`y`j`y`j`y`j`y`j`y`j`y`j`y`j`y`jad`y`da``j`y`j`y`~a`ad`jad`~ad`~ada``jad`y`jad`~ad`~adaoad`~aj`~`g`iad`~`dad`jahad`y`jahadahadah`jahad`d`y`dad`~ad`d`y`~adahad`a`a`a`a", +"atatatat`i`y`j`j`y`j`w`j`y`{`j`w`j`{`{`j`{`w`{`y`y`j`y`q`y`ja``ja``j`j`y`j`w`j`{`w`{`{`q`y`{`j`{`q`{`{`{`w`{`{`yar`y`{ar`yae`w`{`yar`{`j`{`yar`j`{`wae`y`{ar`y`yae`y`{`r`y`y`r`{`y`yae`y`y`{`j`{`wae`y`w`j`yae`y`j`j`y`w`j`y`y`y`j`y`q`y`j`y`j`wad`y`y`j`jar`y`{`j`y`q`{`jar`y`w`yarae`j`y`yae`s`j`y`q`y`q`y`j`yadadadad`j`y`j`w`{`y`{`q`{`y`r`y`{ar`y`yar`j`{`y`y`w`{`j`y`{`r`y`w`{`j`y`jar`y`ja``jad`j`q`y`j`y`w`j`y`j`y`y`j`j`y`j`yaea``q`y`j`qa``jadadadad`gadad`jad`gad`padad`hadadad`jar`y`jae`y`w`yae`{`y`j`{`j`w`j`y`y`j`{`j`y`q`{`j`y`w`{`wae`j`y`jar`y`jar`{`j`y`j`w`y`y`j`w`j`y`j`q`y`j`y`q`{`j`w`j`y`j`ja``j`j`w`j`yae`y`{`j`y`y`q`yad`q`y`j`p`j`j`y`j`y`{ar`j`j`{`j`w`j`y`w`j`{`j`w`j`y`j`j`y`j`y`q`y`j`y`q`y`j`w`j`y`w`j`y`q`j`j`y`j`y`j`y`y`j`q`y`j`{`j`y`j`y`j`j`r`y`y`j`{`j`y`y`jar`yae`y`y`q`j`y`j`y`y`q`y`j`y`j`w`jadad`yad`q`jadadad`j`jad`y`jad`j`y`jadad`y`jadadad`gag`gagag`i`gaj`gad`q`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`jadadadadadad`jad`y`j`w`{`q`{`q`y`y`{`q`j`{`j`y`j`w`y`j`y`j`y`q`y`j`w`j`y`y`j`j`j`j`y`j`y`j`j`j`y`j`j`y`j`y`j`y`j`j`w`jad`y`j`y`j`y`j`w`j`j`w`y`j`j`w`yae`y`j`y`q`y`j`y`j`y`j`y`j`y`j`j`y`j`y`j`y`~`j`jad`dadad`jadad`jadadadad`~ad`~adadadadadadad`~adad`g`i`g`i`h`gad`~ad`~ad`dad`~ad`dadahad`~`jaoad`da``d`y`~ad`dad`da``j`a`a`a`a", +"atatatataqae`y`y`j`{`{`j`w`j`y`j`{`{`j`{ar`{`j`{arae`y`y`j`y`j`j`jad`y`j`y`y`{`w`{`y`j`{`yaear`{`y`{ar`yae`{`j`{`j`{ae`{`y`{`{`j`yae`yar`j`{`j`yar`{`y`yae`yaear`yar`j`{`y`yar`y`{`jar`{`w`jae`w`y`j`{`j`y`j`w`yar`j`y`y`{`j`y`q`j`j`y`y`j`s`j`y`j`y`q`{`y`j`yae`w`j`y`{`j`w`yae`y`j`j`y`y`q`y`j`w`j`y`j`j`y`j`s`y`qadad`y`j`j`y`yae`{`yar`j`yar`yae`yar`j`yar`yar`{`j`{`y`r`y`y`{`j`{`y`w`j`{`q`y`p`jad`y`j`jad`j`y`y`j`{`q`y`y`{`qa``j`w`j`y`j`y`j`p`yad`qadadadadadadadadadadad`gadadad`{`y`q`y`{`y`{`j`{`w`yar`j`w`y`{`y`j`w`j`{`w`{`j`wae`yae`y`j`y`y`w`j`{`y`j`{`j`w`y`j`j`wae`y`j`y`j`y`j`y`j`y`j`w`j`j`y`j`y`j`w`j`y`j`y`j`y`j`w`j`w`j`y`j`y`y`j`yad`y`p`j`j`w`j`y`j`y`j`y`j`w`j`{`j`w`j`y`j`w`y`y`q`y`j`ja``jae`y`y`j`y`j`y`j`j`y`y`j`w`y`j`q`y`j`q`y`y`j`y`j`w`j`y`j`y`j`y`j`y`j`w`{`y`r`y`{`y`jar`y`{`j`w`yae`w`j`y`j`y`y`jad`yadadadadadadadadadad`j`w`j`y`p`y`j`s`jadag`gag`iac`iac`gac`i`g`iad`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}adad`jadadadad`y`q`{`j`y`j`y`y`y`{`q`y`yae`y`y`yae`y`q`y`j`w`y`j`y`y`j`y`q`y`j`y`y`y`j`j`y`y`j`y`y`j`y`y`w`j`q`y`y`j`y`y`j`y`j`y`w`j`y`{`y`j`y`jar`y`{`y`j`w`yae`y`y`j`y`j`y`j`y`j`yad`ja``jad`y`j`yad`ya``ja``ja``~ad`~adadadad`jadada``j`~`jad`~adadadad`hag`hag`i`hag`~`g`~ad`~ad`~ad`~ad`~`jaoad`~`j`~`y`j`~`yad`y`~`y`d`a`a`a`a", +"atatatat`v`h`j`{`y`j`{`y`{`{`q`{`yar`{`y`{ae`w`{`{`w`{`{`y`j`s`y`j`w`y`w`{`{`j`{ar`{`w`{`y`{`yarae`y`{`w`y`{`w`yar`y`{`q`{`j`yar`{`y`j`{`w`{`yar`j`{ar`j`{ar`yae`{`y`w`{ae`yae`y`{`yae`y`{`w`{`j`y`w`{`y`j`yae`y`y`q`j`w`j`{`j`y`y`w`jad`y`j`y`y`j`y`j`j`w`y`j`y`y`w`j`{`y`j`yae`w`y`j`{`j`y`j`y`yar`ja``y`j`y`j`y`j`yadad`j`w`j`{`{`q`{`{`y`{`y`{`q`y`{ar`{`yae`y`w`{`{`j`y`r`y`w`{`wae`y`y`j`y`y`{`w`jada``q`y`j`q`y`y`j`y`j`q`y`j`w`yae`w`y`j`y`y`j`y`{`s`jad`wad`j`s`jad`jadadadad`j`w`y`{`j`y`r`y`w`yae`y`j`{`yae`wae`y`{`{`w`y`j`y`y`y`wae`y`y`wae`y`y`{`q`y`y`q`y`yae`w`y`j`wae`w`y`q`y`j`y`qad`y`j`w`j`w`jad`y`j`y`j`p`y`j`s`j`{`j`y`w`j`j`q`y`j`y`y`jadad`j`j`j`w`y`j`w`j`y`y`q`y`{`j`y`j`y`j`yae`y`q`y`{`j`s`j`y`q`y`j`y`q`y`j`y`j`y`j`y`jar`y`y`j`j`y`q`j`y`y`j`w`ja``q`{`j`w`j`j`y`y`j`y`j`y`j`{`j`w`{`j`y`j`y`q`y`q`j`y`j`j`y`padadad`gadadad`jadadadad`j`yad`j`ja`aj`gacagasacacac`i`magac`m`g`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`jadadadad`y`j`y`y`y`r`y`{`j`j`{`j`{`j`w`y`r`y`{`{`y`j`{`j`yae`wae`y`q`y`j`y`q`y`j`w`j`y`q`y`j`w`j`y`j`y`j`y`j`y`j`j`y`y`q`y`y`jar`j`y`j`{`y`y`j`{`q`yae`y`j`y`j`{`w`j`y`w`j`y`j`y`j`jad`y`jadad`yadad`jad`jadadadadad`gag`~`gadadad`jad`yadad`y`j`jahad`jadad`gad`gad`haj`~`g`~ad`had`~ad`~ad`~`jao`j`~`j`~ad`dad`dad`y`d`y`a`a`a`a", +"atatatataaaa`jar`y`{ar`j`wae`y`{ar`yae`yae`w`{`y`yae`{`jar`y`yae`w`y`j`{ae`y`yarae`{`{ae`{`wae`{`{`yar`j`{`yae`{`{`j`{`y`j`{`y`jad`j`yad`j`j`j`~`j`y`j`yae`y`y`{`w`j`yae`yar`yae`w`j`w`y`q`y`j`y`y`j`j`j`w`y`j`y`q`y`ja``j`{`y`p`yae`y`wae`y`j`w`j`j`y`w`y`j`yar`j`{`j`y`j`{`w`j`y`jar`j`w`j`y`jar`y`j`{`q`y`j`w`j`y`wadadad`y`j`y`q`y`y`q`{`jarae`y`yar`{`j`yar`j`{`yae`y`w`{`y`{`j`{`j`y`y`j`y`q`y`j`y`s`j`jadad`jad`q`y`j`p`y`y`j`y`j`y`ja`ae`y`y`j`w`j`y`j`y`yadad`yad`p`yadadadadada`ae`j`y`w`j`{`j`yae`y`w`j`{`w`y`j`w`j`wae`j`{`q`{`j`yae`y`q`yae`w`y`r`y`q`yae`y`q`y`y`q`y`y`j`y`j`{`j`y`w`j`j`y`w`j`y`j`y`y`q`y`j`w`j`y`q`j`y`j`y`j`y`j`y`yae`y`q`y`j`y`w`yad`p`y`j`y`j`y`{`j`y`y`j`y`q`y`j`y`q`y`q`y`j`y`q`y`y`j`j`y`y`q`y`j`w`y`j`w`j`y`q`y`j`y`j`q`y`j`y`j`y`q`j`y`y`j`y`q`y`j`y`q`y`j`w`jar`j`w`y`{`j`y`yae`w`y`yae`y`w`j`ya`ad`jada``j`jadad`yad`p`y`jad`y`q`ja``jad`gag`g`n`i`g`gagad`g`gagad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ada`ad`jad`w`j`y`q`{`y`j`{`j`{`w`y`{`y`yae`y`{`q`y`r`y`w`{`w`j`{`y`{`yae`y`w`j`yar`j`{`w`j`y`j`y`y`j`y`w`j`w`j`y`y`y`q`y`j`y`q`{`j`y`q`yar`j`y`{`q`y`y`{`y`wae`y`y`j`yae`y`y`j`w`j`y`y`y`j`yad`y`jad`j`y`~adad`ja``jadad`hadagadad`yad`y`j`j`y`j`y`da``j`y`y`jahad`y`~`yad`yadadadadad`~ada``~`j`~a``dad`y`~`y`ja`ah`jah`j`y`a`a`a`a", +"atatatatac`c`k`y`y`{`{`y`{ar`{`y`{`{`w`yar`{`jar`{`yar`{`{`r`y`{`{`{`w`yar`y`{`{`w`y`w`{`j`{`yar`y`{`{ar`yar`yae`w`{`yarad`j`ja``j`yad`ya``j`wad`y`j`p`y`jae`w`j`y`j`w`y`j`y`q`{`{`yae`yae`w`jarad`y`y`j`y`q`y`j`y`j`{`pad`j`y`y`jar`y`ja`ae`w`y`j`w`y`j`j`y`j`y`{`j`wae`y`w`y`{`y`y`y`y`y`q`y`{`y`q`y`y`yae`y`y`w`j`{`yadad`j`y`yae`w`y`{`j`w`y`{`r`y`y`r`y`y`{`{`w`{`w`{`jar`j`w`{`y`r`y`wae`y`y`r`y`j`y`y`j`sa`ad`ja``j`y`jad`y`j`w`{`j`q`y`w`j`j`y`y`q`y`wae`w`y`j`jadad`p`jadadad`jad`y`y`j`w`y`j`w`{`j`y`yar`j`y`j`{`y`y`y`{`q`y`y`j`w`j`y`{`y`q`y`j`y`yae`y`w`yae`y`q`j`{`j`w`j`yadar`j`y`y`j`y`j`y`q`y`j`j`j`y`q`y`ja``j`j`y`p`y`j`w`j`q`y`y`y`j`w`j`w`j`j`y`jad`q`y`j`w`j`y`j`w`y`j`y`j`y`q`y`y`j`y`j`w`j`y`j`y`q`y`j`y`j`y`j`j`y`q`y`j`y`j`w`j`y`j`y`j`y`q`y`j`y`j`j`w`j`y`y`j`y`j`y`j`y`j`y`j`yae`y`q`{`j`y`j`{`j`w`j`{`j`y`r`y`y`q`y`p`y`qa``j`j`y`y`q`y`ja``j`y`qa``j`jad`gad`g`gadadagadadad`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`jad`y`j`y`y`r`y`j`y`w`j`yae`y`j`wae`y`wae`y`y`{`q`y`{`j`y`w`j`y`r`y`{`j`{`y`j`y`{`y`j`y`q`{`j`y`j`{`j`{`y`y`r`y`y`j`y`{`j`y`y`y`{`j`y`jar`j`{`yae`y`q`{`y`j`y`q`y`j`{`w`j`y`j`y`j`y`y`j`y`j`y`y`jadad`y`jadad`dad`jadad`hadadad`j`y`ja``j`y`j`y`j`y`j`d`y`y`j`y`j`y`d`y`jah`jah`dad`~`y`dadah`j`jao`d`y`dadah`j`j`y`~`y`~`a`a`a`a", +"atatatatad`n`h`j`yae`y`r`y`{`jar`{`{ae`{`yae`{`y`{ar`y`yae`y`{`yarae`y`{`{`jar`{`{`{`j`{`{`w`y`{`jar`j`{`{`j`{`w`y`j`{`j`j`w`y`j`wad`j`j`q`y`j`y`j`wad`y`j`yadad`j`p`j`j`y`jad`y`j`jar`jad`y`j`y`j`q`j`j`j`y`j`ja``j`y`j`y`j`y`q`y`jad`j`w`j`j`y`q`y`j`{`w`y`q`yae`s`{`y`w`{`jae`y`jar`jar`y`j`{`j`yaear`j`y`q`y`{`j`{`j`jadad`j`w`j`y`wae`y`{`yae`{`y`{ae`{ar`y`{`q`y`yae`w`{`j`{`y`wae`y`{`y`j`q`yae`w`j`{`q`y`j`y`j`wad`jadad`j`j`j`j`w`ja``j`y`j`y`q`{`j`y`j`{`j`y`w`y`ja`adadadadadad`w`{`q`y`jarae`y`yae`w`j`{`j`w`y`{`q`{ar`j`y`{`jar`y`j`y`q`yae`y`j`w`j`{`y`j`y`j`y`y`y`w`j`{`y`j`y`j`y`j`w`j`w`j`y`ja``j`y`w`j`j`y`q`y`ja``j`j`q`y`w`j`y`q`yae`j`y`y`jad`y`q`jada``j`j`y`qae`y`j`jarad`y`j`y`j`y`j`j`y`j`j`y`q`j`y`j`y`j`y`j`w`j`y`j`y`j`w`j`yad`q`y`j`w`j`y`y`j`y`y`j`j`y`j`w`j`y`q`j`w`j`y`wae`y`w`j`{`y`y`q`y`{`yae`y`w`{`j`y`q`y`j`y`j`y`y`j`w`y`j`y`j`y`q`y`j`y`jad`w`ja`adadadadad`gadad`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}a``y`q`y`y`r`j`y`w`{`j`yar`y`{`w`{`y`j`y`{`{`q`{`y`{`yae`y`{`{ae`y`y`j`y`{`jar`{`j`{`q`{`y`{`y`w`{`y`y`{`wae`y`y`j`y`y`j`w`j`y`j`{`y`q`y`{`y`{`y`j`y`j`y`j`wae`y`y`{`y`j`y`j`y`y`y`j`q`y`y`j`j`y`j`j`y`yad`ja`adadadadadadadad`~`j`j`y`j`y`y`j`j`y`y`j`y`y`j`y`jah`j`y`j`yah`ja``j`yah`j`y`d`y`~`yah`j`yad`d`y`jao`d`y`d`y`a`a`a`a", +"atatatat`y`g`iad`y`y`j`{`w`{`{`yar`y`{`w`{`w`{`{`{aear`{`{`{`wae`y`{`w`{ae`y`{`wae`yar`y`{`yae`{`w`{`yae`w`{`{`{ar`y`y`ja``j`q`ja``j`y`j`y`w`j`y`yae`y`y`p`y`y`w`y`j`y`q`y`jad`yadad`j`y`p`j`y`ja``yad`w`jad`w`j`wad`y`qad`y`j`y`w`j`yad`y`j`w`j`{`y`j`yae`y`y`q`{`j`y`j`{`w`{`w`{`j`{`y`jar`yar`y`y`j`{`y`{`{`{`j`w`{`yadadada``j`yae`y`wae`y`w`y`r`y`y`y`jar`y`{`w`{`{`y`{`w`{`y`j`{`w`j`w`{`y`y`y`j`{`w`y`j`y`q`y`ja``q`yada``s`jada``j`j`y`j`j`w`j`w`y`j`y`y`q`y`{`j`y`q`y`jad`gadadadad`{`y`j`y`w`y`q`y`{`y`j`{`y`{`j`y`j`y`{`j`y`q`{`y`y`j`y`j`w`j`y`y`j`y`q`y`wae`w`j`j`y`j`w`j`w`y`q`y`j`y`j`y`j`w`j`y`j`p`j`yad`y`jad`w`j`y`j`y`j`y`j`y`j`y`y`q`y`j`w`{`qa``y`qad`p`j`pa``j`y`qa`ae`y`y`q`y`j`y`q`y`y`y`w`jad`y`j`wad`yadadad`y`j`p`yad`jad`j`jad`y`q`j`yad`j`q`y`q`y`j`y`y`j`y`j`{adad`y`j`j`y`j`y`j`w`j`y`{ae`w`j`yae`y`yae`y`y`{`q`y`y`{`j`w`j`j`{`w`j`y`j`y`q`y`j`y`j`y`y`j`jadadadad`jadadad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`ja`ae`w`y`y`j`{`{`j`{`y`j`{`y`r`{`yar`yae`y`{`yae`w`y`y`r`y`y`waear`y`r`y`y`yae`w`y`y`j`y`j`{`j`y`r`yae`y`{`q`{`y`r`y`y`{`y`q`yae`y`y`q`{`j`yae`w`{`y`j`{`y`yae`y`j`{`y`j`y`j`y`j`y`y`j`y`j`w`j`yad`y`j`jad`yadad`~a`ajadadadadad`yad`j`d`y`y`j`y`j`j`jah`j`j`y`j`y`j`y`d`jah`jao`j`jao`jah`j`y`d`jah`d`y`~`j`y`jad`y`d`j`a`a`a`a", +"atatatatadadad`g`j`j`{ar`y`{`{ar`j`{`jar`y`j`{`{`q`{`y`{`yar`{`y`{ar`j`{`yar`yar`{`{`y`{`{`r`yar`{`yar`{`{`wae`j`{`y`{`j`q`y`ja``j`y`q`y`y`{`j`q`y`j`y`q`yae`j`y`j`j`w`y`jad`y`q`j`ya``jad`j`s`j`j`q`yad`j`y`y`jad`y`j`j`y`w`y`qad`y`j`y`j`w`y`j`y`j`y`j`y`{`q`y`{`y`jar`y`y`j`j`{`y`waear`y`{`yae`w`{`y`w`j`j`{`w`y`{`q`y`qadad`j`y`j`w`y`j`w`{`j`{`y`{`r`{`w`{`yae`{`q`{ar`j`{`q`{`w`j`{`j`y`jae`w`y`j`{`w`j`y`j`y`j`y`j`y`q`y`j`j`wad`jadadadad`jad`y`j`y`jar`j`y`j`q`y`j`y`{`padadadadad`w`j`y`q`{ae`y`y`j`j`w`j`y`q`{`wae`w`y`j`y`{`y`j`r`y`j`w`j`y`y`j`w`j`{`y`j`y`j`y`{`y`w`j`{`w`j`yae`y`j`w`j`y`j`{`j`w`j`y`j`w`y`j`w`j`y`j`y`q`y`j`w`j`y`j`y`jar`j`y`j`y`yae`y`ja`ad`jad`y`q`j`y`j`w`j`y`j`wad`y`j`w`j`jad`y`j`yad`y`j`jadad`jadadadad`jadadadadadadad`ja``j`ja``j`j`j`y`q`j`y`q`y`j`w`y`j`w`j`y`j`y`j`{`j`q`y`j`y`j`w`{`jar`yar`j`{`yar`j`y`y`j`y`q`y`j`y`q`y`j`y`j`y`j`y`q`y`j`jadadadadadad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`y`q`{`y`rahar`y`jar`y`{`q`{`y`yae`y`{`q`y`{`w`r`y`j`{`j`yar`yae`y`y`j`{`y`r`y`{`j`{`j`{`q`{`q`{`y`j`y`wae`y`j`{`yae`y`jar`j`y`w`yae`{`y`{`q`y`{`yae`w`y`yae`y`w`j`y`j`y`q`{`j`y`r`y`j`y`j`y`y`j`y`j`y`j`yad`jad`jadadad`~adadahad`j`j`y`y`j`y`jah`j`y`j`y`j`yah`j`y`d`y`ja``j`y`jah`jah`j`y`dadahad`yah`j`yah`d`y`d`y`j`a`a`a`a", +"atatatat`y`y`jada``{`j`{`yae`w`y`{`q`{`y`r`yar`{`{`{ar`j`{`{`{ar`{`{`yarae`y`{`{`jar`y`wae`y`yae`{`y`{`y`{`{`w`{`yar`y`{ad`y`jarad`y`j`y`p`y`{`yar`{`j`y`q`y`y`w`y`j`y`j`w`j`y`j`q`ja``j`yad`y`j`yad`y`w`jad`{`j`w`y`jad`y`j`{ad`wad`y`j`y`j`j`y`w`y`j`y`wae`yar`yae`y`{`jar`y`{`q`y`{`y`{ae`w`y`j`{`j`{`y`yar`j`{`w`e`y`y`y`qa`ad`q`yae`y`{`j`y`wae`y`y`yae`yar`j`{`y`yae`y`{`{`{`y`{`y`jar`y`y`{`wae`y`y`j`y`w`y`q`{`y`j`y`j`y`y`j`j`sad`w`yad`wadadad`jad`s`j`y`j`y`y`j`w`y`j`{a`adadaja``j`j`y`y`q`y`y`wae`y`yar`y`y`yae`y`{`q`{`j`w`{`j`y`w`y`j`w`jae`ya``q`{`q`y`y`q`j`yae`y`y`j`{`q`y`w`j`y`y`w`j`y`j`y`j`y`j`j`j`j`w`j`y`q`y`j`y`j`y`y`j`w`y`j`y`j`w`y`j`q`y`j`j`y`padad`ja``j`y`j`j`y`j`y`j`j`y`y`j`y`y`j`ja``j`j`yadad`jadadadadadadad`gadadadadadadadadadad`j`s`y`jad`y`jad`y`j`y`j`y`j`y`j`w`j`j`y`j`y`y`j`w`{`y`j`y`q`y`j`y`j`y`j`{`j`w`j`{`y`y`y`r`y`y`j`{`y`q`y`j`w`j`y`p`ja``jadadadada``}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`q`y`{`y`j`{ar`j`yae`y`{`yaear`y`j`{`{`y`{`j`{`y`{`j`w`{`j`{`y`r`y`yar`j`y`{`y`r`y`y`r`y`{`y`j`{`y`{`j`y`yar`j`y`y`j`y`y`j`y`j`y`{`j`w`{`j`{`y`j`y`q`y`yae`y`j`j`y`j`w`{`j`y`w`j`{`y`j`y`y`j`y`y`j`y`y`j`j`y`y`j`yadad`hadadad`~adad`yad`j`y`j`d`y`y`~`y`y`j`y`j`y`j`y`y`j`y`d`y`d`y`j`y`jah`jah`j`jah`j`~`y`d`ja``d`y`d`d`a`a`a`a", +"atatatat`jad`jadad`j`{`y`r`y`y`{ae`y`{`{`y`{`{`y`{`q`{`{`w`{`j`yae`{`r`y`y`{`{`{`q`{`{ae`y`{`w`{`{`w`{arae`w`yae`y`{`q`{`{`qad`ja``j`y`q`y`j`j`j`y`j`w`y`y`j`{`j`yae`y`w`j`y`p`y`yada``q`j`yad`y`qa``jae`y`w`j`w`j`y`q`y`w`y`j`w`j`j`y`qad`y`y`q`y`j`j`w`{`jar`yae`yar`yarae`y`r`y`{`q`yae`w`yae`y`y`w`{`r`y`jar`y`j`y`{`w`j`jadad`j`jad`yae`y`j`y`y`j`wae`{`w`j`{`y`yar`y`y`q`{`q`y`waear`y`y`r`yae`yar`j`y`q`y`j`y`j`ja``q`j`w`j`j`q`y`y`j`j`p`yad`y`pad`j`y`j`j`y`j`w`j`y`j`y`j`w`jaj`gad`j`j`y`j`y`y`q`{`j`y`w`j`{`j`{`y`r`y`{`j`w`y`j`y`j`y`j`j`y`j`y`jar`j`y`j`yae`j`y`w`j`y`j`w`j`y`y`j`y`j`wae`j`y`j`wad`j`y`j`s`j`y`j`q`y`j`y`q`y`j`j`w`j`j`y`q`y`y`j`w`j`y`j`wad`jadadadad`j`y`q`y`q`y`j`q`y`j`w`jad`j`y`j`yad`y`jad`yadad`gadajad`gad`iad`gaj`gagadagagadadadadadad`ja``j`j`y`j`w`j`p`y`j`j`j`y`j`w`j`w`j`w`y`j`j`w`yae`y`jar`yae`w`y`q`{`{`y`w`j`{`j`y`j`{`w`j`y`j`y`y`j`y`j`y`y`jadadadad`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`j`{`j`{`yae`y`yar`y`r`yae`y`y`{`r`y`wae`{`q`y`j`{`yae`y`{`w`{`j`y`{`jar`y`{`j`{`y`y`j`y`yae`yar`j`y`r`y`j`{`y`j`{`j`y`w`j`{`y`{`j`{`y`{`{`yar`j`{`yae`w`j`y`{`y`j`{`y`j`y`{`j`y`j`y`y`j`y`y`j`j`y`j`j`y`y`j`y`jadadajad`hadadadad`d`j`y`d`j`y`y`j`j`y`jah`j`y`y`j`d`y`jah`j`y`j`y`~`y`d`y`d`y`d`y`~`j`y`d`y`y`d`da``d`y`a`a`a`a", +"atatatat`y`j`yad`ja``{`{`yae`{`{`wae`yar`j`{`{ar`y`{`{ae`y`{ar`y`w`{`{`yar`{`y`{`{`w`{`yar`{`y`{`{`{`yae`{`yar`{`{`{`y`j`y`yad`jad`y`j`{`y`w`{`yae`yae`yar`j`{`wae`y`j`y`yae`y`j`{`q`y`y`jad`w`j`j`y`p`j`y`y`j`y`j`y`yae`j`w`y`j`y`y`j`j`w`j`y`j`war`j`y`y`yae`w`{`yae`y`{`y`y`{`{`j`y`{`{`y`w`{`j`{`y`j`{`w`{aear`y`{`y`{`w`y`jadad`y`j`y`w`{`j`w`{`y`{`w`{`y`w`{`r`y`{`q`{`y`{`y`{`j`yae`y`y`{`w`yae`yar`j`y`y`r`y`y`y`j`y`j`ya``j`j`y`j`y`y`j`y`jad`y`yad`pa``j`q`y`j`j`y`y`q`y`y`wadad`gad`j`w`y`j`y`y`wae`{`y`w`j`w`j`y`{`q`y`yae`y`y`q`y`w`y`j`w`j`s`jad`y`qad`y`w`j`y`j`y`q`y`j`y`q`{`yae`w`j`y`j`y`j`j`y`s`j`y`j`y`j`ya``q`j`y`y`q`y`j`y`y`q`y`jae`y`j`y`j`y`y`j`y`y`pada``p`j`ya``j`j`ya``j`w`j`y`j`wad`w`j`yad`j`y`jadadadadadadad`gaj`gag`hag`g`i`g`i`g`gagaj`g`gajadadad`jad`y`j`y`y`q`y`j`y`j`j`y`y`j`j`y`j`w`j`y`w`j`y`y`j`{`y`y`{`y`yar`j`{`y`q`{`yar`j`y`j`y`j`q`y`j`y`q`j`y`jadadadadad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`w`y`j`{`w`j`yae`y`j`{`w`{`yae`y`w`yae`yar`y`{`y`{`w`y`{`q`y`{`y`{`y`{`j`{`w`{`yae`y`{`q`{`w`yae`y`{`q`y`{`yae`y`y`q`y`{`{`j`y`q`y`{`j`w`yae`y`{`j`y`{`y`{`j`y`q`{`y`j`w`j`{`yae`y`w`j`j`y`j`y`j`y`y`y`j`y`j`y`j`yadadadadajad`~ada``j`yada``jad`y`y`j`y`j`y`d`j`y`j`y`j`y`jah`y`j`y`jah`jah`y`d`y`y`y`d`jahad`d`y`j`d`y`d`a`a`a`a", +"atatatat`j`yad`j`y`j`wae`{`yar`{`jar`{`{`yar`{`yae`{ar`y`{ar`yae`{`{`{`q`{`{`jar`{`{`{ar`{`{`{`jar`jar`{`{`w`{`{`{`q`{ar`{`w`j`yad`w`j`y`j`j`y`q`y`jar`j`y`y`q`{`y`j`y`yar`j`y`w`j`y`j`y`r`y`yad`j`y`j`y`j`j`s`j`j`y`q`j`yad`yae`w`yae`w`y`y`q`y`y`j`{`w`y`{`r`y`yae`{`y`w`{`{`q`{`yar`jar`j`yae`y`j`{ar`y`j`y`{`j`y`yae`q`yae`yadadadad`q`y`j`y`j`y`j`{`y`yae`yae`y`y`q`{`y`{`yar`j`{`{`w`y`jar`j`{`w`{`j`y`r`y`j`y`j`y`q`y`j`y`qad`yad`w`jar`yad`q`y`j`q`yad`jad`jadadad`w`j`y`j`j`y`j`p`gadadad`j`y`j`j`y`j`y`j`{`j`y`y`y`r`y`y`r`y`jar`j`{`j`j`q`ja``j`jadad`jadad`j`j`q`y`j`j`y`j`y`j`j`w`jad`y`y`q`y`q`y`y`j`y`j`j`j`s`j`q`y`yad`j`y`q`y`j`q`y`j`y`j`y`q`y`w`j`q`j`j`qadad`jad`j`y`j`j`y`q`j`y`j`y`j`y`j`y`j`j`j`yadad`yadadadad`gagadad`g`~adagad`gag`gag`hagagac`g`i`i`i`gad`gad`jad`jad`jad`j`wad`j`w`j`q`y`q`y`j`y`j`{`j`j`y`q`y`j`wae`j`r`yae`y`j`{`j`y`{`yae`y`w`j`y`j`y`j`j`y`y`j`yadadad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`{`j`{`q`y`j`{`w`y`{`wae`y`y`r`y`{`j`{`y`{`j`yar`j`{`j`yae`{`j`{`q`{`j`w`{`j`{`jar`yar`y`{`yae`y`{`j`y`{`{`q`{`yar`yae`y`{`jar`y`{`q`y`{`y`r`yar`yae`w`jae`y`y`y`j`y`y`j`y`y`y`j`w`j`{`y`j`y`y`j`y`j`j`y`j`y`j`j`y`j`~adad`hadada`ad`j`y`j`y`j`y`y`j`y`j`d`y`j`y`jah`j`y`d`y`j`y`d`y`d`y`y`d`y`jah`j`d`y`da``j`j`~`y`da``j`a`a`a`a", +"atatatatad`ja``j`jad`{`{`j`y`{`y`y`{`r`{`{`y`{`{`yae`{`j`{`{ar`y`{`r`{`yar`{`y`y`y`{ae`w`{ae`y`{`{`{`y`{`q`{`yar`{`y`{ae`y`{`j`wad`y`j`w`j`y`j`y`y`q`y`yae`j`{`q`y`{`j`j`y`j`y`j`y`j`y`j`y`j`w`j`w`ja``j`y`ja``q`yad`y`j`j`y`j`y`j`s`{`j`y`j`{`j`y`y`rah`r`y`y`w`j`{`w`j`{`j`y`wae`y`y`yae`w`y`wae`y`yae`y`w`{ar`y`r`y`{`y`w`{`r`yadadadad`j`y`q`y`{`q`y`q`{`j`w`y`{ae`yarae`y`r`y`{`wae`yar`y`y`j`{`yar`y`y`yar`j`{`y`q`y`y`j`y`j`wae`y`j`y`j`y`y`j`yad`j`y`pa``j`wadad`jadad`wae`y`j`y`jadadad`p`j`y`q`y`y`q`{`w`jar`j`y`j`yae`y`yar`y`y`j`wa``y`jad`wad`yad`wad`j`s`y`jada``q`y`j`w`j`y`j`y`q`yad`j`j`yad`r`j`w`j`wad`y`j`y`y`j`{`q`y`y`j`w`y`yae`y`q`y`j`y`j`y`y`y`y`ja``jadada``j`w`ja``y`y`j`w`y`j`w`y`yad`y`w`j`j`wad`ja`adadad`gaj`hadaj`g`g`i`gad`g`gad`i`g`gad`g`gag`h`n`i`gad`gadad`jad`j`yad`yad`ja``j`j`y`w`j`w`y`y`wae`y`y`r`y`yar`j`y`y`w`j`w`y`j`{ad`y`j`y`j`y`j`w`y`j`yad`j`j`y`p`jad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`{`y`y`{`{`wae`yae`y`{`wae`y`y`jar`yar`j`{`y`{`yar`~ar`{`y`{`yae`y`w`{`j`{`w`y`{`j`{`j`w`y`{`y`q`{`y`r`y`{`yae`y`y`{`j`{`w`j`y`y`{ae`w`{`y`j`{`y`j`{`y`y`q`{`j`y`j`{`y`jae`y`y`j`y`yar`j`y`j`y`y`j`y`j`y`y`y`j`y`ja`adadadad`gad`j`ja``j`y`j`y`j`j`y`j`y`jah`j`y`y`j`y`{adah`j`y`jah`y`d`j`yah`j`yah`y`j`y`dao`y`j`yad`d`y`a`a`a`a", +"atatatat`j`yad`y`jadad`{`y`{`yaear`{`yae`yar`y`r`{`{`w`{`w`{`yaear`y`{`y`{`{ar`{`r`{ar`yar`yar`{ar`y`{`w`{`{`y`{`{`j`{`w`{`w`y`{`y`j`y`jada``j`y`j`y`{`y`q`y`y`y`y`j`w`y`w`{`j`y`q`y`w`j`q`y`j`y`ja``qad`j`s`j`yae`w`yad`w`y`w`j`y`y`j`{`w`yae`y`w`j`{`w`y`{ae`y`yar`{`y`yaear`y`y`j`{`wae`y`yae`yar`y`wae`yar`j`{`y`{`{`wae`y`y`y`w`yadadadad`y`j`{`y`j`y`y`q`{`y`r`y`w`{`y`j`y`{`{`jar`y`{`j`yae`y`w`j`{`j`w`j`y`j`w`{`y`j`y`w`j`y`y`j`w`y`q`yae`s`j`s`j`w`j`j`y`jad`ja``jad`jad`yad`w`jadadada`adad`j`j`w`j`y`y`j`y`j`w`{`j`w`jar`j`y`j`{`j`y`j`j`wa``j`jad`jad`q`yad`jad`wad`j`jadad`j`q`y`jad`y`j`p`j`y`j`yad`yad`y`q`y`j`j`w`j`j`y`j`w`j`j`y`j`q`y`j`y`j`y`q`j`q`y`j`ja``p`j`p`y`j`j`y`q`j`p`j`y`j`y`j`y`q`j`y`j`ja``j`jadadadajad`hadag`g`~`gaj`g`iag`~adadadad`jadadad`g`g`gag`iagadagad`gadad`g`jadadadad`j`jad`y`j`j`j`j`y`q`yae`y`q`{`j`y`yae`j`{`y`j`y`j`w`j`j`w`j`y`j`y`j`y`q`yad`jad`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ad`{`y`qae`y`jar`yae`y`w`{`{`j`yar`{`y`{`j`w`{ar`j`{`j`{`j`yae`y`q`y`{`{`j`{`y`yae`y`{`j`y`{`j`{`q`{`y`w`{`y`{`j`y`{`yae`w`yae`y`{`{`w`j`{`yae`{`y`j`y`j`y`y`j`y`r`y`y`j`w`{`j`w`y`j`{`q`j`y`j`w`{`j`y`y`q`y`j`y`j`yad`jadadadaj`~adad`y`j`y`j`y`j`y`y`j`y`j`y`j`j`yah`j`y`j`y`j`y`jah`y`j`y`jah`y`dah`jah`jah`j`y`j`y`d`y`d`y`a`a`a`a", +"atatatatad`j`y`j`y`ja`ae`w`{`w`{`{`yar`{ae`y`{`yar`y`{ae`y`{`{`y`{ar`{ae`y`{ae`w`y`{`{`{`yae`{`y`r`{`j`{arae`yarae`y`{ae`{aear`yar`j`y`jad`q`y`j`w`j`j`y`j`q`{`j`yae`yae`y`jarad`yae`ja``jad`ja``j`y`j`sae`jad`j`y`j`j`w`j`j`y`{`q`y`jar`j`yar`j`y`yae`y`q`y`{`w`j`{ae`w`{`yae`y`q`{`w`y`j`{`w`yae`y`j`y`{`j`y`wae`y`q`{`{a``r`j`{`j`w`jad`gad`jad`yae`y`w`j`y`j`y`{ae`y`w`{`q`y`j`{`y`q`y`r`yar`{`j`y`{`w`{`j`{`y`w`j`j`{`sae`y`j`y`{`j`y`yae`y`w`j`{`y`j`y`y`w`j`y`qa``j`qa``g`jad`j`y`yad`pajadad`yad`y`j`wae`y`wae`y`j`w`j`y`y`jar`y`jar`y`j`w`d`w`y`ja``qa``j`ja``j`w`ja``j`y`wad`y`ja``q`j`j`y`y`q`y`j`y`q`y`j`j`y`j`w`j`y`y`w`j`y`y`j`y`w`j`y`y`q`y`q`y`y`y`j`w`j`w`jad`jad`j`y`p`y`j`{`y`y`q`j`y`q`y`j`yad`y`ja``j`yadadadad`~`gaj`g`gadaj`g`hag`gag`gadad`yad`w`j`w`j`j`yad`pad`gag`~`gaj`gaj`hagadadadadadadadad`j`g`jad`j`y`jad`y`j`j`w`j`y`y`r`y`j`w`{`y`y`y`y`y`{`j`y`y`j`yad`y`ja`ad`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ad`y`j`y`yar`j`y`{`wae`y`y`r`y`yae`w`{`y`{`y`{`y`{`w`{`yar`yar`j`{`w`{`yae`w`{`y`wae`yar`yae`y`y`{`yae`y`q`y`{`wae`y`j`{`yar`y`{`j`y`{`j`w`{`y`q`{`y`r`y`j`y`{`y`yae`y`{`j`y`yae`w`j`y`y`{`j`y`j`y`y`j`y`j`y`y`j`y`y`j`yadada`ad`jadadad`y`j`y`j`{`y`j`y`y`y`y`j`y`j`y`yah`j`y`y`j`y`jah`y`jah`j`y`d`yah`jah`jah`d`yah`j`jah`j`a`a`a`a", +"atatatatae`yad`y`j`jad`j`yae`{`{`{ar`y`{`{`w`{`r`y`yae`{`{`{`r`{`w`{ae`y`yarae`y`{`{`j`{ar`{`yar`{`{`w`{`y`{ar`{`y`{`w`{`yar`y`{`j`y`{`q`ya``jaradad`y`j`y`y`y`j`w`j`y`j`w`j`y`j`y`j`yad`y`ja``q`j`y`j`y`j`y`y`j`y`q`y`y`{`y`y`j`{`{`j`y`{`y`yae`y`{`wae`yarae`{`{`{`y`{`yar`y`y`{`{`jae`yar`{`y`r`y`y`{`r`y`w`{`{`w`y`yae`w`{`y`y`y`{`y`yadad`gad`j`j`y`j`yae`y`w`j`y`w`{`j`{`{`w`{`q`y`{`{`y`yaear`yar`{`j`y`{`q`j`y`y`y`j`y`j`y`q`y`q`y`j`y`w`j`{`y`j`yar`y`ja``q`ja``j`jadadadag`gad`j`jad`g`gadadad`j`p`j`y`j`y`j`y`q`y`{`j`{`w`y`j`y`j`y`q`yae`y`j`y`jad`j`qa``j`p`j`yad`j`jadad`j`yad`ja``j`s`j`j`j`yad`j`jad`w`jad`y`j`j`yae`j`y`q`y`q`j`y`j`q`yae`y`j`y`rad`j`y`jad`yadad`y`j`y`j`w`y`j`j`y`w`j`y`j`y`j`w`j`y`p`j`y`j`yadadadad`gad`haj`g`hagad`gag`g`i`~`j`y`ja``jad`y`j`w`j`yad`~`gag`gag`hag`gagag`hagag`g`iadadadadad`jadadadadadad`j`y`q`j`y`j`w`{`j`j`w`j`j`y`q`j`y`j`y`j`y`j`y`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ad`j`y`j`y`yae`y`{`q`yae`w`yae`y`{`{`y`{`j`{ae`y`r`yae`yar`j`{`j`{`y`yae`yae`y`yaeae`y`{`yae`yar`y`j`{`wae`y`{`j`{`j`yar`y`j`{`yae`wae`w`{`yae`wae`y`{`y`j`y`y`j`q`{`y`{`q`y`yae`y`y`y`j`{`y`j`y`j`yae`j`y`j`y`j`y`j`j`yad`jad`jad`jad`y`j`y`j`y`j`y`j`jak`y`j`j`y`j`y`j`d`y`j`y`jah`y`d`y`jah`j`y`d`yah`j`y`d`y`d`y`d`y`jah`j`y`a`a`a`a", +"atatatat`y`jadad`ja``j`yae`w`yae`j`{`w`{ae`{`{`{ar`{`wae`y`{`{ae`{`w`{`w`{`{`w`{ar`{`w`{`{`r`y`{`{`{ae`w`{ae`y`{`r`{ar`yae`yar`{ar`y`{`y`r`ya`aead`s`j`j`j`j`y`jada``j`y`q`y`j`j`y`p`j`wad`y`j`w`y`j`j`w`y`j`w`j`y`j`j`y`r`{`w`y`q`y`wae`y`q`{`wae`{`jar`y`jar`y`q`yae`y`j`{ae`w`yae`w`y`j`{`y`y`r`{`y`yae`y`y`jae`y`{`j`y`{`q`{`w`{`q`{`y`jadad`m`g`j`ja``y`q`y`yae`y`yar`j`y`j`{`j`{`w`j`j`y`w`j`j`y`jar`j`w`y`y`j`w`j`j`w`y`j`y`j`y`j`w`yae`j`y`wae`y`q`yae`y`y`j`q`yad`y`q`yadadagag`gadadadaj`gad`wadadad`j`ja``yae`y`q`{`y`j`yae`w`y`j`{a``q`y`q`y`q`y`yad`jad`yad`j`wad`w`j`wad`q`y`j`j`q`yada``q`j`s`j`y`y`j`j`w`y`j`w`j`s`y`j`y`j`y`y`j`w`y`j`y`q`y`y`j`y`w`y`j`q`jad`w`j`s`y`jad`j`y`q`y`y`j`w`j`y`j`y`j`y`j`y`y`jad`yad`jadad`gaj`g`gagad`i`g`i`gag`g`g`kad`y`j`y`j`y`j`y`j`y`j`qa`ad`gadag`~`gag`gagac`i`gag`gad`yadad`yadad`jad`yad`j`yad`y`j`y`j`j`y`y`j`y`y`y`j`w`j`y`j`y`j`y`j`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}adad`j`q`y`w`{`j`y`yae`y`wae`y`w`j`{`j`w`{`yar`y`{`y`{`y`{`q`y`{`j`{`y`wae`yar`yar`y`yarae`y`{`{`jar`{`{`y`j`{`y`{`y`{`j`{`y`{`j`{`y`{`{`q`{`y`y`y`q`yae`w`yae`y`{`y`j`y`yae`y`wae`yae`y`q`yae`y`y`j`w`{`y`j`y`y`j`y`j`yad`ja``jad`yad`j`j`y`y`j`y`y`y`j`y`j`y`y`jah`y`y`j`yak`j`y`j`y`jah`j`y`y`d`y`d`y`d`y`j`y`d`y`jah`jao`jah`a`a`a`a", +"atatatat`y`j`y`jad`jad`jad`{`{`y`{ar`yae`w`{`{ar`y`{`{`y`{`w`{`yar`y`{ae`y`{`jar`{`{aear`y`{`{`{`y`{ar`y`{`{`w`y`{`y`{`y`{ar`y`{`y`{`yar`{`yar`y`{`y`y`j`qa``j`ja``q`j`jad`y`j`wad`y`y`j`w`j`{`y`j`y`w`y`j`y`j`y`y`{a``q`y`y`j`{`jar`y`{`j`y`y`{`y`yar`yae`y`yar`y`{`{`q`{ar`yar`y`y`y`j`{`w`{`q`y`{`y`q`y`{ar`yar`yar`y`{`w`y`{`jar`yae`y`y`w`yad`gagad`y`j`y`j`y`jar`y`j`y`{ar`yar`y`y`yae`w`y`y`{`y`w`j`y`j`yae`y`y`j`w`j`y`j`wad`y`j`y`j`w`y`j`y`y`q`y`{`j`y`q`y`j`y`wae`y`s`jadadag`gagad`gag`gad`j`y`jadadad`w`j`y`q`y`y`j`j`w`{`y`j`w`{`q`y`y`y`j`y`y`jad`w`yad`q`yadadad`j`yad`j`y`qa`ad`y`q`jad`y`j`yad`j`s`j`y`j`w`j`j`y`j`{`j`wae`y`j`y`j`j`y`y`j`q`y`w`j`{ad`yad`pa``j`j`j`w`j`w`y`j`y`q`y`j`j`y`w`j`y`w`j`y`j`y`ja``j`yadadadadadadag`hag`gag`gag`haj`gad`jad`j`j`w`j`y`q`y`p`j`y`jadadad`gaj`g`~ag`nas`i`h`g`jad`y`j`y`j`q`y`j`wad`j`w`y`j`y`j`w`j`y`y`j`y`q`y`j`y`j`y`j`w`yad`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}adadad`y`y`j`yae`q`y`{`wae`y`y`{`{`yae`w`{`y`j`{`jar`yae`wae`y`{`yar`y`r`y`{`w`{`j`yae`wae`y`{`y`q`{`y`yar`j`y`{`y`jar`y`{`y`{`q`{`yar`y`r`y`y`{`yae`yae`w`yae`y`{`wae`w`j`{`w`j`{`y`j`w`j`y`y`j`y`j`{`{`y`j`w`j`{`y`j`y`y`jad`y`j`yad`yad`y`j`y`j`y`j`y`yae`y`{`d`j`y`y`j`j`y`j`y`e`y`y`d`y`j`y`jah`jah`j`yah`j`d`yahadah`y`j`d`y`a`a`a`a", +"atatatat`j`y`yadadadada`ae`y`yae`y`{`{`y`{ar`j`{`{`w`{ae`y`{`r`y`{`{ar`{`war`{`y`yarae`{ar`jar`y`r`{`j`{ar`j`{`y`{`r`y`{ae`{ar`y`r`{`y`yae`yae`{`q`y`y`y`j`wad`jada`ad`w`j`y`j`jad`y`j`j`y`w`j`y`j`{`j`w`{`j`y`q`{`j`y`yae`w`j`y`j`y`{ar`j`y`q`{`j`y`q`{`yar`{`j`{`w`{`y`yae`y`jar`{`{`q`y`{`j`{`j`{`y`{`j`{`j`y`{ae`y`j`{ae`wae`y`y`jar`j`yae`w`j`y`gad`gadad`j`w`y`j`y`q`{`j`y`jae`y`wae`yae`y`q`j`{`yae`y`w`y`r`y`j`y`ja``j`j`y`j`w`j`y`j`{`j`w`j`y`j`j`w`j`y`y`j`j`y`y`j`j`w`{`j`ya``gaj`gag`gag`nad`j`sadadadadad`y`j`w`yae`y`j`{`j`y`j`{`j`{`j`j`w`j`y`q`j`y`p`j`yad`q`ja``j`j`yad`j`y`j`j`yad`j`y`qad`j`y`j`y`j`w`j`y`w`j`w`y`j`y`j`w`j`w`j`y`w`j`wae`y`j`y`j`wad`jadad`y`j`y`y`j`y`q`y`j`y`y`w`j`y`w`j`j`y`j`j`qa``j`j`ja``j`ja`adadad`hadadag`hag`hag`g`hag`gadad`y`j`y`jad`y`j`y`y`q`y`jadadad`gad`gadagag`majad`y`qad`{`w`j`y`j`y`j`w`j`y`j`w`j`y`yar`j`y`j`y`{`j`w`j`y`{`j`y`j`y`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ad`ja``j`j`y`y`yae`w`yae`w`{`q`j`{`w`{`yar`{`yae`y`{`j`{`y`{`j`{`j`{`j`y`{`j`{`w`{`yae`y`wae`y`{`y`j`{`yae`{`wae`y`{`j`{`q`{`y`{`q`y`{`y`j`{ar`j`y`{`y`yae`y`w`{`y`yae`y`yae`y`y`r`y`{`j`yar`j`y`{`y`j`y`j`y`j`y`j`{`j`y`j`y`jad`y`jah`j`y`j`y`y`j`y`y`j`j`y`y`j`y`y`yae`y`y`y`y`y`yae`yah`y`d`{`y`j`y`{`j`yah`y`jah`j`y`d`y`d`y`y`a`a`a`a", +"atatatat`jae`y`jadadadad`y`yae`y`{`w`yaear`{`y`{arae`y`{`{`w`y`{`{`y`y`{`{`yae`y`r`{`y`{`y`{`{`{`w`{`y`{`{`{`yar`{`{`yar`{`w`{`y`{`{`y`{ar`y`w`{`{`y`{`q`{ad`y`qa``y`j`j`y`y`qa``y`yae`s`yae`yad`yar`j`y`y`q`{`y`q`{`w`{`w`j`y`y`{`y`w`j`{`y`{`j`w`{`y`{`j`y`{`r`y`yae`y`r`yar`{`y`{`q`y`{ae`y`y`yar`j`w`{`w`{`wae`w`yaear`y`y`y`{`jar`y`{`w`yae`y`y`qadadajad`y`j`yae`y`j`y`y`jar`y`w`j`y`j`y`w`y`{`q`y`{`w`y`j`{`y`w`y`j`y`w`y`j`y`y`j`j`y`w`j`y`yae`w`y`yae`yad`w`j`y`y`q`y`j`y`w`j`y`j`pad`gadag`h`gad`j`y`qadadad`j`j`y`j`y`q`y`y`q`y`y`q`y`y`y`w`j`y`j`y`w`j`y`j`j`s`j`yad`q`yad`q`y`pad`p`j`j`s`j`y`j`w`{`j`w`j`y`j`yae`y`j`y`q`{`w`j`y`j`y`wae`y`j`y`j`y`j`j`y`jadad`yad`j`y`q`y`q`y`j`y`j`w`j`j`y`y`y`j`wad`y`ja``jad`y`p`yad`jadadadad`gadag`gag`gag`hag`gag`h`~ad`ja``j`w`j`y`qad`y`j`j`y`wadadag`gaj`g`g`gag`g`jad`y`q`y`jad`y`w`j`y`j`w`j`y`j`y`j`j`y`q`y`j`w`j`y`j`y`j`y`j`y`w`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}adada``j`w`j`{`w`j`j`y`j`y`{`j`y`{`y`{`jar`j`yae`yar`y`{`{`wae`yar`y`yar`{`y`{`w`j`{ae`y`yae`y`{`wae`{`wae`yar`y`{`j`{`w`yae`y`wae`y`y`{`jar`{`y`j`{`q`yae`y`{`j`y`j`{`j`yae`y`{`j`y`yae`w`y`{`j`w`j`y`q`y`{`j`y`y`j`y`y`j`yad`ja``jad`j`yad`j`y`j`yae`y`j`y`{`y`j`yae`y`jah`j`y`j`{ae`y`j`{`yae`y`y`y`eah`jah`d`jah`d`y`d`y`d`y`d`y`a`a`a`a", +"atatatat`j`y`jadad`~adad`j`y`wae`yae`y`{`yae`{`y`{arae`y`{`yaear`{arae`w`{`{`{`y`{arae`{`w`{`j`{`y`{ar`yar`{ae`yarae`{`yae`{`jar`jar`{`yae`{`{`q`{`w`j`{`y`y`{`jarad`y`j`w`j`j`y`q`yae`y`w`j`{`q`yae`y`j`{`j`y`yae`y`j`yae`yar`yae`{`y`wae`y`w`{`j`j`w`{ar`j`y`{`q`{`w`{`y`j`{`j`w`j`y`j`w`{`r`y`{`y`{ar`j`{`{`y`{`y`j`w`j`{arae`yar`yae`y`y`jar`y`q`y`yadad`padad`j`w`j`wae`y`j`yae`{`w`y`j`j`{`q`y`{`q`{`jarad`j`{`j`q`y`j`y`j`y`q`y`j`y`j`yae`w`j`j`y`j`y`j`j`y`j`w`j`y`j`y`y`j`j`w`y`y`jadadadad`g`gagadad`y`padadadad`q`y`j`j`y`j`j`y`yae`q`y`j`y`j`y`q`y`j`y`q`yad`y`j`ja`ad`j`jad`j`y`j`y`p`jad`j`jad`j`y`j`y`q`y`q`y`j`y`j`y`j`y`j`w`{`j`y`j`y`q`y`j`y`w`j`y`q`y`p`jad`w`j`j`y`j`y`j`y`q`{`y`j`wae`j`w`j`y`y`q`j`y`y`q`j`yad`j`yadadadad`~ad`g`iadag`gag`hag`gagad`had`j`j`y`j`y`j`w`j`y`j`j`y`j`ja`adajad`gaj`gadad`j`y`j`y`j`y`j`y`j`y`y`j`y`q`y`{`w`j`y`y`jar`y`j`{`y`w`j`y`w`j`y`r`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ad`j`ja``j`j`y`y`y`{`q`{`j`{`yar`jar`y`{`j`{`w`{`j`{`w`j`{`{`wae`y`{`j`y`{`r`yae`yar`y`r`{`yae`y`{`yae`y`{`yae`w`{`wae`y`{`j`{`y`{`q`{`y`{`y`j`{`j`y`{`j`w`j`y`{`w`yar`j`yar`j`yar`yae`y`j`{`y`{`j`yae`yar`j`y`jar`y`j`{`j`y`j`j`ja``jad`j`y`j`y`j`y`j`y`y`j`yae`y`j`y`{`j`y`{`d`y`{`jah`j`yak`yaeah`y`y`jah`y`{`d`y`y`d`y`{`jah`j`y`a`a`a`a", +"atatatat`y`{`yad`~ag`iad`j`yae`y`{`yar`yaear`{`wae`y`y`{`{ar`{`yae`yarakar`{`jar`y`y`{ar`y`{`yar`yarae`{`yae`{`w`{`y`{`yar`{`w`{`{`{`yaear`yar`y`{`{`yae`w`{`jar`y`y`{`q`y`y`y`{`y`j`y`q`y`y`j`y`y`j`y`{`w`{`q`y`{`jar`yar`yae`y`wae`y`j`{`w`{`j`{`w`y`{`j`y`{`y`{`y`yae`y`{ar`j`y`{`wae`y`{`{`y`w`{ae`y`{`{`j`{`wae`y`{`{`y`j`w`{`j`{`y`{`q`y`{`j`y`y`j`y`wad`ja`adar`y`y`{`y`jar`y`y`j`y`q`ya``j`{`j`{`y`{`y`{ar`y`w`{`j`y`j`y`q`y`y`j`j`w`y`q`y`y`y`q`y`y`j`w`j`yae`y`q`y`j`y`q`{`y`j`w`j`y`y`padadadadadadad`j`wa`adadadad`y`j`y`w`j`y`q`{`j`y`yae`y`w`j`y`j`y`y`y`j`w`j`y`q`y`ja``p`y`j`qa``jad`yad`w`ja`ad`j`w`j`{`y`j`w`y`j`w`j`y`q`y`j`y`j`w`j`y`y`q`y`j`y`q`jadada``jad`y`y`j`wae`y`yae`y`q`y`y`j`y`y`j`y`j`y`j`wad`j`yad`y`j`y`s`jadad`gadad`gadag`g`hag`gag`h`gaj`gad`~`j`y`y`j`y`j`y`j`s`y`j`y`qad`g`g`iad`gadadadad`j`y`j`q`y`y`q`y`j`wae`y`y`{`j`y`{`q`y`{`yae`y`wae`{`y`yae`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`y`j`y`wad`j`y`q`j`q`y`y`q`y`j`y`j`y`y`j`w`{`{`j`{`{`y`{`{`wae`y`{`w`{ae`w`{`y`{`w`{`j`{`y`{`yar`yar`j`{`y`jar`y`yae`y`{`w`y`w`{`j`{`y`y`qae`y`w`j`{`y`wae`y`y`w`j`{`j`{`y`{`y`{`y`{`y`y`y`j`y`j`y`jar`y`y`{`y`{`y`j`y`j`y`yad`ja``jad`yad`y`j`y`yae`y`y`jahae`y`y`y`{`j`y`{`j`y`{`j`y`{`y`yae`y`d`y`y`eah`{`j`d`y`y`e`y`j`y`d`yah`j`a`a`a`a", +"atatatataear`y`yad`i`mad`j`j`y`j`j`y`{`w`y`j`w`{`{`wae`yae`y`{`{`yae`{`{`jar`{`{ae`yae`{`q`{`{`{`j`{`w`{`y`{`y`{`r`{`{`q`{`{`j`yar`y`{`y`{`{ae`yar`{`y`{ae`w`{`{`q`y`{ar`j`y`r`j`y`yae`y`yar`j`y`q`y`j`y`j`y`{`j`w`{`j`y`j`{`wae`y`w`{`j`j`{`y`{`j`{`w`{`q`{`waear`y`{`w`{`y`{`r`y`yae`w`y`j`{`q`{`j`w`{`yar`y`{`jar`{`y`{ar`y`{`y`w`jar`y`{`q`yae`w`j`{`j`y`jad`jad`jadad`w`j`y`j`yae`j`y`{`j`w`y`j`w`j`wae`y`yae`y`j`w`j`y`j`y`j`j`y`y`j`y`wae`w`j`y`j`w`j`y`j`y`q`y`j`y`j`j`y`y`j`y`y`j`j`y`y`j`p`j`p`gagad`gajadad`yajadad`jad`j`y`{`j`y`w`j`y`w`j`w`y`j`w`j`y`j`qah`q`y`ja``q`j`j`yad`ja``q`yadad`j`jad`w`j`j`y`q`j`y`q`j`y`y`{`j`y`w`j`y`q`y`{`j`j`y`{`j`s`j`ja`ad`q`jad`w`j`y`y`j`y`q`y`j`y`j`j`w`j`w`j`y`j`w`j`y`j`y`q`y`j`jad`j`y`q`ja``jadad`~`g`~ag`g`i`gag`g`i`g`k`gagadad`j`ja``q`j`j`y`q`j`j`y`jadadagagadadadadadad`y`j`y`j`y`j`w`y`j`y`q`y`j`j`{`yae`y`j`y`w`j`{`y`q`j`yar`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`j`w`j`y`w`j`y`j`y`j`j`y`{`j`y`q`{`j`y`y`{`w`j`{`wae`y`{`y`{`yae`y`j`y`y`{`j`{`j`{`y`{`wae`wae`y`{`y`y`q`y`{`j`{`yae`yae`yae`y`wae`yar`y`j`y`j`{`w`j`y`{`jar`yae`y`y`wae`y`q`{`jar`jae`y`yarae`y`{`y`j`{`j`y`q`yae`y`j`y`r`y`ja``j`j`jad`y`j`y`j`y`yae`y`y`j`y`y`j`{`yah`j`y`yaeah`y`{`jak`y`y`j`{ak`j`y`{ah`y`{`d`y`y`eahah`j`y`d`{`a`a`a`a", +"atatatat`y`{`j`{ad`gag`had`j`j`w`y`r`j`{`{ae`{`{`j`{`y`{`y`{`jar`{`y`w`{`w`{`y`{`yar`{`w`y`{ae`y`{ar`{`{`{arae`w`yae`w`{`y`{`yar`y`{`jaraear`y`w`{ae`yar`{`y`y`j`{`yarae`y`j`y`{`w`j`y`{`wae`y`j`y`j`{ar`y`{`q`y`{`j`{`w`yae`y`y`j`{`y`j`y`{`y`q`{`w`{`j`{`y`yae`y`yae`{`j`yae`y`{`w`{`j`yarae`y`w`{`{`y`jar`j`{ar`j`{`yar`j`{`wae`{`y`{`y`j`yar`y`y`{`y`q`y`y`sadadadad`j`y`j`{`y`j`w`y`j`{`q`y`j`y`r`y`y`j`{`w`y`j`w`y`{`j`w`y`j`w`y`j`{`w`y`j`y`y`q`y`j`yae`y`w`j`y`y`q`y`y`q`y`j`w`j`w`y`q`jar`yada``jadadagadadad`j`j`w`gadad`j`w`jad`wae`y`y`j`y`j`j`y`j`{`y`w`j`y`w`j`y`q`y`y`j`y`q`y`j`yad`p`j`wad`wad`ja``j`w`y`y`j`yar`j`j`y`yae`w`y`j`y`j`y`w`j`y`q`y`ja``j`p`ja``jad`y`j`j`y`w`j`y`q`y`j`w`y`j`y`{`j`y`j`y`q`yad`j`y`j`w`j`y`y`j`y`jadad`j`gadagad`gaj`gag`h`n`i`g`i`g`~adad`j`j`j`y`yad`y`y`y`j`y`j`g`gag`gadadadadad`j`y`j`y`wae`y`j`{`j`w`yae`y`w`yae`y`w`{`j`{`y`y`j`yar`{`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`j`y`j`y`{`j`{`ja``j`{`w`y`j`{`q`y`y`{`j`w`jae`y`y`{`y`{`wae`y`r`y`{`w`{`j`{`w`j`{`w`{`yae`y`y`y`{`j`y`r`y`{`yar`j`{`w`{`w`j`{`y`{`j`y`j`yae`y`yar`j`yar`j`{`y`{`j`{`w`{ae`y`{`y`r`y`{`y`j`y`j`y`y`y`yae`w`yae`y`{`y`y`{`j`y`y`j`yadada``j`y`j`{`w`{`j`y`y`j`{`yae`y`{`j`y`{`j`{`y`j`{`y`d`y`j`yae`y`y`{ahae`y`jak`y`{`d`yah`j`y`d`y`j`a`a`a`a", +"atatatat`y`{ar`j`yag`gag`~adad`j`y`y`y`q`{`y`q`y`{`r`yae`{`y`yae`{`yarae`y`{`q`{`{`yae`{`y`w`j`{`y`jar`{`j`w`{`y`{`y`{aear`{`{`jar`{`w`y`{`j`{`{`y`{`w`jarae`y`{`j`y`yae`y`yae`y`yar`j`{`y`y`jar`y`y`j`y`q`y`{`q`y`j`{`y`q`y`{`w`j`{`q`yae`w`y`y`j`j`{`wae`w`{`{`j`w`yae`y`w`y`j`w`j`{`y`y`yae`y`j`y`q`{`y`{`y`y`{`yae`w`j`y`j`{arae`yarae`y`{`jae`w`y`{`j`w`j`{ad`p`yadad`p`y`j`w`y`j`y`y`j`y`q`{`y`j`w`yae`jar`y`{`j`w`j`y`ja`ae`yad`w`j`j`y`q`{`j`y`y`j`w`j`y`q`y`j`y`j`w`j`y`j`y`j`y`j`y`y`j`yaea``p`j`yadad`gad`gadad`y`qadad`gad`j`y`j`w`j`q`y`j`w`y`j`{`j`y`j`q`y`y`{`j`j`w`j`y`y`qad`j`w`j`ja`ad`j`ja``q`y`j`j`wae`y`j`y`q`y`j`j`y`jar`j`w`y`j`j`w`y`j`j`p`j`jadad`j`yad`q`y`j`w`j`y`j`y`j`y`j`w`j`y`q`j`w`j`j`y`j`w`j`ja``j`y`q`yad`y`y`y`jadadadad`had`g`i`gag`gag`hag`i`g`g`gaga`ad`j`j`w`j`j`ja``q`jad`g`iagadadadadadad`j`j`y`j`w`j`yae`y`jar`j`{`j`y`j`{`j`{`j`w`{`jar`y`j`{`w`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`y`r`y`y`r`y`y`{`j`w`j`j`j`y`y`j`{`q`y`j`y`w`j`{`q`{`j`yae`y`y`yae`y`jar`y`{`{`j`{`y`q`{`yaear`j`{`wae`y`{`q`{`y`yae`y`{`yae`q`y`yar`j`y`{`j`w`yae`y`{`yae`w`{`y`j`{`j`y`jar`y`j`yae`w`{`yar`{`jar`{`j`{`y`{`j`{`j`yae`y`y`j`y`jad`jadad`y`j`y`j`{`j`y`{`j`y`j`y`{`j`{`y`j`{`y`yak`j`y`y`{`j`{ah`j`y`{`d`yahae`y`j`yah`jak`jah`jah`jah`a`a`a`a", +"atatatat`y`j`yae`yad`i`gadad`~ad`yae`j`j`{`y`j`{ae`y`yar`y`r`y`{`w`j`y`{`q`{`y`{`j`w`{`wae`y`{`{`w`{`{`j`y`{`{`{`w`{ae`w`yae`{`w`{`yae`y`y`{`{`w`{`r`y`{`{`yae`w`{`w`j`{`wae`w`y`{`j`y`j`w`jar`{`j`{`w`j`y`{`j`y`j`{`w`j`{`j`{`w`j`{`y`wae`y`{`{`jar`y`{`y`{`w`{`q`y`y`{`j`y`{ae`{`y`{`j`{`w`j`{`w`yae`w`{`yarae`yar`j`y`{`{`y`{`y`j`y`{`y`{`w`{`w`yae`y`j`{`yar`{a``y`qad`j`y`j`j`y`{`q`j`w`j`{`y`yae`w`y`j`y`yar`{`j`y`w`j`y`w`y`j`q`y`j`y`q`y`y`j`y`j`w`y`y`j`y`j`y`j`y`w`j`y`y`q`y`j`y`q`y`j`y`j`w`j`y`qada`adag`gagadad`j`yadadadadadad`y`j`y`yar`j`y`j`w`j`yar`j`y`j`w`j`w`y`j`w`j`y`j`y`y`y`y`j`y`j`y`p`y`j`ja``j`y`j`w`y`j`y`y`{`j`w`j`y`j`y`r`y`y`y`j`y`j`yad`wad`y`q`j`y`y`j`y`j`{`w`y`{`j`w`j`{`q`y`y`y`j`y`y`q`yad`y`j`w`j`y`j`w`j`y`q`y`j`ya``jadadagad`gad`hag`gac`g`iadag`~adad`jadad`y`p`y`j`yadadag`gag`ga`ad`ja`adad`j`y`y`j`y`q`y`j`w`y`j`{`w`yae`w`y`y`w`{`w`{`y`j`y`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`y`j`y`yae`y`yar`j`q`y`y`y`w`y`jar`j`y`y`{`yae`y`yae`y`{`y`y`jar`j`y`{`q`y`{`j`y`{`wae`yae`w`{`y`yar`j`{`y`{`yae`wae`yar`jar`y`y`{`q`j`y`y`j`w`{`j`y`{`q`y`j`y`j`y`r`y`y`wae`y`y`yae`y`y`j`{`j`y`j`{`j`y`q`y`yae`w`y`j`y`j`y`yaea``jada``j`yae`y`y`y`j`y`{`j`y`y`{`j`y`j`{`y`{`yae`y`j`{`y`jah`y`{`y`y`d`y`j`{`y`jah`{`d`y`jah`y`y`d`y`y`a`a`a`a", +"atatatatar`{`j`y`w`jad`h`padadad`y`ja``j`w`j`y`w`{ae`y`{`j`{`y`{`{ae`yar`y`{`w`{`j`{`y`{`w`{`{ae`{ar`y`{`y`r`yae`y`{`{`{`{ar`{`j`{`{`w`{`q`{`yae`y`{`w`j`{`y`w`{ae`y`{`w`j`{`y`r`{`y`r`y`{`y`j`{`y`j`yae`w`y`j`{`y`y`{`w`y`j`y`{`wae`y`{`y`{`w`d`{`yar`j`{`yae`y`{ar`j`w`{`w`yae`y`wae`y`y`{`j`{`y`wae`y`wae`y`y`q`y`{`q`y`j`y`{`w`{`j`wae`y`{`yae`{`w`y`r`y`y`j`j`y`j`y`pa``j`q`y`j`y`j`y`y`q`y`w`j`{`j`w`{`j`y`yar`j`y`yae`y`j`w`y`y`j`y`{`y`q`{`y`w`yae`j`w`y`j`w`j`w`j`y`j`j`y`y`r`y`yae`w`j`y`w`j`y`j`y`qadadad`gaj`gad`j`q`yadadadadadad`j`y`j`j`y`j`y`j`y`q`yae`w`y`j`j`y`j`y`j`w`j`j`w`j`y`j`y`q`y`j`ja``j`q`j`j`j`y`j`w`j`j`w`j`{`j`w`j`y`y`j`r`j`y`j`padadad`jad`y`jad`w`j`y`q`y`j`j`y`wae`y`j`y`j`w`j`y`qad`y`j`j`w`j`y`j`y`j`j`y`j`j`y`q`y`jad`y`jadad`gagag`gag`i`g`n`hac`gaj`g`g`kadadad`j`jad`jadag`h`n`gajad`jad`ja`adad`j`j`y`y`y`j`y`j`{`y`j`{`y`r`{`j`yae`y`j`q`{`y`q`{`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`q`y`q`y`j`q`y`y`y`j`j`yae`y`q`y`j`y`j`j`j`w`y`{`q`y`jae`w`{`y`j`y`q`yae`y`q`y`j`y`y`j`{`y`y`j`{`j`y`{`j`y`r`y`y`{`j`y`{`y`j`{`q`y`y`j`y`r`y`j`y`q`y`j`yae`w`j`y`j`y`j`j`y`yae`y`j`y`j`y`j`j`y`j`y`j`y`j`yae`y`j`y`y`j`j`y`j`j`j`yad`jad`y`j`y`j`{`j`y`j`{`j`{`j`{`y`y`{`j`j`yak`j`y`y`{ae`y`{`j`{`d`{`yae`yah`j`y`jah`jah`y`d`{`d`y`d`j`a`a`a`a", +"atatatat`y`{`y`{ad`~agadadadadadad`j`j`y`j`j`{`j`y`j`w`j`{`y`q`{`j`j`y`{`yae`yae`j`w`{`j`{ae`w`j`y`j`{`j`r`y`{`{ar`yae`{`w`{`y`{`{`wae`y`{`yae`y`{ar`{`y`{`wae`w`{`jar`j`y`yae`y`j`w`j`y`{`j`w`y`q`y`y`ja`ae`y`q`y`q`{`j`y`{`j`w`{`y`{`y`w`jae`w`{`wae`yae`w`{`w`{`j`y`j`{`j`y`j`yae`y`q`y`jar`y`q`{`y`{`y`j`{`q`y`{`j`y`{`q`{ad`{ae`y`j`y`{`w`j`{`w`yae`y`{`w`j`{`w`y`q`j`yad`ja``q`y`y`j`w`{`j`j`y`jar`y`yae`w`yae`y`yar`y`q`y`yae`y`y`jar`j`{`j`{`j`y`j`y`j`{`q`y`y`{`y`y`r`y`w`j`{`y`j`w`{`y`yae`y`y`w`j`yadad`jadagad`gada``j`w`yadadad`gad`jada``j`w`j`y`q`yad`q`y`j`w`y`j`y`q`y`j`y`w`y`j`w`j`wad`y`j`wadad`ja`ad`q`y`q`yae`y`yae`w`y`{`j`y`q`y`j`y`y`q`yada``qad`y`w`j`y`y`y`j`j`y`{`y`q`y`j`y`y`j`y`j`yar`j`y`y`q`y`j`y`j`y`q`y`j`y`w`j`y`j`y`j`q`y`jadadad`~`g`g`i`g`gagagac`iac`~ag`gadadagadadad`gaj`g`n`iad`gadad`j`yadad`jada``q`y`j`yae`y`w`y`q`y`y`{`y`y`{`q`y`{`yae`w`{`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}adad`y`{`j`y`y`y`j`y`j`{`w`yae`w`y`y`j`y`j`y`y`j`yar`j`y`y`y`j`{`y`q`{`y`y`j`y`y`y`j`y`{`jar`y`j`{`q`y`{`q`y`{`y`j`{`y`j`yae`wae`y`yae`y`q`y`y`j`y`q`y`yae`y`y`yae`y`y`j`{`y`y`j`y`j`w`j`y`q`j`y`j`y`y`j`y`w`j`yad`y`j`y`j`y`j`y`j`yad`yad`j`y`j`y`j`w`y`j`y`y`y`y`y`y`j`j`{`y`j`{`y`j`{`y`j`y`{`j`{`y`j`y`yah`j`y`{`jah`y`{`y`d`y`y`d`yah`y`a`a`a`a", +"atatatatae`wae`y`yadadadad`jada`ad`jad`y`y`p`ja``{`j`y`w`j`{`y`yar`yae`y`q`y`yar`j`y`y`q`y`y`j`{`w`y`{`y`y`w`{`j`yar`yae`yar`{`w`{`y`{`yar`{`w`{`yae`w`{`yae`y`y`{`y`y`q`{`j`w`{`yae`w`{`q`y`j`{`j`y`q`{`y`j`{`y`y`y`r`y`yar`{`yaear`j`{`{`w`{`yae`y`w`{`y`{`j`{`w`{`y`j`y`{`wae`y`sae`y`j`w`j`{`{`y`r`y`{`yae`{`w`{`j`w`yae`y`w`yar`y`yae`y`{`j`yae`w`{`j`{`y`w`j`y`w`j`y`j`wadad`j`j`w`j`y`q`y`y`w`j`y`w`yae`y`wae`y`j`y`{`j`w`j`w`j`w`{`j`w`y`j`w`j`y`j`y`w`yae`w`j`{`j`y`yae`y`w`j`w`y`j`j`w`j`y`j`j`y`q`y`j`wadad`p`gaj`gaj`j`j`y`q`j`jad`gadadadad`jad`y`j`y`yad`{`j`j`y`q`y`j`y`j`y`j`q`y`j`j`y`j`j`y`ja``q`y`j`s`j`y`j`y`q`j`y`q`y`j`y`w`j`y`yae`w`y`j`j`wadadadad`j`q`j`y`q`y`ja``r`j`y`j`w`j`yar`j`y`j`y`j`y`j`y`j`w`j`j`y`y`q`j`y`j`w`j`y`j`y`j`s`ja``jad`j`gad`gag`hag`g`gacac`hagag`h`gaj`hag`hag`hag`gag`~adadad`jada``j`jad`j`j`j`w`j`yae`j`{ae`y`jae`y`{`yae`y`w`{`yae`w`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}adadad`j`w`j`w`j`{`j`y`j`y`w`j`{`j`{`q`y`w`j`j`y`j`{`jar`j`{`j`y`{`j`wae`y`q`y`j`w`j`y`q`j`y`jar`j`{`y`j`y`q`y`j`w`j`y`j`w`y`y`j`j`y`j`y`j`y`q`y`j`y`j`j`w`j`j`y`j`y`j`j`y`j`j`j`y`j`y`j`y`j`jad`y`j`j`yad`j`y`j`y`j`j`yad`jadad`j`ja``j`ja``j`y`j`y`j`j`y`j`{`j`{`j`y`y`j`y`j`y`{`y`j`y`{`j`y`y`d`y`j`{`yae`y`jah`j`yae`y`jak`j`{`d`y`jah`j`a`a`a`a", +"atatatat`y`{`y`{`jadad`~ada``j`jadadadad`j`j`y`{`j`y`j`yae`y`j`w`jae`w`j`yae`y`{`j`w`j`{`j`{`y`r`y`j`yae`wae`y`j`{`j`{`j`y`{`jar`j`{`j`{`j`y`j`wae`w`{`j`{`j`yarae`q`y`j`{`w`j`{`j`y`j`y`j`y`q`{a`ae`y`y`j`w`y`r`y`j`{`jar`j`{`j`{`y`{`w`j`{`wae`y`wae`yae`yar`yae`y`q`{`q`yae`w`{`y`jar`y`{`y`{`j`wae`y`j`w`j`y`y`j`y`{`j`{`w`j`yae`y`r`yar`j`y`{`q`y`yar`j`w`{ae`y`jar`j`y`y`j`yadad`j`j`y`yae`y`j`{`j`yae`q`y`j`yae`y`wae`w`j`y`{`w`j`{`y`y`j`y`j`y`{`{`w`jarae`y`y`{`q`y`q`{`w`j`y`{`j`w`y`j`y`q`{`q`y`y`j`wad`y`jadadadag`gada``q`j`y`wadadadadagadadad`p`jad`q`y`j`w`y`j`y`y`jarad`w`j`y`j`y`yara``j`y`q`y`y`j`y`j`j`y`p`y`j`y`w`y`y`q`yae`y`{`w`j`y`j`w`ja`ad`jad`qa``j`y`q`y`j`y`q`y`j`y`yae`j`w`j`y`q`y`y`j`y`q`y`j`yad`y`q`y`j`y`j`y`y`j`y`j`w`j`y`j`j`y`y`jadad`gadag`g`g`iag`gag`g`hagad`i`gadag`gag`g`i`gadadadadada``jad`yad`y`p`y`j`y`q`y`y`j`w`y`{ar`y`q`{`q`{`y`jae`y`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}adadadad`j`j`y`yae`y`w`yae`w`y`yae`y`w`y`y`j`y`j`y`w`j`y`j`y`w`j`y`{`q`{`y`y`j`y`yae`j`y`j`y`y`j`{`y`y`y`q`y`yae`yae`y`y`j`y`j`j`y`j`y`j`y`j`y`y`j`w`j`j`y`y`j`y`q`y`j`j`y`y`q`y`y`j`y`j`y`y`ja``y`y`j`y`y`j`y`j`j`y`j`y`j`y`j`y`yadad`ja``j`y`j`y`j`yad`y`j`y`j`y`j`yak`j`{`y`{`j`y`j`y`j`y`yae`y`y`j`{`y`yae`yah`j`y`yahaeah`y`y`j`y`d`y`y`d`a`a`a`a", +"atatatat`j`y`r`yadadadadad`~adad`yadadad`yad`j`y`p`{`y`j`y`j`y`j`y`y`y`q`y`y`q`yae`y`w`{`y`q`{`y`r`y`j`y`y`w`{ar`y`y`r`{`y`y`{`j`{`w`{`q`{`w`{`y`y`{`y`w`{ae`y`w`y`j`y`w`j`y`y`q`y`y`w`j`j`y`y`j`w`{`y`r`y`{`{`y`w`y`{`y`y`wae`w`y`{`j`{`y`{`j`w`{`y`{`q`yae`j`w`yae`y`y`{`j`y`{`q`y`y`yae`y`w`y`{`w`y`{`j`yar`y`jar`y`j`w`{`{`y`q`{`y`y`j`{`w`j`{`y`j`y`{`{`w`y`{`w`y`j`w`j`y`j`wada``j`y`q`y`q`y`w`j`{`y`y`j`y`w`j`y`j`w`{`y`yar`j`{a``qae`w`y`j`y`y`q`y`{`yae`w`j`y`j`{`y`yae`{`w`jae`y`q`{`j`y`y`{`j`w`{`j`y`w`jada`adadadagadadada``j`j`y`padad`gadadagadadadadad`jad`j`w`j`ja`ae`y`j`y`w`y`q`j`y`q`y`q`y`j`j`y`q`yad`j`y`q`y`j`j`yae`y`q`j`y`j`{`q`y`j`j`w`jadad`ja``q`j`yad`y`j`w`y`r`j`w`y`j`y`j`y`j`y`q`y`j`y`y`j`j`w`j`ja``j`w`j`w`j`j`y`q`y`j`y`j`w`jad`y`jadadadad`hag`g`gag`g`gadagasagadagad`gad`gag`gadadadadad`j`j`w`jad`yad`jad`y`j`y`j`y`yae`y`yae`y`y`{`y`j`w`yar`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}adajada``j`y`j`w`y`j`y`{`j`{`yae`w`y`jae`y`y`q`j`y`j`w`j`y`j`{`j`y`j`y`j`w`{`j`q`y`y`j`y`j`j`w`y`j`j`y`j`y`j`y`y`j`q`j`j`j`y`j`j`w`ja``j`y`j`j`ja``j`jad`j`y`j`y`y`j`y`q`y`j`j`y`j`y`j`w`j`y`j`j`y`j`y`j`j`w`y`j`y`j`y`j`y`j`j`yad`yadad`jad`jad`y`j`j`y`j`j`y`j`y`j`y`j`y`y`y`yae`y`{`{`j`y`y`j`{`y`j`y`j`y`d`y`{`y`j`{`y`y`e`yah`j`yah`d`y`d`a`a`a`a", +"atatatat`y`w`{`y`yadadadadad`j`ja``j`jad`q`j`wad`j`y`j`w`j`y`q`y`j`j`w`j`{`j`y`j`{`y`j`j`j`y`{`j`y`j`yar`j`{`j`j`y`j`{`y`y`q`{`q`y`{ae`y`y`j`{`j`{`j`r`y`{`j`w`yae`y`{`q`{`{`j`yae`y`j`{`j`w`y`wae`yae`y`j`{`y`wae`yae`y`q`{`y`y`{`q`{`w`yae`w`j`{`y`r`y`{`y`w`j`{`y`j`wae`y`y`q`{`y`yae`y`q`{`j`{`j`{`q`y`y`jae`w`{`jar`y`j`y`q`y`j`{`jar`yae`y`yar`y`y`r`yae`yae`y`j`y`j`{`w`j`y`q`y`j`pad`j`j`y`j`y`j`y`q`{`j`y`yae`w`y`j`{`q`{ae`y`j`y`{`y`q`yae`w`y`j`y`q`y`{`{`yar`j`y`q`{`j`y`y`y`q`y`{`j`y`w`y`q`y`j`{`q`y`j`y`j`padaj`g`gadad`j`j`y`j`y`j`y`padadad`gag`gadag`gadad`j`jad`y`j`p`y`w`j`j`y`j`y`j`y`y`j`y`q`y`j`y`j`w`j`y`j`y`j`y`q`y`y`j`y`j`wah`q`y`y`j`yad`y`p`jad`yad`y`j`w`j`y`j`y`y`j`q`y`w`jarad`yae`y`j`w`j`j`w`j`y`j`y`j`y`j`y`w`j`y`j`y`qa``j`y`j`w`j`y`ja`adajad`gaj`gadajadadad`gad`g`~ajadadadadadadadad`y`ja`ad`j`w`jada``j`p`j`y`q`yae`yar`jar`j`{`j`wae`y`{`j`{`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`g`gadad`j`w`j`w`j`yae`wae`y`j`{`q`y`j`{`y`y`wae`y`y`y`j`j`y`w`j`j`y`w`j`{`j`{`j`y`j`y`q`y`y`j`y`j`y`j`j`y`j`j`y`y`j`ja``y`j`w`y`y`j`y`q`y`j`j`y`y`q`y`y`q`y`j`y`j`j`y`j`y`j`y`y`j`y`q`y`j`y`y`j`y`j`y`q`y`y`j`y`j`w`y`j`w`y`j`y`j`y`j`j`yad`da``j`yad`j`y`ja``j`y`j`y`j`y`{`j`{`j`j`{`y`j`y`y`yae`y`y`j`{ah`{`y`{`y`jah`j`yah`j`y`j`yak`y`jah`j`a`a`a`a", +"atatatat`{ae`yae`{`jadada``j`j`y`j`ja`adad`yae`y`j`y`{ad`j`{`y`j`yae`y`y`q`j`y`j`j`y`w`y`j`ja``r`y`y`j`j`w`y`y`r`{`s`jae`y`y`y`j`w`y`j`y`w`{`j`y`y`{`j`w`{`j`y`w`{`j`y`y`r`y`y`y`j`w`y`j`y`j`y`{`j`w`yae`y`q`{`{`y`w`j`{`yarae`j`y`y`r`y`w`{`y`y`q`y`j`y`wae`y`y`{`j`y`y`wae`y`y`j`{`w`{`y`j`yae`w`y`j`{`y`q`y`{`y`{`yae`w`y`{`y`y`y`{`w`j`{`yar`j`y`q`y`jar`y`w`{ae`w`y`j`y`y`y`y`y`j`y`y`y`p`y`j`y`jara``j`yar`j`y`j`y`{`w`j`y`y`q`y`y`q`{`y`y`{`q`{`yae`y`{`w`j`{`y`{`j`{`y`w`{`q`{`{`y`q`y`j`w`yae`y`w`y`j`y`w`yae`ya``qadad`gajad`p`y`qad`y`q`y`y`ja``jadadadag`gadag`gadadadad`jadad`j`y`qa``j`y`j`w`j`y`y`j`w`y`q`y`j`wad`y`q`y`j`y`q`y`j`w`j`y`j`y`j`w`j`w`j`j`yad`p`j`jad`y`j`w`y`j`y`q`y`j`j`y`y`j`w`y`q`ja``y`q`y`yad`j`y`q`y`j`y`j`j`w`j`y`j`y`j`w`j`y`j`w`j`yadadadadadadad`gadadad`jadad`p`gad`gadad`jadad`j`padad`jad`y`j`j`yad`jadad`y`j`j`w`y`j`y`{`w`j`y`y`q`{`j`{`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}agadadada``j`y`y`j`j`y`y`j`w`y`j`{`y`q`{`q`{`y`j`r`y`y`y`j`j`y`q`y`j`{`j`y`y`j`w`{`y`j`y`j`y`q`y`j`y`j`w`j`y`j`j`y`j`y`j`yad`j`y`j`y`j`y`y`j`y`j`j`y`j`y`j`y`y`j`y`j`w`y`j`y`j`w`y`j`yae`y`j`w`j`y`y`j`y`w`{`j`y`y`yae`y`j`y`y`ja``j`y`j`y`ja``j`y`jad`y`j`y`ja``j`j`y`j`y`j`y`y`y`j`y`d`{`j`{`y`j`{`y`y`j`y`j`j`{`y`yae`y`d`{`yah`y`j`{`j`y`jah`a`a`a`a", +"atatatatar`y`{`jara``y`jadada``jada``j`yad`j`yad`y`j`y`q`y`j`yad`y`j`w`j`j`y`w`j`y`q`j`y`j`y`q`y`j`q`y`j`y`j`q`y`j`yae`y`w`y`r`y`j`y`r`y`y`j`j`w`{`j`q`y`y`q`y`j`yae`y`w`yae`y`j`wae`y`y`r`y`j`w`j`y`yar`j`y`y`j`w`j`y`yae`yae`x`q`y`j`y`{`j`{`q`y`{`{`{`j`yar`j`{`jar`y`{`j`y`q`{`q`j`j`w`j`yar`j`y`y`{`q`y`y`j`j`wae`w`{`j`yae`q`y`r`y`y`y`j`y`j`{`j`y`{`y`q`y`j`w`yae`yar`y`j`r`y`q`{`q`y`j`y`j`s`j`y`j`y`j`j`y`w`j`y`wae`y`yar`y`{`q`y`y`j`j`w`j`y`w`{`j`w`yae`y`q`{`q`y`wae`j`y`{`j`w`{`j`w`{`j`j`y`j`y`j`q`y`j`j`w`j`jad`gagad`gadadad`j`w`j`j`j`w`j`y`p`y`y`padad`gad`gadagadad`gadad`j`j`j`j`y`q`j`j`y`j`j`y`j`y`j`y`j`y`j`j`j`y`w`j`y`q`y`y`j`w`j`w`j`y`ja``q`y`jadad`qa`ad`q`j`y`q`j`y`y`y`j`w`y`j`{`j`y`j`y`q`j`y`j`y`q`y`j`y`j`y`j`w`j`y`y`j`j`y`y`j`q`y`y`j`y`j`y`j`padad`yad`yad`ja``q`ja``jadadadadadada``jad`ja``j`j`y`j`y`qad`yadad`j`j`w`j`yae`yar`yae`w`j`{`j`y`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ad`gadadadad`j`q`y`j`w`y`j`w`j`y`j`y`q`{`y`j`{`j`y`y`y`q`{`j`w`y`y`j`yad`j`y`q`{`j`y`j`wae`y`w`j`j`y`y`q`y`j`y`j`y`y`j`w`j`w`j`y`j`w`j`y`y`j`j`y`y`w`j`w`y`j`y`q`y`jar`y`j`y`w`j`{`j`y`y`q`y`y`{`j`w`{`j`yae`j`y`y`jar`j`y`{`w`j`y`j`{`w`j`y`j`y`j`y`jad`y`jad`yad`j`yad`y`j`j`j`y`j`y`j`y`y`j`y`jah`y`j`y`j`{`y`{`y`j`y`j`y`y`y`j`{`jak`j`y`y`d`y`a`a`a`a", +"atatatatae`yar`{`y`{ae`yadad`ja`ad`j`y`j`y`j`j`y`q`y`j`y`y`q`j`y`j`y`y`j`y`j`y`y`j`{ad`w`j`j`y`y`y`j`w`j`y`y`j`w`ja``qaead`y`j`y`y`j`y`j`y`q`y`jad`y`j`y`j`y`j`w`j`{`y`q`y`y`w`j`{ad`w`yae`y`yae`y`j`y`y`{`yae`y`{`jar`q`yar`yae`{`w`{`{`y`wae`y`y`r`y`y`{`{`yar`y`{`y`r`y`y`w`{`y`{`w`{`y`y`j`{`w`{`j`y`jar`y`y`y`w`{`j`w`y`{ad`{`yae`yar`{`y`w`y`{`q`y`q`{`j`y`yae`w`y`r`y`{`y`y`j`y`y`j`w`j`y`q`y`j`w`j`y`y`j`y`{`j`{`j`yae`y`j`{`y`y`r`{`y`w`j`{`j`{`w`{`y`{`q`{`y`j`{`y`y`w`{`y`w`j`{`y`yae`w`y`j`j`w`y`j`y`y`q`j`y`y`w`jadadagad`gadad`y`y`j`j`y`j`j`y`j`wae`yad`{`padadadadagadagad`gad`~ao`p`jada``q`j`w`j`w`j`y`q`y`j`p`y`y`j`j`y`y`j`y`w`j`y`j`y`j`w`j`w`j`yad`yad`wad`j`yad`y`j`y`j`q`y`q`y`j`y`q`y`y`q`y`y`j`y`q`yad`j`y`q`y`j`wad`j`y`w`j`w`j`y`j`y`j`y`q`j`yad`j`yadadadad`ja``j`y`y`j`y`q`y`jadad`jadadadadada``q`yad`s`y`j`y`jad`yada``j`j`y`j`j`y`y`{`j`{`y`{`q`y`{`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}adad`p`y`jad`y`j`j`y`j`y`j`y`jar`y`j`y`j`y`y`j`y`q`yae`y`j`y`j`y`q`y`q`y`j`y`j`y`j`y`j`y`j`y`y`w`jar`j`y`y`q`y`w`j`yae`y`y`j`y`q`y`y`j`y`w`j`y`j`y`j`y`j`y`j`{`y`q`y`j`y`j`{`y`y`j`yae`y`j`{`j`y`j`y`y`{`j`y`w`j`{`y`yae`w`j`y`{`y`yae`y`y`j`y`j`y`j`y`j`ja``j`j`y`j`y`j`jao`y`j`yae`y`y`j`y`{`y`j`j`y`{`{`j`y`j`{`yaeah`j`{`d`j`y`y`yaeah`y`j`y`j`a`a`a`a", +"atatatat`{`y`{`{`jar`y`{`w`j`y`jadad`jad`jadad`yad`j`y`s`j`j`y`y`j`w`ja``j`y`jar`y`j`w`j`j`y`y`j`j`y`j`y`j`yad`j`y`j`y`j`y`y`j`j`q`y`jadad`j`j`y`s`j`j`y`q`y`j`{`y`y`r`y`yae`y`j`y`w`j`y`q`y`{`w`j`{`w`j`{`j`y`r`y`wae`y`y`{`j`y`w`yae`{`wae`{`y`w`{ae`q`{`waear`yae`j`y`{`r`y`y`{`j`{`yaear`j`w`{`j`y`yar`y`j`{`q`{`j`y`j`j`y`j`y`j`w`y`j`yae`j`y`j`y`j`y`{`w`yae`w`y`j`y`j`y`q`{`r`y`jar`j`y`{`y`q`y`yad`qad`y`q`j`y`j`w`j`w`j`y`q`yae`y`q`{`j`{`y`{`y`yae`yae`w`j`y`y`q`{`q`{`j`w`j`{`y`jar`j`yad`y`q`y`j`j`y`q`y`y`j`y`j`jad`gadag`g`jad`w`j`y`j`wad`y`q`y`j`y`j`w`j`y`j`y`q`y`padadad`gadagadagadadad`jad`jad`y`j`j`j`w`j`y`j`y`p`j`wae`y`q`{`j`j`y`q`y`j`y`ja`ae`y`qad`j`jad`pad`jad`q`yad`y`j`{`j`w`j`y`j`j`y`q`j`y`jad`y`j`ja``j`y`j`y`j`yae`y`j`y`j`q`y`j`y`j`y`p`y`j`jadad`jadad`j`w`j`y`q`y`j`y`j`y`j`w`jadadadad`jad`j`j`y`jad`ja``q`j`yad`j`jad`y`j`j`y`q`{`q`y`yae`y`q`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`q`y`j`y`jadad`yadad`y`j`y`q`y`j`j`y`y`q`y`q`{`q`yae`y`y`j`y`y`q`yae`y`y`j`y`jad`j`j`w`j`y`j`{`j`y`j`y`j`y`j`y`j`yae`w`yad`{`j`y`y`j`y`j`{`j`yar`j`y`q`y`j`y`w`j`{`y`j`w`{`j`wae`y`j`y`yae`w`y`y`j`w`jae`y`y`y`j`y`j`j`{`y`y`j`{`j`y`j`y`q`y`j`y`j`y`ja``y`jad`yadad`j`y`j`y`j`y`j`y`y`j`y`j`j`y`y`j`{`y`j`y`y`j`y`j`y`yaeah`y`yae`y`j`{`j`y`{`j`y`a`a`a`a", +"atatatat`{`y`r`{`{`{`w`{`y`yae`wadadad`ja``j`j`y`y`j`y`j`y`wae`y`y`j`j`w`~`w`j`j`y`j`j`y`w`j`j`y`w`j`y`j`y`q`y`j`w`j`y`j`p`y`jadadad`y`j`s`j`y`j`y`y`j`y`y`{`y`q`{`yae`w`yae`y`w`{`j`{`yae`y`j`wae`y`{`q`yar`y`y`{`w`yae`w`yae`y`{`w`{`j`{`y`r`y`{`y`{`yar`{`y`{`w`{`y`w`{`{`y`r`y`y`w`y`{`jarak`q`{ar`j`{`w`yae`y`w`{ae`y`w`y`{`y`yae`y`w`j`y`{`q`y`j`y`w`{ae`y`y`j`y`y`q`{`q`y`y`yar`y`{`j`w`yae`y`q`{`yad`j`yad`w`j`y`y`j`{`y`j`{`j`{`w`yar`j`y`q`{`y`r`y`y`j`{`w`jar`y`j`y`j`{`y`q`y`q`y`yar`y`j`y`j`w`y`j`y`j`w`j`w`j`y`j`wad`gaj`gadaja``j`w`j`y`w`j`y`j`y`j`y`j`y`j`y`s`j`y`y`s`j`j`sad`j`gad`gaj`gadadadadad`q`yad`y`j`w`j`y`j`y`y`j`y`j`y`w`j`y`y`j`y`q`y`j`w`j`y`q`yad`y`jadadadad`j`y`p`y`j`y`y`j`w`j`y`y`j`w`j`y`qad`j`s`j`p`y`q`y`j`w`j`y`j`w`yad`q`y`j`y`j`y`j`w`y`jadadadad`j`j`y`y`j`y`w`j`w`j`y`y`q`y`j`padadadad`j`y`p`j`yad`jad`w`y`j`pad`y`q`y`j`y`j`y`q`y`j`y`{`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`{`j`y`w`y`j`w`j`jadad`y`j`y`y`w`j`y`j`{`j`y`y`{`j`y`w`j`yae`y`y`r`y`y`w`j`y`y`j`y`ja``j`y`j`yar`y`j`y`j`w`y`j`{`w`y`jae`w`y`j`j`y`q`j`y`j`wae`y`j`yae`y`y`j`y`yae`y`{`j`y`j`y`y`r`y`y`j`y`j`y`r`{`y`y`q`yae`yae`y`w`{`j`y`{`j`w`{`j`{`j`y`{`y`q`y`j`y`j`y`j`jadad`yadad`y`jad`y`d`j`j`y`y`jahae`y`j`yae`y`j`{`y`jah`y`y`j`y`jah`{ah`y`jah`y`d`yae`a`a`a`a", +"atatatat`{`j`{`yae`w`y`{`{ae`y`yad`yad`jadadadad`j`y`jad`j`{`jad`j`y`j`y`j`y`qa``j`yad`y`y`ja``j`y`j`y`w`j`y`y`y`j`y`q`{`j`yad`y`qa`ad`qa``j`y`j`p`j`y`q`y`jar`{`y`r`y`y`j`{`w`{`j`{`yae`w`{`q`y`{`y`y`y`{`j`y`{`r`y`{`j`{`y`{`jar`y`j`{`y`q`{`{`y`wae`{`y`y`r`y`yae`{`j`{`j`{`y`jarae`yae`y`{`w`j`{`y`y`y`j`{`y`j`y`r`y`j`{`y`j`w`j`j`y`j`w`{`q`y`y`{ar`y`{`q`y`q`{`j`w`j`{`y`w`jae`y`j`y`j`y`{`jar`y`y`j`j`y`j`p`yad`j`w`j`y`w`j`y`w`j`{`j`y`j`w`{`y`q`{`y`{`w`y`j`{`y`y`j`y`y`q`{`j`y`{`y`q`y`j`y`q`y`j`w`j`{`q`y`y`jad`w`jadadaj`gadag`gad`qad`j`y`j`y`j`j`y`q`y`j`w`j`y`y`j`j`w`j`j`y`j`y`j`y`padadadad`gag`gadaj`g`jad`pad`y`jad`y`j`q`j`y`q`y`j`y`q`{`q`y`j`q`j`y`j`y`w`y`jadad`padad`jad`jad`yad`p`j`j`y`j`q`y`ja``j`jad`y`jad`j`j`y`j`j`yad`q`j`y`j`j`y`j`y`q`y`jad`y`jadad`pad`yad`j`y`j`w`j`j`yae`y`y`j`y`j`w`y`ja`adad`jadad`jadad`q`y`jad`q`yad`y`j`jad`y`j`j`y`j`y`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`q`y`j`w`j`yae`j`y`d`wada``j`qad`jae`j`j`y`q`y`y`w`j`j`y`j`y`q`y`{`q`y`y`j`y`j`{`y`j`s`y`jad`jad`j`y`j`y`jar`yae`y`w`j`y`j`y`j`y`j`y`j`y`y`j`y`j`y`j`y`j`y`q`y`j`j`y`j`{`j`w`y`j`{`w`j`y`j`yae`w`y`y`j`y`j`y`j`y`y`j`w`yae`j`y`j`yae`y`y`j`y`y`j`j`{`y`j`yar`j`j`yad`yad`ja``j`j`y`j`y`j`y`y`j`j`y`j`y`j`y`y`j`{`y`j`{`j`yae`y`y`{`y`j`{`jah`j`y`j`y`j`a`a`a`a", +"atatatat`y`{`y`{`{ae`y`r`yar`j`{`{ad`yadadadadad`j`y`j`w`j`y`j`{`w`j`ja``j`y`j`y`q`y`j`w`j`y`w`j`y`j`y`j`j`y`j`y`j`yad`yad`q`yad`y`j`y`j`j`s`j`y`y`y`{`j`y`y`{`j`{`y`{`w`{`y`jar`yae`y`yae`y`{`wae`y`r`y`{ar`yae`yar`y`{`q`{`y`{`{`wae`y`{`yar`j`{`yar`y`r`y`{ar`yae`w`y`yae`y`w`{`y`yar`{`y`j`{ar`y`w`{ae`w`y`{`j`y`yae`w`y`j`j`y`w`{`j`y`y`j`y`{`q`j`{`w`j`y`y`yar`y`j`yar`y`y`y`j`w`yae`y`q`y`y`j`yae`y`w`y`j`y`j`yad`j`y`j`y`y`j`y`j`y`j`yae`y`q`y`j`yae`j`{`w`{`j`q`yar`j`y`w`j`y`{`q`{`y`yar`yae`y`y`j`w`j`y`j`y`y`j`y`wadad`gag`g`gaj`gad`j`j`w`y`j`wad`y`j`yad`y`j`q`y`j`y`j`y`q`yad`w`j`y`y`w`j`wad`jadadadad`gadadadad`jad`q`yad`y`j`y`y`j`y`j`y`y`q`y`y`y`q`y`j`j`y`j`q`y`yadadadadadadad`j`ja``w`jad`y`y`j`w`ja``j`wad`yadadadadad`y`j`ya``q`j`y`ja``j`jad`y`wadadad`jadad`pad`y`j`w`j`y`j`w`y`j`q`y`y`j`y`j`y`w`j`w`ja``jadad`yadad`ja``j`y`jada``j`wadad`j`y`j`j`y`j`s`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`q`y`j`y`w`j`w`j`y`j`y`ja`adad`yad`y`j`j`j`j`y`j`{`w`j`y`j`y`w`j`y`j`{`q`y`y`q`{`y`j`w`{ad`y`jad`y`y`j`y`y`j`{`j`{`yae`y`w`{`j`w`yae`w`y`y`j`y`w`j`y`y`y`y`q`y`y`j`y`j`yae`y`y`j`y`j`{`w`j`yae`y`j`{`y`q`{`{`w`j`j`y`y`yae`y`j`y`y`j`yae`y`y`j`y`y`{`j`y`y`q`y`j`yad`jad`jad`y`j`yad`ja``j`y`y`y`j`y`j`y`{`j`y`y`y`{`y`j`yae`y`j`y`{`j`y`j`y`jah`j`y`a`a`a`a", +"atatatat`y`{`jar`y`yar`{`{`{`y`{`y`q`y`j`ja`ad`jadad`y`jada``j`jad`yad`qad`y`j`q`y`j`j`y`y`j`j`y`w`j`y`q`y`j`w`j`y`jad`y`j`j`y`j`w`j`j`w`yad`j`y`j`wae`w`y`jar`j`y`w`{`j`yaear`y`{`{`w`y`yar`y`{`jar`y`y`j`{`yar`{ae`yar`y`y`{ar`y`{`j`y`{`wae`{`yar`j`{`{`yae`yae`w`{`y`jar`{`y`yaear`y`j`{`w`y`{`q`{`{`j`yar`{`j`w`j`y`jad`y`r`y`y`j`{`y`q`yae`y`yar`y`y`{`{ar`j`yae`w`y`{`j`y`r`{`{`j`{`w`j`y`j`j`w`y`q`y`j`y`q`yad`w`jad`w`j`j`{`w`j`y`w`{`q`yar`j`y`j`y`q`y`j`y`j`y`{`j`y`y`j`{`jar`y`j`wae`{`j`y`w`j`y`j`y`y`j`yae`s`j`j`jadadadad`g`iadadada``j`y`p`j`y`j`y`q`y`w`j`y`j`y`j`w`j`y`j`w`j`j`w`j`y`j`j`y`j`y`y`padadadadaj`gadadadadad`q`j`q`y`q`j`y`w`j`y`jar`j`y`y`j`y`q`y`j`yad`qadad`gadagad`gad`jad`jadad`y`jad`j`p`jadad`jadadadadadadad`j`q`yad`jad`j`y`jad`jad`jadadadadad`jad`j`j`y`j`y`j`{`y`j`{`j`y`r`y`j`w`j`y`j`y`qad`yad`yad`wad`j`y`p`j`y`jad`jadad`jadadad`jadad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`y`j`j`y`y`j`j`y`j`y`qa``j`j`j`yad`jada`adad`j`y`jad`j`y`j`y`y`j`j`w`y`j`{`j`y`j`y`j`y`j`j`yad`j`s`j`j`yae`y`j`y`w`j`y`j`y`j`w`j`{`y`j`yae`y`w`j`{`y`{`q`j`y`j`y`j`y`y`j`y`j`j`{`j`w`j`{`y`j`y`{`w`{`j`y`y`j`j`y`{`y`q`y`j`w`yar`j`y`w`j`y`j`y`j`j`y`j`y`j`y`j`yad`jadadad`jadahad`j`yad`jah`j`j`y`j`y`y`j`y`y`j`{`j`j`{`y`j`y`y`d`y`d`y`y`d`y`y`jah`a`a`a`a", +"atatatat`j`{ar`{ae`y`{arae`yar`{ae`y`y`j`y`ja`adad`y`jad`y`q`y`j`w`j`{ada``j`j`yad`y`j`p`j`y`jad`j`yad`y`j`ja``j`j`yad`yad`ja``j`j`yad`j`ja`ad`j`j`y`yae`w`j`{`y`j`y`r`y`{`y`{`q`y`{aear`y`{`jar`{`y`r`{`{`q`y`{`yar`j`{ar`j`yae`w`{`jar`y`y`{`wae`yae`w`yar`y`{`y`{`{`j`{`y`{`q`{`yae`yar`j`y`y`j`{`y`wae`y`j`y`j`y`y`j`ja``j`y`q`y`j`y`y`yae`w`yae`y`j`w`j`{`y`y`r`y`j`wae`y`{`y`q`y`yae`y`y`wae`w`y`{`j`w`y`j`y`w`j`j`y`ja``j`j`y`j`y`j`y`y`j`y`yar`y`j`y`j`y`q`{`j`w`yar`j`w`yae`s`j`{`y`j`w`j`y`j`w`y`q`y`r`y`q`y`j`y`jadadadadaj`gadag`gajad`jad`j`y`y`q`y`j`y`ja``q`y`y`j`y`j`y`q`y`j`y`y`j`y`j`w`y`q`y`{`j`y`q`wadad`jad`p`gadadadadad`yad`j`w`j`y`j`w`j`y`w`j`y`j`y`y`q`y`j`y`y`j`padagadagadagadadadajadadadadadadadadadadadadadadadadadadadadadadadad`padadadadadadadadadad`yad`w`y`y`q`y`y`r`y`y`q`y`j`y`y`j`yae`y`p`y`y`y`q`j`y`jad`y`jad`y`j`y`p`ja``jadadadadadadadad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`y`j`w`j`y`y`y`w`j`y`j`y`y`w`j`yad`jadadadadadad`j`yad`j`j`y`j`y`{`j`w`j`y`w`jar`j`w`y`q`y`y`j`j`yad`j`y`s`j`{`j`y`yae`y`y`j`y`{`q`yae`w`y`j`y`y`q`y`{`y`q`y`j`w`y`j`y`j`w`y`y`y`{`j`yae`w`yae`y`j`yar`j`y`y`j`y`j`{`j`y`j`{`j`y`j`y`{`j`w`y`j`y`y`{`j`j`y`j`y`j`yad`ja`adad`j`y`j`j`y`ja``j`y`y`j`y`j`{`y`j`y`j`y`y`y`jah`yae`y`j`y`y`j`{`y`j`{`y`j`a`a`a`a", +"atatatat`y`{`y`{`jar`{`{`yar`yae`y`{ar`y`w`y`jad`j`p`y`j`ja``jad`y`j`y`jad`yad`j`y`y`q`ya``j`j`y`y`q`yad`w`yad`j`wad`yad`jad`yad`j`y`y`j`pa``j`y`j`y`w`j`y`y`yae`w`y`{`yar`{`q`y`{ar`j`y`{`{ar`y`j`{`{`y`{`{`yarae`yar`y`{`y`yar`{`y`{`y`{`j`w`{`{`{`yar`{`j`{ae`w`yae`w`y`{`q`{`yaear`yar`{ae`y`r`yar`yae`y`w`y`{`wad`q`yad`wae`y`{`{`{`q`y`y`{`y`wae`y`{`yar`jar`yae`{`y`y`{`y`q`{`{`yar`j`y`y`j`y`jar`j`y`jar`j`y`y`j`y`p`y`j`pad`y`q`y`w`j`j`{`wae`j`y`y`q`y`y`y`q`y`yae`y`y`q`{`y`{`y`q`y`y`{`j`w`y`j`j`y`y`j`y`q`y`j`j`sadajad`g`gaj`gad`g`gadadadad`qad`j`j`q`y`j`j`y`q`yad`j`w`j`y`y`q`y`j`w`j`y`j`y`j`j`s`j`y`y`j`w`j`w`jadadadadadadadadad`y`j`w`j`j`y`yae`j`wae`y`q`y`j`y`y`q`j`y`yadag`gacaj`g`gadagad`gadad`gad`gaj`gadagadad`gaj`gaj`gagadadadadadad`jadad`jadad`y`j`p`y`j`w`j`yae`y`q`y`j`y`j`y`{`j`w`{`j`w`y`y`j`yae`j`y`j`wadad`j`y`j`j`wad`jad`j`jadadadadadadadad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`q`yae`y`y`q`j`j`y`j`y`j`w`j`y`j`w`j`ya``q`y`padadad`gad`jad`y`j`j`j`y`j`w`j`y`j`y`yae`y`j`y`j`yadad`jad`j`y`j`y`j`q`y`j`w`jaea``{`j`w`yae`j`w`j`y`j`j`y`j`y`j`y`j`y`j`y`j`y`j`j`j`w`y`j`y`j`y`j`y`{`j`y`j`{`y`q`{`j`y`q`{`y`j`y`j`y`j`j`y`j`y`j`y`j`j`y`j`y`ja``j`jadadad`jad`yad`ja``j`j`j`y`j`y`j`y`y`j`yae`y`yae`y`j`y`j`yae`y`y`y`j`y`y`jak`j`j`a`a`a`a", +"atatatat`{`{`{`y`{`{`j`yae`yar`y`r`{`yaear`y`jad`yad`j`y`j`y`q`ja``jad`w`j`j`ja``j`j`jad`w`jad`w`j`jad`yad`j`yad`jadadadadadad`j`yad`ja`ae`y`q`y`j`j`y`j`j`y`y`jae`yae`j`y`{`{`{`j`{ar`j`{`j`{`w`{`j`w`yarae`y`{`yae`yarae`{`w`j`{`q`yar`j`{`{`q`{`y`{`j`w`y`{`yae`w`{`y`{`w`{`jar`y`{`w`j`{`w`y`j`y`j`y`j`{`j`q`jad`y`j`y`j`y`q`y`j`yae`yarae`j`y`y`r`y`wae`y`{`y`q`y`w`jar`j`y`{`q`y`j`{`q`{`wae`y`j`w`j`y`y`j`y`q`y`j`j`yad`j`y`p`j`j`y`j`w`j`y`y`jar`y`j`{`q`{`y`j`y`j`wae`y`y`r`y`j`y`j`w`j`y`j`y`j`y`j`y`w`j`y`y`q`yadadadadadadad`gadadajad`gadadad`ja``j`y`j`p`y`j`yad`q`y`j`y`j`y`j`y`j`y`j`y`j`w`j`y`j`y`j`j`y`w`yae`y`p`j`qa`adad`j`padadadad`j`y`w`j`w`j`y`y`j`y`j`y`q`y`jar`j`j`w`j`y`g`gag`g`gaj`gagadaj`gagadag`gagadag`gagadag`gag`hagadadadad`pa``y`q`y`j`q`y`j`j`y`y`j`y`j`y`j`y`yae`w`j`y`r`y`j`yae`{`jar`j`w`y`yarad`y`j`w`yad`ja``j`ja``j`j`s`jadad`yadad`y`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`j`y`q`y`yae`w`y`{`q`y`y`j`{`y`y`j`w`j`y`j`y`j`wadadadad`gadadad`j`yad`{`j`y`j`y`q`y`y`j`y`p`j`y`ja``jad`y`j`w`y`y`j`y`y`j`w`{`j`y`j`y`j`y`y`{`y`q`y`y`j`yar`j`y`j`y`w`j`y`j`y`y`j`{`y`y`j`w`y`j`y`q`y`y`yae`y`y`j`y`{`y`j`w`{`j`y`y`y`j`y`y`j`y`j`y`j`y`w`j`j`y`ja``j`yadad`y`j`yad`y`j`y`j`~`y`j`y`{`j`y`y`y`j`{`y`y`j`y`y`j`y`j`{`j`y`j`{`y`j`y`y`a`a`a`a", +"atatatat`{`r`{`wae`{ar`{`{`w`{`{`{`y`{`{`y`j`w`y`j`y`w`ja``j`y`j`yad`w`jad`wa``ja`ad`j`y`y`j`yad`j`jad`y`j`jad`w`j`yad`yad`jada``j`wad`ja``ja``j`y`y`wae`y`y`{`r`y`w`{`w`{ar`j`yar`y`{`yar`y`{`y`w`{`y`{`{`yar`y`{`yar`y`{`y`j`{`w`{`y`{`{`yar`y`{`wae`w`{`{`y`r`y`y`{`jar`yae`y`y`y`j`{`w`y`{`y`jar`j`y`{`w`j`yad`ja``q`y`j`w`y`{`y`yar`j`y`{`{`w`j`{`yae`y`yar`j`{`yarak`q`{`y`w`{`j`y`y`{`w`y`y`j`y`w`{`y`j`w`j`y`y`j`y`wa``j`j`ya``jad`j`y`j`w`yae`y`q`yae`y`w`j`y`j`w`j`{`w`j`y`j`y`{`q`{`y`{`y`q`yae`w`j`y`j`y`j`y`jadadadaj`g`gajadagadadad`gadaj`gadadadad`wad`y`j`y`ja``j`j`s`j`y`p`j`j`y`q`j`y`j`y`j`w`j`y`q`{`j`w`j`w`j`y`y`y`j`w`jadad`j`p`yad`q`j`j`y`j`y`y`j`w`j`y`j`y`j`y`y`j`y`y`j`j`wadadag`gagadag`gaj`gag`gagag`g`i`gag`gag`g`i`gag`gad`j`j`y`y`jad`y`j`y`y`q`y`y`q`y`q`y`q`y`j`q`y`{`j`yar`j`y`j`{`w`j`y`y`j`y`j`j`{`j`y`y`j`w`j`q`y`y`qadad`jadadad`jadadad`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`y`w`j`{`y`{`j`y`y`j`j`{`j`yae`y`q`y`j`{`j`y`q`y`j`y`j`y`padadadadadad`j`j`y`y`j`y`j`y`j`w`j`y`y`j`w`y`jadad`j`j`y`q`yae`w`{`j`y`y`q`{`j`w`yae`j`y`j`{`q`y`j`j`j`y`j`j`y`j`j`y`y`j`j`y`j`j`q`{`y`j`j`y`j`j`j`y`j`j`{`y`q`y`j`{`j`y`y`j`j`y`j`yae`y`y`j`y`y`j`y`j`ja``j`jadad`j`yad`y`j`ja``j`j`w`{`y`{`j`y`j`{`j`y`j`y`j`y`j`y`y`j`y`j`y`j`y`y`j`j`y`j`a`a`a`a", +"atatatat`y`{`{`j`{`y`j`{`{`{`j`{`wae`wae`{`y`{`j`w`y`j`{`y`j`j`y`ja``j`y`j`j`j`w`jad`ja``jad`ja`a``j`yad`yad`jad`j`jad`jadada``j`jada``j`q`y`j`j`q`y`y`j`w`j`y`y`{`yae`y`y`j`{`w`{`j`{`{`y`r`{`yae`y`r`y`{ae`yar`{ae`w`yarae`y`{aear`y`{`r`yae`{`y`{`y`{`q`{`y`{`jar`y`{`jar`y`j`{`jar`j`{ae`w`j`y`{`q`y`j`yad`y`jadad`yae`y`y`r`y`q`y`{`y`r`y`{`{`w`{`y`j`w`{`y`j`w`{`ja``dar`{`j`{`w`{`q`j`{`q`{`y`j`y`r`y`y`j`w`{`q`yae`y`w`j`w`j`qada`ad`j`jada``j`y`y`wae`y`jar`j`y`y`jar`y`y`r`yad`{`j`w`j`yae`y`w`j`y`q`y`r`ya``j`jadadad`gaj`gadad`gadaj`gad`gagadadadad`j`jad`j`p`j`q`y`j`y`jad`{ada``q`y`j`s`j`j`q`y`j`y`p`y`j`j`y`y`j`w`j`{`j`y`w`ja``p`jad`ja`adad`q`j`w`j`w`j`j`y`w`j`w`j`y`q`y`j`w`ja``{`j`wadadad`g`gag`g`gaj`gag`magac`h`iag`hag`gag`g`gadad`j`w`j`y`y`y`r`y`j`y`j`{`j`yae`y`w`j`y`j`y`q`y`y`j`{`w`y`j`{`yarae`y`w`{`j`y`w`j`y`j`y`y`j`p`y`ja`adadad`jadad`qad`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`y`j`y`j`{`q`yae`y`y`q`y`{`y`q`{`y`j`y`y`j`yae`y`j`w`y`j`y`w`jadadadadadad`j`y`j`y`j`w`j`y`j`w`j`y`j`y`j`yad`j`j`j`y`y`j`y`yae`y`y`{ad`{`j`w`y`y`y`j`y`y`y`j`y`y`j`j`yad`j`j`y`jad`ja``j`j`yad`ja``y`j`y`ja``j`j`y`j`y`j`j`y`j`y`j`y`j`y`j`w`j`j`y`j`y`j`y`j`y`y`jad`yad`y`y`j`j`y`ja``j`y`j`y`j`y`j`y`y`{`j`y`{`j`j`y`yae`y`y`j`{`y`y`d`y`j`y`y`y`y`y`a`a`a`a", +"atatatat`{`{`jar`{`yar`{`r`y`{ar`{`{`y`{ar`y`{`w`{`j`y`{`q`y`y`q`y`w`j`j`wa``j`y`y`y`wad`y`j`y`p`y`j`ja``j`wada``j`ya``g`jadadadadadad`j`j`yad`y`j`y`w`{`j`y`w`{`j`w`{`yar`yar`j`y`{ar`jar`{`y`{`y`r`{`yar`{`w`{`{`y`y`{`{`y`{`y`w`{ae`y`y`{`w`yae`yar`j`y`yar`j`{`y`{`q`y`{`{`j`w`yae`y`w`{`y`yar`j`y`w`y`y`jad`j`y`p`y`y`q`y`{`{`y`{`y`r`y`yar`j`y`yae`w`{`yae`w`{`yar`y`w`{`y`y`q`{`{`y`{`y`j`y`{`q`{`y`{`w`yae`y`y`j`y`q`y`j`j`ya``j`yadadada``j`q`y`j`y`j`y`wae`y`y`jar`j`y`j`w`jar`y`w`j`y`y`j`w`y`j`y`q`y`y`j`y`q`j`p`gagaj`gadadadadad`gadadagad`gadaj`gadadad`qa`ad`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ad`jad`j`y`j`y`jae`y`y`q`j`y`y`j`y`j`j`w`j`y`y`qadadad`gaj`g`gag`g`i`magacac`i`gadadadadad`j`w`j`y`j`y`j`y`d`y`q`{`j`w`y`y`j`{`y`j`y`wae`y`j`y`jar`j`{`jar`j`y`wae`y`y`j`yae`w`j`y`j`q`y`y`j`j`jadadad`p`y`j`p`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`y`jar`yar`j`{`y`y`q`{`y`y`q`{ah`w`j`yae`w`j`y`w`j`yae`y`{`j`ya`adadadadad`jad`y`j`y`y`j`y`j`y`j`y`j`w`j`wadadada``j`y`j`y`pae`w`j`yae`y`w`j`{`j`y`q`j`y`j`j`w`y`j`y`y`j`y`ja`ad`y`ja``jad`yad`y`j`j`yad`jad`yadad`jad`jadad`jad`j`jad`j`ja``jad`y`j`j`j`y`j`y`jad`j`j`y`j`yadad`yad`j`y`j`y`j`y`j`y`j`y`j`j`y`y`j`y`y`j`y`j`y`j`{`j`y`j`j`y`j`j`yae`j`a`a`a`a", +"atatatat`{`y`{`yae`{`y`{`{`{`j`{arae`{`yae`y`{`j`{`y`{`j`{`{`w`j`j`y`y`yaear`y`r`y`j`{ar`j`y`j`y`q`y`j`jad`j`yadad`jada``jadadadadada`ad`j`w`j`y`j`y`j`{`y`j`{`q`{`j`q`{`j`y`{`{`j`w`{`y`yaear`y`y`j`{`j`y`{ae`w`{`r`{`q`{`jar`y`{`yar`j`{`y`{`w`{`j`{`{`j`{ar`j`w`y`{`{`j`w`{`y`jar`y`j`{`jar`j`y`{`j`y`q`ja`adad`j`y`jar`j`y`j`{`j`w`y`{`q`y`{ar`j`w`{`jar`yae`y`j`{`j`{`jar`j`{`yar`j`yae`y`w`j`{`y`jar`j`j`w`y`j`y`y`{`j`y`w`y`j`wae`y`p`y`j`padad`j`q`y`j`y`y`q`j`w`y`j`{`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}adad`pad`j`w`j`y`j`w`j`j`w`j`y`y`j`y`j`j`yad`yajadadagad`gadag`g`gagas`n`gagad`j`y`q`ja``y`q`j`w`y`q`y`j`y`j`{`j`w`j`w`j`y`j`y`j`yae`y`y`j`y`w`y`j`{`wae`y`y`r`y`w`j`y`j`y`w`y`j`j`w`y`ja``j`gadad`jad`y`j`w`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`{`j`y`j`y`{`y`q`{`j`yae`y`j`y`q`{`j`wae`y`{`yae`y`wae`y`q`y`jar`j`y`jadadad`gad`j`j`j`y`j`y`j`w`j`y`j`y`j`y`jad`jadad`j`y`y`y`j`y`y`w`j`{`y`yae`w`y`j`y`w`y`j`y`q`y`jad`y`j`j`y`j`y`j`y`j`j`y`j`j`yad`j`y`j`yad`ja`adad`ja``jad`ja``j`ja`ad`jad`ja``ja``jad`j`ja``yad`j`y`j`j`y`j`y`j`y`j`y`j`y`y`{`j`y`y`j`y`y`j`y`j`y`y`j`y`y`j`y`y`y`y`j`y`y`d`y`y`j`a`a`a`a", +"atatatat`yarae`yar`{`{ar`y`{`w`{`{`w`{`yar`yae`w`{ar`y`w`j`y`j`{`yar`{`jar`y`j`{`w`{`y`{`y`{`y`r`y`y`j`sad`yad`j`yad`y`q`ja`adad`jadadadadada``j`y`j`w`y`jar`yae`y`y`{`j`{`yar`j`w`{`{`j`{`w`{`{`jar`{`w`{`{`q`y`{`{`y`{`jar`y`{`{`w`j`y`{ar`y`{`jar`y`yar`{`y`{`{`{ar`j`w`y`{`jar`y`{`j`yar`y`j`y`yar`j`y`j`j`s`j`y`j`w`y`y`j`yar`y`yae`y`{`y`{ae`y`{`yar`y`j`{`w`y`w`{`y`w`{`y`yar`j`{`w`y`q`{`y`{`j`w`{`y`y`wae`{`w`j`y`q`y`y`j`y`q`y`y`y`p`y`ja``jada``j`w`j`j`y`y`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`q`yad`yadad`q`y`j`y`y`j`y`q`y`j`y`q`y`j`j`y`q`y`p`gadaj`gadadadag`gag`gagad`y`p`y`j`y`j`y`y`j`y`j`j`y`j`y`j`y`y`j`y`wae`y`j`w`{`y`wae`yar`j`yae`w`y`{`j`{`y`yae`y`w`{`q`yae`y`y`y`j`j`w`jadadad`jad`y`w`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`yar`y`j`w`j`y`y`j`y`j`y`j`y`j`y`j`y`y`q`y`j`j`w`j`y`y`j`y`j`y`j`j`yadadadadadada``ja``j`w`y`j`y`j`y`j`w`ja``j`yadadad`y`j`q`y`j`yae`y`j`{`j`y`y`j`{`w`j`y`j`y`y`jad`y`y`j`y`ja``j`y`j`y`j`w`y`y`ja``y`j`yad`y`j`j`yad`jad`yadad`ja`ad`j`yad`jad`yad`j`ja``ja``y`j`j`y`y`j`ja``j`y`j`y`j`y`j`y`j`y`j`y`j`y`y`j`y`j`y`j`y`d`y`jah`j`y`j`j`{`y`j`y`j`y`j`a`a`a`a", +"atatatat`{ae`y`{`{`j`{`yae`{`yarae`yae`y`{`{`yae`y`j`{`{`y`r`y`j`{`j`y`{`y`{`y`{`jar`yar`j`{`{`y`q`j`y`j`y`q`y`y`jadadadad`jadadadadadadad`j`y`j`j`y`j`qak`y`jar`y`yar`j`{`y`{`j`{`wae`{`yae`w`{`y`w`{`y`{`jar`{`wae`yar`{`jar`yae`{`yarae`yae`y`{`y`r`{`jar`yae`y`j`{`y`{`jar`y`y`{`jar`y`jae`y`wae`j`y`ja`adad`qad`{`y`r`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`{`q`yae`y`r`y`{`y`j`y`{`w`j`w`{`j`{`q`{`y`{`wae`y`w`j`y`q`y`{`j`y`j`j`yar`j`yad`q`jadad`j`w`j`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`pad`ja``jadad`j`pad`j`y`j`j`y`j`y`w`jad`y`j`yadadadadagadad`gagad`gag`gadad`y`j`w`j`j`w`y`y`q`{`j`w`j`{`q`{`j`{`y`wae`yae`yae`y`wae`y`y`r`yae`y`q`y`j`{`r`y`yae`y`y`{`j`q`y`y`j`j`yad`jadadad`y`j`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`j`j`y`y`j`j`w`j`y`j`w`y`j`y`q`y`j`y`y`j`j`y`y`j`y`j`q`y`j`y`j`w`y`y`w`jad`jadadad`jad`y`j`j`y`y`q`y`j`y`j`y`j`y`ja``j`j`y`y`j`w`j`w`{`y`j`{`j`j`y`j`j`yae`w`j`j`y`q`j`yad`y`j`y`j`y`y`j`y`j`y`jar`y`j`j`w`y`j`y`j`y`j`yad`jad`yad`jad`jad`ja``j`y`j`ja``j`j`j`y`j`yad`j`yad`j`yad`j`yad`j`y`j`y`j`y`y`yae`y`y`j`y`j`y`j`y`j`y`j`y`d`y`y`j`{`j`y`j`y`j`a`a`a`a", +"atatatat`yar`y`j`{`wae`{`{arae`y`{`yar`{`{`q`{ar`{`q`y`{`q`y`j`y`{`y`wae`y`q`{`{`w`{`j`{`yar`j`{`y`y`{`j`w`y`y`q`jad`y`pad`yada``jadadad`jadad`p`yad`y`j`yad`w`{`{`y`j`{`{`w`jar`yae`{`w`yar`{`{`y`{`j`{`{ar`y`j`{`yar`y`{`{`y`y`{ae`w`y`{`y`yar`jar`y`{`y`yar`j`{`w`{`jar`y`yae`w`j`y`jar`y`{`y`q`y`y`ja``j`jad`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`w`{`j`w`{`q`{`y`yae`{`w`{`yae`w`{`j`y`{`{`y`j`w`j`j`w`{`j`w`j`y`j`s`j`y`yad`w`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}adadadad`jad`y`p`ja``j`ja``q`y`j`y`j`j`w`y`jad`j`wadag`gagadag`gadadadadadadadad`j`j`w`{ae`y`j`y`y`y`j`w`y`yae`y`w`j`{`y`y`r`y`w`y`j`{`y`yae`w`y`y`{`w`{`j`yae`y`{`q`y`q`{`y`y`q`yad`wadadada``j`j`w`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`j`w`y`j`y`q`y`j`y`j`y`j`y`q`j`y`j`j`y`q`y`j`wae`y`q`y`y`j`y`y`w`j`y`j`{`j`w`yadadadada``j`j`y`q`y`j`y`y`j`y`q`y`j`y`jad`j`y`j`y`j`y`{`y`q`yar`j`w`y`{`y`q`y`j`y`w`j`y`j`y`j`y`j`y`j`y`j`y`j`y`y`{`j`y`y`j`{`ja``j`yad`yad`ja`adad`yadad`yad`y`j`ja``j`y`j`y`j`yad`yad`j`yad`j`y`j`y`j`y`j`y`y`j`y`j`yae`y`j`y`j`y`j`y`jah`j`yah`j`y`j`y`j`y`j`y`j`y`y`y`a`a`a`a", +"atatatat`y`{`{ar`y`{`y`{`w`{`yarae`{`yar`{`yae`y`{`y`j`{`yae`wae`j`{`w`{`{`y`r`y`{`y`{`j`{`yar`jar`j`{`y`j`j`ja``y`j`jad`j`j`j`padadadadadadad`j`yad`w`{`dad`y`jar`j`y`j`{`y`{`{`w`yae`y`{`jar`yar`j`{ar`yae`w`{`{ae`yar`y`r`y`{`j`{`{ar`j`{`w`yae`yar`yae`y`yar`y`j`w`j`{`y`{`j`y`yar`j`y`j`y`j`w`{`j`jadad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`{`q`yae`y`w`yae`y`r`y`y`jar`y`q`y`j`{`y`j`w`{`j`y`j`y`j`y`j`j`w`j`jad`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}adadadadadad`j`jadad`padad`qad`j`s`j`y`j`q`y`j`yadarad`gag`gagagadadadadad`jadadadad`j`j`y`q`y`q`j`y`j`{`j`y`wae`y`{`q`y`j`yae`yae`w`j`{`j`y`{`qae`y`j`{`wae`y`q`{`j`y`y`j`yae`y`j`y`j`jadad`j`y`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`y`j`y`j`y`j`j`y`q`jad`jad`jadadad`j`jad`j`y`j`y`j`j`y`q`y`j`y`j`w`j`y`j`y`j`w`jadadad`~ad`y`j`y`j`w`j`j`y`y`j`w`j`wad`yad`j`j`y`j`j`j`y`{`j`y`y`j`j`y`j`y`j`j`y`j`j`y`j`q`y`q`y`wae`y`w`j`y`j`w`j`{`q`y`y`r`y`j`y`y`j`jad`jad`jad`~ad`j`~adad`jad`yad`j`y`j`j`y`jad`j`y`y`j`y`j`yad`y`j`y`j`y`j`y`y`j`y`j`y`j`{`y`d`y`y`j`y`j`y`~`y`j`y`j`y`y`j`y`j`y`j`a`a`a`a", +"atatatat`y`{ae`y`{`{`{`jar`{ae`{`y`{ae`y`{`j`{`y`{ae`w`yae`w`y`{`y`y`j`{`jar`y`{`yae`w`{`yar`{`{`y`j`y`y`jar`y`y`q`j`y`yad`w`yadad`yadad`gadadad`y`j`y`j`y`r`y`y`j`w`y`yar`j`yar`yae`yarae`w`{`j`{`{ar`{`y`{`{ae`w`yar`{`j`{`{`w`{ar`y`j`y`{`{`y`jar`{`j`{`yar`yae`y`{`y`yae`w`j`{`yae`yar`yae`w`{`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`w`y`{`y`r`y`yae`w`y`yae`y`w`yae`y`{`w`j`w`{`y`j`w`y`j`y`q`yad`y`{ad`w`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`pad`gadaj`gadagadadad`jadadadadadad`j`s`j`y`jad`w`jadadaj`gag`hagadadad`j`padadadadad`y`jad`j`y`j`w`{`y`j`wae`y`y`y`j`j`{`w`y`j`w`y`{`j`w`y`j`{`y`jar`y`j`y`y`y`y`j`w`j`{`j`w`j`w`jadadada`ad`qad`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ae`y`w`jad`y`jad`yadadada`adadad`yadadad`yad`j`y`j`y`q`y`y`j`y`q`y`j`{`j`y`q`{`y`ja`adadad`ja``j`j`y`j`y`y`j`y`j`y`y`j`y`j`y`jad`y`y`q`y`y`q`y`j`{`q`{`y`w`y`w`j`y`q`y`y`j`y`y`y`j`{`y`y`j`y`j`y`j`{`j`y`yae`y`y`{`j`j`yad`yadadadadadadadadad`jada``j`y`j`y`y`j`y`y`j`y`y`j`y`j`y`y`y`j`y`y`j`j`y`y`j`y`y`y`j`y`y`j`y`y`j`y`jah`j`y`y`j`y`y`y`j`y`j`y`j`y`a`a`a`a", +"atatatat`w`y`{ae`w`{`j`w`y`{`q`{`w`{`j`{`wae`yae`y`{`jar`yae`w`y`r`y`{`yar`j`yar`j`y`{`r`y`{ar`yar`{`r`y`y`j`{ad`y`j`j`yad`j`ja``jadad`gad`gadad`y`j`q`y`y`{`j`w`{aear`y`{ar`j`y`{`y`{`{`w`{ae`w`y`{`jar`y`{`{`y`j`{`y`w`{`j`{`w`j`{`w`{`jar`y`{`y`{`w`{ae`y`jar`y`{`q`{`y`y`{ar`j`y`yae`y`j`w`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`{`j`yar`j`{`w`{`r`yae`y`q`y`q`{`y`j`yaea``j`y`q`y`y`j`q`y`j`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ad`j`gadag`gagagac`h`i`i`gadadajad`g`jajad`p`jad`j`jadad`gag`gag`g`gad`jad`jadad`yadadad`j`p`j`j`y`j`j`y`j`j`yae`q`y`y`j`j`j`{`y`j`{`y`jae`y`w`j`y`yae`y`wae`y`q`{`y`j`w`j`y`j`j`yad`jad`j`j`y`j`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`yad`j`j`pad`jad`jad`jad`j`jad`j`sad`jad`j`jadad`j`j`y`q`j`j`y`y`jar`y`w`j`{`y`j`q`y`jadadad`jad`y`j`y`j`j`y`y`j`j`y`y`jad`yad`j`y`j`yae`y`j`w`y`y`j`j`y`j`y`j`y`j`y`j`j`y`j`y`j`yae`q`y`yar`yae`y`y`{`j`y`j`y`j`y`j`y`j`jadadadadadadadadadadad`j`y`j`j`y`j`y`j`w`y`y`j`y`j`y`j`y`y`j`y`j`y`j`y`j`j`y`j`j`y`y`j`j`y`j`y`j`y`y`y`j`d`y`jah`j`yah`j`y`j`y`j`a`a`a`a", +"atatatat`y`{`r`y`{`jar`{`{`{`j`y`yae`y`w`{ae`y`w`{`w`j`y`{`j`y`{ae`y`wae`{`yae`y`{`{`w`{`{`y`{`j`{`j`y`y`j`y`y`j`w`j`y`q`y`y`j`p`y`jadadadadadad`j`qa``j`yae`y`j`y`w`j`y`j`{`j`{`yae`w`{ae`w`y`{aear`y`{`y`r`yar`y`{`r`{`{`{ar`{`{`yae`y`{`yar`j`{`j`y`jar`y`w`{`y`r`y`yae`y`{`j`y`wae`y`j`w`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`q`y`y`{`y`j`j`{`y`y`q`y`{`y`{ar`y`y`r`y`w`{`j`w`y`j`ya``j`w`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}a`ad`pad`g`g`n`gacacaaaaapaaaaac`i`iac`i`h`iadad`gaj`gag`gag`gadadadad`s`ja``y`q`j`j`s`ja``ja``jad`q`y`j`y`q`ya`ae`y`j`y`y`wae`y`w`j`y`w`y`j`w`{`j`{`w`j`yae`y`y`jar`y`{`j`y`j`y`jad`p`y`qa``j`w`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`ja``j`ja``jad`y`qa``j`p`yad`wadadad`ja`adadadad`y`j`y`y`j`y`y`j`y`y`j`y`j`yae`y`y`y`jadad`ja``j`j`y`j`j`y`j`j`y`y`j`w`y`y`j`jad`y`y`j`w`{ae`y`j`{`y`j`{`y`q`y`w`j`y`yae`w`y`j`w`y`y`{`j`yae`y`w`y`j`y`wae`w`{`y`j`y`y`ja``j`yadad`yad`ja``ja``j`y`y`j`y`q`y`j`y`j`{`j`y`y`q`y`{`jar`j`y`{`j`y`y`y`j`y`y`y`j`y`y`j`{`y`y`j`y`j`y`y`y`y`j`y`j`j`y`j`y`y`j`a`a`a`a", +"atatatat`{`y`{`y`w`{`j`y`{`j`{`q`y`{`j`yar`yae`y`j`{`w`j`{`q`y`j`{ae`w`{`q`{`y`{`r`y`{`{`q`{ar`y`yar`{ae`{`w`{`j`y`y`j`j`wad`ja``p`y`j`gaj`gadada``j`y`q`y`j`w`j`{`j`y`yar`y`w`j`{`yaear`y`{`yar`y`j`jar`y`{`{`{`w`y`{`y`w`{`j`yar`{ar`yae`{ar`y`{`q`y`yae`{`j`wae`y`w`j`y`q`y`{`{`y`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`w`j`{ara``{`q`{`y`yae`w`j`j`y`jar`yae`y`j`{`q`yae`w`j`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`qadad`jad`pad`n`g`gacacacaa`caaaaap`capaaapapaa`i`c`i`h`gad`p`y`j`y`j`j`wad`ja``j`jad`q`ja``jadad`j`p`y`jad`j`w`j`w`j`q`y`j`j`{`j`{`j`y`j`{`y`q`{`j`y`{`w`j`{`q`{`j`y`q`y`j`qa``jad`j`y`j`y`j`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`jadad`ja`ad`j`jadad`j`ja``j`j`y`qad`jadadadadad`yad`y`j`y`j`j`y`j`j`{`w`j`y`w`j`j`y`ja``j`gad`jad`y`y`j`w`j`y`j`j`y`jae`w`j`yadad`j`y`j`y`y`r`y`w`j`j`y`y`j`y`j`y`q`y`j`y`j`yar`j`j`yar`j`y`{`jae`yar`j`y`j`yae`w`j`y`jad`jadad`jad`j`y`j`j`y`jad`j`y`j`j`y`j`y`j`y`j`yar`j`y`{`j`yae`y`yar`j`{`j`yae`y`yae`y`y`j`y`j`yaeah`y`j`d`{`jah`j`y`j`y`j`j`y`j`y`a`a`a`a", +"atatatat`{`y`{`j`{`j`y`{`jar`j`{`y`jar`{`y`j`{`yar`j`{`y`q`{`y`jar`y`{`j`{`y`{`q`{`{`yae`yar`yae`{`yae`yar`y`{`j`{`y`j`w`y`j`y`jad`j`jadadadagadadad`j`y`j`y`j`y`{`y`{`q`yae`y`{`{`w`{`y`{`jar`yae`y`{`y`{`y`r`yae`{`y`r`yae`{`wae`y`{`{`w`{`y`{`jar`y`j`{`w`y`j`{`w`{`{`{`y`q`{`j`s`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`wae`yar`j`y`jar`j`y`y`{`j`y`y`y`j`w`yar`y`j`y`j`y`w`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ada``jadadad`j`j`sad`g`p`g`mag`m`nasacaa`baaapaaasacac`najadad`j`j`j`s`y`j`j`sad`j`wa``j`yad`w`j`y`y`j`j`s`j`y`j`ja``j`y`j`y`j`w`j`y`y`j`w`{`j`y`{`w`j`yae`y`j`y`j`y`q`y`j`ja`ad`jad`y`j`y`j`w`j`w`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`j`yad`yadad`p`jad`wad`yad`qa``ja``jadadad`jad`yad`j`j`wad`y`j`w`y`q`y`j`{`q`y`{`j`y`q`y`qadadad`yad`y`q`y`y`y`j`y`wae`w`y`y`j`ya``j`y`j`w`{`j`y`y`{`j`y`w`j`y`j`y`j`j`y`yae`y`y`j`y`{`j`y`{`j`y`y`j`y`{`j`w`{`j`y`{`j`y`ja``ja``jah`yad`ja``jadad`y`j`j`y`y`y`y`j`w`{`yae`y`{`jar`y`y`y`wae`y`{`y`j`y`{`j`{`y`j`{`y`j`{`y`y`j`y`y`j`y`y`y`j`y`y`d`y`jah`j`a`a`a`a", +"atatatat`{ae`w`{`yarae`y`w`{`y`j`{`yae`yar`{`j`y`{`q`y`y`{`jar`y`jar`y`y`r`yar`{`{`w`{`{`{`y`{`yar`{`{ae`yar`j`y`q`{`yae`y`y`j`yad`w`ja`adad`gag`gad`j`w`{`q`y`q`{`j`y`{ar`y`{`wae`y`w`{ae`y`yar`{`w`{aear`y`{`y`w`{`{`{`y`{`y`{`w`{`j`yae`wae`y`y`{`q`{`{`{`yar`yae`y`w`j`y`y`j`{`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`yae`yar`y`y`{`q`y`y`r`y`q`{`j`y`j`{`j`y`wae`y`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`s`j`qa``jad`jad`pad`j`y`pad`jad`p`g`ganac`mac`i`g`g`g`gadada``j`j`j`w`j`y`j`y`j`j`y`qad`y`j`j`wad`y`jad`y`j`wad`{`j`ja``q`j`yad`q`j`y`{`j`j`y`j`{`q`y`j`y`q`y`j`j`y`jadad`jad`jad`y`q`y`j`yad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`yad`jad`jadad`jad`y`jadad`j`j`jadad`jada``jadad`j`w`j`y`j`j`y`j`y`j`w`j`yae`y`q`y`y`j`y`j`yadadad`j`y`j`j`j`y`j`y`j`y`j`j`y`r`y`j`y`j`j`y`q`{`j`w`j`{`y`j`y`q`y`y`j`y`q`y`j`y`j`w`j`y`y`jar`yae`w`{`j`yae`y`y`q`y`w`{`j`y`jad`jad`yad`jad`yad`j`yad`j`y`j`j`j`y`y`j`j`y`j`y`j`y`j`jae`{`y`j`{`w`{`j`y`y`{`j`y`y`j`{`y`j`{`jah`j`y`y`jah`j`y`d`y`j`y`y`j`y`a`a`a`a", +"atatatat`j`w`{`j`{`j`yar`j`y`r`{`yar`j`y`j`{`jar`j`yae`y`q`{`y`j`{`j`y`r`{`y`{`yar`j`{`y`q`{`{`r`{`y`yar`j`y`y`r`y`y`{`j`y`q`y`q`y`y`jadadad`j`g`g`jad`j`y`j`y`j`y`j`{`w`j`{`q`{`yae`{`{`j`w`{`{`yae`w`{`{`y`{`r`{`{`j`{ar`y`{`q`yae`{`w`y`{`{`y`q`{ae`y`y`{`q`y`j`{`q`{`yae`w`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`w`yae`j`w`j`j`{`w`j`{`y`y`j`w`y`j`w`y`j`{`w`y`w`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`wad`j`y`ja``p`yad`y`j`p`y`jad`sad`j`j`y`yad`j`p`g`gadad`j`p`yad`q`ja``j`j`y`j`y`j`w`yad`j`wad`y`q`y`j`j`y`w`y`j`y`j`y`p`y`y`j`j`y`y`j`y`j`j`q`y`j`j`y`j`y`ja``jadadadad`j`pa``j`w`y`j`y`j`w`j`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`y`j`qa`ad`jada``jadadad`jadadad`jadadadadad`qada``j`y`j`y`j`y`y`q`y`j`yae`y`y`y`j`j`w`j`y`jadadada``j`ja``j`y`j`y`y`q`{`y`w`y`j`y`y`j`y`j`y`j`y`yae`y`q`y`j`a`y`j`w`j`y`y`jar`y`j`y`{`j`j`y`y`yae`y`y`r`y`y`j`yae`y`j`y`j`y`jad`yad`j`y`y`j`jad`y`j`y`j`y`j`y`j`j`y`y`j`{`y`y`j`yar`y`j`{`y`j`{`j`y`{`w`{`j`y`y`{`j`y`{`j`y`y`y`{`d`y`y`j`y`y`j`y`y`j`y`j`a`a`a`a", +"atatatat`yae`y`{`j`y`j`{`y`{`j`{`y`jar`{`w`j`{`y`y`yae`y`y`r`y`{`w`d`y`yae`w`j`{`{`y`q`{`{`y`y`{`q`{`y`{`{`w`{`j`y`q`yar`y`yae`y`j`w`ja``p`jad`iadadadad`w`{`y`w`{`j`{`y`y`y`y`wae`w`{`w`{`{`q`{ae`y`{`wae`y`y`{`y`w`{ad`{ar`y`{`w`{`y`{`w`{`j`{`y`w`yae`w`j`yar`yae`y`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`y`y`j`y`w`j`y`y`q`y`{`j`{`w`{ae`y`y`jae`y`w`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`j`w`j`j`y`j`q`yad`j`j`p`y`j`yad`y`p`j`s`j`y`jadadadadad`j`pa``yad`qa``j`qa``j`qad`j`y`j`j`s`j`j`y`y`q`j`j`y`q`y`q`y`j`j`y`q`y`j`w`jad`sad`jada``pad`j`j`jadadad`jada``j`y`ja``j`y`y`j`yad`yad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`y`ja``jadad`jadadad`wadad`yad`pada`ad`jada``j`y`qa``j`y`q`y`j`y`j`y`w`j`y`r`y`{`w`y`j`y`q`y`p`jad`ja``j`j`w`j`y`j`y`j`r`yae`yar`j`y`q`j`y`j`y`j`w`y`j`{`w`jar`j`y`j`y`j`j`y`j`y`j`j`y`yae`y`j`y`j`{`y`yae`w`y`j`y`{`y`j`w`j`yad`ja``jad`yad`y`ja``j`j`yad`y`y`y`j`y`j`y`j`{`j`y`yae`y`y`q`y`y`j`{`j`yae`y`yae`y`j`y`j`y`y`j`y`j`y`j`y`d`y`j`y`j`{`y`j`y`y`a`a`a`a", +"atatatatae`y`wae`yar`j`{`y`q`y`{`y`r`y`y`j`y`{`w`j`{`y`q`y`j`y`{`j`{`w`{`w`{`j`w`{ae`y`{`{`w`{`j`{`yarae`y`{ar`j`y`{`j`j`j`y`j`ya``j`w`j`yad`j`g`gagadad`y`j`j`{`y`j`w`y`r`{`q`{`{`j`{`yae`{`y`{ar`y`{`{`yar`{`r`{`y`{`jar`y`{ae`y`y`r`{`q`yae`w`y`{`r`y`y`r`y`j`{`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`q`y`jar`y`{`j`wae`y`{`q`{`wae`y`q`y`w`j`{`w`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`y`q`y`j`yad`q`y`jad`y`ja``jad`y`q`y`j`y`j`w`j`y`pad`y`pad`j`y`yae`y`j`y`j`yad`q`y`jadadada``j`j`ja``j`jad`j`j`jadad`j`q`y`j`y`j`s`j`j`y`j`y`j`y`p`jadad`jadada``jada``j`y`j`y`qae`y`j`y`j`p`jad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`ja``j`j`y`j`jad`y`p`jadad`jad`w`ja``j`y`j`w`j`y`j`y`j`y`y`j`y`{`j`w`{`j`{`y`y`j`{`j`{`j`y`j`yad`yadadad`y`j`yad`j`y`j`y`y`j`y`j`{`y`j`y`j`w`j`y`j`y`j`y`y`y`j`y`y`j`y`j`w`j`j`y`y`j`y`yar`j`yar`j`y`w`j`{`r`y`y`{ae`w`jar`y`j`y`ja``j`j`y`j`y`jad`y`jad`y`j`y`j`j`y`j`j`y`{`j`y`yae`w`j`{`y`{`j`{`j`y`y`{`j`y`y`j`y`{`y`y`j`y`jah`j`y`d`y`j`y`j`{`y`j`{`y`j`a`a`a`a", +"atatatat`j`y`y`y`j`y`jar`y`{`jar`j`y`{ae`w`{`y`j`y`j`{`{`w`{`j`w`{`j`{`j`{`j`{`y`w`y`{`yae`{`w`{`j`{`yar`j`{`y`{`w`y`y`{`y`q`{`j`w`y`j`y`j`y`jadad`gagad`yae`y`q`y`{`j`{`y`j`yar`jar`y`{`yae`w`{`jar`y`{`{`y`y`{`{`w`{`yae`w`{ar`y`{`{`y`y`{`{`y`r`{`y`y`wae`w`y`w`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`j`yae`y`y`q`y`y`y`j`{a``j`{`yar`y`j`{`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`q`y`y`q`y`q`y`j`yad`w`j`qa``j`q`jad`y`j`w`y`j`y`y`y`j`yad`jad`qad`y`j`w`y`q`y`j`y`j`yad`j`jada``j`q`yad`yada`adadadadad`jad`y`j`ja``w`j`w`j`y`j`y`j`yad`yad`j`sad`w`j`w`y`j`y`j`y`q`y`q`y`ja`ad`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`j`y`qa``qad`yad`j`y`y`y`ja``j`w`j`w`j`y`y`j`w`j`y`q`yae`y`w`j`y`j`yar`j`w`{`w`yae`w`y`j`yae`w`jadadadad`j`y`q`y`q`y`j`y`y`q`y`y`j`{`y`j`y`j`j`y`j`y`jar`j`y`j`w`j`j`y`y`j`w`j`y`j`j`y`yar`y`j`{`j`{`y`y`j`w`j`y`y`y`j`y`{`w`j`y`j`yad`ja``j`j`y`ja``ja``j`j`y`y`j`y`j`y`j`y`j`y`y`j`y`j`{`j`{`y`y`r`y`y`{`j`y`{`j`y`j`y`j`y`yae`y`y`jah`j`y`y`d`y`y`j`j`{`a`a`a`a", +"atatatat`j`y`j`j`{`wae`y`{`j`y`{`j`y`r`y`y`j`{`j`{`{`r`y`yae`{`y`j`y`{`jar`y`{`wae`{`{`jar`{`y`jar`j`w`{`y`j`{`wae`yae`y`r`y`j`y`y`yae`y`y`q`yadadad`g`gajad`w`y`j`{`y`q`y`{ar`y`{`y`yar`jar`yae`{`y`w`j`{`q`{`{`q`{`j`{`w`{`j`{`j`y`y`r`{`wae`q`y`y`y`q`yae`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`w`j`w`j`w`j`{`q`j`w`{`q`{`wae`y`q`{`j`w`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`j`j`y`j`y`j`j`w`j`y`j`y`j`ja``ja``j`w`y`j`y`j`y`j`q`y`j`qa`adad`j`q`{`j`y`q`y`y`j`w`{`y`w`y`w`ja``jad`p`j`y`p`jadadad`jadadad`j`j`y`j`y`j`w`j`y`w`j`y`j`w`j`j`y`j`j`y`j`w`j`j`y`j`y`j`y`j`j`y`p`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`q`y`j`y`j`y`ja``j`yad`j`y`j`w`j`y`j`y`y`j`j`y`yae`y`j`{`j`w`j`y`q`yar`y`j`y`{`j`j`w`{`j`yar`y`j`y`j`yadadad`j`y`j`y`j`y`j`w`j`y`q`{`y`q`y`{`q`y`j`y`q`y`j`y`jar`y`y`y`j`y`j`y`j`y`j`y`{`j`j`{`q`y`{`j`y`j`{`y`{`jaear`y`r`y`j`y`j`j`y`jad`y`j`y`j`yad`j`j`y`j`~`y`j`j`y`y`j`y`y`{`y`q`y`y`j`{`y`wae`y`yae`j`y`j`y`j`yae`y`j`{`j`yah`j`y`j`yah`y`j`y`y`j`{`y`a`a`a`a", +"atatatatae`y`yae`y`y`{`q`{`y`r`y`y`y`{`j`w`y`j`w`y`j`y`q`{`y`{`q`{`y`{`y`q`{`j`y`{`j`w`{`y`w`{`j`{`y`r`y`{`wae`y`y`q`{`y`yar`{aear`y`q`{`y`j`w`yad`qad`g`iad`{`j`w`j`{`y`q`{`j`yar`{`y`{`{`{`y`q`{`{`y`{`y`{`wae`y`yar`{`yar`yar`{`yae`y`y`{`y`{`y`r`{`y`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ar`j`y`y`y`j`{`yae`y`y`j`{`y`yar`j`y`q`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`q`y`j`y`{`ja``w`{`j`j`s`j`yad`q`y`j`y`jar`j`w`{`j`y`y`r`y`y`j`yadadad`y`y`j`{`j`w`j`{`j`y`j`j`{`q`y`y`j`y`w`j`ja``yadadad`yad`j`p`y`j`j`y`j`y`q`y`j`j`y`y`jad`y`q`y`j`j`y`j`w`y`q`j`ja``jadad`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`y`y`j`y`q`y`j`y`w`j`y`q`y`j`y`y`j`y`j`w`y`j`w`{`q`y`y`yae`y`y`y`j`y`j`{`j`{`y`j`{`y`j`{`j`y`j`y`y`j`j`j`sad`ja``j`y`j`y`j`y`j`y`y`q`y`y`j`y`y`w`j`j`y`j`y`w`j`y`j`{`j`y`wae`y`q`y`j`y`w`j`y`j`y`j`{`w`y`j`{`y`j`w`y`j`{`y`w`{`j`y`y`y`j`yad`j`ja``j`y`ja``j`j`y`y`y`j`y`j`yae`y`yae`{`y`q`y`y`j`y`j`y`j`y`y`{`y`j`y`y`y`j`y`y`d`y`j`y`y`j`y`jah`j`y`j`yae`y`a`a`a`a", +"atatatatar`y`ja``qae`y`j`{`j`y`yae`j`wae`yae`wae`y`{`j`{`y`{`{`j`y`yae`r`y`{`y`yae`y`{`j`yae`j`y`y`{`yar`yae`y`y`r`y`yae`y`j`j`w`y`j`{`w`j`{`j`{ad`j`yad`gag`j`j`y`{`q`{`y`{`j`{`yae`y`{`q`{`q`{`y`{`y`r`{`w`j`{`y`{`w`j`{`jar`y`jar`yar`y`y`r`yae`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`w`{`jar`y`j`w`{`j`w`j`y`q`y`j`y`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`y`y`w`j`y`w`j`y`j`y`q`y`y`j`q`y`jad`w`j`y`q`y`j`w`j`{`w`j`{`y`wadadad`j`wae`y`q`y`y`y`j`q`j`y`q`y`{`j`j`y`j`ja``q`d`j`s`jad`qa`ad`jadad`qad`j`y`j`ja``j`qad`j`p`y`j`j`y`p`j`j`j`jad`y`w`j`pad`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`q`y`j`q`j`y`j`y`q`y`j`j`y`y`j`j`y`y`j`y`j`{`j`y`j`yae`yar`j`y`{`y`r`{`y`yar`y`jar`j`w`{`j`y`w`y`j`q`yad`w`jadadada``j`j`j`y`j`y`j`w`j`d`w`j`{`q`y`j`yad`j`j`j`y`j`y`j`yar`j`y`j`y`j`w`j`j`y`j`y`{`y`w`d`{`q`yae`wae`y`j`yar`j`j`y`{`q`y`j`j`d`yad`y`jad`jahad`y`j`j`j`y`j`y`y`j`y`y`j`y`j`{`yae`y`{`j`{`y`y`{`j`y`j`y`y`j`y`y`j`{`j`y`y`j`y`y`j`y`y`j`y`j`y`j`a`a`a`a", +"atatatat`{`j`y`j`{ad`y`{`jar`y`j`y`j`y`{`j`y`{`j`w`y`j`wae`w`{`j`y`w`y`{`j`y`r`yar`y`jar`y`{`w`yae`{`j`yae`w`{`y`j`yar`j`y`y`j`{`j`y`y`{`y`y`w`j`ja``q`y`p`g`iadad`y`yar`j`{`w`j`{`y`r`y`{`y`y`r`y`{`w`{ae`{`wae`y`{`yar`{`y`{`{`y`j`{ae`w`y`{`q`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`y`{`{`q`y`jar`y`yae`y`y`jar`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`y`j`j`y`q`yae`w`j`y`j`y`j`y`j`y`s`j`j`y`j`{`j`y`{`j`w`j`{`j`w`j`{`qadadad`j`y`y`j`y`j`y`y`y`y`j`y`q`{`w`y`j`y`yae`y`w`j`y`y`w`j`y`y`j`sad`jadadad`ja``jad`y`yad`y`j`s`j`y`y`ja``j`s`j`j`yad`y`w`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`y`y`j`y`y`j`y`j`y`w`y`j`w`yae`w`y`{`w`yar`y`{`yae`y`w`yae`y`q`{`y`j`{`j`{`j`y`j`{`y`y`r`y`j`y`y`j`w`j`y`y`jad`j`ja``j`y`j`y`j`y`j`{`j`y`w`j`y`{`q`y`ja``j`y`j`y`j`yae`y`yae`y`j`y`j`y`j`y`j`y`j`j`{`y`y`y`j`y`{`w`yae`y`j`{`w`j`y`y`y`j`yad`ja``j`yad`j`y`jad`yad`y`j`y`j`y`y`j`{`y`j`y`{`j`y`{`j`y`j`y`j`y`{`y`y`j`{`y`j`y`y`j`y`y`j`y`d`{`y`j`{`y`j`y`{`y`a`a`a`a", +"atatatatae`y`w`y`j`y`j`j`y`j`yae`y`j`y`j`w`y`y`j`j`y`{`j`y`j`{`j`w`yae`{`y`q`y`{`j`y`j`{`y`j`{`j`y`j`w`j`y`j`y`jar`j`y`y`j`q`y`j`w`y`wae`y`q`{`j`w`j`yad`jad`gagad`j`{`j`y`j`yar`yae`y`yae`wae`y`{ar`j`{`y`y`y`{ar`j`yar`yae`yarae`w`{`w`{`j`{`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`q`j`y`y`{`j`y`j`w`j`y`q`y`j`w`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`q`y`y`wae`y`y`q`y`j`y`y`q`yar`j`w`j`y`jad`y`y`q`y`j`w`j`y`y`q`y`{`j`y`y`pad`j`y`r`y`j`yar`j`j`y`r`y`y`y`j`y`jar`y`j`w`y`j`w`jae`y`q`j`y`j`yadadadad`gadajadadad`j`q`y`j`y`j`w`j`j`wad`j`j`s`j`j`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`y`q`y`j`y`j`j`w`{`yae`w`yae`y`y`j`{`j`j`{`j`y`jar`y`j`yae`w`y`y`j`w`j`y`q`y`{ar`j`y`q`j`y`j`y`j`w`j`y`j`y`qadadadad`jad`y`j`y`j`w`{`j`w`yae`y`j`y`j`y`y`qadad`j`y`j`y`w`j`q`y`w`j`y`y`j`y`j`y`j`y`j`y`j`j`y`y`j`yae`w`j`y`y`j`{`yae`j`j`y`j`yad`jad`j`y`ja``jad`j`y`j`j`y`yae`y`y`j`y`y`j`j`y`j`yae`y`y`y`j`y`jae`y`y`j`{`y`j`y`j`y`{`j`y`y`j`y`j`y`j`y`y`j`a`a`a`a", +"atatatatae`yae`y`y`ja``j`jad`y`j`j`y`j`j`j`j`y`j`y`j`yae`y`w`j`{`j`y`j`w`yae`j`w`{`j`y`q`{`j`w`y`{`j`y`yar`j`w`y`j`w`j`{`y`j`w`j`j`j`y`q`y`y`j`yad`j`j`yad`ja`ag`m`kad`j`yar`j`{`w`{`j`y`w`{`y`{`y`{`y`q`{ae`w`y`{`{`{`jar`y`y`{`jar`yae`w`y`y`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`q`{a``r`y`j`w`{`y`j`y`q`y`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`{`q`y`y`j`{`j`y`j`y`j`{`j`w`{`j`{`y`y`j`{`y`j`w`j`y`j`y`y`y`{ar`j`{`yae`w`yae`yadadad`y`y`j`w`j`{`y`y`j`{`j`w`j`{`j`y`j`y`yae`y`q`y`y`j`y`j`w`j`y`y`{`j`padadag`hagadadadad`jad`y`j`ja``jad`ja``y`j`y`q`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ae`y`j`y`y`w`j`{`y`j`j`{`y`jar`j`{`y`j`y`w`j`y`q`y`j`{`j`y`yae`y`y`{`yar`j`{`y`q`{`y`y`{`j`w`yae`y`y`y`j`w`y`j`y`yadadad`ja``j`y`j`y`j`y`yae`w`y`{`q`y`w`j`y`y`p`j`j`y`j`y`y`y`{`j`{`y`q`y`y`j`w`j`y`y`j`{`j`y`j`y`y`yae`y`{`j`w`y`y`y`d`w`{`j`y`ja``ja``jad`j`y`yad`y`j`y`j`y`j`y`j`yae`y`y`y`y`y`{`j`y`j`{`y`y`y`j`{`y`j`y`y`yae`y`j`y`y`jah`j`y`j`y`y`j`y`y`a`a`a`a", +"atatatat`yae`y`y`j`yad`jadadad`jadad`y`jadad`y`j`y`j`y`j`y`j`y`j`y`j`w`j`y`j`y`y`yae`y`q`y`j`y`j`j`j`w`j`j`yad`y`j`{`y`j`jada``j`ja``j`jad`j`jadadadadad`wa``j`jad`mag`g`j`j`{`y`j`{`y`q`{`{`jar`y`{`q`y`{`{`j`{`{`w`jar`{`yae`yar`{`j`y`{`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`{`yae`w`y`jae`y`w`{`y`j`w`{`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`p`jad`ja``j`qa``j`ja``p`y`y`j`q`y`y`j`j`w`y`j`q`j`q`y`j`w`j`{`y`q`yae`y`j`w`j`yar`j`q`y`y`q`y`j`j`w`j`j`j`y`wae`yad`p`{`jar`yae`j`w`yae`w`y`j`{`p`y`jad`y`q`{`j`y`j`j`w`j`y`{`j`{`q`y`jar`y`j`w`j`j`y`yar`j`y`y`j`y`qaea``j`y`j`gag`h`nagagadadad`q`yad`y`p`ja``j`j`jad`j`jad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`j`p`yae`j`y`q`y`q`y`y`q`y`j`y`y`j`w`j`y`yae`y`y`r`y`j`y`r`y`y`q`j`{`j`{`j`y`j`y`r`y`q`y`j`y`q`y`j`w`j`{`j`y`j`j`y`jadadad`jad`j`y`r`y`j`yae`y`j`y`{`j`y`j`j`ya`ad`q`}`}`}`}`}`}`w`j`y`w`j`j`y`j`j`w`j`y`j`y`j`j`y`j`j`y`j`y`j`{`j`{`j`y`y`j`y`j`yad`jadad`y`jad`y`jad`y`j`y`j`y`yae`y`y`y`j`yae`j`y`y`j`y`j`y`j`{`y`y`j`y`j`{`jah`y`j`y`j`y`j`y`y`j`yae`y`j`a`a`a`a", +"atatatatadadadaj`jadadad`~ag`gadagadagadadadadajadad`j`y`j`y`j`y`j`yaead`w`y`j`j`y`j`j`yadad`ja``j`j`ja``j`jad`jadad`ja`adadadadajadadadadad`w`jad`wadad`ja``qad`y`y`gag`gad`j`j`y`j`{`y`q`{`j`y`j`{`y`jar`y`w`{`{`j`y`y`r`{`w`{`j`{`w`{ae`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`y`yar`y`j`wae`j`{`y`jar`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`j`w`ja``wadad`p`jad`j`w`j`y`p`j`jad`gag`nasag`hajadad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`yad`s`jad`yad`j`y`q`y`j`y`qa``j`y`w`y`j`y`j`y`y`y`j`w`j`y`j`y`y`{`q`y`j`yae`y`y`y`j`y`w`j`y`y`y`y`j`y`w`j`y`j`w`j`y`y`j`y`j`y`w`j`y`j`y`{`w`y`j`y`wadadad`y`j`w`{`y`{`y`w`j`w`y`yae`w`y`j`w`y`j`y`w`j`y`j`y`j`wae`y`y`wae`w`y`jadad`gag`g`gagad`g`jad`w`j`y`jad`yadadadadadad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ad`y`j`y`j`yar`j`y`j`y`j`{`y`w`y`r`y`{`{`wae`y`w`j`y`j`y`w`j`yae`y`y`w`y`y`j`w`y`y`j`{`j`y`{`j`y`j`w`y`j`y`q`y`j`y`ja``jada`adad`ja`ad`j`y`y`q`y`y`j`yae`y`y`j`y`j`}`}`}`}`}`}`}`}`}`}`}`{`j`y`y`j`y`j`y`j`j`y`j`y`w`j`y`w`j`y`wae`y`y`j`y`{`j`y`y`y`j`{`ja``j`yad`ja``j`j`y`j`y`j`{`y`j`{`yae`y`y`y`j`y`{`y`j`{`y`y`j`y`{`y`y`{ad`{`y`y`j`y`y`d`y`j`y`y`j`y`y`j`a`a`a`a", +"atatatatadadadad`~ad`gajadad`hadad`i`g`hagag`~aga`adadadadad`j`j`y`y`j`jadadadadad`j`jadadadadadadadadad`gaj`g`gaj`gagadagaj`g`had`p`ya``j`y`j`y`w`y`y`y`j`y`y`{`y`q`yad`g`gagadad`y`j`w`y`y`j`y`yar`j`w`{`j`yae`y`{`yar`{`y`{`y`{`w`{`j`{`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`r`{`j`y`q`{`y`j`y`j`w`y`j`y`w`}`}`}`}`}`}`}`}`j`w`y`j`w`y`j`{`w`y`j`qadadadada``j`j`j`sadad`gag`gac`i`gadada``}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`p`y`jad`y`j`y`q`y`y`j`y`q`y`j`y`q`j`{`j`y`q`y`j`w`j`y`j`w`j`y`q`j`y`y`{`w`y`j`w`j`wae`y`j`y`r`y`q`{`w`j`y`j`w`y`j`y`p`j`q`y`wae`y`{`yae`q`y`jar`{`j`jadad`j`j`y`jar`j`j`j`{`j`y`jar`y`y`{`j`j`w`{`j`y`y`j`w`j`{`y`y`q`{`j`y`{`j`wadadaj`gad`gagadadad`jadadadadadadad`gagadag`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ad`j`w`j`y`w`y`j`yae`y`j`y`q`yae`y`{`j`j`y`q`yae`y`j`w`yae`w`j`w`yae`yae`q`y`{`j`{`wae`y`y`q`y`j`w`yae`y`q`y`j`y`y`q`y`j`y`jadadadad`j`j`y`j`y`j`q`{`j`w`y`j`w`j`y`}`}`}`}`}`}`}`}`}`}`}`}`j`{`j`{`y`q`y`y`j`w`y`j`j`j`{`j`y`y`j`j`y`y`jae`y`yae`y`j`y`j`y`y`jad`ja``j`jad`y`j`y`j`y`q`y`{`j`y`j`y`j`y`{`j`yae`y`yae`y`j`y`j`y`j`y`y`j`y`j`y`j`y`j`{`j`y`j`y`j`{`a`a`a`a", +"atatatatad`y`jad`jadad`gadadadadadadadadad`g`gag`gadadagad`gadag`gadagadadagadad`gadadagadadagad`gajad`gadadad`gaj`hag`gadad`y`j`yad`w`{`w`y`j`j`y`jar`j`y`q`yae`y`yaraea`adad`g`g`jad`j`j`wae`{`j`yae`y`w`{`y`q`yae`y`jae`y`q`{`yae`y`y`r`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`{`q`y`wae`w`j`y`{`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`{`j`y`wae`y`y`j`j`y`j`j`qad`gadadad`s`y`j`y`y`j`{`w`y`jae`y`qak`sadadadadadadad`j`jad`gagagasag`gadadad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ad`q`y`q`y`j`j`y`q`y`j`y`j`j`w`j`y`j`s`j`{`j`y`j`w`y`w`j`y`j`y`y`j`r`y`j`{`q`y`{`j`y`y`j`wae`y`j`y`j`w`y`r`yae`y`j`w`yad`j`y`j`yae`w`y`y`{`j`y`j`y`w`jadad`yae`y`y`jar`y`w`j`{`y`y`j`j`w`{`j`y`y`jar`j`w`j`y`y`j`r`y`y`y`j`y`j`y`j`yadad`gadad`gagadadadadadadadaj`gag`hag`gag`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ad`y`j`j`y`j`j`w`y`y`jar`y`{`j`w`{`j`w`y`{`j`w`y`j`y`{`y`j`y`{`y`q`y`{`y`jar`j`y`j`{`y`q`{`y`j`y`j`{`y`y`j`y`q`y`j`y`j`w`j`y`q`jadadadad`j`y`j`y`y`j`yae`y`y`j`w`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`y`j`j`yar`j`j`y`y`j`ya``j`j`y`y`j`y`j`w`j`y`j`y`{`j`y`yae`y`j`yad`j`yad`y`jad`y`j`y`j`y`j`y`yae`y`{`j`y`j`y`y`y`j`{`y`{`j`{`yae`y`j`j`y`y`j`y`y`y`d`y`y`j`y`j`y`j`a`a`a`a", +"atatatat`j`j`yad`yad`{`y`yadad`jadad`jad`jadadad`~ag`gadad`gajad`gadad`g`gagadad`gag`gadadadada`adad`pad`jadadadada`adadadadad`w`j`y`{`j`{`j`y`wae`y`{`q`{`y`{`w`{`wae`y`j`w`jadad`gajada`ad`j`w`y`{`w`y`j`{`q`y`{`j`{`w`{`q`y`yae`{`w`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`yar`j`{`w`y`j`{`y`{`y`{`y`{`{`q`yar`y`q`{`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`w`{`jar`y`y`j`y`j`w`y`w`jadadadadad`{`j`{`j`wae`w`yae`y`w`y`y`q`y`jadaj`gadadad`g`jadag`g`i`n`g`iadad`w`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`y`q`y`j`y`wad`y`j`r`y`j`w`y`y`jar`y`j`y`j`yar`j`j`y`j`y`j`y`j`j`y`j`w`j`y`{`j`yar`y`q`{`y`y`w`jar`y`j`y`j`y`yar`j`y`j`j`j`w`j`w`y`jae`w`j`w`j`w`y`jadad`j`w`y`w`j`y`y`j`{`y`q`{`j`{`y`j`y`j`w`j`y`j`y`{`j`{`w`j`y`jar`j`j`w`j`y`j`yadaj`~adagad`gadag`gadajad`g`gagad`gad`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ad`jada`ad`j`j`y`y`r`y`j`y`j`y`y`j`w`{`y`j`y`{`j`{`q`y`j`w`j`y`j`{`y`j`w`j`yar`y`j`y`q`{`j`y`{`q`y`y`q`yae`w`y`j`y`j`y`j`y`y`ja``ja`adadadad`j`y`j`y`j`y`q`yae`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`{`y`q`{`y`y`j`y`y`j`w`j`y`j`y`j`y`j`j`y`j`j`y`y`d`w`j`y`j`y`y`j`ja``jad`jad`y`jad`y`j`y`j`y`j`y`y`y`j`y`y`j`y`j`{`y`y`j`j`y`y`j`y`y`y`j`y`j`yah`j`j`y`j`y`j`y`y`y`a`a`a`a", +"atatatat`h`~ajad`j`y`jad`j`y`j`w`y`jadad`yad`p`jadad`jadadadadad`jadadadad`gadad`jadadadadad`jadad`ja`adadadadadad`jadadad`~`g`j`j`y`w`j`{`w`y`{`j`w`y`{ar`j`{ae`y`y`yae`y`yar`j`y`gaj`gajadad`j`j`j`{`y`q`y`{`j`y`j`y`y`w`j`y`wae`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`{`y`wae`y`{`j`{`{`w`j`{`q`{`j`w`j`y`{ae`y`{`j`wae`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ar`yae`w`{`j`yae`y`j`y`padagadad`y`q`y`y`j`y`j`w`j`{`j`y`{`y`w`y`jadad`paj`gadadadadag`gacag`gad`j`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`jadar`jad`w`j`{`y`j`y`y`q`y`j`q`{`j`j`w`y`q`j`y`y`r`y`w`j`j`w`j`y`y`yae`y`q`y`j`y`j`yae`y`q`j`{`j`yae`w`y`q`{`j`j`y`{`qa``y`j`y`j`{`j`y`y`{`w`{`j`y`j`yadad`j`j`y`j`y`q`y`j`y`j`{`q`y`y`j`{`q`y`y`yae`w`j`y`{`y`jar`y`y`j`y`y`j`y`q`yad`jad`gagadag`gag`~`g`gadadad`y`jad`gad`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}adad`j`ja``j`p`j`y`j`j`w`y`j`j`w`yae`j`{`w`j`y`y`j`y`j`{`y`q`{`y`j`w`y`j`y`j`y`r`y`y`y`q`{`q`y`y`j`y`j`y`y`j`j`yad`y`j`y`q`y`j`y`j`jada`adadadad`j`j`y`j`y`j`w`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`{ae`y`j`y`{`q`yae`y`j`y`j`y`q`j`y`j`y`j`y`j`j`j`y`y`j`y`ja``j`y`y`jada``jad`j`y`j`y`j`y`{`q`y`j`y`{`j`{`y`j`y`{`j`j`y`y`j`j`y`{`j`{`y`j`y`j`y`y`y`yae`y`j`yae`y`a`a`a`a", +"atatatatagacaaapaqabad`qad`j`y`j`yad`y`y`wad`j`y`y`ja`adadada`adada``jadad`ja``qada``j`y`pa`adad`y`q`y`jad`j`y`p`jadadadadaj`gad`j`wae`y`j`y`{`jar`y`{`j`y`{`y`{`w`y`r`y`w`{ae`y`y`wadadag`g`k`g`gad`j`ja``j`y`j`w`{ar`y`j`{`y`{`j`{`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`yar`y`wae`y`y`jar`yar`j`{`w`y`{`q`y`y`{`q`y`j`w`{`w`y`j`{`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`y`{`j`w`y`y`qa``j`j`gadadad`q`y`y`j`y`wae`{`w`y`{`w`jarae`y`j`w`yadad`gag`gadad`g`n`gag`gad`j`w`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`w`y`j`w`y`j`y`q`yae`s`j`y`j`y`y`j`w`y`j`{`y`w`j`j`y`j`y`q`y`{`q`{`q`y`w`j`y`{`j`w`j`w`j`y`y`y`j`w`y`y`j`y`yar`y`j`w`j`y`jad`j`y`{`j`w`y`q`yae`y`q`yad`qadad`w`{`j`wae`y`y`q`y`j`y`{`j`w`{`y`y`q`y`q`y`yae`{`j`w`j`{`j`w`j`y`w`j`j`wad`jadaj`gag`gaj`gagadad`jad`q`y`qad`yad`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}a`ad`jadad`jad`ja`ad`j`{`y`j`w`y`{`j`y`y`jae`w`y`{`jar`y`j`y`y`q`{`j`y`}`}`}`}`}`q`yae`y`j`y`{`j`y`{`j`w`j`y`q`y`wae`w`j`y`j`y`q`y`j`yad`jadadadadadad`y`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`w`j`{`j`y`y`j`y`j`w`j`j`y`y`j`w`y`j`y`j`y`j`y`j`y`j`y`y`j`y`j`y`y`j`jadad`yad`y`j`{`y`y`j`{`y`j`y`y`y`{`y`j`y`y`y`j`y`j`y`y`j`y`y`{`j`y`j`y`j`j`y`j`y`j`y`j`a`a`a`a", +"atatatatad`g`nacap`t`zap`h`iad`had`j`j`j`y`jadad`jad`y`j`y`j`j`y`qad`y`ja`ad`j`y`j`jad`yad`q`y`j`yad`j`y`p`yaea`ad`j`wadadadadad`y`j`y`wae`y`y`{`j`{`w`{`r`j`yarae`y`y`rad`y`j`y`j`jar`yad`g`nacaaaaaq`iadaj`w`jad`j`j`y`j`{`q`y`r`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`wae`yae`yar`jar`yae`{`y`yae`{`yar`{`j`w`{`j`w`{ae`y`{`y`r`y`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`wae`y`j`{`j`yadadadagad`y`j`q`y`w`j`{`q`yae`y`j`y`j`y`q`y`{`j`s`jad`qadadadadadag`gagagad`yad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ae`y`j`y`j`q`y`j`y`y`j`j`w`j`q`y`q`y`j`{`w`j`{`j`w`j`w`y`j`y`j`y`j`y`j`y`jar`j`y`j`y`y`jar`j`w`j`{`j`q`y`y`r`y`j`y`y`jar`ja``qad`q`j`yae`y`{`w`j`y`{`j`ya`adad`j`y`y`j`y`r`y`{`w`{`q`y`{`j`q`{`yae`w`yae`w`jar`y`j`y`j`y`j`y`j`y`j`j`yadadad`gagadad`gaj`gadad`y`j`y`j`j`wad`p`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ad`wad`ja`ad`jad`jadad`j`j`j`y`j`w`j`y`w`j`y`j`y`q`y`y`jar`j`y`j`}`}`}`}`}`}`}`}`}`}`y`j`y`y`j`q`y`y`j`{`y`{`j`j`y`y`j`j`y`q`y`ja``j`j`y`j`jadadadadadad`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`j`y`q`y`j`y`j`y`j`y`w`j`y`j`y`j`y`j`yad`y`j`j`y`j`w`j`y`j`y`j`y`ja`adadad`jadad`j`y`j`y`y`j`{`j`{`yae`y`y`{`j`y`{`j`y`y`j`y`j`y`j`y`y`y`j`y`y`yae`y`j`y`j`y`a`a`a`a", +"atatatatad`j`g`g`naa`tapac`hadad`y`j`p`yad`q`y`j`y`j`y`p`y`qa``j`jad`y`jarad`y`j`q`y`y`p`j`y`j`y`ja``j`yad`ja``j`yad`yad`y`y`y`w`y`{`y`y`j`w`y`q`yar`y`j`{`yar`{`y`y`q`{`y`y`wae`y`w`j`j`y`wad`uacapapapaaaaaq`iad`jad`jad`jadad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ae`y`y`{`j`{`w`yae`y`w`y`j`{`w`{`j`w`y`jar`y`{`y`{`y`y`j`y`w`{`j`y`r`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`{`y`w`j`y`j`w`y`paj`gadad`j`y`y`{`j`w`y`j`y`{`w`j`w`{`y`y`q`y`j`y`j`yadadadadadadadag`g`gad`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`w`j`y`q`y`j`j`w`j`y`q`y`y`{`j`y`{`j`y`j`{`w`j`y`j`y`j`y`j`y`y`q`y`y`q`y`j`y`{`q`y`j`w`j`y`y`{`j`w`y`y`j`{`j`y`j`w`j`y`y`wadadad`y`q`y`y`q`j`yar`j`y`q`jadad`j`y`r`y`yae`y`q`y`j`y`yae`y`y`{`j`w`{`j`{`y`y`y`j`{`w`j`y`w`j`w`jad`yadadadadag`gad`gadadadadad`j`y`j`j`s`j`y`jad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`ya``j`y`jadadada`adad`y`sad`j`j`y`j`y`j`y`j`w`y`j`y`r`y`j`y`y`}`}`}`}`}`}`}`}`}`}`}`}`j`y`jar`j`y`j`w`j`y`q`j`w`y`j`y`j`y`y`j`y`y`q`y`w`y`j`y`yadadadad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}a``j`j`y`yae`w`y`w`yae`y`y`j`{`w`y`j`yad`yad`y`j`y`j`y`j`y`j`y`j`y`j`yad`ja`ad`j`y`y`j`y`j`{`j`y`w`{`yae`w`j`{`j`y`y`j`{`yae`y`y`j`y`j`y`d`y`j`j`y`y`j`y`y`y`a`a`a`a", +"atatatata`ad`jad`g`g`m`g`gaj`~`y`j`{`y`j`y`{`y`y`j`y`j`y`j`y`y`w`j`w`j`y`jad`y`yadad`j`jad`y`qad`q`yad`ja``q`y`ja``q`{`j`w`{ae`y`r`y`{`j`{`y`j`y`r`y`{ar`j`y`j`wae`y`y`j`w`j`y`y`j`y`{`w`j`j`{`y`g`nas`bapap`tapap`c`i`gaj`gad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`{`wae`w`y`jar`j`y`j`w`{`jar`j`yae`{`y`{`{`j`wae`q`{`w`j`{`y`jar`y`y`{`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`y`y`j`y`j`jadadag`gad`y`q`{`j`y`j`w`{`q`{`j`y`jar`j`y`yae`w`y`jadad`pad`padad`g`i`gajada``}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`y`q`y`y`j`y`{`j`wae`y`j`w`j`w`j`q`y`q`y`j`j`y`q`y`j`y`qae`w`yae`j`y`jar`y`q`yae`w`y`j`j`w`j`j`j`y`j`q`yadar`j`y`w`j`j`j`y`jadadad`j`q`y`{`j`y`y`q`y`j`padad`q`y`j`y`y`q`{`j`{`w`jar`y`q`yae`y`j`y`{`q`y`r`{`y`j`{`j`j`y`j`j`yadad`jadadadadagadadad`gadadadad`j`yad`y`j`ja``q`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`q`j`pad`qadad`q`jad`jad`ja``p`j`y`j`y`j`y`j`y`j`y`y`jar`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`y`y`j`y`y`j`q`y`yae`j`y`j`j`y`j`y`j`w`j`y`j`j`y`j`j`w`jadad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`jad`j`y`j`y`j`j`y`j`wae`y`q`yae`y`q`y`j`yae`y`j`j`y`j`y`j`y`jah`j`y`j`yadadadad`j`y`j`{`y`w`j`j`yae`y`y`y`y`j`{ad`y`j`y`y`j`{`y`j`y`j`y`j`y`y`j`y`y`{`j`{`j`a`a`a`a", +"atatatat`y`y`jad`j`yagagad`i`gadadae`{`{`wae`y`{`r`y`w`y`{`r`{`{`{`j`y`{`y`{`w`{`j`w`y`j`y`w`j`{a``j`w`j`y`yae`s`j`{`q`{`y`{`j`w`y`{`jar`y`{`q`y`{`{`wae`y`{`w`{`{ae`yar`{`{`yaear`{`w`j`{`w`yae`w`{`w```o`macacaaapapac`had`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`{`y`j`w`{`{`j`w`y`{`w`{`{`j`y`{`y`w`{`y`q`y`q`{`y`y`w`j`y`{`jar`y`{`j`y`j`y`q`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`w`j`j`qa`adag`gad`j`ja``q`y`q`y`y`j`{`j`yar`{`y`j`w`{`w`j`y`q`y`w`jadadadadadadag`gad`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`w`j`y`j`w`y`q`j`y`j`y`q`yae`y`j`y`j`y`y`j`yar`y`j`{`q`y`y`j`y`j`y`w`j`y`j`y`y`j`y`j`yae`y`y`y`w`j`y`j`y`w`j`y`j`y`jarad`y`j`wadadad`y`j`{`j`y`wae`y`y`jadad`y`yae`y`j`y`j`y`sae`y`y`{`j`yar`y`q`y`q`yae`y`y`j`y`j`y`j`p`y`jadad`y`p`jadadadadadadadadadagad`p`y`j`w`j`y`w`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`j`y`{`y`y`j`yad`jadadadadad`y`j`jad`j`y`j`y`j`w`j`j`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`j`y`q`y`q`y`y`j`y`j`w`y`j`w`y`j`j`y`y`y`j`w`y`j`y`y`j`{`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`yadad`jad`j`y`j`{`j`y`y`{`y`y`j`y`j`y`j`y`y`j`yad`y`jad`y`j`j`y`j`y`ja``jadad`jad`j`y`j`yae`y`{`y`y`j`{`yae`y`j`y`y`j`y`j`{`j`y`y`j`y`y`y`j`y`yae`y`j`y`j`y`a`a`a`a", +"atatatat`j`yadadad`jad`gad`gad`gadadad`y`{`jar`y`yae`y`y`{`j`w`y`{`y`q`y`j`{`y`jar`y`w`j`j`y`y`j`w`y`j`y`yar`yae`y`y`j`y`{`j`{`j`{`{`y`j`w`{`j`y`q`{`j`yarae`y`w`{`j`y`j`w`{`y`j`y`yae`w`j`{`w`{`y`j`{`{`y`wad`g`macac`cad`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`{`q`{`y`{`j`j`y`{ae`yae`yar`y`jar`j`{`yae`y`{`j`yae`w`j`{`w`j`wae`{`w`jar`yar`j`{`wae`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`w`ja``qad`gagad`g`j`j`y`j`y`q`yae`w`yae`j`w`{`j`y`j`y`j`y`yaead`y`jadad`p`yadai`gadad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`r`y`yae`y`q`y`j`y`jad`y`y`q`y`y`w`j`y`q`y`j`y`j`w`{`j`y`q`y`q`y`yae`yad`q`{`w`j`{`j`w`j`y`q`yae`y`q`y`j`j`y`y`j`y`j`j`y`j`w`jadadadaj`p`y`j`w`j`j`y`j`qa``jad`q`j`yar`yae`y`{`j`{`j`w`jae`y`j`{`y`j`yae`w`j`{`q`j`y`j`qad`j`w`jad`jad`jad`y`jadadadaj`gadadadadad`j`y`j`j`y`q`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`q`y`jar`jad`y`jadadadadadadadadadadadadadad`j`jad`j`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`q`j`y`j`j`j`y`q`j`y`j`j`j`y`j`y`j`j`y`j`y`j`w`{`j`y`q`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`ja`ad`jadad`j`j`y`j`w`j`j`y`w`j`y`w`j`y`j`y`j`w`ja``j`j`y`j`jad`y`j`j`y`ja`adad`y`j`y`{`j`y`j`{`j`w`j`y`y`j`{`j`y`w`{`j`y`y`j`y`j`y`j`y`j`y`j`yae`y`j`y`j`a`a`a`a", +"atatatata``jad`y`ja``j`ja`adaj`~agad`iadad`j`j`y`jar`{`y`j`{`{`j`r`y`{`y`{`j`yar`y`j`{`j`w`y`yar`{`j`{`{`j`{`j`jar`y`{`r`yar`{`y`{`waear`yae`y`w`{`{`yar`yae`yar`y`q`{`w`{`j`j`w`{`jar`y`{`j`y`jae`yar`j`y`{ar`y`p`g`g`m`i`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`{`q`y`j`{`q`yar`{`j`w`y`{`w`yae`y`yae`y`{`q`{`y`w`{ar`y`y`{`y`j`{`y`y`j`{`y`j`yae`y`y`{`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`w`y`jadadadagad`gad`j`yad`w`j`y`{`j`w`{`y`w`{`j`{`w`j`y`q`y`j`w`j`yadadadadadad`gadagad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`y`j`y`q`y`j`{`ja``q`{`j`y`jar`j`yar`j`yar`jar`y`j`y`w`yae`y`y`j`w`j`w`{`j`y`y`q`y`y`q`{`j`y`w`j`y`y`j`y`w`y`j`y`q`y`j`w`y`j`y`pad`gadad`j`y`j`w`y`j`y`jadadad`y`y`j`y`{`w`j`w`yae`w`j`{`y`w`y`j`y`y`q`y`j`y`j`yad`wad`j`yad`yad`y`j`ya``jadad`qadadadadadadad`y`j`q`y`w`j`y`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`jar`y`j`y`q`yad`yadadadadad`padadadadadadada`adad`pad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`y`j`ya``j`yad`yad`ja``j`y`y`j`j`y`y`j`y`j`y`j`y`j`y`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`j`yadadad`yadadad`{`j`{`w`{`j`y`y`j`y`j`y`y`j`y`y`j`y`yada``j`y`j`y`ja``jad`yad`j`y`j`w`{`y`q`{`y`{`yae`y`yar`yae`y`yae`y`{`j`y`y`j`y`j`y`yae`y`y`j`y`y`a`a`a`a", +"atatatatae`y`j`j`y`j`y`jad`jadad`gadad`gad`jadad`{`j`y`r`y`{`w`y`j`r`y`wae`y`y`{`q`{`y`{`jar`j`y`j`w`{`q`y`w`{`y`y`j`y`j`{`y`r`y`y`{`j`y`yar`{`y`j`{`{`y`{`j`y`{`j`y`{`yar`y`y`j`{`j`yar`y`w`{`{`w`{`j`{`q`y`j`j`y`{adad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ae`yar`y`{`yar`y`j`y`{`j`w`yar`j`yaear`y`w`{`j`y`jar`j`yae`yar`jar`{`w`jar`y`y`r`y`{`wae`y`y`j`{`{`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`j`yadaj`gad`padadadad`j`jad`wae`j`y`q`{`y`yae`y`wae`y`j`y`q`j`w`jadad`jadadag`gadad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ar`j`y`j`y`qa`ar`y`j`y`j`q`yad`j`y`j`y`j`y`j`y`j`q`y`j`j`w`y`r`y`j`y`j`y`q`{`j`yae`y`y`j`y`w`j`j`y`q`y`j`w`j`j`{`y`j`w`j`jad`j`y`jadad`gadadad`y`j`j`w`ja`ad`pad`r`y`j`w`j`{`yaear`y`y`j`q`y`j`j`w`j`y`j`j`yadad`jad`jad`y`qad`j`y`p`jad`j`w`~adadadadadadadajadad`y`j`y`j`y`q`{`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ae`y`j`j`y`j`y`j`q`y`jadad`p`dadadadadadadad`jadad`jadad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ad`j`j`jad`j`jad`jad`y`jadadad`j`yad`j`j`ja``jad`j`y`j`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ad`y`j`jadadadadadad`j`j`j`j`yae`y`j`y`j`y`j`j`y`j`j`y`j`y`j`j`y`qadad`y`jadad`jad`y`j`y`j`j`y`yae`y`j`w`{`j`{`j`y`j`yar`j`y`y`j`j`y`y`j`{`j`y`j`y`y`j`y`{`a`a`a`a", +"atatatat`w`j`yadadadadada``j`yadadadadadadadadadad`jad`y`j`y`j`{`j`y`j`{`jar`yae`j`y`{`j`{`{`j`{ar`{`yae`y`j`{`j`{`q`{`{`yar`j`y`{`q`{`w`{`{`j`{`wae`q`{`w`{`j`w`{`{`q`yaear`j`{`y`q`{`yae`{`j`{`j`y`wae`y`yar`y`y`{ar`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`w`{`jar`y`{`j`w`j`{`{`w`jar`yae`yae`w`y`{`yae`{`y`q`y`{`y`y`q`{`y`q`{`y`{`j`y`{`q`y`y`{`w`y`{`j`w`y`q`{`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`pad`gagadadadadad`qada``p`{`j`y`y`j`y`j`w`j`q`y`y`j`y`waea``ja``qad`padadad`gadag`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`{ad`j`y`q`y`{`j`j`y`j`w`y`y`j`{`q`yar`j`w`j`y`q`y`yae`y`y`{`j`y`wae`y`q`y`y`j`y`w`y`j`wae`y`j`wae`w`y`j`y`j`y`q`y`q`y`j`y`y`w`j`yadadadagadadad`j`w`j`y`p`j`jad`y`j`{`y`j`{`q`y`j`w`j`y`{`j`yar`y`j`y`j`jadadad`j`p`y`j`pa``j`jad`y`j`yadadad`s`yad`ja``jadadadad`j`j`y`q`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`j`y`w`y`j`w`y`j`y`y`j`yad`y`y`padad`jadad`jadad`yadad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ada`adada`ad`yadadadadad`jadadad`jadadad`jad`j`s`jad`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`y`ja``j`yadadada`adadada``j`j`y`y`j`j`y`j`y`j`y`y`j`y`y`j`y`y`y`j`yadad`yad`y`j`y`j`y`j`y`yae`y`j`{`y`j`y`y`y`j`{`w`j`y`{`j`y`{`y`j`{`j`y`y`j`y`y`j`j`y`a`a`a`a", +"atatatat`{`wae`y`w`j`yad`yad`j`yadad`jad`gajad`gadadad`j`j`j`y`j`yad`yad`j`ja``jad`wad`j`ja``y`j`y`jar`y`{`w`{`{`y`{`wae`y`{`j`{`y`{`j`y`wae`{`y`y`{`{`waear`{`yar`j`{`y`y`{`w`yae`y`w`j`y`j`w`{`j`y`{`y`{`j`y`r`y`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`{`y`{`j`jar`j`y`yae`w`y`{`j`y`w`{`j`{`w`{`w`yae`{`y`wae`y`{`yar`j`yar`y`w`{`j`y`y`q`yae`y`q`y`{`j`{`y`q`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`padad`gaj`gad`j`ja`adadadad`qad`j`y`q`j`y`j`j`y`j`y`q`j`y`j`j`s`jadadadadadad`gajad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`{`j`y`q`y`j`y`w`jar`yae`q`y`j`y`j`y`{`j`j`y`y`j`w`jar`j`w`j`y`j`y`j`y`{`q`y`w`jae`w`y`j`y`w`j`y`j`j`y`q`j`y`y`j`j`y`j`w`j`y`jar`j`yadad`gajadadad`j`yad`yad`ja``p`j`y`{`wae`y`yae`y`y`q`y`y`q`yae`j`padad`s`j`j`yad`y`j`ja``q`ja`ad`q`ja``j`j`j`y`q`jad`jadadadadad`ja``y`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`j`y`j`{`j`y`q`yae`y`w`j`j`y`y`j`y`qa``j`w`jadad`j`yad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}adadadad`qadad`jadadad`jadadada`ad`j`yadadad`jad`jad`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ad`j`j`y`j`y`j`jadad`~adadadadad`y`j`y`j`y`j`y`j`j`y`j`y`j`q`y`j`y`j`yad`jad`jad`j`yad`j`y`j`y`y`j`y`{`j`y`j`y`y`yae`y`j`y`{`j`y`j`y`y`yae`yae`y`y`j`{`y`a`a`a`a", +"atatatat`j`{`{`j`{ad`j`j`j`j`yad`j`j`yadadadad`gajadadadadad`j`y`j`j`qad`p`yadad`j`~agad`g`jadae`y`w`j`y`jar`j`{`{`wae`{`y`yar`{`wae`yar`{`j`{`w`yaear`{`y`{`y`yae`y`{`wae`w`j`yae`w`j`yae`w`yae`yar`j`{`q`yae`{`y`w`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`y`r`y`jar`j`y`q`y`y`jar`yae`{ar`yae`yae`y`yae`j`w`{`y`wae`yar`j`w`j`y`j`{`j`{`yae`w`y`{`q`{`w`j`yae`w`yar`j`y`{`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ad`gagadad`g`j`padad`qada``j`y`pa``j`jadadadad`y`qad`yad`j`jadad`jadad`p`jajad`gad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`wad`y`j`y`q`{`jad`j`y`j`y`q`y`w`j`w`j`y`w`jar`j`y`j`y`{`j`{`w`y`q`y`q`{`yae`y`y`y`j`y`w`j`y`y`j`y`w`j`y`j`w`j`y`y`w`j`{`y`q`y`j`p`j`gadagad`gadad`j`j`y`q`jad`y`j`w`j`j`y`w`{`j`y`q`y`{ae`y`j`yada`adad`yadad`jad`w`j`y`yad`y`q`yad`ja``j`j`ja``j`j`wa`adad`p`yadada``qae`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`{`j`w`j`y`q`y`j`{`y`y`j`{`y`q`y`j`w`yae`y`j`y`y`q`y`yar`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`jadad`jadadadadadad`j`ja``jad`jadadad`y`p`y`j`y`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}adadad`jad`y`ja`ad`yadadadadadadad`j`j`y`j`y`j`y`y`j`w`y`j`y`j`y`j`y`j`y`j`ja`ad`y`y`j`y`j`yar`j`y`{`q`yae`w`{`j`{`y`j`y`{`y`j`{`y`{`yae`y`y`j`{`j`y`j`y`a`a`a`a", +"atatatat`j`y`yar`y`yad`yadad`j`yadad`p`j`g`ja`adadadad`gadadad`gadada``j`jadadadadadad`gadad`gad`j`y`{ae`w`y`y`r`j`y`yaear`yae`y`{`w`{`{`w`{ae`{`w`yae`yarae`y`w`{ae`{`y`jar`{`yar`j`y`y`{`j`w`y`{`{`w`j`{`y`wae`y`{`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`y`j`{`y`w`{`{`y`w`y`{`q`y`{`y`w`yae`w`y`{`j`y`{`y`r`y`r`yae`y`y`j`y`y`{`w`y`wae`w`y`yae`w`y`{`j`yar`y`j`yae`{`w`j`j`y`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ad`gad`j`w`y`y`j`y`j`wad`j`y`j`qadadadadadadadad`j`y`padadadadad`ja`adad`gagadad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`{`q`y`y`j`y`w`j`y`yar`j`y`yae`y`j`y`w`j`y`y`j`q`y`y`q`yar`j`y`j`{`y`j`j`w`j`y`q`y`j`yae`w`j`w`{`j`y`q`y`j`y`wae`j`y`w`j`y`j`w`y`j`j`q`gadadad`uadad`y`j`y`jad`y`j`y`q`y`j`j`y`w`j`{`j`w`y`j`j`qad`jadadad`j`ja``j`j`j`p`j`jad`y`j`q`y`j`s`j`yad`q`j`ja``j`jadadad`jadad`q`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`yae`y`y`y`j`w`y`j`j`w`y`j`w`y`{`j`y`w`yae`w`j`y`j`y`j`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`p`yadadad`q`yadad`yad`j`yad`y`jad`y`j`y`j`w`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}adad`hadadad`j`j`y`jada`adad`jadadadad`y`j`j`y`y`j`j`y`y`j`y`y`j`q`y`y`j`yad`j`jad`y`j`j`y`j`y`y`q`{`y`y`j`{`j`y`y`j`w`j`y`y`j`y`j`y`j`y`j`{`y`j`y`j`y`j`a`a`a`a", +"atatatat`{`j`y`j`{`jar`yad`j`y`jad`y`jad`y`j`jadadad`gadajadadadad`j`jadadadadadadad`gadaj`gagadadad`j`j`yar`j`y`y`{ar`{`y`r`y`{`wae`{`y`r`y`{`y`yae`{`wae`y`{`y`j`{`w`jar`{`y`y`j`{`y`wae`y`yae`y`j`y`y`{`j`y`{`y`q`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`q`{`j`w`{`q`y`{`j`wae`{`j`y`{`{`j`y`j`{`j`w`{`j`wad`{`j`y`{`y`{`y`jar`y`j`q`{`j`w`{`j`yae`w`j`y`jar`y`j`y`r`y`y`j`y`y`yar`j`wae`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`gad`y`p`y`j`j`yad`y`j`j`w`j`yadadadadadadadadad`gadadadadadadadadadadajad`gag`g`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ar`j`y`w`j`y`q`y`j`j`w`j`j`y`y`wae`y`w`j`{`j`y`r`y`y`wae`y`q`yae`y`{`w`j`w`yae`y`r`y`{`q`y`jar`y`j`y`j`y`y`j`y`j`y`q`yae`y`q`y`j`j`yadadadadag`gajad`y`qad`y`q`y`w`j`y`j`y`j`{`y`j`{`j`y`yae`w`jadadadad`p`jad`p`j`w`j`yad`yad`ja``q`y`j`y`j`j`y`jad`y`yad`j`y`pad`jadadad`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`j`y`y`qae`y`yae`w`j`y`j`{`q`{`jar`j`y`j`y`w`{`jar`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ad`jad`y`jadad`y`ja``j`jad`y`j`y`j`w`{`j`y`yae`y`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}adadadad`gadadad`jad`y`j`y`jadadadadadadadad`y`j`y`j`y`j`y`j`y`j`y`y`j`y`j`y`yadad`yad`j`y`y`j`j`{`y`y`j`{`y`j`y`{`j`{`y`y`{`j`{`y`y`j`y`y`j`y`y`j`y`j`y`a`a`a`a", +"atatatat`{`w`j`{`{`j`yae`yadad`jad`y`j`y`ja``j`jad`jadadad`gad`gadadadadadadadagadadadadadad`gajad`g`j`y`{`jar`{`j`y`{`wak`y`{`j`{`yar`y`{`y`r`y`{`y`{`yarae`w`yar`y`{`y`y`r`y`jar`y`j`yar`j`w`yae`w`yae`w`yae`y`{`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`{`y`r`y`y`{`j`{`w`j`{`w`y`q`y`w`jar`y`{`q`{`y`y`j`y`q`{`w`j`{`jar`y`y`jar`y`yae`yae`w`j`y`wae`y`y`{`yar`j`y`j`w`{arae`w`j`{`y`y`j`{`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ad`j`y`y`q`{`y`j`y`j`s`j`yar`j`w`yad`yad`p`jad`gajad`gad`p`j`gad`qadadadagad`gad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`{`j`y`q`y`j`y`w`j`y`y`qae`y`j`wae`y`j`w`y`j`jar`j`y`j`y`y`q`{ad`j`{`y`j`w`{`j`y`j`y`w`yae`yar`yae`w`jar`{`w`yae`y`y`yae`y`q`y`j`y`qadad`gadadad`gad`ja``j`y`j`j`y`q`y`j`y`qad`y`{`y`jar`y`yadadadadad`yad`y`ja``j`p`y`qad`p`y`j`yad`y`ja``jad`yad`q`j`s`jad`yadadad`yad`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ad`j`q`y`ja``r`y`yae`w`j`y`j`y`y`j`{`w`{`j`y`yae`y`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`j`y`p`j`y`j`s`j`y`y`q`y`j`y`y`j`y`q`y`j`y`y`r`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}adad`jadadadad`~adad`jadad`y`ja`adad`yadadad`jad`y`j`y`y`j`j`y`j`y`j`y`j`j`y`j`y`j`yad`j`j`y`j`y`j`y`j`y`w`jar`j`yae`w`j`{`y`j`y`j`{`yae`y`j`y`j`y`j`y`j`a`a`a`a", +"atatatat`y`j`{`{`j`yar`y`q`yad`jad`y`j`j`p`jad`qadad`jadadadadajad`yadadadadad`gadadadad`gadadadadad`g`jae`w`y`{`y`{`j`{`j`w`jar`y`w`{`{`{`q`{`y`{`q`{`q`{`y`{`{`j`{`j`wae`y`jar`j`{`{`w`{`j`y`j`{`y`w`j`{`y`y`{`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ar`j`w`j`j`yar`j`y`q`y`{`j`y`yae`{`y`j`{`y`j`{`y`q`y`r`{`{`y`j`j`y`wae`y`wae`{`y`j`y`j`y`{`w`y`j`{ar`y`q`{ae`y`{`wae`y`j`j`y`{`y`q`yae`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`sae`w`j`y`j`{`wae`y`y`q`y`{`yad`j`jad`w`jadadadadajadadadad`padadadag`g`gajad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`w`j`j`w`j`j`y`y`j`{`j`w`j`y`q`y`j`y`y`w`j`j`w`y`j`y`wae`y`q`y`j`y`{`w`jar`y`j`y`w`y`r`yae`y`y`q`{`j`y`q`y`j`j`y`j`y`j`y`r`y`y`j`y`q`yadadaj`gagad`pad`j`y`q`y`j`w`j`y`j`j`y`j`y`q`{`q`y`j`yaeadadadad`p`j`j`wad`j`ja``j`j`y`j`y`jadad`j`y`q`j`y`q`y`j`y`jad`yad`j`p`jadadadad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`yad`j`yad`yae`y`y`q`y`j`y`{`j`y`y`q`y`yae`w`{`j`{`q`j`{`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`w`j`y`y`j`y`y`j`q`y`{`j`y`w`jar`y`y`jar`y`r`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`j`j`yad`jadadadadada``j`j`yad`j`yad`jadadadadad`j`j`y`j`y`j`y`j`j`y`j`y`y`y`j`j`y`j`j`yad`j`y`j`y`q`{`j`y`j`y`y`y`j`y`yae`y`{`j`y`j`y`j`y`j`y`y`j`y`y`a`a`a`a", +"atatatatae`y`w`y`{`j`{`{`y`w`y`jadadad`y`ja``j`yad`yadadadadadadad`jadadagadadadad`j`gad`j`jadadad`gada`ae`y`waear`y`{`wae`y`{`{`yaear`{`y`{`yar`y`{`y`{`q`{`j`w`{`y`{`yar`{`y`yae`y`j`y`r`y`w`j`{`j`yar`j`y`q`{`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`{`{`y`y`{`y`j`{`{`y`jar`yae`w`y`w`{`{`j`w`y`{`{`y`yae`w`y`{ar`y`wae`w`y`{`w`q`y`{ar`y`wae`{`y`wae`y`{`y`q`y`y`j`y`y`yar`j`y`q`y`{`w`y`j`y`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`y`{`w`j`{`w`y`jar`y`y`j`q`y`qa``j`yad`yad`qada`adadadadadad`jad`gad`g`g`gad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`{`y`y`q`y`q`y`j`w`y`jar`y`y`q`{`j`wae`j`w`j`{`y`j`w`j`y`y`qae`w`j`j`{`y`q`{`j`y`{`yar`y`r`y`y`q`y`{`y`w`j`w`y`wae`y`y`jaea``q`y`j`j`pad`gad`~aja``j`p`j`y`q`y`j`w`ja``j`y`y`j`y`j`y`wae`y`w`jadadad`y`yadad`y`q`ja``j`jad`jad`y`w`j`w`j`y`j`jad`y`j`ja``j`j`yad`ja`adadad`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`q`y`j`wad`q`j`y`j`y`j`w`j`w`j`y`{ae`w`y`yae`y`w`{`y`{`w`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`y`jar`y`j`y`{`j`w`d`y`j`y`j`y`j`y`{`y`j`yar`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ad`yad`j`yadadadadadadadadad`j`~`j`y`jad`jadadadadad`j`y`y`y`j`w`y`j`y`j`j`y`y`j`ya``j`y`ja``j`y`j`y`j`y`yae`y`yae`y`j`y`j`yar`j`y`y`{`j`y`y`j`y`j`y`j`a`a`a`a", +"atatatatae`yae`yae`jar`yae`yae`wadadad`jad`yadad`j`y`j`p`yad`jadadadadad`g`jadadadadadad`jadadadad`jadad`j`w`j`y`j`{`q`{`{`{ar`{`{`w`{`j`{`q`{ae`w`j`{`j`y`w`{ae`y`w`jar`j`yae`y`q`{`y`q`{`y`j`y`q`y`{`y`j`{`q`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`pad`j`j`y`q`{ae`w`y`j`j`w`{`j`w`yae`{`j`y`r`y`w`{`jar`y`r`y`y`r`y`{`j`y`{`j`yae`y`{`w`yae`y`{`q`y`j`{`y`q`y`{`j`y`jar`j`w`j`y`j`y`{`qa`ae`j`yar`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`y`q`j`y`y`j`j`w`y`jar`jar`y`y`j`w`jad`j`wadad`jad`padadadad`jadadadaj`gajad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`j`y`q`{`j`y`w`jae`y`j`{`{`j`{`j`w`j`y`j`y`yae`w`j`y`j`j`w`j`y`y`j`y`jar`yae`y`w`{`q`j`y`{`j`{`yae`y`q`j`y`j`{`{`j`q`y`j`y`p`{`j`yadadagagadadad`yad`{`y`j`y`j`yad`y`j`q`y`j`j`q`yae`j`y`q`j`y`jada``j`p`j`j`w`jad`j`y`pa``j`w`y`j`j`y`j`jad`ya``qad`wad`j`yad`p`jad`qadad`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`yar`y`j`y`yad`y`j`j`y`j`y`jar`j`q`{`j`j`y`q`yae`yae`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`w`y`j`y`q`{`j`y`j`y`j`y`y`j`j`w`{`j`yar`j`{`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`j`y`jad`j`yad`jadadaj`g`~adada`ad`ja``yad`yadad`~ad`j`j`j`w`y`j`y`j`y`j`y`j`y`y`j`ja``jad`j`y`j`y`j`y`j`y`{`j`y`q`y`yae`y`y`j`y`{`j`j`y`j`y`j`y`yae`a`a`a`a", +"atatatat`y`q`y`{`j`y`yae`w`{`y`{ar`y`yad`jad`y`jad`w`j`jadadad`jadadadadadad`~agadadada`ad`yadad`jad`gad`j`j`y`yar`y`y`y`r`y`{`j`y`{`w`y`{`y`j`{`y`q`{`wae`{`y`w`j`{`y`{`q`y`{`y`yae`y`y`q`{`y`j`y`r`y`j`y`y`{`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`yadadadad`yae`y`w`{ar`y`j`y`{`w`yae`w`y`{`yae`y`r`{`y`yae`y`y`{`q`yar`yae`yar`yae`y`{`r`y`{`y`{ar`yar`j`y`{`q`y`y`{`j`{`y`y`r`y`wae`y`y`wae`y`y`wae`w`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`y`{`w`jar`{`y`j`yae`y`yae`w`y`y`j`y`w`y`jadadad`pad`jad`pad`yad`gadad`gadad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`y`j`y`y`r`{`y`w`j`y`w`j`w`yae`y`j`w`j`y`y`q`y`{`q`y`{`j`yar`j`y`wae`y`j`w`{`j`y`jar`yar`j`y`q`y`j`{`y`wae`y`w`j`y`yar`j`y`y`j`jadadad`p`g`paj`p`j`y`q`y`j`y`q`y`w`j`j`y`p`{a``j`y`q`y`j`y`y`p`yadad`j`yadad`j`y`j`p`j`j`ja``j`q`ja``j`yad`j`ja``j`y`jad`y`q`ja``ja`ad`j`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`y`j`y`j`w`j`yad`w`j`y`j`y`{`yad`y`y`{`w`y`j`w`y`jar`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`{`y`wae`y`j`wae`y`w`j`jar`y`j`y`{`q`j`{`y`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}a``ja``j`y`y`jad`ya``jadadad`~adad`~`jad`j`yad`jada`adad`j`y`d`w`y`j`w`j`y`j`w`j`y`j`y`j`y`jad`ja``j`y`y`j`y`y`y`j`y`y`y`j`y`y`j`y`y`{`j`y`y`j`y`j`y`y`a`a`a`a", +"atatatatae`y`{`q`y`{ae`y`j`{`wae`yae`yadad`jad`ja``jadadad`yad`j`gadadad`gadadad`g`jad`jad`jadadadadadadad`yar`{`j`{`wae`y`{`q`{`{`wae`{`{`w`{ar`j`{`y`j`y`{`w`j`{`y`{`q`{`y`j`{`q`{`y`q`{`y`j`w`{`y`j`yar`{`q`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`{ae`w`y`padad`j`y`j`yae`y`y`r`y`j`y`q`y`y`yae`w`y`{`y`w`j`{`{`{`w`{`y`{`j`{`w`{`j`{`wae`yar`yaear`y`{`j`{`w`yae`y`w`j`{`y`jar`j`y`y`{`j`w`{`j`w`j`y`j`y`w`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`w`{`q`j`y`y`{`j`w`y`jar`y`q`y`j`j`q`y`j`j`y`ja`ad`jadad`jadadadad`gajadajadad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ad`y`j`y`q`y`j`y`j`jar`y`j`y`j`y`jar`y`y`j`q`yae`j`y`y`jar`y`j`j`w`j`{`w`j`y`j`y`w`j`y`j`y`j`j`y`y`r`y`q`{`j`y`j`y`j`w`j`j`y`j`w`j`q`gajadadadadad`ja``j`j`j`y`j`y`j`yad`j`y`y`j`j`w`y`j`j`y`q`y`jadadadad`j`jad`wad`j`y`j`y`p`j`yada``j`q`yad`y`q`jad`jad`jad`jadad`jadadad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`j`y`q`{`j`y`j`w`j`y`j`w`j`j`j`wae`y`q`{`j`{`yae`{`y`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`yae`y`j`y`j`yae`y`y`j`y`j`y`q`j`y`{`y`y`q`{`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`q`y`j`y`j`j`yad`j`j`yadadadadadadad`~ad`j`yad`jadadad`~`j`j`j`y`j`y`j`y`j`j`y`j`y`j`yad`ja``j`j`y`j`j`y`j`y`j`j`yae`j`y`j`yae`y`j`y`y`j`yae`j`y`j`a`a`a`a", +"atatatat`{`y`yaear`y`wae`y`{`y`r`y`{`q`{`padad`jadadad`jadadad`jadad`jadadadadadadadada``jadadadadadadadadad`jar`yae`yar`y`{`yar`j`{`yar`j`{`y`{`q`y`{`r`{`yae`w`j`w`{`{`jar`y`y`y`r`y`y`q`{`j`y`q`y`yarae`{`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`yar`yae`{`{`y`qad`jad`j`wae`y`yar`j`y`{`r`y`y`{ae`wae`{`j`yar`j`j`w`{`{`w`y`{`y`yar`y`j`y`{`yar`yae`y`w`{`j`yar`yae`y`w`j`{`y`jar`y`j`w`{`j`y`{`j`w`j`y`j`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`y`{`q`y`y`q`{`y`j`y`{`j`y`{`w`y`j`y`w`j`j`s`jad`p`yadadadadad`j`g`gagadad`p`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`w`y`{`j`y`j`w`j`y`{`jar`jar`j`w`y`j`j`w`y`{`w`j`y`j`y`y`{`q`y`{`y`j`w`{`y`jar`j`y`y`q`y`w`{`w`j`{`j`y`y`j`w`j`{`j`y`y`y`jara``j`y`y`gadaj`gadad`yad`y`j`w`y`j`q`y`y`j`wad`y`j`w`y`j`j`w`y`j`{`q`yadad`ja``q`yadad`yad`wad`j`y`q`y`j`qa``j`j`s`yad`y`jad`y`pad`ja`adadadad`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`q`y`y`jar`yae`y`j`y`j`y`s`y`j`y`j`y`j`w`j`y`q`y`j`{`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`w`y`jar`y`w`j`y`q`y`{`w`yae`y`y`j`{`j`y`y`r`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`y`j`y`ja``j`y`y`jad`j`y`j`yadadadadadadad`j`yadada`adadada``j`j`y`y`j`y`j`y`y`j`y`j`y`y`ja``~ad`yad`j`y`j`y`y`q`{`y`{`y`y`j`y`j`yae`y`y`j`y`y`j`y`a`a`a`a", +"atatatat`w`{aear`y`j`y`j`{`w`j`{`j`w`y`{`ja``jadadadadada`ad`jada``jadadadadadadadadadadadadadadadadadadad`j`y`{`wae`y`yae`y`yae`{`yar`y`{`y`wae`y`yar`y`j`y`wae`y`{ae`w`y`wae`jar`{`{`y`j`{`j`w`y`{`j`y`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`{`{`y`j`y`j`y`yad`yadadad`j`j`y`{ae`w`{`y`{`q`{`w`j`y`y`y`wae`y`yar`yae`w`j`yae`w`j`{`yar`q`{`j`y`{`{`j`{`yar`y`{`y`{`j`{`w`j`{`y`j`w`yae`y`y`r`y`y`yae`y`w`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`q`yae`w`{`{`j`w`y`r`y`wae`w`j`y`j`w`j`y`wadad`y`jad`padad`padadagadadadada``}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`j`q`y`j`wae`y`y`j`w`j`y`j`y`j`yae`w`j`{`j`j`y`q`y`q`y`r`y`y`jae`y`q`{`j`w`j`y`jar`j`y`j`yae`y`j`y`r`y`w`j`y`yar`j`wae`w`j`y`j`qadadag`gadadad`j`q`y`q`y`j`y`j`y`qad`j`y`y`q`j`y`j`y`j`y`w`j`y`y`qadad`jad`ja``q`j`jad`j`qad`y`jadad`y`j`j`y`j`jad`y`qad`j`y`jad`q`jadadad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`jad`j`y`j`y`j`y`j`w`y`j`w`jae`y`ja``q`j`y`yae`y`j`y`q`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`y`y`j`{`j`y`{`j`y`j`y`j`j`yae`w`j`{`y`q`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`y`j`j`y`j`y`jad`j`yad`yad`jada``jad`jadadadad`ja``j`jadadadadad`j`j`{`j`w`y`j`y`j`y`j`j`j`y`j`jad`y`j`y`j`y`j`y`y`j`j`y`j`y`j`y`y`j`y`j`y`j`yae`y`a`a`a`a", +"atatatat`j`{`y`jae`y`y`yae`y`yarae`y`{`j`yadadad`jadad`jadadadadadadadadadadadadad`jadad`gad`j`gadajad`gad`j`y`yae`yar`{`r`{`w`j`{`j`{`jar`y`{`j`{`jar`y`{`w`yae`w`y`jae`y`y`y`j`y`q`{`y`w`j`{`j`w`j`yar`{`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ar`yaear`y`w`{`{`w`{`j`y`wadad`q`y`j`y`{`q`{`j`{`y`{`w`{`r`{`{ar`yae`y`q`{`yae`w`{`{`wae`y`y`{`w`{`wae`w`y`{`j`y`q`{`yar`yae`y`wae`y`j`w`y`ra``y`j`w`y`q`y`j`{`y`q`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`y`w`j`y`q`y`{`{`j`yaea``yae`w`y`{`j`y`r`y`j`w`j`y`j`y`padadadadad`gajad`gad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`y`w`j`y`y`q`y`j`w`j`y`w`yae`w`y`yae`y`w`y`q`y`{`j`{`y`jar`j`w`y`yae`w`{`j`yar`j`y`j`w`{`j`w`y`y`q`{`y`{ae`w`j`y`j`y`j`y`j`w`y`jadadadadad`p`y`y`j`}`}`}`}`}`jad`y`w`j`{`j`y`j`y`y`j`y`j`y`q`y`jadadada`ad`j`yad`qa``y`y`j`y`j`j`y`y`pad`y`q`y`j`wad`yad`y`p`j`ya`ad`qad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`y`y`q`{`y`w`{`j`j`y`j`y`{`y`j`w`j`y`j`w`j`y`q`y`{`yae`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`w`{`j`w`j`y`{`wae`y`y`w`y`{`y`j`{`j`{`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`j`y`j`y`yae`y`y`j`y`j`y`j`yad`y`j`ya``jadad`yadadada`adadadadada``jad`y`j`y`j`y`ja``y`j`y`ja``jad`yad`j`y`j`j`j`y`y`{`y`j`y`j`y`j`y`y`y`j`y`y`j`y`a`a`a`a", +"atatatat`yae`yar`y`j`yae`w`j`{`j`{`y`y`y`qadadadad`sad`jadadadadadadadadadadadadadadad`gadadadadad`gadadad`j`w`{`q`{`y`w`y`{`j`w`{`{`yar`{ae`y`{`j`w`{`j`wae`y`r`y`y`{`y`w`{ae`w`{`j`{`j`y`{`j`w`y`{`j`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`{`y`wae`y`j`yae`y`q`{ar`y`{`yadad`j`j`w`y`j`y`w`{`j`{`q`{`y`y`j`{`j`w`{`j`{`{`y`{`j`y`{`y`q`{`y`q`{`y`{`jar`yae`y`yar`j`y`j`{`w`j`yar`y`j`yae`y`j`y`j`jar`ja``q`{ad`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`yar`j`{`j`y`{`j`y`wae`w`yar`j`y`y`q`{ad`w`ja``j`y`q`j`s`jadadadajad`gadagadag`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`q`{`j`y`q`{`j`y`j`{`w`j`{`q`y`jae`y`w`jae`y`j`{`j`y`q`y`j`w`j`y`j`w`y`jar`yae`y`q`y`{`j`w`y`y`r`y`y`j`j`w`{`j`y`y`j`w`j`w`j`j`y`y`padagada``j`}`}`}`}`}`}`}`}`}`}ad`jad`yad`q`y`q`j`y`j`y`jad`y`jadad`qad`jad`j`j`y`p`j`j`pad`w`jad`y`j`w`ja``j`ja``j`j`y`j`y`jad`q`ja``}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`jadad`y`j`j`y`j`j`w`j`yae`w`y`q`j`y`y`q`y`j`y`j`y`qaead`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`yae`y`j`y`{`w`j`j`y`{`r`yae`yae`y`j`w`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`q`y`jar`y`j`w`j`y`j`y`j`y`j`y`j`y`j`y`j`jad`ja``jad`jad`jadadadadadadad`j`y`j`y`q`y`j`j`y`y`y`j`ja``jadad`y`ja`ad`y`j`j`j`y`j`y`j`y`j`y`j`y`j`j`y`j`a`a`a`a", +"atatatat`yae`y`j`{`{ar`j`yar`yae`waeae`y`j`jad`jad`jadadadadadadadadajad`gadajadad`gadajadadagad`gajad`gad`j`j`y`{ae`j`{ar`j`{`j`{`y`{`j`y`{`w`j`y`{`y`j`{`y`yae`wae`y`{`y`y`j`y`w`j`q`y`w`j`{`y`wae`y`w`{`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`{`y`r`y`{`q`y`{`w`j`{`y`{`jaradar`yadadad`j`q`yae`y`{`w`j`y`y`r`y`{`w`{`jar`y`j`w`{`j`w`{`yae`y`j`{`j`w`{`{`j`w`{`wae`yae`y`w`{`{`jar`y`j`y`wae`y`q`y`{`j`w`y`j`y`j`y`ja`ad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`q`{`y`{`q`y`q`{`j`y`{`yae`w`{`{`w`j`{`y`y`y`r`y`w`j`y`jad`jadad`gajadagadadagad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`{`y`j`j`y`j`w`y`q`y`j`{`y`j`y`q`y`wae`y`y`q`y`w`{`j`d`y`w`j`{`y`j`y`j`y`j`y`w`j`j`y`w`j`y`jae`y`y`q`{`y`y`y`j`r`y`j`{`y`j`y`j`q`j`yadagadad`p`}`}`}`}`}`}`}`}`}`}`}`}`q`yad`jad`y`y`q`y`q`y`j`yad`qada`adad`wada``j`y`j`s`j`yadad`w`j`jad`y`j`y`q`y`j`w`ja``q`j`yadad`j`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`ja`ad`y`q`y`y`{`j`y`y`y`j`y`j`y`y`yae`y`q`y`y`j`y`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`{`y`w`j`{`j`y`y`y`{`j`y`w`j`{`y`y`{`j`{`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`y`j`y`j`y`j`y`w`j`y`y`q`j`yad`y`jad`y`j`yad`y`j`ya``j`jadadadadadad`g`~`j`y`j`y`y`q`j`y`j`j`y`y`j`y`ja``j`y`j`y`j`y`y`j`y`j`y`y`j`y`j`y`j`y`j`yad`a`a`a`a", +"atatatatae`yar`yar`y`j`y`{`{`j`w`{`j`w`y`{ada`ad`ja`adadadad`jadad`gadad`gadadadagadadad`gadad`gaj`gadadad`ja``j`{`w`y`yar`y`y`{`w`y`r`yar`y`y`{`{`j`{`{`y`{`w`{`y`y`r`{`j`w`jar`{`y`{`y`j`{`y`j`yae`w`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`j`{`y`{`w`{`{`yae`w`{`y`r`y`y`{`{`y`w`j`sad`y`j`w`y`{`j`w`{`{`{`w`{ae`y`y`{`jar`y`{`y`{ae`w`y`yar`y`yae`w`j`y`yae`y`jar`y`{`j`w`j`y`wae`y`j`w`y`j`w`y`j`y`q`y`j`p`y`padadad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`{`j`w`{`j`y`y`y`{`w`jar`y`y`j`y`j`yae`w`j`y`j`y`j`wad`y`qad`gadagad`g`gag`g`g`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`w`j`y`w`y`q`yae`y`y`r`y`j`y`q`y`yae`y`j`w`j`{`j`y`q`y`q`yae`y`q`yar`j`yar`j`yae`w`y`j`y`j`w`y`y`r`y`{`j`wae`w`y`j`w`j`w`j`y`w`j`y`j`pad`gad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`j`j`y`w`j`j`j`y`j`w`jadadadadadad`jadad`j`p`jad`yad`yad`j`yad`ja``j`p`jad`y`j`jad`yad`jad`yad`q`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}a``j`y`j`w`j`yae`w`j`y`wae`q`y`{`y`q`j`y`j`ya``j`w`j`w`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`j`{`j`y`w`y`r`y`j`wae`y`{`q`y`jar`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`{`j`y`w`j`y`j`y`{`y`j`w`j`y`y`y`j`j`y`y`ja``j`y`jad`j`y`j`j`yadadadadajadadadad`j`j`y`j`y`j`y`j`y`j`ja``jadad`jadad`jad`y`j`y`j`y`j`j`y`j`j`y`yad`j`a`a`a`a", +"atatatat`{`j`{`j`{ar`j`j`y`{`j`y`{`{`jar`y`jad`jad`jad`yadadadadadadadadadad`gadaj`gadagadadadagad`gad`gadad`j`y`waeae`y`j`{`y`q`{`{`j`y`r`{`{`w`{`q`yaear`j`{`yar`y`{`j`{`y`{`yar`y`r`{`w`j`{`q`y`y`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ar`{`q`yae`yae`w`y`{`j`y`j`{`yae`w`j`{`y`{`j`y`jad`j`j`y`j`{`y`j`j`{`jar`j`w`{`y`{`jar`j`w`y`jae`w`yae`w`y`y`{`q`y`w`y`j`y`y`r`y`y`{`j`y`y`jar`y`{`j`y`j`w`j`y`jad`y`j`jadadadadag`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`q`y`y`j`w`{`j`wae`y`j`{`y`r`y`q`{ad`w`{`j`w`j`{`w`yae`y`p`jadaj`gag`gagag`gag`i`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`wae`y`j`y`j`w`j`y`y`q`y`yae`w`y`j`w`y`{`j`w`y`yae`y`y`q`y`y`yae`j`w`j`j`w`y`yae`w`j`{`j`{`w`j`y`jar`j`y`yae`y`y`y`j`j`w`{`j`y`w`j`jadag`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`j`y`ja``j`y`j`yae`w`jadadad`jad`y`j`w`j`y`j`j`y`j`y`q`j`ja``j`q`y`jad`yad`w`j`yad`j`wad`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ad`j`y`j`y`q`y`y`{`j`y`y`j`{`q`yae`y`w`j`j`y`w`j`j`y`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`y`wae`yae`y`j`w`y`j`j`y`yae`y`y`yae`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`{`j`y`{`q`y`{`jar`y`{`yae`y`j`y`j`y`j`j`y`j`y`j`ja`adad`y`j`yadada`adad`gadad`g`dad`j`ya``j`y`j`y`j`y`yadadad`y`jao`jad`ja``j`j`y`j`y`j`y`j`d`y`j`a`a`a`a", +"atatatat`y`{`{`y`{`j`y`{`y`q`{`yar`y`r`y`{`qadad`j`yadad`jadadadad`jadadadadadadadad`gaj`gad`gaj`gad`gajad`yad`y`j`{`y`w`yaear`y`j`{`w`{`{`y`q`{`{`y`{`w`{`y`y`r`yae`yar`{`y`{arae`y`yae`y`wae`y`y`j`{`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ae`{`w`{`{ar`y`wae`y`{`w`{ar`yae`w`y`{`y`j`wae`{`s`j`{ada``q`y`j`y`w`{`w`{`y`{`yarae`w`y`yae`y`{`w`{`y`{`j`{`wae`y`{`{`j`y`y`r`y`j`{`q`{`yar`j`w`j`y`j`j`w`y`j`y`y`y`qa``jad`gagadad`g`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`y`{ae`w`{ae`w`{`y`r`y`{`wae`y`y`{`w`yae`w`y`y`y`j`yae`w`yadadag`g`~agadag`gag`g`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`{`j`y`y`r`y`wae`y`{`q`y`{`y`r`y`y`q`{`j`yar`j`{`j`y`j`w`yae`y`r`y`q`y`y`y`y`j`w`j`j`y`w`j`w`j`{`j`y`{`j`y`j`w`j`y`q`{`w`j`y`j`w`j`y`jad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`y`j`qa``j`j`p`yadadadadadad`p`y`j`ja``jadad`y`pad`ja`ad`y`j`yad`j`y`j`j`y`jad`p`j`yad`jad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}a``j`y`j`y`j`y`j`w`j`{`j`w`j`y`y`j`y`j`y`y`q`y`j`y`j`w`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`j`j`y`y`j`{`j`y`r`y`y`j`y`{`j`{`{`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`{`j`y`y`j`j`y`y`q`y`y`j`j`yar`j`y`y`j`y`y`j`y`y`ja``j`y`j`y`jad`j`y`j`jadadad`iad`gad`~ad`y`j`ja``jad`yad`jad`yad`jad`ja`ad`jad`ja``ja``j`ja``jad`y`a`a`a`a", +"atatatatar`j`{`w`{`{`yar`j`{`j`{`j`{`y`j`{`y`ja``j`jada``jadadadadagadadadadadadadad`gadad`gadadaj`gadadadad`q`j`y`j`{`jar`yae`w`{`j`{`yar`{`j`{`wae`y`{ae`y`{ar`y`yae`y`q`y`j`{`w`{`{`y`q`y`yae`w`y`j`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`yae`y`j`{`yae`{`y`r`y`{`j`{`w`{`j`wae`w`y`{`q`y`{`p`y`w`j`j`jad`yae`j`y`q`{`y`j`y`{`y`r`y`y`q`yae`{`w`j`{`y`q`y`r`y`y`r`{`y`y`j`y`y`{`q`y`j`{`yar`j`w`y`j`yae`w`j`y`jadadag`gagadaj`gag`}`}`}`}`}`}`}`}`}`}`}`}`q`y`q`{`y`y`yae`y`q`y`y`y`q`{`j`w`{`j`y`w`jae`w`j`w`j`y`y`j`j`sadag`gag`gag`gaj`gad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`q`y`j`{`y`j`y`q`y`j`j`{`q`y`{`j`y`{`q`y`j`y`q`y`q`{`j`y`j`w`j`yae`y`w`jae`y`j`{`j`w`y`j`{`w`yae`w`j`yar`j`y`y`r`y`j`yae`y`w`j`j`qa``j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`y`j`j`y`j`y`j`jad`padad`jadad`w`jadad`wad`y`j`jad`j`y`p`y`j`j`s`ja``pad`y`jad`y`q`jad`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`qad`y`j`w`{`j`y`j`w`y`j`{`y`j`wae`w`y`j`j`y`q`y`j`y`y`q`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`y`q`j`y`q`y`j`{`y`y`jarae`y`y`q`{`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`yae`w`{`y`yae`y`j`{`y`{`j`y`y`j`{`y`j`y`j`y`q`y`j`y`j`y`j`yad`y`ja`ad`y`jadadadadag`gag`~adad`j`y`j`y`j`yad`jadadad`yad`j`yadad`j`~`jad`y`j`y`j`~ad`a`a`a`a", +"atatatat`{`y`j`{`j`yae`{`{`y`jar`y`y`r`y`{ar`jad`jad`yad`jadadadadadadadadad`padadadadadaj`gadaj`gadadadadadad`j`w`j`{`w`{`{`y`{`jar`{`w`y`{`j`{`y`{`{`yar`y`q`y`{ae`yar`j`{`{`w`{`y`jar`{`yae`w`y`j`w`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ae`y`y`{`wae`y`w`{`y`y`r`y`{`y`{`{`y`wae`{`y`y`jar`y`yae`ya``j`w`y`j`w`y`{`jar`yaraear`y`y`r`y`{`y`y`j`y`q`y`y`{`y`y`wae`y`y`q`{`w`j`wae`y`y`{`q`y`{`j`{`y`q`y`j`w`j`j`g`gag`gagad`gad`p`y`}`}`}`}`}`}`}`}`}`}`w`{`y`{`y`r`yar`jar`y`y`{ae`yar`y`{`{`y`jar`{`y`y`yae`y`w`j`j`jadagadagad`gag`g`gadaj`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ae`y`y`q`y`j`w`j`{`y`y`w`j`y`q`yar`j`y`j`w`j`y`j`y`w`j`w`{`j`y`{`q`{`y`jar`y`w`j`w`j`y`{`q`y`{`j`y`y`wae`y`w`yae`y`y`y`q`y`y`j`ya``j`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`yad`s`y`j`y`j`sadadadad`yad`ja``jad`j`s`jad`j`j`s`j`y`jadad`wad`yad`j`jad`j`q`yad`jad`yad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`yad`y`w`j`y`j`y`q`y`y`{`q`y`y`r`y`yae`y`j`w`{`y`j`{`q`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`yar`j`y`y`j`y`j`y`wae`w`y`y`{`q`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`y`y`jar`y`j`{`y`y`q`y`yae`y`q`y`yae`w`y`{`j`y`y`j`y`j`w`j`y`w`j`j`y`jad`y`j`gadad`i`gag`~adad`y`j`yad`y`jada``ja``j`yad`jaoadadadad`jad`~ad`yad`a`a`a`a", +"atatatat`j`y`{`j`{`y`q`{`j`{`y`jarae`y`{`q`j`y`y`j`jada`ad`j`gadadadad`j`j`y`y`j`ja``jadadad`gadad`gadaja`ad`j`y`j`y`j`j`yar`j`y`y`{`j`{`wae`w`y`r`{`y`{ae`w`{`waear`y`y`{`wae`{`jar`yae`y`w`{`j`{`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`r`y`y`{`j`wae`{`j`y`{`r`y`j`{ar`j`y`{`w`{`q`{`y`q`{`j`w`j`y`j`y`j`j`q`y`{`j`{`y`y`{`y`{`{`q`yae`w`y`{`jar`jar`j`{`y`{`q`{`y`j`{`y`jar`j`w`j`{`p`y`j`j`y`j`w`y`j`jadad`gag`gag`gadad`j`j`j`y`j`}`}`}`}`}`{`j`{`q`y`yae`y`y`yae`y`q`y`r`y`y`j`r`y`{`r`y`j`y`r`j`y`wae`y`y`qadad`gag`gag`gadadadad`p`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`q`j`y`{`q`{`j`{`q`y`j`j`y`j`y`j`{`w`j`y`y`jar`}`}`}`}`}`j`w`j`y`j`q`y`{`j`yae`y`{`w`j`y`{`q`y`q`{`j`y`j`y`j`wae`w`j`j`y`q`y`q`{`q`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`j`y`q`j`y`jadadadadad`ja``q`ja``j`jad`wad`j`ja`ad`j`jad`j`jad`wad`jada``j`p`y`j`q`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ad`jad`y`j`y`j`y`jae`yae`y`q`y`j`j`w`j`y`y`j`{`j`y`y`{`q`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`{`q`y`j`yar`j`j`y`j`w`j`y`j`{`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}arae`y`j`y`{`y`r`j`{`{`q`{`y`j`yae`y`j`y`j`y`{`j`yae`y`j`y`j`y`j`y`j`y`y`j`ja``jadad`gad`gag`~adadad`j`yad`ja``jad`jad`j`yad`j`yadad`g`gadad`kadad`a`a`a`a", +"atatatat`y`y`{`yadar`{`{`y`{`q`{`y`{`j`y`{`y`{`qadadad`jadaja`adaj`y`j`y`y`y`j`y`{`w`y`y`qa`ad`jadadadadadadadad`y`wae`y`wae`y`y`yaear`y`{`j`{`y`{`{ae`w`{ae`w`y`{`{`y`{ar`j`y`{ar`j`{`yar`y`j`{`j`w`{`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`{`j`{`wae`w`{`y`jar`y`w`{`j`yar`j`yar`{`j`{`y`yae`w`{`y`y`y`j`y`y`q`y`j`y`j`{`y`q`{`r`y`qae`y`{`w`{ae`yar`y`y`j`{`y`w`j`{`y`w`j`{`s`j`{`y`y`{`y`{`y`yar`y`yae`y`qa``jadadadadadadad`wad`y`y`w`y`yar`j`y`{`j`sae`y`{`q`yar`j`w`{`q`{`y`y`{`w`{`{`y`w`j`y`yar`j`y`w`y`j`q`y`jadad`gadadagadadadadad`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`{`y`y`q`{`j`y`w`y`jar`yae`w`yae`w`j`{`j`}`}`}`}`}`}`}`}`}`}`}`j`y`y`y`q`{`j`{`w`y`j`y`{`q`j`y`{`j`y`y`q`{`wae`y`j`y`j`w`j`y`j`y`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`{a``jadad`jadadadadad`sad`j`jad`y`w`jad`y`jad`yad`j`sada``j`ja``j`ja``jad`y`j`w`jad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`pad`j`y`j`y`w`j`y`y`q`y`j`y`{`j`wad`yae`y`j`w`j`y`w`j`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`j`{`y`y`r`y`j`y`y`j`{`j`yar`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`y`y`jar`j`yae`y`w`y`{`y`w`j`{`y`y`{`j`y`wae`y`yae`y`y`y`{`y`y`j`j`y`j`y`j`yad`ja`adadadadad`g`~ad`~`j`j`y`jad`ja`ad`y`y`j`y`j`ja``jadad`~ad`gad`a`a`a`a", +"atatatat`wae`{ar`{`j`j`{`w`{`{`yae`w`{`{`wae`y`y`q`ja``j`jadadad`y`j`s`j`{`q`{`wae`yar`{`y`j`w`j`pad`jadada``jadad`y`j`y`y`{`r`{`w`{`j`{`w`{`{ar`yaear`yar`{`{`wae`{`w`{`j`{`y`wae`y`yae`{`w`y`{`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`w`j`{`y`{ae`w`{`yae`y`w`{`wae`y`{`j`w`{`w`{`{`wae`y`r`y`r`y`{`r`y`y`j`y`q`y`r`y`y`y`{`j`y`w`{ae`yar`y`j`{`q`y`wae`{`y`r`yae`y`r`y`j`wae`y`q`j`{`j`q`y`j`j`w`j`{ad`j`g`pad`p`y`y`j`j`y`qa`ae`j`y`j`y`q`j`y`j`{`y`r`y`{`j`{`y`{`j`{`q`{ae`y`q`yae`y`y`r`{`j`yae`y`j`y`j`y`qadadajadag`g`gadad`p`y`jad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`j`y`y`q`yae`yae`y`jar`y`j`q`y`j`y`w`}`}`}`}`}`}`}`}`}`}`}`}`}`w`j`y`y`q`y`j`j`w`j`y`j`{ar`j`w`y`j`{`y`j`y`q`{`q`y`{`j`q`y`r`y`j`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`yar`jadadadadad`jadad`yad`jad`j`p`yad`j`p`ja``j`j`wad`j`wad`jad`qad`jadad`y`j`p`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`yad`jad`y`j`j`y`w`j`y`y`q`j`y`y`j`j`y`j`q`j`y`j`{`j`y`y`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`y`j`j`y`yae`w`j`y`j`y`q`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`{`yae`y`{`yae`y`j`{`j`{`j`{`j`yae`y`{`y`jah`q`y`j`w`j`{`q`j`y`y`j`w`j`y`j`j`y`j`j`j`yadadadadadaj`gadadadad`da``jad`jad`y`j`y`j`y`jadad`jadadad`i`a`a`a`a", +"atatatatae`y`w`{`j`y`{`{`j`yae`yar`yae`y`{`jar`y`y`jadad`jadadad`j`y`j`{ar`{`y`{`{`j`yae`{`w`j`{`y`y`y`ja``jad`p`y`jar`y`yar`j`y`{`j`y`{`w`{`j`y`{ar`y`{`y`{`j`{`y`{`y`r`y`{`wae`{`{`w`{`y`jar`j`{`w`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`{`y`{`{`q`{`w`j`y`{`jar`y`{`j`y`yae`y`y`j`{`j`{`yar`y`{`y`{`yae`y`y`q`y`j`y`j`y`j`q`{`j`{`w`{`y`j`w`{`{`y`q`{`y`{`yae`w`y`j`{`y`yar`j`y`j`y`y`j`w`j`y`j`{`j`y`j`wadad`y`j`y`y`j`y`{`w`y`w`j`{`w`yae`w`{`y`{`w`y`r`y`{`y`jar`y`q`{`w`y`yar`yar`{`yae`wae`y`y`y`w`j`w`yae`p`yad`j`gagadadadad`j`j`j`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`yae`w`yarae`y`y`q`y`w`yae`y`y`y`q`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`{`q`y`j`y`q`y`y`y`j`yar`j`y`yae`w`y`q`{`q`y`y`j`w`y`j`y`j`y`j`w`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}a``q`y`ja`adadada``qad`yad`jad`w`y`jada``j`ja``j`jadad`y`j`~`qa``j`y`j`y`j`y`jad`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`jadadad`j`j`y`y`j`{`y`j`y`j`w`y`j`w`y`w`j`y`y`y`j`y`wae`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`yar`y`w`j`y`j`{`y`w`j`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`{`wae`y`w`j`{`w`{`j`y`y`r`y`y`y`j`y`y`r`y`y`{`j`{`j`y`y`q`y`{`j`y`w`j`y`y`j`y`y`j`y`j`y`jadad`gad`g`~a`ad`jad`jad`y`jad`y`j`y`j`y`j`yad`jada``a`a`a`a", +"atatatat`y`{`j`y`{`j`w`{`yae`w`{`yar`{`{`q`{`j`{`ja``ja``jadadadad`{`y`j`w`{`y`q`y`{`yar`{`{`y`jar`y`j`j`y`q`j`j`y`y`j`{`w`{`{ar`y`{ar`j`y`r`{`yae`{ar`jar`yar`yar`{`{`{ar`y`{`yae`{`q`{`{`y`y`q`{`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`{`w`{`{`{`y`j`{ar`yar`j`{ar`j`{ar`yar`j`w`yae`w`{`{`jar`y`{`j`w`y`r`y`y`{`w`ja``j`y`j`w`y`j`{`wae`y`{`j`j`{`y`j`w`yar`yae`w`{`q`{`j`{`y`w`yae`w`y`j`y`w`j`y`q`y`j`y`w`j`w`j`{`yar`j`yae`y`j`w`j`y`j`yae`y`q`y`{`y`y`q`y`{`w`yae`yae`y`r`y`j`{`y`q`{`y`y`q`{`y`q`{`y`j`w`j`y`j`padad`gadajad`wad`y`y`q`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ar`j`{ar`y`{`q`yae`y`j`w`{`q`y`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ae`yar`d`y`q`{`j`w`j`y`wae`y`{`j`y`j`y`j`y`q`y`j`y`w`j`j`w`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ad`y`q`jadadad`kad`jad`w`jad`j`p`j`q`yad`wad`j`w`jad`j`ja``j`j`padad`q`y`pa``j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}adadad`sad`j`q`y`j`j`w`j`y`j`y`j`yae`y`y`j`w`j`y`q`y`yae`w`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`w`j`{`y`w`j`{ad`yae`y`y`w`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`w`j`y`yae`y`y`j`y`j`y`{`y`j`{`q`y`j`{`j`yae`y`w`j`y`yae`j`{`y`j`y`{`y`j`{`j`y`j`yad`y`j`y`jad`jadadag`gad`~adadadadad`~`j`yad`ja``j`y`j`y`~`j`y`a`a`a`a", +"atatatat`{ae`y`{ar`y`{`{`q`{`{`{ar`j`{`j`y`{`{`yad`q`j`j`yadadad`j`y`r`yar`{`{ar`{ae`w`{`j`y`r`y`{ae`w`{`qa``j`y`w`j`y`{ae`j`{`{`y`r`{`y`{`y`{`w`y`{`y`y`{ae`{`j`{`jar`y`j`{`y`r`{`w`y`{`j`{`j`y`{`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}arae`y`jae`w`{ar`j`{`y`{`y`j`y`q`y`j`y`{`j`{ar`y`j`y`q`y`yae`w`{`{`jar`yae`j`w`j`y`q`ya``jae`s`{`{`{`w`{`w`yar`{`q`{`y`j`y`{`j`y`j`y`y`wae`{`j`y`j`y`j`w`j`y`j`y`y`q`{`j`y`y`q`y`j`w`j`y`w`j`y`{`y`wae`y`q`y`y`{`r`j`{`{`q`yae`w`{`w`y`{`q`y`{`q`y`{ar`j`{`y`r`y`j`y`q`y`j`y`jad`padadag`gadad`j`w`j`y`w`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`{`{`y`j`y`j`y`{`j`yar`y`j`{`y`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`w`j`y`wae`y`{`w`y`j`y`{`j`y`q`y`j`w`y`w`j`y`y`q`y`j`j`y`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`w`j`j`y`qa`ajadada`ad`jad`y`ja``j`yad`q`jad`y`jad`y`p`yad`wad`y`y`j`y`ja``j`q`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`wad`j`jadad`j`y`j`w`y`j`y`j`y`w`j`y`j`w`j`y`yae`y`{`j`{`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`{`w`jae`y`r`y`{`j`y`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`{`yae`y`y`y`{`jar`yae`w`j`y`yae`y`w`j`y`{`y`j`y`j`yae`y`y`jar`j`y`j`w`j`y`y`j`y`y`j`j`y`y`j`y`y`yadad`hagada``~`jada``jad`ja``jadah`j`y`j`yad`a`a`a`a", +"atatatat`y`q`y`{ae`y`{`{`y`{`j`{`j`{`w`{`q`{`jarada``jadad`yad`gad`{`y`j`y`j`y`{`y`{`j`w`{`y`y`r`y`{`y`{`y`j`y`j`yar`j`{`w`y`j`{`y`{`q`{ar`y`{`{`{arae`yar`y`{ar`y`{`yar`yae`y`y`{ae`w`yar`j`wae`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`yar`yae`yar`{ar`y`r`{`yar`{`yar`y`jar`y`yae`yar`yae`yar`y`{`j`w`{`y`y`w`j`y`{`y`j`w`j`j`y`y`j`yae`y`{ae`y`y`{ar`y`r`{`w`y`{`r`y`q`{`j`y`w`{`q`y`{`j`y`w`{`qad`y`jad`y`j`y`{`q`yae`y`y`jar`y`{`{`j`w`y`j`{`q`y`{`w`j`{`y`j`{`j`y`{`j`y`yar`y`y`j`{`y`j`{`{`y`q`{`j`y`y`j`wadadadadadad`q`g`y`j`y`wae`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ar`jar`y`r`y`q`y`{`j`w`jar`j`yar`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`j`y`j`j`w`j`j`w`yae`w`{`y`r`y`j`j`{`j`wae`y`w`y`j`w`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ad`y`jad`y`jad`gajadadadad`w`jad`j`y`ja``j`jad`ja``j`j`j`jad`jad`ja`ad`j`ja``j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}a``jadadad`ja``j`{`j`w`y`j`w`j`yae`j`y`j`j`w`y`q`y`j`w`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ae`y`y`y`y`j`yar`j`w`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`w`{`y`r`y`r`y`{`j`{`yae`y`j`{`y`j`{`y`j`w`j`yae`y`w`yae`w`{`y`{`j`y`j`y`j`y`j`y`y`j`y`ja``j`y`j`j`jadadag`gad`g`dadad`yad`j`jad`yad`j`y`j`j`y`a`a`a`a", +"atatatatae`y`{`{`yae`y`{`q`yaear`yar`{ae`y`y`jadad`y`jad`q`jadadad`{`j`w`{ar`{`j`waear`y`{`{`j`y`{`yae`w`{`j`w`{`w`j`yar`j`{`{`q`{`w`{`{`y`{`j`{`q`{`yar`yae`yar`y`{`jar`{`yar`j`{ar`y`{`jae`y`y`w`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ae`w`j`{`yar`y`j`{`y`{`j`{`{`y`r`y`j`{`j`y`yae`w`{`j`{`y`y`{ae`w`y`yae`w`{`j`{`{`wae`y`w`y`j`j`w`j`q`{`w`j`y`q`{`q`j`y`yae`{`j`{`y`y`j`{`w`j`{`j`{`q`y`w`j`y`j`y`y`j`y`w`j`y`q`y`y`q`y`{`wae`y`j`r`y`y`j`{`w`j`y`{`j`y`{ae`w`y`{ar`j`w`{`q`{`j`{`j`w`{`q`y`w`j`y`{`w`j`y`q`jadadadadad`pad`yad`y`q`{`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`yae`y`w`{`j`y`{ae`y`j`{`j`yar`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`w`j`w`{`q`y`y`q`{`y`q`y`j`yae`yar`y`j`w`y`y`q`y`j`{`j`y`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`jad`y`qadadad`g`jadad`jad`ja``qad`q`yad`j`s`j`jad`w`ja`ad`w`y`q`ja``j`p`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ad`ja``jadad`j`y`wae`y`j`w`j`y`y`j`y`j`w`{`y`j`yae`{`y`{`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`q`{`jar`j`{ar`y`j`{`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`{`y`w`j`{`y`y`{`j`y`y`q`y`{`y`q`{`y`j`{`y`{`j`y`{`y`jar`y`j`{`j`w`{`jar`y`j`y`q`yae`y`j`y`j`y`ja``j`yadadad`hagadadad`~adadaoad`j`y`y`jad`y`y`a`a`a`a", +"atatatat`{`r`y`{`w`{`y`{`{`y`y`{ae`y`{ar`jad`j`jad`ja``ja``jadad`j`wae`y`j`{`q`{`y`{`{`yarae`w`{`y`r`y`{`j`{`y`{`y`{`y`y`{ar`{`yae`{`w`{`q`{`y`{`y`r`{`y`{ar`{`jar`y`{`y`r`{`{`w`j`{`yar`y`{`j`y`{`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ae`yar`j`{`y`w`jar`y`{`wae`y`{`yar`j`w`{`{`w`j`{`w`y`r`{`y`{`y`{`{`w`{`y`{`w`{`j`{`{`y`j`y`w`y`y`j`y`w`yae`y`y`y`j`w`yar`y`w`y`q`{`y`w`j`{`y`q`ya``yae`{`w`j`j`{`w`j`jad`y`q`j`y`y`y`j`y`y`j`w`y`y`q`y`yae`y`w`{`w`{`jar`y`yar`j`y`yae`y`y`q`y`r`y`y`j`{`q`yae`w`j`{`ja``jadadadagadadad`y`j`y`q`y`j`w`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`w`yae`{`w`{`w`j`w`j`w`yae`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`j`y`j`y`j`y`{`j`y`q`y`y`q`y`j`y`j`{`q`{`{`j`w`j`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}a``j`jad`y`jadag`gadadadad`j`s`jad`y`j`y`jad`j`yad`ja``j`jad`yad`j`y`j`j`ya``}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`p`j`s`jadadad`j`y`j`y`y`j`{`j`w`j`y`j`j`y`y`w`j`yar`j`{`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`y`{`y`wae`y`{`q`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`{`yae`y`{`q`j`y`{`yae`y`y`j`{`y`j`yae`y`j`{`q`yae`y`y`{`j`y`{`j`y`y`j`y`{`j`y`j`y`j`y`j`y`j`y`j`y`y`jadad`g`i`gadadadadad`j`~ad`jad`y`j`j`j`a`a`a`a", +"atatatat`q`y`{`j`{ae`wae`{ae`y`r`{`yar`jadad`{ad`ja``j`q`yadadag`g`{ae`y`{ar`y`{`y`{`j`w`j`{`y`{`q`{`yar`y`y`r`y`qae`yarae`y`j`y`{ar`{ae`y`{`yaear`{`yae`{`w`{`{`yae`{`jar`yae`y`{`y`r`y`{`j`j`{`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ae`yar`{`y`yar`j`{`yae`y`j`{`q`y`{`j`yae`{`w`j`{`{`j`yae`y`jar`jar`{`j`{`r`y`j`{`y`jar`j`{`wae`y`j`w`j`j`y`q`y`wae`w`{`j`y`j`j`y`j`j`y`j`j`y`j`{`j`y`j`q`y`j`y`ja``j`j`y`j`saead`y`j`r`y`j`q`{`j`y`{ae`y`j`{`q`{`yae`j`w`yae`y`j`{`{`q`yae`w`{ae`y`w`j`{`q`y`yae`y`y`w`j`j`padajadadadad`j`q`j`w`y`{`j`y`{`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`{`{`q`y`jae`yae`{`y`q`{`y`w`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`w`{`j`w`y`q`j`y`q`j`y`w`j`{`y`y`r`y`y`j`q`y`y`jar`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ad`jadadadaj`g`gagadad`jad`yad`j`jad`wad`ja`ad`q`yad`qada``q`j`jad`wad`j`p`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}a`ad`jadadad`j`j`s`{`y`j`w`j`j`y`j`w`j`y`q`{`j`{`wae`y`{`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`{ae`j`{`j`{`yae`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`{`w`{`j`w`j`{`y`{`yae`y`j`yae`y`yae`q`y`yae`y`y`j`{`wae`y`j`{`w`{`j`yar`y`q`y`j`y`j`yad`y`j`y`j`j`y`j`y`j`yadadag`g`iadadadadadadadad`jaoad`y`a`a`a`a", +"atatatat`{`{`w`{`y`j`y`{`q`y`{`{`j`{`j`j`y`p`y`j`yad`y`jad`jadadadar`y`j`{`y`r`y`{arae`yarae`y`{`{`j`y`y`r`{`y`{`y`{`wae`yar`{`y`j`{`w`yar`y`{`{`y`w`{ar`{`{ae`war`yar`y`{`yar`{`y`{`yar`y`{`w`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`w`{`j`y`j`{`{`w`jar`y`{`y`{`wae`{`w`{`y`{ar`y`{`w`y`j`{`y`w`j`{`y`q`y`{`y`jar`jar`y`{`y`wae`y`j`y`{`q`y`y`j`j`y`y`j`y`q`{ar`y`yae`w`j`yar`y`w`y`{`w`y`j`y`j`w`j`y`y`p`j`y`y`j`y`p`y`y`{`y`wae`w`y`{`w`yar`j`y`y`r`y`{`y`r`yar`y`j`y`{`y`j`{`w`yae`y`y`j`{`w`y`j`j`y`j`yadad`gadad`pad`ya``yae`yar`y`wae`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`w`j`y`{`w`y`j`y`yae`y`q`{`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`y`q`y`y`j`y`w`j`j`y`wae`{`y`jar`y`yae`y`y`{`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}adadadadadad`gagagad`gad`jad`yad`pad`y`jad`j`y`jad`yad`j`yad`j`w`yad`j`yad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`jadadadadada``j`j`y`jar`j`y`y`q`y`j`y`j`y`y`j`y`{`j`y`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`w`yar`j`y`{`w`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`{`y`j`{`y`j`q`y`y`q`y`y`y`j`{`y`yar`j`y`y`j`y`w`j`{`y`j`y`j`y`wae`yae`{`y`{`w`j`y`y`j`y`j`y`yad`j`y`j`j`y`jadadag`g`iadad`~adad`hadadad`dad`a`a`a`a", +"atatatat`j`j`{`jar`j`{`y`{`{`w`yae`y`q`y`jad`y`jadad`jad`yadadadad`j`{`{`wae`{`y`yae`{`y`j`y`{`jar`{`q`y`{ae`y`y`r`yae`y`{`{`yar`{ar`{`{`j`{`{`y`r`y`{`{`j`yar`{`{ar`j`{`y`r`{`j`yarae`y`jar`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`{`{`jar`y`r`{`y`{`j`{`q`{`j`yar`{`y`{`q`{`j`w`{ae`yar`y`j`yar`y`j`y`{`j`{`yar`{`j`y`r`{`y`j`w`y`j`y`j`w`j`y`w`j`wae`y`wae`y`jar`y`yar`j`{`y`j`j`j`{`j`y`r`y`yae`s`j`j`y`j`y`q`j`y`j`{`q`y`j`y`y`r`yae`yae`y`q`y`{`y`q`y`{`j`y`{`w`j`{`w`j`y`{`j`y`jar`y`j`y`jad`p`jad`uadadad`pad`j`y`j`w`j`w`{`jae`y`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`w`y`y`{`q`y`j`y`q`{`y`r`y`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`w`y`j`q`y`w`j`y`q`yae`y`q`y`r`y`yae`y`w`j`j`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}agad`gajadaj`g`n`hadadadadad`jad`y`jad`ja``j`ja``p`jad`j`wadad`j`y`j`q`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`jad`yadadad`yad`j`w`j`y`j`w`j`{`j`w`j`y`j`w`j`y`r`yar`jar`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`yae`y`r`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`w`j`y`{`j`w`{`{`yae`y`j`yae`j`y`{`j`yae`{`j`y`y`j`{`y`w`j`w`yae`y`y`y`j`y`{`j`j`y`j`y`j`y`j`y`j`y`y`j`y`j`yadad`g`hag`g`~adadadadadadadad`j`a`a`a`a", +"atatatat`y`{`y`{ae`y`q`{`yae`y`jar`y`yad`y`y`j`j`y`p`jadadadadad`g`yar`j`y`wae`{`w`{`yar`{`{`w`y`{`jar`yar`y`{`q`{`yar`yae`w`{`y`{`yar`{ar`y`r`{`y`y`q`{`{`y`{`{`y`{`{`y`{`yar`{`y`{ar`w`y`{`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`{`w`{`y`y`{`y`wae`{`w`y`y`{`y`j`y`{`q`y`{`w`{`{ar`j`y`yarae`yae`yar`j`w`{`j`y`{`yar`y`{`jar`yae`w`yae`y`y`wae`y`{`y`y`jar`yae`y`{`j`{`yae`w`yar`y`w`j`yarah`q`{`j`y`y`j`w`j`y`y`ja``q`y`y`jar`j`y`yae`y`w`y`{`y`q`j`{`y`jar`y`y`j`{`w`yae`y`q`yae`w`y`jar`y`j`w`ja`adadadad`p`y`y`w`y`{`y`{`{`j`w`{`yar`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ae`w`j`j`y`q`{`y`y`q`{`y`jar`{`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`{`y`y`j`y`j`y`y`q`y`j`y`y`jar`j`y`j`y`y`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}aj`gad`gad`gagag`gadadad`yadad`jada`ad`j`s`jad`y`j`y`ja``j`w`jad`yad`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ad`qadadadadad`y`j`y`wae`j`y`w`j`y`y`w`j`y`y`j`y`yae`y`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`{`y`y`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`yae`yar`y`j`{`j`w`yae`y`{`y`y`w`j`{`y`y`y`j`yae`y`{`q`y`{`{`j`y`j`{`j`y`q`y`y`{`j`y`{`j`y`y`j`j`y`j`y`j`y`y`j`yadadad`gag`gad`hadad`~adadad`~`a`a`a`a", +"atatatat`{`{`jar`y`j`y`{`jar`y`{`y`{`y`q`j`j`j`p`jadad`yad`jadadad`j`r`y`{`yar`y`j`{ar`{`j`{`{`{`q`{`{`y`jae`y`yae`{`yae`w`{`jarae`{`r`yae`{`y`yaear`{ae`y`w`{`q`{ar`y`r`yarae`y`q`{`j`j`yae`y`q`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`{`w`yae`w`{arae`y`w`{`j`y`{`r`yar`y`{`{`yae`y`y`d`{`yar`{`y`{`y`q`{`y`{`j`y`w`j`j`y`j`{`q`y`y`y`q`{`y`w`j`y`j`w`y`j`{`q`y`j`y`w`jar`j`wae`y`j`y`{ae`y`q`y`j`j`y`j`y`j`w`ja``j`j`w`j`y`j`j`y`j`w`y`j`j`y`j`j`{`j`y`{`j`y`q`y`jar`jar`j`yae`w`y`y`j`y`j`y`j`yadadadadad`q`yad`j`r`y`{`jae`w`j`r`y`{`j`wae`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`j`{`w`j`y`j`y`r`y`{`jad`{`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`r`y`q`{`j`w`y`r`y`y`j`y`q`yae`y`w`jar`j`q`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}agad`gajadadag`gagagadad`j`padad`y`p`j`jad`j`j`jad`y`j`pad`j`jadad`q`yad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}adada`ad`jad`y`y`q`y`j`y`j`y`yae`yae`yae`y`q`y`j`{`q`yae`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`w`j`{`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`{`y`j`y`j`y`j`y`{`j`{`w`j`y`jae`y`y`q`{`j`y`j`y`{`j`{`y`{`j`y`w`y`j`y`{`yae`w`j`j`y`y`j`y`j`j`y`j`y`j`y`j`yad`j`jadaj`g`iad`iadadadadadad`~ad`a`a`a`a", +"atatatat`j`{`{`y`{ar`{`yae`y`{`q`{`{`y`ja``j`y`y`j`yad`j`jadad`g`gad`j`yae`y`yar`{`j`jar`{`y`r`{`yar`j`yar`y`q`{`y`yar`y`j`{`w`{`y`{`yar`y`{`w`{`y`{`w`{`{`y`{ar`{`y`{`{`{`y`{`{ar`j`yar`{`wae`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`{`j`yarae`y`j`y`{`{`jar`{`w`{ae`yar`jae`w`yar`{`w`{`r`y`{`j`{ar`y`{`r`yarae`y`{`y`j`y`y`yae`y`q`{`y`q`yae`y`w`jae`w`y`y`j`y`y`r`y`y`{`w`y`{ar`j`y`j`w`j`y`{`j`w`j`y`q`y`j`j`w`y`j`y`j`q`yad`w`j`j`y`w`j`y`w`j`y`y`q`y`j`y`y`j`{`y`j`{ar`y`j`y`r`y`y`q`y`j`y`qadadad`pad`jada``y`jar`j`y`{`y`y`jar`y`{`j`w`{`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`y`j`{`w`y`j`{`j`w`{`y`w`y`r`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`jar`j`{`j`y`{`q`y`w`j`y`w`{ae`y`y`j`w`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}adadadagadadag`gag`hajadadadad`jadad`y`ja`ad`y`p`ja``ja``jada``q`y`j`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}adad`jad`w`j`y`q`y`j`y`w`j`{`y`j`w`j`y`y`j`j`yar`j`y`{`y`q`{`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ae`y`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`w`j`{`y`y`wae`w`y`j`yar`y`{`y`{`j`y`{`w`j`{`y`j`w`{`w`j`{`j`{`q`y`q`yae`y`y`j`y`j`y`y`j`y`j`y`j`y`j`y`j`y`j`yada`adag`h`gad`iadad`~ad`yadad`a`a`a`a", +"atatatat`{`w`jaearae`yae`y`{`q`{`{`yae`w`j`y`q`y`j`j`wad`yada``jaj`gad`{`w`jarae`y`{`w`{`yae`y`{`w`{`{`j`y`{`{`y`y`r`yae`y`{`j`yar`{`j`w`{`{`y`j`{`w`j`y`{`{`q`{`jar`jar`j`wae`w`{`yae`y`yae`y`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`jar`{`j`y`{ar`yar`j`w`{`{`j`{`{`w`{`yar`yae`{`j`{`j`{`{`y`{ar`j`yae`y`{`j`{`y`wae`y`{`q`{`q`y`yae`y`j`y`{`j`y`{`w`j`yae`yar`j`{a``q`{`j`j`w`j`y`q`y`j`y`y`r`y`y`q`y`j`y`y`w`j`y`j`j`qa``j`yad`j`j`y`j`y`j`yae`yar`j`y`r`y`jar`j`w`jarad`j`yae`y`w`j`{`j`y`jadad`g`jadadad`w`j`yar`j`y`yar`j`w`{`j`{`y`q`{`{`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`yar`y`j`{`y`r`j`w`yae`w`j`{`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ae`w`y`{`j`y`yar`j`y`j`{`j`y`j`y`j`w`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}adagadadadag`gag`gagadadadad`j`p`yad`ja``q`j`yadad`q`jad`w`ja``jad`q`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}a``q`y`q`y`j`w`j`yae`y`j`y`{`j`y`j`y`jar`j`q`y`j`j`y`{`q`{`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`yae`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`{`y`y`r`{`y`j`y`j`{ae`y`j`y`q`yae`yae`j`y`q`{`y`{`j`y`jar`y`{`y`{`j`y`j`y`j`y`j`w`j`y`ja``j`j`y`j`j`y`j`j`yadadag`~`gadadadadadadad`~adad`a`a`a`a", +"atatatat`{`{`y`y`{`wae`yar`{`y`{`jar`y`j`j`j`y`jadad`j`j`yad`ja`adadad`j`{`y`yar`j`{`y`{`w`j`{`yae`w`{`q`{`wae`{ar`{`yar`j`{`{`yae`w`{`{`jar`{`y`{`{ar`jar`y`{`y`y`{`{`y`{`y`{`{`w`{`wae`y`wae`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`w`{`y`w`{`j`{`j`j`{`y`y`r`{`y`q`{`j`yae`yar`y`{`q`yar`j`w`{`y`{`y`w`{`r`y`{`j`{`yar`j`y`y`{`jar`y`w`{`w`jar`y`j`yae`w`y`w`j`y`yae`y`j`w`y`y`{ae`y`yar`j`{`y`j`{`j`yar`j`y`j`jara``yad`j`w`j`j`w`y`q`j`y`q`y`q`y`j`y`y`j`y`j`w`y`j`y`y`jar`y`w`y`j`y`w`j`y`padadadad`j`yadad`y`{`j`yar`j`{`y`r`y`q`{`y`y`{`j`w`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`{`q`y`j`y`{`y`j`j`yae`w`y`q`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ae`y`q`yar`j`j`y`j`w`y`jar`y`y`q`y`y`jae`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}adaj`gadadad`gagag`gadadada``j`yad`jad`j`yad`j`yad`y`jad`j`y`ja``j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`y`j`y`y`yae`y`w`j`{`w`j`y`w`j`y`j`y`y`j`y`y`y`jar`y`yae`w`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`{`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`w`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`{`yae`y`{`j`w`{`w`{`y`j`yae`y`{`y`yae`y`y`{`yae`wae`y`{`yae`y`q`{`y`y`j`w`yae`y`y`j`y`y`j`yad`y`j`y`ja``jad`~`yadadadag`~adaoadadadadadad`~`a`a`a`a", +"atatatat`j`{`jar`{`j`{`y`{`yae`yar`{ae`w`y`jad`y`jad`y`wad`j`p`jadagadad`jar`yae`y`y`{`j`{`w`j`{`w`{`y`y`j`{`y`y`j`y`r`y`{`{`wae`w`{`j`yar`y`yae`y`r`yar`{`j`y`{arae`yar`jarae`w`j`yae`{`w`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`{`jar`j`{`y`w`yar`{`q`y`yar`{`j`{`yar`{`y`jar`y`{`y`{`{ar`j`jar`yae`y`y`y`w`{`w`j`{`{`y`r`y`{`w`yae`y`y`j`j`w`y`q`y`y`j`y`w`j`w`j`w`yae`j`w`j`wae`y`j`j`y`w`j`y`w`j`j`j`w`y`j`y`j`ra`ad`j`w`j`y`{`ja``j`{`j`y`yae`y`yar`y`j`y`j`y`j`y`ja``j`{`j`y`j`y`jadadadad`y`y`pad`j`y`j`jar`{`y`y`r`y`j`y`{ae`wae`y`{`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`{`w`y`jar`y`y`r`y`w`j`w`y`j`yae`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`j`y`j`y`qah`q`{`y`jar`j`y`jae`y`y`q`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}adadadad`pad`gag`gadadad`jad`j`jad`yad`j`q`y`jad`y`jad`wad`j`q`j`w`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`w`j`y`j`y`j`qa``jae`w`j`yae`j`y`j`j`y`j`w`j`j`w`j`y`j`w`j`{`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`j`y`w`j`j`y`{`jae`y`{`y`y`j`{`j`w`y`j`j`y`j`{`j`y`y`j`y`j`yae`y`j`y`j`{`y`q`y`j`y`j`j`y`j`yad`j`~ad`jadadadadaj`~adadadadad`j`ja``jad`~ad`a`a`a`a", +"atatatat`w`j`{`yar`y`r`y`{`w`j`{`yar`y`{`qadad`j`y`j`j`j`jad`jadadad`gad`jad`{ar`j`y`jar`j`y`yae`y`j`{ae`s`{ae`w`y`y`{`q`y`{`{`w`{`{`{`yaear`yar`y`{`{`yar`{ar`j`yar`y`{`y`{`y`{`w`{`{ae`y`r`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`q`{`{`yar`{`{`y`r`y`y`{ae`{`y`w`{`{`j`{`w`{`y`jar`y`j`j`{`yar`yae`y`y`r`yae`{`y`{`w`j`{`w`j`{`j`{`r`y`q`{`y`j`y`{`q`y`j`j`y`y`j`{`j`y`q`y`{ad`yae`w`y`j`w`j`y`j`j`y`y`j`y`y`q`j`y`y`j`ja``jad`y`q`yae`w`y`q`ja``q`y`j`y`{`q`yar`j`w`j`w`j`j`w`j`w`j`y`qadadadad`qad`jad`pa``{`q`y`j`{`q`y`y`{`w`j`{`y`j`wae`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ae`yar`j`y`r`y`{`j`{`yae`q`y`w`{`q`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`y`q`y`y`w`j`y`j`y`j`{`y`w`j`y`q`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}adadad`j`ja`adadag`padadad`w`ja``p`y`ja`ad`y`j`w`jad`j`y`ja``jad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`y`j`w`j`y`y`j`y`y`j`y`j`w`j`y`q`y`j`y`y`w`j`y`j`{`yae`w`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`w`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`{`yae`w`{`j`y`yar`j`yar`y`j`{`yae`y`yar`j`y`yae`yar`y`yae`y`yae`w`{`yae`y`j`y`j`y`j`y`j`jadad`jadaoad`ja`adadadad`j`ja``y`jad`y`~`j`ja``a`a`a`a", +"atatatatae`y`{ae`{`{`y`{`wae`y`{`wae`{`j`y`j`j`s`j`ja`a``ja`ad`jadadad`gajad`y`j`{`{`w`{`j`y`{ae`w`{`{`w`j`yar`y`{aear`{`yaear`y`{ar`j`{`w`j`{`y`{ae`w`yae`{`j`y`{`{`y`r`y`j`wae`{`r`y`y`r`y`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`{`yar`yae`yae`yar`yae`y`w`{`q`y`{`q`y`w`{`{`j`{`{`{`w`{`yar`yae`{`w`{`{`{`w`yae`w`j`{`w`j`{`yar`y`j`{`y`y`w`{`q`y`{ae`w`yae`w`j`y`w`j`y`{`j`w`{`w`{ad`w`j`y`j`w`j`w`y`q`y`q`{`y`j`w`ja``q`y`p`ja``q`y`j`y`j`y`y`y`j`{`jar`j`{`y`{`jad`y`j`y`y`y`j`yad`jadadad`qada``jad`y`w`y`j`y`w`{`j`w`yae`j`yar`jar`y`{`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`w`{`j`yae`y`{`j`y`q`y`q`y`y`j`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`j`y`y`j`j`y`j`w`y`q`y`q`y`j`yad`y`{`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}adadadad`qadaj`gadadadad`yad`ja``j`jadad`j`j`jad`j`wadad`j`ja``}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`j`w`y`j`y`jae`y`w`jad`q`y`j`y`j`y`y`q`yae`y`j`{`y`q`y`{`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ae`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`yar`jae`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`w`{`j`y`{`j`y`yae`yarae`yae`y`j`y`yae`y`j`y`w`jar`j`{`jar`y`{`y`j`y`j`y`j`y`y`j`y`j`y`jadadadadadad`jad`jadadadada`ad`y`j`j`ja``j`ja`ad`a`a`a`a", +"atatatatae`y`{`j`yae`{`{`{`{`r`y`{`yar`y`y`jad`yad`j`y`j`q`ja`adad`jadadadadadar`j`y`{`jar`y`wae`y`jae`{`{`yae`j`y`yaear`y`yae`y`{`{`j`{`y`yaear`y`{ae`w`{`y`{`wae`{`y`yar`y`y`r`y`{ae`y`{`jar`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ar`j`y`r`yar`y`{ae`w`{`j`y`{`j`{`yae`yae`w`{`j`w`{`j`{`q`{`j`y`w`j`{`jar`y`{`wae`{`{`j`{`w`j`{`j`y`wae`j`{`j`y`y`j`w`y`j`y`{`j`wae`y`w`j`y`{`j`y`r`y`j`y`{`j`w`j`y`j`y`j`yad`j`{`y`j`w`jad`y`j`w`j`y`ja``j`q`j`y`q`{`y`w`j`j`w`j`y`q`{`w`j`j`w`j`y`j`sadadadadadad`p`jad`j`y`r`y`{`j`wae`y`wae`y`j`yae`y`q`{`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`jar`y`w`{`q`y`{`j`y`j`{`q`y`w`j`j`w`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`yae`w`y`j`{`j`y`q`y`j`y`r`y`j`j`w`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}adad`jad`yadadad`gajadadad`j`j`yad`q`ya``qa``j`yad`ja``qa``j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`q`y`j`j`y`w`j`j`j`y`j`y`j`y`q`y`q`yae`y`j`{`y`q`{`y`{`q`{`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`{`y`j`{`y`{`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`j`{`y`q`yar`j`y`yae`y`y`y`j`{`w`j`{`y`q`yae`y`yae`w`{`j`yae`y`q`{`y`wae`y`j`y`j`y`j`jaoadad`~adadadad`ya``jad`yad`j`j`y`ja``j`y`jad`y`j`a`a`a`a", +"atatatat`y`j`{`yar`yae`w`{`j`{`{`wae`{`{ar`j`y`j`j`j`w`ja``jad`jadadad`gadadad`j`j`{`q`y`{`y`y`j`y`{`w`{`j`w`{ar`y`wae`y`yaear`{`yar`yar`yar`j`y`{`jar`y`{ar`j`{`yar`{`w`{`j`y`{`{`{`y`wae`w`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`{`yae`{`y`{`{`j`y`{`{`w`{`{ar`yar`{`{`w`yae`y`wae`{`y`y`{`y`yarakar`y`{`y`r`y`{`j`y`yar`y`{`j`y`r`y`y`y`j`yar`j`{`yae`y`y`jar`y`y`{`j`w`{`j`w`y`y`j`y`{`j`w`y`y`{`j`y`jar`y`y`w`j`p`y`j`yad`j`{`y`y`jar`y`y`y`j`y`j`y`j`yae`y`y`q`y`{`y`j`yad`yae`wadadajad`s`jad`ja``jar`y`jar`y`wae`y`j`yae`y`w`{`{`w`y`{`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ar`j`y`{`j`y`j`y`r`yar`y`j`w`j`y`j`y`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`j`w`y`j`y`j`w`yae`yad`w`j`y`w`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ad`p`ja``jadad`gadadadad`dadad`j`y`j`yad`j`qa`ad`q`yad`j`w`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`y`j`w`y`j`y`y`j`yad`y`q`y`j`y`j`y`y`{`j`w`y`r`y`{`yae`y`{`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`yae`y`{`y`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`r`y`yae`y`{`j`{`yar`y`yae`y`j`y`{`j`y`j`y`j`y`y`{`j`y`j`y`j`y`yae`y`y`j`j`y`y`j`j`ja``jad`jadad`~adadad`y`j`j`y`j`y`y`j`y`y`j`j`y`j`y`j`y`a`a`a`a", +"atatatat`w`yae`{`j`y`{`j`w`yae`y`{ar`j`y`{`q`yad`w`j`ja``j`ja`ad`jadadadagada`ad`j`y`{`j`{`q`yae`y`j`{`q`y`{`j`yae`y`{`w`{`y`jar`{ae`{`yarae`w`y`r`yae`y`{`j`yarae`{`j`{`r`{`w`{`r`y`{`yae`yar`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ae`w`{`w`j`y`q`{`q`y`j`{`{`j`{`j`w`{`q`{`y`{`yae`w`{`q`{`jar`j`{`y`{`j`{`j`j`w`{`y`r`{`j`{`j`yar`{`j`y`r`y`y`yae`w`j`w`jar`{`j`{`q`y`j`{`j`w`j`y`q`yae`w`j`y`j`j`w`j`j`y`j`y`r`j`y`y`j`p`ja``p`j`j`w`j`j`j`j`j`w`ja``j`{`w`j`wae`y`{`j`q`y`q`{`j`s`j`y`jadadad`j`yadadad`y`j`w`y`j`{`y`q`y`w`y`j`{`j`wae`j`wae`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}aear`j`w`{`q`{`wae`y`jar`j`y`w`j`y`q`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`j`y`j`w`{`j`y`q`{`j`y`{`j`j`y`w`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}adad`j`yad`jadadadadadadad`yad`p`jad`j`yad`j`j`jad`ja``j`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`y`j`jae`w`j`w`jad`y`j`j`y`waear`yae`w`{`y`{`j`w`jar`j`y`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`w`j`y`r`{`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ae`y`j`w`yae`yae`y`j`yar`j`{`j`yae`y`y`jar`yae`y`j`w`y`j`w`y`j`yae`y`y`j`w`j`y`j`yad`j`ja`adadad`yad`jad`y`j`j`y`j`y`j`y`ja``y`ja``j`y`j`a`a`a`a", +"atatatat`{`{`y`w`y`yae`y`y`{`j`yar`y`{`jar`y`{`yad`ja``q`y`jadad`jadadadadadadad`jad`yarae`y`yae`{`y`w`{`{`y`yar`y`y`r`{`yaear`{`y`w`y`r`y`{`y`{`y`y`{`yarae`w`{`{`j`y`w`y`{`j`y`{`y`jar`yar`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`{`j`{`jar`yae`y`{`w`{`j`w`{`yae`y`{`{`y`q`{ar`y`{`{`{`w`y`{`j`yar`j`w`{`w`{`yar`j`y`w`{`j`wae`y`w`j`y`y`q`{`y`j`y`{`y`j`y`y`j`y`yar`j`y`y`{ar`j`{`y`q`y`{`j`w`j`y`w`y`j`wad`y`{`j`wad`y`jad`y`y`q`y`y`ja``p`y`j`j`{`w`j`y`j`y`y`j`w`j`y`y`j`y`y`j`yad`padada``jadad`w`jar`y`y`j`y`q`{`yae`{`yae`w`yae`y`y`{`w`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ar`j`{`y`y`j`y`j`y`j`w`j`y`y`j`w`j`y`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`q`{`j`y`j`y`q`y`j`y`j`w`j`y`q`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`jadadad`j`yadagadadadad`jad`y`ja``q`y`jad`yad`wad`y`qad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`j`y`w`y`y`j`y`jadad`y`j`w`y`j`y`j`{`y`j`yaear`y`{`yae`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`yar`j`y`{`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`w`j`y`y`j`y`{`y`y`y`r`y`j`y`y`j`w`yae`y`y`j`{`y`j`y`y`j`yae`y`{`j`y`y`j`y`y`j`yadad`ja`ad`j`jadadadad`y`j`y`y`j`y`j`y`j`y`j`y`j`j`yad`j`a`a`a`a", +"atatatat`y`jae`{`j`w`{`j`q`{`j`{`j`{`y`{`j`{`jaradad`jad`j`jad`j`sadadadadadadadad`jad`y`q`y`w`y`r`y`j`j`w`{ae`yae`y`y`{`y`{`j`w`{`{`{`y`r`yae`waear`y`jar`y`{ar`y`{`j`{ar`j`{ar`j`{`w`{`j`yae`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`w`j`yae`y`yar`j`y`{ar`j`y`r`{`y`q`yae`y`{`j`{`w`yae`y`w`j`{`w`{`j`yar`yae`y`y`yae`y`q`y`{`y`wae`y`y`j`j`y`q`y`r`y`q`y`r`yar`j`y`j`{ar`j`y`j`{`w`j`y`j`y`j`w`y`{`j`y`w`j`{`w`jad`y`j`wadad`q`j`y`j`y`q`j`y`j`j`sad`j`y`q`y`j`w`jad`y`j`y`q`y`q`y`j`yadadadad`pad`qad`yad`{`j`q`y`yae`w`y`q`y`{`j`w`{`jar`j`yae`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`j`wae`y`q`y`y`q`y`y`y`r`j`yae`w`j`w`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`q`j`y`j`y`j`w`j`y`j`w`j`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ad`ja`adad`jadadadad`gad`qad`y`j`yad`j`y`qad`j`y`qa``j`w`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`pad`j`y`j`q`{a``j`j`w`j`j`y`j`w`y`j`w`j`{`j`ya`ae`w`j`{`w`{`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`{`y`{`q`{`q`{`y`w`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ae`y`w`j`y`r`y`q`{ae`y`{`j`yae`y`j`y`y`j`y`j`y`q`{`j`y`j`y`w`j`{`w`j`wae`y`jad`j`yadad`jadad`jadadadad`y`j`y`j`y`q`y`j`y`j`y`j`y`j`j`yad`a`a`a`a", +"atatatat`{`y`{`w`{`j`y`{`y`jar`{`j`w`{`jar`{`w`{`y`ja``jad`yadad`jadajadadadadadadad`w`j`{`y`yae`y`j`yar`{`{`y`w`{`w`{`q`{`q`{`{`{`{`jar`y`{ar`j`y`y`jar`y`{`yae`y`r`{`w`{`y`w`{`yar`{`j`{`w`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`{`j`y`y`yar`y`{ae`w`{`j`y`{`y`{`w`{`y`{`{`w`{`j`{`y`{ar`y`{ar`y`yar`{ae`yar`j`{`w`jar`{`{`w`j`{`yae`y`y`q`y`j`{`{`y`{`yaea``yae`y`w`{`j`y`yar`j`y`y`r`y`y`w`{`jar`yae`j`y`{`j`y`w`jarad`y`q`y`j`y`j`w`j`y`yad`y`j`y`w`j`y`q`y`j`y`{`j`y`q`y`{ad`j`y`jad`p`gadadad`jadad`jae`w`y`{ae`w`yae`{`y`jar`y`{`q`{`y`yar`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`{`q`{`y`q`{`y`y`j`y`q`y`j`y`y`q`j`y`y`y`q`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`j`y`w`y`q`y`j`y`q`y`y`y`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`yad`j`j`w`j`wadadadadada``qad`j`j`y`p`j`y`p`y`j`jad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}adad`j`y`q`y`y`j`wad`w`ja``q`y`{`yae`w`y`{`j`yar`j`{`y`{`yae`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`q`{`y`y`y`j`{`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`q`y`{`y`r`y`yae`y`y`y`jar`y`yae`w`{`j`y`r`y`{`y`j`y`w`j`y`j`y`j`y`j`{`y`j`y`j`ja``jad`ya`ad`ja`adad`y`j`y`j`y`y`j`y`y`j`y`j`y`j`ja``j`y`a`a`a`a", +"atatatat`yar`j`{ar`y`{`r`y`yae`j`y`{`q`{`y`j`{`r`{`y`jad`w`j`yadad`yadadadaj`gadadad`j`j`wae`y`y`jar`y`j`y`j`wae`j`y`{`{`y`{`q`{`yarae`y`{`y`{`{`j`{`{`y`r`yae`w`{`yae`yar`j`{`j`y`{`y`y`j`{`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ar`j`y`j`q`y`{`j`y`{`q`{ar`j`{ae`yar`jae`yar`y`{`y`q`{`jar`j`{`j`y`{`j`y`y`{`y`{`yae`y`y`j`{`y`q`y`w`j`y`jar`y`j`q`y`y`r`y`j`wae`y`y`q`{`q`y`j`y`j`y`{`q`{`j`{`j`y`q`y`j`w`j`{`j`y`j`yad`jad`w`y`j`{ad`w`j`y`q`yae`y`j`y`y`{`q`y`j`w`y`j`y`j`y`q`y`p`jadadagad`g`jadad`p`y`y`q`y`y`{`q`{`w`j`w`{`{`j`{`y`r`yae`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`yae`y`j`y`r`y`{`q`{`y`j`j`q`y`y`jar`j`y`j`w`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`{`j`y`{`j`y`q`y`j`q`y`j`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ad`jad`y`j`j`jadadadajad`ja``ja``jad`y`j`jad`p`yad`q`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}adad`g`j`y`j`y`j`j`y`j`y`j`y`j`w`j`{ae`wae`y`{`y`r`y`r`j`y`{`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`{`j`{`y`{`wae`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`{`yae`y`j`{`j`{`j`y`j`y`jar`y`j`y`y`j`y`q`j`{`yae`y`q`y`y`r`y`j`y`j`j`yad`ja``jadadad`jad`j`yadadad`j`y`j`y`y`j`j`y`j`y`j`y`y`j`y`j`j`a`a`a`a", +"atatatat`{`j`y`{ae`y`{`{`yae`y`y`{`y`{ae`yar`{`j`y`w`j`yad`ja``jadadadad`gadad`gad`jad`y`yae`yar`y`{`j`y`{ar`j`{`y`{`yar`jar`{`{`jar`~ar`j`y`j`{`w`{`q`{`yar`y`{`yae`y`w`y`{`j`y`y`r`y`q`{`y`q`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`y`j`w`{`y`j`w`{`r`y`y`{`j`y`yar`j`y`{`w`{`j`y`q`{ar`y`{`yae`y`yar`{`w`yaear`y`q`{ar`j`w`{`j`y`yae`y`w`j`{`y`w`j`{`w`j`{`w`y`jar`y`wae`y`y`wae`y`w`yae`y`w`j`w`y`{`j`w`y`y`j`y`w`y`j`w`y`j`y`j`y`q`y`j`{`q`y`y`j`w`yar`j`w`y`j`y`q`y`j`y`q`y`j`yad`jad`gagadag`g`padad`y`j`y`j`y`r`{`y`y`{`{`{`j`y`y`q`{`y`yar`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`y`j`w`y`yae`w`j`{`j`y`r`y`y`j`w`j`yae`w`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`q`y`j`w`j`w`j`y`j`y`y`q`y`q`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ad`yad`y`j`w`yadad`gadadadad`w`j`q`ja``qad`y`j`jad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ad`jadadadad`wae`y`w`y`j`q`y`y`q`y`j`y`j`y`{`yae`w`y`{`y`yar`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ae`y`y`y`y`q`y`jar`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`yar`j`y`j`{`w`y`{`j`y`{`j`y`j`y`{`j`{`y`y`j`w`yae`y`{`y`j`y`y`y`j`y`y`j`y`jad`yad`jad`ja`ad`jadad`y`j`y`j`y`j`y`y`j`j`y`y`j`y`j`yad`a`a`a`a", +"atatatat`{`yar`yae`w`{`j`q`{`wae`q`{`wae`y`j`yar`{`yaeadad`j`jad`y`q`jadadadadadadadad`w`{`{`j`yar`j`y`{`y`{`w`{ae`y`w`{`{`y`w`{`y`{`{`y`yar`yae`{`yarae`y`{`j`{`w`y`{`j`yar`{`j`{`y`j`y`{`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`{`y`j`j`{`y`j`y`yar`j`{`w`yae`y`{`wae`y`y`{ar`{`j`y`r`{`y`q`{`{`j`{`{`q`y`j`{`y`j`{`yae`w`yae`y`w`j`y`{`q`y`{`j`{`y`q`{`j`y`{`j`y`{`j`{`yae`w`j`yae`w`j`yae`{`q`yae`y`j`w`j`y`q`j`y`j`w`j`y`y`j`y`q`y`j`y`j`y`j`j`y`jar`j`y`q`j`y`yaea``j`y`q`yadadadag`gagag`gagad`p`y`q`y`w`j`yae`w`j`q`yar`y`r`y`yae`j`y`{`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`q`{`y`j`w`j`{`y`q`y`w`j`y`j`q`y`j`w`j`yae`w`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`q`y`y`j`j`y`y`q`y`j`w`j`y`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}adadad`jad`j`j`padad`gad`jadad`j`yad`j`j`p`y`j`w`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`yadad`jad`jad`y`j`y`j`yad`j`y`j`yar`j`w`j`{`w`yae`j`yar`j`{`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`{`j`yae`y`{`y`yae`w`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`y`jar`y`y`j`{`y`yae`y`w`j`{`j`y`j`y`j`{`j`y`{`q`y`j`y`j`y`j`{`q`y`j`j`y`j`y`jad`ja`ad`jad`j`~ad`jad`j`y`j`y`j`y`j`y`j`y`j`j`y`j`y`y`a`a`a`a", +"atatatat`y`r`y`{`j`{`j`{`{`y`j`{`{`y`{`y`{`w`{ae`y`j`y`j`wadadadadad`jadadajadadadad`j`yae`j`yar`y`{`j`w`y`r`y`{`y`r`y`{ae`yae`{`r`y`{`r`y`j`{`{`w`{`y`{`q`y`{`q`y`{ae`y`q`yae`w`{`yae`y`w`{`p`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`wae`y`y`y`j`y`{`q`yae`y`{`j`{`yae`w`y`yae`w`{`j`{`y`{`y`w`{`{`j`w`{`q`y`{`{ar`y`j`{`w`y`j`{`q`y`j`{`y`j`j`y`j`w`y`q`y`y`y`j`w`{`j`w`{`q`yar`y`{`{`w`{`y`{`y`w`j`{`w`y`q`yae`wad`{`w`ja``j`y`q`y`ja``j`y`jad`w`j`y`q`yae`y`w`j`{`y`q`y`j`y`p`jadad`gaj`g`nag`hag`gadada``{`j`j`yar`j`w`y`{`{`j`y`yae`w`y`q`{`w`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`w`y`{`q`{`y`j`q`yae`y`{`j`w`y`y`y`j`yad`w`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`yae`y`jar`y`j`y`jar`y`j`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`jad`y`jao`w`jadadadadadad`yad`jad`y`ja``yad`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`p`jadada``j`y`q`y`j`wad`y`jar`y`j`y`{`j`y`{ae`y`w`y`j`{`y`{`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`y`y`w`y`j`{`q`{`y`{`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`{`j`y`yae`yae`wae`j`y`j`{`w`j`y`yae`w`y`yae`y`y`j`{`q`yae`w`y`j`{`y`y`j`y`jad`yad`jad`~ad`yadada``j`y`j`{`y`j`y`y`j`y`j`y`y`j`y`j`y`a`a`a`a", +"atatatat`{`j`y`{`{`w`y`r`{`y`{ar`y`r`y`r`y`j`{`w`{`yar`j`y`yad`ja`ad`jada`adadadad`j`y`s`y`{`j`yaear`y`{`{`jar`yae`yar`y`q`{`y`{`yar`y`y`{`w`yae`{`yar`j`{`y`{ar`y`{ar`y`{`j`{`j`yar`y`j`y`j`{`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`yae`y`j`w`j`y`q`yae`y`wae`w`y`q`{`j`y`r`y`{`jar`y`q`{`j`j`yar`{`yae`y`{`w`j`{`j`y`q`y`j`y`{`y`w`j`{`j`w`y`{`j`yae`{`{`q`{`y`{`r`y`y`j`{`yae`y`j`q`y`j`j`w`{`j`{ad`wae`j`y`qad`y`j`j`yad`yar`j`y`y`q`{`y`q`y`w`y`j`y`y`j`y`j`y`y`j`y`y`q`y`j`jadadadag`gag`g`nac`gadad`j`p`y`j`y`y`j`{`q`y`{`q`y`{`r`y`y`j`yae`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`{`q`y`j`yar`y`j`w`y`j`y`yae`q`{`q`y`{`j`y`q`y`q`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`w`j`y`j`w`j`w`y`j`j`w`j`q`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`q`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ad`p`j`ja``qad`j`gaiadadadad`j`w`j`q`jad`j`q`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`jadad`jad`q`y`j`q`y`j`j`s`j`y`j`w`{`jar`y`q`{`j`{ar`j`y`r`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`yar`j`yae`y`y`{`j`j`y`{`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`{`r`y`y`{`w`y`yae`y`w`{`j`{`y`{`j`yae`y`y`j`y`j`y`yae`y`y`j`y`j`y`j`y`j`y`jad`yad`jad`yad`jad`ja``j`y`j`y`j`y`j`y`y`j`y`j`y`j`y`j`a`a`a`a", +"atatatat`j`y`q`{`y`j`{`yae`y`wae`j`{`y`{`j`y`yaear`j`y`j`w`jadadadadadadadajadadadad`q`y`j`{`q`{ar`y`j`{`jar`yae`y`{`j`yae`y`{`yae`yar`jae`y`{ar`y`j`yae`y`w`{ae`{`y`j`{`j`y`y`y`{`j`j`{`y`w`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`{`y`j`w`j`y`j`y`{`j`w`{`y`{`j`{`y`y`j`{`y`{`w`yae`y`{ar`yar`j`y`r`y`w`{`jar`y`{`w`y`{`j`y`q`{`j`y`y`w`j`y`j`y`j`w`{`w`yae`y`q`y`j`{`w`j`{`w`j`w`{`j`{`y`{`q`y`y`q`y`j`y`q`y`{`y`j`y`j`yar`j`y`y`q`j`y`j`yae`y`j`w`{`j`y`q`{`y`r`j`w`j`j`jadadadadag`gaj`gacag`g`padad`qa``j`j`j`y`q`y`{`y`q`y`{`w`j`y`{`q`{`y`w`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`w`yae`y`q`yae`y`{`yae`w`yar`d`w`y`{`j`w`yae`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`j`y`q`y`j`y`jar`y`j`y`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ad`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}adad`jad`y`j`j`yadadad`g`jad`ja``j`yad`w`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`q`y`jada``jadad`y`j`y`j`y`w`j`y`j`yae`y`{`y`j`{`y`{`w`y`jar`y`{`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`j`{`y`{`j`y`j`y`{`wae`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`yae`y`y`{`j`d`{`j`w`{`j`{`y`j`y`j`yar`y`j`y`waear`y`{`j`y`j`y`q`y`{`y`j`y`ja``j`y`jad`yad`jadada``j`j`y`j`y`y`j`y`j`y`{`j`y`j`y`j`y`a`a`a`a", +"atatatat`j`y`y`jar`y`yar`j`{`{`yae`w`{aear`y`j`{`yar`j`y`y`j`jadadadadad`g`gajad`g`j`y`{`w`j`{`y`yar`{`y`{`yar`yar`yar`y`{`w`{`w`j`{`{`y`{`q`yaear`y`{`{`w`{`jar`y`w`j`yar`y`r`y`y`{`y`q`yae`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`y`j`y`y`{`q`y`j`{`j`waear`y`j`w`{`y`wae`y`y`{`wae`y`{`j`{`w`{`y`j`yar`y`j`{ae`y`r`{`y`wae`y`y`j`j`yar`yar`{`w`j`{`j`w`{`j`{`w`{`j`{`y`{`q`{`yar`y`q`j`y`{`j`{`y`w`j`y`j`y`q`y`q`y`j`y`j`w`j`wad`{`j`w`j`yar`j`j`y`{`j`y`j`y`y`j`wad`y`j`uadadad`g`gaj`gag`gadada``j`y`pa``j`w`j`y`r`y`y`j`{`j`{ar`j`y`{`w`{`{`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`{`y`w`j`y`w`{ae`w`{`j`jar`yae`y`q`y`j`y`q`y`j`w`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`j`y`w`{`j`y`y`r`y`j`w`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`q`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}adadad`jad`jad`padad`gadadadadad`ja``jad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`w`j`j`s`jad`p`y`j`{`y`j`{`ja``q`j`w`yae`w`{`wae`y`{`yae`yar`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`{`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`y`y`q`y`j`y`{`y`y`{`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`wae`yarauad`{`y`{`yae`yar`y`q`y`j`yae`w`j`y`y`j`y`w`j`y`y`j`y`j`j`j`y`j`y`j`ja``jad`ja``jadadad`y`j`y`j`y`ja``j`j`y`j`y`j`y`j`y`j`a`a`a`a", +"atatatat`w`{`j`y`{`jae`y`{ae`y`wae`y`{`w`{`y`{`w`{`j`y`{`q`y`j`wadadadag`gajadad`g`j`j`q`yae`y`{`qae`y`jar`j`{`y`j`{`j`{`qae`{`yae`{`w`{`q`{`yae`y`y`{`q`{`j`y`{`yae`yae`y`j`{`j`yar`j`{ad`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`w`{`y`y`q`y`j`w`{`q`y`y`j`{`j`y`{`j`w`j`{`y`q`y`j`yar`y`r`y`j`yae`w`{`y`j`{`wae`w`y`yae`ja``{`j`j`w`{`j`j`y`j`j`w`j`{`y`q`{`y`y`y`r`y`yar`j`y`{`{`j`y`{`j`y`w`jar`j`y`j`y`q`y`jad`y`j`y`q`y`{`j`y`j`j`y`y`q`j`y`y`y`q`y`q`y`q`q`yaea``j`jadagadadagadad`n`gad`j`y`w`j`j`y`j`j`j`y`j`j`y`q`yae`w`y`j`y`{`{`j`{`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ae`s`{`jar`{`y`r`y`y`jar`y`y`j`w`y`yar`j`y`j`w`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`{`wae`y`j`r`y`j`y`q`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ad`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}adadada``p`j`w`y`jad`gad`jadad`qad`yad`q`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}a``j`j`yadad`jad`j`y`q`y`j`w`j`y`j`{`y`j`y`jar`j`yae`wae`y`{`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ae`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`r`y`{`j`y`{`y`q`yae`y`j`{`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`{`{`w`y`d`w`{`j`{`j`q`y`y`j`j`{`y`j`{`y`j`{`y`q`{`j`y`j`{`j`y`j`{`w`y`j`y`y`jad`y`j`jadadad`~adadad`j`y`q`y`j`yae`y`j`y`j`y`y`j`y`j`a`a`a`a", +"atatatat`j`{`j`y`j`{`w`{`yar`j`y`{`j`{`jar`jar`{`{ar`y`{`j`y`j`y`jadadad`g`gagadad`yad`y`yar`j`y`{`yae`w`y`jarae`yar`y`{`yar`y`w`{`yae`y`{`w`j`{`{`w`j`{`y`j`wae`y`w`{`y`y`yae`w`j`y`{`j`y`wae`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`j`y`j`y`{`j`y`j`{`q`y`w`j`y`q`y`{`j`y`r`y`y`jar`j`y`{`y`{`w`{`{`j`w`{`{`y`{`j`{`y`j`w`y`jar`y`y`j`q`y`w`{`j`{`{ar`j`y`y`r`y`{`{`y`r`y`{`j`w`j`w`{`yar`y`j`y`y`j`w`yae`y`y`q`y`j`q`y`y`{`q`y`y`q`y`w`j`y`y`{`q`y`{`j`y`y`{`y`j`y`j`wadadad`gad`g`pag`gagadad`y`j`y`w`j`w`y`w`y`y`j`w`y`j`y`yae`w`y`q`{`w`j`{`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`{ar`j`y`j`{`jar`yae`y`jarae`y`j`{`j`y`w`j`{`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`{`w`y`y`y`y`j`y`y`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ad`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ad`jad`jad`jad`jadadaj`gad`jadad`y`jad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ad`y`jad`w`jad`y`p`j`y`y`yae`y`w`j`j`s`j`yae`y`{`j`y`yar`j`{`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`wae`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`j`{`y`j`y`y`yae`w`yae`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`jar`j`{`yar`y`y`{`y`jar`y`y`jae`y`j`y`j`{`y`y`yar`j`y`w`{`j`y`j`y`j`y`j`y`j`yadad`yad`jadadadadad`y`y`j`y`j`y`y`y`j`y`j`y`j`y`j`y`a`a`a`a", +"atatatat`y`j`y`j`yae`y`j`wae`y`j`{ar`j`{`yae`y`{`jar`yae`y`{`yar`y`r`y`gajag`g`k`gadad`y`j`j`y`j`y`q`{`yae`y`d`w`j`{`jar`j`y`{`{`jae`w`jar`y`{`w`j`j`{`y`j`{`yar`j`y`j`{`j`q`y`j`y`yae`y`j`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`ja`ae`y`y`j`j`y`w`j`{ad`j`yae`y`y`r`y`y`{`j`{`q`{`y`{`wae`w`j`{`j`w`yae`w`j`w`j`y`j`y`q`y`y`{`q`j`y`j`y`yae`y`w`j`y`j`w`j`{`y`q`y`r`y`y`r`y`y`wae`y`j`yae`q`yar`r`y`y`j`y`q`y`j`p`y`yar`j`y`{`q`j`y`j`{`y`w`j`{`yae`w`y`r`y`j`w`j`y`q`jadad`gajadag`gagadad`w`y`j`w`j`{`y`j`j`j`y`q`y`j`w`jar`j`y`j`{`y`q`{`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`{`y`q`yae`y`y`r`y`yae`w`yae`y`yar`jar`y`y`j`y`q`{`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`q`y`j`yae`j`w`j`q`j`y`q`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`q`j`jad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}adadada``j`y`p`y`jad`gadadadadad`qad`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}a``j`j`w`j`j`yad`jad`y`j`j`w`j`y`j`y`y`j`j`y`y`q`{`w`{`j`y`{ar`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`{`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ae`y`y`y`r`y`{`y`j`{`y`j`{`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`{`y`j`{`y`{`j`j`{`jar`{`y`j`y`j`y`y`j`y`y`j`r`yae`y`j`y`j`y`q`y`j`y`j`j`y`j`j`y`jad`jadadadadadad`j`y`j`y`j`y`j`y`j`y`j`y`j`y`j`y`a`a`a`a", +"atatatat`j`y`r`y`j`y`{`j`{`yae`y`y`{`w`{`yae`w`y`{`j`{`wae`wae`yaea`ar`yadadag`gagad`j`q`y`j`w`j`y`j`y`q`{`{`w`{`y`{`y`j`wae`y`y`{`y`{`yae`y`y`{`{`w`j`{`w`j`y`{`y`q`y`y`{ad`w`{`ja``q`y`y`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`j`{`w`yae`y`y`j`w`y`q`{`y`y`yae`w`j`y`{`y`y`jae`y`y`j`{`w`j`{`{`y`j`{`y`{`q`{`yar`j`{`j`y`{`w`y`j`{`w`y`j`y`w`y`{`yar`yae`y`j`y`j`y`{`q`y`{`y`r`y`y`yae`wahae`w`y`j`j`y`y`j`j`y`j`y`j`w`{`y`y`q`{`j`y`yae`w`y`yae`y`y`j`{`y`w`j`ya``paj`gadad`gagadad`j`yar`y`j`y`wae`w`y`yae`y`y`{`y`q`{`y`q`y`{`j`y`q`{`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`y`yar`j`wae`{`y`y`qaharad`{`y`y`jaear`yae`y`y`j`{`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`w`{`q`y`y`y`y`j`w`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`s`j`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ad`qad`j`jad`s`jadadagadadadadadad`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`ja``j`ja`ad`jadad`y`j`j`y`j`yae`y`j`w`y`q`yae`y`wae`y`wae`y`{`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ar`{`y`{`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`j`y`y`j`y`j`{`j`y`w`{`j`y`{`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`yar`j`wae`yar`y`y`y`j`{`q`y`j`y`j`y`y`jar`y`j`y`j`yae`yar`d`y`y`q`y`y`y`jad`yadadadadadadadadad`y`j`y`j`{`y`j`y`j`y`j`y`y`j`y`j`y`a`a`a`a", +"atatatat`y`yae`y`y`jar`y`j`{`j`w`{ae`y`jar`j`{`yae`j`w`{`yae`y`j`{`y`j`{`jad`gag`i`i`~`p`y`y`j`y`j`y`j`y`y`w`j`j`y`qae`y`y`jar`j`y`wae`w`y`q`{ae`{`y`w`j`{`j`y`j`{`j`y`q`j`y`yae`y`j`{`y`q`y`w`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`j`y`j`y`r`y`j`w`j`y`j`y`y`r`j`w`j`y`{`w`j`y`q`{`w`{ar`yae`y`y`{`p`{`j`{ar`y`{`w`{`j`{a`ar`j`y`q`y`q`yae`w`j`{`yae`{`y`j`y`q`y`{`q`y`w`j`j`y`q`{`y`y`r`j`y`w`j`y`y`q`y`y`q`j`y`s`j`{`w`j`y`q`j`y`{`q`y`j`w`j`yae`w`y`q`{`j`w`j`y`jad`jagad`gadagag`g`ja``q`{`j`y`q`{`j`y`yae`w`y`q`{`q`y`j`y`j`{`wae`w`y`{`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`{`w`j`{`j`y`y`q`{`jar`j`y`r`y`q`j`w`y`jar`y`r`y`q`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ae`w`j`yae`y`qae`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}a``j`jadad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}adadadad`y`ja``jadadadag`gadad`q`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ad`qa``j`jad`q`yadadad`y`q`y`{`j`w`y`j`y`j`{`j`w`j`{`y`{`{`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ae`y`q`{`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`y`y`y`j`y`y`q`y`{`y`y`j`{`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ar`y`j`{`y`{`y`j`{`{ae`w`y`y`j`y`j`y`q`y`y`j`j`y`y`j`w`{`j`y`j`y`j`y`j`j`y`j`y`ja``jadadadadada``j`j`y`j`y`j`y`j`y`y`j`y`j`y`j`y`j`a`a`a`a", +"atatatat`j`yae`y`w`{`jar`y`{`y`{`w`{ae`y`y`{`j`{`w`j`y`{`yae`w`{`j`w`{`j`w`y`y`g`napapat`kad`j`ja``pae`j`j`y`j`y`j`y`j`w`j`y`j`y`j`{`yae`yae`w`y`j`{`y`w`j`{`w`y`q`{`y`yae`w`y`{`q`y`j`y`j`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`y`y`y`j`y`w`y`{`r`y`y`q`j`y`yae`y`w`j`{`j`y`y`{`j`y`jar`y`q`y`{`w`j`y`y`q`{`j`y`j`w`j`{`y`r`y`{`y`y`j`y`{ar`q`yae`w`y`r`y`y`j`{`{`y`jar`y`y`{`q`y`j`y`{`j`y`r`y`y`j`{`j`w`j`j`yad`j`y`y`j`yar`j`y`j`y`yae`{`w`y`j`y`j`w`j`y`j`w`ja`ad`gag`g`i`g`g`i`j`{`y`j`w`j`y`{`q`y`q`yae`y`{`y`{`w`{`r`y`j`y`j`y`r`y`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`yae`y`w`{`j`w`{`y`j`y`y`jar`y`{`wae`y`j`y`j`{`y`{`jar`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`wae`w`{`y`q`y`q`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`padad`g`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ad`p`y`p`ja``j`qadadadadagadad`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`ja``j`wad`yad`jad`p`j`y`j`w`j`yae`yar`j`y`y`j`{`y`q`{`q`y`{`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`{`y`{`yaear`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`j`{`j`y`{`y`j`y`j`y`{`w`y`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`{`q`{`y`q`{`y`yae`y`{`q`{`yar`yae`y`y`j`w`y`j`j`y`j`w`y`y`w`j`y`j`y`j`yad`y`jad`~adadadad`jad`y`j`y`j`y`y`j`y`j`y`j`y`y`j`y`y`j`a`a`a`a", +"atatatat`y`{`y`j`y`j`{`y`yae`q`y`{ae`y`w`y`r`y`y`{`{`jar`j`y`y`wae`y`j`y`j`y`j`sagaa`v`vaf`i`gadad`y`jadad`y`j`jad`w`j`jad`y`jad`j`w`j`j`y`y`j`y`y`q`{`j`{`j`y`j`y`j`yae`y`j`y`q`y`j`y`q`ja``y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`y`j`j`w`j`{`j`j`y`y`j`y`y`r`y`j`y`j`y`q`y`y`r`y`jar`j`{`q`yae`y`j`{ae`w`{`j`{`y`w`j`{`y`q`{`y`j`yae`w`y`j`j`y`j`{`y`j`y`y`j`y`q`y`q`y`{`j`w`j`y`j`y`{`j`y`wae`yad`y`q`ya``j`y`q`y`j`w`j`y`j`j`y`yae`y`wae`y`j`y`j`j`y`yae`y`y`j`y`qadadadagagag`g`g`j`y`q`yae`y`j`w`{`j`y`yae`w`y`q`{`j`y`j`y`w`j`y`j`y`{`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`{`q`{`j`w`{`j`y`jar`y`r`y`yae`j`y`{`j`y`q`y`y`q`{`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`w`j`{`y`y`j`y`j`w`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}adadad`gagag`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}adad`d`qad`j`jadad`gaj`g`gadad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`p`j`jad`j`w`j`jadadad`j`j`y`{ae`y`wae`y`q`yae`y`q`y`j`{`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ar`j`yae`w`{`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`y`j`y`j`y`j`y`j`y`y`j`j`{`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`{`y`r`y`{`j`{`wae`w`{`yae`y`j`y`j`yar`j`{`j`y`y`j`y`j`y`j`j`y`j`y`j`j`y`j`jadadadadad`~adad`j`y`j`y`j`y`j`y`j`y`j`y`j`y`j`y`y`a`a`a`a", +"atatatat`w`j`{`y`w`{`j`{`{`y`j`{`jarae`y`{`{`r`y`jar`y`y`r`y`j`{`y`j`w`{`q`j`y`jad`u`nac`m`gadadadadad`jad`pad`jadadad`y`j`p`y`qa``j`wad`w`{`j`y`j`j`w`y`yae`w`{`y`j`y`w`j`y`j`{`j`y`j`yar`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`w`{`j`y`w`jar`y`qae`w`y`yae`w`yae`w`y`j`{`j`y`q`y`y`w`y`y`w`j`{`w`y`yae`y`y`r`y`j`y`w`j`y`j`{`w`j`y`{`w`y`jar`y`jar`y`jar`y`yae`y`j`yae`yar`yae`w`y`j`w`j`y`yae`y`j`y`j`w`j`j`y`j`yad`y`w`{`j`w`j`y`j`y`wae`y`w`j`w`j`y`q`y`j`j`yad`padadagasagacada`ae`s`j`y`q`y`j`y`w`j`y`j`y`yae`w`{`j`{`y`y`wae`y`w`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`y`y`yae`y`yarae`y`y`{`j`w`y`w`j`w`{`y`j`yae`y`{`q`{`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`w`jar`y`wae`y`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}adagadag`g`g`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}adadadad`pa``j`yadadag`gagad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`yad`yad`jad`sad`j`yad`w`y`q`y`j`y`{`j`y`y`y`q`y`{`j`w`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`{ar`j`{`wae`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`j`y`y`j`y`y`j`y`y`r`y`y`y`jar`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ar`j`y`{`y`q`{`y`{`j`{`j`y`{`y`yae`w`j`y`j`w`y`j`y`y`j`j`y`y`j`y`j`y`ja``ja`adadad`jadadadad`ja``j`y`j`y`j`y`y`j`y`j`y`y`j`y`j`y`a`a`a`a", +"atatatat`{`y`j`r`{`j`{`yar`j`{`y`wae`y`j`wae`y`j`w`{`y`j`yae`y`yarae`y`yaea``j`pad`yad`p`wadad`ja`ad`padad`y`y`p`y`y`j`w`y`y`y`ja``j`ja``j`jad`qa`ae`y`j`wae`y`j`{`j`w`j`{`j`yar`j`y`y`y`ja`ad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`{`y`y`q`y`{`j`y`y`j`y`q`{`j`y`j`y`j`y`q`j`y`w`y`j`w`{ae`yae`yar`y`j`yae`w`y`y`j`w`y`{`j`w`j`y`j`yar`j`y`j`{`j`y`w`{ae`w`{`y`j`y`w`j`w`j`y`j`yar`y`j`yae`y`w`j`j`yad`q`ja``j`y`p`y`j`w`j`j`j`y`w`j`{`yar`j`y`w`j`yae`y`w`j`y`j`w`jadadadag`mag`n`had`j`j`y`y`y`j`y`y`q`j`y`j`w`{`jar`j`y`wae`w`j`{`jar`j`y`q`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`{`j`yae`w`j`w`j`y`j`y`j`j`y`j`yae`y`{`j`q`y`y`{`q`y`{`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ae`w`j`yae`y`j`w`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}adaj`g`gadagad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ad`gadadadad`jadadad`gag`g`g`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ad`j`yad`j`jad`jad`j`s`j`y`j`y`{ae`w`j`{`j`wae`j`y`j`yae`y`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`w`{`y`y`j`{`y`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`w`j`y`j`y`yae`y`j`y`j`y`j`{`y`j`{`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ae`w`{`{`j`y`{`j`{`w`y`{`j`w`j`yae`y`y`j`y`y`j`y`q`j`yad`j`y`j`j`y`j`j`yad`jad`~adada`ad`ja``j`y`j`y`j`y`y`j`j`y`j`y`j`y`j`j`y`a`a`a`a", +"atatatat`y`j`{`y`j`y`j`{`jar`yae`y`y`j`y`yaear`yae`y`{ar`j`y`wae`y`y`q`{`j`y`j`j`y`w`j`y`j`y`j`q`j`y`j`w`y`j`y`{`y`{`jae`y`wae`y`w`yae`y`w`y`ja``j`ja``j`j`j`s`j`w`j`y`y`q`y`j`y`j`wae`j`j`y`yad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`j`j`y`y`jar`j`{`y`{`j`w`j`y`w`j`y`j`y`y`j`{`wae`y`j`w`{`q`y`{`q`j`y`y`j`wae`{`j`{`q`y`{`j`y`j`y`{`j`w`y`{`w`j`{`y`q`y`j`{`q`y`{`j`y`w`{`j`y`j`{`w`y`j`yae`w`y`qad`y`j`y`y`j`ja``j`y`j`w`j`y`j`y`jar`j`y`j`j`w`j`y`j`j`y`qad`jadadag`gagac`hag`g`g`y`q`j`p`j`y`j`yae`w`y`j`y`j`y`{`j`y`y`r`y`{`y`j`y`yae`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`jar`y`{`j`y`r`y`yar`y`r`y`w`j`y`q`{`y`jar`j`y`{`q`yar`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`{`q`y`yar`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ad`gadaj`g`gaj`gad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ad`gajadadadadadadadaj`gagad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`qad`q`y`pad`y`p`y`j`y`w`j`{`j`y`y`y`yae`w`y`{`w`j`y`j`yae`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`{`wae`yar`j`{`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`y`j`j`y`y`j`y`y`{`j`y`y`j`{`y`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`yae`w`j`{`yar`j`{`j`yar`y`jar`j`y`j`wae`y`q`y`j`y`y`j`y`j`y`j`y`y`j`y`ja``jadadadadadad`j`wad`yaea``j`y`q`y`y`j`y`y`j`y`y`j`y`a`a`a`a", +"atatatat`yar`jar`{`wae`w`y`j`{`j`y`q`{`jar`j`{`y`y`r`y`j`{`yae`y`y`r`y`y`j`y`y`y`q`j`y`y`j`w`j`y`y`y`w`{`y`w`{`q`j`wae`y`w`{ae`y`yae`j`w`{`j`y`{`y`p`jad`w`j`y`w`j`{`y`j`y`j`y`w`{`j`y`w`j`y`w`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`yae`w`yaea``w`{`j`w`y`j`y`j`yae`yar`j`{`w`j`y`j`w`yae`y`y`{`j`y`w`{`r`y`yae`w`y`yae`y`yar`j`{`w`y`jar`{`j`y`w`{`j`y`{`j`y`y`yae`w`yae`w`y`j`y`j`yar`ja``j`{`j`y`{`y`qad`y`j`wad`y`j`y`y`j`w`jar`y`j`w`y`j`y`w`j`y`w`j`jad`gadad`gag`i`n`i`gadad`w`jad`j`y`r`y`w`j`y`y`wae`y`w`jar`y`r`y`j`y`jar`y`q`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ar`y`{`w`j`{`q`yae`y`j`y`j`y`j`y`j`j`y`q`y`j`y`q`y`j`y`j`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`q`y`j`q`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ad`gadag`haj`gag`g`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}agadadadagadadadadad`gag`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`jad`y`jadad`y`j`y`{`yae`y`{`j`w`y`jarae`y`j`{`j`{`j`y`w`j`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`{`wae`yar`yae`{`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`yah`y`j`y`j`y`j`w`j`{`yae`w`y`jar`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ar`y`j`{`q`{`j`y`{`w`{`j`y`{`j`y`{`j`y`j`y`{`j`y`y`j`j`y`j`y`j`yad`j`yad`jadadadad`jad`y`j`d`y`ja``j`y`j`y`y`j`{`j`y`j`y`j`y`j`a`a`a`a", +"atatatatae`{`y`j`{`y`{ae`y`q`y`{`j`y`y`y`yae`w`j`{`yae`y`q`y`{`q`{`j`{`y`w`j`j`y`y`j`q`y`jad`y`q`j`y`jar`j`{`j`{`y`jar`j`y`wae`y`w`y`{`j`w`y`r`y`j`y`wad`j`j`y`j`y`q`j`w`j`yad`j`w`jad`{`w`j`y`q`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`yae`y`y`q`{`j`y`j`{`jar`y`j`w`j`y`j`y`r`y`j`{`q`y`j`w`j`y`q`j`{`y`j`yar`j`y`{`yae`y`j`w`yae`y`j`yae`y`q`j`yae`w`j`{`w`j`{`q`y`j`y`j`y`{`jar`y`j`y`j`y`q`y`y`j`y`j`qad`y`jad`y`j`w`j`y`j`y`w`j`y`j`{`j`y`j`y`j`y`j`jad`padadag`gaj`g`gag`g`nadad`j`y`yar`yad`y`j`y`q`{`j`y`wae`y`j`yaea``w`{`q`y`j`{`j`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`{ar`j`y`j`y`y`q`y`ja``q`{`j`y`j`y`yad`y`r`y`yae`y`y`q`{`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ar`y`y`jar`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}agadagadag`gaj`g`gad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`jad`yadadadadadaj`gadag`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`yad`y`q`y`j`w`j`{`y`j`y`j`{`yae`w`y`{`{`w`y`wae`y`{`y`w`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ae`w`{`yae`yar`j`r`y`{`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`j`y`j`y`y`j`d`y`y`j`y`y`j`{`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`w`{`y`y`{`j`{`yae`y`{`yar`j`y`y`j`w`j`w`j`y`j`y`j`y`ja``j`j`y`jad`ja`adadadadadad`yad`j`w`y`jar`y`q`j`y`j`y`j`y`j`{`y`j`j`y`a`a`a`a", +"atatatatae`w`j`{`{`w`j`{`w`{`y`jar`y`r`{ae`w`{`j`y`{`w`y`{`yae`y`{`y`j`wae`y`{ar`j`{`y`y`j`y`q`y`{`w`j`{`y`yar`j`{`w`y`{`y`{`y`{`jar`{`y`j`yae`y`w`{`j`y`j`y`j`p`j`j`y`y`y`jar`y`y`y`j`y`j`y`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`{`w`j`w`y`j`w`yae`w`y`yae`w`j`y`y`p`y`j`y`p`yar`j`y`y`j`y`y`{`j`y`y`r`y`y`yar`j`{`w`j`yar`j`y`w`jar`y`y`y`j`y`y`j`y`y`j`w`y`j`{`w`{`y`r`y`j`yar`j`y`w`y`j`y`j`wada``j`ja``y`q`y`j`y`j`y`q`y`j`y`y`w`j`y`w`j`y`q`y`qadadadaj`gadag`gag`n`hadad`y`w`j`y`j`y`j`yae`w`y`j`w`j`{`j`y`yar`y`wae`y`j`{`y`{`p`y`w`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`q`{`y`y`q`y`y`j`jar`y`j`w`y`j`wae`w`y`j`y`y`j`w`j`{`j`w`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`jae`w`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`g`gaj`g`gagad`gadag`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`w`y`qad`p`jadadadadag`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`w`j`w`j`y`{`{`j`y`w`{`j`w`y`r`y`y`{`j`w`j`{`jar`y`{`j`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`w`{`yae`w`{`y`y`y`{`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ae`y`j`y`y`j`y`j`y`y`y`j`y`j`y`j`y`w`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`{`j`{`q`yae`y`w`yae`w`yae`y`{`wae`y`y`j`y`j`y`j`y`ja``j`j`yadadada`adajadadadad`y`j`y`j`y`j`y`j`y`j`y`j`y`j`y`j`y`{`j`y`j`y`a`a`a`a", +"atatatat`{`{`wae`j`{`y`j`{`y`j`{`j`y`{`j`w`yarae`y`q`{ae`w`{`j`w`j`{`{`y`wae`y`{`wae`y`q`{`j`y`j`j`y`j`{`q`y`y`{`q`yae`jar`jar`y`yaear`{`w`j`{`j`yar`y`j`w`j`yadad`w`j`j`y`j`y`jae`w`j`s`j`j`wad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`y`{`yae`yar`y`j`{`w`j`y`{`y`j`{`y`j`yaea``j`y`q`y`q`j`y`y`w`j`{`y`jae`wae`y`y`q`{`y`j`y`{`j`w`y`j`{`wae`wae`w`y`q`y`y`j`{`j`y`jar`y`yae`w`j`{`q`y`j`{`q`y`y`j`y`jad`q`y`j`j`y`w`j`yad`y`jae`w`j`y`j`j`y`j`jadadadad`g`gadagad`iag`g`gaga``j`j`ja``q`y`j`w`y`j`y`j`y`{`q`yar`jae`y`j`{`w`j`w`j`j`{`j`yae`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`y`j`wae`yae`y`y`j`y`w`j`y`j`y`y`j`yae`y`y`w`j`{`w`yae`y`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`{`y`w`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ag`gag`gadagadag`gaj`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`yae`y`y`y`p`ja`ad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`{`y`yaear`j`y`j`y`r`y`j`y`j`y`{`q`yae`y`j`{`{`y`j`q`y`{`q`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`{`w`{ae`yar`j`{`y`{`q`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`y`y`j`j`y`j`y`j`j`y`j`y`{`q`yae`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`y`y`j`{`{`j`y`{`j`y`j`{`j`y`j`y`j`y`j`y`j`y`j`y`ja``jad`j`~adadadadad`yad`jad`y`j`y`j`y`j`y`j`y`j`y`y`q`y`y`q`y`j`y`j`y`a`a`a`a", +"atatatatae`j`y`yar`y`j`{`{ae`w`{`w`{`yar`{`j`{`y`{`yae`w`yae`yar`{`y`r`y`y`{`w`{`y`{`q`y`{`yad`y`{`q`y`{`yar`{`j`{`{`yar`y`{`y`{`j`y`{ae`y`y`{`{`w`{`{ae`y`y`q`yad`y`j`y`w`j`j`wad`{`y`j`y`y`j`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`{`j`j`w`j`y`j`w`j`{`q`y`{`q`y`q`{`q`y`w`j`y`{`j`w`{`y`{`q`yae`w`y`j`w`{`y`yar`y`y`jar`y`jar`y`j`{`w`j`y`j`y`y`{`j`y`jar`y`y`w`j`y`yae`y`y`j`y`y`j`y`j`y`yae`y`qa`ad`j`y`y`q`y`j`y`j`y`y`y`q`y`y`j`yad`w`ja`adadad`gadadaj`gadag`g`gad`q`y`y`j`w`{`yae`w`y`jar`y`q`{`q`y`y`j`{`y`y`q`y`j`{`j`yar`y`q`y`w`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`{`y`j`y`y`j`yar`y`q`{`j`{`y`y`q`{`w`y`jar`j`y`j`y`j`y`j`y`w`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ae`w`j`{`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`gagag`gagadagad`gad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`q`y`y`j`j`y`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ar`j`{`w`j`y`{`w`y`j`{`y`{`y`{ar`j`{`y`w`{`w`w`y`jar`{`{`j`w`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`{`j`{`y`wae`y`y`{`q`{`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`{`y`y`y`j`y`y`j`y`y`j`y`j`y`j`w`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`r`y`y`y`j`w`{`jar`y`{`j`y`y`j`{`q`y`w`j`y`j`y`jad`jadadadadadadadadad`j`y`j`y`y`y`j`y`j`y`j`y`y`j`y`j`y`{`j`y`j`y`y`j`y`a`a`a`a", +"atatatat`j`{`yae`{`w`y`r`y`yae`{`{ar`j`{`yar`j`{`y`{`{`{`w`{`j`yar`y`{`r`yae`y`q`{`yae`y`q`{`j`w`j`y`j`wae`y`w`y`{`q`y`{`jar`jar`{`q`y`{ar`j`wae`y`j`w`j`y`yae`y`q`y`j`jad`y`j`j`y`jar`j`wae`y`p`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`w`y`jad`y`j`y`y`r`y`j`y`{`j`y`y`j`w`j`{ar`j`y`y`j`y`q`{`y`y`j`yar`j`{`j`j`{ae`y`yae`y`y`{`j`y`w`j`{`y`q`y`j`q`{`j`w`yae`yae`y`wae`y`w`jar`y`r`y`y`q`j`y`q`y`jad`j`p`y`q`yad`}`}`}`}`}`q`y`j`y`q`y`j`yad`qadad`uajad`gadadad`gaj`g`gad`y`j`w`j`j`w`y`j`{`j`y`j`y`y`j`y`q`yar`j`y`{`y`q`y`yae`y`{`jar`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`wae`w`j`yae`j`y`j`y`j`w`j`j`y`y`j`j`w`j`y`j`w`j`y`q`y`j`y`q`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ae`y`j`w`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`gag`gagad`gadag`gag`iag`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`w`j`y`w`j`j`y`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`{`j`y`{`jar`yae`w`yae`q`{`y`y`r`{`yae`yae`d`w`j`{`wae`y`{`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`yar`j`{`j`{`wae`y`y`yae`w`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`j`q`y`j`y`y`j`j`y`j`y`y`q`yae`yae`w`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`{`yae`yae`y`j`y`{`j`y`q`{`yae`y`y`yae`j`yad`jad`yadadadadadadad`j`yad`y`j`j`y`j`y`j`y`w`j`y`j`y`j`y`j`y`j`j`y`j`j`y`j`y`j`a`a`a`a", +"atatatatar`yar`y`{`j`{`y`jar`y`yae`w`yaear`y`{`{ar`yarae`y`yar`{`y`{ae`{`yar`y`{`{`{`{ar`yaear`y`y`q`{`y`y`j`{`{`j`{`y`y`{`j`y`{`y`y`{`y`r`y`y`{`y`{`y`{`wae`y`q`y`y`j`pad`jad`y`q`y`j`y`y`y`j`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`{`j`y`y`jar`yar`j`{`y`j`{`w`y`jar`y`j`y`y`j`w`j`{`q`{`y`y`j`w`{`j`y`y`j`y`w`{`j`w`{`yae`y`q`y`j`{`j`y`w`y`j`y`y`w`{`y`{`{`w`yae`y`w`j`{`ja``j`{`j`y`j`{`y`j`y`ra``y`j`}`}`}`}`}`}`}`}`}`}`}`j`y`j`ja``jadad`padadadadajadadag`gad`p`y`j`y`yae`w`y`y`y`j`w`yar`j`w`jar`j`y`y`j`y`j`q`{`y`q`y`j`w`y`j`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ae`w`{`j`yae`w`y`w`y`j`w`y`j`y`w`jar`j`y`j`{`w`j`y`q`y`j`{`w`j`{`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`w`y`w`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`g`n`iag`gagag`gagag`g`i`m`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`j`q`y`j`{`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`{`{`y`w`y`q`{`j`y`j`yar`y`j`{`yae`yar`yae`y`w`j`{`y`y`yar`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`yar`y`y`{`w`{`{`{`w`{`q`{`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`y`y`y`j`y`jad`y`y`y`j`yae`y`y`y`{`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ae`y`w`j`w`{`y`j`y`{`y`{`j`w`y`j`y`j`y`j`y`j`jadadadadadad`j`j`y`j`y`y`j`y`j`y`{`j`w`j`y`j`y`j`y`j`y`j`y`y`j`y`y`j`yah`j`a`a`a`a", +"atatatat`{ae`y`j`{`yae`{`{`{`wae`{`y`y`{arae`w`j`{`{`{`r`{`yae`w`{`q`{`y`{`{`r`{`w`{`j`{`y`j`yae`y`{ar`j`{`q`yar`y`r`{`jar`{`waear`y`{`j`{`wae`y`r`y`{`j`{`w`j`{`j`w`y`y`qad`j`y`j`j`w`j`q`y`jad`w`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`q`{`q`y`y`j`j`yar`j`w`yae`y`{`wae`y`y`r`y`y`{`j`y`j`w`j`j`y`j`w`y`q`{`j`w`j`y`j`w`jar`yar`y`j`w`y`j`j`{`j`{`q`yae`w`j`q`j`y`q`yae`yad`w`j`q`y`w`j`y`p`y`j`y`j`y`j`q`}`}`}`}`}`}`}`}`}`}`}`}`}`q`y`q`jadadadadadajad`g`pagadadad`jad`y`q`y`j`y`jar`jar`j`y`j`y`j`y`y`j`w`j`{`q`y`yae`y`j`y`j`{`j`w`j`y`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`{`y`q`y`y`yae`j`yar`j`y`q`{`j`y`j`y`j`w`yae`y`w`j`y`j`w`j`j`y`{`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`{`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`gag`g`i`gagag`i`mag`nag`h`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`jar`j`y`w`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`q`j`{`j`{`yar`y`r`{`j`yae`w`yae`y`{`y`r`y`{`yae`w`{ae`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`yae`{`j`{`yae`w`j`{`{`y`j`{`{`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`j`y`j`y`j`y`j`y`j`y`j`y`yae`wae`w`yae`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`yae`y`j`{`j`w`{`j`{`j`y`{`j`j`y`j`y`jad`jad`yad`~ajad`yadad`y`j`y`j`y`j`y`j`j`y`j`y`yae`y`y`j`y`q`y`jae`y`y`j`y`j`y`j`j`a`a`a`a", +"atatatat`j`{`y`{`q`{`w`y`j`y`{ae`{`w`{`r`{`y`y`{`{ar`y`{`y`q`{`{`y`{aear`y`q`{`yaear`{`yar`y`{ar`jar`j`yar`y`{`{`j`{`y`q`{`{`j`{`y`{`q`{`w`j`yarae`y`y`{`j`y`{`j`y`{`y`r`yad`{ad`p`y`jad`y`j`q`y`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`y`j`w`{`j`w`y`j`y`{`y`r`{`y`{`j`w`{`yae`y`{ar`y`y`j`{`y`yae`y`j`{`q`y`yae`y`j`y`{`y`j`yae`w`y`{`j`y`w`y`w`j`y`j`y`j`y`y`j`y`y`j`wae`y`y`j`y`j`y`y`j`y`y`j`yad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`jadadadadadagad`gadadadad`g`q`y`y`q`y`j`y`q`yae`y`y`j`y`wae`y`wae`wae`y`w`j`w`{`y`q`yae`y`w`j`y`j`y`q`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`w`yae`y`w`j`y`q`yae`y`y`j`y`q`y`yae`y`y`q`{`j`y`j`y`y`j`y`y`q`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ar`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}agagacag`n`i`n`g`i`g`gadadad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`{`y`y`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`yar`y`y`{ae`yae`y`y`{`y`w`y`{`yar`j`{`j`{`y`{`wae`y`{`yae`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`{`j`w`yar`yar`yae`y`y`yae`w`{`j`w`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`y`y`j`y`j`y`y`j`j`y`y`j`{`q`yae`y`y`y`q`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`w`y`j`y`j`y`j`w`yae`y`j`y`j`y`j`y`jad`yadadadadadada`ad`j`y`y`j`d`y`y`j`y`y`q`y`y`j`j`y`y`j`y`y`j`y`y`y`j`y`j`j`y`j`y`a`a`a`a", +"atatatatar`{`j`{`yae`{ar`{ar`y`j`{`{`j`{`j`{`jar`j`{`wae`{`{ar`jar`{`y`{`yae`w`{`yae`{`yaear`j`y`{`j`y`yae`w`y`wae`y`{`w`{`w`{`y`r`y`yae`{`y`yar`y`q`{ar`y`j`{`w`j`y`j`y`y`j`w`yad`j`j`sad`y`j`j`s`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`y`y`j`y`j`yar`j`y`j`yae`w`{`j`y`j`wae`y`w`j`j`y`q`y`q`y`q`y`j`w`y`j`yar`y`{`q`yae`w`{`j`yae`w`{`q`yae`y`j`w`j`y`y`j`w`j`j`y`j`y`w`j`{`j`y`j`y`q`yae`q`y`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}adadadadadad`padadagad`gadad`j`j`w`y`jar`y`yae`w`yae`w`j`y`j`{`y`j`y`w`j`{`j`y`q`y`j`w`y`j`{`y`wae`y`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`{`j`yar`j`y`q`{`y`j`wae`y`wae`y`q`j`w`y`j`y`j`y`r`{`q`{`j`q`y`j`y`{`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`q`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}asagac`cac`hac`gadajad`jadad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`wae`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`{`j`wae`y`w`j`{`w`j`{`q`{`j`r`y`j`{`w`j`y`r`y`{`j`{`q`y`{ar`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`y`{`jae`y`yaear`yae`yae`y`wae`y`{`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`y`j`y`y`j`j`y`j`y`j`y`j`y`y`y`j`yar`j`{`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ae`y`{`j`yae`y`j`{`j`y`j`y`q`yadad`jadad`jadadadad`y`j`y`j`y`j`j`~`{`j`{`j`y`j`{`j`y`w`j`y`j`w`j`y`j`y`j`y`j`y`y`j`j`y`a`a`a`a", +"atatatat`{`j`w`{ar`y`j`y`{`j`{ar`j`{`w`yar`jar`y`{`{`y`{`{`wae`y`{`w`{ae`w`{`{`{`q`{`y`w`{`yar`y`{ar`{`q`{`j`{`j`{`yar`j`yae`y`q`{`y`y`jar`yar`j`{`y`{`yae`yar`{`j`w`yae`y`q`{`j`yadad`ja``j`ja``j`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`w`j`{`wae`w`y`jar`y`q`y`{`j`{`y`w`{`{`y`y`yae`w`y`yae`y`{`y`j`y`{`j`j`y`j`j`y`{`w`j`j`yae`y`y`y`j`y`y`y`r`y`y`j`j`wae`yada``q`j`y`j`y`y`q`y`ja``j`y`ja``j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}adadadadad`gadadadadad`y`j`w`y`y`j`y`j`y`q`yar`y`q`{`y`j`{`w`j`y`q`{`y`jar`y`yae`y`{`j`{`j`w`j`j`y`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`y`w`j`y`yae`y`q`y`j`y`q`yae`y`y`y`j`{`w`j`y`q`y`y`j`y`y`{`y`w`{`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`iacacaaacacagadad`pa`adad`yad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`yae`w`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`{`yae`y`{`j`yar`j`{`y`yae`y`y`{`y`y`q`{`y`{`yae`w`{`y`{`wae`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`{`w`{`y`{`jar`yae`y`y`{`y`{`j`{`w`{`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`j`y`j`y`j`y`ya``j`y`y`y`j`{`yae`w`{`y`yae`y`w`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`j`{`j`y`y`j`y`{`y`y`y`y`j`y`j`jada``jada``jad`j`y`j`w`j`{`y`y`y`j`w`y`j`y`y`j`y`{`j`{`j`y`j`y`yae`y`j`y`j`y`j`y`j`y`a`a`a`a", +"atatatatae`{`y`j`{`{`yae`y`{`j`yarah`e`{`y`w`{ae`y`wae`yar`y`{ae`yar`{`y`{ar`{`y`y`r`{`y`yae`{`w`y`j`{`y`q`y`{`wae`{`y`yar`{`{`y`r`yar`y`{`yae`yar`jar`y`{`q`y`j`y`{`q`{`ya`ae`y`j`w`j`g`j`j`j`yad`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`q`y`j`yae`y`j`{`w`yae`w`y`r`yae`w`j`y`q`yae`y`q`y`y`q`yae`y`y`q`y`y`q`y`j`y`j`{`j`w`y`jar`y`jar`y`j`{`y`r`y`y`j`w`yae`y`j`y`j`w`j`y`jad`w`j`j`w`y`j`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ajad`gajadadad`w`j`w`y`q`y`jar`j`y`q`{`j`y`j`{`y`j`y`q`y`j`y`jar`y`j`y`y`j`q`y`wae`w`y`j`yae`y`w`j`w`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`yae`y`r`y`{`yaea``w`j`j`y`j`w`j`wae`j`y`{`q`{`y`q`jar`j`j`q`y`j`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`nasaaaaas`gadad`jadadad`jad`q`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`q`y`j`{`w`{`j`{`y`r`j`{`wae`j`wae`y`yae`w`yae`y`y`r`y`{`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`j`yae`wae`y`{`j`w`{`j`{`q`y`{`j`{`j`{`q`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`y`j`y`j`y`j`{`j`y`jar`j`y`y`w`yae`j`yar`j`y`j`{`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`j`y`y`j`y`j`w`j`j`jae`y`jad`jad`jad`jadad`ja``j`y`j`yar`j`j`j`y`y`j`j`y`j`j`y`j`y`j`y`j`y`d`y`j`y`j`y`j`y`j`y`j`y`j`a`a`a`a", +"atatatat`{`y`q`yae`y`q`{`wae`yar`{ae`y`yar`{ae`yae`{`w`{`{`j`y`wae`yaear`yae`y`r`y`{`y`{`r`{`{`w`{`{`{`j`y`{`r`y`{`j`yar`jar`y`j`{`y`{`j`{`j`yar`{`j`y`y`r`y`j`y`{`j`yar`y`q`y`q`yad`j`padadadadadad`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`{`j`y`y`r`y`j`y`r`y`y`y`j`{`y`yae`w`yae`y`{`y`j`{`y`j`w`j`y`y`q`y`j`y`j`w`y`q`y`y`j`y`q`y`{`j`w`y`{`j`y`w`j`y`y`j`w`j`y`j`ja``j`j`y`j`y`q`y`j`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}adad`padad`j`p`{`y`j`y`j`{`y`y`r`y`y`yar`y`y`wae`y`w`j`y`j`y`w`j`y`y`j`w`j`{`y`j`{`y`j`{ae`w`yae`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`jar`j`{`y`j`w`j`{`jar`y`y`q`{`y`j`y`y`q`{`y`q`yae`y`y`w`y`j`{`w`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}acaaaaacacadad`qad`j`pa``jad`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`w`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`yae`w`y`{`j`y`yar`j`y`{`j`yar`y`{`y`r`y`{`y`{`y`r`y`{`y`r`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`y`q`y`y`j`w`j`yae`y`{`y`j`{`y`q`y`{`w`{`j`}`}`}`}`}`}`}`}`}`}`}`}`}`j`y`j`y`{`y`y`{`j`y`wae`y`y`y`r`yae`y`{`y`yae`y`{`w`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`y`y`j`j`y`y`j`y`j`y`y`j`y`y`jada``ja`ad`ja``j`y`y`{`j`j`y`y`y`j`y`j`y`y`j`{`y`j`y`j`y`y`j`y`j`y`j`y`y`j`{`y`j`y`j`y`a`a`a`a", +"atatatatar`y`{`y`{ae`y`{`y`{`w`j`{`w`j`{ae`y`y`y`{ae`yar`{`y`{`{`{`w`yae`y`{`y`{`q`{`{`y`{`yae`y`r`y`y`jar`y`y`q`y`{ae`{`y`{ar`{`{`j`w`y`{`wae`y`{ar`j`y`{`w`{ar`y`y`j`{`y`{`j`y`w`y`j`ya``padad`gadad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`yar`j`y`yar`y`j`{`wae`w`y`j`w`yae`yar`j`w`j`{`w`j`y`{`y`wae`y`y`j`y`j`y`j`y`y`j`w`j`y`y`q`j`y`j`w`j`y`yae`w`j`y`j`y`wad`jad`ja``jad`w`jad`y`j`ja``}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}adad`w`y`y`wae`{`w`jar`j`w`y`{`q`j`y`j`q`{`j`y`q`{`y`j`w`{`j`w`j`y`j`y`wae`y`w`j`w`y`w`{`j`yar`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`y`j`w`j`yae`w`j`y`j`w`j`y`j`w`yae`w`y`j`{`y`w`j`{`j`yae`w`y`j`{`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`n`caaaaas`i`gadad`jadad`jad`wad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`y`j`{`q`yae`yae`y`y`q`{`wae`yae`y`j`{ar`j`wae`{`y`{`qae`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`q`y`j`y`j`j`y`{`wae`yar`j`{`w`j`{`j`y`y`jar`y`j`y`}`}`}`}`}`}`}`}`y`j`y`j`y`y`j`j`{`y`j`y`y`{`j`wae`y`j`y`w`j`{`q`y`{`r`y`{`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ad`j`y`j`y`j`w`d`y`y`j`j`yad`jadad`yad`jad`y`j`j`y`wae`y`j`j`y`y`j`y`j`y`j`w`j`y`j`yae`y`{`j`y`y`j`y`j`y`j`y`y`j`j`y`j`a`a`a`a", +"atatatat`y`{`jar`y`jar`{`q`{`jar`yae`y`{`wae`yar`{`w`{`j`{`q`{ar`j`{ar`y`{`w`{`q`{`{`yae`w`{`wae`y`{`w`{`{`jar`{`j`{`q`y`wae`y`j`w`{`j`{`wae`y`{`y`{`j`w`{`j`{`j`y`r`y`q`y`j`y`wae`j`y`w`j`jadad`gag`iag`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`j`y`q`j`j`y`{`j`y`yaear`yae`y`w`j`y`y`q`y`j`y`y`q`y`j`{`y`q`j`y`j`q`y`y`r`y`{`yar`j`y`j`y`w`y`j`y`q`y`j`wae`y`j`y`j`yada``jadadadadadad`j`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`q`y`y`y`r`y`{`y`j`y`{`w`j`yae`y`yae`y`{`y`j`w`y`{`{`q`y`{`j`y`j`w`j`w`{`jar`j`y`{ae`yae`y`{`q`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`q`y`j`y`jar`y`j`y`q`{`j`{`y`y`r`j`y`{`j`w`j`j`{`y`q`{`q`y`j`yar`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}acabac`c`nagadada``jad`ja``j`j`j`s`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`{`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`{`q`j`y`{`w`j`y`wae`y`yae`y`{`w`j`{`y`{`j`{`q`{`y`r`y`{`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`j`{`q`{`w`j`j`y`j`y`j`yae`y`j`{`y`y`r`{`j`{`j`{`yarae`y`q`j`y`j`y`j`y`y`j`y`j`y`y`j`wae`yae`w`{`y`j`yarae`y`{`j`y`j`y`{`jar`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`jad`j`{`j`y`j`y`j`y`j`ja``jad`jad`yadad`j`y`{`j`j`y`p`{`y`{`j`w`j`y`{`j`y`j`y`j`y`j`y`j`w`j`y`j`y`y`j`y`{`j`y`y`j`a`a`a`a", +"atatatat`j`{`{`j`{`yae`y`{`{`y`{ar`{ar`y`{`{`yae`y`{`w`{`{`y`{`{ar`yae`{ae`y`{`{ar`jar`y`{`y`{`{`q`{`{`j`yar`j`y`w`{`y`{`j`{`j`y`{ar`y`j`{ar`y`q`{`y`yae`w`{`y`yae`y`{`{`q`y`j`{`y`w`j`y`y`wadadag`g`naa`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`w`j`y`y`q`y`j`{`w`j`y`{`y`q`{`y`{`q`{`y`wae`y`y`y`r`y`y`j`y`y`q`y`ja``j`y`j`yae`y`{`yar`j`j`y`q`y`j`y`y`y`w`j`w`y`q`y`q`y`jadadadadad`gad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`{`q`yae`y`q`{`q`{`yae`yar`y`w`{`w`{`q`y`{`wae`y`q`y`{`j`w`j`{`y`y`j`j`y`y`y`r`y`j`w`y`y`j`y`{`q`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`j`w`j`y`yae`w`y`yae`w`wae`y`y`r`y`y`q`{`j`w`j`y`j`w`j`y`j`wae`y`q`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}acaaaa`n`h`gad`ja``j`pa`ad`j`yad`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`w`yae`w`j`y`j`{`yae`w`y`{`q`y`{`yae`w`yae`w`{`y`{`j`y`wae`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ae`{`w`y`j`y`j`y`w`j`j`w`y`j`yar`y`r`y`{`j`y`y`j`{`j`y`j`y`j`y`j`y`j`y`j`y`j`{`w`j`j`{`y`jar`y`j`y`j`{`w`j`y`y`q`{`w`yae`yae`y`jar`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}a`ad`jad`y`j`j`y`j`yadadadadadadad`j`y`j`y`j`y`y`y`j`y`y`j`j`y`yae`y`w`j`y`j`y`j`y`j`y`y`j`j`y`j`yae`y`j`y`j`y`j`y`y`a`a`a`a", +"atatatat`y`{ae`{`wae`y`{ae`yarae`yae`y`j`{`q`{`w`{`q`{`yae`{ar`j`yae`yar`yar`yar`j`{`y`{`j`w`{`r`y`{`y`{ar`y`{`{`y`{`jae`w`{ar`{`q`yae`w`{`j`{`yar`{`q`y`{ae`w`{`wae`w`j`{`y`w`{`q`j`{`j`j`y`j`jad`g`naa`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`w`j`{`j`y`w`j`y`j`y`r`y`{`j`j`y`{`j`{`{`w`yae`y`j`w`jar`j`y`jarad`{`j`{`y`q`y`y`q`j`y`y`j`{`j`w`y`j`q`yae`y`j`y`j`j`yad`yadad`g`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`y`j`y`p`{`y`j`y`j`{`q`y`yae`j`y`j`{`y`q`yae`y`y`{`j`w`yae`y`w`jar`y`w`j`r`y`yae`y`y`qae`y`q`{`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ar`y`j`y`r`y`yae`w`j`yae`y`q`{`j`y`j`{`w`{`y`j`y`q`yae`y`wae`y`q`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`cacac`g`gadad`j`j`p`y`j`jad`s`j`y`q`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`j`y`j`y`y`wae`y`w`j`{`j`wae`y`j`j`w`j`y`{`jar`yae`w`{`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`j`{`j`yar`j`y`y`jad`y`j`q`y`j`j`y`j`y`j`{`w`{`j`w`jar`y`j`w`j`j`y`j`yaear`y`j`j`y`y`j`{`j`y`j`{`y`j`y`{`j`y`j`{`y`{`jar`y`q`y`{`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`yadadadad`y`y`j`yad`jadadadadada``j`j`y`y`j`y`j`y`j`y`j`{`j`y`j`w`yae`yae`y`j`y`j`y`y`j`y`y`j`w`{`y`j`y`j`y`y`j`y`j`a`a`a`a", +"atatatat`{`w`j`y`{`yar`y`yae`{`w`yae`{`yar`j`{`y`{`{`yar`y`{`y`{ar`y`{`y`r`y`{`yar`y`{`r`y`{`{`yar`jar`j`y`q`{`w`y`{`y`y`j`{`j`yar`y`{`y`wae`y`y`j`{`y`w`yae`y`{`y`{`j`w`yae`y`y`{a``q`y`j`w`y`jadad`gac`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`y`w`yae`y`w`j`wae`y`q`y`{`w`{`y`q`y`j`{`j`y`{`j`y`y`y`q`{`y`j`y`w`{`q`y`{`{`w`{`yar`y`y`y`{`j`w`y`j`y`j`w`j`y`y`q`y`j`j`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ar`y`{`j`{`p`{`y`w`yarae`yar`y`yar`yae`y`yar`jar`y`j`{`j`w`j`y`y`j`yae`y`y`j`w`yae`y`y`yae`y`yar`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`jar`j`y`yae`w`y`{`r`y`y`j`w`y`{`q`y`j`y`q`y`y`j`y`q`y`j`y`j`y`y`q`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}aaaaasagadadad`ja`adad`qada``j`j`ja``j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`jad`y`j`y`j`y`j`{`y`{`j`{`w`j`{`w`{`j`{`j`y`{`jar`y`j`y`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`{`w`y`jae`w`{`j`y`y`w`jad`y`j`y`j`w`j`y`j`w`j`{`y`y`j`j`y`j`yad`w`y`j`y`j`w`y`y`{`q`y`y`y`j`w`y`j`w`j`{`w`j`y`j`{`w`j`y`j`y`j`w`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`jadadadadadadadadadagad`gadad`jad`y`j`y`j`yae`w`j`w`y`j`yar`j`y`j`y`y`j`y`j`y`j`y`j`j`y`j`yae`y`j`y`j`y`{`j`y`j`y`y`a`a`a`a", +"atatatat`j`{`yae`y`{`j`jar`j`{`wae`yae`w`{`{`{`{ar`jar`yae`{ae`wae`{`jar`j`{`w`{aear`j`{`yae`y`{`j`y`{`yae`y`{ae`y`{`qae`w`y`j`w`{`yae`w`j`y`j`y`q`y`r`y`{ae`y`{`qae`w`j`{`j`y`w`j`{`j`{`j`y`j`y`j`w`y`g`n`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`yae`w`j`y`j`y`j`y`j`yae`y`j`w`j`y`j`y`j`y`q`yae`y`wae`y`j`y`{`j`j`j`y`y`jarae`y`j`{`yae`yae`w`y`j`y`w`j`y`j`y`j`j`y`qa``}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`j`y`q`{`y`yae`q`yae`y`w`yae`{`j`y`r`yar`y`j`y`y`q`y`w`{`y`r`y`{ar`j`y`y`q`{`yae`y`jar`jar`y`j`{`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`j`w`jar`j`{`y`j`{`w`{`j`y`q`{`y`j`wae`j`y`q`y`y`j`w`j`y`y`q`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}aa`magadadadadad`jad`qad`jad`q`ja``q`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`ja``j`j`j`w`y`r`yae`w`j`y`y`{ae`y`yae`y`w`y`j`w`y`yae`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`jar`jae`w`y`j`{`y`j`{`q`y`j`j`s`j`q`j`y`j`w`{`j`y`j`y`q`y`j`y`j`w`j`jar`j`y`y`j`j`y`j`y`q`yae`y`j`y`jar`y`j`y`j`w`{`j`y`yae`y`y`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`~adadadadajadad`iad`gadad`jad`y`j`j`y`j`y`j`y`y`j`j`y`y`j`y`y`j`{`y`j`y`j`y`y`j`y`j`{`y`j`yae`y`y`j`y`j`y`j`yae`y`a`a`a`a", +"atatatat`y`{ar`y`{`y`{`y`{`{`q`{`y`y`yae`wae`y`{ar`{`y`{ar`{`{`yar`{`y`{`{`y`{`q`{`y`{ar`j`w`{aear`yar`{`y`wae`y`w`{`{`y`{`{`y`j`wae`y`{`{`wae`y`yar`y`y`q`{`y`y`{`y`{`w`{`j`y`j`{`y`y`q`y`w`j`j`yad`qad`g`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`y`q`{`w`{`y`w`y`y`j`y`{`wae`y`y`q`y`y`y`j`j`w`y`{`w`jar`y`y`{`j`w`y`yar`y`{`q`{`w`{`{`j`w`y`{`j`y`q`y`j`yadad`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`y`{`jar`j`w`y`{`j`wae`y`q`{`w`{`y`{`{`y`r`y`{`j`yae`y`{`j`y`q`yae`y`w`{`y`{`w`j`w`y`y`j`{`w`{`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`{`y`y`j`y`q`yae`y`q`y`j`{`y`q`{`y`j`w`y`y`jar`j`y`j`w`j`y`j`y`j`w`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}asajad`pad`j`wadad`yad`y`qadad`yad`y`w`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ad`j`y`q`y`j`y`j`y`y`j`wae`y`j`yar`y`{`j`y`{`j`{`j`{`w`{`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`w`yae`y`y`y`r`y`w`yae`y`y`q`y`y`j`y`j`y`y`j`j`y`wae`y`w`j`y`ja``j`ja``y`j`y`j`w`j`y`y`j`{`j`w`y`j`yar`j`y`q`y`j`yae`y`q`y`{`j`w`j`y`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}adadada``jadadadad`gadadad`ja``y`j`y`y`y`j`y`q`y`yae`y`q`y`y`j`y`j`y`j`{`yae`y`j`y`y`j`y`yad`y`j`yae`y`y`j`y`j`y`{`a`a`a`a", +"atatatatar`j`{`j`{`qae`yar`j`{`{`jarae`{`q`{`y`wae`yae`y`{ae`w`{`{`jar`yae`wae`y`{`{ar`y`{`{`jar`y`{`yae`y`{`j`w`{`j`{`j`y`{`q`y`{`yar`j`w`j`{`w`{`j`{`q`{`y`j`{`q`y`r`yae`q`y`w`{`j`w`j`y`j`y`j`yad`y`jad`g`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`{`j`y`yae`y`jar`j`y`q`y`jad`wae`y`j`yae`w`y`{`j`y`j`{`j`y`q`j`{`y`{`j`y`r`y`{`y`{`j`w`{`yae`y`w`y`{ad`j`w`j`q`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ae`yae`y`r`y`y`yae`y`j`w`{ae`y`yae`y`j`j`{`q`y`yae`yar`y`{`w`jar`{`y`{`wae`yae`w`j`{`{ae`y`jar`y`j`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`{`q`j`y`wae`y`y`q`y`wah`r`y`wae`y`q`y`{`j`q`{`j`y`w`j`y`j`y`q`j`w`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`i`gad`j`y`p`jad`jad`qadad`j`y`j`y`q`y`j`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`jadadad`jad`j`y`j`w`jae`y`y`j`w`{`j`j`y`q`yae`w`y`q`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`j`w`j`y`w`j`yae`y`j`{`w`j`{`y`q`y`j`wad`jad`jad`j`j`j`y`jad`jad`y`j`yae`w`y`j`y`j`w`j`j`y`y`j`y`w`j`y`j`y`{`j`y`j`y`j`y`j`w`j`y`j`{`q`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}adadad`j`yad`yadad`jad`jad`y`j`j`j`y`j`q`yae`y`{`j`y`j`y`yae`yae`y`j`y`w`j`y`j`yar`j`y`j`j`y`j`{`j`y`j`j`yae`y`y`j`a`a`a`a", +"atatatat`{`j`y`{`y`{`wae`yar`y`{`y`{`w`{`{`j`{ar`y`{`{`q`{`{`{`q`{`{`{ar`{`{`wae`{`y`{`q`{`y`{`{ar`jar`yar`{`yae`y`wae`w`y`{`{`j`y`yae`y`yar`{`jar`{`yae`yar`y`jar`{`y`y`{`yae`y`r`y`yar`j`y`w`{`j`w`j`ja`ad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`w`j`q`y`y`j`{`j`y`jar`y`y`y`q`{`yar`j`yar`j`w`y`j`w`j`y`y`q`y`j`{`y`w`{`jar`y`{`j`w`{`{`j`yar`j`w`y`{`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`w`y`j`yar`j`yar`y`j`{`y`w`{`w`{`w`y`w`j`y`r`y`{`yaear`y`{`y`j`{`q`y`j`w`{`{`y`w`j`w`y`y`j`{`w`y`{`w`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`{`y`j`wae`yae`yae`wae`y`yae`{`y`q`{`y`j`w`j`y`y`j`w`y`j`y`j`j`w`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}agadadad`j`ja``y`p`yad`y`j`s`j`y`j`j`y`j`w`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`yada``w`j`y`j`y`{`w`j`{`q`{`j`w`y`jar`y`{`q`{`y`y`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ae`y`yae`w`y`yae`w`y`j`{`y`yar`j`y`j`y`j`y`y`q`y`jadad`y`jad`y`qa``jad`y`j`y`j`y`y`q`y`y`q`y`j`y`q`y`j`y`j`w`j`y`q`y`y`j`w`j`yae`y`w`y`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ad`yad`j`y`jadad`y`y`j`y`j`y`j`y`j`y`j`y`j`y`j`y`j`yae`y`yar`y`{`y`j`y`y`j`{`y`y`j`y`{a``j`y`y`j`y`y`yae`y`j`j`y`a`a`a`a", +"atatatat`yar`j`{`{`q`{`{`j`{ae`yar`j`{`y`q`{`{`yae`y`r`y`{`{`y`{`j`yar`j`y`{`y`{`{`r`y`yae`w`{`w`j`{`yae`y`yaear`y`jar`yae`y`jar`jar`j`{`yae`j`y`y`{`j`w`y`jae`w`{`{`j`w`jar`y`wae`y`j`y`j`{`y`j`j`{`s`j`jadad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`q`{`j`y`j`y`ja``j`{`j`y`yae`y`q`y`j`y`jar`j`y`w`j`ja``q`{`j`{`{`j`{`w`{ae`y`r`yae`w`y`{`y`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`{`q`y`j`y`j`w`j`{`j`y`wae`j`y`jae`yae`y`q`y`{`wae`w`y`{`q`w`{`q`y`{`{`y`j`jar`j`{`yae`y`r`y`yae`wae`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`w`{`q`yae`y`w`j`{`w`y`j`y`y`w`j`y`w`{`j`w`y`j`y`j`q`j`j`y`q`j`w`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}adadad`p`yad`pad`j`jad`y`j`j`y`q`j`y`q`y`j`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`s`jad`q`j`j`y`j`jar`j`y`j`y`j`y`{`j`{`y`{`q`y`j`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`w`j`w`{`j`{`j`y`j`y`q`y`j`j`y`j`y`j`j`w`y`j`j`sad`y`jadad`jad`jad`j`y`q`j`y`q`y`j`j`y`j`{`w`j`y`j`y`q`y`j`y`q`y`j`y`j`j`y`w`j`{`j`yae`w`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}adad`j`y`jadad`ja``j`j`w`j`w`jad`yad`y`j`y`j`y`j`y`y`j`w`j`y`j`q`y`j`jae`y`j`j`y`j`{`j`y`j`j`y`jae`y`j`yad`j`y`j`a`a`a`a", +"atatatatae`yar`j`y`{`yar`y`{`y`{`jar`j`{`yaear`y`r`{`y`j`wae`y`q`y`{`jar`yae`w`w`y`{`w`{`{`{ae`yar`{`w`{`{`q`y`{`{`y`{ar`{`w`{`y`y`yar`y`w`j`y`q`yae`y`{ar`{`y`jar`y`y`{`j`y`j`w`{`{`w`j`wae`w`y`j`y`y`j`pa`adaj`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`w`ja``j`w`j`y`q`{`j`w`j`y`y`{`j`w`yae`y`{`y`j`y`w`j`ja``q`{`y`j`w`{`w`{`y`j`{`w`jae`{`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`{`j`y`yae`y`y`{`q`{`wae`y`w`jar`y`yarae`y`y`{`jar`yae`y`y`j`{`{`w`jar`y`q`y`y`j`w`{`j`y`y`r`y`j`y`y`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`y`{`j`y`j`y`j`y`{`q`{`yae`y`j`{`j`w`{`j`wae`y`y`j`y`w`j`y`j`j`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}adad`ja``q`ja``y`qad`w`j`y`j`w`y`j`s`yae`w`y`q`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`jada``jad`w`y`y`j`w`y`j`y`q`y`w`j`yae`y`yae`w`y`w`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`{`j`{`j`yar`j`yae`y`j`{`j`w`y`j`w`y`j`yae`y`y`j`y`q`j`yad`y`ja``j`w`j`y`y`j`y`y`r`y`y`j`j`y`y`j`j`y`y`jar`y`j`yae`y`w`j`y`y`j`y`w`y`j`y`{`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`yadad`ja``y`j`j`y`j`ja``j`y`j`w`j`y`j`y`j`y`wae`y`y`j`y`j`y`y`y`j`y`y`y`j`y`j`y`j`y`y`y`{`y`y`j`y`yae`y`y`j`y`a`a`a`a", +"atatatat`j`y`{`{`{`y`r`yae`y`r`{ar`y`{`y`{`w`yae`y`{`yar`{`yar`{`y`{ar`j`{ar`y`{ae`{`y`q`{ae`y`w`{`y`j`{`r`y`{ar`j`yar`j`{`y`{ae`y`r`y`{`j`y`{`{`q`y`{`q`{`j`y`q`yae`{`q`y`r`y`y`j`y`j`w`j`{`y`j`{`y`q`j`yadadad`g`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`w`j`y`j`w`j`y`j`y`y`{`j`w`j`{`y`w`j`j`j`w`j`y`j`y`w`{`j`w`{`wae`y`j`y`{`w`j`{`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`w`j`yar`j`y`r`y`y`q`y`y`q`{`y`j`wae`y`y`w`{`j`w`{`j`{`w`j`w`{`w`j`{`{`j`y`{`r`y`{`j`w`{`q`{`y`y`{ae`w`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`yae`q`y`r`y`j`yar`j`y`{`q`y`jar`y`q`y`j`y`j`w`y`q`y`q`j`y`j`j`y`w`j`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`p`jada``j`jad`jad`yad`y`q`j`y`j`j`y`j`y`j`j`y`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`jad`y`j`s`j`j`y`j`j`{`j`y`j`yarae`y`{`wae`yar`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`yar`j`y`{`j`y`q`y`j`w`j`w`y`j`y`j`y`jar`j`y`q`j`y`j`y`j`yad`j`y`jad`y`j`y`q`j`y`j`y`j`w`j`y`j`j`y`jar`j`y`j`y`j`w`yae`y`q`y`j`j`y`j`wae`y`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}adadad`qa``j`j`y`y`ja``y`j`j`y`y`j`y`j`y`j`y`j`y`j`y`j`{`y`j`{`j`y`y`y`j`j`w`y`j`y`j`y`j`jae`y`j`{`j`j`y`j`j`y`a`a`a`a", +"atatatat`{`q`{`j`{`y`{`waea``yae`yar`{`r`y`{`w`{`q`{ae`y`{ae`yae`w`{`j`{`y`{ar`y`yar`{`{`w`yae`{`jar`y`y`yae`w`y`{ae`yar`jar`y`{`{`{`q`{`w`j`{`j`y`q`{`y`r`y`{`y`j`y`{`w`j`{`{`q`{`y`jar`yae`s`j`q`y`yad`j`jadadadag`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`j`w`j`w`jae`w`y`y`j`w`j`y`{`wad`y`rad`y`j`j`y`wae`y`y`jar`y`j`y`j`y`w`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`yae`yae`w`y`yae`y`w`{`j`{`y`j`y`w`{`j`y`j`{`j`w`{`y`j`y`y`{`{`yae`y`y`w`j`{`y`y`{`q`y`{`j`{`{ar`j`y`w`{`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`y`j`w`j`y`wae`y`{`j`{`yar`j`y`{`y`r`{`w`{ae`y`w`y`y`j`s`j`qa``j`w`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}adad`j`p`jad`y`j`w`j`y`j`j`y`q`y`j`w`y`j`j`w`y`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ad`j`p`j`ja``q`y`j`y`jar`j`y`j`y`j`w`{`yae`y`yae`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`w`j`y`w`j`w`yae`y`y`y`j`{`j`w`j`w`j`y`y`y`j`y`j`y`y`jad`y`j`p`y`j`w`j`j`y`j`y`y`q`y`j`y`y`j`y`y`y`q`y`j`w`j`y`y`y`j`y`y`j`y`{`y`j`{`y`j`{`w`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`gad`j`y`j`y`y`j`y`jar`j`y`j`y`j`y`j`y`j`j`y`y`j`j`y`y`j`{`y`j`yae`y`j`y`y`j`y`j`y`y`j`y`yaq`j`y`y`y`j`y`y`j`y`a`a`a`a", +"atatatatae`y`w`{ae`w`{ae`y`{`{`wae`{`j`{`jar`{`j`{`y`w`{`jar`yar`yae`y`{`yar`{`yae`{`{`j`yae`w`{`{`j`w`{`y`r`y`yae`yar`j`{`y`{`{`j`w`yae`y`y`j`{`w`y`j`y`j`w`yae`w`{ar`j`{`y`w`j`y`jar`y`yar`j`y`y`j`y`j`wadadadaj`g`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`y`j`y`y`y`j`yae`y`j`w`j`y`j`y`j`y`yad`y`w`j`y`{`y`y`r`y`y`r`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`y`y`q`y`y`j`yar`y`jae`w`y`y`r`yae`y`w`j`y`q`{`yae`yar`{ar`j`w`{`j`w`{ae`y`q`{`q`{`{`yae`y`w`yae`y`{`jar`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`y`q`y`j`y`j`y`j`w`jar`w`j`y`{`j`w`j`yae`y`y`yae`y`r`j`y`j`y`j`y`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`jad`j`yad`y`qad`j`j`j`w`y`j`y`y`j`j`y`q`y`j`y`j`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`s`j`j`yad`q`y`j`{`j`w`y`y`j`w`yae`y`j`{`j`{`w`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`{`j`y`{`jar`y`j`yae`w`j`yar`y`j`y`j`y`j`j`y`j`w`j`w`j`q`y`j`j`y`j`yad`j`y`y`j`y`j`y`j`y`y`j`q`y`j`j`j`y`y`j`y`j`y`q`j`y`j`q`j`y`j`w`j`y`j`y`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`~ad`j`y`y`j`j`y`j`y`j`yad`y`j`y`j`y`q`y`j`yad`j`y`j`y`j`y`q`y`j`y`q`y`j`w`j`y`j`y`j`y`j`yae`y`j`y`j`yae`y`j`y`a`a`a`a", +"atatatat`r`{`y`yae`y`{`y`r`yae`j`w`y`{ar`y`j`{ar`j`{`j`y`{`{ae`yar`y`r`{`y`{`r`y`wae`yar`{`yae`w`{`yaear`{`yae`w`{`j`w`{`j`{`wae`y`{`wae`{`w`j`{`j`{ar`y`yae`{`y`{`j`{`q`y`{`jar`y`j`y`j`j`yae`w`yae`w`j`ja`adadadadad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`w`y`j`{`j`y`j`j`w`y`j`y`j`w`j`yae`y`j`y`r`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`{ar`yae`y`q`yae`{`w`j`y`j`wae`y`y`yae`{`w`j`y`j`w`jae`y`j`yae`y`wae`y`y`w`j`y`y`j`y`q`{`wae`yae`w`j`wae`y`q`{`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`j`y`w`j`q`y`j`y`j`y`j`{`q`y`yae`y`w`{`q`y`r`y`j`y`{`w`j`y`wae`y`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`p`yad`qadad`y`ja``j`y`j`q`{`j`y`j`w`j`y`j`y`q`y`j`w`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`y`p`yad`j`y`w`j`{`j`w`j`y`j`y`j`y`w`j`y`y`{`{`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`{`w`j`y`j`y`q`y`j`{`j`w`j`y`yae`y`q`{`w`j`y`j`y`j`y`j`y`q`y`ja``j`j`y`j`j`j`y`j`y`j`y`q`j`yad`j`y`j`y`j`j`y`j`y`j`y`w`j`y`y`q`y`j`y`y`q`y`j`y`r`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}adad`{`j`y`{`j`y`y`j`y`{`j`w`{`y`j`j`y`j`y`j`y`j`y`y`j`y`j`y`j`yae`y`j`y`j`y`j`y`y`j`y`j`w`y`j`y`j`y`j`y`y`j`y`a`a`a`a", +"atatatat`{`y`jar`{`{`j`{`y`j`{`y`{ar`{`j`{`yar`{`y`w`{`{ar`y`{`w`j`{`{`{`q`{`{`y`{`yar`{`yae`w`{`j`{`y`j`{`j`w`{ae`w`{`yae`w`j`{`w`j`{`y`{`q`y`{`yar`y`yae`w`j`y`q`{`q`y`y`y`r`y`y`j`{`w`{ae`w`y`j`{ad`y`y`qadadaj`gadad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`w`y`j`w`j`y`w`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ar`y`j`j`{`q`y`j`y`w`y`j`{`w`y`{`y`q`y`j`w`j`y`j`y`w`j`y`y`w`j`y`w`j`{`y`q`{ae`y`{`y`r`{`{`j`y`yar`j`y`{`wae`y`y`{`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`{`j`yar`y`{`y`j`y`{`q`y`y`q`y`{`y`j`q`y`ja``j`y`{`j`y`q`{`y`q`y`j`y`w`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ad`j`pad`j`y`ja``q`j`w`j`y`j`w`y`j`y`j`{`j`w`y`j`y`y`j`q`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`yad`jad`j`y`q`y`{`j`w`j`{`j`{`w`yar`j`y`yae`w`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`w`j`y`yae`y`yae`{`w`y`j`{`y`j`w`j`y`y`j`y`q`y`j`w`y`j`yad`y`j`j`yad`yad`ya``j`y`j`qa``j`yad`j`y`ja``j`wad`w`j`y`q`y`j`y`q`y`j`y`j`y`j`y`j`y`q`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}adad`y`j`y`y`j`y`j`w`{`j`w`y`j`y`w`j`y`y`j`y`j`y`j`w`y`j`j`y`y`j`y`y`j`y`j`y`y`j`y`j`y`j`y`j`y`j`y`y`j`y`jah`j`a`a`a`a", +"atatatatae`{`y`j`{`w`{ar`j`{`wae`y`yar`{`q`{`j`yae`{`wae`{`{`j`{`y`wae`y`yar`j`{`{ae`yar`{`y`{`jar`j`{`w`jar`y`y`j`y`{`w`y`{`y`j`{`wae`{`j`y`q`{`j`yae`w`y`{`j`w`{`y`{`q`y`{`j`w`yar`j`y`w`y`j`w`j`q`j`j`y`jadad`gajad`g`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`y`r`y`w`j`{`y`wae`yae`yae`y`jar`yae`y`j`w`y`q`yae`y`q`{`j`y`j`j`y`w`j`y`y`r`y`q`{`j`y`yar`jar`yae`{`w`y`{`yar`y`q`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`w`yae`q`y`j`{`q`y`j`y`q`y`j`y`j`w`y`j`warae`w`y`q`y`{`y`j`y`y`r`y`j`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ad`y`jadad`j`qad`yad`j`y`j`y`j`y`q`y`j`y`j`y`j`j`y`q`y`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`qad`y`q`j`y`y`q`y`{`y`q`{`j`{`j`y`y`r`j`y`{`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`yaear`y`r`y`j`y`y`j`{`j`{`jar`yae`w`y`j`j`w`y`j`y`j`j`y`j`y`p`ja``j`j`j`y`j`ja``j`yad`j`j`y`j`wad`y`j`y`j`y`j`j`y`j`y`yae`y`q`y`y`j`y`q`y`j`y`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ad`j`y`j`y`j`y`{`j`y`j`yae`y`{`j`{`w`j`{`w`y`j`j`y`j`y`j`y`j`y`j`y`yae`yae`y`y`j`y`j`y`j`y`j`yae`y`j`y`j`y`y`a`a`a`a", +"atatatatae`y`q`{`j`{`yae`yar`y`{aear`{`j`{`{ar`{`{`wae`{`{`w`{`yar`j`{ar`{`j`{`y`{`wae`y`y`yae`w`y`w`{`y`{`{`y`q`{`{`q`yae`{`y`wae`y`y`{`w`y`y`{`{`w`y`r`y`jar`y`yar`j`{`y`{`{`y`j`{`q`{`y`j`{`j`y`y`y`y`wad`jadadada`ad`q`y`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`j`{`y`y`y`j`yar`y`j`{`y`q`{`w`y`j`{`q`y`w`{`j`{`y`j`y`y`ja`ad`j`y`q`yae`y`j`y`{`{`y`q`{ar`yae`y`j`y`y`{`y`qae`y`r`y`{`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`w`j`{`y`y`w`j`y`{`wae`y`w`jae`w`y`j`j`y`j`y`j`y`{`j`q`y`r`y`q`y`j`w`j`{`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ad`qadad`p`ja``y`q`y`j`y`w`j`y`y`j`y`q`y`w`j`y`q`y`{`w`j`y`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}adad`yadad`yae`y`j`y`j`yae`w`y`{`j`wae`y`y`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`y`q`y`y`y`j`y`y`q`y`j`{`y`q`y`y`j`y`{`j`y`y`q`y`j`y`w`j`y`j`y`j`yad`y`j`ya``jadad`jadada``j`y`j`y`j`jad`y`jad`w`y`j`y`j`y`j`y`y`j`q`y`{`j`y`yae`y`q`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ad`y`j`y`y`j`{`y`q`{`y`q`{`y`w`j`y`y`y`j`yae`y`y`j`y`j`y`y`j`y`j`y`j`y`y`j`y`j`y`j`y`y`j`{`j`y`j`y`j`y`j`y`j`a`a`a`a", +"atatatat`{`y`yae`w`{`yae`y`{`y`{`y`{ar`{`yar`{`q`{`y`yae`y`y`r`{`y`yae`y`w`{`j`w`j`{`y`r`yae`y`yae`{`q`y`j`y`y`wae`y`{`wae`wae`y`r`y`{`j`{ar`j`{`j`{ar`j`{`yae`{`r`y`{`q`{`q`{`y`q`{`j`y`q`y`j`y`r`yaea`aeadad`gajad`gad`j`yae`w`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`y`w`j`j`y`q`y`j`y`r`y`j`{`wae`y`j`y`j`yae`y`q`y`j`w`j`w`j`j`wad`jad`j`pad`j`w`j`q`y`y`j`y`{`q`y`{`wae`q`y`y`{`w`{`y`r`{`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ar`{`y`qae`yae`y`q`{`y`w`j`{`w`yae`w`{`y`q`{`j`s`j`y`{`y`y`j`j`y`j`y`j`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`jada``j`qad`y`jad`j`w`j`y`j`y`q`j`{`j`y`j`y`r`y`j`y`q`j`y`j`w`{`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}adad`q`ja``q`y`j`yar`j`y`yae`y`q`{`y`yae`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`q`{ae`y`y`r`y`y`yae`y`w`j`{`j`yar`j`y`j`w`j`y`y`j`y`j`y`qad`yad`jad`j`jad`jad`ja`ad`jadadadad`jad`y`jad`y`j`y`j`j`y`j`w`j`q`y`j`w`y`j`y`j`y`j`y`j`w`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ad`j`y`j`y`y`j`{`j`y`y`j`yae`yae`wae`{`y`yar`j`y`y`j`q`y`j`j`y`y`j`j`y`j`w`j`y`j`j`j`y`y`j`y`j`j`y`j`y`j`y`y`a`a`a`a", +"atatatat`{`j`{`yae`y`j`{ar`y`jar`{`r`yaear`y`{`j`y`{ar`{`w`{`j`{`w`{`r`y`{`y`r`{`y`yae`y`yar`y`j`w`{`y`{`j`{`wae`y`{`{`{`yar`y`j`y`{`y`{`q`{`y`{`y`w`{`y`y`jar`j`y`yarae`y`y`{`q`y`yae`y`y`{`j`w`y`y`j`yad`p`gadad`g`p`y`j`j`w`j`{`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}adadad`jadad`{`w`yae`y`r`y`y`y`q`y`{`w`y`{arae`w`y`j`y`wae`y`yae`y`y`j`wadad`gadadadad`j`y`j`{`{`j`yae`w`j`{`y`{`{`q`{`y`y`{`y`w`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`r`y`yae`{`y`wae`y`w`yae`w`y`j`{`j`y`{`j`w`y`j`y`j`{`j`q`y`j`y`q`y`w`j`y`q`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`wad`j`yad`yadad`y`y`j`y`j`q`y`j`y`w`y`y`q`y`j`w`j`y`j`y`w`{`j`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ad`j`ja``j`j`y`q`yae`y`wae`y`j`y`j`y`q`{`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`{`y`j`{`y`{`j`{`y`q`y`j`yae`w`y`j`j`y`j`y`j`y`j`j`w`j`w`j`y`y`j`jada`ad`ja`adadadadadadadad`jada``jad`y`j`y`q`y`w`y`p`j`y`y`j`w`j`y`j`y`y`j`j`wae`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ad`y`j`y`j`y`j`y`y`{`q`yae`y`y`j`{`y`y`q`{`j`{`y`q`y`y`j`y`y`j`j`w`y`j`y`y`j`y`j`y`y`j`y`j`y`j`y`j`y`y`j`y`j`a`a`a`a", +"atatatat`w`{`q`{`{`j`w`yae`{`wae`y`y`y`{ae`yae`y`w`jae`{`q`{`w`{`y`{`{`q`y`{ae`w`yae`w`{`j`jar`yae`q`{`y`{ae`y`wae`jar`yae`y`{ar`jar`y`{`y`q`{`r`y`j`y`r`y`y`y`r`y`j`y`q`y`r`y`{`w`{`jar`j`j`w`j`{`j`p`y`jadaj`gajadad`j`y`j`y`w`j`{`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`w`y`j`padadad`p`j`j`y`y`{`y`qae`y`{`q`yae`y`q`{`y`j`wae`j`y`q`j`y`q`j`ja`adadagagag`i`gag`gaj`gad`j`j`y`y`{`q`y`j`y`y`r`y`r`y`q`{`{`yar`}`}`}`}`}`}`}`}`}`}`}`}`}`j`y`w`y`r`y`{`jar`jarae`y`{ar`j`{`w`j`j`y`{`w`j`w`y`j`ja``q`y`j`y`j`j`yad`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`pad`y`j`q`y`j`q`j`y`p`y`j`j`y`j`j`j`j`y`q`y`j`y`q`y`jae`y`j`w`j`{`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`s`jad`y`j`w`j`y`jar`j`y`j`w`y`j`j`y`j`w`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`{`q`y`j`y`r`y`{`jar`y`j`yae`y`y`q`y`y`q`{`j`y`j`j`y`j`j`jad`ja``jadadadadadadadadadagadadadadadad`j`jad`j`jad`j`y`j`y`j`j`y`{`j`j`w`j`y`q`y`j`j`ja``j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ad`y`j`y`j`w`{`q`j`{`y`j`y`{`q`y`j`y`yae`y`w`j`j`y`{`j`y`y`j`y`y`j`j`y`j`y`j`y`y`j`y`y`q`y`y`j`y`{`j`j`y`j`y`a`a`a`a", +"atatatat`yae`y`y`y`{`y`{ae`y`y`{`j`{`wae`w`{`wae`{`{`{`w`{`{`j`{ae`wae`y`{`y`w`{`j`{`{`j`w`{`yae`y`y`{`y`r`y`w`{`j`w`y`{`j`{`w`yae`y`{`j`r`y`{`j`{`y`{`j`{`wae`y`j`w`{`y`w`j`{`y`j`{`j`{`w`y`y`j`w`j`j`y`jagad`gagada``q`y`j`w`yae`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`w`yae`{`y`wa``j`gadad`j`j`w`j`j`y`y`ra``{`j`w`y`{`jar`y`y`y`y`j`y`wad`y`j`yadaj`gag`mag`gagad`magagadad`y`q`j`y`{`w`{`q`y`{`y`y`{`{`q`y`j`{`}`}`}`}`}`}`}`}`}`}`}`y`{`w`{`j`y`{`w`{`j`{`y`y`{`q`yae`w`{`y`{`w`jar`j`{`{`w`j`w`y`j`w`y`j`wad`w`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`w`ja``j`w`j`y`w`j`ja``y`j`j`w`y`j`q`y`y`q`y`y`j`y`j`y`y`j`y`j`w`j`y`y`q`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`j`y`j`w`j`y`j`w`y`j`y`w`yae`y`w`{`j`{`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`q`{`y`w`y`{`w`j`y`j`{`y`j`y`r`y`w`y`{`j`y`j`j`y`w`jad`y`jad`ja`ad`j`yadadadadadadadadagad`~adad`iadadadada`adadad`y`j`y`j`w`y`j`j`y`y`j`y`y`j`j`y`y`y`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`j`{`j`y`j`y`y`j`y`{`q`y`j`{`y`yae`w`y`j`{`y`j`y`j`y`{`j`y`j`y`j`y`y`j`y`j`y`j`y`j`{`j`y`y`j`j`y`y`j`y`y`a`a`a`a", +"atatatatae`{`q`{`q`{`j`y`{ar`jar`{`yae`y`{`y`{`w`{`yae`y`q`y`y`r`y`{`wae`{`j`{`w`{`y`{`y`{`q`{`y`q`{`y`j`{`wae`y`{`{`j`w`{ae`y`r`y`{`w`yae`y`{`w`{`r`y`{`j`yar`j`{`y`q`{`y`wae`w`y`wae`y`j`{`j`y`y`j`pad`qad`gagadad`j`y`yar`j`y`j`q`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`y`j`w`j`j`y`j`w`jadadad`padae`y`w`j`{`j`y`{`r`y`j`yae`w`jae`q`y`wae`y`y`q`jad`padag`gag`g`gadadad`gadag`gagad`j`j`j`yae`y`q`{`j`q`y`{`y`q`y`jar`y`r`}`}`}`}`}`}`j`y`r`yae`w`{`j`{`j`w`{`q`{`j`{`yar`yae`w`jae`y`yar`j`j`y`j`{`jar`j`j`w`j`j`jadad`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`j`p`y`j`j`yad`y`q`y`q`j`y`y`j`y`j`wae`j`j`w`j`y`q`yae`y`q`y`j`y`j`y`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ad`w`j`j`y`y`j`y`jar`j`j`j`{`w`j`y`j`wae`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`{`jae`q`yae`y`{`j`w`j`y`y`{`j`y`j`r`y`y`q`j`y`j`j`y`qa``jadad`jadadadadadad`gadaj`gadadadagadagad`gadajadadadadadadad`jad`j`j`y`q`y`j`j`y`j`y`j`w`j`j`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`y`j`y`yae`w`y`y`j`y`j`y`y`j`y`j`{`j`{`w`j`y`{`w`j`{`j`y`j`y`j`y`j`y`j`j`y`y`j`y`y`j`y`j`y`j`y`j`y`j`y`j`a`a`a`a", +"atatatat`{`y`y`j`{`j`y`{ar`{`jar`yae`y`{ar`j`r`y`{`r`yar`y`{`{`y`{`j`{`w`j`yarae`yar`yae`{`{`{`q`y`{ae`y`wae`{`y`q`{`j`y`{`w`j`{`y`{`j`{`{`yar`j`{`y`w`y`{`q`{`y`y`j`y`wae`{`yae`yae`y`j`y`y`q`y`j`q`yadadagad`gad`q`y`y`q`j`j`w`j`yad`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`y`j`y`q`y`j`y`y`q`y`{`j`w`yad`gadadad`j`y`j`{`w`j`y`j`w`{`q`y`y`y`j`y`j`y`y`q`y`j`yadad`gag`magadad`j`qadad`padadaj`gadad`yae`w`yae`yar`y`yae`w`y`{`r`y`{`y`yar`yae`y`jar`y`{`j`{`w`{`jar`{`j`y`{`yar`j`y`r`y`j`{`y`{`w`y`j`{`y`w`j`w`y`j`y`y`y`q`yadadag`g`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`jad`y`j`y`q`y`j`w`j`j`y`y`j`y`q`j`y`j`y`j`y`w`j`j`y`y`j`q`y`y`j`y`q`y`j`w`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`yad`{`j`y`q`y`q`y`j`y`y`{`yae`y`q`{`y`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ar`j`y`y`q`{`y`{`j`w`yae`y`{`q`j`y`j`y`j`j`y`y`jad`yad`yad`jad`ja`adadadadaj`~adaj`gadadadag`gad`hadadad`gadadadagadadadada``j`yad`y`j`j`y`y`q`y`j`y`j`y`yad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`yar`j`{`j`y`j`y`q`y`y`jar`yae`y`w`yae`y`{`j`yae`y`y`j`j`y`j`y`j`y`j`y`j`y`j`j`y`j`j`y`y`j`j`y`y`j`{`y`a`a`a`a", +"atatatat`yae`w`{`y`{`q`y`{`j`{`yar`yae`yar`y`{`{`y`{`j`y`{ae`w`j`{`wae`y`{`w`y`{ae`yar`j`q`y`{`j`y`q`{`y`{`wae`y`{ar`{`{`j`{`y`q`{`w`{`jar`y`yae`yae`yarae`y`q`{ar`y`j`{`w`j`yar`y`y`j`{`j`y`j`yadad`y`jad`g`~aga``{`jad`y`w`y`ja``j`w`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`j`y`q`y`j`y`p`j`{`j`sae`y`j`w`j`jadadad`gad`y`j`y`j`y`j`w`yae`j`w`y`q`{`y`q`y`j`y`qad`y`qadag`gag`g`ja`adadad`y`qadadadag`gajadad`y`{`j`y`r`y`{`jar`y`y`q`yae`y`jar`y`y`{`j`w`{`wae`y`q`{`j`w`yae`w`j`y`{ar`yae`w`j`r`{`j`{`w`j`{`yae`y`q`yae`w`j`y`qadadag`n`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}a``qadad`yad`j`y`q`j`y`q`y`j`y`j`y`q`y`j`w`j`y`jar`j`j`w`j`y`q`j`j`w`j`j`y`j`s`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`j`w`y`j`y`j`j`{`w`{`j`q`y`q`y`j`y`jae`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`yar`j`y`y`q`y`j`y`{`q`yar`j`y`q`y`j`y`q`y`j`qa``j`qad`jadad`jadadadadad`hadadadadaj`gagadadadagadagadajadadadadadadadaj`gadad`j`y`j`y`q`j`y`j`j`y`j`jad`yad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`y`{`j`y`j`y`q`{`y`j`y`{`q`yae`y`j`y`j`y`{`j`y`j`y`j`y`j`y`j`y`j`y`j`y`j`y`j`j`y`j`j`y`y`j`y`j`j`y`j`a`a`a`a", +"atatatat`y`{`j`{`y`j`{`y`j`{`q`y`{`jar`y`{`jar`jar`jar`yaear`y`{ar`y`{`{`y`{`{ae`w`{`yar`y`{`j`{`y`w`yae`yae`yar`y`{`j`j`y`{`w`y`{`jar`y`{`y`r`y`{`q`yae`yar`y`y`jadar`y`j`{`w`j`y`j`w`j`w`j`w`j`j`w`jadad`gagad`y`j`y`j`wae`j`y`q`y`jad`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`y`y`j`q`y`j`y`j`yad`j`w`j`y`j`y`y`j`s`y`j`pag`gajad`q`y`r`y`j`y`j`w`j`{`j`y`jar`j`y`y`j`yad`yadadag`gagadadaead`w`jad`yad`y`j`p`gagadad`j`{`r`y`y`j`w`{`yae`{`y`r`yar`y`{`{`jar`{`j`w`{`j`y`{`y`yae`wae`yar`j`yae`w`{`y`y`j`{`w`j`y`r`y`jar`y`y`j`y`yae`y`yad`g`g`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`ya``j`qa``j`q`j`y`j`y`j`w`j`y`q`y`j`y`q`y`j`j`y`j`w`ya``j`j`y`j`ya``j`y`q`j`y`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ad`w`y`j`y`q`y`w`j`j`y`j`y`j`y`{`j`yar`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`{`j`{`j`{ae`yae`yar`j`y`y`j`{`y`y`j`y`w`j`y`ja``j`jadadad`yad`padadadadadadaj`gadag`gad`hadad`gadadadad`gadad`gadadadad`gadadadad`jad`y`j`j`y`j`yad`yad`jadad`~`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`y`y`j`y`y`j`{`y`wae`y`y`j`y`{`y`j`y`y`jae`y`y`j`y`y`j`y`j`j`y`j`y`j`y`j`y`y`j`j`y`y`j`y`j`y`j`y`y`a`a`a`a", +"atatatat`y`jar`yae`w`j`{`y`j`{`yar`{`jar`{`y`{`y`{`j`y`y`j`{`j`wae`{`wae`wae`y`yae`w`{`{`q`y`{`q`y`{`jar`y`{`j`{`q`{`yar`yaear`y`yae`w`{`{ar`y`yae`y`y`wae`j`{`w`{`j`y`j`{`y`jar`j`y`{ar`ja``ja`adad`qadadag`gadad`w`j`y`j`y`y`qad`j`p`yad`y`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`q`ja``w`y`y`j`w`j`w`y`y`j`y`w`j`j`y`q`y`j`wa`ae`yad`uag`had`j`y`j`w`j`{`y`q`yad`y`y`radar`j`w`j`y`padad`gag`gadadadad`p`j`y`w`j`ja``yad`g`uadad`j`yae`y`j`w`j`w`{`j`{`y`q`{`q`y`w`{`y`{`wae`y`wae`{`y`y`{`j`y`yar`j`yae`w`{`yar`j`{`y`y`j`y`q`y`j`w`{`q`y`jar`j`j`qad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`qa``j`{ada``j`y`q`y`j`y`jad`j`y`q`j`y`j`w`j`yad`j`j`q`j`y`p`y`j`q`y`y`j`y`q`j`j`y`s`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}adad`y`q`j`y`y`j`w`y`q`{`q`y`y`j`y`j`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`y`wae`w`y`y`j`{`j`y`r`y`{`q`j`{`y`q`y`j`w`j`ja``jadadadadadadadadadadadad`gadadagadadaj`gajadad`gadadadadadadadad`yadadadadadad`gadadad`yad`j`y`jad`jadadadaj`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`{`jar`j`y`j`y`yae`y`y`{`j`y`j`j`w`j`y`y`j`y`j`y`j`y`j`j`y`y`j`j`y`j`ja``jad`y`j`y`j`j`y`j`y`j`yae`a`a`a`a", +"atatatat`w`{`y`j`y`{`yae`y`w`{`r`yae`y`y`y`r`{`j`w`{`{ar`{`j`w`{`y`y`jar`j`y`yaear`{`{`j`{`{`yae`y`jar`j`{`yar`y`{`yar`{`q`{`y`jar`yae`{`y`j`{`j`y`{`q`{`yae`y`yae`y`q`y`j`w`y`{`j`w`{`j`y`j`w`j`yadad`j`g`gagad`w`j`ja``q`{`w`j`yad`y`j`w`j`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`y`j`y`jae`w`y`j`y`j`w`j`y`j`y`j`qa``j`j`y`j`y`j`w`jad`gag`g`j`p`{ad`y`q`{`j`y`y`q`y`y`w`j`{ad`waea`adadaj`gagadad`j`y`j`p`y`j`j`yad`j`qadagagadad`w`j`w`j`{`y`j`yae`w`{`y`{`j`{`{`jar`j`yar`j`y`q`{`wae`w`{`q`{`j`y`w`{`j`yae`yar`j`{ar`{`yaear`y`{`j`{`wae`y`y`yad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ad`y`q`y`y`qad`jad`j`w`j`y`y`q`yad`q`ja``jad`y`j`w`j`y`j`w`j`j`y`j`y`j`y`r`ya``jar`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ad`j`q`y`j`y`j`w`j`y`y`j`j`y`{`q`{`w`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`{`j`{`j`yae`yae`w`{`yae`y`yae`y`q`y`j`j`y`j`ja``p`j`yad`jadadadadadadadad`gajadaj`gadad`gadadadadadadajadadad`jad`y`jad`q`jadadadadadadadadad`jadadadadadadagad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`w`j`{`yae`y`q`{`y`q`y`j`w`j`y`{`j`y`j`y`y`y`j`j`y`j`y`j`y`j`j`yad`y`j`y`j`y`j`y`j`y`j`y`j`y`j`y`a`a`a`a", +"atatatat`j`yae`y`jarae`y`y`{`{`yarae`{ar`y`y`q`{`{`j`{`y`{`j`{arae`y`y`{`q`{`w`y`{`w`{`w`{`q`{ar`{`y`{`jar`j`jar`j`y`{`j`yar`{`y`jar`{`q`y`{`yar`yae`y`w`{`q`{`w`{`j`{`w`jae`y`wae`y`y`r`y`j`y`q`j`y`jadag`gagad`y`yaea``j`y`j`wad`j`pad`y`j`w`yae`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`w`j`w`j`y`j`y`y`q`{`yae`wad`w`j`y`y`qa``j`w`j`j`y`j`y`pad`gag`gad`y`q`y`y`q`{`j`w`{`j`y`j`{`q`y`j`y`q`y`pad`g`gad`gad`j`j`y`p`y`j`wad`y`j`ya`adad`gad`j`j`w`{`j`w`y`yae`w`jar`y`jar`{`y`{`q`{`{`y`{`j`y`{`jar`y`{`q`{`yar`{`q`{`y`jar`yae`w`{`y`j`w`j`{`y`yar`j`w`j`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`j`y`q`j`y`w`y`j`y`j`w`j`y`j`y`yadar`ja``j`y`q`yad`y`y`j`wad`j`y`q`y`j`y`j`y`j`y`q`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`p`ja``j`q`y`y`q`{`j`y`j`{`q`y`j`{`jar`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`yar`j`y`y`w`j`{`y`j`w`y`q`y`j`y`y`j`y`q`y`jad`ja`adadada`adadadadajadadadadad`gadaj`gad`j`gadadadadadadag`ja`ad`jad`y`ja``ja``jadadadadadadad`gadadad`hadad`hagad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`j`{`y`q`y`{`yae`j`y`w`j`{`w`j`j`y`j`yae`w`j`y`y`j`y`j`y`j`yad`y`j`y`j`y`j`yad`y`j`y`y`j`y`j`y`y`a`a`a`a", +"atatatat`y`j`q`y`yae`y`y`r`yae`y`j`{`w`y`{ae`y`{`jar`{`y`r`{`w`yae`yar`j`{`yae`wae`y`j`{`j`{`y`{`yae`wae`y`y`{`{`{`yae`w`{`yae`y`wae`y`y`{`q`y`j`yae`w`y`j`{`yae`y`j`y`y`j`j`w`{`j`j`yae`y`w`jad`ja``jad`gagad`p`j`j`y`j`w`jad`j`yad`j`y`q`y`j`j`y`r`y`j`w`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`p`j`y`j`y`j`w`j`w`j`y`ja`ae`y`y`j`y`j`y`qad`j`y`j`qad`y`j`ja`aj`gagad`j`y`j`y`j`y`y`j`y`q`y`wad`y`j`yaea``jad`gadadaj`gadad`j`y`w`jad`w`j`j`w`j`j`pad`gajad`y`j`w`j`yae`w`y`j`{`j`w`{ae`y`wae`yar`y`r`{`wae`w`{`y`j`{`w`j`{`jar`yae`w`y`{`j`y`yae`w`j`{`y`j`wae`yae`y`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`ja``j`j`y`y`j`j`y`j`y`j`j`q`y`q`j`w`jad`y`q`j`y`j`j`j`w`j`j`y`j`w`y`j`j`y`q`y`jad`j`y`q`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}adad`jad`y`j`j`{`j`y`jar`j`y`yae`y`w`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`{`{`y`jar`j`y`j`q`y`{`j`{`yar`j`y`y`q`y`jad`ja``jad`jad`jadadadadadadadadadadadadadadadadadadadadadadadadadadad`ja``jadad`y`j`jadad`jadadadajadadadagadadadagadad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`y`w`j`yae`y`j`w`y`j`y`j`{`y`j`y`j`y`j`y`y`j`y`j`y`j`y`j`y`j`y`y`j`j`yad`j`y`j`y`j`y`j`y`j`y`j`y`a`a`a`a", +"atatatat`y`yae`y`w`yae`y`{`wae`y`{`j`{`q`{`yar`y`{`j`y`wae`y`{ar`j`{`y`{`q`y`{`{ar`yar`j`w`{ae`w`y`{`yae`w`{`q`{`yar`yae`yar`j`{`y`wae`y`{`{ar`y`{`yae`w`y`q`yar`y`q`y`j`yad`y`q`y`y`q`y`j`y`y`j`p`y`p`j`gag`g`ja``jar`j`y`w`j`ja``qa``y`j`y`w`y`y`jar`y`{`j`{`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`r`y`q`j`y`q`y`y`j`y`w`{`q`y`wae`y`w`j`y`j`y`y`p`y`y`y`q`yad`y`qadad`gagad`j`wad`j`w`j`y`j`y`j`j`w`y`w`j`y`w`j`jad`uadad`p`gadad`jad`j`y`jad`y`j`s`j`ja`ad`gaj`g`j`j`w`y`j`j`y`y`j`{`y`q`{`y`{`w`j`{`y`j`y`{`yae`wae`y`{`y`wae`y`yar`{`j`w`{`r`y`y`jar`y`jar`y`yar`j`w`j`j`w`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`q`y`y`q`j`y`w`y`j`w`y`ja``j`y`j`y`j`w`jad`y`y`j`w`y`j`y`j`y`q`y`j`j`w`j`y`y`q`y`y`y`j`y`j`w`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}adad`jad`p`ja``p`y`q`y`y`j`y`q`y`yae`y`w`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`w`{`y`r`y`y`y`{`y`{`j`y`j`y`jar`y`j`j`y`wad`j`pa`adad`wad`jadad`yadadadadaj`gadad`~adadajadadadadadad`y`~`ja``jad`y`y`j`yad`y`ja``j`jada`adadadadadad`gadadad`gadad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`y`j`w`y`j`{`j`y`yar`j`y`j`y`j`y`yae`y`j`y`j`y`j`y`ja``j`y`j`y`j`y`j`y`j`y`j`y`j`j`y`j`y`j`y`j`a`a`a`a", +"atatatat`y`j`j`yae`j`y`{`wae`yae`yar`y`{`y`j`{`j`{`{`j`{`y`j`{`q`{`yae`w`{`{`y`j`{ae`y`j`{`y`q`yae`yae`wak`q`{`j`{`yae`y`w`j`{`{`wae`{`y`{`w`j`y`jae`w`y`{ae`{`y`j`{`j`w`j`{`q`y`{`q`y`y`j`j`pad`y`jadadag`gadad`j`w`jad`y`j`j`sad`j`j`y`jar`j`y`q`{`j`w`j`y`j`w`{`j`{`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`wad`j`y`jad`y`j`yae`y`q`{`j`y`j`y`j`w`j`{`qa``j`y`j`j`q`j`y`y`j`j`w`jad`gagagadad`j`y`j`j`y`q`y`j`w`j`y`j`j`y`j`j`y`padadagadadaj`gadad`w`j`y`y`qa``j`j`y`j`j`pad`gadadad`j`j`y`j`wae`w`y`j`{`q`y`jae`y`y`r`{`y`wae`y`y`wae`w`{`yae`w`{`j`y`{`y`q`{`jar`y`{`y`q`yae`yae`y`y`y`jad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`q`y`j`j`y`j`wae`y`j`j`j`{`p`j`y`j`w`j`y`j`j`y`j`j`j`w`j`j`w`j`yad`y`y`q`y`w`j`j`y`jar`j`y`q`y`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ad`jadaradadadad`y`j`j`j`{`j`y`j`yae`w`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`{`j`{`j`{`j`{`q`y`j`j`r`y`w`j`j`y`q`y`y`j`jadad`jad`jad`jad`j`wad`jadadadad`~adaj`gadadad`~adadadadad`jadadad`j`yad`j`j`yad`jad`j`yad`yad`jadadadadadadadajadad`k`g`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`y`{`j`y`j`y`j`y`j`{`j`j`y`j`{`y`j`y`j`y`j`y`j`y`j`y`j`y`y`j`yad`ja``j`y`j`y`j`j`y`y`j`y`j`y`j`a`a`a`a", +"atatatat`y`y`{`j`y`y`r`y`y`{`y`y`{ae`{`w`j`{`w`{`w`{`{`q`{`{`y`wae`y`y`{`jar`y`w`j`yar`j`{`w`{`{`w`{`{`{`j`w`y`{`q`y`j`{`j`y`q`y`{`wae`w`j`{`w`j`w`{`j`y`r`y`j`w`yae`y`j`y`j`w`j`j`y`q`j`ya``jad`ya`adadag`gad`j`y`y`w`j`y`y`j`y`y`w`j`j`w`y`j`y`y`w`j`{`yar`y`j`w`{`j`w`y`r`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`q`{`j`y`w`j`y`w`j`wad`y`y`j`w`j`y`q`y`{`j`w`y`j`w`y`ja``y`j`w`j`q`y`y`j`w`jad`g`gag`y`p`y`y`q`y`j`{`y`y`w`j`y`j`w`y`j`y`ja`adadadagadadadagadad`j`j`y`qa``j`w`j`y`jad`p`gadad`pad`j`y`j`j`y`w`j`{`y`w`{`jar`y`{ae`w`{`jar`{`{`q`{`{`q`{`y`wae`y`wae`y`y`w`j`{`q`yae`y`w`{`q`y`j`w`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`y`j`w`j`y`ja``j`w`j`s`j`y`j`w`j`j`y`j`w`ja``q`y`y`j`yad`y`q`y`j`w`j`y`j`y`jar`y`j`y`j`y`j`{`j`w`j`{`}`}`}`}`}`}`}`}`}`}`}`}`}`q`yadad`yad`jad`wad`ja``j`y`q`y`j`w`j`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`q`y`y`wae`y`w`j`{`y`w`y`j`y`y`{`y`j`y`q`y`y`j`yadad`ja``y`jad`y`j`w`j`y`jadad`padadadadadadadadadadadadadadad`jad`y`qa``j`ja``j`y`ja``j`ja``jad`jad`jadada`adadadad`g`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`j`yae`w`j`y`y`w`y`j`y`y`j`{`q`y`yae`y`y`j`y`y`j`y`j`y`j`j`y`j`y`y`j`y`j`y`j`y`j`y`j`y`j`y`j`y`a`a`a`a", +"atatatatad`j`j`j`y`w`j`{`yae`y`r`y`q`y`j`{`w`{ae`y`r`y`j`yar`yae`y`yae`w`{`j`{`j`yar`{`y`{`yae`w`yae`w`j`{`w`{ae`y`yae`w`y`j`{ar`y`j`{`y`w`{`j`y`y`q`{`j`y`j`y`y`r`y`j`y`qad`j`y`j`y`ya``j`j`padadad`jag`gagadad`y`j`{`j`j`w`j`q`y`j`j`y`y`jar`j`y`j`{`q`yae`j`y`{`j`j`y`{ae`y`yae`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`ja``q`y`ja``j`j`y`j`y`j`j`y`y`q`y`y`{`q`y`{`j`w`j`yae`y`q`{`w`j`q`y`j`j`y`j`qa``jadadag`gadad`j`y`q`y`y`j`q`yae`j`y`q`yad`y`q`y`j`q`jad`padad`gagadadad`pad`y`j`j`yadad`y`ja`ajadag`gadadad`q`y`j`j`w`j`y`j`y`r`y`{`j`wae`w`{`y`q`y`{`j`{`yae`y`{ae`w`{`j`yae`yar`j`y`y`{`w`j`yae`y`j`y`j`w`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`w`jad`y`y`jae`s`j`j`y`j`y`j`y`j`jad`wad`j`y`j`y`j`y`w`j`y`j`yae`y`j`y`j`j`w`j`j`y`q`y`j`q`y`w`j`y`j`y`j`w`}`}`}`}`}`}`}`y`q`y`j`y`j`y`q`ja``p`j`jad`jad`q`j`y`j`j`y`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`{`y`j`j`{`w`j`{`j`y`jae`y`{`j`qae`y`wae`y`jad`ja`ad`jad`ja``jad`j`y`jada``j`j`yadadadadadadadadad`jadadadadad`jadad`jad`jad`q`y`j`y`q`ja``j`j`jad`yadad`jadadadadadajad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`j`y`j`y`y`j`y`j`j`y`y`yae`y`y`yae`y`j`y`{`j`j`y`j`y`{`j`y`y`j`y`j`j`yad`ja``d`j`y`j`j`y`j`y`j`a`a`a`a", +"atatatatadad`y`j`{`j`y`jar`yae`y`{`yar`y`r`y`y`y`j`{`yarae`{`y`wae`y`w`{`j`w`{`yae`{`q`y`q`{`yae`y`y`{`wae`y`q`{`y`y`{`j`{`yae`yar`y`{`j`y`{`q`y`{`yar`y`jar`j`y`jad`wad`j`y`j`w`j`{`q`j`w`yad`jadadadag`gagad`j`y`y`j`y`y`y`j`{a``q`y`j`y`j`y`wae`y`y`y`w`jar`y`jar`y`w`j`y`jar`y`{`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`j`y`j`y`q`y`y`q`ja``qad`q`y`j`j`w`j`y`y`j`w`{`j`y`w`j`y`y`j`j`y`y`jad`w`y`j`y`q`y`jad`gag`g`j`y`j`y`w`j`y`y`j`y`y`ja``q`j`y`y`j`yad`y`jadadadadadadadadad`j`wad`q`j`y`p`j`y`j`sadadagadad`gad`p`j`y`j`w`j`y`j`yar`y`{`j`{`y`r`{`yar`y`w`yae`y`w`y`{`j`w`y`j`y`{aear`y`jar`{`w`{`j`w`{`j`y`wad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`j`y`q`y`q`y`j`y`q`y`j`w`j`yad`w`j`j`y`j`q`y`q`j`ja``j`w`y`q`y`j`w`j`w`y`w`j`{`j`y`y`r`y`yae`j`y`y`q`y`j`y`j`y`y`j`y`j`y`j`y`j`w`y`p`j`yad`ja``w`ja``ja`ad`j`y`w`j`y`{`q`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`j`{`w`y`j`{`w`j`w`j`y`w`j`y`y`y`j`{`y`q`y`y`j`qadadada``j`j`y`ja``j`y`j`yad`jad`yad`jadadadadadad`j`~adadada`adada``ja``ja``jad`j`yad`j`w`y`w`j`yad`j`yad`jadadadadadad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`j`w`y`j`y`j`{`y`y`q`{`j`yae`y`{`j`y`y`j`y`y`y`y`j`y`j`y`j`y`y`j`yad`j`y`j`y`j`yad`y`j`y`jad`y`a`a`a`a", +"atatatat`jad`y`j`j`y`q`{`j`yae`yar`j`{`j`{`yaear`y`{`r`y`j`y`wae`w`j`{`j`w`{`{`j`{`w`{`y`{`y`j`{ar`y`r`y`{`j`y`{`yar`j`{`wae`w`{`j`yae`jar`y`j`{`j`yae`w`j`y`j`y`p`y`jad`y`j`p`y`q`y`j`y`y`jadad`jadad`gag`g`g`j`qad`y`q`y`r`y`{`q`{`j`y`j`yar`j`y`j`{`q`y`j`{`j`y`j`y`{`j`{`y`w`{`j`{`q`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`jad`y`q`j`w`y`j`q`y`j`y`q`y`y`j`y`q`y`j`y`yae`w`y`y`j`w`yae`w`j`w`jad`y`q`j`y`j`y`j`j`y`j`wadagag`g`j`w`j`j`y`{`q`y`y`q`y`wae`yad`j`w`j`p`y`qa``j`padad`oadadagadadad`y`y`j`ya``qad`jadadaj`g`jad`gajadad`y`j`j`w`j`w`{`j`j`y`y`wae`y`yae`w`{ae`w`y`{`j`q`{`{`j`y`r`y`wae`y`wae`yae`yar`j`y`j`wae`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`y`q`jad`y`j`q`y`j`j`ja``j`j`j`y`j`j`s`j`jad`yad`y`jar`j`j`y`j`y`j`y`j`j`j`y`j`w`y`r`y`j`y`j`y`q`y`j`j`y`y`j`y`j`{`j`w`j`y`q`yad`j`j`y`y`j`q`y`j`jad`p`jad`qad`j`y`j`w`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`q`y`{`jar`j`j`{`y`j`w`j`jar`j`w`j`w`j`y`j`w`j`y`j`yadad`jad`y`j`y`j`q`jad`ja``jad`jadadad`jadadadad`g`jadadadad`jadad`jadad`jad`yad`j`y`jad`j`y`ja`ad`jad`yad`jadadajad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`w`jae`y`j`j`w`y`j`y`j`yae`y`w`j`j`y`j`y`j`y`j`j`y`j`y`j`y`j`y`j`~`j`y`jad`y`ja``j`y`j`y`j`y`j`a`a`a`a", +"atatatatadad`j`y`ja``y`j`y`y`w`j`y`{ar`j`y`{`jae`y`yae`yar`yae`y`{`y`q`{`y`q`y`w`{`j`yar`yae`sae`{`y`y`{`j`w`{`j`{`yar`j`y`{`j`w`{`w`{`j`{`q`y`j`w`j`y`y`y`j`{`jadad`j`s`j`y`ja``j`j`w`j`y`j`wadadadag`iasag`y`y`w`j`y`j`y`j`w`y`y`j`w`{`w`j`{`y`w`j`{`{`y`q`y`w`j`y`r`y`{`r`{`jar`y`y`j`{`{`y`yae`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`y`{`q`w`y`j`y`w`j`j`y`j`y`j`y`y`j`y`q`y`j`y`w`j`y`r`j`j`j`y`q`j`y`y`j`{`j`y`w`y`j`yad`y`q`y`j`y`wad`ja``pag`gad`j`y`q`y`j`{`j`yae`y`j`w`j`y`w`j`yad`y`j`ja``jadadadadajadadadad`p`jadad`j`y`pad`jad`uagadadadad`gajad`j`y`j`y`j`yar`y`r`y`{`w`{`j`{`jar`y`{ar`y`{`w`j`yar`y`{ae`y`wae`y`w`{`y`j`{`w`j`y`y`q`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`p`y`j`j`y`j`y`j`wa`ae`y`p`j`wad`y`j`y`j`w`j`y`q`y`j`w`y`q`y`w`j`j`y`y`y`r`y`y`j`{`y`j`j`y`w`yae`y`y`w`j`j`wae`w`j`y`q`y`y`j`y`q`y`j`y`q`y`jad`yad`j`yad`y`ja``j`q`j`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`{`y`q`{`w`y`y`q`{`y`{`j`y`y`j`{`j`y`j`y`j`y`j`y`yad`jadada``jad`yad`y`y`j`y`jad`yadadadadadad`jadadadadadadadadadadadadadad`yad`jad`yad`j`y`j`y`j`y`ja`ad`yad`ja`adadadadad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`j`y`y`j`w`y`j`{`j`y`{`y`y`j`y`y`y`{`{`j`{`y`j`y`y`j`y`j`y`j`y`ja``j`y`y`j`y`j`j`y`j`yad`yad`j`y`a`a`a`a", +"atatatat`jad`g`y`j`yae`y`j`y`j`{`j`{`j`yar`j`{`y`yar`y`{`y`j`{`y`{`wae`y`j`y`jar`j`{`y`q`{`{`y`j`y`yae`war`j`yar`j`y`{`j`{ar`{`yae`y`y`j`w`y`{`j`w`{`j`y`j`w`jadad`ja`adad`w`j`y`j`y`y`j`q`yadad`jadagasagaga``j`{`j`y`q`{`w`y`{`jar`j`{`j`yae`y`q`{`y`j`w`{`j`y`y`r`y`yar`y`y`y`j`yae`w`y`q`{`q`y`w`jadadadad`ja``}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`w`j`y`{`w`j`j`w`j`q`y`y`y`q`y`j`y`y`q`y`j`s`j`w`j`j`y`jar`y`y`j`q`yad`y`y`q`y`y`j`w`j`y`j`w`y`j`y`j`q`j`j`y`qad`y`jarad`j`g`i`g`j`q`y`j`y`j`w`y`q`y`w`j`y`q`y`j`y`q`y`jad`s`j`padad`gad`gadadadadad`jad`p`jadad`padad`gadadad`paj`gag`g`j`p`j`y`q`j`y`j`y`j`{ae`y`w`{`yar`j`{`jar`j`y`{`q`{`j`y`qae`y`y`j`{`q`{`q`{`w`j`y`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`jad`yad`ja``qa``jad`j`p`y`j`y`j`y`qad`y`j`yad`y`j`w`jad`y`j`j`y`j`w`q`y`j`j`w`j`j`w`q`y`j`y`j`j`y`{`j`j`y`y`j`j`y`y`j`y`j`wae`y`j`y`j`y`j`j`y`y`q`j`p`y`jad`jadadad`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`q`j`y`{`jar`j`{`j`y`r`j`y`{`q`{`y`{`y`j`y`{`j`w`j`q`yad`jad`j`yad`j`j`ja``q`j`y`j`j`ja``jadad`gadadadadadadadadadadad`jadadadadad`jad`yad`jadad`y`jad`j`jad`ja``jadad`jadad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`y`j`j`w`j`y`j`y`y`y`j`j`{`j`j`wae`j`y`j`y`j`y`yae`y`y`j`y`j`y`j`y`j`y`j`j`y`j`y`j`j`y`j`j`y`j`y`a`a`a`a", +"atatatat`jad`j`j`ja``j`j`y`y`yae`y`y`j`{`yar`j`j`y`{ae`y`q`{`j`y`j`y`q`y`{`w`j`{`{`j`y`j`w`{`y`waear`y`j`{`yae`y`q`j`yar`j`y`j`y`wae`y`{`j`w`yae`y`w`j`ja``jadad`gad`q`j`y`j`j`y`q`yad`y`j`j`padadadagac`c`~`p`{`j`y`w`yae`y`r`y`y`y`q`y`w`jar`y`j`w`j`{`wae`y`q`y`y`j`y`j`{`yar`y`{`j`yae`y`y`j`y`jadad`gad`p`j`j`y`{`q`{`yar`y`{`w`{`j`{ar`{`y`q`y`{`j`w`jar`j`y`w`j`y`y`j`{`j`j`y`q`y`j`y`j`w`j`{`y`y`q`y`w`j`j`y`w`j`y`w`yae`yad`j`j`y`w`j`j`y`j`j`w`j`y`wad`y`j`y`w`j`y`j`y`wad`gagad`j`y`w`j`y`j`y`j`j`y`j`y`j`y`y`j`w`j`w`jad`y`j`g`paj`gaj`gadajad`g`jadadadadadadadag`p`gaj`g`ja`adag`gadad`y`q`{`j`yar`j`w`j`w`{`jar`j`{`yar`y`{`q`{`y`y`r`y`{`y`wae`w`j`y`{`y`{`j`y`q`{`y`q`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`yad`j`w`j`y`j`ja``y`j`yad`q`j`y`j`y`q`y`j`w`j`y`j`j`y`q`y`y`q`y`{`j`y`q`y`y`j`y`j`y`j`y`q`y`y`j`w`j`y`w`j`y`j`y`w`j`y`j`y`j`w`y`y`r`y`j`w`j`w`j`yad`y`j`j`p`y`yad`q`~`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`{`y`j`w`y`{`y`q`y`y`y`j`w`yae`j`w`j`{`w`j`y`y`j`y`j`qa`ad`padad`y`p`y`j`y`j`yad`y`jad`s`jadadadajadadadad`jadad`jadadadada``jad`yad`jad`yad`y`j`ja``y`j`y`jad`jad`yadad`j`gad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`{`w`yae`y`y`q`y`j`w`j`y`w`j`y`{`j`y`y`j`y`j`y`j`y`j`y`{`j`y`y`j`y`j`y`j`ya``j`y`ja``j`j`y`j`y`j`y`a`a`a`a", +"atatatat`jadadad`y`j`y`j`y`q`{`j`y`w`{`j`q`yae`y`w`yae`w`{`y`y`jar`y`{`y`j`{`j`y`y`jar`y`{`y`r`{`y`j`w`{`yae`w`{`y`{`y`{`y`j`w`yae`y`{`y`q`{`y`{`yae`w`{`j`padad`sad`j`p`y`j`y`q`y`j`jadadadadadadad`naaaaad`y`j`y`q`y`j`{`r`y`yae`q`j`y`{`y`j`{`q`y`{`y`r`yar`{`j`y`{ae`w`j`w`j`{`j`w`j`w`{`w`y`rad`g`jadadada``{`y`w`{`yae`y`j`{`j`{`j`{`w`j`{`j`yar`j`y`{`j`y`y`y`q`y`y`q`y`j`w`j`{`j`w`j`w`j`y`{`y`q`{`y`y`y`j`wae`y`y`j`w`j`y`q`y`w`j`y`qad`y`wad`y`j`waea``j`w`j`ja``j`j`s`jadadagadad`wad`yae`y`q`y`j`w`yae`w`y`q`j`y`y`j`j`y`p`jadadadadad`gajad`g`pagadadad`q`gadagadadagadadad`p`j`p`i`najadadad`y`w`j`j`j`y`j`jar`y`{`y`wae`y`j`{`y`r`{`w`{`y`q`{`y`j`w`j`{ar`j`wae`y`q`y`j`w`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`jad`w`j`yad`j`w`j`q`j`y`jad`yad`y`q`j`y`j`j`y`q`y`j`y`j`j`y`j`y`j`j`y`w`j`j`y`j`q`y`w`j`j`y`j`q`y`j`{`j`{`y`q`y`j`j`{`j`y`w`j`j`y`j`qa``j`y`j`y`j`j`w`ja``ja``j`w`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`jar`yae`y`j`wae`y`j`{`q`{`y`j`y`y`y`j`yae`y`q`y`j`w`y`j`j`jadad`jad`j`y`j`ja``q`y`ja``j`jadadadadadad`jadada``jada`adadad`jadad`jadad`y`jad`jad`yad`j`q`yad`j`yadad`jadadadad`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`j`{`j`y`j`y`j`y`j`j`y`j`y`y`j`{`j`y`j`y`yae`y`y`j`{`w`y`j`y`j`y`j`y`j`y`j`j`y`j`y`ja``d`yad`jad`a`a`a`a", +"atatatat`j`~adadadad`y`j`j`yadae`y`j`y`{`y`{ar`j`y`y`j`{`q`yaea``j`j`{`wad`j`{`w`j`{`y`q`j`{`j`y`j`{`j`y`j`{`j`wae`y`q`yae`{`yar`j`{`q`y`j`y`q`j`y`yad`qadadad`j`j`y`y`y`q`y`ja``q`jadad`w`jadadadad`iaa`h`j`w`y`j`y`j`y`{ad`w`y`j`yar`j`j`y`{`y`j`y`wae`y`yae`yar`j`y`w`yae`yar`j`yae`y`yae`j`yad`padadadad`j`wae`{`jar`{`w`jar`y`wae`y`r`y`yar`y`j`{`w`{`q`{`q`yae`{`y`j`yar`y`y`j`y`y`j`{`y`q`y`q`y`j`q`{`j`w`y`y`q`{`j`y`q`y`j`y`j`y`y`j`j`q`jad`j`yad`y`q`y`j`yara``j`q`y`ja``jad`gag`g`j`{`q`y`w`j`y`j`y`q`y`y`j`y`j`w`y`j`y`ja``j`padagadadad`pad`gadaj`g`gadaj`gad`gaj`gadaj`gadadadad`gag`magad`q`j`j`yar`j`y`w`j`j`wae`y`y`q`{`w`w`{`y`j`{`q`{`j`yar`y`{`w`j`{`y`{`j`y`{`q`{`jar`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`j`y`j`w`j`y`y`jad`y`q`jad`y`q`y`ja``q`y`j`y`j`y`y`q`y`w`j`y`w`j`j`w`j`{`y`w`y`j`{`j`w`y`{`j`y`j`w`j`j`y`q`y`j`y`y`q`j`{`y`j`y`q`y`j`y`j`w`j`y`j`w`j`yad`w`j`j`y`j`q`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ae`y`j`w`yae`y`w`j`y`w`y`j`j`y`w`j`j`y`w`j`y`yae`y`w`y`j`j`w`yadadadadadad`jad`j`y`j`j`y`ja`adad`yadagadadadadad`jadadad`jad`yadada``j`yadad`y`jad`jad`jadad`y`jad`ja`adad`y`jadadad`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`j`y`yar`j`y`j`y`j`y`q`y`j`j`y`y`y`j`y`j`y`j`y`j`y`y`j`j`{`y`j`y`j`y`jad`y`j`y`j`y`j`y`j`y`j`y`y`j`a`a`a`a", +"atatatat`jad`gadadadad`jad`j`y`{`j`y`yae`y`q`y`j`{`j`{`y`y`j`y`r`y`w`j`j`y`y`q`y`jar`j`y`y`{`y`y`{`q`{`y`r`y`w`y`{`j`y`{`{`y`w`y`j`y`y`{`q`y`{`y`j`s`j`j`y`y`j`wada``q`j`y`y`j`jada``j`w`yad`jada`aj`gacaa`w`j`y`j`j`y`w`j`w`j`y`j`w`y`y`j`w`y`j`w`y`{`y`j`y`q`y`j`yar`{`j`yar`j`y`{`w`yae`y`qa``jadaj`gadad`y`j`{`w`{`y`y`j`y`{`{`j`y`{`y`yar`yae`y`q`y`j`y`y`y`{`y`jar`j`w`{`j`j`w`y`r`y`y`q`y`j`y`y`j`{`y`w`y`j`y`yae`w`j`y`y`{`y`q`y`j`w`j`y`y`ya``q`j`w`y`jad`y`j`q`y`y`j`y`w`j`wad`gag`ja``j`{`j`y`j`w`y`y`y`q`y`jar`j`y`j`wad`w`j`jadadagad`gaj`gaj`gad`gadaj`gadadajad`gad`gad`p`y`jadad`gagagadad`h`p`y`jad`w`j`{`y`j`y`j`w`{`j`{`j`yae`y`wae`y`yar`j`{`j`yae`y`j`{`w`j`w`y`j`w`y`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`w`ja``q`j`yad`q`j`y`q`y`ja``j`y`j`j`w`j`y`q`y`j`w`j`j`y`j`j`{`j`j`w`{`y`j`w`j`j`j`y`q`y`j`j`q`y`j`y`j`w`j`y`y`jar`y`j`y`y`q`y`j`y`j`y`y`j`y`j`y`q`y`j`y`y`j`j`j`wad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`yar`j`y`j`y`j`yae`yae`y`j`y`{`wae`y`y`jar`j`w`j`y`j`y`q`y`yad`jadadadad`ja`ad`jad`y`j`ja``jad`jadajadadadagadadadadadada``jada``jad`yadad`jadad`ja``ja``jad`yadadadad`jadadadadad`jadad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`j`y`j`j`j`y`j`y`j`w`j`y`j`y`j`y`j`y`j`y`y`j`{`j`y`yae`y`y`y`j`y`j`y`j`y`y`j`y`j`j`yad`j`y`j`y`j`jad`a`a`a`a", +"atatatat`gaj`i`iadadadad`y`j`j`y`j`y`j`j`y`j`y`q`y`y`r`y`{`yae`y`{`jar`y`j`y`j`y`j`j`{`q`y`jae`w`yae`y`yae`yae`w`jar`y`q`j`yae`wae`y`j`j`y`qad`j`j`ja``qadad`y`j`wae`y`q`y`j`w`yad`j`padadad`padadad`nac`gaj`y`w`j`y`j`y`j`{`q`y`j`j`y`wae`j`w`jae`j`wae`y`y`{`q`y`y`jae`y`y`jar`j`y`j`w`j`{adadadadad`gad`q`j`y`j`j`y`r`{ar`yar`jar`yar`{`j`yar`j`{`{`q`y`qae`y`q`y`y`j`y`j`y`{`q`y`j`y`j`{`{`w`jar`j`y`q`j`j`y`qae`y`y`y`q`j`w`j`y`jar`y`j`y`j`q`j`j`y`j`j`w`y`jad`{ad`q`y`j`y`jad`j`saj`mag`y`j`w`y`yae`y`q`{`j`{`y`j`y`q`y`j`{`j`y`ja``qadadajadad`pad`gaj`gadagad`g`gajadad`gaja`adad`qad`j`g`gag`gad`jadad`j`y`jadar`y`wae`y`j`w`{`q`{`wae`y`y`jar`j`y`q`{`w`y`r`y`j`yae`w`{`yae`y`r`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`y`q`j`yad`y`j`y`p`j`y`j`w`j`w`j`w`y`y`j`j`y`j`y`q`y`j`j`w`j`y`j`y`j`yae`y`q`{`y`q`y`j`y`y`y`j`y`q`y`j`y`j`j`w`j`j`w`j`y`j`j`y`j`y`q`y`j`w`j`y`j`y`j`w`j`y`ja``j`j`w`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`y`j`yar`yae`w`j`y`r`y`w`j`j`y`y`q`yae`y`j`y`j`w`j`y`j`j`j`y`jad`jadadagadadadadadadadadadadadadadadagad`gaj`gadadadadad`jad`ja``j`j`pad`ja``ja`ad`jad`yad`jad`jadadadadadadadadadadadad`y`}`}`}`}`}`}`}`}`}`}`}`}`j`y`j`y`w`y`j`y`j`y`j`y`j`w`y`j`y`j`y`j`y`j`y`j`y`y`j`y`j`j`y`j`y`j`y`j`y`y`j`y`j`y`j`y`j`j`y`ja``j`y`y`a`a`a`a", +"atatatat`~`g`i`madadadad`~adad`j`y`j`yae`y`wae`y`j`y`j`y`j`q`{`q`y`y`j`j`yar`j`y`p`y`y`y`j`{`w`y`{`j`y`jar`y`yae`y`{`y`yae`w`y`j`y`j`w`j`ja`ad`jadad`w`j`y`y`jae`y`j`y`j`y`w`j`j`y`j`j`yadadadadad`gag`g`i`g`y`j`{`j`w`y`{`q`y`j`{`w`y`j`y`j`y`{`y`w`y`j`y`y`r`yae`w`y`j`w`y`r`y`y`w`j`y`w`jadad`uadadadadad`y`j`w`{`w`{`wae`y`y`{`yae`y`jar`yae`y`{`w`yae`y`y`w`{`y`j`w`{`j`w`j`y`{`j`y`j`w`y`j`y`j`y`q`{`y`y`y`y`y`j`w`j`{`y`j`y`y`j`{`y`j`w`y`j`s`y`y`y`w`j`y`j`w`j`w`yad`y`q`j`w`y`j`p`gag`g`j`{`y`q`y`q`y`yae`y`w`y`r`y`y`j`y`j`y`qad`jadadad`gadad`gadadadad`gaj`gajad`gad`uad`jadad`ja``gadagag`gajadad`y`pad`w`j`j`y`j`{`q`{`yae`yar`y`{`yar`j`{`w`{`y`y`q`{`j`{`y`wae`y`yae`w`y`y`j`j`w`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`q`y`j`y`q`y`j`j`s`j`y`ja``j`j`j`y`j`y`j`w`j`j`s`j`j`y`j`y`y`j`w`j`{`y`w`j`y`j`w`j`j`y`y`j`q`j`y`q`y`{`j`y`j`w`y`j`y`y`j`y`j`y`y`w`j`y`j`w`j`y`j`y`jara``q`y`j`y`q`yad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`q`yae`y`{`q`y`jar`y`y`{`y`{`w`j`yae`y`y`q`y`y`j`y`j`y`y`q`y`w`j`yadad`gadadadadadadadadadadadadadagad`gag`haj`gadadadad`ja``ja``jada``j`y`j`yad`jada``jadadadadada`ad`jadadad`jadad`jad`ja``}`}`}`}`}`}`}`}`}`}`w`j`y`j`yae`j`yar`j`w`y`j`y`j`y`j`y`j`y`j`y`j`y`j`y`j`{`j`y`y`j`y`j`y`j`y`j`y`j`y`yad`y`j`y`j`y`j`y`j`j`y`a`a`a`a", +"atatatatada`adadada`adadad`~ad`gadadad`j`y`j`y`j`wae`y`j`yad`y`y`jadad`jad`j`q`y`j`q`j`y`pae`j`y`jar`j`y`y`r`y`y`j`q`y`j`{`{`q`y`j`yad`wad`qad`ja`ad`j`q`jad`w`j`y`p`j`ja``j`j`s`j`padadadadagadag`gadagacag`ja``j`{`j`w`j`y`y`wae`y`q`y`q`y`j`y`j`j`w`{`r`y`y`j`yae`y`{`j`w`j`yae`yar`jad`yadadadadajadadadad`y`jae`y`j`y`y`r`yae`y`y`{`y`yar`yae`y`j`y`q`{`y`jar`j`y`j`w`yae`y`p`y`r`y`y`jar`j`y`w`j`y`q`{`q`y`q`y`y`j`w`j`y`q`{`q`y`j`y`{`j`y`j`y`qae`y`j`y`q`j`y`{`j`j`w`j`y`j`y`j`ja``pag`gad`j`y`j`y`{`q`j`y`j`j`y`y`q`y`q`{`ja``j`y`wadadadagadadadagadadagad`gad`gajad`gajad`pad`j`padadadadag`hajad`p`jadad`j`p`j`y`q`j`y`y`q`{`j`yae`q`{`y`y`j`w`{ae`y`w`{`q`y`j`w`j`y`q`yae`y`w`j`yad`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`y`q`j`y`j`y`q`y`j`y`j`w`j`y`q`y`y`q`j`y`j`y`y`j`w`j`w`j`j`y`j`y`q`y`j`{`j`w`y`j`y`w`j`j`y`y`j`j`y`j`w`j`y`j`j`y`q`y`j`q`y`{`j`j`{`y`j`y`j`w`j`w`y`jae`y`y`q`j`y`j`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`{`j`y`q`yae`y`{`y`j`yae`q`j`y`j`{`w`j`y`q`{`j`yar`j`y`y`j`j`y`j`j`padadadaj`gadadadadadadadadadaj`g`gajag`gag`g`kadadad`ja``p`j`j`wad`j`j`s`jad`wad`jad`jadadad`yad`jadadadadadadadadada``j`p`y`q`y`y`}`}`}`}`}`y`j`yar`j`y`y`j`w`j`y`j`j`y`j`j`y`j`y`j`y`j`y`j`y`j`j`y`j`y`j`y`j`y`j`y`y`j`y`j`y`j`j`y`j`y`ja``j`y`j`y`ja``j`a`a`a`a", +"atatatat`yae`w`y`y`j`j`y`yadadadadadadad`jad`j`j`y`y`q`yad`y`j`{`j`s`j`j`w`y`y`y`y`j`y`y`j`y`y`j`sae`y`yae`j`{`sae`y`y`w`jad`y`j`j`yad`y`ja`ad`q`y`j`p`~`s`y`j`y`wad`{`w`yad`y`jadadadadadagad`padadadag`m`i`g`j`y`j`w`y`j`{`y`j`y`q`y`y`{`j`w`yae`w`yae`y`y`y`r`y`w`y`q`y`y`yae`w`y`j`j`y`paj`gadaj`gadad`j`y`q`y`w`{`y`{`r`y`{`yar`y`waear`j`{`j`y`w`{`{`y`q`{`j`y`y`r`y`y`y`q`y`y`j`y`w`j`y`j`w`{`j`y`j`y`j`y`{`j`w`j`y`j`y`j`y`j`j`w`j`j`w`{`y`r`y`y`j`y`q`y`y`j`y`j`w`j`{`j`s`j`y`j`y`jag`g`j`y`q`y`{`w`j`y`q`y`w`y`q`{`j`y`y`w`jar`y`j`jadad`pagadadadadadagad`padadad`padadadadad`qad`yadaj`gag`gadadad`w`j`ja``y`j`wad`y`j`y`j`y`j`{`w`y`yar`jar`yae`yar`j`yae`y`y`{`{`w`y`j`{`q`y`{`j`wad`y`}`}`}`}`}`}`}`}`}`}`}`}`}`j`j`wad`y`j`y`q`yad`j`y`q`y`j`w`j`j`y`j`y`j`y`y`j`w`j`y`y`y`y`j`j`w`j`y`j`y`j`j`w`j`y`j`w`j`y`w`j`y`q`y`j`j`w`y`j`w`j`y`q`y`yae`y`q`y`q`y`q`y`j`y`j`y`j`w`j`y`j`y`y`w`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`{`j`y`{`w`j`y`r`yae`w`y`y`j`wae`y`w`j`y`y`q`{`j`y`j`y`q`y`y`j`w`jadadaj`gadadadadadadadadadad`gad`g`i`gag`~agad`gadadadad`j`qa``j`y`qa``j`ja``j`j`y`ja``j`ja``jad`y`p`y`jadadadadad`y`j`j`y`j`y`j`q`y`j`j`y`j`y`q`y`j`y`j`y`j`y`y`j`y`j`y`y`j`y`y`j`y`j`y`j`y`j`y`y`j`y`j`y`j`{`y`{`y`y`j`{`y`j`j`y`y`j`y`j`y`j`y`wadah`j`y`a`a`a`a", +"atatatat`y`y`j`j`{`y`j`yae`y`j`w`jadad`gadadadad`jad`j`j`j`yad`jad`yadadad`q`j`jad`y`j`w`j`j`y`j`j`y`j`qad`y`j`jad`j`j`y`w`j`y`j`j`w`j`j`{`y`p`y`jadadad`jad`w`j`j`y`j`jad`qadadadadadad`gadadad`y`qad`hag`magad`y`j`y`q`y`q`{`y`j`y`rad`j`y`j`j`y`j`w`{`q`y`yae`y`jar`j`jar`yae`y`j`j`yadadadadad`pad`gadad`j`y`j`{`w`j`y`{`yarae`{`y`y`{`j`w`{`q`{`y`jae`y`w`y`{`j`y`jar`j`{`y`q`y`jae`y`wae`y`y`j`{`q`y`{`qad`w`j`y`w`j`j`s`j`y`ja``q`y`jad`y`j`y`q`y`r`y`yae`w`y`q`w`j`y`y`j`j`w`y`qadad`gag`g`j`jad`y`{`q`y`y`j`{`y`{`q`{`j`{`j`y`j`q`y`j`w`jadad`gad`p`gadagadagad`uadadadad`p`yad`yad`jad`gag`gagadad`y`jad`w`j`p`ja``j`j`q`y`j`w`j`j`yae`w`j`yaear`y`j`{`w`j`wae`wae`y`{`q`y`{`w`j`q`y`j`j`q`y`q`}`}`}`}`}`}`}`}`padadad`j`y`w`j`ja``j`j`wad`j`j`y`y`j`y`w`j`j`w`y`q`j`y`j`y`r`j`y`q`y`y`j`j`w`j`w`j`y`j`y`q`y`j`y`j`j`w`j`y`j`y`j`j`y`j`j`y`j`j`w`j`y`j`y`j`y`j`j`w`j`{`j`y`j`y`wae`y`q`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ar`j`{`y`j`yae`y`y`q`y`j`y`j`{`y`q`yae`y`q`y`j`w`j`y`w`j`y`q`ja``jad`yadadagadadad`jadad`jadadadajadadag`g`gadad`gadadadad`y`jad`jad`j`y`j`y`j`y`ja``j`jad`y`j`j`y`j`j`j`yadadadad`j`yad`y`j`y`y`j`y`y`{`q`y`y`q`y`j`j`y`j`y`j`j`y`j`y`q`y`j`j`y`j`y`j`y`j`y`j`ja``j`y`j`y`j`y`j`j`j`j`y`j`y`j`y`y`j`y`j`y`j`y`j`j`y`j`y`j`y`j`a`a`a`a", +"atatatat`y`j`j`y`y`j`y`q`yar`yae`y`ja`adadaj`g`gajad`gadadadadadadadad`j`jadada`ad`j`y`j`gadadad`gadadadad`j`ja``q`y`w`j`y`j`yad`w`y`j`y`w`j`{`ja`ad`j`p`yad`j`y`j`y`p`y`ja``jadad`gajadagadada``jadadag`g`i`gad`y`q`y`j`yae`y`j`wae`ya``w`j`y`w`j`w`y`j`{`j`y`q`{`w`j`{`y`w`j`y`j`y`w`j`padadad`gajadadadadad`w`y`j`j`{`y`y`r`y`y`j`{`w`jar`y`y`y`{`y`r`y`w`y`{`j`w`jar`y`j`{`j`{`w`j`y`w`y`j`y`j`w`j`y`j`w`{`{`y`j`j`y`y`j`yad`qadada``j`j`q`y`j`q`y`y`j`y`w`j`y`q`y`j`y`j`y`j`w`{`jad`yad`j`gag`y`q`y`w`j`j`y`q`{`j`w`y`j`y`w`{`j`w`y`{`j`y`yaea`ad`padadadadadad`padadadad`w`ja``jadad`j`pad`gag`gag`g`qadad`w`j`jad`y`j`p`yad`y`qad`y`{`j`w`{`y`j`w`{`j`w`yae`w`y`{`j`y`{`q`yae`y`j`j`yadad`qa``j`y`y`q`yad`wadad`gadadad`p`y`yad`j`y`q`y`q`y`j`y`y`j`y`q`y`j`y`y`j`y`j`y`j`w`y`j`y`j`y`j`y`j`w`{a`ae`y`y`q`yae`y`y`j`j`w`y`j`y`j`w`j`y`w`j`y`w`y`y`j`y`j`j`w`y`j`j`w`y`yad`y`q`{`j`y`j`yae`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`y`q`y`{`q`y`yar`j`y`yae`y`w`yae`y`y`yae`y`y`{`j`yae`y`j`j`y`w`ja``qad`gadadadadadad`jad`y`jadadadadad`gadagadadad`ja``j`yad`j`w`y`y`j`q`y`j`w`j`y`jad`wa``q`y`j`w`y`ja``j`w`y`j`yad`j`y`j`y`j`y`j`{`y`j`y`q`y`j`y`y`j`y`j`w`j`y`y`q`y`j`y`y`q`y`j`y`j`y`j`j`y`j`y`jad`y`j`y`y`j`y`y`j`y`j`y`yae`y`y`j`y`j`y`j`y`jah`j`y`j`y`a`a`a`a", +"atatatat`y`yae`y`j`{`y`j`y`j`y`w`j`{`w`y`w`j`y`padadag`gaj`gaj`g`i`gagadagadad`jadadad`jadadagagag`gad`gad`gajadad`j`jad`y`w`j`yae`y`w`j`{`y`q`y`jadadad`j`jad`s`jadad`jad`padadad`gad`padad`q`ja``qadad`gag`gadad`j`y`j`w`y`j`y`{`j`j`j`y`j`y`{`y`j`w`y`{`w`{`j`y`y`y`q`{`{`y`ra``j`j`yadadadad`g`gaj`gadadad`j`y`q`y`j`y`j`y`wae`w`{`y`j`{ar`jae`w`y`{`j`y`{`q`y`y`yar`j`y`w`j`y`j`yae`y`q`y`j`yar`j`y`y`j`q`y`w`j`y`qad`qad`gajadadadagadadad`y`j`w`j`j`y`y`r`j`y`y`q`j`w`j`{`j`w`j`qa``j`padag`h`j`j`y`w`{`y`y`wae`{`yae`y`yar`j`{`yar`j`y`j`w`jadadadadadadag`gadaj`gadadadadadad`qadad`jadaj`gag`gad`y`jad`y`y`q`ja``j`j`yad`jad`q`jad`j`j`yae`y`j`w`j`yae`y`j`w`j`y`j`y`j`y`q`j`p`jada``jad`y`q`y`j`y`y`j`j`y`padajadadad`j`y`p`j`y`j`y`j`j`q`y`j`w`j`y`j`w`j`y`j`y`q`y`j`j`y`q`y`y`q`y`y`j`j`y`q`yae`y`j`w`j`j`y`q`y`j`j`y`j`y`j`j`y`j`yae`j`j`j`y`w`j`j`y`j`y`j`y`q`j`y`y`y`q`j`yar`j`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`{`jar`y`j`j`y`j`{`j`w`jae`y`y`jarae`y`j`j`yae`w`y`j`y`q`y`j`j`y`jad`jadadadadadad`ja``qad`jadadadadadadadadadad`jad`j`y`jad`yad`q`y`ja``j`j`y`q`y`j`y`j`y`j`y`j`j`w`y`j`j`y`j`q`j`y`q`y`j`y`w`j`j`y`j`y`j`y`j`j`y`w`j`y`y`j`j`w`y`j`y`j`w`j`y`q`y`j`yad`y`y`j`y`j`y`y`j`j`j`y`j`y`j`y`j`y`j`j`y`j`y`j`y`j`y`j`j`y`j`y`j`y`j`a`a`a`a", +"atatatat`w`j`{ad`y`y`j`yae`y`{`j`y`{`j`{`j`y`j`y`j`yadad`gaj`g`gag`gag`mag`g`iagag`gadagad`gagad`sad`y`qadadad`gadadadadad`j`jad`y`j`j`y`j`y`j`y`jadadadadad`p`y`j`j`yad`jad`gadad`gad`jad`wad`y`jadadadaj`gagad`p`y`j`w`j`{`yar`j`w`y`w`y`j`w`j`q`{`y`{`q`j`{`yae`y`q`{`y`j`y`j`y`w`j`y`padajadadadadadad`~adadad`j`j`w`jar`y`j`y`{`{`y`r`{`y`w`{`y`y`q`{`y`q`y`{`j`yae`y`q`y`y`j`y`q`{`w`y`j`y`w`j`y`y`j`w`j`y`y`{`q`y`y`jad`gagadad`gadadadadad`jad`y`j`w`yae`y`y`y`j`w`y`j`{`j`y`y`j`y`p`y`j`gagad`y`w`yae`y`q`{`j`y`{`w`j`w`j`{`j`w`yae`y`w`{`j`y`w`jag`gad`qadadagadadad`jadad`w`jadadadad`gag`gad`p`y`ja``j`q`yad`j`y`p`j`q`yad`y`ja``j`yad`wadar`j`y`j`y`j`w`j`y`j`w`ja``qadadad`yad`j`y`j`w`y`j`w`j`w`j`w`y`jadadad`gadad`q`y`y`j`w`j`w`y`j`y`q`j`y`j`w`j`y`j`w`j`y`y`j`y`y`j`{`y`jae`w`y`jar`y`y`j`w`j`yae`y`y`j`yad`y`r`y`w`j`y`qa``j`q`y`y`w`j`y`j`y`j`y`w`j`y`yae`w`j`y`j`y`w`j`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`yae`y`y`j`w`{`q`y`j`{`w`{`y`{`q`y`j`y`yae`w`y`y`j`y`q`y`j`y`j`y`j`p`yadadadajadadad`y`j`y`ja``j`s`j`jadadadadad`yad`ja``jad`y`q`y`j`y`y`j`w`j`y`y`j`y`j`w`y`j`w`j`y`y`j`y`y`j`w`yad`y`j`y`j`y`j`j`y`j`w`j`y`y`j`y`j`y`jar`j`y`j`y`yae`w`j`y`y`j`y`j`y`j`y`j`y`j`y`y`j`j`y`d`y`y`y`j`y`y`yae`y`y`y`j`y`y`j`y`y`j`y`y`y`j`y`j`y`a`a`a`a", +"atatatat`y`j`{`y`j`{`j`yar`j`jar`j`y`q`y`j`y`q`y`y`j`w`y`yad`yadadadad`gad`g`gag`nad`g`i`gag`had`j`y`j`y`q`y`j`wadadadad`gadajadadad`j`y`q`jadadad`gadad`y`jada``qad`w`jadad`gajadad`jadad`y`j`j`gad`gadag`hagad`j`yae`w`y`j`{`y`j`y`j`j`w`j`yad`y`j`j`y`{`w`j`w`{`j`yar`{`q`y`{aea``wae`y`padadadad`gadaj`gadadadad`yaead`j`yar`j`{`wae`y`q`y`j`{`{`y`{`q`{`y`q`{`w`y`q`y`{`jar`y`jad`{`j`y`j`y`j`w`j`{`y`q`y`r`y`j`{`j`waj`gagadad`p`jad`padad`gadad`jad`j`w`y`r`j`{`j`y`y`w`j`w`j`jad`jad`p`jadag`g`j`j`w`j`y`y`q`{`q`y`j`{a``r`y`y`j`y`jar`y`j`y`y`j`{`wad`gadadadadagad`gajadadadad`j`sadaj`gag`hadadad`q`ja``j`j`w`jad`y`y`y`q`ja``qadad`q`j`j`j`y`jad`padadadad`qadadadad`j`wad`j`p`j`w`j`yae`y`j`y`{`j`y`j`w`y`y`qadadajad`y`j`q`y`j`y`j`y`j`y`j`y`w`j`{`j`w`j`y`j`w`j`y`q`y`j`w`j`y`j`y`q`y`j`y`j`y`j`y`j`w`j`y`j`w`y`j`y`j`y`q`{`y`j`y`{`j`j`y`q`yad`q`y`q`y`j`w`y`j`j`y`j`y`j`y`j`q`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`w`y`jar`j`{`y`j`{`w`j`y`j`j`w`j`y`j`w`j`y`j`w`j`y`j`y`y`j`j`y`q`y`j`yad`jad`gadadadadad`jad`y`j`yadad`jadad`jad`j`w`jad`y`j`p`j`y`j`y`j`y`j`j`w`j`y`q`y`{`j`j`y`y`j`q`{`j`y`j`y`j`{`j`y`j`j`w`j`y`q`y`y`j`y`j`j`y`{`w`d`y`j`y`j`w`j`y`j`j`y`q`y`j`y`w`j`j`y`j`y`j`j`j`yad`y`q`y`j`j`y`j`j`y`j`y`j`j`y`j`y`j`y`j`j`y`j`j`y`ja``j`a`a`a`a", +"atatatat`y`j`j`w`j`y`j`w`yae`y`yar`j`y`j`{`q`y`j`{`q`y`jae`y`qar`j`yar`y`y`oa`ad`g`gad`gagad`gagadad`j`ja``j`y`j`j`w`ja`adadad`g`gagag`g`iadadadadadadadad`j`s`j`y`j`yadadaj`gadad`pa``jad`padagadagadag`gag`gadad`w`j`y`j`w`d`y`q`y`q`y`{`y`y`j`{ar`y`y`q`{`{`j`yae`w`{`j`y`yae`y`w`j`y`jadadadajadadadag`gadadadadadad`p`y`j`y`j`yae`y`y`{`y`y`jar`j`w`{`j`{`y`r`y`j`{`y`jar`j`y`y`{`w`j`{`w`j`w`j`y`jar`j`y`yad`{`wad`{adad`gadad`j`ya``ja`ad`padadadadad`j`j`j`yad`w`j`q`y`j`j`yadad`wadad`yad`gagad`y`y`j`j`y`j`y`y`yae`w`j`y`{`q`{`yar`j`y`y`q`y`j`w`j`y`jad`gadad`p`gajad`padad`ja`adajadag`g`gaj`pa``j`j`y`q`yad`y`q`j`y`qad`y`j`yad`j`ya``ja``j`padadadajadad`y`jad`qad`jad`y`j`j`w`y`j`y`w`y`q`y`w`j`w`j`y`j`q`jadad`g`g`j`q`{`y`y`j`y`y`q`y`wae`y`q`y`y`j`y`j`y`j`y`j`j`y`j`y`j`y`w`j`y`j`{`wae`y`w`j`y`w`j`y`j`{`j`y`j`y`j`j`y`j`w`j`j`y`q`y`j`y`q`y`j`y`yae`yad`{`w`y`j`w`j`y`q`{`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`{`wae`y`y`q`{`y`{`{`j`y`w`{`j`y`{`j`y`yar`j`{`y`j`w`j`y`q`y`y`j`q`y`jadadadadadad`y`jad`yad`q`j`ja``jada``j`ja`ad`j`j`p`y`ja``y`j`j`w`j`w`j`y`y`q`y`j`y`j`y`w`{`j`{`y`j`w`j`w`yaea``j`w`y`j`y`j`y`j`y`q`y`j`y`j`y`j`y`j`y`j`y`j`y`j`y`w`y`j`y`j`y`j`y`j`y`{`j`y`y`j`y`y`j`j`y`j`y`y`j`y`j`y`j`y`j`y`y`j`y`y`j`y`j`y`y`j`y`y`j`a`a`a`a", +"atatatat`j`y`j`{`y`j`y`j`yar`j`y`{`q`{`y`j`{`w`y`j`y`y`y`j`{a``{`{`y`yae`y`{`yae`wa`ad`ja`ad`pad`ya``j`ja``q`y`ja``j`j`y`w`j`jad`p`gag`g`gag`g`gaj`gadadadad`jad`w`jadadad`gadadad`y`qad`yadadad`gagad`i`g`gajada``y`j`y`j`y`r`y`j`y`j`w`j`j`y`j`y`jar`y`y`r`y`y`{`y`j`w`{`r`y`y`j`y`w`j`wadad`sad`gadadadadaj`gadadadadadad`y`q`y`{`w`j`{`q`{`w`y`{`j`yar`j`w`j`y`j`y`q`y`y`j`wae`wad`j`{`yad`y`{`j`w`y`j`y`r`y`j`y`y`w`ja``qadagad`w`j`q`y`j`y`j`padad`gadadadad`q`y`j`yae`w`j`y`p`j`yad`s`jad`j`gag`gad`j`w`{`y`j`j`y`y`j`{`w`j`{`y`jar`{`y`r`{`j`w`{`j`w`j`w`j`j`gadadad`gadad`gadadadad`p`g`i`gagadadad`j`s`j`j`y`q`y`j`y`j`y`j`qad`q`j`p`j`qad`w`jadad`g`gagadadadadadad`j`p`y`j`y`w`j`{`j`yae`y`j`y`{`j`y`q`y`j`y`p`yaj`p`gadad`y`q`{`j`y`j`y`j`y`q`j`y`j`w`y`q`yar`j`y`y`q`y`j`y`j`j`{`j`w`j`j`y`qae`y`j`j`y`q`y`q`y`j`y`q`y`y`q`j`y`j`w`j`y`j`j`{`j`j`y`q`j`y`y`j`y`j`j`w`yae`y`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`y`wae`y`wae`y`j`w`j`y`y`j`j`y`w`j`jar`j`yae`y`w`j`{`y`{`j`j`y`ja``y`j`jadadadadadadad`jad`y`ja``j`yad`jadad`yad`ja``j`y`j`y`q`j`y`p`j`y`j`y`j`y`j`j`y`w`j`{`j`y`q`y`yar`j`y`y`jae`s`j`y`j`y`y`q`y`j`y`j`y`j`y`j`y`{`j`w`j`y`y`j`y`{`q`y`j`y`{`j`y`j`y`j`y`j`y`j`w`j`j`y`j`y`j`y`y`j`j`y`j`y`j`y`j`y`j`y`j`{`j`y`j`y`j`j`y`j`j`y`a`a`a`a", +"atatatat`y`{`j`y`q`yae`yar`j`y`{`j`{`y`j`w`yae`y`y`a`j`yar`j`{`j`j`w`j`yae`y`j`wae`yad`w`j`j`y`y`j`jarad`ja``j`j`w`j`y`j`j`y`j`ya``jad`gadadadada`aj`y`pad`jada``j`jadadadagad`p`j`yad`jadag`gajag`g`gag`gadad`j`wad`y`j`w`y`j`j`y`q`y`j`y`y`qa``yar`j`yae`y`jar`yae`w`y`{`j`yarae`y`q`y`j`ya``j`jadadadagad`gadad`gad`jadadae`y`j`yae`w`y`{`j`{`{`q`{`w`{`j`{`y`y`j`p`y`{`j`w`y`{`j`j`{`w`y`r`y`j`w`yae`y`j`y`j`w`y`q`{`j`y`jad`gad`jad`wad`jad`p`y`jad`padad`padadadadad`p`j`y`jadad`p`jadad`qadad`gagad`s`j`j`y`q`y`j`wae`w`j`{`j`{`y`{`j`r`y`{`y`{`yae`y`yae`y`{`sadagadad`pad`gad`p`jadadag`gagadadadad`j`y`j`y`qad`y`jad`w`j`q`y`y`y`j`y`y`j`y`jadadad`gaj`gadad`p`jad`wad`y`j`y`w`j`y`w`y`q`y`{ar`y`r`y`q`y`y`j`w`y`j`jad`gajad`q`y`j`y`q`y`j`j`w`j`y`j`y`jar`j`y`j`y`j`w`j`j`w`{`j`y`q`y`j`y`y`y`j`y`y`q`yar`y`j`y`j`y`q`y`y`j`j`y`jad`y`j`w`j`y`w`j`y`q`y`j`w`j`y`q`y`q`y`j`y`j`w`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`w`y`{`j`{`j`y`{`w`{`j`waear`yar`j`y`{`y`y`j`w`j`y`j`wae`y`j`w`y`y`q`j`y`s`j`jadadadada``j`y`q`y`j`yad`jadad`yad`j`y`y`w`ja``q`j`y`j`y`j`y`j`w`j`y`q`y`j`j`y`j`w`j`yae`y`j`yae`y`q`y`y`y`j`y`j`j`j`j`y`y`y`j`y`y`j`y`q`y`j`y`y`j`wae`y`j`y`{`j`y`j`w`y`j`y`y`j`y`j`y`j`y`y`j`j`y`j`y`j`y`j`y`j`y`j`y`j`y`y`j`y`y`j`y`y`{`y`j`yah`j`a`a`a`a", +"atatatat`j`w`y`j`y`w`j`{`j`{`y`q`y`{ar`y`{`r`yar`jar`y`yae`yar`yae`{`y`jar`y`y`j`{`y`y`j`yadad`{`y`j`y`j`w`j`y`j`y`w`j`y`y`y`q`j`w`y`j`j`sad`j`y`j`s`jad`j`s`jadadadad`gaj`gadad`j`yadadad`g`gag`hag`gadadad`w`j`y`w`j`{`ja`ar`y`j`y`j`yad`j`{`q`y`j`w`j`y`{`j`y`j`y`{`j`{`w`j`y`q`y`y`r`j`w`j`yad`pad`jad`gadaj`gadadadadadad`q`y`w`j`j`y`y`q`{`y`yae`y`w`{`j`w`yad`jadar`y`j`y`y`j`y`wae`y`j`w`j`{`q`y`q`y`j`y`j`w`j`y`q`y`yai`gadad`y`jadad`padad`yad`y`padadadadad`pad`jad`p`j`jad`yad`jadad`qad`nagad`jad`yad`w`j`y`y`y`{`w`{`wae`y`y`y`{`q`y`q`{`w`y`j`w`y`jae`y`w`j`p`gaj`jadadadadad`yadag`gagadad`s`j`ja``j`j`y`j`y`j`yad`j`j`p`j`jad`p`y`ja``qadaj`gag`padad`y`j`y`j`w`ja``qae`yae`y`j`y`w`j`j`y`y`j`{`q`yae`y`q`y`j`jad`gajad`y`jad`y`w`{`j`{`w`j`w`j`y`j`w`j`j`y`j`y`j`y`j`j`q`y`{`j`w`j`j`w`j`y`{`jad`y`j`w`j`w`j`y`q`y`{`w`j`y`j`w`j`y`y`j`y`j`y`j`y`j`y`j`y`j`y`j`y`q`y`y`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`yae`w`y`{`y`j`yae`y`y`j`y`j`{`jar`y`q`{`w`{`j`{`y`y`j`y`q`y`j`w`j`y`j`y`jad`sadad`jad`jad`ja``jad`ja``jad`j`p`j`j`w`j`j`y`y`j`w`j`w`j`y`w`j`j`y`y`y`q`y`y`q`{`j`y`q`y`j`y`w`j`y`y`jar`y`y`q`y`y`q`y`q`y`j`y`q`y`j`y`{`q`j`y`j`{`j`w`y`j`q`y`j`y`j`y`jar`j`y`j`y`y`j`y`j`yad`y`j`y`j`j`y`j`y`j`y`j`j`y`j`y`j`j`y`j`{`j`y`j`y`j`y`j`a`a`a`a", +"atatatat`y`yae`{`y`j`j`y`y`j`j`{`j`{`j`y`r`y`{`yae`y`{`y`q`y`j`y`j`{`w`j`yae`yar`j`y`jar`j`y`w`j`j`wad`j`ja``j`y`j`yae`y`y`q`j`y`y`jarad`y`j`j`wad`j`j`ya``j`yad`w`jadadada`adad`j`jad`gadag`haj`gadadadad`wad`j`y`j`y`j`w`j`y`j`yad`q`y`j`w`ja``q`j`j`y`y`r`{`w`y`r`y`w`{`j`yar`yae`y`y`j`y`y`y`qadadad`gadadaj`gadadadadad`jadad`j`y`j`{`w`{ae`w`y`q`{`yae`w`j`{adadad`{`j`y`j`w`jar`y`j`j`w`j`j`wad`y`j`j`y`j`w`j`{`j`y`waea`ag`g`j`j`ja``q`y`j`y`j`qad`jadadadadad`jadadadadad`pada``qadadadadag`gag`gad`y`q`y`j`y`q`j`q`y`j`jae`y`jar`jar`y`q`{`j`yaear`y`j`{`y`q`y`j`yag`gagad`padad`p`j`p`gag`gad`w`j`jad`j`j`w`j`pad`y`q`yad`wad`yad`w`y`j`p`y`jadadad`gajad`yad`j`w`y`j`y`j`{`y`j`y`wae`w`j`yae`w`y`j`w`j`y`j`j`y`y`j`y`pad`gad`jar`y`{`j`j`w`y`j`{`j`y`j`y`j`y`q`y`j`w`j`y`q`y`j`y`q`y`j`j`y`j`j`y`j`q`y`q`y`j`j`y`j`j`{`y`j`j`y`q`j`y`{`j`j`w`j`y`j`w`j`y`j`y`q`y`j`w`j`y`j`w`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`j`y`j`{`j`wae`wae`y`q`{`waear`yar`y`{`j`{`yae`y`{`y`q`yar`j`y`{`j`y`j`w`j`y`j`jadadadadad`y`jad`qadadad`p`j`ja``j`y`yae`y`y`q`y`j`y`y`j`w`j`y`y`j`w`j`j`y`j`y`j`y`j`y`j`y`{`j`y`yae`yae`y`j`j`y`q`{`j`y`y`j`y`j`yae`y`y`j`y`j`y`y`j`y`y`j`y`y`{`q`y`y`j`y`y`{`w`j`y`j`y`j`y`j`y`j`y`j`y`y`j`y`j`y`j`y`y`j`y`j`y`j`y`j`y`y`j`y`j`y`j`a`a`a`a", +"atatatat`jar`yae`w`yar`j`y`y`y`w`y`{`y`{`yae`y`w`{`r`y`{`j`{`w`j`y`yae`{`yar`y`jar`y`y`j`w`j`j`yad`y`q`y`y`j`w`y`y`j`p`{`j`y`w`j`y`y`{`j`w`j`y`ja``j`y`{`j`y`y`q`y`jad`padadad`y`ja`adadadag`g`gad`g`j`w`j`y`y`j`y`q`y`j`y`w`j`y`w`y`j`y`y`q`y`y`y`y`q`y`y`{`j`{`y`{`j`y`w`j`y`j`{`wae`yae`wad`j`yadadadaj`gadadad`gajad`padad`yada``j`w`j`y`j`yae`yae`w`y`y`{`w`y`j`qa``j`y`w`j`y`{ad`{`w`y`y`y`j`j`y`q`y`w`yar`{`y`q`{`j`y`q`jad`g`g`q`y`q`jad`pad`yada``q`jadad`q`gadadad`p`jad`jadad`y`qad`gag`gag`gadad`j`y`q`y`j`y`yar`j`y`y`y`w`{`j`yae`y`{`w`y`y`j`{`p`y`w`{`y`j`w`{`qad`gagad`jadadad`j`j`gagad`ja`ad`wa``j`ja``q`j`j`y`j`y`j`y`jad`j`yad`q`ja``padad`g`g`q`y`y`r`y`q`y`q`y`q`y`y`j`y`q`{`y`y`j`y`q`{`y`w`j`y`q`j`w`j`y`jadad`gad`j`y`w`yae`j`w`y`j`w`j`{`j`y`y`j`yad`y`q`y`y`j`y`y`j`y`q`y`y`qah`p`y`j`y`y`j`w`y`y`q`y`j`w`j`y`y`y`jad`w`j`y`j`y`j`y`y`q`y`j`y`j`w`y`j`j`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`{`y`w`y`j`y`{`y`j`yar`y`j`y`y`j`yae`yae`w`y`q`y`jar`j`yae`y`{`j`y`yae`y`j`y`q`y`jadadadadadad`jadadad`ja``ja``j`y`w`j`y`j`y`q`y`y`yae`y`w`j`j`y`q`y`j`y`y`q`y`j`y`j`w`y`j`j`y`j`yae`y`y`q`y`{`y`{`j`y`j`y`j`y`j`{`y`j`y`q`y`y`j`y`j`y`j`y`q`y`j`y`j`y`j`yar`j`j`yae`y`{`j`y`j`y`j`y`y`j`y`j`y`j`y`y`j`y`j`y`j`y`y`y`j`y`y`j`{`y`j`y`j`y`a`a`a`a", +"atatatat`j`y`y`{`j`y`j`{`wae`yae`j`q`yae`w`{`q`{`j`y`{`j`y`{`j`{`w`{`q`yar`y`j`y`{`j`wae`y`y`j`w`y`jad`y`j`q`y`j`j`y`yae`w`y`j`y`j`jar`j`y`q`yad`w`j`jad`y`q`y`jad`qa`ad`yad`jada``qadadagag`gadad`j`y`j`{`j`y`j`w`j`y`q`y`j`y`q`j`y`j`q`j`j`j`y`j`j`{`j`wae`y`w`jar`j`w`yae`y`j`w`{`j`y`w`j`y`j`y`j`y`padad`padaj`gadadadadadad`jad`j`yad`j`w`j`y`w`y`j`{`{`q`y`j`j`y`y`p`jae`y`yae`w`yae`j`y`j`y`p`y`y`j`y`j`y`j`j`y`j`y`w`j`y`j`gajad`y`ja`ad`ja``q`y`q`yadadadadadadadajad`gadad`qadadaj`g`gag`gagadadad`s`jad`j`y`q`y`j`yae`y`qae`y`j`{`w`j`{`w`jae`yar`j`y`yae`j`w`j`j`y`y`j`g`n`gad`yadadadadag`g`yad`q`j`jad`w`j`j`y`s`jadad`w`j`p`j`w`j`p`{`jadad`gajadadad`y`q`j`y`j`yae`y`y`{ae`w`{`j`y`jar`jar`y`j`y`j`y`j`ya``j`j`y`j`wadaj`gad`q`y`j`j`y`y`j`j`y`ja``j`w`j`y`jar`j`y`j`y`j`q`y`j`q`y`y`j`y`j`y`y`j`j`y`q`j`j`j`j`y`j`y`j`y`qae`y`q`y`j`j`w`y`j`w`j`y`j`w`y`j`y`j`y`j`q`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`j`y`q`y`j`j`wae`y`{`j`{`y`j`yae`w`{`y`jar`yae`y`j`y`{`w`j`{`q`yar`j`w`j`{`y`j`y`yadadadadadadadadadad`j`p`y`j`y`j`j`y`q`yae`y`j`j`j`w`j`y`y`j`y`j`{`y`j`y`j`y`q`y`y`j`y`j`y`y`q`{`w`j`yae`y`j`q`y`y`q`y`j`w`j`y`j`wae`y`j`{`q`y`y`j`j`y`{`j`j`w`y`j`j`w`{`j`y`y`j`y`w`j`y`j`y`y`j`y`j`j`y`j`y`j`j`y`j`y`y`j`y`j`y`j`y`j`j`y`j`{`y`y`y`a`a`a`a", +"atatatatae`wae`yae`y`y`j`{`w`y`y`{`{`j`y`q`y`{`yar`{`j`w`{`j`{`y`{`yae`w`j`{`w`yar`j`y`y`r`j`y`y`q`y`y`j`y`y`j`{`wae`y`{`j`y`w`y`{`y`j`y`j`y`{`ja``j`w`j`w`j`j`wad`y`j`y`q`y`y`q`j`yadag`g`gadad`y`y`q`j`y`w`j`y`j`y`j`y`jad`y`j`q`y`j`ya``j`w`y`p`y`j`y`y`j`y`y`yae`{`y`w`{`w`y`j`{`w`j`{`w`j`y`j`s`j`y`ja`ad`jadadadadad`gadadadad`p`j`y`j`j`w`j`y`j`w`yae`yar`y`y`q`yadad`w`j`y`q`y`w`y`j`y`jar`j`y`r`y`j`w`j`y`w`j`y`j`y`y`q`y`gajadad`w`j`ja``j`j`y`y`q`ja``p`j`pad`gadag`gad`gad`gadadagag`gag`gad`qad`y`w`j`y`j`y`j`wad`j`y`y`w`j`y`q`{`y`j`{`w`j`{`yarae`y`w`{`y`y`q`y`q`y`qag`gag`j`p`y`j`yag`gaja``ja``q`y`j`p`y`j`y`j`qa`aea``j`qa``j`y`qadadadad`g`padad`y`y`j`w`j`w`j`w`y`q`y`jar`j`y`y`j`w`j`{`q`y`q`y`q`j`y`q`j`y`j`q`yadadag`j`w`y`r`y`j`w`j`y`q`y`y`j`y`q`y`y`j`q`y`y`j`j`y`y`j`q`y`q`y`j`w`yae`y`y`j`w`y`w`j`{`s`j`y`y`j`y`j`y`j`y`j`y`j`y`j`y`j`j`y`j`j`w`j`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`jar`j`y`y`q`y`y`y`r`y`y`q`{`w`{`w`{`j`yar`j`y`y`y`r`yar`j`y`y`y`j`y`j`y`{`q`y`j`w`j`w`j`padajadadadadad`y`y`j`y`w`j`y`y`y`j`w`y`j`y`y`j`y`j`j`w`y`j`y`qae`y`j`y`yae`w`j`y`q`y`y`j`y`j`{`j`w`y`q`y`j`y`y`j`w`j`{`j`y`y`j`y`y`j`y`j`y`{`j`y`y`q`y`j`yae`w`y`j`y`y`{`j`{`j`y`j`{`y`j`{`y`j`y`j`y`j`y`y`y`j`y`j`y`j`y`j`y`y`j`y`y`j`y`j`y`j`y`a`a`a`a", +"atatatatae`y`yar`y`y`q`{`wae`yae`y`jar`y`j`{`yae`{`wae`y`y`yaear`j`y`r`y`{`y`jarae`y`{`w`j`y`j`y`j`y`j`y`j`w`j`y`j`y`q`yae`w`{`j`j`y`q`y`j`w`j`y`j`w`j`j`y`j`y`j`y`w`j`j`j`y`j`ja`adajad`gagad`j`y`j`j`y`y`jae`y`j`w`j`w`j`w`y`j`y`qad`y`j`w`j`ja``jae`w`j`y`j`wae`y`w`j`{`j`{`j`w`j`j`w`{`j`y`jar`j`yad`jadada``padadajad`u`jadadad`j`yadad`j`y`y`q`j`y`j`y`j`y`y`j`{`w`jad`j`yar`{`yae`y`q`y`p`{`j`y`w`j`y`y`j`{`j`yaear`y`w`j`y`q`gagad`y`jad`s`j`j`y`q`y`j`j`y`jadad`padad`gadaj`gajadagag`gagag`gagadadad`j`jada``j`q`y`{`y`q`y`j`j`yar`y`jar`y`j`y`yar`j`j`{`yae`y`r`y`j`y`{`ja`agad`gadadadad`p`gagadad`y`jadad`y`jad`q`j`yad`jad`j`wad`y`jadadadaiadagad`j`w`j`j`w`j`j`y`j`y`j`y`q`yad`{`{`q`yae`y`q`y`y`j`y`j`y`y`y`j`y`j`yad`qad`gadad`y`j`y`j`y`j`y`j`w`j`y`w`j`y`q`{`j`y`j`q`y`y`qad`y`j`y`j`j`y`j`j`w`j`q`y`j`y`j`y`j`y`j`j`w`j`j`y`q`y`q`j`y`j`j`w`j`y`j`w`y`j`y`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`w`y`j`y`j`y`j`y`q`y`j`{`y`j`j`j`{`j`j`w`yae`y`wae`y`{`j`y`j`yae`q`y`j`y`j`y`j`w`j`y`jadadad`gadadadadad`y`q`y`j`y`j`y`j`q`{`j`j`w`j`y`q`y`y`q`y`j`y`r`y`y`j`y`r`y`q`y`j`y`j`{`j`y`j`j`y`w`{`j`{ae`y`{`j`y`j`y`j`y`y`j`y`j`j`y`j`y`q`j`y`yae`j`y`y`r`y`y`j`yae`yae`y`j`y`j`y`y`j`y`j`j`y`j`y`y`y`j`y`j`yae`y`{`j`y`j`y`jah`j`y`j`yahae`y`j`a`a`a`a", +"atatatat`{`{`j`j`{`{`yae`y`y`q`y`{`y`{`r`yar`{`y`j`{`wae`{`w`{`yar`yae`y`q`{`y`j`yae`y`y`y`w`j`yar`j`y`{`j`y`q`y`{`y`j`{`j`y`p`{`j`w`y`j`{`y`j`w`y`j`y`jad`s`j`j`j`yad`w`j`y`j`y`q`yad`gag`gad`y`w`y`j`y`w`j`y`j`y`j`y`j`y`j`w`j`y`j`j`w`ja``{`j`wad`y`j`y`j`{`j`wae`y`y`q`{`y`yae`w`y`j`w`{`y`y`j`y`y`w`y`j`w`j`yad`padadad`gadadagadadad`p`yaea``y`{`j`w`j`y`r`y`q`{`y`y`w`jad`y`j`w`y`j`{`y`j`w`y`j`yar`j`y`q`y`w`y`j`y`j`y`r`y`yad`g`g`j`yad`y`p`y`j`y`q`y`y`w`j`yadad`padad`gaj`g`gag`gag`gag`gag`gaj`gad`w`j`y`qad`y`j`q`{`j`w`y`j`y`j`{`{`j`wae`y`{`y`q`yar`j`y`w`y`jar`j`y`j`wadadagadad`p`jad`gagadad`y`j`w`jad`y`ja``qad`y`w`j`y`j`j`qa`adadadag`gadad`w`j`y`j`y`q`y`j`yae`y`q`yae`y`w`j`y`w`{`j`y`jar`j`y`q`y`j`wad`y`w`j`ja`ad`padad`q`y`w`y`j`y`j`y`y`j`j`y`j`y`j`w`j`{`y`j`q`y`y`j`y`j`w`j`w`j`y`j`y`y`j`q`y`q`y`j`s`j`y`y`y`w`j`y`y`j`y`w`j`y`j`y`q`y`j`y`jar`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`y`q`{`j`w`j`j`y`j`j`w`y`yar`y`wae`y`{`jar`j`y`j`y`j`w`{`j`y`w`yae`w`{`j`y`j`y`j`y`q`y`jadadagad`gad`j`y`j`y`j`w`y`{`q`y`y`j`y`y`yae`y`j`wae`y`y`y`j`yar`j`y`y`{`j`y`q`y`w`y`j`w`y`yar`j`y`y`j`y`w`j`yar`jar`y`{`q`y`y`j`y`y`y`j`y`y`y`j`w`y`y`j`y`j`y`j`y`w`j`y`y`j`y`y`{`j`{`y`j`y`y`y`j`j`y`j`y`j`y`j`y`j`y`j`y`y`j`d`y`y`j`y`j`y`j`y`j`a`a`a`a", +"atatatat`y`j`{`wae`y`y`r`{`y`{`{`jar`j`{`w`y`{`j`{`wae`y`q`y`{`q`{`yae`y`w`{`j`w`yar`yae`wae`{`q`y`j`y`j`wae`y`w`j`j`y`q`y`y`j`y`q`j`y`j`y`q`{`yae`w`y`j`w`jad`ja``y`jadad`j`j`p`y`j`j`gad`iad`q`j`j`y`y`j`j`w`y`q`y`j`w`y`j`yad`ja``j`y`j`y`q`j`j`w`y`j`w`j`w`y`j`y`q`y`y`j`{`q`y`{`j`w`{`j`j`w`j`w`j`j`j`y`q`y`j`jadadadagadadaj`padadadad`j`y`jad`{`y`j`y`r`y`y`{`y`j`w`jadad`j`w`j`y`j`j`j`wae`y`q`y`j`y`w`j`y`j`y`q`j`w`j`y`w`j`y`paj`g`j`j`jad`j`y`y`j`{`q`yadae`wa``j`jadad`pad`o`gag`gag`gagag`gagadadad`j`wad`y`j`wa``j`j`y`jae`y`j`w`j`j`y`w`y`j`w`{`j`y`{`j`{`j`w`j`y`j`w`j`yad`p`g`gadad`gaj`gagad`w`j`j`y`q`j`y`q`ja``q`j`j`yad`wad`jadadag`gadad`j`j`y`j`qa``j`y`j`w`j`j`j`y`j`w`j`{`j`{`j`yae`w`y`j`y`j`y`j`j`w`j`j`qa``j`q`jadagad`jae`j`y`jar`y`q`j`yaead`w`j`y`j`y`q`j`y`y`j`j`y`w`j`y`j`y`j`q`y`j`j`yad`j`j`w`j`jae`y`j`j`j`y`q`j`y`j`j`j`y`q`y`j`{`j`y`q`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`w`j`y`j`w`y`j`j`y`w`j`y`j`y`j`{`j`y`y`jar`y`j`w`yae`w`{`y`q`{`y`j`{`j`y`w`j`q`y`y`q`y`j`jadadadagadad`j`j`y`w`j`j`y`jad`{`j`y`q`y`j`w`j`y`{`j`y`y`r`y`j`y`j`y`r`y`j`w`y`yae`j`y`j`yae`y`j`j`j`{`j`y`q`yae`y`y`j`yae`y`{`j`w`j`j`w`{`j`j`{`j`yae`j`wae`w`y`j`yae`y`j`yae`y`j`j`y`j`yae`yae`y`j`y`y`j`{`y`y`j`y`j`y`j`y`j`y`j`y`j`y`j`y`j`y`y`a`a`a`a", +"atatatatae`y`y`j`{`j`y`y`{ae`y`r`y`{`yae`{`q`{`yae`y`yae`yar`j`y`{`y`r`y`{`j`{`y`j`j`w`y`j`{`j`y`j`w`j`y`j`y`y`jar`y`y`{`j`q`y`j`y`w`j`y`j`y`j`y`j`y`w`j`yadar`j`j`y`qadad`yadad`j`w`jad`gag`gad`{`j`w`y`j`y`j`y`j`{`j`j`q`y`j`w`jad`w`jad`y`y`j`y`j`j`y`q`y`{`r`y`j`{`{`w`yae`y`w`j`{`j`w`y`j`y`{`y`j`w`y`j`y`q`yad`yadadadadadad`gadadadad`j`wad`j`j`w`y`j`y`w`j`y`{`w`y`{`j`yad`j`w`y`w`y`y`j`yae`y`q`yae`y`wae`y`j`y`y`j`w`j`y`j`w`yadadad`pad`y`q`y`jad`yae`y`w`j`j`w`j`y`padadadadad`gadag`g`gagag`gag`gadad`jad`j`j`y`j`q`y`qa``j`w`y`j`w`y`jae`w`y`yae`w`y`q`y`y`y`j`{`w`yae`y`w`j`jadadagaj`g`gaj`gagad`j`y`ja``q`y`j`j`ja``y`j`p`y`j`y`padadagadadad`y`w`j`y`w`j`y`q`y`y`q`y`w`y`j`y`w`j`y`q`y`y`j`y`j`w`j`w`j`y`j`y`w`j`y`ja``y`j`wad`g`g`j`w`j`y`j`j`y`w`j`y`j`y`j`y`j`yad`y`q`y`w`j`y`j`y`j`y`y`w`j`yadad`jadadadadada``q`j`y`y`j`yad`j`w`y`w`j`y`j`w`j`w`j`y`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`y`j`y`j`j`w`y`y`j`y`j`y`q`y`q`yar`j`wae`y`y`r`y`{`y`j`{`y`j`{`y`q`{`y`j`y`j`y`y`j`q`y`ja``jadad`gaj`gad`y`j`y`y`q`y`y`w`j`y`yae`y`j`y`{`w`j`y`j`y`{`j`w`j`{`y`{`y`q`y`j`y`j`y`w`j`{`j`y`y`j`w`y`y`j`y`y`q`yae`y`j`y`y`r`y`y`{`yae`y`w`j`y`y`{`j`w`y`y`j`yar`j`y`yar`j`y`w`{`j`w`y`{`y`y`j`y`{`j`{`j`y`j`{`j`y`y`y`j`y`y`j`y`j`y`j`y`y`j`y`j`y`a`a`a`a", +"atatatat`y`y`w`{`j`w`y`{ae`s`yae`y`{ar`{`w`y`{ae`y`wae`{`y`y`y`{`q`yae`y`yar`j`w`{ar`y`j`yae`s`j`y`{`j`y`{`y`j`w`y`j`{`q`j`y`y`y`q`{`y`j`j`w`y`r`y`q`yae`yad`yad`qa``jadad`j`j`p`yad`j`yad`gag`y`w`j`y`j`y`j`y`w`j`yad`s`y`jad`y`j`wa``j`q`y`j`qad`w`y`j`wad`j`y`j`y`y`j`y`j`y`j`yae`w`y`j`w`j`y`jae`w`y`j`y`j`y`y`j`padadadag`gadajad`g`j`pa``j`qa``q`y`j`w`y`jarae`wae`yae`y`y`q`y`{`j`y`j`y`j`w`j`q`y`y`q`y`j`y`j`w`yae`w`y`yae`w`y`j`j`pajada``jad`yad`w`j`y`p`j`y`j`y`y`jad`yad`jadadadad`uagag`gag`n`gagadadada``q`yadad`j`yad`y`j`y`j`j`{`j`y`y`j`yae`q`{`y`j`{`y`q`{`q`j`y`j`w`j`yad`j`wag`gag`gaj`gag`gadad`q`y`j`j`p`y`ja``j`q`jad`p`jadadadag`gad`j`q`y`y`j`j`y`wae`y`y`j`j`y`y`r`y`j`y`q`y`j`{`q`y`w`j`y`j`y`q`y`w`j`jad`y`jar`j`y`j`padad`j`{`y`q`y`j`y`j`y`q`y`j`w`y`j`q`j`y`j`j`y`y`j`j`w`j`q`j`y`j`j`padadadadadad`jadadad`j`q`y`j`w`{`jad`j`w`j`j`y`j`y`q`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`w`y`j`j`w`j`y`j`j`w`j`w`j`j`j`y`j`j`y`j`{`y`q`{`j`y`j`y`jar`j`y`j`y`j`y`j`w`j`y`q`yad`ja``j`qa`adaj`gadadad`j`w`jae`y`q`{`j`{`q`y`r`y`w`j`j`y`y`q`y`q`y`j`y`w`j`y`q`y`j`{`yar`j`j`y`y`w`jar`yae`y`j`j`w`j`y`j`y`y`y`j`w`j`y`jae`y`j`y`j`y`j`y`q`y`j`y`{`q`y`j`y`y`j`j`yae`y`j`y`j`yae`y`j`y`j`y`j`w`y`j`y`j`y`j`y`j`j`{`j`y`j`y`j`y`j`y`d`y`j`y`a`a`a`a", +"atatatat`j`j`y`wae`y`{`q`{`{`y`q`{`j`yae`yar`yar`y`yar`j`{ar`{`y`y`jar`y`j`{`yae`y`j`{`w`j`j`y`s`j`j`y`q`j`j`{`j`j`y`w`y`j`q`y`j`j`y`w`y`j`y`y`j`y`y`q`y`q`y`j`y`y`j`y`yada``jadad`jad`padadagad`y`j`y`p`y`j`y`j`y`q`y`j`j`y`w`jad`jad`yad`ja``j`j`y`p`j`j`y`w`j`w`j`y`r`y`wae`y`y`yae`y`{`jar`j`w`yae`y`w`j`j`j`j`y`j`qadad`gadadad`gad`jad`q`y`j`y`j`y`y`{`wae`y`y`{`q`yar`yae`y`q`j`y`wae`y`q`y`y`j`{`wae`y`w`j`y`j`w`{`j`j`y`yae`w`y`yad`gadajadad`j`y`j`y`j`w`j`y`q`jad`yad`j`wadad`jadad`gadag`n`gagag`g`oadadadad`jad`wad`j`y`q`j`j`y`q`j`y`w`j`{`w`y`y`q`yar`j`{`y`j`y`w`j`j`y`j`y`p`y`j`yad`g`gaj`gad`gaj`gad`y`j`y`p`j`y`q`y`j`y`y`j`jadad`gajadad`j`y`q`y`r`y`j`{`j`w`w`j`{`q`yae`y`w`j`{`y`w`j`{`j`yae`y`j`y`j`y`y`q`y`y`w`j`y`y`w`j`ja`aj`gad`{`y`q`y`w`j`y`y`j`yad`y`j`y`q`y`j`w`j`q`y`j`y`y`j`w`ja``jadadadadad`padadadadadad`y`qad`y`j`w`j`y`j`yad`j`y`y`y`r`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`y`j`y`y`j`w`j`yad`{`y`j`w`y`y`q`y`y`j`w`j`{`y`y`q`{`w`y`j`y`wae`w`y`q`j`y`y`q`y`j`y`jad`jad`j`ja`adajadadad`y`j`y`j`y`j`y`j`y`y`j`y`{`y`j`y`q`{`{`j`y`j`{`y`jarae`y`{`j`y`j`y`j`w`j`j`{`y`j`y`w`{`y`q`{`y`q`y`jar`j`{`y`q`y`y`y`j`y`q`y`{`j`{`yae`y`j`yae`y`y`j`y`y`j`w`yae`y`{`j`y`yae`y`{`y`j`y`y`j`{`y`y`j`y`{`y`j`y`j`j`y`y`y`j`y`d`j`y`j`y`a`a`a`a", +"atatatatae`y`y`{ae`y`y`j`{`q`y`yae`w`{`yar`yae`yae`y`{`{`w`y`j`jar`{`yae`y`w`{`j`w`{`y`j`w`y`j`y`j`j`p`y`j`w`y`q`y`y`j`wae`y`y`{`y`y`y`j`y`w`j`yar`j`y`{`j`y`y`j`q`y`j`qad`y`j`w`y`padadadadag`m`j`j`w`j`{`j`y`p`j`y`ja``j`w`j`yae`ya``j`jad`y`j`y`p`y`j`y`y`j`j`j`y`q`ja``{`y`jar`yae`w`y`q`{a``j`{`y`q`yae`ya``w`y`ja`adadadadajadag`padada``ja``j`w`{`jar`j`{`y`y`wae`y`yae`w`j`y`{`q`y`y`j`y`y`{`q`y`j`y`w`j`yae`w`j`y`j`y`wae`w`j`y`jad`padad`padadad`s`j`w`j`yad`j`y`j`w`j`wadadad`padadadag`gag`gag`gagadadadadadadadadad`jadad`jad`yad`y`j`y`j`w`j`y`j`{`y`j`j`y`y`q`yae`y`w`j`y`q`y`j`pa``j`padajad`gadaj`gadad`j`q`y`y`j`y`yad`q`jad`wad`uadagad`g`w`j`y`j`y`y`j`y`y`j`y`j`j`w`y`j`w`j`y`q`y`j`j`y`y`j`w`j`y`w`y`jar`j`y`jar`j`y`j`{`j`y`qadadad`j`r`yad`j`j`y`j`y`q`yad`w`j`y`q`y`jad`y`j`y`j`y`j`j`y`j`j`w`gajadad`jadad`jadadadadadad`q`y`ja``j`y`j`q`y`y`j`q`y`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`yad`q`y`qa``j`j`j`s`j`j`q`y`j`y`j`j`j`w`j`y`{`j`wae`y`yae`y`{ae`y`j`y`j`{`y`q`y`j`wad`j`y`p`yad`padadadadadad`j`y`y`y`q`y`y`q`y`y`q`y`j`wae`y`y`y`j`{`w`{`w`j`y`{`j`{`w`j`y`w`jar`j`y`y`q`y`{`j`{`j`wae`y`y`{`j`{`j`y`j`y`yae`y`j`wae`y`yar`j`{`y`j`y`w`y`q`y`q`yae`w`y`j`j`y`y`j`w`yae`y`j`y`j`{`y`j`y`j`y`j`{`j`y`d`j`y`j`y`j`y`j`y`j`y`y`j`y`j`a`a`a`a", +"atatatat`y`j`y`j`yae`y`y`{`yae`w`y`j`{ae`{`yae`w`yae`yae`{`y`j`{`j`w`j`{`j`{`j`y`{`q`{`y`j`q`y`j`w`j`y`jad`j`y`y`q`j`y`j`wae`j`w`j`j`w`j`{`j`y`j`y`q`j`j`y`r`j`y`ja``j`y`qad`y`jad`y`jadadad`gagad`{`j`y`j`j`y`y`j`q`y`w`j`y`j`w`j`q`yad`y`q`yad`j`jad`yad`q`y`j`y`j`j`y`j`q`y`j`y`jar`j`y`{`q`y`w`j`y`y`j`y`q`yae`j`wad`jad`pad`gadadadadad`j`y`j`y`w`j`{`y`wae`{`y`jar`y`y`{`j`w`{`y`{`w`j`y`r`y`j`yae`y`j`yar`j`y`y`j`y`w`j`y`{`j`w`j`y`y`jadadad`pagadadad`jadad`y`jad`y`jadadadadad`gadag`gaj`gagag`gag`gag`gaj`gadadadad`p`j`wad`p`y`j`w`j`j`y`j`y`j`w`j`{`q`yarae`y`yar`j`y`j`w`{`j`y`j`j`pad`wad`gagad`gadaj`gadad`q`y`q`y`j`y`j`yad`j`jadadag`gadagad`j`w`y`q`{`y`q`{`j`y`y`y`j`w`j`y`y`j`j`w`y`q`j`y`wae`yae`q`j`y`{`y`r`y`jar`j`w`j`y`y`j`w`j`padadae`y`w`j`j`w`j`j`j`y`j`j`y`j`w`j`y`w`j`y`q`y`j`w`j`y`jad`y`pad`gad`w`y`ja``j`yadadadad`j`j`y`q`y`j`y`q`j`y`j`w`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`q`yad`{`j`j`w`y`j`j`y`y`j`y`j`qa``j`j`y`j`w`j`{`y`w`j`y`wae`w`y`r`y`j`y`j`y`j`j`y`j`jadad`jad`yad`jadadadadadad`q`j`{`yae`y`{`q`yae`y`y`jar`{ae`w`j`y`j`j`{`j`w`j`y`yae`w`{`y`j`yar`j`y`j`y`w`j`y`j`y`jar`j`w`j`{`y`q`y`j`y`w`j`y`y`{`j`{`j`y`w`{`j`{`j`y`{`y`{`j`yae`y`{`q`y`{`j`y`{`y`{`j`y`j`y`j`{`j`y`y`j`y`y`j`y`y`y`{`j`y`j`y`j`y`j`y`j`y`y`a`a`a`a", +"atatatat`y`{`j`y`j`{`y`j`{ae`wae`{`{`w`y`w`j`y`{`j`{`w`{`y`q`{`{`y`jar`y`w`j`yar`j`{`y`wae`y`y`jad`jada``j`y`wae`y`y`j`wae`y`w`y`j`{`y`j`{`j`y`w`j`{a``j`yad`jadadad`w`j`y`y`j`j`y`{adad`sadagac`g`j`y`j`w`y`j`w`j`y`j`y`j`j`y`y`j`yad`w`j`ja``j`ja``w`j`ja``w`j`y`p`y`j`{`y`j`{`w`yae`yar`yae`{`y`j`{`j`w`y`j`j`y`yadad`padadadad`p`gad`j`ja``j`y`w`j`{`q`y`j`y`q`yar`{`j`y`r`y`y`{`wae`y`y`j`w`y`{`jar`y`jarad`y`jae`w`yae`y`w`j`q`y`y`wae`w`y`qadadadadag`g`j`ja``j`q`yadad`jadadadadadadaj`gag`gag`mag`gaj`g`gaj`gagad`j`gad`jadada``j`qad`jah`wadar`j`y`j`{`w`y`j`y`y`q`{`j`y`q`{`j`y`jara``y`j`ja``pad`gaiad`gadadadadadad`j`y`j`p`ja``q`yad`p`gadag`gad`j`yad`j`y`q`y`j`w`j`wae`w`y`jar`j`y`q`y`y`j`j`wae`y`j`w`yae`y`w`j`j`y`w`{`j`y`y`j`j`w`{`j`y`gad`j`y`y`j`jad`y`j`y`j`y`q`j`y`j`y`q`y`j`y`j`y`q`ja``j`y`q`yadadad`j`j`y`j`y`q`y`q`jadadadad`ja``j`y`j`y`j`y`j`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`q`y`j`j`y`qad`y`j`y`j`w`j`y`p`y`j`y`j`w`ja``j`y`q`j`yae`wae`y`j`{`y`jar`y`j`y`q`yad`jadada``jadadadadadadadadadadad`j`w`j`y`q`y`j`y`j`yae`{`y`y`q`y`yae`y`w`y`y`q`{`y`r`y`j`{`q`yae`y`yae`y`j`y`j`{`w`j`{`~`y`y`j`w`y`j`{`w`y`j`{`yae`j`y`w`y`j`{`j`j`w`y`{`q`y`j`y`j`y`yae`y`y`j`{`j`y`j`j`y`y`j`y`{`j`y`yae`y`{`j`{`j`{`j`j`y`j`y`j`y`j`y`y`j`y`d`a`a`a`a", +"atatatat`y`j`y`y`j`y`jar`yae`y`wae`y`{`j`{`w`{`j`{`yae`w`{`yar`j`{`y`jae`y`wae`y`j`yae`y`y`r`y`y`jad`q`{`j`y`{`q`j`y`j`y`j`y`j`wae`y`q`y`{`w`j`j`q`jad`qadadad`padadagadadadad`{`pad`j`jad`jad`nacad`j`y`j`w`jad`j`y`ja``q`y`jad`j`w`jad`y`j`s`{`r`ja``j`jad`y`p`ja``y`j`qa``j`j`y`q`y`j`y`w`j`y`q`yae`y`y`q`y`y`q`j`yadadadadadajadad`p`ja``q`yae`y`y`{`{`w`y`{`jar`y`j`w`j`yae`y`j`{`q`{`{`j`y`q`y`j`y`y`y`j`w`y`y`j`y`q`y`j`y`{`y`j`j`j`{`j`y`jad`sadad`p`gagadad`p`jad`padad`padagadag`p`gaj`gag`gag`gagadaj`gadaj`gadag`g`gadajadadadadad`p`j`j`w`j`y`q`y`j`{`q`y`r`y`y`j`w`y`y`y`j`wad`{`q`y`jad`j`y`jad`gaj`gaj`padad`p`y`jad`y`j`{`jad`j`yadaj`gaj`p`g`p`j`y`j`j`y`j`w`j`y`j`{`j`yar`y`yae`y`q`y`y`j`y`w`j`{`y`y`q`{`{`yae`y`j`yar`j`wae`y`y`j`w`j`yadadad`w`j`y`w`j`jad`y`j`y`y`p`y`j`y`j`j`w`j`y`j`y`q`j`j`y`q`jad`uadad`j`y`j`j`ya``q`yadadadad`jad`q`y`j`w`j`y`q`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`j`y`j`y`w`j`y`y`q`j`y`ja``j`j`y`j`j`wad`y`j`j`y`j`y`j`y`y`j`w`{`j`y`j`y`{`j`w`j`y`j`yad`y`qad`jadad`jadadadadadajadadad`y`y`j`j`w`yae`y`w`y`j`j`y`{`j`w`{`j`{`j`{`y`jar`y`j`w`y`y`y`r`y`yar`j`y`j`y`j`y`q`y`{`j`{`j`y`q`yae`y`j`y`j`y`yae`y`j`y`y`y`y`j`{`j`{`j`w`{`yae`w`j`yae`y`y`j`{`y`j`y`{`y`j`y`y`j`{`y`y`j`y`y`y`j`y`y`j`{`j`y`j`y`j`{`d`y`j`y`a`a`a`a", +"atatatat`y`y`{`y`yae`y`yae`y`y`{`{`y`r`yar`{`y`{`y`r`{`y`{`j`{`{`y`w`{ar`y`{`jar`y`w`y`r`y`yae`wad`w`ja``j`w`j`y`y`{`j`w`yae`y`w`j`y`j`y`y`j`j`{`y`ya`ad`y`padadadadad`gadagadad`y`y`q`y`y`pad`gaa`iad`w`y`j`yad`y`q`y`y`j`j`y`j`w`j`y`y`q`y`y`j`j`ya``j`w`j`w`{`j`y`j`qad`y`j`w`j`y`j`y`q`{`{`r`y`y`{`w`j`yae`wad`{`qa``jad`padadad`u`yad`j`y`w`j`w`{`y`r`y`yaear`y`{`y`{`y`yae`w`y`w`{`y`jar`y`w`{`jar`j`wae`y`j`y`r`y`y`j`y`q`{`j`y`w`j`y`w`j`y`ja``j`q`jad`gag`gad`gadadadaj`gagadag`g`gaj`g`uag`gaj`g`gadad`uadadad`gag`gagag`gaj`gadad`sad`ja``j`y`jad`y`j`j`y`y`{`j`y`wae`y`j`{`q`{`w`j`y`j`y`w`j`w`j`w`jadad`uadajadadad`q`yad`y`q`y`w`y`j`padadag`gadad`jad`jarad`q`y`j`y`{`q`y`wae`yae`y`q`y`y`{`q`y`yae`y`y`r`y`y`jar`j`w`y`wae`y`y`j`yar`j`y`{`w`j`pad`j`j`w`ja``j`y`y`q`y`j`w`j`y`j`y`q`y`j`y`qa`ad`y`j`yad`jadadadad`j`y`q`y`j`w`{`j`y`qadadadad`y`ja``j`j`w`y`j`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`j`w`y`j`w`j`y`j`j`y`y`j`p`y`j`y`q`y`yad`y`j`j`w`j`s`j`j`w`jar`y`y`{`q`y`{`y`q`y`y`j`w`y`jadada``jad`yadadadadadadadadadadad`j`j`w`y`{`j`y`{`j`{`w`{`q`y`{`j`y`j`y`y`jar`y`j`y`yae`y`q`{`yae`j`y`w`y`jar`y`yae`y`w`j`y`y`{`{`y`j`{`yar`jar`y`j`{`w`j`yae`y`yae`w`y`j`{`q`y`y`{`j`y`j`yae`y`y`j`{`j`y`j`{`j`y`j`y`j`yae`y`j`y`j`y`y`j`y`j`y`y`y`j`y`j`y`y`a`a`a`a", +"atatatat`yae`j`y`j`{`j`w`{`jar`j`{`j`y`y`r`{`q`{`{a``r`y`{`q`yae`{`y`{`j`{`w`y`jae`y`{`j`w`j`y`j`y`j`j`q`y`j`j`y`j`y`j`j`yar`j`y`jar`y`q`{`j`y`jadad`qad`jad`jadadadadagad`gag`iad`jad`jadad`q`gac`cad`j`j`j`{`j`y`j`j`wad`j`y`j`j`y`j`yae`j`w`y`j`j`w`j`yad`j`jad`w`j`y`y`j`y`j`w`j`{`ja``q`j`y`q`y`j`{`w`j`y`{`w`j`{ad`pad`gagadad`jad`p`y`j`y`{`j`w`j`{ar`y`j`{`q`y`r`y`{`jar`yae`{`j`w`yae`y`{ar`j`y`yae`wad`w`j`y`q`j`y`ja``q`j`y`y`{`j`y`y`j`q`yad`ja``jadaj`gagag`gag`gagag`gagag`gagagag`gadagadagadad`gadadagadadag`gagag`g`n`gajagadadadad`p`j`ja``q`y`j`p`j`y`q`y`y`j`w`j`y`j`y`j`w`j`y`j`yad`j`j`y`p`yadad`p`gajad`g`jad`j`w`j`j`j`p`jadadad`pajadadadadad`y`y`j`y`q`y`j`yae`y`q`y`yae`y`q`y`j`{`q`y`jar`j`yae`{`y`yae`y`y`{`j`w`y`{ae`y`wae`y`y`j`y`ja``j`j`y`q`j`y`j`j`q`y`j`y`q`y`j`y`j`y`jae`y`j`w`j`y`p`y`jadadadadad`y`j`{ad`j`w`j`y`jad`sajad`yad`y`j`j`w`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`w`j`y`j`j`y`j`w`j`y`q`j`y`j`y`q`ja``j`q`y`j`yad`j`yad`w`j`y`j`jar`j`j`{`j`w`j`y`j`y`j`j`w`jadad`ja``jadadadadadadadadadad`jad`y`j`y`r`j`y`q`y`j`y`j`{`j`y`q`{`w`j`w`j`yae`y`{`q`y`{`j`y`jar`y`j`yae`y`j`y`r`y`j`yae`y`j`w`j`y`j`y`j`{`y`j`{`y`q`{`j`y`r`y`j`w`j`yae`y`j`yae`y`yae`y`y`j`y`q`y`j`y`wae`y`y`yae`y`{`j`j`y`y`j`y`j`y`j`y`yae`j`y`j`y`j`y`j`y`a`a`a`a", +"atatatat`j`{ae`yar`y`j`y`yae`y`j`w`{`yar`{`j`y`{`yar`{`{ar`y`{`{`wae`w`{`w`j`{ae`y`yae`y`j`y`yae`y`q`y`yad`y`{`j`w`y`j`w`j`y`j`j`w`y`j`y`j`y`ja``qadadad`j`wada``qadad`wad`g`laaaaadadad`p`yadadag`n`iad`j`s`j`wad`j`wad`j`y`j`s`y`q`y`j`w`y`y`j`y`j`y`y`j`yad`s`{`jad`y`j`j`w`yaea``j`y`q`y`y`{`j`yae`y`y`j`{`q`y`j`yadadadadadadad`y`y`j`y`pa`ae`w`{`yae`y`q`yar`y`{`w`{`y`w`{ae`y`yar`y`y`jar`j`y`j`{`j`w`y`j`y`j`y`j`w`y`j`w`j`{`wad`q`y`j`w`j`y`y`j`yad`p`jad`p`gaj`g`n`gag`gag`n`gagag`g`gag`gad`g`gadagad`gajad`gadad`gag`g`n`i`gagadadad`p`ja`ad`p`ja``q`j`y`y`w`{`j`y`j`j`y`q`y`j`w`j`j`y`w`j`y`j`s`j`yad`j`jadadad`p`jad`p`j`j`y`p`y`y`y`qadad`gag`gad`pad`j`q`j`y`q`y`r`y`y`q`y`y`{`q`y`wae`y`y`q`y`jar`y`j`y`wae`w`j`w`{`wae`w`{`yae`w`yae`y`{`q`y`j`y`pad`qad`y`j`y`p`y`j`y`w`j`ja``j`y`j`y`j`y`w`ja``j`q`y`j`y`wadadad`j`q`{`j`w`y`{`j`w`{`y`jadad`jad`y`qa``j`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`q`y`j`{`j`y`w`j`w`y`j`w`y`y`j`yad`y`j`y`q`y`j`yad`q`ja``j`j`ja``q`j`y`y`j`y`w`yae`q`y`y`q`y`y`jad`yad`jada``jadadadadadadadadada`ad`j`{a``j`{`y`y`q`y`j`y`y`w`{`j`y`j`{`{`y`y`{`q`j`{`y`q`{`y`y`j`yar`j`y`yar`j`y`j`y`y`q`{`yae`w`{`y`r`y`y`j`{`j`y`{`y`j`y`y`j`{`y`j`y`w`j`y`{`j`{`j`w`j`y`r`y`{`y`j`{`y`j`{`yae`y`j`y`{`y`yae`y`{`j`y`yae`y`y`j`y`j`y`j`j`y`a`a`a`a", +"atatatatadad`y`d`y`r`y`j`w`j`{`y`j`j`{`j`wae`y`jar`j`y`{aear`j`{`y`y`jar`{`y`w`{`q`y`{`w`{`j`{`q`y`y`j`j`p`y`w`j`y`q`y`y`j`yae`y`j`j`jad`qad`j`pad`jadadadad`jad`y`j`y`y`j`y`j`uacacad`jadadadad`gagas`g`j`y`j`j`s`j`j`w`j`w`j`y`j`y`j`w`j`j`w`j`j`wad`y`qae`y`y`r`y`j`w`j`y`j`j`y`q`y`j`j`y`q`y`q`y`w`j`{`w`y`j`w`jar`j`yadad`g`j`jad`q`y`j`{`w`j`{`w`j`w`j`y`j`{`j`yae`w`j`{`q`yar`j`j`{`w`{`{`w`jar`y`yae`q`y`q`y`j`y`j`q`y`ja`ae`y`w`j`j`y`j`w`j`j`w`j`y`ja``jad`yadadad`gag`g`g`gag`g`gagad`gajadaj`gadagadad`gadadadadad`gagag`n`g`i`gadadadajadadadadad`y`j`j`j`y`j`w`yae`y`j`y`j`y`y`q`{`j`y`q`j`s`j`j`q`y`j`j`padadadadad`y`pad`j`jad`w`j`j`yadajadadadadadadad`q`y`y`j`y`q`{`y`q`y`j`j`y`j`y`q`{`y`j`y`jar`yar`j`y`y`{`j`{`j`yae`jar`y`j`{`wae`yae`w`yae`y`ja`adad`j`j`y`qad`y`j`y`j`j`w`j`y`q`j`y`j`y`j`y`j`q`j`jad`w`jadadad`j`y`j`q`y`j`y`j`y`w`jadadadad`j`ja``ja``q`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ae`y`y`j`y`j`yae`j`y`j`{`j`y`j`q`y`j`p`y`j`y`q`j`jad`j`y`p`ja``j`j`y`j`y`j`w`j`y`{`j`y`q`{`j`yar`j`jadadad`jadadadadadajadadadadadad`j`j`w`j`y`q`j`y`j`y`q`yae`j`y`w`j`y`j`j`q`y`j`y`y`q`j`y`q`yae`y`{`yae`w`j`y`j`{`yae`y`j`w`j`y`j`yae`y`q`{`y`j`wae`y`j`yae`y`y`j`y`j`{`y`y`q`y`{`j`y`{`y`j`y`j`{`y`y`j`y`j`{`y`j`y`y`j`j`y`{`j`y`y`y`j`y`y`j`y`{`j`y`j`y`y`j`a`a`a`a", +"atatatatadad`j`y`{`j`y`j`y`{`yae`w`{`y`w`{`y`y`{`j`{`y`{ae`y`yarae`{`w`{`jar`j`{`y`{`wae`j`y`w`j`j`yae`yad`y`j`{`j`y`j`j`y`y`j`y`q`y`y`q`yad`ja``jadad`y`p`ja``y`j`w`yar`jar`yad`g`gac`g`jadadad`gag`gagag`yad`ja``j`y`ja``y`j`j`y`w`j`ya``yae`y`w`y`j`j`y`j`w`j`y`j`y`y`{`y`p`y`q`y`j`y`y`q`{`y`y`q`{`j`yae`y`j`y`j`{`y`w`jagadad`j`w`y`yar`j`{`y`{`j`{`yar`{`yar`y`y`w`j`{`w`y`{`j`y`{`w`j`{`yae`y`y`{`j`w`y`{`y`y`j`y`j`y`y`j`y`p`j`y`j`w`j`s`j`y`wa``{`j`s`j`j`sadad`j`padadadadajad`gadagadadadad`gad`j`p`g`padadadadadadaj`g`g`i`gagadadad`yadad`wad`j`pad`jad`w`j`j`j`y`q`y`yar`j`y`q`y`j`y`q`y`y`j`y`j`yad`j`w`ja``y`jad`s`jada``y`j`w`y`jad`j`sag`gad`padad`p`y`j`y`q`y`q`y`yae`y`jar`j`y`j`w`y`j`w`j`j`w`y`{`j`y`{ar`j`w`{`q`y`y`w`j`{`y`j`y`j`y`q`y`{`j`w`y`w`j`pad`j`y`j`y`j`j`y`q`y`y`j`w`j`y`y`jar`j`w`j`y`j`w`y`j`yadadadad`y`q`y`y`y`j`q`y`ja``j`padadada``q`y`j`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`y`q`y`j`w`y`q`y`y`y`q`y`j`y`j`ya``y`j`s`j`jada``j`yad`j`y`j`j`s`j`y`q`y`y`j`y`j`w`y`y`y`j`w`j`j`y`padadad`p`jadadadadadadadadadadad`j`y`y`y`j`y`y`r`y`{`y`q`y`y`{`j`{`y`w`j`y`y`jar`y`yae`y`y`yae`w`{`wae`y`y`{`j`y`y`q`{`y`j`{`w`{`j`y`y`{`q`y`y`{`y`q`yar`y`{`wae`y`j`wae`y`{`q`y`{`y`jar`y`{`j`wae`{`y`{`y`j`y`yae`y`{`y`y`j`y`{`j`yae`y`j`y`j`y`j`y`y`j`y`a`a`a`a", +"atatatat`y`jad`j`y`yar`yar`j`w`y`j`j`y`j`{`jar`y`{`q`{`yar`j`y`yae`{`y`j`y`{`wae`{`y`jar`y`j`y`j`p`y`j`jadad`j`ja``j`j`wad`q`ja`ad`jadad`yadadadad`p`ja``j`q`y`q`y`j`{`j`y`yar`{`j`p`g`gagadad`j`gadad`gagad`jadad`y`j`q`yad`{`y`j`y`j`w`j`y`q`y`j`y`w`y`y`j`w`y`j`w`j`q`j`y`y`j`y`j`wae`j`y`q`y`j`y`j`w`j`y`q`y`y`q`{`j`j`sadad`g`j`y`q`{`y`y`q`{`q`y`j`{`j`wae`j`y`j`y`{`j`{`r`y`y`r`y`{`w`jar`yar`jarae`y`q`j`y`w`y`q`y`j`j`w`j`y`y`qa``j`y`jad`y`j`qad`y`j`w`j`j`y`qadadad`j`padad`pagad`gadad`gadad`padad`jadadajad`gaj`gag`gaj`g`gagad`gad`q`jad`yad`yadad`p`y`jad`ja``q`j`j`y`j`y`j`y`{`q`y`y`j`q`y`q`j`ja``j`j`wad`jadad`jadad`j`p`j`ja``q`y`j`yaiagadad`j`yad`j`j`y`j`y`j`w`y`q`{`y`q`{`w`yae`j`y`j`y`y`j`q`j`{`j`y`j`y`{`y`j`w`{`{`j`w`{`j`w`y`{`j`w`y`j`j`y`{`j`yad`padad`qa``j`y`j`w`j`j`y`j`y`q`y`j`y`j`yad`y`j`j`w`j`yadadadad`y`j`r`j`y`j`q`y`j`y`yadadadad`j`q`y`qad`y`}`}`}`}`}`}`}`}`}`}`}`}`}`j`yae`y`j`y`j`y`j`q`j`y`j`q`y`j`y`j`q`j`y`jad`y`jad`jad`y`p`j`y`j`j`j`j`y`j`jar`y`jae`j`y`j`y`j`y`q`y`jadadadad`jadadadadadadadadadadad`j`j`w`j`y`w`j`y`j`y`j`y`r`y`j`w`j`{`jar`j`y`{`j`y`j`y`j`w`j`{`j`y`j`y`j`y`q`y`{`j`y`j`y`j`y`j`wae`w`y`{`jae`y`j`{`y`jae`j`y`j`yar`j`y`j`w`j`{`q`{`y`j`yae`y`j`y`{`j`j`y`j`{`y`j`y`j`j`{`j`y`j`y`{`j`y`y`y`j`y`j`j`y`j`j`y`a`a`a`a", +"atatatat`j`y`ja``j`j`j`{`yae`yae`y`{`j`{`w`j`{`j`yae`y`{`j`{`y`r`{`yar`y`{`r`y`yae`y`w`y`{`{`p`j`yadadadadadagad`y`qad`ja`ad`j`ja``padad`jadadadadadad`y`j`y`{`yae`{`w`y`{`q`{`j`y`y`wad`iada``jadadadaj`gadadadad`pad`y`j`y`q`y`j`w`j`y`q`{`y`j`wae`y`j`q`j`y`j`y`j`y`y`y`y`j`w`j`yad`y`j`y`y`j`j`y`w`j`y`w`yae`y`y`{`j`w`y`jad`gad`j`{`y`y`r`y`{`y`{`w`yar`j`y`yar`{`w`{`q`y`{`y`r`y`{`w`j`{`{ae`y`jar`y`y`{`yar`yae`{`y`j`w`y`y`jar`j`y`j`w`j`y`q`j`y`q`y`q`y`j`y`ja``ja``j`padad`gadad`gaj`gadag`p`jadad`jad`padad`gajag`g`gag`gag`gag`gag`g`jad`y`qad`j`y`q`y`jadad`w`jad`j`y`w`j`q`y`j`w`j`{`j`w`y`j`y`y`ja``j`q`y`y`q`j`y`wad`qada``j`j`p`y`j`j`wadad`g`j`y`q`y`q`y`y`w`j`w`j`y`j`y`q`y`j`j`y`y`p`j`y`q`y`q`y`j`y`w`y`r`yar`yar`j`{`j`w`yar`j`{`y`j`{`j`y`{`w`j`y`j`w`j`yad`yad`j`j`w`j`y`j`w`j`y`q`y`j`j`w`j`y`j`w`y`j`ja``j`qadad`j`p`j`y`y`j`{`y`y`r`y`y`q`jadadad`j`y`j`y`j`w`}`}`}`}`}`}`}`}`}`}`y`j`w`j`y`w`jar`j`y`j`y`j`y`j`y`y`y`qad`j`y`y`j`y`q`ja``j`y`q`y`ja``j`yad`w`{`y`q`y`j`y`j`y`y`q`j`y`q`y`j`yadadadad`p`jadadadadad`jadadad`g`j`y`y`j`w`j`y`j`y`w`j`y`j`y`w`j`y`y`{`j`y`y`q`j`y`y`q`j`{`y`j`y`yae`yar`j`y`{`q`{`jar`y`{`q`{`{`j`y`j`{`j`y`j`{`q`y`{`j`y`{`yar`j`{`y`y`{`yae`y`y`j`yae`y`y`j`{`j`y`jar`yae`y`{`j`y`y`y`yae`y`y`j`y`j`y`d`j`y`{`y`j`y`y`j`a`a`a`a", +"atatatat`{`y`j`y`j`yad`j`y`j`y`q`{`jar`yae`y`{`wae`y`j`w`j`{`{`y`q`{`{`r`y`y`j`w`j`{`{`j`w`y`{ad`jad`gadad`gaj`gad`~adad`jadad`jad`j`j`padad`qada``j`pa``{`q`{`w`j`{`jar`{`yar`yae`y`y`j`p`gad`j`yad`gadag`g`g`j`ja`ad`q`y`w`j`j`y`y`j`y`p`y`j`y`y`j`y`y`y`j`w`jar`j`y`j`q`{`ja``j`w`j`y`j`w`j`w`j`y`y`j`y`j`w`j`y`q`yae`y`y`j`qad`g`j`j`y`q`{`j`{`r`yae`y`y`j`wae`{`j`{`yae`w`y`{`j`y`{`j`w`y`yar`y`yae`q`y`{`q`{`y`w`{`jar`y`j`w`y`j`y`j`yae`wad`j`y`j`y`j`y`j`y`qad`j`qadadad`jad`padadad`gajad`gadadadad`yadadadadad`gag`gaj`gag`gaj`gaj`gadad`qa``ja``qad`yad`q`y`}`}`}`}ad`j`jad`j`w`j`y`y`q`y`j`j`wad`j`qa`ad`j`j`y`j`jadad`jadad`qa``jad`p`ja``jadad`g`p`j`y`y`j`j`j`y`j`y`y`q`y`j`y`w`j`y`q`j`y`j`y`j`ja`ar`j`y`j`yae`y`j`w`j`{`y`q`yae`y`r`y`j`w`j`{`wae`{`y`q`{`j`y`q`{adadadadad`j`j`yad`yae`y`j`q`yad`q`j`y`j`w`jad`j`y`y`qadadadad`j`y`y`j`j`j`y`j`y`j`y`padadad`jad`jad`yad`j`}`}`}`}`}`}`w`j`y`j`y`j`j`y`j`y`q`y`q`y`j`w`j`j`qad`y`j`p`jad`w`jad`w`jad`y`j`q`y`j`y`j`y`j`q`y`j`y`q`y`j`j`y`y`j`y`j`j`y`qadadadadadad`jadadadadadadadadadad`j`j`j`{`j`y`q`{`j`y`j`y`j`yae`y`j`y`j`w`j`y`w`j`y`j`w`j`yae`y`y`q`y`j`y`j`y`y`j`y`y`j`y`{`y`y`r`y`y`wae`y`y`j`{`j`y`{`j`y`j`y`y`j`{`j`y`y`j`yae`y`{`q`y`{`j`y`y`j`y`j`y`yae`y`{`j`y`j`y`y`j`{`y`j`y`j`y`y`j`yae`y`j`y`j`a`a`a`a", +"atatatat`y`j`{`ja``j`j`w`{`q`{`yae`y`{`y`q`{`j`y`yara``j`{`y`j`y`j`{`j`y`{`y`j`{ar`y`j`y`{`r`y`j`j`g`jadaj`gag`gadadadadad`w`ja``pada`adadad`ja``jad`{`j`w`j`{`y`y`j`y`{`yae`y`j`yar`j`w`{adad`g`j`y`qadadadagadad`y`q`ja``j`j`y`w`j`j`w`y`{`j`yadar`j`j`w`j`j`y`y`jarad`y`j`y`w`j`ja``j`w`j`y`y`j`y`y`q`j`y`y`{`j`y`y`j`y`jaradadadadad`w`{`y`yar`y`j`w`yaear`y`y`j`yar`jar`y`{`q`{`y`q`{`yae`w`j`{`j`w`{`y`j`{`y`j`yae`w`y`y`j`{`j`y`j`w`y`q`y`j`y`wad`y`j`y`q`j`yad`w`ja``ja``j`p`yad`jad`p`gaj`gagad`gadad`q`ja``q`gag`gaj`gag`g`gagag`g`gagadad`jad`wad`j`y`j`y`}`}`}`}`}`}`y`j`s`j`yadad`j`y`w`jad`j`s`j`yad`q`y`ja``qa``j`y`p`y`ja``j`ja``j`y`j`yad`pajad`y`j`w`j`yad`w`j`w`j`y`r`y`w`j`yad`y`j`w`j`y`j`w`j`yae`w`yar`j`y`w`{ae`y`w`{`j`y`w`j`y`{`wae`y`j`y`q`y`{`j`y`q`y`y`j`yadadada`ad`q`j`y`q`j`w`y`j`y`y`j`yad`j`y`j`yad`j`y`y`jadadad`j`j`w`y`j`y`w`{`j`w`jadadadadad`y`w`j`j`y`y`j`w`j`y`j`j`y`j`y`q`y`j`j`w`y`y`j`y`y`j`j`y`q`y`j`w`ja``j`y`j`j`y`jad`wad`j`y`j`w`jad`w`j`y`j`y`{`y`j`{`w`j`y`j`q`y`y`y`j`y`jad`gada``jadadadad`jadadadadadadad`y`j`w`y`j`y`j`yar`j`y`q`yar`j`y`q`y`{`j`{`y`q`y`j`y`y`q`y`j`{`j`yae`y`{`q`y`j`y`{`w`j`{`j`{`yae`yae`y`y`q`y`y`w`{`j`y`{ae`w`{`j`j`{`q`y`j`y`y`j`y`{`q`y`y`{`j`{`y`yae`y`y`j`y`yae`y`j`y`yae`{`y`j`{`yae`y`j`y`y`j`y`a`a`a`a", +"atatatat`y`{`j`{`w`j`y`j`y`jar`y`{`q`{`y`j`w`{`j`{`jar`y`q`{`y`w`j`{`y`r`{ar`y`j`{ar`jar`y`y`yar`gadadada`adadadad`y`j`y`yad`y`j`y`j`y`w`y`y`j`y`sae`y`y`j`{`y`r`{`w`{`y`r`y`y`wae`y`{`j`y`ja``pad`yad`jad`g`gag`~ad`y`j`w`y`j`y`y`jar`j`w`j`{`q`y`j`w`j`y`y`qa``j`{`j`w`y`j`y`j`j`y`q`y`j`j`w`j`{`j`w`y`j`w`j`q`yad`jar`yad`y`q`y`w`jadad`y`r`j`y`y`{`y`w`{ae`w`{`y`{`y`yae`y`{`y`r`y`y`q`{`y`{`w`{`yar`jar`y`r`y`{ar`j`{`q`yar`y`y`r`y`j`{`y`{`s`j`{`q`y`j`y`y`j`y`j`w`j`ja``q`y`jad`p`yadad`s`jad`padaj`gad`jad`j`y`j`g`gag`gagag`g`gag`gaj`gadadad`jad`w`j`j`w`}`}`}`}`}`}`}`y`j`y`p`j`j`jad`jad`w`j`y`j`j`jad`y`q`y`j`y`w`j`y`j`padad`wadad`j`p`j`jadad`gag`pad`j`w`j`y`y`j`y`j`y`j`{`j`wae`y`y`j`j`y`p`y`j`y`q`yae`y`y`r`{`y`y`q`{`j`{`wae`y`j`w`j`{`j`w`yae`y`j`yae`y`y`q`j`y`q`jadadadadad`y`j`y`j`y`j`j`j`s`j`{`w`j`p`y`j`w`jad`wad`jadadad`j`j`y`j`y`j`j`y`j`y`jadadadad`ja``qad`j`y`j`j`w`y`j`w`y`j`j`y`j`y`j`j`y`j`q`y`j`y`wad`y`j`j`j`jad`y`pad`j`y`j`j`ja``q`j`y`j`w`j`y`q`y`q`y`q`{`j`y`{`q`y`y`j`q`y`j`j`yadadaj`gadad`jad`jadadadadadadad`jad`j`y`j`y`q`y`j`y`j`y`yae`y`j`y`y`jar`y`j`j`y`j`y`y`j`y`j`y`y`q`y`y`j`j`y`{`{`q`yae`y`q`y`j`wae`y`y`q`y`{`j`w`j`y`j`w`y`q`y`{`y`j`y`j`y`j`y`q`{`j`y`j`y`j`y`{`j`j`y`yae`y`yae`y`j`y`{`y`j`y`j`y`j`{`j`y`y`j`y`j`y`j`y`a`a`a`a", +"atatatat`{`j`y`y`{`j`yad`j`{`j`j`w`{`{`j`q`{`j`{`j`w`{`j`{`y`jar`j`yae`y`y`{`yarae`y`yae`yae`w`j`{adad`j`jadadadad`j`y`q`y`j`{`j`w`y`j`j`y`q`{`wae`y`yae`w`{`q`y`y`j`{`q`y`{`yae`y`{`q`y`{`w`j`jadad`p`j`y`qad`g`gad`j`q`y`j`j`{`q`y`j`y`j`y`q`y`j`y`{ad`y`q`{`j`w`j`w`y`j`y`j`s`j`j`y`jad`y`jad`w`j`y`j`j`y`j`j`y`p`y`jad`p`j`{adadadadad`j`j`w`y`j`{`q`{`j`w`y`{`{`q`{`q`{ar`j`w`j`{`y`{`y`y`{`jae`w`{`j`{`y`yae`w`yae`y`{`yae`y`q`y`j`y`w`j`j`j`y`j`y`y`q`j`{`w`j`q`y`y`q`jad`y`jad`y`jad`w`j`jadadadadadad`gadadad`j`pad`gaj`gag`gajad`gadad`gad`ja``pad`j`g`y`}`}`}`}`}`}`}`}`j`s`j`y`qa``y`wad`ja``j`jad`w`y`jad`j`j`q`j`y`jad`y`jadad`j`jadad`y`padadadag`p`ja``j`yar`j`y`q`{`y`q`y`w`j`w`j`y`q`y`j`y`j`j`w`y`j`y`q`y`j`y`q`j`{`j`y`wae`y`y`j`j`y`y`r`y`j`{`j`y`q`y`q`j`y`j`j`y`y`jadad`jadadad`j`y`qa``qad`y`j`j`j`y`jad`wad`j`y`y`j`qa``pajada``j`j`q`y`y`j`w`jadajadadad`j`jad`j`wa``j`j`y`y`j`j`y`j`w`j`y`q`yad`y`r`y`j`y`j`jad`j`j`s`yad`w`j`y`ja``j`s`j`y`waea``j`y`j`y`j`y`yae`y`y`j`{`y`j`y`j`wae`y`j`y`q`yadadadag`g`jadadaoad`j`s`jadadadadadadad`q`y`j`y`y`j`w`y`q`y`j`{`w`j`y`j`y`q`y`y`j`{`q`y`r`y`j`w`j`y`j`y`y`q`y`j`yae`y`y`y`y`{ae`y`y`j`{`{`j`{`yae`y`j`{`y`j`yae`y`w`j`{`w`j`j`y`y`j`y`y`{`j`yae`w`y`y`j`j`yar`j`y`{`y`{`j`y`{`j`y`{`j`y`yae`y`y`j`{`j`{`a`a`a`a", +"atatatat`y`{`j`{`j`y`j`y`j`y`j`yae`y`{`y`w`y`{`q`y`{`j`yar`j`{`y`w`{`y`q`yae`y`y`w`{`q`y`{`j`{`yar`j`gadad`padadadad`{`y`q`y`y`{`yar`{`y`y`yae`y`y`w`{`y`{`j`{`w`j`{`{`y`r`{`yar`y`{`y`q`{`{`y`jadada``jad`yadadagada``y`qad`y`y`j`y`j`y`{`j`y`j`w`j`y`{`y`j`yad`y`j`{`w`j`{`w`y`j`y`p`y`jad`yad`j`yad`q`yad`w`j`j`yad`j`yadadadad`gagad`gad`yae`w`y`j`{`y`jar`j`w`j`{`y`yae`y`y`{ar`y`q`{`r`y`yar`y`j`{ar`y`y`{`w`j`yar`y`y`q`{`y`{`w`j`{`y`q`y`y`q`{ad`w`y`j`j`s`j`y`qa``y`j`w`j`y`j`s`j`j`ya``p`j`wa``qadadadadad`padadad`gag`gagag`gadagadajadad`pad`jadad`pad`}`}`}`}`}`}`}`}`j`y`j`j`y`j`jar`j`p`j`y`q`yad`j`w`j`y`y`j`w`j`wad`y`j`wadadad`jad`j`j`sad`gaj`gad`j`y`j`j`y`j`w`j`y`j`y`j`y`j`y`j`j`p`j`w`j`y`{`jar`y`{`q`y`y`{`w`jar`y`j`y`q`{ar`{`j`y`y`{`w`j`y`y`j`y`jad`w`jad`pad`j`s`jadadadadad`jad`y`j`y`p`y`j`s`j`j`y`j`s`j`j`yad`y`j`yad`padad`j`y`q`y`ja``jadad`gadadadad`j`j`j`y`j`q`y`j`y`q`y`j`j`yad`j`q`y`y`j`j`s`y`j`yad`yad`j`y`j`j`w`j`j`q`y`j`jad`y`j`qa``j`p`j`y`q`y`j`yar`j`j`w`j`y`y`y`j`w`y`y`{`j`y`jad`gagadadadad`jadad`jadadadadad`w`j`y`j`w`j`j`y`j`{`j`w`y`j`j`y`q`y`j`y`q`y`j`y`y`j`y`y`j`j`y`w`j`j`y`y`j`yar`y`q`j`{`q`y`j`wae`y`j`y`j`j`y`y`j`y`j`yae`y`w`j`j`y`y`j`y`{`y`j`y`j`y`j`y`y`j`j`{`y`j`y`j`y`j`{`j`y`j`{`y`j`y`j`~`y`jah`j`j`y`y`jah`j`a`a`a`a", +"atatatat`j`j`y`{`j`w`y`j`y`j`y`j`j`y`{`r`y`j`{`j`y`{`q`y`yae`yae`yae`j`y`j`{`y`r`{`j`yar`yae`y`wae`y`yad`j`{a``qadag`y`j`{`y`y`r`j`y`j`{`jar`{`jarae`y`j`r`yar`j`y`w`{`q`y`{`q`{`j`{`q`{`{`y`q`yarad`g`j`w`jad`j`gagad`q`j`y`q`y`j`y`jar`j`y`w`{`q`y`y`j`q`y`j`w`j`{`j`y`j`y`j`j`y`w`ja``q`y`jad`q`j`w`j`y`y`j`y`yad`j`w`jad`j`pad`gagag`gajad`y`j`{`y`q`y`q`{`y`yae`w`y`wae`w`y`q`{`j`{`y`{`j`w`{`j`{`w`j`{`y`qae`yar`yaear`y`{`y`q`y`{`q`y`{`j`w`j`y`q`y`j`j`w`j`{`y`j`y`q`j`y`j`q`ja``j`wad`j`{ad`y`j`ja``padaj`g`gajadadaj`gagag`gaj`gadadad`gadajad`gadadadad`}`}`}`}`}`}`}`}`}ad`q`y`jad`wad`j`ya``jad`y`j`yad`j`w`jad`y`jad`j`j`p`j`j`y`j`pa``jadadadagagagadaja``j`y`q`j`y`j`y`q`y`q`j`j`y`q`yad`y`j`j`y`q`y`jar`y`j`y`j`q`{`yae`y`y`q`{a`ae`y`q`y`q`y`j`j`y`j`y`qad`y`jad`wadad`jadadad`j`wadadadadad`jad`y`j`q`yadad`j`y`j`j`y`jar`jad`w`j`yadadad`jad`j`j`wad`jad`gadadadadad`yad`w`j`yad`y`jad`jad`y`jad`y`yad`q`y`ja``j`q`y`jad`j`ja``j`j`y`ja``j`yad`j`y`j`y`j`j`w`j`y`j`y`j`j`y`q`j`y`y`y`j`wae`y`y`j`y`j`q`y`q`y`j`g`gagagadadadad`yadadadad`jad`y`j`y`j`y`y`j`y`y`q`y`j`y`j`w`y`j`y`j`y`{`j`w`j`j`y`q`y`j`yae`j`y`q`{`j`q`y`j`j`y`y`y`j`y`y`j`y`j`w`j`y`y`q`y`j`y`j`y`j`y`j`y`y`y`j`{`j`{`j`{`y`j`y`j`{`j`y`{`j`y`j`{`y`j`y`yae`y`j`y`j`y`y`{ae`y`y`j`y`y`yae`y`y`a`a`a`a", +"atatatat`j`{`j`yae`y`y`j`j`s`{`j`w`j`y`{ar`j`{`y`{`y`j`{`w`y`r`y`{`q`y`j`w`{`j`y`{`yae`yar`j`y`{`waeara`ad`j`jad`yadad`j`yar`j`yar`yar`j`y`w`{`{`y`wae`y`y`{`yar`{`j`{`{`y`y`{`yar`j`{`j`w`{`{`y`{`jadadad`y`wad`y`gag`y`j`y`j`w`j`w`j`yar`j`y`j`y`w`{ae`y`j`w`d`y`w`j`y`q`y`j`w`j`{`j`yad`wada``jadad`yae`j`y`q`y`ja``j`w`y`j`j`y`ja`ad`g`gad`jad`w`{`y`y`{`q`y`y`j`{`j`wae`y`{`w`{`w`j`{`w`y`yae`y`{`{`jar`y`{`y`y`j`y`{`j`wae`y`yar`{`y`j`w`{`j`y`j`{`w`j`y`j`w`j`y`j`y`j`wada`ad`{`p`j`y`j`s`j`j`sad`j`ja``w`jad`gag`gad`gaj`g`gagagad`gajadad`gadadad`uadad`g`}`}`}`}`}`}`}`}`}`ya``j`j`y`y`j`j`s`j`y`j`y`q`ja``y`j`j`w`j`y`y`y`y`j`j`sadad`ja``p`jad`g`gag`n`gad`j`p`y`yad`y`j`y`y`yar`j`wad`y`j`y`j`w`j`y`j`w`yae`y`q`{`j`y`y`r`y`yae`y`jar`y`{`j`wae`y`y`q`y`j`w`y`j`jadad`jad`yadad`pad`jad`q`y`jad`pad`jad`j`y`j`w`j`yad`j`w`ja``j`y`ja``j`ja``padadadad`j`jadadadadadad`ja`ad`j`ja``j`j`w`j`yada``j`j`w`j`j`j`yadad`r`y`yad`j`y`p`j`w`j`w`j`y`y`j`w`j`y`j`j`w`j`y`j`y`q`y`y`j`w`j`y`y`jar`j`{`j`y`w`j`{`j`w`{`j`y`j`j`wadad`h`gaj`gadadadad`jadadad`jad`q`y`j`w`j`y`y`j`j`y`y`q`y`j`y`w`jar`y`j`y`y`y`j`y`y`j`y`y`y`j`y`y`j`y`j`j`y`j`y`q`y`j`y`j`y`j`y`j`y`j`j`y`j`y`{`jar`j`{`j`j`j`y`j`y`y`y`{`j`y`y`j`{`y`y`j`y`y`j`y`y`{`yae`y`yae`y`{`j`y`j`y`j`{`j`y`j`y`j`y`j`{`a`a`a`a", +"atatatataea``j`{`y`j`{ae`w`y`j`j`yad`jar`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`q`y`q`{`y`{`s`{ae`y`q`{`j`w`g`jad`j`y`jadag`gad`y`q`y`j`j`y`{`j`y`jar`j`y`j`j`q`y`{`q`y`j`y`q`y`j`w`y`j`y`y`j`y`j`y`j`ja`ad`p`j`y`p`yae`y`yar`y`j`yar`y`j`w`{ad`y`qad`yad`jae`w`j`w`{`j`w`{`j`w`y`{`jae`yae`y`r`yae`waear`y`jar`{`y`j`y`r`}`}`}`}`}`}`}`}`y`jar`y`j`y`w`j`yar`j`y`j`q`y`y`q`y`q`{`y`j`w`q`yad`j`y`j`w`j`y`j`y`p`j`yad`j`padag`gagagag`g`gagad`gadad`gadadajad`gadajadadadad`}`}`}`}`}`}`}`j`j`w`j`j`w`j`q`y`j`y`j`w`j`yad`j`j`y`j`y`q`j`y`j`j`s`j`y`jad`jadadadadaj`mag`gajada``j`j`j`w`j`jar`q`j`j`y`j`j`y`q`j`y`y`wae`y`j`y`q`j`y`y`{`q`y`{`j`q`{`w`j`y`q`j`y`j`y`q`y`j`j`jad`y`q`yad`qadadad`q`yadadadad`j`w`ja``jadadad`j`ja``j`y`j`wad`jad`y`j`j`w`j`y`jad`jad`gaj`gadadadadagad`jad`j`p`jad`j`p`y`j`jad`yad`q`jada`adad`yad`ja``jad`j`jadad`j`ja``j`ja``q`y`j`j`y`j`wa``j`j`w`j`j`y`j`y`j`y`j`{`q`ya``jar`y`j`y`j`y`{`j`y`j`w`y`j`y`jadag`g`iadadadadad`gadadada``j`y`j`y`j`j`y`j`y`q`y`j`y`j`y`j`j`y`j`j`j`y`j`j`y`j`j`y`q`y`j`y`q`y`j`y`y`j`y`j`y`j`y`j`y`j`j`y`j`y`j`y`j`j`y`q`y`j`y`j`y`jar`y`j`y`y`j`j`y`j`yae`y`y`j`j`{`j`y`yae`y`j`y`y`yae`y`y`j`y`jah`j`y`j`y`j`{`y`j`y`y`a`a`a`a", +"atatatat`j`y`y`j`{`y`y`j`{`ja``q`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ar`{`yae`yae`w`yae`y`w`{`j`yadadag`j`y`jad`gaj`j`y`y`qa``j`y`j`w`y`j`y`w`y`y`y`q`y`{`y`j`y`{`y`j`{ad`y`r`y`j`w`y`jad`wad`j`y`s`j`y`j`w`j`{`j`w`y`j`yar`y`{`y`w`{`y`w`{`qa``j`j`j`{`w`j`yar`y`yar`y`w`y`{`y`j`{`{`y`y`yae`w`yae`w`yar`j`{`}`}`}`}`}`}`}`}`r`y`{`q`{`{`j`w`y`{`y`w`y`j`j`y`y`j`s`j`y`jad`yar`yad`{ad`y`j`j`y`j`yad`p`yadada`adag`gag`gaj`g`gaj`gajadaj`gadadaj`p`gadad`padad`}`}`}`}`}`}`}`yadad`w`j`yad`y`j`w`j`yad`wae`y`s`j`ja``y`j`j`w`j`y`j`wadad`pa``j`padadadag`g`nad`j`w`j`yad`y`q`y`y`y`j`w`y`y`q`y`y`j`y`j`y`w`j`y`{`j`w`yae`y`w`j`{`w`y`yae`y`q`y`y`p`y`jadad`pad`ja``jad`y`j`y`pad`j`yadadadad`p`yad`j`y`y`qadad`s`jad`j`p`yad`y`j`j`w`y`jad`j`w`j`y`ja``padagad`gadadadadad`y`ja``j`w`y`j`j`ya``jad`jadad`j`y`j`wad`j`y`q`y`ja``q`yad`y`j`qa``j`ja``j`w`y`j`y`j`y`y`j`y`y`q`j`y`y`q`y`y`j`{`j`y`j`y`r`y`r`y`y`y`j`y`yae`y`j`wad`jadadadagadadajadadagad`gad`y`j`y`w`j`y`q`y`j`y`y`q`j`w`j`y`y`q`y`y`w`j`y`q`y`yae`y`j`y`j`y`y`j`j`y`y`j`w`j`y`j`y`q`y`j`y`q`y`j`w`y`j`y`j`y`j`y`j`w`j`y`y`j`w`j`{`j`y`j`y`{`yae`y`{`j`y`y`j`y`j`y`j`yae`y`y`j`{`y`j`y`y`j`y`y`j`y`j`y`j`y`j`a`a`a`a", +"atatatat`j`j`yae`j`y`j`y`j`j`yae`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`{`j`y`r`{`w`yae`{`w`{`j`{`y`qad`g`w`j`wa`adag`had`y`j`y`q`y`j`y`y`j`j`j`y`j`q`{`j`j`y`q`y`j`j`w`y`j`y`j`y`q`y`j`qa``j`y`yad`j`j`y`j`y`y`q`y`{`j`w`{`yae`y`q`{`j`{ae`y`j`y`yad`p`y`j`j`w`j`j`{`j`yae`j`wae`w`{`j`w`jar`yae`w`{`yae`j`{`w`}`}`}`}`}`}`}`}`{`wae`y`{`y`w`j`{`j`q`yae`y`j`y`q`y`j`y`q`y`y`q`j`y`p`j`y`j`j`w`j`s`j`j`yad`p`jadad`p`gag`gadadaj`gadadadad`gad`p`gadadajad`gajad`}`}`}`}`}`}`}`j`pad`j`ja``q`j`yad`y`j`yad`j`q`y`j`j`w`y`j`q`ja``j`jad`j`jadadad`jad`gadag`g`nad`jad`y`qad`jad`j`y`j`q`{`y`q`j`j`y`y`q`y`q`{`j`y`j`w`{`j`y`qae`yae`y`j`y`j`j`w`y`j`jadadad`ja``jad`p`j`qad`w`jad`ja``qad`j`s`jada``j`j`yae`y`y`jadadadad`y`j`j`j`w`ja``j`j`j`w`y`j`p`y`j`jadadadajadagadadad`jad`qa``j`j`y`j`y`qad`j`padad`wadad`j`jad`p`j`ja``j`j`yad`j`j`yad`j`y`q`y`j`j`y`q`j`y`q`j`y`q`y`j`y`q`y`j`j`y`j`y`q`y`j`y`j`y`y`j`yaear`y`q`y`q`{`y`j`yadaj`gad`g`iadag`g`iagad`j`j`y`j`j`j`y`y`j`j`w`j`y`j`y`j`q`y`y`jae`y`w`j`y`j`y`q`y`y`q`y`j`w`j`y`q`y`j`y`j`y`j`j`y`j`y`j`y`y`y`j`y`j`y`y`j`j`y`j`y`j`y`j`y`y`j`yae`y`{`j`y`j`y`j`y`y`j`j`y`j`y`j`{`j`y`j`y`j`y`j`yae`y`y`j`y`j`{`j`y`j`y`a`a`a`a", +"atatatat`j`y`ja``j`j`y`j`j`y`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ar`y`y`y`{`jar`{`j`y`w`{`w`j`{`jad`g`jae`w`yad`gag`j`{`yadar`j`j`w`y`yar`yae`y`y`wae`y`yar`j`y`{`q`y`y`}`}`}`}`}`j`yad`q`{a``q`y`q`y`j`j`y`yae`yae`w`y`j`y`{`w`y`wae`y`w`{`j`{`y`p`j`y`jar`j`y`w`{`y`w`y`{`y`y`{`{`w`y`{`j`y`w`{`y`w`{`{`}`}`}`}`}`}`}`}`y`{`wae`w`j`{`y`w`{ad`yar`y`{`j`y`q`j`y`jar`j`y`y`j`y`p`y`wad`y`jad`wad`jad`jadadadadadag`gad`gadadad`padadad`gad`j`padadadad`gad`}`}`}`}`}`}`}`yadad`q`yad`yad`w`j`j`y`q`y`y`j`w`j`y`j`q`y`yad`w`j`s`j`padad`oagad`gaj`gaj`gadadad`y`j`ja``w`j`y`q`y`j`y`y`y`q`y`q`{`y`y`y`j`w`y`yae`w`y`y`j`y`w`y`q`y`w`j`y`j`j`p`jadad`qada``jad`yad`jad`y`q`jad`yadad`j`jad`q`yad`j`w`j`j`y`w`jadadadad`yad`jad`y`j`w`y`j`y`j`j`yad`w`j`yad`jadadadadadadad`jad`y`jad`qa``jadadadadadad`j`y`w`y`j`y`j`y`p`jad`w`j`wa``j`q`y`j`j`y`qa``y`y`j`y`y`y`j`y`{`y`j`y`y`j`{`w`j`y`j`y`j`w`y`j`j`wae`y`y`{`j`y`{`j`j`y`q`yadadadadad`gad`gag`nagacadad`y`y`j`w`j`y`y`j`y`j`y`y`j`y`j`w`j`y`y`j`y`j`w`y`j`yae`y`j`y`y`j`y`j`y`j`y`w`y`j`y`y`y`j`y`j`y`j`y`y`q`j`y`y`j`y`y`w`j`y`{`j`y`y`y`j`y`y`j`w`j`y`j`y`j`y`{`j`y`{`yae`y`{`yae`y`y`j`y`y`j`yae`y`j`y`y`j`y`y`j`a`a`a`a", +"atatatat`j`{`y`y`j`j`yad`y`j`w`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`{`yarae`y`y`jar`{`y`jae`y`{`y`q`gadad`y`j`{`qad`g`j`q`y`j`yad`y`q`j`j`y`j`j`w`j`j`y`w`j`j`{`}`}`}`}`}`}`}`}`}`j`y`p`y`j`q`y`j`j`y`y`yae`yar`j`y`yae`{`}`}`}`}`{`y`q`{`j`{`y`w`y`y`jadad`y`j`j`y`jae`yae`q`{`q`j`j`{`j`yar`j`y`j`yar`j`}`}`}`}`}`}`}`}`{`y`{`w`j`y`{`w`j`{ae`wae`y`j`y`q`{`y`w`j`y`j`w`{`j`q`y`j`y`j`j`j`wad`y`jad`p`jad`gadadagadadadad`j`p`jadad`j`padadadadadad`pad`j`}`}`}`}`}`}`}`}ad`wad`jadad`q`jad`y`q`j`y`j`j`y`j`j`yad`y`j`j`jadadadadad`gag`hagag`gag`gagadad`y`j`p`y`j`yad`w`j`y`j`y`j`q`yae`y`yae`yar`j`{`j`q`{`j`yae`y`q`y`j`y`j`y`jad`p`jadadad`jadadad`jad`s`jadadad`j`y`wadad`j`pa`ad`jada``j`j`y`y`j`yad`y`jad`jadada``j`j`w`y`jad`j`y`j`j`w`j`y`jad`qad`qadadadadadad`jad`yad`y`j`jadadadadadad`jad`jad`jad`ja``j`j`y`j`ja``j`j`y`j`y`y`j`j`yae`j`j`y`q`j`y`wae`j`w`y`j`q`y`j`y`j`y`y`j`y`j`y`j`y`jar`j`j`w`{`j`y`j`y`j`yadadadadadadad`gaj`g`m`i`gad`j`q`y`j`y`j`q`j`y`p`j`j`y`q`y`j`}`}`}`q`y`j`y`j`j`j`y`j`j`y`j`y`j`y`w`j`j`y`j`j`y`j`y`j`j`y`j`j`j`{`j`y`j`y`j`{`y`jae`y`j`y`j`{`j`y`y`j`y`j`{`y`j`y`j`y`j`y`y`j`j`y`y`yae`y`yae`y`jah`j`y`j`y`j`y`{`j`j`y`j`a`a`a`a", +"atatatat`j`{`j`y`j`y`{`j`y`j`y`q`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`yar`{`j`{`yar`y`y`j`yar`yar`y`{`{ar`jadadad`s`j`y`yag`g`j`j`w`j`y`j`y`y`j`w`j`y`y`y`r`{`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`w`j`y`j`w`j`y`q`y`j`w`yae`y`w`j`y`r`}`}`}`}`}`{ae`y`wae`{`yar`j`y`w`yaia`ad`q`y`y`q`y`j`y`y`y`q`yarae`y`w`{`j`{`yar`}`}`}`}`}`}`}`q`y`qae`{`yar`y`{ar`j`y`y`w`{`w`y`{`j`y`y`j`j`yad`y`y`j`w`j`j`s`y`j`j`s`j`ja`adadadadadajad`gadadadadad`j`yadad`jad`p`yad`padadadad`}`}`}`}`}`}`}`}adad`j`yad`ja``q`j`ja``j`s`j`yad`y`qad`y`j`jad`gadadagagagag`g`n`i`gagag`g`gad`q`ja``j`j`w`j`j`j`wad`j`w`j`y`j`y`w`j`y`{`w`y`{`y`j`w`j`w`y`j`y`y`r`y`ja`aea``jad`pada``j`q`yad`j`y`ja``jada``j`j`yar`jadad`q`y`j`y`q`y`y`w`j`j`w`y`j`y`yad`jadadad`d`j`y`j`w`ja``jad`y`q`ja``ja``j`yad`jadadadadadad`jad`yadad`padadadad`y`j`y`y`qa``j`wad`j`wada``q`j`yad`j`w`y`j`w`y`q`y`y`wae`j`y`j`y`j`y`j`{`y`y`j`j`y`j`y`j`y`y`j`y`y`j`y`y`j`y`j`w`j`y`w`j`y`q`y`jadadadadadadadadag`gagadada``j`y`y`j`y`w`j`y`j`y`j`y`y`}`}`}`}`}`q`y`j`y`y`q`y`y`j`y`j`y`q`j`y`y`j`w`j`y`q`y`j`y`j`y`y`y`q`y`y`j`y`j`y`q`y`y`j`w`y`j`y`q`y`j`y`y`j`y`j`y`y`j`y`j`y`j`y`yae`y`j`j`y`j`y`j`y`{`j`y`j`y`y`j`y`j`y`y`d`y`a`a`a`a", +"atatatat`j`{`y`j`{`y`{`pae`y`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`yar`j`{`{`yarae`yar`{`wae`yae`y`{`q`y`{ad`j`j`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`w`jad`y`y`{`j`y`y`j`y`j`w`j`{`y`w`}`}`}`}`}`}`}`yar`y`y`q`{`j`yar`y`j`ya``jad`j`w`j`y`{`y`y`q`{`y`j`j`y`j`{`q`y`wae`}`}`}`}`}`}`}ae`{`y`y`jar`yae`y`j`y`{`q`{`yae`y`{`j`q`yar`j`y`w`j`q`y`q`yad`y`qadad`y`jadad`padad`gajad`g`u`jad`pada``j`p`y`j`p`y`y`j`pad`jad`w`j`}`}`}`}`}`}`}`}ad`j`padad`p`jadada``j`w`j`ja``j`q`j`y`j`j`pad`uadaj`gag`gag`nasag`gag`gadadad`j`ja``j`w`j`y`y`y`ja`ar`j`y`yae`w`y`j`{`q`y`j`{`j`w`j`y`{`jae`w`j`y`j`y`qadad`pad`ja``jad`jad`w`j`jad`y`qadad`jadad`y`j`qa``y`j`j`s`j`j`y`j`j`w`j`y`j`j`w`j`yadadadadadad`j`ja``j`q`yad`jad`jad`q`ja`ad`jadadadadadadadadadad`jadadad`j`j`wadad`qa``j`j`yad`yad`y`q`j`ja``j`qa``j`jad`y`j`y`q`j`y`y`j`w`y`q`y`j`y`j`w`y`j`y`yae`y`j`w`j`y`q`y`j`y`q`y`q`y`y`j`y`j`w`j`{ad`yagadadad`jad`gadad`gadadad`y`q`j`w`j`y`j`j`w`j`y`j`}`}`}`}`}`}`}`j`y`q`y`j`y`j`ja``j`j`j`y`j`y`j`y`y`j`j`y`w`j`y`j`y`q`y`j`yae`y`y`j`j`y`j`y`j`y`j`j`y`y`j`{`q`y`j`{`j`y`j`{`y`j`{`y`j`y`j`{`y`j`y`y`j`y`j`y`j`y`j`y`j`y`j`y`j`y`j`a`a`a`a", +"atatatat`j`yae`y`j`y`y`jar`y`y`q`{`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`{`yae`w`j`{`y`j`{`yae`{`y`w`j`w`y`{`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`jad`q`y`q`{`j`wae`yar`y`{`jar`j`y`}`}`}`}`}`}`}`}`{`j`y`{`w`j`{`jar`yae`w`y`qadad`j`q`j`y`q`j`y`{`w`{`w`y`j`{`w`y`}`}`}`}`}`}`}`}ae`w`{`{`y`yar`j`{`w`j`{`y`q`{`j`w`{`{`y`y`q`{`y`y`j`y`j`y`q`j`yad`qad`qadad`jadadaj`g`gajadadad`j`y`p`j`jad`y`j`j`wad`j`y`y`j`jadad`}`}`}`}`}`}`}`}`pad`y`j`p`yad`padad`jadad`y`q`ja``p`jadadadadadag`gagag`m`iag`g`gadad`p`j`qa``j`w`j`y`jad`q`y`yar`j`j`y`q`y`q`y`j`y`{`y`r`y`q`{`y`{`w`j`y`j`y`j`j`yad`jadadad`pad`j`sadad`yad`q`y`j`j`j`wa``j`q`yad`j`y`j`y`q`y`j`y`q`y`y`j`{`w`y`q`y`y`q`y`w`jadadad`g`j`y`j`yad`j`y`y`j`w`yad`j`y`qad`ja`adadad`y`jadadadadad`yad`w`j`y`j`j`y`j`qad`y`q`j`j`y`y`jad`p`y`j`j`w`y`j`y`y`j`j`y`q`yae`y`wae`y`w`j`y`j`w`j`j`w`j`y`y`y`j`w`j`y`j`y`j`y`j`y`q`y`j`y`y`j`w`j`yadadadadad`jadadaj`g`~adad`j`y`j`y`j`y`j`y`j`w`ja``}`}`}`}`}`}`}`y`j`y`j`w`{`j`y`j`y`y`j`y`j`y`j`qah`y`y`j`y`y`y`j`{`j`y`y`j`y`j`y`j`w`j`y`q`y`j`y`w`j`y`j`y`y`j`{`y`y`j`y`y`j`y`j`{`j`y`y`j`{`j`y`j`y`j`y`j`y`y`d`y`j`y`y`jah`{`j`a`a`a`a", +"atatatat`y`{`j`yar`yae`{`y`{`q`y`y`j`}`}`}`}`}`}`{`j`yae`wae`y`{`j`w`{`{`jar`y`{`y`q`y`{`q`y`y`j`{ae`yar`}`}`}`}`}`}adadadad`j`{`y`{`w`j`{`q`jar`{`jar`yar`y`wae`{`y`w`{ae`yar`{`y`j`{`{ar`yar`yar`y`{`{`{`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`p`y`w`j`y`j`y`y`y`r`y`j`y`r`y`y`w`}`}`}`}`}`}`}`}`}`waear`y`y`{`q`y`{`q`y`y`{`y`j`sadad`w`j`y`j`j`w`j`{`j`y`j`{`y`}`}`}`}`}`}`}`}`y`{`q`j`y`r`y`{`w`{`y`jar`y`{`yae`y`wae`w`{`j`y`q`yae`y`p`y`j`w`y`jad`yadad`pad`gajad`gadada`ad`qa`ad`jada``j`w`jad`y`j`yad`j`wa`adad`}`}`}`}`}`}`}ad`j`gad`jada``j`j`p`yadad`wad`jad`jadad`gadagag`gagag`h`gag`g`gad`j`p`y`ja``j`y`j`w`j`w`j`w`y`j`j`j`y`w`j`{`y`{`j`yar`j`y`j`{`y`w`j`{`j`w`j`y`j`wad`q`gadadadadadad`j`y`j`j`y`jad`y`qa``j`jad`jadad`y`q`y`j`y`j`w`y`j`w`j`y`q`j`yae`y`j`y`j`y`j`y`j`sadadadad`p`j`y`jad`q`ja``j`j`ja``j`jadadad`jadadadadadad`j`w`j`yad`j`w`y`ja`ad`jad`y`j`y`padad`y`y`j`jad`y`q`y`j`w`j`y`q`y`j`y`j`{`j`y`j`y`j`y`y`j`y`y`y`j`j`y`j`j`y`q`y`j`w`j`y`j`y`y`q`j`y`q`j`y`jadadadad`jadadadadadagadadad`jad`j`y`qa``j`y`j`j`}`}`}`}`}`}`}`}`j`y`j`j`y`j`y`q`y`q`y`j`j`y`q`y`j`y`q`j`{`j`w`j`j`y`j`y`q`y`j`j`y`j`y`j`y`j`y`j`y`j`j`y`j`y`j`y`j`y`j`j`y`j`y`j`{`y`j`y`j`y`j`y`j`yae`y`y`j`j`y`j`y`d`y`j`y`j`y`j`a`a`a`a", +"atatatat`{`j`y`j`{`j`yar`jae`yae`j`w`{`j`{`y`j`{`q`{`y`{`j`y`{`j`{`j`y`q`y`j`jar`j`y`j`{`j`yar`j`y`yae`{`}`}`}`}`}`}`jad`g`j`y`wae`y`{`y`}`}`}`}`{`{`w`j`{`{`{ar`jae`{`w`j`{`y`r`y`{`q`{`j`{`yae`{`w`jar`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`qah`q`y`jar`j`y`j`{`y`q`yae`y`j`}`}`}`}`}`}`}`}`}`}`j`{`r`y`{`y`r`y`jar`y`q`y`j`j`y`jad`j`w`y`j`y`j`w`y`j`{`q`y`}`}`}`}`}`}`}`}`{`y`}`}`}`}`q`{`j`{`w`{`j`y`r`y`{`j`{`j`y`wae`y`w`{`j`y`y`j`j`y`p`y`j`p`jadad`g`padagadad`padad`j`q`y`j`j`sad`j`wad`j`j`wad`jae`wa``j`}`}`}`}`}`}`}`j`s`jad`pad`j`yadad`j`jad`j`y`padadad`oadag`gagagasagadadadad`p`y`j`yad`j`q`y`j`y`j`y`j`y`j`y`w`j`y`j`{`j`q`y`w`j`y`{`q`y`y`q`{`j`w`yae`y`y`jad`y`jadadajadadad`j`pad`j`y`p`ja`aea``j`ja``jad`wadad`y`j`w`j`y`j`y`j`{`y`j`y`y`q`y`j`y`w`j`y`j`y`q`yaeadadadadadadad`y`j`ja``qad`ja``j`yada``jadadadadadad`w`j`j`y`p`j`y`y`j`j`w`y`y`q`yad`w`j`y`j`q`ja``p`y`jad`j`y`y`q`yae`y`y`j`w`y`j`q`y`w`j`q`y`j`w`j`y`y`j`y`y`j`y`y`j`{`y`j`y`q`yae`j`{`y`j`y`j`y`j`j`yadadadadad`jadadadadadad`y`jad`y`j`j`y`p`y`j`}`}`}`}`}`}`}`}`w`j`y`y`j`y`j`y`j`y`j`w`j`j`y`j`y`j`y`y`j`y`j`y`y`j`y`j`y`j`y`j`y`j`y`j`y`q`y`j`ja``y`j`j`y`j`y`j`y`y`j`y`j`y`j`y`yae`y`y`{`j`y`y`j`y`j`y`y`y`y`j`y`j`y`j`j`y`y`j`a`a`a`a", +"atatatat`j`y`j`{`y`r`y`j`{`j`y`{`w`y`j`y`w`jar`y`y`j`yae`yar`j`w`{`yar`j`{`w`y`j`j`y`r`y`j`w`yae`y`q`{ar`}`}`}`}`}`}`{`padad`j`{`y`wae`}`}`}`}`}`}ar`j`{`{`wae`y`y`{`y`{`{`w`y`y`}`}`}`}`}ar`j`{`wae`{`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`q`y`j`y`j`y`j`y`j`y`{`q`y`y`j`{`w`}`}`}`}`}`}`}`}`}`}`}`j`yar`y`r`y`y`jar`y`j`{`y`y`{ad`wadad`jad`w`j`j`j`y`q`y`y`}`}`}`}`}`}`}`}`{`}`}`}`}`}`}ae`y`j`y`r`y`{`y`{`j`w`{`w`y`r`y`{`j`y`q`y`y`q`yad`y`j`qada`ad`qadadagad`gajada``j`q`ya`ad`w`j`yad`j`j`wad`yad`yad`j`y`q`}`}`}`}`}`}`}`jadad`w`j`yadad`qad`yad`qa`ad`jadadaj`gag`gag`i`mag`g`j`sad`y`jad`j`j`w`j`y`j`y`j`w`j`w`y`j`y`j`y`j`w`y`q`y`j`yaear`y`j`wae`y`q`y`yae`y`q`y`qad`padadagadad`g`qadadad`pad`y`jad`w`j`y`q`yad`p`jad`jad`y`j`y`j`y`j`w`j`y`j`wae`y`y`q`{`j`y`j`y`{`y`j`y`y`w`jadadadad`ja`ad`jad`y`j`w`j`p`j`q`y`j`qadadad`jad`j`w`j`y`j`j`y`q`j`y`jar`jad`y`j`jad`y`j`yad`j`j`ja``y`q`j`{`j`y`y`j`yae`y`j`y`y`y`j`{`y`y`j`{`y`j`y`q`y`j`y`j`y`j`j`y`y`j`yad`y`qah`p`y`j`y`j`w`jadadadadadadadadadadadadadadad`w`ja``q`y`j`}`}`}`}`}`}`}`}`}`y`y`j`j`w`j`j`y`w`j`j`y`yad`y`y`y`j`y`q`y`j`y`{`j`w`j`y`j`y`y`y`j`y`q`y`y`j`y`j`y`q`yad`j`y`j`j`y`j`{`j`wae`y`j`y`j`y`j`{`j`y`j`y`j`y`j`y`j`{`j`{`j`y`y`j`y`y`j`y`a`a`a`a", +"atatatatad`j`j`y`y`j`{`y`y`{`q`yae`wae`y`j`{`j`{`r`y`y`j`{`y`j`{`q`y`yae`yae`y`j`y`j`y`j`y`j`y`q`y`{`j`{`}`}`}`}`}`}ae`yadad`j`j`y`{`}`}`}`}`}`}`}`}`w`y`{`j`w`{`r`y`{`q`{`j`{`}`}`}`}`}`}`}`{`y`{`w`{`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ad`j`y`j`y`q`y`q`y`y`j`w`j`{`jar`y`j`yae`}`}`}`}`}`}`}`}`}`}`{`j`y`{`yar`{`wae`y`wae`w`j`yae`wad`y`jadad`y`j`w`j`y`j`w`}`}`}`}`}`}`}`y`}`}`}`}`}`}`}`}`{`j`y`y`r`y`r`y`{`j`j`{`{`wae`w`j`{`y`j`{`j`w`y`ja``j`jadada`adad`gadadadad`qad`jad`j`j`y`qad`yad`y`j`qad`j`w`jad`j`y`}`}`}`}`}`}`}`j`y`ja``j`pa``j`j`p`jad`j`yad`j`wad`gag`gag`gagag`gajad`j`p`jad`y`p`y`j`y`qa``j`y`j`y`j`w`y`j`w`j`y`q`y`j`y`w`j`y`j`y`{`j`w`yae`w`y`j`j`yadadadajadadad`padadadad`j`yad`j`p`jad`y`p`j`y`j`j`yad`yadadad`j`y`q`y`j`y`y`j`y`j`yae`y`j`y`q`{`j`j`y`q`y`j`y`j`y`qadadad`p`jad`ja``j`jada``jad`yad`q`yadadadad`y`jad`y`j`w`j`y`j`y`qad`j`y`w`j`q`yad`p`j`y`wad`j`w`j`j`y`y`q`yae`w`y`j`y`q`j`r`y`j`w`j`y`q`j`y`w`j`y`{`w`j`y`q`y`j`w`j`y`q`y`j`j`y`j`y`q`j`yad`j`yadadadadadadad`jadadadad`gajadad`jad`j`yad`}`}`}`}`}`}`}`}`}`j`y`j`y`j`y`j`y`j`y`q`y`j`j`w`j`j`y`j`y`wae`y`j`{`y`q`y`j`{`q`j`y`j`y`j`y`q`y`y`j`y`j`yad`j`y`j`j`y`j`y`j`y`j`y`j`y`j`y`j`y`j`y`{`j`y`yae`y`j`y`j`y`j`{`j`y`j`y`j`a`a`a`a", +"atatatat`{ad`j`y`j`{`j`{`wae`{`{`y`{`y`yar`jar`y`yae`yar`jar`j`w`{`j`y`{`q`y`y`w`j`w`{`y`r`y`yae`y`j`{`j`}`}`}`}`}`}`}`yadadad`{`yar`}`}`}`}`}`}`}`}`{`y`{`q`{`yae`{`w`y`{`{`}`}`}`}`}`}`}`}`}ae`wae`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`w`j`j`s`y`j`wad`y`y`j`y`{`j`q`y`yae`w`yae`y`{`w`}`}`}`}`}`}`}`}`}`}`}`yar`yar`j`yae`y`{`j`w`{`j`{`w`y`jadadad`pad`jad`y`q`y`j`}`}`}`}`}`}`}`y`}`}`}`}`}`}`}`}`y`q`{`yar`j`y`yar`y`q`{`w`j`y`{`y`y`jara``q`{`j`y`r`yad`y`q`jadagadagadad`pada``q`ya``j`w`ja``j`y`qad`y`j`y`yad`wad`y`}`}`}`}`}`}`}`j`y`y`q`ja``j`jad`wa``ja`ad`p`jadad`gadag`gag`g`gadad`j`s`y`j`w`j`y`j`s`j`y`j`j`w`j`y`w`j`j`w`{`y`j`y`y`j`w`j`{`y`q`y`jar`y`{`{`j`y`{`w`jad`qadadadadadadadad`jada``j`p`y`j`ya``jad`j`yad`j`sad`jadada``j`y`y`j`y`y`j`{`j`y`q`y`y`q`y`j`y`w`y`q`j`y`j`y`q`y`y`jadadadadad`y`q`j`p`yad`j`w`j`j`yadadadadadadad`y`j`y`j`y`j`j`y`j`y`y`q`y`j`ya``q`y`j`yad`j`ja``j`y`w`j`j`y`j`y`j`w`j`y`y`y`y`j`y`y`j`y`jar`y`j`{`j`y`j`y`y`j`w`j`y`y`j`y`q`y`j`w`ja``j`y`y`jad`yadajadadadadadadadad`gadadadadadadad`y`j`}`}`}`}`}`}`}`}a``j`y`j`q`y`y`j`y`y`j`y`yad`j`j`y`q`yad`yae`y`j`y`j`{`y`j`w`j`y`{`y`w`y`j`w`j`y`j`j`y`j`jad`yad`ja``j`y`j`y`j`y`j`y`y`j`y`j`y`j`y`j`y`j`y`j`y`j`y`j`y`j`y`y`j`y`j`y`a`a`a`a", +"atatatat`y`{`jad`yae`y`j`y`y`j`{`jar`yae`w`{`j`yar`{`j`y`{`j`y`j`{`w`j`yaead`yae`y`y`j`j`y`q`{`j`w`{`j`y`}`}`}`}`}`}`}`y`qadad`j`w`j`}`}`}`}`}`}`}`}`y`j`{`yar`{`yae`{`q`{`y`}`}`}`}`}`}`}`}`}`{`y`y`{`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`y`w`j`j`y`w`j`y`j`w`j`w`jar`j`y`j`y`{`yar`y`{`y`q`{`y`{`w`}`}`}`}`}`}`}`}`}`}`j`y`r`y`{`w`jar`j`y`jar`y`q`{`j`w`y`jadad`p`jadad`j`q`}`}`}`}`}`}`}`}`j`}`}`}`}`}`}`}`}`{`j`y`q`yae`j`j`y`{`y`{`j`yar`j`{`q`{`j`{`y`}`}`}`}`j`yad`jadadadadad`gadad`jad`j`j`p`y`j`yad`j`qad`y`j`y`qad`j`y`jad`}`}`}`}`}`}`}`w`j`j`y`q`jad`y`j`jad`p`jadad`jad`padaj`gagadag`gadad`y`jad`y`j`w`j`j`y`q`y`qa``j`j`y`j`y`j`y`j`q`j`w`jaeah`w`jae`yar`j`j`y`qae`y`q`y`jada``j`p`yad`p`ja`ad`qad`y`qad`jad`jad`qa`ad`j`y`q`j`y`qad`jad`jad`j`w`yae`j`w`y`q`y`j`j`y`j`w`j`y`j`{`y`q`y`j`y`j`y`j`w`jadadadadadad`ja``j`q`y`jad`yad`jadadadad`jad`qad`j`yad`y`p`j`y`j`y`j`y`q`j`y`j`j`q`yad`ja``j`p`j`j`y`j`w`y`j`j`yar`j`j`y`q`y`j`w`yae`y`j`j`w`j`w`j`y`j`{`j`y`q`y`q`j`y`j`y`j`j`y`j`yad`j`y`jad`yad`gadadadad`jad`jadadajadadadadadad`}`}`}`}`}`}`}`}`}ad`jad`yad`q`j`j`w`j`j`j`y`y`j`y`j`j`y`y`q`y`j`w`y`j`y`y`{`j`y`j`yae`y`j`j`y`y`j`y`y`y`j`}`}`}`}`}`}`}`}`}`}`}`}`y`j`y`j`y`y`j`y`j`y`j`y`j`y`j`y`j`y`j`yae`yah`j`y`j`a`a`a`a", +"atatatat`y`j`{`yad`yae`y`{`jar`yar`{`j`{`y`j`{`y`y`j`y`yae`yae`yar`y`{`j`{`y`wae`yar`j`yar`y`y`j`y`{`w`{`}`}`}`}`}`}`}`w`jad`j`y`y`j`}`}`}`}`}`}`}`}`}`yar`j`{`j`{`yar`y`j`{`}`}`}`}`}`}`}`}`}ae`wae`w`}`}`}`}`}`}`}`}`}`}`}`}`}`{`yarad`y`j`yad`y`j`{`{`w`j`gagadad`j`y`yae`yae`{`w`j`{ae`y`w`j`yaea``{`y`q`y`{`w`j`yae`y`r`y`{`j`wae`y`}`}`}`}`}`}`}`}`}`}`r`y`y`{`j`y`y`yar`y`{`y`y`j`{`y`{`y`pad`jadadada``j`}`}`}`}`}`}`}`}`y`}`}`}`}`}`}`}`}`{`j`w`yae`y`y`w`{ar`y`q`y`jar`{`j`y`y`y`}`}`}`}`}`}`}`}`y`padadadagad`padad`q`y`j`y`yad`yae`p`y`ja``qad`j`yad`w`jad`j`}`}`}`}`}`}`}`j`y`p`y`j`yad`wad`j`s`jad`ja``q`ya`aj`gadag`gadad`y`j`j`s`j`y`j`y`j`w`j`y`j`j`y`jar`y`w`j`{`j`y`w`j`y`y`j`w`j`y`q`y`y`jar`j`y`y`q`y`y`jad`y`q`j`yad`j`y`qadad`yadad`j`ja`ad`jad`y`qad`ja``jad`yad`j`sadadad`j`y`j`s`y`jae`y`y`yar`j`y`y`j`y`{`j`y`yae`w`j`y`q`j`y`y`qadadadadad`y`j`jad`y`j`wad`jadadad`jad`p`y`j`yadar`j`y`y`j`j`y`q`y`j`y`j`y`q`y`y`j`w`jad`j`y`wad`y`j`y`r`y`y`j`y`w`j`y`j`w`yae`y`j`w`y`y`j`y`j`y`w`j`y`q`y`j`y`j`y`j`y`q`y`y`qad`j`y`jada``j`jadadagadadadadadadadadadadadadadad`}`}`}`}`}`}`}`}adadad`j`y`j`y`j`y`y`j`y`y`j`w`j`}`}`}`}`}`y`j`y`y`y`j`j`y`q`y`{`yae`y`j`y`{`y`q`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`j`y`y`j`y`j`y`j`y`y`j`y`j`y`y`j`y`y`j`y`j`y`d`y`a`a`a`a", +"atatatat`{`j`yae`yad`j`y`jar`j`{`j`{`w`y`{ar`j`{`q`{`y`j`w`y`{ae`y`r`y`y`q`{`y`q`y`j`y`j`{ae`wae`y`j`{`j`}`}`}`}`}`}`}`y`yadaj`j`w`y`}`}`}`}`}`}`}`}`}`}`{`w`{`{`q`{`y`{`j`{`}`}`}`}`}`}`}`}`}`{`y`yae`}`}`}`}`}`}`}ae`w`y`{`{`w`{`j`{`j`y`p`j`jadad`j`y`jar`y`wadagadad`y`{`w`y`j`{`s`j`yae`y`q`{`y`q`{`j`y`j`y`j`wae`y`j`y`q`{`y`j`{`q`}`}`}`}`}`}`}`}`}`}`y`wae`w`{`jar`j`y`{`q`{`j`w`jar`j`y`j`yadad`padad`p`}`}`}`}`}`}`}`}`y`}`}`}`}`}`}`}`}`y`{`q`y`jae`y`j`w`j`{`{`q`y`j`{ar`j`w`}`}`}`}`}`}`}`}`}`}`}adad`uadagadadadadad`q`j`j`y`q`y`j`yad`j`y`w`jad`j`y`j`p`y`}`}`}`}`}`}`}`y`j`y`p`j`y`}`}`}`}`}`}`}`}`y`j`j`padadag`gajadad`p`j`y`j`j`qa``j`y`j`w`y`j`y`q`y`j`j`y`w`j`y`j`j`y`q`y`{`j`w`j`j`y`j`y`j`w`{ae`y`j`w`jadad`jad`qa`ad`jad`qadad`p`y`p`j`y`pad`y`j`ja``j`j`yad`j`y`jad`jad`y`j`yae`y`j`w`j`y`q`j`y`j`wae`y`q`y`j`y`j`y`j`y`j`y`q`y`j`jadadadadad`j`s`j`jad`j`ja`adadadadadad`j`y`p`j`y`j`y`q`ja``q`y`j`w`j`y`j`ja``q`j`yadad`w`j`j`y`j`}`}`}`}`w`j`j`j`y`y`j`j`j`w`y`j`yae`j`y`w`j`j`y`y`j`y`j`w`j`y`j`y`j`y`j`q`}`}`}`y`ja``j`jadadadadadadadajadadadadadadadadagad`g`}`}`}`}`}`}`}`}agad`gadadad`y`j`j`y`j`j`}`}`}`}`}`}`}`}`}`}`}`}`j`y`q`y`{`j`q`y`y`q`{`y`q`j`y`j`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`j`j`y`j`y`j`y`j`y`y`j`y`j`j`j`y`jah`j`y`j`j`y`a`a`a`a", +"atatatat`j`yae`y`y`j`y`j`{`y`j`y`yar`{ae`w`j`{`{`y`{`q`{ar`{`j`y`q`{`yae`y`{`{`j`{`y`j`{`y`y`j`y`{`w`{`j`{`}`}`}`}`}`}`y`qadadad`y`{`}`}`}`}`}`}`}`}`}`}`yae`y`j`yar`{`jar`y`}`}`}`}`}`}`}`}`y`y`qae`w`}`}`}`}`}`}`}`yar`y`r`yae`yarae`y`w`y`jad`w`y`jad`wae`{`y`{`w`g`gad`j`y`q`{`j`y`y`jar`y`y`j`w`y`{`j`w`yae`w`y`{`j`w`j`{`y`q`y`w`{`j`}`}`}`}`}`}`}`}`}`}`y`w`j`{`w`y`j`yar`j`{`w`y`{`j`yar`j`w`j`yadad`p`j`}`}`}`}`}`}`}`}`y`q`}`}`}`}`}`}`w`y`j`{`w`y`j`w`y`jae`y`wae`y`yar`j`y`}`}`}`}`}`}`}`}`}`}`}`}`wad`gadadad`gad`q`y`j`y`wad`y`j`y`q`y`y`j`y`j`yad`w`ja``j`}`}`}`}`}`}`}`}`y`j`y`j`y`}`}`}`}`}`}`}`}`}`}`yadadagad`gadad`ja``j`y`}`}`}`}`j`w`j`j`y`q`y`j`w`j`y`}`}`}`q`y`w`j`y`y`j`w`j`y`j`y`w`jar`y`{`j`y`w`y`j`w`yad`wad`y`jad`qa`ad`ja``jad`yad`j`j`qa``j`y`q`y`}`}`}`}adad`s`jad`q`y`w`j`w`y`}`}`}`}`}`}`}`y`j`y`j`{`q`y`y`w`j`w`j`y`j`y`j`wa`ajadadad`j`j`y`y`ja``jad`j`gadad`j`wad`j`j`s`j`j`j`y`y`j`y`j`y`j`j`y`y`q`ya``q`ja``j`jad`}`}`}`}`}`}`}`y`y`w`j`y`j`w`y`y`yae`y`y`j`w`y`j`y`w`j`w`j`y`y`j`w`j`y`j`q`yad`}`}`}`ja`ad`jadadadadadagadag`g`gadadad`yadadadadadaj`}`}`}`}`}`}`}`}ag`gadadad`y`jad`y`j`w`}`}`}`}`}`}`}`}`}`}`}`}`}`y`j`y`j`w`j`y`y`j`y`j`y`y`{`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ad`y`y`j`y`j`y`j`y`j`y`j`y`y`y`y`j`y`j`y`j`y`j`a`a`a`a", +"atatatat`y`j`yae`y`j`y`j`j`j`yae`y`y`{`y`r`y`q`y`j`{`y`j`y`{`y`q`{`yar`yae`w`j`y`jar`y`qae`y`y`q`{ae`w`{`j`}`}`}`}`}`}`j`{`qadad`w`{`}`}`}`}`}`}`}`}`}`}`{`w`{`y`j`{`y`yae`{`}`}`}`}`}`}`}`}`y`{`y`{`y`}`}`}`}`}`}`}`yae`y`yar`{`j`y`{`j`{`j`s`jad`w`j`y`j`y`r`j`{ae`yadajad`j`y`j`w`j`{`j`y`q`{ae`y`wae`y`{`w`j`{`j`w`y`j`yar`j`y`j`{`j`w`}`}`}`}`}`}`}`}`}`}`{`yae`y`j`y`r`y`y`}`}`}`}`j`{`y`y`j`y`qad`jadadad`}`}`}`}`}`}`}`jad`j`j`}`}`}`}`y`j`y`j`yae`y`j`y`j`w`{`j`y`j`y`j`yae`}`}`}`}`}`}`}`}`}`}`}`}`}`}`jadad`gajad`g`jad`y`jad`qa``jad`}`}`}`}`}`}`}`}`}`j`p`j`}`}`}`}`}`}`}`}`w`j`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}aj`gadad`q`j`s`}`}`}`}`}`}`j`y`j`y`j`w`y`j`j`}`}`}`}`}`j`j`w`j`y`j`y`q`y`q`yae`y`j`}`}`}`}`}`yae`j`j`q`da``q`jadad`j`w`j`jad`qa`ad`ja`ad`q`j`ja``}`}`}`}`}`}`yadad`jad`yae`y`j`}`}`}`}`}`}`}`}`}`ja``wae`y`j`j`j`y`j`w`j`y`q`j`j`yad`gadad`jad`w`j`j`y`j`qadadadadadad`j`j`y`j`y`p`ja``q`j`y`p`j`w`y`j`j`j`y`j`j`y`w`j`}`}`}`}`}`}`}`}`}`j`y`j`w`j`y`q`j`{`q`y`q`y`j`y`q`{`j`y`j`y`j`q`y`j`y`j`w`j`jad`}`}`}`}`}`ja``jadadadadadadadadagad`gadadadadadadadad`g`}`}`}`}`}`}`}`h`n`kadajad`j`y`j`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`y`yae`y`j`y`y`j`{`jar`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`y`j`j`y`d`y`j`j`y`j`j`y`j`y`j`y`j`jad`y`a`a`a`a", +"atatatatae`y`j`{`j`{a``j`j`y`j`j`{`j`wae`{`y`{`j`{`w`y`r`y`{`q`{`yae`yae`w`j`{`w`j`y`j`j`y`y`j`y`j`w`y`j`y`}`}`}`}`}`}ar`y`j`g`jae`y`w`}`}`}`}`}`}`}`}`}`w`j`{`j`{`y`{ae`yar`}`}`}`}`}`}`}`}`}`y`r`y`q`}`}`}`}`}`}`}`r`yar`{`y`r`y`{`q`{`w`y`r`yadad`y`j`wad`j`{`y`q`{`wad`gadad`p`{ar`y`jar`{`y`w`{`y`j`w`{`j`y`j`y`{`jar`y`j`{`jar`yar`y`y`}`}`}`}`}`}`}`}`}`y`q`y`q`y`wae`y`y`}`}`}`}`}`y`w`j`w`{`y`wadadad`q`}`}`}`}`}`}`}`j`g`yadad`qad`{`j`y`w`j`wad`y`j`y`w`j`j`y`w`y`jar`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}a`adajad`gadad`y`qa``}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`j`w`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`gadad`y`j`}`}`}`}`}`}`}`yar`y`q`y`j`y`}`}`}`}`}`}`}`w`y`j`w`{`q`y`j`y`j`w`y`}`}`}`}`}`}`}`j`y`qa`ad`j`yad`y`ja``j`jad`s`j`j`ja``qad`jad`w`}`}`}`}`}`}`}`}adada`ad`y`j`y`}`}`}`}`}`}`}`}`}`}`}`q`yae`y`y`y`{`w`y`j`ja``j`j`y`p`jad`gad`}`}`}`}`}`}`}`}adadadad`j`j`s`j`y`j`w`j`y`y`j`j`y`j`yae`j`y`w`j`{a``j`ja``}`}`}`}`}`}`}`}`}`}`}`j`q`y`y`j`y`y`j`y`j`y`y`{`j`y`y`q`y`y`r`y`j`y`j`y`y`y`j`y`y`}`}`}`}`}`jad`jada`adadadadadagadad`gaj`g`}`}`}`}adadad`}`}`}`}`}`}`}acagas`i`gad`jad`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`yae`y`y`q`y`j`{`w`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`~`j`y`y`j`y`j`y`j`y`j`y`y`j`y`j`y`y`j`y`a`a`a`a", +"atatatata``y`y`j`y`j`y`w`y`ja``q`y`y`{`q`yae`w`{`j`{ae`y`yae`{`y`q`yae`y`y`{`j`y`y`r`y`y`q`j`y`j`{ae`y`w`{`}`}`}`}`}`}`{`y`j`gad`j`y`{ae`}`}`}`}`}`}`}`}`{`w`{`y`wae`y`w`j`y`}`}`}`}`}`}`}`}`}`j`yae`y`}`}`}`}`}`}`}`{`{`j`w`{`yar`{`y`j`{`y`{`q`yadad`j`j`wadad`y`j`{`j`w`jadadadad`j`y`j`y`j`y`q`y`j`yae`y`wae`y`j`y`j`{`y`wae`y`yae`j`wae`}`}`}`}`}`}`}`}`}`}`j`yae`y`y`q`y`}`}`}`}`}`}`}`j`yae`w`j`j`jad`gad`}`}`}`}`}`}`}ad`q`gad`ja`ad`j`j`j`y`j`y`j`y`j`j`y`j`w`j`y`j`{`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}a`adaj`g`padad`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}a``jad`w`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`gadad`q`}`}`}`}`}`}`}`y`j`y`j`j`j`}`}`}`}`}`}`}`}`j`{`j`j`y`j`y`q`j`{`j`}`}`}`}`}`}`}`}`}`yad`j`j`w`j`p`j`y`p`j`y`jad`jad`p`j`y`ja``j`}`}`}`}`}`}`}`}`}`}ad`j`j`y`q`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`j`w`j`yae`y`q`y`jadad`j`y`jadad`}`}`}`}`}`}`}`}`}`}`}`}`}`jadad`jad`yad`qadad`w`jad`w`j`yad`j`j`w`j`p`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`j`j`w`j`j`w`yae`y`j`q`y`j`y`{`j`q`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}a`ad`jadadadadadadadadadadad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`n`iac`i`gadad`ja``j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`j`y`j`y`j`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ad`jad`y`j`j`y`y`j`jah`j`y`j`y`j`y`d`y`a`a`a`a", +"atatatat`jae`yae`y`j`yae`j`y`wae`j`yae`{`{`w`{`j`w`y`{`yae`y`w`j`yae`y`w`{`j`yar`j`y`j`{`yae`{`w`j`y`j`y`j`}`}`}`}`}`}`{`j`wadad`y`q`y`y`}`}`}`}`}`}`}`}`{`{`{`{ae`y`r`{`y`{`}`}`}`}`}`}`}`}`}ad`jad`q`}`}`}`}`}`}`}`yar`{`yae`wae`y`j`{ar`y`r`y`y`j`padad`yad`j`y`q`y`q`{`y`wadadadadad`y`j`w`jar`j`{`w`y`w`{`j`w`j`wae`w`y`j`yae`w`j`w`y`y`q`}`}`}`}`}`}`}`}`}`wae`y`w`j`y`j`}`}`}`}`}`}`}`}`{`q`y`j`y`ja`ad`j`}`}`}`}`}`}`}`jadad`jadad`q`j`sad`p`jad`w`j`j`y`q`y`}`}`}`}`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}adadad`gadadad`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`j`ja``}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}adada``}`}`}`}`}`}`}`}ad`j`w`y`}`}`}`}`}`}`}`}`}`wad`j`w`j`y`q`y`y`j`y`}`}`}`}`}`}`}`}`}`j`{ad`pad`yad`w`j`yad`y`qa``j`wa``j`yad`jad`}`}`}`}`}`}`}`}`}`}`}ada``j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`y`j`q`y`y`j`y`jad`wadadadad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ad`y`wad`j`j`y`j`j`y`j`y`}`}`}`}`j`y`j`yae`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`w`yae`y`y`j`y`j`w`y`j`y`w`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}adad`jadadadadadadadadadad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`i`nacas`i`~ad`yad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`w`y`q`{`yae`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`yad`jahad`j`y`ja``j`y`j`y`y`y`j`y`j`a`a`a`a", +"atatatat`j`y`j`j`y`j`y`j`j`y`y`j`y`qad`{`j`y`{ae`y`q`{`j`w`{`j`y`y`{`jae`y`q`y`j`w`yar`j`{`j`y`j`w`{`w`yae`}`}`}`}`}`}ae`y`yadad`j`yarae`}`}`}`}`}`}`}`}`y`y`r`y`y`{`y`r`y`y`}`}`}`}`}`}`}`}`}ada`adad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`yarae`yadad`p`j`y`jad`y`j`y`jar`y`j`jadaj`g`j`j`y`q`y`j`yae`y`j`y`y`{`{`j`wae`y`w`j`y`{`wae`y`{`y`}`}`}`}`}`}`}`}`}`}`wae`y`w`j`}`}`}`}`}`}`}`}`}`}`j`w`{`q`{`j`pad`}`}`}`}`}`}`}`pad`y`p`ja`ad`j`ja`adadadadadad`jadad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`jadagad`padad`p`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`w`j`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`pad`}`}`}`}`}`}`}`}`}`y`q`}`}`}`}`}`}`}`}`}`}`}`w`yae`y`q`{`j`w`{`q`}`}`}`}`}`}`}`}`}`yadada``qad`y`y`jad`w`j`jad`y`j`qa``j`pad`}`}`}`}`}`}`}`}`}`}`}`}`}ad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`y`j`y`q`yae`wad`jadad`p`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`j`wad`j`wad`y`q`y`}`}`}`}`}`}`y`jad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`j`w`j`y`j`y`j`y`q`j`{`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ad`gadadad`jadadadadad`ja``}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}agag`nasagadad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`yae`y`j`y`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`j`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`j`~`yadah`j`y`j`y`j`j`y`j`~`j`y`j`a`a`a`a", +"atatatat`j`{`y`y`j`y`y`j`y`j`y`q`ja``jae`w`y`{`q`{`y`j`w`yadae`{`q`y`q`y`y`y`j`q`yae`y`j`y`r`y`{`j`{`j`yae`}`}`}`}`}`}`j`{`jadad`j`y`{`j`w`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}adajadad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ae`y`y`qadad`j`w`j`wad`q`j`y`{`j`{`y`padadadad`j`j`y`jar`y`jar`j`q`y`j`w`y`{`q`y`yae`w`j`{`y`j`q`}`}`}`}`}`}`}`}`}`}`w`yae`y`j`}`}`}`}`}`}`}`}`}`}`}`j`j`y`jadad`}`}`}`}`}`}`}`}ad`jad`ja`ad`j`}`}`}`}agad`padadadad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ad`}`}`}`}`}`}`}`}`}`}agadadad`jad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`j`ja``}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`g`}`}`}`}`}`}`}`}`}`y`j`}`}`}`}`}`}`}`}`}`}`}`j`j`y`w`y`j`y`w`j`}`}`}`}`}`}`}`}`}`}`j`w`jadad`jad`y`q`y`j`y`j`j`y`q`jad`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`y`w`j`y`j`y`ja``j`p`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`yad`j`y`ja``jad`}`}`}`}`}`}`}`}`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`j`y`j`y`q`j`y`j`y`q`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}adadagadadadad`yadad`ja``j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}acagacadad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`y`j`y`j`w`}`}`}`}`}`}`}`}`}`}`}`}`j`y`jad`y`j`j`}`}`}`}`}`}`}`}`}`}`}`}`jad`y`j`j`y`jah`j`y`j`y`j`yad`j`y`a`a`a`a", +"atatatat`d`y`{`j`{`j`j`y`j`y`j`y`y`ja``j`j`{`y`{`j`wae`y`{`y`w`j`y`{`j`{`q`y`y`j`y`q`y`y`j`y`w`y`j`j`y`y`j`}`}`}`}`}`}`w`j`wadadad`w`yae`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}a``j`p`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`{a`ad`ja``j`ja``y`j`qa``w`{`q`y`y`jad`padadad`w`j`j`yad`{`y`j`yae`y`yae`yae`w`{`j`w`{`j`y`yar`}`}`}`}`}`}`}`}`}`}`w`{`y`w`}`}`}`}`}`}`}`}`}`}`}`}ad`p`y`jad`}`}`}`}`}`}`}`}`p`yad`q`yad`}`}`}`}`}`}ad`j`p`yadad`}`}`}`}`}`}`}`}`}`}`}`}`}`}adadadad`}`}`}`}`}`}`}`}ad`gadagadad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`s`j`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`s`}`}`}`}`}`}`}`}`}`}`}`}`j`y`q`y`j`y`y`q`}`}`}`}`}`}`}`}`}`w`j`ja`ad`jad`p`y`jad`w`jad`yad`j`j`y`p`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`y`w`j`y`j`w`j`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ad`p`y`j`j`y`p`}`}`}`}`}`}`}`}`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`p`{`w`j`y`y`q`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}adadadad`gadajadad`y`q`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}acagac`}`}`}`}`}`}`}`}`}`}`j`y`w`j`}`}`}`}`}`}`}`}`}`y`j`yae`y`y`}`}`}`}`}`}`}`}`}`}`}`}`j`y`y`j`y`j`jad`}`}`}`}`}`}`}`}`}`}`}a`ad`da``jad`j`y`j`y`j`y`y`jah`j`j`a`a`a`a", +"atatatat`j`j`j`y`jad`y`y`j`y`jae`y`{`q`j`y`q`{`jar`j`yae`y`qae`y`y`j`j`w`j`{`j`y`y`j`y`j`w`j`{`y`jar`y`{`w`}`}`}`}`}`}`yae`yadajad`j`yae`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}adadad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`r`{`j`p`j`yad`q`y`j`p`j`y`jae`y`{`y`qa`ad`jadadadad`j`p`y`j`qad`y`j`j`w`j`y`w`yae`y`w`j`{`y`q`{`}`}`}`}`}`}`}`}`}`}`w`yae`y`}`}`}`}`}`}`}`}`}`}`}`}`}adadad`p`}`}`}`}`}`}`}`}`wad`jad`j`}`}`}`}`}`}`}`j`y`p`y`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}adadadad`}`}`}`}`}`}`}`}adadaj`gad`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`jadadad`}`}`}`}`}`}ad`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`}`}`}`}`}`}`}`}`}`}`}`}arae`y`{`q`y`q`}`}`}`}`}`}`}`}`}`}`j`y`jad`padad`j`jad`w`jad`yad`w`j`y`p`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`}`}`}`}`}`}`}`}`}`}`}`}`{`j`y`q`y`j`yad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`yad`j`w`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`yae`y`j`y`j`y`j`w`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}adadadadadaj`gadad`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`i`m`}`}`}`}`}`}`}`}`}`y`q`y`j`y`y`}`}`}`}`}`}`}`}`jar`y`j`y`j`{`}`}`}`}`}`}`}`}`}`}`}`y`j`j`y`j`y`j`yad`}`}`}`}`}`}`}`}`}`}`y`j`jad`jad`yad`y`dad`y`ja``j`j`y`a`a`a`a", +"atatatat`y`y`j`y`j`y`j`y`j`y`y`q`{`y`y`j`ja``j`{`y`{`w`yae`y`y`r`y`yae`y`y`q`y`r`yae`y`y`y`r`y`j`yae`w`j`{`}`}`}`}`}`}`y`j`yadad`j`w`j`w`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}adad`p`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`{`y`jadadad`y`jad`yadad`p`y`y`r`y`y`r`yad`yadad`s`j`yad`p`y`j`y`q`y`ja`ae`j`yar`j`{`y`y`r`y`y`w`{`}`}`}`}`}`}`}`}`}`{`j`w`{`}`}`}`}`}`}`}`}`}`}`}`}`}`}`gad`j`}`}`}`}`}`}`}`}ad`wada``w`}`}`}`}`}`}`}`w`yae`yar`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}agadadad`}`}`}`}`}`}`}`}`}ag`gajadad`}`}`}`}`}`}`}`}`}`}`}`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}a``qad`j`}`}`}`}`}`}adadad`jad`}`}`}`}`}`}`}`}`}`}`}`g`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`w`j`y`{`j`}`}`}`}`}`}`}`}`}`}`}`y`p`jadadad`padadad`ja``qad`y`jad`j`y`p`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`q`}`}`}`}`}`}`}`}`}`}`}`}`j`y`j`y`q`yar`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`p`y`y`j`j`w`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`j`}`}`}`}`}`}`}`q`y`j`y`j`w`yae`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}adadadadadadadadad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ac`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`y`j`y`y`j`y`}`}`}`}`}`}`}`}`}`}`}`j`y`y`j`y`j`y`jad`j`}`}`}`}`}`}`}`}`}`yao`jadao`j`j`~`y`j`y`d`y`jah`y`j`a`a`a`a", +"atatatatae`y`y`j`j`yad`j`y`q`j`y`j`y`j`q`y`y`j`w`{`j`{`{`q`yae`y`yae`y`j`w`j`j`y`y`{`j`w`jae`y`j`w`{`y`j`{`}`}`}`}`}`}ae`q`{adadad`j`y`j`{`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`s`jad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`w`yadad`ja``qad`j`wad`jad`y`jae`yar`j`{`yadad`qadadadad`yad`j`yadad`jad`y`q`y`j`y`w`j`yae`w`y`jae`}`}`}`}`}`}`}`}`}`{`w`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`pad`}`}`}`}`}`}`}ad`j`y`jadad`}`}`}`}`}`}`}`}`j`w`y`j`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`gadadad`g`}`}`}`}`}`}`}`}ag`gag`gag`}`}`}`}`}`}`}adagad`g`g`gadadaiad`}`}`}`}`}`}`}`}`}`}adadadad`j`}`}`}`}`gadadadadag`gac`}`}`}`}`}`}`}`}`}ad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`{`j`w`j`y`}`}`}`}`}`}`}`}`}`}`yad`jadad`g`qadadadad`jad`jad`q`j`y`j`p`y`}`}`}`}`}`}`}`j`w`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`y`}`}`}`}`}`}`}`}`}`}`}`}ae`y`q`y`j`j`}`}`}`}`}`}`}`}adad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`jad`j`ja``j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`yad`j`}`}`}`}`}`}`}`}`j`y`q`y`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}adad`jadadad`g`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`y`j`{`j`y`j`y`}`}`}`}`}`}`}`}`}`}`y`y`jad`jah`jad`y`j`}`}`}`}`}`}`}`}`y`j`jad`y`j`j`~`yadad`j`y`j`yad`d`y`a`a`a`a", +"atatatat`yae`y`y`j`y`y`j`j`yad`{`q`{`y`j`jad`j`y`y`y`{`{`y`jar`j`w`yae`y`j`y`y`q`{`w`{`{`w`y`{`j`{`j`{`w`{`}`}`}`}`}`}`y`y`qadad`g`yar`j`w`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`{`y`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ae`w`jad`p`j`y`w`j`yad`j`s`y`j`w`{`yar`j`w`j`yad`s`j`j`pad`w`j`y`q`y`j`y`j`y`j`w`j`{`y`w`j`{ad`yae`y`}`}`}`}`}`}`}`}`y`{`w`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ad`j`}`}`}`}`}`}`}ad`pad`j`w`j`}`}`}`}`}`}`}`}`y`y`q`{`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}ad`gajad`g`}`}`}`}`}`}`}`}`iac`i`g`g`}`}`}`}`}`}`}ad`g`j`pad`ja``ja`ad`pad`}`}`}`}`}`}`}`}agadad`gag`}`}`}ag`gagag`g`n`gagacaa`}`}`}`}`}`}`}`}`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`y`q`y`}`}`}`}`}`}`}`}`}`}`yadadadadadadad`p`y`padadad`jadad`q`yad`}`}`}`}`}`}`}`}`j`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`j`y`j`y`}`}`}`}`}`}`}`}`}`}`y`y`j`y`y`}`}`}`}`}`}`}`}`jad`gadad`jad`}`}`}`}`}`}`}`}`}`}`y`p`j`y`s`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}a``j`w`j`}`}`}`}`}`}`}`}`y`j`y`q`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`w`j`}`}`}`}`}`}`}`}`}`}`}adada``jadadad`}`}`}`}`}`}`}`}`}`}`}`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ae`y`j`y`yae`y`j`}`}`}`}`}`}`}`}`}`}`j`y`y`j`y`j`y`ja``j`~`}`}`}`}`}`}`j`ya``j`j`ya``j`jad`yad`~`y`j`j`ya``j`a`a`a`a", +"atatatat`{`y`j`{`yae`y`j`y`y`q`y`j`{`y`q`yad`jad`j`wae`y`r`y`j`{`y`j`w`j`y`j`w`j`yae`y`j`j`wae`y`y`q`y`j`{`}`}`}`}`}`}`y`r`y`jagadad`y`j`{`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`y`{`jar`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`{adad`p`yad`y`j`jad`qa``j`j`y`{`y`jae`y`y`qadadadadadada``j`jad`y`jad`wadad`j`yae`w`j`y`{`j`w`{`q`y`}`}`}`}`}`}`}`}`}`r`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ajad`}`}`}`}`}`}`}`yad`y`jadad`}`}`}`}`}`}`}`}`}ar`j`{`j`}`}`}`}`}`}`}`}`}`}`}`}`}adadadadag`g`}`}`}`}`}`}`}`}`gag`g`gad`}`}`}`}`}`}`}`}`qadae`yad`y`p`j`y`~`j`}`}`}`}`}`}`}`}ad`padadad`}`}ad`padadadadadad`g`uag`}`}`}`}`}`}`}`}agad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ae`y`j`}`}`}`}`}`}`}`}`}adadad`padadadad`qadadad`jad`jad`wad`jadad`}`}`}`}`}`}`}`}`jad`j`}`}`}`}`}`}`}`}`}`}`}`}`}`j`q`y`j`w`j`y`}`}`}`}`}`}`}`}`}`y`y`q`y`q`}`}`}`}`}`}`}`}`jadadajadad`j`s`}`}`}`}`}`}`}`}`}`}`y`j`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`y`qa``j`}`}`}`}`}`}`}`}`j`y`j`}`}`}`}`}`}`}`}`}`}`}`}`q`y`d`w`j`y`j`j`w`jad`}`}`}`}`}`}`}adadadad`jadad`}`}`}`}`}`}`}`}`}`}`}`j`q`y`j`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`w`y`jar`j`y`{`}`}`}`}`}`}`}`}`}`}`}`y`j`y`j`yad`y`j`~`jad`}`}`}`}adah`j`jao`j`jahad`ja``jad`jad`jao`j`j`j`a`a`a`a", +"atatatat`y`j`{`j`y`y`{`j`j`y`{`j`j`jad`j`ja``jad`y`{`y`{`y`yar`y`j`y`{`w`j`y`j`y`j`wae`y`{`y`{ae`y`{`w`{ad`}`}`}`}`}`}`j`y`{`padad`j`y`y`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ar`j`{`y`{`}`}`}`}`}`}`}adadad`j`j`w`y`{`}`}`}`}`y`{`j`yadad`qad`yad`y`p`j`y`qa``qae`y`y`j`y`{`y`q`yad`j`jadadadad`yad`y`j`y`p`y`y`j`y`{`j`w`j`{`y`yae`y`j`}`}`}`}`}`}`}`}`{`q`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`p`}`}`}`}`}`}`}`j`s`jadad`s`}`}`}`}`}`}`}`}`}`y`wae`y`y`}`}`}`}`}`}`}`}`}`}`}`}`jad`p`yadad`p`}`}`}`}`}`}`}`s`y`q`y`w`}`}`}`}`}`}`}`}ad`y`y`q`j`y`j`j`s`jad`}`}`}`}`}`}`}`}`y`y`qa``}`}`}`}`y`y`w`y`yar`j`y`y`j`y`}`}`}`}`}`}`}`gad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ad`}`}`}`}`}`}`}`}`}`q`y`}`}`}`}`}`}`}`}`w`jadadaj`gadadadadad`pad`wadad`jad`p`y`jad`}`}`}`}`}`}`}`}`j`y`yad`}`}`}`}`}`}`}`}`}`}`}`}`y`y`j`y`{`q`y`}`}`}`}`}`}`}`}`}`j`j`y`j`y`}`}`}`}`}`}`}`}ad`ja`adadadad`j`y`}`}`}`}`}`}`}`}`}`w`jad`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`p`y`j`y`y`q`}`}`}`}`}`}`}`}`y`y`}`}`}`}`}`}`}`}`}`}`}`}`j`y`j`w`ja``j`y`ja``j`j`}`}`}`}`}`}`}adadadadadad`j`}`}`}`}`}`}`}`}`}`}`}`y`y`j`y`j`y`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`j`y`{`y`j`{`w`y`}`}`}`}`}`}`}`}`}`}`j`y`j`y`j`ja``j`yad`yadahad`d`yad`j`y`j`y`j`y`d`y`~ad`y`~`ja``jao`jah`a`a`a`a", +"atatatat`y`{`j`y`j`j`{`w`{`jad`qad`yad`yad`j`y`jad`j`q`{`j`{`j`{`{`q`yae`y`y`q`y`w`{`y`j`j`wae`y`w`{`j`jar`}`}`}`}`}`}`w`yae`yadagad`y`j`y`{`}`}`}`}`}`}`}`}`}`y`{`wae`y`{`w`}`}`}`}`}`}`}`}`{`j`y`yar`}`}`}`}`}`}`}ad`j`s`j`w`y`{`yae`wae`y`j`j`w`j`pad`j`ja``q`j`y`jad`y`j`{`y`q`yar`j`w`j`y`jadad`wad`yadad`p`j`q`y`y`j`j`j`w`j`j`w`{`j`y`y`q`j`yae`}`}`}`}`}`}`}`}`}`{`y`}`}`}`}`}`}ar`}`}`}`}`}`}`}`}`}`j`}`}`}`}`}`}`}`pad`j`wadadaj`}`}`}`}`}`}`}`}`}`y`w`j`y`}`}`}`}`}`}`}`}`}`}`}a`aear`{`j`w`j`y`}`}`}`}`}`}`}`jae`y`y`j`}`}`}`}`}`}`}`}`j`s`jad`yad`wad`j`y`w`}`}`}`}`}`}`}`}`w`j`y`}`}`}`}`}`}ar`j`y`q`j`{`y`j`wae`}`}`}`}`}`}`}`{`w`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ad`}`}`}`}`}`}`}`}`}`y`j`}`}`}`}`}`}`}`}`jadadagadadad`padadad`jadadad`qadadadadad`}`}`}`}`}`}`}`}`}`j`p`j`j`}`}`}`}`}`}`}`}`}`}`}`j`q`j`y`q`j`y`j`}`}`}`}`}`}`}`}`}`q`y`j`j`w`}`}`}`}`}`}`}`y`qad`j`padadada`ae`y`j`}`}`}`}`}`}`}`y`j`w`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`j`j`y`j`y`j`}`}`}`}`}`}`}`j`y`}`}`}`}`}`}`}`}`}`}`}`j`y`q`y`j`j`y`j`j`q`yad`}`}`}`}`}`}`}`}adadadadadad`}`}`}`}`}`}`}`}`}`}`}`}`q`y`ja``q`y`w`j`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`y`{`j`y`j`y`j`yae`}`}`}`}`}`}`}`}`}`}`j`{`j`y`j`y`j`yadad`d`yad`j`yad`j`yad`j`~`y`ja``jad`jad`jadad`jad`jad`a`a`a`a", +"atatatat`j`y`{`y`{`j`y`j`{`{`y`y`j`j`j`y`y`jad`j`y`j`yar`y`j`{`{`y`y`yar`j`y`{ae`y`y`{arad`y`yae`j`yar`y`y`}`}`}`}`}`}`j`j`y`jad`had`{`y`yae`}`}`}`}`}`}`}`y`{`wae`y`yar`j`y`}`}`}`}`}`}`}`}ar`{ar`j`{`}`}`}`}`}`}`}`w`j`{`yae`w`j`{`y`yar`y`wae`y`ja`adadadad`j`w`ja``j`y`w`j`{`y`j`w`j`jadad`j`yad`jadad`jadada``j`j`p`y`j`yad`y`j`y`y`q`{`y`yar`j`y`}`}`}`}`}`}`}`}`}`y`{`}`}`}`}`}`}`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`yadad`jadadad`}`}`}`}`}`}`}`}`}ae`y`r`y`}`}`}`}`}`}`}`}`}`}`}`w`y`j`y`y`j`w`{`}`}`}`}`}`}`}`}`j`y`q`y`}`}`}`}`}`}`}`}`j`y`w`j`y`y`j`w`y`j`}`}`}`}`}`}`}`}`j`y`wae`}`}`}`}`}`}`j`j`y`y`jae`w`y`y`j`}`}`}`}`}`}`}ad`y`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`qad`}`}`}`}`}`}`}`}`}`y`}`}`}`}`}`}`}`}ad`padag`gadad`jad`jad`pad`jada``qa``j`p`y`}`}`}`}`}`}`}`}a``j`ja`adad`}`}`}`}`}`}`}`}`}`}`j`y`j`y`j`y`j`y`j`}`}`}`}`}`}`}`}`y`y`j`j`y`}`}`}`}`}`}`}a``j`yad`jadadadad`j`y`y`}`}`}`}`}`}`}ad`y`j`w`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`q`j`w`j`j`y`}`}`}`}`}`}`}`y`w`}`}`}`}`}`}`}`}`}`}`y`j`y`y`j`w`y`w`j`yad`jad`}`}`}`}`}`}`}`}`}adadadad`}`}`}`}`}`}`}`}`}`}`}`}`d`j`w`j`j`y`j`y`y`q`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`q`y`y`j`y`j`y`j`y`}`}`}`}`}`}`}`}`}`}`}`j`y`j`y`j`ja``ja``j`jad`y`j`yad`y`j`yad`j`y`ja``y`d`ya``dada``~`yad`a`a`a`a", +"atatatat`y`y`j`yae`yae`w`y`{`j`{`y`qa``j`j`ja`adadad`y`y`j`{`w`j`{`r`yae`j`yar`y`j`y`q`j`y`yae`j`w`y`j`j`y`}`}`}`}`}`}`y`{`y`jadagaj`y`jar`y`}`}`}`}`}`}`}`yae`w`{`j`y`j`y`y`}`}`}`}`}`}`}`}`yae`{`y`{`}`}`}`}`}`}`}ae`y`y`{`w`{`yar`jar`j`{ae`y`y`{`y`pad`j`pa``j`j`j`w`j`j`y`{`w`{`j`yad`p`yad`padadadad`p`yad`p`j`sad`jad`qad`y`jar`w`j`{`q`y`j`y`w`{`}`}`}`}`}`}`}`}`}`y`}`}`}`}`}`}`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ad`j`w`jad`padad`}`}`}`}`}`}`}`}`w`j`y`j`}`}`}`}`}`}`}`}`}`}`}`y`{`j`w`yar`y`y`}`}`}`}`}`}`}`}`}`q`y`y`j`}`}`}`}`}`}`}`}`j`yae`y`j`q`{`j`}`}`}`}`}`}`}`}`}ae`w`j`y`}`}`}`}`}`}`}`{`y`q`{`y`y`j`y`q`}`}`}`}`}`}`}`y`wae`w`}`}`}`}`}`}`}`}`}`}`}`}`}`y`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`wadadaj`g`paj`gadad`p`ja`adad`j`jadadad`}`}`}`}`}`}`}`}`}`jad`s`j`jad`}`}`}`}`}`}`}`}`}`}`j`y`q`y`j`y`q`y`j`}`}`}`}`}`}`}`}`}`q`j`y`q`}`}`}`}`}`}`}`y`q`j`y`j`y`qadadad`j`j`}`}`}`}`}`}`}`}`q`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`y`q`y`j`y`j`y`j`}`}`}`}`}`}`}`j`y`}`}`}`}`}`}`}`}`}`j`y`j`j`j`w`j`j`j`y`j`yadad`}`}`}`}`}`}`}`}`}adadajad`}`}`}`}`}`}`}`}`}`}`}`}`w`ja``j`w`y`j`w`j`y`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ae`w`j`y`jae`y`y`{`j`w`j`}`}`}`}`}`}`}`}`}`}`}`r`y`y`j`y`j`y`j`~`ja``j`d`yad`j`j`yad`j`j`y`~`y`j`j`j`ja``jad`jad`j`a`a`a`a", +"atatatat`{`j`{`q`y`{`j`{`j`{ar`j`{`j`{`y`p`jadad`j`j`y`j`{`{`y`{`j`{`w`{`w`{`j`{`{`j`yar`{`j`w`j`y`y`y`j`y`}`}`}`}`}`}ar`j`y`jad`hag`y`j`yae`}`}`}`}`}`}`}`}`y`y`{`{`w`{ae`j`}`}`}`}`}`}`}`}`q`y`q`{`j`}`}`}`}`}`}`}`r`{`q`yae`yae`yar`y`{`w`{`wae`y`j`y`wadad`ja``j`y`qad`j`w`j`{`y`q`jadad`ja``j`padadadad`jadadadad`ja`ad`jad`j`y`j`{`y`y`j`w`{`j`y`q`}`}`}`}`}`}`}`}`}`y`}`}`}`}`}`}`y`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`ja``j`yadadag`}`}`}`}`}`}`}`}`yar`yae`}`}`}`}`}`}`}`}`}`}`}`q`y`j`{`j`{`q`y`}`}`}`}`}`}`}`}`}`j`w`j`y`}`}`}`}`}`}`}`}`}ad`w`j`y`}`}`}`}`}`}`}`}`}`}`}`}`j`{`wae`}`}`}`}`}`}`}ae`y`w`y`j`{`y`j`{`}`}`}`}`}`}`}`{`j`y`j`}`}`}`}`}`}`}`}`}`}`}`}`y`jar`yad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`yad`gajadad`j`padadad`p`yadadad`jadad`}`}`}`}`}`}`}`}`}ad`jadad`qad`}`}`}`}`}`}`}`}`}`}`y`j`y`j`y`{`j`y`q`}`}`}`}`}`}`}`}`}`y`q`y`y`}`}`}`}`}`}`}ad`y`p`yad`j`ja`adad`j`}`}`}`}`}`}`}`}`}`j`jad`}`}`}`}`}`}`}`}`}`}`}`}`}`y`j`y`y`w`j`q`y`}`}`}`}`}`}`}`y`j`}`}`}`}`}`}`}`}`y`{ad`w`y`j`y`ja``jad`jad`yad`}`}`}`}`}`}`}`}`}adadad`g`}`}`}`}`}`}`}`}`}adadad`y`j`y`y`j`j`y`j`j`w`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`y`q`j`y`y`j`y`j`y`y`{`y`j`y`yae`y`j`y`y`j`}`}`}`}`}`}`}`}`}`}`}`j`yae`y`j`y`j`yad`jadad`y`jahad`y`jada``j`y`j`~`ya``j`dad`y`j`~adad`a`a`a`a", +"atatatat`j`yae`y`yae`w`{`y`q`j`{`y`{`y`wae`y`j`y`y`y`j`y`{`q`yaear`y`{`yae`{`wae`yar`y`{`j`w`y`{`{`jar`{`q`}`}`}`}`}`}`j`y`{`yad`i`gaj`y`y`j`}`}`}`}`}`}`}`}`w`yae`q`y`{`y`w`}`}`}`}`}`}`}`}`y`j`{`y`{`}`}`}`}`}`}`}`y`{`y`y`r`y`{`wae`y`j`{`j`{`}`}`}`}`}`}`}`}`j`j`yad`yad`y`{ar`j`ya``j`p`yad`jad`y`padadadadadadadadadadadad`w`jad`j`w`{`q`{`j`yae`y`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`j`j`{`}`}`}`}`}`}`}`}`}`}`}`}`}`}`wad`j`wad`pad`y`q`}`}`}`}`}`}`}`y`jae`y`}`}`}`}`}`}`}`}`}`}`}`y`jar`y`j`w`{`j`}`}`}`}`}`}`}`}`}`{`j`{`q`}`}`}`}`}`}`}`}`}`}ae`}`}`}`}`}`}`}`}`}`}`}`}`}`}`w`{`j`{`}`}`}`}`}`}`}`j`y`{`y`r`yae`w`}`}`}`}`}`}`}`}`j`w`w`j`w`}`}`}`}`}`}`}`}`}`}`}`q`y`j`y`w`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`qadaj`gad`gadadadadad`jad`qa`ad`qa`ad`}`}`}`}`}`}`}`}ad`j`y`padada``}`}`}`}`}`}`}`}`}`}`}`y`j`w`j`w`j`y`j`}`}`}`}`}`}`}`}`}`q`y`y`j`}`}`}`}`}`}`}ad`q`y`j`ja``qad`jadad`}`}`}`}`}`}`}`}`}ad`j`s`}`}`}`}`}`}`}`}`}`}`}`}`}`y`j`w`{`j`j`y`y`}`}`}`}`}`}`}`j`y`}`}`}`}`}`}`}`}`j`w`j`y`j`y`jadadad`jadadad`}`}`}`}`}`}`}`}`}`}adadadad`}`}`}`}`}`}`}`}adadadad`jad`y`j`w`j`y`y`w`j`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`j`y`y`j`y`r`y`{`j`j`y`j`y`j`y`j`y`w`y`j`}`}`}`}`}`}`}`}`}`}`}`y`j`w`j`y`y`yad`j`yad`y`y`j`y`j`ja``j`yad`j`ja``j`da``j`yad`da``ja``a`a`a`a", +"atatatat`{`j`yae`y`{`j`{`j`y`y`r`yae`y`{`wae`w`j`{`y`y`r`y`{`y`yae`yar`y`yae`y`{`{`j`yae`w`{`j`{`y`yae`y`y`}`}`}`}`}`}`y`q`jaead`gag`g`j`y`j`}`}`}`}`}`}`}`}`y`{`w`{`j`y`{`{`}`}`}`}`}`}`}`}`}ar`j`y`r`}`}`}`}`}`}`}`w`j`{`y`{`j`y`{`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`pad`yad`jad`yae`y`y`jadadad`p`ja``j`y`qa``jad`pad`jadadad`jad`yad`ja``j`y`{`w`yae`w`jar`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`{`y`w`jae`}`}`}`}`}`}`}`}`}`}`}`}`}`y`jad`y`j`yad`y`j`}`}`}`}`}`}`}`j`w`y`j`j`}`}`}`}`}`}`}`}`}`}`j`yae`w`y`jar`y`}`}`}`}`}`}`}`}`}ae`w`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`w`{`q`}`}`}`}`}`}`}`}`q`y`j`yar`y`}`}`}`}`}`}`}`}`}`y`yae`y`y`y`}`}`}`}`}`}`}`}`}`}`y`{`q`y`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ad`y`qadad`gajadadadad`pada``j`jadad`ja``}`}`}`}`}`}`}`}adad`jadad`j`j`}`}`}`}`}`}`}`}`}`}`}`y`j`y`j`y`q`y`j`}`}`}`}`}`}`}`}`}`}`j`y`y`}`}`}`}`}`}`}adad`j`j`yad`jad`y`q`}`}`}`}`}`}`}`}`}`}`y`j`jad`}`}`}`}`}`}`}`}`}`}`}`j`y`j`y`j`w`y`q`y`}`}`}`}`}`}`}`w`j`}`}`}`}`}`}`}`w`y`j`y`j`y`j`jadadadadadadad`}`}`}`}`}`}`}`}`}`}adadadad`}`}`}`}`}`}`}`}adajadad`}`}`}`y`j`y`j`j`y`q`y`j`w`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`q`yad`y`y`y`q`y`y`y`q`{`w`j`yae`y`q`y`}`}`}`}`}`}`}`}`}`}`}`y`y`j`y`j`y`j`yad`j`~`jadad`da``j`y`d`y`j`~ad`y`j`jad`~`jad`yad`dad`a`a`a`a", +"atatatatae`y`{`y`w`j`{`w`j`y`r`y`y`r`{`wae`y`{`y`y`r`y`yae`y`j`{`yar`{`yae`w`{`yae`yar`y`{`y`j`w`j`{`w`j`y`}`}`}`}`}`}ad`ja``j`g`g`i`g`yad`{`}`}`}`}`}`}`}`}`y`yae`y`{`yae`w`}`}`}`}`}`}`}`}`}ae`yar`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}adad`jada``j`w`{`yar`yadad`jad`s`y`j`jad`w`jadad`y`jad`s`jadad`pad`jad`w`j`y`j`w`j`y`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`r`y`y`j`w`}`}`}`}`}`}`}`}`}`}`}`}`y`j`y`j`w`j`w`{`j`}`}`}`}`}`}`}`}`j`y`j`y`}`}`}`}`}`}`}`}`}`}`j`y`w`y`j`y`{`y`}`}`}`}`}`}`}`}`j`w`y`j`{`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`w`{`j`y`j`}`}`}`}`}`}`}`}`}`yar`j`}`}`}`}`}`}`}`}`}`}`w`y`j`wae`y`q`{`}`}`}`}`}`}`}`y`{`q`{`yae`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`s`jadadadadad`g`padadad`jadadad`wad`j`}`}`}`}`}`}`}`}`jadadadadadad`}`}`}`}`}`}`}`}`}`}`}`y`j`q`y`y`j`j`y`y`}`}`}`}`}`}`}`}`}`j`y`j`}`}`}`}`}`}`}adad`yada``j`w`j`yad`}`}`}`}`}`}`}`}`}`}`q`j`w`j`}`}`}`}`}`}`}`}`}`}`}`j`w`y`j`w`yae`y`y`}`}`}`}`}`}`}`j`y`}`}`}`}`}`}`}`yae`y`q`y`j`wadadadadadadadad`}`}`}`}`}`}`}`}`}`}`}agadad`}`}`}`}`}`}`}`}adad`g`}`}`}`}`}`j`y`q`y`q`y`j`y`j`}`}`}`}`}`}`}`j`}`}`}`}`}`}`}`}`}`}`y`j`yae`y`j`y`j`j`y`j`y`j`y`j`{`y`j`y`j`}`}`}`}`}`}`}`}`}`}`j`y`q`y`j`y`j`y`ja``jad`y`yad`y`j`j`yad`y`j`yad`j`yad`yad`yad`dadad`a`a`a`a", +"atatatat`y`qae`y`{`j`{`j`{`j`y`{`yae`w`{`j`{`r`{`j`{`w`j`{`jar`j`{`j`{`{ar`{`yar`j`{`y`{`q`{`{`j`{`j`j`{`y`}`}`}`}`}`}`y`y`jad`i`gag`~ad`j`}`}`}`}`}`}`}`}`}`j`w`{`{`q`yae`y`}`}`}`}`}`}`}`}`}`{`y`y`r`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}adadadadadad`j`q`y`j`w`yadadad`j`y`y`j`w`y`j`{`sad`j`p`jad`yad`yadad`j`y`j`j`yae`w`j`w`{`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`j`yar`j`y`y`}`}`}`}`}`}`}`}`}`}`}`j`w`j`y`j`j`y`w`j`}`}`}`}`}`}`}`}`q`j`y`j`}`}`}`}`}`}`}`}`}`}`y`j`yae`w`jar`y`}`}`}`}`}`}`}`}`j`y`q`y`q`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`yae`w`{ar`{`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`{`y`w`j`y`{`j`yar`j`}`}`}ar`yae`y`j`w`j`wae`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`y`w`j`jadagadadadad`j`sadadadad`j`p`y`}`}`}`}`}`}`}`}`j`jad`p`jadad`}`}`}`}`}`}`}`}`}`}`}`q`y`j`y`j`w`j`y`j`}`}`}`}`}`}`}`}`}`s`jad`}`}`}`}`}`}`}adad`j`j`j`y`jad`y`}`}`}`}`}`}`}`}`}`}`}`j`y`j`y`}`}`}`}`}`}`}`}`}`}`}`j`y`j`y`j`y`jar`j`}`}`}`}`}`}`}`y`j`}`}`}`}`}`}`}`j`y`j`y`j`y`j`yadadadadadadad`}`}`}`}`}`}`}`}`}`}`}adadad`}`}`}`}`}`}`}`}adad`}`}`}`}`}`}`}ad`j`y`j`y`ja``q`}`}`}`}`}`}`}ad`}`}`}`}`}`}`}`}`}`}`}`y`j`y`j`y`yae`y`j`yae`y`j`y`q`{`j`y`r`}`}`}`}`}`}`}`}`}`}`y`j`y`j`y`y`j`y`y`jad`j`~`j`y`j`jad`y`d`ja``j`y`jahadad`j`ja``jadad`a`a`a`a", +"atatatatae`y`{`{`j`y`{`{`w`j`yae`yar`{`j`w`{`y`yar`y`{`y`j`{`y`{`y`{`w`y`{`j`w`j`{`{`y`r`{`y`{`y`j`y`y`q`{`}`}`}`}`}`}`{adadadag`gag`gada``}`}`}`}`}`}`}`}`}`y`{`y`j`y`yar`y`}`}`}`}`}`}`}`}`}`y`r`y`{`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`yadadadaj`s`j`{`y`w`{`j`w`jadad`wae`w`y`y`q`y`y`j`j`ya`ad`jadad`p`yad`j`p`y`y`w`j`y`y`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}ae`y`p`yae`y`jar`}`}`}`}`}`}`}`}`}`}`{`j`y`y`q`y`j`{`j`}`}`}`}`}`}`}`}`ja``w`j`}`}`}`}`}`}`}`}`}`}`{`y`r`y`y`j`j`{`j`}`}`}`}`}`}`w`jar`y`j`y`{`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`yae`y`{`q`{`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ae`sae`{`{`w`jar`j`y`yae`w`yae`y`w`{`w`{`y`y`y`}`}`}`}`}`}`}`}`}`}`}`}`}`y`j`j`y`j`q`gadadad`gadadad`jad`j`y`ja``j`}`}`}`}`}`}`}`}`}`qa`adadadad`}`}`}`}`}`}`}`}`}`}`}`yad`j`q`y`j`j`w`y`}`}`}`}`}`}`}`}`}`y`j`y`}`}`}`}`}`}`}adadadadadad`j`ja``}`}`}`}`}`}`}`}`}`}`}`}`y`qad`}`}`}`}`}`}`}`}`}`}`}`y`j`w`j`y`q`y`j`y`}`}`}`}`}`}`}`j`y`}`}`}`}`}`}`}`j`yar`j`y`w`j`y`qadadag`gadaj`}`}`}`}`}`}`}`}`}`}`}`}adad`}`}`}`}`}`}`}`}adad`}`}`}`}`}`}`}a`adad`j`j`y`j`y`}`}`}`}`}`}`}ad`}`}`}`}`}`}`}`}`}`}`}`}`j`j`w`y`j`j`y`y`y`j`y`y`j`y`y`w`j`y`y`}`}`}`}`}`}`}`}`}`y`{`j`j`y`jae`y`j`y`jao`jad`yad`y`y`j`ya``j`y`j`d`yad`y`d`yadahadad`a`a`a`a", +"atatatat`w`jae`y`{`j`j`{`y`q`y`{`j`{`yae`y`r`{`y`j`{`yar`{`jar`j`{`j`{`j`w`{`y`{`q`y`{`yae`w`yae`w`y`{`j`y`{`}`}`}`}ajad`had`iad`gadadad`j`}`}`}`}`}`}`}`}`}`}`w`j`{`w`j`{`r`}`}`}`}`}`}`}`}`y`{`j`y`{`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`yadadadadad`j`y`q`yae`y`y`qad`ja`ae`j`w`yae`y`q`{`j`w`j`y`p`yad`j`pa`ad`jad`j`y`r`y`j`w`j`w`}`}`}`}`}`}`}`}`}`}`}`}`w`j`y`y`q`y`y`j`}`}`}`}`}`}`}`}`}`}`w`j`{`yae`w`j`w`j`}`}`}`}`}`}`}`}`y`jae`w`}`}`}`}`}`}`}`}`}`j`y`w`{`j`y`w`j`{`j`y`}`}`}`}`{`j`y`{`q`y`w`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`{`w`y`y`j`{`y`w`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ae`y`y`q`{`j`y`y`q`{`j`y`{ar`j`y`j`j`{`q`{`q`{`y`}`}`}`}`}`}`}`}`}`}`}`}`j`y`w`j`jadadagadadajad`padad`j`padad`jad`y`}`}`}`}`}`}`}`}`jadadad`j`y`}`}`}`}`}`}`}`}`}`}`}ad`y`ja``j`j`y`j`j`w`}`}`}`}`}`}`}`}`j`y`j`}`}`}`}`}`}`}adadadadad`pad`j`j`}`}`}`}`}`}`}`}`}`}`}`}`}`y`q`}`}`}`}`}`}`}`}`}`}`y`q`y`j`y`j`j`y`j`y`}`}`}`}`}`}`}`q`y`}`}`}`}`}`}`}`y`j`y`j`y`{`j`j`y`qadadadadad`}`}`}`}`}`}`}`}`}`}`}`}agadad`}`}`}`}`}`}`}adad`}`}`}`}`}`}`}adadadadad`j`}`}`}`}`}`}`}`}`}adad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`j`w`j`j`}`}`}`}`y`j`y`jar`j`y`}`}`}`}`}`}`}`}`j`w`j`y`y`y`j`y`j`y`j`ya``j`jadad`j`y`j`j`y`j`yad`j`y`ja``~`j`ja`ad`a`a`a`a", +"atatatatae`y`y`{`j`w`y`j`y`{ar`j`y`q`{`{`w`{`yae`{`{ar`{`j`{`y`{`y`{`yar`{`yae`{`{`y`{`w`{`yae`y`y`{`y`j`{`y`j`}`}`}ag`hag`gag`g`g`j`y`ja``}`}`}`}`}`}`}`}`}`}`j`y`{`jar`y`j`{`}`}`}`}`}`}`r`yae`y`{`w`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ae`y`wadadadad`jad`y`y`jar`{`j`yadad`j`y`j`y`j`{`y`y`j`{`y`y`jad`qad`ja``j`j`yad`w`j`y`w`j`{`y`y`}`}`}`}`}`}`}`}`}`}`}ae`y`y`j`y`q`{`q`y`}`}`}`}`}`}`}`}`}`{`j`y`j`w`j`y`y`{ae`}`}`}`}`}`}`}`y`w`yae`}`}`}`}`}`}`}`}`}`yar`y`j`y`q`y`{`j`w`{`y`q`y`{`j`w`j`w`{`y`j`{`j`w`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`w`yae`{`j`w`{`{`wae`{`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`{`y`y`w`{`j`{`y`jar`y`j`yar`j`y`{`w`yar`j`y`j`y`{`}`}`}`}`}`}`}`}`}`}`}`}`j`w`j`y`j`wadadaj`g`gadadada``qadadad`qadad`}`}`}`}`}`}`}`}ad`yad`j`pad`}`}`}`}`}`}`}`}`}`}`}adadad`wad`y`j`s`j`y`}`}`}`}`}`}`}`}a``jad`}`}`}`}`}`}`}adadad`jadad`yad`q`}`}`}`}`}`}`}`}`}`}`}`}`}`j`y`}`}`}`}`}`}`}`}`}`}`j`y`yae`y`y`y`q`y`y`}`}`}`}`}`}`}`j`y`}`}`}`}`}`}`}`q`y`j`w`j`w`j`y`w`j`yad`gadad`}`}`}`}`}`}`}`}`}`}`}`}adad`g`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}adadadadadad`}`}`}`}`}`}`}`}`}adadad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`y`}`}`}`}`}`}`y`w`j`y`j`w`}`}`}`}`}`}`}`}`j`y`y`j`y`j`y`j`y`y`j`y`jad`da``j`y`j`y`j`y`ja``j`yahad`j`ja``jad`d`a`a`a`a", +"atatatat`j`y`j`{`j`y`q`{`w`j`{`{`yae`wae`y`r`y`y`r`{`j`{`y`r`y`q`{ae`y`{`j`{`q`yae`yae`{`w`{`wae`yae`w`y`j`w`y`j`gag`g`g`iadadadadadad`y`j`}`}`}`}`}`}`}`}`}`}`y`yar`y`j`{`w`{`j`}`}`}`}`j`{`w`jar`j`y`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`w`j`j`jadadad`y`q`j`y`j`{`s`{`qadad`q`j`y`wae`y`q`y`j`q`y`j`y`ja``jad`w`jad`jadad`j`y`j`y`q`j`j`j`}`}`}`}`}`}`}`}`}`}`j`w`j`w`j`y`y`jae`w`j`}`}`}`}`}`}`q`y`{`q`y`j`y`q`y`j`y`j`}`}`}`}`}`}`j`y`q`{`}`}`}`}`}`}`}`}`}ae`j`w`yae`y`y`wae`y`j`yae`w`y`j`{`w`yae`w`yae`w`j`{`{`}`}`}`}`}`}`}`}`}`}`}`}ar`yae`y`w`{`jar`j`{`j`y`w`{ae`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`q`{ae`y`w`{`j`w`{`jar`yae`jar`yae`j`y`y`{`p`yae`y`j`}`}`}`}`}`}`}`}`}`}adad`j`y`q`y`jad`padajad`g`padadad`y`qadad`j`g`}`}`}`}`}`}`}`}`jadadad`y`q`}`}`}`}`}`}`}`}`}`}`}adadadad`j`j`j`y`q`j`}`}`}`}`}`}`}`}ad`yad`}`}`}`}`}`}`}adadadadadadad`jad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`}`}`}`}`}`}`}`}`}`}ar`y`j`wae`w`j`j`y`j`}`}`}`}`}`}`}`y`j`}`}`}`}`}`}`}`}`j`y`j`y`j`w`j`y`y`j`jadad`}`}`}`}`}`}`}`}`}`}`}`}`}`}adaj`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}adajadad`}`}`}`}`}`}`}`}`}`}`}ad`~ad`g`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`y`j`y`j`{`}`}`}`}`}`}`}`j`y`j`y`j`y`j`y`j`y`j`y`jadad`jad`ja``jad`y`j`y`j`j`y`d`y`j`y`~ad`y`a`a`a`a", +"atatatat`y`y`{`j`y`y`yae`y`j`y`j`w`yae`y`y`{`yae`y`y`{`w`{`j`{`{`{`yar`j`w`{`y`{`{`{`j`w`{ae`y`{`{`r`y`{ae`y`yadaj`g`iadadad`j`y`ja``j`y`jad`}`}`}`}`}`}`}`}`}`{ae`{`yae`w`{`jar`y`{`q`y`{`y`y`{`yar`yae`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`{`j`y`j`y`ya`ad`q`y`waea`ad`{`wae`y`{`yada`ad`y`j`y`w`j`y`w`y`jar`y`w`j`j`p`jad`pa`adad`qad`y`wae`ya``w`}`}`}`}`}`}`}`}`}`y`yae`y`y`j`w`j`{`q`y`y`w`}`}`}`}`j`y`{`j`y`q`y`j`y`j`y`q`{`w`}`}`}`}`y`y`q`y`j`y`}`}`}`}`}`}`}`y`{`j`y`y`j`{`q`{`j`y`y`w`j`y`{`q`{`y`jar`j`y`y`{`y`y`r`j`y`}`}`}`}`}`}`}`}`jar`j`y`{`r`y`y`r`y`{`y`q`{`yae`w`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`yar`j`y`j`w`j`yae`w`j`y`{`j`{`w`{`y`{`w`{`j`wae`{`w`{`j`w`}`}`}`}`}`}`}`}`}`j`y`jadad`y`j`yadad`g`gadadadad`padad`jadad`y`wad`}`}`}`}`}`}`}adad`y`p`jad`}`}`}`}`}`}`}`}`}`}`}adadajadadadadada``j`}`}`}`}`}`}`}`}`}adad`}`}`}`}`}`}`}adadadadadadadad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`j`w`j`y`y`j`{`y`w`}`}`}`}`}`}`}`y`r`}`}`}`}`}`}`}`}`y`w`j`y`y`j`y`j`w`j`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}adad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}adadadadad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`y`q`{`j`w`y`}`}`}`}`}`y`y`j`w`j`j`y`j`y`j`y`j`y`y`j`da``ja``j`y`j`y`j`y`~`y`j`yad`y`jad`j`y`a`a`a`a", +"atatatat`j`y`j`{`j`y`j`j`y`j`w`{`{`j`{ae`w`{`y`r`{`j`y`j`w`{`j`{ar`y`{`j`{`wae`y`w`{`j`{`yae`q`y`y`{`j`y`yae`yadad`gadadadadad`ja``j`y`ja``j`y`}`}`}`}`}`}`}`}`y`q`y`j`y`yae`y`j`y`{`jar`y`r`y`j`yae`y`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`r`y`jar`y`q`{`y`r`y`wae`y`q`j`jad`y`j`y`ra`ad`j`y`q`yar`jad`qad`y`j`{`w`j`j`y`j`y`j`yad`yadadadad`jad`gadadadad`q`y`j`j`y`}`}`}`}`}`}`}`}`q`yar`j`y`{`j`w`yae`w`j`{`y`j`w`jarad`yae`y`y`q`j`y`w`j`y`j`w`j`}`}`}`{`y`y`qae`y`j`}`}`}`}`}`{`q`y`q`{`w`j`y`j`w`j`{`j`y`w`j`y`{`jar`y`j`{`q`y`q`y`y`j`y`q`y`yae`w`j`{`y`j`y`{`j`w`j`{`q`y`{`q`y`{`q`{`y`jae`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`j`{`w`j`{`yar`j`yae`w`y`r`y`j`y`q`j`{`j`y`jar`y`j`{`q`y`y`{`}`}`}`}`}`}`}`}`q`y`padadad`j`y`qadadaj`gajadadadadadadad`qadadad`}`}`}`}`}`}`}`}adad`jad`p`}`}`}`}`}`}`}`}`}`}`}agadad`gadadadadad`j`}`}`}`}`}`}`}`}`}ajag`}`}`}`}`}`}`}adadad`p`jadadad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`w`y`j`y`j`w`j`y`j`}`}`}`}`}`}`}`}`y`}`}`}`}`}`}`}`}`}`}`w`j`y`j`q`y`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}adadad`gadad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`{`y`j`y`j`y`j`{ad`y`q`y`j`y`j`y`y`j`y`j`y`y`j`j`y`jad`y`jad`jah`y`j`j`y`j`jah`j`j`jahad`ja``j`a`a`a`a", +"atatatat`j`{`j`y`j`j`s`j`{`w`{`jae`y`yar`y`{`j`{`y`y`r`y`{`{`w`{`j`yae`w`{`j`{`w`yae`{`y`y`y`{`y`{`j`y`j`y`qa``j`g`~adadadadad`yad`y`j`y`j`y`j`y`}`}`}`}`}`}`j`y`j`{`w`{`yar`j`{`waear`y`{`j`{`w`{`yar`j`{`}`}`}`}`}`w`yae`y`w`{`{`y`wae`yar`y`j`yar`j`{`y`w`{`j`y`{`j`y`j`ya``j`yar`y`y`jad`q`y`{`j`y`y`yadad`q`y`j`j`{`y`w`j`j`y`p`yad`padadad`gadadad`pad`{`y`p`y`r`y`}`}`}`}`}`}ae`w`y`j`y`y`jar`yae`y`j`yar`j`w`yae`y`j`y`j`w`j`y`y`w`j`{`q`y`y`jar`y`j`yae`w`j`{`y`w`jar`j`yar`y`yae`y`j`y`{`j`w`y`{`j`w`yae`y`y`q`{`y`w`{`{`{`q`yae`yar`j`{`y`r`{`y`y`q`{`w`{`w`{`w`y`j`y`y`{`y`w`yae`yar`jar`yar`j`}`}`}`}`}`}`}`}`}`}`}`{`y`yae`yar`y`r`y`yae`w`y`q`{`y`y`q`{`y`j`{`{`w`{`yae`w`y`{ar`j`y`}`}`}`}`}`}`w`y`j`yad`jadad`q`y`jadad`g`padadadad`jad`sadad`jad`}`}`}`}`}`}`}`}adad`padadad`}`}`}`}`}`}`}`}`}adadadadaj`gagadadad`j`}`}`}`}`}`}`}`}`}`g`g`}`}`}`}`}`}`}`}adadadadad`jad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`y`j`w`j`y`j`y`y`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`j`y`y`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`gad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}adadaj`g`iadad`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`j`w`j`y`w`j`y`j`w`yae`y`y`r`y`j`y`j`y`j`j`y`y`j`y`y`j`~`yad`j`y`j`y`y`j`yad`y`~`yad`y`j`y`j`a`a`a`a", +"atatatat`ja``yae`y`y`j`j`y`y`{`q`{`y`j`yae`w`{`j`{`{`yae`y`j`{`w`yae`y`{`w`{`y`j`{`w`{`jar`j`y`{`w`{`y`{`{`j`y`jadadad`yadad`y`j`yad`y`j`w`y`yae`y`}`}`}`}ad`y`j`y`jae`w`{`{`y`j`w`{`j`{`w`{`j`{`y`{`{`w`{ae`yar`j`yae`{`wae`y`{`q`yae`yae`y`{`y`j`yar`j`yae`w`{`q`y`{ad`w`j`j`w`j`yae`w`j`yad`j`w`{`q`y`j`jadad`y`q`y`j`y`j`w`y`j`y`j`y`jadadadadadadadad`q`j`y`y`j`y`q`y`{`q`y`j`{`y`jar`j`yar`j`y`y`wae`y`y`j`{`j`w`j`y`w`y`j`y`j`q`j`y`y`j`{`j`w`j`j`{`w`j`y`y`w`j`{`j`y`{`y`j`y`q`y`j`w`yae`y`j`{`q`y`yae`w`j`yae`y`j`{`j`q`y`y`yae`y`y`j`w`y`j`yar`j`{`j`yae`yae`y`y`r`{`jarae`y`r`y`{`j`{`w`j`y`y`r`y`y`j`j`w`j`yae`y`jar`jar`{`wae`y`{`j`w`y`{`j`{`y`q`y`j`y`r`y`y`q`y`j`w`j`y`{`wae`y`y`{`j`}`}`}`}`yae`w`j`w`j`qadadad`jadad`padadagadad`padadadad`j`pad`}`}`}`}`}`}`}`}`qadad`p`jad`}`}`}`}`}`}`}`}`}ad`jadadadadag`gajadad`}`}`}`}`}`}`}`}`}ad`g`}`}`}`}`}`}`}`}`}ad`j`}`}`}`}`}`}`}`}`}`}`}`p`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`yad`j`y`q`y`j`{`q`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`gadag`gagadadad`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`j`y`q`y`j`y`{`y`j`j`y`q`y`j`y`j`j`y`j`y`j`j`y`jad`ja``jadad`~`jad`yad`y`j`ja``j`d`jadahad`y`a`a`a`a", +"atatatat`y`yae`y`j`y`j`{`y`{`q`{`y`{`wae`{`y`{`y`{`wae`y`{`{`wae`y`{`{`w`yae`{`{`w`{`j`w`{`jar`y`{`j`q`y`j`{`yadadadad`y`j`j`yad`j`j`y`j`y`j`j`j`y`y`y`j`j`{`y`j`y`j`w`{`j`{`j`w`{`jar`y`{`j`{`w`yae`q`yae`y`{`y`{`j`w`{`j`yar`j`{`y`y`{`w`j`y`q`{`w`{`y`j`w`{`j`y`j`w`j`y`w`j`j`y`{`q`y`{`j`wad`j`j`j`j`y`qa``pad`y`j`yar`j`w`j`y`q`y`jad`padadadagadadadadad`{`q`{`w`{`y`j`w`j`y`y`j`wae`yar`j`{`yar`j`yar`{`q`y`w`j`w`{`j`w`j`{`w`j`yad`j`j`j`w`j`j`y`y`j`y`j`wae`{`j`w`j`{`q`y`j`{`y`w`j`{`jar`{`w`y`yae`y`wae`{`y`w`j`y`w`y`{`y`j`r`y`w`j`{`j`yar`j`y`y`w`{`y`q`{`q`y`{`y`w`y`jar`y`{`j`w`yae`yarae`yae`y`y`q`y`y`{`q`y`yae`{`y`wae`y`{`j`w`j`{`q`{`y`w`{`{`yar`y`yar`yae`y`w`{ae`w`{`yae`wae`w`{`{`j`{`j`w`{`y`j`y`j`y`yadadad`y`jad`gadadadadadadad`jadadad`}`}`}`}`}`}`}`}adada``jadad`}`}`}`}`}`}`}`}`}adad`gadadagadad`gadad`j`}`}`}`}`}`}`}`}`}ad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`jad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`w`j`j`y`j`y`w`j`y`}`}`}`}`}`}`}`}`}`}`q`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}adadad`hagadadadad`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`j`y`j`y`j`yar`j`j`y`j`y`y`j`y`j`y`y`y`j`y`j`y`y`j`y`yad`jadad`yad`y`~`j`y`~`jahada``j`yad`y`j`a`a`a`a", +"atatatat`{`w`{`q`{`j`w`j`{`y`yae`y`{`{`{`w`jarae`y`{ar`j`y`j`{`{`y`jae`yar`y`yar`yae`{`y`yae`y`j`y`{`y`yae`y`{`jadad`y`y`ja``j`yada``j`j`y`s`y`{`j`y`j`yad`y`j`j`w`y`j`y`{`w`j`y`{`{`j`{`wae`y`j`{`y`y`w`{`q`{`y`{`y`j`{`y`{`y`r`y`jar`y`{`y`{`j`{`w`j`y`{`yar`j`y`yae`{`w`e`w`y`j`y`j`{`y`{`j`y`pa``j`w`y`{`jadadadad`j`{ad`y`j`y`w`j`y`ja`ad`padad`pad`yadad`y`j`y`j`w`j`y`{`w`j`wae`y`y`j`y`w`j`yae`y`j`j`y`yae`y`y`jar`y`y`y`q`y`jad`j`s`y`j`y`w`jar`y`y`r`y`j`y`w`y`j`w`{`j`w`j`y`j`{`w`j`y`j`{`jar`j`y`w`j`yar`j`yae`y`{ae`y`w`yae`y`{`q`y`y`j`{`q`y`{ae`w`{`w`{`j`wae`{`yar`j`y`jar`yae`w`yae`y`wae`yar`{`j`y`w`{`yae`w`y`j`{`y`q`{`w`j`{`y`{`y`r`y`jae`w`j`{`j`j`y`w`j`y`j`{`j`w`j`y`{`y`{`j`w`y`r`y`yae`y`r`y`w`j`j`w`j`padad`j`p`j`gaiadadad`padadadadad`p`}`}`}`}`}`}`}`jad`jadad`p`}`}`}`}`}`}`}`}`}adajadad`padagadadadadad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ad`qad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`ja`ad`y`q`y`j`j`w`j`}`}`}`}`}`}`}`}`}`}`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}adad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}adadadaj`hagad`gadadad`ja``j`j`y`jad`y`}`}`}`}`}`}`}`}`}`}`}`}`y`j`y`j`y`j`y`j`y`j`y`y`q`j`y`j`y`j`y`j`j`y`y`j`j`y`j`j`y`ja``j`j`~`yad`j`y`j`y`j`j`j`yad`y`dad`y`a`a`a`a", +"atatatat`r`y`y`j`{`y`{`j`{`jar`j`y`{`q`yae`y`{`y`{`y`j`y`yar`j`{`w`j`{`y`{`j`{`y`j`{`y`{`yae`y`w`yae`wae`y`yadadad`j`y`j`y`j`y`j`y`j`y`y`j`y`j`j`y`j`y`j`y`w`j`y`y`yae`w`j`{`j`{`w`y`r`y`y`j`{ar`yarae`w`{ae`y`y`r`j`y`{`wae`y`yaear`y`y`r`y`q`{`r`y`{ae`w`j`{`j`w`y`j`w`j`y`{`j`y`yar`j`w`jar`yad`j`ja`ae`j`y`w`jadadad`wad`j`w`y`j`j`w`j`y`j`jadad`y`jad`j`w`j`y`p`{`j`y`w`j`j`y`{`y`j`yarae`y`j`{`q`yar`{`w`j`w`yae`w`{`j`y`j`{`j`w`y`wa`adad`j`ja``j`d`y`w`j`{`w`{ae`w`y`j`y`{`yae`y`w`j`{`w`y`q`{`y`j`wae`y`{`j`y`q`{`y`q`j`wae`yae`y`q`y`{`jar`y`{`j`w`j`y`{`j`yar`j`y`y`q`{`j`{`w`yae`y`yae`yar`j`y`w`{`j`yae`y`jae`y`y`{`j`yar`y`{`j`{`y`j`w`j`{adar`y`jar`y`jar`j`y`{`j`w`yar`j`{`y`r`y`wae`wae`y`{`j`wae`yar`y`j`w`y`j`j`yad`pada``jadad`gajadadad`jadadadad`}`}`}`}`}ad`y`qad`yadad`}`}`}`}`}`}`}`}`}adadadadadadadadadad`gad`}`}`}`}`}`}`}`}`}`}ad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ad`jad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`y`j`q`y`j`j`y`{`y`j`}`}`}`}`}`}`}`}`}`}`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`wad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}adadadadad`gadagadadad`ja`ad`jad`y`j`y`j`y`j`}`}`}`}`}`}`}`}`jad`y`jad`yad`q`y`y`j`j`y`y`j`y`j`y`j`y`j`j`y`j`y`ja``j`j`y`da``jadadad`jad`y`d`j`j`yadahad`y`d`j`j`y`a`a`a`a", +"atatatat`yae`w`{`y`{`yar`j`{`yar`j`{`y`{`wae`{`y`{`wae`{`y`yae`y`y`wae`y`w`{ae`y`w`j`{`j`y`yae`y`{`j`y`y`j`{ada``y`j`y`j`y`y`j`y`j`y`j`y`j`y`y`j`y`y`yae`y`y`jar`j`y`j`y`w`j`y`y`j`{`y`w`{`{`j`{`yae`y`yar`j`{`y`{`q`{`yae`w`yarae`y`j`{`y`{`y`{`{a``{`j`{`w`j`{`j`y`j`y`j`w`y`q`yae`y`j`y`{`j`w`yadad`p`y`j`y`jadad`gad`j`j`y`{`j`y`j`y`{`w`y`y`qa``p`y`qa``j`y`w`j`y`{`j`yar`{`q`y`{`j`y`yar`j`w`yae`y`yae`yar`j`y`y`j`w`{`q`y`yae`y`r`j`j`y`w`j`p`j`y`q`j`y`j`y`j`{`q`y`jar`j`wae`yar`y`j`{`{`j`{`w`y`y`{`q`y`j`y`y`yarae`y`y`{`q`y`yae`y`wae`y`j`w`{`y`jar`y`j`y`j`{`wae`{`yar`yae`yar`{ar`y`j`{`yar`j`{`y`{`w`y`{`w`j`w`y`r`{`y`jar`jar`y`r`y`y`q`{`y`wae`y`q`{`y`{`w`j`{`y`j`y`{`w`yae`y`y`j`y`w`y`j`{`y`w`j`{`y`j`y`j`w`j`y`p`y`jadad`p`jadad`gadad`uadad`pad`jad`}`}`}ad`jad`j`pad`q`j`}`}`}`}`}`}`}`}`}adad`uadajadadadajadadad`}`}`}`}`}`}`}`}`}`}adad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ad`padad`}`}`}`}`}`}`}`}`q`}`}`}`}`}`y`wae`y`y`q`y`q`j`y`j`y`}`}`}`}`}`}`}`}`}`j`q`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`j`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`yadadadad`k`gad`gadadadadad`j`y`y`j`s`j`q`y`y`q`y`j`yad`j`y`j`y`j`y`j`j`yad`jad`j`y`ja``j`y`j`y`y`j`ja``y`j`j`y`j`j`y`yad`j`y`jadadaoadad`ja``ja``d`j`y`j`y`j`yad`y`j`a`a`a`a", +"atatatat`j`{`{`yae`{`w`j`{`y`y`j`{`y`{`q`{`j`yae`wae`{`y`yae`w`y`wae`{`y`{`j`{`w`{`{`j`w`jar`y`yar`j`y`y`j`y`jad`j`y`j`{`y`q`y`y`j`w`y`j`y`y`j`y`ja``j`j`{`w`j`y`y`y`{`j`y`yae`y`j`w`jae`y`yae`w`{ar`yar`j`{`y`y`q`{`yae`w`yae`y`j`{`w`y`r`yae`wae`j`wae`w`j`{`y`j`w`y`q`y`yae`{`j`yar`j`w`yae`y`q`y`jadad`j`j`padad`qadadad`y`q`y`q`y`{`p`j`y`r`y`j`y`j`jada``jar`yae`w`y`q`{`j`y`{ae`w`y`q`j`y`yae`y`y`r`y`j`y`y`r`y`w`{ae`y`y`r`y`w`{`j`y`y`j`j`y`j`y`j`y`j`w`y`j`w`{`j`w`{`{`j`y`w`jae`yar`j`y`w`jae`wae`y`j`w`{`w`j`j`y`y`wae`y`y`r`y`w`j`{`yar`yae`yar`yae`y`q`{`y`q`{`y`q`{`q`{`w`yae`y`y`q`{`w`j`{`{`j`w`j`{`j`yae`y`j`{`y`{`w`j`{`y`j`y`{`w`{`jar`yae`y`w`y`jar`y`j`{`q`y`{`q`y`j`{`q`y`y`r`yae`y`j`w`{`j`{`w`yae`w`y`j`w`j`y`j`ja`adad`jad`padadadad`jadad`qadadadad`j`pad`jada`adadad`}`}`}`}`}`}`}adadadad`jadadadadadadadaj`}`}`}`}`}`}`}`}`}`}`pad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}adada``jadad`}`}`}`}`}`}`w`yae`y`yae`y`j`{`j`y`j`y`j`yad`y`q`j`y`}`}`}`}`}`}`}`j`j`y`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`y`j`y`q`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}adadadad`gadadadada``j`ja``y`j`j`y`j`y`j`y`j`y`j`y`y`j`y`j`y`j`y`y`ja``j`w`j`ya``j`jad`j`j`jad`jadad`jad`y`j`yad`y`j`j`jad`yadadad`yad`j`~ad`j`yad`y`jah`j`yad`jah`a`a`a`a", +"atatatatae`wae`y`j`y`{`yae`{`y`{`{`w`{`y`{`y`{`y`{`w`j`r`y`yae`y`{`w`{`y`w`{`j`{`yar`y`{`j`j`{`j`y`j`{`y`jad`yad`{`ja``w`j`{`j`y`j`y`j`yae`w`y`{`y`yar`j`y`yae`{`y`w`j`{`w`j`y`y`yae`w`y`j`w`{`y`yae`{`y`yae`y`{`yar`y`{`jar`y`{`q`y`{`yar`y`w`{`y`{`y`{`j`y`q`y`j`y`{ae`y`q`y`y`w`j`{`yae`wae`y`w`{`ja`ad`yadadadad`jad`p`jada`ae`w`y`yae`y`y`y`r`y`y`y`y`q`y`j`y`yar`j`y`y`q`j`y`yar`j`{`y`qar`yar`j`y`yar`j`{`y`{`j`yar`j`y`y`{`j`y`q`yar`j`y`y`q`y`j`y`w`j`{`j`y`yae`y`y`wae`y`yae`w`y`j`jar`y`{`y`y`y`q`{`y`j`{`y`w`j`{`y`j`wae`y`j`{`{`w`j`{`y`w`{`j`yar`y`{`y`r`y`y`w`{`{`j`{`yae`w`yar`{`y`q`{`y`q`{`y`{`q`{`y`y`w`{`y`qae`y`y`r`y`yarae`y`{ad`yae`w`yae`y`q`{`yar`yae`y`q`{`y`j`w`y`{`q`y`j`{`w`yae`yar`y`j`{`w`j`{`y`j`y`wad`wae`ja`adadadadadadadadadada``jad`p`ja`ad`y`pad`jadad`pa`ad`}`}`}`}`}`qadadad`padadadadadadada`ad`}`}`}`}`}`}`}`}`}adadajad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}adadadadadadadad`}`}`}`}`j`w`yae`yar`y`jar`yar`j`w`y`j`j`y`j`y`j`y`y`}`}`}`}`}`y`w`j`yad`yad`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`w`j`yad`y`j`w`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}agadad`j`j`y`j`y`j`q`y`y`y`j`y`j`y`w`j`y`j`w`j`y`j`y`q`y`j`j`y`q`y`jad`j`yad`y`yadad`yad`j`yadad`jadadad`j`~a`ad`dadad`j`~ad`jad`yadahad`j`y`jad`yad`d`yad`j`a`a`a`a", +"atatatat`j`{`y`yae`w`yae`w`yar`j`{`j`{`j`{`j`{`q`{`j`y`y`{`j`{ar`j`{`{`j`y`j`{`y`yae`y`j`y`j`y`w`j`{`yad`jadad`y`j`y`w`j`{`j`y`w`j`y`y`q`y`y`y`j`yae`y`{`q`y`{`j`w`j`{`y`j`{`jar`jar`y`j`y`j`j`q`yae`y`wae`w`{`y`r`y`j`y`q`{`jar`j`{`y`j`{`q`yae`j`y`q`j`w`j`yar`j`w`j`{`y`y`{`q`{`y`{`j`w`y`j`y`y`j`y`qadadad`gadadadadadad`yad`j`{`jar`j`y`w`j`j`y`w`{`q`y`{`y`j`q`yae`q`y`j`{`y`wae`y`w`y`j`{`y`yae`y`w`{`j`y`wae`yar`j`y`y`q`{`j`w`y`j`{`y`j`w`y`ja``qad`j`y`q`yae`q`y`w`j`{`y`{`q`y`y`yar`y`j`wae`y`q`y`j`y`y`r`j`y`j`y`r`y`j`{`w`y`y`j`y`{`{`q`j`yae`w`j`{`j`q`y`yar`j`{`q`y`w`yar`y`j`{`j`w`{`y`q`{`y`j`{`y`j`y`j`{`jar`j`y`y`r`yae`y`j`{`wae`yar`j`{`yae`w`{`y`{`j`y`q`{`w`j`{ar`yaear`j`yar`y`yae`y`{`yaear`j`y`jar`y`{`q`{`y`j`ja``q`jad`padadad`gajadadadadadadad`j`jadadadad`jadad`jadad`j`wadadadadadadad`y`padadadad`jadad`}`}`}`}`}`}`}`}`}`gadadadad`}`}`}`}`}`}`}`}`}`}`}`}`}`}adadadadadadadadadad`y`{`q`j`yae`w`j`y`jar`j`y`w`j`{`y`j`w`j`y`q`y`j`y`}`}`}`}`y`jad`y`j`w`j`q`yad`j`}`}`}`}`}`}`}`}`}`}`}`}`}ad`y`jad`y`j`j`j`yad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ad`jad`j`j`y`j`y`y`j`q`y`j`w`y`j`y`q`y`j`y`yad`y`j`ja``y`j`y`jad`y`j`y`j`j`yad`j`j`yadad`yad`jadadadad`jadadadadadadada``dadad`~adad`y`~ad`da``j`j`yad`d`a`a`a`a", +"atatatat`yae`wae`yae`yae`y`j`y`w`j`{`y`w`{`j`yae`y`{`y`r`y`y`j`y`y`q`{ar`j`w`{`q`y`y`{`y`y`{`y`j`y`j`yadad`y`w`j`yae`y`y`y`{`j`y`{`{`y`j`{`j`w`{`y`j`y`{`y`j`y`{`{`w`j`{`w`y`{`{`y`j`{`w`{`y`y`{`w`j`{`y`{`jar`y`{`{`w`y`{`y`yadar`y`{`{`j`{`w`yae`y`y`yae`yad`{`y`q`y`j`w`{`j`y`j`w`j`{`y`j`{`w`j`y`j`yad`jad`gaj`gadadadad`y`p`y`j`y`y`j`{`yar`j`{`j`yae`w`j`w`j`y`yad`yar`y`jae`w`j`{`y`{`wae`yar`j`{`j`{ar`j`y`q`{`y`{`q`y`y`wae`y`w`j`w`y`{`j`y`w`j`y`y`p`yae`ya``{ae`y`wae`y`yar`jar`y`j`{`y`j`wae`yarae`w`y`{`q`y`{`y`yar`yae`y`r`y`wae`y`y`jar`y`{`j`yar`y`{ae`{`y`q`{`yae`yae`y`r`y`yae`yar`j`y`w`{`q`yar`{`w`j`y`{`y`wae`{`yar`{ar`y`j`{`y`{`wae`y`w`j`{`q`y`q`{`y`y`yae`w`yae`y`y`yarae`y`q`y`w`{`q`y`{`y`{`w`j`y`r`y`yae`w`yar`y`jad`jadadadad`sadadadadadadada`ad`ja`ad`j`sad`j`wadad`qad`yad`jadadad`jadadad`ja`adadadadad`}`}`}`}`}`}`}`}`}adadadad`gajadad`}`}`}`}`}`}`}`}ad`jadad`jadadadadadadadadad`y`{`y`y`yae`w`{`y`j`y`{`j`y`j`w`y`{`s`j`y`j`w`j`y`{`jad`y`j`y`j`j`y`y`j`y`w`j`j`w`j`y`j`y`w`j`qa``j`j`qa``j`qa``jad`y`j`j`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`ja`ad`y`y`j`w`j`j`y`y`j`y`j`y`j`y`j`y`j`y`j`y`j`{`yae`y`j`y`j`y`j`wad`ja``ja``ja``jad`j`yad`ja``ja``jad`~adadaoadadadad`g`~adadag`~adad`j`y`dad`jadahad`a`a`a`a", +"atatatat`{`j`y`j`{`y`jar`y`{`{`j`{`w`{`j`{`jar`y`y`r`y`j`{`y`j`{`y`j`{`j`y`{`yae`y`yae`y`j`y`j`j`j`yadad`j`y`j`y`j`y`y`j`y`j`j`w`{`j`y`wae`y`y`{`j`y`{`wae`{`w`{`w`j`y`yae`y`r`y`{`q`y`j`y`j`{`q`y`j`y`j`y`q`{`yae`w`j`{`q`{`{ar`j`{`q`y`q`y`j`y`jar`y`q`yad`y`q`j`yad`r`y`j`y`q`{`yae`w`y`q`y`j`w`y`j`wad`padad`gadad`gadadag`gadad`j`y`jar`j`yae`y`w`jar`y`yae`y`y`j`w`j`y`jae`w`y`{`y`j`w`jae`y`w`j`y`j`w`j`y`y`{`y`jar`j`{`yae`{`q`{`yae`y`j`y`r`y`yar`j`y`j`j`w`yae`w`yae`j`y`wae`{`y`yae`y`q`yae`y`y`j`y`{`yae`j`y`w`j`r`yae`y`q`y`yae`y`y`jar`{`y`q`y`w`yae`y`q`y`jar`y`j`{`w`{`q`{`y`{`r`y`j`{`w`{ae`y`{`j`yae`j`yae`wae`y`j`w`j`y`j`y`{`j`w`jar`j`y`j`{`q`y`y`j`{`j`{`j`q`yaear`y`jarae`y`q`{`y`{`j`j`y`q`y`j`wae`y`{`y`jar`j`y`j`j`yad`y`jadad`jadajadadadadad`jadadadadadadadadadadadad`jadadadadadad`qadadad`jadad`jadadadajad`}`}`}`}`}`}`}adad`p`jadad`gadadadad`jadadad`ja`ad`jad`gadada`adadadadadadad`j`{`j`w`j`{`j`y`jaear`y`j`q`y`y`j`j`j`yar`j`y`j`y`ja``q`j`y`q`y`pa``j`j`w`j`ya``j`y`j`j`y`j`j`y`j`y`q`y`yad`j`ja``j`j`ja``jad`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`q`y`j`j`y`j`y`j`y`j`{`j`yae`y`j`y`y`j`w`j`y`j`y`j`y`j`y`j`y`j`y`j`y`j`j`yad`jad`y`jadadad`dadad`~adadad`~adadagad`hag`k`g`i`g`i`gad`~adadad`~a`ad`j`a`a`a`a", +"atatatat`j`y`{`j`y`j`y`j`{`j`w`{`yae`y`j`{`y`j`{`y`y`{`y`j`{`w`j`{`y`j`y`yae`y`y`j`j`y`w`j`y`{a``jad`y`j`y`j`y`y`y`{`q`{`y`{`y`j`y`{ae`yar`{`j`yar`j`y`j`{`yae`yae`w`{`{`y`{`yar`j`{`w`{`w`{`j`y`y`q`y`y`j`{`w`{`y`{`y`j`{`yae`y`{`y`w`j`{`w`{`j`y`y`{`j`q`yad`y`j`y`y`{`j`w`yae`y`y`q`{`y`{`j`{`j`w`{`yadadajadadag`j`gajadad`gagadad`gad`ja`ae`w`j`y`yae`w`y`j`{`w`j`j`ya``q`yae`w`jar`y`j`{`w`j`y`q`{`y`{`j`w`yaear`y`y`{`j`w`yae`y`w`jar`y`q`{`j`y`{`j`y`yar`jad`{`q`y`{`w`j`{`y`wae`y`wae`y`y`w`{`q`y`wae`w`y`yar`j`y`{`y`w`y`{`{`w`jar`yae`yae`w`{`j`{`{`jar`y`{ar`y`{`w`j`{`y`y`r`y`q`yae`w`{`j`{`w`{`j`y`w`y`y`j`w`{`j`yar`y`{`w`{`r`y`w`{`y`y`{`w`y`y`q`{`j`w`{`w`j`y`{`y`y`y`r`y`y`y`j`y`{`q`y`jar`y`j`{ar`j`y`{`wae`y`{`yar`j`y`w`j`w`{`qadadadadadadadadadad`gadad`jad`p`jad`jadadad`yad`jad`s`jadadadad`qadad`qadadadadadad`gad`}`}`}`}`}`q`jad`jad`jadadad`gadagadadadad`j`qa`ad`j`y`pad`jadad`jad`gaja`ad`yae`y`y`q`y`{`w`j`y`{`y`y`r`y`y`w`y`j`y`j`y`w`j`y`j`y`q`y`j`y`j`w`y`j`j`yadae`y`s`j`j`y`wad`j`s`j`j`j`s`j`y`j`y`pad`yad`ya``ja``}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`j`w`j`y`j`w`j`y`j`q`y`y`j`w`j`yae`y`y`y`j`y`j`y`y`j`y`y`jad`y`y`j`yad`j`ja``jadadadadadadadadad`~`gadaj`g`k`g`iagasag`i`gag`g`gad`k`hadadad`~adad`a`a`a`a", +"atatatat`j`{`j`yae`y`j`y`j`{`y`j`{`j`y`{`q`y`j`w`{`j`{`j`q`y`j`yae`y`j`{`w`j`y`q`y`yae`y`j`yad`j`ja``j`j`y`{`j`{`j`j`y`y`j`{`j`y`y`r`y`w`y`j`y`w`{`y`j`{`yae`yar`y`y`w`{`q`y`r`{`y`{`yae`y`j`yar`j`yar`j`j`y`{`j`q`yae`y`w`{`jar`y`wae`y`{`y`j`yar`j`j`y`j`w`j`w`j`w`j`w`j`y`q`y`j`yae`y`j`w`j`{`w`j`y`j`qadad`g`padad`gad`gadadaj`gadagadadadadadad`j`q`j`j`y`q`y`j`y`j`y`q`{`j`y`y`j`y`j`yae`y`y`w`{`yae`y`q`{`y`r`y`{`yae`w`y`{`y`{`q`{`j`y`j`y`ja``r`j`y`w`j`j`jad`y`j`y`q`{`y`q`yae`y`q`{`y`q`{`j`y`j`{`j`{`y`q`{`j`y`{`q`yae`{`q`{`y`j`{`y`q`{`w`yae`y`q`y`{`w`j`{`jar`j`{`j`y`r`{`j`y`{`w`y`yae`w`{`y`j`yae`y`r`y`y`jar`y`{`j`y`q`{`yar`j`{`jae`wae`jar`{ae`w`y`{`j`y`w`j`q`y`r`y`j`w`{`jar`y`yae`w`{`j`{`w`{`{`j`y`r`y`y`r`y`j`yar`j`{`y`jad`y`j`padadadad`padad`padadadad`jadadadad`j`pad`g`j`padadadadadadadadadadadadadadadadadadagadadadad`j`y`ja``j`w`y`j`padagadadadadad`jadadad`jadadadadadadadadadadad`y`q`y`j`wae`yar`j`y`{`j`y`r`y`y`j`{`j`y`j`y`w`j`j`j`y`q`j`yad`j`j`y`j`j`p`y`q`j`w`j`ja``jad`j`j`yad`j`y`j`y`jad`y`j`y`j`w`j`j`y`jad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`y`j`y`y`j`y`j`w`y`j`y`y`q`y`j`w`j`y`y`j`j`y`j`y`j`y`j`y`q`y`q`j`yad`j`ja`adadadadadag`~`gag`~ad`gad`k`gag`hag`n`h`n`i`g`gad`had`~adadadadadadadad`a`a`a`a", +"atatatatadad`j`y`y`j`y`y`y`j`y`y`q`yae`y`y`{`j`y`j`w`{`y`{`j`y`j`y`q`y`{`j`y`{ae`y`y`y`j`y`j`y`ja``ja``j`y`y`j`y`w`{`j`{`y`y`j`y`yae`y`{`{`j`{`j`w`{`y`w`{`yae`yae`y`{`y`{`w`{`j`y`r`y`{`jar`yae`{`{`yar`y`q`y`j`y`w`{`j`{ar`y`j`y`{`j`w`j`{`j`y`yar`j`y`y`j`y`y`j`j`y`j`{`y`yar`j`w`y`{`y`j`w`{`j`{`y`ja`ad`jadadadadad`gadad`s`jad`gadadajad`gadadadad`jadad`j`j`padad`jadad`j`y`w`jar`y`q`y`q`{`j`yar`y`j`y`y`w`{`jar`y`y`j`w`j`y`w`y`jar`y`q`{`y`{`j`w`j`y`w`y`jad`q`{`y`y`q`y`y`r`y`y`yae`{`y`jar`y`w`j`yar`y`jar`y`wae`y`y`q`yae`yar`j`{`y`{`{`j`w`y`j`yar`j`{`y`wae`y`yar`y`y`yae`w`y`jae`y`w`{`j`w`{`y`y`y`j`{`y`{`y`j`w`yae`y`{`q`{`y`w`j`y`y`y`q`y`y`{`j`y`r`y`j`y`w`j`y`j`yae`y`y`q`yae`w`{`j`y`{`w`{`j`yar`y`w`{`j`w`{`jar`y`y`j`w`{`y`j`w`y`jadadadadadad`jadadadadadad`yadadadad`jad`padad`jad`qad`j`yad`jadad`wadadad`gaj`gadadadadadadad`jad`wad`jadad`yad`padadadad`gadadadadadadad`jadadadadadadadadad`j`y`j`y`j`y`y`q`{`w`j`y`jar`j`y`j`w`j`y`j`y`j`w`j`y`j`y`y`w`j`ja`ad`j`yadad`y`j`s`j`j`ya``j`yad`y`q`y`j`p`y`y`j`ja``jad`y`jad`jadad`g`gag`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`y`j`w`y`j`y`j`y`j`w`y`{`j`y`y`j`{`j`y`y`j`y`y`j`j`y`j`j`y`y`j`j`y`yad`j`jadad`~`gadag`gad`gaj`gag`g`g`hag`gagasag`h`gadadad`jadadada``j`~ad`y`~ad`a`a`a`a", +"atatatata`ad`~ad`j`y`j`yae`yae`y`j`{`j`yae`y`q`y`{`{`y`j`y`j`w`y`j`yae`y`j`{`j`y`j`y`j`{ad`j`y`j`y`j`y`j`y`y`j`{`yae`y`y`{`j`{`y`q`y`y`y`r`y`j`{`{`y`j`{`{`j`w`{`y`r`y`q`{`j`y`yae`y`yaear`y`y`{`y`wae`y`q`{`y`j`y`j`jae`w`yae`y`q`{`j`{`y`{`w`y`j`j`w`y`r`y`j`w`j`yad`w`j`y`{`jar`j`y`j`q`y`{`j`w`y`j`w`jadadadadadajadadar`j`y`j`y`qadad`gadadadadad`gadad`gadad`j`gadadadadad`j`j`j`{`y`q`y`j`y`q`y`j`y`j`wae`wae`y`j`y`jar`j`{`j`{`j`wae`y`y`j`{`q`y`y`j`y`y`j`qa``j`y`y`q`yae`y`yae`y`r`yar`j`wae`yae`y`j`{ar`j`y`yae`y`jar`{`y`{`w`j`yar`y`q`y`j`wae`{`wae`y`{`w`{`j`yar`j`{`q`y`r`y`yae`y`yar`j`y`{`jar`j`q`{ae`j`y`r`y`{`j`{`j`w`y`{`j`{`y`r`yar`j`{`j`wae`w`yae`{ar`j`y`j`y`y`q`y`q`y`r`y`y`j`y`j`w`{`j`y`wae`yae`y`q`{`j`{`j`y`{`q`y`j`{`q`j`y`j`j`uadadajadad`jadadadadadad`jadad`p`jadadad`jadadadadad`p`jadadadadadadadajadadadad`gagadadad`j`w`jad`j`y`j`s`j`jadadadadadadadadadad`jadadadadadad`jadadad`g`j`y`j`w`j`y`q`y`j`yae`y`r`{`y`w`yae`y`j`{`j`w`y`j`ja``j`j`j`jadadadadadadadad`j`y`jadadad`jad`q`j`yad`j`yad`jad`j`j`yad`jad`yadadadadajadag`}`}`}`}`}`}`}`}ag`gaj`gag`gagadada``j`}`}`}`}`}`}`}`}`}`}`y`j`j`{`j`w`j`y`y`w`j`j`y`j`y`{`j`y`j`y`j`y`w`j`d`y`y`j`y`j`y`j`yad`y`j`jadadadadagadagad`g`kad`gad`iadagad`haj`gadadadad`~`jad`y`j`y`j`d`j`yadad`d`a`a`a`a", +"atatatat`j`yadad`j`jad`j`y`j`y`y`r`y`y`yar`j`yae`w`j`yae`{ae`yae`y`y`w`j`y`y`j`j`y`y`j`y`y`j`y`j`y`y`j`y`j`y`j`y`y`yae`y`y`j`{`y`yae`j`y`yar`y`w`j`{`w`{`y`{`j`y`{`y`{`yar`{`q`y`y`w`j`{`j`q`yae`w`y`{`y`{`w`jar`yadad`j`y`j`y`{`y`q`{`w`j`yae`w`y`{`ja``y`{`j`w`y`j`{`j`y`j`y`y`y`j`w`y`j`w`yae`w`j`y`j`j`padad`pad`gadad`y`j`{`w`j`yad`padad`gadadadadadadadad`gadad`gadadadadadadad`wae`y`y`{`q`y`y`r`y`y`j`y`j`w`{`w`{`y`y`q`y`wae`y`yar`j`y`y`j`{`q`{`j`w`j`y`y`pad`j`y`y`r`y`j`w`{`y`y`j`{`y`j`w`{`q`y`q`y`y`{`r`y`wae`y`{`wae`y`{`yae`y`yaear`y`y`w`j`y`wae`y`j`yar`y`yae`y`{`y`{`jar`y`r`y`y`r`y`{`yae`y`y`{`w`y`{`y`r`yar`}`}`}`}`j`yar`j`{`y`y`r`y`{`y`{`j`w`yae`y`q`y`q`y`{`j`j`y`j`j`y`w`j`y`y`j`jar`j`y`q`{`y`{`j`w`y`q`yae`y`j`{`w`j`y`w`j`y`j`y`padadadadadad`jadadadadadadada`ad`padadadadad`jadadad`y`padad`jadadadadadadadadadadajadad`y`j`y`qad`y`j`j`w`jadadadad`p`jadadadadadad`jadadad`yadad`jad`jad`j`y`j`w`y`j`y`{`w`j`y`y`j`{ae`w`y`j`w`y`j`y`j`y`q`y`ja`a`adadadadadadagadagadadadad`yadad`yad`jad`ja``jada``ja``jad`y`j`y`ja`adad`g`k`g`gaj`gad`hagadag`gad`i`gad`gadadad`j`y`wad`y`}`}`}`}`}`}`}`}`}`y`j`y`y`jar`j`{`j`y`q`yae`w`y`j`y`w`j`y`j`y`y`j`j`y`y`jad`y`jad`yad`jadadadad`~adadad`~ad`gaj`h`gad`gadadadadadad`ja`ad`j`yad`j`~ad`yad`y`jahad`j`a`a`a`a", +"atatatat`y`j`j`ja``~ada`ad`j`y`j`y`j`j`w`j`j`y`j`{`j`y`j`w`j`y`y`j`y`j`y`j`w`j`y`j`yad`j`ja``{`j`y`j`y`j`y`y`{`j`y`j`{`y`j`{`y`q`{`j`y`{`{`j`{`y`{`{`j`y`q`{`y`w`{`jar`yae`j`y`y`r`yar`j`y`y`{`w`{`j`y`j`j`{`y`{`j`y`w`y`wadad`y`q`{`j`y`yar`j`y`{ae`y`wae`q`y`y`{`q`y`w`j`j`p`{`jar`y`{`j`{`j`y`j`y`y`y`padad`jada`adajad`y`q`y`j`{`j`yadadagadad`gaj`gadad`gadadagadadadadad`gadadad`j`jad`{`w`j`{`yae`y`q`y`{`w`{`j`y`j`yae`y`yae`{`w`y`j`{`y`jar`j`yae`w`y`j`{`j`y`jad`j`q`y`{`y`y`j`w`j`y`w`j`q`y`j`y`j`{`y`{`q`y`{`y`{`w`{`j`{`w`yae`yar`y`r`y`y`{ae`y`{`{`j`y`q`yae`wae`yar`j`w`j`yar`j`{`y`y`{`y`r`y`q`{`j`yae`{`y`r`{`j`}`}`}`}`}`}`y`q`yae`y`q`y`{`jar`jar`y`y`q`y`y`j`y`y`jad`p`y`w`y`j`y`j`{`j`wae`y`y`yae`y`yar`j`y`y`{`q`y`y`r`y`y`y`jar`yae`y`jadad`gadadad`jadad`jad`padadadadajada`ad`jad`pad`j`sadadad`j`padad`jadadadadad`jadad`gadadad`yad`j`w`j`y`q`yadadadadadadad`jad`jad`qadadadadadad`gadadadadadad`q`y`j`j`y`j`w`j`y`q`yar`j`y`j`y`q`y`j`j`j`j`y`j`ja``j`jadadadagagagag`g`iad`gadadad`jadadadadadadadad`jad`yad`ja``jad`jadad`jad`gagadag`g`iad`gaj`gadad`gadadadadad`j`j`w`y`j`y`j`y`y`}`}`}`}`}`}`}`q`j`y`q`{`j`y`y`y`j`y`{`j`y`j`yae`y`y`j`j`y`j`j`yad`jad`y`y`j`y`jadadadadadadadadadagad`gadadadadadajadad`~`ja``j`y`j`j`y`j`y`j`y`yad`y`j`yad`j`y`a`a`a`a", +"atatatat`y`y`j`y`j`jad`jad`j`jad`y`{ad`jar`j`y`j`j`w`y`j`y`j`yae`y`j`y`{`j`y`y`j`y`y`y`j`y`y`j`y`j`y`j`j`{`y`j`{`j`y`j`y`y`j`{`y`w`j`{`w`{`j`y`jar`j`{`yae`{`j`{`q`{`j`{`w`{`jar`y`{`}`}`}`}`}`}`}`y`r`y`y`q`{`jar`yae`j`y`j`q`ja``yae`{`j`y`r`y`y`q`y`y`yae`q`y`j`y`j`y`w`j`y`jaead`w`j`y`w`j`w`j`w`j`{a`adad`j`p`jadad`gadaea``w`j`y`q`yad`qadadadagadadad`q`g`j`p`g`padaj`gadadag`gadadad`j`y`j`w`j`y`j`yar`j`{`w`y`r`y`y`jar`y`q`yae`yar`j`y`j`w`y`j`wae`y`w`j`jad`wad`y`j`q`y`j`y`yae`y`j`y`{`y`w`j`w`y`q`y`j`{`q`j`yar`j`{`y`r`y`{`q`yae`y`{`q`{`w`j`{`q`y`y`y`{`q`y`{`yae`{`y`q`{`y`y`q`{`q`{`j`{`y`{`yar`y`q`{`y`j`yar`}`}`}`}`}`}`}`y`yar`y`j`{`q`y`y`yae`y`r`yae`yar`j`q`y`y`r`{`j`j`q`y`q`y`q`y`y`r`y`j`{`q`{`j`y`r`y`y`j`{`w`yae`w`{`{ae`y`q`y`q`y`j`j`pad`gajadadadad`ja`adadadadadadadadadadadadadad`jad`yadad`ja`adadadadadadadadadadad`p`j`q`ya``j`j`y`j`w`j`y`jadadad`padada``jad`ja``jadadadadad`gadadadad`y`q`y`y`j`y`j`y`j`{`j`y`q`y`y`j`y`j`w`ja``j`p`yad`qadadagad`n`hagas`iag`gacag`gadadad`jadadadadad`jadadad`jad`jadadadad`jadadadag`gag`hag`gaj`gadadadadadad`y`w`j`y`y`j`j`w`j`y`j`j`y`}`}`}`}`}`}`}`}`{`y`j`yar`j`j`y`q`y`y`wae`y`j`y`j`y`j`y`j`y`j`j`yad`j`ja``jad`y`yad`ja`adad`ja``j`~adadad`~ad`~ad`hadadad`jad`jad`y`j`yad`y`j`j`y`j`j`j`y`ja``j`a`a`a`a", +"atatatat`j`y`j`y`y`y`j`ya``jadad`j`j`j`y`y`j`yad`j`j`y`p`j`jad`y`j`j`y`q`y`j`y`j`y`j`y`j`y`j`y`j`yad`j`y`y`y`y`j`y`j`y`{`q`y`{`j`{`y`{`y`{`y`{`y`y`{`y`{`w`j`{`w`{`y`y`{`yae`w`}`}`}`}`}`}`}`}`}`}`}`y`{`w`j`{`{`y`j`w`{`w`y`{a``j`p`j`p`y`{`j`w`{`j`{`j`w`j`y`y`{`j`y`yae`y`p`yad`y`j`yae`y`q`y`j`y`{`q`jad`gadada``jad`gadad`jad`j`{`j`w`yadadadadad`gadadadadadadadadadadadadajad`g`gajadad`y`q`y`j`{`w`y`j`y`q`yae`{`q`y`{`w`j`y`{`j`w`j`{`w`{`w`j`y`j`y`q`y`y`q`yadadadad`j`y`j`y`q`j`w`j`y`q`y`jar`j`y`yae`y`w`{`y`r`y`{`y`q`y`{`j`y`{`{`y`q`y`{`y`jar`y`yaear`j`w`{`{`q`y`wae`yar`yaear`yae`w`y`jar`y`q`{`j`y`{`q`y`r`y`}`}`}`}`}`}`}`}`q`yae`w`j`y`j`w`j`y`q`y`yae`y`y`j`y`{`j`y`j`w`y`yad`y`j`j`y`j`y`j`w`j`{`y`w`j`{`y`jar`j`yar`y`{`j`w`j`w`y`{`j`y`y`qadadadad`gadad`jad`p`jad`p`jadadadad`jadadadadad`jadadadadadad`jadadadadajadadadadad`gadad`j`j`y`j`w`y`j`y`j`w`jad`g`jad`jadad`jad`jadadadadadaj`gadag`gad`{`j`y`jar`j`y`y`q`y`y`j`y`j`y`j`w`j`y`y`j`q`y`jad`jadaj`g`i`gagag`gag`g`gag`gaj`gajadada``ja``q`yadadad`jadada``jadada`adadadad`gad`i`gagada`adad`p`jad`q`j`y`j`j`y`j`q`y`y`j`j`w`y`j`}`}`}`}`}`}`}`}`y`r`y`y`j`j`y`j`y`{`yae`y`q`y`j`y`y`j`j`yad`yad`yad`y`ja``j`ja``j`j`ja``j`ja``jadadadadadadadadadada``jad`ja``y`jah`y`j`y`y`j`y`j`y`j`yad`y`j`~`a`a`a`a", +"atatatat`yae`yae`y`j`j`j`y`j`yadad`jad`q`jad`jadad`ja``jad`y`jad`y`j`y`j`y`y`j`y`q`y`j`j`yad`y`j`y`j`y`j`y`j`{`y`j`y`j`y`yae`yar`j`{`j`{`q`yae`y`wae`y`y`{`wae`yaear`y`r`y`{`}`}`}`}`}`}`}`}`}`}`}`}`}ae`{`y`w`j`y`y`r`j`{`wae`y`y`y`jad`q`j`y`y`wae`y`yae`w`{`q`y`j`q`y`j`j`y`w`j`qa``j`q`y`y`j`{`wad`{`j`wadadadad`j`jad`gadadadad`j`yad`j`yadadagadadadajad`gadaj`g`gagadada`adadagad`gadad`j`y`q`yae`y`y`j`y`y`j`w`j`y`q`{`{`y`jar`y`j`y`j`j`y`{`w`y`j`y`jar`y`j`w`jad`j`pa``q`j`y`y`j`j`w`j`j`y`y`jar`yae`wae`y`j`{`y`r`yae`{`y`y`r`yar`j`{ar`j`y`{`w`j`y`q`y`{`j`y`q`y`{`yae`w`yae`w`y`j`y`{`y`r`y`{`{`wae`yae`y`{`w`yae`}`}`}`}`}`}`}`}`y`q`{`{`y`r`y`y`yae`y`q`{`wae`y`j`w`j`yar`j`j`y`j`qa``j`w`j`y`j`y`yar`j`j`yar`j`{`yae`wae`y`jar`y`j`{`j`y`q`{`j`y`j`wadadadad`gadadadad`jadadad`ja``padad`jadad`jad`padadad`wad`jadadadadadadadad`pad`jad`gad`j`w`j`j`y`q`y`j`y`j`jadadadadad`yad`ja`adadadadadadadadadadadad`j`j`y`y`j`w`j`{`j`j`w`y`j`w`j`y`j`w`j`ja``jadadada`adaj`gag`g`h`gadadadadadad`gadadadadad`pad`y`j`ja`ad`jad`yad`jadad`yad`qadadadad`}`}`}`}`}`y`ja``y`j`y`p`y`j`w`j`y`j`y`j`y`j`y`j`y`j`}`}`}`}`}`}`}`j`y`j`y`y`wae`y`q`y`j`y`{`j`y`j`y`j`ja``j`j`j`yad`jad`yad`j`j`yad`jad`j`yad`ja``j`j`yadadad`dad`j`jad`jao`j`j`j`y`j`jad`y`jah`j`y`y`j`j`y`j`y`y`a`a`a`a", +"atatatat`{`yae`y`j`y`y`y`j`y`j`wad`y`ja``j`y`j`y`yad`jad`y`jad`y`j`q`y`q`yae`w`j`{`y`j`y`y`j`yae`y`y`j`y`j`y`j`{`y`yae`y`y`yae`y`y`yar`j`{`y`{`wae`yar`j`yae`y`yar`j`y`yae`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`q`y`{ae`w`{`y`j`y`{`jar`y`j`w`ya``j`j`j`y`{`j`w`{`q`{`y`j`y`w`y`j`w`y`j`y`j`s`j`yadar`j`y`w`j`ja``{`pad`g`gadadadadad`~`gadadadad`jad`gadad`gag`gadag`gag`gag`hag`iadagagad`gagadadad`j`q`y`y`j`j`yar`j`w`{`y`{`y`yae`y`q`y`{`y`q`y`y`w`jae`y`{`q`y`j`j`y`jadad`ja`ad`jad`y`q`y`j`y`y`j`w`j`y`{`j`w`y`y`y`{`y`q`y`{`w`y`r`yae`w`{`{`w`y`jar`{`j`{ar`y`{`{`jar`y`{`y`j`w`{`j`y`{`j`yar`y`r`y`{`j`w`j`{`w`y`wae`yae`w`}`}`}`}`}`}`}`}`j`y`j`y`q`{`{`y`r`yar`j`y`y`j`y`q`{`y`w`j`j`y`y`j`y`j`w`j`y`q`yae`w`j`j`w`y`j`{`y`j`wae`y`y`{`j`{`y`j`{`w`{`y`j`w`y`j`y`jadadadajadadadadadad`jadadad`j`qa`adadadadad`j`j`p`jad`y`u`jadadad`padadad`jadadadadadad`y`j`y`j`y`q`y`yad`qadadada`adadad`w`jadad`y`jad`}`}`}adad`ja``q`y`w`jae`y`y`j`w`y`y`q`yad`j`w`y`j`y`jad`y`jadadajad`g`gadadad`q`jada`adadadadagadadad`jadad`yad`q`yad`y`ja``jad`y`jad`ja`ad`}`}`}`}`}`}`}`}ad`y`j`w`j`y`y`q`y`j`y`y`j`w`j`y`y`q`y`y`}`}`}`}`}`}`}`{`w`j`w`j`{`j`w`j`y`j`w`j`y`j`y`j`ja``j`y`d`yad`j`y`j`yad`jad`y`ja``ja``j`ja``j`ja``j`jad`ja``ja`ad`yadad`yad`y`y`j`y`y`j`y`j`y`y`jadah`jah`j`y`a`a`a`a", +"atatatat`j`y`{`y`q`yae`y`y`j`{`j`y`q`ja``j`q`y`j`j`y`jad`j`y`y`j`j`y`j`y`j`y`y`j`y`j`y`j`{`y`y`j`y`j`yae`w`y`j`j`{`y`j`{`j`y`{`j`yae`y`y`yae`y`{`y`j`{`yar`y`{`y`j`{ar`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`yae`w`yae`y`r`y`y`r`y`j`{`yaead`y`q`y`y`q`j`y`j`{`y`q`yae`yad`w`j`y`j`q`y`j`y`j`j`y`j`{`y`{`q`{`j`y`jadadadadad`gadaj`gadagad`gadad`yadadadadad`p`g`g`iag`i`g`n`g`nacag`gagag`gagadadad`y`j`w`y`j`y`q`{`y`jae`w`j`{`q`{`y`r`y`y`{`j`j`y`w`j`y`j`y`j`y`q`y`q`y`pad`jad`yaiadad`j`y`j`wae`y`wae`y`yaear`j`w`{`y`{`q`{`j`{`y`w`j`y`{`j`{`y`{`j`w`{`j`{`q`y`j`y`jarae`w`y`j`{`w`j`y`{`q`{`j`y`q`y`{`yar`j`{`j`yar`j`yae`}`}`}`}`}`}`}`}`w`j`wae`y`q`{`j`y`j`{`q`{`jar`y`{`j`j`y`q`y`q`y`w`j`y`j`j`yad`q`y`y`j`j`y`q`y`q`y`y`{`q`{`w`j`yar`j`{`j`y`j`{`y`jar`y`j`y`qadad`gadadadad`j`pa``qadadadadadad`padada`ad`yadad`qadadadadadadadadad`jadadadadadadadad`j`y`y`j`j`y`j`ja``qadad`jadadadadadad`jadad`}`}`}`}`}`j`y`j`y`j`y`j`w`j`y`j`y`q`j`y`y`jadadadad`jadad`qadad`yadadadadadadad`y`j`j`q`yadadadadadad`jad`ja``jad`jad`j`qa``jad`jad`y`j`y`j`}`}`}`}`}`}`}`}`}`}`y`j`j`y`j`j`y`j`w`j`ja``j`w`j`y`y`r`y`}`}`}`}`}`}`}`j`y`j`y`j`y`j`y`j`y`j`y`jad`y`j`y`j`ja``jad`j`y`jadad`{`yad`y`j`y`j`y`j`y`j`j`y`j`ja``jadad`yad`j`yad`j`j`y`jad`y`y`j`j`y`y`j`j`y`j`y`j`y`j`j`y`a`a`a`a", +"atatatat`{`y`q`{`j`{`y`{`q`y`{`y`j`{`y`y`q`y`j`yad`w`j`yad`j`j`yad`yad`j`y`j`y`j`y`j`y`j`y`j`w`yaear`y`j`y`y`j`y`y`{`j`y`y`{`j`wae`y`y`y`r`y`{`y`w`{`{`w`{`j`{`q`{`w`{`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`wae`{`yar`y`y`jar`y`{`yae`w`y`r`y`y`j`j`yad`y`j`q`yad`{`w`y`j`y`j`y`y`ja``jadada``j`w`j`y`y`j`w`j`y`y`wadadadadadadadad`gad`hadadad`j`y`j`wa``jadad`pad`g`g`g`gag`n`hagacas`iadadadad`j`w`yae`y`w`y`j`y`j`w`y`y`w`y`y`j`y`j`{`wae`yar`y`j`{`s`j`y`ja``j`yad`y`j`pad`jada`ad`y`q`y`j`y`q`y`y`j`q`y`y`q`y`{`{`q`{`y`{`y`wae`{`y`{`w`j`w`jar`j`y`{`j`{`yar`j`w`y`j`yae`w`{`j`y`{`q`{`y`w`{`y`{`r`{`j`{`j`wae`y`{`j`w`y`}`}`}`}`}`}`}`y`y`j`yar`y`y`y`{`q`y`{`yar`y`y`j`y`jar`y`y`j`y`j`y`j`y`q`y`j`y`j`j`q`y`r`y`j`{`y`q`{`w`{`j`yar`j`y`{`w`j`y`r`yar`j`y`j`wad`jadadaj`gadadadadadadad`yadad`jadad`jadad`qad`jadadadadadadadadad`jad`sadadad`jadadadadad`w`j`qad`y`p`j`jadadadadad`qadadad`jadad`}`}`}`}`}`}`}`w`j`j`y`q`y`j`y`y`q`{`y`j`y`j`j`jad`gagadad`yad`j`y`qadadadadadadad`w`j`ja``j`q`y`jadad`yadada``jadadad`w`y`yadad`jada`a``j`j`}`}`}`}`}`}`}`}`}`}`}`y`q`y`y`j`w`ja``j`j`y`q`y`j`y`jar`j`y`}`}`}`}`}`}`}`w`yae`y`w`j`y`j`y`j`j`y`j`y`j`yad`j`y`ja``j`y`j`y`j`y`yad`j`yad`y`j`j`y`jadah`ja``ja``j`y`y`j`j`yad`j`y`j`y`y`j`y`j`y`j`y`y`j`y`y`j`y`y`jad`y`j`a`a`a`a", +"atatatatae`y`{`j`{`yae`y`yae`w`j`y`q`{`j`y`j`s`j`y`j`y`qa``jad`j`wad`y`j`j`w`j`y`j`y`j`y`j`y`j`y`y`j`y`j`{`y`j`{`j`y`yaead`y`{`y`y`q`{`j`y`y`r`{`j`y`{ae`w`{`y`j`{`j`{`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`yar`j`y`jar`y`j`jaradar`y`j`y`jar`y`s`j`q`j`y`j`y`j`y`j`j`qa`ae`y`j`q`y`j`w`j`jadad`j`y`j`j`y`j`w`j`y`j`qad`gadajadadadagad`gaja``ja``j`y`j`y`y`ja``j`jad`padadad`gag`gagag`macada`ad`j`y`q`{`j`y`{`q`y`yae`yae`y`r`y`wae`{`j`y`wae`y`q`j`y`j`w`j`w`j`j`jadadad`ja``j`w`jad`y`j`wad`j`j`w`y`j`{`q`{`{`j`w`{ae`w`j`{ae`w`yae`wae`{`y`{`y`jar`yar`j`y`yae`y`{`wae`y`y`jar`y`{`{`j`w`j`{ae`w`yae`y`w`yae`y`wae`y`{`j`{`}`}`}`}`}`}`}`jar`yae`y`r`{`q`y`{`q`j`y`j`r`y`w`j`y`j`p`y`j`j`q`j`yad`y`j`qa``{`y`j`y`y`q`y`j`j`y`j`y`{`y`j`{`y`j`r`y`y`yae`y`j`w`j`{`j`w`j`jadadajadagadadadad`pad`pad`jad`pad`jadadadadadad`jadad`jadadad`jadad`j`padad`qadadadadadad`j`ja`adad`jadadadad`yad`qad`y`q`jad`}`}`}`}`}`}`}`}`q`y`j`y`q`{`j`w`j`{`w`j`y`y`wad`j`gagadadad`wad`j`yad`j`padad`j`yad`j`yad`j`yadad`jadadadad`ja``j`jad`yad`jad`yad`j`jad`jad`}`}`}`}`}`}`}`}`}`}`}`y`j`j`w`j`y`q`y`y`j`y`j`y`q`y`y`j`q`y`}`}`}`}`}`}`}`j`y`j`j`y`j`y`q`y`j`yad`jad`jada``j`y`j`ja``j`y`j`y`j`j`ja``j`j`y`j`y`j`w`j`y`j`w`j`yad`j`y`j`y`j`yad`j`y`j`y`j`j`y`j`y`j`j`y`j`y`j`j`y`j`yadah`a`a`a`a", +"atatatat`{`y`j`{`w`j`y`{`{`j`y`{`q`y`{`j`{`w`{ae`y`y`{`y`jar`j`y`yad`jad`yadad`y`j`{`j`y`y`j`y`{`j`{`y`{`y`j`{`y`y`jar`{`y`j`{`y`j`y`{`j`yae`y`j`y`{`{`j`w`{`j`{`w`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`y`j`{`w`j`yae`y`w`y`{`y`j`y`q`y`y`{ae`y`y`yad`qa``j`w`j`y`y`j`y`j`s`j`yad`jad`padad`y`j`p`y`j`w`y`y`j`y`y`jadad`g`gad`gad`g`k`gada``j`w`j`y`w`j`j`ya``qa``y`j`y`jad`g`gag`g`gagad`wae`s`j`y`j`y`w`j`y`j`y`jar`y`q`y`{`y`q`y`y`yae`y`j`y`j`y`w`y`j`ja``q`ja``p`yad`j`w`j`y`y`w`j`y`y`q`{`y`y`jar`y`y`j`y`w`j`y`{`{`{`w`{`y`q`{`y`{`q`{`yar`j`y`j`{`{`q`y`q`y`j`y`q`{`wae`y`yae`w`{`yae`w`y`{`j`w`y`{`j`w`y`{`j`y`wae`}`}`}`}`}`}`}`q`y`y`{`y`q`y`{`y`j`{`yar`y`{`q`y`{`y`q`y`j`j`s`yad`q`y`j`y`j`y`j`w`j`y`q`y`j`y`w`j`w`{`q`j`{`w`j`y`y`{`y`r`y`r`y`y`j`y`w`{`yad`padadad`gadadadadadadad`jada`ad`ja`adadadad`p`yadadadad`jadadada`ad`jada``jadadadadadadad`yadad`jadada``jad`j`j`w`ja``jadada``}`}`}`}`}`}`}`}`y`j`w`y`j`y`y`j`y`y`j`y`j`w`y`j`qadadadad`j`y`j`j`yad`jadad`jad`y`p`j`y`j`y`p`y`p`yadadad`p`yad`j`p`y`jad`ja`ad`j`qa``p`ja``}`}`}`}`}`}`}`}`}`}`}a``q`y`j`y`y`j`y`{`j`j`y`w`j`y`j`y`j`}`}`}`}`}`}`}`j`y`j`j`y`y`y`j`j`y`j`ja``y`ja``j`y`j`ja``y`j`y`y`y`j`y`y`y`j`y`j`y`ja``j`j`y`w`j`y`y`j`j`ya``j`yad`y`j`y`ja``j`j`y`yad`j`y`y`j`y`y`j`y`y`y`j`d`y`a`a`a`a", +"atatatatae`y`yae`{`y`q`{`jar`{`j`{`j`{`wae`y`j`y`q`{`{`q`y`y`j`y`{`qad`y`j`yadad`j`y`j`yae`y`q`y`j`j`w`j`j`y`p`yae`yad`yae`y`j`y`j`y`yar`y`y`q`j`y`q`y`{`j`yar`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`w`j`y`j`y`y`r`y`yae`w`{`q`y`{`y`j`q`{`w`j`q`{`y`j`w`j`jad`w`j`j`w`j`yad`j`wadadadadad`q`y`y`qad`j`j`w`j`w`j`yadadad`g`~`gaj`gadadaj`y`j`y`j`y`y`q`y`j`y`{`jad`y`j`y`y`jad`gagadad`gag`j`jad`w`j`j`y`j`q`y`wae`y`y`jar`j`y`y`r`y`q`y`{`j`w`j`yae`y`qad`y`j`yadad`j`wa``j`j`y`j`y`q`y`y`j`q`y`q`{`j`w`j`{`y`{`q`{`w`yae`y`j`{`{`w`j`{`jar`j`{`w`{`w`j`y`{`j`{`w`y`j`{`y`y`q`{`q`yae`y`w`{ae`w`yae`y`jar`{ae`w`{`q`y`yae`}`}`}`}`}`}`}`r`y`qae`{`y`r`jar`{`y`qae`y`j`y`r`y`j`yarad`y`j`w`j`y`pad`{`q`y`y`j`w`j`y`j`w`yae`y`j`y`j`w`j`{`yae`w`j`{`y`{`yae`w`y`j`j`w`yae`y`jadadad`padajadadadadad`jadad`jad`padadadadad`jadadadadadadad`j`pad`jadadad`qadadad`jadadadadadad`qadad`jad`yad`j`yad`j`j`j`}`}`}`}`}`}`}`}`y`j`y`j`wae`y`q`yae`y`j`{`j`y`j`y`jadad`y`pad`j`p`y`qad`y`p`jad`ja``q`j`y`j`j`j`y`qadad`yad`jad`yadadad`y`jad`jad`jad`yadad`}`}`}`}`}`}`}`}`}`}`jad`y`j`w`j`q`y`j`y`q`y`j`j`j`y`j`y`j`}`}`}`}`}`}`}`y`w`j`j`jad`j`yad`yad`j`ja``j`ja`ad`j`y`j`j`y`j`j`j`y`j`y`y`y`y`j`{`w`y`j`y`j`y`j`j`y`j`y`j`y`j`jad`j`y`j`y`j`yad`j`y`j`y`j`y`j`jah`j`j`y`j`y`j`y`a`a`a`a", +"atatatat`j`{`y`{`q`{`y`j`{`yae`{`y`wae`j`y`yar`{`{`yae`y`j`{`{`w`j`{`y`yad`j`jada``j`j`yar`j`y`{`y`y`{`y`{`j`{`y`j`y`y`j`j`y`yae`y`q`{`j`j`w`y`{`j`y`yae`w`yae`y`}`}`}`}`}`}`}`}`}`}`}`{`w`j`{`}`}`}`}`}`{`y`q`y`{`q`{`j`y`q`{`wae`y`y`jar`j`{`y`j`y`y`{`q`y`j`y`p`y`j`y`p`y`jad`j`w`jadadadadada``j`j`y`y`j`y`j`y`jad`y`jad`hadagad`g`i`gaga`adad`y`j`yae`y`j`y`j`y`j`yadad`jad`q`y`gagadadadad`g`gad`j`y`j`p`y`j`y`j`y`{`q`y`{`y`y`q`{`j`y`{`y`j`w`y`ja``p`j`yadad`q`q`y`q`y`j`y`q`y`q`y`j`{`q`y`y`j`yae`y`y`q`{`y`q`{`j`{`yae`w`yar`y`j`{`w`{`y`w`j`{`y`j`yae`w`y`r`y`y`r`y`j`wae`y`y`{`yar`y`jar`y`y`j`{`w`{`j`y`w`j`{`{`y`j`}`}`}`}`}`}`}ae`y`y`y`j`y`w`y`{`y`wae`y`y`wae`y`y`{`q`y`y`j`y`j`y`jad`y`j`j`y`q`j`j`y`y`q`y`y`j`q`y`y`r`y`y`yae`w`j`{`j`w`j`jar`y`j`{`y`j`y`j`w`yad`padadad`padadadadadadad`qa``jadad`jad`padadad`ja``jadadadadadad`s`jadad`jadad`p`jadad`qadadad`ja``ja``jadad`j`j`qa`ad`j`}`}`}`}`}`}`}`}`y`j`y`j`y`y`j`y`j`w`yar`yad`y`q`y`ja``q`y`j`y`ja``j`j`yad`jad`yad`j`y`y`j`y`q`y`yad`jadadad`yadad`jad`y`jad`yad`s`ja``jad`j`}`}`}`}`}`}`}`}`}`}`}`}`j`q`y`j`y`j`w`j`y`j`y`y`j`y`j`y`j`}`}`}`}`}`}`}`j`j`y`ja``y`j`y`j`y`j`yad`y`jad`y`j`j`yad`y`j`y`y`j`y`y`{`q`y`j`{`q`y`y`j`{`y`y`q`y`y`j`j`y`j`y`j`y`y`yad`y`j`y`j`y`j`y`d`y`jah`j`y`j`y`y`d`y`jao`a`a`a`a", +"atatatatae`y`j`yae`yar`{`y`y`q`{`j`y`{ae`w`{`j`y`r`y`y`{`w`j`{`{`{`jar`j`y`yadadad`jad`y`j`{`j`yae`{`y`jar`y`j`y`j`j`y`w`j`y`p`y`j`y`j`w`j`y`y`r`y`{`y`j`y`w`{`{`}`}`}`}`}`}`}`}`}`}ar`y`{`jar`y`}`}`}`}`j`{`y`j`{`y`w`yae`y`{`yae`w`j`y`j`y`q`yae`y`r`y`yar`y`j`y`p`jad`y`qad`yad`j`padadadag`gadad`j`p`y`j`s`j`y`yad`y`jadajad`hag`h`i`gadad`yad`y`q`yad`w`{`j`wad`j`j`s`y`ja``j`j`yad`gadaj`gadadagadad`j`y`p`y`j`q`y`j`y`j`q`y`j`yar`j`q`y`q`y`j`y`q`j`y`j`wad`yad`y`j`y`y`wae`{`j`y`wae`y`y`q`{`ja``q`{ad`y`r`y`y`y`r`yar`yae`y`wae`{`y`j`{ae`w`yar`yar`y`{ae`y`yae`w`y`{`y`{`q`{`j`{`j`{`y`q`{`waear`j`{`wae`y`y`r`{`w`j`{`}`}`}`}`}`}`}`y`q`y`r`y`j`{`q`j`y`y`r`yar`j`y`r`y`j`{`w`j`q`j`s`j`qa``p`y`jad`y`j`j`w`j`j`j`w`y`j`q`{`j`r`y`y`j`yar`y`j`y`{`j`{`w`{`q`yarae`y`j`y`j`{agadadadadad`j`pad`}`}`}`}`}adadadadadadadadadadadadadadadadad`jad`ja``jadada``j`jada``j`pad`jadad`ja``q`y`y`jad`ja``j`}`}`}`}`}`}`}`}`j`w`j`y`r`y`w`j`y`j`j`y`q`j`y`ja``q`jad`y`j`p`y`j`pad`ja``qadad`j`p`j`w`j`j`y`q`jad`y`jad`jad`j`s`jad`p`jad`j`jad`y`j`p`yad`}`}`}`}`}`}`}`}`}`}`}`}a``j`yad`w`j`y`j`j`y`q`y`j`y`j`w`}`}`}`}`}`}`}`}`y`j`y`j`jadad`y`j`s`j`j`y`jad`yad`y`j`j`y`j`y`j`y`j`y`j`j`y`j`y`j`yae`y`j`j`y`j`y`j`y`j`y`j`y`j`j`y`j`j`y`j`j`yad`d`y`jad`y`j`y`j`d`y`j`j`y`j`y`j`a`a`a`a", +"atatatat`y`j`w`{`jara`ae`yae`yaear`y`j`{ar`y`j`{`y`y`r`yae`y`{`j`w`j`{`y`y`j`jadadad`j`y`y`j`y`yae`w`j`y`y`j`yar`j`y`{`y`j`j`yae`{ad`y`{`j`y`j`j`y`y`j`jar`y`j`}`}`}`}`}`}`}`}`}`}`wae`j`y`wae`y`q`{`j`w`{ae`q`y`w`j`y`j`{`y`q`{`q`y`y`{`j`w`y`j`y`w`y`yae`y`j`y`q`y`y`jadad`j`jad`y`j`gadagad`gad`j`ja`ad`jadad`jad`y`j`y`j`g`gaj`gag`n`~adad`jad`ja``j`j`y`j`j`yad`w`y`y`j`p`j`j`y`j`wadag`gadadadadag`gad`j`y`y`jad`yae`q`y`y`jae`y`y`j`y`j`y`{`q`y`ja``j`y`j`ja``jar`j`yar`j`y`w`y`w`y`{`j`w`yae`y`w`j`y`j`y`j`y`y`r`y`j`yae`yar`j`{`{`y`q`{`w`{`j`{ae`yae`yar`yar`j`yae`y`r`y`j`j`y`w`j`{`w`{`{ae`w`y`y`j`y`{`jar`y`yae`yae`}`}`}`}`}`}`}`q`{`y`w`j`w`{`j`{`y`q`{`y`j`{`w`y`y`{`w`j`y`y`j`y`j`y`j`y`jad`y`jad`w`yad`jar`y`j`j`y`y`{`y`y`j`y`q`yae`{`j`y`{`q`y`j`{`j`y`y`j`y`y`j`rad`g`jad`jadadad`}`}`}`}`}`}`}ad`s`jad`wadadadadadadadadadadadadadad`j`pad`y`qadada``p`j`y`j`yad`j`y`j`yad`j`j`y`yad`q`}`}`}`}`}`}`}`}`}`y`j`w`j`yae`y`j`y`y`j`y`y`ja``jad`jad`j`y`j`{`q`yad`yad`ja``jad`ya``j`j`y`j`y`j`y`jadadad`yad`jad`q`y`ja``j`y`ja``j`yad`y`}`}`}`}`}`}`}`}`}`}`}`}`}`y`j`w`y`j`y`y`j`w`y`j`y`j`y`}`}`}`}`}`}`}`}`jad`y`jad`yad`y`ja``j`j`yad`yad`j`y`j`ja``y`j`j`y`y`j`y`j`y`j`y`y`y`j`y`y`j`y`{`y`j`y`y`j`y`y`j`j`y`y`y`j`y`y`y`j`y`y`j`j`y`d`yad`y`y`j`y`y`j`y`j`y`a`a`a`a", +"atatatatar`j`y`{`{`j`y`q`{`y`y`j`{`w`{`j`yar`j`{`y`{`y`jar`{`j`{`y`wae`{`w`j`y`yadad`j`yar`j`{`y`y`{`w`j`y`{`j`y`{`j`y`j`y`ja``j`j`w`j`j`y`w`j`y`q`y`j`y`jar`y`}`}`}`}`}`}`}`}`}`j`{ar`y`j`y`j`{`y`y`{`y`j`y`{`qahae`w`y`j`{a``j`yae`w`{`j`j`y`qae`yar`j`w`j`wae`y`j`j`yada`ad`wadadadadag`gagadadad`p`yadadadadadad`jadadadad`iac`ias`gaga``ja`ad`jad`j`ja``y`j`ja``j`j`y`j`yad`pa``j`j`y`yagadagadadad`gaj`gad`w`jad`ya``j`q`y`y`w`j`y`q`y`w`j`y`j`w`{`j`p`y`j`ja``y`q`y`yae`y`j`yae`yar`yae`yar`yae`y`q`{`q`y`yae`y`y`{ar`j`y`{`{`w`j`yae`w`y`{`yar`y`q`y`{`j`{`j`{`w`y`j`yae`w`{`y`j`{`w`j`{`q`y`{`jar`{`w`j`{`y`r`y`r`y`yae`}`}`}`}`}`}`}`wae`y`{`{`j`w`yae`w`y`j`{`w`j`{`j`wae`{`w`{`j`wad`j`q`y`p`j`y`qa``j`j`q`yad`j`y`j`w`j`w`j`r`y`q`y`{`j`w`j`w`y`{`j`w`y`j`y`q`{`j`q`y`y`j`wadadadadad`j`}`}`}`}`}`}`}`}adadadad`jadad`ja`adadadadad`jadadadadad`jadadad`jad`jadad`p`yad`j`y`p`jad`y`w`j`j`s`j`y`}`}`}`}`}`}`}`}`}`j`j`y`y`q`j`y`wae`y`y`j`j`j`wad`jad`yad`j`ja``j`j`wad`j`jadadad`jad`y`p`y`j`y`q`yadadadadadada``j`y`j`qad`y`qad`y`q`jad`w`j`}`}`}`}`}`}`}`}`}`}`}`}`}`j`{`j`y`j`w`j`y`j`}`}`}`}`}`}`}`}`}`}`}`}ad`jad`jadad`j`jad`y`jad`y`jad`y`yad`y`j`y`j`y`j`y`j`j`y`y`j`y`j`q`y`j`w`y`j`y`j`y`j`w`j`y`j`y`j`y`j`y`j`y`j`j`j`y`j`j`y`y`j`~`y`j`d`y`jah`j`y`~`y`j`a`a`a`a", +"atatatat`j`yae`y`jar`y`{`yae`w`{`j`{`j`w`{`j`{`wae`wae`{`w`j`y`{ar`yaea`ae`y`{`yadagad`yae`y`{`j`w`j`{`y`j`j`y`j`y`j`yae`yad`y`j`y`j`y`j`y`j`y`j`y`j`y`q`{`y`{`}`}`}`}`}`}`}`}`j`y`yar`j`y`yar`y`w`j`{`q`y`r`y`y`{`q`y`y`r`y`j`wae`w`y`yae`w`yae`y`y`j`yae`y`y`j`yar`y`j`w`y`j`jadad`jag`g`i`gadadad`jadadad`jada``jada`adad`~`n`g`nasag`g`j`y`y`j`s`ja`ad`yad`jada``j`j`wad`y`j`y`j`ja``j`w`j`p`gagadad`padaj`g`jae`w`y`j`jad`yar`j`j`w`{`j`y`y`j`w`y`j`j`yadad`jad`q`y`{`y`{`q`{`w`y`{`q`{`jar`yae`y`w`y`{`y`y`j`y`j`w`{`j`j`y`{`q`y`yar`yar`j`{`j`wae`y`{`w`jar`y`wae`y`w`{`q`y`y`j`{ar`j`{`y`w`{`yar`j`{`j`{`yarae`y`y`{`j`w`}`}`}`}`}`}`}`{`y`y`{`q`y`y`jar`y`y`r`y`j`y`{`q`y`j`{`y`jar`j`y`wad`y`jad`j`y`p`j`jad`y`j`y`p`y`j`j`y`j`y`y`y`{ae`w`y`j`{`y`q`{`j`y`j`w`{`y`q`{`y`j`{`yadadadadad`j`}`}`}`}`}`}`}`}a``j`pad`yadadad`pad`jadadadadadadad`j`p`y`jada``j`jad`p`j`yad`j`p`y`j`y`j`p`j`j`yad`y`jad`}`}`}`}`}`}`}`}ad`w`j`y`y`q`y`y`j`{`q`y`q`y`j`y`qad`y`j`p`y`j`w`j`y`y`j`p`yadadadad`j`j`{`s`j`ja``j`padadad`jad`qad`ja``y`j`j`j`w`jad`y`yad`j`}`}`}`}`}`}`}`}`}`}`}`}`jad`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}adadada``jad`y`ja``jad`y`j`y`y`j`jae`y`y`j`y`j`y`j`y`j`y`j`j`y`j`y`y`j`y`j`yae`wae`y`j`y`j`j`y`j`y`j`y`j`j`y`y`j`y`ja``j`y`jao`j`y`y`j`y`y`j`j`y`j`y`a`a`a`a", +"atatatat`{`{`w`j`{`y`r`{`y`yae`w`{`yae`{`j`y`j`{`y`{`q`{`yae`w`j`{`jar`y`y`j`y`j`y`gad`j`y`q`y`y`yae`y`{ar`y`j`w`j`y`w`{`j`w`y`j`y`ja``q`y`y`j`y`j`y`y`j`j`y`j`}`}`}`}`}`}`}`}`y`q`yae`y`wae`yae`yar`j`{`y`{`q`yae`y`j`w`{`y`j`y`j`{`j`y`y`j`w`j`y`j`w`j`w`j`y`j`y`j`yae`y`q`yad`padadadagagac`gadadadadadad`yadad`j`y`j`y`ja``gaj`g`g`~agad`y`j`y`j`y`j`j`y`p`y`jada``j`y`jad`j`y`y`q`ja``j`y`j`wad`gad`gadad`gadad`ja``y`qadadad`j`y`y`j`y`q`y`j`y`y`w`j`y`p`y`ja``jar`j`j`y`{`j`{`q`{`y`w`{`j`w`yae`y`q`y`r`y`w`j`y`j`w`{`j`w`{`j`{`j`{`j`y`w`{`{`w`yae`y`{`{`j`w`{`{`j`y`{`jar`{ar`j`y`{`q`{`j`{`q`y`y`q`{`j`y`{`q`y`r`y`{`j`}`}`}`}`}`}`}ar`jar`j`y`j`y`y`jar`y`j`{`w`j`y`{`q`{`j`w`y`j`yae`y`q`y`j`w`jad`yad`wad`j`y`j`j`w`j`y`q`{`q`w`j`j`y`j`yar`j`y`j`y`yar`jae`y`j`{`yar`j`j`y`q`jad`gadad`}`}`}`}`}`}`}`}adadadad`pad`jadadadadadadadadadadadadadadad`jad`ja``jad`jad`y`j`j`yad`j`y`yad`q`j`yad`q`y`}`}`}`}`}`}`}`}`yad`q`y`j`j`y`w`{`j`y`y`j`yad`yad`j`w`yae`y`y`j`q`y`y`j`y`j`s`jad`g`jad`j`y`j`j`s`jadadadadad`yad`j`j`y`p`y`y`j`y`j`y`j`q`y`yad`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}a`adadad`gad`ja``j`p`y`j`y`j`y`ya``j`j`y`y`j`y`j`y`j`y`j`y`j`y`j`j`y`j`w`j`y`y`y`j`y`j`y`j`y`j`y`j`y`j`y`j`y`j`y`y`j`y`j`y`y`j`d`y`jah`j`y`d`y`j`y`j`a`a`a`a", +"atatatat`yae`yar`yae`yae`y`r`y`j`{`jar`y`y`r`y`{`wae`y`yar`j`{`{`j`w`y`yae`y`r`y`jad`gad`y`j`{`{`j`{`j`y`j`{`w`j`{`{`j`y`j`{`j`w`j`y`w`j`y`j`y`r`y`y`y`q`y`y`y`}`}`}`}`}`}`}`y`{`j`{`yar`j`{`j`w`y`j`y`y`w`{`{`j`w`yar`j`yae`y`sae`y`j`w`j`y`j`yae`w`y`j`{`j`y`r`y`jarada``j`y`jadadadag`gacasag`gadadadadad`jad`y`j`yad`yad`jad`g`iadadag`gad`y`j`ja``q`yad`yad`j`y`y`p`ja``j`wadadad`j`qa``j`j`y`y`jad`gadajad`gad`j`y`w`j`yadag`gad`j`j`w`j`y`j`y`q`j`jad`jad`j`w`j`w`j`y`y`q`y`wae`y`{`wae`y`y`{`j`w`{ae`yar`y`{`q`y`j`j`y`yae`y`q`y`r`yar`y`{`r`j`yae`y`w`j`w`{`j`{ar`j`wae`y`w`j`y`jar`{`y`y`q`y`{`j`{`yar`j`w`j`y`y`{`j`{`}`}`}`}`}`}`}`{`y`j`{`y`w`{`q`{`j`j`w`{`j`yar`j`{`yar`j`{`j`{`w`j`y`j`w`j`y`j`wad`j`y`p`yad`qa``j`y`j`y`{`j`w`j`y`w`{`j`y`r`y`{`q`{`j`y`j`y`j`y`q`y`j`y`w`yadadad`j`}`}`}`}`}`}`}`}adadad`jadadadadadadadadadadadadad`jad`jadadada``j`qada`adadadad`s`jad`y`j`y`q`y`jad`y`j`yad`}`}`}`}`}`}`}ad`j`y`j`y`j`y`j`j`w`j`j`y`jad`p`j`ja``j`j`y`q`y`y`j`y`j`j`yad`jadadadad`y`jad`j`yad`jad`gadad`j`w`j`y`j`y`j`jad`y`j`y`q`y`j`j`y`ja``}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}adadajadadad`jad`jad`j`y`j`y`j`y`j`j`y`y`j`y`j`y`j`y`ja``j`j`y`j`y`y`j`y`j`j`{`j`y`j`y`j`j`y`j`y`j`y`j`y`y`j`yad`j`y`j`j`y`j`j`~`y`j`y`j`y`j`y`y`d`j`a`a`a`a", +"atatatat`j`{`j`{`yar`y`y`{`j`y`q`{`y`j`{`w`{ae`y`j`y`{ae`y`w`y`{`j`{`q`{`y`y`yar`j`y`jadad`y`j`y`w`jar`y`{`yae`y`w`{`j`y`j`{`y`jar`y`j`w`j`j`y`yae`w`y`j`{`q`{`}`}`}`}`}`}`}`q`{`y`wae`y`yar`j`{`w`{`{`j`y`q`y`{ae`{`y`q`y`yae`y`y`y`{`j`{`w`y`j`y`j`{`y`w`j`w`j`{ad`yae`y`q`yad`gaj`g`i`gagacasagadad`y`g`y`jad`p`y`jad`j`yad`j`g`g`iadad`g`gad`y`j`y`j`j`w`j`yad`j`yad`j`wad`j`y`y`y`j`y`qad`y`q`y`w`{`p`jadad`uad`j`j`y`j`w`y`j`gag`g`j`jar`y`q`y`y`y`qa`ad`w`j`y`y`j`w`y`r`y`j`yar`j`{`y`jar`y`w`{`{`w`{`j`y`{`j`y`w`y`q`y`y`q`{`y`y`{`j`yar`y`yar`y`{`r`y`{`j`w`y`j`{`w`{`j`y`{`wae`y`yae`r`y`yar`j`wae`{ad`{`y`r`{`w`j`w`j`}`}`}`}`}`}`}`q`y`q`j`yae`y`j`w`{`j`y`wae`y`y`q`y`j`{`w`j`{`y`j`w`y`j`y`j`y`jad`w`jad`y`j`yad`j`y`q`yad`y`j`y`qak`q`y`{`{`y`q`{`j`{`w`y`q`{`yae`yar`j`y`j`q`yadad`g`}`}`}`}`}`}`}`}`jadadad`jadadadadadadadadadadad`gadadadad`jad`p`ja``jad`j`yad`j`j`wad`j`y`ja``j`y`q`y`j`y`j`}`}`}`}`}`}`}adadad`y`q`j`y`y`j`y`w`y`j`w`ja``j`j`w`j`y`j`y`j`w`y`j`w`y`j`y`jadadadadadadad`jadadadad`gadad`yad`y`q`y`j`y`w`y`j`y`j`y`jad`y`s`j`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}adadadad`gadadad`yad`y`j`y`j`j`y`y`j`y`j`y`j`y`y`j`y`j`y`j`y`y`j`y`j`y`y`j`y`y`j`y`j`y`j`y`j`y`j`ja``y`j`j`y`y`j`y`j`ya``j`y`y`j`y`jah`jah`y`jah`y`jah`a`a`a`a", +"atatatat`wae`y`j`wae`j`y`j`{`q`{`y`r`y`j`{`jar`j`{ar`j`y`q`{`j`{`j`y`y`{`j`w`{`j`{`y`jadad`y`j`{`j`y`{`j`wae`y`y`j`{`j`w`y`{`w`j`y`y`j`y`y`j`y`q`y`j`j`yar`j`y`}`}`}`}`}`}`}`}`{`j`j`y`{`q`y`j`yae`y`r`y`j`{ar`j`y`y`r`y`y`j`j`y`q`{`j`w`y`j`{`q`y`j`j`wae`j`y`y`j`y`j`w`jad`yadaj`gacag`g`n`iacag`hadadad`jad`ja``j`ja`ad`j`ya``j`gag`gad`iad`iad`y`y`j`y`j`y`y`q`y`y`q`y`y`j`ja`ad`q`j`pad`y`jad`y`j`j`yad`y`w`j`jada``q`y`y`j`y`wad`n`i`gad`j`j`y`jad`j`jad`j`y`j`yae`y`y`{`jar`y`j`{`w`y`q`{`y`j`{`j`w`{`j`y`q`yar`j`yae`j`j`y`y`j`y`q`yar`yae`{`j`y`r`y`y`jar`j`y`{ar`y`jar`y`q`{`j`y`wae`y`yar`j`{`y`{`j`{`wae`y`q`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`y`j`w`j`y`j`w`j`{`j`yar`j`{`w`{`j`y`w`y`r`y`y`j`y`p`y`j`w`j`y`jad`y`qad`q`y`jad`w`j`y`q`y`y`j`y`q`y`q`{`j`y`yae`y`{`j`yar`j`yae`y`q`y`y`qadadad`}`}`}`}`}`}adadadadadadadadadad`jadad`p`gadajadadadadadadadadad`jad`p`jadad`jad`jad`s`j`j`y`qad`y`j`q`yad`}`}`}`}`}`}`}ad`p`y`j`y`j`y`j`w`j`j`j`y`j`j`jad`y`ja`ae`y`q`y`{`j`y`j`j`y`q`y`j`p`gajadadadadadadaj`gaj`g`j`p`y`jad`y`j`j`jad`w`j`w`j`y`jad`y`j`jad`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}adadad`gajad`~ad`jad`y`j`j`y`j`y`y`q`y`j`y`j`y`j`y`w`j`j`y`y`j`j`w`j`j`j`y`j`jad`yad`j`ja``j`j`y`ja``j`y`j`y`j`j`y`j`j`y`j`j`y`j`y`jahad`j`y`jad`j`y`j`d`a`a`a`a", +"atatatat`y`j`{`y`{`y`q`{`{`y`{`j`{`yar`yar`y`y`yae`y`y`j`{`y`q`{`j`y`j`w`j`y`{`j`yar`y`jadad`{`y`y`{`j`y`y`y`r`y`y`y`{`j`w`{ae`y`{ae`y`yar`j`y`y`{`y`j`yae`y`j`}`}`}`}`}`}`}`}`{`y`q`{`y`jar`y`{`w`j`yar`{`y`{`w`{`y`y`r`y`{`w`y`y`j`{`y`q`{`y`j`y`j`y`y`y`j`wae`y`j`w`y`y`j`y`yad`nagas`i`n`h`n`h`ia``jada``jadad`y`jad`yad`j`ja`ad`hag`gad`g`gajad`y`j`y`y`j`y`y`ja``j`y`q`y`q`y`yad`y`j`s`j`j`s`j`y`q`y`j`j`y`y`p`y`ja`ae`j`w`j`{`y`sag`g`gad`qadadad`p`y`j`q`{`y`q`y`j`w`y`{`y`yar`j`{`y`j`{`w`yae`y`y`q`{`{`yae`yar`y`w`{`w`j`y`j`y`yae`y`w`j`{`w`yae`y`w`{`{`w`yae`y`{`y`j`w`yar`{`j`w`{`jar`y`j`w`yar`y`j`y`{`w`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`q`y`j`y`j`{`y`q`y`j`{`{`y`q`y`{`j`y`y`j`j`p`y`j`qa``j`y`ja``{`j`y`j`yar`j`wae`y`j`{`y`w`y`r`y`y`j`y`w`{`j`y`yar`j`{`j`y`j`padadad`}`}`}`}adadadadad`p`jad`wadadadadadadad`padadagad`gagadadadad`j`yad`s`jada`ad`j`y`j`w`j`y`j`y`ja``j`y`q`}`}`}`}`}`}`}`j`jad`j`y`q`y`j`y`y`w`j`w`yad`y`q`j`w`j`y`j`y`q`j`y`w`y`j`y`j`y`y`j`g`gad`gadadadadad`g`gajad`ja``j`j`w`y`y`w`j`y`j`y`w`j`w`y`j`y`q`y`j`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}adadadad`gad`gadad`jad`y`y`j`y`j`y`y`j`y`j`y`j`y`y`j`y`y`j`y`j`y`y`w`j`y`y`j`y`j`y`j`yad`j`yad`y`j`y`j`y`j`ya``j`y`y`y`j`y`y`j`y`j`y`y`j`y`~`y`y`jaha``j`a`a`a`a", +"atatatat`j`y`jar`jae`y`{`j`{`q`y`jar`j`j`{`jar`{`j`{`w`yae`w`j`yae`y`y`{`j`y`j`wae`y`yae`w`yad`jar`j`yae`y`q`{`{`j`{`jar`{ae`y`yar`{`q`yae`y`yae`yae`w`y`q`{`w`}`}`}`}`}`}`}`}`{`j`{`{`wae`y`yarae`y`yae`y`q`{`j`j`wae`y`yar`j`{`jar`j`q`y`y`j`w`j`w`j`w`j`j`y`j`w`j`yae`w`j`y`qadag`h`iacac`gacaaaa`gadadad`j`ja`ad`ja``jadad`yadadadag`hadagad`hadadad`{`qa``j`j`y`j`y`q`y`j`y`y`q`j`wad`j`y`j`}`}`}`}`}`}`}`y`j`j`y`q`y`q`y`j`y`q`{`j`}`}`}`}`}`}`}`gad`j`s`yae`y`yae`w`{`j`y`j`q`y`j`y`j`y`q`{`q`y`j`y`j`{ar`y`w`{`jar`j`{`j`y`q`y`j`y`r`y`j`{`yar`j`{`w`j`y`j`{`j`jar`j`wae`yae`y`j`{`w`j`{`y`wae`y`r`yaear`y`wae`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ae`w`y`j`w`j`y`{`jar`y`q`{`y`jar`jar`j`y`w`j`y`j`y`j`j`y`p`j`j`w`j`w`j`y`j`y`j`y`{`q`j`yae`y`j`wae`j`y`jar`j`y`j`j`w`y`j`yadad`jadadadadadad`jadad`jadadadadadadadadadadadadagadad`gajadad`gadadadadadadad`jad`jadad`y`j`j`y`q`y`j`p`j`y`}`}`}`}`}`}`}`yada``q`j`y`j`w`j`y`j`jad`j`qad`j`y`ja``q`j`w`j`y`j`y`j`q`y`y`r`y`jadadaj`gaj`gadag`hadaj`gad`y`j`j`w`j`y`j`j`j`y`j`y`j`y`j`j`y`j`y`j`s`y`j`q`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`jadadadad`gajadadad`jadadad`j`y`j`{`j`y`j`y`y`j`y`j`y`j`y`j`y`j`y`q`y`j`j`y`jad`y`jad`ja``j`y`j`j`y`jad`y`jad`j`y`j`y`j`y`j`y`j`j`y`j`y`j`y`j`j`y`jah`j`j`y`a`a`a`a", +"atatatat`y`j`y`j`w`y`q`y`{`j`{`y`y`j`y`y`r`y`j`{`y`jar`j`{`y`y`jar`j`w`j`y`{`y`j`{`yae`y`y`j`yadadar`y`j`y`y`j`y`wae`y`y`yarae`y`yae`y`w`yae`y`y`w`j`y`{`j`y`y`}`}`}`}`}`}`}`}`{`w`yae`yar`yae`y`w`yae`w`y`y`j`{a``j`w`j`y`{`y`y`j`{`{`y`q`{`{`y`j`y`y`j`w`j`y`y`{`q`yad`y`j`w`jadag`nas`iag`macacaa`had`j`yadad`ja``j`ja``j`jad`yad`gag`g`~ad`gadajad`g`j`{`ja``j`y`q`y`j`y`j`y`j`y`y`y`ja``}`}`}`}`}`}`}`}`}`}`s`j`{`j`y`w`j`y`y`w`y`}`}`}`}`}`}`}`}agad`j`y`w`jar`y`j`{`wae`y`{`j`w`y`w`j`y`{`j`y`{`w`y`yae`{`y`q`{`y`yar`j`{`y`jar`y`j`y`q`y`j`y`j`w`j`{`wae`w`yar`y`{`y`j`wae`y`w`j`{`y`w`j`{`yar`y`y`jar`j`{`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`y`{`j`yar`{`y`j`{`j`w`{`y`j`y`y`r`y`y`y`j`wad`y`j`y`y`p`j`y`y`j`y`j`w`{`j`w`yae`y`w`jar`y`{`y`q`y`{`j`w`j`y`y`j`w`j`ja`adadadadad`qadadadad`padadadad`jadadadadajadadad`gagadag`gadadadadadadadadadadadadad`jadadad`ja``j`q`y`y`j`j`}`}`}`}`}`}`}`yad`ja`ad`j`y`j`y`j`y`y`y`yad`y`j`y`j`ja`ae`y`w`j`y`y`y`y`j`yadar`j`y`j`gadagad`gadagad`gadadad`y`y`j`y`q`y`w`y`j`y`j`y`j`y`q`y`q`y`j`y`j`y`ja``}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`y`j`yad`yadad`j`gadagadadadada``jadad`y`y`j`y`j`y`j`y`y`j`y`j`y`j`{`y`y`j`y`j`y`j`y`w`j`ja``jad`ja`adad`yad`j`y`j`y`j`y`y`j`y`j`y`j`y`y`jah`y`jah`y`y`d`yad`yah`jah`a`a`a`a", +"atatatat`q`yae`y`y`{`j`y`y`j`j`{`{`jar`y`j`{`y`jar`j`{`y`q`{`j`w`j`y`j`y`{`q`y`j`w`y`j`{`j`wae`yad`j`{`j`{`y`r`y`j`y`{`j`yae`y`yae`yar`{`yar`yar`yae`y`y`{`{`j`y`}`}`}`}`}`}`}`yae`y`w`{`j`{`yar`{`j`{`y`{`jar`yar`j`{ae`w`{`j`q`y`y`q`j`y`y`j`j`y`j`w`j`{ar`y`j`j`y`j`y`j`jad`{`jag`g`iac`hac`iacaaaaad`yada``j`jad`y`jada``j`yad`jad`~`gadajad`hadad`gad`j`yad`w`{`ja``j`q`yadae`w`j`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`y`j`w`y`j`y`q`y`}`}`}`}`}`}`}`}`}`}`gad`j`y`j`y`j`w`{`j`y`wae`w`yarae`y`j`j`y`j`wae`j`jar`y`w`j`y`{`y`q`}`}`}`}`}`}`}`}`}`}`}`}ar`y`j`{`y`y`{ae`yae`y`j`wae`y`w`j`{`y`q`{`j`{`w`j`jar`yae`y`q`y`{`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`jar`jar`y`{`q`{`y`y`q`{`y`jar`j`w`{`j`{`j`q`y`j`w`j`p`j`j`ja``j`r`y`j`w`j`yad`{`j`y`yae`w`j`y`j`y`{`jar`y`yae`wad`{`j`yad`padadadad`jadadadadad`yadadadadadadadadad`gad`gajad`gajadadad`qa``j`{`p`y`jadadadadad`qa``j`jad`w`j`yad`w`j`}`}`}`}`}`}`}`}`wad`qad`y`j`w`y`p`y`j`w`j`jadad`j`j`w`j`y`q`y`yae`y`q`j`w`jae`y`j`y`qadadag`gadag`gadagadad`j`q`j`y`j`y`j`y`j`w`j`{`q`y`jad`j`j`j`yad`p`yad`y`q`}`}`}`}`}`}`}`}`}`}`j`y`j`j`y`j`y`j`wad`jadadadagadadadadad`yad`j`y`j`y`j`y`j`yae`y`y`j`j`y`yar`j`y`j`j`j`w`y`j`y`jad`y`j`y`j`yad`j`ja``jad`jada``j`j`y`j`j`y`j`y`j`y`j`y`j`y`j`y`j`y`j`y`y`j`d`y`a`a`a`a", +"atatatat`y`y`j`wae`j`y`r`y`y`j`w`{`j`yar`yae`y`yae`y`y`{`j`y`y`{ae`w`yae`y`y`r`y`j`y`y`j`{`y`j`ja`ad`j`y`q`yae`y`w`y`r`y`jar`{`{`w`j`{`j`{`j`y`jar`j`y`jar`j`{`w`}`}`}`}`}`}`}`}`y`{`y`q`{`y`{ae`w`{`wae`y`y`r`y`j`y`{`yae`w`{`j`y`w`{`j`y`{`qa``yae`{`w`j`j`{`s`j`j`wad`y`j`wad`y`gagacac`n`h`n`caaaaadadad`jadada``jadadad`jada`adadaj`g`hadad`gadadada``j`j`y`j`y`j`y`y`j`w`y`j`y`y`q`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`y`yar`j`y`}`}`}`}`}`}`}`}`}`}`}`}`jad`j`y`q`y`j`yar`j`{`y`{`j`y`{`w`y`wae`y`j`y`wad`j`j`j`yar`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`}`}`}`}`w`{`q`yar`y`j`y`}`}`}`}`y`y`q`yae`y`{`y`}`}`}`}`j`wae`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`y`j`j`w`y`j`r`{`yae`w`{`y`j`y`j`w`{`y`yae`y`yad`y`y`j`y`q`y`y`j`y`y`q`{`w`j`y`q`{`y`j`y`wae`w`j`y`yaear`y`j`y`w`j`qa``jadadadadadad`y`padadadadad`padadadadadaj`}`}`}`}`}`}`gaj`gad`jad`y`q`y`j`y`p`jada`adadadadadad`j`y`j`j`y`y`q`}`}`}`}`}`}`}`}`j`yad`qad`yae`y`j`y`}`}`}`}`}`}`}`ja``j`y`j`j`y`q`y`y`y`j`y`w`j`}`}`}`qadad`gajad`g`gadad`y`y`ja``j`y`j`y`j`y`ja``j`y`j`w`y`y`j`y`j`y`j`y`qah`j`j`y`pad`g`gad`j`y`j`w`j`y`j`j`y`j`y`j`yadadad`gad`gad`gad`j`ja`ad`y`j`y`j`y`ja``j`y`j`y`j`y`j`y`j`y`w`y`y`j`y`j`y`j`j`y`jad`ja``jad`jada``j`y`j`yad`y`y`j`y`j`y`j`y`y`j`y`y`j`d`y`jah`jah`j`y`y`d`a`a`a`a", +"atatatat`y`q`{`j`y`j`y`j`y`jar`j`{`j`{`jar`j`y`j`y`w`{`j`w`j`w`j`w`{`{`j`{`j`y`yae`y`j`{`w`j`w`{`j`y`j`j`yad`y`j`yae`{ad`{`y`{`j`y`{`{`y`wae`y`{`w`j`{`w`j`{ar`y`}`}`}`}`}`}`}`}ae`w`{`{`j`w`jar`y`j`y`{`q`{`y`j`{`w`j`j`w`y`{`y`y`j`{`j`w`j`{`yar`j`j`y`j`w`ja``j`j`y`j`y`j`yad`jadag`gac`g`magaaaaac`i`ja`adada``jad`jadada``jad`jad`hag`gaj`gadaj`~adadad`y`p`y`j`j`y`j`qa``j`j`y`q`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`j`y`jar`}`}`}`}`}`}`}`}`}`}`}`}`}ad`y`p`j`}`}`}`}`}`}`}`yadar`j`y`q`j`y`j`y`q`y`j`y`y`j`w`{`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`y`{`j`{`q`y`}`}`}`}`}`q`y`{`j`}`}`}`}`}`}`}`}`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`q`yar`j`y`j`y`w`y`j`{`y`q`{`w`{`j`j`q`y`q`yad`q`j`j`s`j`j`yad`j`{`q`y`{`j`y`wae`y`w`j`y`j`y`yae`w`{`q`y`j`w`j`{`y`j`y`qadadadadad`qadadad`jad`padadadadadad`}`}`}`}`}`}`}`}`}`}`}`yad`q`ja``j`j`w`j`y`y`q`y`jadadad`j`s`jad`j`p`y`j`}`}`}`}`}`}`}`}`qa``jad`j`w`jad`w`j`}`}`}`}`}`}`}`}`}`}`j`w`j`y`y`j`{`j`y`j`y`}`}`}`}`}`jadadadagadadadad`q`j`j`w`j`w`j`j`y`j`j`y`y`j`y`j`y`j`q`y`j`j`q`y`j`j`y`q`y`jad`gajag`y`j`j`y`j`y`j`w`y`jad`yad`jadadaj`g`kadadadada``jad`j`yad`y`j`y`j`{`j`y`y`j`y`j`j`y`w`j`j`y`j`w`j`y`j`y`ja``j`yad`ja``jad`y`jadadad`j`y`j`j`y`j`y`j`y`j`y`y`j`y`j`y`y`d`y`j`y`d`j`y`a`a`a`a", +"atatatat`j`y`q`y`y`jar`y`j`y`j`y`y`r`y`yaear`y`{`r`{`j`yae`{`y`q`j`y`y`jar`y`j`y`{`j`y`j`y`j`y`j`{`y`p`j`y`j`q`y`y`j`q`{`j`w`j`{`wae`{`y`{`jar`y`{`{`y`y`q`{`j`y`}`}`}`}`}`}`}`}`j`{`yarae`y`y`{`jar`yae`y`w`{`{`j`y`w`j`{`jae`w`y`{`j`y`yar`j`y`j`{`w`j`y`j`y`qa``jad`yad`j`gad`jad`gag`iac`h`naa`caa`g`jad`y`jada``j`j`y`yad`ja``jadad`g`hajad`hadadadad`j`ja``y`ja``y`j`jad`w`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}adar`j`y`y`}`}`}`}`}`}`}`}`}`}`}`}`}`uadad`}`}`}`}`}`}`}`}`}`}`yar`j`y`y`q`y`w`j`y`y`q`y`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`y`w`y`y`}`}`}`}`}`}`}`q`}`}`}`}`}`}`}`}`}`}`}ae`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`wae`y`j`y`{`wae`y`j`y`q`y`j`y`j`y`yar`y`j`y`}`}`}`}`w`j`jad`y`q`y`j`y`j`y`r`y`j`{`y`j`y`q`j`yae`w`j`y`yae`y`}`}`}`q`{`j`y`y`jad`}`}`}`}ad`y`padadadad`jadad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`ya``{`w`j`y`y`j`j`{`y`q`y`y`jadadada``jadad`y`j`}`}`}`}`}`}`}`}adad`ja`ad`y`j`y`y`}`}`}`}`}`}`}`}`}`}`}`}ae`w`j`y`w`j`y`q`y`}`}`}`}`}`}`}`j`gadad`gadad`ya``j`j`y`y`j`y`q`y`w`j`yar`j`w`y`j`y`y`j`y`y`j`y`j`y`y`j`j`y`wad`gajada``j`w`y`j`y`j`y`y`j`w`ja`adadadad`gadad`jad`jad`y`j`j`y`j`y`y`j`y`y`j`y`j`y`y`y`j`j`y`j`y`y`j`y`j`y`j`j`ja`ad`y`jad`yad`jad`y`yad`y`j`y`j`y`y`j`yae`y`j`{`y`j`y`j`y`y`jah`j`y`d`y`a`a`a`a", +"atatatatad`yae`{`y`r`y`j`j`y`q`{ad`{`j`{`w`j`{`j`y`j`y`wae`y`j`y`{`jar`j`{`j`y`{`q`y`jar`j`yad`j`y`j`y`ja`ad`j`y`j`w`j`{`y`j`{`y`j`y`j`{`{`w`{`j`y`j`r`y`{`j`y`w`}`}`}`}`}`}`}`}`{`y`wae`y`y`j`w`{`{`j`w`y`y`{`j`w`yae`y`qa``q`j`y`r`y`{`q`yae`y`y`q`y`j`y`j`q`y`y`jadadadadadadadadad`nag`magac`hacac`~ad`yadadada``j`yadad`jad`yad`jad`gad`g`gadad`gada``j`ja``j`j`w`j`w`j`wadad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`y`j`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}ad`}`}`}`}`}`}`}`}`}`}`}`}`{`j`{`yar`{`y`j`y`q`yae`w`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`jar`j`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`w`y`r`y`j`{`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`wae`y`{`q`y`j`{`q`y`{`w`j`y`jar`yae`w`j`y`j`}`}`}`}`}`}`yad`y`j`yad`y`q`j`w`{`j`y`w`jar`y`j`{`j`w`yae`w`j`y`}`}`}`}`}`y`j`y`j`w`}`}`}`}`}`}adadadadadadadad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`q`j`y`j`y`j`w`j`w`y`j`y`j`yar`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`y`jad`q`j`y`q`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`j`j`y`j`y`j`}`}`}`}`}`}`}adadajadadadadad`j`y`q`y`j`w`jad`y`j`y`q`j`y`j`y`j`y`j`w`j`j`y`q`y`y`j`y`q`y`jadaj`g`gad`j`}`}`}`}`}`}`}`}`}`j`j`jadadagadadadadadadad`yad`y`j`y`y`j`j`y`j`j`y`y`j`{`j`y`j`y`y`q`y`j`y`j`y`j`yad`y`j`jad`y`j`ja``jad`j`y`jad`y`j`y`j`y`j`y`y`j`y`jah`jah`j`y`d`y`y`j`y`d`a`a`a`a", +"atatatat`y`j`y`j`{`y`j`yad`j`{`j`w`j`{`j`y`{`w`j`y`{`j`y`wae`y`j`w`y`j`y`j`w`j`y`{`jah`j`y`w`y`j`y`w`j`y`ja`ad`j`y`j`y`j`y`j`jar`yae`w`j`y`jar`y`j`y`{`w`jar`j`{`y`}`}`}`}`}`}`}ae`{`w`j`{ar`yaear`y`yaear`j`y`j`{`y`j`j`yad`y`y`jad`j`y`y`q`y`r`y`y`{ad`w`j`jad`j`y`j`gadad`}`}`}`g`i`gac`ias`i`nas`gag`jadad`j`ja``j`ja`ad`y`j`y`yad`k`gadajad`gajad`~ad`j`y`j`y`j`y`j`y`j`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`nag`hag`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`yae`yae`w`y`y`j`y`y`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`j`y`q`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`{`y`w`j`w`}`}`}`}`}`}`}`}`y`j`j`y`q`{`j`y`yae`j`{`w`{`j`yar`y`y`{`r`y`j`y`r`y`j`y`{`y`q`{`}`}`}`}`}`}`}`}`j`w`j`y`p`j`y`j`y`q`yae`j`y`j`w`yar`yae`y`y`j`y`j`}`}`}`}`}`}`y`q`y`}`}`}`}`}`}`}`}`p`jadad`pad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`q`yar`j`y`y`j`y`j`y`q`j`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}a`ad`ja`ad`j`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`w`{`j`y`}`}`}`}`}`}`}`}adadagadad`jadad`j`y`q`y`j`y`y`j`j`y`y`q`yar`j`y`q`y`y`j`}`}`}`}`j`w`j`j`yadadadagad`}`}`}`}`}`}`}`}`}`}`}`}`ja`adadad`gadad`ja``jadad`y`j`yad`y`y`j`y`j`y`j`y`j`y`j`y`j`w`j`y`j`y`j`y`j`y`y`j`ja``y`j`j`yad`jad`yad`j`y`j`y`j`y`y`j`j`y`y`j`y`y`j`y`y`y`j`y`jah`j`y`y`a`a`a`a", +"atatatat`j`w`j`y`j`jar`{`y`w`j`y`j`y`{`jar`y`j`w`{ae`w`yae`y`w`j`{`yae`y`{`y`{`q`y`y`j`y`w`j`yae`y`j`{`j`{`y`q`jada``j`y`j`yar`y`j`y`{`j`w`{`{`q`{`y`y`r`y`y`{`y`y`}`}`}`}`}`}`}ar`yae`yar`j`y`j`y`yar`{`j`y`{`w`{`j`w`y`j`y`q`jad`y`y`q`y`j`y`j`yae`y`j`w`ja`adadad`j`wad`}`}`}`}`}ag`iacasag`gad`had`g`ja``jada`adad`y`ja``jadada`ajad`gag`gad`~adad`gadad`{ad`w`y`j`w`y`j`wad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ag`nag`m`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`w`y`j`w`j`{`q`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`yae`w`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`yae`q`{`yae`y`}`}`}`}`}`}`}`j`y`y`q`y`y`j`y`w`j`w`y`j`y`q`y`yae`y`q`y`{`j`y`y`j`w`{`j`r`yar`}`}`}`}`}`}`}`}`j`y`y`j`j`y`w`j`y`}`}`}`}`y`j`yae`yae`y`y`r`y`q`}`}`}`}`}`}`}`y`j`{`}`}`}`}`}`}`}`}`q`jadadad`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`j`y`j`q`y`j`q`y`j`w`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ad`j`p`jad`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`j`y`j`}`}`}`}`}`}`}`}`wadadad`gadad`j`w`j`y`j`y`j`j`y`j`w`j`y`j`j`y`y`j`y`j`}`}`}`}`}`}`y`ja``j`s`jadad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`jadajadadajadadadad`j`yad`j`y`j`y`j`y`y`y`j`y`j`y`j`y`y`j`y`j`y`q`y`y`j`j`yad`jad`y`jad`yad`y`j`yad`j`yad`j`yad`y`j`j`y`j`y`j`y`jah`j`yae`y`j`y`y`jah`y`a`a`a`a", +"atatatat`{`j`y`j`yad`j`j`{`j`y`j`j`j`y`{`j`yae`{`y`j`{`j`yae`{ad`j`{`q`y`j`{`j`y`{`j`yae`y`j`y`j`j`w`y`y`j`{`y`j`q`jad`j`w`j`y`j`y`q`y`j`y`j`y`{`q`{`yae`w`jarae`w`}`}`}`}`}`}`}`{`q`{`y`{`{`w`yae`w`{`yar`j`{`j`{`j`y`j`yad`}`}`}`}`}`}`}`}ad`wad`j`w`j`{`y`ra`ad`pad`j`}`}`}`}`}`}`}`magas`}`}`}`}`}`}`}`}`}`}`jadadad`jadad`j`jadad`gad`i`gadagad`~ad`pad`y`y`j`j`y`q`y`j`y`q`}`}`}`}`}`}`}`}`}`}`j`w`j`}`}`}`}`}`}`}`}ag`hag`u`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`{`w`{`{`wae`y`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`w`y`jae`w`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`w`j`j`w`{`q`y`}`}`}`}`}`}`}`}`{`j`{`q`y`j`{`wae`y`r`y`{`j`w`j`y`j`y`r`y`{`q`{`j`y`y`y`j`y`j`}`}`}`}`}`}`}`}`}`j`y`q`y`j`y`j`}`}`}`}`}`}`{`j`w`j`{`w`y`y`{`{`}`}`}`}`}`}`}`y`w`j`}`}`}`}`}`}`}`}adadad`jad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`q`y`j`y`j`y`j`y`q`j`{`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}adadad`yad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`q`y`}`}`}`}`}`}`}`}`}`j`gaj`gajad`}`}`}`}ad`j`y`y`p`j`y`y`j`y`w`j`y`j`y`}`}`}`}`}`}`}`}`q`j`y`j`wad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}a``j`gad`gadadad`yadadad`yad`j`y`j`j`y`j`j`y`y`j`y`j`w`y`j`y`j`y`j`y`j`y`y`j`yad`j`j`y`jad`yad`ja``jad`y`j`y`j`y`j`y`y`j`y`j`y`j`y`j`y`d`y`y`j`{`j`y`j`y`a`a`a`a", +"atatatat`{`y`j`w`j`y`j`w`y`j`y`j`w`y`y`q`y`r`y`y`jar`{`y`w`j`{`y`w`{`y`j`w`j`y`w`j`y`q`y`{`qa``j`y`y`jar`j`y`q`y`y`yad`yad`y`j`w`j`y`j`yae`yar`j`{`y`j`y`y`yae`y`y`}`}`}`}`}`}`}`}`{`y`q`{`jarae`{`y`r`y`j`{`y`w`j`w`y`w`j`}`}`}`}`}`}`}`}`}`}`}`yad`y`j`y`j`j`y`q`y`y`j`}`}`}`}`}`}`}`}a``}`}`}`}`}`}`}`}`}`}`}`}`yad`j`yad`s`~`ja``yad`i`gadagad`gadadadad`j`j`yar`{`ja``j`y`j`}`}`}`}`}`}`}`}`}`j`y`j`j`}`}`}`}`}`}`}`}`g`nacad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`wae`y`j`y`j`{`w`}`}`}`}`}`}`}`}`}`}`j`y`j`{`y`}`}`}`}`}`}`}`}`}`}`}`}`{`j`y`w`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`j`{`q`y`j`yae`}`}`}`}`}`}`}`}`y`j`q`y`y`{`w`j`{`j`y`yae`w`j`y`wae`w`y`{`q`y`j`{`w`jar`j`yar`}`}`}`}`}`}`}`}`}a`ae`y`j`y`w`j`}`}`}`}`}`}`}`q`y`{`q`j`{`jae`y`}`}`}`}`}`}`}`{`{`q`}`}`}`}`}`}`}`}ad`y`ja`ad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ae`y`y`j`y`j`w`{`y`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`ja``jad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`y`}`}`}`}`}`}`}`}`}adadad`gad`}`}`}`}`}`}`y`w`j`{`j`y`y`j`w`j`yae`y`w`}`}`}`}`}`}`}`}`y`j`y`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`yadadad`gadad`jadad`ja``jad`y`j`y`j`y`j`y`y`j`y`q`y`y`j`y`j`y`w`j`y`w`j`ja``j`y`j`yad`ja``j`jad`y`j`y`j`y`j`y`j`y`j`j`y`y`y`j`y`j`y`jah`y`j`y`j`y`y`d`y`a`a`a`a", +"atatatat`j`{`y`j`y`j`y`j`j`yar`j`j`jad`j`y`y`j`q`y`j`y`j`yar`j`{`j`j`y`j`y`j`j`w`j`y`j`w`j`j`y`pae`jad`yae`w`y`j`{`w`yadadad`y`j`q`y`w`j`y`j`y`j`w`j`q`j`y`w`jae`w`}`}`}`}`}`}`}`}`yar`y`yae`w`y`j`y`jar`{`j`w`e`y`{`j`{`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`ja``j`w`j`yad`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ada`ad`jad`ja``~`qadad`gagadad`gadad`gad`p`y`j`w`j`w`y`q`y`y`j`}`}`}`}`}`}`}`}adad`j`s`j`y`}`}`}`}`}`}`j`yagag`m`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`yar`y`jar`y`y`}`}`}`}`}`}`}`}`}`y`q`y`j`w`j`y`}`}`}`}`}`}`}`}`}`}`}`j`w`y`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ar`j`y`j`{`qa``j`w`}`}`}`}`}`}`}`}`w`y`j`y`q`j`{`y`q`y`j`y`j`{`wae`y`j`y`j`j`{`w`{`j`y`yae`w`j`y`}`}`}`}`}`}`}`}`}`}`w`j`yae`y`q`}`}`}`}`}`}`}`}`y`j`yar`y`w`j`{`}`}`}`}`}`}`}`y`y`j`}`}`}`}`}`}`}`}adad`qad`p`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`q`y`j`{`j`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}adad`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ae`w`}`}`}`}`}`}`}`}`}adadaj`}`}`}`}`}`}`}`}`j`y`j`j`j`w`j`j`w`j`y`j`y`}`}`}`}`}`}`}`}`y`j`p`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`jadadadadag`~ad`yad`j`ja``j`ja``j`y`y`j`y`j`y`j`y`q`y`j`w`j`y`j`j`y`j`y`j`ja``jad`yad`j`ja``j`yad`y`j`y`j`j`y`j`y`j`y`j`yae`y`y`j`y`yae`y`j`y`y`d`y`j`y`a`a`a`a", +"atatatat`y`q`y`yae`y`yae`w`y`j`j`y`y`y`{`j`y`j`{`{`y`{`jar`yae`y`y`wae`y`y`q`y`y`yae`w`y`j`y`j`y`y`j`y`y`j`y`j`{`q`j`{`q`yad`j`jad`y`j`y`j`w`yae`y`w`{`y`y`yae`w`y`}`}`}`}`}`}`}`}ae`yae`yar`y`j`yaear`y`{`w`y`{`y`r`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`pa``j`jadadadaj`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}adadadajada`ad`jad`ja`aj`gad`gaj`gadajad`y`y`y`j`y`y`j`y`j`y`q`}`}`}`}`}`}`}`}`}`}`p`y`y`j`wad`}`}`}`}`w`jad`g`i`}`}`}`}`}`}`}`}ag`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`q`{`j`y`{`y`r`}`}`}`}`}`}`}`}`}`{`j`y`wae`y`y`}`}`}`}`}`}`}`}`}`}`}`{`yae`{ar`}`}`}`}`}`}`}`}`}`}`}`}`}ae`y`q`y`y`y`j`y`w`j`yar`j`}`}`}`}`}`}`}`}`y`j`{`q`{`y`j`y`wae`{`w`y`w`j`y`y`j`yar`y`y`j`y`q`y`q`y`j`yar`j`}`}`}`}`}`}`}`}`}`yae`y`w`j`y`}`}`}`}`}`}`}`}`y`y`q`{`j`yae`}`}`}`}`}`}`}`y`yar`j`}`}`}`}`}`}`}`}adadadada``}`}`}`}`}`}`}`}`}ad`gad`}`}`}`}`}`}`}`}`j`y`yae`w`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`p`y`q`}`}`}`}`}`}`}`}`}`}a``p`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}ae`}`}`}`}`}`}`}`}`}`jad`g`}`}`}`}`}`}`}`}`j`y`j`y`w`j`y`y`j`y`y`q`y`}`}`}`}`}`}`}`}`y`q`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`j`y`jadaj`gad`yad`jadad`y`j`y`j`y`y`j`y`j`j`y`y`j`y`j`yae`y`y`q`y`j`w`y`j`y`j`ja``j`j`ja``y`j`y`j`y`j`ja``y`j`y`j`y`j`y`j`y`j`y`j`yae`y`j`y`y`j`y`j`y`j`a`a`a`a", +"atatatat`j`{`{`q`y`j`w`j`{`q`{`w`j`q`j`j`y`q`yae`w`j`j`y`y`r`yae`yae`j`w`y`j`q`y`q`j`y`y`q`y`ja``q`y`q`y`q`y`j`y`y`y`j`y`r`yadad`jad`y`j`y`j`y`q`{`j`q`{`y`j`{`j`j`}`}`}`}`}`}`}`}ae`q`y`j`{`j`w`{`y`j`y`r`{`j`wae`y`w`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}adad`jadadadag`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`yadadadad`j`yad`jadad`g`gadad`gadadad`jadae`s`j`j`j`w`{`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`y`j`j`waead`y`j`s`jad`m`}`}`}`}`}`}`}`}ad`}`}`}`}`}`}`}`}`}`}`}`y`j`}`}`}`}`}`}`}`}`}`j`y`q`y`j`{`y`}`}`}`}`}`}`}`}`j`w`j`y`{`q`y`j`}`}`}`}`}`}`}`}`}`}`}`j`{ad`yae`}`}`}`}`}`}`}`}`}`}`}`y`j`wae`y`r`j`w`y`j`j`y`j`{`q`y`}`}`}`}`}`}`}`y`j`y`y`jae`y`w`j`y`j`y`jae`w`{`jar`j`y`r`y`y`j`{`y`y`r`y`y`y`j`q`}`}`}`}`}`}`}`}`}`j`{`j`w`}`}`}`}`}`}`}`}`}`}`y`{`y`q`yae`}`}`}`}`}`}`}`w`j`yae`}`}`}`}`}`}`}`}ad`jadad`p`}`}`}`}`}`}`}adaj`gaj`gad`}`}`}`}`}`}`}`}`j`w`j`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`j`y`}`}`}`}`}`}`}`}`}`}`y`y`q`j`q`}`}`}`}`}`}`}`}`}`}`}`}`y`j`}`}`}`}`}`}`}`}`w`j`}`}`}`}`}`}`}`}`}`q`y`j`j`y`j`y`j`y`j`j`y`j`}`}`}`}`}`}`}`}`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`j`yadad`jad`gadadadad`jadad`y`j`y`j`j`y`y`j`y`j`y`y`j`y`j`y`j`y`j`y`j`y`j`yad`yad`j`yad`j`ja``jad`y`j`y`j`y`ja``j`y`j`y`y`j`y`y`j`y`j`y`j`yae`y`{`j`y`j`y`a`a`a`a", +"atatatatae`y`j`{`j`{`y`j`{`y`y`j`{`ya``j`{`w`y`j`y`y`{`q`y`j`j`y`j`w`{`yae`y`{`j`y`{`j`y`j`{`y`j`yae`y`y`j`y`wae`yae`wae`y`ja`ad`j`pa``j`q`y`yae`w`y`y`y`j`y`r`y`y`w`}`}`}`}`}`}`}`q`y`y`y`j`w`{`y`jar`y`{`j`w`{`yar`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`yada`adad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}a``j`y`wadad`gadad`s`y`j`gajadadagadadadad`y`w`j`y`y`w`j`y`q`{`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`j`y`j`g`}`}`}`}`}`}`}`}ad`}`}`}`}`}`}`}`}`}`}`}`ya``q`}`}`}`}`}`}`}`}`}`w`j`j`y`{`q`}`}`}`}`}`}`}`}`w`{`y`y`q`{`yae`y`}`}`}`}`}`}`}`}`}`}`{`y`wae`y`}`}`}`}`}`}`}`}`}`y`jar`y`j`y`q`y`y`{`j`w`{`y`q`y`y`j`}`}`}`}`}`}`}`y`jar`j`w`j`w`{`j`yar`j`y`j`y`s`j`{`y`q`y`y`jar`y`j`w`j`y`{`q`{`{`}`}`}`}`}`}`}`}`}`{`j`w`y`}`}`}`}`}`}`}`}`}`}`y`j`q`{`yae`}`}`}`}`}`}`}`{`yar`j`}`}`}`}`}`}`}`}ad`pad`jad`}`}`}`}`}`}`}ad`gadadad`j`}`}`}`}`}`}`}`}`y`y`{`}`}`}`}`}`}`}`}`}`}`}`}`}`yae`w`y`y`}`}`}`}`}`}`}`{`j`y`}`}`}`}`}`}`}`}`}`}`j`w`j`ya``y`}`}`}`}`}`}`}`}`}`}`}`j`w`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ad`j`w`{`y`j`y`jar`y`y`y`}`}`}`}`}`}`}`}`j`y`}`}`}`}`}`}`}`}`}`}`}`j`j`y`j`w`y`j`s`y`ja`adadajadadada`ad`yad`y`jad`y`y`j`y`j`y`j`w`j`j`{`y`q`y`j`y`q`y`w`j`y`j`yad`j`yadad`yad`j`y`j`y`j`y`y`j`j`y`y`y`j`y`j`y`j`y`j`y`y`y`j`y`y`y`j`y`y`j`a`a`a`a", +"atatatat`y`j`y`y`jar`yae`w`{ae`yae`w`j`y`j`yae`wae`y`j`y`y`wae`y`y`j`q`y`wae`y`y`j`wae`w`y`jar`j`y`j`y`q`y`j`y`y`j`y`y`j`y`j`w`jad`jad`jad`ja``j`j`j`wae`y`y`j`{`j`y`}`}`}`}`}`}`}`jae`w`yae`y`y`q`{`j`y`{`yae`y`qak`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`jadadagadag`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`yadad`j`y`qadadajad`jadad`p`gajad`g`jadad`yae`w`j`y`j`y`j`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`y`w`j`}`}`}`}`}`}`}`}`y`j`}`}`}`}`}`}`}`}`}`}`y`j`j`w`}`}`}`}`}`}`}`}`j`y`q`yae`j`}`}`}`}`}`}`}`}ae`y`r`y`j`w`jar`{`j`}`}`}`}`}`}`}`}`}`y`j`y`q`y`}`}`}`}`}`}`}`}ae`y`j`y`r`y`w`j`j`j`y`w`j`{`y`q`{`j`y`}`}`}`}`}`}`}`y`j`yae`y`qah`w`j`yae`w`j`{`j`{`y`j`y`{`q`y`j`y`j`{`j`y`r`y`y`j`r`y`}`}`}`}`}`}`}`}`}`wae`j`}`}`}`}`}`}`}`}`}`}`}`{`y`y`q`}`}`}`}`}`}`}`}`j`y`y`j`}`}`}`}`}`}`}`}`yad`qa`ad`}`}`}`}`}`}`}ad`padada``j`}`}`}`}`}`}`}`}`j`q`}`}`}`}`}`}`}`}`}`}`}`}`}`j`y`j`j`w`j`}`}`}`}`}`}`}`jar`y`}`}`}`}`}`}`}`}`}`}`j`y`j`j`w`j`ja``}`}`}`}`}`}`}`}`}`j`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`y`q`j`w`y`y`j`j`y`j`}`}`}`}`}`}`}`q`y`j`}`}`}`}`}`}`}`}`}`}ad`ja``j`y`j`y`y`j`j`j`yadadadadajadad`j`j`j`y`y`j`y`j`y`j`yad`y`j`y`j`y`j`y`j`y`j`y`j`y`j`w`j`jad`yad`j`jad`ja``j`y`j`y`j`y`j`y`j`j`y`j`y`j`j`y`j`y`j`yae`y`j`j`yae`y`j`j`a`a`a`a", +"atatatat`y`j`y`q`{`j`y`j`{`j`y`{`j`{`y`j`{`j`w`j`y`j`{`wae`j`y`{`q`y`{`j`y`j`y`r`y`j`y`y`j`j`j`y`wae`y`j`{`y`j`w`j`{`q`yae`w`j`y`yadad`w`y`jar`y`j`w`y`j`y`jar`j`y`q`}`}`}`}`}`}`}`y`y`j`w`j`{`q`y`j`{`y`wae`y`w`{`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}adag`gag`g`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ad`jad`w`y`jad`yad`gadad`jad`g`gadad`gajad`pad`y`q`y`y`j`w`y`q`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`w`y`j`}`}`}`}`}`}`}`}`j`w`}`}`}`}`}`}`}`}`}`}`y`y`j`y`}`}`}`}`}`}`}`}`w`ja``w`j`y`}`}`}`}`}`}`}`y`y`r`y`{`yae`y`{`y`j`{`}`}`}`}`}`}`}`}`y`{`j`y`y`}`}`}`}`}`}`}`}`y`j`w`j`y`yae`w`y`y`wae`y`j`wae`y`y`q`}`}`}`}`}`}`}`y`jar`y`j`yar`j`y`w`j`y`y`w`y`jar`j`w`j`y`j`w`yae`w`y`q`yae`y`q`y`y`}`}`}`}`}`}`}`}`}ae`y`}`}`}`}`}`}`}`}`}`}`}`}`}`w`j`y`}`}`}`}`}`}`}`y`{`j`y`q`}`}`}`}`}`}`}`}`jadad`j`j`}`}`}`}`}`}`}`jadada`ae`j`}`}`}`}`}`}`}`}`y`y`}`}`}`}`}`}`}`}`}`}`}`}`j`y`y`q`y`y`j`}`}`}`}`}`}`}`yae`y`}`}`}`}`}`}`}`}`}`}`y`y`q`y`j`y`jad`y`}`}`}`}`}`}`}`}ae`y`w`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`w`y`j`y`j`y`q`j`y`w`j`}`}`}`}`}`}`}`j`y`y`}`}`}`}`}`}`}`}`}`hadadad`y`j`y`j`j`y`j`wa``jadad`gad`~adada`ad`y`y`j`y`y`j`y`j`y`y`j`y`y`w`j`y`y`j`w`j`y`y`j`y`j`y`y`jad`yad`yad`ja``j`y`j`y`y`ja``j`y`j`y`y`j`y`y`y`y`j`y`j`y`y`y`j`y`y`j`y`a`a`a`a", +"atatatat`j`y`j`y`j`y`yae`w`j`y`q`y`r`y`q`{`j`y`y`r`y`y`jar`y`j`y`j`w`{`y`q`yae`w`y`q`{`q`y`y`j`w`j`{`j`y`jar`j`y`j`y`{`q`y`{`p`j`yad`j`jad`y`j`j`y`j`w`j`}`}`}`}`}`}`}`}`}`}`}`}`}`q`{`y`j`w`j`{`y`{`q`y`{`j`{`j`w`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}adada``jad`}`}`}`}`}`}`}`}`}`}`}`}`j`jad`y`j`yad`yad`ja``q`jad`y`jadadadad`jad`gajad`gad`gadad`j`{`j`y`r`y`y`j`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`y`}`}`}`}`}`}`}`}`y`j`}`}`}`}`}`}`}`}`}`}`j`w`j`y`}`}`}`}`}`}`}`}`}`y`j`y`q`j`}`}`}`}`}`}`}`y`y`y`r`{`y`wae`w`{`y`j`}`}`}`}`}`}`}`}`j`w`j`y`w`}`}`}`}`}`}`}`}`r`y`j`j`y`j`y`j`w`j`{`j`y`wae`y`q`{`j`}`}`}`}`}`}`}`j`y`j`w`y`j`y`j`j`yar`j`y`q`y`j`y`{`j`y`j`{`j`w`j`y`j`{`y`w`j`j`y`j`y`}`}`}`}`}`}`}`}`}ar`}`}`}`}`}`}`}`}`}`}`}`}`}`j`y`}`}`}`}`}`}`}`}`q`{`yae`y`}`}`}`}`}`}`}`}`p`y`ja``j`}`}`}`}`}`}`}adadad`p`j`j`y`}`}`}`}`}`}`}`j`w`}`}`}`}`}`}`}`}`}`}`}`j`w`j`yae`j`w`j`}`}`}`}`}`}`}`w`j`y`q`}`}`}`}`}`}`}`}`w`j`y`j`y`w`jad`j`y`j`}`}`}`}`}`}`}`yae`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}a``j`y`y`j`y`j`y`y`}`}`}`}`}`}`}`}`j`w`j`}`}`}`}`}`}`}`}adag`g`j`j`yad`q`y`yad`j`j`yad`jadadadadad`yad`j`j`j`y`j`y`j`j`y`j`y`j`j`y`j`w`j`y`j`y`j`w`j`y`y`q`j`y`jadad`jad`jadadad`j`j`y`j`y`j`y`j`j`y`j`y`j`y`j`y`y`j`y`j`y`y`j`y`j`y`j`a`a`a`a", +"atatatat`j`y`j`y`j`j`y`j`{`y`q`y`j`y`j`j`y`y`q`{`y`yae`w`y`j`y`q`{`yae`j`w`j`y`y`j`y`j`{`yar`j`{`yae`w`y`j`y`j`y`j`w`j`y`j`{`j`y`q`j`yad`pad`j`y`q`y`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}ae`y`y`j`y`{`j`y`q`{`y`r`y`{`q`}`}`}`}`}`}`}`}`}`}`}`wae`y`}`}`}`}`}`}`}`}`}`}`}adad`j`y`}`}`}`}`}`}`}`}`}`}`}`j`j`ja``j`y`qa``j`qa``j`y`ja``p`j`wa`adadadad`gadadadagadadajad`y`w`y`j`y`j`y`qad`w`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`q`}`}`}`}`}`}`}`}`j`y`}`}`}`}`}`}`}`}`}`}`y`y`{`j`y`}`}`}`}`}`}`}`}`j`y`p`y`j`}`}`}`}`}`}`}`yar`j`{`y`wae`y`{`yae`}`}`}`}`}`}`}`}`}`yae`y`w`j`}`}`}`}`}`}`}`}`y`j`yar`j`w`j`y`j`yae`wad`{`y`q`y`y`{`}`}`}`}`}`}`}`j`j`w`j`{`q`y`{`q`y`{`j`j`{`j`y`w`j`{`q`yar`y`j`y`y`j`w`{`j`y`yar`j`w`}`}`}`}`}`}`}`}`}`j`}`}`}`}`}`}`}`}`}`}`}`}`}`y`y`}`}`}`}`}`}`}`}`j`y`j`y`w`j`}`}`}`}`}`}`}`y`j`y`j`w`}`}`}`}`}`}`}`p`jadada``j`y`}`}`}`}`}`}`}`w`y`}`}`}`}`}`}`}`}`}`}`y`yae`y`y`q`y`j`y`}`}`}`}`}`}`}`j`{`y`j`y`}`}`}`}`}`}`q`y`y`j`y`q`yad`j`w`jad`}`}`}`}`}`}`}`}`w`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`w`j`j`w`yae`y`q`}`}`}`}`}`}`}`}`j`y`j`}`}`}`}`}`}`}`}`}ag`gad`ja``j`y`ja``j`j`y`yad`j`yadadadadadadadad`y`j`yad`y`j`y`j`y`j`y`j`y`j`y`j`y`j`y`j`y`j`y`j`y`y`yad`j`yada``j`yad`yad`y`jad`y`j`y`j`y`y`j`y`y`j`j`y`j`y`j`yae`j`y`y`y`j`a`a`a`a", +"atatatat`y`j`{`w`{`j`w`j`yae`y`y`j`q`y`y`j`y`j`wae`y`j`yae`y`{`j`j`w`y`{`{`q`{`j`wae`y`j`w`{`j`y`y`{`j`w`j`y`q`y`j`y`j`p`jad`y`j`y`p`ja`ad`j`s`j`y`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}ad`wae`y`q`y`j`y`yae`y`{ad`{`}`}`}`}`}`}`}`}`}`}`}`}`y`y`w`y`}`}`}`}`}`}`}`}`}`}`}`y`p`j`}`}`}`}`}`}`}`}`}`}ad`y`s`jad`jad`j`ja``j`j`j`s`j`ja``jad`j`sadadadad`g`gadad`gadag`g`jad`w`j`y`p`{`y`jad`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ad`w`}`}`}`}`}`}`}`}`}`}`j`w`j`y`q`y`}`}`}`}`}`}`}`y`j`y`y`q`}`}`}`}`}`}`}`{`w`j`{ae`y`y`r`y`yae`}`}`}`}`}`}`}`}`}`y`qae`y`y`}`}`}`}`}`}`}`}`j`y`j`j`y`{`wae`j`y`y`j`w`yae`j`w`j`q`}`}`}`}`}`}`}`q`y`j`j`y`yae`y`j`w`j`wae`y`q`y`j`y`q`y`{`jar`j`w`j`y`j`w`j`q`y`y`j`y`q`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`{`}`}`}`}`}`}`}`y`q`j`j`j`ja``}`}`}`}`}`}`}`j`yad`j`y`}`}`}`}`}`}`}adadad`jadad`{`}`}`}`}`}`}`}ae`w`}`}`}`}`}`}`}`}ae`w`j`j`wae`y`j`y`j`w`}`}`}`}`}`}`}`y`j`y`j`}`}`}`}`}`}`y`j`j`y`yae`y`j`y`j`yad`w`}`}`}`}`}`}`}`}`{`j`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`y`j`y`j`y`q`y`}`}`}`}`}`}`}`}`}`j`w`j`}`}`}`}`}`}`}`}`}`}`}adad`j`yad`j`yad`j`j`yad`j`jahadadadad`jad`yad`j`y`y`j`y`j`y`q`y`y`y`j`j`y`j`y`q`y`j`j`y`y`j`j`jad`yadad`jadadadadadad`j`ja``j`ja``j`y`j`y`j`y`j`y`j`y`j`y`j`y`y`j`y`j`y`a`a`a`a", +"atatatat`y`{`j`j`y`jad`j`yae`y`q`y`y`j`yae`w`yae`yar`yaear`y`q`y`y`{`{`j`j`y`y`w`j`y`wae`y`j`yae`y`q`{`jar`y`j`y`j`w`jad`yadad`p`y`jad`jad`j`y`j`j`w`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`y`y`j`j`y`}`}`}`}`}`}`}`}`}`}`p`{ad`}`}`}`}`}`}`}`}`}`wadad`j`y`j`wad`y`p`y`q`y`jad`y`j`yad`q`y`jad`jad`gadaj`gadadad`gadadad`j`j`y`yad`j`w`y`jadad`p`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`qad`}`}`}`}`}`}`}`}`}`{`{`y`jar`y`{`}`}`}`}`}`}`}`}`y`y`q`{`}`}`}`}`}`}`}`j`y`yae`w`yar`y`{`y`}`}`}`}`}`}`}`}`}`}`q`y`j`y`j`}`}`}`}`}`}`}`}`{`y`w`y`y`q`{`ja``wae`w`j`{`j`w`y`j`y`}`}`}`}`}`}`}`y`j`y`j`y`q`y`j`w`y`{`j`y`w`yae`y`wae`y`q`{`j`y`y`y`j`y`wae`y`y`j`{`q`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`}`}`}`}`}`}`}`jad`y`jad`s`j`}`}`}`}`}`}`}`j`y`j`w`j`}`}`}`}`}`}`}ad`y`jadadad`j`}`}`}`}`}`}`}`y`j`}`}`}`}`}`}`}`w`j`y`j`y`y`j`y`j`{`y`j`}`}`}`}`}`}`}`y`{`q`}`}`}`}`}`}`}`j`y`w`j`j`w`j`w`j`wad`y`j`}`}`}`}`}`}`}`}`j`w`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ad`j`y`q`y`j`j`y`}`}`}`}`}`}`}`}`}`j`y`y`}`}`}`}`}`}`}`}`}`}`}`}adadad`j`y`j`y`j`y`p`y`ja`adad`jada`ad`ja`ad`j`y`j`y`j`y`j`yae`y`j`y`j`y`w`j`y`j`y`y`j`y`j`y`y`yad`ja`adad`ja``jad`ja``j`ja``j`y`j`y`j`j`y`j`y`j`y`j`y`y`j`y`j`{`j`y`y`a`a`a`a", +"atatatat`j`{ad`y`j`y`j`y`q`y`{`y`j`{`q`y`{`j`yar`j`y`y`y`j`{`y`q`{`j`w`y`j`yae`y`y`j`{`w`j`yae`w`j`y`{`j`y`waeadad`j`jadad`ja``y`q`ja``sad`ja`ad`y`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`{`w`j`w`j`y`j`}`}`}`}`}`}`}`}`}`}adadad`}`}`}`}`}`}`}`}`y`j`yad`p`j`yad`y`j`ja`ad`y`qa``j`w`ja``y`jad`w`jad`pad`gagad`gadagadad`gadad`j`j`y`j`{`w`y`jada``j`j`y`q`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}adad`}`}`}`}`}`}`}`}`}`j`w`j`y`j`j`y`{`}`}`}`}`}`}`}`j`{`y`j`}`}`}`}`}`}`}`w`j`y`j`{`j`y`r`y`y`}`}`}`}`}`}`}`}`}`}`y`q`ja``j`}`}`}`}`}`}`}`}`j`j`{`q`{`y`q`{`j`y`j`j`w`yae`y`w`j`{`}`}`}`}`}`}`}`ja``j`q`j`y`j`j`j`w`y`j`y`j`w`y`j`y`q`y`yar`j`w`{`r`y`j`y`q`y`y`q`j`y`y`q`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ad`}`}`}`}`}`}`}`jada``jad`y`p`}`}`}`}`}`}`}`j`qa``j`y`}`}`}`}`}`}`}ad`j`y`qadad`j`}`}`}`}`}`}`}ae`y`}`}`}`}`}`}`}`y`j`j`w`jar`j`w`j`w`j`y`}`}`}`}`}`}`}`q`y`{`}`}`}`}`}`}`}`}`y`y`y`j`y`y`j`y`j`j`p`y`}`}`}`}`}`}`}`}`y`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`y`j`y`wad`}`}`}`}`}`}`}`}`}`j`y`q`y`}`}`}`}`}`}`}`}`}`}`}`}`}adadad`ja``j`j`yad`y`j`yad`jadadadad`jad`jad`y`j`y`j`yad`w`j`y`j`j`y`y`j`y`y`j`q`y`w`y`j`q`y`jad`ja``jad`yad`ja``jad`jad`jad`y`j`y`j`y`y`j`y`j`y`j`j`y`y`j`{`y`jah`j`a`a`a`a", +"atatatat`j`y`j`j`yad`ja`adae`{`yar`j`j`y`q`j`y`j`{`y`q`{`r`y`j`yae`y`yae`jar`yar`j`yar`j`y`{`w`j`y`yae`y`q`y`jadadadad`g`j`w`j`j`j`y`j`j`y`j`j`w`j`jad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`y`j`w`y`{ae`y`w`}`}`}`}`}`}`}`}`}adad`j`}`}`}`}`}`}`}`ja``jad`w`ja``jadad`w`j`y`j`q`ja``j`ja``jad`j`yadadad`jad`gagagad`jad`padadagadadad`q`y`w`j`j`s`j`y`qad`y`w`j`y`y`q`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ad`j`}`}`}`}`}`}`}`}`}`y`j`w`{`{`y`w`j`}`}`}`}`}`}`}`y`w`j`y`}`}`}`}`}`}`}`{`j`wae`w`{`wae`yar`}`}`}`}`}`}`}`}`}`}`q`j`y`y`y`}`}`}`}`}`}`}`}ad`y`wae`y`j`y`j`y`y`y`q`{`y`j`w`j`y`y`}`}`}`}`}`}`}`yae`w`j`y`ja``j`w`y`j`r`y`y`jae`w`j`yae`w`j`yae`y`jad`y`q`y`jar`y`j`y`q`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}a``qad`j`s`jad`}`}`}`}`}`}`}`jad`y`j`j`}`}`}`}`}`}`}`ja``w`j`ja`ad`}`}`}`}`}`}`}`y`q`}`}`}`}`}`}`}`j`y`q`y`j`y`j`y`j`y`j`y`}`}`}`}`}`}`}`j`{`j`}`}`}`}`}`}`}`}`j`{`j`q`y`j`j`qad`y`j`j`y`}`}`}`}`}`}`}`wae`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}adadad`y`j`j`}`}`}`}`}`}`}`}`}`yad`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}ad`j`yad`j`yad`y`jad`j`ja``j`y`~`ja`ad`yad`j`y`j`y`j`y`j`j`y`y`j`y`j`y`j`q`y`j`y`j`y`j`y`y`j`ja``jad`ja``jad`jad`ja``j`ya``j`j`y`j`y`j`y`j`y`j`y`y`j`y`j`y`jah`j`y`a`a`a`a", +"atatatat`y`j`y`j`yae`ja``y`j`q`{`yae`y`j`{`j`y`j`q`{`y`yae`yar`y`r`y`y`{`y`y`jae`y`y`jar`j`y`{`j`{`w`j`{`y`q`j`y`padadadad`y`{`s`y`jarad`y`q`yad`y`ja``j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`w`y`jae`y`wae`y`j`y`q`}`}`}`}`}`}`}`}adadad`}`}`}`}`}`}`}`qad`y`jad`y`qad`yad`j`y`pa``y`j`q`y`j`y`p`yad`q`y`yad`y`p`jad`nag`g`jadadada``uadada``j`y`j`y`y`q`yad`y`j`y`jar`j`y`w`j`w`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`w`}`}`}`}`}`}`}`}`wae`y`q`{`q`yae`}`}`}`}`}`}`}`y`jar`y`}`}`}`}`}`}`}`yar`y`{`j`y`yae`}`}`}`}`}`}`}`}`}`}`}`}`}`w`j`r`y`y`}`}`}`}`}`}`}`j`yad`w`j`w`{`j`q`y`j`{`q`y`j`{ar`j`w`}`}`}`}`}`}`}`w`j`y`y`q`y`q`y`j`j`y`j`{`w`j`y`y`wae`y`y`q`y`j`w`j`w`y`y`j`y`j`w`j`{`y`{`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}adadad`jad`jad`}`}`}`}`}`}`}`j`p`yad`q`}`}`}`}`}`}`}`w`j`y`j`p`yad`}`}`}`}`}`}`}`y`j`}`}`}`}`}`}`}`y`yae`j`y`y`j`y`y`jar`j`}`}`}`}`}`}`}`y`j`w`}`}`}`}`}`}`}`}`}`j`y`j`y`w`ja`ad`j`wad`y`}`}`}`}`}`}`}`y`j`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`y`j`y`j`}`}`}`}`}`}`}`}`jad`y`j`yad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`yad`j`yad`y`j`y`jad`y`j`yad`jadad`ja`adad`j`y`y`j`y`j`y`j`y`j`y`y`j`y`j`y`w`j`y`j`y`y`jad`y`jad`da``ja``y`jad`ja``ja``ja``j`j`y`j`y`j`y`j`y`y`j`y`y`y`j`y`j`a`a`a`a", +"atatatat`j`y`q`yad`j`y`waead`j`y`y`{`j`w`j`j`s`j`y`j`y`y`j`{`j`w`{`j`y`j`wae`w`{`j`w`yae`y`y`j`y`q`{`j`y`jar`j`yadadad`y`q`y`j`j`y`q`ja``j`j`y`j`w`j`j`w`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`j`w`j`y`qad`y`j`y`w`j`}`}`}`}`}`}`}`}`ia``j`}`}`}`}`}`}`}`jadad`j`y`ja``j`j`sad`jad`j`j`j`yadad`j`y`j`q`yad`y`q`j`j`yad`g`gacadada``j`qad`jad`qad`jad`w`j`y`j`j`w`j`w`j`y`j`wad`{`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}adad`}`}`}`}`}`}`}`}`y`j`y`j`yae`y`w`{`}`}`}`}`}`}`y`{`j`y`}`}`}`}`}`}`}`q`{`j`y`{`q`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`q`{`y`j`{`}`}`}`}`}`}`}ae`y`q`y`j`j`w`j`{`j`w`y`j`{`q`y`j`y`j`}`}`}`}`}`}`}`j`y`{`j`j`y`j`}`}`}`}`qa`ae`y`j`y`j`w`j`w`j`{`y`q`y`{`j`q`{`j`w`yae`y`j`wae`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`pad`j`ja``y`}`}`}`}`}`}`}`jad`jad`j`}`}`}`}`}`}`}`j`y`y`j`y`jad`}`}`}`}`}`}`}`y`j`}`}`}`}`}`}`}`}`j`y`j`w`y`q`j`w`j`j`}`}`}`}`}`}`}`}`j`w`j`}`}`}`}`}`}`}`}`}`q`y`j`w`j`y`j`y`jad`j`}`}`}`}`}`}`}`}`y`j`{`w`}`}`}`}`}`}`}`}`}`}`}`}`}`g`}`}`}`}`}`}`}adadad`j`}`}`}`}`}`}`}`}`}ad`y`j`q`y`j`w`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`yad`j`j`j`yad`j`yad`jad`yad`jadadad`j`yad`ja``j`j`j`y`j`y`j`y`j`y`j`y`j`y`j`y`j`j`j`y`jadad`yad`yad`jad`j`yad`jad`j`jad`y`j`y`j`j`y`j`j`y`j`j`y`j`y`j`y`a`a`a`a", +"atatatat`j`y`{`j`yad`j`j`y`j`y`q`{`j`{`y`q`yae`yae`w`jar`y`{`y`j`j`{ar`yae`y`y`q`{`j`w`j`{`w`j`{`y`j`w`{`y`y`r`y`j`jadadadad`w`ja``j`{`wad`yad`y`j`y`w`y`j`w`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`{`y`j`w`j`y`j`j`jad`y`j`}`}`}`}`}`}`}`}`}`g`q`}`}`}`}`}`}`}`w`y`pad`q`y`j`p`{ad`y`jad`s`j`ja``wad`ja`ad`j`y`p`y`ja``w`j`j`wa`ag`gad`y`j`ya``q`ya``}`}`}`}`}`}`}`}`j`y`q`y`j`y`j`w`{`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`}`}`}`}`}`}`}`}`{`w`{`w`{`j`y`{`q`}`}`}`}`}`}`}`{adah`}`}`}`}`}`}`}`}`}`}`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`q`y`w`j`}`}`}`}`}`}`}`w`j`y`{`y`y`q`y`j`y`j`w`y`y`jar`y`j`y`}`}`}`}`}`}`}`y`{`q`y`y`q`}`}`}`}`}`}`y`q`y`q`y`j`y`j`{`y`j`y`y`q`y`y`y`q`yae`y`y`w`j`y`j`}`}`}`}`}`}`}`}`}`}`}`}`w`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`y`pad`wad`j`}`}`}`}`}`}`}`j`wa``j`p`}`}`}`}`}`}`}`}`y`q`j`y`w`j`}`}`}`}`}`}`}`j`y`}`}`}`}`}`}`}`}`}`j`y`j`y`y`j`y`y`j`}`}`}`}`}`}`}`}`y`j`w`j`}`}`}`}`}`}`}`}`}`j`y`j`y`q`ja``p`j`y`}`}`}`}`}`}`}`}`{`j`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`gad`}`}`}`}`}`}`}`}ad`j`}`}`}`}`}`}`}`}`j`j`y`y`j`j`y`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ad`y`yad`y`j`y`j`y`j`yad`y`yad`yadadad`j`y`j`ja``j`y`j`y`j`w`j`y`j`w`j`y`j`y`y`j`y`j`y`ja``j`j`ja``j`y`y`j`y`jad`ya``j`j`y`ja``y`y`j`y`y`j`y`j`y`j`y`j`y`a`a`a`a", +"atatatat`y`j`j`y`j`j`y`ja`ad`j`j`y`j`w`j`y`j`y`j`w`j`y`yae`y`q`{`y`ja``j`j`w`y`j`j`y`j`y`{`q`y`j`j`w`{`j`{`wae`y`w`gadadadad`j`j`w`j`y`j`j`y`j`jadad`j`j`j`j`j`yad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`jadad`yadadadadadadad`}`}`}`}`}`}`}`}`}aaab`}`}`}`}`}`}`}`j`yad`y`jad`y`j`j`y`padadad`g`j`wad`j`y`q`y`j`j`yad`q`yad`j`y`j`y`jag`g`j`j`y`q`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`j`j`w`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ad`}`}`}`}`}`}`}`}`j`{`j`{`j`yar`j`y`}`}`}`}`}`}`}`}`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`{`j`y`}`}`}`}`}`}`}`j`{`j`w`j`r`y`j`y`j`wae`yae`w`y`j`y`q`}`}`}`}`}`}`}`y`q`y`j`w`}`}`}`}`}`}`}`}`w`j`y`j`{`y`q`y`j`{`q`y`j`j`{`q`yae`y`y`q`j`y`j`j`y`}`}`}`}`}`}`}`}`}`}`}`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`jada``j`jad`y`}`}`}`}`}`}`}`}`yadad`j`}`}`}`}`}`}`}`}`j`j`y`y`jad`}`}`}`}`}`}`}`j`r`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`y`j`{`}`}`}`}`}`}`}`}`}`}`j`y`q`j`yad`j`}`}`}`}`}`}`}`}`}`}`q`j`r`y`j`}`}`}`}`}`}`}`}`}`}`}`}adag`}`}`}`}`}`}`}`}`}`g`}`}`}`}`}`}`}`}`j`y`j`j`s`j`y`y`q`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`j`j`y`j`j`yad`y`j`y`j`j`jad`j`jad`yad`ja``j`y`j`y`j`j`y`y`q`y`j`y`j`j`w`j`y`ja``jad`j`y`ja``j`y`jad`j`yad`j`y`j`j`j`y`j`j`y`j`j`y`j`y`j`y`j`y`j`y`j`a`a`a`a", +"atatatat`y`j`y`y`j`y`j`w`j`yad`w`yae`y`y`q`y`j`yad`{`q`y`j`{`j`w`j`{`qa`ae`y`j`w`j`y`j`y`j`y`j`w`y`j`j`w`j`y`y`j`y`j`gad`pad`y`y`j`{`q`y`q`y`y`q`y`j`y`pad`yad`q`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ad`yadadadadadadadadagad`}`}`}`}`}`}`}`}`}acaa`}`}`}`}`}`}`}`j`w`ja``j`y`p`y`j`yad`ja``padad`jad`yada``qa``j`p`y`j`j`sad`j`w`yadad`g`g`j`j`yad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`}`}`}`}`}`}`}`}`}ad`}`}`}`}`}`}`}`}`wae`y`w`j`{`yar`j`}`}`}`}`}`}`}`}`}`w`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`w`y`}`}`}`}`}`}`}`y`w`{`y`y`{`q`y`y`w`j`y`{`j`{`q`j`y`y`}`}`}`}`}`}`}`{`j`y`y`j`}`}`}`}`}`}`}`}`}`y`w`j`j`y`y`q`y`w`j`y`w`j`y`y`q`y`j`y`jar`j`y`w`j`}`}`}`}`}`}`}`}`}`}`}`y`j`w`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`qad`y`jad`y`}`}`}`}`}`}`}`}`jad`y`p`}`}`}`}`}`}`}`}`}`w`j`j`wad`}`}`}`}`}`}`}`}`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`w`j`y`y`}`}`}`}`}`}`}`}`}`y`y`y`jad`}`}`}`}`}`}`}`}`}`}`}`}`y`y`y`j`y`}`}`}`}`}`}`}`}`}`}`}`}`gadag`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`j`y`y`j`y`j`w`j`y`y`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}a``j`y`yad`ja``j`j`ya``j`y`yadad`yad`jad`yad`ja``j`y`j`y`j`y`j`y`y`j`y`j`y`j`y`ja``j`y`j`y`j`y`j`y`yad`y`yad`y`ja``y`~`yad`j`y`j`y`d`y`j`y`y`j`y`y`y`a`a`a`a", +"atatatat`j`y`j`y`j`j`y`j`j`y`j`y`j`j`yae`w`{`{`j`w`j`y`j`q`{`y`y`y`j`y`y`j`y`q`y`jadadad`j`y`q`y`j`j`w`{`j`{`w`j`y`qad`y`jad`j`j`pad`j`yad`y`j`j`wad`yadadad`j`yadad`}`}`}`}`}`}`}ad`w`jad`y`qad`jadad`}`}`}`}`}`}`}`}`}`}`}`jadadadad`jadad`q`gadad`}`}`}`}`}`}`}`}`}ag`m`}`}`}`}`}`}`}ad`jad`j`w`j`j`y`jad`y`q`y`jadadadad`j`j`p`y`j`jadad`yadad`ja``jad`j`gag`gag`y`q`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`}`}`}`}`}`}`}`}`}`j`}`}`}`}`}`}`}`w`j`{`y`j`{ar`j`y`j`}`}`}`}`}`}`}`}`}`w`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ae`y`j`}`}`}`}`}`}`}`w`{`j`y`r`j`y`y`qae`y`j`w`j`q`y`{`j`w`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`j`y`w`j`j`y`j`y`r`y`j`{`j`j`y`{`q`y`j`y`w`j`y`}`}`}`}`}`}`}`}`}`}`}ae`y`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`w`j`ja``j`s`j`}`}`}`}`}`}`}`}ad`w`jad`}`}`}`}`}`}`}`}`}`j`j`w`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`w`j`y`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`y`q`j`y`q`}`}`}`}`}`}`}`}`}`}`}`}`k`gaj`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`y`y`j`y`j`w`j`j`y`j`y`q`jadad`}`}`}`}`}`}`}`}`}`}`}`}`j`y`y`j`j`y`y`j`ya``j`y`j`jad`y`ja``j`jad`yad`j`yad`j`y`j`yad`j`yad`j`y`jad`j`yad`j`ja``jad`j`y`j`j`y`j`j`yad`j`j`y`j`j`j`y`j`y`j`y`j`y`j`y`j`y`d`y`a`a`a`a", +"atatatat`y`j`w`j`y`j`y`j`y`j`j`j`y`yae`j`y`jar`y`j`{`ja``y`r`j`y`q`yae`w`yae`yad`yadadadad`j`y`y`y`jad`j`y`j`y`{ae`wadad`p`y`y`j`y`wad`j`wad`y`j`j`q`yadad`jadadadad`}`}`}`}`}`}`}`jadad`yadadadadadadadad`g`}`}`}`}`}`}`}`}`}`}ad`p`y`j`w`j`y`y`wad`}`}`}`}`}`}`}`}`}ad`y`}`}`}`}`}`}`}`j`y`yad`j`wadadadad`gad`jadad`jadadadadad`y`qa``j`p`y`ja``j`qadadadadadag`hadad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`j`}`}`}`}`}`}`}`}a`ad`}`}`}`}`}`j`y`sae`y`y`j`y`r`y`y`}`}`}`}`}`}`}`}`}`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`{`w`}`}`}`}`}`}`}`w`j`{`y`yae`y`y`y`r`y`y`j`y`y`wae`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`j`j`y`w`j`y`y`y`j`w`y`q`y`j`w`j`y`w`j`{`j`wae`}`}`}`}`}`}`}`}`}`}`}`q`yad`w`}`}`}`}`}`}`}`}`}`}`}`}`}`y`j`q`y`j`ja``}`}`}`}`}`}`}`}`j`ja``ja``}`}`}`}`}`}`}`}`y`j`y`j`w`}`}`}`}`}`}`}`}`}`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`j`wae`y`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`j`y`yar`j`}`}`}`}`}`}`}`}`}`}`}aj`gag`h`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`j`y`j`y`j`j`y`y`q`y`j`y`y`jad`g`}`}`}`}`}`}`}`}`}`}`}`j`y`y`y`j`y`j`y`j`w`j`y`y`j`j`j`y`j`y`y`j`jadad`y`jad`y`j`y`j`y`j`y`ja``y`j`ja``j`ja``j`y`y`y`j`y`y`j`y`j`y`y`ja``ja``j`ya``j`y`j`y`j`y`j`y`j`y`j`y`a`a`a`a", +"atatatat`j`{`j`y`j`y`j`y`jar`y`wad`j`y`j`p`y`j`yar`y`j`yae`y`j`w`{`j`y`j`y`j`y`jadadaj`gadajad`{`j`qa`adad`ja``j`q`{`y`jad`j`y`j`w`j`j`y`j`j`w`ja``j`y`p`yadadadad`p`}`}`}`}`}`}`}adadad`jadadadadad`padadad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`j`}`}`}`}`}`}`}`}`}`}`jada``}`}`}`}`}`}`}ad`j`q`y`j`yadadadadagag`~ad`y`wadada`adad`jad`y`p`y`jad`yad`yadad`gad`i`gadadad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`q`{`j`}`}`}`}`}`}`}`j`s`j`}`}`}`}`j`w`j`j`yae`w`j`y`wae`}`}`}`}`}`}`}`}`}`w`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`q`y`}`}`}`}`}`}`}`j`y`j`j`w`j`w`jar`j`y`j`w`j`j`w`y`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`y`j`w`y`j`q`y`j`q`j`j`yae`w`y`j`y`j`y`j`w`j`y`}`}`}`}`}`}`}`}`}`}`}`j`y`q`jad`}`}`}`}`}`}`}`}`}`}`}`}`j`padad`j`yad`}`}`}`}`}`}`}`}`wadadad`j`}`}`}`}`}`}`}`}a``jad`j`y`}`}`}`}`}`}`}`}`}`q`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`q`y`q`yad`{`j`w`{`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`w`j`w`{`j`y`y`}`}`}`}`}`}`}`}`}`}ad`g`hag`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ad`w`j`y`qad`y`j`w`j`y`j`q`y`jadad`g`}`}`}`}`}`}`}`}`}`}`j`y`j`j`y`q`y`j`y`j`y`j`j`s`y`ja``j`y`j`ja``j`y`ja``jad`yad`jada``jad`j`j`ja``j`j`y`j`y`j`j`y`j`y`j`y`j`j`y`d`j`j`j`y`j`y`j`j`y`j`y`jad`y`j`d`y`{`j`a`a`a`a", +"atatatat`j`y`j`j`j`y`j`jad`y`j`j`y`p`y`j`y`j`yae`y`y`r`y`y`wae`y`q`{`w`y`y`q`j`w`jad`g`g`j`g`gad`j`{`jadadadadad`j`yad`yadad`w`jada``q`j`yad`y`j`q`y`jadada`adada``j`}`}`}`}`}`}`}adadadad`jadadad`y`jad`jad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ae`y`j`}`}`}`}`}`}`}`jadad`s`j`y`qa``jad`gag`gagad`jadadad`jadad`y`j`j`y`j`w`j`q`y`j`padad`gagadadad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`{`y`q`y`}`}`}`}`}`}`}`y`jad`wadad`w`j`y`w`j`w`j`y`j`{`y`w`}`}`}`}`}`}`}`}ae`y`w`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`r`y`}`}`}`}`}`}`}`}a``j`{`j`}`}`}`}`}`}`}ar`jar`y`yae`{`y`j`j`w`y`j`{`j`w`j`y`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`j`y`j`y`y`y`q`y`y`y`q`y`j`y`q`y`j`w`y`j`y`w`j`}`}`}`}`}`}`}`}`}`}`}`y`j`y`jadad`}`}`}`}`}`}`}`}`}`}`wad`y`ja``q`j`y`w`}`}`}`}`}`}`}`j`j`pa`ad`}`}`}`}`}`}`}`}`qa``w`jad`}`}`}`}`}`}`}`}`}`j`w`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`{`y`j`w`y`j`y`j`w`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`jae`y`j`y`q`y`j`}`}`}`}`}`}`}`}`}`}`gagag`hag`}`}`}`}`}`}`}`}`}`}`}`}`}`}adadad`j`y`{`p`y`j`j`y`j`y`j`y`qadadad`g`}`}`}`}`}`}`}`}`}`{`j`y`j`y`y`j`y`j`y`j`y`j`j`y`j`y`jad`y`y`j`jad`y`j`y`j`y`j`w`jad`yada``j`j`y`j`y`j`y`j`y`j`y`j`y`j`y`j`yad`y`y`y`j`y`jad`y`j`y`j`y`d`y`y`j`yadah`j`a`a`a`a", +"atatatatae`y`y`y`j`w`y`w`j`y`y`j`j`y`{`j`y`sae`j`y`y`j`{`yae`y`j`y`yae`y`j`{`w`y`y`jadadadadadadad`j`yad`jadadad`jadad`jadadad`j`j`yad`y`j`s`j`yadad`jad`yad`j`p`j`j`}`}`}`}`}`}`}`jadad`yadada``jadad`pad`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`ya``j`}`}`}`}`}`}`}`y`yadadad`jad`y`jadad`gad`gag`gadaj`gadadad`g`j`y`y`q`y`ja``y`j`wa``j`j`p`g`g`pad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`y`q`{ad`j`}`}`}`}`}`}`j`p`j`jadadadad`j`j`w`j`y`y`y`j`w`y`}`}`}`}`}`}`}`{`y`q`y`j`{`}`}`}`}`}`}`}`}`}`}`}`}`}`}`w`j`{`y`j`}`}`}`}`}`}`j`y`j`j`w`}`}`}`}`}`}`}`j`y`{`j`yar`j`y`q`{`y`q`y`j`y`w`j`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`w`j`y`q`yae`w`j`y`j`w`j`y`j`w`y`j`q`y`y`j`w`j`y`j`}`}`}`}`}`}`}`}`}`}`j`yad`qadadad`}`}`}`}`}`}`}`}ad`yad`j`wad`y`j`wad`y`}`}`}`}`}`q`y`jadadad`}`}`}`}`}`}`}`}`jadad`j`j`y`}`}`}`}`}`}`}`}`y`j`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`w`{`q`y`j`y`q`y`y`j`q`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`w`j`y`y`q`{`j`j`w`j`}`}`}`}`}`}`}`}`}`gag`gag`gag`}`}`}`}`}`}`}`}`}`}`}`}`}`gajadad`y`j`j`y`ja``q`y`j`w`j`yadadadajadadad`}`}`}`}`}`}`j`y`j`y`y`j`y`j`y`y`j`w`j`y`j`y`j`y`y`j`y`ja``j`y`j`y`j`w`ja``j`y`j`y`j`yad`yad`y`jad`y`j`yad`j`j`y`yad`y`j`y`jad`y`jad`y`y`j`yadah`j`yad`j`y`jah`j`a`a`a`a", +"atatatat`j`j`y`j`y`{`j`{`j`q`y`ja``j`w`j`j`y`j`j`w`yar`j`y`y`q`y`y`j`j`y`yae`yar`{`j`padadad`jadadadadadadadadadadadadad`jad`|`q`jad`yad`j`yad`j`ja``jajad`gadah`pa``}`}`}`}`}`}`}ad`q`jad`padad`jadada``j`pad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ae`y`w`}`}`}`}`}`}`}`j`y`qadadadagadadadadadag`g`gagad`gaj`gagag`gag`h`j`y`j`w`j`y`j`j`w`y`jadad`yajadad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`{`j`w`yaea``y`y`j`p`}`}`}`}`y`jad`pa``j`wadad`pa``j`y`q`y`jar`j`y`}`}`}`}`}`}`}`w`{`y`q`yae`w`j`{`}`}`}`}`}`}`}`}`}`}`j`{`w`j`{`{`q`}`}`}`}`jar`y`j`y`j`w`}`}`}`}`}`}`y`q`{`y`j`yar`y`j`{`w`j`{`w`j`y`q`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`j`y`q`y`y`j`j`j`w`j`j`yad`w`{`j`y`{`j`j`w`j`y`j`j`w`}`}`}`}`}`}`}`}`}`p`j`s`y`jadadadad`}`}`}`}`}`}ad`jad`p`j`ja``j`j`y`q`y`j`w`y`j`ja``j`w`jad`gad`}`}`}`}`}`}aj`gadag`gadad`j`}`}`}`}`}`}`}`j`y`j`y`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`j`y`j`{`j`w`j`j`y`y`y`j`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`w`y`j`y`j`w`y`{`yae`}`}`}`}`}`}`}`}adag`g`iag`hag`g`}`}`}`}`}`}`}`}`}`}`}`}`g`i`gadadad`j`y`j`}`}`}`}`}`}`}`jadad`gag`~ad`}`}`}`}`}`}`j`y`j`j`y`j`w`y`j`y`j`y`y`q`y`j`y`j`y`j`y`j`y`j`y`j`j`y`j`y`j`y`j`y`j`y`j`j`y`j`y`j`y`j`j`y`y`j`j`y`j`j`y`j`y`j`y`j`y`j`y`j`j`y`ja``j`y`j`j`y`y`j`y`a`a`a`a", +"atatatat`j`y`j`yae`y`j`j`y`ya``j`{`q`yae`ya`ae`y`y`j`j`y`j`wae`{`w`j`y`w`j`w`j`{`y`j`{`yadadadad`g`jad`gadadadad`j`ja``w`ja``q`y`y`padad`y`pad`jadadad`pa`ad`qadad`y`}`}`}`}`}`}`}ad`ja`ad`y`j`sad`w`j`ja``j`yad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`yaea``}`}`}`}`}`}`}ad`q`ja``yadad`gad`j`j`gadag`~adagad`gadad`g`g`gac`had`j`j`y`q`y`y`j`y`jad`y`jadad`y`padadad`q`j`y`w`j`}`}`}`}`}`}`}`}`}`}`}`}`y`y`j`j`y`q`{`q`y`q`y`y`y`ja``j`jada`ad`j`jad`yad`j`j`y`j`q`y`j`y`r`y`}`}`}`}`}`w`j`{`j`y`y`w`j`y`w`jar`yae`yar`j`w`j`{`w`y`j`yar`j`w`y`{ar`j`y`y`j`y`q`y`j`{`}`}`}`}ae`y`{`w`j`y`q`yae`y`q`{`j`w`{`j`y`j`yad`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ad`y`q`y`j`j`y`q`y`y`y`y`y`q`y`j`j`y`j`w`yad`j`yadadad`q`}`}`}`}`}`}`}`jadadadadadad`p`gaj`gadadadadadadaj`g`g`iadadad`jad`y`j`y`j`j`q`y`j`y`{adadadagad`}`}`}`}ag`gadag`gag`i`gad`j`}`}`}`}`}ad`j`j`y`y`q`y`j`j`y`y`p`j`y`y`}`}`}`}`}`}`}`q`y`j`w`y`j`w`j`y`{`y`q`j`w`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`{`j`q`y`j`{`j`w`yae`y`j`w`j`}`}`}`}`}`}adaj`g`gag`hag`gag`g`}`}`}`}`}`}`}`}`}`}`gadagad`gajad`gad`}`}`}`}`}`}`}`}`}`}`}`gad`g`}`}`}`}`}`}`}`w`y`j`y`w`y`{`j`y`j`q`y`j`y`j`y`y`j`j`y`j`y`j`y`ja``ja``ja``jad`y`j`ja``j`j`y`y`jad`y`j`y`y`j`y`y`j`j`y`yad`y`j`y`y`j`yad`yad`y`j`y`j`j`y`y`j`y`y`d`a`a`a`a", +"atatatat`r`y`j`j`y`wad`j`j`j`y`q`y`y`j`j`y`q`j`{`q`y`j`y`y`j`y`y`q`{ae`y`j`jar`yar`j`y`w`j`qadadadadadad`ja`adadad`jad`y`j`j`yae`j`y`jadadadadadadadad`j`ja`ad`jadad`}`}`}`}`}`}`}ad`pad`p`j`ja``j`j`sad`j`y`w`j`y`j`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`y`j`w`j`y`}`}`}`}`}`}`}ad`j`j`y`p`j`j`gadadadadadad`gad`gaj`gadajadadadad`g`gad`j`y`y`jad`s`y`q`y`pa``qa`adad`j`g`jad`jad`{`j`j`w`j`j`y`q`y`j`s`j`j`y`q`y`q`y`y`j`j`y`j`j`q`jad`qad`padad`qa``j`pada``jad`s`j`j`y`jad`yadarae`}`}`}ae`y`waear`j`{`j`w`j`yae`y`w`{`j`yae`y`j`yae`wae`y`{`j`{`j`j`y`w`j`{`q`y`y`r`yad`y`j`y`j`y`j`yae`w`j`{`w`j`{`y`jar`j`y`r`y`jar`jad`y`}`}`}`}`}`}`}`}`}`}`}`}`}ad`w`ja`ad`qadad`j`wadad`j`q`j`y`q`j`y`j`w`j`yad`j`jad`p`jadadadadad`}`}`}`}`}adadad`jadadajadadadadaj`gadadag`gag`gagag`gagag`gagadadad`ja`ad`j`qa``qad`jadad`gadag`gaj`gadag`gad`gadag`gadadad`s`j`j`yadad`jad`w`j`y`j`y`q`y`j`j`j`w`j`j`y`y`j`j`y`j`q`j`y`j`j`y`y`q`j`y`y`j`j`y`q`}`}`}`}`}`}`}`}`}`}`}`}`yad`y`q`y`j`w`j`y`j`j`w`j`y`j`j`w`}`}`}`}adad`gadagad`g`gaj`g`g`g`}`}`}`}`}`}`}`}adad`gadagadadadad`g`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`y`j`y`{`j`q`y`y`y`y`q`y`j`j`y`j`y`ja``j`j`y`j`y`j`y`j`y`j`y`j`j`y`j`y`j`y`j`j`y`y`j`y`j`y`j`y`j`y`j`y`j`y`j`y`j`y`j`j`y`j`y`j`y`d`y`dad`y`j`y`j`y`a`a`a`a", +"atatatatae`y`y`j`{`{`{`j`ya``wae`y`{`j`{`w`y`j`{`y`y`q`y`w`j`{ae`w`{`y`j`w`y`j`j`j`yar`j`y`j`y`s`j`ja``jad`jadadadada`ae`wad`y`j`y`j`s`j`qadad`ja`adad`wad`y`jad`y`p`}`}`}`}`}`}`}ad`j`y`ja``j`ja``jad`y`j`y`j`y`q`y`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`j`qa``j`j`y`}`}`}`}`}`}`}`y`w`y`pad`y`qa`a``qadadadad`ga``jad`yad`gad`wad`j`j`sadadad`w`j`{ar`y`j`y`j`y`jad`p`jada`adadadadad`j`w`y`y`j`y`w`y`j`ja``jad`y`j`{`y`jar`j`y`w`j`yad`y`jadada``jadadad`y`q`y`q`j`y`y`j`w`y`w`jara``y`j`y`q`{`w`j`y`j`y`w`j`y`{`yae`w`j`{`j`y`w`j`{`w`y`j`w`y`{`j`w`y`jar`y`{`q`y`{`yae`y`w`j`y`q`y`q`{`j`w`j`y`w`y`j`j`wae`y`j`{`y`j`w`y`{`y`q`y`y`j`w`y`j`y`y`q`yad`ja``q`yad`jad`j`y`jad`y`j`j`p`yadadad`jadad`jadad`padad`padadadad`padad`padadadadad`padad`padadadadad`pad`g`gajad`gagag`g`gadad`gag`g`gag`gajadadadadadadadadadadagad`gagadad`gagadadaj`gadag`gagadad`j`j`y`qa``qa``j`j`j`y`j`y`j`y`j`w`yad`y`j`q`y`j`y`qa``j`y`y`j`y`j`y`q`{`j`y`j`w`y`yae`y`y`j`q`y`jadadad`j`j`y`q`y`j`y`j`y`j`w`y`y`j`y`j`w`y`y`j`ja`adajadadadadadadadadadadadad`}`}`}`}`}`}adadadaja`adadadadad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}a``y`jar`y`j`y`jar`yae`y`j`w`j`y`y`j`y`j`y`y`j`y`j`y`j`w`y`j`y`y`y`j`y`w`y`j`y`y`j`w`j`y`j`y`j`y`j`y`y`j`y`j`y`j`y`j`y`j`y`y`j`y`y`j`y`jah`j`y`j`y`j`a`a`a`a", +"atatatat`yae`y`y`q`y`j`{`j`j`y`j`q`y`j`j`{`j`w`j`y`j`j`j`y`j`j`y`y`jar`y`j`y`{`ja``j`{`q`y`{`j`y`j`w`ja``jadad`gaj`gadad`j`y`j`q`yad`yad`y`padadadad`jad`j`p`jadad`j`}`}`}`}`}`}`}`jad`wadadadad`q`y`qad`j`w`j`ya``r`yad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`s`j`ja``j`p`jad`}`}`}`}`}`q`y`j`ja``p`j`j`ja``j`yadadadadadadadadadajad`j`s`j`y`y`jadadadad`jad`q`yad`wad`ja`ad`j`qad`y`jada``pad`j`j`q`y`j`y`j`w`j`y`p`y`j`y`q`y`y`jarad`y`j`wadad`j`pad`j`p`y`p`j`ja``jadad`j`q`j`y`j`j`ja``q`jar`y`y`j`y`w`j`y`j`y`q`j`w`y`j`y`wae`yae`y`y`jae`wae`j`yar`j`y`w`y`j`q`y`j`w`j`y`q`y`y`yae`yad`y`q`y`j`{`j`{`q`y`y`j`y`q`y`q`y`j`j`w`j`j`y`j`w`y`j`y`q`y`j`y`q`y`j`qad`j`y`j`wad`y`wad`j`yad`y`qadadad`gaj`gadajad`gadadad`pad`jadadadadadadad`jad`y`j`p`jad`p`yadadadadad`paj`gadadadadadadad`qadadadadad`gag`gaj`gaj`hagadag`gadagadadad`gajad`gagad`gag`hagad`gadag`gadadad`jad`p`y`qad`j`y`q`y`jad`j`w`j`y`yad`j`y`j`y`j`y`q`j`j`w`y`j`y`q`y`j`j`y`q`y`j`w`j`ja``j`wadadad`jad`y`y`j`y`w`jae`y`j`y`q`y`j`y`j`{`j`y`j`jad`gadadadadadadadad`jadadadadadajadadadadadadadadadadadada``}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ad`j`y`j`y`y`j`y`j`j`w`{`y`j`y`q`y`j`y`j`y`j`y`j`y`j`y`j`j`y`j`w`j`y`j`j`y`j`y`j`y`j`j`j`y`y`q`y`j`j`j`y`j`y`j`y`j`y`y`j`y`j`y`jad`y`j`y`j`y`jah`j`y`a`a`a`a", +"atatatatad`y`r`y`yae`w`y`j`y`w`j`y`y`y`q`y`j`y`yae`y`y`j`y`j`y`w`j`yae`{`yar`y`j`wae`y`y`y`j`{`j`w`y`j`y`j`wadadadadadadad`j`yad`y`j`w`j`j`yadadad`wadad`ja`ada``ja``}`}`}`}`}`}`}a``y`jada``j`y`sad`ja``j`y`j`y`{`j`y`p`{`j`s`jadad`g`g`}`}`}`}`}`}`}`y`jad`j`j`yad`j`y`ja``j`}`}`}`jad`j`y`q`y`j`j`yad`y`qad`y`p`j`wag`g`i`jadadad`ya``j`w`j`y`w`ja`ad`p`y`y`j`q`yad`j`padad`yad`padad`wad`j`j`s`y`j`j`y`q`{`ja``j`y`pad`j`y`q`y`j`y`y`j`j`yad`ja``jad`y`ja``j`y`jad`w`qa`ad`y`ja``q`y`j`y`{`j`y`j`j`w`j`y`j`{`w`{`y`y`j`w`{`j`yae`w`yar`j`w`y`j`y`w`yae`y`yae`{`j`y`{`j`y`wae`y`j`y`q`y`w`j`y`j`w`j`j`w`y`{`y`q`y`y`j`y`{`q`y`y`j`y`j`w`j`{`y`q`y`jar`y`j`y`w`ja`ad`j`s`j`y`q`j`y`y`q`y`j`y`qada`adada``jad`gadadadadadadad`padad`yad`y`j`w`y`y`q`y`y`y`y`j`w`j`yad`yajadadadadadadadadad`jadadadad`padadadag`gad`gaj`gadagadad`gaj`gaj`g`gag`hag`g`i`gagad`gag`gaj`gadad`jad`jad`jad`s`j`j`y`jar`y`y`j`y`q`y`y`j`yad`w`j`j`w`y`y`j`y`j`y`y`j`y`y`j`y`y`j`y`j`y`j`jadadad`j`y`w`j`y`q`y`y`j`w`y`y`{`j`w`j`y`j`y`q`y`s`jadadadad`jadad`jadadadad`jadadadadadajadadadad`ja``jad`jad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`g`j`{`j`y`j`w`y`y`j`{`y`jar`j`y`y`j`y`y`j`y`j`y`j`y`y`j`y`q`y`j`j`y`y`y`j`y`w`j`y`y`j`y`y`j`y`j`y`y`j`y`y`j`y`y`j`y`j`y`j`y`j`y`j`y`j`y`j`y`y`j`y`j`a`a`a`a", +"atatatatadad`j`{`j`y`j`y`j`y`j`j`{`j`y`j`y`j`y`q`{`y`j`yae`w`yaead`yar`j`j`j`w`y`j`yae`qa``j`y`j`j`w`j`p`j`y`j`p`y`j`padadadad`jad`yad`w`j`j`y`q`jad`j`wad`j`p`j`j`p`}`}`}`}`}`}`}`p`jadad`q`j`j`y`j`w`jad`q`y`j`wad`j`y`j`w`jadadadajadad`yad`j`q`{`j`y`qa``qadad`y`padadad`j`jadadad`g`gaj`j`y`pad`jad`y`j`j`yad`y`y`j`o`c`gad`wad`j`j`j`j`y`j`j`y`q`y`jadad`jad`yadadadadad`gadad`jadadadadadad`j`j`yad`j`wad`j`j`yad`p`jada``j`q`y`q`j`y`p`j`p`jad`y`j`p`jad`w`ja``j`j`s`jad`yad`j`j`w`j`j`w`jad`j`yadar`j`y`j`w`j`y`j`y`j`w`j`j`y`j`yae`y`j`w`j`{`q`y`q`y`y`q`y`j`w`j`y`y`q`y`w`j`y`j`y`q`j`y`y`qad`{`j`j`y`jar`j`y`j`yae`w`j`y`q`y`j`j`y`y`j`y`j`y`q`yae`y`j`qadad`jad`y`j`q`j`y`j`w`y`j`y`wae`w`j`w`j`y`p`y`w`jad`s`j`yadar`j`y`w`{ae`w`j`{`j`w`{`j`y`y`jar`j`y`{ad`y`j`jadadadadad`gadadadadadad`jad`yadajadad`gad`gaj`gadadag`g`gaj`gaj`g`iad`gadadad`j`g`g`iag`gagadad`gadadadadad`j`ja``j`q`j`y`j`y`j`y`j`w`j`j`y`j`j`j`jad`w`j`j`q`y`q`j`y`q`y`y`j`w`jadadagada``j`j`y`q`y`j`y`j`y`{ae`q`y`y`j`y`q`yad`j`y`j`padad`gajadadadad`jadadadadadad`jadadadadadadadadadad`ja`ad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`hadad`y`{`j`yae`y`j`y`j`w`y`j`{`j`y`j`w`j`j`w`y`j`j`y`j`y`j`y`j`y`j`y`j`y`j`yae`y`j`y`j`j`y`j`y`j`y`y`j`y`j`{`j`y`j`j`y`y`j`j`y`y`j`j`y`~`j`y`j`y`j`y`a`a`a`a", +"atatatat`gadad`y`y`{`j`w`{`jar`{`y`q`j`{`y`{`q`y`y`jar`y`j`{`yae`w`y`j`{`w`y`yae`y`w`y`j`{`y`r`y`q`y`{`y`y`j`qa``y`j`yada``j`j`g`j`jad`y`j`s`j`yadadadad`jad`yad`yad`}`}`}`}`}`}`}adadadadadadad`q`y`j`j`y`y`jad`y`j`y`p`y`j`j`yadaj`gadar`y`q`y`y`j`y`y`j`yad`y`q`y`j`y`yad`wa`adadadadaj`gadadadad`y`wad`j`y`s`j`y`j`y`y`uacad`y`j`wada`ad`y`j`y`w`j`y`j`y`pa``jad`pad`jadadadad`p`j`padadadadadadad`p`ya``j`j`p`y`j`j`yad`y`j`q`y`ja``j`yadadad`yad`yad`yad`w`j`yad`q`j`yad`j`jad`p`j`y`y`p`y`j`w`y`j`wad`j`j`yae`y`j`yae`w`y`y`yae`y`wae`y`w`j`y`j`y`yae`y`{`y`j`w`{`j`y`j`{`y`dar`{`j`y`{`j`y`w`j`y`j`p`j`j`w`y`j`{`w`{`w`j`y`j`y`j`y`j`w`y`r`{`w`y`j`q`y`y`p`ja``y`j`p`y`jad`y`{`w`j`y`y`j`j`q`y`j`y`y`yae`w`yaear`{`y`dar`yae`wae`y`y`j`y`y`q`y`y`{`r`yar`j`y`y`wae`w`y`w`j`w`yad`q`y`p`jad`gadadadadadadadadadadadadadadadadad`gadad`gagasagadadae`yad`w`jad`n`h`i`iac`g`iadadad`jadadad`jad`yad`j`w`j`j`w`j`y`j`w`yad`j`y`y`j`y`j`y`j`y`ja``q`j`y`q`y`jadadadadad`j`y`y`q`y`yae`yae`w`j`y`y`j`{`y`j`y`j`y`j`w`j`y`jad`gaj`gad`gadadadadadadadada`adad`j`yadadadadadadad`padad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}ad`gada``j`j`yae`y`y`y`jar`{`y`j`{`w`j`y`j`y`j`y`j`y`y`j`y`j`y`j`w`y`j`y`y`j`y`y`q`y`j`y`w`j`y`y`j`y`y`j`j`y`j`y`j`y`j`y`j`y`j`y`j`y`j`y`y`j`y`j`y`j`y`y`a`a`a`a", +"atatatat`~adaj`j`y`j`y`y`j`y`j`w`j`{`y`j`q`{`j`y`j`{`j`w`j`y`j`yae`y`j`j`yae`w`y`j`y`jar`j`y`jad`j`y`q`j`y`y`j`j`j`w`j`y`q`y`j`sadadadad`j`ja`ad`j`jad`gad`jad`w`j`j`}`}`}`}`}`}`}adadad`gag`g`~ad`s`jada``q`y`jad`y`j`y`q`y`j`j`gad`gad`j`y`j`w`j`y`j`j`y`q`yad`jad`p`y`jadadad`j`gadadadagadadadadad`jadad`j`j`y`qad`j`{`jad`gad`j`{`j`qa``qad`j`y`j`w`yaea``j`padadad`gadadadadad`~adadadadadagadadad`jadad`yad`qad`y`q`jada``j`j`y`p`y`j`p`j`p`y`q`y`j`j`y`j`ja``j`yad`qa``p`jadad`jad`jad`y`q`y`j`y`j`wad`p`y`wae`w`y`j`{`q`y`ra``j`y`y`j`{`w`{`p`y`q`y`r`j`y`j`y`q`y`j`w`jar`j`y`q`y`w`j`y`j`y`{`q`yad`y`j`y`j`q`j`y`j`j`y`q`j`w`y`q`j`y`j`y`j`j`y`{`j`j`y`q`yad`qadad`y`q`y`j`y`j`w`j`y`y`y`y`j`q`{`q`{`j`y`y`y`j`w`{`q`y`y`y`jar`y`r`y`wae`{`j`w`j`{`y`{`jar`y`{`j`y`w`{`j`y`wae`y`y`{`y`q`yad`jad`gadadadadagadagad`j`j`j`p`jadad`y`jad`u`gag`h`j`q`y`j`y`qad`nasaaaaaaac`i`hagadadadadadad`jadadad`y`j`ja``j`j`y`j`y`w`j`s`j`y`y`w`j`yad`y`j`y`y`j`ja`adagadad`w`j`j`y`j`y`q`y`j`y`{`q`j`y`w`jar`j`y`q`y`y`j`y`w`d`{adad`gaj`hag`gaj`gadadajadadad`gad`jadadad`yadadad`jadadad`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`}`g`iad`j`y`j`w`j`{`q`y`j`y`q`y`{`j`y`j`{`y`y`j`w`y`j`j`y`y`j`j`y`j`y`q`j`y`q`{`y`j`y`j`y`j`{`j`w`j`y`y`j`y`j`y`j`{`y`y`j`y`j`y`j`y`jah`j`y`y`j`y`j`y`j`y`a`a`a`a", +"atatatatadadadad`yae`y`q`yae`w`y`j`y`j`w`{`j`y`{`j`y`w`j`{`j`y`wae`y`w`y`q`y`{ae`w`y`{`j`y`y`y`j`s`j`y`j`y`{`q`y`y`j`y`j`y`j`j`yad`jada`ad`j`j`p`yadadadadadad`yad`y`}`}`}`}`}`}`}`gadadaj`g`gad`gad`j`q`yad`j`y`qa``rada`ad`j`wadadadad`y`q`ja``j`y`j`s`j`j`yad`yadad`jad`y`ja``qada`adag`gad`gadadadadadadad`jad`y`y`j`wa``jadadad`j`s`j`yad`y`jad`p`y`y`j`qa``j`yad`gadaj`gad`j`g`gadagad`padag`gag`iad`p`y`padad`y`qad`y`y`qada``q`j`y`jadad`j`y`j`y`j`y`p`y`j`wad`w`j`yad`jadad`gadad`gad`j`j`j`y`j`yad`j`yad`j`y`j`y`w`j`y`j`y`y`j`y`q`{`w`j`y`j`y`j`j`y`yae`w`y`y`j`w`{`y`j`w`j`{`y`j`yar`jar`y`j`yar`j`y`j`w`j`y`y`q`j`w`y`j`y`j`y`j`y`w`j`y`j`y`y`q`y`w`j`yadad`jadad`jad`y`jar`j`y`j`q`{`j`w`j`y`y`{`w`j`waear`y`{`y`j`yar`j`yar`y`{`j`{`yar`y`y`y`{`jar`y`{`j`{`w`{ae`y`q`{`y`q`y`y`r`y`{ar`j`w`y`qad`gadaj`g`iadad`y`y`y`yar`y`j`j`w`yadad`n`gad`y`w`j`j`ya``gagacaaaaasac`hag`h`gadadadadad`yad`jada``w`j`y`y`q`{`q`y`j`y`j`w`j`j`y`j`w`j`y`q`j`yadadad`gad`y`j`y`y`j`q`y`y`j`y`w`y`j`{`y`{`j`y`yae`y`j`{`y`j`w`y`q`y`jadadadadadadadadad`gag`~adadadad`ja``jadadad`jadada``qadadadad`}`}`}`}`}`}`}`}`}`}`}`gaj`hadada``j`y`y`q`y`j`y`y`j`y`j`y`j`w`y`j`y`j`y`j`j`y`y`j`y`y`j`w`j`y`y`j`{`y`j`y`j`wae`w`j`y`y`j`y`j`y`j`y`y`j`y`y`j`y`j`y`j`y`j`y`y`jah`j`j`y`jah`j`y`a`a`a`a", +"atatatat`g`kadadad`y`{`y`yae`j`y`q`{`j`y`j`j`w`yae`y`j`yar`y`y`j`j`{`j`{`y`{`j`y`j`{`j`w`j`yae`y`j`w`j`y`q`y`j`y`j`waea`ad`j`j`s`j`jadadadadadadadadadadad`qad`j`j`w`}`}`}`}`}`}`}`}ad`gadad`g`jadad`yad`ja``jad`yad`y`jad`yad`j`sadajad`y`ja``j`w`j`yad`w`jad`p`jadadadad`jad`j`y`{`q`y`jad`pad`g`gad`jadadadadad`j`y`j`y`q`y`yadad`j`y`y`r`yad`y`jad`j`w`j`y`y`q`y`jad`sad`gagadajad`g`n`iad`j`gag`g`i`i`g`jadadad`j`jadad`j`j`p`y`jadad`wadadad`y`j`q`y`j`ja``j`j`y`j`p`j`gadadad`gagad`gaj`g`gad`q`y`qad`y`qadad`w`j`j`y`w`j`w`j`{`y`j`y`j`j`j`y`q`y`j`y`q`y`j`j`y`q`y`j`j`y`{`y`q`y`j`y`j`y`y`q`j`y`j`y`q`y`j`y`q`j`y`j`j`y`q`j`j`w`j`y`j`y`q`y`j`j`j`y`j`y`j`ja`ad`pa``jad`w`j`y`j`y`q`y`j`y`j`y`j`y`q`j`{`y`j`y`j`q`y`r`y`yae`wae`y`r`y`y`q`{`y`r`{`r`y`y`j`jar`y`j`{`y`yae`y`wae`y`j`w`yae`y`j`{`yae`y`ra`adad`gagag`gad`j`{`j`{`j`w`j`y`j`{`y`j`gajad`y`j`w`j`j`j`sad`u`i`n`h`n`iag`hagad`gadadadadad`j`jad`jad`ja``j`j`y`j`j`y`j`y`q`y`j`y`j`y`j`p`jadadadad`j`y`j`q`y`y`j`y`{`q`y`j`y`q`yae`y`w`j`yar`j`y`q`j`y`j`j`y`qa``jadadad`j`yad`jadadadad`gadadadadadad`jada`adadad`jadadadadad`jadadag`}`}`}`}`}ag`hag`gag`~ad`y`j`j`y`y`j`w`jar`y`j`{`w`{`j`y`j`y`j`y`y`j`q`y`j`y`j`y`y`j`y`q`y`j`yae`y`j`y`y`j`y`{`j`y`j`w`yae`y`j`y`j`j`y`j`y`y`j`y`y`j`y`j`y`y`jah`j`j`y`j`a`a`a`a", +"atatatat`gadad`~`g`jae`{`wae`yar`y`j`y`j`w`j`y`y`j`q`y`w`j`j`y`{ar`y`w`jar`j`y`w`j`{`w`{`j`w`j`w`j`y`j`jad`y`j`q`y`j`y`w`j`y`q`y`y`j`y`pad`ja`adadadad`g`y`ja`ad`w`}`}`}`}`}`}`}`}`}adadadad`jad`p`yad`jad`w`j`j`j`w`jadad`j`qadadadadadad`y`q`yad`q`j`yadadadadadadadadadadadadadada``j`y`y`s`jadadagadad`wadadad`g`j`j`w`y`{`j`y`p`jadad`y`j`y`j`w`j`ja``j`j`s`j`j`yad`yaj`gadag`gagadagas`i`g`jad`p`g`g`i`gadadad`yad`y`w`jada``j`yad`wadadad`y`j`qad`y`j`w`j`y`qad`yadad`gadadaj`gadadad`g`gadagadad`ja`ad`jad`w`y`jad`y`j`y`j`j`y`j`y`q`jad`s`jad`j`sad`jad`p`jadad`y`qad`y`j`w`j`y`{`q`{`wae`y`j`w`y`q`y`{`j`y`j`y`w`jad`wa``j`y`y`j`y`j`w`y`j`y`y`w`ja``j`j`y`qadad`jad`wad`j`w`j`w`j`y`j`j`w`j`y`w`j`y`yae`w`jar`y`yae`y`{`q`y`{`j`y`yae`y`{`q`{`y`y`yar`j`{`yaear`{`j`wae`w`y`j`y`{`{ae`y`{`wae`y`y`r`y`{`y`j`wad`gagag`had`r`yar`yae`y`y`qae`w`y`ja``j`w`j`y`y`j`y`w`jadad`gag`g`gagag`g`iadagadadadadadadadad`j`y`q`y`y`w`j`w`j`w`j`y`y`j`j`w`y`jad`gadad`j`y`y`q`y`y`j`j`{`w`j`y`j`yae`y`w`yae`y`w`j`j`w`y`j`y`j`y`q`y`j`j`wad`y`ja``j`y`j`y`w`j`jadadadaj`gadadadad`jadadadadadadadadadadadad`g`~ag`gag`hag`gag`~`gad`j`y`j`y`j`y`{`y`j`y`j`y`{`j`w`y`y`q`y`y`q`j`y`{`y`j`y`wae`y`q`y`j`y`j`w`j`y`wae`y`q`{`j`y`j`yae`y`yae`y`y`y`j`y`j`y`j`y`j`y`j`j`y`d`y`jah`j`y`j`a`a`a`a", +"atatatat`gajadadadadad`j`y`{`j`yae`y`w`y`j`j`y`q`{`y`j`yae`w`y`j`{`j`{`j`y`wae`y`w`j`{`j`{`y`j`{`y`q`j`yad`y`j`y`j`yae`y`w`y`j`j`y`j`y`y`q`j`y`jad`jadad`q`y`j`y`j`}`}`}`}`}`}`}`}`}`{`jad`y`p`jadadadadadadadadad`jadadadad`ja``jadada`ad`j`ja``y`j`y`p`y`jadadadadad`gadada``jadadad`j`y`j`yad`w`yad`g`g`j`yadad`p`gad`jad`w`{`y`jadadad`y`q`yad`yad`y`j`y`ja``j`qa``j`w`jadad`g`gag`g`i`g`n`gacada``j`g`gadadad`pad`j`ja``w`j`j`w`jad`y`jadadada``ja``p`j`yad`y`j`qa`adad`padad`p`jad`padadadadad`gadadadad`jad`j`j`p`j`p`y`jad`w`j`jada``jadad`p`jadad`p`ja``j`yadadad`j`y`p`j`jad`w`j`j`y`y`q`{`y`j`y`y`q`y`j`yar`j`y`y`yae`w`y`r`y`q`y`y`j`w`j`y`j`y`q`ja``p`j`j`padadad`j`yad`j`y`jad`wad`j`j`y`q`y`y`q`y`y`j`yae`w`j`{`q`y`{`q`yar`jar`y`q`{`y`q`{`{`j`y`w`{`y`w`j`{`{`y`{`jar`{`q`y`y`r`y`y`{`j`w`j`{`jar`y`j`y`{`j`gagaaapaq`j`y`w`j`y`q`y`y`j`y`j`w`j`y`{`j`w`j`{`ja``j`wad`jad`g`gag`gag`hagad`gadajadad`gadadad`j`j`j`y`j`y`j`y`j`j`w`y`j`yad`jadadadad`q`y`j`y`j`y`q`y`j`y`j`w`y`j`{`j`yae`w`y`j`y`j`y`y`q`y`y`j`j`y`wad`j`y`q`j`j`wad`j`y`y`p`j`ya``jad`gadagadadadadadad`jadadadadadadadadad`gadag`gag`g`k`gag`had`y`j`y`w`j`j`{`w`y`r`y`j`yaealar`y`j`y`{`j`y`j`{`j`y`j`y`j`y`yae`y`y`y`j`{`y`j`y`j`y`y`y`w`j`y`j`y`j`y`q`{`y`j`y`y`j`y`j`y`j`y`y`d`s`j`y`j`~`y`j`a`a`a`a", +"atatatat`yad`hadad`~adad`yae`w`j`yar`j`yae`yar`y`yae`y`{`w`{`j`{ae`y`y`yae`y`yae`{`yae`y`{`q`{`w`j`y`j`w`y`j`j`y`q`y`j`w`j`y`j`w`j`y`q`y`jadad`pad`j`pa``j`y`q`y`j`}`}`}`}`}`}`}`}`}`j`p`jadadadad`gadadadadagad`g`gadad`g`g`g`ja``q`y`q`y`jad`w`j`jadadadadadadadad`gadadad`wad`jadadad`j`w`j`y`j`j`w`yad`g`j`j`w`yadad`g`y`j`j`j`p`y`j`wad`j`j`w`j`j`j`y`j`qad`y`j`y`p`y`ja``pajadad`gagadad`gac`g`i`jadad`gad`jad`yadadad`jadad`y`j`y`p`yadad`pad`j`wad`j`j`s`j`jadad`p`jadad`j`jada``jad`q`jadadad`qadad`s`jad`sad`yadad`j`padad`y`j`p`jad`p`j`yad`yad`y`yad`j`wae`w`y`y`wad`y`ja``j`j`j`yaead`y`q`yae`q`y`{`j`w`j`{`y`jar`j`y`j`y`j`y`yaeae`w`y`j`w`j`y`jad`y`jadadadadadad`w`j`y`p`j`y`j`j`y`w`j`y`q`y`j`{`q`yae`y`q`{`y`y`y`q`{`{`j`w`{`y`y`{`y`j`{`yae`w`yae`w`{`j`{`w`{`r`y`{`y`{`y`q`y`{`j`y`r`y`{`y`{`y`j`{`j`w`yadadanacacad`y`jar`y`y`q`y`j`w`j`j`y`j`j`w`y`j`y`j`y`j`yad`yad`y`j`gaj`g`gag`iadag`gadadadadadadadadadad`j`q`y`j`y`w`j`y`j`q`y`w`jadadad`y`y`j`w`j`w`j`j`y`j`wae`y`j`w`j`y`q`y`j`{`y`j`w`j`j`y`j`y`qa``j`j`j`yad`j`y`j`y`w`j`y`j`y`j`w`j`j`yadaj`h`gadadada``jadadadadadadadagad`gad`i`gag`hag`g`iadadad`{`j`d`y`y`y`j`y`{`j`y`w`j`s`y`j`y`{`j`w`j`y`y`j`y`j`{`q`y`j`w`y`q`{`j`w`j`y`j`y`y`j`y`j`y`j`y`{`w`y`y`j`y`j`y`j`y`j`y`j`y`j`j`y`j`y`j`y`y`j`y`a`a`a`a", +"atatatat`y`j`jadad`j`jadad`{`y`y`j`{`y`q`yae`y`r`y`{ar`j`{`y`w`y`{`q`{`j`y`j`y`jar`y`y`rah`y`j`{`j`y`j`j`yad`q`y`j`y`j`y`yae`y`y`q`yae`ya``j`y`yad`y`{`q`y`j`y`q`y`}`}`}`}`}`}`}`}a`adadadad`pad`jad`gadadadadadadagadadadadadad`yad`j`y`pad`ja`adad`qadadadadadadad`jadagadad`y`p`y`wadagadad`y`j`y`j`y`ra`adad`j`y`qad`jadad`y`yad`w`yad`jad`ya``j`wa``q`y`ja``j`jad`s`j`j`ja`adadad`gad`gadadadad`gadaj`yadadadadad`q`ya`ad`q`y`j`y`j`jad`q`gad`y`j`j`s`j`jadadadadagadadad`p`y`jad`p`yada``qad`y`yad`j`qa``j`ja``yae`w`yad`jad`p`jadada``j`j`s`jar`y`wae`j`wa``j`y`j`{`j`jar`y`j`qa`ad`qadad`y`q`y`y`j`j`y`q`y`j`y`j`w`j`y`q`y`y`j`y`q`j`y`j`y`j`y`j`pad`j`pad`yadadadad`wad`j`y`j`w`j`y`qa`ae`y`q`yae`y`w`{`j`w`y`j`y`q`{`j`{`yar`y`{`j`w`jar`jar`y`q`{`y`{ar`j`{`w`j`{`y`j`{`wae`y`q`y`yae`w`{`y`{`w`j`r`yar`y`j`{`{`q`{`j`y`pad`gad`j`j`y`yae`y`y`y`j`y`w`y`{`j`w`j`y`q`y`j`y`j`w`{`j`yadadadag`g`g`n`gag`i`gadagad`gadadadad`ja``q`y`j`yad`y`j`y`j`y`j`gajad`j`y`j`j`y`y`q`j`y`y`j`y`q`y`{`y`{`j`{`y`q`j`{`y`y`q`y`q`y`j`y`y`j`y`ja``jad`y`j`j`y`j`wad`{`j`w`ja``jadadadagadadadad`jadadadad`gadag`~adagad`g`gag`i`g`gaja``y`yaeadah`q`j`yar`j`y`yae`y`{`y`j`jar`y`{`j`w`y`q`{`y`y`j`{`y`j`y`j`w`{`j`yar`j`{`wae`y`{`j`w`{`j`yae`y`{`j`y`j`y`{`j`y`y`j`y`j`y`d`y`j`j`y`y`j`a`a`a`a", +"atatatat`y`y`{`jadad`gad`gad`{`jar`y`j`y`j`{`j`y`q`{`j`y`w`{`j`{`j`{`y`w`j`{`w`j`y`{`q`{`y`q`yae`y`w`j`y`j`p`y`j`y`j`q`j`y`q`y`q`{`j`yad`y`q`j`jad`j`q`y`j`y`j`yad`}`}`}`}`}`}`}`}ad`gadadad`g`iada``j`gadadadad`jadadadadad`j`j`p`y`q`y`j`y`y`jad`jada``qadadadagad`j`gadadadad`j`y`j`wadadadad`r`y`y`q`j`yadadadad`y`j`yada``qadad`j`j`j`sad`jad`w`j`yadad`ja``q`y`j`wad`j`yad`qad`gadajadagadadada`aj`g`g`jadadadad`ja``j`p`jad`y`j`q`ya``jadagad`jada``jadadadadadadad`jada``jad`wa``j`j`jad`j`w`jad`j`j`y`j`w`jar`y`j`w`y`j`w`y`jad`wad`j`p`y`{ae`y`j`{`w`y`{`jar`j`w`{`q`y`{`q`y`y`w`ja`ad`j`jadad`j`p`yad`j`d`w`j`j`y`j`y`j`j`q`j`yad`y`qad`y`j`w`ja`ad`j`w`y`j`wad`w`jad`{`w`{`y`q`y`j`y`q`y`j`y`q`y`y`j`r`y`j`{`q`y`yae`y`q`yae`y`jar`y`j`{`y`{`j`yae`yae`y`{`yae`y`{`j`w`{`jar`{`j`{`w`{`jar`yae`{`w`{`j`j`{`j`w`j`y`w`{`y`j`w`jadadad`q`jar`{`q`y`r`y`j`q`y`j`y`j`y`q`yae`w`y`j`q`y`j`wadadag`g`i`gag`h`iagad`gadagadada``jadad`j`j`y`j`w`j`wad`jadadadad`y`j`q`y`q`y`j`y`y`y`r`y`j`y`j`y`j`j`w`j`y`y`q`y`j`j`y`j`y`j`y`j`p`j`jadadad`ja``j`j`y`j`y`j`y`y`j`j`y`j`yadadagad`gadadadadadadadadajad`gadagad`i`gag`gag`gad`j`y`j`y`j`y`j`y`y`j`w`j`y`{`j`y`r`y`y`y`j`j`y`j`{`j`y`r`j`y`w`jar`y`{`j`y`j`{`y`j`y`j`y`q`y`j`y`yae`y`y`j`y`j`y`y`j`j`y`j`ja``j`y`j`y`jah`j`y`j`a`a`a`a", +"atatatatae`j`y`y`j`jad`haj`g`j`y`j`{`y`{`w`j`y`y`j`{`yae`y`{`yar`j`{`j`{`y`j`y`yae`y`y`q`{`y`yar`j`y`y`j`y`j`w`y`ja``j`y`j`y`j`y`j`y`w`j`j`y`y`p`y`j`y`j`w`j`y`q`j`}`}`}`}`}`}`}`}adagadadad`g`gadadadadadadadad`gadad`y`qada``yad`j`j`wad`j`w`ja`adadadad`jadad`gadada``j`yadadad`ja``j`y`wadadad`ja``yaea``w`j`yad`p`j`w`j`j`yad`wad`y`j`yad`jad`y`j`y`q`y`j`yad`j`yad`w`j`ja`ad`j`padadadad`gadadadad`jad`gadad`wadadadad`y`j`sad`j`j`y`q`yad`gag`g`y`padadadad`pada`ad`padad`pad`j`w`ja``wa``j`ja``q`y`j`s`j`j`y`jar`y`j`{`j`y`w`y`{`ja``j`y`w`j`y`w`j`yae`y`w`{ad`y`j`y`j`y`j`{`yae`y`q`y`w`j`wadad`ja``q`yadad`yad`qadad`padadadadadad`j`j`p`yadadad`jadad`j`j`j`y`y`j`y`w`yae`y`y`y`q`y`y`j`w`j`y`j`{`q`y`y`q`y`y`jar`y`q`y`{`w`jar`y`{ar`jar`j`w`{`w`{`j`w`{`q`{`yar`y`yae`w`yad`{ar`j`y`j`{`y`r`{`y`{`w`{`w`{`yae`y`{`j`w`y`{`j`y`w`jad`ja``j`j`y`y`j`y`y`j`w`{`j`w`y`j`y`j`y`j`y`y`j`y`y`ja`adadagadag`gag`g`iagadajad`gajadadadad`j`ja`ad`j`y`j`w`jadadad`j`yad`y`j`w`j`y`q`y`j`yar`j`q`y`y`j`y`j`y`j`y`q`y`j`w`y`j`j`wad`yad`jad`ja`ad`j`y`y`q`y`j`w`j`w`y`w`j`j`wadadad`gadagadad`gajad`gadag`g`g`k`g`gag`g`i`g`gadad`y`j`j`y`y`q`y`jar`yae`y`y`q`{`y`yae`w`y`y`j`{`y`j`w`y`y`j`{`y`j`y`q`y`y`j`y`jar`y`j`{`j`y`y`r`y`y`j`j`y`{`j`y`j`y`y`j`y`j`y`d`y`j`y`y`j`y`j`y`j`a`a`a`a", +"atatatat`j`y`yae`y`y`y`jadad`~`j`j`y`r`y`j`y`{`y`j`qa`ae`w`{`q`j`{`{`y`jar`{`y`r`y`r`yae`y`{`r`yae`y`j`y`j`w`y`jad`y`j`w`j`y`q`yad`wae`j`y`w`j`jad`y`j`wad`{`y`j`j`}`}`}`}`}`}`}adadadadad`j`p`gajadadadadadad`j`gad`j`yadad`j`q`ja`ad`ja``j`y`q`y`j`jadadad`j`p`j`gadad`j`q`y`padadad`y`q`y`j`y`j`q`y`j`w`j`{`j`y`j`yad`jad`wad`yad`j`ja``qada`ad`j`w`j`y`j`y`p`j`j`wad`j`jad`w`j`w`jadadad`gad`j`gadadadadad`jadadad`j`j`sadad`yad`j`j`wad`yae`g`n`iadadadaja`adad`j`w`j`y`j`wad`j`y`j`y`j`j`y`jad`wad`ja``ja``j`y`wae`y`j`yar`y`j`yae`y`y`w`{`j`w`waea``j`{`q`y`j`{`w`y`{`r`y`w`y`q`y`w`yae`y`j`yad`w`j`j`y`j`j`y`qad`jad`padad`gadajadadadadadadadad`qa``jad`wa``ja``q`j`y`j`{`j`y`q`yae`y`j`w`j`j`y`{`q`y`y`j`j`wae`y`q`y`j`j`y`j`{`y`r`y`j`y`y`y`j`yae`j`yar`yae`yar`j`{ae`{`yae`{`w`{`yar`y`{`q`y`y`{`j`{`j`{`yae`w`{`q`{`j`yae`w`j`y`{adadadadad`y`{ae`y`j`w`j`y`j`y`j`y`q`y`y`q`y`j`y`q`j`j`q`y`jagad`g`g`h`nacag`hac`haj`gagad`gadadadad`j`w`jad`j`yadadada``q`y`j`y`j`j`y`j`y`j`w`j`j`y`j`y`q`y`j`w`j`q`yad`j`y`y`j`q`y`jadadadadadadadad`jad`j`y`q`y`j`y`j`j`y`j`w`j`yadadaj`gad`gadad`gad`gaj`g`~ag`gag`g`i`g`g`kadad`j`j`y`w`j`y`j`y`y`j`y`yae`y`j`yae`w`j`{`jar`y`y`r`y`yae`w`{`j`wae`y`{`q`{`y`{`j`y`y`j`y`{`w`j`y`j`{`q`y`{`j`y`j`y`j`y`j`y`j`y`j`y`~`y`j`y`d`y`j`a`a`a`a", +"atatatat`y`q`yae`w`j`{`y`jad`yad`y`j`{`r`y`j`w`{`y`j`y`y`j`{`{`w`j`{`y`j`y`{`j`y`y`y`yar`j`j`{`w`yar`j`w`j`yae`{ad`y`{`j`y`j`{`y`{`q`y`j`yad`ja``j`j`y`jad`j`w`y`j`j`}`}`}`}`}ad`w`jad`padadadadadadadadad`gadad`jada`adada`ad`y`j`jad`y`jad`y`j`yad`wadadadadadad`jad`gadad`{ad`w`yadadadara``j`y`y`q`y`jad`w`y`j`w`j`yadad`j`y`qa``j`{`ja``j`qadadad`wad`y`j`y`s`j`j`wad`yadad`yad`w`yad`jad`padadad`hadadadad`j`gadad`ja`adad`qa``ja``j`y`j`y`pag`hadad`pad`jadad`y`j`s`j`y`y`j`y`j`w`y`qa``w`j`j`yad`w`jadar`y`r`y`yar`y`j`y`q`{`q`y`j`y`q`{`yae`y`{`w`yae`y`w`j`{`yar`j`y`yae`y`{`j`{`q`y`y`q`y`j`y`j`y`p`y`w`j`y`q`yad`y`j`ja`ad`pad`gadadadadadajad`jadad`j`q`ja``y`qaea``wae`y`j`y`jar`y`y`j`w`y`j`y`w`{`y`y`y`q`{`y`jar`y`w`{`j`y`{`jar`j`{`q`y`w`yar`j`yar`j`{`y`y`w`y`jar`y`j`{`j`{`y`r`yae`wae`yar`yar`j`w`{`{`y`j`w`{`j`y`{`j`w`{`y`jad`qadad`wae`y`j`y`j`w`j`{`j`y`yae`y`j`w`j`y`y`j`y`qad`y`padadagad`g`g`i`g`n`i`hac`haj`gad`gadad`g`jad`y`j`jadad`p`j`y`j`q`y`y`j`w`j`y`{`y`y`j`y`j`y`j`j`y`j`y`j`w`j`j`y`j`y`j`yadadadadadadadadad`j`y`j`j`y`j`w`j`y`y`j`y`j`y`q`y`ja`agadadadaj`gaj`h`gaj`gag`haj`gadag`gadad`ya``j`j`y`y`j`y`q`{`j`{`y`q`y`y`y`j`y`{`j`yae`y`y`j`y`j`yae`y`yae`y`w`y`{`j`y`q`{`w`{`j`{`yae`y`y`y`{`j`y`y`j`y`y`j`j`y`y`j`y`{`y`j`y`jah`j`yad`y`a`a`a`a", +"atatatat`y`j`{`y`r`y`y`j`{`w`y`j`y`q`{`y`j`y`j`{`j`y`{`q`y`jar`j`y`{`q`{`wae`y`w`{ae`{`q`{`j`y`j`{ae`y`{`j`yad`w`j`y`q`y`jar`y`j`q`y`j`y`p`jadadad`j`w`j`w`y`{`jad`yad`}`}`}adadad`jada``jad`hadagadad`y`j`gadad`y`wad`j`y`q`yad`pad`y`qadad`q`yad`q`jadadadadad`g`jadad`gadadad`yae`w`j`y`j`j`w`jad`y`w`j`y`j`yae`y`j`y`{adad`q`y`jad`j`qad`ja`adadadadad`j`q`y`jad`y`j`y`j`j`wad`j`{adad`j`wad`y`jagadadadadadadad`p`ja``j`wad`jad`yad`qad`q`y`j`gag`gad`jadadad`y`q`y`j`y`j`j`w`j`w`y`j`y`{`j`j`y`y`w`j`j`y`y`j`ja``jae`j`w`j`{`y`yae`w`yae`y`q`y`jar`y`j`y`r`y`j`y`r`y`j`y`r`y`j`{`q`y`yae`w`yae`y`w`j`q`y`j`j`y`y`j`w`y`y`j`j`wad`jadadadad`padadad`sadad`j`w`y`y`j`w`j`y`y`{`j`{`w`jar`y`y`q`j`y`j`y`q`j`y`q`jar`j`{`q`y`yae`y`j`{`q`{`w`{`y`q`y`{ae`y`j`{`q`y`y`jar`yaeae`w`{`j`{ar`j`{`w`{ae`y`y`yar`y`j`{`y`j`y`{`q`y`{ae`yar`y`{`q`y`j`y`w`jadadad`j`j`y`wae`y`j`w`y`j`q`y`j`y`j`y`j`y`q`y`j`y`y`jadad`gadadadadag`g`g`gag`gag`hagajad`g`iadad`j`pa`adad`j`y`jad`y`y`q`{`y`j`y`j`w`j`j`w`j`y`q`w`j`y`jadadad`gaj`gajadadadadadadagadadadad`yad`j`wad`y`j`j`y`j`w`j`y`q`y`j`yad`j`gaj`gaj`had`gaj`g`i`gad`g`gadadadad`j`j`y`j`y`y`r`y`j`y`j`y`y`q`y`j`{`j`y`j`w`j`y`j`y`{`j`{`w`{`y`q`y`w`j`yae`j`y`{`y`j`{`j`y`q`y`j`y`j`y`j`j`y`j`y`j`y`j`y`y`jah`j`y`j`y`d`y`j`y`j`y`j`a`a`a`a", +"atatatat`j`y`j`y`j`y`j`{`j`y`{`j`y`y`j`y`{`wae`j`yar`j`{`y`yae`{`w`{`y`{`y`q`{`jar`y`y`{`yar`y`y`r`{`w`yae`y`{`j`jad`y`j`j`y`q`y`j`y`y`j`y`y`jadadad`j`y`jad`w`y`j`yadaj`gadadadad`y`q`y`jadajad`gagad`j`jadadad`jad`j`y`j`y`q`y`{ad`y`j`y`yad`ja``j`yadadadadad`gadadaj`gagadadadad`j`w`j`y`ja``q`y`j`y`j`j`w`j`y`j`w`j`w`y`y`jad`w`yad`y`j`wad`wadadad`gad`y`qa``ja``qad`y`{`j`w`j`j`w`j`yadad`j`wad`j`padadad`y`jadad`qad`y`j`s`j`jad`yad`j`yad`y`nadadadadad`y`j`j`y`q`y`y`y`j`y`j`w`j`y`r`y`j`w`j`y`q`yad`q`y`y`q`y`w`j`{`w`{`yar`j`{`y`w`j`y`wae`y`w`{`j`yarae`y`y`wae`y`y`q`{`y`yar`j`y`{`wae`y`y`j`y`j`w`j`j`y`yae`w`j`y`j`y`w`j`w`ja``j`yad`w`jad`wad`yad`j`w`y`j`y`q`{`y`q`y`y`yae`w`yae`y`q`y`j`y`y`j`{`y`y`q`y`{ar`j`y`y`wae`y`{`j`j`{`{`wae`w`yae`y`{`wae`y`{`wae`y`y`j`{`yar`yae`y`wae`wae`yae`w`{`w`{ar`yae`y`w`yar`j`y`j`{`y`q`{`{`y`y`qada``j`y`j`yae`y`yae`w`j`{`j`w`j`y`{`q`j`y`q`y`j`q`j`y`y`jadadadadadadadadad`gag`g`i`gajad`g`gadadad`j`padad`y`j`y`j`y`j`w`j`y`{`y`j`y`y`j`y`j`j`y`q`ja`ad`iag`h`gagac`gag`~adadad`gaj`gadadad`y`j`y`j`j`w`j`y`j`j`y`j`y`y`q`{`q`yadad`gadag`gaj`gad`gadad`jad`ja``y`yad`y`j`y`j`y`y`j`y`w`{`j`y`y`j`y`j`y`j`{`y`wae`w`{`q`yae`yae`y`yae`y`yar`y`j`{`w`j`y`y`j`y`{`y`j`j`y`y`j`y`y`y`j`y`y`j`j`y`y`j`y`j`y`j`y`y`jah`j`y`j`a`a`a`a", +"atatatat`j`y`j`j`j`y`j`y`j`{`jar`j`y`r`y`j`{ae`y`j`yae`y`jar`j`y`j`{ae`w`j`{`y`j`yae`y`q`{`j`yae`y`j`{`j`y`j`yar`j`y`y`j`yad`y`jad`y`q`j`y`qadadad`gad`y`qa``jae`padaj`gadadadada``j`j`y`qada`adadadadadad`j`y`q`y`ja``qad`{a``j`j`qa``j`j`y`qad`j`j`y`p`ja`adajadadagad`gadad`gaj`h`j`j`y`y`q`y`j`y`j`w`j`y`j`y`y`q`y`q`y`j`yad`j`y`j`{ad`q`y`j`j`y`wadagadad`j`y`q`jad`y`s`j`jad`y`w`j`yad`j`y`p`y`jad`yadad`wadad`wad`y`ja``q`y`jad`w`j`p`j`yad`qad`n`i`yadad`yad`y`qad`{`j`j`w`j`y`j`y`w`j`y`y`j`{`yad`y`j`y`j`j`y`j`j`w`y`j`{`j`{`j`yar`j`yae`y`j`y`j`j`{`w`j`y`{`q`{`j`y`w`j`yae`wae`y`j`yae`y`w`j`{`q`y`y`j`y`q`y`q`j`y`j`w`j`j`y`j`y`j`{`p`y`j`j`w`j`j`y`j`w`j`j`w`jar`j`y`j`{`w`j`w`j`{`w`j`y`p`y`j`j`w`j`j`w`jae`w`j`yae`w`j`yae`w`y`r`yar`y`j`{`y`j`w`y`jae`w`y`yae`yar`{`j`w`{`j`y`w`j`y`{`y`wae`y`y`{ae`y`jarae`y`{ae`y`{`j`{`q`y`yae`q`yae`y`jar`j`y`q`{`y`j`w`j`y`y`wae`yar`j`j`y`w`y`j`j`y`j`y`q`jad`g`gadagadadaj`gajadad`g`gag`gad`gaj`gad`jad`j`y`jad`j`y`q`y`j`w`j`y`q`y`j`y`w`j`j`y`y`j`y`jad`gag`gagagad`g`g`gagadadaj`gad`gad`j`y`j`j`w`yad`y`j`y`y`ja`ae`w`j`y`j`y`jadad`i`gaj`h`g`~ad`jadad`y`j`y`j`j`y`j`y`q`y`w`j`j`y`j`j`y`j`j`w`j`y`j`w`y`j`j`y`{`j`y`y`y`{`q`yae`w`y`{`j`y`j`w`y`j`{`yae`y`j`j`y`yae`y`y`j`yae`yak`j`yah`j`y`j`jah`j`y`d`y`j`y`j`y`j`a`a`a`a", +"atatatat`j`j`y`y`j`y`y`j`y`y`{`j`y`y`y`r`y`y`j`w`y`j`y`y`j`{`w`y`y`j`y`{`wae`y`y`wae`y`yaear`y`j`y`{`w`{`{arad`yae`w`j`yad`q`y`jad`y`y`j`ja``j`jadad`jad`y`jad`yada`adadadad`j`jadadad`y`j`jadadadadada`ad`yad`y`j`y`y`j`qad`yar`j`y`y`j`yada``q`yad`{`j`q`y`qad`gadadaj`gadadadad`pad`y`j`j`y`w`y`j`y`y`wae`y`p`y`j`y`y`r`y`j`w`y`j`y`y`j`yad`y`q`y`j`yadagadad`yad`y`p`j`y`j`y`w`j`j`y`q`y`j`y`j`y`qad`y`j`jad`wad`j`s`jad`j`y`q`y`j`y`j`y`p`j`y`y`yag`m`{ad`j`q`y`j`y`y`w`y`j`{`w`j`{`j`y`q`{`y`q`y`q`y`y`qa``j`y`j`y`yae`w`jar`y`{`yae`y`jar`yar`jar`y`y`j`{`y`q`y`{`w`j`{`y`w`j`y`y`q`{ar`j`w`j`{`y`y`{`j`w`j`y`j`y`y`q`y`yar`j`w`j`w`j`y`j`{`w`j`y`y`j`w`j`s`j`{`y`j`y`{`w`j`yae`y`{`j`{`j`y`q`{`y`q`y`j`w`j`y`j`w`y`{`q`y`j`{`y`q`y`{`y`j`{`y`r`yar`j`yae`y`w`j`{`j`w`j`j`jad`j`y`q`{`j`y`{`q`{`{`yar`jar`j`y`yae`yar`{`jar`y`y`r`j`y`r`y`yar`j`y`y`yae`w`y`y`jae`y`j`j`y`j`y`j`y`y`j`y`j`y`j`y`w`j`y`j`yad`j`j`padadadadadadad`gajadadadajadadadad`gadadadad`y`q`y`j`j`y`j`y`q`y`{`j`yae`y`w`j`y`p`j`yadadadagac`gadad`j`jad`gadad`~ad`gajada``jad`y`j`q`yad`y`q`j`y`y`j`y`w`j`j`wa``qad`gag`hag`gadadad`y`j`y`y`j`y`j`y`j`y`j`j`{`y`w`y`j`w`y`j`{`y`y`j`{`j`y`y`y`r`y`{`j`j`y`j`y`y`j`{`q`yae`y`yae`y`y`q`y`y`q`y`yae`y`y`{`j`y`j`y`j`y`j`y`j`y`j`y`y`yah`j`y`jah`jahad`j`a`a`a`a", +"atatatat`j`y`y`j`j`y`j`j`y`j`y`j`j`yae`j`y`{`j`{`j`y`{`j`y`yae`y`r`yaear`y`j`{`y`{`j`yar`j`y`j`y`q`{`j`y`j`j`y`{`j`y`y`jar`y`jadadadad`qadadadad`j`s`jad`gadad`ja``jajadad`jadada``j`yadad`wada`ad`jadad`j`jad`w`j`j`w`yad`j`sae`y`y`j`w`j`y`q`{aea``p`j`y`y`{`j`yadadad`g`gad`j`yad`{ad`p`y`j`y`q`j`y`j`{`j`w`y`j`y`j`j`yae`w`yae`y`p`y`{`w`y`j`y`qa``j`j`pa``q`ja``j`j`y`j`w`j`j`y`j`wad`y`jada``q`j`jad`w`jad`y`j`y`jad`w`j`yaeada``j`y`qa``j`p`jad`gagad`p`w`ja``j`j`w`j`{ae`w`y`j`y`w`j`y`y`q`y`j`{`yar`j`y`j`j`w`j`w`jad`{`j`{`q`yar`jar`j`{`j`y`j`y`j`w`{`j`w`j`{`y`j`w`j`{`y`q`{`j`y`j`y`yae`y`y`q`j`w`j`y`j`y`j`q`yad`q`{ad`y`j`y`j`w`j`w`j`y`j`q`y`j`y`j`y`jar`y`j`w`j`y`jar`y`jar`j`y`wae`y`w`j`y`j`y`y`j`s`{`j`j`y`{`j`y`q`{`j`{`wae`{`q`y`j`y`y`j`y`j`w`{`jad`j`j`~`gaj`gajadad`j`j`w`j`y`y`qae`y`y`yae`w`y`r`y`j`y`{`j`y`j`y`y`y`j`j`y`y`j`{`q`y`j`{`j`y`q`y`w`{`q`y`w`j`y`q`d`w`j`y`j`wad`y`j`y`w`j`j`yadadadad`gadadadadadadad`gadadadadadadad`jad`yad`j`j`yad`w`j`y`{`j`j`y`{`q`y`y`j`y`j`y`j`p`jagac`g`iadada``q`y`jadad`gadad`gad`wad`y`ja``j`yad`w`j`ya``j`y`q`y`j`y`y`y`j`jad`hagagadad`j`j`y`j`y`j`y`j`y`j`y`j`y`y`j`j`j`y`j`y`j`w`y`j`q`yar`j`y`wae`y`y`j`w`y`j`w`{`j`w`{`y`j`y`yae`y`j`q`y`j`{`j`y`{`j`y`q`yae`y`w`j`{`j`y`y`j`y`y`y`d`y`j`j`yah`j`y`j`y`j`a`a`a`a", +"atatatat`j`y`y`q`y`j`y`j`w`y`y`j`y`s`j`{`q`y`{`j`y`w`j`w`j`y`j`y`y`j`y`y`j`{`j`w`yae`yar`y`{`y`y`jar`y`wae`w`yar`j`y`{`y`j`{`s`jad`y`jad`y`pad`y`j`jadadad`gajadadadadadadad`y`qad`y`jad`y`j`y`qad`ja`ad`y`ja``jad`jad`y`j`y`w`j`q`y`j`y`j`y`y`q`y`y`y`radad`y`q`j`y`j`jadadad`y`j`y`qad`y`j`w`j`{ar`ja``q`y`j`y`j`w`yad`y`j`y`j`y`j`{`q`j`y`y`j`ja`ar`j`yad`y`j`w`j`yad`ja``j`qa``j`y`j`w`y`j`y`ja`ad`wad`j`s`j`y`j`ja``y`j`wad`y`qad`wae`y`j`yad`y`j`gag`h`j`j`j`y`w`j`y`j`w`j`{`w`j`{`j`{`{`j`y`y`r`j`y`j`y`w`j`y`j`y`w`j`w`y`{`j`{`yae`y`y`wae`y`w`yae`w`j`{`j`w`wae`w`y`j`y`j`{`y`q`y`{`wae`w`y`r`y`{`y`j`wae`w`ja``j`{`y`j`j`y`j`w`y`j`y`{`j`w`y`y`j`w`y`j`w`j`y`y`r`yae`w`y`j`yar`y`jar`y`j`y`j`y`j`q`y`wae`y`jar`y`q`y`y`q`y`y`{`w`{`y`w`{`j`w`{`yar`j`y`y`j`w`y`y`qadad`g`i`g`g`gadadadajad`jad`yae`{ar`j`y`{`y`{`w`yae`y`yar`j`{`w`y`q`{`q`yae`y`y`j`{`q`y`{`j`y`j`{`y`j`y`j`y`y`y`j`y`q`{`j`y`y`q`y`j`y`jad`jadadadadadad`gadadadadadad`gad`j`yadadadadadadadad`q`j`y`y`j`q`y`y`j`{`j`w`{`j`w`y`j`y`yadagac`gagad`ja``j`y`y`yadadadaj`gadad`j`j`y`q`y`j`y`j`y`j`w`j`j`y`j`w`j`j`w`j`y`jad`gag`g`ja``y`j`w`j`y`y`j`y`j`y`j`j`y`j`y`j`y`j`y`yae`y`y`y`j`y`{`j`y`{`q`yae`y`yae`y`y`{`j`w`j`{`w`j`y`{`j`y`{`y`j`y`j`yar`j`y`y`yae`y`y`q`{`y`j`y`j`j`y`jah`y`j`y`jah`jah`j`j`a`a`a`a", +"atatatatae`w`j`{ae`y`y`{`j`j`j`r`y`j`{`j`y`y`j`yad`yae`j`y`y`j`j`w`j`yae`w`{`q`{`y`r`y`y`j`j`y`r`y`{`w`j`j`y`y`j`j`w`y`q`j`j`y`jad`jad`y`jad`y`jada``w`jadadagada``q`y`ja``p`j`yadad`jad`w`j`jada`ad`j`p`y`j`wad`w`ja``j`w`j`y`yae`y`y`j`w`{`q`y`j`jar`j`{`y`yadad`yae`w`yadad`wadad`j`y`y`{`j`y`y`j`{`y`j`{`j`w`y`j`{`w`j`j`yar`j`{`w`{`yar`j`y`q`yad`{`qa``j`yad`j`y`j`s`j`yad`j`w`yad`j`y`j`j`s`jad`j`y`j`ja``qad`w`y`j`w`j`y`j`y`y`j`y`j`w`yaea``qa`agac`g`j`y`p`y`ja``q`y`{`j`w`{`j`j`y`j`w`yar`j`y`w`{`j`w`y`j`q`y`j`yae`y`wae`w`{`w`y`r`y`j`y`w`j`{`j`y`w`j`y`j`y`j`jar`j`y`q`y`{`w`j`y`j`y`j`y`j`y`q`j`y`y`j`y`q`y`j`q`j`y`w`j`y`j`j`j`w`j`y`j`j`w`j`{`j`y`j`w`j`y`j`w`y`{`yae`w`yae`y`y`j`{`q`y`q`y`j`y`j`j`y`j`y`j`y`q`yae`y`q`{`j`yae`{`y`y`jae`j`y`{`jar`j`{`j`yad`yad`uaj`hajadadag`gag`gagadaj`g`j`j`{ar`yar`j`{`{`q`{`j`{`wae`y`j`y`y`jar`y`j`w`y`j`yar`{`j`{`y`j`y`q`j`{`y`qae`w`y`j`y`j`y`j`j`y`w`j`yadadad`gadagadadadadad`gadadadadad`j`y`p`j`y`p`jadadad`yad`j`j`y`y`q`y`y`q`y`j`j`y`y`j`j`j`g`i`n`g`iadad`y`j`wae`w`j`jadadagadada``j`w`y`j`j`y`j`j`y`j`y`j`j`y`y`j`w`y`j`q`yadag`g`had`jae`y`y`j`y`j`wae`y`w`j`yad`y`w`y`j`y`q`{`j`wae`y`j`y`q`y`j`w`y`j`w`y`j`w`j`y`q`yae`y`yae`y`yae`w`y`y`j`j`y`w`{`j`j`y`wae`y`q`{`j`y`y`j`{`y`jah`j`y`jah`y`d`j`y`d`y`d`a`a`a`a", +"atatatat`j`y`w`{`j`y`j`j`y`w`y`j`y`y`j`j`y`jae`y`q`y`j`w`j`y`{`y`j`w`j`y`j`y`{`j`y`j`{`w`yae`w`yae`j`y`y`wae`y`j`y`j`y`yar`y`j`y`jadad`j`pa``j`j`jad`jadadadadadadad`j`w`y`j`jada``jad`yad`q`y`y`jad`y`y`j`{`j`y`j`{`w`{`jar`j`w`jar`y`j`{`y`y`j`y`y`yar`jar`{`y`{ada``jar`{`j`y`yadad`y`q`y`j`j`p`y`j`w`y`j`{`y`j`j`{`yar`y`{`y`r`y`y`jae`y`w`j`{a``q`y`j`y`q`j`y`p`{`j`y`q`y`j`y`j`j`wad`w`j`y`j`w`y`y`wad`j`y`yae`j`s`j`j`w`y`j`q`y`w`j`y`j`w`jad`y`jadag`n`~`{`w`j`{`w`y`y`j`y`wae`y`sadae`y`j`y`{`j`y`jae`y`w`y`j`y`w`j`j`y`yae`{`yae`{`yarae`j`{`w`j`y`w`j`y`j`y`j`j`y`y`q`j`{`q`y`j`j`wae`w`j`y`j`y`y`q`y`j`{`y`j`w`y`j`s`j`j`y`q`y`q`y`j`w`j`y`y`j`w`j`w`j`y`j`y`{`j`{`q`y`y`{ae`w`y`r`y`y`y`{`j`y`w`j`w`y`j`j`w`j`{`j`y`y`q`y`j`y`q`y`q`yaear`y`w`j`w`{`y`jar`y`q`{`jar`y`j`yadagadad`gagad`gagad`i`gag`iad`k`{`y`j`w`y`{`j`{`yae`yar`y`{`j`w`j`y`j`yae`y`jad`wae`wae`y`y`{`w`j`y`j`j`y`j`j`q`yad`y`q`y`jad`jadadadadadadadadadadadadajadad`gadad`y`y`j`j`y`p`ja`adadadadad`y`{`y`q`{`y`j`y`j`q`y`w`j`y`gagac`magadad`j`y`j`y`j`w`ja`adadagad`jad`j`y`q`y`y`j`y`q`y`j`y`j`qad`y`j`y`j`y`y`j`gag`had`ja``j`j`j`y`y`j`y`j`y`j`y`j`j`j`y`y`j`y`w`yae`w`{`j`{`y`yae`{`yae`j`y`y`{ae`y`yae`w`j`y`y`q`y`yae`y`j`{`y`j`y`j`y`y`j`{`y`j`y`j`{`y`j`{`y`j`y`j`y`j`y`j`j`y`d`y`~`y`j`a`a`a`a", +"atatatat`{`{`{`jar`y`j`w`yae`y`j`{`j`w`y`q`yad`j`y`w`{`yad`j`j`w`j`y`jadadar`{`y`jar`y`j`{ar`j`y`{`y`y`w`j`j`y`w`j`{`q`y`j`ja``qad`wadad`y`jad`ja``j`g`q`yadadadada`ad`j`j`yad`w`jad`y`q`j`y`j`j`y`q`j`y`j`q`y`y`p`y`j`y`j`y`y`j`y`e`w`y`{`w`jar`{`jar`j`y`{`j`{`q`y`w`j`j`y`j`{`j`y`q`j`y`y`r`y`y`y`{`y`q`{`j`{`w`j`w`j`yae`w`j`{`y`yar`y`w`j`y`y`j`d`y`q`y`w`yadad`y`j`w`j`y`j`w`j`y`j`y`jae`yad`j`y`q`y`j`j`y`j`y`q`y`y`j`y`j`y`j`y`j`{`j`w`j`y`j`y`w`jad`mag`j`y`yae`yae`wae`w`y`j`yae`y`wae`y`w`j`w`yar`y`q`y`j`y`j`y`j`yar`y`j`w`j`{`q`y`y`j`y`y`{`j`wae`yae`w`y`q`ya``j`j`yad`y`j`j`y`y`ja``jar`j`w`{`j`w`j`y`j`q`y`jad`y`j`y`j`s`j`y`j`y`j`y`j`{`q`j`y`y`j`qa``j`w`j`w`y`j`{`j`w`j`{`y`{`waear`j`w`y`j`y`j`w`y`d`w`{`y`q`yae`y`yarae`y`{`j`{`y`yae`{`y`{`q`yar`j`y`j`y`{`j`y`wadadag`gadagadad`g`i`g`gag`h`n`hagadar`{`{`jar`y`j`w`{`j`{`jar`y`y`r`yae`w`y`w`y`j`y`j`y`j`w`j`j`yad`w`j`y`j`s`j`y`q`j`y`j`yadadadaj`gadagadadad`gajadad`gadadadad`jad`j`q`y`w`y`j`y`qadad`gad`j`qad`j`{`j`y`y`q`y`y`j`yad`yag`m`iadada``y`j`j`j`y`y`j`y`jad`g`gad`ja``q`y`j`j`w`j`y`j`yad`w`y`y`j`y`y`j`y`jadadad`gadadad`y`j`y`j`y`j`j`y`y`j`y`j`y`y`q`y`j`y`j`y`j`y`j`y`{`j`y`q`y`j`w`{`y`y`{`q`yar`j`y`y`{`q`y`j`y`j`y`{`w`j`y`q`y`j`y`j`y`j`y`j`y`j`w`{`j`y`j`d`yah`j`y`d`yah`y`j`y`j`y`a`a`a`a", +"atatatatae`y`j`yae`{`yae`j`y`q`y`j`y`jae`y`q`y`j`{`j`j`y`{`p`y`j`j`w`y`j`y`j`jar`y`j`{`j`{`wae`y`r`y`{ae`y`{`j`y`j`y`j`yae`w`j`y`j`jadadadadagad`jada``j`j`g`jadad`y`jad`p`y`j`ja``p`j`yadad`w`ja``jad`y`j`y`j`y`jar`j`yarae`w`j`qa``j`j`{`j`w`yar`yae`yar`y`{ae`y`{ae`y`wad`q`y`y`j`{`w`j`y`j`y`q`{`j`j`y`j`y`j`y`j`y`j`q`y`{adarae`yae`y`{`y`r`y`y`q`y`{`jar`j`w`jad`y`j`y`w`j`y`q`y`j`sad`j`wad`q`j`y`j`w`j`wad`j`y`j`w`j`w`y`q`y`q`y`j`w`y`y`j`j`y`jaradad`gajadar`j`y`y`yae`yar`j`w`y`j`yae`y`jae`y`j`yae`yar`j`y`q`y`j`j`w`{`j`{`y`j`{`w`{`q`y`j`w`j`y`w`y`j`y`j`y`r`yad`{`qa``j`q`yadae`j`yad`j`y`yae`j`y`y`q`y`j`w`j`j`w`j`j`y`jadarad`y`q`j`w`y`j`y`q`y`j`y`q`yae`y`{`q`y`y`{`j`w`yae`y`y`j`{`j`j`w`y`j`y`{ad`q`j`y`{`jar`y`jar`yar`j`w`y`r`yae`w`y`j`{`{`y`jar`y`w`j`y`{`j`{`w`yadadadag`gaj`gadagadadadag`gag`i`g`j`{`y`{`j`{`yar`y`j`{`j`w`j`y`w`j`{`j`jar`y`y`r`y`j`d`w`y`j`y`jar`j`y`j`yadad`jad`j`jadad`gadadadadajadadadadadadadadadadadadad`y`j`j`y`j`j`y`j`w`j`yadadad`j`y`j`wae`yae`y`j`q`y`j`{adag`n`gad`j`j`w`y`w`j`q`y`j`qadadadagad`ja``j`y`j`j`jad`y`j`jad`j`qad`j`w`j`ja``jadadagadad`ja``j`j`y`j`j`y`q`y`j`w`y`j`j`y`q`y`j`y`j`y`j`y`j`y`{`j`y`j`y`jae`w`j`y`j`y`y`r`y`j`y`j`{`wae`j`y`j`yae`y`{`j`y`q`y`j`y`y`j`j`y`j`y`j`y`j`y`j`y`j`y`j`d`y`d`y`d`y`j`a`a`a`a", +"atatatat`j`y`{`q`y`yae`w`{`j`{`yae`y`y`j`{`j`y`{`q`y`w`y`j`yae`y`j`{`y`j`y`y`q`y`j`y`j`w`j`{`y`w`j`yae`w`j`{`w`j`w`j`y`qad`{adad`j`yad`wadagag`hada`adajad`gad`j`j`p`y`qa``jada``j`j`y`jad`w`j`yadad`y`q`y`j`y`q`{`y`q`y`j`{`y`j`y`{`y`w`j`y`{`j`yae`y`wae`y`j`w`{`q`y`{`w`j`y`j`j`y`q`{`y`j`w`j`j`y`j`w`y`y`ra``jar`y`w`y`j`yar`j`y`q`w`y`j`w`y`jar`y`{`j`w`y`y`{`j`s`j`j`y`j`y`j`y`j`y`j`w`j`y`y`y`j`y`y`j`y`j`s`j`{`w`y`j`{`y`yae`y`y`q`{`j`y`q`yadar`y`y`yadag`gad`j`{`q`{`q`y`q`y`{`y`jar`j`w`{`q`y`w`{`q`y`y`{`q`y`y`j`w`j`y`j`{`w`{ar`y`j`y`jar`{`j`{`y`j`y`j`yar`jada``j`j`p`y`j`j`w`y`qa``w`y`j`y`q`y`y`jar`j`y`y`j`w`j`y`wad`y`w`j`y`p`j`y`j`y`j`w`j`y`j`y`j`y`qa``j`{`j`w`{`q`yae`y`r`{`w`{`w`{`y`jar`y`q`j`s`j`yae`w`y`{`jar`y`j`{`y`{`j`{`w`y`{`j`w`{`j`w`{`j`{`{`y`r`y`q`y`j`y`qadad`gag`gaj`gadaj`gad`gad`g`gagag`j`yar`{`yae`y`q`y`{`w`{`{`j`{`y`j`w`y`j`j`w`y`y`j`y`q`y`j`y`q`y`y`j`w`jadadadadadad`gadadadadadadad`gadadadadagadad`gagadadad`q`y`y`j`y`y`q`y`j`w`j`gad`gad`j`j`y`j`yar`j`y`y`j`wadadag`gajad`y`j`y`j`y`q`y`y`y`yadad`gadad`y`j`w`j`y`j`s`y`j`y`j`y`y`ja``j`ja``j`jadad`g`~ad`yad`ja``j`y`y`y`j`y`j`y`j`w`j`y`j`y`j`y`w`j`y`j`w`j`y`y`jar`y`{`yae`y`w`j`{`w`j`{`y`y`w`j`y`y`w`{`y`y`j`y`j`y`j`y`y`j`y`j`y`j`y`y`j`{ad`y`j`y`jah`jah`y`y`jah`y`d`{`a`a`a`a", +"atatatat`y`j`y`{`j`y`y`{`{`j`w`j`wae`y`w`y`j`y`j`{ae`y`j`j`wad`yae`q`y`j`ra``j`y`j`y`j`w`j`yae`y`wae`y`y`j`y`q`y`j`y`j`y`y`jadad`y`qad`jad`gag`gadadadadadagad`gad`jadad`j`y`p`y`jad`j`yad`j`j`j`j`sae`y`y`yae`y`j`y`j`j`y`j`j`w`j`yae`y`y`j`w`{`y`q`y`{`{`j`wae`y`{`q`{ae`w`y`y`jad`y`j`jar`y`y`q`j`y`j`y`j`y`y`wae`{`j`{`w`j`{`y`j`{`y`q`{ae`w`j`y`r`y`j`j`y`j`w`y`{`ja``q`y`j`y`q`y`y`j`y`j`w`j`w`y`r`y`y`q`y`j`w`j`j`y`j`w`j`y`q`y`j`j`y`w`yae`y`j`yae`y`j`wad`g`gadad`y`j`{`y`jar`j`y`w`j`yae`y`{`j`y`yae`w`j`y`{`j`j`y`j`y`q`y`j`yae`jar`wae`y`yar`jar`yae`w`{`j`{`q`y`qad`y`jad`y`yad`j`j`y`j`q`j`y`j`j`y`y`j`j`y`p`j`j`y`j`jadad`y`q`y`y`q`ja``j`y`j`wad`q`y`j`y`j`j`y`w`{ae`y`y`q`y`y`j`j`yae`{`wae`y`j`y`y`j`y`q`j`j`y`q`y`j`y`q`{`q`y`{`r`y`{ae`w`y`{`j`y`{`wae`y`q`{`j`{`y`r`y`j`y`j`yad`gag`gagadadad`gaj`gaj`gaj`g`iadae`w`y`j`{`y`r`yae`y`wae`w`j`y`j`{`y`j`q`{`j`q`y`j`w`j`y`y`r`j`j`y`q`dad`gad`gadajadadadadadadadajad`gadadadadadad`gadadadad`y`q`y`q`y`j`j`y`j`j`ja`adadad`pad`y`j`y`q`y`j`y`jadad`gag`gadad`j`j`j`y`j`{`r`j`y`jadadagadad`j`y`ja``j`y`jad`j`y`j`p`j`yad`jad`jadadagadadadad`jad`~`j`j`j`y`j`y`j`yad`y`j`w`j`y`q`y`j`w`y`yae`y`r`y`j`y`q`y`j`y`j`y`{`j`y`j`y`r`j`y`{`j`j`j`y`jar`y`j`y`q`y`j`y`j`y`j`j`y`j`y`y`j`y`j`y`j`y`j`y`j`dah`y`j`j`y`j`a`a`a`a", +"atatatat`y`{`q`y`{`wae`y`wae`y`yae`y`wae`{`j`w`j`yad`{`y`q`y`{`j`w`y`j`ja``jar`{`j`w`yae`y`q`{`yae`y`{`r`y`j`j`j`y`y`j`j`w`j`j`y`y`jad`y`j`n`h`~ad`qa``j`y`yad`w`j`y`p`y`j`w`j`j`pa``jadadada`ad`w`y`jae`y`w`jar`y`jar`y`y`qa``j`y`{`q`y`{`r`y`{`j`y`{`j`{ar`y`{ar`j`y`y`j`y`y`r`yar`y`p`y`j`y`j`j`ya``r`y`j`{arae`y`j`w`y`j`{`y`yar`y`{`{`j`w`y`{`y`j`y`w`{`y`w`y`j`y`q`jad`q`j`y`y`j`{`j`w`y`j`{`y`j`y`y`q`y`j`j`y`j`{`w`y`{`q`y`{`j`y`w`{`y`j`q`y`y`q`y`q`j`yaradadajad`yar`j`{`w`y`j`{`y`j`{`y`wae`w`{`w`jar`yarae`w`y`w`y`q`y`j`y`jar`y`{`j`y`y`q`yae`y`{`y`j`w`y`q`y`y`j`y`j`y`w`j`j`y`r`y`y`w`y`j`wa``j`q`y`q`y`q`y`j`y`y`w`q`y`y`q`j`j`yad`j`s`j`q`j`sae`y`j`w`j`j`w`y`{`j`y`yar`{`y`{`jar`y`{`q`y`yae`y`jar`j`ja``y`j`w`{`y`j`y`{`j`y`{`y`j`{`yar`y`j`yae`w`{`j`w`{`yae`yar`y`y`j`y`wae`y`w`jadag`g`gaj`gadadaj`gadad`gag`n`h`j`{`{`q`y`{`j`{`w`{`j`y`y`j`{`y`w`j`{`y`w`y`y`yae`y`j`y`j`y`y`jadad`g`gajadadadadadadadadadadadadadadajad`gadagadadadadad`j`y`j`y`j`y`w`yae`y`y`y`q`yadadadad`j`y`j`y`j`yad`wadaj`gadadad`yad`y`j`w`y`j`j`w`y`jadadadadad`y`j`y`j`y`ja``ja``jad`yadad`yadadadadad`~adad`jadad`y`yada``jad`y`j`j`y`j`y`j`y`j`y`{`y`j`yae`y`j`y`y`j`y`y`j`{`y`r`y`j`y`j`w`{`j`y`yae`w`y`j`y`{`y`j`w`j`y`j`y`j`y`j`y`j`y`j`y`j`y`j`y`j`y`y`j`d`y`d`y`d`y`dah`y`a`a`a`a", +"atatatat`wae`y`yae`y`j`{`yae`y`j`wae`y`y`j`q`{`y`j`j`j`y`j`y`q`yae`y`j`yad`jad`{`y`j`j`y`j`y`q`j`y`j`y`{`w`jadad`j`y`qa``j`jad`j`y`jadadadag`gadad`j`y`q`j`y`y`q`y`ja``j`yada`ad`j`j`s`jadad`jad`j`y`p`y`j`{`y`jar`j`y`jar`{`j`wad`{ae`w`y`{`q`y`r`y`y`q`{`j`w`j`{`j`y`w`j`y`j`yae`y`{`j`j`y`q`{`y`j`w`j`j`s`j`y`yar`j`{`q`y`j`j`{`j`r`y`{`yae`y`jar`j`y`j`r`{`jar`y`y`y`qadad`j`w`j`w`j`y`j`{`p`j`w`j`{`jad`w`y`qad`y`jad`j`y`j`w`yae`y`j`q`{a``jar`j`y`j`y`w`j`y`j`padadagad`y`r`y`jar`j`w`j`y`r`y`j`{`q`y`{`{`j`y`y`j`j`j`{`p`j`w`{`j`{`r`y`yae`y`y`q`y`q`y`q`{`j`y`jarad`w`j`j`y`q`y`j`y`j`q`j`y`j`y`j`w`j`yad`y`j`y`q`j`jad`y`j`j`y`j`p`y`q`y`j`y`y`j`y`j`y`j`j`y`q`j`j`j`q`{`y`j`j`wae`w`{`y`j`y`{`q`y`j`w`y`y`j`w`j`j`y`j`q`y`wae`y`r`y`q`{ae`w`j`{`r`{`w`yae`{`{`j`{`w`{`j`yar`jar`y`j`y`j`y`jadadagag`gaj`gadadag`gadad`gag`n`h`j`yae`yar`j`{`j`wae`y`q`yae`y`j`y`j`yaeae`w`y`j`yar`j`y`q`y`jadadagadagadadadadadadadadadadad`jadadadad`gadaj`gadag`gadad`j`y`q`y`j`y`y`q`j`y`j`{`ja``j`qad`gad`j`j`y`j`jadadadagadadadad`jadad`ja``j`jad`y`jadadadadadad`j`jad`y`jadadadadadadadadadadadadadadagadada`ad`j`jad`y`ja``j`yad`{`q`y`j`y`j`y`j`j`j`y`q`y`j`w`j`y`w`j`{`y`q`{`y`y`r`y`{`j`y`y`q`y`y`j`{`q`y`j`y`{`j`y`j`y`w`j`y`j`y`j`y`j`j`y`j`yad`j`yad`j`yad`j`d`y`jah`j`j`a`a`a`a", +"atatatat`y`j`y`j`{`{`w`j`{`y`q`y`y`{`y`jar`{`y`yae`w`y`y`jar`y`{`ja``{`q`j`ya``q`j`w`y`qa`ad`j`j`w`y`r`{`y`y`j`yad`j`j`y`j`w`y`p`yajad`g`gad`g`yad`y`q`y`j`y`q`{`y`j`w`y`j`j`w`j`w`ja``j`ja``q`y`yad`yad`j`yar`j`y`y`r`y`y`jar`y`j`y`j`j`j`y`r`y`y`j`{`yar`j`{`{`y`y`y`{`yae`yar`j`yar`{`w`j`y`j`q`y`{`y`w`j`{`q`y`j`{`j`y`yae`y`p`{`y`y`q`{`w`j`w`{`y`yae`y`y`y`yae`y`r`y`yad`gad`j`yad`{`y`r`y`y`y`j`{`j`w`j`{`y`yae`w`y`y`r`w`y`j`y`q`y`y`jar`y`{`j`y`w`j`y`j`y`j`ya``j`padad`{`y`w`j`y`j`yar`j`y`q`{`y`yar`j`{`w`j`{`w`{`w`y`y`j`y`q`y`y`{`y`w`{ar`j`y`{`j`y`j`y`y`w`{`ja``j`w`j`y`j`y`j`w`j`y`w`j`j`w`j`y`j`w`j`j`y`y`q`y`y`w`j`y`y`q`y`j`y`j`w`j`y`q`j`y`j`q`y`pa``jad`w`y`j`w`{ar`y`{`yae`w`{`q`{`{`w`{`{`j`y`q`{`j`y`j`w`j`w`j`y`wae`y`y`yar`y`y`{`y`y`{`j`{`y`q`{`w`j`{`jar`y`{`yae`yarae`w`y`w`j`g`g`i`g`gadaj`gadadagadadad`nac`{`j`w`y`{`j`y`yar`{`y`{`j`y`{`jar`j`w`j`y`j`w`j`j`y`y`j`j`yadadadadadadadadadadadadad`yad`j`y`w`y`j`p`jadadad`gagadadad`j`w`j`y`j`q`j`y`j`w`y`j`y`w`j`yadadaj`gadad`jadad`yadadadadad`ja``q`y`y`j`qa``y`qad`yadadad`g`y`jad`yadagadadadaj`gagadadadadadadadad`gadadadad`ja``y`ja``j`w`j`y`y`j`j`y`j`y`j`w`j`y`j`y`y`j`y`y`j`y`j`y`j`y`y`j`j`y`yae`y`w`yae`y`j`{`j`y`y`jar`j`y`y`j`yae`y`j`y`j`y`j`y`y`jad`j`yad`j`y`j`y`jaha``jah`j`y`y`a`a`a`a", +"atatatat`j`yae`y`j`y`j`{ar`j`{`{`q`j`{`yae`j`w`y`j`{`j`j`j`y`j`j`q`y`y`j`y`j`y`jad`j`j`j`w`yadad`j`j`y`j`yar`j`wa`ad`j`ja``j`j`yadadadadad`jadad`j`y`j`w`y`j`j`y`j`y`q`y`j`y`y`j`y`j`w`j`w`j`y`j`q`y`j`y`j`yar`j`y`{`jar`w`{ae`y`w`{`wa``j`j`y`yarae`w`yaearad`wae`r`y`j`{`y`j`y`jad`j`y`{`wad`yad`j`jar`y`ja``j`p`y`j`w`y`y`q`{`y`jar`j`y`y`{`{`j`j`j`w`y`r`yar`j`w`y`yae`q`y`yadad`j`wae`y`y`q`j`w`j`w`y`j`y`j`q`y`y`j`q`y`{`j`yar`j`y`jar`y`j`w`j`{`y`{`wae`y`q`y`q`j`y`jad`pad`j`{`y`w`j`y`j`{`y`y`r`{`j`y`q`y`j`{`j`y`jae`y`j`w`j`y`jar`j`{`j`yae`w`{`q`{`w`{`j`j`j`w`{`j`q`y`j`y`q`y`j`y`j`y`j`w`j`y`j`j`y`j`w`j`j`w`y`j`{`j`w`{`j`y`j`j`w`j`y`j`w`j`w`jad`y`j`j`ja``j`w`j`j`y`jae`w`y`jar`{`y`jar`j`y`q`{`yae`y`w`y`q`j`y`y`jae`y`y`q`j`y`yaear`j`wae`yar`yar`{`j`y`{`yar`j`{`q`{`j`w`y`j`y`j`yae`w`jadagacag`hadagadag`gad`gag`hag`g`j`w`{`q`y`j`j`j`yar`j`{`w`j`y`{`w`yae`y`y`j`y`y`q`j`y`w`j`jad`gadadadadadad`gadaj`yad`y`j`j`y`y`y`y`w`j`y`y`padadad`gad`j`y`j`y`y`wae`y`j`wae`y`j`y`q`y`y`jadadad`gadadadajadadadadad`jad`jad`y`j`j`y`j`j`w`jadadad`gad`jadad`g`i`g`gagad`gagagad`gadadadadadadadad`jad`j`j`y`j`j`y`q`j`w`y`j`s`j`y`j`y`j`y`j`y`j`y`j`j`{`w`{`j`y`j`w`y`{`q`yae`yae`w`y`j`w`j`{`q`y`y`j`yae`y`w`j`y`j`y`j`y`ja``j`y`ja``j`j`y`ja``j`~`y`j`jao`j`d`jah`a`a`a`a", +"atatatat`y`{`q`{`y`j`{`y`j`{`j`y`yae`y`j`w`j`y`jae`y`j`w`j`j`w`y`j`y`j`{`q`y`j`w`ja`ad`w`j`y`j`y`qa`ad`j`yae`y`j`y`jadad`j`j`y`wad`jadadadad`jad`y`r`y`yae`{a``q`yae`w`{`y`j`w`yae`w`y`y`j`s`j`j`y`{`q`y`j`w`yae`y`w`j`y`y`j`w`j`{`yaear`y`jad`yaear`y`j`yae`y`{`y`{`y`y`q`{`w`{`q`yar`j`jar`yae`y`q`yae`ja`arae`y`w`yae`w`y`j`y`j`y`j`{`w`yae`q`y`w`{`yar`yae`y`yae`yae`w`y`j`y`j`qa``jad`y`jar`y`j`y`y`j`y`y`w`y`j`{`j`y`y`y`j`wae`y`yar`y`j`y`j`{`y`q`{`j`j`w`y`{`ja``y`j`p`yad`jad`wae`{`w`yae`y`q`yae`y`w`{`j`w`jar`y`q`y`w`j`y`yae`y`j`y`q`y`{`w`j`y`{ad`{`yar`j`w`y`j`wa``j`y`j`y`j`y`j`w`j`wad`{`j`y`q`y`q`y`j`j`w`j`y`j`q`y`j`w`j`y`qad`y`y`j`y`j`y`j`w`j`y`j`w`y`j`q`y`j`y`j`w`y`{`yae`y`y`r`y`y`{`{`wae`w`yae`w`j`y`y`j`j`w`j`y`j`w`{`y`r`y`y`j`{ar`y`{`j`y`yae`y`q`y`r`y`y`{`w`{`{`y`{`q`y`j`{`w`{`g`gac`iag`gadadad`gadaj`gac`iad`j`yae`yar`y`yar`j`yar`j`y`{`q`y`j`j`y`q`yae`w`y`j`y`j`y`qadagadadadadadadadad`p`j`y`p`j`y`w`j`j`q`j`y`q`j`y`j`jadad`ja``j`yae`w`j`y`j`y`y`y`j`w`y`j`{`y`y`j`wadadad`gaj`gad`gadad`jad`jad`yad`j`y`j`w`j`yad`jad`gadadadad`gaj`g`g`kag`g`iag`i`g`gaj`k`g`~adadad`~ad`ya``j`j`ya``jad`y`y`j`j`y`y`j`y`j`y`q`y`y`j`y`j`y`w`j`y`jar`j`{`y`r`y`y`j`y`q`y`j`y`{`j`y`y`y`r`y`y`y`j`y`j`y`j`y`y`j`y`y`j`jad`j`yad`j`y`j`j`y`j`jad`y`j`ja``j`a`a`a`a", +"atatatat`{`j`{`j`y`j`{`yad`{`j`y`j`j`yad`{`j`{ad`{`q`y`y`j`w`j`y`j`j`w`j`j`y`j`j`w`jad`jad`yae`j`y`q`y`jad`w`j`y`q`y`qa``p`j`j`j`wadadadadad`ja`ad`j`y`j`j`w`{`y`j`y`j`q`{`y`j`y`j`{`{`j`{`y`y`j`y`y`j`{`y`j`y`{`y`yarae`y`{`j`w`j`y`j`y`w`j`qada`ae`w`yar`jar`j`wae`w`{`yae`y`{`j`y`w`y`j`j`w`y`j`y`yad`w`j`j`y`j`j`yae`y`wae`y`w`j`y`j`{`j`j`y`yae`w`j`y`j`w`j`w`{`w`yae`y`w`j`y`j`w`j`j`qa``j`{`w`jae`q`y`jae`w`j`w`j`jar`y`j`{`y`q`j`yae`w`y`y`r`y`{`y`y`j`{`w`j`w`j`w`y`ja``jadadadad`j`j`yar`y`j`yar`j`{`y`{`y`y`j`y`q`y`j`jad`w`j`y`j`y`j`y`jae`w`y`{ar`j`{`{`j`y`r`y`j`w`y`q`y`yar`j`j`y`j`j`s`j`w`j`y`j`w`j`y`j`j`w`j`y`y`j`y`j`w`y`j`w`j`w`j`y`q`j`y`j`p`yad`j`j`y`j`y`q`y`j`jar`y`q`yae`w`yae`w`yae`y`j`{`q`y`j`wae`y`jad`y`q`yae`y`q`y`{`{`q`y`j`{`q`{`yar`yae`y`{`yae`wae`yae`j`wae`{`y`w`j`{`j`jarad`gag`gag`iadadad`gadag`gac`gadad`j`{`j`wae`y`y`j`{`j`w`j`{`{`w`j`{`y`q`yae`y`y`r`y`y`ja`adadajadadagadadad`j`y`j`y`qad`y`j`y`y`w`j`y`y`w`j`wad`jad`j`w`jad`y`w`j`j`w`j`y`{`j`w`j`y`r`y`j`y`q`y`j`sadadadagadadadadadad`jad`j`qa``jad`j`y`jadadadadadadag`gaj`g`gadad`gag`g`iag`g`i`gaj`g`~adadad`j`yad`j`y`j`j`y`q`y`j`y`q`y`j`w`y`j`j`w`j`j`y`w`j`j`y`y`j`y`y`j`j`y`wae`w`y`j`y`q`y`w`j`{`q`{`j`{`wae`y`j`y`j`yar`j`y`j`y`j`y`ja``jadadada``jadadahad`j`yad`dad`a`a`a`a", +"atatatat`y`{`j`w`{`j`{`jarae`{`w`y`q`{`y`q`y`j`y`j`y`j`yae`y`j`w`j`g`jad`y`q`y`j`jadadadadad`jad`j`y`yadad`j`j`jad`j`y`j`j`g`~`jad`jad`g`y`j`yad`w`j`{`w`y`j`yae`y`r`y`{`j`{`y`jar`{`q`{`w`j`y`p`j`w`j`j`wa``r`yaear`j`{`y`q`y`{`yar`jar`yae`y`yad`jar`{`j`y`{`yae`{`y`{`j`{`y`q`{ar`yae`y`qa`ae`{`y`w`jaea``y`j`y`yar`j`{`j`y`yae`y`w`j`{`y`w`j`y`yae`y`{`wae`y`y`j`{`y`w`j`{`{`w`j`yad`yadad`y`q`y`{`w`yad`y`q`y`y`j`{`w`y`{`j`w`yae`y`w`y`j`{`q`y`j`y`jar`jar`y`{ae`w`yae`y`j`w`jadad`p`gad`q`j`j`yar`y`j`{`{`q`y`q`y`q`y`j`jadad`j`j`j`yar`j`y`q`y`wae`y`j`y`w`j`{`q`y`{`y`j`j`yad`j`j`ja``p`wad`y`j`yad`j`y`j`j`w`j`w`j`y`j`q`j`w`j`y`j`y`j`j`y`j`q`y`y`j`w`y`j`j`y`w`y`j`w`{`j`yar`y`j`{`y`w`{`j`{`y`{`q`y`y`q`y`y`j`{`y`q`y`j`w`j`y`w`yae`y`{`r`y`yar`{`y`jar`{`yar`{`q`{`w`{`y`y`{`w`{`y`yar`j`yae`y`w`j`yadadag`gagac`hajadad`gagag`gadad`j`y`j`y`j`{`y`r`yar`yae`{`w`y`j`w`{`y`j`{`y`q`y`y`j`y`jad`gadadadadadadad`y`j`w`j`y`y`j`w`j`y`j`y`q`{`j`y`y`j`y`j`w`y`j`y`y`j`{`wae`y`{`j`wae`yae`y`j`w`y`j`y`j`y`j`j`wadadadada`adad`ja`ad`ja``jad`ja``jad`jadag`gaj`gag`hag`~adadad`gag`gag`h`n`g`iad`gadadad`ja``j`jad`y`q`y`j`y`q`y`j`y`q`y`j`y`j`y`j`y`q`y`j`y`j`y`j`w`j`yae`y`y`j`y`j`yae`y`{`j`{`j`y`j`y`y`j`w`j`y`y`r`y`y`j`y`j`w`j`yad`y`jad`yad`jad`yad`jad`jad`~adad`a`a`a`a", +"atatatat`j`{`y`{`y`j`y`y`j`y`j`{`yae`j`w`j`j`y`p`j`y`y`j`y`j`y`{`j`w`y`j`jada``jad`jadad`g`gadad`y`q`y`y`wadad`y`gag`ja``jadad`uad`jad`jad`q`y`y`j`w`j`yae`y`w`j`y`y`q`{`wae`w`y`j`{`y`{`{`y`{`y`j`y`q`j`{`j`j`w`y`{`j`wae`y`q`{`j`y`y`j`y`wae`y`s`jad`{`wae`w`y`y`q`j`w`{`q`{`y`j`yar`j`{`y`j`w`j`{`y`q`y`j`w`j`y`j`y`q`y`y`q`{`y`j`{`y`w`{ae`w`y`j`j`w`yae`y`waead`j`j`wad`j`y`j`y`j`w`j`yad`w`j`{`j`yae`y`y`y`r`y`w`j`y`j`yar`y`y`j`{`j`w`y`j`yar`{`y`j`y`j`y`q`y`{`j`w`jar`y`j`y`j`y`jadadadad`j`y`r`y`y`q`yae`y`y`j`j`sadaj`g`g`gaj`gad`j`jar`y`j`y`w`j`{`{`j`w`y`y`q`{`w`y`j`j`w`y`y`q`y`j`y`q`j`y`q`y`j`y`j`y`q`j`y`p`y`j`y`yar`j`q`y`j`y`w`j`y`j`p`y`j`j`s`j`j`j`w`j`y`j`y`q`j`yar`{`j`wae`y`w`{`r`y`{`yae`{`w`j`y`j`y`j`w`y`j`y`j`yae`w`j`y`yae`y`jar`y`yae`w`j`{`y`{`j`{`q`{`j`q`{`jar`y`jar`y`{`j`{`j`y`jad`gaj`gag`n`hag`k`g`hagag`hadad`j`w`y`q`{`j`y`j`{`y`j`{ae`y`j`{`jar`yae`y`jar`j`w`j`w`jadagadadadadad`w`j`y`j`s`j`y`j`w`j`y`w`j`y`j`w`j`y`y`q`y`j`q`j`j`w`j`j`y`w`j`w`j`y`w`j`yar`j`{`j`w`yae`w`y`j`y`j`y`p`jad`ja`ad`jadad`jad`jadadadadadag`hag`g`i`gad`gagadadadadad`g`gag`hagag`g`~`gadad`jad`y`y`ja``j`y`j`y`j`y`j`y`j`y`y`q`y`y`j`j`y`j`y`j`y`j`y`j`y`y`q`j`y`y`j`w`{`j`y`q`y`y`y`j`wae`y`y`{`j`w`j`{`j`y`w`j`{`j`y`q`y`jadadadadadad`~adad`yad`ja``jad`a`a`a`a", +"atatatat`y`y`j`j`jae`y`{`yae`w`yae`w`{`y`j`w`j`y`j`{`y`y`r`y`y`j`j`y`y`jad`y`jadada``jad`jadajadadad`j`jae`y`j`jadadad`y`q`y`w`{adad`yad`w`j`y`q`yae`y`y`q`yae`w`y`r`{`y`j`y`yae`y`y`j`w`j`y`r`yar`j`y`w`j`yad`{`j`y`j`{`y`y`{`j`w`yae`w`j`{ar`{`{`j`j`w`j`{`y`{`q`{`y`y`j`{`y`yarae`y`w`j`{`w`j`yar`j`y`{`w`j`y`j`pad`j`{`wae`y`{`wae`y`q`{`j`y`y`q`y`{`y`jar`y`{`y`wa``j`{`y`q`yae`w`y`q`j`y`y`j`q`y`{`r`y`y`q`j`y`y`j`j`y`wae`yae`y`q`y`wae`y`j`yae`w`y`r`yar`{`yae`w`y`q`y`j`y`yad`w`jad`sadadadad`j`{`w`j`y`j`y`w`j`w`yaj`gadadad`gag`gag`~ad`j`w`j`y`j`j`y`w`{`jae`w`j`y`jar`j`y`j`j`j`j`w`j`j`y`y`j`j`s`y`j`p`y`j`j`y`j`y`j`q`y`j`y`y`w`jad`y`q`j`y`y`q`j`y`j`y`s`yae`y`q`y`{`y`q`yae`y`yae`w`{`yae`y`w`y`r`yae`yar`yaear`yae`y`r`y`j`w`y`j`yar`j`{ar`y`{`r`y`{`{`w`yae`y`w`{`jar`{`yae`y`jar`{`y`{`q`y`w`{`j`wad`g`gad`gag`gag`gagag`hagad`gad`j`j`{`j`y`j`{`y`q`yar`y`w`yar`j`y`j`{`q`y`{`j`y`j`y`{adadadadadadad`j`y`j`y`j`j`w`j`y`j`y`j`y`j`y`j`{`w`j`y`j`y`j`ya``j`y`j`yae`y`j`{`y`j`{`y`j`y`q`y`yae`y`y`y`j`q`y`j`yad`y`j`w`j`p`j`qa`adada`adadadadadaj`hadadadadadad`gadad`~`jadad`gag`g`g`i`gajadadadad`jad`y`j`jad`y`q`y`j`w`j`y`w`jae`j`y`q`y`j`y`j`y`j`w`j`y`j`w`j`y`y`j`wae`y`y`j`y`y`j`j`y`{`j`w`y`j`j`y`y`j`y`y`j`j`y`y`j`y`y`jadad`yadadadadadadadadadadadad`a`a`a`a", +"atatatat`{`j`{`{`y`yae`y`w`{ae`y`y`j`yae`y`y`j`y`q`y`j`y`yae`y`w`j`j`w`jad`qadad`j`j`gadadadadad`y`jad`gad`y`w`y`ja``jad`j`j`j`y`y`q`ja``j`y`j`y`w`j`{`yae`y`y`j`{`y`q`y`{`j`y`waear`y`yarae`y`{`y`w`{`y`{`q`y`q`y`j`w`{`j`y`q`{`{`y`q`{adadae`w`y`{`y`{`w`j`{`y`{`jar`{`y`r`y`y`{`j`w`y`{`y`{`wae`y`j`wae`y`y`q`y`y`jad`y`{`q`{`j`j`y`{`j`w`yae`y`y`q`{`y`j`{`j`wae`{`y`p`j`y`y`q`y`j`y`y`r`y`j`y`y`q`y`jar`y`{`y`q`y`q`{`y`y`q`y`w`{`j`y`yae`w`y`w`j`{`y`yae`y`q`{`{`j`y`{`y`w`jar`j`y`j`j`yadad`jad`s`j`{`w`j`yae`y`j`{`wadajadad`padad`gag`n`hag`j`w`{`w`j`j`y`q`{`y`yar`j`y`y`q`y`y`q`y`ja``y`q`y`j`y`j`j`j`j`s`j`s`j`y`w`j`y`y`j`j`q`y`j`q`y`y`j`w`j`y`j`y`q`y`j`y`j`wae`y`y`q`{`y`q`{ar`y`yae`w`y`{`j`{`w`{`ja``q`j`yad`y`q`y`y`j`w`j`y`j`y`yae`w`y`jae`y`y`r`y`yaear`j`y`{`yae`y`w`j`y`j`yae`w`{`j`{`q`y`j`y`j`wadadad`gaj`g`gag`g`i`gadadadadad`q`y`w`j`y`{`j`yae`yae`j`y`{`w`j`y`{`y`j`w`jar`y`j`w`{adadadadada``j`w`j`y`j`y`j`w`j`y`w`j`y`y`q`y`j`y`j`w`j`w`j`y`q`y`j`y`w`y`{`j`w`{`jar`j`y`j`y`r`y`j`y`r`y`j`y`q`y`j`w`jad`y`ja``y`j`w`j`jad`wadadadadadadadadad`jadadadadadadad`jadad`g`k`gag`h`gadadad`yad`j`y`j`y`qa``j`y`y`j`y`j`y`w`j`y`j`y`j`y`j`y`j`ya``q`y`y`j`wae`y`j`y`w`jae`y`w`{`j`w`j`y`j`y`j`w`y`j`w`j`y`w`j`y`j`y`y`j`y`j`yadadadad`jad`ja`adad`jad`~`q`a`a`a`a", +"atatatatae`y`{`y`r`y`yae`yae`y`{`jar`y`j`y`r`y`j`j`y`j`yae`y`j`j`y`y`jad`yadad`gad`jadadadadagadadadad`yaj`g`j`{`j`wad`jadadadad`j`y`y`j`y`j`w`j`y`j`y`j`w`j`y`q`yarae`y`q`{ar`y`j`yae`wae`y`{`q`yae`y`r`y`y`j`y`j`yadae`wae`w`{`j`wae`y`yagad`j`yar`y`r`y`j`{`q`yar`{`j`y`j`{ar`j`wae`yae`w`j`{`y`q`y`j`{`yae`{`yadadad`j`{ad`jad`g`j`jar`yae`y`w`j`{`j`q`yar`y`y`j`{`q`yae`w`j`y`j`y`q`j`y`j`wae`w`j`yae`y`j`y`r`y`j`{`y`j`w`j`{`j`wae`y`y`q`y`j`{`j`y`j`{`q`y`yae`w`{`w`j`r`y`j`{`y`j`y`w`{`p`jad`pad`j`y`y`j`w`j`w`y`q`y`j`gagadad`j`j`padad`g`h`nau`q`j`y`q`y`y`j`w`j`j`{`y`q`j`yadad`q`j`j`y`j`ja``q`ja``qa``j`y`j`j`y`j`q`jad`jar`y`j`y`j`{ad`j`j`w`j`j`wad`y`j`q`y`y`j`s`jae`y`j`{`jae`w`{ae`yar`j`{`w`{`j`yar`yae`w`y`{`j`yar`j`{`y`w`j`y`r`y`yae`w`{`jar`yaear`y`j`{`yar`j`y`q`{ae`y`w`{`q`{`y`{`q`{`y`{`j`w`{`jaj`gadadadadadag`g`gaj`gadadadad`y`yae`w`j`yae`w`{`j`w`yar`j`y`{`j`j`y`{`j`y`j`y`{`j`wadadadad`j`q`j`y`j`j`y`q`y`j`y`j`j`y`q`{`y`j`y`j`j`y`j`y`j`y`j`w`j`y`j`q`y`{`j`w`y`j`y`yae`y`y`j`w`j`y`y`j`y`j`y`j`y`j`y`j`j`q`y`jad`y`y`j`j`j`w`jadad`s`jadadad`j`yad`jad`yadadadadadad`hagadagadadad`j`j`w`j`j`y`j`y`j`j`w`j`j`w`j`y`j`y`j`y`j`y`j`y`j`j`y`j`y`j`y`j`y`jar`j`y`y`j`{`j`j`y`y`j`{`w`j`{`y`j`y`j`y`j`y`j`y`y`j`j`y`j`y`ja``jadad`g`~`j`y`jad`~a`ad`a`a`a`a", +"atatatat`{`jar`yae`y`yae`w`y`j`y`{`j`{`q`y`y`j`y`y`j`y`j`yar`y`j`jad`y`j`y`jad`wadadada``jadadadadadadad`jad`g`j`y`y`waea``j`padad`j`w`j`y`y`{`j`y`w`j`j`y`yae`y`j`y`y`y`{`j`yar`y`{`y`yarae`y`{`yae`y`yar`j`{`w`y`j`w`y`j`y`{`y`{`{`wae`y`y`gad`j`{`yae`w`y`{ae`y`{ar`y`w`y`j`y`y`{`w`yae`{`wae`w`{`y`w`j`y`y`q`{`qa`adadar`y`jad`wad`y`j`y`w`{`{`y`j`y`y`j`y`j`ya``{`j`w`y`{`j`y`{`j`y`q`y`y`y`j`y`j`w`y`y`q`y`{ar`y`jar`y`y`y`q`y`yarae`w`{`jar`yar`j`w`j`{`r`y`yae`y`{`y`jar`y`jar`y`j`j`y`yad`j`gadad`j`j`y`y`{aear`y`j`w`y`gagadada``j`wad`j`p`g`n`cad`j`y`q`y`j`y`w`j`y`j`yae`w`y`j`yad`s`j`y`j`y`q`jad`y`q`y`q`y`j`yad`y`w`ja``j`y`w`j`y`w`yadad`y`w`j`j`y`q`j`y`j`wae`y`w`y`r`y`y`y`j`{`w`j`y`yae`y`{`wae`y`{`q`{`yae`w`{ad`yar`j`y`jae`w`yarae`y`yae`y`y`{`{`yar`yae`y`{ar`y`y`{`j`y`j`yar`j`y`{`j`yar`j`{`w`yae`wadadadadad`gadadadadadadadadad`j`j`y`{`j`w`y`{`wae`y`yae`{`w`y`j`y`q`y`{`r`y`{`j`y`j`wadadad`~`y`y`q`y`j`y`y`q`y`w`{`j`y`y`q`y`yar`j`y`yar`j`y`y`j`{`w`y`j`y`{`yae`yar`y`rar`y`{`q`y`j`y`j`y`y`j`w`j`w`j`y`y`y`j`y`j`j`wad`j`ya``jad`w`jad`ja``j`y`j`y`ja``jadad`y`jadadadadad`~`gad`g`ja``j`y`j`y`y`j`y`q`y`y`j`y`y`j`w`y`y`q`y`y`q`y`j`y`wad`j`y`j`y`j`w`y`j`y`q`y`q`y`y`y`j`y`q`y`j`{`w`j`{`y`j`y`y`j`y`j`wae`y`w`j`y`j`{`j`yadad`g`gad`y`j`yad`jad`a`a`a`a", +"atatatat`j`{`j`{`j`y`yae`y`j`{`w`jar`y`j`y`yae`w`j`y`j`y`y`j`j`y`y`j`wad`qad`y`j`y`p`yad`jadadad`j`q`yadadadadadad`j`y`jadada``j`w`j`y`j`y`w`j`{`q`y`j`y`y`q`j`w`y`y`j`jar`y`r`y`jar`j`q`y`y`{`q`y`r`y`q`j`{`w`yaear`yae`y`{`w`j`j`q`{`y`j`{`wad`j`y`w`{`q`{`j`{`y`q`{ae`y`{ae`y`j`r`yae`y`r`y`j`y`y`r`{`{`q`j`y`{`j`yadad`j`y`{arad`j`yadad`jae`j`y`q`y`j`yar`j`w`j`j`q`y`{`y`q`y`q`{`ja``j`j`w`j`{`q`y`j`j`y`j`y`j`yar`j`{`jar`y`{`j`y`r`y`jar`y`y`j`w`j`y`y`y`y`q`yar`y`jar`y`{`yae`y`w`j`w`j`wadadadad`g`j`w`j`j`q`y`y`q`y`q`yadag`h`q`j`y`ja``j`yad`gagagad`j`y`{`w`j`j`{`w`j`w`{`yad`q`y`jad`j`y`q`y`y`j`y`j`y`q`y`j`y`w`j`j`y`j`j`w`j`y`j`y`j`j`y`q`jad`y`p`y`j`w`j`y`j`y`{`j`{`y`y`r`{`w`j`{`j`{`q`{`q`y`jar`j`y`jar`j`y`j`{`wae`y`y`{`w`y`j`j`d`wae`w`j`{`q`y`r`y`{`j`{`w`j`{`jar`jar`y`r`{`y`{`y`r`y`y`jar`j`yae`yad`g`jadad`jadadadajadagadadad`gadae`j`w`yae`y`j`y`yae`y`j`{`w`{`q`{ar`yae`y`y`q`y`{`j`{adadadadad`y`j`j`w`j`j`y`j`j`y`q`{`y`j`q`yae`y`j`y`j`j`w`j`y`j`y`j`j`w`j`j`w`{`j`j`y`y`yae`y`y`yae`y`q`yae`y`y`j`j`w`j`q`y`j`y`j`y`j`w`j`y`q`y`j`y`jad`q`yad`qad`w`j`jadad`j`yad`jadadadadadadadadad`jad`j`w`j`j`j`y`j`y`j`w`j`y`j`j`j`y`j`y`jad`y`j`jad`y`j`y`j`y`j`j`y`j`y`j`{`w`j`y`r`y`j`y`{`j`y`y`q`yar`j`y`q`y`j`y`j`y`j`y`j`j`yad`yad`iag`g`~`jad`y`jad`a`a`a`a", +"atatatat`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a", +"atatat`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a", +"atat`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a", +"at`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a`a" +}; Index: external/mit/ctwm/dist/xpm/welcome.xwd =================================================================== RCS file: external/mit/ctwm/dist/xpm/welcome.xwd diff -N external/mit/ctwm/dist/xpm/welcome.xwd Binary files /dev/null and welcome.xwd differ Index: external/mit/ctwm/dist/xpm/xarchie.xpm =================================================================== RCS file: external/mit/ctwm/dist/xpm/xarchie.xpm diff -N external/mit/ctwm/dist/xpm/xarchie.xpm --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/xpm/xarchie.xpm 3 Sep 2015 12:20:04 -0000 @@ -0,0 +1,53 @@ +/* XPM */ +static char * xarchie_xpm[] = { +"64 38 12 1", +" s None c None", +". c dark olive green", +"X c blue", +"o c lightskyblue", +"O c gray85", +"+ c dark slate grey", +"@ c gray70", +"# c gray100", +"$ c #727277778585", +"% c red", +"& c gray15", +"* c black", +" ......... ", +" X .ooooooooo. ", +" XXXXX .o oooooo. ", +" XXXXXXXX .o ooooooo. ", +" XXXXOOXXXXXX .ooooooooo. ", +" XXXOOOOOOOXXXXX .ooooooooo. ", +" XXXXOOOOOOOOOXXXX .ooooooooo. ", +" XXXOOOOOOOOOOXXXXX ........... ", +" XXXOOOOOOOOOXXXXXXX+++++++++++++ ", +" XXXOOOOOOOOOXXXXXXXX+@@@@@@@@@@@+ ", +" XXXOOOOOOOOOOXXXXXXXXX+++++++++++++ ", +" XXXOOOOOOOOOOXX##XXXXXX+$#$#$#$#$#$#+ ", +" XXOOOOOOOOOOXXX#####XXX+$#$#$#$#$#$#$#+ ", +" XXXXXOOOOOOOOXXXX######XX++++++++++++++++ ", +" .........##XXXXXXOOOOOXXXXXX#####XXXXXX%%XXXXXX#& ", +" .ooooooooo.@##XXXXXXOXXXXXXXXXX##XXXXXXX%%XXXX #&* ", +" .o oooooo.#@@##XXXXXXXXXXXXXXXXXXX##XXX%%XXX#&&*& ", +" .o ooooooo.@##@@##XXXXXXXXXXXXXXXXXX###X%%XX#&**&# ", +" .ooooooooo. @@##@@##XXXXXXXXXXXXXXXXXX##%% #&*&&#& ", +" .ooooooooo.%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% &*&##&* ", +" .ooooooooo.%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%&*&#&**......... ", +" ........... @@##@@##@@##XXXXXXXXXXXX##%%*&#&* .ooooooooo. ", +"+++++++++++++ @@##@@##@@##XXXXXXXXX##*%%&#&* .o oooooo. ", +"+@@@@@@@@@@@+ @##.........##XXXX##**%%#&* .o ooooooo. ", +"+++++++++++++ .ooooooooo.@#XX#***&%%&* .ooooooooo. ", +"#$#$#$#$#$#$#+ .o oooooo.#@@#***&#%%* .ooooooooo. ", +"$#$#$#$#$#$#$#+ .o ooooooo.@##**&&#&%% .ooooooooo. ", +"+++++++++++++++ .ooooooooo.#@@*&##&*%% ........... ", +" .ooooooooo.@##&#&&* %% +++++++++++++ ", +" .ooooooooo.#@@#&** %%%%%%%+@@@@@@@@@@@+ ", +" ...........###&* %%%%%%%+++++++++++++ ", +" +++++++++++++##* %% +$#$#$#$#$#$#+ ", +" +@@@@@@@@@@@+%%%%%%%%%% +$#$#$#$#$#$#$#+ ", +" +++++++++++++%%%%%%%%%% ++++++++++++++++ ", +" +#$#$#$#$#$#$#+ ", +" +$#$#$#$#$#$#$#+ ", +" +++++++++++++++++ ", +" "}; Index: external/mit/ctwm/dist/xpm/xcalc.xpm =================================================================== RCS file: external/mit/ctwm/dist/xpm/xcalc.xpm diff -N external/mit/ctwm/dist/xpm/xcalc.xpm --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/xpm/xcalc.xpm 3 Sep 2015 12:20:04 -0000 @@ -0,0 +1,56 @@ +/* XPM */ +static char * xcalc_xpm[] = { +/*tan*/ +"64 38 14 1", +" s None c None", +". c dark slate grey", +"X c white", +"o c black", +"O c #727277778585", +"+ c light yellow", +"@ c gray70", +"# c green", +"$ c gray85", +"% c peachpuff4", +"& c tan", +"* c #8B8B5B5B7A7A", +"= c blue", +"- c gray", +" .......... ", +" ...XXXXXXXXXo ", +" ..XXXXXXXXXXooo ", +" ..XXXXXXXXXooXXo ", +" .XXXXXXXXXoXX Xo ", +" O.XXXXXXXXo ..... ", +" O+.XXXXXXXoO .. ", +" O+@....XXXXo+OOOOOO ", +" OO@@...#.......++++++OOOOO ", +" O+@....#..####......+++++++OO ", +" O+@....#.....##..###.....+++++OO ", +" O+@....#....##.......#.......++$%O ", +" O+@...#..###......###........+$%%O ", +" OOOO OO+++++......##......#........++$%%O ", +" O&&&&OOOOOOOOOOO++++++++......##..#.......++$%%%O ", +" OO&&&&&O&&&&&&&&&OOOOOO++++++++...##.......++$%%%%O ", +" O&&&&&&&&&&&&&&&&&&&&&&&OO++++++++.........++$%%%%%O ", +" O&&&&&&&&&&&&&&&&&&&&&&&&&&O**+++++++++....+++$%%%%%O ", +" O&&&&&&&&&&&&&&&&OOOOOOOOO&&&O+*+++++===++++++++$%%%%O ", +" O&&&&&&&&&&&&&&&&OO&OO@@@@@OOO+*O++**+++====++++$%%%%%O ", +" OO&&&&&&&&&&&&&&&&OO&&&O***@@@O**O++*++*+++++==++$%%%%%O ", +" O&&&&&&&&&&&&&&&&&&OOOOOO+*@@***OO++*++*O++++++++$%%%%%O ", +" OOOO&&&&&&&&&&&&&&&&&OOO&&O**@@*++*++++O**O++++++++$%%%%%O ", +"OXXXXO&&&&&&&&&&&&&&&OOO&&&O@@@*++*O++**+OO++++++++$%%%%OO ", +"oooXXXO&&&&&&&&&&&&&&OO&&&&O@@+O**O++*++*+++++++++$%%%%O ", +"ooooXXX&&&&&&&&&&&&&&&&&&&&O+**+OO++*++*O++++++++$%%%%O ", +"oooooXXO&&&&&&&&&&&&&&&&&&O+*++*++++O**O++++++++$%%%%O ", +"ooooooXX&&&&&&&&&&&&&&&&OOO*++*O++**+OO+++++++++$%%%O ", +"ooooooXXO&&&&&&&&&&&&&&OO++O**O++*++*++***+++++$%%%O ", +"oooooooXXO&&&&&&&&&&OOOO++++OO++*++*O+*+++*+++$%%%O ", +"oooooooXXO&&&&OOOOOO---$$$++++++O**O+*+++*O++$%%%O ", +"ooooooooXXOOOOO OOO---$$$++++OO+*+++*O++$%%%O ", +"ooooooooXXO OOO---$$$++++O***O++$%%OO ", +"ooooooooXXO OOO---$$$$+OOO++$%%O ", +"ooooooooXXO OOO----$$$++$%%O ", +"ooooooooXXO OOOO---$$%%O ", +"ooooooooXO OOO-%%O ", +"ooooooooO OOO "}; Index: external/mit/ctwm/dist/xpm/xcalc2.xpm =================================================================== RCS file: external/mit/ctwm/dist/xpm/xcalc2.xpm diff -N external/mit/ctwm/dist/xpm/xcalc2.xpm --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/xpm/xcalc2.xpm 3 Sep 2015 12:20:04 -0000 @@ -0,0 +1,50 @@ +/* XPM */ +static char * xcalc_xpm[] = { +"64 38 9 1", +" s None c None", +". c gray50", +"X c white", +"o c black", +"O c #727277778585", +"+ c gray70", +"@ c dark slate grey", +"# c light sky blue", +"$ c gray85", +" ", +" ", +" ............ ", +" ....XXooooXoX.O ", +" .XX..XXXXXXXXXO ", +" OXXX.XXooXoooXO ", +" O....OXXXXXXXXO++++++++++++++++ ", +" OO@@@@OXoXooooXO@@@@@@@@@@@@@@@@+ ", +" OOO@@+.OXXXXXXXXO.@@@@@@@@@@@@@@@+ ", +" OOO@@+oOXoooXooXOo+@@@@@@@@@@@@@@+ ", +" OOO@@+oOXXXXXXXXOo++@@@@@@@@@@@@@+ ", +" OOO@@++OXoooXooXOoo+@@@@@@@@@@@@@+ ", +" OOO@@@+OXXoXoXXXOoo+@@@@@@@@@@@@@+ ", +" OOO@@@++++++++++++++@@@@@@@@@@@@@+ ", +" OOO@OOOOOOOOOOOOOOOOOOOOOOO@@@@@@+ ", +" OOO@OoooooooooooooooooooooO@@@@@@+ ", +" OOO@O####################oO@@@@@@+ ", +" OOO@O####################oO@@@@@@+ ", +" OOO@O####################oO@@@@@@+ ", +" OOO@O####################oO@@@@@@+ ", +" OOO@OOOOOOOOOOOOOOOOOOOOOOO@@@@@@+ ", +" OOO@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@+ ", +" OOO@$$$@$$$@$$$@$$$$$$$$@$$$@$$$@+ ", +" OOO@$@$@$@$@$@$@$@@@@@@$@$@$@$@$@+ ", +" OOO@$$$@$$$@$$$@$@@@@@@$@$$$@$$$@+ ", +" OOO@@@@@@@@@@@@@$@@@@@@$@@@@@@@@@+ ", +" OOO@$$$@$$$@$$$@$$$$$$$$@$$$@$$$@+ ", +" OOO@$@$@$@$@$@$@@@@@@@@@@$@$@$@$@+ ", +" OOO@$$$@$$$@$$$@$$$$$$$$@$$$@$$$@+ ", +" OOO@@@@@@@@@@@@@$@@@@@@$@@@@@@@@@+ ", +" OOO@$$$@$$$@$$$@$@@@@@@$@$$$@$$$@+ ", +" OOO@$@$@$@$@$@$@$@@@@@@$@$@$@$@$@+ ", +" OOO@$$$@$$$@$$$@$$$$$$$$@$$$@$$$@+ ", +" OOO@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@+ ", +" OOO@$$$$$$$$$$$@@@@@@@@@@@@@@@@@@+ ", +" OOO@$@@@@@@@@@$@@@@@@@@@@@@@@@@@@+ ", +" OOOO$$$$$$$$$$$OOOOOOOOOOOOOOOOOOO ", +" OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO "}; Index: external/mit/ctwm/dist/xpm/xedit.xpm =================================================================== RCS file: external/mit/ctwm/dist/xpm/xedit.xpm diff -N external/mit/ctwm/dist/xpm/xedit.xpm --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/xpm/xedit.xpm 3 Sep 2015 12:20:04 -0000 @@ -0,0 +1,60 @@ +/* XPM */ +/*****************************************************************************/ +/** This pixmap is kindly offered by Ion Cionca - 1992 - **/ +/** Swiss Federal Institute of Technology **/ +/** Central Computing Service **/ +/*****************************************************************************/ +static char * image_name [] = { +/**/ +"64 38 12 1", +/**/ +" s None c None", +". c lightskyblue", +"X c darkslategrey", +"o c #727277778585", +"O c lightyellow", +"+ c gray70", +"@ c tan", +"# c limegreen", +"$ c forestgreen", +"% c white", +"& c darkolivegreen", +"* c gray85", +" ..XX", +" ...XX ", +" oooo ...XXXX ", +" ooOOOoo . ....XXXXX ", +" ooOOOOOOo ........XXXX ", +" ooOOOOOOOOo .. ...XXXX+XX ", +" ooOOOOOOOOOoo ... XX..XXX++XX ", +" oooOOOOOO++OOOo ...XXX..XXX++XX ", +" ooOOOOOOO++OOOOoo .....XX..XX+++XXX ", +" ooOOOOOO+++OOOOOOo .X..X.X.XX+++XXXX ", +" ooOOOOOOO++OOOOOOOOo ..X.XX..XXXXXXXX ", +" oooOOOOOOOO++OOOOOOOOOoo ..XX.X..XXX+XXXXX ", +" oooooOOOOOOOOO++OOOOOOOOOOOo .X.X.X.XXXX++XX ", +" oOOOOOOOOOOOO++OOOOOO+OOOOOo .XXXX..XXX++XXX ", +" ooOOOOOOOOO+++OOOOOO+++OOOOOo .XXX.XXX++XXXXX ", +" oOOOOOOOOO++OOOOOOOO+OOOOOOOo ..XX.XX++XXXXXX ", +" oOooooOOO++OOOO+OOO+OOOOOOOOo .X.XX++XXXXXXX ", +" oOo@@ooOOOOOO++OOOO+OOOOOOOOoo ..XXX+XXXXXXXX ", +" oOo@@oooOOOO++OOO++OOOO+OOOOOo .oXXXXX+++XX ", +" oOoo@@@ooOO++OOO++OOO++OOOOOOo o.XX+++++XX ", +" oo@@@@@ooOO+OO++OOOOO+OOOOOOOoooooXX+XXXXX ", +" oo@@@@ooOOOO++OOOOOOOOOOOOOOOoo@@X@@@@@o ", +" oo@@oo oOO++OOOOOOOOO+OOOOOoo@@XX@@@@@o ", +" ooo oOO+OOO+OOOOO++OOOoo@########@@o ", +" oOOOO++OOOO+++OOOoo####$$$$$$$#o ", +" oOOO++OOOO++OOOooo@#%%##$$$$$&&& ", +" oOOO+OOO++OOOOoo@@#%%##$$$$$$$$&& ", +" oOOOOO+OOOOOoo@@@#%%%%###$$$$$$$&$ ", +" oOOOO++OOooo@@@@@#%$%######$$$$$&& ", +" ooOOOOooo@@@@@@@@#%########$$$$$$& ", +" oOOOoo@@@@@@@@@@#$########$$$$$&& ", +" oOOOo+oooo@@@@@o#$$######$$$$$$&& ", +" ooOOo+o+++o@@@oo#$$$###$$$$$$$&&& ", +" ooOo+++++o@@@o #$$$$$$$$$$$$&&&$ ", +" oOOoo+++o@@o ##$$#$$$$&&&&&$ ", +" oO+++++o@oo ##&&&&&&&&&&$ ", +" oo***o@oo $$$$$$$$$$$ ", +" oooooo $$$$$$$$$$$ "}; Index: external/mit/ctwm/dist/xpm/xftp.xpm =================================================================== RCS file: external/mit/ctwm/dist/xpm/xftp.xpm diff -N external/mit/ctwm/dist/xpm/xftp.xpm --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/xpm/xftp.xpm 3 Sep 2015 12:20:04 -0000 @@ -0,0 +1,49 @@ +/* XPM */ +static char * xftp2_xpm[] = { +"64 38 8 1", +" s None c None", +". c black", +"X c gray85", +"o c gray55", +"O c blue", +"+ c red", +"@ c white", +"# c gray50", +" ", +" ....................... .................. ", +" .XXXXXXXXXXXXXXXXXXXXXX.. XXXXXXXXXXXXXXXX.. ", +" .XXXXXXXXXXXXXXXXXXXXXX.X. XXXXXXXXXXXXXXX.X. ", +" .oooooooooooooooooooooo.XX. oooooooooooooo.XX. ", +" ......................o.oXX. ............o.oXX. ", +" .........................oXX. ..............oXX. ", +" ...OOOOOOOOOOOOOOOOOOOO...oXX. OOOOOOOOOOO...oXX. ", +" ..OOOOOOOOOOOOOOOO+OOOOO..oXX. OOOOOOOOOOOO..oXX. ", +" ..OO@@@@@@@@@@@OO++OOOOO..oXX. @@OOOOOOOOO..oXX. ", +" ..OOOOOOOOOOOOOO+++OOOOO..oXX. OOOOOOOOOOOO..oXX. ", +" ..OO@@@@@@@@@@@++++@OOOO..oXX. @@@@@@@OOOO..oXX. ", +" ..OOOOOOOOOOOO+++++OOOOO..oXX. OOOOOOOOOOOO..oXX. ", +" ..OO@@@OOOOOO+++++++++++++++++++++++OOOOOOO..oXX. ", +" ..OOOOOOOOOO++++++++++++++++++++++++OOOOOOO..oXX. ", +" ..OO@@@@@@@@++++++++++++++++++++++++@OOOOOO..oXX. ", +" ..OOOOOOOOOOO+++++++++++++++++++++++OOOOOOO..oXX. ", +" ..OO@@@@@@@@@O+++++OOOOO..oXX. OOOOOOOOOOOO..oXX. ", +" ..OOOOOOOOOOOOO++++OOOOO..oXX. OOOOOOOOOOOO..oXX. ", +" ..OO@@@@OOOO@@@O+++@@@OO..oX. @@OOO@@@@OO..oX. ", +" ..OOOOOOOOOOOOOOO++OOOOO..o.@OOOOOOOOOOOOOO..o.. ", +" ..OO@OOOOOOOOOOOOO+OOOOO... OOOOOOOOOOOOOOO... . ", +" ...OOOOOOOOOOOOOOOOOOOO... OOOOOOOOOOOOOOO... . ", +" ........................ .................. . ", +" ...................... .................. .", +" ooooooo ooooooo .", +" oooooooooooooooooooooooooooooo oooooooooooooooooo . ", +" ooo.....ooooooooo.....oo...ooo ooooo.....oo...ooo . ", +" ooooooooooooooooooooooo.ooo.oo ooooooooooo.ooo.oo . ", +" ..............................@..................oo.o . ", +" .@#@#@#@#@#@#@#@#@#@#@#@#@###.@#@#@# # #@#@#@###.oooo.. ", +" .############################. #################. ", +" .##@#@#@#@#@#@#@#@#@#@#@#@###. # # # # # #@#@###. ", +" .############################. #################. ", +" .############################. #################. ", +" ............................. .................. ", +" @@@ ", +" "}; Index: external/mit/ctwm/dist/xpm/xgopher.xpm =================================================================== RCS file: external/mit/ctwm/dist/xpm/xgopher.xpm diff -N external/mit/ctwm/dist/xpm/xgopher.xpm --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/xpm/xgopher.xpm 3 Sep 2015 12:20:04 -0000 @@ -0,0 +1,56 @@ +/* XPM */ +static char * xgopher_xpm[] = { +/*i.cionca*/ +"64 38 14 1", +" s None c None", +". c blue", +"X c dark olive green", +"o c light sky blue", +"O c white", +"+ c navy", +"@ c green", +"# c dark slate grey", +"$ c tan", +"% c gray70", +"& c peachpuff4", +"* c #727277778585", +"= c black", +"- c red", +" ......... XXXXXXXXX ", +" .............XoooooooooX ", +" .................OOooooooX ", +" ..........+..........ooooooX ", +" ......+++++++++++......oooooX ", +" .....+++++++++++++++.....ooooX ", +" ....+++++++++++++++++++....oooX ", +" ....+++++++++++++++++++++....XXX ", +" ...++++++++++++++++++@@@@@@..#### ", +" ....+++++++++++++++++@@$$$$@@..%%# ", +" ...+@@@@+++@@@@@@@@+@@$$$$$$@..### ", +" ...@@$$$$@@@$$$$$$$@@@$$$$&$$@...*O# ", +" ...@$&&&$@$$$$$$$$$$$@$$$&&&$$@..O*O# ", +" ...@@$&&&$$$$$$$$$$=$$$$$&&$&$$@...### ", +" XXXXXXXXX ...@$&$&&$$$==$$$$===$$$$&&$$$$@... ", +" Xooo---oooX ...@$&&&&$$===$$$$$==$$$&&&&$$@@... ", +" XoOO---oooX ...@$&&&&$==$$$$$$$$=$$$&&&&&$@.... ", +" XoOoooooooX ...@$&$&&$$$$OO$$OO$$$$$&&&$$$@+... ", +" Xooo---oooX ========$$$$OOOOOOOO$$$$&&$$$====== ", +" Xoooo--oooX---....@@$$==$$O==OO==O$$$$@====@+.... ", +" Xoooo--oooX---....+@@@@==$O==OO==O$$$===@@+++....XXXXXXXXX ", +" XXXXX--XXXX ...======&&&&&----&&&&=$$$==@====.==oo---oooX ", +"######--##### ===@$$$==$$$$----$$$$$$===$@++...XoOO---oooX ", +"#%%%%%--%%%%# ==..@===$=$$$$$--$$$$$=$$$$$@@....XoOoooooooX ", +"#####----#### ===$$$$==============$$=====... Xooo---oooX ", +"O*O*O----*O*O# ==.@@@$$$$=##OO#OO#==$$$$$$@==.. Xoooo--oooX ", +"*O*O*O*O*O*O*O# = ...@@@@@$=#OO#OO#=$$$$$$@@... Xoooo--oooX ", +"############### ....++++@$=#####=@@@@@@@+.... XXXXX--XXXX ", +" ....++++@$=====@@++++++.... ######--##### ", +" .....++@@$$$$@@+++++.....---#%%%%%--%%%%# ", +" ......++@@@@@++++......----#####----#### ", +" ##..........+.......... #*O*O----*O*O# ", +" #%%%.................-- #*O*O*O*O*O*O*O# ", +" ######.............---- ################ ", +" #O*O*O*O*......... ", +" #*O*O*O*O*O*O*O# ", +" ################# ", +" "}; Index: external/mit/ctwm/dist/xpm/xgrab.xpm =================================================================== RCS file: external/mit/ctwm/dist/xpm/xgrab.xpm diff -N external/mit/ctwm/dist/xpm/xgrab.xpm --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/xpm/xgrab.xpm 3 Sep 2015 12:20:04 -0000 @@ -0,0 +1,50 @@ +/* XPM */ +static char * xgrab_xpm[] = { +"64 38 9 1", +" s None c None", +". c #727277778585", +"X c cadet blue", +"o c gray70", +"O c light yellow", +"+ c cyan", +"@ c gray85", +"# c white", +"$ c red", +" .................................. ", +" .XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX. ", +" oo.XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.oo ", +" oOo.XX++++++++++++++++++++++++++++XX.oOo ", +" ooOo.XX+@@@@@@@@@@@@@@@@@@@@@@@@@@+XX.oOoo ", +" oOOo.XX+@######@@@@@@@@@@@@@@@@@@@+XX.oOOo ", +" oOOoo.XX+@####@@@@@@@@@@@@@@@@@@@@@+XX.ooOOo ", +" oOOo .XX+@##@@@@@@@@@@@@@@@@@@@@@@@+XX. oOOo ", +" ooOOo .XX+@$$$$$$$@@@@@@@@@@@@@$@@@@+XX. oOOoo ", +" oOOOo .XX+@#$$$$$$$@@@@@@@@@@@$@@@@@+XX. oOOOo ", +" oOOo .XX+@#@$$$$$$$@@@@@@@@@$@@@@@@+XX. oOOo ", +" oOOOo .XX+@#@@$$$$$$$@@@@@@@$@@@@@@@+XX. oOOOo ", +" oOOOo .XX+@@@@@$$$$$$$@@@@@$@@@@@@@@+XX. oOOOo ", +" oOOOOooo.XX+@@@@@@$$$$$$$@@@$@@@@@@@@@+XX.oooOOOOo ", +" ooOOOoooO.XX+@@@@@@@$$$$$@@@$@@@@@@@@@@+XX.OoooOOOoo ", +" oOOOOoOOO.XX+@@@@@@@@$$$@@@$@@@@@@@@@@@+XX.OOOoOOOOo ", +" ooOOOOoOOo.XX+@@@@@@@@@$@@@$$$@@@@@@@@@@+XX.oOOoOOOOoo ", +" oOOOOOoOo .XX+@@@@@@@@$@@@$$$$$@@@@@@@@@+XX. oOoOOOOOo ", +" ooOOOOoOoo .XX+@@@@@@@$@@@$$$$$$$@@@@@@@@+XX. ooOoOOOOoo ", +" oOOOOOoOo .XX+@@@@@@$@@@@@$$$$$$$@@@@@@@+XX. oOoOOOOOo ", +" ooOOOOOoo .XX+@@@@@$@@@@@@@$$$$$$$@@@@@@+XX. ooOOOOOoo ", +" oOOOOOOoo .XX+@@@@$@@@@@@@@@$$$$$$$@@@@@+XX. ooOOOOOOo ", +" oOOOOOOoo .XX+@@@$@@@@@@@@@@@$$$$$$$@@@@+XX. ooOOOOOOo ", +" oOOOOOOo .XX+@@$@@@@@@@@@@@@@$$$$$$$@@@+XX. oOOOOOOo ", +" oOOOOOOo .XX+@@@@@@@@@@@@@@@@@@@@@@@@@@+XX. oOOOOOOo ", +" oOOOOOOo .XX+@@@@@@@@@@@@@@@@@@@@@@@@@@+XX. oOOOOOOo ", +" ooOOOOOOo .XX+@@@@@@@@@@@@@@@@@@@@@@@@@@+XX. oOOOOOOoo ", +" oOOOOOOOo .XX++++++++++++++++++++++++++++XX. oOOOOOOOo ", +" oOOOOOOOoo .XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX. ooOOOOOOOo ", +" oOOOOOOOOooo .XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX. oooOOOOOOOOo ", +" oOOOOOOOOOOOooo@XXXXXXXXXXXXXXXXXXXXXXXXXXooooooOOOOOOOOOOOo ", +" ooOOOOOOOOOOOOOOooooooXXXXXXXXXXXXXXXXooooooOOOOOOOOOOOOOOOOOo ", +" oOOOOOOOOOOOOOOOOOOOOooo..............oOOOOOOOOOOOOOOOOOOOOOOo ", +"oOOOOOOOOOOOOOOOOOOOOOOOoo ooOOOOOOOOOOOOOOOOOOOOOOo ", +"OOOOOOOOOOOOOOOOOoooooOOoo ooOOoooooOOOOOOOOOOOOOOOOo", +"OOOOOOOOOOOOOOOooo ooo ooo oooOOOOOOOOOOOOOOO", +"OOOOOOOOOOOOOOoo oooooOOOOOOOOOOO", +"OOOOOOOOOOOOOOo oOOOOOOOOOOO"}; Index: external/mit/ctwm/dist/xpm/xhpcalc.xpm =================================================================== RCS file: external/mit/ctwm/dist/xpm/xhpcalc.xpm diff -N external/mit/ctwm/dist/xpm/xhpcalc.xpm --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/xpm/xhpcalc.xpm 3 Sep 2015 12:20:04 -0000 @@ -0,0 +1,52 @@ +/* XPM */ +static char * xhpcalc_xpm[] = { +"64 38 11 1", +" s None c None", +". c #131392921313", +"X c dark olive green", +"o c #727277778585", +"O c gray85", +"+ c gray100", +"@ c black", +"# c gray70", +"$ c gray50", +"% c green", +"& c yellow", +" ", +" ", +" ", +" ", +" ", +" ", +" .................................................... ", +" ......................................................X ", +" .............................................ooooooo..XX ", +" ...OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.......o++X++o..XX ", +" ...OoooooooooooooooooooooooooooooooooO.......oXXXXXo..XX ", +" ...Oo++++++++++++++++++++++++++++++++O.......oX@@XXo..XX ", +" ...Oo+++@@@@+@@@@+@@++@@@@+@@++++++++O.......XX@X@@X..XX ", +" ...Oo+++@++@+++@@+@@++@++@+@@++++++++O.......oX@X@Xo..XX ", +" ...Oo+++@++@++@@@+@@++@@@@+@@++++++++O.......oX@X@Xo..XX ", +" ...Oo++++++@++@@@+@@++@@@@+@@@@@+++++O.......o++X++o..XX ", +" ...Oo+++++@@++++@+@@++@++@+@@++@+++++O.......o+++++o..XX ", +" ...Oo++++@@+++++@+@@++@++@+@@++@+++++O.......ooooooo..XX ", +" ...Oo+++@@@@+@@@@+@@++@@@@+@@@@@+@@++O................XX ", +" ...Oo++++++++++++++++++++++++++++++++O................XX ", +" ...OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO................XX ", +" ......................................................XX ", +" ...##$.##$.##$.##$.##$.##$.##$.####$.##$.##$.##$.##$..XX ", +" ...# $.# $.# $.# $.# $.# $.# $.####$.# $.# $.# $.# $..XX ", +" ...$$$.$$$.$$$.$$$.$$$.$$$.$$$.####$.$$$.$$$.$$$.$$$..XX ", +" ...............................####$..................XX ", +" ...##$.##$.##$.##$.##$.##$.##$.####$.##$.##$.##$.##$..XX ", +" ...# $.# $.# $.# $.# $.# $.# $.####$.# $.# $.# $.# $..XX ", +" ...$$$.$$$.$$$.$$$.$$$.$$$.$$$.####$.$$$.$$$.$$$.$$$..XX ", +" ...............................####$..................XX ", +" ...##$.##$.##$.##$.##$.##$.##$.####$.##$.##$.##$.##$..XX ", +" ...#%$.#&$.# $.# $.# $.# $.# $.####$.# $.# $.# $.# $..XX ", +" ...$$$.$$$.$$$.$$$.$$$.$$$.$$$.$$$$$.$$$.$$$.$$$.$$$..XX ", +" ......................................................XX ", +" ....................................................XXX ", +" XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ", +" XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ", +" "}; Index: external/mit/ctwm/dist/xpm/xirc.xpm =================================================================== RCS file: external/mit/ctwm/dist/xpm/xirc.xpm diff -N external/mit/ctwm/dist/xpm/xirc.xpm --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/xpm/xirc.xpm 3 Sep 2015 12:20:04 -0000 @@ -0,0 +1,47 @@ +/* XPM */ +static char * xirc_xpm[] = { +"64 38 6 1", +" s None c None", +". g gray80 c blue", +"X g gray20 c green", +"o g gray55 c deeppink", +"O c gray60", +"+ c black", +" ......... ", +" ............. ", +" ................. ", +" XXX.............XXXX ooooOo ", +" XXXXX............XXXXXXX ooooooOoo ", +" XXXXX............XXXXXXXX. ooooooOooo ", +" XXXXXXX...........XXXXXXXXXX oooooooOooo ", +" XXXXXXX.............XXXXXXXXXX oooooooOoooo ", +" XXXXX..........XX...XXXXXX....X oooooooOooooo ", +" ..XX...........XXXX.XXXXXXX...XX ooooooOoooooo ", +" .............XXXXXXXXXXXXX....X.X oooooOoooooooo ", +" ..............XXXXXXXXXXXXX....XXXX oooo oooooo ", +" ........XX....XXXXXXXXXXXXXXX..XXXX oooooo ", +" ..........X....XXXXXXXXXXXXXXXXX.XXX oooooo ", +" ..............XXX.XXXXXXXXXXXXX.XXXXX ooooo ", +" XXX...........XXX..XXXXXXXXXXX..XXXXX ooooo ", +" XXX...........XXX.XXXXXXX.XXXXXXXXXXX OOOooo ", +" .XXX..........XX..XXXXXXX.XXXXXXXX.XX oooooOoo ", +" .XX........XX.....XXXXXXX...XX.....XX oooooooOo ", +" ............XX.X.XXXXXXX....XX.....XX ooooooooO ", +" ............X...XXXXXXXXX..........XX ooooooooO ", +" ...............XXXXXXXXXXX.........XX ooooooooo ", +" ..............XXXXXXX.XXXX........XX ooooooo ", +" .............XXXXXXXX..XXXXX......XX ooooo ", +" ...........XXXXXXXXXX...XXXX....XX + ", +" .............XXXXXXXX....XX....XXX + ", +" ............XXXXXXX..X..X.....XX + ", +" ............XXXXX......X.....XX+ ++ ", +" ............XXX............XX + + ", +" ............XXXXX.........XX ++ ++ ", +" ..........XXXXXX.......XXX ++ ++ ", +" ........XXXXXX....XXXXX +++ ++ ", +" .........XXXX....XXXXX ++++ +++ ", +" .........X....XXXXX ++++++++ ", +" .......XXXXXXXX ", +" ....XXXXX ", +" ", +" "}; Index: external/mit/ctwm/dist/xpm/xmail.xpm =================================================================== RCS file: external/mit/ctwm/dist/xpm/xmail.xpm diff -N external/mit/ctwm/dist/xpm/xmail.xpm --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/xpm/xmail.xpm 3 Sep 2015 12:20:04 -0000 @@ -0,0 +1,52 @@ +/* XPM */ +static char * xnomail_xpm[] = { +"64 38 11 1", +" s None c None", +". c gray30", +"X c #727277778585", +"o c red", +"O c dark slate grey", +"+ c yellow", +"@ c gray70", +"# c gray25", +"$ c white", +"% c gray50", +"& c #808080808080", +" .......XXXXXXXXX.ooooooooooooXXXXX ", +" ..OOOOO..++++++++.oooooooooooo+++++XX ", +" ..OOOOOOO..+++++++.oooooooooooo++++++XX ", +" .OOOOOOOOOOO.++++++.oooooooooooo++++++++XX ", +" .XXXOOOOOOOOO.++@@@.oooooooooooo+++++++++X ", +" .XXXXXOOOOOOOOO++@@@.ooooooooooo.+++++++++XX ", +" .XXXXXXOOOOOOOO.++@@.ooooooooo..+++++++++++X ", +" .XXXXXXXOOOOOOOOO++@@.ooooooo..@@@++++++++++XX ", +" .XXXXXXXXOOOOOOOO.+@@.ooooo..@@@@@+++++++++++X ", +" .XXXXXXXXOOOOOOOO.+@@.ooo..@@@@++++++++++++++X ", +" .XXXXXXXXOOOOOOOO.++@.oo.@@@@++++++++++++++++X ", +" .XXXXXXXXXOOOOOOO.++@.oo@@@++++++++++++++++++X ", +" .XXXXXXXXXOOOOOO##.+@.oo@++++++++++++++++++++X ", +" .XXXXXXXXOOO####$$.+@.oo+++++++++++++++++++++X ", +" .XXXXXXX####$$$$$$.+@.oo+++++++++++++++++++++X ", +" .XXX####$$$$$$$$$$.+@.oo+++++++++++++++++++++X ", +" ####$$$$$$$$$$$$$$.+@.oo+++++++++++++++++++++X ", +" ####$$$$$$$$$$$$$$$$$$.+@.oo+++++++++++++++++++++X ", +" ##$$$$$$$$$$$$$$$$$$$$$$.+@.oo+++++++++++++++++++++X ", +" #####$$$$$$$$$$$$$$$$$$.+@.oo+++++++++++++++++++++X ", +" #$$$#######$$$$$$$$$$$.+@.oo+++++++++++++++++++++X ", +" #$$$$$$$$$#######$$$$.@..ooo++++++++++++++++++++X ", +" ##$$$$$$$$$$$$$$####.@.ooooo+++++++++++++++++++X ", +" #$$$$$$$$$$$$$$$$$.+.ooooo+++++++++++++++++X%X ", +" .#$$$$$$$$$$$$$$$$.+.ooooo+++++++++++++++%%% ", +" .O#$$$$$$$$$$$$$$$.+..oooo+++++++++++++XX ", +" ...O#$$$$$$$$$$$$$$.++..oo+++++++++++XXX ", +" .++...#$$$$$$$$$$$$$.+++++++++++++++XXX ", +" ..++++++#$$$$$$$$$$$$.++++++++++++XXX ", +" ..++++++++#$$$$$$$$$$$.+++++++++XXX ", +" .+++++++++++##$$$$$$$$$.++++++XXX.X ", +"...+++++++++++++#$$$$$$$#.+++XXX....X ", +".++++++++++++++++#$$$$##X.XXXX......X ", +"++++++++++++++++++#$##+++.XOO.......X ", +"+++++++++++++++++++#++++..OOO....&&&X ", +"++++++++++++++++++++++...OOOO.&&&&&&X ", +"+++++++++++++++++++++.. OOOOO&&&&&&&X ", +"++++++++++++++++++++.. OOOOO&&&&&&&X "}; Index: external/mit/ctwm/dist/xpm/xman.xpm =================================================================== RCS file: external/mit/ctwm/dist/xpm/xman.xpm diff -N external/mit/ctwm/dist/xpm/xman.xpm --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/xpm/xman.xpm 3 Sep 2015 12:20:04 -0000 @@ -0,0 +1,55 @@ +/* XPM */ +/*****************************************************************************/ +/** This pixmap is kindly offered by Ion Cionca - 1992 - **/ +/** Swiss Federal Institute of Technology **/ +/** Central Computing Service **/ +/*****************************************************************************/ +static char * image_name [] = { +"64 38 8 1", +/**/ +" s None c None", +". c black", +"X c green", +"o c lightyellow", +"O c gray70", +"+ c tan", +"@ c red", +"# c maroon", +" ........ ", +" ..XXXXXXXX. .. ", +" .XXXXXXXXXXX. ...o. ", +" ..XXXXXXXXXXXX.......ooo.. ", +" .. ......XXXXX....XXXXX.ooooooooo. ", +" .. ....ooo.XXXXX.oooo.XXXXX.oooooOOoo. ", +" .o.. ..oooooo.XXXXX.oooo.XXXXX.OOOOOOooo. ", +" ...oo......ooooooo.XXXXX.oOOo.XXXXX.Oooooooooo. ", +" ...ooooooooooooooo.XXXXX.oooo.XXXXX.ooooooOOoo.. ", +" .+.ooooooooooOOOoo........ooo.XXXXX.ooOOOOOoooo. ", +" ......oooooooOOOooooooooooo..o.XXXXX.oOOooooooooo.. ", +" ..+.+.oOOOOOOOoooooOOooooooo..XXXXX.oOooooooOOoooo. ", +"..+..+.oooooooooOOOoooooooooo.XXXXX.ooooOOOOOOoooooo. ", +"...+.+..ooooooOOOooooOOOOOooo.XXXX.oooOOOoooooooooooo. ", +"@.+..++.oooOOOOoooooOOoooooo.XXXX.ooOOoooooooooooooooo.. ", +"@.+..++.ooooooooooOOoooooooo.XXX.ooOOooooooooooooooooooo.. ", +" @.++.++.ooooooOOOOoooooooo.XXXX..ooooOOOOoooooooooOooooo.. ", +" @..+.+...oooOOoooooOoooooo.XXXX..oooOooooooooOOOOOOooooo. ", +" @@.+.+.+..ooooooOOOoooOOoo.XXXX...oOOooooOOOOoooooooooo.. ", +" @.++.+.+..oooOOOoooOOoooo.XXXX.o.ooooOOOoooooooooooo..+.... ", +" @@.+.+..+..ooooooOOoooooo.XXXX.o.ooooOooooooooooooo..+++... ", +" @.+.++..+..oooOOooooOOoo......oo.ooOOooooooooooo...+++.. ", +" @+.+.++..+..oooooooOOooooooooooo.ooOooooo.......++++..+...@@ ", +" @@.+.+++.++..ooooOOoooooooo.oooo..ooooo...+++++++...+++++.@@ ", +" @@.+.++..++..oooOooooooo..X..ooo.oooo..++++++....+++++.@@@ ", +" @.+..++.+++.oooooooooo.XXXXX.oo..oo..+.......++++...@@@ ", +" @@.+..++.+++.ooooo....XXXXXXX.oo.o...............@@@@ ", +" @.++.+++.++.oo...+++.XXXXXXX.........@@@@@@@@@@@ ", +" @@.++.++.++.o..++++++.XXXXXX........@@ ", +" @.++..++.+...++......XXXXX.######..@ ", +" @@@++.+++.+.+...++..@..X..@####...@ ", +" @.++.+++...+....@@@ . @@.....@@ ", +" @@.+.....+...+@@@ @@@@@@ ", +" @@.++....+@@@@ ", +" @@....+@@@ ", +" @@+@@@@ ", +" @@@ ", +" "}; Index: external/mit/ctwm/dist/xpm/xmosaic.xpm =================================================================== RCS file: external/mit/ctwm/dist/xpm/xmosaic.xpm diff -N external/mit/ctwm/dist/xpm/xmosaic.xpm --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/xpm/xmosaic.xpm 3 Sep 2015 12:20:04 -0000 @@ -0,0 +1,56 @@ +/* XPM */ +static char * xmosaic_xpm[] = { +"48 48 5 1", +" s None c None", +". c deeppink", +"X c cadetblue", +"o c yellow", +"O c black", +" .. ", +" ......................... ", +" ............................... ", +" ............................... ", +" ...... . ", +" ... XX ", +" ... XXXXXXXXXXXXXXXXXXXXXXXXX ", +" .. XXXXXXXXXXXXXXXXXXXXXXXXXXX ", +" .. XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ", +" . XXXX XX ", +" . XXX ", +" X ooooooooooooooooooooo ", +" . X oooooooooooooooooooooooo ", +" . X oooooooooooooooooooooooooo ", +" . X ooooo o ", +" . X ooo ", +" X ooo ", +" oo OOOOO ", +" o OOOOOOOOO ", +" o OOOOOOOOOOO ", +" o OOOOOOOOOOOOO ", +" o OOOOOOOOOOOOO ", +" o OOOOOOOOOOOOOOO ", +" o OOOOOOOOOOOOOOO ", +" OOOOOOOOOOOOOOO ", +" OOOOOOOOOOOOOOO o ", +" OOOOOOOOOOOOOOO o ", +" OOOOOOOOOOOOO o ", +" OOOOOOOOOOOOO oo ", +" OOOOOOOOOOO oo X ", +" OOOOOOOOO ooo X ", +" OOOOO oo X ", +" oooo X O ", +" o oooo XX ", +" oooo ooooooooo X . ", +" ooooooooooooooooooooooooo X . ", +" ooooooooooooooooooooooo XX . ", +" oo XXX . ", +" XXX XXX .. ", +" XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX .. ", +" XXXXXXXXXXXXXXXXXXXXXXXXXXXXX .. ", +" XXXXXXXXXXXXXXXXXXXXXXXXXX .. ", +" XX ... ", +" . .... ", +" ................................. ", +" ................................ ", +" .............................. ", +" .. "}; Index: external/mit/ctwm/dist/xpm/xnomail.xpm =================================================================== RCS file: external/mit/ctwm/dist/xpm/xnomail.xpm diff -N external/mit/ctwm/dist/xpm/xnomail.xpm --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/xpm/xnomail.xpm 3 Sep 2015 12:20:04 -0000 @@ -0,0 +1,49 @@ +/* XPM */ +static char * xmail_xpm[] = { +"64 38 8 1", +" s None c None", +". c #727277778585", +"X c light yellow", +"o c black", +"O c red", +"+ c gray30", +"@ c dark slate grey", +"# c #808080808080", +" ................................. ", +" ..XXXXX.XXXXXXXXXXXXXXXXXXXXXXXXXXX.. ", +" .XXXXXXXXX.XXXXXXXXXXXXXXXXXXXXXXXXXX.. ", +" ..XXXXXXXXXX.XXXXXXXXXXXXXXXXXXXXXXXXXXX.. ", +" .XXXXXXXXXXXX.XXXXXXXXXXXXXXXXXXXXXXXXXXX. ", +" ..XXXXXXXXXXXX.XXXXXXXXXXXXXXXXXXXXXXXXXXX.. ", +" .XXXXXXXXXXXXXX.XXXXXXXXXXXXXXXXXXXXXXXXXXX. ", +" ..XXXXXXXXXXXXXX.XXXXXXXXXXXXXXXXXXXXXXXXXXX.. ", +" .XXXXXXXXXXXXXXXX.XXXXXXXXXXXXXXXXXXXXXXXXXXX. ", +" .XXXXXXXXXXXXXXXX.XXXXXXXXXXXXXXXXXXXXXXXXXXX. ", +" .XXXXXXXXXXXXXXXX.XXXXXXXXXXXXXXXXXXXXXXXXXXX. ", +" .XXXXXXXXXXXXXXXX.XXXXXXXXXXXXXXXXXXXXXXXXXXX. ", +" .XXXXXXXXXXXXXXXXX.XXXXXXXXXXXXXXXXXXXXXXXXXX. ", +" .XXXXXXXXXXXXXXXXX.XXXXXXXXXXXXXXXXXXXXXXXXXX. ", +" .XXXXXXXXXXXXXXXXX.XXXXXXXXXXXXXXXXXXXXXoooooo ", +" .XXXXXXXXXXXXXXXXX.XXXXXXXXXXXXXXXooooooooooOo ", +" .XXXXXXXXXXXXXXXXX.XXXXXXXXooooooooooooooOOOOo ", +" .XXXXXXXXXXXXXXXXX.XXXoooooooooooooooXXoOOOOOo ", +" .XXXXXXXXXXXXXXXXX.XXoooooooooooo......oOOOOOo ", +" .XXXXXXXXXXXXXXXXX.XXoooooooo..........oOOOOOo ", +" .XXXXXXXXXXXXXXXXX.XXXoooX.......XXXX..oOOOOOo ", +" .XXXXXXXXXXXXXXXXX.XXXXX....XXXXXXXXX..oOOOOOo ", +" .XXXXXXXXXXXXXXXXX.XXXXXXXXXXXXXXXXXX..oOOOOOo ", +" .XXXXXXXXXXXXXXXXX.XXXXXXXXXXXXXXXXXX..oOOOOOo ", +" .XXXXXXXXXXXXXXXXX.XXXXXXXXXXXXXXXXXX..oOOOOOo ", +" .XXXXXXXXXXXXXXXXX.XXXXXXXXXXXXXXXXXX..oOOOOOo ", +" ..XXXXXXXXXXXXXXXX.XXXXXXXXXXXXXXXXXX..oOOOOOo ", +" ...XXXXXXXXXXXXX.XXXXXXXXXXXXXXX... oOOOOOo ", +" ...XXXXXXXXXX.XXXXXXXXXXX.... oOOOoo ", +" ..XXXXXXXX.XXXXXXXX... oOOo ", +" ...XXXXX.XXXXX...++. ooo ", +" ...XX.X....+++++. o ", +" ...@+++++++++. ", +" .@@@@+++++++. ", +" @@@@@++++###. ", +" @@@@@+######. ", +" @@@@@#######. ", +" @@@@@#######. "}; Index: external/mit/ctwm/dist/xpm/xrn-compose.xpm =================================================================== RCS file: external/mit/ctwm/dist/xpm/xrn-compose.xpm diff -N external/mit/ctwm/dist/xpm/xrn-compose.xpm --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/xpm/xrn-compose.xpm 3 Sep 2015 12:20:04 -0000 @@ -0,0 +1,59 @@ +/* XPM */ +static char * xrn-compose_xpm[] = { +"64 48 8 1", +" s None c None", +". c blue", +"X c green", +"o c black", +"O c gray85", +"+ c red", +"@ c yellow", +"# c white", +" ", +" ", +" ", +" ", +" ....... ", +" ............. ", +" ................. ", +" XXX.............XXXX ", +" XXXXX............XXXXXXX ", +" oooooooo XXXXX............XXXXXXXX. ", +" ooooooooooooooooooo XXXXXXX...........XXXXXXXXXX ", +" oooooooooooooooooooooXXXXXX.............XXXXXXXXXX ", +" oOOOOOOOOOOOOOOOOOOOoXXXX..........XX...XXXXXX....X ", +" oOoOOoOoooOoOOoOoooOoXX...........XXXX.XXXXXXX...XX ", +" oOooOoOoOOOoOOoOoOOOo...........XXXXXXXXXXXXX....X.X ", +" oOooooOooOOoOooOoooOo...........XXXXXXXXXXXXX.+++XXXX ", +" oOoOooOoOOOoOooOOOoOo.....XX....XXXXXXXXXXXXX++++XXXX ", +" oOoOOoOoooOooooOoooOo......X....@XXXXXXXXXXXX++XX.XXX ", +" oOOOOOOOOOOOOOOOOOOOo.........@@@X.XXXXXXXXX++XX.XXXXX ", +" oOOoooooooooooooooOOo.......@@@@@X..XXXXXXXX++X..++++X ", +" oOOOOOOOOOOOOOOOOOOOo....@@@@@@@@X.XXXXXXX.X++++++++++ ", +" oOoOoooOoOOoOooOoooOo...@@@@@@@@@..XXXXXXX.XX+++++X.++ ", +" oOOoooOooOOoooOooOoOo@@@@@@@@@@@@..XXXXXXX+..XX.....++ ", +" oOoOoOooOOOOOoOOooO@@@@@@@@@@@@@@.XXXXXXX+++.XX.....++ ", +" oOooOoOOoOOooOOoo@@@@@@@@@@@@@@@@XXXXXXXXX+++X..++.++X ", +" oOOoOooOoOOooooo@@@@@@@@@@@@@@@@@XXXXXXXXXX+++..++++XX ", +" oOOoOOoooOOooOOooooOo....@@@@@@@@XXXXXX.XXXX+++.....XX ", +" oOoooOOoOOOOOoOoooOOo...@@@@@@@@@XXXX++..XXXX+++....XX ", +" oOooOooOoOOoooOooOoOo..@@@@@.@@@@X++X+++..++++++...XX ", +" oOOOOOOOOOOOOOOOOOOOo.@@@@@..@@@@++XXX+++.++++++..XXX ", +" oOOOOOOOOOOOOOOOOOOO@@@@@@....@@@+XX+XX+++++......XX ", +" oOooOOoOOooooooOoOo@@@@@@@....@@@+++++..++++......XX ", +" oOoooOOoOOOOoOOooO@@@@@@@......@@.+++...++++.....XX ", +" oOOooOooooOoOoOo@@@@@@@@@+..+++@@.++XX++.++.....XX ", +" oOoOooOooOoOooo@@@@@@@@@.++..+++@XX+++++......XXX ", +" oOOooOoOOooOo@@@@@@@@@@@.........XXX++.....XXXXX ", +" oOoOoOOooo@o@@@@@@@@@@@# .........XXX.....XXXXX ", +" oOOOOOOOO@@@@@@@@@@@@@@ .............XXXXX ", +" oOOOOOOOOOOOOOOOOO@@@@ .......XXXXXXXX ", +" oooooooooooooooooo@@@@ ....XXXXX ", +" @@@ ", +" @@@ ", +" @@@ ", +" @@ ", +" @@ ", +" @ ", +" @ ", +" "}; Index: external/mit/ctwm/dist/xpm/xrn.goodnews.xpm =================================================================== RCS file: external/mit/ctwm/dist/xpm/xrn.goodnews.xpm diff -N external/mit/ctwm/dist/xpm/xrn.goodnews.xpm --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/xpm/xrn.goodnews.xpm 3 Sep 2015 12:20:04 -0000 @@ -0,0 +1,56 @@ +/* XPM */ +static char * xrnnr_xpm[] = { +/*blue*/ +"64 38 14 1", +" s None c None", +". c red", +"X c blue", +"o c yellow", +"O c green", +"+ c orange red", +"@ c light sky blue", +"# c cyan", +"$ c violet", +"% c gray", +"& c #727277778585", +"* c gray70", +"= c gray85", +"- c navy", +".. ... .. XXXXX .....", +" ..... .oo... .o.. XXXXXXXXXXXXX ........ooo. ", +" .oooo... .ooooo...oooXXXXXXXXXXXXXXXXX.....oooooooooo. ", +" .oooooo... .ooooooooooXXXXXXXXXXXXXXXXXXXooooooooooooo. ", +" .oooooooo.... .ooooooooXXXXXXXXXXXXXXXXXXXXXXXoooooooooo. ", +" .oooooooooooo..oooooooXOOXXXXOOXXXXXXXXXXXXX++Xooooooo.. ", +" .oooooooooooooooooooXOOOXXXXOOOXXXXXXXXXXXX+++Xooooo. ", +" .ooooooooooooooooooXOOOXXXXOOOXXXXXXXXXXX++++Xoooo. ", +" .ooooooooooooooooXOOOOXXXOOOOXXXXXXXXXXX+++++Xoo. ", +" .oooooooooooooooXOOOOOOXXOOOXXXXXXXXXXXX++++++X. ", +" .ooooooooooooooXOOOOOOOXOOXXXXXXOXXX+++++++++X ", +" .ooooooooooooXOOOOOOOOXXXXXXXXXOOOX++++++++++X ", +" .ooooooooooooXOOOOOOOXXXXXXXXXXOOO@@@++++++++X ", +" .oooooooooooXOOOOOOXXXXXXXXXXOOO@@@@++O####OX. ", +" .ooooooooooXOOOOOOXXXXXXXXXXOOO@@@@OO#####OX .. ", +" .oooooooooXOOOXOOOXXXXXXXXXXOO@@@@@OO#####XXXoo. ", +" .ooooooooXOXXXOOXXXXXXXXXXXXO@X$$@OO###OOOOXooo.. ", +" .oooo%%%%%XXXXXXXXXXXXXXOXXXXOXX$$OOO###OOOOXooooo.. ", +" %%%.oooo%&&&&&XXXXXXXXXXXXXXOOXXXXXX$$$OOO#OOOOOXooooooo. ", +" &&&%ooo%&&ooooXOXXXXXXXXXXXXXOOOXXXX$$$OOOOOOOOOXoooooo. ", +" &%oo&%%o%&ooooooXXXXXXXXXXXXXXOOXX+$$$$$OOOOXXXOXooooo.. ", +" &%oo&&&%&&ooooooXOXXXXXXXXXXXOOOX++$$$ooOOOXXXXXXoooo. ", +" &&ooooo&&&oooooooXOOXXXXXXXXXXXXX++++ooooOOOOOXXXXooo. ", +" &%oooooooooooooooXOOXXXXXXXXXXXXX+++++o++OOOOOOXXXo.. ", +" &%ooooooooooooooooXOOOXXXXXXXXXXX++++++++XXXXOOOX . ", +" .&&%%%%%%%&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& ", +" .oo&&&&&&&&****************************************&& ", +" .ooooooo&&**===========-----==========---==-=-=-=-&&& ", +" .ooooooo&****------------------------------=-=----&&&& ", +".ooo....&**============================-*=-=-=-***&&&&&. ", +".... &***----------------------------**=-=-=-**&&&&&oo. ", +" &**==-=========================-**=-=-=-**&&&&&---. ", +" &&***----------------------------**=-=-=-**&&&&----oo. ", +" &******************************************&&&&----oooo. ", +" &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&---ooooooo. ", +" &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&----.....ooo. ", +" &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&--- ..... ", +" ------------------------------------------- "}; Index: external/mit/ctwm/dist/xpm/xrn.nonews.xpm =================================================================== RCS file: external/mit/ctwm/dist/xpm/xrn.nonews.xpm diff -N external/mit/ctwm/dist/xpm/xrn.nonews.xpm --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/xpm/xrn.nonews.xpm 3 Sep 2015 12:20:04 -0000 @@ -0,0 +1,55 @@ +/* XPM */ +static char * xrn_xpm[] = { +/*blue*/ +"64 38 13 1", +" s None c None", +". c blue", +"X c green", +"o c orange red", +"O c light sky blue", +"+ c cyan", +"@ c violet", +"# c gray", +"$ c #727277778585", +"% c yellow", +"& c gray70", +"* c gray85", +"= c navy", +" ..... ", +" ............. ", +" ................. ", +" ................... ", +" ....................... ", +" .XX....XX.............oo. ", +" .XXX....XXX............ooo. ", +" .XXX....XXX...........oooo. ", +" .XXXX...XXXX...........ooooo. ", +" .XXXXXX..XXX............oooooo. ", +" .XXXXXXX.XX......X...ooooooooo. ", +" .XXXXXXXX.........XXX.oooooooooo. ", +" .XXXXXXX..........XXXOOOoooooooo. ", +" .XXXXXX..........XXXOOOOooX++++X. ", +" .XXXXXX..........XXXOOOOXX+++++X. ", +" .XXX.XXX..........XXOOOOOXX+++++... ", +" .X...XX............XO.@@OXX+++XXXX. ", +" #####..............X....X..@@XXX+++XXXX. ", +" ### #$$$$$..............XX......@@@XXX+XXXXX. ", +" $$$# #$$ .X.............XXX....@@@XXXXXXXXX. ", +" $# $## #$ ..............XX..o@@@@@XXXX...X. ", +" $# $$$#$$ .X...........XXX.oo@@@%%XXX...... ", +" $$ $$$ .XX.............oooo%%%%XXXXX.... ", +" $# .XX.............ooooo%ooXXXXXX... ", +" $# .XXX...........oooooooo....XXX. ", +" $$#######$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ", +" $$$$$$$$&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&$$ ", +" $$&&***********=====**********===**=*=*=*=$$$ ", +" $&&&&==============================*=*====$$$$ ", +" $&&****************************=&*=*=*=&&&$$$$$ ", +" $&&&============================&&*=*=*=&&$$$$$ ", +" $&&**=*************************=&&*=*=*=&&$$$$$=== ", +" $$&&&============================&&*=*=*=&&$$$$==== ", +" $&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&$$$$==== ", +" $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$=== ", +" $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$==== ", +" $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$=== ", +" =========================================== "}; Index: external/mit/ctwm/dist/xpm/xrn.xpm =================================================================== RCS file: external/mit/ctwm/dist/xpm/xrn.xpm diff -N external/mit/ctwm/dist/xpm/xrn.xpm --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/xpm/xrn.xpm 3 Sep 2015 12:20:04 -0000 @@ -0,0 +1,57 @@ +/* XPM */ +/*****************************************************************************/ +/** This pixmap is kindly offered by Ion Cionca - 1992 - **/ +/** Swiss Federal Institute of Technology **/ +/** Central Computing Service **/ +/*****************************************************************************/ +static char * image_name [] = { +/**/ +"64 38 9 1", +/**/ +" s None c None", +". c blue", +"X c green", +"o c red", +"O c black", +"+ c cyan", +"@ c grey20", +"# c gray85", +"$ c white", +" ................. ", +" XXX.............XXXX ", +" XXXXX............XXXXXXX ", +" XXXXX............XXXXXXXX. ", +" XXXXXXX...........XXXXXXXXXX ", +" XXXXXXX.............XXXXXXXXXX ", +" XXXXX..........XX...XXXXXX....X ", +" ..XX...........XXXX.XXXXXXX...XX ", +" .............XXXXXXXXXXXXX....X.X ", +" .............XXXXXXXXXXXXX.oooXXXX ", +" .......XX....XXXXXXXXXXXXXooooXXXX ", +" .........X....XXXXXXXXXXXXXooXX.XXX ", +" OOOOOOOOOOO.............XXX.XXXXXXXXXooXX.XXXXX ", +" O+++++++++++XX...........XXX..XXXXXXXXooX..ooooX ", +" O+++++++++++XX...........XXX.XXXXXXX.Xoooooooooo ", +" O++@@@@@@@@@XXX..........XX..XXXXXXX.XXoooooX.oo ", +" O+@#########XX........XX.....XXXXXXXo..XX.....oo ", +" O+@#$$$$$$$#...........XX.X.XXXXXXXooo.XX.....oo ", +" O+@#$$$$$###...........X...XXXXXXXXXoooX..oo.ooX ", +" O+@#$$$#####..............XXXXXXXXXXXooo..ooooXX ", +" O+@#$$######..............XXXXXXX.XXXXooo.....XX ", +" O+@#$$#######............XXXXXXoo..XXXXooo....XX ", +" O+@#$########...........XXXXooXooo..oooooo...XX ", +" O+@#$#########............oooXXXooo.oooooo..XXX ", +" O+@#$#########..oo....oo..ooXXoXXooooo......XX ", +" O+@############.oooo...o...ooooo..oooo......XX ", +" O+@#############.oooooooo...ooo...oooo.....XX ", +" O+@#############..oooooooo..ooXXoo.oo.....XX ", +" O++@@@@@@@@@@@@@@..oo..ooooXXooooo......XXX ", +" O++++++++++++++++++.oo...ooXXXoo.....XXXXX ", +" OOOOOOOOOOOOOOOOOOO........XXX.....XXXXX ", +" OOOOOOOOOOOOOOOOOOOOOO.............XXXXX ", +" O+++++++++++++++++++++++.......XXXXXXXX ", +" O+++++++++++++++OOOOOO++O ....XXXXX ", +" O+++++++++++++++OOOOOO++O ", +" O+++++++++++++++++++++++O ", +" OOOOOOOOOOOOOOOOOOOOOOOOO ", +" "}; Index: external/mit/ctwm/dist/xpm/xterm.xpm =================================================================== RCS file: external/mit/ctwm/dist/xpm/xterm.xpm diff -N external/mit/ctwm/dist/xpm/xterm.xpm --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ external/mit/ctwm/dist/xpm/xterm.xpm 3 Sep 2015 12:20:04 -0000 @@ -0,0 +1,56 @@ +/* XPM */ +/*****************************************************************************/ +/** This pixmap is kindly offered by Ion Cionca - 1992 - **/ +/** Swiss Federal Institute of Technology **/ +/** Central Computing Service **/ +/*****************************************************************************/ +static char * image_name [] = { +/**/ +"64 38 8 1", +/**/ +" s mask c none", +". c gray70", +"X c gray85", +"o c gray50", +"O c red", +"+ c darkolivegreen", +"@ c white", +"# c black", +" ", +" ", +" ........................... ", +" .XXXXXXXXXXXXXXXXXXXXXXXXXXX. ", +" .XXXXXXXXXXXXXXXXXXXXXXXXXXXXXoo ", +" OOOOOOOOOO .XXOOO++++++++++++++++++++XXXXoo ", +" OOOOOOOOOO .XOOO++++++++++++++++++++++XXXooo ", +" OOOOOOOOOO .OOO+@@+@++@+@@@@++@+++++++XXXooo ", +" OOOOOOOOOO OOO++++++++++++++++++++++++XXXoooo ", +" OOOOOOOOOO OOOX++@@@@+@@+@@@+++++++++++XXXoooo ", +" OOOOOOOOOO OOOXX++++++++++++++++++++++++XXXooooo ", +" OOOOOOOOOO OOO.XX++@@@@@@@@@@+@@@@@++++++XXXooooo ", +" OOOOOOOOOO OOO .XX++++++++++++++++++++++++XXXooooo ", +" OOOOOOOOO OOO .XX++@@@+@@@@+@@++@@@++++++XXXooooo ", +" OOOOOOO OOO .XX++++++++++++++++++++++++XXXooooo ", +" OOOOO OOOO .XX++@+++++++++++++++++++++XXXooooo ", +" OOO OOOOOO .XX++++++++++++++++++++++++XXXooooo ", +" OOO OOOOOOOO .XX++@@@@+@+@@@+@++++++++++XXXooooo ", +" OOO OOOOOOOOOO.XX++++++++++++++++++++++++XXXooooo ", +" OOO OOOOOOOOOOXX++@+@@@@++++++++++++++++XXXooooo ", +" OOO OOOOOOOOOOXX++++++++++++++++++++++XXXXoooo ", +" OOO OOOOOOOOOOXXXXXXXXXXXXXXXXXXXXXXXXXXXooo ", +" OOO OOOOOOOOOOXXXXXXXXXXXXXXXXXXXXXXXXXooo ", +" OOO OOOOOOOOOOoooooooooooooooooooooooo...oo ", +" OOO OOOOOOOOOO.........................ooo ", +" OOO OOOOOOOOOOooooooooooooooooooooooooooo ", +" OOO OOOOOOOOOOXXXXXXXXXXXXXXXXXXXXXXoooo.. .. ", +" OOO oXXXXXXXXXXXXXXXXXX#######XXoooo . .", +" oooooooooooooooooooooooooooXXXooo . ", +" oXXXXXXXXXXXXXXXXXXXXXXXXXXooooo . ", +" oXXXXXXXXXXXXXXXXXXXXXXXXXXoo oooooo ", +" oXX@@@@@@@@@@@@@@@@@@@XXXXXoo ooooo...o ", +" oXXXXXXXXXXXXXXXXXXXXXXXXXXoo ooXXXoo..o ", +" oXX@@@@@@@@@@@@@@@@@@@@XXXXoo oXXXXX..o ", +" oXXXXXXXXXXXXXXXXXXXXXXXXXXoo o.....oo ", +" oooooooooooooooooooooooooooo ooooooo ", +" ", +" "};