ftp://ftp.smr.ru/pub/0/FreeBSD/releases/distfiles/xscreensaver-3.16.tar.gz
authorZygo Blaxell <zblaxell@hungrycats.org>
Mon, 2 Mar 2009 05:42:36 +0000 (00:42 -0500)
committerZygo Blaxell <zblaxell@hungrycats.org>
Mon, 2 Mar 2009 05:42:36 +0000 (00:42 -0500)
-rw-r--r-- 1 zblaxell zblaxell 1135909 Jun 20  1999 xscreensaver-3.16.tar.gz
a527b196243af5b99d0e0c26e2be40bdfa87f610  xscreensaver-3.16.tar.gz

665 files changed:
INSTALL [new file with mode: 0644]
Makefile.in [new file with mode: 0644]
README [new file with mode: 0644]
README.VMS [new file with mode: 0644]
README.debugging [new file with mode: 0644]
config.guess [new file with mode: 0755]
config.h-vms [new file with mode: 0644]
config.h.in [new file with mode: 0644]
config.sub [new file with mode: 0755]
configure [new file with mode: 0755]
configure.in [new file with mode: 0644]
driver/.gdbinit [new file with mode: 0644]
driver/Makefile.in [new file with mode: 0644]
driver/README [new file with mode: 0644]
driver/XScreenSaver.ad.in [new file with mode: 0644]
driver/XScreenSaver_ad.h [new file with mode: 0644]
driver/compile_axp.com [new file with mode: 0644]
driver/compile_decc.com [new file with mode: 0644]
driver/demo.c [new file with mode: 0644]
driver/dialogs-Gtk.c [new file with mode: 0644]
driver/dialogs-Xaw.c [new file with mode: 0644]
driver/dialogs-Xm.c [new file with mode: 0644]
driver/link_axp.com [new file with mode: 0644]
driver/link_decc.com [new file with mode: 0644]
driver/lock.c [new file with mode: 0644]
driver/passwd-kerberos.c [new file with mode: 0644]
driver/passwd-pam.c [new file with mode: 0644]
driver/passwd-pwent.c [new file with mode: 0644]
driver/passwd.c [new file with mode: 0644]
driver/prefs.c [new file with mode: 0644]
driver/prefs.h [new file with mode: 0644]
driver/remote.c [new file with mode: 0644]
driver/remote.h [new file with mode: 0644]
driver/setuid.c [new file with mode: 0644]
driver/splash.c [new file with mode: 0644]
driver/stderr.c [new file with mode: 0644]
driver/subprocs.c [new file with mode: 0644]
driver/test-apm.c [new file with mode: 0644]
driver/test-grab.c [new file with mode: 0644]
driver/test-passwd.c [new file with mode: 0644]
driver/test-uid.c [new file with mode: 0644]
driver/test-xdpms.c [new file with mode: 0644]
driver/timers.c [new file with mode: 0644]
driver/vms-getpwnam.c [new file with mode: 0644]
driver/vms-hpwd.c [new file with mode: 0644]
driver/vms-pwd.h [new file with mode: 0644]
driver/vms-validate.c [new file with mode: 0644]
driver/vms_axp.opt [new file with mode: 0644]
driver/vms_axp_12.opt [new file with mode: 0644]
driver/vms_decc.opt [new file with mode: 0644]
driver/vms_decc_12.opt [new file with mode: 0644]
driver/windows.c [new file with mode: 0644]
driver/xscreensaver-command.c [new file with mode: 0644]
driver/xscreensaver-command.man [new file with mode: 0644]
driver/xscreensaver-demo.man [new file with mode: 0644]
driver/xscreensaver.c [new file with mode: 0644]
driver/xscreensaver.h [new file with mode: 0644]
driver/xscreensaver.man [new file with mode: 0644]
driver/xscreensaver.pam [new file with mode: 0644]
driver/xset.c [new file with mode: 0644]
hacks/.gdbinit [new file with mode: 0644]
hacks/Makefile.in [new file with mode: 0644]
hacks/README [new file with mode: 0644]
hacks/ant.c [new file with mode: 0644]
hacks/attraction.c [new file with mode: 0644]
hacks/attraction.man [new file with mode: 0644]
hacks/automata.h [new file with mode: 0644]
hacks/blitspin.c [new file with mode: 0644]
hacks/blitspin.man [new file with mode: 0644]
hacks/bouboule.c [new file with mode: 0644]
hacks/bouboule.man [new file with mode: 0644]
hacks/braid.c [new file with mode: 0644]
hacks/braid.man [new file with mode: 0644]
hacks/bsod.c [new file with mode: 0644]
hacks/bsod.man [new file with mode: 0644]
hacks/bubbles-default.c [new file with mode: 0644]
hacks/bubbles.c [new file with mode: 0644]
hacks/bubbles.h [new file with mode: 0644]
hacks/bubbles.man [new file with mode: 0644]
hacks/compass.c [new file with mode: 0644]
hacks/compile_axp.com [new file with mode: 0644]
hacks/compile_decc.com [new file with mode: 0644]
hacks/coral.c [new file with mode: 0644]
hacks/critical.c [new file with mode: 0644]
hacks/critical.man [new file with mode: 0644]
hacks/crystal.c [new file with mode: 0644]
hacks/cynosure.c [new file with mode: 0644]
hacks/decayscreen.c [new file with mode: 0644]
hacks/decayscreen.man [new file with mode: 0644]
hacks/deco.c [new file with mode: 0644]
hacks/deco.man [new file with mode: 0644]
hacks/deluxe.c [new file with mode: 0644]
hacks/demon.c [new file with mode: 0644]
hacks/discrete.c [new file with mode: 0644]
hacks/distort.c [new file with mode: 0644]
hacks/drift.c [new file with mode: 0644]
hacks/drift.man [new file with mode: 0644]
hacks/epicycle.c [new file with mode: 0644]
hacks/epicycle.man [new file with mode: 0644]
hacks/fadeplot.c [new file with mode: 0644]
hacks/flag.c [new file with mode: 0644]
hacks/flag.man [new file with mode: 0644]
hacks/flame.c [new file with mode: 0644]
hacks/flame.man [new file with mode: 0644]
hacks/flow.c [new file with mode: 0644]
hacks/forest.c [new file with mode: 0644]
hacks/forest.man [new file with mode: 0644]
hacks/galaxy.c [new file with mode: 0644]
hacks/galaxy.man [new file with mode: 0644]
hacks/glx/Makefile.in [new file with mode: 0644]
hacks/glx/README [new file with mode: 0644]
hacks/glx/atlantis.c [new file with mode: 0644]
hacks/glx/atlantis.h [new file with mode: 0644]
hacks/glx/b_draw.c [new file with mode: 0644]
hacks/glx/b_lockglue.c [new file with mode: 0644]
hacks/glx/b_sphere.c [new file with mode: 0644]
hacks/glx/bubble3d.c [new file with mode: 0644]
hacks/glx/bubble3d.h [new file with mode: 0644]
hacks/glx/buildlwo.c [new file with mode: 0644]
hacks/glx/buildlwo.h [new file with mode: 0644]
hacks/glx/cage.c [new file with mode: 0644]
hacks/glx/dolphin.c [new file with mode: 0644]
hacks/glx/e_textures.h [new file with mode: 0644]
hacks/glx/gears.c [new file with mode: 0644]
hacks/glx/glplanet.c [new file with mode: 0644]
hacks/glx/lament.c [new file with mode: 0644]
hacks/glx/lament.man [new file with mode: 0644]
hacks/glx/moebius.c [new file with mode: 0644]
hacks/glx/morph3d.c [new file with mode: 0644]
hacks/glx/pipeobjs.c [new file with mode: 0644]
hacks/glx/pipes.c [new file with mode: 0644]
hacks/glx/pulsar.c [new file with mode: 0644]
hacks/glx/rubik.c [new file with mode: 0644]
hacks/glx/s1_1.c [new file with mode: 0644]
hacks/glx/s1_2.c [new file with mode: 0644]
hacks/glx/s1_3.c [new file with mode: 0644]
hacks/glx/s1_4.c [new file with mode: 0644]
hacks/glx/s1_5.c [new file with mode: 0644]
hacks/glx/s1_6.c [new file with mode: 0644]
hacks/glx/s1_b.c [new file with mode: 0644]
hacks/glx/shark.c [new file with mode: 0644]
hacks/glx/sproingies.c [new file with mode: 0644]
hacks/glx/sproingiewrap.c [new file with mode: 0644]
hacks/glx/stairs.c [new file with mode: 0644]
hacks/glx/superquadrics.c [new file with mode: 0644]
hacks/glx/swim.c [new file with mode: 0644]
hacks/glx/whale.c [new file with mode: 0644]
hacks/glx/xlock-gl.c [new file with mode: 0644]
hacks/glx/xpm-ximage.c [new file with mode: 0644]
hacks/glx/xpm-ximage.h [new file with mode: 0644]
hacks/goop.c [new file with mode: 0644]
hacks/goop.man [new file with mode: 0644]
hacks/grav.c [new file with mode: 0644]
hacks/grav.man [new file with mode: 0644]
hacks/greynetic.c [new file with mode: 0644]
hacks/greynetic.man [new file with mode: 0644]
hacks/halo.c [new file with mode: 0644]
hacks/halo.man [new file with mode: 0644]
hacks/helix.c [new file with mode: 0644]
hacks/helix.man [new file with mode: 0644]
hacks/hopalong.c [new file with mode: 0644]
hacks/hopalong.man [new file with mode: 0644]
hacks/hypercube.c [new file with mode: 0644]
hacks/hypercube.man [new file with mode: 0644]
hacks/ifs.c [new file with mode: 0644]
hacks/ifs.man [new file with mode: 0644]
hacks/images/amiga.xpm [new file with mode: 0644]
hacks/images/atari.xbm [new file with mode: 0644]
hacks/images/bob.xbm [new file with mode: 0644]
hacks/images/bubbles/blood.pov [new file with mode: 0644]
hacks/images/bubbles/blood1.xpm [new file with mode: 0644]
hacks/images/bubbles/blood10.xpm [new file with mode: 0644]
hacks/images/bubbles/blood11.xpm [new file with mode: 0644]
hacks/images/bubbles/blood2.xpm [new file with mode: 0644]
hacks/images/bubbles/blood3.xpm [new file with mode: 0644]
hacks/images/bubbles/blood4.xpm [new file with mode: 0644]
hacks/images/bubbles/blood5.xpm [new file with mode: 0644]
hacks/images/bubbles/blood6.xpm [new file with mode: 0644]
hacks/images/bubbles/blood7.xpm [new file with mode: 0644]
hacks/images/bubbles/blood8.xpm [new file with mode: 0644]
hacks/images/bubbles/blood9.xpm [new file with mode: 0644]
hacks/images/bubbles/blue.pov [new file with mode: 0644]
hacks/images/bubbles/blue1.xpm [new file with mode: 0644]
hacks/images/bubbles/blue10.xpm [new file with mode: 0644]
hacks/images/bubbles/blue11.xpm [new file with mode: 0644]
hacks/images/bubbles/blue2.xpm [new file with mode: 0644]
hacks/images/bubbles/blue3.xpm [new file with mode: 0644]
hacks/images/bubbles/blue4.xpm [new file with mode: 0644]
hacks/images/bubbles/blue5.xpm [new file with mode: 0644]
hacks/images/bubbles/blue6.xpm [new file with mode: 0644]
hacks/images/bubbles/blue7.xpm [new file with mode: 0644]
hacks/images/bubbles/blue8.xpm [new file with mode: 0644]
hacks/images/bubbles/blue9.xpm [new file with mode: 0644]
hacks/images/bubbles/glass.pov [new file with mode: 0644]
hacks/images/bubbles/glass1.xpm [new file with mode: 0644]
hacks/images/bubbles/glass10.xpm [new file with mode: 0644]
hacks/images/bubbles/glass11.xpm [new file with mode: 0644]
hacks/images/bubbles/glass2.xpm [new file with mode: 0644]
hacks/images/bubbles/glass3.xpm [new file with mode: 0644]
hacks/images/bubbles/glass4.xpm [new file with mode: 0644]
hacks/images/bubbles/glass5.xpm [new file with mode: 0644]
hacks/images/bubbles/glass6.xpm [new file with mode: 0644]
hacks/images/bubbles/glass7.xpm [new file with mode: 0644]
hacks/images/bubbles/glass8.xpm [new file with mode: 0644]
hacks/images/bubbles/glass9.xpm [new file with mode: 0644]
hacks/images/bubbles/jade.pov [new file with mode: 0644]
hacks/images/bubbles/jade1.xpm [new file with mode: 0644]
hacks/images/bubbles/jade10.xpm [new file with mode: 0644]
hacks/images/bubbles/jade11.xpm [new file with mode: 0644]
hacks/images/bubbles/jade2.xpm [new file with mode: 0644]
hacks/images/bubbles/jade3.xpm [new file with mode: 0644]
hacks/images/bubbles/jade4.xpm [new file with mode: 0644]
hacks/images/bubbles/jade5.xpm [new file with mode: 0644]
hacks/images/bubbles/jade6.xpm [new file with mode: 0644]
hacks/images/bubbles/jade7.xpm [new file with mode: 0644]
hacks/images/bubbles/jade8.xpm [new file with mode: 0644]
hacks/images/bubbles/jade9.xpm [new file with mode: 0644]
hacks/images/earth.xbm [new file with mode: 0644]
hacks/images/jigsaw/jigsaw.xbm [new file with mode: 0644]
hacks/images/jigsaw/jigsaw_a_e_f.xbm [new file with mode: 0644]
hacks/images/jigsaw/jigsaw_a_e_h.xbm [new file with mode: 0644]
hacks/images/jigsaw/jigsaw_a_f.xbm [new file with mode: 0644]
hacks/images/jigsaw/jigsaw_a_h.xbm [new file with mode: 0644]
hacks/images/jigsaw/jigsaw_a_n_f.xbm [new file with mode: 0644]
hacks/images/jigsaw/jigsaw_a_n_h.xbm [new file with mode: 0644]
hacks/images/jigsaw/jigsaw_a_ne_f.xbm [new file with mode: 0644]
hacks/images/jigsaw/jigsaw_a_ne_h.xbm [new file with mode: 0644]
hacks/images/jigsaw/jigsaw_a_nw_f.xbm [new file with mode: 0644]
hacks/images/jigsaw/jigsaw_a_nw_h.xbm [new file with mode: 0644]
hacks/images/jigsaw/jigsaw_a_s_f.xbm [new file with mode: 0644]
hacks/images/jigsaw/jigsaw_a_s_h.xbm [new file with mode: 0644]
hacks/images/jigsaw/jigsaw_a_se_f.xbm [new file with mode: 0644]
hacks/images/jigsaw/jigsaw_a_se_h.xbm [new file with mode: 0644]
hacks/images/jigsaw/jigsaw_a_sw_f.xbm [new file with mode: 0644]
hacks/images/jigsaw/jigsaw_a_sw_h.xbm [new file with mode: 0644]
hacks/images/jigsaw/jigsaw_a_w_f.xbm [new file with mode: 0644]
hacks/images/jigsaw/jigsaw_a_w_h.xbm [new file with mode: 0644]
hacks/images/jigsaw/jigsaw_b_e_f.xbm [new file with mode: 0644]
hacks/images/jigsaw/jigsaw_b_e_h.xbm [new file with mode: 0644]
hacks/images/jigsaw/jigsaw_b_f.xbm [new file with mode: 0644]
hacks/images/jigsaw/jigsaw_b_h.xbm [new file with mode: 0644]
hacks/images/jigsaw/jigsaw_b_n_f.xbm [new file with mode: 0644]
hacks/images/jigsaw/jigsaw_b_n_h.xbm [new file with mode: 0644]
hacks/images/jigsaw/jigsaw_b_ne_f.xbm [new file with mode: 0644]
hacks/images/jigsaw/jigsaw_b_ne_h.xbm [new file with mode: 0644]
hacks/images/jigsaw/jigsaw_b_nw_f.xbm [new file with mode: 0644]
hacks/images/jigsaw/jigsaw_b_nw_h.xbm [new file with mode: 0644]
hacks/images/jigsaw/jigsaw_b_s_f.xbm [new file with mode: 0644]
hacks/images/jigsaw/jigsaw_b_s_h.xbm [new file with mode: 0644]
hacks/images/jigsaw/jigsaw_b_se_f.xbm [new file with mode: 0644]
hacks/images/jigsaw/jigsaw_b_se_h.xbm [new file with mode: 0644]
hacks/images/jigsaw/jigsaw_b_sw_f.xbm [new file with mode: 0644]
hacks/images/jigsaw/jigsaw_b_sw_h.xbm [new file with mode: 0644]
hacks/images/jigsaw/jigsaw_b_w_f.xbm [new file with mode: 0644]
hacks/images/jigsaw/jigsaw_b_w_h.xbm [new file with mode: 0644]
hacks/images/lament.xpm [new file with mode: 0644]
hacks/images/mac.xbm [new file with mode: 0644]
hacks/images/matrix.xbm [new file with mode: 0644]
hacks/images/matrix.xpm [new file with mode: 0644]
hacks/images/noseguy/nose-f1.xbm [new file with mode: 0644]
hacks/images/noseguy/nose-f1.xpm [new file with mode: 0644]
hacks/images/noseguy/nose-f2.xbm [new file with mode: 0644]
hacks/images/noseguy/nose-f2.xpm [new file with mode: 0644]
hacks/images/noseguy/nose-f3.xbm [new file with mode: 0644]
hacks/images/noseguy/nose-f3.xpm [new file with mode: 0644]
hacks/images/noseguy/nose-f4.xbm [new file with mode: 0644]
hacks/images/noseguy/nose-f4.xpm [new file with mode: 0644]
hacks/images/noseguy/nose-l1.xbm [new file with mode: 0644]
hacks/images/noseguy/nose-l1.xpm [new file with mode: 0644]
hacks/images/noseguy/nose-l2.xbm [new file with mode: 0644]
hacks/images/noseguy/nose-l2.xpm [new file with mode: 0644]
hacks/images/noseguy/nose-r1.xbm [new file with mode: 0644]
hacks/images/noseguy/nose-r1.xpm [new file with mode: 0644]
hacks/images/noseguy/nose-r2.xbm [new file with mode: 0644]
hacks/images/noseguy/nose-r2.xpm [new file with mode: 0644]
hacks/images/som.xbm [new file with mode: 0644]
hacks/imsmap.c [new file with mode: 0644]
hacks/imsmap.man [new file with mode: 0644]
hacks/interference.c [new file with mode: 0644]
hacks/jigsaw.c [new file with mode: 0644]
hacks/jigsaw.man [new file with mode: 0644]
hacks/julia.c [new file with mode: 0644]
hacks/julia.man [new file with mode: 0644]
hacks/kaleidescope.c [new file with mode: 0644]
hacks/kaleidescope.man [new file with mode: 0644]
hacks/kumppa.c [new file with mode: 0644]
hacks/laser.c [new file with mode: 0644]
hacks/laser.man [new file with mode: 0644]
hacks/lightning.c [new file with mode: 0644]
hacks/lightning.man [new file with mode: 0644]
hacks/link_axp.com [new file with mode: 0644]
hacks/link_decc.com [new file with mode: 0644]
hacks/lisa.c [new file with mode: 0644]
hacks/lisa.man [new file with mode: 0644]
hacks/lissie.c [new file with mode: 0644]
hacks/lmorph.c [new file with mode: 0644]
hacks/lmorph.man [new file with mode: 0644]
hacks/loop.c [new file with mode: 0644]
hacks/maze.c [new file with mode: 0644]
hacks/maze.man [new file with mode: 0644]
hacks/moire.c [new file with mode: 0644]
hacks/moire.man [new file with mode: 0644]
hacks/moire2.c [new file with mode: 0644]
hacks/mountain.c [new file with mode: 0644]
hacks/munch.c [new file with mode: 0644]
hacks/munch.man [new file with mode: 0644]
hacks/noseguy.c [new file with mode: 0644]
hacks/noseguy.man [new file with mode: 0644]
hacks/pedal.c [new file with mode: 0644]
hacks/pedal.man [new file with mode: 0644]
hacks/penetrate.c [new file with mode: 0644]
hacks/penrose.c [new file with mode: 0644]
hacks/penrose.man [new file with mode: 0644]
hacks/petri.c [new file with mode: 0644]
hacks/phosphor.c [new file with mode: 0644]
hacks/pyro.c [new file with mode: 0644]
hacks/pyro.man [new file with mode: 0644]
hacks/qix.c [new file with mode: 0644]
hacks/qix.man [new file with mode: 0644]
hacks/rd-bomb.c [new file with mode: 0644]
hacks/rd-bomb.man [new file with mode: 0644]
hacks/rocks.c [new file with mode: 0644]
hacks/rocks.man [new file with mode: 0644]
hacks/rorschach.c [new file with mode: 0644]
hacks/rorschach.man [new file with mode: 0644]
hacks/rotor.c [new file with mode: 0644]
hacks/screenhack.c [new file with mode: 0644]
hacks/screenhack.h [new file with mode: 0644]
hacks/shadebobs.c [new file with mode: 0644]
hacks/sierpinski.c [new file with mode: 0644]
hacks/sierpinski.man [new file with mode: 0644]
hacks/slidescreen.c [new file with mode: 0644]
hacks/slidescreen.man [new file with mode: 0644]
hacks/slip.c [new file with mode: 0644]
hacks/slip.man [new file with mode: 0644]
hacks/sonar.c [new file with mode: 0644]
hacks/sonar.man [new file with mode: 0644]
hacks/sphere.c [new file with mode: 0644]
hacks/sphere.man [new file with mode: 0644]
hacks/spiral.c [new file with mode: 0644]
hacks/spiral.man [new file with mode: 0644]
hacks/spotlight.c [new file with mode: 0644]
hacks/spotlight.man [new file with mode: 0644]
hacks/squiral.c [new file with mode: 0644]
hacks/squiral.man [new file with mode: 0644]
hacks/starfish.c [new file with mode: 0644]
hacks/starfish.man [new file with mode: 0644]
hacks/strange.c [new file with mode: 0644]
hacks/strange.man [new file with mode: 0644]
hacks/swirl.c [new file with mode: 0644]
hacks/swirl.man [new file with mode: 0644]
hacks/t3d.c [new file with mode: 0644]
hacks/t3d.man [new file with mode: 0644]
hacks/triangle.c [new file with mode: 0644]
hacks/truchet.c [new file with mode: 0644]
hacks/vidwhacker [new file with mode: 0755]
hacks/vidwhacker.man [new file with mode: 0644]
hacks/vines.c [new file with mode: 0644]
hacks/vines.man [new file with mode: 0644]
hacks/vms_axp.opt [new file with mode: 0644]
hacks/vms_axp_12.opt [new file with mode: 0644]
hacks/vms_decc.opt [new file with mode: 0644]
hacks/vms_decc_12.opt [new file with mode: 0644]
hacks/wander.c [new file with mode: 0644]
hacks/webcollage [new file with mode: 0755]
hacks/webcollage.man [new file with mode: 0644]
hacks/worm.c [new file with mode: 0644]
hacks/xflame.c [new file with mode: 0644]
hacks/xjack.c [new file with mode: 0644]
hacks/xjack.man [new file with mode: 0644]
hacks/xlock_23.h [new file with mode: 0644]
hacks/xlockmore.c [new file with mode: 0644]
hacks/xlockmore.h [new file with mode: 0644]
hacks/xlockmoreI.h [new file with mode: 0644]
hacks/xlyap.c [new file with mode: 0644]
hacks/xlyap.man [new file with mode: 0644]
hacks/xmatrix.c [new file with mode: 0644]
hacks/xroger-hack.c [new file with mode: 0644]
hacks/xroger.man [new file with mode: 0644]
hacks/xscreensaver-sgigl.c [new file with mode: 0644]
install-sh [new file with mode: 0755]
lib/X11/app-defaults/XScreenSaver [deleted file]
local/bin/ant [deleted file]
local/bin/atlantis [deleted file]
local/bin/attraction [deleted file]
local/bin/blitspin [deleted file]
local/bin/bouboule [deleted file]
local/bin/braid [deleted file]
local/bin/bsod [deleted file]
local/bin/bubble3d [deleted file]
local/bin/bubbles [deleted file]
local/bin/cage [deleted file]
local/bin/compass [deleted file]
local/bin/critical [deleted file]
local/bin/crystal [deleted file]
local/bin/cynosure [deleted file]
local/bin/decayscreen [deleted file]
local/bin/deco [deleted file]
local/bin/deluxe [deleted file]
local/bin/demon [deleted file]
local/bin/discrete [deleted file]
local/bin/distort [deleted file]
local/bin/drift [deleted file]
local/bin/epicycle [deleted file]
local/bin/fadeplot [deleted file]
local/bin/flag [deleted file]
local/bin/flame [deleted file]
local/bin/flow [deleted file]
local/bin/forest [deleted file]
local/bin/galaxy [deleted file]
local/bin/gears [deleted file]
local/bin/glplanet [deleted file]
local/bin/goop [deleted file]
local/bin/grav [deleted file]
local/bin/greynetic [deleted file]
local/bin/halo [deleted file]
local/bin/helix [deleted file]
local/bin/hopalong [deleted file]
local/bin/hypercube [deleted file]
local/bin/ifs [deleted file]
local/bin/imsmap [deleted file]
local/bin/interference [deleted file]
local/bin/jigsaw [deleted file]
local/bin/kaleidescope [deleted file]
local/bin/kumppa [deleted file]
local/bin/lament [deleted file]
local/bin/laser [deleted file]
local/bin/lightning [deleted file]
local/bin/lisa [deleted file]
local/bin/lissie [deleted file]
local/bin/lmorph [deleted file]
local/bin/loop [deleted file]
local/bin/maze [deleted file]
local/bin/moebius [deleted file]
local/bin/moire [deleted file]
local/bin/moire2 [deleted file]
local/bin/morph3d [deleted file]
local/bin/mountain [deleted file]
local/bin/munch [deleted file]
local/bin/noseguy [deleted file]
local/bin/pedal [deleted file]
local/bin/penetrate [deleted file]
local/bin/penrose [deleted file]
local/bin/petri [deleted file]
local/bin/phosphor [deleted file]
local/bin/pipes [deleted file]
local/bin/pulsar [deleted file]
local/bin/pyro [deleted file]
local/bin/qix [deleted file]
local/bin/rd-bomb [deleted file]
local/bin/rocks [deleted file]
local/bin/rorschach [deleted file]
local/bin/rotor [deleted file]
local/bin/rubik [deleted file]
local/bin/shadebobs [deleted file]
local/bin/sierpinski [deleted file]
local/bin/slidescreen [deleted file]
local/bin/slip [deleted file]
local/bin/sonar [deleted file]
local/bin/sphere [deleted file]
local/bin/spiral [deleted file]
local/bin/spotlight [deleted file]
local/bin/sproingies [deleted file]
local/bin/squiral [deleted file]
local/bin/stairs [deleted file]
local/bin/starfish [deleted file]
local/bin/strange [deleted file]
local/bin/superquadrics [deleted file]
local/bin/swirl [deleted file]
local/bin/t3d [deleted file]
local/bin/triangle [deleted file]
local/bin/truchet [deleted file]
local/bin/vidwhacker [deleted file]
local/bin/vines [deleted file]
local/bin/wander [deleted file]
local/bin/webcollage [deleted file]
local/bin/worm [deleted file]
local/bin/xcoral [deleted file]
local/bin/xflame [deleted file]
local/bin/xjack [deleted file]
local/bin/xjulia [deleted file]
local/bin/xlyap [deleted file]
local/bin/xmatrix [deleted file]
local/bin/xroger [deleted file]
local/bin/xscreensaver [deleted file]
local/bin/xscreensaver-command [deleted file]
local/bin/xscreensaver-demo [deleted file]
local/man/cat.1/attraction.1 [deleted file]
local/man/cat.1/blitspin.1 [deleted file]
local/man/cat.1/bouboule.1 [deleted file]
local/man/cat.1/braid.1 [deleted file]
local/man/cat.1/bsod.1 [deleted file]
local/man/cat.1/bubbles.1 [deleted file]
local/man/cat.1/critical.1 [deleted file]
local/man/cat.1/decayscreen.1 [deleted file]
local/man/cat.1/deco.1 [deleted file]
local/man/cat.1/drift.1 [deleted file]
local/man/cat.1/epicycle.1 [deleted file]
local/man/cat.1/flag.1 [deleted file]
local/man/cat.1/flame.1 [deleted file]
local/man/cat.1/forest.1 [deleted file]
local/man/cat.1/galaxy.1 [deleted file]
local/man/cat.1/goop.1 [deleted file]
local/man/cat.1/grav.1 [deleted file]
local/man/cat.1/greynetic.1 [deleted file]
local/man/cat.1/halo.1 [deleted file]
local/man/cat.1/helix.1 [deleted file]
local/man/cat.1/hopalong.1 [deleted file]
local/man/cat.1/hypercube.1 [deleted file]
local/man/cat.1/ifs.1 [deleted file]
local/man/cat.1/imsmap.1 [deleted file]
local/man/cat.1/jigsaw.1 [deleted file]
local/man/cat.1/kaleidescope.1 [deleted file]
local/man/cat.1/lament.1 [deleted file]
local/man/cat.1/laser.1 [deleted file]
local/man/cat.1/lightning.1 [deleted file]
local/man/cat.1/lisa.1 [deleted file]
local/man/cat.1/lmorph.1 [deleted file]
local/man/cat.1/maze.1 [deleted file]
local/man/cat.1/moire.1 [deleted file]
local/man/cat.1/munch.1 [deleted file]
local/man/cat.1/noseguy.1 [deleted file]
local/man/cat.1/pedal.1 [deleted file]
local/man/cat.1/penrose.1 [deleted file]
local/man/cat.1/pyro.1 [deleted file]
local/man/cat.1/qix.1 [deleted file]
local/man/cat.1/rd-bomb.1 [deleted file]
local/man/cat.1/rocks.1 [deleted file]
local/man/cat.1/rorschach.1 [deleted file]
local/man/cat.1/sierpinski.1 [deleted file]
local/man/cat.1/slidescreen.1 [deleted file]
local/man/cat.1/slip.1 [deleted file]
local/man/cat.1/sonar.1 [deleted file]
local/man/cat.1/sphere.1 [deleted file]
local/man/cat.1/spiral.1 [deleted file]
local/man/cat.1/spotlight.1 [deleted file]
local/man/cat.1/squiral.1 [deleted file]
local/man/cat.1/starfish.1 [deleted file]
local/man/cat.1/strange.1 [deleted file]
local/man/cat.1/swirl.1 [deleted file]
local/man/cat.1/t3d.1 [deleted file]
local/man/cat.1/vidwhacker.1 [deleted file]
local/man/cat.1/vines.1 [deleted file]
local/man/cat.1/webcollage.1 [deleted file]
local/man/cat.1/xjack.1 [deleted file]
local/man/cat.1/xjulia.1 [deleted file]
local/man/cat.1/xlyap.1 [deleted file]
local/man/cat.1/xroger.1 [deleted file]
local/man/cat.1/xscreensaver-command.1 [deleted file]
local/man/cat.1/xscreensaver-demo.1 [deleted file]
local/man/cat.1/xscreensaver.1 [deleted file]
local/man/man.1/attraction.1 [deleted file]
local/man/man.1/blitspin.1 [deleted file]
local/man/man.1/bouboule.1 [deleted file]
local/man/man.1/braid.1 [deleted file]
local/man/man.1/bsod.1 [deleted file]
local/man/man.1/bubbles.1 [deleted file]
local/man/man.1/critical.1 [deleted file]
local/man/man.1/decayscreen.1 [deleted file]
local/man/man.1/deco.1 [deleted file]
local/man/man.1/drift.1 [deleted file]
local/man/man.1/epicycle.1 [deleted file]
local/man/man.1/flag.1 [deleted file]
local/man/man.1/flame.1 [deleted file]
local/man/man.1/forest.1 [deleted file]
local/man/man.1/galaxy.1 [deleted file]
local/man/man.1/goop.1 [deleted file]
local/man/man.1/grav.1 [deleted file]
local/man/man.1/greynetic.1 [deleted file]
local/man/man.1/halo.1 [deleted file]
local/man/man.1/helix.1 [deleted file]
local/man/man.1/hopalong.1 [deleted file]
local/man/man.1/hypercube.1 [deleted file]
local/man/man.1/ifs.1 [deleted file]
local/man/man.1/imsmap.1 [deleted file]
local/man/man.1/jigsaw.1 [deleted file]
local/man/man.1/kaleidescope.1 [deleted file]
local/man/man.1/lament.1 [deleted file]
local/man/man.1/laser.1 [deleted file]
local/man/man.1/lightning.1 [deleted file]
local/man/man.1/lisa.1 [deleted file]
local/man/man.1/lmorph.1 [deleted file]
local/man/man.1/maze.1 [deleted file]
local/man/man.1/moire.1 [deleted file]
local/man/man.1/munch.1 [deleted file]
local/man/man.1/noseguy.1 [deleted file]
local/man/man.1/pedal.1 [deleted file]
local/man/man.1/penrose.1 [deleted file]
local/man/man.1/pyro.1 [deleted file]
local/man/man.1/qix.1 [deleted file]
local/man/man.1/rd-bomb.1 [deleted file]
local/man/man.1/rocks.1 [deleted file]
local/man/man.1/rorschach.1 [deleted file]
local/man/man.1/sierpinski.1 [deleted file]
local/man/man.1/slidescreen.1 [deleted file]
local/man/man.1/slip.1 [deleted file]
local/man/man.1/sonar.1 [deleted file]
local/man/man.1/sphere.1 [deleted file]
local/man/man.1/spiral.1 [deleted file]
local/man/man.1/spotlight.1 [deleted file]
local/man/man.1/squiral.1 [deleted file]
local/man/man.1/starfish.1 [deleted file]
local/man/man.1/strange.1 [deleted file]
local/man/man.1/swirl.1 [deleted file]
local/man/man.1/t3d.1 [deleted file]
local/man/man.1/vidwhacker.1 [deleted file]
local/man/man.1/vines.1 [deleted file]
local/man/man.1/webcollage.1 [deleted file]
local/man/man.1/xjack.1 [deleted file]
local/man/man.1/xjulia.1 [deleted file]
local/man/man.1/xlyap.1 [deleted file]
local/man/man.1/xroger.1 [deleted file]
local/man/man.1/xscreensaver-command.1 [deleted file]
local/man/man.1/xscreensaver-demo.1 [deleted file]
local/man/man.1/xscreensaver.1 [deleted file]
makevms.com [new file with mode: 0644]
screenblank.txt [new file with mode: 0644]
setup.com [new file with mode: 0644]
utils/Makefile.in [new file with mode: 0644]
utils/README [new file with mode: 0644]
utils/ad2c [new file with mode: 0755]
utils/alpha.c [new file with mode: 0644]
utils/alpha.h [new file with mode: 0644]
utils/colors.c [new file with mode: 0644]
utils/colors.h [new file with mode: 0644]
utils/compile_axp.com [new file with mode: 0644]
utils/compile_decc.com [new file with mode: 0644]
utils/erase.c [new file with mode: 0644]
utils/erase.h [new file with mode: 0644]
utils/fade.c [new file with mode: 0644]
utils/fade.h [new file with mode: 0644]
utils/grabscreen.c [new file with mode: 0644]
utils/grabscreen.h [new file with mode: 0644]
utils/hsv.c [new file with mode: 0644]
utils/hsv.h [new file with mode: 0644]
utils/overlay.c [new file with mode: 0644]
utils/resources.c [new file with mode: 0644]
utils/resources.h [new file with mode: 0644]
utils/sgivideo.c [new file with mode: 0644]
utils/sgivideo.h [new file with mode: 0644]
utils/spline.c [new file with mode: 0644]
utils/spline.h [new file with mode: 0644]
utils/usleep.c [new file with mode: 0644]
utils/usleep.h [new file with mode: 0644]
utils/utils.h [new file with mode: 0644]
utils/version.h [new file with mode: 0644]
utils/visual-gl.c [new file with mode: 0644]
utils/visual.c [new file with mode: 0644]
utils/visual.h [new file with mode: 0644]
utils/vms-gtod.c [new file with mode: 0644]
utils/vms-gtod.h [new file with mode: 0644]
utils/vms-strdup.c [new file with mode: 0644]
utils/vroot.h [new file with mode: 0644]
utils/xdbe.c [new file with mode: 0644]
utils/xdbe.h [new file with mode: 0644]
utils/xmu.c [new file with mode: 0644]
utils/xmu.h [new file with mode: 0644]
utils/xroger.c [new file with mode: 0644]
utils/xshm.c [new file with mode: 0644]
utils/xshm.h [new file with mode: 0644]
utils/yarandom.c [new file with mode: 0644]
utils/yarandom.h [new file with mode: 0644]
xscreensaver.lsm [new file with mode: 0644]
xscreensaver.lsm.sh [new file with mode: 0755]
xscreensaver.spec [new file with mode: 0644]

diff --git a/INSTALL b/INSTALL
new file mode 100644 (file)
index 0000000..50dbe43
--- /dev/null
+++ b/INSTALL
@@ -0,0 +1,183 @@
+Basic Installation
+==================
+
+   These are generic installation instructions.
+
+   The `configure' shell script attempts to guess correct values for
+various system-dependent variables used during compilation.  It uses
+those values to create a `Makefile' in each directory of the package.
+It may also create one or more `.h' files containing system-dependent
+definitions.  Finally, it creates a shell script `config.status' that
+you can run in the future to recreate the current configuration, a file
+`config.cache' that saves the results of its tests to speed up
+reconfiguring, and a file `config.log' containing compiler output
+(useful mainly for debugging `configure').
+
+   If you need to do unusual things to compile the package, please try
+to figure out how `configure' could check whether to do them, and mail
+diffs or instructions to the address given in the `README' so they can
+be considered for the next release.  If at some point `config.cache'
+contains results you don't want to keep, you may remove or edit it.
+
+   The file `configure.in' is used to create `configure' by a program
+called `autoconf'.  You only need `configure.in' if you want to change
+it or regenerate `configure' using a newer version of `autoconf'.
+
+The simplest way to compile this package is:
+
+  1. `cd' to the directory containing the package's source code and type
+     `./configure' to configure the package for your system.  If you're
+     using `csh' on an old version of System V, you might need to type
+     `sh ./configure' instead to prevent `csh' from trying to execute
+     `configure' itself.
+
+     Running `configure' takes awhile.  While running, it prints some
+     messages telling which features it is checking for.
+
+  2. Type `make' to compile the package.
+
+  3. Optionally, type `make check' to run any self-tests that come with
+     the package.
+
+  4. Type `make install' to install the programs and any data files and
+     documentation.
+
+  5. You can remove the program binaries and object files from the
+     source code directory by typing `make clean'.  To also remove the
+     files that `configure' created (so you can compile the package for
+     a different kind of computer), type `make distclean'.  There is
+     also a `make maintainer-clean' target, but that is intended mainly
+     for the package's developers.  If you use it, you may have to get
+     all sorts of other programs in order to regenerate files that came
+     with the distribution.
+
+Compilers and Options
+=====================
+
+   Some systems require unusual options for compilation or linking that
+the `configure' script does not know about.  You can give `configure'
+initial values for variables by setting them in the environment.  Using
+a Bourne-compatible shell, you can do that on the command line like
+this:
+     CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure
+
+Or on systems that have the `env' program, you can do it like this:
+     env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure
+
+Compiling For Multiple Architectures
+====================================
+
+   You can compile the package for more than one kind of computer at the
+same time, by placing the object files for each architecture in their
+own directory.  To do this, you must use a version of `make' that
+supports the `VPATH' variable, such as GNU `make'.  `cd' to the
+directory where you want the object files and executables to go and run
+the `configure' script.  `configure' automatically checks for the
+source code in the directory that `configure' is in and in `..'.
+
+   If you have to use a `make' that does not supports the `VPATH'
+variable, you have to compile the package for one architecture at a time
+in the source code directory.  After you have installed the package for
+one architecture, use `make distclean' before reconfiguring for another
+architecture.
+
+Installation Names
+==================
+
+   By default, `make install' will install the package's files in
+`/usr/local/bin', `/usr/local/man', etc.  You can specify an
+installation prefix other than `/usr/local' by giving `configure' the
+option `--prefix=PATH'.
+
+   You can specify separate installation prefixes for
+architecture-specific files and architecture-independent files.  If you
+give `configure' the option `--exec-prefix=PATH', the package will use
+PATH as the prefix for installing programs and libraries.
+Documentation and other data files will still use the regular prefix.
+
+   In addition, if you use an unusual directory layout you can give
+options like `--bindir=PATH' to specify different values for particular
+kinds of files.  Run `configure --help' for a list of the directories
+you can set and what kinds of files go in them.
+
+   If the package supports it, you can cause programs to be installed
+with an extra prefix or suffix on their names by giving `configure' the
+option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
+
+Optional Features
+=================
+
+   Some packages pay attention to `--enable-FEATURE' options to
+`configure', where FEATURE indicates an optional part of the package.
+They may also pay attention to `--with-PACKAGE' options, where PACKAGE
+is something like `gnu-as' or `x' (for the X Window System).  The
+`README' should mention any `--enable-' and `--with-' options that the
+package recognizes.
+
+   For packages that use the X Window System, `configure' can usually
+find the X include and library files automatically, but if it doesn't,
+you can use the `configure' options `--x-includes=DIR' and
+`--x-libraries=DIR' to specify their locations.
+
+Specifying the System Type
+==========================
+
+   There may be some features `configure' can not figure out
+automatically, but needs to determine by the type of host the package
+will run on.  Usually `configure' can figure that out, but if it prints
+a message saying it can not guess the host type, give it the
+`--host=TYPE' option.  TYPE can either be a short name for the system
+type, such as `sun4', or a canonical name with three fields:
+     CPU-COMPANY-SYSTEM
+
+See the file `config.sub' for the possible values of each field.  If
+`config.sub' isn't included in this package, then this package doesn't
+need to know the host type.
+
+   If you are building compiler tools for cross-compiling, you can also
+use the `--target=TYPE' option to select the type of system they will
+produce code for and the `--build=TYPE' option to select the type of
+system on which you are compiling the package.
+
+Sharing Defaults
+================
+
+   If you want to set default values for `configure' scripts to share,
+you can create a site shell script called `config.site' that gives
+default values for variables like `CC', `cache_file', and `prefix'.
+`configure' looks for `PREFIX/share/config.site' if it exists, then
+`PREFIX/etc/config.site' if it exists.  Or, you can set the
+`CONFIG_SITE' environment variable to the location of the site script.
+A warning: not all `configure' scripts look for a site script.
+
+Operation Controls
+==================
+
+   `configure' recognizes the following options to control how it
+operates.
+
+`--cache-file=FILE'
+     Use and save the results of the tests in FILE instead of
+     `./config.cache'.  Set FILE to `/dev/null' to disable caching, for
+     debugging `configure'.
+
+`--help'
+     Print a summary of the options to `configure', and exit.
+
+`--quiet'
+`--silent'
+`-q'
+     Do not print messages saying which checks are being made.  To
+     suppress all normal output, redirect it to `/dev/null' (any error
+     messages will still be shown).
+
+`--srcdir=DIR'
+     Look for the package's source code in directory DIR.  Usually
+     `configure' can determine that directory automatically.
+
+`--version'
+     Print the version of Autoconf used to generate the `configure'
+     script, and exit.
+
+`configure' also accepts some other, not widely useful, options.
+
diff --git a/Makefile.in b/Makefile.in
new file mode 100644 (file)
index 0000000..00a5d99
--- /dev/null
@@ -0,0 +1,288 @@
+# Makefile.in --- xscreensaver, Copyright (c) 1999 Jamie Zawinski.
+# the `../configure' script generates `Makefile' from this file.
+
+@SET_MAKE@
+srcdir         = @srcdir@
+VPATH          = @srcdir@
+
+SHELL          = /bin/sh
+SUBDIRS                = utils driver hacks hacks/glx
+TARFILES       = README README.VMS README.debugging INSTALL xscreensaver.lsm \
+                 configure configure.in Makefile.in config.h.in \
+                 config.h-vms install-sh setup.com config.guess \
+                 config.sub makevms.com screenblank.txt \
+                 xscreensaver.lsm.sh xscreensaver.spec
+TAR            = tar
+COMPRESS       = gzip --verbose --best
+COMPRESS_EXT   = gz
+# COMPRESS     = compress
+# COMPRESS_EXT = Z
+
+MAKE_SUBDIR = for dir in $(SUBDIRS); do (cd $$dir; $(MAKE) $@) || exit 5; done
+
+default::
+       @$(MAKE_SUBDIR)
+all::
+       @$(MAKE_SUBDIR)
+install:
+       @$(MAKE_SUBDIR)
+install-program:
+       @$(MAKE_SUBDIR)
+install-man:
+       @$(MAKE_SUBDIR)
+install-strip:
+       @$(MAKE_SUBDIR)
+uninstall:
+       @$(MAKE_SUBDIR)
+uninstall-program:
+       @$(MAKE_SUBDIR)
+uninstall-man:
+       @$(MAKE_SUBDIR)
+depend:
+       @$(MAKE_SUBDIR)
+distdepend:
+       @$(MAKE) update_spec_version
+       @$(MAKE_SUBDIR)
+TAGS: tags
+tags:
+       @$(MAKE_SUBDIR)
+clean:
+       @$(MAKE_SUBDIR)
+distclean: clean
+       -rm -f config.h Makefile config.status config.cache config.log TAGS *~ "#"*
+       @$(MAKE_SUBDIR)
+
+dist: tar
+
+# This really makes me sick...
+tar:
+       @                                                                   \
+  sh config.status ;                                                       \
+  rm -f configure ;                                                        \
+  $(MAKE) configure ;                                                      \
+  $(MAKE) distdepend ;                                                     \
+  sh xscreensaver.lsm.sh > xscreensaver.lsm.$$$$ ;                         \
+  mv xscreensaver.lsm.$$$$ xscreensaver.lsm ;                              \
+  NAME=`sed -n                                                             \
+  's/[^0-9]*\([0-9]\.[0-9][0-9]*\).*/xscreensaver-\1/p' utils/version.h` ;  \
+  rm -rf $$NAME ; ln -s . $$NAME ;                                         \
+  FILES= ;                                                                 \
+  for subdir in $(SUBDIRS) ; do                                                    \
+    d=`pwd` ;                                                              \
+    cd $$subdir ;                                                          \
+    FILES="$$FILES `$(MAKE) echo_tarfiles                                  \
+      | grep -v '^.*make\['                                                \
+      | sed \"s|^|$$subdir/|g;s| | $$subdir/|g\"                           \
+      ` ";                                                                 \
+    cd $$d ; done ;                                                        \
+  echo creating tar file $${NAME}.tar.$(COMPRESS_EXT)... ;                 \
+  $(TAR) -vchf -                                                           \
+    `echo $(TARFILES) $$FILES | sed "s|^|$$NAME/|g; s| | $$NAME/|g" `      \
+   | $(COMPRESS) > $${NAME}.tar.$(COMPRESS_EXT) ;                          \
+  rm $$NAME
+
+
+# This also makes me sick...
+# autoconf generates a configure script that begins with a very hard to read,
+# nearly impossible to customize --help blurb.  This horrid set of regexps
+# go through and clean up the help text, by inserting whitespace and ripping
+# out options we don't use.  Odds are good that this will fail with any version
+# of autoconf other than the ones I've tried (2.12 and 2.13.)
+#
+configure::
+       autoconf
+       @TMP=configure.$$$$ ;                                                \
+       echo "munging configure's --help message..." ;                       \
+       ( perl -e '                                                          \
+               my $$file="";                                                \
+               while (<>) { $$file .= $$_; }                                \
+               $$_ = $$file;                                                \
+                                                                            \
+               s/^(Configuration:)$$/\n$$1\n/m;                             \
+               s/^(Directory and file names:)$$/\n$$1\n/m;                  \
+               s/^  --sbindir=.*\n//m;                                      \
+               s/^  --libexecdir.*\n//m;                                    \
+               s/^  --datadir.*\n.*\n//m;                                   \
+               s/^  --sysconfdir.*\n//m;                                    \
+               s/^  --sharedstatedir.*\n.*\n//m;                            \
+               s/^  --localstatedir.*\n//m;                                 \
+               s/^  --infodir.*\n//m;                                       \
+               s/^(Host type:)$$/\n$$1\n/m;                                 \
+               s/\nFeatures and packages:\n.*library files are in DIR\n/\n/s;\
+               s/--enable and --with options recognized://m;                \
+               s/\n  --with-x .*?(["\n])/$$1/s;                             \
+               s/\n(Installation options:\n)/$$1/s;                         \
+                                                                            \
+               s/^  --oldincludedir=.*$$/ \
+ --x-includes=DIR        X include files are in DIR\n \
+ --x-libraries=DIR       X library files are in DIR/m; \
+                                                                            \
+               print;'                                                      \
+       < configure                                                          \
+       > $$TMP &&                                                           \
+       cat $$TMP > configure ) ;                                            \
+       rm -f $$TMP
+
+bump-version::
+       @                                                                   \
+  SRC=utils/version.h ;                                                            \
+  VERS=`sed -n 's/[^0-9]*\([0-9]\)\.\([0-9][0-9]*\).*/\1 \2/p' $$SRC` ;            \
+  set - $$VERS ;                                                           \
+  MAJOR="$$1"; MINOR="$$2";                                                \
+  NEW=`echo $$MINOR + 1 | bc` ;                                                    \
+  NEW=`echo $$NEW | sed 's/^\([0-9]\)$$/0\1/'` ;                           \
+  D=`date '+%d-%b-%y'`;                                                            \
+  if [ ! -f xscreensaver-$$MAJOR.$$MINOR.tar.gz ]; then                            \
+    echo "WARNING: xscreensaver-$$MAJOR.$$MINOR.tar.gz does not exist.";    \
+  fi ;                                                                     \
+  if [ -f xscreensaver-$$MAJOR.$$NEW.tar.gz ]; then                        \
+    echo "WARNING: xscreensaver-$$MAJOR.$$NEW.tar.gz already exists.";     \
+  fi ;                                                                     \
+  echo -n "Bumping $$MAJOR.$$MINOR to $$MAJOR.$$NEW ($$D), ok? ";          \
+  read line;                                                               \
+  if [ "x$$line" != "xyes" -a  "x$$line" != "xy" ]; then                   \
+    exit 1 ;                                                               \
+  fi ;                                                                     \
+  TMP=/tmp/bv.$$ ;                                                         \
+  sed -e "s/\([0-9]\.[0-9][0-9]*\)/$$MAJOR.$$NEW/"                         \
+      -e "s/\(([0-9][0-9]*-[A-Za-z][a-z][a-z]-[0-9][0-9][0-9]*\))/($$D)/"   \
+        $$SRC > $$TMP ;                                                            \
+  echo -n "New version and date are ";                                     \
+  sed -n "s/[^0-9]*\([0-9]\.[0-9][0-9]*\) (\([-A-Za-z0-9]*\)).*/\1, \2./p"  \
+     $$TMP;                                                                \
+  cat $$TMP > $$SRC ;                                                      \
+  rm -f $$TMP;                                                             \
+  echo "overwrote $$SRC";                                                  \
+  ls -lFd $$SRC
+
+update_spec_version::
+       @S=$(srcdir)/xscreensaver.spec ;                                    \
+       U=$(srcdir)/utils/version.h ;                                       \
+       V=`sed -n 's/.*\([0-9][0-9]*\.[0-9]*\).*/\1/p' < $$U` ;             \
+       echo -n "Updating version number in $$S to \"$$V\"... " ;           \
+       T=/tmp/xs.$$$$ ;                                                    \
+       sed "s/^\(Version:[^0-9]*\)\(.*\)/\1$$V/"                           \
+         < $$S > $$T ;                                                     \
+       if cmp -s $$S $$T ; then                                            \
+         echo "unchanged." ;                                               \
+       else                                                                \
+         cat $$T > $$S ;                                                   \
+         echo "done." ;                                                    \
+       fi ;                                                                \
+       rm $$T
+
+rpm::
+       @                                                                   \
+  VERS=`sed -n 's/[^0-9]*\([0-9]\.[0-9][0-9]*\).*/\1/p' utils/version.h` ;  \
+  DIR=/usr/src/redhat ;                                                            \
+  cp -p xscreensaver-$$VERS.tar.gz $$DIR/SOURCES/ ;                        \
+  rpm -ba xscreensaver.spec ;                                              \
+  rm -f $$DIR/xscreensaver-$$VERS.tar.gz ;                                 \
+  rm -rf $$DIR/BUILD/xscreensaver-$$VERS ;                                 \
+  mv $$DIR/RPMS/i386/xscreensaver-$$VERS-*.rpm . ;                         \
+  mv $$DIR/SRPMS/xscreensaver-$$VERS-*.rpm . ;                             \
+  echo '' ;                                                                \
+  ls -lFG xscreensaver-$$VERS-*.rpm
+
+test-tar::
+       @                                                                   \
+  VERS=`sed -n 's/[^0-9]*\([0-9]\.[0-9][0-9]*\).*/\1/p' utils/version.h` ;  \
+  D=xscreensaver-$$VERS ;                                                  \
+  NAME="$$D.tar.gz" ;                                                      \
+  if [ ! -f $$NAME ]; then                                                 \
+    echo "$$NAME does not exist!  Did you forget to \`make tar'?" ;        \
+    exit 1 ;                                                               \
+  fi ;                                                                     \
+                                                                           \
+  set -e ;                                                                 \
+  set -x ;                                                                 \
+                                                                           \
+  if [ -d $$D ]; then                                                      \
+   chmod -R u+w $$D ;                                                      \
+  fi ;                                                                     \
+  rm -rf $$D ;                                                             \
+  zcat $$D.tar.gz | tar -xf - ;                                                    \
+  cd $$D ;                                                                 \
+  chmod -R a-w . ;                                                         \
+  chmod u+w . ;                                                                    \
+  mkdir BIN ;                                                              \
+  mkdir BIN/motif ;                                                        \
+  mkdir BIN/lesstif ;                                                      \
+  chmod a-w . ;                                                                    \
+                                                                           \
+  ( cd BIN/motif ;                                                         \
+    CC=cc ;                                                                \
+    export CC ;                                                                    \
+    ../../configure --without-xpm --without-xdbe --without-xshm            \
+                   --with-motif=/usr/local/motif ;                         \
+    echo --------------------------------------------------------------- ;  \
+    gmake all ;                                                                    \
+    ( cd driver; gmake tests ) ;                                           \
+    echo --------------------------------------------------------------- ); \
+                                                                           \
+  ( cd BIN/lesstif ;                                                       \
+    CC=cc ;                                                                \
+    export CC ;                                                                    \
+    ../../configure --with-motif=/usr/local/lesstif ;                      \
+    echo --------------------------------------------------------------- ;  \
+    ( cd utils; gmake all ) ;                                              \
+    ( cd driver; gmake all ) ;                                             \
+    echo --------------------------------------------------------------- ); \
+                                                                           \
+  chmod -R u+w .
+
+
+www::
+       @                                                                   \
+  DEST=$$HOME/www/xscreensaver ;                                           \
+  VERS=`sed -n 's/[^0-9]*\([0-9]\.[0-9][0-9]*\).*/\1/p' utils/version.h` ;  \
+  HEAD="xscreensaver-$$VERS" ;                                             \
+  NAME="$$HEAD.tar.gz" ;                                                   \
+                                                                           \
+  if [ ! -f $$NAME ]; then                                                 \
+    echo "$$NAME does not exist!  Did you forget to \`make tar'?" ;        \
+    exit 1 ;                                                               \
+  fi ;                                                                     \
+  chmod a-w $$NAME ;                                                       \
+  if [ -f $$DEST/$$NAME ]; then                                                    \
+    echo -n "WARNING: $$DEST/$$NAME already exists!  Overwrite? ";         \
+    read line;                                                             \
+    if [ "x$$line" != "xyes" -a "x$$line" != "xy" ]; then                  \
+      exit 1 ;                                                                     \
+    fi ;                                                                   \
+  fi ;                                                                     \
+  cp -p $$NAME $$DEST/$$NAME ;                                             \
+  chmod u+w $$DEST/$$NAME ;                                                \
+  cd $$DEST ;                                                              \
+                                                                           \
+  TMP=/tmp/xd.$$$$ ;                                                       \
+  sed "s/xscreensaver-[0-9]\.[0-9][0-9]*/$$HEAD/g" download.html > $$TMP ;  \
+  echo '' ;                                                                \
+  diff -u0 download.html $$TMP ;                                           \
+  echo '' ;                                                                \
+                                                                           \
+  OLDEST=`ls xscreensaver*.tar.gz | head -1` ;                             \
+  echo -n "Delete $$DEST/$$OLDEST? ";                                      \
+  read line;                                                               \
+  if [ "x$$line" = "xyes" -o "x$$line" = "xy" ]; then                      \
+    set -x ;                                                               \
+    rm $$OLDEST ;                                                          \
+    cvs remove $$OLDEST ;                                                  \
+  else                                                                     \
+    set -x ;                                                               \
+  fi ;                                                                     \
+  cvs add -kb $$NAME ;                                                     \
+  cat $$TMP > download.html ;                                              \
+  rm -f $$TMP ;                                                                    \
+                                                                           \
+  (cd ..; $(MAKE) xscreensaver/changelog.html );                           \
+  cvs diff -u0 changelog.html ;                                                    \
+  set +x ;                                                                 \
+                                                                           \
+  echo -n "Ok? ";                                                          \
+  read line;                                                               \
+  if [ "x$$line" != "xyes" -a "x$$line" != "xy" ]; then                            \
+    exit 1 ;                                                               \
+  fi ;                                                                     \
+                                                                           \
+  cvs commit -m "$$VERS"
diff --git a/README b/README
new file mode 100644 (file)
index 0000000..561e0cc
--- /dev/null
+++ b/README
@@ -0,0 +1,646 @@
+
+                              XScreenSaver
+
+            a screen saver and locker for the X window system
+                            by Jamie Zawinski
+
+                     http://www.jwz.org/xscreensaver/
+
+To build on Unix:
+
+  -  ./configure
+  -  make
+  -  make install
+
+The `configure' shell script will attempt to figure out which options are
+appropriate for your system, and will create config.h and the various
+Makefiles for you.  Run `configure --help' to see how to override these
+choices, or to specify things like the default installation directory.
+The file `INSTALL' gives a general overview of use of these sorts of
+configure scripts (those generated by the GNU autoconf system.)
+The most important hint is probably this:
+
+     ./configure --with-motif=/opt/Motif --with-xpm=/usr/local
+
+To build on VMS, see README.VMS.
+
+If you are upgrading, you might want to delete your ~/.xscreensaver file.
+If you don't, you might not see the new graphics modes.  If you are upgrading
+from version 2.* to version 3.*, definitely do delete your .xscreensaver file.
+
+If you think you've found a bug, please let me know!  No bug report is too
+small.  But first, please read the enclosed `README.debugging' file to find
+out what kind of information would be most helpful to include in your bug
+report.
+
+Getting Started:
+
+You can try out xscreensaver like so:
+
+       xscreensaver &
+       xscreensaver-command -demo
+
+After a few seconds, the screen should go black, and a dialog box should
+appear in the upper right corner.  This is "Demo Mode".
+
+Note: unlike `xlock', xscreensaver has a client-server model: the
+`xscreensaver' process is a daemon that runs in the background; it is
+controlled by the foreground `xscreensaver-command' program.
+
+xscreensaver has an extensive manual -- please read it!
+
+                              ============
+
+The xscreensaver daemon waits until the keyboard and mouse have been idle
+for a period, and then runs a graphics demo chosen at random.  The demo is
+terminated as soon as there is any mouse or keyboard activity (or, in
+locking mode, when the proper password is typed.)
+
+It is trivially easy to add new display modes to xscreensaver: any program
+which can be invoked in such a way that it draws on the root window of the
+screen can be used as a screensaver.  You just change a config file --
+there's no need to recompile or reinstall anything.
+
+                              ============
+
+Along with the xscreensaver daemon itself, this package also includes
+numerous graphics hacks for use as screensavers.  There is nothing magic
+about these: they are just programs that draw on the root window.
+
+More than 100 such programs are included.  For details, see the xscreensaver
+web page, or the enclosed manual pages.  There are also some helpful hints
+on customization in the xscreensaver app-defaults file (normally installed
+in /usr/lib/X11/app-defaults/XScreenSaver.)
+
+The latest version of xscreensaver is always available on the web at
+http://www.jwz.org/xscreensaver/.
+
+                              ============
+
+Changes since 3.15:   * New version of `shadebobs'.
+                      * Improved image selection in `webcollage', and sped it
+                        up slightly.
+                      * Made configure find the right version of perl.
+                      * Rewrote the CGI part of `webcollage'.
+                      * `make clean' was deleting some things it shouldn't.
+                      * Fixed a typo in the default programs list.
+Changes since 3.14:   * Added `webcollage' and `shadebobs' hacks.
+                      * Added a `-stdout' arg to `vidwhacker' so that it can
+                        be used in a pipeline.
+                      * Made `petri' use less memory.
+Changes since 3.13:   * Various improvements to the Gtk port.
+                      * Turned off PAM by default on Solaris, since PAM seems
+                        generally to be misconfigured out-of-the-box.
+                      * Made the `--without-gtk' configure option work.
+                      * Made configure check the Gtk version number, since it
+                        requires 1.2.
+                      * Fixed a bug in the code that attempted to prevent
+                        changes of screen resolution while the screen is
+                        locked.
+                      * Fixed a race condition in `xscreensaver-demo' that
+                        could cause an X error at startup.
+                      * Added `-transparent' option to `deluxe'.
+                      * Added `petri' hack.
+Changes since 3.12:   * Ported `xscreensaver-demo' to Gtk.
+                      * Made it possible to build Motif, Gtk, and Athena
+                        versions of `xscreensaver-demo' in the same directory
+                        without reconfiguring.
+                      * Made `xscreensaver-demo' chase symlinks before writing
+                        the .xscreensaver file, so that if .xscreensaver is
+                        itself a symlink, the underlying file will be replaced
+                        instead.
+                      * Some Makefile and configure tweaks for Solaris and
+                        FreeBSD.
+                      * Made it possible to set the fire color in `xflame'.
+                      * Made transparency work in TrueColor (for `goop' and
+                        `qix'.)
+                      * Fixed a multi-head bug introduced by the virtual
+                        viewports stuff.
+Changes since 3.11:   * Made it so that you can't scroll the screen while the
+                        lock dialog is up (with XFree86 virtual viewports.)
+                      * Fixed a bug in `flag' that caused bob's chin to get cut
+                        off after a few iterations.
+Changes since 3.10:   * Made `xjack' be black-on-white-ish, so that it looks
+                        less like a computer screen and more like the
+                        typewritten paper it's supposed to be.
+                      * New version of `pulsar'.
+                      * Fixed Solaris compilation problem in `phosphor'.
+                      * Made xscreensaver notice XFree86's virtual root window
+                        hack, so that if the X server's root window is larger
+                        than the monitor's displayable resolution, the screen
+                        saver will limit itself to the area that actually
+                        appears on the screen.
+                      * Made the xscreensaver daemon do a better job of
+                        picking the visual class that should be used for GL
+                        programs.  Less user intervention should be needed
+                        now: you can use the logical visual name `GL' instead
+                        of having to figure out by hand which one to use.
+                      * Oops, the visual was defaulting to "best" instead of
+                        "default", because the .xscreensaver file was not being
+                        loaded quite early enough.
+                      * Made configure figure out how to build icmp ping
+                        support into the `sonar' hack automatically.
+                      * Made warnings about not being able to read shadow
+                        passwords not be printed if compiled with PAM support.
+                      * Improved PAM startup diagnostics.
+                      * Worked around the Solaris PAM bug that was causing
+                        crashes there, so now PAM is turned on by default.
+                      * Made configure detect the number of arguments that
+                        pam_strerror() takes, since on Linux, this apparently
+                        changed between 2.0 and 2.2, sigh.
+                      * Made the /proc/interrupts kludge look for "PS/2 Mouse"
+                        as well as "keyboard".
+                      * Made xscreensaver notice when there has been a sudden
+                        large jump in wall-clock time, and if so, lock right
+                        away, instead of waiting for "lockTimeout" to expire
+                        first.  (Laptops need this for safer recovery from
+                        ``hibernation.'')
+                      * Added `-throttle' option to `xscreensaver-command'.
+Changes since 3.09:   * Added `phosphor', `xmatrix', and `pulsar' hacks.
+                      * Fixed a bug in the color allocator that sometimes
+                        caused `starfish' to fall back to monochrome.
+                      * Reduced the amount of code that runs before root
+                        privileges are disavowed: "normal" and "shadow"
+                        passwords now do some initialization as root, but the
+                        PAM and Kerberos authorization schemes will be
+                        initialized while running as "nobody".  Supposedly 
+                        this closes a potential security hole when using
+                        Kerberos.
+                      * Added some more sanity checking to configure.
+Changes since 3.08:   * Added `compass', `squiral', `xflame', `wander',
+                        `spotlight', and `critical' hacks.
+                      * Added some new modes to `decayscreen'.
+                      * Made `deluxe' work in monochrome.
+                      * Generalized usage of the Double-Buffer server extension
+                        in several hacks (`compass', `deluxe', `interference',
+                        `kumppa', and `moire2'.)
+                      * Fixed another visual-depth problem in `rd-bomb'.
+                      * The screen saver will now defer blanking if neither
+                        the keyboard nor the mouse could be grabbed.  Instead,
+                        it will just try again in a few minutes.  This fixes
+                        a bad interaction between xscreensaver and programs
+                        like VMware that hold the mouse and keyboard grabbed
+                        for a long time.
+                      * Added a new erase mode (expanding spiral.)
+Changes since 3.07:   * Fixed some bugs in my port of `t3d'.
+                      * Added `penetrate' and `deluxe' hacks.
+                      * When linking against Motif 2.x, also link against XPM.
+                      * Added support for using /proc/interrupts for idle
+                        detection on Linux.  Now xscreensaver shouldn't kick
+                        in when the user is active on a non-X virtual console.
+                      * Upgraded to autoconf 2.13.
+Changes since 3.06:   * Configure tweaks (sometimes -lXmu wasn't getting linked
+                        in properly; check for _Xsetlocale in -lXintl.)
+                      * Portability fixes for sonar.c.
+                      * Fixed a compilation problem when you have GL but don't
+                        have XPM.
+                      * Made configure notice when MesaGL requires -lpthread.
+                      * Made `flame' ignore SIGFPE (not sure if this is the
+                        right fix; it seems only to be needed on FreeBSD.)
+                      * Kludged `rd-bomb' work on visuals that are of depth 24
+                        but that *do not* support pixmaps of depth 32.
+                      * Fixed `halo' to work properly in TrueColor.
+                      * Changed `xscreensaver.spec' to install the hacks in
+                        /usr/X11R6/lib/xscreensaver/ by default, since that's
+                        where recent Red Hat distributions put them.
+                      * Added `t3d' hack.
+                      * Updated versions of `crystal', `hopalong', and `flow'
+                        from xlockmore.
+                      * Imported `demon' and `loop' modes from xlockmore.
+Changes since 3.05:   * Oops, the "default-n" visual descriptor was broken;
+                        it was always installing a colormap if the
+                        `installColormap' preference was set, meaning that
+                        `xearth', `xv' and friends were using the wrong
+                        colors on 8-bit systems.
+                      * Turned off HAVE_PING in `sonar', since it compiles
+                        on some Linux systems, but not others of similar
+                        vintage...
+Changes since 3.04:   * Fixed an off-by-1 in `distort'.
+                      * Added `sonar' hack.
+                      * New version of `glplanet' (with stars.)
+                      * Made all hacks exit when you type `q' or `ESC' at them,
+                        and made them obey the WM_DELETE_WINDOW ClientMessage.
+                      * Fixed a nonfatal buffer overrun in lament (note:
+                        lament still doesn't work with MesaGL 3.0: it dies in
+                        lambda_textured_triangle1(), which is Mesa's bug, not
+                        mine.)
+Changes since 3.03:   * Added an `xscreensaver.spec' file, to make it easier
+                        for other folks to generate RPMs.
+                      * Made the password code work on HPUX in the situation
+                        where: ``enhanced security'' is available; but not 
+                        used; but the user typed a password more than 8
+                        characters long anyway.  FTSOHPUX.
+Changes since 3.02:   * Made locking work when passwd aging is enabled.
+                      * Added support for PAM (Pluggable Authentication
+                        Modules.)  It is still turned off by default, though,
+                        since it doesn't seem to work on Solaris 2.6, and has
+                        been behaving erratically on Red Hat 5.1.
+                      * Made each possible authentication method be tried in
+                        turn until one succeeds; this means that Kerberos is
+                        being used, we will first check Kerberos, and if that
+                        fails, will then consult the local password file.
+                        Likewise with PAM.
+                      * Save and restore the bits under the passwd dialog,
+                        to avoid leaving a black rectangle behind when 
+                        unlocking is cancelled.
+Changes since 3.01:   * Not everyone has sys/select.h, sigh...
+Changes since 3.00:   * Some fixes to `reflect'.
+                     * Configure tweaks.
+                     * Made it log unsuccessful attempts to unlock the screen
+                       to syslog.
+                     * Fixed a bug where `xscreensaver-demo' could be seeing
+                       a different programs list than `xscreensaver' did.
+Changes since 2.34:   * The xscreensaver daemon no longer links against Motif
+                       or Athena: demo-mode and the preferences panel are no
+                       longer built in to the daemon, but are now handled by
+                       an external program, `xscreensaver-demo'.
+                       (I decided that this, along with the recent addition
+                       of the `.xscreensaver' config file, justified bumping
+                       the version number to 3.00, since this is a fairly
+                       major architectural change.)
+                     * Lines in the `*programs' resource may now begin with
+                       the character "-", meaning "don't run this hack."
+                       In this way, it's possible to disable a hack without
+                       throwing away the information about it (making it 
+                       easier to change your mind later.)  Eventually the
+                       preferences/demo mode GUI should represent this as a
+                       checkbox or something.
+                     * Fixed a short race condition where it was possible for
+                       xscreensaver to die with a BadWindow error if it was
+                       blanking the screen just as another window was being
+                       deleted.
+                     * Made it possible to disable specific modes in `bsod'.
+Changes since 2.33:   * Fixed a bug that was making `pipes' generate way too
+                       many valves.  Made the viewpoint in `pipes' be selected
+                       randomly instead of always being -10 degrees.
+                     * Fixed a bug in the XSHM code, in the case where the
+                       server supports the XSHM extension but is not the same
+                       machine as the client.
+                     * Made `rd-bomb' default to taking up the whole screen.
+                     * Made it not try to do fading/unfading if no PseudoColor
+                       visuals exist.
+                     * Initial attempt at supporting VT-locking (doesn't work
+                       yet.)
+                     * Eliminated the `captureStdout' resource; now
+                       `captureStderr' controls both streams.
+                     * Added `-capture-stderr' and `-no-capture-stderr'
+                       command-line arguments.
+                     * Added `glplanet' hack.
+                     * When a hack is selected with `xscreensaver-command
+                       -select', that hack will be used until further notice
+                       (until the saver turns off, or another activation
+                       command is issued.)
+Changes since 2.32:   * Made `xscreensaver-command' print error messages:
+                       the xscreensaver daemon now responds to ClientMessage
+                       events by writing a response message on a window
+                       property, instead of just writing to its stderr.
+                     * Made the ~/.xscreensaver file be automatically reloaded
+                       when the file date changes.
+                     * The password dialog and splash screen no longer depend
+                       on Motif or Athena.  This should clear up a number of
+                       focus problems, and is the first step on the path
+                       toward moving all of the Motif/Athena/whatever code
+                       out of the xscreensaver daemon, and into external
+                       processes.
+                     * Don't complain about LessTif 0.86 any more, since the
+                       new password dialog makes that problem go away.
+                     * Configure tweaks for Irix 6.5, SunOS 5.something.
+                     * New `-reflect' option to `distort'.
+Changes since 2.31:   * Added reading and writing of a ~/.xscreensaver file,
+                       so that the Preferences panel can save its settings.
+                     * New version of `rubik'.
+                     * Added `-select N' argument to `xscreensaver-command'.
+                     * Oops, left out some of the `bubbles3d' files...
+Changes since 2.30:   * The cursor was invisible in the password dialog. Fixed.
+                     * Made configure warn against MesaGL 2.6.
+                     * Fixed X error at startup when using non-default visual.
+                     * New version of `crystal', `ant', and `atlantis' from
+                       xlockmore.
+                     * New hack, `bubble3d'.
+                     * Added some new modes to `bsod'.
+Changes since 2.29:   * Changed the order in which -lSM and -lICE are linked
+                       to be after Motif instead of before (Lesstif on Irix
+                       needs this.)
+Changes since 2.28:   * Work around a bash bug in configure.
+                     * Tweaked HPUX paths again.  FTSOHPUX.
+                     * Made configure recommend against LessTif 0.86, due
+                       to a bug in that version that causes a security hole
+                       in the screen locking code.  LessTif 0.87 will fix it.
+                     * Made all of the `--with' options to `configure' accept
+                       a directory option as well (so that --with-motif=/FOO
+                       will add -I/FOO/include -L/FOO/lib).  I believe this is
+                       the Configure Party Line of how do to such things.
+                     * Fixed a bug where the mouse was left un-grabbed
+                       after the first time the graphics hack was changed
+                       (simplified all of the mouse-grabbing logic.)
+                     * Maybe possibly perhaps made `vidwhacker' really not
+                       leave stray xv windows around.  This time for sure.
+                     * Added a new erase mode (random dots fizzling out.)
+                     * Added `-prefs' argument to `xscreensaver-command',
+                       that brings up the Preferences dialog directly (it
+                       seems that nobody ever noticed the `Preferences' button
+                       on the Demo Mode dialog, maybe this will help.)
+                     * Added a splash screen.  Turn it off with *splash:false.
+Changes since 2.27:   * Better macsbug text in `bsod'.
+                     * New version of `distort' with many new modes.
+                     * Plugged a leak in `coral'.
+                     * Tweaked configure for HPUX.
+                     * Removed some compiler warnings.
+                     * More consistent usage of stderr versus stdout.
+                     * More diagnostics should an X error occur.
+                     * Fixed a possible crash in SGI-specific unfading code.
+Changes since 2.26:   * Improved version of `distort'.
+                     * Made `lament' compile against OpenGL 1.0 (though it
+                       still requires 1.1 to work properly.)
+                     * Updated my email address and home page.
+Changes since 2.24:   * Improved motion in `rd-bomb'.
+                     * Added XSHM (shared memory extension) support to the
+                       `distort', `interference', `moire', `rd-bomb', and
+                       `swirl' hacks, which speeds them up a bit.
+                     * Added `lament' hack.
+Changes since 2.23:   * Tweaked the order of the -L options again.
+                     * Cleaned up configure's `--help' message.
+                     * Added `kumppa' hack.
+                     * Smarter maze-solving algorithm in `maze'.
+                     * Took `xlyap' out of the default list of hacks, since
+                       it's just incredibly buggy (and slow.)  Maybe someday
+                       someone will fix it...
+                     * Added `distort' hack, but didn't add it to the default
+                       list (yet) because it's still too slow.
+                     * Made the Athena demo dialog look more like the Motif
+                       version; it has a text-entry field now, too.
+                     * Made the Athena password dialog echo asterisks, like
+                       Motif does, instead of using a flyspeck font.
+                     * Some random configure tweaks.
+                     * Added a `timestamp' resource that makes the `-verbose'
+                       messages include the time at which they were printed.
+Changes since 2.22:   * The fix for SGI's ``scheme'' nonsense broke things, and
+                       let the user's "*background" resource show through.
+                       Fixed it in a different way.
+Changes since 2.21:   * Added support for the DPMS server extension (Display
+                       Power Management System.)
+                     * Made configure advertize the `--enable-subdir' option a
+                       little more, since that seemed to cause some people
+                       stress.  Also, made that directory be built into the
+                       xscreensaver executable, as a hardcoded prefix to
+                       $PATH.  (Might help, shouldn't hurt.)
+                     * Made configure prefer the two-arg gettimeofday to the
+                       one-arg version, since AIX doesn't have any prototypes.
+                     * Made it work with Xaw3d (the 3D Athena library.)
+                     * Made `make install' create directories as necessary.
+                     * New version of lmorph from Sverre.
+                     * Added `crystal' and `discreet' hacks from xlockmore.
+                     * Added a new mode to `bsod'.
+Changes since 2.20:   * Made `xscreensaver-command -time' use different words.
+                       (It now describes the two states as "screen blanked
+                       since..."  and "screen non-blanked since..." instead of
+                       "active since..." and "inactive since..." which a lot
+                       of people interpreted as meaning the opposite of what
+                       was intended.)
+                     * Improved some error messages, in the hopes of making
+                       the distinction between the xscreensaver and
+                       xscreensaver-command programs more obvious.
+                     * Rewrote (and reorganized) parts of the xscreensaver and
+                       xscreensaver-command manual pages.
+                     * Renamed xscreensaver's `-lock' command-line option to
+                       be `-lock-mode', to avoid confusion with the `-lock'
+                       option to xscreensaver-command, which does a totally
+                       different thing.
+                     * Removed xscreensaver's `-demo' command-line option for
+                       a similar reason; use `xscreensaver-command -demo'
+                       instead.
+                     * Disabled SGI's ``scheme'' nonsense in a better way than
+                       fully-qualifying the background colors in every single
+                       hack.
+                     * Fixed some other minor cosmetic problems when *sgiMode
+                       is turned on.
+                     * Fixed an X error in `bsod -root' (how ironic...)
+Changes since 2.19:   * Fixed a bug that caused the mouse to sometimes not be
+                       grabbed properly (meaning the window manager menu could
+                       pop up over the demo-mode display.)
+                     * Fixed a bug that made the stderr output sometimes get
+                       printed twice.
+                     * Fixed a bug that made the demo-mode scrollbar move too
+                       fast.
+                     * Protected against a possible buffer overflow.
+                     * Made `vidwhacker' not leave stray xv windows around.
+                     * New version of `ant' so that Bagley doesn't calve.
+                     * Make configure on AIX get XShm from the right library.
+Changes since 2.18:   * One file was missing from the tar file.         Fixed.
+Changes since 2.17:   * Oops, atlantis wasn't being built by default.  Fixed.
+                     * Added `epicycle' hack.
+                     * Added `interference' hack.
+                     * Added `truchet' hack.
+                     * Added `bsod' hack.
+                     * Added some new modes to `vidwhacker'.
+Changes since 2.16:   * Added a -window-id argument to most hacks, so that they
+                       can draw on arbitrary externally-provided windows.
+                     * Synched with xlockmore 4.11a01.
+                     * Added `flow' hack.
+                     * Added `atlantis' GL hack.
+                     * Renamed `puzzle' hack to `jigsaw', since xlock already
+                       had a different mode called `puzzle'.
+                     * Made it self-configure properly when Motif 2.1.0 is
+                       being used (requires -lXp now, sigh...)
+Changes since 2.15:   * Made `flag' able to do XPM images.
+                     * New look for the xscreensaver logo (`xroger').
+                     * Fixed compilation error on Suns with adjunct passwords.
+                     * Got multi-architecture builds working again.
+                     * Some configure tweaks for building on HPUX and Solaris.
+                     * Fixed bug in decayscreen.
+                     * Fixed typo in passwd.c.
+                     * Made `cynosure' not die when colormap is full.
+Changes since 2.14:   * Added `cynosure' hack.
+                     * Added `moire2' hack.
+                     * Tweaked `erase.c' some more.
+                     * Made unfading a bit smoother.
+                     * Added `vidwhacker' hack (not installed by default.)
+                     * Added `stairs' hack.
+                     * Split `escher' into `cage' and `moebius', as per
+                       xlockmore.
+                     * Changed subprocess handling to use sigaction() instead
+                       of signal() if it's available (this is necessary for
+                       SCO but should work fine on other systems too.)
+                     * Various other tweaks.
+Changes since 2.13:   * Better fix for the Motif drag-and-die lossage.
+                     * Put in some kludges to work around a LessTif bug.
+                     * XScreenSaver is known to work with LessTif 0.82 now.
+                     * Made fading work on high-end SGI video hardware.
+                     * Fixed another SGI-specific bug in screen grabbing;
+                       will the madness never cease?
+                     * Fixed another crash in `xlyap'.
+Changes since 2.12:   * Made `decayscreen' do directions other than down.
+                     * Improved `puzzle'.
+                     * Fixed a crash in `xlyap'.
+                     * Added CDE info to the man page, removed `cde.txt'.
+                     * Configure tweaks for Zippy.
+                     * Turned off the signal handling in `bubbles' because
+                       it was sometimes failing to die.
+                     * Added `hacks/xscreensaver-sgigl.c' to make it possible
+                       to run SGI's ElectroPaint hack (/usr/demos/bin/ep)
+                       with xscreensaver.  Finally!
+                     * Fixed a buffer overrun in the locking code that some
+                       wily, malicious cracker must have slipped in.
+                     * Disabled Motif drag-and-drool in the dialog box
+                       buttons, since it's broken in some old versions of
+                       Motif.
+Changes since 2.11:   * Added `README.debugging'.
+                     * Added `puzzle' hack.
+                     * Added `xlyap' hack.
+                     * Added `default-n' as a visual name, so that one can
+                       have -install on by default, but turn it off for
+                       certain poorly-behaved hacks (like xv.)
+                     * Added support for grabbing frames of external video
+                       (on SGI) to the screen-grabbing hacks (decayscreen,
+                       slidescreen, slip, blitspin, and puzzle.)
+                     * Improved look of tiles in `slidescreen'; fixed its
+                       color allocation problem.
+Changes since 2.10:   * Tweaked `blitspin', added it to the default list.
+                     * Added `lissie', `mountain', `triangle', `worm',
+                       `rotor', and `ant' from xlockmore.
+                     * Updated `sierpinski', `galaxy', and `lisa'.
+                     * Thickened the lines in `braid' and `lmorph'.
+                     * Updated VMS makefiles.
+                     * Renamed `fract' to `vines'.
+                     * Added `xjack' hack.
+                     * Made a few more hacks use erase.c, and added a few
+                       more wipe styles.
+                     * Fixed compilation problem with Sun's version of OpenGL.
+                     * Added ability to use sigaction() instead of signal()
+                       to work around a SCO kernel bug.
+Changes since 2.09:   * Fixed colormap bugs in `rd-bomb'; sped up `coral'.
+                     * Configure tweaks for *BSD.
+Changes since 2.07:   * New hacks `rd-bomb' and `coral'.
+                     * New version of `maze' with some new algorithms.
+                     * New colorized version of `rocks'.
+                     * Fixed a bug in qix on 64-bit machines.
+                     * Fixed a bug in the -time option.
+                     * Fixed a bug in configure related to LessTif.
+Changes since 2.06:   * Minor header tweaks in windows.c and flag.c.
+                     * Made multi-architecture ($VPATH) builds work properly.
+                     * Merged new GL stuff from xlockmore (rubik, morph3d.)
+                     * Fixed intermittent crashes in `imsmap' and `munch'.
+                     * Added `fadeplot' hack from xlockmore.
+Changes since 2.05:   * Merged in VMS support from Patrick Moreau.
+Changes since 2.04:   * Fixed a MIT-SCREEN-SAVER-related crash, and tweaked
+                       configure to detect the extra-random -Xss library.
+Changes since 2.03:   * HP configure tweaks.  Detect and warn about LessTif.
+                     * Fixed low-color behavior of `goop', `pyro', `starfish',
+                       `greynetic', `flame', `halo', and `moire'.
+Changes since 2.02:   * Fixed flicker in `pipes'.  Fixed 3d in `bouboule'.
+                     * Added `munch' hack.
+                     * Added basic dependencies to the Makefile.in files.
+Changes since 2.01:   * Fixes for compiling with the MIT saver extension.
+                     * Made the yow/fortune program be a configure option.
+                     * Various configure tweaks.
+Changes since 2.00:   * Added `goop' and `starfish' hacks.
+                     * Added colomap cycling to `halo'.
+                     * Made `attraction' use the new colormap allocator.
+                     * Added better $PATH diagnostics.
+                     * There was a bug in frand!  Color selection should be
+                       much improved now.
+Changes since 1.34:   * Converted to use `configure' instead of `imake'.
+                     * ANSI C is now required.
+                     * Added Kerberos locking support, from Nat Lanza.
+                     * Made the stderr text use overlay planes, if possible.
+                     * Reworked the xlockmore compatibility stuff again.
+                     * Added `gears', `superquadrics', `escher', `pipes',
+                       and `sproingies' hacks (depend on OpenGL.)
+Changes since 1.33:   * Fixed some bugs, made fading be a little smoother.
+Changes since 1.32:   * Made it work with multi-headed displays.
+                     * Generalized sub-process management (Unix sucks!)
+                     * Added interactive mouse frobbing to Julia.
+                     * Added (untested) support for HPUX shadow passwords.
+                     * Made normal non-shadow passwords be checked if the
+                       shadow passwords aren't accessible for some reason.
+Changes since 1.31:   * Removed *colorPrograms and *monoPrograms resources:
+                       made it possible to specify the desired visual on a
+                       per-hack basis.
+                     * Cleaned up / restructured the driver: no more globals.
+                     * Made the Motif and Athena dialogs share more code.
+                     * Probably fixed some Athena colormap-installation bugs.
+                     * Fixed screen grabbing (cmap) on SGI 12-bit PseudoColor.
+                     * Fixed divide-by-zero in bright random colormaps.
+                     * Added an improved version of xlock's `flag' hack.
+                     * Made unfading work better, and not flicker on SGIs.
+                     * Added `sphere', `forest', `lisa' hacks from xlockmore.
+                     * Added (untested) support for SunOS Adjunct passwords.
+Changes since 1.30:   * Improved colors and colormap cycling of many hacks.
+                     * Cleaned up xlockmore compatibility layer.
+                     * Made `blitspin' able to grab an image off the screen.
+                     * Ported `swirl' and `bouboule' hacks from xlockmore.
+                     * Made the driver more careful about not leaving bits on
+                       the screen, or allowing other windows to raise
+                       themselves: it now re-blanks the screen every so often.
+                     * Added `-time' option to `xscreensaver-command'.
+                     * Improved SGI screen-grabbing some more: now it can grab
+                       TrueColor screens into PseudoColor windows and have the
+                       colors still come out semi-reasonably.
+Changes since 1.29:   * Made `slidescreen' and `decayscreen' work better on
+                       SGIs when windows of different visuals are present, by
+                       using the XReadDisplay() extension to get a true 24-bit
+                       image out of the frame buffer.
+                     * Made `noseguy' be in color, if compiled with XPM.
+                     * Ported `braid', `drift', `fract', `galaxy', `grav',
+                       `ifs', `julia', `laser', `lightning', `penrose',
+                       `sierpinski', `slip', `spiral', and `strange' hacks
+                       from xlockmore.
+                     * Merged `hopalong' hack with a more recent version.
+                     * Added `cde.txt'.
+Changes since 1.27:   * Added `deco', `moire', and `kaleidescope' hacks.
+                     * Merged in support for non-Motif locking and demo mode.
+                     * Made `blitspin' and `bubbles' work in TrueColor.
+                     * Fixed a stupid bug I introduced in `imsmap'.
+                     * Added `poly' and `gravity' options to `qix'.
+Changes since 1.26:   * Added support for SGI SCREEN_SAVER extension.
+                     * Made `fade' and `unfade' work on 8-bit SGIs.
+                     * Made the dialog boxes more Motify.
+                     * Added `bubbles' hack.
+Changes since 1.25:   * Added `lmorph' hack.
+                     * Added viscosity and mouse-control to attraction.
+                     * Fixed possible bad color choices in qix and attraction.
+                     * Added ramp-mode to halo.
+                     * Added a new RNG, which is faster and more portable
+                       than using the RNG in libc.
+                     * Made locking work on SCO.
+                     * Various other minor tweaks that I don't remember.
+Changes since 1.24:   * Made it capture the stdout/stderr of its subprocesses
+                       and present them on the screensaver window itself.
+                     * Made demo mode work correctly with non-default visuals
+                       and color maps, instead of always using the defaults.
+                     * Added -visual argument to all included screenhacks.
+                     * Support for the R6 MIT-SCREEN-SAVER server extension.
+                     * Made the demo mode list scroll properly.
+                     * Added `pedal' hack.
+Changes since 1.23:   * Fixed some private-colormap oddities in slidescreen,
+                       decayscreen, and xroger.  Fixed apparent conservation-
+                       of-mass problem in pyro; made the shrapnel round.
+Changes since 1.22:   * Minor tweaks for IRIX5; fixed locking race condition.
+Changes since 1.21:   * Minor tweaks for X11R6.
+                     * Fixes for non-default visuals.
+Changes since 1.20:   * Fixed bug in color blitspin; added default image.
+                     * Added diagnostics to noseguy.  Fixed off-by-one
+                       error in flame.  Added some missing casts.
+Changes since 1.18:   * Added `flame' hack.
+                     * Fixed a minor Motif dialog text field bug.
+                     * Fixed yet another XPointer-not-defined-in-R4 bug.
+Changes since 1.17:   * Added support for shadow password files.
+                     * Fixed some Motif-related locking bugs.
+                     * Added diagnostics when locking is disabled.
+                     * Made blitspin able to use the XPM library.
+                     * Added `decayscreen' hack.
+Changes since 1.16:   * Added `halo' hack.
+Changes since 1.15:   * Portability fixes.
+Changes since 1.14:   * Broke the driver up into more source files.
+                     * Moved the hacks into their own directory.
+                     * Made all `time' parameters accept the 00:00:00 syntax,
+                       so that even the parameters which are normally read as
+                       minutes can be specified in seconds.
+                     * Added colormap cycling to `imsmap'.
+                     * Made hyper work with K&R compilers.
+Changes since 1.13:   * Added `orbit' option to `attraction' hack.
+                     * Added `lock-timeout' option.
+                     * Cleaned up options of `maze' hack.
+Changes since 1.8:    * Added demo mode, and locking.
+                     * Added `maze' hack.
+                     * Added `norotate' option to `rocks' hack.
diff --git a/README.VMS b/README.VMS
new file mode 100644 (file)
index 0000000..d190344
--- /dev/null
@@ -0,0 +1,57 @@
+OpenVMS port of Xscreensavser version 2.10     October 1997
+==========================================
+
+Xscreensaver distribution can be found in 3 subdirectories:
+
+[.DRIVER]   The Xscreensaver and Xscreensaver-command programs.
+[.HACKS]    Graphic demos ,can be run either through the xscreensaver program 
+            or standalone.
+[.UTILS]    A small libraries of various utilities.
+
+This port has been tested with  VAX VMS 6.1 (compiled with DEC 5 5.0 and
+Motif 1.2) and AXP VMS 6.2 (compiled with DEC C 5.0 and Motif 1.2-4). 
+
+To rebuild, you need to rebuild [.UTILS] directory first and create the
+object library (look at the end of COMPILE*.COM procedure).
+
+You can now build the [.HACKS] directory and the [.DRIVER] directory.
+
+A one-step build is now available via the MAKEVMS.COM script. 
+
+WARNING : before building [.HACKS], you may need to correct some of the
+DECwindows bitmap files. Some files are bogus !! (they have a long line of 
+null chars  at the end). These files are under 
+SYS$COMMON:[DECW$INCLUDE.BITMAPS] directory:
+
+STIPPLE.XBM
+HLINES2.XBM
+LIGHT_GRAY.XBM
+ROOT_WEAVES.XBM
+VLINES2.XBM
+
+These files are all used by Greynetic demo.
+
+Nota: link procedure automagically select appropriate X and Motif Libraries
+(X11R4/Motif 1.1 - X11R5/Motif 1.2). 
+
+The SETUP.COM procedure gives you a definition of all DCL foreign command
+symbols needed to run Xscreensaver and all the graphic hacks. You need to
+modify this procedure if you install these programs in another directory tree.
+
+You can easily add new graphic demos without recompiling Xscreensaver. You just
+need to add them in resource file XSCREENSAVER.DAT. This file (originally
+present in [.DRIVER] directory ) can be installed under your SYS$LOGIN 
+directory for a per-user customization basis. You can also install it under 
+the system-wide user resource directory SYS$COMMON:[DECW$DEFAULT.USER] 
+(with (W:RE) protections). The new graphics hack must be run in root-window 
+mode to be accepted by Xscreensaver.
+
+The graphic demos are spawn into subprocess created by the system() call (in
+the Unix version the execvp() call is used).
+
+The VMS passord checking programs were picked up in the Xlock distribution.
+
+Enjoy,
+
+Patrick MOREAU - CENA/Athis-Mons - FRANCE  (pmoreau@cena.dgac.fr)
+                                           (moreau_p@decus.decus.fr)
diff --git a/README.debugging b/README.debugging
new file mode 100644 (file)
index 0000000..31364db
--- /dev/null
@@ -0,0 +1,164 @@
+
+                              XScreenSaver
+
+              a handy guide for creating useful bug reports
+
+                                --------
+
+    It's hard to imagine, but sometimes, xscreensaver has bugs.  This
+    document gives some hints for isolating them; the more information
+    you can give me about the problem, the better the odds that I'll be
+    able to fix it.  But, if you don't have time to go through these
+    steps, please report the bug anyway -- even vague bug reports can
+    be better than no bug report at all.
+
+                                --------
+STEP ZERO:
+
+    What are you doing here?  Go read README, and then the man page.
+
+STEP ZERO, PART TWO:
+
+    Do you have the most recent version?  Go make sure.
+    http://www.jwz.org/xscreensaver/.
+
+COMPILATION PROBLEMS:
+
+    If you get an error running the `configure' script, the first thing
+    you should try is deleting the `config.cache' file, and running again.
+    If that doesn't fix it, the information I'll need to see to make
+    sense of the problem is the following:
+
+        *  everything printed to stderr/stdout when you first ran
+           ./configure;
+
+        *  the contents of the `config.log' file.
+
+    Make sure you blow away the config.cache file before regenerating
+    this info, or else the `config.log' file will be mostly empty/useless.
+
+    Experience seems to show that the most common configure problem is
+    that sites have gcc installed, but installed improperly.  The
+    configure script will always try to use gcc in preference to another
+    compiler if gcc exists, so if gcc exists but is broken, it won't
+    work.  Your options are:
+
+        *  get someone to fix the gcc installation;
+
+        *  rearrange your $PATH so that the broken gcc is not on it;
+
+        *  or pass $CC in the environment, like so:
+
+              csh:  setenv CC cc ; ./configure
+              sh:   CC=cc ; ./configure
+
+    Before doing this, you'll need to nuke `config.cache'.
+
+    If you get errors about not being able to find Motif or Athena (the
+    Xm/ or Xaw/ header files), and you can't find them on your system,
+    then your system is horked and your vendor is lame.  Perhaps the
+    problem is that you don't have some kind of ``development option''
+    installed.  Xt/ and Xaw/ (Athena) are free and available on all
+    systems; Xm/ (Motif) is available on all commercial systems except
+    SunOS 4.x and some early releases of Solaris.  For Linux and other
+    free Unixes systems, a Motif clone is available from
+    http://www.lesstif.org/.
+
+RUN-TIME PROBLEMS:
+
+    For runtime errors, it's important to keep in mind that there are
+    two parts to xscreensaver: there is the screensaver driver process
+    (the daemon that detects idleness, deals with locking, and launches
+    the demos); and there are the demos themselves (independent programs
+    that draw pretty pictures.)
+
+        *  Compile with `make CFLAGS=-g' (so that if you get a core
+          dump, there will be debugging info in it.)
+
+        *  What platform are you running on?  What does the included
+           `./config.guess' shell script print?
+
+        *  Is the problem in the driver (`xscreensaver'), the GUI
+           (`xscreensaver-demo'), or in the graphics hacks?
+
+        *  If the problem is in the GUI, was the it built using
+           Motif, Lesstif, or Athena?  Which version?
+
+        *  If the problem is in one (or more) of the hacks, which ones?
+           If you're not sure, try running `xscreensaver-demo' to go
+           through the list of them and see which work and which don't.
+
+        *  Does the problem occur when running that hack by hand, in
+           its own window (i.e., when started with no command-line args)?
+
+        *  Does the problem occur when running that hack by hand, on
+           the root window (i.e., when started with the `-root' option)?
+
+        *  IMPORTANT: What visual are you using?  Send the output of
+           the `xdpyinfo' command.
+
+        *  Does the problem go away if you give the program a different
+           `-visual' argument?  (For example, `-visual pseudocolor' or
+           `-visual truecolor'.)
+
+        *  IMPORTANT: What exactly goes wrong?  No, I don't know what
+           you mean by "crash".  Does it print an "X Error" and exit?
+           Does it dump core?  Does it go into a loop?
+
+        *  If it dumps core, what does the core file say?  Run the
+           program under a debugger, and show me the stack trace.
+           To extract a stack trace from a core file with gdb, do this:
+
+              gdb ./the-program ./core
+              bt
+
+           To extract a stack trace from a core file with dbx, do this:
+
+              dbx ./the-program ./core
+              where
+
+           If the bottom few lines of the output don't include the functions
+          `main_loop()' and `main()', then something's wrong: are you sure
+           the core file came from that program?
+
+        *  If it gets an X error, where did it come from?  Run
+           xscreensaver with the `-sync' command-line option.  When `-sync'
+           is used, X errors will cause xscreensaver to dump a core file.
+           Look at the core file with a debugger and show me the stack trace,
+           as above: I need to know where in xscreensaver that X error came
+           from.
+
+    If the problem is with the xscreensaver process itself, or if you
+    can't figure out which demo is causing the problem, or if you can't
+    reproduce the problem in isolation, then you will need to turn on
+    and examine the debugging output of the driver process.
+
+        *  Start `xscreensaver' with the command-line arguments
+
+              -verbose -no-capture
+
+           This will cause it to write a lot of debugging info to the stderr
+           of the xscreensaver process (the `-verbose' option turns on the
+           diagnostics; the `-no-capture' option prevents the data from being
+           displayed on the screensaver window as well.)
+
+           You also might want to use the `-timestamp' option, which will
+           cause the xscreensaver messages to include the time at which
+           they were printed.
+
+        *  If the problem is intermittent, you might want to capture the
+           log information to a file and examine it later.  For example,
+           you could start it from your login script like this (csh syntax):
+
+              ( cd ~/src/xscreensaver/ ; \
+                xscreensaver -sync -verbose -timestamp -no-capture \
+                >>&LOG & )
+
+        *  Hackers only: If you're feeling adventurous enough to run gdb
+           on the xscreensaver driver process itself, make sure you've
+           read the commentary at the top of xscreensaver.c.
+
+-----------------------------------------------------------------------------
+                                             http://www.jwz.org/xscreensaver/
+                                                 Jamie Zawinski <jwz@jwz.org>
+-----------------------------------------------------------------------------
diff --git a/config.guess b/config.guess
new file mode 100755 (executable)
index 0000000..e9e4455
--- /dev/null
@@ -0,0 +1,693 @@
+#! /bin/sh
+# Attempt to guess a canonical system name.
+#   Copyright (C) 1992, 93, 94, 95, 1996 Free Software Foundation, Inc.
+#
+# This file is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+#
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# Written by Per Bothner <bothner@cygnus.com>.
+# The master version of this file is at the FSF in /home/gd/gnu/lib.
+#
+# This script attempts to guess a canonical system name similar to
+# config.sub.  If it succeeds, it prints the system name on stdout, and
+# exits with 0.  Otherwise, it exits with 1.
+#
+# The plan is that this can be called by configure scripts if you
+# don't specify an explicit system type (host/target name).
+#
+# Only a few systems have been added to this list; please add others
+# (but try to keep the structure clean).
+#
+
+# This is needed to find uname on a Pyramid OSx when run in the BSD universe.
+# (ghazi@noc.rutgers.edu 8/24/94.)
+if (test -f /.attbin/uname) >/dev/null 2>&1 ; then
+       PATH=$PATH:/.attbin ; export PATH
+fi
+
+UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown
+UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown
+UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown
+UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown
+
+trap 'rm -f dummy.c dummy.o dummy; exit 1' 1 2 15
+
+# Note: order is significant - the case branches are not exclusive.
+
+case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
+    alpha:OSF1:*:*)
+       # A Vn.n version is a released version.
+       # A Tn.n version is a released field test version.
+       # A Xn.n version is an unreleased experimental baselevel.
+       # 1.2 uses "1.2" for uname -r.
+       echo alpha-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[VTX]//'`
+       exit 0 ;;
+    21064:Windows_NT:50:3)
+       echo alpha-dec-winnt3.5
+       exit 0 ;;
+    Amiga*:UNIX_System_V:4.0:*)
+       echo m68k-cbm-sysv4
+       exit 0;;
+    amiga:NetBSD:*:*)
+      echo m68k-cbm-netbsd${UNAME_RELEASE}
+      exit 0 ;;
+    amiga:OpenBSD:*:*)
+      echo m68k-cbm-openbsd${UNAME_RELEASE}
+      exit 0 ;;
+    arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)
+       echo arm-acorn-riscix${UNAME_RELEASE}
+       exit 0;;
+    Pyramid*:OSx*:*:*|MIS*:OSx*:*:*)
+       # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.
+       if test "`(/bin/universe) 2>/dev/null`" = att ; then
+               echo pyramid-pyramid-sysv3
+       else
+               echo pyramid-pyramid-bsd
+       fi
+       exit 0 ;;
+    NILE:*:*:dcosx)
+       echo pyramid-pyramid-svr4
+       exit 0 ;;
+    sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)
+       echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+       exit 0 ;;
+    i86pc:SunOS:5.*:*)
+       echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+       exit 0 ;;
+    sun4*:SunOS:6*:*)
+       # According to config.sub, this is the proper way to canonicalize
+       # SunOS6.  Hard to guess exactly what SunOS6 will be like, but
+       # it's likely to be more like Solaris than SunOS4.
+       echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+       exit 0 ;;
+    sun4*:SunOS:*:*)
+       case "`/usr/bin/arch -k`" in
+           Series*|S4*)
+               UNAME_RELEASE=`uname -v`
+               ;;
+       esac
+       # Japanese Language versions have a version number like `4.1.3-JL'.
+       echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'`
+       exit 0 ;;
+    sun3*:SunOS:*:*)
+       echo m68k-sun-sunos${UNAME_RELEASE}
+       exit 0 ;;
+    aushp:SunOS:*:*)
+       echo sparc-auspex-sunos${UNAME_RELEASE}
+       exit 0 ;;
+    atari*:NetBSD:*:*)
+       echo m68k-atari-netbsd${UNAME_RELEASE}
+       exit 0 ;;
+    atari*:OpenBSD:*:*)
+       echo m68k-atari-openbsd${UNAME_RELEASE}
+       exit 0 ;;
+    sun3*:NetBSD:*:*)
+       echo m68k-sun-netbsd${UNAME_RELEASE}
+       exit 0 ;;
+    sun3*:OpenBSD:*:*)
+       echo m68k-sun-openbsd${UNAME_RELEASE}
+       exit 0 ;;
+    mac68k:NetBSD:*:*)
+       echo m68k-apple-netbsd${UNAME_RELEASE}
+       exit 0 ;;
+    mac68k:OpenBSD:*:*)
+       echo m68k-apple-openbsd${UNAME_RELEASE}
+       exit 0 ;;
+    powerpc:machten:*:*)
+       echo powerpc-apple-machten${UNAME_RELEASE}
+       exit 0 ;;
+    RISC*:Mach:*:*)
+       echo mips-dec-mach_bsd4.3
+       exit 0 ;;
+    RISC*:ULTRIX:*:*)
+       echo mips-dec-ultrix${UNAME_RELEASE}
+       exit 0 ;;
+    VAX*:ULTRIX*:*:*)
+       echo vax-dec-ultrix${UNAME_RELEASE}
+       exit 0 ;;
+    mips:*:*:UMIPS | mips:*:*:RISCos)
+       sed 's/^        //' << EOF >dummy.c
+       int main (argc, argv) int argc; char **argv; {
+       #if defined (host_mips) && defined (MIPSEB)
+       #if defined (SYSTYPE_SYSV)
+         printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0);
+       #endif
+       #if defined (SYSTYPE_SVR4)
+         printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0);
+       #endif
+       #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD)
+         printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0);
+       #endif
+       #endif
+         exit (-1);
+       }
+EOF
+       ${CC-cc} dummy.c -o dummy \
+         && ./dummy `echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` \
+         && rm dummy.c dummy && exit 0
+       rm -f dummy.c dummy
+       echo mips-mips-riscos${UNAME_RELEASE}
+       exit 0 ;;
+    Night_Hawk:Power_UNIX:*:*)
+       echo powerpc-harris-powerunix
+       exit 0 ;;
+    m88k:CX/UX:7*:*)
+       echo m88k-harris-cxux7
+       exit 0 ;;
+    m88k:*:4*:R4*)
+       echo m88k-motorola-sysv4
+       exit 0 ;;
+    m88k:*:3*:R3*)
+       echo m88k-motorola-sysv3
+       exit 0 ;;
+    AViiON:dgux:*:*)
+        # DG/UX returns AViiON for all architectures
+        UNAME_PROCESSOR=`/usr/bin/uname -p`
+        if [ $UNAME_PROCESSOR = mc88100 -o $UNAME_PROCESSOR = mc88110 ] ; then
+       if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx \
+            -o ${TARGET_BINARY_INTERFACE}x = x ] ; then
+               echo m88k-dg-dgux${UNAME_RELEASE}
+       else
+               echo m88k-dg-dguxbcs${UNAME_RELEASE}
+       fi
+        else echo i586-dg-dgux${UNAME_RELEASE}
+        fi
+       exit 0 ;;
+    M88*:DolphinOS:*:*)        # DolphinOS (SVR3)
+       echo m88k-dolphin-sysv3
+       exit 0 ;;
+    M88*:*:R3*:*)
+       # Delta 88k system running SVR3
+       echo m88k-motorola-sysv3
+       exit 0 ;;
+    XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)
+       echo m88k-tektronix-sysv3
+       exit 0 ;;
+    Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)
+       echo m68k-tektronix-bsd
+       exit 0 ;;
+    *:IRIX*:*:*)
+       echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'`
+       exit 0 ;;
+    ????????:AIX?:[12].1:2)   # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.
+       echo romp-ibm-aix      # uname -m gives an 8 hex-code CPU id
+       exit 0 ;;              # Note that: echo "'`uname -s`'" gives 'AIX '
+    i?86:AIX:*:*)
+       echo i386-ibm-aix
+       exit 0 ;;
+    *:AIX:2:3)
+       if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then
+               sed 's/^                //' << EOF >dummy.c
+               #include <sys/systemcfg.h>
+
+               main()
+                       {
+                       if (!__power_pc())
+                               exit(1);
+                       puts("powerpc-ibm-aix3.2.5");
+                       exit(0);
+                       }
+EOF
+               ${CC-cc} dummy.c -o dummy && ./dummy && rm dummy.c dummy && exit 0
+               rm -f dummy.c dummy
+               echo rs6000-ibm-aix3.2.5
+       elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then
+               echo rs6000-ibm-aix3.2.4
+       else
+               echo rs6000-ibm-aix3.2
+       fi
+       exit 0 ;;
+    *:AIX:*:4)
+       if /usr/sbin/lsattr -EHl proc0 | grep POWER >/dev/null 2>&1; then
+               IBM_ARCH=rs6000
+       else
+               IBM_ARCH=powerpc
+       fi
+       if [ -x /usr/bin/oslevel ] ; then
+               IBM_REV=`/usr/bin/oslevel`
+       else
+               IBM_REV=4.${UNAME_RELEASE}
+       fi
+       echo ${IBM_ARCH}-ibm-aix${IBM_REV}
+       exit 0 ;;
+    *:AIX:*:*)
+       echo rs6000-ibm-aix
+       exit 0 ;;
+    ibmrt:4.4BSD:*|romp-ibm:BSD:*)
+       echo romp-ibm-bsd4.4
+       exit 0 ;;
+    ibmrt:*BSD:*|romp-ibm:BSD:*)            # covers RT/PC NetBSD and
+       echo romp-ibm-bsd${UNAME_RELEASE}   # 4.3 with uname added to
+       exit 0 ;;                           # report: romp-ibm BSD 4.3
+    *:BOSX:*:*)
+       echo rs6000-bull-bosx
+       exit 0 ;;
+    DPX/2?00:B.O.S.:*:*)
+       echo m68k-bull-sysv3
+       exit 0 ;;
+    9000/[34]??:4.3bsd:1.*:*)
+       echo m68k-hp-bsd
+       exit 0 ;;
+    hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)
+       echo m68k-hp-bsd4.4
+       exit 0 ;;
+    9000/[3478]??:HP-UX:*:*)
+       case "${UNAME_MACHINE}" in
+           9000/31? )            HP_ARCH=m68000 ;;
+           9000/[34]?? )         HP_ARCH=m68k ;;
+           9000/7?? | 9000/8?[1679] ) HP_ARCH=hppa1.1 ;;
+           9000/8?? )            HP_ARCH=hppa1.0 ;;
+       esac
+       HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`
+       echo ${HP_ARCH}-hp-hpux${HPUX_REV}
+       exit 0 ;;
+    3050*:HI-UX:*:*)
+       sed 's/^        //' << EOF >dummy.c
+       #include <unistd.h>
+       int
+       main ()
+       {
+         long cpu = sysconf (_SC_CPU_VERSION);
+         /* The order matters, because CPU_IS_HP_MC68K erroneously returns
+            true for CPU_PA_RISC1_0.  CPU_IS_PA_RISC returns correct
+            results, however.  */
+         if (CPU_IS_PA_RISC (cpu))
+           {
+             switch (cpu)
+               {
+                 case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break;
+                 case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break;
+                 case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break;
+                 default: puts ("hppa-hitachi-hiuxwe2"); break;
+               }
+           }
+         else if (CPU_IS_HP_MC68K (cpu))
+           puts ("m68k-hitachi-hiuxwe2");
+         else puts ("unknown-hitachi-hiuxwe2");
+         exit (0);
+       }
+EOF
+       ${CC-cc} dummy.c -o dummy && ./dummy && rm dummy.c dummy && exit 0
+       rm -f dummy.c dummy
+       echo unknown-hitachi-hiuxwe2
+       exit 0 ;;
+    9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* )
+       echo hppa1.1-hp-bsd
+       exit 0 ;;
+    9000/8??:4.3bsd:*:*)
+       echo hppa1.0-hp-bsd
+       exit 0 ;;
+    hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* )
+       echo hppa1.1-hp-osf
+       exit 0 ;;
+    hp8??:OSF1:*:*)
+       echo hppa1.0-hp-osf
+       exit 0 ;;
+    i?86:OSF1:*:*)
+       if [ -x /usr/sbin/sysversion ] ; then
+           echo ${UNAME_MACHINE}-unknown-osf1mk
+       else
+           echo ${UNAME_MACHINE}-unknown-osf1
+       fi
+       exit 0 ;;
+    parisc*:Lites*:*:*)
+       echo hppa1.1-hp-lites
+       exit 0 ;;
+    C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)
+       echo c1-convex-bsd
+        exit 0 ;;
+    C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)
+       if getsysinfo -f scalar_acc
+       then echo c32-convex-bsd
+       else echo c2-convex-bsd
+       fi
+        exit 0 ;;
+    C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)
+       echo c34-convex-bsd
+        exit 0 ;;
+    C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)
+       echo c38-convex-bsd
+        exit 0 ;;
+    C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)
+       echo c4-convex-bsd
+        exit 0 ;;
+    CRAY*X-MP:*:*:*)
+       echo xmp-cray-unicos
+        exit 0 ;;
+    CRAY*Y-MP:*:*:*)
+       echo ymp-cray-unicos${UNAME_RELEASE}
+       exit 0 ;;
+    CRAY*[A-Z]90:*:*:*)
+       echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \
+       | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \
+             -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/
+       exit 0 ;;
+    CRAY*TS:*:*:*)
+       echo t90-cray-unicos${UNAME_RELEASE}
+       exit 0 ;;
+    CRAY-2:*:*:*)
+       echo cray2-cray-unicos
+        exit 0 ;;
+    F300:UNIX_System_V:*:*)
+        FUJITSU_SYS=`uname -p | tr [A-Z] [a-z] | sed -e 's/\///'`
+        FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`
+        echo "f300-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}"
+        exit 0 ;;
+    F301:UNIX_System_V:*:*)
+       echo f301-fujitsu-uxpv`echo $UNAME_RELEASE | sed 's/ .*//'`
+       exit 0 ;;
+    hp3[0-9][05]:NetBSD:*:*)
+       echo m68k-hp-netbsd${UNAME_RELEASE}
+       exit 0 ;;
+    hp3[0-9][05]:OpenBSD:*:*)
+       echo m68k-hp-openbsd${UNAME_RELEASE}
+       exit 0 ;;
+    i?86:BSD/386:*:* | *:BSD/OS:*:*)
+       echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}
+       exit 0 ;;
+    *:FreeBSD:*:*)
+       echo ${UNAME_MACHINE}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`
+       exit 0 ;;
+    *:NetBSD:*:*)
+       echo ${UNAME_MACHINE}-unknown-netbsd`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
+       exit 0 ;;
+    *:OpenBSD:*:*)
+       echo ${UNAME_MACHINE}-unknown-openbsd`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
+       exit 0 ;;
+    i*:CYGWIN*:*)
+       echo i386-pc-cygwin32
+       exit 0 ;;
+    p*:CYGWIN*:*)
+       echo powerpcle-unknown-cygwin32
+       exit 0 ;;
+    prep*:SunOS:5.*:*)
+       echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`
+       exit 0 ;;
+    *:GNU:*:*)
+       echo `echo ${UNAME_MACHINE}|sed -e 's,/.*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`
+       exit 0 ;;
+    *:Linux:*:*)
+       # The BFD linker knows what the default object file format is, so
+       # first see if it will tell us.
+       ld_help_string=`ld --help 2>&1`
+       if echo "$ld_help_string" | grep >/dev/null 2>&1 "supported emulations: elf_i.86"; then
+         echo "${UNAME_MACHINE}-pc-linux-gnu" ; exit 0
+       elif echo "$ld_help_string" | grep >/dev/null 2>&1 "supported emulations: i.86linux"; then
+         echo "${UNAME_MACHINE}-pc-linux-gnuaout" ; exit 0
+       elif echo "$ld_help_string" | grep >/dev/null 2>&1 "supported emulations: i.86coff"; then
+         echo "${UNAME_MACHINE}-pc-linux-gnucoff" ; exit 0
+       elif echo "$ld_help_string" | grep >/dev/null 2>&1 "supported emulations: m68kelf"; then
+         echo "${UNAME_MACHINE}-unknown-linux-gnu" ; exit 0
+       elif echo "$ld_help_string" | grep >/dev/null 2>&1 "supported emulations: m68klinux"; then
+         echo "${UNAME_MACHINE}-unknown-linux-gnuaout" ; exit 0
+       elif echo "$ld_help_string" | grep >/dev/null 2>&1 "supported emulations: elf32ppc"; then
+         echo "powerpc-unknown-linux-gnu" ; exit 0
+       elif test "${UNAME_MACHINE}" = "alpha" ; then
+         echo alpha-unknown-linux-gnu ; exit 0
+       elif test "${UNAME_MACHINE}" = "sparc" ; then
+         echo sparc-unknown-linux-gnu ; exit 0
+       else
+         # Either a pre-BFD a.out linker (linux-gnuoldld) or one that does not give us
+         # useful --help.  Gcc wants to distinguish between linux-gnuoldld and linux-gnuaout.
+         test ! -d /usr/lib/ldscripts/. \
+           && echo "${UNAME_MACHINE}-pc-linux-gnuoldld" && exit 0
+         # Determine whether the default compiler is a.out or elf
+         cat >dummy.c <<EOF
+main(argc, argv)
+int argc;
+char *argv[];
+{
+#ifdef __ELF__
+  printf ("%s-pc-linux-gnu\n", argv[1]);
+#else
+  printf ("%s-pc-linux-gnuaout\n", argv[1]);
+#endif
+  return 0;
+}
+EOF
+         ${CC-cc} dummy.c -o dummy 2>/dev/null && ./dummy "${UNAME_MACHINE}" && rm dummy.c dummy && exit 0
+         rm -f dummy.c dummy
+       fi ;;
+# ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.  earlier versions
+# are messed up and put the nodename in both sysname and nodename.
+    i?86:DYNIX/ptx:4*:*)
+       echo i386-sequent-sysv4
+       exit 0 ;;
+    i?86:*:4.*:* | i?86:SYSTEM_V:4.*:*)
+       if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then
+               echo ${UNAME_MACHINE}-univel-sysv${UNAME_RELEASE}
+       else
+               echo ${UNAME_MACHINE}-pc-sysv${UNAME_RELEASE}
+       fi
+       exit 0 ;;
+    i?86:*:3.2:*)
+       if test -f /usr/options/cb.name; then
+               UNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`
+               echo ${UNAME_MACHINE}-pc-isc$UNAME_REL
+       elif /bin/uname -X 2>/dev/null >/dev/null ; then
+               UNAME_REL=`(/bin/uname -X|egrep Release|sed -e 's/.*= //')`
+               (/bin/uname -X|egrep i80486 >/dev/null) && UNAME_MACHINE=i486
+               (/bin/uname -X|egrep '^Machine.*Pentium' >/dev/null) \
+                       && UNAME_MACHINE=i586
+               echo ${UNAME_MACHINE}-pc-sco$UNAME_REL
+       else
+               echo ${UNAME_MACHINE}-pc-sysv32
+       fi
+       exit 0 ;;
+    Intel:Mach:3*:*)
+       echo i386-pc-mach3
+       exit 0 ;;
+    paragon:*:*:*)
+       echo i860-intel-osf1
+       exit 0 ;;
+    i860:*:4.*:*) # i860-SVR4
+       if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then
+         echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4
+       else # Add other i860-SVR4 vendors below as they are discovered.
+         echo i860-unknown-sysv${UNAME_RELEASE}  # Unknown i860-SVR4
+       fi
+       exit 0 ;;
+    mini*:CTIX:SYS*5:*)
+       # "miniframe"
+       echo m68010-convergent-sysv
+       exit 0 ;;
+    M68*:*:R3V[567]*:*)
+       test -r /sysV68 && echo 'm68k-motorola-sysv' && exit 0 ;;
+    3[34]??:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 4850:*:4.0:3.0)
+       OS_REL=''
+       test -r /etc/.relid \
+       && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid`
+       /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+         && echo i486-ncr-sysv4.3${OS_REL} && exit 0
+       /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \
+         && echo i586-ncr-sysv4.3${OS_REL} && exit 0 ;;
+    3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)
+        /bin/uname -p 2>/dev/null | grep 86 >/dev/null \
+          && echo i486-ncr-sysv4 && exit 0 ;;
+    m68*:LynxOS:2.*:*)
+       echo m68k-unknown-lynxos${UNAME_RELEASE}
+       exit 0 ;;
+    mc68030:UNIX_System_V:4.*:*)
+       echo m68k-atari-sysv4
+       exit 0 ;;
+    i?86:LynxOS:2.*:*)
+       echo i386-unknown-lynxos${UNAME_RELEASE}
+       exit 0 ;;
+    TSUNAMI:LynxOS:2.*:*)
+       echo sparc-unknown-lynxos${UNAME_RELEASE}
+       exit 0 ;;
+    rs6000:LynxOS:2.*:* | PowerPC:LynxOS:2.*:*)
+       echo rs6000-unknown-lynxos${UNAME_RELEASE}
+       exit 0 ;;
+    SM[BE]S:UNIX_SV:*:*)
+       echo mips-dde-sysv${UNAME_RELEASE}
+       exit 0 ;;
+    RM*:SINIX-*:*:*)
+       echo mips-sni-sysv4
+       exit 0 ;;
+    *:SINIX-*:*:*)
+       if uname -p 2>/dev/null >/dev/null ; then
+               UNAME_MACHINE=`(uname -p) 2>/dev/null`
+               echo ${UNAME_MACHINE}-sni-sysv4
+       else
+               echo ns32k-sni-sysv
+       fi
+       exit 0 ;;
+    *:UNIX_System_V:4*:FTX*)
+       # From Gerald Hewes <hewes@openmarket.com>.
+       # How about differentiating between stratus architectures? -djm
+       echo hppa1.1-stratus-sysv4
+       exit 0 ;;
+    *:*:*:FTX*)
+       # From seanf@swdc.stratus.com.
+       echo i860-stratus-sysv4
+       exit 0 ;;
+    mc68*:A/UX:*:*)
+       echo m68k-apple-aux${UNAME_RELEASE}
+       exit 0 ;;
+    R3000:*System_V*:*:* | R4000:UNIX_SYSV:*:*)
+       if [ -d /usr/nec ]; then
+               echo mips-nec-sysv${UNAME_RELEASE}
+       else
+               echo mips-unknown-sysv${UNAME_RELEASE}
+       fi
+        exit 0 ;;
+    PENTIUM:CPunix:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort
+                           # says <Richard.M.Bartel@ccMail.Census.GOV>
+        echo i586-unisys-sysv4
+        exit 0 ;;
+esac
+
+#echo '(No uname command or uname output not recognized.)' 1>&2
+#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2
+
+cat >dummy.c <<EOF
+#ifdef _SEQUENT_
+# include <sys/types.h>
+# include <sys/utsname.h>
+#endif
+main ()
+{
+#if defined (sony)
+#if defined (MIPSEB)
+  /* BFD wants "bsd" instead of "newsos".  Perhaps BFD should be changed,
+     I don't know....  */
+  printf ("mips-sony-bsd\n"); exit (0);
+#else
+#include <sys/param.h>
+  printf ("m68k-sony-newsos%s\n",
+#ifdef NEWSOS4
+          "4"
+#else
+         ""
+#endif
+         ); exit (0);
+#endif
+#endif
+
+#if defined (__arm) && defined (__acorn) && defined (__unix)
+  printf ("arm-acorn-riscix"); exit (0);
+#endif
+
+#if defined (hp300) && !defined (hpux)
+  printf ("m68k-hp-bsd\n"); exit (0);
+#endif
+
+#if defined (NeXT)
+#if !defined (__ARCHITECTURE__)
+#define __ARCHITECTURE__ "m68k"
+#endif
+  int version;
+  version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`;
+  printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version);
+  exit (0);
+#endif
+
+#if defined (MULTIMAX) || defined (n16)
+#if defined (UMAXV)
+  printf ("ns32k-encore-sysv\n"); exit (0);
+#else
+#if defined (CMU)
+  printf ("ns32k-encore-mach\n"); exit (0);
+#else
+  printf ("ns32k-encore-bsd\n"); exit (0);
+#endif
+#endif
+#endif
+
+#if defined (__386BSD__)
+  printf ("i386-pc-bsd\n"); exit (0);
+#endif
+
+#if defined (sequent)
+#if defined (i386)
+  printf ("i386-sequent-dynix\n"); exit (0);
+#endif
+#if defined (ns32000)
+  printf ("ns32k-sequent-dynix\n"); exit (0);
+#endif
+#endif
+
+#if defined (_SEQUENT_)
+    struct utsname un;
+
+    uname(&un);
+
+    if (strncmp(un.version, "V2", 2) == 0) {
+       printf ("i386-sequent-ptx2\n"); exit (0);
+    }
+    if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */
+       printf ("i386-sequent-ptx1\n"); exit (0);
+    }
+    printf ("i386-sequent-ptx\n"); exit (0);
+
+#endif
+
+#if defined (vax)
+#if !defined (ultrix)
+  printf ("vax-dec-bsd\n"); exit (0);
+#else
+  printf ("vax-dec-ultrix\n"); exit (0);
+#endif
+#endif
+
+#if defined (alliant) && defined (i860)
+  printf ("i860-alliant-bsd\n"); exit (0);
+#endif
+
+  exit (1);
+}
+EOF
+
+${CC-cc} dummy.c -o dummy 2>/dev/null && ./dummy && rm dummy.c dummy && exit 0
+rm -f dummy.c dummy
+
+# Apollos put the system type in the environment.
+
+test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit 0; }
+
+# Convex versions that predate uname can use getsysinfo(1)
+
+if [ -x /usr/convex/getsysinfo ]
+then
+    case `getsysinfo -f cpu_type` in
+    c1*)
+       echo c1-convex-bsd
+       exit 0 ;;
+    c2*)
+       if getsysinfo -f scalar_acc
+       then echo c32-convex-bsd
+       else echo c2-convex-bsd
+       fi
+       exit 0 ;;
+    c34*)
+       echo c34-convex-bsd
+       exit 0 ;;
+    c38*)
+       echo c38-convex-bsd
+       exit 0 ;;
+    c4*)
+       echo c4-convex-bsd
+       exit 0 ;;
+    esac
+fi
+
+#echo '(Unable to guess system type)' 1>&2
+
+exit 1
diff --git a/config.h-vms b/config.h-vms
new file mode 100644 (file)
index 0000000..5dd8158
--- /dev/null
@@ -0,0 +1,298 @@
+/* This is a config.h file that has been pregenerated (from config.h.in)
+ * with settings that are correct for VMS.
+ */
+
+
+
+/* config.h.in --- xscreensaver, Copyright (c) 1998 Jamie Zawinski.
+ *
+ *  The best way to set these parameters is by running the included `configure'
+ *  script.  That examines your system, and generates `config.h' from 
+ *  `config.h.in'.
+ *
+ *  If something goes very wrong, you can edit `config.h' directly, but beware
+ *  that your changes will be lost if you ever run `configure' again.
+ */
+
+
+/* *************************************************************************
+                          CONFIGURING SERVER EXTENSIONS
+   ************************************************************************* */
+
+/* Define this if you have the XReadDisplay extension (I think this is an
+   SGI-only thing; it's in <X11/extensions/readdisplay.h>.)  A few of the
+   screenhacks will take advantage of this if it's available.
+ */
+#undef HAVE_READ_DISPLAY_EXTENSION
+
+/* Define this if you have the Iris Video Library (dmedia/vl.h on SGI.)
+   A few of the screenhacks will take advantage of this if it's available.
+ */
+#undef HAVE_SGI_VIDEO
+
+/* Define this if you have the XHPDisableReset function (an HP only thing.)
+ */
+#undef HAVE_XHPDISABLERESET
+
+/*  First, some background: there are three distinct server extensions which
+ *  are useful to a screen saver program: they are XIDLE, MIT-SCREEN-SAVER, 
+ *  and SCREEN_SAVER.
+ *
+ *  The XIDLE extension resides in .../contrib/extensions/xidle/ on the X11R5
+ *  contrib tape.  This extension lets the client get accurate idle-time 
+ *  information from the X server in a potentially more reliable way than by
+ *  simply watching for keyboard and mouse activity.  However, the XIDLE 
+ *  extension has apparently not been ported to X11R6.
+ *
+ *  The SCREEN_SAVER extension is found (as far as I know) only in the SGI
+ *  X server, and it exists in all releases since (at least) Irix 5.  The
+ *  relevant header file is /usr/include/X11/extensions/XScreenSaver.h.
+ *
+ *  The similarly-named MIT-SCREEN-SAVER extension came into existence long
+ *  after the SGI SCREEN_SAVER extension was already in use, and resides in
+ *  .../contrib/extensions/screensaver/ on the X11R6 contrib tape.  It is
+ *  also found in certain recent X servers built in to NCD X terminals.
+ *
+ *     The MIT extension does basically the same thing that the XIDLE extension
+ *     does, but there are two things wrong with it: first, because of the way
+ *     the extension was designed, the `fade' option to XScreenSaver will be
+ *     uglier: just before the screen fades out, there will be an unattractive
+ *     flicker to black, because this extension blanks the screen *before*
+ *     telling us that it is time to do so.  Second, this extension is known to
+ *     be buggy; on the systems I use, it works, but some people have reported
+ *     X server crashes as a result of using it.  XScreenSaver uses this
+ *     extension rather conservatively, because when I tried to use any of its
+ *     more complicated features, I could get it to crash the server at the
+ *     drop of a hat.
+ *
+ *     In short, the MIT-SCREEN-SAVER extension is a piece of junk.  The older
+ *     SGI SCREEN_SAVER extension works great, as does XIDLE.  It would be nice
+ *     If those two existed on more systems, that is, would be adopted by the
+ *     X Consortium in favor of their inferior "not-invented-here" entry.
+ */
+
+/*  Define this if you have the XIDLE extension installed. If you have the
+ *  XIDLE extension, this is recommended.  (You have this extension if the
+ *  file /usr/include/X11/extensions/xidle.h exists.)  Turning on this flag
+ *  lets XScreenSaver work better with servers which support this extension; 
+ *  but it will still work with servers which do not suport it, so it's a good
+ *  idea to compile in support for it if you can.
+ */
+#undef HAVE_XIDLE_EXTENSION
+
+/*  Define this if you have the MIT-SCREEN-SAVER extension installed.  See the
+ *  caveats about this extension, above.  (It's available if the file
+ *  /usr/include/X11/extensions/scrnsaver.h exists.)
+ */
+#undef HAVE_MIT_SAVER_EXTENSION
+
+/*  Define this if you have the SGI SCREEN_SAVER extension.  This is standard
+ *  on Irix systems, and not available elsewhere.
+ */
+#undef HAVE_SGI_SAVER_EXTENSION
+
+/*  Define this if you have the SGI-VIDEO-CONTROL extension.  This is standard
+ *  on Irix systems, and not available elsewhere.
+ */
+#undef HAVE_SGI_VC_EXTENSION
+
+/*  Define this if you have the XDPMS extension.  This is standard on
+ *  sufficiently-recent XFree86 systems, and possibly elsewhere.  (It's
+ *  available if the file /usr/include/X11/extensions/dpms.h exists.)
+ */
+#define HAVE_DPMS_EXTENSION 1
+
+
+/* *************************************************************************
+                          CONFIGURING GRAPHICS TOOLKITS
+   ************************************************************************* */
+
+/*  Define this if you have Motif.
+ */
+#define HAVE_MOTIF 1
+
+/*  Define this if you don't have Motif, but you have Athena (-Xaw).
+ */
+#undef HAVE_ATHENA
+
+/*  Define this if you have Athena, and the version you have includes the
+ *  XawViewportSetCoordinates function in Viewport.h (some old versions of
+ *  the library didn't have this function.)
+ */
+#undef HAVE_XawViewportSetCoordinates
+
+/*  Define this if you have the XPM library installed.  Some of the demos can
+ *  make use of this if it is available.
+ */
+#define HAVE_XPM 1
+
+/*  Define this if you have the Xmu library.  This is standard part of X, and
+ *  if your vendor doesn't ship it, you should report that as a bug.
+ */
+#define HAVE_XMU 1
+
+/*  Define this if you have OpenGL.  Some of the demos require it, so if you
+ *  don't have it, then those particular demos won't be built.  (This won't
+ *  affect the screen saver as a whole.)
+ */
+#undef HAVE_GL
+
+/*  Define this if you have OpenGL, but it's the MesaGL variant.  (The 
+    libraries have different names.)  (HAVE_GL should be defined too.)
+ */
+#undef HAVE_MESA_GL
+
+/*  Define this if your version of OpenGL has the glBindTexture() routine.
+    This is the case for OpenGL 1.1, but not for OpenGL 1.0.
+ */
+#undef HAVE_GLBINDTEXTURE
+
+/*  Define this if you have the X Shared Memory Extension.
+ */
+#undef HAVE_XSHM_EXTENSION
+
+/*  Some screenhacks like to run an external program to generate random pieces
+    of text; set this to the one you like ("yow" and "fortune" are the most
+    likely prospects.)  Note that this is just the default; X resources can
+    be used to override it.
+ */
+#define ZIPPY_PROGRAM "fortune"
+
+
+
+/* *************************************************************************
+                       CONFIGURING PASSWORD AUTHENTICATION
+   ************************************************************************* */
+
+/* Define this to remove the option of locking the screen at all.
+ */
+#undef NO_LOCKING
+
+/*  Define this if you want to use Kerberos authentication to lock/unlock the
+ *  screen instead of your local password.  This currently uses Kerberos V4, 
+ *  but a V5 server with V4 compatibility will work.  WARNING: DO NOT USE AFS
+ *  string-to-key passwords with this option. This option currently *only* 
+ *  works with standard Kerberos des_string_to_key.  If your password is an
+ *  AFS password and not a kerberos password, it will not authenticate 
+ *  properly. See the comments in driver/kpasswd.c for more information if you
+ *  need it. 
+ */
+#undef HAVE_KERBEROS
+
+
+/*  Define this if your system uses `shadow' passwords, that is, the passwords
+ *  live in /etc/shadow instead of /etc/passwd, and one reads them with
+ *  getspnam() instead of getpwnam().  (Note that SCO systems do some random
+ *  other thing; others might as well.  See the ifdefs in driver/passwd.c if
+ *  you're having trouble related to reading passwords.)
+ */
+#undef HAVE_SHADOW_PASSWD
+
+/*  Define this if your system is Digital or SCO Unix with so-called ``Enhanced
+    Security'', that is, the passwords live in /tcb/files/auth/<x>/<xyz> 
+    instead of in /etc/passwd, and one reads them with getprpwnam() instead 
+    of getpwnam().
+ */
+#undef HAVE_ENHANCED_PASSWD
+
+/*  Define this if your system is Solaris with ``adjunct'' passwords (this is
+    the version where one gets at the passwords with getpwanam() instead of
+    getpwnam().)  I haven't tested this one, let me know if it works.
+ */
+#undef HAVE_ADJUNCT_PASSWD
+
+/*  Define this if you are running HPUX with so-called ``Secure Passwords'' 
+    (if you have /usr/include/hpsecurity.h, you probably have this.)  I
+    haven't tested this one, let me know if it works.
+ */
+#undef HAVE_HPUX_PASSWD
+
+/*  Define this if you are on a system that supports the VT_LOCKSWITCH and
+    VT_UNLOCKSWITCH ioctls.  If this is defined, then when the screen is
+    locked, switching to another virtual terminal will also be prevented.
+    That is, the whole console will be locked, rather than just the VT on
+    which X is running.
+ */
+#define HAVE_VT_LOCKSWITCH 1
+
+
+/* *************************************************************************
+                            OTHER C ENVIRONMENT JUNK
+   ************************************************************************* */
+
+/* Define this to void* if you're using X11R4 or earlier.  */
+#undef XPointer
+
+/* Define if you have the nice function.  */
+#undef HAVE_NICE
+
+/* Define if you have the setpriority function.  */
+#undef HAVE_SETPRIORITY
+
+/* Define to empty if the keyword does not work.  */
+#undef const
+
+/* Define if you have <sys/wait.h> that is POSIX.1 compatible.  */
+#undef HAVE_SYS_WAIT_H
+
+/* Define as __inline if that's what the C compiler calls it.  */
+#undef inline
+
+/* Define to `int' if <sys/types.h> doesn't define.  */
+#undef mode_t
+
+/* Define to `int' if <sys/types.h> doesn't define.  */
+#undef pid_t
+
+/* Define as the return type of signal handlers (int or void).  */
+#define RETSIGTYPE void
+
+/* Define to `unsigned' if <sys/types.h> doesn't define.  */
+#undef size_t
+
+/* Define if you have the ANSI C header files.  */
+#define STDC_HEADERS 1
+
+/* Define if you can safely include both <sys/time.h> and <time.h>.  */
+#undef TIME_WITH_SYS_TIME
+
+/* Define if you have the gettimeofday function.  */
+#undef HAVE_GETTIMEOFDAY
+
+/* Define if gettimeofday requires two arguments.  */
+#undef GETTIMEOFDAY_TWO_ARGS
+
+/* Define if you have the putenv function.  */
+#undef HAVE_PUTENV
+
+/* Define if you have the select function.  */
+#undef HAVE_SELECT
+
+/* Define if you have the getcwd function.  */
+#undef HAVE_GETCWD
+
+/* Define if you have the getcwd function.  */
+#undef HAVE_GETWD
+
+/* Define if you have the uname function.  */
+#undef HAVE_UNAME
+#if (__VMS_VER >= 70000000)
+# define HAVE_UNAME 1
+#endif
+
+/* Define if you have the fcntl function.  */
+#undef HAVE_FCNTL
+
+/* Define if you have the sigaction function.  */
+#undef HAVE_SIGACTION
+
+/* Define if you have the <unistd.h> header file.  */
+#undef HAVE_UNISTD_H
+
+/* Define if you have the <crypt.h> header file.  */
+#undef HAVE_CRYPT_H
+
+/* Define to use sigaction() instead of signal() for SIGCHLD-related activity.
+   This is necessary at least on SCO OpenServer 5, due to a Unix kernel bug.
+ */
+#undef USE_SIGACTION
diff --git a/config.h.in b/config.h.in
new file mode 100644 (file)
index 0000000..318e2bf
--- /dev/null
@@ -0,0 +1,357 @@
+/* config.h.in --- xscreensaver, Copyright (c) 1998 Jamie Zawinski.
+ *
+ *  The best way to set these parameters is by running the included `configure'
+ *  script.  That examines your system, and generates `config.h' from 
+ *  `config.h.in'.
+ *
+ *  If something goes very wrong, you can edit `config.h' directly, but beware
+ *  that your changes will be lost if you ever run `configure' again.
+ */
+
+
+/* *************************************************************************
+                          CONFIGURING SERVER EXTENSIONS
+   ************************************************************************* */
+
+/* Define this if you have the XReadDisplay extension (I think this is an
+   SGI-only thing; it's in <X11/extensions/readdisplay.h>.)  A few of the
+   screenhacks will take advantage of this if it's available.
+ */
+#undef HAVE_READ_DISPLAY_EXTENSION
+
+/* Define this if you have the Iris Video Library (dmedia/vl.h on SGI.)
+   A few of the screenhacks will take advantage of this if it's available.
+ */
+#undef HAVE_SGI_VIDEO
+
+/* Define this if you have the XHPDisableReset function (an HP only thing.)
+ */
+#undef HAVE_XHPDISABLERESET
+
+/*  First, some background: there are three distinct server extensions which
+ *  are useful to a screen saver program: they are XIDLE, MIT-SCREEN-SAVER, 
+ *  and SCREEN_SAVER.
+ *
+ *  The XIDLE extension resides in .../contrib/extensions/xidle/ on the X11R5
+ *  contrib tape.  This extension lets the client get accurate idle-time 
+ *  information from the X server in a potentially more reliable way than by
+ *  simply watching for keyboard and mouse activity.  However, the XIDLE 
+ *  extension has apparently not been ported to X11R6.
+ *
+ *  The SCREEN_SAVER extension is found (as far as I know) only in the SGI
+ *  X server, and it exists in all releases since (at least) Irix 5.  The
+ *  relevant header file is /usr/include/X11/extensions/XScreenSaver.h.
+ *
+ *  The similarly-named MIT-SCREEN-SAVER extension came into existence long
+ *  after the SGI SCREEN_SAVER extension was already in use, and resides in
+ *  .../contrib/extensions/screensaver/ on the X11R6 contrib tape.  It is
+ *  also found in certain recent X servers built in to NCD X terminals.
+ *
+ *     The MIT extension does basically the same thing that the XIDLE extension
+ *     does, but there are two things wrong with it: first, because of the way
+ *     the extension was designed, the `fade' option to XScreenSaver will be
+ *     uglier: just before the screen fades out, there will be an unattractive
+ *     flicker to black, because this extension blanks the screen *before*
+ *     telling us that it is time to do so.  Second, this extension is known to
+ *     be buggy; on the systems I use, it works, but some people have reported
+ *     X server crashes as a result of using it.  XScreenSaver uses this
+ *     extension rather conservatively, because when I tried to use any of its
+ *     more complicated features, I could get it to crash the server at the
+ *     drop of a hat.
+ *
+ *     In short, the MIT-SCREEN-SAVER extension is a piece of junk.  The older
+ *     SGI SCREEN_SAVER extension works great, as does XIDLE.  It would be nice
+ *     If those two existed on more systems, that is, would be adopted by the
+ *     X Consortium in favor of their inferior "not-invented-here" entry.
+ */
+
+/*  Define this if you have the XIDLE extension installed. If you have the
+ *  XIDLE extension, this is recommended.  (You have this extension if the
+ *  file /usr/include/X11/extensions/xidle.h exists.)  Turning on this flag
+ *  lets XScreenSaver work better with servers which support this extension; 
+ *  but it will still work with servers which do not suport it, so it's a good
+ *  idea to compile in support for it if you can.
+ */
+#undef HAVE_XIDLE_EXTENSION
+
+/*  Define this if you have the MIT-SCREEN-SAVER extension installed.  See the
+ *  caveats about this extension, above.  (It's available if the file
+ *  /usr/include/X11/extensions/scrnsaver.h exists.)
+ */
+#undef HAVE_MIT_SAVER_EXTENSION
+
+/*  Define this if you have the SGI SCREEN_SAVER extension.  This is standard
+ *  on Irix systems, and not available elsewhere.
+ */
+#undef HAVE_SGI_SAVER_EXTENSION
+
+/*  Define this if you have the SGI-VIDEO-CONTROL extension.  This is standard
+ *  on Irix systems, and not available elsewhere.
+ */
+#undef HAVE_SGI_VC_EXTENSION
+
+/*  Define this if you have the XDPMS extension.  This is standard on
+ *  sufficiently-recent XFree86 systems, and possibly elsewhere.  (It's
+ *  available if the file /usr/include/X11/extensions/dpms.h exists.)
+ */
+#undef HAVE_DPMS_EXTENSION
+
+/*  Define this if you have the functions XF86VidModeGetModeLine() and
+ *  XF86VidModeGetViewPort(), in support of virtual desktops where the
+ *  X server's root window is bigger than the actual screen.  This is
+ *  an XFree86 thing, and probably doesn't exist elsewhere.  (It's
+ *  available if the file /usr/include/X11/extensions/xf86vmode.h exists.)
+ */
+#undef HAVE_XF86VMODE
+
+/*  Define this if you have a Linux-like /proc/interrupts file which can be
+ *  examined to determine when keyboard activity has occurred.
+ */
+#undef HAVE_PROC_INTERRUPTS
+
+
+
+/* *************************************************************************
+                          CONFIGURING GRAPHICS TOOLKITS
+   ************************************************************************* */
+
+/*  Define this if you have Motif.
+ */
+#undef HAVE_MOTIF
+
+/*  Define this if you have Gtk.
+ */
+#undef HAVE_GTK
+
+/*  Define this if you have Athena (-Xaw).
+ */
+#undef HAVE_ATHENA
+
+/*  Define this if you have Athena, and the version you have includes the
+ *  XawViewportSetCoordinates function in Viewport.h (some old versions of
+ *  the library didn't have this function.)
+ */
+#undef HAVE_XawViewportSetCoordinates
+
+/*  Define this if you have the XPM library installed.  Some of the demos can
+ *  make use of this if it is available.
+ */
+#undef HAVE_XPM
+
+/*  Define this if you have the Xmu library.  This is standard part of X, and
+ *  if your vendor doesn't ship it, you should report that as a bug.
+ */
+#undef HAVE_XMU
+
+/*  Define this if you have OpenGL.  Some of the demos require it, so if you
+ *  don't have it, then those particular demos won't be built.  (This won't
+ *  affect the screen saver as a whole.)
+ */
+#undef HAVE_GL
+
+/*  Define this if you have OpenGL, but it's the MesaGL variant.  (The 
+    libraries have different names.)  (HAVE_GL should be defined too.)
+ */
+#undef HAVE_MESA_GL
+
+/*  Define this if your version of OpenGL has the glBindTexture() routine.
+    This is the case for OpenGL 1.1, but not for OpenGL 1.0.
+ */
+#undef HAVE_GLBINDTEXTURE
+
+/*  Define this if the `xscreensaver' process itself (the driver process)
+    should be linked against GL.  Most systems won't want this (in particular,
+    if you're using Linux and/or Mesa, you don't want this) but SGI systems
+    do want this.  It may also be useful on other systems that have serious
+    GL support -- you only need this if you have a lot of different visuals,
+    not all of which work with GL programs.
+ */
+#undef DAEMON_USE_GL
+
+/*  Define this if you have the X Shared Memory Extension.
+ */
+#undef HAVE_XSHM_EXTENSION
+
+/*  Define this if you have the X Double Buffer Extension.
+ */
+#undef HAVE_DOUBLE_BUFFER_EXTENSION
+
+/*  Some screenhacks like to run an external program to generate random pieces
+    of text; set this to the one you like ("yow" and "fortune" are the most
+    likely prospects.)  Note that this is just the default; X resources can
+    be used to override it.
+ */
+#define ZIPPY_PROGRAM "fortune"
+
+
+
+/* *************************************************************************
+                       CONFIGURING PASSWORD AUTHENTICATION
+   ************************************************************************* */
+
+/* Define this to remove the option of locking the screen at all.
+ */
+#undef NO_LOCKING
+
+/*  Define this if you want to use Kerberos authentication to lock/unlock the
+ *  screen instead of your local password.  This currently uses Kerberos V4, 
+ *  but a V5 server with V4 compatibility will work.  WARNING: DO NOT USE AFS
+ *  string-to-key passwords with this option. This option currently *only* 
+ *  works with standard Kerberos des_string_to_key.  If your password is an
+ *  AFS password and not a kerberos password, it will not authenticate 
+ *  properly. See the comments in driver/kpasswd.c for more information if you
+ *  need it. 
+ */
+#undef HAVE_KERBEROS
+
+/*  Define this if you want to use PAM (Pluggable Authentication Modules)
+ *  to lock/unlock the screen, instead of standard /etc/passwd authentication.
+ */
+#undef HAVE_PAM
+
+/*  If PAM is being used, this is the name of the PAM service that xscreensaver
+ *  will authenticate as.  The default is "xscreensaver", which means that the
+ *  PAM library will look for an "xscreensaver" line in /etc/pam.conf, or (on
+ *  recent Linux systems) will look for a file called /etc/pam.d/xscreensaver.
+ *  Some systems might already have a PAM installation that is configured for
+ *  xlock, so setting this to "xlock" would also work in that case.
+ */
+#define PAM_SERVICE_NAME "xscreensaver"
+
+/* Define if you have PAM and pam_strerror() requires two arguments.  */
+#undef PAM_STRERROR_TWO_ARGS
+
+/*  Define this if your system uses `shadow' passwords, that is, the passwords
+ *  live in /etc/shadow instead of /etc/passwd, and one reads them with
+ *  getspnam() instead of getpwnam().  (Note that SCO systems do some random
+ *  other thing; others might as well.  See the ifdefs in driver/passwd-pwent.c
+ *  if you're having trouble related to reading passwords.)
+ */
+#undef HAVE_SHADOW_PASSWD
+
+/*  Define this if your system is Digital or SCO Unix with so-called ``Enhanced
+    Security'', that is, the passwords live in /tcb/files/auth/<x>/<xyz> 
+    instead of in /etc/passwd, and one reads them with getprpwnam() instead 
+    of getpwnam().
+ */
+#undef HAVE_ENHANCED_PASSWD
+
+/*  Define this if your system is Solaris with ``adjunct'' passwords (this is
+    the version where one gets at the passwords with getpwanam() instead of
+    getpwnam().)  I haven't tested this one, let me know if it works.
+ */
+#undef HAVE_ADJUNCT_PASSWD
+
+/*  Define this if you are running HPUX with so-called ``Secure Passwords'' 
+    (if you have /usr/include/hpsecurity.h, you probably have this.)  I
+    haven't tested this one, let me know if it works.
+ */
+#undef HAVE_HPUX_PASSWD
+
+/*  Define this if you are on a system that supports the VT_LOCKSWITCH and
+    VT_UNLOCKSWITCH ioctls.  If this is defined, then when the screen is
+    locked, switching to another virtual terminal will also be prevented.
+    That is, the whole console will be locked, rather than just the VT on
+    which X is running.  (Well, that's the theory anyway -- in practice,
+    I haven't yet figured out how to make that work.)
+ */
+#undef HAVE_VT_LOCKSWITCH
+
+
+/* Define this if you the openlog(), syslog(), and closelog() functions.
+   This is used for logging failed login attempts.
+ */
+#undef HAVE_SYSLOG
+
+
+/* *************************************************************************
+                            OTHER C ENVIRONMENT JUNK
+   ************************************************************************* */
+
+/* Define this to void* if you're using X11R4 or earlier.  */
+#undef XPointer
+
+/* Define if you have the nice function.  */
+#undef HAVE_NICE
+
+/* Define if you have the setpriority function.  */
+#undef HAVE_SETPRIORITY
+
+/* Define to empty if the keyword does not work.  */
+#undef const
+
+/* Define if you have <sys/wait.h> that is POSIX.1 compatible.  */
+#undef HAVE_SYS_WAIT_H
+
+/* Define as __inline if that's what the C compiler calls it.  */
+#undef inline
+
+/* Define to `int' if <sys/types.h> doesn't define.  */
+#undef mode_t
+
+/* Define to `int' if <sys/types.h> doesn't define.  */
+#undef pid_t
+
+/* Define as the return type of signal handlers (int or void).  */
+#undef RETSIGTYPE
+
+/* Define to `unsigned' if <sys/types.h> doesn't define.  */
+#undef size_t
+
+/* Define if you have the ANSI C header files.  */
+#undef STDC_HEADERS
+
+/* Define if you can safely include both <sys/time.h> and <time.h>.  */
+#undef TIME_WITH_SYS_TIME
+
+/* Define if you have the gettimeofday function.  */
+#undef HAVE_GETTIMEOFDAY
+
+/* Define if gettimeofday requires two arguments.  */
+#undef GETTIMEOFDAY_TWO_ARGS
+
+/* Define if you have the putenv function.  */
+#undef HAVE_PUTENV
+
+/* Define if you have the select function.  */
+#undef HAVE_SELECT
+
+/* Define if you have the getcwd function.  */
+#undef HAVE_GETCWD
+
+/* Define if you have the getcwd function.  */
+#undef HAVE_GETWD
+
+/* Define if you have the realpath function.  */
+#undef HAVE_REALPATH
+
+/* Define if you have the uname function.  */
+#undef HAVE_UNAME
+
+/* Define if you have the fcntl function.  */
+#undef HAVE_FCNTL
+
+/* Define if you have the sigaction function.  */
+#undef HAVE_SIGACTION
+
+/* Define if you have the <unistd.h> header file.  */
+#undef HAVE_UNISTD_H
+
+/* Define if you have the <crypt.h> header file.  */
+#undef HAVE_CRYPT_H
+
+/* Define if you have <sys/select.h> that defines fd_set and FD_SET.  */
+#undef HAVE_SYS_SELECT_H
+
+/* Define to use sigaction() instead of signal() for SIGCHLD-related activity.
+   This is necessary at least on SCO OpenServer 5, due to a Unix kernel bug.
+ */
+#undef USE_SIGACTION
+
+/* Define this if you do pings with a `struct icmp' and  a `icmp_id' slot.
+ */
+#undef HAVE_ICMP
+
+/* Define this if you do pings with a `struct icmphdr' and a `un.echo.id' slot.
+ */
+#undef HAVE_ICMPHDR
diff --git a/config.sub b/config.sub
new file mode 100755 (executable)
index 0000000..0432524
--- /dev/null
@@ -0,0 +1,927 @@
+#! /bin/sh
+# Configuration validation subroutine script, version 1.1.
+#   Copyright (C) 1991, 92, 93, 94, 95, 1996 Free Software Foundation, Inc.
+# This file is (in principle) common to ALL GNU software.
+# The presence of a machine in this file suggests that SOME GNU software
+# can handle that machine.  It does not imply ALL GNU software can.
+#
+# This file is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330,
+# Boston, MA 02111-1307, USA.
+
+# As a special exception to the GNU General Public License, if you
+# distribute this file as part of a program that contains a
+# configuration script generated by Autoconf, you may include it under
+# the same distribution terms that you use for the rest of that program.
+
+# Configuration subroutine to validate and canonicalize a configuration type.
+# Supply the specified configuration type as an argument.
+# If it is invalid, we print an error message on stderr and exit with code 1.
+# Otherwise, we print the canonical config type on stdout and succeed.
+
+# This file is supposed to be the same for all GNU packages
+# and recognize all the CPU types, system types and aliases
+# that are meaningful with *any* GNU software.
+# Each package is responsible for reporting which valid configurations
+# it does not support.  The user should be able to distinguish
+# a failure to support a valid configuration from a meaningless
+# configuration.
+
+# The goal of this file is to map all the various variations of a given
+# machine specification into a single specification in the form:
+#      CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM
+# or in some cases, the newer four-part form:
+#      CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM
+# It is wrong to echo any other type of specification.
+
+if [ x$1 = x ]
+then
+       echo Configuration name missing. 1>&2
+       echo "Usage: $0 CPU-MFR-OPSYS" 1>&2
+       echo "or     $0 ALIAS" 1>&2
+       echo where ALIAS is a recognized configuration type. 1>&2
+       exit 1
+fi
+
+# First pass through any local machine types.
+case $1 in
+       *local*)
+               echo $1
+               exit 0
+               ;;
+       *)
+       ;;
+esac
+
+# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any).
+# Here we must recognize all the valid KERNEL-OS combinations.
+maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
+case $maybe_os in
+  linux-gnu*)
+    os=-$maybe_os
+    basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`
+    ;;
+  *)
+    basic_machine=`echo $1 | sed 's/-[^-]*$//'`
+    if [ $basic_machine != $1 ]
+    then os=`echo $1 | sed 's/.*-/-/'`
+    else os=; fi
+    ;;
+esac
+
+### Let's recognize common machines as not being operating systems so
+### that things like config.sub decstation-3100 work.  We also
+### recognize some manufacturers as not being operating systems, so we
+### can provide default operating systems below.
+case $os in
+       -sun*os*)
+               # Prevent following clause from handling this invalid input.
+               ;;
+       -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \
+       -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \
+       -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \
+       -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\
+       -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \
+       -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \
+       -apple)
+               os=
+               basic_machine=$1
+               ;;
+       -hiux*)
+               os=-hiuxwe2
+               ;;
+       -sco5)
+               os=sco3.2v5
+               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+               ;;
+       -sco4)
+               os=-sco3.2v4
+               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+               ;;
+       -sco3.2.[4-9]*)
+               os=`echo $os | sed -e 's/sco3.2./sco3.2v/'`
+               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+               ;;
+       -sco3.2v[4-9]*)
+               # Don't forget version if it is 3.2v4 or newer.
+               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+               ;;
+       -sco*)
+               os=-sco3.2v2
+               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+               ;;
+       -isc)
+               os=-isc2.2
+               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+               ;;
+       -clix*)
+               basic_machine=clipper-intergraph
+               ;;
+       -isc*)
+               basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`
+               ;;
+       -lynx*)
+               os=-lynxos
+               ;;
+       -ptx*)
+               basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'`
+               ;;
+       -windowsnt*)
+               os=`echo $os | sed -e 's/windowsnt/winnt/'`
+               ;;
+       -psos*)
+               os=-psos
+               ;;
+esac
+
+# Decode aliases for certain CPU-COMPANY combinations.
+case $basic_machine in
+       # Recognize the basic CPU types without company name.
+       # Some are omitted here because they have special meanings below.
+       tahoe | i860 | m68k | m68000 | m88k | ns32k | arm \
+               | arme[lb] | pyramid \
+               | tron | a29k | 580 | i960 | h8300 | hppa | hppa1.0 | hppa1.1 \
+               | alpha | we32k | ns16k | clipper | i370 | sh \
+               | powerpc | powerpcle | 1750a | dsp16xx | mips64 | mipsel \
+               | pdp11 | mips64el | mips64orion | mips64orionel \
+               | sparc | sparclet | sparclite | sparc64)
+               basic_machine=$basic_machine-unknown
+               ;;
+       # We use `pc' rather than `unknown'
+       # because (1) that's what they normally are, and
+       # (2) the word "unknown" tends to confuse beginning users.
+       i[3456]86)
+         basic_machine=$basic_machine-pc
+         ;;
+       # Object if more than one company name word.
+       *-*-*)
+               echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+               exit 1
+               ;;
+       # Recognize the basic CPU types with company name.
+       vax-* | tahoe-* | i[3456]86-* | i860-* | m68k-* | m68000-* | m88k-* \
+             | sparc-* | ns32k-* | fx80-* | arm-* | c[123]* \
+             | mips-* | pyramid-* | tron-* | a29k-* | romp-* | rs6000-* | power-* \
+             | none-* | 580-* | cray2-* | h8300-* | i960-* | xmp-* | ymp-* \
+             | hppa-* | hppa1.0-* | hppa1.1-* | alpha-* | we32k-* | cydra-* | ns16k-* \
+             | pn-* | np1-* | xps100-* | clipper-* | orion-* | sparclite-* \
+             | pdp11-* | sh-* | powerpc-* | powerpcle-* | sparc64-* | mips64-* | mipsel-* \
+             | mips64el-* | mips64orion-* | mips64orionel-* | f301-*)
+               ;;
+       # Recognize the various machine names and aliases which stand
+       # for a CPU type and a company and sometimes even an OS.
+       3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)
+               basic_machine=m68000-att
+               ;;
+       3b*)
+               basic_machine=we32k-att
+               ;;
+       alliant | fx80)
+               basic_machine=fx80-alliant
+               ;;
+       altos | altos3068)
+               basic_machine=m68k-altos
+               ;;
+       am29k)
+               basic_machine=a29k-none
+               os=-bsd
+               ;;
+       amdahl)
+               basic_machine=580-amdahl
+               os=-sysv
+               ;;
+       amiga | amiga-*)
+               basic_machine=m68k-cbm
+               ;;
+       amigados)
+               basic_machine=m68k-cbm
+               os=-amigados
+               ;;
+       amigaunix | amix)
+               basic_machine=m68k-cbm
+               os=-sysv4
+               ;;
+       apollo68)
+               basic_machine=m68k-apollo
+               os=-sysv
+               ;;
+       aux)
+               basic_machine=m68k-apple
+               os=-aux
+               ;;
+       balance)
+               basic_machine=ns32k-sequent
+               os=-dynix
+               ;;
+       convex-c1)
+               basic_machine=c1-convex
+               os=-bsd
+               ;;
+       convex-c2)
+               basic_machine=c2-convex
+               os=-bsd
+               ;;
+       convex-c32)
+               basic_machine=c32-convex
+               os=-bsd
+               ;;
+       convex-c34)
+               basic_machine=c34-convex
+               os=-bsd
+               ;;
+       convex-c38)
+               basic_machine=c38-convex
+               os=-bsd
+               ;;
+       cray | ymp)
+               basic_machine=ymp-cray
+               os=-unicos
+               ;;
+       cray2)
+               basic_machine=cray2-cray
+               os=-unicos
+               ;;
+       [ctj]90-cray)
+               basic_machine=c90-cray
+               os=-unicos
+               ;;
+       crds | unos)
+               basic_machine=m68k-crds
+               ;;
+       da30 | da30-*)
+               basic_machine=m68k-da30
+               ;;
+       decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn)
+               basic_machine=mips-dec
+               ;;
+       delta | 3300 | motorola-3300 | motorola-delta \
+             | 3300-motorola | delta-motorola)
+               basic_machine=m68k-motorola
+               ;;
+       delta88)
+               basic_machine=m88k-motorola
+               os=-sysv3
+               ;;
+       dpx20 | dpx20-*)
+               basic_machine=rs6000-bull
+               os=-bosx
+               ;;
+       dpx2* | dpx2*-bull)
+               basic_machine=m68k-bull
+               os=-sysv3
+               ;;
+       ebmon29k)
+               basic_machine=a29k-amd
+               os=-ebmon
+               ;;
+       elxsi)
+               basic_machine=elxsi-elxsi
+               os=-bsd
+               ;;
+       encore | umax | mmax)
+               basic_machine=ns32k-encore
+               ;;
+       fx2800)
+               basic_machine=i860-alliant
+               ;;
+       genix)
+               basic_machine=ns32k-ns
+               ;;
+       gmicro)
+               basic_machine=tron-gmicro
+               os=-sysv
+               ;;
+       h3050r* | hiux*)
+               basic_machine=hppa1.1-hitachi
+               os=-hiuxwe2
+               ;;
+       h8300hms)
+               basic_machine=h8300-hitachi
+               os=-hms
+               ;;
+       harris)
+               basic_machine=m88k-harris
+               os=-sysv3
+               ;;
+       hp300-*)
+               basic_machine=m68k-hp
+               ;;
+       hp300bsd)
+               basic_machine=m68k-hp
+               os=-bsd
+               ;;
+       hp300hpux)
+               basic_machine=m68k-hp
+               os=-hpux
+               ;;
+       hp9k2[0-9][0-9] | hp9k31[0-9])
+               basic_machine=m68000-hp
+               ;;
+       hp9k3[2-9][0-9])
+               basic_machine=m68k-hp
+               ;;
+       hp9k7[0-9][0-9] | hp7[0-9][0-9] | hp9k8[0-9]7 | hp8[0-9]7)
+               basic_machine=hppa1.1-hp
+               ;;
+       hp9k8[0-9][0-9] | hp8[0-9][0-9])
+               basic_machine=hppa1.0-hp
+               ;;
+       hppa-next)
+               os=-nextstep3
+               ;;
+       i370-ibm* | ibm*)
+               basic_machine=i370-ibm
+               os=-mvs
+               ;;
+# I'm not sure what "Sysv32" means.  Should this be sysv3.2?
+       i[3456]86v32)
+               basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+               os=-sysv32
+               ;;
+       i[3456]86v4*)
+               basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+               os=-sysv4
+               ;;
+       i[3456]86v)
+               basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+               os=-sysv
+               ;;
+       i[3456]86sol2)
+               basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`
+               os=-solaris2
+               ;;
+       iris | iris4d)
+               basic_machine=mips-sgi
+               case $os in
+                   -irix*)
+                       ;;
+                   *)
+                       os=-irix4
+                       ;;
+               esac
+               ;;
+       isi68 | isi)
+               basic_machine=m68k-isi
+               os=-sysv
+               ;;
+       m88k-omron*)
+               basic_machine=m88k-omron
+               ;;
+       magnum | m3230)
+               basic_machine=mips-mips
+               os=-sysv
+               ;;
+       merlin)
+               basic_machine=ns32k-utek
+               os=-sysv
+               ;;
+       miniframe)
+               basic_machine=m68000-convergent
+               ;;
+       mips3*-*)
+               basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`
+               ;;
+       mips3*)
+               basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown
+               ;;
+       ncr3000)
+               basic_machine=i486-ncr
+               os=-sysv4
+               ;;
+       news | news700 | news800 | news900)
+               basic_machine=m68k-sony
+               os=-newsos
+               ;;
+       news1000)
+               basic_machine=m68030-sony
+               os=-newsos
+               ;;
+       news-3600 | risc-news)
+               basic_machine=mips-sony
+               os=-newsos
+               ;;
+       next | m*-next )
+               basic_machine=m68k-next
+               case $os in
+                   -nextstep* )
+                       ;;
+                   -ns2*)
+                     os=-nextstep2
+                       ;;
+                   *)
+                     os=-nextstep3
+                       ;;
+               esac
+               ;;
+       nh3000)
+               basic_machine=m68k-harris
+               os=-cxux
+               ;;
+       nh[45]000)
+               basic_machine=m88k-harris
+               os=-cxux
+               ;;
+       nindy960)
+               basic_machine=i960-intel
+               os=-nindy
+               ;;
+       np1)
+               basic_machine=np1-gould
+               ;;
+       pa-hitachi)
+               basic_machine=hppa1.1-hitachi
+               os=-hiuxwe2
+               ;;
+       paragon)
+               basic_machine=i860-intel
+               os=-osf
+               ;;
+       pbd)
+               basic_machine=sparc-tti
+               ;;
+       pbb)
+               basic_machine=m68k-tti
+               ;;
+        pc532 | pc532-*)
+               basic_machine=ns32k-pc532
+               ;;
+       pentium | p5)
+               basic_machine=i586-intel
+               ;;
+       pentiumpro | p6)
+               basic_machine=i686-intel
+               ;;
+       pentium-* | p5-*)
+               basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'`
+               ;;
+       pentiumpro-* | p6-*)
+               basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`
+               ;;
+       k5)
+               # We don't have specific support for AMD's K5 yet, so just call it a Pentium
+               basic_machine=i586-amd
+               ;;
+       nexen)
+               # We don't have specific support for Nexgen yet, so just call it a Pentium
+               basic_machine=i586-nexgen
+               ;;
+       pn)
+               basic_machine=pn-gould
+               ;;
+       power)  basic_machine=rs6000-ibm
+               ;;
+       ppc)    basic_machine=powerpc-unknown
+               ;;
+       ppc-*)  basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`
+               ;;
+       ppcle | powerpclittle | ppc-le | powerpc-little)
+               basic_machine=powerpcle-unknown
+               ;;
+       ppcle-* | powerpclittle-*)
+               basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'`
+               ;;
+       ps2)
+               basic_machine=i386-ibm
+               ;;
+       rm[46]00)
+               basic_machine=mips-siemens
+               ;;
+       rtpc | rtpc-*)
+               basic_machine=romp-ibm
+               ;;
+       sequent)
+               basic_machine=i386-sequent
+               ;;
+       sh)
+               basic_machine=sh-hitachi
+               os=-hms
+               ;;
+       sps7)
+               basic_machine=m68k-bull
+               os=-sysv2
+               ;;
+       spur)
+               basic_machine=spur-unknown
+               ;;
+       sun2)
+               basic_machine=m68000-sun
+               ;;
+       sun2os3)
+               basic_machine=m68000-sun
+               os=-sunos3
+               ;;
+       sun2os4)
+               basic_machine=m68000-sun
+               os=-sunos4
+               ;;
+       sun3os3)
+               basic_machine=m68k-sun
+               os=-sunos3
+               ;;
+       sun3os4)
+               basic_machine=m68k-sun
+               os=-sunos4
+               ;;
+       sun4os3)
+               basic_machine=sparc-sun
+               os=-sunos3
+               ;;
+       sun4os4)
+               basic_machine=sparc-sun
+               os=-sunos4
+               ;;
+       sun4sol2)
+               basic_machine=sparc-sun
+               os=-solaris2
+               ;;
+       sun3 | sun3-*)
+               basic_machine=m68k-sun
+               ;;
+       sun4)
+               basic_machine=sparc-sun
+               ;;
+       sun386 | sun386i | roadrunner)
+               basic_machine=i386-sun
+               ;;
+       symmetry)
+               basic_machine=i386-sequent
+               os=-dynix
+               ;;
+       tower | tower-32)
+               basic_machine=m68k-ncr
+               ;;
+       udi29k)
+               basic_machine=a29k-amd
+               os=-udi
+               ;;
+       ultra3)
+               basic_machine=a29k-nyu
+               os=-sym1
+               ;;
+       vaxv)
+               basic_machine=vax-dec
+               os=-sysv
+               ;;
+       vms)
+               basic_machine=vax-dec
+               os=-vms
+               ;;
+       vpp*|vx|vx-*)
+               basic_machine=f301-fujitsu
+               ;;
+       vxworks960)
+               basic_machine=i960-wrs
+               os=-vxworks
+               ;;
+       vxworks68)
+               basic_machine=m68k-wrs
+               os=-vxworks
+               ;;
+       vxworks29k)
+               basic_machine=a29k-wrs
+               os=-vxworks
+               ;;
+       xmp)
+               basic_machine=xmp-cray
+               os=-unicos
+               ;;
+        xps | xps100)
+               basic_machine=xps100-honeywell
+               ;;
+       none)
+               basic_machine=none-none
+               os=-none
+               ;;
+
+# Here we handle the default manufacturer of certain CPU types.  It is in
+# some cases the only manufacturer, in others, it is the most popular.
+       mips)
+               basic_machine=mips-mips
+               ;;
+       romp)
+               basic_machine=romp-ibm
+               ;;
+       rs6000)
+               basic_machine=rs6000-ibm
+               ;;
+       vax)
+               basic_machine=vax-dec
+               ;;
+       pdp11)
+               basic_machine=pdp11-dec
+               ;;
+       we32k)
+               basic_machine=we32k-att
+               ;;
+       sparc)
+               basic_machine=sparc-sun
+               ;;
+        cydra)
+               basic_machine=cydra-cydrome
+               ;;
+       orion)
+               basic_machine=orion-highlevel
+               ;;
+       orion105)
+               basic_machine=clipper-highlevel
+               ;;
+       *)
+               echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2
+               exit 1
+               ;;
+esac
+
+# Here we canonicalize certain aliases for manufacturers.
+case $basic_machine in
+       *-digital*)
+               basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'`
+               ;;
+       *-commodore*)
+               basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'`
+               ;;
+       *)
+               ;;
+esac
+
+# Decode manufacturer-specific aliases for certain operating systems.
+
+if [ x"$os" != x"" ]
+then
+case $os in
+        # First match some system type aliases
+        # that might get confused with valid system types.
+       # -solaris* is a basic system type, with this one exception.
+       -solaris1 | -solaris1.*)
+               os=`echo $os | sed -e 's|solaris1|sunos4|'`
+               ;;
+       -solaris)
+               os=-solaris2
+               ;;
+       -unixware* | svr4*)
+               os=-sysv4
+               ;;
+       -gnu/linux*)
+               os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'`
+               ;;
+       # First accept the basic system types.
+       # The portable systems comes first.
+       # Each alternative MUST END IN A *, to match a version number.
+       # -sysv* is not here because it comes later, after sysvr4.
+       -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \
+             | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\
+             | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \
+             | -amigados* | -msdos* | -newsos* | -unicos* | -aof* | -aos* \
+             | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
+             | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
+             | -hiux* | -386bsd* | -netbsd* | -openbsd* | -freebsd* | -riscix* \
+             | -lynxos* | -bosx* | -nextstep* | -cxux* | -aout* | -elf* \
+             | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \
+             | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \
+             | -cygwin32* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
+             | -linux-gnu* | -uxpv*)
+       # Remember, each alternative MUST END IN *, to match a version number.
+               ;;
+       -linux*)
+               os=`echo $os | sed -e 's|linux|linux-gnu|'`
+               ;;
+       -sunos5*)
+               os=`echo $os | sed -e 's|sunos5|solaris2|'`
+               ;;
+       -sunos6*)
+               os=`echo $os | sed -e 's|sunos6|solaris3|'`
+               ;;
+       -osfrose*)
+               os=-osfrose
+               ;;
+       -osf*)
+               os=-osf
+               ;;
+       -utek*)
+               os=-bsd
+               ;;
+       -dynix*)
+               os=-bsd
+               ;;
+       -acis*)
+               os=-aos
+               ;;
+       -ctix* | -uts*)
+               os=-sysv
+               ;;
+       -ns2 )
+               os=-nextstep2
+               ;;
+       # Preserve the version number of sinix5.
+       -sinix5.*)
+               os=`echo $os | sed -e 's|sinix|sysv|'`
+               ;;
+       -sinix*)
+               os=-sysv4
+               ;;
+       -triton*)
+               os=-sysv3
+               ;;
+       -oss*)
+               os=-sysv3
+               ;;
+       -svr4)
+               os=-sysv4
+               ;;
+       -svr3)
+               os=-sysv3
+               ;;
+       -sysvr4)
+               os=-sysv4
+               ;;
+       # This must come after -sysvr4.
+       -sysv*)
+               ;;
+       -xenix)
+               os=-xenix
+               ;;
+       -none)
+               ;;
+       *)
+               # Get rid of the `-' at the beginning of $os.
+               os=`echo $os | sed 's/[^-]*-//'`
+               echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2
+               exit 1
+               ;;
+esac
+else
+
+# Here we handle the default operating systems that come with various machines.
+# The value should be what the vendor currently ships out the door with their
+# machine or put another way, the most popular os provided with the machine.
+
+# Note that if you're going to try to match "-MANUFACTURER" here (say,
+# "-sun"), then you have to tell the case statement up towards the top
+# that MANUFACTURER isn't an operating system.  Otherwise, code above
+# will signal an error saying that MANUFACTURER isn't an operating
+# system, and we'll never get to this point.
+
+case $basic_machine in
+       *-acorn)
+               os=-riscix1.2
+               ;;
+       arm*-semi)
+               os=-aout
+               ;;
+        pdp11-*)
+               os=-none
+               ;;
+       *-dec | vax-*)
+               os=-ultrix4.2
+               ;;
+       m68*-apollo)
+               os=-domain
+               ;;
+       i386-sun)
+               os=-sunos4.0.2
+               ;;
+       m68000-sun)
+               os=-sunos3
+               # This also exists in the configure program, but was not the
+               # default.
+               # os=-sunos4
+               ;;
+       *-tti)  # must be before sparc entry or we get the wrong os.
+               os=-sysv3
+               ;;
+       sparc-* | *-sun)
+               os=-sunos4.1.1
+               ;;
+       *-ibm)
+               os=-aix
+               ;;
+       *-hp)
+               os=-hpux
+               ;;
+       *-hitachi)
+               os=-hiux
+               ;;
+       i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)
+               os=-sysv
+               ;;
+       *-cbm)
+               os=-amigados
+               ;;
+       *-dg)
+               os=-dgux
+               ;;
+       *-dolphin)
+               os=-sysv3
+               ;;
+       m68k-ccur)
+               os=-rtu
+               ;;
+       m88k-omron*)
+               os=-luna
+               ;;
+       *-next )
+               os=-nextstep
+               ;;
+       *-sequent)
+               os=-ptx
+               ;;
+       *-crds)
+               os=-unos
+               ;;
+       *-ns)
+               os=-genix
+               ;;
+       i370-*)
+               os=-mvs
+               ;;
+       *-next)
+               os=-nextstep3
+               ;;
+        *-gould)
+               os=-sysv
+               ;;
+        *-highlevel)
+               os=-bsd
+               ;;
+       *-encore)
+               os=-bsd
+               ;;
+        *-sgi)
+               os=-irix
+               ;;
+        *-siemens)
+               os=-sysv4
+               ;;
+       *-masscomp)
+               os=-rtu
+               ;;
+       f301-fujitsu)
+               os=-uxpv
+               ;;
+       *)
+               os=-none
+               ;;
+esac
+fi
+
+# Here we handle the case where we know the os, and the CPU type, but not the
+# manufacturer.  We pick the logical manufacturer.
+vendor=unknown
+case $basic_machine in
+       *-unknown)
+               case $os in
+                       -riscix*)
+                               vendor=acorn
+                               ;;
+                       -sunos*)
+                               vendor=sun
+                               ;;
+                       -aix*)
+                               vendor=ibm
+                               ;;
+                       -hpux*)
+                               vendor=hp
+                               ;;
+                       -hiux*)
+                               vendor=hitachi
+                               ;;
+                       -unos*)
+                               vendor=crds
+                               ;;
+                       -dgux*)
+                               vendor=dg
+                               ;;
+                       -luna*)
+                               vendor=omron
+                               ;;
+                       -genix*)
+                               vendor=ns
+                               ;;
+                       -mvs*)
+                               vendor=ibm
+                               ;;
+                       -ptx*)
+                               vendor=sequent
+                               ;;
+                       -vxsim* | -vxworks*)
+                               vendor=wrs
+                               ;;
+                       -aux*)
+                               vendor=apple
+                               ;;
+               esac
+               basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"`
+               ;;
+esac
+
+echo $basic_machine$os
diff --git a/configure b/configure
new file mode 100755 (executable)
index 0000000..74d889e
--- /dev/null
+++ b/configure
@@ -0,0 +1,9361 @@
+#! /bin/sh
+
+# Guess values for system-dependent variables and create Makefiles.
+# Generated automatically using autoconf version 2.13 
+# Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc.
+#
+# This configure script is free software; the Free Software Foundation
+# gives unlimited permission to copy, distribute and modify it.
+
+# Defaults:
+ac_help=
+ac_default_prefix=/usr/local
+# Any additions from configure.in:
+ac_help="$ac_help"
+ac_help="$ac_help
+Installation options:
+
+  --enable-subdir=DIR     Put the demo programs in a subdirectory of \`bindir',
+                          instead of putting them in bindir itself.  You can
+                          specify the name of the subdirectory.  For example,
+                          \`--exec-prefix=/usr/local --enable-subdir=demos'
+                          would put xscreensaver in /usr/local/bin/, and would
+                          put the demos in /usr/local/bin/demos/.  (If DIR
+                          begins with /, then bindir will not be prepended.)
+
+  --disable-subdir        Just put the demos in \`bindir' (this is the default.)
+"
+ac_help="$ac_help
+Except where noted, all of the --with options below can also take a
+directory argument: for example, \`--with-motif=/opt/Motif'.  That would
+cause /opt/Motif/include/ to be added to the -I list, and /opt/Motif/lib/
+to be added to the -L list, assuming those directories exist.  
+
+By default, support for each of these options will be built in, if the
+relevant library routines exist.  At run time, they will then be used
+only if the X server being used supports them.  Each --with option has
+a corresponding --without option, to override building support for them
+at all.
+
+Screen blanking and idle-detection options:
+
+  --with-sgi-ext          Include support for the SGI SCREEN_SAVER extension."
+ac_help="$ac_help
+  --with-mit-ext          Include support for the MIT-SCREEN-SAVER extension."
+ac_help="$ac_help
+  --with-xidle-ext        Include support for the XIDLE extension."
+ac_help="$ac_help
+  --with-sgivc-ext        Include support for the SGI-VIDEO-CONTROL extension."
+ac_help="$ac_help
+  --with-dpms-ext         Include support for the DPMS extension."
+ac_help="$ac_help
+  --with-xf86vmode-ext    Include support for XFree86 virtual screens."
+ac_help="$ac_help
+  --with-proc-interrupts  Include support for consulting the /proc/interrupts
+                          file to notice keyboard activity."
+ac_help="$ac_help
+
+Screen locking options:
+
+  --enable-locking        Compile in support for locking the display.
+  --disable-locking       Do not allow locking at all.
+"
+ac_help="$ac_help
+  --with-pam              Include support for PAM (Pluggable Auth Modules.)"
+ac_help="$ac_help
+  --with-kerberos         Include support for Kerberos authentication."
+ac_help="$ac_help
+  --with-shadow           Include support for shadow password authentication."
+ac_help="$ac_help
+
+User interface options:
+
+  --with-motif            Use the Motif toolkit for the user interface."
+ac_help="$ac_help
+  --with-gtk              Use the Gtk toolkit for the user interface."
+ac_help="$ac_help
+  --with-athena           Use the Athena toolkit for the user interface."
+ac_help="$ac_help
+
+Graphics options:
+
+  --with-gl               Build those demos which depend on OpenGL."
+ac_help="$ac_help
+  --with-xpm              Include support for XPM files in some demos."
+ac_help="$ac_help
+  --with-xshm-ext         Include support for the XSHM extension."
+ac_help="$ac_help
+  --with-xdbe-ext         Include support for the DOUBLE-BUFFER extension."
+ac_help="$ac_help
+  --with-readdisplay      Include support for the XReadDisplay extension."
+ac_help="$ac_help
+  --with-sgivideo         Include support for SGI's Iris Video Library."
+ac_help="$ac_help
+
+  --with-zippy=PROGRAM    Some demos are able to run an external program and
+                          display its text; this names the program to use by
+                          default (though it can be overridden with X
+                          resources.)  If you don't specify this, the default
+                          is to use \"yow\" from the Emacs distribution (if you
+                          have it) or else to use \"fortune\".
+"
+
+# Initialize some variables set by options.
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+build=NONE
+cache_file=./config.cache
+exec_prefix=NONE
+host=NONE
+no_create=
+nonopt=NONE
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+srcdir=
+target=NONE
+verbose=
+x_includes=NONE
+x_libraries=NONE
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/libexec'
+datadir='${prefix}/share'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='${prefix}/var'
+libdir='${exec_prefix}/lib'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+infodir='${prefix}/info'
+mandir='${prefix}/man'
+
+# Initialize some other variables.
+subdirs=
+MFLAGS= MAKEFLAGS=
+SHELL=${CONFIG_SHELL-/bin/sh}
+# Maximum number of lines to put in a shell here document.
+ac_max_here_lines=12
+
+ac_prev=
+for ac_option
+do
+
+  # If the previous option needs an argument, assign it.
+  if test -n "$ac_prev"; then
+    eval "$ac_prev=\$ac_option"
+    ac_prev=
+    continue
+  fi
+
+  case "$ac_option" in
+  -*=*) ac_optarg=`echo "$ac_option" | sed 's/[-_a-zA-Z0-9]*=//'` ;;
+  *) ac_optarg= ;;
+  esac
+
+  # Accept the important Cygnus configure options, so we can diagnose typos.
+
+  case "$ac_option" in
+
+  -bindir | --bindir | --bindi | --bind | --bin | --bi)
+    ac_prev=bindir ;;
+  -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
+    bindir="$ac_optarg" ;;
+
+  -build | --build | --buil | --bui | --bu)
+    ac_prev=build ;;
+  -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+    build="$ac_optarg" ;;
+
+  -cache-file | --cache-file | --cache-fil | --cache-fi \
+  | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+    ac_prev=cache_file ;;
+  -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+  | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+    cache_file="$ac_optarg" ;;
+
+  -datadir | --datadir | --datadi | --datad | --data | --dat | --da)
+    ac_prev=datadir ;;
+  -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \
+  | --da=*)
+    datadir="$ac_optarg" ;;
+
+  -disable-* | --disable-*)
+    ac_feature=`echo $ac_option|sed -e 's/-*disable-//'`
+    # Reject names that are not valid shell variable names.
+    if test -n "`echo $ac_feature| sed 's/[-a-zA-Z0-9_]//g'`"; then
+      { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; }
+    fi
+    ac_feature=`echo $ac_feature| sed 's/-/_/g'`
+    eval "enable_${ac_feature}=no" ;;
+
+  -enable-* | --enable-*)
+    ac_feature=`echo $ac_option|sed -e 's/-*enable-//' -e 's/=.*//'`
+    # Reject names that are not valid shell variable names.
+    if test -n "`echo $ac_feature| sed 's/[-_a-zA-Z0-9]//g'`"; then
+      { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; }
+    fi
+    ac_feature=`echo $ac_feature| sed 's/-/_/g'`
+    case "$ac_option" in
+      *=*) ;;
+      *) ac_optarg=yes ;;
+    esac
+    eval "enable_${ac_feature}='$ac_optarg'" ;;
+
+  -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+  | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+  | --exec | --exe | --ex)
+    ac_prev=exec_prefix ;;
+  -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+  | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+  | --exec=* | --exe=* | --ex=*)
+    exec_prefix="$ac_optarg" ;;
+
+  -gas | --gas | --ga | --g)
+    # Obsolete; use --with-gas.
+    with_gas=yes ;;
+
+  -help | --help | --hel | --he)
+    # Omit some internal or obsolete options to make the list less imposing.
+    # This message is too long to be a string in the A/UX 3.1 sh.
+    cat << EOF
+Usage: configure [options] [host]
+Options: [defaults in brackets after descriptions]
+
+Configuration:
+
+  --cache-file=FILE       cache test results in FILE
+  --help                  print this message
+  --no-create             do not create output files
+  --quiet, --silent       do not print \`checking...' messages
+  --version               print the version of autoconf that created configure
+
+Directory and file names:
+
+  --prefix=PREFIX         install architecture-independent files in PREFIX
+                          [$ac_default_prefix]
+  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX
+                          [same as prefix]
+  --bindir=DIR            user executables in DIR [EPREFIX/bin]
+  --libdir=DIR            object code libraries in DIR [EPREFIX/lib]
+  --includedir=DIR        C header files in DIR [PREFIX/include]
+  --x-includes=DIR        X include files are in DIR
+  --x-libraries=DIR       X library files are in DIR
+  --mandir=DIR            man documentation in DIR [PREFIX/man]
+  --srcdir=DIR            find the sources in DIR [configure dir or ..]
+  --program-prefix=PREFIX prepend PREFIX to installed program names
+  --program-suffix=SUFFIX append SUFFIX to installed program names
+  --program-transform-name=PROGRAM
+                          run sed PROGRAM on installed program names
+EOF
+    cat << EOF
+
+Host type:
+
+  --build=BUILD           configure for building on BUILD [BUILD=HOST]
+  --host=HOST             configure for HOST [guessed]
+  --target=TARGET         configure for TARGET [TARGET=HOST]
+EOF
+    if test -n "$ac_help"; then
+      echo "$ac_help"
+    fi
+    exit 0 ;;
+
+  -host | --host | --hos | --ho)
+    ac_prev=host ;;
+  -host=* | --host=* | --hos=* | --ho=*)
+    host="$ac_optarg" ;;
+
+  -includedir | --includedir | --includedi | --included | --include \
+  | --includ | --inclu | --incl | --inc)
+    ac_prev=includedir ;;
+  -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
+  | --includ=* | --inclu=* | --incl=* | --inc=*)
+    includedir="$ac_optarg" ;;
+
+  -infodir | --infodir | --infodi | --infod | --info | --inf)
+    ac_prev=infodir ;;
+  -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
+    infodir="$ac_optarg" ;;
+
+  -libdir | --libdir | --libdi | --libd)
+    ac_prev=libdir ;;
+  -libdir=* | --libdir=* | --libdi=* | --libd=*)
+    libdir="$ac_optarg" ;;
+
+  -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
+  | --libexe | --libex | --libe)
+    ac_prev=libexecdir ;;
+  -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
+  | --libexe=* | --libex=* | --libe=*)
+    libexecdir="$ac_optarg" ;;
+
+  -localstatedir | --localstatedir | --localstatedi | --localstated \
+  | --localstate | --localstat | --localsta | --localst \
+  | --locals | --local | --loca | --loc | --lo)
+    ac_prev=localstatedir ;;
+  -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+  | --localstate=* | --localstat=* | --localsta=* | --localst=* \
+  | --locals=* | --local=* | --loca=* | --loc=* | --lo=*)
+    localstatedir="$ac_optarg" ;;
+
+  -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
+    ac_prev=mandir ;;
+  -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
+    mandir="$ac_optarg" ;;
+
+  -nfp | --nfp | --nf)
+    # Obsolete; use --without-fp.
+    with_fp=no ;;
+
+  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+  | --no-cr | --no-c)
+    no_create=yes ;;
+
+  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+    no_recursion=yes ;;
+
+  -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
+  | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
+  | --oldin | --oldi | --old | --ol | --o)
+    ac_prev=oldincludedir ;;
+  -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
+  | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
+  | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
+    oldincludedir="$ac_optarg" ;;
+
+  -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+    ac_prev=prefix ;;
+  -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+    prefix="$ac_optarg" ;;
+
+  -program-prefix | --program-prefix | --program-prefi | --program-pref \
+  | --program-pre | --program-pr | --program-p)
+    ac_prev=program_prefix ;;
+  -program-prefix=* | --program-prefix=* | --program-prefi=* \
+  | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
+    program_prefix="$ac_optarg" ;;
+
+  -program-suffix | --program-suffix | --program-suffi | --program-suff \
+  | --program-suf | --program-su | --program-s)
+    ac_prev=program_suffix ;;
+  -program-suffix=* | --program-suffix=* | --program-suffi=* \
+  | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
+    program_suffix="$ac_optarg" ;;
+
+  -program-transform-name | --program-transform-name \
+  | --program-transform-nam | --program-transform-na \
+  | --program-transform-n | --program-transform- \
+  | --program-transform | --program-transfor \
+  | --program-transfo | --program-transf \
+  | --program-trans | --program-tran \
+  | --progr-tra | --program-tr | --program-t)
+    ac_prev=program_transform_name ;;
+  -program-transform-name=* | --program-transform-name=* \
+  | --program-transform-nam=* | --program-transform-na=* \
+  | --program-transform-n=* | --program-transform-=* \
+  | --program-transform=* | --program-transfor=* \
+  | --program-transfo=* | --program-transf=* \
+  | --program-trans=* | --program-tran=* \
+  | --progr-tra=* | --program-tr=* | --program-t=*)
+    program_transform_name="$ac_optarg" ;;
+
+  -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+  | -silent | --silent | --silen | --sile | --sil)
+    silent=yes ;;
+
+  -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
+    ac_prev=sbindir ;;
+  -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
+  | --sbi=* | --sb=*)
+    sbindir="$ac_optarg" ;;
+
+  -sharedstatedir | --sharedstatedir | --sharedstatedi \
+  | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
+  | --sharedst | --shareds | --shared | --share | --shar \
+  | --sha | --sh)
+    ac_prev=sharedstatedir ;;
+  -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
+  | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
+  | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
+  | --sha=* | --sh=*)
+    sharedstatedir="$ac_optarg" ;;
+
+  -site | --site | --sit)
+    ac_prev=site ;;
+  -site=* | --site=* | --sit=*)
+    site="$ac_optarg" ;;
+
+  -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+    ac_prev=srcdir ;;
+  -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+    srcdir="$ac_optarg" ;;
+
+  -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
+  | --syscon | --sysco | --sysc | --sys | --sy)
+    ac_prev=sysconfdir ;;
+  -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
+  | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
+    sysconfdir="$ac_optarg" ;;
+
+  -target | --target | --targe | --targ | --tar | --ta | --t)
+    ac_prev=target ;;
+  -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+    target="$ac_optarg" ;;
+
+  -v | -verbose | --verbose | --verbos | --verbo | --verb)
+    verbose=yes ;;
+
+  -version | --version | --versio | --versi | --vers)
+    echo "configure generated by autoconf version 2.13"
+    exit 0 ;;
+
+  -with-* | --with-*)
+    ac_package=`echo $ac_option|sed -e 's/-*with-//' -e 's/=.*//'`
+    # Reject names that are not valid shell variable names.
+    if test -n "`echo $ac_package| sed 's/[-_a-zA-Z0-9]//g'`"; then
+      { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; }
+    fi
+    ac_package=`echo $ac_package| sed 's/-/_/g'`
+    case "$ac_option" in
+      *=*) ;;
+      *) ac_optarg=yes ;;
+    esac
+    eval "with_${ac_package}='$ac_optarg'" ;;
+
+  -without-* | --without-*)
+    ac_package=`echo $ac_option|sed -e 's/-*without-//'`
+    # Reject names that are not valid shell variable names.
+    if test -n "`echo $ac_package| sed 's/[-a-zA-Z0-9_]//g'`"; then
+      { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; }
+    fi
+    ac_package=`echo $ac_package| sed 's/-/_/g'`
+    eval "with_${ac_package}=no" ;;
+
+  --x)
+    # Obsolete; use --with-x.
+    with_x=yes ;;
+
+  -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
+  | --x-incl | --x-inc | --x-in | --x-i)
+    ac_prev=x_includes ;;
+  -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
+  | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
+    x_includes="$ac_optarg" ;;
+
+  -x-libraries | --x-libraries | --x-librarie | --x-librari \
+  | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
+    ac_prev=x_libraries ;;
+  -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
+  | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
+    x_libraries="$ac_optarg" ;;
+
+  -*) { echo "configure: error: $ac_option: invalid option; use --help to show usage" 1>&2; exit 1; }
+    ;;
+
+  *)
+    if test -n "`echo $ac_option| sed 's/[-a-z0-9.]//g'`"; then
+      echo "configure: warning: $ac_option: invalid host type" 1>&2
+    fi
+    if test "x$nonopt" != xNONE; then
+      { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; }
+    fi
+    nonopt="$ac_option"
+    ;;
+
+  esac
+done
+
+if test -n "$ac_prev"; then
+  { echo "configure: error: missing argument to --`echo $ac_prev | sed 's/_/-/g'`" 1>&2; exit 1; }
+fi
+
+trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15
+
+# File descriptor usage:
+# 0 standard input
+# 1 file creation
+# 2 errors and warnings
+# 3 some systems may open it to /dev/tty
+# 4 used on the Kubota Titan
+# 6 checking for... messages and results
+# 5 compiler messages saved in config.log
+if test "$silent" = yes; then
+  exec 6>/dev/null
+else
+  exec 6>&1
+fi
+exec 5>./config.log
+
+echo "\
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+" 1>&5
+
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Also quote any args containing shell metacharacters.
+ac_configure_args=
+for ac_arg
+do
+  case "$ac_arg" in
+  -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+  | --no-cr | --no-c) ;;
+  -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ;;
+  *" "*|*"     "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*)
+  ac_configure_args="$ac_configure_args '$ac_arg'" ;;
+  *) ac_configure_args="$ac_configure_args $ac_arg" ;;
+  esac
+done
+
+# NLS nuisances.
+# Only set these to C if already set.  These must not be set unconditionally
+# because not all systems understand e.g. LANG=C (notably SCO).
+# Fixing LC_MESSAGES prevents Solaris sh from translating var values in `set'!
+# Non-C LC_CTYPE values break the ctype check.
+if test "${LANG+set}"   = set; then LANG=C;   export LANG;   fi
+if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi
+if test "${LC_MESSAGES+set}" = set; then LC_MESSAGES=C; export LC_MESSAGES; fi
+if test "${LC_CTYPE+set}"    = set; then LC_CTYPE=C;    export LC_CTYPE;    fi
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -rf conftest* confdefs.h
+# AIX cpp loses on an empty file, so make sure it contains at least a newline.
+echo > confdefs.h
+
+# A filename unique to this package, relative to the directory that
+# configure is in, which we can look for to find out if srcdir is correct.
+ac_unique_file=driver/subprocs.c
+
+# Find the source files, if location was not specified.
+if test -z "$srcdir"; then
+  ac_srcdir_defaulted=yes
+  # Try the directory containing this script, then its parent.
+  ac_prog=$0
+  ac_confdir=`echo $ac_prog|sed 's%/[^/][^/]*$%%'`
+  test "x$ac_confdir" = "x$ac_prog" && ac_confdir=.
+  srcdir=$ac_confdir
+  if test ! -r $srcdir/$ac_unique_file; then
+    srcdir=..
+  fi
+else
+  ac_srcdir_defaulted=no
+fi
+if test ! -r $srcdir/$ac_unique_file; then
+  if test "$ac_srcdir_defaulted" = yes; then
+    { echo "configure: error: can not find sources in $ac_confdir or .." 1>&2; exit 1; }
+  else
+    { echo "configure: error: can not find sources in $srcdir" 1>&2; exit 1; }
+  fi
+fi
+srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'`
+
+# Prefer explicitly selected file to automatically selected ones.
+if test -z "$CONFIG_SITE"; then
+  if test "x$prefix" != xNONE; then
+    CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site"
+  else
+    CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
+  fi
+fi
+for ac_site_file in $CONFIG_SITE; do
+  if test -r "$ac_site_file"; then
+    echo "loading site script $ac_site_file"
+    . "$ac_site_file"
+  fi
+done
+
+if test -r "$cache_file"; then
+  echo "loading cache $cache_file"
+  . $cache_file
+else
+  echo "creating cache $cache_file"
+  > $cache_file
+fi
+
+ac_ext=c
+# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+cross_compiling=$ac_cv_prog_cc_cross
+
+ac_exeext=
+ac_objext=o
+if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then
+  # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu.
+  if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then
+    ac_n= ac_c='
+' ac_t='       '
+  else
+    ac_n=-n ac_c= ac_t=
+  fi
+else
+  ac_n= ac_c='\c' ac_t=
+fi
+
+
+
+
+echo "current directory: `pwd`"
+echo "command line was: $0 $@"
+
+
+# After checking to see that --srcdir is correct (which AC_INIT does)
+# check for some random other files that come later in the tar file,
+# to make sure everything is here.
+#
+for d in driver utils hacks hacks/glx ; do
+  f=$srcdir/$d/Makefile.in
+  if test \! -r $f ; then
+    echo ""
+    echo "ERROR: The package is incomplete: $f does not exist."
+    echo "       This probably means that your download was truncated."
+    echo ""
+    exit 1
+  fi
+done
+
+
+###############################################################################
+#
+#       Function to figure out how to run the compiler.
+#
+###############################################################################
+
+
+
+
+###############################################################################
+#
+#       Function to figure out how to create directory trees.
+#
+###############################################################################
+
+
+
+
+###############################################################################
+#
+#       Function to check whether gettimeofday() exists, and how to call it.
+#      This may define HAVE_GETTIMEOFDAY and GETTIMEOFDAY_TWO_ARGS.
+#
+###############################################################################
+
+
+
+
+###############################################################################
+#
+#       Function to find perl5 (defines PERL and PERL_VERSION.)
+#
+###############################################################################
+
+# M4 sucks!!  perl sucks too!!
+
+perl_version_cmd='print $]'
+
+
+
+
+
+###############################################################################
+#
+#       Functions to check how to do ICMP PING requests.
+#
+###############################################################################
+
+
+
+
+
+
+###############################################################################
+#
+#       Functions to check for various X11 crap.
+#
+###############################################################################
+
+# Try and find the app-defaults directory.
+# It sucks that autoconf doesn't do this already...
+#
+
+
+
+
+
+
+
+
+
+
+# Random special-cases for X on certain pathological OSes.
+# You know who you are.
+#
+
+
+
+
+###############################################################################
+#
+#       Some utility functions to make checking for X things easier.
+#
+###############################################################################
+
+# Like AC_CHECK_HEADER, but it uses the already-computed -I directories.
+#
+
+
+# Like AC_EGREP_HEADER, but it uses the already-computed -I directories.
+#
+
+
+# Like AC_TRY_COMPILE, but it uses the already-computed -I directories.
+#
+
+
+
+# Like AC_CHECK_LIB, but it uses the already-computed -I and -L directories.
+# Use this sparingly; it probably doesn't work very well on X programs.
+#
+
+
+# Like AC_TRY_RUN, but it uses the already-computed -I directories.
+# (But not the -L directories!)
+#
+
+
+
+
+# Usage: HANDLE_X_PATH_ARG([variable_name],
+#                          [--command-line-option],
+#                          [descriptive string])
+#
+# All of the --with options take three forms:
+#
+#   --with-foo (or --with-foo=yes)
+#   --without-foo (or --with-foo=no)
+#   --with-foo=/DIR
+#
+# This function, HANDLE_X_PATH_ARG, deals with the /DIR case.  When it sees
+# a directory (string beginning with a slash) it checks to see whether
+# /DIR/include and /DIR/lib exist, and adds them to $X_CFLAGS and $X_LIBS
+# as appropriate.
+#
+
+
+
+
+###############################################################################
+###############################################################################
+#
+#       End of function definitions.  Now start actually executing stuff.
+#
+###############################################################################
+###############################################################################
+
+# random compiler setup
+ac_aux_dir=
+for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do
+  if test -f $ac_dir/install-sh; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/install-sh -c"
+    break
+  elif test -f $ac_dir/install.sh; then
+    ac_aux_dir=$ac_dir
+    ac_install_sh="$ac_aux_dir/install.sh -c"
+    break
+  fi
+done
+if test -z "$ac_aux_dir"; then
+  { echo "configure: error: can not find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." 1>&2; exit 1; }
+fi
+ac_config_guess=$ac_aux_dir/config.guess
+ac_config_sub=$ac_aux_dir/config.sub
+ac_configure=$ac_aux_dir/configure # This should be Cygnus configure.
+
+
+# Make sure we can run config.sub.
+if ${CONFIG_SHELL-/bin/sh} $ac_config_sub sun4 >/dev/null 2>&1; then :
+else { echo "configure: error: can not run $ac_config_sub" 1>&2; exit 1; }
+fi
+
+echo $ac_n "checking host system type""... $ac_c" 1>&6
+echo "configure:801: checking host system type" >&5
+
+host_alias=$host
+case "$host_alias" in
+NONE)
+  case $nonopt in
+  NONE)
+    if host_alias=`${CONFIG_SHELL-/bin/sh} $ac_config_guess`; then :
+    else { echo "configure: error: can not guess host type; you must specify one" 1>&2; exit 1; }
+    fi ;;
+  *) host_alias=$nonopt ;;
+  esac ;;
+esac
+
+host=`${CONFIG_SHELL-/bin/sh} $ac_config_sub $host_alias`
+host_cpu=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+host_vendor=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+host_os=`echo $host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+echo "$ac_t""$host" 1>&6
+
+# Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:824: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+  IFS="${IFS=  }"; ac_save_ifs="$IFS"; IFS=":"
+  ac_dummy="$PATH"
+  for ac_dir in $ac_dummy; do
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/$ac_word; then
+      ac_cv_prog_CC="gcc"
+      break
+    fi
+  done
+  IFS="$ac_save_ifs"
+fi
+fi
+CC="$ac_cv_prog_CC"
+if test -n "$CC"; then
+  echo "$ac_t""$CC" 1>&6
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+if test -z "$CC"; then
+  # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:854: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+  IFS="${IFS=  }"; ac_save_ifs="$IFS"; IFS=":"
+  ac_prog_rejected=no
+  ac_dummy="$PATH"
+  for ac_dir in $ac_dummy; do
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/$ac_word; then
+      if test "$ac_dir/$ac_word" = "/usr/ucb/cc"; then
+        ac_prog_rejected=yes
+       continue
+      fi
+      ac_cv_prog_CC="cc"
+      break
+    fi
+  done
+  IFS="$ac_save_ifs"
+if test $ac_prog_rejected = yes; then
+  # We found a bogon in the path, so make sure we never use it.
+  set dummy $ac_cv_prog_CC
+  shift
+  if test $# -gt 0; then
+    # We chose a different compiler from the bogus one.
+    # However, it has the same basename, so the bogon will be chosen
+    # first if we set CC to just the basename; use the full file name.
+    shift
+    set dummy "$ac_dir/$ac_word" "$@"
+    shift
+    ac_cv_prog_CC="$@"
+  fi
+fi
+fi
+fi
+CC="$ac_cv_prog_CC"
+if test -n "$CC"; then
+  echo "$ac_t""$CC" 1>&6
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+  if test -z "$CC"; then
+    case "`uname -s`" in
+    *win32* | *WIN32*)
+      # Extract the first word of "cl", so it can be a program name with args.
+set dummy cl; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:905: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  if test -n "$CC"; then
+  ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+  IFS="${IFS=  }"; ac_save_ifs="$IFS"; IFS=":"
+  ac_dummy="$PATH"
+  for ac_dir in $ac_dummy; do
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/$ac_word; then
+      ac_cv_prog_CC="cl"
+      break
+    fi
+  done
+  IFS="$ac_save_ifs"
+fi
+fi
+CC="$ac_cv_prog_CC"
+if test -n "$CC"; then
+  echo "$ac_t""$CC" 1>&6
+else
+  echo "$ac_t""no" 1>&6
+fi
+ ;;
+    esac
+  fi
+  test -z "$CC" && { echo "configure: error: no acceptable cc found in \$PATH" 1>&2; exit 1; }
+fi
+
+echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6
+echo "configure:937: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5
+
+ac_ext=c
+# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+cross_compiling=$ac_cv_prog_cc_cross
+
+cat > conftest.$ac_ext << EOF
+
+#line 948 "configure"
+#include "confdefs.h"
+
+main(){return(0);}
+EOF
+if { (eval echo configure:953: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  ac_cv_prog_cc_works=yes
+  # If we can't run a trivial program, we are probably using a cross compiler.
+  if (./conftest; exit) 2>/dev/null; then
+    ac_cv_prog_cc_cross=no
+  else
+    ac_cv_prog_cc_cross=yes
+  fi
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  ac_cv_prog_cc_works=no
+fi
+rm -fr conftest*
+ac_ext=c
+# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5'
+ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5'
+cross_compiling=$ac_cv_prog_cc_cross
+
+echo "$ac_t""$ac_cv_prog_cc_works" 1>&6
+if test $ac_cv_prog_cc_works = no; then
+  { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; }
+fi
+echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6
+echo "configure:979: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5
+echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6
+cross_compiling=$ac_cv_prog_cc_cross
+
+echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6
+echo "configure:984: checking whether we are using GNU C" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.c <<EOF
+#ifdef __GNUC__
+  yes;
+#endif
+EOF
+if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:993: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
+  ac_cv_prog_gcc=yes
+else
+  ac_cv_prog_gcc=no
+fi
+fi
+
+echo "$ac_t""$ac_cv_prog_gcc" 1>&6
+
+if test $ac_cv_prog_gcc = yes; then
+  GCC=yes
+else
+  GCC=
+fi
+
+ac_test_CFLAGS="${CFLAGS+set}"
+ac_save_CFLAGS="$CFLAGS"
+CFLAGS=
+echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6
+echo "configure:1012: checking whether ${CC-cc} accepts -g" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  echo 'void f(){}' > conftest.c
+if test -z "`${CC-cc} -g -c conftest.c 2>&1`"; then
+  ac_cv_prog_cc_g=yes
+else
+  ac_cv_prog_cc_g=no
+fi
+rm -f conftest*
+
+fi
+
+echo "$ac_t""$ac_cv_prog_cc_g" 1>&6
+if test "$ac_test_CFLAGS" = set; then
+  CFLAGS="$ac_save_CFLAGS"
+elif test $ac_cv_prog_cc_g = yes; then
+  if test "$GCC" = yes; then
+    CFLAGS="-g -O2"
+  else
+    CFLAGS="-g"
+  fi
+else
+  if test "$GCC" = yes; then
+    CFLAGS="-O2"
+  else
+    CFLAGS=
+  fi
+fi
+
+
+  if test -z "$GCC"; then
+    echo $ac_n "checking how to request ANSI compilation""... $ac_c" 1>&6
+echo "configure:1046: checking how to request ANSI compilation" >&5
+    case "$host" in
+      *-hpux* )
+        echo "$ac_t""HPUX: adding -Ae" 1>&6
+        CC="$CC -Ae"
+      ;;
+      *-aix* )
+        echo "$ac_t""AIX: adding -qlanglvl=ansi -qhalt=e" 1>&6
+        CC="$CC -qlanglvl=ansi -qhalt=e"
+      ;;
+
+      *-dec-* )
+        echo "$ac_t""DEC: adding -std1" 1>&6
+        CC="$CC -std1"
+      ;;
+
+      *)
+        echo "$ac_t""no idea" 1>&6
+      ;;
+    esac
+  fi
+
+  echo $ac_n "checking whether the compiler works on ANSI C""... $ac_c" 1>&6
+echo "configure:1069: checking whether the compiler works on ANSI C" >&5
+  if test "$cross_compiling" = yes; then
+  { echo "configure: error: Couldn't build even a trivial ANSI C program: check CC." 1>&2; exit 1; }
+else
+  cat > conftest.$ac_ext <<EOF
+#line 1074 "configure"
+#include "confdefs.h"
+ main(int ac, char **av) { return 0; } 
+EOF
+if { (eval echo configure:1078: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+then
+  echo "$ac_t""yes" 1>&6
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -fr conftest*
+  echo "$ac_t""no" 1>&6
+     { echo "configure: error: Couldn't build even a trivial ANSI C program: check CC." 1>&2; exit 1; }
+fi
+rm -fr conftest*
+fi
+
+
+  if test -n "$GCC"; then
+    echo "$ac_t""Turning on gcc compiler warnings." 1>&6
+    CC="$CC -Wall -Wstrict-prototypes -Wnested-externs -Wno-format"
+  else
+    case "$host" in
+      *-irix5* |*-irix6.0-3* )
+        echo "$ac_t""Turning on SGI compiler warnings." 1>&6
+        CC="$CC -fullwarn -use_readonly_const -rdata_shared -g3"
+      ;;
+#     *-dec-osf* )
+#       if test -z "$GCC"; then
+#         AC_MSG_RESULT(Turning on DEC C compiler warnings.)
+#         CC="$CC -migrate -w0 -verbose -warnprotos"
+#       fi
+#     ;;
+    esac
+  fi
+
+echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6
+echo "configure:1111: checking how to run the C preprocessor" >&5
+# On Suns, sometimes $CPP names a directory.
+if test -n "$CPP" && test -d "$CPP"; then
+  CPP=
+fi
+if test -z "$CPP"; then
+if eval "test \"`echo '$''{'ac_cv_prog_CPP'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+    # This must be in double quotes, not single quotes, because CPP may get
+  # substituted into the Makefile and "${CC-cc}" will confuse make.
+  CPP="${CC-cc} -E"
+  # On the NeXT, cc -E runs the code through the compiler's parser,
+  # not just through cpp.
+  cat > conftest.$ac_ext <<EOF
+#line 1126 "configure"
+#include "confdefs.h"
+#include <assert.h>
+Syntax Error
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:1132: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+  :
+else
+  echo "$ac_err" >&5
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  CPP="${CC-cc} -E -traditional-cpp"
+  cat > conftest.$ac_ext <<EOF
+#line 1143 "configure"
+#include "confdefs.h"
+#include <assert.h>
+Syntax Error
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:1149: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+  :
+else
+  echo "$ac_err" >&5
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  CPP="${CC-cc} -nologo -E"
+  cat > conftest.$ac_ext <<EOF
+#line 1160 "configure"
+#include "confdefs.h"
+#include <assert.h>
+Syntax Error
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:1166: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+  :
+else
+  echo "$ac_err" >&5
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  CPP=/lib/cpp
+fi
+rm -f conftest*
+fi
+rm -f conftest*
+fi
+rm -f conftest*
+  ac_cv_prog_CPP="$CPP"
+fi
+  CPP="$ac_cv_prog_CPP"
+else
+  ac_cv_prog_CPP="$CPP"
+fi
+echo "$ac_t""$CPP" 1>&6
+
+echo $ac_n "checking for working const""... $ac_c" 1>&6
+echo "configure:1191: checking for working const" >&5
+if eval "test \"`echo '$''{'ac_cv_c_const'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 1196 "configure"
+#include "confdefs.h"
+
+int main() {
+
+/* Ultrix mips cc rejects this.  */
+typedef int charset[2]; const charset x;
+/* SunOS 4.1.1 cc rejects this.  */
+char const *const *ccp;
+char **p;
+/* NEC SVR4.0.2 mips cc rejects this.  */
+struct point {int x, y;};
+static struct point const zero = {0,0};
+/* AIX XL C 1.02.0.0 rejects this.
+   It does not let you subtract one const X* pointer from another in an arm
+   of an if-expression whose if-part is not a constant expression */
+const char *g = "string";
+ccp = &g + (g ? g-g : 0);
+/* HPUX 7.0 cc rejects these. */
+++ccp;
+p = (char**) ccp;
+ccp = (char const *const *) p;
+{ /* SCO 3.2v4 cc rejects this.  */
+  char *t;
+  char const *s = 0 ? (char *) 0 : (char const *) 0;
+
+  *t++ = 0;
+}
+{ /* Someone thinks the Sun supposedly-ANSI compiler will reject this.  */
+  int x[] = {25, 17};
+  const int *foo = &x[0];
+  ++foo;
+}
+{ /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */
+  typedef const int *iptr;
+  iptr p = 0;
+  ++p;
+}
+{ /* AIX XL C 1.02.0.0 rejects this saying
+     "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */
+  struct s { int j; const int *ap[3]; };
+  struct s *b; b->j = 5;
+}
+{ /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */
+  const int foo = 10;
+}
+
+; return 0; }
+EOF
+if { (eval echo configure:1245: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+  rm -rf conftest*
+  ac_cv_c_const=yes
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  ac_cv_c_const=no
+fi
+rm -f conftest*
+fi
+
+echo "$ac_t""$ac_cv_c_const" 1>&6
+if test $ac_cv_c_const = no; then
+  cat >> confdefs.h <<\EOF
+#define const 
+EOF
+
+fi
+
+echo $ac_n "checking for inline""... $ac_c" 1>&6
+echo "configure:1266: checking for inline" >&5
+if eval "test \"`echo '$''{'ac_cv_c_inline'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  ac_cv_c_inline=no
+for ac_kw in inline __inline__ __inline; do
+  cat > conftest.$ac_ext <<EOF
+#line 1273 "configure"
+#include "confdefs.h"
+
+int main() {
+} $ac_kw foo() {
+; return 0; }
+EOF
+if { (eval echo configure:1280: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+  rm -rf conftest*
+  ac_cv_c_inline=$ac_kw; break
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+fi
+rm -f conftest*
+done
+
+fi
+
+echo "$ac_t""$ac_cv_c_inline" 1>&6
+case "$ac_cv_c_inline" in
+  inline | yes) ;;
+  no) cat >> confdefs.h <<\EOF
+#define inline 
+EOF
+ ;;
+  *)  cat >> confdefs.h <<EOF
+#define inline $ac_cv_c_inline
+EOF
+ ;;
+esac
+
+
+# stuff for Makefiles
+# Find a good install program.  We prefer a C program (faster),
+# so one script is as good as another.  But avoid the broken or
+# incompatible versions:
+# SysV /etc/install, /usr/sbin/install
+# SunOS /usr/etc/install
+# IRIX /sbin/install
+# AIX /bin/install
+# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
+# AFS /usr/afsws/bin/install, which mishandles nonexistent args
+# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+# ./install, which can be erroneously created by make from ./install.sh.
+echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6
+echo "configure:1319: checking for a BSD compatible install" >&5
+if test -z "$INSTALL"; then
+if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+    IFS="${IFS=        }"; ac_save_IFS="$IFS"; IFS=":"
+  for ac_dir in $PATH; do
+    # Account for people who put trailing slashes in PATH elements.
+    case "$ac_dir/" in
+    /|./|.//|/etc/*|/usr/sbin/*|/usr/etc/*|/sbin/*|/usr/afsws/bin/*|/usr/ucb/*) ;;
+    *)
+      # OSF1 and SCO ODT 3.0 have their own names for install.
+      # Don't use installbsd from OSF since it installs stuff as root
+      # by default.
+      for ac_prog in ginstall scoinst install; do
+        if test -f $ac_dir/$ac_prog; then
+         if test $ac_prog = install &&
+            grep dspmsg $ac_dir/$ac_prog >/dev/null 2>&1; then
+           # AIX install.  It has an incompatible calling convention.
+           :
+         else
+           ac_cv_path_install="$ac_dir/$ac_prog -c"
+           break 2
+         fi
+       fi
+      done
+      ;;
+    esac
+  done
+  IFS="$ac_save_IFS"
+
+fi
+  if test "${ac_cv_path_install+set}" = set; then
+    INSTALL="$ac_cv_path_install"
+  else
+    # As a last resort, use the slow shell script.  We don't cache a
+    # path for INSTALL within a source directory, because that will
+    # break other packages using the cache if that directory is
+    # removed, or if the path is relative.
+    INSTALL="$ac_install_sh"
+  fi
+fi
+echo "$ac_t""$INSTALL" 1>&6
+
+# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
+# It thinks the first close brace ends the variable substitution.
+test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
+
+test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL_PROGRAM}'
+
+test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
+
+echo $ac_n "checking whether \"\${INSTALL} -d\" creates intermediate directories""... $ac_c" 1>&6
+echo "configure:1372: checking whether \"\${INSTALL} -d\" creates intermediate directories" >&5
+if eval "test \"`echo '$''{'ac_cv_install_d_creates_dirs'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  ac_cv_install_d_creates_dirs=no
+     rm -rf conftestdir
+     if mkdir conftestdir; then
+       cd conftestdir >&-
+       ${INSTALL} -d `pwd`/dir1/dir2 >&- 2>&-
+       if test -d dir1/dir2/. ; then
+         ac_cv_install_d_creates_dirs=yes
+       fi
+       cd .. >&-
+       rm -rf conftestdir
+     fi
+    
+fi
+
+echo "$ac_t""$ac_cv_install_d_creates_dirs" 1>&6
+
+  if test "$ac_cv_install_d_creates_dirs" = no ; then
+    echo $ac_n "checking whether \"mkdir -p\" creates intermediate directories""... $ac_c" 1>&6
+echo "configure:1394: checking whether \"mkdir -p\" creates intermediate directories" >&5
+if eval "test \"`echo '$''{'ac_cv_mkdir_p_creates_dirs'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  ac_cv_mkdir_p_creates_dirs=no
+       rm -rf conftestdir
+       if mkdir conftestdir; then
+         cd conftestdir >&-
+         mkdir -p dir1/dir2 >&- 2>&-
+         if test -d dir1/dir2/. ; then
+           ac_cv_mkdir_p_creates_dirs=yes
+         fi
+         cd .. >&-
+         rm -rf conftestdir
+       fi
+      
+fi
+
+echo "$ac_t""$ac_cv_mkdir_p_creates_dirs" 1>&6
+  fi
+
+  if test "$ac_cv_install_d_creates_dirs" = yes ; then
+    INSTALL_DIRS='${INSTALL} -d'
+  elif test "$ac_cv_mkdir_p_creates_dirs" = yes ; then
+    INSTALL_DIRS='mkdir -p'
+  else
+    # any other ideas?
+    INSTALL_DIRS='${INSTALL} -d'
+  fi
+
+echo $ac_n "checking whether ${MAKE-make} sets \${MAKE}""... $ac_c" 1>&6
+echo "configure:1425: checking whether ${MAKE-make} sets \${MAKE}" >&5
+set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_prog_make_${ac_make}_set'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftestmake <<\EOF
+all:
+       @echo 'ac_maketemp="${MAKE}"'
+EOF
+# GNU make sometimes prints "make[1]: Entering...", which would confuse us.
+eval `${MAKE-make} -f conftestmake 2>/dev/null | grep temp=`
+if test -n "$ac_maketemp"; then
+  eval ac_cv_prog_make_${ac_make}_set=yes
+else
+  eval ac_cv_prog_make_${ac_make}_set=no
+fi
+rm -f conftestmake
+fi
+if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  SET_MAKE=
+else
+  echo "$ac_t""no" 1>&6
+  SET_MAKE="MAKE=${MAKE-make}"
+fi
+
+
+# random libc stuff
+echo $ac_n "checking for ANSI C header files""... $ac_c" 1>&6
+echo "configure:1454: checking for ANSI C header files" >&5
+if eval "test \"`echo '$''{'ac_cv_header_stdc'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 1459 "configure"
+#include "confdefs.h"
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <float.h>
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:1467: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+  rm -rf conftest*
+  ac_cv_header_stdc=yes
+else
+  echo "$ac_err" >&5
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+if test $ac_cv_header_stdc = yes; then
+  # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
+cat > conftest.$ac_ext <<EOF
+#line 1484 "configure"
+#include "confdefs.h"
+#include <string.h>
+EOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  egrep "memchr" >/dev/null 2>&1; then
+  :
+else
+  rm -rf conftest*
+  ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+  # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
+cat > conftest.$ac_ext <<EOF
+#line 1502 "configure"
+#include "confdefs.h"
+#include <stdlib.h>
+EOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  egrep "free" >/dev/null 2>&1; then
+  :
+else
+  rm -rf conftest*
+  ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+  # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
+if test "$cross_compiling" = yes; then
+  :
+else
+  cat > conftest.$ac_ext <<EOF
+#line 1523 "configure"
+#include "confdefs.h"
+#include <ctype.h>
+#define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
+#define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
+#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
+int main () { int i; for (i = 0; i < 256; i++)
+if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) exit(2);
+exit (0); }
+
+EOF
+if { (eval echo configure:1534: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+then
+  :
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -fr conftest*
+  ac_cv_header_stdc=no
+fi
+rm -fr conftest*
+fi
+
+fi
+fi
+
+echo "$ac_t""$ac_cv_header_stdc" 1>&6
+if test $ac_cv_header_stdc = yes; then
+  cat >> confdefs.h <<\EOF
+#define STDC_HEADERS 1
+EOF
+
+fi
+
+for ac_hdr in unistd.h
+do
+ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
+echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
+echo "configure:1561: checking for $ac_hdr" >&5
+if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 1566 "configure"
+#include "confdefs.h"
+#include <$ac_hdr>
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:1571: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+  rm -rf conftest*
+  eval "ac_cv_header_$ac_safe=yes"
+else
+  echo "$ac_err" >&5
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_header_$ac_safe=no"
+fi
+rm -f conftest*
+fi
+if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+    ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'`
+  cat >> confdefs.h <<EOF
+#define $ac_tr_hdr 1
+EOF
+else
+  echo "$ac_t""no" 1>&6
+fi
+done
+
+echo $ac_n "checking for mode_t""... $ac_c" 1>&6
+echo "configure:1598: checking for mode_t" >&5
+if eval "test \"`echo '$''{'ac_cv_type_mode_t'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 1603 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+#if STDC_HEADERS
+#include <stdlib.h>
+#include <stddef.h>
+#endif
+EOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  egrep "(^|[^a-zA-Z_0-9])mode_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then
+  rm -rf conftest*
+  ac_cv_type_mode_t=yes
+else
+  rm -rf conftest*
+  ac_cv_type_mode_t=no
+fi
+rm -f conftest*
+
+fi
+echo "$ac_t""$ac_cv_type_mode_t" 1>&6
+if test $ac_cv_type_mode_t = no; then
+  cat >> confdefs.h <<\EOF
+#define mode_t int
+EOF
+
+fi
+
+echo $ac_n "checking for pid_t""... $ac_c" 1>&6
+echo "configure:1631: checking for pid_t" >&5
+if eval "test \"`echo '$''{'ac_cv_type_pid_t'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 1636 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+#if STDC_HEADERS
+#include <stdlib.h>
+#include <stddef.h>
+#endif
+EOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  egrep "(^|[^a-zA-Z_0-9])pid_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then
+  rm -rf conftest*
+  ac_cv_type_pid_t=yes
+else
+  rm -rf conftest*
+  ac_cv_type_pid_t=no
+fi
+rm -f conftest*
+
+fi
+echo "$ac_t""$ac_cv_type_pid_t" 1>&6
+if test $ac_cv_type_pid_t = no; then
+  cat >> confdefs.h <<\EOF
+#define pid_t int
+EOF
+
+fi
+
+echo $ac_n "checking for size_t""... $ac_c" 1>&6
+echo "configure:1664: checking for size_t" >&5
+if eval "test \"`echo '$''{'ac_cv_type_size_t'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 1669 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+#if STDC_HEADERS
+#include <stdlib.h>
+#include <stddef.h>
+#endif
+EOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  egrep "(^|[^a-zA-Z_0-9])size_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then
+  rm -rf conftest*
+  ac_cv_type_size_t=yes
+else
+  rm -rf conftest*
+  ac_cv_type_size_t=no
+fi
+rm -f conftest*
+
+fi
+echo "$ac_t""$ac_cv_type_size_t" 1>&6
+if test $ac_cv_type_size_t = no; then
+  cat >> confdefs.h <<\EOF
+#define size_t unsigned
+EOF
+
+fi
+
+echo $ac_n "checking return type of signal handlers""... $ac_c" 1>&6
+echo "configure:1697: checking return type of signal handlers" >&5
+if eval "test \"`echo '$''{'ac_cv_type_signal'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 1702 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+#include <signal.h>
+#ifdef signal
+#undef signal
+#endif
+#ifdef __cplusplus
+extern "C" void (*signal (int, void (*)(int)))(int);
+#else
+void (*signal ()) ();
+#endif
+
+int main() {
+int i;
+; return 0; }
+EOF
+if { (eval echo configure:1719: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+  rm -rf conftest*
+  ac_cv_type_signal=void
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  ac_cv_type_signal=int
+fi
+rm -f conftest*
+fi
+
+echo "$ac_t""$ac_cv_type_signal" 1>&6
+cat >> confdefs.h <<EOF
+#define RETSIGTYPE $ac_cv_type_signal
+EOF
+
+
+echo $ac_n "checking whether time.h and sys/time.h may both be included""... $ac_c" 1>&6
+echo "configure:1738: checking whether time.h and sys/time.h may both be included" >&5
+if eval "test \"`echo '$''{'ac_cv_header_time'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 1743 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+#include <sys/time.h>
+#include <time.h>
+int main() {
+struct tm *tp;
+; return 0; }
+EOF
+if { (eval echo configure:1752: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+  rm -rf conftest*
+  ac_cv_header_time=yes
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  ac_cv_header_time=no
+fi
+rm -f conftest*
+fi
+
+echo "$ac_t""$ac_cv_header_time" 1>&6
+if test $ac_cv_header_time = yes; then
+  cat >> confdefs.h <<\EOF
+#define TIME_WITH_SYS_TIME 1
+EOF
+
+fi
+
+echo $ac_n "checking for sys/wait.h that is POSIX.1 compatible""... $ac_c" 1>&6
+echo "configure:1773: checking for sys/wait.h that is POSIX.1 compatible" >&5
+if eval "test \"`echo '$''{'ac_cv_header_sys_wait_h'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 1778 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+#include <sys/wait.h>
+#ifndef WEXITSTATUS
+#define WEXITSTATUS(stat_val) ((unsigned)(stat_val) >> 8)
+#endif
+#ifndef WIFEXITED
+#define WIFEXITED(stat_val) (((stat_val) & 255) == 0)
+#endif
+int main() {
+int s;
+wait (&s);
+s = WIFEXITED (s) ? WEXITSTATUS (s) : 1;
+; return 0; }
+EOF
+if { (eval echo configure:1794: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+  rm -rf conftest*
+  ac_cv_header_sys_wait_h=yes
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  ac_cv_header_sys_wait_h=no
+fi
+rm -f conftest*
+fi
+
+echo "$ac_t""$ac_cv_header_sys_wait_h" 1>&6
+if test $ac_cv_header_sys_wait_h = yes; then
+  cat >> confdefs.h <<\EOF
+#define HAVE_SYS_WAIT_H 1
+EOF
+
+fi
+
+ac_header_dirent=no
+for ac_hdr in dirent.h sys/ndir.h sys/dir.h ndir.h
+do
+ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
+echo $ac_n "checking for $ac_hdr that defines DIR""... $ac_c" 1>&6
+echo "configure:1819: checking for $ac_hdr that defines DIR" >&5
+if eval "test \"`echo '$''{'ac_cv_header_dirent_$ac_safe'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 1824 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+#include <$ac_hdr>
+int main() {
+DIR *dirp = 0;
+; return 0; }
+EOF
+if { (eval echo configure:1832: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+  rm -rf conftest*
+  eval "ac_cv_header_dirent_$ac_safe=yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_header_dirent_$ac_safe=no"
+fi
+rm -f conftest*
+fi
+if eval "test \"`echo '$ac_cv_header_dirent_'$ac_safe`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+    ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'`
+  cat >> confdefs.h <<EOF
+#define $ac_tr_hdr 1
+EOF
+ ac_header_dirent=$ac_hdr; break
+else
+  echo "$ac_t""no" 1>&6
+fi
+done
+# Two versions of opendir et al. are in -ldir and -lx on SCO Xenix.
+if test $ac_header_dirent = dirent.h; then
+echo $ac_n "checking for opendir in -ldir""... $ac_c" 1>&6
+echo "configure:1857: checking for opendir in -ldir" >&5
+ac_lib_var=`echo dir'_'opendir | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  ac_save_LIBS="$LIBS"
+LIBS="-ldir  $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 1865 "configure"
+#include "confdefs.h"
+/* Override any gcc2 internal prototype to avoid an error.  */
+/* We use char because int might match the return type of a gcc2
+    builtin and then its argument prototype would still apply.  */
+char opendir();
+
+int main() {
+opendir()
+; return 0; }
+EOF
+if { (eval echo configure:1876: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  eval "ac_cv_lib_$ac_lib_var=yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_lib_$ac_lib_var=no"
+fi
+rm -f conftest*
+LIBS="$ac_save_LIBS"
+
+fi
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  LIBS="$LIBS -ldir"
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+else
+echo $ac_n "checking for opendir in -lx""... $ac_c" 1>&6
+echo "configure:1898: checking for opendir in -lx" >&5
+ac_lib_var=`echo x'_'opendir | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  ac_save_LIBS="$LIBS"
+LIBS="-lx  $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 1906 "configure"
+#include "confdefs.h"
+/* Override any gcc2 internal prototype to avoid an error.  */
+/* We use char because int might match the return type of a gcc2
+    builtin and then its argument prototype would still apply.  */
+char opendir();
+
+int main() {
+opendir()
+; return 0; }
+EOF
+if { (eval echo configure:1917: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  eval "ac_cv_lib_$ac_lib_var=yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_lib_$ac_lib_var=no"
+fi
+rm -f conftest*
+LIBS="$ac_save_LIBS"
+
+fi
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  LIBS="$LIBS -lx"
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+fi
+
+echo $ac_n "checking how to call gettimeofday""... $ac_c" 1>&6
+echo "configure:1940: checking how to call gettimeofday" >&5
+  if eval "test \"`echo '$''{'ac_cv_gettimeofday_args'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 1945 "configure"
+#include "confdefs.h"
+#include <stdlib.h>
+                    #include <sys/time.h>
+int main() {
+struct timeval tv; struct timezone tzp;
+                    gettimeofday(&tv, &tzp);
+; return 0; }
+EOF
+if { (eval echo configure:1954: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+  rm -rf conftest*
+  ac_gettimeofday_args=2
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  cat > conftest.$ac_ext <<EOF
+#line 1962 "configure"
+#include "confdefs.h"
+#include <stdlib.h>
+                                    #include <sys/time.h>
+int main() {
+struct timeval tv; gettimeofday(&tv);
+; return 0; }
+EOF
+if { (eval echo configure:1970: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+  rm -rf conftest*
+  ac_gettimeofday_args=1
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  ac_gettimeofday_args=0
+fi
+rm -f conftest*
+fi
+rm -f conftest*
+    ac_cv_gettimeofday_args=$ac_gettimeofday_args
+fi
+
+  ac_gettimeofday_args=$ac_cv_gettimeofday_args
+  if test "$ac_gettimeofday_args" = 1 ; then
+    cat >> confdefs.h <<\EOF
+#define HAVE_GETTIMEOFDAY 1
+EOF
+
+    echo "$ac_t""one argument" 1>&6
+  elif test "$ac_gettimeofday_args" = 2 ; then
+    cat >> confdefs.h <<\EOF
+#define HAVE_GETTIMEOFDAY 1
+EOF
+
+    cat >> confdefs.h <<\EOF
+#define GETTIMEOFDAY_TWO_ARGS 1
+EOF
+
+    echo "$ac_t""two arguments" 1>&6
+  else
+    echo "$ac_t""unknown" 1>&6
+  fi
+
+for ac_func in select fcntl uname nice setpriority getcwd getwd putenv
+do
+echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
+echo "configure:2009: checking for $ac_func" >&5
+if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 2014 "configure"
+#include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char $ac_func(); below.  */
+#include <assert.h>
+/* Override any gcc2 internal prototype to avoid an error.  */
+/* We use char because int might match the return type of a gcc2
+    builtin and then its argument prototype would still apply.  */
+char $ac_func();
+
+int main() {
+
+/* The GNU C library defines this for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+choke me
+#else
+$ac_func();
+#endif
+
+; return 0; }
+EOF
+if { (eval echo configure:2037: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  eval "ac_cv_func_$ac_func=yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_func_$ac_func=no"
+fi
+rm -f conftest*
+fi
+
+if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+    ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
+  cat >> confdefs.h <<EOF
+#define $ac_tr_func 1
+EOF
+else
+  echo "$ac_t""no" 1>&6
+fi
+done
+
+
+for ac_func in sigaction syslog realpath
+do
+echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
+echo "configure:2065: checking for $ac_func" >&5
+if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 2070 "configure"
+#include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char $ac_func(); below.  */
+#include <assert.h>
+/* Override any gcc2 internal prototype to avoid an error.  */
+/* We use char because int might match the return type of a gcc2
+    builtin and then its argument prototype would still apply.  */
+char $ac_func();
+
+int main() {
+
+/* The GNU C library defines this for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+choke me
+#else
+$ac_func();
+#endif
+
+; return 0; }
+EOF
+if { (eval echo configure:2093: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  eval "ac_cv_func_$ac_func=yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_func_$ac_func=no"
+fi
+rm -f conftest*
+fi
+
+if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+    ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'`
+  cat >> confdefs.h <<EOF
+#define $ac_tr_func 1
+EOF
+else
+  echo "$ac_t""no" 1>&6
+fi
+done
+
+echo $ac_n "checking for struct icmp""... $ac_c" 1>&6
+echo "configure:2118: checking for struct icmp" >&5
+if eval "test \"`echo '$''{'ac_cv_have_icmp'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 2123 "configure"
+#include "confdefs.h"
+#include <stdlib.h>
+                   #include <stdio.h>
+                   #include <math.h>
+                   #include <unistd.h>
+                   #include <limits.h>
+                   #include <signal.h>
+                   #include <fcntl.h>
+                   #include <sys/types.h>
+                   #include <sys/time.h>
+                   #include <sys/ipc.h>
+                   #include <sys/shm.h>
+                   #include <sys/socket.h>
+                   #include <netinet/in_systm.h>
+                   #include <netinet/in.h>
+                   #include <netinet/ip.h>
+                   #include <netinet/ip_icmp.h>
+                   #include <netinet/udp.h>
+                   #include <arpa/inet.h>
+                   #include <netdb.h>
+int main() {
+struct icmp i;
+                   struct sockaddr s;
+                   struct sockaddr_in si;
+                   struct ip ip;
+                   i.icmp_type = ICMP_ECHO;
+                   i.icmp_code = 0;
+                   i.icmp_cksum = 0;
+                   i.icmp_id = 0;
+                   i.icmp_seq = 0;
+                   si.sin_family = AF_INET;
+                   ip.ip_hl = 0;
+; return 0; }
+EOF
+if { (eval echo configure:2158: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+  rm -rf conftest*
+  ac_cv_have_icmp=yes
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  ac_cv_have_icmp=no
+fi
+rm -f conftest*
+fi
+
+echo "$ac_t""$ac_cv_have_icmp" 1>&6
+ if test "$ac_cv_have_icmp" = yes ; then
+   cat >> confdefs.h <<\EOF
+#define HAVE_ICMP 1
+EOF
+
+ fi
+echo $ac_n "checking for struct icmphdr""... $ac_c" 1>&6
+echo "configure:2178: checking for struct icmphdr" >&5
+if eval "test \"`echo '$''{'ac_cv_have_icmphdr'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 2183 "configure"
+#include "confdefs.h"
+#include <stdlib.h>
+                   #include <stdio.h>
+                   #include <math.h>
+                   #include <unistd.h>
+                   #include <limits.h>
+                   #include <signal.h>
+                   #include <fcntl.h>
+                   #include <sys/types.h>
+                   #include <sys/time.h>
+                   #include <sys/ipc.h>
+                   #include <sys/shm.h>
+                   #include <sys/socket.h>
+                   #include <netinet/in_systm.h>
+                   #include <netinet/in.h>
+                   #include <netinet/ip.h>
+                   #include <netinet/ip_icmp.h>
+                   #include <netinet/udp.h>
+                   #include <arpa/inet.h>
+                   #include <netdb.h>
+int main() {
+struct icmphdr i;
+                   struct sockaddr s;
+                   struct sockaddr_in si;
+                   struct ip ip;
+                   i.type = ICMP_ECHO;
+                   i.code = 0;
+                   i.cksum = 0;
+                   i.un.echo.id = 0;
+                   i.un.echo.sequence = 0;
+                   si.sin_family = AF_INET;
+                   ip.ip_hl = 0;
+; return 0; }
+EOF
+if { (eval echo configure:2218: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+  rm -rf conftest*
+  ac_cv_have_icmphdr=yes
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  ac_cv_have_icmphdr=no
+fi
+rm -f conftest*
+fi
+
+echo "$ac_t""$ac_cv_have_icmphdr" 1>&6
+ if test "$ac_cv_have_icmphdr" = yes ; then
+   cat >> confdefs.h <<\EOF
+#define HAVE_ICMPHDR 1
+EOF
+
+ fi
+for ac_hdr in crypt.h sys/select.h
+do
+ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
+echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
+echo "configure:2241: checking for $ac_hdr" >&5
+if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 2246 "configure"
+#include "confdefs.h"
+#include <$ac_hdr>
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:2251: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+  rm -rf conftest*
+  eval "ac_cv_header_$ac_safe=yes"
+else
+  echo "$ac_err" >&5
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_header_$ac_safe=no"
+fi
+rm -f conftest*
+fi
+if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+    ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'`
+  cat >> confdefs.h <<EOF
+#define $ac_tr_hdr 1
+EOF
+else
+  echo "$ac_t""no" 1>&6
+fi
+done
+
+PERL=''
+  for ac_prog in perl5 perl
+do
+# Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:2283: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_path_PERL'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  case "$PERL" in
+  /*)
+  ac_cv_path_PERL="$PERL" # Let the user override the test with a path.
+  ;;
+  ?:/*)                         
+  ac_cv_path_PERL="$PERL" # Let the user override the test with a dos path.
+  ;;
+  *)
+  IFS="${IFS=  }"; ac_save_ifs="$IFS"; IFS=":"
+  ac_dummy="$PATH"
+  for ac_dir in $ac_dummy; do 
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/$ac_word; then
+      ac_cv_path_PERL="$ac_dir/$ac_word"
+      break
+    fi
+  done
+  IFS="$ac_save_ifs"
+  ;;
+esac
+fi
+PERL="$ac_cv_path_PERL"
+if test -n "$PERL"; then
+  echo "$ac_t""$PERL" 1>&6
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+test -n "$PERL" && break
+done
+
+  if test -z "$PERL" ; then
+    PERL_VERSION=0
+  else
+    echo $ac_n "checking perl version""... $ac_c" 1>&6
+echo "configure:2322: checking perl version" >&5
+if eval "test \"`echo '$''{'ac_cv_perl_version'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  ac_cv_perl_version=`$PERL -e "$perl_version_cmd"`
+fi
+
+echo "$ac_t""$ac_cv_perl_version" 1>&6
+    PERL_VERSION=$ac_cv_perl_version
+  fi
+
+if test -z "$PERL" ; then
+  # don't let it be blank...
+  PERL=/usr/local/bin/perl5
+fi
+
+# If we find X, set shell vars x_includes and x_libraries to the
+# paths, otherwise set no_x=yes.
+# Uses ac_ vars as temps to allow command line to override cache and checks.
+# --without-x overrides everything else, but does not touch the cache.
+echo $ac_n "checking for X""... $ac_c" 1>&6
+echo "configure:2344: checking for X" >&5
+
+# Check whether --with-x or --without-x was given.
+if test "${with_x+set}" = set; then
+  withval="$with_x"
+  :
+fi
+
+# $have_x is `yes', `no', `disabled', or empty when we do not yet know.
+if test "x$with_x" = xno; then
+  # The user explicitly disabled X.
+  have_x=disabled
+else
+  if test "x$x_includes" != xNONE && test "x$x_libraries" != xNONE; then
+    # Both variables are already set.
+    have_x=yes
+  else
+if eval "test \"`echo '$''{'ac_cv_have_x'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  # One or both of the vars are not set, and there is no cached value.
+ac_x_includes=NO ac_x_libraries=NO
+rm -fr conftestdir
+if mkdir conftestdir; then
+  cd conftestdir
+  # Make sure to not put "make" in the Imakefile rules, since we grep it out.
+  cat > Imakefile <<'EOF'
+acfindx:
+       @echo 'ac_im_incroot="${INCROOT}"; ac_im_usrlibdir="${USRLIBDIR}"; ac_im_libdir="${LIBDIR}"'
+EOF
+  if (xmkmf) >/dev/null 2>/dev/null && test -f Makefile; then
+    # GNU make sometimes prints "make[1]: Entering...", which would confuse us.
+    eval `${MAKE-make} acfindx 2>/dev/null | grep -v make`
+    # Open Windows xmkmf reportedly sets LIBDIR instead of USRLIBDIR.
+    for ac_extension in a so sl; do
+      if test ! -f $ac_im_usrlibdir/libX11.$ac_extension &&
+        test -f $ac_im_libdir/libX11.$ac_extension; then
+        ac_im_usrlibdir=$ac_im_libdir; break
+      fi
+    done
+    # Screen out bogus values from the imake configuration.  They are
+    # bogus both because they are the default anyway, and because
+    # using them would break gcc on systems where it needs fixed includes.
+    case "$ac_im_incroot" in
+       /usr/include) ;;
+       *) test -f "$ac_im_incroot/X11/Xos.h" && ac_x_includes="$ac_im_incroot" ;;
+    esac
+    case "$ac_im_usrlibdir" in
+       /usr/lib | /lib) ;;
+       *) test -d "$ac_im_usrlibdir" && ac_x_libraries="$ac_im_usrlibdir" ;;
+    esac
+  fi
+  cd ..
+  rm -fr conftestdir
+fi
+
+if test "$ac_x_includes" = NO; then
+  # Guess where to find include files, by looking for this one X11 .h file.
+  test -z "$x_direct_test_include" && x_direct_test_include=X11/Intrinsic.h
+
+  # First, try using that file with no special directory specified.
+cat > conftest.$ac_ext <<EOF
+#line 2406 "configure"
+#include "confdefs.h"
+#include <$x_direct_test_include>
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:2411: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+  rm -rf conftest*
+  # We can compile using X headers with no special include directory.
+ac_x_includes=
+else
+  echo "$ac_err" >&5
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  # Look for the header file in a standard set of common directories.
+# Check X11 before X11Rn because it is often a symlink to the current release.
+  for ac_dir in               \
+    /usr/X11/include          \
+    /usr/X11R6/include        \
+    /usr/X11R5/include        \
+    /usr/X11R4/include        \
+                              \
+    /usr/include/X11          \
+    /usr/include/X11R6        \
+    /usr/include/X11R5        \
+    /usr/include/X11R4        \
+                              \
+    /usr/local/X11/include    \
+    /usr/local/X11R6/include  \
+    /usr/local/X11R5/include  \
+    /usr/local/X11R4/include  \
+                              \
+    /usr/local/include/X11    \
+    /usr/local/include/X11R6  \
+    /usr/local/include/X11R5  \
+    /usr/local/include/X11R4  \
+                              \
+    /usr/X386/include         \
+    /usr/x386/include         \
+    /usr/XFree86/include/X11  \
+                              \
+    /usr/include              \
+    /usr/local/include        \
+    /usr/unsupported/include  \
+    /usr/athena/include       \
+    /usr/local/x11r5/include  \
+    /usr/lpp/Xamples/include  \
+                              \
+    /usr/openwin/include      \
+    /usr/openwin/share/include \
+    ; \
+  do
+    if test -r "$ac_dir/$x_direct_test_include"; then
+      ac_x_includes=$ac_dir
+      break
+    fi
+  done
+fi
+rm -f conftest*
+fi # $ac_x_includes = NO
+
+if test "$ac_x_libraries" = NO; then
+  # Check for the libraries.
+
+  test -z "$x_direct_test_library" && x_direct_test_library=Xt
+  test -z "$x_direct_test_function" && x_direct_test_function=XtMalloc
+
+  # See if we find them without any special options.
+  # Don't add to $LIBS permanently.
+  ac_save_LIBS="$LIBS"
+  LIBS="-l$x_direct_test_library $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 2480 "configure"
+#include "confdefs.h"
+
+int main() {
+${x_direct_test_function}()
+; return 0; }
+EOF
+if { (eval echo configure:2487: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  LIBS="$ac_save_LIBS"
+# We can link X programs with no special library path.
+ac_x_libraries=
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  LIBS="$ac_save_LIBS"
+# First see if replacing the include by lib works.
+# Check X11 before X11Rn because it is often a symlink to the current release.
+for ac_dir in `echo "$ac_x_includes" | sed s/include/lib/` \
+    /usr/X11/lib          \
+    /usr/X11R6/lib        \
+    /usr/X11R5/lib        \
+    /usr/X11R4/lib        \
+                          \
+    /usr/lib/X11          \
+    /usr/lib/X11R6        \
+    /usr/lib/X11R5        \
+    /usr/lib/X11R4        \
+                          \
+    /usr/local/X11/lib    \
+    /usr/local/X11R6/lib  \
+    /usr/local/X11R5/lib  \
+    /usr/local/X11R4/lib  \
+                          \
+    /usr/local/lib/X11    \
+    /usr/local/lib/X11R6  \
+    /usr/local/lib/X11R5  \
+    /usr/local/lib/X11R4  \
+                          \
+    /usr/X386/lib         \
+    /usr/x386/lib         \
+    /usr/XFree86/lib/X11  \
+                          \
+    /usr/lib              \
+    /usr/local/lib        \
+    /usr/unsupported/lib  \
+    /usr/athena/lib       \
+    /usr/local/x11r5/lib  \
+    /usr/lpp/Xamples/lib  \
+    /lib/usr/lib/X11     \
+                          \
+    /usr/openwin/lib      \
+    /usr/openwin/share/lib \
+    ; \
+do
+  for ac_extension in a so sl; do
+    if test -r $ac_dir/lib${x_direct_test_library}.$ac_extension; then
+      ac_x_libraries=$ac_dir
+      break 2
+    fi
+  done
+done
+fi
+rm -f conftest*
+fi # $ac_x_libraries = NO
+
+if test "$ac_x_includes" = NO || test "$ac_x_libraries" = NO; then
+  # Didn't find X anywhere.  Cache the known absence of X.
+  ac_cv_have_x="have_x=no"
+else
+  # Record where we found X for the cache.
+  ac_cv_have_x="have_x=yes \
+               ac_x_includes=$ac_x_includes ac_x_libraries=$ac_x_libraries"
+fi
+fi
+  fi
+  eval "$ac_cv_have_x"
+fi # $with_x != no
+
+if test "$have_x" != yes; then
+  echo "$ac_t""$have_x" 1>&6
+  no_x=yes
+else
+  # If each of the values was on the command line, it overrides each guess.
+  test "x$x_includes" = xNONE && x_includes=$ac_x_includes
+  test "x$x_libraries" = xNONE && x_libraries=$ac_x_libraries
+  # Update the cache value to reflect the command line values.
+  ac_cv_have_x="have_x=yes \
+               ac_x_includes=$x_includes ac_x_libraries=$x_libraries"
+  echo "$ac_t""libraries $x_libraries, headers $x_includes" 1>&6
+fi
+
+if test "$no_x" = yes; then
+  # Not all programs may use this symbol, but it does not hurt to define it.
+  cat >> confdefs.h <<\EOF
+#define X_DISPLAY_MISSING 1
+EOF
+
+  X_CFLAGS= X_PRE_LIBS= X_LIBS= X_EXTRA_LIBS=
+else
+  if test -n "$x_includes"; then
+    X_CFLAGS="$X_CFLAGS -I$x_includes"
+  fi
+
+  # It would also be nice to do this for all -L options, not just this one.
+  if test -n "$x_libraries"; then
+    X_LIBS="$X_LIBS -L$x_libraries"
+    # For Solaris; some versions of Sun CC require a space after -R and
+    # others require no space.  Words are not sufficient . . . .
+    case "`(uname -sr) 2>/dev/null`" in
+    "SunOS 5"*)
+      echo $ac_n "checking whether -R must be followed by a space""... $ac_c" 1>&6
+echo "configure:2593: checking whether -R must be followed by a space" >&5
+      ac_xsave_LIBS="$LIBS"; LIBS="$LIBS -R$x_libraries"
+      cat > conftest.$ac_ext <<EOF
+#line 2596 "configure"
+#include "confdefs.h"
+
+int main() {
+
+; return 0; }
+EOF
+if { (eval echo configure:2603: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  ac_R_nospace=yes
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  ac_R_nospace=no
+fi
+rm -f conftest*
+      if test $ac_R_nospace = yes; then
+       echo "$ac_t""no" 1>&6
+       X_LIBS="$X_LIBS -R$x_libraries"
+      else
+       LIBS="$ac_xsave_LIBS -R $x_libraries"
+       cat > conftest.$ac_ext <<EOF
+#line 2619 "configure"
+#include "confdefs.h"
+
+int main() {
+
+; return 0; }
+EOF
+if { (eval echo configure:2626: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  ac_R_space=yes
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  ac_R_space=no
+fi
+rm -f conftest*
+       if test $ac_R_space = yes; then
+         echo "$ac_t""yes" 1>&6
+         X_LIBS="$X_LIBS -R $x_libraries"
+       else
+         echo "$ac_t""neither works" 1>&6
+       fi
+      fi
+      LIBS="$ac_xsave_LIBS"
+    esac
+  fi
+
+  # Check for system-dependent libraries X programs must link with.
+  # Do this before checking for the system-independent R6 libraries
+  # (-lICE), since we may need -lsocket or whatever for X linking.
+
+  if test "$ISC" = yes; then
+    X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl_s -linet"
+  else
+    # Martyn.Johnson@cl.cam.ac.uk says this is needed for Ultrix, if the X
+    # libraries were built with DECnet support.  And karl@cs.umb.edu says
+    # the Alpha needs dnet_stub (dnet does not exist).
+    echo $ac_n "checking for dnet_ntoa in -ldnet""... $ac_c" 1>&6
+echo "configure:2658: checking for dnet_ntoa in -ldnet" >&5
+ac_lib_var=`echo dnet'_'dnet_ntoa | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  ac_save_LIBS="$LIBS"
+LIBS="-ldnet  $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 2666 "configure"
+#include "confdefs.h"
+/* Override any gcc2 internal prototype to avoid an error.  */
+/* We use char because int might match the return type of a gcc2
+    builtin and then its argument prototype would still apply.  */
+char dnet_ntoa();
+
+int main() {
+dnet_ntoa()
+; return 0; }
+EOF
+if { (eval echo configure:2677: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  eval "ac_cv_lib_$ac_lib_var=yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_lib_$ac_lib_var=no"
+fi
+rm -f conftest*
+LIBS="$ac_save_LIBS"
+
+fi
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet"
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+    if test $ac_cv_lib_dnet_dnet_ntoa = no; then
+      echo $ac_n "checking for dnet_ntoa in -ldnet_stub""... $ac_c" 1>&6
+echo "configure:2699: checking for dnet_ntoa in -ldnet_stub" >&5
+ac_lib_var=`echo dnet_stub'_'dnet_ntoa | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  ac_save_LIBS="$LIBS"
+LIBS="-ldnet_stub  $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 2707 "configure"
+#include "confdefs.h"
+/* Override any gcc2 internal prototype to avoid an error.  */
+/* We use char because int might match the return type of a gcc2
+    builtin and then its argument prototype would still apply.  */
+char dnet_ntoa();
+
+int main() {
+dnet_ntoa()
+; return 0; }
+EOF
+if { (eval echo configure:2718: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  eval "ac_cv_lib_$ac_lib_var=yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_lib_$ac_lib_var=no"
+fi
+rm -f conftest*
+LIBS="$ac_save_LIBS"
+
+fi
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  X_EXTRA_LIBS="$X_EXTRA_LIBS -ldnet_stub"
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+    fi
+
+    # msh@cis.ufl.edu says -lnsl (and -lsocket) are needed for his 386/AT,
+    # to get the SysV transport functions.
+    # chad@anasazi.com says the Pyramis MIS-ES running DC/OSx (SVR4)
+    # needs -lnsl.
+    # The nsl library prevents programs from opening the X display
+    # on Irix 5.2, according to dickey@clark.net.
+    echo $ac_n "checking for gethostbyname""... $ac_c" 1>&6
+echo "configure:2747: checking for gethostbyname" >&5
+if eval "test \"`echo '$''{'ac_cv_func_gethostbyname'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 2752 "configure"
+#include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char gethostbyname(); below.  */
+#include <assert.h>
+/* Override any gcc2 internal prototype to avoid an error.  */
+/* We use char because int might match the return type of a gcc2
+    builtin and then its argument prototype would still apply.  */
+char gethostbyname();
+
+int main() {
+
+/* The GNU C library defines this for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined (__stub_gethostbyname) || defined (__stub___gethostbyname)
+choke me
+#else
+gethostbyname();
+#endif
+
+; return 0; }
+EOF
+if { (eval echo configure:2775: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  eval "ac_cv_func_gethostbyname=yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_func_gethostbyname=no"
+fi
+rm -f conftest*
+fi
+
+if eval "test \"`echo '$ac_cv_func_'gethostbyname`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  :
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+    if test $ac_cv_func_gethostbyname = no; then
+      echo $ac_n "checking for gethostbyname in -lnsl""... $ac_c" 1>&6
+echo "configure:2796: checking for gethostbyname in -lnsl" >&5
+ac_lib_var=`echo nsl'_'gethostbyname | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  ac_save_LIBS="$LIBS"
+LIBS="-lnsl  $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 2804 "configure"
+#include "confdefs.h"
+/* Override any gcc2 internal prototype to avoid an error.  */
+/* We use char because int might match the return type of a gcc2
+    builtin and then its argument prototype would still apply.  */
+char gethostbyname();
+
+int main() {
+gethostbyname()
+; return 0; }
+EOF
+if { (eval echo configure:2815: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  eval "ac_cv_lib_$ac_lib_var=yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_lib_$ac_lib_var=no"
+fi
+rm -f conftest*
+LIBS="$ac_save_LIBS"
+
+fi
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  X_EXTRA_LIBS="$X_EXTRA_LIBS -lnsl"
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+    fi
+
+    # lieder@skyler.mavd.honeywell.com says without -lsocket,
+    # socket/setsockopt and other routines are undefined under SCO ODT
+    # 2.0.  But -lsocket is broken on IRIX 5.2 (and is not necessary
+    # on later versions), says simon@lia.di.epfl.ch: it contains
+    # gethostby* variants that don't use the nameserver (or something).
+    # -lsocket must be given before -lnsl if both are needed.
+    # We assume that if connect needs -lnsl, so does gethostbyname.
+    echo $ac_n "checking for connect""... $ac_c" 1>&6
+echo "configure:2845: checking for connect" >&5
+if eval "test \"`echo '$''{'ac_cv_func_connect'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 2850 "configure"
+#include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char connect(); below.  */
+#include <assert.h>
+/* Override any gcc2 internal prototype to avoid an error.  */
+/* We use char because int might match the return type of a gcc2
+    builtin and then its argument prototype would still apply.  */
+char connect();
+
+int main() {
+
+/* The GNU C library defines this for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined (__stub_connect) || defined (__stub___connect)
+choke me
+#else
+connect();
+#endif
+
+; return 0; }
+EOF
+if { (eval echo configure:2873: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  eval "ac_cv_func_connect=yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_func_connect=no"
+fi
+rm -f conftest*
+fi
+
+if eval "test \"`echo '$ac_cv_func_'connect`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  :
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+    if test $ac_cv_func_connect = no; then
+      echo $ac_n "checking for connect in -lsocket""... $ac_c" 1>&6
+echo "configure:2894: checking for connect in -lsocket" >&5
+ac_lib_var=`echo socket'_'connect | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  ac_save_LIBS="$LIBS"
+LIBS="-lsocket $X_EXTRA_LIBS $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 2902 "configure"
+#include "confdefs.h"
+/* Override any gcc2 internal prototype to avoid an error.  */
+/* We use char because int might match the return type of a gcc2
+    builtin and then its argument prototype would still apply.  */
+char connect();
+
+int main() {
+connect()
+; return 0; }
+EOF
+if { (eval echo configure:2913: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  eval "ac_cv_lib_$ac_lib_var=yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_lib_$ac_lib_var=no"
+fi
+rm -f conftest*
+LIBS="$ac_save_LIBS"
+
+fi
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  X_EXTRA_LIBS="-lsocket $X_EXTRA_LIBS"
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+    fi
+
+    # gomez@mi.uni-erlangen.de says -lposix is necessary on A/UX.
+    echo $ac_n "checking for remove""... $ac_c" 1>&6
+echo "configure:2937: checking for remove" >&5
+if eval "test \"`echo '$''{'ac_cv_func_remove'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 2942 "configure"
+#include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char remove(); below.  */
+#include <assert.h>
+/* Override any gcc2 internal prototype to avoid an error.  */
+/* We use char because int might match the return type of a gcc2
+    builtin and then its argument prototype would still apply.  */
+char remove();
+
+int main() {
+
+/* The GNU C library defines this for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined (__stub_remove) || defined (__stub___remove)
+choke me
+#else
+remove();
+#endif
+
+; return 0; }
+EOF
+if { (eval echo configure:2965: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  eval "ac_cv_func_remove=yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_func_remove=no"
+fi
+rm -f conftest*
+fi
+
+if eval "test \"`echo '$ac_cv_func_'remove`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  :
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+    if test $ac_cv_func_remove = no; then
+      echo $ac_n "checking for remove in -lposix""... $ac_c" 1>&6
+echo "configure:2986: checking for remove in -lposix" >&5
+ac_lib_var=`echo posix'_'remove | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  ac_save_LIBS="$LIBS"
+LIBS="-lposix  $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 2994 "configure"
+#include "confdefs.h"
+/* Override any gcc2 internal prototype to avoid an error.  */
+/* We use char because int might match the return type of a gcc2
+    builtin and then its argument prototype would still apply.  */
+char remove();
+
+int main() {
+remove()
+; return 0; }
+EOF
+if { (eval echo configure:3005: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  eval "ac_cv_lib_$ac_lib_var=yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_lib_$ac_lib_var=no"
+fi
+rm -f conftest*
+LIBS="$ac_save_LIBS"
+
+fi
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  X_EXTRA_LIBS="$X_EXTRA_LIBS -lposix"
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+    fi
+
+    # BSDI BSD/OS 2.1 needs -lipc for XOpenDisplay.
+    echo $ac_n "checking for shmat""... $ac_c" 1>&6
+echo "configure:3029: checking for shmat" >&5
+if eval "test \"`echo '$''{'ac_cv_func_shmat'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 3034 "configure"
+#include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char shmat(); below.  */
+#include <assert.h>
+/* Override any gcc2 internal prototype to avoid an error.  */
+/* We use char because int might match the return type of a gcc2
+    builtin and then its argument prototype would still apply.  */
+char shmat();
+
+int main() {
+
+/* The GNU C library defines this for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined (__stub_shmat) || defined (__stub___shmat)
+choke me
+#else
+shmat();
+#endif
+
+; return 0; }
+EOF
+if { (eval echo configure:3057: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  eval "ac_cv_func_shmat=yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_func_shmat=no"
+fi
+rm -f conftest*
+fi
+
+if eval "test \"`echo '$ac_cv_func_'shmat`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  :
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+    if test $ac_cv_func_shmat = no; then
+      echo $ac_n "checking for shmat in -lipc""... $ac_c" 1>&6
+echo "configure:3078: checking for shmat in -lipc" >&5
+ac_lib_var=`echo ipc'_'shmat | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  ac_save_LIBS="$LIBS"
+LIBS="-lipc  $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 3086 "configure"
+#include "confdefs.h"
+/* Override any gcc2 internal prototype to avoid an error.  */
+/* We use char because int might match the return type of a gcc2
+    builtin and then its argument prototype would still apply.  */
+char shmat();
+
+int main() {
+shmat()
+; return 0; }
+EOF
+if { (eval echo configure:3097: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  eval "ac_cv_lib_$ac_lib_var=yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_lib_$ac_lib_var=no"
+fi
+rm -f conftest*
+LIBS="$ac_save_LIBS"
+
+fi
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  X_EXTRA_LIBS="$X_EXTRA_LIBS -lipc"
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+    fi
+  fi
+
+  # Check for libraries that X11R6 Xt/Xaw programs need.
+  ac_save_LDFLAGS="$LDFLAGS"
+  test -n "$x_libraries" && LDFLAGS="$LDFLAGS -L$x_libraries"
+  # SM needs ICE to (dynamically) link under SunOS 4.x (so we have to
+  # check for ICE first), but we must link in the order -lSM -lICE or
+  # we get undefined symbols.  So assume we have SM if we have ICE.
+  # These have to be linked with before -lX11, unlike the other
+  # libraries we check for below, so use a different variable.
+  #  --interran@uluru.Stanford.EDU, kb@cs.umb.edu.
+  echo $ac_n "checking for IceConnectionNumber in -lICE""... $ac_c" 1>&6
+echo "configure:3130: checking for IceConnectionNumber in -lICE" >&5
+ac_lib_var=`echo ICE'_'IceConnectionNumber | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  ac_save_LIBS="$LIBS"
+LIBS="-lICE $X_EXTRA_LIBS $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 3138 "configure"
+#include "confdefs.h"
+/* Override any gcc2 internal prototype to avoid an error.  */
+/* We use char because int might match the return type of a gcc2
+    builtin and then its argument prototype would still apply.  */
+char IceConnectionNumber();
+
+int main() {
+IceConnectionNumber()
+; return 0; }
+EOF
+if { (eval echo configure:3149: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  eval "ac_cv_lib_$ac_lib_var=yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_lib_$ac_lib_var=no"
+fi
+rm -f conftest*
+LIBS="$ac_save_LIBS"
+
+fi
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  X_PRE_LIBS="$X_PRE_LIBS -lSM -lICE"
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+  LDFLAGS="$ac_save_LDFLAGS"
+
+fi
+
+
+if test "$have_x" != yes; then
+  { echo "configure: error: Couldn't find X11 headers/libs.  Try \`$0 --help'." 1>&2; exit 1; }
+fi
+
+
+    echo $ac_n "checking for X app-defaults directory""... $ac_c" 1>&6
+echo "configure:3180: checking for X app-defaults directory" >&5
+if eval "test \"`echo '$''{'ac_cv_x_app_defaults'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  
+  rm -fr conftestdir
+  if mkdir conftestdir; then
+    cd conftestdir >&-
+    # Make sure to not put "make" in the Imakefile rules, since we grep it out.
+    cat > Imakefile <<'EOF'
+acfindx:
+       @echo 'ac_x_app_defaults="${XAPPLOADDIR}"'
+EOF
+    if (xmkmf) >/dev/null 2>/dev/null && test -f Makefile; then
+      # GNU make sometimes prints "make[1]: Entering...", which'd confuse us.
+      eval `${MAKE-make} acfindx 2>/dev/null | grep -v make`
+    fi
+    cd .. >&-
+    rm -fr conftestdir
+  fi
+      if test x"$ac_x_app_defaults" = x; then
+        
+  # Look for the directory under a standard set of common directories.
+  # Check X11 before X11Rn because it's often a symlink to the current release.
+  for ac_dir in                                 \
+    /usr/X11/lib/app-defaults                   \
+    /usr/X11R6/lib/app-defaults                 \
+    /usr/X11R6/lib/X11/app-defaults             \
+    /usr/X11R5/lib/app-defaults                 \
+    /usr/X11R5/lib/X11/app-defaults             \
+    /usr/X11R4/lib/app-defaults                 \
+    /usr/X11R4/lib/X11/app-defaults             \
+                                                \
+    /usr/lib/X11/app-defaults                   \
+    /usr/lib/X11R6/app-defaults                 \
+    /usr/lib/X11R5/app-defaults                 \
+    /usr/lib/X11R4/app-defaults                 \
+                                                \
+    /usr/local/X11/lib/app-defaults             \
+    /usr/local/X11R6/lib/app-defaults           \
+    /usr/local/X11R5/lib/app-defaults           \
+    /usr/local/X11R4/lib/app-defaults           \
+                                                \
+    /usr/local/lib/X11/app-defaults             \
+    /usr/local/lib/X11R6/app-defaults           \
+    /usr/local/lib/X11R6/X11/app-defaults       \
+    /usr/local/lib/X11R5/app-defaults           \
+    /usr/local/lib/X11R5/X11/app-defaults       \
+    /usr/local/lib/X11R4/app-defaults           \
+    /usr/local/lib/X11R4/X11/app-defaults       \
+                                                \
+    /usr/X386/lib/X11/app-defaults              \
+    /usr/x386/lib/X11/app-defaults              \
+    /usr/XFree86/lib/X11/app-defaults           \
+                                                \
+    /usr/lib/X11/app-defaults                   \
+    /usr/local/lib/X11/app-defaults             \
+    /usr/unsupported/lib/X11/app-defaults       \
+    /usr/athena/lib/X11/app-defaults            \
+    /usr/local/x11r5/lib/X11/app-defaults       \
+    /usr/lpp/Xamples/lib/X11/app-defaults       \
+    /lib/usr/lib/X11/app-defaults               \
+                                                \
+    /usr/openwin/lib/app-defaults               \
+    /usr/openwin/lib/X11/app-defaults           \
+    /usr/openwin/share/lib/app-defaults         \
+    /usr/openwin/share/lib/X11/app-defaults     \
+                                                \
+    /X11R6/lib/app-defaults                     \
+    /X11R5/lib/app-defaults                     \
+    /X11R4/lib/app-defaults                     \
+    ; \
+  do
+    if test -d "$ac_dir"; then
+      ac_x_app_defaults=$ac_dir
+      break
+    fi
+  done
+
+      fi
+      if test x"$ac_x_app_defaults" = x; then
+        ac_cv_x_app_defaults="/usr/lib/X11/app-defaults"
+      else
+        # Record where we found app-defaults for the cache.
+        ac_cv_x_app_defaults="$ac_x_app_defaults"
+      fi
+fi
+
+echo "$ac_t""$ac_cv_x_app_defaults" 1>&6
+    eval ac_x_app_defaults="$ac_cv_x_app_defaults"
+case "$host" in
+    *-hpux*)
+
+      # The following arcana was gleaned from conversations with
+      # Eric Schwartz <erics@col.hp.com>:
+      #
+      # On HPUX 10.x, the parts of X that HP considers "standard" live in
+      # /usr/{include,lib}/X11R6/.  The parts that HP doesn't consider
+      # "standard", notably, Xaw and Xmu, live in /usr/contrib/X11R6/.
+      # Yet /usr/contrib/X11R6/ comes preinstalled on all HPUX systems.
+      # Also, there are symlinks from /usr/include/ and /usr/lib/ into
+      # /usr/{include,lib}/X11R6/, so that (if you don't use Xmu at all)
+      # you don't need any -I or -L arguments.
+      #
+      # On HPUX 9.x, /usr/{include,lib}/X11R5/ and /usr/contrib/X11R5/
+      # are the same division as 10.x.  However, there are no symlinks to
+      # the X stuff from /usr/include/ and /usr/lib/, so -I and -L
+      # arguments are always necessary.
+      #
+      # However, X11R6 was available on HPUX 9.x as a patch: if that
+      # patch was installed, then all of X11R6 went in to
+      # /usr/contrib/X11R6/ (there was no /usr/{include,lib}/X11R6/.)
+      #
+      # HPUX 8.x was the same as 9.x, but was X11R4 instead (I don't know
+      # whether R5 was available as a patch; R6 undoubtedly was not.)
+      #
+      # So.  We try and use the highest numbered pair of
+      # /usr/{include,lib}/X11R?/ and /usr/contrib/X11R?/{include,lib}/
+      # that are available.  We do not mix and match different versions
+      # of X.
+      #
+      # Question I still don't know the answer to: (do you?)
+      #
+      #   * On HPUX 9.x, where /usr/include/X11R5/ was standard, and
+      #     /usr/contrib/X11R6/ could be installed as a patch, what was in
+      #     that contrib directory?  Did it contain so-called "standard"
+      #     X11R6, or did it include Xaw and Xmu as well?  If the former,
+      #     where did one find Xaw and Xmu on 9.x R6 systems?  Would this
+      #     be a situation where one had to reach into the R5 headers and
+      #     libs to find Xmu?  That is, must both R6 and R5 directories
+      #     be on the -I and -L lists in that case?
+      #
+      for version in X11R6 X11R5 X11R4 ; do
+        # if either pair of directories exists...
+        if test -d /usr/lib/$version || test -d /usr/contrib/$version/lib
+        then
+           # if contrib exists, use it...
+           if test -d /usr/contrib/$version/lib ; then
+             X_CFLAGS="$X_CFLAGS -I/usr/contrib/$version/include"
+             X_LIBS="$X_LIBS -L/usr/contrib/$version/lib"
+           fi
+           # if the "standard" one exists, use it.
+           if test -d /usr/lib/$version ; then
+             X_CFLAGS="$X_CFLAGS -I/usr/include/$version"
+             X_LIBS="$X_LIBS -L/usr/lib/$version"
+           fi
+           # since at least one of the pair exists, go no farther.
+           break
+        fi
+      done
+
+      # Now find Motif.  Thanks for not making xmkmf find this by
+      # default, you losers.
+      #
+      if test -d /usr/lib/Motif1.2 ; then
+        X_CFLAGS="$X_CFLAGS -I/usr/include/Motif1.2"
+        X_LIBS="$X_LIBS -L/usr/lib/Motif1.2"
+      elif test -d /usr/lib/Motif1.1 ; then
+        X_CFLAGS="$X_CFLAGS -I/usr/include/Motif1.1"
+        X_LIBS="$X_LIBS -L/usr/lib/Motif1.1"
+      fi
+
+      # Now let's check for the pseudo-standard locations for OpenGL and XPM.
+      #
+      if test -d /opt/Mesa/lib ; then
+        X_CFLAGS="-I/opt/Mesa/include $X_CFLAGS"
+        X_LIBS="-L/opt/Mesa/lib $X_LIBS"
+      fi
+
+      if test -d /opt/xpm/lib/X11 ; then
+        X_CFLAGS="-I/opt/xpm/include $X_CFLAGS"
+        X_LIBS="-L/opt/xpm/lib/X11 $X_LIBS"
+      fi
+
+      # On HPUX, default to installing in /opt/xscreensaver/ instead of
+      # in /usr/local/, unless there is already an xscreensaver in
+      # /usr/local/bin/.  This can be overridden with the --prefix arg
+      # to configure.  I'm not sure this is the right thing to do, but
+      # Richard Lloyd says so...
+      #
+      if test \! -x /usr/local/bin/xscreensaver ; then
+        ac_default_prefix=/opt/xscreensaver
+      fi
+
+    ;;
+    *-solaris*)
+
+      # Thanks for not making xmkmf find this by default, pinheads.
+      # And thanks for moving things around again, too.  Is this
+      # really the standard location now?  What happened to the
+      # joke that this kind of thing went in /opt?
+      # cthomp says "answer: CDE (Common Disorganized Environment)"
+      #
+      if test -f /usr/dt/include/Xm/Xm.h ; then
+        X_CFLAGS="$X_CFLAGS -I/usr/dt/include"
+        X_LIBS="$X_LIBS -L/usr/dt/lib -R:/usr/dt/lib"
+
+        # Some versions of Slowlaris Motif require -lgen.  But not all.  Why?
+        echo $ac_n "checking for regcmp in -lgen""... $ac_c" 1>&6
+echo "configure:3379: checking for regcmp in -lgen" >&5
+ac_lib_var=`echo gen'_'regcmp | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  ac_save_LIBS="$LIBS"
+LIBS="-lgen  $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 3387 "configure"
+#include "confdefs.h"
+/* Override any gcc2 internal prototype to avoid an error.  */
+/* We use char because int might match the return type of a gcc2
+    builtin and then its argument prototype would still apply.  */
+char regcmp();
+
+int main() {
+regcmp()
+; return 0; }
+EOF
+if { (eval echo configure:3398: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  eval "ac_cv_lib_$ac_lib_var=yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_lib_$ac_lib_var=no"
+fi
+rm -f conftest*
+LIBS="$ac_save_LIBS"
+
+fi
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  X_LIBS="$X_LIBS -lgen"
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+      fi
+    ;;
+  esac
+echo $ac_n "checking for XPointer""... $ac_c" 1>&6
+echo "configure:3422: checking for XPointer" >&5
+if eval "test \"`echo '$''{'ac_cv_xpointer'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  
+  ac_save_CPPFLAGS="$CPPFLAGS"
+  if test \! -z "$includedir" ; then 
+    CPPFLAGS="$CPPFLAGS -I$includedir"
+  fi
+  CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+  cat > conftest.$ac_ext <<EOF
+#line 3433 "configure"
+#include "confdefs.h"
+#include <X11/Xlib.h>
+int main() {
+XPointer foo = (XPointer) 0;
+; return 0; }
+EOF
+if { (eval echo configure:3440: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+  rm -rf conftest*
+  ac_cv_xpointer=yes
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  ac_cv_xpointer=no
+fi
+rm -f conftest*
+  CPPFLAGS="$ac_save_CPPFLAGS"
+fi
+
+echo "$ac_t""$ac_cv_xpointer" 1>&6
+  if test "$ac_cv_xpointer" != yes; then
+   cat >> confdefs.h <<\EOF
+#define XPointer char*
+EOF
+
+  fi
+
+
+
+###############################################################################
+#
+#       Check for -lXmu (some fucked up vendors don't ship it...)
+#
+###############################################################################
+
+have_xmu=no
+
+  ac_save_CPPFLAGS="$CPPFLAGS"
+  if test \! -z "$includedir" ; then 
+    CPPFLAGS="$CPPFLAGS -I$includedir"
+  fi
+  CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+  ac_safe=`echo "X11/Xmu/Error.h" | sed 'y%./+-%__p_%'`
+echo $ac_n "checking for X11/Xmu/Error.h""... $ac_c" 1>&6
+echo "configure:3478: checking for X11/Xmu/Error.h" >&5
+if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 3483 "configure"
+#include "confdefs.h"
+#include <X11/Xmu/Error.h>
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:3488: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+  rm -rf conftest*
+  eval "ac_cv_header_$ac_safe=yes"
+else
+  echo "$ac_err" >&5
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_header_$ac_safe=no"
+fi
+rm -f conftest*
+fi
+if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  have_xmu=yes
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+  CPPFLAGS="$ac_save_CPPFLAGS"
+if test "$have_xmu" = no ; then
+  XMU_SRCS='$(UTILS_SRC)/xmu.c'
+  XMU_OBJS='$(UTILS_BIN)/xmu.o'
+else
+  XMU_SRCS=''
+  XMU_OBJS=''
+  SAVER_LIBS="-lXmu $SAVER_LIBS"
+  HACK_LIBS="-lXmu $HACK_LIBS"
+  MOTIF_LIBS="-lXmu $MOTIF_LIBS"
+  GTK_LIBS="-lXmu $GTK_LIBS"
+  ATHENA_LIBS="-lXmu $ATHENA_LIBS"
+  ATHENA3D_LIBS="-lXmu $ATHENA3D_LIBS"
+  cat >> confdefs.h <<\EOF
+#define HAVE_XMU 1
+EOF
+
+fi
+
+
+###############################################################################
+#
+#       Check for the SunOS 4.1.x _get_wmShellWidgetClass bug.
+#       See comp.windows.x FAQ question 124.  The right fix is to
+#       get OpenWindows 3.0 patches 100512-02 and 100573-03.
+#
+###############################################################################
+
+if test "$have_xmu" = yes ; then
+  case "$host" in
+    *-sunos4*)
+    echo $ac_n "checking for the SunOS 4.1.x _get_wmShellWidgetClass bug""... $ac_c" 1>&6
+echo "configure:3541: checking for the SunOS 4.1.x _get_wmShellWidgetClass bug" >&5
+if eval "test \"`echo '$''{'ac_cv_sunos_xmu_bug'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  ac_save_LDFLAGS="$LDFLAGS"
+                    if test \! -z "$x_libraries" ; then
+                      LDFLAGS="$LDFLAGS -L$x_libraries"
+                    fi
+                    # Note: this trick never works!  (Generally.)
+                    # We're only getting away with using AC_TRY_LINK
+                    # with X libraries because we know it's SunOS.
+                    LDFLAGS="$LDFLAGS -lXmu -lXt -lX11 -lXext -lm"
+                    cat > conftest.$ac_ext <<EOF
+#line 3554 "configure"
+#include "confdefs.h"
+
+int main() {
+
+; return 0; }
+EOF
+if { (eval echo configure:3561: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  ac_cv_sunos_xmu_bug=no
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  ac_cv_sunos_xmu_bug=yes
+fi
+rm -f conftest*
+                    LDFLAGS="$ac_save_LDFLAGS"
+fi
+
+echo "$ac_t""$ac_cv_sunos_xmu_bug" 1>&6
+    if test "$ac_cv_sunos_xmu_bug" = yes ; then
+      echo $ac_n "checking whether the compiler understands -static""... $ac_c" 1>&6
+echo "configure:3577: checking whether the compiler understands -static" >&5
+if eval "test \"`echo '$''{'ac_cv_ld_static'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  ac_save_LDFLAGS="$LDFLAGS"
+                      LDFLAGS="$LDFLAGS -static"
+                      cat > conftest.$ac_ext <<EOF
+#line 3584 "configure"
+#include "confdefs.h"
+
+int main() {
+
+; return 0; }
+EOF
+if { (eval echo configure:3591: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  ac_cv_ld_static=yes
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  ac_cv_ld_static=no
+fi
+rm -f conftest*
+                    LDFLAGS="$ac_save_LDFLAGS"
+fi
+
+echo "$ac_t""$ac_cv_ld_static" 1>&6
+      if test "$ac_cv_ld_static" = yes ; then
+        LDFLAGS="$LDFLAGS -static"
+      else
+        LDFLAGS="$LDFLAGS -Bstatic"
+      fi
+    fi
+    ;;
+  esac
+fi
+
+
+###############################################################################
+#
+#       Handle the --enable-subdir option
+#
+###############################################################################
+
+# Check whether --enable-subdir or --disable-subdir was given.
+if test "${enable_subdir+set}" = set; then
+  enableval="$enable_subdir"
+  enable_subdir="$enableval"
+else
+  enable_subdir=no
+fi
+
+if test x"$enable_subdir" = xno; then
+  HACKDIR='${bindir}'
+elif test x"$enable_subdir" = xyes -o x"$enable_subdir" = x ; then
+  echo "error: must be a subdirectory name: --enable-subdir=$enable_subdir"
+  exit 1
+else
+  # there must be a better way than this...
+  if test -z "`echo $enable_subdir | sed 's@^/.*@@'`" ; then
+    # absolute path
+    HACKDIR=$enable_subdir
+  else
+    # relative path
+    HACKDIR='${bindir}/'$enable_subdir
+  fi
+fi
+
+# canonicalize slashes.
+HACKDIR=`echo "${HACKDIR}" | sed 's@/$@@;s@//*@/@g'`
+
+
+###############################################################################
+#
+#       Check for the SGI SCREEN_SAVER server extension.
+#
+###############################################################################
+
+have_sgi=no
+with_sgi_req=unspecified
+# Check whether --with-sgi-ext or --without-sgi-ext was given.
+if test "${with_sgi_ext+set}" = set; then
+  withval="$with_sgi_ext"
+  with_sgi="$withval"; with_sgi_req="$withval"
+else
+  with_sgi=yes
+fi
+
+
+
+   case "$with_sgi" in
+    yes) ;;
+    no)  ;;
+
+    /*)
+     echo $ac_n "checking for SGI SCREEN_SAVER headers""... $ac_c" 1>&6
+echo "configure:3674: checking for SGI SCREEN_SAVER headers" >&5
+     d=$with_sgi/include
+     if test -d $d; then
+       X_CFLAGS="-I$d $X_CFLAGS"
+       echo "$ac_t""$d" 1>&6
+     else
+       echo "$ac_t""not found ($d: no such directory)" 1>&6
+     fi
+
+     echo $ac_n "checking for SGI SCREEN_SAVER libs""... $ac_c" 1>&6
+echo "configure:3684: checking for SGI SCREEN_SAVER libs" >&5
+     d=$with_sgi/lib
+     if test -d $d; then
+       X_LIBS="-L$d $X_LIBS"
+       echo "$ac_t""$d" 1>&6
+     else
+       echo "$ac_t""not found ($d: no such directory)" 1>&6
+     fi
+
+     # replace the directory string with "yes".
+     with_sgi_req="yes"
+     with_sgi=$with_sgi_req
+     ;;
+
+    *)
+     echo ""
+     echo "error: argument to --with-sgi-ext must be \"yes\", \"no\", or a directory."
+     echo "       If it is a directory, then \`DIR/include' will be added to"
+     echo "       the -I list, and \`DIR/lib' will be added to the -L list."
+     exit 1
+     ;;
+   esac
+  
+
+if test "$with_sgi" = yes; then
+  
+  ac_save_CPPFLAGS="$CPPFLAGS"
+  if test \! -z "$includedir" ; then 
+    CPPFLAGS="$CPPFLAGS -I$includedir"
+  fi
+  CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+  ac_safe=`echo "X11/extensions/XScreenSaver.h" | sed 'y%./+-%__p_%'`
+echo $ac_n "checking for X11/extensions/XScreenSaver.h""... $ac_c" 1>&6
+echo "configure:3717: checking for X11/extensions/XScreenSaver.h" >&5
+if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 3722 "configure"
+#include "confdefs.h"
+#include <X11/extensions/XScreenSaver.h>
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:3727: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+  rm -rf conftest*
+  eval "ac_cv_header_$ac_safe=yes"
+else
+  echo "$ac_err" >&5
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_header_$ac_safe=no"
+fi
+rm -f conftest*
+fi
+if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  have_sgi=yes
+                     cat >> confdefs.h <<\EOF
+#define HAVE_SGI_SAVER_EXTENSION 1
+EOF
+
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+  CPPFLAGS="$ac_save_CPPFLAGS"
+
+elif test "$with_sgi" != no; then
+  echo "error: must be yes or no: --with-sgi-ext=$with_sgi"
+  exit 1
+fi
+
+
+###############################################################################
+#
+#       Check for the MIT-SCREEN-SAVER server extension.
+#
+###############################################################################
+
+have_mit=no
+with_mit_req=unspecified
+# Check whether --with-mit-ext or --without-mit-ext was given.
+if test "${with_mit_ext+set}" = set; then
+  withval="$with_mit_ext"
+  with_mit="$withval"; with_mit_req="$withval"
+else
+  with_mit=yes
+fi
+
+
+
+   case "$with_mit" in
+    yes) ;;
+    no)  ;;
+
+    /*)
+     echo $ac_n "checking for MIT-SCREEN-SAVER headers""... $ac_c" 1>&6
+echo "configure:3784: checking for MIT-SCREEN-SAVER headers" >&5
+     d=$with_mit/include
+     if test -d $d; then
+       X_CFLAGS="-I$d $X_CFLAGS"
+       echo "$ac_t""$d" 1>&6
+     else
+       echo "$ac_t""not found ($d: no such directory)" 1>&6
+     fi
+
+     echo $ac_n "checking for MIT-SCREEN-SAVER libs""... $ac_c" 1>&6
+echo "configure:3794: checking for MIT-SCREEN-SAVER libs" >&5
+     d=$with_mit/lib
+     if test -d $d; then
+       X_LIBS="-L$d $X_LIBS"
+       echo "$ac_t""$d" 1>&6
+     else
+       echo "$ac_t""not found ($d: no such directory)" 1>&6
+     fi
+
+     # replace the directory string with "yes".
+     with_mit_req="yes"
+     with_mit=$with_mit_req
+     ;;
+
+    *)
+     echo ""
+     echo "error: argument to --with-mit-ext must be \"yes\", \"no\", or a directory."
+     echo "       If it is a directory, then \`DIR/include' will be added to"
+     echo "       the -I list, and \`DIR/lib' will be added to the -L list."
+     exit 1
+     ;;
+   esac
+  
+
+if test "$with_mit" = yes; then
+  
+  ac_save_CPPFLAGS="$CPPFLAGS"
+  if test \! -z "$includedir" ; then 
+    CPPFLAGS="$CPPFLAGS -I$includedir"
+  fi
+  CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+  ac_safe=`echo "X11/extensions/scrnsaver.h" | sed 'y%./+-%__p_%'`
+echo $ac_n "checking for X11/extensions/scrnsaver.h""... $ac_c" 1>&6
+echo "configure:3827: checking for X11/extensions/scrnsaver.h" >&5
+if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 3832 "configure"
+#include "confdefs.h"
+#include <X11/extensions/scrnsaver.h>
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:3837: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+  rm -rf conftest*
+  eval "ac_cv_header_$ac_safe=yes"
+else
+  echo "$ac_err" >&5
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_header_$ac_safe=no"
+fi
+rm -f conftest*
+fi
+if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  have_mit=yes
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+  CPPFLAGS="$ac_save_CPPFLAGS"
+
+  # Now check to see if it's really in the library; XF86Free-3.3 ships
+  # scrnsaver.h, but doesn't include the code in libXext.a, the idiots!
+  #
+  if test "$have_mit" = yes; then
+    
+  ac_save_CPPFLAGS="$CPPFLAGS"
+  ac_save_LDFLAGS="$LDFLAGS"
+#  ac_save_LIBS="$LIBS"
+
+  if test \! -z "$includedir" ; then 
+    CPPFLAGS="$CPPFLAGS -I$includedir"
+  fi
+  # note: $X_CFLAGS includes $x_includes
+  CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+
+  if test \! -z "$libdir" ; then
+    LDFLAGS="$LDFLAGS -L$libdir"
+  fi
+  # note: $X_LIBS includes $x_libraries
+  LDFLAGS="$LDFLAGS $X_LIBS"
+
+  echo $ac_n "checking for XScreenSaverRegister in -lXext""... $ac_c" 1>&6
+echo "configure:3882: checking for XScreenSaverRegister in -lXext" >&5
+ac_lib_var=`echo Xext'_'XScreenSaverRegister | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  ac_save_LIBS="$LIBS"
+LIBS="-lXext -lm $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 3890 "configure"
+#include "confdefs.h"
+/* Override any gcc2 internal prototype to avoid an error.  */
+/* We use char because int might match the return type of a gcc2
+    builtin and then its argument prototype would still apply.  */
+char XScreenSaverRegister();
+
+int main() {
+XScreenSaverRegister()
+; return 0; }
+EOF
+if { (eval echo configure:3901: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  eval "ac_cv_lib_$ac_lib_var=yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_lib_$ac_lib_var=no"
+fi
+rm -f conftest*
+LIBS="$ac_save_LIBS"
+
+fi
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  true
+else
+  echo "$ac_t""no" 1>&6
+have_mit=no
+fi
+
+  CPPFLAGS="$ac_save_CPPFLAGS"
+  LDFLAGS="$ac_save_LDFLAGS"
+#  LIBS="$ac_save_LIBS"
+  
+
+    if test "$have_mit" = no; then
+      # Fuck!  Looks like XF86Free-3.3 actually puts it in XExExt instead
+      # of in Xext.  Thank you master, may I have another.
+      
+  ac_save_CPPFLAGS="$CPPFLAGS"
+  ac_save_LDFLAGS="$LDFLAGS"
+#  ac_save_LIBS="$LIBS"
+
+  if test \! -z "$includedir" ; then 
+    CPPFLAGS="$CPPFLAGS -I$includedir"
+  fi
+  # note: $X_CFLAGS includes $x_includes
+  CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+
+  if test \! -z "$libdir" ; then
+    LDFLAGS="$LDFLAGS -L$libdir"
+  fi
+  # note: $X_LIBS includes $x_libraries
+  LDFLAGS="$LDFLAGS $X_LIBS"
+
+  echo $ac_n "checking for XScreenSaverRegister in -lXExExt""... $ac_c" 1>&6
+echo "configure:3948: checking for XScreenSaverRegister in -lXExExt" >&5
+ac_lib_var=`echo XExExt'_'XScreenSaverRegister | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  ac_save_LIBS="$LIBS"
+LIBS="-lXExExt -lX11 -lXext -lm $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 3956 "configure"
+#include "confdefs.h"
+/* Override any gcc2 internal prototype to avoid an error.  */
+/* We use char because int might match the return type of a gcc2
+    builtin and then its argument prototype would still apply.  */
+char XScreenSaverRegister();
+
+int main() {
+XScreenSaverRegister()
+; return 0; }
+EOF
+if { (eval echo configure:3967: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  eval "ac_cv_lib_$ac_lib_var=yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_lib_$ac_lib_var=no"
+fi
+rm -f conftest*
+LIBS="$ac_save_LIBS"
+
+fi
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  have_mit=yes; SAVER_LIBS="$SAVER_LIBS -lXExExt"
+else
+  echo "$ac_t""no" 1>&6
+true
+fi
+
+  CPPFLAGS="$ac_save_CPPFLAGS"
+  LDFLAGS="$ac_save_LDFLAGS"
+#  LIBS="$ac_save_LIBS"
+  
+    fi
+
+    if test "$have_mit" = no; then
+      # Double fuck!  Looks like some versions of XFree86 (whichever version
+      # it is that comes with RedHat Linux 2.0 -- I can't find a version 
+      # number) put this garbage in Xss instead of Xext.  Thank you master,
+      #  may I have another.
+      
+  ac_save_CPPFLAGS="$CPPFLAGS"
+  ac_save_LDFLAGS="$LDFLAGS"
+#  ac_save_LIBS="$LIBS"
+
+  if test \! -z "$includedir" ; then 
+    CPPFLAGS="$CPPFLAGS -I$includedir"
+  fi
+  # note: $X_CFLAGS includes $x_includes
+  CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+
+  if test \! -z "$libdir" ; then
+    LDFLAGS="$LDFLAGS -L$libdir"
+  fi
+  # note: $X_LIBS includes $x_libraries
+  LDFLAGS="$LDFLAGS $X_LIBS"
+
+  echo $ac_n "checking for XScreenSaverRegister in -lXss""... $ac_c" 1>&6
+echo "configure:4017: checking for XScreenSaverRegister in -lXss" >&5
+ac_lib_var=`echo Xss'_'XScreenSaverRegister | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  ac_save_LIBS="$LIBS"
+LIBS="-lXss -lX11 -lXext -lm $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 4025 "configure"
+#include "confdefs.h"
+/* Override any gcc2 internal prototype to avoid an error.  */
+/* We use char because int might match the return type of a gcc2
+    builtin and then its argument prototype would still apply.  */
+char XScreenSaverRegister();
+
+int main() {
+XScreenSaverRegister()
+; return 0; }
+EOF
+if { (eval echo configure:4036: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  eval "ac_cv_lib_$ac_lib_var=yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_lib_$ac_lib_var=no"
+fi
+rm -f conftest*
+LIBS="$ac_save_LIBS"
+
+fi
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  have_mit=yes; SAVER_LIBS="$SAVER_LIBS -lXss"
+else
+  echo "$ac_t""no" 1>&6
+true
+fi
+
+  CPPFLAGS="$ac_save_CPPFLAGS"
+  LDFLAGS="$ac_save_LDFLAGS"
+#  LIBS="$ac_save_LIBS"
+  
+    fi
+
+  if test "$have_mit" = yes; then
+    cat >> confdefs.h <<\EOF
+#define HAVE_MIT_SAVER_EXTENSION 1
+EOF
+
+  fi
+
+  fi
+
+elif test "$with_mit" != no; then
+  echo "error: must be yes or no: --with-mit-ext=$with_mit"
+  exit 1
+fi
+
+
+###############################################################################
+#
+#       Check for the XIDLE server extension.
+#
+###############################################################################
+
+have_xidle=no
+with_xidle_req=unspecified
+# Check whether --with-xidle-ext or --without-xidle-ext was given.
+if test "${with_xidle_ext+set}" = set; then
+  withval="$with_xidle_ext"
+  with_xidle="$withval"; with_xidle_req="$withval"
+else
+  with_xidle=yes
+fi
+
+
+
+   case "$with_xidle" in
+    yes) ;;
+    no)  ;;
+
+    /*)
+     echo $ac_n "checking for XIDLE headers""... $ac_c" 1>&6
+echo "configure:4102: checking for XIDLE headers" >&5
+     d=$with_xidle/include
+     if test -d $d; then
+       X_CFLAGS="-I$d $X_CFLAGS"
+       echo "$ac_t""$d" 1>&6
+     else
+       echo "$ac_t""not found ($d: no such directory)" 1>&6
+     fi
+
+     echo $ac_n "checking for XIDLE libs""... $ac_c" 1>&6
+echo "configure:4112: checking for XIDLE libs" >&5
+     d=$with_xidle/lib
+     if test -d $d; then
+       X_LIBS="-L$d $X_LIBS"
+       echo "$ac_t""$d" 1>&6
+     else
+       echo "$ac_t""not found ($d: no such directory)" 1>&6
+     fi
+
+     # replace the directory string with "yes".
+     with_xidle_req="yes"
+     with_xidle=$with_xidle_req
+     ;;
+
+    *)
+     echo ""
+     echo "error: argument to --with-xidle-ext must be \"yes\", \"no\", or a directory."
+     echo "       If it is a directory, then \`DIR/include' will be added to"
+     echo "       the -I list, and \`DIR/lib' will be added to the -L list."
+     exit 1
+     ;;
+   esac
+  
+
+if test "$with_xidle" = yes; then
+  
+  ac_save_CPPFLAGS="$CPPFLAGS"
+  if test \! -z "$includedir" ; then 
+    CPPFLAGS="$CPPFLAGS -I$includedir"
+  fi
+  CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+  ac_safe=`echo "X11/extensions/xidle.h" | sed 'y%./+-%__p_%'`
+echo $ac_n "checking for X11/extensions/xidle.h""... $ac_c" 1>&6
+echo "configure:4145: checking for X11/extensions/xidle.h" >&5
+if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 4150 "configure"
+#include "confdefs.h"
+#include <X11/extensions/xidle.h>
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:4155: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+  rm -rf conftest*
+  eval "ac_cv_header_$ac_safe=yes"
+else
+  echo "$ac_err" >&5
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_header_$ac_safe=no"
+fi
+rm -f conftest*
+fi
+if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  have_xidle=yes
+                     cat >> confdefs.h <<\EOF
+#define HAVE_XIDLE_EXTENSION 1
+EOF
+
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+  CPPFLAGS="$ac_save_CPPFLAGS"
+elif test "$with_xidle" != no; then
+  echo "error: must be yes or no: --with-xidle-ext=$with_xidle"
+  exit 1
+fi
+
+
+###############################################################################
+#
+#       Check for the SGI-VIDEO-CONTROL server extension.
+#
+###############################################################################
+
+have_sgivc=no
+with_sgivc_req=unspecified
+# Check whether --with-sgivc-ext or --without-sgivc-ext was given.
+if test "${with_sgivc_ext+set}" = set; then
+  withval="$with_sgivc_ext"
+  with_sgivc="$withval"; with_sgivc_req="$withval"
+else
+  with_sgivc=yes
+fi
+
+
+
+   case "$with_sgivc" in
+    yes) ;;
+    no)  ;;
+
+    /*)
+     echo $ac_n "checking for SGI-VIDEO-CONTROL headers""... $ac_c" 1>&6
+echo "configure:4211: checking for SGI-VIDEO-CONTROL headers" >&5
+     d=$with_sgivc/include
+     if test -d $d; then
+       X_CFLAGS="-I$d $X_CFLAGS"
+       echo "$ac_t""$d" 1>&6
+     else
+       echo "$ac_t""not found ($d: no such directory)" 1>&6
+     fi
+
+     echo $ac_n "checking for SGI-VIDEO-CONTROL libs""... $ac_c" 1>&6
+echo "configure:4221: checking for SGI-VIDEO-CONTROL libs" >&5
+     d=$with_sgivc/lib
+     if test -d $d; then
+       X_LIBS="-L$d $X_LIBS"
+       echo "$ac_t""$d" 1>&6
+     else
+       echo "$ac_t""not found ($d: no such directory)" 1>&6
+     fi
+
+     # replace the directory string with "yes".
+     with_sgivc_req="yes"
+     with_sgivc=$with_sgivc_req
+     ;;
+
+    *)
+     echo ""
+     echo "error: argument to --with-sgivc-ext must be \"yes\", \"no\", or a directory."
+     echo "       If it is a directory, then \`DIR/include' will be added to"
+     echo "       the -I list, and \`DIR/lib' will be added to the -L list."
+     exit 1
+     ;;
+   esac
+  
+
+if test "$with_sgivc" = yes; then
+
+  # first check for XSGIvc.h
+  
+  ac_save_CPPFLAGS="$CPPFLAGS"
+  if test \! -z "$includedir" ; then 
+    CPPFLAGS="$CPPFLAGS -I$includedir"
+  fi
+  CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+  ac_safe=`echo "X11/extensions/XSGIvc.h" | sed 'y%./+-%__p_%'`
+echo $ac_n "checking for X11/extensions/XSGIvc.h""... $ac_c" 1>&6
+echo "configure:4256: checking for X11/extensions/XSGIvc.h" >&5
+if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 4261 "configure"
+#include "confdefs.h"
+#include <X11/extensions/XSGIvc.h>
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:4266: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+  rm -rf conftest*
+  eval "ac_cv_header_$ac_safe=yes"
+else
+  echo "$ac_err" >&5
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_header_$ac_safe=no"
+fi
+rm -f conftest*
+fi
+if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  have_sgivc=yes
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+  CPPFLAGS="$ac_save_CPPFLAGS"
+
+  # if that succeeded, then check for the -lXsgivc
+  if test "$have_sgivc" = yes; then
+    have_sgivc=no
+    
+  ac_save_CPPFLAGS="$CPPFLAGS"
+  ac_save_LDFLAGS="$LDFLAGS"
+#  ac_save_LIBS="$LIBS"
+
+  if test \! -z "$includedir" ; then 
+    CPPFLAGS="$CPPFLAGS -I$includedir"
+  fi
+  # note: $X_CFLAGS includes $x_includes
+  CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+
+  if test \! -z "$libdir" ; then
+    LDFLAGS="$LDFLAGS -L$libdir"
+  fi
+  # note: $X_LIBS includes $x_libraries
+  LDFLAGS="$LDFLAGS $X_LIBS"
+
+  echo $ac_n "checking for XSGIvcQueryGammaMap in -lXsgivc""... $ac_c" 1>&6
+echo "configure:4310: checking for XSGIvcQueryGammaMap in -lXsgivc" >&5
+ac_lib_var=`echo Xsgivc'_'XSGIvcQueryGammaMap | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  ac_save_LIBS="$LIBS"
+LIBS="-lXsgivc -lXext -lX11 $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 4318 "configure"
+#include "confdefs.h"
+/* Override any gcc2 internal prototype to avoid an error.  */
+/* We use char because int might match the return type of a gcc2
+    builtin and then its argument prototype would still apply.  */
+char XSGIvcQueryGammaMap();
+
+int main() {
+XSGIvcQueryGammaMap()
+; return 0; }
+EOF
+if { (eval echo configure:4329: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  eval "ac_cv_lib_$ac_lib_var=yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_lib_$ac_lib_var=no"
+fi
+rm -f conftest*
+LIBS="$ac_save_LIBS"
+
+fi
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  have_sgivc=yes; SAVER_LIBS="$SAVER_LIBS -lXsgivc"
+else
+  echo "$ac_t""no" 1>&6
+true
+fi
+
+  CPPFLAGS="$ac_save_CPPFLAGS"
+  LDFLAGS="$ac_save_LDFLAGS"
+#  LIBS="$ac_save_LIBS"
+  
+  fi
+
+  # if that succeeded, then we've really got it.
+  if test "$have_sgivc" = yes; then
+    cat >> confdefs.h <<\EOF
+#define HAVE_SGI_VC_EXTENSION 1
+EOF
+
+  fi
+
+elif test "$with_sgivc" != no; then
+  echo "error: must be yes or no: --with-sgivc-ext=$with_sgivc"
+  exit 1
+fi
+
+
+###############################################################################
+#
+#       Check for the DPMS server extension.
+#
+###############################################################################
+
+have_dpms=no
+with_dpms_req=unspecified
+# Check whether --with-dpms-ext or --without-dpms-ext was given.
+if test "${with_dpms_ext+set}" = set; then
+  withval="$with_dpms_ext"
+  with_dpms="$withval"; with_dpms_req="$withval"
+else
+  with_dpms=yes
+fi
+
+
+
+   case "$with_dpms" in
+    yes) ;;
+    no)  ;;
+
+    /*)
+     echo $ac_n "checking for DPMS headers""... $ac_c" 1>&6
+echo "configure:4394: checking for DPMS headers" >&5
+     d=$with_dpms/include
+     if test -d $d; then
+       X_CFLAGS="-I$d $X_CFLAGS"
+       echo "$ac_t""$d" 1>&6
+     else
+       echo "$ac_t""not found ($d: no such directory)" 1>&6
+     fi
+
+     echo $ac_n "checking for DPMS libs""... $ac_c" 1>&6
+echo "configure:4404: checking for DPMS libs" >&5
+     d=$with_dpms/lib
+     if test -d $d; then
+       X_LIBS="-L$d $X_LIBS"
+       echo "$ac_t""$d" 1>&6
+     else
+       echo "$ac_t""not found ($d: no such directory)" 1>&6
+     fi
+
+     # replace the directory string with "yes".
+     with_dpms_req="yes"
+     with_dpms=$with_dpms_req
+     ;;
+
+    *)
+     echo ""
+     echo "error: argument to --with-dpms-ext must be \"yes\", \"no\", or a directory."
+     echo "       If it is a directory, then \`DIR/include' will be added to"
+     echo "       the -I list, and \`DIR/lib' will be added to the -L list."
+     exit 1
+     ;;
+   esac
+  
+
+if test "$with_dpms" = yes; then
+
+  # first check for dpms.h
+  
+  ac_save_CPPFLAGS="$CPPFLAGS"
+  if test \! -z "$includedir" ; then 
+    CPPFLAGS="$CPPFLAGS -I$includedir"
+  fi
+  CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+  ac_safe=`echo "X11/extensions/dpms.h" | sed 'y%./+-%__p_%'`
+echo $ac_n "checking for X11/extensions/dpms.h""... $ac_c" 1>&6
+echo "configure:4439: checking for X11/extensions/dpms.h" >&5
+if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 4444 "configure"
+#include "confdefs.h"
+#include <X11/extensions/dpms.h>
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:4449: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+  rm -rf conftest*
+  eval "ac_cv_header_$ac_safe=yes"
+else
+  echo "$ac_err" >&5
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_header_$ac_safe=no"
+fi
+rm -f conftest*
+fi
+if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  have_dpms=yes
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+  CPPFLAGS="$ac_save_CPPFLAGS"
+
+  # if that succeeded, then check for the -lXdpms
+  if test "$have_dpms" = yes; then
+    have_dpms=no
+    
+  ac_save_CPPFLAGS="$CPPFLAGS"
+  ac_save_LDFLAGS="$LDFLAGS"
+#  ac_save_LIBS="$LIBS"
+
+  if test \! -z "$includedir" ; then 
+    CPPFLAGS="$CPPFLAGS -I$includedir"
+  fi
+  # note: $X_CFLAGS includes $x_includes
+  CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+
+  if test \! -z "$libdir" ; then
+    LDFLAGS="$LDFLAGS -L$libdir"
+  fi
+  # note: $X_LIBS includes $x_libraries
+  LDFLAGS="$LDFLAGS $X_LIBS"
+
+  echo $ac_n "checking for DPMSInfo in -lXdpms""... $ac_c" 1>&6
+echo "configure:4493: checking for DPMSInfo in -lXdpms" >&5
+ac_lib_var=`echo Xdpms'_'DPMSInfo | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  ac_save_LIBS="$LIBS"
+LIBS="-lXdpms -lXext -lX11 $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 4501 "configure"
+#include "confdefs.h"
+/* Override any gcc2 internal prototype to avoid an error.  */
+/* We use char because int might match the return type of a gcc2
+    builtin and then its argument prototype would still apply.  */
+char DPMSInfo();
+
+int main() {
+DPMSInfo()
+; return 0; }
+EOF
+if { (eval echo configure:4512: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  eval "ac_cv_lib_$ac_lib_var=yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_lib_$ac_lib_var=no"
+fi
+rm -f conftest*
+LIBS="$ac_save_LIBS"
+
+fi
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  have_dpms=yes; SAVER_LIBS="$SAVER_LIBS -lXdpms"
+else
+  echo "$ac_t""no" 1>&6
+true
+fi
+
+  CPPFLAGS="$ac_save_CPPFLAGS"
+  LDFLAGS="$ac_save_LDFLAGS"
+#  LIBS="$ac_save_LIBS"
+  
+  fi
+
+  # if that succeeded, then we've really got it.
+  if test "$have_dpms" = yes; then
+    cat >> confdefs.h <<\EOF
+#define HAVE_DPMS_EXTENSION 1
+EOF
+
+  fi
+
+elif test "$with_dpms" != no; then
+  echo "error: must be yes or no: --with-dpms-ext=$with_dpms"
+  exit 1
+fi
+
+
+###############################################################################
+#
+#       Check for the XF86VMODE server extension.
+#
+###############################################################################
+
+have_xf86vmode=no
+with_xf86vmode_req=unspecified
+# Check whether --with-xf86vmode-ext or --without-xf86vmode-ext was given.
+if test "${with_xf86vmode_ext+set}" = set; then
+  withval="$with_xf86vmode_ext"
+  with_xf86vmode="$withval"; with_xf86vmode_req="$withval"
+else
+  with_xf86vmode=yes
+fi
+
+
+
+   case "$with_xf86vmode" in
+    yes) ;;
+    no)  ;;
+
+    /*)
+     echo $ac_n "checking for xf86vmode headers""... $ac_c" 1>&6
+echo "configure:4577: checking for xf86vmode headers" >&5
+     d=$with_xf86vmode/include
+     if test -d $d; then
+       X_CFLAGS="-I$d $X_CFLAGS"
+       echo "$ac_t""$d" 1>&6
+     else
+       echo "$ac_t""not found ($d: no such directory)" 1>&6
+     fi
+
+     echo $ac_n "checking for xf86vmode libs""... $ac_c" 1>&6
+echo "configure:4587: checking for xf86vmode libs" >&5
+     d=$with_xf86vmode/lib
+     if test -d $d; then
+       X_LIBS="-L$d $X_LIBS"
+       echo "$ac_t""$d" 1>&6
+     else
+       echo "$ac_t""not found ($d: no such directory)" 1>&6
+     fi
+
+     # replace the directory string with "yes".
+     with_xf86vmode_req="yes"
+     with_xf86vmode=$with_xf86vmode_req
+     ;;
+
+    *)
+     echo ""
+     echo "error: argument to --with-xf86vmode-ext must be \"yes\", \"no\", or a directory."
+     echo "       If it is a directory, then \`DIR/include' will be added to"
+     echo "       the -I list, and \`DIR/lib' will be added to the -L list."
+     exit 1
+     ;;
+   esac
+  
+
+if test "$with_xf86vmode" = yes; then
+
+  # first check for xf86vmode.h
+  
+  ac_save_CPPFLAGS="$CPPFLAGS"
+  if test \! -z "$includedir" ; then 
+    CPPFLAGS="$CPPFLAGS -I$includedir"
+  fi
+  CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+  ac_safe=`echo "X11/extensions/xf86vmode.h" | sed 'y%./+-%__p_%'`
+echo $ac_n "checking for X11/extensions/xf86vmode.h""... $ac_c" 1>&6
+echo "configure:4622: checking for X11/extensions/xf86vmode.h" >&5
+if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 4627 "configure"
+#include "confdefs.h"
+#include <X11/extensions/xf86vmode.h>
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:4632: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+  rm -rf conftest*
+  eval "ac_cv_header_$ac_safe=yes"
+else
+  echo "$ac_err" >&5
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_header_$ac_safe=no"
+fi
+rm -f conftest*
+fi
+if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  have_xf86vmode=yes
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+  CPPFLAGS="$ac_save_CPPFLAGS"
+
+  # if that succeeded, then check for the -lXxf86vm
+  if test "$have_xf86vmode" = yes; then
+    have_xf86vmode=no
+    
+  ac_save_CPPFLAGS="$CPPFLAGS"
+  ac_save_LDFLAGS="$LDFLAGS"
+#  ac_save_LIBS="$LIBS"
+
+  if test \! -z "$includedir" ; then 
+    CPPFLAGS="$CPPFLAGS -I$includedir"
+  fi
+  # note: $X_CFLAGS includes $x_includes
+  CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+
+  if test \! -z "$libdir" ; then
+    LDFLAGS="$LDFLAGS -L$libdir"
+  fi
+  # note: $X_LIBS includes $x_libraries
+  LDFLAGS="$LDFLAGS $X_LIBS"
+
+  echo $ac_n "checking for XF86VidModeGetViewPort in -lXxf86vm""... $ac_c" 1>&6
+echo "configure:4676: checking for XF86VidModeGetViewPort in -lXxf86vm" >&5
+ac_lib_var=`echo Xxf86vm'_'XF86VidModeGetViewPort | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  ac_save_LIBS="$LIBS"
+LIBS="-lXxf86vm -lXext -lX11 $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 4684 "configure"
+#include "confdefs.h"
+/* Override any gcc2 internal prototype to avoid an error.  */
+/* We use char because int might match the return type of a gcc2
+    builtin and then its argument prototype would still apply.  */
+char XF86VidModeGetViewPort();
+
+int main() {
+XF86VidModeGetViewPort()
+; return 0; }
+EOF
+if { (eval echo configure:4695: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  eval "ac_cv_lib_$ac_lib_var=yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_lib_$ac_lib_var=no"
+fi
+rm -f conftest*
+LIBS="$ac_save_LIBS"
+
+fi
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  have_xf86vmode=yes; SAVER_LIBS="$SAVER_LIBS -lXxf86vm"
+else
+  echo "$ac_t""no" 1>&6
+true
+fi
+
+  CPPFLAGS="$ac_save_CPPFLAGS"
+  LDFLAGS="$ac_save_LDFLAGS"
+#  LIBS="$ac_save_LIBS"
+  
+  fi
+
+  # if that succeeded, then we've really got it.
+  if test "$have_xf86vmode" = yes; then
+    cat >> confdefs.h <<\EOF
+#define HAVE_XF86VMODE 1
+EOF
+
+  fi
+
+elif test "$with_xf86vmode" != no; then
+  echo "error: must be yes or no: --with-xf86vmode-ext=$with_xf86vmode"
+  exit 1
+fi
+
+
+###############################################################################
+#
+#       Check for HP XHPDisableReset and XHPEnableReset.
+#
+###############################################################################
+
+
+  ac_save_CPPFLAGS="$CPPFLAGS"
+  if test \! -z "$includedir" ; then 
+    CPPFLAGS="$CPPFLAGS -I$includedir"
+  fi
+  CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+  cat > conftest.$ac_ext <<EOF
+#line 4749 "configure"
+#include "confdefs.h"
+#include <X11/XHPlib.h>
+EOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  egrep "XHPDisableReset" >/dev/null 2>&1; then
+  rm -rf conftest*
+  cat >> confdefs.h <<\EOF
+#define HAVE_XHPDISABLERESET 1
+EOF
+
+                   SAVER_LIBS="-lXhp11 $SAVER_LIBS"
+fi
+rm -f conftest*
+
+  CPPFLAGS="$ac_save_CPPFLAGS"
+
+
+###############################################################################
+#
+#       Check for /proc/interrupts.
+#
+###############################################################################
+
+have_proc_interrupts=no
+with_proc_interrupts_req=unspecified
+# Check whether --with-proc-interrupts or --without-proc-interrupts was given.
+if test "${with_proc_interrupts+set}" = set; then
+  withval="$with_proc_interrupts"
+  with_proc_interrupts="$withval"; with_proc_interrupts_req="$withval"
+else
+  with_proc_interrupts=yes
+fi
+
+
+if test "$with_proc_interrupts" = yes; then
+
+   echo $ac_n "checking whether /proc/interrupts contains keyboard data""... $ac_c" 1>&6
+echo "configure:4787: checking whether /proc/interrupts contains keyboard data" >&5
+if eval "test \"`echo '$''{'ac_cv_have_proc_interrupts'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  ac_cv_have_proc_interrupts=no
+     if grep keyboard /proc/interrupts >/dev/null 2>&1 ; then
+       ac_cv_have_proc_interrupts=yes
+     fi
+    
+fi
+
+echo "$ac_t""$ac_cv_have_proc_interrupts" 1>&6
+   have_proc_interrupts=$ac_cv_have_proc_interrupts
+
+  if test "$have_proc_interrupts" = yes; then
+    cat >> confdefs.h <<\EOF
+#define HAVE_PROC_INTERRUPTS 1
+EOF
+
+  fi
+
+elif test "$with_proc_interrupts" != no; then
+  echo "error: must be yes or no: --with-proc-interrupts=$with_proc_interrupts"
+  exit 1
+fi
+
+
+###############################################################################
+#
+#       The --enable-locking option
+#
+###############################################################################
+
+# Check whether --enable-locking or --disable-locking was given.
+if test "${enable_locking+set}" = set; then
+  enableval="$enable_locking"
+  enable_locking="$enableval"
+else
+  enable_locking=yes
+fi
+
+if test "$enable_locking" = yes; then
+  true
+elif test "$enable_locking" = no; then
+  cat >> confdefs.h <<\EOF
+#define NO_LOCKING 1
+EOF
+
+else
+  echo "error: must be yes or no: --enable-locking=$enable_locking"
+  exit 1
+fi
+
+
+
+###############################################################################
+#
+#       The --enable-vt-locking option
+#
+###############################################################################
+
+#ac_vt_lockswitch=no
+#AC_ARG_ENABLE(vt-locking,[
+#  --enable-vt-locking     Compile in support for locking Virtual Terminals.
+#                          This is the default if the system supports it, and
+#                          if locking support is included (--enable-locking.)
+#  --disable-vt-locking    Do not allow locking of VTs, even if locking is
+#                          enabled.],
+#  [enable_vt_locking="$enableval"],[enable_vt_locking=yes])
+#if test "$enable_vt_locking" = yes; then
+#
+#  AC_CACHE_CHECK([for the VT_LOCKSWITCH ioctl], ac_cv_vt_lockswitch,
+#   [AC_TRY_COMPILE([#include <fcntl.h>
+#                   #include <sys/ioctl.h>
+#                   #include <sys/vt.h>],
+#                  [int x = VT_LOCKSWITCH; int y = VT_UNLOCKSWITCH;],
+#                  [ac_cv_vt_lockswitch=yes],
+#                  [ac_cv_vt_lockswitch=no])])
+#  ac_vt_lockswitch=$ac_cv_vt_lockswitch
+#
+#elif test "$enable_vt_locking" = no; then
+#  true
+#else
+#  echo "error: must be yes or no: --enable-vt-locking=$enable_vt_locking"
+#  exit 1
+#fi
+#
+#if test "$ac_vt_lockswitch" = yes; then
+#  AC_DEFINE(HAVE_VT_LOCKSWITCH)
+#  # the VT_LOCKSWITCH ioctl can only be used when running as root.
+#  # #### but it doesn't work yet, so don't worry about that for now.
+##  need_setuid=yes
+#fi
+
+
+
+###############################################################################
+#
+#       Check for PAM.
+#
+###############################################################################
+
+case "$host" in
+  *-solaris*)
+   # Solaris systems tend to come with PAM misconfigured.
+   #  Don't build it by default, even if the headers exist.
+   with_pam_default=no
+   ;;
+  *)
+   # Default to building PAM support on all other systems, if it exists.
+   with_pam_default=yes
+  ;;
+esac
+
+have_pam=no
+with_pam_req=unspecified
+
+# Check whether --with-pam or --without-pam was given.
+if test "${with_pam+set}" = set; then
+  withval="$with_pam"
+  with_pam="$withval"; with_pam_req="$withval"
+else
+  with_pam=$with_pam_default
+fi
+
+
+
+   case "$with_pam" in
+    yes) ;;
+    no)  ;;
+
+    /*)
+     echo $ac_n "checking for PAM headers""... $ac_c" 1>&6
+echo "configure:4920: checking for PAM headers" >&5
+     d=$with_pam/include
+     if test -d $d; then
+       X_CFLAGS="-I$d $X_CFLAGS"
+       echo "$ac_t""$d" 1>&6
+     else
+       echo "$ac_t""not found ($d: no such directory)" 1>&6
+     fi
+
+     echo $ac_n "checking for PAM libs""... $ac_c" 1>&6
+echo "configure:4930: checking for PAM libs" >&5
+     d=$with_pam/lib
+     if test -d $d; then
+       X_LIBS="-L$d $X_LIBS"
+       echo "$ac_t""$d" 1>&6
+     else
+       echo "$ac_t""not found ($d: no such directory)" 1>&6
+     fi
+
+     # replace the directory string with "yes".
+     with_pam_req="yes"
+     with_pam=$with_pam_req
+     ;;
+
+    *)
+     echo ""
+     echo "error: argument to --with-pam must be \"yes\", \"no\", or a directory."
+     echo "       If it is a directory, then \`DIR/include' will be added to"
+     echo "       the -I list, and \`DIR/lib' will be added to the -L list."
+     exit 1
+     ;;
+   esac
+  
+
+if test "$enable_locking" = yes -a "$with_pam" = yes; then
+  echo $ac_n "checking for PAM""... $ac_c" 1>&6
+echo "configure:4956: checking for PAM" >&5
+if eval "test \"`echo '$''{'ac_cv_pam'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  
+  ac_save_CPPFLAGS="$CPPFLAGS"
+  if test \! -z "$includedir" ; then 
+    CPPFLAGS="$CPPFLAGS -I$includedir"
+  fi
+  CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+  cat > conftest.$ac_ext <<EOF
+#line 4967 "configure"
+#include "confdefs.h"
+#include <security/pam_appl.h>
+int main() {
+
+; return 0; }
+EOF
+if { (eval echo configure:4974: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+  rm -rf conftest*
+  ac_cv_pam=yes
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  ac_cv_pam=no
+fi
+rm -f conftest*
+  CPPFLAGS="$ac_save_CPPFLAGS"
+fi
+
+echo "$ac_t""$ac_cv_pam" 1>&6
+  if test "$ac_cv_pam" = yes ; then
+    have_pam=yes
+    cat >> confdefs.h <<\EOF
+#define HAVE_PAM 1
+EOF
+
+    PASSWD_LIBS="${PASSWD_LIBS} -lpam"
+
+    # libpam typically requires dlopen and dlsym.  On FreeBSD,
+    # those are in libc.  On Linux and Solaris, they're in libdl.
+    echo $ac_n "checking for dlopen in -ldl""... $ac_c" 1>&6
+echo "configure:4999: checking for dlopen in -ldl" >&5
+ac_lib_var=`echo dl'_'dlopen | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  ac_save_LIBS="$LIBS"
+LIBS="-ldl  $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 5007 "configure"
+#include "confdefs.h"
+/* Override any gcc2 internal prototype to avoid an error.  */
+/* We use char because int might match the return type of a gcc2
+    builtin and then its argument prototype would still apply.  */
+char dlopen();
+
+int main() {
+dlopen()
+; return 0; }
+EOF
+if { (eval echo configure:5018: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  eval "ac_cv_lib_$ac_lib_var=yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_lib_$ac_lib_var=no"
+fi
+rm -f conftest*
+LIBS="$ac_save_LIBS"
+
+fi
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  PASSWD_LIBS="${PASSWD_LIBS} -ldl"
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+
+    echo $ac_n "checking how to call pam_strerror""... $ac_c" 1>&6
+echo "configure:5040: checking how to call pam_strerror" >&5
+    if eval "test \"`echo '$''{'ac_cv_pam_strerror_args'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 5045 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+                      #include <stdlib.h>
+                      #include <security/pam_appl.h>
+int main() {
+pam_handle_t *pamh = 0;
+                      char *s = pam_strerror(pamh, PAM_SUCCESS);
+; return 0; }
+EOF
+if { (eval echo configure:5055: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+  rm -rf conftest*
+  ac_pam_strerror_args=2
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  cat > conftest.$ac_ext <<EOF
+#line 5063 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+                                      #include <stdlib.h>
+                                      #include <security/pam_appl.h>
+int main() {
+char *s =
+                                       pam_strerror(PAM_SUCCESS);
+; return 0; }
+EOF
+if { (eval echo configure:5073: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+  rm -rf conftest*
+  ac_pam_strerror_args=1
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  ac_pam_strerror_args=0
+fi
+rm -f conftest*
+fi
+rm -f conftest*
+      ac_cv_pam_strerror_args=$ac_pam_strerror_args
+fi
+
+    ac_pam_strerror_args=$ac_cv_pam_strerror_args
+    if test "$ac_pam_strerror_args" = 1 ; then
+      echo "$ac_t""one argument" 1>&6
+    elif test "$ac_pam_strerror_args" = 2 ; then
+      cat >> confdefs.h <<\EOF
+#define PAM_STRERROR_TWO_ARGS 1
+EOF
+
+      echo "$ac_t""two arguments" 1>&6
+    else
+      echo "$ac_t""unknown" 1>&6
+    fi
+  fi
+fi
+
+
+###############################################################################
+#
+#       Check for Kerberos.
+#
+###############################################################################
+
+have_kerberos=no
+with_kerberos_req=unspecified
+
+# Check whether --with-kerberos or --without-kerberos was given.
+if test "${with_kerberos+set}" = set; then
+  withval="$with_kerberos"
+  with_kerberos="$withval"; with_kerberos_req="$withval"
+else
+  with_kerberos=yes
+fi
+
+
+
+   case "$with_kerberos" in
+    yes) ;;
+    no)  ;;
+
+    /*)
+     echo $ac_n "checking for Kerberos headers""... $ac_c" 1>&6
+echo "configure:5129: checking for Kerberos headers" >&5
+     d=$with_kerberos/include
+     if test -d $d; then
+       X_CFLAGS="-I$d $X_CFLAGS"
+       echo "$ac_t""$d" 1>&6
+     else
+       echo "$ac_t""not found ($d: no such directory)" 1>&6
+     fi
+
+     echo $ac_n "checking for Kerberos libs""... $ac_c" 1>&6
+echo "configure:5139: checking for Kerberos libs" >&5
+     d=$with_kerberos/lib
+     if test -d $d; then
+       X_LIBS="-L$d $X_LIBS"
+       echo "$ac_t""$d" 1>&6
+     else
+       echo "$ac_t""not found ($d: no such directory)" 1>&6
+     fi
+
+     # replace the directory string with "yes".
+     with_kerberos_req="yes"
+     with_kerberos=$with_kerberos_req
+     ;;
+
+    *)
+     echo ""
+     echo "error: argument to --with-kerberos must be \"yes\", \"no\", or a directory."
+     echo "       If it is a directory, then \`DIR/include' will be added to"
+     echo "       the -I list, and \`DIR/lib' will be added to the -L list."
+     exit 1
+     ;;
+   esac
+  
+
+if test "$enable_locking" = yes -a "$with_kerberos" = yes; then
+  echo $ac_n "checking for Kerberos""... $ac_c" 1>&6
+echo "configure:5165: checking for Kerberos" >&5
+if eval "test \"`echo '$''{'ac_cv_kerberos'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  
+  ac_save_CPPFLAGS="$CPPFLAGS"
+  if test \! -z "$includedir" ; then 
+    CPPFLAGS="$CPPFLAGS -I$includedir"
+  fi
+  CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+  cat > conftest.$ac_ext <<EOF
+#line 5176 "configure"
+#include "confdefs.h"
+#include <krb.h>
+int main() {
+
+; return 0; }
+EOF
+if { (eval echo configure:5183: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+  rm -rf conftest*
+  ac_cv_kerberos=yes
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  ac_cv_kerberos=no
+fi
+rm -f conftest*
+  CPPFLAGS="$ac_save_CPPFLAGS"
+fi
+
+echo "$ac_t""$ac_cv_kerberos" 1>&6
+  if test "$ac_cv_kerberos" = yes ; then
+    have_kerberos=yes
+    cat >> confdefs.h <<\EOF
+#define HAVE_KERBEROS 1
+EOF
+
+
+    # from Tim Showalter <tjs+@andrew.cmu.edu>
+    PASSWD_LIBS="$PASSWD_LIBS -lkrb -ldes"
+    echo $ac_n "checking for res_search""... $ac_c" 1>&6
+echo "configure:5207: checking for res_search" >&5
+if eval "test \"`echo '$''{'ac_cv_func_res_search'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 5212 "configure"
+#include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+    which can conflict with char res_search(); below.  */
+#include <assert.h>
+/* Override any gcc2 internal prototype to avoid an error.  */
+/* We use char because int might match the return type of a gcc2
+    builtin and then its argument prototype would still apply.  */
+char res_search();
+
+int main() {
+
+/* The GNU C library defines this for functions which it implements
+    to always fail with ENOSYS.  Some functions are actually named
+    something starting with __ and the normal name is an alias.  */
+#if defined (__stub_res_search) || defined (__stub___res_search)
+choke me
+#else
+res_search();
+#endif
+
+; return 0; }
+EOF
+if { (eval echo configure:5235: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  eval "ac_cv_func_res_search=yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_func_res_search=no"
+fi
+rm -f conftest*
+fi
+
+if eval "test \"`echo '$ac_cv_func_'res_search`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  :
+else
+  echo "$ac_t""no" 1>&6
+echo $ac_n "checking for res_search in -lresolv""... $ac_c" 1>&6
+echo "configure:5253: checking for res_search in -lresolv" >&5
+ac_lib_var=`echo resolv'_'res_search | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  ac_save_LIBS="$LIBS"
+LIBS="-lresolv  $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 5261 "configure"
+#include "confdefs.h"
+/* Override any gcc2 internal prototype to avoid an error.  */
+/* We use char because int might match the return type of a gcc2
+    builtin and then its argument prototype would still apply.  */
+char res_search();
+
+int main() {
+res_search()
+; return 0; }
+EOF
+if { (eval echo configure:5272: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  eval "ac_cv_lib_$ac_lib_var=yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_lib_$ac_lib_var=no"
+fi
+rm -f conftest*
+LIBS="$ac_save_LIBS"
+
+fi
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  PASSWD_LIBS="${PASSWD_LIBS} -lresolv"
+else
+  echo "$ac_t""no" 1>&6
+echo "configure: warning: Can't find DNS resolver libraries needed for Kerberos" 1>&2
+      
+fi
+
+fi
+
+
+  fi
+fi
+
+
+###############################################################################
+#
+#       Check for the nine billion variants of shadow passwords...
+#
+###############################################################################
+
+need_setuid=no
+
+have_shadow=no
+with_shadow_req=unspecified
+
+# Check whether --with-shadow or --without-shadow was given.
+if test "${with_shadow+set}" = set; then
+  withval="$with_shadow"
+  with_shadow="$withval"; with_shadow_req="$withval"
+else
+  with_shadow=yes
+fi
+
+
+
+   case "$with_shadow" in
+    yes) ;;
+    no)  ;;
+
+    /*)
+     echo $ac_n "checking for shadow password headers""... $ac_c" 1>&6
+echo "configure:5328: checking for shadow password headers" >&5
+     d=$with_shadow/include
+     if test -d $d; then
+       X_CFLAGS="-I$d $X_CFLAGS"
+       echo "$ac_t""$d" 1>&6
+     else
+       echo "$ac_t""not found ($d: no such directory)" 1>&6
+     fi
+
+     echo $ac_n "checking for shadow password libs""... $ac_c" 1>&6
+echo "configure:5338: checking for shadow password libs" >&5
+     d=$with_shadow/lib
+     if test -d $d; then
+       X_LIBS="-L$d $X_LIBS"
+       echo "$ac_t""$d" 1>&6
+     else
+       echo "$ac_t""not found ($d: no such directory)" 1>&6
+     fi
+
+     # replace the directory string with "yes".
+     with_shadow_req="yes"
+     with_shadow=$with_shadow_req
+     ;;
+
+    *)
+     echo ""
+     echo "error: argument to --with-shadow must be \"yes\", \"no\", or a directory."
+     echo "       If it is a directory, then \`DIR/include' will be added to"
+     echo "       the -I list, and \`DIR/lib' will be added to the -L list."
+     exit 1
+     ;;
+   esac
+  
+
+if test "$enable_locking" = no ; then
+  with_shadow_req=no
+  with_shadow=no
+fi
+
+
+###############################################################################
+#
+#       Check for Sun "adjunct" passwords.
+#
+###############################################################################
+
+if test "$with_shadow" = yes ; then
+  echo $ac_n "checking for Sun-style shadow passwords""... $ac_c" 1>&6
+echo "configure:5376: checking for Sun-style shadow passwords" >&5
+if eval "test \"`echo '$''{'ac_cv_sun_adjunct'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  
+  ac_save_CPPFLAGS="$CPPFLAGS"
+  if test \! -z "$includedir" ; then 
+    CPPFLAGS="$CPPFLAGS -I$includedir"
+  fi
+  CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+  cat > conftest.$ac_ext <<EOF
+#line 5387 "configure"
+#include "confdefs.h"
+#include <stdlib.h>
+                                    #include <unistd.h>
+                                    #include <sys/types.h>
+                                    #include <sys/label.h>
+                                    #include <sys/audit.h>
+                                    #include <pwdadj.h>
+int main() {
+struct passwd_adjunct *p = getpwanam("nobody");
+                       const char *pw = p->pwa_passwd;
+; return 0; }
+EOF
+if { (eval echo configure:5400: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+  rm -rf conftest*
+  ac_cv_sun_adjunct=yes
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  ac_cv_sun_adjunct=no
+fi
+rm -f conftest*
+  CPPFLAGS="$ac_save_CPPFLAGS"
+fi
+
+echo "$ac_t""$ac_cv_sun_adjunct" 1>&6
+  if test "$ac_cv_sun_adjunct" = yes; then
+    have_shadow_adjunct=yes
+    have_shadow=yes
+    need_setuid=yes
+  fi
+fi
+
+
+###############################################################################
+#
+#       Check for DEC and SCO so-called "enhanced" security.
+#
+###############################################################################
+
+if test "$with_shadow" = yes ; then
+  echo $ac_n "checking for DEC-style shadow passwords""... $ac_c" 1>&6
+echo "configure:5430: checking for DEC-style shadow passwords" >&5
+if eval "test \"`echo '$''{'ac_cv_enhanced_passwd'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  
+  ac_save_CPPFLAGS="$CPPFLAGS"
+  if test \! -z "$includedir" ; then 
+    CPPFLAGS="$CPPFLAGS -I$includedir"
+  fi
+  CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+  cat > conftest.$ac_ext <<EOF
+#line 5441 "configure"
+#include "confdefs.h"
+#include <stdlib.h>
+                                    #include <unistd.h>
+                                    #include <sys/types.h>
+                                    #include <pwd.h>
+                                    #include <sys/security.h>
+                                    #include <prot.h>
+int main() {
+struct pr_passwd *p;
+                       const char *pw;
+                       set_auth_parameters(0, 0);
+                       check_auth_parameters();
+                       p = getprpwnam("nobody");
+                       pw = p->ufld.fd_encrypt;
+; return 0; }
+EOF
+if { (eval echo configure:5458: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+  rm -rf conftest*
+  ac_cv_enhanced_passwd=yes
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  ac_cv_enhanced_passwd=no
+fi
+rm -f conftest*
+  CPPFLAGS="$ac_save_CPPFLAGS"
+fi
+
+echo "$ac_t""$ac_cv_enhanced_passwd" 1>&6
+  if test $ac_cv_enhanced_passwd = yes; then
+    have_shadow_enhanced=yes
+    have_shadow=yes
+    need_setuid=yes
+
+    # On SCO, getprpwnam() is in -lprot (which uses nap() from -lx)
+    # (I'm told it needs -lcurses too, but I don't understand why.)
+    # But on DEC, it's in -lsecurity.
+    #
+    echo $ac_n "checking for getprpwnam in -lprot""... $ac_c" 1>&6
+echo "configure:5482: checking for getprpwnam in -lprot" >&5
+ac_lib_var=`echo prot'_'getprpwnam | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  ac_save_LIBS="$LIBS"
+LIBS="-lprot -lx $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 5490 "configure"
+#include "confdefs.h"
+/* Override any gcc2 internal prototype to avoid an error.  */
+/* We use char because int might match the return type of a gcc2
+    builtin and then its argument prototype would still apply.  */
+char getprpwnam();
+
+int main() {
+getprpwnam()
+; return 0; }
+EOF
+if { (eval echo configure:5501: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  eval "ac_cv_lib_$ac_lib_var=yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_lib_$ac_lib_var=no"
+fi
+rm -f conftest*
+LIBS="$ac_save_LIBS"
+
+fi
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  PASSWD_LIBS="$PASSWD_LIBS -lprot -lcurses -lx"
+else
+  echo "$ac_t""no" 1>&6
+echo $ac_n "checking for getprpwnam in -lsecurity""... $ac_c" 1>&6
+echo "configure:5520: checking for getprpwnam in -lsecurity" >&5
+ac_lib_var=`echo security'_'getprpwnam | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  ac_save_LIBS="$LIBS"
+LIBS="-lsecurity  $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 5528 "configure"
+#include "confdefs.h"
+/* Override any gcc2 internal prototype to avoid an error.  */
+/* We use char because int might match the return type of a gcc2
+    builtin and then its argument prototype would still apply.  */
+char getprpwnam();
+
+int main() {
+getprpwnam()
+; return 0; }
+EOF
+if { (eval echo configure:5539: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  eval "ac_cv_lib_$ac_lib_var=yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_lib_$ac_lib_var=no"
+fi
+rm -f conftest*
+LIBS="$ac_save_LIBS"
+
+fi
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  PASSWD_LIBS="$PASSWD_LIBS -lsecurity"
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+fi
+
+  fi
+fi
+
+###############################################################################
+#
+#       Check for HP's entry in the "Not Invented Here" Sweepstakes.
+#
+###############################################################################
+
+if test "$with_shadow" = yes ; then
+  echo $ac_n "checking for HP-style shadow passwords""... $ac_c" 1>&6
+echo "configure:5572: checking for HP-style shadow passwords" >&5
+if eval "test \"`echo '$''{'ac_cv_hpux_passwd'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  
+  ac_save_CPPFLAGS="$CPPFLAGS"
+  if test \! -z "$includedir" ; then 
+    CPPFLAGS="$CPPFLAGS -I$includedir"
+  fi
+  CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+  cat > conftest.$ac_ext <<EOF
+#line 5583 "configure"
+#include "confdefs.h"
+#include <stdlib.h>
+                                    #include <unistd.h>
+                                    #include <sys/types.h>
+                                    #include <pwd.h>
+                                    #include <hpsecurity.h>
+                                    #include <prot.h>
+int main() {
+struct s_passwd *p = getspwnam("nobody");
+                       const char *pw = p->pw_passwd;
+; return 0; }
+EOF
+if { (eval echo configure:5596: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+  rm -rf conftest*
+  ac_cv_hpux_passwd=yes
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  ac_cv_hpux_passwd=no
+fi
+rm -f conftest*
+  CPPFLAGS="$ac_save_CPPFLAGS"
+fi
+
+echo "$ac_t""$ac_cv_hpux_passwd" 1>&6
+  if test "$ac_cv_hpux_passwd" = yes; then
+    have_shadow_hpux=yes
+    have_shadow=yes
+    need_setuid=yes
+
+    # on HPUX, bigcrypt is in -lsec
+    echo $ac_n "checking for bigcrypt in -lsec""... $ac_c" 1>&6
+echo "configure:5617: checking for bigcrypt in -lsec" >&5
+ac_lib_var=`echo sec'_'bigcrypt | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  ac_save_LIBS="$LIBS"
+LIBS="-lsec  $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 5625 "configure"
+#include "confdefs.h"
+/* Override any gcc2 internal prototype to avoid an error.  */
+/* We use char because int might match the return type of a gcc2
+    builtin and then its argument prototype would still apply.  */
+char bigcrypt();
+
+int main() {
+bigcrypt()
+; return 0; }
+EOF
+if { (eval echo configure:5636: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  eval "ac_cv_lib_$ac_lib_var=yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_lib_$ac_lib_var=no"
+fi
+rm -f conftest*
+LIBS="$ac_save_LIBS"
+
+fi
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  PASSWD_LIBS="$PASSWD_LIBS -lsec"
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+  fi
+fi
+
+
+###############################################################################
+#
+#       Check for FreeBSD-style shadow passwords.
+#
+#       On FreeBSD, getpwnam() and friends work just like on non-shadow-
+#       password systems -- except you only get stuff in the pw_passwd field
+#       if the running program is setuid.  So, guess that we've got this
+#       lossage to contend with if /etc/master.passwd exists, and default to
+#       a setuid installation.
+#
+###############################################################################
+
+if test "$with_shadow" = yes ; then
+  echo $ac_n "checking for FreeBSD-style shadow passwords""... $ac_c" 1>&6
+echo "configure:5674: checking for FreeBSD-style shadow passwords" >&5
+if eval "test \"`echo '$''{'ac_cv_master_passwd'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  if test -f /etc/master.passwd ; then
+                    ac_cv_master_passwd=yes
+                  else
+                    ac_cv_master_passwd=no
+                  fi
+fi
+
+echo "$ac_t""$ac_cv_master_passwd" 1>&6
+  if test "$ac_cv_master_passwd" = yes; then
+    need_setuid=yes
+  fi
+fi
+
+
+###############################################################################
+#
+#       Check for traditional (ha!) shadow passwords.
+#
+###############################################################################
+
+if test "$with_shadow" = yes ; then
+  echo $ac_n "checking for generic shadow passwords""... $ac_c" 1>&6
+echo "configure:5700: checking for generic shadow passwords" >&5
+if eval "test \"`echo '$''{'ac_cv_shadow'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  
+  ac_save_CPPFLAGS="$CPPFLAGS"
+  if test \! -z "$includedir" ; then 
+    CPPFLAGS="$CPPFLAGS -I$includedir"
+  fi
+  CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+  cat > conftest.$ac_ext <<EOF
+#line 5711 "configure"
+#include "confdefs.h"
+#include <stdlib.h>
+                                    #include <unistd.h>
+                                    #include <sys/types.h>
+                                    #include <pwd.h>
+                                    #include <shadow.h>
+int main() {
+struct spwd *p = getspnam("nobody");
+                       const char *pw = p->sp_pwdp;
+; return 0; }
+EOF
+if { (eval echo configure:5723: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+  rm -rf conftest*
+  ac_cv_shadow=yes
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  ac_cv_shadow=no
+fi
+rm -f conftest*
+  CPPFLAGS="$ac_save_CPPFLAGS"
+fi
+
+echo "$ac_t""$ac_cv_shadow" 1>&6
+  if test "$ac_cv_shadow" = yes; then
+    have_shadow=yes
+    need_setuid=yes
+
+    # On some systems (UnixWare 2.1), getspnam() is in -lgen instead of -lc.
+    have_getspnam=no
+    echo $ac_n "checking for getspnam in -lc""... $ac_c" 1>&6
+echo "configure:5744: checking for getspnam in -lc" >&5
+ac_lib_var=`echo c'_'getspnam | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  ac_save_LIBS="$LIBS"
+LIBS="-lc  $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 5752 "configure"
+#include "confdefs.h"
+/* Override any gcc2 internal prototype to avoid an error.  */
+/* We use char because int might match the return type of a gcc2
+    builtin and then its argument prototype would still apply.  */
+char getspnam();
+
+int main() {
+getspnam()
+; return 0; }
+EOF
+if { (eval echo configure:5763: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  eval "ac_cv_lib_$ac_lib_var=yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_lib_$ac_lib_var=no"
+fi
+rm -f conftest*
+LIBS="$ac_save_LIBS"
+
+fi
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  have_getspnam=yes
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+    if test "$have_getspnam" = no ; then
+      echo $ac_n "checking for getspnam in -lgen""... $ac_c" 1>&6
+echo "configure:5785: checking for getspnam in -lgen" >&5
+ac_lib_var=`echo gen'_'getspnam | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  ac_save_LIBS="$LIBS"
+LIBS="-lgen  $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 5793 "configure"
+#include "confdefs.h"
+/* Override any gcc2 internal prototype to avoid an error.  */
+/* We use char because int might match the return type of a gcc2
+    builtin and then its argument prototype would still apply.  */
+char getspnam();
+
+int main() {
+getspnam()
+; return 0; }
+EOF
+if { (eval echo configure:5804: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  eval "ac_cv_lib_$ac_lib_var=yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_lib_$ac_lib_var=no"
+fi
+rm -f conftest*
+LIBS="$ac_save_LIBS"
+
+fi
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  have_getspnam=yes; PASSWD_LIBS="$PASSWD_LIBS -lgen"
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+    fi
+  fi
+fi
+
+
+###############################################################################
+#
+#       Check for other libraries needed for non-shadow passwords.
+#
+###############################################################################
+
+if test "$enable_locking" = yes ; then
+
+  # On some systems (UnixWare 2.1), crypt() is in -lcrypt instead of -lc.
+  have_crypt=no
+  echo $ac_n "checking for crypt in -lc""... $ac_c" 1>&6
+echo "configure:5840: checking for crypt in -lc" >&5
+ac_lib_var=`echo c'_'crypt | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  ac_save_LIBS="$LIBS"
+LIBS="-lc  $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 5848 "configure"
+#include "confdefs.h"
+/* Override any gcc2 internal prototype to avoid an error.  */
+/* We use char because int might match the return type of a gcc2
+    builtin and then its argument prototype would still apply.  */
+char crypt();
+
+int main() {
+crypt()
+; return 0; }
+EOF
+if { (eval echo configure:5859: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  eval "ac_cv_lib_$ac_lib_var=yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_lib_$ac_lib_var=no"
+fi
+rm -f conftest*
+LIBS="$ac_save_LIBS"
+
+fi
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  have_crypt=yes
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+  if test "$have_crypt" = no ; then
+    echo $ac_n "checking for crypt in -lcrypt""... $ac_c" 1>&6
+echo "configure:5881: checking for crypt in -lcrypt" >&5
+ac_lib_var=`echo crypt'_'crypt | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  ac_save_LIBS="$LIBS"
+LIBS="-lcrypt  $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 5889 "configure"
+#include "confdefs.h"
+/* Override any gcc2 internal prototype to avoid an error.  */
+/* We use char because int might match the return type of a gcc2
+    builtin and then its argument prototype would still apply.  */
+char crypt();
+
+int main() {
+crypt()
+; return 0; }
+EOF
+if { (eval echo configure:5900: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  eval "ac_cv_lib_$ac_lib_var=yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_lib_$ac_lib_var=no"
+fi
+rm -f conftest*
+LIBS="$ac_save_LIBS"
+
+fi
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  have_crypt=yes; PASSWD_LIBS="$PASSWD_LIBS -lcrypt"
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+  fi
+fi
+
+
+# Most of the above shadow mechanisms will have set need_setuid to yes,
+# if they were found.  But, on some systems, we need setuid even when
+# using plain old vanilla passwords.
+#
+if test "$enable_locking" = yes ; then
+  case "$host" in
+    *-hpux* | *-aix* | *-netbsd* | *-freebsd* | *-openbsd* )
+      need_setuid=yes
+    ;;
+  esac
+fi
+
+
+if test "$have_shadow_adjunct" = yes ; then
+  cat >> confdefs.h <<\EOF
+#define HAVE_ADJUNCT_PASSWD 1
+EOF
+
+elif test "$have_shadow_enhanced" = yes ; then
+  cat >> confdefs.h <<\EOF
+#define HAVE_ENHANCED_PASSWD 1
+EOF
+
+elif test "$have_shadow_hpux" = yes ; then
+  cat >> confdefs.h <<\EOF
+#define HAVE_HPUX_PASSWD 1
+EOF
+
+elif test "$have_shadow" = yes ; then
+  cat >> confdefs.h <<\EOF
+#define HAVE_SHADOW_PASSWD 1
+EOF
+
+fi
+
+
+###############################################################################
+#
+#       Check for -lXm.
+#
+###############################################################################
+
+have_motif=no
+with_motif_req=unspecified
+# Check whether --with-motif or --without-motif was given.
+if test "${with_motif+set}" = set; then
+  withval="$with_motif"
+  with_motif="$withval"; with_motif_req="$withval"
+else
+  with_motif=yes
+fi
+
+
+
+   case "$with_motif" in
+    yes) ;;
+    no)  ;;
+
+    /*)
+     echo $ac_n "checking for Motif headers""... $ac_c" 1>&6
+echo "configure:5984: checking for Motif headers" >&5
+     d=$with_motif/include
+     if test -d $d; then
+       X_CFLAGS="-I$d $X_CFLAGS"
+       echo "$ac_t""$d" 1>&6
+     else
+       echo "$ac_t""not found ($d: no such directory)" 1>&6
+     fi
+
+     echo $ac_n "checking for Motif libs""... $ac_c" 1>&6
+echo "configure:5994: checking for Motif libs" >&5
+     d=$with_motif/lib
+     if test -d $d; then
+       X_LIBS="-L$d $X_LIBS"
+       echo "$ac_t""$d" 1>&6
+     else
+       echo "$ac_t""not found ($d: no such directory)" 1>&6
+     fi
+
+     # replace the directory string with "yes".
+     with_motif_req="yes"
+     with_motif=$with_motif_req
+     ;;
+
+    *)
+     echo ""
+     echo "error: argument to --with-motif must be \"yes\", \"no\", or a directory."
+     echo "       If it is a directory, then \`DIR/include' will be added to"
+     echo "       the -I list, and \`DIR/lib' will be added to the -L list."
+     exit 1
+     ;;
+   esac
+  
+
+if test "$with_motif" != yes -a "$with_motif" != no ; then
+  echo "error: must be yes or no: --with-motif=$with_motif"
+  exit 1
+fi
+
+if test "$with_motif" = yes; then
+  have_motif=no
+  
+  ac_save_CPPFLAGS="$CPPFLAGS"
+  if test \! -z "$includedir" ; then 
+    CPPFLAGS="$CPPFLAGS -I$includedir"
+  fi
+  CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+  ac_safe=`echo "Xm/Xm.h" | sed 'y%./+-%__p_%'`
+echo $ac_n "checking for Xm/Xm.h""... $ac_c" 1>&6
+echo "configure:6033: checking for Xm/Xm.h" >&5
+if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 6038 "configure"
+#include "confdefs.h"
+#include <Xm/Xm.h>
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:6043: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+  rm -rf conftest*
+  eval "ac_cv_header_$ac_safe=yes"
+else
+  echo "$ac_err" >&5
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_header_$ac_safe=no"
+fi
+rm -f conftest*
+fi
+if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  have_motif=yes
+                     cat >> confdefs.h <<\EOF
+#define HAVE_MOTIF 1
+EOF
+
+                     MOTIF_LIBS="$MOTIF_LIBS -lXm"
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+  CPPFLAGS="$ac_save_CPPFLAGS"
+fi
+
+
+###############################################################################
+#
+#       Check for -lgtk.
+#
+###############################################################################
+
+have_gtk=no
+with_gtk_req=unspecified
+# Check whether --with-gtk or --without-gtk was given.
+if test "${with_gtk+set}" = set; then
+  withval="$with_gtk"
+  with_gtk="$withval"; with_gtk_req="$withval"
+else
+  with_gtk=yes
+fi
+
+
+# if --with-gtk=/directory/ was specified, remember that directory so that
+# we can also look for the `gtk-config' program in that directory.
+case "$with_gtk" in
+  /*)
+    gtk_dir="$with_gtk"
+    ;;
+  *)
+    gtk_dir=""
+    ;;
+esac
+
+
+   case "$with_gtk" in
+    yes) ;;
+    no)  ;;
+
+    /*)
+     echo $ac_n "checking for Gtk headers""... $ac_c" 1>&6
+echo "configure:6108: checking for Gtk headers" >&5
+     d=$with_gtk/include
+     if test -d $d; then
+       X_CFLAGS="-I$d $X_CFLAGS"
+       echo "$ac_t""$d" 1>&6
+     else
+       echo "$ac_t""not found ($d: no such directory)" 1>&6
+     fi
+
+     echo $ac_n "checking for Gtk libs""... $ac_c" 1>&6
+echo "configure:6118: checking for Gtk libs" >&5
+     d=$with_gtk/lib
+     if test -d $d; then
+       X_LIBS="-L$d $X_LIBS"
+       echo "$ac_t""$d" 1>&6
+     else
+       echo "$ac_t""not found ($d: no such directory)" 1>&6
+     fi
+
+     # replace the directory string with "yes".
+     with_gtk_req="yes"
+     with_gtk=$with_gtk_req
+     ;;
+
+    *)
+     echo ""
+     echo "error: argument to --with-gtk must be \"yes\", \"no\", or a directory."
+     echo "       If it is a directory, then \`DIR/include' will be added to"
+     echo "       the -I list, and \`DIR/lib' will be added to the -L list."
+     exit 1
+     ;;
+   esac
+  
+
+if test "$with_gtk" != yes -a "$with_gtk" != no ; then
+  echo "error: must be yes or no: --with-gtk=$with_gtk"
+  exit 1
+fi
+
+jurassic_gtk=no
+if test "$with_gtk" = yes; then
+  have_gtk=no
+  
+  # if the user specified --with-gtk=/foo/ then look in /foo/bin/
+  # for glib-config and gtk-config.
+  #
+  gtk_path="$PATH"
+
+  if test ! -z "$gtk_dir"; then
+    # canonicalize slashes.
+    gtk_dir=`echo "${gtk_dir}/bin" | sed 's@//*@/@g'`
+    gtk_path="$gtk_dir:$gtk_dir:$gtk_path"
+  fi
+
+  for ac_prog in glib-config
+do
+# Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:6167: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_path_glib_config'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  case "$glib_config" in
+  /*)
+  ac_cv_path_glib_config="$glib_config" # Let the user override the test with a path.
+  ;;
+  ?:/*)                         
+  ac_cv_path_glib_config="$glib_config" # Let the user override the test with a dos path.
+  ;;
+  *)
+  IFS="${IFS=  }"; ac_save_ifs="$IFS"; IFS=":"
+  ac_dummy="$gtk_path"
+  for ac_dir in $ac_dummy; do 
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/$ac_word; then
+      ac_cv_path_glib_config="$ac_dir/$ac_word"
+      break
+    fi
+  done
+  IFS="$ac_save_ifs"
+  ;;
+esac
+fi
+glib_config="$ac_cv_path_glib_config"
+if test -n "$glib_config"; then
+  echo "$ac_t""$glib_config" 1>&6
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+test -n "$glib_config" && break
+done
+
+  for ac_prog in gtk-config
+do
+# Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:6207: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_path_gtk_config'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  case "$gtk_config" in
+  /*)
+  ac_cv_path_gtk_config="$gtk_config" # Let the user override the test with a path.
+  ;;
+  ?:/*)                         
+  ac_cv_path_gtk_config="$gtk_config" # Let the user override the test with a dos path.
+  ;;
+  *)
+  IFS="${IFS=  }"; ac_save_ifs="$IFS"; IFS=":"
+  ac_dummy="$gtk_path"
+  for ac_dir in $ac_dummy; do 
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/$ac_word; then
+      ac_cv_path_gtk_config="$ac_dir/$ac_word"
+      break
+    fi
+  done
+  IFS="$ac_save_ifs"
+  ;;
+esac
+fi
+gtk_config="$ac_cv_path_gtk_config"
+if test -n "$gtk_config"; then
+  echo "$ac_t""$gtk_config" 1>&6
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+test -n "$gtk_config" && break
+done
+
+
+  if test -n "$glib_config" -a  -n "gtk_config" ; then
+    have_gtk=yes
+  fi
+  if test "$have_gtk" = yes; then
+    echo $ac_n "checking Gtk version number""... $ac_c" 1>&6
+echo "configure:6248: checking Gtk version number" >&5
+if eval "test \"`echo '$''{'ac_cv_gtk_version_string'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  ac_cv_gtk_version_string=`$glib_config --version`
+fi
+
+echo "$ac_t""$ac_cv_gtk_version_string" 1>&6
+    ac_gtk_version_string=$ac_cv_gtk_version_string
+    # M4 sucks!!
+    
+    maj=`echo $ac_gtk_version_string | sed -n 's/\..*//p'`
+    min=`echo $ac_gtk_version_string | sed -n 's/[^.]*\.\([^.]*\).*/\1/p'`
+    
+    ac_gtk_version=`echo "$maj * 1000 + $min" | bc`
+    if test -z "$ac_gtk_version"; then
+      ac_gtk_version=unknown
+      ac_gtk_version_string=unknown
+    fi
+    if test "$ac_gtk_version" = "unknown" || test "$ac_gtk_version" -lt 1002
+    then
+      have_gtk=no
+      jurassic_gtk=yes
+    fi
+  fi
+  if test "$have_gtk" = yes; then
+    echo $ac_n "checking for Gtk includes""... $ac_c" 1>&6
+echo "configure:6275: checking for Gtk includes" >&5
+if eval "test \"`echo '$''{'ac_cv_gtk_config_cflags'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  ac_cv_gtk_config_cflags=`$gtk_config --cflags`
+fi
+
+echo "$ac_t""$ac_cv_gtk_config_cflags" 1>&6
+    echo $ac_n "checking for Gtk libs""... $ac_c" 1>&6
+echo "configure:6284: checking for Gtk libs" >&5
+if eval "test \"`echo '$''{'ac_cv_gtk_config_libs'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  ac_cv_gtk_config_libs=`$gtk_config --libs`
+fi
+
+echo "$ac_t""$ac_cv_gtk_config_libs" 1>&6
+    INCLUDES="$INCLUDES $ac_cv_gtk_config_cflags"
+    GTK_LIBS="$GTK_LIBS $ac_cv_gtk_config_libs"
+    cat >> confdefs.h <<\EOF
+#define HAVE_GTK 1
+EOF
+
+  fi
+fi
+
+
+###############################################################################
+#
+#       Check for -lXaw and -lXaw3d.
+#
+###############################################################################
+
+have_athena=no
+have_athena3d=no
+with_athena_req=unspecified
+# Check whether --with-athena or --without-athena was given.
+if test "${with_athena+set}" = set; then
+  withval="$with_athena"
+  with_athena="$withval"; with_athena_req="$withval"
+else
+  with_athena=yes
+fi
+
+
+
+   case "$with_athena" in
+    yes) ;;
+    no)  ;;
+
+    /*)
+     echo $ac_n "checking for Athena headers""... $ac_c" 1>&6
+echo "configure:6327: checking for Athena headers" >&5
+     d=$with_athena/include
+     if test -d $d; then
+       X_CFLAGS="-I$d $X_CFLAGS"
+       echo "$ac_t""$d" 1>&6
+     else
+       echo "$ac_t""not found ($d: no such directory)" 1>&6
+     fi
+
+     echo $ac_n "checking for Athena libs""... $ac_c" 1>&6
+echo "configure:6337: checking for Athena libs" >&5
+     d=$with_athena/lib
+     if test -d $d; then
+       X_LIBS="-L$d $X_LIBS"
+       echo "$ac_t""$d" 1>&6
+     else
+       echo "$ac_t""not found ($d: no such directory)" 1>&6
+     fi
+
+     # replace the directory string with "yes".
+     with_athena_req="yes"
+     with_athena=$with_athena_req
+     ;;
+
+    *)
+     echo ""
+     echo "error: argument to --with-athena must be \"yes\", \"no\", or a directory."
+     echo "       If it is a directory, then \`DIR/include' will be added to"
+     echo "       the -I list, and \`DIR/lib' will be added to the -L list."
+     exit 1
+     ;;
+   esac
+  
+
+
+if test "$with_athena" != yes -a "$with_athena" != no ; then
+  echo "error: must be yes or no: --with-athena=$with_athena"
+  exit 1
+fi
+
+
+if test "$with_athena" = yes; then
+  have_athena=no
+  
+  ac_save_CPPFLAGS="$CPPFLAGS"
+  if test \! -z "$includedir" ; then 
+    CPPFLAGS="$CPPFLAGS -I$includedir"
+  fi
+  CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+  ac_safe=`echo "X11/Xaw/Dialog.h" | sed 'y%./+-%__p_%'`
+echo $ac_n "checking for X11/Xaw/Dialog.h""... $ac_c" 1>&6
+echo "configure:6378: checking for X11/Xaw/Dialog.h" >&5
+if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 6383 "configure"
+#include "confdefs.h"
+#include <X11/Xaw/Dialog.h>
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:6388: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+  rm -rf conftest*
+  eval "ac_cv_header_$ac_safe=yes"
+else
+  echo "$ac_err" >&5
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_header_$ac_safe=no"
+fi
+rm -f conftest*
+fi
+if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  have_athena=yes
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+  CPPFLAGS="$ac_save_CPPFLAGS"
+  if test "$have_athena" = yes; then
+    
+  ac_save_CPPFLAGS="$CPPFLAGS"
+  ac_save_LDFLAGS="$LDFLAGS"
+#  ac_save_LIBS="$LIBS"
+
+  if test \! -z "$includedir" ; then 
+    CPPFLAGS="$CPPFLAGS -I$includedir"
+  fi
+  # note: $X_CFLAGS includes $x_includes
+  CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+
+  if test \! -z "$libdir" ; then
+    LDFLAGS="$LDFLAGS -L$libdir"
+  fi
+  # note: $X_LIBS includes $x_libraries
+  LDFLAGS="$LDFLAGS $X_LIBS"
+
+  echo $ac_n "checking for Xaw3dComputeTopShadowRGB in -lXaw3d""... $ac_c" 1>&6
+echo "configure:6429: checking for Xaw3dComputeTopShadowRGB in -lXaw3d" >&5
+ac_lib_var=`echo Xaw3d'_'Xaw3dComputeTopShadowRGB | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  ac_save_LIBS="$LIBS"
+LIBS="-lXaw3d -lXt -lXmu -lXext -lX11 $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 6437 "configure"
+#include "confdefs.h"
+/* Override any gcc2 internal prototype to avoid an error.  */
+/* We use char because int might match the return type of a gcc2
+    builtin and then its argument prototype would still apply.  */
+char Xaw3dComputeTopShadowRGB();
+
+int main() {
+Xaw3dComputeTopShadowRGB()
+; return 0; }
+EOF
+if { (eval echo configure:6448: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  eval "ac_cv_lib_$ac_lib_var=yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_lib_$ac_lib_var=no"
+fi
+rm -f conftest*
+LIBS="$ac_save_LIBS"
+
+fi
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  have_athena=yes; have_athena3d=yes
+else
+  echo "$ac_t""no" 1>&6
+true
+fi
+
+  CPPFLAGS="$ac_save_CPPFLAGS"
+  LDFLAGS="$ac_save_LDFLAGS"
+#  LIBS="$ac_save_LIBS"
+  
+  fi
+fi
+
+if test "$have_athena" = yes; then
+  cat >> confdefs.h <<\EOF
+#define HAVE_ATHENA 1
+EOF
+
+  ATHENA_LIBS="-lXaw $ATHENA_LIBS"
+fi
+
+if test "$have_athena3d" = yes; then
+  ATHENA3D_LIBS="-lXaw3d $ATHENA3D_LIBS"
+fi
+
+
+# If we have Athena, check whether it's a version that includes
+# XawViewportSetCoordinates in Viewport.h (R3 (or R4?) don't.)
+if test "$have_athena" = yes ; then
+  echo $ac_n "checking for XawViewportSetCoordinates in Viewport.h""... $ac_c" 1>&6
+echo "configure:6493: checking for XawViewportSetCoordinates in Viewport.h" >&5
+if eval "test \"`echo '$''{'ac_cv_have_XawViewportSetCoordinates'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  ac_cv_have_XawViewportSetCoordinates=no
+                  
+  ac_save_CPPFLAGS="$CPPFLAGS"
+  if test \! -z "$includedir" ; then 
+    CPPFLAGS="$CPPFLAGS -I$includedir"
+  fi
+  CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+  cat > conftest.$ac_ext <<EOF
+#line 6505 "configure"
+#include "confdefs.h"
+#include <X11/Xaw/Viewport.h>
+EOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  egrep "XawViewportSetCoordinates" >/dev/null 2>&1; then
+  rm -rf conftest*
+  ac_cv_have_XawViewportSetCoordinates=yes
+fi
+rm -f conftest*
+
+  CPPFLAGS="$ac_save_CPPFLAGS"
+fi
+
+echo "$ac_t""$ac_cv_have_XawViewportSetCoordinates" 1>&6
+  if test "$ac_cv_have_XawViewportSetCoordinates" = yes ; then
+    cat >> confdefs.h <<\EOF
+#define HAVE_XawViewportSetCoordinates 1
+EOF
+
+  fi
+fi
+
+
+###############################################################################
+#
+#       Checking whether Motif is really Lesstif.
+#
+###############################################################################
+
+have_lesstif=no
+if test "$have_motif" = yes ; then
+  echo $ac_n "checking whether Motif is really LessTif""... $ac_c" 1>&6
+echo "configure:6538: checking whether Motif is really LessTif" >&5
+if eval "test \"`echo '$''{'ac_cv_have_lesstif'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  
+  ac_save_CPPFLAGS="$CPPFLAGS"
+  if test \! -z "$includedir" ; then 
+    CPPFLAGS="$CPPFLAGS -I$includedir"
+  fi
+  CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+  cat > conftest.$ac_ext <<EOF
+#line 6549 "configure"
+#include "confdefs.h"
+#include <Xm/Xm.h>
+int main() {
+long vers = LesstifVersion;
+; return 0; }
+EOF
+if { (eval echo configure:6556: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
+  rm -rf conftest*
+  ac_cv_have_lesstif=yes
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  ac_cv_have_lesstif=no
+fi
+rm -f conftest*
+  CPPFLAGS="$ac_save_CPPFLAGS"
+fi
+
+echo "$ac_t""$ac_cv_have_lesstif" 1>&6
+  have_lesstif=$ac_cv_have_lesstif
+fi
+
+
+lesstif_version=unknown
+lesstif_version_string=unknown
+
+if test "$have_lesstif" = yes ; then
+  ltv=unknown
+  echo unknown > conftest-lt
+  echo $ac_n "checking LessTif version number""... $ac_c" 1>&6
+echo "configure:6581: checking LessTif version number" >&5
+if eval "test \"`echo '$''{'ac_cv_lesstif_version_string'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  
+  ac_save_CPPFLAGS="$CPPFLAGS"
+  if test \! -z "$includedir" ; then 
+    CPPFLAGS="$CPPFLAGS -I$includedir"
+  fi
+  CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+  if test "$cross_compiling" = yes; then
+  ac_cv_lesstif_version=unknown
+                     ac_cv_lesstif_version_string=unknown
+else
+  cat > conftest.$ac_ext <<EOF
+#line 6596 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+                     #include <Xm/Xm.h>
+                     int main() {
+                       FILE *f = fopen("conftest-lt", "w");
+                       if (!f) exit(1);
+                       fprintf(f, "%d %d.%d\n", LesstifVersion,
+                          LESSTIF_VERSION, LESSTIF_REVISION);
+                       fclose(f);
+                       exit(0);
+                     }
+EOF
+if { (eval echo configure:6609: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+then
+  ltv=`cat conftest-lt`
+                     ac_cv_lesstif_version=`echo $ltv | sed 's/ .*//'`
+                     ac_cv_lesstif_version_string=`echo $ltv | sed 's/.* //'`
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -fr conftest*
+  ac_cv_lesstif_version=unknown
+                     ac_cv_lesstif_version_string=unknown
+fi
+rm -fr conftest*
+fi
+
+  CPPFLAGS="$ac_save_CPPFLAGS"
+fi
+
+echo "$ac_t""$ac_cv_lesstif_version_string" 1>&6
+  rm -f conftest-lt
+  lesstif_version=$ac_cv_lesstif_version
+  lesstif_version_string=$ac_cv_lesstif_version_string
+
+fi
+
+
+if test "$have_motif" = yes ; then
+  mtv=unknown
+  echo unknown > conftest-mt
+  echo $ac_n "checking Motif version number""... $ac_c" 1>&6
+echo "configure:6639: checking Motif version number" >&5
+if eval "test \"`echo '$''{'ac_cv_motif_version_string'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  
+  ac_save_CPPFLAGS="$CPPFLAGS"
+  if test \! -z "$includedir" ; then 
+    CPPFLAGS="$CPPFLAGS -I$includedir"
+  fi
+  CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+  if test "$cross_compiling" = yes; then
+  ac_cv_motif_version=unknown
+                     ac_cv_motif_version_string=unknown
+else
+  cat > conftest.$ac_ext <<EOF
+#line 6654 "configure"
+#include "confdefs.h"
+#include <stdio.h>
+                     #include <Xm/Xm.h>
+                     int main() {
+                       FILE *f = fopen("conftest-mt", "w");
+                       if (!f) exit(1);
+                       fprintf(f, "%d %d.%d\n", XmVersion,
+                          XmVERSION, XmREVISION);
+                       fclose(f);
+                       exit(0);
+                     }
+EOF
+if { (eval echo configure:6667: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
+then
+  mtv=`cat conftest-mt`
+                     ac_cv_motif_version=`echo $mtv | sed 's/ .*//'`
+                     ac_cv_motif_version_string=`echo $mtv | sed 's/.* //'`
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -fr conftest*
+  ac_cv_motif_version=unknown
+                     ac_cv_motif_version_string=unknown
+fi
+rm -fr conftest*
+fi
+
+  CPPFLAGS="$ac_save_CPPFLAGS"
+fi
+
+echo "$ac_t""$ac_cv_motif_version_string" 1>&6
+  rm -f conftest-mt
+  motif_version=$ac_cv_motif_version
+  motif_version_string=$ac_cv_motif_version_string
+
+fi
+
+
+###############################################################################
+#
+#       Checking whether Motif requires -lXpm.
+#
+#       If this is Motif 2.x, and we have XPM, then link against XPM as well.
+#       The deal is, Motif 2.x requires XPM -- but it's a compilation option
+#       of the library whether to build the XPM code into libXm, or whether
+#       to rely on an external libXm.  So the only way to tell whether XPM is
+#       a link-time requirement is to examine libXm.a, which is very
+#       difficult to do in an autoconf script.  So... if it's Motif 2.x, we
+#       always link against XPM if the XPM lib exists (and this will be a
+#       no-op if libXm happens to already have the XPM code in it.)
+#
+###############################################################################
+
+motif_requires_xpm=no
+if test "$have_motif" = yes ; then
+   echo $ac_n "checking whether Motif requires XPM""... $ac_c" 1>&6
+echo "configure:6711: checking whether Motif requires XPM" >&5
+   if test "$motif_version" = "unknown" || test "$motif_version" -ge 2000
+   then
+     motif_requires_xpm=yes
+     echo "$ac_t""maybe" 1>&6
+   else
+     echo "$ac_t""no" 1>&6
+   fi
+fi
+
+
+###############################################################################
+#
+#       Checking whether Motif requires -lXp.
+#
+#       Some versions of Motif (2.1.0, at least) require -lXp, the "X Printing
+#       Extension".   Why this extension isn't in -lXext with all the others,
+#       I have no idea.
+#
+###############################################################################
+
+have_xp_ext=no
+if test "$have_motif" = yes ; then
+   have_xp_ext=no
+   
+  ac_save_CPPFLAGS="$CPPFLAGS"
+  ac_save_LDFLAGS="$LDFLAGS"
+#  ac_save_LIBS="$LIBS"
+
+  if test \! -z "$includedir" ; then 
+    CPPFLAGS="$CPPFLAGS -I$includedir"
+  fi
+  # note: $X_CFLAGS includes $x_includes
+  CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+
+  if test \! -z "$libdir" ; then
+    LDFLAGS="$LDFLAGS -L$libdir"
+  fi
+  # note: $X_LIBS includes $x_libraries
+  LDFLAGS="$LDFLAGS $X_LIBS"
+
+  echo $ac_n "checking for XpQueryExtension in -lXp""... $ac_c" 1>&6
+echo "configure:6753: checking for XpQueryExtension in -lXp" >&5
+ac_lib_var=`echo Xp'_'XpQueryExtension | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  ac_save_LIBS="$LIBS"
+LIBS="-lXp -lX11 -lXext -lm $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 6761 "configure"
+#include "confdefs.h"
+/* Override any gcc2 internal prototype to avoid an error.  */
+/* We use char because int might match the return type of a gcc2
+    builtin and then its argument prototype would still apply.  */
+char XpQueryExtension();
+
+int main() {
+XpQueryExtension()
+; return 0; }
+EOF
+if { (eval echo configure:6772: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  eval "ac_cv_lib_$ac_lib_var=yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_lib_$ac_lib_var=no"
+fi
+rm -f conftest*
+LIBS="$ac_save_LIBS"
+
+fi
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  have_xp_ext=yes; MOTIF_LIBS="$MOTIF_LIBS -lXp"
+else
+  echo "$ac_t""no" 1>&6
+true
+fi
+
+  CPPFLAGS="$ac_save_CPPFLAGS"
+  LDFLAGS="$ac_save_LDFLAGS"
+#  LIBS="$ac_save_LIBS"
+  
+fi
+
+
+###############################################################################
+#
+#       Checking whether Motif requires -lXintl (for _Xsetlocale.)
+#
+###############################################################################
+
+have_xintl=no
+if test "$have_motif" = yes ; then
+  
+  ac_save_CPPFLAGS="$CPPFLAGS"
+  ac_save_LDFLAGS="$LDFLAGS"
+#  ac_save_LIBS="$LIBS"
+
+  if test \! -z "$includedir" ; then 
+    CPPFLAGS="$CPPFLAGS -I$includedir"
+  fi
+  # note: $X_CFLAGS includes $x_includes
+  CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+
+  if test \! -z "$libdir" ; then
+    LDFLAGS="$LDFLAGS -L$libdir"
+  fi
+  # note: $X_LIBS includes $x_libraries
+  LDFLAGS="$LDFLAGS $X_LIBS"
+
+  echo $ac_n "checking for _Xsetlocale in -lXintl""... $ac_c" 1>&6
+echo "configure:6826: checking for _Xsetlocale in -lXintl" >&5
+ac_lib_var=`echo Xintl'_'_Xsetlocale | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  ac_save_LIBS="$LIBS"
+LIBS="-lXintl -lX11 -lXext -lm $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 6834 "configure"
+#include "confdefs.h"
+/* Override any gcc2 internal prototype to avoid an error.  */
+/* We use char because int might match the return type of a gcc2
+    builtin and then its argument prototype would still apply.  */
+char _Xsetlocale();
+
+int main() {
+_Xsetlocale()
+; return 0; }
+EOF
+if { (eval echo configure:6845: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  eval "ac_cv_lib_$ac_lib_var=yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_lib_$ac_lib_var=no"
+fi
+rm -f conftest*
+LIBS="$ac_save_LIBS"
+
+fi
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  have_xintl=yes
+else
+  echo "$ac_t""no" 1>&6
+have_xintl=no
+fi
+
+  CPPFLAGS="$ac_save_CPPFLAGS"
+  LDFLAGS="$ac_save_LDFLAGS"
+#  LIBS="$ac_save_LIBS"
+  
+  if test "$have_xintl" = yes; then
+    MOTIF_LIBS="$MOTIF_LIBS -lXintl"
+  fi
+fi
+
+
+###############################################################################
+#
+#       Check for -lGL or -lMesa.
+#
+###############################################################################
+
+have_gl=no
+ac_have_mesa_gl=no
+with_gl_req=unspecified
+# Check whether --with-gl or --without-gl was given.
+if test "${with_gl+set}" = set; then
+  withval="$with_gl"
+  with_gl="$withval"; with_gl_req="$withval"
+else
+  with_gl=yes
+fi
+
+
+
+   case "$with_gl" in
+    yes) ;;
+    no)  ;;
+
+    /*)
+     echo $ac_n "checking for GL headers""... $ac_c" 1>&6
+echo "configure:6901: checking for GL headers" >&5
+     d=$with_gl/include
+     if test -d $d; then
+       X_CFLAGS="-I$d $X_CFLAGS"
+       echo "$ac_t""$d" 1>&6
+     else
+       echo "$ac_t""not found ($d: no such directory)" 1>&6
+     fi
+
+     echo $ac_n "checking for GL libs""... $ac_c" 1>&6
+echo "configure:6911: checking for GL libs" >&5
+     d=$with_gl/lib
+     if test -d $d; then
+       X_LIBS="-L$d $X_LIBS"
+       echo "$ac_t""$d" 1>&6
+     else
+       echo "$ac_t""not found ($d: no such directory)" 1>&6
+     fi
+
+     # replace the directory string with "yes".
+     with_gl_req="yes"
+     with_gl=$with_gl_req
+     ;;
+
+    *)
+     echo ""
+     echo "error: argument to --with-gl must be \"yes\", \"no\", or a directory."
+     echo "       If it is a directory, then \`DIR/include' will be added to"
+     echo "       the -I list, and \`DIR/lib' will be added to the -L list."
+     exit 1
+     ;;
+   esac
+  
+
+ac_mesagl_version=unknown
+ac_mesagl_version_string=unknown
+
+if test "$with_gl" = yes; then
+  
+  ac_save_CPPFLAGS="$CPPFLAGS"
+  if test \! -z "$includedir" ; then 
+    CPPFLAGS="$CPPFLAGS -I$includedir"
+  fi
+  CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+  ac_safe=`echo "GL/gl.h" | sed 'y%./+-%__p_%'`
+echo $ac_n "checking for GL/gl.h""... $ac_c" 1>&6
+echo "configure:6947: checking for GL/gl.h" >&5
+if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 6952 "configure"
+#include "confdefs.h"
+#include <GL/gl.h>
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:6957: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+  rm -rf conftest*
+  eval "ac_cv_header_$ac_safe=yes"
+else
+  echo "$ac_err" >&5
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_header_$ac_safe=no"
+fi
+rm -f conftest*
+fi
+if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  have_gl=yes
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+  CPPFLAGS="$ac_save_CPPFLAGS"
+  if test "$have_gl" = yes ; then
+    
+  ac_save_CPPFLAGS="$CPPFLAGS"
+  if test \! -z "$includedir" ; then 
+    CPPFLAGS="$CPPFLAGS -I$includedir"
+  fi
+  CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+  ac_safe=`echo "GL/glx.h" | sed 'y%./+-%__p_%'`
+echo $ac_n "checking for GL/glx.h""... $ac_c" 1>&6
+echo "configure:6988: checking for GL/glx.h" >&5
+if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 6993 "configure"
+#include "confdefs.h"
+#include <GL/glx.h>
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:6998: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+  rm -rf conftest*
+  eval "ac_cv_header_$ac_safe=yes"
+else
+  echo "$ac_err" >&5
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_header_$ac_safe=no"
+fi
+rm -f conftest*
+fi
+if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  have_gl=yes
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+  CPPFLAGS="$ac_save_CPPFLAGS"
+  fi
+
+  # If we have the headers, try and figure out which vendor it's from.
+  #
+  if test "$have_gl" = yes ; then
+
+    cat >> confdefs.h <<\EOF
+#define HAVE_GL 1
+EOF
+
+
+    # We need to know whether it's MesaGL so that we know which libraries
+    # to link against.
+    #
+    echo $ac_n "checking whether GL is really MesaGL""... $ac_c" 1>&6
+echo "configure:7035: checking whether GL is really MesaGL" >&5
+if eval "test \"`echo '$''{'ac_cv_have_mesa_gl'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  ac_cv_have_mesa_gl=no
+       
+  ac_save_CPPFLAGS="$CPPFLAGS"
+  if test \! -z "$includedir" ; then 
+    CPPFLAGS="$CPPFLAGS -I$includedir"
+  fi
+  CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+  cat > conftest.$ac_ext <<EOF
+#line 7047 "configure"
+#include "confdefs.h"
+#include <GL/glx.h>
+EOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+  egrep "Mesa" >/dev/null 2>&1; then
+  rm -rf conftest*
+  ac_cv_have_mesa_gl=yes
+fi
+rm -f conftest*
+
+  CPPFLAGS="$ac_save_CPPFLAGS"
+      
+fi
+
+echo "$ac_t""$ac_cv_have_mesa_gl" 1>&6
+    ac_have_mesa_gl=$ac_cv_have_mesa_gl
+    if test "$ac_have_mesa_gl" = no ; then
+      gl_lib_1="GL"
+      GL_LIBS="-lGL -lGLU"
+    else
+      cat >> confdefs.h <<\EOF
+#define HAVE_MESA_GL 1
+EOF
+
+      gl_lib_1="MesaGL"
+      GL_LIBS="-lMesaGL -lMesaGLU"
+    fi
+
+
+    # If it's MesaGL, we'd like to issue a warning if the version number
+    # is less than or equal to 2.6, because that version had a security bug.
+    #
+    if test "$ac_have_mesa_gl" = yes; then
+
+      echo $ac_n "checking MesaGL version number""... $ac_c" 1>&6
+echo "configure:7084: checking MesaGL version number" >&5
+if eval "test \"`echo '$''{'ac_cv_mesagl_version_string'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 7089 "configure"
+#include "confdefs.h"
+#include <GL/gl.h>
+configure: MESA_MAJOR_VERSION MESA_MINOR_VERSION
+EOF
+
+         ac_save_CPPFLAGS="$CPPFLAGS"
+         if test \! -z "$includedir" ; then 
+           CPPFLAGS="$CPPFLAGS -I$includedir"
+         fi
+         CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+
+          # M4 sucks!!
+         
+         mglv=`(eval "$ac_cpp conftest.$ac_ext") 2>&5 | sed -n \
+              's/^configure:.*\([0-9][0-9]*\).*\([0-9][0-9]*\).*$/\1.\2/p'`
+         
+
+         rm -f conftest.$ac_ext
+
+         CPPFLAGS="$ac_save_CPPFLAGS"
+
+         if test "$mglv" = ""; then
+           ac_mesagl_version=unknown
+           ac_mesagl_version_string=unknown
+         else
+           ac_mesagl_version_string=$mglv
+           maj=`echo $mglv | sed -n 's/\..*//p'`
+           min=`echo $mglv | sed -n 's/.*\.//p'`
+           ac_mesagl_version=`echo "$maj * 1000 + $min" | bc`
+           if test -z "$ac_mesagl_version"; then
+             ac_mesagl_version=unknown
+             ac_mesagl_version_string=unknown
+           fi
+         fi
+         ac_cv_mesagl_version=$ac_mesagl_version
+         ac_cv_mesagl_version_string=$ac_mesagl_version_string
+      
+fi
+
+echo "$ac_t""$ac_cv_mesagl_version_string" 1>&6
+      ac_mesagl_version=$ac_cv_mesagl_version
+      ac_mesagl_version_string=$ac_cv_mesagl_version_string
+    fi
+
+
+    # If it's MesaGL, check to see if it requires -lpthread.
+    #
+    have_pthread=no
+    mesa_requires_pthread=no
+    if test "$ac_have_mesa_gl" = yes; then
+
+      echo $ac_n "checking for pthread_create in -lpthread""... $ac_c" 1>&6
+echo "configure:7142: checking for pthread_create in -lpthread" >&5
+ac_lib_var=`echo pthread'_'pthread_create | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  ac_save_LIBS="$LIBS"
+LIBS="-lpthread  $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 7150 "configure"
+#include "confdefs.h"
+/* Override any gcc2 internal prototype to avoid an error.  */
+/* We use char because int might match the return type of a gcc2
+    builtin and then its argument prototype would still apply.  */
+char pthread_create();
+
+int main() {
+pthread_create()
+; return 0; }
+EOF
+if { (eval echo configure:7161: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  eval "ac_cv_lib_$ac_lib_var=yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_lib_$ac_lib_var=no"
+fi
+rm -f conftest*
+LIBS="$ac_save_LIBS"
+
+fi
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  have_pthread=yes
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+      if test "$have_pthread" = yes; then
+        
+  ac_save_CPPFLAGS="$CPPFLAGS"
+  ac_save_LDFLAGS="$LDFLAGS"
+#  ac_save_LIBS="$LIBS"
+
+  if test \! -z "$includedir" ; then 
+    CPPFLAGS="$CPPFLAGS -I$includedir"
+  fi
+  # note: $X_CFLAGS includes $x_includes
+  CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+
+  if test \! -z "$libdir" ; then
+    LDFLAGS="$LDFLAGS -L$libdir"
+  fi
+  # note: $X_LIBS includes $x_libraries
+  LDFLAGS="$LDFLAGS $X_LIBS"
+
+  echo $ac_n "checking for gl_get_thread_context in -l$gl_lib_1""... $ac_c" 1>&6
+echo "configure:7200: checking for gl_get_thread_context in -l$gl_lib_1" >&5
+ac_lib_var=`echo $gl_lib_1'_'gl_get_thread_context | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  ac_save_LIBS="$LIBS"
+LIBS="-l$gl_lib_1 $GL_LIBS -lpthread -lX11 -lXext -lm $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 7208 "configure"
+#include "confdefs.h"
+/* Override any gcc2 internal prototype to avoid an error.  */
+/* We use char because int might match the return type of a gcc2
+    builtin and then its argument prototype would still apply.  */
+char gl_get_thread_context();
+
+int main() {
+gl_get_thread_context()
+; return 0; }
+EOF
+if { (eval echo configure:7219: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  eval "ac_cv_lib_$ac_lib_var=yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_lib_$ac_lib_var=no"
+fi
+rm -f conftest*
+LIBS="$ac_save_LIBS"
+
+fi
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  mesa_requires_pthread=yes
+else
+  echo "$ac_t""no" 1>&6
+true
+fi
+
+  CPPFLAGS="$ac_save_CPPFLAGS"
+  LDFLAGS="$ac_save_LDFLAGS"
+#  LIBS="$ac_save_LIBS"
+  
+      fi
+
+      if test "$mesa_requires_pthread" = yes; then
+        GL_LIBS="$GL_LIBS -lpthread"
+      fi
+    fi
+
+    # Check for OpenGL 1.1 features.
+    #
+    
+  ac_save_CPPFLAGS="$CPPFLAGS"
+  ac_save_LDFLAGS="$LDFLAGS"
+#  ac_save_LIBS="$LIBS"
+
+  if test \! -z "$includedir" ; then 
+    CPPFLAGS="$CPPFLAGS -I$includedir"
+  fi
+  # note: $X_CFLAGS includes $x_includes
+  CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+
+  if test \! -z "$libdir" ; then
+    LDFLAGS="$LDFLAGS -L$libdir"
+  fi
+  # note: $X_LIBS includes $x_libraries
+  LDFLAGS="$LDFLAGS $X_LIBS"
+
+  echo $ac_n "checking for glBindTexture in -l$gl_lib_1""... $ac_c" 1>&6
+echo "configure:7271: checking for glBindTexture in -l$gl_lib_1" >&5
+ac_lib_var=`echo $gl_lib_1'_'glBindTexture | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  ac_save_LIBS="$LIBS"
+LIBS="-l$gl_lib_1 $GL_LIBS -lX11 -lXext -lm $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 7279 "configure"
+#include "confdefs.h"
+/* Override any gcc2 internal prototype to avoid an error.  */
+/* We use char because int might match the return type of a gcc2
+    builtin and then its argument prototype would still apply.  */
+char glBindTexture();
+
+int main() {
+glBindTexture()
+; return 0; }
+EOF
+if { (eval echo configure:7290: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  eval "ac_cv_lib_$ac_lib_var=yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_lib_$ac_lib_var=no"
+fi
+rm -f conftest*
+LIBS="$ac_save_LIBS"
+
+fi
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  cat >> confdefs.h <<\EOF
+#define HAVE_GLBINDTEXTURE 1
+EOF
+
+else
+  echo "$ac_t""no" 1>&6
+true
+fi
+
+  CPPFLAGS="$ac_save_CPPFLAGS"
+  LDFLAGS="$ac_save_LDFLAGS"
+#  LIBS="$ac_save_LIBS"
+  
+
+
+    # Check whether the `xscreensaver' executable should link against GL.
+    # See comments in utils/visual-gl.c for why this is sometimes necessary.
+    #
+    echo $ac_n "checking whether drastic GL measures must be taken""... $ac_c" 1>&6
+echo "configure:7324: checking whether drastic GL measures must be taken" >&5
+    case "$host" in
+      *-sgi*)
+        echo "$ac_t""yes -- hello, SGI." 1>&6
+        cat >> confdefs.h <<\EOF
+#define DAEMON_USE_GL 1
+EOF
+
+        SAVER_GL_SRCS='$(UTILS_SRC)/visual-gl.c'
+        SAVER_GL_OBJS='$(UTILS_BIN)/visual-gl.o'
+        SAVER_GL_LIBS="$GL_LIBS"
+      ;;
+      *)
+        echo "$ac_t""no -- non-SGI." 1>&6
+        SAVER_GL_SRCS=''
+        SAVER_GL_OBJS=''
+        SAVER_GL_LIBS=''
+      ;;
+    esac
+
+  fi
+
+elif test "$with_gl" != no; then
+  echo "error: must be yes or no: --with-gl=$with_gl"
+  exit 1
+fi
+
+
+###############################################################################
+#
+#       Check for -lXpm.
+#
+###############################################################################
+
+have_xpm=no
+with_xpm_req=unspecified
+# Check whether --with-xpm or --without-xpm was given.
+if test "${with_xpm+set}" = set; then
+  withval="$with_xpm"
+  with_xpm="$withval"; with_xpm_req="$withval"
+else
+  with_xpm=yes
+fi
+
+
+
+   case "$with_xpm" in
+    yes) ;;
+    no)  ;;
+
+    /*)
+     echo $ac_n "checking for XPM headers""... $ac_c" 1>&6
+echo "configure:7376: checking for XPM headers" >&5
+     d=$with_xpm/include
+     if test -d $d; then
+       X_CFLAGS="-I$d $X_CFLAGS"
+       echo "$ac_t""$d" 1>&6
+     else
+       echo "$ac_t""not found ($d: no such directory)" 1>&6
+     fi
+
+     echo $ac_n "checking for XPM libs""... $ac_c" 1>&6
+echo "configure:7386: checking for XPM libs" >&5
+     d=$with_xpm/lib
+     if test -d $d; then
+       X_LIBS="-L$d $X_LIBS"
+       echo "$ac_t""$d" 1>&6
+     else
+       echo "$ac_t""not found ($d: no such directory)" 1>&6
+     fi
+
+     # replace the directory string with "yes".
+     with_xpm_req="yes"
+     with_xpm=$with_xpm_req
+     ;;
+
+    *)
+     echo ""
+     echo "error: argument to --with-xpm must be \"yes\", \"no\", or a directory."
+     echo "       If it is a directory, then \`DIR/include' will be added to"
+     echo "       the -I list, and \`DIR/lib' will be added to the -L list."
+     exit 1
+     ;;
+   esac
+  
+
+if test "$with_xpm" = yes; then
+  
+  ac_save_CPPFLAGS="$CPPFLAGS"
+  if test \! -z "$includedir" ; then 
+    CPPFLAGS="$CPPFLAGS -I$includedir"
+  fi
+  CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+  ac_safe=`echo "X11/xpm.h" | sed 'y%./+-%__p_%'`
+echo $ac_n "checking for X11/xpm.h""... $ac_c" 1>&6
+echo "configure:7419: checking for X11/xpm.h" >&5
+if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 7424 "configure"
+#include "confdefs.h"
+#include <X11/xpm.h>
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:7429: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+  rm -rf conftest*
+  eval "ac_cv_header_$ac_safe=yes"
+else
+  echo "$ac_err" >&5
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_header_$ac_safe=no"
+fi
+rm -f conftest*
+fi
+if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  have_xpm=yes
+                    cat >> confdefs.h <<\EOF
+#define HAVE_XPM 1
+EOF
+
+                    XPM_LIBS="-lXpm"
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+  CPPFLAGS="$ac_save_CPPFLAGS"
+elif test "$with_xpm" != no; then
+  echo "error: must be yes or no: --with-xpm=$with_xpm"
+  exit 1
+fi
+
+# See comment near $motif_requires_xpm, above.
+# Need to do this here, after both Motif and XPM have been checked for.
+#
+if test "$have_motif" = yes -a "$have_xpm" = yes ; then
+  if test "$motif_requires_xpm" = yes ; then
+    MOTIF_LIBS="$MOTIF_LIBS $XPM_LIBS"
+  fi
+fi
+
+
+###############################################################################
+#
+#       Check for the XSHM server extension.
+#
+###############################################################################
+
+have_xshm=no
+with_xshm_req=unspecified
+# Check whether --with-xshm-ext or --without-xshm-ext was given.
+if test "${with_xshm_ext+set}" = set; then
+  withval="$with_xshm_ext"
+  with_xshm="$withval"; with_xshm_req="$withval"
+else
+  with_xshm=yes
+fi
+
+
+
+   case "$with_xshm" in
+    yes) ;;
+    no)  ;;
+
+    /*)
+     echo $ac_n "checking for XSHM headers""... $ac_c" 1>&6
+echo "configure:7495: checking for XSHM headers" >&5
+     d=$with_xshm/include
+     if test -d $d; then
+       X_CFLAGS="-I$d $X_CFLAGS"
+       echo "$ac_t""$d" 1>&6
+     else
+       echo "$ac_t""not found ($d: no such directory)" 1>&6
+     fi
+
+     echo $ac_n "checking for XSHM libs""... $ac_c" 1>&6
+echo "configure:7505: checking for XSHM libs" >&5
+     d=$with_xshm/lib
+     if test -d $d; then
+       X_LIBS="-L$d $X_LIBS"
+       echo "$ac_t""$d" 1>&6
+     else
+       echo "$ac_t""not found ($d: no such directory)" 1>&6
+     fi
+
+     # replace the directory string with "yes".
+     with_xshm_req="yes"
+     with_xshm=$with_xshm_req
+     ;;
+
+    *)
+     echo ""
+     echo "error: argument to --with-xshm-ext must be \"yes\", \"no\", or a directory."
+     echo "       If it is a directory, then \`DIR/include' will be added to"
+     echo "       the -I list, and \`DIR/lib' will be added to the -L list."
+     exit 1
+     ;;
+   esac
+  
+
+if test "$with_xshm" = yes; then
+
+  # first check for Xshm.h.
+  
+  ac_save_CPPFLAGS="$CPPFLAGS"
+  if test \! -z "$includedir" ; then 
+    CPPFLAGS="$CPPFLAGS -I$includedir"
+  fi
+  CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+  ac_safe=`echo "X11/extensions/XShm.h" | sed 'y%./+-%__p_%'`
+echo $ac_n "checking for X11/extensions/XShm.h""... $ac_c" 1>&6
+echo "configure:7540: checking for X11/extensions/XShm.h" >&5
+if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 7545 "configure"
+#include "confdefs.h"
+#include <X11/extensions/XShm.h>
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:7550: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+  rm -rf conftest*
+  eval "ac_cv_header_$ac_safe=yes"
+else
+  echo "$ac_err" >&5
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_header_$ac_safe=no"
+fi
+rm -f conftest*
+fi
+if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  have_xshm=yes
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+  CPPFLAGS="$ac_save_CPPFLAGS"
+
+  # if that succeeded, then check for sys/ipc.h.
+  if test "$have_xshm" = yes; then
+    have_xshm=no
+    
+  ac_save_CPPFLAGS="$CPPFLAGS"
+  if test \! -z "$includedir" ; then 
+    CPPFLAGS="$CPPFLAGS -I$includedir"
+  fi
+  CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+  ac_safe=`echo "sys/ipc.h" | sed 'y%./+-%__p_%'`
+echo $ac_n "checking for sys/ipc.h""... $ac_c" 1>&6
+echo "configure:7584: checking for sys/ipc.h" >&5
+if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 7589 "configure"
+#include "confdefs.h"
+#include <sys/ipc.h>
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:7594: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+  rm -rf conftest*
+  eval "ac_cv_header_$ac_safe=yes"
+else
+  echo "$ac_err" >&5
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_header_$ac_safe=no"
+fi
+rm -f conftest*
+fi
+if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  have_xshm=yes
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+  CPPFLAGS="$ac_save_CPPFLAGS"
+  fi
+
+  # if that succeeded, then check for sys/shm.h.
+  if test "$have_xshm" = yes; then
+    have_xshm=no
+    
+  ac_save_CPPFLAGS="$CPPFLAGS"
+  if test \! -z "$includedir" ; then 
+    CPPFLAGS="$CPPFLAGS -I$includedir"
+  fi
+  CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+  ac_safe=`echo "sys/shm.h" | sed 'y%./+-%__p_%'`
+echo $ac_n "checking for sys/shm.h""... $ac_c" 1>&6
+echo "configure:7629: checking for sys/shm.h" >&5
+if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 7634 "configure"
+#include "confdefs.h"
+#include <sys/shm.h>
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:7639: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+  rm -rf conftest*
+  eval "ac_cv_header_$ac_safe=yes"
+else
+  echo "$ac_err" >&5
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_header_$ac_safe=no"
+fi
+rm -f conftest*
+fi
+if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  have_xshm=yes
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+  CPPFLAGS="$ac_save_CPPFLAGS"
+  fi
+
+  # AIX is pathological, as usual: apparently it's normal for the Xshm headers
+  # to exist, but the library code to not exist.  And even better, the library
+  # code is in its own library: libXextSam.a.  So, if we're on AIX, and that
+  # lib doesn't exist, give up.  (This lib gets added to X_EXTRA_LIBS, and
+  # that's not quite right, but close enough.)
+  #
+  case "$host" in
+    *-aix*)
+      have_xshm=no
+      
+  ac_save_CPPFLAGS="$CPPFLAGS"
+  ac_save_LDFLAGS="$LDFLAGS"
+#  ac_save_LIBS="$LIBS"
+
+  if test \! -z "$includedir" ; then 
+    CPPFLAGS="$CPPFLAGS -I$includedir"
+  fi
+  # note: $X_CFLAGS includes $x_includes
+  CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+
+  if test \! -z "$libdir" ; then
+    LDFLAGS="$LDFLAGS -L$libdir"
+  fi
+  # note: $X_LIBS includes $x_libraries
+  LDFLAGS="$LDFLAGS $X_LIBS"
+
+  echo $ac_n "checking for XShmQueryExtension in -lXextSam""... $ac_c" 1>&6
+echo "configure:7690: checking for XShmQueryExtension in -lXextSam" >&5
+ac_lib_var=`echo XextSam'_'XShmQueryExtension | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  ac_save_LIBS="$LIBS"
+LIBS="-lXextSam -lX11 -lXext -lm $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 7698 "configure"
+#include "confdefs.h"
+/* Override any gcc2 internal prototype to avoid an error.  */
+/* We use char because int might match the return type of a gcc2
+    builtin and then its argument prototype would still apply.  */
+char XShmQueryExtension();
+
+int main() {
+XShmQueryExtension()
+; return 0; }
+EOF
+if { (eval echo configure:7709: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  eval "ac_cv_lib_$ac_lib_var=yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_lib_$ac_lib_var=no"
+fi
+rm -f conftest*
+LIBS="$ac_save_LIBS"
+
+fi
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  have_xshm=yes; X_EXTRA_LIBS="$X_EXTRA_LIBS -lXextSam"
+else
+  echo "$ac_t""no" 1>&6
+true
+fi
+
+  CPPFLAGS="$ac_save_CPPFLAGS"
+  LDFLAGS="$ac_save_LDFLAGS"
+#  LIBS="$ac_save_LIBS"
+  
+    ;;
+  esac
+
+  # if that succeeded, then we've really got it.
+  if test "$have_xshm" = yes; then
+    cat >> confdefs.h <<\EOF
+#define HAVE_XSHM_EXTENSION 1
+EOF
+
+  fi
+
+elif test "$with_xshm" != no; then
+  echo "error: must be yes or no: --with-xshm-ext=$with_xshm"
+  exit 1
+fi
+
+
+###############################################################################
+#
+#       Check for the DOUBLE-BUFFER server extension.
+#
+###############################################################################
+
+have_xdbe=no
+with_xdbe_req=unspecified
+# Check whether --with-xdbe-ext or --without-xdbe-ext was given.
+if test "${with_xdbe_ext+set}" = set; then
+  withval="$with_xdbe_ext"
+  with_xdbe="$withval"; with_xdbe_req="$withval"
+else
+  with_xdbe=yes
+fi
+
+
+
+   case "$with_xdbe" in
+    yes) ;;
+    no)  ;;
+
+    /*)
+     echo $ac_n "checking for DOUBLE-BUFFER headers""... $ac_c" 1>&6
+echo "configure:7775: checking for DOUBLE-BUFFER headers" >&5
+     d=$with_xdbe/include
+     if test -d $d; then
+       X_CFLAGS="-I$d $X_CFLAGS"
+       echo "$ac_t""$d" 1>&6
+     else
+       echo "$ac_t""not found ($d: no such directory)" 1>&6
+     fi
+
+     echo $ac_n "checking for DOUBLE-BUFFER libs""... $ac_c" 1>&6
+echo "configure:7785: checking for DOUBLE-BUFFER libs" >&5
+     d=$with_xdbe/lib
+     if test -d $d; then
+       X_LIBS="-L$d $X_LIBS"
+       echo "$ac_t""$d" 1>&6
+     else
+       echo "$ac_t""not found ($d: no such directory)" 1>&6
+     fi
+
+     # replace the directory string with "yes".
+     with_xdbe_req="yes"
+     with_xdbe=$with_xdbe_req
+     ;;
+
+    *)
+     echo ""
+     echo "error: argument to --with-xdbe-ext must be \"yes\", \"no\", or a directory."
+     echo "       If it is a directory, then \`DIR/include' will be added to"
+     echo "       the -I list, and \`DIR/lib' will be added to the -L list."
+     exit 1
+     ;;
+   esac
+  
+
+if test "$with_xdbe" = yes; then
+
+  
+  ac_save_CPPFLAGS="$CPPFLAGS"
+  if test \! -z "$includedir" ; then 
+    CPPFLAGS="$CPPFLAGS -I$includedir"
+  fi
+  CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+  ac_safe=`echo "X11/extensions/Xdbe.h" | sed 'y%./+-%__p_%'`
+echo $ac_n "checking for X11/extensions/Xdbe.h""... $ac_c" 1>&6
+echo "configure:7819: checking for X11/extensions/Xdbe.h" >&5
+if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 7824 "configure"
+#include "confdefs.h"
+#include <X11/extensions/Xdbe.h>
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:7829: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+  rm -rf conftest*
+  eval "ac_cv_header_$ac_safe=yes"
+else
+  echo "$ac_err" >&5
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_header_$ac_safe=no"
+fi
+rm -f conftest*
+fi
+if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  have_xdbe=yes
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+  CPPFLAGS="$ac_save_CPPFLAGS"
+  if test "$have_xdbe" = yes; then
+    cat >> confdefs.h <<\EOF
+#define HAVE_DOUBLE_BUFFER_EXTENSION 1
+EOF
+    
+  fi
+
+elif test "$with_xdbe" != no; then
+  echo "error: must be yes or no: --with-xdbe-ext=$with_xshm"
+  exit 1
+fi
+
+
+###############################################################################
+#
+#       Check for the SGI XReadDisplay server extension.
+#
+#       Note: this has to be down here, rather than up with the other server
+#       extension tests, so that the output of `configure --help' is in the
+#       right order.  Arrgh!
+#
+###############################################################################
+
+have_readdisplay=no
+with_readdisplay_req=unspecified
+# Check whether --with-readdisplay or --without-readdisplay was given.
+if test "${with_readdisplay+set}" = set; then
+  withval="$with_readdisplay"
+  with_readdisplay="$withval"; with_readdisplay_req="$withval"
+else
+  with_readdisplay=yes
+fi
+
+
+
+   case "$with_readdisplay" in
+    yes) ;;
+    no)  ;;
+
+    /*)
+     echo $ac_n "checking for XReadDisplay headers""... $ac_c" 1>&6
+echo "configure:7892: checking for XReadDisplay headers" >&5
+     d=$with_readdisplay/include
+     if test -d $d; then
+       X_CFLAGS="-I$d $X_CFLAGS"
+       echo "$ac_t""$d" 1>&6
+     else
+       echo "$ac_t""not found ($d: no such directory)" 1>&6
+     fi
+
+     echo $ac_n "checking for XReadDisplay libs""... $ac_c" 1>&6
+echo "configure:7902: checking for XReadDisplay libs" >&5
+     d=$with_readdisplay/lib
+     if test -d $d; then
+       X_LIBS="-L$d $X_LIBS"
+       echo "$ac_t""$d" 1>&6
+     else
+       echo "$ac_t""not found ($d: no such directory)" 1>&6
+     fi
+
+     # replace the directory string with "yes".
+     with_readdisplay_req="yes"
+     with_readdisplay=$with_readdisplay_req
+     ;;
+
+    *)
+     echo ""
+     echo "error: argument to --with-readdisplay must be \"yes\", \"no\", or a directory."
+     echo "       If it is a directory, then \`DIR/include' will be added to"
+     echo "       the -I list, and \`DIR/lib' will be added to the -L list."
+     exit 1
+     ;;
+   esac
+  
+
+if test "$with_readdisplay" = yes; then
+  
+  ac_save_CPPFLAGS="$CPPFLAGS"
+  if test \! -z "$includedir" ; then 
+    CPPFLAGS="$CPPFLAGS -I$includedir"
+  fi
+  CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+  ac_safe=`echo "X11/extensions/readdisplay.h" | sed 'y%./+-%__p_%'`
+echo $ac_n "checking for X11/extensions/readdisplay.h""... $ac_c" 1>&6
+echo "configure:7935: checking for X11/extensions/readdisplay.h" >&5
+if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 7940 "configure"
+#include "confdefs.h"
+#include <X11/extensions/readdisplay.h>
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:7945: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+  rm -rf conftest*
+  eval "ac_cv_header_$ac_safe=yes"
+else
+  echo "$ac_err" >&5
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_header_$ac_safe=no"
+fi
+rm -f conftest*
+fi
+if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  cat >> confdefs.h <<\EOF
+#define HAVE_READ_DISPLAY_EXTENSION 1
+EOF
+
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+  CPPFLAGS="$ac_save_CPPFLAGS"
+elif test "$with_readdisplay" != no; then
+  echo "error: must be yes or no: --with-readdisplay=$with_readdisplay"
+  exit 1
+fi
+
+
+###############################################################################
+#
+#       Check for the SGI Iris Video Library.
+#
+###############################################################################
+
+have_sgivideo=no
+with_sgivideo_req=unspecified
+# Check whether --with-sgivideo or --without-sgivideo was given.
+if test "${with_sgivideo+set}" = set; then
+  withval="$with_sgivideo"
+  with_sgivideo="$withval"; with_sgivideo_req="$withval"
+else
+  with_sgivideo=yes
+fi
+
+
+
+   case "$with_sgivideo" in
+    yes) ;;
+    no)  ;;
+
+    /*)
+     echo $ac_n "checking for Iris Video headers""... $ac_c" 1>&6
+echo "configure:8000: checking for Iris Video headers" >&5
+     d=$with_sgivideo/include
+     if test -d $d; then
+       X_CFLAGS="-I$d $X_CFLAGS"
+       echo "$ac_t""$d" 1>&6
+     else
+       echo "$ac_t""not found ($d: no such directory)" 1>&6
+     fi
+
+     echo $ac_n "checking for Iris Video libs""... $ac_c" 1>&6
+echo "configure:8010: checking for Iris Video libs" >&5
+     d=$with_sgivideo/lib
+     if test -d $d; then
+       X_LIBS="-L$d $X_LIBS"
+       echo "$ac_t""$d" 1>&6
+     else
+       echo "$ac_t""not found ($d: no such directory)" 1>&6
+     fi
+
+     # replace the directory string with "yes".
+     with_sgivideo_req="yes"
+     with_sgivideo=$with_sgivideo_req
+     ;;
+
+    *)
+     echo ""
+     echo "error: argument to --with-sgivideo must be \"yes\", \"no\", or a directory."
+     echo "       If it is a directory, then \`DIR/include' will be added to"
+     echo "       the -I list, and \`DIR/lib' will be added to the -L list."
+     exit 1
+     ;;
+   esac
+  
+
+if test "$with_sgivideo" = yes; then
+  
+  ac_save_CPPFLAGS="$CPPFLAGS"
+  if test \! -z "$includedir" ; then 
+    CPPFLAGS="$CPPFLAGS -I$includedir"
+  fi
+  CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+  ac_safe=`echo "dmedia/vl.h" | sed 'y%./+-%__p_%'`
+echo $ac_n "checking for dmedia/vl.h""... $ac_c" 1>&6
+echo "configure:8043: checking for dmedia/vl.h" >&5
+if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  cat > conftest.$ac_ext <<EOF
+#line 8048 "configure"
+#include "confdefs.h"
+#include <dmedia/vl.h>
+EOF
+ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
+{ (eval echo configure:8053: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
+if test -z "$ac_err"; then
+  rm -rf conftest*
+  eval "ac_cv_header_$ac_safe=yes"
+else
+  echo "$ac_err" >&5
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_header_$ac_safe=no"
+fi
+rm -f conftest*
+fi
+if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  have_sgivideo=yes
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+  CPPFLAGS="$ac_save_CPPFLAGS"
+  if test "$have_sgivideo" = yes; then
+    have_sgivideo=no
+    echo $ac_n "checking for vlOpenVideo in -lvl""... $ac_c" 1>&6
+echo "configure:8078: checking for vlOpenVideo in -lvl" >&5
+ac_lib_var=`echo vl'_'vlOpenVideo | sed 'y%./+-%__p_%'`
+if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  ac_save_LIBS="$LIBS"
+LIBS="-lvl  $LIBS"
+cat > conftest.$ac_ext <<EOF
+#line 8086 "configure"
+#include "confdefs.h"
+/* Override any gcc2 internal prototype to avoid an error.  */
+/* We use char because int might match the return type of a gcc2
+    builtin and then its argument prototype would still apply.  */
+char vlOpenVideo();
+
+int main() {
+vlOpenVideo()
+; return 0; }
+EOF
+if { (eval echo configure:8097: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+  rm -rf conftest*
+  eval "ac_cv_lib_$ac_lib_var=yes"
+else
+  echo "configure: failed program was:" >&5
+  cat conftest.$ac_ext >&5
+  rm -rf conftest*
+  eval "ac_cv_lib_$ac_lib_var=no"
+fi
+rm -f conftest*
+LIBS="$ac_save_LIBS"
+
+fi
+if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
+  echo "$ac_t""yes" 1>&6
+  have_sgivideo=yes
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+    if test "$have_sgivideo" = yes; then
+      SGI_VIDEO_OBJS="$(UTILS_BIN)/sgivideo.o"
+      SGI_VIDEO_LIBS="-lvl"
+      cat >> confdefs.h <<\EOF
+#define HAVE_SGI_VIDEO 1
+EOF
+
+    fi
+  fi
+elif test "$with_sgivideo" != no; then
+  echo "error: must be yes or no: --with-sgivideo=$with_sgivideo"
+  exit 1
+fi
+
+
+###############################################################################
+#
+#       Check for a program to generate random text.
+#
+#       Zippy is funnier than the idiocy generally spat out by `fortune',
+#       so try to find that, by invoking Emacs and asking it where its 
+#       libexec directory is ("yow" lives in there.)
+#
+#       If that doesn't work, see if fortune, zippy, or yow are on $PATH,
+#       and if so, use them.
+#
+#       If that doesn't work, look in /usr/games, and if it's there, use
+#       the full pathname.
+#
+###############################################################################
+
+with_zippy_req=""
+# Check whether --with-zippy or --without-zippy was given.
+if test "${with_zippy+set}" = set; then
+  withval="$with_zippy"
+  with_zippy_req="$withval"; with_zippy="$withval"
+else
+  with_zippy=yes
+fi
+
+
+if test "$with_zippy" = no || test "$with_zippy" = yes ; then
+  with_zippy=""
+  with_zippy_req=""
+fi
+
+if test -n "$with_zippy_req" ; then
+  ac_cv_zippy_program=""
+  case "$with_zippy_req" in
+    /*)
+      echo $ac_n "checking for $with_zippy_req""... $ac_c" 1>&6
+echo "configure:8168: checking for $with_zippy_req" >&5
+      if test -x "$with_zippy_req" ; then
+        echo "$ac_t""yes" 1>&6
+      else
+        echo "$ac_t""no" 1>&6
+        with_zippy=""
+      fi
+    ;;
+    *)
+      # don't cache
+      unset ac_cv_path_zip2
+      # Extract the first word of "$with_zippy_req", so it can be a program name with args.
+set dummy $with_zippy_req; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:8182: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_path_zip2'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  case "$zip2" in
+  /*)
+  ac_cv_path_zip2="$zip2" # Let the user override the test with a path.
+  ;;
+  ?:/*)                         
+  ac_cv_path_zip2="$zip2" # Let the user override the test with a dos path.
+  ;;
+  *)
+  IFS="${IFS=  }"; ac_save_ifs="$IFS"; IFS=":"
+  ac_dummy="$PATH"
+  for ac_dir in $ac_dummy; do 
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/$ac_word; then
+      ac_cv_path_zip2="$ac_dir/$ac_word"
+      break
+    fi
+  done
+  IFS="$ac_save_ifs"
+  ;;
+esac
+fi
+zip2="$ac_cv_path_zip2"
+if test -n "$zip2"; then
+  echo "$ac_t""$zip2" 1>&6
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+      if test "$zip2" = ""; then
+        with_zippy=""
+      fi
+    ;;
+  esac
+  ac_cv_zippy_program="$with_zippy"
+
+elif test -n "$ac_cv_zippy_program"; then
+  echo "$ac_t""checking for zippy... (cached) $ac_cv_zippy_program" 1>&6
+fi
+
+if test ! -n "$ac_cv_zippy_program"; then
+
+  for ac_prog in emacs
+do
+# Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:8232: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_emacs_exe'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  if test -n "$emacs_exe"; then
+  ac_cv_prog_emacs_exe="$emacs_exe" # Let the user override the test.
+else
+  IFS="${IFS=  }"; ac_save_ifs="$IFS"; IFS=":"
+  ac_dummy="$PATH"
+  for ac_dir in $ac_dummy; do
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/$ac_word; then
+      ac_cv_prog_emacs_exe="$ac_prog"
+      break
+    fi
+  done
+  IFS="$ac_save_ifs"
+fi
+fi
+emacs_exe="$ac_cv_prog_emacs_exe"
+if test -n "$emacs_exe"; then
+  echo "$ac_t""$emacs_exe" 1>&6
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+test -n "$emacs_exe" && break
+done
+
+  for ac_prog in xemacs
+do
+# Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:8266: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_xemacs_exe'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  if test -n "$xemacs_exe"; then
+  ac_cv_prog_xemacs_exe="$xemacs_exe" # Let the user override the test.
+else
+  IFS="${IFS=  }"; ac_save_ifs="$IFS"; IFS=":"
+  ac_dummy="$PATH"
+  for ac_dir in $ac_dummy; do
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/$ac_word; then
+      ac_cv_prog_xemacs_exe="$ac_prog"
+      break
+    fi
+  done
+  IFS="$ac_save_ifs"
+fi
+fi
+xemacs_exe="$ac_cv_prog_xemacs_exe"
+if test -n "$xemacs_exe"; then
+  echo "$ac_t""$xemacs_exe" 1>&6
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+test -n "$xemacs_exe" && break
+done
+
+
+  ac_cv_zippy_program=""
+  eargs='-batch -q -nw --eval'
+
+  if test -n "$emacs_exe" ; then
+    echo $ac_n "checking for emacs yow""... $ac_c" 1>&6
+echo "configure:8301: checking for emacs yow" >&5
+    #
+    # get emacs to tell us where the libexec directory is.
+    #
+    dir=`$emacs_exe $eargs '(princ (concat exec-directory "\n"))' \
+         2>/dev/null | tail -1`
+    dir=`echo "$dir" | sed 's@///*@/@g;s@/$@@'`
+    #
+    # try running libexec/yow and see if it exits without error.
+    #
+    if test x"$dir" != x -a -x "$dir/yow" ; then
+      if $dir/yow >&- 2>&- ; then
+        ac_cv_zippy_program="$dir/yow"
+        echo "$ac_t""$ac_cv_zippy_program" 1>&6
+      else
+        echo "$ac_t""no" 1>&6
+      fi
+    fi
+  fi
+
+  if test -z "$ac_cv_zippy_program" ; then
+    echo $ac_n "checking for xemacs yow""... $ac_c" 1>&6
+echo "configure:8323: checking for xemacs yow" >&5
+    if test -n "$xemacs_exe" ; then
+      #
+      # get xemacs to tell us where the libexec directory is.
+      #
+      dir=`$xemacs_exe $eargs '(princ (concat exec-directory "\n"))' \
+           2>/dev/null | tail -1`
+      dir=`echo "$dir" | sed 's@///*@/@g;s@/$@@'`
+      #
+      # try running libexec/yow and see if it exits without error.
+      #
+      if test x"$dir" != x -a -x "$dir/yow" ; then
+        if $dir/yow >&- 2>&- ; then
+          ac_cv_zippy_program="$dir/yow"
+          echo "$ac_t""$ac_cv_zippy_program" 1>&6
+        else
+          #
+          # in some xemacs installations, the pathname of the yow.lines file
+          # isn't hardcoded into the yow executable, and must be passed on 
+          # the command line.  See if it's in libexec/../etc/.
+
+          # M4 sucks!!
+          
+          dir_up=`echo "$dir" | sed 's@/[^/]*$@@'`
+          
+
+          yowlines="$dir_up/etc/yow.lines"
+          if $dir/yow -f $yowlines >&- 2>&- ; then
+            ac_cv_zippy_program="$dir/yow -f $yowlines"
+            echo "$ac_t""$ac_cv_zippy_program" 1>&6
+          else
+            #
+            # In newer XEmacs releases, yow.lines is in a different place,
+            # and the easiest way to get it is by calling the new function
+            # `locate-data-file'.
+            #
+            yowlines=`$xemacs_exe $eargs \
+              '(princ (concat (locate-data-file "yow.lines") "\n"))' \
+              2>/dev/null | tail -1`
+            if $dir/yow -f $yowlines >&- 2>&- ; then
+              ac_cv_zippy_program="$dir/yow -f $yowlines"
+              echo "$ac_t""$ac_cv_zippy_program" 1>&6
+            else
+              echo "$ac_t""no" 1>&6
+            fi
+          fi
+        fi
+      fi
+    fi
+  fi
+
+  # if that didn't work, try for some other programs...
+  if test -z "$ac_cv_zippy_program" ; then
+    fortune=''
+    for ac_prog in fortune zippy yow
+do
+# Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:8382: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_prog_fortune'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  if test -n "$fortune"; then
+  ac_cv_prog_fortune="$fortune" # Let the user override the test.
+else
+  IFS="${IFS=  }"; ac_save_ifs="$IFS"; IFS=":"
+  ac_dummy="$PATH"
+  for ac_dir in $ac_dummy; do
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/$ac_word; then
+      ac_cv_prog_fortune="$ac_prog"
+      break
+    fi
+  done
+  IFS="$ac_save_ifs"
+fi
+fi
+fortune="$ac_cv_prog_fortune"
+if test -n "$fortune"; then
+  echo "$ac_t""$fortune" 1>&6
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+test -n "$fortune" && break
+done
+
+    # if that didn't work, try for those programs in /usr/games...
+    if test -z "$fortune" ; then
+      for ac_prog in fortune zippy yow
+do
+# Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
+echo "configure:8418: checking for $ac_word" >&5
+if eval "test \"`echo '$''{'ac_cv_path_fortune'+set}'`\" = set"; then
+  echo $ac_n "(cached) $ac_c" 1>&6
+else
+  case "$fortune" in
+  /*)
+  ac_cv_path_fortune="$fortune" # Let the user override the test with a path.
+  ;;
+  ?:/*)                         
+  ac_cv_path_fortune="$fortune" # Let the user override the test with a dos path.
+  ;;
+  *)
+  IFS="${IFS=  }"; ac_save_ifs="$IFS"; IFS=":"
+  ac_dummy="/usr/games:/usr/local/games:$PATH"
+  for ac_dir in $ac_dummy; do 
+    test -z "$ac_dir" && ac_dir=.
+    if test -f $ac_dir/$ac_word; then
+      ac_cv_path_fortune="$ac_dir/$ac_word"
+      break
+    fi
+  done
+  IFS="$ac_save_ifs"
+  ;;
+esac
+fi
+fortune="$ac_cv_path_fortune"
+if test -n "$fortune"; then
+  echo "$ac_t""$fortune" 1>&6
+else
+  echo "$ac_t""no" 1>&6
+fi
+
+test -n "$fortune" && break
+done
+test -n "$fortune" || fortune="fortune"
+
+    fi
+  fi
+fi
+
+if test -z "$ac_cv_zippy_program" ; then
+  ac_cv_zippy_program=fortune
+fi
+
+cat >> confdefs.h <<EOF
+#define ZIPPY_PROGRAM "$ac_cv_zippy_program"
+EOF
+
+
+
+###############################################################################
+#
+#       Done testing.  Now, set up the various -I and -L variables,
+#       and decide which GUI program to build by default.
+#
+###############################################################################
+
+DEPEND=makedepend
+DEPEND_FLAGS=
+DEPEND_DEFINES=
+
+
+if test \! -z "$includedir" ; then 
+  INCLUDES="$INCLUDES -I$includedir"
+fi
+
+if test \! -z "$libdir" ; then
+  LDFLAGS="$LDFLAGS -L$libdir"
+fi
+
+
+ALL_DEMO_PROGRAMS=
+if test "$have_athena3d" = yes; then
+  PREFERRED_DEMO_PROGRAM=xscreensaver-demo-Xaw3d
+  ALL_DEMO_PROGRAMS="$PREFERRED_DEMO_PROGRAM $ALL_DEMO_PROGRAMS"
+fi
+if test "$have_athena" = yes; then
+  PREFERRED_DEMO_PROGRAM=xscreensaver-demo-Xaw
+  ALL_DEMO_PROGRAMS="$PREFERRED_DEMO_PROGRAM $ALL_DEMO_PROGRAMS"
+fi
+if test "$have_gtk" = yes; then
+  PREFERRED_DEMO_PROGRAM=xscreensaver-demo-Gtk
+  ALL_DEMO_PROGRAMS="$PREFERRED_DEMO_PROGRAM $ALL_DEMO_PROGRAMS"
+fi
+if test "$have_motif" = yes; then
+  PREFERRED_DEMO_PROGRAM=xscreensaver-demo-Xm
+  ALL_DEMO_PROGRAMS="$PREFERRED_DEMO_PROGRAM $ALL_DEMO_PROGRAMS"
+fi
+
+
+if test "$have_kerberos" = yes; then
+  PASSWD_SRCS="$PASSWD_SRCS \$(KERBEROS_SRCS)"
+  PASSWD_OBJS="$PASSWD_OBJS \$(KERBEROS_OBJS)"
+fi
+if test "$have_pam" = yes; then
+  PASSWD_SRCS="$PASSWD_SRCS \$(PAM_SRCS)"
+  PASSWD_OBJS="$PASSWD_OBJS \$(PAM_OBJS)"
+  INSTALL_PAM="install-pam"
+fi
+  PASSWD_SRCS="$PASSWD_SRCS \$(PWENT_SRCS)"
+  PASSWD_OBJS="$PASSWD_OBJS \$(PWENT_OBJS)"
+
+
+if test "$enable_locking" = yes; then
+  LOCK_SRCS='$(LOCK_SRCS_1) $(PASSWD_SRCS)'
+  LOCK_OBJS='$(LOCK_OBJS_1) $(PASSWD_OBJS)'
+else
+  LOCK_SRCS=''
+  LOCK_OBJS=''
+fi
+
+if test "$need_setuid" = yes; then
+  NEED_SETUID=yes
+  INSTALL_SETUID='$(INSTALL) $(SUID_FLAGS)'
+else
+  NEED_SETUID=no
+  INSTALL_SETUID='$(INSTALL_PROGRAM)'
+fi
+
+tab='  '
+if test "$have_gl" = yes; then
+  GL_EXES='$(GL_EXES)'
+  GL_MEN='$(GL_MEN)'
+  GL_KLUDGE="${tab}  "
+else
+  GL_KLUDGE="  -${tab}  "
+fi
+
+
+###############################################################################
+#
+#       Perform substitutions and write Makefiles.
+#
+###############################################################################
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+APPDEFAULTS=$ac_x_app_defaults
+
+
+
+
+
+
+
+trap '' 1 2 15
+cat > confcache <<\EOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs.  It is not useful on other systems.
+# If it contains results you don't want to keep, you may remove or edit it.
+#
+# By default, configure uses ./config.cache as the cache file,
+# creating it if it does not exist already.  You can give configure
+# the --cache-file=FILE option to use a different cache file; that is
+# what configure does when it calls configure scripts in
+# subdirectories, so they share the cache.
+# Giving --cache-file=/dev/null disables caching, for debugging configure.
+# config.status only pays attention to the cache file if you give it the
+# --recheck option to rerun configure.
+#
+EOF
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, don't put newlines in cache variables' values.
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+(set) 2>&1 |
+  case `(ac_space=' '; set | grep ac_space) 2>&1` in
+  *ac_space=\ *)
+    # `set' does not quote correctly, so add quotes (double-quote substitution
+    # turns \\\\ into \\, and sed turns \\ into \).
+    sed -n \
+      -e "s/'/'\\\\''/g" \
+      -e "s/^\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\)=\\(.*\\)/\\1=\${\\1='\\2'}/p"
+    ;;
+  *)
+    # `set' quotes correctly as required by POSIX, so do not add quotes.
+    sed -n -e 's/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=${\1=\2}/p'
+    ;;
+  esac >> confcache
+if cmp -s $cache_file confcache; then
+  :
+else
+  if test -w $cache_file; then
+    echo "updating cache $cache_file"
+    cat confcache > $cache_file
+  else
+    echo "not updating unwritable cache $cache_file"
+  fi
+fi
+rm -f confcache
+
+trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+# Any assignment to VPATH causes Sun make to only execute
+# the first set of double-colon rules, so remove it if not needed.
+# If there is a colon in the path, we need to keep it.
+if test "x$srcdir" = x.; then
+  ac_vpsub='/^[        ]*VPATH[        ]*=[^:]*$/d'
+fi
+
+trap 'rm -f $CONFIG_STATUS conftest*; exit 1' 1 2 15
+
+DEFS=-DHAVE_CONFIG_H
+
+# Without the "./", some shells look in PATH for config.status.
+: ${CONFIG_STATUS=./config.status}
+
+echo creating $CONFIG_STATUS
+rm -f $CONFIG_STATUS
+cat > $CONFIG_STATUS <<EOF
+#! /bin/sh
+# Generated automatically by configure.
+# Run this file to recreate the current configuration.
+# This directory was configured as follows,
+# on host `(hostname || uname -n) 2>/dev/null | sed 1q`:
+#
+# $0 $ac_configure_args
+#
+# Compiler output produced by configure, useful for debugging
+# configure, is in ./config.log if it exists.
+
+ac_cs_usage="Usage: $CONFIG_STATUS [--recheck] [--version] [--help]"
+for ac_option
+do
+  case "\$ac_option" in
+  -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+    echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion"
+    exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;;
+  -version | --version | --versio | --versi | --vers | --ver | --ve | --v)
+    echo "$CONFIG_STATUS generated by autoconf version 2.13"
+    exit 0 ;;
+  -help | --help | --hel | --he | --h)
+    echo "\$ac_cs_usage"; exit 0 ;;
+  *) echo "\$ac_cs_usage"; exit 1 ;;
+  esac
+done
+
+ac_given_srcdir=$srcdir
+ac_given_INSTALL="$INSTALL"
+
+trap 'rm -fr `echo "Makefile
+          utils/Makefile
+          driver/Makefile
+          hacks/Makefile
+          hacks/glx/Makefile
+          driver/XScreenSaver.ad config.h" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15
+EOF
+cat >> $CONFIG_STATUS <<EOF
+
+# Protect against being on the right side of a sed subst in config.status.
+sed 's/%@/@@/; s/@%/@@/; s/%g\$/@g/; /@g\$/s/[\\\\&%]/\\\\&/g;
+ s/@@/%@/; s/@@/@%/; s/@g\$/%g/' > conftest.subs <<\\CEOF
+$ac_vpsub
+$extrasub
+s%@SHELL@%$SHELL%g
+s%@CFLAGS@%$CFLAGS%g
+s%@CPPFLAGS@%$CPPFLAGS%g
+s%@CXXFLAGS@%$CXXFLAGS%g
+s%@FFLAGS@%$FFLAGS%g
+s%@DEFS@%$DEFS%g
+s%@LDFLAGS@%$LDFLAGS%g
+s%@LIBS@%$LIBS%g
+s%@exec_prefix@%$exec_prefix%g
+s%@prefix@%$prefix%g
+s%@program_transform_name@%$program_transform_name%g
+s%@bindir@%$bindir%g
+s%@sbindir@%$sbindir%g
+s%@libexecdir@%$libexecdir%g
+s%@datadir@%$datadir%g
+s%@sysconfdir@%$sysconfdir%g
+s%@sharedstatedir@%$sharedstatedir%g
+s%@localstatedir@%$localstatedir%g
+s%@libdir@%$libdir%g
+s%@includedir@%$includedir%g
+s%@oldincludedir@%$oldincludedir%g
+s%@infodir@%$infodir%g
+s%@mandir@%$mandir%g
+s%@host@%$host%g
+s%@host_alias@%$host_alias%g
+s%@host_cpu@%$host_cpu%g
+s%@host_vendor@%$host_vendor%g
+s%@host_os@%$host_os%g
+s%@CC@%$CC%g
+s%@CPP@%$CPP%g
+s%@INSTALL_PROGRAM@%$INSTALL_PROGRAM%g
+s%@INSTALL_SCRIPT@%$INSTALL_SCRIPT%g
+s%@INSTALL_DATA@%$INSTALL_DATA%g
+s%@SET_MAKE@%$SET_MAKE%g
+s%@PERL@%$PERL%g
+s%@X_CFLAGS@%$X_CFLAGS%g
+s%@X_PRE_LIBS@%$X_PRE_LIBS%g
+s%@X_LIBS@%$X_LIBS%g
+s%@X_EXTRA_LIBS@%$X_EXTRA_LIBS%g
+s%@glib_config@%$glib_config%g
+s%@gtk_config@%$gtk_config%g
+s%@zip2@%$zip2%g
+s%@emacs_exe@%$emacs_exe%g
+s%@xemacs_exe@%$xemacs_exe%g
+s%@fortune@%$fortune%g
+s%@INCLUDES@%$INCLUDES%g
+s%@PREFERRED_DEMO_PROGRAM@%$PREFERRED_DEMO_PROGRAM%g
+s%@ALL_DEMO_PROGRAMS@%$ALL_DEMO_PROGRAMS%g
+s%@SAVER_LIBS@%$SAVER_LIBS%g
+s%@MOTIF_LIBS@%$MOTIF_LIBS%g
+s%@GTK_LIBS@%$GTK_LIBS%g
+s%@ATHENA_LIBS@%$ATHENA_LIBS%g
+s%@ATHENA3D_LIBS@%$ATHENA3D_LIBS%g
+s%@HACK_LIBS@%$HACK_LIBS%g
+s%@XPM_LIBS@%$XPM_LIBS%g
+s%@GL_LIBS@%$GL_LIBS%g
+s%@PASSWD_LIBS@%$PASSWD_LIBS%g
+s%@INSTALL_SETUID@%$INSTALL_SETUID%g
+s%@INSTALL_DIRS@%$INSTALL_DIRS%g
+s%@NEED_SETUID@%$NEED_SETUID%g
+s%@INSTALL_PAM@%$INSTALL_PAM%g
+s%@SGI_VIDEO_OBJS@%$SGI_VIDEO_OBJS%g
+s%@SGI_VIDEO_LIBS@%$SGI_VIDEO_LIBS%g
+s%@PASSWD_SRCS@%$PASSWD_SRCS%g
+s%@PASSWD_OBJS@%$PASSWD_OBJS%g
+s%@XMU_SRCS@%$XMU_SRCS%g
+s%@XMU_OBJS@%$XMU_OBJS%g
+s%@SAVER_GL_SRCS@%$SAVER_GL_SRCS%g
+s%@SAVER_GL_OBJS@%$SAVER_GL_OBJS%g
+s%@SAVER_GL_LIBS@%$SAVER_GL_LIBS%g
+s%@LOCK_SRCS@%$LOCK_SRCS%g
+s%@LOCK_OBJS@%$LOCK_OBJS%g
+s%@GL_EXES@%$GL_EXES%g
+s%@GL_MEN@%$GL_MEN%g
+s%@GL_KLUDGE@%$GL_KLUDGE%g
+s%@HACKDIR@%$HACKDIR%g
+s%@APPDEFAULTS@%$APPDEFAULTS%g
+s%@DEPEND@%$DEPEND%g
+s%@DEPEND_FLAGS@%$DEPEND_FLAGS%g
+s%@DEPEND_DEFINES@%$DEPEND_DEFINES%g
+
+CEOF
+EOF
+
+cat >> $CONFIG_STATUS <<\EOF
+
+# Split the substitutions into bite-sized pieces for seds with
+# small command number limits, like on Digital OSF/1 and HP-UX.
+ac_max_sed_cmds=90 # Maximum number of lines to put in a sed script.
+ac_file=1 # Number of current file.
+ac_beg=1 # First line for current file.
+ac_end=$ac_max_sed_cmds # Line after last line for current file.
+ac_more_lines=:
+ac_sed_cmds=""
+while $ac_more_lines; do
+  if test $ac_beg -gt 1; then
+    sed "1,${ac_beg}d; ${ac_end}q" conftest.subs > conftest.s$ac_file
+  else
+    sed "${ac_end}q" conftest.subs > conftest.s$ac_file
+  fi
+  if test ! -s conftest.s$ac_file; then
+    ac_more_lines=false
+    rm -f conftest.s$ac_file
+  else
+    if test -z "$ac_sed_cmds"; then
+      ac_sed_cmds="sed -f conftest.s$ac_file"
+    else
+      ac_sed_cmds="$ac_sed_cmds | sed -f conftest.s$ac_file"
+    fi
+    ac_file=`expr $ac_file + 1`
+    ac_beg=$ac_end
+    ac_end=`expr $ac_end + $ac_max_sed_cmds`
+  fi
+done
+if test -z "$ac_sed_cmds"; then
+  ac_sed_cmds=cat
+fi
+EOF
+
+cat >> $CONFIG_STATUS <<EOF
+
+CONFIG_FILES=\${CONFIG_FILES-"Makefile
+          utils/Makefile
+          driver/Makefile
+          hacks/Makefile
+          hacks/glx/Makefile
+          driver/XScreenSaver.ad"}
+EOF
+cat >> $CONFIG_STATUS <<\EOF
+for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then
+  # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+  case "$ac_file" in
+  *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'`
+       ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
+  *) ac_file_in="${ac_file}.in" ;;
+  esac
+
+  # Adjust a relative srcdir, top_srcdir, and INSTALL for subdirectories.
+
+  # Remove last slash and all that follows it.  Not all systems have dirname.
+  ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'`
+  if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then
+    # The file is in a subdirectory.
+    test ! -d "$ac_dir" && mkdir "$ac_dir"
+    ac_dir_suffix="/`echo $ac_dir|sed 's%^\./%%'`"
+    # A "../" for each directory in $ac_dir_suffix.
+    ac_dots=`echo $ac_dir_suffix|sed 's%/[^/]*%../%g'`
+  else
+    ac_dir_suffix= ac_dots=
+  fi
+
+  case "$ac_given_srcdir" in
+  .)  srcdir=.
+      if test -z "$ac_dots"; then top_srcdir=.
+      else top_srcdir=`echo $ac_dots|sed 's%/$%%'`; fi ;;
+  /*) srcdir="$ac_given_srcdir$ac_dir_suffix"; top_srcdir="$ac_given_srcdir" ;;
+  *) # Relative path.
+    srcdir="$ac_dots$ac_given_srcdir$ac_dir_suffix"
+    top_srcdir="$ac_dots$ac_given_srcdir" ;;
+  esac
+
+  case "$ac_given_INSTALL" in
+  [/$]*) INSTALL="$ac_given_INSTALL" ;;
+  *) INSTALL="$ac_dots$ac_given_INSTALL" ;;
+  esac
+
+  echo creating "$ac_file"
+  rm -f "$ac_file"
+  configure_input="Generated automatically from `echo $ac_file_in|sed 's%.*/%%'` by configure."
+  case "$ac_file" in
+  *Makefile*) ac_comsub="1i\\
+# $configure_input" ;;
+  *) ac_comsub= ;;
+  esac
+
+  ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"`
+  sed -e "$ac_comsub
+s%@configure_input@%$configure_input%g
+s%@srcdir@%$srcdir%g
+s%@top_srcdir@%$top_srcdir%g
+s%@INSTALL@%$INSTALL%g
+" $ac_file_inputs | (eval "$ac_sed_cmds") > $ac_file
+fi; done
+rm -f conftest.s*
+
+# These sed commands are passed to sed as "A NAME B NAME C VALUE D", where
+# NAME is the cpp macro being defined and VALUE is the value it is being given.
+#
+# ac_d sets the value in "#define NAME VALUE" lines.
+ac_dA='s%^\([  ]*\)#\([        ]*define[       ][      ]*\)'
+ac_dB='\([     ][      ]*\)[^  ]*%\1#\2'
+ac_dC='\3'
+ac_dD='%g'
+# ac_u turns "#undef NAME" with trailing blanks into "#define NAME VALUE".
+ac_uA='s%^\([  ]*\)#\([        ]*\)undef\([    ][      ]*\)'
+ac_uB='\([     ]\)%\1#\2define\3'
+ac_uC=' '
+ac_uD='\4%g'
+# ac_e turns "#undef NAME" without trailing blanks into "#define NAME VALUE".
+ac_eA='s%^\([  ]*\)#\([        ]*\)undef\([    ][      ]*\)'
+ac_eB='$%\1#\2define\3'
+ac_eC=' '
+ac_eD='%g'
+
+if test "${CONFIG_HEADERS+set}" != set; then
+EOF
+cat >> $CONFIG_STATUS <<EOF
+  CONFIG_HEADERS="config.h"
+EOF
+cat >> $CONFIG_STATUS <<\EOF
+fi
+for ac_file in .. $CONFIG_HEADERS; do if test "x$ac_file" != x..; then
+  # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+  case "$ac_file" in
+  *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'`
+       ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;;
+  *) ac_file_in="${ac_file}.in" ;;
+  esac
+
+  echo creating $ac_file
+
+  rm -f conftest.frag conftest.in conftest.out
+  ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"`
+  cat $ac_file_inputs > conftest.in
+
+EOF
+
+# Transform confdefs.h into a sed script conftest.vals that substitutes
+# the proper values into config.h.in to produce config.h.  And first:
+# Protect against being on the right side of a sed subst in config.status.
+# Protect against being in an unquoted here document in config.status.
+rm -f conftest.vals
+cat > conftest.hdr <<\EOF
+s/[\\&%]/\\&/g
+s%[\\$`]%\\&%g
+s%#define \([A-Za-z_][A-Za-z0-9_]*\) *\(.*\)%${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD}%gp
+s%ac_d%ac_u%gp
+s%ac_u%ac_e%gp
+EOF
+sed -n -f conftest.hdr confdefs.h > conftest.vals
+rm -f conftest.hdr
+
+# This sed command replaces #undef with comments.  This is necessary, for
+# example, in the case of _POSIX_SOURCE, which is predefined and required
+# on some systems where configure will not decide to define it.
+cat >> conftest.vals <<\EOF
+s%^[   ]*#[    ]*undef[        ][      ]*[a-zA-Z_][a-zA-Z_0-9]*%/* & */%
+EOF
+
+# Break up conftest.vals because some shells have a limit on
+# the size of here documents, and old seds have small limits too.
+
+rm -f conftest.tail
+while :
+do
+  ac_lines=`grep -c . conftest.vals`
+  # grep -c gives empty output for an empty file on some AIX systems.
+  if test -z "$ac_lines" || test "$ac_lines" -eq 0; then break; fi
+  # Write a limited-size here document to conftest.frag.
+  echo '  cat > conftest.frag <<CEOF' >> $CONFIG_STATUS
+  sed ${ac_max_here_lines}q conftest.vals >> $CONFIG_STATUS
+  echo 'CEOF
+  sed -f conftest.frag conftest.in > conftest.out
+  rm -f conftest.in
+  mv conftest.out conftest.in
+' >> $CONFIG_STATUS
+  sed 1,${ac_max_here_lines}d conftest.vals > conftest.tail
+  rm -f conftest.vals
+  mv conftest.tail conftest.vals
+done
+rm -f conftest.vals
+
+cat >> $CONFIG_STATUS <<\EOF
+  rm -f conftest.frag conftest.h
+  echo "/* $ac_file.  Generated automatically by configure.  */" > conftest.h
+  cat conftest.in >> conftest.h
+  rm -f conftest.in
+  if cmp -s $ac_file conftest.h 2>/dev/null; then
+    echo "$ac_file is unchanged"
+    rm -f conftest.h
+  else
+    # Remove last slash and all that follows it.  Not all systems have dirname.
+      ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'`
+      if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then
+      # The file is in a subdirectory.
+      test ! -d "$ac_dir" && mkdir "$ac_dir"
+    fi
+    rm -f $ac_file
+    mv conftest.h $ac_file
+  fi
+fi; done
+
+EOF
+cat >> $CONFIG_STATUS <<EOF
+
+EOF
+cat >> $CONFIG_STATUS <<\EOF
+
+exit 0
+EOF
+chmod +x $CONFIG_STATUS
+rm -fr confdefs* $ac_clean_files
+test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1
+
+
+###############################################################################
+#
+#       Print some warnings at the end.
+#
+###############################################################################
+
+warn_prefix_1="    Warning:"
+warn_prefix_2="       Note:"
+warn_prefix="$warn_prefix_1"
+
+warning=no
+warnsep='    #################################################################'
+
+warnpre() {
+  if test "$warning" = no ; then
+    echo '' ; echo "$warnsep" ; echo ''
+    warning=yes
+  fi
+}
+
+warn() {
+  warnpre
+  if test "$warning" = long ; then echo '' ; fi
+  warning=yes
+  echo "$warn_prefix $@"
+}
+
+warnL() {
+  was=$warning
+  warnpre
+  warning=yes
+  if test "$was" != no ; then echo '' ; fi
+  echo "$warn_prefix $@"
+}
+
+warn2() {
+  echo "             $@"
+  warning=long
+}
+
+note() {
+  warn_prefix="$warn_prefix_2"
+  warn $@
+  warn_prefix="$warn_prefix_1"
+}
+
+noteL() {
+  warn_prefix="$warn_prefix_2"
+  warnL $@
+  warn_prefix="$warn_prefix_1"
+}
+
+
+if test "$with_sgi_req" = yes -a "$have_sgi" = no ; then
+  warn 'The SGI saver extension was requested, but was not found.'
+fi
+
+if test "$with_mit_req" = yes -a "$have_mit" = no ; then
+  warn 'The MIT saver extension was requested, but was not found.'
+fi
+
+if test "$with_xidle_req" = yes -a "$have_xidle" = no ; then
+  warn 'The XIdle extension was requested, but was not found.'
+fi
+
+if test "$with_xshm_req" = yes -a "$have_xshm" = no ; then
+  warn 'The XSHM extension was requested, but was not found.'
+fi
+
+if test "$with_xdbe_req" = yes -a "$have_xdbe" = no ; then
+  warn 'The DOUBLE-BUFFER extension was requested, but was not found.'
+fi
+
+if test "$with_sgivc_req" = yes -a "$have_sgivc" = no ; then
+  warn 'The SGI-VIDEO-CONTROL extension was requested, but was not found.'
+fi
+
+if test "$with_dpms_req" = yes -a "$have_dpms" = no ; then
+  warn 'The DPMS extension was requested, but was not found.'
+fi
+
+if test "$with_xf86vmode_req" = yes -a "$have_xf86vmode" = no ; then
+  warn 'The XF86VMODE extension was requested, but was not found.'
+fi
+
+if test "$with_proc_interrupts_req" = yes -a "$have_proc_interrupts" = no; then
+  warn "Checking of /proc/interrupts was requested, but it's bogus."
+fi
+
+
+if test "$have_motif" = no -a "$have_gtk" = no -a "$have_athena" = no ; then
+  warnL "None of Motif, Gtk, or Athena widgets seem to be available;"
+  warn2 "the \`xscreensaver-demo' program requires one of these."
+
+elif test "$with_motif_req" = yes -a "$have_motif" = no ; then
+  warnL "Use of Motif was requested, but it wasn't found;"
+  if test "$have_gtk" = yes; then
+    warn2 "Gtk will be used instead."
+  else
+    warn2 "Athena will be used instead."
+  fi
+
+elif test "$jurassic_gtk" = yes ; then
+
+  pref_gtk=1.2
+
+  v="$ac_gtk_version_string"
+  if test "$with_gtk_req" = yes -a "$ac_gtk_version" = "unknown" ; then
+    warnL "Use of Gtk was requested, but its version number is unknown;"
+  elif test "$with_gtk_req" = yes ; then
+    warnL "Use of Gtk was requested, but it is version $v;"
+  else
+    warnL "Gtk was found on this system, but it is version $v;"
+  fi
+
+  if test "$have_motif" = yes; then
+    which="Motif"
+  else
+    which="Athena"
+  fi
+
+  warn2 "Gtk $pref_gtk or newer is required.  $which will be used instead."
+
+elif test "$with_gtk_req" = yes -a "$have_gtk" = no ; then
+  warnL "Use of Gtk was requested, but it wasn't found;"
+  if test "$have_motif" = yes; then
+    warn2 "Motif will be used instead."
+  else
+    warn2 "Athena will be used instead."
+  fi
+
+elif test "$with_athena_req" = yes -a "$have_athena" = no ; then
+  warnL "Use of Athena was requested, but it wasn't found;"
+  if test "$have_gtk" = yes; then
+    warn2 "Gtk will be used instead."
+  else
+    warn2 "Motif will be used instead."
+  fi
+fi
+
+
+if test "$have_motif" = yes -a "$have_lesstif" = yes ; then
+
+  preferred_lesstif=0.86
+
+  if test "$lesstif_version" = unknown; then
+    warnL "Unable to determine the LessTif version number!"
+    warn2 "Make sure you are using version $preferred_lesstif or newer."
+    warn2 "See <http://www.lesstif.org/>."
+
+  elif test \! $lesstif_version -gt 82; then
+    warnL "LessTif version $lesstif_version_string is being used."
+    warn2 "LessTif versions 0.82 and earlier are too buggy to"
+    warn2 "use with XScreenSaver; it is strongly recommended"
+    warn2 "that you upgrade to at least version $preferred_lesstif!"
+    warn2 "See <http://www.lesstif.org/>."
+  fi
+fi
+
+if test "$have_athena" = yes -a "$have_motif" = no -a "$have_gtk" = no; then
+    warnL "Athena widgets are being used instead of Motif or Gtk."
+    warn2 "The \`xscreensaver-demo' program looks much better"
+    warn2 "with Motif or Gtk.  Wouldn't you rather be using Motif?"
+    warn2 "Motif is shipped by every commercial Unix vendor,"
+    warn2 "and there is a free implementation available as"
+    warn2 "well: see <http://www.lesstif.org/>.  Gtk is shipped"
+    warn2 "with most Linux and BSD distributions."
+fi
+
+
+if test "$have_xpm" = no ; then
+  if test "$with_xpm_req" = yes ; then
+    warnL 'Use of XPM was requested, but it was not found.'
+  elif test "$with_xpm_req" = no ; then
+    noteL 'The XPM library is not being used.'
+  else
+    noteL 'The XPM library was not found.'
+  fi
+
+  echo ''
+  warn2 'Some of the demos will not be as colorful as they'
+  warn2 'could be.  You might want to consider installing XPM'
+  warn2 'and re-running configure.  (Remember to delete the'
+  warn2 'config.cache file first.)  You can find XPM at most'
+  warn2 'X11 archive sites, such as <http://sunsite.unc.edu/>.'
+fi
+
+
+if test "$have_gl" = yes -a "$ac_have_mesa_gl" = yes ; then
+  preferred_mesagl=3.0
+
+  if test "$ac_mesagl_version" = unknown; then
+    warnL "Unable to determine the MesaGL version number!"
+    warn2 "Make sure you are using version $preferred_mesagl or newer."
+
+  elif test \! "$ac_mesagl_version" -gt 2006; then
+    warnL "MesaGL version $ac_mesagl_version_string is being used."
+    warn2 "MesaGL versions 2.6 and earlier have a security bug."
+    warn2 "It is strongly recommended that you upgrade to at"
+    warn2 "least version $preferred_mesagl."
+  fi
+fi
+
+
+if test "$have_gl" = no ; then
+  if test "$with_gl_req" = yes ; then
+    warnL 'Use of GL was requested, but it was not found.'
+  elif test "$with_gl_req" = no ; then
+    noteL 'The OpenGL 3D library is not being used.'
+  else
+    noteL 'The OpenGL 3D library was not found.'
+  fi
+
+  echo ''
+  warn2 'Those demos which use 3D will not be built or installed.'
+  warn2 'You might want to consider installing OpenGL and'
+  warn2 're-running configure.  (Remember to delete the'
+  warn2 "config.cache file first.)  If your vendor doesn't ship"
+  warn2 'their own implementation of OpenGL, you can get a free'
+  warn2 'version at <http://www.mesa3d.org/>.  For general OpenGL'
+  warn2 'info, see <http://www.opengl.org/>.'
+
+fi
+
+if test "$with_readdisplay_req" = yes -a "$have_readdisplay" = no ; then
+  warn 'Use of XReadDisplay was requested, but it was not found.'
+fi
+
+if test "$with_sgivideo_req" = yes -a "$have_sgivideo" = no ; then
+  warn 'Use of the Iris Video Library was requested, but it was not found.'
+fi
+
+if test -n "$with_zippy_req"; then
+  if test "$with_zippy_req" != "$ac_cv_zippy_program" ; then
+    warnL "$with_zippy_req was requested as the Zippy program,"
+    warn2 "but was not found.  The default will be used instead."
+  fi
+fi
+
+if test "$with_kerberos_req" = yes -a "$have_kerberos" = no ; then
+  warn 'Use of Kerberos was requested, but it was not found.'
+fi
+
+if test "$with_pam_req" = yes -a "$have_pam" = no ; then
+  warn 'Use of PAM was requested, but it was not found.'
+fi
+
+if test "$with_shadow_req" = yes -a "$have_shadow" = no ; then
+  warn 'Use of shadow passwords was requested, but they were not found.'
+fi
+
+
+# You are in a twisty maze of namespaces and syntaxes, all alike.
+# Fuck the skull of Unix.
+#
+eval bindir=${bindir}
+eval bindir=${bindir}
+eval bindir=${bindir}
+eval bindir=${bindir}
+eval bindir=${bindir}
+eval bindir=${bindir}
+eval HACKDIR=${HACKDIR}
+eval HACKDIR=${HACKDIR}
+eval HACKDIR=${HACKDIR}
+eval HACKDIR=${HACKDIR}
+eval HACKDIR=${HACKDIR}
+eval HACKDIR=${HACKDIR}
+
+# canonicalize slashes.
+bindir=`echo  "${bindir}"  | sed 's@/$@@;s@//*@/@g'`
+HACKDIR=`echo "${HACKDIR}" | sed 's@/$@@;s@//*@/@g'`
+
+
+# Sanity check the subdir
+for bad_choice in xscreensaver xscreensaver-demo xscreensaver-command ; do
+  if test "${HACKDIR}" = "${bindir}/${bad_choice}" ; then
+    echo ""
+    { echo "configure: error: \"--enable-subdir=${bindir}/${bad_choice}\" won't work.
+                   There will be an executable installed with that name, so
+                   that can't be the name of a directory as well.  Please
+                   re-configure with a different directory name." 1>&2; exit 1; }
+  fi
+done
+
+
+do_dir_warning=no
+
+# Now let's see if there's a previous RPM version already installed.  Blargh!
+
+# M4 sucks!!
+
+rpmv=`(rpm -qv xscreensaver) 2>&- | \
+      sed 's/^xscreensaver-\([0-9][0-9]*[.][0-9][0-9]*\)-[0-9][0-9]*$/\1/'`
+
+
+if test \! -z "$rpmv" ; then
+  rpmbdir=`rpm -ql xscreensaver | sed -n 's@^\(.*\)/xscreensaver-demo$@\1@p'`
+  rpmhdir=`rpm -ql xscreensaver | sed -n 's@^\(.*\)/attraction$@\1@p'`
+
+  warning=no
+  warnL "There is already an installed RPM of xscreensaver $rpmv"
+  warn2 "on this system.  You might want to remove it (with"
+  warn2 '"rpm -ve xscreensaver") before running "make install"'
+  warn2 "from this directory."
+  echo ""
+  warn2 "Alternately, you could build this version of xscreensaver"
+  warn2 'as an RPM, and then install that.  An "xscreensaver.spec"'
+  warn2 "file is included.  See the RPM documentation for more info."
+  echo ""
+
+  if test "$rpmbdir" = "$rpmhdir" ; then
+    warn2 "The RPM version was installed in $rpmbdir."
+  else
+    warn2 "The RPM version was installed in $rpmbdir,"
+    warn2 "with demos in $rpmhdir."
+  fi
+
+  do_dir_warning=yes
+fi
+
+
+# Warn about egregious GNOME bogosity.
+#
+if (rpm -qv control-center) >&- 2>&- ; then
+  warning=no
+  warnL "The Gnome Control Center seems to be installed."
+  echo  ""
+  warn2 "Note that simply installing this version of xscreensaver"
+  warn2 "will not cause GNOME to know about the newly-added display"
+  warn2 "modes -- GNOME is just lame that way.  Instead of using the"
+  warn2 "Control Center, try using the \`xscreensaver-demo' command."
+fi
+
+
+if test "${bindir}" = "${HACKDIR}" ; then
+  do_dir_warning=yes
+fi
+
+if test "$do_dir_warning" = yes; then
+  echo ""
+  echo "$warnsep"
+  echo ""
+  echo '      When you run "make install", the "xscreensaver",'
+  echo '      "xscreensaver-demo", and "xscreensaver-command" executables'
+  echo "      will be installed in ${bindir}."
+  echo ""
+  echo "      The various graphics demos (90+ different executables) will"
+  echo "      also be installed in ${HACKDIR}."
+  echo ""
+  echo "      If you would prefer the demos to be installed elsewhere"
+  echo "      (for example, in a dedicated directory) you should re-run"
+  echo "      configure with the --enable-subdir=DIR option.  For more"
+  echo "      information, run $0 --help."
+  warning=yes
+fi
+
+if test "$warning" != no; then
+  echo '' ; echo "$warnsep" ; echo ''
+fi
diff --git a/configure.in b/configure.in
new file mode 100644 (file)
index 0000000..07fb76e
--- /dev/null
@@ -0,0 +1,2764 @@
+# configure.in --- xscreensaver, Copyright (c) 1997 Jamie Zawinski.
+#
+
+AC_INIT(driver/subprocs.c)
+AC_CONFIG_HEADER(config.h)
+
+echo "current directory: `pwd`"
+echo "command line was: $0 $@"
+
+
+# After checking to see that --srcdir is correct (which AC_INIT does)
+# check for some random other files that come later in the tar file,
+# to make sure everything is here.
+#
+for d in driver utils hacks hacks/glx ; do
+  f=$srcdir/$d/Makefile.in
+  if test \! -r $f ; then
+    echo ""
+    echo "ERROR: The package is incomplete: $f does not exist."
+    echo "       This probably means that your download was truncated."
+    echo ""
+    exit 1
+  fi
+done
+
+
+###############################################################################
+#
+#       Function to figure out how to run the compiler.
+#
+###############################################################################
+
+AC_DEFUN(AC_PROG_CC_ANSI,
+ [AC_PROG_CC
+
+  if test -z "$GCC"; then
+    AC_MSG_CHECKING(how to request ANSI compilation)
+    case "$host" in
+      *-hpux* )
+        AC_MSG_RESULT(HPUX: adding -Ae)
+        CC="$CC -Ae"
+      ;;
+      *-aix* )
+        AC_MSG_RESULT(AIX: adding -qlanglvl=ansi -qhalt=e)
+        CC="$CC -qlanglvl=ansi -qhalt=e"
+      ;;
+
+      *-dec-* )
+        AC_MSG_RESULT(DEC: adding -std1)
+        CC="$CC -std1"
+      ;;
+
+      *)
+        AC_MSG_RESULT(no idea)
+      ;;
+    esac
+  fi
+
+  AC_MSG_CHECKING([whether the compiler works on ANSI C])
+  AC_TRY_RUN([ main(int ac, char **av) { return 0; } ],
+     AC_MSG_RESULT(yes),
+     AC_MSG_RESULT(no)
+     AC_MSG_ERROR(Couldn't build even a trivial ANSI C program: check CC.),
+     AC_MSG_ERROR(Couldn't build even a trivial ANSI C program: check CC.))
+
+  if test -n "$GCC"; then
+    AC_MSG_RESULT(Turning on gcc compiler warnings.)
+    CC="$CC -Wall -Wstrict-prototypes -Wnested-externs -Wno-format"
+  else
+    case "$host" in
+      *-irix5* |*-irix6.[0-3]* )
+        AC_MSG_RESULT(Turning on SGI compiler warnings.)
+        CC="$CC -fullwarn -use_readonly_const -rdata_shared -g3"
+      ;;
+#     *-dec-osf* )
+#       if test -z "$GCC"; then
+#         AC_MSG_RESULT(Turning on DEC C compiler warnings.)
+#         CC="$CC -migrate -w0 -verbose -warnprotos"
+#       fi
+#     ;;
+    esac
+  fi
+])
+
+
+###############################################################################
+#
+#       Function to figure out how to create directory trees.
+#
+###############################################################################
+
+AC_DEFUN(AC_PROG_INSTALL_DIRS,
+ [AC_CACHE_CHECK([whether \"\${INSTALL} -d\" creates intermediate directories],
+    ac_cv_install_d_creates_dirs,
+    [ac_cv_install_d_creates_dirs=no
+     rm -rf conftestdir
+     if mkdir conftestdir; then
+       cd conftestdir >&-
+       ${INSTALL} -d `pwd`/dir1/dir2 >&- 2>&-
+       if test -d dir1/dir2/. ; then
+         ac_cv_install_d_creates_dirs=yes
+       fi
+       cd .. >&-
+       rm -rf conftestdir
+     fi
+    ])
+
+  if test "$ac_cv_install_d_creates_dirs" = no ; then
+    AC_CACHE_CHECK([whether \"mkdir -p\" creates intermediate directories],
+      ac_cv_mkdir_p_creates_dirs,
+      [ac_cv_mkdir_p_creates_dirs=no
+       rm -rf conftestdir
+       if mkdir conftestdir; then
+         cd conftestdir >&-
+         mkdir -p dir1/dir2 >&- 2>&-
+         if test -d dir1/dir2/. ; then
+           ac_cv_mkdir_p_creates_dirs=yes
+         fi
+         cd .. >&-
+         rm -rf conftestdir
+       fi
+      ])
+  fi
+
+  if test "$ac_cv_install_d_creates_dirs" = yes ; then
+    INSTALL_DIRS='${INSTALL} -d'
+  elif test "$ac_cv_mkdir_p_creates_dirs" = yes ; then
+    INSTALL_DIRS='mkdir -p'
+  else
+    # any other ideas?
+    INSTALL_DIRS='${INSTALL} -d'
+  fi
+])
+
+
+###############################################################################
+#
+#       Function to check whether gettimeofday() exists, and how to call it.
+#      This may define HAVE_GETTIMEOFDAY and GETTIMEOFDAY_TWO_ARGS.
+#
+###############################################################################
+
+AC_DEFUN(AC_GETTIMEOFDAY_ARGS,
+ [AC_MSG_CHECKING(how to call gettimeofday)
+  AC_CACHE_VAL(ac_cv_gettimeofday_args,
+   [AC_TRY_COMPILE([#include <stdlib.h>
+                    #include <sys/time.h>],
+                   [struct timeval tv; struct timezone tzp;
+                    gettimeofday(&tv, &tzp);],
+                   [ac_gettimeofday_args=2],
+                   [AC_TRY_COMPILE([#include <stdlib.h>
+                                    #include <sys/time.h>],
+                                   [struct timeval tv; gettimeofday(&tv);],
+                                   [ac_gettimeofday_args=1],
+                                   [ac_gettimeofday_args=0])])
+    ac_cv_gettimeofday_args=$ac_gettimeofday_args])
+  ac_gettimeofday_args=$ac_cv_gettimeofday_args
+  if test "$ac_gettimeofday_args" = 1 ; then
+    AC_DEFINE(HAVE_GETTIMEOFDAY)
+    AC_MSG_RESULT(one argument)
+  elif test "$ac_gettimeofday_args" = 2 ; then
+    AC_DEFINE(HAVE_GETTIMEOFDAY)
+    AC_DEFINE(GETTIMEOFDAY_TWO_ARGS)
+    AC_MSG_RESULT(two arguments)
+  else
+    AC_MSG_RESULT(unknown)
+  fi
+])
+
+
+###############################################################################
+#
+#       Function to find perl5 (defines PERL and PERL_VERSION.)
+#
+###############################################################################
+
+# M4 sucks!!  perl sucks too!!
+changequote(X,Y)
+perl_version_cmd='print $]'
+changequote([,])
+
+AC_DEFUN(AC_PROG_PERL,
+ [PERL=''
+  AC_PATH_PROGS(PERL, [perl5 perl],,)
+  if test -z "$PERL" ; then
+    PERL_VERSION=0
+  else
+    AC_CACHE_CHECK([perl version], ac_cv_perl_version,
+                   [ac_cv_perl_version=`$PERL -e "$perl_version_cmd"`])
+    PERL_VERSION=$ac_cv_perl_version
+  fi
+ ])
+
+
+###############################################################################
+#
+#       Functions to check how to do ICMP PING requests.
+#
+###############################################################################
+
+AC_DEFUN(AC_CHECK_ICMP,
+ [AC_CACHE_CHECK([for struct icmp], ac_cv_have_icmp,
+  [AC_TRY_COMPILE([#include <stdlib.h>
+                   #include <stdio.h>
+                   #include <math.h>
+                   #include <unistd.h>
+                   #include <limits.h>
+                   #include <signal.h>
+                   #include <fcntl.h>
+                   #include <sys/types.h>
+                   #include <sys/time.h>
+                   #include <sys/ipc.h>
+                   #include <sys/shm.h>
+                   #include <sys/socket.h>
+                   #include <netinet/in_systm.h>
+                   #include <netinet/in.h>
+                   #include <netinet/ip.h>
+                   #include <netinet/ip_icmp.h>
+                   #include <netinet/udp.h>
+                   #include <arpa/inet.h>
+                   #include <netdb.h>],
+                  [struct icmp i;
+                   struct sockaddr s;
+                   struct sockaddr_in si;
+                   struct ip ip;
+                   i.icmp_type = ICMP_ECHO;
+                   i.icmp_code = 0;
+                   i.icmp_cksum = 0;
+                   i.icmp_id = 0;
+                   i.icmp_seq = 0;
+                   si.sin_family = AF_INET;
+                   ip.ip_hl = 0;],
+                  [ac_cv_have_icmp=yes],
+                  [ac_cv_have_icmp=no])])
+ if test "$ac_cv_have_icmp" = yes ; then
+   AC_DEFINE(HAVE_ICMP)
+ fi])
+
+AC_DEFUN(AC_CHECK_ICMPHDR,
+ [AC_CACHE_CHECK([for struct icmphdr], ac_cv_have_icmphdr,
+  [AC_TRY_COMPILE([#include <stdlib.h>
+                   #include <stdio.h>
+                   #include <math.h>
+                   #include <unistd.h>
+                   #include <limits.h>
+                   #include <signal.h>
+                   #include <fcntl.h>
+                   #include <sys/types.h>
+                   #include <sys/time.h>
+                   #include <sys/ipc.h>
+                   #include <sys/shm.h>
+                   #include <sys/socket.h>
+                   #include <netinet/in_systm.h>
+                   #include <netinet/in.h>
+                   #include <netinet/ip.h>
+                   #include <netinet/ip_icmp.h>
+                   #include <netinet/udp.h>
+                   #include <arpa/inet.h>
+                   #include <netdb.h>],
+                  [struct icmphdr i;
+                   struct sockaddr s;
+                   struct sockaddr_in si;
+                   struct ip ip;
+                   i.type = ICMP_ECHO;
+                   i.code = 0;
+                   i.cksum = 0;
+                   i.un.echo.id = 0;
+                   i.un.echo.sequence = 0;
+                   si.sin_family = AF_INET;
+                   ip.ip_hl = 0;],
+                  [ac_cv_have_icmphdr=yes],
+                  [ac_cv_have_icmphdr=no])])
+ if test "$ac_cv_have_icmphdr" = yes ; then
+   AC_DEFINE(HAVE_ICMPHDR)
+ fi])
+
+
+###############################################################################
+#
+#       Functions to check for various X11 crap.
+#
+###############################################################################
+
+# Try and find the app-defaults directory.
+# It sucks that autoconf doesn't do this already...
+#
+AC_DEFUN(AC_PATH_X_APP_DEFAULTS_XMKMF,[
+  rm -fr conftestdir
+  if mkdir conftestdir; then
+    cd conftestdir >&-
+    # Make sure to not put "make" in the Imakefile rules, since we grep it out.
+    cat > Imakefile <<'EOF'
+acfindx:
+       @echo 'ac_x_app_defaults="${XAPPLOADDIR}"'
+EOF
+    if (xmkmf) >/dev/null 2>/dev/null && test -f Makefile; then
+      # GNU make sometimes prints "make[1]: Entering...", which'd confuse us.
+      eval `${MAKE-make} acfindx 2>/dev/null | grep -v make`
+    fi
+    cd .. >&-
+    rm -fr conftestdir
+  fi])
+
+AC_DEFUN(AC_PATH_X_APP_DEFAULTS_DIRECT,[
+  # Look for the directory under a standard set of common directories.
+  # Check X11 before X11Rn because it's often a symlink to the current release.
+  for ac_dir in                                 \
+    /usr/X11/lib/app-defaults                   \
+    /usr/X11R6/lib/app-defaults                 \
+    /usr/X11R6/lib/X11/app-defaults             \
+    /usr/X11R5/lib/app-defaults                 \
+    /usr/X11R5/lib/X11/app-defaults             \
+    /usr/X11R4/lib/app-defaults                 \
+    /usr/X11R4/lib/X11/app-defaults             \
+                                                \
+    /usr/lib/X11/app-defaults                   \
+    /usr/lib/X11R6/app-defaults                 \
+    /usr/lib/X11R5/app-defaults                 \
+    /usr/lib/X11R4/app-defaults                 \
+                                                \
+    /usr/local/X11/lib/app-defaults             \
+    /usr/local/X11R6/lib/app-defaults           \
+    /usr/local/X11R5/lib/app-defaults           \
+    /usr/local/X11R4/lib/app-defaults           \
+                                                \
+    /usr/local/lib/X11/app-defaults             \
+    /usr/local/lib/X11R6/app-defaults           \
+    /usr/local/lib/X11R6/X11/app-defaults       \
+    /usr/local/lib/X11R5/app-defaults           \
+    /usr/local/lib/X11R5/X11/app-defaults       \
+    /usr/local/lib/X11R4/app-defaults           \
+    /usr/local/lib/X11R4/X11/app-defaults       \
+                                                \
+    /usr/X386/lib/X11/app-defaults              \
+    /usr/x386/lib/X11/app-defaults              \
+    /usr/XFree86/lib/X11/app-defaults           \
+                                                \
+    /usr/lib/X11/app-defaults                   \
+    /usr/local/lib/X11/app-defaults             \
+    /usr/unsupported/lib/X11/app-defaults       \
+    /usr/athena/lib/X11/app-defaults            \
+    /usr/local/x11r5/lib/X11/app-defaults       \
+    /usr/lpp/Xamples/lib/X11/app-defaults       \
+    /lib/usr/lib/X11/app-defaults               \
+                                                \
+    /usr/openwin/lib/app-defaults               \
+    /usr/openwin/lib/X11/app-defaults           \
+    /usr/openwin/share/lib/app-defaults         \
+    /usr/openwin/share/lib/X11/app-defaults     \
+                                                \
+    /X11R6/lib/app-defaults                     \
+    /X11R5/lib/app-defaults                     \
+    /X11R4/lib/app-defaults                     \
+    ; \
+  do
+    if test -d "$ac_dir"; then
+      ac_x_app_defaults=$ac_dir
+      break
+    fi
+  done
+])
+
+AC_DEFUN(AC_PATH_X_APP_DEFAULTS,
+  [AC_REQUIRE_CPP()
+    AC_CACHE_CHECK([for X app-defaults directory], ac_cv_x_app_defaults,
+     [AC_PATH_X_APP_DEFAULTS_XMKMF
+      if test x"$ac_x_app_defaults" = x; then
+        AC_PATH_X_APP_DEFAULTS_DIRECT
+      fi
+      if test x"$ac_x_app_defaults" = x; then
+        ac_cv_x_app_defaults="/usr/lib/X11/app-defaults"
+      else
+        # Record where we found app-defaults for the cache.
+        ac_cv_x_app_defaults="$ac_x_app_defaults"
+      fi])
+    eval ac_x_app_defaults="$ac_cv_x_app_defaults"])
+
+
+AC_DEFUN(AC_XPOINTER,
+ [AC_CACHE_CHECK([for XPointer], ac_cv_xpointer,
+                 [AC_TRY_X_COMPILE([#include <X11/Xlib.h>],
+                                   [XPointer foo = (XPointer) 0;],
+                                   [ac_cv_xpointer=yes],
+                                   [ac_cv_xpointer=no])])
+  if test "$ac_cv_xpointer" != yes; then
+   AC_DEFINE(XPointer,[char*])
+  fi])
+
+
+# Random special-cases for X on certain pathological OSes.
+# You know who you are.
+#
+AC_DEFUN(AC_X_RANDOM_PATHS,
+ [case "$host" in
+    *-hpux*)
+
+      # The following arcana was gleaned from conversations with
+      # Eric Schwartz <erics@col.hp.com>:
+      #
+      # On HPUX 10.x, the parts of X that HP considers "standard" live in
+      # /usr/{include,lib}/X11R6/.  The parts that HP doesn't consider
+      # "standard", notably, Xaw and Xmu, live in /usr/contrib/X11R6/.
+      # Yet /usr/contrib/X11R6/ comes preinstalled on all HPUX systems.
+      # Also, there are symlinks from /usr/include/ and /usr/lib/ into
+      # /usr/{include,lib}/X11R6/, so that (if you don't use Xmu at all)
+      # you don't need any -I or -L arguments.
+      #
+      # On HPUX 9.x, /usr/{include,lib}/X11R5/ and /usr/contrib/X11R5/
+      # are the same division as 10.x.  However, there are no symlinks to
+      # the X stuff from /usr/include/ and /usr/lib/, so -I and -L
+      # arguments are always necessary.
+      #
+      # However, X11R6 was available on HPUX 9.x as a patch: if that
+      # patch was installed, then all of X11R6 went in to
+      # /usr/contrib/X11R6/ (there was no /usr/{include,lib}/X11R6/.)
+      #
+      # HPUX 8.x was the same as 9.x, but was X11R4 instead (I don't know
+      # whether R5 was available as a patch; R6 undoubtedly was not.)
+      #
+      # So.  We try and use the highest numbered pair of
+      # /usr/{include,lib}/X11R?/ and /usr/contrib/X11R?/{include,lib}/
+      # that are available.  We do not mix and match different versions
+      # of X.
+      #
+      # Question I still don't know the answer to: (do you?)
+      #
+      #   * On HPUX 9.x, where /usr/include/X11R5/ was standard, and
+      #     /usr/contrib/X11R6/ could be installed as a patch, what was in
+      #     that contrib directory?  Did it contain so-called "standard"
+      #     X11R6, or did it include Xaw and Xmu as well?  If the former,
+      #     where did one find Xaw and Xmu on 9.x R6 systems?  Would this
+      #     be a situation where one had to reach into the R5 headers and
+      #     libs to find Xmu?  That is, must both R6 and R5 directories
+      #     be on the -I and -L lists in that case?
+      #
+      for version in X11R6 X11R5 X11R4 ; do
+        # if either pair of directories exists...
+        if test -d /usr/lib/$version || test -d /usr/contrib/$version/lib
+        then
+           # if contrib exists, use it...
+           if test -d /usr/contrib/$version/lib ; then
+             X_CFLAGS="$X_CFLAGS -I/usr/contrib/$version/include"
+             X_LIBS="$X_LIBS -L/usr/contrib/$version/lib"
+           fi
+           # if the "standard" one exists, use it.
+           if test -d /usr/lib/$version ; then
+             X_CFLAGS="$X_CFLAGS -I/usr/include/$version"
+             X_LIBS="$X_LIBS -L/usr/lib/$version"
+           fi
+           # since at least one of the pair exists, go no farther.
+           break
+        fi
+      done
+
+      # Now find Motif.  Thanks for not making xmkmf find this by
+      # default, you losers.
+      #
+      if test -d /usr/lib/Motif1.2 ; then
+        X_CFLAGS="$X_CFLAGS -I/usr/include/Motif1.2"
+        X_LIBS="$X_LIBS -L/usr/lib/Motif1.2"
+      elif test -d /usr/lib/Motif1.1 ; then
+        X_CFLAGS="$X_CFLAGS -I/usr/include/Motif1.1"
+        X_LIBS="$X_LIBS -L/usr/lib/Motif1.1"
+      fi
+
+      # Now let's check for the pseudo-standard locations for OpenGL and XPM.
+      #
+      if test -d /opt/Mesa/lib ; then
+        X_CFLAGS="-I/opt/Mesa/include $X_CFLAGS"
+        X_LIBS="-L/opt/Mesa/lib $X_LIBS"
+      fi
+
+      if test -d /opt/xpm/lib/X11 ; then
+        X_CFLAGS="-I/opt/xpm/include $X_CFLAGS"
+        X_LIBS="-L/opt/xpm/lib/X11 $X_LIBS"
+      fi
+
+      # On HPUX, default to installing in /opt/xscreensaver/ instead of
+      # in /usr/local/, unless there is already an xscreensaver in
+      # /usr/local/bin/.  This can be overridden with the --prefix arg
+      # to configure.  I'm not sure this is the right thing to do, but
+      # Richard Lloyd says so...
+      #
+      if test \! -x /usr/local/bin/xscreensaver ; then
+        ac_default_prefix=/opt/xscreensaver
+      fi
+
+    ;;
+    *-solaris*)
+
+      # Thanks for not making xmkmf find this by default, pinheads.
+      # And thanks for moving things around again, too.  Is this
+      # really the standard location now?  What happened to the
+      # joke that this kind of thing went in /opt?
+      # cthomp says "answer: CDE (Common Disorganized Environment)"
+      #
+      if test -f /usr/dt/include/Xm/Xm.h ; then
+        X_CFLAGS="$X_CFLAGS -I/usr/dt/include"
+        X_LIBS="$X_LIBS -L/usr/dt/lib -R:/usr/dt/lib"
+
+        # Some versions of Slowlaris Motif require -lgen.  But not all.  Why?
+        AC_CHECK_LIB(gen, regcmp, [X_LIBS="$X_LIBS -lgen"])
+      fi
+    ;;
+  esac])
+
+
+
+###############################################################################
+#
+#       Some utility functions to make checking for X things easier.
+#
+###############################################################################
+
+# Like AC_CHECK_HEADER, but it uses the already-computed -I directories.
+#
+AC_DEFUN(AC_CHECK_X_HEADER, [
+  ac_save_CPPFLAGS="$CPPFLAGS"
+  if test \! -z "$includedir" ; then 
+    CPPFLAGS="$CPPFLAGS -I$includedir"
+  fi
+  CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+  AC_CHECK_HEADER([$1], [$2])
+  CPPFLAGS="$ac_save_CPPFLAGS"])
+
+# Like AC_EGREP_HEADER, but it uses the already-computed -I directories.
+#
+AC_DEFUN(AC_EGREP_X_HEADER, [
+  ac_save_CPPFLAGS="$CPPFLAGS"
+  if test \! -z "$includedir" ; then 
+    CPPFLAGS="$CPPFLAGS -I$includedir"
+  fi
+  CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+  AC_EGREP_HEADER([$1], [$2], [$3], [$4])
+  CPPFLAGS="$ac_save_CPPFLAGS"])
+
+# Like AC_TRY_COMPILE, but it uses the already-computed -I directories.
+#
+AC_DEFUN(AC_TRY_X_COMPILE, [
+  ac_save_CPPFLAGS="$CPPFLAGS"
+  if test \! -z "$includedir" ; then 
+    CPPFLAGS="$CPPFLAGS -I$includedir"
+  fi
+  CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+  AC_TRY_COMPILE([$1], [$2], [$3], [$4])
+  CPPFLAGS="$ac_save_CPPFLAGS"])
+
+
+# Like AC_CHECK_LIB, but it uses the already-computed -I and -L directories.
+# Use this sparingly; it probably doesn't work very well on X programs.
+#
+AC_DEFUN(AC_CHECK_X_LIB, [
+  ac_save_CPPFLAGS="$CPPFLAGS"
+  ac_save_LDFLAGS="$LDFLAGS"
+#  ac_save_LIBS="$LIBS"
+
+  if test \! -z "$includedir" ; then 
+    CPPFLAGS="$CPPFLAGS -I$includedir"
+  fi
+  # note: $X_CFLAGS includes $x_includes
+  CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+
+  if test \! -z "$libdir" ; then
+    LDFLAGS="$LDFLAGS -L$libdir"
+  fi
+  # note: $X_LIBS includes $x_libraries
+  LDFLAGS="$LDFLAGS $X_LIBS"
+
+  AC_CHECK_LIB([$1], [$2], [$3], [$4], [$5])
+  CPPFLAGS="$ac_save_CPPFLAGS"
+  LDFLAGS="$ac_save_LDFLAGS"
+#  LIBS="$ac_save_LIBS"
+  ])
+
+# Like AC_TRY_RUN, but it uses the already-computed -I directories.
+# (But not the -L directories!)
+#
+AC_DEFUN(AC_TRY_X_RUN, [
+  ac_save_CPPFLAGS="$CPPFLAGS"
+  if test \! -z "$includedir" ; then 
+    CPPFLAGS="$CPPFLAGS -I$includedir"
+  fi
+  CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+  AC_TRY_RUN([$1], [$2], [$3], [$4])
+  CPPFLAGS="$ac_save_CPPFLAGS"])
+
+
+
+# Usage: HANDLE_X_PATH_ARG([variable_name],
+#                          [--command-line-option],
+#                          [descriptive string])
+#
+# All of the --with options take three forms:
+#
+#   --with-foo (or --with-foo=yes)
+#   --without-foo (or --with-foo=no)
+#   --with-foo=/DIR
+#
+# This function, HANDLE_X_PATH_ARG, deals with the /DIR case.  When it sees
+# a directory (string beginning with a slash) it checks to see whether
+# /DIR/include and /DIR/lib exist, and adds them to $X_CFLAGS and $X_LIBS
+# as appropriate.
+#
+AC_DEFUN(HANDLE_X_PATH_ARG, [
+   case "$[$1]" in
+    yes) ;;
+    no)  ;;
+
+    /*)
+     AC_MSG_CHECKING([for [$3] headers])
+     d=$[$1]/include
+     if test -d $d; then
+       X_CFLAGS="-I$d $X_CFLAGS"
+       AC_MSG_RESULT($d)
+     else
+       AC_MSG_RESULT(not found ($d: no such directory))
+     fi
+
+     AC_MSG_CHECKING([for [$3] libs])
+     d=$[$1]/lib
+     if test -d $d; then
+       X_LIBS="-L$d $X_LIBS"
+       AC_MSG_RESULT($d)
+     else
+       AC_MSG_RESULT(not found ($d: no such directory))
+     fi
+
+     # replace the directory string with "yes".
+     [$1]_req="yes"
+     [$1]=$[$1]_req
+     ;;
+
+    *)
+     echo ""
+     echo "error: argument to [$2] must be \"yes\", \"no\", or a directory."
+     echo "       If it is a directory, then \`DIR/include' will be added to"
+     echo "       the -I list, and \`DIR/lib' will be added to the -L list."
+     exit 1
+     ;;
+   esac
+  ])
+
+
+
+###############################################################################
+###############################################################################
+#
+#       End of function definitions.  Now start actually executing stuff.
+#
+###############################################################################
+###############################################################################
+
+# random compiler setup
+AC_CANONICAL_HOST
+AC_PROG_CC_ANSI
+AC_PROG_CPP
+AC_C_CONST
+AC_C_INLINE
+
+# stuff for Makefiles
+AC_PROG_INSTALL
+AC_PROG_INSTALL_DIRS
+AC_PROG_MAKE_SET
+
+# random libc stuff
+AC_HEADER_STDC
+AC_CHECK_HEADERS(unistd.h)
+AC_TYPE_MODE_T
+AC_TYPE_PID_T
+AC_TYPE_SIZE_T
+AC_TYPE_SIGNAL
+AC_HEADER_TIME
+AC_HEADER_SYS_WAIT
+AC_HEADER_DIRENT
+AC_GETTIMEOFDAY_ARGS
+AC_CHECK_FUNCS(select fcntl uname nice setpriority getcwd getwd putenv)
+
+AC_CHECK_FUNCS(sigaction syslog realpath)
+AC_CHECK_ICMP
+AC_CHECK_ICMPHDR
+AC_CHECK_HEADERS(crypt.h sys/select.h)
+AC_PROG_PERL
+
+if test -z "$PERL" ; then
+  # don't let it be blank...
+  PERL=/usr/local/bin/perl5
+fi
+
+AC_PATH_XTRA
+
+if test "$have_x" != yes; then
+  AC_MSG_ERROR(Couldn't find X11 headers/libs.  Try \`$0 --help'.)
+fi
+
+AC_PATH_X_APP_DEFAULTS
+AC_X_RANDOM_PATHS
+AC_XPOINTER
+
+
+
+###############################################################################
+#
+#       Check for -lXmu (some fucked up vendors don't ship it...)
+#
+###############################################################################
+
+have_xmu=no
+AC_CHECK_X_HEADER(X11/Xmu/Error.h, [have_xmu=yes])
+if test "$have_xmu" = no ; then
+  XMU_SRCS='$(UTILS_SRC)/xmu.c'
+  XMU_OBJS='$(UTILS_BIN)/xmu.o'
+else
+  XMU_SRCS=''
+  XMU_OBJS=''
+  SAVER_LIBS="-lXmu $SAVER_LIBS"
+  HACK_LIBS="-lXmu $HACK_LIBS"
+  MOTIF_LIBS="-lXmu $MOTIF_LIBS"
+  GTK_LIBS="-lXmu $GTK_LIBS"
+  ATHENA_LIBS="-lXmu $ATHENA_LIBS"
+  ATHENA3D_LIBS="-lXmu $ATHENA3D_LIBS"
+  AC_DEFINE(HAVE_XMU)
+fi
+
+
+###############################################################################
+#
+#       Check for the SunOS 4.1.x _get_wmShellWidgetClass bug.
+#       See comp.windows.x FAQ question 124.  The right fix is to
+#       get OpenWindows 3.0 patches 100512-02 and 100573-03.
+#
+###############################################################################
+
+if test "$have_xmu" = yes ; then
+  case "$host" in
+    *-sunos4*)
+    AC_CACHE_CHECK([for the SunOS 4.1.x _get_wmShellWidgetClass bug],
+                   ac_cv_sunos_xmu_bug,
+                   [ac_save_LDFLAGS="$LDFLAGS"
+                    if test \! -z "$x_libraries" ; then
+                      LDFLAGS="$LDFLAGS -L$x_libraries"
+                    fi
+                    # Note: this trick never works!  (Generally.)
+                    # We're only getting away with using AC_TRY_LINK
+                    # with X libraries because we know it's SunOS.
+                    LDFLAGS="$LDFLAGS -lXmu -lXt -lX11 -lXext -lm"
+                    AC_TRY_LINK(,,
+                                [ac_cv_sunos_xmu_bug=no],
+                                [ac_cv_sunos_xmu_bug=yes])
+                    LDFLAGS="$ac_save_LDFLAGS"])
+    if test "$ac_cv_sunos_xmu_bug" = yes ; then
+      AC_CACHE_CHECK([whether the compiler understands -static], 
+                     ac_cv_ld_static,
+                     [ac_save_LDFLAGS="$LDFLAGS"
+                      LDFLAGS="$LDFLAGS -static"
+                      AC_TRY_LINK(,,[ac_cv_ld_static=yes],[ac_cv_ld_static=no])
+                    LDFLAGS="$ac_save_LDFLAGS"])
+      if test "$ac_cv_ld_static" = yes ; then
+        LDFLAGS="$LDFLAGS -static"
+      else
+        LDFLAGS="$LDFLAGS -Bstatic"
+      fi
+    fi
+    ;;
+  esac
+fi
+
+
+###############################################################################
+#
+#       Handle the --enable-subdir option
+#
+###############################################################################
+
+AC_ARG_ENABLE(subdir,[
+Installation options:
+
+  --enable-subdir=DIR     Put the demo programs in a subdirectory of \`bindir',
+                          instead of putting them in bindir itself.  You can
+                          specify the name of the subdirectory.  For example,
+                          \`--exec-prefix=/usr/local --enable-subdir=demos'
+                          would put xscreensaver in /usr/local/bin/, and would
+                          put the demos in /usr/local/bin/demos/.  (If DIR
+                          begins with /, then bindir will not be prepended.)
+
+  --disable-subdir        Just put the demos in \`bindir' (this is the default.)
+],
+  [enable_subdir="$enableval"],[enable_subdir=no])
+if test x"$enable_subdir" = xno; then
+  HACKDIR='${bindir}'
+elif test x"$enable_subdir" = xyes -o x"$enable_subdir" = x ; then
+  echo "error: must be a subdirectory name: --enable-subdir=$enable_subdir"
+  exit 1
+else
+  # there must be a better way than this...
+  if test -z "`echo $enable_subdir | sed 's@^/.*@@'`" ; then
+    # absolute path
+    HACKDIR=$enable_subdir
+  else
+    # relative path
+    HACKDIR='${bindir}/'$enable_subdir
+  fi
+fi
+
+# canonicalize slashes.
+HACKDIR=`echo "${HACKDIR}" | sed 's@/$@@;s@//*@/@g'`
+
+
+###############################################################################
+#
+#       Check for the SGI SCREEN_SAVER server extension.
+#
+###############################################################################
+
+have_sgi=no
+with_sgi_req=unspecified
+AC_ARG_WITH(sgi-ext,
+[Except where noted, all of the --with options below can also take a
+directory argument: for example, \`--with-motif=/opt/Motif'.  That would
+cause /opt/Motif/include/ to be added to the -I list, and /opt/Motif/lib/
+to be added to the -L list, assuming those directories exist.  
+
+By default, support for each of these options will be built in, if the
+relevant library routines exist.  At run time, they will then be used
+only if the X server being used supports them.  Each --with option has
+a corresponding --without option, to override building support for them
+at all.
+
+Screen blanking and idle-detection options:
+
+  --with-sgi-ext          Include support for the SGI SCREEN_SAVER extension.],
+  [with_sgi="$withval"; with_sgi_req="$withval"],[with_sgi=yes])
+
+HANDLE_X_PATH_ARG(with_sgi, --with-sgi-ext, SGI SCREEN_SAVER)
+
+if test "$with_sgi" = yes; then
+  AC_CHECK_X_HEADER(X11/extensions/XScreenSaver.h,
+                    [have_sgi=yes
+                     AC_DEFINE(HAVE_SGI_SAVER_EXTENSION)])
+
+elif test "$with_sgi" != no; then
+  echo "error: must be yes or no: --with-sgi-ext=$with_sgi"
+  exit 1
+fi
+
+
+###############################################################################
+#
+#       Check for the MIT-SCREEN-SAVER server extension.
+#
+###############################################################################
+
+have_mit=no
+with_mit_req=unspecified
+AC_ARG_WITH(mit-ext,
+[  --with-mit-ext          Include support for the MIT-SCREEN-SAVER extension.],
+  [with_mit="$withval"; with_mit_req="$withval"],[with_mit=yes])
+
+HANDLE_X_PATH_ARG(with_mit, --with-mit-ext, MIT-SCREEN-SAVER)
+
+if test "$with_mit" = yes; then
+  AC_CHECK_X_HEADER(X11/extensions/scrnsaver.h, [have_mit=yes])
+
+  # Now check to see if it's really in the library; XF86Free-3.3 ships
+  # scrnsaver.h, but doesn't include the code in libXext.a, the idiots!
+  #
+  if test "$have_mit" = yes; then
+    AC_CHECK_X_LIB(Xext, XScreenSaverRegister, [true], [have_mit=no], -lm)
+
+    if test "$have_mit" = no; then
+      # Fuck!  Looks like XF86Free-3.3 actually puts it in XExExt instead
+      # of in Xext.  Thank you master, may I have another.
+      AC_CHECK_X_LIB(XExExt, XScreenSaverRegister,
+                     [have_mit=yes; SAVER_LIBS="$SAVER_LIBS -lXExExt"],
+                     [true], -lX11 -lXext -lm)
+    fi
+
+    if test "$have_mit" = no; then
+      # Double fuck!  Looks like some versions of XFree86 (whichever version
+      # it is that comes with RedHat Linux 2.0 -- I can't find a version 
+      # number) put this garbage in Xss instead of Xext.  Thank you master,
+      #  may I have another.
+      AC_CHECK_X_LIB(Xss, XScreenSaverRegister,
+                     [have_mit=yes; SAVER_LIBS="$SAVER_LIBS -lXss"],
+                     [true], -lX11 -lXext -lm)
+    fi
+
+  if test "$have_mit" = yes; then
+    AC_DEFINE(HAVE_MIT_SAVER_EXTENSION)
+  fi
+
+  fi
+
+elif test "$with_mit" != no; then
+  echo "error: must be yes or no: --with-mit-ext=$with_mit"
+  exit 1
+fi
+
+
+###############################################################################
+#
+#       Check for the XIDLE server extension.
+#
+###############################################################################
+
+have_xidle=no
+with_xidle_req=unspecified
+AC_ARG_WITH(xidle-ext,
+[  --with-xidle-ext        Include support for the XIDLE extension.],
+  [with_xidle="$withval"; with_xidle_req="$withval"],[with_xidle=yes])
+
+HANDLE_X_PATH_ARG(with_xidle, --with-xidle-ext, XIDLE)
+
+if test "$with_xidle" = yes; then
+  AC_CHECK_X_HEADER(X11/extensions/xidle.h,
+                    [have_xidle=yes
+                     AC_DEFINE(HAVE_XIDLE_EXTENSION)])
+elif test "$with_xidle" != no; then
+  echo "error: must be yes or no: --with-xidle-ext=$with_xidle"
+  exit 1
+fi
+
+
+###############################################################################
+#
+#       Check for the SGI-VIDEO-CONTROL server extension.
+#
+###############################################################################
+
+have_sgivc=no
+with_sgivc_req=unspecified
+AC_ARG_WITH(sgivc-ext,
+[  --with-sgivc-ext        Include support for the SGI-VIDEO-CONTROL extension.],
+  [with_sgivc="$withval"; with_sgivc_req="$withval"],[with_sgivc=yes])
+
+HANDLE_X_PATH_ARG(with_sgivc, --with-sgivc-ext, SGI-VIDEO-CONTROL)
+
+if test "$with_sgivc" = yes; then
+
+  # first check for XSGIvc.h
+  AC_CHECK_X_HEADER(X11/extensions/XSGIvc.h, [have_sgivc=yes])
+
+  # if that succeeded, then check for the -lXsgivc
+  if test "$have_sgivc" = yes; then
+    have_sgivc=no
+    AC_CHECK_X_LIB(Xsgivc, XSGIvcQueryGammaMap,
+                  [have_sgivc=yes; SAVER_LIBS="$SAVER_LIBS -lXsgivc"], [true],
+                  -lXext -lX11)
+  fi
+
+  # if that succeeded, then we've really got it.
+  if test "$have_sgivc" = yes; then
+    AC_DEFINE(HAVE_SGI_VC_EXTENSION)
+  fi
+
+elif test "$with_sgivc" != no; then
+  echo "error: must be yes or no: --with-sgivc-ext=$with_sgivc"
+  exit 1
+fi
+
+
+###############################################################################
+#
+#       Check for the DPMS server extension.
+#
+###############################################################################
+
+have_dpms=no
+with_dpms_req=unspecified
+AC_ARG_WITH(dpms-ext,
+[  --with-dpms-ext         Include support for the DPMS extension.],
+  [with_dpms="$withval"; with_dpms_req="$withval"],[with_dpms=yes])
+
+HANDLE_X_PATH_ARG(with_dpms, --with-dpms-ext, DPMS)
+
+if test "$with_dpms" = yes; then
+
+  # first check for dpms.h
+  AC_CHECK_X_HEADER(X11/extensions/dpms.h, [have_dpms=yes])
+
+  # if that succeeded, then check for the -lXdpms
+  if test "$have_dpms" = yes; then
+    have_dpms=no
+    AC_CHECK_X_LIB(Xdpms, DPMSInfo,
+                  [have_dpms=yes; SAVER_LIBS="$SAVER_LIBS -lXdpms"], [true],
+                  -lXext -lX11)
+  fi
+
+  # if that succeeded, then we've really got it.
+  if test "$have_dpms" = yes; then
+    AC_DEFINE(HAVE_DPMS_EXTENSION)
+  fi
+
+elif test "$with_dpms" != no; then
+  echo "error: must be yes or no: --with-dpms-ext=$with_dpms"
+  exit 1
+fi
+
+
+###############################################################################
+#
+#       Check for the XF86VMODE server extension.
+#
+###############################################################################
+
+have_xf86vmode=no
+with_xf86vmode_req=unspecified
+AC_ARG_WITH(xf86vmode-ext,
+[  --with-xf86vmode-ext    Include support for XFree86 virtual screens.],
+  [with_xf86vmode="$withval"; with_xf86vmode_req="$withval"],
+  [with_xf86vmode=yes])
+
+HANDLE_X_PATH_ARG(with_xf86vmode, --with-xf86vmode-ext, xf86vmode)
+
+if test "$with_xf86vmode" = yes; then
+
+  # first check for xf86vmode.h
+  AC_CHECK_X_HEADER(X11/extensions/xf86vmode.h, [have_xf86vmode=yes])
+
+  # if that succeeded, then check for the -lXxf86vm
+  if test "$have_xf86vmode" = yes; then
+    have_xf86vmode=no
+    AC_CHECK_X_LIB(Xxf86vm, XF86VidModeGetViewPort,
+                  [have_xf86vmode=yes; SAVER_LIBS="$SAVER_LIBS -lXxf86vm"],
+                   [true], -lXext -lX11)
+  fi
+
+  # if that succeeded, then we've really got it.
+  if test "$have_xf86vmode" = yes; then
+    AC_DEFINE(HAVE_XF86VMODE)
+  fi
+
+elif test "$with_xf86vmode" != no; then
+  echo "error: must be yes or no: --with-xf86vmode-ext=$with_xf86vmode"
+  exit 1
+fi
+
+
+###############################################################################
+#
+#       Check for HP XHPDisableReset and XHPEnableReset.
+#
+###############################################################################
+
+AC_EGREP_X_HEADER(XHPDisableReset, X11/XHPlib.h,
+                  [AC_DEFINE(HAVE_XHPDISABLERESET)
+                   SAVER_LIBS="-lXhp11 $SAVER_LIBS"])
+
+
+###############################################################################
+#
+#       Check for /proc/interrupts.
+#
+###############################################################################
+
+have_proc_interrupts=no
+with_proc_interrupts_req=unspecified
+AC_ARG_WITH(proc-interrupts,
+[  --with-proc-interrupts  Include support for consulting the /proc/interrupts
+                          file to notice keyboard activity.],
+  [with_proc_interrupts="$withval"; with_proc_interrupts_req="$withval"],
+  [with_proc_interrupts=yes])
+
+if test "$with_proc_interrupts" = yes; then
+
+   AC_CACHE_CHECK([whether /proc/interrupts contains keyboard data],
+    ac_cv_have_proc_interrupts,
+    [ac_cv_have_proc_interrupts=no
+     if grep keyboard /proc/interrupts >/dev/null 2>&1 ; then
+       ac_cv_have_proc_interrupts=yes
+     fi
+    ])
+   have_proc_interrupts=$ac_cv_have_proc_interrupts
+
+  if test "$have_proc_interrupts" = yes; then
+    AC_DEFINE(HAVE_PROC_INTERRUPTS)
+  fi
+
+elif test "$with_proc_interrupts" != no; then
+  echo "error: must be yes or no: --with-proc-interrupts=$with_proc_interrupts"
+  exit 1
+fi
+
+
+###############################################################################
+#
+#       The --enable-locking option
+#
+###############################################################################
+
+AC_ARG_ENABLE(locking,[
+Screen locking options:
+
+  --enable-locking        Compile in support for locking the display.
+  --disable-locking       Do not allow locking at all.
+],
+  [enable_locking="$enableval"],[enable_locking=yes])
+if test "$enable_locking" = yes; then
+  true
+elif test "$enable_locking" = no; then
+  AC_DEFINE(NO_LOCKING)
+else
+  echo "error: must be yes or no: --enable-locking=$enable_locking"
+  exit 1
+fi
+
+
+
+###############################################################################
+#
+#       The --enable-vt-locking option
+#
+###############################################################################
+
+#ac_vt_lockswitch=no
+#AC_ARG_ENABLE(vt-locking,[
+#  --enable-vt-locking     Compile in support for locking Virtual Terminals.
+#                          This is the default if the system supports it, and
+#                          if locking support is included (--enable-locking.)
+#  --disable-vt-locking    Do not allow locking of VTs, even if locking is
+#                          enabled.],
+#  [enable_vt_locking="$enableval"],[enable_vt_locking=yes])
+#if test "$enable_vt_locking" = yes; then
+#
+#  AC_CACHE_CHECK([for the VT_LOCKSWITCH ioctl], ac_cv_vt_lockswitch,
+#   [AC_TRY_COMPILE([#include <fcntl.h>
+#                   #include <sys/ioctl.h>
+#                   #include <sys/vt.h>],
+#                  [int x = VT_LOCKSWITCH; int y = VT_UNLOCKSWITCH;],
+#                  [ac_cv_vt_lockswitch=yes],
+#                  [ac_cv_vt_lockswitch=no])])
+#  ac_vt_lockswitch=$ac_cv_vt_lockswitch
+#
+#elif test "$enable_vt_locking" = no; then
+#  true
+#else
+#  echo "error: must be yes or no: --enable-vt-locking=$enable_vt_locking"
+#  exit 1
+#fi
+#
+#if test "$ac_vt_lockswitch" = yes; then
+#  AC_DEFINE(HAVE_VT_LOCKSWITCH)
+#  # the VT_LOCKSWITCH ioctl can only be used when running as root.
+#  # #### but it doesn't work yet, so don't worry about that for now.
+##  need_setuid=yes
+#fi
+
+
+
+###############################################################################
+#
+#       Check for PAM.
+#
+###############################################################################
+
+case "$host" in
+  *-solaris*)
+   # Solaris systems tend to come with PAM misconfigured.
+   #  Don't build it by default, even if the headers exist.
+   with_pam_default=no
+   ;;
+  *)
+   # Default to building PAM support on all other systems, if it exists.
+   with_pam_default=yes
+  ;;
+esac
+
+have_pam=no
+with_pam_req=unspecified
+
+AC_ARG_WITH(pam,
+[  --with-pam              Include support for PAM (Pluggable Auth Modules.)],
+  [with_pam="$withval"; with_pam_req="$withval"],[with_pam=$with_pam_default])
+
+HANDLE_X_PATH_ARG(with_pam, --with-pam, PAM)
+
+if test "$enable_locking" = yes -a "$with_pam" = yes; then
+  AC_CACHE_CHECK([for PAM], ac_cv_pam,
+                 [AC_TRY_X_COMPILE([#include <security/pam_appl.h>],,
+                                   [ac_cv_pam=yes],
+                                   [ac_cv_pam=no])])
+  if test "$ac_cv_pam" = yes ; then
+    have_pam=yes
+    AC_DEFINE(HAVE_PAM)
+    PASSWD_LIBS="${PASSWD_LIBS} -lpam"
+
+    # libpam typically requires dlopen and dlsym.  On FreeBSD,
+    # those are in libc.  On Linux and Solaris, they're in libdl.
+    AC_CHECK_LIB(dl, dlopen, [PASSWD_LIBS="${PASSWD_LIBS} -ldl"])
+
+    AC_MSG_CHECKING(how to call pam_strerror)
+    AC_CACHE_VAL(ac_cv_pam_strerror_args,
+     [AC_TRY_COMPILE([#include <stdio.h>
+                      #include <stdlib.h>
+                      #include <security/pam_appl.h>],
+                     [pam_handle_t *pamh = 0;
+                      char *s = pam_strerror(pamh, PAM_SUCCESS);],
+                     [ac_pam_strerror_args=2],
+                     [AC_TRY_COMPILE([#include <stdio.h>
+                                      #include <stdlib.h>
+                                      #include <security/pam_appl.h>],
+                                     [char *s =
+                                       pam_strerror(PAM_SUCCESS);],
+                                     [ac_pam_strerror_args=1],
+                                     [ac_pam_strerror_args=0])])
+      ac_cv_pam_strerror_args=$ac_pam_strerror_args])
+    ac_pam_strerror_args=$ac_cv_pam_strerror_args
+    if test "$ac_pam_strerror_args" = 1 ; then
+      AC_MSG_RESULT(one argument)
+    elif test "$ac_pam_strerror_args" = 2 ; then
+      AC_DEFINE(PAM_STRERROR_TWO_ARGS)
+      AC_MSG_RESULT(two arguments)
+    else
+      AC_MSG_RESULT(unknown)
+    fi
+  fi
+fi
+
+
+###############################################################################
+#
+#       Check for Kerberos.
+#
+###############################################################################
+
+have_kerberos=no
+with_kerberos_req=unspecified
+
+AC_ARG_WITH(kerberos, 
+[  --with-kerberos         Include support for Kerberos authentication.],
+  [with_kerberos="$withval"; with_kerberos_req="$withval"],[with_kerberos=yes])
+
+HANDLE_X_PATH_ARG(with_kerberos, --with-kerberos, Kerberos)
+
+if test "$enable_locking" = yes -a "$with_kerberos" = yes; then
+  AC_CACHE_CHECK([for Kerberos], ac_cv_kerberos,
+                 [AC_TRY_X_COMPILE([#include <krb.h>],,
+                                   [ac_cv_kerberos=yes],
+                                   [ac_cv_kerberos=no])])
+  if test "$ac_cv_kerberos" = yes ; then
+    have_kerberos=yes
+    AC_DEFINE(HAVE_KERBEROS)
+
+    # from Tim Showalter <tjs+@andrew.cmu.edu>
+    PASSWD_LIBS="$PASSWD_LIBS -lkrb -ldes"
+    AC_CHECK_FUNC(res_search,,
+      AC_CHECK_LIB(resolv,res_search,PASSWD_LIBS="${PASSWD_LIBS} -lresolv",
+        AC_MSG_WARN([Can't find DNS resolver libraries needed for Kerberos])
+      ))
+
+  fi
+fi
+
+
+###############################################################################
+#
+#       Check for the nine billion variants of shadow passwords...
+#
+###############################################################################
+
+need_setuid=no
+
+have_shadow=no
+with_shadow_req=unspecified
+
+AC_ARG_WITH(shadow,
+[  --with-shadow           Include support for shadow password authentication.],
+  [with_shadow="$withval"; with_shadow_req="$withval"],[with_shadow=yes])
+
+HANDLE_X_PATH_ARG(with_shadow, --with-shadow, shadow password)
+
+if test "$enable_locking" = no ; then
+  with_shadow_req=no
+  with_shadow=no
+fi
+
+
+###############################################################################
+#
+#       Check for Sun "adjunct" passwords.
+#
+###############################################################################
+
+if test "$with_shadow" = yes ; then
+  AC_CACHE_CHECK([for Sun-style shadow passwords], ac_cv_sun_adjunct,
+                 [AC_TRY_X_COMPILE([#include <stdlib.h>
+                                    #include <unistd.h>
+                                    #include <sys/types.h>
+                                    #include <sys/label.h>
+                                    #include <sys/audit.h>
+                                    #include <pwdadj.h>],
+                      [struct passwd_adjunct *p = getpwanam("nobody");
+                       const char *pw = p->pwa_passwd;],
+                      [ac_cv_sun_adjunct=yes],
+                      [ac_cv_sun_adjunct=no])])
+  if test "$ac_cv_sun_adjunct" = yes; then
+    have_shadow_adjunct=yes
+    have_shadow=yes
+    need_setuid=yes
+  fi
+fi
+
+
+###############################################################################
+#
+#       Check for DEC and SCO so-called "enhanced" security.
+#
+###############################################################################
+
+if test "$with_shadow" = yes ; then
+  AC_CACHE_CHECK([for DEC-style shadow passwords], ac_cv_enhanced_passwd,
+                 [AC_TRY_X_COMPILE([#include <stdlib.h>
+                                    #include <unistd.h>
+                                    #include <sys/types.h>
+                                    #include <pwd.h>
+                                    #include <sys/security.h>
+                                    #include <prot.h>],
+                      [struct pr_passwd *p;
+                       const char *pw;
+                       set_auth_parameters(0, 0);
+                       check_auth_parameters();
+                       p = getprpwnam("nobody");
+                       pw = p->ufld.fd_encrypt;],
+                      [ac_cv_enhanced_passwd=yes],
+                      [ac_cv_enhanced_passwd=no])])
+  if test $ac_cv_enhanced_passwd = yes; then
+    have_shadow_enhanced=yes
+    have_shadow=yes
+    need_setuid=yes
+
+    # On SCO, getprpwnam() is in -lprot (which uses nap() from -lx)
+    # (I'm told it needs -lcurses too, but I don't understand why.)
+    # But on DEC, it's in -lsecurity.
+    #
+    AC_CHECK_LIB(prot, getprpwnam, 
+                 [PASSWD_LIBS="$PASSWD_LIBS -lprot -lcurses -lx"],
+                 [AC_CHECK_LIB(security, getprpwnam, 
+                               [PASSWD_LIBS="$PASSWD_LIBS -lsecurity"])],
+                 [-lx])
+  fi
+fi
+
+###############################################################################
+#
+#       Check for HP's entry in the "Not Invented Here" Sweepstakes.
+#
+###############################################################################
+
+if test "$with_shadow" = yes ; then
+  AC_CACHE_CHECK([for HP-style shadow passwords], ac_cv_hpux_passwd,
+                 [AC_TRY_X_COMPILE([#include <stdlib.h>
+                                    #include <unistd.h>
+                                    #include <sys/types.h>
+                                    #include <pwd.h>
+                                    #include <hpsecurity.h>
+                                    #include <prot.h>],
+                      [struct s_passwd *p = getspwnam("nobody");
+                       const char *pw = p->pw_passwd;],
+                      [ac_cv_hpux_passwd=yes],
+                      [ac_cv_hpux_passwd=no])])
+  if test "$ac_cv_hpux_passwd" = yes; then
+    have_shadow_hpux=yes
+    have_shadow=yes
+    need_setuid=yes
+
+    # on HPUX, bigcrypt is in -lsec
+    AC_CHECK_LIB(sec, bigcrypt, [PASSWD_LIBS="$PASSWD_LIBS -lsec"])
+  fi
+fi
+
+
+###############################################################################
+#
+#       Check for FreeBSD-style shadow passwords.
+#
+#       On FreeBSD, getpwnam() and friends work just like on non-shadow-
+#       password systems -- except you only get stuff in the pw_passwd field
+#       if the running program is setuid.  So, guess that we've got this
+#       lossage to contend with if /etc/master.passwd exists, and default to
+#       a setuid installation.
+#
+###############################################################################
+
+if test "$with_shadow" = yes ; then
+  AC_CACHE_CHECK([for FreeBSD-style shadow passwords], ac_cv_master_passwd,
+                 [if test -f /etc/master.passwd ; then
+                    ac_cv_master_passwd=yes
+                  else
+                    ac_cv_master_passwd=no
+                  fi])
+  if test "$ac_cv_master_passwd" = yes; then
+    need_setuid=yes
+  fi
+fi
+
+
+###############################################################################
+#
+#       Check for traditional (ha!) shadow passwords.
+#
+###############################################################################
+
+if test "$with_shadow" = yes ; then
+  AC_CACHE_CHECK([for generic shadow passwords], ac_cv_shadow,
+                 [AC_TRY_X_COMPILE([#include <stdlib.h>
+                                    #include <unistd.h>
+                                    #include <sys/types.h>
+                                    #include <pwd.h>
+                                    #include <shadow.h>],
+                      [struct spwd *p = getspnam("nobody");
+                       const char *pw = p->sp_pwdp;],
+                      [ac_cv_shadow=yes],
+                      [ac_cv_shadow=no])])
+  if test "$ac_cv_shadow" = yes; then
+    have_shadow=yes
+    need_setuid=yes
+
+    # On some systems (UnixWare 2.1), getspnam() is in -lgen instead of -lc.
+    have_getspnam=no
+    AC_CHECK_LIB(c, getspnam, [have_getspnam=yes])
+    if test "$have_getspnam" = no ; then
+      AC_CHECK_LIB(gen, getspnam,
+                   [have_getspnam=yes; PASSWD_LIBS="$PASSWD_LIBS -lgen"])
+    fi
+  fi
+fi
+
+
+###############################################################################
+#
+#       Check for other libraries needed for non-shadow passwords.
+#
+###############################################################################
+
+if test "$enable_locking" = yes ; then
+
+  # On some systems (UnixWare 2.1), crypt() is in -lcrypt instead of -lc.
+  have_crypt=no
+  AC_CHECK_LIB(c, crypt, [have_crypt=yes])
+  if test "$have_crypt" = no ; then
+    AC_CHECK_LIB(crypt, crypt,
+                 [have_crypt=yes; PASSWD_LIBS="$PASSWD_LIBS -lcrypt"])
+  fi
+fi
+
+
+# Most of the above shadow mechanisms will have set need_setuid to yes,
+# if they were found.  But, on some systems, we need setuid even when
+# using plain old vanilla passwords.
+#
+if test "$enable_locking" = yes ; then
+  case "$host" in
+    *-hpux* | *-aix* | *-netbsd* | *-freebsd* | *-openbsd* )
+      need_setuid=yes
+    ;;
+  esac
+fi
+
+
+if test "$have_shadow_adjunct" = yes ; then
+  AC_DEFINE(HAVE_ADJUNCT_PASSWD)
+elif test "$have_shadow_enhanced" = yes ; then
+  AC_DEFINE(HAVE_ENHANCED_PASSWD)
+elif test "$have_shadow_hpux" = yes ; then
+  AC_DEFINE(HAVE_HPUX_PASSWD)
+elif test "$have_shadow" = yes ; then
+  AC_DEFINE(HAVE_SHADOW_PASSWD)
+fi
+
+
+###############################################################################
+#
+#       Check for -lXm.
+#
+###############################################################################
+
+have_motif=no
+with_motif_req=unspecified
+AC_ARG_WITH(motif,[
+User interface options:
+
+  --with-motif            Use the Motif toolkit for the user interface.],
+  [with_motif="$withval"; with_motif_req="$withval"],[with_motif=yes])
+
+HANDLE_X_PATH_ARG(with_motif, --with-motif, Motif)
+
+if test "$with_motif" != yes -a "$with_motif" != no ; then
+  echo "error: must be yes or no: --with-motif=$with_motif"
+  exit 1
+fi
+
+if test "$with_motif" = yes; then
+  have_motif=no
+  AC_CHECK_X_HEADER(Xm/Xm.h,
+                    [have_motif=yes
+                     AC_DEFINE(HAVE_MOTIF)
+                     MOTIF_LIBS="$MOTIF_LIBS -lXm"])
+fi
+
+
+###############################################################################
+#
+#       Check for -lgtk.
+#
+###############################################################################
+
+have_gtk=no
+with_gtk_req=unspecified
+AC_ARG_WITH(gtk,
+[  --with-gtk              Use the Gtk toolkit for the user interface.],
+  [with_gtk="$withval"; with_gtk_req="$withval"],[with_gtk=yes])
+
+# if --with-gtk=/directory/ was specified, remember that directory so that
+# we can also look for the `gtk-config' program in that directory.
+case "$with_gtk" in
+  /*)
+    gtk_dir="$with_gtk"
+    ;;
+  *)
+    gtk_dir=""
+    ;;
+esac
+
+HANDLE_X_PATH_ARG(with_gtk, --with-gtk, Gtk)
+
+if test "$with_gtk" != yes -a "$with_gtk" != no ; then
+  echo "error: must be yes or no: --with-gtk=$with_gtk"
+  exit 1
+fi
+
+jurassic_gtk=no
+if test "$with_gtk" = yes; then
+  have_gtk=no
+  
+  # if the user specified --with-gtk=/foo/ then look in /foo/bin/
+  # for glib-config and gtk-config.
+  #
+  gtk_path="$PATH"
+
+  if test ! -z "$gtk_dir"; then
+    # canonicalize slashes.
+    gtk_dir=`echo "${gtk_dir}/bin" | sed 's@//*@/@g'`
+    gtk_path="$gtk_dir:$gtk_dir:$gtk_path"
+  fi
+
+  AC_PATH_PROGS(glib_config, glib-config,, $gtk_path)
+  AC_PATH_PROGS(gtk_config,  gtk-config,,  $gtk_path)
+
+  if test -n "$glib_config" -a  -n "gtk_config" ; then
+    have_gtk=yes
+  fi
+  if test "$have_gtk" = yes; then
+    AC_CACHE_CHECK([Gtk version number], ac_cv_gtk_version_string,
+                   [ac_cv_gtk_version_string=`$glib_config --version`])
+    ac_gtk_version_string=$ac_cv_gtk_version_string
+    # M4 sucks!!
+    changequote(X,Y)
+    maj=`echo $ac_gtk_version_string | sed -n 's/\..*//p'`
+    min=`echo $ac_gtk_version_string | sed -n 's/[^.]*\.\([^.]*\).*/\1/p'`
+    changequote([,])
+    ac_gtk_version=`echo "$maj * 1000 + $min" | bc`
+    if test -z "$ac_gtk_version"; then
+      ac_gtk_version=unknown
+      ac_gtk_version_string=unknown
+    fi
+    if test "$ac_gtk_version" = "unknown" || test "$ac_gtk_version" -lt 1002
+    then
+      have_gtk=no
+      jurassic_gtk=yes
+    fi
+  fi
+  if test "$have_gtk" = yes; then
+    AC_CACHE_CHECK([for Gtk includes], ac_cv_gtk_config_cflags,
+                   [ac_cv_gtk_config_cflags=`$gtk_config --cflags`])
+    AC_CACHE_CHECK([for Gtk libs], ac_cv_gtk_config_libs,
+                   [ac_cv_gtk_config_libs=`$gtk_config --libs`])
+    INCLUDES="$INCLUDES $ac_cv_gtk_config_cflags"
+    GTK_LIBS="$GTK_LIBS $ac_cv_gtk_config_libs"
+    AC_DEFINE(HAVE_GTK)
+  fi
+fi
+
+
+###############################################################################
+#
+#       Check for -lXaw and -lXaw3d.
+#
+###############################################################################
+
+have_athena=no
+have_athena3d=no
+with_athena_req=unspecified
+AC_ARG_WITH(athena,
+[  --with-athena           Use the Athena toolkit for the user interface.],
+  [with_athena="$withval"; with_athena_req="$withval"],[with_athena=yes])
+
+HANDLE_X_PATH_ARG(with_athena, --with-athena, Athena)
+
+
+if test "$with_athena" != yes -a "$with_athena" != no ; then
+  echo "error: must be yes or no: --with-athena=$with_athena"
+  exit 1
+fi
+
+
+if test "$with_athena" = yes; then
+  have_athena=no
+  AC_CHECK_X_HEADER(X11/Xaw/Dialog.h, [have_athena=yes])
+  if test "$have_athena" = yes; then
+    AC_CHECK_X_LIB(Xaw3d, Xaw3dComputeTopShadowRGB,
+                  [have_athena=yes; have_athena3d=yes], [true],
+                  -lXt -lXmu -lXext -lX11)
+  fi
+fi
+
+if test "$have_athena" = yes; then
+  AC_DEFINE(HAVE_ATHENA)
+  ATHENA_LIBS="-lXaw $ATHENA_LIBS"
+fi
+
+if test "$have_athena3d" = yes; then
+  ATHENA3D_LIBS="-lXaw3d $ATHENA3D_LIBS"
+fi
+
+
+# If we have Athena, check whether it's a version that includes
+# XawViewportSetCoordinates in Viewport.h (R3 (or R4?) don't.)
+if test "$have_athena" = yes ; then
+  AC_CACHE_CHECK([for XawViewportSetCoordinates in Viewport.h], 
+                 ac_cv_have_XawViewportSetCoordinates,
+                 [ac_cv_have_XawViewportSetCoordinates=no
+                  AC_EGREP_X_HEADER(XawViewportSetCoordinates, 
+                                    X11/Xaw/Viewport.h,
+                                    ac_cv_have_XawViewportSetCoordinates=yes)])
+  if test "$ac_cv_have_XawViewportSetCoordinates" = yes ; then
+    AC_DEFINE(HAVE_XawViewportSetCoordinates)
+  fi
+fi
+
+
+###############################################################################
+#
+#       Checking whether Motif is really Lesstif.
+#
+###############################################################################
+
+have_lesstif=no
+if test "$have_motif" = yes ; then
+  AC_CACHE_CHECK([whether Motif is really LessTif], 
+                 ac_cv_have_lesstif,
+                 [AC_TRY_X_COMPILE([#include <Xm/Xm.h>],
+                                   [long vers = LesstifVersion;],
+                                   [ac_cv_have_lesstif=yes],
+                                   [ac_cv_have_lesstif=no])])
+  have_lesstif=$ac_cv_have_lesstif
+fi
+
+
+lesstif_version=unknown
+lesstif_version_string=unknown
+
+if test "$have_lesstif" = yes ; then
+  ltv=unknown
+  echo unknown > conftest-lt
+  AC_CACHE_CHECK([LessTif version number],
+                 ac_cv_lesstif_version_string,
+      [AC_TRY_X_RUN([#include <stdio.h>
+                     #include <Xm/Xm.h>
+                     int main() {
+                       FILE *f = fopen("conftest-lt", "w");
+                       if (!f) exit(1);
+                       fprintf(f, "%d %d.%d\n", LesstifVersion,
+                          LESSTIF_VERSION, LESSTIF_REVISION);
+                       fclose(f);
+                       exit(0);
+                     }],
+                    [ltv=`cat conftest-lt`
+                     ac_cv_lesstif_version=`echo $ltv | sed 's/ .*//'`
+                     ac_cv_lesstif_version_string=`echo $ltv | sed 's/.* //'`],
+                    [ac_cv_lesstif_version=unknown
+                     ac_cv_lesstif_version_string=unknown],
+                    [ac_cv_lesstif_version=unknown
+                     ac_cv_lesstif_version_string=unknown])])
+  rm -f conftest-lt
+  lesstif_version=$ac_cv_lesstif_version
+  lesstif_version_string=$ac_cv_lesstif_version_string
+
+fi
+
+
+if test "$have_motif" = yes ; then
+  mtv=unknown
+  echo unknown > conftest-mt
+  AC_CACHE_CHECK([Motif version number],
+                 ac_cv_motif_version_string,
+      [AC_TRY_X_RUN([#include <stdio.h>
+                     #include <Xm/Xm.h>
+                     int main() {
+                       FILE *f = fopen("conftest-mt", "w");
+                       if (!f) exit(1);
+                       fprintf(f, "%d %d.%d\n", XmVersion,
+                          XmVERSION, XmREVISION);
+                       fclose(f);
+                       exit(0);
+                     }],
+                    [mtv=`cat conftest-mt`
+                     ac_cv_motif_version=`echo $mtv | sed 's/ .*//'`
+                     ac_cv_motif_version_string=`echo $mtv | sed 's/.* //'`],
+                    [ac_cv_motif_version=unknown
+                     ac_cv_motif_version_string=unknown],
+                    [ac_cv_motif_version=unknown
+                     ac_cv_motif_version_string=unknown])])
+  rm -f conftest-mt
+  motif_version=$ac_cv_motif_version
+  motif_version_string=$ac_cv_motif_version_string
+
+fi
+
+
+###############################################################################
+#
+#       Checking whether Motif requires -lXpm.
+#
+#       If this is Motif 2.x, and we have XPM, then link against XPM as well.
+#       The deal is, Motif 2.x requires XPM -- but it's a compilation option
+#       of the library whether to build the XPM code into libXm, or whether
+#       to rely on an external libXm.  So the only way to tell whether XPM is
+#       a link-time requirement is to examine libXm.a, which is very
+#       difficult to do in an autoconf script.  So... if it's Motif 2.x, we
+#       always link against XPM if the XPM lib exists (and this will be a
+#       no-op if libXm happens to already have the XPM code in it.)
+#
+###############################################################################
+
+motif_requires_xpm=no
+if test "$have_motif" = yes ; then
+   AC_MSG_CHECKING(whether Motif requires XPM)
+   if test "$motif_version" = "unknown" || test "$motif_version" -ge 2000
+   then
+     motif_requires_xpm=yes
+     AC_MSG_RESULT(maybe)
+   else
+     AC_MSG_RESULT(no)
+   fi
+fi
+
+
+###############################################################################
+#
+#       Checking whether Motif requires -lXp.
+#
+#       Some versions of Motif (2.1.0, at least) require -lXp, the "X Printing
+#       Extension".   Why this extension isn't in -lXext with all the others,
+#       I have no idea.
+#
+###############################################################################
+
+have_xp_ext=no
+if test "$have_motif" = yes ; then
+   have_xp_ext=no
+   AC_CHECK_X_LIB(Xp, XpQueryExtension,
+                  [have_xp_ext=yes; MOTIF_LIBS="$MOTIF_LIBS -lXp"],
+                  [true], -lX11 -lXext -lm)
+fi
+
+
+###############################################################################
+#
+#       Checking whether Motif requires -lXintl (for _Xsetlocale.)
+#
+###############################################################################
+
+have_xintl=no
+if test "$have_motif" = yes ; then
+  AC_CHECK_X_LIB(Xintl, _Xsetlocale, [have_xintl=yes], [have_xintl=no],
+                 -lX11 -lXext -lm)
+  if test "$have_xintl" = yes; then
+    MOTIF_LIBS="$MOTIF_LIBS -lXintl"
+  fi
+fi
+
+
+###############################################################################
+#
+#       Check for -lGL or -lMesa.
+#
+###############################################################################
+
+have_gl=no
+ac_have_mesa_gl=no
+with_gl_req=unspecified
+AC_ARG_WITH(gl,[
+Graphics options:
+
+  --with-gl               Build those demos which depend on OpenGL.],
+  [with_gl="$withval"; with_gl_req="$withval"],[with_gl=yes])
+
+HANDLE_X_PATH_ARG(with_gl, --with-gl, GL)
+
+ac_mesagl_version=unknown
+ac_mesagl_version_string=unknown
+
+if test "$with_gl" = yes; then
+  AC_CHECK_X_HEADER(GL/gl.h, have_gl=yes, have_gl=no)
+  if test "$have_gl" = yes ; then
+    AC_CHECK_X_HEADER(GL/glx.h, have_gl=yes, have_gl=no)
+  fi
+
+  # If we have the headers, try and figure out which vendor it's from.
+  #
+  if test "$have_gl" = yes ; then
+
+    AC_DEFINE(HAVE_GL)
+
+    # We need to know whether it's MesaGL so that we know which libraries
+    # to link against.
+    #
+    AC_CACHE_CHECK([whether GL is really MesaGL], ac_cv_have_mesa_gl,
+      [ac_cv_have_mesa_gl=no
+       AC_EGREP_X_HEADER(Mesa, GL/glx.h, [ac_cv_have_mesa_gl=yes])
+      ])
+    ac_have_mesa_gl=$ac_cv_have_mesa_gl
+    if test "$ac_have_mesa_gl" = no ; then
+      gl_lib_1="GL"
+      GL_LIBS="-lGL -lGLU"
+    else
+      AC_DEFINE(HAVE_MESA_GL)
+      gl_lib_1="MesaGL"
+      GL_LIBS="-lMesaGL -lMesaGLU"
+    fi
+
+
+    # If it's MesaGL, we'd like to issue a warning if the version number
+    # is less than or equal to 2.6, because that version had a security bug.
+    #
+    if test "$ac_have_mesa_gl" = yes; then
+
+      AC_CACHE_CHECK([MesaGL version number], ac_cv_mesagl_version_string,
+        [cat > conftest.$ac_ext <<EOF
+#line __oline__ "configure"
+#include "confdefs.h"
+#include <GL/gl.h>
+configure: MESA_MAJOR_VERSION MESA_MINOR_VERSION
+EOF
+
+         ac_save_CPPFLAGS="$CPPFLAGS"
+         if test \! -z "$includedir" ; then 
+           CPPFLAGS="$CPPFLAGS -I$includedir"
+         fi
+         CPPFLAGS="$CPPFLAGS $X_CFLAGS"
+
+          # M4 sucks!!
+         changequote(X,Y)
+         mglv=`(eval "$ac_cpp conftest.$ac_ext") 2>&AC_FD_CC | sed -n \
+              's/^configure:.*\([0-9][0-9]*\).*\([0-9][0-9]*\).*$/\1.\2/p'`
+         changequote([,])
+
+         rm -f conftest.$ac_ext
+
+         CPPFLAGS="$ac_save_CPPFLAGS"
+
+         if test "$mglv" = ""; then
+           ac_mesagl_version=unknown
+           ac_mesagl_version_string=unknown
+         else
+           ac_mesagl_version_string=$mglv
+           maj=`echo $mglv | sed -n 's/\..*//p'`
+           min=`echo $mglv | sed -n 's/.*\.//p'`
+           ac_mesagl_version=`echo "$maj * 1000 + $min" | bc`
+           if test -z "$ac_mesagl_version"; then
+             ac_mesagl_version=unknown
+             ac_mesagl_version_string=unknown
+           fi
+         fi
+         ac_cv_mesagl_version=$ac_mesagl_version
+         ac_cv_mesagl_version_string=$ac_mesagl_version_string
+      ])
+      ac_mesagl_version=$ac_cv_mesagl_version
+      ac_mesagl_version_string=$ac_cv_mesagl_version_string
+    fi
+
+
+    # If it's MesaGL, check to see if it requires -lpthread.
+    #
+    have_pthread=no
+    mesa_requires_pthread=no
+    if test "$ac_have_mesa_gl" = yes; then
+
+      AC_CHECK_LIB(pthread, pthread_create, [have_pthread=yes], [],)
+      if test "$have_pthread" = yes; then
+        AC_CHECK_X_LIB($gl_lib_1, gl_get_thread_context,
+                       [mesa_requires_pthread=yes], [true],
+                       $GL_LIBS -lpthread -lX11 -lXext -lm)
+      fi
+
+      if test "$mesa_requires_pthread" = yes; then
+        GL_LIBS="$GL_LIBS -lpthread"
+      fi
+    fi
+
+    # Check for OpenGL 1.1 features.
+    #
+    AC_CHECK_X_LIB($gl_lib_1, glBindTexture, [AC_DEFINE(HAVE_GLBINDTEXTURE)],
+                   [true], $GL_LIBS -lX11 -lXext -lm)
+
+
+    # Check whether the `xscreensaver' executable should link against GL.
+    # See comments in utils/visual-gl.c for why this is sometimes necessary.
+    #
+    AC_MSG_CHECKING(whether drastic GL measures must be taken)
+    case "$host" in
+      *-sgi*)
+        AC_MSG_RESULT([yes -- hello, SGI.])
+        AC_DEFINE(DAEMON_USE_GL)
+        SAVER_GL_SRCS='$(UTILS_SRC)/visual-gl.c'
+        SAVER_GL_OBJS='$(UTILS_BIN)/visual-gl.o'
+        SAVER_GL_LIBS="$GL_LIBS"
+      ;;
+      *)
+        AC_MSG_RESULT([no -- non-SGI.])
+        SAVER_GL_SRCS=''
+        SAVER_GL_OBJS=''
+        SAVER_GL_LIBS=''
+      ;;
+    esac
+
+  fi
+
+elif test "$with_gl" != no; then
+  echo "error: must be yes or no: --with-gl=$with_gl"
+  exit 1
+fi
+
+
+###############################################################################
+#
+#       Check for -lXpm.
+#
+###############################################################################
+
+have_xpm=no
+with_xpm_req=unspecified
+AC_ARG_WITH(xpm,
+[  --with-xpm              Include support for XPM files in some demos.],
+  [with_xpm="$withval"; with_xpm_req="$withval"],[with_xpm=yes])
+
+HANDLE_X_PATH_ARG(with_xpm, --with-xpm, XPM)
+
+if test "$with_xpm" = yes; then
+  AC_CHECK_X_HEADER(X11/xpm.h,
+                   [have_xpm=yes
+                    AC_DEFINE(HAVE_XPM)
+                    XPM_LIBS="-lXpm"])
+elif test "$with_xpm" != no; then
+  echo "error: must be yes or no: --with-xpm=$with_xpm"
+  exit 1
+fi
+
+# See comment near $motif_requires_xpm, above.
+# Need to do this here, after both Motif and XPM have been checked for.
+#
+if test "$have_motif" = yes -a "$have_xpm" = yes ; then
+  if test "$motif_requires_xpm" = yes ; then
+    MOTIF_LIBS="$MOTIF_LIBS $XPM_LIBS"
+  fi
+fi
+
+
+###############################################################################
+#
+#       Check for the XSHM server extension.
+#
+###############################################################################
+
+have_xshm=no
+with_xshm_req=unspecified
+AC_ARG_WITH(xshm-ext,
+[  --with-xshm-ext         Include support for the XSHM extension.],
+  [with_xshm="$withval"; with_xshm_req="$withval"],[with_xshm=yes])
+
+HANDLE_X_PATH_ARG(with_xshm, --with-xshm-ext, XSHM)
+
+if test "$with_xshm" = yes; then
+
+  # first check for Xshm.h.
+  AC_CHECK_X_HEADER(X11/extensions/XShm.h, [have_xshm=yes])
+
+  # if that succeeded, then check for sys/ipc.h.
+  if test "$have_xshm" = yes; then
+    have_xshm=no
+    AC_CHECK_X_HEADER(sys/ipc.h, [have_xshm=yes])
+  fi
+
+  # if that succeeded, then check for sys/shm.h.
+  if test "$have_xshm" = yes; then
+    have_xshm=no
+    AC_CHECK_X_HEADER(sys/shm.h, [have_xshm=yes])
+  fi
+
+  # AIX is pathological, as usual: apparently it's normal for the Xshm headers
+  # to exist, but the library code to not exist.  And even better, the library
+  # code is in its own library: libXextSam.a.  So, if we're on AIX, and that
+  # lib doesn't exist, give up.  (This lib gets added to X_EXTRA_LIBS, and
+  # that's not quite right, but close enough.)
+  #
+  case "$host" in
+    *-aix*)
+      have_xshm=no
+      AC_CHECK_X_LIB(XextSam, XShmQueryExtension,
+                     [have_xshm=yes; X_EXTRA_LIBS="$X_EXTRA_LIBS -lXextSam"],
+                     [true], -lX11 -lXext -lm)
+    ;;
+  esac
+
+  # if that succeeded, then we've really got it.
+  if test "$have_xshm" = yes; then
+    AC_DEFINE(HAVE_XSHM_EXTENSION)
+  fi
+
+elif test "$with_xshm" != no; then
+  echo "error: must be yes or no: --with-xshm-ext=$with_xshm"
+  exit 1
+fi
+
+
+###############################################################################
+#
+#       Check for the DOUBLE-BUFFER server extension.
+#
+###############################################################################
+
+have_xdbe=no
+with_xdbe_req=unspecified
+AC_ARG_WITH(xdbe-ext,
+[  --with-xdbe-ext         Include support for the DOUBLE-BUFFER extension.],
+  [with_xdbe="$withval"; with_xdbe_req="$withval"],[with_xdbe=yes])
+
+HANDLE_X_PATH_ARG(with_xdbe, --with-xdbe-ext, DOUBLE-BUFFER)
+
+if test "$with_xdbe" = yes; then
+
+  AC_CHECK_X_HEADER(X11/extensions/Xdbe.h, [have_xdbe=yes])
+  if test "$have_xdbe" = yes; then
+    AC_DEFINE(HAVE_DOUBLE_BUFFER_EXTENSION)    
+  fi
+
+elif test "$with_xdbe" != no; then
+  echo "error: must be yes or no: --with-xdbe-ext=$with_xshm"
+  exit 1
+fi
+
+
+###############################################################################
+#
+#       Check for the SGI XReadDisplay server extension.
+#
+#       Note: this has to be down here, rather than up with the other server
+#       extension tests, so that the output of `configure --help' is in the
+#       right order.  Arrgh!
+#
+###############################################################################
+
+have_readdisplay=no
+with_readdisplay_req=unspecified
+AC_ARG_WITH(readdisplay,
+[  --with-readdisplay      Include support for the XReadDisplay extension.],
+  [with_readdisplay="$withval"; with_readdisplay_req="$withval"],
+  [with_readdisplay=yes])
+
+HANDLE_X_PATH_ARG(with_readdisplay, --with-readdisplay, XReadDisplay)
+
+if test "$with_readdisplay" = yes; then
+  AC_CHECK_X_HEADER(X11/extensions/readdisplay.h,
+                    AC_DEFINE(HAVE_READ_DISPLAY_EXTENSION))
+elif test "$with_readdisplay" != no; then
+  echo "error: must be yes or no: --with-readdisplay=$with_readdisplay"
+  exit 1
+fi
+
+
+###############################################################################
+#
+#       Check for the SGI Iris Video Library.
+#
+###############################################################################
+
+have_sgivideo=no
+with_sgivideo_req=unspecified
+AC_ARG_WITH(sgivideo,
+[  --with-sgivideo         Include support for SGI's Iris Video Library.],
+  [with_sgivideo="$withval"; with_sgivideo_req="$withval"],
+  [with_sgivideo=yes])
+
+HANDLE_X_PATH_ARG(with_sgivideo, --with-sgivideo, Iris Video)
+
+if test "$with_sgivideo" = yes; then
+  AC_CHECK_X_HEADER(dmedia/vl.h, have_sgivideo=yes)
+  if test "$have_sgivideo" = yes; then
+    have_sgivideo=no
+    AC_CHECK_LIB(vl, vlOpenVideo, [have_sgivideo=yes])
+    if test "$have_sgivideo" = yes; then
+      SGI_VIDEO_OBJS="$(UTILS_BIN)/sgivideo.o"
+      SGI_VIDEO_LIBS="-lvl"
+      AC_DEFINE(HAVE_SGI_VIDEO)
+    fi
+  fi
+elif test "$with_sgivideo" != no; then
+  echo "error: must be yes or no: --with-sgivideo=$with_sgivideo"
+  exit 1
+fi
+
+
+###############################################################################
+#
+#       Check for a program to generate random text.
+#
+#       Zippy is funnier than the idiocy generally spat out by `fortune',
+#       so try to find that, by invoking Emacs and asking it where its 
+#       libexec directory is ("yow" lives in there.)
+#
+#       If that doesn't work, see if fortune, zippy, or yow are on $PATH,
+#       and if so, use them.
+#
+#       If that doesn't work, look in /usr/games, and if it's there, use
+#       the full pathname.
+#
+###############################################################################
+
+with_zippy_req=""
+AC_ARG_WITH(zippy,[
+  --with-zippy=PROGRAM    Some demos are able to run an external program and
+                          display its text; this names the program to use by
+                          default (though it can be overridden with X
+                          resources.)  If you don't specify this, the default
+                          is to use \"yow\" from the Emacs distribution (if you
+                          have it) or else to use \"fortune\".
+],
+  [with_zippy_req="$withval"; with_zippy="$withval"],[with_zippy=yes])
+
+if test "$with_zippy" = no || test "$with_zippy" = yes ; then
+  with_zippy=""
+  with_zippy_req=""
+fi
+
+if test -n "$with_zippy_req" ; then
+  ac_cv_zippy_program=""
+  case "$with_zippy_req" in
+    /*)
+      AC_MSG_CHECKING([for $with_zippy_req])
+      if test -x "$with_zippy_req" ; then
+        AC_MSG_RESULT(yes)
+      else
+        AC_MSG_RESULT(no)
+        with_zippy=""
+      fi
+    ;;
+    *)
+      # don't cache
+      unset ac_cv_path_zip2
+      AC_PATH_PROG(zip2, $with_zippy_req, [])
+      if test "$zip2" = ""; then
+        with_zippy=""
+      fi
+    ;;
+  esac
+  ac_cv_zippy_program="$with_zippy"
+
+elif test -n "$ac_cv_zippy_program"; then
+  AC_MSG_RESULT([checking for zippy... (cached) $ac_cv_zippy_program])
+fi
+
+if test ! -n "$ac_cv_zippy_program"; then
+
+  AC_CHECK_PROGS(emacs_exe, emacs)
+  AC_CHECK_PROGS(xemacs_exe, xemacs)
+
+  ac_cv_zippy_program=""
+  eargs='-batch -q -nw --eval'
+
+  if test -n "$emacs_exe" ; then
+    AC_MSG_CHECKING([for emacs yow])
+    #
+    # get emacs to tell us where the libexec directory is.
+    #
+    dir=`$emacs_exe $eargs '(princ (concat exec-directory "\n"))' \
+         2>/dev/null | tail -1`
+    dir=`echo "$dir" | sed 's@///*@/@g;s@/$@@'`
+    #
+    # try running libexec/yow and see if it exits without error.
+    #
+    if test x"$dir" != x -a -x "$dir/yow" ; then
+      if $dir/yow >&- 2>&- ; then
+        ac_cv_zippy_program="$dir/yow"
+        AC_MSG_RESULT($ac_cv_zippy_program)
+      else
+        AC_MSG_RESULT(no)
+      fi
+    fi
+  fi
+
+  if test -z "$ac_cv_zippy_program" ; then
+    AC_MSG_CHECKING([for xemacs yow])
+    if test -n "$xemacs_exe" ; then
+      #
+      # get xemacs to tell us where the libexec directory is.
+      #
+      dir=`$xemacs_exe $eargs '(princ (concat exec-directory "\n"))' \
+           2>/dev/null | tail -1`
+      dir=`echo "$dir" | sed 's@///*@/@g;s@/$@@'`
+      #
+      # try running libexec/yow and see if it exits without error.
+      #
+      if test x"$dir" != x -a -x "$dir/yow" ; then
+        if $dir/yow >&- 2>&- ; then
+          ac_cv_zippy_program="$dir/yow"
+          AC_MSG_RESULT($ac_cv_zippy_program)
+        else
+          #
+          # in some xemacs installations, the pathname of the yow.lines file
+          # isn't hardcoded into the yow executable, and must be passed on 
+          # the command line.  See if it's in libexec/../etc/.
+
+          # M4 sucks!!
+          changequote(X,Y)
+          dir_up=`echo "$dir" | sed 's@/[^/]*$@@'`
+          changequote([,])
+
+          yowlines="$dir_up/etc/yow.lines"
+          if $dir/yow -f $yowlines >&- 2>&- ; then
+            ac_cv_zippy_program="$dir/yow -f $yowlines"
+            AC_MSG_RESULT($ac_cv_zippy_program)
+          else
+            #
+            # In newer XEmacs releases, yow.lines is in a different place,
+            # and the easiest way to get it is by calling the new function
+            # `locate-data-file'.
+            #
+            yowlines=`$xemacs_exe $eargs \
+              '(princ (concat (locate-data-file "yow.lines") "\n"))' \
+              2>/dev/null | tail -1`
+            if $dir/yow -f $yowlines >&- 2>&- ; then
+              ac_cv_zippy_program="$dir/yow -f $yowlines"
+              AC_MSG_RESULT($ac_cv_zippy_program)
+            else
+              AC_MSG_RESULT(no)
+            fi
+          fi
+        fi
+      fi
+    fi
+  fi
+
+  # if that didn't work, try for some other programs...
+  if test -z "$ac_cv_zippy_program" ; then
+    fortune=''
+    AC_CHECK_PROGS(fortune, [fortune zippy yow])
+    # if that didn't work, try for those programs in /usr/games...
+    if test -z "$fortune" ; then
+      AC_PATH_PROGS(fortune, [fortune zippy yow], fortune,
+                    /usr/games:/usr/local/games:$PATH)
+    fi
+  fi
+fi
+
+if test -z "$ac_cv_zippy_program" ; then
+  ac_cv_zippy_program=fortune
+fi
+
+AC_DEFINE_UNQUOTED(ZIPPY_PROGRAM, "$ac_cv_zippy_program")
+
+
+###############################################################################
+#
+#       Done testing.  Now, set up the various -I and -L variables,
+#       and decide which GUI program to build by default.
+#
+###############################################################################
+
+DEPEND=makedepend
+DEPEND_FLAGS=
+DEPEND_DEFINES=
+
+
+if test \! -z "$includedir" ; then 
+  INCLUDES="$INCLUDES -I$includedir"
+fi
+
+if test \! -z "$libdir" ; then
+  LDFLAGS="$LDFLAGS -L$libdir"
+fi
+
+
+ALL_DEMO_PROGRAMS=
+if test "$have_athena3d" = yes; then
+  PREFERRED_DEMO_PROGRAM=xscreensaver-demo-Xaw3d
+  ALL_DEMO_PROGRAMS="$PREFERRED_DEMO_PROGRAM $ALL_DEMO_PROGRAMS"
+fi
+if test "$have_athena" = yes; then
+  PREFERRED_DEMO_PROGRAM=xscreensaver-demo-Xaw
+  ALL_DEMO_PROGRAMS="$PREFERRED_DEMO_PROGRAM $ALL_DEMO_PROGRAMS"
+fi
+if test "$have_gtk" = yes; then
+  PREFERRED_DEMO_PROGRAM=xscreensaver-demo-Gtk
+  ALL_DEMO_PROGRAMS="$PREFERRED_DEMO_PROGRAM $ALL_DEMO_PROGRAMS"
+fi
+if test "$have_motif" = yes; then
+  PREFERRED_DEMO_PROGRAM=xscreensaver-demo-Xm
+  ALL_DEMO_PROGRAMS="$PREFERRED_DEMO_PROGRAM $ALL_DEMO_PROGRAMS"
+fi
+
+
+if test "$have_kerberos" = yes; then
+  PASSWD_SRCS="$PASSWD_SRCS \$(KERBEROS_SRCS)"
+  PASSWD_OBJS="$PASSWD_OBJS \$(KERBEROS_OBJS)"
+fi
+if test "$have_pam" = yes; then
+  PASSWD_SRCS="$PASSWD_SRCS \$(PAM_SRCS)"
+  PASSWD_OBJS="$PASSWD_OBJS \$(PAM_OBJS)"
+  INSTALL_PAM="install-pam"
+fi
+  PASSWD_SRCS="$PASSWD_SRCS \$(PWENT_SRCS)"
+  PASSWD_OBJS="$PASSWD_OBJS \$(PWENT_OBJS)"
+
+
+if test "$enable_locking" = yes; then
+  LOCK_SRCS='$(LOCK_SRCS_1) $(PASSWD_SRCS)'
+  LOCK_OBJS='$(LOCK_OBJS_1) $(PASSWD_OBJS)'
+else
+  LOCK_SRCS=''
+  LOCK_OBJS=''
+fi
+
+if test "$need_setuid" = yes; then
+  NEED_SETUID=yes
+  INSTALL_SETUID='$(INSTALL) $(SUID_FLAGS)'
+else
+  NEED_SETUID=no
+  INSTALL_SETUID='$(INSTALL_PROGRAM)'
+fi
+
+tab='  '
+if test "$have_gl" = yes; then
+  GL_EXES='$(GL_EXES)'
+  GL_MEN='$(GL_MEN)'
+  GL_KLUDGE="${tab}  "
+else
+  GL_KLUDGE="  -${tab}  "
+fi
+
+
+###############################################################################
+#
+#       Perform substitutions and write Makefiles.
+#
+###############################################################################
+
+AC_SUBST(INCLUDES)
+
+AC_SUBST(PREFERRED_DEMO_PROGRAM)
+AC_SUBST(ALL_DEMO_PROGRAMS)
+AC_SUBST(SAVER_LIBS)
+AC_SUBST(MOTIF_LIBS)
+AC_SUBST(GTK_LIBS)
+AC_SUBST(ATHENA_LIBS)
+AC_SUBST(ATHENA3D_LIBS)
+AC_SUBST(HACK_LIBS)
+AC_SUBST(XPM_LIBS)
+AC_SUBST(GL_LIBS)
+AC_SUBST(PASSWD_LIBS)
+AC_SUBST(INSTALL_SETUID)
+AC_SUBST(INSTALL_DIRS)
+AC_SUBST(NEED_SETUID)
+AC_SUBST(INSTALL_PAM)
+AC_SUBST(SGI_VIDEO_OBJS)
+AC_SUBST(SGI_VIDEO_LIBS)
+
+AC_SUBST(PASSWD_SRCS)
+AC_SUBST(PASSWD_OBJS)
+AC_SUBST(XMU_SRCS)
+AC_SUBST(XMU_OBJS)
+AC_SUBST(SAVER_GL_SRCS)
+AC_SUBST(SAVER_GL_OBJS)
+AC_SUBST(SAVER_GL_LIBS)
+AC_SUBST(LOCK_SRCS)
+AC_SUBST(LOCK_OBJS)
+AC_SUBST(GL_EXES)
+AC_SUBST(GL_MEN)
+AC_SUBST(GL_KLUDGE)
+AC_SUBST(HACKDIR)
+
+APPDEFAULTS=$ac_x_app_defaults
+AC_SUBST(APPDEFAULTS)
+
+AC_SUBST(DEPEND)
+AC_SUBST(DEPEND_FLAGS)
+AC_SUBST(DEPEND_DEFINES)
+AC_SUBST(PERL)
+
+AC_OUTPUT(Makefile
+          utils/Makefile
+          driver/Makefile
+          hacks/Makefile
+          hacks/glx/Makefile
+          driver/XScreenSaver.ad)
+
+###############################################################################
+#
+#       Print some warnings at the end.
+#
+###############################################################################
+
+warn_prefix_1="    Warning:"
+warn_prefix_2="       Note:"
+warn_prefix="$warn_prefix_1"
+
+warning=no
+warnsep='    #################################################################'
+
+warnpre() {
+  if test "$warning" = no ; then
+    echo '' ; echo "$warnsep" ; echo ''
+    warning=yes
+  fi
+}
+
+warn() {
+  warnpre
+  if test "$warning" = long ; then echo '' ; fi
+  warning=yes
+  echo "$warn_prefix $@"
+}
+
+warnL() {
+  was=$warning
+  warnpre
+  warning=yes
+  if test "$was" != no ; then echo '' ; fi
+  echo "$warn_prefix $@"
+}
+
+warn2() {
+  echo "             $@"
+  warning=long
+}
+
+note() {
+  warn_prefix="$warn_prefix_2"
+  warn $@
+  warn_prefix="$warn_prefix_1"
+}
+
+noteL() {
+  warn_prefix="$warn_prefix_2"
+  warnL $@
+  warn_prefix="$warn_prefix_1"
+}
+
+
+if test "$with_sgi_req" = yes -a "$have_sgi" = no ; then
+  warn 'The SGI saver extension was requested, but was not found.'
+fi
+
+if test "$with_mit_req" = yes -a "$have_mit" = no ; then
+  warn 'The MIT saver extension was requested, but was not found.'
+fi
+
+if test "$with_xidle_req" = yes -a "$have_xidle" = no ; then
+  warn 'The XIdle extension was requested, but was not found.'
+fi
+
+if test "$with_xshm_req" = yes -a "$have_xshm" = no ; then
+  warn 'The XSHM extension was requested, but was not found.'
+fi
+
+if test "$with_xdbe_req" = yes -a "$have_xdbe" = no ; then
+  warn 'The DOUBLE-BUFFER extension was requested, but was not found.'
+fi
+
+if test "$with_sgivc_req" = yes -a "$have_sgivc" = no ; then
+  warn 'The SGI-VIDEO-CONTROL extension was requested, but was not found.'
+fi
+
+if test "$with_dpms_req" = yes -a "$have_dpms" = no ; then
+  warn 'The DPMS extension was requested, but was not found.'
+fi
+
+if test "$with_xf86vmode_req" = yes -a "$have_xf86vmode" = no ; then
+  warn 'The XF86VMODE extension was requested, but was not found.'
+fi
+
+if test "$with_proc_interrupts_req" = yes -a "$have_proc_interrupts" = no; then
+  warn "Checking of /proc/interrupts was requested, but it's bogus."
+fi
+
+
+if test "$have_motif" = no -a "$have_gtk" = no -a "$have_athena" = no ; then
+  warnL "None of Motif, Gtk, or Athena widgets seem to be available;"
+  warn2 "the \`xscreensaver-demo' program requires one of these."
+
+elif test "$with_motif_req" = yes -a "$have_motif" = no ; then
+  warnL "Use of Motif was requested, but it wasn't found;"
+  if test "$have_gtk" = yes; then
+    warn2 "Gtk will be used instead."
+  else
+    warn2 "Athena will be used instead."
+  fi
+
+elif test "$jurassic_gtk" = yes ; then
+
+  pref_gtk=1.2
+
+  v="$ac_gtk_version_string"
+  if test "$with_gtk_req" = yes -a "$ac_gtk_version" = "unknown" ; then
+    warnL "Use of Gtk was requested, but its version number is unknown;"
+  elif test "$with_gtk_req" = yes ; then
+    warnL "Use of Gtk was requested, but it is version $v;"
+  else
+    warnL "Gtk was found on this system, but it is version $v;"
+  fi
+
+  if test "$have_motif" = yes; then
+    which="Motif"
+  else
+    which="Athena"
+  fi
+
+  warn2 "Gtk $pref_gtk or newer is required.  $which will be used instead."
+
+elif test "$with_gtk_req" = yes -a "$have_gtk" = no ; then
+  warnL "Use of Gtk was requested, but it wasn't found;"
+  if test "$have_motif" = yes; then
+    warn2 "Motif will be used instead."
+  else
+    warn2 "Athena will be used instead."
+  fi
+
+elif test "$with_athena_req" = yes -a "$have_athena" = no ; then
+  warnL "Use of Athena was requested, but it wasn't found;"
+  if test "$have_gtk" = yes; then
+    warn2 "Gtk will be used instead."
+  else
+    warn2 "Motif will be used instead."
+  fi
+fi
+
+
+if test "$have_motif" = yes -a "$have_lesstif" = yes ; then
+
+  preferred_lesstif=0.86
+
+  if test "$lesstif_version" = unknown; then
+    warnL "Unable to determine the LessTif version number!"
+    warn2 "Make sure you are using version $preferred_lesstif or newer."
+    warn2 "See <http://www.lesstif.org/>."
+
+  elif test \! $lesstif_version -gt 82; then
+    warnL "LessTif version $lesstif_version_string is being used."
+    warn2 "LessTif versions 0.82 and earlier are too buggy to"
+    warn2 "use with XScreenSaver; it is strongly recommended"
+    warn2 "that you upgrade to at least version $preferred_lesstif!"
+    warn2 "See <http://www.lesstif.org/>."
+  fi
+fi
+
+if test "$have_athena" = yes -a "$have_motif" = no -a "$have_gtk" = no; then
+    warnL "Athena widgets are being used instead of Motif or Gtk."
+    warn2 "The \`xscreensaver-demo' program looks much better"
+    warn2 "with Motif or Gtk.  Wouldn't you rather be using Motif?"
+    warn2 "Motif is shipped by every commercial Unix vendor,"
+    warn2 "and there is a free implementation available as"
+    warn2 "well: see <http://www.lesstif.org/>.  Gtk is shipped"
+    warn2 "with most Linux and BSD distributions."
+fi
+
+
+if test "$have_xpm" = no ; then
+  if test "$with_xpm_req" = yes ; then
+    warnL 'Use of XPM was requested, but it was not found.'
+  elif test "$with_xpm_req" = no ; then
+    noteL 'The XPM library is not being used.'
+  else
+    noteL 'The XPM library was not found.'
+  fi
+
+  echo ''
+  warn2 'Some of the demos will not be as colorful as they'
+  warn2 'could be.  You might want to consider installing XPM'
+  warn2 'and re-running configure.  (Remember to delete the'
+  warn2 'config.cache file first.)  You can find XPM at most'
+  warn2 'X11 archive sites, such as <http://sunsite.unc.edu/>.'
+fi
+
+
+if test "$have_gl" = yes -a "$ac_have_mesa_gl" = yes ; then
+  preferred_mesagl=3.0
+
+  if test "$ac_mesagl_version" = unknown; then
+    warnL "Unable to determine the MesaGL version number!"
+    warn2 "Make sure you are using version $preferred_mesagl or newer."
+
+  elif test \! "$ac_mesagl_version" -gt 2006; then
+    warnL "MesaGL version $ac_mesagl_version_string is being used."
+    warn2 "MesaGL versions 2.6 and earlier have a security bug."
+    warn2 "It is strongly recommended that you upgrade to at"
+    warn2 "least version $preferred_mesagl."
+  fi
+fi
+
+
+if test "$have_gl" = no ; then
+  if test "$with_gl_req" = yes ; then
+    warnL 'Use of GL was requested, but it was not found.'
+  elif test "$with_gl_req" = no ; then
+    noteL 'The OpenGL 3D library is not being used.'
+  else
+    noteL 'The OpenGL 3D library was not found.'
+  fi
+
+  echo ''
+  warn2 'Those demos which use 3D will not be built or installed.'
+  warn2 'You might want to consider installing OpenGL and'
+  warn2 're-running configure.  (Remember to delete the'
+  warn2 "config.cache file first.)  If your vendor doesn't ship"
+  warn2 'their own implementation of OpenGL, you can get a free'
+  warn2 'version at <http://www.mesa3d.org/>.  For general OpenGL'
+  warn2 'info, see <http://www.opengl.org/>.'
+
+fi
+
+if test "$with_readdisplay_req" = yes -a "$have_readdisplay" = no ; then
+  warn 'Use of XReadDisplay was requested, but it was not found.'
+fi
+
+if test "$with_sgivideo_req" = yes -a "$have_sgivideo" = no ; then
+  warn 'Use of the Iris Video Library was requested, but it was not found.'
+fi
+
+if test -n "$with_zippy_req"; then
+  if test "$with_zippy_req" != "$ac_cv_zippy_program" ; then
+    warnL "$with_zippy_req was requested as the Zippy program,"
+    warn2 "but was not found.  The default will be used instead."
+  fi
+fi
+
+if test "$with_kerberos_req" = yes -a "$have_kerberos" = no ; then
+  warn 'Use of Kerberos was requested, but it was not found.'
+fi
+
+if test "$with_pam_req" = yes -a "$have_pam" = no ; then
+  warn 'Use of PAM was requested, but it was not found.'
+fi
+
+if test "$with_shadow_req" = yes -a "$have_shadow" = no ; then
+  warn 'Use of shadow passwords was requested, but they were not found.'
+fi
+
+
+# You are in a twisty maze of namespaces and syntaxes, all alike.
+# Fuck the skull of Unix.
+#
+eval bindir=${bindir}
+eval bindir=${bindir}
+eval bindir=${bindir}
+eval bindir=${bindir}
+eval bindir=${bindir}
+eval bindir=${bindir}
+eval HACKDIR=${HACKDIR}
+eval HACKDIR=${HACKDIR}
+eval HACKDIR=${HACKDIR}
+eval HACKDIR=${HACKDIR}
+eval HACKDIR=${HACKDIR}
+eval HACKDIR=${HACKDIR}
+
+# canonicalize slashes.
+bindir=`echo  "${bindir}"  | sed 's@/$@@;s@//*@/@g'`
+HACKDIR=`echo "${HACKDIR}" | sed 's@/$@@;s@//*@/@g'`
+
+
+# Sanity check the subdir
+for bad_choice in xscreensaver xscreensaver-demo xscreensaver-command ; do
+  if test "${HACKDIR}" = "${bindir}/${bad_choice}" ; then
+    echo ""
+    AC_MSG_ERROR([\"--enable-subdir=${bindir}/${bad_choice}\" won't work.
+                   There will be an executable installed with that name, so
+                   that can't be the name of a directory as well.  Please
+                   re-configure with a different directory name.])
+  fi
+done
+
+
+do_dir_warning=no
+
+# Now let's see if there's a previous RPM version already installed.  Blargh!
+
+# M4 sucks!!
+changequote(X,Y)
+rpmv=`(rpm -qv xscreensaver) 2>&- | \
+      sed 's/^xscreensaver-\([0-9][0-9]*[.][0-9][0-9]*\)-[0-9][0-9]*$/\1/'`
+changequote([,])
+
+if test \! -z "$rpmv" ; then
+  rpmbdir=`rpm -ql xscreensaver | sed -n 's@^\(.*\)/xscreensaver-demo$@\1@p'`
+  rpmhdir=`rpm -ql xscreensaver | sed -n 's@^\(.*\)/attraction$@\1@p'`
+
+  warning=no
+  warnL "There is already an installed RPM of xscreensaver $rpmv"
+  warn2 "on this system.  You might want to remove it (with"
+  warn2 '"rpm -ve xscreensaver") before running "make install"'
+  warn2 "from this directory."
+  echo ""
+  warn2 "Alternately, you could build this version of xscreensaver"
+  warn2 'as an RPM, and then install that.  An "xscreensaver.spec"'
+  warn2 "file is included.  See the RPM documentation for more info."
+  echo ""
+
+  if test "$rpmbdir" = "$rpmhdir" ; then
+    warn2 "The RPM version was installed in $rpmbdir."
+  else
+    warn2 "The RPM version was installed in $rpmbdir,"
+    warn2 "with demos in $rpmhdir."
+  fi
+
+  do_dir_warning=yes
+fi
+
+
+# Warn about egregious GNOME bogosity.
+#
+if (rpm -qv control-center) >&- 2>&- ; then
+  warning=no
+  warnL "The Gnome Control Center seems to be installed."
+  echo  ""
+  warn2 "Note that simply installing this version of xscreensaver"
+  warn2 "will not cause GNOME to know about the newly-added display"
+  warn2 "modes -- GNOME is just lame that way.  Instead of using the"
+  warn2 "Control Center, try using the \`xscreensaver-demo' command."
+fi
+
+
+if test "${bindir}" = "${HACKDIR}" ; then
+  do_dir_warning=yes
+fi
+
+if test "$do_dir_warning" = yes; then
+  echo ""
+  echo "$warnsep"
+  echo ""
+  echo '      When you run "make install", the "xscreensaver",'
+  echo '      "xscreensaver-demo", and "xscreensaver-command" executables'
+  echo "      will be installed in ${bindir}."
+  echo ""
+  echo "      The various graphics demos (90+ different executables) will"
+  echo "      also be installed in ${HACKDIR}."
+  echo ""
+  echo "      If you would prefer the demos to be installed elsewhere"
+  echo "      (for example, in a dedicated directory) you should re-run"
+  echo "      configure with the --enable-subdir=DIR option.  For more"
+  echo "      information, run $0 --help."
+  warning=yes
+fi
+
+if test "$warning" != no; then
+  echo '' ; echo "$warnsep" ; echo ''
+fi
diff --git a/driver/.gdbinit b/driver/.gdbinit
new file mode 100644 (file)
index 0000000..cb7d98a
--- /dev/null
@@ -0,0 +1,25 @@
+# If you're debugging xscreensaver and you are running a virtual root window
+# manager, you'd better let the process handle these signals: it remaps the
+# virtual root window when they arrive.  If you don't do this, your window
+# manager will be hosed.
+#
+# Also, gdb copes badly with breakpoints in functions that are called on the
+# other side of a fork().  The Trace/BPT traps cause the spawned process to
+# die.
+#
+#handle 1 pass nostop
+#handle 3 pass nostop
+#handle 4 pass nostop
+#handle 6 pass nostop
+#handle 7 pass nostop
+#handle 8 pass nostop
+#handle 9 pass nostop
+#handle 10 pass nostop
+#handle 11 pass nostop
+#handle 12 pass nostop
+#handle 13 pass nostop
+#handle 15 pass nostop
+#handle 19 pass nostop
+b exit
+set args -debug
+#b purify_stop_here
diff --git a/driver/Makefile.in b/driver/Makefile.in
new file mode 100644 (file)
index 0000000..318ec69
--- /dev/null
@@ -0,0 +1,576 @@
+# driver/Makefile.in --- xscreensaver, Copyright (c) 1997 Jamie Zawinski.
+# the `../configure' script generates `driver/Makefile' from this file.
+
+@SET_MAKE@
+.SUFFIXES:
+.SUFFIXES: .c .o
+
+srcdir         = @srcdir@
+VPATH          = @srcdir@
+
+install_prefix =
+prefix         = @prefix@
+exec_prefix    = @exec_prefix@
+bindir         = @bindir@
+mandir         = @mandir@
+man1dir                = $(mandir)/man1
+mansuffix      = 1
+
+CC             = @CC@
+CFLAGS         = @CFLAGS@
+LDFLAGS                = @LDFLAGS@
+DEFS           = @DEFS@
+DEFS2          = $(DEFS) -DDEFAULT_PATH_PREFIX='"@HACKDIR@"'
+LIBS           = @LIBS@
+
+DEPEND         = @DEPEND@
+DEPEND_FLAGS   = @DEPEND_FLAGS@
+DEPEND_DEFINES = @DEPEND_DEFINES@
+
+SHELL          = /bin/sh
+INSTALL                = @INSTALL@
+SUID_FLAGS      = -o root -m 4755
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SETUID  = @INSTALL_SETUID@
+INSTALL_DATA   = @INSTALL_DATA@
+INSTALL_DIRS   = @INSTALL_DIRS@
+
+X_CFLAGS       = @X_CFLAGS@
+X_LIBS         = @X_LIBS@
+X_PRE_LIBS     = @X_PRE_LIBS@
+X_EXTRA_LIBS   = @X_EXTRA_LIBS@
+
+# Note:
+#
+# X_LIBS would more properly be called X_LDFLAGS (it contains the -L args.)
+# X_PRE_LIBS contains extra libraries you have to link against on some systems,
+#         and that must come before -lX11.  (e.g., -lSM and -lICE.)
+# X_EXTRA_LIBS contains extra libraries needed by X that aren't a part of X.
+#         (e.g., -lsocket, -lnsl, etc.)
+#
+# I think (but am not totally sure) that LIBS is also really "LDFLAGS".
+#
+# SAVER_LIBS is the link line for "xscreensaver", and
+# CMD_LIBS is the link line for "xscreensaver-command".
+
+
+AD_DIR         = @APPDEFAULTS@
+PAM_DIR                = /etc/pam.d
+PAM_CONF       = /etc/pam.conf
+
+UTILS_SRC      = $(srcdir)/../utils
+UTILS_BIN      = ../utils
+
+INCLUDES       = -I. -I$(srcdir) -I$(UTILS_SRC) -I.. @INCLUDES@
+
+MOTIF_SRCS     = dialogs-Xm.c
+MOTIF_OBJS     = dialogs-Xm.o
+
+GTK_SRCS       = dialogs-Gtk.c
+GTK_OBJS       = dialogs-Gtk.o
+
+ATHENA_SRCS    = dialogs-Xaw.c
+ATHENA_OBJS    = dialogs-Xaw.o
+
+PWENT_SRCS     = passwd-pwent.c
+PWENT_OBJS     = passwd-pwent.o
+
+KERBEROS_SRCS  = passwd-kerberos.c
+KERBEROS_OBJS  = passwd-kerberos.o
+
+PAM_SRCS       = passwd-pam.c
+PAM_OBJS       = passwd-pam.o
+
+LOCK_SRCS_1    = lock.c passwd.c
+LOCK_OBJS_1    = lock.o passwd.o
+
+TEST_SRCS      = test-passwd.c test-uid.c test-xdpms.c test-grab.c test-apm.c
+
+MOTIF_LIBS     = @MOTIF_LIBS@
+GTK_LIBS       = @GTK_LIBS@
+ATHENA_LIBS    = @ATHENA_LIBS@
+ATHENA3D_LIBS  = @ATHENA3D_LIBS@
+
+PASSWD_SRCS    = @PASSWD_SRCS@
+PASSWD_OBJS    = @PASSWD_OBJS@
+PASSWD_LIBS    = @PASSWD_LIBS@
+
+LOCK_SRCS      = @LOCK_SRCS@
+LOCK_OBJS      = @LOCK_OBJS@
+
+XMU_SRCS       = @XMU_SRCS@
+XMU_OBJS       = @XMU_OBJS@
+
+GL_SRCS                = @SAVER_GL_SRCS@
+GL_OBJS                = @SAVER_GL_OBJS@
+GL_LIBS                = @SAVER_GL_LIBS@
+
+DEMO_UTIL_SRCS = $(UTILS_SRC)/resources.c $(UTILS_SRC)/usleep.c \
+                 $(UTILS_SRC)/visual.c
+DEMO_UTIL_OBJS = $(UTILS_BIN)/resources.o $(UTILS_BIN)/usleep.o \
+                 $(UTILS_BIN)/visual.o
+
+SAVER_UTIL_SRCS        = $(UTILS_SRC)/fade.c $(UTILS_SRC)/overlay.c \
+                 $(UTILS_SRC)/xroger.c $(UTILS_SRC)/spline.c \
+                 $(UTILS_SRC)/yarandom.c \
+                 $(DEMO_UTIL_SRCS)
+SAVER_UTIL_OBJS        = $(UTILS_BIN)/fade.o $(UTILS_BIN)/overlay.o \
+                 $(UTILS_BIN)/xroger.o $(UTILS_BIN)/spline.o \
+                 $(UTILS_BIN)/yarandom.o \
+                 $(DEMO_UTIL_OBJS)
+
+SAVER_SRCS_1   = xscreensaver.c windows.c timers.c subprocs.c \
+                 xset.c splash.c setuid.c stderr.c
+SAVER_OBJS_1   = xscreensaver.o windows.o timers.o subprocs.o \
+                 xset.o splash.o setuid.o stderr.o
+
+SAVER_SRCS     = $(SAVER_SRCS_1) prefs.c $(LOCK_SRCS) \
+                 $(SAVER_UTIL_SRCS) $(GL_SRCS) $(XMU_SRCS)
+SAVER_OBJS     = $(SAVER_OBJS_1) prefs.o $(LOCK_OBJS) \
+                 $(SAVER_UTIL_OBJS) $(GL_OBJS) $(XMU_OBJS)
+
+CMD_SRCS       = remote.c xscreensaver-command.c
+CMD_OBJS       = remote.o xscreensaver-command.o
+
+DEMO_SRCS_1    = prefs.c demo.c $(XMU_SRCS)
+DEMO_OBJS_1    = prefs.o demo-Xm.o demo-Gtk.o demo-Xaw.o $(XMU_OBJS)
+
+DEMO_SRCS      = prefs.c remote.c $(DEMO_UTIL_SRCS) demo.c
+DEMO_OBJS      = prefs.o remote.o $(DEMO_UTIL_OBJS)
+
+SAVER_LIBS     = $(LIBS) $(X_LIBS) @SAVER_LIBS@ $(GL_LIBS) \
+                 $(X_PRE_LIBS) -lXt -lX11 -lXext $(X_EXTRA_LIBS) \
+                 $(PASSWD_LIBS)
+
+CMD_LIBS       = $(LIBS) $(X_LIBS) \
+                 $(X_PRE_LIBS) -lX11 -lXext $(X_EXTRA_LIBS)
+
+EXES           = xscreensaver xscreensaver-command xscreensaver-demo
+EXES2          = @ALL_DEMO_PROGRAMS@
+
+HDRS           = XScreenSaver_ad.h xscreensaver.h prefs.h remote.h
+MEN            = xscreensaver.man xscreensaver-demo.man \
+                 xscreensaver-command.man
+EXTRAS         = README Makefile.in XScreenSaver.ad.in xscreensaver.pam \
+                 .gdbinit
+VMSFILES       = compile_axp.com compile_decc.com link_axp.com link_decc.com \
+                 vms-getpwnam.c vms-pwd.h vms-hpwd.c vms-validate.c \
+                 vms_axp.opt vms_axp_12.opt vms_decc.opt vms_decc_12.opt
+
+TARFILES       = $(EXTRAS) $(VMSFILES) $(SAVER_SRCS_1) \
+                 $(MOTIF_SRCS) $(GTK_SRCS) $(ATHENA_SRCS) $(PWENT_SRCS) \
+                 $(KERBEROS_SRCS) $(PAM_SRCS) $(LOCK_SRCS_1) $(DEMO_SRCS_1) \
+                 $(CMD_SRCS) $(HDRS) $(TEST_SRCS) $(MEN)
+
+
+default: $(EXES)
+all: $(EXES) $(EXES2)
+
+install:   install-program   install-ad   install-man   @INSTALL_PAM@
+uninstall: uninstall-program uninstall-ad uninstall-man
+
+install-strip:
+       $(MAKE) INSTALL_PROGRAM='$(INSTALL_PROGRAM) -s' \
+               INSTALL_SETUID='$(INSTALL_SETUID) -s' \
+               install
+
+install-program: $(EXES)
+       @if [ ! -d $(bindir) ]; then $(INSTALL_DIRS) $(bindir) ; fi
+       @inst="$(INSTALL_PROGRAM)" ;                                    \
+       if [ @NEED_SETUID@ = yes ]; then                                \
+          me=`PATH="$$PATH:/usr/ucb" whoami` ;                         \
+          if [ "$$me" = root ]; then                                   \
+            inst="$(INSTALL_SETUID)" ;                                 \
+          else                                                         \
+           e=echo ;                                                    \
+ $$e ""                                                                             ;\
+ $$e "  ####################################################################";\
+ $$e "  Warning: xscreensaver has been compiled with support for shadow"     ;\
+ $$e "           passwords.  If your system actually uses shadow passwords," ;\
+ $$e "           then xscreensaver must be installed as a setuid root"      ;\
+ $$e "           program in order for locking to work.  To do this, you"     ;\
+ $$e "           must run 'make install' as 'root', not as '$$me'."         ;\
+ $$e ""                                                                             ;\
+ $$e "           For now, xscreensaver will be installed non-setuid, which"  ;\
+ $$e "           means that locking might not work.  (Try it and see.)"             ;\
+ $$e "  ####################################################################";\
+ $$e ""                                                                             ;\
+          fi ;                                                         \
+       fi ;                                                            \
+       echo $$inst xscreensaver $(bindir)/xscreensaver ;               \
+       $$inst xscreensaver $(bindir)/xscreensaver
+       $(INSTALL_PROGRAM) xscreensaver-command $(bindir)/xscreensaver-command
+       $(INSTALL_PROGRAM) xscreensaver-demo $(bindir)/xscreensaver-demo
+
+install-ad: XScreenSaver.ad
+       @if [ ! -d $(AD_DIR) ]; then $(INSTALL_DIRS) $(AD_DIR) ; fi
+       @-echo $(INSTALL_DATA) XScreenSaver.ad $(AD_DIR)/XScreenSaver ;       \
+       if $(INSTALL_DATA) XScreenSaver.ad $(AD_DIR)/XScreenSaver ; then      \
+         true ;                                                              \
+       else                                                                  \
+         e=echo ;                                                            \
+         if [ -f $(AD_DIR)/XScreenSaver ]; then                              \
+ $$e ""                                                                             ;\
+ $$e "  ####################################################################";\
+ $$e "  Warning: unable to install $(AD_DIR)/XScreenSaver"                  ;\
+ $$e "           That file exists, and is unwritable.  It is probably from"  ;\
+ $$e "           an older version of xscreensaver, and could cause things"   ;\
+ $$e "           to malfunction.  Please delete it!"                        ;\
+ $$e "  ####################################################################";\
+ $$e ""                                                                             ;\
+           exit 1 ;                                                          \
+         else                                                                \
+ $$e ""                                                                             ;\
+ $$e "  ####################################################################";\
+ $$e "  Warning: unable to install $(AD_DIR)/XScreenSaver"                  ;\
+ $$e "           The directory is unwritable.  This is probably ok;"        ;\
+ $$e "           xscreensaver should work without that file."               ;\
+ $$e "  ####################################################################";\
+ $$e ""                                                                             ;\
+           exit 0 ;                                                          \
+         fi                                                                  \
+       fi
+
+install-man: $(MEN)
+       @men="$(MEN)" ;                                                 \
+       if [ ! -d $(man1dir) ]; then $(INSTALL_DIRS) $(man1dir) ; fi ;  \
+       for man in $$men; do                                            \
+         instname=`echo $$man | sed 's/\.man$$/\.$(mansuffix)/'` ;     \
+         echo $(INSTALL_DATA) $(srcdir)/$$man $(man1dir)/$$instname ;  \
+         $(INSTALL_DATA) $(srcdir)/$$man $(man1dir)/$$instname ;       \
+       done
+
+uninstall-program:
+       @for program in $(EXES); do                                     \
+         echo rm -f $(bindir)/$$program ;                              \
+         rm -f $(bindir)/$$program ;                                   \
+       done
+
+uninstall-ad:
+       rm -f $(AD_DIR)/XScreenSaver
+
+uninstall-man:
+       @men="$(MEN)" ;                                                 \
+       for man in $$men; do                                            \
+         instname=`echo $$man | sed 's/\.man$$/\.$(mansuffix)/'` ;     \
+         echo rm -f $(man1dir)/$$instname ;                            \
+         rm -f $(man1dir)/$$instname ;                                 \
+       done
+
+install-pam:
+       @src="$(srcdir)/xscreensaver.pam" ;                             \
+       dest=`sed -n 's/.*PAM_SERVICE_NAME[     ]*"\([^"]*\)".*$$/\1/p' \
+          < ../config.h` ;                                             \
+       dir="$(PAM_DIR)" ;                                              \
+       conf="$(PAM_CONF)" ;                                            \
+                                                                       \
+       if [ -d $$dir ] ; then                                          \
+         echo $(INSTALL_DATA) $$src $$dir/$$dest ;                     \
+         $(INSTALL_DATA) $$src $$dir/$$dest ;                          \
+         if [ ! -f $$dir/$$dest ]; then                                \
+           e=echo ;                                                    \
+ $$e ""                                                                             ;\
+ $$e "  ####################################################################";\
+ $$e "  Warning: xscreensaver has been compiled with support for Pluggable"  ;\
+ $$e "           Authentication Modules (PAM).  However, we were unable to"  ;\
+ $$e "           install the file $$dir/$$dest.  PAM is unlikely"           ;\
+ $$e "           to work without this file (and old-style password"         ;\
+ $$e "           authentication will be used instead, which may or may not"  ;\
+ $$e "           work.)"                                                    ;\
+ $$e "  ####################################################################";\
+ $$e ""                                                                             ;\
+         fi ;                                                          \
+       elif [ -f $$conf ]; then                                        \
+         if ( grep $$dest $$conf >/dev/null ); then                    \
+          true ;                                                       \
+         else                                                          \
+           e=echo ;                                                    \
+ $$e ""                                                                             ;\
+ $$e "  ####################################################################";\
+ $$e "  Warning: xscreensaver has been compiled with support for Pluggable"  ;\
+ $$e "           Authentication Modules (PAM).  To complete the installation";\
+ $$e "           of PAM support, you must add the following line to the file";\
+ $$e "           $$conf:"                                                   ;\
+ $$e ""                                                                             ;\
+ $$e   "       $$dest  auth required   /usr/lib/security/pam_unix.so.1"     ;\
+ $$e ""                                                                             ;\
+ $$e "           Be careful: if you mess up that file, you could completely" ;\
+ $$e "           hose your machine (e.g., \`login' and \`su' won't work, and";\
+ $$e "           you'll have to boot single-user to fix it.)"                ;\
+ $$e "  ####################################################################";\
+           echo "";                                                    \
+         fi ;                                                          \
+       fi
+
+
+clean:
+       -rm -f *.o a.out core $(EXES) $(EXES2) XScreenSaver_ad.h
+
+distclean: clean
+       -rm -f Makefile XScreenSaver.ad TAGS *~ "#"*
+
+# Adds all current dependencies to Makefile
+depend: XScreenSaver_ad.h
+       $(DEPEND) -s '# DO NOT DELETE: updated by make depend'              \
+       $(DEPEND_FLAGS) --                                                  \
+       $(INCLUDES) $(DEFS) $(DEPEND_DEFINES) $(CFLAGS) $(X_CFLAGS) --      \
+       $(SAVER_SRCS) $(CMD_SRCS)
+
+# Adds some dependencies to Makefile.in -- not totally accurate, but pretty
+# close.  This excludes dependencies on files in /usr/include, etc.  It tries
+# to include only dependencies on files which are themselves a part of this
+# package.
+distdepend: update_ad_version update_man_version XScreenSaver_ad.h
+       @echo updating dependencies in `pwd`/Makefile.in... ;               \
+       $(DEPEND) -w 0 -f -                                                 \
+       -s '# DO NOT DELETE: updated by make distdepend' $(DEPEND_FLAGS) -- \
+       $(INCLUDES) $(DEFS) $(DEPEND_DEFINES) $(CFLAGS) $(X_CFLAGS) --      \
+       $(SAVER_SRCS_1) $(MOTIF_SRCS) $(GTK_SRCS) $(ATHENA_SRCS)            \
+       $(PWENT_SRCS) $(LOCK_SRCS_1) $(DEMO_SRCS_1) $(CMD_SRCS)             \
+       $(TEST_SRCS) |                                                      \
+       (                                                                   \
+         awk '/^# .*Makefile.in ---/,/^# DO .*distdepend/' < Makefile.in ; \
+         sed -e 's@ \./@ @g;s@ /[^ ]*@@g;/^.*:$$/d'                        \
+             -e 's@\.\./utils@$$(UTILS_SRC)@g'                             \
+             -e 's@ \([^$$]\)@ $$(srcdir)/\1@g'                            \
+             -e 's@$$.*\(XScreenSaver_ad\)@\1@g'                           \
+             -e 's@ $$(srcdir)/\(.*config\.h\)@ \1@g' ;                    \
+         echo ''                                                           \
+       ) > /tmp/distdepend.$$$$ &&                                         \
+       mv Makefile.in Makefile.in.bak &&                                   \
+       mv /tmp/distdepend.$$$$ Makefile.in
+
+# Updates the version number in the app-defaults file to be in sync with 
+# the version number in version.h.  This is so people can tell when they
+# have a version skew between the app-defaults file and the executable.
+update_ad_version::
+       @S=XScreenSaver.ad.in ;                                             \
+       U=$(UTILS_SRC)/version.h ;                                          \
+       V=`sed -n 's/.*\([0-9][0-9]*\.[0-9]*\).*/\1/p' < $$U` ;             \
+       D=`date '+%d-%b-%y'` ;                                              \
+       echo -n "Updating version number in $$S to $$V $$D... " ;           \
+       T=/tmp/xs.$$$$ ;                                                    \
+       sed -e "s/\(.*version \)[0-9][0-9]*\.[0-9]*\(.*\)/\1$$V\2/"         \
+           -e "s/\([0-9][0-9]-[A-Z][a-z][a-z]-[0-9][0-9]\)/$$D/"           \
+         < $$S > $$T ;                                                     \
+       if cmp -s $$S $$T ; then                                            \
+         echo "unchanged." ;                                               \
+       else                                                                \
+         cat $$T > $$S ;                                                   \
+         echo "done." ;                                                    \
+       fi ;                                                                \
+       rm $$T
+
+update_man_version::
+       @for S in $(MEN); do                                                \
+       U=$(UTILS_SRC)/version.h ;                                          \
+       V=`sed -n 's/.*\([0-9][0-9]*\.[0-9]*\).*/\1/p' < $$U` ;             \
+       V="`date '+%d-%b-%y'` ($$V)" ;                                      \
+       echo -n "Updating footer in $$S to \"$$V\"... " ;                   \
+       T=/tmp/xs.$$$$ ;                                                    \
+       sed "s/^\(\.TH[^\"]*\)\"[^\"]*\"\(.*\)/\1\"$$V\"\2/"                \
+         < $$S > $$T ;                                                     \
+       if cmp -s $$S $$T ; then                                            \
+         echo "unchanged." ;                                               \
+       else                                                                \
+         cat $$T > $$S ;                                                   \
+         echo "done." ;                                                    \
+       fi ;                                                                \
+       rm $$T ;                                                            \
+       done
+
+TAGS: tags
+tags:
+       find $(srcdir) -name '*.[chly]' -print | xargs etags -a
+
+echo_tarfiles:
+       @$(MAKE) XScreenSaver_ad.h 2>&1 >&- /dev/null
+       @echo $(TARFILES)
+
+
+# Rules for noticing when the objects from the utils directory are out of
+# date with respect to their sources, and going and building them according
+# to the rules in their own Makefile...
+#
+$(UTILS_BIN)/fade.o:           $(UTILS_SRC)/fade.c
+$(UTILS_BIN)/overlay.o:                $(UTILS_SRC)/overlay.c
+$(UTILS_BIN)/resources.o:      $(UTILS_SRC)/resources.c
+$(UTILS_BIN)/usleep.o:         $(UTILS_SRC)/usleep.c
+$(UTILS_BIN)/visual.o:         $(UTILS_SRC)/visual.c
+$(UTILS_BIN)/xmu.o:            $(UTILS_SRC)/xmu.c
+$(UTILS_BIN)/xroger.o:         $(UTILS_SRC)/xroger.c
+$(UTILS_BIN)/spline.o:         $(UTILS_SRC)/spline.c
+$(UTILS_BIN)/yarandom.o:       $(UTILS_SRC)/yarandom.c
+
+$(SAVER_UTIL_OBJS):
+       cd $(UTILS_BIN) ; \
+       $(MAKE) $(@F) CC="$(CC)" CFLAGS="$(CFLAGS)" LDFLAGS="$(LDFLAGS)"
+
+# How we build object files in this directory.
+.c.o:
+       $(CC) -c $(INCLUDES) $(DEFS)  $(CFLAGS) $(X_CFLAGS) $<
+
+# subprocs is the only one that takes an extra -D option.
+subprocs.o: subprocs.c
+       $(CC) -c $(INCLUDES) $(DEFS2) $(CFLAGS) $(X_CFLAGS) \
+         $(srcdir)/subprocs.c
+
+
+# How we build the default app-defaults file into the program.
+#
+XScreenSaver_ad.h: XScreenSaver.ad
+       $(SHELL) $(UTILS_SRC)/ad2c XScreenSaver.ad > XScreenSaver_ad.h
+
+# The executables linked in this directory.
+#
+xscreensaver: $(SAVER_OBJS)
+       $(CC) $(LDFLAGS) -o $@ $(SAVER_OBJS) $(SAVER_LIBS)
+
+xscreensaver-command: $(CMD_OBJS)
+       $(CC) $(LDFLAGS) -o $@ $(CMD_OBJS) $(CMD_LIBS)
+
+
+xscreensaver-demo: @PREFERRED_DEMO_PROGRAM@
+       cp -p @PREFERRED_DEMO_PROGRAM@ $@
+
+xscreensaver-demo-Xm: $(DEMO_OBJS) $(MOTIF_OBJS) demo-Xm.o
+       $(CC) $(LDFLAGS) -o $@ $(DEMO_OBJS) $(MOTIF_OBJS) demo-Xm.o \
+       $(LIBS) $(X_LIBS) \
+       $(MOTIF_LIBS) $(X_PRE_LIBS) -lXt -lX11 -lXext $(X_EXTRA_LIBS)
+
+xscreensaver-demo-Gtk: $(DEMO_OBJS) $(GTK_OBJS) demo-Gtk.o
+       $(CC) $(LDFLAGS) -o $@ $(DEMO_OBJS) $(GTK_OBJS) demo-Gtk.o \
+       $(LIBS) $(X_LIBS) \
+       $(GTK_LIBS) $(X_PRE_LIBS) -lXt -lX11 -lXext $(X_EXTRA_LIBS)
+
+xscreensaver-demo-Xaw: $(DEMO_OBJS) $(ATHENA_OBJS) demo-Xaw.o
+       $(CC) $(LDFLAGS) -o $@ $(DEMO_OBJS) $(ATHENA_OBJS) demo-Xaw.o \
+       $(LIBS) $(X_LIBS) \
+       $(ATHENA_LIBS) $(X_PRE_LIBS) -lXt -lX11 -lXext $(X_EXTRA_LIBS)
+
+xscreensaver-demo-Xaw3d: $(DEMO_OBJS) $(ATHENA_OBJS) demo-Xaw.o
+       $(CC) $(LDFLAGS) -o $@ $(DEMO_OBJS) $(ATHENA_OBJS) demo-Xaw.o \
+       $(LIBS) $(X_LIBS) \
+       $(ATHENA3D_LIBS) $(X_PRE_LIBS) -lXt -lX11 -lXext $(X_EXTRA_LIBS)
+
+demo-Xm.o: demo.c XScreenSaver_ad.h
+       $(CC) -o $@ -c -DFORCE_MOTIF \
+       $(INCLUDES) $(DEFS) $(CFLAGS) $(X_CFLAGS) $(srcdir)/demo.c
+demo-Gtk.o: demo.c XScreenSaver_ad.h
+       $(CC) -o $@ -c -DFORCE_GTK \
+       $(INCLUDES) $(DEFS) $(CFLAGS) $(X_CFLAGS) $(srcdir)/demo.c
+demo-Xaw.o: demo.c XScreenSaver_ad.h
+       $(CC) -o $@ -c -DFORCE_ATHENA \
+       $(INCLUDES) $(DEFS) $(CFLAGS) $(X_CFLAGS) $(srcdir)/demo.c
+
+
+
+
+TEST_PASSWD_OBJS = test-passwd.o $(LOCK_OBJS_1) $(PASSWD_OBJS) \
+        subprocs.o setuid.o splash.o prefs.o \
+       $(SAVER_UTIL_OBJS)
+test-passwd.o: XScreenSaver_ad.h
+
+tests:: test-passwd
+test-passwd: $(TEST_PASSWD_OBJS) XScreenSaver_ad.h
+       $(CC) $(LDFLAGS) -o $@ $(TEST_PASSWD_OBJS) $(SAVER_LIBS)
+
+tests:: test-uid
+test-uid: test-uid.o
+       $(CC) $(LDFLAGS) -o $@ test-uid.o
+
+tests:: test-xdpms
+test-xdpms: test-xdpms.o
+       $(CC) $(LDFLAGS) -o $@ test-xdpms.o $(SAVER_LIBS)
+
+tests:: test-grab
+test-grab: test-grab.o
+       $(CC) $(LDFLAGS) -o $@ test-grab.o $(SAVER_LIBS)
+
+tests:: test-apm
+test-apm: test-apm.o
+       $(CC) $(LDFLAGS) -o $@ test-apm.o $(SAVER_LIBS) -lapm
+
+
+
+##############################################################################
+#
+# DO NOT DELETE: updated by make distdepend
+# $(srcdir)/DO $(srcdir)/NOT $(srcdir)/DELETE: $(srcdir)/updated $(srcdir)/by $(srcdir)/make $(srcdir)/distdepend
+
+xscreensaver.o: ../config.h
+xscreensaver.o: $(srcdir)/xscreensaver.h
+xscreensaver.o: $(srcdir)/prefs.h
+xscreensaver.o: $(UTILS_SRC)/version.h
+xscreensaver.o: $(UTILS_SRC)/yarandom.h
+xscreensaver.o: $(UTILS_SRC)/resources.h
+xscreensaver.o: $(UTILS_SRC)/visual.h
+xscreensaver.o: $(UTILS_SRC)/usleep.h
+xscreensaver.o: XScreenSaver_ad.h
+windows.o: ../config.h
+windows.o: $(srcdir)/xscreensaver.h
+windows.o: $(srcdir)/prefs.h
+windows.o: $(UTILS_SRC)/visual.h
+windows.o: $(UTILS_SRC)/fade.h
+timers.o: ../config.h
+timers.o: $(srcdir)/xscreensaver.h
+timers.o: $(srcdir)/prefs.h
+subprocs.o: ../config.h
+subprocs.o: $(srcdir)/xscreensaver.h
+subprocs.o: $(srcdir)/prefs.h
+subprocs.o: $(UTILS_SRC)/yarandom.h
+xset.o: ../config.h
+xset.o: $(srcdir)/xscreensaver.h
+xset.o: $(srcdir)/prefs.h
+splash.o: ../config.h
+splash.o: $(srcdir)/xscreensaver.h
+splash.o: $(srcdir)/prefs.h
+splash.o: $(UTILS_SRC)/resources.h
+setuid.o: ../config.h
+setuid.o: $(srcdir)/xscreensaver.h
+setuid.o: $(srcdir)/prefs.h
+stderr.o: ../config.h
+stderr.o: $(srcdir)/xscreensaver.h
+stderr.o: $(srcdir)/prefs.h
+stderr.o: $(UTILS_SRC)/resources.h
+stderr.o: $(UTILS_SRC)/visual.h
+dialogs-Xm.o: ../config.h
+dialogs-Xm.o: $(UTILS_SRC)/visual.h
+dialogs-Gtk.o: ../config.h
+dialogs-Gtk.o: $(UTILS_SRC)/resources.h
+dialogs-Xaw.o: ../config.h
+dialogs-Xaw.o: $(UTILS_SRC)/visual.h
+passwd-pwent.o: ../config.h
+lock.o: ../config.h
+lock.o: $(srcdir)/xscreensaver.h
+lock.o: $(srcdir)/prefs.h
+lock.o: $(UTILS_SRC)/resources.h
+passwd.o: ../config.h
+prefs.o: ../config.h
+prefs.o: $(srcdir)/prefs.h
+prefs.o: $(UTILS_SRC)/resources.h
+demo.o: ../config.h
+demo.o: $(UTILS_SRC)/version.h
+demo.o: $(srcdir)/prefs.h
+demo.o: $(UTILS_SRC)/resources.h
+demo.o: $(UTILS_SRC)/visual.h
+demo.o: $(srcdir)/remote.h
+demo.o: $(UTILS_SRC)/usleep.h
+demo.o: XScreenSaver_ad.h
+remote.o: ../config.h
+remote.o: $(srcdir)/remote.h
+xscreensaver-command.o: ../config.h
+xscreensaver-command.o: $(srcdir)/remote.h
+xscreensaver-command.o: $(UTILS_SRC)/version.h
+test-passwd.o: ../config.h
+test-passwd.o: $(srcdir)/xscreensaver.h
+test-passwd.o: $(srcdir)/prefs.h
+test-passwd.o: $(UTILS_SRC)/resources.h
+test-passwd.o: $(UTILS_SRC)/version.h
+test-passwd.o: $(UTILS_SRC)/visual.h
+test-passwd.o: XScreenSaver_ad.h
+test-uid.o: ../config.h
+test-xdpms.o: ../config.h
+test-grab.o: ../config.h
+test-apm.o: ../config.h
+
diff --git a/driver/README b/driver/README
new file mode 100644 (file)
index 0000000..df64793
--- /dev/null
@@ -0,0 +1,6 @@
+
+This directory contains the source for xscreensaver and xscreensaver-command,
+the screensaver driver, and the program for externally controlling it.  Some
+stuff from the ../utils/ directory is used here as well.
+
+If you have compilation problems, check the parameters in ../config.h.
diff --git a/driver/XScreenSaver.ad.in b/driver/XScreenSaver.ad.in
new file mode 100644 (file)
index 0000000..160514d
--- /dev/null
@@ -0,0 +1,520 @@
+!
+!                              XScreenSaver
+!
+!            a screen saver and locker for the X window system
+!                            by Jamie Zawinski
+!
+!                              version 3.16
+!                                23-Jun-99
+!
+! See "man xscreensaver" for more info.  The latest version is always
+! available at http://www.jwz.org/xscreensaver/
+
+
+! These resources, when placed in the system-wide app-defaults directory
+! (e.g., /usr/lib/X11/app-defaults/XScreenSaver) will provide the default
+! settings for new users.  However, if you have a ".xscreensaver" file in
+! your home directory, the settings in that file take precedence.
+
+
+*timeout:              10
+*cycle:                        10
+*lockTimeout:          0
+*passwdTimeout:                30
+*nice:                 10
+*lock:                 False
+*lockVTs:              True
+*verbose:              False
+*timestamp:            False
+*fade:                 True
+*unfade:               False
+*fadeSeconds:          3
+*fadeTicks:            20
+*splash:               True
+*splashDuration:       5
+*visualID:             default
+
+*captureStderr:        True
+*overlayTextForeground:        #FFFF00
+*overlayTextBackground:        #000000
+*overlayStderr:                True
+*font:                 *-medium-r-*-140-*-m-*
+
+! The default is to use these extensions if available (as noted.)
+*sgiSaverExtension:    True
+*mitSaverExtension:    False
+*xidleExtension:       True
+*procInterrupts:       True
+
+! This is what the "Demo" button on the splash screen runs (/bin/sh syntax.)
+*demoCommand: xscreensaver-demo
+
+! This is what the "Prefs" button on the splash screen runs (/bin/sh syntax.)
+*prefsCommand: xscreensaver-demo -prefs
+
+! This is the URL that the "Help" button on the splash screen loads.
+*helpURL: http://www.jwz.org/xscreensaver/man.html
+
+! This is how the "Help" button loads URLs (/bin/sh syntax.)
+! The "helpURL" will be substituted for up to two occurrences of "%s".
+*loadURL: netscape -remote 'openURL(%s)' || netscape '%s'
+
+
+! Turning on "installColormap" interacts erratically with twm and tvtwm,
+! but seems to work fine with mwm and olwm.  Try it and see.  If your
+! screen turns some color other than black, the window manager is buggy,
+! and you need to set this resource to False (or get a WM that works.)
+!
+*installColormap:      True
+
+
+! Any program which can draw on the root window will work as a screensaver.
+! The following resource enumerates them.
+!
+! Programs are separated by newlines (specified in resource files with \n).
+! Lines may be continued with a lone \ at the end of the line.
+!
+! Each line is an `sh' command.
+!
+! If the first (non-blank) character on the line is "-", then that means
+! that this command is disabled: it's still in the list, but it won't ever
+! be used.  (This is just to make it easy to disable and then re-enable 
+! them later.)
+!
+! If the first word on the line is the name of a visual followed by a
+! colon, then that visual will be used for the program, if it is available.
+! If no such visual is available, then the program will be skipped.  In
+! this way, you can specify that you want certain programs to run only
+! on color screens, and others only on mono screens, by making use of the
+! magic visual names "color" and "mono".  Likewise, if some hacks prefer
+! colormaps, but others prefer 24-bit windows, that also can be arranged
+! (in this case, by using "PseudoColor:" versus "TrueColor:".)
+!
+! Some of the screenhacks are written using OpenGL.  OpenGL programs are
+! a bit different than normal X programs, in that they prefer visuals that
+! are *half* as deep as the screen.  You can tell xscreensaver to select a
+! good visual for a GL program by using the magic visual name "GL".
+!
+! All programs must be launched in such a way that they draw on the root
+! window; they should not be spawned in the background with "&".  If shell
+! metacharacters are used, they must be understandable to `sh', not `csh'
+! (the $SHELL variable is not consulted, for unfortunate but good reasons.)
+!
+! Be sure to check out Demo Mode: run the `xscreensaver-demo' program to
+! edit the current list of programs interactively, try out the various modes,
+! and change other parameters.  See the man page for details.
+!
+*programs:     qix -root -solid -delay 0 -segments 100                 \n\
+               qix -root -count 4 -solid -transparent                  \n\
+               qix -root -count 5 -solid -transparent -linear            \
+                       -segments 250 -size 100                         \n\
+               attraction -root -mode balls                            \n\
+               attraction -root -mode lines -points 3 -segments 200    \n\
+               attraction -root -mode splines -segments 300            \n\
+               attraction -root -mode lines -radius 300                  \
+                       -orbit -vmult 0.5                               \n\
+               pyro -root                                              \n\
+               helix -root                                             \n\
+               pedal -root                                             \n\
+               rorschach -root -offset 7                               \n\
+               hopalong -root                                          \n\
+               greynetic -root                                         \n\
+               xroger -root                                            \n\
+               imsmap -root                                            \n\
+               slidescreen -root                                       \n\
+               decayscreen -root                                       \n\
+               jigsaw -root                                            \n\
+               blitspin -root -grab                                    \n\
+               slip -root                                              \n\
+               distort -root                                           \n\
+               spotlight -root                                         \n\
+               hypercube -root                                         \n\
+               halo -root                                              \n\
+               maze -root                                              \n\
+               noseguy -root                                           \n\
+               flame -root                                             \n\
+               lmorph -root                                            \n\
+               deco -root                                              \n\
+               moire -root                                             \n\
+               moire2 -root                                            \n\
+               lightning -root                                         \n\
+               strange -root                                           \n\
+               spiral -root                                            \n\
+               laser -root                                             \n\
+               grav -root                                              \n\
+               grav -root -trail -decay                                \n\
+               drift -root                                             \n\
+               ifs -root                                               \n\
+               julia -root                                             \n\
+               penrose -root                                           \n\
+               sierpinski -root                                        \n\
+               braid -root                                             \n\
+               galaxy -root                                            \n\
+               bouboule -root                                          \n\
+               swirl -root                                             \n\
+               flag -root                                              \n\
+               sphere -root                                            \n\
+               forest -root                                            \n\
+               lisa -root                                              \n\
+               lissie -root                                            \n\
+               goop -root                                              \n\
+               starfish -root                                          \n\
+               starfish -root -blob                                    \n\
+               munch -root                                             \n\
+               fadeplot -root                                          \n\
+               coral -root                                             \n\
+               mountain -root                                          \n\
+               triangle -root                                          \n\
+               worm -root                                              \n\
+               rotor -root                                             \n\
+               ant -root                                               \n\
+               demon -root                                             \n\
+               loop -root                                              \n\
+               vines -root                                             \n\
+               kaleidescope -root                                      \n\
+               xjack -root                                             \n\
+  -            xlyap -root -randomize                                  \n\
+               cynosure -root                                          \n\
+               flow -root                                              \n\
+               epicycle -root                                          \n\
+               interference -root                                      \n\
+               truchet -root -randomize                                \n\
+               bsod -root                                              \n\
+               crystal -root                                           \n\
+               discrete -root                                          \n\
+               kumppa -root                                            \n\
+               rd-bomb -root                                           \n\
+               rd-bomb -root -speed 1 -size 0.1                        \n\
+               sonar -root                                             \n\
+               t3d -root                                               \n\
+               penetrate -root                                         \n\
+               deluxe -root                                            \n\
+               compass -root                                           \n\
+               squiral -root                                           \n\
+               xflame -root                                            \n\
+               wander -root                                            \n\
+               wander -root -advance 0 -size 10 -circles True            \
+                 -length 10000 -reset 100000                           \n\
+               critical -root                                          \n\
+               phosphor -root                                          \n\
+               xmatrix -root                                           \n\
+               petri -root -size 1 -count 20                           \n\
+               petri -root -minlifespeed 0.02 -maxlifespeed 0.03         \
+                  -minlifespan 1 -maxlifespan 1 -instantdeathchan 0      \
+                  -minorchan 0 -anychan 0.3                            \n\
+               shadebobs -root                                         \n\
+    default-n:  webcollage -root                                       \n\
+ -  default-n: webcollage -root -filter 'vidwhacker -stdin -stdout'    \n\
+ -  default-n: vidwhacker -root                                        \n\
+                                                                         \
+        mono:  rocks -root                                             \n\
+       color:  rocks -root -fg darksalmon                              \n\
+                                                                         \
+        mono:  qix -root -linear -count 5 -size 200 -spread 30           \
+                       -segments 75 -solid -xor                        \n\
+                                                                         \
+       color:  attraction -root -mode polygons                         \n\
+       color:  attraction -root -mode filled-splines -segments 0       \n\
+       color:  attraction -root -glow -points 10                       \n\
+       color:  bubbles -root                                           \n\
+                                                                         \
+@GL_KLUDGE@ GL:        gears -root                                             \n\
+@GL_KLUDGE@ GL:        superquadrics -root                                     \n\
+@GL_KLUDGE@ GL:        morph3d -root                                           \n\
+@GL_KLUDGE@ GL:        cage -root                                              \n\
+@GL_KLUDGE@ GL:        moebius -root                                           \n\
+@GL_KLUDGE@ GL:        stairs -root                                            \n\
+@GL_KLUDGE@ GL:        pipes -root                                             \n\
+@GL_KLUDGE@ GL:        sproingies -root                                        \n\
+@GL_KLUDGE@ GL:        rubik -root                                             \n\
+@GL_KLUDGE@ GL:        atlantis -root                                          \n\
+@GL_KLUDGE@ GL:        lament -root                                            \n\
+@GL_KLUDGE@ GL:        bubble3d -root                                          \n\
+@GL_KLUDGE@ GL:        glplanet -root                                          \n\
+@GL_KLUDGE@ GL:        pulsar -root                                            \n\
+  -       GL:  pulsar -root -texture -mipmap -texture_quality            \
+                      -light -fog                                      \n
+
+! Some other programs that you might want to track down (these work as
+! XScreenSaver helpers, but are not distributed with it):
+!
+!              xdaliclock -root -builtin2                              \n\
+!              xswarm -r 2>&-                                          \n\
+!              xwave -root                                             \n\
+!              xbouncebits ...                                         \n\
+!              ico -r -faces -sleep 1 -obj ico                         \n\
+!              xsplinefun                                              \n\
+!              xmountains -b -M                                        \n\
+!      color:  xfishtank -c black -d -r 2                              \n\
+!
+! xtacy is ok, but it only works on the default visual.  We can satisfy
+! that constraint like so:
+!
+!     default: xtacy -root -delay 100 -funky -number 3                 \n\
+!     default: xtacy -root -delay 100 -gravity                         \n\
+!     default: xtacy -root -delay 100 -mixer                           \n\
+!     default: xtacy -root -delay 100 -taffy -pal 4                    \n\
+! 
+! To display a randomized slideshow of images, you can do something like this:
+!
+!     default-n:  xv -root -rmode 5 -random -viewonly -wloop              \
+!                    -wait 30 $HOME/bitmaps/*.jpg                       \n\
+!
+! Note that we've used "default-n" as the visual name, rather than just
+! "default": this means "default visual, no install", that is, it's like
+! specifying the command-line arguments "-visual default -no-install".
+! This is necessary because, when XV is running in "-root" mode, it always
+! assumes that the default visual and colormap are being used, rather than 
+! examining the window it is drawing on to see what visual and colormap it
+! has.  If we didn't force the default visual to be used, xv would get an
+! X error.  If we didn't force the default colormap to be installed, the
+! colors would be all wrong.  "default-i" may also be used as a visual name
+! (meaning, "-visual default -install") but you probably won't ever need
+! to use that.
+!
+! XEarth is nice, too:
+!
+!     default-n: xearth -nostars -wait 0 -timewarp 400 -pos sunrel/38/-30
+!
+!
+! Some of the GL demos that SGI ships work with XScreenSaver; most don't.
+! XScreenSaver includes a program (not built or installed by default)
+! called "xscreensaver-sgigl".  To use the SGI demos with XScreenSaver,
+! build that program, and use it to launch the SGI demos.  For example,
+! on Irix 6.2, you can do this:
+!
+!     xscreensaver-sgigl /usr/demos/bin/ep -S
+!     xscreensaver-sgigl /usr/demos/bin/bongo
+!
+! On Irix 6.3, things have moved, so you need to do it like this:
+!
+!     xscreensaver-sgigl /usr/sbin/ep -S
+!
+! You can also use the "ant" demo, but first you need to wrap a shell script
+! around it that cds to its home directory, so that it can find its files;
+! and also pass it the -S argument, to prevent it from forking.
+!
+!
+! Also, since these actually end up mapping their own windows instead of
+! drawing on the XScreenSaver-provided root, when they are being run from
+! demo-mode, you can't pop up the demo-mode dialog just by clicking the
+! mouse: you must first type ESC to make the SGI programs exit.  This sucks.
+! Things should work properly when they are being run by xscreensaver in
+! non-demo-mode, however.
+!
+! Basically, the SGI demo writers went out of their way to make my life hell.
+
+
+
+!=============================================================================
+!
+!      You probably don't want to change anything after this point.
+!
+!=============================================================================
+
+
+XScreenSaver.pointerPollTime:          5
+XScreenSaver.initialDelay:             0
+XScreenSaver.windowCreationTimeout:    30
+XScreenSaver.bourneShell:              /bin/sh
+
+
+! Resources for the password and splash-screen dialog boxes of
+! the "xscreensaver" daemon.
+!
+*Dialog.headingFont:           *-times-bold-r-*-*-*-180-*-*-*-iso8859-1
+*Dialog.bodyFont:              *-helvetica-bold-r-*-*-*-140-*-*-*-iso8859-1
+*Dialog.labelFont:             *-helvetica-bold-r-*-*-*-140-*-*-*-iso8859-1
+*Dialog.buttonFont:            *-helvetica-bold-r-*-*-*-140-*-*-*-iso8859-1
+*Dialog.foreground:            #000000
+*Dialog.background:            #BFBFBF
+*Dialog.Button.foreground:     #000000
+*Dialog.Button.background:     #D0D0D0
+*Dialog.text.foreground:       #000000
+*Dialog.text.background:       #FFFFFF
+*Dialog.logo.foreground:       #FF0000
+*Dialog.logo.background:       #FFFFFF
+*Dialog.topShadowColor:                #E7E7E7
+*Dialog.bottomShadowColor:     #737373
+*Dialog.logo.width:            200
+*Dialog.logo.height:           200
+*Dialog.internalBorderWidth:   30
+*Dialog.borderWidth:           1
+*Dialog.shadowThickness:       4
+
+*passwd.heading.label:         XScreenSaver %s
+*passwd.body.label:            This display is locked.
+*passwd.user.label:            User:
+*passwd.passwd.label:          Password:
+*passwd.passwdFont:            *-courier-medium-r-*-*-*-140-*-*-*-iso8859-1
+*passwd.thermometer.width:     8
+
+*splash.heading.label:         XScreenSaver %s
+*splash.body.label:            Copyright Â© 1991-1999 by
+*splash.body2.label:           Jamie Zawinski <jwz@jwz.org>
+*splash.demo.label:            Demo
+*splash.prefs.label:           Prefs
+*splash.help.label:            Help
+
+
+! Resources for the Motif dialog boxes of the "xscreensaver-demo" program.
+! 
+*fontList:                       *-helvetica-medium-r-*-*-*-120-*-*-*-iso8859-1
+*demoDialog*label1.fontList:     *-helvetica-medium-r-*-*-*-140-*-*-*-iso8859-1
+*XmTextField.fontList:             *-courier-medium-r-*-*-*-120-*-*-*-iso8859-1
+*label0.fontList:                  *-helvetica-bold-r-*-*-*-140-*-*-*-iso8859-1
+XScreenSaver*XmList.fontList:      *-courier-medium-r-*-*-*-120-*-*-*-iso8859-1
+! Need to fully-qualify the preceeding in the case of of *sgiMode.
+
+*XmDialogShell*foreground:             #000000
+*XmDialogShell*background:             #E5E5E5
+*XmDialogShell*XmTextField.foreground: #000000
+*XmDialogShell*XmTextField.background: #FFFFFF
+*XmDialogShell*demoList.foreground:    #000000
+*XmDialogShell*demoList.background:    #FFFFFF
+
+*XmDialogShell.title:          XScreenSaver
+*versionWarning_popup.title:   XScreenSaver Warning
+*demoForm_popup.title:         XScreenSaver Demo
+*preferencesForm_popup.title:  XScreenSaver Preferences
+*allowShellResize:             True
+*autoUnmanage:                 False
+
+! This doesn't work.  Motif ignores it if there is a scroll-list!
+*demoDialog.maxWidth:          600
+
+*label1.labelString:           XScreenSaver %s
+*label1.label:                 XScreenSaver %s
+*label2.labelString: Copyright Â© 1991-1999 by Jamie Zawinski <jwz@jwz.org>
+*label2.label:      Copyright Â© 1991-1999 by Jamie Zawinski <jwz@jwz.org>
+*demoList.visibleItemCount:    10
+*demoList.automaticSelection:  True
+*next.labelString:             Run Next
+*prev.labelString:             Run Previous
+*edit.labelString:             Preferences
+*restart.labelString:          Reinitialize
+*done.labelString:             Quit
+
+*preferencesLabel.labelString: XScreenSaver Parameters
+
+*timeoutLabel.labelString:     Saver Timeout
+*cycleLabel.labelString:       Cycle Timeout
+*fadeSecondsLabel.labelString: Fade Duration
+*fadeTicksLabel.labelString:   Fade Ticks
+*lockLabel.labelString:                Lock Timeout
+*passwdLabel.labelString:      Password Timeout
+*preferencesForm*XmTextField.columns:  8
+
+*verboseToggle.labelString:    Verbose
+*cmapToggle.labelString:       Install Colormap
+*fadeToggle.labelString:       Fade Colormap
+*unfadeToggle.labelString:     Unfade Colormap
+*lockToggle.labelString:       Require Password
+*preferencesDone.labelString:  OK
+*preferencesCancel.labelString:        Cancel
+
+
+! Disable Motif drag-and-drop in dialog boxes.  This is kind of pathetic, but
+! in some older versions of Motif, most any attempt to drag cause immediate
+! flaming death from above.  This *should* rip the legs off that bug.
+! (But sadly, Lesstif 0.86 and earlier ignore these resources *and* have
+! buggy drag-and-drop.)
+!
+XScreenSaver*dragInitiatorProtocolStyle: DRAG_NONE
+XScreenSaver*dragReceiverProtocolStyle:  DRAG_NONE
+
+
+
+! Resources for the Athena dialog boxes of the "xscreensaver-demo" program.
+! 
+*demo_dialog.title:            XScreenSaver Demo
+*preferences_dialog.title:     XScreenSaver Preferences
+*warning_dialog.title:         XScreenSaver Warning
+
+! For some reason, it doesn't size correctly by itself.
+*demo_dialog.geometry:         =640x400
+
+*demo_dialog*font:             *-helvetica-bold-r-*-*-*-120-*-*-*-iso8859-1
+*preferences_dialog*font:      *-helvetica-bold-r-*-*-*-120-*-*-*-iso8859-1
+*demo_dialog*label1.font:      *-helvetica-bold-r-*-*-*-140-*-*-*-iso8859-1
+*preferences_dialog*label1.font:*-helvetica-bold-r-*-*-*-140-*-*-*-iso8859-1
+XScreenSaver*warning_dialog*label0.font:       \
+                               *-helvetica-bold-r-*-*-*-140-*-*-*-iso8859-1
+XScreenSaver*warning_dialog*Label.font:        \
+                               *-helvetica-bold-r-*-*-*-120-*-*-*-iso8859-1
+XScreenSaver*warning_dialog*Command.font: \
+                               *-helvetica-bold-r-*-*-*-140-*-*-*-iso8859-1
+XScreenSaver.demo_dialog*List.font:    \
+                               *-courier-medium-r-*-*-*-120-*-*-*-iso8859-1
+XScreenSaver.demo_dialog*Text*font:    \
+                               *-courier-medium-r-*-*-*-120-*-*-*-iso8859-1
+
+XScreenSaver.demo_dialog*foreground:                   #000000
+XScreenSaver.demo_dialog*background:                   #E5E5E5
+XScreenSaver.demo_dialog*List.background:              #FFFFFF
+XScreenSaver.demo_dialog*Scrollbar.background:         #D9D9D9
+XScreenSaver.demo_dialog*Command.background:           #D9D9D9
+XScreenSaver.demo_dialog*Text*background:              #FFFFFF
+
+XScreenSaver.preferences_dialog*foreground:            #000000
+XScreenSaver.preferences_dialog*background:            #E5E5E5
+XScreenSaver.preferences_dialog*Command.background:    #D9D9D9
+XScreenSaver.preferences_dialog*Toggle.background:     #D9D9D9
+XScreenSaver.preferences_dialog*Text*background:       #FFFFFF
+
+XScreenSaver.warning_dialog*foreground:                        #000000
+XScreenSaver.warning_dialog*background:                        #E5E5E5
+XScreenSaver.warning_dialog*Command.background:                #D9D9D9
+
+*preferences_dialog*Dialog.value.translations: #override\n\
+       <Key>Return: beginning-of-line()\n
+
+*demo_dialog*viewport.height:                  200
+*Form.borderWidth:                             0
+*Box.borderWidth:                              0
+*Label.borderWidth:                            0
+*preferences_dialog*Dialog.borderWidth:                0
+
+*demo_dialog*run.label:                                Run
+*demo_dialog*next.label:                       Run Next
+*demo_dialog*prev.label:                       Run Previous
+*demo_dialog*edit.label:                       Preferences
+*demo_dialog*restart.label:                    Reinitialize
+*demo_dialog*done.label:                       Quit
+XScreenSaver.demo_dialog*Command.internalWidth:  10
+XScreenSaver.demo_dialog*Command.internalHeight: 4
+
+*preferences_dialog*timeout.label:             Saver Timeout:
+*preferences_dialog*cycle.label:               Cycle Timeout:
+*preferences_dialog*fade.label:                        Fade Duration:
+*preferences_dialog*ticks.label:               Fade Ticks:
+*preferences_dialog*lockTime.label:            Lock Timeout:
+*preferences_dialog*passwdTime.label:          Password Timeout:
+XScreenSaver.preferences_dialog*Command.internalWidth:  10
+XScreenSaver.preferences_dialog*Command.internalHeight: 4
+
+*preferences_dialog*label1.label:              XScreenSaver Parameters
+*preferences_dialog*buttonbox.verbose.label:   Verbose
+*preferences_dialog*buttonbox.cmap.label:      Install Colormap
+*preferences_dialog*buttonbox.fade.label:      Fade Colormap
+*preferences_dialog*buttonbox.unfade.label:    Unfade Colormap
+*preferences_dialog*buttonbox.lock.label:      Require Password
+*preferences_dialog*done.label:                        Ok
+*preferences_dialog*cancel.label:              Cancel
+
+*warning_dialog*ok.label:                      Ok
+
+*warning_dialog*horizDistance:                 30
+*warning_dialog*vertDistance:                  0
+
+*warning_dialog*Label.internalWidth:           1
+*warning_dialog*Label.internalHeight:          0
+
+*warning_dialog*label0.horizDistance:          80
+*warning_dialog*label0.vertDistance:           20
+
+*warning_dialog*Command.horizDistance:         160
+*warning_dialog*Command.vertDistance:          20
+*warning_dialog*Command.internalWidth:         20
+*warning_dialog*Command.internalHeight:                5
diff --git a/driver/XScreenSaver_ad.h b/driver/XScreenSaver_ad.h
new file mode 100644 (file)
index 0000000..104a516
--- /dev/null
@@ -0,0 +1,316 @@
+"*timeout:             10",
+"*cycle:                       10",
+"*lockTimeout:         0",
+"*passwdTimeout:               30",
+"*nice:                        10",
+"*lock:                        False",
+"*lockVTs:             True",
+"*verbose:             False",
+"*timestamp:           False",
+"*fade:                        True",
+"*unfade:              False",
+"*fadeSeconds:         3",
+"*fadeTicks:           20",
+"*splash:              True",
+"*splashDuration:      5",
+"*visualID:            default",
+"*captureStderr:       True",
+"*overlayTextForeground:       #FFFF00",
+"*overlayTextBackground:       #000000",
+"*overlayStderr:               True",
+"*font:                        *-medium-r-*-140-*-m-*",
+"*sgiSaverExtension:   True",
+"*mitSaverExtension:   False",
+"*xidleExtension:      True",
+"*procInterrupts:      True",
+"*demoCommand: xscreensaver-demo",
+"*prefsCommand: xscreensaver-demo -prefs",
+"*helpURL: http://www.jwz.org/xscreensaver/man.html",
+"*loadURL: netscape -remote 'openURL(%s)' || netscape '%s'",
+"*installColormap:     True",
+"*programs:    qix -root -solid -delay 0 -segments 100                 \\n\
+               qix -root -count 4 -solid -transparent                  \\n\
+               qix -root -count 5 -solid -transparent -linear            \
+                       -segments 250 -size 100                         \\n\
+               attraction -root -mode balls                            \\n\
+               attraction -root -mode lines -points 3 -segments 200    \\n\
+               attraction -root -mode splines -segments 300            \\n\
+               attraction -root -mode lines -radius 300                  \
+                       -orbit -vmult 0.5                               \\n\
+               pyro -root                                              \\n\
+               helix -root                                             \\n\
+               pedal -root                                             \\n\
+               rorschach -root -offset 7                               \\n\
+               hopalong -root                                          \\n\
+               greynetic -root                                         \\n\
+               xroger -root                                            \\n\
+               imsmap -root                                            \\n\
+               slidescreen -root                                       \\n\
+               decayscreen -root                                       \\n\
+               jigsaw -root                                            \\n\
+               blitspin -root -grab                                    \\n\
+               slip -root                                              \\n\
+               distort -root                                           \\n\
+               spotlight -root                                         \\n\
+               hypercube -root                                         \\n\
+               halo -root                                              \\n\
+               maze -root                                              \\n\
+               noseguy -root                                           \\n\
+               flame -root                                             \\n\
+               lmorph -root                                            \\n\
+               deco -root                                              \\n\
+               moire -root                                             \\n\
+               moire2 -root                                            \\n\
+               lightning -root                                         \\n\
+               strange -root                                           \\n\
+               spiral -root                                            \\n\
+               laser -root                                             \\n\
+               grav -root                                              \\n\
+               grav -root -trail -decay                                \\n\
+               drift -root                                             \\n\
+               ifs -root                                               \\n\
+               julia -root                                             \\n\
+               penrose -root                                           \\n\
+               sierpinski -root                                        \\n\
+               braid -root                                             \\n\
+               galaxy -root                                            \\n\
+               bouboule -root                                          \\n\
+               swirl -root                                             \\n\
+               flag -root                                              \\n\
+               sphere -root                                            \\n\
+               forest -root                                            \\n\
+               lisa -root                                              \\n\
+               lissie -root                                            \\n\
+               goop -root                                              \\n\
+               starfish -root                                          \\n\
+               starfish -root -blob                                    \\n\
+               munch -root                                             \\n\
+               fadeplot -root                                          \\n\
+               coral -root                                             \\n\
+               mountain -root                                          \\n\
+               triangle -root                                          \\n\
+               worm -root                                              \\n\
+               rotor -root                                             \\n\
+               ant -root                                               \\n\
+               demon -root                                             \\n\
+               loop -root                                              \\n\
+               vines -root                                             \\n\
+               kaleidescope -root                                      \\n\
+               xjack -root                                             \\n\
+  -            xlyap -root -randomize                                  \\n\
+               cynosure -root                                          \\n\
+               flow -root                                              \\n\
+               epicycle -root                                          \\n\
+               interference -root                                      \\n\
+               truchet -root -randomize                                \\n\
+               bsod -root                                              \\n\
+               crystal -root                                           \\n\
+               discrete -root                                          \\n\
+               kumppa -root                                            \\n\
+               rd-bomb -root                                           \\n\
+               rd-bomb -root -speed 1 -size 0.1                        \\n\
+               sonar -root                                             \\n\
+               t3d -root                                               \\n\
+               penetrate -root                                         \\n\
+               deluxe -root                                            \\n\
+               compass -root                                           \\n\
+               squiral -root                                           \\n\
+               xflame -root                                            \\n\
+               wander -root                                            \\n\
+               wander -root -advance 0 -size 10 -circles True            \
+                 -length 10000 -reset 100000                           \\n\
+               critical -root                                          \\n\
+               phosphor -root                                          \\n\
+               xmatrix -root                                           \\n\
+               petri -root -size 1 -count 20                           \\n\
+               petri -root -minlifespeed 0.02 -maxlifespeed 0.03         \
+                  -minlifespan 1 -maxlifespan 1 -instantdeathchan 0      \
+                  -minorchan 0 -anychan 0.3                            \\n\
+               shadebobs -root                                         \\n\
+    default-n:  webcollage -root                                       \\n\
+ -  default-n: webcollage -root -filter 'vidwhacker -stdin -stdout'    \\n\
+ -  default-n: vidwhacker -root                                        \\n\
+                                                                         \
+        mono:  rocks -root                                             \\n\
+       color:  rocks -root -fg darksalmon                              \\n\
+                                                                         \
+        mono:  qix -root -linear -count 5 -size 200 -spread 30           \
+                       -segments 75 -solid -xor                        \\n\
+                                                                         \
+       color:  attraction -root -mode polygons                         \\n\
+       color:  attraction -root -mode filled-splines -segments 0       \\n\
+       color:  attraction -root -glow -points 10                       \\n\
+       color:  bubbles -root                                           \\n\
+                                                                         \
+          GL:  gears -root                                             \\n\
+          GL:  superquadrics -root                                     \\n\
+          GL:  morph3d -root                                           \\n\
+          GL:  cage -root                                              \\n\
+          GL:  moebius -root                                           \\n\
+          GL:  stairs -root                                            \\n\
+          GL:  pipes -root                                             \\n\
+          GL:  sproingies -root                                        \\n\
+          GL:  rubik -root                                             \\n\
+          GL:  atlantis -root                                          \\n\
+          GL:  lament -root                                            \\n\
+          GL:  bubble3d -root                                          \\n\
+          GL:  glplanet -root                                          \\n\
+          GL:  pulsar -root                                            \\n\
+  -       GL:  pulsar -root -texture -mipmap -texture_quality            \
+                      -light -fog                                      \\n",
+" ",
+"XScreenSaver.pointerPollTime:         5",
+"XScreenSaver.initialDelay:            0",
+"XScreenSaver.windowCreationTimeout:   30",
+"XScreenSaver.bourneShell:             /bin/sh",
+"*Dialog.headingFont:          *-times-bold-r-*-*-*-180-*-*-*-iso8859-1",
+"*Dialog.bodyFont:             *-helvetica-bold-r-*-*-*-140-*-*-*-iso8859-1",
+"*Dialog.labelFont:            *-helvetica-bold-r-*-*-*-140-*-*-*-iso8859-1",
+"*Dialog.buttonFont:           *-helvetica-bold-r-*-*-*-140-*-*-*-iso8859-1",
+"*Dialog.foreground:           #000000",
+"*Dialog.background:           #BFBFBF",
+"*Dialog.Button.foreground:    #000000",
+"*Dialog.Button.background:    #D0D0D0",
+"*Dialog.text.foreground:      #000000",
+"*Dialog.text.background:      #FFFFFF",
+"*Dialog.logo.foreground:      #FF0000",
+"*Dialog.logo.background:      #FFFFFF",
+"*Dialog.topShadowColor:               #E7E7E7",
+"*Dialog.bottomShadowColor:    #737373",
+"*Dialog.logo.width:           200",
+"*Dialog.logo.height:          200",
+"*Dialog.internalBorderWidth:  30",
+"*Dialog.borderWidth:          1",
+"*Dialog.shadowThickness:      4",
+"*passwd.heading.label:                XScreenSaver %s",
+"*passwd.body.label:           This display is locked.",
+"*passwd.user.label:           User:",
+"*passwd.passwd.label:         Password:",
+"*passwd.passwdFont:           *-courier-medium-r-*-*-*-140-*-*-*-iso8859-1",
+"*passwd.thermometer.width:    8",
+"*splash.heading.label:                XScreenSaver %s",
+"*splash.body.label:           Copyright Â© 1991-1999 by",
+"*splash.body2.label:          Jamie Zawinski <jwz@jwz.org>",
+"*splash.demo.label:           Demo",
+"*splash.prefs.label:          Prefs",
+"*splash.help.label:           Help",
+"*fontList:                       *-helvetica-medium-r-*-*-*-120-*-*-*-iso8859-1",
+"*demoDialog*label1.fontList:     *-helvetica-medium-r-*-*-*-140-*-*-*-iso8859-1",
+"*XmTextField.fontList:             *-courier-medium-r-*-*-*-120-*-*-*-iso8859-1",
+"*label0.fontList:                  *-helvetica-bold-r-*-*-*-140-*-*-*-iso8859-1",
+"XScreenSaver*XmList.fontList:      *-courier-medium-r-*-*-*-120-*-*-*-iso8859-1",
+"*XmDialogShell*foreground:            #000000",
+"*XmDialogShell*background:            #E5E5E5",
+"*XmDialogShell*XmTextField.foreground:        #000000",
+"*XmDialogShell*XmTextField.background:        #FFFFFF",
+"*XmDialogShell*demoList.foreground:   #000000",
+"*XmDialogShell*demoList.background:   #FFFFFF",
+"*XmDialogShell.title:         XScreenSaver",
+"*versionWarning_popup.title:  XScreenSaver Warning",
+"*demoForm_popup.title:                XScreenSaver Demo",
+"*preferencesForm_popup.title: XScreenSaver Preferences",
+"*allowShellResize:            True",
+"*autoUnmanage:                        False",
+"*demoDialog.maxWidth:         600",
+"*label1.labelString:          XScreenSaver %s",
+"*label1.label:                        XScreenSaver %s",
+"*label2.labelString: Copyright Â© 1991-1999 by Jamie Zawinski <jwz@jwz.org>",
+"*label2.label:             Copyright Â© 1991-1999 by Jamie Zawinski <jwz@jwz.org>",
+"*demoList.visibleItemCount:   10",
+"*demoList.automaticSelection: True",
+"*next.labelString:            Run Next",
+"*prev.labelString:            Run Previous",
+"*edit.labelString:            Preferences",
+"*restart.labelString:         Reinitialize",
+"*done.labelString:            Quit",
+"*preferencesLabel.labelString:        XScreenSaver Parameters",
+"*timeoutLabel.labelString:    Saver Timeout",
+"*cycleLabel.labelString:      Cycle Timeout",
+"*fadeSecondsLabel.labelString:        Fade Duration",
+"*fadeTicksLabel.labelString:  Fade Ticks",
+"*lockLabel.labelString:               Lock Timeout",
+"*passwdLabel.labelString:     Password Timeout",
+"*preferencesForm*XmTextField.columns: 8",
+"*verboseToggle.labelString:   Verbose",
+"*cmapToggle.labelString:      Install Colormap",
+"*fadeToggle.labelString:      Fade Colormap",
+"*unfadeToggle.labelString:    Unfade Colormap",
+"*lockToggle.labelString:      Require Password",
+"*preferencesDone.labelString: OK",
+"*preferencesCancel.labelString:       Cancel",
+"XScreenSaver*dragInitiatorProtocolStyle: DRAG_NONE",
+"XScreenSaver*dragReceiverProtocolStyle:  DRAG_NONE",
+"*demo_dialog.title:           XScreenSaver Demo",
+"*preferences_dialog.title:    XScreenSaver Preferences",
+"*warning_dialog.title:                XScreenSaver Warning",
+"*demo_dialog.geometry:                =640x400",
+"*demo_dialog*font:            *-helvetica-bold-r-*-*-*-120-*-*-*-iso8859-1",
+"*preferences_dialog*font:     *-helvetica-bold-r-*-*-*-120-*-*-*-iso8859-1",
+"*demo_dialog*label1.font:     *-helvetica-bold-r-*-*-*-140-*-*-*-iso8859-1",
+"*preferences_dialog*label1.font:*-helvetica-bold-r-*-*-*-140-*-*-*-iso8859-1",
+"XScreenSaver*warning_dialog*label0.font:      \
+                               *-helvetica-bold-r-*-*-*-140-*-*-*-iso8859-1",
+"XScreenSaver*warning_dialog*Label.font:       \
+                               *-helvetica-bold-r-*-*-*-120-*-*-*-iso8859-1",
+"XScreenSaver*warning_dialog*Command.font: \
+                               *-helvetica-bold-r-*-*-*-140-*-*-*-iso8859-1",
+"XScreenSaver.demo_dialog*List.font:   \
+                               *-courier-medium-r-*-*-*-120-*-*-*-iso8859-1",
+"XScreenSaver.demo_dialog*Text*font:   \
+                               *-courier-medium-r-*-*-*-120-*-*-*-iso8859-1",
+"XScreenSaver.demo_dialog*foreground:                  #000000",
+"XScreenSaver.demo_dialog*background:                  #E5E5E5",
+"XScreenSaver.demo_dialog*List.background:             #FFFFFF",
+"XScreenSaver.demo_dialog*Scrollbar.background:                #D9D9D9",
+"XScreenSaver.demo_dialog*Command.background:          #D9D9D9",
+"XScreenSaver.demo_dialog*Text*background:             #FFFFFF",
+"XScreenSaver.preferences_dialog*foreground:           #000000",
+"XScreenSaver.preferences_dialog*background:           #E5E5E5",
+"XScreenSaver.preferences_dialog*Command.background:   #D9D9D9",
+"XScreenSaver.preferences_dialog*Toggle.background:    #D9D9D9",
+"XScreenSaver.preferences_dialog*Text*background:      #FFFFFF",
+"XScreenSaver.warning_dialog*foreground:                       #000000",
+"XScreenSaver.warning_dialog*background:                       #E5E5E5",
+"XScreenSaver.warning_dialog*Command.background:               #D9D9D9",
+"*preferences_dialog*Dialog.value.translations: #override\\n\
+       <Key>Return: beginning-of-line()\\n",
+"*demo_dialog*viewport.height:                 200",
+"*Form.borderWidth:                            0",
+"*Box.borderWidth:                             0",
+"*Label.borderWidth:                           0",
+"*preferences_dialog*Dialog.borderWidth:               0",
+"*demo_dialog*run.label:                               Run",
+"*demo_dialog*next.label:                      Run Next",
+"*demo_dialog*prev.label:                      Run Previous",
+"*demo_dialog*edit.label:                      Preferences",
+"*demo_dialog*restart.label:                   Reinitialize",
+"*demo_dialog*done.label:                      Quit",
+"XScreenSaver.demo_dialog*Command.internalWidth:  10",
+"XScreenSaver.demo_dialog*Command.internalHeight: 4",
+"*preferences_dialog*timeout.label:            Saver Timeout:",
+"*preferences_dialog*cycle.label:              Cycle Timeout:",
+"*preferences_dialog*fade.label:                       Fade Duration:",
+"*preferences_dialog*ticks.label:              Fade Ticks:",
+"*preferences_dialog*lockTime.label:           Lock Timeout:",
+"*preferences_dialog*passwdTime.label:         Password Timeout:",
+"XScreenSaver.preferences_dialog*Command.internalWidth:  10",
+"XScreenSaver.preferences_dialog*Command.internalHeight: 4",
+"*preferences_dialog*label1.label:             XScreenSaver Parameters",
+"*preferences_dialog*buttonbox.verbose.label:  Verbose",
+"*preferences_dialog*buttonbox.cmap.label:     Install Colormap",
+"*preferences_dialog*buttonbox.fade.label:     Fade Colormap",
+"*preferences_dialog*buttonbox.unfade.label:   Unfade Colormap",
+"*preferences_dialog*buttonbox.lock.label:     Require Password",
+"*preferences_dialog*done.label:                       Ok",
+"*preferences_dialog*cancel.label:             Cancel",
+"*warning_dialog*ok.label:                     Ok",
+"*warning_dialog*horizDistance:                        30",
+"*warning_dialog*vertDistance:                 0",
+"*warning_dialog*Label.internalWidth:          1",
+"*warning_dialog*Label.internalHeight:         0",
+"*warning_dialog*label0.horizDistance:         80",
+"*warning_dialog*label0.vertDistance:          20",
+"*warning_dialog*Command.horizDistance:                160",
+"*warning_dialog*Command.vertDistance:         20",
+"*warning_dialog*Command.internalWidth:                20",
+"*warning_dialog*Command.internalHeight:               5",
diff --git a/driver/compile_axp.com b/driver/compile_axp.com
new file mode 100644 (file)
index 0000000..d6ed0e8
--- /dev/null
@@ -0,0 +1,15 @@
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-],[-.UTILS]) DEMO.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-],[-.UTILS]) DIALOGS-XM.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-],[-.UTILS]) LOCK.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-],[-.UTILS]) PASSWD.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-],[-.UTILS]) STDERR.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,NO_SETUID)/INCL=([],[-],[-.UTILS]) SUBPROCS.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-],[-.UTILS]) TIMERS.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-],[-.UTILS]) WINDOWS.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-],[-.UTILS]) XSCREENSAVER-COMMAND.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,NO_SETUID)/INCL=([],[-],[-.UTILS]) XSCREENSAVER.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-],[-.UTILS]) XSET.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-],[-.UTILS]) VMS-GETPWNAM.C
+$!!! CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-],[-.UTILS]) GETPWUID.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-],[-.UTILS]) VMS-HPWD.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-],[-.UTILS]) VMS-VALIDATE.C
diff --git a/driver/compile_decc.com b/driver/compile_decc.com
new file mode 100644 (file)
index 0000000..d6ed0e8
--- /dev/null
@@ -0,0 +1,15 @@
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-],[-.UTILS]) DEMO.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-],[-.UTILS]) DIALOGS-XM.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-],[-.UTILS]) LOCK.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-],[-.UTILS]) PASSWD.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-],[-.UTILS]) STDERR.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,NO_SETUID)/INCL=([],[-],[-.UTILS]) SUBPROCS.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-],[-.UTILS]) TIMERS.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-],[-.UTILS]) WINDOWS.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-],[-.UTILS]) XSCREENSAVER-COMMAND.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,NO_SETUID)/INCL=([],[-],[-.UTILS]) XSCREENSAVER.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-],[-.UTILS]) XSET.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-],[-.UTILS]) VMS-GETPWNAM.C
+$!!! CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-],[-.UTILS]) GETPWUID.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-],[-.UTILS]) VMS-HPWD.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-],[-.UTILS]) VMS-VALIDATE.C
diff --git a/driver/demo.c b/driver/demo.c
new file mode 100644 (file)
index 0000000..2e38746
--- /dev/null
@@ -0,0 +1,1859 @@
+/* demo.c --- implements the interactive demo-mode and options dialogs.
+ * xscreensaver, Copyright (c) 1993-1998 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software 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.  No representations are made about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or 
+ * implied warranty.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+
+#ifdef FORCE_ATHENA
+# undef HAVE_MOTIF
+# undef HAVE_GTK
+# define HAVE_ATHENA 1
+#endif
+#ifdef FORCE_GTK
+# undef HAVE_MOTIF
+# undef HAVE_ATHENA
+# define HAVE_GTK 1
+#endif
+#ifdef FORCE_MOTIF
+# undef HAVE_GTK
+# undef HAVE_ATHENA
+# define HAVE_MOTIF 1
+#endif
+
+/* Only one, please. */
+#ifdef HAVE_MOTIF
+# undef HAVE_ATHENA
+# undef HAVE_GTK
+#endif
+#ifdef HAVE_GTK
+# undef HAVE_MOTIF
+# undef HAVE_ATHENA
+#endif
+#ifdef HAVE_ATHENA
+# undef HAVE_MOTIF
+# undef HAVE_GTK
+#endif
+
+
+#include <stdlib.h>
+
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+
+#ifndef VMS
+# include <pwd.h>              /* for getpwuid() */
+#else /* VMS */
+# include "vms-pwd.h"
+#endif /* VMS */
+
+#ifdef HAVE_UNAME
+# include <sys/utsname.h>      /* for uname() */
+#endif /* HAVE_UNAME */
+
+#include <stdio.h>
+
+#include <X11/Intrinsic.h>
+#include <X11/StringDefs.h>
+
+/* We don't actually use any widget internals, but these are included
+   so that gdb will have debug info for the widgets... */
+#include <X11/IntrinsicP.h>
+#include <X11/ShellP.h>
+
+#ifdef HAVE_XMU
+# ifndef VMS
+#  include <X11/Xmu/Error.h>
+# else /* VMS */
+#  include <Xmu/Error.h>
+# endif
+#else
+# include "xmu.h"
+#endif
+
+
+#ifdef HAVE_MOTIF
+# include <Xm/Xm.h>
+# include <Xm/Text.h>
+# include <Xm/List.h>
+# include <Xm/ToggleB.h>
+# include <Xm/MessageB.h>
+# include <Xm/LabelG.h>
+# include <Xm/RowColumn.h>
+
+#elif defined(HAVE_ATHENA)
+  /* Athena demo code contributed by Jon A. Christopher <jac8782@tamu.edu> */
+  /* Copyright 1997, with the same permissions as above. */
+# include <X11/Shell.h>
+# include <X11/Xaw/Form.h>
+# include <X11/Xaw/Box.h>
+# include <X11/Xaw/List.h>
+# include <X11/Xaw/Command.h>
+# include <X11/Xaw/Toggle.h>
+# include <X11/Xaw/Viewport.h>
+# include <X11/Xaw/Dialog.h>
+# include <X11/Xaw/Scrollbar.h>
+# include <X11/Xaw/Text.h>
+
+#elif defined(HAVE_GTK)
+# include <gtk/gtk.h>
+extern Display *gdk_display;
+#endif /* HAVE_ATHENA */
+
+#include "version.h"
+#include "prefs.h"
+#include "resources.h"         /* for parse_time() */
+#include "visual.h"            /* for has_writable_cells() */
+#include "remote.h"            /* for xscreensaver_command() */
+#include "usleep.h"
+
+#include <stdio.h>
+#include <string.h>
+#include <ctype.h>
+
+#ifdef HAVE_GTK
+# define WIDGET GtkWidget *
+# define POINTER gpointer
+#else
+# define WIDGET Widget
+# define POINTER XtPointer
+#endif
+
+
+
+char *progname = 0;
+char *progclass = "XScreenSaver";
+XrmDatabase db;
+
+typedef struct {
+  saver_preferences *a, *b;
+} prefs_pair;
+
+
+char *blurb (void) { return progname; }
+
+static void run_hack (Display *dpy, int n);
+
+#ifdef HAVE_ATHENA
+static saver_preferences *global_prefs_kludge = 0;    /* I hate C so much... */
+#endif /* HAVE_ATHENA */
+
+static char *short_version = 0;
+
+Atom XA_VROOT;
+Atom XA_SCREENSAVER, XA_SCREENSAVER_RESPONSE, XA_SCREENSAVER_VERSION;
+Atom XA_SCREENSAVER_TIME, XA_SCREENSAVER_ID, XA_SELECT, XA_DEMO, XA_RESTART;
+
+extern void create_demo_dialog (Widget, Visual *, Colormap);
+extern void create_preferences_dialog (Widget, Visual *, Colormap);
+
+extern WIDGET demo_dialog;
+extern WIDGET label1;
+extern WIDGET text_line;
+extern WIDGET text_activate;
+extern WIDGET demo_form;
+extern WIDGET demo_list;
+extern WIDGET next;
+extern WIDGET prev;
+extern WIDGET done;
+extern WIDGET restart;
+extern WIDGET edit;
+
+extern WIDGET preferences_dialog;
+extern WIDGET preferences_form;
+extern WIDGET prefs_done;
+extern WIDGET prefs_cancel;
+extern WIDGET timeout_text;
+extern WIDGET cycle_text;
+extern WIDGET fade_text;
+extern WIDGET fade_ticks_text;
+extern WIDGET lock_timeout_text;
+extern WIDGET passwd_timeout_text;
+extern WIDGET verbose_toggle;
+extern WIDGET install_cmap_toggle;
+extern WIDGET fade_toggle;
+extern WIDGET unfade_toggle;
+extern WIDGET lock_toggle;
+
+
+#ifdef HAVE_MOTIF
+
+# define set_toggle_button_state(toggle,state) \
+  XmToggleButtonSetState ((toggle), (state), True)
+# define set_text_string(text_widget,string) \
+  XmTextSetString ((text_widget), (string))
+# define add_button_callback(button,cb,arg) \
+  XtAddCallback ((button), XmNactivateCallback, (cb), (arg))
+# define add_toggle_callback(button,cb,arg) \
+  XtAddCallback ((button), XmNvalueChangedCallback, (cb), (arg))
+# define add_text_callback add_toggle_callback
+# define disable_widget(widget) \
+  XtVaSetValues((widget), XtNsensitive, False, 0)
+# define widget_name(widget) XtName(widget)
+# define widget_display(widget) XtDisplay(widget)
+# define widget_screen(widget) XtScreen(widget)
+# define CB_ARGS(a,b,c) (a,b,c)
+
+#elif defined(HAVE_ATHENA)
+
+# define set_toggle_button_state(toggle,state) \
+  XtVaSetValues((toggle), XtNstate, (state),  0)
+# define set_text_string(text_widget,string) \
+  XtVaSetValues ((text_widget), XtNvalue, (string), 0)
+# define add_button_callback(button,cb,arg) \
+  XtAddCallback ((button), XtNcallback, (cb), (arg))
+# define add_toggle_callback add_button_callback
+# define add_text_callback(b,c,a) ERROR!
+# define disable_widget(widget) \
+  XtVaSetValues((widget), XtNsensitive, False, 0)
+# define widget_name(widget) XtName(widget)
+# define widget_display(widget) XtDisplay(widget)
+# define widget_screen(widget) XtScreen(widget)
+# define CB_ARGS(a,b,c) (a,b,c)
+
+#elif defined(HAVE_GTK)
+
+# define set_toggle_button_state(toggle,state) \
+  gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(toggle),(state))
+# define set_text_string(text_widget,string) \
+  gtk_entry_set_text (GTK_ENTRY (text_widget), (string))
+# define add_button_callback(button,cb,arg) \
+  gtk_signal_connect_object (GTK_OBJECT (button), "clicked", \
+                             GTK_SIGNAL_FUNC (cb), (arg))
+# define add_toggle_callback(button,cb,arg) \
+  gtk_signal_connect_object (GTK_OBJECT (button), "toggled", \
+                             GTK_SIGNAL_FUNC (cb), (arg))
+# define add_text_callback(button,cb,arg) \
+  gtk_signal_connect_object (GTK_OBJECT (button), "activate", \
+                             GTK_SIGNAL_FUNC (cb), (arg))
+# define disable_widget(widget) \
+  gtk_widget_set_sensitive (GTK_WIDGET(widget), FALSE)
+# define widget_name(widget) gtk_widget_get_name(GTK_WIDGET(widget))
+# define widget_display(widget) (gdk_display)
+# define widget_screen(widget) (DefaultScreenOfDisplay(widget_display(widget)))
+# define CB_ARGS(a,b,c) (b,a)
+
+#endif /* HAVE_GTK */
+
+
+
+
+static char *
+get_text_string (WIDGET text_widget)
+{
+#ifdef HAVE_MOTIF
+  return XmTextGetString (text_widget);
+#elif defined(HAVE_ATHENA)
+  char *string = 0;
+  if (XtIsSubclass(text_widget, textWidgetClass))
+    XtVaGetValues (text_widget, XtNstring, &string, 0);
+  else if (XtIsSubclass(text_widget, dialogWidgetClass))
+    XtVaGetValues (text_widget, XtNvalue, &string, 0);
+  else
+    string = 0;
+
+  return string;
+#elif defined(HAVE_GTK)
+  return gtk_entry_get_text (GTK_ENTRY (text_widget));
+#endif /* HAVE_GTK */
+}
+
+
+static char *
+get_label_string (WIDGET label_widget)
+{
+#ifdef HAVE_MOTIF
+  char *label = 0;
+  XmString xm_label = 0;
+  XtVaGetValues (label_widget, XmNlabelString, &xm_label, 0);
+  if (!xm_label)
+    return 0;
+  XmStringGetLtoR (xm_label, XmSTRING_DEFAULT_CHARSET, &label);
+  return label;
+#elif defined(HAVE_ATHENA)
+  char *label = 0;
+  XtVaGetValues (label_widget, XtNlabel, &label, 0);
+  return (label ? strdup(label) : 0);
+#elif defined(HAVE_GTK)
+  char *label = 0;
+  gtk_label_get (GTK_LABEL (label_widget), &label);
+  return label;
+#endif /* HAVE_GTK */
+}
+
+
+static void
+set_label_string (WIDGET label_widget, char *string)
+{
+#ifdef HAVE_MOTIF
+  XmString xm_string = XmStringCreate (string, XmSTRING_DEFAULT_CHARSET);
+  XtVaSetValues (label_widget, XmNlabelString, xm_string, 0);
+  XmStringFree (xm_string);
+#elif defined(HAVE_ATHENA)
+  XtVaSetValues (label_widget, XtNlabel, string, 0);
+#elif defined(HAVE_GTK)
+  gtk_label_set_text (GTK_LABEL (label_widget), string);
+#endif /* HAVE_GTK */
+}
+
+
+/* Given a label widget that has a %s in it, do the printf thing.
+   If the label's string is obviously wrong, complain about resource lossage.
+ */
+static void
+format_into_label (WIDGET label, const char *arg)
+{
+  char *text = get_label_string (label);
+  char *buf = (char *) malloc ((text ? strlen(text) : 0) + strlen(arg) + 100);
+
+  if (!text || !*text || !strcmp (text, widget_name (label)))
+      strcpy (buf, "ERROR: RESOURCES ARE NOT INSTALLED CORRECTLY");
+    else
+      sprintf (buf, text, arg);
+
+    set_label_string (label, buf);
+    free (buf);
+
+# ifndef HAVE_GTK
+    XtFree (text);
+# endif /* HAVE_GTK */
+}
+
+
+/* Why this behavior isn't automatic in *either* toolkit, I'll never know.
+ */
+static void
+ensure_selected_item_visible (WIDGET list)
+{
+#ifdef HAVE_MOTIF
+  int *pos_list = 0;
+  int pos_count = 0;
+  if (XmListGetSelectedPos (list, &pos_list, &pos_count) && pos_count > 0)
+    {
+      int top = -2;
+      int visible = 0;
+      XtVaGetValues (list,
+                    XmNtopItemPosition, &top,
+                    XmNvisibleItemCount, &visible,
+                    0);
+      if (pos_list[0] >= top + visible)
+       {
+         int pos = pos_list[0] - visible + 1;
+         if (pos < 0) pos = 0;
+         XmListSetPos (list, pos);
+       }
+      else if (pos_list[0] < top)
+       {
+         XmListSetPos (list, pos_list[0]);
+       }
+    }
+  if (pos_list)
+    XtFree ((char *) pos_list);
+
+#elif defined(HAVE_ATHENA)
+# ifdef HAVE_XawViewportSetCoordinates
+
+  int margin = 16;     /* should be line height or something. */
+  int count = 0;
+  int pos;
+  Dimension list_h = 0, vp_h = 0;
+  Dimension top_margin = 4;  /* I don't know where this value comes from */
+  Position vp_x = 0, vp_y = 0, current_y;
+  double cratio;
+  Widget viewport = XtParent(demo_list);
+  Widget sb = (viewport ? XtNameToWidget(viewport, "*vertical") : 0);
+  float sb_top = 0, sb_size = 0;
+  XawListReturnStruct *current = XawListShowCurrent(demo_list);
+  if (!current || !sb) return;
+
+  XtVaGetValues(demo_list,
+               XtNnumberStrings, &count,
+               XtNheight, &list_h,
+               0);
+  if (count < 2 || list_h < 10) return;
+
+  XtVaGetValues(viewport, XtNheight, &vp_h, XtNx, &vp_x, XtNy, &vp_y, 0);
+  if (vp_h < 10) return;
+
+  XtVaGetValues(sb, XtNtopOfThumb, &sb_top, XtNshown, &sb_size, 0);
+  if (sb_size <= 0) return;
+
+  pos = current->list_index;
+  cratio = ((double) pos)  / ((double) count);
+  current_y = (cratio * list_h);
+
+  if (cratio < sb_top ||
+      cratio > sb_top + sb_size)
+    {
+      if (cratio < sb_top)
+       current_y -= (vp_h - margin - margin);
+      else
+       current_y -= margin;
+
+      if ((long)current_y >= (long) list_h)
+       current_y = (Position) ((long)list_h - (long)vp_h);
+
+      if ((long)current_y < (long)top_margin)
+       current_y = (Position)top_margin;
+
+      XawViewportSetCoordinates (viewport, vp_x, current_y);
+    }
+# endif /* HAVE_XawViewportSetCoordinates */
+#elif defined(HAVE_GTK)
+
+  GtkScrolledWindow *scroller = GTK_SCROLLED_WINDOW (list);
+  GtkViewport *vp = GTK_VIEWPORT (GTK_BIN(scroller)->child);
+  GtkList *list_widget = GTK_LIST (GTK_BIN(vp)->child);
+  GList *kids;
+  int nkids = 0;
+  GtkWidget *selected = 0;
+  int which = -1;
+  GtkAdjustment *adj;
+  gint parent_h, child_y, child_h, children_h, ignore;
+  double ratio_t, ratio_b;
+
+  GList *slist = list_widget->selection;
+  selected = (slist ? GTK_WIDGET (slist->data) : 0);
+  if (!selected)
+    return;
+
+  which = gtk_list_child_position (list_widget, GTK_WIDGET (selected));
+
+  for (kids = gtk_container_children (GTK_CONTAINER (list_widget));
+       kids; kids = kids->next)
+    nkids++;
+
+  adj = gtk_scrolled_window_get_vadjustment (scroller);                        
+
+  gdk_window_get_geometry (GTK_WIDGET(vp)->window,
+                           &ignore, &ignore, &ignore, &parent_h, &ignore);
+  gdk_window_get_geometry (GTK_WIDGET(selected)->window,
+                           &ignore, &child_y, &ignore, &child_h, &ignore);
+  children_h = nkids * child_h;
+
+  ratio_t = ((double) child_y) / ((double) children_h);
+  ratio_b = ((double) child_y + child_h) / ((double) children_h);
+
+  if (ratio_t < (adj->value / adj->upper) ||
+      ratio_b > ((adj->value + adj->page_size) / adj->upper))
+    {
+      double target;
+
+      if (ratio_t < (adj->value / adj->upper))
+        {
+          double ratio_w = ((double) parent_h) / ((double) children_h);
+          double ratio_l = (ratio_b - ratio_t);
+          target = ((ratio_t - ratio_w + ratio_l) * adj->upper);
+        }
+      else /* if (ratio_b > ((adj->value + adj->page_size) / adj->upper))*/
+        {
+          target = ratio_t * adj->upper;
+        }
+
+      if (target > adj->upper - adj->page_size)
+        target = adj->upper - adj->page_size;
+      if (target < 0)
+        target = 0;
+
+      gtk_adjustment_set_value (adj, target);
+    }
+
+
+#endif /* HAVE_GTK */
+}
+
+
+/* Callback for the text area:
+   - note the text the user has entered;
+   - change the corresponding element in `screenhacks';
+   - write the .xscreensaver file;
+   - tell the xscreensaver daemon to run that hack.
+
+   (Note: in GTK, this one has a different arg list than the other callbacks.)
+ */
+static void
+#ifdef HAVE_GTK
+text_cb (WIDGET text_widget, POINTER client_data)
+#else  /* !HAVE_GTK */
+text_cb (WIDGET text_widget, POINTER client_data, POINTER call_data)
+#endif /* !HAVE_GTK */
+{
+  saver_preferences *p = (saver_preferences *) client_data;
+  char *new_text = get_text_string (text_widget);
+  Display *dpy = widget_display (text_widget);
+  Bool save = TRUE;
+
+  int hack_number = -1;                /* 0-based */
+
+#ifdef HAVE_ATHENA
+  XawListReturnStruct *current = XawListShowCurrent(demo_list);
+  hack_number = current->list_index;
+#elif defined(HAVE_MOTIF)
+  int *pos_list = 0;
+  int pos_count = 0;
+  if (XmListGetSelectedPos (demo_list, &pos_list, &pos_count))
+    hack_number = pos_list[0] - 1;
+  if (pos_list)
+    XtFree ((char *) pos_list);
+#elif defined(HAVE_GTK)
+  GList *slist =
+    GTK_LIST (GTK_BIN(GTK_BIN(demo_list)->child)->child)->selection;
+  GtkWidget *selected = (slist ? GTK_WIDGET (slist->data) : 0);
+  if (selected)
+    hack_number =
+      gtk_list_child_position (
+                         GTK_LIST (GTK_BIN(GTK_BIN(demo_list)->child)->child),
+                         GTK_WIDGET (selected));
+#endif /* HAVE_GTK */
+
+  ensure_selected_item_visible (demo_list);
+
+  if (hack_number < 0 || hack_number >= p->screenhacks_count)
+    {
+      set_text_string (text_widget, "");
+#ifdef HAVE_GTK
+      gdk_beep();
+#else  /* !HAVE_GTK */
+      XBell (XtDisplay (text_widget), 0);
+#endif /* !HAVE_GTK */
+    }
+  else
+    {
+      if (p->screenhacks [hack_number])
+       free (p->screenhacks [hack_number]);
+      p->screenhacks [hack_number] = strdup (new_text);
+
+#ifdef HAVE_MOTIF
+
+      XmListDeselectAllItems (demo_list);
+      {
+       XmString xmstr = XmStringCreate (new_text, XmSTRING_DEFAULT_CHARSET);
+       XmListReplaceItemsPos (demo_list, &xmstr, 1, hack_number+1);
+       XmStringFree (xmstr);
+      }
+      XmListSelectPos (demo_list, hack_number+1, True);
+
+#elif defined(HAVE_ATHENA)
+
+      {
+       Widget vp = XtParent(demo_list);
+       Widget sb = (vp ? XtNameToWidget(vp, "*vertical") : 0);
+       Dimension list_h = 0;
+       Position vp_x = 0, vp_y = 0;
+       float sb_top = 0;
+
+       XawListUnhighlight (demo_list);
+
+       XtVaGetValues (vp, XtNx, &vp_x, 0);
+       XtVaGetValues (sb, XtNtopOfThumb, &sb_top, 0);
+       XtVaGetValues (demo_list, XtNheight, &list_h, 0);
+       vp_y = (sb_top * list_h);
+       XtVaSetValues (demo_list,
+                      XtNlist, p->screenhacks,
+                      XtNnumberStrings, p->screenhacks_count,
+                      0);
+       XawViewportSetCoordinates (vp, vp_x, vp_y);
+       XawListHighlight (demo_list, hack_number);
+      }
+
+#elif defined(HAVE_GTK)
+      {
+        GtkList *list_widget =
+          GTK_LIST (GTK_BIN(GTK_BIN(demo_list)->child)->child);
+        GList *slist = list_widget->selection;
+        GtkWidget *selected = (slist ? GTK_WIDGET (slist->data) : 0);
+        GtkLabel *label = (selected
+                           ? GTK_LABEL (GTK_BIN (selected)->child) : 0);
+        char *old_text = 0;
+        gtk_label_get (label, &old_text);
+        save = !!strcmp (new_text, old_text);
+        if (label)
+          gtk_label_set_text (label, new_text);
+      }
+#endif /* HAVE_GTK */
+
+      if (save)
+        write_init_file (p, short_version);
+
+      XSync (dpy, False);
+      usleep (500000);         /* give the disk time to settle down */
+
+      run_hack (dpy, hack_number+1);
+    }
+}
+
+
+#ifdef HAVE_ATHENA
+/* Bend over backwards to make hitting Return in the text field do the
+   right thing. 
+   */
+static void text_enter (Widget w, XEvent *event, String *av, Cardinal *ac)
+{
+  text_cb (w, global_prefs_kludge, 0);   /* I hate C so much... */
+}
+
+static XtActionsRec actions[] = {{"done",      text_enter}
+                               };
+static char translations[] = ("<Key>Return:    done()\n"
+                             "<Key>Linefeed:   done()\n"
+                             "Ctrl<Key>M:      done()\n"
+                             "Ctrl<Key>J:      done()\n");
+#endif /* HAVE_ATHENA */
+
+
+#ifdef HAVE_GTK
+/* Helper for the Gtk versions of the Run Next and Run Previous buttons.
+ */
+static void
+next_internal (GtkEntry *entry, gboolean next_p)
+{
+  GtkScrolledWindow *scroller = GTK_SCROLLED_WINDOW (demo_list);
+  GtkList *list_widget = GTK_LIST(GTK_BIN(GTK_BIN(scroller)->child)->child);
+  GtkWidget *target = 0;
+  GList *kids;
+  int nkids = 0;
+  int n;
+
+  GList *slist = list_widget->selection;
+  target = (slist ? GTK_WIDGET (slist->data) : 0);
+
+  for (kids = gtk_container_children (GTK_CONTAINER (list_widget));
+       kids; kids = kids->next)
+    nkids++;
+
+  if (target)
+    {
+      n = gtk_list_child_position (GTK_LIST (list_widget), target);
+      n += (next_p ? 1 : -1);
+      if (n >= nkids) n = 0;
+      if (n < 0) n = nkids-1;
+    }
+  else if (next_p)
+    n = 0;
+  else
+    n = nkids-1;
+
+  gtk_list_select_item (GTK_LIST (list_widget), n);
+
+  ensure_selected_item_visible ((WIDGET) scroller);
+
+  run_hack (widget_display (scroller), n + 1);
+}
+
+#endif /* HAVE_GTK */
+
+
+
+/* Callback for the Run Next button.
+ */
+static void
+next_cb CB_ARGS(WIDGET button, POINTER client_data, POINTER ignored)
+{
+#ifdef HAVE_ATHENA
+  XawListReturnStruct *current = XawListShowCurrent(demo_list);
+  int cnt;
+  XtVaGetValues (demo_list, XtNnumberStrings, &cnt, 0);
+  if (current->list_index == XAW_LIST_NONE ||
+      current->list_index + 1 >= cnt)
+    current->list_index = 0;
+  else
+    current->list_index++;
+  XawListHighlight(demo_list, current->list_index);
+
+  ensure_selected_item_visible (demo_list);
+  current = XawListShowCurrent(demo_list);
+  XtVaSetValues(text_line, XtNstring, current->string, 0);
+
+  run_hack (XtDisplay (button), current->list_index + 1);
+
+#elif defined(HAVE_MOTIF)
+
+  saver_preferences *p = (saver_preferences *) client_data;
+  int *pos_list = 0;
+  int pos_count = 0;
+  int pos;
+  if (! XmListGetSelectedPos (demo_list, &pos_list, &pos_count))
+    {
+      pos = 1;
+      XmListDeselectAllItems (demo_list);      /* LessTif lossage */
+      XmListSelectPos (demo_list, pos, True);
+    }
+  else
+    {
+      pos = pos_list[0] + 1;
+      if (pos > p->screenhacks_count)
+       pos = 1;
+      XmListDeselectAllItems (demo_list);      /* LessTif lossage */
+      XmListSelectPos (demo_list, pos, True);
+    }
+     
+  ensure_selected_item_visible (demo_list);
+  run_hack (XtDisplay (button), pos);
+  if (pos_list)
+    XtFree ((char *) pos_list);
+
+#elif defined(HAVE_GTK)
+  next_internal (GTK_ENTRY (text_line), TRUE);
+#endif /* HAVE_GTK */
+}
+
+
+/* Callback for the Run Previous button.
+ */
+static void
+prev_cb CB_ARGS(WIDGET button, POINTER client_data, POINTER ignored)
+{
+#ifdef HAVE_ATHENA
+  XawListReturnStruct *current = XawListShowCurrent(demo_list);
+  int cnt;
+  XtVaGetValues (demo_list, XtNnumberStrings, &cnt, 0);
+  if (current->list_index == XAW_LIST_NONE ||
+      current->list_index <= 0)
+    current->list_index = cnt-1;
+  else
+    current->list_index--;
+  XawListHighlight(demo_list, current->list_index);
+
+  ensure_selected_item_visible (demo_list);
+  current = XawListShowCurrent(demo_list);
+  XtVaSetValues(text_line, XtNstring, current->string, 0);
+
+  run_hack (XtDisplay (button), current->list_index + 1);
+
+#elif defined(HAVE_MOTIF)
+
+  saver_preferences *p = (saver_preferences *) client_data;
+  int *pos_list = 0;
+  int pos_count = 0;
+  int pos;
+  if (! XmListGetSelectedPos (demo_list, &pos_list, &pos_count))
+    {
+      pos = p->screenhacks_count;
+      XmListDeselectAllItems (demo_list);      /* LessTif lossage */
+      XmListSelectPos (demo_list, pos, True);
+    }
+  else
+    {
+      pos = pos_list[0] - 1;
+      if (pos == 0)
+       pos = p->screenhacks_count;
+      XmListDeselectAllItems (demo_list);      /* LessTif lossage */
+      XmListSelectPos (demo_list, pos, True);
+    }
+     
+  ensure_selected_item_visible (demo_list);
+  run_hack (XtDisplay (button), pos);
+  if (pos_list)
+    XtFree ((char *) pos_list);
+
+#elif defined(HAVE_GTK)
+  next_internal (GTK_ENTRY (text_line), FALSE);
+#endif /* HAVE_GTK */
+}
+
+
+/* Callback run when a list element is double-clicked.
+   (Note: in GTK, this one has a different arg list than the other callbacks.)
+ */
+#ifdef HAVE_GTK
+static gint
+select_cb (GtkWidget *button, GdkEventButton *event, gpointer client_data)
+#else  /* !HAVE_GTK */
+static void
+select_cb (WIDGET button, POINTER client_data, POINTER call_data)
+#endif /* !HAVE_GTK */
+{
+/*  saver_preferences *p = (saver_preferences *) client_data; */
+
+#ifdef HAVE_ATHENA
+  XawListReturnStruct *item = (XawListReturnStruct*)call_data;
+  XtVaSetValues(text_line, XtNstring, item->string, 0);
+  run_hack (XtDisplay (button), item->list_index + 1);
+
+#elif defined(HAVE_MOTIF)
+  XmListCallbackStruct *lcb = (XmListCallbackStruct *) call_data;
+  char *string = 0;
+  if (lcb->item)
+    XmStringGetLtoR (lcb->item, XmSTRING_DEFAULT_CHARSET, &string);
+  set_text_string (text_line, (string ? string : ""));
+
+  if (lcb->reason == XmCR_DEFAULT_ACTION && string)
+    run_hack (XtDisplay (button), lcb->item_position);
+
+  if (string)
+    XtFree (string);
+
+#elif defined(HAVE_GTK)
+  char *string = 0;
+  gtk_label_get (GTK_LABEL (GTK_BIN(button)->child), &string);
+  set_text_string (text_line, (string ? string : ""));
+
+  if (event->type == GDK_2BUTTON_PRESS)
+    {
+      GtkViewport *vp = GTK_VIEWPORT (GTK_BIN(demo_list)->child);
+      GtkList *lw = GTK_LIST (GTK_BIN(vp)->child);
+      int which = gtk_list_child_position (lw, GTK_WIDGET (button));
+      run_hack (gdk_display, which + 1);
+    }
+
+  return FALSE;
+#endif /* HAVE_GTK */
+}
+
+
+static void pop_preferences_dialog (prefs_pair *pair);
+static void make_preferences_dialog (prefs_pair *pair, Widget parent);
+
+/* Callback for the Preferences button.
+ */
+static void
+preferences_cb CB_ARGS(WIDGET button, POINTER client_data, POINTER ignored)
+{
+  prefs_pair *pair = (prefs_pair *) client_data;
+#ifdef HAVE_GTK
+  Widget parent = 0;
+#else /* !HAVE_GTK */
+  Widget parent = button;
+
+  do {
+    parent = XtParent(parent);
+  } while (XtParent(parent));
+#endif /* !HAVE_GTK */
+
+  if (! preferences_dialog)
+    make_preferences_dialog (pair, parent);
+  *pair->b = *pair->a;
+  pop_preferences_dialog (pair);
+}
+
+
+/* Callback for the Quit button.
+ */
+static void
+quit_cb CB_ARGS(WIDGET button, POINTER client_data, POINTER ignored)
+{
+  /* Save here?  Right now we don't need to, because we save every time
+     the text field is edited, or the Preferences OK button is pressed.
+  */
+  exit (0);
+}
+
+
+/* Callback for the (now unused) Restart button.
+ */
+static void
+restart_cb CB_ARGS(WIDGET button, POINTER client_data, POINTER ignored)
+{
+  xscreensaver_command (widget_display (button), XA_RESTART, 0, False);
+}
+
+
+static void
+pop_up_dialog_box (WIDGET dialog, WIDGET form)
+{
+#ifdef HAVE_ATHENA
+  XtRealizeWidget (dialog);
+  XtPopup (dialog, XtGrabNone);
+#elif defined(HAVE_MOTIF)
+  XtRealizeWidget (form);
+  XtManageChild (form);
+#endif /* HAVE_MOTIF */
+
+#ifdef HAVE_GTK
+  gtk_widget_show (dialog);
+  gdk_window_show (GTK_WIDGET (dialog)->window);
+  gdk_window_raise (GTK_WIDGET (dialog)->window);
+#else /* !HAVE_GTK */
+  XMapRaised (XtDisplay (dialog), XtWindow (dialog));
+#endif /* !HAVE_GTK */
+}
+
+
+#ifdef HAVE_GTK
+/* Callback for WM_DELETE_WINDOW on the main demo window.
+ */
+static void
+destroy (GtkWidget *widget, gpointer data)
+{
+  gtk_main_quit ();
+}
+
+/* Callback for the "Run" button to the right of the text entry line.
+ */
+static void
+select_button_cb CB_ARGS(WIDGET button, POINTER client_data, POINTER ignored)
+{
+  gtk_signal_emit_by_name (GTK_OBJECT (text_line), "activate");
+}
+#endif /* HAVE_GTK */
+
+
+static void
+make_demo_dialog (Widget toplevel_shell, prefs_pair *pair)
+{
+  saver_preferences *p =  pair->a;
+  /* saver_preferences *p2 = pair->b; */
+  Widget parent = toplevel_shell;
+  char **hacks = p->screenhacks;
+
+  create_demo_dialog (parent,
+                      DefaultVisualOfScreen (widget_screen (parent)),
+                     DefaultColormapOfScreen (widget_screen (parent)));
+
+#ifdef HAVE_GTK
+  gtk_window_set_title (GTK_WINDOW (demo_dialog), progclass);
+  gtk_signal_connect (GTK_OBJECT (demo_dialog), "delete_event",
+                      GTK_SIGNAL_FUNC (destroy), NULL);
+  gtk_signal_connect (GTK_OBJECT (demo_dialog), "destroy",
+                      GTK_SIGNAL_FUNC (destroy), NULL);
+#endif /* HAVE_GTK */
+
+  format_into_label (label1, short_version);
+  add_button_callback (next,    next_cb,        (POINTER) p);
+  add_button_callback (prev,    prev_cb,        (POINTER) p);
+  add_button_callback (done,    quit_cb,        (POINTER) p);
+  if (restart)
+    add_button_callback(restart,restart_cb,     (POINTER) p);
+  add_button_callback (edit,    preferences_cb, (POINTER) pair);
+
+#ifdef HAVE_MOTIF
+  XtAddCallback (demo_list, XmNbrowseSelectionCallback,
+                select_cb, (POINTER) p);
+  XtAddCallback (demo_list, XmNdefaultActionCallback,
+                select_cb, (POINTER) p);
+  XtAddCallback (text_line, XmNactivateCallback, text_cb, (POINTER) p);
+
+  if (hacks)
+    for (; *hacks; hacks++)
+      {
+       XmString xmstr = XmStringCreate (*hacks, XmSTRING_DEFAULT_CHARSET);
+       XmListAddItem (demo_list, xmstr, 0);
+       XmStringFree (xmstr);
+      }
+
+#elif defined(HAVE_ATHENA)
+
+  /* Hook up the text line. */
+
+  XtAppAddActions(XtWidgetToApplicationContext(text_line),
+                 actions, XtNumber(actions));
+  XtOverrideTranslations(text_line, XtParseTranslationTable(translations));
+
+
+  /* Must realize the widget before populating the list, or the dialog
+     will be as wide as the longest string.
+  */
+  XtRealizeWidget (demo_dialog);
+
+  XtVaSetValues (demo_list,
+                XtNlist, hacks,
+                XtNnumberStrings, p->screenhacks_count,
+                0);
+  XtAddCallback (demo_list, XtNcallback, select_cb, p);
+
+  /* Now that we've populated the list, make sure that the list is as
+     wide as the dialog itself.
+  */
+  {
+    Widget viewport = XtParent(demo_list);
+    Widget subform = XtParent(viewport);
+    Widget box = XtNameToWidget(demo_dialog, "*box");
+    Widget label1 = XtNameToWidget(demo_dialog, "*label1");
+    Widget label2 = XtNameToWidget(demo_dialog, "*label2");
+    Dimension x=0, y=0, w=0, h=0, bw=0, w2=0;
+    XtVaGetValues(subform,
+                 XtNwidth, &w, XtNheight, &h, XtNborderWidth, &bw, 0);
+    XtVaGetValues(box, XtNwidth, &w2, 0);
+    if (w2 != w)
+      XtResizeWidget(subform, w2, h, bw);
+
+    /* Why isn't the viewport getting centered? */
+    XtVaGetValues(viewport,
+                 XtNx, &x, XtNy, &y, XtNheight, &h, XtNborderWidth, &bw, 0);
+    XtConfigureWidget(viewport, x, y, w2-x-x, h, bw);
+
+    /* And the text line, too. */
+    XtVaGetValues(text_line,
+                 XtNwidth, &w, XtNheight, &h, XtNborderWidth, &bw, 0);
+    XtVaGetValues(viewport, XtNwidth, &w2, 0);
+    if (w2 != w)
+      XtResizeWidget(text_line, w2, h, bw);
+
+    /* And the labels too. */
+    XtVaGetValues(label1,
+                 XtNwidth, &w, XtNheight, &h, XtNborderWidth, &bw, 0);
+    if (w2 != w)
+      XtResizeWidget(label1, w2, h, bw);
+
+    XtVaGetValues(label2,
+                 XtNwidth, &w, XtNheight, &h, XtNborderWidth, &bw, 0);
+    if (w2 != w)
+      XtResizeWidget(label2, w2, h, bw);
+
+  }
+
+#elif defined(HAVE_GTK)
+  {
+    GtkList *list = GTK_LIST(GTK_BIN(GTK_BIN(demo_list)->child)->child);
+    char **s;
+    for (s = hacks; *s; s++)
+      {
+        GtkWidget *line = gtk_list_item_new_with_label (*s);
+        gtk_container_add (GTK_CONTAINER (list), line);
+        gtk_signal_connect (GTK_OBJECT (line), "button_press_event",
+                            GTK_SIGNAL_FUNC (select_cb),
+                            (POINTER) line);
+        GTK_WIDGET (GTK_BIN(line)->child)->style =
+          gtk_style_copy (GTK_WIDGET (text_line)->style);
+        gtk_widget_show (line);
+      }
+    gtk_signal_connect (GTK_OBJECT (text_line), "activate",
+                        GTK_SIGNAL_FUNC (text_cb),
+                        (POINTER) p);
+    gtk_signal_connect (GTK_OBJECT (text_activate), "clicked",
+                        GTK_SIGNAL_FUNC (select_button_cb),
+                        (POINTER) p);
+  }
+#endif /* HAVE_GTK */
+
+  pop_up_dialog_box(demo_dialog, demo_form);
+
+#ifdef HAVE_ATHENA
+  /* For Athena, have to do this after the dialog is managed. */
+  ensure_selected_item_visible (demo_list);
+#endif /* HAVE_ATHENA */
+}
+
+\f
+/* the Preferences dialog
+ */
+
+/* Helper for the text fields that contain time specifications:
+   this parses the text, and does error checking.
+ */
+static void 
+hack_time_text (Display *dpy, char *line, Time *store, Bool sec_p)
+{
+  if (*line)
+    {
+      int value;
+      value = parse_time (line, sec_p, True);
+      value *= 1000;   /* Time measures in microseconds */
+      if (value < 0)
+       /*XBell (dpy, 0)*/;
+      else
+       *store = value;
+    }
+}
+
+
+/* Callback for text fields that hold a time that default to seconds,
+   when not fully spelled out.  client_data is a Time* where the value goes.
+ */
+static void
+prefs_sec_cb CB_ARGS(WIDGET button, POINTER client_data, POINTER ignored)
+{
+  hack_time_text (widget_display (button), get_text_string (button),
+                  (Time *) client_data, True);
+}
+
+
+/* Callback for text fields that hold a time that default to minutes,
+   when not fully spelled out.  client_data is an Time* where the value goes.
+ */
+static void
+prefs_min_cb CB_ARGS(WIDGET button, POINTER client_data, POINTER ignored)
+{
+  hack_time_text (widget_display (button), get_text_string (button),
+                  (Time *) client_data, False);
+}
+
+
+/* Callback for text fields that hold an integer value.
+   client_data is an int* where the value goes.
+ */
+static void
+prefs_int_cb CB_ARGS(WIDGET button, POINTER client_data, POINTER ignored)
+{
+  char *line = get_text_string (button);
+  int *store = (int *) client_data;
+  unsigned int value;
+  char c;
+  if (! *line)
+    ;
+  else if (sscanf (line, "%u%c", &value, &c) != 1)
+#ifdef HAVE_GTK
+    gdk_beep();
+#else  /* !HAVE_GTK */
+    XBell (XtDisplay (button), 0);
+#endif /* !HAVE_GTK */
+  else
+    *store = value;
+}
+
+
+/* Callback for toggle buttons.  client_data is a Bool* where the value goes.
+ */
+static void
+prefs_bool_cb CB_ARGS(WIDGET button, POINTER client_data, POINTER call_data)
+{
+  Bool *store = (Bool *) client_data;
+#ifdef HAVE_MOTIF
+  *store = ((XmToggleButtonCallbackStruct *) call_data)->set;
+#elif defined(HAVE_ATHENA)
+  Boolean state = FALSE;
+  XtVaGetValues (button, XtNstate, &state, 0);
+  *store = state;
+#elif defined(HAVE_GTK)
+  *store = GTK_TOGGLE_BUTTON (button)->active;
+#endif /* HAVE_GTK */
+}
+
+
+/* Callback for the Cancel button on the Preferences dialog.
+ */
+static void
+prefs_cancel_cb CB_ARGS(WIDGET button, POINTER client_data, POINTER ignored)
+{
+#ifdef HAVE_GTK
+  gdk_window_hide (GTK_WIDGET (preferences_dialog)->window);
+  gtk_widget_show (demo_dialog);
+  gdk_window_show (GTK_WIDGET (demo_dialog)->window);
+  gdk_window_raise (GTK_WIDGET (demo_dialog)->window);
+#else  /* !HAVE_GTK */
+  XtDestroyWidget (preferences_dialog);
+  preferences_dialog = 0;
+  XMapRaised (XtDisplay (demo_dialog), XtWindow (demo_dialog));
+#endif /* !HAVE_GTK */
+}
+
+
+/* Callback for the OK button on the Preferences dialog.
+ */
+static void
+prefs_ok_cb CB_ARGS(WIDGET button, POINTER client_data, POINTER call_data)
+{
+  prefs_pair *pair = (prefs_pair *) client_data;
+  saver_preferences *p =  pair->a;
+  saver_preferences *p2 = pair->b;
+
+  prefs_cancel_cb CB_ARGS(button, client_data, call_data);
+
+#ifdef HAVE_ATHENA
+  /* Athena doesn't let us put callbacks on these widgets, so run
+     all the callbacks by hand when OK is pressed. */
+  prefs_min_cb (timeout_text,        (POINTER) &p2->timeout,        0);
+  prefs_min_cb (cycle_text,          (POINTER) &p2->cycle,          0);
+  prefs_sec_cb (fade_text,           (POINTER) &p2->fade_seconds,   0);
+  prefs_int_cb (fade_ticks_text,     (POINTER) &p2->fade_ticks,     0);
+  prefs_min_cb (lock_timeout_text,   (POINTER) &p2->lock_timeout,   0);
+  prefs_sec_cb (passwd_timeout_text, (POINTER) &p2->passwd_timeout, 0);
+#elif defined(HAVE_GTK)
+  /* Do it again anyway for GTK. */
+  prefs_min_cb ((POINTER) &p2->timeout,        timeout_text);
+  prefs_min_cb ((POINTER) &p2->cycle,          cycle_text);
+  prefs_sec_cb ((POINTER) &p2->fade_seconds,   fade_text);
+  prefs_int_cb ((POINTER) &p2->fade_ticks,     fade_ticks_text);
+  prefs_min_cb ((POINTER) &p2->lock_timeout,   lock_timeout_text);
+  prefs_sec_cb ((POINTER) &p2->passwd_timeout, passwd_timeout_text);
+#endif /* HAVE_GTK */
+
+  p->timeout       = p2->timeout;
+  p->cycle         = p2->cycle;
+  p->lock_timeout   = p2->lock_timeout;
+  p->passwd_timeout = p2->passwd_timeout;
+  p->fade_seconds   = p2->fade_seconds;
+  p->fade_ticks            = p2->fade_ticks;
+  p->verbose_p     = p2->verbose_p;
+  p->install_cmap_p = p2->install_cmap_p;
+  p->fade_p        = p2->fade_p;
+  p->unfade_p      = p2->unfade_p;
+  p->lock_p        = p2->lock_p;
+
+  write_init_file (p, short_version);
+}
+
+
+#ifdef HAVE_GTK
+static void
+close_prefs_cb CB_ARGS(WIDGET button, POINTER client_data, POINTER call_data)
+{
+  prefs_cancel_cb CB_ARGS(button, client_data, call_data);
+}
+#endif /* HAVE_GTK */
+
+
+static void
+make_preferences_dialog (prefs_pair *pair, Widget parent)
+{
+  saver_preferences *p =  pair->a;
+  saver_preferences *p2 = pair->b;
+
+  Screen *screen = widget_screen (parent);
+  Display *dpy = widget_display (parent);
+
+  *p2 = *p;    /* copy all slots of p into p2. */
+
+  create_preferences_dialog (parent,
+                             DefaultVisualOfScreen (screen),
+                             DefaultColormapOfScreen (screen));
+
+#ifdef HAVE_GTK
+  gtk_window_set_title (GTK_WINDOW (preferences_dialog), progclass);
+  gtk_signal_connect (GTK_OBJECT (preferences_dialog), "delete_event",
+                      GTK_SIGNAL_FUNC (close_prefs_cb), NULL);
+  gtk_signal_connect (GTK_OBJECT (preferences_dialog), "destroy",
+                      GTK_SIGNAL_FUNC (close_prefs_cb), NULL);
+#endif /* HAVE_GTK */
+
+  add_button_callback (prefs_done,   prefs_ok_cb,     (POINTER) pair);
+  add_button_callback (prefs_cancel, prefs_cancel_cb, 0);
+
+#define CB(widget,type,slot) \
+       add_text_callback ((widget), (type), (POINTER) (slot))
+#define CBT(widget,type,slot) \
+       add_toggle_callback ((widget), (type), (POINTER) (slot))
+
+#ifndef HAVE_ATHENA
+  /* When using Athena widgets, we can't set callbacks for these,
+     so in that case, we run them by hand when "OK" is pressed. */
+  CB (timeout_text,            prefs_min_cb,  &p2->timeout);
+  CB (cycle_text,              prefs_min_cb,  &p2->cycle);
+  CB (fade_text,               prefs_sec_cb,  &p2->fade_seconds);
+  CB (fade_ticks_text,         prefs_int_cb,  &p2->fade_ticks);
+  CB (lock_timeout_text,       prefs_min_cb,  &p2->lock_timeout);
+  CB (passwd_timeout_text,     prefs_sec_cb,  &p2->passwd_timeout);
+
+#endif /* !HAVE_ATHENA */
+
+  CBT (verbose_toggle,         prefs_bool_cb, &p2->verbose_p);
+  CBT (install_cmap_toggle,    prefs_bool_cb, &p2->install_cmap_p);
+  CBT (fade_toggle,            prefs_bool_cb, &p2->fade_p);
+  CBT (unfade_toggle,          prefs_bool_cb, &p2->unfade_p);
+  CBT (lock_toggle,            prefs_bool_cb, &p2->lock_p);
+#undef CB
+#undef CBT
+
+  {
+    Bool found_any_writable_cells = False;
+    int nscreens = ScreenCount(dpy);
+    int i;
+    for (i = 0; i < nscreens; i++)
+      {
+       Screen *s = ScreenOfDisplay (dpy, i);
+       if (has_writable_cells (s, DefaultVisualOfScreen (s)))
+         {
+           found_any_writable_cells = True;
+           break;
+         }
+      }
+
+    if (! found_any_writable_cells)    /* fading isn't possible */
+      {
+       disable_widget (fade_text);
+       disable_widget (fade_ticks_text);
+       disable_widget (install_cmap_toggle);
+       disable_widget (fade_toggle);
+       disable_widget (unfade_toggle);
+      }
+  }
+}
+
+
+/* Formats a `Time' into "H:MM:SS".  (Time is microseconds.)
+ */
+static void
+format_time (char *buf, Time time)
+{
+  int s = time / 1000;
+  unsigned int h = 0, m = 0;
+  if (s >= 60)
+    {
+      m += (s / 60);
+      s %= 60;
+    }
+  if (m >= 60)
+    {
+      h += (m / 60);
+      m %= 60;
+    }
+  sprintf (buf, "%u:%02u:%02u", h, m, s);
+}
+
+
+static void
+pop_preferences_dialog (prefs_pair *pair)
+{
+  /* saver_preferences *p =  pair->a; */
+  saver_preferences *p2 = pair->b;
+  char s[100];
+
+  format_time (s, p2->timeout);        set_text_string(timeout_text, s);
+  format_time (s, p2->cycle);          set_text_string(cycle_text, s);
+  format_time (s, p2->lock_timeout);   set_text_string(lock_timeout_text, s);
+  format_time (s, p2->passwd_timeout); set_text_string(passwd_timeout_text, s);
+  format_time (s, p2->fade_seconds);   set_text_string(fade_text, s);
+  sprintf (s, "%u", p2->fade_ticks);   set_text_string(fade_ticks_text, s);
+
+  set_toggle_button_state (verbose_toggle,     p2->verbose_p);
+  set_toggle_button_state (install_cmap_toggle, p2->install_cmap_p);
+  set_toggle_button_state (fade_toggle,                p2->fade_p);
+  set_toggle_button_state (unfade_toggle,      p2->unfade_p);
+  set_toggle_button_state (lock_toggle,                p2->lock_p);
+
+  pop_up_dialog_box (preferences_dialog, preferences_form);
+}
+
+
+static void
+run_hack (Display *dpy, int n)
+{
+  if (n <= 0) abort();
+  xscreensaver_command (dpy, XA_DEMO, n, False);
+}
+
+
+static void
+warning_dialog_dismiss_cb CB_ARGS(WIDGET button, POINTER client_data,
+                                  POINTER ignored)
+{
+  WIDGET shell = (WIDGET) client_data;
+#ifdef HAVE_GTK
+  gdk_window_hide (GTK_WIDGET (shell)->window);
+#else  /* !HAVE_GTK */
+  XtDestroyWidget (shell);
+#endif /* !HAVE_GTK */
+}
+
+
+static void
+warning_dialog (WIDGET parent, const char *message)
+{
+  char *msg = strdup (message);
+  char *head;
+
+  WIDGET dialog = 0;
+  WIDGET label = 0;
+  WIDGET ok = 0;
+  int i = 0;
+
+#ifdef HAVE_MOTIF
+
+  Widget w;
+  Widget container;
+  XmString xmstr;
+  Arg av[10];
+  int ac = 0;
+
+  ac = 0;
+  dialog = XmCreateWarningDialog (parent, "versionWarning", av, ac);
+
+  w = XmMessageBoxGetChild (dialog, XmDIALOG_MESSAGE_LABEL);
+  if (w) XtUnmanageChild (w);
+  w = XmMessageBoxGetChild (dialog, XmDIALOG_CANCEL_BUTTON);
+  if (w) XtUnmanageChild (w);
+  w = XmMessageBoxGetChild (dialog, XmDIALOG_HELP_BUTTON);
+  if (w) XtUnmanageChild (w);
+
+  ok = XmMessageBoxGetChild (dialog, XmDIALOG_OK_BUTTON);
+
+  ac = 0;
+  XtSetArg (av[ac], XmNnumColumns, 1); ac++;
+  XtSetArg (av[ac], XmNorientation, XmVERTICAL); ac++;
+  XtSetArg (av[ac], XmNpacking, XmPACK_COLUMN); ac++;
+  XtSetArg (av[ac], XmNrowColumnType, XmWORK_AREA); ac++;
+  XtSetArg (av[ac], XmNspacing, 0); ac++;
+  container = XmCreateRowColumn (dialog, "container", av, ac);
+
+#elif defined(HAVE_ATHENA)
+
+  Widget form;
+  dialog = XtVaCreatePopupShell("warning_dialog", transientShellWidgetClass,
+                               parent, 0);
+  form = XtVaCreateManagedWidget("warning_form", formWidgetClass, dialog, 0);
+
+#elif defined(HAVE_GTK)
+  dialog = gtk_dialog_new ();
+#endif /* HAVE_GTK */
+
+  head = msg;
+  while (head)
+    {
+      char name[20];
+      char *s = strchr (head, '\n');
+      if (s) *s = 0;
+
+      sprintf (name, "label%d", i++);
+
+#ifdef HAVE_MOTIF
+      xmstr = XmStringCreate (head, XmSTRING_DEFAULT_CHARSET);
+      ac = 0;
+      XtSetArg (av[ac], XmNlabelString, xmstr); ac++;
+      label = XmCreateLabelGadget (container, name, av, ac);
+      XtManageChild (label);
+      XmStringFree (xmstr);
+#elif defined(HAVE_ATHENA)
+      
+      label = XtVaCreateManagedWidget (name, labelWidgetClass,
+                                      form,
+                                      XtNleft, XtChainLeft,
+                                      XtNright, XtChainRight,
+                                      XtNlabel, head,
+                                      (label ? XtNfromVert : XtNtop),
+                                      (label ? label : XtChainTop),
+                                      0);
+
+#elif defined(HAVE_GTK)
+      {
+        char buf[255];
+        label = gtk_label_new (head);
+        sprintf (buf, "warning_dialog.%s.font", name);
+        GTK_WIDGET (label)->style = gtk_style_copy (GTK_WIDGET (label)->style);
+        GTK_WIDGET (label)->style->font =
+          gdk_font_load (get_string_resource (buf, "Dialog.Label.Font"));
+        /* gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); */
+        gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox),
+                            label, TRUE, TRUE, 0);
+        gtk_widget_show (label);
+      }
+#endif /* HAVE_GTK */
+
+      if (s)
+       head = s+1;
+      else
+       head = 0;
+    }
+
+#ifdef HAVE_MOTIF
+
+  XtManageChild (container);
+  XtRealizeWidget (dialog);
+  XtManageChild (dialog);
+
+#elif defined(HAVE_ATHENA)
+
+  ok = XtVaCreateManagedWidget ("ok", commandWidgetClass, form,
+                               XtNleft, XtChainLeft,
+                               XtNbottom, XtChainBottom,
+                               XtNfromVert, label,
+                               0);
+
+  XtRealizeWidget (dialog);
+  XtPopup (dialog, XtGrabNone);
+
+#elif defined(HAVE_GTK)
+  label = gtk_label_new ("");
+  gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox),
+                      label, TRUE, TRUE, 0);
+  gtk_widget_show (label);
+
+  label = gtk_hbutton_box_new ();
+  gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox),
+                      label, TRUE, TRUE, 0);
+
+  ok = gtk_button_new_with_label (
+                          get_string_resource ("warning_dialog.ok.label",
+                                               "warning_dialog.Button.Label"));
+  gtk_box_pack_start (GTK_BOX (label), ok, TRUE, FALSE, 0);
+  gtk_window_set_position (GTK_WINDOW (dialog), GTK_WIN_POS_CENTER);
+  gtk_container_set_border_width (GTK_CONTAINER (dialog), 10);
+  gtk_widget_show (ok);
+  gtk_widget_show (label);
+  gtk_widget_show (dialog);
+/*  gtk_window_set_default (GTK_WINDOW (dialog), ok);*/
+
+  gdk_window_set_transient_for (GTK_WIDGET (dialog)->window,
+                                GTK_WIDGET (preferences_dialog
+                                            ? preferences_dialog
+                                            : demo_dialog)->window);
+
+  gdk_window_show (GTK_WIDGET (dialog)->window);
+  gdk_window_raise (GTK_WIDGET (dialog)->window);
+#endif /* HAVE_GTK */
+
+  add_button_callback (ok, warning_dialog_dismiss_cb, (POINTER) dialog);
+
+  free (msg);
+}
+
+
+\f
+/* The main demo-mode command loop.
+ */
+
+#if 0
+static Bool
+mapper (XrmDatabase *db, XrmBindingList bindings, XrmQuarkList quarks,
+       XrmRepresentation *type, XrmValue *value, XPointer closure)
+{
+  int i;
+  for (i = 0; quarks[i]; i++)
+    {
+      if (bindings[i] == XrmBindTightly)
+       fprintf (stderr, (i == 0 ? "" : "."));
+      else if (bindings[i] == XrmBindLoosely)
+       fprintf (stderr, "*");
+      else
+       fprintf (stderr, " ??? ");
+      fprintf(stderr, "%s", XrmQuarkToString (quarks[i]));
+    }
+
+  fprintf (stderr, ": %s\n", (char *) value->addr);
+
+  return False;
+}
+#endif
+
+
+static void
+the_network_is_not_the_computer (WIDGET parent)
+{
+  Display *dpy = widget_display (parent);
+  char *rversion, *ruser, *rhost;
+  char *luser, *lhost;
+  char *msg = 0;
+  struct passwd *p = getpwuid (getuid ());
+  const char *d = DisplayString (dpy);
+
+# if defined(HAVE_UNAME)
+  struct utsname uts;
+  if (uname (&uts) < 0)
+    lhost = "<UNKNOWN>";
+  else
+    lhost = uts.nodename;
+# elif defined(VMS)
+  strcpy (lhost, getenv("SYS$NODE"));
+# else  /* !HAVE_UNAME && !VMS */
+  strcat (lhost, "<UNKNOWN>");
+# endif /* !HAVE_UNAME && !VMS */
+
+  if (p && p->pw_name)
+    luser = p->pw_name;
+  else
+    luser = "???";
+
+  server_xscreensaver_version (dpy, &rversion, &ruser, &rhost);
+
+  /* Make a buffer that's big enough for a number of copies of all the
+     strings, plus some. */
+  msg = (char *) malloc (10 * ((rversion ? strlen(rversion) : 0) +
+                              (ruser ? strlen(ruser) : 0) +
+                              (rhost ? strlen(rhost) : 0) +
+                              strlen(lhost) +
+                              strlen(luser) +
+                              strlen(d) +
+                              30));
+  *msg = 0;
+
+  if (!rversion || !*rversion)
+    {
+      sprintf (msg,
+              "Warning:\n\n"
+              "xscreensaver doesn't seem to be running on display \"%s\".",
+              d);
+    }
+  else if (p && ruser && *ruser && !!strcmp (ruser, p->pw_name))
+    {
+      /* Warn that the two processes are running as different users.
+       */
+      sprintf(msg,
+              "Warning:\n\n"
+             "%s is running as user \"%s\" on host \"%s\".\n"
+             "But the xscreensaver managing display \"%s\"\n"
+             "is running as user \"%s\" on host \"%s\".\n"
+             "\n"
+             "Since they are different users, they won't be reading/writing\n"
+             "the same ~/.xscreensaver file, so %s isn't\n"
+             "going to work right.\n"
+             "\n"
+             "Either re-run %s as \"%s\", or re-run\n"
+             "xscreensaver as \"%s\".\n",
+             progname, luser, lhost,
+             d,
+             (ruser ? ruser : "???"), (rhost ? rhost : "???"),
+             progname,
+             progname, (ruser ? ruser : "???"),
+             luser);
+    }
+  else if (rhost && *rhost && !!strcmp (rhost, lhost))
+    {
+      /* Warn that the two processes are running on different hosts.
+       */
+      sprintf (msg,
+              "Warning:\n\n"
+              "%s is running as user \"%s\" on host \"%s\".\n"
+              "But the xscreensaver managing display \"%s\"\n"
+              "is running as user \"%s\" on host \"%s\".\n"
+              "\n"
+              "If those two machines don't share a file system (that is,\n"
+              "if they don't see the same ~%s/.xscreensaver file) then\n"
+              "%s won't work right.",
+              progname, luser, lhost,
+              d,
+              (ruser ? ruser : "???"), (rhost ? rhost : "???"),
+              luser,
+              progname);
+    }
+  else if (!!strcmp (rversion, short_version))
+    {
+      /* Warn that the version numbers don't match.
+       */
+      sprintf (msg,
+              "Warning:\n\n"
+              "This is %s version %s.\n"
+              "But the xscreensaver managing display \"%s\"\n"
+              "is version %s.  This could cause problems.",
+              progname, short_version,
+              d,
+              rversion);
+    }
+
+
+  if (*msg)
+    warning_dialog (parent, msg);
+
+  free (msg);
+}
+
+
+/* We use this error handler so that X errors are preceeded by the name
+   of the program that generated them.
+ */
+static int
+demo_ehandler (Display *dpy, XErrorEvent *error)
+{
+  fprintf (stderr, "\nX error in %s:\n", progname);
+  if (XmuPrintDefaultErrorMessage (dpy, error, stderr))
+    exit (-1);
+  else
+    fprintf (stderr, " (nonfatal.)\n");
+  return 0;
+}
+
+
+#ifdef HAVE_GTK
+
+/* We use this error handler so that Gtk/Gdk errors are preceeded by the name
+   of the program that generated them; and also that we can ignore one
+   particular bogus error message that Gdk madly spews.
+ */
+static void
+g_log_handler (const gchar *log_domain, GLogLevelFlags log_level,
+               const gchar *message, gpointer user_data)
+{
+  /* Ignore the message "Got event for unknown window: 0x...".
+     Apparently some events are coming in for the xscreensaver window
+     (presumably reply events related to the ClientMessage) and Gdk
+     feels the need to complain about them.  So, just suppress any
+     messages that look like that one.
+   */
+  if (strstr (message, "unknown window"))
+    return;
+
+  fprintf (stderr, "%s: %s-%s: %s%s", blurb(), log_domain,
+           (log_level == G_LOG_LEVEL_ERROR    ? "error" :
+            log_level == G_LOG_LEVEL_CRITICAL ? "critical" :
+            log_level == G_LOG_LEVEL_WARNING  ? "warning" :
+            log_level == G_LOG_LEVEL_MESSAGE  ? "message" :
+            log_level == G_LOG_LEVEL_INFO     ? "info" :
+            log_level == G_LOG_LEVEL_DEBUG    ? "debug" : "???"),
+           message,
+           ((!*message || message[strlen(message)-1] != '\n')
+            ? "\n" : ""));
+}
+#endif /* HAVE_GTK */
+
+
+
+static char *defaults[] = {
+#include "XScreenSaver_ad.h"
+ 0
+};
+
+int
+main (int argc, char **argv)
+{
+  XtAppContext app;
+  prefs_pair Pair, *pair;
+  saver_preferences P, P2, *p, *p2;
+  Bool prefs = False;
+  int i;
+  Display *dpy;
+  Widget toplevel_shell;
+  char *real_progname = argv[0];
+  char *s;
+
+  s = strrchr (real_progname, '/');
+  if (s) real_progname = s+1;
+
+  p = &P;
+  p2 = &P2;
+  pair = &Pair;
+  pair->a = p;
+  pair->b = p2;
+  memset (p,  0, sizeof (*p));
+  memset (p2, 0, sizeof (*p2));
+
+  progname = real_progname;
+
+#ifdef HAVE_GTK
+  /* Register our error message logger for every ``log domain'' known.
+     There's no way to do this globally, so I grepped the Gtk/Gdk sources
+     for all of the domains that seem to be in use.
+  */
+  {
+    const char * const domains[] = { "Gtk", "Gdk", "GLib", "GModule",
+                                     "GThread", "Gnome", "GnomeUI", 0 };
+    for (i = 0; domains[i]; i++)
+      g_log_set_handler (domains[i], G_LOG_LEVEL_MASK, g_log_handler, 0);
+  }
+
+  /* This is gross, but Gtk understands --display and not -display... */
+  for (i = 1; i < argc; i++)
+    if (argv[i][0] && argv[i][1] && 
+        !strncmp(argv[i], "-display", strlen(argv[i])))
+      argv[i] = "--display";
+
+  /* Let Gtk open the X connection, then initialize Xt to use that
+     same connection.  Doctor Frankenstein would be proud. */   
+  gtk_init (&argc, &argv);
+#endif /* HAVE_GTK */
+
+
+  /* We must read exactly the same resources as xscreensaver.
+     That means we must have both the same progclass *and* progname,
+     at least as far as the resource database is concerned.  So,
+     put "xscreensaver" in argv[0] while initializing Xt.
+   */
+  argv[0] = "xscreensaver";
+  progname = argv[0];
+
+
+#ifdef HAVE_GTK
+  /* If we're using Gtk, the X connection is already open.
+     Now teach Xt about it.
+   */
+  XtToolkitInitialize ();
+  app = XtCreateApplicationContext ();
+  dpy = gdk_display;
+  XtAppSetFallbackResources (app, defaults);
+  XtDisplayInitialize (app, dpy, progname, progclass, 0, 0, &argc, argv);
+  toplevel_shell = XtAppCreateShell (progname, progclass,
+                                     applicationShellWidgetClass,
+                                     dpy, 0, 0);
+
+#else  /* !HAVE_GTK */
+  /* No Gtk -- open the X connection here. */
+  toplevel_shell = XtAppInitialize (&app, progclass, 0, 0, &argc, argv,
+                                   defaults, 0, 0);
+#endif /* !HAVE_GTK */
+
+  dpy = XtDisplay (toplevel_shell);
+  db = XtDatabase (dpy);
+  XtGetApplicationNameAndClass (dpy, &progname, &progclass);
+  XSetErrorHandler (demo_ehandler);
+
+  /* Complain about unrecognized command-line arguments.
+   */
+  for (i = 1; i < argc; i++)
+    {
+      char *s = argv[i];
+      if (s[0] == '-' && s[1] == '-')
+       s++;
+      if (!strcmp (s, "-prefs"))
+       prefs = True;
+      else
+       {
+         fprintf (stderr, "usage: %s [ -display dpy-string ] [ -prefs ]\n",
+                  real_progname);
+         exit (1);
+       }
+    }
+
+  short_version = (char *) malloc (5);
+  memcpy (short_version, screensaver_id + 17, 4);
+  short_version [4] = 0;
+
+  /* Load the init file, which may end up consulting the X resource database
+     and the site-wide app-defaults file.  Note that at this point, it's
+     important that `progname' be "xscreensaver", rather than whatever
+     was in argv[0].
+   */
+  p->db = db;
+  load_init_file (p);
+  *p2 = *p;
+
+  /* Now that Xt has been initialized, and the resources have been read,
+     we can set our `progname' variable to something more in line with
+     reality.
+   */
+  progname = real_progname;
+
+
+#ifdef HAVE_ATHENA
+  global_prefs_kludge = p;     /* I hate C so much... */
+#endif /* HAVE_ATHENA */
+
+#if 0
+  {
+    XrmName name = { 0 };
+    XrmClass class = { 0 };
+    int count = 0;
+    XrmEnumerateDatabase (db, &name, &class, XrmEnumAllLevels, mapper,
+                         (POINTER) &count);
+  }
+#endif
+
+
+  XA_VROOT = XInternAtom (dpy, "__SWM_VROOT", False);
+  XA_SCREENSAVER = XInternAtom (dpy, "SCREENSAVER", False);
+  XA_SCREENSAVER_VERSION = XInternAtom (dpy, "_SCREENSAVER_VERSION",False);
+  XA_SCREENSAVER_TIME = XInternAtom (dpy, "_SCREENSAVER_TIME", False);
+  XA_SCREENSAVER_ID = XInternAtom (dpy, "_SCREENSAVER_ID", False);
+  XA_SCREENSAVER_RESPONSE = XInternAtom (dpy, "_SCREENSAVER_RESPONSE", False);
+  XA_SELECT = XInternAtom (dpy, "SELECT", False);
+  XA_DEMO = XInternAtom (dpy, "DEMO", False);
+  XA_RESTART = XInternAtom (dpy, "RESTART", False);
+
+  make_demo_dialog (toplevel_shell, pair);
+
+  if (prefs)
+    {
+      make_preferences_dialog (pair, toplevel_shell);
+      pop_preferences_dialog (pair);
+    }
+
+  the_network_is_not_the_computer (preferences_dialog
+                                  ? preferences_dialog
+                                  : demo_dialog);
+
+#ifdef HAVE_GTK
+
+  /* Run the Gtk event loop, and not the Xt event loop.  This means that
+     if there were Xt timers or fds registered, they would never get serviced,
+     and if there were any Xt widgets, they would never have events delivered.
+     Fortunately, we're using Gtk for all of the UI, and only initialized
+     Xt so that we could process the command line and use the X resource
+     manager.
+   */
+  gtk_main ();
+
+#else  /* !HAVE_GTK */
+
+  XtAppMainLoop (app);
+
+#endif /* !HAVE_GTK */
+
+  exit (0);
+}
diff --git a/driver/dialogs-Gtk.c b/driver/dialogs-Gtk.c
new file mode 100644 (file)
index 0000000..2d16dc9
--- /dev/null
@@ -0,0 +1,249 @@
+/* dialogs-Gtk.c --- Gtk widgets for demo, options, and password dialogs.
+ * xscreensaver, Copyright (c) 1999 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software 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.  No representations are made about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or 
+ * implied warranty.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <X11/Xlib.h>
+#include <gtk/gtk.h>
+#include "resources.h"
+
+#include <stdio.h>
+
+GtkWidget *preferences_dialog;
+GtkWidget *preferences_form;
+GtkWidget *timeout_text;
+GtkWidget *cycle_text;
+GtkWidget *fade_text;
+GtkWidget *fade_ticks_text;
+GtkWidget *lock_timeout_text;
+GtkWidget *passwd_timeout_text;
+GtkWidget *verbose_toggle;
+GtkWidget *install_cmap_toggle;
+GtkWidget *fade_toggle;
+GtkWidget *unfade_toggle;
+GtkWidget *lock_toggle;
+GtkWidget *prefs_done;
+GtkWidget *prefs_cancel;
+
+GtkWidget *demo_dialog;
+GtkWidget *demo_form;
+GtkWidget *label1;
+GtkWidget *label2;
+GtkWidget *demo_list;
+GtkWidget *text_line;
+GtkWidget *text_activate;
+GtkWidget *next;
+GtkWidget *prev;
+GtkWidget *edit;
+GtkWidget *done;
+GtkWidget *restart;  /* #### */
+
+/* This is a Gtk program that uses Xrm for localization and preferences --
+   may god forgive me for what I have unleashed. */
+static char *
+STR (char *resource)
+{
+  return (get_string_resource (resource, resource));
+}
+
+
+void
+create_preferences_dialog (void *ignore1, void *ignore2, void *ignore3)
+{
+  GtkWidget *window, *box1, *box2, *box3;
+  GtkWidget *label;
+  GtkWidget *timeout_label;
+  GtkWidget *cycle_label;
+  GtkWidget *faded_label;
+  GtkWidget *fade_ticks_label;
+  GtkWidget *lock_timeout_label;
+  GtkWidget *passwd_timeout_label;
+  int entry_width;
+
+  window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+  gtk_container_set_border_width (GTK_CONTAINER (window), 10);
+
+  box1 = gtk_vbox_new (FALSE, 6);
+  box2 = gtk_table_new (6, 3, FALSE);
+  box3 = gtk_hbutton_box_new ();
+
+  /* Create the labels. */
+  label = gtk_label_new (STR("preferences_dialog.label1.label"));
+  timeout_label = gtk_label_new (STR("preferences_dialog.timeout.label"));
+  cycle_label = gtk_label_new (STR("preferences_dialog.cycle.label"));
+  faded_label = gtk_label_new (STR("preferences_dialog.fade.label"));
+  fade_ticks_label = gtk_label_new (STR("preferences_dialog.ticks.label"));
+  lock_timeout_label = gtk_label_new(STR("preferences_dialog.lockTime.label"));
+  passwd_timeout_label =
+    gtk_label_new (STR("preferences_dialog.passwdTime.label"));
+
+  /* Make the labels right-justify. */
+  gtk_misc_set_alignment (GTK_MISC (timeout_label), 1.0, 0.5);
+  gtk_misc_set_alignment (GTK_MISC (cycle_label), 1.0, 0.5);
+  gtk_misc_set_alignment (GTK_MISC (faded_label), 1.0, 0.5);
+  gtk_misc_set_alignment (GTK_MISC (fade_ticks_label), 1.0, 0.5);
+  gtk_misc_set_alignment (GTK_MISC (lock_timeout_label), 1.0, 0.5);
+  gtk_misc_set_alignment (GTK_MISC (passwd_timeout_label), 1.0, 0.5);
+
+  prefs_done =
+    gtk_button_new_with_label (STR("preferences_dialog.done.label"));
+  prefs_cancel =
+    gtk_button_new_with_label (STR("preferences_dialog.cancel.label"));
+
+  /* Create the text-entry widgets. */
+  timeout_text = gtk_entry_new_with_max_length (8);
+  cycle_text = gtk_entry_new_with_max_length (8);
+  fade_text = gtk_entry_new_with_max_length (8);
+  fade_ticks_text = gtk_entry_new_with_max_length (8);
+  lock_timeout_text = gtk_entry_new_with_max_length (8);
+  passwd_timeout_text = gtk_entry_new_with_max_length (8);
+
+  /* Set their sizes. */
+  entry_width = gdk_text_width (GTK_WIDGET (timeout_text)->style->font,
+                               "00:00:00 ", 9);
+  gtk_widget_set_usize (GTK_WIDGET (timeout_text), entry_width, -2);
+  gtk_widget_set_usize (GTK_WIDGET (cycle_text), entry_width, -2);
+  gtk_widget_set_usize (GTK_WIDGET (fade_text), entry_width, -2);
+  gtk_widget_set_usize (GTK_WIDGET (fade_ticks_text), entry_width, -2);
+  gtk_widget_set_usize (GTK_WIDGET (lock_timeout_text), entry_width, -2);
+  gtk_widget_set_usize (GTK_WIDGET (passwd_timeout_text), entry_width, -2);
+
+  verbose_toggle = gtk_check_button_new_with_label
+    (STR("preferences_dialog.buttonbox.verbose.label"));
+  install_cmap_toggle = gtk_check_button_new_with_label
+    (STR("preferences_dialog.buttonbox.cmap.label"));
+  fade_toggle = gtk_check_button_new_with_label
+    (STR("preferences_dialog.buttonbox.fade.label"));
+  unfade_toggle = gtk_check_button_new_with_label
+    (STR("preferences_dialog.buttonbox.unfade.label"));
+  lock_toggle = gtk_check_button_new_with_label
+    (STR("preferences_dialog.buttonbox.lock.label"));
+
+  gtk_box_pack_start (GTK_BOX(box1), label, FALSE, FALSE, 0);
+  gtk_box_pack_start (GTK_BOX(box1), box2, FALSE, FALSE, 0);
+  gtk_box_pack_start (GTK_BOX(box1), box3, FALSE, FALSE, 0);
+
+# define FROB(widget, x, y) \
+    gtk_table_attach_defaults (GTK_TABLE(box2), widget, x, x+1, y, y+1)
+
+  FROB (timeout_label,         0, 0);
+  FROB (cycle_label,           0, 1);
+  FROB (faded_label,           0, 2);
+  FROB (fade_ticks_label,      0, 3);
+  FROB (lock_timeout_label,    0, 4);
+  FROB (passwd_timeout_label,  0, 5);
+
+  FROB (timeout_text,          1, 0);
+  FROB (cycle_text,            1, 1);
+  FROB (fade_text,             1, 2);
+  FROB (fade_ticks_text,       1, 3);
+  FROB (lock_timeout_text,     1, 4);
+  FROB (passwd_timeout_text,   1, 5);
+
+  FROB (verbose_toggle,                2, 0);
+  FROB (install_cmap_toggle,   2, 1);
+  FROB (fade_toggle,           2, 2);
+  FROB (unfade_toggle,         2, 3);
+  FROB (lock_toggle,           2, 4);
+# undef FROB
+  gtk_table_set_col_spacings (GTK_TABLE(box2), 10);
+
+  gtk_box_pack_start (GTK_BOX(box3), prefs_done, TRUE, FALSE, 0);
+  gtk_box_pack_start (GTK_BOX(box3), prefs_cancel, TRUE, FALSE, 0);
+
+  gtk_container_add (GTK_CONTAINER (window), box1);
+
+  gtk_widget_show_all (window);
+
+  preferences_dialog = window;
+  preferences_form = window;
+}
+
+
+void
+create_demo_dialog (void *ignore1, void *ignore2, void *ignore3)
+{
+  GtkWidget *window, *box1, *box2, *box3, *list;
+
+  window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+
+  /* Set the minimum size. */
+  gtk_widget_set_usize (GTK_WIDGET (window), 1, 1);
+
+  /* Set the default size. */
+  gtk_window_set_default_size (GTK_WINDOW (window), 600, 300);
+
+  gtk_container_set_border_width (GTK_CONTAINER (window), 10);
+
+  box1 = gtk_vbox_new (FALSE, 6);
+  box2 = gtk_hbutton_box_new ();
+  box3 = gtk_hbox_new (FALSE, 6);
+  list = gtk_list_new ();
+
+  label1 = gtk_label_new (STR("label1.label"));
+  label2 = gtk_label_new (STR("label2.label"));
+
+  demo_list = gtk_scrolled_window_new (0, 0);
+  gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (demo_list),
+                                  GTK_POLICY_NEVER, GTK_POLICY_ALWAYS);
+  gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (demo_list),
+                                         list);
+  gtk_widget_show (list);
+
+  text_line = gtk_entry_new ();
+  gtk_entry_set_editable (GTK_ENTRY (text_line), TRUE);
+  text_activate = gtk_button_new_with_label (STR("demo_dialog.run.label"));
+
+  GTK_WIDGET (text_line)->style =
+    gtk_style_copy (GTK_WIDGET (text_line)->style);
+  GTK_WIDGET (text_line)->style->font =
+    gdk_font_load (STR("demo_dialog.Text.font"));
+
+  next = gtk_button_new_with_label (STR("demo_dialog.next.label"));
+  prev = gtk_button_new_with_label (STR("demo_dialog.prev.label"));
+  edit = gtk_button_new_with_label (STR("demo_dialog.edit.label"));
+  done = gtk_button_new_with_label (STR("demo_dialog.done.label"));
+
+  gtk_widget_show (box1);
+  gtk_widget_show (box2);
+  gtk_widget_show (box3);
+  gtk_widget_show (label1);
+  gtk_widget_show (label2);
+  gtk_widget_show (demo_list);
+  gtk_widget_show (text_activate);
+  gtk_widget_show (text_line);
+  gtk_widget_show (next);
+  gtk_widget_show (prev);
+  gtk_widget_show (edit);
+  gtk_widget_show (done);
+
+  gtk_box_pack_start (GTK_BOX(box3), text_line, TRUE, TRUE, 0);
+  gtk_box_pack_start (GTK_BOX(box3), text_activate, FALSE, FALSE, 0);
+
+  gtk_box_pack_start (GTK_BOX(box1), label1, FALSE, FALSE, 0);
+  gtk_box_pack_start (GTK_BOX(box1), label2, FALSE, FALSE, 0);
+  gtk_box_pack_start (GTK_BOX(box1), demo_list, TRUE, TRUE, 0);
+  gtk_box_pack_start (GTK_BOX(box1), box3, FALSE, FALSE, 0);
+  gtk_box_pack_start (GTK_BOX(box1), box2, FALSE, FALSE, 0);
+
+  gtk_box_pack_start (GTK_BOX(box2), next, TRUE, FALSE, 0);
+  gtk_box_pack_start (GTK_BOX(box2), prev, TRUE, FALSE, 0);
+  gtk_box_pack_start (GTK_BOX(box2), edit, TRUE, FALSE, 0);
+  gtk_box_pack_start (GTK_BOX(box2), done, TRUE, FALSE, 0);
+
+  gtk_container_add (GTK_CONTAINER (window), box1);
+
+  demo_dialog = window;
+  demo_form = window;
+}
diff --git a/driver/dialogs-Xaw.c b/driver/dialogs-Xaw.c
new file mode 100644 (file)
index 0000000..757a91e
--- /dev/null
@@ -0,0 +1,259 @@
+/* dialogs-Xaw.c --- Athena widgets for demo, options, and password dialogs.
+ * xscreensaver, Copyright (c) 1997, 1998 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software 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.  No representations are made about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or 
+ * implied warranty.
+ *
+ * Most of this code contributed by Jon A. Christopher <jac8782@tamu.edu>
+ * Copyright 1997, with the same permissions as above.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <X11/Intrinsic.h>
+#include <X11/StringDefs.h>
+#include <X11/Shell.h>
+#include <X11/Xaw/Form.h>
+#include <X11/Xaw/Box.h>
+#include <X11/Xaw/List.h>
+#include <X11/Xaw/Command.h>
+#include <X11/Xaw/Toggle.h>
+#include <X11/Xaw/Viewport.h>
+#include <X11/Xaw/Dialog.h>
+#include <X11/Xaw/AsciiText.h>
+
+#include <stdio.h>
+
+#include "visual.h"    /* for visual_depth() */
+
+Widget preferences_dialog;
+Widget preferences_form;
+Widget timeout_text;
+Widget cycle_text;
+Widget fade_text;
+Widget fade_ticks_text;
+Widget lock_timeout_text;
+Widget passwd_timeout_text;
+Widget verbose_toggle;
+Widget install_cmap_toggle;
+Widget fade_toggle;
+Widget unfade_toggle;
+Widget lock_toggle;
+Widget prefs_done;
+Widget prefs_cancel;
+
+Widget demo_dialog;
+Widget demo_form;
+Widget label1;
+/*Widget label2;*/
+/*Widget text_area;*/
+Widget demo_list;
+Widget text_line;
+/*Widget vline;*/
+Widget next;
+Widget prev;
+Widget edit;
+Widget done;
+Widget restart;
+/*Widget spacer;*/
+
+static Widget buttonbox, textbox, okbox;
+
+
+void
+create_preferences_dialog(Widget parent, Visual *visual, Colormap colormap)
+{
+  Widget rlabel;
+  int depth = visual_depth(XtScreen(parent), visual);
+
+  preferences_dialog = 
+    XtVaCreatePopupShell("preferences_dialog", transientShellWidgetClass, parent,
+                        XtNvisual, visual,
+                        XtNcolormap, colormap,
+                        XtNdepth, depth,
+                        NULL);
+
+  preferences_form =
+    XtVaCreateManagedWidget("preferences_form", formWidgetClass,
+                           preferences_dialog,
+                        XtNvisual, visual,
+                        XtNcolormap, colormap,
+                        XtNdepth, depth,
+                           NULL);
+
+  rlabel = XtVaCreateManagedWidget("label1", labelWidgetClass, preferences_form,
+                                  XtNleft, XtChainLeft,
+                                  XtNright, XtChainRight,
+                                  XtNtop, XtChainTop,
+                                  NULL);
+
+  textbox=
+    XtVaCreateManagedWidget("textbox", formWidgetClass, preferences_form,
+                           XtNleft, XtChainLeft,
+                           XtNfromVert, rlabel,
+                           NULL);
+  okbox=
+    XtVaCreateManagedWidget("textbox", boxWidgetClass, preferences_form,
+                           XtNleft, XtChainLeft,
+                           XtNright, XtChainRight,
+                           XtNfromVert, textbox,
+                           XtNorientation, XtorientHorizontal,
+                           NULL);
+  timeout_text=
+    XtVaCreateManagedWidget("timeout", dialogWidgetClass, textbox,
+                           XtNleft, XtChainLeft,
+                           XtNright, XtChainRight,
+                           XtNtop, XtChainTop,
+                           NULL);
+  cycle_text=
+    XtVaCreateManagedWidget("cycle", dialogWidgetClass, textbox,
+                           XtNleft, XtChainLeft,
+                           XtNright, XtChainRight,
+                           XtNfromVert, timeout_text,
+                           NULL);
+  fade_text=
+    XtVaCreateManagedWidget("fade", dialogWidgetClass, textbox,
+                           XtNleft, XtChainLeft,
+                           XtNright, XtChainRight,
+                           XtNfromVert, cycle_text,
+                           NULL);
+
+  fade_ticks_text =
+    XtVaCreateManagedWidget("ticks", dialogWidgetClass, textbox,
+                           XtNtop, XtChainTop,
+                           XtNright, XtChainRight,
+                           XtNfromHoriz, timeout_text,
+                           NULL);
+
+  lock_timeout_text =
+    XtVaCreateManagedWidget("lockTime", dialogWidgetClass, textbox,
+                           XtNfromVert, fade_ticks_text,
+                           XtNright, XtChainRight,
+                           XtNfromHoriz, cycle_text,
+                           NULL);
+
+  passwd_timeout_text =
+    XtVaCreateManagedWidget("passwdTime", dialogWidgetClass, textbox,
+                           XtNfromVert, lock_timeout_text,
+                           XtNright, XtChainRight,
+                           XtNfromHoriz, fade_text,
+                           NULL);
+
+  buttonbox=
+    XtVaCreateManagedWidget("buttonbox", boxWidgetClass, preferences_form,
+                           XtNfromVert, rlabel,
+                           XtNfromHoriz, textbox,
+                           XtNright, XtChainRight,
+                           XtNorientation, XtorientVertical,
+                           NULL);
+  verbose_toggle =
+    XtVaCreateManagedWidget("verbose", toggleWidgetClass, buttonbox,
+                           NULL);
+  install_cmap_toggle =
+    XtVaCreateManagedWidget("cmap", toggleWidgetClass, buttonbox,
+                           NULL);
+  fade_toggle =
+    XtVaCreateManagedWidget("fade", toggleWidgetClass, buttonbox,
+                           NULL);
+  unfade_toggle =
+    XtVaCreateManagedWidget("unfade", toggleWidgetClass, buttonbox,
+                           NULL);
+  lock_toggle = 
+    XtVaCreateManagedWidget("lock", toggleWidgetClass, buttonbox,
+                           NULL);
+
+
+  prefs_done = XtVaCreateManagedWidget("done", commandWidgetClass, okbox,
+                                    NULL);
+  prefs_cancel = XtVaCreateManagedWidget("cancel", commandWidgetClass, okbox,
+                                      NULL);
+}
+
+void
+create_demo_dialog(Widget parent, Visual *visual, Colormap colormap)
+{
+  Widget subform, box, viewport, label2;
+  int depth = visual_depth(XtScreen(parent), visual);
+
+  demo_dialog = 
+    XtVaCreatePopupShell("demo_dialog", transientShellWidgetClass, parent,
+                        XtNvisual, visual,
+                        XtNcolormap, colormap,
+                        XtNdepth, depth,
+                        NULL);
+
+  demo_form =
+    XtVaCreateManagedWidget("demo_form", formWidgetClass, demo_dialog,
+                           XtNvisual, visual,
+                           XtNcolormap, colormap,
+                           XtNdepth, depth,
+                           XtNleft, XtChainLeft,
+                           XtNright, XtChainRight,
+                           XtNtop, XtChainTop,
+                           NULL);
+
+  label1 = XtVaCreateManagedWidget("label1", labelWidgetClass, demo_form,
+                           XtNleft, XtChainLeft,
+                           XtNright, XtChainRight,
+                           XtNtop, XtChainTop,
+                           NULL);
+
+  label2 = XtVaCreateManagedWidget("label2", labelWidgetClass, demo_form,
+                           XtNleft, XtChainLeft,
+                           XtNright, XtChainRight,
+                           XtNfromVert, label1,
+                           NULL);
+
+  subform =
+    XtVaCreateManagedWidget("subform", formWidgetClass, demo_form,
+                           XtNleft, XtChainLeft,
+                           XtNright, XtChainRight,
+                           XtNfromVert, label2,
+                           XtNresizable, True,
+                           NULL);
+  viewport =
+    XtVaCreateManagedWidget("viewport", viewportWidgetClass, subform,
+                           XtNtop, XtChainTop,
+                           XtNleft, XtChainLeft,
+                           XtNright, XtChainRight,
+                           XtNallowVert, TRUE,
+                           XtNallowHoriz, TRUE,
+                           XtNforceBars, TRUE,
+                           NULL);
+
+  demo_list = XtVaCreateManagedWidget("demo_list", listWidgetClass, viewport,
+                                     XtNverticalList, TRUE,
+                                     XtNdefaultColumns, 1,
+                                     NULL);
+
+  text_line = XtVaCreateManagedWidget("text", asciiTextWidgetClass, subform,
+                                     XtNleft, XtChainLeft,
+                                     XtNright, XtChainRight,
+                                     XtNfromVert, viewport,
+                                     XtNbottom, XtChainBottom,
+                                     XtNeditType, XawtextEdit,
+                                     NULL);
+
+  box =
+    XtVaCreateManagedWidget("box", boxWidgetClass, demo_form,
+                           XtNleft, XtChainLeft,
+                           XtNfromVert, subform,
+                           XtNbottom, XtChainBottom,
+                           XtNright, XtChainRight,
+                           XtNorientation, XtEhorizontal,
+                           NULL);
+  next = XtVaCreateManagedWidget("next", commandWidgetClass, box, NULL);
+  prev = XtVaCreateManagedWidget("prev", commandWidgetClass, box, NULL);
+  edit = XtVaCreateManagedWidget("edit", commandWidgetClass, box, NULL);
+#if 0
+  restart = XtVaCreateManagedWidget("restart", commandWidgetClass, box, NULL);
+#endif
+  done = XtVaCreateManagedWidget("done", commandWidgetClass, box, NULL);
+}
diff --git a/driver/dialogs-Xm.c b/driver/dialogs-Xm.c
new file mode 100644 (file)
index 0000000..930b7b7
--- /dev/null
@@ -0,0 +1,573 @@
+/* dialogs-Xm.c --- Motif widgets for demo, options, and password dialogs.
+ * xscreensaver, Copyright (c) 1993-1998 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software 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.  No representations are made about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or 
+ * implied warranty.
+ */
+
+/* The code in this file started off its life as the output of XDesigner,
+   but I've since hacked it by hand...  It's a mess, avert your eyes.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <X11/Xatom.h>
+#include <X11/Intrinsic.h>
+#include <X11/Shell.h>
+
+#include <Xm/Xm.h>
+#include <Xm/DialogS.h>
+#include <Xm/DrawnB.h>
+#include <Xm/Form.h>
+#include <Xm/Label.h>
+#include <Xm/List.h>
+#include <Xm/PushB.h>
+#include <Xm/ScrollBar.h>
+#include <Xm/Separator.h>
+#include <Xm/TextF.h>
+#include <Xm/ToggleB.h>
+
+#include <Xm/SelectioB.h>
+
+#include <stdio.h>
+
+#include "visual.h"    /* for visual_depth() */
+
+Widget preferences_dialog;
+Widget preferences_form;
+Widget timeout_text;
+Widget cycle_text;
+Widget fade_text;
+Widget fade_ticks_text;
+Widget lock_timeout_text;
+Widget passwd_timeout_text;
+Widget verbose_toggle;
+Widget install_cmap_toggle;
+Widget fade_toggle;
+Widget unfade_toggle;
+Widget lock_toggle;
+Widget prefs_done;
+Widget prefs_cancel;
+
+Widget demo_dialog;
+Widget demo_form;
+Widget label1;
+Widget label2;
+Widget text_area;
+Widget demo_list;
+Widget text_line;
+Widget vline;
+Widget next;
+Widget prev;
+Widget edit;
+Widget done;
+Widget restart;
+Widget spacer;
+
+void
+create_preferences_dialog(Widget parent, Visual *visual, Colormap colormap)
+{
+  Widget children[22];      /* Children to manage */
+  Arg al[64];           /* Arg List */
+  register int ac = 0;      /* Arg Count */
+  Widget widget12;
+  Widget widget13;
+  Widget widget14;
+  Widget widget15;
+  Widget widget16;
+  Widget widget17;
+  Widget widget18;
+  Widget widget48;
+  Widget widget29;
+
+  Widget real_dialog;
+  Widget w;
+
+  ac = 0;
+  XtSetArg (al[ac], XmNvisual, visual); ac++;
+  XtSetArg (al[ac], XmNcolormap, colormap); ac++;
+  XtSetArg (al[ac], XmNdepth, visual_depth(XtScreen(parent), visual)); ac++;
+
+  real_dialog = XmCreatePromptDialog (parent, "preferencesForm", al, ac);
+  preferences_dialog = XtParent(real_dialog);
+
+  w = XmSelectionBoxGetChild (real_dialog, XmDIALOG_SEPARATOR);
+  if (w) XtUnmanageChild (w);
+  w = XmSelectionBoxGetChild (real_dialog, XmDIALOG_TEXT);
+  if (w) XtUnmanageChild (w);
+  w = XmSelectionBoxGetChild (real_dialog, XmDIALOG_SELECTION_LABEL);
+  if (w) XtUnmanageChild (w);
+  w = XmSelectionBoxGetChild (real_dialog, XmDIALOG_HELP_BUTTON);
+  if (w) XtUnmanageChild (w);
+
+  ac = 0;
+  XtSetArg (al [ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+  XtSetArg (al [ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
+  XtSetArg (al [ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+  XtSetArg (al [ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+  preferences_form = XmCreateForm (real_dialog, "form", al, ac);
+  XtManageChild (preferences_form);
+
+  ac = 0;
+
+  widget12 = XmCreateLabel ( preferences_form, "preferencesLabel", al, ac );
+  widget13 = XmCreateSeparator ( preferences_form, "separator", al, ac );
+  XtSetArg(al[ac], XmNalignment, XmALIGNMENT_END); ac++;
+  widget14 = XmCreateLabel ( preferences_form, "timeoutLabel", al, ac );
+  ac = 0;
+  XtSetArg(al[ac], XmNalignment, XmALIGNMENT_END); ac++;
+  widget15 = XmCreateLabel ( preferences_form, "cycleLabel", al, ac );
+  ac = 0;
+  XtSetArg(al[ac], XmNalignment, XmALIGNMENT_END); ac++;
+  widget16 = XmCreateLabel ( preferences_form, "fadeSecondsLabel", al, ac );
+  ac = 0;
+  XtSetArg(al[ac], XmNalignment, XmALIGNMENT_END); ac++;
+  widget17 = XmCreateLabel ( preferences_form, "fadeTicksLabel", al, ac );
+  ac = 0;
+  XtSetArg(al[ac], XmNalignment, XmALIGNMENT_END); ac++;
+  widget18 = XmCreateLabel ( preferences_form, "lockLabel", al, ac );
+  ac = 0;
+  XtSetArg(al[ac], XmNalignment, XmALIGNMENT_END); ac++;
+  widget48 = XmCreateLabel ( preferences_form, "passwdLabel", al, ac );
+  ac = 0;
+  timeout_text = XmCreateTextField ( preferences_form, "timeoutText", al, ac );
+  cycle_text = XmCreateTextField ( preferences_form, "cycleText", al, ac );
+  fade_text = XmCreateTextField ( preferences_form, "fadeSecondsText", al, ac);
+  fade_ticks_text = XmCreateTextField ( preferences_form, "fadeTicksText", al, ac);
+  lock_timeout_text = XmCreateTextField ( preferences_form, "passwdText", al, ac);
+  passwd_timeout_text = XmCreateTextField ( preferences_form, "lockText", al, ac);
+  XtSetArg(al[ac], XmNalignment, XmALIGNMENT_BEGINNING); ac++;
+  verbose_toggle = XmCreateToggleButton (preferences_form,"verboseToggle",al,ac);
+  ac = 0;
+  XtSetArg(al[ac], XmNalignment, XmALIGNMENT_BEGINNING); ac++;
+  install_cmap_toggle = XmCreateToggleButton ( preferences_form, "cmapToggle", al, ac);
+  ac = 0;
+  XtSetArg(al[ac], XmNalignment, XmALIGNMENT_BEGINNING); ac++;
+  fade_toggle = XmCreateToggleButton ( preferences_form, "fadeToggle", al, ac);
+  ac = 0;
+  XtSetArg(al[ac], XmNalignment, XmALIGNMENT_BEGINNING); ac++;
+  unfade_toggle = XmCreateToggleButton (preferences_form,"unfadeToggle",al,ac);
+  ac = 0;
+  XtSetArg(al[ac], XmNalignment, XmALIGNMENT_BEGINNING); ac++;
+  lock_toggle = XmCreateToggleButton ( preferences_form, "lockToggle", al, ac);
+  ac = 0;
+  widget29 = XmCreateSeparator ( preferences_form, "separator", al, ac );
+
+  prefs_done = XmSelectionBoxGetChild (real_dialog, XmDIALOG_OK_BUTTON);
+  prefs_cancel = XmSelectionBoxGetChild (real_dialog, XmDIALOG_CANCEL_BUTTON);
+
+  XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+  XtSetArg(al[ac], XmNtopOffset, 4); ac++;
+  XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+  XtSetArg(al[ac], XmNleftOffset, 4); ac++;
+  XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+  XtSetArg(al[ac], XmNrightOffset, 4); ac++;
+  XtSetValues ( widget12,al, ac );
+  ac = 0;
+
+  XtSetArg(al[ac], XmNtopAttachment, XmATTACH_WIDGET); ac++;
+  XtSetArg(al[ac], XmNtopOffset, 4); ac++;
+  XtSetArg(al[ac], XmNtopWidget, widget12); ac++;
+  XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_NONE); ac++;
+  XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+  XtSetArg(al[ac], XmNleftOffset, 0); ac++;
+  XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+  XtSetArg(al[ac], XmNrightOffset, 0); ac++;
+  XtSetValues ( widget13,al, ac );
+  ac = 0;
+
+  XtSetArg(al[ac], XmNtopAttachment, XmATTACH_WIDGET); ac++;
+  XtSetArg(al[ac], XmNtopOffset, 4); ac++;
+  XtSetArg(al[ac], XmNtopWidget, widget13); ac++;
+  XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_OPPOSITE_WIDGET); ac++;
+  XtSetArg(al[ac], XmNbottomWidget, timeout_text); ac++;
+  XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+  XtSetArg(al[ac], XmNleftOffset, 20); ac++;
+  XtSetArg(al[ac], XmNrightAttachment, XmATTACH_WIDGET); ac++;
+  XtSetArg(al[ac], XmNrightOffset, 4); ac++;
+  XtSetArg(al[ac], XmNrightWidget, timeout_text); ac++;
+  XtSetValues ( widget14,al, ac );
+  ac = 0;
+
+  XtSetArg(al[ac], XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET); ac++;
+  XtSetArg(al[ac], XmNtopOffset, 0); ac++;
+  XtSetArg(al[ac], XmNtopWidget, cycle_text); ac++;
+  XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_OPPOSITE_WIDGET); ac++;
+  XtSetArg(al[ac], XmNbottomOffset, 0); ac++;
+  XtSetArg(al[ac], XmNbottomWidget, cycle_text); ac++;
+  XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+  XtSetArg(al[ac], XmNleftOffset, 20); ac++;
+  XtSetArg(al[ac], XmNrightAttachment, XmATTACH_WIDGET); ac++;
+  XtSetArg(al[ac], XmNrightOffset, 4); ac++;
+  XtSetArg(al[ac], XmNrightWidget, cycle_text); ac++;
+  XtSetValues ( widget15,al, ac );
+  ac = 0;
+
+  XtSetArg(al[ac], XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET); ac++;
+  XtSetArg(al[ac], XmNtopOffset, 0); ac++;
+  XtSetArg(al[ac], XmNtopWidget, fade_text); ac++;
+  XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_OPPOSITE_WIDGET); ac++;
+  XtSetArg(al[ac], XmNbottomOffset, 0); ac++;
+  XtSetArg(al[ac], XmNbottomWidget, fade_text); ac++;
+  XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+  XtSetArg(al[ac], XmNleftOffset, 20); ac++;
+  XtSetArg(al[ac], XmNrightAttachment, XmATTACH_WIDGET); ac++;
+  XtSetArg(al[ac], XmNrightOffset, 4); ac++;
+  XtSetArg(al[ac], XmNrightWidget, fade_text); ac++;
+  XtSetValues ( widget16,al, ac );
+  ac = 0;
+
+  XtSetArg(al[ac], XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET); ac++;
+  XtSetArg(al[ac], XmNtopOffset, 0); ac++;
+  XtSetArg(al[ac], XmNtopWidget, fade_ticks_text); ac++;
+  XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_OPPOSITE_WIDGET); ac++;
+  XtSetArg(al[ac], XmNbottomOffset, 0); ac++;
+  XtSetArg(al[ac], XmNbottomWidget, fade_ticks_text); ac++;
+  XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+  XtSetArg(al[ac], XmNleftOffset, 20); ac++;
+  XtSetArg(al[ac], XmNrightAttachment, XmATTACH_WIDGET); ac++;
+  XtSetArg(al[ac], XmNrightOffset, 4); ac++;
+  XtSetArg(al[ac], XmNrightWidget, fade_ticks_text); ac++;
+  XtSetValues ( widget17,al, ac );
+  ac = 0;
+
+  XtSetArg(al[ac], XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET); ac++;
+  XtSetArg(al[ac], XmNtopOffset, 0); ac++;
+  XtSetArg(al[ac], XmNtopWidget, lock_timeout_text); ac++;
+  XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_OPPOSITE_WIDGET); ac++;
+  XtSetArg(al[ac], XmNbottomOffset, 0); ac++;
+  XtSetArg(al[ac], XmNbottomWidget, lock_timeout_text); ac++;
+  XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+  XtSetArg(al[ac], XmNleftOffset, 19); ac++;
+  XtSetArg(al[ac], XmNrightAttachment, XmATTACH_WIDGET); ac++;
+  XtSetArg(al[ac], XmNrightOffset, 4); ac++;
+  XtSetArg(al[ac], XmNrightWidget, lock_timeout_text); ac++;
+  XtSetValues ( widget18,al, ac );
+  ac = 0;
+
+  XtSetArg(al[ac], XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET); ac++;
+  XtSetArg(al[ac], XmNtopOffset, 0); ac++;
+  XtSetArg(al[ac], XmNtopWidget, passwd_timeout_text); ac++;
+  XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_OPPOSITE_WIDGET); ac++;
+  XtSetArg(al[ac], XmNbottomOffset, 0); ac++;
+  XtSetArg(al[ac], XmNbottomWidget, passwd_timeout_text); ac++;
+  XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+  XtSetArg(al[ac], XmNleftOffset, 14); ac++;
+  XtSetArg(al[ac], XmNrightAttachment, XmATTACH_WIDGET); ac++;
+  XtSetArg(al[ac], XmNrightOffset, 4); ac++;
+  XtSetArg(al[ac], XmNrightWidget, passwd_timeout_text); ac++;
+  XtSetValues ( widget48,al, ac );
+  ac = 0;
+
+  XtSetArg(al[ac], XmNtopAttachment, XmATTACH_WIDGET); ac++;
+  XtSetArg(al[ac], XmNtopOffset, 4); ac++;
+  XtSetArg(al[ac], XmNtopWidget, widget13); ac++;
+  XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_NONE); ac++;
+  XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+  XtSetArg(al[ac], XmNleftOffset, 141); ac++;
+  XtSetArg(al[ac], XmNrightAttachment, XmATTACH_NONE); ac++;
+  XtSetValues ( timeout_text,al, ac );
+  ac = 0;
+
+  XtSetArg(al[ac], XmNtopAttachment, XmATTACH_WIDGET); ac++;
+  XtSetArg(al[ac], XmNtopOffset, 2); ac++;
+  XtSetArg(al[ac], XmNtopWidget, timeout_text); ac++;
+  XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_NONE); ac++;
+  XtSetArg(al[ac], XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET); ac++;
+  XtSetArg(al[ac], XmNleftOffset, 0); ac++;
+  XtSetArg(al[ac], XmNleftWidget, timeout_text); ac++;
+  XtSetArg(al[ac], XmNrightAttachment, XmATTACH_NONE); ac++;
+  XtSetValues ( cycle_text,al, ac );
+  ac = 0;
+
+  XtSetArg(al[ac], XmNtopAttachment, XmATTACH_WIDGET); ac++;
+  XtSetArg(al[ac], XmNtopOffset, 2); ac++;
+  XtSetArg(al[ac], XmNtopWidget, cycle_text); ac++;
+  XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_NONE); ac++;
+  XtSetArg(al[ac], XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET); ac++;
+  XtSetArg(al[ac], XmNleftOffset, 0); ac++;
+  XtSetArg(al[ac], XmNleftWidget, cycle_text); ac++;
+  XtSetArg(al[ac], XmNrightAttachment, XmATTACH_NONE); ac++;
+  XtSetValues ( fade_text,al, ac );
+  ac = 0;
+
+  XtSetArg(al[ac], XmNtopAttachment, XmATTACH_WIDGET); ac++;
+  XtSetArg(al[ac], XmNtopOffset, 2); ac++;
+  XtSetArg(al[ac], XmNtopWidget, fade_text); ac++;
+  XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_NONE); ac++;
+  XtSetArg(al[ac], XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET); ac++;
+  XtSetArg(al[ac], XmNleftOffset, 0); ac++;
+  XtSetArg(al[ac], XmNleftWidget, fade_text); ac++;
+  XtSetArg(al[ac], XmNrightAttachment, XmATTACH_NONE); ac++;
+  XtSetValues ( fade_ticks_text,al, ac );
+  ac = 0;
+
+  XtSetArg(al[ac], XmNtopAttachment, XmATTACH_WIDGET); ac++;
+  XtSetArg(al[ac], XmNtopOffset, 2); ac++;
+  XtSetArg(al[ac], XmNtopWidget, fade_ticks_text); ac++;
+  XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_NONE); ac++;
+  XtSetArg(al[ac], XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET); ac++;
+  XtSetArg(al[ac], XmNleftOffset, 0); ac++;
+  XtSetArg(al[ac], XmNleftWidget, fade_ticks_text); ac++;
+  XtSetArg(al[ac], XmNrightAttachment, XmATTACH_NONE); ac++;
+  XtSetValues ( lock_timeout_text,al, ac );
+  ac = 0;
+
+  XtSetArg(al[ac], XmNtopAttachment, XmATTACH_WIDGET); ac++;
+  XtSetArg(al[ac], XmNtopOffset, 4); ac++;
+  XtSetArg(al[ac], XmNtopWidget, lock_timeout_text); ac++;
+  XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_NONE); ac++;
+  XtSetArg(al[ac], XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET); ac++;
+  XtSetArg(al[ac], XmNleftOffset, 0); ac++;
+  XtSetArg(al[ac], XmNleftWidget, lock_timeout_text); ac++;
+  XtSetArg(al[ac], XmNrightAttachment, XmATTACH_NONE); ac++;
+  XtSetValues ( passwd_timeout_text,al, ac );
+  ac = 0;
+
+  XtSetArg(al[ac], XmNtopAttachment, XmATTACH_WIDGET); ac++;
+  XtSetArg(al[ac], XmNtopOffset, 4); ac++;
+  XtSetArg(al[ac], XmNtopWidget, widget13); ac++;
+  XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_OPPOSITE_WIDGET); ac++;
+  XtSetArg(al[ac], XmNbottomOffset, 0); ac++;
+  XtSetArg(al[ac], XmNbottomWidget, timeout_text); ac++;
+  XtSetArg(al[ac], XmNleftAttachment, XmATTACH_WIDGET); ac++;
+  XtSetArg(al[ac], XmNleftOffset, 20); ac++;
+  XtSetArg(al[ac], XmNleftWidget, timeout_text); ac++;
+  XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+  XtSetArg(al[ac], XmNrightOffset, 20); ac++;
+  XtSetValues ( verbose_toggle,al, ac );
+  ac = 0;
+
+  XtSetArg(al[ac], XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET); ac++;
+  XtSetArg(al[ac], XmNtopOffset, 0); ac++;
+  XtSetArg(al[ac], XmNtopWidget, cycle_text); ac++;
+  XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_OPPOSITE_WIDGET); ac++;
+  XtSetArg(al[ac], XmNbottomOffset, 0); ac++;
+  XtSetArg(al[ac], XmNbottomWidget, cycle_text); ac++;
+  XtSetArg(al[ac], XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET); ac++;
+  XtSetArg(al[ac], XmNleftOffset, 0); ac++;
+  XtSetArg(al[ac], XmNleftWidget, verbose_toggle); ac++;
+  XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+  XtSetArg(al[ac], XmNrightOffset, 20); ac++;
+  XtSetValues ( install_cmap_toggle,al, ac );
+  ac = 0;
+
+  XtSetArg(al[ac], XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET); ac++;
+  XtSetArg(al[ac], XmNtopOffset, 0); ac++;
+  XtSetArg(al[ac], XmNtopWidget, fade_text); ac++;
+  XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_OPPOSITE_WIDGET); ac++;
+  XtSetArg(al[ac], XmNbottomOffset, 0); ac++;
+  XtSetArg(al[ac], XmNbottomWidget, fade_text); ac++;
+  XtSetArg(al[ac], XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET); ac++;
+  XtSetArg(al[ac], XmNleftOffset, 0); ac++;
+  XtSetArg(al[ac], XmNleftWidget, install_cmap_toggle); ac++;
+  XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+  XtSetArg(al[ac], XmNrightOffset, 20); ac++;
+  XtSetValues ( fade_toggle,al, ac );
+  ac = 0;
+
+  XtSetArg(al[ac], XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET); ac++;
+  XtSetArg(al[ac], XmNtopOffset, 0); ac++;
+  XtSetArg(al[ac], XmNtopWidget, fade_ticks_text); ac++;
+  XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_OPPOSITE_WIDGET); ac++;
+  XtSetArg(al[ac], XmNbottomOffset, 0); ac++;
+  XtSetArg(al[ac], XmNbottomWidget, fade_ticks_text); ac++;
+  XtSetArg(al[ac], XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET); ac++;
+  XtSetArg(al[ac], XmNleftOffset, 0); ac++;
+  XtSetArg(al[ac], XmNleftWidget, fade_toggle); ac++;
+  XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+  XtSetArg(al[ac], XmNrightOffset, 20); ac++;
+  XtSetValues ( unfade_toggle,al, ac );
+  ac = 0;
+
+  XtSetArg(al[ac], XmNtopAttachment, XmATTACH_OPPOSITE_WIDGET); ac++;
+  XtSetArg(al[ac], XmNtopOffset, 0); ac++;
+  XtSetArg(al[ac], XmNtopWidget, lock_timeout_text); ac++;
+  XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_OPPOSITE_WIDGET); ac++;
+  XtSetArg(al[ac], XmNbottomOffset, 0); ac++;
+  XtSetArg(al[ac], XmNbottomWidget, lock_timeout_text); ac++;
+  XtSetArg(al[ac], XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET); ac++;
+  XtSetArg(al[ac], XmNleftOffset, 0); ac++;
+  XtSetArg(al[ac], XmNleftWidget, unfade_toggle); ac++;
+  XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+  XtSetArg(al[ac], XmNrightOffset, 20); ac++;
+  XtSetValues ( lock_toggle,al, ac );
+  ac = 0;
+
+  XtSetArg(al[ac], XmNtopAttachment, XmATTACH_WIDGET); ac++;
+  XtSetArg(al[ac], XmNtopOffset, 0); ac++;
+  XtSetArg(al[ac], XmNtopWidget, passwd_timeout_text); ac++;
+
+  XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
+  XtSetArg(al[ac], XmNbottomOffset, 4); ac++;
+
+  XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+  XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+  XtSetValues ( widget29,al, ac );
+  ac = 0;
+
+
+
+  ac = 0;
+  children[ac++] = widget12;
+  children[ac++] = widget13;
+  children[ac++] = widget14;
+  children[ac++] = widget15;
+  children[ac++] = widget16;
+  children[ac++] = widget17;
+  children[ac++] = widget18;
+  children[ac++] = widget48;
+  children[ac++] = timeout_text;
+  children[ac++] = cycle_text;
+  children[ac++] = fade_text;
+  children[ac++] = fade_ticks_text;
+  children[ac++] = lock_timeout_text;
+  children[ac++] = passwd_timeout_text;
+  children[ac++] = verbose_toggle;
+  children[ac++] = install_cmap_toggle;
+  children[ac++] = fade_toggle;
+  children[ac++] = unfade_toggle;
+  children[ac++] = lock_toggle;
+  children[ac++] = widget29;
+
+  XtManageChildren(children, ac);
+  ac = 0;
+
+  preferences_form = real_dialog;
+}
+
+
+void
+create_demo_dialog(Widget parent, Visual *visual, Colormap colormap)
+{
+  Arg al[64];           /* Arg List */
+  register int ac = 0;      /* Arg Count */
+
+  Widget real_dialog;
+  Widget w;
+
+
+  ac = 0;
+  XtSetArg (al[ac], XmNvisual, visual); ac++;
+  XtSetArg (al[ac], XmNcolormap, colormap); ac++;
+  XtSetArg (al[ac], XmNdepth, visual_depth(XtScreen(parent), visual)); ac++;
+
+
+  real_dialog = XmCreatePromptDialog (parent, "demoForm", al, ac);
+  demo_dialog = XtParent(real_dialog);
+
+  w = XmSelectionBoxGetChild (real_dialog, XmDIALOG_SEPARATOR);
+  if (w) XtUnmanageChild (w);
+  w = XmSelectionBoxGetChild (real_dialog, XmDIALOG_TEXT);
+  if (w) XtUnmanageChild (w);
+  w = XmSelectionBoxGetChild (real_dialog, XmDIALOG_SELECTION_LABEL);
+  if (w) XtUnmanageChild (w);
+  w = XmSelectionBoxGetChild (real_dialog, XmDIALOG_OK_BUTTON);
+  if (w) XtUnmanageChild (w);
+  w = XmSelectionBoxGetChild (real_dialog, XmDIALOG_CANCEL_BUTTON);
+  if (w) XtUnmanageChild (w);
+  w = XmSelectionBoxGetChild (real_dialog, XmDIALOG_HELP_BUTTON);
+  if (w) XtUnmanageChild (w);
+
+  ac = 0;
+  XtSetArg (al [ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+  XtSetArg (al [ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
+  XtSetArg (al [ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+  XtSetArg (al [ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+  demo_form = XmCreateForm (real_dialog, "form", al, ac);
+  XtManageChild (demo_form);
+
+  label1 = XmCreateLabel ( demo_form, "label1", al, ac );
+  label2 = XmCreateLabel ( demo_form, "label2", al, ac );
+  demo_list = XmCreateScrolledList ( demo_form, "demoList", al, ac );
+  text_area = XtParent ( demo_list );
+
+  ac = 0;
+  text_line = XmSelectionBoxGetChild (real_dialog, XmDIALOG_TEXT);
+  XtManageChild(text_line);
+
+  /* #### ARRGH!  This is apparently the only way to make hitting return in
+     the text field not *ALSO* activate the most-recently-selected button!
+
+     This has the unfortunate side effect of making the buttons not be
+     keyboard-traversable, but that's less bad than not being able to try
+     out new switches by typing them into the text field.
+
+     XmSelectionBox(3M) says in the "Additional Behavior" section:
+         KActivate:
+                   Calls the activate callbacks for the button with
+                   the keyboard focus.  [... ]  In a List widget or
+                   single-line Text widget, the List or Text action
+                   associated with KActivate is called before the
+                   SelectionBox actions associated with KActivate."
+
+     So they take it as a given that when running activateCallback on a single-
+     line Text widget, you'll also want to run activateCallback on whatever the
+     currently-focussed button is as well!  Morons!  Villains!  Shitheads!
+
+     (Perhaps there's some way to override XmSelectionBox's KActivate behavior.
+     I doubt it, but if there is, I don't know it.)
+  */
+  ac = 0;
+  XtSetArg(al[ac], XmNtraversalOn, False); ac++;
+
+  next = XmCreatePushButton ( real_dialog, "next", al, ac );
+  prev = XmCreatePushButton ( real_dialog, "prev", al, ac );
+  edit = XmCreatePushButton ( real_dialog, "edit", al, ac );
+  done = XmCreatePushButton ( real_dialog, "done", al, ac );
+#if 0
+  restart = XmCreatePushButton ( real_dialog, "restart", al, ac );
+#endif
+  XtManageChild(next);
+  XtManageChild(prev);
+  XtManageChild(edit);
+  XtManageChild(done);
+#if 0
+  XtManageChild(restart);
+#endif
+
+  ac = 0;
+  XtSetArg(al[ac], XmNtopAttachment, XmATTACH_FORM); ac++;
+  XtSetArg(al[ac], XmNtopOffset, 5); ac++;
+  XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_NONE); ac++;
+  XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+  XtSetArg(al[ac], XmNleftOffset, 4); ac++;
+  XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+  XtSetArg(al[ac], XmNrightOffset, 4); ac++;
+  XtSetValues ( label1,al, ac );
+  ac = 0;
+
+  XtSetArg(al[ac], XmNtopAttachment, XmATTACH_WIDGET); ac++;
+  XtSetArg(al[ac], XmNtopOffset, 4); ac++;
+  XtSetArg(al[ac], XmNtopWidget, label1); ac++;
+  XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_NONE); ac++;
+  XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+  XtSetArg(al[ac], XmNleftOffset, 4); ac++;
+  XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+  XtSetArg(al[ac], XmNrightOffset, 4); ac++;
+  XtSetValues ( label2,al, ac );
+  ac = 0;
+
+  XtSetArg(al[ac], XmNtopAttachment, XmATTACH_WIDGET); ac++;
+  XtSetArg(al[ac], XmNtopOffset, 4); ac++;
+  XtSetArg(al[ac], XmNtopWidget, label2); ac++;
+  XtSetArg(al[ac], XmNbottomAttachment, XmATTACH_FORM); ac++;
+  XtSetArg(al[ac], XmNleftAttachment, XmATTACH_FORM); ac++;
+  XtSetArg(al[ac], XmNleftOffset, 4); ac++;
+  XtSetArg(al[ac], XmNrightAttachment, XmATTACH_FORM); ac++;
+  XtSetArg(al[ac], XmNrightOffset, 4); ac++;
+  XtSetValues ( text_area,al, ac );
+
+  XtManageChild(demo_list);
+  XtManageChild(label1);
+  XtManageChild(label2);
+
+  demo_form = real_dialog;
+}
diff --git a/driver/link_axp.com b/driver/link_axp.com
new file mode 100644 (file)
index 0000000..a141892
--- /dev/null
@@ -0,0 +1,15 @@
+$! We fisrt test the version of DECW/Motif ; if 1.2 we need to link with new
+$! X11R5 libraries
+$@sys$update:decw$get_image_version sys$share:decw$xlibshr.exe decw$version
+$ if f$extract(4,3,decw$version).eqs."1.2"
+$ then
+$! DECW/Motif 1.2 : link with X11R5 libraries
+$ link xscreensaver-command,vms_axp_12.opt/opt
+$ link xscreensaver,demo,dialogs-xm,lock,passwd,stderr,subprocs,timers, -
+  windows,xset,vms-getpwnam,vms-hpwd,vms-validate,vms_axp_12.opt/opt
+$ else
+$! Else, link with X11R4 libraries
+$ link xscreensaver-command,vms_axp.opt/opt
+$ link xscreensaver,demo,dialogs-xm,lock,passwd,stderr,subprocs,timers, -
+  windows,xset,vms-getpwnam,vms-hpwd,vms-validate,vms_axp.opt/opt
+$ endif
diff --git a/driver/link_decc.com b/driver/link_decc.com
new file mode 100644 (file)
index 0000000..d1de0d0
--- /dev/null
@@ -0,0 +1,15 @@
+$! We fisrt test the version of DECW/Motif ; if 1.2 we need to link with new
+$! X11R5 libraries
+$@sys$update:decw$get_image_version sys$share:decw$xlibshr.exe decw$version
+$ if f$extract(4,3,decw$version).eqs."1.2"
+$ then
+$! DECW/Motif 1.2 : link with X11R5 libraries
+$ link xscreensaver-command,vms_decc_12.opt/opt
+$ link xscreensaver,demo,dialogs-xm,lock,passwd,stderr,subprocs,timers, -
+  windows,xset,vms-getpwnam,vms-hpwd,vms-validate,vms_decc_12.opt/opt
+$ else
+$! Else, link with X11R4 libraries
+$ link xscreensaver-command,vms_decc.opt/opt
+$ link xscreensaver,demo,dialogs-xm,lock,passwd,stderr,subprocs,timers, -
+  windows,xset,vms-getpwnam,vms-hpwd,vms-validate,vms_decc.opt/opt
+$ endif
diff --git a/driver/lock.c b/driver/lock.c
new file mode 100644 (file)
index 0000000..ce12efb
--- /dev/null
@@ -0,0 +1,1191 @@
+/* lock.c --- handling the password dialog for locking-mode.
+ * xscreensaver, Copyright (c) 1993-1998 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software 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.  No representations are made about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or 
+ * implied warranty.
+ */
+
+/* Athena locking code contributed by Jon A. Christopher <jac8782@tamu.edu> */
+/* Copyright 1997, with the same permissions as above. */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#ifndef NO_LOCKING   /* whole file */
+
+#include <X11/Intrinsic.h>
+#include "xscreensaver.h"
+#include "resources.h"
+
+#ifdef HAVE_SYSLOG
+# include <syslog.h>
+#endif /* HAVE_SYSLOG */
+
+#ifdef HAVE_XHPDISABLERESET
+# include <X11/XHPlib.h>
+  static void hp_lock_reset (saver_info *si, Bool lock_p);
+#endif /* HAVE_XHPDISABLERESET */
+
+#ifdef HAVE_VT_LOCKSWITCH
+# include <fcntl.h>
+# include <sys/ioctl.h>
+# include <sys/vt.h>
+  static void linux_lock_vt_switch (saver_info *si, Bool lock_p);
+#endif /* HAVE_VT_LOCKSWITCH */
+
+#ifdef HAVE_XF86VMODE
+# include <X11/extensions/xf86vmode.h>
+  static void xfree_lock_mode_switch (saver_info *si, Bool lock_p);
+#endif /* HAVE_XF86VMODE */
+
+
+#ifdef _VROOT_H_
+ERROR!  You must not include vroot.h in this file.
+#endif
+
+#ifndef VMS
+# include <pwd.h>
+#else /* VMS */
+
+extern char *getenv(const char *name);
+extern int validate_user(char *name, char *password);
+
+static Bool
+vms_passwd_valid_p(char *pw, Bool verbose_p)
+{
+  return (validate_user (getenv("USER"), typed_passwd) == 1);
+}
+# undef passwd_valid_p
+# define passwd_valid_p vms_passwd_valid_p
+
+#endif /* VMS */
+
+
+#undef MAX
+#define MAX(a,b) ((a)>(b)?(a):(b))
+
+enum passwd_state { pw_read, pw_ok, pw_null, pw_fail, pw_cancel, pw_time };
+
+struct passwd_dialog_data {
+
+  enum passwd_state state;
+  char typed_passwd [80];
+  XtIntervalId timer;
+  int i_beam;
+
+  float ratio;
+  Position x, y;
+  Dimension width;
+  Dimension height;
+  Dimension border_width;
+
+  char *heading_label;
+  char *body_label;
+  char *user_label;
+  char *passwd_label;
+  char *user_string;
+  char *passwd_string;
+
+  XFontStruct *heading_font;
+  XFontStruct *body_font;
+  XFontStruct *label_font;
+  XFontStruct *passwd_font;
+
+  Pixel foreground;
+  Pixel background;
+  Pixel passwd_foreground;
+  Pixel passwd_background;
+  Pixel logo_foreground;
+  Pixel logo_background;
+  Pixel shadow_top;
+  Pixel shadow_bottom;
+
+  Dimension logo_width;
+  Dimension logo_height;
+  Dimension thermo_width;
+  Dimension internal_border;
+  Dimension shadow_width;
+
+  Dimension passwd_field_x, passwd_field_y;
+  Dimension passwd_field_width, passwd_field_height;
+
+  Dimension thermo_field_x, thermo_field_y;
+  Dimension thermo_field_height;
+
+  Pixmap save_under;
+};
+
+static void draw_passwd_window (saver_info *si);
+static void update_passwd_window (saver_info *si, const char *printed_passwd,
+                                 float ratio);
+static void destroy_passwd_window (saver_info *si);
+static void undo_vp_motion (saver_info *si);
+
+
+static void
+make_passwd_window (saver_info *si)
+{
+  struct passwd *p = getpwuid (getuid ());
+  XSetWindowAttributes attrs;
+  unsigned long attrmask = 0;
+  Screen *screen = si->default_screen->screen;
+  passwd_dialog_data *pw = (passwd_dialog_data *) calloc (1, sizeof(*pw));
+  Colormap cmap = DefaultColormapOfScreen (screen);
+  char *f;
+
+  pw->ratio = 1.0;
+
+  pw->heading_label = get_string_resource ("passwd.heading.label",
+                                          "Dialog.Label.Label");
+  pw->body_label = get_string_resource ("passwd.body.label",
+                                       "Dialog.Label.Label");
+  pw->user_label = get_string_resource ("passwd.user.label",
+                                       "Dialog.Label.Label");
+  pw->passwd_label = get_string_resource ("passwd.passwd.label",
+                                         "Dialog.Label.Label");
+
+  if (!pw->heading_label)
+    pw->heading_label = strdup("ERROR: REESOURCES NOT INSTALLED CORRECTLY");
+  if (!pw->body_label)
+    pw->body_label = strdup("ERROR: REESOURCES NOT INSTALLED CORRECTLY");
+  if (!pw->user_label) pw->user_label = strdup("ERROR");
+  if (!pw->passwd_label) pw->passwd_label = strdup("ERROR");
+
+  /* Put the version number in the label. */
+  {
+    char *s = (char *) malloc (strlen(pw->heading_label) + 20);
+    sprintf(s, pw->heading_label, si->version);
+    free (pw->heading_label);
+    pw->heading_label = s;
+  }
+
+  pw->user_string = (p->pw_name ? p->pw_name : "???");
+  pw->passwd_string = strdup("");
+
+  f = get_string_resource ("passwd.headingFont", "Dialog.Font");
+  pw->heading_font = XLoadQueryFont (si->dpy, (f ? f : "fixed"));
+  if (!pw->heading_font) pw->heading_font = XLoadQueryFont (si->dpy, "fixed");
+  if (f) free (f);
+
+  f = get_string_resource("passwd.bodyFont", "Dialog.Font");
+  pw->body_font = XLoadQueryFont (si->dpy, (f ? f : "fixed"));
+  if (!pw->body_font) pw->body_font = XLoadQueryFont (si->dpy, "fixed");
+  if (f) free (f);
+
+  f = get_string_resource("passwd.labelFont", "Dialog.Font");
+  pw->label_font = XLoadQueryFont (si->dpy, (f ? f : "fixed"));
+  if (!pw->label_font) pw->label_font = XLoadQueryFont (si->dpy, "fixed");
+  if (f) free (f);
+
+  f = get_string_resource("passwd.passwdFont", "Dialog.Font");
+  pw->passwd_font = XLoadQueryFont (si->dpy, (f ? f : "fixed"));
+  if (!pw->passwd_font) pw->passwd_font = XLoadQueryFont (si->dpy, "fixed");
+  if (f) free (f);
+
+  pw->foreground = get_pixel_resource ("passwd.foreground",
+                                      "Dialog.Foreground",
+                                      si->dpy, cmap);
+  pw->background = get_pixel_resource ("passwd.background",
+                                      "Dialog.Background",
+                                      si->dpy, cmap);
+
+  if (pw->foreground == pw->background)
+    {
+      /* Make sure the error messages show up. */
+      pw->foreground = BlackPixelOfScreen (screen);
+      pw->background = WhitePixelOfScreen (screen);
+    }
+
+  pw->passwd_foreground = get_pixel_resource ("passwd.text.foreground",
+                                             "Dialog.Text.Foreground",
+                                             si->dpy, cmap);
+  pw->passwd_background = get_pixel_resource ("passwd.text.background",
+                                             "Dialog.Text.Background",
+                                             si->dpy, cmap);
+  pw->logo_foreground = get_pixel_resource ("passwd.logo.foreground",
+                                           "Dialog.Logo.Foreground",
+                                           si->dpy, cmap);
+  pw->logo_background = get_pixel_resource ("passwd.logo.background",
+                                           "Dialog.Logo.Background",
+                                           si->dpy, cmap);
+  pw->shadow_top = get_pixel_resource ("passwd.topShadowColor",
+                                      "Dialog.Foreground",
+                                      si->dpy, cmap);
+  pw->shadow_bottom = get_pixel_resource ("passwd.bottomShadowColor",
+                                         "Dialog.Background",
+                                         si->dpy, cmap);
+
+  pw->logo_width = get_integer_resource ("passwd.logo.width",
+                                        "Dialog.Logo.Width");
+  pw->logo_height = get_integer_resource ("passwd.logo.height",
+                                         "Dialog.Logo.Height");
+  pw->thermo_width = get_integer_resource ("passwd.thermometer.width",
+                                          "Dialog.Thermometer.Width");
+  pw->internal_border = get_integer_resource ("passwd.internalBorderWidth",
+                                             "Dialog.InternalBorderWidth");
+  pw->shadow_width = get_integer_resource ("passwd.shadowThickness",
+                                          "Dialog.ShadowThickness");
+
+  if (pw->logo_width == 0)  pw->logo_width = 150;
+  if (pw->logo_height == 0) pw->logo_height = 150;
+  if (pw->internal_border == 0) pw->internal_border = 15;
+  if (pw->shadow_width == 0) pw->shadow_width = 4;
+  if (pw->thermo_width == 0) pw->thermo_width = pw->shadow_width;
+
+  {
+    int direction, ascent, descent;
+    XCharStruct overall;
+
+    pw->width = 0;
+    pw->height = 0;
+
+    /* Measure the heading_label. */
+    XTextExtents (pw->heading_font,
+                 pw->heading_label, strlen(pw->heading_label),
+                 &direction, &ascent, &descent, &overall);
+    if (overall.width > pw->width) pw->width = overall.width;
+    pw->height += ascent + descent;
+
+    /* Measure the body_label. */
+    XTextExtents (pw->body_font,
+                 pw->body_label, strlen(pw->body_label),
+                 &direction, &ascent, &descent, &overall);
+    if (overall.width > pw->width) pw->width = overall.width;
+    pw->height += ascent + descent;
+
+    {
+      Dimension w2 = 0, w3 = 0;
+      Dimension h2 = 0, h3 = 0;
+      const char *passwd_string = "MMMMMMMMMMMM";
+
+      /* Measure the user_label. */
+      XTextExtents (pw->label_font,
+                   pw->user_label, strlen(pw->user_label),
+                   &direction, &ascent, &descent, &overall);
+      if (overall.width > w2)  w2 = overall.width;
+      h2 += ascent + descent;
+
+      /* Measure the passwd_label. */
+      XTextExtents (pw->label_font,
+                   pw->passwd_label, strlen(pw->passwd_label),
+                   &direction, &ascent, &descent, &overall);
+      if (overall.width > w2)  w2 = overall.width;
+      h2 += ascent + descent;
+
+      /* Measure the user_string. */
+      XTextExtents (pw->passwd_font,
+                   pw->user_string, strlen(pw->user_string),
+                   &direction, &ascent, &descent, &overall);
+      overall.width += (pw->shadow_width * 4);
+      ascent += (pw->shadow_width * 4);
+      if (overall.width > w3)  w3 = overall.width;
+      h3 += ascent + descent;
+
+      /* Measure the (maximally-sized, dummy) passwd_string. */
+      XTextExtents (pw->passwd_font,
+                   passwd_string, strlen(passwd_string),
+                   &direction, &ascent, &descent, &overall);
+      overall.width += (pw->shadow_width * 4);
+      ascent += (pw->shadow_width * 4);
+      if (overall.width > w3)  w3 = overall.width;
+      h3 += ascent + descent;
+
+      w2 = w2 + w3 + (pw->shadow_width * 2);
+      h2 = MAX (h2, h3);
+
+      if (w2 > pw->width)  pw->width  = w2;
+      pw->height += h2;
+    }
+
+    pw->width  += (pw->internal_border * 2);
+    pw->height += (pw->internal_border * 4);
+
+    pw->width += pw->thermo_width + (pw->shadow_width * 3);
+
+    if (pw->logo_height > pw->height)
+      pw->height = pw->logo_height;
+    else if (pw->height > pw->logo_height)
+      pw->logo_height = pw->height;
+
+    pw->logo_width = pw->logo_height;
+
+    pw->width += pw->logo_width;
+  }
+
+  attrmask |= CWOverrideRedirect; attrs.override_redirect = True;
+  attrmask |= CWEventMask; attrs.event_mask = ExposureMask|KeyPressMask;
+
+  {
+    int x, y, w, h;
+    get_screen_viewport (si->default_screen, &x, &y, &w, &h, False);
+    if (si->prefs.debug_p) w /= 2;
+    pw->x = x + ((w + pw->width) / 2) - pw->width;
+    pw->y = y + ((h + pw->height) / 2) - pw->height;
+    if (pw->x < x) pw->x = x;
+    if (pw->y < y) pw->y = y;
+  }
+
+  pw->border_width = get_integer_resource ("passwd.borderWidth",
+                                           "Dialog.BorderWidth");
+
+  si->passwd_dialog =
+    XCreateWindow (si->dpy,
+                  RootWindowOfScreen(screen),
+                  pw->x, pw->y, pw->width, pw->height, pw->border_width,
+                  DefaultDepthOfScreen (screen), InputOutput,
+                  DefaultVisualOfScreen(screen),
+                  attrmask, &attrs);
+  XSetWindowBackground (si->dpy, si->passwd_dialog, pw->background);
+
+
+  /* Before mapping the window, save the bits that are underneath the
+     rectangle the window will occlude.  When we lower the window, we
+     restore these bits.  This works, because the running screenhack
+     has already been sent SIGSTOP, so we know nothing else is drawing
+     right now! */
+  {
+    XGCValues gcv;
+    GC gc;
+    pw->save_under = XCreatePixmap (si->dpy,
+                                    si->default_screen->screensaver_window,
+                                    pw->width + (pw->border_width*2) + 1,
+                                    pw->height + (pw->border_width*2) + 1,
+                                    si->default_screen->current_depth);
+    gcv.function = GXcopy;
+    gc = XCreateGC (si->dpy, pw->save_under, GCFunction, &gcv);
+    XCopyArea (si->dpy, si->default_screen->screensaver_window,
+               pw->save_under, gc,
+               pw->x - pw->border_width, pw->y - pw->border_width,
+               pw->width + (pw->border_width*2) + 1,
+               pw->height + (pw->border_width*2) + 1,
+               0, 0);
+    XFreeGC (si->dpy, gc);
+  }
+
+  XMapRaised (si->dpy, si->passwd_dialog);
+  XSync (si->dpy, False);
+
+  move_mouse_grab (si, si->passwd_dialog, si->screens[0].cursor);
+  undo_vp_motion (si);
+
+  si->pw_data = pw;
+
+  draw_passwd_window (si);
+  XSync (si->dpy, False);
+}
+
+
+static void
+draw_passwd_window (saver_info *si)
+{
+  passwd_dialog_data *pw = si->pw_data;
+  XGCValues gcv;
+  GC gc1, gc2;
+  int spacing, height;
+  int x1, x2, x3, y1, y2;
+  int sw;
+  int tb_height;
+
+  height = (pw->heading_font->ascent + pw->heading_font->descent +
+           pw->body_font->ascent + pw->body_font->descent +
+           (2 * MAX ((pw->label_font->ascent + pw->label_font->descent),
+                     (pw->passwd_font->ascent + pw->passwd_font->descent +
+                      (pw->shadow_width * 4)))));
+  spacing = ((pw->height - (2 * pw->shadow_width) -
+             pw->internal_border - height)) / 8;
+  if (spacing < 0) spacing = 0;
+
+  gcv.foreground = pw->foreground;
+  gc1 = XCreateGC (si->dpy, si->passwd_dialog, GCForeground, &gcv);
+  gc2 = XCreateGC (si->dpy, si->passwd_dialog, GCForeground, &gcv);
+  x1 = pw->logo_width + pw->thermo_width + (pw->shadow_width * 3);
+  x3 = pw->width - (pw->shadow_width * 2);
+  y1 = (pw->shadow_width * 2) + spacing + spacing;
+
+  /* top heading
+   */
+  XSetFont (si->dpy, gc1, pw->heading_font->fid);
+  sw = string_width (pw->heading_font, pw->heading_label);
+  x2 = (x1 + ((x3 - x1 - sw) / 2));
+  y1 += spacing + pw->heading_font->ascent + pw->heading_font->descent;
+  XDrawString (si->dpy, si->passwd_dialog, gc1, x2, y1,
+              pw->heading_label, strlen(pw->heading_label));
+
+  /* text below top heading
+   */
+  XSetFont (si->dpy, gc1, pw->body_font->fid);
+  y1 += spacing + pw->body_font->ascent + pw->body_font->descent;
+  sw = string_width (pw->body_font, pw->body_label);
+  x2 = (x1 + ((x3 - x1 - sw) / 2));
+  XDrawString (si->dpy, si->passwd_dialog, gc1, x2, y1,
+              pw->body_label, strlen(pw->body_label));
+
+
+  tb_height = (pw->passwd_font->ascent + pw->passwd_font->descent +
+              (pw->shadow_width * 4));
+
+  /* the "User:" prompt
+   */
+  y1 += spacing;
+  y2 = y1;
+  XSetForeground (si->dpy, gc1, pw->foreground);
+  XSetFont (si->dpy, gc1, pw->label_font->fid);
+  y1 += (spacing + tb_height);
+  x2 = (x1 + pw->internal_border +
+       MAX(string_width (pw->label_font, pw->user_label),
+           string_width (pw->label_font, pw->passwd_label)));
+  XDrawString (si->dpy, si->passwd_dialog, gc1,
+              x2 - string_width (pw->label_font, pw->user_label),
+              y1,
+              pw->user_label, strlen(pw->user_label));
+
+  /* the "Password:" prompt
+   */
+  y1 += (spacing + tb_height);
+  XDrawString (si->dpy, si->passwd_dialog, gc1,
+              x2 - string_width (pw->label_font, pw->passwd_label),
+              y1,
+              pw->passwd_label, strlen(pw->passwd_label));
+
+
+  XSetForeground (si->dpy, gc2, pw->passwd_background);
+
+  /* the "user name" text field
+   */
+  y1 = y2;
+  XSetForeground (si->dpy, gc1, pw->passwd_foreground);
+  XSetFont (si->dpy, gc1, pw->passwd_font->fid);
+  y1 += (spacing + tb_height);
+  x2 += (pw->shadow_width * 4);
+
+  pw->passwd_field_width = x3 - x2 - pw->internal_border;
+  pw->passwd_field_height = (pw->passwd_font->ascent +
+                            pw->passwd_font->descent +
+                            pw->shadow_width);
+
+  XFillRectangle (si->dpy, si->passwd_dialog, gc2,
+                 x2 - pw->shadow_width,
+                 y1 - (pw->passwd_font->ascent + pw->passwd_font->descent),
+                 pw->passwd_field_width, pw->passwd_field_height);
+  XDrawString (si->dpy, si->passwd_dialog, gc1, x2, y1,
+              pw->user_string, strlen(pw->user_string));
+
+  /* the "password" text field
+   */
+  y1 += (spacing + tb_height);
+
+  pw->passwd_field_x = x2 - pw->shadow_width;
+  pw->passwd_field_y = y1 - (pw->passwd_font->ascent +
+                            pw->passwd_font->descent);
+
+  /* The shadow around the text fields
+   */
+  y1 = y2;
+  y1 += (spacing + (pw->shadow_width * 3));
+  x1 = x2 - (pw->shadow_width * 2);
+  x2 = pw->passwd_field_width + (pw->shadow_width * 2);
+  y2 = pw->passwd_field_height + (pw->shadow_width * 2);
+
+  draw_shaded_rectangle (si->dpy, si->passwd_dialog,
+                        x1, y1, x2, y2,
+                        pw->shadow_width,
+                        pw->shadow_bottom, pw->shadow_top);
+
+  y1 += (spacing + pw->passwd_font->ascent + pw->passwd_font->descent +
+        (pw->shadow_width * 4));
+  draw_shaded_rectangle (si->dpy, si->passwd_dialog,
+                        x1, y1, x2, y2,
+                        pw->shadow_width,
+                        pw->shadow_bottom, pw->shadow_top);
+
+  /* the logo
+   */
+  XSetForeground (si->dpy, gc1, pw->logo_foreground);
+  XSetForeground (si->dpy, gc2, pw->logo_background);
+
+  x1 = pw->shadow_width * 3;
+  y1 = pw->shadow_width * 3;
+  x2 = pw->logo_width - (pw->shadow_width * 6);
+  y2 = pw->logo_height - (pw->shadow_width * 6);
+
+  XFillRectangle (si->dpy, si->passwd_dialog, gc2, x1, y1, x2, y2);
+  skull (si->dpy, si->passwd_dialog, gc1, gc2,
+        x1 + pw->shadow_width, y1 + pw->shadow_width,
+        x2 - (pw->shadow_width * 2), y2 - (pw->shadow_width * 2));
+
+  /* The thermometer
+   */
+  pw->thermo_field_x = pw->logo_width + pw->shadow_width;
+  pw->thermo_field_y = pw->shadow_width * 3;
+  pw->thermo_field_height = pw->height - (pw->shadow_width * 6);
+
+  /* Solid border inside the logo box. */
+  XSetForeground (si->dpy, gc1, pw->foreground);
+  XDrawRectangle (si->dpy, si->passwd_dialog, gc1, x1, y1, x2-1, y2-1);
+
+  /* The shadow around the logo
+   */
+  draw_shaded_rectangle (si->dpy, si->passwd_dialog,
+                        pw->shadow_width * 2,
+                        pw->shadow_width * 2,
+                        pw->logo_width - (pw->shadow_width * 4),
+                        pw->logo_height - (pw->shadow_width * 4),
+                        pw->shadow_width,
+                        pw->shadow_bottom, pw->shadow_top);
+
+  /* The shadow around the thermometer
+   */
+  draw_shaded_rectangle (si->dpy, si->passwd_dialog,
+                        pw->logo_width,
+                        pw->shadow_width * 2,
+                        pw->thermo_width + (pw->shadow_width * 2),
+                        pw->height - (pw->shadow_width * 4),
+                        pw->shadow_width,
+                        pw->shadow_bottom, pw->shadow_top);
+
+  /* Solid border inside the thermometer. */
+  XSetForeground (si->dpy, gc1, pw->foreground);
+  XDrawRectangle (si->dpy, si->passwd_dialog, gc1, 
+                 pw->logo_width + pw->shadow_width,
+                 pw->shadow_width * 3,
+                 pw->thermo_width - 1,
+                 pw->height - (pw->shadow_width * 6) - 1);
+
+  /* The shadow around the whole window
+   */
+  draw_shaded_rectangle (si->dpy, si->passwd_dialog,
+                        0, 0, pw->width, pw->height, pw->shadow_width,
+                        pw->shadow_top, pw->shadow_bottom);
+
+  XFreeGC (si->dpy, gc1);
+  XFreeGC (si->dpy, gc2);
+
+  update_passwd_window (si, pw->passwd_string, pw->ratio);
+}
+
+
+static void
+update_passwd_window (saver_info *si, const char *printed_passwd, float ratio)
+{
+  passwd_dialog_data *pw = si->pw_data;
+  XGCValues gcv;
+  GC gc1, gc2;
+  int x, y;
+  XRectangle rects[1];
+
+  pw->ratio = ratio;
+  gcv.foreground = pw->passwd_foreground;
+  gcv.font = pw->passwd_font->fid;
+  gc1 = XCreateGC (si->dpy, si->passwd_dialog, GCForeground|GCFont, &gcv);
+  gcv.foreground = pw->passwd_background;
+  gc2 = XCreateGC (si->dpy, si->passwd_dialog, GCForeground, &gcv);
+
+  if (printed_passwd)
+    {
+      char *s = strdup (printed_passwd);
+      if (pw->passwd_string) free (pw->passwd_string);
+      pw->passwd_string = s;
+    }
+
+  /* the "password" text field
+   */
+  rects[0].x =  pw->passwd_field_x;
+  rects[0].y =  pw->passwd_field_y;
+  rects[0].width = pw->passwd_field_width;
+  rects[0].height = pw->passwd_field_height;
+
+  XFillRectangle (si->dpy, si->passwd_dialog, gc2,
+                  rects[0].x, rects[0].y, rects[0].width, rects[0].height);
+
+  XSetClipRectangles (si->dpy, gc1, 0, 0, rects, 1, Unsorted);
+
+  XDrawString (si->dpy, si->passwd_dialog, gc1,
+               rects[0].x + pw->shadow_width,
+               rects[0].y + (pw->passwd_font->ascent +
+                             pw->passwd_font->descent),
+               pw->passwd_string, strlen(pw->passwd_string));
+
+  XSetClipMask (si->dpy, gc1, None);
+
+  /* The I-beam
+   */
+  if (pw->i_beam != 0)
+    {
+      x = (rects[0].x + pw->shadow_width +
+          string_width (pw->passwd_font, pw->passwd_string));
+      y = rects[0].y + pw->shadow_width;
+
+      if (x > rects[0].x + rects[0].width - 1)
+        x = rects[0].x + rects[0].width - 1;
+      XDrawLine (si->dpy, si->passwd_dialog, gc1, 
+                x, y, x, y + pw->passwd_font->ascent);
+    }
+
+  pw->i_beam = (pw->i_beam + 1) % 4;
+
+
+  /* the thermometer
+   */
+  y = pw->thermo_field_height * (1.0 - pw->ratio);
+  if (y > 0)
+    {
+      XFillRectangle (si->dpy, si->passwd_dialog, gc2,
+                     pw->thermo_field_x + 1,
+                     pw->thermo_field_y + 1,
+                     pw->thermo_width-2,
+                     y);
+      XSetForeground (si->dpy, gc1, pw->logo_foreground);
+      XFillRectangle (si->dpy, si->passwd_dialog, gc1,
+                     pw->thermo_field_x + 1,
+                     pw->thermo_field_y + 1 + y,
+                     pw->thermo_width-2,
+                     MAX (0, pw->thermo_field_height - y - 2));
+    }
+
+  XFreeGC (si->dpy, gc1);
+  XFreeGC (si->dpy, gc2);
+  XSync (si->dpy, False);
+}
+
+
+static void
+destroy_passwd_window (saver_info *si)
+{
+  passwd_dialog_data *pw = si->pw_data;
+  Screen *screen = si->default_screen->screen;
+  Colormap cmap = DefaultColormapOfScreen (screen);
+  Pixel black = BlackPixelOfScreen (screen);
+  Pixel white = WhitePixelOfScreen (screen);
+
+  if (pw->timer)
+    XtRemoveTimeOut (pw->timer);
+
+  move_mouse_grab (si, RootWindowOfScreen(si->screens[0].screen),
+                   si->screens[0].cursor);
+
+  if (si->passwd_dialog)
+    {
+      XDestroyWindow (si->dpy, si->passwd_dialog);
+      si->passwd_dialog = 0;
+    }
+  
+  if (pw->save_under)
+    {
+      XGCValues gcv;
+      GC gc;
+      gcv.function = GXcopy;
+      gc = XCreateGC (si->dpy, si->default_screen->screensaver_window,
+                      GCFunction, &gcv);
+      XCopyArea (si->dpy, pw->save_under,
+                 si->default_screen->screensaver_window, gc,
+                 0, 0,
+                 pw->width + (pw->border_width*2) + 1,
+                 pw->height + (pw->border_width*2) + 1,
+                 pw->x - pw->border_width, pw->y - pw->border_width);
+      XFreePixmap (si->dpy, pw->save_under);
+      pw->save_under = 0;
+      XFreeGC (si->dpy, gc);
+    }
+
+  if (pw->heading_label) free (pw->heading_label);
+  if (pw->body_label)    free (pw->body_label);
+  if (pw->user_label)    free (pw->user_label);
+  if (pw->passwd_label)  free (pw->passwd_label);
+
+  if (pw->heading_font) XFreeFont (si->dpy, pw->heading_font);
+  if (pw->body_font)    XFreeFont (si->dpy, pw->body_font);
+  if (pw->label_font)   XFreeFont (si->dpy, pw->label_font);
+  if (pw->passwd_font)  XFreeFont (si->dpy, pw->passwd_font);
+
+  if (pw->foreground != black && pw->foreground != white)
+    XFreeColors (si->dpy, cmap, &pw->foreground, 1, 0L);
+  if (pw->background != black && pw->background != white)
+    XFreeColors (si->dpy, cmap, &pw->background, 1, 0L);
+  if (pw->passwd_foreground != black && pw->passwd_foreground != white)
+    XFreeColors (si->dpy, cmap, &pw->passwd_foreground, 1, 0L);
+  if (pw->passwd_background != black && pw->passwd_background != white)
+    XFreeColors (si->dpy, cmap, &pw->passwd_background, 1, 0L);
+  if (pw->logo_foreground != black && pw->logo_foreground != white)
+    XFreeColors (si->dpy, cmap, &pw->logo_foreground, 1, 0L);
+  if (pw->logo_background != black && pw->logo_background != white)
+    XFreeColors (si->dpy, cmap, &pw->logo_background, 1, 0L);
+  if (pw->shadow_top != black && pw->shadow_top != white)
+    XFreeColors (si->dpy, cmap, &pw->shadow_top, 1, 0L);
+  if (pw->shadow_bottom != black && pw->shadow_bottom != white)
+    XFreeColors (si->dpy, cmap, &pw->shadow_bottom, 1, 0L);
+
+  memset (pw, 0, sizeof(*pw));
+  free (pw);
+
+  si->pw_data = 0;
+}
+
+
+#ifdef HAVE_XHPDISABLERESET
+/* This function enables and disables the C-Sh-Reset hot-key, which
+   normally resets the X server (logging out the logged-in user.)
+   We don't want random people to be able to do that while the
+   screen is locked.
+ */
+static void
+hp_lock_reset (saver_info *si, Bool lock_p)
+{
+  static Bool hp_locked_p = False;
+
+  /* Calls to XHPDisableReset and XHPEnableReset must be balanced,
+     or BadAccess errors occur.  (It's ok for this to be global,
+     since it affects the whole machine, not just the current screen.)
+  */
+  if (hp_locked_p == lock_p)
+    return;
+
+  if (lock_p)
+    XHPDisableReset (si->dpy);
+  else
+    XHPEnableReset (si->dpy);
+  hp_locked_p = lock_p;
+}
+#endif /* HAVE_XHPDISABLERESET */
+
+
+\f
+/* This function enables and disables the C-Sh-F1 ... F12 hot-keys,
+   which, on Linux systems, switches to another virtual console.
+   We'd like the whole screen/keyboard to be locked, not just one
+   virtual console, so this function disables that while the X
+   screen is locked.
+
+   Unfortunately, this doesn't work -- this ioctl only works when
+   called by root, and we have disavowed our privileges long ago.
+ */
+#ifdef HAVE_VT_LOCKSWITCH
+static void
+linux_lock_vt_switch (saver_info *si, Bool lock_p)
+{
+  saver_preferences *p = &si->prefs;
+  static Bool vt_locked_p = False;
+  const char *dev_console = "/dev/console";
+  int fd;
+
+  if (lock_p == vt_locked_p)
+    return;
+
+  if (lock_p && !p->lock_vt_p)
+    return;
+
+  fd = open (dev_console, O_RDWR);
+  if (fd < 0)
+    {
+      char buf [255];
+      sprintf (buf, "%s: couldn't %s VTs: %s", blurb(),
+              (lock_p ? "lock" : "unlock"),
+              dev_console);
+#if 1 /* #### doesn't work yet, so don't bother complaining */
+      perror (buf);
+#endif
+      return;
+    }
+
+  if (ioctl (fd, (lock_p ? VT_LOCKSWITCH : VT_UNLOCKSWITCH)) == 0)
+    {
+      vt_locked_p = lock_p;
+
+      if (p->verbose_p)
+       fprintf (stderr, "%s: %s VTs\n", blurb(),
+                (lock_p ? "locked" : "unlocked"));
+    }
+  else
+    {
+      char buf [255];
+      sprintf (buf, "%s: couldn't %s VTs: ioctl", blurb(),
+              (lock_p ? "lock" : "unlock"));
+#if 0 /* #### doesn't work yet, so don't bother complaining */
+      perror (buf);
+#endif
+    }
+
+  close (fd);
+}
+#endif /* HAVE_VT_LOCKSWITCH */
+
+\f
+/* This function enables and disables the C-Alt-Plus and C-Alt-Minus
+   hot-keys, which normally change the resolution of the X server.
+   We don't want people to be able to switch the server resolution
+   while the screen is locked, because if they switch to a higher
+   resolution, it could cause part of the underlying desktop to become
+   exposed.
+ */
+#ifdef HAVE_XF86VMODE
+
+static int ignore_all_errors_ehandler (Display *dpy, XErrorEvent *error);
+static Bool vp_got_error = False;
+
+static void
+xfree_lock_mode_switch (saver_info *si, Bool lock_p)
+{
+  static Bool mode_locked_p = False;
+  saver_preferences *p = &si->prefs;
+  int screen = 0;  /* always screen 0 */
+  int event, error;
+  Bool status;
+  XErrorHandler old_handler;
+
+  if (mode_locked_p == lock_p)
+    return;
+  if (!XF86VidModeQueryExtension (si->dpy, &event, &error))
+    return;
+
+  XSync (si->dpy, False);
+  old_handler = XSetErrorHandler (ignore_all_errors_ehandler);
+  status = XF86VidModeLockModeSwitch (si->dpy, screen, lock_p);
+  XSync (si->dpy, False);
+  XSetErrorHandler (old_handler);
+  if (vp_got_error) status = False;
+
+  if (status)
+    mode_locked_p = lock_p;
+
+  if (!status && (p->verbose_p || !lock_p))
+    /* Only print this when verbose, or when we locked but can't unlock.
+       I tried printing this message whenever it comes up, but
+       mode-locking always fails if DontZoom is set in XF86Config. */
+    fprintf (stderr, "%s: unable to %s mode switching!\n",
+             blurb(), (lock_p ? "lock" : "unlock"));
+  else if (p->verbose_p)
+    fprintf (stderr, "%s: %s mode switching.\n",
+             blurb(), (lock_p ? "locked" : "unlocked"));
+}
+
+static int
+ignore_all_errors_ehandler (Display *dpy, XErrorEvent *error)
+{
+  vp_got_error = True;
+  return 0;
+}
+
+#endif /* HAVE_XF86VMODE */
+
+\f
+/* If the viewport has been scrolled since the screen was blanked,
+   then scroll it back to where it belongs.  This function only exists
+   to patch over a very brief race condition.
+ */
+static void
+undo_vp_motion (saver_info *si)
+{
+#ifdef HAVE_XF86VMODE
+  saver_preferences *p = &si->prefs;
+  int screen = 0;  /* always screen 0 */
+  saver_screen_info *ssi = &si->screens[screen];
+  int event, error, x, y;
+  Bool status;
+
+  if (ssi->blank_vp_x == -1 && ssi->blank_vp_y == -1)
+    return;
+  if (!XF86VidModeQueryExtension (si->dpy, &event, &error))
+    return;
+  if (!XF86VidModeGetViewPort (si->dpy, 0, &x, &y))
+    return;
+  if (ssi->blank_vp_x == x && ssi->blank_vp_y == y)
+    return;
+    
+  /* We're going to move the viewport.  The mouse has just been grabbed on
+     (and constrained to, thus warped to) the password window, so it is no
+     longer near the edge of the screen.  However, wait a bit anyway, just
+     to make sure the server drains its last motion event, so that the
+     screen doesn't continue to scroll after we've reset the viewport.
+   */
+  XSync (si->dpy, False);
+  usleep (250);  /* 1/4 second */
+  XSync (si->dpy, False);
+
+  status = XF86VidModeSetViewPort (si->dpy, screen,
+                                   ssi->blank_vp_x, ssi->blank_vp_y);
+
+  if (!status)
+    fprintf (stderr, "%s: unable to move vp from (%d,%d) back to (%d,%d)!\n",
+             blurb(), x, y, ssi->blank_vp_x, ssi->blank_vp_y);
+  else if (p->verbose_p)
+    fprintf (stderr, "%s: vp moved to (%d,%d); moved it back to (%d,%d).\n",
+             blurb(), x, y, ssi->blank_vp_x, ssi->blank_vp_y);
+
+#endif /* HAVE_XF86VMODE */
+}
+
+
+\f
+/* Interactions
+ */
+
+static void
+passwd_animate_timer (XtPointer closure, XtIntervalId *id)
+{
+  saver_info *si = (saver_info *) closure;
+  int tick = 166;
+  passwd_dialog_data *pw = si->pw_data;
+
+  if (!pw) return;
+
+  pw->ratio -= (1.0 / ((double) si->prefs.passwd_timeout / (double) tick));
+  if (pw->ratio < 0)
+    {
+      pw->ratio = 0;
+      if (pw->state == pw_read)
+       pw->state = pw_time;
+    }
+
+  update_passwd_window (si, 0, pw->ratio);
+
+  if (pw->state == pw_read)
+    pw->timer = XtAppAddTimeOut (si->app, tick, passwd_animate_timer,
+                                (XtPointer) si);
+  else
+    pw->timer = 0;
+
+  idle_timer ((XtPointer) si, id);
+}
+
+
+static void
+handle_passwd_key (saver_info *si, XKeyEvent *event)
+{
+  saver_preferences *p = &si->prefs;
+  passwd_dialog_data *pw = si->pw_data;
+  int pw_size = sizeof (pw->typed_passwd) - 1;
+  char *typed_passwd = pw->typed_passwd;
+  char s[2];
+  char *stars = 0;
+  int i;
+  int size = XLookupString (event, s, 1, 0, 0);
+
+  if (size != 1) return;
+
+  s[1] = 0;
+
+  switch (*s)
+    {
+    case '\010': case '\177':                          /* Backspace */
+      if (!*typed_passwd)
+       XBell (si->dpy, 0);
+      else
+       typed_passwd [strlen(typed_passwd)-1] = 0;
+      break;
+
+    case '\025': case '\030':                          /* Erase line */
+      memset (typed_passwd, 0, pw_size);
+      break;
+
+    case '\012': case '\015':                          /* Enter */
+      if (pw->state != pw_read)
+       ;  /* already done? */
+      else if (typed_passwd[0] == 0)
+       pw->state = pw_null;
+      else
+        {
+          update_passwd_window (si, "Checking...", pw->ratio);
+          XSync (si->dpy, False);
+          if (passwd_valid_p (typed_passwd, p->verbose_p))
+            pw->state = pw_ok;
+          else
+            pw->state = pw_fail;
+          update_passwd_window (si, "", pw->ratio);
+        }
+      break;
+
+    default:
+      i = strlen (typed_passwd);
+      if (i >= pw_size-1)
+       XBell (si->dpy, 0);
+      else
+       {
+         typed_passwd [i] = *s;
+         typed_passwd [i+1] = 0;
+       }
+      break;
+    }
+
+  i = strlen(typed_passwd);
+  stars = (char *) malloc(i+1);
+  memset (stars, '*', i);
+  stars[i] = 0;
+  update_passwd_window (si, stars, pw->ratio);
+  free (stars);
+}
+
+
+static void
+passwd_event_loop (saver_info *si)
+{
+  saver_preferences *p = &si->prefs;
+  char *msg = 0;
+  XEvent event;
+  passwd_animate_timer ((XtPointer) si, 0);
+
+  while (si->pw_data && si->pw_data->state == pw_read)
+    {
+      XtAppNextEvent (si->app, &event);
+      if (event.xany.window == si->passwd_dialog && event.xany.type == Expose)
+       draw_passwd_window (si);
+      else if (event.xany.type == KeyPress)
+       handle_passwd_key (si, &event.xkey);
+      else
+       XtDispatchEvent (&event);
+    }
+
+  switch (si->pw_data->state)
+    {
+    case pw_ok:   msg = 0; break;
+    case pw_null: msg = ""; break;
+    case pw_time: msg = "Timed out!"; break;
+    default:      msg = "Sorry!"; break;
+    }
+
+  if (si->pw_data->state == pw_fail)
+    si->unlock_failures++;
+
+  if (p->verbose_p)
+    switch (si->pw_data->state)
+      {
+      case pw_ok:
+       fprintf (stderr, "%s: password correct.\n", blurb()); break;
+      case pw_fail:
+       fprintf (stderr, "%s: password incorrect!\n", blurb()); break;
+      case pw_null:
+      case pw_cancel:
+       fprintf (stderr, "%s: password entry cancelled.\n", blurb()); break;
+      case pw_time:
+       fprintf (stderr, "%s: password entry timed out.\n", blurb()); break;
+      default: break;
+      }
+
+#ifdef HAVE_SYSLOG
+  if (si->pw_data->state == pw_fail)
+    {
+      /* If they typed a password (as opposed to just hitting return) and
+        the password was invalid, log it.
+      */
+      struct passwd *pw = getpwuid (getuid ());
+      char *d = DisplayString (si->dpy);
+      char *u = (pw->pw_name ? pw->pw_name : "???");
+      int opt = 0;
+      int fac = 0;
+
+# ifdef LOG_PID
+      opt = LOG_PID;
+# endif
+
+# if defined(LOG_AUTHPRIV)
+      fac = LOG_AUTHPRIV;
+# elif defined(LOG_AUTH)
+      fac = LOG_AUTH;
+# else
+      fac = LOG_DAEMON;
+# endif
+
+      if (!d) d = "";
+      openlog (progname, opt, fac);
+      syslog (LOG_NOTICE, "FAILED LOGIN %d ON DISPLAY \"%s\", FOR \"%s\"",
+             si->unlock_failures, d, u);
+      closelog ();
+    }
+#endif /* HAVE_SYSLOG */
+
+  if (si->pw_data->state == pw_fail)
+    XBell (si->dpy, False);
+
+  if (si->pw_data->state == pw_ok && si->unlock_failures != 0)
+    {
+      if (si->unlock_failures == 1)
+       fprintf (real_stderr,
+                "%s: WARNING: 1 failed attempt to unlock the screen.\n",
+                blurb());
+      else
+       fprintf (real_stderr,
+                "%s: WARNING: %d failed attempts to unlock the screen.\n",
+                blurb(), si->unlock_failures);
+      fflush (real_stderr);
+
+      si->unlock_failures = 0;
+    }
+
+  if (msg)
+    {
+      si->pw_data->i_beam = 0;
+      update_passwd_window (si, msg, 0.0);
+      XSync (si->dpy, False);
+      sleep (1);
+
+      /* Swallow all pending KeyPress/KeyRelease events. */
+      {
+       XEvent e;
+       while (XCheckMaskEvent (si->dpy, KeyPressMask|KeyReleaseMask, &e))
+         ;
+      }
+    }
+}
+
+
+Bool
+unlock_p (saver_info *si)
+{
+  saver_preferences *p = &si->prefs;
+  Screen *screen = si->default_screen->screen;
+  Colormap cmap = DefaultColormapOfScreen (screen);
+  Bool status;
+
+  raise_window (si, True, True, True);
+
+  if (p->verbose_p)
+    fprintf (stderr, "%s: prompting for password.\n", blurb());
+
+  if (si->pw_data || si->passwd_dialog)
+    destroy_passwd_window (si);
+
+  make_passwd_window (si);
+  if (cmap) XInstallColormap (si->dpy, cmap);
+
+  passwd_event_loop (si);
+
+  status = (si->pw_data->state == pw_ok);
+  destroy_passwd_window (si);
+
+  cmap = si->default_screen->cmap;
+  if (cmap) XInstallColormap (si->dpy, cmap);
+
+  return status;
+}
+
+
+void
+set_locked_p (saver_info *si, Bool locked_p)
+{
+  si->locked_p = locked_p;
+
+#ifdef HAVE_XHPDISABLERESET
+  hp_lock_reset (si, locked_p);                 /* turn off/on C-Sh-Reset */
+#endif
+#ifdef HAVE_VT_LOCKSWITCH
+  linux_lock_vt_switch (si, locked_p);          /* turn off/on C-Alt-F1 */
+#endif
+#ifdef HAVE_XF86VMODE
+  xfree_lock_mode_switch (si, locked_p);        /* turn off/on C-Alt-Plus */
+#endif
+}
+
+
+#else  /*  NO_LOCKING -- whole file */
+
+void
+set_locked_p (saver_info *si, Bool locked_p)
+{
+  if (locked_p) abort();
+}
+
+#endif /* !NO_LOCKING */
diff --git a/driver/passwd-kerberos.c b/driver/passwd-kerberos.c
new file mode 100644 (file)
index 0000000..1e28d60
--- /dev/null
@@ -0,0 +1,180 @@
+/* kpasswd.c --- verify kerberos passwords.
+ * written by Nat Lanza (magus@cs.cmu.edu) for
+ * xscreensaver, Copyright (c) 1993-1997, 1998 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software 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.  No representations are made about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or 
+ * implied warranty.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#ifndef NO_LOCKING  /* whole file */
+
+#include <stdlib.h>
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+
+#include <stdio.h>
+#include <string.h>
+#include <sys/types.h>
+#include <krb.h>
+#include <des.h>
+
+#if !defined(VMS) && !defined(HAVE_ADJUNCT_PASSWD)
+# include <pwd.h>
+#endif
+
+
+#ifdef __bsdi__
+# include <sys/param.h>
+# if _BSDI_VERSION >= 199608
+#  define BSD_AUTH
+# endif
+#endif /* __bsdi__ */
+
+/* blargh */
+#undef  Bool
+#undef  True
+#undef  False
+#define Bool  int
+#define True  1
+#define False 0
+
+/* The user information we need to store */
+static char realm[REALM_SZ];
+static char  name[ANAME_SZ];
+static char  inst[INST_SZ];
+static char *tk_file;
+
+
+/* Called at startup to grab user, instance, and realm information
+   from the user's ticketfile (remember, name.inst@realm). Since we're
+   using tf_get_pname(), this should work even if your kerberos username
+   isn't the same as your local username. We grab the ticket at startup
+   time so that even if your ticketfile dies while the screen's locked
+   we'll still have the information to unlock it.
+
+   Problems: the password dialog currently displays local username, so if
+     you have some non-standard name/instance when you run xscreensaver,
+     you'll need to remember what it was when unlocking, or else you lose.
+
+     Also, we use des_string_to_key(), so if you have an AFS password
+     (encrypted with ka_StringToKey()), you'll lose. Get a kerberos password;
+     it isn't that hard.
+
+   Like the original lock_init, we return false if something went wrong.
+   We don't use the arguments we're given, though.
+ */
+Bool
+kerberos_lock_init (int argc, char **argv, Bool verbose_p)
+{
+    int k_errno;
+    
+    memset(name, 0, sizeof(name));
+    memset(inst, 0, sizeof(inst));
+    
+    /* find out where the user's keeping his tickets.
+       squirrel it away for later use. */
+    tk_file = tkt_string();
+
+    /* open ticket file or die trying. */
+    if ((k_errno = tf_init(tk_file, R_TKT_FIL))) {
+       return False;
+    }
+
+    /* same with principal and instance names */
+    if ((k_errno = tf_get_pname(name)) ||
+       (k_errno = tf_get_pinst(inst))) {
+       return False;
+    }
+
+    /* close the ticketfile to release the lock on it. */
+    tf_close();
+
+    /* figure out what realm we're authenticated to. this ought
+       to be the local realm, but it pays to be sure. */
+    if ((k_errno = krb_get_tf_realm(tk_file, realm))) {
+       return False;
+    }
+
+    /* last-minute sanity check on what we got. */
+    if ((strlen(name)+strlen(inst)+strlen(realm)+3) >
+       (REALM_SZ + ANAME_SZ + INST_SZ + 3)) {
+       return False;
+    }
+
+    /* success */
+    return True;
+}
+
+
+/* des_string_to_key() wants this. If C didn't suck, we could have an
+   anonymous function do this. Even a local one. But it does, so here
+   we are. Calling it ive_got_your_local_function_right_here_buddy()
+   would have been rude.
+ */
+static int 
+key_to_key(char *user, char *instance, char *realm, char *passwd, C_Block key)
+{
+  memcpy(key, passwd, sizeof(des_cblock));
+  return (0);
+}
+
+/* Called to see if the user's typed password is valid. We do this by asking
+   the kerberos server for a ticket and checking to see if it gave us one.
+   We need to move the ticketfile first, or otherwise we end up updating the
+   user's tkfile with new tickets. This would break services like zephyr that
+   like to stay authenticated, and it would screw with AFS authentication at
+   some sites. So, we do a quick, painful hack with a tmpfile.
+ */
+Bool
+kerberos_passwd_valid_p (const char *typed_passwd, Bool verbose_p)
+{
+    C_Block mitkey;
+    Bool success;
+    char *newtkfile;
+
+    /* temporarily switch to a new ticketfile.
+       I'm not using tmpnam() because it isn't entirely portable.
+       this could probably be fixed with autoconf. */
+    newtkfile = malloc(80 * sizeof(char));
+    memset(newtkfile, 0, sizeof(newtkfile));
+
+    sprintf(newtkfile, "/tmp/xscrn-%i", getpid());
+
+    krb_set_tkt_string(newtkfile);
+
+    /* encrypt the typed password. if you have an AFS password instead
+       of a kerberos one, you lose *right here*. If you want to use AFS
+       passwords, you can use ka_StringToKey() instead. As always, ymmv. */
+    des_string_to_key(typed_passwd, mitkey);
+
+    if (krb_get_in_tkt(name, inst, realm, "krbtgt", realm, DEFAULT_TKT_LIFE,
+                      key_to_key, NULL, mitkey) != 0) {
+       success = False;
+    } else {
+       success = True;
+    }
+
+    /* quickly block out the tempfile and password to prevent snooping,
+       then restore the old ticketfile and cleean up a bit. */
+    
+    dest_tkt();
+    krb_set_tkt_string(tk_file);
+    free(newtkfile);
+    memset(mitkey, 0, sizeof(mitkey));
+    
+
+    /* Did we verify successfully? */
+    return success;
+}
+
+#endif /* NO_LOCKING -- whole file */
diff --git a/driver/passwd-pam.c b/driver/passwd-pam.c
new file mode 100644 (file)
index 0000000..a02cf81
--- /dev/null
@@ -0,0 +1,392 @@
+/* passwd-pam.c --- verifying typed passwords with PAM
+ * (Pluggable Authentication Modules.)
+ * written by Bill Nottingham <notting@redhat.com> (and jwz) for
+ * xscreensaver, Copyright (c) 1993-1998 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software 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.  No representations are made about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or 
+ * implied warranty.
+ *
+ * Some PAM resources:
+ *
+ *    PAM home page:
+ *    http://www.us.kernel.org/pub/linux/libs/pam/
+ *
+ *    PAM FAQ:
+ *    http://www.us.kernel.org/pub/linux/libs/pam/FAQ
+ *
+ *    PAM Application Developers' Guide:
+ *    http://www.us.kernel.org/pub/linux/libs/pam/Linux-PAM-html/pam_appl.html
+ *
+ *    PAM Mailing list archives:
+ *    http://www.linuxhq.com/lnxlists/linux-pam/
+ *
+ *    Compatibility notes, especially between Linux and Solaris:
+ *    http://www.contrib.andrew.cmu.edu/u/shadow/pam.html
+ *
+ *    The Open Group's PAM API documentation:
+ *    http://www.opengroup.org/onlinepubs/8329799/pam_start.htm
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#ifndef NO_LOCKING  /* whole file */
+
+#include <stdlib.h>
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+
+extern char *blurb(void);
+
+
+#include <stdio.h>
+#include <string.h>
+#include <sys/types.h>
+#include <pwd.h>
+#include <grp.h>
+#include <security/pam_appl.h>
+
+#include <sys/stat.h>
+
+
+/* blargh */
+#undef  Bool
+#undef  True
+#undef  False
+#define Bool  int
+#define True  1
+#define False 0
+
+#undef countof
+#define countof(x) (sizeof((x))/sizeof(*(x)))
+
+static int pam_conversation (int nmsgs,
+                             const struct pam_message **msg,
+                             struct pam_response **resp,
+                             void *closure);
+
+struct pam_closure {
+  const char *user;
+  const char *typed_passwd;
+  Bool verbose_p;
+};
+
+
+#ifdef HAVE_PAM_FAIL_DELAY
+   /* We handle delays ourself.*/
+   /* Don't set this to 0 (Linux bug workaround.) */
+# define PAM_NO_DELAY(pamh) pam_fail_delay ((pamh), 1)
+#else  /* !HAVE_PAM_FAIL_DELAY */
+# define PAM_NO_DELAY(pamh) /* */
+#endif /* !HAVE_PAM_FAIL_DELAY */
+
+
+/* On SunOS 5.6, and on Linux with PAM 0.64, pam_strerror() takes two args.
+   On some other Linux systems with some other version of PAM (e.g.,
+   whichever Debian release comes with a 2.2.5 kernel) it takes one arg.
+   I can't tell which is more "recent" or "correct" behavior, so configure
+   figures out which is in use for us.  Shoot me!
+ */
+#ifdef PAM_STRERROR_TWO_ARGS
+# define PAM_STRERROR(pamh, status) pam_strerror((pamh), (status))
+#else  /* !PAM_STRERROR_TWO_ARGS */
+# define PAM_STRERROR(pamh, status) pam_strerror((status))
+#endif /* !PAM_STRERROR_TWO_ARGS */
+
+
+/* PAM sucks in that there is no way to tell whether a particular service
+   is configured at all.  That is, there is no way to tell the difference
+   between "authentication of the FOO service is not allowed" and "the
+   user typed the wrong password."
+
+   On RedHat 5.1 systems, if a service name is not known, it defaults to
+   being not allowed (because the fallback service, /etc/pam.d/other, is
+   set to `pam_deny'.)
+
+   On Solaris 2.6 systems, unknown services default to authenticating normally.
+
+   So, we could simply require that the person who installs xscreensaver
+   set up an "xscreensaver" PAM service.  However, if we went that route,
+   it would have a really awful failure mode: the failure mode would be that
+   xscreensaver was willing to *lock* the screen, but would be unwilling to
+   *unlock* the screen.  (With the non-PAM password code, the analagous
+   situation -- security not being configured properly, for example do to the
+   executable not being installed as setuid root -- the failure mode is much
+   more palettable, in that xscreensaver will refuse to *lock* the screen,
+   because it can know up front that there is no password that will work.)
+
+   Another route would be to have the service name to consult be computed at
+   compile-time (perhaps with a configure option.)  However, that doesn't
+   really solve the problem, because it means that the same executable might
+   work fine on one machine, but refuse to unlock when run on another
+   machine.
+
+   Another alternative would be to look in /etc/pam.conf or /etc/pam.d/ at
+   runtime to see what services actually exist.  But I think that's no good,
+   because who is to say that the PAM info is actually specified in those
+   files?  Opening and reading those files is not a part of the PAM client
+   API, so it's not guarenteed to work on any given system.
+
+   An alternative I tried was to specify a list of services to try, and to
+   try them all in turn ("xscreensaver", "xlock", "xdm", and "login").
+   This worked, but it was slow (and I also had to do some contortions to
+   work around bugs in Linux PAM 0.64-3.)
+
+   So what we do today is, try PAM once, and if that fails, try the usual
+   getpwent() method.  So if PAM doesn't work, it will at least make an
+   attempt at looking up passwords in /etc/passwd or /etc/shadow instead.
+
+   This all kind of blows.  I'm not sure what else to do.
+ */
+
+
+/* On SunOS 5.6, the `pam_conv.appdata_ptr' slot seems to be ignored, and
+   the `closure' argument to pc.conv always comes in as random garbage.
+   So we get around this by using a global variable instead.  Shoot me!
+
+   (I've been told this is bug 4092227, and is fixed in Solaris 7.)
+ */
+static void *suns_pam_implementation_blows = 0;
+
+
+/* This can be called at any time, and says whether the typed password
+   belongs to either the logged in user (real uid, not effective); or
+   to root.
+ */
+Bool
+pam_passwd_valid_p (const char *typed_passwd, Bool verbose_p)
+{
+  const char *service = PAM_SERVICE_NAME;
+  pam_handle_t *pamh = 0;
+  int status = -1;
+  struct pam_conv pc;
+  struct pam_closure c;
+  char *user = 0;
+
+  struct passwd *p = getpwuid (getuid ());
+  if (!p) return False;
+
+  user = strdup (p->pw_name);
+
+  c.user = user;
+  c.typed_passwd = typed_passwd;
+  c.verbose_p = verbose_p;
+
+  pc.conv = &pam_conversation;
+  pc.appdata_ptr = (void *) &c;
+
+  /* On SunOS 5.6, the `appdata_ptr' slot seems to be ignored, and the
+     `closure' argument to pc.conv always comes in as random garbage. */
+  suns_pam_implementation_blows = (void *) &c;
+
+
+  /* Initialize PAM.
+   */
+  status = pam_start (service, c.user, &pc, &pamh);
+  if (verbose_p)
+    fprintf (stderr, "%s: pam_start (\"%s\", \"%s\", ...) ==> %d (%s)\n",
+             blurb(), service, c.user,
+             status, PAM_STRERROR (pamh, status));
+  if (status != PAM_SUCCESS) goto DONE;
+
+  /* #### We should set PAM_TTY to the display we're using, but we
+     don't have that handy from here.  So set it to :0.0, which is a
+     good guess (and has the bonus of counting as a "secure tty" as
+     far as PAM is concerned...)
+   */
+  {
+    const char *tty = ":0.0";
+    status = pam_set_item (pamh, PAM_TTY, strdup(tty));
+    if (verbose_p)
+      fprintf (stderr, "%s:   pam_set_item (p, PAM_TTY, \"%s\") ==> %d (%s)\n",
+               blurb(), tty, status, PAM_STRERROR(pamh, status));
+  }
+
+  /* Try to authenticate as the current user.
+   */
+  PAM_NO_DELAY(pamh);
+  status = pam_authenticate (pamh, 0);
+  if (verbose_p)
+    fprintf (stderr, "%s:   pam_authenticate (...) ==> %d (%s)\n",
+             blurb(), status, PAM_STRERROR(pamh, status));
+  if (status == PAM_SUCCESS)  /* Win! */
+    goto DONE;
+
+  /* If that didn't work, set the user to root, and try to authenticate again.
+   */
+  c.user = "root";
+  status = pam_set_item (pamh, PAM_USER, strdup(c.user));
+  if (verbose_p)
+    fprintf (stderr, "%s:   pam_set_item(p, PAM_USER, \"%s\") ==> %d (%s)\n",
+             blurb(), c.user, status, PAM_STRERROR(pamh, status));
+  if (status != PAM_SUCCESS) goto DONE;
+
+  PAM_NO_DELAY(pamh);
+  status = pam_authenticate (pamh, 0);
+  if (verbose_p)
+    fprintf (stderr, "%s:   pam_authenticate (...) ==> %d (%s)\n",
+             blurb(), status, PAM_STRERROR(pamh, status));
+
+ DONE:
+  if (user) free (user);
+  if (pamh)
+    {
+      int status2 = pam_end (pamh, status);
+      pamh = 0;
+      if (verbose_p)
+        fprintf (stderr, "%s: pam_end (...) ==> %d (%s)\n",
+                 blurb(), status2,
+                 (status2 == PAM_SUCCESS ? "Success" : "Failure"));
+    }
+  return (status == PAM_SUCCESS ? True : False);
+}
+
+
+Bool 
+pam_priv_init (int argc, char **argv, Bool verbose_p)
+{
+  /* We have nothing to do at init-time.
+     However, we might as well do some error checking.
+     If "/etc/pam.d" exists and is a directory, but "/etc/pam.d/xlock"
+     does not exist, warn that PAM probably isn't going to work.
+
+     This is a priv-init instead of a non-priv init in case the directory
+     is unreadable or something (don't know if that actually happens.)
+   */
+  const char   dir[] = "/etc/pam.d";
+  const char  file[] = "/etc/pam.d/" PAM_SERVICE_NAME;
+  const char file2[] = "/etc/pam.conf";
+  struct stat st;
+
+  if (stat (dir, &st) == 0 && st.st_mode & S_IFDIR)
+    {
+      if (stat (file, &st) != 0)
+        fprintf (stderr,
+                 "%s: warning: %s does not exist.\n"
+                 "%s: password authentication via PAM is unlikely to work.\n",
+                 blurb(), file, blurb());
+    }
+  else if (stat (file2, &st) == 0)
+    {
+      FILE *f = fopen (file2, "r");
+      if (f)
+        {
+          Bool ok = False;
+          char buf[255];
+          while (fgets (buf, sizeof(buf), f))
+            if (strstr (buf, PAM_SERVICE_NAME))
+              {
+                ok = True;
+                break;
+              }
+          fclose (f);
+          if (!ok)
+            {
+              fprintf (stderr,
+                  "%s: warning: %s does not list the `%s' service.\n"
+                  "%s: password authentication via PAM is unlikely to work.\n",
+                       blurb(), file2, PAM_SERVICE_NAME, blurb());
+            }
+        }
+      /* else warn about file2 existing but being unreadable? */
+    }
+  else
+    {
+      fprintf (stderr,
+               "%s: warning: neither %s nor %s exist.\n"
+               "%s: password authentication via PAM is unlikely to work.\n",
+               blurb(), file2, file, blurb());
+    }
+
+  /* Return true anyway, just in case. */
+  return True;
+}
+
+
+/* This is the function PAM calls to have a conversation with the user.
+   Really, this function should be the thing that pops up dialog boxes
+   as needed, and prompts for various strings.
+
+   But, for now, xscreensaver uses its normal password-prompting dialog
+   first, and then this function simply returns the result that has been
+   typed.
+
+   This means that if PAM was using a retina scanner for auth, xscreensaver
+   would prompt for a password; then pam_conversation() would be called
+   with a string like "Please look into the retina scanner".  The user
+   would never see this string, and the prompted-for password would be
+   ignored.
+ */
+static int
+pam_conversation (int nmsgs,
+                  const struct pam_message **msg,
+                  struct pam_response **resp,
+                  void *closure)
+{
+  int replies = 0;
+  struct pam_response *reply = 0;
+  struct pam_closure *c = (struct pam_closure *) closure;
+
+  /* On SunOS 5.6, the `closure' argument always comes in as random garbage. */
+  c = (struct pam_closure *) suns_pam_implementation_blows;
+
+
+  reply = (struct pam_response *) calloc (nmsgs, sizeof (*reply));
+  if (!reply) return PAM_CONV_ERR;
+       
+  for (replies = 0; replies < nmsgs; replies++)
+    {
+      switch (msg[replies]->msg_style)
+        {
+        case PAM_PROMPT_ECHO_ON:
+          reply[replies].resp_retcode = PAM_SUCCESS;
+          reply[replies].resp = strdup (c->user);         /* freed by PAM */
+          if (c->verbose_p)
+            fprintf (stderr, "%s:     PAM ECHO_ON(\"%s\") ==> \"%s\"\n",
+                     blurb(), msg[replies]->msg,
+                     reply[replies].resp);
+          break;
+        case PAM_PROMPT_ECHO_OFF:
+          reply[replies].resp_retcode = PAM_SUCCESS;
+          reply[replies].resp = strdup (c->typed_passwd);   /* freed by PAM */
+          if (c->verbose_p)
+            fprintf (stderr, "%s:     PAM ECHO_OFF(\"%s\") ==> password\n",
+                     blurb(), msg[replies]->msg);
+          break;
+        case PAM_TEXT_INFO:
+          /* ignore it... */
+          reply[replies].resp_retcode = PAM_SUCCESS;
+          reply[replies].resp = 0;
+          if (c->verbose_p)
+            fprintf (stderr, "%s:     PAM TEXT_INFO(\"%s\") ==> ignored\n",
+                     blurb(), msg[replies]->msg);
+          break;
+        case PAM_ERROR_MSG:
+          /* ignore it... */
+          reply[replies].resp_retcode = PAM_SUCCESS;
+          reply[replies].resp = 0;
+          if (c->verbose_p)
+            fprintf (stderr, "%s:     PAM ERROR_MSG(\"%s\") ==> ignored\n",
+                     blurb(), msg[replies]->msg);
+          break;
+        default:
+          /* Must be an error of some sort... */
+          free (reply);
+          if (c->verbose_p)
+            fprintf (stderr, "%s:     PAM unknown %d(\"%s\") ==> ignored\n",
+                     blurb(), msg[replies]->msg_style, msg[replies]->msg);
+          return PAM_CONV_ERR;
+        }
+    }
+  *resp = reply;
+  return PAM_SUCCESS;
+}
+
+#endif /* NO_LOCKING -- whole file */
diff --git a/driver/passwd-pwent.c b/driver/passwd-pwent.c
new file mode 100644 (file)
index 0000000..a2d5e0c
--- /dev/null
@@ -0,0 +1,305 @@
+/* passwd-pwent.c --- verifying typed passwords with the OS.
+ * xscreensaver, Copyright (c) 1993-1998 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software 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.  No representations are made about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or 
+ * implied warranty.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#ifndef NO_LOCKING  /* whole file */
+
+#include <stdlib.h>
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+
+#ifdef HAVE_CRYPT_H
+# include <crypt.h>
+#endif
+
+#include <stdio.h>
+#include <string.h>
+#include <sys/types.h>
+#ifndef VMS
+# include <pwd.h>
+# include <grp.h>
+#else /* VMS */
+# include "vms-pwd.h"
+#endif /* VMS */
+
+
+#ifdef __bsdi__
+# include <sys/param.h>
+# if _BSDI_VERSION >= 199608
+#  define BSD_AUTH
+# endif
+#endif /* __bsdi__ */
+
+
+#if defined(HAVE_SHADOW_PASSWD)              /* passwds live in /etc/shadow */
+
+#   include <shadow.h>
+#   define PWTYPE   struct spwd *
+#   define PWPSLOT  sp_pwdp
+#   define GETPW    getspnam
+
+#elif defined(HAVE_ENHANCED_PASSWD)      /* passwds live in /tcb/files/auth/ */
+                                     /* M.Matsumoto <matsu@yao.sharp.co.jp> */
+#   include <sys/security.h>
+#   include <prot.h>
+
+#   define PWTYPE   struct pr_passwd *
+#   define PWPSLOT  ufld.fd_encrypt
+#   define GETPW    getprpwnam
+
+#elif defined(HAVE_ADJUNCT_PASSWD)
+
+#   include <sys/label.h>
+#   include <sys/audit.h>
+#   include <pwdadj.h>
+
+#   define PWTYPE   struct passwd_adjunct *
+#   define PWPSLOT  pwa_passwd
+#   define GETPW    getpwanam
+
+#elif defined(HAVE_HPUX_PASSWD)
+
+#   include <hpsecurity.h>
+#   include <prot.h>
+
+#   define PWTYPE   struct s_passwd *
+#   define PWPSLOT  pw_passwd
+#   define GETPW    getspwnam
+
+#   define HAVE_BIGCRYPT
+
+#endif
+
+
+/* blargh */
+#undef  Bool
+#undef  True
+#undef  False
+#define Bool  int
+#define True  1
+#define False 0
+
+
+extern const char *blurb(void);
+
+static char *encrypted_root_passwd = 0;
+static char *encrypted_user_passwd = 0;
+
+#ifdef VMS
+# define ROOT "SYSTEM"
+#else
+# define ROOT "root"
+#endif
+
+
+
+#ifndef VMS
+
+static char *
+user_name (void)
+{
+  /* I think that just checking $USER here is not the best idea. */
+
+  const char *u = 0;
+
+  /* It has been reported that getlogin() returns the wrong user id on some
+     very old SGI systems...  And I've seen it return the string "rlogin"
+     sometimes!  Screw it, using getpwuid() should be enough...
+   */
+/* u = (char *) getlogin ();
+ */
+
+  /* getlogin() fails if not attached to a terminal; in that case, use
+     getpwuid().  (Note that in this case, we're not doing shadow stuff, since
+     all we're interested in is the name, not the password.  So that should
+     still work.  Right?) */
+  if (!u || !*u)
+    {
+      struct passwd *p = getpwuid (getuid ());
+      u = (p ? p->pw_name : 0);
+    }
+
+  return (u ? strdup(u) : 0);
+}
+
+#else  /* VMS */
+
+static char *
+user_name (void)
+{
+  char *u = getenv("USER");
+  return (u ? strdup(u) : 0);
+}
+
+#endif /* VMS */
+
+
+static Bool
+passwd_known_p (const char *pw)
+{
+  return (pw &&
+         pw[0] != '*' &&       /* This would be sensible...         */
+         strlen(pw) > 4);      /* ...but this is what Solaris does. */
+}
+
+
+static char *
+get_encrypted_passwd(const char *user)
+{
+  char *result = 0;
+
+#ifdef PWTYPE
+  if (user && *user && !result)
+    {                                  /* First check the shadow passwords. */
+      PWTYPE p = GETPW((char *) user);
+      if (p && passwd_known_p (p->PWPSLOT))
+       result = strdup(p->PWPSLOT);
+    }
+#endif /* PWTYPE */
+
+  if (user && *user && !result)
+    {                                  /* Check non-shadow passwords too. */
+      struct passwd *p = getpwnam(user);
+      if (p && passwd_known_p (p->pw_passwd))
+       result = strdup(p->pw_passwd);
+    }
+
+  /* The manual for passwd(4) on HPUX 10.10 says:
+
+         Password aging is put in effect for a particular user if his
+         encrypted password in the password file is followed by a comma and
+         a nonnull string of characters from the above alphabet.  This
+         string defines the "age" needed to implement password aging.
+
+     So this means that passwd->pw_passwd isn't simply a string of cyphertext,
+     it might have trailing junk.  So, if there is a comma in the string, and
+     that comma is beyond position 13, terminate the string before the comma.
+   */
+  if (result && strlen(result) > 13)
+    {
+      char *s = strchr (result+13, ',');
+      if (s)
+       *s = 0;
+    }
+
+#ifndef HAVE_PAM
+  /* We only issue this warning if not compiled with support for PAM.
+     If we're using PAM, it's not unheard of that normal pwent passwords
+     would be unavailable. */
+
+  if (!result)
+    fprintf (stderr, "%s: couldn't get password of \"%s\"\n",
+            blurb(), (user ? user : "(null)"));
+#endif /* !HAVE_PAM */
+
+  return result;
+}
+
+
+
+/* This has to be called before we've changed our effective user ID,
+   because it might need privileges to get at the encrypted passwords.
+   Returns false if we weren't able to get any passwords, and therefore,
+   locking isn't possible.  (It will also have written to stderr.)
+ */
+
+#ifndef VMS
+
+Bool
+pwent_priv_init (int argc, char **argv, Bool verbose_p)
+{
+  char *u;
+
+#ifdef HAVE_ENHANCED_PASSWD
+  set_auth_parameters(argc, argv);
+  check_auth_parameters();
+#endif /* HAVE_DEC_ENHANCED */
+
+  u = user_name();
+  encrypted_user_passwd = get_encrypted_passwd(u);
+  encrypted_root_passwd = get_encrypted_passwd(ROOT);
+  if (u) free (u);
+
+  if (encrypted_user_passwd)
+    return True;
+  else
+    return False;
+}
+
+
+Bool
+pwent_lock_init (int argc, char **argv, Bool verbose_p)
+{
+  if (encrypted_user_passwd)
+    return True;
+  else
+    return False;
+}
+
+
+
+static Bool
+passwds_match_p (const char *cleartext, const char *ciphertext)
+{
+  char *s = 0;  /* note that on some systems, crypt() may return null */
+
+  s = (char *) crypt (cleartext, ciphertext);
+  if (s && !strcmp (s, ciphertext))
+    return True;
+
+#ifdef HAVE_BIGCRYPT
+  /* There seems to be no way to tell at runtime if an HP machine is in
+     "trusted" mode, and thereby, which of crypt() or bigcrypt() we should
+     be calling to compare passwords.  So call them both, and see which
+     one works. */
+
+  s = (char *) bigcrypt (cleartext, ciphertext);
+  if (s && !strcmp (s, ciphertext))
+    return True;
+
+#endif /* HAVE_BIGCRYPT */
+  
+  return False;
+}
+
+
+
+/* This can be called at any time, and says whether the typed password
+   belongs to either the logged in user (real uid, not effective); or
+   to root.
+ */
+Bool
+pwent_passwd_valid_p (const char *typed_passwd, Bool verbose_p)
+{
+  if (encrypted_user_passwd &&
+      passwds_match_p (typed_passwd, encrypted_user_passwd))
+    return True;
+
+  /* do not allow root to have a null password. */
+  else if (typed_passwd[0] &&
+          encrypted_root_passwd &&
+           passwds_match_p (typed_passwd, encrypted_root_passwd))
+    return True;
+
+  else
+    return False;
+}
+
+#else  /* VMS */
+Bool pwent_lock_init (int argc, char **argv, Bool verbose_p) { return True; }
+#endif /* VMS */
+
+#endif /* NO_LOCKING -- whole file */
diff --git a/driver/passwd.c b/driver/passwd.c
new file mode 100644 (file)
index 0000000..b55334c
--- /dev/null
@@ -0,0 +1,162 @@
+/* passwd.c --- verifying typed passwords with the OS.
+ * xscreensaver, Copyright (c) 1993-1998 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software 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.  No representations are made about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or 
+ * implied warranty.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#ifndef NO_LOCKING  /* whole file */
+
+#include <stdio.h>
+#include <stdlib.h>
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+
+extern char *blurb(void);
+
+
+/* blargh */
+#undef  Bool
+#undef  True
+#undef  False
+#define Bool  int
+#define True  1
+#define False 0
+
+#undef countof
+#define countof(x) (sizeof((x))/sizeof(*(x)))
+
+struct auth_methods {
+  const char *name;
+  Bool (*init) (int argc, char **argv, Bool verbose_p);
+  Bool (*priv_init) (int argc, char **argv, Bool verbose_p);
+  Bool (*valid_p) (const char *typed_passwd, Bool verbose_p);
+  Bool initted_p;
+  Bool priv_initted_p;
+};
+
+
+#ifdef HAVE_KERBEROS
+extern Bool kerberos_lock_init (int argc, char **argv, Bool verbose_p);
+extern Bool kerberos_passwd_valid_p (const char *typed_passwd, Bool verbose_p);
+#endif
+#ifdef HAVE_PAM
+extern Bool pam_priv_init (int argc, char **argv, Bool verbose_p);
+extern Bool pam_passwd_valid_p (const char *typed_passwd, Bool verbose_p);
+#endif
+extern Bool pwent_lock_init (int argc, char **argv, Bool verbose_p);
+extern Bool pwent_priv_init (int argc, char **argv, Bool verbose_p);
+extern Bool pwent_passwd_valid_p (const char *typed_passwd, Bool verbose_p);
+
+
+/* The authorization methods to try, in order.
+   Note that the last one (the pwent version) is actually two auth methods,
+   since that code tries shadow passwords, and then non-shadow passwords.
+   (It's all in the same file since the APIs are randomly nearly-identical.)
+ */
+struct auth_methods methods[] = {
+# ifdef HAVE_KERBEROS
+  { "Kerberos",         kerberos_lock_init, 0, kerberos_passwd_valid_p,
+                        False, False },
+# endif
+# ifdef HAVE_PAM
+  { "PAM",              0, pam_priv_init, pam_passwd_valid_p, 
+                        False, False },
+# endif
+  { "normal",           pwent_lock_init, pwent_priv_init, pwent_passwd_valid_p,
+                        False, False }
+};
+
+
+Bool
+lock_priv_init (int argc, char **argv, Bool verbose_p)
+{
+  int i;
+  Bool any_ok = False;
+  for (i = 0; i < countof(methods); i++)
+    {
+      if (!methods[i].priv_init)
+        methods[i].priv_initted_p = True;
+      else
+        methods[i].priv_initted_p = methods[i].priv_init (argc, argv,
+                                                          verbose_p);
+
+      if (methods[i].priv_initted_p)
+        any_ok = True;
+      else if (verbose_p)
+        fprintf (stderr, "%s: initialization of %s passwords failed.\n",
+                 blurb(), methods[i].name);
+    }
+  return any_ok;
+}
+
+
+Bool
+lock_init (int argc, char **argv, Bool verbose_p)
+{
+  int i;
+  Bool any_ok = False;
+  for (i = 0; i < countof(methods); i++)
+    {
+      if (!methods[i].priv_initted_p)  /* Bail if lock_priv_init failed. */
+        continue;
+
+      if (!methods[i].init)
+        methods[i].initted_p = True;
+      else
+        methods[i].initted_p = methods[i].init (argc, argv, verbose_p);
+
+      if (methods[i].initted_p)
+        any_ok = True;
+      else if (verbose_p)
+        fprintf (stderr, "%s: initialization of %s passwords failed.\n",
+                 blurb(), methods[i].name);
+    }
+  return any_ok;
+}
+
+
+Bool 
+passwd_valid_p (const char *typed_passwd, Bool verbose_p)
+{
+  int i, j;
+  for (i = 0; i < countof(methods); i++)
+    {
+      if (methods[i].initted_p &&
+          methods[i].valid_p (typed_passwd, verbose_p))
+        {
+          /* If we successfully authenticated by method N, but attempting
+             to authenticate by method N-1 failed, mention that (since if
+             an earlier authentication method fails and a later one succeeds,
+             something screwy is probably going on.)
+           */
+          if (verbose_p && i > 0)
+            {
+              for (j = 0; j < i; j++)
+                if (methods[j].initted_p)
+                  fprintf (stderr,
+                           "%s: authentication via %s passwords failed.\n",
+                           blurb(), methods[j].name);
+              fprintf (stderr,
+                       "%s: but authentication via %s passwords succeeded.\n",
+                       blurb(), methods[i].name);
+            }
+
+          return True;         /* Successfully authenticated! */
+        }
+    }
+
+  return False;                        /* Authentication failure. */
+}
+
+#endif /* NO_LOCKING -- whole file */
diff --git a/driver/prefs.c b/driver/prefs.c
new file mode 100644 (file)
index 0000000..fa8950f
--- /dev/null
@@ -0,0 +1,1029 @@
+/* dotfile.c --- management of the ~/.xscreensaver file.
+ * xscreensaver, Copyright (c) 1998 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software 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.  No representations are made about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or 
+ * implied warranty.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <stdlib.h>
+
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+
+#include <stdio.h>
+#include <ctype.h>
+#include <string.h>
+#include <sys/stat.h>
+#include <sys/time.h>
+
+#include <X11/Xlib.h>
+#include <X11/Xresource.h>
+
+#ifndef VMS
+# include <pwd.h>
+#else /* VMS */
+# include "vms-pwd.h"
+#endif /* VMS */
+
+
+/* This file doesn't need the Xt headers, so stub these types out... */
+#undef XtPointer
+#define XtAppContext void*
+#define XtIntervalId void*
+#define XtPointer    void*
+#define Widget       void*
+
+
+/* Just in case there's something pathological about stat.h... */
+#ifndef  S_IRUSR
+# define S_IRUSR 00400
+#endif
+#ifndef  S_IWUSR
+# define S_IWUSR 00200
+#endif
+#ifndef  S_IXUSR
+# define S_IXUSR 00100
+#endif
+#ifndef  S_IXGRP
+# define S_IXGRP 00010
+#endif
+#ifndef  S_IXOTH
+# define S_IXOTH 00001
+#endif
+
+
+#include "prefs.h"
+#include "resources.h"
+
+
+extern char *progname;
+extern char *progclass;
+extern const char *blurb (void);
+
+
+
+static void get_screenhacks (saver_preferences *p);
+
+
+static char *
+chase_symlinks (const char *file)
+{
+# ifdef HAVE_REALPATH
+  if (file)
+    {
+      char buf [2048];
+      if (realpath (file, buf))
+        return strdup (buf);
+
+      sprintf (buf, "%s: realpath", blurb());
+      perror(buf);
+    }
+# endif /* HAVE_REALPATH */
+  return 0;
+}
+
+
+const char *
+init_file_name (void)
+{
+  static char *file = 0;
+
+  if (!file)
+    {
+      struct passwd *p = getpwuid (getuid ());
+
+      if (!p || !p->pw_name || !*p->pw_name)
+       {
+         fprintf (stderr, "%s: couldn't get user info of uid %d\n",
+                  blurb(), getuid ());
+         file = "";
+       }
+      else if (!p->pw_dir || !*p->pw_dir)
+       {
+         fprintf (stderr, "%s: couldn't get home directory of \"%s\"\n",
+                  blurb(), (p->pw_name ? p->pw_name : "???"));
+         file = "";
+       }
+      else
+       {
+         const char *home = p->pw_dir;
+         const char *name = ".xscreensaver";
+         file = (char *) malloc(strlen(home) + strlen(name) + 2);
+         strcpy(file, home);
+         if (!*home || home[strlen(home)-1] != '/')
+           strcat(file, "/");
+         strcat(file, name);
+       }
+    }
+
+  if (file && *file)
+    return file;
+  else
+    return 0;
+}
+
+
+static const char *
+init_file_tmp_name (void)
+{
+  static char *file = 0;
+  if (!file)
+    {
+      const char *name = init_file_name();
+      const char *suffix = ".tmp";
+
+      char *n2 = chase_symlinks (name);
+      if (n2) name = n2;
+
+      if (!name || !*name)
+       file = "";
+      else
+       {
+         file = (char *) malloc(strlen(name) + strlen(suffix) + 2);
+         strcpy(file, name);
+         strcat(file, suffix);
+       }
+
+      if (n2) free (n2);
+    }
+
+  if (file && *file)
+    return file;
+  else
+    return 0;
+}
+
+
+static const char * const prefs[] = {
+  "timeout",
+  "cycle",
+  "lock",
+  "lockVTs",
+  "lockTimeout",
+  "passwdTimeout",
+  "visualID",
+  "installColormap",
+  "verbose",
+  "timestamp",
+  "splash",                    /* not saved -- same as "splashDuration: 0" */
+  "splashDuration",
+  "demoCommand",
+  "prefsCommand",
+  "helpURL",
+  "loadURL",
+  "nice",
+  "fade",
+  "unfade",
+  "fadeSeconds",
+  "fadeTicks",
+  "captureStderr",
+  "captureStdout",             /* not saved -- obsolete */
+  "font",
+  "",
+  "programs",
+  "",
+  "pointerPollTime",
+  "windowCreationTimeout",
+  "initialDelay",
+  "sgiSaverExtension",
+  "mitSaverExtension",
+  "xidleExtension",
+  "procInterrupts",
+  "overlayStderr",
+  "overlayTextBackground",     /* not saved -- X resources only */
+  "overlayTextForeground",     /* not saved -- X resources only */
+  "bourneShell",               /* not saved -- X resources only */
+  0
+};
+
+static char *
+strip (char *s)
+{
+  char *s2;
+  while (*s == '\t' || *s == ' ' || *s == '\r' || *s == '\n')
+    s++;
+  for (s2 = s; *s2; s2++)
+    ;
+  for (s2--; s2 >= s; s2--) 
+    if (*s2 == '\t' || *s2 == ' ' || *s2 == '\r' || *s2 =='\n') 
+      *s2 = 0;
+    else
+      break;
+  return s;
+}
+
+\f
+/* Reading
+ */
+
+static int
+handle_entry (XrmDatabase *db, const char *key, const char *value,
+             const char *filename, int line)
+{
+  int i;
+  for (i = 0; prefs[i]; i++)
+    if (*prefs[i] && !strcasecmp(key, prefs[i]))
+      {
+       char *val = strdup(value);
+       char *spec = (char *) malloc(strlen(progclass) + strlen(prefs[i]) +10);
+       strcpy(spec, progclass);
+       strcat(spec, ".");
+       strcat(spec, prefs[i]);
+
+       XrmPutStringResource (db, spec, val);
+
+       free(spec);
+       free(val);
+       return 0;
+      }
+
+  fprintf(stderr, "%s: %s:%d: unknown option \"%s\"\n",
+         blurb(), filename, line, key);
+  return 1;
+}
+
+
+static int
+parse_init_file (saver_preferences *p)
+{
+  time_t write_date = 0;
+  const char *name = init_file_name();
+  int line = 0;
+  struct stat st;
+  FILE *in;
+  int buf_size = 1024;
+  char *buf;
+
+  if (!name) return 0;
+
+  if (stat(name, &st) != 0)
+    {
+      p->init_file_date = 0;
+      return 0;
+    }
+
+  in = fopen(name, "r");
+  if (!in)
+    {
+      char *buf = (char *) malloc(1024 + strlen(name));
+      sprintf(buf, "%s: error reading \"%s\"", blurb(), name);
+      perror(buf);
+      free(buf);
+      return -1;
+    }
+
+  if (fstat (fileno(in), &st) == 0)
+    {
+      write_date = st.st_mtime;
+    }
+  else
+    {
+      char *buf = (char *) malloc(1024 + strlen(name));
+      sprintf(buf, "%s: couldn't re-stat \"%s\"", blurb(), name);
+      perror(buf);
+      free(buf);
+      return -1;
+    }
+
+  buf = (char *) malloc(buf_size);
+
+  while (fgets (buf, buf_size-1, in))
+    {
+      char *key, *value;
+      int L = strlen(buf);
+
+      line++;
+      while (L > 2 &&
+            (buf[L-1] != '\n' ||       /* whole line didn't fit in buffer */
+             buf[L-2] == '\\'))        /* or line ended with backslash */
+       {
+         if (buf[L-2] == '\\')         /* backslash-newline gets swallowed */
+           {
+             buf[L-2] = 0;
+             L -= 2;
+           }
+         buf_size += 1024;
+         buf = (char *) realloc(buf, buf_size);
+         if (!buf) exit(1);
+
+         line++;
+         if (!fgets (buf + L, buf_size-L-1, in))
+           break;
+         L = strlen(buf);
+       }
+
+      /* Now handle other backslash escapes. */
+      {
+       int i, j;
+       for (i = 0; buf[i]; i++)
+         if (buf[i] == '\\')
+           {
+             switch (buf[i+1])
+               {
+               case 'n': buf[i] = '\n'; break;
+               case 'r': buf[i] = '\r'; break;
+               case 't': buf[i] = '\t'; break;
+               default:  buf[i] = buf[i+1]; break;
+               }
+             for (j = i+2; buf[j]; j++)
+               buf[j-1] = buf[j];
+             buf[j-1] = 0;
+           }
+      }
+
+      key = strip(buf);
+
+      if (*key == '#' || *key == '!' || *key == ';' ||
+         *key == '\n' || *key == 0)
+       continue;
+
+      value = strchr (key, ':');
+      if (!value)
+       {
+         fprintf(stderr, "%s: %s:%d: unparsable line: %s\n", blurb(),
+                 name, line, key);
+         continue;
+       }
+      else
+       {
+         *value++ = 0;
+         value = strip(value);
+       }
+
+      if (!p->db) abort();
+      handle_entry (&p->db, key, value, name, line);
+    }
+  free(buf);
+
+  p->init_file_date = write_date;
+  return 0;
+}
+
+
+Bool
+init_file_changed_p (saver_preferences *p)
+{
+  const char *name = init_file_name();
+  struct stat st;
+
+  if (!name) return False;
+
+  if (stat(name, &st) != 0)
+    return False;
+
+  if (p->init_file_date == st.st_mtime)
+    return False;
+
+  return True;
+}
+
+\f
+/* Writing
+ */
+
+static int
+tab_to (FILE *out, int from, int to)
+{
+  int tab_width = 8;
+  int to_mod = (to / tab_width) * tab_width;
+  while (from < to_mod)
+    {
+      fprintf(out, "\t");
+      from = (((from / tab_width) + 1) * tab_width);
+    }
+  while (from < to)
+    {
+      fprintf(out, " ");
+      from++;
+    }
+  return from;
+}
+
+static void
+write_entry (FILE *out, const char *key, const char *value)
+{
+  char *v = strdup(value ? value : "");
+  char *v2 = v;
+  char *nl = 0;
+  int col;
+  Bool do_visual_kludge = (!strcmp(key, "programs"));
+  Bool do_wrap = do_visual_kludge;
+  int tab = (do_visual_kludge ? 16 : 23);
+  int tab2 = 3;
+  Bool first = True;
+
+  fprintf(out, "%s:", key);
+  col = strlen(key) + 1;
+
+  while (1)
+    {
+      char *s;
+      Bool disabled_p = False;
+
+      v2 = strip(v2);
+      nl = strchr(v2, '\n');
+      if (nl)
+       *nl = 0;
+
+      if (do_visual_kludge && *v2 == '-')
+       {
+         disabled_p = True;
+         v2++;
+         v2 = strip(v2);
+       }
+
+      if (first && disabled_p)
+       first = False;
+
+      if (first)
+       first = False;
+      else
+       {
+         col = tab_to(out, col, 75);
+         fprintf(out, " \\n\\\n");
+         col = 0;
+       }
+
+      if (disabled_p)
+       {
+         fprintf(out, "-");
+         col++;
+       }
+
+      s = (do_visual_kludge ? strpbrk(v2, " \t\n:") : 0);
+      if (s && *s == ':')
+       col = tab_to (out, col, tab2);
+      else
+       col = tab_to (out, col, tab);
+
+      if (do_wrap &&
+         strlen(v2) + col > 75)
+       {
+         int L = strlen(v2);
+         int start = 0;
+         int end = start;
+         while (start < L)
+           {
+             while (v2[end] == ' ' || v2[end] == '\t')
+               end++;
+             while (v2[end] != ' ' && v2[end] != '\t' &&
+                    v2[end] != '\n' && v2[end] != 0)
+               end++;
+             if (col + (end - start) >= 74)
+               {
+                 col = tab_to (out, col, 75);
+                 fprintf(out, "   \\\n");
+                 col = tab_to (out, 0, tab + 2);
+                 while (v2[start] == ' ' || v2[start] == '\t')
+                   start++;
+               }
+
+             while (start < end)
+               {
+                 fputc(v2[start++], out);
+                 col++;
+               }
+           }
+       }
+      else
+       {
+         fprintf (out, "%s", v2);
+         col += strlen(v2);
+       }
+
+      if (nl)
+       v2 = nl + 1;
+      else
+       break;
+    }
+
+  fprintf(out, "\n");
+  free(v);
+}
+
+void
+write_init_file (saver_preferences *p, const char *version_string)
+{
+  const char *name = init_file_name();
+  const char *tmp_name = init_file_tmp_name();
+  char *n2 = chase_symlinks (name);
+  struct stat st;
+  int i, j;
+
+  /* Kludge, since these aren't in the saver_preferences struct as strings...
+   */
+  char *visual_name;
+  char *programs;
+  Bool capture_stderr_p;
+  Bool overlay_stderr_p;
+  char *stderr_font;
+  FILE *out;
+
+  if (!name) goto END;
+
+  if (n2) name = n2;
+
+  if (p->verbose_p)
+    fprintf (stderr, "%s: writing \"%s\".\n", blurb(), name);
+
+  unlink (tmp_name);
+  out = fopen(tmp_name, "w");
+  if (!out)
+    {
+      char *buf = (char *) malloc(1024 + strlen(name));
+      sprintf(buf, "%s: error writing \"%s\"", blurb(), name);
+      perror(buf);
+      free(buf);
+      goto END;
+    }
+
+  /* Give the new .xscreensaver file the same permissions as the old one;
+     except ensure that it is readable and writable by owner, and not
+     executable.
+   */
+  if (stat(name, &st) == 0)
+    {
+      mode_t mode = st.st_mode;
+      mode |= S_IRUSR | S_IWUSR;
+      mode &= ~(S_IXUSR | S_IXGRP | S_IXOTH);
+      if (fchmod (fileno(out), mode) != 0)
+       {
+         char *buf = (char *) malloc(1024 + strlen(name));
+         sprintf (buf, "%s: error fchmodding \"%s\" to 0%o", blurb(),
+                  tmp_name, (unsigned int) mode);
+         perror(buf);
+         free(buf);
+         goto END;
+       }
+    }
+
+  /* Kludge, since these aren't in the saver_preferences struct... */
+  visual_name = get_string_resource ("visualID", "VisualID");
+  programs = 0;
+  capture_stderr_p = get_boolean_resource ("captureStderr", "Boolean");
+  overlay_stderr_p = get_boolean_resource ("overlayStderr", "Boolean");
+  stderr_font = get_string_resource ("font", "Font");
+
+  i = 0;
+  for (j = 0; j < p->screenhacks_count; j++)
+    i += strlen(p->screenhacks[j]) + 2;
+  {
+    char *ss = programs = (char *) malloc(i + 10);
+    *ss = 0;
+    for (j = 0; j < p->screenhacks_count; j++)
+      {
+       strcat(ss, p->screenhacks[j]);
+       ss += strlen(ss);
+       *ss++ = '\n';
+       *ss = 0;
+      }
+  }
+
+  {
+    struct passwd *pw = getpwuid (getuid ());
+    char *whoami = (pw && pw->pw_name && *pw->pw_name
+                   ? pw->pw_name
+                   : "<unknown>");
+    time_t now = time ((time_t *) 0);
+    char *timestr = (char *) ctime (&now);
+    char *nl = (char *) strchr (timestr, '\n');
+    if (nl) *nl = 0;
+    fprintf (out,
+            "# %s Preferences File\n"
+            "# Written by %s %s for %s on %s.\n"
+            "# http://www.jwz.org/xscreensaver/\n"
+            "\n",
+            progclass, progname, version_string, whoami, timestr);
+  }
+
+  for (j = 0; prefs[j]; j++)
+    {
+      char buf[255];
+      const char *pr = prefs[j];
+      enum pref_type { pref_str, pref_int, pref_bool, pref_time
+      } type = pref_str;
+      const char *s = 0;
+      int i = 0;
+      Bool b = False;
+      Time t = 0;
+
+      if (pr && !*pr)
+       {
+         fprintf(out, "\n");
+         continue;
+       }
+
+# undef CHECK
+# define CHECK(X) else if (!strcmp(pr, X))
+      if (!pr || !*pr)         ;
+      CHECK("timeout")         type = pref_time, t = p->timeout;
+      CHECK("cycle")           type = pref_time, t = p->cycle;
+      CHECK("lock")            type = pref_bool, b = p->lock_p;
+# if 0 /* #### not ready yet */
+      CHECK("lockVTs")         type = pref_bool, b = p->lock_vt_p;
+# else
+      CHECK("lockVTs")         continue;  /* don't save */
+# endif
+      CHECK("lockTimeout")     type = pref_time, t = p->lock_timeout;
+      CHECK("passwdTimeout")   type = pref_time, t = p->passwd_timeout;
+      CHECK("visualID")                type = pref_str,  s =    visual_name;
+      CHECK("installColormap") type = pref_bool, b = p->install_cmap_p;
+      CHECK("verbose")         type = pref_bool, b = p->verbose_p;
+      CHECK("timestamp")       type = pref_bool, b = p->timestamp_p;
+      CHECK("splash")          continue;  /* don't save */
+      CHECK("splashDuration")  type = pref_time, t = p->splash_duration;
+      CHECK("demoCommand")     type = pref_str,  s = p->demo_command;
+      CHECK("prefsCommand")    type = pref_str,  s = p->prefs_command;
+      CHECK("helpURL")         type = pref_str,  s = p->help_url;
+      CHECK("loadURL")         type = pref_str,  s = p->load_url_command;
+      CHECK("nice")            type = pref_int,  i = p->nice_inferior;
+      CHECK("fade")            type = pref_bool, b = p->fade_p;
+      CHECK("unfade")          type = pref_bool, b = p->unfade_p;
+      CHECK("fadeSeconds")     type = pref_time, t = p->fade_seconds;
+      CHECK("fadeTicks")       type = pref_int,  i = p->fade_ticks;
+      CHECK("captureStderr")   type = pref_bool, b =    capture_stderr_p;
+      CHECK("captureStdout")   continue;  /* don't save */
+      CHECK("font")            type = pref_str,  s =    stderr_font;
+      CHECK("programs")                type = pref_str,  s =    programs;
+      CHECK("pointerPollTime") type = pref_time, t = p->pointer_timeout;
+      CHECK("windowCreationTimeout")type=pref_time,t= p->notice_events_timeout;
+      CHECK("initialDelay")    type = pref_time, t = p->initial_delay;
+      CHECK("sgiSaverExtension")type = pref_bool, b=p->use_sgi_saver_extension;
+      CHECK("mitSaverExtension")type = pref_bool, b=p->use_mit_saver_extension;
+      CHECK("xidleExtension")  type = pref_bool, b = p->use_xidle_extension;
+      CHECK("procInterrupts")  type = pref_bool, b = p->use_proc_interrupts;
+      CHECK("overlayStderr")   type = pref_bool, b = overlay_stderr_p;
+      CHECK("overlayTextBackground") continue;  /* don't save */
+      CHECK("overlayTextForeground") continue;  /* don't save */
+      CHECK("bourneShell")     continue;
+      else                     abort();
+# undef CHECK
+
+      switch (type)
+       {
+       case pref_str:
+         break;
+       case pref_int:
+         sprintf(buf, "%d", i);
+         s = buf;
+         break;
+       case pref_bool:
+         s = b ? "True" : "False";
+         break;
+       case pref_time:
+         {
+           unsigned int hour = 0, min = 0, sec = (unsigned int) (t/1000);
+           if (sec >= 60)
+             {
+               min += (sec / 60);
+               sec %= 60;
+             }
+           if (min >= 60)
+             {
+               hour += (min / 60);
+               min %= 60;
+             }
+           sprintf (buf, "%u:%02u:%02u", hour, min, sec);
+           s = buf;
+         }
+         break;
+       default:
+         abort();
+         break;
+       }
+      write_entry (out, pr, s);
+    }
+
+  fprintf(out, "\n");
+
+  if (visual_name) free(visual_name);
+  if (stderr_font) free(stderr_font);
+  if (programs) free(programs);
+
+  if (fclose(out) == 0)
+    {
+      time_t write_date = 0;
+
+      if (stat(tmp_name, &st) == 0)
+       {
+         write_date = st.st_mtime;
+       }
+      else
+       {
+         char *buf = (char *) malloc(1024 + strlen(tmp_name) + strlen(name));
+         sprintf(buf, "%s: couldn't stat \"%s\"", blurb(), tmp_name);
+         perror(buf);
+         unlink (tmp_name);
+         free(buf);
+         goto END;
+       }
+
+      if (rename (tmp_name, name) != 0)
+       {
+         char *buf = (char *) malloc(1024 + strlen(tmp_name) + strlen(name));
+         sprintf(buf, "%s: error renaming \"%s\" to \"%s\"",
+                 blurb(), tmp_name, name);
+         perror(buf);
+         unlink (tmp_name);
+         free(buf);
+         goto END;
+       }
+      else
+       {
+         p->init_file_date = write_date;
+
+         /* Since the .xscreensaver file is used for IPC, let's try and make
+            sure that the bits actually land on the disk right away. */
+         sync ();
+       }
+    }
+  else
+    {
+      char *buf = (char *) malloc(1024 + strlen(name));
+      sprintf(buf, "%s: error closing \"%s\"", blurb(), name);
+      perror(buf);
+      free(buf);
+      unlink (tmp_name);
+      goto END;
+    }
+
+ END:
+  if (n2) free (n2);
+}
+
+\f
+/* Parsing the resource database
+ */
+
+
+/* Populate `saver_preferences' with the contents of the resource database.
+   Note that this may be called multiple times -- it is re-run each time
+   the ~/.xscreensaver file is reloaded.
+
+   This function can be very noisy, since it issues resource syntax errors
+   and so on.
+ */
+void
+load_init_file (saver_preferences *p)
+{
+  static Bool first_time = True;
+  
+  if (parse_init_file (p) != 0)                /* file might have gone away */
+    if (!first_time) return;
+
+  first_time = False;
+
+  p->xsync_p       = get_boolean_resource ("synchronous", "Synchronous");
+  p->verbose_p     = get_boolean_resource ("verbose", "Boolean");
+  p->timestamp_p    = get_boolean_resource ("timestamp", "Boolean");
+  p->lock_p        = get_boolean_resource ("lock", "Boolean");
+  p->lock_vt_p     = get_boolean_resource ("lockVTs", "Boolean");
+  p->fade_p        = get_boolean_resource ("fade", "Boolean");
+  p->unfade_p      = get_boolean_resource ("unfade", "Boolean");
+  p->fade_seconds   = 1000 * get_seconds_resource ("fadeSeconds", "Time");
+  p->fade_ticks            = get_integer_resource ("fadeTicks", "Integer");
+  p->install_cmap_p = get_boolean_resource ("installColormap", "Boolean");
+  p->nice_inferior  = get_integer_resource ("nice", "Nice");
+
+  p->initial_delay   = 1000 * get_seconds_resource ("initialDelay", "Time");
+  p->splash_duration = 1000 * get_seconds_resource ("splashDuration", "Time");
+  p->timeout         = 1000 * get_minutes_resource ("timeout", "Time");
+  p->lock_timeout    = 1000 * get_minutes_resource ("lockTimeout", "Time");
+  p->cycle           = 1000 * get_minutes_resource ("cycle", "Time");
+  p->passwd_timeout  = 1000 * get_seconds_resource ("passwdTimeout", "Time");
+  p->pointer_timeout = 1000 * get_seconds_resource ("pointerPollTime", "Time");
+  p->notice_events_timeout = 1000*get_seconds_resource("windowCreationTimeout",
+                                                      "Time");
+  p->shell = get_string_resource ("bourneShell", "BourneShell");
+
+  p->demo_command = get_string_resource("demoCommand", "URL");
+  p->prefs_command = get_string_resource("prefsCommand", "URL");
+  p->help_url = get_string_resource("helpURL", "URL");
+  p->load_url_command = get_string_resource("loadURL", "LoadURL");
+
+  {
+    char *s;
+    if ((s = get_string_resource ("splash", "Boolean")))
+      if (!get_boolean_resource("splash", "Boolean"))
+       p->splash_duration = 0;
+    if (s) free (s);
+  }
+
+  p->use_xidle_extension = get_boolean_resource ("xidleExtension","Boolean");
+  p->use_mit_saver_extension = get_boolean_resource ("mitSaverExtension",
+                                                    "Boolean");
+  p->use_sgi_saver_extension = get_boolean_resource ("sgiSaverExtension",
+                                                    "Boolean");
+  p->use_proc_interrupts = get_boolean_resource ("procInterrupts", "Boolean");
+
+  /* Throttle the various timeouts to reasonable values.
+   */
+  if (p->passwd_timeout <= 0) p->passwd_timeout = 30000;        /* 30 secs */
+  if (p->timeout < 10000) p->timeout = 10000;                   /* 10 secs */
+  if (p->cycle != 0 && p->cycle < 2000) p->cycle = 2000;        /*  2 secs */
+  if (p->pointer_timeout <= 0) p->pointer_timeout = 5000;       /*  5 secs */
+  if (p->notice_events_timeout <= 0)
+    p->notice_events_timeout = 10000;                           /* 10 secs */
+  if (p->fade_seconds <= 0 || p->fade_ticks <= 0)
+    p->fade_p = False;
+  if (! p->fade_p) p->unfade_p = False;
+
+  p->watchdog_timeout = p->cycle * 0.6;
+  if (p->watchdog_timeout < 30000) p->watchdog_timeout = 30000;          /* 30 secs */
+  if (p->watchdog_timeout > 3600000) p->watchdog_timeout = 3600000; /*  1 hr */
+
+  get_screenhacks (p);
+
+  if (p->debug_p)
+    {
+      p->xsync_p = True;
+      p->verbose_p = True;
+      p->timestamp_p = True;
+      p->initial_delay = 0;
+    }
+}
+
+\f
+/* Parsing the programs resource.
+ */
+
+static char *
+reformat_hack (const char *hack)
+{
+  int i;
+  const char *in = hack;
+  int indent = 15;
+  char *h2 = (char *) malloc(strlen(in) + indent + 2);
+  char *out = h2;
+  Bool disabled_p = False;
+
+  while (isspace(*in)) in++;           /* skip whitespace */
+
+  if (*in == '-')                      /* Handle a leading "-". */
+    {
+      in++;
+      hack = in;
+      *out++ = '-';
+      *out++ = ' ';
+      disabled_p = True;
+      while (isspace(*in)) in++;
+    }
+  else
+    {
+      *out++ = ' ';
+      *out++ = ' ';
+    }
+
+  while (*in && !isspace(*in) && *in != ':')
+    *out++ = *in++;                    /* snarf first token */
+  while (isspace(*in)) in++;           /* skip whitespace */
+
+  if (*in == ':')
+    *out++ = *in++;                    /* copy colon */
+  else
+    {
+      in = hack;
+      out = h2 + 2;                    /* reset to beginning */
+    }
+
+  *out = 0;
+
+  while (isspace(*in)) in++;           /* skip whitespace */
+  for (i = strlen(h2); i < indent; i++)        /* indent */
+    *out++ = ' ';
+
+  /* copy the rest of the line. */
+  while (*in)
+    {
+      /* shrink all whitespace to one space, for the benefit of the "demo"
+        mode display.  We only do this when we can easily tell that the
+        whitespace is not significant (no shell metachars).
+       */
+      switch (*in)
+       {
+       case '\'': case '"': case '`': case '\\':
+         {
+           /* Metachars are scary.  Copy the rest of the line unchanged. */
+           while (*in)
+             *out++ = *in++;
+         }
+         break;
+       case ' ': case '\t':
+         {
+           while (*in == ' ' || *in == '\t')
+             in++;
+           *out++ = ' ';
+         }
+         break;
+       default:
+         *out++ = *in++;
+         break;
+       }
+    }
+  *out = 0;
+
+  /* strip trailing whitespace. */
+  out = out-1;
+  while (out > h2 && (*out == ' ' || *out == '\t' || *out == '\n'))
+    *out-- = 0;
+
+  return h2;
+}
+
+
+static void
+get_screenhacks (saver_preferences *p)
+{
+  int i = 0;
+  int start = 0;
+  int end = 0;
+  int size;
+  char *d;
+
+  d = get_string_resource ("monoPrograms", "MonoPrograms");
+  if (d && !*d) { free(d); d = 0; }
+  if (!d)
+    d = get_string_resource ("colorPrograms", "ColorPrograms");
+  if (d && !*d) { free(d); d = 0; }
+
+  if (d)
+    {
+      fprintf (stderr,
+       "%s: the `monoPrograms' and `colorPrograms' resources are obsolete;\n\
+       see the manual for details.\n", blurb());
+      free(d);
+    }
+
+  d = get_string_resource ("programs", "Programs");
+
+  if (p->screenhacks)
+    {
+      for (i = 0; i < p->screenhacks_count; i++)
+       if (p->screenhacks[i])
+         free (p->screenhacks[i]);
+      free(p->screenhacks);
+      p->screenhacks = 0;
+    }
+
+  if (!d || !*d)
+    {
+      p->screenhacks_count = 0;
+      p->screenhacks = 0;
+      return;
+    }
+
+  size = strlen (d);
+
+
+  /* Count up the number of newlines (which will be equal to or larger than
+     the number of hacks.)
+   */
+  i = 0;
+  for (i = 0; d[i]; i++)
+    if (d[i] == '\n')
+      i++;
+  i++;
+
+  p->screenhacks = (char **) calloc (sizeof (char *), i+1);
+
+  /* Iterate over the lines in `d' (the string with newlines)
+     and make new strings to stuff into the `screenhacks' array.
+   */
+  p->screenhacks_count = 0;
+  while (start < size)
+    {
+      /* skip forward over whitespace. */
+      while (d[start] == ' ' || d[start] == '\t' || d[start] == '\n')
+       start++;
+
+      /* skip forward to newline or end of string. */
+      end = start;
+      while (d[end] != 0 && d[end] != '\n')
+       end++;
+
+      /* null terminate. */
+      d[end] = 0;
+
+      p->screenhacks[p->screenhacks_count++] = reformat_hack (d + start);
+      if (p->screenhacks_count >= i)
+       abort();
+
+      start = end+1;
+    }
+
+  if (p->screenhacks_count == 0)
+    {
+      free (p->screenhacks);
+      p->screenhacks = 0;
+    }
+}
diff --git a/driver/prefs.h b/driver/prefs.h
new file mode 100644 (file)
index 0000000..62c768d
--- /dev/null
@@ -0,0 +1,81 @@
+/* xscreensaver, Copyright (c) 1993-1998 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software 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.  No representations are made about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or 
+ * implied warranty.
+ */
+
+#ifndef __XSCREENSAVER_PREFS_H__
+#define __XSCREENSAVER_PREFS_H__
+
+typedef struct saver_preferences saver_preferences;
+
+
+/* This structure holds all the user-specified parameters, read from the
+   command line, the resource database, or entered through a dialog box.
+ */
+struct saver_preferences {
+
+  XrmDatabase db;              /* The resource database into which the
+                                  init file is merged, and out of which the
+                                  preferences are parsed. */
+
+  time_t init_file_date;       /* The date (from stat()) of the .xscreensaver
+                                  file the last time this process read or
+                                  wrote it. */
+
+  Bool verbose_p;              /* whether to print out lots of status info */
+  Bool timestamp_p;            /* whether to mark messages with a timestamp */
+  Bool debug_p;                        /* pay no mind to the man behind the curtain */
+  Bool xsync_p;                        /* whether XSynchronize has been called */
+
+  Bool lock_p;                 /* whether to lock as well as save */
+  Bool lock_vt_p;              /* whether to lock VTs too, if possible */
+
+  Bool fade_p;                 /* whether to fade to black, if possible */
+  Bool unfade_p;               /* whether to fade from black, if possible */
+  int fade_seconds;            /* how long that should take */
+  int fade_ticks;              /* how many ticks should be used */
+
+  Bool install_cmap_p;         /* whether we should use our own colormap
+                                  when using the screen's default visual. */
+
+  char **screenhacks;          /* the programs to run */
+  int screenhacks_count;
+
+  int nice_inferior;           /* nice value for subprocs */
+
+  Time initial_delay;          /* how long to sleep after launch */
+  Time splash_duration;                /* how long the splash screen stays up */
+  Time timeout;                        /* how much idle time before activation */
+  Time lock_timeout;           /* how long after activation locking starts */
+  Time cycle;                  /* how long each hack should run */
+  Time passwd_timeout;         /* how much time before pw dialog goes down */
+  Time pointer_timeout;                /* how often to check mouse position */
+  Time notice_events_timeout;  /* how long after window creation to select */
+  Time watchdog_timeout;       /* how often to re-raise and re-blank screen */
+
+  Bool use_xidle_extension;    /* which extension to use, if possible */
+  Bool use_mit_saver_extension;
+  Bool use_sgi_saver_extension;
+  Bool use_proc_interrupts;
+
+  char *shell;                 /* where to find /bin/sh */
+
+  char *demo_command;          /* How to enter demo mode. */
+  char *prefs_command;         /* How to edit preferences. */
+  char *help_url;              /* Where the help document resides. */
+  char *load_url_command;      /* How one loads URLs. */
+};
+
+
+extern void load_init_file (saver_preferences *p);
+extern Bool init_file_changed_p (saver_preferences *p);
+extern void write_init_file (saver_preferences *p, const char *version_string);
+const char *init_file_name (void);
+
+#endif /* __XSCREENSAVER_PREFS_H__ */
diff --git a/driver/remote.c b/driver/remote.c
new file mode 100644 (file)
index 0000000..26c8555
--- /dev/null
@@ -0,0 +1,461 @@
+/* xscreensaver-command, Copyright (c) 1991-1998
+ *  by Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software 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.  No representations are made about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or 
+ * implied warranty.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/time.h>
+#include <sys/types.h>
+
+#ifdef HAVE_SYS_SELECT_H
+# include <sys/select.h>
+#endif /* HAVE_SYS_SELECT_H */
+
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+
+#include <X11/Xproto.h>                /* for CARD32 */
+#include <X11/Xlib.h>
+#include <X11/Xatom.h>
+#include <X11/Xutil.h>         /* for XGetClassHint() */
+#include <X11/Xos.h>
+
+#include "remote.h"
+
+#ifdef _VROOT_H_
+ERROR! you must not include vroot.h in this file
+#endif
+
+extern char *progname;
+extern Atom XA_SCREENSAVER, XA_SCREENSAVER_VERSION, XA_SCREENSAVER_RESPONSE;
+extern Atom XA_SCREENSAVER_ID, XA_SCREENSAVER_TIME;
+extern Atom XA_VROOT, XA_SELECT, XA_DEMO;
+
+
+static XErrorHandler old_handler = 0;
+static Bool got_badwindow = False;
+static int
+BadWindow_ehandler (Display *dpy, XErrorEvent *error)
+{
+  if (error->error_code == BadWindow)
+    {
+      got_badwindow = True;
+      return 0;
+    }
+  else
+    {
+      fprintf (stderr, "%s: ", progname);
+      if (!old_handler) abort();
+      return (*old_handler) (dpy, error);
+    }
+}
+
+
+
+static Window
+find_screensaver_window (Display *dpy, char **version)
+{
+  int i;
+  Window root = RootWindowOfScreen (DefaultScreenOfDisplay (dpy));
+  Window root2, parent, *kids;
+  unsigned int nkids;
+
+  if (version) *version = 0;
+
+  if (! XQueryTree (dpy, root, &root2, &parent, &kids, &nkids))
+    abort ();
+  if (root != root2)
+    abort ();
+  if (parent)
+    abort ();
+  if (! (kids && nkids))
+    abort ();
+  for (i = 0; i < nkids; i++)
+    {
+      Atom type;
+      int format;
+      unsigned long nitems, bytesafter;
+      char *v;
+      int status;
+
+      /* We're walking the list of root-level windows and trying to find
+         the one that has a particular property on it.  We need to trap
+         BadWindows errors while doing this, because it's possible that
+         some random window might get deleted in the meantime.  (That
+         window won't have been the one we're looking for.)
+       */
+      XSync (dpy, False);
+      if (old_handler) abort();
+      old_handler = XSetErrorHandler (BadWindow_ehandler);
+      status = XGetWindowProperty (dpy, kids[i],
+                                   XA_SCREENSAVER_VERSION,
+                                   0, 200, False, XA_STRING,
+                                   &type, &format, &nitems, &bytesafter,
+                                   (unsigned char **) &v);
+      XSync (dpy, False);
+      XSetErrorHandler (old_handler);
+      old_handler = 0;
+
+      if (got_badwindow)
+        status = BadWindow;
+
+      if (status == Success && type != None)
+       {
+         if (version)
+           *version = v;
+         return kids[i];
+       }
+    }
+  fprintf (stderr, "%s: no screensaver is running on display %s\n", progname,
+          DisplayString (dpy));
+  return 0;
+}
+
+
+static int
+send_xscreensaver_command (Display *dpy, Atom command, long arg,
+                          Window *window_ret)
+{
+  char *v = 0;
+  Window window = find_screensaver_window (dpy, &v);
+  XWindowAttributes xgwa;
+
+  if (window_ret)
+    *window_ret = window;
+
+  if (!window)
+    return -1;
+
+  /* Select for property change events, so that we can read the response. */
+  XGetWindowAttributes (dpy, window, &xgwa);
+  XSelectInput (dpy, window, xgwa.your_event_mask | PropertyChangeMask);
+
+  if (command == XA_SCREENSAVER_TIME ||
+      command == XA_SCREENSAVER_VERSION)
+    {
+      XClassHint hint;
+      memset (&hint, 0, sizeof(hint));
+      if (!v || !*v)
+       {
+         fprintf (stderr, "%s: version property not set on window 0x%x?\n",
+                  progname, (unsigned int) window);
+         return -1;
+       }
+
+      XGetClassHint(dpy, window, &hint);
+      if (!hint.res_class)
+       {
+         fprintf (stderr, "%s: class hints not set on window 0x%x?\n",
+                  progname, (unsigned int) window);
+         return -1;
+       }
+
+      fprintf (stdout, "%s %s", hint.res_class, v);
+
+      if (command != XA_SCREENSAVER_TIME)
+       {
+         fprintf (stdout, "\n");
+       }
+      else
+       {
+         Atom type;
+         int format;
+         unsigned long nitems, bytesafter;
+         unsigned char *data = 0;
+         Bool active_p = False;
+
+         if (XGetWindowProperty (dpy, window, XA_VROOT,
+                                 0, 0, False, XA_WINDOW,
+                                 &type, &format, &nitems, &bytesafter,
+                                 &data)
+             == Success
+             && type != None)
+           active_p = True;
+
+         if (data) free (data);
+         data = 0;
+
+         if (XGetWindowProperty (dpy, window,
+                                 XA_SCREENSAVER_TIME,
+                                 0, 1, False, XA_INTEGER,
+                                 &type, &format, &nitems, &bytesafter,
+                                 &data)
+             == Success
+             && type == XA_INTEGER
+             && data)
+           {
+             CARD32 time32 = *((CARD32 *)data);
+             time_t tt = (time_t) time32;
+
+             if (active_p)
+               fprintf (stdout, ": screen blanked since ");
+             else
+               /* suggestions for a better way to phrase this are welcome. */
+               fprintf (stdout, ": screen non-blanked since ");
+             fprintf (stdout, "%s", ctime(&tt));
+             if (data) free (data);
+           }
+         else
+           {
+             if (data) free (data);
+             fprintf (stdout, "\n");
+             fflush (stdout);
+             fprintf (stderr, "%s: no time on window 0x%x (%s %s).\n",
+                      progname, (unsigned int) window,
+                      hint.res_class, (v ? v : "???"));
+             return -1;
+           }
+       }
+
+      /* No need to read a response for these commands. */
+      return 1;
+    }
+  else
+    {
+      XEvent event;
+      long arg1 = arg;
+      long arg2 = 0;
+
+      if (arg < 0)
+       abort();
+      else if (arg == 0 && command == XA_SELECT)
+       abort();
+      else if (arg != 0 && command == XA_DEMO)
+       {
+         arg1 = 300;   /* version number of the XA_DEMO protocol, */
+         arg2 = arg;   /* since it didn't use to take an argument. */
+       }
+
+      event.xany.type = ClientMessage;
+      event.xclient.display = dpy;
+      event.xclient.window = window;
+      event.xclient.message_type = XA_SCREENSAVER;
+      event.xclient.format = 32;
+      memset (&event.xclient.data, 0, sizeof(event.xclient.data));
+      event.xclient.data.l[0] = (long) command;
+      event.xclient.data.l[1] = arg1;
+      event.xclient.data.l[2] = arg2;
+      if (! XSendEvent (dpy, window, False, 0L, &event))
+       {
+         fprintf (stderr, "%s: XSendEvent(dpy, 0x%x ...) failed.\n",
+                  progname, (unsigned int) window);
+         return -1;
+       }
+    }
+  XSync (dpy, 0);
+  return 0;
+}
+
+
+static int
+xscreensaver_command_response (Display *dpy, Window window, Bool verbose_p)
+{
+  int fd = ConnectionNumber (dpy);
+  int timeout = 10;
+  int status;
+  fd_set fds;
+  struct timeval tv;
+
+  while (1)
+    {
+      FD_ZERO(&fds);
+      FD_SET(fd, &fds);
+      memset(&tv, 0, sizeof(tv));
+      tv.tv_sec = timeout;
+      status = select (fd+1, &fds, 0, &fds, &tv);
+
+      if (status < 0)
+       {
+         char buf[1024];
+         sprintf (buf, "%s: waiting for reply", progname);
+         perror (buf);
+         return status;
+       }
+      else if (status == 0)
+       {
+         fprintf (stderr, "%s: no response to command.\n", progname);
+         return -1;
+       }
+      else
+       {
+         XEvent event;
+         XNextEvent (dpy, &event);
+         if (event.xany.type == PropertyNotify &&
+             event.xproperty.state == PropertyNewValue &&
+             event.xproperty.atom == XA_SCREENSAVER_RESPONSE)
+           {
+             Status st2;
+             Atom type;
+             int format;
+             unsigned long nitems, bytesafter;
+             char *msg = 0;
+
+             XSync (dpy, False);
+              if (old_handler) abort();
+             old_handler = XSetErrorHandler (BadWindow_ehandler);
+             st2 = XGetWindowProperty (dpy, window,
+                                       XA_SCREENSAVER_RESPONSE,
+                                       0, 1024, True,
+                                       AnyPropertyType,
+                                       &type, &format, &nitems, &bytesafter,
+                                       (unsigned char **) &msg);
+             XSync (dpy, False);
+              XSetErrorHandler (old_handler);
+              old_handler = 0;
+
+             if (got_badwindow)
+               {
+                 fprintf (stdout,
+                          "%s: xscreensaver window has been deleted.\n",
+                          progname);
+                 return 0;
+               }
+
+             if (st2 == Success && type != None)
+               {
+                 if (type != XA_STRING || format != 8)
+                   {
+                     fprintf (stderr,
+                              "%s: unrecognized response property.\n",
+                              progname);
+                     if (msg) XFree (msg);
+                     return -1;
+                   }
+                 else if (!msg || (msg[0] != '+' && msg[0] != '-'))
+                   {
+                     fprintf (stderr,
+                              "%s: unrecognized response message.\n",
+                              progname);
+                     if (msg) XFree (msg);
+                     return -1;
+                   }
+                 else
+                   {
+                     int ret = (msg[0] == '+' ? 0 : -1);
+                     if (verbose_p || ret != 0)
+                       fprintf ((ret < 0 ? stderr : stdout),
+                                "%s: %s\n",
+                                progname,
+                                msg+1);
+                     XFree (msg);
+                     return ret;
+                   }
+               }
+           }
+       }
+    }
+}
+
+
+int
+xscreensaver_command (Display *dpy, Atom command, long arg, Bool verbose_p)
+{
+  Window w = 0;
+  int status = send_xscreensaver_command (dpy, command, arg, &w);
+  if (status == 0)
+    status = xscreensaver_command_response (dpy, w, verbose_p);
+  fflush (stdout);
+  fflush (stderr);
+  return status;
+}
+
+
+void
+server_xscreensaver_version (Display *dpy,
+                            char **version_ret,
+                            char **user_ret,
+                            char **host_ret)
+{
+  Window window = find_screensaver_window (dpy, 0);
+
+  Atom type;
+  int format;
+  unsigned long nitems, bytesafter;
+
+  if (version_ret)
+    *version_ret = 0;
+  if (user_ret)
+    *user_ret = 0;
+  if (host_ret)
+    *host_ret = 0;
+
+  if (!window)
+    return;
+
+  if (version_ret)
+    {
+      char *v = 0;
+      XGetWindowProperty (dpy, window, XA_SCREENSAVER_VERSION, 0, 1,
+                         False, XA_STRING, &type, &format, &nitems,
+                         &bytesafter, (unsigned char **) &v);
+      if (v)
+       {
+         *version_ret = strdup (v);
+         XFree (v);
+       }
+    }
+
+  if (user_ret || host_ret)
+    {
+      char *id = 0;
+      const char *user = 0;
+      const char *host = 0;
+
+      XGetWindowProperty (dpy, window, XA_SCREENSAVER_ID, 0, 512,
+                         False, XA_STRING, &type, &format, &nitems,
+                         &bytesafter, (unsigned char **) &id);
+      if (id && *id)
+       {
+         const char *old_tag = " on host ";
+         const char *s = strstr (id, old_tag);
+         if (s)
+           {
+             /* found ID of the form "1234 on host xyz". */
+             user = 0;
+             host = s + strlen (old_tag);
+           }
+         else
+           {
+             char *o = 0, *p = 0, *c = 0;
+             o = strchr (id, '(');
+             if (o) p = strchr (o, '@');
+             if (p) c = strchr (p, ')');
+             if (c)
+               {
+                 /* found ID of the form "1234 (user@host)". */
+                 user = o+1;
+                 host = p+1;
+                 *p = 0;
+                 *c = 0;
+               }
+           }
+
+       }
+
+      if (user && *user && *user != '?')
+       *user_ret = strdup (user);
+      else
+       *user_ret = 0;
+
+      if (host && *host && *host != '?')
+       *host_ret = strdup (host);
+      else
+       *host_ret = 0;
+
+      if (id)
+       XFree (id);
+    }
+}
diff --git a/driver/remote.h b/driver/remote.h
new file mode 100644 (file)
index 0000000..d368e43
--- /dev/null
@@ -0,0 +1,24 @@
+/* xscreensaver-command, Copyright (c) 1991-1998
+ *  by Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software 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.  No representations are made about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or 
+ * implied warranty.
+ */
+
+#ifndef _XSCREENSAVER_REMOTE_H_
+#define _XSCREENSAVER_REMOTE_H_
+
+extern int xscreensaver_command (Display *dpy, Atom command, long arg,
+                                Bool verbose_p);
+
+extern void server_xscreensaver_version (Display *dpy,
+                                        char **version_ret,
+                                        char **user_ret,
+                                        char **host_ret);
+
+#endif /* _XSCREENSAVER_REMOTE_H_ */
diff --git a/driver/setuid.c b/driver/setuid.c
new file mode 100644 (file)
index 0000000..83ad494
--- /dev/null
@@ -0,0 +1,309 @@
+/* setuid.c --- management of runtime privileges.
+ * xscreensaver, Copyright (c) 1993-1998 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software 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.  No representations are made about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or 
+ * implied warranty.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <X11/Xlib.h>          /* not used for much... */
+
+/* This file doesn't need the Xt headers, so stub these types out... */
+#undef XtPointer
+#define XtAppContext void*
+#define XrmDatabase  void*
+#define XtIntervalId void*
+#define XtPointer    void*
+#define Widget       void*
+
+#include "xscreensaver.h"
+
+#ifndef EPERM
+#include <errno.h>
+#endif
+
+#include <pwd.h>               /* for getpwnam() and struct passwd */
+#include <grp.h>               /* for getgrgid() and struct group */
+
+static const char *
+uid_gid_string (uid_t uid, gid_t gid)
+{
+  static char buf[255];
+  struct passwd *p = 0;
+  struct group *g = 0;
+  p = getpwuid (uid);
+  g = getgrgid (gid);
+  sprintf (buf, "%s/%s (%ld/%ld)",
+          (p && p->pw_name ? p->pw_name : "???"),
+          (g && g->gr_name ? g->gr_name : "???"),
+          (long) uid, (long) gid);
+  return buf;
+}
+
+
+void
+describe_uids (saver_info *si, FILE *out)
+{
+  uid_t uid = getuid();
+  gid_t gid = getgid();
+  uid_t euid = geteuid();
+  gid_t egid = getegid();
+  char *s1 = strdup (uid_gid_string (uid, gid));
+  char *s2 = strdup (uid_gid_string (euid, egid));
+
+  if (si->orig_uid && *si->orig_uid &&
+      (!!strcmp (si->orig_uid, s1) ||
+       !!strcmp (si->orig_uid, s2)))
+    fprintf (out, "%s: initial effective uid/gid was %s\n", blurb(),
+            si->orig_uid);
+
+  fprintf (out, "%s: running as %s", blurb(), s1);
+  if (uid != euid || gid != egid)
+    fprintf (out, "; effectively %s", s2);
+  fprintf(out, "\n");
+  free(s1);
+  free(s2);
+}
+
+
+static int
+set_ids_by_name (struct passwd *p, struct group *g, char **message_ret)
+{
+  int uid_errno = 0;
+  int gid_errno = 0;
+  uid_t uid = p->pw_uid;
+  gid_t gid = g->gr_gid;
+
+  if (message_ret)
+    *message_ret = 0;
+
+  /* Rumor has it that some implementations of of setuid() do nothing
+     when called with -1; therefore, if the "nobody" user has a uid of
+     -1, then that would be Really Bad.  Rumor further has it that such
+     systems really ought to be using -2 for "nobody", since that works.
+     So, if we get a uid (or gid, for good measure) of -1, switch to -2
+     instead.
+   */
+  if (gid == (gid_t) -1) gid = (gid_t) -2;
+  if (uid == (uid_t) -1) uid = (uid_t) -2;
+
+  errno = 0;
+  if (setgid (gid) != 0)
+    gid_errno = errno ? errno : -1;
+
+  errno = 0;
+  if (setuid (uid) != 0)
+    uid_errno = errno ? errno : -1;
+
+  if (uid_errno == 0 && gid_errno == 0)
+    {
+      static char buf [1024];
+      sprintf (buf, "changed uid/gid to %s/%s (%ld/%ld).",
+              p->pw_name, (g ? g->gr_name : "???"),
+              (long) uid, (long) gid);
+      if (message_ret)
+       *message_ret = buf;
+      return 0;
+    }
+  else
+    {
+      char buf [1024];
+      if (gid_errno)
+       {
+         sprintf (buf, "%s: couldn't set gid to %s (%ld)",
+                  blurb(),
+                  (g ? g->gr_name : "???"),
+                  (long) gid);
+         if (gid_errno == -1)
+           fprintf(stderr, "%s: unknown error\n", buf);
+         else
+           perror(buf);
+       }
+
+      if (uid_errno)
+       {
+         sprintf (buf, "%s: couldn't set uid to %s (%ld)",
+                  blurb(),
+                  (p ? p->pw_name : "???"),
+                  (long) uid);
+         if (uid_errno == -1)
+           fprintf(stderr, "%s: unknown error\n", buf);
+         else
+           perror(buf);
+       }
+
+      return -1;
+    }
+}
+
+static int
+set_ids_by_number (uid_t uid, gid_t gid, char **message_ret)
+{
+  struct passwd *p;
+  struct group *g;
+
+  errno = 0;
+  p = getpwuid (uid);
+  if (!p)
+    {
+      char buf [1024];
+      sprintf (buf, "%s: error looking up name of user %d", blurb(),
+              (long) uid);
+      if (errno)
+       perror (buf);
+      else
+       fprintf (stderr, "%s: unknown error.\n", buf);
+      return -1;
+    }
+
+  errno = 0;
+  g = getgrgid (gid);
+  if (!g)
+    {
+      char buf [1024];
+      sprintf (buf, "%s: error looking up name of group %d", blurb(),
+              (long) gid);
+      if (errno)
+       perror (buf);
+      else
+       fprintf (stderr, "%s: unknown error.\n", buf);
+      return -1;
+    }
+
+  return set_ids_by_name (p, g, message_ret);
+}
+
+
+/* If we've been run as setuid or setgid to someone else (most likely root)
+   turn off the extra permissions so that random user-specified programs
+   don't get special privileges.  (On some systems it is necessary to install
+   this program as setuid root in order to read the passwd file to implement
+   lock-mode.)
+
+     *** WARNING: DO NOT DISABLE ANY OF THE FOLLOWING CODE!
+         If you do so, you will open a security hole.  See the sections
+         of the xscreensaver manual titled "LOCKING AND ROOT LOGINS", 
+         and "USING XDM".
+ */
+void
+hack_uid (saver_info *si)
+{
+
+  /* Discard privileges, and set the effective user/group ids to the
+     real user/group ids.  That is, give up our "chmod +s" rights.
+   */
+  {
+    uid_t euid = geteuid();
+    gid_t egid = getegid();
+    uid_t uid = getuid();
+    gid_t gid = getgid();
+
+    si->orig_uid = strdup (uid_gid_string (euid, egid));
+
+    if (uid != euid || gid != egid)
+      if (set_ids_by_number (uid, gid, &si->uid_message) != 0)
+       saver_exit (si, 1, 0);
+  }
+
+
+  /* Locking can't work when running as root, because we have no way of
+     knowing what the user id of the logged in user is (so we don't know
+     whose password to prompt for.)
+
+     *** WARNING: DO NOT DISABLE THIS CODE!
+         If you do so, you will open a security hole.  See the sections
+         of the xscreensaver manual titled "LOCKING AND ROOT LOGINS",
+         and "USING XDM".
+   */
+  if (getuid() == (uid_t) 0)
+    {
+      si->locking_disabled_p = True;
+      si->nolock_reason = "running as root";
+    }
+
+
+  /* If we're running as root, switch to a safer user.  This is above and
+     beyond the fact that we've disabling locking, above -- the theory is
+     that running graphics demos as root is just always a stupid thing
+     to do, since they have probably never been security reviewed and are
+     more likely to be buggy than just about any other kind of program.
+     (And that assumes non-malicious code.  There are also attacks here.)
+
+     *** WARNING: DO NOT DISABLE THIS CODE!
+         If you do so, you will open a security hole.  See the sections
+         of the xscreensaver manual titled "LOCKING AND ROOT LOGINS", 
+         and "USING XDM".
+   */
+  if (getuid() == (uid_t) 0)
+    {
+      struct passwd *p;
+
+      p = getpwnam ("nobody");
+      if (! p) p = getpwnam ("noaccess");
+      if (! p) p = getpwnam ("daemon");
+      if (! p)
+       {
+         fprintf (stderr,
+                  "%s: running as root, and couldn't find a safer uid.\n",
+                  blurb());
+         saver_exit(si, 1, 0);
+       }
+
+      if (set_ids_by_number (p->pw_uid, p->pw_gid, &si->uid_message) != 0)
+       saver_exit (si, -1, 0);
+    }
+
+
+  /* If there's anything even remotely funny looking about the passwd struct,
+     or if we're running as some other user from the list below (a
+     non-comprehensive selection of users known to be privileged in some way,
+     and not normal end-users) then disable locking.  If it was possible,
+     switching to "nobody" would be the thing to do, but only root itself has
+     the privs to do that.
+
+     *** WARNING: DO NOT DISABLE THIS CODE!
+         If you do so, you will open a security hole.  See the sections
+         of the xscreensaver manual titled "LOCKING AND ROOT LOGINS",
+         and "USING XDM".
+   */
+  {
+    uid_t uid = getuid ();             /* get it again */
+    struct passwd *p = getpwuid (uid); /* get it again */
+
+    if (!p ||
+       uid == (uid_t)  0 ||
+       uid == (uid_t) -1 ||
+       uid == (uid_t) -2 ||
+       p->pw_uid == (uid_t)  0 ||
+       p->pw_uid == (uid_t) -1 ||
+       p->pw_uid == (uid_t) -2 ||
+       !p->pw_name ||
+       !*p->pw_name ||
+       !strcmp (p->pw_name, "root") ||
+       !strcmp (p->pw_name, "nobody") ||
+       !strcmp (p->pw_name, "noaccess") ||
+       !strcmp (p->pw_name, "operator") ||
+       !strcmp (p->pw_name, "daemon") ||
+       !strcmp (p->pw_name, "bin") ||
+       !strcmp (p->pw_name, "adm") ||
+       !strcmp (p->pw_name, "sys") ||
+       !strcmp (p->pw_name, "games"))
+      {
+       static char buf [1024];
+       sprintf (buf, "running as %s",
+                (p && p->pw_name && *p->pw_name
+                 ? p->pw_name : "<unknown>"));
+       si->nolock_reason = buf;
+       si->locking_disabled_p = True;
+       si->dangerous_uid_p = True;
+      }
+  }
+}
diff --git a/driver/splash.c b/driver/splash.c
new file mode 100644 (file)
index 0000000..fabd882
--- /dev/null
@@ -0,0 +1,756 @@
+/* xscreensaver, Copyright (c) 1991-1998 Jamie Zawinski <jwz@netscape.com>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software 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.  No representations are made about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or 
+ * implied warranty.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <X11/Intrinsic.h>
+
+#include "xscreensaver.h"
+#include "resources.h"
+
+#undef MAX
+#define MAX(a,b) ((a)>(b)?(a):(b))
+
+void
+draw_shaded_rectangle (Display *dpy, Window window,
+                      int x, int y,
+                      int width, int height,
+                      int thickness,
+                      unsigned long top_color,
+                      unsigned long bottom_color)
+{
+  XPoint points[4];
+  XGCValues gcv;
+  GC gc1, gc2;
+  if (thickness == 0) return;
+
+  gcv.foreground = top_color;
+  gc1 = XCreateGC (dpy, window, GCForeground, &gcv);
+  gcv.foreground = bottom_color;
+  gc2 = XCreateGC (dpy, window, GCForeground, &gcv);
+
+  points [0].x = x;
+  points [0].y = y;
+  points [1].x = x + width;
+  points [1].y = y;
+  points [2].x = x + width - thickness;
+  points [2].y = y + thickness;
+  points [3].x = x;
+  points [3].y = y + thickness;
+  XFillPolygon (dpy, window, gc1, points, 4, Convex, CoordModeOrigin);
+
+  points [0].x = x;
+  points [0].y = y + thickness;
+  points [1].x = x;
+  points [1].y = y + height;
+  points [2].x = x + thickness;
+  points [2].y = y + height - thickness;
+  points [3].x = x + thickness;
+  points [3].y = y + thickness;
+  XFillPolygon (dpy, window, gc1, points, 4, Convex, CoordModeOrigin);
+
+  points [0].x = x + width;
+  points [0].y = y;
+  points [1].x = x + width - thickness;
+  points [1].y = y + thickness;
+  points [2].x = x + width - thickness;
+  points [2].y = y + height - thickness;
+  points [3].x = x + width;
+  points [3].y = y + height - thickness;
+  XFillPolygon (dpy, window, gc2, points, 4, Convex, CoordModeOrigin);
+
+  points [0].x = x;
+  points [0].y = y + height;
+  points [1].x = x + width;
+  points [1].y = y + height;
+  points [2].x = x + width;
+  points [2].y = y + height - thickness;
+  points [3].x = x + thickness;
+  points [3].y = y + height - thickness;
+  XFillPolygon (dpy, window, gc2, points, 4, Convex, CoordModeOrigin);
+
+  XFreeGC (dpy, gc1);
+  XFreeGC (dpy, gc2);
+}
+
+
+int
+string_width (XFontStruct *font, char *s)
+{
+  int direction, ascent, descent;
+  XCharStruct overall;
+  XTextExtents (font, s, strlen(s), &direction, &ascent, &descent, &overall);
+  return overall.width;
+}
+
+
+static void update_splash_window (saver_info *si);
+static void draw_splash_window (saver_info *si);
+static void destroy_splash_window (saver_info *si);
+static void unsplash_timer (XtPointer closure, XtIntervalId *id);
+
+static void do_demo (saver_info *si);
+static void do_prefs (saver_info *si);
+static void do_help (saver_info *si);
+
+
+struct splash_dialog_data {
+  XtIntervalId timer;
+
+  Dimension width;
+  Dimension height;
+
+  char *heading_label;
+  char *body_label;
+  char *body2_label;
+  char *demo_label;
+  char *prefs_label;
+  char *help_label;
+
+  XFontStruct *heading_font;
+  XFontStruct *body_font;
+  XFontStruct *button_font;
+
+  Pixel foreground;
+  Pixel background;
+  Pixel button_foreground;
+  Pixel button_background;
+  Pixel logo_foreground;
+  Pixel logo_background;
+  Pixel shadow_top;
+  Pixel shadow_bottom;
+
+  Dimension logo_width;
+  Dimension logo_height;
+  Dimension internal_border;
+  Dimension shadow_width;
+
+  Dimension button_width, button_height;
+  Dimension demo_button_x, demo_button_y;
+  Dimension prefs_button_x, prefs_button_y;
+  Dimension help_button_x, help_button_y;
+
+  int pressed;
+};
+
+
+void
+make_splash_dialog (saver_info *si)
+{
+  int x, y, bw;
+  XSetWindowAttributes attrs;
+  unsigned long attrmask = 0;
+  splash_dialog_data *sp;
+  Screen *screen = si->default_screen->screen;
+  Colormap cmap = DefaultColormapOfScreen (screen);
+  char *f;
+
+  if (si->sp_data)
+    return;
+  if (si->prefs.splash_duration <= 0)
+    return;
+
+  sp = (splash_dialog_data *) calloc (1, sizeof(*sp));
+
+  sp->heading_label = get_string_resource ("splash.heading.label",
+                                          "Dialog.Label.Label");
+  sp->body_label = get_string_resource ("splash.body.label",
+                                       "Dialog.Label.Label");
+  sp->body2_label = get_string_resource ("splash.body2.label",
+                                        "Dialog.Label.Label");
+  sp->demo_label = get_string_resource ("splash.demo.label",
+                                       "Dialog.Button.Label");
+  sp->prefs_label = get_string_resource ("splash.prefs.label",
+                                       "Dialog.Button.Label");
+  sp->help_label = get_string_resource ("splash.help.label",
+                                       "Dialog.Button.Label");
+
+  if (!sp->heading_label)
+    sp->heading_label = strdup("ERROR: REESOURCES NOT INSTALLED CORRECTLY");
+  if (!sp->body_label)
+    sp->body_label = strdup("ERROR: REESOURCES NOT INSTALLED CORRECTLY");
+  if (!sp->body2_label)
+    sp->body2_label = strdup("ERROR: REESOURCES NOT INSTALLED CORRECTLY");
+  if (!sp->demo_label) sp->demo_label = strdup("ERROR");
+  if (!sp->prefs_label) sp->prefs_label = strdup("ERROR");
+  if (!sp->help_label) sp->help_label = strdup("ERROR");
+
+  /* Put the version number in the label. */
+  {
+    char *s = (char *) malloc (strlen(sp->heading_label) + 20);
+    sprintf(s, sp->heading_label, si->version);
+    free (sp->heading_label);
+    sp->heading_label = s;
+  }
+
+  f = get_string_resource ("splash.headingFont", "Dialog.Font");
+  sp->heading_font = XLoadQueryFont (si->dpy, (f ? f : "fixed"));
+  if (!sp->heading_font) sp->heading_font = XLoadQueryFont (si->dpy, "fixed");
+  if (f) free (f);
+
+  f = get_string_resource("splash.bodyFont", "Dialog.Font");
+  sp->body_font = XLoadQueryFont (si->dpy, (f ? f : "fixed"));
+  if (!sp->body_font) sp->body_font = XLoadQueryFont (si->dpy, "fixed");
+  if (f) free (f);
+
+  f = get_string_resource("splash.buttonFont", "Dialog.Font");
+  sp->button_font = XLoadQueryFont (si->dpy, (f ? f : "fixed"));
+  if (!sp->button_font) sp->button_font = XLoadQueryFont (si->dpy, "fixed");
+  if (f) free (f);
+
+  sp->foreground = get_pixel_resource ("splash.foreground",
+                                      "Dialog.Foreground",
+                                      si->dpy, cmap);
+  sp->background = get_pixel_resource ("splash.background",
+                                      "Dialog.Background",
+                                      si->dpy, cmap);
+
+  if (sp->foreground == sp->background)
+    {
+      /* Make sure the error messages show up. */
+      sp->foreground = BlackPixelOfScreen (screen);
+      sp->background = WhitePixelOfScreen (screen);
+    }
+
+  sp->button_foreground = get_pixel_resource ("splash.Button.foreground",
+                                             "Dialog.Button.Foreground",
+                                             si->dpy, cmap);
+  sp->button_background = get_pixel_resource ("splash.Button.background",
+                                             "Dialog.Button.Background",
+                                             si->dpy, cmap);
+  sp->logo_foreground = get_pixel_resource ("splash.logo.foreground",
+                                           "Dialog.Logo.Foreground",
+                                           si->dpy, cmap);
+  sp->logo_background = get_pixel_resource ("splash.logo.background",
+                                           "Dialog.Logo.Background",
+                                           si->dpy, cmap);
+  sp->shadow_top = get_pixel_resource ("splash.topShadowColor",
+                                      "Dialog.Foreground",
+                                      si->dpy, cmap);
+  sp->shadow_bottom = get_pixel_resource ("splash.bottomShadowColor",
+                                         "Dialog.Background",
+                                         si->dpy, cmap);
+
+  sp->logo_width = get_integer_resource ("splash.logo.width",
+                                        "Dialog.Logo.Width");
+  sp->logo_height = get_integer_resource ("splash.logo.height",
+                                         "Dialog.Logo.Height");
+  sp->internal_border = get_integer_resource ("splash.internalBorderWidth",
+                                             "Dialog.InternalBorderWidth");
+  sp->shadow_width = get_integer_resource ("splash.shadowThickness",
+                                          "Dialog.ShadowThickness");
+
+  if (sp->logo_width == 0)  sp->logo_width = 150;
+  if (sp->logo_height == 0) sp->logo_height = 150;
+  if (sp->internal_border == 0) sp->internal_border = 15;
+  if (sp->shadow_width == 0) sp->shadow_width = 4;
+
+  {
+    int direction, ascent, descent;
+    XCharStruct overall;
+
+    sp->width = 0;
+    sp->height = 0;
+
+    /* Measure the heading_label. */
+    XTextExtents (sp->heading_font,
+                 sp->heading_label, strlen(sp->heading_label),
+                 &direction, &ascent, &descent, &overall);
+    if (overall.width > sp->width) sp->width = overall.width;
+    sp->height += ascent + descent;
+
+    /* Measure the body_label. */
+    XTextExtents (sp->body_font,
+                 sp->body_label, strlen(sp->body_label),
+                 &direction, &ascent, &descent, &overall);
+    if (overall.width > sp->width) sp->width = overall.width;
+    sp->height += ascent + descent;
+
+    /* Measure the body2_label. */
+    XTextExtents (sp->body_font,
+                 sp->body2_label, strlen(sp->body2_label),
+                 &direction, &ascent, &descent, &overall);
+    if (overall.width > sp->width) sp->width = overall.width;
+    sp->height += ascent + descent;
+
+    {
+      Dimension w2 = 0, w3 = 0, w4 = 0;
+      Dimension h2 = 0, h3 = 0, h4 = 0;
+
+      /* Measure the Demo button. */
+      XTextExtents (sp->button_font,
+                   sp->demo_label, strlen(sp->demo_label),
+                   &direction, &ascent, &descent, &overall);
+      w2 = overall.width;
+      h2 = ascent + descent;
+
+      /* Measure the Prefs button. */
+      XTextExtents (sp->button_font,
+                   sp->prefs_label, strlen(sp->prefs_label),
+                   &direction, &ascent, &descent, &overall);
+      w3 = overall.width;
+      h3 = ascent + descent;
+
+      /* Measure the Help button. */
+      XTextExtents (sp->button_font,
+                   sp->help_label, strlen(sp->help_label),
+                   &direction, &ascent, &descent, &overall);
+      w4 = overall.width;
+      h4 = ascent + descent;
+
+      w2 = MAX(w2, w3); w2 = MAX(w2, w4);
+      h2 = MAX(h2, h3); h2 = MAX(h2, h4);
+
+      w2 += ((ascent + descent) / 2) + (sp->shadow_width * 2);
+      h2 += ((ascent + descent) / 2) + (sp->shadow_width * 2);
+
+      sp->button_width = w2;
+      sp->button_height = h2;
+
+      w2 *= 3;
+
+      w2 += ((ascent + descent) * 2);  /* for space between buttons */
+
+      if (w2 > sp->width) sp->width = w2;
+      sp->height += h2;
+    }
+
+    sp->width  += (sp->internal_border * 2);
+    sp->height += (sp->internal_border * 3);
+
+    if (sp->logo_height > sp->height)
+      sp->height = sp->logo_height;
+    else if (sp->height > sp->logo_height)
+      sp->logo_height = sp->height;
+
+    sp->logo_width = sp->logo_height;
+
+    sp->width += sp->logo_width;
+  }
+
+  attrmask |= CWOverrideRedirect; attrs.override_redirect = True;
+  attrmask |= CWEventMask;
+  attrs.event_mask = (ExposureMask | ButtonPressMask | ButtonReleaseMask);
+
+  {
+    int sx, sy, w, h;
+    get_screen_viewport (si->default_screen, &sx, &sy, &w, &h, False);
+    if (si->prefs.debug_p) w /= 2;
+    x = sx + (((w + sp->width)  / 2) - sp->width);
+    y = sy + (((h + sp->height) / 2) - sp->height);
+    if (x < sx) x = sx;
+    if (y < sy) y = sy;
+  }
+
+  bw = get_integer_resource ("splash.borderWidth", "Dialog.BorderWidth");
+
+  si->splash_dialog =
+    XCreateWindow (si->dpy,
+                  RootWindowOfScreen(screen),
+                  x, y, sp->width, sp->height, bw,
+                  DefaultDepthOfScreen (screen), InputOutput,
+                  DefaultVisualOfScreen(screen),
+                  attrmask, &attrs);
+  XSetWindowBackground (si->dpy, si->splash_dialog, sp->background);
+
+  XMapRaised (si->dpy, si->splash_dialog);
+  XSync (si->dpy, False);
+
+  si->sp_data = sp;
+
+  sp->timer = XtAppAddTimeOut (si->app, si->prefs.splash_duration,
+                              unsplash_timer, (XtPointer) si);
+
+  draw_splash_window (si);
+  XSync (si->dpy, False);
+}
+
+static void
+draw_splash_window (saver_info *si)
+{
+  splash_dialog_data *sp = si->sp_data;
+  XGCValues gcv;
+  GC gc1, gc2;
+  int hspacing, vspacing, height;
+  int x1, x2, x3, y1, y2;
+  int sw;
+
+  height = (sp->heading_font->ascent + sp->heading_font->descent +
+           sp->body_font->ascent + sp->body_font->descent +
+           sp->body_font->ascent + sp->body_font->descent +
+           sp->button_font->ascent + sp->button_font->descent);
+  vspacing = ((sp->height
+              - (4 * sp->shadow_width)
+              - (2 * sp->internal_border)
+              - height) / 5);
+  if (vspacing < 0) vspacing = 0;
+  if (vspacing > (sp->heading_font->ascent * 2))
+    vspacing = (sp->heading_font->ascent * 2);
+           
+  gcv.foreground = sp->foreground;
+  gc1 = XCreateGC (si->dpy, si->splash_dialog, GCForeground, &gcv);
+  gc2 = XCreateGC (si->dpy, si->splash_dialog, GCForeground, &gcv);
+  x1 = sp->logo_width;
+  x3 = sp->width - (sp->shadow_width * 2);
+  y1 = sp->internal_border;
+
+  /* top heading
+   */
+  XSetFont (si->dpy, gc1, sp->heading_font->fid);
+  sw = string_width (sp->heading_font, sp->heading_label);
+  x2 = (x1 + ((x3 - x1 - sw) / 2));
+  y1 += sp->heading_font->ascent;
+  XDrawString (si->dpy, si->splash_dialog, gc1, x2, y1,
+              sp->heading_label, strlen(sp->heading_label));
+  y1 += sp->heading_font->descent;
+
+  /* text below top heading
+   */
+  XSetFont (si->dpy, gc1, sp->body_font->fid);
+  y1 += vspacing + sp->body_font->ascent;
+  sw = string_width (sp->body_font, sp->body_label);
+  x2 = (x1 + ((x3 - x1 - sw) / 2));
+  XDrawString (si->dpy, si->splash_dialog, gc1, x2, y1,
+              sp->body_label, strlen(sp->body_label));
+  y1 += sp->body_font->descent;
+
+  y1 += sp->body_font->ascent;
+  sw = string_width (sp->body_font, sp->body2_label);
+  x2 = (x1 + ((x3 - x1 - sw) / 2));
+  XDrawString (si->dpy, si->splash_dialog, gc1, x2, y1,
+              sp->body2_label, strlen(sp->body2_label));
+  y1 += sp->body_font->descent;
+
+  /* The buttons
+   */
+  XSetForeground (si->dpy, gc1, sp->button_foreground);
+  XSetForeground (si->dpy, gc2, sp->button_background);
+
+/*  y1 += (vspacing * 2);*/
+  y1 = sp->height - sp->internal_border - sp->button_height;
+
+  x1 += sp->internal_border;
+  y2 = (y1 + ((sp->button_height -
+              (sp->button_font->ascent + sp->button_font->descent))
+             / 2)
+       + sp->button_font->ascent);
+  hspacing = ((sp->width - x1 - (sp->shadow_width * 2) -
+              sp->internal_border - (sp->button_width * 3))
+             / 2);
+
+  x2 = x1 + ((sp->button_width - string_width(sp->button_font, sp->demo_label))
+            / 2);
+  XFillRectangle (si->dpy, si->splash_dialog, gc2, x1, y1,
+                 sp->button_width, sp->button_height);
+  XDrawString (si->dpy, si->splash_dialog, gc1, x2, y2,
+              sp->demo_label, strlen(sp->demo_label));
+  sp->demo_button_x = x1;
+  sp->demo_button_y = y1;
+  
+  x1 += hspacing + sp->button_width;
+  x2 = x1 + ((sp->button_width - string_width(sp->button_font,sp->prefs_label))
+            / 2);
+  XFillRectangle (si->dpy, si->splash_dialog, gc2, x1, y1,
+                 sp->button_width, sp->button_height);
+  XDrawString (si->dpy, si->splash_dialog, gc1, x2, y2,
+              sp->prefs_label, strlen(sp->prefs_label));
+  sp->prefs_button_x = x1;
+  sp->prefs_button_y = y1;
+
+  x1 += hspacing + sp->button_width;
+  x2 = x1 + ((sp->button_width - string_width(sp->button_font,sp->help_label))
+            / 2);
+  XFillRectangle (si->dpy, si->splash_dialog, gc2, x1, y1,
+                 sp->button_width, sp->button_height);
+  XDrawString (si->dpy, si->splash_dialog, gc1, x2, y2,
+              sp->help_label, strlen(sp->help_label));
+  sp->help_button_x = x1;
+  sp->help_button_y = y1;
+
+
+  /* the logo
+   */
+  XSetForeground (si->dpy, gc1, sp->logo_foreground);
+  XSetForeground (si->dpy, gc2, sp->logo_background);
+
+  x1 = sp->shadow_width * 3;
+  y1 = sp->shadow_width * 3;
+  x2 = sp->logo_width - (sp->shadow_width * 6);
+  y2 = sp->logo_height - (sp->shadow_width * 6);
+
+  XFillRectangle (si->dpy, si->splash_dialog, gc2, x1, y1, x2, y2);
+  skull (si->dpy, si->splash_dialog, gc1, gc2,
+        x1 + sp->shadow_width, y1 + sp->shadow_width,
+        x2 - (sp->shadow_width * 2), y2 - (sp->shadow_width * 2));
+
+
+  /* The shadow around the logo
+   */
+  draw_shaded_rectangle (si->dpy, si->splash_dialog,
+                        sp->shadow_width * 2,
+                        sp->shadow_width * 2,
+                        sp->logo_width - (sp->shadow_width * 4),
+                        sp->logo_height - (sp->shadow_width * 4),
+                        sp->shadow_width,
+                        sp->shadow_bottom, sp->shadow_top);
+
+  /* The shadow around the whole window
+   */
+  draw_shaded_rectangle (si->dpy, si->splash_dialog,
+                        0, 0, sp->width, sp->height, sp->shadow_width,
+                        sp->shadow_top, sp->shadow_bottom);
+
+  XFreeGC (si->dpy, gc1);
+  XFreeGC (si->dpy, gc2);
+
+  update_splash_window (si);
+}
+
+
+static void
+update_splash_window (saver_info *si)
+{
+  splash_dialog_data *sp = si->sp_data;
+  int pressed;
+  if (!sp) return;
+  pressed = sp->pressed;
+
+  /* The shadows around the buttons
+   */
+  draw_shaded_rectangle (si->dpy, si->splash_dialog,
+                        sp->demo_button_x, sp->demo_button_y,
+                        sp->button_width, sp->button_height, sp->shadow_width,
+                        (pressed == 1 ? sp->shadow_bottom : sp->shadow_top),
+                        (pressed == 1 ? sp->shadow_top : sp->shadow_bottom));
+  draw_shaded_rectangle (si->dpy, si->splash_dialog,
+                        sp->prefs_button_x, sp->prefs_button_y,
+                        sp->button_width, sp->button_height, sp->shadow_width,
+                        (pressed == 2 ? sp->shadow_bottom : sp->shadow_top),
+                        (pressed == 2 ? sp->shadow_top : sp->shadow_bottom));
+  draw_shaded_rectangle (si->dpy, si->splash_dialog,
+                        sp->help_button_x, sp->help_button_y,
+                        sp->button_width, sp->button_height, sp->shadow_width,
+                        (pressed == 3 ? sp->shadow_bottom : sp->shadow_top),
+                        (pressed == 3 ? sp->shadow_top : sp->shadow_bottom));
+}
+
+static void
+destroy_splash_window (saver_info *si)
+{
+  splash_dialog_data *sp = si->sp_data;
+  Screen *screen = si->default_screen->screen;
+  Colormap cmap = DefaultColormapOfScreen (screen);
+  Pixel black = BlackPixelOfScreen (screen);
+  Pixel white = WhitePixelOfScreen (screen);
+
+  if (sp->timer)
+    XtRemoveTimeOut (sp->timer);
+
+  if (si->splash_dialog)
+    {
+      XDestroyWindow (si->dpy, si->splash_dialog);
+      si->splash_dialog = 0;
+    }
+  
+  if (sp->heading_label) free (sp->heading_label);
+  if (sp->body_label)    free (sp->body_label);
+  if (sp->demo_label)    free (sp->demo_label);
+  if (sp->prefs_label)   free (sp->prefs_label);
+  if (sp->help_label)    free (sp->help_label);
+
+  if (sp->heading_font) XFreeFont (si->dpy, sp->heading_font);
+  if (sp->body_font)    XFreeFont (si->dpy, sp->body_font);
+  if (sp->button_font)  XFreeFont (si->dpy, sp->button_font);
+
+  if (sp->foreground != black && sp->foreground != white)
+    XFreeColors (si->dpy, cmap, &sp->foreground, 1, 0L);
+  if (sp->background != black && sp->background != white)
+    XFreeColors (si->dpy, cmap, &sp->background, 1, 0L);
+  if (sp->button_foreground != black && sp->button_foreground != white)
+    XFreeColors (si->dpy, cmap, &sp->button_foreground, 1, 0L);
+  if (sp->button_background != black && sp->button_background != white)
+    XFreeColors (si->dpy, cmap, &sp->button_background, 1, 0L);
+  if (sp->logo_foreground != black && sp->logo_foreground != white)
+    XFreeColors (si->dpy, cmap, &sp->logo_foreground, 1, 0L);
+  if (sp->logo_background != black && sp->logo_background != white)
+    XFreeColors (si->dpy, cmap, &sp->logo_background, 1, 0L);
+  if (sp->shadow_top != black && sp->shadow_top != white)
+    XFreeColors (si->dpy, cmap, &sp->shadow_top, 1, 0L);
+  if (sp->shadow_bottom != black && sp->shadow_bottom != white)
+    XFreeColors (si->dpy, cmap, &sp->shadow_bottom, 1, 0L);
+
+  memset (sp, 0, sizeof(*sp));
+  free (sp);
+
+  si->sp_data = 0;
+}
+
+void
+handle_splash_event (saver_info *si, XEvent *event)
+{
+  splash_dialog_data *sp = si->sp_data;
+  int which = 0;
+  if (!sp) return;
+
+  switch (event->xany.type)
+    {
+    case Expose:
+      draw_splash_window (si);
+      break;
+
+    case ButtonPress: case ButtonRelease:
+
+      if (event->xbutton.x >= sp->demo_button_x &&
+         event->xbutton.x < sp->demo_button_x + sp->button_width &&
+         event->xbutton.y >= sp->demo_button_y &&
+         event->xbutton.y < sp->demo_button_y + sp->button_height)
+       which = 1;
+
+      else if (event->xbutton.x >= sp->prefs_button_x &&
+              event->xbutton.x < sp->prefs_button_x + sp->button_width &&
+              event->xbutton.y >= sp->prefs_button_y &&
+              event->xbutton.y < sp->prefs_button_y + sp->button_height)
+       which = 2;
+
+      else if (event->xbutton.x >= sp->help_button_x &&
+              event->xbutton.x < sp->help_button_x + sp->button_width &&
+              event->xbutton.y >= sp->help_button_y &&
+              event->xbutton.y < sp->help_button_y + sp->button_height)
+       which = 3;
+
+      if (event->xany.type == ButtonPress)
+       {
+         sp->pressed = which;
+         update_splash_window (si);
+         if (which == 0)
+           XBell (si->dpy, False);
+       }
+      else if (event->xany.type == ButtonRelease)
+       {
+         if (which && sp->pressed == which)
+           {
+             destroy_splash_window (si);
+             switch (which)
+               {
+               case 1: do_demo (si); break;
+               case 2: do_prefs (si); break;
+               case 3: do_help (si); break;
+               default: abort();
+               }
+           }
+         sp->pressed = 0;
+         update_splash_window (si);
+       }
+      break;
+
+    default:
+      break;
+    }
+}
+
+static void
+unsplash_timer (XtPointer closure, XtIntervalId *id)
+{
+  saver_info *si = (saver_info *) closure;
+  if (si && si->sp_data)
+    destroy_splash_window (si);
+}
+
+\f
+/* Button callbacks */
+
+#ifdef VMS
+# define pid_t int
+# define fork  vfork
+#endif /* VMS */
+
+static void
+fork_and_exec (saver_info *si, const char *command, const char *desc)
+{
+  saver_preferences *p = &si->prefs;
+  pid_t forked;
+  char buf [512];
+  char *av[5];
+  int ac;
+
+  if (!command || !*command)
+    {
+      fprintf (stderr, "%s: no %s command has been specified.\n",
+              blurb(), desc);
+      return;
+    }
+
+  switch ((int) (forked = fork ()))
+    {
+    case -1:
+      sprintf (buf, "%s: couldn't fork", blurb());
+      perror (buf);
+      break;
+
+    case 0:
+      close (ConnectionNumber (si->dpy));              /* close display fd */
+      hack_subproc_environment (si->default_screen);   /* set $DISPLAY */
+      ac = 0;
+      av [ac++] = (char *) p->shell;
+      av [ac++] = (char *) "-c";
+      av [ac++] = (char *) command;
+      av [ac]   = 0;
+      execvp (av[0], av);                              /* shouldn't return. */
+
+      sprintf (buf, "%s: execvp(\"%s\", \"%s\", \"%s\") failed",
+              blurb(), av[0], av[1], av[2]);
+      perror (buf);
+      fflush (stderr);
+      fflush (stdout);
+      exit (1);                         /* Note that this only exits a child fork.  */
+      break;
+
+    default:
+      /* parent fork. */
+      break;
+    }
+}
+
+
+static void
+do_demo (saver_info *si)
+{
+  saver_preferences *p = &si->prefs;
+  fork_and_exec (si, p->demo_command, "demo-mode");
+}
+
+static void
+do_prefs (saver_info *si)
+{
+  saver_preferences *p = &si->prefs;
+  fork_and_exec (si, p->prefs_command, "preferences");
+}
+
+static void
+do_help (saver_info *si)
+{
+  saver_preferences *p = &si->prefs;
+  char *help_command;
+
+  if (!p->help_url || !*p->help_url)
+    {
+      fprintf (stderr, "%s: no Help URL has been specified.\n", blurb());
+      return;
+    }
+
+  help_command = (char *) malloc (strlen (p->load_url_command) +
+                                 (strlen (p->help_url) * 2) + 10);
+  sprintf (help_command, p->load_url_command, p->help_url, p->help_url);
+  fork_and_exec (si, help_command, "URL-loading");
+  free (help_command);
+}
diff --git a/driver/stderr.c b/driver/stderr.c
new file mode 100644 (file)
index 0000000..fafb1e5
--- /dev/null
@@ -0,0 +1,444 @@
+/* stderr.c --- capturing stdout/stderr output onto the screensaver window.
+ * xscreensaver, Copyright (c) 1991-1998 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software 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.  No representations are made about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or 
+ * implied warranty.
+ */
+
+/* stderr hackery - Why Unix Sucks, reason number 32767.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <stdlib.h>
+
+#include <stdio.h>
+#include <time.h>
+
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+
+#ifdef HAVE_FCNTL
+# include <fcntl.h>
+#endif
+
+#include <X11/Intrinsic.h>
+
+#include "xscreensaver.h"
+#include "resources.h"
+#include "visual.h"
+
+FILE *real_stderr = 0;
+FILE *real_stdout = 0;
+
+
+/* It's ok for these to be global, since they refer to the one and only
+   stderr stream, not to a particular screen or window or visual.
+ */
+static char stderr_buffer [4096];
+static char *stderr_tail = 0;
+static time_t stderr_last_read = 0;
+
+static void make_stderr_overlay_window (saver_screen_info *);
+
+
+void
+reset_stderr (saver_screen_info *ssi)
+{
+  saver_info *si = ssi->global;
+
+  if (si->prefs.debug_p)
+    fprintf ((real_stderr ? real_stderr : stderr),
+            "%s: resetting stderr\n", blurb());
+
+  ssi->stderr_text_x = 0;
+  ssi->stderr_text_y = 0;
+
+  if (ssi->stderr_gc)
+    XFreeGC (si->dpy, ssi->stderr_gc);
+  ssi->stderr_gc = 0;
+
+  if (ssi->stderr_overlay_window)
+    XDestroyWindow(si->dpy, ssi->stderr_overlay_window);
+  ssi->stderr_overlay_window = 0;
+
+  if (ssi->stderr_cmap)
+    XFreeColormap(si->dpy, ssi->stderr_cmap);
+  ssi->stderr_cmap = 0;
+}
+
+void
+clear_stderr (saver_screen_info *ssi)
+{
+  saver_info *si = ssi->global;
+  ssi->stderr_text_x = 0;
+  ssi->stderr_text_y = 0;
+  if (ssi->stderr_overlay_window)
+    XClearWindow (si->dpy, ssi->stderr_overlay_window);
+}
+
+
+static void
+print_stderr_1 (saver_screen_info *ssi, char *string)
+{
+  saver_info *si = ssi->global;
+  Display *dpy = si->dpy;
+  Screen *screen = ssi->screen;
+  Window window = (ssi->stderr_overlay_window ?
+                  ssi->stderr_overlay_window :
+                  ssi->screensaver_window);
+  int h_border = 20;
+  int v_border = 20;
+  char *head = string;
+  char *tail;
+
+  if (! ssi->stderr_font)
+    {
+      char *font_name = get_string_resource ("font", "Font");
+      if (!font_name) font_name = "fixed";
+      ssi->stderr_font = XLoadQueryFont (dpy, font_name);
+      if (! ssi->stderr_font) ssi->stderr_font = XLoadQueryFont (dpy, "fixed");
+      ssi->stderr_line_height = (ssi->stderr_font->ascent +
+                                ssi->stderr_font->descent);
+    }
+
+  if (! ssi->stderr_gc)
+    {
+      XGCValues gcv;
+      Pixel fg, bg;
+      Colormap cmap = ssi->cmap;
+
+      if (!ssi->stderr_overlay_window &&
+         get_boolean_resource("overlayStderr", "Boolean"))
+       {
+         make_stderr_overlay_window (ssi);
+         if (ssi->stderr_overlay_window)
+           window = ssi->stderr_overlay_window;
+         if (ssi->stderr_cmap)
+           cmap = ssi->stderr_cmap;
+       }
+
+      fg = get_pixel_resource ("overlayTextForeground","Foreground",dpy,cmap);
+      bg = get_pixel_resource ("overlayTextBackground","Background",dpy,cmap);
+      gcv.font = ssi->stderr_font->fid;
+      gcv.foreground = fg;
+      gcv.background = bg;
+      ssi->stderr_gc = XCreateGC (dpy, window,
+                                 (GCFont | GCForeground | GCBackground),
+                                 &gcv);
+    }
+
+
+  if (ssi->stderr_cmap)
+    XInstallColormap(si->dpy, ssi->stderr_cmap);
+
+  for (tail = string; *tail; tail++)
+    {
+      if (*tail == '\n' || *tail == '\r')
+       {
+         int maxy = HeightOfScreen (screen) - v_border - v_border;
+         if (tail != head)
+           XDrawImageString (dpy, window, ssi->stderr_gc,
+                             ssi->stderr_text_x + h_border,
+                             ssi->stderr_text_y + v_border +
+                             ssi->stderr_font->ascent,
+                             head, tail - head);
+         ssi->stderr_text_x = 0;
+         ssi->stderr_text_y += ssi->stderr_line_height;
+         head = tail + 1;
+         if (*tail == '\r' && *head == '\n')
+           head++, tail++;
+
+         if (ssi->stderr_text_y > maxy - ssi->stderr_line_height)
+           {
+#if 0
+             ssi->stderr_text_y = 0;
+#else
+             int offset = ssi->stderr_line_height * 5;
+              XWindowAttributes xgwa;
+              XGetWindowAttributes (dpy, window, &xgwa);
+
+             XCopyArea (dpy, window, window, ssi->stderr_gc,
+                        0, v_border + offset,
+                        xgwa.width,
+                        (xgwa.height - v_border - v_border - offset),
+                        0, v_border);
+             XClearArea (dpy, window,
+                         0, xgwa.height - v_border - offset,
+                         xgwa.width, offset, False);
+             ssi->stderr_text_y -= offset;
+#endif
+           }
+       }
+    }
+  if (tail != head)
+    {
+      int direction, ascent, descent;
+      XCharStruct overall;
+      XDrawImageString (dpy, window, ssi->stderr_gc,
+                       ssi->stderr_text_x + h_border,
+                       ssi->stderr_text_y + v_border
+                         + ssi->stderr_font->ascent,
+                       head, tail - head);
+      XTextExtents (ssi->stderr_font, tail, tail - head,
+                   &direction, &ascent, &descent, &overall);
+      ssi->stderr_text_x += overall.width;
+    }
+}
+
+static void
+make_stderr_overlay_window (saver_screen_info *ssi)
+{
+  saver_info *si = ssi->global;
+  unsigned long transparent_pixel = 0;
+  Visual *visual = get_overlay_visual (ssi->screen, &transparent_pixel);
+  if (visual)
+    {
+      int depth = visual_depth (ssi->screen, visual);
+      XSetWindowAttributes attrs;
+      XWindowAttributes xgwa;
+      unsigned long attrmask;
+      XGetWindowAttributes (si->dpy, ssi->screensaver_window, &xgwa);
+
+      if (si->prefs.debug_p)
+       fprintf(real_stderr,
+               "%s: using overlay visual 0x%0x for stderr text layer.\n",
+               blurb(), (int) XVisualIDFromVisual (visual));
+
+      ssi->stderr_cmap = XCreateColormap(si->dpy,
+                                        RootWindowOfScreen(ssi->screen),
+                                        visual, AllocNone);
+
+      attrmask = (CWColormap | CWBackPixel | CWBackingPixel | CWBorderPixel |
+                 CWBackingStore | CWSaveUnder);
+      attrs.colormap = ssi->stderr_cmap;
+      attrs.background_pixel = transparent_pixel;
+      attrs.backing_pixel = transparent_pixel;
+      attrs.border_pixel = transparent_pixel;
+      attrs.backing_store = NotUseful;
+      attrs.save_under = False;
+
+      ssi->stderr_overlay_window =
+       XCreateWindow(si->dpy, ssi->screensaver_window, 0, 0,
+                     xgwa.width, xgwa.height,
+                     0, depth, InputOutput, visual, attrmask, &attrs);
+      XMapRaised(si->dpy, ssi->stderr_overlay_window);
+    }
+}
+
+
+static void
+print_stderr (saver_info *si, char *string)
+{
+  saver_preferences *p = &si->prefs;
+  int i;
+
+  /* In verbose mode, copy it to stderr as well. */
+  if (p->verbose_p)
+    fprintf (real_stderr, "%s", string);
+
+  for (i = 0; i < si->nscreens; i++)
+    print_stderr_1 (&si->screens[i], string);
+}
+
+
+static void
+stderr_popup_timer_fn (XtPointer closure, XtIntervalId *id)
+{
+  saver_info *si = (saver_info *) closure;
+  char *s = stderr_buffer;
+  if (*s)
+    {
+      /* If too much data was printed, then something has gone haywire,
+        so truncate it. */
+      char *trailer = "\n\n<< stderr diagnostics have been truncated >>\n\n";
+      int max = sizeof (stderr_buffer) - strlen (trailer) - 5;
+      if (strlen (s) > max)
+       strcpy (s + max, trailer);
+      /* Now show the user. */
+      print_stderr (si, s);
+    }
+
+  stderr_tail = stderr_buffer;
+  si->stderr_popup_timer = 0;
+}
+
+
+static void
+stderr_callback (XtPointer closure, int *fd, XtIntervalId *id)
+{
+  saver_info *si = (saver_info *) closure;
+  char *s;
+  int left;
+  int size;
+  int read_this_time = 0;
+
+  if (stderr_tail == 0)
+    stderr_tail = stderr_buffer;
+
+  left = ((sizeof (stderr_buffer) - 2) - (stderr_tail - stderr_buffer));
+
+  s = stderr_tail;
+  *s = 0;
+
+  /* Read as much data from the fd as we can, up to our buffer size. */
+  if (left > 0)
+    {
+      while ((size = read (*fd, (void *) s, left)) > 0)
+       {
+         left -= size;
+         s += size;
+         read_this_time += size;
+       }
+      *s = 0;
+    }
+  else
+    {
+      char buf2 [1024];
+      /* The buffer is full; flush the rest of it. */
+      while (read (*fd, (void *) buf2, sizeof (buf2)) > 0)
+       ;
+    }
+
+  stderr_tail = s;
+  stderr_last_read = time ((time_t *) 0);
+
+  /* Now we have read some data that we would like to put up in a dialog
+     box.  But more data may still be coming in - so don't pop up the
+     dialog right now, but instead, start a timer that will pop it up
+     a second from now.  Should more data come in in the meantime, we
+     will be called again, and will reset that timer again.  So the
+     dialog will only pop up when a second has elapsed with no new data
+     being written to stderr.
+
+     However, if the buffer is full (meaning lots of data has been written)
+     then we don't reset the timer.
+   */
+  if (read_this_time > 0)
+    {
+      if (si->stderr_popup_timer)
+       XtRemoveTimeOut (si->stderr_popup_timer);
+
+      si->stderr_popup_timer =
+       XtAppAddTimeOut (si->app, 1 * 1000, stderr_popup_timer_fn,
+                        (XtPointer) si);
+    }
+}
+
+void
+initialize_stderr (saver_info *si)
+{
+  static Boolean done = False;
+  int fds [2];
+  int in, out;
+  int new_stdout, new_stderr;
+  int stdout_fd = 1;
+  int stderr_fd = 2;
+  int flags = 0;
+  Boolean stderr_dialog_p;
+
+  if (done) return;
+  done = True;
+
+  real_stderr = stderr;
+  real_stdout = stdout;
+
+  stderr_dialog_p = get_boolean_resource ("captureStderr", "Boolean");
+
+  if (!stderr_dialog_p)
+    return;
+
+  if (pipe (fds))
+    {
+      perror ("error creating pipe:");
+      return;
+    }
+
+  in = fds [0];
+  out = fds [1];
+
+# ifdef HAVE_FCNTL
+
+#  if defined(O_NONBLOCK)
+   flags = O_NONBLOCK;
+#  elif defined(O_NDELAY)
+   flags = O_NDELAY;
+#  else
+   ERROR!! neither O_NONBLOCK nor O_NDELAY are defined.
+#  endif
+
+    /* Set both sides of the pipe to nonblocking - this is so that
+       our reads (in stderr_callback) will terminate, and so that
+       out writes (in the client programs) will silently fail when
+       the pipe is full, instead of hosing the program. */
+  if (fcntl (in, F_SETFL, flags) != 0)
+    {
+      perror ("fcntl:");
+      return;
+    }
+  if (fcntl (out, F_SETFL, flags) != 0)
+    {
+      perror ("fcntl:");
+      return;
+    }
+
+# endif /* !HAVE_FCNTL */
+
+  if (stderr_dialog_p)
+    {
+      FILE *new_stderr_file;
+      FILE *new_stdout_file;
+
+      new_stderr = dup (stderr_fd);
+      if (new_stderr < 0)
+       {
+         perror ("could not dup() a stderr:");
+         return;
+       }
+      if (! (new_stderr_file = fdopen (new_stderr, "w")))
+       {
+         perror ("could not fdopen() the new stderr:");
+         return;
+       }
+      real_stderr = new_stderr_file;
+
+      close (stderr_fd);
+      if (dup2 (out, stderr_fd) < 0)
+       {
+         perror ("could not dup() a new stderr:");
+         return;
+       }
+
+
+      new_stdout = dup (stdout_fd);
+      if (new_stdout < 0)
+       {
+         perror ("could not dup() a stdout:");
+         return;
+       }
+      if (! (new_stdout_file = fdopen (new_stdout, "w")))
+       {
+         perror ("could not fdopen() the new stdout:");
+         return;
+       }
+      real_stdout = new_stdout_file;
+
+      close (stdout_fd);
+      if (dup2 (out, stdout_fd) < 0)
+       {
+         perror ("could not dup() a new stdout:");
+         return;
+       }
+    }
+
+  XtAppAddInput (si->app, in, (XtPointer) XtInputReadMask, stderr_callback,
+                (XtPointer) si);
+}
diff --git a/driver/subprocs.c b/driver/subprocs.c
new file mode 100644 (file)
index 0000000..fcfdf89
--- /dev/null
@@ -0,0 +1,1141 @@
+/* subprocs.c --- choosing, spawning, and killing screenhacks.
+ * xscreensaver, Copyright (c) 1991, 1992, 1993, 1995, 1997, 1998
+ *  Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software 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.  No representations are made about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or 
+ * implied warranty.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <ctype.h>
+#include <stdio.h>
+#include <string.h>
+
+#include <X11/Xlib.h>          /* not used for much... */
+
+#ifndef ESRCH
+# include <errno.h>
+#endif
+
+#include <sys/time.h>          /* sys/resource.h needs this for timeval */
+
+#ifdef HAVE_SYS_WAIT_H
+# include <sys/wait.h>         /* for waitpid() and associated macros */
+#endif
+
+#if defined(HAVE_SETPRIORITY) && defined(PRIO_PROCESS)
+# include <sys/resource.h>     /* for setpriority() and PRIO_PROCESS */
+#endif
+
+#ifdef VMS
+# include <processes.h>
+# include <unixio.h>           /* for close */
+# include <unixlib.h>          /* for getpid */
+# define pid_t int
+# define fork  vfork
+#endif /* VMS */
+
+#include <signal.h>            /* for the signal names */
+
+#if !defined(SIGCHLD) && defined(SIGCLD)
+# define SIGCHLD SIGCLD
+#endif
+
+#if 0 /* putenv() is declared in stdlib.h on modern linux systems. */
+#ifdef HAVE_PUTENV
+extern int putenv (/* const char * */);        /* getenv() is in stdlib.h... */
+#endif
+#endif
+
+extern int kill (pid_t, int);          /* signal() is in sys/signal.h... */
+
+/* This file doesn't need the Xt headers, so stub these types out... */
+#undef XtPointer
+#define XtAppContext void*
+#define XrmDatabase  void*
+#define XtIntervalId void*
+#define XtPointer    void*
+#define Widget       void*
+
+#include "xscreensaver.h"
+#include "yarandom.h"
+
+
+extern saver_info *global_si_kludge;   /* I hate C so much... */
+
+static void
+nice_subproc (int nice_level)
+{
+  if (nice_level == 0)
+    return;
+
+#if defined(HAVE_NICE)
+  {
+    int old_nice = nice (0);
+    int n = nice_level - old_nice;
+    errno = 0;
+    if (nice (n) == -1 && errno != 0)
+      {
+       char buf [512];
+       sprintf (buf, "%s: nice(%d) failed", blurb(), n);
+       perror (buf);
+    }
+  }
+#elif defined(HAVE_SETPRIORITY) && defined(PRIO_PROCESS)
+  if (setpriority (PRIO_PROCESS, getpid(), nice_level) != 0)
+    {
+      char buf [512];
+      sprintf (buf, "%s: setpriority(PRIO_PROCESS, %lu, %d) failed",
+              blurb(), (unsigned long) getpid(), nice_level);
+      perror (buf);
+    }
+#else
+  fprintf (stderr,
+          "%s: don't know how to change process priority on this system.\n",
+          blurb());
+
+#endif
+}
+
+
+#ifndef VMS
+
+static void
+exec_simple_command (const char *command)
+{
+  char *av[1024];
+  int ac = 0;
+  char *token = strtok (strdup(command), " \t");
+  while (token)
+    {
+      av[ac++] = token;
+      token = strtok(0, " \t");
+    }
+  av[ac] = 0;
+
+  execvp (av[0], av);                  /* shouldn't return. */
+
+  {
+    char buf [512];
+    sprintf (buf, "%s: could not execute \"%s\"", blurb(), av[0]);
+    perror (buf);
+
+    if (errno == ENOENT &&
+       (token = getenv("PATH")))
+      {
+# ifndef PATH_MAX
+#  ifdef MAXPATHLEN
+#   define PATH_MAX MAXPATHLEN
+#  else
+#   define PATH_MAX 2048
+#  endif
+# endif
+       char path[PATH_MAX];
+       fprintf (stderr, "\n");
+       *path = 0;
+# if defined(HAVE_GETCWD)
+       getcwd (path, sizeof(path));
+# elif defined(HAVE_GETWD)
+       getwd (path);
+# endif
+       if (*path)
+         fprintf (stderr, "    Current directory is: %s\n", path);
+       fprintf (stderr, "    PATH is:\n");
+       token = strtok (strdup(token), ":");
+       while (token)
+         {
+           fprintf (stderr, "        %s\n", token);
+           token = strtok(0, ":");
+         }
+       fprintf (stderr, "\n");
+      }
+  }
+  fflush(stderr);
+  fflush(stdout);
+  exit (1);    /* Note that this only exits a child fork.  */
+}
+
+
+static void
+exec_complex_command (const char *shell, const char *command)
+{
+  char *av[5];
+  int ac = 0;
+  char *command2 = (char *) malloc (strlen (command) + 10);
+  const char *s;
+  int got_eq = 0;
+  const char *after_vars;
+
+  /* Skip leading whitespace.
+   */
+  while (*command == ' ' || *command == '\t')
+    command++;
+
+  /* If the string has a series of tokens with "=" in them at them, set
+     `after_vars' to point into the string after those tokens and any
+     trailing whitespace.  Otherwise, after_vars == command.
+   */
+  after_vars = command;
+  for (s = command; *s; s++)
+    {
+      if (*s == '=') got_eq = 1;
+      else if (*s == ' ')
+        {
+          if (got_eq)
+            {
+              while (*s == ' ' || *s == '\t')
+                s++;
+              after_vars = s;
+              got_eq = 0;
+            }
+          else
+            break;
+        }
+    }
+
+  *command2 = 0;
+  strncat (command2, command, after_vars - command);
+  strcat (command2, "exec ");
+  strcat (command2, after_vars);
+
+  /* We have now done these transformations:
+     "foo -x -y"               ==>  "exec foo -x -y"
+     "BLAT=foop      foo -x"   ==>  "BLAT=foop      exec foo -x"
+     "BLAT=foop A=b  foo -x"   ==>  "BLAT=foop A=b  exec foo -x"
+   */
+
+
+  /* Invoke the shell as "/bin/sh -c 'exec prog -arg -arg ...'" */
+  av [ac++] = (char *) shell;
+  av [ac++] = "-c";
+  av [ac++] = command2;
+  av [ac]   = 0;
+
+  execvp (av[0], av);                  /* shouldn't return. */
+
+  {
+    char buf [512];
+    sprintf (buf, "%s: execvp(\"%s\") failed", blurb(), av[0]);
+    perror (buf);
+    fflush(stderr);
+    fflush(stdout);
+    exit (1);  /* Note that this only exits a child fork.  */
+  }
+}
+
+#else  /* VMS */
+
+static void
+exec_vms_command (const char *command)
+{
+  system (command);
+  fflush (stderr);
+  fflush (stdout);
+  exit (1);    /* Note that this only exits a child fork.  */
+}
+
+#endif /* !VMS */
+
+
+static void
+exec_screenhack (saver_info *si, const char *command)
+{
+  /* I don't believe what a sorry excuse for an operating system UNIX is!
+
+     - I want to spawn a process.
+     - I want to know it's pid so that I can kill it.
+     - I would like to receive a message when it dies of natural causes.
+     - I want the spawned process to have user-specified arguments.
+
+     If shell metacharacters are present (wildcards, backquotes, etc), the
+     only way to parse those arguments is to run a shell to do the parsing
+     for you.
+
+     And the only way to know the pid of the process is to fork() and exec()
+     it in the spawned side of the fork.
+
+     But if you're running a shell to parse your arguments, this gives you
+     the pid of the *shell*, not the pid of the *process* that you're
+     actually interested in, which is an *inferior* of the shell.  This also
+     means that the SIGCHLD you get applies to the shell, not its inferior.
+     (Why isn't that sufficient?  I don't remember any more, but it turns
+     out that it isn't.)
+
+     So, the only solution, when metacharacters are present, is to force the
+     shell to exec() its inferior.  What a fucking hack!  We prepend "exec "
+     to the command string, and hope it doesn't contain unquoted semicolons
+     or ampersands (we don't search for them, because we don't want to
+     prohibit their use in quoted strings (messages, for example) and parsing
+     out the various quote characters is too much of a pain.)
+
+     (Actually, Clint Wong <clint@jts.com> points out that process groups
+     might be used to take care of this problem; this may be worth considering
+     some day, except that, 1: this code works now, so why fix it, and 2: from
+     what I've seen in Emacs, dealing with process groups isn't especially
+     portable.)
+   */
+  saver_preferences *p = &si->prefs;
+
+#ifndef VMS
+  Bool hairy_p = !!strpbrk (command, "*?$&!<>[];`'\\\"=");
+  /* note: = is in the above because of the sh syntax "FOO=bar cmd". */
+
+  if (getuid() == (uid_t) 0 || geteuid() == (uid_t) 0)
+    {
+      /* If you're thinking of commenting this out, think again.
+         If you do so, you will open a security hole.  Mail jwz
+         so that he may enlighten you as to the error of your ways.
+       */
+      fprintf (stderr, "%s: we're still running as root!  Disaster!\n",
+               blurb());
+      saver_exit (si, 1, 0);
+    }
+
+  if (p->verbose_p)
+    fprintf (stderr, "%s: spawning \"%s\" in pid %lu%s.\n",
+            blurb(), command, (unsigned long) getpid (),
+            (hairy_p ? " (via shell)" : ""));
+
+  if (hairy_p)
+    /* If it contains any shell metacharacters, do it the hard way,
+       and fork a shell to parse the arguments for us. */
+    exec_complex_command (p->shell, command);
+  else
+    /* Otherwise, we can just exec the program directly. */
+    exec_simple_command (command);
+
+#else /* VMS */
+  if (p->verbose_p)
+    fprintf (stderr, "%s: spawning \"%s\" in pid %lu.\n",
+            blurb(), command, getpid());
+  exec_vms_command (command);
+#endif /* VMS */
+
+  abort();     /* that shouldn't have returned. */
+}
+
+
+\f
+/* Management of child processes, and de-zombification.
+ */
+
+enum job_status {
+  job_running, /* the process is still alive */
+  job_stopped, /* we have sent it a STOP signal */
+  job_killed,  /* we have sent it a TERM signal */
+  job_dead     /* we have wait()ed for it, and it's dead -- this state only
+                  occurs so that we can avoid calling free() from a signal
+                  handler.  Shortly after going into this state, the list
+                  element will be removed. */
+};
+
+struct screenhack_job {
+  char *name;
+  pid_t pid;
+  enum job_status status;
+  struct screenhack_job *next;
+};
+
+static struct screenhack_job *jobs = 0;
+
+/* for debugging -- nothing calls this, but it's useful to invoke from gdb. */
+void
+show_job_list (void)
+{
+  struct screenhack_job *job;
+  fprintf(stderr, "%s: job list:\n", blurb());
+  for (job = jobs; job; job = job->next)
+    fprintf (stderr, "  %5ld: (%s) %s\n",
+            (long) job->pid,
+            (job->status == job_running ? "running" :
+             job->status == job_stopped ? "stopped" :
+             job->status == job_killed  ? " killed" :
+             job->status == job_dead    ? "   dead" : "    ???"),
+            job->name);
+  fprintf (stderr, "\n");
+}
+
+
+static void clean_job_list (void);
+
+static struct screenhack_job *
+make_job (pid_t pid, const char *cmd)
+{
+  struct screenhack_job *job = (struct screenhack_job *) malloc (sizeof(*job));
+
+  static char name [1024];
+  const char *in = cmd;
+  char *out = name;
+  int got_eq = 0;
+  int first = 1;
+
+  clean_job_list();
+
+ AGAIN:
+  while (isspace(*in)) in++;           /* skip whitespace */
+  while (!isspace(*in) && *in != ':') {
+    if (*in == '=') got_eq = 1;
+    *out++ = *in++;                    /* snarf first token */
+  }
+
+  if (got_eq)                          /* if the first token was FOO=bar */
+    {                                  /* then get the next token instead. */
+      got_eq = 0;
+      out = name;
+      first = 0;
+      goto AGAIN;
+    }
+
+  while (isspace(*in)) in++;           /* skip whitespace */
+  if (first && *in == ':')             /* token was a visual name; skip it. */
+    {
+      out = name;
+      first = 0;
+      goto AGAIN;
+    }
+  *out = 0;
+
+  job->name = strdup(name);
+  job->pid = pid;
+  job->status = job_running;
+  job->next = jobs;
+  jobs = job;
+
+  return jobs;
+}
+
+
+static void
+free_job (struct screenhack_job *job)
+{
+  if (!job)
+    return;
+  else if (job == jobs)
+    jobs = jobs->next;
+  else
+    {
+      struct screenhack_job *job2, *prev;
+      for (prev = 0, job2 = jobs;
+          job2;
+          prev = job2, job2 = job2->next)
+       if (job2 == job)
+         {
+           prev->next = job->next;
+           break;
+         }
+    }
+  free(job->name);
+  free(job);
+}
+
+
+/* Cleans out dead jobs from the jobs list -- this must only be called
+   from the main thread, not from a signal handler. 
+ */
+static void
+clean_job_list (void)
+{
+  struct screenhack_job *job, *prev, *next;
+  for (prev = 0, job = jobs, next = (job ? job->next : 0);
+       job;
+       prev = job, job = next, next = (job ? job->next : 0))
+    {
+      if (job->status == job_dead)
+       {
+         if (prev)
+           prev->next = next;
+         free_job (job);
+         job = prev;
+       }
+    }
+}
+
+
+static struct screenhack_job *
+find_job (pid_t pid)
+{
+  struct screenhack_job *job;
+  for (job = jobs; job; job = job->next)
+    if (job->pid == pid)
+      return job;
+  return 0;
+}
+
+static void await_dying_children (saver_info *si);
+#ifndef VMS
+static void describe_dead_child (saver_info *, pid_t, int wait_status);
+#endif
+
+
+/* Semaphore to temporarily turn the SIGCHLD handler into a no-op.
+   Don't alter this directly -- use block_sigchld() / unblock_sigchld().
+ */
+static int block_sigchld_handler = 0;
+
+
+static void
+block_sigchld (void)
+{
+#ifdef HAVE_SIGACTION
+  sigset_t child_set;
+  sigemptyset (&child_set);
+  sigaddset (&child_set, SIGCHLD);
+  sigprocmask (SIG_BLOCK, &child_set, 0);
+#endif /* HAVE_SIGACTION */
+
+  block_sigchld_handler++;
+}
+
+static void
+unblock_sigchld (void)
+{
+#ifdef HAVE_SIGACTION
+  sigset_t child_set;
+  sigemptyset(&child_set);
+  sigaddset(&child_set, SIGCHLD);
+  sigprocmask(SIG_UNBLOCK, &child_set, 0);
+#endif /* HAVE_SIGACTION */
+
+  block_sigchld_handler--;
+}
+
+static int
+kill_job (saver_info *si, pid_t pid, int signal)
+{
+  saver_preferences *p = &si->prefs;
+  struct screenhack_job *job;
+  int status = -1;
+
+  clean_job_list();
+
+  if (block_sigchld_handler)
+    /* This function should not be called from the signal handler. */
+    abort();
+
+  block_sigchld();                     /* we control the horizontal... */
+
+  job = find_job (pid);
+  if (!job ||
+      !job->pid ||
+      job->status == job_killed)
+    {
+      if (p->verbose_p)
+       fprintf (stderr, "%s: no child %ld to signal!\n",
+                blurb(), (long) pid);
+      goto DONE;
+    }
+
+  switch (signal) {
+  case SIGTERM: job->status = job_killed;  break;
+#ifdef SIGSTOP
+    /* #### there must be a way to do this on VMS... */
+  case SIGSTOP: job->status = job_stopped; break;
+  case SIGCONT: job->status = job_running; break;
+#endif /* SIGSTOP */
+  default: abort();
+  }
+
+#ifdef SIGSTOP
+  if (p->verbose_p)
+    fprintf (stderr, "%s: %s pid %lu.\n", blurb(),
+            (signal == SIGTERM ? "killing" :
+             signal == SIGSTOP ? "suspending" :
+             signal == SIGCONT ? "resuming" : "signalling"),
+            (unsigned long) job->pid);
+#else  /* !SIGSTOP */
+  if (p->verbose_p)
+    fprintf (stderr, "%s: %s pid %lu.\n", blurb(), "killing",
+            (unsigned long) job->pid);
+#endif /* !SIGSTOP */
+
+  status = kill (job->pid, signal);
+
+  if (p->verbose_p && status < 0)
+    {
+      if (errno == ESRCH)
+       fprintf (stderr, "%s: child process %lu (%s) was already dead.\n",
+                blurb(), job->pid, job->name);
+      else
+       {
+         char buf [1024];
+         sprintf (buf, "%s: couldn't kill child process %lu (%s)",
+                  blurb(), job->pid, job->name);
+         perror (buf);
+       }
+    }
+
+  await_dying_children (si);
+
+ DONE:
+  unblock_sigchld();
+  if (block_sigchld_handler < 0)
+    abort();
+
+  clean_job_list();
+  return status;
+}
+
+
+#ifdef SIGCHLD
+static RETSIGTYPE
+sigchld_handler (int sig)
+{
+  saver_info *si = global_si_kludge;   /* I hate C so much... */
+
+  if (si->prefs.debug_p)
+    fprintf(stderr, "%s: got SIGCHLD%s\n", blurb(),
+           (block_sigchld_handler ? " (blocked)" : ""));
+
+  if (block_sigchld_handler < 0)
+    abort();
+  else if (block_sigchld_handler == 0)
+    {
+      block_sigchld();
+      await_dying_children (si);
+      unblock_sigchld();
+    }
+
+  init_sigchld();
+}
+#endif /* SIGCHLD */
+
+
+#ifndef VMS
+static void
+await_dying_children (saver_info *si)
+{
+  while (1)
+    {
+      int wait_status = 0;
+      pid_t kid;
+
+      errno = 0;
+      kid = waitpid (-1, &wait_status, WNOHANG|WUNTRACED);
+
+      if (si->prefs.debug_p)
+       {
+         if (kid < 0 && errno)
+           fprintf (stderr, "%s: waitpid(-1) ==> %ld (%d)\n", blurb(),
+                    (long) kid, errno);
+         else
+           fprintf (stderr, "%s: waitpid(-1) ==> %ld\n", blurb(),
+                    (long) kid);
+       }
+
+      /* 0 means no more children to reap.
+        -1 means error -- except "interrupted system call" isn't a "real"
+        error, so if we get that, we should just try again. */
+      if (kid == 0 ||
+         (kid < 0 && errno != EINTR))
+       break;
+
+      describe_dead_child (si, kid, wait_status);
+    }
+}
+
+
+static void
+describe_dead_child (saver_info *si, pid_t kid, int wait_status)
+{
+  int i;
+  saver_preferences *p = &si->prefs;
+  struct screenhack_job *job = find_job (kid);
+  const char *name = job ? job->name : "<unknown>";
+
+  if (WIFEXITED (wait_status))
+    {
+      int exit_status = WEXITSTATUS (wait_status);
+
+      /* Treat exit code as a signed 8-bit quantity. */
+      if (exit_status & 0x80) exit_status |= ~0xFF;
+
+      /* One might assume that exiting with non-0 means something went wrong.
+        But that loser xswarm exits with the code that it was killed with, so
+        it *always* exits abnormally.  Treat abnormal exits as "normal" (don't
+        mention them) if we've just killed the subprocess.  But mention them
+        if they happen on their own.
+       */
+      if (!job ||
+         (exit_status != 0 &&
+          (p->verbose_p || job->status != job_killed)))
+       fprintf (stderr,
+                "%s: child pid %lu (%s) exited abnormally (code %d).\n",
+                blurb(), (unsigned long) kid, name, exit_status);
+      else if (p->verbose_p)
+       fprintf (stderr, "%s: child pid %lu (%s) exited normally.\n",
+                blurb(), (unsigned long) kid, name);
+
+      if (job)
+       job->status = job_dead;
+    }
+  else if (WIFSIGNALED (wait_status))
+    {
+      if (p->verbose_p ||
+         !job ||
+         job->status != job_killed ||
+         WTERMSIG (wait_status) != SIGTERM)
+       fprintf (stderr, "%s: child pid %lu (%s) terminated with %s.\n",
+                blurb(), (unsigned long) kid, name,
+                signal_name (WTERMSIG(wait_status)));
+
+      if (job)
+       job->status = job_dead;
+    }
+  else if (WIFSTOPPED (wait_status))
+    {
+      if (p->verbose_p)
+       fprintf (stderr, "%s: child pid %lu (%s) stopped with %s.\n",
+                blurb(), (unsigned long) kid, name,
+                signal_name (WSTOPSIG (wait_status)));
+
+      if (job)
+       job->status = job_stopped;
+    }
+  else
+    {
+      fprintf (stderr, "%s: child pid %lu (%s) died in a mysterious way!",
+              blurb(), (unsigned long) kid, name);
+      if (job)
+       job->status = job_dead;
+    }
+
+  /* Clear out the pid so that screenhack_running_p() knows it's dead.
+   */
+  if (!job || job->status == job_dead)
+    for (i = 0; i < si->nscreens; i++)
+      {
+       saver_screen_info *ssi = &si->screens[i];
+       if (kid == ssi->pid)
+         ssi->pid = 0;
+      }
+}
+
+#else  /* VMS */
+static void await_dying_children (saver_info *si) { return; }
+#endif /* VMS */
+
+
+void
+init_sigchld (void)
+{
+#ifdef SIGCHLD
+
+# ifdef HAVE_SIGACTION /* Thanks to Tom Kelly <tom@ancilla.toronto.on.ca> */
+
+  static Bool sigchld_initialized_p = 0;
+  if (!sigchld_initialized_p)
+    {
+      struct sigaction action, old;
+
+      action.sa_handler = sigchld_handler;
+      sigemptyset(&action.sa_mask);
+      action.sa_flags = 0;
+
+      if (sigaction(SIGCHLD, &action, &old) < 0)
+       {
+         char buf [255];
+         sprintf (buf, "%s: couldn't catch SIGCHLD", blurb());
+         perror (buf);
+       }
+      sigchld_initialized_p = True;
+    }
+
+# else  /* !HAVE_SIGACTION */
+
+  if (((long) signal (SIGCHLD, sigchld_handler)) == -1L)
+    {
+      char buf [255];
+      sprintf (buf, "%s: couldn't catch SIGCHLD", blurb());
+      perror (buf);
+    }
+# endif /* !HAVE_SIGACTION */
+#endif /* SIGCHLD */
+}
+
+
+
+\f
+
+static Bool
+hack_enabled_p (const char *hack)
+{
+  const char *s = hack;
+  while (isspace(*s)) s++;
+  return (*s != '-');
+}
+
+static Bool
+select_visual_of_hack (saver_screen_info *ssi, const char *hack)
+{
+  saver_info *si = ssi->global;
+  saver_preferences *p = &si->prefs;
+  Bool selected;
+  static char vis [1024];
+  const char *in = hack;
+  char *out = vis;
+  while (isspace(*in)) in++;           /* skip whitespace */
+  if (*in == '-') in++;                        /* skip optional "-" */
+  while (isspace(*in)) in++;           /* skip whitespace */
+
+  while (!isspace(*in) && *in != ':')
+    *out++ = *in++;                    /* snarf first token */
+  while (isspace(*in)) in++;           /* skip whitespace */
+  *out = 0;
+
+  if (*in == ':')
+    selected = select_visual(ssi, vis);
+  else
+    selected = select_visual(ssi, 0);
+
+  if (!selected && (p->verbose_p || si->demoing_p))
+    {
+      if (*in == ':') in++;
+      while (isspace(*in)) in++;
+      fprintf (stderr,
+              (si->demoing_p
+               ? "%s: warning, no \"%s\" visual for \"%s\".\n"
+               : "%s: no \"%s\" visual; skipping \"%s\".\n"),
+              blurb(), (*vis ? vis : "???"), in);
+    }
+
+  return selected;
+}
+
+
+static void
+spawn_screenhack_1 (saver_screen_info *ssi, Bool first_time_p)
+{
+  saver_info *si = ssi->global;
+  saver_preferences *p = &si->prefs;
+  raise_window (si, first_time_p, True, False);
+  XFlush (si->dpy);
+
+  if (p->screenhacks_count)
+    {
+      char *hack;
+      pid_t forked;
+      char buf [255];
+      int new_hack;
+      int retry_count = 0;
+      Bool force = False;
+
+    AGAIN:
+
+      if (p->screenhacks_count == 1)
+       /* If there is only one hack in the list, there is no choice. */
+       new_hack = 0;
+
+      else if (si->selection_mode == -1)
+       /* Select the next hack, wrapping. */
+       new_hack = (ssi->current_hack + 1) % p->screenhacks_count;
+
+      else if (si->selection_mode == -2)
+       /* Select the previous hack, wrapping. */
+       new_hack = ((ssi->current_hack + p->screenhacks_count - 1)
+                   % p->screenhacks_count);
+
+      else if (si->selection_mode > 0)
+       /* Select a specific hack, by number.  No negotiation. */
+       {
+         new_hack = ((si->selection_mode - 1) % p->screenhacks_count);
+         force = True;
+       }
+      else
+       {
+         /* Select a random hack (but not the one we just ran.) */
+         while ((new_hack = random () % p->screenhacks_count)
+                == ssi->current_hack)
+           ;
+       }
+
+      ssi->current_hack = new_hack;
+      hack = p->screenhacks[ssi->current_hack];
+
+      /* If the hack is disabled, or there is no visual for this hack,
+        then try again (move forward, or backward, or re-randomize.)
+        Unless this hack was specified explicitly, in which case,
+        use it regardless.
+       */
+      if (force)
+        select_visual_of_hack (ssi, hack);
+        
+      if (!force &&
+         (!hack_enabled_p (hack) ||
+          !select_visual_of_hack (ssi, hack)))
+       {
+         if (++retry_count > (p->screenhacks_count*4))
+           {
+             /* Uh, oops.  Odds are, there are no suitable visuals,
+                and we're looping.  Give up.  (This is totally lame,
+                what we should do is make a list of suitable hacks at
+                the beginning, then only loop over them.)
+             */
+             if (p->verbose_p)
+               fprintf(stderr,
+                       "%s: no suitable visuals for these programs.\n",
+                       blurb());
+             return;
+           }
+         else
+           goto AGAIN;
+       }
+
+      /* Turn off "next" and "prev" modes now, but "demo" mode is only
+        turned off by explicit action.
+       */
+      if (si->selection_mode < 0)
+       si->selection_mode = 0;
+
+
+      /* If there's a visual description on the front of the command, nuke it.
+       */
+      {
+       char *in = hack;
+       while (isspace(*in)) in++;                      /* skip whitespace */
+       if (*in == '-') in++;                           /* skip optional "-" */
+       while (isspace(*in)) in++;                      /* skip whitespace */
+       hack = in;
+       while (!isspace(*in) && *in != ':') in++;       /* snarf first token */
+       while (isspace(*in)) in++;                      /* skip whitespace */
+       if (*in == ':')
+         {
+           in++;
+           while (isspace(*in)) in++;
+           hack = in;
+         }
+      }
+
+      switch ((int) (forked = fork ()))
+       {
+       case -1:
+         sprintf (buf, "%s: couldn't fork", blurb());
+         perror (buf);
+         restore_real_vroot (si);
+         saver_exit (si, 1, 0);
+
+       case 0:
+         close (ConnectionNumber (si->dpy));   /* close display fd */
+         nice_subproc (p->nice_inferior);      /* change process priority */
+         hack_subproc_environment (ssi);       /* set $DISPLAY */
+         exec_screenhack (si, hack);           /* this does not return */
+         abort();
+         break;
+
+       default:
+         ssi->pid = forked;
+         (void) make_job (forked, hack);
+         break;
+       }
+    }
+}
+
+
+void
+spawn_screenhack (saver_info *si, Bool first_time_p)
+{
+  int i;
+
+  if (!monitor_powered_on_p (si))
+    {
+      if (si->prefs.verbose_p)
+       fprintf (stderr,
+                "%s: server reports that monitor has powered down; "
+                "not launching a new hack.\n", blurb());
+      return;
+    }
+
+  for (i = 0; i < si->nscreens; i++)
+    {
+      saver_screen_info *ssi = &si->screens[i];
+      spawn_screenhack_1 (ssi, first_time_p);
+    }
+}
+
+
+void
+kill_screenhack (saver_info *si)
+{
+  int i;
+  for (i = 0; i < si->nscreens; i++)
+    {
+      saver_screen_info *ssi = &si->screens[i];
+      if (ssi->pid)
+       kill_job (si, ssi->pid, SIGTERM);
+      ssi->pid = 0;
+    }
+}
+
+
+void
+suspend_screenhack (saver_info *si, Bool suspend_p)
+{
+#ifdef SIGSTOP /* older VMS doesn't have it... */
+  int i;
+  for (i = 0; i < si->nscreens; i++)
+    {
+      saver_screen_info *ssi = &si->screens[i];
+      if (ssi->pid)
+       kill_job (si, ssi->pid, (suspend_p ? SIGSTOP : SIGCONT));
+    }
+#endif /* SIGSTOP */
+}
+
+
+/* Called when we're exiting abnormally, to kill off the subproc. */
+void
+emergency_kill_subproc (saver_info *si)
+{
+  int i;
+#ifdef SIGCHLD
+  signal (SIGCHLD, SIG_IGN);
+#endif /* SIGCHLD */
+
+  for (i = 0; i < si->nscreens; i++)
+    {
+      saver_screen_info *ssi = &si->screens[i];
+      if (ssi->pid)
+       {
+         kill_job (si, ssi->pid, SIGTERM);
+         ssi->pid = 0;
+       }
+    }
+}
+
+Bool
+screenhack_running_p (saver_info *si)
+{
+  Bool result = True;
+  int i;
+  for (i = 0; i < si->nscreens; i++)
+    {
+      saver_screen_info *ssi = &si->screens[i];
+      if (!ssi->pid)
+       result = False;
+    }
+  return result;
+}
+
+\f
+/* Environment variables. */
+
+
+/* Modifies $PATH in the current environment, so that if DEFAULT_PATH_PREFIX
+   is defined, the xscreensaver daemon will search that directory for hacks.
+ */
+void
+hack_environment (saver_info *si)
+{
+#if defined(HAVE_PUTENV) && defined(DEFAULT_PATH_PREFIX)
+  static const char *def_path = DEFAULT_PATH_PREFIX;
+  if (def_path && *def_path)
+    {
+      const char *opath = getenv("PATH");
+      char *npath = (char *) malloc(strlen(def_path) + strlen(opath) + 20);
+      strcpy (npath, "PATH=");
+      strcat (npath, def_path);
+      strcat (npath, ":");
+      strcat (npath, opath);
+
+      if (putenv (npath))
+       abort ();
+    }
+#endif /* HAVE_PUTENV && DEFAULT_PATH_PREFIX */
+}
+
+
+void
+hack_subproc_environment (saver_screen_info *ssi)
+{
+  /* Store $DISPLAY into the environment, so that the $DISPLAY variable that
+     the spawned processes inherit is correct.  First, it must be on the same
+     host and display as the value of -display passed in on our command line
+     (which is not necessarily the same as what our $DISPLAY variable is.)
+     Second, the screen number in the $DISPLAY passed to the subprocess should
+     be the screen on which this particular hack is running -- not the display
+     specification which the driver itself is using, since the driver ignores
+     its screen number and manages all existing screens.
+   */
+  saver_info *si = ssi->global;
+  const char *odpy = DisplayString (si->dpy);
+  char *ndpy = (char *) malloc(strlen(odpy) + 20);
+  int screen_number;
+  char *s;
+
+  for (screen_number = 0; screen_number < si->nscreens; screen_number++)
+    if (ssi == &si->screens[screen_number])
+      break;
+
+  strcpy (ndpy, "DISPLAY=");
+  s = ndpy + strlen(ndpy);
+  strcpy (s, odpy);
+
+  while (*s && *s != ':') s++;                 /* skip to colon */
+  while (*s == ':') s++;                       /* skip over colons */
+  while (isdigit(*s)) s++;                     /* skip over dpy number */
+  while (*s == '.') s++;                       /* skip over dot */
+  if (s[-1] != '.') *s++ = '.';                        /* put on a dot */
+  sprintf(s, "%d", screen_number);             /* put on screen number */
+
+  /* Allegedly, BSD 4.3 didn't have putenv(), but nobody runs such systems
+     any more, right?  It's not Posix, but everyone seems to have it. */
+#ifdef HAVE_PUTENV
+  if (putenv (ndpy))
+    abort ();
+#endif /* HAVE_PUTENV */
+}
+
+\f
+/* Restarting the xscreensaver process from scratch. */
+
+static char **saved_argv;
+
+void
+save_argv (int argc, char **argv)
+{
+  saved_argv = (char **) calloc (argc+2, sizeof (char *));
+  saved_argv [argc] = 0;
+  while (argc--)
+    {
+      int i = strlen (argv [argc]) + 1;
+      saved_argv [argc] = (char *) malloc (i);
+      memcpy (saved_argv [argc], argv [argc], i);
+    }
+}
+
+
+/* Re-execs the process with the arguments in saved_argv.
+   Does not return unless there was an error.
+ */
+void
+restart_process (saver_info *si)
+{
+  if (si->prefs.verbose_p)
+    {
+      int i;
+      fprintf (real_stderr, "%s: re-executing", blurb());
+      for (i = 0; saved_argv[i]; i++)
+       fprintf (real_stderr, " %s", saved_argv[i]);
+      fprintf (real_stderr, "\n");
+    }
+  describe_uids (si, real_stderr);
+  fprintf (real_stderr, "\n");
+
+  fflush (real_stdout);
+  fflush (real_stderr);
+  execvp (saved_argv [0], saved_argv); /* shouldn't return */
+  {
+    char buf [512];
+    sprintf (buf, "%s: could not restart process", blurb());
+    perror(buf);
+    fflush(stderr);
+  }
+  XBell(si->dpy, 0);
+}
diff --git a/driver/test-apm.c b/driver/test-apm.c
new file mode 100644 (file)
index 0000000..108905f
--- /dev/null
@@ -0,0 +1,100 @@
+/* test-apm.c --- playing with the APM library.
+ * xscreensaver, Copyright (c) 1999 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software 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.  No representations are made about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or 
+ * implied warranty.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <stdlib.h>
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+
+#include <stdio.h>
+#include <sys/time.h>
+
+#include <X11/Xlib.h>
+#include <X11/Intrinsic.h>
+
+#include <apm.h>
+
+#define countof(x) (sizeof((x))/sizeof(*(x)))
+
+
+char *progname = 0;
+char *progclass = "XScreenSaver";
+
+static const char *
+blurb (void)
+{
+  static char buf[255];
+  time_t now = time ((time_t *) 0);
+  char *ct = (char *) ctime (&now);
+  int n = strlen(progname);
+  if (n > 100) n = 99;
+  strncpy(buf, progname, n);
+  buf[n++] = ':';
+  buf[n++] = ' ';
+  strncpy(buf+n, ct+11, 8);
+  strcpy(buf+n+9, ": ");
+  return buf;
+}
+
+static void
+apm_cb (XtPointer closure, int *fd, XtInputId *id)
+{
+  apm_event_t events[100];
+  int n, i;
+  while ((n = apm_get_events (*fd, 0, events, countof(events)))
+         > 0)
+    for (i = 0; i < n; i++)
+      {
+        fprintf (stderr, "%s: APM event 0x%x: %s.\n", blurb(),
+                 events[i], apm_event_name (events[i]));
+#if 0
+        switch (events[i])
+          {
+          case APM_SYS_STANDBY:
+          case APM_USER_STANDBY:
+          case APM_SYS_SUSPEND:
+          case APM_USER_SUSPEND:
+          case APM_CRITICAL_SUSPEND:
+            break;
+          }
+#endif
+      }
+}
+
+int
+main (int argc, char **argv)
+{
+  XtAppContext app;
+  Widget toplevel_shell = XtAppInitialize (&app, progclass, 0, 0,
+                                          &argc, argv, 0, 0, 0);
+  Display *dpy = XtDisplay (toplevel_shell);
+  int fd;
+  XtInputId id;
+  XtGetApplicationNameAndClass (dpy, &progname, &progclass);
+
+  fd = apm_open ();
+  if (fd <= 0)
+    {
+      fprintf (stderr, "%s: couldn't initialize APM.\n", blurb());
+      exit (1);
+    }
+
+  id = XtAppAddInput(app, fd,
+                     (XtPointer) (XtInputReadMask | XtInputWriteMask),
+                     apm_cb, 0);
+  XtAppMainLoop (app);
+  exit (0);
+}
diff --git a/driver/test-grab.c b/driver/test-grab.c
new file mode 100644 (file)
index 0000000..9b4a914
--- /dev/null
@@ -0,0 +1,89 @@
+/* test-uid.c --- playing with grabs.
+ * xscreensaver, Copyright (c) 1999 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software 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.  No representations are made about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or 
+ * implied warranty.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <stdlib.h>
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+
+#include <stdio.h>
+#include <sys/time.h>
+
+#include <X11/Xlib.h>
+#include <X11/Intrinsic.h>
+
+char *progname = 0;
+char *progclass = "XScreenSaver";
+
+#define ALL_POINTER_EVENTS \
+       (ButtonPressMask | ButtonReleaseMask | EnterWindowMask | \
+        LeaveWindowMask | PointerMotionMask | PointerMotionHintMask | \
+        Button1MotionMask | Button2MotionMask | Button3MotionMask | \
+        Button4MotionMask | Button5MotionMask | ButtonMotionMask)
+
+int
+main (int argc, char **argv)
+{
+  XtAppContext app;
+  int kstatus, mstatus;
+  Cursor cursor = 0;
+  int delay = 60 * 15;
+  Widget toplevel_shell = XtAppInitialize (&app, progclass, 0, 0,
+                                          &argc, argv, 0, 0, 0);
+  Display *dpy = XtDisplay (toplevel_shell);
+  Window w = RootWindow (dpy, DefaultScreen(dpy));
+  XtGetApplicationNameAndClass (dpy, &progname, &progclass);
+
+  kstatus = XGrabKeyboard (dpy, w, True,
+                           GrabModeSync, GrabModeAsync,
+                           CurrentTime);
+  fprintf (stderr, "%s: grabbing keyboard on 0x%x... %s.\n",
+           progname, (unsigned long) w,
+           (kstatus == GrabSuccess ? "GrabSuccess" :
+            kstatus == AlreadyGrabbed ? "AlreadyGrabbed" :
+            kstatus == GrabInvalidTime ? "GrabInvalidTime" :
+            kstatus == GrabNotViewable ? "GrabNotViewable" :
+            kstatus == GrabFrozen ? "GrabFrozen" :
+            "???"));
+
+  mstatus = XGrabPointer (dpy, w, True, ALL_POINTER_EVENTS,
+                          GrabModeAsync, GrabModeAsync, None,
+                          cursor, CurrentTime);
+  fprintf (stderr, "%s: grabbing mouse on 0x%x... %s.\n",
+           progname, (unsigned long) w,
+           (mstatus == GrabSuccess ? "GrabSuccess" :
+            mstatus == AlreadyGrabbed ? "AlreadyGrabbed" :
+            mstatus == GrabInvalidTime ? "GrabInvalidTime" :
+            mstatus == GrabNotViewable ? "GrabNotViewable" :
+            mstatus == GrabFrozen ? "GrabFrozen" :
+            "???"));
+
+  XSync(dpy, False);
+
+  if (kstatus == GrabSuccess || mstatus == GrabSuccess)
+    {
+      fprintf (stderr, "%s: sleeping for %d:%02d:%02d...\n",
+               progname,
+               delay / (60 * 60),
+               (delay % (60 * 60)) / 60,
+               delay % 60);
+      fflush(stderr);
+      sleep (delay);
+      XSync(dpy, False);
+    }
+
+  exit (0);
+}
diff --git a/driver/test-passwd.c b/driver/test-passwd.c
new file mode 100644 (file)
index 0000000..f4fef0d
--- /dev/null
@@ -0,0 +1,208 @@
+/* xscreensaver, Copyright (c) 1998 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software 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.  No representations are made about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or 
+ * implied warranty.
+ */
+
+/* This is a kludgy test harness for debugging the password dialog box.
+   It's somewhat easier to debug it here than in the xscreensaver executable
+   itself.
+ */
+
+#define WHICH 0
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <stdio.h>
+#include <ctype.h>
+#include <pwd.h>
+
+#include <X11/Xlib.h>
+#include <X11/Xatom.h>
+#include <X11/Intrinsic.h>
+#include <X11/StringDefs.h>
+#include <X11/Shell.h>
+
+#include "xscreensaver.h"
+#include "resources.h"
+#include "version.h"
+#include "visual.h"
+
+char *progname = 0;
+char *progclass = 0;
+XrmDatabase db = 0;
+saver_info *global_si_kludge;
+
+FILE *real_stderr, *real_stdout;
+
+void monitor_power_on (saver_info *si) {}
+Bool monitor_powered_on_p (saver_info *si) { return True; }
+void initialize_screensaver_window (saver_info *si) {}
+void raise_window (saver_info *si, Bool i, Bool b, Bool d) {}
+Bool blank_screen (saver_info *si) {return False;}
+void unblank_screen (saver_info *si) {}
+Bool select_visual (saver_screen_info *ssi, const char *v) { return False; }
+Bool window_exists_p (Display *dpy, Window window) {return True;}
+void start_notice_events_timer (saver_info *si, Window w, Bool b) {}
+Bool handle_clientmessage (saver_info *si, XEvent *e, Bool u) { return False; }
+int BadWindow_ehandler (Display *dpy, XErrorEvent *error) { exit(1); }
+const char *signal_name(int signal) { return "???"; }
+void restore_real_vroot (saver_info *si) {}
+void saver_exit (saver_info *si, int status, const char *core) { exit(status);}
+int move_mouse_grab (saver_info *si, Window to, Cursor cursor) { return 0; }
+
+const char *blurb(void) { return progname; }
+Atom XA_SCREENSAVER, XA_DEMO, XA_PREFS;
+
+void
+get_screen_viewport (saver_screen_info *ssi,
+                     int *x_ret, int *y_ret,
+                     int *w_ret, int *h_ret,
+                     Bool verbose_p)
+{
+  *x_ret = 0;
+  *y_ret = 0;
+  *w_ret = WidthOfScreen (ssi->screen);
+  *h_ret = HeightOfScreen (ssi->screen);
+}
+
+
+void
+idle_timer (XtPointer closure, XtIntervalId *id)
+{
+  saver_info *si = (saver_info *) closure;
+  XEvent fake_event;
+  fake_event.type = 0; /* XAnyEvent type, ignored. */
+  fake_event.xany.display = si->dpy;
+  fake_event.xany.window  = 0;
+  XPutBackEvent (si->dpy, &fake_event);
+}
+
+
+static char *fallback[] = {
+#include "XScreenSaver_ad.h"
+ 0
+};
+
+int
+main (int argc, char **argv)
+{
+  Widget toplevel_shell = 0;
+  saver_screen_info ssip;
+  saver_info sip;
+  saver_info *si = &sip;
+  saver_preferences *p = &si->prefs;
+
+  memset(&sip, 0, sizeof(sip));
+  memset(&ssip, 0, sizeof(ssip));
+
+  si->nscreens = 1;
+  si->screens = si->default_screen = &ssip;
+  ssip.global = si;
+
+  global_si_kludge = si;
+  real_stderr = stderr;
+  real_stdout = stdout;
+
+  si->version = (char *) malloc (5);
+  memcpy (si->version, screensaver_id + 17, 4);
+  progname = argv[0];
+  {
+    char *s = strrchr(progname, '/');
+    if (*s) strcpy (progname, s+1);
+  }
+
+  /* before hack_uid() for proper permissions */
+  lock_priv_init (argc, argv, True);
+
+  hack_uid (si);
+
+  if (! lock_init (argc, argv, si->prefs.verbose_p))
+    {
+      si->locking_disabled_p = True;
+      si->nolock_reason = "error getting password";
+    }
+
+  progclass = "XScreenSaver";
+
+#if (WHICH != 2)
+  toplevel_shell = XtAppInitialize (&si->app, progclass, 0, 0,
+                                   &argc, argv, fallback,
+                                   0, 0);
+
+  si->dpy = XtDisplay (toplevel_shell);
+  p->db = XtDatabase (si->dpy);
+  si->default_screen->toplevel_shell = toplevel_shell;
+  si->default_screen->screen = XtScreen(toplevel_shell);
+  si->default_screen->default_visual =
+    si->default_screen->current_visual =
+      DefaultVisualOfScreen(si->default_screen->screen);
+  si->default_screen->screensaver_window =
+    RootWindowOfScreen(si->default_screen->screen);
+  si->default_screen->current_depth =
+    visual_depth(si->default_screen->screen,
+                 si->default_screen->current_visual);
+
+  db = p->db;
+  XtGetApplicationNameAndClass (si->dpy, &progname, &progclass);
+
+  load_init_file (&si->prefs);
+
+#endif /* (WHICH != 2) */
+
+  p->verbose_p = True;
+
+  while (1)
+    {
+#if WHICH == 0
+      if (unlock_p (si))
+       fprintf (stderr, "%s: password correct\n", progname);
+      else
+       fprintf (stderr, "%s: password INCORRECT!\n", progname);
+
+      XSync(si->dpy, False);
+      sleep (3);
+#elif WHICH == 1
+      {
+       XEvent event;
+       make_splash_dialog (si);
+       XtAppAddTimeOut (si->app, p->splash_duration + 1000,
+                        idle_timer, (XtPointer) si);
+       while (si->splash_dialog)
+         {
+           XtAppNextEvent (si->app, &event);
+           if (event.xany.window == si->splash_dialog)
+             handle_splash_event (si, &event);
+           XtDispatchEvent (&event);
+         }
+       XSync (si->dpy, False);
+       sleep (1);
+      }
+#elif WHICH == 2
+      {
+        char *pass;
+        char buf[255];
+        struct passwd *p = getpwuid (getuid ());
+        printf ("\n%s: %s's password: ", progname, p->pw_name);
+
+        pass = fgets (buf, sizeof(buf)-1, stdin);
+        if (!pass || !*pass)
+          exit (0);
+        if (pass[strlen(pass)-1] == '\n')
+          pass[strlen(pass)-1] = 0;
+
+        if (passwd_valid_p (pass, True))
+          printf ("%s: Ok!\n", progname);
+        else
+          printf ("%s: Wrong!\n", progname);
+      }
+#endif
+    }
+}
diff --git a/driver/test-uid.c b/driver/test-uid.c
new file mode 100644 (file)
index 0000000..0a75fcf
--- /dev/null
@@ -0,0 +1,180 @@
+/* test-uid.c --- playing with setuid.
+ * xscreensaver, Copyright (c) 1998 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software 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.  No representations are made about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or 
+ * implied warranty.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <stdlib.h>
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+
+#include <ctype.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <pwd.h>
+#include <grp.h>
+
+static void
+print(void)
+{
+  int uid = getuid();
+  int gid = getgid();
+  int euid = geteuid();
+  int egid = getegid();
+  struct passwd *p = 0;
+  struct group *g = 0;
+
+  p = getpwuid (uid);
+  g = getgrgid (gid);
+  fprintf(stderr, "real user/group: %ld/%ld (%s/%s)\n", (long) uid, (long) gid,
+         (p && p->pw_name ? p->pw_name : "???"),
+         (g && g->gr_name ? g->gr_name : "???"));
+
+  p = getpwuid (euid);
+  g = getgrgid (egid);
+  fprintf(stderr, "eff. user/group: %ld/%ld (%s/%s)\n", (long)euid, (long)egid,
+         (p && p->pw_name ? p->pw_name : "???"),
+         (g && g->gr_name ? g->gr_name : "???"));
+}
+
+int
+main (int argc, char **argv)
+{
+  int i;
+  struct passwd *p = 0;
+  struct group *g = 0;
+
+  if (argc <= 1)
+    {
+      fprintf(stderr,
+             "usage: %s [ user/group ... ]\n"
+             "\tEach argument may be a user name, or user/group.\n"
+             "\tThis program will attempt to setuid/setgid to each\n"
+             "\tin turn, and report the results.  The user and group\n"
+             "\tnames may be strings, or numeric.\n",
+             argv[0]);
+      exit(1);
+    }
+
+  print();
+  for (i = 1; i < argc; i++)
+    {
+      char *user = argv[i];
+      char *group = strchr(user, '/');
+      if (!group)
+       group = strchr(user, '.');
+      if (group)
+       *group++ = 0;
+
+      if (group && *group)
+       {
+         long gid = 0;
+         int was_numeric = 0;
+
+         g = 0;
+         if (*group == '-' || (*group >= '0' && *group <= '9'))
+           if (1 == sscanf(group, "%ld", &gid))
+             {
+               g = getgrgid (gid);
+               was_numeric = 1;
+             }
+
+         if (!g)
+           g = getgrnam(group);
+
+         if (g)
+           {
+             gid = g->gr_gid;
+             group = g->gr_name;
+           }
+         else
+           {
+             if (was_numeric)
+               {
+                 fprintf(stderr, "no group numbered %s.\n", group);
+                 group = "";
+               }
+             else
+               {
+                 fprintf(stderr, "no group named %s.\n", group);
+                 goto NOGROUP;
+               }
+           }
+
+         fprintf(stderr, "setgid(%ld) \"%s\"", gid, group);
+         if (setgid(gid) == 0)
+           fprintf(stderr, " succeeded.\n");
+         else
+           perror(" failed");
+
+       NOGROUP: ;
+       }
+
+      if (user && *user)
+       {
+         long uid = 0;
+         int was_numeric = 0;
+
+         p = 0;
+         if (*user == '-' || (*user >= '0' && *user <= '9'))
+           if (1 == sscanf(user, "%ld", &uid))
+             {
+               p = getpwuid (uid);
+               was_numeric = 1;
+             }
+
+         if (!p)
+           p = getpwnam(user);
+
+         if (p)
+           {
+             uid = p->pw_uid;
+             user = p->pw_name;
+           }
+         else
+           {
+             if (was_numeric)
+               {
+                 fprintf(stderr, "no user numbered \"%s\".\n", user);
+                 user = "";
+               }
+             else
+               {
+                 fprintf(stderr, "no user named %s.\n", user);
+                 goto NOUSER;
+               }
+           }
+
+         fprintf(stderr, "setuid(%ld) \"%s\"", uid, user);
+         if (setuid(uid) == 0)
+           fprintf(stderr, " succeeded.\n");
+         else
+           perror(" failed");
+       NOUSER: ;
+       }
+      print();
+    }
+
+  fprintf(stderr,
+         "running \"whoami\" and \"groups\" in a sub-process reports:\n");
+  fflush(stdout);
+  fflush(stderr);
+  system ("/bin/sh -c 'echo \"`whoami` / `groups`\"'");
+
+  fflush(stdout);
+  fflush(stderr);
+  exit(0);
+}
diff --git a/driver/test-xdpms.c b/driver/test-xdpms.c
new file mode 100644 (file)
index 0000000..79a0dfd
--- /dev/null
@@ -0,0 +1,159 @@
+/* test-xdpms.c --- playing with the XDPMS extension.
+ * xscreensaver, Copyright (c) 1998 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software 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.  No representations are made about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or 
+ * implied warranty.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <stdlib.h>
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+
+#include <stdio.h>
+#include <sys/time.h>
+
+#include <X11/Xlib.h>
+#include <X11/Xatom.h>
+#include <X11/Intrinsic.h>
+
+#include <X11/Xproto.h>
+#include <X11/extensions/dpms.h>
+#include <X11/extensions/dpmsstr.h>
+
+extern Bool DPMSQueryExtension (Display *dpy, int *event_ret, int *error_ret);
+extern Bool DPMSCapable (Display *dpy);
+extern Status DPMSForceLevel (Display *dpy, CARD16 level);
+extern Status DPMSInfo (Display *dpy, CARD16 *power_level, BOOL *state);
+
+extern Status DPMSGetVersion (Display *dpy, int *major_ret, int *minor_ret);
+extern Status DPMSSetTimeouts (Display *dpy,
+                              CARD16 standby, CARD16 suspend, CARD16 off);
+extern Bool DPMSGetTimeouts (Display *dpy,
+                            CARD16 *standby, CARD16 *suspend, CARD16 *off);
+extern Status DPMSEnable (Display *dpy);
+extern Status DPMSDisable (Display *dpy);
+
+
+char *progname = 0;
+char *progclass = "XScreenSaver";
+
+static const char *
+blurb (void)
+{
+  static char buf[255];
+  time_t now = time ((time_t *) 0);
+  char *ct = (char *) ctime (&now);
+  int n = strlen(progname);
+  if (n > 100) n = 99;
+  strncpy(buf, progname, n);
+  buf[n++] = ':';
+  buf[n++] = ' ';
+  strncpy(buf+n, ct+11, 8);
+  strcpy(buf+n+9, ": ");
+  return buf;
+}
+
+
+int
+main (int argc, char **argv)
+{
+  int delay = 10;
+
+  int event_number, error_number;
+  int major, minor;
+  CARD16 standby, suspend, off;
+  CARD16 state;
+  BOOL onoff;
+
+  XtAppContext app;
+  Widget toplevel_shell = XtAppInitialize (&app, progclass, 0, 0,
+                                          &argc, argv, 0, 0, 0);
+  Display *dpy = XtDisplay (toplevel_shell);
+  XtGetApplicationNameAndClass (dpy, &progname, &progclass);
+
+  if (!DPMSQueryExtension(dpy, &event_number, &error_number))
+    {
+      fprintf(stderr, "%s: DPMSQueryExtension(dpy, ...) ==> False\n",
+             blurb());
+      fprintf(stderr, "%s: server does not support the XDPMS extension.\n",
+             blurb());
+      exit(1);
+    }
+  else
+    fprintf(stderr, "%s: DPMSQueryExtension(dpy, ...) ==> %d, %d\n", blurb(),
+           event_number, error_number);
+
+  if (!DPMSCapable(dpy))
+    {
+      fprintf(stderr, "%s: DPMSCapable(dpy) ==> False\n", blurb());
+      fprintf(stderr, "%s: server says hardware doesn't support DPMS.\n",
+             blurb());
+      exit(1);
+    }
+  else
+    fprintf(stderr, "%s: DPMSCapable(dpy) ==> True\n", blurb());
+
+  if (!DPMSGetVersion(dpy, &major, &minor))
+    {
+      fprintf(stderr, "%s: DPMSGetVersion(dpy, ...) ==> False\n", blurb());
+      fprintf(stderr, "%s: server didn't report XDPMS version numbers?\n",
+             blurb());
+    }
+  else
+    fprintf(stderr, "%s: DPMSGetVersion(dpy, ...) ==> %d, %d\n", blurb(),
+           major, minor);
+
+  if (!DPMSGetTimeouts(dpy, &standby, &suspend, &off))
+    {
+      fprintf(stderr, "%s: DPMSGetTimeouts(dpy, ...) ==> False\n", blurb());
+      fprintf(stderr, "%s: server didn't report DPMS timeouts?\n", blurb());
+    }
+  else
+    fprintf(stderr,
+           "%s: DPMSGetTimeouts(dpy, ...)\n"
+           "\t ==> standby = %d, suspend = %d, off = %d\n",
+           blurb(), standby, suspend, off);
+
+  while (1)
+    {
+      if (!DPMSInfo(dpy, &state, &onoff))
+       {
+         fprintf(stderr, "%s: DPMSInfo(dpy, ...) ==> False\n", blurb());
+         fprintf(stderr, "%s: couldn't read DPMS state?\n", blurb());
+         onoff = 0;
+         state = -1;
+       }
+      else
+       {
+         fprintf(stderr, "%s: DPMSInfo(dpy, ...) ==> %s, %s\n", blurb(),
+                 (state == DPMSModeOn ? "DPMSModeOn" :
+                  state == DPMSModeStandby ? "DPMSModeStandby" :
+                  state == DPMSModeSuspend ? "DPMSModeSuspend" :
+                  state == DPMSModeOff ? "DPMSModeOff" : "???"),
+                 (onoff == 1 ? "On" : onoff == 0 ? "Off" : "???"));
+       }
+
+      if (state == DPMSModeStandby ||
+         state == DPMSModeSuspend ||
+         state == DPMSModeOff)
+       {
+         Status st;
+         fprintf(stderr, "%s: monitor is off; turning it on.\n", blurb());
+         st = DPMSForceLevel (dpy, DPMSModeOn);
+         fprintf (stderr, "%s: DPMSForceLevel (dpy, DPMSModeOn) ==> %s\n",
+                  blurb(), (st ? "Ok" : "Error"));
+       }
+
+      sleep (delay);
+    }
+}
diff --git a/driver/timers.c b/driver/timers.c
new file mode 100644 (file)
index 0000000..a6a9486
--- /dev/null
@@ -0,0 +1,1071 @@
+/* timers.c --- detecting when the user is idle, and other timer-related tasks.
+ * xscreensaver, Copyright (c) 1991-1997, 1998
+ *  Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software 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.  No representations are made about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or 
+ * implied warranty.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+/* #define DEBUG_TIMERS */
+
+#include <stdio.h>
+#include <X11/Xlib.h>
+#include <X11/Intrinsic.h>
+#include <X11/Xos.h>
+#ifdef HAVE_XMU
+# ifndef VMS
+#  include <X11/Xmu/Error.h>
+# else /* VMS */
+#  include <Xmu/Error.h>
+# endif /* VMS */
+# else /* !HAVE_XMU */
+# include "xmu.h"
+#endif /* !HAVE_XMU */
+
+#ifdef HAVE_XIDLE_EXTENSION
+#include <X11/extensions/xidle.h>
+#endif /* HAVE_XIDLE_EXTENSION */
+
+#ifdef HAVE_MIT_SAVER_EXTENSION
+#include <X11/extensions/scrnsaver.h>
+#endif /* HAVE_MIT_SAVER_EXTENSION */
+
+#ifdef HAVE_SGI_SAVER_EXTENSION
+#include <X11/extensions/XScreenSaver.h>
+#endif /* HAVE_SGI_SAVER_EXTENSION */
+
+#include "xscreensaver.h"
+
+#ifdef HAVE_PROC_INTERRUPTS
+static Bool proc_interrupts_activity_p (saver_info *si);
+#endif /* HAVE_PROC_INTERRUPTS */
+
+static void check_for_clock_skew (saver_info *si);
+
+
+void
+idle_timer (XtPointer closure, XtIntervalId *id)
+{
+  saver_info *si = (saver_info *) closure;
+
+  /* What an amazingly shitty design.  Not only does Xt execute timeout
+     events from XtAppNextEvent() instead of from XtDispatchEvent(), but
+     there is no way to tell Xt to block until there is an X event OR a
+     timeout happens.  Once your timeout proc is called, XtAppNextEvent()
+     still won't return until a "real" X event comes in.
+
+     So this function pushes a stupid, gratuitous, unnecessary event back
+     on the event queue to force XtAppNextEvent to return Right Fucking Now.
+     When the code in sleep_until_idle() sees an event of type XAnyEvent,
+     which the server never generates, it knows that a timeout has occurred.
+   */
+  XEvent fake_event;
+  fake_event.type = 0; /* XAnyEvent type, ignored. */
+  fake_event.xany.display = si->dpy;
+  fake_event.xany.window  = 0;
+  XPutBackEvent (si->dpy, &fake_event);
+}
+
+
+static void
+schedule_wakeup_event (saver_info *si, Time when, Bool verbose_p)
+{
+  /* Wake up periodically to ask the server if we are idle. */
+  si->timer_id = XtAppAddTimeOut (si->app, when, idle_timer,
+                                  (XtPointer) si);
+
+#ifdef DEBUG_TIMERS
+  if (verbose_p)
+    fprintf (stderr, "%s: starting idle_timer (%ld, %ld)\n",
+             blurb(), when, si->timer_id);
+#endif /* DEBUG_TIMERS */
+}
+
+
+static void
+notice_events (saver_info *si, Window window, Bool top_p)
+{
+  saver_preferences *p = &si->prefs;
+  XWindowAttributes attrs;
+  unsigned long events;
+  Window root, parent, *kids;
+  unsigned int nkids;
+
+  if (XtWindowToWidget (si->dpy, window))
+    /* If it's one of ours, don't mess up its event mask. */
+    return;
+
+  if (!XQueryTree (si->dpy, window, &root, &parent, &kids, &nkids))
+    return;
+  if (window == root)
+    top_p = False;
+
+  XGetWindowAttributes (si->dpy, window, &attrs);
+  events = ((attrs.all_event_masks | attrs.do_not_propagate_mask)
+           & KeyPressMask);
+
+  /* Select for SubstructureNotify on all windows.
+     Select for KeyPress on all windows that already have it selected.
+
+     Note that we can't select for ButtonPress, because of X braindamage:
+     only one client at a time may select for ButtonPress on a given
+     window, though any number can select for KeyPress.  Someone explain
+     *that* to me.
+
+     So, if the user spends a while clicking the mouse without ever moving
+     the mouse or touching the keyboard, we won't know that they've been
+     active, and the screensaver will come on.  That sucks, but I don't
+     know how to get around it.
+   */
+  XSelectInput (si->dpy, window, SubstructureNotifyMask | events);
+
+  if (top_p && p->verbose_p && (events & KeyPressMask))
+    {
+      /* Only mention one window per tree (hack hack). */
+      fprintf (stderr, "%s: selected KeyPress on 0x%lX\n", blurb(),
+              (unsigned long) window);
+      top_p = False;
+    }
+
+  if (kids)
+    {
+      while (nkids)
+       notice_events (si, kids [--nkids], top_p);
+      XFree ((char *) kids);
+    }
+}
+
+
+int
+BadWindow_ehandler (Display *dpy, XErrorEvent *error)
+{
+  /* When we notice a window being created, we spawn a timer that waits
+     30 seconds or so, and then selects events on that window.  This error
+     handler is used so that we can cope with the fact that the window
+     may have been destroyed <30 seconds after it was created.
+   */
+  if (error->error_code == BadWindow ||
+      error->error_code == BadMatch ||
+      error->error_code == BadDrawable)
+    return 0;
+  else
+    return saver_ehandler (dpy, error);
+}
+
+
+struct notice_events_timer_arg {
+  saver_info *si;
+  Window w;
+};
+
+static void
+notice_events_timer (XtPointer closure, XtIntervalId *id)
+{
+  struct notice_events_timer_arg *arg =
+    (struct notice_events_timer_arg *) closure;
+
+  XErrorHandler old_handler = XSetErrorHandler (BadWindow_ehandler);
+
+  saver_info *si = arg->si;
+  Window window = arg->w;
+
+  free(arg);
+  notice_events (si, window, True);
+  XSync (si->dpy, False);
+  XSetErrorHandler (old_handler);
+}
+
+void
+start_notice_events_timer (saver_info *si, Window w, Bool verbose_p)
+{
+  saver_preferences *p = &si->prefs;
+  struct notice_events_timer_arg *arg =
+    (struct notice_events_timer_arg *) malloc(sizeof(*arg));
+  arg->si = si;
+  arg->w = w;
+  XtAppAddTimeOut (si->app, p->notice_events_timeout, notice_events_timer,
+                  (XtPointer) arg);
+
+  if (verbose_p)
+    fprintf (stderr, "%s: starting notice_events_timer for 0x%X (%lu)\n",
+             blurb(), (unsigned int) w, p->notice_events_timeout);
+}
+
+
+/* When the screensaver is active, this timer will periodically change
+   the running program.
+ */
+void
+cycle_timer (XtPointer closure, XtIntervalId *id)
+{
+  saver_info *si = (saver_info *) closure;
+  saver_preferences *p = &si->prefs;
+  Time how_long = p->cycle;
+
+  if (si->selection_mode > 0 &&
+      screenhack_running_p (si))
+    /* If we're in "SELECT n" mode, the cycle timer going off will just
+       restart this same hack again.  There's not much point in doing this
+       every 5 or 10 minutes, but on the other hand, leaving one hack running
+       for days is probably not a great idea, since they tend to leak and/or
+       crash.  So, restart the thing once an hour. */
+    how_long = 1000 * 60 * 60;
+
+  if (si->dbox_up_p)
+    {
+      if (p->verbose_p)
+       fprintf (stderr, "%s: dialog box up; delaying hack change.\n",
+                blurb());
+      how_long = 30000; /* 30 secs */
+    }
+  else
+    {
+      maybe_reload_init_file (si);
+      if (p->verbose_p)
+       fprintf (stderr, "%s: changing graphics hacks.\n", blurb());
+      kill_screenhack (si);
+
+      if (!si->throttled_p)
+        spawn_screenhack (si, False);
+      else
+        {
+          raise_window (si, True, True, False);
+          if (p->verbose_p)
+            fprintf (stderr, "%s: not launching new hack (throttled.)\n",
+                     blurb());
+        }
+    }
+
+  si->cycle_id = XtAppAddTimeOut (si->app, how_long, cycle_timer,
+                                 (XtPointer) si);
+
+#ifdef DEBUG_TIMERS
+  if (p->verbose_p)
+    fprintf (stderr, "%s: starting cycle_timer (%ld, %ld)\n",
+           blurb(), how_long, si->cycle_id);
+#endif /* DEBUG_TIMERS */
+}
+
+
+void
+activate_lock_timer (XtPointer closure, XtIntervalId *id)
+{
+  saver_info *si = (saver_info *) closure;
+  saver_preferences *p = &si->prefs;
+
+  if (p->verbose_p)
+    fprintf (stderr, "%s: timed out; activating lock.\n", blurb());
+  set_locked_p (si, True);
+}
+
+
+/* Call this when user activity (or "simulated" activity) has been noticed.
+ */
+static void
+reset_timers (saver_info *si)
+{
+  saver_preferences *p = &si->prefs;
+  if (si->using_mit_saver_extension || si->using_sgi_saver_extension)
+    return;
+
+  if (si->timer_id)
+    {
+#ifdef DEBUG_TIMERS
+      if (p->verbose_p)
+        fprintf (stderr, "%s: killing idle_timer  (%ld, %ld)\n",
+                 blurb(), p->timeout, si->timer_id);
+#endif /* DEBUG_TIMERS */
+      XtRemoveTimeOut (si->timer_id);
+    }
+
+  schedule_wakeup_event (si, p->timeout, p->verbose_p); /* sets si->timer_id */
+
+  if (si->cycle_id) abort ();  /* no cycle timer when inactive */
+
+  si->last_activity_time = time ((time_t *) 0);
+}
+
+
+/* When we aren't using a server extension, this timer is used to periodically
+   wake up and poll the mouse position, which is possibly more reliable than
+   selecting motion events on every window.
+ */
+static void
+check_pointer_timer (XtPointer closure, XtIntervalId *id)
+{
+  int i;
+  saver_info *si = (saver_info *) closure;
+  saver_preferences *p = &si->prefs;
+  Bool active_p = False;
+
+  if (!si->using_proc_interrupts &&
+      (si->using_xidle_extension ||
+       si->using_mit_saver_extension ||
+       si->using_sgi_saver_extension))
+    /* If an extension is in use, we should not be polling the mouse.
+       Unless we're also checking /proc/interrupts, in which case, we should.
+     */
+    abort ();
+
+  si->check_pointer_timer_id =
+    XtAppAddTimeOut (si->app, p->pointer_timeout, check_pointer_timer,
+                    (XtPointer) si);
+
+  for (i = 0; i < si->nscreens; i++)
+    {
+      saver_screen_info *ssi = &si->screens[i];
+      Window root, child;
+      int root_x, root_y, x, y;
+      unsigned int mask;
+
+      XQueryPointer (si->dpy, ssi->screensaver_window, &root, &child,
+                    &root_x, &root_y, &x, &y, &mask);
+
+      if (root_x == ssi->poll_mouse_last_root_x &&
+         root_y == ssi->poll_mouse_last_root_y &&
+         child  == ssi->poll_mouse_last_child &&
+         mask   == ssi->poll_mouse_last_mask)
+       continue;
+
+      active_p = True;
+
+#ifdef DEBUG_TIMERS
+      if (p->verbose_p)
+       if (root_x == ssi->poll_mouse_last_root_x &&
+           root_y == ssi->poll_mouse_last_root_y &&
+           child  == ssi->poll_mouse_last_child)
+         fprintf (stderr, "%s: modifiers changed at %s on screen %d.\n",
+                  blurb(), timestring(), i);
+       else
+         fprintf (stderr, "%s: pointer moved at %s on screen %d.\n",
+                  blurb(), timestring(), i);
+#endif /* DEBUG_TIMERS */
+
+      si->last_activity_screen    = ssi;
+      ssi->poll_mouse_last_root_x = root_x;
+      ssi->poll_mouse_last_root_y = root_y;
+      ssi->poll_mouse_last_child  = child;
+      ssi->poll_mouse_last_mask   = mask;
+    }
+
+#ifdef HAVE_PROC_INTERRUPTS
+  if (!active_p &&
+      si->using_proc_interrupts &&
+      proc_interrupts_activity_p (si))
+    {
+# ifdef DEBUG_TIMERS
+      if (p->verbose_p)
+        fprintf (stderr, "%s: /proc/interrupts activity at %s.\n",
+                 blurb(), timestring());
+# endif /* DEBUG_TIMERS */
+      active_p = True;
+    }
+#endif /* HAVE_PROC_INTERRUPTS */
+
+
+  if (active_p)
+    reset_timers (si);
+
+  check_for_clock_skew (si);
+}
+
+
+/* An unfortunate situation is this: the saver is not active, because the
+   user has been typing.  The machine is a laptop.  The user closes the lid
+   and suspends it.  The CPU halts.  Some hours later, the user opens the
+   lid.  At this point, Xt's timers will fire, and xscreensaver will blank
+   the screen.
+
+   So far so good -- well, not really, but it's the best that we can do,
+   since the OS doesn't send us a signal *before* shutdown -- but if the
+   user had delayed locking (lockTimeout > 0) then we should start off
+   in the locked state, rather than only locking N minutes from when the
+   lid was opened.  Also, eschewing fading is probably a good idea, to
+   clamp down as soon as possible.
+
+   We only do this when we'd be polling the mouse position anyway.
+   This amounts to an assumption that machines with APM support also
+   have /proc/interrupts.
+ */
+static void
+check_for_clock_skew (saver_info *si)
+{
+  saver_preferences *p = &si->prefs;
+  time_t now = time ((time_t *) 0);
+  long shift = now - si->last_wall_clock_time;
+
+#ifdef DEBUG_TIMERS
+  if (p->verbose_p)
+    fprintf (stderr, "%s: checking wall clock (%d).\n", blurb(),
+             (si->last_wall_clock_time == 0 ? 0 : shift));
+#endif /* DEBUG_TIMERS */
+
+  if (si->last_wall_clock_time != 0 &&
+      shift > (p->timeout / 1000))
+    {
+      if (p->verbose_p)
+        fprintf (stderr, "%s: wall clock has jumped by %d:%02d:%02d!\n",
+                 blurb(),
+                 (shift / (60 * 60)), ((shift / 60) % 60), (shift % 60));
+
+      si->emergency_lock_p = True;
+      idle_timer ((XtPointer) si, 0);
+    }
+
+  si->last_wall_clock_time = now;
+}
+
+
+
+static void
+dispatch_event (saver_info *si, XEvent *event)
+{
+  /* If this is for the splash dialog, pass it along.
+     Note that the password dialog is handled with its own event loop,
+     so events for that window will never come through here.
+   */
+  if (si->splash_dialog && event->xany.window == si->splash_dialog)
+    handle_splash_event (si, event);
+
+  XtDispatchEvent (event);
+}
+
+
+/* methods of detecting idleness:
+
+      explicitly informed by SGI SCREEN_SAVER server event;
+      explicitly informed by MIT-SCREEN-SAVER server event;
+      poll server idle time with XIDLE extension;
+      select events on all windows, and note absence of recent events;
+      note that /proc/interrupts has not changed in a while;
+      activated by clientmessage.
+
+   methods of detecting non-idleness:
+
+      read events on the xscreensaver window;
+      explicitly informed by SGI SCREEN_SAVER server event;
+      explicitly informed by MIT-SCREEN-SAVER server event;
+      select events on all windows, and note events on any of them;
+      note that /proc/interrupts has changed;
+      deactivated by clientmessage.
+
+   I trust that explains why this function is a big hairy mess.
+ */
+void
+sleep_until_idle (saver_info *si, Bool until_idle_p)
+{
+  saver_preferences *p = &si->prefs;
+  XEvent event;
+
+  /* We need to select events on all windows if we're not using any extensions.
+     Otherwise, we don't need to. */
+  Bool scanning_all_windows = !(si->using_xidle_extension ||
+                                si->using_mit_saver_extension ||
+                                si->using_sgi_saver_extension);
+
+  /* We need to periodically wake up and check for idleness if we're not using
+     any extensions, or if we're using the XIDLE extension.  The other two
+     extensions explicitly deliver events when we go idle/non-idle, so we
+     don't need to poll. */
+  Bool polling_for_idleness = !(si->using_mit_saver_extension ||
+                                si->using_sgi_saver_extension);
+
+  /* Whether we need to periodically wake up and check to see if the mouse has
+     moved.  We only need to do this when not using any extensions.  The reason
+     this isn't the same as `polling_for_idleness' is that the "idleness" poll
+     can happen (for example) 5 minutes from now, whereas the mouse-position
+     poll should happen with low periodicity.  We don't need to poll the mouse
+     position with the XIDLE extension, but we do need to periodically wake up
+     and query the server with that extension.  For our purposes, polling
+     /proc/interrupts is just like polling the mouse position.  It has to
+     happen on the same kind of schedule. */
+  Bool polling_mouse_position = (si->using_proc_interrupts ||
+                                 !(si->using_xidle_extension ||
+                                   si->using_mit_saver_extension ||
+                                   si->using_sgi_saver_extension));
+
+  if (until_idle_p)
+    {
+      if (polling_for_idleness)
+        /* This causes a no-op event to be delivered to us in a while, so that
+           we come back around through the event loop again.  Use of this timer
+           is economical: for example, if the screensaver should come on in 5
+           minutes, and the user has been idle for 2 minutes, then this
+           timeout will go off no sooner than 3 minutes from now.  */
+        schedule_wakeup_event (si, p->timeout, p->verbose_p);
+
+      if (polling_mouse_position)
+        /* Check to see if the mouse has moved, and set up a repeating timer
+           to do so periodically (typically, every 5 seconds.) */
+       check_pointer_timer ((XtPointer) si, 0);
+    }
+
+  while (1)
+    {
+      XtAppNextEvent (si->app, &event);
+
+      switch (event.xany.type) {
+      case 0:          /* our synthetic "timeout" event has been signalled */
+       if (until_idle_p)
+         {
+           Time idle;
+#ifdef HAVE_XIDLE_EXTENSION
+           if (si->using_xidle_extension)
+             {
+                /* The XIDLE extension uses the synthetic event to prod us into
+                   re-asking the server how long the user has been idle. */
+               if (! XGetIdleTime (si->dpy, &idle))
+                 {
+                   fprintf (stderr, "%s: XGetIdleTime() failed.\n", blurb());
+                   saver_exit (si, 1, 0);
+                 }
+             }
+           else
+#endif /* HAVE_XIDLE_EXTENSION */
+#ifdef HAVE_MIT_SAVER_EXTENSION
+             if (si->using_mit_saver_extension)
+               {
+                 /* We don't need to do anything in this case - the synthetic
+                    event isn't necessary, as we get sent specific events
+                    to wake us up.  In fact, this event generally shouldn't
+                     be being delivered when the MIT extension is in use. */
+                 idle = 0;
+               }
+           else
+#endif /* HAVE_MIT_SAVER_EXTENSION */
+#ifdef HAVE_SGI_SAVER_EXTENSION
+             if (si->using_sgi_saver_extension)
+               {
+                 /* We don't need to do anything in this case - the synthetic
+                    event isn't necessary, as we get sent specific events
+                    to wake us up.  In fact, this event generally shouldn't
+                     be being delivered when the SGI extension is in use. */
+                 idle = 0;
+               }
+           else
+#endif /* HAVE_SGI_SAVER_EXTENSION */
+             {
+                /* Otherwise, no server extension is in use.  The synthetic
+                   event was to tell us to wake up and see if the user is now
+                   idle.  Compute the amount of idle time by comparing the
+                   `last_activity_time' to the wall clock.  The l_a_t was set
+                   by calling `reset_timers()', which is called only in only
+                   two situations: when polling the mouse position has revealed
+                   the the mouse has moved (user activity) or when we have read
+                   an event (again, user activity.)
+                 */
+               idle = 1000 * (si->last_activity_time - time ((time_t *) 0));
+             }
+
+           if (idle >= p->timeout)
+              {
+                /* Look, we've been idle long enough.  We're done. */
+                goto DONE;
+              }
+            else if (si->emergency_lock_p)
+              {
+                /* Oops, the wall clock has jumped far into the future, so
+                   we need to lock down in a hurry! */
+                goto DONE;
+              }
+            else
+              {
+                /* The event went off, but it turns out that the user has not
+                   yet been idle for long enough.  So re-signal the event.
+                   */
+                if (polling_for_idleness)
+                  schedule_wakeup_event (si, p->timeout - idle, p->verbose_p);
+              }
+         }
+       break;
+
+      case ClientMessage:
+       if (handle_clientmessage (si, &event, until_idle_p))
+         goto DONE;
+       break;
+
+      case CreateNotify:
+        /* A window has been created on the screen somewhere.  If we're
+           supposed to scan all windows for events, prepare this window. */
+       if (scanning_all_windows)
+         {
+            Window w = event.xcreatewindow.window;
+#ifdef DEBUG_TIMERS
+           start_notice_events_timer (si, w, p->verbose_p);
+#else  /* !DEBUG_TIMERS */
+           start_notice_events_timer (si, w, False);
+#endif /* !DEBUG_TIMERS */
+         }
+       break;
+
+      case KeyPress:
+      case KeyRelease:
+      case ButtonPress:
+      case ButtonRelease:
+      case MotionNotify:
+
+#ifdef DEBUG_TIMERS
+       if (p->verbose_p)
+         {
+           if (event.xany.type == MotionNotify)
+             fprintf (stderr,"%s: MotionNotify at %s\n",blurb(),timestring());
+           else if (event.xany.type == KeyPress)
+             fprintf (stderr, "%s: KeyPress seen on 0x%X at %s\n", blurb(),
+                      (unsigned int) event.xkey.window, timestring ());
+           else if (event.xany.type == ButtonPress)
+             fprintf (stderr, "%s: ButtonPress seen on 0x%X at %s\n", blurb(),
+                      (unsigned int) event.xbutton.window, timestring ());
+         }
+#endif /* DEBUG_TIMERS */
+
+       /* If any widgets want to handle this event, let them. */
+       dispatch_event (si, &event);
+
+       /* We got a user event.
+          If we're waiting for the user to become active, this is it.
+          If we're waiting until the user becomes idle, reset the timers
+          (since now we have longer to wait.)
+        */
+       if (!until_idle_p)
+         {
+           if (si->demoing_p &&
+               (event.xany.type == MotionNotify ||
+                event.xany.type == KeyRelease))
+             /* When we're demoing a single hack, mouse motion doesn't
+                cause deactivation.  Only clicks and keypresses do. */
+             ;
+           else
+             /* If we're not demoing, then any activity causes deactivation.
+              */
+             goto DONE;
+         }
+       else
+         reset_timers (si);
+
+       break;
+
+      default:
+
+#ifdef HAVE_MIT_SAVER_EXTENSION
+       if (event.type == si->mit_saver_ext_event_number)
+         {
+            /* This event's number is that of the MIT-SCREEN-SAVER server
+               extension.  This extension has one event number, and the event
+               itself contains sub-codes that say what kind of event it was
+               (an "idle" or "not-idle" event.)
+             */
+           XScreenSaverNotifyEvent *sevent =
+             (XScreenSaverNotifyEvent *) &event;
+           if (sevent->state == ScreenSaverOn)
+             {
+               int i = 0;
+               if (p->verbose_p)
+                 fprintf (stderr, "%s: MIT ScreenSaverOn event received.\n",
+                          blurb());
+
+               /* Get the "real" server window(s) out of the way as soon
+                  as possible. */
+               for (i = 0; i < si->nscreens; i++)
+                 {
+                   saver_screen_info *ssi = &si->screens[i];
+                   if (ssi->server_mit_saver_window &&
+                       window_exists_p (si->dpy,
+                                        ssi->server_mit_saver_window))
+                     XUnmapWindow (si->dpy, ssi->server_mit_saver_window);
+                 }
+
+               if (sevent->kind != ScreenSaverExternal)
+                 {
+                   fprintf (stderr,
+                        "%s: ScreenSaverOn event wasn't of type External!\n",
+                            blurb());
+                 }
+
+               if (until_idle_p)
+                 goto DONE;
+             }
+           else if (sevent->state == ScreenSaverOff)
+             {
+               if (p->verbose_p)
+                 fprintf (stderr, "%s: MIT ScreenSaverOff event received.\n",
+                          blurb());
+               if (!until_idle_p)
+                 goto DONE;
+             }
+           else
+             fprintf (stderr,
+                      "%s: unknown MIT-SCREEN-SAVER event %d received!\n",
+                      blurb(), sevent->state);
+         }
+       else
+
+#endif /* HAVE_MIT_SAVER_EXTENSION */
+
+
+#ifdef HAVE_SGI_SAVER_EXTENSION
+       if (event.type == (si->sgi_saver_ext_event_number + ScreenSaverStart))
+         {
+            /* The SGI SCREEN_SAVER server extension has two event numbers,
+               and this event matches the "idle" event. */
+           if (p->verbose_p)
+             fprintf (stderr, "%s: SGI ScreenSaverStart event received.\n",
+                      blurb());
+
+           if (until_idle_p)
+             goto DONE;
+         }
+       else if (event.type == (si->sgi_saver_ext_event_number +
+                               ScreenSaverEnd))
+         {
+            /* The SGI SCREEN_SAVER server extension has two event numbers,
+               and this event matches the "idle" event. */
+           if (p->verbose_p)
+             fprintf (stderr, "%s: SGI ScreenSaverEnd event received.\n",
+                      blurb());
+           if (!until_idle_p)
+             goto DONE;
+         }
+       else
+#endif /* HAVE_SGI_SAVER_EXTENSION */
+
+          /* Just some random event.  Let the Widgets handle it, if desired. */
+         dispatch_event (si, &event);
+      }
+    }
+ DONE:
+
+
+  /* If there's a user event on the queue, swallow it.
+     If we're using a server extension, and the user becomes active, we
+     get the extension event before the user event -- so the keypress or
+     motion or whatever is still on the queue.  This makes "unfade" not
+     work, because it sees that event, and bugs out.  (This problem
+     doesn't exhibit itself without an extension, because in that case,
+     there's only one event generated by user activity, not two.)
+   */
+  XCheckMaskEvent (si->dpy, (KeyPressMask|ButtonPressMask|PointerMotionMask),
+                  &event);
+
+
+  if (si->check_pointer_timer_id)
+    {
+      XtRemoveTimeOut (si->check_pointer_timer_id);
+      si->check_pointer_timer_id = 0;
+    }
+  if (si->timer_id)
+    {
+      XtRemoveTimeOut (si->timer_id);
+      si->timer_id = 0;
+    }
+
+  if (until_idle_p && si->cycle_id)    /* no cycle timer when inactive */
+    abort ();
+
+  return;
+}
+
+
+\f
+/* Some crap for dealing with /proc/interrupts.
+
+   On Linux systems, it's possible to see the hardware interrupt count
+   associated with the keyboard.  We can therefore use that as another method
+   of detecting idleness.
+
+   Why is it a good idea to do this?  Because it lets us detect keyboard
+   activity that is not associated with X events.  For example, if the user
+   has switched to another virtual console, it's good for xscreensaver to not
+   be running graphics hacks on the (non-visible) X display.  The common
+   complaint that checking /proc/interrupts addresses is that the user is
+   playing Quake on a non-X console, and the GL hacks are perceptibly slowing
+   the game...
+
+   This is tricky for a number of reasons.
+
+     * First, we must be sure to only do this when running on an X server that
+       is on the local machine (because otherwise, we'd be reacting to the
+       wrong keyboard.)  The way we do this is by noting that the $DISPLAY is
+       pointing to display 0 on the local machine.  It *could* be that display
+       1 is also on the local machine (e.g., two X servers, each on a different
+       virtual-terminal) but it's also possible that screen 1 is an X terminal,
+       using this machine as the host.  So we can't take that chance.
+
+     * Second, one can only access these interrupt numbers in a completely
+       and utterly brain-damaged way.  You would think that one would use an
+       ioctl for this.  But no.  The ONLY way to get this information is to
+       open the pseudo-file /proc/interrupts AS A FILE, and read the numbers
+       out of it TEXTUALLY.  Because this is Unix, and all the world's a file,
+       and the only real data type is the short-line sequence of ASCII bytes.
+
+       Now it's all well and good that the /proc/interrupts pseudo-file
+       exists; that's a clever idea, and a useful API for things that are
+       already textually oriented, like shell scripts, and users doing
+       interactive debugging sessions.  But to make a *C PROGRAM* open a file
+       and parse the textual representation of integers out of it is just
+       insane.
+
+     * Third, you can't just hold the file open, and fseek() back to the
+       beginning to get updated data!  If you do that, the data never changes.
+       And I don't want to call open() every five seconds, because I don't want
+       to risk going to disk for any inodes.  It turns out that if you dup()
+       it early, then each copy gets fresh data, so we can get around that in
+       this way (but for how many releases, one might wonder?)
+
+     * Fourth, the format of the output of the /proc/interrupts file is
+       undocumented, and has changed several times already!  In Linux 2.0.33,
+       even on a multiprocessor machine, it looks like this:
+
+          0:  309453991   timer
+          1:    4771729   keyboard
+   
+       but on later kernels with MP machines, it looks like this:
+
+                   CPU0       CPU1
+          0:    1671450    1672618    IO-APIC-edge  timer
+          1:      13037      13495    IO-APIC-edge  keyboard
+
+       Joy!  So how are we expected to parse that?  Well, this code doesn't
+       parse it: it saves the last line with the string "keyboard" in it, and
+       does a string-comparison to note when it has changed.
+
+   Thanks to Nat Friedman <nat@nat.org> for figuring out all of this crap.
+
+   Note that this only checks for lines with "keyboard" or "PS/2 Mouse" in
+   them.  If you have a serial mouse, it won't detect that, it will only detect
+   keyboard activity.  That's because there's no way to tell the difference
+   between a serial mouse and a general serial port, and it would be somewhat
+   unfortunate to have the screensaver turn off when the modem on COM1 burped.
+ */
+
+
+#ifdef HAVE_PROC_INTERRUPTS
+
+#define PROC_INTERRUPTS "/proc/interrupts"
+
+Bool
+query_proc_interrupts_available (saver_info *si, const char **why)
+{
+  /* We can use /proc/interrupts if $DISPLAY points to :0, and if the
+     "/proc/interrupts" file exists and is readable.
+   */
+  FILE *f;
+  if (why) *why = 0;
+
+  if (!display_is_on_console_p (si))
+    {
+      if (why) *why = "not on primary console";
+      return False;
+    }
+
+  f = fopen (PROC_INTERRUPTS, "r");
+  if (!f)
+    return False;
+
+  fclose (f);
+  return True;
+}
+
+
+static Bool
+proc_interrupts_activity_p (saver_info *si)
+{
+  static FILE *f0 = 0;
+  FILE *f1 = 0;
+  int fd;
+  static char last_kbd_line[255] = { 0, };
+  static char last_ptr_line[255] = { 0, };
+  char new_line[sizeof(last_kbd_line)];
+  Bool got_kbd = False, kbd_diff = False;
+  Bool got_ptr = False, ptr_diff = False;
+
+  if (!f0)
+    {
+      /* First time -- open the file. */
+      f0 = fopen (PROC_INTERRUPTS, "r");
+      if (!f0)
+        {
+          char buf[255];
+          sprintf(buf, "%s: error opening %s", blurb(), PROC_INTERRUPTS);
+          perror (buf);
+          goto FAIL;
+        }
+    }
+
+  if (f0 == (FILE *) -1)           /* means we got an error initializing. */
+    return False;
+
+  fd = dup (fileno (f0));
+  if (fd < 0)
+    {
+      char buf[255];
+      sprintf(buf, "%s: could not dup() the %s fd", blurb(), PROC_INTERRUPTS);
+      perror (buf);
+      goto FAIL;
+    }
+
+  f1 = fdopen (fd, "r");
+  if (!f1)
+    {
+      char buf[255];
+      sprintf(buf, "%s: could not fdopen() the %s fd", blurb(),
+              PROC_INTERRUPTS);
+      perror (buf);
+      goto FAIL;
+    }
+
+  /* Actually, I'm unclear on why this fseek() is necessary, given the timing
+     of the dup() above, but it is. */
+  if (fseek (f1, 0, SEEK_SET) != 0)
+    {
+      char buf[255];
+      sprintf(buf, "%s: error rewinding %s", blurb(), PROC_INTERRUPTS);
+      perror (buf);
+      goto FAIL;
+    }
+
+  /* Now read through the pseudo-file until we find the "keyboard" line. */
+
+  while (fgets (new_line, sizeof(new_line)-1, f1))
+    {
+      if (!got_kbd && strstr (new_line, "keyboard"))
+        {
+          kbd_diff = (*last_kbd_line && !!strcmp (new_line, last_kbd_line));
+          strcpy (last_kbd_line, new_line);
+          got_kbd = True;
+        }
+      else if (!got_ptr && strstr (new_line, "PS/2 Mouse"))
+        {
+          ptr_diff = (*last_ptr_line && !!strcmp (new_line, last_ptr_line));
+          strcpy (last_ptr_line, new_line);
+          got_ptr = True;
+        }
+
+      if (got_kbd && got_ptr)
+        break;
+    }
+
+  if (got_kbd || got_ptr)
+    {
+      fclose (f1);
+      return (kbd_diff || ptr_diff);
+    }
+
+
+  /* If we got here, we didn't find either a "keyboard" or a "PS/2 Mouse"
+     line in the file at all. */
+  fprintf (stderr, "%s: no keyboard or mouse data in %s?\n",
+           blurb(), PROC_INTERRUPTS);
+
+ FAIL:
+  if (f1)
+    fclose (f1);
+
+  if (f0 && f0 != (FILE *) -1)
+    fclose (f0);
+
+  f0 = (FILE *) -1;
+  return False;
+}
+
+#endif /* HAVE_PROC_INTERRUPTS */
+
+\f
+/* This timer goes off every few minutes, whether the user is idle or not,
+   to try and clean up anything that has gone wrong.
+
+   It calls disable_builtin_screensaver() so that if xset has been used,
+   or some other program (like xlock) has messed with the XSetScreenSaver()
+   settings, they will be set back to sensible values (if a server extension
+   is in use, messing with xlock can cause xscreensaver to never get a wakeup
+   event, and could cause monitor power-saving to occur, and all manner of
+   heinousness.)
+
+   If the screen is currently blanked, it raises the window, in case some
+   other window has been mapped on top of it.
+
+   If the screen is currently blanked, and there is no hack running, it
+   clears the window, in case there is an error message printed on it (we
+   don't want the error message to burn in.)
+ */
+
+static void
+watchdog_timer (XtPointer closure, XtIntervalId *id)
+{
+  saver_info *si = (saver_info *) closure;
+
+  disable_builtin_screensaver (si, False);
+
+  if (si->screen_blanked_p)
+    {
+      Bool running_p = screenhack_running_p (si);
+
+      if (si->dbox_up_p)
+        {
+#ifdef DEBUG_TIMERS
+          if (si->prefs.verbose_p)
+            fprintf (stderr, "%s: dialog box is up: not raising screen.\n",
+                     blurb());
+#endif /* DEBUG_TIMERS */
+        }
+      else
+        {
+#ifdef DEBUG_TIMERS
+          if (si->prefs.verbose_p)
+            fprintf (stderr, "%s: watchdog timer raising %sscreen.\n",
+                     blurb(), (running_p ? "" : "and clearing "));
+#endif /* DEBUG_TIMERS */
+
+          raise_window (si, True, True, running_p);
+        }
+
+      if (!monitor_powered_on_p (si))
+       {
+         if (si->prefs.verbose_p)
+           fprintf (stderr,
+                    "%s: server reports that monitor has powered down; "
+                    "killing running hacks.\n", blurb());
+         kill_screenhack (si);
+       }
+
+      /* Re-schedule this timer.  The watchdog timer defaults to a bit less
+         than the hack cycle period, but is never longer than one hour.
+       */
+      si->watchdog_id = 0;
+      reset_watchdog_timer (si, True);
+    }
+}
+
+
+void
+reset_watchdog_timer (saver_info *si, Bool on_p)
+{
+  saver_preferences *p = &si->prefs;
+
+  if (si->watchdog_id)
+    {
+      XtRemoveTimeOut (si->watchdog_id);
+      si->watchdog_id = 0;
+    }
+
+  if (on_p && p->watchdog_timeout)
+    {
+      si->watchdog_id = XtAppAddTimeOut (si->app, p->watchdog_timeout,
+                                        watchdog_timer, (XtPointer) si);
+
+#ifdef DEBUG_TIMERS
+      if (p->verbose_p)
+       fprintf (stderr, "%s: restarting watchdog_timer (%ld, %ld)\n",
+                blurb(), p->watchdog_timeout, si->watchdog_id);
+#endif /* DEBUG_TIMERS */
+
+    }
+}
diff --git a/driver/vms-getpwnam.c b/driver/vms-getpwnam.c
new file mode 100644 (file)
index 0000000..ec0650c
--- /dev/null
@@ -0,0 +1,129 @@
+/*
+ *     getpwnam(name) - retrieves a UAF entry
+ *
+ *     Author:         Patrick L. Mahan
+ *     Location:       TGV, Inc
+ *     Date:           15-Nov-1991
+ *
+ *     Purpose:        Provides emulation for the UNIX getpwname routine.
+ *
+ *     Modification History
+ *
+ *     Date        | Who       | Version       | Reason
+ *     ------------+-----------+---------------+---------------------------
+ *     15-Nov-1991 | PLM       | 1.0           | First Write
+ */
+
+#define PASSWDROUTINES
+
+#include <stdio.h>
+#include <descrip.h>
+#include <uaidef.h>
+#include <string.h>
+#include <stdlib.h>
+#include <starlet.h>
+#include "vms-pwd.h"
+
+struct uic {
+   unsigned short uid;
+   unsigned short gid;
+};
+
+#define TEST(ptr, str) { if (ptr == NULL) {    \
+                               fprintf(stderr, "getpwnam: memory allocation failure for \"%s\"\n",     \
+                                       str);   \
+                               return ((struct passwd *)(NULL));       \
+                         } }
+
+struct passwd *getpwnam(name)
+char *name;
+{
+   int  istatus;
+   int  UserNameLen;
+   int  UserOwnerLen;
+   int  UserDeviceLen;
+   int  UserDirLen;
+   static char UserName[13];
+   static char UserOwner[32];
+   static char UserDevice[32];
+   static char UserDir[64];
+   char *cptr, *sptr;
+   unsigned long int UserPwd[2];
+   unsigned short int UserSalt;
+   unsigned long int UserEncrypt;
+   struct uic UicValue;
+   struct passwd *entry;
+
+   struct dsc$descriptor_s VMSNAME = 
+       {strlen(name), DSC$K_DTYPE_T, DSC$K_CLASS_S, name};
+
+   struct itmlist3 {
+       unsigned short int length;
+       unsigned short int item;
+       unsigned long  int addr;
+       unsigned long  int retaddr;
+   } ItemList[] = {
+       {12, UAI$_USERNAME, (unsigned long)&UserName, (unsigned long)&UserNameLen},
+       {8,  UAI$_PWD, (unsigned long)&UserPwd, 0},
+       {4,  UAI$_UIC, (unsigned long)&UicValue, 0},
+       {32, UAI$_OWNER, (unsigned long)&UserOwner, (unsigned long)&UserOwnerLen},
+       {32, UAI$_DEFDEV, (unsigned long)&UserDevice, (unsigned long)&UserDeviceLen},
+       {64, UAI$_DEFDIR, (unsigned long)&UserDir, (unsigned long)&UserDirLen},
+       {2,  UAI$_SALT, (unsigned long)&UserSalt, 0},
+       {4,  UAI$_ENCRYPT, (unsigned long)&UserEncrypt, 0},
+       {0, 0, 0, 0}
+   };
+
+   UserNameLen = 0;
+   istatus = sys$getuai (0, 0, &VMSNAME, &ItemList, 0, 0, 0);
+
+   if (!(istatus & 1)) {
+       fprintf (stderr, "getpwnam: unable to retrieve passwd entry for %s\n",
+                 name);
+       fprintf (stderr, "getpwnam: vms error number is 0x%x\n", istatus);
+       return ((struct passwd *)NULL);
+   }
+
+   entry = (struct passwd *) calloc (1, sizeof(struct passwd));
+   TEST(entry, "PASSWD_ENTRY");
+
+   entry->pw_uid = UicValue.uid;
+   entry->pw_gid = UicValue.gid;
+   entry->pw_salt = UserSalt;
+   entry->pw_encrypt = UserEncrypt;
+
+   sptr = UserName;
+   cptr = calloc (UserNameLen+1, sizeof(char));
+   TEST(cptr, "USERNAME");
+   strncpy (cptr, sptr, UserNameLen);
+   cptr[UserNameLen] = '\0';
+   entry->pw_name = cptr;
+
+   cptr = calloc(8, sizeof(char));
+   TEST(cptr, "PASSWORD");
+   memcpy(cptr, UserPwd, 8);
+   entry->pw_passwd = cptr;
+
+   sptr = UserOwner; sptr++;
+   cptr = calloc ((int)UserOwner[0]+1, sizeof(char));
+   TEST(cptr, "FULLNAME");
+   strncpy (cptr, sptr, (int)UserOwner[0]);
+   cptr[(int)UserOwner[0]] = '\0';
+   entry->pw_gecos = cptr;
+
+   cptr = calloc ((int)UserDevice[0]+(int)UserDir[0]+1, sizeof(char));
+   TEST(cptr, "HOME");
+   sptr = UserDevice; sptr++;
+   strncpy (cptr, sptr, (int)UserDevice[0]);
+   sptr = UserDir; sptr++;
+   strncat (cptr, sptr, (int)UserDir[0]);
+   cptr[(int)UserDevice[0]+(int)UserDir[0]] = '\0';
+   entry->pw_dir = cptr;
+
+   cptr = calloc (strlen("SYS$SYSTEM:LOGINOUT.EXE")+1, sizeof(char));
+   TEST(cptr,"SHELL");
+   strcpy (cptr, "SYS$SYSTEM:LOGINOUT.EXE");
+   entry->pw_shell = cptr;
+
+   return (entry);
+}
diff --git a/driver/vms-hpwd.c b/driver/vms-hpwd.c
new file mode 100644 (file)
index 0000000..707e3ea
--- /dev/null
@@ -0,0 +1,75 @@
+/*
+ *     VAX/VMS Password hashing routines:
+ *
+ *     uses the System Service SYS$HASH_PASSWORD
+ *
+ * Permission to use, copy, modify, distribute, and sell this software 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.  No representations are made about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or 
+ * implied warranty.
+ *
+ */
+
+#include <syidef.h>
+#include <descrip.h>
+#include <string.h>
+#include <starlet.h>
+/*
+ *     Hashing routine
+ */
+hash_vms_password(output_buf,input_buf,input_length,username,encryption_type,salt)
+char *output_buf;
+char *input_buf;
+int input_length;
+char *username;
+int encryption_type;
+unsigned short salt;
+{
+       struct dsc$descriptor_s password;
+       struct dsc$descriptor_s user;
+
+       /*
+        *  Check the VMS Version. If this is V5.4 or later, then
+        *  we can use the new system service SYS$HASH_PASSWORD.  Else
+        *  fail and return garbage.
+        */
+
+       static char VMS_Version[32];
+       struct {
+               unsigned short int Size;
+               unsigned short int Code;
+               char *Buffer;
+               unsigned short int *Resultant_Size;
+       } Item_List[2]={32, SYI$_VERSION, VMS_Version, 0, 0, 0};
+       struct {int Size; char *Ptr;} Descr1;
+
+       /*
+        *      Get the information
+        */
+       sys$getsyiw(0,0,0,Item_List,0,0,0);
+       /*
+        *      Call the old routine if this isn't V5.4 or later...
+        */
+#ifndef __DECC
+       if ((VMS_Version[1] < '5') ||
+           ((VMS_Version[1] == '5') && (VMS_Version[3] < '4'))) {
+               printf("Unsupported OS version\n");
+               return(1);
+       }
+#endif /* !__DECC */
+       /*
+        *      Call the SYS$HASH_PASSWORD system service...
+        */
+       password.dsc$b_dtype    = DSC$K_DTYPE_T;
+        password.dsc$b_class   = DSC$K_CLASS_S;
+        password.dsc$w_length  = input_length;
+       password.dsc$a_pointer  = input_buf;
+       user.dsc$b_dtype        = DSC$K_DTYPE_T;
+       user.dsc$b_class        = DSC$K_CLASS_S;
+       user.dsc$w_length       = strlen(username);
+       user.dsc$a_pointer      = username;
+       sys$hash_password (&password, encryption_type, salt, &user, output_buf);
+}
diff --git a/driver/vms-pwd.h b/driver/vms-pwd.h
new file mode 100644 (file)
index 0000000..6cb73d3
--- /dev/null
@@ -0,0 +1,48 @@
+/*     @(#)pwd.h 1.7 89/08/24 SMI; from S5R2 1.1       */
+
+#ifndef        __pwd_h
+#define        __pwd_h
+
+#ifdef vax11c
+#include <types.h>
+#else
+#include <sys/types.h>
+#endif /* vax11c */
+
+#ifdef PASSWDROUTINES
+#define        EXTERN
+#else
+#define EXTERN extern
+#endif /* PASSWDROUTINES */
+
+struct passwd {
+       char    *pw_name;
+       char    *pw_passwd;
+       int     pw_uid;
+       int     pw_gid;
+       short   pw_salt;
+       int     pw_encrypt;
+       char    *pw_age;
+       char    *pw_comment;
+       char    *pw_gecos;
+       char    *pw_dir;
+       char    *pw_shell;
+};
+
+
+#ifndef        _POSIX_SOURCE
+extern struct passwd *getpwent();
+
+struct comment {
+        char    *c_dept;
+        char    *c_name;
+        char    *c_acct;
+        char    *c_bin;
+};
+
+#endif
+
+EXTERN struct passwd *getpwuid(/* uid_t uid */);
+EXTERN struct passwd *getpwnam(/* char *name */);
+
+#endif /* !__pwd_h */
diff --git a/driver/vms-validate.c b/driver/vms-validate.c
new file mode 100644 (file)
index 0000000..8f7141d
--- /dev/null
@@ -0,0 +1,75 @@
+/*
+ *     validate a password for a user
+ *
+ * Permission to use, copy, modify, distribute, and sell this software 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.  No representations are made about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or 
+ * implied warranty.
+ */
+
+/*
+ * Includes
+ */
+#include <stdio.h>
+#include <ctype.h>
+#include <string.h>
+
+#include "vms-pwd.h"
+int hash_vms_password(char *output_buf,char *input_buf,int input_length,
+                      char *username,int encryption_type,unsigned short salt);
+
+/*
+ *
+ *     Validate a VMS UserName/Password pair.
+ *
+ */
+
+int validate_user(name,password)
+char *name;
+char *password;
+{
+       char password_buf[64];
+       char username_buf[31];
+       char encrypt_buf[8];
+       register int i;
+       register char *cp,*cp1;
+       struct passwd *user_entry;
+
+       /*
+        *      Get the users UAF entry
+        */
+       user_entry = getpwnam(name);
+
+       /*
+        *      If user_entry == NULL then we got a bad error
+        *      return -1 to indicate a bad error
+        */
+       if (user_entry == NULL) return (-1);
+
+       /*
+        *      Uppercase the password
+        */
+       cp = password;
+       cp1 = password_buf;
+       while (*cp)
+          if (islower(*cp))
+               *cp1++ = toupper(*cp++);
+          else
+               *cp1++ = *cp++;
+       /*
+        *      Get the length of the password
+        */
+       i = strlen(password);
+       /*
+        *      Encrypt the password
+        */
+       hash_vms_password(encrypt_buf,password_buf,i,user_entry->pw_name,
+                         user_entry->pw_encrypt, user_entry->pw_salt);
+       if (memcmp(encrypt_buf,user_entry->pw_passwd,8) == 0)
+               return(1);
+       else    return(0);
+}
+
diff --git a/driver/vms_axp.opt b/driver/vms_axp.opt
new file mode 100644 (file)
index 0000000..04d465d
--- /dev/null
@@ -0,0 +1,5 @@
+[-.UTILS]UTILS.OLB_AXP/LIB
+SYS$SHARE:DECW$XMLIBSHR.EXE/SHARE
+SYS$SHARE:DECW$XMULIBSHR.EXE/SHARE
+SYS$SHARE:DECW$XTSHR.EXE/SHARE
+SYS$SHARE:DECW$XLIBSHR.EXE/SHARE
diff --git a/driver/vms_axp_12.opt b/driver/vms_axp_12.opt
new file mode 100644 (file)
index 0000000..25dd1f1
--- /dev/null
@@ -0,0 +1,5 @@
+[-.UTILS]UTILS.OLB_AXP/LIB
+SYS$SHARE:DECW$XMLIBSHR12.EXE/SHARE
+SYS$SHARE:DECW$XMULIBSHRR5.EXE/SHARE
+SYS$SHARE:DECW$XTLIBSHRR5.EXE/SHARE
+SYS$SHARE:DECW$XLIBSHR.EXE/SHARE
diff --git a/driver/vms_decc.opt b/driver/vms_decc.opt
new file mode 100644 (file)
index 0000000..65bec03
--- /dev/null
@@ -0,0 +1,5 @@
+[-.UTILS]UTILS.OLB_DECC/LIB
+SYS$SHARE:DECW$XMLIBSHR.EXE/SHARE
+SYS$SHARE:DECW$XMULIBSHR.EXE/SHARE
+SYS$SHARE:DECW$XTSHR.EXE/SHARE
+SYS$SHARE:DECW$XLIBSHR.EXE/SHARE
diff --git a/driver/vms_decc_12.opt b/driver/vms_decc_12.opt
new file mode 100644 (file)
index 0000000..fdd9a80
--- /dev/null
@@ -0,0 +1,5 @@
+[-.UTILS]UTILS.OLB_DECC/LIB
+SYS$SHARE:DECW$XMLIBSHR12.EXE/SHARE
+SYS$SHARE:DECW$XMULIBSHRR5.EXE/SHARE
+SYS$SHARE:DECW$XTLIBSHRR5.EXE/SHARE
+SYS$SHARE:DECW$XLIBSHR.EXE/SHARE
diff --git a/driver/windows.c b/driver/windows.c
new file mode 100644 (file)
index 0000000..ded2697
--- /dev/null
@@ -0,0 +1,1538 @@
+/* windows.c --- turning the screen black; dealing with visuals, virtual roots.
+ * xscreensaver, Copyright (c) 1991-1998 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software 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.  No representations are made about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or 
+ * implied warranty.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#ifdef VMS
+# include <unixlib.h>          /* for getpid() */
+# include "vms-gtod.h"         /* for gettimeofday() */
+#endif /* VMS */
+
+#ifndef VMS
+# include <pwd.h>              /* for getpwuid() */
+#else /* VMS */
+# include "vms-pwd.h"
+#endif /* VMS */
+
+#ifdef HAVE_UNAME
+# include <sys/utsname.h>      /* for uname() */
+#endif /* HAVE_UNAME */
+
+#include <stdio.h>
+#include <X11/Xproto.h>                /* for CARD32 */
+#include <X11/Xlib.h>
+#include <X11/Xutil.h>         /* for XSetClassHint() */
+#include <X11/Xatom.h>
+#include <X11/Xos.h>           /* for time() */
+#include <signal.h>            /* for the signal names */
+
+#ifdef HAVE_MIT_SAVER_EXTENSION
+# include <X11/extensions/scrnsaver.h>
+#endif /* HAVE_MIT_SAVER_EXTENSION */
+
+#ifdef HAVE_XF86VMODE
+# include <X11/extensions/xf86vmode.h>
+#endif /* HAVE_XF86VMODE */
+
+
+/* This file doesn't need the Xt headers, so stub these types out... */
+#undef XtPointer
+#define XtAppContext void*
+#define XrmDatabase  void*
+#define XtIntervalId void*
+#define XtPointer    void*
+#define Widget       void*
+
+#include "xscreensaver.h"
+#include "visual.h"
+#include "fade.h"
+
+
+extern int kill (pid_t, int);          /* signal() is in sys/signal.h... */
+
+Atom XA_VROOT, XA_XSETROOT_ID;
+Atom XA_SCREENSAVER, XA_SCREENSAVER_VERSION, XA_SCREENSAVER_ID;
+Atom XA_SCREENSAVER_TIME;
+
+
+extern saver_info *global_si_kludge;   /* I hate C so much... */
+
+
+static void store_activate_time (saver_info *si, Bool use_last_p);
+
+#define ALL_POINTER_EVENTS \
+       (ButtonPressMask | ButtonReleaseMask | EnterWindowMask | \
+        LeaveWindowMask | PointerMotionMask | PointerMotionHintMask | \
+        Button1MotionMask | Button2MotionMask | Button3MotionMask | \
+        Button4MotionMask | Button5MotionMask | ButtonMotionMask)
+
+
+static const char *
+grab_string(int status)
+{
+  switch (status)
+    {
+    case GrabSuccess:     return "GrabSuccess";
+    case AlreadyGrabbed:  return "AlreadyGrabbed";
+    case GrabInvalidTime: return "GrabInvalidTime";
+    case GrabNotViewable: return "GrabNotViewable";
+    case GrabFrozen:      return "GrabFrozen";
+    default:
+      {
+       static char foo[255];
+       sprintf(foo, "unknown status: %d", status);
+       return foo;
+      }
+    }
+}
+
+static int
+grab_kbd(saver_info *si, Window w)
+{
+  saver_preferences *p = &si->prefs;
+  int status = XGrabKeyboard (si->dpy, w, True,
+                             /* I don't really understand Sync vs Async,
+                                but these seem to work... */
+                             GrabModeSync, GrabModeAsync,
+                             CurrentTime);
+  if (status == GrabSuccess)
+    si->keyboard_grab_window = w;
+
+  if (p->verbose_p)
+    fprintf(stderr, "%s: grabbing keyboard on 0x%x... %s.\n",
+           blurb(), (unsigned long) w, grab_string(status));
+  return status;
+}
+
+
+static int
+grab_mouse (saver_info *si, Window w, Cursor cursor)
+{
+  saver_preferences *p = &si->prefs;
+  int status = XGrabPointer (si->dpy, w, True, ALL_POINTER_EVENTS,
+                            GrabModeAsync, GrabModeAsync, w,
+                            cursor, CurrentTime);
+  if (status == GrabSuccess)
+    si->mouse_grab_window = w;
+
+  if (p->verbose_p)
+    fprintf(stderr, "%s: grabbing mouse on 0x%x... %s.\n",
+           blurb(), (unsigned long) w, grab_string(status));
+  return status;
+}
+
+
+static void
+ungrab_kbd(saver_info *si)
+{
+  saver_preferences *p = &si->prefs;
+  XUngrabKeyboard(si->dpy, CurrentTime);
+  if (p->verbose_p)
+    fprintf(stderr, "%s: ungrabbing keyboard (was 0x%x).\n", blurb(),
+           (unsigned long) si->keyboard_grab_window);
+  si->keyboard_grab_window = 0;
+}
+
+
+static void
+ungrab_mouse(saver_info *si)
+{
+  saver_preferences *p = &si->prefs;
+  XUngrabPointer(si->dpy, CurrentTime);
+  if (p->verbose_p)
+    fprintf(stderr, "%s: ungrabbing mouse (was 0x%x).\n", blurb(),
+           (unsigned long) si->mouse_grab_window);
+  si->mouse_grab_window = 0;
+}
+
+
+static Bool
+grab_keyboard_and_mouse (saver_info *si, Window window, Cursor cursor)
+{
+  Status mstatus, kstatus;
+  XSync (si->dpy, False);
+
+  kstatus = grab_kbd (si, window);
+  if (kstatus != GrabSuccess)
+    {  /* try again in a second */
+      sleep (1);
+      kstatus = grab_kbd (si, window);
+      if (kstatus != GrabSuccess)
+       fprintf (stderr, "%s: couldn't grab keyboard!  (%s)\n",
+                blurb(), grab_string(kstatus));
+    }
+
+  mstatus = grab_mouse (si, window, cursor);
+  if (mstatus != GrabSuccess)
+    {  /* try again in a second */
+      sleep (1);
+      mstatus = grab_mouse (si, window, cursor);
+      if (mstatus != GrabSuccess)
+       fprintf (stderr, "%s: couldn't grab pointer!  (%s)\n",
+                blurb(), grab_string(mstatus));
+    }
+
+  return (kstatus == GrabSuccess ||
+         mstatus == GrabSuccess);
+}
+
+static void
+ungrab_keyboard_and_mouse (saver_info *si)
+{
+  ungrab_mouse (si);
+  ungrab_kbd (si);
+}
+
+
+int
+move_mouse_grab (saver_info *si, Window to, Cursor cursor)
+{
+  Window old = si->mouse_grab_window;
+
+  if (old == 0)
+    return grab_mouse (si, to, cursor);
+  else
+    {
+      saver_preferences *p = &si->prefs;
+      int status;
+
+      XSync (si->dpy, False);
+      XGrabServer (si->dpy);                   /* ############ DANGER! */
+      XSync (si->dpy, False);
+
+      if (p->verbose_p)
+        fprintf(stderr, "%s: grabbing server...\n", blurb());
+
+      ungrab_mouse (si);
+      status = grab_mouse (si, to, cursor);
+
+      if (status != GrabSuccess)   /* Augh! */
+        {
+          sleep (1);               /* Note dramatic evil of sleeping
+                                      with server grabbed. */
+          XSync (si->dpy, False);
+          status = grab_mouse (si, to, cursor);
+        }
+
+      if (status != GrabSuccess)   /* Augh!  Try to get the old one back... */
+        grab_mouse (si, to, cursor);
+
+      XUngrabServer (si->dpy);
+      XSync (si->dpy, False);                  /* ###### (danger over) */
+
+      if (p->verbose_p)
+        fprintf(stderr, "%s: ungrabbing server.\n", blurb());
+
+      return status;
+    }
+}
+
+
+/* Prints an error message to stderr and returns True if there is another
+   xscreensaver running already.  Silently returns False otherwise. */
+Bool
+ensure_no_screensaver_running (Display *dpy, Screen *screen)
+{
+  Bool status = 0;
+  int i;
+  Window root = RootWindowOfScreen (screen);
+  Window root2, parent, *kids;
+  unsigned int nkids;
+  XErrorHandler old_handler = XSetErrorHandler (BadWindow_ehandler);
+
+  if (! XQueryTree (dpy, root, &root2, &parent, &kids, &nkids))
+    abort ();
+  if (root != root2)
+    abort ();
+  if (parent)
+    abort ();
+  for (i = 0; i < nkids; i++)
+    {
+      Atom type;
+      int format;
+      unsigned long nitems, bytesafter;
+      char *version;
+
+      if (XGetWindowProperty (dpy, kids[i], XA_SCREENSAVER_VERSION, 0, 1,
+                             False, XA_STRING, &type, &format, &nitems,
+                             &bytesafter, (unsigned char **) &version)
+         == Success
+         && type != None)
+       {
+         char *id;
+         if (!XGetWindowProperty (dpy, kids[i], XA_SCREENSAVER_ID, 0, 512,
+                                  False, XA_STRING, &type, &format, &nitems,
+                                  &bytesafter, (unsigned char **) &id)
+             == Success
+             || type == None)
+           id = "???";
+
+         fprintf (stderr,
+      "%s: already running on display %s (window 0x%x)\n from process %s.\n",
+                  blurb(), DisplayString (dpy), (int) kids [i], id);
+         status = True;
+       }
+    }
+
+  if (kids) XFree ((char *) kids);
+  XSync (dpy, False);
+  XSetErrorHandler (old_handler);
+  return status;
+}
+
+
+\f
+/* Virtual-root hackery */
+
+#ifdef _VROOT_H_
+ERROR!  You must not include vroot.h in this file.
+#endif
+
+static void
+store_vroot_property (Display *dpy, Window win, Window value)
+{
+#if 0
+  if (p->verbose_p)
+    fprintf (stderr,
+            "%s: storing XA_VROOT = 0x%x (%s) = 0x%x (%s)\n", blurb(), 
+            win,
+            (win == screensaver_window ? "ScreenSaver" :
+             (win == real_vroot ? "VRoot" :
+              (win == real_vroot_value ? "Vroot_value" : "???"))),
+            value,
+            (value == screensaver_window ? "ScreenSaver" :
+             (value == real_vroot ? "VRoot" :
+              (value == real_vroot_value ? "Vroot_value" : "???"))));
+#endif
+  XChangeProperty (dpy, win, XA_VROOT, XA_WINDOW, 32, PropModeReplace,
+                  (unsigned char *) &value, 1);
+}
+
+static void
+remove_vroot_property (Display *dpy, Window win)
+{
+#if 0
+  if (p->verbose_p)
+    fprintf (stderr, "%s: removing XA_VROOT from 0x%x (%s)\n", blurb(), win, 
+            (win == screensaver_window ? "ScreenSaver" :
+             (win == real_vroot ? "VRoot" :
+              (win == real_vroot_value ? "Vroot_value" : "???"))));
+#endif
+  XDeleteProperty (dpy, win, XA_VROOT);
+}
+
+
+static void
+kill_xsetroot_data (Display *dpy, Window window, Bool verbose_p)
+{
+  Atom type;
+  int format;
+  unsigned long nitems, bytesafter;
+  Pixmap *dataP = 0;
+
+  /* If the user has been using xv or xsetroot as a screensaver (to display
+     an image on the screensaver window, as a kind of slideshow) then the
+     pixmap and its associated color cells have been put in RetainPermanent
+     CloseDown mode.  Since we're not destroying the xscreensaver window,
+     but merely unmapping it, we need to free these resources or those
+     colormap cells will stay allocated while the screensaver is off.  (We
+     could just delete the screensaver window and recreate it later, but
+     that could cause other problems.)  This code does an atomic read-and-
+     delete of the _XSETROOT_ID property, and if it held a pixmap, then we
+     cause the RetainPermanent resources of the client which created it
+     (and which no longer exists) to be freed.
+   */
+  if (XGetWindowProperty (dpy, window, XA_XSETROOT_ID, 0, 1,
+                         True, AnyPropertyType, &type, &format, &nitems, 
+                         &bytesafter, (unsigned char **) &dataP)
+      == Success
+      && type != None)
+    {
+      if (dataP && *dataP && type == XA_PIXMAP && format == 32 &&
+         nitems == 1 && bytesafter == 0)
+       {
+         if (verbose_p)
+           fprintf (stderr, "%s: destroying xsetroot data (0x%lX).\n",
+                    blurb(), *dataP);
+         XKillClient (dpy, *dataP);
+       }
+      else
+       fprintf (stderr, "%s: deleted unrecognised _XSETROOT_ID property: \n\
+       %lu, %lu; type: %lu, format: %d, nitems: %lu, bytesafter %ld\n",
+                blurb(), (unsigned long) dataP, (dataP ? *dataP : 0), type,
+                format, nitems, bytesafter);
+    }
+}
+
+
+static void handle_signals (saver_info *si, Bool on_p);
+
+static void
+save_real_vroot (saver_screen_info *ssi)
+{
+  saver_info *si = ssi->global;
+  Display *dpy = si->dpy;
+  Screen *screen = ssi->screen;
+  int i;
+  Window root = RootWindowOfScreen (screen);
+  Window root2, parent, *kids;
+  unsigned int nkids;
+  XErrorHandler old_handler;
+
+  /* It's possible that a window might be deleted between our call to
+     XQueryTree() and our call to XGetWindowProperty().  Don't die if
+     that happens (but just ignore that window, it's not the one we're
+     interested in anyway.)
+   */
+  XSync (dpy, False);
+  old_handler = XSetErrorHandler (BadWindow_ehandler);
+  XSync (dpy, False);
+
+  ssi->real_vroot = 0;
+  ssi->real_vroot_value = 0;
+  if (! XQueryTree (dpy, root, &root2, &parent, &kids, &nkids))
+    abort ();
+  if (root != root2)
+    abort ();
+  if (parent)
+    abort ();
+  for (i = 0; i < nkids; i++)
+    {
+      Atom type;
+      int format;
+      unsigned long nitems, bytesafter;
+      Window *vrootP = 0;
+
+      if (XGetWindowProperty (dpy, kids[i], XA_VROOT, 0, 1, False, XA_WINDOW,
+                             &type, &format, &nitems, &bytesafter,
+                             (unsigned char **) &vrootP)
+         != Success)
+       continue;
+      if (! vrootP)
+       continue;
+      if (ssi->real_vroot)
+       {
+         if (*vrootP == ssi->screensaver_window) abort ();
+         fprintf (stderr,
+           "%s: more than one virtual root window found (0x%x and 0x%x).\n",
+                  blurb(), (int) ssi->real_vroot, (int) kids [i]);
+         exit (1);
+       }
+      ssi->real_vroot = kids [i];
+      ssi->real_vroot_value = *vrootP;
+    }
+
+  XSync (dpy, False);
+  XSetErrorHandler (old_handler);
+  XSync (dpy, False);
+
+  if (ssi->real_vroot)
+    {
+      handle_signals (si, True);
+      remove_vroot_property (si->dpy, ssi->real_vroot);
+      XSync (dpy, False);
+    }
+
+  XFree ((char *) kids);
+}
+
+
+static Bool
+restore_real_vroot_2 (saver_screen_info *ssi)
+{
+  saver_info *si = ssi->global;
+  saver_preferences *p = &si->prefs;
+  if (p->verbose_p && ssi->real_vroot)
+    fprintf (stderr,
+            "%s: restoring __SWM_VROOT property on the real vroot (0x%lx).\n",
+            blurb(), (unsigned long) ssi->real_vroot);
+  remove_vroot_property (si->dpy, ssi->screensaver_window);
+  if (ssi->real_vroot)
+    {
+      store_vroot_property (si->dpy, ssi->real_vroot, ssi->real_vroot_value);
+      ssi->real_vroot = 0;
+      ssi->real_vroot_value = 0;
+      /* make sure the property change gets there before this process
+        terminates!  We might be doing this because we have intercepted
+        SIGTERM or something. */
+      XSync (si->dpy, False);
+      return True;
+    }
+  return False;
+}
+
+static Bool
+restore_real_vroot_1 (saver_info *si)
+{
+  int i;
+  Bool did_any = False;
+  for (i = 0; i < si->nscreens; i++)
+    {
+      saver_screen_info *ssi = &si->screens[i];
+      if (restore_real_vroot_2 (ssi))
+       did_any = True;
+    }
+  return did_any;
+}
+
+void
+restore_real_vroot (saver_info *si)
+{
+  if (restore_real_vroot_1 (si))
+    handle_signals (si, False);
+}
+
+\f
+/* Signal hackery to ensure that the vroot doesn't get left in an 
+   inconsistent state
+ */
+
+const char *
+signal_name(int signal)
+{
+  switch (signal) {
+  case SIGHUP:   return "SIGHUP";
+  case SIGINT:   return "SIGINT";
+  case SIGQUIT:          return "SIGQUIT";
+  case SIGILL:   return "SIGILL";
+  case SIGTRAP:          return "SIGTRAP";
+#ifdef SIGABRT
+  case SIGABRT:          return "SIGABRT";
+#endif
+  case SIGFPE:   return "SIGFPE";
+  case SIGKILL:          return "SIGKILL";
+  case SIGBUS:   return "SIGBUS";
+  case SIGSEGV:          return "SIGSEGV";
+  case SIGPIPE:          return "SIGPIPE";
+  case SIGALRM:          return "SIGALRM";
+  case SIGTERM:          return "SIGTERM";
+#ifdef SIGSTOP
+  case SIGSTOP:          return "SIGSTOP";
+#endif
+#ifdef SIGCONT
+  case SIGCONT:          return "SIGCONT";
+#endif
+#ifdef SIGUSR1
+  case SIGUSR1:          return "SIGUSR1";
+#endif
+#ifdef SIGUSR2
+  case SIGUSR2:          return "SIGUSR2";
+#endif
+#ifdef SIGEMT
+  case SIGEMT:   return "SIGEMT";
+#endif
+#ifdef SIGSYS
+  case SIGSYS:   return "SIGSYS";
+#endif
+#ifdef SIGCHLD
+  case SIGCHLD:          return "SIGCHLD";
+#endif
+#ifdef SIGPWR
+  case SIGPWR:   return "SIGPWR";
+#endif
+#ifdef SIGWINCH
+  case SIGWINCH:  return "SIGWINCH";
+#endif
+#ifdef SIGURG
+  case SIGURG:   return "SIGURG";
+#endif
+#ifdef SIGIO
+  case SIGIO:    return "SIGIO";
+#endif
+#ifdef SIGVTALRM
+  case SIGVTALRM: return "SIGVTALRM";
+#endif
+#ifdef SIGXCPU
+  case SIGXCPU:          return "SIGXCPU";
+#endif
+#ifdef SIGXFSZ
+  case SIGXFSZ:          return "SIGXFSZ";
+#endif
+#ifdef SIGDANGER
+  case SIGDANGER: return "SIGDANGER";
+#endif
+  default:
+    {
+      static char buf[50];
+      sprintf(buf, "signal %d\n", signal);
+      return buf;
+    }
+  }
+}
+
+
+
+static RETSIGTYPE
+restore_real_vroot_handler (int sig)
+{
+  saver_info *si = global_si_kludge;   /* I hate C so much... */
+
+  signal (sig, SIG_DFL);
+  if (restore_real_vroot_1 (si))
+    fprintf (real_stderr, "\n%s: %s intercepted, vroot restored.\n",
+            blurb(), signal_name(sig));
+  kill (getpid (), sig);
+}
+
+static void
+catch_signal (saver_info *si, int sig, Bool on_p)
+{
+  if (! on_p)
+    signal (sig, SIG_DFL);
+  else
+    {
+      if (((long) signal (sig, restore_real_vroot_handler)) == -1L)
+       {
+         char buf [255];
+         sprintf (buf, "%s: couldn't catch %s", blurb(), signal_name(sig));
+         perror (buf);
+         saver_exit (si, 1, 0);
+       }
+    }
+}
+
+static void
+handle_signals (saver_info *si, Bool on_p)
+{
+#if 0
+  if (on_p) fprintf (stderr, "handling signals\n");
+  else fprintf (stderr, "unhandling signals\n");
+#endif
+
+  catch_signal (si, SIGHUP,  on_p);
+  catch_signal (si, SIGINT,  on_p);
+  catch_signal (si, SIGQUIT, on_p);
+  catch_signal (si, SIGILL,  on_p);
+  catch_signal (si, SIGTRAP, on_p);
+  catch_signal (si, SIGIOT,  on_p);
+  catch_signal (si, SIGABRT, on_p);
+#ifdef SIGEMT
+  catch_signal (si, SIGEMT,  on_p);
+#endif
+  catch_signal (si, SIGFPE,  on_p);
+  catch_signal (si, SIGBUS,  on_p);
+  catch_signal (si, SIGSEGV, on_p);
+#ifdef SIGSYS
+  catch_signal (si, SIGSYS,  on_p);
+#endif
+  catch_signal (si, SIGTERM, on_p);
+#ifdef SIGXCPU
+  catch_signal (si, SIGXCPU, on_p);
+#endif
+#ifdef SIGXFSZ
+  catch_signal (si, SIGXFSZ, on_p);
+#endif
+#ifdef SIGDANGER
+  catch_signal (si, SIGDANGER, on_p);
+#endif
+}
+
+void
+saver_exit (saver_info *si, int status, const char *dump_core_reason)
+{
+  saver_preferences *p = &si->prefs;
+  static Bool exiting = False;
+  Bool bugp;
+  Bool vrs;
+
+  if (exiting)
+    exit(status);
+
+  exiting = True;
+  
+  vrs = restore_real_vroot_1 (si);
+  emergency_kill_subproc (si);
+
+  if (vrs && (p->verbose_p || status != 0))
+    fprintf (real_stderr, "%s: vroot restored, exiting.\n", blurb());
+  else if (p->verbose_p)
+    fprintf (real_stderr, "%s: no vroot to restore; exiting.\n", blurb());
+
+  fflush(real_stdout);
+
+#ifdef VMS     /* on VMS, 1 is the "normal" exit code instead of 0. */
+  if (status == 0) status = 1;
+  else if (status == 1) status = -1;
+#endif
+
+  bugp = !!dump_core_reason;
+
+  if (si->prefs.debug_p && !dump_core_reason)
+    dump_core_reason = "because of -debug";
+
+  if (dump_core_reason)
+    {
+      /* Note that the Linux man page for setuid() says If uid is
+        different from the old effective uid, the process will be
+        forbidden from leaving core dumps.
+      */
+      char cwd[4096]; /* should really be PATH_MAX, but who cares. */
+      cwd[0] = 0;
+      fprintf(real_stderr, "%s: dumping core (%s)\n", blurb(),
+             dump_core_reason);
+
+      if (bugp)
+       fprintf(real_stderr,
+               "%s: see http://www.jwz.org/xscreensaver/bugs.html\n"
+               "\t\tfor bug reporting information.\n\n",
+               blurb());
+
+# if defined(HAVE_GETCWD)
+      if (!getcwd (cwd, sizeof(cwd)))
+# elif defined(HAVE_GETWD)
+      if (!getwd (cwd))
+# endif
+        strcpy(cwd, "unknown.");
+
+      fprintf (real_stderr, "%s: current directory is %s\n", blurb(), cwd);
+      describe_uids (si, real_stderr);
+
+      /* Do this to drop a core file, so that we can get a stack trace. */
+      abort();
+    }
+
+  exit (status);
+}
+
+\f
+/* Managing the actual screensaver window */
+
+Bool
+window_exists_p (Display *dpy, Window window)
+{
+  XErrorHandler old_handler;
+  XWindowAttributes xgwa;
+  xgwa.screen = 0;
+  old_handler = XSetErrorHandler (BadWindow_ehandler);
+  XGetWindowAttributes (dpy, window, &xgwa);
+  XSync (dpy, False);
+  XSetErrorHandler (old_handler);
+  return (xgwa.screen != 0);
+}
+
+static void
+store_saver_id (saver_screen_info *ssi)
+{
+  XClassHint class_hints;
+  saver_info *si = ssi->global;
+  unsigned long pid = (unsigned long) getpid ();
+  char buf[20];
+  struct passwd *p = getpwuid (getuid ());
+  const char *name, *host;
+  char *id;
+  
+  /* First store the name and class on the window.
+   */
+  class_hints.res_name = progname;
+  class_hints.res_class = progclass;
+  XSetClassHint (si->dpy, ssi->screensaver_window, &class_hints);
+  XStoreName (si->dpy, ssi->screensaver_window, "screensaver");
+
+  /* Then store the xscreensaver version number.
+   */
+  XChangeProperty (si->dpy, ssi->screensaver_window,
+                  XA_SCREENSAVER_VERSION,
+                  XA_STRING, 8, PropModeReplace,
+                  (unsigned char *) si->version,
+                  strlen (si->version));
+
+  /* Now store the XSCREENSAVER_ID property, that says what user and host
+     xscreensaver is running as.
+   */
+
+  if (p && p->pw_name && *p->pw_name)
+    name = p->pw_name;
+  else if (p)
+    {
+      sprintf (buf, "%lu", (unsigned long) p->pw_uid);
+      name = buf;
+    }
+  else
+    name = "???";
+
+# if defined(HAVE_UNAME)
+  {
+    struct utsname uts;
+    if (uname (&uts) < 0)
+      host = "???";
+    else
+      host = uts.nodename;
+  }
+# elif defined(VMS)
+  host = getenv("SYS$NODE");
+# else  /* !HAVE_UNAME && !VMS */
+  host = "???";
+# endif /* !HAVE_UNAME && !VMS */
+
+  id = (char *) malloc (strlen(name) + strlen(host) + 50);
+  sprintf (id, "%lu (%s@%s)", pid, name, host);
+
+  XChangeProperty (si->dpy, ssi->screensaver_window,
+                  XA_SCREENSAVER_ID, XA_STRING,
+                  8, PropModeReplace,
+                  (unsigned char *) id, strlen (id));
+  free (id);
+}
+
+
+/* Returns the area of the screen which the xscreensaver window should cover.
+   Normally this is the whole screen, but if the X server's root window is
+   actually larger than the monitor's displayable area, then we want to
+   operate in the currently-visible portion of the desktop instead.
+ */
+void
+get_screen_viewport (saver_screen_info *ssi,
+                     int *x_ret, int *y_ret,
+                     int *w_ret, int *h_ret,
+                     Bool verbose_p)
+{
+  int w = WidthOfScreen (ssi->screen);
+  int h = HeightOfScreen (ssi->screen);
+
+#ifdef HAVE_XF86VMODE
+  saver_info *si = ssi->global;
+  int screen_no = screen_number (ssi->screen);
+  int event, error;
+  int dot;
+  XF86VidModeModeLine ml;
+  int x, y;
+
+  if (XF86VidModeQueryExtension (si->dpy, &event, &error) &&
+      XF86VidModeGetModeLine (si->dpy, screen_no, &dot, &ml) &&
+      XF86VidModeGetViewPort (si->dpy, screen_no, &x, &y))
+    {
+      char msg[512];
+      *x_ret = x;
+      *y_ret = y;
+      *w_ret = ml.hdisplay;
+      *h_ret = ml.vdisplay;
+
+      if (*x_ret == 0 && *y_ret == 0 && *w_ret == w && *h_ret == h)
+        /* There is no viewport -- the screen does not scroll. */
+        return;
+
+      sprintf (msg, "%s: vp is %dx%d+%d+%d",
+               blurb(), *w_ret, *h_ret, *x_ret, *y_ret);
+
+
+      /* Apparently, though the server stores the X position in increments of
+         1 pixel, it will only make changes to the *display* in some other
+         increment.  With XF86_SVGA on a Thinkpad, the display only updates
+         in multiples of 8 pixels when in 8-bit mode, and in multiples of 4
+         pixels in 16-bit mode.  I don't know what it does in 24- and 32-bit
+         mode, because I don't have enough video memory to find out.
+
+         I consider it a bug that XF86VidModeGetViewPort() is telling me the
+         server's *target* scroll position rather than the server's *actual*
+         scroll position.  David Dawes agrees, and says they may fix this in
+         XFree86 4.0, but it's notrivial.
+
+         He also confirms that this behavior is server-dependent, so the
+         actual scroll position cannot be reliably determined by the client.
+         So... that means the only solution is to provide a ``sandbox''
+         around the blackout window -- we make the window be up to N pixels
+         larger than the viewport on both the left and right sides.  That
+         means some part of the outer edges of each hack might not be
+         visible, but screw it.
+
+         I'm going to guess that 16 pixels is enough, and that the Y dimension
+         doesn't have this problem.
+
+         The drawback of doing this, of course, is that some of the screenhacks
+         will still look pretty stupid -- for example, "slidescreen" will cut
+         off the left and right edges of the grid, etc.
+      */
+# define FUDGE 16
+      if (x > 0 && x < w - ml.hdisplay)  /* not at left edge or right edge */
+        {
+          /* Round X position down to next lower multiple of FUDGE.
+             Increase width by 2*FUDGE in case some server rounds up.
+           */
+          *x_ret = ((x - 1) / FUDGE) * FUDGE;
+          *w_ret += (FUDGE * 2);
+        }
+# undef FUDGE
+
+      if (*x_ret != x ||
+          *y_ret != y ||
+          *w_ret != ml.hdisplay ||
+          *h_ret != ml.vdisplay)
+        sprintf (msg + strlen(msg), "; fudged to %dx%d+%d+%d",
+                 *w_ret, *h_ret, *x_ret, *y_ret);
+
+      if (verbose_p)
+        fprintf (stderr, "%s.\n", msg);
+
+      return;
+    }
+
+#endif /* HAVE_XF86VMODE */
+
+  *x_ret = 0;
+  *y_ret = 0;
+  *w_ret = w;
+  *h_ret = h;
+}
+
+
+static void
+initialize_screensaver_window_1 (saver_screen_info *ssi)
+{
+  saver_info *si = ssi->global;
+  saver_preferences *p = &si->prefs;
+  Bool install_cmap_p = ssi->install_cmap_p;   /* not p->install_cmap_p */
+
+  /* This resets the screensaver window as fully as possible, since there's
+     no way of knowing what some random client may have done to us in the
+     meantime.  We could just destroy and recreate the window, but that has
+     its own set of problems...
+   */
+  XColor black;
+  XSetWindowAttributes attrs;
+  unsigned long attrmask;
+  int x, y, width, height;
+  static Bool printed_visual_info = False;  /* only print the message once. */
+
+  get_screen_viewport (ssi, &x, &y, &width, &height,
+                       (p->verbose_p && !si->screen_blanked_p));
+
+  black.red = black.green = black.blue = 0;
+
+  if (ssi->cmap == DefaultColormapOfScreen (ssi->screen))
+    ssi->cmap = 0;
+
+  if (ssi->current_visual != DefaultVisualOfScreen (ssi->screen))
+    /* It's not the default visual, so we have no choice but to install. */
+    install_cmap_p = True;
+
+  if (install_cmap_p)
+    {
+      if (! ssi->cmap)
+       {
+         ssi->cmap = XCreateColormap (si->dpy,
+                                      RootWindowOfScreen (ssi->screen),
+                                     ssi->current_visual, AllocNone);
+         if (! XAllocColor (si->dpy, ssi->cmap, &black)) abort ();
+         ssi->black_pixel = black.pixel;
+       }
+    }
+  else
+    {
+      Colormap def_cmap = DefaultColormapOfScreen (ssi->screen);
+      if (ssi->cmap)
+       {
+         XFreeColors (si->dpy, ssi->cmap, &ssi->black_pixel, 1, 0);
+         if (ssi->cmap != ssi->demo_cmap &&
+             ssi->cmap != def_cmap)
+           XFreeColormap (si->dpy, ssi->cmap);
+       }
+      ssi->cmap = def_cmap;
+      ssi->black_pixel = BlackPixelOfScreen (ssi->screen);
+    }
+
+  attrmask = (CWOverrideRedirect | CWEventMask | CWBackingStore | CWColormap |
+             CWBackPixel | CWBackingPixel | CWBorderPixel);
+  attrs.override_redirect = True;
+
+  /* When use_mit_saver_extension or use_sgi_saver_extension is true, we won't
+     actually be reading these events during normal operation; but we still
+     need to see Button events for demo-mode to work properly.
+   */
+  attrs.event_mask = (KeyPressMask | KeyReleaseMask |
+                     ButtonPressMask | ButtonReleaseMask |
+                     PointerMotionMask);
+
+  attrs.backing_store = NotUseful;
+  attrs.colormap = ssi->cmap;
+  attrs.background_pixel = ssi->black_pixel;
+  attrs.backing_pixel = ssi->black_pixel;
+  attrs.border_pixel = ssi->black_pixel;
+
+  if (p->debug_p) width = width / 2;
+
+  if (!p->verbose_p || printed_visual_info)
+    ;
+  else if (ssi->current_visual == DefaultVisualOfScreen (ssi->screen))
+    {
+      fprintf (stderr, "%s: using default visual ", blurb());
+      describe_visual (stderr, ssi->screen, ssi->current_visual,
+                      install_cmap_p);
+    }
+  else
+    {
+      fprintf (stderr, "%s: using visual:   ", blurb());
+      describe_visual (stderr, ssi->screen, ssi->current_visual,
+                      install_cmap_p);
+      fprintf (stderr, "%s: default visual: ", blurb());
+      describe_visual (stderr, ssi->screen,
+                      DefaultVisualOfScreen (ssi->screen),
+                      ssi->install_cmap_p);
+    }
+  printed_visual_info = True;
+
+#ifdef HAVE_MIT_SAVER_EXTENSION
+  if (si->using_mit_saver_extension)
+    {
+      XScreenSaverInfo *info;
+      Window root = RootWindowOfScreen (ssi->screen);
+
+#if 0
+      /* This call sets the server screensaver timeouts to what we think
+        they should be (based on the resources and args xscreensaver was
+        started with.)  It's important that we do this to sync back up
+        with the server - if we have turned on prematurely, as by an
+        ACTIVATE ClientMessage, then the server may decide to activate
+        the screensaver while it's already active.  That's ok for us,
+        since we would know to ignore that ScreenSaverActivate event,
+        but a side effect of this would be that the server would map its
+        saver window (which we then hide again right away) meaning that
+        the bits currently on the screen get blown away.  Ugly. */
+
+      /* #### Ok, that doesn't work - when we tell the server that the
+        screensaver is "off" it sends us a Deactivate event, which is
+        sensible... but causes the saver to never come on.  Hmm. */
+      disable_builtin_screensaver (si, True);
+#endif /* 0 */
+
+#if 0
+      /* #### The MIT-SCREEN-SAVER extension gives us access to the
+        window that the server itself uses for saving the screen.
+        However, using this window in any way, in particular, calling
+        XScreenSaverSetAttributes() as below, tends to make the X server
+        crash.  So fuck it, let's try and get along without using it...
+
+        It's also inconvenient to use this window because it doesn't
+        always exist (though the ID is constant.)  So to use this
+        window, we'd have to reimplement the ACTIVATE ClientMessage to
+        tell the *server* to tell *us* to turn on, to cause the window
+        to get created at the right time.  Gag.  */
+      XScreenSaverSetAttributes (si->dpy, root,
+                                0, 0, width, height, 0,
+                                current_depth, InputOutput, visual,
+                                attrmask, &attrs);
+      XSync (si->dpy, False);
+#endif /* 0 */
+
+      info = XScreenSaverAllocInfo ();
+      XScreenSaverQueryInfo (si->dpy, root, info);
+      ssi->server_mit_saver_window = info->window;
+      if (! ssi->server_mit_saver_window) abort ();
+      XFree (info);
+    }
+#endif /* HAVE_MIT_SAVER_EXTENSION */
+
+  if (ssi->screensaver_window)
+    {
+      XWindowChanges changes;
+      unsigned int changesmask = CWX|CWY|CWWidth|CWHeight|CWBorderWidth;
+      changes.x = x;
+      changes.y = y;
+      changes.width = width;
+      changes.height = height;
+      changes.border_width = 0;
+
+      XConfigureWindow (si->dpy, ssi->screensaver_window,
+                       changesmask, &changes);
+      XChangeWindowAttributes (si->dpy, ssi->screensaver_window,
+                              attrmask, &attrs);
+    }
+  else
+    {
+      ssi->screensaver_window =
+       XCreateWindow (si->dpy, RootWindowOfScreen (ssi->screen),
+                       x, y, width, height,
+                       0, ssi->current_depth, InputOutput,
+                      ssi->current_visual, attrmask, &attrs);
+
+      reset_stderr (ssi);
+      store_activate_time(si, True);
+      if (p->verbose_p)
+       fprintf (stderr, "%s: saver window is 0x%lx.\n",
+                blurb(), (unsigned long) ssi->screensaver_window);
+    }
+
+
+  store_saver_id (ssi);
+
+  if (!ssi->cursor)
+    {
+      Pixmap bit;
+      bit = XCreatePixmapFromBitmapData (si->dpy, ssi->screensaver_window,
+                                        "\000", 1, 1,
+                                        BlackPixelOfScreen (ssi->screen),
+                                        BlackPixelOfScreen (ssi->screen),
+                                        1);
+      ssi->cursor = XCreatePixmapCursor (si->dpy, bit, bit, &black, &black,
+                                        0, 0);
+      XFreePixmap (si->dpy, bit);
+    }
+
+  XSetWindowBackground (si->dpy, ssi->screensaver_window, ssi->black_pixel);
+
+  if (si->demoing_p)
+    XUndefineCursor (si->dpy, ssi->screensaver_window);
+  else
+    XDefineCursor (si->dpy, ssi->screensaver_window, ssi->cursor);
+}
+
+void
+initialize_screensaver_window (saver_info *si)
+{
+  int i;
+  for (i = 0; i < si->nscreens; i++)
+    initialize_screensaver_window_1 (&si->screens[i]);
+}
+
+
+void 
+raise_window (saver_info *si,
+             Bool inhibit_fade, Bool between_hacks_p, Bool dont_clear)
+{
+  saver_preferences *p = &si->prefs;
+  int i;
+
+  if (si->demoing_p)
+    inhibit_fade = True;
+
+  if (si->emergency_lock_p)
+    inhibit_fade = True;
+
+  if (!dont_clear)
+    initialize_screensaver_window (si);
+
+  reset_watchdog_timer (si, True);
+
+  if (p->fade_p && si->fading_possible_p && !inhibit_fade)
+    {
+      Window *current_windows = (Window *)
+       calloc(sizeof(Window), si->nscreens);
+      Colormap *current_maps = (Colormap *)
+       calloc(sizeof(Colormap), si->nscreens);
+
+      for (i = 0; i < si->nscreens; i++)
+       {
+         saver_screen_info *ssi = &si->screens[i];
+         current_windows[i] = ssi->screensaver_window;
+         current_maps[i] = (between_hacks_p
+                            ? ssi->cmap
+                            : DefaultColormapOfScreen (ssi->screen));
+         /* Ensure that the default background of the window is really black,
+            not a pixmap or something.  (This does not clear the window.) */
+         XSetWindowBackground (si->dpy, ssi->screensaver_window,
+                               ssi->black_pixel);
+       }
+
+      if (p->verbose_p) fprintf (stderr, "%s: fading...\n", blurb());
+
+      XGrabServer (si->dpy);                   /* ############ DANGER! */
+
+      /* Clear the stderr layer on each screen.
+       */
+      if (!dont_clear)
+       for (i = 0; i < si->nscreens; i++)
+         {
+           saver_screen_info *ssi = &si->screens[i];
+           if (ssi->stderr_overlay_window)
+             /* Do this before the fade, since the stderr cmap won't fade
+                even if we uninstall it (beats me...) */
+             clear_stderr (ssi);
+         }
+
+      /* Note!  The server is grabbed, and this will take several seconds
+        to complete! */
+      fade_screens (si->dpy, current_maps, current_windows,
+                   p->fade_seconds/1000, p->fade_ticks, True, !dont_clear);
+
+      free(current_maps);
+      free(current_windows);
+      current_maps = 0;
+      current_windows = 0;
+
+      if (p->verbose_p) fprintf (stderr, "%s: fading done.\n", blurb());
+
+#ifdef HAVE_MIT_SAVER_EXTENSION
+      for (i = 0; i < si->nscreens; i++)
+       {
+         saver_screen_info *ssi = &si->screens[i];
+         if (ssi->server_mit_saver_window &&
+             window_exists_p (si->dpy, ssi->server_mit_saver_window))
+           XUnmapWindow (si->dpy, ssi->server_mit_saver_window);
+       }
+#endif /* HAVE_MIT_SAVER_EXTENSION */
+
+      XUngrabServer (si->dpy);
+      XSync (si->dpy, False);                  /* ###### (danger over) */
+    }
+  else
+    {
+      for (i = 0; i < si->nscreens; i++)
+       {
+         saver_screen_info *ssi = &si->screens[i];
+         if (!dont_clear)
+           XClearWindow (si->dpy, ssi->screensaver_window);
+         if (!dont_clear || ssi->stderr_overlay_window)
+           clear_stderr (ssi);
+         XMapRaised (si->dpy, ssi->screensaver_window);
+#ifdef HAVE_MIT_SAVER_EXTENSION
+         if (ssi->server_mit_saver_window &&
+             window_exists_p (si->dpy, ssi->server_mit_saver_window))
+           XUnmapWindow (si->dpy, ssi->server_mit_saver_window);
+#endif /* HAVE_MIT_SAVER_EXTENSION */
+       }
+    }
+
+  for (i = 0; i < si->nscreens; i++)
+    {
+      saver_screen_info *ssi = &si->screens[i];
+      if (ssi->cmap)
+       XInstallColormap (si->dpy, ssi->cmap);
+    }
+}
+
+Bool
+blank_screen (saver_info *si)
+{
+  int i;
+  Bool ok;
+
+  /* Note: we do our grabs on the root window, not on the screensaver window.
+     If we grabbed on the saver window, then the demo mode and lock dialog
+     boxes wouldn't get any events.
+   */
+  ok = grab_keyboard_and_mouse (si,
+                                /*si->screens[0].screensaver_window,*/
+                                RootWindowOfScreen(si->screens[0].screen),
+                                (si->demoing_p
+                                 ? 0
+                                 : si->screens[0].cursor));
+
+
+  if (si->using_mit_saver_extension || si->using_sgi_saver_extension)
+    /* If we're using a server extension, then failure to get a grab is
+       not a big deal -- even without the grab, we will still be able
+       to un-blank when there is user activity, since the server will
+       tell us. */
+    ok = True;
+
+  if (!ok)
+    return False;
+
+  for (i = 0; i < si->nscreens; i++)
+    {
+      saver_screen_info *ssi = &si->screens[i];
+
+      save_real_vroot (ssi);
+      store_vroot_property (si->dpy,
+                           ssi->screensaver_window,
+                           ssi->screensaver_window);
+
+#ifdef HAVE_XF86VMODE
+      {
+        int ev, er;
+        if (!XF86VidModeQueryExtension (si->dpy, &ev, &er) ||
+            !XF86VidModeGetViewPort (si->dpy, i,
+                                     &ssi->blank_vp_x,
+                                     &ssi->blank_vp_y))
+          ssi->blank_vp_x = ssi->blank_vp_y = -1;
+      }
+#endif /* HAVE_XF86VMODE */
+    }
+  store_activate_time (si, si->screen_blanked_p);
+  raise_window (si, False, False, False);
+
+  si->screen_blanked_p = True;
+  si->last_wall_clock_time = 0;
+
+  return True;
+}
+
+void
+unblank_screen (saver_info *si)
+{
+  saver_preferences *p = &si->prefs;
+  Bool unfade_p = (si->fading_possible_p && p->unfade_p);
+  int i;
+
+  monitor_power_on (si);
+
+  store_activate_time (si, True);
+  reset_watchdog_timer (si, False);
+
+  if (si->demoing_p)
+    unfade_p = False;
+
+  if (unfade_p)
+    {
+      Window *current_windows = (Window *)
+       calloc(sizeof(Window), si->nscreens);
+
+      for (i = 0; i < si->nscreens; i++)
+       {
+         saver_screen_info *ssi = &si->screens[i];
+         current_windows[i] = ssi->screensaver_window;
+         /* Ensure that the default background of the window is really black,
+            not a pixmap or something.  (This does not clear the window.) */
+         XSetWindowBackground (si->dpy, ssi->screensaver_window,
+                               ssi->black_pixel);
+       }
+
+      if (p->verbose_p) fprintf (stderr, "%s: unfading...\n", blurb());
+
+
+      XSync (si->dpy, False);
+      XGrabServer (si->dpy);                   /* ############ DANGER! */
+      XSync (si->dpy, False);
+
+      /* Clear the stderr layer on each screen.
+       */
+      for (i = 0; i < si->nscreens; i++)
+       {
+         saver_screen_info *ssi = &si->screens[i];
+         clear_stderr (ssi);
+       }
+
+      XUngrabServer (si->dpy);
+      XSync (si->dpy, False);                  /* ###### (danger over) */
+
+
+      fade_screens (si->dpy, 0, current_windows,
+                   p->fade_seconds/1000, p->fade_ticks,
+                   False, False);
+
+      free(current_windows);
+      current_windows = 0;
+
+      if (p->verbose_p) fprintf (stderr, "%s: unfading done.\n", blurb());
+    }
+  else
+    {
+      for (i = 0; i < si->nscreens; i++)
+       {
+         saver_screen_info *ssi = &si->screens[i];
+         if (ssi->cmap)
+           {
+             Colormap c = DefaultColormapOfScreen (ssi->screen);
+             /* avoid technicolor */
+             XClearWindow (si->dpy, ssi->screensaver_window);
+             if (c) XInstallColormap (si->dpy, c);
+           }
+         XUnmapWindow (si->dpy, ssi->screensaver_window);
+       }
+    }
+
+
+  /* If the focus window does has a non-default colormap, then install
+     that colormap as well.  (On SGIs, this will cause both the root map
+     and the focus map to be installed simultaniously.  It'd be nice to
+     pick up the other colormaps that had been installed, too; perhaps
+     XListInstalledColormaps could be used for that?)
+   */
+  {
+    Window focus = 0;
+    int revert_to;
+    XGetInputFocus (si->dpy, &focus, &revert_to);
+    if (focus && focus != PointerRoot && focus != None)
+      {
+       XWindowAttributes xgwa;
+       xgwa.colormap = 0;
+       XGetWindowAttributes (si->dpy, focus, &xgwa);
+       if (xgwa.colormap &&
+           xgwa.colormap != DefaultColormapOfScreen (xgwa.screen))
+         XInstallColormap (si->dpy, xgwa.colormap);
+      }
+  }
+
+
+  for (i = 0; i < si->nscreens; i++)
+    {
+      saver_screen_info *ssi = &si->screens[i];
+      kill_xsetroot_data (si->dpy, ssi->screensaver_window, p->verbose_p);
+    }
+
+  store_activate_time(si, False);  /* store unblank time */
+
+  ungrab_keyboard_and_mouse (si);
+  restore_real_vroot (si);
+
+  /* Unmap the windows a second time, dammit -- just to avoid a race
+     with the screen-grabbing hacks.  (I'm not sure if this is really
+     necessary; I'm stabbing in the dark now.)
+  */
+  for (i = 0; i < si->nscreens; i++)
+    XUnmapWindow (si->dpy, si->screens[i].screensaver_window);
+
+  si->screen_blanked_p = False;
+  si->last_wall_clock_time = 0;
+}
+
+
+static void
+store_activate_time (saver_info *si, Bool use_last_p)
+{
+  static time_t last_time = 0;
+  time_t now = ((use_last_p && last_time) ? last_time : time ((time_t) 0));
+  CARD32 now32 = (CARD32) now;
+  int i;
+  last_time = now;
+
+  for (i = 0; i < si->nscreens; i++)
+    {
+      saver_screen_info *ssi = &si->screens[i];
+      if (!ssi->screensaver_window) continue;
+      XChangeProperty (si->dpy, ssi->screensaver_window, XA_SCREENSAVER_TIME,
+                      XA_INTEGER, 32, PropModeReplace,
+                      (unsigned char *) &now32, 1);
+    }
+}
+
+
+Bool
+select_visual (saver_screen_info *ssi, const char *visual_name)
+{
+  saver_info *si = ssi->global;
+  saver_preferences *p = &si->prefs;
+  Bool install_cmap_p = p->install_cmap_p;
+  Bool was_installed_p = (ssi->cmap != DefaultColormapOfScreen(ssi->screen));
+  Visual *new_v = 0;
+  Bool got_it;
+
+  if (visual_name && *visual_name)
+    {
+      if (!strcmp(visual_name, "default-i"))
+       {
+         visual_name = "default";
+         install_cmap_p = True;
+       }
+      else if (!strcmp(visual_name, "default-n"))
+       {
+         visual_name = "default";
+         install_cmap_p = False;
+       }
+#ifdef DAEMON_USE_GL
+      else if (!strcmp(visual_name, "gl") ||
+               !strcmp(visual_name, "GL"))
+        {
+          new_v = get_gl_visual (ssi->screen);
+          if (!new_v && p->verbose_p)
+            fprintf (stderr, "%s: no GL visuals.\n", progname);
+        }
+#endif /* DAEMON_USE_GL */
+
+      if (!new_v)
+        new_v = get_visual (ssi->screen, visual_name, True, False);
+    }
+  else
+    {
+      new_v = ssi->default_visual;
+    }
+
+  got_it = !!new_v;
+
+  if (new_v && new_v != DefaultVisualOfScreen(ssi->screen))
+    /* It's not the default visual, so we have no choice but to install. */
+    install_cmap_p = True;
+
+  ssi->install_cmap_p = install_cmap_p;
+
+  if (new_v &&
+      ((ssi->current_visual != new_v) ||
+       (install_cmap_p != was_installed_p)))
+    {
+      Colormap old_c = ssi->cmap;
+      Window old_w = ssi->screensaver_window;
+
+      if (p->verbose_p)
+       {
+         fprintf (stderr, "%s: switching to visual ", blurb());
+         describe_visual (stderr, ssi->screen, new_v, install_cmap_p);
+#if 0
+         fprintf (stderr, "%s:                from ", blurb());
+         describe_visual (stderr, ssi->screen, ssi->current_visual,
+                          was_installed_p);
+#endif
+       }
+
+      reset_stderr (ssi);
+      ssi->current_visual = new_v;
+      ssi->current_depth = visual_depth(ssi->screen, new_v);
+      ssi->cmap = 0;
+      ssi->screensaver_window = 0;
+
+      initialize_screensaver_window_1 (ssi);
+
+      /* stderr_overlay_window is a child of screensaver_window, so we need
+        to destroy that as well (actually, we just need to invalidate and
+        drop our pointers to it, but this will destroy it, which is ok so
+        long as it happens before old_w itself is destroyed.) */
+      reset_stderr (ssi);
+
+      raise_window (si, True, True, False);
+      store_vroot_property (si->dpy,
+                           ssi->screensaver_window, ssi->screensaver_window);
+      store_activate_time (si, True);
+
+
+
+      /* Transfer the grabs from the old window to the new.
+        Actually I think none of this is necessary, since we always
+        hold our grabs on the root window, but I wrote this before
+        re-discovering that...
+       */
+
+
+      /* If we're destroying the window that holds our mouse grab,
+        transfer the grab to the new window.  (Grab the server while
+        so doing, to avoid a race condition.)
+       */
+      if (old_w == si->mouse_grab_window)
+       {
+         XGrabServer (si->dpy);                /* ############ DANGER! */
+         ungrab_mouse (si);
+         grab_mouse (si, ssi->screensaver_window,
+                     (si->demoing_p
+                      ? 0
+                      : ssi->cursor));
+         XUngrabServer (si->dpy);
+         XSync (si->dpy, False);               /* ###### (danger over) */
+       }
+
+      /* If we're destroying the window that holds our keyboard grab,
+        transfer the grab to the new window.  (Grab the server while
+        so doing, to avoid a race condition.)
+       */
+      if (old_w == si->keyboard_grab_window)
+       {
+         XGrabServer (si->dpy);                /* ############ DANGER! */
+         ungrab_kbd(si);
+         grab_kbd(si, ssi->screensaver_window);
+         XUngrabServer (si->dpy);
+         XSync (si->dpy, False);               /* ###### (danger over) */
+       }
+
+      /* Now we can destroy this window without horking our grabs. */
+
+      XDestroyWindow (si->dpy, old_w);
+
+      if (p->verbose_p)
+       fprintf (stderr, "%s: destroyed old saver window 0x%lx.\n",
+                blurb(), (unsigned long) old_w);
+
+      if (old_c &&
+         old_c != DefaultColormapOfScreen (ssi->screen) &&
+         old_c != ssi->demo_cmap)
+       XFreeColormap (si->dpy, old_c);
+    }
+
+  return got_it;
+}
diff --git a/driver/xscreensaver-command.c b/driver/xscreensaver-command.c
new file mode 100644 (file)
index 0000000..cc169d2
--- /dev/null
@@ -0,0 +1,284 @@
+/* xscreensaver-command, Copyright (c) 1991-1999
+ *  by Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software 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.  No representations are made about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or 
+ * implied warranty.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/time.h>
+#include <sys/types.h>
+
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+
+#include <X11/Xproto.h>                /* for CARD32 */
+#include <X11/Xlib.h>
+#include <X11/Xatom.h>
+#include <X11/Xutil.h>         /* for XGetClassHint() */
+#include <X11/Xos.h>
+
+#include <X11/Intrinsic.h>     /* only needed to get through xscreensaver.h */
+
+#include "remote.h"
+#include "version.h"
+
+#ifdef _VROOT_H_
+ERROR! you must not include vroot.h in this file
+#endif
+
+char *progname;
+
+Atom XA_VROOT;
+Atom XA_SCREENSAVER, XA_SCREENSAVER_VERSION, XA_SCREENSAVER_RESPONSE;
+Atom XA_SCREENSAVER_ID, XA_SCREENSAVER_TIME, XA_SELECT, XA_DEMO;
+static Atom XA_ACTIVATE, XA_DEACTIVATE, XA_CYCLE, XA_NEXT, XA_PREV, XA_EXIT;
+static Atom XA_RESTART, XA_PREFS, XA_LOCK, XA_THROTTLE, XA_UNTHROTTLE;
+
+static char *screensaver_version;
+static char *usage = "\n\
+usage: %s -<option>\n\
+\n\
+  This program provides external control of a running xscreensaver process.\n\
+  Version %s, copyright (c) 1991-1999 Jamie Zawinski <jwz@jwz.org>.\n\
+\n\
+  The xscreensaver program is a daemon that runs in the background.\n\
+  You control a running xscreensaver process by sending it messages\n\
+  with this program, xscreensaver-command.  See the man pages for\n\
+  details.  These are the arguments understood by xscreensaver-command:\n\
+\n\
+  -demo         Ask the xscreensaver process to enter interactive demo mode.\n\
+\n\
+  -prefs        Ask the xscreensaver process to bring up the preferences\n\
+                panel.\n\
+\n\
+  -activate     Turn on the screensaver (blank the screen), as if the user\n\
+                had been idle for long enough.\n\
+\n\
+  -deactivate   Turns off the screensaver (un-blank the screen), as if user\n\
+                activity had been detected.\n\
+\n\
+  -cycle        If the screensaver is active (the screen is blanked), then\n\
+                stop the current graphics demo and run a new one (chosen\n\
+                randomly.)\n\
+\n\
+  -next         Like either -activate or -cycle, depending on which is more\n\
+                appropriate, except that the graphics hack that will be run\n\
+                is the next one in the list, instead of a randomly-chosen\n\
+                one.  In other words, repeatedly executing -next will cause\n\
+                the xscreensaver process to invoke each graphics demo\n\
+                sequentially.  (Though using the -demo option is probably\n\
+                an easier way to accomplish that.)\n\
+\n\
+  -prev         Like -next, but goes in the other direction.\n\
+\n\
+  -select <N>   Like -activate, but runs the Nth element in the list of\n\
+                hacks.  By knowing what is in the `programs' list, and in\n\
+                what order, you can use this to activate the screensaver\n\
+                with a particular graphics demo.  (The first element in the\n\
+                list is numbered 1, not 0.)\n\
+\n\
+  -exit         Causes the xscreensaver process to exit gracefully.  This is\n\
+                roughly the same as killing the process with `kill', but it\n\
+                is easier, since you don't need to first figure out the pid.\n\
+                (Note that one must *never* kill xscreensaver with -9!)\n\
+\n\
+  -restart      Causes the screensaver process to exit and then restart with\n\
+                the same command line arguments as last time.  Do this after\n\
+                you've changed your X resource settings, to cause\n\
+                xscreensaver to notice the changes.\n\
+\n\
+  -lock         Tells the running xscreensaver process to lock the screen\n\
+                immediately.  This is like -activate, but forces locking as\n\
+                well, even if locking is not the default.  If the saver is\n\
+                already active, this causes it to be locked as well.\n\
+\n\
+  -throttle     Temporarily switch to ``blank screen'' mode, and don't run\n\
+                any display modes at all, until the screensaver is next\n\
+                de-activated.  This is useful if you're using a machine\n\
+                remotely, and you find that some display modes are using too\n\
+                much CPU.\n\
+\n\
+  -unthrottle   Turn `-throttle' off and resume normal behavior.\n\
+\n\
+  -version      Prints the version of xscreensaver that is currently running\n\
+                on the display -- that is, the actual version number of the\n\
+                running xscreensaver background process, rather than the\n\
+                version number of xscreensaver-command.\n\
+\n\
+  -time         Prints the time at which the screensaver last activated or\n\
+                deactivated (roughly, how long the user has been idle or\n\
+                non-idle -- but not quite, since it only tells you when the\n\
+                screen became blanked or un-blanked.)\n\
+\n\
+  See the man page for more details.\n\
+  For updates, check http://www.jwz.org/xscreensaver/\n\
+\n";
+
+#define USAGE() do { \
+ fprintf (stderr, usage, progname, screensaver_version); exit (1); \
+ } while(0)
+
+int
+main (int argc, char **argv)
+{
+  Display *dpy;
+  int i;
+  char *dpyname = 0;
+  Atom *cmd = 0;
+  long arg = 0L;
+
+  progname = argv[0];
+  screensaver_version = (char *) malloc (5);
+  memcpy (screensaver_version, screensaver_id + 17, 4);
+  screensaver_version [4] = 0;
+
+  for (i = 1; i < argc; i++)
+    {
+      const char *s = argv [i];
+      int L;
+      if (s[0] == '-' && s[1] == '-') s++;
+      L = strlen (s);
+      if (L < 2) USAGE ();
+      if (!strncmp (s, "-display", L))         dpyname = argv [++i];
+      else if (cmd) USAGE();
+      else if (!strncmp (s, "-activate", L))   cmd = &XA_ACTIVATE;
+      else if (!strncmp (s, "-deactivate", L)) cmd = &XA_DEACTIVATE;
+      else if (!strncmp (s, "-cycle", L))      cmd = &XA_CYCLE;
+      else if (!strncmp (s, "-next", L))       cmd = &XA_NEXT;
+      else if (!strncmp (s, "-prev", L))       cmd = &XA_PREV;
+      else if (!strncmp (s, "-select", L))     cmd = &XA_SELECT;
+      else if (!strncmp (s, "-exit", L))       cmd = &XA_EXIT;
+      else if (!strncmp (s, "-restart", L))    cmd = &XA_RESTART;
+      else if (!strncmp (s, "-demo", L))       cmd = &XA_DEMO;
+      else if (!strncmp (s, "-preferences",L)) cmd = &XA_PREFS;
+      else if (!strncmp (s, "-prefs",L))       cmd = &XA_PREFS;
+      else if (!strncmp (s, "-lock", L))       cmd = &XA_LOCK;
+      else if (!strncmp (s, "-throttle", L))   cmd = &XA_THROTTLE;
+      else if (!strncmp (s, "-unthrottle", L)) cmd = &XA_UNTHROTTLE;
+      else if (!strncmp (s, "-version", L))    cmd = &XA_SCREENSAVER_VERSION;
+      else if (!strncmp (s, "-time", L))       cmd = &XA_SCREENSAVER_TIME;
+      else USAGE ();
+
+      if (cmd == &XA_SELECT || cmd == &XA_DEMO)
+       {
+         long a;
+         char c;
+         if (i+1 < argc && (1 == sscanf(argv[i+1], " %ld %c", &a, &c)))
+           {
+             arg = a;
+             i++;
+           }
+       }
+    }
+
+  if (!cmd)
+    USAGE ();
+
+  if (arg < 0)
+    /* no command may have a negative argument. */
+    USAGE();
+  else if (arg == 0)
+    {
+      /* SELECT must have a non-zero argument. */
+      if (cmd == &XA_SELECT)
+       USAGE();
+    }
+  else /* arg > 0 */
+    {
+      /* no command other than SELECT and DEMO may have a non-zero argument. */
+      if (cmd != &XA_DEMO && cmd != &XA_SELECT)
+       USAGE();
+    }
+
+
+
+  /* For backward compatibility: -demo with no arguments used to send a
+     "DEMO 0" ClientMessage to the xscreensaver process, which brought up
+     the built-in demo mode dialog.  Now that the demo mode dialog is no
+     longer built in, we bring it up by just running the "xscreensaver-demo"
+     program.
+
+     Note that "-DEMO <n>" still sends a ClientMessage.
+   */
+  if (cmd == &XA_PREFS ||
+      (cmd == &XA_DEMO && arg == 0))
+    {
+      char buf [512];
+      char *new_argv[] = { "xscreensaver-demo", 0, 0, 0, 0, 0 };
+      int ac = 1;
+
+      if (dpyname)
+       {
+         new_argv[ac++] = "-display";
+         new_argv[ac++] = dpyname;
+       }
+
+      if (cmd == &XA_PREFS)
+       new_argv[ac++] = "-prefs";
+
+      fflush(stdout);
+      fflush(stderr);
+      execvp (new_argv[0], new_argv);  /* shouldn't return */
+
+      sprintf (buf, "%s: could not exec %s", progname, new_argv[0]);
+      perror(buf);
+      fflush(stdout);
+      fflush(stderr);
+      exit (-1);
+    }
+
+
+
+  if (!dpyname) dpyname = (char *) getenv ("DISPLAY");
+  dpy = XOpenDisplay (dpyname);
+  if (!dpy)
+    {
+      fprintf (stderr, "%s: can't open display %s\n", progname,
+              (dpyname ? dpyname : "(null)"));
+      exit (1);
+    }
+
+  XA_VROOT = XInternAtom (dpy, "__SWM_VROOT", False);
+  XA_SCREENSAVER = XInternAtom (dpy, "SCREENSAVER", False);
+  XA_SCREENSAVER_ID = XInternAtom (dpy, "_SCREENSAVER_ID", False);
+  XA_SCREENSAVER_VERSION = XInternAtom (dpy, "_SCREENSAVER_VERSION",False);
+  XA_SCREENSAVER_TIME = XInternAtom (dpy, "_SCREENSAVER_TIME", False);
+  XA_SCREENSAVER_RESPONSE = XInternAtom (dpy, "_SCREENSAVER_RESPONSE", False);
+  XA_ACTIVATE = XInternAtom (dpy, "ACTIVATE", False);
+  XA_DEACTIVATE = XInternAtom (dpy, "DEACTIVATE", False);
+  XA_RESTART = XInternAtom (dpy, "RESTART", False);
+  XA_CYCLE = XInternAtom (dpy, "CYCLE", False);
+  XA_NEXT = XInternAtom (dpy, "NEXT", False);
+  XA_PREV = XInternAtom (dpy, "PREV", False);
+  XA_SELECT = XInternAtom (dpy, "SELECT", False);
+  XA_EXIT = XInternAtom (dpy, "EXIT", False);
+  XA_DEMO = XInternAtom (dpy, "DEMO", False);
+  XA_PREFS = XInternAtom (dpy, "PREFS", False);
+  XA_LOCK = XInternAtom (dpy, "LOCK", False);
+  XA_THROTTLE = XInternAtom (dpy, "THROTTLE", False);
+  XA_UNTHROTTLE = XInternAtom (dpy, "UNTHROTTLE", False);
+
+  XSync (dpy, 0);
+
+  if (*cmd == XA_ACTIVATE || *cmd == XA_LOCK ||
+      *cmd == XA_NEXT || *cmd == XA_PREV || *cmd == XA_SELECT)
+    /* People never guess that KeyRelease deactivates the screen saver too,
+       so if we're issuing an activation command, wait a second. */
+    sleep (1);
+
+  i = xscreensaver_command (dpy, *cmd, arg, True);
+  if (i < 0) exit (i);
+  else exit (0);
+}
diff --git a/driver/xscreensaver-command.man b/driver/xscreensaver-command.man
new file mode 100644 (file)
index 0000000..352de64
--- /dev/null
@@ -0,0 +1,217 @@
+.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
+..
+.TH XScreenSaver 1 "23-Jun-99 (3.16)" "X Version 11"
+.SH NAME
+xscreensaver-command - control a running xscreensaver process
+.SH SYNOPSIS
+.B xscreensaver-command
+[\-help] \
+[\-demo] \
+[\-prefs] \
+[\-activate] \
+[\-deactivate] \
+[\-cycle] \
+[\-next] \
+[\-prev] \
+[\-select \fIn\fP] \
+[\-exit] \
+[\-restart] \
+[\-lock] \
+[\-throttle] \
+[\-unthrottle] \
+[\-version] \
+[\-time]
+.SH DESCRIPTION
+The \fIxscreensaver\-command\fP program controls a running \fIxscreensaver\fP
+process by sending it client-messages.
+
+.BR xscreensaver (1)
+has a client-server model: the xscreensaver process is a
+daemon that runs in the background; it is controlled by other
+foreground programs such as \fIxscreensaver-command\fP and
+.BR xscreensaver\-demo (1).
+
+This program, \fIxscreensaver-command\fP, is a command-line-oriented tool; the 
+.BR xscreensaver\-demo (1).
+program is a graphical tool.
+.SH OPTIONS
+.I xscreensaver-command
+accepts the following command-line options:
+.TP 8
+.B \-help
+Prints a brief summary of command-line options.
+.TP 8
+.B \-demo
+This just launches the
+.BR xscreensaver\-demo (1)
+program, in which one can experiment with the various graphics hacks
+available, and edit parameters.
+.TP 8
+.B \-demo \fP\fInumber\fP
+When the \fI\-demo\fP option is followed by an integer, it instructs 
+the \fIxscreensaver\fP daemon to run that hack, and wait for the user
+to click the mouse before deactivating (i.e., mouse motion does not
+deactivate.)  This is the mechanism by which
+.BR xscreensaver\-demo (1)
+communicates with the
+.BR xscreensaver (1)
+daemon.  (The first hack in the list is numbered 1, not 0.)
+.TP 8
+.B \-prefs
+Like the no-argument form of \fI\-demo\fP, but brings up that program's
+Preferences panel by default.
+.TP 8
+.B \-activate
+Tell xscreensaver to turn on immediately (that is, blank the screen, as if
+the user had been idle for long enough.)  The screensaver will deactivate as
+soon as there is any user activity, as usual.
+
+It is useful to run this from a menu; you may wish to run it as
+.EX
+sleep 5 ; xscreensaver-command -activate
+.EE
+to be sure that you have time to take your hand off the mouse before
+the screensaver comes on.  (Because if you jiggle the mouse, xscreensaver
+will notice, and deactivate.)
+.TP 8
+.B \-deactivate
+If the screensaver is active (the screen is blanked), this command will
+deactivate it just as if there had been keyboard or mouse activity.  
+If locking is enabled, then the screensaver will prompt for a password
+as usual.
+.TP 8
+.B \-cycle
+If the screensaver is active (the screen is blanked), then stop the current
+graphics demo and run a new one (chosen randomly.)
+.TP 8
+.B \-next
+This is like either \fI\-activate\fP or \fI\-cycle\fP, depending on which is
+more appropriate, except that the graphics hack that will be run is the next
+one in the list, instead of a randomly-chosen one.  In other words, 
+repeatedly executing -next will cause the xscreensaver process to invoke each
+graphics demo sequentially.  (Though using the \fI\-demo\fP option is probably
+an easier way to accomplish that.)
+.TP 8
+.B \-prev
+This is like \fI\-next\fP, but cycles in the other direction.
+.TP 8
+.B \-select \fInumber\fP
+Like \fI\-activate\fP, but runs the \fIN\fPth element in the list of hacks.
+By knowing what is in the \fIprograms\fP list, and in what order, you can use
+this to activate the screensaver with a particular graphics demo.  (The first
+element in the list is numbered 1, not 0.)
+.TP 8
+.B \-exit
+Causes the xscreensaver process to exit gracefully.  This is roughly the same
+as killing the process with
+.BR kill (1),
+but it is easier, since you don't need to first figure out the pid.  
+
+.B Warning:
+never use \fIkill -9\fP with \fIxscreensaver\fP while the screensaver is
+active.  If you are using a virtual root window manager, that can leave
+things in an inconsistent state, and you may need to restart your window
+manager to repair the damage.
+.TP 8
+.B \-lock
+Tells the running xscreensaver process to lock the screen immediately.  
+This is like \fI\-activate\fP, but forces locking as well, even if locking
+is not the default (that is, even if xscreensaver's \fIlock\fP resource is
+false, and even if the \fIlockTimeout\fP resource is non-zero.)
+
+Note that locking doesn't work unless the \fIxscreensaver\fP process is
+running as you.  See 
+.BR xscreensaver (1)
+for details.
+.TP 8
+.B \-throttle
+Temporarily switch to ``blank screen'' mode, and don't run any display modes
+at all, until the screensaver is next de-activated.  This is useful if you're
+using a machine remotely, and you find that some display modes are using too
+much CPU.  
+
+(If you want to do this \fIpermanently\fP, that is, you want the screen saver
+to only blank the screen and not run demos at all, then set the \fIprograms\fP
+resource to an empty list:  See
+.BR xscreensaver (1)
+for details.)
+.TP 8
+.B \-unthrottle
+Turn `-throttle' mode off and resume normal behavior.
+.TP 8
+.B \-version
+Prints the version of xscreensaver that is currently running on the display:
+that is, the actual version number of the running xscreensaver background 
+process, rather than the version number of xscreensaver-command.  (To see
+the version number of \fIxscreensaver-command\fP itself, use 
+the \fI\-help\fP option.)
+.TP 8
+.B \-time
+Prints the time at which the screensaver last activated or 
+deactivated (roughly, how long the user has been idle or non-idle: but 
+not quite, since it only tells you when the screen became blanked or
+un-blanked.)
+.TP 8
+.B \-restart
+Causes the screensaver process to exit and then restart with the same command
+line arguments as last time.  Do this after you've changed the resource
+database, to cause xscreensaver to notice the changes.
+
+.B Warning:
+if you have a \fI.xscreensaver\fP file, this might not do what you 
+expect.  You're probably better off killing the existing 
+xscreensaver (with \fIxscreensaver\-command -exit\fP) and then
+launching it again.
+
+The important point is, you need to make sure that the xscreensaver 
+process is running as you.  If it's not, it won't be reading the 
+right \fI.xscreensaver\fP file.
+.SH DIAGNOSTICS
+If an error occurs while communicating with the \fIxscreensaver\fP daemon, or
+if the daemon reports an error, a diagnostic message will be printed to
+stderr, and \fIxscreensaver-command\fP will exit with a non-zero value.  If
+the command is accepted, an indication of this will be printed to stdout, and
+the exit value will be zero.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the host and display number of the screen whose saver is
+to be manipulated.
+.TP 8
+.B PATH
+to find the executable to restart (for the \fI\-restart\fP command).  
+Note that this variable is consulted in the environment of 
+the \fIxscreensaver\fP process, not the \fIxscreensaver-command\fP process.
+.SH UPGRADES
+The latest version of
+.BR xscreensaver (1)
+and related tools can always be found at http://www.jwz.org/xscreensaver/
+.SH "SEE ALSO"
+.BR X (1),
+.BR xscreensaver (1)
+.BR xscreensaver\-demo (1)
+.SH COPYRIGHT
+Copyright \(co 1992, 1993, 1997, 1998, 1999
+by Jamie Zawinski.  Permission to use, copy, modify, distribute, and sell
+this software 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.  No representations are made about the suitability of this
+software for any purpose.  It is provided "as is" without express or implied
+warranty.
+.SH AUTHOR
+Jamie Zawinski <jwz@jwz.org>, 13-aug-92.
+
+Please let me know if you find any bugs or make any improvements.
diff --git a/driver/xscreensaver-demo.man b/driver/xscreensaver-demo.man
new file mode 100644 (file)
index 0000000..d246c84
--- /dev/null
@@ -0,0 +1,208 @@
+.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
+..
+.TH XScreenSaver 1 "23-Jun-99 (3.16)" "X Version 11"
+.SH NAME
+xscreensaver-demo - interactively control the background xscreensaver daemon
+.SH SYNOPSIS
+.B xscreensaver\-demo
+[\-display \fIhost:display.screen\fP] [\-prefs] [\-xrm \fIresources\fP]
+.SH DESCRIPTION
+The \fIxscreensaver\-demo\fP program is a graphical front-end for 
+setting the parameters used by the background
+.BR xscreensaver (1)
+daemon.
+It is essentially two things: a tool for editing the \fI~/.xscreensaver\fP
+file; and a tool for demoing the various graphics hacks that 
+the \fIxscreensaver\fP daemon will launch.
+
+The main dialog box contains a scrolling list, a text field, and a number 
+of buttons.  
+
+Double-clicking on one of the programs in the list will run it.  The screen
+will go black, and the program will run in full-screen mode, just as it would
+if the \fIxscreensaver\fP daemon had launched it.  Clicking the mouse again
+will stop the demo and un-blank the screen, making the dialog box visible 
+again.
+
+Single-clicking in the list will place the indicated program and its args
+in the text field to be edited.  Edit the arguments and hit return to run
+the program with the parameters you have specified.  This will also save
+your changes to your \fI~/.xscreensaver\fP file: so any changes you make
+in this way are persistent.
+
+If one of the lines in the scrolling list begins with the character "-",
+then that means that the program is disabled: \fIxscreensaver\fP will not
+select it to be run (though you can still try it out by clicking on it.)
+Rather than just deleting the programs you don't want to run, you might
+want to disable them in this way instead, so that you can more easily change
+your mind later.
+
+If the line begins with the name of a visual, followed by a colon, then
+that program will only be run on that kind of visual.  For example, you can
+specify that a particular program should only be run if color is available,
+and another should only be run in monochrome.  See the discussion of 
+the \fIprograms\fP parameter in the \fIConfiguration\fP section of the
+.BR xscreensaver (1)
+manual.
+
+The buttons are:
+.TP 8
+.B Run Next
+Clicking this button will run the next program in the list after the 
+currently-selected one, and will wrap around to the top when it reaches
+the bottom.
+.TP 8
+.B Run Previous
+Opposite of Run Next; at the top, it wraps around to the bottom.
+.TP 8
+.B Preferences
+This pops up a second dialog box, in which you have the option to 
+interactively change most of the screensaver's operational parameters,
+such as its timeouts, and whether it should lock the screen.  When you
+click OK, your chosen settings will take effect immediately, and will
+also be saved to the \fI~/.xscreensaver\fP file in your home directory,
+so that the settings will persist next time.
+.TP 8
+.B Quit
+Exits the \fIxscreensaver-demo\fP program.  The background \fIxscreensaver\fP
+daemon will continue running as before.
+.P
+The Preferences dialog box lets you change the following settings.
+
+(There are more settings available, but these are the most commonly used
+ones; see the manual for
+.BR xscreensaver (1)
+for other parameters that can be set by editing the \fI~/.xscreensaver\fP
+file, or the X resource database.)
+.TP 8
+.B Saver Timeout
+After the user has been idle this long, the \fIxscreensaver\fP daemon
+will blank the screen.
+.TP 8
+.B Cycle Timeout
+After the screensaver has been running for this long, the currently
+running graphics demo will be killed, and a new one started.  
+If this is 0, then the graphics demo will never be changed:
+only one demo will run until the screensaver is deactivated by user 
+activity.
+.TP 8
+.B Verbose\ 
+Whether to print lots of debugging information.
+.TP 8
+.B Install Colormap
+Whether to install a private colormap while the screensaver is active, so
+that the graphics hacks can get as many colors as possible.  (This only
+applies when the screen's default visual is being used, since non-default
+visuals get their own colormaps automatically.)  This can also be overridden
+on a per-demo basis.
+.TP 8
+.B Fade Colormap
+If selected, then when the screensaver activates, the current contents
+of the screen will fade to black instead of simply winking out.  This only
+works on displays with writable colormaps, that is, if the screen's default
+visual is a PseudoColor visual.  A fade will also be done when
+switching graphics hacks (when the \fICycle Timeout\fP expires.)
+.TP 8
+.B Unfade Colormap
+The complement to \fIFade Colormap\fP: if selected, then when the screensaver
+deactivates, the original contents of the screen will fade in from black
+instead of appearing immediately.  This only works on displays with writable
+colormaps, and when \fIFade Colormap\fP is also selected.
+.TP 8
+.B Fade Duration
+When fading or unfading are selected, this controls how long the fade will
+take.
+.TP 8
+.B Fade Ticks
+This controls how many times a second the colormap will be changed to 
+effect a fade.  Higher numbers yield smoother fades, but may make the
+fades take longer than the specified number of seconds, if your server
+isn't fast enough to keep up.
+.TP 8
+.B Require Password
+Whether the screen saver should lock the screen when it activates.
+.TP 8
+.B Lock Timeout
+If \fIRequire Password\fP is selected, this controls the length of 
+the ``grace period'' between when the screensaver activates, and when the
+screen becomes locked.  For example, if this is 0:05:00, 
+and \fISaver Timeout\fP is 0:10:00, then after 10 minutes, the screen 
+would blank.  If there was user  activity at 12 minutes, no password
+would be required to un-blank the screen.  But, if there was user activity
+at 15 minutes or later (that is, \fILock Timeout\fP minutes after 
+activation) then a password would be required.  The default is 0, meaning
+that if locking is enabled, then a password will be required as soon as the 
+screen blanks.
+.TP 8
+.B Password Timeout
+When the screensaver is prompting for a password, the prompt dialog box will
+stay on the screen for this long before giving up, and reverting to 
+screen-saving mode.
+.SH COMMAND-LINE OPTIONS
+.I xscreensaver\-demo
+accepts the following command line options.
+.TP 8
+.B \-display \fIhost:display.screen\fP
+The X display to use.  The \fIxscreensaver\-demo\fP program will open its
+window on that display, and also control the \fIxscreensaver\fP daemon that
+is managing that same display.
+.TP 8
+.B \-prefs
+Start up in Preferences mode: this is just like launching the program with
+no arguments, and then pressing the \fIPreferences\fP button.
+.P
+It is important that the \fIxscreensaver\fP and \fIxscreensaver\-demo\fP
+processes be running on the same machine, or at least, on two machines
+that share a file system.  When \fIxscreensaver\-demo\fP writes a new version
+of the \fI~/.xscreensaver\fP file, it's important that the \fIxscreensaver\fP
+see that same file.  If the two processes are seeing 
+different \fI~/.xscreensaver\fP files, things will malfunction.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B PATH
+to find the sub-programs to run.  However, note that the sub-programs 
+are actually launched by the \fIxscreensaver\fP daemon, not 
+by \fIxscreensaver-demo\fP itself.  So, what matters is what \fB$PATH\fP
+the \fIxscreensaver\fP program sees.
+.TP 8
+.B HOME
+for the directory in which to read and write the \fI.xscreensaver\fP file.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH UPGRADES
+The latest version can always be found at 
+http://www.jwz.org/xscreensaver/
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1),
+.BR xscreensaver\-command (1)
+.SH COPYRIGHT
+Copyright \(co 1992, 1993, 1997, 1998, 1999
+by Jamie Zawinski.  Permission to use, copy, modify, distribute, and sell
+this software 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.  No representations are made about the suitability of this
+software for any purpose.  It is provided "as is" without express or implied
+warranty.
+.SH AUTHOR
+Jamie Zawinski <jwz@jwz.org>, 13-aug-92.
+
+Please let me know if you find any bugs or make any improvements.
diff --git a/driver/xscreensaver.c b/driver/xscreensaver.c
new file mode 100644 (file)
index 0000000..c88f36c
--- /dev/null
@@ -0,0 +1,1622 @@
+/* xscreensaver, Copyright (c) 1991-1999 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software 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.  No representations are made about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or 
+ * implied warranty.
+ */
+
+/*   ========================================================================
+ *   First we wait until the keyboard and mouse become idle for the specified
+ *   amount of time.  We do this in one of three different ways: periodically
+ *   checking with the XIdle server extension; selecting key and mouse events
+ *   on (nearly) all windows; or by waiting for the MIT-SCREEN-SAVER extension
+ *   to send us a "you are idle" event.
+ *
+ *   Then, we map a full screen black window (or, in the case of the 
+ *   MIT-SCREEN-SAVER extension, use the one it gave us.)
+ *
+ *   We place a __SWM_VROOT property on this window, so that newly-started
+ *   clients will think that this window is a "virtual root" window.
+ *
+ *   If there is an existing "virtual root" window (one that already had
+ *   an __SWM_VROOT property) then we remove that property from that window.
+ *   Otherwise, clients would see that window (the real virtual root) instead
+ *   of ours (the impostor.)
+ *
+ *   Then we pick a random program to run, and start it.  Two assumptions 
+ *   are made about this program: that it has been specified with whatever
+ *   command-line options are necessary to make it run on the root window;
+ *   and that it has been compiled with vroot.h, so that it is able to find
+ *   the root window when a virtual-root window manager (or this program) is
+ *   running.
+ *
+ *   Then, we wait for keyboard or mouse events to be generated on the window.
+ *   When they are, we kill the inferior process, unmap the window, and restore
+ *   the __SWM_VROOT property to the real virtual root window if there was one.
+ *
+ *   While we are waiting, we also set up timers so that, after a certain 
+ *   amount of time has passed, we can start a different screenhack.  We do
+ *   this by killing the running child process with SIGTERM, and then starting
+ *   a new one in the same way.
+ *
+ *   If there was a real virtual root, meaning that we removed the __SWM_VROOT
+ *   property from it, meaning we must (absolutely must) restore it before we
+ *   exit, then we set up signal handlers for most signals (SIGINT, SIGTERM,
+ *   etc.) that do this.  Most Xlib and Xt routines are not reentrant, so it
+ *   is not generally safe to call them from signal handlers; however, this
+ *   program spends most of its time waiting, so the window of opportunity 
+ *   when code could be called reentrantly is fairly small; and also, the worst
+ *   that could happen is that the call would fail.  If we've gotten one of
+ *   these signals, then we're on our way out anyway.  If we didn't restore the
+ *   __SWM_VROOT property, that would be very bad, so it's worth a shot.  Note
+ *   that this means that, if you're using a virtual-root window manager, you
+ *   can really fuck up the world by killing this process with "kill -9".
+ *
+ *   This program accepts ClientMessages of type SCREENSAVER; these messages
+ *   may contain the atom ACTIVATE or DEACTIVATE, meaning to turn the 
+ *   screensaver on or off now, regardless of the idleness of the user,
+ *   and a few other things.  The included "xscreensaver_command" program
+ *   sends these messsages.
+ *
+ *   If we don't have the XIdle, MIT-SCREEN-SAVER, or SGI SCREEN_SAVER
+ *   extensions, then we do the XAutoLock trick: notice every window that
+ *   gets created, and wait 30 seconds or so until its creating process has
+ *   settled down, and then select KeyPress events on those windows which
+ *   already select for KeyPress events.  It's important that we not select
+ *   KeyPress on windows which don't select them, because that would
+ *   interfere with event propagation.  This will break if any program
+ *   changes its event mask to contain KeyRelease or PointerMotion more than
+ *   30 seconds after creating the window, but that's probably pretty rare.
+ *   
+ *   The reason that we can't select KeyPresses on windows that don't have
+ *   them already is that, when dispatching a KeyPress event, X finds the
+ *   lowest (leafmost) window in the hierarchy on which *any* client selects
+ *   for KeyPress, and sends the event to that window.  This means that if a
+ *   client had a window with subwindows, and expected to receive KeyPress
+ *   events on the parent window instead of the subwindows, then that client
+ *   would malfunction if some other client selected KeyPress events on the
+ *   subwindows.  It is an incredible misdesign that one client can make
+ *   another client malfunction in this way.
+ *
+ *   To detect mouse motion, we periodically wake up and poll the mouse
+ *   position and button/modifier state, and notice when something has
+ *   changed.  We make this check every five seconds by default, and since the
+ *   screensaver timeout has a granularity of one minute, this makes the
+ *   chance of a false positive very small.  We could detect mouse motion in
+ *   the same way as keyboard activity, but that would suffer from the same
+ *   "client changing event mask" problem that the KeyPress events hack does.
+ *   I think polling is more reliable.
+ *
+ *   None of this crap happens if we're using one of the extensions, so install
+ *   one of them if the description above sounds just too flaky to live.  It
+ *   is, but those are your choices.
+ *
+ *   A third idle-detection option could be implemented (but is not): when
+ *   running on the console display ($DISPLAY is `localhost`:0) and we're on a
+ *   machine where /dev/tty and /dev/mouse have reasonable last-modification
+ *   times, we could just stat() those.  But the incremental benefit of
+ *   implementing this is really small, so forget I said anything.
+ *
+ *   Debugging hints:
+ *     - Have a second terminal handy.
+ *     - Be careful where you set your breakpoints, you don't want this to
+ *       stop under the debugger with the keyboard grabbed or the blackout
+ *       window exposed.
+ *     - If you run your debugger under XEmacs, try M-ESC (x-grab-keyboard)
+ *       to keep your emacs window alive even when xscreensaver has grabbed.
+ *     - Go read the code related to `debug_p'.
+ *     - You probably can't set breakpoints in functions that are called on
+ *       the other side of a call to fork() -- if your clients are dying 
+ *       with signal 5, Trace/BPT Trap, you're losing in this way.
+ *     - If you aren't using a server extension, don't leave this stopped
+ *       under the debugger for very long, or the X input buffer will get
+ *       huge because of the keypress events it's selecting for.  This can
+ *       make your X server wedge with "no more input buffers."
+ *       
+ * ======================================================================== */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <stdio.h>
+#include <ctype.h>
+#include <X11/Xlib.h>
+#include <X11/Xatom.h>
+#include <X11/Intrinsic.h>
+#include <X11/StringDefs.h>
+#include <X11/Shell.h>
+#include <X11/Xos.h>
+#include <netdb.h>     /* for gethostbyname() */
+#ifdef HAVE_XMU
+# ifndef VMS
+#  include <X11/Xmu/Error.h>
+# else  /* !VMS */
+#  include <Xmu/Error.h>
+# endif /* !VMS */
+#else  /* !HAVE_XMU */
+# include "xmu.h"
+#endif /* !HAVE_XMU */
+
+#ifdef HAVE_XIDLE_EXTENSION
+# include <X11/extensions/xidle.h>
+#endif /* HAVE_XIDLE_EXTENSION */
+
+#include "xscreensaver.h"
+#include "version.h"
+#include "yarandom.h"
+#include "resources.h"
+#include "visual.h"
+#include "usleep.h"
+
+saver_info *global_si_kludge = 0;      /* I hate C so much... */
+
+char *progname = 0;
+char *progclass = 0;
+XrmDatabase db = 0;
+
+
+static Atom XA_SCREENSAVER_RESPONSE;
+static Atom XA_ACTIVATE, XA_DEACTIVATE, XA_CYCLE, XA_NEXT, XA_PREV;
+static Atom XA_EXIT, XA_RESTART, XA_LOCK, XA_SELECT;
+static Atom XA_THROTTLE, XA_UNTHROTTLE;
+Atom XA_DEMO, XA_PREFS;
+
+\f
+static XrmOptionDescRec options [] = {
+  { "-timeout",                   ".timeout",          XrmoptionSepArg, 0 },
+  { "-cycle",             ".cycle",            XrmoptionSepArg, 0 },
+  { "-lock-mode",         ".lock",             XrmoptionNoArg, "on" },
+  { "-no-lock-mode",      ".lock",             XrmoptionNoArg, "off" },
+  { "-no-lock",                   ".lock",             XrmoptionNoArg, "off" },
+  { "-lock-timeout",      ".lockTimeout",      XrmoptionSepArg, 0 },
+  { "-lock-vts",          ".lockVTs",          XrmoptionNoArg, "on" },
+  { "-no-lock-vts",       ".lockVTs",          XrmoptionNoArg, "off" },
+  { "-visual",            ".visualID",         XrmoptionSepArg, 0 },
+  { "-install",                   ".installColormap",  XrmoptionNoArg, "on" },
+  { "-no-install",        ".installColormap",  XrmoptionNoArg, "off" },
+  { "-verbose",                   ".verbose",          XrmoptionNoArg, "on" },
+  { "-silent",            ".verbose",          XrmoptionNoArg, "off" },
+  { "-timestamp",         ".timestamp",        XrmoptionNoArg, "on" },
+  { "-capture-stderr",    ".captureStderr",    XrmoptionNoArg, "on" },
+  { "-no-capture-stderr",  ".captureStderr",   XrmoptionNoArg, "off" },
+  { "-xidle-extension",           ".xidleExtension",   XrmoptionNoArg, "on" },
+  { "-no-xidle-extension", ".xidleExtension",  XrmoptionNoArg, "off" },
+  { "-mit-extension",     ".mitSaverExtension",XrmoptionNoArg, "on" },
+  { "-no-mit-extension",   ".mitSaverExtension",XrmoptionNoArg, "off" },
+  { "-sgi-extension",     ".sgiSaverExtension",XrmoptionNoArg, "on" },
+  { "-no-sgi-extension",   ".sgiSaverExtension",XrmoptionNoArg, "off" },
+  { "-proc-interrupts",           ".procInterrupts",   XrmoptionNoArg, "on" },
+  { "-no-proc-interrupts", ".procInterrupts",  XrmoptionNoArg, "off" },
+  { "-splash",            ".splash",           XrmoptionNoArg, "on" },
+  { "-no-splash",         ".splash",           XrmoptionNoArg, "off" },
+  { "-nosplash",          ".splash",           XrmoptionNoArg, "off" },
+  { "-idelay",            ".initialDelay",     XrmoptionSepArg, 0 },
+  { "-nice",              ".nice",             XrmoptionSepArg, 0 },
+
+  /* Actually these are built in to Xt, but just to be sure... */
+  { "-synchronous",       ".synchronous",      XrmoptionNoArg, "on" },
+  { "-xrm",               NULL,                XrmoptionResArg, NULL }
+};
+
+static char *defaults[] = {
+#include "XScreenSaver_ad.h"
+ 0
+};
+
+#ifdef _VROOT_H_
+ERROR!  You must not include vroot.h in this file.
+#endif
+
+static void
+do_help (saver_info *si)
+{
+  fflush (stdout);
+  fflush (stderr);
+  fprintf (stdout, "\
+xscreensaver %s, copyright (c) 1991-1999 by Jamie Zawinski <jwz@jwz.org>\n\
+The standard Xt command-line options are accepted; other options include:\n\
+\n\
+    -timeout <minutes>       When the screensaver should activate.\n\
+    -cycle <minutes>         How long to let each hack run before switching.\n\
+    -lock-mode               Require a password before deactivating.\n\
+    -lock-timeout <minutes>  Grace period before locking; default 0.\n\
+    -visual <id-or-class>    Which X visual to run on.\n\
+    -install                 Install a private colormap.\n\
+    -verbose                 Be loud.\n\
+    -no-splash               Don't display a splash-screen at startup.\n\
+    -help                    This message.\n\
+\n\
+See the manual for other options and X resources.\n\
+\n\
+The `xscreensaver' program should be left running in the background.\n\
+Use the `xscreensaver-demo' and `xscreensaver-command' programs to\n\
+manipulate a running xscreensaver.\n\
+\n\
+The `*programs' resource controls which graphics demos will be launched by\n\
+the screensaver.  See `man xscreensaver' or the web page for more details.\n\
+\n\
+Just getting started?  Try this:\n\
+\n\
+        xscreensaver &\n\
+        xscreensaver-demo\n\
+\n\
+For updates, check http://www.jwz.org/xscreensaver/\n\
+\n",
+         si->version);
+  fflush (stdout);
+  fflush (stderr);
+  exit (1);
+}
+
+
+char *
+timestring (void)
+{
+  time_t now = time ((time_t *) 0);
+  char *str = (char *) ctime (&now);
+  char *nl = (char *) strchr (str, '\n');
+  if (nl) *nl = 0; /* take off that dang newline */
+  return str;
+}
+
+static Bool blurb_timestamp_p = False;   /* kludge */
+
+const char *
+blurb (void)
+{
+  if (!blurb_timestamp_p)
+    return progname;
+  else
+    {
+      static char buf[255];
+      char *ct = timestring();
+      int n = strlen(progname);
+      if (n > 100) n = 99;
+      strncpy(buf, progname, n);
+      buf[n++] = ':';
+      buf[n++] = ' ';
+      strncpy(buf+n, ct+11, 8);
+      strcpy(buf+n+9, ": ");
+      return buf;
+    }
+}
+
+
+int
+saver_ehandler (Display *dpy, XErrorEvent *error)
+{
+  saver_info *si = global_si_kludge;   /* I hate C so much... */
+
+  if (!real_stderr) real_stderr = stderr;
+
+  fprintf (real_stderr, "\n"
+          "#######################################"
+          "#######################################\n\n"
+          "%s: X Error!  PLEASE REPORT THIS BUG.\n\n"
+          "#######################################"
+          "#######################################\n\n",
+          blurb());
+  if (XmuPrintDefaultErrorMessage (dpy, error, real_stderr))
+    {
+      fprintf (real_stderr, "\n");
+      if (si->prefs.xsync_p)
+       {
+         saver_exit (si, -1, "because of synchronous X Error");
+       }
+      else
+       {
+          fprintf (real_stderr,
+                   "#######################################"
+                   "#######################################\n\n");
+          fprintf (real_stderr,
+   "    If at all possible, please re-run xscreensaver with the command line\n"
+   "    arguments `-sync -verbose', and reproduce this bug.  That will cause\n"
+   "    xscreensaver to dump a `core' file to the current directory.  Please\n"
+   "    include the stack trace from that core file in your bug report.\n"
+   "\n"
+   "    http://www.jwz.org/xscreensaver/bugs.html explains how to create the\n"
+   "    most useful bug reports, and how to examine core files.\n"
+   "\n"
+   "    The more information you can provide, the better.  But please report\n"
+   "    report this bug, regardless!\n"
+   "\n");
+          fprintf (real_stderr,
+                   "#######################################"
+                   "#######################################\n\n");
+
+         saver_exit (si, -1, 0);
+       }
+    }
+  else
+    fprintf (real_stderr, " (nonfatal.)\n");
+  return 0;
+}
+
+
+/* This error handler is used only while the X connection is being set up;
+   after we've got a connection, we don't use this handler again.  The only
+   reason for having this is so that we can present a more idiot-proof error
+   message than "cannot open display."
+ */
+static void 
+startup_ehandler (String name, String type, String class,
+                  String defalt,  /* one can't even spel properly
+                                     in this joke of a language */
+                  String *av, Cardinal *ac)
+{
+  char fmt[512];
+  String p[10];
+  saver_info *si = global_si_kludge;   /* I hate C so much... */
+  XrmDatabase *db = XtAppGetErrorDatabase(si->app);
+  *fmt = 0;
+  XtAppGetErrorDatabaseText(si->app, name, type, class, defalt,
+                            fmt, sizeof(fmt)-1, *db);
+
+  fprintf (stderr, "%s: ", blurb());
+
+  memset (p, 0, sizeof(p));
+  if (*ac > countof (p)) *ac = countof (p);
+  memcpy ((char *) p, (char *) av, (*ac) * sizeof(*av));
+  fprintf (stderr, fmt,                /* Did I mention that I hate C? */
+           p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7], p[8], p[9]);
+  fprintf (stderr, "\n");
+
+  describe_uids (si, stderr);
+  fprintf (stderr, "\n"
+           "%s: Errors at startup are usually authorization problems.\n"
+           "              Did you read the manual?  Specifically, the parts\n"
+           "              that talk about XAUTH, XDM, and root logins?\n"
+           "\n"
+           "              http://www.jwz.org/xscreensaver/man.html\n"
+           "\n",
+           blurb());
+
+  fflush (stderr);
+  fflush (stdout);
+  exit (1);
+}
+
+\f
+/* The zillions of initializations.
+ */
+
+/* Set progname, version, etc.  This is done very early.
+ */
+static void
+set_version_string (saver_info *si, int *argc, char **argv)
+{
+  progclass = "XScreenSaver";
+
+  /* progname is reset later, after we connect to X. */
+  progname = strrchr(argv[0], '/');
+  if (progname) progname++;
+  else progname = argv[0];
+
+  if (strlen(progname) > 100)  /* keep it short. */
+    progname[99] = 0;
+
+  /* The X resource database blows up if argv[0] has a "." in it. */
+  {
+    char *s = argv[0];
+    while ((s = strchr (s, '.')))
+      *s = '_';
+  }
+
+  si->version = (char *) malloc (5);
+  memcpy (si->version, screensaver_id + 17, 4);
+  si->version [4] = 0;
+}
+
+
+/* Initializations that potentially take place as a priveleged user:
+   If the xscreensaver executable is setuid root, then these initializations
+   are run as root, before discarding privileges.
+ */
+static void
+privileged_initialization (saver_info *si, int *argc, char **argv)
+{
+#ifndef NO_LOCKING
+  /* before hack_uid() for proper permissions */
+  lock_priv_init (*argc, argv, si->prefs.verbose_p);
+#endif /* NO_LOCKING */
+
+  hack_uid (si);
+}
+
+
+/* Figure out what locking mechanisms are supported.
+ */
+static void
+lock_initialization (saver_info *si, int *argc, char **argv)
+{
+#ifdef NO_LOCKING
+  si->locking_disabled_p = True;
+  si->nolock_reason = "not compiled with locking support";
+#else /* !NO_LOCKING */
+
+  /* Finish initializing locking, now that we're out of privileged code. */
+  if (! lock_init (*argc, argv, si->prefs.verbose_p))
+    {
+      si->locking_disabled_p = True;
+      si->nolock_reason = "error getting password";
+    }
+#endif /* NO_LOCKING */
+
+  hack_uid (si);
+}
+
+
+/* Open the connection to the X server, and intern our Atoms.
+ */
+static Widget
+connect_to_server (saver_info *si, int *argc, char **argv)
+{
+  Widget toplevel_shell;
+
+  XSetErrorHandler (saver_ehandler);
+
+  XtAppSetErrorMsgHandler (si->app, startup_ehandler);
+  toplevel_shell = XtAppInitialize (&si->app, progclass,
+                                   options, XtNumber (options),
+                                   argc, argv, defaults, 0, 0);
+  XtAppSetErrorMsgHandler (si->app, 0);
+
+  si->dpy = XtDisplay (toplevel_shell);
+  si->prefs.db = XtDatabase (si->dpy);
+  XtGetApplicationNameAndClass (si->dpy, &progname, &progclass);
+
+  if(strlen(progname) > 100)   /* keep it short. */
+    progname [99] = 0;
+
+  db = si->prefs.db;   /* resources.c needs this */
+
+  XA_VROOT = XInternAtom (si->dpy, "__SWM_VROOT", False);
+  XA_SCREENSAVER = XInternAtom (si->dpy, "SCREENSAVER", False);
+  XA_SCREENSAVER_VERSION = XInternAtom (si->dpy, "_SCREENSAVER_VERSION",False);
+  XA_SCREENSAVER_ID = XInternAtom (si->dpy, "_SCREENSAVER_ID", False);
+  XA_SCREENSAVER_TIME = XInternAtom (si->dpy, "_SCREENSAVER_TIME", False);
+  XA_SCREENSAVER_RESPONSE = XInternAtom (si->dpy, "_SCREENSAVER_RESPONSE",
+                                        False);
+  XA_XSETROOT_ID = XInternAtom (si->dpy, "_XSETROOT_ID", False);
+  XA_ACTIVATE = XInternAtom (si->dpy, "ACTIVATE", False);
+  XA_DEACTIVATE = XInternAtom (si->dpy, "DEACTIVATE", False);
+  XA_RESTART = XInternAtom (si->dpy, "RESTART", False);
+  XA_CYCLE = XInternAtom (si->dpy, "CYCLE", False);
+  XA_NEXT = XInternAtom (si->dpy, "NEXT", False);
+  XA_PREV = XInternAtom (si->dpy, "PREV", False);
+  XA_SELECT = XInternAtom (si->dpy, "SELECT", False);
+  XA_EXIT = XInternAtom (si->dpy, "EXIT", False);
+  XA_DEMO = XInternAtom (si->dpy, "DEMO", False);
+  XA_PREFS = XInternAtom (si->dpy, "PREFS", False);
+  XA_LOCK = XInternAtom (si->dpy, "LOCK", False);
+  XA_THROTTLE = XInternAtom (si->dpy, "THROTTLE", False);
+  XA_UNTHROTTLE = XInternAtom (si->dpy, "UNTHROTTLE", False);
+
+  return toplevel_shell;
+}
+
+
+/* Handle the command-line arguments that were not handled for us by Xt.
+   Issue an error message and exit if there are unknown options.
+ */
+static void
+process_command_line (saver_info *si, int *argc, char **argv)
+{
+  int i;
+  for (i = 1; i < *argc; i++)
+    {
+      if (!strcmp (argv[i], "-debug"))
+       /* no resource for this one, out of paranoia. */
+       si->prefs.debug_p = True;
+
+      else if (!strcmp (argv[i], "-h") ||
+              !strcmp (argv[i], "-help") ||
+              !strcmp (argv[i], "--help"))
+       do_help (si);
+
+      else
+       {
+         const char *s = argv[i];
+         fprintf (stderr, "%s: unknown option \"%s\".  Try \"-help\".\n",
+                  blurb(), s);
+
+         if (s[0] == '-' && s[1] == '-') s++;
+         if (!strcmp (s, "-activate") ||
+             !strcmp (s, "-deactivate") ||
+             !strcmp (s, "-cycle") ||
+             !strcmp (s, "-next") ||
+             !strcmp (s, "-prev") ||
+             !strcmp (s, "-exit") ||
+             !strcmp (s, "-restart") ||
+             !strcmp (s, "-demo") ||
+             !strcmp (s, "-prefs") ||
+             !strcmp (s, "-preferences") ||
+             !strcmp (s, "-lock") ||
+             !strcmp (s, "-version") ||
+             !strcmp (s, "-time"))
+           {
+
+             if (!strcmp (s, "-demo") || !strcmp (s, "-prefs"))
+               fprintf (stderr, "\n\
+    Perhaps you meant to run the `xscreensaver-demo' program instead?\n");
+             else
+               fprintf (stderr, "\n\
+    However, `%s' is an option to the `xscreensaver-command' program.\n", s);
+
+             fprintf (stderr, "\
+    The `xscreensaver' program is a daemon that runs in the background.\n\
+    You control a running xscreensaver process by sending it messages\n\
+    with `xscreensaver-demo' or `xscreensaver-command'.\n\
+.   See the man pages for details, or check the web page:\n\
+    http://www.jwz.org/xscreensaver/\n\n");
+
+             /* Since version 1.21 renamed the "-lock" option to "-lock-mode",
+                suggest that explicitly. */
+             if (!strcmp (s, "-lock"))
+               fprintf (stderr, "\
+    Or perhaps you meant either the \"-lock-mode\" or the\n\
+    \"-lock-timeout <minutes>\" options to xscreensaver?\n\n");
+           }
+
+         exit (1);
+       }
+    }
+}
+
+
+/* Print out the xscreensaver banner to the tty if applicable;
+   Issue any other warnings that are called for at this point.
+ */
+static void
+print_banner (saver_info *si)
+{
+  saver_preferences *p = &si->prefs;
+
+  /* This resource gets set some time before the others, so that we know
+     whether to print the banner (and so that the banner gets printed before
+     any resource-database-related error messages.)
+   */
+  p->verbose_p = (p->debug_p || get_boolean_resource ("verbose", "Boolean"));
+
+  /* Ditto, for the locking_disabled_p message. */
+  p->lock_p = get_boolean_resource ("lock", "Boolean");
+
+  if (p->verbose_p)
+    fprintf (stderr,
+            "%s %s, copyright (c) 1991-1999 "
+            "by Jamie Zawinski <jwz@jwz.org>.\n",
+            progname, si->version);
+
+  if (p->debug_p)
+    fprintf (stderr, "\n"
+            "%s: Warning: running in DEBUG MODE.  Be afraid.\n"
+            "\n"
+            "\tNote that in debug mode, the xscreensaver window will only\n"
+            "\tcover the left half of the screen.  (The idea is that you\n"
+            "\tcan still see debugging output in a shell, if you position\n"
+            "\tit on the right side of the screen.)\n"
+            "\n"
+            "\tDebug mode is NOT SECURE.  Do not run with -debug in\n"
+            "\tuntrusted environments.\n"
+            "\n",
+            blurb());
+
+  if (p->verbose_p)
+    {
+      if (!si->uid_message || !*si->uid_message)
+       describe_uids (si, stderr);
+      else
+       {
+         if (si->orig_uid && *si->orig_uid)
+           fprintf (stderr, "%s: initial effective uid/gid was %s.\n",
+                    blurb(), si->orig_uid);
+         fprintf (stderr, "%s: %s\n", blurb(), si->uid_message);
+       }
+
+      fprintf (stderr, "%s: in process %lu.\n", blurb(),
+              (unsigned long) getpid());
+    }
+
+  /* If locking was not able to be initalized for some reason, explain why.
+     (This has to be done after we've read the lock_p resource.)
+   */
+  if (p->lock_p && si->locking_disabled_p)
+    {
+      p->lock_p = False;
+      fprintf (stderr, "%s: locking is disabled (%s).\n", blurb(),
+              si->nolock_reason);
+      if (strstr (si->nolock_reason, "passw"))
+       fprintf (stderr, "%s: does xscreensaver need to be setuid?  "
+                "consult the manual.\n", blurb());
+      else if (strstr (si->nolock_reason, "running as "))
+       fprintf (stderr, 
+                "%s: locking only works when xscreensaver is launched\n"
+                "\t by a normal, non-privileged user (e.g., not \"root\".)\n"
+                "\t See the manual for details.\n",
+                blurb());
+    }
+}
+
+
+/* Examine all of the display's screens, and populate the `saver_screen_info'
+   structures.
+ */
+static void
+initialize_per_screen_info (saver_info *si, Widget toplevel_shell)
+{
+  Bool found_any_writable_cells = False;
+  int i;
+
+  si->nscreens = ScreenCount(si->dpy);
+  si->screens = (saver_screen_info *)
+    calloc(sizeof(saver_screen_info), si->nscreens);
+
+  si->default_screen = &si->screens[DefaultScreen(si->dpy)];
+
+  for (i = 0; i < si->nscreens; i++)
+    {
+      saver_screen_info *ssi = &si->screens[i];
+      ssi->global = si;
+      ssi->screen = ScreenOfDisplay (si->dpy, i);
+
+      /* Note: we can't use the resource ".visual" because Xt is SO FUCKED. */
+      ssi->default_visual =
+       get_visual_resource (ssi->screen, "visualID", "VisualID", False);
+
+      ssi->current_visual = ssi->default_visual;
+      ssi->current_depth = visual_depth (ssi->screen, ssi->current_visual);
+
+      if (ssi == si->default_screen)
+       /* Since this is the default screen, use the one already created. */
+       ssi->toplevel_shell = toplevel_shell;
+      else
+       /* Otherwise, each screen must have its own unmapped root widget. */
+       ssi->toplevel_shell =
+         XtVaAppCreateShell (progname, progclass, applicationShellWidgetClass,
+                             si->dpy,
+                             XtNscreen, ssi->screen,
+                             XtNvisual, ssi->current_visual,
+                             XtNdepth,  visual_depth (ssi->screen,
+                                                      ssi->current_visual),
+                             0);
+
+      if (! found_any_writable_cells)
+       {
+         /* Check to see whether fading is ever possible -- if any of the
+            screens on the display has a PseudoColor visual, then fading can
+            work (on at least some screens.)  If no screen has a PseudoColor
+            visual, then don't bother ever trying to fade, because it will
+            just cause a delay without causing any visible effect.
+         */
+         if (has_writable_cells (ssi->screen, ssi->current_visual) ||
+             get_visual (ssi->screen, "PseudoColor", True, False) ||
+             get_visual (ssi->screen, "GrayScale", True, False))
+           found_any_writable_cells = True;
+       }
+    }
+
+  si->fading_possible_p = found_any_writable_cells;
+}
+
+
+/* If any server extensions have been requested, try and initialize them.
+   Issue warnings if requests can't be honored.
+ */
+static void
+initialize_server_extensions (saver_info *si)
+{
+  saver_preferences *p = &si->prefs;
+
+  Bool server_has_xidle_extension_p = False;
+  Bool server_has_sgi_saver_extension_p = False;
+  Bool server_has_mit_saver_extension_p = False;
+  Bool system_has_proc_interrupts_p = False;
+  const char *piwhy = 0;
+
+  si->using_xidle_extension = p->use_xidle_extension;
+  si->using_sgi_saver_extension = p->use_sgi_saver_extension;
+  si->using_mit_saver_extension = p->use_mit_saver_extension;
+  si->using_proc_interrupts = p->use_proc_interrupts;
+
+#ifdef HAVE_XIDLE_EXTENSION
+  server_has_xidle_extension_p = query_xidle_extension (si);
+#endif
+#ifdef HAVE_SGI_SAVER_EXTENSION
+  server_has_sgi_saver_extension_p = query_sgi_saver_extension (si);
+#endif
+#ifdef HAVE_MIT_SAVER_EXTENSION
+  server_has_mit_saver_extension_p = query_mit_saver_extension (si);
+#endif
+#ifdef HAVE_PROC_INTERRUPTS
+  system_has_proc_interrupts_p = query_proc_interrupts_available (si, &piwhy);
+#endif
+
+  if (!server_has_xidle_extension_p)
+    si->using_xidle_extension = False;
+  else if (p->verbose_p)
+    {
+      if (si->using_xidle_extension)
+       fprintf (stderr, "%s: using XIDLE extension.\n", blurb());
+      else
+       fprintf (stderr, "%s: not using server's XIDLE extension.\n", blurb());
+    }
+
+  if (!server_has_sgi_saver_extension_p)
+    si->using_sgi_saver_extension = False;
+  else if (p->verbose_p)
+    {
+      if (si->using_sgi_saver_extension)
+       fprintf (stderr, "%s: using SGI SCREEN_SAVER extension.\n", blurb());
+      else
+       fprintf (stderr,
+                "%s: not using server's SGI SCREEN_SAVER extension.\n",
+                blurb());
+    }
+
+  if (!server_has_mit_saver_extension_p)
+    si->using_mit_saver_extension = False;
+  else if (p->verbose_p)
+    {
+      if (si->using_mit_saver_extension)
+       fprintf (stderr, "%s: using lame MIT-SCREEN-SAVER extension.\n",
+                blurb());
+      else
+       fprintf (stderr,
+                "%s: not using server's lame MIT-SCREEN-SAVER extension.\n",
+                blurb());
+    }
+
+  if (!system_has_proc_interrupts_p)
+    {
+      si->using_proc_interrupts = False;
+      if (p->verbose_p && piwhy)
+       fprintf (stderr, "%s: not using /proc/interrupts: %s.\n", blurb(),
+                 piwhy);
+    }
+  else if (p->verbose_p)
+    {
+      if (si->using_proc_interrupts)
+       fprintf (stderr,
+                 "%s: consulting /proc/interrupts for keyboard activity.\n",
+                blurb());
+      else
+       fprintf (stderr,
+                "%s: not consulting /proc/interrupts for keyboard activity.\n",
+                blurb());
+    }
+}
+
+
+/* For the case where we aren't using an server extensions, select user events
+   on all the existing windows, and launch timers to select events on
+   newly-created windows as well.
+
+   If a server extension is being used, this does nothing.
+ */
+static void
+select_events (saver_info *si)
+{
+  saver_preferences *p = &si->prefs;
+  int i;
+
+  if (si->using_xidle_extension ||
+      si->using_mit_saver_extension ||
+      si->using_sgi_saver_extension)
+    return;
+
+  if (p->initial_delay)
+    {
+      if (p->verbose_p)
+       {
+         fprintf (stderr, "%s: waiting for %d second%s...", blurb(),
+                  (int) p->initial_delay/1000,
+                  (p->initial_delay == 1000 ? "" : "s"));
+         fflush (stderr);
+         fflush (stdout);
+       }
+      usleep (p->initial_delay);
+      if (p->verbose_p)
+       fprintf (stderr, " done.\n");
+    }
+
+  if (p->verbose_p)
+    {
+      fprintf (stderr, "%s: selecting events on extant windows...", blurb());
+      fflush (stderr);
+      fflush (stdout);
+    }
+
+  /* Select events on the root windows of every screen.  This also selects
+     for window creation events, so that new subwindows will be noticed.
+   */
+  for (i = 0; i < si->nscreens; i++)
+    start_notice_events_timer (si, RootWindowOfScreen (si->screens[i].screen),
+                               False);
+
+  if (p->verbose_p)
+    fprintf (stderr, " done.\n");
+}
+
+
+void
+maybe_reload_init_file (saver_info *si)
+{
+  saver_preferences *p = &si->prefs;
+  if (init_file_changed_p (p))
+    {
+      if (p->verbose_p)
+       fprintf (stderr, "%s: file \"%s\" has changed, reloading.\n",
+                blurb(), init_file_name());
+
+      load_init_file (p);
+
+      /* If a server extension is in use, and p->timeout has changed,
+        we need to inform the server of the new timeout. */
+      disable_builtin_screensaver (si, False);
+    }
+}
+
+
+/* Loop forever:
+
+       - wait until the user is idle;
+       - blank the screen;
+       - wait until the user is active;
+       - unblank the screen;
+       - repeat.
+
+ */
+static void
+main_loop (saver_info *si)
+{
+  saver_preferences *p = &si->prefs;
+  Bool ok_to_unblank;
+
+  while (1)
+    {
+      Bool was_locked = False;
+      sleep_until_idle (si, True);
+
+      if (p->verbose_p)
+       {
+         if (si->demoing_p)
+           fprintf (stderr, "%s: demoing %d at %s.\n", blurb(),
+                    si->selection_mode, timestring());
+         else
+           if (p->verbose_p)
+             fprintf (stderr, "%s: blanking screen at %s.\n", blurb(),
+                      timestring());
+       }
+
+      maybe_reload_init_file (si);
+
+      if (! blank_screen (si))
+        {
+          /* We were unable to grab either the keyboard or mouse.
+             This means we did not (and must not) blank the screen.
+             If we were to blank the screen while some other program
+             is holding both the mouse and keyboard grabbed, then
+             we would never be able to un-blank it!  We would never
+             see any events, and the display would be wedged.
+
+             So, just go around the loop again and wait for the
+             next bout of idleness.
+          */
+
+          fprintf (stderr,
+                  "%s: unable to grab keyboard or mouse!  Blanking aborted.\n",
+                   blurb());
+          continue;
+        }
+
+      kill_screenhack (si);
+
+      if (!si->throttled_p)
+        spawn_screenhack (si, True);
+      else if (p->verbose_p)
+        fprintf (stderr, "%s: not launching hack (throttled.)\n", blurb());
+
+      /* Don't start the cycle timer in demo mode. */
+      if (!si->demoing_p && p->cycle)
+       si->cycle_id = XtAppAddTimeOut (si->app,
+                                        (si->selection_mode
+                                         /* see comment in cycle_timer() */
+                                         ? 1000 * 60 * 60
+                                         : p->cycle),
+                                        cycle_timer,
+                                       (XtPointer) si);
+
+
+#ifndef NO_LOCKING
+      {
+        Time lock_timeout = p->lock_timeout;
+
+        if (si->emergency_lock_p && p->lock_p && lock_timeout)
+          {
+            int secs = p->lock_timeout / 1000;
+            if (p->verbose_p)
+              fprintf (stderr,
+                     "%s: locking now, instead of waiting for %d:%02d:%02d.\n",
+                       blurb(),
+                       (secs / (60 * 60)), ((secs / 60) % 60), (secs % 60));
+            lock_timeout = 0;
+          }
+
+        si->emergency_lock_p = False;
+
+        if (!si->demoing_p &&           /* if not going into demo mode */
+            p->lock_p &&                /* and locking is enabled */
+            !si->locking_disabled_p &&  /* and locking is possible */
+            lock_timeout == 0)          /* and locking is not timer-deferred */
+          set_locked_p (si, True);      /* then lock right now. */
+
+        /* locked_p might be true already because of the above, or because of
+           the LOCK ClientMessage.  But if not, and if we're supposed to lock
+           after some time, set up a timer to do so.
+        */
+        if (p->lock_p &&
+            !si->locked_p &&
+            lock_timeout > 0)
+          si->lock_id = XtAppAddTimeOut (si->app, lock_timeout,
+                                         activate_lock_timer,
+                                         (XtPointer) si);
+      }
+#endif /* !NO_LOCKING */
+
+
+      ok_to_unblank = True;
+      do {
+
+       sleep_until_idle (si, False);           /* until not idle */
+       maybe_reload_init_file (si);
+
+#ifndef NO_LOCKING
+       if (si->locked_p)
+         {
+           saver_screen_info *ssi = si->default_screen;
+           if (si->locking_disabled_p) abort ();
+
+            was_locked = True;
+           si->dbox_up_p = True;
+           suspend_screenhack (si, True);
+           XUndefineCursor (si->dpy, ssi->screensaver_window);
+
+           ok_to_unblank = unlock_p (si);
+
+           si->dbox_up_p = False;
+           XDefineCursor (si->dpy, ssi->screensaver_window, ssi->cursor);
+           suspend_screenhack (si, False);     /* resume */
+         }
+#endif /* !NO_LOCKING */
+
+       } while (!ok_to_unblank);
+
+
+      if (p->verbose_p)
+       fprintf (stderr, "%s: unblanking screen at %s.\n",
+                blurb(), timestring ());
+
+      /* Kill before unblanking, to stop drawing as soon as possible. */
+      kill_screenhack (si);
+      unblank_screen (si);
+
+      set_locked_p (si, False);
+      si->emergency_lock_p = False;
+      si->demoing_p = 0;
+      si->selection_mode = 0;
+
+      /* If we're throttled, and the user has explicitly unlocked the screen,
+         then unthrottle.  If we weren't locked, then don't unthrottle
+         automatically, because someone might have just bumped the desk... */
+      if (was_locked)
+        {
+          if (si->throttled_p && p->verbose_p)
+            fprintf (stderr, "%s: unthrottled.\n", blurb());
+          si->throttled_p = False;
+        }
+
+      if (si->cycle_id)
+       {
+         XtRemoveTimeOut (si->cycle_id);
+         si->cycle_id = 0;
+       }
+
+      if (si->lock_id)
+       {
+         XtRemoveTimeOut (si->lock_id);
+         si->lock_id = 0;
+       }
+
+      if (p->verbose_p)
+       fprintf (stderr, "%s: awaiting idleness.\n", blurb());
+    }
+}
+
+static void analyze_display (saver_info *si);
+
+int
+main (int argc, char **argv)
+{
+  Widget shell;
+  saver_info the_si;
+  saver_info *si = &the_si;
+  saver_preferences *p = &si->prefs;
+  int i;
+
+  memset(si, 0, sizeof(*si));
+  global_si_kludge = si;       /* I hate C so much... */
+
+  srandom ((int) time ((time_t *) 0));
+
+  save_argv (argc, argv);
+  set_version_string (si, &argc, argv);
+  privileged_initialization (si, &argc, argv);
+  hack_environment (si);
+
+  shell = connect_to_server (si, &argc, argv);
+  process_command_line (si, &argc, argv);
+  print_banner (si);
+
+  load_init_file (p);  /* must be before initialize_per_screen_info() */
+  initialize_per_screen_info (si, shell); /* also sets si->fading_possible_p */
+
+  /* We can only issue this warnings now. */
+  if (p->verbose_p && !si->fading_possible_p && (p->fade_p || p->unfade_p))
+    fprintf (stderr,
+             "%s: there are no PseudoColor or GrayScale visuals.\n"
+             "%s: ignoring the request for fading/unfading.\n",
+             blurb(), blurb());
+
+  for (i = 0; i < si->nscreens; i++)
+    if (ensure_no_screensaver_running (si->dpy, si->screens[i].screen))
+      exit (1);
+
+  lock_initialization (si, &argc, argv);
+
+  if (p->xsync_p) XSynchronize (si->dpy, True);
+  blurb_timestamp_p = p->timestamp_p;  /* kludge */
+
+  if (p->verbose_p) analyze_display (si);
+  initialize_server_extensions (si);
+  initialize_screensaver_window (si);
+  select_events (si);
+  init_sigchld ();
+  disable_builtin_screensaver (si, True);
+  initialize_stderr (si);
+
+  make_splash_dialog (si);
+
+  main_loop (si);              /* doesn't return */
+  return 0;
+}
+
+\f
+/* Processing ClientMessage events.
+ */
+
+static void
+clientmessage_response (saver_info *si, Window w, Bool error,
+                       const char *stderr_msg,
+                       const char *protocol_msg)
+{
+  char *proto;
+  int L;
+  saver_preferences *p = &si->prefs;
+  if (error || p->verbose_p)
+    fprintf (stderr, "%s: %s\n", blurb(), stderr_msg);
+
+  L = strlen(protocol_msg);
+  proto = (char *) malloc (L + 2);
+  proto[0] = (error ? '-' : '+');
+  strcpy (proto+1, protocol_msg);
+  L++;
+
+  XChangeProperty (si->dpy, w, XA_SCREENSAVER_RESPONSE, XA_STRING, 8,
+                  PropModeReplace, (unsigned char *) proto, L);
+  XSync (si->dpy, False);
+  free (proto);
+}
+
+Bool
+handle_clientmessage (saver_info *si, XEvent *event, Bool until_idle_p)
+{
+  saver_preferences *p = &si->prefs;
+  Atom type = 0;
+  Window window = event->xclient.window;
+
+  /* Preferences might affect our handling of client messages. */
+  maybe_reload_init_file (si);
+
+  if (event->xclient.message_type != XA_SCREENSAVER)
+    {
+      char *str;
+      str = XGetAtomName (si->dpy, event->xclient.message_type);
+      fprintf (stderr, "%s: unrecognised ClientMessage type %s received\n",
+              blurb(), (str ? str : "(null)"));
+      if (str) XFree (str);
+      return False;
+    }
+  if (event->xclient.format != 32)
+    {
+      fprintf (stderr, "%s: ClientMessage of format %d received, not 32\n",
+              blurb(), event->xclient.format);
+      return False;
+    }
+
+  type = event->xclient.data.l[0];
+  if (type == XA_ACTIVATE)
+    {
+      if (until_idle_p)
+       {
+         clientmessage_response(si, window, False,
+                                "ACTIVATE ClientMessage received.",
+                                "activating.");
+         si->selection_mode = 0;
+         si->demoing_p = False;
+
+          if (si->throttled_p && p->verbose_p)
+            fprintf (stderr, "%s: unthrottled.\n", blurb());
+         si->throttled_p = False;
+
+         if (si->using_mit_saver_extension || si->using_sgi_saver_extension)
+           {
+             XForceScreenSaver (si->dpy, ScreenSaverActive);
+             return False;
+           }
+         else
+           {
+             return True;
+           }
+       }
+      clientmessage_response(si, window, True,
+                      "ClientMessage ACTIVATE received while already active.",
+                            "already active.");
+    }
+  else if (type == XA_DEACTIVATE)
+    {
+      if (! until_idle_p)
+       {
+          if (si->throttled_p && p->verbose_p)
+            fprintf (stderr, "%s: unthrottled.\n", blurb());
+         si->throttled_p = False;
+
+         clientmessage_response(si, window, False,
+                                "DEACTIVATE ClientMessage received.",
+                                "deactivating.");
+         if (si->using_mit_saver_extension || si->using_sgi_saver_extension)
+           {
+             XForceScreenSaver (si->dpy, ScreenSaverReset);
+             return False;
+           }
+         else
+           {
+             return True;
+           }
+       }
+      clientmessage_response(si, window, True,
+                          "ClientMessage DEACTIVATE received while inactive.",
+                            "not active.");
+    }
+  else if (type == XA_CYCLE)
+    {
+      if (! until_idle_p)
+       {
+         clientmessage_response(si, window, False,
+                                "CYCLE ClientMessage received.",
+                                "cycling.");
+         si->selection_mode = 0;       /* 0 means randomize when its time. */
+         si->demoing_p = False;
+
+          if (si->throttled_p && p->verbose_p)
+            fprintf (stderr, "%s: unthrottled.\n", blurb());
+         si->throttled_p = False;
+
+         if (si->cycle_id)
+           XtRemoveTimeOut (si->cycle_id);
+         si->cycle_id = 0;
+         cycle_timer ((XtPointer) si, 0);
+         return False;
+       }
+      clientmessage_response(si, window, True,
+                            "ClientMessage CYCLE received while inactive.",
+                            "not active.");
+    }
+  else if (type == XA_NEXT || type == XA_PREV)
+    {
+      clientmessage_response(si, window, False,
+                            (type == XA_NEXT
+                             ? "NEXT ClientMessage received."
+                             : "PREV ClientMessage received."),
+                            "cycling.");
+      si->selection_mode = (type == XA_NEXT ? -1 : -2);
+      si->demoing_p = False;
+
+      if (si->throttled_p && p->verbose_p)
+        fprintf (stderr, "%s: unthrottled.\n", blurb());
+      si->throttled_p = False;
+
+      if (! until_idle_p)
+       {
+         if (si->cycle_id)
+           XtRemoveTimeOut (si->cycle_id);
+         si->cycle_id = 0;
+         cycle_timer ((XtPointer) si, 0);
+       }
+      else
+       return True;
+    }
+  else if (type == XA_SELECT)
+    {
+      char buf [255];
+      char buf2 [255];
+      long which = event->xclient.data.l[1];
+
+      sprintf (buf, "SELECT %ld ClientMessage received.", which);
+      sprintf (buf2, "activating (%ld).", which);
+      clientmessage_response (si, window, False, buf, buf2);
+
+      if (which < 0) which = 0;                /* 0 == "random" */
+      si->selection_mode = which;
+      si->demoing_p = False;
+
+      if (si->throttled_p && p->verbose_p)
+        fprintf (stderr, "%s: unthrottled.\n", blurb());
+      si->throttled_p = False;
+
+      if (! until_idle_p)
+       {
+         if (si->cycle_id)
+           XtRemoveTimeOut (si->cycle_id);
+         si->cycle_id = 0;
+         cycle_timer ((XtPointer) si, 0);
+       }
+      else
+       return True;
+    }
+  else if (type == XA_EXIT)
+    {
+      /* Ignore EXIT message if the screen is locked. */
+      if (until_idle_p || !si->locked_p)
+       {
+         clientmessage_response (si, window, False,
+                                 "EXIT ClientMessage received.",
+                                 "exiting.");
+         if (! until_idle_p)
+           {
+             unblank_screen (si);
+             kill_screenhack (si);
+             XSync (si->dpy, False);
+           }
+         saver_exit (si, 0, 0);
+       }
+      else
+       clientmessage_response (si, window, True,
+                               "EXIT ClientMessage received while locked.",
+                               "screen is locked.");
+    }
+  else if (type == XA_RESTART)
+    {
+      /* The RESTART message works whether the screensaver is active or not,
+        unless the screen is locked, in which case it doesn't work.
+       */
+      if (until_idle_p || !si->locked_p)
+       {
+         clientmessage_response (si, window, False,
+                                 "RESTART ClientMessage received.",
+                                 "restarting.");
+         if (! until_idle_p)
+           {
+             unblank_screen (si);
+             kill_screenhack (si);
+             XSync (si->dpy, False);
+           }
+
+          fflush (stdout);
+          fflush (stderr);
+          if (real_stdout) fflush (real_stdout);
+          if (real_stderr) fflush (real_stderr);
+         /* make sure error message shows up before exit. */
+         if (real_stderr && stderr != real_stderr)
+           dup2 (fileno(real_stderr), fileno(stderr));
+
+         restart_process (si);
+         exit (1);     /* shouldn't get here; but if restarting didn't work,
+                          make this command be the same as EXIT. */
+       }
+      else
+       clientmessage_response (si, window, True,
+                               "RESTART ClientMessage received while locked.",
+                               "screen is locked.");
+    }
+  else if (type == XA_DEMO)
+    {
+      long arg = event->xclient.data.l[1];
+      Bool demo_one_hack_p = (arg == 300);
+
+      if (demo_one_hack_p)
+       {
+         if (until_idle_p)
+           {
+             long which = event->xclient.data.l[2];
+             char buf [255];
+             char buf2 [255];
+             sprintf (buf, "DEMO %ld ClientMessage received.", which);
+             sprintf (buf2, "demoing (%ld).", which);
+             clientmessage_response (si, window, False, buf, buf2);
+
+             if (which < 0) which = 0;         /* 0 == "random" */
+             si->selection_mode = which;
+             si->demoing_p = True;
+
+              if (si->throttled_p && p->verbose_p)
+                fprintf (stderr, "%s: unthrottled.\n", blurb());
+              si->throttled_p = False;
+
+             return True;
+           }
+
+         clientmessage_response (si, window, True,
+                                 "DEMO ClientMessage received while active.",
+                                 "already active.");
+       }
+      else
+       {
+         clientmessage_response (si, window, True,
+                                 "obsolete form of DEMO ClientMessage.",
+                                 "obsolete form of DEMO ClientMessage.");
+       }
+    }
+  else if (type == XA_PREFS)
+    {
+      clientmessage_response (si, window, True,
+                             "the PREFS client-message is obsolete.",
+                             "the PREFS client-message is obsolete.");
+    }
+  else if (type == XA_LOCK)
+    {
+#ifdef NO_LOCKING
+      clientmessage_response (si, window, True,
+                             "not compiled with support for locking.",
+                             "locking not enabled.");
+#else /* !NO_LOCKING */
+      if (si->locking_disabled_p)
+       clientmessage_response (si, window, True,
+                     "LOCK ClientMessage received, but locking is disabled.",
+                             "locking not enabled.");
+      else if (si->locked_p)
+       clientmessage_response (si, window, True,
+                          "LOCK ClientMessage received while already locked.",
+                               "already locked.");
+      else
+       {
+         char buf [255];
+         char *response = (until_idle_p
+                           ? "activating and locking."
+                           : "locking.");
+         sprintf (buf, "LOCK ClientMessage received; %s", response);
+         clientmessage_response (si, window, False, buf, response);
+         set_locked_p (si, True);
+         si->selection_mode = 0;
+         si->demoing_p = False;
+
+         if (si->lock_id)      /* we're doing it now, so lose the timeout */
+           {
+             XtRemoveTimeOut (si->lock_id);
+             si->lock_id = 0;
+           }
+
+         if (until_idle_p)
+           {
+             if (si->using_mit_saver_extension ||
+                  si->using_sgi_saver_extension)
+               {
+                 XForceScreenSaver (si->dpy, ScreenSaverActive);
+                 return False;
+               }
+             else
+               {
+                 return True;
+               }
+           }
+       }
+#endif /* !NO_LOCKING */
+    }
+  else if (type == XA_THROTTLE)
+    {
+      if (si->throttled_p)
+       clientmessage_response (si, window, True,
+                                "THROTTLE ClientMessage received, but "
+                                "already throttled.",
+                                "already throttled.");
+      else
+       {
+         char buf [255];
+         char *response = "throttled.";
+         si->throttled_p = True;
+         si->selection_mode = 0;
+         si->demoing_p = False;
+         sprintf (buf, "THROTTLE ClientMessage received; %s", response);
+         clientmessage_response (si, window, False, buf, response);
+
+          if (! until_idle_p)
+            {
+              if (si->cycle_id)
+                XtRemoveTimeOut (si->cycle_id);
+              si->cycle_id = 0;
+              cycle_timer ((XtPointer) si, 0);
+            }
+       }
+    }
+  else if (type == XA_UNTHROTTLE)
+    {
+      if (! si->throttled_p)
+       clientmessage_response (si, window, True,
+                                "UNTHROTTLE ClientMessage received, but "
+                                "not throttled.",
+                                "not throttled.");
+      else
+       {
+         char buf [255];
+         char *response = "unthrottled.";
+         si->throttled_p = False;
+         si->selection_mode = 0;
+         si->demoing_p = False;
+         sprintf (buf, "UNTHROTTLE ClientMessage received; %s", response);
+         clientmessage_response (si, window, False, buf, response);
+
+          if (! until_idle_p)
+            {
+              if (si->cycle_id)
+                XtRemoveTimeOut (si->cycle_id);
+              si->cycle_id = 0;
+              cycle_timer ((XtPointer) si, 0);
+            }
+       }
+    }
+  else
+    {
+      char buf [1024];
+      char *str;
+      str = (type ? XGetAtomName(si->dpy, type) : 0);
+
+      if (str)
+       {
+         if (strlen (str) > 80)
+           strcpy (str+70, "...");
+         sprintf (buf, "unrecognised screensaver ClientMessage %s received.",
+                  str);
+         free (str);
+       }
+      else
+       {
+         sprintf (buf,
+                  "unrecognised screensaver ClientMessage 0x%x received.",
+                  (unsigned int) event->xclient.data.l[0]);
+       }
+
+      clientmessage_response (si, window, True, buf, buf);
+    }
+  return False;
+}
+
+\f
+/* Some random diagnostics printed in -verbose mode.
+ */
+
+static void
+analyze_display (saver_info *si)
+{
+  int i, j;
+  static const char *exts[][2] = {
+    { "SCREEN_SAVER",             "SGI Screen-Saver" },
+    { "SCREEN-SAVER",            "SGI Screen-Saver" },
+    { "MIT-SCREEN-SAVER",         "MIT Screen-Saver" },
+    { "XIDLE",                   "XIdle" },
+    { "SGI-VIDEO-CONTROL",        "SGI Video-Control" },
+    { "READDISPLAY",             "SGI Read-Display" },
+    { "MIT-SHM",                 "Shared Memory" },
+    { "DOUBLE-BUFFER",           "Double-Buffering" },
+    { "DPMS",                    "Power Management" },
+    { "GLX",                     "GLX" },
+    { "XFree86-VidModeExtension", "XF86 Video-Mode" }
+  };
+
+  fprintf (stderr, "%s: running on display \"%s\"\n", blurb(),
+          DisplayString(si->dpy));
+  fprintf (stderr, "%s: vendor is %s, %d\n", blurb(),
+          ServerVendor(si->dpy), VendorRelease(si->dpy));
+
+  fprintf (stderr, "%s: useful extensions:\n", blurb());
+  for (i = 0; i < countof(exts); i++)
+    {
+      int op = 0, event = 0, error = 0;
+      if (XQueryExtension (si->dpy, exts[i][0], &op, &event, &error))
+       fprintf (stderr, "%s:   %s\n", blurb(), exts[i][1]);
+    }
+
+  for (i = 0; i < si->nscreens; i++)
+    {
+      unsigned long colormapped_depths = 0;
+      unsigned long non_mapped_depths = 0;
+      XVisualInfo vi_in, *vi_out;
+      int out_count;
+      vi_in.screen = i;
+      vi_out = XGetVisualInfo (si->dpy, VisualScreenMask, &vi_in, &out_count);
+      if (!vi_out) continue;
+      for (j = 0; j < out_count; j++)
+       if (vi_out[j].class == PseudoColor)
+         colormapped_depths |= (1 << vi_out[j].depth);
+       else
+         non_mapped_depths  |= (1 << vi_out[j].depth);
+      XFree ((char *) vi_out);
+
+      if (colormapped_depths)
+       {
+         fprintf (stderr, "%s: screen %d colormapped depths:", blurb(), i);
+         for (j = 0; j < 32; j++)
+           if (colormapped_depths & (1 << j))
+             fprintf (stderr, " %d", j);
+         fprintf (stderr, "\n");
+       }
+      if (non_mapped_depths)
+       {
+         fprintf (stderr, "%s: screen %d non-mapped depths:", blurb(), i);
+         for (j = 0; j < 32; j++)
+           if (non_mapped_depths & (1 << j))
+             fprintf (stderr, " %d", j);
+         fprintf (stderr, "\n");
+       }
+    }
+}
+
+Bool
+display_is_on_console_p (saver_info *si)
+{
+  Bool not_on_console = True;
+  char *dpystr = DisplayString (si->dpy);
+  char *tail = (char *) strchr (dpystr, ':');
+  if (! tail || strncmp (tail, ":0", 2))
+    not_on_console = True;
+  else
+    {
+      char dpyname[255], localname[255];
+      strncpy (dpyname, dpystr, tail-dpystr);
+      dpyname [tail-dpystr] = 0;
+      if (!*dpyname ||
+         !strcmp(dpyname, "unix") ||
+         !strcmp(dpyname, "localhost"))
+       not_on_console = False;
+      else if (gethostname (localname, sizeof (localname)))
+       not_on_console = True;  /* can't find hostname? */
+      else
+       {
+         /* We have to call gethostbyname() on the result of gethostname()
+            because the two aren't guarenteed to be the same name for the
+            same host: on some losing systems, one is a FQDN and the other
+            is not.  Here in the wide wonderful world of Unix it's rocket
+            science to obtain the local hostname in a portable fashion.
+            
+            And don't forget, gethostbyname() reuses the structure it
+            returns, so we have to copy the fucker before calling it again.
+            Thank you master, may I have another.
+          */
+         struct hostent *h = gethostbyname (dpyname);
+         if (!h)
+           not_on_console = True;
+         else
+           {
+             char hn [255];
+             struct hostent *l;
+             strcpy (hn, h->h_name);
+             l = gethostbyname (localname);
+             not_on_console = (!l || !!(strcmp (l->h_name, hn)));
+           }
+       }
+    }
+  return !not_on_console;
+}
diff --git a/driver/xscreensaver.h b/driver/xscreensaver.h
new file mode 100644 (file)
index 0000000..9e75c78
--- /dev/null
@@ -0,0 +1,401 @@
+/* xscreensaver, Copyright (c) 1993-1998 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software 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.  No representations are made about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or 
+ * implied warranty.
+ */
+
+#ifndef __XSCREENSAVER_H__
+#define __XSCREENSAVER_H__
+
+#include <stdlib.h>
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+
+#include <string.h>
+#include <stdio.h>
+
+#include "prefs.h"
+
+extern char *progname;
+extern char *progclass;
+
+typedef struct saver_info saver_info;
+typedef struct saver_screen_info saver_screen_info;
+typedef struct passwd_dialog_data passwd_dialog_data;
+typedef struct splash_dialog_data splash_dialog_data;
+
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+
+
+/* This structure holds all the data that applies to the program as a whole,
+   or to the non-screen-specific parts of the display connection.
+
+   The saver_preferences structure (prefs.h) holds all the user-specified
+   parameters, read from the command line, the resource database, or entered
+   through a dialog box.
+ */
+struct saver_info {
+  char *version;
+  saver_preferences prefs;
+
+  int nscreens;
+  saver_screen_info *screens;
+  saver_screen_info *default_screen;   /* ...on which dialogs will appear. */
+
+
+  /* =======================================================================
+     global connection info
+     ======================================================================= */
+
+  XtAppContext app;
+  Display *dpy;
+
+  /* =======================================================================
+     server extension info
+     ======================================================================= */
+
+  Bool using_xidle_extension;     /* which extension is being used.         */
+  Bool using_mit_saver_extension;  /* Note that `p->use_*' is the *request*, */
+  Bool using_sgi_saver_extension;  /* and `si->using_*' is the *reality*.    */
+  Bool using_proc_interrupts;
+
+# ifdef HAVE_MIT_SAVER_EXTENSION
+  int mit_saver_ext_event_number;
+  int mit_saver_ext_error_number;
+# endif
+# ifdef HAVE_SGI_SAVER_EXTENSION
+  int sgi_saver_ext_event_number;
+  int sgi_saver_ext_error_number;
+# endif
+
+
+  /* =======================================================================
+     blanking
+     ======================================================================= */
+
+  Bool screen_blanked_p;       /* Whether the saver is currently active. */
+  Window mouse_grab_window;    /* Window holding our mouse grab */
+  Window keyboard_grab_window; /* Window holding our keyboard grab */
+  Bool fading_possible_p;      /* Whether fading to/from black is possible. */
+  Bool throttled_p;             /* Whether we should temporarily just blank
+                                   the screen, not run hacks. */
+
+
+  /* =======================================================================
+     locking and runtime privileges
+     ======================================================================= */
+
+  Bool locked_p;               /* Whether the screen is currently locked. */
+  Bool dbox_up_p;              /* Whether the demo-mode or passwd dialogs
+                                  are currently visible */
+
+  Bool locking_disabled_p;     /* Sometimes locking is impossible. */
+  char *nolock_reason;         /* This is why. */
+
+  char *orig_uid;              /* What uid/gid we had at startup, before
+                                  discarding privileges. */
+  char *uid_message;           /* Any diagnostics from our attempt to
+                                  discard privileges (printed only in
+                                  -verbose mode.) */
+  Bool dangerous_uid_p;                /* Set to true if we're running as a user id
+                                  which is known to not be a normal, non-
+                                  privileged user. */
+
+  Window passwd_dialog;                /* The password dialog, if its up. */
+  passwd_dialog_data *pw_data; /* Other info necessary to draw it. */
+
+  int unlock_failures;         /* Counts failed login attempts while the
+                                  screen is locked. */
+
+
+  /* =======================================================================
+     demoing
+     ======================================================================= */
+
+  Bool demoing_p;              /* Whether we are demoing a single hack
+                                  (without UI.) */
+
+  Window splash_dialog;                /* The splash dialog, if its up. */
+  splash_dialog_data *sp_data; /* Other info necessary to draw it. */
+
+
+  /* =======================================================================
+     timers
+     ======================================================================= */
+
+  XtIntervalId lock_id;                /* Timer to implement `prefs.lock_timeout' */
+  XtIntervalId cycle_id;       /* Timer to implement `prefs.cycle' */
+  XtIntervalId timer_id;       /* Timer to implement `prefs.timeout' */
+  XtIntervalId watchdog_id;    /* Timer to implement `prefs.watchdog */
+  XtIntervalId check_pointer_timer_id; /* `prefs.pointer_timeout' */
+
+  time_t last_activity_time;              /* Used only when no server exts. */
+  time_t last_wall_clock_time;             /* Used to detect laptop suspend. */
+  saver_screen_info *last_activity_screen;
+
+  Bool emergency_lock_p;        /* Set when the wall clock has jumped
+                                   (presumably due to laptop suspend) and we
+                                   need to lock down right away instead of
+                                   waiting for the lock timer to go off. */
+
+
+  /* =======================================================================
+     remote control
+     ======================================================================= */
+
+  int selection_mode;          /* Set to -1 if the NEXT ClientMessage has just
+                                  been received; set to -2 if PREV has just
+                                  been received; set to N if SELECT or DEMO N
+                                  has been received.  (This is kind of nasty.)
+                                */
+
+  /* =======================================================================
+     subprocs
+     ======================================================================= */
+
+  XtIntervalId stderr_popup_timer;
+
+};
+
+
+/* This structure holds all the data that applies to the screen-specific parts
+   of the display connection; if the display has multiple screens, there will
+   be one of these for each screen.
+ */
+struct saver_screen_info {
+  saver_info *global;
+
+  Screen *screen;
+  Widget toplevel_shell;
+
+  /* =======================================================================
+     blanking
+     ======================================================================= */
+
+  Window screensaver_window;   /* The window that will impersonate the root,
+                                  when the screensaver activates.  Note that
+                                  the window stored here may change, as we
+                                  destroy and recreate it on different
+                                  visuals. */
+  Colormap cmap;               /* The colormap that goes with the window. */
+  Bool install_cmap_p;         /* Whether this screen should have its own
+                                   colormap installed, for whichever of several
+                                   reasons.  This is definitive (even a false
+                                   value here overrides prefs->install_cmap_p.)
+                                 */
+  Visual *current_visual;      /* The visual of the window. */
+  Visual *default_visual;      /* visual to use when none other specified */
+  int current_depth;           /* How deep the visual (and the window) are. */
+
+  Window real_vroot;           /* The original virtual-root window. */
+  Window real_vroot_value;     /* What was in the __SWM_VROOT property. */
+
+  Cursor cursor;               /* A blank cursor that goes with the
+                                  real root window. */
+  unsigned long black_pixel;   /* Black, allocated from `cmap'. */
+
+  int blank_vp_x, blank_vp_y;   /* Where the virtual-scrolling viewport was
+                                   when the screen went blank.  We need to
+                                   prevent the X server from letting the mouse
+                                   bump the edges to scroll while the screen
+                                   is locked, so we reset to this when it has
+                                   moved, and the lock dialog is up... */
+
+# ifdef HAVE_MIT_SAVER_EXTENSION
+  Window server_mit_saver_window;
+# endif
+
+
+  /* =======================================================================
+     demoing
+     ======================================================================= */
+
+  Colormap demo_cmap;          /* The colormap that goes with the dialogs:
+                                  this might be the same as `cmap' so care
+                                  must be taken not to free it while it's
+                                  still in use. */
+
+  /* =======================================================================
+     timers
+     ======================================================================= */
+
+  int poll_mouse_last_root_x;          /* Used only when no server exts. */
+  int poll_mouse_last_root_y;
+  Window poll_mouse_last_child;
+  unsigned int poll_mouse_last_mask;
+
+
+  /* =======================================================================
+     subprocs
+     ======================================================================= */
+
+  int current_hack;            /* Index into `prefs.screenhacks' */
+  pid_t pid;
+
+  int stderr_text_x;
+  int stderr_text_y;
+  int stderr_line_height;
+  XFontStruct *stderr_font;
+  GC stderr_gc;
+  Window stderr_overlay_window;    /* Used if the server has overlay planes */
+  Colormap stderr_cmap;
+};
+
+
+\f
+
+/* =======================================================================
+   server extensions and virtual roots
+   ======================================================================= */
+
+extern void restore_real_vroot (saver_info *si);
+extern void disable_builtin_screensaver (saver_info *, Bool unblank_screen_p);
+extern Bool ensure_no_screensaver_running (Display *, Screen *);
+
+#ifdef HAVE_MIT_SAVER_EXTENSION
+extern Bool query_mit_saver_extension (saver_info *);
+#endif
+#ifdef HAVE_SGI_SAVER_EXTENSION
+extern Bool query_sgi_saver_extension (saver_info *);
+#endif
+#ifdef HAVE_XIDLE_EXTENSION
+extern Bool query_xidle_extension (saver_info *);
+#endif
+#ifdef HAVE_PROC_INTERRUPTS
+extern Bool query_proc_interrupts_available (saver_info *, const char **why);
+#endif
+
+/* Display Power Management System (DPMS) interface. */
+extern Bool monitor_powered_on_p (saver_info *si);
+extern void monitor_power_on (saver_info *si);
+
+
+/* =======================================================================
+   blanking
+   ======================================================================= */
+
+extern void initialize_screensaver_window (saver_info *si);
+extern void raise_window (saver_info *si,
+                           Bool inhibit_fade, Bool between_hacks_p,
+                           Bool dont_clear);
+extern Bool blank_screen (saver_info *si);
+extern void unblank_screen (saver_info *si);
+
+extern void get_screen_viewport (saver_screen_info *ssi,
+                                 int *x_ret, int *y_ret,
+                                 int *w_ret, int *h_ret,
+                                 Bool verbose_p);
+
+
+/* =======================================================================
+   locking
+   ======================================================================= */
+
+#ifndef NO_LOCKING
+extern Bool unlock_p (saver_info *si);
+extern Bool lock_priv_init (int argc, char **argv, Bool verbose_p);
+extern Bool lock_init (int argc, char **argv, Bool verbose_p);
+extern Bool passwd_valid_p (const char *typed_passwd, Bool verbose_p);
+extern void set_locked_p (saver_info *si, Bool locked_p);
+#endif /* NO_LOCKING */
+
+extern int move_mouse_grab (saver_info *si, Window to, Cursor cursor);
+
+
+/* =======================================================================
+   runtime privileges
+   ======================================================================= */
+
+extern void hack_uid (saver_info *si);
+extern void describe_uids (saver_info *si, FILE *out);
+
+/* =======================================================================
+   demoing
+   ======================================================================= */
+
+extern void draw_shaded_rectangle (Display *dpy, Window window,
+                                  int x, int y,
+                                  int width, int height,
+                                  int thickness,
+                                  unsigned long top_color,
+                                  unsigned long bottom_color);
+extern int string_width (XFontStruct *font, char *s);
+
+extern void make_splash_dialog (saver_info *si);
+extern void handle_splash_event (saver_info *si, XEvent *e);
+extern void skull (Display *, Window, GC, GC, int, int, int, int);
+
+
+/* =======================================================================
+   timers
+   ======================================================================= */
+
+extern void start_notice_events_timer (saver_info *, Window, Bool verbose_p);
+extern void cycle_timer (XtPointer si, XtIntervalId *id);
+extern void activate_lock_timer (XtPointer si, XtIntervalId *id);
+extern void reset_watchdog_timer (saver_info *si, Bool on_p);
+extern void idle_timer (XtPointer si, XtIntervalId *id);
+extern void sleep_until_idle (saver_info *si, Bool until_idle_p);
+
+/* =======================================================================
+   remote control
+   ======================================================================= */
+
+extern Bool handle_clientmessage (saver_info *, XEvent *, Bool);
+extern void maybe_reload_init_file (saver_info *);
+
+/* =======================================================================
+   subprocs
+   ======================================================================= */
+
+extern void hack_environment (saver_info *si);
+extern void hack_subproc_environment (saver_screen_info *ssi);
+extern void init_sigchld (void);
+extern void spawn_screenhack (saver_info *si, Bool first_time_p);
+extern void kill_screenhack (saver_info *si);
+extern void suspend_screenhack (saver_info *si, Bool suspend_p);
+extern Bool screenhack_running_p (saver_info *si);
+extern void emergency_kill_subproc (saver_info *si);
+extern Bool select_visual (saver_screen_info *ssi, const char *visual_name);
+extern const char *signal_name (int signal);
+
+/* =======================================================================
+   subprocs diagnostics
+   ======================================================================= */
+
+extern FILE *real_stderr;
+extern FILE *real_stdout;
+extern void initialize_stderr (saver_info *si);
+extern void reset_stderr (saver_screen_info *ssi);
+extern void clear_stderr (saver_screen_info *ssi);
+
+
+/* =======================================================================
+   misc
+   ======================================================================= */
+
+extern const char *blurb (void);
+extern void save_argv (int argc, char **argv);
+extern void saver_exit (saver_info *si, int status, const char *core_reason);
+extern void restart_process (saver_info *si);
+
+extern int saver_ehandler (Display *dpy, XErrorEvent *error);
+extern int BadWindow_ehandler (Display *dpy, XErrorEvent *error);
+extern Bool window_exists_p (Display *dpy, Window window);
+extern char *timestring (void);
+extern Bool display_is_on_console_p (saver_info *si);
+
+extern Atom XA_VROOT, XA_XSETROOT_ID;
+extern Atom XA_SCREENSAVER, XA_SCREENSAVER_VERSION, XA_SCREENSAVER_ID;
+extern Atom XA_SCREENSAVER_TIME;
+extern Atom XA_DEMO, XA_PREFS;
+
+#endif /* __XSCREENSAVER_H__ */
diff --git a/driver/xscreensaver.man b/driver/xscreensaver.man
new file mode 100644 (file)
index 0000000..139467a
--- /dev/null
@@ -0,0 +1,1358 @@
+.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
+..
+.TH XScreenSaver 1 "23-Jun-99 (3.16)" "X Version 11"
+.SH NAME
+xscreensaver - graphics hack and screen locker, launched when the user is idle
+.SH SYNOPSIS
+.B xscreensaver
+[\-display \fIhost:display.screen\fP] \
+[\-timeout \fIint\fP] \
+[\-cycle \fIint\fP] \
+[\-lock\-mode] \
+[\-no\-lock\-mode] \
+[\-lock\-timeout \fIint\fP] \
+[\-visual \fIvisual\fP] \
+[\-install] \
+[\-no\-install] \
+[\-verbose] \
+[\-silent] \
+[\-timestamp] \
+[\-capture\-stderr] \
+[\-no\-capture\-stderr] \
+[\-splash] \
+[\-no\-splash] \
+[\-nice \fIint\fP] \
+[\-mit\-extension] \
+[\-no\-mit\-extension] \
+[\-sgi\-extension] \
+[\-no\-sgi\-extension] \
+[\-xidle\-extension] \
+[\-no\-xidle\-extension] \
+[\-proc\-interrupts] \
+[\-no\-proc\-interrupts] \
+[\-xrm \fIresources\fP]
+.SH DESCRIPTION
+The \fIxscreensaver\fP program waits until the keyboard and mouse have been 
+idle for a period, and then runs a graphics demo chosen at random.  It 
+turns off as soon as there is any mouse or keyboard activity.
+
+This program can lock your terminal in order to prevent others from using it,
+though its default mode of operation is merely to display pretty pictures on
+your screen when it is not in use.  
+
+The benefit that this program has over the combination of the
+.BR xlock (1)
+and
+.BR xautolock (1)
+programs is the ease with which new graphics hacks can be installed.  You
+don't need to recompile (or even re-run) this program to add a new display
+mode.
+.SH GETTING STARTED
+For the impatient, try this:
+.EX
+xscreensaver &
+xscreensaver-demo
+.EE
+The
+.BR xscreensaver-demo (1)
+program should pop up a dialog box that lets you experiment with the
+xscreensaver settings and graphics modes.
+
+.B Note:
+unlike
+.BR xlock (1),
+xscreensaver has a client-server model: the \fIxscreensaver\fP program is a
+daemon that runs in the background; it is controlled by the foreground
+.BR xscreensaver-demo (1)
+and
+.BR xscreensaver-command (1)
+programs.
+.SH CONFIGURATION
+Options to \fIxscreensaver\fP are specified in one of two places: in 
+a \fI.xscreensaver\fP file in your home directory; or in the X resource
+database.  If the \fI.xscreensaver\fP file exists, it overrides any settings
+in the resource database.  
+
+The syntax of the \fI.xscreensaver\fP file is similar to that of
+the \fI.Xdefaults\fP file; for example, to set the \fItimeout\fP paramter
+in the \fI.xscreensaver\fP file, you would write the following:
+.EX
+timeout: 5
+.EE
+whereas, in the \fI.Xdefaults\fP file, you would write
+.EX
+xscreensaver.timeout: 5
+.EE
+If you change a setting in the \fI.xscreensaver\fP file while xscreensaver
+is already running, it will notice this, and reload the file.  (The file will
+be reloaded the next time the screen saver needs to take some action, such as
+blanking or unblanking the screen, or picking a new graphics mode.)
+
+If you change a setting in your X resource database, or if you want
+xscreensaver to notice your changes immediately instead of the next time
+it wakes up, then you will need to tell the running xscreensaver process
+to re-initialize itself, like so:
+.EX
+xscreensaver-command -restart
+.EE
+Note that if you changed the \fI.Xdefaults\fP file, you might also need to run
+.BR xrdb (1):
+.EX
+xrdb < ~/.Xdefaults
+.EE
+If you want to set the system-wide defaults, then make your edits to
+the xscreensaver app-defaults file, which should have been installed
+when xscreensaver itself was installed.  The app-defaults file will
+usually be named /usr/lib/X11/app-defaults/XScreenSaver, but different
+systems might keep it in a different place (for example,
+/usr/openwin/lib/app-defaults/XScreenSaver on Solaris.)
+
+When settings are changed in the Preferences dialog box (see above)
+the current settings will be written to the \fI.xscreensaver\fP file.
+(The \fI.Xdefaults\fP file and the app-defaults file will never be
+written by xscreensaver itself.)
+.PP
+.TP 8
+.B timeout\fP (class \fBTime\fP)
+The screensaver will activate (blank the screen) after the keyboard and
+mouse have been idle for this many minutes.  Default 10 minutes.
+.TP 8
+.B cycle\fP (class \fBTime\fP)
+After the screensaver has been running for this many minutes, the currently
+running graphics-hack sub-process will be killed (with \fBSIGTERM\fP), and a
+new one started.  If this is 0, then the graphics hack will never be changed:
+only one demo will run until the screensaver is deactivated by user activity.
+Default 10 minutes.
+.TP 8
+.B lock\fP (class \fBBoolean\fP)
+Enable locking: before the screensaver will turn off, it will require you 
+to type the password of the logged-in user (really, the person who ran
+xscreensaver), or the root password.  (\fBNote:\fP this doesn't work if the
+screensaver is launched by
+.BR xdm (1)
+because it can't know the user-id of the logged-in user.  See 
+the ``\fIUsing XDM(1)\fP'' section, below.
+.TP 8
+.B lockTimeout\fP (class \fBTime\fP)
+If locking is enabled, this controls the length of the ``grace period''
+between when the screensaver activates, and when the screen becomes locked.
+For example, if this is 5, and \fI\-timeout\fP is 10, then after 10 minutes,
+the screen would blank.  If there was user activity at 12 minutes, no password
+would be required to un-blank the screen.  But, if there was user activity
+at 15 minutes or later (that is, \fI\-lock\-timeout\fP minutes after 
+activation) then a password would be required.  The default is 0, meaning
+that if locking is enabled, then a password will be required as soon as the 
+screen blanks.
+.TP 8
+.B passwdTimeout\fP (class \fBTime\fP)
+If the screen is locked, then this is how many seconds the password dialog box
+should be left on the screen before giving up (default 30 seconds.)  This
+should not be too large: the X server is grabbed for the duration that the
+password dialog box is up (for security purposes) and leaving the server 
+grabbed for too long can cause problems.
+.TP 8
+.B visualID\fP (class \fBVisualID\fP)
+Specify which X visual to use by default.  (Note carefully that this resource
+is called \fBvisualID\fP, not merely \fBvisual\fP; if you set the \fBvisual\fP
+resource instead, things will malfunction in obscure ways for obscure reasons.)
+
+Legal values for the \fBVisualID\fP resource are:
+.RS 8
+.TP 8
+.B default
+Use the screen's default visual (the visual of the root window.)  
+This is the default.
+.TP 8
+.B best
+Use the visual which supports the most colors.  Note, however, that the
+visual with the most colors might be a TrueColor visual, which does not
+support colormap animation.  Some programs have more interesting behavior
+when run on PseudoColor visuals than on TrueColor.
+.TP 8
+.B mono
+Use a monochrome visual, if there is one.
+.TP 8
+.B gray
+Use a grayscale or staticgray visual, if there is one and it has more than
+one plane (that is, it's not monochrome.)
+.TP 8
+.B color
+Use the best of the color visuals, if there are any.
+.TP 8
+.B GL
+Use the visual that is best for OpenGL programs.  (OpenGL programs have
+somewhat different requirements than other X programs.)
+.TP 8
+.I class
+where \fIclass\fP is one of \fBStaticGray\fP, \fBStaticColor\fP, 
+\fBTrueColor\fP, \fBGrayScale\fP, \fBPseudoColor\fP, or \fBDirectColor\fP.
+Selects the deepest visual of the given class.
+.TP 8
+.I number
+where \fInumber\fP (decimal or hex) is interpreted as a visual id number, 
+as reported by the
+.BR xdpyinfo (1)
+program; in this way you can have finer control over exactly which visual
+gets used, for example, to select a shallower one than would otherwise
+have been chosen.
+
+.RE
+.RS 8
+Note that this option specifies only the \fIdefault\fP visual that will
+be used: the visual used may be overridden on a program-by-program basis.
+See the description of the \fBprograms\fP resource, below.
+.RE
+.TP 8
+.B installColormap\fP (class \fBBoolean\fP)
+Install a private colormap while the screensaver is active, so that the
+graphics hacks can get as many colors as possible.  This is the 
+default.  (This only applies when the screen's default visual is being
+used, since non-default visuals get their own colormaps automatically.)
+This can also be overridden on a per-hack basis: see the discussion of
+the \fBdefault\-n\fP name in the section about the \fBprograms\fP resource.
+.TP 8
+.B verbose\fP (class \fBBoolean\fP)
+Whether to print diagnostics.  Default false.
+.TP 8
+.B timestamp\fP (class \fBBoolean\fP)
+Whether to print the time of day along with any other diagnostic messages.
+Default false.
+.TP 8
+.B splash\fP (class \fBBoolean\fP)
+Whether to display a splash screen at startup.  Default true.
+.TP 8
+.B splashDuration\fP (class \fBTime\fP)
+How long the splash screen should remain visible; default 5 seconds.
+.TP 8
+.B helpURL\fP (class \fBURL\fP)
+The splash screen has a \fIHelp\fP button on it.  When you press it, it will
+display the web page indicated here in your web browser.
+.TP 8
+.B loadURL\fP (class \fBLoadURL\fP)
+This is the shell command used to load a URL into your web browser.
+The default setting will load it into Netscape if it is already running,
+otherwise, will launch a new Netscape looking at the \fIhelpURL\fP.
+.TP 8
+.B demoCommand\fP (class \fBDemoCommand\fP)
+This is the shell command run when the \fIDemo\fP button on the splash window
+is pressed.  It defaults to \fIxscreensaver\-demo\fP.
+.TP 8
+.B prefsCommand\fP (class \fBPrefsCommand\fP)
+This is the shell command run when the \fIPrefs\fP button on the splash window
+is pressed.  It defaults to \fIxscreensaver\-demo\ \-prefs\fP.
+.TP 8
+.B nice\fP (class \fBNice\fP)
+The sub-processes created by \fIxscreensaver\fP will be ``niced'' to this
+level, so that they are given lower priority than other processes on the
+system, and don't increase the load unnecessarily.  The default is 10.  
+
+(Higher numbers mean lower priority; see 
+.BR nice (1)
+for details.)
+.TP 8
+.B fade\fP (class \fBBoolean\fP)
+If this is true, then when the screensaver activates, the current contents
+of the screen will fade to black instead of simply winking out.  This only
+works on displays with writable colormaps, that is, if the screen's default
+visual is a PseudoColor visual.  A fade will also be done when
+switching graphics hacks (when the \fIcycle\fP timer expires.)
+Default: true.  
+.TP 8
+.B unfade\fP (class \fBBoolean\fP)
+If this is true, then when the screensaver deactivates, the original contents
+of the screen will fade in from black instead of appearing immediately.  This
+only works on displays with writable colormaps, and if \fIfade\fP is true
+as well.  Default false.
+.TP 8
+.B fadeSeconds\fP (class \fBTime\fP)
+If \fIfade\fP is true, this is how long the fade will be in 
+seconds (default 3 seconds.)
+.TP 8
+.B fadeTicks\fP (class \fBInteger\fP)
+If \fIfade\fP is true, this is how many times a second the colormap will
+be changed to effect a fade.  Higher numbers yield smoother fades, but
+may make the fades take longer than the specified \fIfadeSeconds\fP if
+your server isn't fast enough to keep up.  Default 20.
+.TP 8
+.B captureStderr\fP (class \fBBoolean\fP)
+Whether \fIxscreensaver\fP should redirect its stdout and stderr streams to
+the window itself.  Since its nature is to take over the screen, you would not
+normally see error messages generated by xscreensaver or the sub-programs it
+runs; this resource will cause the output of all relevant programs to be
+drawn on the screensaver window itself, as well as being written to the
+controlling terminal of the screensaver driver process.  Default true.
+.TP 8
+.B font\fP (class \fBFont\fP)
+The font used for the stdout/stderr text, if \fBcaptureStderr\fP is true.
+Default \fB*\-medium\-r\-*\-140\-*\-m\-*\fP (a 14 point fixed-width font.)
+.TP 8
+.B programs\fP (class \fBPrograms\fP)
+The graphics hacks which \fIxscreensaver\fP runs when the user is idle.
+The value of this resource is a string, one \fIsh\fP-syntax command per line.  
+Each line must contain exactly one command: no semicolons, no ampersands.
+
+When the screensaver starts up, one of these is selected at random, and
+run.  After the \fIcycle\fP period expires, it is killed, and another
+is selected and run.
+
+If the value of this resource is empty, then no programs will be run; the
+screen will simply be made black.
+
+If the display has multiple screens, then a different program will be run
+for each screen.  (All screens are blanked and unblanked simultaniously.)
+
+Note that you must escape the newlines; here is an example of how you
+might set this in your \fI~/.xscreensaver\fP file:
+
+.RS 8
+.EX
+programs:  \\
+       qix -root                          \\n\\
+       ico -r -faces -sleep 1 -obj ico    \\n\\
+       xdaliclock -builtin2 -root         \\n\\
+       xv -root -rmode 5 image.gif -quit  \\n
+.EE
+.RE
+.RS 8
+Make sure your \fB$PATH\fP environment variable is set up correctly
+\fIbefore\fP xscreensaver is launched, or it won't be able to find the
+programs listed in the \fIprograms\fP resource.
+
+To use a program as a screensaver, two things are required: that that
+program draw on the root window (or be able to be configured to draw on
+the root window); and that that program understand ``virtual root''
+windows, as used by virtual window managers such as
+.BR tvtwm (1).
+(Generally, this is accomplished by just including the \fI"vroot.h"\fP 
+header file in the program's source.)
+
+If there are some programs that you want to run only when using a color
+display, and others that you want to run only when using a monochrome
+display, you can specify that like this:
+.EX
+       mono:   mono-program  -root        \\n\\
+       color:  color-program -root        \\n\\
+.EE
+.RE
+.RS 8
+More generally, you can specify the kind of visual that should be used for
+the window on which the program will be drawing.  For example, if one 
+program works best if it has a colormap, but another works best if it has
+a 24-bit visual, both can be accommodated:
+.EX
+       PseudoColor: cmap-program  -root   \\n\\
+       TrueColor:   24bit-program -root   \\n\\
+.EE
+.RE
+.RS 8
+In addition to the symbolic visual names described above (in the discussion
+of the \fIvisualID\fP resource) one other visual name is supported in
+the \fIprograms\fP list:
+.RS 1
+.TP 4
+.B default-n
+This is like \fBdefault\fP, but also requests the use of the default colormap,
+instead of a private colormap.  (That is, it behaves as if 
+the \fI\-no\-install\fP command-line option was specified, but only for
+this particular hack.)  This is provided because some third-party programs
+that draw on the root window (notably: 
+.BR xv (1),
+and
+.BR xearth (1))
+make assumptions about the visual and colormap of the root window: 
+assumptions which xscreensaver can violate.
+
+.RE
+If you specify a particular visual for a program, and that visual does not
+exist on the screen, then that program will not be chosen to run.  This
+means that on displays with multiple screens of different depths, you can
+arrange for appropriate hacks to be run on each.  For example, if one screen
+is color and the other is monochrome, hacks that look good in mono can be 
+run on one, and hacks that only look good in color will show up on the other.
+.RE
+.PP
+.PP
+Normally you won't need to change the following resources:
+.PP
+.TP 8
+.B pointerPollTime\fP (class \fBTime\fP)
+When server extensions are not in use, this controls how 
+frequently \fIxscreensaver\fP checks to see if the mouse position or buttons
+have changed.  Default 5 seconds.
+.TP 8
+.B windowCreationTimeout\fP (class \fBTime\fP)
+When server extensions are not in use, this controls the delay between when 
+windows are created and when \fIxscreensaver\fP selects events on them.
+Default 30 seconds.
+.TP 8
+.B initialDelay\fP (class \fBTime\fP)
+When server extensions are not in use, \fIxscreensaver\fP will wait this many
+seconds before selecting events on existing windows, under the assumption that 
+\fIxscreensaver\fP is started during your login procedure, and the window 
+state may be in flux.  Default 0.  (This used to default to 30, but that was
+back in the days when slow machines and X terminals were more common...)
+.TP 8
+.B sgiSaverExtension\fP (class \fBBoolean\fP)
+There are a number of different X server extensions which can make
+xscreensaver's job easier.  The next few resources specify whether these
+extensions should be utilized if they are available.
+
+This resource controls whether the SGI \fBSCREEN_SAVER\fP server extension
+will be used to decide whether the user is idle.  This is the default 
+if \fIxscreensaver\fP has been compiled with support for this 
+extension (which is the default on SGI systems.).  If it is available, 
+the \fBSCREEN_SAVER\fP method is faster and more reliable than what will
+be done otherwise, so use it if you can.  (This extension is only available
+on Silicon Graphics systems, unfortunately.)
+.TP 8
+.B mitSaverExtension\fP (class \fBBoolean\fP)
+This resource controls whether the \fBMIT\-SCREEN\-SAVER\fP server extension
+will be used to decide whether the user is idle.  However, the default for
+this resource is \fIfalse\fP, because even if this extension is available,
+it is flaky (and it also makes the \fBfade\fP option not work properly.)
+Use of this extension is not recommended.
+.TP 8
+.B xidleExtension\fP (class \fBBoolean\fP)
+This resource controls whether the \fBXIDLE\fP server extension will be
+used to decide whether the user is idle.  This is the default 
+if \fIxscreensaver\fP has been compiled with support for this extension.
+(This extension is only available for X11R4 and X11R5 systems, unfortunately.)
+.TP 8
+.B procInterrupts\fP (class \fBBoolean\fP)
+This resource controls whether the \fB/proc/interrupts\fP file should be
+consulted to decide whether the user is idle.  This is the default
+if \fIxscreensaver\fP has been compiled on a system which supports this
+mechanism (i.e., Linux systems.)  
+
+The benefit to doing this is that \fIxscreensaver\fP can note that the user
+is active even when the X console is not the active one: if the user is 
+typing in another virtual console, xscreensaver will notice that and will
+fail to activate.  For example, if you're playing Quake in VGA-mode, 
+xscreensaver won't wake up in the middle of your game and start competing 
+for CPU.
+
+The drawback to doing this is that perhaps you \fIreally do\fP want idleness
+on the X console to cause the X display to lock, even if there is activity
+on other virtual consoles.  If you want that, then set this option to False.
+(Or just lock the X console manually.)
+
+The default value for this resource is True, on systems where it works.
+.TP 8
+.B overlayStderr\fP (class \fBBoolean\fP)
+If \fBcaptureStderr\fP is True, and your server supports ``overlay'' visuals,
+then the text will be written into one of the higher layers instead of into
+the same layer as the running screenhack.  Set this to False to disable 
+that (though you shouldn't need to.)
+.TP 8
+.B overlayTextForeground\fP (class \fBForeground\fP)
+The foreground color used for the stdout/stderr text, if \fBcaptureStderr\fP
+is true.  Default: Yellow.
+.TP 8
+.B overlayTextBackground\fP (class \fBBackground\fP)
+The background color used for the stdout/stderr text, if \fBcaptureStderr\fP
+is true.  Default: Black.
+.TP 8
+.B bourneShell\fP (class \fBBourneShell\fP)
+The pathname of the shell that \fIxscreensaver\fP uses to start subprocesses.
+This must be whatever your local variant of \fB/bin/sh\fP is: in particular,
+it must not be \fBcsh\fP.
+.SH COMMAND-LINE OPTIONS
+.I xscreensaver
+also accepts the following command line options.  Except for 
+the \fI\-display\fP option, these command-line options are all 
+simply shorthand for the X resources described in 
+the \fIConfiguration\fP section, above.
+.TP 8
+.B \-display \fIhost:display.screen\fP
+The X display to use.  For displays with multiple screens, XScreenSaver 
+will manage all screens on the display simultaniously; the \fIscreen\fP 
+argument (the ``default'' screen) says which screen should be used for
+dialog boxes (the password window, \fIDemo Mode\fP, etc.)
+.TP 8
+.B \-timeout \fIminutes\fP
+Same as the \fItimeout\fP resource.
+.TP 8
+.B \-cycle \fIminutes\fP
+Same as the \fIcycle\fP resource.
+.TP 8
+.B \-lock\-mode
+Same as setting the \fIlock\fP resource to \fItrue\fP.
+.TP 8
+.B \-no\-lock\-mode
+Same as setting the \fIlock\fP resource to \fIfalse\fP.
+.TP 8
+.B \-lock\-timeout \fIminutes\fP
+Same as the \fIlockTimeout\fP resource.
+.TP 8
+.B \-visual \fIvisual\fP
+Same as the \fIvisualID\fP resource.
+.TP 8
+.B \-install
+Same as setting the \fIinstallColormap\fP resource to \fItrue\fP.
+.TP 8
+.B \-no\-install
+Same as setting the \fIinstallColormap\fP resource to \fIfalse\fP.
+.TP 8
+.B \-verbose
+Same as setting the \fIverbose\fP resource to \fItrue\fP.
+.TP 8
+.B \-silent
+Same as setting the \fIverbose\fP resource to \fIfalse\fP.
+.TP 8
+.B \-timestamp
+Same as setting the \fItimestamp\fP resource to \fItrue\fP.
+.TP 8
+.B \-capture\-stderr
+Same as setting the \fIcaptureStderr\fP resource to \fItrue\fP.
+.TP 8
+.B \-no\-capture\-stderr
+Same as setting the \fIcaptureStderr\fP resource to \fIfalse\fP.
+.TP 8
+.B \-splash
+Same as setting the \fIsplash\fP resource to \fItrue\fP.
+.TP 8
+.B \-no\-splash
+Same as setting the \fIsplash\fP resource to \fIfalse\fP.
+.TP 8
+.B \-nice \fIinteger\fP
+Same as the \fInice\fP resource.
+.TP 8
+.B \-sgi\-extension
+Same as setting the \fIsgiSaverExtension\fP resource to \fItrue\fP.
+.TP 8
+.B \-no\-sgi\-extension
+Same as setting the \fIsgiSaverExtension\fP resource to \fIfalse\fP.
+.TP 8
+.B \-mit\-extension
+Same as setting the \fImitSaverExtension\fP resource to \fItrue\fP.
+.TP 8
+.B \-no\-mit\-extension
+Same as setting the \fImitSaverExtension\fP resource to \fIfalse\fP.
+.TP 8
+.B \-xidle\-extension
+Same as setting the \fIxidleExtension\fP resource to \fItrue\fP.
+.TP 8
+.B \-no\-xidle\-extension
+Same as setting the \fIxidleExtension\fP resource to \fIfalse\fP.
+.TP 8
+.B \-proc\-interrupts
+Same as setting the \fIprocInterrupts\fP resource to \fItrue\fP.
+.TP 8
+.B \-no\-proc\-interrupts
+Same as setting the \fIprocInterrupts\fP resource to \fIfalse\fP.
+.TP 8
+.B \-xrm \fIresource-specification\fP
+As with all other Xt programs, you can specify X resources on the command-line
+using the \fI\-xrm\fP argument.  Most of the interesting resources have 
+command-line equivalents, however.
+.SH HOW IT WORKS
+When it is time to activate the screensaver, a full-screen black window is
+created on each screen of the display.  Each window is created in such a way
+that, to any subsequently-created programs, it will appear to be a ``virtual
+root'' window.  Because of this, any program which draws on the root 
+window (and which understands virtual roots) can be used as a screensaver.
+
+When the user becomes active again, the screensaver windows are unmapped, and
+the running subprocesses are killed by sending them \fBSIGTERM\fP.  This is 
+also how the subprocesses are killed when the screensaver decides that it's
+time to run a different demo: the old one is killed and a new one is launched.
+
+Before launching a subprocess, \fIxscreensaver\fP stores an appropriate value
+for \fB$DISPLAY\fP in the environment that the child will recieve.  (This is
+so that if you start \fIxscreensaver\fP with a \fI-display\fP argument, the
+programs which \fIxscreensaver\fP launches will draw on the same display;
+and so that the child will end up drawing on the appropriate screen of a
+multi-headed display.)
+
+When the screensaver turns off, or is killed, care is taken to restore 
+the ``real'' virtual root window if there is one.  Because of this, it is
+important that you not kill the screensaver process with \fIkill -9\fP if
+you are running a virtual-root window manager.  If you kill it with \-9,
+you may need to restart your window manager to repair the damage.  This
+isn't an issue if you aren't running a virtual-root window manager.
+
+For all the gory details, see the commentary at the top of xscreensaver.c.
+
+You can control a running screensaver process by using the
+.BR xscreensaver\-command (1)
+program (which see.)
+.SH POWER MANAGEMENT
+Modern X servers contain support to power down the monitor after an idle
+period.  If the monitor has powered down, then \fIxscreensaver\fP will
+notice this, and will not waste CPU by drawing graphics demos on a black
+screen.  An attempt will also be made to explicitly power the monitor
+back up as soon as user activity is detected.
+
+If your X server supports power management, then
+.BR xset (1)
+will accept a \fBdpms\fP option.  So, if you wanted \fIxscreensaver\fP
+to activate after 5 minutes, but you wanted your monitor to power down
+after one hour (3600 seconds) you would do this:
+.EX
+xset dpms 3600
+.EE
+See the man page for the
+.BR xset (1)
+program for details.  (Note that power management requires both software
+support in the X server, and hardware support in the monitor itself.)
+.SH USING XDM(1)
+You can run \fIxscreensaver\fP from your 
+.BR xdm (1)
+session, so that the screensaver will run even when nobody is logged 
+in on the console.
+
+The trick to using xscreensaver with \fIxdm\fP is this: keep in mind the 
+two very different states in which xscreensaver will be running:
+.RS 4
+.TP 3
+.B 1: Nobody logged in.
+
+If you're thinking of running xscreensaver from XDM at all, then it's 
+probably because you want graphics demos to be running on the console
+when nobody is logged in there.  In this case, xscreensaver will function
+only as a screen saver, not a screen locker: it doesn't make sense
+for xscreensaver to lock the screen, since nobody is logged in yet!
+The only thing on the screen is the XDM login prompt.
+.TP 3
+.B 2: Somebody logged in.
+
+Once someone has logged in through the XDM login window, the situation is
+very different.  For example: now it makes sense to lock the screen (and
+prompt for the logged in user's password); and now xscreensaver should
+consult that user's \fI~/.xscreensaver\fP file; and so on.
+.RE
+
+The difference between these two states comes down to a question of,
+which user is the \fIxscreensaver\fP process running as?  For the first
+state, it doesn't matter.  If you start \fIxscreensaver\fP in the usual
+XDM way, then xscreensaver will probably end up running as root, which 
+is fine for the first case (the ``nobody logged in'' case.)
+
+However, once someone is logged in, running as root is no longer fine:
+because xscreensaver will be consulting root's \fI.xscreensaver\fP file
+instead of that of the logged in user, and won't be prompting for the
+logged in user's password, and so on.  (This is not a security problem,
+it's just not what you want.)
+
+So, once someone has logged in, you want xscreensaver to be running as that
+user.  The way to accomplish this is to kill the old xscreensaver process
+and start a new one (as the new user.)
+
+The simplest way to accomplish all of this is as follows:
+.RS 4
+.TP 3
+.B 1: Launch xscreensaver before anyone logs in.
+
+To the file \fI/usr/lib/X11/xdm/Xsetup\fP, add the lines
+.EX
+xscreensaver-command -exit
+xscreensaver &
+.EE
+This will run xscreensaver as root, over the XDM login window.
+Moving the mouse will cause the screen to un-blank, and allow the user
+to type their password at XDM to log in.
+.TP 3
+.B 2: Restart xscreensaver when someone logs in.
+
+Near the top of the file \fI/usr/lib/X11/xdm/Xsession\fP, add those same lines:
+.EX
+xscreensaver-command -exit
+xscreensaver &
+.EE
+When someone logs in, this will kill off the existing (root) xscreensaver
+process, and start a new one, running as the user who has just logged in.
+If the user's .xscreensaver file requests locking, they'll get it.  They
+will also get their own choice of timeouts, and graphics demos, and so on.
+
+Alternately, each user could just put those lines in their 
+personal \fI~/.xsession\fP files.
+.RE
+
+Make sure you have \fB$PATH\fP set up correctly in the \fIXsetup\fP 
+and \fIXsession\fP scripts, or \fIxdm\fP won't be able to 
+find \fIxscreensaver\fP, and/or \fIxscreensaver\fP won't be able to 
+find its graphics demos.
+
+(If your system does not seem to be executing the \fIXsetup\fP file, you
+may need to configure it to do so: the traditional way to do this is
+to make that file the value of the \fIDisplayManager*setup\fP resource
+in the \fI/usr/lib/X11/xdm/xdm-config\fP file.  See the man page for
+.BR xdm (1)
+for more details.)
+
+It is safe to run \fIxscreensaver\fP as root (as \fIxdm\fP is likely to do.)  
+If run as root, \fIxscreensaver\fP changes its effective user and group ids 
+to something safe (like \fI"nobody"\fP) before connecting to the X server
+or launching user-specified programs.
+
+An unfortunate side effect of this (important) security precaution is that
+it may conflict with cookie-based authentication.
+
+If you get "connection refused" errors when running \fIxscreensaver\fP
+from \fIxdm\fP, then this probably means that you have
+.BR xauth (1)
+or some other security mechanism turned on.  One way around this is to
+add \fB"xhost\ +localhost"\fP to \fIXsetup\fP, just before \fIxscreensaver\fP
+is launched.  
+
+Note that this will give access to the X server to anyone capable of logging
+in to the local machine, so in some environments, this might not be 
+appropriate.  If turning off file-system-based access control is not
+acceptable, then running \fIxscreensaver\fP from the \fIXsetup\fP file
+might not be possible, and xscreensaver will only work when running as
+a normal, unprivileged user.
+
+For more information on the X server's access control mechanisms, see the
+man pages for
+.BR X (1),
+.BR Xsecurity (1),
+.BR xauth (1),
+and
+.BR xhost (1).
+.SH USING CDE (COMMON DESKTOP ENVIRONMENT)
+The easiest way to use \fIxscreensaver\fP on a system with CDE is to simply
+switch off the built-in CDE screensaver, and use \fIxscreensaver\fP instead;
+and second, to tell the front panel to run 
+.BR xscreensaver\-command (1)
+with the \fI\-lock\fP option when the \fILock\fP icon is clicked.
+
+To accomplish this involves five steps:
+.RS 4
+.TP 3
+\fB1: Switch off CDE's locker\fP
+Do this by turning off ``\fIScreen Saver and Screen Lock\fP'' in the
+Screen section of the Style Manager.
+.TP 3
+\fB2: Edit sessionetc\fP
+Edit the file \fI~/.dt/sessions/sessionetc\fP and add to it the line
+.EX
+xscreensaver &
+.EE
+This will cause \fIxscreensaver\fP to be launched when you log in.
+(As always, make sure that xscreensaver and the graphics demos are on
+your \fB$PATH\fP; the path needs to be set in \fI.cshrc\fP 
+and/or \fI.dtprofile\fP, not \fI.login\fP.)
+.TP 3
+\fB3: Create XScreenSaver.dt\fP
+Create a file called \fI~/.dt/types/XScreenSaver.dt\fP with the following
+contents:
+.EX
+ACTION XScreenSaver
+{
+  LABEL         XScreenSaver
+  TYPE          COMMAND
+  EXEC_STRING   xscreensaver-command -lock
+  ICON          Dtkey
+  WINDOW_TYPE   NO_STDIO
+}
+.EE
+This defines a ``lock'' command for the CDE front panel, that knows how
+to talk to \fIxscreensaver\fP.
+.TP 3
+\fB4: Create Lock.fp\fP
+Create a file called \fI~/.dt/types/Lock.fp\fP with the following
+contents:
+.EX
+CONTROL Lock
+{
+  TYPE             icon
+  CONTAINER_NAME   Switch
+  CONTAINER_TYPE   SWITCH
+  POSITION_HINTS   1
+  ICON             Fplock
+  LABEL            Lock
+  PUSH_ACTION      XScreenSaver
+  HELP_TOPIC       FPOnItemLock
+  HELP_VOLUME      FPanel
+}
+.EE
+This associates the CDE front panel ``Lock'' icon with the lock command
+we just defined in step 3.
+.TP 3
+\fB5: Restart\fP
+Select ``\fIRestart Workspace Manager\fP'' from the popup menu to make
+your changes take effect.  If things seem not to be working, check the
+file \fI~/.dt/errorlog\fP for error messages.
+.RE
+.SH USING HP VUE (VISUAL USER ENVIRONMENT)
+Since CDE is a descendant of VUE, the instructions for using xscreensaver
+under VUE are similar to the above:
+.RS 4
+.TP 3
+\fB1: Switch off VUE's locker\fP
+Open the ``\fIStyle Manager\fP'' and select ``\fIScreen\fP.''
+Turn off ``\fIScreen Saver and Screen Lock\fP'' option.
+.TP 3
+\fB2: Make sure you have a Session\fP
+Next, go to the Style Manager's, ``\fIStartup\fP'' page.
+Click on ``\fISet Home Session\fP'' to create a session, then 
+on ``\fIReturn to Home Session\fP'' to select this session each
+time you log in.
+.TP 3
+\fB3: Edit vue.session\fP
+Edit the file \fI~/.vue/sessions/home/vue.session\fP and add to it
+the line
+.EX
+vuesmcmd -screen 0 -cmd "xscreensaver"
+.EE
+This will cause \fIxscreensaver\fP to be launched when you log in.
+(As always, make sure that xscreensaver and the graphics demos are on
+your \fB$PATH\fP; the path needs to be set in \fI.cshrc\fP
+and/or \fI.profile\fP, not \fI.login\fP.)
+.TP 3
+\fB3: Edit vuewmrc\fP
+Edit the file \fI~/.vue/vuewmrc\fP and add (or change) the Lock control:
+.EX
+CONTROL Lock
+{
+  TYPE         button
+  IMAGE        lock
+  PUSH_ACTION  f.exec "xscreensaver-command -lock"
+  HELP_TOPIC   FPLock
+}
+.EE
+This associates the VUE front panel ``Lock'' icon with the xscreensaver 
+lock command.
+.RE
+.PP
+.SH ADDING TO MENUS
+The
+.BR xscreensaver-command (1)
+program is a perfect candidate for something to add to your window manager's
+popup menus.  If you use 
+.BR mwm (1),
+.BR 4Dwm (1),
+.BR twm (1),
+or (probably) any of \fItwm\fP's many descendants, you can do it like this:
+.RS 0
+.TP 3
+\fB1. Create ~/.mwmrc (or ~/.twmrc or ...)\fP
+If you don't have a \fI~/.mwmrc\fP file (or, on SGIs, a \fI~/.4Dwmrc\fP file;
+or, with twm, a \fI~/.twmrc\fP file) then create one by making a copy of
+the \fI/usr/lib/X11/system.mwmrc\fP 
+file (or \fI/usr/lib/X11/twm/system.twmrc\fP, and so on.)
+.TP 3
+\fB2. Add a menu definition.\fP
+Something like this:
+.EX
+menu XScreenSaver
+{
+ "Blank Screen Now" !"sleep 3; xscreensaver-command -activate"
+ "Lock Screen Now"  !"sleep 3; xscreensaver-command -lock"
+ "Screen Saver Demo"         !"xscreensaver-demo"
+ "Screen Saver Preferences"  !"xscreensaver-demo -prefs"
+ "Reinitialize Screen Saver" !"xscreensaver-command -restart"
+ "Kill Screen Saver"         !"xscreensaver-command -exit"
+ "Launch Screen Saver"       !"xscreensaver &"
+}
+.EE
+.TP 3
+\fB3. Add the menu\fP
+For
+.BR mwm (1)
+and
+.BR 4Dwm (1),
+find the section of the file that says \fIMenu DefaultRootMenu\fP.
+For
+.BR twm (1),
+it will probably be \fImenu "defops"\fP.  If you add a line somewhere 
+in that menu definition that reads
+.EX
+  "XScreenSaver"        f.menu XScreenSaver
+.EE
+then this will add an XScreenSaver sub-menu to your default root-window
+popup menu.  Alternately, you could just put the xscreensaver menu items
+directly into the root menu.
+.RE
+
+Other window managers are guaranteed to do things gratuitously differently.
+.SH BUGS
+Bugs?  There are no bugs.  Ok, well, maybe.  If you find one, please let
+me know.  http://www.jwz.org/xscreensaver/bugs.html explains how to
+construct the most useful bug reports.
+.TP 8
+.B Locking and XDM
+If xscreensaver has been launched from 
+.BR xdm (1)
+before anyone has logged in, you will need to kill and then restart the
+xscreensaver daemon after you have logged in, or you will be confused by
+the results.  (For example, locking won't work, and your \fI~/.xscreensaver\fP
+file will be ignored.)
+
+When you are logged in, you want the \fIxscreensaver\fP daemon to be 
+running under \fIyour\fP user id, not as root or some other user.
+
+If it has already been started by \fIxdm\fP, you can kill it by sending
+it the \fBexit\fP command, and then re-launching it as you, by putting
+something like the following in your personal X startup script:
+.EX
+xscreensaver-command -exit
+xscreensaver &
+.EE
+The ``\fIUsing XDM(1)\fP'' section, above, goes into more detail, and explains
+how to configure the system to do this for all users automatically.
+.TP 8
+.B Locking and root logins
+In order for it to be safe for xscreensaver to be launched by \fIxdm\fP,
+certain precautions had to be taken, among them that xscreensaver never
+runs as \fIroot\fP.  In particular, if it is launched as root (as \fIxdm\fP
+is likely to do), xscreensaver will disavow its privileges, and switch 
+itself to a safe user id (such as \fInobody\fP.)
+
+An implication of this is that if you log in as \fIroot\fP on the console, 
+xscreensaver will refuse to lock the screen (because it can't tell
+the difference between \fIroot\fP being logged in on the console, and a
+normal user being logged in on the console but xscreensaver having been 
+launched by the
+.BR xdm (1)
+.I Xsetup
+file.)
+
+The solution to this is simple: you shouldn't be logging in on the console
+as \fIroot\fP in the first place!  (What, are you crazy or something?)  
+
+Proper Unix hygiene dictates that you should log in as yourself, and
+.BR su (1)
+to \fIroot\fP as necessary.  People who spend their day logged in
+as \fIroot\fP are just begging for disaster.
+.TP 8
+.B XAUTH and XDM
+For xscreensaver to work when launched by
+.BR xdm (1),
+programs running on the local machine as user \fI"nobody"\fP must be
+able to connect to the X server.  This means that if you want to run
+xscreensaver on the console while nobody is logged in, you may need
+to disable cookie-based access control (and allow all users who can log
+in to the local machine to connect to the display.)  
+
+You should be sure that this is an acceptable thing to do in your
+environment before doing it.  See the ``\fIUsing XDM(1)\fP'' section, 
+above, for more details.
+
+If anyone has suggestions on how xscreensaver could be made to work with
+.BR xdm (1)
+without first turning off \fI.Xauthority\fP-based access control, please
+let me know.
+.TP 8
+.B Passwords
+If you get an error message at startup like ``couldn't get password
+of \fIuser\fP'' then this probably means that you're on a system in which 
+the
+.BR getpwent (3)
+library routine can only be effectively used by root.  If this is the case, 
+then \fIxscreensaver\fP must be installed as setuid to root in order for
+locking to work.  Care has been taken to make this a safe thing to do.  
+
+It also may mean that your system uses shadow passwords instead of the standard
+.BR getpwent (3)
+interface; in that case, you may need to change some options 
+with \fIconfigure\fP and recompile.
+
+If you change your password after xscreensaver has been launched, it will
+continue using your old password to unlock the screen until xscreensaver
+is restarted.  So, after you change your password, you'll have to do
+.EX
+xscreensaver-command -restart
+.EE
+to make \fIxscreensaver\fP notice.
+.TP 8
+.B PAM Passwords
+If your system uses PAM (Pluggable Authentication Modules), then in order
+for xscreensaver to use PAM properly, PAM must be told about xscreensaver.
+The xscreensaver installation process should update the PAM data (on Linux,
+by creating the file \fI/etc/pam.d/xscreensaver\fP for you, and on Solaris, 
+by telling you what lines to add to the \fI/etc/pam.conf\fP file.)  
+
+If the PAM configuration files do not know about xscreensaver, then 
+you \fImight\fP be in a situation where xscreensaver will refuse to ever
+unlock the screen.
+
+This is a design flaw in PAM (there is no way for a client to tell the
+difference between PAM responding ``I have never heard of your module,''
+and responding, ``you typed the wrong password.'')  As far as I can tell,
+there is no way for xscreensaver to automatically work around this, or
+detect the problem in advance, so if you have PAM, make sure it is
+configured correctly!
+.TP 8
+.B Colormap lossage: TWM
+The \fBinstallColormap\fP option doesn't work very well with the
+.BR twm (1)
+window manager and its descendants.  
+
+There is a race condition between the screensaver and this window manager,
+which can result in the screensaver's colormap not getting installed
+properly, meaning the graphics hacks will appear in essentially random
+colors.  (If the screen goes white instead of black, this is probably why.)
+
+The
+.BR mwm (1)
+and
+.BR olwm (1)
+window managers don't have this problem.  The race condition exists
+because X (really, ICCCM) does not provide a way for an OverrideRedirect 
+window to have its own colormap, short of grabbing the server (which is 
+neither a good idea, nor really possible with the current design.)  What 
+happens is that, as soon as xscreensaver installs its colormap, \fBtwm\fP 
+responds to the resultant \fBColormapNotify\fP event by re-instaling the 
+default colormap.  Apparently, \fBtwm\fP doesn't \fIalways\fP do this; it 
+seems to do it regularly if the screensaver is activated from a menu item, 
+but seems to not do it if the screensaver comes on of its own volition, or 
+is activated from another console.  
+.RS 8
+.TP 4
+.B Attention, window manager authors!
+You should only call
+.BR XInstallColormap (3)
+in response to user events.  That is, it is appropriate to install a colormap
+in response to \fBFocusIn\fP, \fBFocusOut\fP, \fBEnterNotify\fP, 
+and \fBLeaveNotify\fP events; but it is not appropriate to call it in
+response to \fBColormapNotify\fP events.  If you install colormaps in
+response to \fIapplication\fP actions as well as in response to \fIuser\fP
+actions, then you create the situation where it is impossible for 
+override-redirect applications (such as xscreensaver) to display their
+windows in the proper colors.
+.RE
+.TP 8
+.B Colormap lossage: XV, XAnim, XEarth
+Some programs don't operate properly on visuals other than the default one,
+or with colormaps other than the default one.  See the discussion of the
+magic "default-n" visual name in the description of the \fBprograms\fP 
+resource in the \fIConfiguration\fP section.  When programs only work with
+the default colormap, you need to use a syntax like this:
+.EX
+   default-n: xv -root image-1.gif -quit  \\n\\
+   default-n: xearth -nostars -wait 0     \\n\\
+.EE
+It would also work to turn off the \fBinstallColormap\fP option altogether,
+but that would deny extra colors to those programs that \fIcan\fP take
+advantage of them.
+.TP 8
+.B Machine Load
+Although this program ``nices'' the subprocesses that it starts, 
+graphics-intensive subprograms can still overload the machine by causing
+the X server process itself (which is not ``niced'') to suck a lot of 
+cycles.  Care should be taken to slow down programs intended for use as 
+screensavers by inserting strategic calls to
+.BR sleep (3)
+or
+.BR usleep (3)
+(or making liberal use of any \fI\-delay\fP options which the programs 
+may provide.)
+
+Note that the OpenGL-based graphics demos are real pigs on machines that
+don't have texture hardware.
+
+Also, an active screensaver will cause your X server to be pretty much 
+permanently swapped in; but the same is true of any program that draws
+periodically, like 
+.BR xclock (1)
+or
+.BR xload (1).
+.TP 8
+.B Latency and Responsiveness
+If the subprocess is drawing too quickly and the connection to the X
+server is a slow one (such as an X terminal running over a phone line) then 
+the screensaver might not turn off right away when the user becomes active
+again (the
+.BR ico (1)
+demo has this problem if being run in full-speed mode).  This can be
+alleviated by inserting strategic calls to
+.BR XSync (3)
+in code intended for use as a screensaver.  This prevents too much graphics
+activity from being buffered up.
+.TP 8
+.B XFree86's Magic Keystrokes
+The XFree86 X server traps certain magic keystrokes before client programs ever
+see them.  Two that are of note are Ctrl+Alt+Backspace, which causes 
+the X server to exit; and Ctrl+Alt+F\fIn\fP, which switches virtual consoles.
+The X server will respond to these keystrokes even if xscreensaver has the
+screen locked.  Depending on your setup, you might consider this a problem.
+
+Unfortunately, there is no way for xscreensaver itself to override the
+interpretation of these keys.  If you want to disable Ctrl+Alt+Backspace
+globally, you need to set the \fIDontZap\fP flag in 
+your \fI/etc/X11/XF86Config\fP file.  See the
+.BR XF86Config (5)
+manual for details.
+
+There is no way (as far as I can tell) to disable the VT-switching keystrokes.
+
+Some Linux systems come with a VT_LOCKSWITCH ioctl, that one could 
+theoretically use to prevent VT-switching while the screen is locked; 
+but unfortunately, this ioctl can only be used by root, which means
+that xscreensaver can't use it (since xscreensaver disavows its privileges
+shortly after startup, for security reasons.)
+
+Any suggestions for other solutions to this problem are welcome.
+.TP 8
+.B XView Clients
+Apparently there are some problems with XView programs getting confused
+and thinking that the screensaver window is the real root window even when
+the screensaver is not active: ClientMessages intended for the window manager
+are sent to the screensaver window instead.  This could be solved by making
+xscreensaver forward all unrecognised ClientMessages to the real root window,
+but there may be other problems as well.  If anyone has any insight on the
+cause of this problem, please let me know.  (XView is an X11 toolkit that 
+implements the (quite abominable) Sun OpenLook look-and-feel.)
+.TP 8
+.B MIT Extension and Fading
+The \fBMIT-SCREEN-SAVER\fP extension is junk.  Don't use it.
+
+When using the \fBMIT-SCREEN-SAVER\fP extension in conjunction with 
+the \fBfade\fP option, you'll notice an unattractive flicker just before 
+the fade begins.  This is because the server maps a black window just before 
+it tells the \fIxscreensaver\fP process to activate.  The \fIxscreensaver\fP 
+process immediately unmaps that window, but this results in a flicker.  I 
+haven't figured a way  to get around this; it seems to be a fundamental
+property of the (mis-) design of this server extension.
+
+It sure would be nice if someone would implement the \fBSGI SCREEN_SAVER\fP
+extension in XFree86; it's dead simple, and works far better than the
+overengineered and broken \fBMIT-SCREEN-SAVER\fP extension.
+.TP 8
+.B SGI Power Saver
+If you're running Irix 6.3, you might find that your monitor is powering down
+after an hour or two even if you've told it not to.  This is fixed by SGI
+patches 2447 and 2537.
+
+If you're running Irix 6.5, this bug is back.  I don't know a fix.
+.TP 8
+.B MesaGL and Voodoo Cards
+If you have a 3Dfx/Voodoo card, the default settings for xscreensaver will
+run the GL-based graphics demos in such a way that they will not take 
+advantage of the 3D acceleration hardware.  The solution is to change
+the \fBprograms\fP entries for the GL hacks from this:
+.EX
+       gears -root                        \\n\\
+.EE
+to this:
+.EX
+       MESA_GLX_FX=fullscreen  gears      \\n\\
+.EE
+That is, make sure that \fB$MESA_GLX_FX\fP is set to \fIfullscreen\fP, and
+don't tell the program to draw on the root window.  This may seem strange,
+but the setup used by Mesa and these kinds of cards \fIis\fP strange!
+
+For those who don't know, these cards work by sitting between your normal
+video card and the monitor, and seizing control of the monitor when it's 
+time to do 3D.  But this means that accelerated 3D only happens in full-screen
+mode (you can't do it in a window, and you can't see the output of 3D and 2D
+programs simultaniously), and that 3D will probably drive your monitor at a
+lower resolution, as well.  It's bizarre.
+
+If you find that GL programs only work properly when run as root, and not
+as normal users, then the problem is that your \fI/dev/3dfx\fP file is not
+configured properly.  Check the Linux 3Dfx FAQ.
+.TP 8
+.B Keyboard LEDs
+If \fIprocInterrupts\fP is on (which is the default on Linux systems) and
+you're using some program that toggles the state of your keyboard LEDs,
+xscreensaver won't work right: turning those LEDs on or off causes a 
+keyboard interrupt, which xscreensaver will interpret as user activity.
+So if you're using such a program, set the \fIprocInterrupts\fP resource
+to False.
+.TP 8
+.B Extensions
+If you are not making use of one of the server extensions (\fBXIDLE\fP,
+\fBSGI SCREEN_SAVER\fP, or \fBMIT-SCREEN-SAVER\fP), then it is possible, in 
+rare situations, for \fIxscreensaver\fP to interfere with event propagation 
+and make another X program malfunction.  For this to occur, that other
+application would need to \fInot\fP select \fBKeyPress\fP events on its 
+non-leaf windows within the first 30 seconds of their existence, but then 
+select for them later.  In this case, that client \fImight\fP fail to receive 
+those events.  This isn't very likely, since programs generally select a
+constant set of events immediately after creating their windows and then 
+don't change them, but this is the reason that it's a good idea to install 
+and use one of the server extensions instead, to work around this shortcoming
+in the X protocol.
+
+In all these years, I've not heard of even a single case of this happening,
+but it is theoretically possible, so I'm mentioning it for completeness...
+.TP 8
+.B Red Hot Lava
+There need to be a lot more graphics hacks.  In particular, there should be
+a simulation of a Lavalite (tm).
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number, and to inform the sub-programs
+of the screen on which to draw.
+.TP 8
+.B PATH
+to find the sub-programs to run.
+.TP 8
+.B HOME
+for the directory in which to read and write the \fI.xscreensaver\fP file.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH UPGRADES
+The latest version can always be found at 
+http://www.jwz.org/xscreensaver/
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver\-demo (1),
+.BR xscreensaver\-command (1),
+.BR xdm (1),
+.BR xset (1),
+.BR Xsecurity (1),
+.BR xauth (1),
+.BR xhost (1).
+.BR ant (1),
+.BR atlantis (1),
+.BR attraction (1),
+.BR blitspin (1),
+.BR bouboule (1),
+.BR braid (1),
+.BR bsod (1),
+.BR bubble3d (1),
+.BR bubbles (1),
+.BR cage (1),
+.BR compass (1),
+.BR coral (1),
+.BR critical (1),
+.BR crystal (1),
+.BR cynosure (1),
+.BR decayscreen (1),
+.BR deco (1),
+.BR deluxe (1),
+.BR demon (1),
+.BR discrete (1),
+.BR distort (1),
+.BR drift (1),
+.BR epicycle (1),
+.BR fadeplot (1),
+.BR flag (1),
+.BR flame (1),
+.BR flow (1),
+.BR forest (1),
+.BR galaxy (1),
+.BR gears (1),
+.BR glplanet (1),
+.BR goop (1),
+.BR grav (1),
+.BR greynetic (1),
+.BR halo (1),
+.BR helix (1),
+.BR hopalong (1),
+.BR hypercube (1),
+.BR ifs (1),
+.BR imsmap (1),
+.BR interference (1),
+.BR jigsaw (1),
+.BR julia (1),
+.BR kaleidescope (1),
+.BR kumppa (1),
+.BR lament (1),
+.BR laser (1),
+.BR lightning (1),
+.BR lisa (1),
+.BR lissie (1),
+.BR lmorph (1),
+.BR loop (1),
+.BR maze (1),
+.BR moebius (1),
+.BR moire (1),
+.BR moire2 (1),
+.BR morph3d (1),
+.BR mountain (1),
+.BR munch (1),
+.BR noseguy (1),
+.BR pedal (1),
+.BR penetrate (1),
+.BR penrose (1),
+.BR petri (1),
+.BR phosphor (1),
+.BR pipes (1),
+.BR pulsar (1),
+.BR pyro (1),
+.BR qix (1),
+.BR rd-bomb (1),
+.BR rocks (1),
+.BR rorschach (1),
+.BR rotor (1),
+.BR rubik (1),
+.BR sierpinski (1),
+.BR slidescreen (1),
+.BR slip (1),
+.BR sonar (1),
+.BR sphere (1),
+.BR spiral (1),
+.BR spotlight (1),
+.BR sproingies (1),
+.BR squiral (1),
+.BR stairs (1),
+.BR starfish (1),
+.BR strange (1),
+.BR superquadrics (1),
+.BR swirl (1),
+.BR t3d (1),
+.BR triangle (1),
+.BR truchet (1),
+.BR vines (1),
+.BR wander (1),
+.BR worm (1),
+.BR xflame (1),
+.BR xjack (1),
+.BR xlyap (1),
+.BR xmatrix (1),
+.BR xroger (1),
+.BR bongo (1),
+.BR ico (1),
+.BR xaos (1),
+.BR xbouncebits (1),
+.BR xcthugha (1),
+.BR xdaliclock (1),
+.BR xfishtank (1),
+.BR xmountains (1),
+.BR xsplinefun (1),
+.BR xswarm (1),
+.BR xtacy (1),
+.BR xv (1),
+.BR xwave (1).
+.SH COPYRIGHT
+Copyright \(co 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999
+by Jamie Zawinski.  Permission to use, copy, modify, distribute, and sell
+this software 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.  No representations are made about the suitability of this
+software for any purpose.  It is provided "as is" without express or implied
+warranty.
+.SH AUTHOR
+Jamie Zawinski <jwz@jwz.org>.  Written in late 1991; first posted
+to comp.sources.x on 13-Aug-1992.
+
+Please let me know if you find any bugs or make any improvements.
+.SH ACKNOWLEDGEMENTS
+Thanks to the many people who have contributed graphics demos to the package.
+
+Thanks to David Wojtowicz for implementing \fIlockTimeout\fP.
+
+Thanks to Martin Kraemer for adding support for shadow passwords and
+locking-disabled diagnostics.
+
+Thanks to Patrick Moreau for the VMS port.
+
+Thanks to Mark Bowyer for figuring out how to hook it up to CDE.
+
+Thanks to Nat Lanza for the Kerberos support.
+
+Thanks to Bill Nottingham for the initial PAM support.
+
+And thanks to Jon A. Christopher for implementing the Athena dialog
+support, back in the days before Lesstif or Gtk were viable alternatives
+to Motif.
diff --git a/driver/xscreensaver.pam b/driver/xscreensaver.pam
new file mode 100644 (file)
index 0000000..09eefa3
--- /dev/null
@@ -0,0 +1,2 @@
+#%PAM-1.0
+auth       required    /lib/security/pam_pwdb.so shadow nullok
diff --git a/driver/xset.c b/driver/xset.c
new file mode 100644 (file)
index 0000000..2e167c1
--- /dev/null
@@ -0,0 +1,386 @@
+/* xset.c --- interacting with server extensions and the builtin screensaver.
+ * xscreensaver, Copyright (c) 1991-1998 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software 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.  No representations are made about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or 
+ * implied warranty.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <stdio.h>
+#include <X11/Xlib.h>
+#include <X11/Xutil.h>
+#include <X11/Xatom.h>
+#include <X11/Xos.h>
+
+/* This file doesn't need the Xt headers, so stub these types out... */
+#undef XtPointer
+#define XtAppContext void*
+#define XrmDatabase  void*
+#define XtIntervalId void*
+#define XtPointer    void*
+#define Widget       void*
+
+#include "xscreensaver.h"
+
+#ifdef _VROOT_H_
+ERROR!  You must not include vroot.h in this file.
+#endif
+
+\f
+/* MIT SCREEN-SAVER server extension hackery.
+ */
+
+#ifdef HAVE_MIT_SAVER_EXTENSION
+
+# include <X11/extensions/scrnsaver.h>
+
+Bool
+query_mit_saver_extension (saver_info *si)
+{
+  return XScreenSaverQueryExtension (si->dpy,
+                                    &si->mit_saver_ext_event_number,
+                                    &si->mit_saver_ext_error_number);
+}
+
+static int
+ignore_all_errors_ehandler (Display *dpy, XErrorEvent *error)
+{
+  return 0;
+}
+
+static void
+init_mit_saver_extension (saver_info *si)
+{
+  int i;
+  Pixmap *blank_pix = (Pixmap *) calloc (sizeof(Pixmap), si->nscreens);
+
+  for (i = 0; i < si->nscreens; i++)
+    {
+      saver_screen_info *ssi = &si->screens[i];
+      XID kill_id = 0;
+      Atom kill_type = 0;
+      Window root = RootWindowOfScreen (ssi->screen);
+      blank_pix[i] = XCreatePixmap (si->dpy, root, 1, 1, 1);
+
+      /* Kill off the old MIT-SCREEN-SAVER client if there is one.
+        This tends to generate X errors, though (possibly due to a bug
+        in the server extension itself?) so just ignore errors here. */
+      if (XScreenSaverGetRegistered (si->dpy,
+                                    XScreenNumberOfScreen (ssi->screen),
+                                    &kill_id, &kill_type)
+         && kill_id != blank_pix[i])
+       {
+         XErrorHandler old_handler =
+           XSetErrorHandler (ignore_all_errors_ehandler);
+         XKillClient (si->dpy, kill_id);
+         XSync (si->dpy, False);
+         XSetErrorHandler (old_handler);
+       }
+      XScreenSaverSelectInput (si->dpy, root, ScreenSaverNotifyMask);
+      XScreenSaverRegister (si->dpy,
+                           XScreenNumberOfScreen (ssi->screen),
+                           (XID) blank_pix[i], XA_PIXMAP);
+    }
+  free(blank_pix);
+}
+#endif /* HAVE_MIT_SAVER_EXTENSION */
+
+\f
+/* SGI SCREEN_SAVER server extension hackery.
+ */
+
+#ifdef HAVE_SGI_SAVER_EXTENSION
+
+# include <X11/extensions/XScreenSaver.h>
+
+Bool
+query_sgi_saver_extension (saver_info *si)
+{
+  return XScreenSaverQueryExtension (si->dpy,
+                                    &si->sgi_saver_ext_event_number,
+                                    &si->sgi_saver_ext_error_number);
+}
+
+static void
+init_sgi_saver_extension (saver_info *si)
+{
+  saver_preferences *p = &si->prefs;
+  int i;
+  if (si->screen_blanked_p)
+    /* If you mess with this while the server thinks it's active,
+       the server crashes. */
+    return;
+
+  for (i = 0; i < si->nscreens; i++)
+    {
+      saver_screen_info *ssi = &si->screens[i];
+      XScreenSaverDisable (si->dpy, XScreenNumberOfScreen(ssi->screen));
+      if (! XScreenSaverEnable (si->dpy, XScreenNumberOfScreen(ssi->screen)))
+       {
+         fprintf (stderr,
+       "%s: SGI SCREEN_SAVER extension exists, but can't be initialized;\n\
+               perhaps some other screensaver program is already running?\n",
+                  blurb());
+         si->using_sgi_saver_extension = False;
+         return;
+       }
+    }
+}
+
+#endif /* HAVE_SGI_SAVER_EXTENSION */
+
+\f
+/* XIDLE server extension hackery.
+ */
+
+#ifdef HAVE_XIDLE_EXTENSION
+
+# include <X11/extensions/xidle.h>
+
+Bool
+query_xidle_extension (saver_info *si)
+{
+  int event_number;
+  int error_number;
+  return XidleQueryExtension (si->dpy, &event_number, &error_number);
+}
+
+#endif /* HAVE_XIDLE_EXTENSION */
+
+
+\f
+/* Figuring out what the appropriate XSetScreenSaver() parameters are
+   (one wouldn't expect this to be rocket science.)
+ */
+
+void
+disable_builtin_screensaver (saver_info *si, Bool unblank_screen_p)
+{
+  saver_preferences *p = &si->prefs;
+  int current_server_timeout, current_server_interval;
+  int current_prefer_blank, current_allow_exp;
+  int desired_server_timeout, desired_server_interval;
+  int desired_prefer_blank, desired_allow_exp;
+
+  XGetScreenSaver (si->dpy, &current_server_timeout, &current_server_interval,
+                  &current_prefer_blank, &current_allow_exp);
+
+  desired_server_timeout = current_server_timeout;
+  desired_server_interval = current_server_interval;
+  desired_prefer_blank = current_prefer_blank;
+  desired_allow_exp = current_allow_exp;
+
+  /* On SGIs, if interval is non-zero, it is the number of seconds after
+     screen saving starts at which the monitor should be powered down.
+     Obviously I don't want that, so set it to 0 (meaning "never".)
+
+     Power saving is disabled if DontPreferBlanking, but in that case,
+     we don't get extension events either.  So we can't turn it off that way.
+
+     Note: if you're running Irix 6.3 (O2), you may find that your monitor is
+     powering down anyway, regardless of the xset settings.  This is fixed by
+     installing SGI patches 2447 and 2537.
+   */
+  desired_server_interval = 0;
+
+  /* I suspect (but am not sure) that DontAllowExposures might have
+     something to do with powering off the monitor as well, at least
+     on some systems that don't support XDPMS?  Who know... */
+  desired_allow_exp = AllowExposures;
+
+  if (si->using_mit_saver_extension || si->using_sgi_saver_extension)
+    {
+      desired_server_timeout = (p->timeout / 1000);
+
+      /* The SGI extension won't give us events unless blanking is on.
+        I think (unsure right now) that the MIT extension is the opposite. */
+      if (si->using_sgi_saver_extension)
+       desired_prefer_blank = PreferBlanking;
+      else
+       desired_prefer_blank = DontPreferBlanking;
+    }
+  else
+    {
+      /* When we're not using an extension, set the server-side timeout to 0,
+        so that the server never gets involved with screen blanking, and we
+        do it all ourselves.  (However, when we *are* using an extension,
+        we tell the server when to notify us, and rather than blanking the
+        screen, the server will send us an X event telling us to blank.)
+       */
+      desired_server_timeout = 0;
+    }
+
+  if (desired_server_timeout != current_server_timeout ||
+      desired_server_interval != current_server_interval ||
+      desired_prefer_blank != current_prefer_blank ||
+      desired_allow_exp != current_allow_exp)
+    {
+      if (unblank_screen_p)
+       fprintf (stderr,
+                "%s disabling server builtin screensaver.\n"
+                "%s: you can re-enable it with \"xset s on\".\n",
+                blurb(), blurb());
+
+      if (p->verbose_p)
+       fprintf (stderr, "%s: (xset s %d %d; xset s %s; xset s %s)\n", blurb(),
+                desired_server_timeout, desired_server_interval,
+                (desired_prefer_blank ? "blank" : "noblank"),
+                (desired_allow_exp ? "expose" : "noexpose"));
+
+      XSetScreenSaver (si->dpy,
+                      desired_server_timeout, desired_server_interval,
+                      desired_prefer_blank, desired_allow_exp);
+      XSync(si->dpy, False);
+    }
+
+
+#if defined(HAVE_MIT_SAVER_EXTENSION) || defined(HAVE_SGI_SAVER_EXTENSION)
+  {
+    static Bool extension_initted = False;
+    if (!extension_initted)
+      {
+       extension_initted = True;
+# ifdef HAVE_MIT_SAVER_EXTENSION
+       if (si->using_mit_saver_extension) init_mit_saver_extension(si);
+# endif
+# ifdef HAVE_SGI_SAVER_EXTENSION
+       if (si->using_sgi_saver_extension) init_sgi_saver_extension(si);
+# endif
+      }
+  }
+#endif /* HAVE_MIT_SAVER_EXTENSION || HAVE_SGI_SAVER_EXTENSION */
+
+  if (unblank_screen_p)
+    /* Turn off the server builtin saver if it is now running. */
+    XForceScreenSaver (si->dpy, ScreenSaverReset);
+}
+
+\f
+/* Display Power Management System (DPMS.)
+
+   On XFree86 systems, "man xset" reports:
+
+       -dpms    The -dpms option disables DPMS (Energy Star) features.
+       +dpms    The +dpms option enables DPMS (Energy Star) features.
+
+       dpms flags...
+                The dpms option allows the DPMS (Energy Star)
+                parameters to be set.  The option can take up to three
+                numerical values, or the `force' flag followed by a
+                DPMS state.  The `force' flags forces the server to
+                immediately switch to the DPMS state specified.  The
+                DPMS state can be one of `standby', `suspend', or
+                `off'.  When numerical values are given, they set the
+                inactivity period before the three modes are activated.
+                The first value given is for the `standby' mode, the
+                second is for the `suspend' mode, and the third is for
+                the `off' mode.  Setting these values implicitly
+                enables the DPMS features.  A value of zero disables a
+                particular mode.
+
+   However, note that the implementation is more than a little bogus,
+   in that there is code in /usr/X11R6/lib/libXdpms.a to implement all
+   the usual server-extension-querying utilities -- but there are no
+   prototypes in any header file!  Thus, the prototypes here.  (The
+   stuff in X11/extensions/dpms.h and X11/extensions/dpmsstr.h define
+   the raw X protcol, they don't define the API to libXdpms.a.)
+
+   Some documentation:
+   Library:  ftp://ftp.x.org/pub/R6.4/xc/doc/specs/Xext/DPMSLib.ms
+   Protocol: ftp://ftp.x.org/pub/R6.4/xc/doc/specs/Xext/DPMS.ms
+ */
+
+#ifdef HAVE_DPMS_EXTENSION
+
+#include <X11/Xproto.h>                        /* for CARD16 */
+#include <X11/extensions/dpms.h>
+#include <X11/extensions/dpmsstr.h>
+
+extern Bool DPMSQueryExtension (Display *dpy, int *event_ret, int *error_ret);
+extern Bool DPMSCapable (Display *dpy);
+extern Status DPMSForceLevel (Display *dpy, CARD16 level);
+extern Status DPMSInfo (Display *dpy, CARD16 *power_level, BOOL *state);
+
+#if 0 /* others we don't use */
+extern Status DPMSGetVersion (Display *dpy, int *major_ret, int *minor_ret);
+extern Status DPMSSetTimeouts (Display *dpy,
+                              CARD16 standby, CARD16 suspend, CARD16 off);
+extern Bool DPMSGetTimeouts (Display *dpy,
+                            CARD16 *standby, CARD16 *suspend, CARD16 *off);
+extern Status DPMSEnable (Display *dpy);
+extern Status DPMSDisable (Display *dpy);
+#endif /* 0 */
+
+
+Bool
+monitor_powered_on_p (saver_info *si)
+{
+  Bool result;
+  int event_number, error_number;
+  BOOL onoff = False;
+  CARD16 state;
+
+  if (!DPMSQueryExtension(si->dpy, &event_number, &error_number))
+    /* Server doesn't know -- assume the monitor is on. */
+    result = True;
+
+  else if (!DPMSCapable(si->dpy))
+    /* Server says the monitor doesn't do power management -- so it's on. */
+    result = True;
+
+  else
+    {
+      DPMSInfo(si->dpy, &state, &onoff);
+      if (!onoff)
+       /* Server says DPMS is disabled -- so the monitor is on. */
+       result = True;
+      else
+       switch (state) {
+       case DPMSModeOn:      result = True;  break;  /* really on */
+       case DPMSModeStandby: result = False; break;  /* kinda off */
+       case DPMSModeSuspend: result = False; break;  /* pretty off */
+       case DPMSModeOff:     result = False; break;  /* really off */
+       default:              result = True;  break;  /* protocol error? */
+       }
+    }
+
+  return result;
+}
+
+void
+monitor_power_on (saver_info *si)
+{
+  if (!monitor_powered_on_p (si))
+    {
+      DPMSForceLevel(si->dpy, DPMSModeOn);
+      XSync(si->dpy, False);
+      if (!monitor_powered_on_p (si))
+       fprintf (stderr,
+       "%s: DPMSForceLevel(dpy, DPMSModeOn) did not power the monitor on?\n",
+                blurb());
+    }
+}
+
+#else  /* !HAVE_DPMS_EXTENSION */
+
+Bool
+monitor_powered_on_p (saver_info *si) 
+{
+  return True; 
+}
+
+void
+monitor_power_on (saver_info *si)
+{
+  return; 
+}
+
+#endif /* !HAVE_DPMS_EXTENSION */
diff --git a/hacks/.gdbinit b/hacks/.gdbinit
new file mode 100644 (file)
index 0000000..78a7236
--- /dev/null
@@ -0,0 +1,4 @@
+set args -geom =600x480+0+0 -sync
+b screenhack_ehandler
+b exit
+b abort
diff --git a/hacks/Makefile.in b/hacks/Makefile.in
new file mode 100644 (file)
index 0000000..b97bf27
--- /dev/null
@@ -0,0 +1,1679 @@
+# hacks/Makefile.in --- xscreensaver, Copyright (c) 1997 Jamie Zawinski.
+# the `../configure' script generates `hacks/Makefile' from this file.
+
+@SET_MAKE@
+.SUFFIXES:
+.SUFFIXES: .c .o
+
+srcdir         = @srcdir@
+VPATH          = @srcdir@
+
+install_prefix =
+prefix         = @prefix@
+exec_prefix    = @exec_prefix@
+bindir         = @bindir@
+mandir         = @mandir@
+man1dir                = $(mandir)/man1
+mansuffix      = 1
+
+CC             = @CC@
+CFLAGS         = @CFLAGS@
+LDFLAGS                = @LDFLAGS@
+DEFS           = -DSTANDALONE @DEFS@
+LIBS           = @LIBS@
+PERL           = @PERL@
+
+DEPEND         = @DEPEND@
+DEPEND_FLAGS   = @DEPEND_FLAGS@
+DEPEND_DEFINES = @DEPEND_DEFINES@
+
+SHELL          = /bin/sh
+INSTALL                = @INSTALL@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_DATA   = @INSTALL_DATA@
+INSTALL_DIRS   = @INSTALL_DIRS@
+HACKDIR                = @HACKDIR@
+
+X_CFLAGS       = @X_CFLAGS@
+X_LIBS         = @X_LIBS@
+X_PRE_LIBS     = @X_PRE_LIBS@
+X_EXTRA_LIBS   = @X_EXTRA_LIBS@
+
+# Note: see comment in ../driver/Makefile.in for explanation of X_LIBS, etc.
+#
+HACK_PRE       = $(LIBS) $(X_LIBS)
+HACK_POST      = $(X_PRE_LIBS) -lXt -lX11 -lXext $(X_EXTRA_LIBS) -lm
+HACK_LIBS      = $(HACK_PRE)            @HACK_LIBS@ $(HACK_POST)
+XPM_LIBS       = $(HACK_PRE) @XPM_LIBS@ @HACK_LIBS@ $(HACK_POST)
+XLOCK_LIBS     = $(HACK_LIBS)
+SGI_VIDEO_OBJS  = @SGI_VIDEO_OBJS@
+SGI_VIDEO_LIBS  = @SGI_VIDEO_LIBS@
+
+UTILS_SRC      = $(srcdir)/../utils
+UTILS_BIN      = ../utils
+
+INCLUDES       = -I$(srcdir) -I$(UTILS_SRC) -I.. @INCLUDES@
+
+UTIL_SRCS      = $(UTILS_SRC)/alpha.c $(UTILS_SRC)/colors.c \
+                 $(UTILS_SRC)/grabscreen.c $(UTILS_SRC)/hsv.c \
+                 $(UTILS_SRC)/resources.c $(UTILS_SRC)/spline.c \
+                 $(UTILS_SRC)/usleep.c $(UTILS_SRC)/visual.c \
+                 $(UTILS_SRC)/xroger.c $(UTILS_SRC)/yarandom.c \
+                 $(UTILS_SRC)/erase.c $(UTILS_SRC)/sgivideo.c \
+                 $(UTILS_SRC)/xshm.c $(UTILS_SRC)/xdbe.c
+UTIL_OBJS      = $(UTILS_BIN)/alpha.o $(UTILS_BIN)/colors.o \
+                 $(UTILS_BIN)/grabscreen.o $(UTILS_BIN)/hsv.o \
+                 $(UTILS_BIN)/resources.o $(UTILS_BIN)/spline.o \
+                 $(UTILS_BIN)/usleep.o $(UTILS_BIN)/visual.o \
+                 $(UTILS_BIN)/xroger.o $(UTILS_BIN)/yarandom.o \
+                 $(UTILS_BIN)/erase.o $(UTILS_BIN)/sgivideo.o \
+                 $(UTILS_SRC)/xshm.o $(UTILS_SRC)/xdbe.o
+
+SRCS           = attraction.c blitspin.c bouboule.c braid.c bubbles.c \
+                 bubbles-default.c decayscreen.c deco.c drift.c flag.c \
+                 flame.c forest.c vines.c galaxy.c grav.c greynetic.c \
+                 halo.c helix.c hopalong.c hypercube.c ifs.c imsmap.c \
+                 julia.c kaleidescope.c laser.c lightning.c lisa.c lmorph.c \
+                 maze.c moire.c noseguy.c pedal.c penrose.c pyro.c qix.c \
+                 rocks.c rorschach.c screenhack.c sierpinski.c slidescreen.c \
+                 slip.c sphere.c spiral.c strange.c swirl.c xlockmore.c \
+                 xroger-hack.c goop.c starfish.c munch.c fadeplot.c \
+                 rd-bomb.c coral.c mountain.c triangle.c lissie.c worm.c \
+                 rotor.c ant.c xjack.c xlyap.c jigsaw.c xscreensaver-sgigl.c \
+                 cynosure.c moire2.c flow.c epicycle.c interference.c \
+                 truchet.c bsod.c crystal.c discrete.c distort.c kumppa.c \
+                 sonar.c demon.c loop.c t3d.c penetrate.c deluxe.c compass.c \
+                 squiral.c xflame.c wander.c spotlight.c critical.c \
+                 phosphor.c xmatrix.c petri.c shadebobs.c
+SCRIPTS                = vidwhacker webcollage
+
+OBJS           = attraction.o blitspin.o bouboule.o braid.o bubbles.o \
+                 bubbles-default.o decayscreen.o deco.o drift.o flag.o \
+                 flame.o forest.o vines.o galaxy.o grav.o greynetic.o \
+                 halo.o helix.o hopalong.o hypercube.o ifs.o imsmap.o \
+                 julia.o kaleidescope.o laser.o lightning.o lisa.o lmorph.o \
+                 maze.o moire.o noseguy.o pedal.o penrose.o pyro.o qix.o \
+                 rocks.o rorschach.o screenhack.o sierpinski.o slidescreen.o \
+                 slip.o sphere.o spiral.o strange.o swirl.o xlockmore.o \
+                 xroger-hack.o goop.o starfish.o munch.o fadeplot.o \
+                 rd-bomb.o coral.o mountain.o triangle.o lissie.o worm.o \
+                 rotor.o ant.o xjack.o xlyap.o jigsaw.o xscreensaver-sgigl.o \
+                 cynosure.o moire2.o flow.o epicycle.o interference.o \
+                 truchet.o bsod.o crystal.o discrete.o distort.o kumppa.o \
+                 sonar.o demon.o loop.o t3d.o penetrate.o deluxe.o compass.o \
+                 squiral.o xflame.o wander.o spotlight.o critical.o \
+                 phosphor.o xmatrix.o petri.o shadebobs.o
+
+EXES           = attraction blitspin bouboule braid bubbles decayscreen deco \
+                 drift flag flame forest vines galaxy grav greynetic halo \
+                 helix hopalong hypercube ifs imsmap julia kaleidescope \
+                 laser lightning lisa lmorph maze moire noseguy pedal \
+                 penrose pyro qix rocks rorschach sierpinski slidescreen \
+                 slip sphere spiral strange swirl xroger goop starfish munch \
+                 fadeplot rd-bomb coral mountain triangle lissie worm rotor \
+                 ant xjack xlyap jigsaw cynosure moire2 flow epicycle \
+                 interference truchet bsod crystal discrete distort kumppa \
+                 sonar demon loop t3d penetrate deluxe compass squiral \
+                 xflame wander spotlight critical phosphor xmatrix petri \
+                 shadebobs
+
+HACK_OBJS_1    = $(UTILS_BIN)/resources.o $(UTILS_BIN)/visual.o \
+                 $(UTILS_BIN)/usleep.o $(UTILS_BIN)/yarandom.o @XMU_OBJS@
+HACK_OBJS      = screenhack.o $(HACK_OBJS_1)
+XLOCK_OBJS     = screenhack-xlock.o xlockmore.o $(COLOR_OBJS) $(HACK_OBJS_1)
+COLOR_OBJS     = $(UTILS_BIN)/hsv.o $(UTILS_BIN)/colors.o
+GRAB_OBJS_1    = $(UTILS_BIN)/grabscreen.o $(SGI_VIDEO_OBJS)
+GRAB_OBJS      = $(GRAB_OBJS_1) $(COLOR_OBJS)
+XSHM_OBJS      = $(UTILS_BIN)/xshm.o
+XDBE_OBJS      = $(UTILS_BIN)/xdbe.o
+GRAB_LIBS      = $(SGI_VIDEO_LIBS)
+
+HDRS           = bubbles.h screenhack.h xlockmore.h xlockmoreI.h automata.h
+MEN            = attraction.man blitspin.man bouboule.man braid.man \
+                 bubbles.man decayscreen.man deco.man drift.man flag.man \
+                 flame.man forest.man vines.man galaxy.man grav.man \
+                 greynetic.man halo.man helix.man hopalong.man hypercube.man \
+                 ifs.man imsmap.man julia.man kaleidescope.man laser.man \
+                 lightning.man lisa.man lmorph.man maze.man moire.man \
+                 noseguy.man pedal.man penrose.man pyro.man qix.man \
+                 rocks.man rorschach.man sierpinski.man slidescreen.man \
+                 slip.man sphere.man spiral.man strange.man swirl.man \
+                 xroger.man goop.man starfish.man munch.man rd-bomb.man \
+                 xjack.man xlyap.man jigsaw.man epicycle.man bsod.man \
+                 sonar.man t3d.man squiral.man spotlight.man critical.man \
+                 vidwhacker.man webcollage.man
+STAR           = *
+EXTRAS         = README Makefile.in xlock_23.h .gdbinit \
+                 images/$(STAR).xbm \
+                 images/$(STAR).xpm \
+                 images/bubbles/$(STAR).pov \
+                 images/bubbles/$(STAR).xpm \
+                 images/noseguy/$(STAR).xbm \
+                 images/noseguy/$(STAR).xpm \
+                 images/jigsaw/$(STAR).xbm  \
+
+VMSFILES       = compile_axp.com compile_decc.com link_axp.com link_decc.com \
+                 vms_axp.opt vms_axp_12.opt vms_decc.opt vms_decc_12.opt
+
+TARFILES       = $(SRCS) $(HDRS) $(SCRIPTS) $(MEN) $(EXTRAS) $(VMSFILES)
+
+
+default: all
+all: $(EXES)
+
+install:   install-program   install-scripts install-man
+uninstall: uninstall-program uninstall-man
+
+install-strip:
+       $(MAKE) INSTALL_PROGRAM='$(INSTALL_PROGRAM) -s' install
+
+install-program: $(EXES)
+       @if [ ! -d $(HACKDIR) ]; then $(INSTALL_DIRS) $(HACKDIR) ; fi ; \
+       for program in $(EXES); do                                      \
+         echo $(INSTALL_PROGRAM) $$program $(HACKDIR)/$$program ;      \
+         $(INSTALL_PROGRAM) $$program $(HACKDIR)/$$program ;           \
+       done
+
+install-scripts: $(SCRIPTS) munge-scripts
+       @for program in $(SCRIPTS); do                                  \
+         if [ -r $$program ] ; then                                    \
+           p=$$program ;                                               \
+         else                                                          \
+           p=$(srcdir)/$$program ;                                     \
+         fi ;                                                          \
+         echo $(INSTALL_PROGRAM) $$p $(HACKDIR)/$$program ;            \
+         $(INSTALL_PROGRAM) $$p $(HACKDIR)/$$program ;                 \
+       done
+
+munge-scripts: $(SCRIPTS)
+       @tmp=/tmp/mf.$$$$ ;                                             \
+       perl="${PERL}" ;                                                \
+       for program in $(SCRIPTS); do                                   \
+         echo "adjusting location of perl in $$program..." ;           \
+         sed "s@^\(#!\)\(/[^ ]*/perl[^ ]*\)\(.*\)\$$@\1$$perl\3@"      \
+             < $(srcdir)/$$program > $$tmp ;                           \
+         if cmp -s $(srcdir)/$$program $$tmp ; then                    \
+           true ;                                                      \
+         else                                                          \
+           cat $$tmp > ./$$program ;                                   \
+         fi ;                                                          \
+       done
+
+install-man: $(MEN)
+       @men="$(MEN)" ;                                                 \
+       if [ ! -d $(man1dir) ]; then $(INSTALL_DIRS) $(man1dir) ; fi ;  \
+       for man in $$men; do                                            \
+         instname=`echo $$man | sed 's/\.man$$/\.$(mansuffix)/'` ;     \
+         echo $(INSTALL_DATA) $(srcdir)/$$man $(man1dir)/$$instname ;  \
+         $(INSTALL_DATA) $(srcdir)/$$man $(man1dir)/$$instname ;       \
+       done
+
+uninstall-program:
+       @for program in $(EXES) $(SCRIPTS); do                          \
+         echo rm -f $(HACKDIR)/$$program ;                             \
+         rm -f $(HACKDIR)/$$program ;                                  \
+       done
+
+uninstall-man:
+       @men="$(MEN)" ;                                                 \
+       for man in $$men; do                                            \
+         instname=`echo $$man | sed 's/\.man$$/\.$(mansuffix)/'` ;     \
+         echo rm -f $(man1dir)/$$instname ;                            \
+         rm -f $(man1dir)/$$instname ;                                 \
+       done
+
+clean:
+       -rm -f *.o a.out core $(EXES)
+
+distclean: clean
+       -rm -f Makefile TAGS *~ "#"*
+
+# Adds all current dependencies to Makefile
+depend:
+       $(DEPEND) -s '# DO NOT DELETE: updated by make depend'              \
+       $(DEPEND_FLAGS) --                                                  \
+       $(INCLUDES) $(DEFS) $(DEPEND_DEFINES) $(CFLAGS) $(X_CFLAGS) --      \
+       $(SRCS)
+
+# Adds some dependencies to Makefile.in -- not totally accurate, but pretty
+# close.  This excludes dependencies on files in /usr/include, etc.  It tries
+# to include only dependencies on files which are themselves a part of this
+# package.
+distdepend::
+       @echo updating dependencies in `pwd`/Makefile.in... ;               \
+       $(DEPEND) -w 0 -f -                                                 \
+       -s '# DO NOT DELETE: updated by make distdepend' $(DEPEND_FLAGS) -- \
+       $(INCLUDES) $(DEFS) $(DEPEND_DEFINES) $(CFLAGS) $(X_CFLAGS) --      \
+       $(SRCS) |                                                           \
+       (                                                                   \
+         awk '/^# .*Makefile.in ---/,/^# DO .*distdepend/' < Makefile.in ; \
+         sed -e 's@ \./@ @g;s@ /[^ ]*@@g;/^.*:$$/d'                        \
+             -e 's@\.\./utils@$$(UTILS_SRC)@g'                             \
+             -e 's@ \([^$$]\)@ $$(srcdir)/\1@g'                            \
+             -e 's@ $$(srcdir)/\(.*config.h\)@ \1@g' ;                     \
+         echo ''                                                           \
+       ) > /tmp/distdepend.$$$$ &&                                         \
+       mv Makefile.in Makefile.in.bak &&                                   \
+       mv /tmp/distdepend.$$$$ Makefile.in
+
+TAGS: tags
+tags:
+       find $(srcdir) -name '*.[chly]' -print | xargs etags -a
+
+echo_tarfiles:
+       @echo $(TARFILES)
+
+
+# Rules for generating the VMS makefiles on Unix, so that it doesn't have to
+# be done by hand...
+#
+VMS_AXP_COMPILE_1=$$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE
+VMS_AXP_COMPILE_2=)/INCL=([],[-],[-.UTILS])
+
+compile_axp.com: Makefile.in
+       @echo generating $@ from $<...  ;                                   \
+       ( for c in $(SRCS) ; do                                             \
+          c=`echo $$c | tr a-z A-Z` ;                                      \
+          echo "$(VMS_AXP_COMPILE_1)$(VMS_AXP_COMPILE_2) $$c" ;            \
+         done ;                                                                    \
+        foo="$(VMS_AXP_COMPILE_1),XLOCKMORE$(VMS_AXP_COMPILE_2)" ;         \
+         echo $${foo}/OBJ=SCREENHACK-XLOCK.OBJ SCREENHACK.C ;              \
+       ) | sort > $@
+
+compile_decc.com: compile_axp.com
+       @echo generating $@ from $<...  ;                                   \
+       sed 's/axp/decc/g' < $< > $@
+
+#### TODO: generating link_axp.com is kinda tricky...
+
+link_decc.com: link_axp.com
+       @echo generating $@ from $<...  ;                                   \
+       sed 's/axp/decc/g' < $< > $@
+
+$(srcdir)/../setup.com: Makefile.in
+       @echo generating $@ from $<...  ;                                   \
+       ( echo '$$! Xscreensaver - definition of various DCL symbols' ;     \
+         echo '$$ set NOON' ;                                              \
+         echo '$$ set def [.HACKS]' ;                                      \
+         echo '$$ mydisk = f$$trnlmn("SYS$$DISK")' ;                       \
+         echo '$$ mydir  = mydisk+f$$directory()' ;                        \
+         ( for c in $(EXES) ; do                                           \
+            c2="$${c}          " ;                                         \
+            c2=`echo "$${c2}" | sed 's/^\(........*\)  $$/\1/'` ;          \
+            echo '$$' "$${c2}:== $$'mydir'$${c}" ;                         \
+             done ;                                                        \
+         ) | sort ;                                                        \
+          echo '$$ set def [-.DRIVER]' ;                                   \
+          echo '$$ mydir  = mydisk+f$$directory()' ;                       \
+          echo "$$ xscreensaver :== $$'mydir'xscreensaver" ;               \
+         echo "$$ xscreen*command :== $$'mydir'xscreensaver-command" ;     \
+         echo '$$ set def [-]' ;                                           \
+         echo '$$ exit' ;                                                  \
+          ) > $@
+
+distdepend:: compile_axp.com compile_decc.com
+distdepend:: link_axp.com link_decc.com
+distdepend:: $(srcdir)/../setup.com
+
+
+# Rules for noticing when the objects from the utils directory are out of
+# date with respect to their sources, and going and building them according
+# to the rules in their own Makefile...
+#
+$(UTILS_BIN)/alpha.o:          $(UTILS_SRC)/alpha.c
+$(UTILS_BIN)/colors.o:         $(UTILS_SRC)/colors.c
+$(UTILS_BIN)/grabscreen.o:     $(UTILS_SRC)/grabscreen.c
+$(UTILS_BIN)/sgivideo.o:       $(UTILS_SRC)/sgivideo.c
+$(UTILS_BIN)/hsv.o:            $(UTILS_SRC)/hsv.c
+$(UTILS_BIN)/resources.o:      $(UTILS_SRC)/resources.c
+$(UTILS_BIN)/spline.o:         $(UTILS_SRC)/spline.c
+$(UTILS_BIN)/usleep.o:         $(UTILS_SRC)/usleep.c
+$(UTILS_BIN)/visual.o:         $(UTILS_SRC)/visual.c
+$(UTILS_BIN)/xmu.o:            $(UTILS_SRC)/xmu.c
+$(UTILS_BIN)/xroger.o:         $(UTILS_SRC)/xroger.c
+$(UTILS_BIN)/yarandom.o:       $(UTILS_SRC)/yarandom.c
+$(UTILS_BIN)/erase.o:          $(UTILS_SRC)/erase.c
+$(UTILS_BIN)/xshm.o:           $(UTILS_SRC)/xshm.c
+$(UTILS_BIN)/xdbe.o:           $(UTILS_SRC)/xdbe.c
+
+$(UTIL_OBJS):
+       cd $(UTILS_BIN) ; \
+       $(MAKE) $(@F) CC="$(CC)" CFLAGS="$(CFLAGS)" LDFLAGS="$(LDFLAGS)"
+
+# How we build object files in this directory.
+.c.o:
+       $(CC) -c $(INCLUDES) $(DEFS) $(CFLAGS) $(X_CFLAGS) $<
+
+# Some hacks use a slightly-differently-compiled variant of this file.
+# This is how to make the the other .o file from it.
+#
+screenhack-xlock.o: screenhack.c
+       $(CC) -o $@ -c $(INCLUDES) $(DEFS) $(CFLAGS) $(X_CFLAGS) \
+       -DXLOCKMORE $(srcdir)/screenhack.c
+
+# Some abbreviations to keep the lines short...
+ALP            = $(UTILS_BIN)/alpha.o
+HSV            = $(UTILS_BIN)/hsv.o
+SPL            = $(UTILS_BIN)/spline.o
+XROG           = $(UTILS_BIN)/xroger.o $(SPL)
+GRAB           = $(GRAB_OBJS)
+ERASE          = $(UTILS_BIN)/erase.o
+COL            = $(COLOR_OBJS)
+SHM            = $(XSHM_OBJS)
+DBE            = $(XDBE_OBJS)
+
+CC_HACK                = $(CC) $(LDFLAGS)
+
+xscreensaver-sgigl: xscreensaver-sgigl.c
+       $(CC) $(LDFLAGS) -o $@ $< -I$(UTILS_SRC) $(HACK_PRE) \
+               -lXmu -lX11 -lXext $(X_EXTRA_LIBS) -lm
+
+
+# The rules for those hacks which follow the `screenhack.c' API.
+# If make wasn't such an utter abomination, these could all be combined
+# into one rule, but we don't live in such a perfect world.  The $< rule
+# is pretty much useless in the face of more than one dependency, as far
+# as I can tell.
+#
+attraction:    attraction.o    $(HACK_OBJS) $(COL) $(SPL)
+       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(COL) $(SPL) $(HACK_LIBS)
+
+blitspin:      blitspin.o      $(HACK_OBJS) $(GRAB)
+       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(GRAB) $(XPM_LIBS) $(GRAB_LIBS)
+
+bubbles:       bubbles.o       $(HACK_OBJS) bubbles-default.o 
+       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) bubbles-default.o $(XPM_LIBS)
+
+decayscreen:   decayscreen.o   $(HACK_OBJS) $(GRAB)
+       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(GRAB) $(HACK_LIBS) $(GRAB_LIBS)
+
+deco:          deco.o          $(HACK_OBJS) $(COL)
+       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(COL) $(HACK_LIBS)
+
+flame:         flame.o         $(HACK_OBJS) $(COL)
+       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(COL) $(HACK_LIBS)
+
+greynetic:     greynetic.o     $(HACK_OBJS)
+       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(HACK_LIBS)
+
+halo:          halo.o          $(HACK_OBJS) $(COL)
+       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(COL) $(HACK_LIBS)
+
+helix:         helix.o         $(HACK_OBJS) $(HSV) $(ERASE)
+       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(HSV) $(ERASE) $(HACK_LIBS)
+
+hypercube:     hypercube.o     $(HACK_OBJS)
+       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(HACK_LIBS)
+
+imsmap:                imsmap.o        $(HACK_OBJS) $(COL)
+       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(COL) $(HACK_LIBS)
+
+kaleidescope:  kaleidescope.o  $(HACK_OBJS)
+       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(HACK_LIBS)
+
+lmorph:                lmorph.o        $(HACK_OBJS)
+       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(HACK_LIBS)
+
+maze:          maze.o          $(HACK_OBJS) $(ERASE) $(XROG)
+       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(ERASE) $(XROG) $(HACK_LIBS)
+
+moire:         moire.o         $(HACK_OBJS) $(COL) $(SHM)
+       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(COL) $(SHM) $(HACK_LIBS)
+
+moire2:                moire2.o        $(HACK_OBJS) $(COL) $(DBE)
+       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(COL) $(DBE) $(HACK_LIBS)
+
+noseguy:       noseguy.o       $(HACK_OBJS)
+       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(XPM_LIBS)
+
+pedal:         pedal.o         $(HACK_OBJS) $(HSV)
+       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(HSV) $(HACK_LIBS)
+
+pyro:          pyro.o          $(HACK_OBJS) $(HSV)
+       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(HSV) $(HACK_LIBS)
+
+qix:           qix.o           $(HACK_OBJS) $(HSV) $(ALP)
+       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(HSV) $(ALP) $(HACK_LIBS)
+
+rocks:         rocks.o         $(HACK_OBJS) $(COL)
+       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(COL) $(HACK_LIBS)
+
+rorschach:     rorschach.o     $(HACK_OBJS) $(HSV) $(ERASE)
+       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(HSV) $(ERASE) $(HACK_LIBS)
+
+slidescreen:   slidescreen.o   $(HACK_OBJS) $(GRAB)
+       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(GRAB) $(HACK_LIBS) $(GRAB_LIBS)
+
+xroger:                xroger-hack.o   $(HACK_OBJS) $(HSV) $(XROG)
+       $(CC_HACK) -o $@ xroger-hack.o  $(HACK_OBJS) $(HSV) $(XROG) $(HACK_LIBS)
+
+goop:          goop.o          $(HACK_OBJS) $(HSV) $(ALP) $(SPL)
+       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(HSV) $(ALP) $(SPL) $(HACK_LIBS)
+
+starfish:      starfish.o      $(HACK_OBJS) $(COL) $(SPL)
+       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(COL) $(SPL) $(HACK_LIBS)
+
+munch:         munch.o         $(HACK_OBJS) $(COL) $(SPL)
+       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(COL) $(SPL) $(HACK_LIBS)
+
+rd-bomb:       rd-bomb.o       $(HACK_OBJS) $(COL) $(SHM)
+       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(COL) $(SHM) $(HACK_LIBS)
+
+coral:         coral.o         $(HACK_OBJS) $(COL) $(ERASE)
+       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(COL) $(ERASE) $(HACK_LIBS)
+
+xjack:         xjack.o         $(HACK_OBJS)
+       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(HACK_LIBS)
+
+xlyap:         xlyap.o         $(HACK_OBJS) $(COL)
+       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(COL) $(HACK_LIBS)
+
+jigsaw:                jigsaw.o        $(HACK_OBJS) $(GRAB)
+       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(GRAB) $(HACK_LIBS) $(GRAB_LIBS)
+
+cynosure:      cynosure.o      $(HACK_OBJS) $(COL)
+       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(COL) $(HACK_LIBS)
+
+epicycle:      epicycle.o      $(HACK_OBJS) $(COL) $(ERASE)
+       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(COL) $(ERASE) $(HACK_LIBS)
+
+interference:  interference.o  $(HACK_OBJS) $(COL) $(SHM) $(DBE)
+       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(COL) $(SHM) $(DBE) $(HACK_LIBS)
+
+truchet:        truchet.o      $(HACK_OBJS) $(COL)
+       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(COL) $(HACK_LIBS)
+
+bsod:          bsod.o          $(HACK_OBJS) $(COL)
+       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(COL) $(HACK_LIBS) $(XPM_LIBS)
+
+distort:       distort.o       $(HACK_OBJS) $(GRAB) $(SHM)
+       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(GRAB) $(SHM) $(HACK_LIBS) $(GRAB_LIBS)
+
+kumppa:                kumppa.o        $(HACK_OBJS) $(DBE)
+       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(DBE) $(HACK_LIBS)
+
+sonar:         sonar.o         $(HACK_OBJS) $(COL)
+       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(COL) $(HACK_LIBS)
+
+t3d:           t3d.o           $(HACK_OBJS) $(COL)
+       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(COL) $(HACK_LIBS)
+
+penetrate:     penetrate.o     $(HACK_OBJS) $(COL)
+       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(COL) $(HACK_LIBS)
+
+deluxe:                deluxe.o        $(HACK_OBJS) $(ALP) $(COL) $(DBE)
+       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(ALP) $(COL) $(DBE) $(HACK_LIBS)
+
+compass:       compass.o       $(HACK_OBJS) $(DBE)
+       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(DBE) $(HACK_LIBS)
+
+squiral:       squiral.o       $(HACK_OBJS) $(COL)
+       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(COL) $(HACK_LIBS)
+
+xflame:                xflame.o        $(HACK_OBJS) $(SHM)
+       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(SHM) $(HACK_LIBS) $(XPM_LIBS)
+
+wander:                wander.o        $(HACK_OBJS) $(COL) $(ERASE)
+       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(COL) $(ERASE) $(HACK_LIBS)
+
+spotlight:     spotlight.o     $(HACK_OBJS) $(GRAB)
+       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(GRAB) $(HACK_LIBS) $(GRAB_LIBS)
+
+critical:      critical.o      $(HACK_OBJS) $(COL) $(ERASE)
+       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(COL) $(ERASE) $(HACK_LIBS)
+
+phosphor:      phosphor.o      $(HACK_OBJS) $(COL)
+       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(COL) $(HACK_LIBS)
+
+xmatrix:       xmatrix.o       $(HACK_OBJS)
+       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(HACK_LIBS) $(XPM_LIBS)
+
+petri:         petri.o         $(HACK_OBJS) $(COL) $(SPL)
+       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(COL) $(SPL) $(HACK_LIBS)
+
+shadebobs:     shadebobs.o     $(HACK_OBJS) $(COL) $(SPL)
+       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(COL) $(SPL) $(HACK_LIBS)
+
+
+# The rules for those hacks which follow the `xlockmore' API.
+#
+
+bouboule:      bouboule.o      $(XLOCK_OBJS)
+       $(CC_HACK) -o $@ $@.o   $(XLOCK_OBJS) $(HACK_LIBS)
+
+braid:         braid.o         $(XLOCK_OBJS) $(ERASE)
+       $(CC_HACK) -o $@ $@.o   $(XLOCK_OBJS) $(ERASE) $(HACK_LIBS)
+
+drift:         drift.o         $(XLOCK_OBJS) $(ERASE)
+       $(CC_HACK) -o $@ $@.o   $(XLOCK_OBJS) $(ERASE) $(HACK_LIBS)
+
+flag:          flag.o          $(XLOCK_OBJS)
+       $(CC_HACK) -o $@ $@.o   $(XLOCK_OBJS) $(XPM_LIBS)
+
+forest:                forest.o        $(XLOCK_OBJS) $(ERASE)
+       $(CC_HACK) -o $@ $@.o   $(XLOCK_OBJS) $(ERASE) $(HACK_LIBS)
+
+vines:         vines.o         $(XLOCK_OBJS) $(ERASE)
+       $(CC_HACK) -o $@ $@.o   $(XLOCK_OBJS) $(ERASE) $(HACK_LIBS)
+
+galaxy:                galaxy.o        $(XLOCK_OBJS)
+       $(CC_HACK) -o $@ $@.o   $(XLOCK_OBJS) $(HACK_LIBS)
+
+grav:          grav.o          $(XLOCK_OBJS)
+       $(CC_HACK) -o $@ $@.o   $(XLOCK_OBJS) $(HACK_LIBS)
+
+hopalong:      hopalong.o      $(XLOCK_OBJS) $(ERASE)
+       $(CC_HACK) -o $@ $@.o   $(XLOCK_OBJS) $(ERASE) $(HACK_LIBS)
+
+ifs:           ifs.o           $(XLOCK_OBJS)
+       $(CC_HACK) -o $@ $@.o   $(XLOCK_OBJS) $(HACK_LIBS)
+
+julia:         julia.o         $(XLOCK_OBJS)
+       $(CC_HACK) -o $@ $@.o   $(XLOCK_OBJS) $(HACK_LIBS)
+
+laser:         laser.o         $(XLOCK_OBJS)
+       $(CC_HACK) -o $@ $@.o   $(XLOCK_OBJS) $(HACK_LIBS)
+
+lightning:     lightning.o     $(XLOCK_OBJS)
+       $(CC_HACK) -o $@ $@.o   $(XLOCK_OBJS) $(HACK_LIBS)
+
+lisa:          lisa.o          $(XLOCK_OBJS)
+       $(CC_HACK) -o $@ $@.o   $(XLOCK_OBJS) $(HACK_LIBS)
+
+lissie:                lissie.o        $(XLOCK_OBJS)
+       $(CC_HACK) -o $@ $@.o   $(XLOCK_OBJS) $(HACK_LIBS)
+
+penrose:       penrose.o       $(XLOCK_OBJS)
+       $(CC_HACK) -o $@ $@.o   $(XLOCK_OBJS) $(HACK_LIBS)
+
+sierpinski:    sierpinski.o    $(XLOCK_OBJS)
+       $(CC_HACK) -o $@ $@.o   $(XLOCK_OBJS) $(HACK_LIBS)
+
+slip:          slip.o          $(XLOCK_OBJS) $(GRAB)
+       $(CC_HACK) -o $@ $@.o   $(XLOCK_OBJS) $(GRAB_OBJS_1) $(HACK_LIBS) $(GRAB_LIBS)
+
+sphere:                sphere.o        $(XLOCK_OBJS)
+       $(CC_HACK) -o $@ $@.o   $(XLOCK_OBJS) $(HACK_LIBS)
+
+spiral:                spiral.o        $(XLOCK_OBJS)
+       $(CC_HACK) -o $@ $@.o   $(XLOCK_OBJS) $(HACK_LIBS)
+
+strange:       strange.o       $(XLOCK_OBJS)
+       $(CC_HACK) -o $@ $@.o   $(XLOCK_OBJS) $(HACK_LIBS)
+
+swirl:         swirl.o         $(XLOCK_OBJS) $(SHM)
+       $(CC_HACK) -o $@ $@.o   $(XLOCK_OBJS) $(SHM) $(HACK_LIBS)
+
+fadeplot:      fadeplot.o      $(XLOCK_OBJS)
+       $(CC_HACK) -o $@ $@.o   $(XLOCK_OBJS) $(HACK_LIBS)
+
+mountain:      mountain.o      $(XLOCK_OBJS)
+       $(CC_HACK) -o $@ $@.o   $(XLOCK_OBJS) $(HACK_LIBS)
+
+triangle:      triangle.o      $(XLOCK_OBJS)
+       $(CC_HACK) -o $@ $@.o   $(XLOCK_OBJS) $(HACK_LIBS)
+
+worm:          worm.o          $(XLOCK_OBJS)
+       $(CC_HACK) -o $@ $@.o   $(XLOCK_OBJS) $(HACK_LIBS)
+
+rotor:         rotor.o         $(XLOCK_OBJS)
+       $(CC_HACK) -o $@ $@.o   $(XLOCK_OBJS) $(HACK_LIBS)
+
+ant:           ant.o           $(XLOCK_OBJS) $(ERASE)
+       $(CC_HACK) -o $@ $@.o   $(XLOCK_OBJS) $(ERASE) $(HACK_LIBS)
+
+demon:         demon.o         $(XLOCK_OBJS)
+       $(CC_HACK) -o $@ $@.o   $(XLOCK_OBJS) $(HACK_LIBS)
+
+loop:          loop.o          $(XLOCK_OBJS)
+       $(CC_HACK) -o $@ $@.o   $(XLOCK_OBJS) $(HACK_LIBS)
+
+flow:          flow.o          $(XLOCK_OBJS)
+       $(CC_HACK) -o $@ $@.o   $(XLOCK_OBJS) $(HACK_LIBS)
+
+discrete:      discrete.o              $(XLOCK_OBJS) $(ERASE)
+       $(CC_HACK) -o $@ $@.o   $(XLOCK_OBJS) $(ERASE) $(HACK_LIBS)
+
+crystal:       crystal.o               $(XLOCK_OBJS)
+       $(CC_HACK) -o $@ $@.o   $(XLOCK_OBJS) $(HACK_LIBS)
+
+
+##############################################################################
+#
+# DO NOT DELETE: updated by make distdepend
+# $(srcdir)/DO $(srcdir)/NOT $(srcdir)/DELETE: $(srcdir)/updated $(srcdir)/by $(srcdir)/make $(srcdir)/distdepend
+
+attraction.o: $(srcdir)/screenhack.h
+attraction.o: ../config.h
+attraction.o: $(UTILS_SRC)/yarandom.h
+attraction.o: $(UTILS_SRC)/usleep.h
+attraction.o: $(UTILS_SRC)/resources.h
+attraction.o: $(UTILS_SRC)/hsv.h
+attraction.o: $(UTILS_SRC)/colors.h
+attraction.o: $(UTILS_SRC)/grabscreen.h
+attraction.o: $(UTILS_SRC)/visual.h
+attraction.o: $(UTILS_SRC)/spline.h
+blitspin.o: $(srcdir)/screenhack.h
+blitspin.o: ../config.h
+blitspin.o: $(UTILS_SRC)/yarandom.h
+blitspin.o: $(UTILS_SRC)/usleep.h
+blitspin.o: $(UTILS_SRC)/resources.h
+blitspin.o: $(UTILS_SRC)/hsv.h
+blitspin.o: $(UTILS_SRC)/colors.h
+blitspin.o: $(UTILS_SRC)/grabscreen.h
+blitspin.o: $(UTILS_SRC)/visual.h
+blitspin.o: $(srcdir)/images/som.xbm
+bouboule.o: $(srcdir)/xlockmore.h
+bouboule.o: ../config.h
+bouboule.o: $(srcdir)/xlockmoreI.h
+bouboule.o: $(srcdir)/screenhack.h
+bouboule.o: $(UTILS_SRC)/yarandom.h
+bouboule.o: $(UTILS_SRC)/usleep.h
+bouboule.o: $(UTILS_SRC)/resources.h
+bouboule.o: $(UTILS_SRC)/hsv.h
+bouboule.o: $(UTILS_SRC)/colors.h
+bouboule.o: $(UTILS_SRC)/grabscreen.h
+bouboule.o: $(UTILS_SRC)/visual.h
+bouboule.o: $(UTILS_SRC)/xshm.h
+braid.o: $(srcdir)/xlockmore.h
+braid.o: ../config.h
+braid.o: $(srcdir)/xlockmoreI.h
+braid.o: $(srcdir)/screenhack.h
+braid.o: $(UTILS_SRC)/yarandom.h
+braid.o: $(UTILS_SRC)/usleep.h
+braid.o: $(UTILS_SRC)/resources.h
+braid.o: $(UTILS_SRC)/hsv.h
+braid.o: $(UTILS_SRC)/colors.h
+braid.o: $(UTILS_SRC)/grabscreen.h
+braid.o: $(UTILS_SRC)/visual.h
+braid.o: $(UTILS_SRC)/xshm.h
+braid.o: $(UTILS_SRC)/erase.h
+bubbles.o: $(srcdir)/screenhack.h
+bubbles.o: ../config.h
+bubbles.o: $(UTILS_SRC)/yarandom.h
+bubbles.o: $(UTILS_SRC)/usleep.h
+bubbles.o: $(UTILS_SRC)/resources.h
+bubbles.o: $(UTILS_SRC)/hsv.h
+bubbles.o: $(UTILS_SRC)/colors.h
+bubbles.o: $(UTILS_SRC)/grabscreen.h
+bubbles.o: $(UTILS_SRC)/visual.h
+bubbles.o: $(srcdir)/bubbles.h
+bubbles-default.o: ../config.h
+bubbles-default.o: $(srcdir)/bubbles.h
+bubbles-default.o: $(UTILS_SRC)/yarandom.h
+bubbles-default.o: $(srcdir)/images/bubbles/blood1.xpm
+bubbles-default.o: $(srcdir)/images/bubbles/blood2.xpm
+bubbles-default.o: $(srcdir)/images/bubbles/blood3.xpm
+bubbles-default.o: $(srcdir)/images/bubbles/blood4.xpm
+bubbles-default.o: $(srcdir)/images/bubbles/blood5.xpm
+bubbles-default.o: $(srcdir)/images/bubbles/blood6.xpm
+bubbles-default.o: $(srcdir)/images/bubbles/blood7.xpm
+bubbles-default.o: $(srcdir)/images/bubbles/blood8.xpm
+bubbles-default.o: $(srcdir)/images/bubbles/blood9.xpm
+bubbles-default.o: $(srcdir)/images/bubbles/blood10.xpm
+bubbles-default.o: $(srcdir)/images/bubbles/blood11.xpm
+bubbles-default.o: $(srcdir)/images/bubbles/blue1.xpm
+bubbles-default.o: $(srcdir)/images/bubbles/blue2.xpm
+bubbles-default.o: $(srcdir)/images/bubbles/blue3.xpm
+bubbles-default.o: $(srcdir)/images/bubbles/blue4.xpm
+bubbles-default.o: $(srcdir)/images/bubbles/blue5.xpm
+bubbles-default.o: $(srcdir)/images/bubbles/blue6.xpm
+bubbles-default.o: $(srcdir)/images/bubbles/blue7.xpm
+bubbles-default.o: $(srcdir)/images/bubbles/blue8.xpm
+bubbles-default.o: $(srcdir)/images/bubbles/blue9.xpm
+bubbles-default.o: $(srcdir)/images/bubbles/blue10.xpm
+bubbles-default.o: $(srcdir)/images/bubbles/blue11.xpm
+bubbles-default.o: $(srcdir)/images/bubbles/glass1.xpm
+bubbles-default.o: $(srcdir)/images/bubbles/glass2.xpm
+bubbles-default.o: $(srcdir)/images/bubbles/glass3.xpm
+bubbles-default.o: $(srcdir)/images/bubbles/glass4.xpm
+bubbles-default.o: $(srcdir)/images/bubbles/glass5.xpm
+bubbles-default.o: $(srcdir)/images/bubbles/glass6.xpm
+bubbles-default.o: $(srcdir)/images/bubbles/glass7.xpm
+bubbles-default.o: $(srcdir)/images/bubbles/glass8.xpm
+bubbles-default.o: $(srcdir)/images/bubbles/glass9.xpm
+bubbles-default.o: $(srcdir)/images/bubbles/glass10.xpm
+bubbles-default.o: $(srcdir)/images/bubbles/glass11.xpm
+bubbles-default.o: $(srcdir)/images/bubbles/jade1.xpm
+bubbles-default.o: $(srcdir)/images/bubbles/jade2.xpm
+bubbles-default.o: $(srcdir)/images/bubbles/jade3.xpm
+bubbles-default.o: $(srcdir)/images/bubbles/jade4.xpm
+bubbles-default.o: $(srcdir)/images/bubbles/jade5.xpm
+bubbles-default.o: $(srcdir)/images/bubbles/jade6.xpm
+bubbles-default.o: $(srcdir)/images/bubbles/jade7.xpm
+bubbles-default.o: $(srcdir)/images/bubbles/jade8.xpm
+bubbles-default.o: $(srcdir)/images/bubbles/jade9.xpm
+bubbles-default.o: $(srcdir)/images/bubbles/jade10.xpm
+bubbles-default.o: $(srcdir)/images/bubbles/jade11.xpm
+decayscreen.o: $(srcdir)/screenhack.h
+decayscreen.o: ../config.h
+decayscreen.o: $(UTILS_SRC)/yarandom.h
+decayscreen.o: $(UTILS_SRC)/usleep.h
+decayscreen.o: $(UTILS_SRC)/resources.h
+decayscreen.o: $(UTILS_SRC)/hsv.h
+decayscreen.o: $(UTILS_SRC)/colors.h
+decayscreen.o: $(UTILS_SRC)/grabscreen.h
+decayscreen.o: $(UTILS_SRC)/visual.h
+deco.o: $(srcdir)/screenhack.h
+deco.o: ../config.h
+deco.o: $(UTILS_SRC)/yarandom.h
+deco.o: $(UTILS_SRC)/usleep.h
+deco.o: $(UTILS_SRC)/resources.h
+deco.o: $(UTILS_SRC)/hsv.h
+deco.o: $(UTILS_SRC)/colors.h
+deco.o: $(UTILS_SRC)/grabscreen.h
+deco.o: $(UTILS_SRC)/visual.h
+drift.o: $(srcdir)/xlockmore.h
+drift.o: ../config.h
+drift.o: $(srcdir)/xlockmoreI.h
+drift.o: $(srcdir)/screenhack.h
+drift.o: $(UTILS_SRC)/yarandom.h
+drift.o: $(UTILS_SRC)/usleep.h
+drift.o: $(UTILS_SRC)/resources.h
+drift.o: $(UTILS_SRC)/hsv.h
+drift.o: $(UTILS_SRC)/colors.h
+drift.o: $(UTILS_SRC)/grabscreen.h
+drift.o: $(UTILS_SRC)/visual.h
+drift.o: $(UTILS_SRC)/xshm.h
+drift.o: $(UTILS_SRC)/erase.h
+flag.o: $(srcdir)/xlockmore.h
+flag.o: ../config.h
+flag.o: $(srcdir)/xlockmoreI.h
+flag.o: $(srcdir)/screenhack.h
+flag.o: $(UTILS_SRC)/yarandom.h
+flag.o: $(UTILS_SRC)/usleep.h
+flag.o: $(UTILS_SRC)/resources.h
+flag.o: $(UTILS_SRC)/hsv.h
+flag.o: $(UTILS_SRC)/colors.h
+flag.o: $(UTILS_SRC)/grabscreen.h
+flag.o: $(UTILS_SRC)/visual.h
+flag.o: $(UTILS_SRC)/xshm.h
+flag.o: $(srcdir)/images/bob.xbm
+flame.o: $(srcdir)/screenhack.h
+flame.o: ../config.h
+flame.o: $(UTILS_SRC)/yarandom.h
+flame.o: $(UTILS_SRC)/usleep.h
+flame.o: $(UTILS_SRC)/resources.h
+flame.o: $(UTILS_SRC)/hsv.h
+flame.o: $(UTILS_SRC)/colors.h
+flame.o: $(UTILS_SRC)/grabscreen.h
+flame.o: $(UTILS_SRC)/visual.h
+forest.o: $(srcdir)/xlockmore.h
+forest.o: ../config.h
+forest.o: $(srcdir)/xlockmoreI.h
+forest.o: $(srcdir)/screenhack.h
+forest.o: $(UTILS_SRC)/yarandom.h
+forest.o: $(UTILS_SRC)/usleep.h
+forest.o: $(UTILS_SRC)/resources.h
+forest.o: $(UTILS_SRC)/hsv.h
+forest.o: $(UTILS_SRC)/colors.h
+forest.o: $(UTILS_SRC)/grabscreen.h
+forest.o: $(UTILS_SRC)/visual.h
+forest.o: $(UTILS_SRC)/xshm.h
+forest.o: $(UTILS_SRC)/erase.h
+vines.o: $(srcdir)/xlockmore.h
+vines.o: ../config.h
+vines.o: $(srcdir)/xlockmoreI.h
+vines.o: $(srcdir)/screenhack.h
+vines.o: $(UTILS_SRC)/yarandom.h
+vines.o: $(UTILS_SRC)/usleep.h
+vines.o: $(UTILS_SRC)/resources.h
+vines.o: $(UTILS_SRC)/hsv.h
+vines.o: $(UTILS_SRC)/colors.h
+vines.o: $(UTILS_SRC)/grabscreen.h
+vines.o: $(UTILS_SRC)/visual.h
+vines.o: $(UTILS_SRC)/xshm.h
+vines.o: $(UTILS_SRC)/erase.h
+galaxy.o: $(srcdir)/xlockmore.h
+galaxy.o: ../config.h
+galaxy.o: $(srcdir)/xlockmoreI.h
+galaxy.o: $(srcdir)/screenhack.h
+galaxy.o: $(UTILS_SRC)/yarandom.h
+galaxy.o: $(UTILS_SRC)/usleep.h
+galaxy.o: $(UTILS_SRC)/resources.h
+galaxy.o: $(UTILS_SRC)/hsv.h
+galaxy.o: $(UTILS_SRC)/colors.h
+galaxy.o: $(UTILS_SRC)/grabscreen.h
+galaxy.o: $(UTILS_SRC)/visual.h
+galaxy.o: $(UTILS_SRC)/xshm.h
+grav.o: $(srcdir)/xlockmore.h
+grav.o: ../config.h
+grav.o: $(srcdir)/xlockmoreI.h
+grav.o: $(srcdir)/screenhack.h
+grav.o: $(UTILS_SRC)/yarandom.h
+grav.o: $(UTILS_SRC)/usleep.h
+grav.o: $(UTILS_SRC)/resources.h
+grav.o: $(UTILS_SRC)/hsv.h
+grav.o: $(UTILS_SRC)/colors.h
+grav.o: $(UTILS_SRC)/grabscreen.h
+grav.o: $(UTILS_SRC)/visual.h
+grav.o: $(UTILS_SRC)/xshm.h
+greynetic.o: $(srcdir)/screenhack.h
+greynetic.o: ../config.h
+greynetic.o: $(UTILS_SRC)/yarandom.h
+greynetic.o: $(UTILS_SRC)/usleep.h
+greynetic.o: $(UTILS_SRC)/resources.h
+greynetic.o: $(UTILS_SRC)/hsv.h
+greynetic.o: $(UTILS_SRC)/colors.h
+greynetic.o: $(UTILS_SRC)/grabscreen.h
+greynetic.o: $(UTILS_SRC)/visual.h
+halo.o: $(srcdir)/screenhack.h
+halo.o: ../config.h
+halo.o: $(UTILS_SRC)/yarandom.h
+halo.o: $(UTILS_SRC)/usleep.h
+halo.o: $(UTILS_SRC)/resources.h
+halo.o: $(UTILS_SRC)/hsv.h
+halo.o: $(UTILS_SRC)/colors.h
+halo.o: $(UTILS_SRC)/grabscreen.h
+halo.o: $(UTILS_SRC)/visual.h
+helix.o: $(srcdir)/screenhack.h
+helix.o: ../config.h
+helix.o: $(UTILS_SRC)/yarandom.h
+helix.o: $(UTILS_SRC)/usleep.h
+helix.o: $(UTILS_SRC)/resources.h
+helix.o: $(UTILS_SRC)/hsv.h
+helix.o: $(UTILS_SRC)/colors.h
+helix.o: $(UTILS_SRC)/grabscreen.h
+helix.o: $(UTILS_SRC)/visual.h
+helix.o: $(UTILS_SRC)/erase.h
+hopalong.o: $(srcdir)/xlockmore.h
+hopalong.o: ../config.h
+hopalong.o: $(srcdir)/xlockmoreI.h
+hopalong.o: $(srcdir)/screenhack.h
+hopalong.o: $(UTILS_SRC)/yarandom.h
+hopalong.o: $(UTILS_SRC)/usleep.h
+hopalong.o: $(UTILS_SRC)/resources.h
+hopalong.o: $(UTILS_SRC)/hsv.h
+hopalong.o: $(UTILS_SRC)/colors.h
+hopalong.o: $(UTILS_SRC)/grabscreen.h
+hopalong.o: $(UTILS_SRC)/visual.h
+hopalong.o: $(UTILS_SRC)/xshm.h
+hopalong.o: $(UTILS_SRC)/erase.h
+hypercube.o: $(srcdir)/screenhack.h
+hypercube.o: ../config.h
+hypercube.o: $(UTILS_SRC)/yarandom.h
+hypercube.o: $(UTILS_SRC)/usleep.h
+hypercube.o: $(UTILS_SRC)/resources.h
+hypercube.o: $(UTILS_SRC)/hsv.h
+hypercube.o: $(UTILS_SRC)/colors.h
+hypercube.o: $(UTILS_SRC)/grabscreen.h
+hypercube.o: $(UTILS_SRC)/visual.h
+ifs.o: $(srcdir)/xlockmore.h
+ifs.o: ../config.h
+ifs.o: $(srcdir)/xlockmoreI.h
+ifs.o: $(srcdir)/screenhack.h
+ifs.o: $(UTILS_SRC)/yarandom.h
+ifs.o: $(UTILS_SRC)/usleep.h
+ifs.o: $(UTILS_SRC)/resources.h
+ifs.o: $(UTILS_SRC)/hsv.h
+ifs.o: $(UTILS_SRC)/colors.h
+ifs.o: $(UTILS_SRC)/grabscreen.h
+ifs.o: $(UTILS_SRC)/visual.h
+ifs.o: $(UTILS_SRC)/xshm.h
+imsmap.o: $(srcdir)/screenhack.h
+imsmap.o: ../config.h
+imsmap.o: $(UTILS_SRC)/yarandom.h
+imsmap.o: $(UTILS_SRC)/usleep.h
+imsmap.o: $(UTILS_SRC)/resources.h
+imsmap.o: $(UTILS_SRC)/hsv.h
+imsmap.o: $(UTILS_SRC)/colors.h
+imsmap.o: $(UTILS_SRC)/grabscreen.h
+imsmap.o: $(UTILS_SRC)/visual.h
+julia.o: $(srcdir)/xlockmore.h
+julia.o: ../config.h
+julia.o: $(srcdir)/xlockmoreI.h
+julia.o: $(srcdir)/screenhack.h
+julia.o: $(UTILS_SRC)/yarandom.h
+julia.o: $(UTILS_SRC)/usleep.h
+julia.o: $(UTILS_SRC)/resources.h
+julia.o: $(UTILS_SRC)/hsv.h
+julia.o: $(UTILS_SRC)/colors.h
+julia.o: $(UTILS_SRC)/grabscreen.h
+julia.o: $(UTILS_SRC)/visual.h
+julia.o: $(UTILS_SRC)/xshm.h
+kaleidescope.o: $(UTILS_SRC)/spline.h
+kaleidescope.o: $(srcdir)/screenhack.h
+kaleidescope.o: ../config.h
+kaleidescope.o: $(UTILS_SRC)/yarandom.h
+kaleidescope.o: $(UTILS_SRC)/usleep.h
+kaleidescope.o: $(UTILS_SRC)/resources.h
+kaleidescope.o: $(UTILS_SRC)/hsv.h
+kaleidescope.o: $(UTILS_SRC)/colors.h
+kaleidescope.o: $(UTILS_SRC)/grabscreen.h
+kaleidescope.o: $(UTILS_SRC)/visual.h
+laser.o: $(srcdir)/xlockmore.h
+laser.o: ../config.h
+laser.o: $(srcdir)/xlockmoreI.h
+laser.o: $(srcdir)/screenhack.h
+laser.o: $(UTILS_SRC)/yarandom.h
+laser.o: $(UTILS_SRC)/usleep.h
+laser.o: $(UTILS_SRC)/resources.h
+laser.o: $(UTILS_SRC)/hsv.h
+laser.o: $(UTILS_SRC)/colors.h
+laser.o: $(UTILS_SRC)/grabscreen.h
+laser.o: $(UTILS_SRC)/visual.h
+laser.o: $(UTILS_SRC)/xshm.h
+lightning.o: $(srcdir)/xlockmore.h
+lightning.o: ../config.h
+lightning.o: $(srcdir)/xlockmoreI.h
+lightning.o: $(srcdir)/screenhack.h
+lightning.o: $(UTILS_SRC)/yarandom.h
+lightning.o: $(UTILS_SRC)/usleep.h
+lightning.o: $(UTILS_SRC)/resources.h
+lightning.o: $(UTILS_SRC)/hsv.h
+lightning.o: $(UTILS_SRC)/colors.h
+lightning.o: $(UTILS_SRC)/grabscreen.h
+lightning.o: $(UTILS_SRC)/visual.h
+lightning.o: $(UTILS_SRC)/xshm.h
+lisa.o: $(srcdir)/xlockmore.h
+lisa.o: ../config.h
+lisa.o: $(srcdir)/xlockmoreI.h
+lisa.o: $(srcdir)/screenhack.h
+lisa.o: $(UTILS_SRC)/yarandom.h
+lisa.o: $(UTILS_SRC)/usleep.h
+lisa.o: $(UTILS_SRC)/resources.h
+lisa.o: $(UTILS_SRC)/hsv.h
+lisa.o: $(UTILS_SRC)/colors.h
+lisa.o: $(UTILS_SRC)/grabscreen.h
+lisa.o: $(UTILS_SRC)/visual.h
+lisa.o: $(UTILS_SRC)/xshm.h
+lmorph.o: $(srcdir)/screenhack.h
+lmorph.o: ../config.h
+lmorph.o: $(UTILS_SRC)/yarandom.h
+lmorph.o: $(UTILS_SRC)/usleep.h
+lmorph.o: $(UTILS_SRC)/resources.h
+lmorph.o: $(UTILS_SRC)/hsv.h
+lmorph.o: $(UTILS_SRC)/colors.h
+lmorph.o: $(UTILS_SRC)/grabscreen.h
+lmorph.o: $(UTILS_SRC)/visual.h
+maze.o: $(srcdir)/screenhack.h
+maze.o: ../config.h
+maze.o: $(UTILS_SRC)/yarandom.h
+maze.o: $(UTILS_SRC)/usleep.h
+maze.o: $(UTILS_SRC)/resources.h
+maze.o: $(UTILS_SRC)/hsv.h
+maze.o: $(UTILS_SRC)/colors.h
+maze.o: $(UTILS_SRC)/grabscreen.h
+maze.o: $(UTILS_SRC)/visual.h
+maze.o: $(UTILS_SRC)/erase.h
+moire.o: $(srcdir)/screenhack.h
+moire.o: ../config.h
+moire.o: $(UTILS_SRC)/yarandom.h
+moire.o: $(UTILS_SRC)/usleep.h
+moire.o: $(UTILS_SRC)/resources.h
+moire.o: $(UTILS_SRC)/hsv.h
+moire.o: $(UTILS_SRC)/colors.h
+moire.o: $(UTILS_SRC)/grabscreen.h
+moire.o: $(UTILS_SRC)/visual.h
+moire.o: $(UTILS_SRC)/xshm.h
+noseguy.o: $(srcdir)/screenhack.h
+noseguy.o: ../config.h
+noseguy.o: $(UTILS_SRC)/yarandom.h
+noseguy.o: $(UTILS_SRC)/usleep.h
+noseguy.o: $(UTILS_SRC)/resources.h
+noseguy.o: $(UTILS_SRC)/hsv.h
+noseguy.o: $(UTILS_SRC)/colors.h
+noseguy.o: $(UTILS_SRC)/grabscreen.h
+noseguy.o: $(UTILS_SRC)/visual.h
+noseguy.o: $(srcdir)/images/noseguy/nose-f1.xpm
+noseguy.o: $(srcdir)/images/noseguy/nose-f2.xpm
+noseguy.o: $(srcdir)/images/noseguy/nose-f3.xpm
+noseguy.o: $(srcdir)/images/noseguy/nose-f4.xpm
+noseguy.o: $(srcdir)/images/noseguy/nose-l1.xpm
+noseguy.o: $(srcdir)/images/noseguy/nose-l2.xpm
+noseguy.o: $(srcdir)/images/noseguy/nose-r1.xpm
+noseguy.o: $(srcdir)/images/noseguy/nose-r2.xpm
+pedal.o: $(srcdir)/screenhack.h
+pedal.o: ../config.h
+pedal.o: $(UTILS_SRC)/yarandom.h
+pedal.o: $(UTILS_SRC)/usleep.h
+pedal.o: $(UTILS_SRC)/resources.h
+pedal.o: $(UTILS_SRC)/hsv.h
+pedal.o: $(UTILS_SRC)/colors.h
+pedal.o: $(UTILS_SRC)/grabscreen.h
+pedal.o: $(UTILS_SRC)/visual.h
+penrose.o: $(srcdir)/xlockmore.h
+penrose.o: ../config.h
+penrose.o: $(srcdir)/xlockmoreI.h
+penrose.o: $(srcdir)/screenhack.h
+penrose.o: $(UTILS_SRC)/yarandom.h
+penrose.o: $(UTILS_SRC)/usleep.h
+penrose.o: $(UTILS_SRC)/resources.h
+penrose.o: $(UTILS_SRC)/hsv.h
+penrose.o: $(UTILS_SRC)/colors.h
+penrose.o: $(UTILS_SRC)/grabscreen.h
+penrose.o: $(UTILS_SRC)/visual.h
+penrose.o: $(UTILS_SRC)/xshm.h
+pyro.o: $(srcdir)/screenhack.h
+pyro.o: ../config.h
+pyro.o: $(UTILS_SRC)/yarandom.h
+pyro.o: $(UTILS_SRC)/usleep.h
+pyro.o: $(UTILS_SRC)/resources.h
+pyro.o: $(UTILS_SRC)/hsv.h
+pyro.o: $(UTILS_SRC)/colors.h
+pyro.o: $(UTILS_SRC)/grabscreen.h
+pyro.o: $(UTILS_SRC)/visual.h
+qix.o: $(srcdir)/screenhack.h
+qix.o: ../config.h
+qix.o: $(UTILS_SRC)/yarandom.h
+qix.o: $(UTILS_SRC)/usleep.h
+qix.o: $(UTILS_SRC)/resources.h
+qix.o: $(UTILS_SRC)/hsv.h
+qix.o: $(UTILS_SRC)/colors.h
+qix.o: $(UTILS_SRC)/grabscreen.h
+qix.o: $(UTILS_SRC)/visual.h
+qix.o: $(UTILS_SRC)/alpha.h
+rocks.o: $(srcdir)/screenhack.h
+rocks.o: ../config.h
+rocks.o: $(UTILS_SRC)/yarandom.h
+rocks.o: $(UTILS_SRC)/usleep.h
+rocks.o: $(UTILS_SRC)/resources.h
+rocks.o: $(UTILS_SRC)/hsv.h
+rocks.o: $(UTILS_SRC)/colors.h
+rocks.o: $(UTILS_SRC)/grabscreen.h
+rocks.o: $(UTILS_SRC)/visual.h
+rorschach.o: $(srcdir)/screenhack.h
+rorschach.o: ../config.h
+rorschach.o: $(UTILS_SRC)/yarandom.h
+rorschach.o: $(UTILS_SRC)/usleep.h
+rorschach.o: $(UTILS_SRC)/resources.h
+rorschach.o: $(UTILS_SRC)/hsv.h
+rorschach.o: $(UTILS_SRC)/colors.h
+rorschach.o: $(UTILS_SRC)/grabscreen.h
+rorschach.o: $(UTILS_SRC)/visual.h
+rorschach.o: $(UTILS_SRC)/erase.h
+screenhack.o: $(UTILS_SRC)/xmu.h
+screenhack.o: $(srcdir)/screenhack.h
+screenhack.o: ../config.h
+screenhack.o: $(UTILS_SRC)/yarandom.h
+screenhack.o: $(UTILS_SRC)/usleep.h
+screenhack.o: $(UTILS_SRC)/resources.h
+screenhack.o: $(UTILS_SRC)/hsv.h
+screenhack.o: $(UTILS_SRC)/colors.h
+screenhack.o: $(UTILS_SRC)/grabscreen.h
+screenhack.o: $(UTILS_SRC)/visual.h
+screenhack.o: $(UTILS_SRC)/version.h
+screenhack.o: $(UTILS_SRC)/vroot.h
+sierpinski.o: $(srcdir)/xlockmore.h
+sierpinski.o: ../config.h
+sierpinski.o: $(srcdir)/xlockmoreI.h
+sierpinski.o: $(srcdir)/screenhack.h
+sierpinski.o: $(UTILS_SRC)/yarandom.h
+sierpinski.o: $(UTILS_SRC)/usleep.h
+sierpinski.o: $(UTILS_SRC)/resources.h
+sierpinski.o: $(UTILS_SRC)/hsv.h
+sierpinski.o: $(UTILS_SRC)/colors.h
+sierpinski.o: $(UTILS_SRC)/grabscreen.h
+sierpinski.o: $(UTILS_SRC)/visual.h
+sierpinski.o: $(UTILS_SRC)/xshm.h
+slidescreen.o: $(srcdir)/screenhack.h
+slidescreen.o: ../config.h
+slidescreen.o: $(UTILS_SRC)/yarandom.h
+slidescreen.o: $(UTILS_SRC)/usleep.h
+slidescreen.o: $(UTILS_SRC)/resources.h
+slidescreen.o: $(UTILS_SRC)/hsv.h
+slidescreen.o: $(UTILS_SRC)/colors.h
+slidescreen.o: $(UTILS_SRC)/grabscreen.h
+slidescreen.o: $(UTILS_SRC)/visual.h
+slip.o: $(srcdir)/xlockmore.h
+slip.o: ../config.h
+slip.o: $(srcdir)/xlockmoreI.h
+slip.o: $(srcdir)/screenhack.h
+slip.o: $(UTILS_SRC)/yarandom.h
+slip.o: $(UTILS_SRC)/usleep.h
+slip.o: $(UTILS_SRC)/resources.h
+slip.o: $(UTILS_SRC)/hsv.h
+slip.o: $(UTILS_SRC)/colors.h
+slip.o: $(UTILS_SRC)/grabscreen.h
+slip.o: $(UTILS_SRC)/visual.h
+slip.o: $(UTILS_SRC)/xshm.h
+sphere.o: $(srcdir)/xlockmore.h
+sphere.o: ../config.h
+sphere.o: $(srcdir)/xlockmoreI.h
+sphere.o: $(srcdir)/screenhack.h
+sphere.o: $(UTILS_SRC)/yarandom.h
+sphere.o: $(UTILS_SRC)/usleep.h
+sphere.o: $(UTILS_SRC)/resources.h
+sphere.o: $(UTILS_SRC)/hsv.h
+sphere.o: $(UTILS_SRC)/colors.h
+sphere.o: $(UTILS_SRC)/grabscreen.h
+sphere.o: $(UTILS_SRC)/visual.h
+sphere.o: $(UTILS_SRC)/xshm.h
+spiral.o: $(srcdir)/xlockmore.h
+spiral.o: ../config.h
+spiral.o: $(srcdir)/xlockmoreI.h
+spiral.o: $(srcdir)/screenhack.h
+spiral.o: $(UTILS_SRC)/yarandom.h
+spiral.o: $(UTILS_SRC)/usleep.h
+spiral.o: $(UTILS_SRC)/resources.h
+spiral.o: $(UTILS_SRC)/hsv.h
+spiral.o: $(UTILS_SRC)/colors.h
+spiral.o: $(UTILS_SRC)/grabscreen.h
+spiral.o: $(UTILS_SRC)/visual.h
+spiral.o: $(UTILS_SRC)/xshm.h
+strange.o: $(srcdir)/xlockmore.h
+strange.o: ../config.h
+strange.o: $(srcdir)/xlockmoreI.h
+strange.o: $(srcdir)/screenhack.h
+strange.o: $(UTILS_SRC)/yarandom.h
+strange.o: $(UTILS_SRC)/usleep.h
+strange.o: $(UTILS_SRC)/resources.h
+strange.o: $(UTILS_SRC)/hsv.h
+strange.o: $(UTILS_SRC)/colors.h
+strange.o: $(UTILS_SRC)/grabscreen.h
+strange.o: $(UTILS_SRC)/visual.h
+strange.o: $(UTILS_SRC)/xshm.h
+swirl.o: $(srcdir)/xlockmore.h
+swirl.o: ../config.h
+swirl.o: $(srcdir)/xlockmoreI.h
+swirl.o: $(srcdir)/screenhack.h
+swirl.o: $(UTILS_SRC)/yarandom.h
+swirl.o: $(UTILS_SRC)/usleep.h
+swirl.o: $(UTILS_SRC)/resources.h
+swirl.o: $(UTILS_SRC)/hsv.h
+swirl.o: $(UTILS_SRC)/colors.h
+swirl.o: $(UTILS_SRC)/grabscreen.h
+swirl.o: $(UTILS_SRC)/visual.h
+swirl.o: $(UTILS_SRC)/xshm.h
+xlockmore.o: $(srcdir)/screenhack.h
+xlockmore.o: ../config.h
+xlockmore.o: $(UTILS_SRC)/yarandom.h
+xlockmore.o: $(UTILS_SRC)/usleep.h
+xlockmore.o: $(UTILS_SRC)/resources.h
+xlockmore.o: $(UTILS_SRC)/hsv.h
+xlockmore.o: $(UTILS_SRC)/colors.h
+xlockmore.o: $(UTILS_SRC)/grabscreen.h
+xlockmore.o: $(UTILS_SRC)/visual.h
+xlockmore.o: $(srcdir)/xlockmoreI.h
+xlockmore.o: $(UTILS_SRC)/xshm.h
+xroger-hack.o: $(srcdir)/screenhack.h
+xroger-hack.o: ../config.h
+xroger-hack.o: $(UTILS_SRC)/yarandom.h
+xroger-hack.o: $(UTILS_SRC)/usleep.h
+xroger-hack.o: $(UTILS_SRC)/resources.h
+xroger-hack.o: $(UTILS_SRC)/hsv.h
+xroger-hack.o: $(UTILS_SRC)/colors.h
+xroger-hack.o: $(UTILS_SRC)/grabscreen.h
+xroger-hack.o: $(UTILS_SRC)/visual.h
+goop.o: $(srcdir)/screenhack.h
+goop.o: ../config.h
+goop.o: $(UTILS_SRC)/yarandom.h
+goop.o: $(UTILS_SRC)/usleep.h
+goop.o: $(UTILS_SRC)/resources.h
+goop.o: $(UTILS_SRC)/hsv.h
+goop.o: $(UTILS_SRC)/colors.h
+goop.o: $(UTILS_SRC)/grabscreen.h
+goop.o: $(UTILS_SRC)/visual.h
+goop.o: $(UTILS_SRC)/spline.h
+goop.o: $(UTILS_SRC)/alpha.h
+starfish.o: $(srcdir)/screenhack.h
+starfish.o: ../config.h
+starfish.o: $(UTILS_SRC)/yarandom.h
+starfish.o: $(UTILS_SRC)/usleep.h
+starfish.o: $(UTILS_SRC)/resources.h
+starfish.o: $(UTILS_SRC)/hsv.h
+starfish.o: $(UTILS_SRC)/colors.h
+starfish.o: $(UTILS_SRC)/grabscreen.h
+starfish.o: $(UTILS_SRC)/visual.h
+starfish.o: $(UTILS_SRC)/spline.h
+munch.o: $(srcdir)/screenhack.h
+munch.o: ../config.h
+munch.o: $(UTILS_SRC)/yarandom.h
+munch.o: $(UTILS_SRC)/usleep.h
+munch.o: $(UTILS_SRC)/resources.h
+munch.o: $(UTILS_SRC)/hsv.h
+munch.o: $(UTILS_SRC)/colors.h
+munch.o: $(UTILS_SRC)/grabscreen.h
+munch.o: $(UTILS_SRC)/visual.h
+fadeplot.o: $(srcdir)/xlockmore.h
+fadeplot.o: ../config.h
+fadeplot.o: $(srcdir)/xlockmoreI.h
+fadeplot.o: $(srcdir)/screenhack.h
+fadeplot.o: $(UTILS_SRC)/yarandom.h
+fadeplot.o: $(UTILS_SRC)/usleep.h
+fadeplot.o: $(UTILS_SRC)/resources.h
+fadeplot.o: $(UTILS_SRC)/hsv.h
+fadeplot.o: $(UTILS_SRC)/colors.h
+fadeplot.o: $(UTILS_SRC)/grabscreen.h
+fadeplot.o: $(UTILS_SRC)/visual.h
+fadeplot.o: $(UTILS_SRC)/xshm.h
+rd-bomb.o: $(srcdir)/screenhack.h
+rd-bomb.o: ../config.h
+rd-bomb.o: $(UTILS_SRC)/yarandom.h
+rd-bomb.o: $(UTILS_SRC)/usleep.h
+rd-bomb.o: $(UTILS_SRC)/resources.h
+rd-bomb.o: $(UTILS_SRC)/hsv.h
+rd-bomb.o: $(UTILS_SRC)/colors.h
+rd-bomb.o: $(UTILS_SRC)/grabscreen.h
+rd-bomb.o: $(UTILS_SRC)/visual.h
+rd-bomb.o: $(UTILS_SRC)/xshm.h
+coral.o: $(srcdir)/screenhack.h
+coral.o: ../config.h
+coral.o: $(UTILS_SRC)/yarandom.h
+coral.o: $(UTILS_SRC)/usleep.h
+coral.o: $(UTILS_SRC)/resources.h
+coral.o: $(UTILS_SRC)/hsv.h
+coral.o: $(UTILS_SRC)/colors.h
+coral.o: $(UTILS_SRC)/grabscreen.h
+coral.o: $(UTILS_SRC)/visual.h
+coral.o: $(UTILS_SRC)/erase.h
+mountain.o: $(srcdir)/xlockmore.h
+mountain.o: ../config.h
+mountain.o: $(srcdir)/xlockmoreI.h
+mountain.o: $(srcdir)/screenhack.h
+mountain.o: $(UTILS_SRC)/yarandom.h
+mountain.o: $(UTILS_SRC)/usleep.h
+mountain.o: $(UTILS_SRC)/resources.h
+mountain.o: $(UTILS_SRC)/hsv.h
+mountain.o: $(UTILS_SRC)/colors.h
+mountain.o: $(UTILS_SRC)/grabscreen.h
+mountain.o: $(UTILS_SRC)/visual.h
+mountain.o: $(UTILS_SRC)/xshm.h
+triangle.o: $(srcdir)/xlockmore.h
+triangle.o: ../config.h
+triangle.o: $(srcdir)/xlockmoreI.h
+triangle.o: $(srcdir)/screenhack.h
+triangle.o: $(UTILS_SRC)/yarandom.h
+triangle.o: $(UTILS_SRC)/usleep.h
+triangle.o: $(UTILS_SRC)/resources.h
+triangle.o: $(UTILS_SRC)/hsv.h
+triangle.o: $(UTILS_SRC)/colors.h
+triangle.o: $(UTILS_SRC)/grabscreen.h
+triangle.o: $(UTILS_SRC)/visual.h
+triangle.o: $(UTILS_SRC)/xshm.h
+lissie.o: $(srcdir)/xlockmore.h
+lissie.o: ../config.h
+lissie.o: $(srcdir)/xlockmoreI.h
+lissie.o: $(srcdir)/screenhack.h
+lissie.o: $(UTILS_SRC)/yarandom.h
+lissie.o: $(UTILS_SRC)/usleep.h
+lissie.o: $(UTILS_SRC)/resources.h
+lissie.o: $(UTILS_SRC)/hsv.h
+lissie.o: $(UTILS_SRC)/colors.h
+lissie.o: $(UTILS_SRC)/grabscreen.h
+lissie.o: $(UTILS_SRC)/visual.h
+lissie.o: $(UTILS_SRC)/xshm.h
+worm.o: $(srcdir)/xlockmore.h
+worm.o: ../config.h
+worm.o: $(srcdir)/xlockmoreI.h
+worm.o: $(srcdir)/screenhack.h
+worm.o: $(UTILS_SRC)/yarandom.h
+worm.o: $(UTILS_SRC)/usleep.h
+worm.o: $(UTILS_SRC)/resources.h
+worm.o: $(UTILS_SRC)/hsv.h
+worm.o: $(UTILS_SRC)/colors.h
+worm.o: $(UTILS_SRC)/grabscreen.h
+worm.o: $(UTILS_SRC)/visual.h
+worm.o: $(UTILS_SRC)/xshm.h
+rotor.o: $(srcdir)/xlockmore.h
+rotor.o: ../config.h
+rotor.o: $(srcdir)/xlockmoreI.h
+rotor.o: $(srcdir)/screenhack.h
+rotor.o: $(UTILS_SRC)/yarandom.h
+rotor.o: $(UTILS_SRC)/usleep.h
+rotor.o: $(UTILS_SRC)/resources.h
+rotor.o: $(UTILS_SRC)/hsv.h
+rotor.o: $(UTILS_SRC)/colors.h
+rotor.o: $(UTILS_SRC)/grabscreen.h
+rotor.o: $(UTILS_SRC)/visual.h
+rotor.o: $(UTILS_SRC)/xshm.h
+ant.o: $(srcdir)/xlockmore.h
+ant.o: ../config.h
+ant.o: $(srcdir)/xlockmoreI.h
+ant.o: $(srcdir)/screenhack.h
+ant.o: $(UTILS_SRC)/yarandom.h
+ant.o: $(UTILS_SRC)/usleep.h
+ant.o: $(UTILS_SRC)/resources.h
+ant.o: $(UTILS_SRC)/hsv.h
+ant.o: $(UTILS_SRC)/colors.h
+ant.o: $(UTILS_SRC)/grabscreen.h
+ant.o: $(UTILS_SRC)/visual.h
+ant.o: $(UTILS_SRC)/xshm.h
+ant.o: $(UTILS_SRC)/erase.h
+ant.o: $(srcdir)/automata.h
+xjack.o: $(srcdir)/screenhack.h
+xjack.o: ../config.h
+xjack.o: $(UTILS_SRC)/yarandom.h
+xjack.o: $(UTILS_SRC)/usleep.h
+xjack.o: $(UTILS_SRC)/resources.h
+xjack.o: $(UTILS_SRC)/hsv.h
+xjack.o: $(UTILS_SRC)/colors.h
+xjack.o: $(UTILS_SRC)/grabscreen.h
+xjack.o: $(UTILS_SRC)/visual.h
+xlyap.o: $(srcdir)/screenhack.h
+xlyap.o: ../config.h
+xlyap.o: $(UTILS_SRC)/yarandom.h
+xlyap.o: $(UTILS_SRC)/usleep.h
+xlyap.o: $(UTILS_SRC)/resources.h
+xlyap.o: $(UTILS_SRC)/hsv.h
+xlyap.o: $(UTILS_SRC)/colors.h
+xlyap.o: $(UTILS_SRC)/grabscreen.h
+xlyap.o: $(UTILS_SRC)/visual.h
+xlyap.o: $(UTILS_SRC)/vroot.h
+jigsaw.o: $(srcdir)/screenhack.h
+jigsaw.o: ../config.h
+jigsaw.o: $(UTILS_SRC)/yarandom.h
+jigsaw.o: $(UTILS_SRC)/usleep.h
+jigsaw.o: $(UTILS_SRC)/resources.h
+jigsaw.o: $(UTILS_SRC)/hsv.h
+jigsaw.o: $(UTILS_SRC)/colors.h
+jigsaw.o: $(UTILS_SRC)/grabscreen.h
+jigsaw.o: $(UTILS_SRC)/visual.h
+jigsaw.o: $(srcdir)/images/jigsaw/jigsaw_a_h.xbm
+jigsaw.o: $(srcdir)/images/jigsaw/jigsaw_a_n_h.xbm
+jigsaw.o: $(srcdir)/images/jigsaw/jigsaw_a_ne_h.xbm
+jigsaw.o: $(srcdir)/images/jigsaw/jigsaw_a_e_h.xbm
+jigsaw.o: $(srcdir)/images/jigsaw/jigsaw_a_se_h.xbm
+jigsaw.o: $(srcdir)/images/jigsaw/jigsaw_a_s_h.xbm
+jigsaw.o: $(srcdir)/images/jigsaw/jigsaw_a_sw_h.xbm
+jigsaw.o: $(srcdir)/images/jigsaw/jigsaw_a_w_h.xbm
+jigsaw.o: $(srcdir)/images/jigsaw/jigsaw_a_nw_h.xbm
+jigsaw.o: $(srcdir)/images/jigsaw/jigsaw_b_h.xbm
+jigsaw.o: $(srcdir)/images/jigsaw/jigsaw_b_n_h.xbm
+jigsaw.o: $(srcdir)/images/jigsaw/jigsaw_b_ne_h.xbm
+jigsaw.o: $(srcdir)/images/jigsaw/jigsaw_b_e_h.xbm
+jigsaw.o: $(srcdir)/images/jigsaw/jigsaw_b_se_h.xbm
+jigsaw.o: $(srcdir)/images/jigsaw/jigsaw_b_s_h.xbm
+jigsaw.o: $(srcdir)/images/jigsaw/jigsaw_b_sw_h.xbm
+jigsaw.o: $(srcdir)/images/jigsaw/jigsaw_b_w_h.xbm
+jigsaw.o: $(srcdir)/images/jigsaw/jigsaw_b_nw_h.xbm
+jigsaw.o: $(srcdir)/images/jigsaw/jigsaw_a_f.xbm
+jigsaw.o: $(srcdir)/images/jigsaw/jigsaw_a_n_f.xbm
+jigsaw.o: $(srcdir)/images/jigsaw/jigsaw_a_ne_f.xbm
+jigsaw.o: $(srcdir)/images/jigsaw/jigsaw_a_e_f.xbm
+jigsaw.o: $(srcdir)/images/jigsaw/jigsaw_a_se_f.xbm
+jigsaw.o: $(srcdir)/images/jigsaw/jigsaw_a_s_f.xbm
+jigsaw.o: $(srcdir)/images/jigsaw/jigsaw_a_sw_f.xbm
+jigsaw.o: $(srcdir)/images/jigsaw/jigsaw_a_w_f.xbm
+jigsaw.o: $(srcdir)/images/jigsaw/jigsaw_a_nw_f.xbm
+jigsaw.o: $(srcdir)/images/jigsaw/jigsaw_b_f.xbm
+jigsaw.o: $(srcdir)/images/jigsaw/jigsaw_b_n_f.xbm
+jigsaw.o: $(srcdir)/images/jigsaw/jigsaw_b_ne_f.xbm
+jigsaw.o: $(srcdir)/images/jigsaw/jigsaw_b_e_f.xbm
+jigsaw.o: $(srcdir)/images/jigsaw/jigsaw_b_se_f.xbm
+jigsaw.o: $(srcdir)/images/jigsaw/jigsaw_b_s_f.xbm
+jigsaw.o: $(srcdir)/images/jigsaw/jigsaw_b_sw_f.xbm
+jigsaw.o: $(srcdir)/images/jigsaw/jigsaw_b_w_f.xbm
+jigsaw.o: $(srcdir)/images/jigsaw/jigsaw_b_nw_f.xbm
+xscreensaver-sgigl.o: $(UTILS_SRC)/vroot.h
+cynosure.o: $(srcdir)/screenhack.h
+cynosure.o: ../config.h
+cynosure.o: $(UTILS_SRC)/yarandom.h
+cynosure.o: $(UTILS_SRC)/usleep.h
+cynosure.o: $(UTILS_SRC)/resources.h
+cynosure.o: $(UTILS_SRC)/hsv.h
+cynosure.o: $(UTILS_SRC)/colors.h
+cynosure.o: $(UTILS_SRC)/grabscreen.h
+cynosure.o: $(UTILS_SRC)/visual.h
+moire2.o: $(srcdir)/screenhack.h
+moire2.o: ../config.h
+moire2.o: $(UTILS_SRC)/yarandom.h
+moire2.o: $(UTILS_SRC)/usleep.h
+moire2.o: $(UTILS_SRC)/resources.h
+moire2.o: $(UTILS_SRC)/hsv.h
+moire2.o: $(UTILS_SRC)/colors.h
+moire2.o: $(UTILS_SRC)/grabscreen.h
+moire2.o: $(UTILS_SRC)/visual.h
+moire2.o: $(UTILS_SRC)/xdbe.h
+flow.o: $(srcdir)/xlockmore.h
+flow.o: ../config.h
+flow.o: $(srcdir)/xlockmoreI.h
+flow.o: $(srcdir)/screenhack.h
+flow.o: $(UTILS_SRC)/yarandom.h
+flow.o: $(UTILS_SRC)/usleep.h
+flow.o: $(UTILS_SRC)/resources.h
+flow.o: $(UTILS_SRC)/hsv.h
+flow.o: $(UTILS_SRC)/colors.h
+flow.o: $(UTILS_SRC)/grabscreen.h
+flow.o: $(UTILS_SRC)/visual.h
+flow.o: $(UTILS_SRC)/xshm.h
+flow.o: $(UTILS_SRC)/erase.h
+epicycle.o: $(srcdir)/screenhack.h
+epicycle.o: ../config.h
+epicycle.o: $(UTILS_SRC)/yarandom.h
+epicycle.o: $(UTILS_SRC)/usleep.h
+epicycle.o: $(UTILS_SRC)/resources.h
+epicycle.o: $(UTILS_SRC)/hsv.h
+epicycle.o: $(UTILS_SRC)/colors.h
+epicycle.o: $(UTILS_SRC)/grabscreen.h
+epicycle.o: $(UTILS_SRC)/visual.h
+epicycle.o: $(UTILS_SRC)/erase.h
+interference.o: $(srcdir)/screenhack.h
+interference.o: ../config.h
+interference.o: $(UTILS_SRC)/yarandom.h
+interference.o: $(UTILS_SRC)/usleep.h
+interference.o: $(UTILS_SRC)/resources.h
+interference.o: $(UTILS_SRC)/hsv.h
+interference.o: $(UTILS_SRC)/colors.h
+interference.o: $(UTILS_SRC)/grabscreen.h
+interference.o: $(UTILS_SRC)/visual.h
+interference.o: $(UTILS_SRC)/xdbe.h
+truchet.o: $(srcdir)/screenhack.h
+truchet.o: ../config.h
+truchet.o: $(UTILS_SRC)/yarandom.h
+truchet.o: $(UTILS_SRC)/usleep.h
+truchet.o: $(UTILS_SRC)/resources.h
+truchet.o: $(UTILS_SRC)/hsv.h
+truchet.o: $(UTILS_SRC)/colors.h
+truchet.o: $(UTILS_SRC)/grabscreen.h
+truchet.o: $(UTILS_SRC)/visual.h
+bsod.o: $(srcdir)/screenhack.h
+bsod.o: ../config.h
+bsod.o: $(UTILS_SRC)/yarandom.h
+bsod.o: $(UTILS_SRC)/usleep.h
+bsod.o: $(UTILS_SRC)/resources.h
+bsod.o: $(UTILS_SRC)/hsv.h
+bsod.o: $(UTILS_SRC)/colors.h
+bsod.o: $(UTILS_SRC)/grabscreen.h
+bsod.o: $(UTILS_SRC)/visual.h
+bsod.o: $(srcdir)/images/amiga.xpm
+bsod.o: $(srcdir)/images/atari.xbm
+bsod.o: $(srcdir)/images/mac.xbm
+crystal.o: $(srcdir)/xlockmore.h
+crystal.o: ../config.h
+crystal.o: $(srcdir)/xlockmoreI.h
+crystal.o: $(srcdir)/screenhack.h
+crystal.o: $(UTILS_SRC)/yarandom.h
+crystal.o: $(UTILS_SRC)/usleep.h
+crystal.o: $(UTILS_SRC)/resources.h
+crystal.o: $(UTILS_SRC)/hsv.h
+crystal.o: $(UTILS_SRC)/colors.h
+crystal.o: $(UTILS_SRC)/grabscreen.h
+crystal.o: $(UTILS_SRC)/visual.h
+crystal.o: $(UTILS_SRC)/xshm.h
+discrete.o: $(srcdir)/xlockmore.h
+discrete.o: ../config.h
+discrete.o: $(srcdir)/xlockmoreI.h
+discrete.o: $(srcdir)/screenhack.h
+discrete.o: $(UTILS_SRC)/yarandom.h
+discrete.o: $(UTILS_SRC)/usleep.h
+discrete.o: $(UTILS_SRC)/resources.h
+discrete.o: $(UTILS_SRC)/hsv.h
+discrete.o: $(UTILS_SRC)/colors.h
+discrete.o: $(UTILS_SRC)/grabscreen.h
+discrete.o: $(UTILS_SRC)/visual.h
+discrete.o: $(UTILS_SRC)/xshm.h
+discrete.o: $(UTILS_SRC)/erase.h
+distort.o: $(srcdir)/screenhack.h
+distort.o: ../config.h
+distort.o: $(UTILS_SRC)/yarandom.h
+distort.o: $(UTILS_SRC)/usleep.h
+distort.o: $(UTILS_SRC)/resources.h
+distort.o: $(UTILS_SRC)/hsv.h
+distort.o: $(UTILS_SRC)/colors.h
+distort.o: $(UTILS_SRC)/grabscreen.h
+distort.o: $(UTILS_SRC)/visual.h
+distort.o: $(UTILS_SRC)/xshm.h
+kumppa.o: $(srcdir)/screenhack.h
+kumppa.o: ../config.h
+kumppa.o: $(UTILS_SRC)/yarandom.h
+kumppa.o: $(UTILS_SRC)/usleep.h
+kumppa.o: $(UTILS_SRC)/resources.h
+kumppa.o: $(UTILS_SRC)/hsv.h
+kumppa.o: $(UTILS_SRC)/colors.h
+kumppa.o: $(UTILS_SRC)/grabscreen.h
+kumppa.o: $(UTILS_SRC)/visual.h
+kumppa.o: $(UTILS_SRC)/xdbe.h
+sonar.o: $(srcdir)/screenhack.h
+sonar.o: ../config.h
+sonar.o: $(UTILS_SRC)/yarandom.h
+sonar.o: $(UTILS_SRC)/usleep.h
+sonar.o: $(UTILS_SRC)/resources.h
+sonar.o: $(UTILS_SRC)/hsv.h
+sonar.o: $(UTILS_SRC)/colors.h
+sonar.o: $(UTILS_SRC)/grabscreen.h
+sonar.o: $(UTILS_SRC)/visual.h
+demon.o: $(srcdir)/xlockmore.h
+demon.o: ../config.h
+demon.o: $(srcdir)/xlockmoreI.h
+demon.o: $(srcdir)/screenhack.h
+demon.o: $(UTILS_SRC)/yarandom.h
+demon.o: $(UTILS_SRC)/usleep.h
+demon.o: $(UTILS_SRC)/resources.h
+demon.o: $(UTILS_SRC)/hsv.h
+demon.o: $(UTILS_SRC)/colors.h
+demon.o: $(UTILS_SRC)/grabscreen.h
+demon.o: $(UTILS_SRC)/visual.h
+demon.o: $(UTILS_SRC)/xshm.h
+demon.o: $(srcdir)/automata.h
+loop.o: $(srcdir)/xlockmore.h
+loop.o: ../config.h
+loop.o: $(srcdir)/xlockmoreI.h
+loop.o: $(srcdir)/screenhack.h
+loop.o: $(UTILS_SRC)/yarandom.h
+loop.o: $(UTILS_SRC)/usleep.h
+loop.o: $(UTILS_SRC)/resources.h
+loop.o: $(UTILS_SRC)/hsv.h
+loop.o: $(UTILS_SRC)/colors.h
+loop.o: $(UTILS_SRC)/grabscreen.h
+loop.o: $(UTILS_SRC)/visual.h
+loop.o: $(UTILS_SRC)/xshm.h
+loop.o: $(srcdir)/automata.h
+t3d.o: $(srcdir)/screenhack.h
+t3d.o: ../config.h
+t3d.o: $(UTILS_SRC)/yarandom.h
+t3d.o: $(UTILS_SRC)/usleep.h
+t3d.o: $(UTILS_SRC)/resources.h
+t3d.o: $(UTILS_SRC)/hsv.h
+t3d.o: $(UTILS_SRC)/colors.h
+t3d.o: $(UTILS_SRC)/grabscreen.h
+t3d.o: $(UTILS_SRC)/visual.h
+penetrate.o: $(srcdir)/screenhack.h
+penetrate.o: ../config.h
+penetrate.o: $(UTILS_SRC)/yarandom.h
+penetrate.o: $(UTILS_SRC)/usleep.h
+penetrate.o: $(UTILS_SRC)/resources.h
+penetrate.o: $(UTILS_SRC)/hsv.h
+penetrate.o: $(UTILS_SRC)/colors.h
+penetrate.o: $(UTILS_SRC)/grabscreen.h
+penetrate.o: $(UTILS_SRC)/visual.h
+deluxe.o: $(srcdir)/screenhack.h
+deluxe.o: ../config.h
+deluxe.o: $(UTILS_SRC)/yarandom.h
+deluxe.o: $(UTILS_SRC)/usleep.h
+deluxe.o: $(UTILS_SRC)/resources.h
+deluxe.o: $(UTILS_SRC)/hsv.h
+deluxe.o: $(UTILS_SRC)/colors.h
+deluxe.o: $(UTILS_SRC)/grabscreen.h
+deluxe.o: $(UTILS_SRC)/visual.h
+deluxe.o: $(UTILS_SRC)/alpha.h
+deluxe.o: $(UTILS_SRC)/xdbe.h
+compass.o: $(srcdir)/screenhack.h
+compass.o: ../config.h
+compass.o: $(UTILS_SRC)/yarandom.h
+compass.o: $(UTILS_SRC)/usleep.h
+compass.o: $(UTILS_SRC)/resources.h
+compass.o: $(UTILS_SRC)/hsv.h
+compass.o: $(UTILS_SRC)/colors.h
+compass.o: $(UTILS_SRC)/grabscreen.h
+compass.o: $(UTILS_SRC)/visual.h
+compass.o: $(UTILS_SRC)/xdbe.h
+squiral.o: $(srcdir)/screenhack.h
+squiral.o: ../config.h
+squiral.o: $(UTILS_SRC)/yarandom.h
+squiral.o: $(UTILS_SRC)/usleep.h
+squiral.o: $(UTILS_SRC)/resources.h
+squiral.o: $(UTILS_SRC)/hsv.h
+squiral.o: $(UTILS_SRC)/colors.h
+squiral.o: $(UTILS_SRC)/grabscreen.h
+squiral.o: $(UTILS_SRC)/visual.h
+squiral.o: $(UTILS_SRC)/erase.h
+xflame.o: $(srcdir)/screenhack.h
+xflame.o: ../config.h
+xflame.o: $(UTILS_SRC)/yarandom.h
+xflame.o: $(UTILS_SRC)/usleep.h
+xflame.o: $(UTILS_SRC)/resources.h
+xflame.o: $(UTILS_SRC)/hsv.h
+xflame.o: $(UTILS_SRC)/colors.h
+xflame.o: $(UTILS_SRC)/grabscreen.h
+xflame.o: $(UTILS_SRC)/visual.h
+xflame.o: $(UTILS_SRC)/xshm.h
+wander.o: $(srcdir)/screenhack.h
+wander.o: ../config.h
+wander.o: $(UTILS_SRC)/yarandom.h
+wander.o: $(UTILS_SRC)/usleep.h
+wander.o: $(UTILS_SRC)/resources.h
+wander.o: $(UTILS_SRC)/hsv.h
+wander.o: $(UTILS_SRC)/colors.h
+wander.o: $(UTILS_SRC)/grabscreen.h
+wander.o: $(UTILS_SRC)/visual.h
+wander.o: $(UTILS_SRC)/erase.h
+spotlight.o: $(srcdir)/screenhack.h
+spotlight.o: ../config.h
+spotlight.o: $(UTILS_SRC)/yarandom.h
+spotlight.o: $(UTILS_SRC)/usleep.h
+spotlight.o: $(UTILS_SRC)/resources.h
+spotlight.o: $(UTILS_SRC)/hsv.h
+spotlight.o: $(UTILS_SRC)/colors.h
+spotlight.o: $(UTILS_SRC)/grabscreen.h
+spotlight.o: $(UTILS_SRC)/visual.h
+critical.o: $(srcdir)/screenhack.h
+critical.o: ../config.h
+critical.o: $(UTILS_SRC)/yarandom.h
+critical.o: $(UTILS_SRC)/usleep.h
+critical.o: $(UTILS_SRC)/resources.h
+critical.o: $(UTILS_SRC)/hsv.h
+critical.o: $(UTILS_SRC)/colors.h
+critical.o: $(UTILS_SRC)/grabscreen.h
+critical.o: $(UTILS_SRC)/visual.h
+critical.o: $(UTILS_SRC)/erase.h
+phosphor.o: $(srcdir)/screenhack.h
+phosphor.o: ../config.h
+phosphor.o: $(UTILS_SRC)/yarandom.h
+phosphor.o: $(UTILS_SRC)/usleep.h
+phosphor.o: $(UTILS_SRC)/resources.h
+phosphor.o: $(UTILS_SRC)/hsv.h
+phosphor.o: $(UTILS_SRC)/colors.h
+phosphor.o: $(UTILS_SRC)/grabscreen.h
+phosphor.o: $(UTILS_SRC)/visual.h
+xmatrix.o: $(srcdir)/screenhack.h
+xmatrix.o: ../config.h
+xmatrix.o: $(UTILS_SRC)/yarandom.h
+xmatrix.o: $(UTILS_SRC)/usleep.h
+xmatrix.o: $(UTILS_SRC)/resources.h
+xmatrix.o: $(UTILS_SRC)/hsv.h
+xmatrix.o: $(UTILS_SRC)/colors.h
+xmatrix.o: $(UTILS_SRC)/grabscreen.h
+xmatrix.o: $(UTILS_SRC)/visual.h
+xmatrix.o: $(srcdir)/images/matrix.xpm
+xmatrix.o: $(srcdir)/images/matrix.xbm
+petri.o: $(srcdir)/screenhack.h
+petri.o: ../config.h
+petri.o: $(UTILS_SRC)/yarandom.h
+petri.o: $(UTILS_SRC)/usleep.h
+petri.o: $(UTILS_SRC)/resources.h
+petri.o: $(UTILS_SRC)/hsv.h
+petri.o: $(UTILS_SRC)/colors.h
+petri.o: $(UTILS_SRC)/grabscreen.h
+petri.o: $(UTILS_SRC)/visual.h
+petri.o: $(UTILS_SRC)/spline.h
+shadebobs.o: $(srcdir)/screenhack.h
+shadebobs.o: ../config.h
+shadebobs.o: $(UTILS_SRC)/yarandom.h
+shadebobs.o: $(UTILS_SRC)/usleep.h
+shadebobs.o: $(UTILS_SRC)/resources.h
+shadebobs.o: $(UTILS_SRC)/hsv.h
+shadebobs.o: $(UTILS_SRC)/colors.h
+shadebobs.o: $(UTILS_SRC)/grabscreen.h
+shadebobs.o: $(UTILS_SRC)/visual.h
+
diff --git a/hacks/README b/hacks/README
new file mode 100644 (file)
index 0000000..34e687e
--- /dev/null
@@ -0,0 +1,6 @@
+
+This directory contains various graphics hacks.  These are independent from
+the xscreensaver program (in the ../driver/ directory) but some of them use
+the utility functions found in the ../utils/ directory.
+
+If you have compilation problems, check the parameters in ../config.h.
diff --git a/hacks/ant.c b/hacks/ant.c
new file mode 100644 (file)
index 0000000..db76bfd
--- /dev/null
@@ -0,0 +1,1176 @@
+/* -*- Mode: C; tab-width: 4 -*- */
+/*-
+ * ant --- Chris Langton's generalized turing machine ants (also known
+ *         as Greg Turk's turmites) whose tape is the screen
+ */
+
+#if !defined( lint ) && !defined( SABER )
+static const char sccsid[] = "@(#)ant.c        4.11 98/06/18 xlockmore";
+
+#endif
+
+/*-
+ * Copyright (c) 1995 by David Bagley.
+ *
+ * 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.
+ *
+ * This file is provided AS IS with no warranties of any kind.  The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof.  In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * Revision History:
+ * 10-May-97: Compatible with xscreensaver
+ * 16-Apr-97: -neighbors 3 and 8 added
+ * 01-Jan-97: Updated ant.c to handle more kinds of ants.  Thanks to
+ *            J Austin David <Austin.David@tlogic.com>.  Check it out in
+ *            java at http://havoc.gtf.gatech.edu/austin  He thought up the
+ *            new Ladder ant.
+ * 04-Apr-96: -neighbors 6 runtime-time option added for hexagonal ants
+ *            (bees), coded from an idea of Jim Propp's in Science News,
+ *            Oct 28, 1995 VOL. 148 page 287
+ * 20-Sep-95: Memory leak in ant fixed.  Now random colors.
+ * 05-Sep-95: Coded from A.K. Dewdney's "Computer Recreations", Scientific
+ *            American Magazine" Sep 1989 pp 180-183, Mar 1990 p 121
+ *            Also used Ian Stewart's Mathematical Recreations, Scientific
+ *            American Jul 1994 pp 104-107
+ *            also used demon.c and life.c as a guide.
+ */
+
+/*-
+  Species Grid     Number of Neigbors
+  ------- ----     ------------------
+  Ants    Square   4 (or 8)
+  Bees    Hexagon  6
+  Bees    Triangle 3 (or 9, 12)
+
+  Neighbors 6 and neighbors 3 produce the same Turk ants.
+*/
+
+#ifdef STANDALONE
+# define PROGCLASS "Ant"
+# define HACK_INIT init_ant
+# define HACK_DRAW draw_ant
+# define ant_opts xlockmore_opts
+# define DEFAULTS      "*delay:   1000 \n"             \
+                                       "*count:  -3 \n"                \
+                                       "*cycles:  40000 \n"    \
+                                       "*size:   -12 \n"               \
+                                       "*ncolors: 64 \n"               \
+                                       "*neighbors: 0 \n"              \
+                                       "*sharpturn: False \n"
+# include "xlockmore.h"                /* in xscreensaver distribution */
+# include "erase.h"
+#else /* STANDALONE */
+# include "xlock.h"            /* in xlockmore distribution */
+#endif /* STANDALONE */
+
+#include "automata.h"
+
+/*-
+ * neighbors of 0 randomizes it between 3, 4 and 6.
+ * 8, 9 12 are available also but not recommended.
+ */
+
+#ifdef STANDALONE
+static int neighbors;
+#else
+extern int  neighbors;
+#endif /* !STANDALONE */
+
+#define DEF_TRUCHET  "False"
+#define DEF_SHARPTURN  "False"
+#define DEF_NEIGHBORS  "0"
+
+static Bool truchet;
+static Bool sharpturn;
+
+static XrmOptionDescRec opts[] =
+{
+       {"-truchet", ".ant.truchet", XrmoptionNoArg, (caddr_t) "on"},
+       {"+truchet", ".ant.truchet", XrmoptionNoArg, (caddr_t) "off"},
+       {"-sharpturn", ".ant.sharpturn", XrmoptionNoArg, (caddr_t) "on"},
+       {"+sharpturn", ".ant.sharpturn", XrmoptionNoArg, (caddr_t) "off"},
+
+#ifdef STANDALONE
+       {"-neighbors", ".ant.neighbors", XrmoptionSepArg, (caddr_t) 0},
+       {"+neighbors", ".ant.neighbors", XrmoptionSepArg, (caddr_t) 0}
+#endif /* STANDALONE */
+
+};
+static argtype vars[] =
+{
+       {(caddr_t *) & truchet, "truchet", "Truchet", DEF_TRUCHET, t_Bool},
+   {(caddr_t *) & sharpturn, "sharpturn", "SharpTurn", DEF_SHARPTURN, t_Bool},
+#ifdef STANDALONE
+       {(caddr_t *) & neighbors, "neighbors", "Neighbors", DEF_NEIGHBORS, t_Int}
+#endif /* STANDALONE */
+};
+static OptionStruct desc[] =
+{
+       {"-/+truchet", "turn on/off Truchet lines"},
+       {"-/+sharpturn", "turn on/off sharp turns (6 or 12 neighbors only)"}
+};
+
+ModeSpecOpt ant_opts =
+{sizeof opts / sizeof opts[0], opts, sizeof vars / sizeof vars[0], vars, desc};
+
+#ifdef USE_MODULES
+ModStruct   ant_description =
+{"ant", "init_ant", "draw_ant", "release_ant",
+ "refresh_ant", "init_ant", NULL, &ant_opts,
+ 1000, -3, 40000, -12, 64, 1.0, "",
+ "Shows Langton's and Turk's generalized ants", 0, NULL};
+
+#endif
+
+#define ANTBITS(n,w,h)\
+  ap->pixmaps[ap->init_bits++]=\
+  XCreatePixmapFromBitmapData(display,window,(char *)n,w,h,1,0,1)
+
+/* If you change the table you may have to change the following 2 constants */
+#define STATES 2
+#define MINANTS 1
+#define REDRAWSTEP 2000                /* How much tape to draw per cycle */
+#define MINGRIDSIZE 24
+#define MINSIZE 1
+#define MINRANDOMSIZE 5
+#define ANGLES 360
+
+
+typedef struct {
+       unsigned char color;
+       short       direction;
+       unsigned char next;
+} statestruct;
+
+typedef struct {
+       int         col, row;
+       short       direction;
+       unsigned char state;
+} antstruct;
+
+typedef struct {
+       Bool        painted;
+       int         neighbors;
+       int         generation;
+       int         xs, ys;
+       int         xb, yb;
+       int         nrows, ncols;
+       int         width, height;
+       unsigned char ncolors, nstates;
+       int         n;
+       int         redrawing, redrawpos;
+       int         truchet;    /* Only for Turk modes */
+       int         sharpturn;  /* Only for even neighbors > 4 (i.e. 6 and 12) */
+       statestruct machine[NUMSTIPPLES * STATES];
+       unsigned char *tape;
+       unsigned char *truchet_state;
+       antstruct  *ants;
+       int         init_bits;
+       unsigned char colors[NUMSTIPPLES - 1];
+       GC          stippledGC;
+       Pixmap      pixmaps[NUMSTIPPLES - 1];
+       union {
+               XPoint      hexagon[7];         /* Need more than 6 for truchet */
+               XPoint      triangle[2][4];     /* Need more than 3 for truchet */
+       } shape;
+} antfarmstruct;
+
+static char plots[] =
+{3,
+#if 1                          /* Without this... this mode is misnamed... */
+ 4,
+#endif
+ 6};                           /* Neighborhoods, 8 just makes a mess */
+
+#define NEIGHBORKINDS (long) (sizeof plots / sizeof *plots)
+
+/* Relative ant moves */
+#define FS 0                   /* Step */
+#define TRS 1                  /* Turn right, then step */
+#define THRS 2                 /* Turn hard right, then step */
+#define TBS 3                  /* Turn back, then step */
+#define THLS 4                 /* Turn hard left, then step */
+#define TLS 5                  /* Turn left, then step */
+#define SF 6                   /* Step */
+#define STR 7                  /* Step then turn right */
+#define STHR 8                 /* Step then turn hard right */
+#define STB 9                  /* Step then turn back */
+#define STHL 10                        /* Step then turn hard left */
+#define STL 11                 /* Step then turn left */
+
+static antfarmstruct *antfarms = NULL;
+
+/* LANGTON'S ANT (10) Chaotic after 500, Builder after 10,000 (104p) */
+/* TURK'S 100 ANT Always chaotic?, tested past 150,000,000 */
+/* TURK'S 101 ANT Always chaotic? */
+/* TURK'S 110 ANT Builder at 150 (18p) */
+/* TURK'S 1000 ANT Always chaotic? */
+/* TURK'S 1100 SYMMETRIC ANT  all even run 1's and 0's are symmetric */
+/* other examples 1001, 110011, 110000, 1001101 */
+/* TURK'S 1101 ANT Builder after 250,000 (388p) */
+/* Once saw a chess horse type builder (i.e. non-45 degree builder) */
+
+/* BEE ONLY */
+/* All alternating 10 appear symmetric, no proof (i.e. 10, 1010, etc) */
+/* Even runs of 0's and 1's are also symmetric */
+/* I have seen Hexagonal builders but they are more rare. */
+
+static unsigned char tables[][3 * NUMSTIPPLES * STATES + 2] =
+{
+#if 0
+  /* Here just so you can figure out notation */
+       {                       /* Langton's ant */
+               2, 1,
+               1, TLS, 0, 0, TRS, 0
+       },
+#else
+  /* First 2 numbers are the size (ncolors, nstates) */
+       {                       /* LADDER BUILDER */
+               4, 1,
+               1, STR, 0, 2, STL, 0, 3, TRS, 0, 0, TLS, 0
+       },
+       {                       /* SPIRALING PATTERN */
+               2, 2,
+               1, TLS, 0, 0, FS, 1,
+               1, TRS, 0, 1, TRS, 0
+       },
+       {                       /* SQUARE (HEXAGON) BUILDER */
+               2, 2,
+               1, TLS, 0, 0, FS, 1,
+               0, TRS, 0, 1, TRS, 0
+       },
+#endif
+};
+
+#define NTABLES   (sizeof tables / sizeof tables[0])
+
+static void
+position_of_neighbor(antfarmstruct * ap, int dir, int *pcol, int *prow)
+{
+       int         col = *pcol, row = *prow;
+
+       if (ap->neighbors == 6) {
+               switch (dir) {
+                       case 0:
+                               col = (col + 1 == ap->ncols) ? 0 : col + 1;
+                               break;
+                       case 60:
+                               if (!(row & 1))
+                                       col = (col + 1 == ap->ncols) ? 0 : col + 1;
+                               row = (!row) ? ap->nrows - 1 : row - 1;
+                               break;
+                       case 120:
+                               if (row & 1)
+                                       col = (!col) ? ap->ncols - 1 : col - 1;
+                               row = (!row) ? ap->nrows - 1 : row - 1;
+                               break;
+                       case 180:
+                               col = (!col) ? ap->ncols - 1 : col - 1;
+                               break;
+                       case 240:
+                               if (row & 1)
+                                       col = (!col) ? ap->ncols - 1 : col - 1;
+                               row = (row + 1 == ap->nrows) ? 0 : row + 1;
+                               break;
+                       case 300:
+                               if (!(row & 1))
+                                       col = (col + 1 == ap->ncols) ? 0 : col + 1;
+                               row = (row + 1 == ap->nrows) ? 0 : row + 1;
+                               break;
+                       default:
+                               (void) fprintf(stderr, "wrong direction %d\n", dir);
+               }
+       } else if (ap->neighbors == 4 || ap->neighbors == 8) {
+               switch (dir) {
+                       case 0:
+                               col = (col + 1 == ap->ncols) ? 0 : col + 1;
+                               break;
+                       case 45:
+                               col = (col + 1 == ap->ncols) ? 0 : col + 1;
+                               row = (!row) ? ap->nrows - 1 : row - 1;
+                               break;
+                       case 90:
+                               row = (!row) ? ap->nrows - 1 : row - 1;
+                               break;
+                       case 135:
+                               col = (!col) ? ap->ncols - 1 : col - 1;
+                               row = (!row) ? ap->nrows - 1 : row - 1;
+                               break;
+                       case 180:
+                               col = (!col) ? ap->ncols - 1 : col - 1;
+                               break;
+                       case 225:
+                               col = (!col) ? ap->ncols - 1 : col - 1;
+                               row = (row + 1 == ap->nrows) ? 0 : row + 1;
+                               break;
+                       case 270:
+                               row = (row + 1 == ap->nrows) ? 0 : row + 1;
+                               break;
+                       case 315:
+                               col = (col + 1 == ap->ncols) ? 0 : col + 1;
+                               row = (row + 1 == ap->nrows) ? 0 : row + 1;
+                               break;
+                       default:
+                               (void) fprintf(stderr, "wrong direction %d\n", dir);
+               }
+       } else {                /* TRI */
+               if ((col + row) % 2) {  /* right */
+                       switch (dir) {
+                               case 0:
+                                       col = (!col) ? ap->ncols - 1 : col - 1;
+                                       break;
+                               case 30:
+                               case 40:
+                                       col = (!col) ? ap->ncols - 1 : col - 1;
+                                       row = (!row) ? ap->nrows - 1 : row - 1;
+                                       break;
+                               case 60:
+                                       col = (!col) ? ap->ncols - 1 : col - 1;
+                                       if (!row)
+                                               row = ap->nrows - 2;
+                                       else if (!(row - 1))
+                                               row = ap->nrows - 1;
+                                       else
+                                               row = row - 2;
+                                       break;
+                               case 80:
+                               case 90:
+                                       if (!row)
+                                               row = ap->nrows - 2;
+                                       else if (!(row - 1))
+                                               row = ap->nrows - 1;
+                                       else
+                                               row = row - 2;
+                                       break;
+                               case 120:
+                                       row = (!row) ? ap->nrows - 1 : row - 1;
+                                       break;
+                               case 150:
+                               case 160:
+                                       col = (col + 1 == ap->ncols) ? 0 : col + 1;
+                                       row = (!row) ? ap->nrows - 1 : row - 1;
+                                       break;
+                               case 180:
+                                       col = (col + 1 == ap->ncols) ? 0 : col + 1;
+                                       break;
+                               case 200:
+                               case 210:
+                                       col = (col + 1 == ap->ncols) ? 0 : col + 1;
+                                       row = (row + 1 == ap->nrows) ? 0 : row + 1;
+                                       break;
+                               case 240:
+                                       row = (row + 1 == ap->nrows) ? 0 : row + 1;
+                                       break;
+                               case 270:
+                               case 280:
+                                       if (row + 1 == ap->nrows)
+                                               row = 1;
+                                       else if (row + 2 == ap->nrows)
+                                               row = 0;
+                                       else
+                                               row = row + 2;
+                                       break;
+                               case 300:
+                                       col = (!col) ? ap->ncols - 1 : col - 1;
+                                       if (row + 1 == ap->nrows)
+                                               row = 1;
+                                       else if (row + 2 == ap->nrows)
+                                               row = 0;
+                                       else
+                                               row = row + 2;
+                                       break;
+                               case 320:
+                               case 330:
+                                       col = (!col) ? ap->ncols - 1 : col - 1;
+                                       row = (row + 1 == ap->nrows) ? 0 : row + 1;
+                                       break;
+                               default:
+                                       (void) fprintf(stderr, "wrong direction %d\n", dir);
+                       }
+               } else {        /* left */
+                       switch (dir) {
+                               case 0:
+                                       col = (col + 1 == ap->ncols) ? 0 : col + 1;
+                                       break;
+                               case 30:
+                               case 40:
+                                       col = (col + 1 == ap->ncols) ? 0 : col + 1;
+                                       row = (row + 1 == ap->nrows) ? 0 : row + 1;
+                                       break;
+                               case 60:
+                                       col = (col + 1 == ap->ncols) ? 0 : col + 1;
+                                       if (row + 1 == ap->nrows)
+                                               row = 1;
+                                       else if (row + 2 == ap->nrows)
+                                               row = 0;
+                                       else
+                                               row = row + 2;
+                                       break;
+                               case 80:
+                               case 90:
+                                       if (row + 1 == ap->nrows)
+                                               row = 1;
+                                       else if (row + 2 == ap->nrows)
+                                               row = 0;
+                                       else
+                                               row = row + 2;
+                                       break;
+                               case 120:
+                                       row = (row + 1 == ap->nrows) ? 0 : row + 1;
+                                       break;
+                               case 150:
+                               case 160:
+                                       col = (!col) ? ap->ncols - 1 : col - 1;
+                                       row = (row + 1 == ap->nrows) ? 0 : row + 1;
+                                       break;
+                               case 180:
+                                       col = (!col) ? ap->ncols - 1 : col - 1;
+                                       break;
+                               case 200:
+                               case 210:
+                                       col = (!col) ? ap->ncols - 1 : col - 1;
+                                       row = (!row) ? ap->nrows - 1 : row - 1;
+                                       break;
+                               case 240:
+                                       row = (!row) ? ap->nrows - 1 : row - 1;
+                                       break;
+                               case 270:
+                               case 280:
+                                       if (!row)
+                                               row = ap->nrows - 2;
+                                       else if (row == 1)
+                                               row = ap->nrows - 1;
+                                       else
+                                               row = row - 2;
+                                       break;
+                               case 300:
+                                       col = (col + 1 == ap->ncols) ? 0 : col + 1;
+                                       if (!row)
+                                               row = ap->nrows - 2;
+                                       else if (row == 1)
+                                               row = ap->nrows - 1;
+                                       else
+                                               row = row - 2;
+                                       break;
+                               case 320:
+                               case 330:
+                                       col = (col + 1 == ap->ncols) ? 0 : col + 1;
+                                       row = (!row) ? ap->nrows - 1 : row - 1;
+                                       break;
+                               default:
+                                       (void) fprintf(stderr, "wrong direction %d\n", dir);
+                       }
+               }
+       }
+       *pcol = col;
+       *prow = row;
+}
+
+static void
+fillcell(ModeInfo * mi, GC gc, int col, int row)
+{
+       antfarmstruct *ap = &antfarms[MI_SCREEN(mi)];
+
+       if (ap->neighbors == 6) {
+               int         ccol = 2 * col + !(row & 1), crow = 2 * row;
+
+               ap->shape.hexagon[0].x = ap->xb + ccol * ap->xs;
+               ap->shape.hexagon[0].y = ap->yb + crow * ap->ys;
+               if (ap->xs == 1 && ap->ys == 1)
+                       XFillRectangle(MI_DISPLAY(mi), MI_WINDOW(mi), gc,
+                       ap->shape.hexagon[0].x, ap->shape.hexagon[0].y, 1, 1);
+               else
+                       XFillPolygon(MI_DISPLAY(mi), MI_WINDOW(mi), gc,
+                           ap->shape.hexagon, 6, Convex, CoordModePrevious);
+       } else if (ap->neighbors == 4 || ap->neighbors == 8) {
+               XFillRectangle(MI_DISPLAY(mi), MI_WINDOW(mi), gc,
+               ap->xb + ap->xs * col, ap->yb + ap->ys * row,
+               ap->xs - (ap->xs > 3), ap->ys - (ap->ys > 3));
+       } else {                /* TRI */
+               int         orient = (col + row) % 2;   /* O left 1 right */
+
+               ap->shape.triangle[orient][0].x = ap->xb + col * ap->xs;
+               ap->shape.triangle[orient][0].y = ap->yb + row * ap->ys;
+               if (ap->xs <= 3 || ap->ys <= 3)
+                       XFillRectangle(MI_DISPLAY(mi), MI_WINDOW(mi), gc,
+                       ((orient) ? -1 : 1) + ap->shape.triangle[orient][0].x,
+                                      ap->shape.triangle[orient][0].y, 1, 1);
+               else {
+                       if (orient)
+                               ap->shape.triangle[orient][0].x += (ap->xs / 2 - 1);
+                       else
+                               ap->shape.triangle[orient][0].x -= (ap->xs / 2 - 1);
+                       XFillPolygon(MI_DISPLAY(mi), MI_WINDOW(mi), gc,
+                                    ap->shape.triangle[orient], 3, Convex, CoordModePrevious);
+               }
+       }
+}
+
+static void
+truchetcell(ModeInfo * mi, int col, int row, int truchetstate)
+{
+       antfarmstruct *ap = &antfarms[MI_SCREEN(mi)];
+
+       if (ap->neighbors == 6) {
+
+               int         ccol = 2 * col + !(row & 1), crow = 2 * row;
+               int         side;
+               int         fudge = 7;  /* fudge because the hexagons are not exact */
+               XPoint      hex, hex2;
+
+               if (ap->sharpturn) {
+                       hex.x = ap->xb + ccol * ap->xs - (int) ((double) ap->xs / 2.0) - 1;
+                       hex.y = ap->yb + crow * ap->ys - (int) ((double) ap->ys / 2.0) - 1;
+                       for (side = 0; side < 6; side++) {
+                               if (side > 0) {
+                                       hex.x += ap->shape.hexagon[side].x;
+                                       hex.y += ap->shape.hexagon[side].y;
+                               }
+                               if (truchetstate == side % 2)
+                                       XDrawArc(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi),
+                                                hex.x, hex.y, ap->xs, ap->ys,
+                                                ((570 - (side * 60) + fudge) % 360) * 64, (120 - 2 * fudge) * 64);
+                       }
+               } else {
+
+                       /* Very crude approx of Sqrt 3, so it will not cause drawing errors. */
+                       hex.x = ap->xb + ccol * ap->xs - (int) ((double) ap->xs * 1.6 / 2.0);
+                       hex.y = ap->yb + crow * ap->ys - (int) ((double) ap->ys * 1.6 / 2.0);
+                       for (side = 0; side < 6; side++) {
+                               if (side > 0) {
+                                       hex.x += ap->shape.hexagon[side].x;
+                                       hex.y += ap->shape.hexagon[side].y;
+                               }
+                               hex2.x = hex.x + ap->shape.hexagon[side + 1].x / 2;
+                               hex2.y = hex.y + ap->shape.hexagon[side + 1].y / 2;
+                               if (truchetstate == side % 3)
+                                       /* Crude approx of 120 deg, so it will not cause drawing errors. */
+                                       XDrawArc(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi),
+                                                hex2.x, hex2.y,
+                                                (int) ((double) ap->xs * 1.5), (int) ((double) ap->ys * 1.5),
+                                                ((555 - (side * 60)) % 360) * 64, 90 * 64);
+                       }
+               }
+       } else if (ap->neighbors == 4) {
+               if (truchetstate) {
+                       XDrawArc(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi),
+                                ap->xb + ap->xs * col - ap->xs / 2+ 1,
+                                ap->yb + ap->ys * row + ap->ys / 2 - 1,
+                                ap->xs - 2, ap->ys - 2,
+                                0 * 64, 90 * 64);
+                       XDrawArc(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi),
+                                ap->xb + ap->xs * col + ap->xs / 2 - 1,
+                                ap->yb + ap->ys * row - ap->ys / 2 + 1,
+                                ap->xs - 2, ap->ys - 2,
+                                -90 * 64, -90 * 64);
+               } else {
+                       XDrawArc(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi),
+                                ap->xb + ap->xs * col - ap->xs / 2 + 1,
+                                ap->yb + ap->ys * row - ap->ys / 2 + 1,
+                                ap->xs - 2, ap->ys - 2,
+                                0 * 64, -90 * 64);
+                       XDrawArc(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi),
+                                ap->xb + ap->xs * col + ap->xs / 2 - 1,
+                                ap->yb + ap->ys * row + ap->ys / 2 - 1,
+                                ap->xs - 2, ap->ys - 2,
+                                90 * 64, 90 * 64);
+               }
+       } else if (ap->neighbors == 3) {
+               int         orient = (col + row) % 2;   /* O left 1 right */
+               int         side, ang;
+               int         fudge = 7;  /* fudge because the triangles are not exact */
+               XPoint      tri;
+
+               tri.x = ap->xb + col * ap->xs;
+               tri.y = ap->yb + row * ap->ys;
+               if (orient) {
+                       tri.x += (ap->xs / 2 - 1);
+               } else {
+                       tri.x -= (ap->xs / 2 - 1);
+               }
+               for (side = 0; side < 3; side++) {
+                       if (side > 0) {
+                               tri.x += ap->shape.triangle[orient][side].x;
+                               tri.y += ap->shape.triangle[orient][side].y;
+                       }
+                       if (truchetstate == side % 3) {
+                               if (orient)
+                                       ang = (510 - side * 120) % 360;         /* Right */
+                               else
+                                       ang = (690 - side * 120) % 360;         /* Left */
+                               XDrawArc(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi),
+                                 tri.x - ap->xs / 2, tri.y - 3 * ap->ys / 4,
+                                        ap->xs, 3 * ap->ys / 2,
+                                 (ang + fudge) * 64, (60 - 2 * fudge) * 64);
+                       }
+               }
+       }
+}
+
+static void
+drawcell(ModeInfo * mi, int col, int row, unsigned char color)
+{
+       antfarmstruct *ap = &antfarms[MI_SCREEN(mi)];
+       GC          gc;
+
+       if (!color) {
+               XSetForeground(MI_DISPLAY(mi), MI_GC(mi), MI_BLACK_PIXEL(mi));
+               gc = MI_GC(mi);
+       } else if (MI_NPIXELS(mi) > 2) {
+               XSetForeground(MI_DISPLAY(mi), MI_GC(mi),
+                              MI_PIXEL(mi, ap->colors[color - 1]));
+               gc = MI_GC(mi);
+       } else {
+               XGCValues   gcv;
+
+               gcv.stipple = ap->pixmaps[color - 1];
+               gcv.foreground = MI_WHITE_PIXEL(mi);
+               gcv.background = MI_BLACK_PIXEL(mi);
+               XChangeGC(MI_DISPLAY(mi), ap->stippledGC,
+                         GCStipple | GCForeground | GCBackground, &gcv);
+               gc = ap->stippledGC;
+       }
+       fillcell(mi, gc, col, row);
+}
+
+static void
+drawtruchet(ModeInfo * mi, int col, int row,
+           unsigned char color, unsigned char truchetstate)
+{
+       antfarmstruct *ap = &antfarms[MI_SCREEN(mi)];
+
+       if (!color)
+               XSetForeground(MI_DISPLAY(mi), MI_GC(mi), MI_WHITE_PIXEL(mi));
+       else if (MI_NPIXELS(mi) > 2 || color > ap->ncolors / 2)
+               XSetForeground(MI_DISPLAY(mi), MI_GC(mi), MI_BLACK_PIXEL(mi));
+       else
+               XSetForeground(MI_DISPLAY(mi), MI_GC(mi), MI_WHITE_PIXEL(mi));
+       truchetcell(mi, col, row, truchetstate);
+}
+
+static void
+draw_anant(ModeInfo * mi, int col, int row)
+{
+       XSetForeground(MI_DISPLAY(mi), MI_GC(mi), MI_WHITE_PIXEL(mi));
+       fillcell(mi, MI_GC(mi), col, row);
+#if 0                          /* Can not see eyes */
+       {
+               antfarmstruct *ap = &antfarms[MI_SCREEN(mi)];
+               Display    *display = MI_DISPLAY(mi);
+               Window      window = MI_WINDOW(mi);
+
+               if (ap->xs > 2 && ap->ys > 2) {         /* Draw Eyes */
+
+                       XSetForeground(display, MI_GC(mi), MI_BLACK_PIXEL(mi));
+                       switch (direction) {
+                               case 0:
+                                       XDrawPoint(display, window, MI_GC(mi),
+                                           ap->xb + ap->xs - 1, ap->yb + 1);
+                                       XDrawPoint(display, window, MI_GC(mi),
+                                                  ap->xb + ap->xs - 1, ap->yb + ap->ys - 2);
+                                       break;
+                               case 180:
+                                       XDrawPoint(display, window, MI_GC(mi), ap->xb, ap->yb + 1);
+                                       XDrawPoint(display, window, MI_GC(mi), ap->xb, ap->yb + ap->ys - 2);
+                                       break;
+                                       if (neighbors == 4) {
+                               case 90:
+                                               XDrawPoint(display, window, MI_GC(mi), ap->xb + 1, ap->yb);
+                                               XDrawPoint(display, window, MI_GC(mi),
+                                               ap->xb + ap->xs - 2, ap->yb);
+                                               break;
+                               case 270:
+                                               XDrawPoint(display, window, MI_GC(mi),
+                                                          ap->xb + 1, ap->yb + ap->ys - 1);
+                                               XDrawPoint(display, window, MI_GC(mi),
+                                                          ap->xb + ap->xs - 2, ap->yb + ap->ys - 1);
+                                               break;
+                                       }       /* else BEE */
+                               default:
+                       }
+               }
+       }
+#endif
+}
+
+#if 0
+static void
+RandomSoup(mi)
+       ModeInfo   *mi;
+{
+       antfarmstruct *ap = &antfarms[MI_SCREEN(mi)];
+       int         row, col, mrow = 0;
+
+       for (row = 0; row < ap->nrows; ++row) {
+               for (col = 0; col < ap->ncols; ++col) {
+                       ap->old[col + mrow] = (unsigned char) NRAND((int) ap->ncolors);
+                       drawcell(mi, col, row, ap->old[col + mrow]);
+               }
+               mrow += ap->nrows;
+       }
+}
+
+#endif
+
+static short
+fromTableDirection(unsigned char dir, int neighbors)
+{
+       switch (dir) {
+               case FS:
+                       return 0;
+               case TRS:
+                       return (ANGLES / neighbors);
+               case THRS:
+                       return (ANGLES / 2 - ANGLES / neighbors);
+               case TBS:
+                       return (ANGLES / 2);
+               case THLS:
+                       return (ANGLES / 2 + ANGLES / neighbors);
+               case TLS:
+                       return (ANGLES - ANGLES / neighbors);
+               case SF:
+                       return ANGLES;
+               case STR:
+                       return (ANGLES + ANGLES / neighbors);
+               case STHR:
+                       return (3 * ANGLES / 2 - ANGLES / neighbors);
+               case STB:
+                       return (3 * ANGLES / 2);
+               case STHL:
+                       return (3 * ANGLES / 2 + ANGLES / neighbors);
+               case STL:
+                       return (2 * ANGLES - ANGLES / neighbors);
+               default:
+                       (void) fprintf(stderr, "wrong direction %d\n", dir);
+       }
+       return -1;
+}
+
+static void
+getTable(ModeInfo * mi, int i)
+{
+       antfarmstruct *ap = &antfarms[MI_SCREEN(mi)];
+       int         j, total;
+       unsigned char *patptr;
+
+       patptr = &tables[i][0];
+       ap->ncolors = *patptr++;
+       ap->nstates = *patptr++;
+       total = ap->ncolors * ap->nstates;
+       if (MI_IS_VERBOSE(mi))
+               (void) fprintf(stdout,
+                              "ants %d, neighbors %d, table number %d, colors %d, states %d\n",
+                         ap->n, ap->neighbors, i, ap->ncolors, ap->nstates);
+       for (j = 0; j < total; j++) {
+               ap->machine[j].color = *patptr++;
+               if (ap->sharpturn && ap->neighbors > 4 && !(ap->neighbors % 2)) {
+                       int         k = *patptr++;
+
+                       switch (k) {
+                               case TRS:
+                                       k = THRS;
+                                       break;
+                               case THRS:
+                                       k = TRS;
+                                       break;
+                               case THLS:
+                                       k = TLS;
+                                       break;
+                               case TLS:
+                                       k = THLS;
+                                       break;
+                               case STR:
+                                       k = STHR;
+                                       break;
+                               case STHR:
+                                       k = STR;
+                                       break;
+                               case STHL:
+                                       k = STL;
+                                       break;
+                               case STL:
+                                       k = STHL;
+                                       break;
+                               default:
+                                       break;
+                       }
+                       ap->machine[j].direction = fromTableDirection(k, ap->neighbors);
+               } else {
+                       ap->machine[j].direction = fromTableDirection(*patptr++, ap->neighbors);
+               }
+               ap->machine[j].next = *patptr++;
+       }
+       ap->truchet = False;
+}
+
+static void
+getTurk(ModeInfo * mi, int i)
+{
+       antfarmstruct *ap = &antfarms[MI_SCREEN(mi)];
+       int         power2, j, number, total;
+
+       /* To force a number, say <i = 2;> has  i + 2 (or 4) digits in binary */
+       power2 = 1 << (i + 1);
+       /* Dont want numbers which in binary are all 1's. */
+       number = NRAND(power2 - 1) + power2;
+       /* To force a particular number, say <number = 10;> */
+
+       ap->ncolors = i + 2;
+       ap->nstates = 1;
+       total = ap->ncolors * ap->nstates;
+       for (j = 0; j < total; j++) {
+               ap->machine[j].color = (j + 1) % total;
+               if (ap->sharpturn && ap->neighbors > 4 && !(ap->neighbors % 2)) {
+                       ap->machine[j].direction = (power2 & number) ?
+                               fromTableDirection(THRS, ap->neighbors) :
+                               fromTableDirection(THLS, ap->neighbors);
+               } else {
+                       ap->machine[j].direction = (power2 & number) ?
+                               fromTableDirection(TRS, ap->neighbors) :
+                               fromTableDirection(TLS, ap->neighbors);
+               }
+               ap->machine[j].next = 0;
+               power2 >>= 1;
+       }
+       ap->truchet = (ap->truchet && ap->xs > 2 && ap->ys > 2 &&
+          (ap->neighbors == 3 || ap->neighbors == 4 || ap->neighbors == 6));
+       if (MI_IS_VERBOSE(mi))
+               (void) fprintf(stdout,
+                     "ants %d, neighbors %d, Turk's number %d, colors %d\n",
+                              ap->n, ap->neighbors, number, ap->ncolors);
+}
+
+void
+init_ant(ModeInfo * mi)
+{
+       Display    *display = MI_DISPLAY(mi);
+       Window      window = MI_WINDOW(mi);
+       int         size = MI_SIZE(mi);
+       antfarmstruct *ap;
+       int         col, row, dir;
+       long        i;
+
+       /* jwz sez: small sizes look like crap */
+       if (size < 0)
+         size = NRAND(-size)+1;
+       if (size < 5)
+         size += 5;
+
+       if (antfarms == NULL) {
+               if ((antfarms = (antfarmstruct *) calloc(MI_NUM_SCREENS(mi),
+                                           sizeof (antfarmstruct))) == NULL)
+                       return;
+       }
+       ap = &antfarms[MI_SCREEN(mi)];
+       ap->redrawing = 0;
+       if (MI_NPIXELS(mi) <= 2) {
+               if (ap->stippledGC == None) {
+                       XGCValues   gcv;
+
+                       gcv.fill_style = FillOpaqueStippled;
+                       ap->stippledGC = XCreateGC(display, window, GCFillStyle, &gcv);
+               }
+               if (ap->init_bits == 0) {
+                       for (i = 1; i < NUMSTIPPLES; i++)
+                               ANTBITS(stipples[i], STIPPLESIZE, STIPPLESIZE);
+               }
+       }
+       ap->generation = 0;
+       ap->n = MI_COUNT(mi);
+       if (ap->n < -MINANTS) {
+               /* if ap->n is random ... the size can change */
+               if (ap->ants != NULL) {
+                       (void) free((void *) ap->ants);
+                       ap->ants = NULL;
+               }
+               ap->n = NRAND(-ap->n - MINANTS + 1) + MINANTS;
+       } else if (ap->n < MINANTS)
+               ap->n = MINANTS;
+
+       ap->width = MI_WIDTH(mi);
+       ap->height = MI_HEIGHT(mi);
+
+       if (neighbors == 8 || neighbors == 9 || neighbors == 12)
+               ap->neighbors = neighbors;      /* Discourage but not deny use... */
+       else
+               for (i = 0; i < NEIGHBORKINDS; i++) {
+                       if (neighbors == plots[i]) {
+                               ap->neighbors = plots[i];
+                               break;
+                       }
+                       if (i == NEIGHBORKINDS - 1) {
+                               ap->neighbors = plots[NRAND(NEIGHBORKINDS)];
+                               break;
+                       }
+               }
+
+       if (ap->neighbors == 6) {
+               int         nccols, ncrows;
+
+               if (ap->width < 2)
+                       ap->width = 2;
+               if (ap->height < 4)
+                       ap->height = 4;
+               if (size < -MINSIZE) {
+                       ap->ys = NRAND(MIN(-size, MAX(MINSIZE, MIN(ap->width, ap->height) /
+                                     MINGRIDSIZE)) - MINSIZE + 1) + MINSIZE;
+                       if (ap->ys < MINRANDOMSIZE)
+                               ap->ys = MIN(MINRANDOMSIZE,
+                                            MAX(MINSIZE, MIN(ap->width, ap->height) / MINGRIDSIZE));
+               } else if (size < MINSIZE) {
+                       if (!size)
+                               ap->ys = MAX(MINSIZE, MIN(ap->width, ap->height) / MINGRIDSIZE);
+                       else
+                               ap->ys = MINSIZE;
+               } else
+                       ap->ys = MIN(size, MAX(MINSIZE, MIN(ap->width, ap->height) /
+                                              MINGRIDSIZE));
+               ap->xs = ap->ys;
+               nccols = MAX(ap->width / ap->xs - 2, 2);
+               ncrows = MAX(ap->height / ap->ys - 1, 2);
+               ap->ncols = nccols / 2;
+               ap->nrows = 2 * (ncrows / 4);
+               ap->xb = (ap->width - ap->xs * nccols) / 2 + ap->xs / 2;
+               ap->yb = (ap->height - ap->ys * (ncrows / 2) * 2) / 2 + ap->ys;
+               for (i = 0; i < 6; i++) {
+                       ap->shape.hexagon[i].x = (ap->xs - 1) * hexagonUnit[i].x;
+                       ap->shape.hexagon[i].y = ((ap->ys - 1) * hexagonUnit[i].y / 2) * 4 / 3;
+               }
+               /* Avoid array bounds read of hexagonUnit */
+               ap->shape.hexagon[6].x = 0;
+               ap->shape.hexagon[6].y = 0;
+       } else if (ap->neighbors == 4 || ap->neighbors == 8) {
+               if (size < -MINSIZE) {
+                       ap->ys = NRAND(MIN(-size, MAX(MINSIZE, MIN(ap->width, ap->height) /
+                                     MINGRIDSIZE)) - MINSIZE + 1) + MINSIZE;
+                       if (ap->ys < MINRANDOMSIZE)
+                               ap->ys = MIN(MINRANDOMSIZE,
+                                            MAX(MINSIZE, MIN(ap->width, ap->height) / MINGRIDSIZE));
+               } else if (size < MINSIZE) {
+                       if (!size)
+                               ap->ys = MAX(MINSIZE, MIN(ap->width, ap->height) / MINGRIDSIZE);
+                       else
+                               ap->ys = MINSIZE;
+               } else
+                       ap->ys = MIN(size, MAX(MINSIZE, MIN(ap->width, ap->height) /
+                                              MINGRIDSIZE));
+               ap->xs = ap->ys;
+               ap->ncols = MAX(ap->width / ap->xs, 2);
+               ap->nrows = MAX(ap->height / ap->ys, 2);
+               ap->xb = (ap->width - ap->xs * ap->ncols) / 2;
+               ap->yb = (ap->height - ap->ys * ap->nrows) / 2;
+       } else {                /* TRI */
+               int         orient;
+
+               if (ap->width < 2)
+                       ap->width = 2;
+               if (ap->height < 2)
+                       ap->height = 2;
+               if (size < -MINSIZE) {
+                       ap->ys = NRAND(MIN(-size, MAX(MINSIZE, MIN(ap->width, ap->height) /
+                                     MINGRIDSIZE)) - MINSIZE + 1) + MINSIZE;
+                       if (ap->ys < MINRANDOMSIZE)
+                               ap->ys = MIN(MINRANDOMSIZE,
+                                            MAX(MINSIZE, MIN(ap->width, ap->height) / MINGRIDSIZE));
+               } else if (size < MINSIZE) {
+                       if (!size)
+                               ap->ys = MAX(MINSIZE, MIN(ap->width, ap->height) / MINGRIDSIZE);
+                       else
+                               ap->ys = MINSIZE;
+               } else
+                       ap->ys = MIN(size, MAX(MINSIZE, MIN(ap->width, ap->height) /
+                                              MINGRIDSIZE));
+               ap->xs = (int) (1.52 * ap->ys);
+               ap->ncols = (MAX(ap->width / ap->xs - 1, 2) / 2) * 2;
+               ap->nrows = (MAX(ap->height / ap->ys - 1, 2) / 2) * 2;
+               ap->xb = (ap->width - ap->xs * ap->ncols) / 2 + ap->xs / 2;
+               ap->yb = (ap->height - ap->ys * ap->nrows) / 2 + ap->ys;
+               for (orient = 0; orient < 2; orient++) {
+                       for (i = 0; i < 3; i++) {
+                               ap->shape.triangle[orient][i].x =
+                                       (ap->xs - 2) * triangleUnit[orient][i].x;
+                               ap->shape.triangle[orient][i].y =
+                                       (ap->ys - 2) * triangleUnit[orient][i].y;
+                       }
+                       /* Avoid array bounds read of triangleUnit */
+                       ap->shape.triangle[orient][3].x = 0;
+                       ap->shape.triangle[orient][3].y = 0;
+               }
+       }
+
+       XSetLineAttributes(display, MI_GC(mi), 1, LineSolid, CapNotLast, JoinMiter);
+       MI_CLEARWINDOW(mi);
+       ap->painted = False;
+
+       if (MI_IS_FULLRANDOM(mi)) {
+               ap->truchet = (Bool) (LRAND() & 1);
+               ap->sharpturn = (Bool) (LRAND() & 1);
+       } else {
+               ap->truchet = truchet;
+               ap->sharpturn = sharpturn;
+       }
+       /* Exclude odd # of neighbors, stepping forward not defined */
+       if (!NRAND(NUMSTIPPLES) && ((ap->neighbors + 1) % 2)) {
+               getTable(mi, (int) (NRAND(NTABLES)));
+       } else
+               getTurk(mi, (int) (NRAND(NUMSTIPPLES - 1)));
+       if (MI_NPIXELS(mi) > 2)
+               for (i = 0; i < (int) ap->ncolors - 1; i++)
+                       ap->colors[i] = (unsigned char) (NRAND(MI_NPIXELS(mi)) +
+                            i * MI_NPIXELS(mi)) / ((int) (ap->ncolors - 1));
+       if (ap->ants == NULL)
+               ap->ants = (antstruct *) malloc(ap->n * sizeof (antstruct));
+       if (ap->tape != NULL)
+               (void) free((void *) ap->tape);
+       ap->tape = (unsigned char *)
+               calloc(ap->ncols * ap->nrows, sizeof (unsigned char));
+
+       if (ap->truchet_state != NULL)
+               (void) free((void *) ap->truchet_state);
+       ap->truchet_state = (unsigned char *)
+               calloc(ap->ncols * ap->nrows, sizeof (unsigned char));
+
+       col = ap->ncols / 2;
+       row = ap->nrows / 2;
+       dir = NRAND(ap->neighbors) * ANGLES / ap->neighbors;
+       /* Have them all start in the same spot, why not? */
+       for (i = 0; i < ap->n; i++) {
+               ap->ants[i].col = col;
+               ap->ants[i].row = row;
+               ap->ants[i].direction = dir;
+               ap->ants[i].state = 0;
+       }
+       draw_anant(mi, col, row);
+}
+
+void
+draw_ant(ModeInfo * mi)
+{
+       antfarmstruct *ap = &antfarms[MI_SCREEN(mi)];
+       antstruct  *anant;
+       statestruct *status;
+       int         i, state_pos, tape_pos;
+       unsigned char color;
+       short       chg_dir, old_dir;
+
+       MI_IS_DRAWN(mi) = True;
+
+       ap->painted = True;
+       for (i = 0; i < ap->n; i++) {
+               anant = &ap->ants[i];
+               tape_pos = anant->col + anant->row * ap->ncols;
+               color = ap->tape[tape_pos];     /* read tape */
+               state_pos = color + anant->state * ap->ncolors;
+               status = &(ap->machine[state_pos]);
+               drawcell(mi, anant->col, anant->row, status->color);
+               ap->tape[tape_pos] = status->color;     /* write on tape */
+
+               /* Find direction of Bees or Ants. */
+               /* Translate relative direction to actual direction */
+               old_dir = anant->direction;
+               chg_dir = (2 * ANGLES - status->direction) % ANGLES;
+               anant->direction = (chg_dir + old_dir) % ANGLES;
+               if (ap->truchet) {
+                       int         a = 0, b;
+
+                       if (ap->neighbors == 6) {
+                               if (ap->sharpturn) {
+                                       a = (chg_dir / 120 == 2);
+                                       drawtruchet(mi, anant->col, anant->row, status->color, a);
+                               } else {
+                                       a = (old_dir / 60) % 3;
+                                       b = (anant->direction / 60) % 3;
+                                       a = (a + b + 1) % 3;
+                                       drawtruchet(mi, anant->col, anant->row, status->color, a);
+                               }
+                       } else if (ap->neighbors == 4) {
+                               a = old_dir / 180;
+                               b = anant->direction / 180;
+                               a = ((a && !b) || (b && !a));
+                               drawtruchet(mi, anant->col, anant->row, status->color, a);
+                       } else if (ap->neighbors == 3) {
+                               if (chg_dir == 240)
+                                       a = (2 + anant->direction / 120) % 3;
+                               else
+                                       a = (1 + anant->direction / 120) % 3;
+                               drawtruchet(mi, anant->col, anant->row, status->color, a);
+                       }
+                       ap->truchet_state[tape_pos] = a + 1;
+               }
+               anant->state = status->next;
+
+               /* If edge than wrap it */
+               old_dir = ((status->direction < ANGLES) ? anant->direction : old_dir);
+               position_of_neighbor(ap, old_dir, &(anant->col), &(anant->row));
+               draw_anant(mi, anant->col, anant->row);
+       }
+       if (++ap->generation > MI_CYCLES(mi)) {
+#ifdef STANDALONE
+         erase_full_window(MI_DISPLAY(mi), MI_WINDOW(mi));
+#endif
+               init_ant(mi);
+       }
+       if (ap->redrawing) {
+               for (i = 0; i < REDRAWSTEP; i++) {
+                       if (ap->tape[ap->redrawpos] ||
+                        (ap->truchet && ap->truchet_state[ap->redrawpos])) {
+                               drawcell(mi, ap->redrawpos % ap->ncols, ap->redrawpos / ap->ncols,
+                                        ap->tape[ap->redrawpos]);
+                               if (ap->truchet)
+                                       drawtruchet(mi, ap->redrawpos % ap->ncols, ap->redrawpos / ap->ncols,
+                                                   ap->tape[ap->redrawpos],
+                                       ap->truchet_state[ap->redrawpos] - 1);
+                       }
+                       if (++(ap->redrawpos) >= ap->ncols * ap->nrows) {
+                               ap->redrawing = 0;
+                               break;
+                       }
+               }
+       }
+}
+
+void
+release_ant(ModeInfo * mi)
+{
+       if (antfarms != NULL) {
+               int         screen;
+
+               for (screen = 0; screen < MI_NUM_SCREENS(mi); screen++) {
+                       antfarmstruct *ap = &antfarms[screen];
+                       int         shade;
+
+                       if (ap->stippledGC != None) {
+                               XFreeGC(MI_DISPLAY(mi), ap->stippledGC);
+                       }
+                       for (shade = 0; shade < ap->init_bits; shade++)
+                               XFreePixmap(MI_DISPLAY(mi), ap->pixmaps[shade]);
+                       if (ap->tape != NULL)
+                               (void) free((void *) ap->tape);
+                       if (ap->ants != NULL)
+                               (void) free((void *) ap->ants);
+                       if (ap->truchet_state != NULL)
+                               (void) free((void *) ap->truchet_state);
+               }
+               (void) free((void *) antfarms);
+               antfarms = NULL;
+       }
+}
+
+void
+refresh_ant(ModeInfo * mi)
+{
+       antfarmstruct *ap = &antfarms[MI_SCREEN(mi)];
+
+       if (ap->painted) {
+               MI_CLEARWINDOW(mi);
+               ap->redrawing = 1;
+               ap->redrawpos = 0;
+       }
+}
diff --git a/hacks/attraction.c b/hacks/attraction.c
new file mode 100644 (file)
index 0000000..1a84833
--- /dev/null
@@ -0,0 +1,667 @@
+/* xscreensaver, Copyright (c) 1992, 1995, 1996, 1997, 1998
+ *  Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software 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.  No representations are made about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or 
+ * implied warranty.
+ */
+
+/* Simulation of a pair of quasi-gravitational fields, maybe sorta kinda
+   a little like the strong and weak electromagnetic forces.  Derived from
+   a Lispm screensaver by John Pezaris <pz@mit.edu>.  Mouse control and
+   viscosity added by "Philip Edward Cutone, III" <pc2d+@andrew.cmu.edu>.
+
+   John sez:
+
+   The simulation started out as a purely accurate gravitational simulation,
+   but, with constant simulation step size, I quickly realized the field being
+   simulated while grossly gravitational was, in fact, non-conservative.  It
+   also had the rather annoying behavior of dealing very badly with colliding
+   orbs.  Therefore, I implemented a negative-gravity region (with two
+   thresholds; as I read your code, you only implemented one) to prevent orbs
+   from every coming too close together, and added a viscosity factor if the
+   speed of any orb got too fast.  This provides a nice stable system with
+   interesting behavior.
+
+   I had experimented with a number of fields including the van der Waals
+   force (very interesting orbiting behavior) and 1/r^3 gravity (not as
+   interesting as 1/r^2).  An even normal viscosity (rather than the
+   thresholded version to bleed excess energy) is also not interesting.
+   The 1/r^2, -1/r^2, -10/r^2 thresholds proved not only robust but also
+   interesting -- the orbs never collided and the threshold viscosity fixed
+   the non-conservational problem.
+
+   Philip sez:
+   > An even normal viscosity (rather than the thresholded version to
+   > bleed excess energy) is also not interesting.
+
+   unless you make about 200 points.... set the viscosity to about .8
+   and drag the mouse through it.   it makes a nice wave which travels
+   through the field.
+
+   And (always the troublemaker) Joe Keane <jgk@jgk.org> sez:
+
+   Despite what John sez, the field being simulated is always conservative.
+   The real problem is that it uses a simple hack, computing acceleration
+   *based only on the starting position*, instead of a real differential
+   equation solver.  Thus you'll always have energy coming out of nowhere,
+   although it's most blatant when balls get close together.  If it were
+   done right, you wouldn't need viscosity or artificial limits on how
+   close the balls can get.
+ */
+
+#include <stdio.h>
+#include <math.h>
+#include "screenhack.h"
+#include "spline.h"
+
+struct ball {
+  double x, y;
+  double vx, vy;
+  double dx, dy;
+  double mass;
+  int size;
+  int pixel_index;
+  int hue;
+};
+
+static struct ball *balls;
+static int npoints;
+static int threshold;
+static int delay;
+static int global_size;
+static int segments;
+static Bool glow_p;
+static Bool orbit_p;
+static XPoint *point_stack;
+static int point_stack_size, point_stack_fp;
+static XColor *colors;
+static int ncolors;
+static int fg_index;
+static int color_shift;
+
+/*flip mods for mouse interaction*/
+static Bool mouse_p;
+int mouse_x, mouse_y, mouse_mass, root_x, root_y;
+static double viscosity;
+
+static enum object_mode {
+  ball_mode, line_mode, polygon_mode, spline_mode, spline_filled_mode,
+  tail_mode
+} mode;
+
+static GC draw_gc, erase_gc;
+
+#define MAX_SIZE 16
+
+#define min(a,b) ((a)<(b)?(a):(b))
+#define max(a,b) ((a)>(b)?(a):(b))
+
+static void
+init_balls (Display *dpy, Window window)
+{
+  int i;
+  XWindowAttributes xgwa;
+  XGCValues gcv;
+  int xlim, ylim, midx, midy, r, vx, vy;
+  double th;
+  Colormap cmap;
+  char *mode_str;
+  XGetWindowAttributes (dpy, window, &xgwa);
+  xlim = xgwa.width;
+  ylim = xgwa.height;
+  cmap = xgwa.colormap;
+  midx = xlim/2;
+  midy = ylim/2;
+  r = get_integer_resource ("radius", "Integer");
+  if (r <= 0 || r > min (xlim/2, ylim/2))
+    r = min (xlim/2, ylim/2) - 50;
+  vx = get_integer_resource ("vx", "Integer");
+  vy = get_integer_resource ("vy", "Integer");
+  npoints = get_integer_resource ("points", "Integer");
+  if (npoints < 1)
+    npoints = 3 + (random () % 5);
+  balls = (struct ball *) malloc (npoints * sizeof (struct ball));
+  segments = get_integer_resource ("segments", "Integer");
+  if (segments < 0) segments = 1;
+  threshold = get_integer_resource ("threshold", "Integer");
+  if (threshold < 0) threshold = 0;
+  delay = get_integer_resource ("delay", "Integer");
+    if (delay < 0) delay = 0;
+  global_size = get_integer_resource ("size", "Integer");
+  if (global_size < 0) global_size = 0;
+  glow_p = get_boolean_resource ("glow", "Boolean");
+  orbit_p = get_boolean_resource ("orbit", "Boolean");
+  color_shift = get_integer_resource ("colorShift", "Integer");
+  if (color_shift <= 0) color_shift = 5;
+
+  /*flip mods for mouse interaction*/
+  mouse_p = get_boolean_resource ("mouse", "Boolean");
+  mouse_mass = get_integer_resource ("mouseSize", "Integer");
+  mouse_mass =  mouse_mass *  mouse_mass *10;
+
+  viscosity = get_float_resource ("viscosity", "Float");
+
+  mode_str = get_string_resource ("mode", "Mode");
+  if (! mode_str) mode = ball_mode;
+  else if (!strcmp (mode_str, "balls")) mode = ball_mode;
+  else if (!strcmp (mode_str, "lines")) mode = line_mode;
+  else if (!strcmp (mode_str, "polygons")) mode = polygon_mode;
+  else if (!strcmp (mode_str, "tails")) mode = tail_mode;
+  else if (!strcmp (mode_str, "splines")) mode = spline_mode;
+  else if (!strcmp (mode_str, "filled-splines")) mode = spline_filled_mode;
+  else {
+    fprintf (stderr,
+            "%s: mode must be balls, lines, tails, polygons, splines, or\n\
+       filled-splines, not \"%s\"\n",
+            progname, mode_str);
+    exit (1);
+  }
+
+  if (mode != ball_mode && mode != tail_mode) glow_p = False;
+  
+  if (mode == polygon_mode && npoints < 3)
+    mode = line_mode;
+
+  ncolors = get_integer_resource ("colors", "Colors");
+  if (ncolors < 2) ncolors = 2;
+  if (ncolors <= 2) mono_p = True;
+  colors = 0;
+
+  if (!mono_p)
+    {
+      fg_index = 0;
+      switch (mode)
+       {
+       case ball_mode:
+         if (glow_p)
+           {
+             int H = random() % 360;
+             double S1 = 0.25;
+             double S2 = 1.00;
+             double V = frand(0.25) + 0.75;
+             colors = (XColor *) malloc(sizeof(*colors) * (ncolors+1));
+             make_color_ramp (dpy, cmap, H, S1, V, H, S2, V, colors, &ncolors,
+                              False, True, False);
+           }
+         else
+           {
+             ncolors = npoints;
+             colors = (XColor *) malloc(sizeof(*colors) * (ncolors+1));
+             make_random_colormap (dpy, xgwa.visual, cmap, colors, &ncolors,
+                                   True, True, False, True);
+           }
+         break;
+       case line_mode:
+       case polygon_mode:
+       case spline_mode:
+       case spline_filled_mode:
+       case tail_mode:
+         colors = (XColor *) malloc(sizeof(*colors) * (ncolors+1));
+         make_smooth_colormap (dpy, xgwa.visual, cmap, colors, &ncolors,
+                               True, False, True);
+         break;
+       default:
+         abort ();
+       }
+    }
+
+  if (!mono_p && ncolors <= 2)
+    {
+      if (colors) free (colors);
+      colors = 0;
+      mono_p = True;
+    }
+
+  if (mode != ball_mode)
+    {
+      int size = (segments ? segments : 1);
+      point_stack_size = size * (npoints + 1);
+      point_stack = (XPoint *) calloc (point_stack_size, sizeof (XPoint));
+      point_stack_fp = 0;
+    }
+
+  gcv.line_width = (mode == tail_mode
+                   ? (global_size ? global_size : (MAX_SIZE * 2 / 3))
+                   : 1);
+  gcv.cap_style = (mode == tail_mode ? CapRound : CapButt);
+
+  if (mono_p)
+    gcv.foreground = get_pixel_resource("foreground", "Foreground", dpy, cmap);
+  else
+    gcv.foreground = colors[fg_index].pixel;
+  draw_gc = XCreateGC (dpy, window, GCForeground|GCLineWidth|GCCapStyle, &gcv);
+
+  gcv.foreground = get_pixel_resource("background", "Background", dpy, cmap);
+  erase_gc = XCreateGC (dpy, window, GCForeground|GCLineWidth|GCCapStyle,&gcv);
+
+
+#define rand_size() min (MAX_SIZE, 8 + (random () % (MAX_SIZE - 9)))
+
+  if (orbit_p && !global_size)
+    /* To orbit, all objects must be the same mass, or the math gets
+       really hairy... */
+    global_size = rand_size ();
+
+  th = frand (M_PI+M_PI);
+  for (i = 0; i < npoints; i++)
+    {
+      int new_size = (global_size ? global_size : rand_size ());
+      balls [i].dx = 0;
+      balls [i].dy = 0;
+      balls [i].size = new_size;
+      balls [i].mass = (new_size * new_size * 10);
+      balls [i].x = midx + r * cos (i * ((M_PI+M_PI) / npoints) + th);
+      balls [i].y = midy + r * sin (i * ((M_PI+M_PI) / npoints) + th);
+      if (! orbit_p)
+       {
+         balls [i].vx = vx ? vx : ((6.0 - (random () % 11)) / 8.0);
+         balls [i].vy = vy ? vy : ((6.0 - (random () % 11)) / 8.0);
+       }
+      if (mono_p || mode != ball_mode)
+       balls [i].pixel_index = -1;
+      else if (glow_p)
+       balls [i].pixel_index = 0;
+      else
+       balls [i].pixel_index = random() % ncolors;
+    }
+
+  if (orbit_p)
+    {
+      double a = 0;
+      double v;
+      double v_mult = get_float_resource ("vMult", "Float");
+      if (v_mult == 0.0) v_mult = 1.0;
+
+      for (i = 1; i < npoints; i++)
+       {
+          double _2ipi_n = (2 * i * M_PI / npoints);
+         double x = r * cos (_2ipi_n);
+         double y = r * sin (_2ipi_n);
+         double distx = r - x;
+         double dist2 = (distx * distx) + (y * y);
+          double dist = sqrt (dist2);
+          double a1 = ((balls[i].mass / dist2) *
+                       ((dist < threshold) ? -1.0 : 1.0) *
+                       (distx / dist));
+         a += a1;
+       }
+      if (a < 0.0)
+       {
+         fprintf (stderr, "%s: domain error: forces on balls too great\n",
+                  progname);
+         exit (-1);
+       }
+      v = sqrt (a * r) * v_mult;
+      for (i = 0; i < npoints; i++)
+       {
+         double k = ((2 * i * M_PI / npoints) + th);
+         balls [i].vx = -v * sin (k);
+         balls [i].vy =  v * cos (k);
+       }
+    }
+
+  if (mono_p) glow_p = False;
+  XClearWindow (dpy, window);
+}
+
+static void
+compute_force (int i, double *dx_ret, double *dy_ret)
+{
+  int j;
+  double x_dist, y_dist, dist, dist2;
+  *dx_ret = 0;
+  *dy_ret = 0;
+  for (j = 0; j < npoints; j++)
+    {
+      if (i == j) continue;
+      x_dist = balls [j].x - balls [i].x;
+      y_dist = balls [j].y - balls [i].y;
+      dist2 = (x_dist * x_dist) + (y_dist * y_dist);
+      dist = sqrt (dist2);
+             
+      if (dist > 0.1) /* the balls are not overlapping */
+       {
+         double new_acc = ((balls[j].mass / dist2) *
+                           ((dist < threshold) ? -1.0 : 1.0));
+         double new_acc_dist = new_acc / dist;
+         *dx_ret += new_acc_dist * x_dist;
+         *dy_ret += new_acc_dist * y_dist;
+       }
+      else
+       {               /* the balls are overlapping; move randomly */
+         *dx_ret += (frand (10.0) - 5.0);
+         *dy_ret += (frand (10.0) - 5.0);
+       }
+    }
+
+  if (mouse_p)
+    {
+      x_dist = mouse_x - balls [i].x;
+      y_dist = mouse_y - balls [i].y;
+      dist2 = (x_dist * x_dist) + (y_dist * y_dist);
+      dist = sqrt (dist2);
+       
+      if (dist > 0.1) /* the balls are not overlapping */
+       {
+         double new_acc = ((mouse_mass / dist2) *
+                           ((dist < threshold) ? -1.0 : 1.0));
+         double new_acc_dist = new_acc / dist;
+         *dx_ret += new_acc_dist * x_dist;
+         *dy_ret += new_acc_dist * y_dist;
+       }
+      else
+       {               /* the balls are overlapping; move randomly */
+         *dx_ret += (frand (10.0) - 5.0);
+         *dy_ret += (frand (10.0) - 5.0);
+       }
+    }
+}
+
+static void
+run_balls (Display *dpy, Window window)
+{
+  int last_point_stack_fp = point_stack_fp;
+  static int tick = 500, xlim, ylim;
+  static Colormap cmap;
+  int i;
+
+  /*flip mods for mouse interaction*/
+  Window  root1, child1;
+  unsigned int mask;
+  if (mouse_p)
+    {
+      XQueryPointer(dpy, window, &root1, &child1,
+                   &root_x, &root_y, &mouse_x, &mouse_y, &mask);
+    }
+
+  if (tick++ == 500)
+    {
+      XWindowAttributes xgwa;
+      XGetWindowAttributes (dpy, window, &xgwa);
+      tick = 0;
+      xlim = xgwa.width;
+      ylim = xgwa.height;
+      cmap = xgwa.colormap;
+    }
+
+  /* compute the force of attraction/repulsion among all balls */
+  for (i = 0; i < npoints; i++)
+    compute_force (i, &balls[i].dx, &balls[i].dy);
+
+  /* move the balls according to the forces now in effect */
+  for (i = 0; i < npoints; i++)
+    {
+      double old_x = balls[i].x;
+      double old_y = balls[i].y;
+      double new_x, new_y;
+      int size = balls[i].size;
+      balls[i].vx += balls[i].dx;
+      balls[i].vy += balls[i].dy;
+
+      /* don't let them get too fast: impose a terminal velocity
+         (actually, make the medium have friction) */
+      if (balls[i].vx > 10)
+       {
+         balls[i].vx *= 0.9;
+         balls[i].dx = 0;
+       }
+      else if (viscosity != 1)
+       {
+         balls[i].vx *= viscosity;
+       }
+
+      if (balls[i].vy > 10)
+       {
+         balls[i].vy *= 0.9;
+         balls[i].dy = 0;
+       }
+      else if (viscosity != 1)
+       {
+         balls[i].vy *= viscosity;
+       }
+
+      balls[i].x += balls[i].vx;
+      balls[i].y += balls[i].vy;
+
+      /* bounce off the walls */
+      if (balls[i].x >= (xlim - balls[i].size))
+       {
+         balls[i].x = (xlim - balls[i].size - 1);
+         if (balls[i].vx > 0)
+           balls[i].vx = -balls[i].vx;
+       }
+      if (balls[i].y >= (ylim - balls[i].size))
+       {
+         balls[i].y = (ylim - balls[i].size - 1);
+         if (balls[i].vy > 0)
+           balls[i].vy = -balls[i].vy;
+       }
+      if (balls[i].x <= 0)
+       {
+         balls[i].x = 0;
+         if (balls[i].vx < 0)
+           balls[i].vx = -balls[i].vx;
+       }
+      if (balls[i].y <= 0)
+       {
+         balls[i].y = 0;
+         if (balls[i].vy < 0)
+           balls[i].vy = -balls[i].vy;
+       }
+
+      new_x = balls[i].x;
+      new_y = balls[i].y;
+
+      if (!mono_p)
+       {
+         if (mode == ball_mode)
+           {
+             if (glow_p)
+               {
+                 /* make color saturation be related to particle
+                    acceleration. */
+                 double limit = 0.5;
+                 double s, fraction;
+                 double vx = balls [i].dx;
+                 double vy = balls [i].dy;
+                 if (vx < 0) vx = -vx;
+                 if (vy < 0) vy = -vy;
+                 fraction = vx + vy;
+                 if (fraction > limit) fraction = limit;
+
+                 s = 1 - (fraction / limit);
+                 balls[i].pixel_index = (ncolors * s);
+               }
+             XSetForeground (dpy, draw_gc,
+                             colors[balls[i].pixel_index].pixel);
+           }
+       }
+
+      if (mode == ball_mode)
+       {
+         XFillArc (dpy, window, erase_gc, (int) old_x, (int) old_y,
+                   size, size, 0, 360*64);
+         XFillArc (dpy, window, draw_gc,  (int) new_x, (int) new_y,
+                   size, size, 0, 360*64);
+       }
+      else
+       {
+         point_stack [point_stack_fp].x = new_x;
+         point_stack [point_stack_fp].y = new_y;
+         point_stack_fp++;
+       }
+    }
+
+  /* draw the lines or polygons after computing all points */
+  if (mode != ball_mode)
+    {
+      point_stack [point_stack_fp].x = balls [0].x; /* close the polygon */
+      point_stack [point_stack_fp].y = balls [0].y;
+      point_stack_fp++;
+      if (point_stack_fp == point_stack_size)
+       point_stack_fp = 0;
+      else if (point_stack_fp > point_stack_size) /* better be aligned */
+       abort ();
+      if (!mono_p)
+       {
+         static int tick = 0;
+         if (tick++ == color_shift)
+           {
+             tick = 0;
+             fg_index = (fg_index + 1) % ncolors;
+             XSetForeground (dpy, draw_gc, colors[fg_index].pixel);
+           }
+       }
+    }
+
+  switch (mode)
+    {
+    case ball_mode:
+      break;
+    case line_mode:
+      if (segments > 0)
+       XDrawLines (dpy, window, erase_gc, point_stack + point_stack_fp,
+                   npoints + 1, CoordModeOrigin);
+      XDrawLines (dpy, window, draw_gc, point_stack + last_point_stack_fp,
+                 npoints + 1, CoordModeOrigin);
+      break;
+    case polygon_mode:
+      if (segments > 0)
+       XFillPolygon (dpy, window, erase_gc, point_stack + point_stack_fp,
+                     npoints + 1, (npoints == 3 ? Convex : Complex),
+                     CoordModeOrigin);
+      XFillPolygon (dpy, window, draw_gc, point_stack + last_point_stack_fp,
+                   npoints + 1, (npoints == 3 ? Convex : Complex),
+                   CoordModeOrigin);
+      break;
+    case tail_mode:
+      {
+       for (i = 0; i < npoints; i++)
+         {
+           int index = point_stack_fp + i;
+           int next_index = (index + (npoints + 1)) % point_stack_size;
+           XDrawLine (dpy, window, erase_gc,
+                      point_stack [index].x,
+                      point_stack [index].y,
+                      point_stack [next_index].x,
+                      point_stack [next_index].y);
+
+           index = last_point_stack_fp + i;
+           next_index = (index - (npoints + 1)) % point_stack_size;
+           if (next_index < 0) next_index += point_stack_size;
+           if (point_stack [next_index].x == 0 &&
+               point_stack [next_index].y == 0)
+             continue;
+           XDrawLine (dpy, window, draw_gc,
+                      point_stack [index].x,
+                      point_stack [index].y,
+                      point_stack [next_index].x,
+                      point_stack [next_index].y);
+         }
+      }
+      break;
+    case spline_mode:
+    case spline_filled_mode:
+      {
+       static spline *s = 0;
+       if (! s) s = make_spline (npoints);
+       if (segments > 0)
+         {
+           for (i = 0; i < npoints; i++)
+             {
+               s->control_x [i] = point_stack [point_stack_fp + i].x;
+               s->control_y [i] = point_stack [point_stack_fp + i].y;
+             }
+           compute_closed_spline (s);
+           if (mode == spline_filled_mode)
+             XFillPolygon (dpy, window, erase_gc, s->points, s->n_points,
+                           (s->n_points == 3 ? Convex : Complex),
+                           CoordModeOrigin);
+           else
+             XDrawLines (dpy, window, erase_gc, s->points, s->n_points,
+                         CoordModeOrigin);
+         }
+       for (i = 0; i < npoints; i++)
+         {
+           s->control_x [i] = point_stack [last_point_stack_fp + i].x;
+           s->control_y [i] = point_stack [last_point_stack_fp + i].y;
+         }
+       compute_closed_spline (s);
+       if (mode == spline_filled_mode)
+         XFillPolygon (dpy, window, draw_gc, s->points, s->n_points,
+                       (s->n_points == 3 ? Convex : Complex),
+                       CoordModeOrigin);
+       else
+         XDrawLines (dpy, window, draw_gc, s->points, s->n_points,
+                     CoordModeOrigin);
+      }
+      break;
+    default:
+      abort ();
+    }
+
+  XSync (dpy, False);
+}
+
+\f
+char *progclass = "Attraction";
+
+char *defaults [] = {
+  ".background:        black",
+  ".foreground:        white",
+  "*mode:      balls",
+  "*points:    0",
+  "*size:      0",
+  "*colors:    200",
+  "*threshold: 100",
+  "*delay:     10000",
+  "*glow:      false",
+  "*mouseSize: 10",
+  "*mouse:     false",
+  "*viscosity: 1",
+  "*orbit:     false",
+  "*colorShift:        3",
+  "*segments:  500",
+  "*vMult:     0.9",
+  0
+};
+
+XrmOptionDescRec options [] = {
+  { "-mode",           ".mode",        XrmoptionSepArg, 0 },
+  { "-colors",         ".colors",      XrmoptionSepArg, 0 },
+  { "-points",         ".points",      XrmoptionSepArg, 0 },
+  { "-color-shift",    ".colorShift",  XrmoptionSepArg, 0 },
+  { "-threshold",      ".threshold",   XrmoptionSepArg, 0 },
+  { "-segments",       ".segments",    XrmoptionSepArg, 0 },
+  { "-delay",          ".delay",       XrmoptionSepArg, 0 },
+  { "-size",           ".size",        XrmoptionSepArg, 0 },
+  { "-radius",         ".radius",      XrmoptionSepArg, 0 },
+  { "-vx",             ".vx",          XrmoptionSepArg, 0 },
+  { "-vy",             ".vy",          XrmoptionSepArg, 0 },
+  { "-vmult",          ".vMult",       XrmoptionSepArg, 0 },
+  { "-mouse-size",     ".mouseSize",   XrmoptionSepArg, 0 },
+  { "-mouse",          ".mouse",       XrmoptionNoArg, "true" },
+  { "-nomouse",                ".mouse",       XrmoptionNoArg, "false" },
+  { "-viscosity",      ".viscosity",   XrmoptionSepArg, 0 },
+  { "-glow",           ".glow",        XrmoptionNoArg, "true" },
+  { "-noglow",         ".glow",        XrmoptionNoArg, "false" },
+  { "-orbit",          ".orbit",       XrmoptionNoArg, "true" },
+  { 0, 0, 0, 0 }
+};
+
+void
+screenhack (Display *dpy, Window window)
+{
+  init_balls (dpy, window);
+  while (1)
+    {
+      run_balls (dpy, window);
+      screenhack_handle_events (dpy);
+      if (delay) usleep (delay);
+    }
+}
diff --git a/hacks/attraction.man b/hacks/attraction.man
new file mode 100644 (file)
index 0000000..fabdc8a
--- /dev/null
@@ -0,0 +1,178 @@
+.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
+..
+.TH XScreenSaver 1 "14-Jun-97" "X Version 11"
+.SH NAME
+attraction - interactions of opposing forces
+.SH SYNOPSIS
+.B attraction
+[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-points \fIint\fP] [\-threshold \fIint\fP] [\-mode balls | lines | polygons | splines | filled-splines | tails ] [\-size \fIint\fP] [\-segments \fIint\fP] [\-delay \fIusecs\fP] [\-color-shift \fIint\fP] [\-radius \fIint\fP] [\-vx \fIint\fP] [\-vy \fIint\fP] [\-glow] [\-noglow] [\-orbit] [\-viscosity \fIfloat\fP] [\-mouse] [\-no-mouse] [\-mouse-size]
+.SH DESCRIPTION
+The \fIattraction\fP program has several visually different modes of 
+operation, all of which are based on the interactions of a set of control
+points which attract each other up to a certain distance, and then begin
+to repel each other.  The attraction/repulsion is proportional to the 
+distance between any two particles.
+.SH OPTIONS
+.I attraction
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window.  This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-mono 
+If on a color display, pretend we're on a monochrome display.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use.  Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-points integer
+How many control points should be used, or 0 to select the number randomly.
+Default 0.  Between 3 and 15 works best.
+.TP 8
+.B \-threshold integer
+The distance (in pixels) from each particle at which the attractive force
+becomes repulsive.  Default 100.
+.TP 8
+.B \-mode "balls | lines | polygons | tails | splines | filled-splines"
+In \fIballs\fP mode (the default) the control points are drawn as filled
+circles.  The larger the circle, the more massive the particle.
+
+In \fIlines\fP mode, the control points are connected by straight lines;
+the effect is something like \fIqix\fP.
+
+In \fIpolygons\fP mode, the control points are connected by straight
+lines, and filled in.  This is most interesting in color.
+
+In \fIsplines\fP mode, a closed spline is interpolated from the control 
+points.
+
+In \fIfilled-splines\fP mode, the splines are filled in instead of being
+outlines.  This is most interesting in color.
+
+In \fItails\fP mode, the path which each particle follows is indicated
+by a worm-like trail, whose length is controlled by the \fIsegments\fP
+parameter.
+.TP 8
+.B \-size integer
+The size of the balls in pixels, or 0, meaning to select the sizes 
+randomly (the default.)  If this is specified, then all balls will be 
+the same size.  This option has an effect in all modes, since the ``size''
+of the balls controls their mass.
+.TP 8
+.B \-segments integer
+If in \fIlines\fP or \fIpolygons\fP mode, how many sets of line segments
+or polygons should be drawn. Default 100.  This has no effect in \fIballs\fP
+mode.  If \fIsegments\fP is 0, then no segments will ever be erased (this
+is only useful in color.)
+.TP 8
+.B \-delay microseconds
+How much of a delay should be introduced between steps of the animation.
+Default 10000, or about 0.01 seconds.
+.TP 8
+.B \-color-shift int
+If on a color display, the color of the line segments or polygons will 
+cycle through the color map.  This specifies how many lines will be drawn
+before a new color is chosen.  (When a small number of colors are available,
+increasing this value will yield smoother transitions.)  Default 3.
+This has no effect in \fIballs\fP mode.
+.TP 8
+.B \-radius
+The size in pixels of the circle on which the points are initially positioned.
+The default is slightly smaller than the size of the window.
+.TP 8
+.B \-glow
+This is consulted only in \fIballs\fP mode.  If this is specified, then 
+the saturation of the colors of the points will vary according to their
+current acceleration.  This has the effect that the balls flare brighter
+when they are reacting to each other most strongly.
+
+In \fIglow\fP mode, all of the balls will be drawn the same (random)
+color, modulo the saturation shifts.  In non-glow mode, the balls will
+each be drawn in a random color that doesn't change.
+.TP 8
+.B \-noglow
+Don't do ``glowing.''  This is the default.
+.TP 8
+.B \-vx pixels
+.TP 8
+.B \-vy pixels
+Initial velocity of the balls.  This has no effect in \fB\-orbit\fP mode.
+.TP 8
+.B \-orbit
+Make the initial force on each ball be tangential to the circle on which
+they are initially placed, with the right velocity to hold them in orbit
+about each other.  After a while, roundoff errors will cause the orbit
+to decay.
+.TP 8
+.B \-vmult float
+In orbit mode, the initial velocity of the balls is multiplied by this;
+a number less than 1 will make the balls pull closer together, and a larger
+number will make them move apart.  The default is 0.9, meaning a slight
+inward pull.
+.TP 8
+.B \-viscosity float
+This sets the viscosity of the hypothetical fluid through which the control
+points move; the default is 1, meaning no resistance.  Values higher than 1
+aren't interesting; lower values cause less motion.
+
+One interesting thing to try is
+.EX
+attraction -viscosity 0.8 -points 75 \\
+  -mouse -geometry =500x500
+.EE
+Give it a few seconds to settle down into a stable clump, and then move
+the mouse through it to make "waves".
+.TP 8
+.B \-mouse
+This will cause the mouse to be considered a control point; it will not be
+drawn, but it will influence the other points, so you can wave the mouse
+and influence the images being created.
+.TP 8
+.B \-no-mouse
+Turns off \fB\-mouse\fP.
+.TP 8
+.B \-mouse-size integer
+In \fB\-mouse\fP mode, this sets the mass of the mouse (analagously to the
+\fB\-size\fP parameter.)
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 1992, 1993, 1997 by Jamie Zawinski.  Permission to use, copy,
+modify, distribute, and sell this software 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.  No representations are
+made about the suitability of this software for any purpose.  It is provided
+"as is" without express or implied warranty.
+.SH AUTHOR
+Jamie Zawinski <jwz@jwz.org>, 13-aug-92.
+
+Viscosity and mouse support by Philip Edward Cutone, III.
diff --git a/hacks/automata.h b/hacks/automata.h
new file mode 100644 (file)
index 0000000..b35f542
--- /dev/null
@@ -0,0 +1,61 @@
+/* -*- Mode: C; tab-width: 4 -*- */
+/*-
+ * automata.c - special stuff for automata modes
+ *
+ * Copyright (c) 1995 by David Bagley.
+ *
+ * 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.
+ *
+ * This file is provided AS IS with no warranties of any kind.  The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof.  In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ */
+
+#define NUMSTIPPLES 11
+#define STIPPLESIZE 8
+
+static XPoint hexagonUnit[6] =
+{
+       {0, 0},
+       {1, 1},
+       {0, 2},
+       {-1, 1},
+       {-1, -1},
+       {0, -2}
+};
+
+static XPoint triangleUnit[2][3] =
+{
+       {
+               {0, 0},
+               {1, -1},
+               {0, 2}
+       },
+       {
+               {0, 0},
+               {-1, 1},
+               {0, -2}
+       }
+};
+
+
+static unsigned char stipples[NUMSTIPPLES][STIPPLESIZE] =
+{
+       {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},       /* white */
+       {0x11, 0x22, 0x11, 0x22, 0x11, 0x22, 0x11, 0x22},       /* grey+white | stripe */
+       {0x00, 0x66, 0x66, 0x00, 0x00, 0x66, 0x66, 0x00},       /* spots */
+       {0x88, 0x44, 0x22, 0x11, 0x88, 0x44, 0x22, 0x11},       /* lt. / stripe */
+       {0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66},       /* | bars */
+       {0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa},       /* 50% grey */
+       {0xff, 0xff, 0x00, 0x00, 0xff, 0xff, 0x00, 0x00},       /* - bars */
+       {0xee, 0xdd, 0xbb, 0x77, 0xee, 0xdd, 0xbb, 0x77},       /* dark \ stripe */
+       {0xff, 0x99, 0x99, 0xff, 0xff, 0x99, 0x99, 0xff},       /* spots */
+       {0xaa, 0xff, 0xff, 0x55, 0xaa, 0xff, 0xff, 0x55},       /* black+grey - stripe */
+       {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}        /* black */
+};
diff --git a/hacks/blitspin.c b/hacks/blitspin.c
new file mode 100644 (file)
index 0000000..1c52725
--- /dev/null
@@ -0,0 +1,368 @@
+/* xscreensaver, Copyright (c) 1992-1997 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software 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.  No representations are made about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or 
+ * implied warranty.
+ */
+
+/* Rotate a bitmap using using bitblts.
+   The bitmap must be square, and must be a power of 2 in size.
+   This was translated from SmallTalk code which appeared in the
+   August 1981 issue of Byte magazine.
+
+   The input bitmap may be non-square, it is padded and centered
+   with the background color.  Another way would be to subdivide
+   the bitmap into square components and rotate them independently
+   (and preferably in parallel), but I don't think that would be as
+   interesting looking.
+
+   It's too bad almost nothing uses blitter hardware these days,
+   or this might actually win.
+ */
+
+#include "screenhack.h"
+#include <stdio.h>
+
+#ifdef HAVE_XPM
+# include <X11/xpm.h>
+# ifndef PIXEL_ALREADY_TYPEDEFED
+#  define PIXEL_ALREADY_TYPEDEFED /* Sigh, Xmu/Drawing.h needs this... */
+# endif
+#endif
+
+#ifdef HAVE_XMU
+# ifndef VMS
+#  include <X11/Xmu/Drawing.h>
+#else  /* VMS */
+#  include <Xmu/Drawing.h>
+# endif /* VMS */
+#endif
+
+#include "images/som.xbm"
+
+static Display *dpy;
+static Window window;
+static unsigned int size;
+static Pixmap self, temp, mask;
+static GC SET, CLR, CPY, IOR, AND, XOR;
+static GC gc;
+static int delay, delay2;
+static Pixmap bitmap;
+static int depth;
+static unsigned int fg, bg;
+
+static void display (Pixmap);
+
+#define copy_all_to(from, xoff, yoff, to, gc)          \
+  XCopyArea (dpy, (from), (to), (gc), 0, 0,            \
+            size-(xoff), size-(yoff), (xoff), (yoff))
+
+#define copy_all_from(to, xoff, yoff, from, gc)                \
+  XCopyArea (dpy, (from), (to), (gc), (xoff), (yoff),  \
+            size-(xoff), size-(yoff), 0, 0)
+
+static void
+rotate (void)
+{
+  int qwad; /* fuckin' C, man... who needs namespaces? */
+  XFillRectangle (dpy, mask, CLR, 0, 0, size, size);
+  XFillRectangle (dpy, mask, SET, 0, 0, size>>1, size>>1);
+  for (qwad = size>>1; qwad > 0; qwad>>=1)
+    {
+      if (delay) usleep (delay);
+      copy_all_to   (mask,       0,       0, temp, CPY);  /* 1 */
+      copy_all_to   (mask,       0,    qwad, temp, IOR);  /* 2 */
+      copy_all_to   (self,       0,       0, temp, AND);  /* 3 */
+      copy_all_to   (temp,       0,       0, self, XOR);  /* 4 */
+      copy_all_from (temp,    qwad,       0, self, XOR);  /* 5 */
+      copy_all_from (self,    qwad,       0, self, IOR);  /* 6 */
+      copy_all_to   (temp,    qwad,       0, self, XOR);  /* 7 */
+      copy_all_to   (self,       0,       0, temp, CPY);  /* 8 */
+      copy_all_from (temp,    qwad,    qwad, self, XOR);  /* 9 */
+      copy_all_to   (mask,       0,       0, temp, AND);  /* A */
+      copy_all_to   (temp,       0,       0, self, XOR);  /* B */
+      copy_all_to   (temp,    qwad,    qwad, self, XOR);  /* C */
+      copy_all_from (mask, qwad>>1, qwad>>1, mask, AND);  /* D */
+      copy_all_to   (mask,    qwad,       0, mask, IOR);  /* E */
+      copy_all_to   (mask,       0,    qwad, mask, IOR);  /* F */
+      display (self);
+    }
+}
+
+static void
+read_bitmap (char *bitmap_name, int *widthP, int *heightP)
+{
+#ifdef HAVE_XPM
+  XWindowAttributes xgwa;
+  XpmAttributes xpmattrs;
+  int result;
+  xpmattrs.valuemask = 0;
+  bitmap = 0;
+
+  XGetWindowAttributes (dpy, window, &xgwa);
+
+# ifdef XpmCloseness
+  xpmattrs.valuemask |= XpmCloseness;
+  xpmattrs.closeness = 40000;
+# endif
+# ifdef XpmVisual
+  xpmattrs.valuemask |= XpmVisual;
+  xpmattrs.visual = xgwa.visual;
+# endif
+# ifdef XpmDepth
+  xpmattrs.valuemask |= XpmDepth;
+  xpmattrs.depth = xgwa.depth;
+# endif
+# ifdef XpmColormap
+  xpmattrs.valuemask |= XpmColormap;
+  xpmattrs.colormap = xgwa.colormap;
+# endif
+
+  result = XpmReadFileToPixmap (dpy, window, bitmap_name, &bitmap, 0,
+                               &xpmattrs);
+  switch (result)
+    {
+    case XpmColorError:
+      fprintf (stderr, "%s: warning: xpm color substitution performed\n",
+              progname);
+      /* fall through */
+    case XpmSuccess:
+      *widthP = xpmattrs.width;
+      *heightP = xpmattrs.height;
+      break;
+    case XpmFileInvalid:
+    case XpmOpenFailed:
+      bitmap = 0;
+      break;
+    case XpmColorFailed:
+      fprintf (stderr, "%s: xpm: color allocation failed\n", progname);
+      exit (-1);
+    case XpmNoMemory:
+      fprintf (stderr, "%s: xpm: out of memory\n", progname);
+      exit (-1);
+    default:
+      fprintf (stderr, "%s: xpm: unknown error code %d\n", progname, result);
+      exit (-1);
+    }
+  if (! bitmap)
+#endif
+
+#ifdef HAVE_XMU
+    {
+      int xh, yh;
+      Pixmap b2;
+      bitmap = XmuLocateBitmapFile (DefaultScreenOfDisplay (dpy), bitmap_name,
+                                   0, 0, widthP, heightP, &xh, &yh);
+      if (! bitmap)
+       {
+         fprintf (stderr, "%s: couldn't find bitmap %s\n", progname,
+                  bitmap_name);
+         exit (1);
+       }
+      b2 = XmuCreatePixmapFromBitmap (dpy, window, bitmap, *widthP, *heightP,
+                                     depth, fg, bg);
+      XFreePixmap (dpy, bitmap);
+      bitmap = b2;
+    }
+#else  /* !XMU */
+    {
+      fprintf (stderr,
+              "%s: your vendor doesn't ship the standard Xmu library.\n",
+              progname);
+      fprintf (stderr, "\tWe can't load XBM files without it.\n");
+      exit (1);
+    }
+#endif /* !XMU */
+}
+
+
+static Pixmap
+read_screen (Display *dpy, Window window, int *widthP, int *heightP)
+{
+  Pixmap p;
+  XWindowAttributes xgwa;
+  XGCValues gcv;
+  GC gc;
+  XGetWindowAttributes (dpy, window, &xgwa);
+  *widthP = xgwa.width;
+  *heightP = xgwa.height;
+
+  grab_screen_image(xgwa.screen, window);
+  p = XCreatePixmap(dpy, window, *widthP, *heightP, xgwa.depth);
+  gcv.function = GXcopy;
+  gc = XCreateGC (dpy, window, GCFunction, &gcv);
+  XCopyArea (dpy, window, p, gc, 0, 0, *widthP, *heightP, 0, 0);
+
+  /* Reset the window's background color... */
+  XSetWindowBackground (dpy, window,
+                       get_pixel_resource ("background", "Background",
+                                           dpy, xgwa.colormap));
+  XCopyArea (dpy, p, window, gc, 0, 0, *widthP, *heightP, 0, 0);
+  XFreeGC (dpy, gc);
+
+  return p;
+}
+
+
+static int 
+to_pow2(int n, Bool up)
+{
+  /* sizeof(Dimension) == 2. */
+  int powers_of_2[] = { 1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024,
+                       2048, 4096, 8192, 16384, 32768, 65536 };
+  int i = 0;
+  if (n > 65536) size = 65536;
+  while (n >= powers_of_2[i]) i++;
+  if (n == powers_of_2[i-1])
+    return n;
+  else
+    return powers_of_2[up ? i : i-1];
+}
+
+static void
+init (void)
+{
+  XWindowAttributes xgwa;
+  Colormap cmap;
+  XGCValues gcv;
+  int width, height;
+  char *bitmap_name;
+  Bool scale_up;
+
+  XGetWindowAttributes (dpy, window, &xgwa);
+  cmap = xgwa.colormap;
+  depth = xgwa.depth;
+
+  fg = get_pixel_resource ("foreground", "Foreground", dpy, cmap);
+  bg = get_pixel_resource ("background", "Background", dpy, cmap);
+  delay = get_integer_resource ("delay", "Integer");
+  delay2 = get_integer_resource ("delay2", "Integer");
+  if (delay < 0) delay = 0;
+  if (delay2 < 0) delay2 = 0;
+  bitmap_name = get_string_resource ("bitmap", "Bitmap");
+  if (! bitmap_name || !*bitmap_name)
+    bitmap_name = "(default)";
+
+  if (!strcmp (bitmap_name, "(default)"))
+    {
+      width = som_width;
+      height = som_height;
+      bitmap = XCreatePixmapFromBitmapData (dpy, window, (char *) som_bits,
+                                           width, height, fg, bg, depth);
+      scale_up = True; /* definitely. */
+    }
+  else if (!strcmp (bitmap_name, "(screen)"))
+    {
+      bitmap = read_screen (dpy, window, &width, &height);
+      scale_up = True; /* maybe? */
+    }
+  else
+    {
+      read_bitmap (bitmap_name, &width, &height);
+      scale_up = True; /* probably? */
+    }
+
+  size = (width < height) ? height : width;    /* make it square */
+  size = to_pow2(size, scale_up);              /* round up to power of 2 */
+  {                                            /* don't exceed screen size */
+    int s = XScreenNumberOfScreen(xgwa.screen);
+    int w = to_pow2(XDisplayWidth(dpy, s), False);
+    int h = to_pow2(XDisplayHeight(dpy, s), False);
+    if (size > w) size = w;
+    if (size > h) size = h;
+  }
+
+  self = XCreatePixmap (dpy, window, size, size, depth);
+  temp = XCreatePixmap (dpy, window, size, size, depth);
+  mask = XCreatePixmap (dpy, window, size, size, depth);
+  gcv.foreground = (depth == 1 ? 1 : (~0));
+  gcv.function=GXset;  SET = XCreateGC(dpy,self,GCFunction|GCForeground,&gcv);
+  gcv.function=GXclear;CLR = XCreateGC(dpy,self,GCFunction|GCForeground,&gcv);
+  gcv.function=GXcopy; CPY = XCreateGC(dpy,self,GCFunction|GCForeground,&gcv);
+  gcv.function=GXor;   IOR = XCreateGC(dpy,self,GCFunction|GCForeground,&gcv);
+  gcv.function=GXand;  AND = XCreateGC(dpy,self,GCFunction|GCForeground,&gcv);
+  gcv.function=GXxor;  XOR = XCreateGC(dpy,self,GCFunction|GCForeground,&gcv);
+
+  gcv.foreground = gcv.background = bg;
+  gc = XCreateGC (dpy, window, GCForeground|GCBackground, &gcv);
+  /* Clear self to the background color (not to 0, which CLR does.) */
+  XFillRectangle (dpy, self, gc, 0, 0, size, size);
+  XSetForeground (dpy, gc, fg);
+
+  XCopyArea (dpy, bitmap, self, CPY, 0, 0, width, height,
+            (size - width)>>1, (size - height)>>1);
+  XFreePixmap(dpy, bitmap);
+
+  display (self);
+  XSync(dpy, False);
+  screenhack_handle_events (dpy);
+}
+
+static void
+display (Pixmap pixmap)
+{
+  XWindowAttributes xgwa;
+  static int last_w = 0, last_h = 0;
+  XGetWindowAttributes (dpy, window, &xgwa);
+  if (xgwa.width != last_w || xgwa.height != last_h)
+    {
+      XClearWindow (dpy, window);
+      last_w = xgwa.width;
+      last_h = xgwa.height;
+    }
+#ifdef HAVE_XPM
+  if (depth != 1)
+    XCopyArea (dpy, pixmap, window, gc, 0, 0, size, size,
+              (xgwa.width-size)>>1, (xgwa.height-size)>>1);
+  else
+#endif
+    XCopyPlane (dpy, pixmap, window, gc, 0, 0, size, size,
+               (xgwa.width-size)>>1, (xgwa.height-size)>>1, 1);
+/*
+  XDrawRectangle (dpy, window, gc,
+                 ((xgwa.width-size)>>1)-1, ((xgwa.height-size)>>1)-1,
+                 size+2, size+2);
+*/
+  XSync (dpy, False);
+  screenhack_handle_events (dpy);
+}
+
+\f
+char *progclass = "BlitSpin";
+
+char *defaults [] = {
+  ".background:        black",
+  ".foreground:        white",
+  "*delay:     500000",
+  "*delay2:    500000",
+  "*bitmap:    (default)",
+  "*geometry:  512x512",
+  0
+};
+
+XrmOptionDescRec options [] = {
+  { "-delay",          ".delay",       XrmoptionSepArg, 0 },
+  { "-delay2",         ".delay2",      XrmoptionSepArg, 0 },
+  { "-bitmap",         ".bitmap",      XrmoptionSepArg, 0 },
+  { "-grab-screen",    ".bitmap",      XrmoptionNoArg, "(screen)" },
+  { 0, 0, 0, 0 }
+};
+
+void
+screenhack (Display *d, Window w)
+{
+  dpy = d;
+  window = w;
+  init ();
+  if (delay2) usleep (delay2 * 2);
+  while (1)
+    {
+      rotate ();
+      screenhack_handle_events (d);
+      if (delay2) usleep (delay2);
+    }
+}
diff --git a/hacks/blitspin.man b/hacks/blitspin.man
new file mode 100644 (file)
index 0000000..f374666
--- /dev/null
@@ -0,0 +1,106 @@
+.TH XScreenSaver 1 "24-Nov-97" "X Version 11"
+.SH NAME
+blitspin - rotate a bitmap in an interesting way
+.SH SYNOPSIS
+.B blitspin
+[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-bitmap \fIfilename\fP] [\-delay \fIusecs\fP] [\-delay2 \fIusecs\fP]
+.SH DESCRIPTION
+The \fIblitspin\fP program repeatedly rotates a bitmap by 90 degrees by
+using logical operations: the bitmap is divided into quadrants, and the
+quadrants are shifted clockwise.  Then the same thing is done again with
+progressively smaller quadrants, except that all sub-quadrants of a 
+given size are rotated in parallel.  So this takes \fBO(16*log2(N))\fP 
+blits of size NxN, with the limitation that the image must be square,
+and the size must be a power of 2.
+.SH OPTIONS
+.I blitspin
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window.  This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-mono 
+If on a color display, pretend we're on a monochrome display.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use.  Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-bitmap \fIfilename\fP
+The file name of a bitmap to rotate.  It need not be square: it 
+will be padded with the background color.  If unspecified or the
+string \fI(default)\fP, a builtin bitmap is used.
+
+If support for the \fIXPM\fP library was enabled at compile-time, 
+the specified file may be in \fIXPM\fP format as well as \fIXBM\fP, and 
+thus may be a color image.
+
+The \fB*bitmapFilePath\fP resource will be searched if the bitmap
+name is not a fully-qualified pathname.
+.TP 8
+.B \-grab\-screen
+If this option is specified, then the image which is spun will be grabbed
+from the portion of the screen underlying the blitspin window.  (Or, it
+may come from an external video source: see below.)
+.PP
+.TP 8
+.B \-delay \fImicroseconds\fP
+How long to delay between steps of the rotation process, in microseconds.
+Default is 500000, one-half second.
+.PP
+.TP 8
+.B \-delay2 \fImicroseconds\fP
+How long to delay between each 90-degree rotation, in microseconds.
+Default is 500000, one-half second.
+.B DISPLAY
+to get the default host and display number.
+.SH RESOURCES
+On some systems (currently, only SGIs), this program can, instead of grabbing
+a desktop image, grab a frame of video from an external camera and manipulate
+that instead.  The following resources control that.
+.PP
+.TP 8
+.B grabVideoProbability \fR(Float)\fP
+What portion of the time to grab video rather than a screen image, 
+between 0.0 and 1.0.  Defaults to 0.5, or half the time.
+.TP 8
+.B videoDevice \fR(Integer)\fP
+The number of the default video input device to check first.  If unspecified, 
+the default camera (from videopanel(1)) will be checked first.  After that, all
+other available video input devices will be checked in order.  
+
+The first one which produces a non-black image will be used.  If all images
+are black, the others will be re-checked a few times before giving up and
+falling back to simply grabbing a desktop image (but note that this takes a
+few seconds, so if you don't actually have any video sources hooked up, you
+should consider turning off video grabbing by setting
+\fBgrabVideoProbability\fP to 0.0.)
+.TP 8
+.B videoGain \fR(Float)\fP
+The amount by which to brighten the grabbed image.  This defaults to 2.2.
+.SH ENVIRONMENT
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 1992, 1993, 1997 by Jamie Zawinski.
+Permission to use, copy, modify, distribute, and sell this software 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.  No
+representations are made about the suitability of this software for any
+purpose.  It is provided "as is" without express or implied warranty.
+.SH AUTHOR
+Jamie Zawinski <jwz@jwz.org>, 17-aug-92.
+
+Based on SmallTalk code which appeared in the August 1981 issue of Byte
+magazine.
diff --git a/hacks/bouboule.c b/hacks/bouboule.c
new file mode 100644 (file)
index 0000000..7e77e46
--- /dev/null
@@ -0,0 +1,841 @@
+/* -*- Mode: C; tab-width: 4 -*-
+   Ported from xlockmore 4.03a12 to be a standalone program and thus usable
+   with xscreensaver by Jamie Zawinski <jwz@jwz.org> on 15-May-97.
+
+   Original copyright notice from xlock.c:
+
+    * Copyright (c) 1988-91 by Patrick J. Naughton.
+    *
+    * 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.
+    *
+    * This file is provided AS IS with no warranties of any kind.  The author
+    * shall have no liability with respect to the infringement of copyrights,
+    * trade secrets or any patents by this file or any part thereof.  In no
+    * event will the author be liable for any lost revenue or profits or
+    * other special, indirect and consequential damages.
+ */
+
+#if !defined( lint ) && !defined( SABER )
+static const char sccsid[] = "@(#)bouboule.c   4.00 97/01/01 xlockmore";
+
+#endif
+
+/*-
+ * bouboule.c (bouboule mode for xlockmore)
+ *
+ * Sort of starfield for xlockmore. I found that making a starfield for
+ * a 3D engine and thought it could be a nice lock mode. For a real starfield,
+ * I only scale the sort of sphere you see to the whole sky and clip the stars
+ * to the camera screen.
+ *
+ *   Code Copyright 1996 by Jeremie PETIT (jeremie_petit@geocities.com)
+ *
+ *   Use: batchcount is the number of stars.
+ *        cycles is the maximum size for a star
+ *
+ * 15-May-97: jwz@jwz.org: turned into a standalone program.
+ * 04-Sep-96: Added 3d support (Henrik Theiling, theiling@coli-uni-sb.de)
+ * 20-Feb-96: Added tests so that already malloced objects are not
+ *            malloced twice, thanks to the report from <mccomb@interport.net>
+ * 01-Feb-96: Patched by Jouk Jansen <joukj@alpha.chem.uva.nl> for VMS
+ *            Patched by <bagleyd@bigfoot.com> for TrueColor displays
+ * 30-Jan-96: Wrote all that I wanted to.
+ *
+ * DONE: Build up a XArc list and Draw everything once with XFillArcs
+ *       That idea came from looking at swarm code.
+ * DONE: Add an old arcs list for erasing.
+ * DONE: Make center of starfield SinVariable.
+ * DONE: Add some random in the sinvary() function.
+ * DONE: check time for erasing the stars with the two methods and use the
+ *       better one. Note that sometimes the time difference between
+ *       beginning of erasing and its end is negative! I check this, and
+ *       do not use this result when it occurs. If all values are negative,
+ *       the erasing will continue being done in the currently tested mode.
+ * DONE: Allow stars size customization.
+ * DONE: Make sizey be no less than half sizex or no bigger than twice sizex.
+ *
+ * IDEA: A simple check can be performed to know which stars are "behind"
+ *       and which are "in front". So is possible to very simply change
+ *       the drawing mode for these two sorts of stars. BUT: this would lead
+ *       to a rewrite of the XArc list code because drawing should be done
+ *       in two steps: "behind" stars then "in front" stars. Also, what could
+ *       be the difference between the rendering of these two types of stars?
+ * IDEA: Calculate the distance of each star to the "viewer" and render the
+ *       star accordingly to this distance. Same remarks as for previous
+ *       ideas can be pointed out. This would even lead to reget the old stars
+ *       drawing code, that has been replaced by the XFillArcs. On another
+ *       hand, this would allow particular stars (own color, shape...), as
+ *       far as they would be individually drawn. One should be careful to
+ *       draw them according to their distance, that is not drawing a far
+ *       star after a close one.
+ */
+
+#ifdef STANDALONE
+# define PROGCLASS                                     "Bouboule"
+# define HACK_INIT                                     init_bouboule
+# define HACK_DRAW                                     draw_bouboule
+# define bouboule_opts                         xlockmore_opts
+# define DEFAULTS      "*count:                100     \n"                     \
+                                       "*size:                 15      \n"                     \
+                                       "*delay:                5000    \n"                     \
+                                       "*ncolors:              64      \n"                     \
+                                       "*use3d:                False   \n"                     \
+                                       "*delta3d:              1.5             \n"                     \
+                                       "*right3d:              red             \n"                     \
+                                       "*left3d:               blue    \n"                     \
+                                       "*both3d:               magenta \n"                     \
+                                       "*none3d:               black   \n"
+
+# define SMOOTH_COLORS
+# include "xlockmore.h"                                /* from the xscreensaver distribution */
+#else  /* !STANDALONE */
+# include "xlock.h"                                    /* from the xlockmore distribution */
+#endif /* !STANDALONE */
+
+ModeSpecOpt bouboule_opts = {
+  0, NULL, 0, NULL, NULL };
+
+#define USEOLDXARCS  1         /* If 1, we use old xarcs list for erasing.
+                                  * else we just roughly erase the window.
+                                  * This mainly depends on the number of stars,
+                                  * because when they are many, it is faster to
+                                  * erase the whole window than to erase each star
+                                */
+
+#if HAVE_GETTIMEOFDAY
+#define ADAPT_ERASE  1         /* If 1, then we try ADAPT_CHECKS black XFillArcs,
+                                  * and after, ADAPT_CHECKS XFillRectangle.
+                                  * We check which method seems better, knowing that
+                                  * XFillArcs is generally visually better. So we
+                                  * consider that XFillArcs is still better if its time
+                                  * is about XFillRectangle * ADAPT_ARC_PREFERED
+                                  * We need gettimeofday
+                                  * for this... Does it exist on other systems ? Do we
+                                  * have to use another function for others ?
+                                  * This value overrides USEOLDXARCS.
+                                */
+
+#ifdef USE_XVMSUTILS
+# if 0
+#  include "../xvmsutils/unix_time.h"
+# else
+#  include <X11/unix_time.h>
+# endif
+#endif
+
+#include <sys/time.h>
+
+#define ADAPT_CHECKS 50
+#define ADAPT_ARC_PREFERED 150 /* Maybe the value that is the most important
+                                  * for adapting to a system */
+#endif
+
+#define dtor(x)    (((x) * M_PI) / 180.0)      /* Degrees to radians */
+
+#define MINSTARS      1
+#define MINSIZE       1
+/* jwz: I think slower color changes look better */
+#define COLOR_CHANGES 50               /* How often we change colors (1 = always)
+                                  * This value should be tuned accordingly to
+                                  * the number of stars */
+#define MAX_SIZEX_SIZEY 2.     /* This controls whether the sphere can be very
+                                  * very large and have a small height (or the
+                                  * opposite) or no. */
+
+#define THETACANRAND  80       /* percentage of changes for the speed of
+                                  * change of the 3 theta values */
+#define SIZECANRAND   80       /* percentage of changes for the speed of
+                                  * change of the sizex and sizey values */
+#define POSCANRAND    80       /* percentage of changes for the speed of
+                                  * change of the x and y values */
+/* Note that these XXXCANRAND values can be 0, that is no rand acceleration *
+   variation. */
+
+#define VARRANDALPHA (NRAND((int) (M_PI * 1000.0))/1000.0)
+#define VARRANDSTEP  (M_PI/(NRAND(100)+100.0))
+#define VARRANDMIN   (-70.0)
+#define VARRANDMAX   70.0
+
+#define MINZVAL   100          /* stars can come this close */
+#define SCREENZ  2000          /* this is where the screen is */
+#define MAXZVAL 10000          /* stars can go this far away */
+
+#define GETZDIFF(z) ((MI_DELTA3D(mi))*20.0*(1.0-(SCREENZ)/(z+1000)))
+#define MAXDIFF  MAX(-GETZDIFF(MINZVAL),GETZDIFF(MAXZVAL))
+
+/* These values are the variation parameters of the acceleration variation *
+   of the SinVariables that are randomized. */
+
+/******************************/
+typedef struct SinVariableStruct
+/******************************/
+{
+       double      alpha;      /* 
+                                * Alpha is the current state of the sinvariable
+                                * alpha should be initialized to a value between
+                                * 0.0 and 2 * M_PI
+                                */
+       double      step;       /*
+                                * Speed of evolution of alpha. It should be a reasonable
+                                * fraction of 2 * M_PI. This value directly influence
+                                * the variable speed of variation.
+                                */
+       double      minimum;    /* Minimum value for the variable */
+       double      maximum;    /* Maximum value for the variable */
+       double      value;      /* Current value */
+       int         mayrand;    /* Flag for knowing whether some randomization can be
+                                * applied to the variable */
+       struct SinVariableStruct *varrand;      /* Evolving Variable: the variation of
+                                                  * alpha */
+} SinVariable;
+
+/***********************/
+typedef struct StarStruct
+/***********************/
+{
+       double      x, y, z;    /* Position of the star */
+       short       size;       /* Try to guess */
+} Star;
+
+/****************************/
+typedef struct StarFieldStruct
+/****************************/
+{
+       short       width, height;      /* width and height of the starfield window */
+       short       max_star_size;      /* Maximum radius for stars. stars radius will
+                                        * vary from 1 to MAX_STAR_SIZE */
+       SinVariable x;          /* Evolving variables:               */
+       SinVariable y;          /* Center of the field on the screen */
+       SinVariable z;
+       SinVariable sizex;      /* Evolving variable: half width  of the field */
+       SinVariable sizey;      /* Evolving variable: half height of the field */
+       SinVariable thetax;     /* Evolving Variables:              */
+       SinVariable thetay;     /* rotation angles of the starfield */
+       SinVariable thetaz;     /* around x, y and z local axis     */
+       Star       *star;       /* List of stars */
+       XArc       *xarc;       /* Current List of arcs */
+       XArc       *xarcleft;   /* additional list for the left arcs */
+#if ((USEOLDXARCS == 1) || (ADAPT_ERASE == 1))
+       XArc       *oldxarc;    /* Old list of arcs */
+       XArc       *oldxarcleft;
+#endif
+       unsigned long color;    /* Current color of the starfield */
+       int         colorp;     /* Pointer to color of the starfield */
+       int         NbStars;    /* Number of stars */
+       short       colorchange;        /* Counter for the color change */
+#if (ADAPT_ERASE == 1)
+       short       hasbeenchecked;
+       long        rect_time;
+       long        xarc_time;
+#endif
+} StarField;
+
+static StarField *starfield = NULL;
+
+/*********/
+static void
+sinvary(SinVariable * v)
+/*********/
+
+{
+       v->value = v->minimum +
+               (v->maximum - v->minimum) * (sin(v->alpha) + 1.0) / 2.0;
+
+       if (v->mayrand == 0)
+               v->alpha += v->step;
+       else {
+               int         vaval = NRAND(100);
+
+               if (vaval <= v->mayrand)
+                       sinvary(v->varrand);
+               v->alpha += (100.0 + (v->varrand->value)) * v->step / 100.0;
+       }
+
+       if (v->alpha > 2 * M_PI)
+               v->alpha -= 2 * M_PI;
+}
+
+/*************************************************/
+static void
+sininit(SinVariable * v,
+       double alpha, double step, double minimum, double maximum,
+       short int mayrand)
+{
+       v->alpha = alpha;
+       v->step = step;
+       v->minimum = minimum;
+       v->maximum = maximum;
+       v->mayrand = mayrand;
+       if (mayrand != 0) {
+               if (v->varrand == NULL)
+                       v->varrand = (SinVariable *) calloc(1, sizeof (SinVariable));
+               sininit(v->varrand,
+                       VARRANDALPHA,
+                       VARRANDSTEP,
+                       VARRANDMIN,
+                       VARRANDMAX,
+                       0);
+               sinvary(v->varrand);
+       }
+       /* We calculate the values at least once for initialization */
+       sinvary(v);
+}
+
+static void
+sinfree(SinVariable * point)
+{
+       SinVariable *temp, *next;
+
+       next = point->varrand;
+       while (next) {
+               temp = next;
+               next = temp->varrand;
+               (void) free((void *) temp);
+       }
+}
+
+/***************/
+void
+init_bouboule(ModeInfo * mi)
+/***************/
+
+/*-
+ *  The stars init part was first inspirated from the net3d game starfield
+ * code.  But net3d starfield is not really 3d starfield, and I needed real 3d,
+ * so only remains the net3d starfield initialization main idea, that is
+ * the stars distribution on a sphere (theta and omega computing)
+ */
+{
+       StarField  *sp;
+       int         size = MI_SIZE(mi);
+       int         i;
+       double      theta, omega;
+
+       if (starfield == NULL) {
+               if ((starfield = (StarField *) calloc(MI_NUM_SCREENS(mi),
+                                               sizeof (StarField))) == NULL)
+                       return;
+       }
+       sp = &starfield[MI_SCREEN(mi)];
+
+       sp->width = MI_WIN_WIDTH(mi);
+       sp->height = MI_WIN_HEIGHT(mi);
+
+       /* use the right `black' pixel values: */
+       if (MI_WIN_IS_INSTALL(mi) && MI_WIN_IS_USE3D(mi)) {
+               XSetForeground(MI_DISPLAY(mi), MI_GC(mi), MI_NONE_COLOR(mi));
+               XFillRectangle(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi),
+                              0, 0, sp->width, sp->height);
+       } else
+               XClearWindow(MI_DISPLAY(mi), MI_WINDOW(mi));
+
+       if (size < -MINSIZE)
+               sp->max_star_size = NRAND(-size - MINSIZE + 1) + MINSIZE;
+       else if (size < MINSIZE)
+               sp->max_star_size = MINSIZE;
+       else
+               sp->max_star_size = size;
+
+       sp->NbStars = MI_BATCHCOUNT(mi);
+       if (sp->NbStars < -MINSTARS) {
+               if (sp->star) {
+                       (void) free((void *) sp->star);
+                       sp->star = NULL;
+               }
+               if (sp->xarc) {
+                       (void) free((void *) sp->xarc);
+                       sp->xarc = NULL;
+               }
+               if (sp->xarcleft) {
+                       (void) free((void *) sp->xarcleft);
+                       sp->xarcleft = NULL;
+               }
+#if ((USEOLDXARCS == 1) || (ADAPT_ERASE == 1))
+               if (sp->oldxarc) {
+                       (void) free((void *) sp->oldxarc);
+                       sp->oldxarc = NULL;
+               }
+               if (sp->oldxarcleft) {
+                       (void) free((void *) sp->oldxarcleft);
+                       sp->oldxarcleft = NULL;
+               }
+#endif
+               sp->NbStars = NRAND(-sp->NbStars - MINSTARS + 1) + MINSTARS;
+       } else if (sp->NbStars < MINSTARS)
+               sp->NbStars = MINSTARS;
+
+       /* We get memory for lists of objects */
+       if (sp->star == NULL)
+               sp->star = (Star *) malloc(sp->NbStars * sizeof (Star));
+       if (sp->xarc == NULL)
+               sp->xarc = (XArc *) malloc(sp->NbStars * sizeof (XArc));
+       if (MI_WIN_IS_USE3D(mi) && sp->xarcleft == NULL)
+               sp->xarcleft = (XArc *) malloc(sp->NbStars * sizeof (XArc));
+#if ((USEOLDXARCS == 1) || (ADAPT_ERASE == 1))
+       if (sp->oldxarc == NULL)
+               sp->oldxarc = (XArc *) malloc(sp->NbStars * sizeof (XArc));
+       if (MI_WIN_IS_USE3D(mi) && sp->oldxarcleft == NULL)
+               sp->oldxarcleft = (XArc *) malloc(sp->NbStars * sizeof (XArc));
+#endif
+
+       {
+               /* We initialize evolving variables */
+               sininit(&sp->x,
+                       NRAND(3142) / 1000.0, M_PI / (NRAND(100) + 100.0),
+                       ((double) sp->width) / 4.0,
+                       3.0 * ((double) sp->width) / 4.0,
+                       POSCANRAND);
+               sininit(&sp->y,
+                       NRAND(3142) / 1000.0, M_PI / (NRAND(100) + 100.0),
+                       ((double) sp->height) / 4.0,
+                       3.0 * ((double) sp->height) / 4.0,
+                       POSCANRAND);
+
+               /* for z, we have to ensure that the bouboule does not get behind */
+               /* the eyes of the viewer.  His/Her eyes are at 0.  Because the */
+               /* bouboule uses the x-radius for the z-radius, too, we have to */
+               /* use the x-values. */
+               sininit(&sp->z,
+                       NRAND(3142) / 1000.0, M_PI / (NRAND(100) + 100.0),
+                       ((double) sp->width / 2.0 + MINZVAL),
+                       ((double) sp->width / 2.0 + MAXZVAL),
+                       POSCANRAND);
+
+
+               sininit(&sp->sizex,
+                       NRAND(3142) / 1000.0, M_PI / (NRAND(100) + 100.0),
+                       MIN(((double) sp->width) - sp->x.value,
+                           sp->x.value) / 5.0,
+                       MIN(((double) sp->width) - sp->x.value,
+                           sp->x.value),
+                       SIZECANRAND);
+
+               sininit(&sp->sizey,
+                       NRAND(3142) / 1000.0, M_PI / (NRAND(100) + 100.0),
+                       MAX(sp->sizex.value / MAX_SIZEX_SIZEY,
+                           sp->sizey.maximum / 5.0),
+                       MIN(sp->sizex.value * MAX_SIZEX_SIZEY,
+                           MIN(((double) sp->height) -
+                               sp->y.value,
+                               sp->y.value)),
+                       SIZECANRAND);
+
+               sininit(&sp->thetax,
+                       NRAND(3142) / 1000.0, M_PI / (NRAND(200) + 200.0),
+                       -M_PI, M_PI,
+                       THETACANRAND);
+               sininit(&sp->thetay,
+                       NRAND(3142) / 1000.0, M_PI / (NRAND(200) + 200.0),
+                       -M_PI, M_PI,
+                       THETACANRAND);
+               sininit(&sp->thetaz,
+                       NRAND(3142) / 1000.0, M_PI / (NRAND(400) + 400.0),
+                       -M_PI, M_PI,
+                       THETACANRAND);
+       }
+       for (i = 0; i < sp->NbStars; i++) {
+               Star       *star;
+               XArc       *arc = NULL, *arcleft = NULL;
+#if ((USEOLDXARCS == 1) || (ADAPT_ERASE == 1))
+       XArc       *oarc = NULL, *oarcleft = NULL;
+#endif
+
+               star = &(sp->star[i]);
+               arc = &(sp->xarc[i]);
+               if (MI_WIN_IS_USE3D(mi))
+                       arcleft = &(sp->xarcleft[i]);
+#if ((USEOLDXARCS == 1) || (ADAPT_ERASE == 1))
+               oarc = &(sp->oldxarc[i]);
+               if (MI_WIN_IS_USE3D(mi))
+                       oarcleft = &(sp->oldxarcleft[i]);
+#endif
+               /* Elevation and bearing of the star */
+               theta = dtor((NRAND(1800)) / 10.0 - 90.0);
+               omega = dtor((NRAND(3600)) / 10.0 - 180.0);
+
+               /* Stars coordinates in a 3D space */
+               star->x = cos(theta) * sin(omega);
+               star->y = sin(omega) * sin(theta);
+               star->z = cos(omega);
+
+               /* We set the stars size */
+               star->size = NRAND(2 * sp->max_star_size);
+               if (star->size < sp->max_star_size)
+                       star->size = 0;
+               else
+                       star->size -= sp->max_star_size;
+
+               /* We set default values for the XArc lists elements */
+               arc->x = arc->y = 0;
+               if (MI_WIN_IS_USE3D(mi)) {
+                       arcleft->x = arcleft->y = 0;
+               }
+#if ((USEOLDXARCS == 1) || (ADAPT_ERASE == 1))
+               oarc->x = oarc->y = 0;
+               if (MI_WIN_IS_USE3D(mi)) {
+                       oarcleft->x = oarcleft->y = 0;
+               }
+#endif
+               arc->width = 2 + star->size;
+               arc->height = 2 + star->size;
+               if (MI_WIN_IS_USE3D(mi)) {
+                       arcleft->width = 2 + star->size;
+                       arcleft->height = 2 + star->size;
+               }
+#if ((USEOLDXARCS == 1) || (ADAPT_ERASE == 1))
+               oarc->width = 2 + star->size;
+               oarc->height = 2 + star->size;
+               if (MI_WIN_IS_USE3D(mi)) {
+                       oarcleft->width = 2 + star->size;
+                       oarcleft->height = 2 + star->size;
+               }
+#endif
+
+               arc->angle1 = 0;
+               arc->angle2 = 360 * 64;
+               if (MI_WIN_IS_USE3D(mi)) {
+                       arcleft->angle1 = 0;
+                       arcleft->angle2 = 360 * 64;
+               }
+#if ((USEOLDXARCS == 1) || (ADAPT_ERASE == 1))
+               oarc->angle1 = 0;
+               oarc->angle2 = 360 * 64;        /* ie. we draw whole disks:
+                                                * from 0 to 360 degrees */
+               if (MI_WIN_IS_USE3D(mi)) {
+                       oarcleft->angle1 = 0;
+                       oarcleft->angle2 = 360 * 64;
+               }
+#endif
+       }
+
+       if (MI_NPIXELS(mi) > 2)
+               sp->colorp = NRAND(MI_NPIXELS(mi));
+       /* We set up the starfield color */
+       if (!MI_WIN_IS_USE3D(mi) && MI_NPIXELS(mi) > 2)
+               sp->color = MI_PIXEL(mi, sp->colorp);
+       else
+               sp->color = MI_WIN_WHITE_PIXEL(mi);
+
+#if (ADAPT_ERASE == 1)
+       /* We initialize the adaptation code for screen erasing */
+       sp->hasbeenchecked = ADAPT_CHECKS * 2;
+       sp->rect_time = 0;
+       sp->xarc_time = 0;
+#endif
+}
+
+/****************/
+void
+draw_bouboule(ModeInfo * mi)
+/****************/
+
+{
+       Display    *display = MI_DISPLAY(mi);
+       Window      window = MI_WINDOW(mi);
+       GC          gc = MI_GC(mi);
+       StarField  *sp = &starfield[MI_SCREEN(mi)];
+       int         i, diff = 0;
+       double      CX, CY, CZ, SX, SY, SZ;
+       Star       *star;
+       XArc       *arc = NULL, *arcleft = NULL;
+
+#if (ADAPT_ERASE == 1)
+       struct timeval tv1;
+       struct timeval tv2;
+
+#endif
+
+#if ((USEOLDXARCS == 0) || (ADAPT_ERASE == 1))
+       short       x_1, y_1, x_2, y_2;
+
+       /* bounding rectangle around the old starfield,
+        * for erasing with the smallest rectangle
+        * instead of filling the whole screen */
+       int         maxdiff = 0;        /* maximal distance between left and right */
+
+       /* star in 3d mode, otherwise 0 */
+#endif
+
+#if ((USEOLDXARCS == 0) || (ADAPT_ERASE == 1))
+       if (MI_WIN_IS_USE3D(mi)) {
+               maxdiff = (int) MAXDIFF;
+       }
+       x_1 = (int) sp->x.value - (int) sp->sizex.value -
+               sp->max_star_size - maxdiff;
+       y_1 = (int) sp->y.value - (int) sp->sizey.value -
+               sp->max_star_size;
+       x_2 = 2 * ((int) sp->sizex.value + sp->max_star_size + maxdiff);
+       y_2 = 2 * ((int) sp->sizey.value + sp->max_star_size);
+#endif
+       /* We make variables vary. */
+       sinvary(&sp->thetax);
+       sinvary(&sp->thetay);
+       sinvary(&sp->thetaz);
+
+       sinvary(&sp->x);
+       sinvary(&sp->y);
+       if (MI_WIN_IS_USE3D(mi))
+               sinvary(&sp->z);
+
+       /* A little trick to prevent the bouboule from being
+        * bigger than the screen */
+       sp->sizex.maximum =
+               MIN(((double) sp->width) - sp->x.value,
+                   sp->x.value);
+       sp->sizex.minimum = sp->sizex.maximum / 3.0;
+
+       /* Another trick to make the ball not too flat */
+       sp->sizey.minimum =
+               MAX(sp->sizex.value / MAX_SIZEX_SIZEY,
+                   sp->sizey.maximum / 3.0);
+       sp->sizey.maximum =
+               MIN(sp->sizex.value * MAX_SIZEX_SIZEY,
+                   MIN(((double) sp->height) - sp->y.value,
+                       sp->y.value));
+
+       sinvary(&sp->sizex);
+       sinvary(&sp->sizey);
+
+       /*
+        * We calculate the rotation matrix values. We just make the
+        * rotation on the fly, without using a matrix.
+        * Star positions are recorded as unit vectors pointing in various
+        * directions. We just make them all rotate.
+        */
+       CX = cos(sp->thetax.value);
+       SX = sin(sp->thetax.value);
+       CY = cos(sp->thetay.value);
+       SY = sin(sp->thetay.value);
+       CZ = cos(sp->thetaz.value);
+       SZ = sin(sp->thetaz.value);
+
+       for (i = 0; i < sp->NbStars; i++) {
+               star = &(sp->star[i]);
+               arc = &(sp->xarc[i]);
+               if (MI_WIN_IS_USE3D(mi)) {
+                       arcleft = &(sp->xarcleft[i]);
+                       /* to help the eyes, the starfield is always as wide as */
+                       /* deep, so .sizex.value can be used. */
+                       diff = (int) GETZDIFF(sp->sizex.value *
+                                     ((SY * CX) * star->x + (SX) * star->y +
+                                      (CX * CY) * star->z) + sp->z.value);
+               }
+               arc->x = (short) ((sp->sizex.value *
+                                  ((CY * CZ - SX * SY * SZ) * star->x +
+                                   (-CX * SZ) * star->y +
+                                   (SY * CZ + SZ * SX * CY) * star->z) +
+                                  sp->x.value));
+               arc->y = (short) ((sp->sizey.value *
+                                  ((CY * SZ + SX * SY * CZ) * star->x +
+                                   (CX * CZ) * star->y +
+                                   (SY * SZ - SX * CY * CZ) * star->z) +
+                                  sp->y.value));
+
+               if (MI_WIN_IS_USE3D(mi)) {
+                       arcleft->x = (short) ((sp->sizex.value *
+                                       ((CY * CZ - SX * SY * SZ) * star->x +
+                                        (-CX * SZ) * star->y +
+                                        (SY * CZ + SZ * SX * CY) * star->z) +
+                                              sp->x.value));
+                       arcleft->y = (short) ((sp->sizey.value *
+                                       ((CY * SZ + SX * SY * CZ) * star->x +
+                                        (CX * CZ) * star->y +
+                                        (SY * SZ - SX * CY * CZ) * star->z) +
+                                              sp->y.value));
+                       arc->x += diff;
+                       arcleft->x -= diff;
+               }
+               if (star->size != 0) {
+                       arc->x -= star->size;
+                       arc->y -= star->size;
+                       if (MI_WIN_IS_USE3D(mi)) {
+                               arcleft->x -= star->size;
+                               arcleft->y -= star->size;
+                       }
+               }
+       }
+
+       /* First, we erase the previous starfield */
+       if (MI_WIN_IS_INSTALL(mi) && MI_WIN_IS_USE3D(mi))
+               XSetForeground(display, gc, MI_NONE_COLOR(mi));
+       else
+               XSetForeground(display, gc, MI_WIN_BLACK_PIXEL(mi));
+
+#if (ADAPT_ERASE == 1)
+       if (sp->hasbeenchecked == 0) {
+               /* We just calculate which method is the faster and eventually free
+                * the oldxarc list */
+               if (sp->xarc_time >
+                   ADAPT_ARC_PREFERED * sp->rect_time) {
+                       sp->hasbeenchecked = -2;        /* XFillRectangle mode */
+                       (void) free((void *) sp->oldxarc);
+                       sp->oldxarc = NULL;
+                       if (MI_WIN_IS_USE3D(mi)) {
+                               (void) free((void *) sp->oldxarcleft);
+                         sp->oldxarcleft = NULL;
+                       }
+               } else {
+                       sp->hasbeenchecked = -1;        /* XFillArcs mode */
+               }
+       }
+       if (sp->hasbeenchecked == -2) {
+               /* Erasing is done with XFillRectangle */
+               XFillRectangle(display, window, gc,
+                              x_1, y_1, x_2, y_2);
+       } else if (sp->hasbeenchecked == -1) {
+               /* Erasing is done with XFillArcs */
+               XFillArcs(display, window, gc,
+                         sp->oldxarc, sp->NbStars);
+               if (MI_WIN_IS_USE3D(mi))
+                       XFillArcs(display, window, gc,
+                                 sp->oldxarcleft, sp->NbStars);
+       } else {
+               long        usec;
+
+               if (sp->hasbeenchecked > ADAPT_CHECKS) {
+#ifdef GETTIMEOFDAY_TWO_ARGS
+                       (void) gettimeofday(&tv1, NULL);
+#else
+                       (void) gettimeofday(&tv1);
+#endif
+                       XFillRectangle(display, window, gc,
+                                      x_1, y_1, x_2, y_2);
+#ifdef GETTIMEOFDAY_TWO_ARGS
+                       (void) gettimeofday(&tv2, NULL);
+#else
+                       (void) gettimeofday(&tv2);
+#endif
+                       usec = (tv2.tv_sec - tv1.tv_sec) * 1000000;
+                       if (usec + tv2.tv_usec - tv1.tv_usec > 0) {
+                               sp->rect_time += usec + tv2.tv_usec - tv1.tv_usec;
+                               sp->hasbeenchecked--;
+                       }
+               } else {
+#ifdef GETTIMEOFDAY_TWO_ARGS
+                       (void) gettimeofday(&tv1, NULL);
+#else
+                       (void) gettimeofday(&tv1);
+#endif
+                       XFillArcs(display, window, gc,
+                                 sp->oldxarc, sp->NbStars);
+                       if (MI_WIN_IS_USE3D(mi))
+                               XFillArcs(display, window, gc,
+                                         sp->oldxarcleft, sp->NbStars);
+#ifdef GETTIMEOFDAY_TWO_ARGS
+                       (void) gettimeofday(&tv2, NULL);
+#else
+                       (void) gettimeofday(&tv2);
+#endif
+                       usec = (tv2.tv_sec - tv1.tv_sec) * 1000000;
+                       if (usec + tv2.tv_usec - tv1.tv_usec > 0) {
+                               sp->xarc_time += usec + tv2.tv_usec - tv1.tv_usec;
+                               sp->hasbeenchecked--;
+                       }
+               }
+       }
+#else
+#if (USEOLDXARCS == 1)
+       XFillArcs(display, window, gc,
+                 sp->oldxarc, sp->NbStars);
+       if (MI_WIN_IS_USE3D(mi))
+               XFillArcs(display, window, gc,
+                         sp->oldxarcleft, sp->NbStars);
+#else
+       XFillRectangle(display, window, gc,
+                      x_1, y_1, x_2, y_2);
+#endif
+#endif
+
+       /* Then we draw the new one */
+       if (MI_WIN_IS_USE3D(mi)) {
+               if (MI_WIN_IS_INSTALL(mi))
+                       XSetFunction(display, gc, GXor);
+               XSetForeground(display, gc, MI_RIGHT_COLOR(mi));
+               XFillArcs(display, window, gc, sp->xarc, sp->NbStars);
+               XSetForeground(display, gc, MI_LEFT_COLOR(mi));
+               XFillArcs(display, window, gc, sp->xarcleft, sp->NbStars);
+               if (MI_WIN_IS_INSTALL(mi))
+                       XSetFunction(display, gc, GXcopy);
+       } else {
+               XSetForeground(display, gc, sp->color);
+               XFillArcs(display, window, gc, sp->xarc, sp->NbStars);
+       }
+
+#if ((USEOLDXARCS == 1) || (ADAPT_ERASE == 1))
+#if (ADAPT_ERASE == 1)
+       if (sp->hasbeenchecked >= -1) {
+               arc = sp->xarc;
+               sp->xarc = sp->oldxarc;
+               sp->oldxarc = arc;
+               if (MI_WIN_IS_USE3D(mi)) {
+                       arcleft = sp->xarcleft;
+                       sp->xarcleft = sp->oldxarcleft;
+                       sp->oldxarcleft = arcleft;
+               }
+       }
+#else
+       arc = sp->xarc;
+       sp->xarc = sp->oldxarc;
+       sp->oldxarc = arc;
+       if (MI_WIN_IS_USE3D(mi)) {
+               arcleft = sp->xarcleft;
+               sp->xarcleft = sp->oldxarcleft;
+               sp->oldxarcleft = arcleft;
+       }
+#endif
+#endif
+
+       /* We set up the color for the next drawing */
+       if (!MI_WIN_IS_USE3D(mi) && MI_NPIXELS(mi) > 2 &&
+           (++sp->colorchange >= COLOR_CHANGES)) {
+               sp->colorchange = 0;
+               if (++sp->colorp >= MI_NPIXELS(mi))
+                       sp->colorp = 0;
+               sp->color = MI_PIXEL(mi, sp->colorp);
+       }
+}
+
+void
+release_bouboule(ModeInfo * mi)
+{
+       if (starfield != NULL) {
+               int         screen;
+
+               for (screen = 0; screen < MI_NUM_SCREENS(mi); screen++) {
+                       StarField  *sp = &starfield[screen];
+
+                       if (sp->star)
+                               (void) free((void *) sp->star);
+                       if (sp->xarc)
+                               (void) free((void *) sp->xarc);
+                       if (sp->xarcleft)
+                               (void) free((void *) sp->xarcleft);
+#if ((USEOLDXARCS == 1) || (ADAPT_ERASE == 1))
+                       if (sp->oldxarc)
+                               (void) free((void *) sp->oldxarc);
+                       if (sp->oldxarcleft)
+                               (void) free((void *) sp->oldxarcleft);
+#endif
+                       sinfree(&(sp->x));
+                       sinfree(&(sp->y));
+                       sinfree(&(sp->z));
+                       sinfree(&(sp->sizex));
+                       sinfree(&(sp->sizey));
+                       sinfree(&(sp->thetax));
+                       sinfree(&(sp->thetay));
+                       sinfree(&(sp->thetaz));
+               }
+               (void) free((void *) starfield);
+               starfield = NULL;
+       }
+}
+
+void
+refresh_bouboule(ModeInfo * mi)
+{
+       /* Do nothing, it will refresh by itself */
+}
diff --git a/hacks/bouboule.man b/hacks/bouboule.man
new file mode 100644 (file)
index 0000000..b2a8df2
--- /dev/null
@@ -0,0 +1,76 @@
+.TH XScreenSaver 1 "15-May-97" "X Version 11"
+.SH NAME
+bouboule - draws spinning 3D blobs
+.SH SYNOPSIS
+.B bouboule
+[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-ncolors \fIinteger\fP] [\-delay \fImicroseconds\fP] [\-cycles \fIinteger\fP] [\-count \fIinteger\fP] [\-3d]
+
+.SH DESCRIPTION
+The \fIbouboule\fP program draws spinning 3D blobs.
+.SH OPTIONS
+.I bouboule
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window.  This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-mono 
+If on a color display, pretend we're on a monochrome display.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use.  Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-ncolors \fIinteger\fP
+How many colors should be used (if possible).  Default 64.
+The colors used cycle through the hue, making N stops around
+the color wheel.
+.TP 8
+.B \-cycles \fIinteger\fP
+
+.TP 8
+.B \-count \fIinteger\fP
+
+.TP 8
+.B \-3d
+Do red/blue 3d separations (for 3d glasses.)
+
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1),
+.BR xlock (1)
+.SH COPYRIGHT
+Copyright \(co 1996 by Jeremie Petit.
+
+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. 
+
+.SH AUTHOR
+Jeremie Petit <jpetit@essi.fr>, 1996.
+
+3D support by Henrik Theiling <theiling@coli-uni-sb.de>, 04-Sep-96.
+
+VMS support by Jouk Jansen <joukj@alpha.chem.uva.nl>, 01-Feb-96.
+
+TrueColor support by David Bagley <bagleyd@bigfoot.com>, 01-Feb-96.
+
+Ability to run standalone or with \fIxscreensaver\fP added by 
+Jamie Zawinski <jwz@jwz.org>, 15-May-97.
diff --git a/hacks/braid.c b/hacks/braid.c
new file mode 100644 (file)
index 0000000..9d9c4e5
--- /dev/null
@@ -0,0 +1,434 @@
+/* -*- Mode: C; tab-width: 4 -*-
+ * braid --- draws random color-cyling rotating braids around a circle.
+ */
+#if !defined( lint ) && !defined( SABER )
+static const char sccsid[] = "@(#)braid.c      4.00 97/01/01 xlockmore";
+#endif
+
+/*
+ * Copyright (c) 1995 by John Neil.
+ *
+ * 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.
+ *
+ * This file is provided AS IS with no warranties of any kind.  The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof.  In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * Revision History:
+ * 10-May-97: jwz@jwz.org: turned into a standalone program.
+ * 01-Sep-95: color knotted components differently, J. Neil.
+ * 29-Aug-95: Written.  John Neil <neil@math.idbsu.edu>
+ */
+
+#ifdef STANDALONE
+# define PROGCLASS                                     "Braid"
+# define HACK_INIT                                     init_braid
+# define HACK_DRAW                                     draw_braid
+# define braid_opts                                    xlockmore_opts
+# define DEFAULTS      "*count:                15    \n"                       \
+                                       "*size:            -7     \n"                   \
+                                       "*cycles:               100   \n"                       \
+                                       "*delay:                1000  \n"                       \
+                                       "*ncolors:              64    \n"
+# define UNIFORM_COLORS
+# include "xlockmore.h"                                /* from the xscreensaver distribution */
+# include "erase.h"
+#else  /* !STANDALONE */
+# include "xlock.h"                                    /* from the xlockmore distribution */
+#endif /* !STANDALONE */
+
+ModeSpecOpt braid_opts = {
+  0, NULL, 0, NULL, NULL };
+
+
+#if defined( COLORROUND ) && defined( COLORCOMP )
+#undef COLORROUND
+#undef COLORCOMP
+#endif
+
+#if !defined( COLORROUND ) && !defined( COLORCOMP )
+#if 0
+/* to color in a circular pattern use COLORROUND */
+#define COLORROUND
+#else
+/* to color by component use COLORCOMP */
+#define COLORCOMP
+#endif
+#endif
+
+#define MAXLENGTH  50          /* the maximum length of a braid word */
+#define MINLENGTH  8           /* the minimum length of a braid word */
+#define MAXSTRANDS  15         /* the maximum number of strands in the braid */
+#define MINSTRANDS  3          /* the minimum number of strands in the braid */
+#define SPINRATE  12.0         /* the rate at which the colors spin */
+
+#define INTRAND(min,max) (NRAND((max+1)-(min))+(min))
+#define FLOATRAND(min,max) ((min)+((double) LRAND()/((double) MAXRAND))*((max)-(min)))
+
+typedef struct {
+       int         braidword[MAXLENGTH];
+       int         components[MAXSTRANDS];
+       int         startcomp[MAXLENGTH][MAXSTRANDS];
+       int         nstrands;
+       int         braidlength;
+       float       startcolor;
+       int         center_x;
+       int         center_y;
+       float       min_radius;
+       float       max_radius;
+       float       top, bottom, left, right;
+       int         age;
+    int         color_direction;
+} braidtype;
+
+static braidtype *braids = NULL;
+
+static int
+applyword(braidtype * braid, int string, int position)
+{
+       int         i, c;
+
+       c = string;
+       for (i = position; i < braid->braidlength; i++) {
+               if (c == ABS(braid->braidword[i]))
+                       c--;
+               else if (c == ABS(braid->braidword[i]) - 1)
+                       c++;
+       }
+       for (i = 0; i < position; i++) {
+               if (c == ABS(braid->braidword[i]))
+                       c--;
+               else if (c == ABS(braid->braidword[i]) - 1)
+                       c++;
+       }
+       return c;
+}
+
+#if 0
+static int
+applywordto(braidtype * braid, int string, int position)
+{
+       int         i, c;
+
+       c = string;
+       for (i = 0; i < position; i++) {
+               if (c == ABS(braid->braidword[i])) {
+                       c--;
+               } else if (c == ABS(braid->braidword[i]) - 1) {
+                       c++;
+               }
+       }
+       return c;
+}
+#endif
+
+static int
+applywordbackto(braidtype * braid, int string, int position)
+{
+       int         i, c;
+
+       c = string;
+       for (i = position - 1; i >= 0; i--) {
+               if (c == ABS(braid->braidword[i])) {
+                       c--;
+               } else if (c == ABS(braid->braidword[i]) - 1) {
+                       c++;
+               }
+       }
+       return c;
+}
+
+void
+init_braid(ModeInfo * mi)
+{
+       Display    *display = MI_DISPLAY(mi);
+       braidtype  *braid;
+       int         used[MAXSTRANDS];
+       int         i, count, comp, c;
+       float       min_length;
+
+       if (braids == NULL) {
+               if ((braids = (braidtype *) calloc(MI_NUM_SCREENS(mi),
+                                               sizeof (braidtype))) == NULL)
+                       return;
+       }
+       braid = &braids[MI_SCREEN(mi)];
+
+       braid->center_x = MI_WIN_WIDTH(mi) / 2;
+       braid->center_y = MI_WIN_HEIGHT(mi) / 2;
+       braid->age = 0;
+
+       /* jwz: go in the other direction sometimes. */
+       braid->color_direction = ((LRAND() & 1) ? 1 : -1);
+       XClearWindow(display, MI_WINDOW(mi));
+
+       min_length = (braid->center_x > braid->center_y) ?
+               braid->center_y : braid->center_x;
+       braid->min_radius = min_length * 0.30;
+       braid->max_radius = min_length * 0.90;
+
+       if (MI_BATCHCOUNT(mi) < MINSTRANDS)
+               braid->nstrands = MINSTRANDS;
+       else
+               braid->nstrands = INTRAND(MINSTRANDS,
+                                 MAX(MIN(MIN(MAXSTRANDS, MI_BATCHCOUNT(mi)),
+                                         (int) ((braid->max_radius - braid->min_radius) / 5.0)), MINSTRANDS));
+       braid->braidlength = INTRAND(MINLENGTH, MIN(MAXLENGTH, braid->nstrands * 6));
+
+       for (i = 0; i < braid->braidlength; i++) {
+               braid->braidword[i] =
+                       INTRAND(1, braid->nstrands - 1) * (INTRAND(1, 2) * 2 - 3);
+               if (i > 0)
+                       while (braid->braidword[i] == -braid->braidword[i - 1])
+                               braid->braidword[i] = INTRAND(1, braid->nstrands - 1) * (INTRAND(1, 2) * 2 - 3);
+       }
+
+       while (braid->braidword[0] == -braid->braidword[braid->braidlength - 1])
+               braid->braidword[braid->braidlength - 1] =
+                       INTRAND(1, braid->nstrands - 1) * (INTRAND(1, 2) * 2 - 3);
+
+       do {
+               (void) memset((char *) used, 0, sizeof (used));
+               count = 0;
+               for (i = 0; i < braid->braidlength; i++)
+                       used[ABS(braid->braidword[i])]++;
+               for (i = 0; i < braid->nstrands; i++)
+                       count += (used[i] > 0) ? 1 : 0;
+               if (count < braid->nstrands - 1) {
+                       braid->braidword[braid->braidlength] =
+                               INTRAND(1, braid->nstrands - 1) * (INTRAND(1, 2) * 2 - 3);
+                       while (braid->braidword[braid->braidlength] ==
+                              -braid->braidword[braid->braidlength - 1] &&
+                              braid->braidword[0] == -braid->braidword[braid->braidlength])
+                               braid->braidword[braid->braidlength] =
+                                       INTRAND(1, braid->nstrands - 1) * (INTRAND(1, 2) * 2 - 3);
+                       braid->braidlength++;
+               }
+       } while (count < braid->nstrands - 1 && braid->braidlength < MAXLENGTH);
+
+       braid->startcolor = (MI_NPIXELS(mi) > 2) ?
+               (float) NRAND(MI_NPIXELS(mi)) : 0.0;
+       /* XSetLineAttributes (display, MI_GC(mi), 2, LineSolid, CapRound, 
+          JoinRound); */
+
+       (void) memset((char *) braid->components, 0, sizeof (braid->components));
+       c = 1;
+       comp = 0;
+       braid->components[0] = 1;
+       do {
+               i = comp;
+               do {
+                       i = applyword(braid, i, 0);
+                       braid->components[i] = braid->components[comp];
+               } while (i != comp);
+               count = 0;
+               for (i = 0; i < braid->nstrands; i++)
+                       if (braid->components[i] == 0)
+                               count++;
+               if (count > 0) {
+                       for (comp = 0; braid->components[comp] != 0; comp++);
+                       braid->components[comp] = ++c;
+               }
+       } while (count > 0);
+
+       {
+         int line_width = MI_SIZE(mi);
+         if (line_width == 0)
+               line_width = -8;
+         if (line_width < 0)
+               line_width = NRAND(-line_width)+1;
+         if (line_width == 1)
+               line_width = 0;
+         XSetLineAttributes(MI_DISPLAY(mi), MI_GC(mi), line_width,
+                                                LineSolid,
+                                                (line_width <= 3 ? CapButt : CapRound),
+                                                JoinMiter);
+       }
+
+
+       for (i = 0; i < braid->nstrands; i++)
+               if (!(braid->components[i] & 1))
+                       braid->components[i] *= -1;
+}
+
+void
+draw_braid(ModeInfo * mi)
+{
+       Display    *display = MI_DISPLAY(mi);
+       Window      window = MI_WINDOW(mi);
+       braidtype  *braid = &braids[MI_SCREEN(mi)];
+       float       num_points, t_inc;
+       float       theta, psi;
+       float       t, r_diff;
+       int         i, s;
+       float       x_1, y_1, x_2, y_2, r1, r2;
+       float       color, color_use = 0.0, color_inc;
+
+       num_points = 500.0;
+       theta = (2.0 * M_PI) / (float) (braid->braidlength);
+       t_inc = (2.0 * M_PI) / num_points;
+       color_inc = (float) MI_NPIXELS(mi) / num_points;
+       color_inc *= braid->color_direction;
+
+       braid->startcolor += SPINRATE * color_inc;
+       if (braid->startcolor >= MI_NPIXELS(mi))
+               braid->startcolor = 0.0;
+
+       r_diff = (braid->max_radius - braid->min_radius) / (float) (braid->nstrands);
+
+       color = braid->startcolor;
+       psi = 0.0;
+       for (i = 0; i < braid->braidlength; i++) {
+               psi += theta;
+               for (t = 0.0; t < theta; t += t_inc) {
+#ifdef COLORROUND
+                       color += color_inc;
+                       if (color >= (float) (MI_NPIXELS(mi)))
+                               color = 0.0;
+                       color_use = color;
+#endif
+                       for (s = 0; s < braid->nstrands; s++) {
+                               if (ABS(braid->braidword[i]) == s)
+                                       continue;
+                               if (ABS(braid->braidword[i]) - 1 == s) {
+                                       /* crosSINFg */
+#ifdef COLORCOMP
+                                       if (MI_NPIXELS(mi) > 2) {
+                                               color_use = color + SPINRATE *
+                                                       braid->components[applywordbackto(braid, s, i)] +
+                                                       (psi + t) / 2.0 / M_PI * (float) MI_NPIXELS(mi);
+                                               while (color_use >= (float) MI_NPIXELS(mi))
+                                                       color_use -= (float) MI_NPIXELS(mi);
+                                               while (color_use < 0.0)
+                                                       color_use += (float) MI_NPIXELS(mi);
+                                       }
+#endif
+#ifdef COLORROUND
+                                       if (MI_NPIXELS(mi) > 2) {
+                                               color_use += SPINRATE * color_inc;
+                                               while (color_use >= (float) (MI_NPIXELS(mi)))
+                                                       color_use -= (float) MI_NPIXELS(mi);
+                                       }
+#endif
+                                       r1 = braid->min_radius + r_diff * (float) (s);
+                                       r2 = braid->min_radius + r_diff * (float) (s + 1);
+                                       if (braid->braidword[i] > 0 ||
+                                           (FABSF(t - theta / 2.0) > theta / 7.0)) {
+                                               x_1 = ((0.5 * (1.0 + SINF(t / theta * M_PI - M_PI_2)) * r2 +
+                                                       0.5 * (1.0 + SINF((theta - t) / theta * M_PI - M_PI_2)) * r1)) *
+                                                       COSF(t + psi) + braid->center_x;
+                                               y_1 = ((0.5 * (1.0 + SINF(t / theta * M_PI - M_PI_2)) * r2 +
+                                                       0.5 * (1.0 + SINF((theta - t) / theta * M_PI - M_PI_2)) * r1)) *
+                                                       SINF(t + psi) + braid->center_y;
+                                               x_2 = ((0.5 * (1.0 + SINF((t + t_inc) / theta * M_PI - M_PI_2)) * r2 +
+                                                       0.5 * (1.0 + SINF((theta - t - t_inc) / theta * M_PI - M_PI_2)) * r1)) *
+                                                       COSF(t + t_inc + psi) + braid->center_x;
+                                               y_2 = ((0.5 * (1.0 + SINF((t + t_inc) / theta * M_PI - M_PI_2)) * r2 +
+                                                       0.5 * (1.0 + SINF((theta - t - t_inc) / theta * M_PI - M_PI_2)) * r1)) *
+                                                       SINF(t + t_inc + psi) + braid->center_y;
+                                               if (MI_NPIXELS(mi) > 2)
+                                                       XSetForeground(display, MI_GC(mi), MI_PIXEL(mi, (int) color_use));
+                                               else
+                                                       XSetForeground(display, MI_GC(mi), MI_WIN_WHITE_PIXEL(mi));
+
+                                               XDrawLine(display, window, MI_GC(mi),
+                                                         (int) (x_1), (int) (y_1), (int) (x_2), (int) (y_2));
+                                       }
+#ifdef COLORCOMP
+                                       if (MI_NPIXELS(mi) > 2) {
+                                               color_use = color + SPINRATE *
+                                                       braid->components[applywordbackto(braid, s + 1, i)] +
+                                                       (psi + t) / 2.0 / M_PI * (float) MI_NPIXELS(mi);
+                                               while (color_use >= (float) MI_NPIXELS(mi))
+                                                       color_use -= (float) MI_NPIXELS(mi);
+                                               while (color_use < 0.0)
+                                                       color_use += (float) MI_NPIXELS(mi);
+                                       }
+#endif
+                                       if (braid->braidword[i] < 0 ||
+                                           (FABSF(t - theta / 2.0) > theta / 7.0)) {
+                                               x_1 = ((0.5 * (1.0 + SINF(t / theta * M_PI - M_PI_2)) * r1 +
+                                                       0.5 * (1.0 + SINF((theta - t) / theta * M_PI - M_PI_2)) * r2)) *
+                                                       COSF(t + psi) + braid->center_x;
+                                               y_1 = ((0.5 * (1.0 + SINF(t / theta * M_PI - M_PI_2)) * r1 +
+                                                       0.5 * (1.0 + SINF((theta - t) / theta * M_PI - M_PI_2)) * r2)) *
+                                                       SINF(t + psi) + braid->center_y;
+                                               x_2 = ((0.5 * (1.0 + SINF((t + t_inc) / theta * M_PI - M_PI_2)) * r1 +
+                                                       0.5 * (1.0 + SINF((theta - t - t_inc) / theta * M_PI - M_PI_2)) * r2)) *
+                                                       COSF(t + t_inc + psi) + braid->center_x;
+                                               y_2 = ((0.5 * (1.0 + SINF((t + t_inc) / theta * M_PI - M_PI_2)) * r1 +
+                                                       0.5 * (1.0 + SINF((theta - t - t_inc) / theta * M_PI - M_PI_2)) * r2)) *
+                                                       SINF(t + t_inc + psi) + braid->center_y;
+                                               if (MI_NPIXELS(mi) > 2)
+                                                       XSetForeground(display, MI_GC(mi), MI_PIXEL(mi, (int) color_use));
+                                               else
+                                                       XSetForeground(display, MI_GC(mi), MI_WIN_WHITE_PIXEL(mi));
+
+                                               XDrawLine(display, window, MI_GC(mi),
+                                                         (int) (x_1), (int) (y_1), (int) (x_2), (int) (y_2));
+                                       }
+                               } else {
+                                       /* no crosSINFg */
+#ifdef COLORCOMP
+                                       if (MI_NPIXELS(mi) > 2) {
+                                               color_use = color + SPINRATE *
+                                                       braid->components[applywordbackto(braid, s, i)] +
+                                                       (psi + t) / 2.0 / M_PI * (float) MI_NPIXELS(mi);
+                                               while (color_use >= (float) MI_NPIXELS(mi))
+                                                       color_use -= (float) MI_NPIXELS(mi);
+                                               while (color_use < 0.0)
+                                                       color_use += (float) MI_NPIXELS(mi);
+                                       }
+#endif
+#ifdef COLORROUND
+                                       if (MI_NPIXELS(mi) > 2) {
+                                               color_use += SPINRATE * color_inc;
+                                               while (color_use >= (float) MI_NPIXELS(mi))
+                                                       color_use -= (float) MI_NPIXELS(mi);
+                                       }
+#endif
+                                       r1 = braid->min_radius + r_diff * (float) (s);
+                                       x_1 = r1 * COSF(t + psi) + braid->center_x;
+                                       y_1 = r1 * SINF(t + psi) + braid->center_y;
+                                       x_2 = r1 * COSF(t + t_inc + psi) + braid->center_x;
+                                       y_2 = r1 * SINF(t + t_inc + psi) + braid->center_y;
+                                       if (MI_NPIXELS(mi) > 2)
+                                               XSetForeground(display, MI_GC(mi), MI_PIXEL(mi, (int) color_use));
+                                       else
+                                               XSetForeground(display, MI_GC(mi), MI_WIN_WHITE_PIXEL(mi));
+
+                                       XDrawLine(display, window, MI_GC(mi),
+                                                 (int) (x_1), (int) (y_1), (int) (x_2), (int) (y_2));
+                               }
+                       }
+               }
+       }
+
+       if (++braid->age > MI_CYCLES(mi)) {
+#ifdef STANDALONE
+         erase_full_window(MI_DISPLAY(mi), MI_WINDOW(mi));
+#endif
+         init_braid(mi);
+       }
+}
+
+void
+release_braid(ModeInfo * mi)
+{
+       if (braids != NULL) {
+               (void) free((void *) braids);
+               braids = NULL;
+       }
+}
+
+void
+refresh_braid(ModeInfo * mi)
+{
+       /* Do nothing, it will refresh by itself */
+}
diff --git a/hacks/braid.man b/hacks/braid.man
new file mode 100644 (file)
index 0000000..65637af
--- /dev/null
@@ -0,0 +1,65 @@
+.TH XScreenSaver 1 "10-May-97" "X Version 11"
+.SH NAME
+braid - draws random color-cycling braids around a circle
+.SH SYNOPSIS
+.B braid
+[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-ncolors \fIinteger\fP] [\-delay \fImicroseconds\fP] [\-cycles \fIinteger\fP] [\-count \fIinteger\fP]
+
+.SH DESCRIPTION
+The \fIbraid\fP program draws random color-cycling braids around a circle.
+.SH OPTIONS
+.I braid
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window.  This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-mono 
+If on a color display, pretend we're on a monochrome display.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use.  Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-ncolors \fIinteger\fP
+How many colors should be used (if possible).  Default 64.
+The colors used cycle through the hue, making N stops around
+the color wheel.
+.TP 8
+.B \-cycles \fIinteger\fP
+
+.TP 8
+.B \-count \fIinteger\fP
+
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1),
+.BR xlock (1)
+.SH COPYRIGHT
+Copyright \(co 1995 by John Neil.
+
+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. 
+.SH AUTHOR
+John Neil <neil@math.idbsu.edu>, 29-Aug-95.
+
+Ability to run standalone or with \fIxscreensaver\fP added by 
+Jamie Zawinski <jwz@jwz.org>, 10-May-97.
diff --git a/hacks/bsod.c b/hacks/bsod.c
new file mode 100644 (file)
index 0000000..bbbc2ca
--- /dev/null
@@ -0,0 +1,1122 @@
+/* xscreensaver, Copyright (c) 1998 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software 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.  No representations are made about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or 
+ * implied warranty.
+ *
+ * Blue Screen of Death: the finest in personal computer emulation.
+ * Concept cribbed from Stephen Martin <smartin@mks.com>;
+ * this version written by jwz, 4-Jun-98.
+ *
+ *   TODO:
+ *      -  Should simulate a Unix kernel panic and reboot.
+ *      -  Making various boot noises would be fun, too.
+ *      -  Maybe scatter some random bits across the screen,
+ *         to simulate corruption of video ram?
+ *      -  Should randomize the various hex numbers printed.
+ */
+
+#include "screenhack.h"
+#include <stdio.h>
+#include <X11/Xutil.h>
+
+#ifdef HAVE_XPM
+# include <X11/xpm.h>
+# include "images/amiga.xpm"
+#endif
+
+#include "images/atari.xbm"
+#include "images/mac.xbm"
+
+
+static void
+draw_string (Display *dpy, Window window, GC gc, XGCValues *gcv,
+            XFontStruct *font,
+            int xoff, int yoff,
+            int win_width, int win_height,
+            const char *string, int delay)
+{
+  int x, y;
+  int width = 0, height = 0, cw = 0;
+  int char_width, line_height;
+
+  const char *s = string;
+  const char *se = string;
+
+  /* This pretty much assumes fixed-width fonts */
+  char_width = (font->per_char
+               ? font->per_char['n'-font->min_char_or_byte2].width
+               : font->min_bounds.width);
+  line_height = font->ascent + font->descent + 1;
+
+  while (1)
+    {
+      if (*s == '\n' || !*s)
+       {
+         height++;
+         if (cw > width) width = cw;
+         cw = 0;
+         if (!*s) break;
+       }
+      else
+       cw++;
+      s++;
+    }
+
+  x = (win_width - (width * char_width)) / 2;
+  y = (win_height - (height * line_height)) / 2;
+
+  if (x < 0) x = 2;
+  if (y < 0) y = 2;
+
+  x += xoff;
+  y += yoff;
+
+  se = s = string;
+  while (1)
+    {
+      if (*s == '\n' || !*s)
+       {
+         int off = 0;
+         Bool flip = False;
+
+         if (*se == '@' || *se == '_')
+           {
+             if (*se == '@') flip = True;
+             se++;
+             off = (char_width * (width - (s - se))) / 2;
+           }
+
+         if (flip)
+           {
+             XSetForeground(dpy, gc, gcv->background);
+             XSetBackground(dpy, gc, gcv->foreground);
+           }
+
+         if (s != se)
+           XDrawImageString(dpy, window, gc, x+off, y+font->ascent, se, s-se);
+
+         if (flip)
+           {
+             XSetForeground(dpy, gc, gcv->foreground);
+             XSetBackground(dpy, gc, gcv->background);
+           }
+
+         se = s;
+         y += line_height;
+         if (!*s) break;
+         se = s+1;
+
+         if (delay)
+           {
+             XSync(dpy, False);
+             usleep(delay);
+           }
+       }
+      s++;
+    }
+}
+
+
+static Pixmap
+double_pixmap(Display *dpy, GC gc, Visual *visual, int depth, Pixmap pixmap,
+            int pix_w, int pix_h)
+{
+  int x, y;
+  Pixmap p2 = XCreatePixmap(dpy, pixmap, pix_w*2, pix_h*2, depth);
+  XImage *i1 = XGetImage(dpy, pixmap, 0, 0, pix_w, pix_h, ~0L, ZPixmap);
+  XImage *i2 = XCreateImage(dpy, visual, depth, ZPixmap, 0, 0,
+                           pix_w*2, pix_h*2, 8, 0);
+  i2->data = (char *) calloc(i2->height, i2->bytes_per_line);
+  for (y = 0; y < pix_h; y++)
+    for (x = 0; x < pix_w; x++)
+      {
+       unsigned long p = XGetPixel(i1, x, y);
+       XPutPixel(i2, x*2,   y*2,   p);
+       XPutPixel(i2, x*2+1, y*2,   p);
+       XPutPixel(i2, x*2,   y*2+1, p);
+       XPutPixel(i2, x*2+1, y*2+1, p);
+      }
+  free(i1->data); i1->data = 0;
+  XDestroyImage(i1);
+  XPutImage(dpy, p2, gc, i2, 0, 0, 0, 0, i2->width, i2->height);
+  free(i2->data); i2->data = 0;
+  XDestroyImage(i2);
+  XFreePixmap(dpy, pixmap);
+  return p2;
+}
+
+
+/* Sleep for N seconds and return False.  But if a key or mouse event is
+   seen, discard all pending key or mouse events, and return True.
+ */
+static Bool
+bsod_sleep(Display *dpy, int seconds)
+{
+  int q = seconds * 4;
+  int quantum = 250000;
+
+  if (seconds == -1)
+    q = 1, quantum = 100000;
+
+  do
+    {
+      XSync(dpy, False);
+      while (XPending (dpy))
+        {
+          XEvent event;
+          XNextEvent (dpy, &event);
+          if (event.xany.type == ButtonPress)
+            return True;
+          if (event.xany.type == KeyPress)
+            {
+              KeySym keysym;
+              char c = 0;
+              XLookupString (&event.xkey, &c, 1, &keysym, 0);
+              if (c == ' ' || c == '\t' || c == '\r' || c == '\n')
+                return True;
+            }
+          screenhack_handle_event (dpy, &event);
+        }
+
+      if (q > 0)
+       {
+         q--;
+         usleep(quantum);
+       }
+    }
+  while (q > 0);
+
+  return False; 
+}
+
+
+static Bool
+windows (Display *dpy, Window window, int delay, Bool w95p)
+{
+  XGCValues gcv;
+  XWindowAttributes xgwa;
+  char *fontname;
+  const char *def_font = "fixed";
+  XFontStruct *font;
+  GC gc;
+
+  const char *w95 =
+    ("@Windows\n"
+     "A fatal exception 0E has occured at F0AD:42494C4C\n"
+     "the current application will be terminated.\n"
+     "\n"
+     "* Press any key to terminate the current application.\n"
+     "* Press CTRL+ALT+DELETE again to restart your computer.\n"
+     "  You will lose any unsaved information in all applications.\n"
+     "\n"
+     "\n"
+     "_Press any key to continue");
+
+  const char *wnt =
+    ("*** STOP: 0x0000001E (0x80000003,0x80106fc0,0x8025ea21,0xfd6829e8)\n"
+   "Unhandled Kernel exception c0000047 from fa8418b4 (8025ea21,fd6829e8)\n"
+   "\n"
+   "Dll Base Date Stamp - Name             Dll Base Date Stamp - Name\n"
+   "80100000 2be154c9 - ntoskrnl.exe       80400000 2bc153b0 - hal.dll\n"
+   "80258000 2bd49628 - ncrc710.sys        8025c000 2bd49688 - SCSIPORT.SYS \n"
+   "80267000 2bd49683 - scsidisk.sys       802a6000 2bd496b9 - Fastfat.sys\n"
+   "fa800000 2bd49666 - Floppy.SYS         fa810000 2bd496db - Hpfs_Rec.SYS\n"
+   "fa820000 2bd49676 - Null.SYS           fa830000 2bd4965a - Beep.SYS\n"
+   "fa840000 2bdaab00 - i8042prt.SYS       fa850000 2bd5a020 - SERMOUSE.SYS\n"
+   "fa860000 2bd4966f - kbdclass.SYS       fa870000 2bd49671 - MOUCLASS.SYS\n"
+   "fa880000 2bd9c0be - Videoprt.SYS       fa890000 2bd49638 - NCC1701E.SYS\n"
+   "fa8a0000 2bd4a4ce - Vga.SYS            fa8b0000 2bd496d0 - Msfs.SYS\n"
+   "fa8c0000 2bd496c3 - Npfs.SYS           fa8e0000 2bd496c9 - Ntfs.SYS\n"
+   "fa940000 2bd496df - NDIS.SYS           fa930000 2bd49707 - wdlan.sys\n"
+   "fa970000 2bd49712 - TDI.SYS            fa950000 2bd5a7fb - nbf.sys\n"
+   "fa980000 2bd72406 - streams.sys        fa9b0000 2bd4975f - ubnb.sys\n"
+   "fa9c0000 2bd5bfd7 - usbser.sys         fa9d0000 2bd4971d - netbios.sys\n"
+   "fa9e0000 2bd49678 - Parallel.sys       fa9f0000 2bd4969f - serial.SYS\n"
+   "faa00000 2bd49739 - mup.sys            faa40000 2bd4971f - SMBTRSUP.SYS\n"
+   "faa10000 2bd6f2a2 - srv.sys            faa50000 2bd4971a - afd.sys\n"
+   "faa60000 2bd6fd80 - rdr.sys            faaa0000 2bd49735 - bowser.sys\n"
+   "\n"
+   "Address dword dump Dll Base                                      - Name\n"
+   "801afc20 80106fc0 80106fc0 00000000 00000000 80149905 : "
+     "fa840000 - i8042prt.SYS\n"
+   "801afc24 80149905 80149905 ff8e6b8c 80129c2c ff8e6b94 : "
+     "8025c000 - SCSIPORT.SYS\n"
+   "801afc2c 80129c2c 80129c2c ff8e6b94 00000000 ff8e6b94 : "
+     "80100000 - ntoskrnl.exe\n"
+   "801afc34 801240f2 80124f02 ff8e6df4 ff8e6f60 ff8e6c58 : "
+     "80100000 - ntoskrnl.exe\n"
+   "801afc54 80124f16 80124f16 ff8e6f60 ff8e6c3c 8015ac7e : "
+     "80100000 - ntoskrnl.exe\n"
+   "801afc64 8015ac7e 8015ac7e ff8e6df4 ff8e6f60 ff8e6c58 : "
+     "80100000 - ntoskrnl.exe\n"
+   "801afc70 80129bda 80129bda 00000000 80088000 80106fc0 : "
+     "80100000 - ntoskrnl.exe\n"
+   "\n"
+   "Kernel Debugger Using: COM2 (Port 0x2f8, Baud Rate 19200)\n"
+   "Restart and set the recovery options in the system control panel\n"
+   "or the /CRASHDEBUG system start option. If this message reappears,\n"
+   "contact your system administrator or technical support group."
+     );
+
+  if (!get_boolean_resource((w95p? "doWindows" : "doNT"), "DoWindows"))
+    return False;
+
+  XGetWindowAttributes (dpy, window, &xgwa);
+
+  fontname = get_string_resource ((xgwa.height > 600
+                                  ? (w95p
+                                     ? "windows95.font2"
+                                     : "windowsNT.font2")
+                                  : (w95p
+                                     ? "windows95.font"
+                                     : "windowsNT.font")),
+                                 "Windows.Font");
+  if (!fontname || !*fontname) fontname = (char *)def_font;
+  font = XLoadQueryFont (dpy, fontname);
+  if (!font) font = XLoadQueryFont (dpy, def_font);
+  if (!font) exit(-1);
+  if (fontname && fontname != def_font)
+    free (fontname);
+
+  gcv.font = font->fid;
+  gcv.foreground = get_pixel_resource((w95p
+                                      ? "windows95.foreground"
+                                      : "windowsNT.foreground"),
+                                     "Windows.Foreground",
+                                     dpy, xgwa.colormap);
+  gcv.background = get_pixel_resource((w95p
+                                      ? "windows95.background"
+                                      : "windowsNT.background"),
+                                     "Windows.Background",
+                                     dpy, xgwa.colormap);
+  XSetWindowBackground(dpy, window, gcv.background);
+  XClearWindow(dpy, window);
+
+  gc = XCreateGC(dpy, window, GCFont|GCForeground|GCBackground, &gcv);
+
+  if (w95p)
+    draw_string(dpy, window, gc, &gcv, font,
+               0, 0, xgwa.width, xgwa.height, w95, 0);
+  else
+    draw_string(dpy, window, gc, &gcv, font, 0, 0, 10, 10, wnt, 750);
+
+  XFreeGC(dpy, gc);
+  XSync(dpy, False);
+  bsod_sleep(dpy, delay);
+  XClearWindow(dpy, window);
+  XFreeFont(dpy, font);
+  return True;
+}
+
+/* SCO OpenServer 5 panic, by Tom Kelly <tom@ancilla.toronto.on.ca>
+ */
+static Bool
+sco (Display *dpy, Window window, int delay)
+{
+  XGCValues gcv;
+  XWindowAttributes xgwa;
+  char *fontname;
+  const char *def_font = "fixed";
+  XFontStruct *font;
+  GC gc;
+  int lines_1 = 0, lines_2 = 0, lines_3 = 0, lines_4 = 0;
+  const char *s;
+
+  const char *sco_panic_1 =
+    ("Unexpected trap in kernel mode:\n"
+     "\n"
+     "cr0 0x80010013     cr2  0x00000014     cr3 0x00000000  tlb  0x00000000\n"
+     "ss  0x00071054    uesp  0x00012055     efl 0x00080888  ipl  0x00000005\n"
+     "cs  0x00092585     eip  0x00544a4b     err 0x004d4a47  trap 0x0000000E\n"
+     "eax 0x0045474b     ecx  0x0042544b     edx 0x57687920  ebx  0x61726520\n"
+     "esp 0x796f7520     ebp  0x72656164     esi 0x696e6720  edi  0x74686973\n"
+     "ds  0x3f000000     es   0x43494c48     fs  0x43525343  gs   0x4f4d4b53\n"
+     "\n"
+     "PANIC: k_trap - kernel mode trap type 0x0000000E\n"
+     "Trying to dump 5023 pages to dumpdev hd (1/41), 63 pages per '.'\n"
+    );
+  const char *sco_panic_2 =
+   ("...............................................................................\n"
+    );
+  const char *sco_panic_3 =
+    ("5023 pages dumped\n"
+     "\n"
+     "\n"
+     );
+  const char *sco_panic_4 =
+    ("**   Safe to Power Off   **\n"
+     "           - or -\n"
+     "** Press Any Key to Reboot **\n"
+    );
+
+  if (!get_boolean_resource("doSCO", "DoSCO"))
+    return False;
+
+  for (s = sco_panic_1; *s; s++) if (*s == '\n') lines_1++;
+  for (s = sco_panic_2; *s; s++) if (*s == '\n') lines_2++;
+  for (s = sco_panic_3; *s; s++) if (*s == '\n') lines_3++;
+  for (s = sco_panic_4; *s; s++) if (*s == '\n') lines_4++;
+
+  XGetWindowAttributes (dpy, window, &xgwa);
+
+  fontname = get_string_resource ((xgwa.height > 600
+                                  ? "sco.font2"
+                                  : "sco.font"),
+                                 "SCO.Font");
+  if (!fontname || !*fontname) fontname = (char *)def_font;
+  font = XLoadQueryFont (dpy, fontname);
+  if (!font) font = XLoadQueryFont (dpy, def_font);
+  if (!font) exit(-1);
+  if (fontname && fontname != def_font)
+    free (fontname);
+
+  gcv.font = font->fid;
+  gcv.foreground = get_pixel_resource(("sco.foreground"),
+                                     "SCO.Foreground",
+                                     dpy, xgwa.colormap);
+  gcv.background = get_pixel_resource(("sco.background"),
+                                     "SCO.Background",
+                                     dpy, xgwa.colormap);
+  XSetWindowBackground(dpy, window, gcv.background);
+  XClearWindow(dpy, window);
+
+  gc = XCreateGC(dpy, window, GCFont|GCForeground|GCBackground, &gcv);
+
+  draw_string(dpy, window, gc, &gcv, font,
+             10, xgwa.height - ((lines_1 + lines_2 + lines_3 + lines_4 + 1) *
+                                 (font->ascent + font->descent + 1)),
+             10, 10,
+             sco_panic_1, 0);
+  XSync(dpy, False);
+  for (s = sco_panic_2; *s; s++)
+    {
+      char *ss = strdup(sco_panic_2);
+      ss[s - sco_panic_2] = 0;
+      draw_string(dpy, window, gc, &gcv, font,
+                  10, xgwa.height - ((lines_2 + lines_3 + lines_4 + 1) *
+                                     (font->ascent + font->descent + 1)),
+                  10, 10,
+                  ss, 0);
+      XSync(dpy, False);
+      free(ss);
+      if (bsod_sleep (dpy, -1))
+        goto DONE;
+    }
+
+  draw_string(dpy, window, gc, &gcv, font,
+             10, xgwa.height - ((lines_3 + lines_4 + 1) *
+                                 (font->ascent + font->descent + 1)),
+             10, 10,
+             sco_panic_3, 0);
+  XSync(dpy, False);
+  if (bsod_sleep(dpy, 1))
+    goto DONE;
+  draw_string(dpy, window, gc, &gcv, font,
+             10, xgwa.height - ((lines_4 + 1) *
+                                 (font->ascent + font->descent + 1)),
+             10, 10,
+             sco_panic_4, 0);
+  XSync(dpy, False);
+
+  bsod_sleep(dpy, delay);
+ DONE:
+  XClearWindow(dpy, window);
+  XFreeGC(dpy, gc);
+  XFreeFont(dpy, font);
+  return True;
+}
+
+
+/* Linux (sparc) panic, by Tom Kelly <tom@ancilla.toronto.on.ca>
+ */
+static Bool
+sparc_linux (Display *dpy, Window window, int delay)
+{
+  XGCValues gcv;
+  XWindowAttributes xgwa;
+  char *fontname;
+  const char *def_font = "fixed";
+  XFontStruct *font;
+  GC gc;
+  int lines = 1;
+  const char *s;
+
+  const char *linux_panic =
+    ("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"
+       "Unable to handle kernel paging request at virtual address f0d4a000\n"
+       "tsk->mm->context = 00000014\n"
+       "tsk->mm->pgd = f26b0000\n"
+       "              \\|/ ____ \\|/\n"
+       "              \"@'/ ,. \\`@\"\n"
+       "              /_| \\__/ |_\\\n"
+       "                 \\__U_/\n"
+       "gawk(22827): Oops\n"
+       "PSR: 044010c1 PC: f001c2cc NPC: f001c2d0 Y: 00000000\n"
+       "g0: 00001000 g1: fffffff7 g2: 04401086 g3: 0001eaa0\n"
+       "g4: 000207dc g5: f0130400 g6: f0d4a018 g7: 00000001\n"
+       "o0: 00000000 o1: f0d4a298 o2: 00000040 o3: f1380718\n"
+       "o4: f1380718 o5: 00000200 sp: f1b13f08 ret_pc: f001c2a0\n"
+       "l0: efffd880 l1: 00000001 l2: f0d4a230 l3: 00000014\n"
+       "l4: 0000ffff l5: f0131550 l6: f012c000 l7: f0130400\n"
+       "i0: f1b13fb0 i1: 00000001 i2: 00000002 i3: 0007c000\n"
+       "i4: f01457c0 i5: 00000004 i6: f1b13f70 i7: f0015360\n"
+       "Instruction DUMP:\n"
+    );
+
+  if (!get_boolean_resource("doSparcLinux", "DoSparcLinux"))
+    return False;
+
+  for (s = linux_panic; *s; s++) if (*s == '\n') lines++;
+
+  XGetWindowAttributes (dpy, window, &xgwa);
+
+  fontname = get_string_resource ((xgwa.height > 600
+                                  ? "sparclinux.font2"
+                                  : "sparclinux.font"),
+                                 "SparcLinux.Font");
+  if (!fontname || !*fontname) fontname = (char *)def_font;
+  font = XLoadQueryFont (dpy, fontname);
+  if (!font) font = XLoadQueryFont (dpy, def_font);
+  if (!font) exit(-1);
+  if (fontname && fontname != def_font)
+    free (fontname);
+
+  gcv.font = font->fid;
+  gcv.foreground = get_pixel_resource(("sparclinux.foreground"),
+                                     "SparcLinux.Foreground",
+                                     dpy, xgwa.colormap);
+  gcv.background = get_pixel_resource(("sparclinux.background"),
+                                     "SparcLinux.Background",
+                                     dpy, xgwa.colormap);
+  XSetWindowBackground(dpy, window, gcv.background);
+  XClearWindow(dpy, window);
+
+  gc = XCreateGC(dpy, window, GCFont|GCForeground|GCBackground, &gcv);
+
+  draw_string(dpy, window, gc, &gcv, font,
+             10, xgwa.height - (lines * (font->ascent + font->descent + 1)),
+             10, 10,
+             linux_panic, 0);
+  XFreeGC(dpy, gc);
+  XSync(dpy, False);
+  bsod_sleep(dpy, delay);
+  XClearWindow(dpy, window);
+  XFreeFont(dpy, font);
+  return True;
+}
+
+static Bool
+amiga (Display *dpy, Window window, int delay)
+{
+  XGCValues gcv;
+  XWindowAttributes xgwa;
+  char *fontname;
+  const char *def_font = "fixed";
+  XFontStruct *font;
+  GC gc, gc2;
+  int height;
+  unsigned long fg, bg, bg2;
+  Pixmap pixmap = 0;
+  int pix_w = 0, pix_h = 0;
+
+  const char *string =
+    ("_Software failure.  Press left mouse button to continue.\n"
+     "_Guru Meditation #00000003.00C01570");
+
+  if (!get_boolean_resource("doAmiga", "DoAmiga"))
+    return False;
+
+  XGetWindowAttributes (dpy, window, &xgwa);
+
+  fontname = get_string_resource ((xgwa.height > 600
+                                  ? "amiga.font2" : "amiga.font"),
+                                 "Amiga.Font");
+  if (!fontname || !*fontname) fontname = (char *)def_font;
+  font = XLoadQueryFont (dpy, fontname);
+  if (!font) font = XLoadQueryFont (dpy, def_font);
+  if (!font) exit(-1);
+  if (fontname && fontname != def_font)
+    free (fontname);
+
+  gcv.font = font->fid;
+  fg = gcv.foreground = get_pixel_resource("amiga.foreground",
+                                          "Amiga.Foreground",
+                                          dpy, xgwa.colormap);
+  bg = gcv.background = get_pixel_resource("amiga.background",
+                                          "Amiga.Background",
+                                          dpy, xgwa.colormap);
+  bg2 = get_pixel_resource("amiga.background2", "Amiga.Background",
+                          dpy, xgwa.colormap);
+  XSetWindowBackground(dpy, window, bg2);
+  XClearWindow(dpy, window);
+
+  gc = XCreateGC(dpy, window, GCFont|GCForeground|GCBackground, &gcv);
+  gcv.background = fg; gcv.foreground = bg;
+  gc2 = XCreateGC(dpy, window, GCFont|GCForeground|GCBackground, &gcv);
+
+  height = (font->ascent + font->descent) * 6;
+
+#ifdef HAVE_XPM
+  {
+    XpmAttributes xpmattrs;
+    int result;
+    xpmattrs.valuemask = 0;
+
+# ifdef XpmCloseness
+    xpmattrs.valuemask |= XpmCloseness;
+    xpmattrs.closeness = 40000;
+# endif
+# ifdef XpmVisual
+    xpmattrs.valuemask |= XpmVisual;
+    xpmattrs.visual = xgwa.visual;
+# endif
+# ifdef XpmDepth
+    xpmattrs.valuemask |= XpmDepth;
+    xpmattrs.depth = xgwa.depth;
+# endif
+# ifdef XpmColormap
+    xpmattrs.valuemask |= XpmColormap;
+    xpmattrs.colormap = xgwa.colormap;
+# endif
+
+    result = XpmCreatePixmapFromData(dpy, window, amiga_hand,
+                                    &pixmap, 0 /* mask */, &xpmattrs);
+    if (!pixmap || (result != XpmSuccess && result != XpmColorError))
+      pixmap = 0;
+    pix_w = xpmattrs.width;
+    pix_h = xpmattrs.height;
+  }
+#endif /* HAVE_XPM */
+
+  if (pixmap && xgwa.height > 600)     /* scale up the bitmap */
+    {
+      pixmap = double_pixmap(dpy, gc, xgwa.visual, xgwa.depth,
+                            pixmap, pix_w, pix_h);
+      pix_w *= 2;
+      pix_h *= 2;
+    }
+
+  if (pixmap)
+    {
+      int x = (xgwa.width - pix_w) / 2;
+      int y = ((xgwa.height - pix_h) / 2);
+      XCopyArea(dpy, pixmap, window, gc, 0, 0, pix_w, pix_h, x, y);
+
+      XSync(dpy, False);
+      bsod_sleep(dpy, 2);
+
+      XCopyArea(dpy, pixmap, window, gc, 0, 0, pix_w, pix_h, x, y + height);
+      XClearArea(dpy, window, 0, 0, xgwa.width, y + height, False);
+      XFreePixmap(dpy, pixmap);
+    }
+
+  XFillRectangle(dpy, window, gc2, 0, 0, xgwa.width, height);
+  draw_string(dpy, window, gc, &gcv, font, 0, 0, xgwa.width, height, string,0);
+
+  {
+    GC gca = gc;
+    while (delay > 0)
+      {
+       XFillRectangle(dpy, window, gca, 0, 0, xgwa.width, font->ascent);
+       XFillRectangle(dpy, window, gca, 0, 0, font->ascent, height);
+       XFillRectangle(dpy, window, gca, xgwa.width-font->ascent, 0,
+                      font->ascent, height);
+       XFillRectangle(dpy, window, gca, 0, height-font->ascent, xgwa.width,
+                      font->ascent);
+       gca = (gca == gc ? gc2 : gc);
+       XSync(dpy, False);
+       if (bsod_sleep(dpy, 1))
+         break;
+       delay--;
+      }
+  }
+
+  XFreeGC(dpy, gc);
+  XFreeGC(dpy, gc2);
+  XSync(dpy, False);
+  XClearWindow(dpy, window);
+  XFreeFont(dpy, font);
+  return True;
+}
+
+
+/* Atari ST, by Marcus Herbert <rhoenie@nobiscum.de>
+   Marcus had this to say:
+
+       Though I still have my Atari somewhere, I hardly remember
+       the meaning of the bombs. I think 9 bombs was "bus error" or
+       something like that.  And you often had a few bombs displayed
+       quickly and then the next few ones coming up step by step.
+       Perhaps somebody else can tell you more about it..  its just
+       a quick hack :-}
+ */
+static Bool
+atari (Display *dpy, Window window, int delay)
+{
+       
+  XGCValues gcv;
+  XWindowAttributes xgwa;
+  const char *def_font = "fixed";
+  XFontStruct *font;
+  GC gc;
+  Pixmap pixmap = 0;
+  int pix_w = atari_width;
+  int pix_h = atari_height;
+  int offset;
+  int i, x, y;
+
+  if (!get_boolean_resource("doAtari", "DoAtari"))
+    return False;
+
+  XGetWindowAttributes (dpy, window, &xgwa);
+
+  font = XLoadQueryFont (dpy, def_font);
+  if (!font) exit(-1);
+                
+  gcv.font = font->fid;
+  gcv.foreground = get_pixel_resource("atari.foreground", "Atari.Foreground",
+                                     dpy, xgwa.colormap);
+  gcv.background = get_pixel_resource("atari.background", "Atari.Background",
+                                     dpy, xgwa.colormap);
+
+  XSetWindowBackground(dpy, window, gcv.background);
+  XClearWindow(dpy, window);
+
+  gc = XCreateGC(dpy, window, GCFont|GCForeground|GCBackground, &gcv);
+
+  pixmap = XCreatePixmapFromBitmapData(dpy, window, (char *) atari_bits,
+                                      pix_w, pix_h,
+                                      gcv.foreground, gcv.background,
+                                      xgwa.depth);
+  pixmap = double_pixmap(dpy, gc, xgwa.visual, xgwa.depth,
+                        pixmap, pix_w, pix_h);
+  pix_w *= 2;
+  pix_h *= 2;
+
+  offset = pix_w + 2;
+  x = 5;
+  y = (xgwa.height - (xgwa.height / 5));
+  if (y < 0) y = 0;
+
+  for (i=0 ; i<7 ; i++) {
+    XCopyArea(dpy, pixmap, window, gc, 0, 0, pix_w, pix_h,
+             (x + (i*offset)), y);
+  }  
+  
+  for (i=7 ; i<10 ; i++) {
+    if (bsod_sleep(dpy, 1))
+      goto DONE;
+    XCopyArea(dpy, pixmap, window, gc, 0, 0, pix_w, pix_h,
+             (x + (i*offset)), y);
+  }
+
+  bsod_sleep(dpy, delay);
+ DONE:
+  XFreePixmap(dpy, pixmap);
+  XFreeGC(dpy, gc);
+  XSync(dpy, False);
+  XClearWindow(dpy, window);
+  XFreeFont(dpy, font);
+  return True;
+}
+
+
+static Bool
+mac (Display *dpy, Window window, int delay)
+{
+  XGCValues gcv;
+  XWindowAttributes xgwa;
+  char *fontname;
+  const char *def_font = "fixed";
+  XFontStruct *font;
+  GC gc;
+  Pixmap pixmap = 0;
+  int pix_w = mac_width;
+  int pix_h = mac_height;
+  int offset = mac_height * 4;
+  int i;
+
+  const char *string = ("0 0 0 0 0 0 0 F\n"
+                       "0 0 0 0 0 0 0 3");
+
+  if (!get_boolean_resource("doMac", "DoMac"))
+    return False;
+
+  XGetWindowAttributes (dpy, window, &xgwa);
+
+  fontname = get_string_resource ("mac.font", "Mac.Font");
+  if (!fontname || !*fontname) fontname = (char *)def_font;
+  font = XLoadQueryFont (dpy, fontname);
+  if (!font) font = XLoadQueryFont (dpy, def_font);
+  if (!font) exit(-1);
+  if (fontname && fontname != def_font)
+    free (fontname);
+
+  gcv.font = font->fid;
+  gcv.foreground = get_pixel_resource("mac.foreground", "Mac.Foreground",
+                                     dpy, xgwa.colormap);
+  gcv.background = get_pixel_resource("mac.background", "Mac.Background",
+                                     dpy, xgwa.colormap);
+  XSetWindowBackground(dpy, window, gcv.background);
+  XClearWindow(dpy, window);
+
+  gc = XCreateGC(dpy, window, GCFont|GCForeground|GCBackground, &gcv);
+
+  pixmap = XCreatePixmapFromBitmapData(dpy, window, (char *) mac_bits,
+                                      mac_width, mac_height,
+                                      gcv.foreground,
+                                      gcv.background,
+                                      xgwa.depth);
+
+  for(i = 0; i < 2; i++)
+    {
+      pixmap = double_pixmap(dpy, gc, xgwa.visual, xgwa.depth,
+                            pixmap, pix_w, pix_h);
+      pix_w *= 2; pix_h *= 2;
+    }
+
+  {
+    int x = (xgwa.width - pix_w) / 2;
+    int y = (((xgwa.height + offset) / 2) -
+            pix_h -
+            (font->ascent + font->descent) * 2);
+    if (y < 0) y = 0;
+    XCopyArea(dpy, pixmap, window, gc, 0, 0, pix_w, pix_h, x, y);
+    XFreePixmap(dpy, pixmap);
+  }
+
+  draw_string(dpy, window, gc, &gcv, font, 0, 0,
+             xgwa.width, xgwa.height + offset, string, 0);
+
+  XFreeGC(dpy, gc);
+  XSync(dpy, False);
+  bsod_sleep(dpy, delay);
+  XClearWindow(dpy, window);
+  XFreeFont(dpy, font);
+  return True;
+}
+
+static Bool
+macsbug (Display *dpy, Window window, int delay)
+{
+  XGCValues gcv;
+  XWindowAttributes xgwa;
+  char *fontname;
+  const char *def_font = "fixed";
+  XFontStruct *font;
+  GC gc, gc2;
+
+  int char_width, line_height;
+  int col_right, row_top, row_bottom, page_right, page_bottom, body_top;
+  int xoff, yoff;
+
+  const char *left = ("    SP     \n"
+                     " 04EB0A58  \n"
+                     "58 00010000\n"
+                     "5C 00010000\n"
+                     "   ........\n"
+                     "60 00000000\n"
+                     "64 000004EB\n"
+                     "   ........\n"
+                     "68 0000027F\n"
+                     "6C 2D980035\n"
+                     "   ....-..5\n"
+                     "70 00000054\n"
+                     "74 0173003E\n"
+                     "   ...T.s.>\n"
+                     "78 04EBDA76\n"
+                     "7C 04EBDA8E\n"
+                     "   .S.L.a.U\n"
+                     "80 00000000\n"
+                     "84 000004EB\n"
+                     "   ........\n"
+                     "88 00010000\n"
+                     "8C 00010000\n"
+                     "   ...{3..S\n"
+                     "\n"
+                     "\n"
+                     " CurApName \n"
+                     "  Finder   \n"
+                     "\n"
+                     " 32-bit VM \n"
+                     "SR Smxnzvc0\n"
+                     "D0 04EC0062\n"
+                     "D1 00000053\n"
+                     "D2 FFFF0100\n"
+                     "D3 00010000\n"
+                     "D4 00010000\n"
+                     "D5 04EBDA76\n"
+                     "D6 04EBDA8E\n"
+                     "D7 00000001\n"
+                     "\n"
+                     "A0 04EBDA76\n"
+                     "A1 04EBDA8E\n"
+                     "A2 A0A00060\n"
+                     "A3 027F2D98\n"
+                     "A4 027F2E58\n"
+                     "A5 04EC04F0\n"
+                     "A6 04EB0A86\n"
+                     "A7 04EB0A58");
+  const char *bottom = ("  _A09D\n"
+                       "     +00884    40843714     #$0700,SR         "
+                       "                  ; A973        | A973\n"
+                       "     +00886    40843765     *+$0400           "
+                       "                                | 4A1F\n"
+                       "     +00888    40843718     $0004(A7),([0,A7[)"
+                       "                  ; 04E8D0AE    | 66B8");
+
+#if 0
+  const char *body = ("Bus Error at 4BF6D6CC\n"
+                     "while reading word from 4BF6D6CC in User data space\n"
+                     " Unable to access that address\n"
+                     "  PC: 2A0DE3E6\n"
+                     "  Frame Type: B008");
+#else
+  const char * body = ("PowerPC unmapped memory exception at 003AFDAC "
+                                               "BowelsOfTheMemoryMgr+04F9C\n"
+                     " Calling chain using A6/R1 links\n"
+                     "  Back chain  ISA  Caller\n"
+                     "  00000000    PPC  28C5353C  __start+00054\n"
+                     "  24DB03C0    PPC  28B9258C  main+0039C\n"
+                     "  24DB0350    PPC  28B9210C  MainEvent+00494\n"
+                     "  24DB02B0    PPC  28B91B40  HandleEvent+00278\n"
+                     "  24DB0250    PPC  28B83DAC  DoAppleEvent+00020\n"
+                     "  24DB0210    PPC  FFD3E5D0  "
+                                               "AEProcessAppleEvent+00020\n"
+                     "  24DB0132    68K  00589468\n"
+                     "  24DAFF8C    68K  00589582\n"
+                     "  24DAFF26    68K  00588F70\n"
+                     "  24DAFEB3    PPC  00307098  "
+                                               "EmToNatEndMoveParams+00014\n"
+                     "  24DAFE40    PPC  28B9D0B0  DoScript+001C4\n"
+                     "  24DAFDD0    PPC  28B9C35C  RunScript+00390\n"
+                     "  24DAFC60    PPC  28BA36D4  run_perl+000E0\n"
+                     "  24DAFC10    PPC  28BC2904  perl_run+002CC\n"
+                     "  24DAFA80    PPC  28C18490  Perl_runops+00068\n"
+                     "  24DAFA30    PPC  28BE6CC0  Perl_pp_backtick+000FC\n"
+                     "  24DAF9D0    PPC  28BA48B8  Perl_my_popen+00158\n"
+                     "  24DAF980    PPC  28C5395C  sfclose+00378\n"
+                     "  24DAF930    PPC  28BA568C  free+0000C\n"
+                     "  24DAF8F0    PPC  28BA6254  pool_free+001D0\n"
+                     "  24DAF8A0    PPC  FFD48F14  DisposePtr+00028\n"
+                     "  24DAF7C9    PPC  00307098  "
+                                               "EmToNatEndMoveParams+00014\n"
+                     "  24DAF780    PPC  003AA180  __DisposePtr+00010");
+#endif
+
+  const char *s;
+  int body_lines = 1;
+
+  if (!get_boolean_resource("doMacsBug", "DoMacsBug"))
+    return False;
+
+  for (s = body; *s; s++) if (*s == '\n') body_lines++;
+
+  XGetWindowAttributes (dpy, window, &xgwa);
+
+  fontname = get_string_resource ((xgwa.height > 850
+                                  ? "macsbug.font3"
+                                  : (xgwa.height > 700
+                                     ? "macsbug.font2"
+                                     : "macsbug.font")),
+                                 "MacsBug.Font");
+  if (!fontname || !*fontname) fontname = (char *)def_font;
+  font = XLoadQueryFont (dpy, fontname);
+  if (!font) font = XLoadQueryFont (dpy, def_font);
+  if (!font) exit(-1);
+  if (fontname && fontname != def_font)
+    free (fontname);
+
+  gcv.font = font->fid;
+  gcv.foreground = get_pixel_resource("macsbug.foreground",
+                                     "MacsBug.Foreground",
+                                     dpy, xgwa.colormap);
+  gcv.background = get_pixel_resource("macsbug.background",
+                                     "MacsBug.Background",
+                                     dpy, xgwa.colormap);
+
+  gc = XCreateGC(dpy, window, GCFont|GCForeground|GCBackground, &gcv);
+
+  gcv.foreground = gcv.background;
+  gc2 = XCreateGC(dpy, window, GCForeground, &gcv);
+
+  XSetWindowBackground(dpy, window,
+                      get_pixel_resource("macsbug.borderColor",
+                                         "MacsBug.BorderColor",
+                                         dpy, xgwa.colormap));
+  XClearWindow(dpy, window);
+
+  char_width = (font->per_char
+               ? font->per_char['n'-font->min_char_or_byte2].width
+               : font->min_bounds.width);
+  line_height = font->ascent + font->descent + 1;
+
+  col_right = char_width * 12;
+  page_bottom = line_height * 47;
+
+  if (page_bottom > xgwa.height) page_bottom = xgwa.height;
+
+  row_bottom = page_bottom - line_height;
+  row_top = row_bottom - (line_height * 4);
+  page_right = col_right + (char_width * 88);
+  body_top = row_top - (line_height * body_lines);
+
+  page_bottom += 2;
+  row_bottom += 2;
+  body_top -= 4;
+
+  xoff = (xgwa.width - page_right) / 2;
+  yoff = (xgwa.height - page_bottom) / 2;
+  if (xoff < 0) xoff = 0;
+  if (yoff < 0) yoff = 0;
+
+  XFillRectangle(dpy, window, gc2, xoff, yoff, page_right, page_bottom);
+
+  draw_string(dpy, window, gc, &gcv, font, xoff, yoff, 10, 10, left, 0);
+  draw_string(dpy, window, gc, &gcv, font, xoff+col_right, yoff+row_top,
+             10, 10, bottom, 0);
+
+  XFillRectangle(dpy, window, gc, xoff + col_right, yoff, 2, page_bottom);
+  XDrawLine(dpy, window, gc,
+           xoff+col_right, yoff+row_top, xoff+page_right, yoff+row_top);
+  XDrawLine(dpy, window, gc,
+           xoff+col_right, yoff+row_bottom, xoff+page_right, yoff+row_bottom);
+  XDrawRectangle(dpy, window, gc,  xoff, yoff, page_right, page_bottom);
+
+  if (body_top > 4)
+    body_top = 4;
+
+  draw_string(dpy, window, gc, &gcv, font,
+             xoff + col_right + char_width, yoff + body_top, 10, 10, body,
+             500);
+
+  while (delay > 0)
+    {
+      XDrawLine(dpy, window, gc,
+               xoff+col_right+(char_width/2)+2, yoff+row_bottom+3,
+               xoff+col_right+(char_width/2)+2, yoff+page_bottom-3);
+      XSync(dpy, False);
+      usleep(666666L);
+      XDrawLine(dpy, window, gc2,
+               xoff+col_right+(char_width/2)+2, yoff+row_bottom+3,
+               xoff+col_right+(char_width/2)+2, yoff+page_bottom-3);
+      XSync(dpy, False);
+      usleep(333333L);
+      if (bsod_sleep(dpy, 0))
+       break;
+      delay--;
+    }
+
+  XFreeGC(dpy, gc);
+  XFreeGC(dpy, gc2);
+  XClearWindow(dpy, window);
+  XFreeFont(dpy, font);
+  return True;
+}
+
+
+\f
+char *progclass = "BSOD";
+
+char *defaults [] = {
+  "*delay:                30",
+
+  "*doWindows:            True",
+  "*doNT:                 True",
+  "*doAmiga:              True",
+  "*doMac:                True",
+  "*doAtari:              False",      /* boring */
+  "*doMacsBug:            True",
+  "*doSCO:                True",
+  "*doSparcLinux:         False",      /* boring */
+
+  ".Windows.font:         -*-courier-bold-r-*-*-*-120-*-*-m-*-*-*",
+  ".Windows.font2:        -*-courier-bold-r-*-*-*-180-*-*-m-*-*-*",
+  ".Windows.foreground:           White",
+  ".Windows.background:           Blue",
+
+  ".Amiga.font:                   -*-courier-bold-r-*-*-*-120-*-*-m-*-*-*",
+  ".Amiga.font2:          -*-courier-bold-r-*-*-*-180-*-*-m-*-*-*",
+  ".Amiga.foreground:     Red",
+  ".Amiga.background:     Black",
+  ".Amiga.background2:    White",
+
+  ".Mac.font:             -*-courier-bold-r-*-*-*-120-*-*-m-*-*-*",
+  ".Mac.foreground:       PaleTurquoise1",
+  ".Mac.background:       Black",
+
+  ".Atari.foreground:     Black",
+  ".Atari.background:     White",
+
+  ".MacsBug.font:         -*-courier-medium-r-*-*-*-100-*-*-m-*-*-*",
+  ".MacsBug.font2:        -*-courier-bold-r-*-*-*-120-*-*-m-*-*-*",
+  ".MacsBug.font3:        -*-courier-bold-r-*-*-*-140-*-*-m-*-*-*",
+  ".MacsBug.foreground:           Black",
+  ".MacsBug.background:           White",
+  ".MacsBug.borderColor:   #AAAAAA",
+  
+  ".SCO.font:             -*-courier-bold-r-*-*-*-120-*-*-m-*-*-*",
+  ".SCO.font2:            -*-courier-bold-r-*-*-*-140-*-*-m-*-*-*",
+  ".SCO.foreground:       White",
+  ".SCO.background:       Black",
+  
+  ".SparcLinux.font:      -*-courier-bold-r-*-*-*-120-*-*-m-*-*-*",
+  ".SparcLinux.font2:     -*-courier-bold-r-*-*-*-140-*-*-m-*-*-*",
+  ".SparcLinux.foreground: White",
+  ".SparcLinux.background: Black",
+  0
+};
+
+XrmOptionDescRec options [] = {
+  { "-delay",          ".delay",               XrmoptionSepArg, 0 },
+  { 0, 0, 0, 0 }
+};
+
+
+void
+screenhack (Display *dpy, Window window)
+{
+  int loop = 0;
+  int i = -1;
+  int j = -1;
+  int delay = get_integer_resource ("delay", "Integer");
+  if (delay < 3) delay = 3;
+
+  if (!get_boolean_resource ("root", "Boolean"))
+    {
+      XWindowAttributes xgwa;
+      XGetWindowAttributes (dpy, window, &xgwa);
+      XSelectInput (dpy, window,
+                    xgwa.your_event_mask | KeyPressMask | ButtonPressMask);
+    }
+
+  while (1)
+    {
+      Bool did;
+      do {  i = (random() & 0xFF) % 8; } while (i == j);
+      switch (i)
+       {
+       case 0: did = windows(dpy, window, delay, True); break;
+       case 1: did = windows(dpy, window, delay, False); break;
+       case 2: did = amiga(dpy, window, delay); break;
+       case 3: did = mac(dpy, window, delay); break;
+       case 4: did = macsbug(dpy, window, delay); break;
+       case 5: did = sco(dpy, window, delay); break;
+       case 6: did = sparc_linux(dpy, window, delay); break;
+       case 7: did = atari(dpy, window, delay); break;
+       default: abort(); break;
+       }
+      loop++;
+      if (loop > 100) j = -1;
+      if (loop > 200) exit(-1);
+      if (!did) continue;
+      XSync (dpy, False);
+      j = i;
+      loop = 0;
+    }
+}
diff --git a/hacks/bsod.man b/hacks/bsod.man
new file mode 100644 (file)
index 0000000..63bcee6
--- /dev/null
@@ -0,0 +1,126 @@
+.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
+..
+.TH XScreenSaver 1 "28-Oct-98" "X Version 11"
+.SH NAME
+bsod - Blue Screen of Death emulator
+.SH SYNOPSIS
+.B bsod
+[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP]
+[\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install]
+[\-visual \fIvisual\fP] [\-delay \fIseconds\fP]
+.SH DESCRIPTION
+The
+.I bsod
+program is the finest in personal computer emulation.  
+.PP
+.I bsod
+steps through a set of screens, each one a recreation of a different failure
+mode of an operating system.  Systems depicted include Microsoft's Windows 95
+and Windows NT, Commodore-Amiga's AmigaDOS 1.3, SPARC Linux, SCO UNIX, the
+Apple Macintosh (both the MacsBug debugger and the rarer "Sad Mac"), and the
+Atari ST.
+.PP
+.SH OPTIONS
+.I bsod
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window.  This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-mono 
+If on a color display, pretend we're on a monochrome display.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use.  Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-delay \fIdelay\fP
+The delay between displaying one crash and another.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH X RESOURCES
+Notable X resources supported include the following, which control which
+hacks are displayed and which aren't.
+.BR doWindows ,
+.BR doNT ,
+.BR doAmiga ,
+.BR doMac ,
+.BR doMacsBug ,
+.BR doSCO ,
+.BR doAtari ,
+and
+.BR doSparcLinux .
+Each of these is a Boolean resource, they all default to true, except for
+doSparcLinux and doAtari, which are turned off by default, because they're
+really not all that interesting looking unless you're a fan of those systems.
+There aren't command-line options for these, so to change them, you'll need
+to add entries to your .Xdefaults file, or use the -xrm option.
+For example, to tell bsod not to show the NT crash:
+.EX
+bsod -xrm '*doNT: false'
+.EE
+.SH BUGS
+Unlike the systems that the images are borrowed from,
+.I bsod
+does not require a reboot after running.
+.PP
+.I bsod
+should also emulate more systems, but systems with interesting crash
+graphics are not as common as one might hope.
+
+One I'd really like to see is a Unix system getting a kernel panic, 
+rebooting, and running
+.BR fsck (8).
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1),
+.BR http://www.microsoft.com/ ,
+.BR http://www.apple.com/ ,
+and
+.BR http://www.sco.com/ ,
+.BR http://www.kernel.org/ ,
+and
+.BR http://www.amiga.de/ .
+.SH TRADEMARKS
+Microsoft Windows, Microsoft Windows 95, and Microsoft Windows NT are all
+registered trademarks of Microsoft Corporation.  Apple Macintosh is a
+registered trademark of Apple Computer.  Amiga is a registered trademark of
+Amiga International, Inc.  Atari ST is probably a trademark, too, but it's
+hard to tell who owns it. Linux is a registered trademark of Linus Torvalds,
+but it isn't his fault.
+.SH COPYRIGHT
+Copyright \(co 1998 by Jamie Zawinski.  Permission to use, copy, modify, 
+distribute, and sell this software 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.  No representations are made about the 
+suitability of this software for any purpose.  It is provided "as is" without
+express or implied warranty.  No animals were harmed during the testing of
+these simulations.  Always mount a scratch monkey.
+.SH AUTHOR
+Concept cribbed from Stephen Martin <smartin@mks.com>.  This version is by
+Jamie Zawinski <jwz@jwz.org>.
diff --git a/hacks/bubbles-default.c b/hacks/bubbles-default.c
new file mode 100644 (file)
index 0000000..f393f1f
--- /dev/null
@@ -0,0 +1,151 @@
+/* bubbles_default.c - pick images for bubbles.c
+ * By Jamie Zawinski <jwz@jwz.org>, 20-Jan-98.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software 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.  No representations are made about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or 
+ * implied warranty.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+#include "bubbles.h"
+#include "yarandom.h"
+
+#ifndef NO_DEFAULT_BUBBLE
+
+# define BLOOD 0
+# include "images/bubbles/blood1.xpm"
+# include "images/bubbles/blood2.xpm"
+# include "images/bubbles/blood3.xpm"
+# include "images/bubbles/blood4.xpm"
+# include "images/bubbles/blood5.xpm"
+# include "images/bubbles/blood6.xpm"
+# include "images/bubbles/blood7.xpm"
+# include "images/bubbles/blood8.xpm"
+# include "images/bubbles/blood9.xpm"
+# include "images/bubbles/blood10.xpm"
+# include "images/bubbles/blood11.xpm"
+
+# define BLUE 1
+# include "images/bubbles/blue1.xpm"
+# include "images/bubbles/blue2.xpm"
+# include "images/bubbles/blue3.xpm"
+# include "images/bubbles/blue4.xpm"
+# include "images/bubbles/blue5.xpm"
+# include "images/bubbles/blue6.xpm"
+# include "images/bubbles/blue7.xpm"
+# include "images/bubbles/blue8.xpm"
+# include "images/bubbles/blue9.xpm"
+# include "images/bubbles/blue10.xpm"
+# include "images/bubbles/blue11.xpm"
+
+# define GLASS 2
+# include "images/bubbles/glass1.xpm"
+# include "images/bubbles/glass2.xpm"
+# include "images/bubbles/glass3.xpm"
+# include "images/bubbles/glass4.xpm"
+# include "images/bubbles/glass5.xpm"
+# include "images/bubbles/glass6.xpm"
+# include "images/bubbles/glass7.xpm"
+# include "images/bubbles/glass8.xpm"
+# include "images/bubbles/glass9.xpm"
+# include "images/bubbles/glass10.xpm"
+# include "images/bubbles/glass11.xpm"
+
+# define JADE 3
+# include "images/bubbles/jade1.xpm"
+# include "images/bubbles/jade2.xpm"
+# include "images/bubbles/jade3.xpm"
+# include "images/bubbles/jade4.xpm"
+# include "images/bubbles/jade5.xpm"
+# include "images/bubbles/jade6.xpm"
+# include "images/bubbles/jade7.xpm"
+# include "images/bubbles/jade8.xpm"
+# include "images/bubbles/jade9.xpm"
+# include "images/bubbles/jade10.xpm"
+# include "images/bubbles/jade11.xpm"
+
+# define END 4
+
+
+char **default_bubbles[50];
+int num_default_bubbles;
+
+void init_default_bubbles(void)
+{
+  int i = 0;
+  switch (random() % END) {
+  case BLOOD:
+    default_bubbles[i++] = blood1;
+    default_bubbles[i++] = blood2;
+    default_bubbles[i++] = blood3;
+    default_bubbles[i++] = blood4;
+    default_bubbles[i++] = blood5;
+    default_bubbles[i++] = blood6;
+    default_bubbles[i++] = blood7;
+    default_bubbles[i++] = blood8;
+    default_bubbles[i++] = blood9;
+    default_bubbles[i++] = blood10;
+    default_bubbles[i++] = blood11;
+    break;
+
+  case BLUE:
+    default_bubbles[i++] = blue1;
+    default_bubbles[i++] = blue2;
+    default_bubbles[i++] = blue3;
+    default_bubbles[i++] = blue4;
+    default_bubbles[i++] = blue5;
+    default_bubbles[i++] = blue6;
+    default_bubbles[i++] = blue7;
+    default_bubbles[i++] = blue8;
+    default_bubbles[i++] = blue9;
+    default_bubbles[i++] = blue10;
+    default_bubbles[i++] = blue11;
+    break;
+
+  case GLASS:
+    default_bubbles[i++] = glass1;
+    default_bubbles[i++] = glass2;
+    default_bubbles[i++] = glass3;
+    default_bubbles[i++] = glass4;
+    default_bubbles[i++] = glass5;
+    default_bubbles[i++] = glass6;
+    default_bubbles[i++] = glass7;
+    default_bubbles[i++] = glass8;
+    default_bubbles[i++] = glass9;
+    default_bubbles[i++] = glass10;
+    default_bubbles[i++] = glass11;
+    break;
+
+  case JADE:
+    default_bubbles[i++] = jade1;
+    default_bubbles[i++] = jade2;
+    default_bubbles[i++] = jade3;
+    default_bubbles[i++] = jade4;
+    default_bubbles[i++] = jade5;
+    default_bubbles[i++] = jade6;
+    default_bubbles[i++] = jade7;
+    default_bubbles[i++] = jade8;
+    default_bubbles[i++] = jade9;
+    default_bubbles[i++] = jade10;
+    default_bubbles[i++] = jade11;
+    break;
+
+  default:
+    abort();
+    break;
+  }
+
+  default_bubbles[i] = 0;
+  num_default_bubbles = i;
+}
+
+#endif /* NO_DEFAULT_BUBBLE */
diff --git a/hacks/bubbles.c b/hacks/bubbles.c
new file mode 100644 (file)
index 0000000..913fe03
--- /dev/null
@@ -0,0 +1,1320 @@
+/* bubbles.c - frying pan / soft drink in a glass simulation */
+
+/*$Id: bubbles.c,v 1.16 1998/11/19 07:25:01 jwz Exp $*/
+
+/*
+ *  Copyright (C) 1995-1996 James Macnicol
+ *
+ * Permission to use, copy, modify, distribute, and sell this software 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.  No representations are made about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or 
+ * implied warranty.
+ */
+
+/*
+ * I got my original inspiration for this by looking at the bottom of a 
+ * frying pan while something was cooking and watching the little bubbles
+ * coming off the bottom of the pan as the oil was boiling joining together
+ * to form bigger bubbles and finally to *pop* and disappear.  I had some
+ * time on my hands so I wrote this little xscreensaver module to imitate
+ * it.  Now that it's done it reminds me more of the bubbles you get in
+ * a glass of fizzy soft drink.....
+ *
+ * The problem seemed to be that the position/size etc. of all the bubbles
+ * on the screen had to be remembered and searched through to find when
+ * bubbles hit each other and combined.  To do this more efficiently, the
+ * window/screen is divided up into a square mesh of side length mesh_length
+ * and separate lists of bubbles contained in each cell of the mesh are
+ * kept.  Only the cells in the immediate vicinity of the bubble in question
+ * are searched.  This should make things more efficient although the whole
+ * thing seems to use up too much CPU, but then I'm using an ancient PC so
+ * perhaps it's not surprising .
+ * (Six months after I wrote the above I now have a Pentium with PCI graphics 
+ * and things are _much_ nicer.)
+ *
+ * Author:           James Macnicol 
+ * Internet E-mail : J.Macnicol@student.anu.edu.au
+ */
+
+#include <math.h>
+#include "screenhack.h"
+#include "bubbles.h"
+
+#include <limits.h>
+
+#include <stdio.h>
+#include <string.h>
+
+#ifndef VMS
+# include <sys/wait.h>
+#else /* VMS */
+# if __DECC_VER >= 50200000
+#  include <sys/wait.h>
+# endif
+#endif /* VMS */
+
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+#include "yarandom.h"
+
+#ifdef HAVE_XPM
+# include <X11/xpm.h>
+#endif
+
+/* 
+ * Public variables 
+ */
+
+extern void init_default_bubbles(void);
+extern int num_default_bubbles;
+extern char **default_bubbles[];
+
+char *progclass = "Bubbles";
+
+char *defaults [] = {
+  ".background:                black",
+  ".foreground:                white",
+  "*simple:            false",
+  "*broken:            false",
+  "*delay:             800",
+  "*quiet:             false", 
+  "*nodelay:           false",
+  "*3D:                        false",
+  0
+};
+
+XrmOptionDescRec options [] = {
+  { "-simple",          ".simple",      XrmoptionNoArg, "true" },
+#ifdef HAVE_XPM
+  { "-broken",          ".broken",      XrmoptionNoArg, "true" },
+#endif /* HAVE_XPM */
+  { "-quiet",           ".quiet",       XrmoptionNoArg, "true" },
+  { "-nodelay",         ".nodelay",     XrmoptionNoArg, "true" },
+  { "-3D",          ".3D",      XrmoptionNoArg, "true" },
+  { "-delay",           ".delay",       XrmoptionSepArg, 0 },
+  { 0, 0, 0, 0 }
+};
+
+/* 
+ * Private variables 
+ */
+
+static Bubble **mesh;
+static int mesh_length;
+static int mesh_width;
+static int mesh_height;
+static int mesh_cells;
+
+static int **adjacent_list;
+
+static int screen_width;
+static int screen_height;
+static int screen_depth;
+static unsigned int default_fg_pixel, default_bg_pixel;
+/* 
+ * I know it's not elegant to save this stuff in global variables
+ * but we need it for the signal handler.
+ */
+static Display *defdsp;
+static Window defwin;
+static Colormap defcmap;
+static Visual *defvisual;
+
+/* For simple mode only */
+static int bubble_min_radius;
+static int bubble_max_radius;
+static long *bubble_areas;
+static GC draw_gc, erase_gc;
+
+#ifdef HAVE_XPM
+static int num_bubble_pixmaps;
+static Bubble_Step **step_pixmaps;
+#endif /* HAVE_XPM */
+
+/* Options stuff */
+#ifdef HAVE_XPM
+static Bool simple = False;
+#else
+static Bool simple = True;
+#endif
+static Bool broken = False;
+static Bool quiet = False;
+static Bool threed = False;
+static int delay;
+
+/* 
+ * To prevent forward references, some stuff is up here 
+ */
+
+static long
+calc_bubble_area(int r)
+/* Calculate the area of a bubble of radius r */
+{
+#ifdef DEBUG
+  printf("%d %g\n", r,
+        10.0 * PI * (double)r * (double)r * (double)r);
+#endif /* DEBUG */
+  if (threed)
+    return (long)(10.0 * PI * (double)r * (double)r * (double)r);
+  else
+    return (long)(10.0 * PI * (double)r * (double)r);
+}
+
+static void *
+xmalloc(size_t size)
+/* Safe malloc */
+{
+  void *ret;
+
+  if ((ret = malloc(size)) == NULL) {
+    fprintf(stderr, "%s: out of memory\n", progname);
+    exit(1);
+  }
+  return ret;
+}
+
+#ifdef DEBUG
+static void 
+die_bad_bubble(Bubble *bb)
+/* This is for use with GDB */
+{
+  fprintf(stderr, "Bad bubble detected at 0x%x!\n", (int)bb);
+  exit(1);
+}
+#endif
+
+static int
+null_bubble(Bubble *bb)
+/* Returns true if the pointer passed is NULL.  If not then this checks to
+see if the bubble is valid (i.e. the (x,y) position is valid and the magic
+number is set correctly.  This only a sanity check for debugging and is
+turned off if DEBUG isn't set. */
+{
+  if (bb == (Bubble *)NULL)
+    return 1;
+#ifdef DEBUG
+  if ((bb->cell_index < 0) || (bb->cell_index > mesh_cells)) {
+    fprintf(stderr, "cell_index = %d\n", bb->cell_index);
+    die_bad_bubble(bb);
+  }
+  if (bb->magic != BUBBLE_MAGIC)  {
+    fprintf(stderr, "Magic = %d\n", bb->magic);
+    die_bad_bubble(bb);
+  }
+  if (simple) {
+    if ((bb->x < 0) || (bb->x > screen_width) ||
+       (bb->y < 0) || (bb->y > screen_height) ||
+       (bb->radius < bubble_min_radius) || (bb->radius >
+                                            bubble_max_radius)) {
+      fprintf(stderr,
+             "radius = %d, x = %d, y = %d, magic = %d, cell index = %d\n",
+             bb->radius, bb->x, bb->y, bb->magic, bb->cell_index);
+      die_bad_bubble(bb);  
+    }
+#ifdef HAVE_XPM
+  } else {
+    if ((bb->x < 0) || (bb->x > screen_width) ||
+       (bb->y < 0) || (bb->y > screen_height) ||
+       (bb->radius < step_pixmaps[0]->radius) || 
+       (bb->radius > step_pixmaps[num_bubble_pixmaps-1]->radius)) {
+      fprintf(stderr,
+             "radius = %d, x = %d, y = %d, magic = %d, cell index = %d\n",
+             bb->radius, bb->x, bb->y, bb->magic, bb->cell_index);
+      die_bad_bubble(bb);  
+    }
+#endif /* HAVE_XPM */
+  }
+#endif /* DEBUG */
+  return 0;
+}
+
+#ifdef DEBUG
+static void 
+print_bubble_list(Bubble *bb)
+/* Print list of where all the bubbles are.  For debugging purposes only. */
+{
+  if (! null_bubble(bb)) {
+    printf("  (%d, %d) %d\n", bb->x, bb->y, bb->radius);
+    print_bubble_list(bb->next);
+  }
+}
+#endif /* DEBUG */
+
+static void 
+add_bubble_to_list(Bubble **list, Bubble *bb)
+/* Take a pointer to a list of bubbles and stick bb at the head of the
+ list. */
+{
+  Bubble *head = *list;
+
+  if (null_bubble(head)) {
+    bb->prev = (Bubble *)NULL;
+    bb->next = (Bubble *)NULL;
+  } else {
+    bb->next = head;
+    bb->prev = (Bubble *)NULL;
+    head->prev = bb;
+  }
+  *list = bb;
+}
+
+
+/* 
+ * Mesh stuff 
+ */
+
+
+static void 
+init_mesh (void)
+/* Setup the mesh of bubbles */
+{
+  int i;
+
+  mesh = (Bubble **)xmalloc(mesh_cells * sizeof(Bubble *));
+  for (i = 0; i < mesh_cells; i++)
+    mesh[i] = (Bubble *)NULL;
+}
+
+static int
+cell_to_mesh(int x, int y)
+/* convert cell coordinates to mesh index */
+{
+#ifdef DEBUG
+  if ((x < 0) || (y < 0)) {
+    fprintf(stderr, "cell_to_mesh: x = %d, y = %d\n", x, y);
+    exit(1);
+  }
+#endif
+  return ((mesh_width * y) + x);
+}
+
+static void 
+mesh_to_cell(int mi, int *cx, int *cy)
+/* convert mesh index into cell coordinates */
+{
+  *cx = mi % mesh_width;
+  *cy = mi / mesh_width;
+}
+
+static int
+pixel_to_mesh(int x, int y)
+/* convert screen coordinates into mesh index */
+{
+  return cell_to_mesh((x / mesh_length), (y / mesh_length));
+}
+
+static int
+verify_mesh_index(int x, int y)
+/* check to see if (x,y) is in the mesh */
+{
+  if ((x < 0) || (y < 0) || (x >= mesh_width) || (y >= mesh_height))
+    return (-1);
+  return (cell_to_mesh(x, y));
+}
+
+#ifdef DEBUG
+static void 
+print_adjacents(int *adj)
+/* Print a list of the cells calculated above.  For debugging only. */
+{
+  int i;
+
+  printf("(");
+  for (i = 0; i < 8; i++)
+    printf("%d ", adj[i]);
+  printf(")\n");
+}
+#endif /* DEBUG */
+
+static void 
+add_to_mesh(Bubble *bb)
+/* Add the given bubble to the mesh by sticking it on the front of the
+list.  bb is already allocated so no need to malloc() anything, just
+adjust pointers. */
+{
+#ifdef DEBUG
+  if (null_bubble(bb)) {
+    fprintf(stderr, "Bad bubble passed to add_to_mesh()!\n");
+    exit(1);
+  }
+#endif /* DEBUG */
+
+  add_bubble_to_list(&mesh[bb->cell_index], bb);
+}
+
+#ifdef DEBUG
+static void 
+print_mesh (void)
+/* Print the contents of the mesh */
+{
+  int i;
+
+  for (i = 0; i < mesh_cells; i++) {
+    if (! null_bubble(mesh[i])) {
+      printf("Mesh cell %d\n", i);
+      print_bubble_list(mesh[i]);
+    }
+  }
+}
+
+static void 
+valid_mesh (void)
+/* Check to see if the mesh is Okay.  For debugging only. */
+{
+  int i;
+  Bubble *b;
+
+  for (i = 0; i < mesh_cells; i++) {
+    b = mesh[i];
+    while (! null_bubble(b))
+      b = b->next;
+  }
+}
+
+static int
+total_bubbles (void)
+/* Count how many bubbles there are in total.  For debugging only. */
+{
+  int rv = 0;
+  int i;
+  Bubble *b;
+
+  for (i = 0; i < mesh_cells; i++) {
+    b = mesh[i];
+    while (! null_bubble(b)) {
+      rv++;
+      b = b->next;
+    } 
+  }
+
+  return rv;
+}
+#endif /* DEBUG */
+
+static void 
+calculate_adjacent_list (void)
+/* Calculate the list of cells adjacent to a particular cell for use
+   later. */
+{
+  int i; 
+  int ix, iy;
+
+  adjacent_list = (int **)xmalloc(mesh_cells * sizeof(int *));
+  for (i = 0; i < mesh_cells; i++) {
+    adjacent_list[i] = (int *)xmalloc(9 * sizeof(int));
+    mesh_to_cell(i, &ix, &iy);
+    adjacent_list[i][0] = verify_mesh_index(--ix, --iy);
+    adjacent_list[i][1] = verify_mesh_index(++ix, iy);
+    adjacent_list[i][2] = verify_mesh_index(++ix, iy);
+    adjacent_list[i][3] = verify_mesh_index(ix, ++iy);
+    adjacent_list[i][4] = verify_mesh_index(ix, ++iy);
+    adjacent_list[i][5] = verify_mesh_index(--ix, iy);
+    adjacent_list[i][6] = verify_mesh_index(--ix, iy);
+    adjacent_list[i][7] = verify_mesh_index(ix, --iy);
+    adjacent_list[i][8] = i;
+  }
+}
+
+static void
+adjust_areas (void)
+/* Adjust areas of bubbles so we don't get overflow in weighted_mean() */
+{
+  double maxvalue;
+  long maxarea;
+  long factor;
+  int i;
+
+#ifdef HAVE_XPM
+  if (simple)
+    maxarea = bubble_areas[bubble_max_radius+1];
+  else
+    maxarea = step_pixmaps[num_bubble_pixmaps]->area;
+#else
+  maxarea = bubble_areas[bubble_max_radius+1];
+#endif /* HAVE_XPM */
+  maxvalue = (double)screen_width * 2.0 * (double)maxarea;
+  factor = (long)ceil(maxvalue / (double)LONG_MAX);
+  if (factor > 1) {
+    /* Overflow will occur in weighted_mean().  We must divide areas
+       each by factor so it will never do so. */
+#ifdef HAVE_XPM
+    if (simple) {
+      for (i = bubble_min_radius; i <= bubble_max_radius+1; i++) {
+       bubble_areas[i] /= factor;
+       if (bubble_areas[i] == 0)
+         bubble_areas[i] = 1;
+      }
+    } else {
+      for (i = 0; i <= num_bubble_pixmaps; i++) {
+#ifdef DEBUG
+       printf("area = %ld", step_pixmaps[i]->area);
+#endif /* DEBUG */
+       step_pixmaps[i]->area /= factor;
+       if (step_pixmaps[i]->area == 0)
+         step_pixmaps[i]->area = 1;
+#ifdef DEBUG
+       printf("-> %ld\n", step_pixmaps[i]->area);
+#endif /* DEBUG */
+      }
+    }
+#else
+    for (i = bubble_min_radius; i <= bubble_max_radius+1; i++) {
+      bubble_areas[i] /= factor;
+      if (bubble_areas[i] == 0)
+       bubble_areas[i] = 1;
+    }
+#endif /* HAVE_XPM */
+  }
+#ifdef DEBUG
+  printf("maxarea = %ld\n", maxarea);
+  printf("maxvalue = %g\n", maxvalue);
+  printf("LONG_MAX = %ld\n", LONG_MAX);
+  printf("factor = %ld\n", factor);
+#endif /* DEBUG */
+}
+
+/* 
+ * Bubbles stuff 
+ */
+
+static Bubble *
+new_bubble (void)
+/* Add a new bubble at some random position on the screen of the smallest
+size. */
+{
+  Bubble *rv = (Bubble *)xmalloc(sizeof(Bubble));
+
+  /* Can't use null_bubble() here since magic number hasn't been set */
+  if (rv == (Bubble *)NULL) {
+    fprintf(stderr, "Ran out of memory!\n");
+    exit(1);
+  }
+
+  if (simple) {
+    rv->radius = bubble_min_radius;
+    rv->area = bubble_areas[bubble_min_radius];
+#ifdef HAVE_XPM
+  } else {
+    rv->step = 0;
+    rv->radius = step_pixmaps[0]->radius;
+    rv->area = step_pixmaps[0]->area;
+#endif /* HAVE_XPM */
+  }
+  rv->visible = 0;
+  rv->magic = BUBBLE_MAGIC;
+  rv->x = random() % screen_width;
+  rv->y = random() % screen_height;
+  rv->cell_index = pixel_to_mesh(rv->x, rv->y);
+
+  return rv;
+}
+
+static void 
+show_bubble(Bubble *bb)
+/* paint the bubble on the screen */
+{
+  if (null_bubble(bb)) {
+    fprintf(stderr, "NULL bubble passed to show_bubble\n");
+    exit(1);
+  }
+
+  if (! bb->visible) {
+    bb->visible = 1;
+
+    if (simple) {
+      XDrawArc(defdsp, defwin, draw_gc, (bb->x - bb->radius),
+              (bb->y - bb->radius), bb->radius*2, bb->radius*2, 0,
+              360*64);  
+    } else {
+#ifdef HAVE_XPM
+      XSetClipOrigin(defdsp, step_pixmaps[bb->step]->draw_gc, 
+                    (bb->x - bb->radius),
+                    (bb->y - bb->radius));
+      
+      XCopyArea(defdsp, step_pixmaps[bb->step]->ball, defwin, 
+               step_pixmaps[bb->step]->draw_gc,
+               0, 0, (bb->radius * 2), 
+               (bb->radius * 2),  
+               (bb->x - bb->radius),
+               (bb->y - bb->radius));
+#endif /* HAVE_XPM */
+    }
+  }
+}
+
+static void 
+hide_bubble(Bubble *bb)
+/* erase the bubble */
+{
+  if (null_bubble(bb)) {
+    fprintf(stderr, "NULL bubble passed to hide_bubble\n");
+    exit(1);
+  }
+
+  if (bb->visible) {
+    bb->visible = 0;
+
+    if (simple) {
+      XDrawArc(defdsp, defwin, erase_gc, (bb->x - bb->radius),
+              (bb->y - bb->radius), bb->radius*2, bb->radius*2, 0,
+              360*64);
+    } else {
+#ifdef HAVE_XPM
+      if (! broken) {
+       XSetClipOrigin(defdsp, step_pixmaps[bb->step]->erase_gc, 
+                      (bb->x - bb->radius), (bb->y - bb->radius));
+       
+       XFillRectangle(defdsp, defwin, step_pixmaps[bb->step]->erase_gc,
+                      (bb->x - bb->radius),
+                      (bb->y - bb->radius),
+                      (bb->radius * 2),
+                      (bb->radius * 2));
+      }
+#endif /* HAVE_XPM */
+    }
+  }
+}
+
+static void 
+delete_bubble_in_mesh(Bubble *bb, int keep_bubble)
+/* Delete an individual bubble, adjusting list of bubbles around it.
+   If keep_bubble is true then the bubble isn't actually deleted.  We
+   use this to allow bubbles to change mesh cells without reallocating,
+   (it needs this when two bubbles collide and the centre position is
+   recalculated, and this may stray over a mesh boundary). */
+{
+  if ((!null_bubble(bb->prev)) && (!null_bubble(bb->next))) {
+    bb->prev->next = bb->next;
+    bb->next->prev = bb->prev;
+  } else if ((!null_bubble(bb->prev)) &&
+            (null_bubble(bb->next))) {
+    bb->prev->next = (Bubble *)NULL;
+    bb->next = mesh[bb->cell_index];
+  } else if ((null_bubble(bb->prev)) &&
+            (!null_bubble(bb->next))) {
+    bb->next->prev = (Bubble *)NULL;
+    mesh[bb->cell_index] = bb->next;
+    bb->next = mesh[bb->cell_index];
+  } else {
+    /* Only item on list */
+    mesh[bb->cell_index] = (Bubble *)NULL;
+  }             
+  if (! keep_bubble)
+    free(bb);
+}
+
+static unsigned long 
+ulongsqrint(int x)
+/* Saves ugly inline code */
+{
+  return ((unsigned long)x * (unsigned long)x);
+}
+
+static Bubble *
+get_closest_bubble(Bubble *bb)
+/* Find the closest bubble touching the this bubble, NULL if none are
+   touching. */
+{
+  Bubble *rv = (Bubble *)NULL;
+  Bubble *tmp;
+  unsigned long separation2, touchdist2;
+  int dx, dy;
+  unsigned long closest2 = ULONG_MAX;
+  int i;
+
+#ifdef DEBUG 
+  if (null_bubble(bb)) {
+    fprintf(stderr, "NULL pointer 0x%x passed to get_closest_bubble()!", 
+           (int)bb);
+    exit(1);
+  }
+#endif /* DEBUG */
+
+  for (i = 0; i < 9; i++) {
+    /* There is a bug here where bb->cell_index is negaitve.. */
+#ifdef DEBUG
+    if ((bb->cell_index < 0) || (bb->cell_index >= mesh_cells)) {
+      fprintf(stderr, "bb->cell_index = %d\n", bb->cell_index);
+      exit(1);
+    }
+#endif /* DEBUG */
+/*    printf("%d,", bb->cell_index); */
+    if (adjacent_list[bb->cell_index][i] != -1) {
+      tmp = mesh[adjacent_list[bb->cell_index][i]];
+      while (! null_bubble(tmp)) {
+       if (tmp != bb) {
+         dx = tmp->x - bb->x;
+         dy = tmp->y - bb->y;
+         separation2 = ulongsqrint(dx) + ulongsqrint(dy);
+         /* Add extra leeway so circles _never_ overlap */
+         touchdist2 = ulongsqrint(tmp->radius + bb->radius + 2);
+         if ((separation2 <= touchdist2) && (separation2 <
+                                             closest2)) {
+           rv = tmp;
+           closest2 = separation2;
+         }
+       }
+       tmp = tmp->next;
+      }
+    }
+  }
+
+  return rv;
+}
+
+#ifdef DEBUG
+static void
+ldr_barf (void)
+{
+}
+#endif /* DEBUG */
+
+static long
+long_div_round(long num, long dem)
+{
+  long divvie, moddo;
+
+#ifdef DEBUG
+  if ((num < 0) || (dem < 0)) {
+    fprintf(stderr, "long_div_round: %ld, %ld\n", num, dem);
+    ldr_barf();
+    exit(1);
+  }
+#endif /* DEBUG */
+
+  divvie = num / dem;
+  moddo = num % dem;
+  if (moddo > (dem / 2))
+    ++divvie;
+
+#ifdef DEBUG
+  if ((divvie < 0) || (moddo < 0)) {
+    fprintf(stderr, "long_div_round: %ld, %ld\n", divvie, moddo);
+    ldr_barf();
+    exit(1);
+  }
+#endif /* DEBUG */
+
+  return divvie;
+}
+
+static int
+weighted_mean(int n1, int n2, long w1, long w2)
+/* Mean of n1 and n2 respectively weighted by weights w1 and w2. */
+{
+#ifdef DEBUG
+  if ((w1 <= 0) || (w2 <= 0)) {
+    fprintf(stderr,
+           "Bad weights passed to weighted_mean() - (%d, %d, %ld, %ld)!\n",
+           n1, n2, w1, w2);
+    exit(1);
+  }
+#endif /* DEBUG */
+  return ((int)long_div_round((long)n1 * w1 + (long)n2 * w2,
+                           w1 + w2));
+}
+
+static int
+bubble_eat(Bubble *diner, Bubble *food)
+/* The diner eats the food.  Returns true (1) if the diner still exists */
+{ 
+  int i;
+  int newmi;
+
+#ifdef DEBUG
+  if ((null_bubble(diner)) || (null_bubble(food))) {
+    fprintf(stderr, "Bad bubbles passed to bubble_eat()!\n");
+    exit(1);
+  }
+#endif /* DEBUG */
+
+  /* We hide the diner even in the case that it doesn't grow so that
+     if the food overlaps its boundary it is replaced. This could
+     probably be solved by letting bubbles eat others which are close
+     but not quite touching.  It's probably worth it, too, since we
+     would then not have to redraw bubbles which don't change in
+     size. */
+
+  hide_bubble(diner);
+  hide_bubble(food);
+  diner->x = weighted_mean(diner->x, food->x, diner->area, food->area);
+  diner->y = weighted_mean(diner->y, food->y, diner->area, food->area);
+  newmi = pixel_to_mesh(diner->x, diner->y);
+  diner->area += food->area;
+  delete_bubble_in_mesh(food, DELETE_BUBBLE);
+
+  if ((simple) && (diner->area > bubble_areas[bubble_max_radius])) {
+    delete_bubble_in_mesh(diner, DELETE_BUBBLE);
+    return 0;
+  }
+#ifdef HAVE_XPM
+  if ((! simple) && (diner->area > 
+                    step_pixmaps[num_bubble_pixmaps]->area)) {
+    delete_bubble_in_mesh(diner, DELETE_BUBBLE);
+    return 0;
+  }
+#endif /* HAVE_XPM */
+
+  if (simple) {
+    if (diner->area > bubble_areas[diner->radius + 1]) {
+      /* Move the bubble to a new radius */
+      i = diner->radius;
+      while (diner->area > bubble_areas[i+1])
+       ++i;
+      diner->radius = i;
+    }
+    show_bubble(diner);
+#ifdef HAVE_XPM
+  } else {
+    if (diner->area > step_pixmaps[diner->step+1]->area) {
+      i = diner->step;
+      while (diner->area > step_pixmaps[i+1]->area)
+       ++i;
+      diner->step = i;
+      diner->radius = step_pixmaps[diner->step]->radius;
+    }
+    show_bubble(diner);
+#endif /* HAVE_XPM */
+  }
+
+  /* Now adjust locations and cells if need be */
+  if (newmi != diner->cell_index) {
+    delete_bubble_in_mesh(diner, KEEP_BUBBLE);
+    diner->cell_index = newmi;
+    add_to_mesh(diner);
+  }
+
+  return 1;
+}
+
+static int
+merge_bubbles(Bubble *b1, Bubble *b2)
+/* These two bubbles merge into one.  If the first one wins out return
+1 else return 2.  If there is no winner (it explodes) then return 0 */
+{
+  int b1size, b2size;
+
+  b1size = b1->area;
+  b2size = b2->area;
+
+#ifdef DEBUG
+  if ((null_bubble(b1) || null_bubble(b2))) {
+    fprintf(stderr, "NULL bubble passed to merge_bubbles()!\n");
+    exit(1);
+  }
+#endif /* DEBUG */
+
+  if (b1 == b2) {
+    hide_bubble(b1);
+    delete_bubble_in_mesh(b1, DELETE_BUBBLE);
+    return 0;
+  }
+
+  if (b1size > b2size) {
+    switch (bubble_eat(b1, b2)) {
+    case 0:
+      return 0;
+      break;
+    case 1:
+      return 1;
+      break;
+    default:
+      break;
+    }
+  } else if (b1size < b2size) {
+    switch (bubble_eat(b2, b1)) {
+    case 0:
+      return 0;
+      break;
+    case 1:
+      return 2;
+      break;
+    default:
+      break;
+    }
+  } else {
+    if ((random() % 2) == 0) {
+      switch (bubble_eat(b1, b2)) {
+      case 0:
+       return 0;
+       break;
+      case 1:
+       return 1;
+       break;
+      default:
+       break;
+      }
+    } else {
+      switch (bubble_eat(b2, b1)) {
+      case 0:
+       return 0;
+       break;
+      case 1:
+       return 2;
+       break;
+      default:
+       break;
+      }
+    }
+  }
+  fprintf(stderr, "An error occurred in merge_bubbles()\n");
+  exit(1);
+}
+
+static void 
+insert_new_bubble(Bubble *tmp)
+/* Calculates which bubbles are eaten when a new bubble tmp is
+   inserted.  This is called recursively in case when a bubble grows
+   it eats others.  Careful to pick out disappearing bubbles. */
+{
+  Bubble *nextbub;
+  Bubble *touch;
+
+#ifdef DEBUG
+  if (null_bubble(tmp)) {
+    fprintf(stderr, "Bad bubble passed to insert_new_bubble()!\n");
+    exit(1);
+  }
+#endif /* DEBUG */
+  
+  nextbub = tmp;
+  touch = get_closest_bubble(nextbub);
+  while (! null_bubble(touch)) {
+    switch (merge_bubbles(nextbub, touch)) {
+    case 2:
+      /* touch ate nextbub and survived */
+      nextbub = touch;
+      break;
+    case 1:
+      /* nextbub ate touch and survived */
+      break;
+    case 0:
+      /* somebody ate someone else but they exploded */
+      nextbub = (Bubble *)NULL;
+      break;
+    default:
+      /* something went wrong */
+      fprintf(stderr, "Error occurred in insert_new_bubble()\n");
+      exit(1);
+    }
+    /* Check to see if there are any other bubbles still in the area
+       and if we need to do this all over again for them. */
+    if (! null_bubble(nextbub))
+      touch = get_closest_bubble(nextbub);
+    else
+      touch = (Bubble *)NULL;
+  }
+}
+
+#ifdef DEBUG
+static int
+get_length_of_bubble_list(Bubble *bb)
+{
+  Bubble *tmp = bb;
+  int rv = 0;
+
+  while (! null_bubble(tmp)) {
+    rv++;
+    tmp = tmp->next;
+  }
+
+  return rv;
+}
+#endif /* DEBUG */
+
+/*
+ * Pixmap stuff used regardless of whether file I/O is available.  Must
+ * still check for XPM, though!
+ */
+
+#ifdef HAVE_XPM
+
+/*
+ * Pixmaps without file I/O (but do have XPM)
+ */
+
+static void 
+pixmap_sort(Bubble_Step **head, int numelems)
+/* Couldn't get qsort to work right with this so I wrote my own.  This puts
+the numelems length array with first element at head into order of radius.
+*/
+{
+  Bubble_Step tmp;
+  Bubble_Step *least = 0;
+  int minradius = INT_MAX;
+  int i;
+
+  for (i = 0; i < numelems; i++) {
+    if (head[i]->radius < minradius) {
+      least = head[i];
+      minradius = head[i]->radius;
+    }
+  }
+  if (*head != least) {
+    memcpy(&tmp, least, sizeof(Bubble_Step));
+    memcpy(least, *head, sizeof(Bubble_Step));
+    memcpy(*head, &tmp, sizeof(Bubble_Step));
+  }
+
+  if (numelems > 2)
+    pixmap_sort(&head[1], numelems-1);
+}
+
+static int
+extrapolate(int i1, int i2)
+{
+  return (i2 + (i2 - i1));
+}
+
+static void 
+make_pixmap_array(Bubble_Step *list)
+/* From a linked list of bubbles construct the array step_pixmaps */
+{
+  Bubble_Step *tmp = list;
+  int ind;
+#ifdef DEBUG
+  int prevrad = -1;
+#endif
+  
+  if (list == (Bubble_Step *)NULL) {
+    fprintf(stderr, "NULL list passed to make_pixmap_array\n");
+    exit(1);
+  }
+
+  num_bubble_pixmaps = 1;
+  while(tmp->next != (Bubble_Step *)NULL) {
+    tmp = tmp->next;
+    ++num_bubble_pixmaps;
+  }
+
+  if (num_bubble_pixmaps < 2) {
+    fprintf(stderr, "Must be at least two bubbles in file\n");
+    exit(1);
+  }
+
+  step_pixmaps = (Bubble_Step **)xmalloc((num_bubble_pixmaps + 1) * 
+                                        sizeof(Bubble_Step *));
+
+  /* Copy them blindly into the array for sorting. */
+  ind = 0;
+  tmp = list;
+  do {
+    step_pixmaps[ind++] = tmp;
+    tmp = tmp->next;
+  } while(tmp != (Bubble_Step *)NULL);
+
+  /* We make another bubble beyond the ones with pixmaps so that the final
+     bubble hangs around and doesn't pop immediately.  It's radius and area
+     are found by extrapolating from the largest two bubbles with pixmaps. */
+
+  step_pixmaps[num_bubble_pixmaps] = 
+    (Bubble_Step *)xmalloc(sizeof(Bubble_Step));
+  step_pixmaps[num_bubble_pixmaps]->radius = INT_MAX;
+
+  pixmap_sort(step_pixmaps, (num_bubble_pixmaps + 1));
+
+#ifdef DEBUG
+  if (step_pixmaps[num_bubble_pixmaps]->radius != INT_MAX) {
+    fprintf(stderr, "pixmap_sort() screwed up make_pixmap_array\n");
+  }
+#endif /* DEBUG */
+
+  step_pixmaps[num_bubble_pixmaps]->radius = 
+    extrapolate(step_pixmaps[num_bubble_pixmaps-2]->radius,
+               step_pixmaps[num_bubble_pixmaps-1]->radius);
+  step_pixmaps[num_bubble_pixmaps]->area = 
+    calc_bubble_area(step_pixmaps[num_bubble_pixmaps]->radius);
+  
+
+#ifdef DEBUG
+  /* Now check for correct order */
+  for (ind = 0; ind < num_bubble_pixmaps; ind++) {
+    if (prevrad > 0) {
+      if (step_pixmaps[ind]->radius < prevrad) {
+       fprintf(stderr, "Pixmaps not in ascending order of radius\n");
+       exit(1);
+      }
+    }
+    prevrad = step_pixmaps[ind]->radius;
+  }
+#endif /* DEBUG */
+}
+
+static void
+make_pixmap_from_default(char **pixmap_data, Bubble_Step *bl)
+/* Read pixmap data which has been compiled into the program and a pointer
+ to which has been passed. 
+
+ This is virtually copied verbatim from make_pixmap_from_file() above and
+changes made to either should be propagated onwards! */
+{
+  int result;
+  XGCValues gcv;
+
+#ifdef DEBUG
+  if (pixmap_data == (char **)0) {
+    fprintf(stderr, "make_pixmap_from_default(): NULL passed\n");
+    exit(1);
+  }
+#endif
+
+  if (bl == (Bubble_Step *)NULL) {
+    fprintf(stderr, "NULL pointer passed to make_pixmap()\n");
+    exit(1);
+  }
+
+  bl->xpmattrs.valuemask = 0;
+
+#ifdef XpmCloseness
+  bl->xpmattrs.valuemask |= XpmCloseness;
+  bl->xpmattrs.closeness = 40000;
+#endif
+#ifdef XpmVisual
+  bl->xpmattrs.valuemask |= XpmVisual;
+  bl->xpmattrs.visual = defvisual;
+#endif
+#ifdef XpmDepth
+  bl->xpmattrs.valuemask |= XpmDepth;
+  bl->xpmattrs.depth = screen_depth;
+#endif
+#ifdef XpmColormap
+  bl->xpmattrs.valuemask |= XpmColormap;
+  bl->xpmattrs.colormap = defcmap;
+#endif
+
+
+  /* This is the only line which is different from make_pixmap_from_file() */
+  result = XpmCreatePixmapFromData(defdsp, defwin, pixmap_data, &bl->ball, 
+                                  &bl->shape_mask, &bl->xpmattrs);
+
+  switch(result) {
+  case XpmColorError:
+    fprintf(stderr, "xpm: color substitution performed\n");
+    /* fall through */
+  case XpmSuccess:
+    bl->radius = MAX(bl->xpmattrs.width, bl->xpmattrs.height) / 2;
+    bl->area = calc_bubble_area(bl->radius);
+    break;
+  case XpmColorFailed:
+    fprintf(stderr, "xpm: color allocation failed\n");
+    exit(1);
+  case XpmNoMemory:
+    fprintf(stderr, "xpm: out of memory\n");
+    exit(1);
+  default:
+    fprintf(stderr, "xpm: unknown error code %d\n", result);
+    exit(1);
+  }
+  
+  gcv.plane_mask = AllPlanes;
+  gcv.foreground = default_fg_pixel;
+  gcv.function = GXcopy;
+  bl->draw_gc = XCreateGC (defdsp, defwin, GCForeground, &gcv);
+  XSetClipMask(defdsp, bl->draw_gc, bl->shape_mask);
+  
+  gcv.foreground = default_bg_pixel;
+  gcv.function = GXcopy;
+  bl->erase_gc = XCreateGC (defdsp, defwin, GCForeground, &gcv);
+  XSetClipMask(defdsp, bl->erase_gc, bl->shape_mask);  
+}
+
+static void 
+default_to_pixmaps (void)
+/* Make pixmaps out of default ball data stored in bubbles_default.c */
+{
+  int i;
+  Bubble_Step *pixmap_list = (Bubble_Step *)NULL;
+  Bubble_Step *newpix, *tmppix;
+  char **pixpt;
+
+  init_default_bubbles();
+
+  for (i = 0; i < num_default_bubbles; i++) {
+    pixpt = default_bubbles[i];
+    newpix = (Bubble_Step *)xmalloc(sizeof(Bubble_Step));
+    make_pixmap_from_default(pixpt, newpix);
+    /* Now add to list */
+    if (pixmap_list == (Bubble_Step *)NULL) {
+      pixmap_list = newpix;
+    } else {
+      tmppix = pixmap_list;
+      while (tmppix->next != (Bubble_Step *)NULL)
+       tmppix = tmppix->next;
+      tmppix->next = newpix;
+    }
+    newpix->next = (Bubble_Step *)NULL;
+  }
+  
+  /* Finally construct step_pixmaps[] */
+  make_pixmap_array(pixmap_list);
+}
+
+#endif /* HAVE_XPM */
+
+
+/* 
+ * Main stuff 
+ */
+
+
+static void 
+get_resources(Display *dpy, Window window)
+/* Get the appropriate X resources and warn about any inconsistencies. */
+{
+  Bool nodelay;
+  XWindowAttributes xgwa;
+  Colormap cmap;
+  XGetWindowAttributes (dpy, window, &xgwa);
+  cmap = xgwa.colormap;
+
+  threed = get_boolean_resource("3D", "Boolean");
+  quiet = get_boolean_resource("quiet", "Boolean");
+  simple = get_boolean_resource("simple", "Boolean");
+  /* Forbid rendered bubbles on monochrome displays */
+  if ((mono_p) && (! simple)) {
+    if (! quiet)
+      fprintf(stderr,
+             "Rendered bubbles not supported on monochrome displays\n");
+    simple = True;
+  }
+  delay = get_integer_resource("delay", "Integer");
+  nodelay = get_boolean_resource("nodelay", "Boolean");
+  if (nodelay)
+    delay = 0;
+  if (delay < 0)
+    delay = 0;
+
+  default_fg_pixel = get_pixel_resource ("foreground", "Foreground", dpy,
+                                        cmap);
+  default_bg_pixel = get_pixel_resource ("background", "Background", dpy,
+                                        cmap);
+
+  if (simple) {
+    /* This is easy */
+    broken = get_boolean_resource("broken", "Boolean");
+    if (broken)
+      if (! quiet)
+       fprintf(stderr, "-broken not available in simple mode\n");
+  } else {
+#ifndef HAVE_XPM
+    simple = 1;
+#else
+    broken = get_boolean_resource("broken", "Boolean");
+#endif /* HAVE_XPM */
+  }
+}
+
+static void
+init_bubbles (Display *dpy, Window window)
+{
+  XGCValues gcv;
+  XWindowAttributes xgwa;
+  int i;
+
+  defdsp = dpy;
+  defwin = window;
+
+  get_resources(dpy, window);
+
+  XGetWindowAttributes (dpy, window, &xgwa);
+
+#ifdef DEBUG
+  printf("sizof(int) on this platform is %d\n", sizeof(int));
+  printf("sizof(long) on this platform is %d\n", sizeof(long));
+#endif /* DEBUG */
+
+  screen_width = xgwa.width;
+  screen_height = xgwa.height;
+  screen_depth = xgwa.depth;
+  defcmap = xgwa.colormap;
+  defvisual = xgwa.visual;
+
+  if (simple) {
+    /* These are pretty much plucked out of the air */
+    bubble_min_radius = (int)(0.006*(double)(MIN(screen_width, 
+                                                screen_height)));
+    bubble_max_radius = (int)(0.045*(double)(MIN(screen_width,
+                                                screen_height)));
+    /* Some trivial values */
+    if (bubble_min_radius < 1)
+      bubble_min_radius = 1;
+    if (bubble_max_radius <= bubble_min_radius)
+      bubble_max_radius = bubble_min_radius + 1;
+
+    mesh_length = (2 * bubble_max_radius) + 3;
+
+    /* store area of each bubble of certain radius as number of 1/10s of
+       a pixel area.  PI is defined in <math.h> */
+    bubble_areas = (long *)xmalloc((bubble_max_radius + 2) * sizeof(int));
+    for (i = 0; i < bubble_min_radius; i++)
+      bubble_areas[i] = 0;
+    for (i = bubble_min_radius; i <= (bubble_max_radius+1); i++)
+      bubble_areas[i] = calc_bubble_area(i);
+
+    mesh_length = (2 * bubble_max_radius) + 3;
+  } else {
+#ifndef HAVE_XPM
+    fprintf(stderr,
+           "Bug: simple mode code not set but HAVE_XPM not defined\n");
+    exit(1);
+#else
+    /* Make sure all #ifdef sort of things have been taken care of in
+       get_resources(). */
+    default_to_pixmaps();
+
+    /* Set mesh length */
+    mesh_length = (2 * step_pixmaps[num_bubble_pixmaps-1]->radius) + 3;
+#endif /* HAVE_XPM */
+
+    /* Am I missing something in here??? */
+  }
+
+  mesh_width = (screen_width / mesh_length) + 1;
+  mesh_height = (screen_height / mesh_length) + 1;
+  mesh_cells = mesh_width * mesh_height;
+  init_mesh();
+
+  calculate_adjacent_list();
+
+  adjust_areas();
+
+  /* Graphics contexts for simple mode */
+  if (simple) {
+    gcv.foreground = default_fg_pixel;
+    draw_gc = XCreateGC (dpy, window, GCForeground, &gcv);
+    gcv.foreground = default_bg_pixel;
+    erase_gc = XCreateGC (dpy, window, GCForeground, &gcv);
+  }
+
+  XClearWindow (dpy, window);
+}
+
+static void 
+bubbles (Display *dpy, Window window)
+{
+  Bubble *tmp;
+
+  tmp = new_bubble();
+  add_to_mesh(tmp);
+  insert_new_bubble(tmp);
+
+  XSync (dpy, False);
+}
+
+
+void 
+screenhack (Display *dpy, Window window)
+{
+  init_bubbles (dpy, window);
+  while (1) {
+    bubbles (dpy, window);
+    screenhack_handle_events (dpy);
+    if (delay)
+      usleep(delay);
+  }
+}
+
diff --git a/hacks/bubbles.h b/hacks/bubbles.h
new file mode 100644 (file)
index 0000000..89935f4
--- /dev/null
@@ -0,0 +1,214 @@
+/* bubbles.h - definitions for bubbles screensaver */
+
+/* $Id: bubbles.h,v 1.2 1997/05/19 03:26:05 jwz Exp $ */
+
+#ifndef _BUBBLES_H_
+#define _BUBBLES_H_
+
+#ifdef HAVE_XPM
+#include <X11/xpm.h>
+#endif
+
+/***************************************************************************
+ *   Options you might like to change to affect the program's behaviour    *
+ ***************************************************************************/
+
+/*
+ *   Uncommenting the following will enable support for reading bubbles from 
+ * files (using the -file and -directory options to bubbles).  This is
+ * disabled by default since such operations are inherently non-portable
+ * and we want the program to compile on as many systems as possible.  
+ *
+ *   If you uncomment this and you figure out how to get it working, please
+ * let me (J.Macnicol@student.anu.edu.au) know.  Diffs against the standard
+ * distribution would be appreciated.  Possible sources of problems are
+ * dirent and possibly the use of tmpnam().
+ */
+
+/* #define BUBBLES_IO */
+
+/*
+ *   The following only makes sense if BUBBLES_IO above is defined.
+ * 
+ *   Uncomment the following if you always want to use the -file or
+ * -directory options on the command line and never to use a default bubble
+ * compiled into the program.  This way you would save memory and disk space
+ * since if you do use -file or -directory only one bubble will be loaded
+ * into memory at any one time (and remember the default bubble is really
+ * uncompressed, unlike bubbles in files which can be compressed).  This
+ * is disabled by default only so people running the program for the first
+ * time with no knowldege of the command line options don't get error
+ * messages ;)
+ *
+ * NOTE: You will still need to have a bubbles_default.c file, else the
+ * build sequence will fail.  Well constructed bubbles_default.c files
+ * have #ifdef's which simply exclude everything else in the file at
+ * compile time.  The bubblestodefault script does this.
+ */
+
+/* #define NO_DEFAULT_BUBBLE */
+
+/*
+ * This turns on any debugging messages and sanity checks.  Hopefully you
+ * won't need this :)  It slows things down a bit, too.
+ *
+ * NOTE: If you uncomment this you will get some messages about unused
+ * functions when you compile.  You can ignore these - they refer to 
+ * convenient checking routines which simply aren't called but are left
+ * in case someone wants to use them.
+ */
+
+/* #define DEBUG */
+
+/***************************************************************************
+ *      Things you might need to change to get things working right        *
+ ***************************************************************************/
+
+/*
+ *  Name of the gzip binary.  You shouldn't need to change this unless it's
+ * not in your PATH when the program is run, in which case you will need to
+ * substitute the full path here.  Keep the double quotes else things won't
+ * compile!
+ */
+
+#define GZIP               "gzip"
+
+/*
+ *  Likewise for the Bourne shell.
+ */
+
+#define BOURNESH           "sh"
+
+/*
+ * The name of the directory entry structure is different under Linux
+ * (under which this code is being developed) than other systems.  The case
+ * alternate form here is that given in Kernighan & Ritchie's C book (which
+ * must be authoratitive, no?) 
+ *
+ * 04/07/96 : People will have to hack this to get it working on some
+ * systems.  I believe it doesn't work on SGI, for example.
+ */
+
+#ifdef _POSIX_SOURCE
+#define STRUCT_DIRENT      struct dirent
+#else
+#define STRUCT_DIRENT      Dirent
+#endif
+
+/* 
+ * The naming of fields in struct dirent also seems to differ from system to
+ * system.  This may have to be extended to make things truly portable.
+ * What we want here is the name field from a dirent struct pointed to
+ * by "dp". 
+ *
+ * 04/07/96 : See above.  This may need to be changed too.
+ */
+
+#ifdef _POSIX_SOURCE
+#define DIRENT_NAME       dp->d_name
+#else
+#define DIRENT_NAME       dp->name
+#endif
+
+/* I don't know why this isn't defined. */
+#ifdef linux
+/* apparently it is defined in recent linuxes.  who knows. */
+/*extern char *tempnam(char *, char *);*/
+#endif
+
+/****************************************************************************
+ *      Buffer lengths and things you probably won't need to touch          *
+ ****************************************************************************/
+
+/* Maximum length of a full path name we can deal with */
+#define PATH_BUF_SIZE      1024
+
+/* Size of string passed to shell as command */
+#define COMMAND_BUF_SIZE   2500
+
+/* Size increments for read_line() buffers */
+#define READ_LINE_BUF_SIZE 24
+
+/****************************************************************************
+ *                        End of options                                    *
+ ****************************************************************************/
+
+/* Some machines define M_PI and not PI.  If they don't define either, use
+own own.  Really, the accuracy of this is _not_ very important. */
+#ifndef PI
+# define PI  M_PI
+# ifndef M_PI
+#  define M_PI 3.1415926535
+# endif
+#endif
+
+/* for delete_bubble_in_mesh() */
+#define DELETE_BUBBLE      0
+#define KEEP_BUBBLE        1
+
+/* Status codes for read_line */
+#define LINE_READ          0
+#define EOF_REACHED        1
+#define IO_ERROR           2
+
+/* 
+ * Magic number for Bubble struct, in case it's trashed when debugging code
+ * (which happened to me often.... :(  
+ */
+
+#define BUBBLE_MAGIC       5674
+
+/* Useful macros */
+#define MAX(A, B) ((A) > (B) ? (A) : (B))
+#define MIN(A, B) ((A) < (B) ? (A) : (B))
+
+/* How we represent bubbles */
+struct bub {
+  int radius;
+  int step;  /* for rendered bubbles */
+  long area;
+  int x;
+  int y;
+  int magic;
+  int cell_index;
+  int visible;
+  struct bub *next;
+  struct bub *prev;
+};
+
+typedef struct bub Bubble;
+
+/*
+ * How we represent pixmaps of rendered bubbles.  Because the range of radii
+ * available may not be continuous, we call each a step (for the lack of a
+ * better name...)
+ */
+
+#ifdef HAVE_XPM
+struct bub_step {
+  int radius;
+  long area;
+  Pixmap ball, shape_mask;
+  GC draw_gc, erase_gc;
+  XpmAttributes xpmattrs;
+  struct bub_step *next;
+};
+
+typedef struct bub_step Bubble_Step;
+#endif /* HAVE_XPM */
+
+/* Make sure default bubble isn't compiled when we don't have XPM
+Disable file I/O code too. */
+#ifndef HAVE_XPM
+# define NO_DEFAULT_BUBBLE
+# undef BUBBLES_IO
+#endif /* HAVE_XPM */
+
+/* Make sure default bubble is compiled in when we have XPM and no file I/O */
+#ifdef HAVE_XPM
+# ifndef BUBBLES_IO
+#  undef NO_DEFAULT_BUBBLE
+# endif /* BUBBLES_IO */
+#endif /* HAVE_XPM */
+
+#endif /* _BUBBLES_H_ */
diff --git a/hacks/bubbles.man b/hacks/bubbles.man
new file mode 100644 (file)
index 0000000..c9016e6
--- /dev/null
@@ -0,0 +1,142 @@
+.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
+..
+.TH XScreenSaver 1 "14-Dec-95" "X Version 11"
+.SH NAME
+bubbles - frying pan / soft drink simulation
+.SH SYNOPSIS
+.B bubbles
+[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-simple] [\-broken] [\-3D] [\-file filename] [\-directory directoryname]
+.SH DESCRIPTION
+\fIBubbles\fP sprays lots of little random bubbles all over the window which
+then grow until they reach their maximum size and go pop.  The inspiration
+for this was watching little globules of oil on the bottom of a frying pan
+and it also looks a little like bubbles in fizzy soft drink.  The default
+mode uses fancy ray-traced bubbles but there is also a mode which just draws 
+circles in case the default mode is too taxing on your hardware.
+.SH OPTIONS
+Depending on how your
+.I bubbles
+was compiled, it accepts the following options:
+.TP 8
+.B \-foreground
+Colour of circles if \fI\-simple\fP mode is selected.
+.TP 8
+.B \-background
+Colour of window background.
+.TP 8
+.B \-window
+Draw on a newly-created window.  This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-mono 
+If on a color display, pretend we're on a monochrome display.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use.  Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-delay microseconds
+How much of a delay should be introduced between steps of the animation.
+Default 1, or about 1 microsecond.  Actually, this is the delay between each
+group of 15 new bubbles since such a delay between each step results in a
+very slow animation rate.
+.TP 8
+.B \-nodelay
+Same as \fI\-delay 0\fP.
+.TP 8
+.B \-simple
+Don't use the default fancy pixmap bubbles.  Just draw circles instead.
+This may give more bearable performance if your hardware wasn't made for
+this sort of thing.
+.TP 8
+.B \-broken
+Don't hide bubbles when they pop.  This was a bug during development
+but the results were actually quite attractive.  (This option is only
+available if you have the XPM library available and the imake generated
+Makefile has defined HAVE_XPM).
+.TP 8
+.B \-3D
+Normally, the simulation is done completely in two dimensions.  When a
+bubble swallows up another bubble, the areas of each are added to get
+the area of the resulting bubble.  This option changes the algorithm
+to instead add volume (imagining each to be a sphere in 3D space).  The
+whole thing looks more realistic but I find it attracts attention to
+the flickering of each bubble as they are move and are redrawn.  Your
+mileage may vary.
+.TP 8
+.B \-file filename
+Use the pixmap definitions in the given file, instead of the default (if
+one is compiled in).  This is ignored if \fI\-simple\fP is specified.  If
+the file is compressed (either with compress or gzip), it is decompressed
+before use.  (This option only works if you have XPM compiled into your
+binary and you have compiled with BUBBLES_IO set in bubbles.h.  This is
+\fBnot\fP the default).
+.TP 8
+.B \-directory directoryname
+Similar to \fI-file\fP except the file is taken randomly from the
+contents of the specified directory.  (Again, this option is only available
+if you have XPM and BUBBLES_IO was set when compiling.  See above).
+.TP 8
+.B \-quiet
+Don't print messages explaining why one or several command line options
+were ignored.  This is disabled by default.
+.SH NOTES
+If you find the pace of things too slow, remember that there is a delay
+even though you specify no \fI\-delay\fP option.  Try using \fI\-nodelay\fP
+although beware of the effects of irritation of other users if you're on a 
+shared system as you bleed their CPU time away.
+
+Some tools to assist in creation of new bubbles are included in the source
+distribution.  These can either be loaded with the \fI\-file\fP or
+\fI\-directory\fP options (if available) or they can be used in place
+of the distributed default bubble (bubble_default.c).
+You might like to copy these scripts to a permanent location and
+use them.  Read bubbles.README.
+
+Rendered bubbles are not supported on monochrome displays.  I'm not
+convinced that small bubbles, even dithered properly are going to look
+like anything more than a jumble of random dots.
+.SH BUGS
+There is a delay before something appears on the screen when using
+rendered bubbles.  The XPM library seems to take a \fBlong\fP time to make
+pixmaps out of raw data.  This can be irritating on slower systems.
+
+The movement of the bubbles looks jerky if an incomplete set of bubbles
+is used.  
+
+The hide/display algorithm could do with some work to avoid flickering
+when \fI\-nodelay\fP is set.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH DISTRIBUTION POLICY
+This work is Copyright \(co 1995, 1996 by James Macnicol.  Distribution is
+allowed under the terms of the GNU General Public License.  Look at the
+sources for the legalese.
+.SH AUTHOR
+James Macnicol <J.Macnicol@student.anu.edu.au>.  
diff --git a/hacks/compass.c b/hacks/compass.c
new file mode 100644 (file)
index 0000000..56a1b0a
--- /dev/null
@@ -0,0 +1,935 @@
+/* xscreensaver, Copyright (c) 1999 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software 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.  No representations are made about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or 
+ * implied warranty.
+ */
+
+#include <math.h>
+#include "screenhack.h"
+
+#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+# include "xdbe.h"
+#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
+
+#define countof(x) (sizeof(x)/sizeof(*(x)))
+#define ABS(x) ((x)<0?-(x):(x))
+#define MAX(x,y) ((x)<(y)?(y):(x))
+#define MIN(x,y) ((x)>(y)?(y):(x))
+#define RAND(n) ((long) ((random() & 0x7fffffff) % ((long) (n))))
+#define RANDSIGN() ((random() & 1) ? 1 : -1)
+
+struct disc {
+  int theta;           /* 0 - 360*64 */
+  int velocity;
+  int acceleration;
+  int limit;
+  GC gc;
+  void (*draw) (Display *, Drawable, struct disc *,
+                int x, int y, int radius);
+};
+
+
+static void
+draw_letters (Display *dpy, Drawable d, struct disc *disc,
+              int x, int y, int radius)
+{
+  XPoint points[50];
+  double th2 = 2 * M_PI * (disc->theta / ((double) 360*64));
+  double th;
+
+  /* W */
+
+  th = th2;
+
+  points[0].x = x + radius * 0.8 * cos(th - 0.07);
+  points[0].y = y + radius * 0.8 * sin(th - 0.07);
+
+  points[1].x = x + radius * 0.7 * cos(th - 0.05);
+  points[1].y = y + radius * 0.7 * sin(th - 0.05);
+
+  points[2].x = x + radius * 0.78 * cos(th);
+  points[2].y = y + radius * 0.78 * sin(th);
+
+  points[3].x = x + radius * 0.7 * cos(th + 0.05);
+  points[3].y = y + radius * 0.7 * sin(th + 0.05);
+
+  points[4].x = x + radius * 0.8 * cos(th + 0.07);
+  points[4].y = y + radius * 0.8 * sin(th + 0.07);
+
+  XDrawLines (dpy, d, disc->gc, points, 5, CoordModeOrigin);
+
+  /* 30 (1) */
+
+  th = th2 + (2 * M_PI * 0.08333);
+
+  points[0].x = x + radius * 0.78 * cos(th - 0.13);
+  points[0].y = y + radius * 0.78 * sin(th - 0.13);
+
+  points[1].x = x + radius * 0.8  * cos(th - 0.08);
+  points[1].y = y + radius * 0.8  * sin(th - 0.08);
+
+  points[2].x = x + radius * 0.78 * cos(th - 0.03);
+  points[2].y = y + radius * 0.78 * sin(th - 0.03);
+
+  points[3].x = x + radius * 0.76 * cos(th - 0.03);
+  points[3].y = y + radius * 0.76 * sin(th - 0.03);
+
+  points[4].x = x + radius * 0.75 * cos(th - 0.08);
+  points[4].y = y + radius * 0.75 * sin(th - 0.08);
+
+  points[5].x = x + radius * 0.74 * cos(th - 0.03);
+  points[5].y = y + radius * 0.74 * sin(th - 0.03);
+
+  points[6].x = x + radius * 0.72 * cos(th - 0.03);
+  points[6].y = y + radius * 0.72 * sin(th - 0.03);
+
+  points[7].x = x + radius * 0.7  * cos(th - 0.08);
+  points[7].y = y + radius * 0.7  * sin(th - 0.08);
+
+  points[8].x = x + radius * 0.72  * cos(th - 0.13);
+  points[8].y = y + radius * 0.72  * sin(th - 0.13);
+
+  XDrawLines (dpy, d, disc->gc, points, 9, CoordModeOrigin);
+
+  /* 30 (2) */
+
+  points[0].x = x + radius * 0.78 * cos(th + 0.03);
+  points[0].y = y + radius * 0.78 * sin(th + 0.03);
+
+  points[1].x = x + radius * 0.8  * cos(th + 0.08);
+  points[1].y = y + radius * 0.8  * sin(th + 0.08);
+
+  points[2].x = x + radius * 0.78 * cos(th + 0.13);
+  points[2].y = y + radius * 0.78 * sin(th + 0.13);
+
+  points[3].x = x + radius * 0.72 * cos(th + 0.13);
+  points[3].y = y + radius * 0.72 * sin(th + 0.13);
+
+  points[4].x = x + radius * 0.7  * cos(th + 0.08);
+  points[4].y = y + radius * 0.7  * sin(th + 0.08);
+
+  points[5].x = x + radius * 0.72  * cos(th + 0.03);
+  points[5].y = y + radius * 0.72  * sin(th + 0.03);
+
+  points[6] = points[0];
+
+  XDrawLines (dpy, d, disc->gc, points, 7, CoordModeOrigin);
+
+  /* 33 (1) */
+
+  th = th2 + (2 * M_PI * 0.16666);
+
+  points[0].x = x + radius * 0.78 * cos(th - 0.13);
+  points[0].y = y + radius * 0.78 * sin(th - 0.13);
+
+  points[1].x = x + radius * 0.8  * cos(th - 0.08);
+  points[1].y = y + radius * 0.8  * sin(th - 0.08);
+
+  points[2].x = x + radius * 0.78 * cos(th - 0.03);
+  points[2].y = y + radius * 0.78 * sin(th - 0.03);
+
+  points[3].x = x + radius * 0.76 * cos(th - 0.03);
+  points[3].y = y + radius * 0.76 * sin(th - 0.03);
+
+  points[4].x = x + radius * 0.75 * cos(th - 0.08);
+  points[4].y = y + radius * 0.75 * sin(th - 0.08);
+
+  points[5].x = x + radius * 0.74 * cos(th - 0.03);
+  points[5].y = y + radius * 0.74 * sin(th - 0.03);
+
+  points[6].x = x + radius * 0.72 * cos(th - 0.03);
+  points[6].y = y + radius * 0.72 * sin(th - 0.03);
+
+  points[7].x = x + radius * 0.7  * cos(th - 0.08);
+  points[7].y = y + radius * 0.7  * sin(th - 0.08);
+
+  points[8].x = x + radius * 0.72  * cos(th - 0.13);
+  points[8].y = y + radius * 0.72  * sin(th - 0.13);
+
+  XDrawLines (dpy, d, disc->gc, points, 9, CoordModeOrigin);
+
+  /* 33 (2) */
+
+  points[0].x = x + radius * 0.78 * cos(th + 0.03);
+  points[0].y = y + radius * 0.78 * sin(th + 0.03);
+
+  points[1].x = x + radius * 0.8  * cos(th + 0.08);
+  points[1].y = y + radius * 0.8  * sin(th + 0.08);
+
+  points[2].x = x + radius * 0.78 * cos(th + 0.13);
+  points[2].y = y + radius * 0.78 * sin(th + 0.13);
+
+  points[3].x = x + radius * 0.76 * cos(th + 0.13);
+  points[3].y = y + radius * 0.76 * sin(th + 0.13);
+
+  points[4].x = x + radius * 0.75 * cos(th + 0.08);
+  points[4].y = y + radius * 0.75 * sin(th + 0.08);
+
+  points[5].x = x + radius * 0.74 * cos(th + 0.13);
+  points[5].y = y + radius * 0.74 * sin(th + 0.13);
+
+  points[6].x = x + radius * 0.72 * cos(th + 0.13);
+  points[6].y = y + radius * 0.72 * sin(th + 0.13);
+
+  points[7].x = x + radius * 0.7  * cos(th + 0.08);
+  points[7].y = y + radius * 0.7  * sin(th + 0.08);
+
+  points[8].x = x + radius * 0.72  * cos(th + 0.03);
+  points[8].y = y + radius * 0.72  * sin(th + 0.03);
+
+  XDrawLines (dpy, d, disc->gc, points, 9, CoordModeOrigin);
+
+  /* N */
+
+  th = th2 + (2 * M_PI * 0.25);
+
+  points[0].x = x + radius * 0.7 * cos(th - 0.05);
+  points[0].y = y + radius * 0.7 * sin(th - 0.05);
+
+  points[1].x = x + radius * 0.8 * cos(th - 0.05);
+  points[1].y = y + radius * 0.8 * sin(th - 0.05);
+
+  points[2].x = x + radius * 0.7 * cos(th + 0.05);
+  points[2].y = y + radius * 0.7 * sin(th + 0.05);
+
+  points[3].x = x + radius * 0.8 * cos(th + 0.05);
+  points[3].y = y + radius * 0.8 * sin(th + 0.05);
+
+  XDrawLines (dpy, d, disc->gc, points, 4, CoordModeOrigin);
+
+  /* 3 */
+
+  th = th2 + (2 * M_PI * 0.33333);
+
+  points[0].x = x + radius * 0.78 * cos(th - 0.05);
+  points[0].y = y + radius * 0.78 * sin(th - 0.05);
+
+  points[1].x = x + radius * 0.8  * cos(th);
+  points[1].y = y + radius * 0.8  * sin(th);
+
+  points[2].x = x + radius * 0.78 * cos(th + 0.05);
+  points[2].y = y + radius * 0.78 * sin(th + 0.05);
+
+  points[3].x = x + radius * 0.76 * cos(th + 0.05);
+  points[3].y = y + radius * 0.76 * sin(th + 0.05);
+
+  points[4].x = x + radius * 0.75 * cos(th);
+  points[4].y = y + radius * 0.75 * sin(th);
+
+  points[5].x = x + radius * 0.74 * cos(th + 0.05);
+  points[5].y = y + radius * 0.74 * sin(th + 0.05);
+
+  points[6].x = x + radius * 0.72 * cos(th + 0.05);
+  points[6].y = y + radius * 0.72 * sin(th + 0.05);
+
+  points[7].x = x + radius * 0.7  * cos(th);
+  points[7].y = y + radius * 0.7  * sin(th);
+
+  points[8].x = x + radius * 0.72  * cos(th - 0.05);
+  points[8].y = y + radius * 0.72  * sin(th - 0.05);
+
+  XDrawLines (dpy, d, disc->gc, points, 9, CoordModeOrigin);
+
+  /* 6 */
+
+  th = th2 + (2 * M_PI * 0.41666);
+
+  points[0].x = x + radius * 0.78 * cos(th + 0.05);
+  points[0].y = y + radius * 0.78 * sin(th + 0.05);
+
+  points[1].x = x + radius * 0.8  * cos(th);
+  points[1].y = y + radius * 0.8  * sin(th);
+
+  points[2].x = x + radius * 0.78 * cos(th - 0.05);
+  points[2].y = y + radius * 0.78 * sin(th - 0.05);
+
+  points[3].x = x + radius * 0.72 * cos(th - 0.05);
+  points[3].y = y + radius * 0.72 * sin(th - 0.05);
+
+  points[4].x = x + radius * 0.7  * cos(th);
+  points[4].y = y + radius * 0.7  * sin(th);
+
+  points[5].x = x + radius * 0.72 * cos(th + 0.05);
+  points[5].y = y + radius * 0.72 * sin(th + 0.05);
+
+  points[6].x = x + radius * 0.74 * cos(th + 0.05);
+  points[6].y = y + radius * 0.74 * sin(th + 0.05);
+
+  points[7].x = x + radius * 0.76 * cos(th);
+  points[7].y = y + radius * 0.76 * sin(th);
+
+  points[8].x = x + radius * 0.74 * cos(th - 0.05);
+  points[8].y = y + radius * 0.74 * sin(th - 0.05);
+
+  XDrawLines (dpy, d, disc->gc, points, 9, CoordModeOrigin);
+
+
+  /* E */
+
+  th = th2 + (2 * M_PI * 0.5);
+
+  points[0].x = x + radius * 0.8 * cos(th + 0.05);
+  points[0].y = y + radius * 0.8 * sin(th + 0.05);
+
+  points[1].x = x + radius * 0.8 * cos(th - 0.05);
+  points[1].y = y + radius * 0.8 * sin(th - 0.05);
+
+  points[2].x = x + radius * 0.75 * cos(th - 0.05);
+  points[2].y = y + radius * 0.75 * sin(th - 0.05);
+
+  points[3].x = x + radius * 0.75 * cos(th + 0.025);
+  points[3].y = y + radius * 0.75 * sin(th + 0.025);
+
+  points[4].x = x + radius * 0.75 * cos(th - 0.05);
+  points[4].y = y + radius * 0.75 * sin(th - 0.05);
+
+  points[5].x = x + radius * 0.7 * cos(th - 0.05);
+  points[5].y = y + radius * 0.7 * sin(th - 0.05);
+
+  points[6].x = x + radius * 0.7 * cos(th + 0.05);
+  points[6].y = y + radius * 0.7 * sin(th + 0.05);
+
+  XDrawLines (dpy, d, disc->gc, points, 7, CoordModeOrigin);
+
+  /* 12 (1) */
+
+  th = th2 + (2 * M_PI * 0.58333);
+
+  points[0].x = x + radius * 0.77 * cos(th - 0.06);
+  points[0].y = y + radius * 0.77 * sin(th - 0.06);
+
+  points[1].x = x + radius * 0.8  * cos(th - 0.03);
+  points[1].y = y + radius * 0.8  * sin(th - 0.03);
+
+  points[2].x = x + radius * 0.7  * cos(th - 0.03);
+  points[2].y = y + radius * 0.7  * sin(th - 0.03);
+
+  XDrawLines (dpy, d, disc->gc, points, 3, CoordModeOrigin);
+
+  /* 12 (2) */
+
+  points[0].x = x + radius * 0.78 * cos(th + 0.02);
+  points[0].y = y + radius * 0.78 * sin(th + 0.02);
+
+  points[1].x = x + radius * 0.8  * cos(th + 0.07);
+  points[1].y = y + radius * 0.8  * sin(th + 0.07);
+
+  points[2].x = x + radius * 0.78 * cos(th + 0.11);
+  points[2].y = y + radius * 0.78 * sin(th + 0.11);
+
+  points[3].x = x + radius * 0.76 * cos(th + 0.11);
+  points[3].y = y + radius * 0.76 * sin(th + 0.11);
+
+  points[4].x = x + radius * 0.74 * cos(th + 0.02);
+  points[4].y = y + radius * 0.74 * sin(th + 0.02);
+
+  points[5].x = x + radius * 0.71 * cos(th + 0.03);
+  points[5].y = y + radius * 0.71 * sin(th + 0.03);
+
+  points[6].x = x + radius * 0.7  * cos(th + 0.03);
+  points[6].y = y + radius * 0.7  * sin(th + 0.03);
+
+  points[7].x = x + radius * 0.7  * cos(th + 0.13);
+  points[7].y = y + radius * 0.7  * sin(th + 0.13);
+
+  XDrawLines (dpy, d, disc->gc, points, 8, CoordModeOrigin);
+
+  /* 15 (1) */
+
+  th = th2 + (2 * M_PI * 0.66666);
+
+  points[0].x = x + radius * 0.77 * cos(th - 0.06);
+  points[0].y = y + radius * 0.77 * sin(th - 0.06);
+
+  points[1].x = x + radius * 0.8  * cos(th - 0.03);
+  points[1].y = y + radius * 0.8  * sin(th - 0.03);
+
+  points[2].x = x + radius * 0.7  * cos(th - 0.03);
+  points[2].y = y + radius * 0.7  * sin(th - 0.03);
+
+  XDrawLines (dpy, d, disc->gc, points, 3, CoordModeOrigin);
+
+  /* 15 (2) */
+
+  points[0].x = x + radius * 0.8  * cos(th + 0.11);
+  points[0].y = y + radius * 0.8  * sin(th + 0.11);
+
+  points[1].x = x + radius * 0.8  * cos(th + 0.02);
+  points[1].y = y + radius * 0.8  * sin(th + 0.02);
+
+  points[2].x = x + radius * 0.76 * cos(th + 0.02);
+  points[2].y = y + radius * 0.76 * sin(th + 0.02);
+
+  points[3].x = x + radius * 0.77 * cos(th + 0.06);
+  points[3].y = y + radius * 0.77 * sin(th + 0.06);
+
+  points[4].x = x + radius * 0.76 * cos(th + 0.10);
+  points[4].y = y + radius * 0.76 * sin(th + 0.10);
+
+  points[5].x = x + radius * 0.73 * cos(th + 0.11);
+  points[5].y = y + radius * 0.73 * sin(th + 0.11);
+
+  points[6].x = x + radius * 0.72 * cos(th + 0.10);
+  points[6].y = y + radius * 0.72 * sin(th + 0.10);
+
+  points[7].x = x + radius * 0.7  * cos(th + 0.06);
+  points[7].y = y + radius * 0.7  * sin(th + 0.06);
+
+  points[8].x = x + radius * 0.72 * cos(th + 0.02);
+  points[8].y = y + radius * 0.72 * sin(th + 0.02);
+
+  XDrawLines (dpy, d, disc->gc, points, 9, CoordModeOrigin);
+
+  /* S */
+
+  th = th2 + (2 * M_PI * 0.75);
+
+  points[0].x = x + radius * 0.78 * cos(th + 0.05);
+  points[0].y = y + radius * 0.78 * sin(th + 0.05);
+
+  points[1].x = x + radius * 0.8  * cos(th);
+  points[1].y = y + radius * 0.8  * sin(th);
+
+  points[2].x = x + radius * 0.78 * cos(th - 0.05);
+  points[2].y = y + radius * 0.78 * sin(th - 0.05);
+
+  points[3].x = x + radius * 0.76 * cos(th - 0.05);
+  points[3].y = y + radius * 0.76 * sin(th - 0.05);
+
+  points[4].x = x + radius * 0.74 * cos(th + 0.05);
+  points[4].y = y + radius * 0.74 * sin(th + 0.05);
+
+  points[5].x = x + radius * 0.72 * cos(th + 0.05);
+  points[5].y = y + radius * 0.72 * sin(th + 0.05);
+
+  points[6].x = x + radius * 0.7  * cos(th);
+  points[6].y = y + radius * 0.7  * sin(th);
+
+  points[7].x = x + radius * 0.72  * cos(th - 0.05);
+  points[7].y = y + radius * 0.72  * sin(th - 0.05);
+
+  XDrawLines (dpy, d, disc->gc, points, 8, CoordModeOrigin);
+
+  /* 21 (1) */
+
+  th = th2 + (2 * M_PI * 0.83333);
+
+  points[0].x = x + radius * 0.78 * cos(th - 0.13);
+  points[0].y = y + radius * 0.78 * sin(th - 0.13);
+
+  points[1].x = x + radius * 0.8  * cos(th - 0.08);
+  points[1].y = y + radius * 0.8  * sin(th - 0.08);
+
+  points[2].x = x + radius * 0.78 * cos(th - 0.03);
+  points[2].y = y + radius * 0.78 * sin(th - 0.03);
+
+  points[3].x = x + radius * 0.76 * cos(th - 0.03);
+  points[3].y = y + radius * 0.76 * sin(th - 0.03);
+
+  points[4].x = x + radius * 0.74 * cos(th - 0.12);
+  points[4].y = y + radius * 0.74 * sin(th - 0.12);
+
+  points[5].x = x + radius * 0.71 * cos(th - 0.13);
+  points[5].y = y + radius * 0.71 * sin(th - 0.13);
+
+  points[6].x = x + radius * 0.7  * cos(th - 0.13);
+  points[6].y = y + radius * 0.7  * sin(th - 0.13);
+
+  points[7].x = x + radius * 0.7  * cos(th - 0.02);
+  points[7].y = y + radius * 0.7  * sin(th - 0.02);
+
+  XDrawLines (dpy, d, disc->gc, points, 8, CoordModeOrigin);
+
+  /* 21 (2) */
+
+  points[0].x = x + radius * 0.77 * cos(th + 0.03);
+  points[0].y = y + radius * 0.77 * sin(th + 0.03);
+
+  points[1].x = x + radius * 0.8  * cos(th + 0.06);
+  points[1].y = y + radius * 0.8  * sin(th + 0.06);
+
+  points[2].x = x + radius * 0.7  * cos(th + 0.06);
+  points[2].y = y + radius * 0.7  * sin(th + 0.06);
+
+  XDrawLines (dpy, d, disc->gc, points, 3, CoordModeOrigin);
+
+  /* 24 (1) */
+
+  th = th2 + (2 * M_PI * 0.91666);
+
+  points[0].x = x + radius * 0.78 * cos(th - 0.13);
+  points[0].y = y + radius * 0.78 * sin(th - 0.13);
+
+  points[1].x = x + radius * 0.8  * cos(th - 0.08);
+  points[1].y = y + radius * 0.8  * sin(th - 0.08);
+
+  points[2].x = x + radius * 0.78 * cos(th - 0.03);
+  points[2].y = y + radius * 0.78 * sin(th - 0.03);
+
+  points[3].x = x + radius * 0.76 * cos(th - 0.03);
+  points[3].y = y + radius * 0.76 * sin(th - 0.03);
+
+  points[4].x = x + radius * 0.74 * cos(th - 0.12);
+  points[4].y = y + radius * 0.74 * sin(th - 0.12);
+
+  points[5].x = x + radius * 0.71 * cos(th - 0.13);
+  points[5].y = y + radius * 0.71 * sin(th - 0.13);
+
+  points[6].x = x + radius * 0.7  * cos(th - 0.13);
+  points[6].y = y + radius * 0.7  * sin(th - 0.13);
+
+  points[7].x = x + radius * 0.7  * cos(th - 0.02);
+  points[7].y = y + radius * 0.7  * sin(th - 0.02);
+
+  XDrawLines (dpy, d, disc->gc, points, 8, CoordModeOrigin);
+
+  /* 24 (2) */
+
+  points[0].x = x + radius * 0.69 * cos(th + 0.09);
+  points[0].y = y + radius * 0.69 * sin(th + 0.09);
+
+  points[1].x = x + radius * 0.8  * cos(th + 0.09);
+  points[1].y = y + radius * 0.8  * sin(th + 0.09);
+
+  points[2].x = x + radius * 0.72 * cos(th + 0.01);
+  points[2].y = y + radius * 0.72 * sin(th + 0.01);
+
+  points[3].x = x + radius * 0.72 * cos(th + 0.13);
+  points[3].y = y + radius * 0.72 * sin(th + 0.13);
+
+  XDrawLines (dpy, d, disc->gc, points, 4, CoordModeOrigin);
+}
+
+
+static void
+draw_ticks (Display *dpy, Drawable d, struct disc *disc,
+            int x, int y, int radius)
+{
+  XSegment segs[72];
+  int i;
+  double tick = (M_PI * 2) / 72;
+
+  for (i = 0; i < 72; i++)
+    {
+      int radius2 = radius;
+      double th = (i * tick) + (2 * M_PI * (disc->theta / ((double) 360*64)));
+
+      if (i % 6)
+        radius2 -= radius / 16;
+      else
+        radius2 -= radius / 8;
+
+      segs[i].x1 = x + radius  * cos(th);
+      segs[i].y1 = y + radius  * sin(th);
+      segs[i].x2 = x + radius2 * cos(th);
+      segs[i].y2 = y + radius2 * sin(th);
+    }
+  XDrawSegments (dpy, d, disc->gc, segs, countof(segs));
+
+  draw_letters (dpy, d, disc, x, y, radius);
+}
+
+
+static void
+draw_thin_arrow (Display *dpy, Drawable d, struct disc *disc,
+                 int x, int y, int radius)
+{
+  XPoint points[3];
+  double th;
+  int radius2;
+  double tick = ((M_PI * 2) / 72) * 2;
+
+  radius *= 0.9;
+  radius2 = radius - (radius / 8) * 3;
+
+  th = 2 * M_PI * (disc->theta / ((double) 360*64));
+
+  points[0].x = x + radius * cos(th);          /* tip */
+  points[0].y = y + radius * sin(th);
+
+  points[1].x = x + radius2 * cos(th - tick);  /* tip left */
+  points[1].y = y + radius2 * sin(th - tick);
+
+  points[2].x = x + radius2 * cos(th + tick);  /* tip right */
+  points[2].y = y + radius2 * sin(th + tick);
+
+  XDrawLine (dpy, d, disc->gc,
+             (int) (x + radius2 * cos(th)),
+             (int) (y + radius2 * sin(th)),
+             (int) (x + -radius * cos(th)),
+             (int) (y + -radius * sin(th)));
+
+  XFillPolygon (dpy, d, disc->gc, points, 3, Convex, CoordModeOrigin);
+}
+
+
+static void
+draw_thick_arrow (Display *dpy, Drawable d, struct disc *disc,
+                  int x, int y, int radius)
+{
+  XPoint points[10];
+  double th;
+  int radius2, radius3;
+  double tick = ((M_PI * 2) / 72) * 2;
+
+  radius *= 0.9;
+  radius2 = radius - (radius / 8) * 3;
+  radius3 = radius - (radius / 8) * 2;
+  th = 2 * M_PI * (disc->theta / ((double) 360*64));
+
+  points[0].x = x + radius * cos(th);          /* tip */
+  points[0].y = y + radius * sin(th);
+
+  points[1].x = x + radius2 * cos(th - tick);  /* tip left */
+  points[1].y = y + radius2 * sin(th - tick);
+
+  points[2].x = x + radius2 * cos(th + tick);  /* tip right */
+  points[2].y = y + radius2 * sin(th + tick);
+
+  points[3] = points[0];
+
+  XDrawLines (dpy, d, disc->gc, points, 4, CoordModeOrigin);
+
+  points[0].x = x + radius2 * cos(th - tick/2);         /* top left */
+  points[0].y = y + radius2 * sin(th - tick/2);
+
+  points[1].x = x + -radius2 * cos(th + tick/2); /* bottom left */
+  points[1].y = y + -radius2 * sin(th + tick/2);
+
+  points[2].x = x + -radius3 * cos(th);                 /* bottom */
+  points[2].y = y + -radius3 * sin(th);
+
+  points[3].x = x + -radius * cos(th);          /* bottom spike */
+  points[3].y = y + -radius * sin(th);
+
+  points[4] = points[2];                        /* return */
+
+  points[5].x = x + -radius2 * cos(th - tick/2); /* bottom right */
+  points[5].y = y + -radius2 * sin(th - tick/2);
+
+  points[6].x = x + radius2 * cos(th + tick/2);  /* top right */
+  points[6].y = y + radius2 * sin(th + tick/2);
+
+  XDrawLines (dpy, d, disc->gc, points, 7, CoordModeOrigin);
+}
+
+
+
+static void
+roll_disc (struct disc *disc)
+{
+  double th = disc->theta;
+  if (th < 0)
+    th = -(th + disc->velocity);
+  else
+    th = (th + disc->velocity);
+
+  if (th > (360*64))
+    th -= (360*64);
+  else if (th < 0)
+    th += (360*64);
+
+  disc->theta = (disc->theta > 0 ? th : -th);
+
+  disc->velocity += disc->acceleration;
+
+  if (disc->velocity > disc->limit || 
+      disc->velocity < -disc->limit)
+    disc->acceleration = -disc->acceleration;
+
+  /* Alter direction of rotational acceleration randomly. */
+  if (! (random() % 120))
+    disc->acceleration = -disc->acceleration;
+
+  /* Change acceleration very occasionally. */
+  if (! (random() % 200))
+    {
+      if (random() & 1)
+       disc->acceleration *= 1.2;
+      else
+       disc->acceleration *= 0.8;
+    }
+}
+
+
+static void
+init_spin (struct disc *disc)
+{
+  disc->limit = 5*64;
+  disc->theta = RAND(360*64);
+  disc->velocity = RAND(16) * RANDSIGN();
+  disc->acceleration = RAND(16) * RANDSIGN();
+}
+
+
+static void
+draw_compass (Display *dpy, Drawable d, struct disc **discs,
+              int x, int y, int radius)
+{
+  int i = 0;
+  while (discs[i])
+    {
+      discs[i]->draw (dpy, d, discs[i], x, y, radius);
+      roll_disc (discs[i]);
+      i++;
+    }
+}
+
+static void
+draw_pointer (Display *dpy, Drawable d, GC ptr_gc, GC dot_gc,
+              int x, int y, int radius)
+{
+  XPoint points[3];
+  int size = radius * 0.1;
+
+  /* top */
+
+  points[0].x = x - size;
+  points[0].y = y - radius - size;
+
+  points[1].x = x + size;
+  points[1].y = y - radius - size;
+
+  points[2].x = x;
+  points[2].y = y - radius;
+  
+  XFillPolygon (dpy, d, ptr_gc, points, 3, Convex, CoordModeOrigin);
+
+  /* top right */
+
+  points[0].x = x - (radius * 0.85);
+  points[0].y = y - (radius * 0.8);
+
+  points[1].x = x - (radius * 1.1);
+  points[1].y = y - (radius * 0.55);
+
+  points[2].x = x - (radius * 0.6);
+  points[2].y = y - (radius * 0.65);
+  
+  XFillPolygon (dpy, d, ptr_gc, points, 3, Convex, CoordModeOrigin);
+
+  /* left */
+
+  points[0].x = x - (radius * 1.05);
+  points[0].y = y;
+
+  points[1].x = x - (radius * 1.1);
+  points[1].y = y - (radius * 0.025);
+
+  points[2].x = x - (radius * 1.1);
+  points[2].y = y + (radius * 0.025);
+  
+  XFillPolygon (dpy, d, dot_gc, points, 3, Convex, CoordModeOrigin);
+
+  /* right */
+
+  points[0].x = x + (radius * 1.05);
+  points[0].y = y;
+
+  points[1].x = x + (radius * 1.1);
+  points[1].y = y - (radius * 0.025);
+
+  points[2].x = x + (radius * 1.1);
+  points[2].y = y + (radius * 0.025);
+  
+  XFillPolygon (dpy, d, dot_gc, points, 3, Convex, CoordModeOrigin);
+
+  /* bottom */
+
+  points[0].x = x;
+  points[0].y = y + (radius * 1.05);
+
+  points[1].x = x - (radius * 0.025);
+  points[1].y = y + (radius * 1.1);
+
+  points[2].x = x + (radius * 0.025);
+  points[2].y = y + (radius * 1.1);
+  
+  XFillPolygon (dpy, d, dot_gc, points, 3, Convex, CoordModeOrigin);
+
+  /* bottom left */
+
+  points[0].x = x + (radius * 0.74);
+  points[0].y = y + (radius * 0.74);
+
+  points[1].x = x + (radius * 0.78);
+  points[1].y = y + (radius * 0.75);
+
+  points[2].x = x + (radius * 0.75);
+  points[2].y = y + (radius * 0.78);
+  
+  XFillPolygon (dpy, d, dot_gc, points, 3, Convex, CoordModeOrigin);
+
+  /* top left */
+
+  points[0].x = x + (radius * 0.74);
+  points[0].y = y - (radius * 0.74);
+
+  points[1].x = x + (radius * 0.78);
+  points[1].y = y - (radius * 0.75);
+
+  points[2].x = x + (radius * 0.75);
+  points[2].y = y - (radius * 0.78);
+  
+  XFillPolygon (dpy, d, dot_gc, points, 3, Convex, CoordModeOrigin);
+
+  /* bottom right */
+
+  points[0].x = x - (radius * 0.74);
+  points[0].y = y + (radius * 0.74);
+
+  points[1].x = x - (radius * 0.78);
+  points[1].y = y + (radius * 0.75);
+
+  points[2].x = x - (radius * 0.75);
+  points[2].y = y + (radius * 0.78);
+  
+  XFillPolygon (dpy, d, dot_gc, points, 3, Convex, CoordModeOrigin);
+}
+
+\f
+char *progclass = "Compass";
+
+char *defaults [] = {
+  ".background:                #000000",
+  ".foreground:                #DDFFFF",
+  "*arrow1Foreground:  #FFF66A",
+  "*arrow2Foreground:  #F7D64A",
+  "*pointerForeground: #FF0000",
+  "*delay:             10000",
+  "*doubleBuffer:      True",
+#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+  "*useDBE:            True",
+#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
+  0
+};
+
+XrmOptionDescRec options [] = {
+  { "-delay",          ".delay",       XrmoptionSepArg, 0 },
+  { "-db",             ".doubleBuffer", XrmoptionNoArg,  "True" },
+  { "-no-db",          ".doubleBuffer", XrmoptionNoArg,  "False" },
+  { 0, 0, 0, 0 }
+};
+
+void
+screenhack (Display *dpy, Window window)
+{
+  XGCValues gcv;
+  int delay = get_integer_resource ("delay", "Integer");
+  Bool dbuf = get_boolean_resource ("doubleBuffer", "Boolean");
+  struct disc *discs[4];
+  int x, y, size, size2;
+  GC ptr_gc;
+  GC erase_gc = 0;
+  XWindowAttributes xgwa;
+  Pixmap b=0, ba=0, bb=0;      /* double-buffer to reduce flicker */
+#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+  XdbeBackBuffer backb = 0;
+#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
+
+  XGetWindowAttributes (dpy, window, &xgwa);
+  size2 = MIN(xgwa.width, xgwa.height);
+
+  if (size2 > 600) size2 = 600;
+
+  size = (size2 / 2) * 0.8;
+
+  x = xgwa.width/2;
+  y = xgwa.height/2;
+
+  if (dbuf)
+    {
+#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+      b = backb = xdbe_get_backbuffer (dpy, window, XdbeUndefined);
+#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
+
+      if (!b)
+        {
+          x = size2/2;
+          y = size2/2;
+          ba = XCreatePixmap (dpy, window, size2, size2, xgwa.depth);
+          bb = XCreatePixmap (dpy, window, size2, size2, xgwa.depth);
+          b = ba;
+        }
+    }
+  else
+    {
+      b = window;
+    }
+
+  discs[0] = (struct disc *) calloc (1, sizeof (struct disc));
+  discs[1] = (struct disc *) calloc (1, sizeof (struct disc));
+  discs[2] = (struct disc *) calloc (1, sizeof (struct disc));
+  discs[3] = 0;
+
+  gcv.foreground = get_pixel_resource ("foreground", "Foreground",
+                                       dpy, xgwa.colormap);
+  gcv.line_width = MAX(2, (size/60));
+  gcv.join_style = JoinBevel;
+  discs[0]->draw = draw_ticks;
+  discs[0]->gc = XCreateGC (dpy, b, GCForeground|GCLineWidth|GCJoinStyle,
+                            &gcv);
+  init_spin (discs[0]);
+
+  gcv.foreground = get_pixel_resource ("arrow2Foreground", "Foreground",
+                                       dpy, xgwa.colormap);
+  gcv.line_width = MAX(4, (size / 30));
+  discs[1]->draw = draw_thick_arrow;
+  discs[1]->gc = XCreateGC (dpy, b, GCForeground|GCLineWidth, &gcv);
+  init_spin (discs[1]);
+
+  gcv.foreground = get_pixel_resource ("arrow1Foreground", "Foreground",
+                                       dpy, xgwa.colormap);
+  gcv.line_width = MAX(4, (size / 30));
+  discs[2]->draw = draw_thin_arrow;
+  discs[2]->gc = XCreateGC (dpy, b, GCForeground|GCLineWidth, &gcv);
+  init_spin (discs[2]);
+
+  gcv.foreground = get_pixel_resource ("pointerForeground", "Foreground",
+                                       dpy, xgwa.colormap);
+  ptr_gc = XCreateGC (dpy, b, GCForeground|GCLineWidth, &gcv);
+
+  gcv.foreground = get_pixel_resource ("background", "Background",
+                                       dpy, xgwa.colormap);
+  erase_gc = XCreateGC (dpy, b, GCForeground, &gcv);
+
+  if (ba) XFillRectangle (dpy, ba, erase_gc, 0, 0, size2, size2);
+  if (bb) XFillRectangle (dpy, bb, erase_gc, 0, 0, size2, size2);
+
+  while (1)
+    {
+      XFillRectangle (dpy, b, erase_gc, 0, 0, xgwa.width, xgwa.height);
+
+      draw_compass (dpy, b, discs, x, y, size);
+      draw_pointer (dpy, b, ptr_gc, discs[0]->gc, x, y, size);
+
+#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+      if (backb)
+        {
+          XdbeSwapInfo info[1];
+          info[0].swap_window = window;
+          info[0].swap_action = XdbeUndefined;
+          XdbeSwapBuffers (dpy, info, 1);
+        }
+      else
+#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
+      if (dbuf)
+        {
+          XCopyArea (dpy, b, window, erase_gc, 0, 0,
+                     size2, size2,
+                     xgwa.width/2 - x,
+                     xgwa.height/2 - y);
+          b = (b == ba ? bb : ba);
+        }
+
+      XSync (dpy, False);
+      screenhack_handle_events (dpy);
+      if (delay)
+        usleep (delay);
+    }
+}
diff --git a/hacks/compile_axp.com b/hacks/compile_axp.com
new file mode 100644 (file)
index 0000000..6bdfa03
--- /dev/null
@@ -0,0 +1,91 @@
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) ANT.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) ATTRACTION.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) BLITSPIN.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) BOUBOULE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) BRAID.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) BSOD.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) BUBBLES-DEFAULT.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) BUBBLES.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) COMPASS.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) CORAL.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) CRITICAL.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) CRYSTAL.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) CYNOSURE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) DECAYSCREEN.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) DECO.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) DELUXE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) DEMON.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) DISCRETE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) DISTORT.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) DRIFT.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) EPICYCLE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) FADEPLOT.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) FLAG.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) FLAME.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) FLOW.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) FOREST.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) GALAXY.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) GOOP.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) GRAV.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) GREYNETIC.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) HALO.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) HELIX.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) HOPALONG.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) HYPERCUBE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) IFS.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) IMSMAP.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) INTERFERENCE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) JIGSAW.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) JULIA.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) KALEIDESCOPE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) KUMPPA.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) LASER.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) LIGHTNING.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) LISA.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) LISSIE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) LMORPH.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) LOOP.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) MAZE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) MOIRE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) MOIRE2.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) MOUNTAIN.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) MUNCH.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) NOSEGUY.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) PEDAL.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) PENETRATE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) PENROSE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) PETRI.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) PHOSPHOR.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) PYRO.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) QIX.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) RD-BOMB.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) ROCKS.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) RORSCHACH.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) ROTOR.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) SCREENHACK.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) SHADEBOBS.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) SIERPINSKI.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) SLIDESCREEN.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) SLIP.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) SONAR.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) SPHERE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) SPIRAL.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) SPOTLIGHT.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) SQUIRAL.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) STARFISH.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) STRANGE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) SWIRL.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) T3D.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) TRIANGLE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) TRUCHET.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) VINES.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) WANDER.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) WORM.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) XFLAME.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) XJACK.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) XLOCKMORE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) XLYAP.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) XMATRIX.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) XROGER-HACK.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) XSCREENSAVER-SGIGL.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE,XLOCKMORE)/INCL=([],[-],[-.UTILS])/OBJ=SCREENHACK-XLOCK.OBJ SCREENHACK.C
diff --git a/hacks/compile_decc.com b/hacks/compile_decc.com
new file mode 100644 (file)
index 0000000..6bdfa03
--- /dev/null
@@ -0,0 +1,91 @@
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) ANT.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) ATTRACTION.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) BLITSPIN.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) BOUBOULE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) BRAID.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) BSOD.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) BUBBLES-DEFAULT.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) BUBBLES.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) COMPASS.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) CORAL.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) CRITICAL.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) CRYSTAL.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) CYNOSURE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) DECAYSCREEN.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) DECO.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) DELUXE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) DEMON.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) DISCRETE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) DISTORT.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) DRIFT.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) EPICYCLE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) FADEPLOT.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) FLAG.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) FLAME.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) FLOW.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) FOREST.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) GALAXY.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) GOOP.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) GRAV.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) GREYNETIC.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) HALO.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) HELIX.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) HOPALONG.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) HYPERCUBE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) IFS.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) IMSMAP.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) INTERFERENCE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) JIGSAW.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) JULIA.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) KALEIDESCOPE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) KUMPPA.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) LASER.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) LIGHTNING.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) LISA.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) LISSIE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) LMORPH.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) LOOP.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) MAZE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) MOIRE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) MOIRE2.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) MOUNTAIN.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) MUNCH.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) NOSEGUY.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) PEDAL.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) PENETRATE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) PENROSE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) PETRI.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) PHOSPHOR.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) PYRO.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) QIX.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) RD-BOMB.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) ROCKS.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) RORSCHACH.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) ROTOR.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) SCREENHACK.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) SHADEBOBS.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) SIERPINSKI.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) SLIDESCREEN.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) SLIP.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) SONAR.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) SPHERE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) SPIRAL.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) SPOTLIGHT.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) SQUIRAL.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) STARFISH.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) STRANGE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) SWIRL.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) T3D.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) TRIANGLE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) TRUCHET.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) VINES.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) WANDER.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) WORM.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) XFLAME.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) XJACK.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) XLOCKMORE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) XLYAP.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) XMATRIX.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) XROGER-HACK.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE)/INCL=([],[-],[-.UTILS]) XSCREENSAVER-SGIGL.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H,STANDALONE,XLOCKMORE)/INCL=([],[-],[-.UTILS])/OBJ=SCREENHACK-XLOCK.OBJ SCREENHACK.C
diff --git a/hacks/coral.c b/hacks/coral.c
new file mode 100644 (file)
index 0000000..7621d5e
--- /dev/null
@@ -0,0 +1,261 @@
+/* coral, by "Frederick G.M. Roeber" <roeber@netscape.com>, 15-jul-97.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software 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.  No representations are made about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or 
+ * implied warranty.
+ */
+
+#include "screenhack.h"
+#include "colors.h"
+#include "erase.h"
+
+static GC draw_gc, erase_gc;
+static unsigned int default_fg_pixel;
+#define NCOLORSMAX 200
+static XColor colors[NCOLORSMAX];
+static int ncolors = 0;
+static int colorindex = 0;
+static int colorsloth;
+
+static XPoint *walkers = 0;
+static int nwalkers;
+static int width, widthb;
+static int height;
+
+static unsigned int *board = 0;
+#define getdot(x,y) (board[(y*widthb)+(x>>5)] &  (1<<(x & 31)))
+#define setdot(x,y) (board[(y*widthb)+(x>>5)] |= (1<<(x & 31)))
+
+
+static void
+init_coral(Display *dpy, Window window)
+{
+    XGCValues gcv;
+    Colormap cmap;
+    XWindowAttributes xgwa;
+    Bool writeable = False;
+    int seeds;
+    int density;
+    int i;
+
+    XClearWindow(dpy, window);
+    XGetWindowAttributes(dpy, window, &xgwa);
+    width = xgwa.width;
+    widthb = ((xgwa.width + 31) >> 5);
+    height = xgwa.height;
+    if (board) free(board);
+    board = (unsigned int *)calloc(widthb * xgwa.height, sizeof(unsigned int));
+    if(!board) exit(1);
+    cmap = xgwa.colormap;
+    if( ncolors ) {
+        free_colors(dpy, cmap, colors, ncolors);
+        ncolors = 0;
+    }
+    gcv.foreground = default_fg_pixel = get_pixel_resource("foreground", "Foreground", dpy, cmap);
+    draw_gc = XCreateGC(dpy, window, GCForeground, &gcv);
+    gcv.foreground = get_pixel_resource ("background", "Background",dpy, cmap);
+    erase_gc = XCreateGC (dpy, window, GCForeground, &gcv);
+    ncolors = NCOLORSMAX;
+    make_uniform_colormap(dpy, xgwa.visual, cmap, colors, &ncolors, True, &writeable, False);
+    if (ncolors <= 0) {
+      ncolors = 2;
+      colors[0].red = colors[0].green = colors[0].blue = 0;
+      colors[1].red = colors[1].green = colors[1].blue = 0xFFFF;
+      XAllocColor(dpy, cmap, &colors[0]);
+      XAllocColor(dpy, cmap, &colors[1]);
+   }
+    colorindex = random()%ncolors;
+    
+    density = get_integer_resource("density", "Integer");
+    if( density < 1 ) density = 1;
+    if( density > 100 ) density = 90; /* more like mold than coral */
+    nwalkers = (width*height*density)/100;
+    if (walkers) free(walkers);
+    walkers = (XPoint *)calloc(nwalkers, sizeof(XPoint));
+    if( (XPoint *)0 == walkers ) exit(1);
+
+    seeds = get_integer_resource("seeds", "Integer");
+    if( seeds < 1 ) seeds = 1;
+    if( seeds > 1000 ) seeds = 1000;
+
+    colorsloth = nwalkers*2/ncolors;
+    XSetForeground(dpy, draw_gc, colors[colorindex].pixel);
+
+    for( i = 0; i < seeds; i++ ) {
+        int x, y;
+        do {
+            x = random() % width;
+            y = random() % height;
+        } while( getdot(x, y) );
+
+        setdot((x-1), (y-1)); setdot(x, (y-1)); setdot((x+1), (y-1));
+       setdot((x-1),  y   ); setdot(x,  y   ); setdot((x+1),  y   );
+       setdot((x-1), (y+1)); setdot(x, (y+1)); setdot((x+1), (y+1));
+        XDrawPoint(dpy, window, draw_gc, x, y);
+    }
+
+    for( i = 0; i < nwalkers; i++ ) {
+        walkers[i].x = (random() % (width-2)) + 1;
+        walkers[i].y = (random() % (height-2)) + 1;
+    }
+}
+
+
+/* returns 2 bits of randomness (conserving calls to random()).
+   This speeds things up a little, but not a lot (5-10% or so.)
+ */
+static int 
+rand_2(void)
+{
+  static int i = 0;
+  static int r = 0;
+  if (i != 0) {
+    i--;
+  } else {
+    i = 15;
+    r = random();
+  }
+
+  {
+    register int j = (r & 3);
+    r = r >> 2;
+    return j;
+  }
+}
+
+
+static void
+coral(Display *dpy, Window window)
+{
+    int delay2 = get_integer_resource ("delay2", "Integer");
+
+    int max_points = 200;
+    int npoints = 0;
+    XPoint *pointbuf = (XPoint *) calloc(sizeof(XPoint), max_points+2);
+    if (!pointbuf) exit(-1);
+
+    while( 1 ) {
+        int i;
+
+        for( i = 0; i < nwalkers; i++ ) {
+            int x = walkers[i].x;
+            int y = walkers[i].y;
+
+            if( getdot(x, y) ) {
+
+               Bool flush = False;
+               Bool color = False;
+
+               /* XDrawPoint(dpy, window, draw_gc, x, y); */
+               pointbuf[npoints].x = x;
+               pointbuf[npoints].y = y;
+               npoints++;
+
+                /* Mark the surrounding area as "sticky" */
+                setdot((x-1), (y-1)); setdot(x, (y-1)); setdot((x+1), (y-1));
+               setdot((x-1),  y   );                   setdot((x+1),  y   );
+                setdot((x-1), (y+1)); setdot(x, (y+1)); setdot((x+1), (y+1));
+                nwalkers--;
+                walkers[i].x = walkers[nwalkers].x;
+                walkers[i].y = walkers[nwalkers].y;
+                if( 0 == (nwalkers%colorsloth) ) {
+                 color = True;
+                }
+                 
+               if (flush || color || 0 == nwalkers || npoints >= max_points) {
+                 XDrawPoints(dpy, window, draw_gc, pointbuf, npoints,
+                             CoordModeOrigin);
+                 npoints = 0;
+                 XSync(dpy, False);
+               }
+
+               if (color) {
+                    colorindex++;
+                    if( colorindex == ncolors )
+                        colorindex = 0;
+                    XSetForeground(dpy, draw_gc, colors[colorindex].pixel);
+                }
+
+                if( 0 == nwalkers ) {
+                    XSync(dpy, False);
+                   free(pointbuf);
+                    return;
+                }
+            } else {
+                /* move it a notch */
+                do {
+                    switch(rand_2()) {
+                    case 0:
+                        if( 1 == x ) continue;
+                        walkers[i].x--;
+                        break;
+                    case 1:
+                        if( width-2 == x ) continue;
+                        walkers[i].x++;
+                        break;
+                    case 2:
+                        if( 1 == y ) continue;
+                        walkers[i].y--;
+                        break;
+                    default: /* case 3: */
+                        if( height-2 == y ) continue;
+                        walkers[i].y++;
+                        break;
+                   /* default:
+                     abort(); */
+                    }
+                } while(0);
+            }
+        }
+
+       if (delay2 > 0) {
+         if (npoints > 0) {
+           XDrawPoints(dpy, window, draw_gc, pointbuf, npoints,
+                       CoordModeOrigin);
+           npoints = 0;
+           XSync(dpy, False);
+         }
+          screenhack_handle_events (dpy);
+         usleep(delay2);
+       }
+    }
+}
+
+char *progclass = "Coral";
+
+char *defaults[] = {
+  ".background:        black",
+  ".foreground:        white",
+  "*density:   25",
+  "*seeds:     20", /* too many for 640x480, too few for 1280x1024 */
+  "*delay:     5",
+  "*delay2:    1000",
+  0
+};
+
+XrmOptionDescRec options[] = {
+    { "-density", ".density", XrmoptionSepArg, 0 },
+    { "-seeds", ".seeds", XrmoptionSepArg, 0 },
+    { "-delay", ".delay", XrmoptionSepArg, 0 },
+    { "-delay2", ".delay2", XrmoptionSepArg, 0 },
+    { 0, 0, 0, 0 }
+};
+
+void
+screenhack(dpy, window)
+Display *dpy;
+Window window;
+{
+    int delay = get_integer_resource ("delay", "Integer");
+    while( 1 ) {
+        init_coral(dpy, window);
+        coral(dpy, window);
+        screenhack_handle_events (dpy);
+        if( delay ) sleep(delay);
+       erase_full_window(dpy, window);
+    }
+}
diff --git a/hacks/critical.c b/hacks/critical.c
new file mode 100644 (file)
index 0000000..17abf8f
--- /dev/null
@@ -0,0 +1,329 @@
+/* critical -- Self-organizing-criticality display hack for XScreenSaver
+ * Copyright (C) 1998, 1999 Martin Pool <mbp@humbug.org.au>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software
+ * 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.  No representations are made
+ * about the suitability of this software for any purpose.  It is
+ * provided "as is" without express or implied warranty.
+ *
+ * See `critical.man' for more information.
+ *
+ * Revision history:
+ * 13 Nov 1998: Initial version, Martin Pool <mbp@humbug.org.au>
+ */
+
+#include "screenhack.h"
+#include "erase.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+
+char *progclass = "Critical";
+
+
+typedef struct {
+  int width, height;           /* in cells */
+  unsigned short *cells;
+} CriticalModel;
+
+
+CriticalModel * model_allocate (int w, int h);
+void model_initialize (CriticalModel *model);
+static void model_step (CriticalModel *model, int *top_x, int *top_y);
+
+
+/* Options this module understands.  */
+XrmOptionDescRec options[] = {
+  { "-ncolors",                ".ncolors",     XrmoptionSepArg, 0 },
+  { "-delay",          ".delay",       XrmoptionSepArg, 0 },
+  { "-colorscheme",    ".colorscheme", XrmoptionSepArg, 0 },
+  { "-restart",                ".restart",     XrmoptionSepArg, 0 },
+  { "-cellsize",       ".cellsize",    XrmoptionSepArg, 0 },
+  { "-batchcount",     ".batchcount",  XrmoptionSepArg, 0 },
+  { 0, 0, 0, 0 }               /* end */
+};
+
+
+/* Default xrm resources. */
+char *defaults[] = {
+  ".background:                        black",
+  "*colorscheme:               smooth",
+  "*delay:                     10000", 
+  "*ncolors:                   64",
+  "*restart:                   8",
+  "*cellsize:                  9",
+  "*batchcount:                        1500",
+  0                            /* end */
+};
+
+
+/* Allocate an return a new simulation model datastructure.
+ */
+
+CriticalModel *
+model_allocate (int model_w, int model_h)
+{
+  CriticalModel                *model;
+
+  model = malloc (sizeof (CriticalModel));
+  if (!model)
+    return 0;
+
+  model->width = model_w;
+  model->height = model_h;
+
+  model->cells = malloc (sizeof (int) * model_w * model_h);
+  if (!model->cells)
+    return 0;
+
+  return model;
+}
+
+
+
+/* Initialize the data model underlying the hack.
+
+   For the self-organizing criticality hack, this consists of a 2d
+   array full of random integers.
+
+   I've considered storing the data as (say) a binary tree within a 2d
+   array, to make finding the highest value faster at the expense of
+   storage space: searching the whole array on each iteration seems a
+   little inefficient.  However, the screensaver doesn't seem to take
+   up many cycles as it is: presumably the search is pretty quick
+   compared to the sleeps.  The current version uses less than 1% of
+   the CPU time of an AMD K6-233.  Many machines running X11 at this
+   point in time seem to be memory-limited, not CPU-limited.
+
+   The root of all evil, and all that.
+*/
+
+
+void
+model_initialize (CriticalModel *model)
+{
+  int i;
+  
+  for (i = model->width * model->height; i >= 0; i--)
+    {
+      model->cells[i] = (unsigned short) random ();
+    }
+}
+
+
+/* Move one step forward in the criticality simulation.
+
+   This function locates and returns in (TOP_X, TOP_Y) the location of
+   the highest-valued cell in the model.  It also replaces that cell
+   and it's eight nearest neighbours with new random values.
+   Neighbours that fall off the edge of the model are simply
+   ignored. */
+static void
+model_step (CriticalModel *model, int *top_x, int *top_y)
+{
+  int                  x, y, i;
+  int                  dx, dy;
+  unsigned short       top_value;
+
+  /* Find the top cell */
+  top_value = 0;
+  i = 0;
+  for (y = 0; y < model->height; y++)
+    for (x = 0; x < model->width; x++)
+      {
+       if (model->cells[i] >= top_value)
+         {
+           top_value = model->cells[i];
+           *top_x = x;
+           *top_y = y;
+         }
+       i++;
+      }
+
+  /* Replace it and its neighbours with new random values */
+  for (dy = -1; dy <= 1; dy++)
+    {
+      int y = *top_y + dy;
+      if (y < 0  ||  y >= model->height)
+       continue;
+      
+      for (dx = -1; dx <= 1; dx++)
+       {
+         int x = *top_x + dx;
+         if (x < 0  ||  x >= model->width)
+           continue;
+         
+         model->cells[y * model->width + x] = (unsigned short) random();
+       }
+    }
+}
+
+
+/* Construct and return in COLORS and N_COLORS a new set of colors,
+   depending on the resource settings.  */
+void
+setup_colormap (Display *dpy, XWindowAttributes *wattr,
+               XColor **colors,
+               int *n_colors)
+{
+  Bool                 writable;
+  char const *         color_scheme;
+
+  /* Make a colormap */
+  *n_colors = get_integer_resource ("ncolors", "Integer");
+  if (*n_colors < 2)
+    *n_colors = 2;
+  
+  *colors = (XColor *) calloc (sizeof(XColor), *n_colors);
+  if (!*colors)
+    {
+      fprintf (stderr, "%s:%d: can't allocate memory for colors\n",
+              __FILE__, __LINE__);
+      return;
+    }
+
+  writable = False;
+  color_scheme = get_string_resource ("colorscheme", "ColorScheme");
+  
+  if (!strcmp (color_scheme, "random"))
+    {
+      make_random_colormap (dpy, wattr->visual,
+                           wattr->colormap,
+                           *colors, n_colors,
+                           True, True, &writable, True);
+    }
+  else if (!strcmp (color_scheme, "smooth"))
+    {
+      make_smooth_colormap (dpy, wattr->visual,
+                           wattr->colormap,
+                           *colors, n_colors,
+                           True, &writable, True);
+    }
+  else 
+    {
+      make_uniform_colormap (dpy, wattr->visual,
+                            wattr->colormap,
+                            *colors, n_colors, True,
+                            &writable, True);
+    }
+}
+
+
+
+/* Display a self-organizing criticality screen hack.  The program
+   runs indefinately on the root window. */
+void
+screenhack (Display *dpy, Window window)
+{
+  GC                   fgc, bgc;
+  XGCValues            gcv;
+  XWindowAttributes    wattr;
+  int                  n_colors;
+  XColor               *colors;
+  int                  model_w, model_h;
+  CriticalModel                *model;
+  int                  lines_per_color = 10;
+  int                  i_color = 0;
+  int                  x1, y1, x2, y2;
+  long                 delay_usecs;
+  int                  cell_size;
+  int                  batchcount;
+
+  /* Number of screens that should be drawn before reinitializing the
+     model, and count of the number of screens done so far. */
+  int                  n_restart, i_restart;
+
+  /* Find window attributes */
+  XGetWindowAttributes (dpy, window, &wattr);
+
+  /* Construct the initial model state. */
+  cell_size = get_integer_resource ("cellsize", "Integer");
+  if (cell_size < 1)
+    cell_size = 1;
+  if (cell_size >= 100)
+    cell_size = 99;
+
+  batchcount = get_integer_resource ("batchcount", "Integer");
+  if (batchcount < 5)
+    batchcount = 5;
+  
+  model_w = wattr.width / cell_size;
+  model_h = wattr.height  / cell_size;
+  
+  model = model_allocate (model_w, model_h);
+  if (!model)
+    {
+      fprintf (stderr, "critical: error preparing the model\n");
+      return;
+    }
+  
+  /* make a black gc for the background */
+  gcv.foreground = get_pixel_resource ("background", "Background",
+                                      dpy, wattr.colormap);
+  bgc = XCreateGC (dpy, window, GCForeground, &gcv);
+
+  fgc = XCreateGC (dpy, window, 0, &gcv);
+
+  x2 = rand() % model_w;
+  y2 = rand() % model_h;
+
+  delay_usecs = get_integer_resource ("delay", "Integer");
+  n_restart = get_integer_resource ("restart", "Integer");
+    
+  /* xscreensaver will kill or stop us when the user does something
+   * that deserves attention. */
+  i_restart = 0;
+  
+  while (1) {
+    int i_batch;
+
+    if (!i_restart)
+      {
+       setup_colormap (dpy, &wattr, &colors, &n_colors);
+       model_initialize (model);
+      }
+    
+    for (i_batch = batchcount; i_batch; i_batch--)
+      {
+       /* Set color */
+       if ((i_batch % lines_per_color) == 0)
+         {
+           i_color = (i_color + 1) % n_colors;
+           gcv.foreground = colors[i_color].pixel;
+           XChangeGC (dpy, fgc, GCForeground, &gcv);
+         }
+       
+      /* draw a line */
+      x1 = x2;
+      y1 = y2;
+
+      model_step (model, &x2, &y2);
+
+      XDrawLine (dpy, window, fgc,
+                x1 * cell_size + cell_size/2,
+                y1 * cell_size + cell_size/2,
+                x2 * cell_size + cell_size/2,
+                y2 * cell_size + cell_size/2);
+
+      XSync (dpy, False); 
+      screenhack_handle_events (dpy);
+
+      if (delay_usecs)
+        usleep (delay_usecs);
+    }
+
+    i_restart = (i_restart + 1) % n_restart;
+    erase_full_window (dpy, window);
+  }
+}
+
+
+/*
+ * Local variables:
+ * c-indent-mode: gnu
+ * compile-command "make critical && ./critical"
+ * End:
+ */
diff --git a/hacks/critical.man b/hacks/critical.man
new file mode 100644 (file)
index 0000000..21eec6a
--- /dev/null
@@ -0,0 +1,87 @@
+.TH XScreenSaver 1 "13-Nov-98" "X Version 11"
+.SH NAME
+critical - Draw a system showing self-organizing criticality
+.SH SYNOPSIS
+.B critical
+[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-delay \fIseconds\fP] [\-random \fIboolean\fP] [\-ncolors \fIint\fP] [\-offset \fIint\fP] 
+.SH DESCRIPTION
+The \fIcritical\fP program displays a self-organizing critical system
+that gradually emerges from chaos.
+
+\fIcritical\fP performs a simulation on a two-dimensional array of
+integers.  The array is initialized to random values.  On each
+iteration, it draws a line to the array position with the greatest
+value.  It then replaces that location and the eight neighboring
+locations with randomly-selected values.
+
+The lines are initially random, but over time a chaotic
+self-organizing system evolves: areas of the screen which happen to
+have lower values are less likely to be updated to new values, and so
+the line tends to avoid those areas.  Eventually, the histogram of
+changes approaches the power-law curve typical of such systems.
+
+The simplest documented self-organizing system is the one-dimensional
+equivalent of \fIcritical\fP.
+
+I heard about this algorithm second-hand: apparently there was an
+article in \fIScientific American\fP describing it sometime in 1997.
+.SH OPTIONS
+.I critical
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window.  This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-mono 
+If on a color display, pretend we're on a monochrome display.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use.  Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-delay \fIusecs\fP
+Number of microseconds to wait after drawing each line.
+.TP 8
+.B \-random \fIboolean\fP
+Whether to use randomly selected colours rather than a cycle around
+the colour wheel.
+.TP 8
+.B \-offset \fIinteger\fP
+The maximum random radius increment to use.
+.TP 8
+.B \-ncolors \fIinteger\fP
+How many colors should be allocated in the color ramp (note that this
+value interacts with \fIoffset\fP.)
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.BR xscreensaver-command (1)
+.BR xscreensaver-demo (1)
+.SH COPYRIGHT
+Copyright \(co 1998 by Martin Pool.
+
+Permission to use, copy, modify, distribute, and sell this software
+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.  No representations are made about the
+suitability of this software for any purpose.  It is provided "as is"
+without express or implied warranty.
+.SH AUTHOR
+Martin Pool <mbp@humbug.org.au>, 13-Nov-1998.  Based in part on the
+XScreenSaver code by Jamie Zawinski <jwz@jwz.org>.
diff --git a/hacks/crystal.c b/hacks/crystal.c
new file mode 100644 (file)
index 0000000..7041e5c
--- /dev/null
@@ -0,0 +1,1256 @@
+/* -*- Mode: C; tab-width: 4 -*- */
+/* crystal --- polygons moving according to plane group rules */
+
+#if !defined( lint ) && !defined( SABER )
+static const char sccsid[] = "@(#)crystal.c    4.12 98/09/10 xlockmore";
+
+#endif
+
+/*-
+ * Copyright (c) 1997 by Jouk Jansen <joukj@crys.chem.uva.nl>
+ *
+ * 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.
+ *
+ * This file is provided AS IS with no warranties of any kind.  The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof.  In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * The author should like to be notified if changes have been made to the
+ * routine.  Response will only be guaranteed when a VMS version of the 
+ * program is available.
+ *
+ * A moving polygon-mode. The polygons obey 2D-planegroup symmetry.
+ *
+ * The groupings of the cells fall in 3 categories:
+ *   oblique groups 1 and 2 where the angle gamma ranges from 60 to 120 degrees
+ *   square groups 3 through 11 where the angle gamma is 90 degrees
+ *   hexagonal groups 12 through 17 where the angle gamma is 120 degrees
+ *
+ * Revision History:
+ * 03-Dec-98: Random inversion of y-axis included to simulate hexagonal groups
+ *             with an angle of 60 degrees.
+ * 10-Sep-98: new colour scheme
+ * 24-Feb-98: added option centre which turns on/off forcing the centre of
+ *              the screen to be used
+ *            added option maxsize which forces the dimensions to be chasen
+ *              in such ua way that the largest possible part of the screen is
+ *              used 
+ *            When only one unit cell is drawn, it is chosen at random
+ * 18-Feb-98: added support for negative numbers with -nx and -ny meaning
+ *            "random" choice with given maximum
+ *            added +/-grid option. If -cell is specified this option
+ *            determines if one or all unit cells are drawn.
+ *            -batchcount is now a parameter for all the objects on the screen
+ *            instead of the number of "unique" objects
+ *            The maximum size of the objects now scales with the part
+ *            of the screen used.
+ *            fixed "size" problem. Now very small non-vissable objects
+ *            are not allowed
+ * 13-Feb-98: randomized the unit cell size
+ *            runtime options -/+cell (turn on/off unit cell drawing)
+ *             -nx num (number of translational symmetries in x-direction
+ *             -ny num (idem y-direction but ignored for square and
+ *               hexagonal space groups
+ *               i.e. try xlock -mode crystal -nx 3 -ny 2
+ *            Fullrandom overrules the -/+cell option.
+ * 05-Feb-98: Revision + bug repairs
+ *            shows unit cell
+ *            use part of the screen for unit cell
+ *            in hexagonal and square groups a&b axis forced to be equal
+ *            cell angle for oblique groups randomly chosen between 60 and 120
+ *   bugs solved: planegroups with cell angles <> 90.0 now work properly
+ * 19-Sep-97: Added remaining hexagonal groups
+ * 12-Jun-97: Created
+ */
+
+#ifdef STANDALONE
+# define PROGCLASS             "Crystal"
+# define HACK_INIT             init_crystal
+# define HACK_DRAW             draw_crystal
+# define crystal_opts  xlockmore_opts
+# define DEFAULTS              "*delay:                60000   \n" \
+                                                "*count:                -500   \n" \
+                                                "*cycles:                200   \n" \
+                                                "*size:                  -15   \n" \
+                                                "*ncolors:               100   \n" \
+                                                "*fullrandom:   True   \n" \
+                                                "*verbose:             False   \n"
+# include "xlockmore.h"                /* in xscreensaver distribution */
+#else /* STANDALONE */
+# include "xlock.h"                    /* in xlockmore distribution */
+# include "color.h"
+#endif /* STANDALONE */
+
+#define DEF_CELL "True"                /* Draw unit cell */
+#define DEF_GRID "False"       /* Draw unit all cell if DEF_CELL is True */
+#define DEF_NX "-3"            /* number of unit cells in x-direction */
+#define DEF_NX1 1              /* number of unit cells in x-direction */
+#define DEF_NY "-3"            /* number of unit cells in y-direction */
+#define DEF_NY1 1              /* number of unit cells in y-direction */
+#define DEF_CENTRE "False"
+#define DEF_MAXSIZE "False"
+#define DEF_CYCLE "True"
+
+#define min(a,b) ((a) <= (b) ? (a) : (b))
+
+#ifdef STANDALONE
+void release_crystal(ModeInfo * mi);
+#endif
+
+static int  nx, ny;
+
+static Bool unit_cell, grid_cell, centre, maxsize, cycle_p;
+
+static XrmOptionDescRec opts[] =
+{
+       {"-nx", "crystal.nx", XrmoptionSepArg, (caddr_t) NULL},
+       {"-ny", "crystal.ny", XrmoptionSepArg, (caddr_t) NULL},
+       {"-centre", ".crystal.centre", XrmoptionNoArg, (caddr_t) "on"},
+       {"+centre", ".crystal.centre", XrmoptionNoArg, (caddr_t) "off"},
+       {"-maxsize", ".crystal.maxsize", XrmoptionNoArg, (caddr_t) "on"},
+       {"+maxsize", ".crystal.maxsize", XrmoptionNoArg, (caddr_t) "off"},
+       {"-cell", ".crystal.cell", XrmoptionNoArg, (caddr_t) "on"},
+       {"+cell", ".crystal.cell", XrmoptionNoArg, (caddr_t) "off"},
+       {"-grid", ".crystal.grid", XrmoptionNoArg, (caddr_t) "on"},
+       {"+grid", ".crystal.grid", XrmoptionNoArg, (caddr_t) "off"},
+       {"-shift", ".crystal.shift", XrmoptionNoArg, (caddr_t) "on"},
+       {"+shift", ".crystal.shift", XrmoptionNoArg, (caddr_t) "off"}
+};
+
+static argtype vars[] =
+{
+       {(caddr_t *) & nx, "nx", "nx", DEF_NX, t_Int},
+       {(caddr_t *) & ny, "ny", "ny", DEF_NY, t_Int},
+       {(caddr_t *) & centre, "centre", "Centre", DEF_CENTRE, t_Bool},
+       {(caddr_t *) & maxsize, "maxsize", "Maxsize", DEF_MAXSIZE, t_Bool},
+       {(caddr_t *) & unit_cell, "cell", "Cell", DEF_CELL, t_Bool},
+       {(caddr_t *) & grid_cell, "grid", "Grid", DEF_GRID, t_Bool},
+       {(caddr_t *) & cycle_p, "shift", "Shift", DEF_CYCLE, t_Bool}
+};
+static OptionStruct desc[] =
+{
+       {"-nx num", "Number of unit cells in x-direction"},
+       {"-ny num", "Number of unit cells in y-direction"},
+       {"-/+centre", "turn on/off centering on screen"},
+       {"-/+maxsize", "turn on/off use of maximum part of screen"},
+       {"-/+cell", "turn on/off drawing of unit cell"},
+   {"-/+grid", "turn on/off drawing of grid of unit cells (if -cell is on)"},
+       {"-/+shift", "turn on/off colour cycling"}
+};
+
+ModeSpecOpt crystal_opts =
+{sizeof opts / sizeof opts[0], opts, sizeof vars / sizeof vars[0], vars, desc};
+
+#ifdef USE_MODULES
+ModStruct   crystal_description =
+{"crystal", "init_crystal", "draw_crystal", "release_crystal",
+ "refresh_crystal", "init_crystal", NULL, &crystal_opts,
+ 60000, -40, 200, -15, 64, 1.0, "",
+ "Shows polygons in 2D plane groups", 0, NULL};
+
+#endif
+
+#define DEF_NUM_ATOM 10
+
+#define DEF_SIZ_ATOM 10
+
+#define PI_RAD (M_PI / 180.0)
+
+static Bool centro[17] =
+{
+       False,
+       True,
+       False,
+       False,
+       False,
+       True,
+       True,
+       True,
+       True,
+       True,
+       True,
+       True,
+       False,
+       False,
+       False,
+       True,
+       True
+};
+
+static Bool primitive[17] =
+{
+       True,
+       True,
+       True,
+       True,
+       False,
+       True,
+       True,
+       True,
+       False,
+       True,
+       True,
+       True,
+       True,
+       True,
+       True,
+       True,
+       True
+};
+
+static short numops[34] =
+{
+       1, 0,
+       1, 0,
+       9, 7,
+       2, 0,
+       9, 7,
+       9, 7,
+       4, 2,
+       5, 3,
+       9, 7,
+       8, 6,
+       10, 6,
+       8, 4,
+       16, 13,
+       19, 13,
+       16, 10,
+       19, 13,
+       19, 13
+};
+
+static short operation[114] =
+{
+       1, 0, 0, 1, 0, 0,
+       -1, 0, 0, 1, 0, 1,
+       -1, 0, 0, 1, 1, 0,
+       1, 0, 0, 1, 0, 0,
+       -1, 0, 0, 1, 1, 1,
+       1, 0, 0, 1, 1, 1,
+       0, -1, 1, 0, 0, 0,
+       1, 0, 0, 1, 0, 0,
+       -1, 0, 0, 1, 0, 0,
+       0, 1, 1, 0, 0, 0,
+       -1, 0, -1, 1, 0, 0,
+       1, -1, 0, -1, 0, 0,
+       0, 1, 1, 0, 0, 0,
+       0, -1, 1, -1, 0, 0,
+       -1, 1, -1, 0, 0, 0,
+       1, 0, 0, 1, 0, 0,
+       0, -1, -1, 0, 0, 0,
+       -1, 1, 0, 1, 0, 0,
+       1, 0, 1, -1, 0, 0
+};
+
+typedef struct {
+       unsigned long colour;
+       int         x0, y0, velocity[2];
+       float       angle, velocity_a;
+       int         num_point, at_type, size_at;
+       XPoint      xy[5];
+} crystalatom;
+
+typedef struct {
+       Bool        painted;
+       int         win_width, win_height, num_atom;
+       int         planegroup, a, b, offset_w, offset_h, nx, ny;
+       float       gamma;
+       crystalatom *atom;
+       GC          gc;
+       Bool        unit_cell, grid_cell;
+       Colormap    cmap;
+       XColor     *colors;
+       int         ncolors;
+       Bool        cycle_p, mono_p, no_colors;
+       unsigned long blackpixel, whitepixel, fg, bg;
+       int         direction, invert;
+} crystalstruct;
+
+static crystalstruct *crystals = NULL;
+
+static void
+trans_coor(XPoint * xyp, XPoint * new_xyp, int num_points,
+          float gamma)
+{
+       int         i;
+
+       for (i = 0; i <= num_points; i++) {
+               new_xyp[i].x = xyp[i].x +
+                       (int) (xyp[i].y * sin((gamma - 90.0) * PI_RAD));
+               new_xyp[i].y = (int) (xyp[i].y / cos((gamma - 90.0) * PI_RAD));
+       }
+}
+
+static void
+trans_coor_back(XPoint * xyp, XPoint * new_xyp,
+               int num_points, float gamma, int offset_w, int offset_h ,
+               int winheight , int invert )
+{
+       int         i;
+
+       for (i = 0; i <= num_points; i++) {
+               new_xyp[i].y = (int) (xyp[i].y * cos((gamma - 90) * PI_RAD)) +
+                       offset_h;
+               new_xyp[i].x = xyp[i].x - (int) (xyp[i].y * sin((gamma - 90.0)
+                                                      * PI_RAD)) + offset_w;
+          if ( invert ) new_xyp[i].y = winheight - new_xyp[i].y;
+       }
+}
+
+static void
+crystal_setupatom(crystalatom * atom0, float gamma)
+{
+       XPoint      xy[5];
+       int         x0, y0;
+
+       y0 = (int) (atom0->y0 * cos((gamma - 90) * PI_RAD));
+       x0 = atom0->x0 - (int) (atom0->y0 * sin((gamma - 90.0) * PI_RAD));
+       switch (atom0->at_type) {
+               case 0: /* rectangles */
+                       xy[0].x = x0 + (int) (2 * atom0->size_at *
+                                             cos(atom0->angle)) +
+                               (int) (atom0->size_at * sin(atom0->angle));
+                       xy[0].y = y0 + (int) (atom0->size_at *
+                                             cos(atom0->angle)) -
+                               (int) (2 * atom0->size_at * sin(atom0->angle));
+                       xy[1].x = x0 + (int) (2 * atom0->size_at *
+                                             cos(atom0->angle)) -
+                               (int) (atom0->size_at * sin(atom0->angle));
+                       xy[1].y = y0 - (int) (atom0->size_at *
+                                             cos(atom0->angle)) -
+                               (int) (2 * atom0->size_at * sin(atom0->angle));
+                       xy[2].x = x0 - (int) (2 * atom0->size_at *
+                                             cos(atom0->angle)) -
+                               (int) (atom0->size_at * sin(atom0->angle));
+                       xy[2].y = y0 - (int) (atom0->size_at *
+                                             cos(atom0->angle)) +
+                               (int) (2 * atom0->size_at * sin(atom0->angle));
+                       xy[3].x = x0 - (int) (2 * atom0->size_at *
+                                             cos(atom0->angle)) +
+                               (int) (atom0->size_at * sin(atom0->angle));
+                       xy[3].y = y0 + (int) (atom0->size_at *
+                                             cos(atom0->angle)) +
+                               (int) (2 * atom0->size_at *
+                                      sin(atom0->angle));
+                       xy[4].x = xy[0].x;
+                       xy[4].y = xy[0].y;
+                       trans_coor(xy, atom0->xy, 4, gamma);
+                       return;
+               case 1: /* squares */
+                       xy[0].x = x0 + (int) (1.5 * atom0->size_at *
+                                             cos(atom0->angle)) +
+                               (int) (1.5 * atom0->size_at *
+                                      sin(atom0->angle));
+                       xy[0].y = y0 + (int) (1.5 * atom0->size_at *
+                                             cos(atom0->angle)) -
+                               (int) (1.5 * atom0->size_at *
+                                      sin(atom0->angle));
+                       xy[1].x = x0 + (int) (1.5 * atom0->size_at *
+                                             cos(atom0->angle)) -
+                               (int) (1.5 * atom0->size_at *
+                                      sin(atom0->angle));
+                       xy[1].y = y0 - (int) (1.5 * atom0->size_at *
+                                             cos(atom0->angle)) -
+                               (int) (1.5 * atom0->size_at *
+                                      sin(atom0->angle));
+                       xy[2].x = x0 - (int) (1.5 * atom0->size_at *
+                                             cos(atom0->angle)) -
+                               (int) (1.5 * atom0->size_at *
+                                      sin(atom0->angle));
+                       xy[2].y = y0 - (int) (1.5 * atom0->size_at *
+                                             cos(atom0->angle)) +
+                               (int) (1.5 * atom0->size_at *
+                                      sin(atom0->angle));
+                       xy[3].x = x0 - (int) (1.5 * atom0->size_at *
+                                             cos(atom0->angle)) +
+                               (int) (1.5 * atom0->size_at *
+                                      sin(atom0->angle));
+                       xy[3].y = y0 + (int) (1.5 * atom0->size_at *
+                                             cos(atom0->angle)) +
+                               (int) (1.5 * atom0->size_at *
+                                      sin(atom0->angle));
+                       xy[4].x = xy[0].x;
+                       xy[4].y = xy[0].y;
+                       trans_coor(xy, atom0->xy, 4, gamma);
+                       return;
+               case 2: /* triangles */
+                       xy[0].x = x0 + (int) (1.5 * atom0->size_at *
+                                             sin(atom0->angle));
+                       xy[0].y = y0 + (int) (1.5 * atom0->size_at *
+                                             cos(atom0->angle));
+                       xy[1].x = x0 + (int) (1.5 * atom0->size_at *
+                                             cos(atom0->angle)) -
+                               (int) (1.5 * atom0->size_at *
+                                      sin(atom0->angle));
+                       xy[1].y = y0 - (int) (1.5 * atom0->size_at *
+                                             cos(atom0->angle)) -
+                               (int) (1.5 * atom0->size_at *
+                                      sin(atom0->angle));
+                       xy[2].x = x0 - (int) (1.5 * atom0->size_at *
+                                             cos(atom0->angle)) -
+                               (int) (1.5 * atom0->size_at *
+                                      sin(atom0->angle));
+                       xy[2].y = y0 - (int) (1.5 * atom0->size_at *
+                                             cos(atom0->angle)) +
+                               (int) (1.5 * atom0->size_at *
+                                      sin(atom0->angle));
+                       xy[3].x = xy[0].x;
+                       xy[3].y = xy[0].y;
+                       trans_coor(xy, atom0->xy, 3, gamma);
+                       return;
+       }
+}
+
+static void
+crystal_drawatom(ModeInfo * mi, crystalatom * atom0)
+{
+       crystalstruct *cryst;
+       Display    *display = MI_DISPLAY(mi);
+       Window      window = MI_WINDOW(mi);
+       int         j, k, l, m;
+
+       cryst = &crystals[MI_SCREEN(mi)];
+       for (j = numops[2 * cryst->planegroup + 1];
+            j < numops[2 * cryst->planegroup]; j++) {
+               XPoint      xy[5], new_xy[5];
+               XPoint      xy_1[5];
+               int         xtrans, ytrans;
+
+               xtrans = operation[j * 6] * atom0->x0 + operation[j * 6 + 1] *
+                       atom0->y0 + (int) (operation[j * 6 + 4] * cryst->a /
+                                          2.0);
+               ytrans = operation[j * 6 + 2] * atom0->x0 + operation[j * 6 +
+                              3] * atom0->y0 + (int) (operation[j * 6 + 5] *
+                                                      cryst->b / 2.0);
+               if (xtrans < 0) {
+                       if (xtrans < -cryst->a)
+                               xtrans = 2 * cryst->a;
+                       else
+                               xtrans = cryst->a;
+               } else if (xtrans >= cryst->a)
+                       xtrans = -cryst->a;
+               else
+                       xtrans = 0;
+               if (ytrans < 0)
+                       ytrans = cryst->b;
+               else if (ytrans >= cryst->b)
+                       ytrans = -cryst->b;
+               else
+                       ytrans = 0;
+               for (k = 0; k < atom0->num_point; k++) {
+                       xy[k].x = operation[j * 6] * atom0->xy[k].x +
+                               operation[j * 6 + 1] *
+                               atom0->xy[k].y + (int) (operation[j * 6 + 4] *
+                                                       cryst->a / 2.0) +
+                               xtrans;
+                       xy[k].y = operation[j * 6 + 2] * atom0->xy[k].x +
+                               operation[j * 6 + 3] *
+                               atom0->xy[k].y + (int) (operation[j * 6 + 5] *
+                                                       cryst->b / 2.0) +
+                               ytrans;
+               }
+               xy[atom0->num_point].x = xy[0].x;
+               xy[atom0->num_point].y = xy[0].y;
+               for (l = 0; l < cryst->nx; l++) {
+                       for (m = 0; m < cryst->ny; m++) {
+
+                               for (k = 0; k <= atom0->num_point; k++) {
+                                       xy_1[k].x = xy[k].x + l * cryst->a;
+                                       xy_1[k].y = xy[k].y + m * cryst->b;
+                               }
+                               trans_coor_back(xy_1, new_xy, atom0->num_point,
+                                               cryst->gamma, cryst->offset_w,
+                                               cryst->offset_h ,
+                                               cryst->win_height,
+                                               cryst->invert);
+                               XFillPolygon(display, window, cryst->gc, new_xy,
+                                 atom0->num_point, Convex, CoordModeOrigin);
+                       }
+               }
+               if (centro[cryst->planegroup] == True) {
+                       for (k = 0; k <= atom0->num_point; k++) {
+                               xy[k].x = cryst->a - xy[k].x;
+                               xy[k].y = cryst->b - xy[k].y;
+                       }
+                       for (l = 0; l < cryst->nx; l++) {
+                               for (m = 0; m < cryst->ny; m++) {
+
+                                       for (k = 0; k <= atom0->num_point; k++) {
+                                               xy_1[k].x = xy[k].x + l * cryst->a;
+                                               xy_1[k].y = xy[k].y + m * cryst->b;
+                                       }
+                                       trans_coor_back(xy_1, new_xy, atom0->num_point,
+                                                       cryst->gamma,
+                                                       cryst->offset_w,
+                                                       cryst->offset_h ,
+                                                       cryst->win_height ,
+                                                       cryst->invert);
+                                       XFillPolygon(display, window, cryst->gc,
+                                                    new_xy,
+                                                    atom0->num_point, Convex,
+                                                    CoordModeOrigin);
+                               }
+                       }
+               }
+               if (primitive[cryst->planegroup] == False) {
+                       if (xy[atom0->num_point].x >= (int) (cryst->a / 2.0))
+                               xtrans = (int) (-cryst->a / 2.0);
+                       else
+                               xtrans = (int) (cryst->a / 2.0);
+                       if (xy[atom0->num_point].y >= (int) (cryst->b / 2.0))
+                               ytrans = (int) (-cryst->b / 2.0);
+                       else
+                               ytrans = (int) (cryst->b / 2.0);
+                       for (k = 0; k <= atom0->num_point; k++) {
+                               xy[k].x = xy[k].x + xtrans;
+                               xy[k].y = xy[k].y + ytrans;
+                       }
+                       for (l = 0; l < cryst->nx; l++) {
+                               for (m = 0; m < cryst->ny; m++) {
+
+                                       for (k = 0; k <= atom0->num_point; k++) {
+                                               xy_1[k].x = xy[k].x + l * cryst->a;
+                                               xy_1[k].y = xy[k].y + m * cryst->b;
+                                       }
+                                       trans_coor_back(xy_1, new_xy, atom0->num_point,
+                                                       cryst->gamma,
+                                                       cryst->offset_w,
+                                                       cryst->offset_h ,
+                                                       cryst->win_height,
+                                                       cryst->invert);
+                                       XFillPolygon(display, window, cryst->gc,
+                                                    new_xy,
+                                                    atom0->num_point, Convex,
+                                                    CoordModeOrigin);
+                               }
+                       }
+                       if (centro[cryst->planegroup] == True) {
+                               XPoint      xy1[5];
+
+                               for (k = 0; k <= atom0->num_point; k++) {
+                                       xy1[k].x = cryst->a - xy[k].x;
+                                       xy1[k].y = cryst->b - xy[k].y;
+                               }
+                               for (l = 0; l < cryst->nx; l++) {
+                                       for (m = 0; m < cryst->ny; m++) {
+
+                                               for (k = 0; k <= atom0->num_point; k++) {
+                                                       xy_1[k].x = xy1[k].x + l * cryst->a;
+                                                       xy_1[k].y = xy1[k].y + m * cryst->b;
+                                               }
+                                               trans_coor_back(xy_1, new_xy, atom0->num_point,
+                                                               cryst->gamma,
+                                                               cryst->offset_w,
+                                                               cryst->offset_h ,
+                                                               cryst->win_height,
+                                                               cryst->invert);
+                                               XFillPolygon(display, window,
+                                                            cryst->gc,
+                                                   new_xy, atom0->num_point,
+                                                   Convex, CoordModeOrigin);
+                                       }
+                               }
+                       }
+               }
+       }
+}
+
+void
+draw_crystal(ModeInfo * mi)
+{
+       Display    *display = MI_DISPLAY(mi);
+       crystalstruct *cryst = &crystals[MI_SCREEN(mi)];
+       int         i;
+
+       if (cryst->no_colors) {
+               release_crystal(mi);
+               init_crystal(mi);
+               return;
+       }
+       cryst->painted = True;
+       MI_IS_DRAWN(mi) = True;
+       XSetFunction(display, cryst->gc, GXxor);
+
+/* Rotate colours */
+       if (cryst->cycle_p) {
+               rotate_colors(display, cryst->cmap, cryst->colors, cryst->ncolors,
+                             cryst->direction);
+               if (!(LRAND() % 1000))
+                       cryst->direction = -cryst->direction;
+       }
+       for (i = 0; i < cryst->num_atom; i++) {
+               crystalatom *atom0;
+
+               atom0 = &cryst->atom[i];
+               if (MI_IS_INSTALL(mi) && MI_NPIXELS(mi) > 2) {
+                       XSetForeground(display, cryst->gc, cryst->colors[atom0->colour].pixel);
+               } else {
+                       XSetForeground(display, cryst->gc, atom0->colour);
+               }
+               crystal_drawatom(mi, atom0);
+               atom0->velocity[0] += NRAND(3) - 1;
+               atom0->velocity[0] = MAX(-20, MIN(20, atom0->velocity[0]));
+               atom0->velocity[1] += NRAND(3) - 1;
+               atom0->velocity[1] = MAX(-20, MIN(20, atom0->velocity[1]));
+               atom0->x0 += atom0->velocity[0];
+               /*if (cryst->gamma == 90.0) { */
+               if (atom0->x0 < 0)
+                       atom0->x0 += cryst->a;
+               else if (atom0->x0 >= cryst->a)
+                       atom0->x0 -= cryst->a;
+               atom0->y0 += atom0->velocity[1];
+               if (atom0->y0 < 0)
+                       atom0->y0 += cryst->b;
+               else if (atom0->y0 >= cryst->b)
+                       atom0->y0 -= cryst->b;
+               /*} */
+               atom0->velocity_a += ((float) NRAND(1001) - 500.0) / 2000.0;
+               atom0->angle += atom0->velocity_a;
+               crystal_setupatom(atom0, cryst->gamma);
+               crystal_drawatom(mi, atom0);
+       }
+       XSetFunction(display, cryst->gc, GXcopy);
+}
+
+void
+refresh_crystal(ModeInfo * mi)
+{
+       Display    *display = MI_DISPLAY(mi);
+       Window      window = MI_WINDOW(mi);
+       crystalstruct *cryst = &crystals[MI_SCREEN(mi)];
+       int         i;
+
+       if (!cryst->painted)
+               return;
+       MI_CLEARWINDOW(mi);
+       XSetFunction(display, cryst->gc, GXxor);
+
+       if (cryst->unit_cell) {
+          int y_coor1 , y_coor2;
+          
+               if (MI_NPIXELS(mi) > 2)
+                       XSetForeground(display, cryst->gc, MI_PIXEL(mi, NRAND(MI_NPIXELS(mi))));
+               else
+                       XSetForeground(display, cryst->gc, MI_WHITE_PIXEL(mi));
+               if (cryst->grid_cell) {
+                       int         inx, iny;
+
+                  if ( cryst->invert )
+                    y_coor1 = y_coor2 = cryst->win_height - cryst->offset_h;
+                  else
+                    y_coor1 = y_coor2 = cryst->offset_h;
+                       XDrawLine(display, window, cryst->gc, cryst->offset_w,
+                                 y_coor1, cryst->offset_w + cryst->nx * cryst->a,
+                                 y_coor2);
+                  if ( cryst->invert )
+                    {
+                       y_coor1 = cryst->win_height - cryst->offset_h;
+                       y_coor2 = cryst->win_height - (int) (cryst->ny *
+                                                            cryst->b *
+                                        cos((cryst->gamma - 90) * PI_RAD)) -
+                         cryst->offset_h;
+                    }
+                  else
+                    {
+                       y_coor1 = cryst->offset_h;
+                       y_coor2 = (int) (cryst->ny * cryst->b *
+                                        cos((cryst->gamma - 90) * PI_RAD)) +
+                         cryst->offset_h;
+                    }
+                       XDrawLine(display, window, cryst->gc, cryst->offset_w,
+                                 y_coor1, (int) (cryst->offset_w - cryst->ny * cryst->b *
+                                         sin((cryst->gamma - 90) * PI_RAD)),
+                                 y_coor2);
+                       inx = cryst->nx;
+                       for (iny = 1; iny <= cryst->ny; iny++) {
+                  if ( cryst->invert )
+                    {
+                       y_coor1 = cryst->win_height -
+                         (int) (iny * cryst->b * cos((cryst->gamma - 90) *
+                                                 PI_RAD)) - cryst->offset_h;
+                       y_coor2 = cryst->win_height -
+                         (int) (iny * cryst->b * cos((cryst->gamma - 90) *
+                                                     PI_RAD)) -
+                         cryst->offset_h;
+                    }
+                  else
+                    {
+                       y_coor1 = (int) (iny * cryst->b * cos((cryst->gamma - 90) *
+                                                 PI_RAD)) + cryst->offset_h;
+                       y_coor2 = (int) (iny * cryst->b * cos((cryst->gamma - 90) * PI_RAD)) +
+                                         cryst->offset_h;
+                    }
+                               XDrawLine(display, window, cryst->gc,
+                                         (int) (cryst->offset_w +
+                                    inx * cryst->a - (int) (iny * cryst->b *
+                                        sin((cryst->gamma - 90) * PI_RAD))),
+                                         y_coor1,
+                                   (int) (cryst->offset_w - iny * cryst->b *
+                                          sin((cryst->gamma - 90) * PI_RAD)),
+                                         y_coor2);
+                       }
+                       iny = cryst->ny;
+                       for (inx = 1; inx <= cryst->nx; inx++) {
+                          if ( cryst->invert )
+                            {
+                               y_coor1 =cryst->win_height -
+                                 (int) (iny * cryst->b *
+                                               cos((cryst->gamma - 90) *
+                                                   PI_RAD)) - cryst->offset_h;
+                               y_coor2 =cryst->win_height - cryst->offset_h;
+                            }
+                          else
+                            {
+                               y_coor1 =(int) (iny * cryst->b *
+                                               cos((cryst->gamma - 90) *
+                                                   PI_RAD)) + cryst->offset_h;
+                               y_coor2 =cryst->offset_h;
+                            }
+                               XDrawLine(display, window, cryst->gc,
+                                         (int) (cryst->offset_w +
+                                    inx * cryst->a - (int) (iny * cryst->b *
+                                        sin((cryst->gamma - 90) * PI_RAD))),
+                                         y_coor1,
+                                         cryst->offset_w + inx * cryst->a,
+                                         y_coor2);
+                       }
+               } else {
+                       int         inx, iny;
+
+                       inx = NRAND(cryst->nx);
+                       iny = NRAND(cryst->ny);
+                  if ( cryst->invert )
+                    {
+                       y_coor1 =cryst->win_height -
+                         (int) (iny * cryst->b *
+                                                 cos((cryst->gamma - 90) *
+                                                     PI_RAD)) -
+                         cryst->offset_h;
+                       y_coor2 =cryst->win_height -
+                         (int) ( ( iny + 1 ) * cryst->b *
+                                                 cos((cryst->gamma - 90) *
+                                                     PI_RAD)) -
+                         cryst->offset_h;
+                    }
+                  else
+                    {
+                       y_coor1 =(int) (iny * cryst->b *
+                                                 cos((cryst->gamma - 90) *
+                                                     PI_RAD)) +
+                         cryst->offset_h;
+                       y_coor2 =(int) (( iny + 1 ) * cryst->b *
+                                                 cos((cryst->gamma - 90) *
+                                                     PI_RAD)) +
+                         cryst->offset_h;
+                    }
+                       XDrawLine(display, window, cryst->gc,
+                                 cryst->offset_w + inx * cryst->a - (int) (iny * cryst->b * sin((cryst->gamma - 90) * PI_RAD)),
+                                 y_coor1,
+                                 cryst->offset_w + (inx + 1) * cryst->a - (int) (iny * cryst->b * sin((cryst->gamma - 90) * PI_RAD)),
+                                 y_coor1);
+                       XDrawLine(display, window, cryst->gc,
+                                 cryst->offset_w + inx * cryst->a - (int) (iny * cryst->b * sin((cryst->gamma - 90) * PI_RAD)),
+                                 y_coor1,
+                                 cryst->offset_w + inx * cryst->a - (int) ((iny + 1) * cryst->b * sin((cryst->gamma - 90) * PI_RAD)),
+                                 y_coor2);
+                       XDrawLine(display, window, cryst->gc,
+                                 cryst->offset_w + (inx + 1) * cryst->a - (int) (iny * cryst->b * sin((cryst->gamma - 90) * PI_RAD)),
+                                 y_coor1,
+                                 cryst->offset_w + (inx + 1) * cryst->a - (int) ((iny + 1) * cryst->b * sin((cryst->gamma - 90) * PI_RAD)),
+                                 y_coor2);
+                       XDrawLine(display, window, cryst->gc,
+                                 cryst->offset_w + inx * cryst->a - (int) ((iny + 1) * cryst->b * sin((cryst->gamma - 90) * PI_RAD)),
+                                 y_coor2,
+                                 cryst->offset_w + (inx + 1) * cryst->a - (int) ((iny + 1) * cryst->b * sin((cryst->gamma - 90) * PI_RAD)),
+                                 y_coor2);
+               }
+       }
+       for (i = 0; i < cryst->num_atom; i++) {
+               crystalatom *atom0;
+
+               atom0 = &cryst->atom[i];
+               if (MI_IS_INSTALL(mi) && MI_NPIXELS(mi) > 2) {
+                       XSetForeground(display, cryst->gc, cryst->colors[atom0->colour].pixel);
+               } else {
+                       XSetForeground(display, cryst->gc, atom0->colour);
+               }
+               crystal_drawatom(mi, atom0);
+       }
+       XSetFunction(display, cryst->gc, GXcopy);
+}
+
+void
+release_crystal(ModeInfo * mi)
+{
+       Display    *display = MI_DISPLAY(mi);
+
+       if (crystals != NULL) {
+               int         screen;
+
+               for (screen = 0; screen < MI_NUM_SCREENS(mi); screen++) {
+                       crystalstruct *cryst = &crystals[screen];
+
+                       if (MI_IS_INSTALL(mi) && MI_NPIXELS(mi) > 2) {
+                               MI_WHITE_PIXEL(mi) = cryst->whitepixel;
+                               MI_BLACK_PIXEL(mi) = cryst->blackpixel;
+#ifndef STANDALONE
+                               MI_FG_PIXEL(mi) = cryst->fg;
+                               MI_BG_PIXEL(mi) = cryst->bg;
+#endif
+                               if (cryst->colors && cryst->ncolors && !cryst->no_colors)
+                                       free_colors(display, cryst->cmap, cryst->colors, cryst->ncolors);
+                               if (cryst->colors)
+                                       (void) free((void *) cryst->colors);
+                               XFreeColormap(display, cryst->cmap);
+                       }
+                       if (cryst->gc != NULL)
+                               XFreeGC(display, cryst->gc);
+                       if (cryst->atom != NULL)
+                               (void) free((void *) cryst->atom);
+               }
+               (void) free((void *) crystals);
+               crystals = NULL;
+       }
+}
+
+void
+init_crystal(ModeInfo * mi)
+{
+       Display    *display = MI_DISPLAY(mi);
+       Window      window = MI_WINDOW(mi);
+       crystalstruct *cryst;
+       int         i, max_atoms, size_atom, neqv;
+       int         cell_min;
+
+#define MIN_CELL 200
+
+/* initialize */
+       if (crystals == NULL) {
+               if ((crystals = (crystalstruct *) calloc(MI_NUM_SCREENS(mi),
+                                           sizeof (crystalstruct))) == NULL)
+                       return;
+       }
+       cryst = &crystals[MI_SCREEN(mi)];
+
+       if (!cryst->gc) {
+               if (MI_IS_INSTALL(mi) && MI_NPIXELS(mi) > 2) {
+                       XColor      color;
+
+#ifndef STANDALONE
+                       extern char *background;
+                       extern char *foreground;
+
+                       cryst->fg = MI_FG_PIXEL(mi);
+                       cryst->bg = MI_BG_PIXEL(mi);
+#endif
+                       cryst->blackpixel = MI_BLACK_PIXEL(mi);
+                       cryst->whitepixel = MI_WHITE_PIXEL(mi);
+                       cryst->cmap = XCreateColormap(display, window,
+                                                  MI_VISUAL(mi), AllocNone);
+                       XSetWindowColormap(display, window, cryst->cmap);
+                       (void) XParseColor(display, cryst->cmap, "black", &color);
+                       (void) XAllocColor(display, cryst->cmap, &color);
+                       MI_BLACK_PIXEL(mi) = color.pixel;
+                       (void) XParseColor(display, cryst->cmap, "white", &color);
+                       (void) XAllocColor(display, cryst->cmap, &color);
+                       MI_WHITE_PIXEL(mi) = color.pixel;
+#ifndef STANDALONE
+                       (void) XParseColor(display, cryst->cmap, background, &color);
+                       (void) XAllocColor(display, cryst->cmap, &color);
+                       MI_BG_PIXEL(mi) = color.pixel;
+                       (void) XParseColor(display, cryst->cmap, foreground, &color);
+                       (void) XAllocColor(display, cryst->cmap, &color);
+                       MI_FG_PIXEL(mi) = color.pixel;
+#endif
+                       cryst->colors = 0;
+                       cryst->ncolors = 0;
+               }
+               if ((cryst->gc = XCreateGC(display, MI_WINDOW(mi),
+                            (unsigned long) 0, (XGCValues *) NULL)) == None)
+                       return;
+       }
+/* Clear Display */
+       MI_CLEARWINDOW(mi);
+       cryst->painted = False;
+       XSetFunction(display, cryst->gc, GXxor);
+
+
+/*Set up crystal data */
+       cryst->direction = (LRAND() & 1) ? 1 : -1;
+       if (MI_IS_FULLRANDOM(mi)) {
+               if (LRAND() & 1)
+                       cryst->unit_cell = True;
+               else
+                       cryst->unit_cell = False;
+       } else
+               cryst->unit_cell = unit_cell;
+       if (cryst->unit_cell) {
+               if (MI_IS_FULLRANDOM(mi)) {
+                       if (LRAND() & 1)
+                               cryst->grid_cell = True;
+                       else
+                               cryst->grid_cell = False;
+               } else
+                       cryst->grid_cell = grid_cell;
+       }
+       cryst->win_width = MI_WIDTH(mi);
+       cryst->win_height = MI_HEIGHT(mi);
+       cell_min = min(cryst->win_width / 2 + 1, MIN_CELL);
+       cell_min = min(cell_min, cryst->win_height / 2 + 1);
+       cryst->planegroup = NRAND(17);
+        cryst->invert = NRAND(2);
+       if (MI_IS_VERBOSE(mi))
+               (void) fprintf(stdout, "Selected plane group no %d\n",
+                              cryst->planegroup + 1);
+       if (cryst->planegroup > 11)
+               cryst->gamma = 120.0;
+       else if (cryst->planegroup < 2)
+               cryst->gamma = 60.0 + NRAND(60);
+       else
+               cryst->gamma = 90.0;
+       neqv = numops[2 * cryst->planegroup] - numops[2 * cryst->planegroup + 1];
+       if (centro[cryst->planegroup] == True)
+               neqv = 2 * neqv;
+       if (primitive[cryst->planegroup] == False)
+               neqv = 2 * neqv;
+
+
+       if (nx > 0)
+               cryst->nx = nx;
+       else if (nx < 0)
+               cryst->nx = NRAND(-nx) + 1;
+       else
+               cryst->nx = DEF_NX1;
+       if (cryst->planegroup > 8)
+               cryst->ny = cryst->nx;
+       else if (ny > 0)
+               cryst->ny = ny;
+       else if (ny < 0)
+               cryst->ny = NRAND(-ny) + 1;
+       else
+               cryst->ny = DEF_NY1;
+       neqv = neqv * cryst->nx * cryst->ny;
+
+       cryst->num_atom = MI_COUNT(mi);
+       max_atoms = MI_COUNT(mi);
+       if (cryst->num_atom == 0) {
+               cryst->num_atom = DEF_NUM_ATOM;
+               max_atoms = DEF_NUM_ATOM;
+       } else if (cryst->num_atom < 0) {
+               max_atoms = -cryst->num_atom;
+               cryst->num_atom = NRAND(-cryst->num_atom) + 1;
+       }
+       if (neqv > 1)
+               cryst->num_atom = cryst->num_atom / neqv + 1;
+
+       if (cryst->atom == NULL)
+               cryst->atom = (crystalatom *) calloc(max_atoms, sizeof (
+                                                              crystalatom));
+
+       if (maxsize) {
+               if (cryst->planegroup < 13) {
+                       cryst->gamma = 90.0;
+                       cryst->offset_w = 0;
+                       cryst->offset_h = 0;
+                       if (cryst->planegroup < 10) {
+                               cryst->b = cryst->win_height;
+                               cryst->a = cryst->win_width;
+                       } else {
+                               cryst->b = min(cryst->win_height, cryst->win_width);
+                               cryst->a = cryst->b;
+                       }
+               } else {
+                       cryst->gamma = 120.0;
+                       cryst->a = (int) (cryst->win_width * 2.0 / 3.0);
+                       cryst->b = cryst->a;
+                       cryst->offset_h = (int) (cryst->b * 0.25 *
+                                         cos((cryst->gamma - 90) * PI_RAD));
+                       cryst->offset_w = (int) (cryst->b * 0.5);
+               }
+       } else {
+               cryst->offset_w = -1;
+               while (cryst->offset_w < 4 || (int) (cryst->offset_w - cryst->b *
+                                   sin((cryst->gamma - 90) * PI_RAD)) < 4) {
+                       cryst->b = NRAND((int) (cryst->win_height / (cos((cryst->gamma - 90) *
+                                           PI_RAD))) - cell_min) + cell_min;
+                       if (cryst->planegroup > 8)
+                               cryst->a = cryst->b;
+                       else
+                               cryst->a = NRAND(cryst->win_width - cell_min) + cell_min;
+                       cryst->offset_w = (int) ((cryst->win_width - (cryst->a - cryst->b *
+                                                   sin((cryst->gamma - 90) *
+                                                       PI_RAD))) / 2.0);
+               }
+               cryst->offset_h = (int) ((cryst->win_height - cryst->b * cos((
+                                       cryst->gamma - 90) * PI_RAD)) / 2.0);
+               if (!centre) {
+                       if (cryst->offset_h > 0)
+                               cryst->offset_h = NRAND(2 * cryst->offset_h);
+                       cryst->offset_w = (int) (cryst->win_width - cryst->a -
+                                                cryst->b *
+                                   fabs(sin((cryst->gamma - 90) * PI_RAD)));
+                       if (cryst->gamma > 90.0) {
+                               if (cryst->offset_w > 0)
+                                       cryst->offset_w = NRAND(cryst->offset_w) +
+                                               (int) (cryst->b * sin((cryst->gamma - 90) * PI_RAD));
+                               else
+                                       cryst->offset_w = (int) (cryst->b * sin((cryst->gamma - 90) *
+                                                                   PI_RAD));
+                       } else if (cryst->offset_w > 0)
+                               cryst->offset_w = NRAND(cryst->offset_w);
+                       else
+                               cryst->offset_w = 0;
+               }
+       }
+
+       size_atom = min((int) ((float) (cryst->a) / 40.) + 1,
+                       (int) ((float) (cryst->b) / 40.) + 1);
+       if (MI_SIZE(mi) < size_atom) {
+               if (MI_SIZE(mi) < -size_atom)
+                       size_atom = -size_atom;
+               else
+                       size_atom = MI_SIZE(mi);
+       }
+       cryst->a = cryst->a / cryst->nx;
+       cryst->b = cryst->b / cryst->ny;
+       if (cryst->unit_cell) {
+          int y_coor1 , y_coor2;
+          
+               if (MI_NPIXELS(mi) > 2)
+                       XSetForeground(display, cryst->gc, MI_PIXEL(mi, NRAND(MI_NPIXELS(mi))));
+               else
+                       XSetForeground(display, cryst->gc, MI_WHITE_PIXEL(mi));
+               if (cryst->grid_cell) {
+                       int         inx, iny;
+
+                  if ( cryst->invert )
+                    y_coor1 = y_coor2 = cryst->win_height - cryst->offset_h;
+                  else
+                    y_coor1 = y_coor2 = cryst->offset_h;
+                       XDrawLine(display, window, cryst->gc, cryst->offset_w,
+                                 y_coor1, cryst->offset_w + cryst->nx * cryst->a,
+                                 y_coor2);
+                  if ( cryst->invert )
+                    {
+                       y_coor1 = cryst->win_height - cryst->offset_h;
+                       y_coor2 = cryst->win_height - (int) (cryst->ny *
+                                                            cryst->b *
+                                        cos((cryst->gamma - 90) * PI_RAD)) -
+                         cryst->offset_h;
+                    }
+                  else
+                    {
+                       y_coor1 = cryst->offset_h;
+                       y_coor2 = (int) (cryst->ny * cryst->b *
+                                        cos((cryst->gamma - 90) * PI_RAD)) +
+                         cryst->offset_h;
+                    }
+                       XDrawLine(display, window, cryst->gc, cryst->offset_w,
+                                 y_coor1, (int) (cryst->offset_w - cryst->ny * cryst->b *
+                                         sin((cryst->gamma - 90) * PI_RAD)),
+                                 y_coor2);
+                       inx = cryst->nx;
+                       for (iny = 1; iny <= cryst->ny; iny++) {
+                  if ( cryst->invert )
+                    {
+                       y_coor1 = cryst->win_height -
+                         (int) (iny * cryst->b * cos((cryst->gamma - 90) *
+                                                 PI_RAD)) - cryst->offset_h;
+                       y_coor2 = cryst->win_height -
+                         (int) (iny * cryst->b * cos((cryst->gamma - 90) *
+                                                     PI_RAD)) -
+                         cryst->offset_h;
+                    }
+                  else
+                    {
+                       y_coor1 = (int) (iny * cryst->b * cos((cryst->gamma - 90) *
+                                                 PI_RAD)) + cryst->offset_h;
+                       y_coor2 = (int) (iny * cryst->b * cos((cryst->gamma - 90) * PI_RAD)) +
+                                         cryst->offset_h;
+                    }
+                               XDrawLine(display, window, cryst->gc,
+                                         (int) (cryst->offset_w +
+                                    inx * cryst->a - (int) (iny * cryst->b *
+                                        sin((cryst->gamma - 90) * PI_RAD))),
+                                         y_coor1,
+                                   (int) (cryst->offset_w - iny * cryst->b *
+                                          sin((cryst->gamma - 90) * PI_RAD)),
+                                         y_coor2);
+                       }
+                       iny = cryst->ny;
+                       for (inx = 1; inx <= cryst->nx; inx++) {
+                          if ( cryst->invert )
+                            {
+                               y_coor1 =cryst->win_height -
+                                 (int) (iny * cryst->b *
+                                               cos((cryst->gamma - 90) *
+                                                   PI_RAD)) - cryst->offset_h;
+                               y_coor2 =cryst->win_height - cryst->offset_h;
+                            }
+                          else
+                            {
+                               y_coor1 =(int) (iny * cryst->b *
+                                               cos((cryst->gamma - 90) *
+                                                   PI_RAD)) + cryst->offset_h;
+                               y_coor2 =cryst->offset_h;
+                            }
+                               XDrawLine(display, window, cryst->gc,
+                                         (int) (cryst->offset_w +
+                                    inx * cryst->a - (int) (iny * cryst->b *
+                                        sin((cryst->gamma - 90) * PI_RAD))),
+                                         y_coor1,
+                                         cryst->offset_w + inx * cryst->a,
+                                         y_coor2);
+                       }
+               } else {
+                       int         inx, iny;
+
+                       inx = NRAND(cryst->nx);
+                       iny = NRAND(cryst->ny);
+                  if ( cryst->invert )
+                    {
+                       y_coor1 =cryst->win_height -
+                         (int) (iny * cryst->b *
+                                                 cos((cryst->gamma - 90) *
+                                                     PI_RAD)) -
+                         cryst->offset_h;
+                       y_coor2 =cryst->win_height -
+                         (int) ( ( iny + 1 ) * cryst->b *
+                                                 cos((cryst->gamma - 90) *
+                                                     PI_RAD)) -
+                         cryst->offset_h;
+                    }
+                  else
+                    {
+                       y_coor1 =(int) (iny * cryst->b *
+                                                 cos((cryst->gamma - 90) *
+                                                     PI_RAD)) +
+                         cryst->offset_h;
+                       y_coor2 =(int) (( iny + 1 ) * cryst->b *
+                                                 cos((cryst->gamma - 90) *
+                                                     PI_RAD)) +
+                         cryst->offset_h;
+                    }
+                       XDrawLine(display, window, cryst->gc,
+                                 cryst->offset_w + inx * cryst->a - (int) (iny * cryst->b * sin((cryst->gamma - 90) * PI_RAD)),
+                                 y_coor1,
+                                 cryst->offset_w + (inx + 1) * cryst->a - (int) (iny * cryst->b * sin((cryst->gamma - 90) * PI_RAD)),
+                                 y_coor1);
+                       XDrawLine(display, window, cryst->gc,
+                                 cryst->offset_w + inx * cryst->a - (int) (iny * cryst->b * sin((cryst->gamma - 90) * PI_RAD)),
+                                 y_coor1,
+                                 cryst->offset_w + inx * cryst->a - (int) ((iny + 1) * cryst->b * sin((cryst->gamma - 90) * PI_RAD)),
+                                 y_coor2);
+                       XDrawLine(display, window, cryst->gc,
+                                 cryst->offset_w + (inx + 1) * cryst->a - (int) (iny * cryst->b * sin((cryst->gamma - 90) * PI_RAD)),
+                                 y_coor1,
+                                 cryst->offset_w + (inx + 1) * cryst->a - (int) ((iny + 1) * cryst->b * sin((cryst->gamma - 90) * PI_RAD)),
+                                 y_coor2);
+                       XDrawLine(display, window, cryst->gc,
+                                 cryst->offset_w + inx * cryst->a - (int) ((iny + 1) * cryst->b * sin((cryst->gamma - 90) * PI_RAD)),
+                                 y_coor2,
+                                 cryst->offset_w + (inx + 1) * cryst->a - (int) ((iny + 1) * cryst->b * sin((cryst->gamma - 90) * PI_RAD)),
+                                 y_coor2);
+               }
+       }
+       if (MI_IS_INSTALL(mi) && MI_NPIXELS(mi) > 2) {
+/* Set up colour map */
+               if (cryst->colors && cryst->ncolors && !cryst->no_colors)
+                       free_colors(display, cryst->cmap, cryst->colors, cryst->ncolors);
+               if (cryst->colors)
+                       (void) free((void *) cryst->colors);
+               cryst->colors = 0;
+               cryst->ncolors = MI_NCOLORS(mi);
+               if (cryst->ncolors < 2)
+                       cryst->ncolors = 2;
+               if (cryst->ncolors <= 2)
+                       cryst->mono_p = True;
+               else
+                       cryst->mono_p = False;
+
+               if (cryst->mono_p)
+                       cryst->colors = 0;
+               else
+                       cryst->colors = (XColor *) malloc(sizeof (*cryst->colors) * (cryst->ncolors + 1));
+               cryst->cycle_p = has_writable_cells(mi->xgwa.screen, MI_VISUAL(mi));
+               if (cryst->cycle_p) {
+                       if (MI_IS_FULLRANDOM(mi)) {
+                               if (!NRAND(8))
+                                       cryst->cycle_p = False;
+                               else
+                                       cryst->cycle_p = True;
+                       } else {
+                               cryst->cycle_p = cycle_p;
+                       }
+               }
+               if (!cryst->mono_p) {
+                       if (!(LRAND() % 10))
+                               make_random_colormap(MI_DISPLAY(mi), MI_VISUAL(mi), cryst->cmap, cryst->colors, &cryst->ncolors,
+                                               True, True, &cryst->cycle_p, True);
+                       else if (!(LRAND() % 2))
+                               make_uniform_colormap(MI_DISPLAY(mi), MI_VISUAL(mi), cryst->cmap, cryst->colors, &cryst->ncolors,
+                                                     True, &cryst->cycle_p, True);
+                       else
+                               make_smooth_colormap(MI_DISPLAY(mi), MI_VISUAL(mi), cryst->cmap, cryst->colors, &cryst->ncolors,
+                                                    True, &cryst->cycle_p, True);
+               }
+               XInstallColormap(display, cryst->cmap);
+               if (cryst->ncolors < 2) {
+                       cryst->ncolors = 2;
+                       cryst->no_colors = True;
+               } else
+                       cryst->no_colors = False;
+               if (cryst->ncolors <= 2)
+                       cryst->mono_p = True;
+
+               if (cryst->mono_p)
+                       cryst->cycle_p = False;
+
+       }
+       for (i = 0; i < cryst->num_atom; i++) {
+               crystalatom *atom0;
+
+               atom0 = &cryst->atom[i];
+               if (MI_IS_INSTALL(mi) && MI_NPIXELS(mi) > 2) {
+                       if (cryst->ncolors > 2)
+                               atom0->colour = NRAND(cryst->ncolors - 2) + 2;
+                       else
+                               atom0->colour = 1;      /* Just in case */
+                       XSetForeground(display, cryst->gc, cryst->colors[atom0->colour].pixel);
+               } else {
+                       if (MI_NPIXELS(mi) > 2)
+                               atom0->colour = MI_PIXEL(mi, NRAND(MI_NPIXELS(mi)));
+                       else
+                               atom0->colour = 1;      /*Xor'red so WHITE may not be appropriate */
+                       XSetForeground(display, cryst->gc, atom0->colour);
+               }
+               atom0->x0 = NRAND(cryst->a);
+               atom0->y0 = NRAND(cryst->b);
+               atom0->velocity[0] = NRAND(7) - 3;
+               atom0->velocity[1] = NRAND(7) - 3;
+               atom0->velocity_a = (NRAND(7) - 3) * PI_RAD;
+               atom0->angle = NRAND(90) * PI_RAD;
+               atom0->at_type = NRAND(3);
+               if (size_atom == 0)
+                       atom0->size_at = DEF_SIZ_ATOM;
+               else if (size_atom > 0)
+                       atom0->size_at = size_atom;
+               else
+                       atom0->size_at = NRAND(-size_atom) + 1;
+               atom0->size_at++;
+               if (atom0->at_type == 2)
+                       atom0->num_point = 3;
+               else
+                       atom0->num_point = 4;
+               crystal_setupatom(atom0, cryst->gamma);
+               crystal_drawatom(mi, atom0);
+       }
+       XSync(display, False);
+       XSetFunction(display, cryst->gc, GXcopy);
+}
diff --git a/hacks/cynosure.c b/hacks/cynosure.c
new file mode 100644 (file)
index 0000000..052a944
--- /dev/null
@@ -0,0 +1,393 @@
+/* cynosure --- draw some rectangles
+ *
+ * 01-aug-96: written in Java by ozymandias G desiderata <ogd@organic.com>
+ * 25-dec-97: ported to C and XScreenSaver by Jamie Zawinski <jwz@jwz.org>
+ *
+ * Original version:
+ *   http://www.organic.com/staff/ogd/java/cynosure.html
+ *   http://www.organic.com/staff/ogd/java/source/cynosure/Cynosure-java.txt
+ *
+ * Original comments and copyright:
+ *
+ *   Cynosure.java
+ *   A Java implementation of Stephen Linhart's Cynosure screen-saver as a
+ *   drop-in class.
+ *
+ *   Header: /home/ogd/lib/cvs/aoaioxxysz/graphics/Cynosure.java,v 1.2 1996/08/02 02:41:21 ogd Exp 
+ *
+ *   ozymandias G desiderata <ogd@organic.com>
+ *   Thu Aug  1 1996
+ *
+ *   COPYRIGHT NOTICE
+ *
+ *   Copyright 1996 ozymandias G desiderata. Title, ownership rights, and
+ *   intellectual property rights in and to this software remain with
+ *   ozymandias G desiderata. This software may be copied, modified,
+ *   or used as long as this copyright is retained. Use this code at your
+ *   own risk.
+ *
+ *   Revision: 1.2 
+ *
+ *   Log: Cynosure.java,v 
+ *   Revision 1.2  1996/08/02 02:41:21  ogd
+ *   Added a few more comments, fixed messed-up header.
+ *
+ *   Revision 1.1.1.1  1996/08/02 02:30:45  ogd
+ *   First version
+ */
+
+#include "screenhack.h"
+static Display *dpy;
+static Window window;
+static XColor *colors;
+static int ncolors;
+static int fg_pixel, bg_pixel;
+static GC fg_gc, bg_gc, shadow_gc;
+
+static void paint(void);
+static int genNewColor(void);
+static int genConstrainedColor(int base, int tweak);
+static int c_tweak(int base, int tweak);
+
+/**
+ * The current color that is being tweaked to create the
+ * rectangles.
+ **/
+static int curColor;
+
+/**
+ * A variable used for the progression of the colors (yes, I know
+ * that's a lame explanation, but if your read the source, it should
+ * become obvious what I'm doing with this variable).
+ **/
+static int curBase;
+
+/**
+ * The width of the right and bottom edges of the rectangles.
+ **/
+static int   shadowWidth;
+
+/* The offset of the dropshadow beneath the rectangles. */
+static int   elevation;
+
+/**
+ * The approximate amount of time that will elapse before the base
+ * color is permanently changed.
+ *
+ * @see #tweak
+ **/
+static int   sway;
+
+/**
+ * The counter of time left until the base color value used. This class
+ * variable is necessary because Java doesn't support static method
+ * variables (grr grr).
+ **/
+static int   timeLeft;
+
+/**
+ * The amount by which the color of the polygons drawn will vary.
+ *
+ * @see #sway;
+ **/
+static int   tweak;
+
+/**
+ * The smallest size for an individual cell.
+ **/
+#define MINCELLSIZE 16
+
+/**
+ * The narrowest a rectangle can be.
+ **/
+#define MINRECTSIZE 6
+
+/**
+ * The size of the grid that the rectangles are placed within.
+ **/
+static int gridSize;
+
+/**
+ * Every so often genNewColor() generates a completely random
+ * color. This variable sets how frequently that happens. It's
+ * currently set to happen 1% of the time.
+ *
+ * @see #genNewColor
+ **/
+#define THRESHOLD 100 /*0.01*/
+
+
+char *progclass = "Cynosure";
+char *defaults [] = {
+  ".background:                black",
+  ".foreground:                white",
+  "*delay:             500000",
+  "*colors:            128",
+  "*iterations:                100",
+  "*shadowWidth:       2",
+  "*elevation:         5",
+  "*sway:              30",
+  "*tweak:             20",
+  "*gridSize:          12",
+  0
+};
+
+XrmOptionDescRec options [] = {
+  { "-delay",          ".delay",       XrmoptionSepArg, 0 },
+  { "-ncolors",                ".colors",      XrmoptionSepArg, 0 },
+  { "-iterations",     ".iterations",  XrmoptionSepArg, 0 },
+  { 0, 0, 0, 0 }
+};
+
+
+void screenhack(Display *d, Window w) 
+{
+  XWindowAttributes xgwa;
+  XGCValues gcv;
+  int delay;
+  int i, iterations;
+
+  dpy = d;
+  window = w;
+
+  curColor    = 0;
+  curBase     = curColor;
+  shadowWidth = get_integer_resource ("shadowWidth", "Integer");
+  elevation   = get_integer_resource ("elevation", "Integer");
+  sway        = get_integer_resource ("sway", "Integer");
+  tweak       = get_integer_resource ("tweak", "Integer");
+  gridSize    = get_integer_resource ("gridSize", "Integer");
+  timeLeft    = 0;
+
+  XGetWindowAttributes (dpy, window, &xgwa);
+
+  ncolors = get_integer_resource ("colors", "Colors");
+  if (ncolors < 2) ncolors = 2;
+  if (ncolors <= 2) mono_p = True;
+
+  if (mono_p)
+    colors = 0;
+  else
+    colors = (XColor *) malloc(sizeof(*colors) * (ncolors+1));
+
+  if (mono_p)
+    ;
+  else {
+    make_smooth_colormap (dpy, xgwa.visual, xgwa.colormap, colors, &ncolors,
+                         True, 0, True);
+    if (ncolors <= 2) {
+      mono_p = True;
+      ncolors = 2;
+      if (colors) free(colors);
+      colors = 0;
+    }
+  }
+
+  bg_pixel = get_pixel_resource("background", "Background", dpy,
+                               xgwa.colormap);
+  fg_pixel = get_pixel_resource("foreground", "Foreground", dpy,
+                               xgwa.colormap);
+
+  gcv.foreground = fg_pixel;
+  fg_gc = XCreateGC(dpy, window, GCForeground, &gcv);
+  gcv.foreground = bg_pixel;
+  bg_gc = XCreateGC(dpy, window, GCForeground, &gcv);
+
+  gcv.fill_style = FillStippled;
+  gcv.stipple = XCreateBitmapFromData(dpy, window, "\125\252", 8, 2);
+  shadow_gc = XCreateGC(dpy, window, GCForeground|GCFillStyle|GCStipple, &gcv);
+  XFreePixmap(dpy, gcv.stipple);
+
+  delay = get_integer_resource ("delay", "Delay");
+  iterations = get_integer_resource ("iterations", "Iterations");
+
+  i = 0;
+  while (1)
+    {
+      if (iterations > 0 && ++i >= iterations)
+       {
+         i = 0;
+         if (!mono_p)
+           XSetWindowBackground(dpy, window,
+                                colors[random() % ncolors].pixel);
+         XClearWindow(dpy, window);
+       }
+      paint();
+      XSync(dpy, False);
+      screenhack_handle_events (dpy);
+      if (delay)
+       usleep(delay);
+    }
+}
+
+/**
+ * paint adds a new layer of multicolored rectangles within a grid of
+ * randomly generated size. Each row of rectangles is the same color,
+ * but colors vary slightly from row to row. Each rectangle is placed
+ * within a regularly-sized cell, but each rectangle is sized and
+ * placed randomly within that cell.
+ *
+ * @param g      the Graphics coordinate in which to draw
+ * @see #genNewColor
+ **/
+static void paint(void)
+{
+    int i;
+    int cellsWide, cellsHigh, cellWidth, cellHeight;
+    static int width, height;
+    static int size_check = 1;
+
+    if (--size_check <= 0)
+      {
+       XWindowAttributes xgwa;
+       XGetWindowAttributes (dpy, window, &xgwa);
+       width = xgwa.width;
+       height = xgwa.height;
+       size_check = 1000;
+      }
+
+    /* How many cells wide the grid is (equal to gridSize +/- (gridSize / 2))
+     */
+    cellsWide  = c_tweak(gridSize, gridSize / 2);
+    /* How many cells high the grid is (equal to gridSize +/- (gridSize / 2))
+     */
+    cellsHigh  = c_tweak(gridSize, gridSize / 2);
+    /* How wide each cell in the grid is */
+    cellWidth  = width  / cellsWide;
+    /* How tall each cell in the grid is */
+    cellHeight = height / cellsHigh;
+
+    /* Ensure that each cell is above a certain minimum size */
+
+    if (cellWidth < MINCELLSIZE) {
+      cellWidth  = MINCELLSIZE;
+      cellsWide  = width / cellWidth;
+    }
+
+    if (cellHeight < MINCELLSIZE) {
+      cellHeight = MINCELLSIZE;
+      cellsHigh  = width / cellWidth;
+    }
+
+    /* fill the grid with randomly-generated cells */
+    for(i = 0; i < cellsHigh; i++) {
+      int j;
+
+      /* Each row is a different color, randomly generated (but constrained) */
+      if (!mono_p)
+       {
+         int c = genNewColor();
+         XSetForeground(dpy, fg_gc, colors[c].pixel);
+       }
+
+      for(j = 0; j < cellsWide; j++) {
+       int curWidth, curHeight, curX, curY;
+
+        /* Generate a random height for a rectangle and make sure that */
+        /* it's above a certain minimum size */
+        curHeight = random() % (cellHeight - shadowWidth);
+        if (curHeight < MINRECTSIZE)
+          curHeight = MINRECTSIZE;
+        /* Generate a random width for a rectangle and make sure that
+           it's above a certain minimum size */
+        curWidth  = random() % (cellWidth  - shadowWidth);
+        if (curWidth < MINRECTSIZE)
+          curWidth = MINRECTSIZE;
+        /* Figure out a random place to locate the rectangle within the
+           cell */
+        curY      = (i * cellHeight) + (random() % ((cellHeight - curHeight) -
+                                                   shadowWidth));
+        curX      = (j * cellWidth) +  (random() % ((cellWidth  - curWidth) -
+                                                   shadowWidth));
+
+        /* Draw the shadow */
+       if (elevation > 0)
+         XFillRectangle(dpy, window, shadow_gc,
+                        curX + elevation, curY + elevation,
+                        curWidth, curHeight);
+
+        /* Draw the edge */
+       if (shadowWidth > 0)
+         XFillRectangle(dpy, window, bg_gc,
+                        curX + shadowWidth, curY + shadowWidth,
+                        curWidth, curHeight);
+
+       XFillRectangle(dpy, window, fg_gc, curX, curY, curWidth, curHeight);
+
+        /* Draw a 1-pixel black border around the rectangle */
+       XDrawRectangle(dpy, window, bg_gc, curX, curY, curWidth, curHeight);
+      }
+
+    }
+}
+
+
+/**
+ * genNewColor returns a new color, gradually mutating the colors and
+ * occasionally returning a totally random color, just for variety.
+ *
+ * @return the new color
+ **/
+static int genNewColor(void)
+{
+    /* These lines handle "sway", or the gradual random changing of */
+    /* colors. After genNewColor() has been called a given number of */
+    /* times (specified by a random permutation of the tweak variable), */
+    /* take whatever color has been most recently randomly generated and */
+    /* make it the new base color. */
+    if (timeLeft == 0) {
+      timeLeft = c_tweak(sway, sway / 3);
+      curColor = curBase;
+    } else {
+      timeLeft--;
+    }
+     
+    /* If a randomly generated number is less than the threshold value,
+       produce a "sport" color value that is completely unrelated to the 
+       current palette. */
+    if (0 == (random() % THRESHOLD)) {
+      return (random() % ncolors);
+    } else {
+      curBase = genConstrainedColor(curColor, tweak);
+      return curBase;
+    }
+
+}
+
+/**
+ * genConstrainedColor creates a random new color within a certain
+ * range of an existing color. Right now this works with RGB color
+ * values, but a future version of the program will most likely use HSV
+ * colors, which should generate a more pleasing progression of values.
+ *
+ * @param base  the color on which the new color will be based
+ * @param tweak the amount that the new color can be tweaked
+ * @return a new constrained color
+ * @see #genNewColor
+ **/
+static int genConstrainedColor(int base, int tweak) 
+{
+    int i = 1 + (random() % tweak);
+    if (random() & 1)
+      i = -i;
+    i = (base + i) % ncolors;
+    while (i < 0)
+      i += ncolors;
+    return i;
+}
+
+/**
+ * Utility function to generate a tweaked color value
+ *
+ * @param  base   the byte value on which the color is based
+ * @param  tweak  the amount the value will be skewed
+ * @see    #tweak
+ * @return the tweaked byte
+ **/
+static int c_tweak(int base, int tweak) 
+{
+    int ranTweak = (random() % (2 * tweak));
+    int n = (base + (ranTweak - tweak));
+    if (n < 0) n = -n;
+    return (n < 255 ? n : 255);
+}
diff --git a/hacks/decayscreen.c b/hacks/decayscreen.c
new file mode 100644 (file)
index 0000000..64a846c
--- /dev/null
@@ -0,0 +1,255 @@
+/* xscreensaver, Copyright (c) 1992, 1993, 1994, 1996, 1997 
+ * Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software 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.  No representations are made about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or 
+ * implied warranty.
+ */
+
+/* decayscreen
+ *
+ * Based on slidescreen program from the xscreensaver application and the
+ * decay program for Sun framebuffers.  This is the comment from the decay.c
+ * file:
+
+ * decay.c
+ *   find the screen bitmap for the console and make it "decay" by
+ *   randomly shifting random rectangles by one pixelwidth at a time.
+ *
+ *   by David Wald, 1988
+ *        rewritten by Natuerlich!
+ *   based on a similar "utility" on the Apollo ring at Yale.
+
+ * X version by
+ *
+ *  Vivek Khera <khera@cs.duke.edu>
+ *  5-AUG-1993
+ *
+ *  Hacked by jwz, 28-Nov-97 (sped up and added new motion directions)
+ *  R. Schultz
+ *  Added "melt" & "stretch" modes 28-Mar-1999
+ *
+ */
+
+#include "screenhack.h"
+
+static int sizex, sizey;
+static int delay;
+static GC gc;
+static int mode;
+static int iterations=100;
+
+#define SHUFFLE 0
+#define UP 1
+#define LEFT 2
+#define RIGHT 3
+#define DOWN 4
+#define UPLEFT 5
+#define DOWNLEFT 6
+#define UPRIGHT 7
+#define DOWNRIGHT 8
+#define IN 9
+#define OUT 10
+#define MELT 11
+#define STRETCH 12
+
+static void
+init_decay (Display *dpy, Window window)
+{
+  XGCValues gcv;
+  XWindowAttributes xgwa;
+  long gcflags;
+  unsigned long bg;
+
+  char *s = get_string_resource("mode", "Mode");
+  if      (s && !strcmp(s, "shuffle")) mode = SHUFFLE;
+  else if (s && !strcmp(s, "up")) mode = UP;
+  else if (s && !strcmp(s, "left")) mode = LEFT;
+  else if (s && !strcmp(s, "right")) mode = RIGHT;
+  else if (s && !strcmp(s, "down")) mode = DOWN;
+  else if (s && !strcmp(s, "upleft")) mode = UPLEFT;
+  else if (s && !strcmp(s, "downleft")) mode = DOWNLEFT;
+  else if (s && !strcmp(s, "upright")) mode = UPRIGHT;
+  else if (s && !strcmp(s, "downright")) mode = DOWNRIGHT;
+  else if (s && !strcmp(s, "in")) mode = IN;
+  else if (s && !strcmp(s, "out")) mode = OUT;
+  else if (s && !strcmp(s, "melt")) mode = MELT;
+  else if (s && !strcmp(s, "stretch")) mode = STRETCH;
+  else {
+    if (s && *s && !!strcmp(s, "random"))
+      fprintf(stderr, "%s: unknown mode %s\n", progname, s);
+    mode = random() % (STRETCH+1);
+  }
+
+  delay = get_integer_resource ("delay", "Integer");
+
+  if (delay < 0) delay = 0;
+
+  XGetWindowAttributes (dpy, window, &xgwa);
+
+  gcv.function = GXcopy;
+  gcv.subwindow_mode = IncludeInferiors;
+
+  if (mode == MELT || mode == STRETCH) {
+    bg = get_pixel_resource ("background", "Background", dpy, xgwa.colormap);
+    gcv.foreground = bg;
+  }
+
+  gcflags = GCForeground |GCFunction;
+  if (use_subwindow_mode_p(xgwa.screen, window)) /* see grabscreen.c */
+    gcflags |= GCSubwindowMode;
+  gc = XCreateGC (dpy, window, gcflags, &gcv);
+
+  sizex = xgwa.width;
+  sizey = xgwa.height;
+
+  grab_screen_image (xgwa.screen, window);
+  
+  if (mode == MELT || mode == STRETCH) {
+    /* make sure screen eventually turns background color */
+    XDrawLine(dpy, window, gc, 0, 0, sizex, 0); 
+
+    /* slow down for smoother melting*/
+    iterations = 1;
+  }
+
+}
+
+
+/*
+ * perform one iteration of decay
+ */
+static void
+decay1 (Display *dpy, Window window)
+{
+    int left, top, width, height, toleft, totop;
+
+#define L 101
+#define R 102
+#define U 103
+#define D 104
+    static int no_bias[]        = { L,L,L,L, R,R,R,R, U,U,U,U, D,D,D,D };
+    static int up_bias[]        = { L,L,L,L, R,R,R,R, U,U,U,U, U,U,D,D };
+    static int down_bias[]      = { L,L,L,L, R,R,R,R, U,U,D,D, D,D,D,D };
+    static int left_bias[]      = { L,L,L,L, L,L,R,R, U,U,U,U, D,D,D,D };
+    static int right_bias[]     = { L,L,R,R, R,R,R,R, U,U,U,U, D,D,D,D };
+
+    static int upleft_bias[]    = { L,L,L,L, L,R,R,R, U,U,U,U, U,D,D,D };
+    static int downleft_bias[]  = { L,L,L,L, L,R,R,R, U,U,U,D, D,D,D,D };
+    static int upright_bias[]   = { L,L,L,R, R,R,R,R, U,U,U,U, U,D,D,D };
+    static int downright_bias[] = { L,L,L,R, R,R,R,R, U,U,U,D, D,D,D,D };
+    static int *bias;
+
+    switch (mode) {
+      case SHUFFLE:    bias = no_bias; break;
+      case UP:         bias = up_bias; break;
+      case LEFT:       bias = left_bias; break;
+      case RIGHT:      bias = right_bias; break;
+      case DOWN:       bias = down_bias; break;
+      case UPLEFT:     bias = upleft_bias; break;
+      case DOWNLEFT:   bias = downleft_bias; break;
+      case UPRIGHT:    bias = upright_bias; break;
+      case DOWNRIGHT:  bias = downright_bias; break;
+      case IN:         bias = no_bias; break;
+      case OUT:                bias = no_bias; break;
+      case MELT:       bias = no_bias; break;
+      case STRETCH:    bias = no_bias; break;
+     default: abort();
+    }
+
+#define nrnd(x) (random() % (x))
+
+    if (mode == MELT || mode == STRETCH) {
+      left = nrnd(sizex/2);
+      top = nrnd(sizey);
+      width = nrnd( sizex/2 ) + sizex/2 - left;
+      height = nrnd(sizey - top);
+      toleft = left;
+      totop = top+1;
+
+    } else {
+
+      left = nrnd(sizex - 1);
+      top = nrnd(sizey);
+      width = nrnd(sizex - left);
+      height = nrnd(sizey - top);
+      
+      toleft = left;
+      totop = top;
+      if (mode == IN || mode == OUT) {
+       int x = left+(width/2);
+       int y = top+(height/2);
+       int cx = sizex/2;
+       int cy = sizey/2;
+       if (mode == IN) {
+         if      (x > cx && y > cy)   bias = upleft_bias;
+         else if (x < cx && y > cy)   bias = upright_bias;
+         else if (x < cx && y < cy)   bias = downright_bias;
+         else /* (x > cx && y < cy)*/ bias = downleft_bias;
+       } else {
+         if      (x > cx && y > cy)   bias = downright_bias;
+         else if (x < cx && y > cy)   bias = downleft_bias;
+         else if (x < cx && y < cy)   bias = upleft_bias;
+         else /* (x > cx && y < cy)*/ bias = upright_bias;
+       }
+      }
+      
+      switch (bias[random() % (sizeof(no_bias)/sizeof(*no_bias))]) {
+      case L: toleft = left-1; break;
+      case R: toleft = left+1; break;
+      case U: totop = top-1; break;
+      case D: totop = top+1; break;
+      default: abort(); break;
+      }
+    }
+    
+    if (mode == STRETCH) {
+      XCopyArea (dpy, window, window, gc, 0, sizey-top-2, sizex, top+1, 
+                0, sizey-top-1); 
+    } else {
+      XCopyArea (dpy, window, window, gc, left, top, width, height,
+                toleft, totop);
+    }
+
+#undef nrnd
+}
+
+\f
+char *progclass = "DecayScreen";
+
+char *defaults [] = {
+  "*dontClearRoot:             True",
+
+#ifdef __sgi   /* really, HAVE_READ_DISPLAY_EXTENSION */
+  "*visualID:                  Best",
+#endif
+
+  "*delay:                     10000",
+  "*mode:                      random",
+  0
+};
+
+XrmOptionDescRec options [] = {
+  { "-delay",          ".delay",               XrmoptionSepArg, 0 },
+  { "-mode",           ".mode",                XrmoptionSepArg, 0 },
+  { 0, 0, 0, 0 }
+};
+
+void
+screenhack (Display *dpy, Window window)
+{
+    init_decay (dpy, window);
+    while (1) {
+      int i;
+      for (i = 0; i < iterations; i++)
+       decay1 (dpy, window);
+      XSync(dpy, False);
+      screenhack_handle_events (dpy);
+      if (delay) usleep (delay);
+    }
+}
diff --git a/hacks/decayscreen.man b/hacks/decayscreen.man
new file mode 100644 (file)
index 0000000..8dc0a0e
--- /dev/null
@@ -0,0 +1,88 @@
+.TH XScreenSaver 1 "05-Apr-1999" "X Version 11"
+.SH NAME
+decayscreen - make a screen meltdown.
+.SH SYNOPSIS
+.B decayscreen
+[\-display \fIhost:display.screen\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-delay \fIusecs\fP] [\-mode \fImode\fP]
+.SH DESCRIPTION
+The \fIdecayscreen\fP program creates a melting effect by randomly
+shifting rectangles around the screen.
+.SH OPTIONS
+.I decayscreen
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window.  This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-mono 
+If on a color display, pretend we're on a monochrome display.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use.  Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-delay \fImicroseconds\fP
+Slow it down.
+.TP 8
+.B \-mode \fImode\fP
+The direction in which the image should tend to slide.  Legal values are
+\fIrandom\fP (meaning pick one), \fIup\fP, \fIleft\fP, \fIright\fP, 
+\fIdown\fP, \fIupleft\fP, \fIdownleft\fP, \fIupright\fP, \fIdownright\fP, 
+\fIshuffle\fP (meaning perfer no particular direction), \fIin\fP (meaning
+move things toward the center), \fIout\fP (meaning move things away
+from the center), \fImelt\fP (meaning melt straight downward), and \fIstretch\fP 
+(meaning stretch the screen downward).
+.SH RESOURCES
+On some systems (currently, only SGIs), this program can, instead of grabbing
+a desktop image, grab a frame of video from an external camera and manipulate
+that instead.  The following resources control that.
+.PP
+.TP 8
+.B grabVideoProbability \fR(Float)\fP
+What portion of the time to grab video rather than a screen image, 
+between 0.0 and 1.0.  Defaults to 0.5, or half the time.
+.TP 8
+.B videoDevice \fR(Integer)\fP
+The number of the default video input device to check first.  If unspecified, 
+the default camera (from videopanel(1)) will be checked first.  After that, all
+other available video input devices will be checked in order.  
+
+The first one which produces a non-black image will be used.  If all images
+are black, the others will be re-checked a few times before giving up and
+falling back to simply grabbing a desktop image (but note that this takes a
+few seconds, so if you don't actually have any video sources hooked up, you
+should consider turning off video grabbing by setting
+\fBgrabVideoProbability\fP to 0.0.)
+.TP 8
+.B videoGain \fR(Float)\fP
+The amount by which to brighten the grabbed image.  This defaults to 2.2.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH "SEE ALSO"
+X(1),
+xscreensaver(1)
+.SH COPYRIGHT
+Copyright 1992 by Vivek Khera.  Permission to use, copy, modify, distribute, 
+and sell this software 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.  No representations are made about the suitability
+of this software for any purpose.  It is provided "as is" without express or
+implied warranty.
+.SH AUTHOR
+Vivek Khera <khera@cs.duke.edu>, 05-Aug-93; based on code by David Wald, 1988.
+Modified by jwz, 28-Nov-97.  Modified by Rick Schultz <rick@skapunx.net> 05-Apr-1999.
+
diff --git a/hacks/deco.c b/hacks/deco.c
new file mode 100644 (file)
index 0000000..ae90805
--- /dev/null
@@ -0,0 +1,155 @@
+/* xscreensaver, Copyright (c) 1997, 1998 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software 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.  No representations are made about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or 
+ * implied warranty.
+ *
+ * Concept snarfed from Michael D. Bayne in
+ * http://www.go2net.com/internet/deep/1997/04/16/body.html
+ */
+
+#include "screenhack.h"
+#include <stdio.h>
+
+static XColor colors[255];
+static int ncolors = 0;
+static int max_depth = 0;
+static int min_height = 0;
+static int min_width = 0;
+
+static void
+deco (Display *dpy,
+      Window window,
+      Colormap cmap,
+      GC fgc, GC bgc,
+      int x, int y, int w, int h, int depth)
+{
+  if (((random() % max_depth) < depth) || (w < min_width) || (h < min_height))
+    {
+      if (!mono_p)
+       {
+         static int current_color = 0;
+         if (++current_color >= ncolors)
+           current_color = 0;
+         XSetForeground(dpy, bgc, colors[current_color].pixel);
+       }
+      XFillRectangle (dpy, window, bgc, x, y, w, h);
+      XDrawRectangle (dpy, window, fgc, x, y, w, h);
+    }
+  else
+    {
+      if (random() & 1)
+       {
+         deco (dpy, window, cmap, fgc, bgc, x, y, w/2, h, depth+1);
+         deco (dpy, window, cmap, fgc, bgc, x+w/2, y, w/2, h, depth+1);
+       }
+      else
+       {
+         deco (dpy, window, cmap, fgc, bgc, x, y, w, h/2, depth+1);
+         deco (dpy, window, cmap, fgc, bgc, x, y+h/2, w, h/2, depth+1);
+       }
+    }
+}
+
+\f
+char *progclass = "Deco";
+
+char *defaults [] = {
+  ".background:                black",
+  ".foreground:                white",
+  "*maxDepth:          12",
+  "*minWidth:          20",
+  "*minHeight:         20",
+  "*cycle:             False",
+  "*delay:             5",
+  "*cycleDelay:                1000000",
+  "*ncolors:           64",
+  0
+};
+
+XrmOptionDescRec options [] = {
+  { "-max-depth",      ".maxDepth",    XrmoptionSepArg, 0 },
+  { "-min-width",      ".minWidth",    XrmoptionSepArg, 0 },
+  { "-min-height",     ".minHeight",   XrmoptionSepArg, 0 },
+  { "-delay",          ".delay",       XrmoptionSepArg, 0 },
+  { "-ncolors",                ".ncolors",     XrmoptionSepArg, 0 },
+  { "-cycle",          ".cycle",       XrmoptionNoArg, "True" },
+  { "-no-cycle",       ".cycle",       XrmoptionNoArg, "False" },
+  { "-cycle-delay",    ".cycleDelay",  XrmoptionSepArg, 0 },
+  { 0, 0, 0, 0 }
+};
+
+void
+screenhack (Display *dpy, Window window)
+{
+  GC fgc, bgc;
+  XGCValues gcv;
+  XWindowAttributes xgwa;
+  int delay = get_integer_resource ("delay", "Integer");
+  int cycle_delay = get_integer_resource ("cycleDelay", "Integer");
+  Bool writable = get_boolean_resource ("cycle", "Boolean");
+
+  max_depth = get_integer_resource ("maxDepth", "Integer");
+  if (max_depth < 1) max_depth = 1;
+  else if (max_depth > 1000) max_depth = 1000;
+
+  min_width = get_integer_resource ("minWidth", "Integer");
+  if (min_width < 2) min_width = 2;
+  min_height = get_integer_resource ("minHeight", "Integer");
+  if (min_height < 2) min_height = 2;
+
+  XGetWindowAttributes (dpy, window, &xgwa);
+
+  gcv.foreground = get_pixel_resource("foreground", "Foreground",
+                                     dpy, xgwa.colormap);
+  fgc = XCreateGC (dpy, window, GCForeground, &gcv);
+
+  gcv.foreground = get_pixel_resource("background", "Background",
+                                     dpy, xgwa.colormap);
+  bgc = XCreateGC (dpy, window, GCForeground, &gcv);
+
+  ncolors = get_integer_resource ("ncolors", "Integer");
+
+  make_random_colormap (dpy, xgwa.visual, xgwa.colormap, colors, &ncolors,
+                       False, True, &writable, True);
+
+  if (ncolors <= 2)
+    mono_p = True;
+
+  if (!mono_p)
+    {
+      GC tmp = fgc;
+      fgc = bgc;
+      bgc = tmp;
+    }
+
+  while (1)
+    {
+      XGetWindowAttributes (dpy, window, &xgwa);
+      XFillRectangle(dpy, window, bgc, 0, 0, xgwa.width, xgwa.height);
+      deco (dpy, window, xgwa.colormap, fgc, bgc,
+           0, 0, xgwa.width, xgwa.height, 0);
+      XSync (dpy, False);
+      screenhack_handle_events (dpy);
+
+      if (!delay) continue;
+      if (!writable)
+       sleep (delay);
+      else
+       {
+         time_t start = time((time_t) 0);
+         while (start - delay < time((time_t) 0))
+           {
+             rotate_colors (dpy, xgwa.colormap, colors, ncolors, 1);
+              XSync (dpy, False);
+              screenhack_handle_events (dpy);
+             if (cycle_delay)
+               usleep (cycle_delay);
+           }
+       }
+    }
+}
diff --git a/hacks/deco.man b/hacks/deco.man
new file mode 100644 (file)
index 0000000..5f8a6fc
--- /dev/null
@@ -0,0 +1,72 @@
+.TH XScreenSaver 1 "27-Apr-97" "X Version 11"
+.SH NAME
+deco - draw tacky 70s basement wall panelling
+.SH SYNOPSIS
+.B deco
+[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-delay \fIseconds\fP] [\-max\-depth \fIint\fP] [\-min\-width \fIint\fP] [\-min\-height \fIint\fP] [\-cycle] [\-no\-cycle] [\-cycle\-delay]
+.SH DESCRIPTION
+The \fIdeco\fP program subdivides and colors rectangles randomly.
+It looks kind of like Brady-Bunch-era rec-room wall paneling.
+(Raven says: "this screensaver is ugly enough to peel paint.")
+.SH OPTIONS
+.I deco
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window.  This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-mono 
+If on a color display, pretend we're on a monochrome display.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use.  Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-delay \fIseconds\fP
+How long to wait before starting over.  Default 5 seconds.
+.TP 8
+.B \-max\-depth \fIinteger\fP
+How deep to subdivide.  Default 12.
+Default 8.
+.TP 8
+.B \-min-width \fIinteger\fP
+.B \-min-height \fIinteger\fP
+The size of the smallest rectangle to draw.  Default 20x20.
+.TP 8
+.B \-cycle
+.TP 8
+.B \-no\-cycle
+Whether to do color cycling.  Default False.
+.TP 8
+.B \-cycle\-delay \fIusecs\fP
+If color cycling, how often to change the colors.  Default 1000000,
+or 1 second.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 1997 by Jamie Zawinski.  Permission to use, copy, modify, 
+distribute, and sell this software 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.  No representations are made about the 
+suitability of this software for any purpose.  It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Jamie Zawinski <jwz@jwz.org>, 26-Apr-97, based on code by
+Michael D. Bayne <mdb@go2net.com>.
diff --git a/hacks/deluxe.c b/hacks/deluxe.c
new file mode 100644 (file)
index 0000000..458d94a
--- /dev/null
@@ -0,0 +1,359 @@
+/* xscreensaver, Copyright (c) 1999 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software 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.  No representations are made about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or 
+ * implied warranty.
+ */
+
+#include <math.h>
+#include "screenhack.h"
+#include "alpha.h"
+
+#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+# include "xdbe.h"
+#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
+
+#define countof(x) (sizeof(x)/sizeof(*(x)))
+#define ABS(x) ((x)<0?-(x):(x))
+
+static Bool transparent_p;
+static int nplanes;
+static unsigned long base_pixel, *plane_masks;
+
+struct throbber {
+  int x, y;
+  int size;
+  int max_size;
+  int thickness;
+  int speed;
+  int fuse;
+  GC gc;
+  void (*draw) (Display *, Drawable, struct throbber *);
+};
+
+static void
+draw_star (Display *dpy, Drawable w, struct throbber *t)
+{
+  XPoint points[11];
+  int x = t->x;
+  int y = t->y;
+  int s = t->size / 0.383;  /* trial and error, I forget how to derive this */
+  int s2 = t->size;
+  double c = M_PI * 2;
+  double o = -M_PI / 2;
+
+  points[0].x = x + s  * cos(o + 0.0*c); points[0].y = y + s  * sin(o + 0.0*c);
+  points[1].x = x + s2 * cos(o + 0.1*c); points[1].y = y + s2 * sin(o + 0.1*c);
+  points[2].x = x + s  * cos(o + 0.2*c); points[2].y = y + s  * sin(o + 0.2*c);
+  points[3].x = x + s2 * cos(o + 0.3*c); points[3].y = y + s2 * sin(o + 0.3*c);
+  points[4].x = x + s  * cos(o + 0.4*c); points[4].y = y + s  * sin(o + 0.4*c);
+  points[5].x = x + s2 * cos(o + 0.5*c); points[5].y = y + s2 * sin(o + 0.5*c);
+  points[6].x = x + s  * cos(o + 0.6*c); points[6].y = y + s  * sin(o + 0.6*c);
+  points[7].x = x + s2 * cos(o + 0.7*c); points[7].y = y + s2 * sin(o + 0.7*c);
+  points[8].x = x + s  * cos(o + 0.8*c); points[8].y = y + s  * sin(o + 0.8*c);
+  points[9].x = x + s2 * cos(o + 0.9*c); points[9].y = y + s2 * sin(o + 0.9*c);
+  points[10] = points[0];
+
+  XDrawLines (dpy, w, t->gc, points, countof(points), CoordModeOrigin);
+}
+
+static void
+draw_circle (Display *dpy, Drawable w, struct throbber *t)
+{
+  XDrawArc (dpy, w, t->gc,
+            t->x - t->size / 2,
+            t->y - t->size / 2,
+            t->size, t->size,
+            0, 360*64);
+}
+
+static void
+draw_hlines (Display *dpy, Drawable w, struct throbber *t)
+{
+  XDrawLine (dpy, w, t->gc, 0,
+             t->y - t->size, t->max_size,
+             t->y - t->size);
+  XDrawLine (dpy, w, t->gc, 0,
+             t->y + t->size, t->max_size,
+             t->y + t->size);
+}
+
+static void
+draw_vlines (Display *dpy, Drawable w, struct throbber *t)
+{
+  XDrawLine (dpy, w, t->gc,
+             t->x - t->size, 0,
+             t->x - t->size, t->max_size);
+  XDrawLine (dpy, w, t->gc,
+             t->x + t->size, 0,
+             t->x + t->size, t->max_size);
+}
+
+static void
+draw_corners (Display *dpy, Drawable w, struct throbber *t)
+{
+  int s = (t->size + t->thickness) / 2;
+  XPoint points[3];
+
+  points[0].x = 0;        points[0].y = t->y - s;
+  points[1].x = t->x - s; points[1].y = t->y - s;
+  points[2].x = t->x - s; points[2].y = 0;
+  XDrawLines (dpy, w, t->gc, points, countof(points), CoordModeOrigin);
+
+  points[0].x = 0;        points[0].y = t->y + s;
+  points[1].x = t->x - s; points[1].y = t->y + s;
+  points[2].x = t->x - s; points[2].y = t->max_size;
+  XDrawLines (dpy, w, t->gc, points, countof(points), CoordModeOrigin);
+
+  points[0].x = t->x + s;    points[0].y = 0;
+  points[1].x = t->x + s;    points[1].y = t->y - s;
+  points[2].x = t->max_size; points[2].y = t->y - s;
+  XDrawLines (dpy, w, t->gc, points, countof(points), CoordModeOrigin);
+
+  points[0].x = t->x + s;    points[0].y = t->max_size;
+  points[1].x = t->x + s;    points[1].y = t->y + s;
+  points[2].x = t->max_size; points[2].y = t->y + s;
+  XDrawLines (dpy, w, t->gc, points, countof(points), CoordModeOrigin);
+}
+
+
+static struct throbber *
+make_throbber (Display *dpy, Drawable d, int w, int h, unsigned long pixel)
+{
+  XGCValues gcv;
+  unsigned long flags;
+  struct throbber *t = (struct throbber *) malloc (sizeof (*t));
+  t->x = w / 2;
+  t->y = h / 2;
+  t->max_size = w;
+  t->speed = get_integer_resource ("speed", "Speed");
+  t->fuse = 1 + (random() % 4);
+  t->thickness = get_integer_resource ("thickness", "Thickness");
+
+  if (t->speed < 0) t->speed = -t->speed;
+  t->speed += (((random() % t->speed) / 2) - (t->speed / 2));
+  if (t->speed > 0) t->speed = -t->speed;
+
+  if (random() % 4)
+    t->size = t->max_size;
+  else
+    t->size = t->thickness, t->speed = -t->speed;
+
+  flags = GCForeground;
+  if (transparent_p)
+    {
+      gcv.foreground = ~0L;
+      gcv.plane_mask = base_pixel | plane_masks[random() % nplanes];
+      flags |= GCPlaneMask;
+    }
+  else
+    {
+      gcv.foreground = pixel;
+    }
+
+  gcv.line_width = t->thickness;
+  gcv.line_style = LineSolid;
+  gcv.cap_style = CapProjecting;
+  gcv.join_style = JoinMiter;
+
+  flags |= (GCLineWidth | GCLineStyle | GCCapStyle | GCJoinStyle);
+  t->gc = XCreateGC (dpy, d, flags, &gcv);
+
+  switch (random() % 11) {
+  case 0: case 1: case 2: case 3: t->draw = draw_star; break;
+  case 4: case 5: case 6: case 7: t->draw = draw_circle; break;
+  case 8: t->draw = draw_hlines; break;
+  case 9: t->draw = draw_vlines; break;
+  case 10: t->draw = draw_corners; break;
+  default: abort(); break;
+  }
+
+  return t;
+}
+
+static int
+throb (Display *dpy, Drawable window, struct throbber *t)
+{
+  t->size += t->speed;
+  if (t->size <= (t->thickness / 2))
+    {
+      t->speed = -t->speed;
+      t->size += (t->speed * 2);
+    }
+  else if (t->size > t->max_size)
+    {
+      t->speed = -t->speed;
+      t->size += (t->speed * 2);
+      t->fuse--;
+    }
+
+  if (t->fuse <= 0)
+    {
+      XFreeGC (dpy, t->gc);
+      memset (t, 0, sizeof(*t));
+      free (t);
+      return -1;
+    }
+  else
+    {
+      t->draw (dpy, window, t);
+      return 0;
+    }
+}
+
+
+\f
+char *progclass = "Deluxe";
+
+char *defaults [] = {
+  ".background:                black",
+  ".foreground:                white",
+  "*delay:             5000",
+  "*count:             5",
+  "*thickness:         50",
+  "*speed:             15",
+  "*ncolors:           20",
+  "*nlayers:           0",
+  "*transparent:       False",
+  "*doubleBuffer:      True",
+#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+  "*useDBE:            True",
+#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
+  0
+};
+
+XrmOptionDescRec options [] = {
+  { "-delay",          ".delay",       XrmoptionSepArg, 0 },
+  { "-thickness",      ".thickness",   XrmoptionSepArg, 0 },
+  { "-count",          ".count",       XrmoptionSepArg, 0 },
+  { "-ncolors",                ".ncolors",     XrmoptionSepArg, 0 },
+  { "-speed",          ".speed",       XrmoptionSepArg, 0 },
+  { "-transparent",    ".transparent",  XrmoptionNoArg,  "True" },
+  { "-opaque",         ".transparent",  XrmoptionNoArg,  "False" },
+  { "-db",             ".doubleBuffer", XrmoptionNoArg,  "True" },
+  { "-no-db",          ".doubleBuffer", XrmoptionNoArg,  "False" },
+  { 0, 0, 0, 0 }
+};
+
+void
+screenhack (Display *dpy, Window window)
+{
+  int count = get_integer_resource ("count", "Integer");
+  int delay = get_integer_resource ("delay", "Integer");
+  int ncolors = get_integer_resource ("ncolors", "Integer");
+  Bool dbuf = get_boolean_resource ("doubleBuffer", "Boolean");
+  XColor colors[255];
+  XGCValues gcv;
+  GC erase_gc = 0;
+  int i;
+  struct throbber **throbbers;
+  XWindowAttributes xgwa;
+  Pixmap b=0, ba=0, bb=0;      /* double-buffer to reduce flicker */
+#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+  XdbeBackBuffer backb = 0;
+#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
+
+  XGetWindowAttributes (dpy, window, &xgwa);
+
+  transparent_p = get_boolean_resource("transparent", "Transparent");
+
+  if (get_boolean_resource("mono", "Boolean"))
+    {
+    MONO:
+      ncolors = 1;
+      colors[0].pixel = get_pixel_resource("foreground", "Foreground",
+                                           dpy, xgwa.colormap);
+    }
+  else if (transparent_p)
+    {
+      nplanes = get_integer_resource ("planes", "Planes");
+      if (nplanes <= 0)
+        nplanes = (random() % (xgwa.depth-2)) + 2;
+
+      allocate_alpha_colors (xgwa.screen, xgwa.visual, xgwa.colormap,
+                             &nplanes, True, &plane_masks,
+                            &base_pixel);
+      if (nplanes <= 1)
+       {
+         fprintf (stderr,
+         "%s: couldn't allocate any color planes; turning transparency off.\n",
+                  progname);
+          transparent_p = False;
+         goto COLOR;
+       }
+    }
+  else
+    {
+    COLOR:
+      make_random_colormap (dpy, xgwa.visual, xgwa.colormap,
+                            colors, &ncolors, True, True, 0, True);
+      if (ncolors < 2)
+        goto MONO;
+    }
+
+  if (dbuf)
+    {
+#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+      b = backb = xdbe_get_backbuffer (dpy, window, XdbeUndefined);
+#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
+
+      if (!b)
+        {
+          ba = XCreatePixmap (dpy, window, xgwa.width, xgwa.height,xgwa.depth);
+          bb = XCreatePixmap (dpy, window, xgwa.width, xgwa.height,xgwa.depth);
+          b = ba;
+        }
+    }
+  else
+    {
+      b = window;
+    }
+
+  throbbers = (struct throbber **) calloc (count, sizeof(struct throbber *));
+  for (i = 0; i < count; i++)
+    throbbers[i] = make_throbber (dpy, b, xgwa.width, xgwa.height,
+                                  colors[random() % ncolors].pixel);
+
+  gcv.foreground = get_pixel_resource ("background", "Background",
+                                       dpy, xgwa.colormap);
+  erase_gc = XCreateGC (dpy, b, GCForeground, &gcv);
+
+  if (ba) XFillRectangle (dpy, ba, erase_gc, 0, 0, xgwa.width, xgwa.height);
+  if (bb) XFillRectangle (dpy, bb, erase_gc, 0, 0, xgwa.width, xgwa.height);
+
+  while (1)
+    {
+      XFillRectangle (dpy, b, erase_gc, 0, 0, xgwa.width, xgwa.height);
+
+      for (i = 0; i < count; i++)
+        if (throb (dpy, b, throbbers[i]) < 0)
+          throbbers[i] = make_throbber (dpy, b, xgwa.width, xgwa.height,
+                                        colors[random() % ncolors].pixel);
+
+#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+      if (backb)
+        {
+          XdbeSwapInfo info[1];
+          info[0].swap_window = window;
+          info[0].swap_action = XdbeUndefined;
+          XdbeSwapBuffers (dpy, info, 1);
+        }
+      else
+#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
+      if (dbuf)
+        {
+          XCopyArea (dpy, b, window, erase_gc, 0, 0,
+                     xgwa.width, xgwa.height, 0, 0);
+          b = (b == ba ? bb : ba);
+        }
+
+      XSync (dpy, False);
+      screenhack_handle_events (dpy);
+      if (delay)
+        usleep (delay);
+    }
+}
diff --git a/hacks/demon.c b/hacks/demon.c
new file mode 100644 (file)
index 0000000..db0255a
--- /dev/null
@@ -0,0 +1,902 @@
+/* -*- Mode: C; tab-width: 4 -*- */
+/* demon --- David Griffeath's cellular automata */
+
+#if !defined( lint ) && !defined( SABER )
+static const char sccsid[] = "@(#)demon.c      4.07 97/11/24 xlockmore";
+
+#endif
+
+/*-
+ * Copyright (c) 1995 by David Bagley.
+ *
+ * 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.
+ *
+ * This file is provided AS IS with no warranties of any kind.  The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof.  In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * Revision History:
+ * 10-May-97: Compatible with xscreensaver
+ * 16-Apr-97: -neighbors 3, 9 (not sound mathematically), 12, and 8 added
+ * 30-May-96: Ron Hitchens <ron@idiom.com>
+ *            Fixed memory management that caused leaks
+ * 14-Apr-96: -neighbors 6 runtime-time option added
+ * 21-Aug-95: Coded from A.K. Dewdney's "Computer Recreations", Scientific
+ *            American Magazine" Aug 1989 pp 102-105.  Also very similar to
+ *            hodgepodge machine described in A.K. Dewdney's "Computer
+ *            Recreations", Scientific American Magazine" Aug 1988 pp 104-107.
+ *            also used life.c as a guide.
+ */
+
+/*-
+ * A cellular universe of 4 phases debris, droplets, defects, and demons.
+ */
+
+/*-
+  Grid     Number of Neigbors
+  ----     ------------------
+  Square   4 or 8
+  Hexagon  6
+  Triangle 3, 9, or 12
+*/
+
+#ifdef STANDALONE
+#define PROGCLASS "Demon"
+#define HACK_INIT init_demon
+#define HACK_DRAW draw_demon
+#define demon_opts xlockmore_opts
+#define DEFAULTS       "*delay:        50000 \n"       \
+                                       "*count:            0 \n"       \
+                                       "*cycles:        1000 \n"       \
+                                       "*size:            -7 \n"       \
+                                       "*ncolors:         64 \n"       \
+                                       "*neighbors:    0 \n"
+# define SMOOTH_COLORS
+# include "xlockmore.h"                /* in xscreensaver distribution */
+#else /* STANDALONE */
+# include "xlock.h"                    /* in xlockmore distribution */
+#endif /* STANDALONE */
+#include "automata.h"
+
+/*-
+ * neighbors of 0 randomizes it between 3, 4, 6, 8, 9, and 12.
+ */
+#ifdef STANDALONE
+static int neighbors;
+#else
+extern int  neighbors;
+#endif /* !STANDALONE */
+
+ModeSpecOpt demon_opts =
+{0, NULL, 0, NULL, NULL};
+
+#ifdef USE_MODULES
+ModStruct   demon_description =
+{"demon", "init_demon", "draw_demon", "release_demon",
+ "refresh_demon", "init_demon", NULL, &demon_opts,
+ 50000, 0, 1000, -7, 64, 1.0, "",
+ "Shows Griffeath's cellular automata", 0, NULL};
+
+#endif
+
+#define DEMONBITS(n,w,h)\
+  dp->pixmaps[dp->init_bits++]=\
+  XCreatePixmapFromBitmapData(display,window,(char *)n,w,h,1,0,1)
+
+#define REDRAWSTEP 2000                /* How many cells to draw per cycle */
+#define MINSTATES 2
+#define MINGRIDSIZE 24
+#define MINSIZE 4
+#define NEIGHBORKINDS 6
+
+/* Singly linked list */
+typedef struct _CellList {
+       XPoint      pt;
+       struct _CellList *next;
+} CellList;
+
+typedef struct {
+       int         generation;
+       int         xs, ys;
+       int         xb, yb;
+       int         nrows, ncols;
+       int         width, height;
+       int         states;
+       int         state;
+       int         redrawing, redrawpos;
+       int        *ncells;
+       CellList  **cellList;
+       unsigned char *oldcell, *newcell;
+       int         neighbors;
+       int         init_bits;
+       GC          stippledGC;
+       Pixmap      pixmaps[NUMSTIPPLES - 1];
+       union {
+               XPoint      hexagon[6];
+               XPoint      triangle[2][3];
+       } shape;
+} demonstruct;
+
+static char plots[2][NEIGHBORKINDS] =
+{
+       {3, 4, 6, 8, 9, 12},    /* Neighborhoods */
+       {12, 16, 18, 20, 22, 24}        /* Number of states */
+};
+
+static demonstruct *demons = NULL;
+
+static void
+drawcell(ModeInfo * mi, int col, int row, unsigned char state)
+{
+       demonstruct *dp = &demons[MI_SCREEN(mi)];
+       GC          gc;
+
+       if (!state) {
+               XSetForeground(MI_DISPLAY(mi), MI_GC(mi), MI_BLACK_PIXEL(mi));
+               gc = MI_GC(mi);
+       } else if (MI_NPIXELS(mi) >= NUMSTIPPLES) {
+               XSetForeground(MI_DISPLAY(mi), MI_GC(mi),
+                          MI_PIXEL(mi, (((int) state - 1) * MI_NPIXELS(mi) /
+                                        (dp->states - 1)) % MI_NPIXELS(mi)));
+               gc = MI_GC(mi);
+       } else {
+               XGCValues   gcv;
+
+               gcv.stipple = dp->pixmaps[(state - 1) % (NUMSTIPPLES - 1)];
+               gcv.foreground = MI_WHITE_PIXEL(mi);
+               gcv.background = MI_BLACK_PIXEL(mi);
+               XChangeGC(MI_DISPLAY(mi), dp->stippledGC,
+                         GCStipple | GCForeground | GCBackground, &gcv);
+               gc = dp->stippledGC;
+       }
+       if (dp->neighbors == 6) {
+               int         ccol = 2 * col + !(row & 1), crow = 2 * row;
+
+               dp->shape.hexagon[0].x = dp->xb + ccol * dp->xs;
+               dp->shape.hexagon[0].y = dp->yb + crow * dp->ys;
+               if (dp->xs == 1 && dp->ys == 1)
+                       XFillRectangle(MI_DISPLAY(mi), MI_WINDOW(mi),
+                                      gc, dp->shape.hexagon[0].x, dp->shape.hexagon[0].y, 1, 1);
+               else
+                       XFillPolygon(MI_DISPLAY(mi), MI_WINDOW(mi), gc,
+                           dp->shape.hexagon, 6, Convex, CoordModePrevious);
+       } else if (dp->neighbors == 4 || dp->neighbors == 8) {
+               XFillRectangle(MI_DISPLAY(mi), MI_WINDOW(mi), gc,
+               dp->xb + dp->xs * col, dp->yb + dp->ys * row,
+               dp->xs - (dp->xs > 3), dp->ys - (dp->ys > 3));
+       } else {                /* TRI */
+               int         orient = (col + row) % 2;   /* O left 1 right */
+
+               dp->shape.triangle[orient][0].x = dp->xb + col * dp->xs;
+               dp->shape.triangle[orient][0].y = dp->yb + row * dp->ys;
+               if (dp->xs <= 3 || dp->ys <= 3)
+                       XFillRectangle(MI_DISPLAY(mi), MI_WINDOW(mi), gc,
+                       ((orient) ? -1 : 1) + dp->shape.triangle[orient][0].x,
+                                      dp->shape.triangle[orient][0].y, 1, 1);
+               else {
+                       if (orient)
+                               dp->shape.triangle[orient][0].x += (dp->xs / 2 - 1);
+                       else
+                               dp->shape.triangle[orient][0].x -= (dp->xs / 2 - 1);
+                       XFillPolygon(MI_DISPLAY(mi), MI_WINDOW(mi), gc,
+                                    dp->shape.triangle[orient], 3, Convex, CoordModePrevious);
+
+               }
+       }
+}
+
+static void
+addtolist(ModeInfo * mi, int col, int row, unsigned char state)
+{
+       demonstruct *dp = &demons[MI_SCREEN(mi)];
+       CellList   *current;
+
+       current = dp->cellList[state];
+       dp->cellList[state] = (CellList *) malloc(sizeof (CellList));
+       dp->cellList[state]->pt.x = col;
+       dp->cellList[state]->pt.y = row;
+       dp->cellList[state]->next = current;
+       dp->ncells[state]++;
+}
+
+#ifdef DEBUG
+static void
+print_state(ModeInfo * mi, int state)
+{
+       demonstruct *dp = &demons[MI_SCREEN(mi)];
+       CellList   *locallist;
+       int         i = 0;
+
+       locallist = dp->cellList[state];
+       (void) printf("state %d\n", state);
+       while (locallist) {
+               (void) printf("%d       x %d, y %d\n", i,
+                             locallist->pt.x, locallist->pt.y);
+               locallist = locallist->next;
+               i++;
+       }
+}
+
+#endif
+
+static void
+free_state(demonstruct * dp, int state)
+{
+       CellList   *current;
+
+       while (dp->cellList[state]) {
+               current = dp->cellList[state];
+               dp->cellList[state] = dp->cellList[state]->next;
+               (void) free((void *) current);
+       }
+       dp->cellList[state] = NULL;
+       if (dp->ncells)
+               dp->ncells[state] = 0;
+}
+
+
+static void
+free_list(demonstruct * dp)
+{
+       int         state;
+
+       for (state = 0; state < dp->states; state++)
+               free_state(dp, state);
+       (void) free((void *) dp->cellList);
+       dp->cellList = NULL;
+}
+
+static void
+free_struct(demonstruct * dp)
+{
+       if (dp->cellList != NULL) {
+               free_list(dp);
+       }
+       if (dp->ncells != NULL) {
+               (void) free((void *) dp->ncells);
+               dp->ncells = NULL;
+       }
+       if (dp->oldcell != NULL) {
+               (void) free((void *) dp->oldcell);
+               dp->oldcell = NULL;
+       }
+       if (dp->newcell != NULL) {
+               (void) free((void *) dp->newcell);
+               dp->newcell = NULL;
+       }
+}
+
+static void
+draw_state(ModeInfo * mi, int state)
+{
+       demonstruct *dp = &demons[MI_SCREEN(mi)];
+       GC          gc;
+       XRectangle *rects;
+       CellList   *current;
+
+       if (!state) {
+               XSetForeground(MI_DISPLAY(mi), MI_GC(mi), MI_BLACK_PIXEL(mi));
+               gc = MI_GC(mi);
+       } else if (MI_NPIXELS(mi) >= NUMSTIPPLES) {
+               XSetForeground(MI_DISPLAY(mi), MI_GC(mi),
+                          MI_PIXEL(mi, (((int) state - 1) * MI_NPIXELS(mi) /
+                                        (dp->states - 1)) % MI_NPIXELS(mi)));
+               gc = MI_GC(mi);
+       } else {
+               XGCValues   gcv;
+
+               gcv.stipple = dp->pixmaps[(state - 1) % (NUMSTIPPLES - 1)];
+               gcv.foreground = MI_WHITE_PIXEL(mi);
+               gcv.background = MI_BLACK_PIXEL(mi);
+               XChangeGC(MI_DISPLAY(mi), dp->stippledGC,
+                         GCStipple | GCForeground | GCBackground, &gcv);
+               gc = dp->stippledGC;
+       }
+       if (dp->neighbors == 6) {       /* Draw right away, slow */
+               current = dp->cellList[state];
+               while (current) {
+                       int         col, row, ccol, crow;
+
+                       col = current->pt.x;
+                       row = current->pt.y;
+                       ccol = 2 * col + !(row & 1), crow = 2 * row;
+                       dp->shape.hexagon[0].x = dp->xb + ccol * dp->xs;
+                       dp->shape.hexagon[0].y = dp->yb + crow * dp->ys;
+                       if (dp->xs == 1 && dp->ys == 1)
+                               XFillRectangle(MI_DISPLAY(mi), MI_WINDOW(mi),
+                                              gc, dp->shape.hexagon[0].x, dp->shape.hexagon[0].y, 1, 1);
+                       else
+                               XFillPolygon(MI_DISPLAY(mi), MI_WINDOW(mi), gc,
+                                            dp->shape.hexagon, 6, Convex, CoordModePrevious);
+                       current = current->next;
+               }
+       } else if (dp->neighbors == 4 || dp->neighbors == 8) {
+               /* Take advantage of XDrawRectangles */
+               int         ncells = 0;
+
+               /* Create Rectangle list from part of the cellList */
+               rects = (XRectangle *) malloc(dp->ncells[state] * sizeof (XRectangle));
+               current = dp->cellList[state];
+               while (current) {
+                       rects[ncells].x = dp->xb + current->pt.x * dp->xs;
+                       rects[ncells].y = dp->yb + current->pt.y * dp->ys;
+                       rects[ncells].width = dp->xs - (dp->xs > 3);
+                       rects[ncells].height = dp->ys - (dp->ys > 3);
+                       current = current->next;
+                       ncells++;
+               }
+               /* Finally get to draw */
+               XFillRectangles(MI_DISPLAY(mi), MI_WINDOW(mi), gc, rects, ncells);
+               /* Free up rects list and the appropriate part of the cellList */
+               (void) free((void *) rects);
+       } else {                /* TRI */
+               current = dp->cellList[state];
+               while (current) {
+                       int         col, row, orient;
+
+                       col = current->pt.x;
+                       row = current->pt.y;
+                       orient = (col + row) % 2;       /* O left 1 right */
+                       dp->shape.triangle[orient][0].x = dp->xb + col * dp->xs;
+                       dp->shape.triangle[orient][0].y = dp->yb + row * dp->ys;
+                       if (dp->xs <= 3 || dp->ys <= 3)
+                               XFillRectangle(MI_DISPLAY(mi), MI_WINDOW(mi), gc,
+                                              ((orient) ? -1 : 1) + dp->shape.triangle[orient][0].x,
+                                     dp->shape.triangle[orient][0].y, 1, 1);
+                       else {
+                               if (orient)
+                                       dp->shape.triangle[orient][0].x += (dp->xs / 2 - 1);
+                               else
+                                       dp->shape.triangle[orient][0].x -= (dp->xs / 2 - 1);
+                               XFillPolygon(MI_DISPLAY(mi), MI_WINDOW(mi), gc,
+                                            dp->shape.triangle[orient], 3, Convex, CoordModePrevious);
+                       }
+                       current = current->next;
+               }
+       }
+       free_state(dp, state);
+       XFlush(MI_DISPLAY(mi));
+}
+
+static void
+RandomSoup(ModeInfo * mi)
+{
+       demonstruct *dp = &demons[MI_SCREEN(mi)];
+       int         row, col, mrow = 0;
+
+       for (row = 0; row < dp->nrows; ++row) {
+               for (col = 0; col < dp->ncols; ++col) {
+                       dp->oldcell[col + mrow] =
+                               (unsigned char) LRAND() % ((unsigned char) dp->states);
+                       addtolist(mi, col, row, dp->oldcell[col + mrow]);
+               }
+               mrow += dp->ncols;
+       }
+}
+
+void
+init_demon(ModeInfo * mi)
+{
+       Display    *display = MI_DISPLAY(mi);
+       Window      window = MI_WINDOW(mi);
+       int         size = MI_SIZE(mi), nk;
+       demonstruct *dp;
+
+       if (demons == NULL) {
+               if ((demons = (demonstruct *) calloc(MI_NUM_SCREENS(mi),
+                                             sizeof (demonstruct))) == NULL)
+                       return;
+       }
+       dp = &demons[MI_SCREEN(mi)];
+       dp->generation = 0;
+       dp->redrawing = 0;
+       if (MI_NPIXELS(mi) < NUMSTIPPLES) {
+               if (dp->stippledGC == None) {
+                       XGCValues   gcv;
+
+                       gcv.fill_style = FillOpaqueStippled;
+                       dp->stippledGC = XCreateGC(display, window, GCFillStyle, &gcv);
+               }
+               if (dp->init_bits == 0) {
+                       int         i;
+
+                       for (i = 1; i < NUMSTIPPLES; i++)
+                               DEMONBITS(stipples[i], STIPPLESIZE, STIPPLESIZE);
+               }
+       }
+       free_struct(dp);
+
+       for (nk = 0; nk < NEIGHBORKINDS; nk++) {
+               if (neighbors == plots[0][nk]) {
+                       dp->neighbors = plots[0][nk];
+                       break;
+               }
+               if (nk == NEIGHBORKINDS - 1) {
+                       nk = NRAND(NEIGHBORKINDS);
+                       dp->neighbors = plots[0][nk];
+                       break;
+               }
+       }
+
+       dp->states = MI_COUNT(mi);
+       if (dp->states < -MINSTATES)
+               dp->states = NRAND(-dp->states - MINSTATES + 1) + MINSTATES;
+       else if (dp->states < MINSTATES)
+               dp->states = plots[1][nk];
+       dp->cellList = (CellList **) calloc(dp->states, sizeof (CellList *));
+       dp->ncells = (int *) calloc(dp->states, sizeof (int));
+
+       dp->state = 0;
+
+       dp->width = MI_WIDTH(mi);
+       dp->height = MI_HEIGHT(mi);
+
+       if (dp->neighbors == 6) {
+               int         nccols, ncrows, i;
+
+               if (dp->width < 2)
+                       dp->width = 2;
+               if (dp->height < 4)
+                       dp->height = 4;
+               if (size < -MINSIZE)
+                       dp->ys = NRAND(MIN(-size, MAX(MINSIZE, MIN(dp->width, dp->height) /
+                                     MINGRIDSIZE)) - MINSIZE + 1) + MINSIZE;
+               else if (size < MINSIZE) {
+                       if (!size)
+                               dp->ys = MAX(MINSIZE, MIN(dp->width, dp->height) / MINGRIDSIZE);
+                       else
+                               dp->ys = MINSIZE;
+               } else
+                       dp->ys = MIN(size, MAX(MINSIZE, MIN(dp->width, dp->height) /
+                                              MINGRIDSIZE));
+               dp->xs = dp->ys;
+               nccols = MAX(dp->width / dp->xs - 2, 2);
+               ncrows = MAX(dp->height / dp->ys - 1, 2);
+               dp->ncols = nccols / 2;
+               dp->nrows = 2 * (ncrows / 4);
+               dp->xb = (dp->width - dp->xs * nccols) / 2 + dp->xs / 2;
+               dp->yb = (dp->height - dp->ys * (ncrows / 2) * 2) / 2 + dp->ys;
+               for (i = 0; i < 6; i++) {
+                       dp->shape.hexagon[i].x = (dp->xs - 1) * hexagonUnit[i].x;
+                       dp->shape.hexagon[i].y = ((dp->ys - 1) * hexagonUnit[i].y / 2) * 4 / 3;
+               }
+       } else if (dp->neighbors == 4 || dp->neighbors == 8) {
+               if (size < -MINSIZE)
+                       dp->ys = NRAND(MIN(-size, MAX(MINSIZE, MIN(dp->width, dp->height) /
+                                     MINGRIDSIZE)) - MINSIZE + 1) + MINSIZE;
+               else if (size < MINSIZE) {
+                       if (!size)
+                               dp->ys = MAX(MINSIZE, MIN(dp->width, dp->height) / MINGRIDSIZE);
+                       else
+                               dp->ys = MINSIZE;
+               } else
+                       dp->ys = MIN(size, MAX(MINSIZE, MIN(dp->width, dp->height) /
+                                              MINGRIDSIZE));
+               dp->xs = dp->ys;
+               dp->ncols = MAX(dp->width / dp->xs, 2);
+               dp->nrows = MAX(dp->height / dp->ys, 2);
+               dp->xb = (dp->width - dp->xs * dp->ncols) / 2;
+               dp->yb = (dp->height - dp->ys * dp->nrows) / 2;
+       } else {                /* TRI */
+               int         orient, i;
+
+               if (dp->width < 2)
+                       dp->width = 2;
+               if (dp->height < 2)
+                       dp->height = 2;
+               if (size < -MINSIZE)
+                       dp->ys = NRAND(MIN(-size, MAX(MINSIZE, MIN(dp->width, dp->height) /
+                                     MINGRIDSIZE)) - MINSIZE + 1) + MINSIZE;
+               else if (size < MINSIZE) {
+                       if (!size)
+                               dp->ys = MAX(MINSIZE, MIN(dp->width, dp->height) / MINGRIDSIZE);
+                       else
+                               dp->ys = MINSIZE;
+               } else
+                       dp->ys = MIN(size, MAX(MINSIZE, MIN(dp->width, dp->height) /
+                                              MINGRIDSIZE));
+               dp->xs = (int) (1.52 * dp->ys);
+               dp->ncols = (MAX(dp->width / dp->xs - 1, 2) / 2) * 2;
+               dp->nrows = (MAX(dp->height / dp->ys - 1, 2) / 2) * 2;
+               dp->xb = (dp->width - dp->xs * dp->ncols) / 2 + dp->xs / 2;
+               dp->yb = (dp->height - dp->ys * dp->nrows) / 2 + dp->ys / 2;
+               for (orient = 0; orient < 2; orient++) {
+                       for (i = 0; i < 3; i++) {
+                               dp->shape.triangle[orient][i].x =
+                                       (dp->xs - 2) * triangleUnit[orient][i].x;
+                               dp->shape.triangle[orient][i].y =
+                                       (dp->ys - 2) * triangleUnit[orient][i].y;
+                       }
+               }
+       }
+
+       MI_CLEARWINDOW(mi);
+
+       dp->oldcell = (unsigned char *)
+               malloc(dp->ncols * dp->nrows * sizeof (unsigned char));
+
+       dp->newcell = (unsigned char *)
+               malloc(dp->ncols * dp->nrows * sizeof (unsigned char));
+
+       RandomSoup(mi);
+}
+
+void
+draw_demon(ModeInfo * mi)
+{
+       demonstruct *dp = &demons[MI_SCREEN(mi)];
+       int         i, j, k, l, mj = 0, ml;
+
+       MI_IS_DRAWN(mi) = True;
+
+       if (dp->state >= dp->states) {
+               (void) memcpy((char *) dp->newcell, (char *) dp->oldcell,
+                             dp->ncols * dp->nrows * sizeof (unsigned char));
+
+               if (dp->neighbors == 6) {
+                       for (j = 0; j < dp->nrows; j++) {
+                               for (i = 0; i < dp->ncols; i++) {
+                                       /* NE */
+                                       if (!(j & 1))
+                                               k = (i + 1 == dp->ncols) ? 0 : i + 1;
+                                       else
+                                               k = i;
+                                       l = (!j) ? dp->nrows - 1 : j - 1;
+                                       ml = l * dp->ncols;
+                                       if (dp->oldcell[k + ml] ==
+                                           (int) (dp->oldcell[i + mj] + 1) % dp->states)
+                                               dp->newcell[i + mj] = dp->oldcell[k + ml];
+                                       /* E */
+                                       k = (i + 1 == dp->ncols) ? 0 : i + 1;
+                                       l = j;
+                                       ml = mj;
+                                       if (dp->oldcell[k + ml] ==
+                                           (int) (dp->oldcell[i + mj] + 1) % dp->states)
+                                               dp->newcell[i + mj] = dp->oldcell[k + ml];
+                                       /* SE */
+                                       if (!(j & 1))
+                                               k = (i + 1 == dp->ncols) ? 0 : i + 1;
+                                       else
+                                               k = i;
+                                       l = (j + 1 == dp->nrows) ? 0 : j + 1;
+                                       ml = l * dp->ncols;
+                                       if (dp->oldcell[k + ml] ==
+                                           (int) (dp->oldcell[i + mj] + 1) % dp->states)
+                                               dp->newcell[i + mj] = dp->oldcell[k + ml];
+                                       /* SW */
+                                       if (j & 1)
+                                               k = (!i) ? dp->ncols - 1 : i - 1;
+                                       else
+                                               k = i;
+                                       l = (j + 1 == dp->nrows) ? 0 : j + 1;
+                                       ml = l * dp->ncols;
+                                       if (dp->oldcell[k + ml] ==
+                                           (int) (dp->oldcell[i + mj] + 1) % dp->states)
+                                               dp->newcell[i + mj] = dp->oldcell[k + ml];
+                                       /* W */
+                                       k = (!i) ? dp->ncols - 1 : i - 1;
+                                       l = j;
+                                       ml = mj;
+                                       if (dp->oldcell[k + ml] ==
+                                           (int) (dp->oldcell[i + mj] + 1) % dp->states)
+                                               dp->newcell[i + mj] = dp->oldcell[k + ml];
+                                       /* NW */
+                                       if (j & 1)
+                                               k = (!i) ? dp->ncols - 1 : i - 1;
+                                       else
+                                               k = i;
+                                       l = (!j) ? dp->nrows - 1 : j - 1;
+                                       ml = l * dp->ncols;
+                                       if (dp->oldcell[k + ml] ==
+                                           (int) (dp->oldcell[i + mj] + 1) % dp->states)
+                                               dp->newcell[i + mj] = dp->oldcell[k + ml];
+                               }
+                               mj += dp->ncols;
+                       }
+               } else if (dp->neighbors == 4 || dp->neighbors == 8) {
+                       for (j = 0; j < dp->nrows; j++) {
+                               for (i = 0; i < dp->ncols; i++) {
+                                       /* N */
+                                       k = i;
+                                       l = (!j) ? dp->nrows - 1 : j - 1;
+                                       ml = l * dp->ncols;
+                                       if (dp->oldcell[k + ml] ==
+                                           (int) (dp->oldcell[i + mj] + 1) % dp->states)
+                                               dp->newcell[i + mj] = dp->oldcell[k + ml];
+                                       /* E */
+                                       k = (i + 1 == dp->ncols) ? 0 : i + 1;
+                                       l = j;
+                                       ml = mj;
+                                       if (dp->oldcell[k + ml] ==
+                                           (int) (dp->oldcell[i + mj] + 1) % dp->states)
+                                               dp->newcell[i + mj] = dp->oldcell[k + ml];
+                                       /* S */
+                                       k = i;
+                                       l = (j + 1 == dp->nrows) ? 0 : j + 1;
+                                       ml = l * dp->ncols;
+                                       if (dp->oldcell[k + ml] ==
+                                           (int) (dp->oldcell[i + mj] + 1) % dp->states)
+                                               dp->newcell[i + mj] = dp->oldcell[k + ml];
+                                       /* W */
+                                       k = (!i) ? dp->ncols - 1 : i - 1;
+                                       l = j;
+                                       ml = mj;
+                                       if (dp->oldcell[k + ml] ==
+                                           (int) (dp->oldcell[i + mj] + 1) % dp->states)
+                                               dp->newcell[i + mj] = dp->oldcell[k + ml];
+                               }
+                               mj += dp->ncols;
+                       }
+                       if (dp->neighbors == 8) {
+                               mj = 0;
+                               for (j = 0; j < dp->nrows; j++) {
+                                       for (i = 0; i < dp->ncols; i++) {
+                                               /* NE */
+                                               k = (i + 1 == dp->ncols) ? 0 : i + 1;
+                                               l = (!j) ? dp->nrows - 1 : j - 1;
+                                               ml = l * dp->ncols;
+                                               if (dp->oldcell[k + ml] ==
+                                                   (int) (dp->oldcell[i + mj] + 1) % dp->states)
+                                                       dp->newcell[i + mj] = dp->oldcell[k + ml];
+                                               /* SE */
+                                               k = (i + 1 == dp->ncols) ? 0 : i + 1;
+                                               l = (j + 1 == dp->nrows) ? 0 : j + 1;
+                                               ml = l * dp->ncols;
+                                               if (dp->oldcell[k + ml] ==
+                                                   (int) (dp->oldcell[i + mj] + 1) % dp->states)
+                                                       dp->newcell[i + mj] = dp->oldcell[k + ml];
+                                               /* SW */
+                                               k = (!i) ? dp->ncols - 1 : i - 1;
+                                               l = (j + 1 == dp->nrows) ? 0 : j + 1;
+                                               ml = l * dp->ncols;
+                                               if (dp->oldcell[k + ml] ==
+                                                   (int) (dp->oldcell[i + mj] + 1) % dp->states)
+                                                       dp->newcell[i + mj] = dp->oldcell[k + ml];
+                                               /* NW */
+                                               k = (!i) ? dp->ncols - 1 : i - 1;
+                                               l = (!j) ? dp->nrows - 1 : j - 1;
+                                               ml = l * dp->ncols;
+                                               if (dp->oldcell[k + ml] ==
+                                                   (int) (dp->oldcell[i + mj] + 1) % dp->states)
+                                                       dp->newcell[i + mj] = dp->oldcell[k + ml];
+                                       }
+                                       mj += dp->ncols;
+                               }
+                       }
+               } else if (dp->neighbors == 3 || dp->neighbors == 9 ||
+                          dp->neighbors == 12) {
+                       for (j = 0; j < dp->nrows; j++) {
+                               for (i = 0; i < dp->ncols; i++) {
+                                       if ((i + j) % 2) {      /* right */
+                                               /* W */
+                                               k = (!i) ? dp->ncols - 1 : i - 1;
+                                               l = j;
+                                               ml = mj;
+                                               if (dp->oldcell[k + ml] ==
+                                                   (int) (dp->oldcell[i + mj] + 1) % dp->states)
+                                                       dp->newcell[i + mj] = dp->oldcell[k + ml];
+                                       } else {        /* left */
+                                               /* E */
+                                               k = (i + 1 == dp->ncols) ? 0 : i + 1;
+                                               l = j;
+                                               ml = mj;
+                                               if (dp->oldcell[k + ml] ==
+                                                   (int) (dp->oldcell[i + mj] + 1) % dp->states)
+                                                       dp->newcell[i + mj] = dp->oldcell[k + ml];
+                                       }
+                                       /* N */
+                                       k = i;
+                                       l = (!j) ? dp->nrows - 1 : j - 1;
+                                       ml = l * dp->ncols;
+                                       if (dp->oldcell[k + ml] ==
+                                           (int) (dp->oldcell[i + mj] + 1) % dp->states)
+                                               dp->newcell[i + mj] = dp->oldcell[k + ml];
+                                       /* S */
+                                       k = i;
+                                       l = (j + 1 == dp->nrows) ? 0 : j + 1;
+                                       ml = l * dp->ncols;
+                                       if (dp->oldcell[k + ml] ==
+                                           (int) (dp->oldcell[i + mj] + 1) % dp->states)
+                                               dp->newcell[i + mj] = dp->oldcell[k + ml];
+                               }
+                               mj += dp->ncols;
+                       }
+                       if (dp->neighbors == 9 || dp->neighbors == 12) {
+                               mj = 0;
+                               for (j = 0; j < dp->nrows; j++) {
+                                       for (i = 0; i < dp->ncols; i++) {
+                                               /* NN */
+                                               k = i;
+                                               if (!j)
+                                                       l = dp->nrows - 2;
+                                               else if (!(j - 1))
+                                                       l = dp->nrows - 1;
+                                               else
+                                                       l = j - 2;
+                                               ml = l * dp->ncols;
+                                               if (dp->oldcell[k + ml] ==
+                                                   (int) (dp->oldcell[i + mj] + 1) % dp->states)
+                                                       dp->newcell[i + mj] = dp->oldcell[k + ml];
+                                               /* SS */
+                                               k = i;
+                                               if (j + 1 == dp->nrows)
+                                                       l = 1;
+                                               else if (j + 2 == dp->nrows)
+                                                       l = 0;
+                                               else
+                                                       l = j + 2;
+                                               ml = l * dp->ncols;
+                                               if (dp->oldcell[k + ml] ==
+                                                   (int) (dp->oldcell[i + mj] + 1) % dp->states)
+                                                       dp->newcell[i + mj] = dp->oldcell[k + ml];
+                                               /* NW */
+                                               k = (!i) ? dp->ncols - 1 : i - 1;
+                                               l = (!j) ? dp->nrows - 1 : j - 1;
+                                               ml = l * dp->ncols;
+                                               if (dp->oldcell[k + ml] ==
+                                                   (int) (dp->oldcell[i + mj] + 1) % dp->states)
+                                                       dp->newcell[i + mj] = dp->oldcell[k + ml];
+                                               /* NE */
+                                               k = (i + 1 == dp->ncols) ? 0 : i + 1;
+                                               l = (!j) ? dp->nrows - 1 : j - 1;
+                                               ml = l * dp->ncols;
+                                               if (dp->oldcell[k + ml] ==
+                                                   (int) (dp->oldcell[i + mj] + 1) % dp->states)
+                                                       dp->newcell[i + mj] = dp->oldcell[k + ml];
+                                               /* SW */
+                                               k = (!i) ? dp->ncols - 1 : i - 1;
+                                               l = (j + 1 == dp->nrows) ? 0 : j + 1;
+                                               ml = l * dp->ncols;
+                                               if (dp->oldcell[k + ml] ==
+                                                   (int) (dp->oldcell[i + mj] + 1) % dp->states)
+                                                       dp->newcell[i + mj] = dp->oldcell[k + ml];
+                                               /* SE */
+                                               k = (i + 1 == dp->ncols) ? 0 : i + 1;
+                                               l = (j + 1 == dp->nrows) ? 0 : j + 1;
+                                               ml = l * dp->ncols;
+                                               if (dp->oldcell[k + ml] ==
+                                                   (int) (dp->oldcell[i + mj] + 1) % dp->states)
+                                                       dp->newcell[i + mj] = dp->oldcell[k + ml];
+                                       }
+                                       mj += dp->ncols;
+                               }
+                               if (dp->neighbors == 12) {
+                                       mj = 0;
+                                       for (j = 0; j < dp->nrows; j++) {
+                                               for (i = 0; i < dp->ncols; i++) {
+                                                       if ((i + j) % 2) {      /* right */
+                                                               /* NNW */
+                                                               k = (!i) ? dp->ncols - 1 : i - 1;
+                                                               if (!j)
+                                                                       l = dp->nrows - 2;
+                                                               else if (!(j - 1))
+                                                                       l = dp->nrows - 1;
+                                                               else
+                                                                       l = j - 2;
+                                                               ml = l * dp->ncols;
+                                                               if (dp->oldcell[k + ml] ==
+                                                                   (int) (dp->oldcell[i + mj] + 1) % dp->states)
+                                                                       dp->newcell[i + mj] = dp->oldcell[k + ml];
+                                                               /* SSW */
+                                                               k = (!i) ? dp->ncols - 1 : i - 1;
+                                                               if (j + 1 == dp->nrows)
+                                                                       l = 1;
+                                                               else if (j + 2 == dp->nrows)
+                                                                       l = 0;
+                                                               else
+                                                                       l = j + 2;
+                                                               ml = l * dp->ncols;
+                                                               if (dp->oldcell[k + ml] ==
+                                                                   (int) (dp->oldcell[i + mj] + 1) % dp->states)
+                                                                       dp->newcell[i + mj] = dp->oldcell[k + ml];
+                                                               /* EE */
+                                                               k = (i + 1 == dp->ncols) ? 0 : i + 1;
+                                                               l = j;
+                                                               ml = mj;
+                                                               if (dp->oldcell[k + ml] ==
+                                                                   (int) (dp->oldcell[i + mj] + 1) % dp->states)
+                                                                       dp->newcell[i + mj] = dp->oldcell[k + ml];
+                                                       } else {        /* left */
+                                                               /* NNE */
+                                                               k = (i + 1 == dp->ncols) ? 0 : i + 1;
+                                                               if (!j)
+                                                                       l = dp->nrows - 2;
+                                                               else if (!(j - 1))
+                                                                       l = dp->nrows - 1;
+                                                               else
+                                                                       l = j - 2;
+                                                               ml = l * dp->ncols;
+                                                               if (dp->oldcell[k + ml] ==
+                                                                   (int) (dp->oldcell[i + mj] + 1) % dp->states)
+                                                                       dp->newcell[i + mj] = dp->oldcell[k + ml];
+                                                               /* SSE */
+                                                               k = (i + 1 == dp->ncols) ? 0 : i + 1;
+                                                               if (j + 1 == dp->nrows)
+                                                                       l = 1;
+                                                               else if (j + 2 == dp->nrows)
+                                                                       l = 0;
+                                                               else
+                                                                       l = j + 2;
+                                                               ml = l * dp->ncols;
+                                                               if (dp->oldcell[k + ml] ==
+                                                                   (int) (dp->oldcell[i + mj] + 1) % dp->states)
+                                                                       dp->newcell[i + mj] = dp->oldcell[k + ml];
+                                                               /* WW */
+                                                               k = (!i) ? dp->ncols - 1 : i - 1;
+                                                               l = j;
+                                                               ml = mj;
+                                                               if (dp->oldcell[k + ml] ==
+                                                                   (int) (dp->oldcell[i + mj] + 1) % dp->states)
+                                                                       dp->newcell[i + mj] = dp->oldcell[k + ml];
+                                                       }
+                                               }
+                                               mj += dp->ncols;
+                                       }
+                               }
+                       }
+               }
+               mj = 0;
+               for (j = 0; j < dp->nrows; j++) {
+                       for (i = 0; i < dp->ncols; i++)
+                               if (dp->oldcell[i + mj] != dp->newcell[i + mj]) {
+                                       dp->oldcell[i + mj] = dp->newcell[i + mj];
+                                       addtolist(mi, i, j, dp->oldcell[i + mj]);
+                               }
+                       mj += dp->ncols;
+               }
+               if (++dp->generation > MI_CYCLES(mi))
+                       init_demon(mi);
+               dp->state = 0;
+       } else {
+               if (dp->ncells[dp->state])
+                       draw_state(mi, dp->state);
+               dp->state++;
+       }
+       if (dp->redrawing) {
+               for (i = 0; i < REDRAWSTEP; i++) {
+                       if (dp->oldcell[dp->redrawpos]) {
+                               drawcell(mi, dp->redrawpos % dp->ncols, dp->redrawpos / dp->ncols,
+                                        dp->oldcell[dp->redrawpos]);
+                       }
+                       if (++(dp->redrawpos) >= dp->ncols * dp->nrows) {
+                               dp->redrawing = 0;
+                               break;
+                       }
+               }
+       }
+}
+void
+release_demon(ModeInfo * mi)
+{
+       if (demons != NULL) {
+               int         screen;
+
+               for (screen = 0; screen < MI_NUM_SCREENS(mi); screen++) {
+                       demonstruct *dp = &demons[screen];
+                       int         shade;
+
+                       if (dp->stippledGC != None) {
+                               XFreeGC(MI_DISPLAY(mi), dp->stippledGC);
+                       }
+                       for (shade = 0; shade < dp->init_bits; shade++)
+                               XFreePixmap(MI_DISPLAY(mi), dp->pixmaps[shade]);
+                       free_struct(dp);
+               }
+               (void) free((void *) demons);
+               demons = NULL;
+       }
+} void
+
+refresh_demon(ModeInfo * mi)
+{
+       demonstruct *dp = &demons[MI_SCREEN(mi)];
+
+       dp->redrawing = 1;
+       dp->redrawpos = 0;
+}
diff --git a/hacks/discrete.c b/hacks/discrete.c
new file mode 100644 (file)
index 0000000..7f336a6
--- /dev/null
@@ -0,0 +1,410 @@
+/* -*- Mode: C; tab-width: 4 -*- */
+/* discrete --- chaotic mappings */
+
+#if !defined( lint ) && !defined( SABER )
+static const char sccsid[] = "@(#)discrete.c 4.10 98/04/24 xlockmore";
+
+#endif
+
+/*-
+ * Copyright (c) 1996 by Tim Auckland <Tim.Auckland@Sun.COM>
+ *
+ * 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.
+ *
+ * This file is provided AS IS with no warranties of any kind.  The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof.  In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * "discrete" shows a number of fractals based on the "discrete map"
+ * type of dynamical systems.  They include a different way of looking
+ * at the HOPALONG system, an inverse julia-set iteration, the "Standard
+ * Map" and the "Bird in a Thornbush" fractal.
+ *
+ * Revision History:
+ * 31-Jul-97: Ported to xlockmore-4
+ * 08-Aug-96: Adapted from hop.c Copyright (c) 1991 by Patrick J. Naughton.
+ */
+
+#ifdef STANDALONE
+# define PROGCLASS             "Discrete"
+# define HACK_INIT             init_discrete
+# define HACK_DRAW             draw_discrete
+# define discrete_opts xlockmore_opts
+# define SMOOTH_COLORS
+# define BRIGHT_COLORS
+# define DEFAULTS              "*delay:  1000 \n" \
+                                               "*count:  4096 \n" \
+                                               "*cycles: 2500 \n" \
+                                               "*ncolors: 100 \n"
+
+# include "xlockmore.h"                /* in xscreensaver distribution */
+# include "erase.h"
+
+#else /* STANDALONE */
+# include "xlock.h"            /* in xlockmore distribution */
+#endif /* STANDALONE */
+
+ModeSpecOpt discrete_opts =
+{0, NULL, 0, NULL, NULL};
+
+#ifdef USE_MODULES
+ModStruct   discrete_description =
+{"discrete", "init_discrete", "draw_discrete", "release_discrete",
+ "refresh_discrete", "init_discrete", NULL, &discrete_opts,
+ 1000, 4096, 2500, 1, 64, 1.0, "",
+ "Shows various discrete maps", 0, NULL};
+
+#endif
+
+enum ftypes {
+       SQRT, BIRDIE, STANDARD, TRIG, CUBIC, HENON, AILUJ, HSHOE, DELOG
+};
+
+/*#define TEST STANDARD */
+
+#define BIASES 18
+static int  bias[BIASES] =
+{
+       STANDARD, STANDARD, STANDARD, STANDARD,
+       SQRT, SQRT, SQRT, SQRT,
+       BIRDIE, BIRDIE, BIRDIE,
+       AILUJ, AILUJ, AILUJ,
+       TRIG, TRIG,
+       CUBIC,
+       HENON,
+};
+
+typedef struct {
+       int         maxx;
+       int         maxy;       /* max of the screen */
+       double      a;
+       double      b;
+       double      c;
+       double      d;
+       double      e;
+       double      i;
+       double      j;          /* discrete parameters */
+       double      ic;
+       double      jc;
+       double      is;
+       double      js;
+       int         inc;
+       int         pix;
+       enum ftypes op;
+       int         count;
+       XPoint     *pointBuffer;        /* pointer for XDrawPoints */
+} discretestruct;
+
+static discretestruct *discretes = NULL;
+
+void
+init_discrete(ModeInfo * mi)
+{
+       double      range;
+       discretestruct *hp;
+
+       if (discretes == NULL) {
+               if ((discretes =
+                    (discretestruct *) calloc(MI_NUM_SCREENS(mi),
+                                          sizeof (discretestruct))) == NULL)
+                       return;
+       }
+       hp = &discretes[MI_SCREEN(mi)];
+
+
+       hp->maxx = MI_WIDTH(mi);
+       hp->maxy = MI_HEIGHT(mi);
+#ifdef TEST
+       hp->op = TEST;
+#else
+       hp->op = bias[LRAND() % BIASES];
+#endif
+       switch (hp->op) {
+               case HSHOE:
+                       hp->ic = 0;
+                       hp->jc = 0;
+                       hp->is = hp->maxx / (4);
+                       hp->js = hp->maxy / (4);
+                       hp->a = 0.5;
+                       hp->b = 0.5;
+                       hp->c = 0.2;
+                       hp->d = -1.25;
+                       hp->e = 1;
+                       hp->i = hp->j = 0.0;
+                       break;
+               case DELOG:
+                       hp->ic = 0.5;
+                       hp->jc = 0.3;
+                       hp->is = hp->maxx / 1.5;
+                       hp->js = hp->maxy / 1.5;
+                       hp->a = 2.176399;
+                       hp->i = hp->j = 0.01;
+                       break;
+               case HENON:
+                       hp->jc = ((LRAND() / MAXRAND) * 2.0 - 1.0) * 0.4;
+                       hp->ic = 1.3 * (1 - (hp->jc * hp->jc) / (0.4 * 0.4));
+                       hp->is = hp->maxx;
+                       hp->js = hp->maxy * 1.5;
+                       hp->a = 1;
+                       hp->b = 1.4;
+                       hp->c = 0.3;
+                       hp->i = hp->j = 0;
+                       break;
+               case SQRT:
+                       hp->ic = 0;
+                       hp->jc = 0;
+                       hp->is = 1;
+                       hp->js = 1;
+                       range = sqrt((double) hp->maxx * 2 * hp->maxx * 2 +
+                                    (double) hp->maxy * 2 * hp->maxy * 2) /
+                               (10.0 + LRAND() % 10);
+
+                       hp->a = (LRAND() / MAXRAND) * range - range / 2.0;
+                       hp->b = (LRAND() / MAXRAND) * range - range / 2.0;
+                       hp->c = (LRAND() / MAXRAND) * range - range / 2.0;
+                       if (!(LRAND() % 2))
+                               hp->c = 0.0;
+                       hp->i = hp->j = 0.0;
+                       break;
+               case STANDARD:
+                       hp->ic = M_PI;
+                       hp->jc = M_PI;
+                       hp->is = hp->maxx / (M_PI * 2);
+                       hp->js = hp->maxy / (M_PI * 2);
+                       hp->a = 0;      /* decay */
+                       hp->b = (LRAND() / MAXRAND) * 2.0;
+                       hp->c = 0;
+                       hp->i = M_PI;
+                       hp->j = M_PI;
+                       break;
+               case BIRDIE:
+                       hp->ic = 0;
+                       hp->jc = 0;
+                       hp->is = hp->maxx / 2;
+                       hp->js = hp->maxy / 2;
+                       hp->a = 1.99 + ((LRAND() / MAXRAND) * 2.0 - 1.0) * 0.2;
+                       hp->b = 0;
+                       hp->c = 0.8 + ((LRAND() / MAXRAND) * 2.0 - 1.0) * 0.1;
+                       hp->i = hp->j = 0;
+                       break;
+               case TRIG:
+                       hp->a = 5;
+                       hp->b = 0.5 + ((LRAND() / MAXRAND) * 2.0 - 1.0) * 0.3;
+                       hp->ic = hp->a;
+                       hp->jc = 0;
+                       hp->is = hp->maxx / (hp->b * 20);
+                       hp->js = hp->maxy / (hp->b * 20);
+                       hp->i = hp->j = 0;
+                       break;
+               case CUBIC:
+                       hp->a = 2.77;
+                       hp->b = 0.1 + ((LRAND() / MAXRAND) * 2.0 - 1.0) * 0.1;
+                       hp->ic = 0;
+                       hp->jc = 0;
+                       hp->is = hp->maxx / 4;
+                       hp->js = hp->maxy / 4;
+                       hp->i = hp->j = 0.1;
+                       break;
+               case AILUJ:
+                       {
+                               int         i;
+                               double      x, y, xn, yn;
+
+                               hp->ic = 0;
+                               hp->jc = 0;
+                               hp->is = hp->maxx / 4;
+                               hp->js = hp->maxx / 4;
+                               do {
+                                       hp->a = ((LRAND() / MAXRAND) * 2.0 - 1.0) * 1.5 - 0.5;
+                                       hp->b = ((LRAND() / MAXRAND) * 2.0 - 1.0) * 1.5;
+                                       x = y = 0;
+#define MAXITER 10
+                                       for (i = 0; i < MAXITER && x * x + y * y < 13; i++) {   /* 'Brot calc */
+                                               xn = x * x - y * y + hp->a;
+                                               yn = 2 * x * y + hp->b;
+                                               x = xn;
+                                               y = yn;
+                                       }
+                               } while (i < MAXITER);  /* wait for a connected set */
+                               hp->i = hp->j = 0.1;
+                               break;
+                       }
+       }
+       hp->pix = 0;
+       hp->inc = 0;
+
+       if (hp->pointBuffer == NULL)
+               hp->pointBuffer = (XPoint *) malloc(MI_COUNT(mi) * sizeof (XPoint));
+
+       /* Clear the background. */
+       MI_CLEARWINDOW(mi);
+
+       hp->count = 0;
+}
+
+
+void
+draw_discrete(ModeInfo * mi)
+{
+       Display    *dsp = MI_DISPLAY(mi);
+       Window      win = MI_WINDOW(mi);
+       double      oldj, oldi;
+       int         batchcount = MI_COUNT(mi);
+       int         cycles = MI_CYCLES(mi);
+       int         k;
+       XPoint     *xp;
+       GC          gc = MI_GC(mi);
+       discretestruct *hp = &discretes[MI_SCREEN(mi)];
+
+       k = batchcount;
+       xp = hp->pointBuffer;
+
+       hp->inc++;
+
+       if (MI_NPIXELS(mi) > 2) {
+               XSetForeground(dsp, gc, MI_PIXEL(mi, hp->pix));
+               if (++hp->pix >= MI_NPIXELS(mi))
+                       hp->pix = 0;
+       }
+       while (k--) {
+               oldj = hp->j;
+               oldi = hp->i;
+               switch (hp->op) {
+                       case HSHOE:
+                               {
+                                       int         i;
+
+#if 0
+                                       if (!k) {
+                                               XSetForeground(dsp, gc, MI_BLACK_PIXEL(mi));
+                                               XFillRectangle(dsp, win, gc, 0, 0, hp->maxx, hp->maxy);
+                                               XSetForeground(dsp, gc, MI_PIXEL(mi, hp->pix));
+                                       } else
+#endif
+#define HD
+#ifdef HD
+                                       if (k < batchcount / 4) {
+                                               hp->i = ((double) k / batchcount) * 8 - 1;
+                                               hp->j = 1;
+                                       } else if (k < batchcount / 2) {
+                                               hp->i = 1;
+                                               hp->j = 3 - ((double) k / batchcount) * 8;
+                                       } else if (k < 3 * batchcount / 4) {
+                                               hp->i = 5 - ((double) k / batchcount) * 8;
+                                               hp->j = -1;
+                                       } else {
+                                               hp->i = -1;
+                                               hp->j = ((double) k / batchcount) * 8 - 7;
+                                       }
+                                       for (i = 1; i < (hp->inc % 15); i++) {
+                                               oldj = hp->j;
+                                               oldi = hp->i;
+#endif
+                                               hp->i = (hp->a * oldi + hp->b) * oldj;
+                                               hp->j = (hp->e - hp->d + hp->c * oldi) * oldj * oldj - hp->c * oldi + hp->d;
+#ifdef HD
+                                       }
+#endif
+                                       break;
+                               }
+                       case DELOG:
+                               hp->j = oldi;
+                               hp->i = hp->a * oldi * (1 - oldj);
+                               break;
+                       case HENON:
+                               hp->i = oldj + hp->a - hp->b * oldi * oldi;
+                               hp->j = hp->c * oldi;
+                               break;
+                       case SQRT:
+                               if (k) {
+                                       hp->j = hp->a + hp->i;
+                                       hp->i = -oldj + (hp->i < 0
+                                       ? sqrt(fabs(hp->b * (hp->i - hp->c)))
+                                                        : -sqrt(fabs(hp->b * (hp->i - hp->c))));
+                               } else {
+                                       static int  s = 1;
+
+                                       hp->i = s * hp->inc * hp->maxx / cycles / 2;
+                                       hp->j = hp->a + hp->i;
+                                       s = -s;
+                               }
+                               break;
+                       case STANDARD:
+                               if (k) {
+                                       hp->j = (1 - hp->a) * oldj + hp->b * sin(oldi) + hp->a * hp->c;
+                                       hp->j = fmod(hp->j + 2 * M_PI, 2 * M_PI);
+                                       hp->i = oldi + hp->j;
+                                       hp->i = fmod(hp->i + 2 * M_PI, 2 * M_PI);
+                               } else {
+                                       static int  s = 1;
+
+                                       hp->j = M_PI + fmod(s * hp->inc * 2 * M_PI / (cycles - 0.5), M_PI);
+                                       hp->i = M_PI;
+                                       s = -s;
+                               }
+                               break;
+                       case BIRDIE:
+                               hp->j = oldi;
+                               hp->i = (1 - hp->c) * cos(M_PI * hp->a * oldj) + hp->c * hp->b;
+                               hp->b = oldj;
+                               break;
+                       case TRIG:
+                               {
+                                       double      r2 = oldi * oldi + oldj * oldj;
+
+                                       hp->i = hp->a + hp->b * (oldi * cos(r2) - oldj * sin(r2));
+                                       hp->j = hp->b * (oldj * cos(r2) + oldi * sin(r2));
+                               }
+                               break;
+                       case CUBIC:
+                               hp->i = oldj;
+                               hp->j = hp->a * oldj - oldj * oldj * oldj - hp->b * oldi;
+                               break;
+                       case AILUJ:
+                               hp->i = ((LRAND() < MAXRAND / 2) ? -1 : 1) *
+                                       sqrt(((oldi - hp->a) +
+                                             sqrt((oldi - hp->a) * (oldi - hp->a) + (oldj - hp->b) * (oldj - hp->b))) / 2);
+                               hp->j = (oldj - hp->b) / (2 * hp->i);
+                               break;
+               }
+               xp->x = hp->maxx / 2 + (int) ((hp->i - hp->ic) * hp->is);
+               xp->y = hp->maxy / 2 - (int) ((hp->j - hp->jc) * hp->js);
+               xp++;
+       }
+       XDrawPoints(dsp, win, gc, hp->pointBuffer, batchcount, CoordModeOrigin);
+       if (++hp->count > cycles) {
+#ifdef STANDALONE
+               erase_full_window(MI_DISPLAY(mi), MI_WINDOW(mi));
+#endif /* STANDALONE */
+               init_discrete(mi);
+       }
+}
+
+void
+release_discrete(ModeInfo * mi)
+{
+       if (discretes != NULL) {
+               int         screen;
+
+               for (screen = 0; screen < MI_NUM_SCREENS(mi); screen++) {
+                       discretestruct *hp = &discretes[screen];
+
+                       if (hp->pointBuffer != NULL)
+                               (void) free((void *) hp->pointBuffer);
+               }
+               (void) free((void *) discretes);
+               discretes = NULL;
+       }
+}
+
+void
+refresh_discrete(ModeInfo * mi)
+{
+       MI_CLEARWINDOW(mi);
+}
diff --git a/hacks/distort.c b/hacks/distort.c
new file mode 100644 (file)
index 0000000..74bcf45
--- /dev/null
@@ -0,0 +1,600 @@
+/* -*- mode: C; tab-width: 4 -*-
+ * xscreensaver, Copyright (c) 1992, 1993, 1994, 1996, 1997, 1998
+ * Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software 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.  No representations are made about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or 
+ * implied warranty.
+ */
+
+/* distort
+ * by Jonas Munsin (jmunsin@iki.fi) and Jamie Zawinski <jwz@jwz.org>
+ * TODO:
+ *     -check the allocations in init_round_lense again, maybe make it possible again
+ *      to use swamp without pre-allocating/calculating (although that
+ *      makes it slower) - -swamp is memory hungry
+ *     -more distortion matrices (fortunately, I'm out of ideas :)
+ * Stuff that would be cool but probably too much of a resource hog:
+ *     -some kind of interpolation to avoid jaggies
+ * program idea borrowed from a screensaver on a non-*NIX OS,
+ */
+
+#include <math.h>
+#include "screenhack.h"
+#include <X11/Xutil.h>
+
+#ifdef HAVE_XSHM_EXTENSION
+# include "xshm.h"
+static Bool use_shm;
+static XShmSegmentInfo shm_info;
+#endif /* HAVE_XSHM_EXTENSION */
+
+struct coo {
+       int x;
+       int y;
+       int r, r_change;
+       int xmove, ymove;
+};
+static struct coo xy_coo[10];
+
+static int delay, radius, speed, number, blackhole, vortex, magnify, reflect;
+static XWindowAttributes xgwa;
+static GC gc;
+static Window g_window;
+static Display *g_dpy;
+static unsigned long black_pixel;
+
+static XImage *orig_map, *buffer_map;
+
+static int ***from;
+static int ****from_array;
+static void (*effect) (int) = NULL;
+static void move_lense(int);
+static void swamp_thing(int);
+static void new_rnd_coo(int);
+static void init_round_lense(void);
+static void (*draw) (int) = NULL;
+static void reflect_draw(int);
+static void plain_draw(int);
+
+static void init_distort(Display *dpy, Window window) 
+{
+       XGCValues gcv;
+       long gcflags;
+       int i;
+
+       g_window=window;
+       g_dpy=dpy;
+
+       delay = get_integer_resource("delay", "Integer");
+       radius = get_integer_resource("radius", "Integer");
+       speed = get_integer_resource("speed", "Integer");
+       number = get_integer_resource("number", "Integer");
+
+#ifdef HAVE_XSHM_EXTENSION
+       use_shm = get_boolean_resource("useSHM", "Boolean");
+#endif /* HAVE_XSHM_EXTENSION */
+       
+       blackhole = get_boolean_resource("blackhole", "Boolean");
+       vortex = get_boolean_resource("vortex", "Boolean");
+       magnify = get_boolean_resource("magnify", "Boolean");
+       reflect = get_boolean_resource("reflect", "Boolean");
+       
+       if (get_boolean_resource("swamp", "Boolean"))
+               effect = &swamp_thing;
+       if (get_boolean_resource("bounce", "Boolean"))
+               effect = &move_lense;
+
+       if (effect == NULL && radius == 0 && speed == 0 && number == 0
+               && !blackhole && !vortex && !magnify && !reflect) {
+/* if no cmdline options are given, randomly choose one of:
+ * -radius 50 -number 4 -speed 1 -bounce
+ * -radius 50 -number 4 -speed 1 -blackhole
+ * -radius 50 -number 4 -speed 1 -vortex
+ * -radius 50 -number 4 -speed 1 -vortex -magnify
+ * -radius 50 -number 4 -speed 1 -vortex -magnify -blackhole
+ * -radius 100 -number 1 -speed 2 -bounce
+ * -radius 100 -number 1 -speed 2 -blackhole
+ * -radius 100 -number 1 -speed 2 -vortex
+ * -radius 100 -number 1 -speed 2 -vortex -magnify
+ * -radius 100 -number 1 -speed 2 -vortex -magnify -blackhole
+ * -radius 50 -number 4 -speed 2 -swamp
+ * -radius 50 -number 4 -speed 2 -swamp -blackhole
+ * -radius 50 -number 4 -speed 2 -swamp -vortex
+ * -radius 50 -number 4 -speed 2 -swamp -vortex -magnify
+ * -radius 50 -number 4 -speed 2 -swamp -vortex -magnify -blackhole
+ * -radius 80 -number 1 -speed 2 -reflect
+ * -radius 50 -number 3 -speed 2 -reflect
+ */
+               
+               i = (random() % 17);
+
+               draw = &plain_draw;
+
+               switch (i) {
+                       case 0:
+                               radius=50;number=4;speed=1;
+                               effect=&move_lense;break;
+                       case 1:
+                               radius=50;number=4;speed=1;blackhole=1;
+                               effect=&move_lense;break;
+                       case 2:
+                               radius=50;number=4;speed=1;vortex=1;
+                               effect=&move_lense;break;
+                       case 3:
+                               radius=50;number=4;speed=1;vortex=1;magnify=1;
+                               effect=&move_lense;break;
+                       case 4:
+                               radius=50;number=4;speed=1;vortex=1;magnify=1;blackhole=1;
+                               effect=&move_lense;break;
+                       case 5:
+                               radius=100;number=1;speed=2;
+                               effect=&move_lense;break;
+                       case 6:
+                               radius=100;number=1;speed=2;blackhole=1;
+                               effect=&move_lense;break;
+                       case 7:
+                               radius=100;number=1;speed=2;vortex=1;
+                               effect=&move_lense;break;
+                       case 8:
+                               radius=100;number=1;speed=2;vortex=1;magnify=1;
+                               effect=&move_lense;break;
+                       case 9:
+                               radius=100;number=1;speed=2;vortex=1;magnify=1;blackhole=1;
+                               effect=&move_lense;break;
+                       case 10:
+                               radius=50;number=4;speed=2;
+                               effect=&swamp_thing;break;
+                       case 11:
+                               radius=50;number=4;speed=2;blackhole=1;
+                               effect=&swamp_thing;break;
+                       case 12:
+                               radius=50;number=4;speed=2;vortex=1;
+                               effect=&swamp_thing;break;
+                       case 13:
+                               radius=50;number=4;speed=2;vortex=1;magnify=1;
+                               effect=&swamp_thing;break;
+                       case 14:
+                               radius=50;number=4;speed=2;vortex=1;magnify=1;blackhole=1;
+                               effect=&swamp_thing;break;
+                       case 15:
+                               radius=80;number=1;speed=2;reflect=1;
+                               draw = &reflect_draw;effect = &move_lense;break;
+                       case 16: default:
+                               radius=50;number=4;speed=2;reflect=1;
+                               draw = &reflect_draw;effect = &move_lense;break;
+               }
+
+       }
+
+       if (delay < 0)
+               delay = 0;
+       if (radius <= 0)
+               radius = 60;
+       if (speed <= 0) 
+               speed = 2;
+       if (number <= 0)
+               number=1;
+       if (number >= 10)
+               number=1;
+       if (effect == NULL)
+               effect = &move_lense;
+       if (reflect) {
+               draw = &reflect_draw;
+               effect = &move_lense;
+       }
+       if (draw == NULL)
+               draw = &plain_draw;
+
+       XGetWindowAttributes (dpy, window, &xgwa);
+       black_pixel = BlackPixelOfScreen( xgwa.screen );
+
+       gcv.function = GXcopy;
+       gcv.subwindow_mode = IncludeInferiors;
+       gcflags = GCForeground |GCFunction;
+       if (use_subwindow_mode_p(xgwa.screen, window)) /* see grabscreen.c */
+               gcflags |= GCSubwindowMode;
+       gc = XCreateGC (dpy, window, gcflags, &gcv);
+
+       grab_screen_image (xgwa.screen, window);
+
+       buffer_map = 0;
+       orig_map = XGetImage(dpy, window, 0, 0, xgwa.width, xgwa.height,
+                                                ~0L, ZPixmap);
+
+# ifdef HAVE_XSHM_EXTENSION
+
+       if (use_shm)
+         {
+               buffer_map = create_xshm_image(dpy, xgwa.visual, orig_map->depth,
+                                                                          ZPixmap, 0, &shm_info,
+                                                                          2*radius + speed + 2,
+                                                                          2*radius + speed + 2);
+               if (!buffer_map)
+                 use_shm = False;
+         }
+# endif /* HAVE_XSHM_EXTENSION */
+
+       if (!buffer_map)
+         {
+               buffer_map = XCreateImage(dpy, xgwa.visual,
+                                                                 orig_map->depth, ZPixmap, 0, 0,
+                                                                 2*radius + speed + 2, 2*radius + speed + 2,
+                                                                 8, 0);
+               buffer_map->data = (char *)
+                 calloc(buffer_map->height, buffer_map->bytes_per_line);
+       }
+
+       init_round_lense();
+
+       for (i = 0; i < number; i++) {
+               new_rnd_coo(i);
+               if (number != 1)
+                       xy_coo[i].r = (i*radius)/(number-1); /* "randomize" initial */
+               else
+                        xy_coo[i].r = 0;
+               xy_coo[i].r_change = speed + (i%2)*2*(-speed);  /* values a bit */
+               xy_coo[i].xmove = speed + (i%2)*2*(-speed);
+               xy_coo[i].ymove = speed + (i%2)*2*(-speed);
+       }
+}
+
+/* example: initializes a "see-trough" matrix */
+/* static void make_null_lense(void)
+{
+       int i, j;
+       for (i = 0; i < 2*radius+speed+2; i++) {
+               for (j = 0 ; j < 2*radius+speed+2 ; j++) {
+                       from[i][j][0]=i;
+                       from[i][j][1]=j;
+               }
+       } 
+}
+*/
+
+/* makes a lense with the Radius=loop and centred in
+ * the point (radius, radius)
+ */
+static void make_round_lense(int radius, int loop)
+{
+       int i, j;
+
+       for (i = 0; i < 2*radius+speed+2; i++) {
+               for(j = 0; j < 2*radius+speed+2; j++) {
+                       double r, d;
+                       r = sqrt ((i-radius)*(i-radius)+(j-radius)*(j-radius));
+                       if (loop == 0)
+                         d=0.0;
+                       else
+                         d=r/loop;
+
+                       if (r < loop-1) {
+
+                               if (vortex) { /* vortex-twist effect */
+                                       double angle;
+               /* this one-line formula for getting a nice rotation angle is borrowed
+                * (with permission) from the whirl plugin for gimp,
+                * Copyright (C) 1996 Federico Mena Quintero
+                */
+               /* 2.5 is just a constant used because it looks good :) */
+                                       angle = 2.5*(1-d)*(1-d);
+
+        /* Avoid atan2: DOMAIN error message */
+                                       if ((radius-j) == 0.0 && (radius-i) == 0.0) {
+                                               from[i][j][0] = radius + cos(angle)*r;
+                                               from[i][j][1] = radius + sin(angle)*r;
+                                       } else {
+                                       from[i][j][0] = radius +
+                                                                       cos(angle - atan2(radius-j, -(radius-i)))*r;
+                                       from[i][j][1] = radius +
+                                                                       sin(angle - atan2(radius-j, -(radius-i)))*r;
+                                       }
+                                       if (magnify) {
+                                               r = sin(d*M_PI_2);
+                                               if (blackhole && r != 0) /* blackhole effect */
+                                                       r = 1/r;
+                                               from[i][j][0] = radius + (from[i][j][0]-radius)*r;
+                                               from[i][j][1] = radius + (from[i][j][1]-radius)*r;
+                                       }
+                               } else { /* default is to magnify */
+                                       r = sin(d*M_PI_2);
+                               
+       /* raising r to different power here gives different amounts of
+        * distortion, a negative value sucks everything into a black hole
+        */
+                               /*      r = r*r; */
+                                       if (blackhole && r != 0) /* blackhole effect */
+                                               r = 1/r;
+                                                                       /* bubble effect (and blackhole) */
+                                       from[i][j][0] = radius + (i-radius)*r;
+                                       from[i][j][1] = radius + (j-radius)*r;
+                               }
+                       } else { /* not inside loop */
+                               from[i][j][0] = i;
+                               from[i][j][1] = j;
+                       }
+               }
+       }
+}
+
+#ifndef EXIT_FAILURE
+# define EXIT_FAILURE -1
+#endif
+
+static void allocate_lense(void)
+{
+       int i, j;
+       /* maybe this should be redone so that from[][][] is in one block;
+        * then pointers could be used instead of arrays in some places (and
+        * maybe give a speedup - maybe also consume less memory)
+        */
+
+       from = (int ***)malloc((2*radius+speed+2) * sizeof(int **));
+       if (from == NULL) {
+               perror("distort");
+               exit(EXIT_FAILURE);
+       }
+       for (i = 0; i < 2*radius+speed+2; i++) {
+               from[i] = (int **)malloc((2*radius+speed+2) * sizeof(int *));
+               if (from[i] == NULL) {
+                       perror("distort");
+                       exit(EXIT_FAILURE);
+               }
+               for (j = 0; j < 2*radius+speed+2; j++) {
+                       from[i][j] = (int *)malloc(2 * sizeof(int));
+                       if (from[i][j] == NULL) {
+                               perror("distort");
+                               exit(EXIT_FAILURE);
+                       }
+               }
+       }
+}
+
+/* from_array in an array containing precalculated from matrices,
+ * this is a double faced mem vs speed trade, it's faster, but eats
+ * _a lot_ of mem for large radius (is there a bug here? I can't see it)
+ */
+static void init_round_lense(void)
+{
+       int k;
+
+       if (effect == &swamp_thing) {
+               from_array = (int ****)malloc((radius+1)*sizeof(int ***));
+               for (k=0; k <= radius; k++) {
+                       allocate_lense();
+                       make_round_lense(radius, k);
+                       from_array[k] = from;
+               }
+       } else { /* just allocate one from[][][] */
+               allocate_lense();
+               make_round_lense(radius,radius);
+       }
+}
+
+
+/* generate an XImage of from[][][] and draw it on the screen */
+static void plain_draw(int k)
+{
+       int i, j;
+       for(i = 0 ; i < 2*radius+speed+2; i++) {
+               for(j = 0 ; j < 2*radius+speed+2 ; j++) {
+                       if (xy_coo[k].x+from[i][j][0] >= 0 &&
+                                       xy_coo[k].x+from[i][j][0] < xgwa.width &&
+                                       xy_coo[k].y+from[i][j][1] >= 0 &&
+                                       xy_coo[k].y+from[i][j][1] < xgwa.height)
+                               XPutPixel(buffer_map, i, j,
+                                               XGetPixel(orig_map,
+                                                       xy_coo[k].x+from[i][j][0],
+                                                       xy_coo[k].y+from[i][j][1]));
+               }
+       }
+
+       XPutImage(g_dpy, g_window, gc, buffer_map, 0, 0, xy_coo[k].x, xy_coo[k].y,
+                       2*radius+speed+2, 2*radius+speed+2);
+}
+
+/* generate an XImage from the reflect algoritm submitted by
+ * Randy Zack <randy@acucorp.com>
+ * draw really got too big and ugly so I split it up
+ * it should be possible to use the from[][] to speed it up
+ * (once I figure out the algorithm used :)
+ */
+static void reflect_draw(int k)
+{
+       int i, j;
+       int     cx, cy;
+       int     ly, lysq, lx, ny, dist, rsq = radius * radius;
+
+       cx = cy = radius;
+       if (xy_coo[k].ymove > 0)
+               cy += speed;
+       if (xy_coo[k].xmove > 0)
+               cx += speed;
+
+       for(i = 0 ; i < 2*radius+speed+2; i++) {
+               ly = i - cy;
+               lysq = ly * ly;
+               ny = xy_coo[k].y + i;
+               for(j = 0 ; j < 2*radius+speed+2 ; j++) {
+                       lx = j - cx;
+                       dist = lx * lx + lysq;
+                       if (dist > rsq ||
+                               ly < -radius || ly > radius ||
+                               lx < -radius || lx > radius)
+                               XPutPixel( buffer_map, j, i,
+                                                  XGetPixel( orig_map, xy_coo[k].x + j, ny ));
+                       else if (dist == 0)
+                               XPutPixel( buffer_map, j, i, black_pixel );
+                       else {
+                               int     x = xy_coo[k].x + cx + (lx * rsq / dist);
+                               int     y = xy_coo[k].y + cy + (ly * rsq / dist);
+                               if (x < 0 || x >= xgwa.width ||
+                                       y < 0 || y >= xgwa.height)
+                                       XPutPixel( buffer_map, j, i, black_pixel );
+                               else
+                                       XPutPixel( buffer_map, j, i,
+                                                          XGetPixel( orig_map, x, y ));
+                       }
+               }
+       }
+
+       XPutImage(g_dpy, g_window, gc, buffer_map, 0, 0, xy_coo[k].x, xy_coo[k].y,
+                       2*radius+speed+2, 2*radius+speed+2);
+}
+
+/* create a new, random coordinate, that won't interfer with any other
+ * coordinates, as the drawing routines would be significantly slowed
+ * down if they were to handle serveral layers of distortions
+ */
+static void new_rnd_coo(int k)
+{
+       int i;
+
+       xy_coo[k].x = (random() % (xgwa.width-2*radius));
+       xy_coo[k].y = (random() % (xgwa.height-2*radius));
+       
+       for (i = 0; i < number; i++) {
+               if (i != k) {
+                       if ((abs(xy_coo[k].x - xy_coo[i].x) <= 2*radius+speed+2)
+                        && (abs(xy_coo[k].y - xy_coo[i].y) <= 2*radius+speed+2)) {
+                               xy_coo[k].x = (random() % (xgwa.width-2*radius));
+                               xy_coo[k].y = (random() % (xgwa.height-2*radius));
+                               i=-1; /* ugly */
+                       } 
+               }
+       }
+}
+
+/* move lens and handle bounces with walls and other lenses */
+static void move_lense(int k)
+{
+       int i;
+
+       if (xy_coo[k].x + 2*radius + speed + 2 >= xgwa.width)
+               xy_coo[k].xmove = -abs(xy_coo[k].xmove);
+       if (xy_coo[k].x <= speed) 
+               xy_coo[k].xmove = abs(xy_coo[k].xmove);
+       if (xy_coo[k].y + 2*radius + speed + 2 >= xgwa.height)
+               xy_coo[k].ymove = -abs(xy_coo[k].ymove);
+       if (xy_coo[k].y <= speed)
+               xy_coo[k].ymove = abs(xy_coo[k].ymove);
+
+       xy_coo[k].x = xy_coo[k].x + xy_coo[k].xmove;
+       xy_coo[k].y = xy_coo[k].y + xy_coo[k].ymove;
+
+       for (i = 0; i < number; i++) {
+               if ((i != k)
+               
+/* This commented test is for rectangular lenses (not currently used) and
+ * the one used is for circular ones
+               && (abs(xy_coo[k].x - xy_coo[i].x) <= 2*radius)
+               && (abs(xy_coo[k].y - xy_coo[i].y) <= 2*radius)) { */
+
+               && ((xy_coo[k].x - xy_coo[i].x)*(xy_coo[k].x - xy_coo[i].x)
+                 + (xy_coo[k].y - xy_coo[i].y)*(xy_coo[k].y - xy_coo[i].y)
+                       <= 2*radius*2*radius)) {
+
+                       int x, y;
+                       x = xy_coo[k].xmove;
+                       y = xy_coo[k].ymove;
+                       xy_coo[k].xmove = xy_coo[i].xmove;
+                       xy_coo[k].ymove = xy_coo[i].ymove;
+                       xy_coo[i].xmove = x;
+                       xy_coo[i].ymove = y;
+               }
+       }
+
+}
+
+/* make xy_coo[k] grow/shrink */
+static void swamp_thing(int k)
+{
+       if (xy_coo[k].r >= radius)
+               xy_coo[k].r_change = -abs(xy_coo[k].r_change);
+       
+       if (xy_coo[k].r <= 0) {
+               from = from_array[0];
+               draw(k); 
+               xy_coo[k].r_change = abs(xy_coo[k].r_change);
+               new_rnd_coo(k);
+               xy_coo[k].r=xy_coo[k].r_change;
+               return;
+       }
+
+       xy_coo[k].r = xy_coo[k].r + xy_coo[k].r_change;
+
+       if (xy_coo[k].r >= radius)
+               xy_coo[k].r = radius;
+       if (xy_coo[k].r <= 0)
+               xy_coo[k].r=0;
+
+       from = from_array[xy_coo[k].r];
+}
+
+
+\f
+
+char *progclass = "Distort";
+
+char *defaults [] = {
+       "*dontClearRoot:                True",
+#ifdef __sgi    /* really, HAVE_READ_DISPLAY_EXTENSION */
+       "*visualID:                     Best",
+#endif
+
+       "*delay:                        10000",
+       "*radius:                       0",
+       "*speed:                        0",
+       "*number:                       0",
+       "*vortex:                       False",
+       "*magnify:                      False",
+       "*swamp:                        False",
+       "*bounce:                       False",
+       "*reflect:                      False",
+       "*blackhole:            False",
+#ifdef HAVE_XSHM_EXTENSION
+       "*useSHM:                       False",         /* xshm turns out not to help. */
+#endif /* HAVE_XSHM_EXTENSION */
+       0
+};
+
+XrmOptionDescRec options [] = {
+       { "-delay",     ".delay",       XrmoptionSepArg, 0 },
+       { "-radius",    ".radius",      XrmoptionSepArg, 0 },
+       { "-speed",     ".speed",       XrmoptionSepArg, 0 },
+       { "-number",    ".number",      XrmoptionSepArg, 0 },
+       { "-swamp",     ".swamp",       XrmoptionNoArg, "True" },
+       { "-bounce",    ".bounce",      XrmoptionNoArg, "True" },
+       { "-reflect",   ".reflect",     XrmoptionNoArg, "True" },
+       { "-vortex",    ".vortex",      XrmoptionNoArg, "True" },
+       { "-magnify",   ".magnify",     XrmoptionNoArg, "True" },
+       { "-blackhole", ".blackhole",   XrmoptionNoArg, "True" },
+#ifdef HAVE_XSHM_EXTENSION
+       { "-shm",               ".useSHM",      XrmoptionNoArg, "True" },
+       { "-no-shm",    ".useSHM",      XrmoptionNoArg, "False" },
+#endif /* HAVE_XSHM_EXTENSION */
+       { 0, 0, 0, 0 }
+};
+
+
+void screenhack(Display *dpy, Window window)
+{
+       int k;
+
+       init_distort (dpy, window);
+       while (1) {
+               for (k = 0; k < number; k++) {
+                       effect(k);
+                       draw(k);
+               }
+
+               XSync(dpy, False);
+        screenhack_handle_events (dpy);
+               if (delay) usleep(delay);
+       }
+
+}
diff --git a/hacks/drift.c b/hacks/drift.c
new file mode 100644 (file)
index 0000000..6e5399f
--- /dev/null
@@ -0,0 +1,630 @@
+/* -*- Mode: C; tab-width: 4 -*-
+ * drift --- drifting recursive fractal cosmic flames.
+ */
+#if !defined( lint ) && !defined( SABER )
+static const char sccsid[] = "@(#)drift.c      4.02 97/04/01 xlockmore";
+#endif
+
+/* Copyright (c) 1991 by Patrick J. Naughton.
+ *
+ * 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.
+ *
+ * This file is provided AS IS with no warranties of any kind.  The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof.  In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * Revision History:
+ * 10-May-97: jwz@jwz.org: turned into a standalone program.
+ * 01-Jan-97: Moved new flame to drift.  Compile time options now run time.
+ * 01-Jun-95: Updated by Scott Draves.
+ * 27-Jun-91: vary number of functions used.
+ * 24-Jun-91: fixed portability problem with integer mod (%).
+ * 06-Jun-91: Written. (received from Scott Draves, spot@cs.cmu.edu).
+ */
+
+#ifdef STANDALONE
+# define PROGCLASS                                     "Drift"
+# define HACK_INIT                                     init_drift
+# define HACK_DRAW                                     draw_drift
+# define drift_opts                                    xlockmore_opts
+# define DEFAULTS      "*count:                30    \n"                       \
+                                       "*delay:                10000 \n"                       \
+                                       "*ncolors:              200   \n"
+# define SMOOTH_COLORS
+# include "xlockmore.h"                                /* from the xscreensaver distribution */
+# include "erase.h"
+#else  /* !STANDALONE */
+# include "xlock.h"                                    /* from the xlockmore distribution */
+#endif /* !STANDALONE */
+
+
+#define MAXBATCH1      200     /* mono */
+#define MAXBATCH2      20      /* color */
+#define FUSE           10      /* discard this many initial iterations */
+#define NMAJORVARS     7
+#define MAXLEV 10
+
+#define DEF_GROW "False"       /* Grow fractals instead of animating one at a time,
+                                  would then be like flame */
+#define DEF_LISS "False"       /* if this is defined then instead of a point
+                                  bouncing around in a high dimensional sphere, we
+                                  use lissojous figures.  Only makes sense if
+                                  grow is false. */
+
+static Bool grow;
+static Bool liss;
+
+static XrmOptionDescRec opts[] =
+{
+       {"-grow", ".drift.grow", XrmoptionNoArg, (caddr_t) "on"},
+       {"+grow", ".drift.grow", XrmoptionNoArg, (caddr_t) "off"},
+       {"-liss", ".drift.trail", XrmoptionNoArg, (caddr_t) "on"},
+       {"+liss", ".drift.trail", XrmoptionNoArg, (caddr_t) "off"}
+};
+static argtype vars[] =
+{
+       {(caddr_t *) & grow, "grow", "Grow", DEF_GROW, t_Bool},
+       {(caddr_t *) & liss, "liss", "Liss", DEF_LISS, t_Bool}
+};
+static OptionStruct desc[] =
+{
+       {"-/+grow", "turn on/off growing fractals, else they are animated"},
+       {"-/+liss", "turn on/off using lissojous figures to get points"}
+};
+
+ModeSpecOpt drift_opts = { 4, opts, 2, vars, desc };
+
+
+typedef struct {
+       /* shape of current flame */
+       int         nxforms;
+       double      f[2][3][MAXLEV];    /* a bunch of non-homogeneous xforms */
+       int         variation[10];      /* for each xform */
+
+       /* Animation */
+       double      df[2][3][MAXLEV];
+
+       /* high-level control */
+       int         mode;       /* 0->slow/single 1->fast/many */
+       int         nfractals;  /* draw this many fractals */
+       int         major_variation;
+       int         fractal_len;        /* pts/fractal */
+       int         color;
+       int         rainbow;    /* more than one color per fractal
+                                  1-> computed by adding dimension to fractal */
+
+       int         width, height;      /* of window */
+       int         timer;
+
+       /* draw info about current flame */
+       int         fuse;       /* iterate this many before drawing */
+       int         total_points;       /* draw this many pts before fractal ends */
+       int         npoints;    /* how many we've computed but not drawn */
+       XPoint      pts[MAXBATCH1];     /* here they are */
+       unsigned long pixcol;
+       /* when drawing in color, we have a buffer per color */
+       int         ncpoints[NUMCOLORS];
+       XPoint      cpts[NUMCOLORS][MAXBATCH2];
+
+       double      x, y, c;
+       int         liss_time;
+       Bool        grow, liss;
+} driftstruct;
+
+static driftstruct *drifts = NULL;
+
+static short
+halfrandom(int mv)
+{
+       static short lasthalf = 0;
+       unsigned long r;
+
+       if (lasthalf) {
+               r = lasthalf;
+               lasthalf = 0;
+       } else {
+               r = LRAND();
+               lasthalf = r >> 16;
+       }
+       r = r % mv;
+       return r;
+}
+
+static int
+frandom(int n)
+{
+       static long saved_random_bits = 0;
+       static int  nbits = 0;
+       int         result;
+
+       if (3 > nbits) {
+               saved_random_bits = LRAND();
+               nbits = 31;
+       }
+       switch (n) {
+               case 2:
+                       result = saved_random_bits & 1;
+                       saved_random_bits >>= 1;
+                       nbits -= 1;
+                       return result;
+
+               case 3:
+                       result = saved_random_bits & 3;
+                       saved_random_bits >>= 2;
+                       nbits -= 2;
+                       if (3 == result)
+                               return frandom(3);
+                       return result;
+
+               case 4:
+                       result = saved_random_bits & 3;
+                       saved_random_bits >>= 2;
+                       nbits -= 2;
+                       return result;
+
+               case 5:
+                       result = saved_random_bits & 7;
+                       saved_random_bits >>= 3;
+                       nbits -= 3;
+                       if (4 < result)
+                               return frandom(5);
+                       return result;
+               default:
+                       (void) fprintf(stderr, "bad arg to frandom\n");
+                       exit(1);
+       }
+       return 0;
+}
+
+#define DISTRIB_A (halfrandom(7000) + 9000)
+#define DISTRIB_B ((frandom(3) + 1) * (frandom(3) + 1) * 120000)
+#define LEN(x) (sizeof(x)/sizeof((x)[0]))
+
+static void
+initmode(ModeInfo * mi, int mode)
+{
+       driftstruct *dp = &drifts[MI_SCREEN(mi)];
+
+#define VARIATION_LEN 14
+
+       dp->mode = mode;
+
+       dp->major_variation = halfrandom(VARIATION_LEN);
+       /*  0, 0, 1, 1, 2, 2, 3, 4, 4, 5, 5, 6, 6, 6 */
+       dp->major_variation = ((dp->major_variation >= VARIATION_LEN >> 1) &&
+                              (dp->major_variation < VARIATION_LEN - 1)) ?
+               (dp->major_variation + 1) >> 1 : dp->major_variation >> 1;
+
+       if (dp->grow) {
+               dp->rainbow = 0;
+               if (mode) {
+                       if (!dp->color || halfrandom(8)) {
+                               dp->nfractals = halfrandom(30) + 5;
+                               dp->fractal_len = DISTRIB_A;
+                       } else {
+                               dp->nfractals = halfrandom(5) + 5;
+                               dp->fractal_len = DISTRIB_B;
+                       }
+               } else {
+                       dp->rainbow = dp->color;
+                       dp->nfractals = 1;
+                       dp->fractal_len = DISTRIB_B;
+               }
+       } else {
+               dp->nfractals = 1;
+               dp->rainbow = dp->color;
+               dp->fractal_len = 2000000;
+       }
+       dp->fractal_len = (dp->fractal_len * MI_BATCHCOUNT(mi)) / 20;
+       XClearWindow(MI_DISPLAY(mi), MI_WINDOW(mi));
+}
+
+static void
+pick_df_coefs(ModeInfo * mi)
+{
+       driftstruct *dp = &drifts[MI_SCREEN(mi)];
+       int         i, j, k;
+       double      r;
+
+       for (i = 0; i < dp->nxforms; i++) {
+
+               r = 1e-6;
+               for (j = 0; j < 2; j++)
+                       for (k = 0; k < 3; k++) {
+                               dp->df[j][k][i] = ((double) halfrandom(1000) / 500.0 - 1.0);
+                               r += dp->df[j][k][i] * dp->df[j][k][i];
+                       }
+               r = (3 + halfrandom(5)) * 0.01 / sqrt(r);
+               for (j = 0; j < 2; j++)
+                       for (k = 0; k < 3; k++)
+                               dp->df[j][k][i] *= r;
+       }
+}
+
+static void
+initfractal(ModeInfo * mi)
+{
+       driftstruct *dp = &drifts[MI_SCREEN(mi)];
+       int         i, j, k;
+
+#define XFORM_LEN 9
+
+       dp->fuse = FUSE;
+       dp->total_points = 0;
+       if (dp->rainbow)
+               for (i = 0; i < MI_NPIXELS(mi); i++)
+                       dp->ncpoints[i] = 0;
+       else
+               dp->npoints = 0;
+       dp->nxforms = halfrandom(XFORM_LEN);
+       /* 2, 2, 2, 3, 3, 3, 4, 4, 5 */
+       dp->nxforms = (dp->nxforms >= XFORM_LEN - 1) + dp->nxforms / 3 + 2;
+
+       dp->c = dp->x = dp->y = 0.0;
+       if (dp->liss && !halfrandom(10)) {
+               dp->liss_time = 0;
+       }
+       if (!dp->grow)
+               pick_df_coefs(mi);
+       for (i = 0; i < dp->nxforms; i++) {
+               if (NMAJORVARS == dp->major_variation)
+                       dp->variation[i] = halfrandom(NMAJORVARS);
+               else
+                       dp->variation[i] = dp->major_variation;
+               for (j = 0; j < 2; j++)
+                       for (k = 0; k < 3; k++) {
+                               if (dp->liss)
+                                       dp->f[j][k][i] = sin(dp->liss_time * dp->df[j][k][i]);
+                               else
+                                       dp->f[j][k][i] = ((double) halfrandom(1000) / 500.0 - 1.0);
+                       }
+       }
+       if (dp->color)
+               dp->pixcol = MI_PIXEL(mi, halfrandom(MI_NPIXELS(mi)));
+       else
+               dp->pixcol = MI_WIN_WHITE_PIXEL(mi);
+
+}
+
+
+void
+init_drift(ModeInfo * mi)
+{
+       driftstruct *dp;
+
+       if (drifts == NULL) {
+               if ((drifts = (driftstruct *) calloc(MI_NUM_SCREENS(mi),
+                                             sizeof (driftstruct))) == NULL)
+                       return;
+       }
+       dp = &drifts[MI_SCREEN(mi)];
+
+       dp->width = MI_WIN_WIDTH(mi);
+       dp->height = MI_WIN_HEIGHT(mi);
+       dp->color = MI_NPIXELS(mi) > 2;
+
+       if (MI_WIN_IS_FULLRANDOM(mi)) {
+#if 1 /* jwz: even up the odds */
+         switch ((int) (LRAND() % 3)) {
+         case 0:   dp->grow = True;  dp->liss = False; break;
+         case 1:   dp->grow = False; dp->liss = True;  break;
+         default:  dp->grow = False; dp->liss = False; break;
+               /* liss and grow don't work together. */
+         }
+#else /* 0 */
+               if (LRAND() & 1)
+                       dp->grow = True;
+               else {
+                       dp->grow = False;
+                       dp->liss = (Bool) (LRAND() & 1);
+               }
+#endif
+       } else {
+               dp->grow = grow;
+               if (dp->grow)
+                       dp->liss = False;
+               else
+                       dp->liss = liss;
+       }
+       initmode(mi, 1);
+       initfractal(mi);
+}
+
+static void
+iter(driftstruct * dp)
+{
+       int         i = frandom(dp->nxforms);
+       double      nx, ny, nc;
+
+
+       if (i)
+               nc = (dp->c + 1.0) / 2.0;
+       else
+               nc = dp->c / 2.0;
+
+       nx = dp->f[0][0][i] * dp->x + dp->f[0][1][i] * dp->y + dp->f[0][2][i];
+       ny = dp->f[1][0][i] * dp->x + dp->f[1][1][i] * dp->y + dp->f[1][2][i];
+
+
+       switch (dp->variation[i]) {
+               case 1:
+                       /* sinusoidal */
+                       nx = sin(nx);
+                       ny = sin(ny);
+                       break;
+               case 2:
+                       {
+                               /* complex */
+                               double      r2 = nx * nx + ny * ny + 1e-6;
+
+                               nx = nx / r2;
+                               ny = ny / r2;
+                               break;
+                       }
+               case 3:
+                       /* bent */
+                       if (nx < 0.0)
+                               nx = nx * 2.0;
+                       if (ny < 0.0)
+                               ny = ny / 2.0;
+                       break;
+               case 4:
+                       {
+                               /* swirl */
+
+                               double      r = (nx * nx + ny * ny);    /* times k here is fun */
+                               double      c1 = sin(r);
+                               double      c2 = cos(r);
+                               double      t = nx;
+
+                               if (nx > 1e4 || nx < -1e4 || ny > 1e4 || ny < -1e4)
+                                       ny = 1e4;
+                               else
+                                       ny = c2 * t + c1 * ny;
+                               nx = c1 * nx - c2 * ny;
+                               break;
+                       }
+               case 5:
+                       {
+                               /* horseshoe */
+                               double      r, c1, c2, t;
+
+                               /* Avoid atan2: DOMAIN error message */
+                               if (nx == 0.0 && ny == 0.0)
+                                       r = 0.0;
+                               else
+                                       r = atan2(nx, ny);      /* times k here is fun */
+                               c1 = sin(r);
+                               c2 = cos(r);
+                               t = nx;
+
+                               nx = c1 * nx - c2 * ny;
+                               ny = c2 * t + c1 * ny;
+                               break;
+                       }
+               case 6:
+                       {
+                               /* drape */
+                               double      t;
+
+                               /* Avoid atan2: DOMAIN error message */
+                               if (nx == 0.0 && ny == 0.0)
+                                       t = 0.0;
+                               else
+                                       t = atan2(nx, ny) / M_PI;
+
+                               if (nx > 1e4 || nx < -1e4 || ny > 1e4 || ny < -1e4)
+                                       ny = 1e4;
+                               else
+                                       ny = sqrt(nx * nx + ny * ny) - 1.0;
+                               nx = t;
+                               break;
+                       }
+       }
+
+#if 0
+       /* here are some others */
+       {
+               /* broken */
+               if (nx > 1.0)
+                       nx = nx - 1.0;
+               if (nx < -1.0)
+                       nx = nx + 1.0;
+               if (ny > 1.0)
+                       ny = ny - 1.0;
+               if (ny < -1.0)
+                       ny = ny + 1.0;
+               break;
+       }
+       {
+               /* complex sine */
+               double      u = nx, v = ny;
+               double      ev = exp(v);
+               double      emv = exp(-v);
+
+               nx = (ev + emv) * sin(u) / 2.0;
+               ny = (ev - emv) * cos(u) / 2.0;
+       }
+       {
+
+               /* polynomial */
+               if (nx < 0)
+                       nx = -nx * nx;
+               else
+                       nx = nx * nx;
+
+               if (ny < 0)
+                       ny = -ny * ny;
+               else
+                       ny = ny * ny;
+       }
+       {
+               /* spherical */
+               double      r = 0.5 + sqrt(nx * nx + ny * ny + 1e-6);
+
+               nx = nx / r;
+               ny = ny / r;
+       }
+       {
+               nx = atan(nx) / M_PI_2
+                       ny = atan(ny) / M_PI_2
+       }
+#endif
+
+       /* how to check nan too?  some machines don't have finite().
+          don't need to check ny, it'll propogate */
+       if (nx > 1e4 || nx < -1e4) {
+               nx = halfrandom(1000) / 500.0 - 1.0;
+               ny = halfrandom(1000) / 500.0 - 1.0;
+               dp->fuse = FUSE;
+       }
+       dp->x = nx;
+       dp->y = ny;
+       dp->c = nc;
+
+}
+
+static void
+draw(ModeInfo * mi, driftstruct * dp, Drawable d)
+{
+       Display    *display = MI_DISPLAY(mi);
+       GC          gc = MI_GC(mi);
+       double      x = dp->x;
+       double      y = dp->y;
+       int         fixed_x, fixed_y, npix, c, n;
+
+       if (dp->fuse) {
+               dp->fuse--;
+               return;
+       }
+       if (!(x > -1.0 && x < 1.0 && y > -1.0 && y < 1.0))
+               return;
+
+       fixed_x = (int) ((dp->width / 2) * (x + 1.0));
+       fixed_y = (int) ((dp->height / 2) * (y + 1.0));
+
+       if (!dp->rainbow) {
+
+               dp->pts[dp->npoints].x = fixed_x;
+               dp->pts[dp->npoints].y = fixed_y;
+               dp->npoints++;
+               if (dp->npoints == MAXBATCH1) {
+                       XSetForeground(display, gc, dp->pixcol);
+                       XDrawPoints(display, d, gc, dp->pts, dp->npoints, CoordModeOrigin);
+                       dp->npoints = 0;
+               }
+       } else {
+
+               npix = MI_NPIXELS(mi);
+               c = (int) (dp->c * npix);
+
+               if (c < 0)
+                       c = 0;
+               if (c >= npix)
+                       c = npix - 1;
+               n = dp->ncpoints[c];
+               dp->cpts[c][n].x = fixed_x;
+               dp->cpts[c][n].y = fixed_y;
+               if (++dp->ncpoints[c] == MAXBATCH2) {
+                       XSetForeground(display, gc, MI_PIXEL(mi, c));
+                       XDrawPoints(display, d, gc, dp->cpts[c],
+                                   dp->ncpoints[c], CoordModeOrigin);
+                       dp->ncpoints[c] = 0;
+               }
+       }
+}
+
+static void
+draw_flush(ModeInfo * mi, driftstruct * dp, Drawable d)
+{
+       Display    *display = MI_DISPLAY(mi);
+       GC          gc = MI_GC(mi);
+
+       if (dp->rainbow) {
+               int         npix = MI_NPIXELS(mi);
+               int         i;
+
+               for (i = 0; i < npix; i++) {
+                       if (dp->ncpoints[i]) {
+                               XSetForeground(display, gc, MI_PIXEL(mi, i));
+                               XDrawPoints(display, d, gc, dp->cpts[i],
+                                           dp->ncpoints[i], CoordModeOrigin);
+                               dp->ncpoints[i] = 0;
+                       }
+               }
+       } else {
+               if (dp->npoints)
+                       XSetForeground(display, gc, dp->pixcol);
+               XDrawPoints(display, d, gc, dp->pts,
+                           dp->npoints, CoordModeOrigin);
+               dp->npoints = 0;
+       }
+}
+
+
+void
+draw_drift(ModeInfo * mi)
+{
+       Window      window = MI_WINDOW(mi);
+       driftstruct *dp = &drifts[MI_SCREEN(mi)];
+
+       dp->timer = 3000;
+
+       while (dp->timer) {
+               iter(dp);
+               draw(mi, dp, window);
+               if (dp->total_points++ > dp->fractal_len) {
+                       draw_flush(mi, dp, window);
+                       if (0 == --dp->nfractals) {
+#ifdef STANDALONE
+                         XSync(MI_DISPLAY(mi), False);
+                         sleep(4); /* #### make settable */
+                         erase_full_window(MI_DISPLAY(mi), MI_WINDOW(mi));
+#endif /* STANDALONE */
+                         initmode(mi, frandom(2));
+                       }
+                       initfractal(mi);
+               }
+               dp->timer--;
+       }
+       if (!dp->grow) {
+               int         i, j, k;
+
+               draw_flush(mi, dp, window);
+               if (dp->liss)
+                       dp->liss_time++;
+               for (i = 0; i < dp->nxforms; i++)
+                       for (j = 0; j < 2; j++)
+                               for (k = 0; k < 3; k++) {
+                                       if (dp->liss)
+                                               dp->f[j][k][i] = sin(dp->liss_time * dp->df[j][k][i]);
+                                       else {
+                                               double      t = dp->f[j][k][i] += dp->df[j][k][i];
+
+                                               if (t < -1.0 || 1.0 < t)
+                                                       dp->df[j][k][i] *= -1.0;
+                                       }
+                               }
+       }
+}
+
+void
+release_drift(ModeInfo * mi)
+{
+       if (drifts != NULL) {
+               (void) free((void *) drifts);
+               drifts = NULL;
+       }
+}
+
+void
+refresh_drift(ModeInfo * mi)
+{
+       XClearWindow(MI_DISPLAY(mi), MI_WINDOW(mi));
+}
diff --git a/hacks/drift.man b/hacks/drift.man
new file mode 100644 (file)
index 0000000..407f06a
--- /dev/null
@@ -0,0 +1,75 @@
+.TH XScreenSaver 1 "10-May-97" "X Version 11"
+.SH NAME
+drift - draws drifting recursive fractal cosmic flames
+.SH SYNOPSIS
+.B drift
+[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-ncolors \fIinteger\fP] [\-delay \fImicroseconds\fP] [\-count \fIinteger\fP] [\-grow] [\-no\-grow] [\-liss] [\-no\-liss]
+
+.SH DESCRIPTION
+The \fIdrift\fP program draws drifting recursive fractal cosmic flames
+.SH OPTIONS
+.I drift
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window.  This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-mono 
+If on a color display, pretend we're on a monochrome display.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use.  Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-ncolors \fIinteger\fP
+How many colors should be used (if possible).  Default 200.
+The colors used cycle through the hue, making N stops around
+the color wheel.
+.TP 8
+.B \-count \fIinteger\fP
+
+.TP 8
+.B \-grow
+.TP 8
+.B \-no\-grow
+Whether fractals should grow; otherwise, they are animated.
+
+.TP 8
+.B \-liss
+.TP 8
+.B \-no\-liss
+Whether we should use lissojous figures to get points.
+
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR flame (1),
+.BR X (1),
+.BR xscreensaver (1),
+.BR xlock (1)
+.SH COPYRIGHT
+Copyright \(co 1991, 1995 by Scott Draves.
+
+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. 
+.SH AUTHOR
+Scott Draves <spot@cs.cmu.edu>, 06-Jun-91, 01-Jun-95.
+
+Ability to run standalone or with \fIxscreensaver\fP added by 
+Jamie Zawinski <jwz@jwz.org>, 10-May-97.
diff --git a/hacks/epicycle.c b/hacks/epicycle.c
new file mode 100644 (file)
index 0000000..b812e6a
--- /dev/null
@@ -0,0 +1,842 @@
+/* epicycle --- The motion of a body with epicycles, as in the pre-Copernican
+ * cosmologies.
+ *
+ * Copyright (c) 1998  James Youngman <jay@gnu.org>
+ * 
+ * Permission to use, copy, modify, distribute, and sell this software 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.  No representations are made about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or 
+ * implied warranty.
+ */
+
+/* Standard C headers; screenhack.h assumes that these have already
+ * been included if required -- for example, it defines M_PI if not
+ * already defined.
+ */
+#include <float.h>
+#include <math.h>
+
+
+#include "screenhack.h"
+#include "erase.h"
+
+/* MIT-SHM headers omitted; this screenhack doesn't use it */
+
+
+
+/*********************************************************/
+/******************** MAGIC CONSTANTS ********************/
+/*********************************************************/
+#define MIN_RADIUS (5)         /* smallest allowable circle radius */
+#define FILL_PROPORTION (0.9)  /* proportion of screen to fill by scaling. */
+/*********************************************************/
+/***************** END OF MAGIC CONSTANTS ****************/
+/*********************************************************/
+
+
+
+#define FULLCIRCLE (2.0 * M_PI)        /* radians in a circle. */
+
+
+/* Name of the Screensaver hack */
+char *progclass="Epicycle";
+
+/* Some of these resource values here are hand-tuned to give a
+ * pleasing variety of interesting shapes.  These are not the only
+ * good settings, but you may find you need to change some as a group
+ * to get pleasing figures.
+ */
+char *defaults [] = {
+  ".background:        black",
+  ".foreground:        white",
+  "*colors:    100",
+  "*color0:    red",
+  "*delay:     1000",
+  "*holdtime:  2",
+  "*lineWidth: 4",
+  "*minCircles:  2",
+  "*maxCircles:  10",
+  "*minSpeed:  0.003",
+  "*maxSpeed:  0.005",
+  "*harmonics: 8",
+  "*timestep:  1.0",
+  "*timestepCoarseFactor: 1.0", /* no option for this resource. */
+  "*divisorPoisson: 0.4",
+  "*sizeFactorMin: 1.05",
+  "*sizeFactorMax: 2.05",
+  0
+};
+
+/* options passed to this program */
+XrmOptionDescRec options [] = {
+  { "-color0",         ".color0",        XrmoptionSepArg, 0 },
+  { "-colors",         ".colors",        XrmoptionSepArg, 0 },
+  { "-colours",                ".colors",        XrmoptionSepArg, 0 },
+  { "-foreground",     ".foreground",    XrmoptionSepArg, 0 },
+  { "-delay",          ".delay",         XrmoptionSepArg, 0 },
+  { "-holdtime",       ".holdtime",      XrmoptionSepArg, 0 },
+  { "-linewidth",      ".lineWidth",     XrmoptionSepArg, 0 },
+  { "-min_circles",    ".minCircles",    XrmoptionSepArg, 0 },
+  { "-max_circles",    ".maxCircles",    XrmoptionSepArg, 0 },
+  { "-min_speed",      ".minSpeed",      XrmoptionSepArg, 0 },
+  { "-max_speed",      ".maxSpeed",      XrmoptionSepArg, 0 },
+  { "-harmonics",      ".harmonics",     XrmoptionSepArg, 0 },
+  { "-timestep",       ".timestep",      XrmoptionSepArg, 0 },
+  { "-divisor_poisson",".divisorPoisson",XrmoptionSepArg, 0 },
+  { "-size_factor_min", ".sizeFactorMin", XrmoptionSepArg, 0 },
+  { "-size_factor_max", ".sizeFactorMax", XrmoptionSepArg, 0 },
+  { 0, 0, 0, 0 }
+};
+
+
+static Display *dpy;
+static Window window;
+static GC color0;
+static int width, height;
+static int x_offset, y_offset;
+static int unit_pixels;
+static unsigned long bg;
+static Colormap cmap;
+static int restart = 0;
+static int stop = 0;
+static double wdot_max;
+static XColor *colors = NULL;
+static int ncolors = 2;
+static int color_shift_pos=0;  /* how far we are towards that. */
+static double colour_cycle_rate = 1.0;
+static int harmonics = 8;
+static double divisorPoisson = 0.4;
+static double sizeFactorMin = 1.05;
+static double sizeFactorMax = 2.05;
+static int minCircles;
+static int maxCircles;
+
+/* Each circle is centred on a point on the rim of another circle.
+ */
+struct tagCircle
+{
+  long radius;                 /* in pixels */
+  double w;                    /* position (radians ccw from x-axis) */
+  double initial_w;            /* starting position */
+  double wdot;                 /* rotation rate (change in w per iteration) */
+  int    divisor;
+
+  struct tagCircle *pchild;
+};
+typedef struct tagCircle Circle;
+
+
+struct tagBody                 /* a body that moves on a system of circles. */
+{
+  int x_origin, y_origin;
+  int x, y;
+  int old_x, old_y;
+  int current_color;           /* pixel index into colors[] */
+  Circle *epicycles;           /* system of circles on which it moves. */
+  struct tagBody *next;                /* next in list. */
+};
+typedef struct tagBody Body;
+
+
+/* Determine the GCD of two numbers using Euclid's method.  The other
+ * possible algorighm is Stein's method, but it's probably only going
+ * to be much faster on machines with no divide instruction, like the
+ * ARM and the Z80.  The former is very fast anyway and the latter
+ * probably won't run X clients; in any case, this calculation is not
+ * the bulk of the computational expense of the program.  I originally
+ * tried using Stein's method, but I wanted to remove the gotos.  Not
+ * wanting to introduce possible bugs, I plumped for Euclid's method
+ * instead.  Lastly, Euclid's algorithm is preferred to the
+ * generalisation for N inputs.
+ *
+ * See Knuth, section 4.5.2.
+ */
+static int
+gcd(int u, int v)              /* Euclid's Method */
+{
+  /* If either operand of % is negative, the sign of the result is
+   * implementation-defined.  See section 6.3.5 "Multiplicative
+   * Operators" of the ANSI C Standard (page 46 [LEFT HAND PAGE!] of
+   * "Annotated C Standard", Osborne, ISBN 0-07-881952-0).
+   */
+  if (u < 0) u = -u;
+  if (v < 0) v = -v;
+  
+  while (0 != v)
+    {
+      int r;
+      r = u % v;
+      u = v;
+      v = r;
+    }
+  return u;
+}
+
+/* Determine the Lowest Common Multiple of two integers, using
+ * Euclid's Proposition 34, as explained in Knuth's The Art of
+ * Computer Programming, Vol 2, section 4.5.2.
+ */
+static int
+lcm(int u, int v)
+{
+  return u / gcd(u,v) * v;
+}
+
+static long 
+random_radius(double scale)    
+{
+  long r;
+
+  r = frand(scale) * unit_pixels/2; /* for frand() see utils/yarandom.h */
+  if (r < MIN_RADIUS)
+    r = MIN_RADIUS;
+  return r;
+}
+
+
+static long
+random_divisor(void)
+{
+  int divisor = 1;
+  int sign;
+
+  while (frand(1.0) < divisorPoisson && divisor <= harmonics)
+    {
+      ++divisor;
+    }
+  sign = (frand(1.0) < 0.5) ? +1 : -1;
+  return sign * divisor;
+}
+
+
+static void
+oom(void)
+{
+  fprintf(stderr, "Failed to allocate memory!\n");
+  exit(-1);
+}
+
+
+/* Construct a circle or die.
+ */
+Circle *
+new_circle(double scale)
+{
+  Circle *p = malloc(sizeof(Circle));
+  
+  p->radius = random_radius(scale);
+  p->w = p->initial_w = 0.0;
+  p->divisor = random_divisor();
+  p->wdot = wdot_max / p->divisor;
+  p->pchild = NULL;
+  
+  return p;
+}
+
+static void delete_circle(Circle *p)
+{
+  free(p);
+}
+
+static void 
+delete_circle_chain(Circle *p)
+{
+  while (p)
+    {
+      Circle *q = p->pchild;
+      delete_circle(p);
+      p = q;
+    }
+}
+
+Circle *
+new_circle_chain(void)
+{
+  Circle *head;
+  double scale = 1.0, factor;
+  int n;
+
+  /* Parent circles are larger than their children by a factor of at
+   * least FACTOR_MIN and at most FACTOR_MAX.
+   */
+  factor = sizeFactorMin + frand(sizeFactorMax - sizeFactorMin);
+  
+  /* There are between minCircles and maxCircles in each figure.
+   */
+  n = minCircles + rand() % (maxCircles - minCircles);
+  
+  head = NULL;
+  while (n--)
+    {
+      Circle *p = new_circle(scale);
+      p->pchild = head;
+      head = p;
+
+      scale /= factor;
+    }
+  return head;
+}
+
+static void
+assign_random_common_w(Circle *p)
+{
+  double w_common = frand(FULLCIRCLE); /* anywhere on the circle */
+  while (p)
+    {
+      p->initial_w = w_common;
+      p = p->pchild;
+    }
+}
+
+static Body *
+new_body(void)
+{
+  Body *p = malloc(sizeof(Body));
+  if (NULL == p)
+    oom();
+  p->epicycles = new_circle_chain();
+  p->current_color = 0;                /* ?? start them all on different colors? */
+  p->next = NULL;
+  p->x = p->y = 0;
+  p->old_x = p->old_y = 0;
+  p->x_origin = p->y_origin = 0;
+
+  /* Start all the epicycles at the same w value to make it easier to
+   * figure out at what T value the cycle is closed.   We don't just fix
+   * the initial W value because that makes all the patterns tend to 
+   * be symmetrical about the X axis.
+   */
+  assign_random_common_w(p->epicycles);
+  return p;
+}
+
+static void
+delete_body(Body *p)
+{
+  delete_circle_chain(p->epicycles);
+  free(p);
+}
+
+
+static void 
+draw_body(Body *pb, GC gc)
+{
+  XDrawLine(dpy, window, gc, pb->old_x, pb->old_y, pb->x, pb->y);
+}
+
+static long
+compute_divisor_lcm(Circle *p)
+{
+  long l = 1;
+  
+  while (p)
+    {
+      l = lcm(l, p->divisor);
+      p = p->pchild;
+    }
+  return l;
+}
+
+             
+/* move_body()
+ *
+ * Calculate the position for the body at time T.  We work in double 
+ * rather than int to avoid the cumulative errors that would be caused
+ * by the rounding implicit in an assignment to int.
+ */
+static void
+move_body(Body *pb, double t)
+{
+  Circle *p;
+  double x, y;
+
+  pb->old_x = pb->x;
+  pb->old_y = pb->y;
+  
+  x = pb->x_origin;
+  y = pb->y_origin;
+  
+  for (p=pb->epicycles; NULL != p; p=p->pchild)
+    {
+      /* angular pos = initial_pos + time * angular speed */
+      /* but this is an angular position, so modulo FULLCIRCLE. */
+      p->w = fmod(p->initial_w + (t * p->wdot), FULLCIRCLE);
+      
+      x += (p->radius * cos(p->w));
+      y += (p->radius * sin(p->w));
+    }
+  
+  pb->x = (int)x;
+  pb->y = (int)y;
+}
+
+static int
+colour_init(XWindowAttributes *pxgwa)
+{
+  XGCValues gcv;
+
+#if 0
+  int H = random() % 360;      /* colour choice from attraction.c. */
+  double S1 = 0.25;
+  double S2 = 1.00;
+  double V = frand(0.25) + 0.75;
+  int line_width = 0;
+#endif
+
+  int retval = 1;
+  unsigned long valuemask = 0L;
+  unsigned long fg;
+  
+  /* Free any already allocated colors...
+   */
+  if (colors)
+    {
+      free_colors(dpy, cmap, colors, ncolors);
+      colors = 0;
+      ncolors = 0;
+    }
+       
+  ncolors = get_integer_resource ("colors", "Colors");
+  if (0 == ncolors)            /* English spelling? */
+    ncolors = get_integer_resource ("colours", "Colors");
+  
+  if (ncolors < 2)
+    ncolors = 2;
+  if (ncolors <= 2)
+    mono_p = True;
+  colors = 0;
+
+  if (!mono_p)
+    {
+      colors = (XColor *) malloc(sizeof(*colors) * (ncolors+1));
+      if (!colors)
+       oom();
+         
+      make_smooth_colormap (dpy, pxgwa->visual, cmap, colors, &ncolors,
+                           True, /* allocate */
+                           False, /* not writable */
+                           True); /* verbose (complain about failure) */
+      if (ncolors <= 2)
+       {
+         if (colors)
+           free (colors);
+         colors = 0;
+         mono_p = True;
+       }
+    }
+
+  
+  bg = get_pixel_resource ("background", "Background", dpy, cmap);
+
+  /* Set the line width
+   */
+  gcv.line_width = get_integer_resource ("lineWidth", "Integer");
+  if (gcv.line_width)
+    {
+      valuemask |= GCLineWidth;
+
+      gcv.join_style = JoinRound;
+      gcv.cap_style = CapRound;
+         
+      valuemask |= (GCCapStyle | GCJoinStyle);
+    }
+  
+
+  /* Set the drawing function.
+   */
+  gcv.function = GXcopy;
+  valuemask |= GCFunction;
+  
+  /* Set the foreground.
+   */
+  if (mono_p)
+    fg = get_pixel_resource ("foreground", "Foreground", dpy, cmap);
+  else
+    fg = bg ^ get_pixel_resource (("color0"), "Foreground", dpy, cmap); 
+  gcv.foreground = fg;
+  valuemask |= GCForeground;
+
+  /* Actually create the GC.
+   */
+  color0 = XCreateGC (dpy, window, valuemask, &gcv);
+  
+  return retval;
+}
+
+
+/* check_events(); originally from XScreensaver: hacks/maze.c,
+ * but now quite heavily modified.
+ *
+ * Reaction to events:-
+ *
+ * Mouse 1 -- new figure }
+ *       2 -- new figure }-- ignored when running on root window.
+ *       3 -- exit       }
+ *
+ * Window resized or exposed -- new figure.
+ * Window iconised -- wait until it's re-mapped, then start a new figure.
+ */
+static int
+check_events (void)                        /* X event handler [ rhess ] */
+{
+  XEvent e;
+  int unmapped = 0;
+       
+  while (unmapped || XPending(dpy))
+    {
+      XNextEvent(dpy, &e);
+               
+      switch (e.type)
+       {
+       case ButtonPress:
+         switch (e.xbutton.button)
+           {
+           case 3:
+             exit (0);
+             break;
+                               
+           case 2:
+           case 1:
+           default:
+             restart = 1 ;
+             stop = 0 ;
+             break;
+           }
+         break;
+                       
+       case ConfigureNotify:
+         restart = 1;
+         break;
+                       
+       case UnmapNotify:
+         printf("unmapped!\n");
+         unmapped = 1;
+         restart = 1;                  /* restart with new fig. when re-mapped. */
+         break;
+                       
+       case Expose:            
+         if (0 == e.xexpose.count)
+           {
+                               /* We can get several expose events in the queue.
+                                * Only the last one has a zero count.  We eat
+                                * events in this function so as to avoid restarting
+                                * the screensaver many times in quick succession.
+                                */
+             restart = 1;
+           }
+         /* If we had been unmapped and are now waiting to be re-mapped,
+          * indicate that we condition we are waiting for is now met.
+          */
+         if (unmapped)
+           printf("re-mapped!\n");
+         unmapped = 0;
+         break;
+
+        default:
+          screenhack_handle_event(dpy, &e);
+          break;
+       }
+               
+      /* If we're unmapped, don't return to the caller.  This
+       * prevents us wasting CPU, calculating new positions for
+       * things that will never be plotted.   This is a real CPU
+       * saver.
+       */
+      if (!unmapped)
+       return 1;
+    }
+  return 0;
+}
+
+
+static void
+setup(void)
+{
+  XWindowAttributes xgwa;
+  int root;
+  
+  XGetWindowAttributes (dpy, window, &xgwa);
+  cmap = xgwa.colormap;
+
+  width = xgwa.width;
+  height = xgwa.height;
+  x_offset = width / 2;
+  y_offset = height / 2;
+  unit_pixels = width < height ? width : height;
+
+  {
+    static Bool done = False;
+    if (!done)
+      {
+       colour_init(&xgwa);
+       done = True;
+      }
+  }
+  
+  root = get_boolean_resource("root", "Boolean");
+  
+  if (root)
+    {
+      XSelectInput(dpy, window, ExposureMask);
+    }
+  else
+    {
+      XWindowAttributes xgwa;
+      XGetWindowAttributes (dpy, window, &xgwa);
+      XSelectInput (dpy, window,
+                    xgwa.your_event_mask | ExposureMask |
+                    ButtonPressMask |StructureNotifyMask);
+    }
+  
+}
+static void
+color_step(Body *pb, double frac)
+{
+  if (!mono_p)
+    {
+      int newshift = ncolors * fmod(frac * colour_cycle_rate, 1.0);
+      if (newshift != color_shift_pos)
+       {
+         pb->current_color = newshift;
+         XSetForeground (dpy, color0, colors[pb->current_color].pixel);
+         color_shift_pos = newshift;
+       }
+    }
+}
+
+
+long
+distance(long x1, long y1, long x2, long y2)
+{
+  long dx, dy;
+
+  dx = x2 - x1;
+  dy = y2 - y1;
+  return dx*dx + dy*dy;
+}
+
+#if 0
+static int poisson_irand(double p)
+{
+  int r = 1;
+  while (fabs(frand(1.0)) < p)
+    ++r;
+  return r < 1 ? 1 : r;
+}
+#endif
+
+static void
+precalculate_figure(Body *pb,
+                   double xtime, double step,
+                   int *x_max, int *y_max,
+                   int *x_min, int *y_min)
+{
+  double t;
+  
+  move_body(pb, 0.0); /* move once to avoid initial line from origin */
+  *x_min = *x_max = pb->x;
+  *y_min = *y_max = pb->y;
+  
+  for (t=0.0; t<xtime; t += step)
+    {
+      move_body(pb, t); /* move once to avoid initial line from origin */
+      if (pb->x > *x_max)
+       *x_max = pb->x;
+      if (pb->x < *x_min)
+       *x_min = pb->x;
+      if (pb->y > *y_max)
+       *y_max = pb->y;
+      if (pb->y < *y_min)
+       *y_min = pb->y;
+    }
+}
+
+static int i_max(int a, int b)
+{
+  return (a>b) ? a : b;
+}
+
+static void rescale_circles(Body *pb,
+                           int x_max, int y_max,
+                           int x_min, int y_min)
+{
+  double xscale, yscale, scale;
+  double xm, ym;
+  
+  x_max -= x_offset;
+  x_min -= x_offset;
+  y_max -= y_offset;
+  y_min -= y_offset;
+
+  x_max = i_max(x_max, -x_min);
+  y_max = i_max(y_max, -y_min);
+
+
+  xm = width / 2.0;
+  ym = height / 2.0;
+  if (x_max > xm)
+    xscale = xm / x_max;
+  else
+    xscale = 1.0;
+  if (y_max > ym)
+    yscale = ym / y_max;
+  else
+    yscale = 1.0;
+
+  if (xscale < yscale)         /* wider than tall */
+    scale = xscale;            /* ensure width fits onscreen */
+  else
+    scale = yscale;            /* ensure height fits onscreen */
+
+
+  scale *= FILL_PROPORTION;    /* only fill FILL_PROPORTION of screen */
+  if (scale < 1.0)             /* only reduce, don't enlarge. */
+    {
+      Circle *p;
+      for (p=pb->epicycles; p; p=p->pchild)
+       {
+         p->radius *= scale;
+       }
+    }
+  else
+    {
+      printf("enlarge by x%.2f skipped...\n", scale);
+    }
+}
+
+
+/* angular speeds of the circles are harmonics of a fundamental
+ * value.  That should please the Pythagoreans among you... :-)
+ */
+static double 
+random_wdot_max(void)
+{
+  /* Maximum and minimum values for the choice of wdot_max.  Possible
+   * epicycle speeds vary from wdot_max to (wdot_max * harmonics).
+   */
+  double minspeed, maxspeed;
+  minspeed = get_float_resource("minSpeed", "Double");
+  maxspeed = get_float_resource("maxSpeed", "Double");
+  return harmonics * (minspeed + FULLCIRCLE * frand(maxspeed-minspeed));
+}
+
+/* this is the function called for your screensaver */
+/*GLOBAL*/ void
+screenhack(Display *disp, Window win)
+{
+  Body *pb = NULL;
+  long l;
+  double t, timestep, circle, xtime, timestep_coarse;
+  int delay;
+  int uncleared = 1;
+  int xmax, xmin, ymax, ymin;
+  int holdtime = get_integer_resource ("holdtime", "Integer");
+
+  dpy = disp;
+  window = win;
+
+  circle = FULLCIRCLE;
+  
+  XClearWindow(dpy, window);
+  uncleared = 0;
+  
+  delay = get_integer_resource ("delay", "Integer");
+  harmonics = get_integer_resource("harmonics", "Integer");
+  divisorPoisson = get_float_resource("divisorPoisson", "Double");
+  
+  timestep = get_float_resource("timestep", "Double");
+  timestep_coarse = timestep *
+    get_float_resource("timestepCoarseFactor", "Double");
+  
+  sizeFactorMin = get_float_resource("sizeFactorMin", "Double");
+  sizeFactorMax = get_float_resource("sizeFactorMax", "Double");
+
+  minCircles = get_integer_resource ("minCircles", "Integer");
+  maxCircles = get_integer_resource ("maxCircles", "Integer");
+
+  xtime = 0; /* is this right? */
+  while (0 == stop)
+    {
+      setup(); /* do this inside the loop to cope with any window resizing */
+      restart = 0;
+
+      /* Flush any outstanding events; this has the side effect of
+       * reducing the number of "false restarts"; resdtarts caused by
+       * one event (e.g. ConfigureNotify) followed by another
+       * (e.g. Expose).
+       */
+      XSync(dpy, True);
+         
+      wdot_max = random_wdot_max();
+         
+      if (pb)
+       {
+         delete_body(pb);
+         pb = NULL;
+       }
+      pb = new_body();
+      pb->x_origin = pb->x = x_offset;
+      pb->y_origin = pb->y = y_offset;
+         
+      
+      if (uncleared)
+       {
+         erase_full_window(dpy, window);
+         uncleared = 0;
+       }
+
+      fflush(stdout);
+      precalculate_figure(pb, xtime, timestep_coarse,
+                         &xmax, &ymax, &xmin, &ymin);
+
+      rescale_circles(pb, xmax, ymax, xmin, ymin);
+      
+      move_body(pb, 0.0); /* move once to avoid initial line from origin */
+      move_body(pb, 0.0); /* move once to avoid initial line from origin */
+
+      
+      t = 0.0;                 /* start at time zero. */
+
+      l = compute_divisor_lcm(pb->epicycles);
+      
+      colour_cycle_rate = fabs(l);
+      
+      xtime = fabs(l * circle / wdot_max);
+
+      if (colors)                              /* (colors==NULL) if mono_p */
+       XSetForeground (dpy, color0, colors[pb->current_color].pixel);
+
+      while (0 == restart)
+       {
+         color_step(pb, t/xtime );
+         draw_body(pb, color0);
+         uncleared = 1;
+
+         
+         /* Check if the figure is complete...*/
+         if (t > xtime)
+           {
+             XSync (dpy, False);
+
+              check_events();
+             if (holdtime)
+               sleep(holdtime); /* show complete figure for a bit. */
+
+             restart = 1;      /* begin new figure. */
+           }
+         
+         
+         check_events();
+         if (delay)
+           usleep (delay);
+         
+         t += timestep;
+         move_body(pb, t);
+         check_events();
+       }
+    }
+}
+
diff --git a/hacks/epicycle.man b/hacks/epicycle.man
new file mode 100644 (file)
index 0000000..3af0ed5
--- /dev/null
@@ -0,0 +1,200 @@
+.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
+..
+.TH XScreenSaver 1 "27-Apr-97" "X Version 11"
+.SH NAME
+epicycle - draws a point moving around a circle which moves around a cicle which...
+.SH SYNOPSIS
+.B epicycle 
+[\-display \fIhost:display.screen\fP] [\-root] [\-window] [\-mono] [\-install] [\-noinstall] [\-visual \fIviz\fP] [\-colors \fIN\fP] [\-foreground \fIname\fP] [\-color\-shift \fIN\fP] [\-delay \fImicroseconds\fP] [\-holdtime \fIseconds\fP] [\-linewidth \fIN\fP] [\-min_circles \fIN\fP] [\-max_circles \fIN\fP] [\-min_speed \fInumber\fP] [\-max_speed \fInumber\fP] [\-harmonics \fIN\fP] [\-timestep \fInumber\fP] [\-divisor_poisson \fIprobability\fP] [\-size_factor_min \fInumber\fP] [\-size_factor_max \fInumber\fP]
+.SH DESCRIPTION
+The epicycle program draws the path traced out by a point on the edge
+of a circle.  That circle rotates around a point on the rim of another
+circle, and so on, several times.  The random curves produced can be
+simple or complex, convex or concave, but they are always closed
+curves (they never go in indefinitely).
+
+You can configure both the way the curves are drawn and the way in
+which the random sequence of circles is generated, either with
+command-line options or X resources.
+.SH OPTIONS
+.TP 8
+.B \-display \fIhost:display.screen\fP
+Specifies which X display we should use (see the section DISPLAY NAMES in
+.BR X (1)
+for more information about this option).
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-window
+Draw on a newly-created window.  This is the default.
+.TP 8
+.B \-mono
+If on a color display, pretend we're on a monochrome display.
+If we're on a mono display, we have no choice.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-noinstall
+Don't install a private colormap for the window.
+.TP 8
+.B \-visual \fIviz\fP
+Specify which visual to use.  Legal values are the name of a visual
+class, or the id number (decimal or hex) of a specific visual.
+Possible choices include
+
+.RS
+default, best, mono, monochrome, gray, grey, color, staticgray, staticcolor, 
+truecolor, grayscale, greyscale, pseudocolor, directcolor, \fInumber\fP
+
+If a decimal or hexadecimal number is used, 
+.BR XGetVisualInfo (3X)
+is consulted to obtain the required visual.
+.RE
+.TP 8
+.B \-colors \fIN\fP
+How many colors should be used (if possible).  The colors are chosen
+randomly.
+.TP 8
+.B \-foreground \fIname\fP
+With 
+.BR \-mono ,
+this option selects the foreground colour.   
+.TP 8
+.B \-delay \fImicroseconds\fP
+Specifies the delay between drawing successive line segments of the
+path.   If you do not specify 
+.BR -sync ,
+some X servers may batch up several drawing operations together,
+producing a less smooth effect.   This is more likely to happen 
+in monochrome mode (on monochrome servers or when 
+.B \-mono 
+is specified).
+.TP 8
+.B \-holdtime \fIseconds\fP
+When the figure is complete, 
+.I epicycle
+pauses this number of seconds.
+.TP 8
+.B \-linewidth \fIN\fP
+Width in pixels of the body's track.   Specifying values greater than
+one may cause slower drawing.   The fastest value is usually zero,
+meaning one pixel.   
+.TP 8
+.B \-min_circles \fIN\fP
+Smallest number of epicycles in the figure.
+.TP 8
+.B \-max_circles \fIN\fP
+Largest number of epicycles in the figure.
+.TP 8
+.B \-min_speed \fInumber\fP
+Smallest possible value for the base speed of revolution of the
+epicycles.  The actual speeds of the epicycles vary from this down
+to
+.IB "min_speed / harmonics" .
+.TP 8
+.B \-max_speed \fInumber\fP
+Smallest possible value for the base speed of revolution of the 
+epicycles.
+.TP 8
+.B \-harmonics \fIN\fP
+Number of possible harmonics; the larger this value is, the greater
+the possible variety of possible speeds of epicycle.
+.TP 8
+.B \-timestep \fInumber\fP
+Decreasing this value will reduce the distance the body moves for
+each line segment, possibly producing a smoother figure.  Increasing
+it may produce faster results.  
+.TP 8
+.B \-divisor_poisson \fIprobability\fP
+Each epicycle rotates at a rate which is a factor of the base speed.
+The speed of each epicycle is the base speed divided by some integer
+between 1 and the value of the 
+.B \-harmonics 
+option.  This integer is decided by starting at 1 and tossing 
+a biased coin.  For each consecutive head, the value is incremented by
+one.  The integer will not be incremented above the value of the 
+.B \-harmonics
+option.  The argument of this option decides the bias of the coin; it
+is the probability that that coin will produce a head at any given toss.
+.TP 8
+.B \-size_factor_min \fInumber\fP
+Epicycles are always at least this factor smaller than their
+parents.  
+.TP 8
+.B \-size_factor_max \fInumber\fP
+Epicycles are never more than this factor smaller than their parents.
+.SH RESOURCES
+.EX
+Option            Resource               Default Value
+------            --------               -------------
+-colors           .colors                100
+-delay            .delay                 1000
+-holdtime         .holdtime              2
+-linewidth        .lineWidth             4
+-min_circles      .minCircles            2
+-max_circles      .maxCircles            10
+-min_speed        .minSpeed              0.003
+-max_speed        .maxSpeed              0.005
+-harmonics        .harmonics             8
+-timestep         .timestep              1.0
+-divisor_poisson  .divisorPoisson        0.4
+-size_factor_min  .sizeFactorMin         1.05
+-size_factor_max  .sizeFactorMax         2.05
+                  .timestepCoarseFactor  1.0
+.EE
+Before the drawing of the figure is begun, a preliminary calculation
+of the path is done in order to scale the radii of the epicycles so
+as to fit the figure on the screen or window.  For the sake of speed,
+This calculation is done with a larger timestep than the actual
+drawing.  The time-step used is the value of the
+.B \-timestep 
+option multiplied by the timestepCoarseFactor resource.  The default
+value of 1 will almost always work fast enough and so this resource
+is not available as a command-line option.
+.SH USER INTERFACE
+The program runs mostly without user interaction.  When running on the
+root window, no input is accepted.  When running in its own window,
+the program will exit if mouse button 3 is pressed.  If any other
+mouse button is pressed, the current figure will be abandoned and
+another will be started.
+.SH HISTORY
+The geometry of epicycles was perfected by Hipparchus of Rhodes at
+some time around 125 B.C., 185 years after the birth of Aristarchus of
+Samos, the inventor of the heliocentric universe model.  Hipparchus
+applied epicycles to the Sun and the Moon.  Ptolemy of Alexandria went
+on to apply them to what was then the known universe, at around 150
+A.D.  Copernicus went on to apply them to the heliocentric model at
+the beginning of the sixteenth century.  Johannes Kepler discovered
+that the planets actually move in elliptical orbits in about 1602.
+The inverse-square law of gravity was suggested by Boulliau in 1645.
+Isaac Newton's 
+.I Principia Mathematica
+was published in 1687, and proved that Kepler's laws derived from
+Newtonian gravitation.
+.SH BUGS
+The colour selection is re-done for every figure.  This may 
+generate too much network traffic for this program to work well 
+over slow or long links.   
+.SH COPYRIGHT
+Copyright \(co 1998, James Youngman.  Permission to use, copy, modify,
+distribute, and sell this software 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.  No representations are made about the
+suitability of this software for any purpose.  It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+James Youngman <jay@gnu.org>, April 1998.
diff --git a/hacks/fadeplot.c b/hacks/fadeplot.c
new file mode 100644 (file)
index 0000000..5b71552
--- /dev/null
@@ -0,0 +1,177 @@
+/* -*- Mode: C; tab-width: 4 -*-
+ * fadeplot.c --- some easy plotting stuff, by Bas van Gaalen, Holland, PD
+ */
+#if !defined( lint ) && !defined( SABER )
+static const char sccsid[] = "@(#)fadeplot.c  4.04 97/07/26 xlockmore";
+#endif
+
+/* Converted for xlock by Charles Vidal
+ * See xlock.c for copying information.
+ *
+ * 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.
+ *
+ * This file is provided AS IS with no warranties of any kind.  The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof.  In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ */
+
+/*-
+ 1) Not random enough, i.e. always same starting position.
+ 2) Needs to be less flashy
+ */
+
+#ifdef STANDALONE
+# define PROGCLASS                     "Fadeplot"
+# define HACK_INIT                     init_fadeplot
+# define HACK_DRAW                     draw_fadeplot
+# define fadeplot_opts         xlockmore_opts
+# define DEFAULTS                      "*count:                10      \n"                     \
+                                                       "*delay:                30000   \n"                     \
+                                                       "*cycles:               1500    \n"                     \
+                                                       "*ncolors:              64      \n"
+# define BRIGHT_COLORS
+# define UNIFORM_COLORS
+# include "xlockmore.h"                                /* from the xscreensaver distribution */
+#else /* STANDALONE */
+# include "xlock.h"                                    /* from the xlockmore distribution */
+#endif /* STANDALONE */
+
+ModeSpecOpt fadeplot_opts = {
+  0, NULL, 0, NULL, NULL };
+
+#define MINSTEPS 1
+#define ANGLES 1000
+
+typedef struct {
+       XPoint      speed, step, factor, st;
+       int         temps, maxpts, nbstep;
+       int         min;
+       int         width, height;
+       int         pix;
+       int         stab[ANGLES];
+       XPoint     *pts;
+} fadeplotstruct;
+
+static fadeplotstruct *fadeplots = NULL;
+
+static void
+initSintab(ModeInfo * mi)
+{
+       fadeplotstruct *fp = &fadeplots[MI_SCREEN(mi)];
+       int         i;
+       float       x;
+
+       for (i = 0; i < ANGLES; i++) {
+               x = SINF(i * 2 * M_PI / ANGLES);
+               fp->stab[i] = (int) (x * ABS(x) * fp->min) + fp->min;
+       }
+}
+
+void
+init_fadeplot(ModeInfo * mi)
+{
+       fadeplotstruct *fp;
+
+       if (fadeplots == NULL) {
+               if ((fadeplots = (fadeplotstruct *) calloc(MI_NUM_SCREENS(mi),
+                                          sizeof (fadeplotstruct))) == NULL)
+                       return;
+       }
+       fp = &fadeplots[MI_SCREEN(mi)];
+
+       fp->width = MI_WIN_WIDTH(mi);
+       fp->height = MI_WIN_HEIGHT(mi);
+  fp->min = MAX(MIN(fp->width, fp->height) / 2, 1);
+
+       fp->speed.x = 8;
+       fp->speed.y = 10;
+       fp->step.x = 1;
+       fp->step.y = 1;
+       fp->temps = 0;
+       fp->factor.x = MAX(fp->width / (2 * fp->min), 1);
+       fp->factor.y = MAX(fp->height / (2 * fp->min), 1);
+
+       fp->nbstep = MI_BATCHCOUNT(mi);
+       if (fp->nbstep < -MINSTEPS) {
+               fp->nbstep = NRAND(-fp->nbstep - MINSTEPS + 1) + MINSTEPS;
+       } else if (fp->nbstep < MINSTEPS)
+               fp->nbstep = MINSTEPS;
+
+  fp->maxpts = MI_CYCLES(mi);
+  if (fp->maxpts < 1)
+    fp->maxpts = 1;
+
+       if (fp->pts == NULL)
+               fp->pts = (XPoint *) calloc(fp->maxpts, sizeof (XPoint));
+       if (MI_NPIXELS(mi) > 2)
+               fp->pix = NRAND(MI_NPIXELS(mi));
+
+       initSintab(mi);
+
+       XClearWindow(MI_DISPLAY(mi), MI_WINDOW(mi));
+}
+
+void
+draw_fadeplot(ModeInfo * mi)
+{
+       fadeplotstruct *fp = &fadeplots[MI_SCREEN(mi)];
+       Display    *display = MI_DISPLAY(mi);
+       Window      window = MI_WINDOW(mi);
+       GC          gc = MI_GC(mi);
+       int         i, j;
+       long        temp;
+
+       XSetForeground(display, gc, MI_WIN_BLACK_PIXEL(mi));
+       XDrawPoints(display, window, gc, fp->pts, fp->maxpts, CoordModeOrigin);
+
+       if (MI_NPIXELS(mi) > 2) {
+               XSetForeground(display, gc, MI_PIXEL(mi, fp->pix));
+               if (++fp->pix >= MI_NPIXELS(mi))
+                       fp->pix = 0;
+       } else
+               XSetForeground(display, gc, MI_WIN_WHITE_PIXEL(mi));
+
+               for (temp = fp->nbstep - 1; temp >= 0; temp--) {
+                       j = temp;
+                       for (i = 0; i < fp->maxpts / fp->nbstep; i++) {
+                               fp->pts[temp * i + i].x =
+                                       fp->stab[(fp->st.x + fp->speed.x * j + i * fp->step.x) % ANGLES] *
+                                       fp->factor.x + fp->width / 2 - fp->min;
+                               fp->pts[temp * i + i].y =
+                                       fp->stab[(fp->st.y + fp->speed.y * j + i * fp->step.y) % ANGLES] *
+                                       fp->factor.y + fp->height / 2 - fp->min;
+                       }
+               }
+       XDrawPoints(display, window, gc, fp->pts, fp->maxpts, CoordModeOrigin);
+       XFlush(display);
+       fp->st.x = (fp->st.x + fp->speed.x) % ANGLES;
+       fp->st.y = (fp->st.y + fp->speed.y) % ANGLES;
+       fp->temps++;
+       if ((fp->temps % (ANGLES / 2)) == 0) {
+               fp->temps = fp->temps % ANGLES * 5;
+               if ((fp->temps % (ANGLES)) == 0)
+                       fp->speed.y = (fp->speed.y++) % 30 + 1;
+               if ((fp->temps % (ANGLES * 2)) == 0)
+                       fp->speed.x = (fp->speed.x) % 20;
+               if ((fp->temps % (ANGLES * 3)) == 0)
+                       fp->step.y = (fp->step.y++) % 2 + 1;
+               XClearWindow(display, window);
+       }
+}
+void
+refresh_fadeplot(ModeInfo * mi)
+{
+
+}
+
+void
+release_fadeplot(ModeInfo * mi)
+{
+       /* Do nothing, it will refresh by itself */
+}
diff --git a/hacks/flag.c b/hacks/flag.c
new file mode 100644 (file)
index 0000000..354daf0
--- /dev/null
@@ -0,0 +1,612 @@
+/* -*- Mode: C; tab-width: 4 -*-
+ * flag --- a waving flag
+ */
+#if !defined( lint ) && !defined( SABER )
+static const char sccsid[] = "@(#)flag.c       4.02 97/04/01 xlockmore";
+#endif
+
+/* Copyright (c) 1996 Charles Vidal <vidalc@univ-mlv.fr>.
+ * PEtite demo X11 de charles vidal 15 05 96
+ * tourne sous Linux et SOLARIS
+ * thank's to Bas van Gaalen, Holland, PD, for his sources
+ * in pascal vous devez rajouter une ligne dans mode.c
+ *
+ * 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.
+ *
+ * This file is provided AS IS with no warranties of any kind.  The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof.  In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * Revision History: 
+ * 22-Jan-98: jwz: made the flag wigglier; added xpm support.
+ *            (I tried to do this by re-porting from xlockmore, but the
+ *            current xlockmore version is completely inscrutable.)
+ * 13-May-97: jwz@jwz.org: turned into a standalone program.
+ *                       Made it able to animate arbitrary (runtime) text or bitmaps.
+ * 01-May-96: written.
+ */
+
+#ifdef STANDALONE
+# define PROGCLASS                                     "Flag"
+# define HACK_INIT                                     init_flag
+# define HACK_DRAW                                     draw_flag
+# define flag_opts                                     xlockmore_opts
+# define DEFAULTS      "*delay:                50000   \n"                     \
+                                       "*cycles:               1000    \n"                     \
+                                       "*size:                 -7      \n"                     \
+                                       "*ncolors:              200     \n"
+# define BRIGHT_COLORS
+# define UNIFORM_COLORS
+# define DEF_FONT                                      "-*-helvetica-bold-r-*-240-*"
+# define DEF_BITMAP                                    ""
+# define DEF_TEXT                                      ""
+# include "xlockmore.h"                                /* from the xscreensaver distribution */
+
+# ifdef HAVE_XPM
+#  include <X11/xpm.h>
+#  ifndef PIXEL_ALREADY_TYPEDEFED
+#   define PIXEL_ALREADY_TYPEDEFED /* Sigh, Xmu/Drawing.h needs this... */
+#  endif
+# endif
+
+#ifdef HAVE_XMU
+# ifndef VMS
+#  include <X11/Xmu/Drawing.h>
+# else  /* VMS */
+#  include <Xmu/Drawing.h>
+# endif /* VMS */
+#endif /* HAVE_XMU */
+
+#include "images/bob.xbm"
+
+#else  /* !STANDALONE */
+# include "xlock.h"                                    /* from the xlockmore distribution */
+# include "flag.h"
+#endif /* !STANDALONE */
+
+
+#if defined(VMS) && !defined(HAVE_UNAME) && (__VMS_VER >= 70000000)
+# define HAVE_UNAME 1
+#endif
+
+#ifdef HAVE_UNAME
+# include <sys/utsname.h>
+#endif /* HAVE_UNAME */
+
+#ifdef STANDALONE
+static XrmOptionDescRec opts[] =
+{
+  { "-bitmap", ".flag.bitmap", XrmoptionSepArg, 0 },
+  { "-text",   ".flag.text",   XrmoptionSepArg, 0 }
+};
+
+#endif /* STANDALONE */
+
+ModeSpecOpt flag_opts = {
+#ifdef STANDALONE
+  2, opts, 0, NULL, NULL
+#else  /* !STANDALONE */
+  0, NULL, 0, NULL, NULL
+#endif /* STANDALONE */
+};
+
+#include <string.h>
+#include <X11/Xutil.h>
+
+#define MINSIZE 1
+#define MAXSCALE 8
+#define MINSCALE 2
+#define MAXINITSIZE 6
+#define MININITSIZE 2
+#define MINAMP 5
+#define MAXAMP 20
+#define MAXW(fp) (MAXSCALE * (fp)->image->width + 2 * MAXAMP + (fp)->pointsize)
+#define MAXH(fp) (MAXSCALE * (fp)->image->height+ 2 * MAXAMP + (fp)->pointsize)
+#define MINW(fp) (MINSCALE * (fp)->image->width + 2 * MINAMP + (fp)->pointsize)
+#define MINH(fp) (MINSCALE * (fp)->image->height+ 2 * MINAMP + (fp)->pointsize)
+#define ANGLES         360
+
+typedef struct {
+       int         samp;
+       int         sofs;
+       int         sidx;
+       int         x_flag, y_flag;
+       int         timer;
+       int         initialized;
+       int         stab[ANGLES];
+       Pixmap      cache;
+       int         width, height;
+       int         pointsize;
+       float      size;
+       float      inctaille;
+       int         startcolor;
+    XImage     *image;
+} flagstruct;
+
+static flagstruct *flags = NULL;
+
+static int
+random_num(int n)
+{
+       return ((int) (((float) LRAND() / MAXRAND) * (n + 1.0)));
+}
+
+static void
+initSintab(ModeInfo * mi)
+{
+       flagstruct *fp = &flags[MI_SCREEN(mi)];
+       int         i;
+
+  /*-
+   * change the periodicity of the sin formula : the maximum of the
+   * periocity seem to be 16 ( 2^4 ), after the drawing isn't good looking
+   */
+       int         periodicity = random_num(4);
+       int         puissance = 1;
+
+       /* for (i=0;i<periodicity;i++) puissance*=2; */
+       puissance <<= periodicity;
+       for (i = 0; i < ANGLES; i++)
+               fp->stab[i] = (int) (SINF(i * puissance * M_PI / ANGLES) * fp->samp) +
+                       fp->sofs;
+}
+
+static void
+affiche(ModeInfo * mi)
+{
+       Display    *display = MI_DISPLAY(mi);
+       int         x, y, xp, yp;
+       flagstruct *fp = &flags[MI_SCREEN(mi)];
+
+       for (x = 0; x < fp->image->width; x++)
+               for (y = fp->image->height-1; y >= 0; y--) {
+                       xp = (int) (fp->size * (float) x) +
+                               fp->stab[(fp->sidx + x + y) % ANGLES];
+                       yp = (int) (fp->size * (float) y) +
+                               fp->stab[(fp->sidx + 4 * x + y + y) % ANGLES];
+
+                       if (fp->image->depth > 1)
+                         XSetForeground(display, MI_GC(mi),
+                                                        XGetPixel(fp->image, x, y));
+                       else if (XGetPixel(fp->image, x, y))
+                               XSetForeground(display, MI_GC(mi), MI_WIN_BLACK_PIXEL(mi));
+                       else if (MI_NPIXELS(mi) <= 2)
+                               XSetForeground(display, MI_GC(mi), MI_WIN_WHITE_PIXEL(mi));
+                       else
+                               XSetForeground(display, MI_GC(mi),
+                                              MI_PIXEL(mi, (y + x + fp->sidx + fp->startcolor) % MI_NPIXELS(mi)));
+
+                       if (fp->pointsize <= 1)
+                               XDrawPoint(display, fp->cache, MI_GC(mi), xp, yp);
+                       else if (fp->pointsize < 6)
+                               XFillRectangle(display, fp->cache, MI_GC(mi), xp, yp,
+                                                          fp->pointsize, fp->pointsize);
+                       else
+                               XFillArc(display, fp->cache, MI_GC(mi), xp, yp,
+                                                fp->pointsize, fp->pointsize, 0, 360*64);
+               }
+}
+
+#ifdef STANDALONE
+
+static void
+make_flag_bits(ModeInfo *mi)
+{
+  Display *dpy = MI_DISPLAY(mi);
+  flagstruct *fp = &flags[MI_SCREEN(mi)];
+  char *bitmap_name = get_string_resource ("bitmap", "Bitmap");
+  char *text = get_string_resource ("text", "Text");
+
+  /* If neither a bitmap nor text are specified, randomly select either
+        the builtin bitmap or builtin text. */
+  if ((!bitmap_name || !*bitmap_name) && (!text || !*text))
+       {
+         if (random() & 1)
+               {
+                 free(bitmap_name);
+                 bitmap_name = strdup("(default)");
+               }
+         else
+               {
+                 free(text);
+                 text = strdup("(default)");
+               }
+       }
+
+  if (bitmap_name &&
+         *bitmap_name &&
+         !!strcmp(bitmap_name, "(default)"))
+       {
+#ifdef HAVE_XPM
+         Window window = MI_WINDOW(mi);
+         XWindowAttributes xgwa;
+         XpmAttributes xpmattrs;
+         int result;
+         Pixmap bitmap = 0;
+         int width = 0, height = 0;
+         xpmattrs.valuemask = 0;
+
+         XGetWindowAttributes (dpy, window, &xgwa);
+
+# ifdef XpmCloseness
+         xpmattrs.valuemask |= XpmCloseness;
+         xpmattrs.closeness = 40000;
+# endif
+# ifdef XpmVisual
+         xpmattrs.valuemask |= XpmVisual;
+         xpmattrs.visual = xgwa.visual;
+# endif
+# ifdef XpmDepth
+         xpmattrs.valuemask |= XpmDepth;
+         xpmattrs.depth = xgwa.depth;
+# endif
+# ifdef XpmColormap
+         xpmattrs.valuemask |= XpmColormap;
+         xpmattrs.colormap = xgwa.colormap;
+# endif
+
+         /* Uh, we don't need these now.  We use the colors from the xpm.
+                It kinda sucks that we already allocated them. */
+         XFreeColors(dpy, xgwa.colormap, mi->pixels, mi->npixels, 0L);
+
+         result = XpmReadFileToPixmap (dpy, window, bitmap_name, &bitmap, 0,
+                                                                       &xpmattrs);
+         switch (result)
+               {
+               case XpmColorError:
+                 fprintf (stderr, "%s: warning: xpm color substitution performed\n",
+                                  progname);
+                 /* fall through */
+               case XpmSuccess:
+                 width = xpmattrs.width;
+                 height = xpmattrs.height;
+                 break;
+               case XpmFileInvalid:
+               case XpmOpenFailed:
+                 bitmap = 0;
+                 break;
+               case XpmColorFailed:
+                 fprintf (stderr, "%s: xpm: color allocation failed\n", progname);
+                 exit (-1);
+               case XpmNoMemory:
+                 fprintf (stderr, "%s: xpm: out of memory\n", progname);
+                 exit (-1);
+               default:
+                 fprintf (stderr, "%s: xpm: unknown error code %d\n", progname,
+                                  result);
+                 exit (-1);
+               }
+
+         if (bitmap)
+               {
+                 fp->image = XGetImage(dpy, bitmap, 0, 0, width, height, ~0L,
+                                                               ZPixmap);
+                 XFreePixmap(dpy, bitmap);
+               }
+         else
+#endif /* HAVE_XPM */
+
+#ifdef HAVE_XMU
+               {
+                 int width, height, xh, yh;
+                 Pixmap bitmap =
+                       XmuLocateBitmapFile (DefaultScreenOfDisplay (dpy),
+                                                                bitmap_name, 0, 0, &width, &height, &xh, &yh);
+                 if (!bitmap)
+                       {
+                         fprintf(stderr, "%s: unable to load bitmap file %s\n",
+                                         progname, bitmap_name);
+                         exit (1);
+                       }
+                 fp->image = XGetImage(dpy, bitmap, 0, 0, width, height,
+                                                               1L, XYPixmap);
+                 XFreePixmap(dpy, bitmap);
+               }
+
+#else  /* !XMU */
+      fprintf (stderr,
+                          "%s: your vendor doesn't ship the standard Xmu library.\n",
+                          progname);
+      fprintf (stderr, "\tWe can't load XBM files without it.\n");
+      exit (1);
+#endif /* !XMU */
+
+       }
+  else if (text && *text)
+       {
+         char *text2;
+         char *fn = get_string_resource ("font", "Font");
+         char *def_fn = "fixed";
+         char *line, *token;
+         int width, height;
+         int lines;
+         int margin = 2;
+         int fg = 1;
+         int bg = 0;
+         Pixmap bitmap;
+         XFontStruct *font;
+         XCharStruct overall;
+      XGCValues gcv;
+         GC gc;
+
+         if (!strcmp(text, "(default)"))
+               {
+# ifdef HAVE_UNAME
+                 struct utsname uts;
+                 if (uname (&uts) < 0)
+                       {
+                         text = strdup("uname() failed");
+                       }
+                 else
+                       {
+                         char *s;
+                         if ((s = strchr(uts.nodename, '.')))
+                               *s = 0;
+                         text = (char *) malloc(strlen(uts.nodename) +
+                                                                        strlen(uts.sysname) +
+                                                                        strlen(uts.version) +
+                                                                        strlen(uts.release) + 10);
+# ifdef _AIX
+                         sprintf(text, "%s\n%s %s.%s",
+                                         uts.nodename, uts.sysname, uts.version, uts.release);
+# else  /* !_AIX */
+                         sprintf(text, "%s\n%s %s",
+                                         uts.nodename, uts.sysname, uts.release);
+# endif /* !_AIX */
+                       }
+#else  /* !HAVE_UNAME */
+# ifdef VMS
+                 text = strdup(getenv("SYS$NODE"));
+# else
+                 text = strdup("X\nScreen\nSaver");
+# endif
+#endif /* !HAVE_UNAME */
+               }
+
+         while (*text &&
+                        (text[strlen(text)-1] == '\r' ||
+                         text[strlen(text)-1] == '\n'))
+               text[strlen(text)-1] = 0;
+
+         text2 = strdup(text);
+
+         if (!fn) fn = def_fn;
+      font = XLoadQueryFont (dpy, fn);
+      if (! font)
+               {
+                 fprintf(stderr, "%s: unable to load font %s; using %s\n",
+                                 progname, fn, def_fn);
+                 font = XLoadQueryFont (dpy, def_fn);
+               }
+
+         memset(&overall, 0, sizeof(overall));
+         token = text;
+         lines = 0;
+         while ((line = strtok(token, "\r\n")))
+               {
+                 XCharStruct o2;
+                 int ascent, descent, direction;
+                 token = 0;
+                 XTextExtents(font, line, strlen(line),
+                                          &direction, &ascent, &descent, &o2);
+                 overall.lbearing = MAX(overall.lbearing, o2.lbearing);
+                 overall.rbearing = MAX(overall.rbearing, o2.rbearing);
+                 lines++;
+               }
+
+         width = overall.lbearing + overall.rbearing + margin + margin + 1;
+         height = ((font->ascent + font->descent) * lines) + margin + margin;
+
+         bitmap = XCreatePixmap(dpy, MI_WINDOW(mi), width, height, 1);
+
+      gcv.font = font->fid;
+      gcv.foreground = bg;
+      gc = XCreateGC (dpy, bitmap, (GCFont | GCForeground), &gcv);
+         XFillRectangle(dpy, bitmap, gc, 0, 0, width, height);
+         XSetForeground(dpy, gc, fg);
+
+         token = text2;
+         lines = 0;
+         while ((line = strtok(token, "\r\n")))
+               {
+                 XCharStruct o2;
+                 int ascent, descent, direction, xoff;
+                 token = 0;
+
+                 XTextExtents(font, line, strlen(line),
+                                          &direction, &ascent, &descent, &o2);
+                 xoff = ((overall.lbearing + overall.rbearing) -
+                                 (o2.lbearing + o2.rbearing)) / 2;
+
+                 XDrawString(dpy, bitmap, gc,
+                                         overall.lbearing + margin + xoff,
+                                         ((font->ascent * (lines + 1)) +
+                                          (font->descent * lines) +
+                                          margin),
+                                         line, strlen(line));
+                 lines++;
+               }
+         free(text2);
+         XUnloadFont(dpy, font->fid);
+         XFree((XPointer) font);
+         XFreeGC(dpy, gc);
+
+         fp->image = XGetImage(dpy, bitmap, 0, 0, width, height, 1L, XYPixmap);
+         XFreePixmap(dpy, bitmap);
+       }
+  else
+       {
+      char *bits = (char *) malloc (sizeof(bob_bits));
+      memcpy (bits, bob_bits, sizeof(bob_bits));
+         fp->image = XCreateImage (dpy, MI_VISUAL(mi), 1, XYBitmap, 0,
+                                                               bits, bob_width, bob_height,
+                                                               8, 0);
+         fp->image->byte_order = LSBFirst;
+         fp->image->bitmap_bit_order = LSBFirst;
+       }
+
+  if (bitmap_name)
+       free (bitmap_name);
+  if (text)
+       free (text);
+}
+
+#else  /* !STANDALONE */
+
+static void
+make_flag_bits(ModeInfo *mi)
+{
+  flagstruct *fp = &flags[MI_SCREEN(mi)];
+  int x, y;
+  int w = flag_width;
+  int h = flag_height;
+  int i = 0;
+  fp->image =
+       XCreateImage(MI_DISPLAY(mi), MI_VISUAL(mi),
+                                1, XYBitmap, 0,                                        /* dpth, fmt, offset */
+                                (char *) calloc ((w+8) / 8, h),        /* data */
+                                w, h, 8, 0);                                           /* w, h, pad, bpl */
+  /* Geez, what kinda goofy bit order is this?? */
+  for (x = 0; x < w; x++)
+       for (y = h-1; y >= 0; y--)
+         XPutPixel (fp->image, x, y, flag_bits[i++]);
+}
+
+#endif /* !STANDALONE */
+
+
+void
+init_flag(ModeInfo * mi)
+{
+       Display    *display = MI_DISPLAY(mi);
+       int         size = MI_SIZE(mi);
+       flagstruct *fp;
+
+       if (flags == NULL) {
+               if ((flags = (flagstruct *) calloc(MI_NUM_SCREENS(mi),
+                                              sizeof (flagstruct))) == NULL)
+                       return;
+       }
+       fp = &flags[MI_SCREEN(mi)];
+
+       make_flag_bits(mi);
+
+       fp->width = MI_WIN_WIDTH(mi);
+       fp->height = MI_WIN_HEIGHT(mi);
+
+       fp->samp = MAXAMP;      /* Amplitude */
+       fp->sofs = 20;          /* ???????? */
+       fp->pointsize = size;
+       if (size < -MINSIZE)
+               fp->pointsize = NRAND(-size - MINSIZE + 1) + MINSIZE;
+       if (fp->pointsize < MINSIZE ||
+       fp->width <= MAXW(fp) || fp->height <= MAXH(fp))
+               fp->pointsize = MINSIZE;
+       fp->size = MAXINITSIZE; /* Initial distance between pts */
+       fp->inctaille = 0.05;
+       fp->timer = 0;
+       fp->sidx = fp->x_flag = fp->y_flag = 0;
+
+       if (!fp->initialized) {
+               fp->initialized = True;
+               if (!(fp->cache = XCreatePixmap(display, MI_WINDOW(mi),
+               MAXW(fp), MAXH(fp), MI_WIN_DEPTH(mi))))
+#ifdef STANDALONE
+                 exit(-1);
+#else   /* !STANDALONE */
+                       error("%s: catastrophe memoire\n");
+#endif /* !STANDALONE */
+       }
+       XSetForeground(display, MI_GC(mi), MI_WIN_BLACK_PIXEL(mi));
+       XFillRectangle(display, fp->cache, MI_GC(mi),
+                      0, 0, MAXW(fp), MAXH(fp));
+       /* don't want any exposure events from XCopyArea */
+       XSetGraphicsExposures(display, MI_GC(mi), False);
+       if (MI_NPIXELS(mi) > 2)
+               fp->startcolor = NRAND(MI_NPIXELS(mi));
+       if (fp->width <= MAXW(fp) || fp->height <= MAXH(fp)) {
+               fp->samp = MINAMP;
+               fp->sofs = 0;
+               fp->x_flag = random_num(fp->width - MINW(fp));
+               fp->y_flag = random_num(fp->height - MINH(fp));
+       } else {
+               fp->samp = MAXAMP;
+               fp->sofs = 20;
+               fp->x_flag = random_num(fp->width - MAXW(fp));
+               fp->y_flag = random_num(fp->height - MAXH(fp));
+       }
+
+       initSintab(mi);
+
+       XClearWindow(display, MI_WINDOW(mi));
+}
+
+void release_flag(ModeInfo * mi);
+
+
+void
+draw_flag(ModeInfo * mi)
+{
+       Display    *display = MI_DISPLAY(mi);
+       Window      window = MI_WINDOW(mi);
+       flagstruct *fp = &flags[MI_SCREEN(mi)];
+
+       if (fp->width <= MAXW(fp) || fp->height <= MAXH(fp)) {
+               fp->size = MININITSIZE;
+               /* fp->pointsize = MINPOINTSIZE; */
+               XCopyArea(display, fp->cache, window, MI_GC(mi),
+                         0, 0, MINW(fp), MINH(fp), fp->x_flag, fp->y_flag);
+       } else {
+               if ((fp->size + fp->inctaille) > MAXSCALE)
+                       fp->inctaille = -fp->inctaille;
+               if ((fp->size + fp->inctaille) < MINSCALE)
+                       fp->inctaille = -fp->inctaille;
+               fp->size += fp->inctaille;
+               XCopyArea(display, fp->cache, window, MI_GC(mi),
+                         0, 0, MAXW(fp), MAXH(fp), fp->x_flag, fp->y_flag);
+       }
+       XSetForeground(MI_DISPLAY(mi), MI_GC(mi), MI_WIN_BLACK_PIXEL(mi));
+       XFillRectangle(display, fp->cache, MI_GC(mi),
+                      0, 0, MAXW(fp), MAXH(fp));
+       XFlush(display);
+       affiche(mi);
+       fp->sidx += 2;
+       fp->sidx %= (ANGLES * MI_NPIXELS(mi));
+       XFlush(display);
+       fp->timer++;
+       if ((MI_CYCLES(mi) > 0) && (fp->timer >= MI_CYCLES(mi)))
+      {
+        release_flag(mi);
+               init_flag(mi);
+      }
+}
+
+void
+release_flag(ModeInfo * mi)
+{
+       if (flags != NULL) {
+               int         screen;
+
+               for (screen = 0; screen < MI_NUM_SCREENS(mi); screen++)
+                 {
+                       if (flags[screen].cache)
+                               XFreePixmap(MI_DISPLAY(mi), flags[screen].cache);
+                       if (flags[screen].image)
+                         XDestroyImage(flags[screen].image);
+                 }
+               (void) free((void *) flags);
+               flags = NULL;
+       }
+}
+
+void
+refresh_flag(ModeInfo * mi)
+{
+       /* Do nothing, it will refresh by itself */
+}
diff --git a/hacks/flag.man b/hacks/flag.man
new file mode 100644 (file)
index 0000000..1c7d93b
--- /dev/null
@@ -0,0 +1,88 @@
+.TH XScreenSaver 1 "24-May-97" "X Version 11"
+.SH NAME
+flag - draws a waving flag, containing text or an image
+.SH SYNOPSIS
+.B flag
+[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-ncolors \fIinteger\fP] [\-delay \fImicroseconds\fP] [\-cycles \fIinteger\fP] [\-size \fIinteger\fP] [\-text \fIstring\fP] [\-font \fIfont\fP] [\-bitmap \fIxbm-file\fP]
+
+.SH DESCRIPTION
+The \fIflag\fP program draws a waving flag that contains text or a bitmap.
+.SH OPTIONS
+.I flag
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window.  This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-mono 
+If on a color display, pretend we're on a monochrome display.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use.  Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-ncolors \fIinteger\fP
+How many colors should be used (if possible).  Default 200.
+.TP 8
+.B \-cycles \fIinteger\fP
+
+.TP 8
+.B \-count \fIinteger\fP
+
+.TP 8
+.B \-size \fIinteger\fP
+How large the pixels in the flag should be, from 1 to 8.
+If this is a negative number, the pixel size is chosen randomly
+from the range 1 to -size.  Default -7.
+.TP 8
+.B \-text \fItext\fP
+The text to display in the flag.  Multiple lines of text are allowed;
+the lines will be displayed centered atop one another.  Default: none.
+If the text is the magic string \fI"(default)"\fP, then the text used 
+will be the local machine name; a newline; and the local OS version.
+.TP 8
+.B \-bitmap \fIxbm-file\fP
+The bitmap to display in the flag; this must be an XBM file (color XPMs
+are not allowed.)  Default: none.  If the bitmap is the magic 
+string \fI"(default)"\fP, then the bitmap used will be a charming 
+little picture of J. R. "Bob" Dobbs.
+
+If neither \fI\-text\fP nor \fI\-bitmap\fP are specified, then either
+the builtin text or the builtin bitmap will be chosen randomly.
+.TP 8
+.B \-font \fIfont\fP
+The font in which to draw the text; the default is
+"-*-helvetica-bold-r-*-240-*".
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1),
+.BR xlock (1)
+.SH COPYRIGHT
+Copyright \(co 1996 Charles Vidal.
+
+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. 
+
+.SH AUTHOR
+Charles Vidal <vidalc@univ-mlv.fr>, 1996.
+
+Ability to run standalone or with \fIxscreensaver\fP, and the \-text
+and \-bitmap options, added by Jamie Zawinski <jwz@jwz.org>, 24-May-97.
diff --git a/hacks/flame.c b/hacks/flame.c
new file mode 100644 (file)
index 0000000..9d3543c
--- /dev/null
@@ -0,0 +1,426 @@
+/* xscreensaver, Copyright (c) 1993, 1995, 1996, 1998
+ *  Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software 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.  No representations are made about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or 
+ * implied warranty.
+ */
+
+/* This file was ported from xlock for use in xscreensaver (and standalone)
+ * by jwz on 18-Oct-93.  (And again, 11-May-97.)  Original copyright reads:
+ *
+ *   static char sccsid[] = "@(#)flame.c 1.4 91/09/27 XLOCK";
+ *
+ * flame.c - recursive fractal cosmic flames.
+ *
+ * Copyright (c) 1991 by Patrick J. Naughton.
+ *
+ * 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.
+ *
+ * This file is provided AS IS with no warranties of any kind.  The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof.  In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * Comments and additions should be sent to the author:
+ *
+ *                    naughton@eng.sun.com
+ *
+ *                    Patrick J. Naughton
+ *                    MS 21-14
+ *                    Sun Laboritories, Inc.
+ *                    2550 Garcia Ave
+ *                    Mountain View, CA  94043
+ *
+ * Revision History:
+ * 01-Jun-95: This should look more like the original with some updates by
+ *            Scott Draves.
+ * 27-Jun-91: vary number of functions used.
+ * 24-Jun-91: fixed portability problem with integer mod (%).
+ * 06-Jun-91: Written. (received from Scott Draves, spot@cs.cmu.edu).
+ */
+
+#include <math.h>
+#include "screenhack.h"
+
+#include <signal.h>            /* so we can ignore SIGFPE */
+
+#define POINT_BUFFER_SIZE 10
+#define MAXLEV 4
+#define MAXKINDS  10
+
+static double f[2][3][MAXLEV]; /* three non-homogeneous transforms */
+static int max_total;
+static int max_levels;
+static int max_points;
+static int cur_level;
+static int variation;
+static int snum;
+static int anum;
+static int num_points;
+static int total_points;
+static int pixcol;
+static int ncolors;
+static XColor *colors;
+static XPoint points [POINT_BUFFER_SIZE];
+static GC gc;
+
+static int delay, delay2;
+static int width, height;
+
+static short
+halfrandom (int mv)
+{
+  static short lasthalf = 0;
+  unsigned long r;
+
+  if (lasthalf)
+    {
+      r = lasthalf;
+      lasthalf = 0;
+    }
+  else
+    {
+      r = random ();
+      lasthalf = r >> 16;
+    }
+  return (r % mv);
+}
+
+static void
+init_flame (Display *dpy, Window window)
+{
+  XGCValues gcv;
+  XWindowAttributes xgwa;
+  Colormap cmap;
+
+#if defined(SIGFPE) && defined(SIG_IGN)
+  /* No doubt a better fix would be to track down where the NaN is coming
+     from, and code around that; but this should do.  Apparently most systems
+     (Linux, Solaris, Irix, ...) ignore FPE by default -- but FreeBSD dumps
+     core by default. */
+  signal (SIGFPE, SIG_IGN);
+#endif
+
+  XGetWindowAttributes (dpy, window, &xgwa);
+  width = xgwa.width;
+  height = xgwa.height;
+  cmap = xgwa.colormap;
+
+  max_points = get_integer_resource ("iterations", "Integer");
+  if (max_points <= 0) max_points = 100;
+
+  max_levels = max_points;
+
+  max_total = get_integer_resource ("points", "Integer");
+  if (max_total <= 0) max_total = 10000;
+
+  delay = get_integer_resource ("delay", "Integer");
+  if (delay < 0) delay = 0;
+  delay2 = get_integer_resource ("delay2", "Integer");
+  if (delay2 < 0) delay2 = 0;
+
+  variation = random() % MAXKINDS;
+
+  if (mono_p)
+    ncolors = 0;
+  else
+    {
+      ncolors = get_integer_resource ("colors", "Integer");
+      if (ncolors <= 0) ncolors = 128;
+      colors = (XColor *) malloc ((ncolors+1) * sizeof (*colors));
+      make_smooth_colormap (dpy, xgwa.visual, xgwa.colormap, colors, &ncolors,
+                           True, 0, True);
+      if (ncolors <= 2)
+       mono_p = True, ncolors = 0;
+    }
+
+  gcv.foreground = get_pixel_resource ("foreground", "Foreground", dpy, cmap);
+  gcv.background = get_pixel_resource ("background", "Background", dpy, cmap);
+
+  if (! mono_p)
+    {
+      pixcol = halfrandom (ncolors);
+      gcv.foreground = (colors [pixcol].pixel);
+    }
+
+  gc = XCreateGC (dpy, window, GCForeground | GCBackground, &gcv);
+}
+
+static int
+recurse (double x, double y, int l, Display *dpy, Window win)
+{
+  int xp, yp, i;
+  double nx, ny;
+
+  if (l == max_levels)
+    {
+      total_points++;
+      if (total_points > max_total) /* how long each fractal runs */
+       return 0;
+
+      if (x > -1.0 && x < 1.0 && y > -1.0 && y < 1.0)
+       {
+         xp = points[num_points].x = (int) ((width / 2) * (x + 1.0));
+         yp = points[num_points].y = (int) ((height / 2) * (y + 1.0));
+         num_points++;
+         if (num_points >= POINT_BUFFER_SIZE)
+           {
+             XDrawPoints (dpy, win, gc, points, num_points, CoordModeOrigin);
+             num_points = 0;
+             /* if (delay) usleep (delay); */
+             /* XSync (dpy, False); */
+           }
+       }
+    }
+  else
+    {
+      for (i = 0; i < snum; i++)
+       {
+
+         /* Scale back when values get very large. Spot sez:
+            "I think this happens on HPUX.  I think it's non-IEEE
+            to generate an exception instead of a silent NaN."
+          */
+         if ((abs(x) > 1.0E5) || (abs(y) > 1.0E5))
+           x = x / y;
+
+         nx = f[0][0][i] * x + f[0][1][i] * y + f[0][2][i];
+         ny = f[1][0][i] * x + f[1][1][i] * y + f[1][2][i];
+         if (i < anum)
+           {
+             switch (variation)
+               {
+               case 0: /* sinusoidal */
+                 nx = sin(nx);
+                 ny = sin(ny);
+                 break;
+               case 1: /* complex */
+                 {
+                   double r2 = nx * nx + ny * ny + 1e-6;
+                   nx = nx / r2;
+                   ny = ny / r2;
+                 }
+                 break;
+               case 2: /* bent */
+                 if (nx < 0.0)
+                   nx = nx * 2.0;
+                 if (ny < 0.0)
+                   ny = ny / 2.0;
+                 break;
+               case 3: /* swirl */
+                 {
+                   double r = (nx * nx + ny * ny);     /* times k here is fun */
+                   double c1 = sin(r);
+                   double c2 = cos(r);
+                   double t = nx;
+
+                   if (nx > 1e4 || nx < -1e4 || ny > 1e4 || ny < -1e4)
+                     ny = 1e4;
+                   else
+                     ny = c2 * t + c1 * ny;
+                   nx = c1 * nx - c2 * ny;
+                 }
+                 break;
+               case 4: /* horseshoe */
+                 {
+                   double r, c1, c2, t;
+
+                   /* Avoid atan2: DOMAIN error message */
+                   if (nx == 0.0 && ny == 0.0)
+                     r = 0.0;
+                   else
+                     r = atan2(nx, ny);      /* times k here is fun */
+                   c1 = sin(r);
+                   c2 = cos(r);
+                   t = nx;
+
+                   nx = c1 * nx - c2 * ny;
+                   ny = c2 * t + c1 * ny;
+                 }
+                 break;
+               case 5: /* drape */
+                 {
+                   double t;
+
+                   /* Avoid atan2: DOMAIN error message */
+                   if (nx == 0.0 && ny == 0.0)
+                     t = 0.0;
+                   else
+                     t = atan2(nx, ny) / M_PI;
+
+                   if (nx > 1e4 || nx < -1e4 || ny > 1e4 || ny < -1e4)
+                     ny = 1e4;
+                   else
+                     ny = sqrt(nx * nx + ny * ny) - 1.0;
+                   nx = t;
+                 }
+                 break;
+               case 6: /* broken */
+                 if (nx > 1.0)
+                   nx = nx - 1.0;
+                 if (nx < -1.0)
+                   nx = nx + 1.0;
+                 if (ny > 1.0)
+                   ny = ny - 1.0;
+                 if (ny < -1.0)
+                   ny = ny + 1.0;
+                 break;
+               case 7: /* spherical */
+                 {
+                   double r = 0.5 + sqrt(nx * nx + ny * ny + 1e-6);
+
+                   nx = nx / r;
+                   ny = ny / r;
+                 }
+                 break;
+               case 8: /*  */
+                 nx = atan(nx) / M_PI_2;
+                 ny = atan(ny) / M_PI_2;
+                 break;
+/* #if 0 */  /* core dumps on some machines, why not all? */
+               case 9: /* complex sine */
+                 {
+                   double u = nx;
+                   double v = ny;
+                   double ev = exp(v);
+                   double emv = exp(-v);
+
+                   nx = (ev + emv) * sin(u) / 2.0;
+                   ny = (ev - emv) * cos(u) / 2.0;
+                 }
+                 break;
+               case 10:        /* polynomial */
+                 if (nx < 0)
+                   nx = -nx * nx;
+                 else
+                   nx = nx * nx;
+                 if (ny < 0)
+                   ny = -ny * ny;
+                 else
+                   ny = ny * ny;
+                 break;
+/* #endif */
+               default:
+                 nx = sin(nx);
+                 ny = sin(ny);
+               }
+           }
+         if (!recurse (nx, ny, l + 1, dpy, win))
+           return 0;
+       }
+    }
+  return 1;
+}
+
+
+static void
+flame (Display *dpy, Window window)
+{
+  int i, j, k;
+  static int alt = 0;
+
+  if (!(cur_level++ % max_levels))
+    {
+      if (delay2) usleep (delay2);
+      XClearWindow (dpy, window);
+      alt = !alt;
+
+      variation = random() % MAXKINDS;
+    }
+  else
+    {
+      if (ncolors > 2)
+       {
+         XSetForeground (dpy, gc, colors [pixcol].pixel);
+         if (--pixcol < 0)
+           pixcol = ncolors - 1;
+       }
+    }
+
+  /* number of functions */
+  snum = 2 + (cur_level % (MAXLEV - 1));
+
+  /* how many of them are of alternate form */
+  if (alt)
+    anum = 0;
+  else
+    anum = halfrandom (snum) + 2;
+
+  /* 6 coefs per function */
+  for (k = 0; k < snum; k++)
+    {
+      for (i = 0; i < 2; i++)
+       for (j = 0; j < 3; j++)
+         f[i][j][k] = ((double) (random() & 1023) / 512.0 - 1.0);
+    }
+  num_points = 0;
+  total_points = 0;
+  (void) recurse (0.0, 0.0, 0, dpy, window);
+  XDrawPoints (dpy, window, gc, points, num_points, CoordModeOrigin);
+  XSync (dpy, False);
+  if (delay) usleep (delay);
+}
+
+
+#if defined(__hpux) && defined(PLOSS)
+/* I don't understand why this is necessary, but I'm told that this program
+   does nothing at all on HP-sUX without it.
+
+   I'm further told that HPUX 11.0 doesn't define PLOSS, and works ok without
+   this section.  Go figure.
+ */
+#undef random
+#undef srandom
+#include <math.h>
+int matherr(x)
+   register struct exception *x;
+{
+  if (x->type == PLOSS) return 1;
+  else return 0;
+}
+#endif /* __hpux */
+
+
+\f
+char *progclass = "Flame";
+
+char *defaults [] = {
+  ".background:        black",
+  ".foreground:        white",
+  "*colors:    64",
+  "*iterations:        25",
+  "*delay:     50000",
+  "*delay2:    2000000",
+  "*points:    10000",
+  0
+};
+
+XrmOptionDescRec options [] = {
+  { "-colors",         ".colors",      XrmoptionSepArg, 0 },
+  { "-iterations",     ".iterations",  XrmoptionSepArg, 0 },
+  { "-delay",          ".delay",       XrmoptionSepArg, 0 },
+  { "-delay2",         ".delay2",      XrmoptionSepArg, 0 },
+  { "-points",         ".points",      XrmoptionSepArg, 0 },
+  { 0, 0, 0, 0 }
+};
+
+void
+screenhack (Display *dpy, Window window)
+{
+  init_flame (dpy, window);
+  while (1)
+    {
+      flame (dpy, window);
+      screenhack_handle_events (dpy);
+    }
+}
diff --git a/hacks/flame.man b/hacks/flame.man
new file mode 100644 (file)
index 0000000..a646973
--- /dev/null
@@ -0,0 +1,70 @@
+.TH XScreenSaver 1 "13-aug-92" "X Version 11"
+.SH NAME
+flame - draw weird cosmic fractals
+.SH SYNOPSIS
+.B flame
+[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-colors \fIinteger\fP] [\-iterations \fIinteger\fP] [\-points \fIinteger\fP] [\-delay \fImicroseconds\fP] [\-delay2 \fImicroseconds\fP]
+.SH DESCRIPTION
+The \fIflame\fP program generates colorful fractal displays.
+.SH OPTIONS
+.I flame
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window.  This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-mono 
+If on a color display, pretend we're on a monochrome display.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use.  Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-colors \fIinteger\fP
+How many colors should be used (if possible).  Default 64.
+.TP 8
+.B \-iterations \fIinteger\fP
+How many fractals to generate.  Default 25.
+.TP 8
+.B \-points \fIinteger\fP
+How many pixels to draw for each fractal.  Default 10000.
+.TP 8
+.B \-delay \fImicroseconds\fP
+How long we should wait between drawing each fractal.  Default 50000,
+or about 1/20th second.
+.TP 8
+.B \-delay2 \fImicroseconds\fP
+How long we should wait before clearing the screen when each run ends.
+Default 2000000, or two seconds.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1),
+.BR xlock (1)
+.SH COPYRIGHT
+Copyright \(co 1991 by Patrick J. Naughton
+
+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. 
+.SH AUTHOR
+Scott Graves <spot@cs.cmu.edu>, 06-Jun-91.n
+
+Ability to run standalone or with \fIxscreensaver\fP added by 
+Jamie Zawinski <jwz@jwz.org>, 18-Oct-93.
diff --git a/hacks/flow.c b/hacks/flow.c
new file mode 100644 (file)
index 0000000..f606e05
--- /dev/null
@@ -0,0 +1,567 @@
+/* -*- Mode: C; tab-width: 4 -*- */
+/* flow --- flow of strange bees */
+
+#if !defined( lint ) && !defined( SABER )
+static const char sccsid[] = "@(#)flow.c 4.10 98/04/24 xlockmore";
+
+#endif
+
+/*-
+ * Copyright (c) 1996 by Tim Auckland <Tim.Auckland@Sun.COM>
+ *
+ * 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.
+ *
+ * This file is provided AS IS with no warranties of any kind.  The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof.  In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * "flow" shows a variety of continuous phase-space flows around strange
+ * attractors.  It includes the well-known Lorentz mask (the "Butterfly"
+ * of chaos fame), two forms of Rossler's "Folded Band" and Poincare'
+ * sections of the "Birkhoff Bagel" and Duffing's forced occilator.
+ *
+ * Revision History:
+ * 31-Nov-98: [TDA] Added Duffing  (what a strange day that was :) DAB)
+ *   Duffing's forced oscillator has been added to the formula list and
+ *   the parameters section has been updated to display it in Poincare'
+ *   section.
+ * 30-Nov-98: [TDA] Added travelling perspective option
+ *   A more exciting point-of-view has been added to all autonomous flows.
+ *   This views the flow as seen by a particle moving with the flow.  In the
+ *   metaphor of the original code, I've attached a camera to one of the
+ *   trained bees!
+ * 30-Nov-98: [TDA] Much code cleanup.
+ * 09-Apr-97: [TDA] Ported to xlockmore-4
+ * 18-Jul-96: Adapted from swarm.c Copyright (c) 1991 by Patrick J. Naughton.
+ * 31-Aug-90: Adapted from xswarm by Jeff Butterworth. (butterwo@ncsc.org)
+ */
+
+#ifdef STANDALONE
+# define PROGCLASS     "Flow"
+# define HACK_INIT     init_flow
+# define HACK_DRAW     draw_flow
+# define flow_opts     xlockmore_opts
+# define DEFAULTS      "*delay:                1000 \n" \
+                                       "*count:                1024 \n" \
+                                       "*cycles:               3000 \n" \
+                                       "*ncolors:              200 \n"
+# define SMOOTH_COLORS
+# include "xlockmore.h"                /* in xscreensaver distribution */
+# include "erase.h"
+
+#else /* STANDALONE */
+# include "xlock.h"            /* in xlockmore distribution */
+#endif /* STANDALONE */
+
+ModeSpecOpt flow_opts = { 0, NULL, 0, NULL, NULL };
+
+#ifdef USE_MODULES
+ModStruct   flow_description = {
+       "flow", "init_flow", "draw_flow", "release_flow",
+       "refresh_flow", "init_flow", NULL, &flow_opts,
+       1000, 1024, 3000, 1, 64, 1.0, "",
+       "Shows dynamic strange attractors", 0, NULL
+};
+
+#endif
+
+typedef struct {
+       double      x;
+       double      y;
+       double      z;
+} dvector;
+
+typedef struct {
+       double      a, b, c;
+} Par;
+
+/* Macros */
+#define X(t,b) (sp->p[t][b].x)
+#define Y(t,b) (sp->p[t][b].y)
+#define Z(t,b) (sp->p[t][b].z)
+#define balance_rand(v)        ((LRAND()/MAXRAND*(v))-((v)/2)) /* random around 0 */
+#define SCALE_X(A) (sp->width/2+sp->width/sp->size*(A))
+#define SCALE_Y(A) (sp->height/2+sp->height/sp->size*(A))
+
+typedef struct {
+       int         width;
+       int         height;
+       int         count;
+       double      size;
+       
+       int         beecount;   /* number of bees */
+       XSegment   *csegs;          /* bee lines */
+       int        *cnsegs;
+       XSegment   *old_segs;   /* old bee lines */
+       int         nold_segs;
+       double      step;
+       dvector     centre;             /* centre */
+       struct {
+               double  depth;
+               double  height;
+       }           view;
+       dvector    *p[2];   /* bee positions x[time][bee#] */
+       struct {
+               double  theta;
+               double  dtheta;
+               double  phi;
+               double  dphi;
+       }           tumble;
+       dvector  (*ODE) (Par par, double x, double y, double z);
+       Par         par;
+} flowstruct;
+
+static flowstruct *flows = NULL;
+
+static dvector
+Lorentz(Par par, double x, double y, double z)
+{
+       dvector d;
+
+       d.x = par.a * (y - x);
+       d.y = x * (par.b - z) - y;
+       d.z = x * y - par.c * z;
+       return d;
+}
+
+static dvector
+Rossler(Par par, double x, double y, double z)
+{
+       dvector d;
+
+       d.x = -(y + par.a * z);
+       d.y = x + y * par.b;
+       d.z = par.c + z * (x - 5.7);
+       return d;
+}
+
+static dvector
+RosslerCone(Par par, double x, double y, double z)
+{
+       dvector d;
+
+       d.x = -(y + par.a * z);
+       d.y = x + y * par.b - z * z * par.c;
+       d.z = 0.2 + z * (x - 5.7);
+       return d;
+}
+
+static dvector
+Birkhoff(Par par, double x, double y, double z)
+{
+       dvector d;
+
+       d.x = -y + par.b * sin(z);
+       d.y = 0.7 * x + par.a * y * (0.1 - x * x);
+       d.z = par.c;
+       return d;
+}
+
+static dvector
+Duffing(Par par, double x, double y, double z)
+{
+       dvector d;
+
+       d.x = -par.a * x - y/2 - y * y * y/8 + par.b * cos(z);
+       d.y = 2*x;
+       d.z = par.c;
+       return d;
+}
+
+void
+init_flow(ModeInfo * mi)
+{
+       flowstruct *sp;
+       int         b;
+       double      beemult = 1;
+       dvector     range;
+       static int  allocated = 0;
+
+       if (flows == NULL) {
+               if ((flows = (flowstruct *) calloc(MI_NUM_SCREENS(mi),
+                                              sizeof (flowstruct))) == NULL)
+                       return;
+       }
+       sp = &flows[MI_SCREEN(mi)];
+
+       sp->count = 0;
+
+       sp->width = MI_WIDTH(mi);
+       sp->height = MI_HEIGHT(mi);
+
+       sp->tumble.theta = balance_rand(M_PI);
+       sp->tumble.phi = balance_rand(M_PI);
+       sp->tumble.dtheta = 0.002;
+       sp->tumble.dphi = 0.001;
+       sp->view.height = 0;
+       sp->view.depth = 0; /* no perspective view */
+
+       switch (NRAND(8)) {
+       case 0:
+               sp->view.depth = 10;
+               sp->view.height = 0.2;
+               beemult = 3;
+       case 1:
+               sp->ODE = Lorentz;
+               sp->step = 0.02;
+               sp->size = 60;
+               sp->centre.x = 0;
+               sp->centre.y = 0;
+               sp->centre.z = 24;
+               range.x = 5;
+               range.y = 5;
+               range.z = 1;
+               sp->par.a = 10 + balance_rand(5);
+               sp->par.b = 28 + balance_rand(5);
+               sp->par.c = 2 + balance_rand(1);
+               break;
+       case 2:
+               sp->view.depth = 10;
+               sp->view.height = 0.1;
+               beemult = 4;
+       case 3:
+               sp->ODE = Rossler;
+               sp->step = 0.05;
+               sp->size = 24;
+               sp->centre.x = 0;
+               sp->centre.y = 0;
+               sp->centre.z = 3;
+               range.x = 4;
+               range.y = 4;
+               range.z = 7;
+               sp->par.a = 2 + balance_rand(1);
+               sp->par.b = 0.2 + balance_rand(0.1);
+               sp->par.c = 0.2 + balance_rand(0.1);
+               break;
+       case 4:
+               sp->view.depth = 10;
+               sp->view.height = 0.1;
+               beemult = 3;
+       case 5:
+               sp->ODE = RosslerCone;
+               sp->step = 0.05;
+               sp->size = 24;
+               sp->centre.x = 0;
+               sp->centre.y = 0;
+               sp->centre.z = 3;
+               range.x = 4;
+               range.y = 4;
+               range.z = 4;
+               sp->par.a = 2;
+               sp->par.b = 0.2;
+               sp->par.c = 0.25 + balance_rand(0.09);
+               break;
+       case 6:
+               sp->ODE = Birkhoff;
+               sp->step = 0.04;
+               sp->size = 2.6;
+               sp->centre.x = 0;
+               sp->centre.y = 0;
+               sp->centre.z = 0;
+               range.x = 3;
+               range.y = 4;
+               range.z = 0;
+               sp->par.a = 10 + balance_rand(5);
+               sp->par.b = 0.35 + balance_rand(0.25);
+               sp->par.c = 1.57;
+               sp->tumble.theta = 0;
+               sp->tumble.phi = 0;
+               sp->tumble.dtheta = 0;
+               sp->tumble.dphi = 0;
+               break;
+       case 7:
+       default:
+               sp->ODE = Duffing;
+               sp->step = 0.02;
+               sp->size = 30;
+               sp->centre.x = 0;
+               sp->centre.y = 0;
+               sp->centre.z = 0;
+               range.x = 20;
+               range.y = 20;
+               range.z = 0;
+               sp->par.a = 0.2 + balance_rand(0.1);
+               sp->par.b = 27.0 + balance_rand(3.0);
+               sp->par.c = 1.33;
+               sp->tumble.theta = 0;
+               sp->tumble.phi = 0;
+               sp->tumble.dtheta = -NRAND(2)*sp->par.c*sp->step;
+               sp->tumble.dphi = 0;
+               beemult = 0.5;
+               break;
+       }
+
+       sp->beecount = beemult * MI_COUNT(mi);
+       if (sp->beecount < 0)   /* random variations */ 
+               sp->beecount = NRAND(-sp->beecount) + 1; /* Minimum 1 */
+
+       /* Clear the background. */
+       MI_CLEARWINDOW(mi);
+
+       if(!allocated || sp->beecount != allocated){ /* reallocate */
+               if (sp->csegs != NULL) {
+                       (void) free((void *) sp->csegs);
+                       sp->csegs = NULL;
+               }
+               if (sp->cnsegs != NULL) {
+                       (void) free((void *) sp->cnsegs);
+                       sp->cnsegs = NULL;
+               }
+               if (sp->old_segs != NULL) {
+                       (void) free((void *) sp->old_segs);
+                       sp->old_segs = NULL;
+               }
+               if (sp->p[0] != NULL) {
+                       (void) free((void *) sp->p[0]);
+                       sp->p[0] = NULL;
+               }
+               if (sp->p[1] != NULL) {
+                       (void) free((void *) sp->p[1]);
+                       sp->p[1] = NULL;
+               }
+       }
+
+       /* Allocate memory. */
+
+       if (!sp->csegs) {
+               sp->csegs = (XSegment *) malloc(sizeof (XSegment) * sp->beecount
+                                               * MI_NPIXELS(mi));
+               sp->cnsegs = (int *) malloc(sizeof (int) * MI_NPIXELS(mi));
+
+               sp->old_segs = (XSegment *) malloc(sizeof (XSegment) * sp->beecount);
+               sp->p[0] = (dvector *) malloc(sizeof (dvector) * sp->beecount);
+               sp->p[1] = (dvector *) malloc(sizeof (dvector) * sp->beecount);
+       }
+
+       /* Initialize point positions, velocities, etc. */
+
+       for (b = 0; b < sp->beecount; b++) {
+               X(1, b) = X(0, b) = balance_rand(range.x);
+               Y(1, b) = Y(0, b) = balance_rand(range.y);
+               Z(1, b) = Z(0, b) = balance_rand(range.z);
+       }
+}
+
+void
+draw_flow(ModeInfo * mi)
+{
+       Display    *display = MI_DISPLAY(mi);
+       Window      window = MI_WINDOW(mi);
+       GC          gc = MI_GC(mi);
+       flowstruct *sp = &flows[MI_SCREEN(mi)];
+       int         b, c, i;
+       int         col, ix;
+       double      M[3][3]; /* transformation matrix */
+
+       if(!sp->view.depth){ /* simple 3D tumble */
+               double      sint, cost, sinp, cosp;
+               sp->tumble.theta += sp->tumble.dtheta;
+               sp->tumble.phi += sp->tumble.dphi;
+               sint = sin(sp->tumble.theta);
+               cost = cos(sp->tumble.theta);
+               sinp = sin(sp->tumble.phi);
+               cosp = cos(sp->tumble.phi);
+               M[0][0]= cost; M[0][1]=-sint*cosp; M[0][2]= sint*sinp;
+               M[1][0]= sint; M[1][1]= cost*cosp; M[1][2]=-cost*sinp;
+               M[2][0]= 0;    M[2][1]= 0;         M[2][2]= 1;
+       } else { /* initialize matrix */
+               M[0][0]= 0; M[0][1]= 0; M[0][2]= 0;
+               M[1][0]= 0; M[1][1]= 0; M[1][2]= 0;
+               M[2][0]= 0; M[2][1]= 0; M[2][2]= 0;
+
+       }
+
+       for (col = 0; col < MI_NPIXELS(mi); col++)
+               sp->cnsegs[col] = 0;
+
+       MI_IS_DRAWN(mi) = True;
+
+       /* <=- Bees -=> */
+       for (b = 0; b < sp->beecount; b++) {
+               /* Age the arrays. */
+               X(1, b) = X(0, b);
+               Y(1, b) = Y(0, b);
+               Z(1, b) = Z(0, b);
+
+               /* 2nd order Kunge Kutta */
+               {
+                       dvector     k1, k2;
+
+                       k1 = sp->ODE(sp->par, X(1, b), Y(1, b), Z(1, b));
+                       k1.x *= sp->step;
+                       k1.y *= sp->step;
+                       k1.z *= sp->step;
+                       k2 = sp->ODE(sp->par, X(1, b) + k1.x, Y(1, b) + k1.y, Z(1, b) + k1.z);
+                       k2.x *= sp->step;
+                       k2.y *= sp->step;
+                       k2.z *= sp->step;
+                       X(0, b) = X(1, b) + (k1.x + k2.x) / 2.0;
+                       Y(0, b) = Y(1, b) + (k1.y + k2.y) / 2.0;
+                       Z(0, b) = Z(1, b) + (k1.z + k2.z) / 2.0;
+               }
+
+               /* Colour according to bee */
+               col = b % (MI_NPIXELS(mi) - 1);
+               ix = col * sp->beecount + sp->cnsegs[col];
+
+               /* Fill the segment lists. */
+
+               if(sp->view.depth) /* perspective view has special points */
+                       if(b==0){ /* point of view */
+                               sp->centre.x=X(0, b);
+                               sp->centre.y=Y(0, b);
+                               sp->centre.z=Z(0, b);
+                       }else if(b==1){ /* neighbour: used to compute local axes */
+                               double x[3], p[3], x2=0, xp=0;
+                               int j;
+
+                               /* forward */                           
+                               x[0] = X(0, 0) - X(1, 0);
+                               x[1] = Y(0, 0) - Y(1, 0);
+                               x[2] = Z(0, 0) - Z(1, 0);
+                       
+                               /* neighbour */
+                               p[0] = X(0, 1) - X(1, 0);
+                               p[1] = Y(0, 1) - Y(1, 0);
+                               p[2] = Z(0, 1) - Z(1, 0);
+
+                               for(i=0; i<3; i++){
+                                       x2+= x[i]*x[i];    /* X . X */
+                                       xp+= x[i]*p[i];    /* X . P */
+                                       M[0][i] = x[i];    /* X */
+                               }
+
+                               for(i=0; i<3; i++)               /* (X x P) x X */
+                                       M[1][i] = x2*p[i] - xp*x[i]; /* == (X . X) P - (X . P) X */
+                               
+                               M[2][0] =  x[1]*p[2] - x[2]*p[1]; /* X x P */
+                               M[2][1] = -x[0]*p[2] + x[2]*p[0];
+                               M[2][2] =  x[0]*p[1] - x[1]*p[0];
+
+                               /* normalise axes */
+                               for(j=0; j<3; j++){
+                                       double A=0;
+                                       for(i=0; i<3; i++) A+=M[j][i]*M[j][i]; /* sum squares */
+                                       A=sqrt(A);
+                                       for(i=0; i<3; i++) M[j][i]/=A;
+                               }
+
+                               X(0, 1)=X(0, 0)+M[1][0]; /* adjust neighbour */
+                               Y(0, 1)=Y(0, 0)+M[1][1];
+                               Z(0, 1)=Z(0, 0)+M[1][2];
+
+#if 0  /* display local axes for testing */
+                               X(1, b)=X(0, 0);
+                               Y(1, b)=Y(0, 0);
+                               Z(1, b)=Z(0, 0);
+                       }else if(b==2){
+                               X(0, b)=X(0, 0)+0.5*M[0][0];
+                               Y(0, b)=Y(0, 0)+0.5*M[0][1];
+                               Z(0, b)=Z(0, 0)+0.5*M[0][2];
+                               X(1, b)=X(0, 0);
+                               Y(1, b)=Y(0, 0);
+                               Z(1, b)=Z(0, 0);
+                       }else if(b==3){
+                               X(0, b)=X(0, 0)+1.5*M[2][0];
+                               Y(0, b)=Y(0, 0)+1.5*M[2][1];
+                               Z(0, b)=Z(0, 0)+1.5*M[2][2];
+                               X(1, b)=X(0, 0);
+                               Y(1, b)=Y(0, 0);
+                               Z(1, b)=Z(0, 0);
+#endif
+                       }
+               
+               for(i=0; i<2; i++){
+                       double x=X(i,b)-sp->centre.x;
+                       double y=Y(i,b)-sp->centre.y;
+                       double z=Z(i,b)-sp->centre.z;
+                       double X=M[0][0]*x + M[0][1]*y + M[0][2]*z;
+                       double Y=M[1][0]*x + M[1][1]*y + M[1][2]*z;
+                       double Z=M[2][0]*x + M[2][1]*y + M[2][2]*z+sp->view.height;
+                       double absx, absy;                              
+                       if(sp->view.depth){
+                               if(X <= 0) break;
+                               absx=SCALE_X(sp->view.depth*Y/X);
+                               absy=SCALE_Y(sp->view.depth*Z/X);
+                               if(absx < -sp->width || absx > 2*sp->width ||
+                                  absy < -sp->height || absy > 2*sp->height)
+                                       break;
+                       }else{
+                               absx=SCALE_X(X);
+                               absy=SCALE_Y(Y);
+                       }
+                       if(i){
+                               sp->csegs[ix].x1 = (short) absx;
+                               sp->csegs[ix].y1 = (short) absy;
+                       }else{
+                               sp->csegs[ix].x2 = (short) absx;
+                               sp->csegs[ix].y2 = (short) absy;
+                       }
+               }
+               if(i == 2) /* both assigned */
+                       sp->cnsegs[col]++;
+    }
+       if (sp->count) { /* erase */
+               XSetForeground(display, gc, MI_BLACK_PIXEL(mi));
+               XDrawSegments(display, window, gc, sp->old_segs, sp->nold_segs);
+       }
+
+       if (MI_NPIXELS(mi) > 2){ /* render colour */
+               for (col = 0; col < MI_NPIXELS(mi); col++)
+                       if (sp->cnsegs[col] > 0) {
+                               XSetForeground(display, gc, MI_PIXEL(mi, col));
+                               XDrawSegments(display, window, gc,
+                                             sp->csegs + col * sp->beecount, sp->cnsegs[col]);
+                       }
+       } else {                /* render mono */
+               XSetForeground(display, gc, MI_WHITE_PIXEL(mi));
+               XDrawSegments(display, window, gc,
+                                         sp->csegs + col * sp->beecount, sp->cnsegs[col]);
+       }
+
+       /* Copy to erase-list */
+       for (col = 0, c = 0; col < MI_NPIXELS(mi); col++)
+               for (b = 0; b < sp->cnsegs[col]; b++)
+                       sp->old_segs[c++] = (sp->csegs + col * sp->beecount)[b];
+       sp->nold_segs = c;
+
+       if (++sp->count > MI_CYCLES(mi)) /* pick a new flow */
+               init_flow(mi);
+}
+
+void
+release_flow(ModeInfo * mi)
+{
+       if (flows != NULL) {
+               int         screen;
+
+               for (screen = 0; screen < MI_NUM_SCREENS(mi); screen++) {
+                       flowstruct *sp = &flows[screen];
+
+                       if (sp->csegs != NULL)
+                               (void) free((void *) sp->csegs);
+                       if (sp->cnsegs != NULL)
+                               (void) free((void *) sp->cnsegs);
+                       if (sp->old_segs != NULL)
+                               (void) free((void *) sp->old_segs);
+                       if (sp->p[0] != NULL)
+                               (void) free((void *) sp->p[0]);
+                       if (sp->p[1] != NULL)
+                               (void) free((void *) sp->p[1]);
+               }
+               (void) free((void *) flows);
+               flows = NULL;
+       }
+}
+
+void
+refresh_flow(ModeInfo * mi)
+{
+       MI_CLEARWINDOW(mi);
+}
diff --git a/hacks/forest.c b/hacks/forest.c
new file mode 100644 (file)
index 0000000..54fe807
--- /dev/null
@@ -0,0 +1,211 @@
+/* -*- Mode: C; tab-width: 4 -*-
+ * forest.c --- draw a fractal forest.
+ */
+#if !defined( lint ) && !defined( SABER )
+static const char sccsid[] = "@(#)forest.c     4.03 97/05/10 xlockmore";
+#endif
+
+/* Copyright (c) 1995 Pascal Pensa <pensa@aurora.unice.fr>
+ *
+ * Original idea : Guillaume Ramey <ramey@aurora.unice.fr>
+ *
+ * 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.
+ *
+ * This file is provided AS IS with no warranties of any kind.  The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof.  In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * Revision History:
+ * 10-May-97: Compatible with xscreensaver
+ */
+
+#ifdef STANDALONE
+# define PROGCLASS                                     "Forest"
+# define HACK_INIT                                     init_forest
+# define HACK_DRAW                                     draw_forest
+# define forest_opts                           xlockmore_opts
+# define DEFAULTS      "*count:                100     \n"                     \
+                                       "*cycles:               200     \n"                     \
+                                       "*delay:                400000  \n"                     \
+                                       "*ncolors:              100     \n"
+# define UNIFORM_COLORS
+# include "xlockmore.h"                                /* from the xscreensaver distribution */
+# include "erase.h"
+#else  /* !STANDALONE */
+# include "xlock.h"                                    /* from the xlockmore distribution */
+#endif /* !STANDALONE */
+
+ModeSpecOpt forest_opts = {
+  0, NULL, 0, NULL, NULL };
+
+
+#define MINTREES   1
+
+#define MINHEIGHT  20          /* Tree height range */
+#define MAXHEIGHT  40
+
+#define MINANGLE   15          /* (degree) angle between soon */
+#define MAXANGLE   35
+#define RANDANGLE  15          /* (degree) Max random angle from default */
+
+#define REDUCE     90          /* Height % from father */
+
+#define ITERLEVEL  10          /* Tree iteration */
+
+#define COLORSPEED  2          /* Color increment */
+
+/* degree to radian */
+#define DEGTORAD(x) (((float)(x)) * M_PI / 180.0)
+
+#define RANGE_RAND(min,max) ((min) + NRAND((max) - (min)))
+
+typedef struct {
+       int         width;
+       int         height;
+       int         time;       /* up time */
+       int         ntrees;
+} foreststruct;
+
+static foreststruct *forests = NULL;
+
+static void
+draw_tree(ModeInfo * mi,
+         short int x, short int y, short int len,
+         float a, float as, short int c, short int level)
+                               /* Father's end */
+                               /* Length */
+                               /* color */
+                               /* Height level */
+                               /* Father's angle */
+                               /* Father's angle step */
+{
+       Display    *display = MI_DISPLAY(mi);
+       Window      window = MI_WINDOW(mi);
+       GC          gc = MI_GC(mi);
+       short       x_1, y_1, x_2, y_2;
+       float       a1, a2;
+
+       /* left */
+
+       a1 = a + as + DEGTORAD(NRAND(2 * RANDANGLE) - RANDANGLE);
+
+       x_1 = x + (short) (COSF(a1) * ((float) len));
+       y_1 = y + (short) (SINF(a1) * ((float) len));
+
+       /* right */
+
+       a2 = a - as + DEGTORAD(NRAND(2 * RANDANGLE) - RANDANGLE);
+
+       x_2 = x + (short) (COSF(a2) * ((float) len));
+       y_2 = y + (short) (SINF(a2) * ((float) len));
+
+       if (MI_NPIXELS(mi) > 2) {
+               XSetForeground(display, gc, MI_PIXEL(mi, c));
+               c = (c + COLORSPEED) % MI_NPIXELS(mi);
+       } else
+               XSetForeground(display, gc, MI_WIN_WHITE_PIXEL(mi));
+
+       XDrawLine(display, window, gc, x, y, x_1, y_1);
+       XDrawLine(display, window, gc, x, y, x_2, y_2);
+
+       if (level < 2) {
+               XDrawLine(display, window, gc, x + 1, y, x_1 + 1, y_1);
+               XDrawLine(display, window, gc, x + 1, y, x_2 + 1, y_2);
+       }
+       len = (len * REDUCE * 10) / 1000;
+
+       if (level < ITERLEVEL) {
+               draw_tree(mi, x_1, y_1, len, a1, as, c, level + 1);
+               draw_tree(mi, x_2, y_2, len, a2, as, c, level + 1);
+       }
+}
+
+void
+init_forest(ModeInfo * mi)
+{
+       foreststruct *fp;
+
+       if (forests == NULL) {
+               if ((forests = (foreststruct *) calloc(MI_NUM_SCREENS(mi),
+                                            sizeof (foreststruct))) == NULL)
+                       return;
+       }
+       fp = &forests[MI_SCREEN(mi)];
+
+       fp->width = MI_WIN_WIDTH(mi);
+       fp->height = MI_WIN_HEIGHT(mi);
+       fp->time = 0;
+
+       fp->ntrees = MI_BATCHCOUNT(mi);
+       if (fp->ntrees < -MINTREES)
+               fp->ntrees = NRAND(-fp->ntrees - MINTREES + 1) + MINTREES;
+       else if (fp->ntrees < MINTREES)
+               fp->ntrees = MINTREES;
+       XClearWindow(MI_DISPLAY(mi), MI_WINDOW(mi));
+}
+
+void
+draw_forest(ModeInfo * mi)
+{
+       Display    *display = MI_DISPLAY(mi);
+       GC          gc = MI_GC(mi);
+       foreststruct *fp = &forests[MI_SCREEN(mi)];
+       short       x, y, x_2, y_2, len, c = 0;
+       float       a, as;
+
+       if (fp->time < fp->ntrees) {
+
+               x = RANGE_RAND(0, fp->width);
+               y = RANGE_RAND(0, fp->height + MAXHEIGHT);
+               a = -M_PI / 2.0 + DEGTORAD(NRAND(2 * RANDANGLE) - RANDANGLE);
+               as = DEGTORAD(RANGE_RAND(MINANGLE, MAXANGLE));
+               len = ((RANGE_RAND(MINHEIGHT, MAXHEIGHT) * (fp->width / 20)) / 50) + 2;
+
+               if (MI_NPIXELS(mi) > 2) {
+                       c = NRAND(MI_NPIXELS(mi));
+                       XSetForeground(display, gc, MI_PIXEL(mi, c));
+                       c = (c + COLORSPEED) % MI_NPIXELS(mi);
+               } else
+                       XSetForeground(display, gc, MI_WIN_WHITE_PIXEL(mi));
+
+               x_2 = x + (short) (COSF(a) * ((float) len));
+               y_2 = y + (short) (SINF(a) * ((float) len));
+
+               XDrawLine(display, MI_WINDOW(mi), gc, x, y, x_2, y_2);
+               XDrawLine(display, MI_WINDOW(mi), gc, x + 1, y, x_2 + 1, y_2);
+
+               draw_tree(mi, x_2, y_2, (len * REDUCE) / 100, a, as, c, 1);
+       }
+       if (++fp->time > MI_CYCLES(mi)) {
+#ifdef STANDALONE
+         erase_full_window(MI_DISPLAY(mi), MI_WINDOW(mi));
+#endif /* STANDALONE */
+         init_forest(mi);
+       }
+}
+
+void
+release_forest(ModeInfo * mi)
+{
+       if (forests != NULL) {
+               (void) free((void *) forests);
+               forests = NULL;
+       }
+}
+
+void
+refresh_forest(ModeInfo * mi)
+{
+       foreststruct *fp = &forests[MI_SCREEN(mi)];
+
+       if (fp->time < fp->ntrees)
+               XClearWindow(MI_DISPLAY(mi), MI_WINDOW(mi));
+       else
+               init_forest(mi);
+}
diff --git a/hacks/forest.man b/hacks/forest.man
new file mode 100644 (file)
index 0000000..9f2d2c6
--- /dev/null
@@ -0,0 +1,63 @@
+.TH XScreenSaver 1 "27-May-97" "X Version 11"
+.SH NAME
+forest - draws a fractal forest
+.SH SYNOPSIS
+.B forest
+[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-ncolors \fIinteger\fP] [\-delay \fImicroseconds\fP] [\-cycles \fIinteger\fP] [\-count \fIinteger\fP]
+
+.SH DESCRIPTION
+The \fIforest\fP program draws a fractal forest.
+.SH OPTIONS
+.I forest
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window.  This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-mono 
+If on a color display, pretend we're on a monochrome display.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use.  Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-ncolors \fIinteger\fP
+How many colors should be used (if possible).  Default 100.
+.TP 8
+.B \-cycles \fIinteger\fP
+
+.TP 8
+.B \-count \fIinteger\fP
+
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1),
+.BR xlock (1)
+.SH COPYRIGHT
+Copyright \(co 1995 by Pascal Pensa.
+
+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. 
+.SH AUTHOR
+Pascal Pensa <pensa@aurora.unice.fr>, 1995.
+
+Ability to run standalone or with \fIxscreensaver\fP added by 
+Jamie Zawinski <jwz@jwz.org>, 27-May-97.
diff --git a/hacks/galaxy.c b/hacks/galaxy.c
new file mode 100644 (file)
index 0000000..b75ff03
--- /dev/null
@@ -0,0 +1,469 @@
+/* -*- Mode: C; tab-width: 4 -*- */
+/* galaxy --- spinning galaxies */
+
+#if !defined( lint ) && !defined( SABER )
+static const char sccsid[] = "@(#)galaxy.c     4.04 97/07/28 xlockmore";
+#endif
+
+/* Originally done by Uli Siegmund <uli@wombat.okapi.sub.org> on Amiga
+ *   for EGS in Cluster
+ * Port from Cluster/EGS to C/Intuition by Harald Backert
+ * Port to X11 and incorporation into xlockmore by Hubert Feyrer
+ *   <hubert.feyrer@rz.uni-regensburg.de>
+ *
+ * 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.
+ *
+ * This file is provided AS IS with no warranties of any kind.  The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof.  In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * Revision History:
+ * 10-May-97: jwz@jwz.org: turned into a standalone program.
+ * 18-Apr-97: Memory leak fixed by Tom Schmidt <tschmidt@micron.com>
+ * 07-Apr-97: Modified by Dave Mitchell <davem@magnet.com>
+ * 23-Oct-94: Modified by David Bagley <bagleyd@bigfoot.com>
+ *             random star sizes
+ *             colors change depending on velocity
+ * 10-Oct-94: Add colors by Hubert Feyer
+ * 30-Sep-94: Initial port by Hubert Feyer
+ * 09-Mar-94: VMS can generate a random number 0.0 which results in a
+ *            division by zero, corrected by Jouk Jansen
+ *            <joukj@crys.chem.uva.nl>
+ */
+
+#ifdef STANDALONE
+# define PROGCLASS                                     "Galaxy"
+# define HACK_INIT                                     init_galaxy
+# define HACK_DRAW                                     draw_galaxy
+# define galaxy_opts                           xlockmore_opts
+# define DEFAULTS      "*delay:                100  \n"                        \
+                                       "*count:                -5   \n"                        \
+                                       "*cycles:               250  \n"                        \
+                                       "*size:                 -3   \n"                        \
+                                       "*ncolors:              64   \n"
+# define UNIFORM_COLORS
+# include "xlockmore.h"                                /* from the xscreensaver distribution */
+#else  /* !STANDALONE */
+# include "xlock.h"                                    /* from the xlockmore distribution */
+#endif /* !STANDALONE */
+
+static Bool tracks;
+
+#define DEF_TRACKS "False"
+
+static XrmOptionDescRec opts[] =
+{
+       {"-tracks", ".galaxy.tracks", XrmoptionNoArg, (caddr_t) "on"},
+       {"+tracks", ".galaxy.tracks", XrmoptionNoArg, (caddr_t) "off"}
+};
+
+static argtype vars[] =
+{
+       {(caddr_t *) & tracks, "tracks", "Tracks", DEF_TRACKS, t_Bool}
+};
+
+static OptionStruct desc[] =
+{
+       {"-/+tracks", "turn on/off star tracks"}
+};
+
+ModeSpecOpt galaxy_opts = { 2, opts, 1, vars, desc };
+
+
+#define FLOATRAND ((double) LRAND() / ((double) MAXRAND))
+
+#if 0
+#define WRAP       1           /* Warp around edges */
+#define BOUNCE     1           /* Bounce from borders */
+#endif
+
+#define MINSIZE       1
+#define MINGALAXIES    1
+#define MAX_STARS    300
+#define MAX_IDELTAT    50
+/* These come originally from the Cluster-version */
+#define DEFAULT_GALAXIES  2
+#define DEFAULT_STARS    1000
+#define DEFAULT_HITITERATIONS  7500
+#define DEFAULT_IDELTAT    200 /* 0.02 */
+#define EPSILON 0.00000001
+
+#define sqrt_EPSILON 0.0001
+
+#define DELTAT (MAX_IDELTAT * 0.0001)
+
+#define GALAXYRANGESIZE  0.1
+#define GALAXYMINSIZE  0.1
+#define QCONS    0.001
+
+/*-
+ *  The following is enabled, it does not look that good for some.
+ *  (But it looks great for me.)  Maybe velocities should be measured
+ *  relative to their galaxy-centers instead of absolute.
+ */
+#if 0
+#undef NO_VELOCITY_COLORING */ /* different colors for different speeds */
+#endif
+
+#define COLORBASE  8
+  /* Colors for stars start here */
+#define COLORSTEP  (NUMCOLORS/COLORBASE)       /* 8 colors per galaxy */
+
+#define drawStar(x,y,size) if(size<=1) XDrawPoint(display,window,gc,x,y);\
+  else XFillArc(display,window,gc,x,y,size,size,0,23040)
+
+typedef struct {
+       double      pos[3], vel[3];
+       int         px, py;
+       int         color;
+       int         size;
+} Star;
+
+typedef struct {
+       int         mass;
+       int         nstars;
+       Star       *stars;
+       double      pos[3], vel[3];
+       int         galcol;
+} Galaxy;
+
+typedef struct {
+       struct {
+               int         left;       /* x minimum */
+               int         right;      /* x maximum */
+               int         top;        /* y minimum */
+               int         bottom;     /* y maximum */
+       } clip;
+       double      mat[3][3];  /* Movement of stars(?) */
+       double      scale;      /* Scale */
+       int         midx;       /* Middle of screen, x */
+       int         midy;       /* Middle of screen, y */
+       double      size;       /* */
+       double      diff[3];    /* */
+       Galaxy     *galaxies;   /* the Whole Universe */
+       int         ngalaxies;  /* # galaxies */
+       int         f_hititerations;    /* # iterations before restart */
+       int         step;       /* */
+} unistruct;
+
+static unistruct *universes = NULL;
+
+static void
+free_galaxies(unistruct * gp)
+{
+       if (gp->galaxies != NULL) {
+               int         i;
+
+               for (i = 0; i < gp->ngalaxies; i++) {
+                       Galaxy     *gt = &gp->galaxies[i];
+
+                       if (gt->stars != NULL)
+                               (void) free((void *) gt->stars);
+               }
+               (void) free((void *) gp->galaxies);
+               gp->galaxies = NULL;
+       }
+}
+
+static void
+startover(ModeInfo * mi)
+{
+       unistruct  *gp = &universes[MI_SCREEN(mi)];
+       int         size = MI_SIZE(mi);
+       int         i, j;       /* more tmp */
+       double      w1, w2;     /* more tmp */
+       double      d, v, w, h; /* yet more tmp */
+
+       gp->step = 0;
+
+       if (MI_BATCHCOUNT(mi) < -MINGALAXIES)
+               free_galaxies(gp);
+       gp->ngalaxies = MI_BATCHCOUNT(mi);
+       if (gp->ngalaxies < -MINGALAXIES)
+               gp->ngalaxies = NRAND(-gp->ngalaxies - MINGALAXIES + 1) + MINGALAXIES;
+       else if (gp->ngalaxies < MINGALAXIES)
+               gp->ngalaxies = MINGALAXIES;
+       if (gp->galaxies == NULL)
+               gp->galaxies = (Galaxy *) calloc(gp->ngalaxies, sizeof (Galaxy));
+
+       for (i = 0; i < gp->ngalaxies; ++i) {
+               Galaxy     *gt = &gp->galaxies[i];
+               double      sinw1, sinw2, cosw1, cosw2;
+
+               gt->galcol = NRAND(COLORBASE - 2);
+               if (gt->galcol > 1)
+                       gt->galcol += 2;        /* Mult 8; 16..31 no green stars */
+               /* Galaxies still may have some green stars but are not all green. */
+
+               if (gt->stars != NULL) {
+                       (void) free((void *) gt->stars);
+                       gt->stars = NULL;
+               }
+               gt->nstars = (NRAND(MAX_STARS / 2)) + MAX_STARS / 2;
+               gt->stars = (Star *) malloc(gt->nstars * sizeof (Star));
+               w1 = 2.0 * M_PI * FLOATRAND;
+               w2 = 2.0 * M_PI * FLOATRAND;
+               sinw1 = SINF(w1);
+               sinw2 = SINF(w2);
+               cosw1 = COSF(w1);
+               cosw2 = COSF(w2);
+
+               gp->mat[0][0] = cosw2;
+               gp->mat[0][1] = -sinw1 * sinw2;
+               gp->mat[0][2] = cosw1 * sinw2;
+               gp->mat[1][0] = 0.0;
+               gp->mat[1][1] = cosw1;
+               gp->mat[1][2] = sinw1;
+               gp->mat[2][0] = -sinw2;
+               gp->mat[2][1] = -sinw1 * cosw2;
+               gp->mat[2][2] = cosw1 * cosw2;
+
+               gt->vel[0] = FLOATRAND * 2.0 - 1.0;
+               gt->vel[1] = FLOATRAND * 2.0 - 1.0;
+               gt->vel[2] = FLOATRAND * 2.0 - 1.0;
+               gt->pos[0] = -gt->vel[0] * DELTAT *
+                       gp->f_hititerations + FLOATRAND - 0.5;
+               gt->pos[1] = -gt->vel[1] * DELTAT *
+                       gp->f_hititerations + FLOATRAND - 0.5;
+               gt->pos[2] = -gt->vel[2] * DELTAT *
+                       gp->f_hititerations + FLOATRAND - 0.5;
+
+               gt->mass = (int) (FLOATRAND * 1000.0) + 1;
+
+               gp->size = GALAXYRANGESIZE * FLOATRAND + GALAXYMINSIZE;
+
+               for (j = 0; j < gt->nstars; ++j) {
+                       Star       *st = &gt->stars[j];
+                       double      sinw, cosw;
+
+                       w = 2.0 * M_PI * FLOATRAND;
+                       sinw = SINF(w);
+                       cosw = COSF(w);
+                       d = FLOATRAND * gp->size;
+                       h = FLOATRAND * exp(-2.0 * (d / gp->size)) / 5.0 * gp->size;
+                       if (FLOATRAND < 0.5)
+                               h = -h;
+                       st->pos[0] = gp->mat[0][0] * d * cosw + gp->mat[1][0] * d * sinw +
+                               gp->mat[2][0] * h + gt->pos[0];
+                       st->pos[1] = gp->mat[0][1] * d * cosw + gp->mat[1][1] * d * sinw +
+                               gp->mat[2][1] * h + gt->pos[1];
+                       st->pos[2] = gp->mat[0][2] * d * cosw + gp->mat[1][2] * d * sinw +
+                               gp->mat[2][2] * h + gt->pos[2];
+
+                       v = sqrt(gt->mass * QCONS / sqrt(d * d + h * h));
+                       st->vel[0] = -gp->mat[0][0] * v * sinw + gp->mat[1][0] * v * cosw +
+                               gt->vel[0];
+                       st->vel[1] = -gp->mat[0][1] * v * sinw + gp->mat[1][1] * v * cosw +
+                               gt->vel[1];
+                       st->vel[2] = -gp->mat[0][2] * v * sinw + gp->mat[1][2] * v * cosw +
+                               gt->vel[2];
+
+                       st->vel[0] *= DELTAT;
+                       st->vel[1] *= DELTAT;
+                       st->vel[2] *= DELTAT;
+
+                       st->px = 0;
+                       st->py = 0;
+
+                       if (size < -MINSIZE)
+                               st->size = NRAND(-size - MINSIZE + 1) + MINSIZE;
+                       else if (size < MINSIZE)
+                               st->size = MINSIZE;
+                       else
+                               st->size = size;
+               }
+       }
+
+       XClearWindow(MI_DISPLAY(mi), MI_WINDOW(mi));
+
+#if 0
+       (void) printf("ngalaxies=%d, f_hititerations=%d\n",
+                     gp->ngalaxies, gp->f_hititerations);
+       (void) printf("f_deltat=%g\n", DELTAT);
+       (void) printf("Screen: ");
+       (void) printf("%dx%d pixel (%d-%d, %d-%d)\n",
+         (gp->clip.right - gp->clip.left), (gp->clip.bottom - gp->clip.top),
+              gp->clip.left, gp->clip.right, gp->clip.top, gp->clip.bottom);
+#endif /*0 */
+}
+
+void
+init_galaxy(ModeInfo * mi)
+{
+       unistruct  *gp;
+
+       if (universes == NULL) {
+               if ((universes = (unistruct *) calloc(MI_NUM_SCREENS(mi),
+                                               sizeof (unistruct))) == NULL)
+                       return;
+       }
+       gp = &universes[MI_SCREEN(mi)];
+
+       gp->f_hititerations = MI_CYCLES(mi);
+
+       gp->clip.left = 0;
+       gp->clip.top = 0;
+       gp->clip.right = MI_WIN_WIDTH(mi);
+       gp->clip.bottom = MI_WIN_HEIGHT(mi);
+
+       gp->scale = (double) (gp->clip.right + gp->clip.bottom) / 8.0;
+       gp->midx = gp->clip.right / 2;
+       gp->midy = gp->clip.bottom / 2;
+       startover(mi);
+}
+
+void
+draw_galaxy(ModeInfo * mi)
+{
+       Display    *display = MI_DISPLAY(mi);
+       Window      window = MI_WINDOW(mi);
+       GC          gc = MI_GC(mi);
+       unistruct  *gp = &universes[MI_SCREEN(mi)];
+       double      d;          /* tmp */
+       int         i, j, k;    /* more tmp */
+
+       for (i = 0; i < gp->ngalaxies; ++i) {
+               Galaxy     *gt = &gp->galaxies[i];
+
+               for (j = 0; j < gp->galaxies[i].nstars; ++j) {
+                       Star       *st = &gt->stars[j];
+                       double      v0 = st->vel[0];
+                       double      v1 = st->vel[1];
+                       double      v2 = st->vel[2];
+
+                       for (k = 0; k < gp->ngalaxies; ++k) {
+                               Galaxy     *gtk = &gp->galaxies[k];
+                               double      d0 = gtk->pos[0] - st->pos[0];
+                               double      d1 = gtk->pos[1] - st->pos[1];
+                               double      d2 = gtk->pos[2] - st->pos[2];
+
+                               d = d0 * d0 + d1 * d1 + d2 * d2;
+                               if (d > EPSILON)
+                                       d = gt->mass / (d * sqrt(d)) * DELTAT * DELTAT * QCONS;
+                               else
+                                       d = gt->mass / (EPSILON * sqrt_EPSILON) * DELTAT * DELTAT * QCONS;
+                               v0 += d0 * d;
+                               v1 += d1 * d;
+                               v2 += d2 * d;
+                       }
+
+                       st->vel[0] = v0;
+                       st->vel[1] = v1;
+                       st->vel[2] = v2;
+
+#ifndef NO_VELOCITY_COLORING
+                       d = (v0 * v0 + v1 * v1 + v2 * v2) / (3.0 * DELTAT * DELTAT);
+                       if (d > (double) COLORSTEP)
+                               st->color = COLORSTEP * gt->galcol + COLORSTEP - 1;
+                       else
+                               st->color = COLORSTEP * gt->galcol + ((int) d) % COLORSTEP;
+#endif
+                       st->pos[0] += v0;
+                       st->pos[1] += v1;
+                       st->pos[2] += v2;
+
+                       if (st->px >= gp->clip.left &&
+                           st->px <= gp->clip.right - st->size &&
+                           st->py >= gp->clip.top &&
+                           st->py <= gp->clip.bottom - st->size) {
+                               XSetForeground(display, gc, MI_WIN_BLACK_PIXEL(mi));
+                               drawStar(st->px, st->py, st->size);
+                       }
+                       st->px = (int) (st->pos[0] * gp->scale) + gp->midx;
+                       st->py = (int) (st->pos[1] * gp->scale) + gp->midy;
+
+
+#ifdef WRAP
+                       if (st->px < gp->clip.left) {
+                               (void) printf("wrap l -> r\n");
+                               st->px = gp->clip.right;
+                       }
+                       if (st->px > gp->clip.right) {
+                               (void) printf("wrap r -> l\n");
+                               st->px = gp->clip.left;
+                       }
+                       if (st->py > gp->clip.bottom) {
+                               (void) printf("wrap b -> t\n");
+                               st->py = gp->clip.top;
+                       }
+                       if (st->py < gp->clip.top) {
+                               (void) printf("wrap t -> b\n");
+                               st->py = gp->clip.bottom;
+                       }
+#endif /*WRAP */
+
+
+                       if (st->px >= gp->clip.left &&
+                           st->px <= gp->clip.right - st->size &&
+                           st->py >= gp->clip.top &&
+                           st->py <= gp->clip.bottom - st->size) {
+                               if (MI_NPIXELS(mi) > 2)
+#ifdef NO_VELOCITY_COLORING
+                                       XSetForeground(display, gc, MI_PIXEL(mi, COLORSTEP * gt->galcol));
+#else
+                                       XSetForeground(display, gc, MI_PIXEL(mi, st->color));
+#endif
+                               else
+                                       XSetForeground(display, gc, MI_WIN_WHITE_PIXEL(mi));
+                               if (tracks)
+                                       drawStar(st->px + 1, st->py, st->size);
+                               else
+                                       drawStar(st->px, st->py, st->size);
+                       }
+               }
+
+               for (k = i + 1; k < gp->ngalaxies; ++k) {
+                       Galaxy     *gtk = &gp->galaxies[k];
+                       double      d0 = gtk->pos[0] - gt->pos[0];
+                       double      d1 = gtk->pos[1] - gt->pos[1];
+                       double      d2 = gtk->pos[2] - gt->pos[2];
+
+                       d = d0 * d0 + d1 * d1 + d2 * d2;
+                       if (d > EPSILON)
+                               d = gt->mass * gt->mass / (d * sqrt(d)) * DELTAT * QCONS;
+                       else
+                               d = gt->mass * gt->mass / (EPSILON * sqrt_EPSILON) * DELTAT * QCONS;
+                       d0 *= d;
+                       d1 *= d;
+                       d2 *= d;
+                       gt->vel[0] += d0 / gt->mass;
+                       gt->vel[1] += d1 / gt->mass;
+                       gt->vel[2] += d2 / gt->mass;
+                       gtk->vel[0] -= d0 / gtk->mass;
+                       gtk->vel[1] -= d1 / gtk->mass;
+                       gtk->vel[2] -= d2 / gtk->mass;
+               }
+               gt->pos[0] += gt->vel[0] * DELTAT;
+               gt->pos[1] += gt->vel[1] * DELTAT;
+               gt->pos[2] += gt->vel[2] * DELTAT;
+       }
+
+       gp->step++;
+       if (gp->step > gp->f_hititerations * 4)
+               startover(mi);
+}
+
+void
+release_galaxy(ModeInfo * mi)
+{
+       if (universes != NULL) {
+               int         screen;
+
+               for (screen = 0; screen < MI_NUM_SCREENS(mi); screen++)
+                       free_galaxies(&universes[screen]);
+               (void) free((void *) universes);
+               universes = NULL;
+       }
+}
+
+void
+refresh_galaxy(ModeInfo * mi)
+{
+       /* Do nothing, it will refresh by itself */
+}
diff --git a/hacks/galaxy.man b/hacks/galaxy.man
new file mode 100644 (file)
index 0000000..2ef9e12
--- /dev/null
@@ -0,0 +1,83 @@
+.TH XScreenSaver 1 "10-May-97" "X Version 11"
+.SH NAME
+galaxy - draws spinning galaxies
+.SH SYNOPSIS
+.B galaxy
+[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-ncolors \fIinteger\fP] [\-delay \fImicroseconds\fP] [\-cycles \fIinteger\fP] [\-count \fIinteger\fP] [\-size \fIinteger\fP] [\-trail] [\-no\-trail]
+
+.SH DESCRIPTION
+The \fIgalaxy\fP program draws spinning galaxies.
+.SH OPTIONS
+.I galaxy
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window.  This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-mono 
+If on a color display, pretend we're on a monochrome display.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use.  Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-ncolors \fIinteger\fP
+How many colors should be used (if possible).  Default 64.
+The colors used cycle through the hue, making N stops around
+the color wheel.
+.TP 8
+.B \-cycles \fIinteger\fP
+
+.TP 8
+.B \-count \fIinteger\fP
+
+.TP 8
+.B \-size \fIinteger\fP
+
+.TP 8
+.B \-trail
+.TP 8
+.B \-no\-trail
+
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1),
+.BR xlock (1)
+.SH COPYRIGHT
+Copyright \(co 1994 by Hubert Feyrer.
+
+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. 
+.SH AUTHOR
+Original Amiga version by Uli Siegmund <uli@wombat.okapi.sub.org>
+ for EGS in Cluster.
+
+Ported from Cluster/EGS to C/Intuition by Harald Backert.
+
+Ported to X11 and xlockmore by 
+Hubert Feyrer <hubert.feyrer@rz.uni-regensburg.de>, 30-Sep-94.
+
+Modified by David Bagley <bagleyd@bigfoot.com>, 23-Oct-94.
+
+Modified by Dave Mitchell <davem@magnet.com>, 7-Apr-97.
+
+Ability to run standalone or with \fIxscreensaver\fP added by 
+Jamie Zawinski <jwz@jwz.org>, 10-May-97.
diff --git a/hacks/glx/Makefile.in b/hacks/glx/Makefile.in
new file mode 100644 (file)
index 0000000..7d4e786
--- /dev/null
@@ -0,0 +1,529 @@
+# hacks/glx/Makefile.in --- xscreensaver, Copyright (c) 1997 Jamie Zawinski.
+# the `../../configure' script generates `hacks/glx/Makefile' from this file.
+
+@SET_MAKE@
+.SUFFIXES:
+.SUFFIXES: .c .o
+
+srcdir         = @srcdir@
+VPATH          = @srcdir@
+
+install_prefix =
+prefix         = @prefix@
+exec_prefix    = @exec_prefix@
+bindir         = @bindir@
+mandir         = @mandir@
+man1dir                = $(mandir)/man1
+mansuffix      = 1
+
+CC             = @CC@
+CFLAGS         = @CFLAGS@
+LDFLAGS                = @LDFLAGS@
+DEFS           = -DSTANDALONE -DUSE_GL @DEFS@
+LIBS           = @LIBS@
+
+DEPEND         = @DEPEND@
+DEPEND_FLAGS   = @DEPEND_FLAGS@
+DEPEND_DEFINES = @DEPEND_DEFINES@
+
+SHELL          = /bin/sh
+INSTALL                = @INSTALL@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_DATA   = @INSTALL_DATA@
+INSTALL_DIRS   = @INSTALL_DIRS@
+HACKDIR                = @HACKDIR@
+
+X_CFLAGS       = @X_CFLAGS@
+X_LIBS         = @X_LIBS@
+X_PRE_LIBS     = @X_PRE_LIBS@
+X_EXTRA_LIBS   = @X_EXTRA_LIBS@
+
+# Note: see comment in ../../driver/Makefile.in for explanation of X_LIBS, etc.
+#
+HACK_PRE       = $(LIBS) $(X_LIBS)
+HACK_POST      = $(X_PRE_LIBS) -lXt -lX11 -lXext $(X_EXTRA_LIBS) -lm
+HACK_LIBS      = $(HACK_PRE)            @GL_LIBS@ @HACK_LIBS@ $(HACK_POST)
+XPM_LIBS       = $(HACK_PRE) @XPM_LIBS@ @GL_LIBS@ @HACK_LIBS@ $(HACK_POST)
+
+HACK_SRC       = $(srcdir)/..
+HACK_BIN       = ..
+UTILS_SRC      = $(HACK_SRC)/../utils
+UTILS_BIN      = $(HACK_BIN)/../utils
+
+INCLUDES       = -I$(srcdir) -I$(UTILS_SRC) -I$(HACK_SRC) -I../.. @INCLUDES@
+
+UTIL_SRCS      = $(UTILS_SRC)/colors.c $(UTILS_SRC)/hsv.c \
+                 $(UTILS_SRC)/resources.c $(UTILS_SRC)/usleep.c \
+                 $(UTILS_SRC)/visual.c $(UTILS_SRC)/visual-gl.c \
+                 $(UTILS_SRC)/yarandom.c
+UTIL_OBJS      = $(UTILS_SRC)/colors.o $(UTILS_SRC)/hsv.o \
+                 $(UTILS_SRC)/resources.o $(UTILS_SRC)/usleep.o \
+                 $(UTILS_SRC)/visual.o $(UTILS_SRC)/visual-gl.o \
+                  $(UTILS_SRC)/yarandom.o
+
+SRCS           = atlantis.c b_draw.c b_lockglue.c b_sphere.c bubble3d.c \
+                 buildlwo.c cage.c dolphin.c gears.c lament.c moebius.c \
+                 morph3d.c pipeobjs.c pipes.c rubik.c s1_1.c s1_2.c s1_3.c \
+                 s1_4.c s1_5.c s1_6.c s1_b.c shark.c sproingies.c \
+                 sproingiewrap.c stairs.c superquadrics.c swim.c whale.c \
+                 xlock-gl.c xpm-ximage.c glplanet.c pulsar.c
+
+OBJS           = atlantis.o b_draw.o b_lockglue.o b_sphere.o bubble3d.o \
+                 buildlwo.o cage.o dolphin.o gears.o lament.o moebius.o \
+                 morph3d.o pipeobjs.o pipes.o rubik.o s1_1.o s1_2.o s1_3.o \
+                 s1_4.o s1_5.o s1_6.o s1_b.o shark.o sproingies.o \
+                 sproingiewrap.o stairs.o superquadrics.o swim.o whale.o \
+                 xlock-gl.o xpm-ximage.o glplanet.o pulsar.o
+
+GL_EXES                = cage gears moebius pipes sproingies stairs superquadrics \
+                 morph3d rubik atlantis lament bubble3d glplanet pulsar
+EXES           = @GL_EXES@
+
+HACK_OBJS      = screenhack-gl.o xlock-gl.o $(HACK_BIN)/xlockmore.o \
+                 $(UTILS_BIN)/resources.o $(UTILS_BIN)/visual.o \
+                 $(UTILS_BIN)/visual-gl.o $(UTILS_BIN)/usleep.o \
+                 $(UTILS_BIN)/yarandom.o $(UTILS_BIN)/hsv.o \
+                 $(UTILS_BIN)/colors.o
+
+HDRS           = atlantis.h bubble3d.h buildlwo.h e_textures.h xpm-ximage.h
+GL_MEN         = lament.man
+MEN            = @GL_MEN@
+EXTRAS         = README Makefile.in
+
+TARFILES       = $(SRCS) $(HDRS) $(MEN) $(EXTRAS)
+
+
+default: all
+all: $(EXES)
+
+install:   install-program   install-man
+uninstall: uninstall-program uninstall-man
+
+install-strip:
+       $(MAKE) INSTALL_PROGRAM='$(INSTALL_PROGRAM) -s' install
+
+install-program: $(EXES)
+       @exes="$(EXES)" ;                                               \
+       if [ ! -d $(HACKDIR) ]; then $(INSTALL_DIRS) $(HACKDIR) ; fi ;  \
+       for program in $$exes; do                                       \
+         echo $(INSTALL_PROGRAM) $$program $(HACKDIR)/$$program ;      \
+         $(INSTALL_PROGRAM) $$program $(HACKDIR)/$$program ;           \
+       done
+
+install-man: $(MEN)
+       @men="$(MEN)" ;                                                 \
+       if [ ! -d $(man1dir) ]; then $(INSTALL_DIRS) $(man1dir) ; fi ;  \
+       for man in $$men; do                                            \
+         instname=`echo $$man | sed 's/\.man$$/\.$(mansuffix)/'` ;     \
+         echo $(INSTALL_DATA) $(srcdir)/$$man $(man1dir)/$$instname ;  \
+         $(INSTALL_DATA) $(srcdir)/$$man $(man1dir)/$$instname ;       \
+       done
+
+uninstall-program:
+       @for program in $(EXES); do                                     \
+         echo rm -f $(HACKDIR)/$$program ;                             \
+         rm -f $(HACKDIR)/$$program ;                                  \
+       done
+
+uninstall-man:
+       @men="$(MEN)" ;                                                 \
+       for man in $$men; do                                            \
+         instname=`echo $$man | sed 's/\.man$$/\.$(mansuffix)/'` ;     \
+         echo rm -f $(man1dir)/$$instname ;                            \
+         rm -f $(man1dir)/$$instname ;                                 \
+       done
+
+clean:
+       -rm -f *.o a.out core $(EXES)
+
+distclean: clean
+       -rm -f Makefile TAGS *~ "#"*
+
+# Adds all current dependencies to Makefile
+depend:
+       $(DEPEND) -s '# DO NOT DELETE: updated by make depend'              \
+       $(DEPEND_FLAGS) --                                                  \
+       $(INCLUDES) $(DEFS) $(DEPEND_DEFINES) $(CFLAGS) $(X_CFLAGS) --      \
+       $(SRCS)
+
+# Adds some dependencies to Makefile.in -- not totally accurate, but pretty
+# close.  This excludes dependencies on files in /usr/include, etc.  It tries
+# to include only dependencies on files which are themselves a part of this
+# package.
+distdepend::
+       @echo updating dependencies in `pwd`/Makefile.in... ;               \
+       $(DEPEND) -w 0 -f -                                                 \
+       -s '# DO NOT DELETE: updated by make distdepend' $(DEPEND_FLAGS) -- \
+       $(INCLUDES) $(DEFS) $(DEPEND_DEFINES) $(CFLAGS) $(X_CFLAGS) --      \
+       $(SRCS) |                                                           \
+       (                                                                   \
+         awk '/^# .*Makefile.in ---/,/^# DO .*distdepend/' < Makefile.in ; \
+         sed -e 's@ \./@ @g;s@ /[^ ]*@@g;/^.*:$$/d'                        \
+             -e 's@\.\./\.\./utils@$$(UTILS_SRC)@g'                        \
+             -e 's@\.\./glx/@@g'                                           \
+             -e 's@ \.\./@ $$(HACK_SRC)/@g'                                \
+             -e 's@ \([^$$]\)@ $$(srcdir)/\1@g'                            \
+             -e 's@ $$(srcdir)/\(.*config.h\)@ \1@g'                       \
+             -e 's@ $$(HACK_SRC)/\(.*config.h\)@ ../\1@g' ;                \
+         echo ''                                                           \
+       ) > /tmp/distdepend.$$$$ &&                                         \
+       mv Makefile.in Makefile.in.bak &&                                   \
+       mv /tmp/distdepend.$$$$ Makefile.in
+
+TAGS: tags
+tags:
+       find $(srcdir) -name '*.[chly]' -print | xargs etags -a
+
+echo_tarfiles:
+       @echo $(TARFILES)
+
+
+# Rules for noticing when the objects from the utils directory are out of
+# date with respect to their sources, and going and building them according
+# to the rules in their own Makefile...
+#
+$(UTILS_BIN)/colors.o:         $(UTILS_SRC)/colors.c
+$(UTILS_BIN)/hsv.o:            $(UTILS_SRC)/hsv.c
+$(UTILS_BIN)/resources.o:      $(UTILS_SRC)/resources.c
+$(UTILS_BIN)/usleep.o:         $(UTILS_SRC)/usleep.c
+$(UTILS_BIN)/visual.o:         $(UTILS_SRC)/visual.c
+$(UTILS_BIN)/visual-gl.o:      $(UTILS_SRC)/visual-gl.c
+$(UTILS_BIN)/yarandom.o:       $(UTILS_SRC)/yarandom.c
+
+$(UTIL_OBJS):
+       cd $(UTILS_BIN) ; \
+       $(MAKE) $(@F) CC="$(CC)" CFLAGS="$(CFLAGS)" LDFLAGS="$(LDFLAGS)"
+
+$(HACK_BIN)/xlockmore.o: $(HACK_SRC)/xlockmore.c
+       cd $(HACK_BIN)  ; $(MAKE) $(@F) CC="$(CC)" CFLAGS="$(CFLAGS)"
+
+
+# How we build object files in this directory.
+.c.o:
+       $(CC) -c $(INCLUDES) $(DEFS) $(CFLAGS) $(X_CFLAGS) $<
+
+# These hacks use a slightly-differently-compiled variant of screenhack.c.
+# This is how to make the the other .o file from it.
+#
+screenhack-gl.o: $(HACK_SRC)/screenhack.c
+       $(CC) -o $@ -c $(INCLUDES) $(DEFS) $(CFLAGS) $(X_CFLAGS) \
+         -DXLOCKMORE  -DUSE_GL $(HACK_SRC)/screenhack.c
+
+CC_HACK                = $(CC) $(LDFLAGS)
+
+atlantis:      atlantis.o      $(HACK_OBJS) dolphin.o shark.o swim.o whale.o
+       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) dolphin.o shark.o swim.o whale.o \
+                               $(HACK_LIBS)
+
+cage:          cage.o          $(HACK_OBJS)
+       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(HACK_LIBS)
+
+gears:         gears.o         $(HACK_OBJS)
+       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(HACK_LIBS)
+
+moebius:       moebius.o               $(HACK_OBJS)
+       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(HACK_LIBS)
+
+pipes:         pipes.o         $(HACK_OBJS) pipeobjs.o buildlwo.o
+       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) pipeobjs.o buildlwo.o \
+         $(HACK_LIBS)
+
+superquadrics: superquadrics.o $(HACK_OBJS)
+       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(HACK_LIBS)
+
+morph3d:       morph3d.o       $(HACK_OBJS)
+       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(HACK_LIBS)
+
+rubik:         rubik.o $(HACK_OBJS)
+       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(HACK_LIBS)
+
+stairs:                stairs.o        $(HACK_OBJS)
+       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(HACK_LIBS)
+
+SPROINGIES = sproingiewrap.o buildlwo.o \
+            s1_1.o s1_2.o s1_3.o s1_4.o s1_5.o s1_6.o s1_b.o
+sproingies: sproingies.o $(HACK_OBJS) $(SPROINGIES)
+       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(SPROINGIES) $(HACK_LIBS)
+
+lament:                lament.o        $(HACK_OBJS) xpm-ximage.o
+       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) xpm-ximage.o $(XPM_LIBS)
+
+B3D = b_sphere.o b_draw.o b_lockglue.o
+bubble3d:      bubble3d.o      $(HACK_OBJS) $(B3D)
+       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(B3D) $(HACK_LIBS)
+
+glplanet:      glplanet.o      $(HACK_OBJS) xpm-ximage.o
+       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) xpm-ximage.o $(XPM_LIBS)
+
+pulsar:                pulsar.o                $(HACK_OBJS)
+       $(CC_HACK) -o $@ $@.o   $(HACK_OBJS) $(HACK_LIBS)
+
+
+##############################################################################
+#
+# DO NOT DELETE: updated by make distdepend
+# $(srcdir)/DO $(srcdir)/NOT $(srcdir)/DELETE: $(srcdir)/updated $(srcdir)/by $(srcdir)/make $(srcdir)/distdepend
+
+atlantis.o: $(HACK_SRC)/xlockmore.h
+atlantis.o: ../../config.h
+atlantis.o: $(HACK_SRC)/xlockmoreI.h
+atlantis.o: $(HACK_SRC)/screenhack.h
+atlantis.o: $(UTILS_SRC)/yarandom.h
+atlantis.o: $(UTILS_SRC)/usleep.h
+atlantis.o: $(UTILS_SRC)/resources.h
+atlantis.o: $(UTILS_SRC)/hsv.h
+atlantis.o: $(UTILS_SRC)/colors.h
+atlantis.o: $(UTILS_SRC)/grabscreen.h
+atlantis.o: $(UTILS_SRC)/visual.h
+atlantis.o: $(UTILS_SRC)/xshm.h
+atlantis.o: $(srcdir)/atlantis.h
+b_draw.o: $(srcdir)/bubble3d.h
+b_draw.o: $(HACK_SRC)/xlockmoreI.h
+b_draw.o: $(HACK_SRC)/screenhack.h
+b_draw.o: ../../config.h
+b_draw.o: $(UTILS_SRC)/yarandom.h
+b_draw.o: $(UTILS_SRC)/usleep.h
+b_draw.o: $(UTILS_SRC)/resources.h
+b_draw.o: $(UTILS_SRC)/hsv.h
+b_draw.o: $(UTILS_SRC)/colors.h
+b_draw.o: $(UTILS_SRC)/grabscreen.h
+b_draw.o: $(UTILS_SRC)/visual.h
+b_draw.o: $(UTILS_SRC)/xshm.h
+b_lockglue.o: $(srcdir)/bubble3d.h
+b_lockglue.o: $(HACK_SRC)/xlockmoreI.h
+b_lockglue.o: $(HACK_SRC)/screenhack.h
+b_lockglue.o: ../../config.h
+b_lockglue.o: $(UTILS_SRC)/yarandom.h
+b_lockglue.o: $(UTILS_SRC)/usleep.h
+b_lockglue.o: $(UTILS_SRC)/resources.h
+b_lockglue.o: $(UTILS_SRC)/hsv.h
+b_lockglue.o: $(UTILS_SRC)/colors.h
+b_lockglue.o: $(UTILS_SRC)/grabscreen.h
+b_lockglue.o: $(UTILS_SRC)/visual.h
+b_lockglue.o: $(UTILS_SRC)/xshm.h
+b_lockglue.o: $(HACK_SRC)/xlockmore.h
+b_sphere.o: $(srcdir)/bubble3d.h
+b_sphere.o: $(HACK_SRC)/xlockmoreI.h
+b_sphere.o: $(HACK_SRC)/screenhack.h
+b_sphere.o: ../../config.h
+b_sphere.o: $(UTILS_SRC)/yarandom.h
+b_sphere.o: $(UTILS_SRC)/usleep.h
+b_sphere.o: $(UTILS_SRC)/resources.h
+b_sphere.o: $(UTILS_SRC)/hsv.h
+b_sphere.o: $(UTILS_SRC)/colors.h
+b_sphere.o: $(UTILS_SRC)/grabscreen.h
+b_sphere.o: $(UTILS_SRC)/visual.h
+b_sphere.o: $(UTILS_SRC)/xshm.h
+bubble3d.o: $(srcdir)/bubble3d.h
+bubble3d.o: $(HACK_SRC)/xlockmoreI.h
+bubble3d.o: $(HACK_SRC)/screenhack.h
+bubble3d.o: ../../config.h
+bubble3d.o: $(UTILS_SRC)/yarandom.h
+bubble3d.o: $(UTILS_SRC)/usleep.h
+bubble3d.o: $(UTILS_SRC)/resources.h
+bubble3d.o: $(UTILS_SRC)/hsv.h
+bubble3d.o: $(UTILS_SRC)/colors.h
+bubble3d.o: $(UTILS_SRC)/grabscreen.h
+bubble3d.o: $(UTILS_SRC)/visual.h
+bubble3d.o: $(UTILS_SRC)/xshm.h
+buildlwo.o: $(srcdir)/buildlwo.h
+cage.o: $(HACK_SRC)/xlockmore.h
+cage.o: ../../config.h
+cage.o: $(HACK_SRC)/xlockmoreI.h
+cage.o: $(HACK_SRC)/screenhack.h
+cage.o: $(UTILS_SRC)/yarandom.h
+cage.o: $(UTILS_SRC)/usleep.h
+cage.o: $(UTILS_SRC)/resources.h
+cage.o: $(UTILS_SRC)/hsv.h
+cage.o: $(UTILS_SRC)/colors.h
+cage.o: $(UTILS_SRC)/grabscreen.h
+cage.o: $(UTILS_SRC)/visual.h
+cage.o: $(UTILS_SRC)/xshm.h
+cage.o: $(srcdir)/e_textures.h
+dolphin.o: $(srcdir)/atlantis.h
+gears.o: $(HACK_SRC)/xlockmore.h
+gears.o: ../../config.h
+gears.o: $(HACK_SRC)/xlockmoreI.h
+gears.o: $(HACK_SRC)/screenhack.h
+gears.o: $(UTILS_SRC)/yarandom.h
+gears.o: $(UTILS_SRC)/usleep.h
+gears.o: $(UTILS_SRC)/resources.h
+gears.o: $(UTILS_SRC)/hsv.h
+gears.o: $(UTILS_SRC)/colors.h
+gears.o: $(UTILS_SRC)/grabscreen.h
+gears.o: $(UTILS_SRC)/visual.h
+gears.o: $(UTILS_SRC)/xshm.h
+lament.o: $(HACK_SRC)/xlockmore.h
+lament.o: ../../config.h
+lament.o: $(HACK_SRC)/xlockmoreI.h
+lament.o: $(HACK_SRC)/screenhack.h
+lament.o: $(UTILS_SRC)/yarandom.h
+lament.o: $(UTILS_SRC)/usleep.h
+lament.o: $(UTILS_SRC)/resources.h
+lament.o: $(UTILS_SRC)/hsv.h
+lament.o: $(UTILS_SRC)/colors.h
+lament.o: $(UTILS_SRC)/grabscreen.h
+lament.o: $(UTILS_SRC)/visual.h
+lament.o: $(UTILS_SRC)/xshm.h
+lament.o: $(srcdir)/xpm-ximage.h
+lament.o: $(HACK_SRC)/images/lament.xpm
+moebius.o: $(HACK_SRC)/xlockmore.h
+moebius.o: ../../config.h
+moebius.o: $(HACK_SRC)/xlockmoreI.h
+moebius.o: $(HACK_SRC)/screenhack.h
+moebius.o: $(UTILS_SRC)/yarandom.h
+moebius.o: $(UTILS_SRC)/usleep.h
+moebius.o: $(UTILS_SRC)/resources.h
+moebius.o: $(UTILS_SRC)/hsv.h
+moebius.o: $(UTILS_SRC)/colors.h
+moebius.o: $(UTILS_SRC)/grabscreen.h
+moebius.o: $(UTILS_SRC)/visual.h
+moebius.o: $(UTILS_SRC)/xshm.h
+moebius.o: $(srcdir)/e_textures.h
+morph3d.o: $(HACK_SRC)/xlockmore.h
+morph3d.o: ../../config.h
+morph3d.o: $(HACK_SRC)/xlockmoreI.h
+morph3d.o: $(HACK_SRC)/screenhack.h
+morph3d.o: $(UTILS_SRC)/yarandom.h
+morph3d.o: $(UTILS_SRC)/usleep.h
+morph3d.o: $(UTILS_SRC)/resources.h
+morph3d.o: $(UTILS_SRC)/hsv.h
+morph3d.o: $(UTILS_SRC)/colors.h
+morph3d.o: $(UTILS_SRC)/grabscreen.h
+morph3d.o: $(UTILS_SRC)/visual.h
+morph3d.o: $(UTILS_SRC)/xshm.h
+pipeobjs.o: $(srcdir)/buildlwo.h
+pipes.o: $(HACK_SRC)/xlockmore.h
+pipes.o: ../../config.h
+pipes.o: $(HACK_SRC)/xlockmoreI.h
+pipes.o: $(HACK_SRC)/screenhack.h
+pipes.o: $(UTILS_SRC)/yarandom.h
+pipes.o: $(UTILS_SRC)/usleep.h
+pipes.o: $(UTILS_SRC)/resources.h
+pipes.o: $(UTILS_SRC)/hsv.h
+pipes.o: $(UTILS_SRC)/colors.h
+pipes.o: $(UTILS_SRC)/grabscreen.h
+pipes.o: $(UTILS_SRC)/visual.h
+pipes.o: $(UTILS_SRC)/xshm.h
+pipes.o: $(srcdir)/buildlwo.h
+rubik.o: $(HACK_SRC)/xlockmore.h
+rubik.o: ../../config.h
+rubik.o: $(HACK_SRC)/xlockmoreI.h
+rubik.o: $(HACK_SRC)/screenhack.h
+rubik.o: $(UTILS_SRC)/yarandom.h
+rubik.o: $(UTILS_SRC)/usleep.h
+rubik.o: $(UTILS_SRC)/resources.h
+rubik.o: $(UTILS_SRC)/hsv.h
+rubik.o: $(UTILS_SRC)/colors.h
+rubik.o: $(UTILS_SRC)/grabscreen.h
+rubik.o: $(UTILS_SRC)/visual.h
+rubik.o: $(UTILS_SRC)/xshm.h
+s1_1.o: $(srcdir)/buildlwo.h
+s1_2.o: $(srcdir)/buildlwo.h
+s1_3.o: $(srcdir)/buildlwo.h
+s1_4.o: $(srcdir)/buildlwo.h
+s1_5.o: $(srcdir)/buildlwo.h
+s1_6.o: $(srcdir)/buildlwo.h
+s1_b.o: $(srcdir)/buildlwo.h
+shark.o: $(srcdir)/atlantis.h
+sproingies.o: $(HACK_SRC)/xlockmoreI.h
+sproingies.o: $(HACK_SRC)/screenhack.h
+sproingies.o: ../../config.h
+sproingies.o: $(UTILS_SRC)/yarandom.h
+sproingies.o: $(UTILS_SRC)/usleep.h
+sproingies.o: $(UTILS_SRC)/resources.h
+sproingies.o: $(UTILS_SRC)/hsv.h
+sproingies.o: $(UTILS_SRC)/colors.h
+sproingies.o: $(UTILS_SRC)/grabscreen.h
+sproingies.o: $(UTILS_SRC)/visual.h
+sproingies.o: $(UTILS_SRC)/xshm.h
+sproingies.o: $(srcdir)/buildlwo.h
+sproingiewrap.o: $(HACK_SRC)/xlockmore.h
+sproingiewrap.o: ../../config.h
+sproingiewrap.o: $(HACK_SRC)/xlockmoreI.h
+sproingiewrap.o: $(HACK_SRC)/screenhack.h
+sproingiewrap.o: $(UTILS_SRC)/yarandom.h
+sproingiewrap.o: $(UTILS_SRC)/usleep.h
+sproingiewrap.o: $(UTILS_SRC)/resources.h
+sproingiewrap.o: $(UTILS_SRC)/hsv.h
+sproingiewrap.o: $(UTILS_SRC)/colors.h
+sproingiewrap.o: $(UTILS_SRC)/grabscreen.h
+sproingiewrap.o: $(UTILS_SRC)/visual.h
+sproingiewrap.o: $(UTILS_SRC)/xshm.h
+stairs.o: $(HACK_SRC)/xlockmore.h
+stairs.o: ../../config.h
+stairs.o: $(HACK_SRC)/xlockmoreI.h
+stairs.o: $(HACK_SRC)/screenhack.h
+stairs.o: $(UTILS_SRC)/yarandom.h
+stairs.o: $(UTILS_SRC)/usleep.h
+stairs.o: $(UTILS_SRC)/resources.h
+stairs.o: $(UTILS_SRC)/hsv.h
+stairs.o: $(UTILS_SRC)/colors.h
+stairs.o: $(UTILS_SRC)/grabscreen.h
+stairs.o: $(UTILS_SRC)/visual.h
+stairs.o: $(UTILS_SRC)/xshm.h
+stairs.o: $(srcdir)/e_textures.h
+superquadrics.o: $(HACK_SRC)/xlockmore.h
+superquadrics.o: ../../config.h
+superquadrics.o: $(HACK_SRC)/xlockmoreI.h
+superquadrics.o: $(HACK_SRC)/screenhack.h
+superquadrics.o: $(UTILS_SRC)/yarandom.h
+superquadrics.o: $(UTILS_SRC)/usleep.h
+superquadrics.o: $(UTILS_SRC)/resources.h
+superquadrics.o: $(UTILS_SRC)/hsv.h
+superquadrics.o: $(UTILS_SRC)/colors.h
+superquadrics.o: $(UTILS_SRC)/grabscreen.h
+superquadrics.o: $(UTILS_SRC)/visual.h
+superquadrics.o: $(UTILS_SRC)/xshm.h
+swim.o: $(HACK_SRC)/xlockmoreI.h
+swim.o: $(HACK_SRC)/screenhack.h
+swim.o: ../../config.h
+swim.o: $(UTILS_SRC)/yarandom.h
+swim.o: $(UTILS_SRC)/usleep.h
+swim.o: $(UTILS_SRC)/resources.h
+swim.o: $(UTILS_SRC)/hsv.h
+swim.o: $(UTILS_SRC)/colors.h
+swim.o: $(UTILS_SRC)/grabscreen.h
+swim.o: $(UTILS_SRC)/visual.h
+swim.o: $(UTILS_SRC)/xshm.h
+swim.o: $(srcdir)/atlantis.h
+whale.o: $(srcdir)/atlantis.h
+xlock-gl.o: $(HACK_SRC)/screenhack.h
+xlock-gl.o: ../../config.h
+xlock-gl.o: $(UTILS_SRC)/yarandom.h
+xlock-gl.o: $(UTILS_SRC)/usleep.h
+xlock-gl.o: $(UTILS_SRC)/resources.h
+xlock-gl.o: $(UTILS_SRC)/hsv.h
+xlock-gl.o: $(UTILS_SRC)/colors.h
+xlock-gl.o: $(UTILS_SRC)/grabscreen.h
+xlock-gl.o: $(UTILS_SRC)/visual.h
+xlock-gl.o: $(HACK_SRC)/xlockmoreI.h
+xlock-gl.o: $(UTILS_SRC)/xshm.h
+xpm-ximage.o: ../../config.h
+glplanet.o: $(HACK_SRC)/xlockmore.h
+glplanet.o: ../../config.h
+glplanet.o: $(HACK_SRC)/xlockmoreI.h
+glplanet.o: $(HACK_SRC)/screenhack.h
+glplanet.o: $(UTILS_SRC)/yarandom.h
+glplanet.o: $(UTILS_SRC)/usleep.h
+glplanet.o: $(UTILS_SRC)/resources.h
+glplanet.o: $(UTILS_SRC)/hsv.h
+glplanet.o: $(UTILS_SRC)/colors.h
+glplanet.o: $(UTILS_SRC)/grabscreen.h
+glplanet.o: $(UTILS_SRC)/visual.h
+glplanet.o: $(UTILS_SRC)/xshm.h
+glplanet.o: $(HACK_SRC)/images/earth.xbm
+glplanet.o: $(srcdir)/xpm-ximage.h
+pulsar.o: $(HACK_SRC)/xlockmore.h
+pulsar.o: ../../config.h
+pulsar.o: $(HACK_SRC)/xlockmoreI.h
+pulsar.o: $(HACK_SRC)/screenhack.h
+pulsar.o: $(UTILS_SRC)/yarandom.h
+pulsar.o: $(UTILS_SRC)/usleep.h
+pulsar.o: $(UTILS_SRC)/resources.h
+pulsar.o: $(UTILS_SRC)/hsv.h
+pulsar.o: $(UTILS_SRC)/colors.h
+pulsar.o: $(UTILS_SRC)/grabscreen.h
+pulsar.o: $(UTILS_SRC)/visual.h
+pulsar.o: $(UTILS_SRC)/xshm.h
+
diff --git a/hacks/glx/README b/hacks/glx/README
new file mode 100644 (file)
index 0000000..5142503
--- /dev/null
@@ -0,0 +1,10 @@
+
+This directory contains various graphics hacks that requre OpenGL.  These are
+independent from the xscreensaver program (in the ../../driver/ directory)
+but some of them use the utility functions found in the ../../utils/ directory.
+
+If you have compilation problems, check the parameters in ../../config.h.
+
+If you're looking for a free implementation of the OpenGL library, 
+check out <http://www.mesa3d.org/>.  For general OpenGL info, see
+<http://www.opengl.org/>.
diff --git a/hacks/glx/atlantis.c b/hacks/glx/atlantis.c
new file mode 100644 (file)
index 0000000..140295c
--- /dev/null
@@ -0,0 +1,445 @@
+/* atlantis --- Shows moving 3D sea animals */
+
+#if !defined( lint ) && !defined( SABER )
+static const char sccsid[] = "@(#)atlantis.c   1.3 98/06/18 xlockmore";
+
+#endif
+
+/* Copyright (c) E. Lassauge, 1998. */
+
+/*
+ * 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.
+ *
+ * This file is provided AS IS with no warranties of any kind.  The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof.  In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * The original code for this mode was written by Mark J. Kilgard
+ * as a demo for openGL programming.
+ * 
+ * Porting it to xlock  was possible by comparing the original Mesa's morph3d 
+ * demo with it's ported version to xlock, so thanks for Marcelo F. Vianna 
+ * (look at morph3d.c) for his indirect help.
+ *
+ * Thanks goes also to Brian Paul for making it possible and inexpensive
+ * to use OpenGL at home.
+ *
+ * My e-mail address is lassauge@sagem.fr
+ *
+ * Eric Lassauge  (May-13-1998)
+ *
+ * REVISION HISTORY:
+ * 
+ * David A. Bagley - 98/06/17 : Add whalespeed option. Global options to
+ *                              initialize local variables are now:
+ *                              XLock.atlantis.cycles: 100      ! SharkSpeed
+ *                              XLock.atlantis.batchcount: 4    ! SharkNum
+ *                              XLock.atlantis.whalespeed: 250  ! WhaleSpeed
+ *                              XLock.atlantis.size: 6000       ! SharkSize
+ *                              Add random direction for whales/dolphins
+ * 
+ * E.Lassauge - 98/06/16: Use the following global options to initialize
+ *                        local variables :
+ *                              XLock.atlantis.delay: 100       ! SharkSpeed
+ *                              XLock.atlantis.batchcount: 4    ! SharkNum
+ *                              XLock.atlantis.cycles: 250      ! WhaleSpeed
+ *                              XLock.atlantis.size: 6000       ! SharkSize
+ *                        Add support for -/+ wireframe (t'was so easy to do!)
+ *
+ * TODO : 
+ *        - add a sort of background image or random bg color
+ *        - better handling of sizes and speeds
+ *        - test standalone and module modes
+ *        - purify it (!)
+ */
+
+/* Copyright (c) Mark J. Kilgard, 1994. */
+
+/**
+ * (c) Copyright 1993, 1994, Silicon Graphics, Inc.
+ * ALL RIGHTS RESERVED
+ * Permission to use, copy, modify, and distribute this software for
+ * any purpose and without fee is hereby granted, provided that the above
+ * copyright notice appear in all copies and that both the copyright notice
+ * and this permission notice appear in supporting documentation, and that
+ * the name of Silicon Graphics, Inc. not be used in advertising
+ * or publicity pertaining to distribution of the software without specific,
+ * written prior permission.
+ *
+ * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS"
+ * AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR
+ * FITNESS FOR A PARTICULAR PURPOSE.  IN NO EVENT SHALL SILICON
+ * GRAPHICS, INC.  BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT,
+ * SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY
+ * KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION,
+ * LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF
+ * THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC.  HAS BEEN
+ * ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
+ * POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
+ * US Government Users Restricted Rights
+ * Use, duplication, or disclosure by the Government is subject to
+ * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph
+ * (c)(1)(ii) of the Rights in Technical Data and Computer Software
+ * clause at DFARS 252.227-7013 and/or in similar or successor
+ * clauses in the FAR or the DOD or NASA FAR Supplement.
+ * Unpublished-- rights reserved under the copyright laws of the
+ * United States.  Contractor/manufacturer is Silicon Graphics,
+ * Inc., 2011 N.  Shoreline Blvd., Mountain View, CA 94039-7311.
+ *
+ * OpenGL(TM) is a trademark of Silicon Graphics, Inc.
+ */
+
+#ifdef STANDALONE
+# define PROGCLASS     "Atlantis"
+# define HACK_INIT     init_atlantis
+# define HACK_DRAW     draw_atlantis
+# define atlantis_opts xlockmore_opts
+# define DEFAULTS      "*delay:        1000 \n" \
+                        "*count:          4 \n" \
+                        "*cycles:       100 \n" \
+                        "*size:        6000 \n" \
+                        "*whalespeed:   250 \n"
+# include "xlockmore.h"                /* from the xscreensaver distribution */
+#else  /* !STANDALONE */
+# include "xlock.h"            /* from the xlockmore distribution */
+#include "vis.h"
+#endif /* !STANDALONE */
+
+#ifdef USE_GL
+
+#include "atlantis.h"
+#include <GL/glu.h>
+
+
+#define DEF_WHALESPEED  "250"
+static int  whalespeed;
+static XrmOptionDescRec opts[] =
+{
+     {"-whalespeed", ".atlantis.whalespeed", XrmoptionSepArg, (caddr_t) NULL}
+};
+
+static argtype vars[] =
+{
+{(caddr_t *) & whalespeed, "whalespeed", "WhaleSpeed", DEF_WHALESPEED, t_Int}
+};
+
+static OptionStruct desc[] =
+{
+       {"-whalespeed num", "speed of whales and the dolphin"}
+};
+
+ModeSpecOpt atlantis_opts =
+{sizeof opts / sizeof opts[0], opts, sizeof vars / sizeof vars[0], vars, desc};
+
+#ifdef USE_MODULES
+ModStruct   atlantis_description =
+{"atlantis", "init_atlantis", "draw_atlantis", "release_atlantis",
+ "refresh_atlantis", "change_atlantis", NULL, &atlantis_opts,
+ 1000, NUM_SHARKS, SHARKSPEED, SHARKSIZE, 64, 1.0, "",
+ "Shows moving sharks/whales/dolphin", 0, NULL};
+
+#endif
+
+static atlantisstruct *atlantis = NULL;
+
+static void
+InitFishs(atlantisstruct * ap)
+{
+       int         i;
+
+       for (i = 0; i < ap->num_sharks; i++) {
+               ap->sharks[i].x = 70000.0 + NRAND(ap->sharksize);
+               ap->sharks[i].y = NRAND(ap->sharksize);
+               ap->sharks[i].z = NRAND(ap->sharksize);
+               ap->sharks[i].psi = NRAND(360) - 180.0;
+               ap->sharks[i].v = 1.0;
+       }
+
+       /* Random whae direction */
+       ap->whaledir = LRAND() & 1;
+
+       ap->dolph.x = 30000.0;
+       ap->dolph.y = 0.0;
+       ap->dolph.z = (float) (ap->sharksize);
+       ap->dolph.psi = (ap->whaledir) ? 90.0 : -90.0;
+       ap->dolph.theta = 0.0;
+       ap->dolph.v = 6.0;
+
+       ap->momWhale.x = 70000.0;
+       ap->momWhale.y = 0.0;
+       ap->momWhale.z = 0.0;
+       ap->momWhale.psi = (ap->whaledir) ? 90.0 : -90.0;
+       ap->momWhale.theta = 0.0;
+       ap->momWhale.v = 3.0;
+
+       ap->babyWhale.x = 60000.0;
+       ap->babyWhale.y = -2000.0;
+       ap->babyWhale.z = -2000.0;
+       ap->babyWhale.psi = (ap->whaledir) ? 90.0 : -90.0;
+       ap->babyWhale.theta = 0.0;
+       ap->babyWhale.v = 3.0;
+}
+
+static void
+Init(atlantisstruct * ap)
+{
+       static float ambient[] =
+       {0.1, 0.1, 0.1, 1.0};
+       static float diffuse[] =
+       {1.0, 1.0, 1.0, 1.0};
+       static float position[] =
+       {0.0, 1.0, 0.0, 0.0};
+       static float mat_shininess[] =
+       {90.0};
+       static float mat_specular[] =
+       {0.8, 0.8, 0.8, 1.0};
+       static float mat_diffuse[] =
+       {0.46, 0.66, 0.795, 1.0};
+       static float mat_ambient[] =
+       {0.0, 0.1, 0.2, 1.0};
+       static float lmodel_ambient[] =
+       {0.4, 0.4, 0.4, 1.0};
+       static float lmodel_localviewer[] =
+       {0.0};
+       float       fblue = 0.0, fgreen;
+
+       glFrontFace(GL_CW);
+
+       glDepthFunc(GL_LEQUAL);
+       glEnable(GL_DEPTH_TEST);
+
+       glLightfv(GL_LIGHT0, GL_AMBIENT, ambient);
+       glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse);
+       glLightfv(GL_LIGHT0, GL_POSITION, position);
+       glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient);
+       glLightModelfv(GL_LIGHT_MODEL_LOCAL_VIEWER, lmodel_localviewer);
+       glEnable(GL_LIGHTING);
+       glEnable(GL_LIGHT0);
+
+       glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, mat_shininess);
+       glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, mat_specular);
+       glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mat_diffuse);
+       glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, mat_ambient);
+
+       InitFishs(ap);
+
+       /* Add a little randomness */
+       fblue = ((float) (NRAND(50)) / 100.0) + 0.50;
+       fgreen = fblue * 0.56;
+       glClearColor(0.0, fgreen, fblue, 0.0);
+}
+
+static void
+Reshape(ModeInfo * mi, int width, int height)
+{
+       atlantisstruct *ap = &atlantis[MI_SCREEN(mi)];
+
+       glViewport(0, 0, ap->WinW = (GLint) width, ap->WinH = (GLint) height);
+
+       glMatrixMode(GL_PROJECTION);
+       glLoadIdentity();
+       gluPerspective(400.0, (GLdouble) width / (GLdouble) height, 1.0, 2000000.0);
+       glMatrixMode(GL_MODELVIEW);
+}
+
+static void
+Animate(atlantisstruct * ap)
+{
+       int         i;
+
+       for (i = 0; i < ap->num_sharks; i++) {
+               SharkPilot(&(ap->sharks[i]), ap->sharkspeed);
+               SharkMiss(ap, i);
+       }
+       WhalePilot(&(ap->dolph), ap->whalespeed, ap->whaledir);
+       ap->dolph.phi++;
+       WhalePilot(&(ap->momWhale), ap->whalespeed, ap->whaledir);
+       ap->momWhale.phi++;
+       WhalePilot(&(ap->babyWhale), ap->whalespeed, ap->whaledir);
+       ap->babyWhale.phi++;
+}
+
+static void
+AllDisplay(atlantisstruct * ap)
+{
+       int         i;
+
+       glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+       for (i = 0; i < ap->num_sharks; i++) {
+               glPushMatrix();
+               FishTransform(&(ap->sharks[i]));
+               DrawShark(&(ap->sharks[i]), ap->wire);
+               glPopMatrix();
+       }
+
+       glPushMatrix();
+       FishTransform(&(ap->dolph));
+       DrawDolphin(&(ap->dolph), ap->wire);
+       glPopMatrix();
+
+       glPushMatrix();
+       FishTransform(&(ap->momWhale));
+       DrawWhale(&(ap->momWhale), ap->wire);
+       glPopMatrix();
+
+       glPushMatrix();
+       FishTransform(&(ap->babyWhale));
+       glScalef(0.45, 0.45, 0.3);
+       DrawWhale(&(ap->babyWhale), ap->wire);
+       glPopMatrix();
+}
+
+/*
+ *-----------------------------------------------------------------------------
+ *-----------------------------------------------------------------------------
+ *    Xlock hooks.
+ *-----------------------------------------------------------------------------
+ *-----------------------------------------------------------------------------
+ */
+
+/*
+ *-----------------------------------------------------------------------------
+ *    Initialize atlantis.  Called each time the window changes.
+ *-----------------------------------------------------------------------------
+ */
+
+void
+init_atlantis(ModeInfo * mi)
+{
+       int         screen = MI_SCREEN(mi);
+       atlantisstruct *ap;
+       Display    *display = MI_DISPLAY(mi);
+       Window      window = MI_WINDOW(mi);
+
+       if (atlantis == NULL) {
+               if ((atlantis = (atlantisstruct *) calloc(MI_NUM_SCREENS(mi),
+                                          sizeof (atlantisstruct))) == NULL)
+                       return;
+       }
+       ap = &atlantis[screen];
+       ap->num_sharks = MI_COUNT(mi);
+       if (ap->sharks == NULL) {
+               if ((ap->sharks = (fishRec *) calloc(ap->num_sharks,
+                                               sizeof (fishRec))) == NULL) {
+                       /* free everything up to now */
+                       (void) free((void *) atlantis);
+                       atlantis = NULL;
+                       return;
+               }
+       }
+       ap->sharkspeed = MI_CYCLES(mi);         /* has influence on the "width"
+                                                  of the movement */
+       ap->sharksize = MI_SIZE(mi);    /* has influence on the "distance"
+                                          of the sharks */
+       ap->whalespeed = whalespeed;
+       ap->wire = MI_IS_WIREFRAME(mi);
+
+       if (MI_IS_DEBUG(mi)) {
+               (void) fprintf(stderr,
+                              "%s:\n\tnum_sharks=%d\n\tsharkspeed=%.1f\n\tsharksize=%d\n\twhalespeed=%.1f\n\twireframe=%s\n",
+                              MI_NAME(mi),
+                              ap->num_sharks,
+                              ap->sharkspeed,
+                              ap->sharksize,
+                              ap->whalespeed,
+                              ap->wire ? "yes" : "no"
+                       );
+       }
+       if ((ap->glx_context = init_GL(mi)) != NULL) {
+
+               Reshape(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+               glDrawBuffer(GL_BACK);
+               Init(ap);
+               AllDisplay(ap);
+               glXSwapBuffers(display, window);
+
+       } else {
+               MI_CLEARWINDOW(mi);
+       }
+}
+
+/*
+ *-----------------------------------------------------------------------------
+ *    Called by the mainline code periodically to update the display.
+ *-----------------------------------------------------------------------------
+ */
+void
+draw_atlantis(ModeInfo * mi)
+{
+       atlantisstruct *ap = &atlantis[MI_SCREEN(mi)];
+
+       Display    *display = MI_DISPLAY(mi);
+       Window      window = MI_WINDOW(mi);
+
+       MI_IS_DRAWN(mi) = True;
+
+       if (!ap->glx_context)
+               return;
+
+       glXMakeCurrent(display, window, *(ap->glx_context));
+
+       glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+       glPushMatrix();
+
+       AllDisplay(ap);
+       Animate(ap);
+
+       glXSwapBuffers(display, window);
+}
+
+
+/*
+ *-----------------------------------------------------------------------------
+ *    The display is being taken away from us.  Free up malloc'ed 
+ *      memory and X resources that we've alloc'ed.  Only called
+ *      once, we must zap everything for every screen.
+ *-----------------------------------------------------------------------------
+ */
+
+void
+release_atlantis(ModeInfo * mi)
+{
+       int         screen;
+
+       if (atlantis != NULL) {
+               for (screen = 0; screen < MI_NUM_SCREENS(mi); screen++) {
+                       atlantisstruct *ap = &atlantis[screen];
+
+                       if (ap->sharks)
+                               (void) free((void *) ap->sharks);
+               }
+               (void) free((void *) atlantis);
+               atlantis = NULL;
+       }
+       FreeAllGL(mi);
+}
+
+void
+refresh_atlantis(ModeInfo * mi)
+{
+}
+
+void
+change_atlantis(ModeInfo * mi)
+{
+       atlantisstruct *ap = &atlantis[MI_SCREEN(mi)];
+
+       if (!ap->glx_context)
+               return;
+
+       glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(ap->glx_context));
+       Init(ap);
+}
+
+#endif /* USE_GL */
diff --git a/hacks/glx/atlantis.h b/hacks/glx/atlantis.h
new file mode 100644 (file)
index 0000000..413b48b
--- /dev/null
@@ -0,0 +1,109 @@
+/* atlantis --- Shows moving 3D sea animals */
+
+/* Copyright (c) E. Lassauge, 1998. */
+
+/*
+ * 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.
+ *
+ * This file is provided AS IS with no warranties of any kind.  The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof.  In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * The original code for this mode was written by Mark J. Kilgard
+ * as a demo for openGL programming.
+ * 
+ * Porting it to xlock  was possible by comparing the original Mesa's morph3d 
+ * demo with it's ported version to xlock, so thanks for Marcelo F. Vianna 
+ * (look at morph3d.c) for his indirect help.
+ *
+ * Thanks goes also to Brian Paul for making it possible and inexpensive
+ * to use OpenGL at home.
+ *
+ * My e-mail address is lassauge@sagem.fr
+ *
+ * Eric Lassauge  (May-13-1998)
+ *
+ */
+
+/**
+ * (c) Copyright 1993, 1994, Silicon Graphics, Inc.
+ * ALL RIGHTS RESERVED
+ * Permission to use, copy, modify, and distribute this software for
+ * any purpose and without fee is hereby granted, provided that the above
+ * copyright notice appear in all copies and that both the copyright notice
+ * and this permission notice appear in supporting documentation, and that
+ * the name of Silicon Graphics, Inc. not be used in advertising
+ * or publicity pertaining to distribution of the software without specific,
+ * written prior permission.
+ *
+ * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS"
+ * AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR
+ * FITNESS FOR A PARTICULAR PURPOSE.  IN NO EVENT SHALL SILICON
+ * GRAPHICS, INC.  BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT,
+ * SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY
+ * KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION,
+ * LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF
+ * THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC.  HAS BEEN
+ * ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
+ * POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
+ * US Government Users Restricted Rights
+ * Use, duplication, or disclosure by the Government is subject to
+ * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph
+ * (c)(1)(ii) of the Rights in Technical Data and Computer Software
+ * clause at DFARS 252.227-7013 and/or in similar or successor
+ * clauses in the FAR or the DOD or NASA FAR Supplement.
+ * Unpublished-- rights reserved under the copyright laws of the
+ * United States.  Contractor/manufacturer is Silicon Graphics,
+ * Inc., 2011 N.  Shoreline Blvd., Mountain View, CA 94039-7311.
+ *
+ * OpenGL(TM) is a trademark of Silicon Graphics, Inc.
+ */
+#include <GL/gl.h>
+#include <GL/glx.h>
+
+#define RAD 57.295
+#define RRAD 0.01745
+
+/* default values */
+#define NUM_SHARKS 4
+#define SHARKSPEED 100
+#define SHARKSIZE 6000
+
+typedef struct _fishRec {
+       float       x, y, z, phi, theta, psi, v;
+       float       xt, yt, zt;
+       float       htail, vtail;
+       float       dtheta;
+       int         spurt, attack;
+} fishRec;
+
+typedef struct {
+       GLint       WinH, WinW;
+       GLXContext *glx_context;
+       int         num_sharks;
+       float       sharkspeed, whalespeed;
+       int         sharksize;
+       int         wire;
+       Bool        whaledir;
+       fishRec    *sharks;
+       fishRec     momWhale;
+       fishRec     babyWhale;
+       fishRec     dolph;
+} atlantisstruct;
+
+extern void FishTransform(fishRec *);
+extern void WhalePilot(fishRec *, float, Bool);
+extern void SharkPilot(fishRec *, float);
+extern void SharkMiss(atlantisstruct *, int);
+extern void DrawWhale(fishRec *, int);
+extern void DrawShark(fishRec *, int);
+extern void DrawDolphin(fishRec *, int);
diff --git a/hacks/glx/b_draw.c b/hacks/glx/b_draw.c
new file mode 100644 (file)
index 0000000..18c89d9
--- /dev/null
@@ -0,0 +1,260 @@
+#if !defined( lint ) && !defined( SABER )
+static const char sccsid[] = "@(#)b_draw.c  4.11 98/06/16 xlockmore";
+
+#endif
+
+/*-
+ * BUBBLE3D (C) 1998 Richard W.M. Jones.
+ * b_draw.c: This code creates new bubbles, manages them and controls
+ * them as they are drawn on the screen.
+ */
+
+#include "bubble3d.h"
+
+typedef struct draw_context {
+       /* The list of bubbles currently on the screen. */
+       void      **bubble_list;
+       int         nr_bubbles;
+
+       /* When was the last time we created a new bubble? */
+       int         bubble_count;
+} draw_context;
+
+void       *
+glb_draw_init(void)
+{
+       draw_context *c;
+
+       GLfloat     mat_specular[] =
+       {1, 1, 1, 1};
+       GLfloat     mat_emission[] =
+       {0, 0, 0, 1};
+       GLfloat     mat_shininess[] =
+       {100};
+       GLfloat     ambient[] =
+       {0.5, 0.5, 0.5, 1.0};
+       GLfloat     light_position[][4] =
+       {
+               {0, -1, 0, 0},
+               {1, 1, 0, 0},
+               {-1, 0, 1, 0}};
+       GLfloat     light_diffuse[][4] =
+       {
+               {1, 1, 1, 1},
+               {1, 1, 1, 1},
+               {1, 1, 1, 1}};
+       GLfloat     light_specular[][4] =
+       {
+               {1, 1, 1, 1},
+               {1, 1, 1, 1},
+               {1, 1, 1, 1}};
+
+       /* Initialize the context. */
+       c = (struct draw_context *) malloc(sizeof (struct draw_context));
+
+       if (c == 0)
+               return 0;
+       c->bubble_list = 0;
+       c->nr_bubbles = 0;
+       c->bubble_count = glb_config.create_bubbles_every;
+
+       /* Do some GL initialization. */
+       glClearColor(glb_config.bg_colour[0],
+                    glb_config.bg_colour[1],
+                    glb_config.bg_colour[2],
+                    glb_config.bg_colour[3]);
+#if 0
+       glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, glb_config.bubble_colour);
+#else
+       {
+               /* 
+                * E. Lassauge - 98/06/29
+                * Yeahh, cool ! Now that I know how to have random colors I 
+                * patch this pretty beautiful mode too !!
+                */
+               GLfloat     fred, fgreen, fblue;
+               GLfloat     params[4];
+
+               fred = ((float) (NRAND(100)) / 100.0);
+               fgreen = ((float) (NRAND(100)) / 100.0);
+               /* I keep more blue */
+               fblue = ((float) (NRAND(50)) / 100.0) + 0.50;
+
+               params[0] = fred;
+               params[1] = fgreen;
+               params[2] = fblue;
+               /* For the moment don't play with ALPHA channel */
+               params[3] = glb_config.bubble_colour[3];
+               glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, params);
+       }
+#endif
+       glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, mat_specular);
+       glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION, mat_emission);
+       glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, mat_shininess);
+
+#if GLB_USE_BLENDING
+       glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+#endif
+
+       glEnable(GL_LIGHTING);
+       glEnable(GL_LIGHT0);
+       glEnable(GL_LIGHT1);
+       glEnable(GL_LIGHT2);
+#if GLB_USE_BLENDING
+       glEnable(GL_BLEND);
+#else
+       glEnable(GL_DEPTH_TEST);
+#endif
+       glEnable(GL_AUTO_NORMAL);
+       glEnable(GL_NORMALIZE);
+
+#if GLB_USE_BLENDING
+       glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE);
+#endif
+       glLightModelfv(GL_LIGHT_MODEL_AMBIENT, ambient);
+       glLightfv(GL_LIGHT0, GL_POSITION, light_position[0]);
+       glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse[0]);
+       glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular[0]);
+       glLightfv(GL_LIGHT1, GL_POSITION, light_position[1]);
+       glLightfv(GL_LIGHT1, GL_DIFFUSE, light_diffuse[1]);
+       glLightfv(GL_LIGHT1, GL_SPECULAR, light_specular[1]);
+       glLightfv(GL_LIGHT2, GL_POSITION, light_position[2]);
+       glLightfv(GL_LIGHT2, GL_DIFFUSE, light_diffuse[2]);
+       glLightfv(GL_LIGHT2, GL_SPECULAR, light_specular[2]);
+
+       return c;
+}
+
+static void
+delete_bubble(draw_context * c, int j)
+{
+       int         i;
+
+       glb_bubble_delete(c->bubble_list[j]);
+
+       for (i = j; i < c->nr_bubbles - 1; ++i)
+               c->bubble_list[i] = c->bubble_list[i + 1];
+
+       c->nr_bubbles--;
+}
+
+void
+glb_draw_end(void *cc)
+{
+       draw_context *c = (draw_context *) cc;
+       int         i;
+
+       for (i = 0; i < c->nr_bubbles; ++i) {
+               delete_bubble(c, i);
+               i--;
+       }
+       (void) free((void *) c->bubble_list);
+       (void) free((void *) c);
+}
+
+static int
+create_new_bubbles(draw_context * c)
+{
+       int         n, i;
+       double      r = glb_drand();
+       GLfloat     size, speed, scale_incr, x, y, z;
+       void       *b[4];
+       void      **old_bubble_list;
+
+       /* How many bubbles to make? */
+       if (r < glb_config.p_bubble_group[0])
+               n = 1;
+       else if (r < glb_config.p_bubble_group[1])
+               n = 2;
+       else if (r < glb_config.p_bubble_group[2])
+               n = 3;
+       else
+               n = 4;
+
+       /* Initial position of top-most bubble in group. */
+       x = glb_drand() * 4 - 2;
+       y = glb_config.screen_bottom;
+       z = glb_drand() * 2 - 2;
+
+       /* What size? */
+       size = glb_config.min_size
+               + glb_drand() * (glb_config.max_size - glb_config.min_size);
+
+       /* What speed? */
+       speed = glb_config.min_speed
+               + glb_drand() * (glb_config.max_speed - glb_config.min_speed);
+
+       /* Work out the scaling increment. Bubbles should increase by scale_factor
+        * as they go from bottom to top of screen.
+        */
+       scale_incr = (size * glb_config.scale_factor - size)
+               / ((glb_config.screen_top - glb_config.screen_bottom) / speed);
+
+       /* Create the bubble(s). */
+       for (i = 0; i < n; ++i) {
+               if ((b[i] = glb_bubble_new(x, y, z, size, speed, scale_incr)) == 0) {
+                       /* Out of memory - recover. */
+                       i--;
+                       while (i >= 0)
+                               glb_bubble_delete(b[i]);
+                       return 0;
+               }
+               /* Create the next bubble below the last bubble. */
+               y -= size * 3;
+       }
+
+       /* Add the bubbles to the list. */
+       c->nr_bubbles += n;
+       old_bubble_list = c->bubble_list;
+       if (c->bubble_list == 0) {
+               c->bubble_list = (void **) malloc(c->nr_bubbles * sizeof (void *));
+       } else {
+               c->bubble_list = (void **) realloc(c->bubble_list,
+                                           c->nr_bubbles * sizeof (void *));
+       }
+
+       if (c->bubble_list == 0) {
+               /* Out of memory - recover. */
+               for (i = 0; i < n; ++i)
+                       glb_bubble_delete(b[i]);
+               c->bubble_list = old_bubble_list;
+               c->nr_bubbles -= n;
+               return 0;
+       }
+       for (i = 0; i < n; ++i)
+               c->bubble_list[c->nr_bubbles - i - 1] = b[i];
+
+       return 1;
+}
+
+void
+glb_draw_step(void *cc)
+{
+       draw_context *c = (draw_context *) cc;
+       int         i;
+
+       /* Consider creating a new bubble or bubbles. */
+       if (c->nr_bubbles < glb_config.max_bubbles &&
+           c->bubble_count++ > glb_config.create_bubbles_every) {
+               if (create_new_bubbles(c))
+                       c->bubble_count = 0;
+       }
+       /* Clear the display. */
+       glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+       /* XXX Draw the background here ... */
+
+       /* Draw all the bubbles on the display. */
+       for (i = 0; i < c->nr_bubbles; ++i) {
+               void       *b = c->bubble_list[i];
+
+               glb_bubble_step(b);
+               glb_bubble_draw(b);
+
+               /* Has the bubble reached the top of the screen? */
+               if (glb_bubble_get_y(b) >= glb_config.screen_top) {
+                       delete_bubble(c, i);
+                       i--;
+               }
+       }
+}
diff --git a/hacks/glx/b_lockglue.c b/hacks/glx/b_lockglue.c
new file mode 100644 (file)
index 0000000..7af0d62
--- /dev/null
@@ -0,0 +1,181 @@
+#if !defined( lint ) && !defined( SABER )
+static const char sccsid[] = "@(#)b_lockglue.c  4.11 98/06/16 xlockmore";
+
+#endif
+
+/*-
+ * BUBBLE3D (C) 1998 Richard W.M. Jones.
+ * b_lockglue.c: Glue to make this all work with xlockmore.
+ */
+
+#include "bubble3d.h"
+
+/* XXX This lot should eventually be made configurable using the
+ * options stuff below.
+ */
+struct glb_config glb_config =
+{
+#if GLB_SLOW_GL
+       2,                      /* subdivision_depth */
+#else
+       3,                      /* subdivision_depth */
+#endif
+       5,                      /* nr_nudge_axes */
+       0.3,                    /* nudge_angle_factor */
+       0.15,                   /* nudge_factor */
+       0.1,                    /* rotation_factor */
+       8,                      /* create_bubbles_every */
+       8,                      /* max_bubbles */
+       {0.7, 0.8, 0.9, 1.0},   /* p_bubble_group */
+       0.5,                    /* max_size */
+       0.1,                    /* min_size */
+       0.1,                    /* max_speed */
+       0.03,                   /* min_speed */
+       1.5,                    /* scale_factor */
+       -4,                     /* screen_bottom */
+       4,                      /* screen_top */
+#if 0
+       {0.1, 0.0, 0.4, 0.0},   /* bg_colour */
+#else
+       {0.0, 0.0, 0.0, 0.0},   /* bg_colour */
+#endif
+#if 0
+       {0.7, 0.7, 0.0, 0.3}    /* bubble_colour */
+#else
+       {0.0, 0.0, 0.7, 0.3}    /* bubble_colour */
+#endif
+};
+
+#ifdef STANDALONE
+#define PROGCLASS "Bubble3D"
+#define HACK_INIT init_bubble3d
+#define HACK_DRAW draw_bubble3d
+#define bubble3d_opts xlockmore_opts
+# define DEFAULTS ""
+#include "xlockmore.h"
+#else
+#include "xlock.h"
+#include "vis.h"
+#endif
+
+#ifdef USE_GL
+
+ModeSpecOpt bubble3d_opts =
+{0, NULL, 0, NULL, NULL};
+
+#ifdef USE_MODULES
+ModStruct   bubbles3d_description =
+{"bubbles3d",
+ "init_bubble3d",
+ "draw_bubble3d",
+ "release_bubble3d",
+ "change_bubble3d",
+ "init_bubble3d",
+ NULL,
+ &bubble3d_opts,
+ 1000, 1, 2, 1, 64, 1.0, "",
+ "Richard Jones's GL bubbles",
+ 0,
+ NULL
+};
+
+#endif /* USE_MODULES */
+
+struct context {
+       GLXContext *glx_context;
+       void       *draw_context;
+};
+
+static struct context *contexts = 0;
+
+static void
+init(struct context *c)
+{
+       glb_sphere_init();
+       c->draw_context = glb_draw_init();
+}
+
+static void
+reshape(int w, int h)
+{
+       glViewport(0, 0, (GLsizei) w, (GLsizei) h);
+       glMatrixMode(GL_PROJECTION);
+       glLoadIdentity();
+       gluPerspective(45, (GLdouble) w / (GLdouble) h, 3, 8);
+       glMatrixMode(GL_MODELVIEW);
+       glLoadIdentity();
+       glTranslatef(0, 0, -5);
+}
+
+static void
+do_display(struct context *c)
+{
+       glb_draw_step(c->draw_context);
+}
+
+void
+init_bubble3d(ModeInfo * mi)
+{
+       Display    *display = MI_DISPLAY(mi);
+       Window      window = MI_WINDOW(mi);
+       int         screen = MI_SCREEN(mi);
+       struct context *c;
+
+       if (contexts == 0) {
+               contexts = (struct context *) malloc(sizeof (struct context) * MI_NUM_SCREENS(mi));
+
+               if (contexts == 0)
+                       return;
+       }
+       c = &contexts[screen];
+       c->glx_context = init_GL(mi);
+       if (c->glx_context != 0) {
+               init(c);
+               reshape(MI_WIDTH(mi), MI_HEIGHT(mi));
+               do_display(c);
+               glFinish();
+               glXSwapBuffers(display, window);
+       } else
+               MI_CLEARWINDOW(mi);
+}
+
+void
+draw_bubble3d(ModeInfo * mi)
+{
+       struct context *c = &contexts[MI_SCREEN(mi)];
+       Display    *display = MI_DISPLAY(mi);
+       Window      window = MI_WINDOW(mi);
+
+       MI_IS_DRAWN(mi) = True;
+
+       if (!c->glx_context)
+               return;
+
+       glXMakeCurrent(display, window, *(c->glx_context));
+
+       do_display(c);
+
+       glFinish();
+       glXSwapBuffers(display, window);
+}
+
+void
+change_bubble3d(ModeInfo * mi)
+{
+       /* nothing */
+}
+
+void
+release_bubble3d(ModeInfo * mi)
+{
+       struct context *c = &contexts[MI_SCREEN(mi)];
+
+       if (contexts != 0) {
+               glb_draw_end(c->draw_context);
+               (void) free((void *) contexts);
+               contexts = 0;
+       }
+       FreeAllGL(mi);
+}
+
+#endif /* USE_GL */
diff --git a/hacks/glx/b_sphere.c b/hacks/glx/b_sphere.c
new file mode 100644 (file)
index 0000000..2f8b25f
--- /dev/null
@@ -0,0 +1,231 @@
+#if !defined( lint ) && !defined( SABER )
+static const char sccsid[] = "@(#)b_sphere.c  4.11 98/06/16 xlockmore";
+
+#endif
+
+/*-
+ * BUBBLE3D (C) 1998 Richard W.M. Jones.
+ * b_sphere.c: Create a list of vertices and triangles in a
+ * normalized sphere, which is then later used as the basic shape
+ * for all bubbles. This code is run once when the program starts
+ * up.
+ */
+
+#include "bubble3d.h"
+
+/* The list of vertices created. */
+typedef glb_vertex vertex;
+static vertex *vertices = 0;
+static int  nr_vertices = 0, nr_vertices_allocated = 0;
+
+/* The list of triangles created. */
+typedef glb_triangle triangle;
+static triangle *triangles = 0;
+static int  nr_triangles = 0, nr_triangles_allocated = 0;
+
+/* Have we initialized the lists yet? */
+static int  initialized = 0;
+
+#define EPSILON GLB_VERTICES_EPSILON
+
+/* Should be taken care of already... but just in case */
+#if !defined( __GNUC__ ) && !defined(__cplusplus) && !defined(c_plusplus)
+#undef inline
+#define inline                 /* */
+#endif
+static inline int
+close_enough(GLfloat * v1, GLfloat * v2)
+{
+       return fabs((double) (v1[0] - v2[0])) <= EPSILON &&
+               fabs((double) (v1[1] - v2[1])) <= EPSILON &&
+               fabs((double) (v1[2] - v2[2])) <= EPSILON;
+}
+
+#define INCR(n) ((n == 0) ? (n = 1) : (n *= 2))
+#define INCR_ALLOCATION(a, n, t) (a = (t *) realloc (a, INCR (n) * sizeof (t)))
+
+static inline GLuint
+save_vertex(GLfloat * v)
+{
+       int         i;
+
+       /* Inefficient, but we only do this a few times. Check to see if there's
+        * an existing vertex which is `close enough' to this one.
+        */
+       for (i = 0; i < nr_vertices; ++i)
+               if (close_enough(v, vertices[i]))
+                       return i;
+
+       if (nr_vertices_allocated <= nr_vertices) {
+               if (vertices == 0) {
+                       vertices = (vertex *) malloc(INCR(nr_vertices_allocated) * sizeof (vertex));
+               } else {
+                       INCR_ALLOCATION(vertices, nr_vertices_allocated, vertex);
+               }
+       }
+       vertices[nr_vertices][0] = v[0];
+       vertices[nr_vertices][1] = v[1];
+       vertices[nr_vertices][2] = v[2];
+       return nr_vertices++;
+}
+
+static inline GLuint
+save_triangle(GLuint v1, GLuint v2, GLuint v3)
+{
+       if (nr_triangles_allocated <= nr_triangles) {
+               if (triangles == 0) {
+                       triangles = (triangle *) malloc(INCR(nr_triangles_allocated) * sizeof (triangle));
+               } else {
+                       INCR_ALLOCATION(triangles, nr_triangles_allocated, triangle);
+               }
+       }
+       triangles[nr_triangles][0] = v1;
+       triangles[nr_triangles][1] = v2;
+       triangles[nr_triangles][2] = v3;
+       return nr_triangles++;
+}
+
+static inline void
+normalize(GLfloat v[3])
+{
+       GLfloat     d = (GLfloat) sqrt((double) (v[0] * v[0] + v[1] * v[1] + v[2] * v[2]));
+
+       if (d != 0) {
+               v[0] /= d;
+               v[1] /= d;
+               v[2] /= d;
+       } else {
+               v[0] = v[1] = v[2] = 0;
+       }
+}
+
+static void
+subdivide(GLfloat * v1, GLuint vi1,
+         GLfloat * v2, GLuint vi2,
+         GLfloat * v3, GLuint vi3,
+         int depth)
+{
+       int         i;
+
+       if (depth == 0) {
+               save_triangle(vi1, vi2, vi3);
+       } else {
+               GLuint      vi12, vi23, vi31;
+               GLfloat     v12[3], v23[3], v31[3];
+
+               for (i = 0; i < 3; ++i) {
+                       v12[i] = v1[i] + v2[i];
+                       v23[i] = v2[i] + v3[i];
+                       v31[i] = v3[i] + v1[i];
+               }
+               normalize(v12);
+               vi12 = save_vertex(v12);
+               normalize(v23);
+               vi23 = save_vertex(v23);
+               normalize(v31);
+               vi31 = save_vertex(v31);
+               subdivide(v1, vi1, v12, vi12, v31, vi31, depth - 1);
+               subdivide(v2, vi2, v23, vi23, v12, vi12, depth - 1);
+               subdivide(v3, vi3, v31, vi31, v23, vi23, depth - 1);
+               subdivide(v12, vi12, v23, vi23, v31, vi31, depth - 1);
+       }
+}
+
+#define ICO_X 0.525731112119133606
+#define ICO_Z 0.850650808352039932
+
+static GLfloat vdata[12][3] =
+{
+       {-ICO_X, 0, ICO_Z},
+       {ICO_X, 0, ICO_Z},
+       {-ICO_X, 0, -ICO_Z},
+       {ICO_X, 0, -ICO_Z},
+       {0, ICO_Z, ICO_X},
+       {0, ICO_Z, -ICO_X},
+       {0, -ICO_Z, ICO_X},
+       {0, -ICO_Z, -ICO_X},
+       {ICO_Z, ICO_X, 0},
+       {-ICO_Z, ICO_X, 0},
+       {ICO_Z, -ICO_X, 0},
+       {-ICO_Z, -ICO_X, 0}
+};
+
+static GLuint tindices[20][3] =
+{
+       {0, 4, 1},
+       {0, 9, 4},
+       {9, 5, 4},
+       {4, 5, 8},
+       {4, 8, 1},
+       {8, 10, 1},
+       {8, 3, 10},
+       {5, 3, 8},
+       {5, 2, 3},
+       {2, 7, 3},
+       {7, 10, 3},
+       {7, 6, 10},
+       {7, 11, 6},
+       {11, 0, 6},
+       {0, 1, 6},
+       {6, 1, 10},
+       {9, 0, 11},
+       {9, 11, 2},
+       {9, 2, 5},
+       {7, 2, 11}
+};
+
+/* Public interface: Create the sphere. */
+void
+glb_sphere_init(void)
+{
+       int         i;
+
+       if (initialized)
+               return;
+
+       for (i = 0; i < 20; ++i) {
+               subdivide(vdata[tindices[i][0]], save_vertex(vdata[tindices[i][0]]),
+                  vdata[tindices[i][1]], save_vertex(vdata[tindices[i][1]]),
+                  vdata[tindices[i][2]], save_vertex(vdata[tindices[i][2]]),
+                         glb_config.subdivision_depth);
+       }
+
+       initialized = 1;
+}
+
+/* Return the vertices list. */
+glb_vertex *
+glb_sphere_get_vertices(int *nr_vertices_ptr)
+{
+       glb_sphere_init();
+       *nr_vertices_ptr = nr_vertices;
+       return vertices;
+}
+
+/* Return the triangles list. */
+glb_triangle *
+glb_sphere_get_triangles(int *nr_triangles_ptr)
+{
+       glb_sphere_init();
+       *nr_triangles_ptr = nr_triangles;
+       return triangles;
+}
+
+/* Free up memory. */
+#if 0
+void
+glb_sphere_end(void)
+{
+       initialized = 0;
+
+       (void) free((void *) vertices);
+       (void) free((void *) triangles);
+
+       vertices = 0;
+       nr_vertices = nr_vertices_allocated = 0;
+
+       triangles = 0;
+       nr_triangles = nr_triangles_allocated = 0;
+}
+
+#endif
diff --git a/hacks/glx/bubble3d.c b/hacks/glx/bubble3d.c
new file mode 100644 (file)
index 0000000..dd5b68e
--- /dev/null
@@ -0,0 +1,264 @@
+/* -*- Mode: C; tab-width: 4 -*- */
+/* bubble3d.c - 3D bubbles  */
+
+#if !defined( lint ) && !defined( SABER )
+static const char sccsid[] = "@(#)bubble3d.c  4.11 98/06/16 xlockmore";
+
+#endif
+
+/*-
+ * BUBBLE3D (C) 1998 Richard W.M. Jones.
+ * 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.
+ *
+ * This file is provided AS IS with no warranties of any kind.  The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof.  In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * Revision History:
+ * 16-Jun-98: Written.
+ *
+ * bubble.c: This code is responsible for creating and managing
+ * bubbles over their lifetime.
+ * The bubbles may be drawn inside out.
+ */
+
+#include "bubble3d.h"
+
+typedef struct bubble {
+       GLfloat    *contributions;      /* List of contributions from each
+                                        * nudge to each vertex. This list has
+                                        * length nr_vertices * nr_nudge_axes.
+                                        */
+       GLfloat     x, y, z;    /* (x,y,z) location of the bubble. */
+       GLfloat     scale;      /* Scaling factor applied to bubble. */
+       GLfloat     y_incr, scale_incr;         /* Change in y and scale each frame. */
+       GLfloat     rotx, roty, rotz;   /* Current rotation. */
+       GLfloat     rotx_incr, roty_incr, rotz_incr;    /* Amount by which we increase
+                                                        * rotation each step.
+                                                        */
+       GLfloat    *nudge_angle;        /* Current angle (radians) of each
+                                        * nudge. This list has length nr_nudge_axes.
+                                        */
+       GLfloat    *nudge_angle_incr;   /* Amount by which we increase each nudge
+                                        * angle in each frame.
+                                        */
+} bubble;
+
+/* Should be taken care of already... but just in case */
+#if !defined( __GNUC__ ) && !defined(__cplusplus) && !defined(c_plusplus)
+#undef inline
+#define inline                 /* */
+#endif
+static inline void
+normalize(GLfloat v[3])
+{
+       GLfloat     d = (GLfloat) sqrt((double) (v[0] * v[0] + v[1] * v[1] +
+                                                v[2] * v[2]));
+
+       if (d != 0) {
+               v[0] /= d;
+               v[1] /= d;
+               v[2] /= d;
+       } else {
+               v[0] = v[1] = v[2] = 0;
+       }
+}
+
+static inline GLfloat
+dotprod(GLfloat * v1, GLfloat * v2)
+{
+       return v1[0] * v2[0] + v1[1] * v2[1] + v1[2] * v2[2];
+}
+
+static inline GLfloat
+max(GLfloat a, GLfloat b)
+{
+       return a > b ? a : b;
+}
+
+/* Create a new bubble. */
+void       *
+glb_bubble_new(GLfloat x, GLfloat y, GLfloat z, GLfloat scale,
+              GLfloat y_incr, GLfloat scale_incr)
+{
+       int         i, j;
+
+       /* GLfloat axes [glb_config.nr_nudge_axes][3]; */
+       GLfloat     axes[5][3]; /* HARD CODED for SunCC */
+       int         nr_vertices;
+       glb_vertex *vertices = glb_sphere_get_vertices(&nr_vertices);
+
+       bubble     *b = (bubble *) malloc(sizeof *b);
+
+       if (b == 0)
+               return 0;
+
+       b->contributions = (GLfloat *) malloc(sizeof (GLfloat) * nr_vertices *
+                                             glb_config.nr_nudge_axes);
+       if (b->contributions == 0) {
+               (void) free((void *) b);
+               return 0;
+       }
+       b->nudge_angle = (GLfloat *) malloc(sizeof (GLfloat) * glb_config.nr_nudge_axes);
+       if (b->nudge_angle == 0) {
+               (void) free((void *) b->contributions);
+               (void) free((void *) b);
+               return 0;
+       }
+       b->nudge_angle_incr = (GLfloat *) malloc(sizeof (GLfloat) * glb_config.nr_nudge_axes);
+       if (b->nudge_angle_incr == 0) {
+               (void) free((void *) b->nudge_angle);
+               (void) free((void *) b->contributions);
+               (void) free((void *) b);
+               return 0;
+       }
+       /* Initialize primitive elements. */
+       b->x = x;
+       b->y = y;
+       b->z = z;
+       b->scale = scale;
+       b->y_incr = y_incr;
+       b->scale_incr = scale_incr;
+       b->rotx = b->roty = b->rotz = 0;
+       b->rotx_incr = glb_drand() * glb_config.rotation_factor * 2
+               - glb_config.rotation_factor;
+       b->roty_incr = glb_drand() * glb_config.rotation_factor * 2
+               - glb_config.rotation_factor;
+       b->rotz_incr = glb_drand() * glb_config.rotation_factor * 2
+               - glb_config.rotation_factor;
+
+       /* Initialize the nudge angle arrays. */
+       for (i = 0; i < glb_config.nr_nudge_axes; ++i) {
+               b->nudge_angle[i] = 0;
+               b->nudge_angle_incr[i] = glb_drand() * glb_config.nudge_angle_factor;
+       }
+
+       /* Choose some random nudge axes. */
+       for (i = 0; i < glb_config.nr_nudge_axes; ++i) {
+               axes[i][0] = glb_drand() * 2 - 1;
+               axes[i][1] = glb_drand() * 2 - 1;
+               axes[i][2] = glb_drand() * 2 - 1;
+               normalize(axes[i]);
+       }
+
+       /* Calculate the contribution that each nudge axis has on each vertex. */
+       for (i = 0; i < nr_vertices; ++i)
+               for (j = 0; j < glb_config.nr_nudge_axes; ++j)
+                       b->contributions[i * glb_config.nr_nudge_axes + j]
+                               = max(0, dotprod(vertices[i], axes[j]));
+
+       return (void *) b;
+}
+
+/* Delete a bubble and free up all memory. */
+void
+glb_bubble_delete(void *bb)
+{
+       bubble     *b = (bubble *) bb;
+
+       if (b != NULL) {
+               if (b->nudge_angle_incr) {
+                       (void) free((void *) b->nudge_angle_incr);
+                       b->nudge_angle_incr = NULL;
+               }
+               if (b->nudge_angle) {
+                       (void) free((void *) b->nudge_angle);
+                       b->nudge_angle = NULL;
+               }
+               if (b->contributions) {
+                       (void) free((void *) b->contributions);
+                       b->contributions = NULL;
+               }
+               (void) free((void *) b);
+               b = NULL;
+       }
+}
+
+/* Rotate and wobble a bubble by a single step. */
+void
+glb_bubble_step(void *bb)
+{
+       int         i;
+       bubble     *b = (bubble *) bb;
+
+       /* Update the rotation. */
+       b->rotx += b->rotx_incr;
+       b->roty += b->roty_incr;
+       b->rotz += b->rotz_incr;
+
+       /* Update the nudge angles. */
+       for (i = 0; i < glb_config.nr_nudge_axes; ++i)
+               b->nudge_angle[i] += b->nudge_angle_incr[i];
+
+       /* Move it upwards & outwards. */
+       b->y += b->y_incr;
+       b->scale += b->scale_incr;
+}
+
+/* Draw a bubble. */
+void
+glb_bubble_draw(void *bb)
+{
+       int         i, j;
+       bubble     *b = (bubble *) bb;
+       int         nr_vertices;
+       glb_vertex *vertices = glb_sphere_get_vertices(&nr_vertices);
+       int         nr_triangles;
+       glb_triangle *triangles = glb_sphere_get_triangles(&nr_triangles);
+       glb_vertex *new_vertices;
+
+       new_vertices = (glb_vertex *) malloc(sizeof (glb_vertex) * nr_vertices);
+       /* Calculate the vertices of this bubble, factoring in each nudge axis. */
+       for (i = 0; i < nr_vertices; ++i) {
+               GLfloat     s = 0;
+
+               for (j = 0; j < glb_config.nr_nudge_axes; ++j)
+                       s += ((GLfloat) cos((double) (b->nudge_angle[j])) *
+                             glb_config.nudge_factor - glb_config.nudge_factor / 2) *
+                               b->contributions[i * glb_config.nr_nudge_axes + j];
+
+               new_vertices[i][0] = vertices[i][0] * (s + 1);
+               new_vertices[i][1] = vertices[i][1] * (s + 1);
+               new_vertices[i][2] = vertices[i][2] * (s + 1);
+       }
+
+       glPushMatrix();
+
+       /* Apply translation, rotation and scalings. */
+       glTranslatef(b->x, b->y, b->z);
+
+       glRotatef(b->rotx, 1, 0, 0);
+       glRotatef(b->roty, 0, 1, 0);
+       glRotatef(b->rotz, 0, 0, 1);
+
+       glScalef(b->scale, b->scale, b->scale);
+
+       /* Draw the bubble. */
+       glBegin(GL_TRIANGLES);
+       for (i = 0; i < nr_triangles; ++i) {
+               glNormal3fv(new_vertices[triangles[i][0]]);
+               glVertex3fv(new_vertices[triangles[i][0]]);
+               glNormal3fv(new_vertices[triangles[i][1]]);
+               glVertex3fv(new_vertices[triangles[i][1]]);
+               glNormal3fv(new_vertices[triangles[i][2]]);
+               glVertex3fv(new_vertices[triangles[i][2]]);
+       }
+       glEnd();
+       glPopMatrix();
+       (void) free((void *) new_vertices);
+}
+
+/* Return y value. */
+GLfloat
+glb_bubble_get_y(void *bb)
+{
+       bubble     *b = (bubble *) bb;
+
+       return b->y;
+}
diff --git a/hacks/glx/bubble3d.h b/hacks/glx/bubble3d.h
new file mode 100644 (file)
index 0000000..4cbdd75
--- /dev/null
@@ -0,0 +1,90 @@
+/* GLBUBBLES (C) 1998 Richard W.M. Jones. */
+
+#ifndef __bubbles3d_h__
+#define __bubbles3d_h__
+
+#include <X11/Intrinsic.h>
+
+#ifdef STANDALONE
+# include <math.h>
+# include "xlockmoreI.h"       /* from the xscreensaver distribution */
+#else /* !STANDALONE */
+# include "xlock.h"            /* from the xlockmore distribution */
+#endif /* !STANDALONE */
+
+#include <GL/gl.h>
+#include <GL/glu.h>
+
+/* Static configuration. */
+#define GLB_SLOW_GL          1 /* Set this if you have a slow GL
+                                  * implementation. If you have an accelerated
+                                  * graphics card, set this to 0.
+                                */
+#define GLB_USE_BLENDING     0 /* Use alpha feature to create see-through
+                                  * bubbles.
+                                */
+#define GLB_VERTICES_EPSILON 0.0005    /* How close are identical vertices? */
+
+/* Configuration structure. */
+struct glb_config {
+       int         subdivision_depth;  /* Controls how many triangles are in
+                                        * each bubble. 2 and 3 are good values.
+                                        */
+       int         nr_nudge_axes;      /* Number of directions in which each
+                                        * bubble gets stretched. Values between
+                                        * 3 and 7 seem to produce good results.
+                                        */
+       GLfloat     nudge_angle_factor;         /* Max. amount of rotation in nudge angles.
+                                                * Controls the amount of `wobble' we see,
+                                                * and 0.3 seems to work well.
+                                                */
+       GLfloat     nudge_factor;       /* Max. displacement of any single nudge.
+                                        * Controls the amount of the wobble. Depends
+                                        * on NR_NUDGE_AXES, and must not exceed
+                                        * 1 / NR_NUDGE_AXES. 0.1 is good.
+                                        */
+       GLfloat     rotation_factor;    /* Max. amount by which bubbles rotate. */
+       int         create_bubbles_every;       /* How often to create new bubbles. */
+       int         max_bubbles;        /* Max. number of bubbles to create. */
+       double      p_bubble_group[4];  /* Probabilities of creating 1, 2, 3, 4
+                                        * bubbles in a group. Cumulative.
+                                        */
+       GLfloat     max_size;   /* Max. size. */
+       GLfloat     min_size;   /* Min. size of bubbles. */
+       GLfloat     max_speed;  /* Max. speed. */
+       GLfloat     min_speed;  /* Min. speed of bubbles. */
+       GLfloat     scale_factor;       /* Factor by which bubbles scale from bottom
+                                        * of screen to top. 1.5 - 2.0 are OK.
+                                        */
+       GLfloat     screen_bottom;      /* Bottom of screen. */
+       GLfloat     screen_top; /* Top of screen. */
+       GLfloat     bg_colour[4];       /* Background colour. */
+       GLfloat     bubble_colour[4];   /* Colour of the bubbles. */
+};
+
+extern struct glb_config glb_config;
+
+#define glb_drand() ((double)LRAND() / (double)MAXRAND)
+
+/*-- From glb_sphere.c. --*/
+typedef GLfloat glb_vertex[3];
+typedef GLuint glb_triangle[3];
+extern void glb_sphere_init(void);
+extern glb_vertex *glb_sphere_get_vertices(int *nr_vertices);
+extern glb_triangle *glb_sphere_get_triangles(int *nr_triangles);
+extern void glb_sphere_end(void);
+
+/*-- From glb_bubble.c. --*/
+extern void *glb_bubble_new(GLfloat x, GLfloat y, GLfloat z, GLfloat scale,
+                           GLfloat y_incr, GLfloat scale_incr);
+extern void glb_bubble_delete(void *);
+extern void glb_bubble_step(void *);
+extern void glb_bubble_draw(void *);
+extern GLfloat glb_bubble_get_y(void *);
+
+/*-- From glb_draw.c. --*/
+extern void *glb_draw_init(void);
+extern void glb_draw_step(void *);
+extern void glb_draw_end(void *);
+
+#endif /* __bubbles3d_h__ */
diff --git a/hacks/glx/buildlwo.c b/hacks/glx/buildlwo.c
new file mode 100644 (file)
index 0000000..1aa86ed
--- /dev/null
@@ -0,0 +1,101 @@
+
+#if !defined( lint ) && !defined( SABER )
+static const char sccsid[] = "@(#)buildlwo.c   4.02 97/04/20 xlockmore";
+
+#endif
+
+/*-
+ * buildlwo.c: Lightwave Object Display List Builder for OpenGL
+ *
+ * This module can be called by any GL mode wishing to use
+ * objects created in NewTek's Lightwave 3D.  The objects must
+ * first be converted to C source with my converter "lw2ogl".
+ * If other people are interested in this, I will put up a
+ * web page for it at http://www.netaxs.com/~emackey/lw2ogl/
+ *
+ * by Ed Mackey, 4/19/97
+ *
+ */
+
+#ifndef STANDALONE
+#include "xlock.h"
+#endif
+
+#ifdef USE_GL
+
+#ifdef STANDALONE
+#include <GL/glx.h>
+#endif
+#include <GL/gl.h>
+#include <GL/glu.h>
+#include "buildlwo.h"
+
+GLuint
+BuildLWO(int wireframe, struct lwo *object)
+{
+       GLuint      dl_num;
+       GLfloat    *pnts, *normals, three[3], *grab;
+       unsigned short int *pols;
+       int         p, num_pnts = 0;
+
+       dl_num = glGenLists(1);
+       if (!dl_num)
+               return (0);
+
+       pnts = object->pnts;
+       normals = object->normals;
+       pols = object->pols;
+
+       glNewList(dl_num, GL_COMPILE);
+
+       if (!pols) {
+               num_pnts = object->num_pnts;
+               glBegin(GL_POINTS);
+               for (p = 0; p < num_pnts; ++p) {
+                       three[0] = *(pnts++);
+                       three[1] = *(pnts++);
+                       three[2] = *(pnts++);
+                       glVertex3fv(three);
+               }
+               glEnd();
+       } else
+               for (;;) {
+                       if (num_pnts <= 0) {
+                               num_pnts = *pols + 2;
+                               if (num_pnts < 3)
+                                       break;
+                               if (num_pnts == 3) {
+                                       glBegin(GL_POINTS);
+                               } else if (num_pnts == 4) {
+                                       glBegin(GL_LINES);
+                               } else {
+                                       three[0] = *(normals++);
+                                       three[1] = *(normals++);
+                                       three[2] = *(normals++);
+                                       glNormal3fv(three);
+                                       if (wireframe)
+                                               glBegin(GL_LINE_LOOP);
+                                       else
+                                               glBegin(GL_POLYGON);
+                               }
+                       } else if (num_pnts == 1) {
+                               glEnd();
+                       } else {
+                               grab = pnts + ((int) (*pols) * 3);
+                               three[0] = *(grab++);
+                               three[1] = *(grab++);
+                               three[2] = *(grab++);
+                               glVertex3fv(three);
+                       }
+                       --num_pnts;
+                       ++pols;
+               }
+
+       glEndList();
+
+       return (dl_num);
+}
+
+#endif /* USE_GL */
+
+/* End of buildlwo.c */
diff --git a/hacks/glx/buildlwo.h b/hacks/glx/buildlwo.h
new file mode 100644 (file)
index 0000000..fd9f027
--- /dev/null
@@ -0,0 +1,24 @@
+/*-
+ * buildlwo.h: Header file for Lightwave Object Display List Builder
+ * for OpenGL
+ *
+ * by Ed Mackey, 4/19/97
+ *
+ */
+
+#ifndef __BUILD_LWO_H__
+#define __BUILD_LWO_H__
+
+struct lwo {
+       int         num_pnts;
+       GLfloat    *pnts;
+       GLfloat    *normals;
+       unsigned short int *pols;
+       GLfloat    *smoothnormals;
+};
+
+GLuint      BuildLWO(int wireframe, struct lwo *object);
+
+#endif
+
+/* End of buildlwo.h */
diff --git a/hacks/glx/cage.c b/hacks/glx/cage.c
new file mode 100644 (file)
index 0000000..26a60b5
--- /dev/null
@@ -0,0 +1,452 @@
+/* -*- Mode: C; tab-width: 4 -*- */
+/* cage --- the Impossible Cage, an Escher like scene. */
+
+#if !defined( lint ) && !defined( SABER )
+static const char sccsid[] = "@(#)cage.c       4.07 98/01/04 xlockmore";
+
+#endif
+
+#undef DEBUG_LISTS
+
+/*-
+ * 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.
+ *
+ * This file is provided AS IS with no warranties of any kind.  The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof.  In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * The RotateAroundU() routine was adapted from the book
+ *    "Computer Graphics Principles and Practice 
+ *     Foley - vanDam - Feiner - Hughes
+ *     Second Edition" Pag. 227, exercise 5.15.
+ * 
+ * This mode shows some interesting scenes that are impossible OR very
+ * wierd to build in the real universe. Much of the scenes are inspirated
+ * on Mauritz Cornelis Escher's works which derivated the mode's name.
+ * M.C. Escher (1898-1972) was a dutch artist and many people prefer to
+ * say he was a mathematician.
+ *
+ * Thanks goes to Brian Paul for making it possible and inexpensive to use 
+ * OpenGL at home.
+ *
+ * Since I'm not a native English speaker, my apologies for any grammatical
+ * mistake.
+ *
+ * My e-mail address is
+ * m-vianna@usa.net
+ *
+ * Marcelo F. Vianna (Jun-01-1997)
+ *
+ * Revision History:
+ * 01-Jan-98: Mode separated from escher and renamed
+ * 08-Jun-97: New scene implemented: "Impossible Cage" based in a M.C. Escher's
+ *            painting with the same name (quite similar). The first GL mode
+ *            to use texture mapping.
+ *            The "Impossible Cage" scene doesn't use DEPTH BUFFER, the 
+ *            wood planks are drawn consistently using GL_CULL_FACE, and
+ *            the painter's algorithm is used to sort the planks.
+ *            Marcelo F. Vianna.
+ * 07-Jun-97: Speed ups in Moebius Strip using GL_CULL_FACE.
+ *            Marcelo F. Vianna.
+ * 03-Jun-97: Initial Release (Only one scene: "Moebius Strip")
+ *            The Moebius Strip scene was inspirated in a M.C. Escher's
+ *            painting named Moebius Strip II in wich ants walk across a
+ *            Moebius Strip path, sometimes meeting each other and sometimes
+ *            being in "opposite faces" (note that the moebius strip has
+ *            only one face and one edge).
+ *            Marcelo F. Vianna.
+ *
+ */
+
+/*-
+ * Texture mapping is only available on RGBA contexts, Mono and color index
+ * visuals DO NOT support texture mapping in OpenGL.
+ *
+ * BUT Mesa do implements RGBA contexts in pseudo color visuals, so texture
+ * mapping shuld work on PseudoColor, DirectColor, TrueColor using Mesa. Mono
+ * is not officially supported for both OpenGL and Mesa, but seems to not crash
+ * Mesa.
+ *
+ * In real OpenGL, PseudoColor DO NOT support texture map (as far as I know).
+ */
+
+#include <X11/Intrinsic.h>
+
+#ifdef STANDALONE
+# define PROGCLASS                     "Cage"
+# define HACK_INIT                     init_cage
+# define HACK_DRAW                     draw_cage
+# define cage_opts                     xlockmore_opts
+# define DEFAULTS                      "*cycles:               1       \n"                     \
+                                                       "*delay:                1000    \n"                     \
+                                                       "*wireframe:    False   \n"
+# include "xlockmore.h"                /* from the xscreensaver distribution */
+#else /* !STANDALONE */
+# include "xlock.h"            /* from the xlockmore distribution */
+
+#endif /* !STANDALONE */
+
+#ifdef USE_GL
+
+
+#include <GL/glu.h>
+#include "e_textures.h"
+
+ModeSpecOpt cage_opts =
+{0, NULL, 0, NULL, NULL};
+
+#ifdef USE_MODULES
+ModStruct   cage_description =
+{"cage", "init_cage", "draw_cage", "release_cage",
+ "draw_cage", "change_cage", NULL, &cage_opts,
+ 1000, 1, 1, 1, 1.0, 4, "",
+ "Shows the Impossible Cage, an Escher-like GL scene", 0, NULL};
+
+#endif
+
+#define Scale4Window               0.3
+#define Scale4Iconic               0.4
+
+#define sqr(A)                     ((A)*(A))
+
+#ifndef Pi
+#define Pi                         M_PI
+#endif
+
+/*************************************************************************/
+
+typedef struct {
+       GLint       WindH, WindW;
+       GLfloat     step;
+       int         AreObjectsDefined[1];
+       GLXContext *glx_context;
+} cagestruct;
+
+static float front_shininess[] =
+{60.0};
+static float front_specular[] =
+{0.7, 0.7, 0.7, 1.0};
+static float ambient[] =
+{0.0, 0.0, 0.0, 1.0};
+static float diffuse[] =
+{1.0, 1.0, 1.0, 1.0};
+static float position0[] =
+{1.0, 1.0, 1.0, 0.0};
+static float position1[] =
+{-1.0, -1.0, 1.0, 0.0};
+static float lmodel_ambient[] =
+{0.5, 0.5, 0.5, 1.0};
+static float lmodel_twoside[] =
+{GL_TRUE};
+
+static float MaterialWhite[] =
+{0.7, 0.7, 0.7, 1.0};
+
+static cagestruct *cage = NULL;
+static GLuint objects;
+
+#define ObjWoodPlank    0
+
+#define PlankWidth      3.0
+#define PlankHeight     0.35
+#define PlankThickness  0.15
+
+static void
+draw_woodplank(cagestruct * cp)
+{
+       if (!cp->AreObjectsDefined[ObjWoodPlank]) {
+               glNewList(objects + ObjWoodPlank, GL_COMPILE_AND_EXECUTE);
+               glBegin(GL_QUADS);
+               glNormal3f(0, 0, 1);
+               glTexCoord2f(0, 0);
+               glVertex3f(-PlankWidth, -PlankHeight, PlankThickness);
+               glTexCoord2f(1, 0);
+               glVertex3f(PlankWidth, -PlankHeight, PlankThickness);
+               glTexCoord2f(1, 1);
+               glVertex3f(PlankWidth, PlankHeight, PlankThickness);
+               glTexCoord2f(0, 1);
+               glVertex3f(-PlankWidth, PlankHeight, PlankThickness);
+               glNormal3f(0, 0, -1);
+               glTexCoord2f(0, 0);
+               glVertex3f(-PlankWidth, PlankHeight, -PlankThickness);
+               glTexCoord2f(1, 0);
+               glVertex3f(PlankWidth, PlankHeight, -PlankThickness);
+               glTexCoord2f(1, 1);
+               glVertex3f(PlankWidth, -PlankHeight, -PlankThickness);
+               glTexCoord2f(0, 1);
+               glVertex3f(-PlankWidth, -PlankHeight, -PlankThickness);
+               glNormal3f(0, 1, 0);
+               glTexCoord2f(0, 0);
+               glVertex3f(-PlankWidth, PlankHeight, PlankThickness);
+               glTexCoord2f(1, 0);
+               glVertex3f(PlankWidth, PlankHeight, PlankThickness);
+               glTexCoord2f(1, 1);
+               glVertex3f(PlankWidth, PlankHeight, -PlankThickness);
+               glTexCoord2f(0, 1);
+               glVertex3f(-PlankWidth, PlankHeight, -PlankThickness);
+               glNormal3f(0, -1, 0);
+               glTexCoord2f(0, 0);
+               glVertex3f(-PlankWidth, -PlankHeight, -PlankThickness);
+               glTexCoord2f(1, 0);
+               glVertex3f(PlankWidth, -PlankHeight, -PlankThickness);
+               glTexCoord2f(1, 1);
+               glVertex3f(PlankWidth, -PlankHeight, PlankThickness);
+               glTexCoord2f(0, 1);
+               glVertex3f(-PlankWidth, -PlankHeight, PlankThickness);
+               glNormal3f(1, 0, 0);
+               glTexCoord2f(0, 0);
+               glVertex3f(PlankWidth, -PlankHeight, PlankThickness);
+               glTexCoord2f(1, 0);
+               glVertex3f(PlankWidth, -PlankHeight, -PlankThickness);
+               glTexCoord2f(1, 1);
+               glVertex3f(PlankWidth, PlankHeight, -PlankThickness);
+               glTexCoord2f(0, 1);
+               glVertex3f(PlankWidth, PlankHeight, PlankThickness);
+               glNormal3f(-1, 0, 0);
+               glTexCoord2f(0, 0);
+               glVertex3f(-PlankWidth, PlankHeight, PlankThickness);
+               glTexCoord2f(1, 0);
+               glVertex3f(-PlankWidth, PlankHeight, -PlankThickness);
+               glTexCoord2f(1, 1);
+               glVertex3f(-PlankWidth, -PlankHeight, -PlankThickness);
+               glTexCoord2f(0, 1);
+               glVertex3f(-PlankWidth, -PlankHeight, PlankThickness);
+               glEnd();
+               glEndList();
+               cp->AreObjectsDefined[ObjWoodPlank] = 1;
+#ifdef DEBUG_LISTS
+               (void) printf("WoodPlank drawn SLOWLY\n");
+#endif
+       } else {
+               glCallList(objects + ObjWoodPlank);
+#ifdef DEBUG_LISTS
+               (void) printf("WoodPlank drawn quickly\n");
+#endif
+       }
+}
+
+static void
+draw_impossiblecage(cagestruct * cp)
+{
+       glPushMatrix();
+       glRotatef(90, 0, 1, 0);
+       glTranslatef(0.0, PlankHeight - PlankWidth, -PlankThickness - PlankWidth);
+       draw_woodplank(cp);
+       glPopMatrix();
+       glPushMatrix();
+       glRotatef(90, 0, 0, 1);
+       glTranslatef(0.0, PlankHeight - PlankWidth, PlankWidth - PlankThickness);
+       draw_woodplank(cp);
+       glPopMatrix();
+       glPushMatrix();
+       glRotatef(90, 0, 1, 0);
+       glTranslatef(0.0, PlankWidth - PlankHeight, -PlankThickness - PlankWidth);
+       draw_woodplank(cp);
+       glPopMatrix();
+       glPushMatrix();
+       glTranslatef(0.0, PlankWidth - PlankHeight, 3 * PlankThickness - PlankWidth);
+       draw_woodplank(cp);
+       glPopMatrix();
+       glPushMatrix();
+       glRotatef(90, 0, 0, 1);
+       glTranslatef(0.0, PlankWidth - PlankHeight, PlankWidth - PlankThickness);
+       draw_woodplank(cp);
+       glPopMatrix();
+       glPushMatrix();
+       glTranslatef(0.0, PlankWidth - PlankHeight, PlankWidth - 3 * PlankThickness);
+       draw_woodplank(cp);
+       glPopMatrix();
+       glPushMatrix();
+       glTranslatef(0.0, PlankHeight - PlankWidth, 3 * PlankThickness - PlankWidth);
+       draw_woodplank(cp);
+       glPopMatrix();
+       glPushMatrix();
+       glRotatef(90, 0, 0, 1);
+       glTranslatef(0.0, PlankHeight - PlankWidth, PlankThickness - PlankWidth);
+       draw_woodplank(cp);
+       glPopMatrix();
+       glPushMatrix();
+       glTranslatef(0.0, PlankHeight - PlankWidth, PlankWidth - 3 * PlankThickness);
+       draw_woodplank(cp);
+       glPopMatrix();
+       glPushMatrix();
+       glRotatef(90, 0, 1, 0);
+       glTranslatef(0.0, PlankHeight - PlankWidth, PlankWidth + PlankThickness);
+       draw_woodplank(cp);
+       glPopMatrix();
+       glPushMatrix();
+       glRotatef(90, 0, 0, 1);
+       glTranslatef(0.0, PlankWidth - PlankHeight, PlankThickness - PlankWidth);
+       draw_woodplank(cp);
+       glPopMatrix();
+       glPushMatrix();
+       glRotatef(90, 0, 1, 0);
+       glTranslatef(0.0, PlankWidth - PlankHeight, PlankWidth + PlankThickness);
+       draw_woodplank(cp);
+       glPopMatrix();
+}
+
+static void
+reshape(ModeInfo * mi, int width, int height)
+{
+       cagestruct *cp = &cage[MI_SCREEN(mi)];
+
+       glViewport(0, 0, cp->WindW = (GLint) width, cp->WindH = (GLint) height);
+       glMatrixMode(GL_PROJECTION);
+       glLoadIdentity();
+       glFrustum(-1.0, 1.0, -1.0, 1.0, 5.0, 15.0);
+       glMatrixMode(GL_MODELVIEW);
+       if (width >= 1024) {
+               glLineWidth(3);
+               glPointSize(3);
+       } else if (width >= 512) {
+               glLineWidth(2);
+               glPointSize(2);
+       } else {
+               glLineWidth(1);
+               glPointSize(1);
+       }
+       cp->AreObjectsDefined[ObjWoodPlank] = 0;
+}
+
+static void
+pinit(void)
+{
+       glClearDepth(1.0);
+       glClearColor(0.0, 0.0, 0.0, 1.0);
+
+       glLightfv(GL_LIGHT0, GL_AMBIENT, ambient);
+       glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse);
+       glLightfv(GL_LIGHT0, GL_POSITION, position0);
+       glLightfv(GL_LIGHT1, GL_AMBIENT, ambient);
+       glLightfv(GL_LIGHT1, GL_DIFFUSE, diffuse);
+       glLightfv(GL_LIGHT1, GL_POSITION, position1);
+       glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient);
+       glLightModelfv(GL_LIGHT_MODEL_TWO_SIDE, lmodel_twoside);
+       glEnable(GL_LIGHTING);
+       glEnable(GL_LIGHT0);
+       glEnable(GL_LIGHT1);
+       glEnable(GL_NORMALIZE);
+       glFrontFace(GL_CCW);
+       glCullFace(GL_BACK);
+
+       /* cage */
+       glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialWhite);
+       glShadeModel(GL_FLAT);
+       glDisable(GL_DEPTH_TEST);
+       glEnable(GL_TEXTURE_2D);
+       glEnable(GL_CULL_FACE);
+
+       glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
+       gluBuild2DMipmaps(GL_TEXTURE_2D, 3, WoodTextureWidth, WoodTextureHeight,
+                         GL_RGB, GL_UNSIGNED_BYTE, WoodTextureData);
+       glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
+       glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+       glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+       glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+       glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+
+       glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, front_shininess);
+       glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, front_specular);
+}
+
+void
+init_cage(ModeInfo * mi)
+{
+       int         screen = MI_SCREEN(mi);
+       cagestruct *cp;
+
+       if (cage == NULL) {
+               if ((cage = (cagestruct *) calloc(MI_NUM_SCREENS(mi),
+                                              sizeof (cagestruct))) == NULL)
+                       return;
+       }
+       cp = &cage[screen];
+       cp->step = NRAND(90);
+
+       if ((cp->glx_context = init_GL(mi)) != NULL) {
+
+               reshape(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+               glDrawBuffer(GL_BACK);
+               if (!glIsList(objects))
+                       objects = glGenLists(1);
+               pinit();
+       } else {
+               MI_CLEARWINDOW(mi);
+       }
+}
+
+void
+draw_cage(ModeInfo * mi)
+{
+       cagestruct *cp = &cage[MI_SCREEN(mi)];
+
+       Display    *display = MI_DISPLAY(mi);
+       Window      window = MI_WINDOW(mi);
+
+       MI_IS_DRAWN(mi) = True;
+
+       if (!cp->glx_context)
+               return;
+
+       glXMakeCurrent(display, window, *(cp->glx_context));
+
+       glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+       glPushMatrix();
+
+       glTranslatef(0.0, 0.0, -10.0);
+
+       if (!MI_IS_ICONIC(mi)) {
+               glScalef(Scale4Window * cp->WindH / cp->WindW, Scale4Window, Scale4Window);
+       } else {
+               glScalef(Scale4Iconic * cp->WindH / cp->WindW, Scale4Iconic, Scale4Iconic);
+       }
+
+       /* cage */
+       glRotatef(cp->step * 100, 0, 0, 1);
+       glRotatef(25 + cos(cp->step * 5) * 6, 1, 0, 0);
+       glRotatef(204.5 - sin(cp->step * 5) * 8, 0, 1, 0);
+       draw_impossiblecage(cp);
+
+       glPopMatrix();
+
+       glFlush();
+
+       glXSwapBuffers(display, window);
+
+       cp->step += 0.025;
+}
+
+void
+change_cage(ModeInfo * mi)
+{
+       cagestruct *cp = &cage[MI_SCREEN(mi)];
+
+       if (!cp->glx_context)
+               return;
+
+       glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(cp->glx_context));
+       pinit();
+}
+
+void
+release_cage(ModeInfo * mi)
+{
+       if (cage != NULL) {
+               (void) free((void *) cage);
+               cage = NULL;
+       }
+       if (glIsList(objects)) {
+               glDeleteLists(objects, 1);
+       }
+       FreeAllGL(mi);
+}
+
+#endif
diff --git a/hacks/glx/dolphin.c b/hacks/glx/dolphin.c
new file mode 100644 (file)
index 0000000..67406d2
--- /dev/null
@@ -0,0 +1,2070 @@
+/* atlantis --- Shows moving 3D sea animals */
+
+#if !defined( lint ) && !defined( SABER )
+static const char sccsid[] = "@(#)dolphin.c    1.2 98/06/16 xlockmore";
+
+#endif
+
+/* Copyright (c) E. Lassauge, 1998. */
+
+/*
+ * 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.
+ *
+ * This file is provided AS IS with no warranties of any kind.  The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof.  In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * The original code for this mode was written by Mark J. Kilgard
+ * as a demo for openGL programming.
+ * 
+ * Porting it to xlock  was possible by comparing the original Mesa's morph3d 
+ * demo with it's ported version to xlock, so thanks for Marcelo F. Vianna 
+ * (look at morph3d.c) for his indirect help.
+ *
+ * Thanks goes also to Brian Paul for making it possible and inexpensive
+ * to use OpenGL at home.
+ *
+ * My e-mail address is lassauge@sagem.fr
+ *
+ * Eric Lassauge  (May-13-1998)
+ *
+ */
+
+/**
+ * (c) Copyright 1993, 1994, Silicon Graphics, Inc.
+ * ALL RIGHTS RESERVED
+ * Permission to use, copy, modify, and distribute this software for
+ * any purpose and without fee is hereby granted, provided that the above
+ * copyright notice appear in all copies and that both the copyright notice
+ * and this permission notice appear in supporting documentation, and that
+ * the name of Silicon Graphics, Inc. not be used in advertising
+ * or publicity pertaining to distribution of the software without specific,
+ * written prior permission.
+ *
+ * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS"
+ * AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR
+ * FITNESS FOR A PARTICULAR PURPOSE.  IN NO EVENT SHALL SILICON
+ * GRAPHICS, INC.  BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT,
+ * SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY
+ * KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION,
+ * LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF
+ * THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC.  HAS BEEN
+ * ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
+ * POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
+ * US Government Users Restricted Rights
+ * Use, duplication, or disclosure by the Government is subject to
+ * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph
+ * (c)(1)(ii) of the Rights in Technical Data and Computer Software
+ * clause at DFARS 252.227-7013 and/or in similar or successor
+ * clauses in the FAR or the DOD or NASA FAR Supplement.
+ * Unpublished-- rights reserved under the copyright laws of the
+ * United States.  Contractor/manufacturer is Silicon Graphics,
+ * Inc., 2011 N.  Shoreline Blvd., Mountain View, CA 94039-7311.
+ *
+ * OpenGL(TM) is a trademark of Silicon Graphics, Inc.
+ */
+
+#ifndef STANDALONE
+#include "xlock.h"
+#endif
+
+#ifdef USE_GL
+
+#ifdef STANDALONE
+#include <math.h>
+#include <GL/glx.h>
+#endif
+
+#include "atlantis.h"
+/* *INDENT-OFF* */
+static float N001[3] = {-0.005937 ,-0.101998 ,-0.994767};
+static float N002[3] = {0.936780 ,-0.200803 ,0.286569};
+static float N003[3] = {-0.233062 ,0.972058 ,0.028007};
+#if 0
+static float N004[3] = {0.000000 ,1.000000 ,0.000000};
+#endif
+static float N005[3] = {0.898117 ,0.360171 ,0.252315};
+static float N006[3] = {-0.915437 ,0.348456 ,0.201378};
+static float N007[3] = {0.602263 ,-0.777527 ,0.180920};
+static float N008[3] = {-0.906912 ,-0.412015 ,0.088061};
+#if 0
+static float N009[3] = {-0.015623 ,0.999878 ,0.000000};
+static float N010[3] = {0.000000 ,-0.992278 ,0.124035};
+static float N011[3] = {0.000000 ,-0.936329 ,-0.351123};
+#endif
+static float N012[3] = {0.884408 ,-0.429417 ,-0.182821};
+static float N013[3] = {0.921121 ,0.311084 ,-0.234016};
+static float N014[3] = {0.382635 ,0.877882 ,-0.287948};
+static float N015[3] = {-0.380046 ,0.888166 ,-0.258316};
+static float N016[3] = {-0.891515 ,0.392238 ,-0.226607};
+static float N017[3] = {-0.901419 ,-0.382002 ,-0.203763};
+static float N018[3] = {-0.367225 ,-0.911091 ,-0.187243};
+static float N019[3] = {0.339539 ,-0.924846 ,-0.171388};
+static float N020[3] = {0.914706 ,-0.378617 ,-0.141290};
+static float N021[3] = {0.950662 ,0.262713 ,-0.164994};
+static float N022[3] = {0.546359 ,0.801460 ,-0.243218};
+static float N023[3] = {-0.315796 ,0.917068 ,-0.243431};
+static float N024[3] = {-0.825687 ,0.532277 ,-0.186875};
+static float N025[3] = {-0.974763 ,-0.155232 ,-0.160435};
+static float N026[3] = {-0.560596 ,-0.816658 ,-0.137119};
+static float N027[3] = {0.380210 ,-0.910817 ,-0.160786};
+static float N028[3] = {0.923772 ,-0.358322 ,-0.135093};
+static float N029[3] = {0.951202 ,0.275053 ,-0.139859};
+static float N030[3] = {0.686099 ,0.702548 ,-0.188932};
+static float N031[3] = {-0.521865 ,0.826719 ,-0.210220};
+static float N032[3] = {-0.923820 ,0.346739 ,-0.162258};
+static float N033[3] = {-0.902095 ,-0.409995 ,-0.134646};
+static float N034[3] = {-0.509115 ,-0.848498 ,-0.144404};
+static float N035[3] = {0.456469 ,-0.880293 ,-0.129305};
+static float N036[3] = {0.873401 ,-0.475489 ,-0.105266};
+static float N037[3] = {0.970825 ,0.179861 ,-0.158584};
+static float N038[3] = {0.675609 ,0.714187 ,-0.183004};
+static float N039[3] = {-0.523574 ,0.830212 ,-0.191360};
+static float N040[3] = {-0.958895 ,0.230808 ,-0.165071};
+static float N041[3] = {-0.918285 ,-0.376803 ,-0.121542};
+static float N042[3] = {-0.622467 ,-0.774167 ,-0.114888};
+static float N043[3] = {0.404497 ,-0.908807 ,-0.102231};
+static float N044[3] = {0.930538 ,-0.365155 ,-0.027588};
+static float N045[3] = {0.921920 ,0.374157 ,-0.100345};
+static float N046[3] = {0.507346 ,0.860739 ,0.041562};
+static float N047[3] = {-0.394646 ,0.918815 ,-0.005730};
+static float N048[3] = {-0.925411 ,0.373024 ,-0.066837};
+static float N049[3] = {-0.945337 ,-0.322309 ,-0.049551};
+static float N050[3] = {-0.660437 ,-0.750557 ,-0.022072};
+static float N051[3] = {0.488835 ,-0.871950 ,-0.027261};
+static float N052[3] = {0.902599 ,-0.421397 ,0.087969};
+static float N053[3] = {0.938636 ,0.322606 ,0.122020};
+static float N054[3] = {0.484605 ,0.871078 ,0.079878};
+static float N055[3] = {-0.353607 ,0.931559 ,0.084619};
+static float N056[3] = {-0.867759 ,0.478564 ,0.134054};
+static float N057[3] = {-0.951583 ,-0.296030 ,0.082794};
+static float N058[3] = {-0.672355 ,-0.730209 ,0.121384};
+static float N059[3] = {0.528336 ,-0.842452 ,0.105525};
+static float N060[3] = {0.786913 ,-0.564760 ,0.248627};
+#if 0
+static float N061[3] = {0.000000 ,1.000000 ,0.000000};
+#endif
+static float N062[3] = {0.622098 ,0.765230 ,0.165584};
+static float N063[3] = {-0.631711 ,0.767816 ,0.106773};
+static float N064[3] = {-0.687886 ,0.606351 ,0.398938};
+static float N065[3] = {-0.946327 ,-0.281623 ,0.158598};
+static float N066[3] = {-0.509549 ,-0.860437 ,0.002776};
+static float N067[3] = {0.462594 ,-0.876692 ,0.131977};
+#if 0
+static float N068[3] = {0.000000 ,-0.992278 ,0.124035};
+static float N069[3] = {0.000000 ,-0.970143 ,-0.242536};
+static float N070[3] = {0.015502 ,0.992159 ,-0.124020};
+#endif
+static float N071[3] = {0.000000 ,1.000000 ,0.000000};
+#if 0
+static float N072[3] = {0.000000 ,1.000000 ,0.000000};
+static float N073[3] = {0.000000 ,1.000000 ,0.000000};
+static float N074[3] = {0.000000 ,-1.000000 ,0.000000};
+static float N075[3] = {-0.242536 ,0.000000 ,-0.970143};
+static float N076[3] = {-0.010336 ,-0.992225 ,-0.124028};
+#endif
+static float N077[3] = {-0.880770 ,0.461448 ,0.106351};
+static float N078[3] = {-0.880770 ,0.461448 ,0.106351};
+static float N079[3] = {-0.880770 ,0.461448 ,0.106351};
+static float N080[3] = {-0.880770 ,0.461448 ,0.106351};
+static float N081[3] = {-0.571197 ,0.816173 ,0.087152};
+static float N082[3] = {-0.880770 ,0.461448 ,0.106351};
+static float N083[3] = {-0.571197 ,0.816173 ,0.087152};
+static float N084[3] = {-0.571197 ,0.816173 ,0.087152};
+static float N085[3] = {-0.880770 ,0.461448 ,0.106351};
+static float N086[3] = {-0.571197 ,0.816173 ,0.087152};
+static float N087[3] = {-0.880770 ,0.461448 ,0.106351};
+static float N088[3] = {-0.880770 ,0.461448 ,0.106351};
+static float N089[3] = {-0.880770 ,0.461448 ,0.106351};
+static float N090[3] = {-0.880770 ,0.461448 ,0.106351};
+static float N091[3] = {0.000000 ,1.000000 ,0.000000};
+static float N092[3] = {0.000000 ,1.000000 ,0.000000};
+static float N093[3] = {0.000000 ,1.000000 ,0.000000};
+static float N094[3] = {1.000000 ,0.000000 ,0.000000};
+static float N095[3] = {-1.000000 ,0.000000 ,0.000000};
+#if 0
+static float N096[3] = {0.000000 ,1.000000 ,0.000000};
+#endif
+static float N097[3] = {-0.697296 ,0.702881 ,0.140491};
+static float N098[3] = {0.918864 ,0.340821 ,0.198819};
+static float N099[3] = {-0.932737 ,0.201195 ,0.299202};
+static float N100[3] = {0.029517 ,0.981679 ,0.188244};
+#if 0
+static float N101[3] = {0.000000 ,1.000000 ,0.000000};
+#endif
+static float N102[3] = {0.813521 ,-0.204936 ,0.544229};
+#if 0
+static float N103[3] = {0.000000 ,1.000000 ,0.000000};
+static float N104[3] = {0.000000 ,1.000000 ,0.000000};
+static float N105[3] = {0.000000 ,1.000000 ,0.000000};
+static float N106[3] = {0.000000 ,1.000000 ,0.000000};
+static float N107[3] = {0.000000 ,1.000000 ,0.000000};
+static float N108[3] = {0.000000 ,1.000000 ,0.000000};
+static float N109[3] = {0.000000 ,1.000000 ,0.000000};
+#endif
+static float N110[3] = {-0.781480 ,-0.384779 ,0.491155};
+static float N111[3] = {-0.722243 ,0.384927 ,0.574627};
+static float N112[3] = {-0.752278 ,0.502679 ,0.425901};
+static float N113[3] = {0.547257 ,0.367910 ,0.751766};
+static float N114[3] = {0.725949 ,-0.232568 ,0.647233};
+static float N115[3] = {-0.747182 ,-0.660786 ,0.071280};
+static float N116[3] = {0.931519 ,0.200748 ,0.303270};
+static float N117[3] = {-0.828928 ,0.313757 ,0.463071};
+static float N118[3] = {0.902554 ,-0.370967 ,0.218587};
+static float N119[3] = {-0.879257 ,-0.441851 ,0.177973};
+static float N120[3] = {0.642327 ,0.611901 ,0.461512};
+static float N121[3] = {0.964817 ,-0.202322 ,0.167910};
+static float N122[3] = {0.000000 ,1.000000 ,0.000000};
+#if 0
+static float N123[3] = {-0.980734 ,0.041447 ,0.190900};
+static float N124[3] = {-0.980734 ,0.041447 ,0.190900};
+static float N125[3] = {-0.980734 ,0.041447 ,0.190900};
+static float N126[3] = {0.000000 ,1.000000 ,0.000000};
+static float N127[3] = {0.000000 ,1.000000 ,0.000000};
+static float N128[3] = {0.000000 ,1.000000 ,0.000000};
+static float N129[3] = {0.963250 ,0.004839 ,0.268565};
+static float N130[3] = {0.963250 ,0.004839 ,0.268565};
+static float N131[3] = {0.963250 ,0.004839 ,0.268565};
+static float N132[3] = {0.000000 ,1.000000 ,0.000000};
+static float N133[3] = {0.000000 ,1.000000 ,0.000000};
+static float N134[3] = {0.000000 ,1.000000 ,0.000000};
+#endif
+static float P001[3] = {5.68, -300.95, 1324.70};
+static float P002[3] = {338.69, -219.63, 9677.03};
+static float P003[3] = {12.18, 474.59, 9138.14};
+#if 0
+static float P004[3] = {-7.49, -388.91, 10896.74};
+#endif
+static float P005[3] = {487.51, 198.05, 9350.78};
+static float P006[3] = {-457.61, 68.74, 9427.85};
+static float P007[3] = {156.52, -266.72, 10311.68};
+static float P008[3] = {-185.56, -266.51, 10310.47};
+static float P009[3] = {124.39, -261.46, 1942.34};
+static float P010[3] = {-130.05, -261.46, 1946.03};
+static float P011[3] = {141.07, -320.11, 1239.38};
+static float P012[3] = {156.48, -360.12, 2073.41};
+static float P013[3] = {162.00, -175.88, 2064.44};
+static float P014[3] = {88.16, -87.72, 2064.02};
+static float P015[3] = {-65.21, -96.13, 2064.02};
+static float P016[3] = {-156.48, -180.96, 2064.44};
+static float P017[3] = {-162.00, -368.93, 2082.39};
+static float P018[3] = {-88.16, -439.22, 2082.39};
+static float P019[3] = {65.21, -440.32, 2083.39};
+static float P020[3] = {246.87, -356.02, 2576.95};
+static float P021[3] = {253.17, -111.15, 2567.15};
+static float P022[3] = {132.34, 51.41, 2559.84};
+static float P023[3] = {-97.88, 40.44, 2567.15};
+static float P024[3] = {-222.97, -117.49, 2567.15};
+static float P025[3] = {-252.22, -371.53, 2569.92};
+static float P026[3] = {-108.44, -518.19, 2586.75};
+static float P027[3] = {97.88, -524.79, 2586.75};
+static float P028[3] = {370.03, -421.19, 3419.70};
+static float P029[3] = {351.15, -16.98, 3423.17};
+static float P030[3] = {200.66, 248.46, 3430.37};
+static float P031[3] = {-148.42, 235.02, 3417.91};
+static float P032[3] = {-360.21, -30.27, 3416.84};
+static float P033[3] = {-357.90, -414.89, 3407.04};
+static float P034[3] = {-148.88, -631.35, 3409.90};
+static float P035[3] = {156.38, -632.59, 3419.70};
+static float P036[3] = {462.61, -469.21, 4431.51};
+static float P037[3] = {466.60, 102.25, 4434.98};
+static float P038[3] = {243.05, 474.34, 4562.02};
+static float P039[3] = {-191.23, 474.40, 4554.42};
+static float P040[3] = {-476.12, 111.05, 4451.11};
+static float P041[3] = {-473.36, -470.74, 4444.78};
+static float P042[3] = {-266.95, -748.41, 4447.78};
+static float P043[3] = {211.14, -749.91, 4429.73};
+static float P044[3] = {680.57, -370.27, 5943.46};
+static float P045[3] = {834.01, 363.09, 6360.63};
+static float P046[3] = {371.29, 804.51, 6486.26};
+static float P047[3] = {-291.43, 797.22, 6494.28};
+static float P048[3] = {-784.13, 370.75, 6378.01};
+static float P049[3] = {-743.29, -325.82, 5943.46};
+static float P050[3] = {-383.24, -804.77, 5943.46};
+static float P051[3] = {283.47, -846.09, 5943.46};
+static float iP001[3] = {5.68, -300.95, 1324.70};
+#if 0
+static float iP002[3] = {338.69, -219.63, 9677.03};
+static float iP003[3] = {12.18, 624.93, 8956.39};
+static float iP004[3] = {-7.49, -388.91, 10896.74};
+static float iP005[3] = {487.51, 198.05, 9350.78};
+static float iP006[3] = {-457.61, 199.04, 9353.01};
+static float iP007[3] = {156.52, -266.72, 10311.68};
+static float iP008[3] = {-185.56, -266.51, 10310.47};
+#endif
+static float iP009[3] = {124.39, -261.46, 1942.34};
+static float iP010[3] = {-130.05, -261.46, 1946.03};
+static float iP011[3] = {141.07, -320.11, 1239.38};
+static float iP012[3] = {156.48, -360.12, 2073.41};
+static float iP013[3] = {162.00, -175.88, 2064.44};
+static float iP014[3] = {88.16, -87.72, 2064.02};
+static float iP015[3] = {-65.21, -96.13, 2064.02};
+static float iP016[3] = {-156.48, -180.96, 2064.44};
+static float iP017[3] = {-162.00, -368.93, 2082.39};
+static float iP018[3] = {-88.16, -439.22, 2082.39};
+static float iP019[3] = {65.21, -440.32, 2083.39};
+static float iP020[3] = {246.87, -356.02, 2576.95};
+static float iP021[3] = {253.17, -111.15, 2567.15};
+static float iP022[3] = {132.34, 51.41, 2559.84};
+static float iP023[3] = {-97.88, 40.44, 2567.15};
+static float iP024[3] = {-222.97, -117.49, 2567.15};
+static float iP025[3] = {-252.22, -371.53, 2569.92};
+static float iP026[3] = {-108.44, -518.19, 2586.75};
+static float iP027[3] = {97.88, -524.79, 2586.75};
+static float iP028[3] = {370.03, -421.19, 3419.70};
+static float iP029[3] = {351.15, -16.98, 3423.17};
+static float iP030[3] = {200.66, 248.46, 3430.37};
+static float iP031[3] = {-148.42, 235.02, 3417.91};
+static float iP032[3] = {-360.21, -30.27, 3416.84};
+static float iP033[3] = {-357.90, -414.89, 3407.04};
+static float iP034[3] = {-148.88, -631.35, 3409.90};
+static float iP035[3] = {156.38, -632.59, 3419.70};
+static float iP036[3] = {462.61, -469.21, 4431.51};
+static float iP037[3] = {466.60, 102.25, 4434.98};
+static float iP038[3] = {243.05, 474.34, 4562.02};
+static float iP039[3] = {-191.23, 474.40, 4554.42};
+static float iP040[3] = {-476.12, 111.05, 4451.11};
+static float iP041[3] = {-473.36, -470.74, 4444.78};
+static float iP042[3] = {-266.95, -748.41, 4447.78};
+static float iP043[3] = {211.14, -749.91, 4429.73};
+static float iP044[3] = {680.57, -370.27, 5943.46};
+static float iP045[3] = {834.01, 363.09, 6360.63};
+static float iP046[3] = {371.29, 804.51, 6486.26};
+static float iP047[3] = {-291.43, 797.22, 6494.28};
+static float iP048[3] = {-784.13, 370.75, 6378.01};
+static float iP049[3] = {-743.29, -325.82, 5943.46};
+static float iP050[3] = {-383.24, -804.77, 5943.46};
+static float iP051[3] = {283.47, -846.09, 5943.46};
+static float P052[3] = {599.09, -300.15, 7894.03};
+static float P053[3] = {735.48, 306.26, 7911.92};
+static float P054[3] = {246.22, 558.53, 8460.50};
+static float P055[3] = {-230.41, 559.84, 8473.23};
+static float P056[3] = {-698.66, 320.83, 7902.59};
+static float P057[3] = {-643.29, -299.16, 7902.59};
+static float P058[3] = {-341.47, -719.30, 7902.59};
+static float P059[3] = {252.57, -756.12, 7902.59};
+static float P060[3] = {458.39, -265.31, 9355.44};
+#if 0
+static float P061[3] = {433.38, -161.90, 9503.03};
+#endif
+static float P062[3] = {224.04, 338.75, 9450.30};
+static float P063[3] = {-165.71, 341.04, 9462.35};
+static float P064[3] = {-298.11, 110.13, 10180.37};
+static float P065[3] = {-473.99, -219.71, 9355.44};
+static float P066[3] = {-211.97, -479.87, 9355.44};
+static float P067[3] = {192.86, -491.45, 9348.73};
+static float P068[3] = {-136.29, -319.84, 1228.73};
+static float P069[3] = {1111.17, -314.14, 1314.19};
+static float P070[3] = {-1167.34, -321.61, 1319.45};
+static float P071[3] = {1404.86, -306.66, 1235.45};
+static float P072[3] = {-1409.73, -314.14, 1247.66};
+static float P073[3] = {1254.01, -296.87, 1544.58};
+static float P074[3] = {-1262.09, -291.70, 1504.26};
+static float P075[3] = {965.71, -269.26, 1742.65};
+static float P076[3] = {-900.97, -276.74, 1726.07};
+static float iP068[3] = {-136.29, -319.84, 1228.73};
+static float iP069[3] = {1111.17, -314.14, 1314.19};
+static float iP070[3] = {-1167.34, -321.61, 1319.45};
+static float iP071[3] = {1404.86, -306.66, 1235.45};
+static float iP072[3] = {-1409.73, -314.14, 1247.66};
+static float iP073[3] = {1254.01, -296.87, 1544.58};
+static float iP074[3] = {-1262.09, -291.70, 1504.26};
+static float iP075[3] = {965.71, -269.26, 1742.65};
+static float iP076[3] = {-900.97, -276.74, 1726.07};
+static float P077[3] = {1058.00, -448.81, 8194.66};
+static float P078[3] = {-1016.51, -456.43, 8190.62};
+static float P079[3] = {-1515.96, -676.45, 7754.93};
+static float P080[3] = {1856.75, -830.34, 7296.56};
+static float P081[3] = {1472.16, -497.38, 7399.68};
+static float P082[3] = {-1775.26, -829.51, 7298.46};
+static float P083[3] = {911.09, -252.51, 7510.99};
+static float P084[3] = {-1451.94, -495.62, 7384.30};
+static float P085[3] = {1598.75, -669.26, 7769.90};
+static float P086[3] = {-836.53, -250.08, 7463.25};
+static float P087[3] = {722.87, -158.18, 8006.41};
+static float P088[3] = {-688.86, -162.28, 7993.89};
+static float P089[3] = {-626.92, -185.30, 8364.98};
+static float P090[3] = {647.72, -189.46, 8354.99};
+static float P091[3] = {0.00, 835.01, 5555.62};
+static float P092[3] = {0.00, 1350.18, 5220.86};
+static float P093[3] = {0.00, 1422.94, 5285.27};
+static float P094[3] = {0.00, 1296.75, 5650.19};
+static float P095[3] = {0.00, 795.63, 6493.88};
+static float iP091[3] = {0.00, 835.01, 5555.62};
+static float iP092[3] = {0.00, 1350.18, 5220.86};
+static float iP093[3] = {0.00, 1422.94, 5285.27};
+static float iP094[3] = {0.00, 1296.75, 5650.19};
+static float iP095[3] = {0.00, 795.63, 6493.88};
+#if 0
+static float P096[3] = {-447.38, -165.99, 9499.60};
+#endif
+static float P097[3] = {-194.91, -357.14, 10313.32};
+static float P098[3] = {135.35, -357.66, 10307.94};
+static float iP097[3] = {-194.91, -357.14, 10313.32};
+static float iP098[3] = {135.35, -357.66, 10307.94};
+static float P099[3] = {-380.53, -221.14, 9677.98};
+static float P100[3] = {0.00, 412.99, 9629.33};
+#if 0
+static float P101[3] = {5.70, 567.00, 7862.98};
+#endif
+static float P102[3] = {59.51, -412.55, 10677.58};
+static float iP102[3] = {59.51, -412.55, 10677.58};
+static float P103[3] = {6.50, 484.74, 9009.94};
+#if 0
+static float P104[3] = {-9.86, 567.62, 7858.65};
+#endif
+static float P105[3] = {-41.86, 476.51, 9078.17};
+#if 0
+static float P106[3] = {22.75, 568.13, 7782.83};
+static float P107[3] = {58.93, 568.42, 7775.94};
+#endif
+static float P108[3] = {49.20, 476.83, 9078.24};
+#if 0
+static float P109[3] = {99.21, 566.00, 7858.65};
+#endif
+static float P110[3] = {-187.62, -410.04, 10674.12};
+static float iP110[3] = {-187.62, -410.04, 10674.12};
+static float P111[3] = {-184.25, -318.70, 10723.88};
+static float iP111[3] = {-184.25, -318.70, 10723.88};
+static float P112[3] = {-179.61, -142.81, 10670.26};
+static float P113[3] = {57.43, -147.94, 10675.26};
+static float P114[3] = {54.06, -218.90, 10712.44};
+static float P115[3] = {-186.35, -212.09, 10713.76};
+static float P116[3] = {205.90, -84.61, 10275.97};
+static float P117[3] = {-230.96, -83.26, 10280.09};
+static float iP118[3] = {216.78, -509.17, 10098.94};
+static float iP119[3] = {-313.21, -510.79, 10102.62};
+static float P118[3] = {216.78, -509.17, 10098.94};
+static float P119[3] = {-313.21, -510.79, 10102.62};
+static float P120[3] = {217.95, 96.34, 10161.62};
+static float P121[3] = {71.99, -319.74, 10717.70};
+static float iP121[3] = {71.99, -319.74, 10717.70};
+static float P122[3] = {0.00, 602.74, 5375.84};
+static float iP122[3] = {0.00, 602.74, 5375.84};
+static float P123[3] = {-448.94, -203.14, 9499.60};
+static float P124[3] = {-442.64, -185.20, 9528.07};
+static float P125[3] = {-441.07, -148.05, 9528.07};
+static float P126[3] = {-443.43, -128.84, 9499.60};
+static float P127[3] = {-456.87, -146.78, 9466.67};
+static float P128[3] = {-453.68, -183.93, 9466.67};
+static float P129[3] = {428.43, -124.08, 9503.03};
+static float P130[3] = {419.73, -142.14, 9534.56};
+static float P131[3] = {419.92, -179.96, 9534.56};
+static float P132[3] = {431.20, -199.73, 9505.26};
+static float P133[3] = {442.28, -181.67, 9475.96};
+static float P134[3] = {442.08, -143.84, 9475.96};
+/* *INDENT-ON* */
+
+
+
+static void
+Dolphin001(GLenum cap)
+{
+       glNormal3fv(N071);
+       glBegin(cap);
+       glVertex3fv(P001);
+       glVertex3fv(P068);
+       glVertex3fv(P010);
+       glEnd();
+       glBegin(cap);
+       glVertex3fv(P068);
+       glVertex3fv(P076);
+       glVertex3fv(P010);
+       glEnd();
+       glBegin(cap);
+       glVertex3fv(P068);
+       glVertex3fv(P070);
+       glVertex3fv(P076);
+       glEnd();
+       glBegin(cap);
+       glVertex3fv(P076);
+       glVertex3fv(P070);
+       glVertex3fv(P074);
+       glEnd();
+       glBegin(cap);
+       glVertex3fv(P070);
+       glVertex3fv(P072);
+       glVertex3fv(P074);
+       glEnd();
+       glNormal3fv(N119);
+       glBegin(cap);
+       glVertex3fv(P072);
+       glVertex3fv(P070);
+       glVertex3fv(P074);
+       glEnd();
+       glBegin(cap);
+       glVertex3fv(P074);
+       glVertex3fv(P070);
+       glVertex3fv(P076);
+       glEnd();
+       glBegin(cap);
+       glVertex3fv(P070);
+       glVertex3fv(P068);
+       glVertex3fv(P076);
+       glEnd();
+       glBegin(cap);
+       glVertex3fv(P076);
+       glVertex3fv(P068);
+       glVertex3fv(P010);
+       glEnd();
+       glBegin(cap);
+       glVertex3fv(P068);
+       glVertex3fv(P001);
+       glVertex3fv(P010);
+       glEnd();
+}
+
+static void
+Dolphin002(GLenum cap)
+{
+       glNormal3fv(N071);
+       glBegin(cap);
+       glVertex3fv(P011);
+       glVertex3fv(P001);
+       glVertex3fv(P009);
+       glEnd();
+       glBegin(cap);
+       glVertex3fv(P075);
+       glVertex3fv(P011);
+       glVertex3fv(P009);
+       glEnd();
+       glBegin(cap);
+       glVertex3fv(P069);
+       glVertex3fv(P011);
+       glVertex3fv(P075);
+       glEnd();
+       glBegin(cap);
+       glVertex3fv(P069);
+       glVertex3fv(P075);
+       glVertex3fv(P073);
+       glEnd();
+       glBegin(cap);
+       glVertex3fv(P071);
+       glVertex3fv(P069);
+       glVertex3fv(P073);
+       glEnd();
+       glNormal3fv(N119);
+       glBegin(cap);
+       glVertex3fv(P001);
+       glVertex3fv(P011);
+       glVertex3fv(P009);
+       glEnd();
+       glBegin(cap);
+       glVertex3fv(P009);
+       glVertex3fv(P011);
+       glVertex3fv(P075);
+       glEnd();
+       glBegin(cap);
+       glVertex3fv(P011);
+       glVertex3fv(P069);
+       glVertex3fv(P075);
+       glEnd();
+       glBegin(cap);
+       glVertex3fv(P069);
+       glVertex3fv(P073);
+       glVertex3fv(P075);
+       glEnd();
+       glBegin(cap);
+       glVertex3fv(P069);
+       glVertex3fv(P071);
+       glVertex3fv(P073);
+       glEnd();
+}
+
+static void
+Dolphin003(GLenum cap)
+{
+       glBegin(cap);
+       glNormal3fv(N018);
+       glVertex3fv(P018);
+       glNormal3fv(N001);
+       glVertex3fv(P001);
+       glNormal3fv(N019);
+       glVertex3fv(P019);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N019);
+       glVertex3fv(P019);
+       glNormal3fv(N001);
+       glVertex3fv(P001);
+       glNormal3fv(N012);
+       glVertex3fv(P012);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N017);
+       glVertex3fv(P017);
+       glNormal3fv(N001);
+       glVertex3fv(P001);
+       glNormal3fv(N018);
+       glVertex3fv(P018);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N001);
+       glVertex3fv(P001);
+       glNormal3fv(N017);
+       glVertex3fv(P017);
+       glNormal3fv(N016);
+       glVertex3fv(P016);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N001);
+       glVertex3fv(P001);
+       glNormal3fv(N013);
+       glVertex3fv(P013);
+       glNormal3fv(N012);
+       glVertex3fv(P012);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N001);
+       glVertex3fv(P001);
+       glNormal3fv(N016);
+       glVertex3fv(P016);
+       glNormal3fv(N015);
+       glVertex3fv(P015);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N001);
+       glVertex3fv(P001);
+       glNormal3fv(N014);
+       glVertex3fv(P014);
+       glNormal3fv(N013);
+       glVertex3fv(P013);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N001);
+       glVertex3fv(P001);
+       glNormal3fv(N015);
+       glVertex3fv(P015);
+       glNormal3fv(N014);
+       glVertex3fv(P014);
+       glEnd();
+}
+
+static void
+Dolphin004(GLenum cap)
+{
+       glBegin(cap);
+       glNormal3fv(N014);
+       glVertex3fv(P014);
+       glNormal3fv(N015);
+       glVertex3fv(P015);
+       glNormal3fv(N023);
+       glVertex3fv(P023);
+       glNormal3fv(N022);
+       glVertex3fv(P022);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N015);
+       glVertex3fv(P015);
+       glNormal3fv(N016);
+       glVertex3fv(P016);
+       glNormal3fv(N024);
+       glVertex3fv(P024);
+       glNormal3fv(N023);
+       glVertex3fv(P023);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N016);
+       glVertex3fv(P016);
+       glNormal3fv(N017);
+       glVertex3fv(P017);
+       glNormal3fv(N025);
+       glVertex3fv(P025);
+       glNormal3fv(N024);
+       glVertex3fv(P024);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N017);
+       glVertex3fv(P017);
+       glNormal3fv(N018);
+       glVertex3fv(P018);
+       glNormal3fv(N026);
+       glVertex3fv(P026);
+       glNormal3fv(N025);
+       glVertex3fv(P025);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N013);
+       glVertex3fv(P013);
+       glNormal3fv(N014);
+       glVertex3fv(P014);
+       glNormal3fv(N022);
+       glVertex3fv(P022);
+       glNormal3fv(N021);
+       glVertex3fv(P021);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N012);
+       glVertex3fv(P012);
+       glNormal3fv(N013);
+       glVertex3fv(P013);
+       glNormal3fv(N021);
+       glVertex3fv(P021);
+       glNormal3fv(N020);
+       glVertex3fv(P020);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N018);
+       glVertex3fv(P018);
+       glNormal3fv(N019);
+       glVertex3fv(P019);
+       glNormal3fv(N027);
+       glVertex3fv(P027);
+       glNormal3fv(N026);
+       glVertex3fv(P026);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N019);
+       glVertex3fv(P019);
+       glNormal3fv(N012);
+       glVertex3fv(P012);
+       glNormal3fv(N020);
+       glVertex3fv(P020);
+       glNormal3fv(N027);
+       glVertex3fv(P027);
+       glEnd();
+}
+
+static void
+Dolphin005(GLenum cap)
+{
+       glBegin(cap);
+       glNormal3fv(N022);
+       glVertex3fv(P022);
+       glNormal3fv(N023);
+       glVertex3fv(P023);
+       glNormal3fv(N031);
+       glVertex3fv(P031);
+       glNormal3fv(N030);
+       glVertex3fv(P030);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N021);
+       glVertex3fv(P021);
+       glNormal3fv(N022);
+       glVertex3fv(P022);
+       glNormal3fv(N030);
+       glVertex3fv(P030);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N021);
+       glVertex3fv(P021);
+       glNormal3fv(N030);
+       glVertex3fv(P030);
+       glNormal3fv(N029);
+       glVertex3fv(P029);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N023);
+       glVertex3fv(P023);
+       glNormal3fv(N024);
+       glVertex3fv(P024);
+       glNormal3fv(N031);
+       glVertex3fv(P031);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N024);
+       glVertex3fv(P024);
+       glNormal3fv(N032);
+       glVertex3fv(P032);
+       glNormal3fv(N031);
+       glVertex3fv(P031);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N024);
+       glVertex3fv(P024);
+       glNormal3fv(N025);
+       glVertex3fv(P025);
+       glNormal3fv(N032);
+       glVertex3fv(P032);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N025);
+       glVertex3fv(P025);
+       glNormal3fv(N033);
+       glVertex3fv(P033);
+       glNormal3fv(N032);
+       glVertex3fv(P032);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N020);
+       glVertex3fv(P020);
+       glNormal3fv(N021);
+       glVertex3fv(P021);
+       glNormal3fv(N029);
+       glVertex3fv(P029);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N020);
+       glVertex3fv(P020);
+       glNormal3fv(N029);
+       glVertex3fv(P029);
+       glNormal3fv(N028);
+       glVertex3fv(P028);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N027);
+       glVertex3fv(P027);
+       glNormal3fv(N020);
+       glVertex3fv(P020);
+       glNormal3fv(N028);
+       glVertex3fv(P028);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N027);
+       glVertex3fv(P027);
+       glNormal3fv(N028);
+       glVertex3fv(P028);
+       glNormal3fv(N035);
+       glVertex3fv(P035);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N025);
+       glVertex3fv(P025);
+       glNormal3fv(N026);
+       glVertex3fv(P026);
+       glNormal3fv(N033);
+       glVertex3fv(P033);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N033);
+       glVertex3fv(P033);
+       glNormal3fv(N026);
+       glVertex3fv(P026);
+       glNormal3fv(N034);
+       glVertex3fv(P034);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N026);
+       glVertex3fv(P026);
+       glNormal3fv(N027);
+       glVertex3fv(P027);
+       glNormal3fv(N035);
+       glVertex3fv(P035);
+       glNormal3fv(N034);
+       glVertex3fv(P034);
+       glEnd();
+}
+
+static void
+Dolphin006(GLenum cap)
+{
+       glBegin(cap);
+       glNormal3fv(N092);
+       glVertex3fv(P092);
+       glNormal3fv(N093);
+       glVertex3fv(P093);
+       glNormal3fv(N094);
+       glVertex3fv(P094);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N093);
+       glVertex3fv(P093);
+       glNormal3fv(N092);
+       glVertex3fv(P092);
+       glNormal3fv(N094);
+       glVertex3fv(P094);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N092);
+       glVertex3fv(P092);
+       glNormal3fv(N091);
+       glVertex3fv(P091);
+       glNormal3fv(N095);
+       glVertex3fv(P095);
+       glNormal3fv(N094);
+       glVertex3fv(P094);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N091);
+       glVertex3fv(P091);
+       glNormal3fv(N092);
+       glVertex3fv(P092);
+       glNormal3fv(N094);
+       glVertex3fv(P094);
+       glNormal3fv(N095);
+       glVertex3fv(P095);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N122);
+       glVertex3fv(P122);
+       glNormal3fv(N095);
+       glVertex3fv(P095);
+       glNormal3fv(N091);
+       glVertex3fv(P091);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N122);
+       glVertex3fv(P122);
+       glNormal3fv(N091);
+       glVertex3fv(P091);
+       glNormal3fv(N095);
+       glVertex3fv(P095);
+       glEnd();
+}
+
+static void
+Dolphin007(GLenum cap)
+{
+       glBegin(cap);
+       glNormal3fv(N030);
+       glVertex3fv(P030);
+       glNormal3fv(N031);
+       glVertex3fv(P031);
+       glNormal3fv(N039);
+       glVertex3fv(P039);
+       glNormal3fv(N038);
+       glVertex3fv(P038);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N029);
+       glVertex3fv(P029);
+       glNormal3fv(N030);
+       glVertex3fv(P030);
+       glNormal3fv(N038);
+       glVertex3fv(P038);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N029);
+       glVertex3fv(P029);
+       glNormal3fv(N038);
+       glVertex3fv(P038);
+       glNormal3fv(N037);
+       glVertex3fv(P037);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N028);
+       glVertex3fv(P028);
+       glNormal3fv(N029);
+       glVertex3fv(P029);
+       glNormal3fv(N037);
+       glVertex3fv(P037);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N028);
+       glVertex3fv(P028);
+       glNormal3fv(N037);
+       glVertex3fv(P037);
+       glNormal3fv(N036);
+       glVertex3fv(P036);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N035);
+       glVertex3fv(P035);
+       glNormal3fv(N028);
+       glVertex3fv(P028);
+       glNormal3fv(N036);
+       glVertex3fv(P036);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N035);
+       glVertex3fv(P035);
+       glNormal3fv(N036);
+       glVertex3fv(P036);
+       glNormal3fv(N043);
+       glVertex3fv(P043);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N034);
+       glVertex3fv(P034);
+       glNormal3fv(N035);
+       glVertex3fv(P035);
+       glNormal3fv(N043);
+       glVertex3fv(P043);
+       glNormal3fv(N042);
+       glVertex3fv(P042);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N033);
+       glVertex3fv(P033);
+       glNormal3fv(N034);
+       glVertex3fv(P034);
+       glNormal3fv(N042);
+       glVertex3fv(P042);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N033);
+       glVertex3fv(P033);
+       glNormal3fv(N042);
+       glVertex3fv(P042);
+       glNormal3fv(N041);
+       glVertex3fv(P041);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N031);
+       glVertex3fv(P031);
+       glNormal3fv(N032);
+       glVertex3fv(P032);
+       glNormal3fv(N039);
+       glVertex3fv(P039);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N039);
+       glVertex3fv(P039);
+       glNormal3fv(N032);
+       glVertex3fv(P032);
+       glNormal3fv(N040);
+       glVertex3fv(P040);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N032);
+       glVertex3fv(P032);
+       glNormal3fv(N033);
+       glVertex3fv(P033);
+       glNormal3fv(N040);
+       glVertex3fv(P040);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N040);
+       glVertex3fv(P040);
+       glNormal3fv(N033);
+       glVertex3fv(P033);
+       glNormal3fv(N041);
+       glVertex3fv(P041);
+       glEnd();
+}
+
+static void
+Dolphin008(GLenum cap)
+{
+       glBegin(cap);
+       glNormal3fv(N042);
+       glVertex3fv(P042);
+       glNormal3fv(N043);
+       glVertex3fv(P043);
+       glNormal3fv(N051);
+       glVertex3fv(P051);
+       glNormal3fv(N050);
+       glVertex3fv(P050);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N043);
+       glVertex3fv(P043);
+       glNormal3fv(N036);
+       glVertex3fv(P036);
+       glNormal3fv(N051);
+       glVertex3fv(P051);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N051);
+       glVertex3fv(P051);
+       glNormal3fv(N036);
+       glVertex3fv(P036);
+       glNormal3fv(N044);
+       glVertex3fv(P044);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N041);
+       glVertex3fv(P041);
+       glNormal3fv(N042);
+       glVertex3fv(P042);
+       glNormal3fv(N050);
+       glVertex3fv(P050);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N041);
+       glVertex3fv(P041);
+       glNormal3fv(N050);
+       glVertex3fv(P050);
+       glNormal3fv(N049);
+       glVertex3fv(P049);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N036);
+       glVertex3fv(P036);
+       glNormal3fv(N037);
+       glVertex3fv(P037);
+       glNormal3fv(N044);
+       glVertex3fv(P044);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N044);
+       glVertex3fv(P044);
+       glNormal3fv(N037);
+       glVertex3fv(P037);
+       glNormal3fv(N045);
+       glVertex3fv(P045);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N040);
+       glVertex3fv(P040);
+       glNormal3fv(N041);
+       glVertex3fv(P041);
+       glNormal3fv(N049);
+       glVertex3fv(P049);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N040);
+       glVertex3fv(P040);
+       glNormal3fv(N049);
+       glVertex3fv(P049);
+       glNormal3fv(N048);
+       glVertex3fv(P048);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N039);
+       glVertex3fv(P039);
+       glNormal3fv(N040);
+       glVertex3fv(P040);
+       glNormal3fv(N048);
+       glVertex3fv(P048);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N039);
+       glVertex3fv(P039);
+       glNormal3fv(N048);
+       glVertex3fv(P048);
+       glNormal3fv(N047);
+       glVertex3fv(P047);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N037);
+       glVertex3fv(P037);
+       glNormal3fv(N038);
+       glVertex3fv(P038);
+       glNormal3fv(N045);
+       glVertex3fv(P045);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N038);
+       glVertex3fv(P038);
+       glNormal3fv(N046);
+       glVertex3fv(P046);
+       glNormal3fv(N045);
+       glVertex3fv(P045);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N038);
+       glVertex3fv(P038);
+       glNormal3fv(N039);
+       glVertex3fv(P039);
+       glNormal3fv(N047);
+       glVertex3fv(P047);
+       glNormal3fv(N046);
+       glVertex3fv(P046);
+       glEnd();
+}
+
+static void
+Dolphin009(GLenum cap)
+{
+       glBegin(cap);
+       glNormal3fv(N050);
+       glVertex3fv(P050);
+       glNormal3fv(N051);
+       glVertex3fv(P051);
+       glNormal3fv(N059);
+       glVertex3fv(P059);
+       glNormal3fv(N058);
+       glVertex3fv(P058);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N051);
+       glVertex3fv(P051);
+       glNormal3fv(N044);
+       glVertex3fv(P044);
+       glNormal3fv(N059);
+       glVertex3fv(P059);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N059);
+       glVertex3fv(P059);
+       glNormal3fv(N044);
+       glVertex3fv(P044);
+       glNormal3fv(N052);
+       glVertex3fv(P052);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N044);
+       glVertex3fv(P044);
+       glNormal3fv(N045);
+       glVertex3fv(P045);
+       glNormal3fv(N053);
+       glVertex3fv(P053);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N044);
+       glVertex3fv(P044);
+       glNormal3fv(N053);
+       glVertex3fv(P053);
+       glNormal3fv(N052);
+       glVertex3fv(P052);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N049);
+       glVertex3fv(P049);
+       glNormal3fv(N050);
+       glVertex3fv(P050);
+       glNormal3fv(N058);
+       glVertex3fv(P058);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N049);
+       glVertex3fv(P049);
+       glNormal3fv(N058);
+       glVertex3fv(P058);
+       glNormal3fv(N057);
+       glVertex3fv(P057);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N048);
+       glVertex3fv(P048);
+       glNormal3fv(N049);
+       glVertex3fv(P049);
+       glNormal3fv(N057);
+       glVertex3fv(P057);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N048);
+       glVertex3fv(P048);
+       glNormal3fv(N057);
+       glVertex3fv(P057);
+       glNormal3fv(N056);
+       glVertex3fv(P056);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N047);
+       glVertex3fv(P047);
+       glNormal3fv(N048);
+       glVertex3fv(P048);
+       glNormal3fv(N056);
+       glVertex3fv(P056);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N047);
+       glVertex3fv(P047);
+       glNormal3fv(N056);
+       glVertex3fv(P056);
+       glNormal3fv(N055);
+       glVertex3fv(P055);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N045);
+       glVertex3fv(P045);
+       glNormal3fv(N046);
+       glVertex3fv(P046);
+       glNormal3fv(N053);
+       glVertex3fv(P053);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N046);
+       glVertex3fv(P046);
+       glNormal3fv(N054);
+       glVertex3fv(P054);
+       glNormal3fv(N053);
+       glVertex3fv(P053);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N046);
+       glVertex3fv(P046);
+       glNormal3fv(N047);
+       glVertex3fv(P047);
+       glNormal3fv(N055);
+       glVertex3fv(P055);
+       glNormal3fv(N054);
+       glVertex3fv(P054);
+       glEnd();
+}
+
+static void
+Dolphin010(GLenum cap)
+{
+       glBegin(cap);
+       glNormal3fv(N080);
+       glVertex3fv(P080);
+       glNormal3fv(N081);
+       glVertex3fv(P081);
+       glNormal3fv(N085);
+       glVertex3fv(P085);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N081);
+       glVertex3fv(P081);
+       glNormal3fv(N083);
+       glVertex3fv(P083);
+       glNormal3fv(N085);
+       glVertex3fv(P085);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N085);
+       glVertex3fv(P085);
+       glNormal3fv(N083);
+       glVertex3fv(P083);
+       glNormal3fv(N077);
+       glVertex3fv(P077);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N083);
+       glVertex3fv(P083);
+       glNormal3fv(N087);
+       glVertex3fv(P087);
+       glNormal3fv(N077);
+       glVertex3fv(P077);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N077);
+       glVertex3fv(P077);
+       glNormal3fv(N087);
+       glVertex3fv(P087);
+       glNormal3fv(N090);
+       glVertex3fv(P090);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N081);
+       glVertex3fv(P081);
+       glNormal3fv(N080);
+       glVertex3fv(P080);
+       glNormal3fv(N085);
+       glVertex3fv(P085);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N083);
+       glVertex3fv(P083);
+       glNormal3fv(N081);
+       glVertex3fv(P081);
+       glNormal3fv(N085);
+       glVertex3fv(P085);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N083);
+       glVertex3fv(P083);
+       glNormal3fv(N085);
+       glVertex3fv(P085);
+       glNormal3fv(N077);
+       glVertex3fv(P077);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N087);
+       glVertex3fv(P087);
+       glNormal3fv(N083);
+       glVertex3fv(P083);
+       glNormal3fv(N077);
+       glVertex3fv(P077);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N087);
+       glVertex3fv(P087);
+       glNormal3fv(N077);
+       glVertex3fv(P077);
+       glNormal3fv(N090);
+       glVertex3fv(P090);
+       glEnd();
+}
+
+static void
+Dolphin011(GLenum cap)
+{
+       glBegin(cap);
+       glNormal3fv(N082);
+       glVertex3fv(P082);
+       glNormal3fv(N084);
+       glVertex3fv(P084);
+       glNormal3fv(N079);
+       glVertex3fv(P079);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N084);
+       glVertex3fv(P084);
+       glNormal3fv(N086);
+       glVertex3fv(P086);
+       glNormal3fv(N079);
+       glVertex3fv(P079);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N079);
+       glVertex3fv(P079);
+       glNormal3fv(N086);
+       glVertex3fv(P086);
+       glNormal3fv(N078);
+       glVertex3fv(P078);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N086);
+       glVertex3fv(P086);
+       glNormal3fv(N088);
+       glVertex3fv(P088);
+       glNormal3fv(N078);
+       glVertex3fv(P078);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N078);
+       glVertex3fv(P078);
+       glNormal3fv(N088);
+       glVertex3fv(P088);
+       glNormal3fv(N089);
+       glVertex3fv(P089);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N088);
+       glVertex3fv(P088);
+       glNormal3fv(N086);
+       glVertex3fv(P086);
+       glNormal3fv(N089);
+       glVertex3fv(P089);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N089);
+       glVertex3fv(P089);
+       glNormal3fv(N086);
+       glVertex3fv(P086);
+       glNormal3fv(N078);
+       glVertex3fv(P078);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N086);
+       glVertex3fv(P086);
+       glNormal3fv(N084);
+       glVertex3fv(P084);
+       glNormal3fv(N078);
+       glVertex3fv(P078);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N078);
+       glVertex3fv(P078);
+       glNormal3fv(N084);
+       glVertex3fv(P084);
+       glNormal3fv(N079);
+       glVertex3fv(P079);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N084);
+       glVertex3fv(P084);
+       glNormal3fv(N082);
+       glVertex3fv(P082);
+       glNormal3fv(N079);
+       glVertex3fv(P079);
+       glEnd();
+}
+
+static void
+Dolphin012(GLenum cap)
+{
+       glBegin(cap);
+       glNormal3fv(N058);
+       glVertex3fv(P058);
+       glNormal3fv(N059);
+       glVertex3fv(P059);
+       glNormal3fv(N067);
+       glVertex3fv(P067);
+       glNormal3fv(N066);
+       glVertex3fv(P066);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N059);
+       glVertex3fv(P059);
+       glNormal3fv(N052);
+       glVertex3fv(P052);
+       glNormal3fv(N060);
+       glVertex3fv(P060);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N059);
+       glVertex3fv(P059);
+       glNormal3fv(N060);
+       glVertex3fv(P060);
+       glNormal3fv(N067);
+       glVertex3fv(P067);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N058);
+       glVertex3fv(P058);
+       glNormal3fv(N066);
+       glVertex3fv(P066);
+       glNormal3fv(N065);
+       glVertex3fv(P065);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N058);
+       glVertex3fv(P058);
+       glNormal3fv(N065);
+       glVertex3fv(P065);
+       glNormal3fv(N057);
+       glVertex3fv(P057);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N056);
+       glVertex3fv(P056);
+       glNormal3fv(N057);
+       glVertex3fv(P057);
+       glNormal3fv(N065);
+       glVertex3fv(P065);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N056);
+       glVertex3fv(P056);
+       glNormal3fv(N065);
+       glVertex3fv(P065);
+       glNormal3fv(N006);
+       glVertex3fv(P006);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N056);
+       glVertex3fv(P056);
+       glNormal3fv(N006);
+       glVertex3fv(P006);
+       glNormal3fv(N063);
+       glVertex3fv(P063);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N056);
+       glVertex3fv(P056);
+       glNormal3fv(N063);
+       glVertex3fv(P063);
+       glNormal3fv(N055);
+       glVertex3fv(P055);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N054);
+       glVertex3fv(P054);
+       glNormal3fv(N062);
+       glVertex3fv(P062);
+       glNormal3fv(N005);
+       glVertex3fv(P005);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N054);
+       glVertex3fv(P054);
+       glNormal3fv(N005);
+       glVertex3fv(P005);
+       glNormal3fv(N053);
+       glVertex3fv(P053);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N052);
+       glVertex3fv(P052);
+       glNormal3fv(N053);
+       glVertex3fv(P053);
+       glNormal3fv(N005);
+       glVertex3fv(P005);
+       glNormal3fv(N060);
+       glVertex3fv(P060);
+       glEnd();
+}
+
+static void
+Dolphin013(GLenum cap)
+{
+       glBegin(cap);
+       glNormal3fv(N116);
+       glVertex3fv(P116);
+       glNormal3fv(N117);
+       glVertex3fv(P117);
+       glNormal3fv(N112);
+       glVertex3fv(P112);
+       glNormal3fv(N113);
+       glVertex3fv(P113);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N114);
+       glVertex3fv(P114);
+       glNormal3fv(N113);
+       glVertex3fv(P113);
+       glNormal3fv(N112);
+       glVertex3fv(P112);
+       glNormal3fv(N115);
+       glVertex3fv(P115);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N114);
+       glVertex3fv(P114);
+       glNormal3fv(N116);
+       glVertex3fv(P116);
+       glNormal3fv(N113);
+       glVertex3fv(P113);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N114);
+       glVertex3fv(P114);
+       glNormal3fv(N007);
+       glVertex3fv(P007);
+       glNormal3fv(N116);
+       glVertex3fv(P116);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N007);
+       glVertex3fv(P007);
+       glNormal3fv(N002);
+       glVertex3fv(P002);
+       glNormal3fv(N116);
+       glVertex3fv(P116);
+       glEnd();
+       glBegin(cap);
+       glVertex3fv(P002);
+       glVertex3fv(P007);
+       glVertex3fv(P008);
+       glVertex3fv(P099);
+       glEnd();
+       glBegin(cap);
+       glVertex3fv(P007);
+       glVertex3fv(P114);
+       glVertex3fv(P115);
+       glVertex3fv(P008);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N117);
+       glVertex3fv(P117);
+       glNormal3fv(N099);
+       glVertex3fv(P099);
+       glNormal3fv(N008);
+       glVertex3fv(P008);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N117);
+       glVertex3fv(P117);
+       glNormal3fv(N008);
+       glVertex3fv(P008);
+       glNormal3fv(N112);
+       glVertex3fv(P112);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N112);
+       glVertex3fv(P112);
+       glNormal3fv(N008);
+       glVertex3fv(P008);
+       glNormal3fv(N115);
+       glVertex3fv(P115);
+       glEnd();
+}
+
+static void
+Dolphin014(GLenum cap)
+{
+       glBegin(cap);
+       glNormal3fv(N111);
+       glVertex3fv(P111);
+       glNormal3fv(N110);
+       glVertex3fv(P110);
+       glNormal3fv(N102);
+       glVertex3fv(P102);
+       glNormal3fv(N121);
+       glVertex3fv(P121);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N111);
+       glVertex3fv(P111);
+       glNormal3fv(N097);
+       glVertex3fv(P097);
+       glNormal3fv(N110);
+       glVertex3fv(P110);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N097);
+       glVertex3fv(P097);
+       glNormal3fv(N119);
+       glVertex3fv(P119);
+       glNormal3fv(N110);
+       glVertex3fv(P110);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N097);
+       glVertex3fv(P097);
+       glNormal3fv(N099);
+       glVertex3fv(P099);
+       glNormal3fv(N119);
+       glVertex3fv(P119);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N099);
+       glVertex3fv(P099);
+       glNormal3fv(N065);
+       glVertex3fv(P065);
+       glNormal3fv(N119);
+       glVertex3fv(P119);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N065);
+       glVertex3fv(P065);
+       glNormal3fv(N066);
+       glVertex3fv(P066);
+       glNormal3fv(N119);
+       glVertex3fv(P119);
+       glEnd();
+       glBegin(cap);
+       glVertex3fv(P098);
+       glVertex3fv(P097);
+       glVertex3fv(P111);
+       glVertex3fv(P121);
+       glEnd();
+       glBegin(cap);
+       glVertex3fv(P002);
+       glVertex3fv(P099);
+       glVertex3fv(P097);
+       glVertex3fv(P098);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N110);
+       glVertex3fv(P110);
+       glNormal3fv(N119);
+       glVertex3fv(P119);
+       glNormal3fv(N118);
+       glVertex3fv(P118);
+       glNormal3fv(N102);
+       glVertex3fv(P102);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N119);
+       glVertex3fv(P119);
+       glNormal3fv(N066);
+       glVertex3fv(P066);
+       glNormal3fv(N067);
+       glVertex3fv(P067);
+       glNormal3fv(N118);
+       glVertex3fv(P118);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N067);
+       glVertex3fv(P067);
+       glNormal3fv(N060);
+       glVertex3fv(P060);
+       glNormal3fv(N002);
+       glVertex3fv(P002);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N067);
+       glVertex3fv(P067);
+       glNormal3fv(N002);
+       glVertex3fv(P002);
+       glNormal3fv(N118);
+       glVertex3fv(P118);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N118);
+       glVertex3fv(P118);
+       glNormal3fv(N002);
+       glVertex3fv(P002);
+       glNormal3fv(N098);
+       glVertex3fv(P098);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N118);
+       glVertex3fv(P118);
+       glNormal3fv(N098);
+       glVertex3fv(P098);
+       glNormal3fv(N102);
+       glVertex3fv(P102);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N102);
+       glVertex3fv(P102);
+       glNormal3fv(N098);
+       glVertex3fv(P098);
+       glNormal3fv(N121);
+       glVertex3fv(P121);
+       glEnd();
+}
+
+static void
+Dolphin015(GLenum cap)
+{
+       glBegin(cap);
+       glNormal3fv(N055);
+       glVertex3fv(P055);
+       glNormal3fv(N003);
+       glVertex3fv(P003);
+       glNormal3fv(N054);
+       glVertex3fv(P054);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N003);
+       glVertex3fv(P003);
+       glNormal3fv(N055);
+       glVertex3fv(P055);
+       glNormal3fv(N063);
+       glVertex3fv(P063);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N003);
+       glVertex3fv(P003);
+       glNormal3fv(N063);
+       glVertex3fv(P063);
+       glNormal3fv(N100);
+       glVertex3fv(P100);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N003);
+       glVertex3fv(P003);
+       glNormal3fv(N100);
+       glVertex3fv(P100);
+       glNormal3fv(N054);
+       glVertex3fv(P054);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N054);
+       glVertex3fv(P054);
+       glNormal3fv(N100);
+       glVertex3fv(P100);
+       glNormal3fv(N062);
+       glVertex3fv(P062);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N100);
+       glVertex3fv(P100);
+       glNormal3fv(N064);
+       glVertex3fv(P064);
+       glNormal3fv(N120);
+       glVertex3fv(P120);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N100);
+       glVertex3fv(P100);
+       glNormal3fv(N063);
+       glVertex3fv(P063);
+       glNormal3fv(N064);
+       glVertex3fv(P064);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N063);
+       glVertex3fv(P063);
+       glNormal3fv(N006);
+       glVertex3fv(P006);
+       glNormal3fv(N064);
+       glVertex3fv(P064);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N064);
+       glVertex3fv(P064);
+       glNormal3fv(N006);
+       glVertex3fv(P006);
+       glNormal3fv(N099);
+       glVertex3fv(P099);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N064);
+       glVertex3fv(P064);
+       glNormal3fv(N099);
+       glVertex3fv(P099);
+       glNormal3fv(N117);
+       glVertex3fv(P117);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N120);
+       glVertex3fv(P120);
+       glNormal3fv(N064);
+       glVertex3fv(P064);
+       glNormal3fv(N117);
+       glVertex3fv(P117);
+       glNormal3fv(N116);
+       glVertex3fv(P116);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N006);
+       glVertex3fv(P006);
+       glNormal3fv(N065);
+       glVertex3fv(P065);
+       glNormal3fv(N099);
+       glVertex3fv(P099);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N062);
+       glVertex3fv(P062);
+       glNormal3fv(N100);
+       glVertex3fv(P100);
+       glNormal3fv(N120);
+       glVertex3fv(P120);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N005);
+       glVertex3fv(P005);
+       glNormal3fv(N062);
+       glVertex3fv(P062);
+       glNormal3fv(N120);
+       glVertex3fv(P120);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N005);
+       glVertex3fv(P005);
+       glNormal3fv(N120);
+       glVertex3fv(P120);
+       glNormal3fv(N002);
+       glVertex3fv(P002);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N002);
+       glVertex3fv(P002);
+       glNormal3fv(N120);
+       glVertex3fv(P120);
+       glNormal3fv(N116);
+       glVertex3fv(P116);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N060);
+       glVertex3fv(P060);
+       glNormal3fv(N005);
+       glVertex3fv(P005);
+       glNormal3fv(N002);
+       glVertex3fv(P002);
+       glEnd();
+}
+
+static void
+Dolphin016(GLenum cap)
+{
+
+       glDisable(GL_DEPTH_TEST);
+       glBegin(cap);
+       glVertex3fv(P123);
+       glVertex3fv(P124);
+       glVertex3fv(P125);
+       glVertex3fv(P126);
+       glVertex3fv(P127);
+       glVertex3fv(P128);
+       glEnd();
+       glBegin(cap);
+       glVertex3fv(P129);
+       glVertex3fv(P130);
+       glVertex3fv(P131);
+       glVertex3fv(P132);
+       glVertex3fv(P133);
+       glVertex3fv(P134);
+       glEnd();
+       glBegin(cap);
+       glVertex3fv(P103);
+       glVertex3fv(P105);
+       glVertex3fv(P108);
+       glEnd();
+       glEnable(GL_DEPTH_TEST);
+}
+
+void
+DrawDolphin(fishRec * fish, int wire)
+{
+       float       seg0, seg1, seg2, seg3, seg4, seg5, seg6, seg7;
+       float       pitch, thrash, chomp;
+       GLenum      cap;
+
+       fish->htail = (int) (fish->htail - (int) (10.0 * fish->v)) % 360;
+
+       thrash = 70.0 * fish->v;
+
+       seg0 = 1.0 * thrash * sin((fish->htail) * RRAD);
+       seg3 = 1.0 * thrash * sin((fish->htail) * RRAD);
+       seg1 = 2.0 * thrash * sin((fish->htail + 4.0) * RRAD);
+       seg2 = 3.0 * thrash * sin((fish->htail + 6.0) * RRAD);
+       seg4 = 4.0 * thrash * sin((fish->htail + 10.0) * RRAD);
+       seg5 = 4.5 * thrash * sin((fish->htail + 15.0) * RRAD);
+       seg6 = 5.0 * thrash * sin((fish->htail + 20.0) * RRAD);
+       seg7 = 6.0 * thrash * sin((fish->htail + 30.0) * RRAD);
+
+       pitch = fish->v * sin((fish->htail + 180.0) * RRAD);
+
+       if (fish->v > 2.0) {
+               chomp = -(fish->v - 2.0) * 200.0;
+       }
+       chomp = 100.0;
+
+       P012[1] = iP012[1] + seg5;
+       P013[1] = iP013[1] + seg5;
+       P014[1] = iP014[1] + seg5;
+       P015[1] = iP015[1] + seg5;
+       P016[1] = iP016[1] + seg5;
+       P017[1] = iP017[1] + seg5;
+       P018[1] = iP018[1] + seg5;
+       P019[1] = iP019[1] + seg5;
+
+       P020[1] = iP020[1] + seg4;
+       P021[1] = iP021[1] + seg4;
+       P022[1] = iP022[1] + seg4;
+       P023[1] = iP023[1] + seg4;
+       P024[1] = iP024[1] + seg4;
+       P025[1] = iP025[1] + seg4;
+       P026[1] = iP026[1] + seg4;
+       P027[1] = iP027[1] + seg4;
+
+       P028[1] = iP028[1] + seg2;
+       P029[1] = iP029[1] + seg2;
+       P030[1] = iP030[1] + seg2;
+       P031[1] = iP031[1] + seg2;
+       P032[1] = iP032[1] + seg2;
+       P033[1] = iP033[1] + seg2;
+       P034[1] = iP034[1] + seg2;
+       P035[1] = iP035[1] + seg2;
+
+       P036[1] = iP036[1] + seg1;
+       P037[1] = iP037[1] + seg1;
+       P038[1] = iP038[1] + seg1;
+       P039[1] = iP039[1] + seg1;
+       P040[1] = iP040[1] + seg1;
+       P041[1] = iP041[1] + seg1;
+       P042[1] = iP042[1] + seg1;
+       P043[1] = iP043[1] + seg1;
+
+       P044[1] = iP044[1] + seg0;
+       P045[1] = iP045[1] + seg0;
+       P046[1] = iP046[1] + seg0;
+       P047[1] = iP047[1] + seg0;
+       P048[1] = iP048[1] + seg0;
+       P049[1] = iP049[1] + seg0;
+       P050[1] = iP050[1] + seg0;
+       P051[1] = iP051[1] + seg0;
+
+       P009[1] = iP009[1] + seg6;
+       P010[1] = iP010[1] + seg6;
+       P075[1] = iP075[1] + seg6;
+       P076[1] = iP076[1] + seg6;
+
+       P001[1] = iP001[1] + seg7;
+       P011[1] = iP011[1] + seg7;
+       P068[1] = iP068[1] + seg7;
+       P069[1] = iP069[1] + seg7;
+       P070[1] = iP070[1] + seg7;
+       P071[1] = iP071[1] + seg7;
+       P072[1] = iP072[1] + seg7;
+       P073[1] = iP073[1] + seg7;
+       P074[1] = iP074[1] + seg7;
+
+       P091[1] = iP091[1] + seg3;
+       P092[1] = iP092[1] + seg3;
+       P093[1] = iP093[1] + seg3;
+       P094[1] = iP094[1] + seg3;
+       P095[1] = iP095[1] + seg3;
+       P122[1] = iP122[1] + seg3 * 1.5;
+
+       P097[1] = iP097[1] + chomp;
+       P098[1] = iP098[1] + chomp;
+       P102[1] = iP102[1] + chomp;
+       P110[1] = iP110[1] + chomp;
+       P111[1] = iP111[1] + chomp;
+       P121[1] = iP121[1] + chomp;
+       P118[1] = iP118[1] + chomp;
+       P119[1] = iP119[1] + chomp;
+
+       glPushMatrix();
+
+       glRotatef(pitch, 1.0, 0.0, 0.0);
+
+       glTranslatef(0.0, 0.0, 7000.0);
+
+       glRotatef(180.0, 0.0, 1.0, 0.0);
+
+       glEnable(GL_CULL_FACE);
+       cap = wire ? GL_LINE_LOOP : GL_POLYGON;
+       Dolphin014(cap);
+       Dolphin010(cap);
+       Dolphin009(cap);
+       Dolphin012(cap);
+       Dolphin013(cap);
+       Dolphin006(cap);
+       Dolphin002(cap);
+       Dolphin001(cap);
+       Dolphin003(cap);
+       Dolphin015(cap);
+       Dolphin004(cap);
+       Dolphin005(cap);
+       Dolphin007(cap);
+       Dolphin008(cap);
+       Dolphin011(cap);
+       Dolphin016(cap);
+       glDisable(GL_CULL_FACE);
+
+       glPopMatrix();
+}
+#endif
diff --git a/hacks/glx/e_textures.h b/hacks/glx/e_textures.h
new file mode 100644 (file)
index 0000000..7f9457e
--- /dev/null
@@ -0,0 +1,1478 @@
+static unsigned char WoodTextureWidth = 199;
+static unsigned char WoodTextureHeight = 37;
+static unsigned char WoodTextureData[] =
+{
+       84, 30, 12, 84, 26, 12, 108, 42, 28, 100, 38, 28, 108, 42, 28,
+       108, 46, 28, 100, 38, 28, 108, 46, 28, 108, 42, 28, 108, 42, 20,
+       108, 42, 28, 108, 38, 20, 108, 42, 20, 108, 42, 28, 116, 42, 28,
+       108, 42, 20, 108, 46, 28, 100, 34, 12, 108, 42, 20, 108, 42, 20,
+       108, 42, 20, 108, 38, 20, 100, 38, 20, 100, 38, 20, 108, 42, 20,
+       108, 42, 20, 108, 38, 20, 100, 38, 20, 108, 38, 20, 100, 38, 20,
+       108, 42, 20, 108, 42, 20, 108, 42, 28, 108, 42, 20, 108, 42, 20,
+       100, 38, 20, 100, 38, 20, 100, 38, 20, 108, 38, 20, 116, 50, 28,
+       108, 42, 28, 108, 42, 20, 100, 38, 20, 108, 42, 20, 108, 42, 20,
+       108, 46, 28, 108, 42, 20, 108, 42, 20, 108, 42, 20, 100, 38, 20,
+       108, 38, 20, 100, 38, 20, 108, 38, 20, 100, 38, 20, 100, 38, 20,
+       108, 38, 20, 100, 38, 20, 108, 38, 20, 100, 42, 20, 108, 42, 20,
+       108, 42, 28, 108, 42, 20, 100, 38, 20, 108, 42, 20, 100, 38, 20,
+       100, 34, 12, 100, 38, 20, 108, 38, 20, 100, 38, 20, 108, 42, 20,
+       108, 42, 20, 108, 42, 20, 100, 38, 20, 108, 38, 20, 100, 38, 20,
+       100, 34, 12, 100, 38, 20, 108, 38, 20, 100, 38, 20, 108, 42, 20,
+       100, 38, 20, 100, 34, 12, 100, 34, 12, 100, 38, 20, 108, 38, 20,
+       100, 38, 20, 108, 38, 20, 108, 42, 20, 100, 38, 20, 108, 42, 20,
+       108, 42, 28, 108, 46, 20, 108, 38, 20, 108, 42, 20, 108, 46, 28,
+       108, 46, 28, 108, 42, 20, 108, 42, 20, 108, 42, 20, 100, 38, 20,
+       108, 42, 20, 100, 38, 20, 108, 38, 20, 100, 38, 20, 108, 38, 20,
+       108, 42, 20, 108, 46, 28, 116, 50, 28, 116, 54, 36, 116, 54, 36,
+       116, 54, 28, 108, 46, 28, 108, 42, 20, 108, 42, 28, 108, 42, 20,
+       108, 42, 20, 108, 46, 28, 116, 50, 28, 116, 50, 28, 116, 50, 28,
+       116, 46, 28, 108, 42, 28, 116, 50, 36, 116, 50, 36, 100, 38, 20,
+       108, 42, 28, 108, 38, 20, 100, 38, 20, 108, 38, 20, 108, 42, 28,
+       108, 46, 28, 116, 46, 28, 108, 42, 28, 108, 42, 28, 108, 42, 20,
+       108, 46, 28, 116, 50, 28, 116, 50, 28, 116, 50, 28, 116, 50, 28,
+       108, 42, 28, 108, 42, 20, 100, 38, 20, 116, 50, 28, 108, 46, 28,
+       108, 42, 20, 108, 42, 20, 108, 46, 28, 116, 46, 28, 108, 46, 28,
+       108, 46, 28, 108, 46, 20, 108, 46, 28, 116, 46, 28, 108, 46, 28,
+       116, 50, 28, 108, 46, 28, 108, 46, 28, 108, 42, 20, 116, 46, 28,
+       108, 46, 28, 108, 42, 20, 108, 42, 28, 108, 46, 28, 116, 50, 28,
+       116, 50, 28, 116, 50, 36, 124, 54, 36, 116, 54, 36, 116, 54, 28,
+       116, 50, 28, 116, 50, 28, 108, 46, 28, 116, 46, 28, 108, 46, 28,
+       116, 50, 28, 116, 46, 28, 116, 50, 28, 116, 50, 28, 116, 50, 28,
+       116, 50, 28, 108, 46, 28, 108, 46, 20, 124, 50, 36, 116, 54, 28,
+       124, 54, 28, 116, 54, 28, 116, 54, 28, 116, 54, 28, 124, 54, 36,
+       124, 58, 36, 124, 50, 36, 116, 46, 28, 116, 46, 28, 116, 42, 28,
+       116, 50, 36, 124, 66, 44, 108, 58, 36, 84, 30, 12, 100, 42, 20,
+       116, 54, 36, 140, 82, 68, 148, 86, 68, 148, 86, 68, 156, 90, 76,
+       148, 86, 68, 156, 86, 76, 156, 86, 68, 148, 86, 68, 156, 86, 68,
+       156, 86, 68, 156, 86, 68, 156, 86, 68, 156, 90, 68, 156, 86, 68,
+       156, 90, 68, 164, 94, 76, 164, 98, 84, 164, 102, 84, 164, 102, 84,
+       164, 98, 76, 156, 94, 68, 164, 94, 76, 156, 94, 76, 164, 98, 84,
+       164, 98, 76, 164, 98, 76, 156, 94, 76, 164, 98, 76, 164, 98, 76,
+       164, 102, 84, 164, 102, 84, 172, 106, 84, 172, 106, 84, 164, 98, 76,
+       164, 94, 68, 164, 94, 68, 164, 98, 76, 172, 106, 84, 164, 98, 76,
+       164, 98, 76, 164, 94, 68, 164, 94, 76, 164, 98, 76, 164, 98, 76,
+       164, 98, 76, 164, 102, 84, 172, 102, 84, 172, 106, 84, 172, 106, 84,
+       172, 106, 84, 172, 106, 76, 164, 98, 76, 164, 98, 76, 164, 98, 76,
+       164, 98, 76, 164, 94, 68, 164, 98, 76, 164, 98, 76, 164, 102, 76,
+       164, 94, 76, 156, 94, 68, 172, 102, 84, 172, 106, 84, 172, 102, 84,
+       164, 98, 76, 164, 102, 76, 172, 102, 84, 172, 106, 84, 172, 106, 84,
+       172, 106, 84, 172, 102, 84, 164, 102, 76, 164, 98, 76, 164, 98, 76,
+       164, 98, 76, 164, 98, 76, 164, 98, 76, 172, 102, 76, 164, 98, 76,
+       164, 94, 76, 156, 94, 68, 164, 98, 76, 164, 102, 76, 164, 98, 76,
+       164, 98, 76, 164, 94, 76, 156, 94, 68, 164, 94, 76, 164, 102, 76,
+       172, 106, 84, 164, 98, 76, 164, 98, 76, 164, 98, 76, 164, 98, 76,
+       164, 98, 76, 164, 98, 76, 164, 98, 76, 164, 102, 76, 172, 102, 84,
+       172, 106, 84, 172, 110, 84, 180, 110, 92, 172, 110, 84, 172, 110, 84,
+     180, 114, 92, 188, 122, 100, 188, 122, 100, 188, 122, 100, 188, 118, 92,
+       180, 110, 92, 172, 106, 84, 172, 106, 84, 172, 106, 84, 180, 114, 92,
+   188, 118, 100, 188, 118, 100, 180, 118, 100, 188, 122, 108, 188, 126, 108,
+   188, 118, 100, 196, 130, 108, 204, 134, 116, 188, 126, 108, 196, 122, 108,
+    180, 118, 100, 180, 110, 92, 180, 114, 100, 180, 118, 100, 188, 118, 100,
+   188, 122, 108, 188, 118, 100, 188, 118, 100, 180, 118, 100, 188, 118, 100,
+     180, 118, 100, 180, 118, 100, 180, 118, 100, 180, 114, 92, 180, 114, 92,
+       172, 110, 92, 172, 106, 84, 180, 114, 92, 172, 106, 92, 172, 102, 84,
+       172, 106, 84, 172, 110, 92, 180, 110, 84, 172, 110, 92, 172, 106, 84,
+       172, 102, 84, 172, 102, 84, 172, 106, 84, 172, 106, 84, 172, 106, 84,
+       172, 106, 84, 172, 106, 84, 172, 106, 84, 172, 106, 84, 172, 102, 84,
+       164, 102, 84, 164, 102, 76, 172, 106, 84, 172, 110, 92, 180, 110, 92,
+       172, 110, 84, 172, 114, 92, 180, 114, 92, 180, 110, 92, 172, 110, 92,
+       172, 106, 92, 172, 106, 84, 172, 106, 84, 164, 102, 84, 180, 114, 100,
+      180, 114, 92, 180, 118, 100, 180, 118, 100, 180, 114, 92, 172, 110, 92,
+       172, 106, 84, 172, 106, 84, 180, 110, 92, 180, 114, 92, 180, 114, 92,
+       172, 110, 92, 172, 110, 84, 172, 110, 92, 180, 114, 92, 180, 118, 100,
+   196, 126, 100, 196, 122, 108, 196, 126, 108, 196, 130, 116, 196, 134, 116,
+       204, 142, 124, 164, 106, 84, 100, 42, 20, 84, 26, 4, 132, 78, 68,
+   188, 122, 108, 188, 122, 108, 188, 126, 116, 196, 134, 116, 188, 122, 108,
+   188, 126, 108, 188, 126, 108, 188, 122, 108, 196, 126, 108, 196, 130, 108,
+   188, 126, 108, 188, 122, 100, 196, 126, 108, 196, 126, 108, 188, 126, 108,
+   196, 130, 108, 196, 130, 108, 196, 134, 116, 196, 130, 108, 196, 130, 108,
+   188, 126, 108, 196, 126, 108, 188, 126, 108, 196, 130, 108, 188, 126, 108,
+   188, 126, 108, 196, 126, 108, 188, 126, 108, 196, 130, 108, 196, 130, 108,
+   196, 134, 116, 204, 142, 116, 204, 134, 116, 196, 130, 108, 196, 130, 108,
+   188, 126, 108, 196, 126, 100, 196, 134, 108, 196, 130, 108, 188, 126, 100,
+   188, 122, 100, 188, 126, 108, 196, 126, 100, 188, 126, 108, 196, 126, 100,
+   188, 126, 100, 196, 130, 108, 204, 134, 108, 196, 134, 116, 196, 134, 108,
+   196, 130, 108, 196, 126, 108, 196, 130, 108, 196, 130, 108, 196, 130, 108,
+   188, 126, 108, 196, 126, 108, 196, 134, 108, 196, 130, 108, 196, 130, 108,
+   188, 122, 100, 196, 130, 108, 196, 130, 108, 196, 134, 108, 196, 130, 108,
+   188, 126, 100, 196, 130, 108, 196, 134, 108, 204, 134, 116, 204, 138, 116,
+   204, 138, 116, 204, 134, 116, 196, 130, 108, 196, 130, 108, 196, 134, 108,
+   204, 134, 116, 196, 134, 116, 196, 134, 108, 196, 130, 108, 196, 130, 108,
+   204, 134, 116, 204, 138, 116, 204, 138, 116, 196, 130, 108, 196, 130, 108,
+    188, 122, 100, 180, 118, 92, 188, 118, 100, 196, 130, 108, 196, 130, 108,
+   188, 126, 100, 188, 122, 100, 188, 122, 100, 204, 134, 108, 196, 134, 116,
+   204, 134, 116, 196, 134, 108, 196, 130, 108, 204, 134, 108, 204, 138, 116,
+   204, 138, 116, 212, 142, 124, 204, 142, 116, 204, 134, 116, 204, 138, 116,
+   204, 138, 116, 204, 138, 116, 204, 134, 108, 188, 126, 108, 196, 130, 108,
+   196, 126, 100, 188, 122, 100, 196, 130, 108, 204, 138, 116, 212, 146, 124,
+   204, 142, 116, 204, 138, 116, 212, 146, 124, 212, 142, 124, 204, 138, 124,
+   204, 138, 124, 204, 138, 124, 204, 138, 116, 212, 142, 124, 204, 138, 124,
+   196, 130, 116, 204, 134, 116, 204, 138, 116, 204, 138, 124, 204, 138, 116,
+   204, 138, 124, 204, 134, 116, 204, 138, 124, 212, 142, 124, 204, 138, 116,
+   196, 134, 116, 196, 130, 108, 196, 134, 116, 204, 138, 116, 204, 142, 124,
+   212, 142, 124, 204, 138, 116, 204, 138, 116, 204, 138, 116, 204, 138, 116,
+   204, 138, 124, 204, 142, 124, 204, 142, 116, 204, 138, 124, 196, 134, 108,
+   196, 134, 116, 196, 134, 116, 196, 130, 116, 196, 130, 108, 188, 126, 108,
+   196, 126, 108, 188, 130, 108, 188, 126, 108, 188, 122, 100, 180, 118, 100,
+   188, 118, 100, 188, 126, 108, 196, 130, 108, 196, 126, 108, 188, 126, 108,
+   188, 122, 100, 188, 122, 108, 188, 126, 108, 196, 126, 108, 196, 130, 108,
+   188, 126, 108, 196, 126, 108, 188, 126, 108, 196, 134, 108, 196, 134, 116,
+   196, 134, 108, 196, 130, 108, 196, 126, 108, 188, 122, 108, 188, 122, 100,
+   188, 122, 100, 196, 130, 108, 196, 130, 100, 196, 130, 108, 196, 130, 100,
+   188, 130, 108, 196, 130, 108, 196, 134, 108, 204, 138, 116, 204, 130, 108,
+   204, 134, 116, 204, 134, 116, 204, 134, 116, 204, 138, 124, 204, 146, 124,
+       156, 102, 84, 84, 26, 4, 84, 26, 4, 116, 58, 36, 164, 106, 92,
+       164, 102, 84, 164, 106, 92, 172, 110, 92, 156, 98, 84, 172, 102, 84,
+      172, 102, 84, 180, 110, 92, 180, 118, 100, 180, 118, 100, 180, 110, 92,
+       180, 110, 92, 180, 114, 92, 180, 114, 92, 180, 114, 92, 172, 106, 92,
+       172, 106, 84, 172, 106, 84, 172, 106, 92, 172, 110, 92, 172, 110, 92,
+       172, 106, 84, 172, 106, 84, 164, 102, 84, 164, 102, 84, 172, 102, 76,
+       164, 102, 84, 172, 106, 84, 172, 106, 84, 172, 110, 92, 172, 110, 84,
+       180, 110, 92, 172, 110, 84, 180, 110, 92, 172, 110, 84, 172, 106, 84,
+       172, 110, 84, 180, 110, 92, 172, 106, 84, 172, 102, 84, 164, 102, 84,
+       172, 102, 76, 172, 102, 84, 172, 102, 84, 164, 102, 76, 164, 94, 76,
+       172, 102, 84, 172, 110, 92, 172, 110, 84, 172, 102, 84, 164, 98, 76,
+       172, 102, 76, 172, 106, 84, 172, 110, 84, 172, 106, 84, 172, 106, 84,
+       172, 106, 84, 180, 114, 92, 180, 114, 92, 172, 110, 84, 172, 106, 84,
+       172, 102, 76, 172, 110, 84, 172, 110, 84, 172, 102, 84, 172, 102, 84,
+       172, 106, 84, 180, 110, 92, 172, 110, 84, 180, 118, 92, 180, 114, 92,
+       180, 110, 92, 172, 110, 84, 180, 110, 92, 180, 114, 92, 180, 118, 92,
+      188, 122, 100, 188, 118, 100, 180, 114, 92, 180, 118, 92, 180, 114, 92,
+       180, 118, 92, 188, 118, 100, 180, 118, 92, 180, 114, 92, 180, 118, 92,
+      180, 110, 84, 180, 110, 92, 180, 118, 92, 188, 122, 100, 188, 114, 100,
+     180, 114, 92, 180, 114, 92, 196, 126, 108, 188, 126, 100, 188, 122, 100,
+    188, 118, 100, 180, 118, 100, 180, 114, 92, 188, 118, 100, 188, 122, 100,
+       180, 110, 92, 172, 110, 84, 180, 110, 92, 180, 114, 92, 188, 122, 100,
+      188, 126, 100, 188, 118, 100, 180, 114, 92, 172, 110, 84, 172, 110, 92,
+      180, 114, 92, 180, 114, 92, 180, 118, 92, 188, 118, 100, 188, 122, 100,
+       188, 122, 100, 180, 106, 92, 172, 110, 92, 172, 102, 84, 172, 102, 84,
+       164, 94, 76, 164, 94, 76, 164, 98, 76, 164, 102, 84, 172, 102, 84,
+       172, 106, 84, 180, 110, 92, 180, 110, 92, 180, 110, 92, 172, 106, 92,
+       172, 106, 84, 172, 106, 92, 172, 110, 84, 164, 102, 84, 164, 98, 76,
+       164, 94, 76, 164, 98, 76, 172, 110, 92, 180, 114, 92, 180, 118, 100,
+   180, 118, 100, 188, 122, 100, 180, 122, 108, 188, 122, 100, 188, 122, 100,
+   188, 122, 100, 188, 122, 100, 188, 126, 108, 188, 122, 100, 188, 126, 108,
+     188, 122, 100, 188, 122, 100, 180, 118, 100, 180, 114, 92, 180, 114, 92,
+       180, 118, 100, 180, 110, 92, 172, 110, 92, 172, 106, 84, 180, 110, 92,
+       180, 118, 92, 180, 118, 100, 180, 114, 92, 180, 110, 92, 172, 110, 84,
+       172, 110, 92, 180, 114, 92, 180, 114, 92, 180, 118, 92, 180, 118, 92,
+       180, 114, 92, 180, 118, 92, 180, 110, 92, 180, 110, 92, 180, 114, 92,
+       172, 110, 92, 172, 106, 84, 172, 106, 84, 172, 106, 92, 172, 110, 84,
+       180, 110, 92, 180, 114, 92, 180, 118, 92, 180, 118, 92, 180, 118, 92,
+     180, 118, 92, 188, 118, 100, 188, 122, 100, 180, 114, 100, 180, 110, 92,
+       188, 114, 100, 180, 110, 92, 172, 110, 92, 180, 126, 108, 148, 98, 76,
+       84, 26, 4, 84, 26, 12, 108, 50, 36, 164, 102, 84, 164, 98, 84,
+       156, 94, 76, 164, 98, 84, 148, 86, 68, 156, 90, 76, 156, 94, 84,
+       164, 90, 76, 164, 98, 84, 172, 102, 84, 164, 94, 76, 156, 90, 68,
+       164, 94, 76, 164, 98, 84, 164, 94, 76, 164, 98, 76, 164, 98, 84,
+       164, 98, 76, 172, 102, 84, 172, 106, 84, 172, 106, 84, 172, 106, 84,
+       164, 102, 84, 164, 94, 68, 164, 94, 76, 156, 98, 76, 164, 98, 76,
+       164, 98, 76, 164, 98, 84, 164, 102, 84, 172, 102, 84, 164, 98, 76,
+       164, 98, 76, 172, 102, 84, 172, 106, 84, 172, 106, 84, 180, 106, 84,
+       172, 110, 84, 172, 106, 84, 164, 102, 76, 164, 98, 76, 164, 98, 76,
+       164, 102, 76, 164, 102, 76, 164, 98, 76, 164, 98, 76, 172, 106, 84,
+       180, 110, 84, 172, 106, 84, 164, 98, 76, 164, 98, 76, 172, 106, 84,
+       180, 114, 92, 172, 106, 84, 164, 102, 76, 164, 98, 76, 172, 106, 84,
+       180, 110, 92, 180, 114, 92, 180, 110, 92, 172, 106, 84, 172, 106, 84,
+       180, 114, 92, 188, 118, 100, 180, 114, 92, 172, 110, 84, 180, 114, 92,
+       180, 114, 92, 180, 114, 92, 172, 110, 92, 172, 106, 84, 164, 102, 76,
+       172, 102, 76, 164, 102, 84, 180, 110, 84, 180, 118, 92, 188, 118, 100,
+       188, 122, 100, 180, 118, 92, 180, 110, 92, 180, 110, 84, 172, 106, 92,
+     180, 114, 84, 180, 114, 100, 188, 122, 100, 188, 122, 100, 180, 114, 92,
+       172, 110, 92, 180, 114, 92, 188, 118, 92, 180, 114, 92, 180, 114, 92,
+       180, 118, 92, 164, 102, 84, 172, 102, 84, 172, 106, 84, 172, 102, 76,
+       164, 102, 76, 172, 102, 84, 172, 110, 84, 180, 114, 92, 172, 110, 84,
+       172, 102, 84, 172, 106, 84, 180, 110, 84, 180, 118, 100, 188, 118, 92,
+       180, 110, 92, 172, 106, 84, 172, 106, 84, 180, 110, 92, 188, 118, 92,
+      180, 118, 100, 180, 114, 92, 180, 114, 92, 180, 114, 92, 180, 118, 100,
+     180, 114, 92, 188, 122, 100, 188, 126, 108, 188, 118, 100, 172, 110, 92,
+       172, 102, 84, 172, 106, 84, 180, 106, 92, 164, 98, 76, 172, 102, 84,
+       172, 106, 92, 172, 106, 84, 172, 106, 84, 172, 102, 84, 172, 102, 84,
+       172, 102, 84, 172, 106, 84, 164, 102, 84, 164, 98, 76, 164, 98, 76,
+       172, 106, 84, 172, 110, 92, 180, 114, 92, 180, 114, 92, 180, 118, 100,
+   188, 122, 100, 188, 122, 100, 188, 126, 108, 188, 122, 100, 188, 122, 100,
+    188, 122, 108, 196, 126, 108, 180, 118, 92, 188, 118, 100, 180, 118, 100,
+      180, 118, 100, 180, 114, 92, 180, 110, 92, 180, 114, 92, 180, 118, 100,
+       180, 110, 92, 172, 110, 84, 172, 106, 92, 172, 110, 92, 188, 118, 100,
+       180, 118, 100, 180, 114, 92, 172, 106, 84, 180, 110, 92, 180, 114, 92,
+       172, 110, 92, 180, 114, 92, 180, 114, 100, 180, 114, 92, 172, 110, 92,
+       172, 110, 92, 180, 114, 92, 180, 114, 92, 180, 114, 100, 180, 110, 92,
+       172, 110, 92, 172, 110, 92, 180, 114, 92, 180, 118, 92, 172, 106, 84,
+      180, 110, 84, 180, 118, 92, 188, 122, 100, 180, 118, 100, 180, 118, 92,
+       180, 118, 92, 180, 114, 92, 180, 110, 92, 180, 110, 92, 188, 118, 108,
+       188, 118, 100, 188, 122, 100, 188, 130, 108, 156, 102, 84, 84, 26, 12,
+       84, 30, 12, 108, 46, 28, 140, 82, 68, 156, 90, 76, 156, 94, 84,
+       156, 94, 84, 156, 94, 76, 164, 94, 76, 156, 90, 76, 164, 94, 76,
+       156, 94, 76, 156, 90, 68, 156, 90, 68, 164, 90, 76, 156, 90, 68,
+       148, 82, 60, 148, 78, 60, 164, 98, 76, 164, 94, 76, 156, 90, 68,
+       156, 90, 68, 156, 94, 76, 164, 98, 76, 164, 98, 76, 164, 98, 76,
+       156, 90, 68, 148, 86, 68, 156, 90, 68, 156, 90, 68, 156, 90, 76,
+       164, 94, 68, 156, 94, 76, 156, 94, 68, 156, 90, 68, 156, 90, 68,
+       172, 102, 76, 180, 114, 92, 188, 118, 92, 172, 106, 84, 180, 106, 84,
+       172, 106, 84, 164, 98, 76, 164, 94, 68, 164, 98, 76, 172, 102, 84,
+       172, 106, 84, 172, 102, 76, 164, 98, 76, 172, 106, 84, 180, 110, 92,
+       172, 110, 84, 172, 98, 76, 164, 98, 76, 172, 106, 84, 180, 118, 92,
+       180, 106, 84, 180, 106, 84, 172, 106, 84, 172, 110, 84, 180, 110, 92,
+       180, 110, 84, 172, 102, 76, 164, 98, 76, 164, 94, 68, 172, 106, 84,
+       180, 114, 92, 172, 106, 84, 164, 98, 76, 172, 98, 76, 172, 106, 84,
+       172, 106, 84, 180, 106, 84, 180, 110, 84, 172, 110, 84, 180, 110, 92,
+       180, 110, 84, 180, 110, 92, 180, 110, 84, 172, 106, 84, 188, 118, 92,
+       188, 114, 92, 172, 106, 84, 172, 102, 76, 172, 106, 84, 188, 118, 92,
+      188, 122, 100, 188, 118, 100, 188, 118, 92, 180, 110, 92, 180, 114, 84,
+       180, 114, 92, 180, 110, 92, 172, 106, 84, 164, 98, 76, 172, 102, 76,
+       180, 106, 84, 180, 114, 84, 172, 102, 76, 164, 94, 76, 172, 106, 84,
+       180, 110, 84, 172, 106, 84, 172, 106, 84, 188, 122, 100, 188, 118, 92,
+     180, 118, 92, 188, 118, 100, 196, 122, 100, 188, 122, 100, 180, 118, 92,
+       180, 110, 84, 188, 114, 92, 172, 110, 84, 172, 106, 84, 180, 114, 92,
+       188, 114, 92, 180, 114, 92, 180, 114, 84, 180, 114, 92, 180, 110, 92,
+       180, 110, 92, 180, 110, 92, 172, 106, 84, 164, 98, 76, 172, 110, 92,
+     188, 118, 100, 180, 118, 92, 180, 110, 92, 180, 114, 100, 180, 118, 100,
+       172, 106, 84, 164, 94, 76, 164, 98, 76, 172, 102, 76, 164, 102, 84,
+       164, 102, 84, 172, 102, 84, 172, 106, 84, 172, 106, 84, 172, 106, 84,
+       172, 106, 84, 172, 106, 84, 172, 106, 92, 180, 118, 92, 180, 118, 100,
+       180, 114, 92, 180, 110, 92, 180, 114, 92, 180, 114, 100, 180, 118, 92,
+    180, 118, 100, 188, 122, 108, 188, 122, 100, 188, 118, 100, 180, 114, 92,
+       180, 114, 92, 172, 110, 92, 172, 110, 92, 172, 106, 84, 188, 122, 100,
+       180, 114, 100, 172, 106, 84, 172, 110, 84, 180, 114, 92, 180, 114, 92,
+       180, 110, 92, 172, 110, 92, 172, 106, 84, 172, 110, 92, 180, 114, 92,
+       180, 118, 100, 180, 114, 92, 172, 110, 92, 172, 110, 92, 180, 110, 92,
+       164, 106, 84, 172, 106, 84, 172, 110, 84, 172, 110, 92, 172, 110, 92,
+       180, 110, 84, 172, 110, 92, 172, 110, 84, 180, 110, 92, 180, 110, 92,
+       180, 114, 92, 180, 118, 92, 180, 118, 92, 180, 118, 100, 188, 118, 92,
+     188, 118, 100, 180, 110, 92, 180, 110, 92, 188, 118, 100, 188, 118, 100,
+       180, 118, 100, 180, 122, 108, 148, 90, 68, 84, 30, 12, 92, 34, 12,
+       116, 58, 44, 156, 90, 76, 156, 94, 76, 156, 94, 76, 156, 90, 76,
+       148, 86, 68, 156, 90, 76, 148, 86, 68, 156, 86, 68, 156, 86, 68,
+       156, 90, 68, 156, 90, 76, 156, 90, 68, 156, 86, 68, 148, 78, 60,
+       140, 74, 52, 148, 82, 68, 148, 82, 60, 148, 86, 68, 156, 90, 68,
+       156, 94, 76, 164, 98, 76, 164, 98, 84, 164, 98, 76, 148, 86, 68,
+       156, 86, 68, 156, 90, 68, 156, 90, 76, 156, 94, 68, 156, 94, 76,
+       164, 94, 76, 164, 98, 76, 172, 102, 76, 164, 98, 76, 172, 102, 76,
+       172, 106, 84, 180, 110, 92, 172, 106, 84, 164, 98, 76, 172, 102, 76,
+       172, 102, 84, 164, 94, 68, 164, 94, 76, 172, 102, 76, 180, 110, 84,
+       180, 110, 92, 164, 98, 76, 172, 102, 76, 172, 106, 84, 172, 102, 76,
+       164, 98, 76, 164, 98, 76, 172, 102, 76, 180, 110, 92, 180, 110, 92,
+       172, 110, 84, 172, 106, 84, 180, 106, 84, 180, 114, 84, 180, 110, 92,
+       172, 102, 84, 164, 98, 76, 156, 94, 68, 172, 106, 84, 188, 114, 92,
+       180, 110, 84, 172, 106, 84, 172, 102, 76, 172, 106, 84, 180, 110, 84,
+       172, 106, 84, 172, 106, 84, 180, 110, 84, 180, 110, 92, 180, 114, 84,
+       172, 110, 84, 172, 106, 84, 172, 106, 84, 164, 98, 76, 164, 98, 76,
+       164, 98, 76, 164, 90, 68, 164, 98, 76, 172, 102, 84, 172, 106, 76,
+       172, 102, 76, 172, 106, 84, 172, 106, 84, 180, 110, 84, 180, 114, 92,
+       188, 114, 92, 180, 110, 84, 180, 110, 92, 180, 114, 92, 172, 106, 84,
+       180, 114, 92, 172, 106, 84, 164, 94, 68, 172, 106, 84, 180, 114, 92,
+     188, 118, 92, 196, 126, 100, 188, 122, 100, 188, 122, 100, 188, 118, 92,
+       180, 118, 92, 188, 118, 100, 188, 118, 92, 180, 114, 92, 172, 106, 84,
+       180, 114, 92, 180, 106, 84, 172, 102, 76, 172, 102, 76, 172, 106, 84,
+       172, 102, 84, 172, 106, 84, 180, 110, 84, 172, 102, 84, 164, 102, 84,
+       172, 102, 84, 164, 94, 76, 156, 90, 68, 164, 94, 76, 180, 106, 92,
+       172, 102, 84, 164, 98, 84, 180, 110, 84, 180, 110, 92, 164, 98, 84,
+       164, 94, 76, 164, 98, 76, 164, 98, 84, 172, 98, 76, 164, 102, 84,
+       164, 102, 84, 172, 102, 84, 164, 106, 84, 172, 106, 92, 172, 106, 92,
+     172, 110, 92, 180, 110, 84, 180, 118, 100, 188, 118, 100, 180, 118, 100,
+       180, 114, 92, 172, 114, 92, 180, 110, 92, 180, 110, 92, 180, 114, 92,
+      180, 118, 100, 180, 118, 92, 180, 114, 100, 180, 114, 92, 180, 110, 92,
+       172, 110, 92, 180, 110, 92, 172, 114, 92, 188, 118, 100, 180, 114, 92,
+       172, 110, 92, 172, 106, 84, 172, 110, 92, 172, 110, 92, 172, 110, 84,
+       164, 102, 84, 172, 102, 84, 172, 110, 92, 180, 114, 92, 180, 114, 92,
+       180, 114, 92, 180, 110, 92, 172, 106, 84, 172, 106, 84, 172, 110, 92,
+       180, 110, 92, 180, 114, 92, 180, 114, 92, 180, 118, 100, 180, 114, 92,
+       180, 114, 100, 180, 114, 92, 180, 114, 92, 180, 118, 92, 188, 118, 92,
+    188, 122, 92, 180, 122, 100, 188, 122, 100, 180, 122, 100, 188, 118, 100,
+   196, 122, 100, 188, 118, 100, 196, 122, 108, 180, 114, 100, 180, 114, 100,
+       180, 126, 108, 148, 98, 76, 92, 34, 12, 84, 26, 12, 116, 58, 36,
+       148, 90, 76, 148, 90, 76, 140, 82, 68, 148, 82, 68, 140, 78, 60,
+       156, 86, 68, 148, 86, 68, 156, 90, 68, 156, 90, 76, 164, 94, 76,
+       156, 90, 76, 156, 90, 68, 148, 82, 68, 148, 78, 60, 140, 78, 60,
+       156, 86, 68, 148, 86, 68, 156, 86, 68, 156, 90, 68, 156, 94, 76,
+       164, 94, 76, 156, 94, 76, 148, 86, 68, 148, 82, 60, 148, 86, 68,
+       156, 90, 68, 156, 90, 76, 156, 90, 68, 156, 90, 68, 156, 94, 76,
+       164, 102, 76, 172, 102, 84, 172, 102, 76, 172, 106, 84, 180, 110, 84,
+       180, 114, 84, 180, 110, 84, 172, 102, 76, 180, 106, 84, 172, 106, 76,
+       172, 98, 76, 164, 98, 68, 172, 106, 76, 172, 106, 84, 180, 110, 84,
+       172, 98, 76, 180, 106, 84, 180, 110, 84, 180, 110, 84, 172, 98, 76,
+       172, 98, 76, 180, 106, 84, 180, 114, 84, 188, 114, 92, 180, 110, 84,
+       180, 110, 84, 180, 110, 84, 180, 114, 92, 180, 110, 84, 172, 106, 84,
+       164, 98, 68, 164, 94, 68, 180, 106, 84, 188, 118, 92, 180, 114, 92,
+       180, 110, 84, 180, 110, 84, 180, 110, 92, 180, 110, 84, 172, 106, 76,
+       180, 106, 84, 180, 110, 84, 180, 114, 92, 188, 114, 92, 180, 110, 84,
+       180, 106, 84, 172, 106, 76, 180, 106, 84, 188, 114, 92, 180, 114, 84,
+       180, 110, 84, 180, 114, 92, 188, 118, 92, 188, 118, 92, 180, 110, 84,
+       180, 106, 84, 172, 106, 76, 180, 106, 84, 188, 114, 92, 188, 118, 92,
+       180, 118, 92, 188, 118, 92, 196, 122, 100, 172, 106, 84, 188, 114, 84,
+       172, 106, 84, 164, 98, 68, 172, 102, 76, 180, 106, 84, 180, 110, 84,
+       188, 118, 92, 188, 122, 92, 188, 114, 92, 180, 110, 92, 180, 114, 84,
+       188, 118, 92, 188, 118, 92, 180, 110, 84, 172, 102, 84, 188, 122, 92,
+       180, 110, 84, 164, 102, 76, 172, 102, 76, 172, 98, 76, 172, 102, 76,
+       172, 102, 76, 180, 106, 84, 180, 110, 92, 180, 106, 84, 180, 106, 84,
+       172, 102, 76, 164, 90, 76, 172, 98, 76, 180, 110, 92, 172, 102, 76,
+       172, 102, 84, 180, 106, 84, 180, 110, 84, 172, 102, 84, 172, 98, 76,
+       164, 94, 76, 164, 98, 76, 164, 98, 76, 172, 98, 84, 164, 98, 76,
+       164, 102, 84, 172, 106, 84, 172, 106, 84, 172, 110, 92, 180, 114, 92,
+    180, 114, 92, 188, 122, 100, 188, 122, 100, 188, 122, 100, 180, 118, 100,
+       172, 106, 92, 172, 106, 84, 164, 106, 84, 172, 106, 84, 180, 114, 92,
+       180, 110, 92, 172, 110, 84, 172, 110, 92, 180, 110, 92, 172, 110, 92,
+       180, 114, 92, 180, 114, 92, 180, 118, 92, 172, 110, 92, 172, 106, 84,
+       172, 106, 84, 172, 110, 92, 172, 106, 84, 164, 102, 84, 164, 94, 76,
+       164, 98, 76, 172, 110, 92, 180, 114, 92, 172, 106, 92, 172, 106, 92,
+       172, 110, 84, 172, 106, 92, 164, 102, 84, 172, 110, 92, 180, 110, 92,
+       172, 110, 92, 180, 114, 92, 180, 114, 92, 180, 118, 100, 180, 114, 92,
+       180, 118, 92, 180, 114, 92, 188, 114, 92, 180, 118, 92, 180, 118, 100,
+       180, 118, 92, 180, 118, 100, 188, 118, 92, 180, 118, 92, 180, 110, 92,
+       180, 106, 92, 180, 110, 92, 172, 106, 92, 172, 106, 84, 172, 114, 92,
+       140, 90, 68, 84, 26, 12, 84, 30, 12, 116, 58, 44, 156, 90, 76,
+       156, 90, 76, 148, 86, 68, 148, 86, 76, 148, 86, 68, 156, 90, 76,
+       156, 90, 76, 164, 94, 84, 164, 98, 76, 164, 94, 76, 156, 90, 68,
+       156, 86, 68, 156, 86, 60, 156, 90, 68, 156, 90, 76, 164, 94, 76,
+       156, 94, 68, 156, 94, 76, 164, 98, 76, 164, 98, 76, 164, 98, 76,
+       156, 94, 76, 156, 94, 68, 148, 78, 60, 148, 86, 68, 156, 90, 68,
+       156, 90, 68, 148, 86, 68, 156, 86, 68, 156, 90, 68, 164, 98, 76,
+       164, 94, 68, 172, 98, 76, 180, 106, 84, 188, 118, 92, 188, 118, 92,
+       188, 118, 100, 180, 114, 92, 180, 114, 84, 180, 106, 84, 172, 102, 76,
+       172, 98, 76, 172, 106, 84, 180, 106, 84, 164, 98, 68, 172, 102, 76,
+       180, 114, 84, 196, 122, 100, 188, 118, 92, 172, 106, 76, 172, 102, 76,
+       180, 110, 84, 188, 122, 92, 188, 118, 92, 188, 114, 92, 180, 110, 84,
+       188, 114, 84, 188, 114, 92, 180, 114, 84, 180, 106, 84, 172, 102, 76,
+       164, 94, 68, 180, 110, 84, 188, 118, 92, 188, 118, 92, 188, 114, 92,
+       180, 114, 92, 188, 114, 84, 180, 114, 92, 180, 106, 84, 180, 110, 84,
+       180, 114, 84, 188, 114, 92, 180, 114, 84, 180, 110, 92, 180, 110, 84,
+       180, 106, 84, 180, 114, 84, 188, 114, 92, 188, 114, 92, 180, 114, 92,
+       188, 118, 92, 196, 122, 100, 188, 122, 92, 180, 114, 92, 188, 114, 92,
+       180, 110, 84, 180, 114, 84, 188, 118, 92, 188, 122, 92, 188, 118, 92,
+       188, 118, 92, 188, 122, 92, 188, 118, 92, 196, 122, 100, 188, 118, 92,
+      188, 114, 92, 188, 122, 100, 196, 126, 100, 188, 118, 92, 188, 114, 92,
+       188, 114, 92, 180, 114, 84, 180, 110, 84, 180, 110, 84, 188, 118, 92,
+       188, 118, 92, 188, 118, 92, 180, 114, 84, 196, 126, 100, 188, 114, 92,
+       180, 106, 84, 172, 106, 76, 172, 102, 76, 172, 102, 76, 172, 106, 76,
+       180, 110, 84, 188, 118, 92, 180, 110, 92, 180, 114, 92, 180, 106, 92,
+       164, 98, 76, 180, 106, 84, 188, 114, 100, 180, 106, 84, 180, 110, 92,
+       180, 110, 92, 188, 114, 92, 180, 110, 92, 172, 106, 84, 172, 98, 76,
+       172, 98, 76, 164, 98, 76, 164, 102, 76, 164, 102, 84, 172, 102, 84,
+      172, 106, 84, 172, 110, 92, 180, 118, 92, 180, 114, 100, 180, 118, 100,
+     188, 122, 108, 188, 126, 100, 188, 118, 100, 180, 114, 92, 172, 106, 84,
+       164, 102, 84, 172, 102, 84, 172, 110, 92, 172, 110, 92, 172, 110, 84,
+       172, 106, 92, 172, 106, 84, 172, 110, 84, 172, 110, 92, 180, 110, 92,
+       180, 114, 92, 180, 110, 92, 172, 110, 92, 172, 110, 92, 180, 110, 92,
+       172, 110, 92, 180, 110, 84, 164, 102, 84, 164, 98, 76, 156, 94, 76,
+       172, 106, 84, 180, 114, 92, 172, 106, 84, 164, 102, 84, 172, 110, 84,
+       172, 106, 84, 164, 98, 76, 172, 102, 84, 164, 106, 84, 172, 106, 84,
+       172, 106, 92, 172, 110, 92, 180, 110, 92, 180, 110, 92, 172, 110, 92,
+       180, 106, 84, 172, 110, 84, 172, 110, 84, 180, 110, 84, 172, 110, 84,
+       172, 110, 84, 172, 106, 84, 172, 106, 84, 180, 106, 92, 180, 106, 84,
+     188, 114, 100, 188, 118, 100, 180, 114, 100, 180, 126, 108, 148, 90, 68,
+       84, 30, 12, 92, 34, 12, 124, 66, 44, 156, 98, 84, 164, 102, 84,
+       164, 98, 84, 164, 98, 84, 156, 94, 76, 164, 98, 84, 164, 98, 76,
+       156, 90, 76, 156, 94, 76, 164, 94, 76, 156, 90, 76, 156, 90, 68,
+       156, 86, 68, 156, 86, 68, 164, 94, 68, 156, 90, 76, 156, 94, 68,
+       156, 90, 76, 164, 98, 76, 164, 102, 84, 172, 106, 84, 172, 106, 84,
+       172, 102, 84, 148, 82, 60, 148, 86, 68, 156, 90, 68, 156, 90, 68,
+       148, 86, 68, 148, 82, 60, 156, 86, 68, 156, 94, 68, 156, 86, 68,
+       164, 98, 68, 180, 110, 84, 188, 118, 92, 196, 122, 92, 196, 122, 100,
+       188, 118, 92, 188, 118, 92, 180, 110, 92, 172, 106, 76, 172, 106, 76,
+       180, 106, 84, 180, 106, 84, 172, 102, 76, 180, 110, 84, 188, 118, 92,
+      196, 126, 100, 188, 118, 100, 180, 110, 84, 172, 106, 84, 188, 114, 84,
+      188, 122, 100, 196, 122, 100, 188, 118, 92, 180, 114, 84, 180, 114, 92,
+       188, 118, 92, 188, 118, 92, 180, 110, 84, 180, 106, 84, 172, 102, 76,
+       180, 110, 84, 196, 122, 100, 188, 122, 92, 188, 118, 92, 188, 118, 92,
+       188, 122, 92, 188, 114, 92, 188, 114, 84, 180, 114, 92, 188, 114, 84,
+       180, 110, 92, 180, 114, 84, 188, 114, 92, 180, 114, 84, 188, 114, 92,
+       180, 114, 92, 188, 114, 92, 180, 114, 84, 180, 110, 84, 180, 110, 84,
+       188, 118, 92, 188, 114, 92, 180, 114, 84, 188, 118, 92, 180, 114, 92,
+       188, 114, 92, 188, 122, 92, 188, 118, 100, 188, 118, 92, 188, 118, 92,
+       196, 122, 100, 180, 114, 92, 188, 118, 92, 180, 110, 84, 180, 110, 84,
+    196, 130, 100, 204, 134, 108, 196, 126, 100, 188, 118, 100, 188, 122, 92,
+      188, 114, 92, 188, 114, 92, 188, 114, 92, 188, 122, 100, 196, 122, 100,
+      196, 122, 100, 188, 118, 92, 188, 118, 100, 188, 118, 92, 180, 110, 84,
+       180, 110, 84, 180, 110, 84, 172, 102, 76, 172, 102, 76, 180, 110, 84,
+       180, 110, 92, 172, 106, 84, 180, 106, 84, 172, 98, 76, 164, 94, 68,
+       172, 106, 84, 180, 110, 92, 172, 106, 84, 180, 110, 84, 180, 110, 84,
+       180, 114, 92, 180, 110, 92, 180, 110, 92, 172, 106, 84, 180, 106, 84,
+       172, 106, 84, 172, 102, 84, 172, 102, 76, 164, 102, 84, 172, 110, 92,
+     180, 114, 92, 188, 118, 100, 188, 122, 100, 188, 118, 92, 188, 126, 108,
+      188, 122, 100, 180, 118, 100, 172, 110, 92, 164, 106, 84, 172, 102, 84,
+       172, 106, 84, 180, 114, 92, 180, 110, 92, 172, 110, 92, 172, 106, 84,
+       172, 106, 84, 172, 102, 84, 172, 106, 84, 172, 106, 84, 172, 110, 92,
+       172, 110, 92, 172, 110, 92, 172, 110, 84, 180, 110, 92, 172, 114, 92,
+       180, 110, 92, 172, 106, 92, 172, 106, 84, 156, 94, 68, 172, 106, 92,
+       180, 114, 92, 172, 102, 84, 164, 102, 84, 180, 110, 92, 172, 106, 92,
+       164, 98, 76, 164, 102, 84, 172, 102, 84, 164, 102, 84, 172, 106, 84,
+       172, 106, 84, 172, 106, 84, 172, 106, 84, 172, 110, 84, 172, 102, 84,
+       172, 106, 84, 172, 106, 84, 172, 110, 84, 172, 106, 84, 164, 106, 84,
+       172, 106, 84, 172, 102, 84, 172, 102, 84, 172, 102, 84, 180, 114, 100,
+       188, 118, 100, 180, 118, 100, 188, 126, 100, 148, 94, 76, 92, 34, 12,
+       92, 34, 12, 116, 62, 44, 156, 94, 76, 164, 94, 84, 156, 94, 76,
+       156, 94, 76, 148, 86, 68, 148, 86, 76, 148, 82, 68, 148, 78, 60,
+       148, 82, 68, 156, 90, 68, 156, 94, 76, 164, 90, 76, 156, 90, 68,
+       148, 82, 68, 148, 82, 60, 164, 94, 76, 156, 94, 76, 156, 94, 68,
+       164, 94, 76, 164, 102, 84, 164, 102, 84, 172, 102, 84, 164, 102, 84,
+       156, 90, 68, 156, 90, 68, 156, 94, 76, 156, 90, 68, 148, 86, 68,
+       148, 86, 68, 156, 90, 68, 156, 90, 68, 164, 98, 76, 172, 106, 84,
+       180, 110, 84, 180, 110, 84, 180, 114, 92, 188, 118, 92, 180, 110, 84,
+       188, 118, 92, 188, 118, 92, 180, 110, 84, 180, 106, 84, 180, 114, 84,
+       180, 114, 84, 180, 114, 92, 188, 114, 84, 180, 114, 92, 188, 114, 84,
+       188, 118, 92, 188, 114, 92, 180, 114, 92, 188, 114, 84, 180, 110, 84,
+       196, 122, 100, 188, 118, 92, 188, 114, 92, 188, 114, 92, 188, 118, 92,
+       188, 118, 92, 188, 118, 92, 180, 110, 84, 172, 106, 84, 188, 114, 92,
+    196, 122, 100, 188, 122, 100, 196, 122, 92, 196, 122, 100, 188, 122, 100,
+       188, 118, 92, 188, 122, 100, 188, 118, 92, 188, 118, 92, 188, 114, 92,
+       188, 118, 92, 188, 114, 92, 188, 118, 92, 188, 122, 92, 196, 122, 100,
+      188, 126, 100, 188, 118, 92, 180, 110, 84, 188, 114, 92, 188, 122, 100,
+      196, 126, 100, 188, 118, 100, 196, 122, 92, 188, 114, 92, 180, 114, 92,
+     196, 122, 92, 188, 122, 100, 188, 118, 92, 196, 122, 100, 196, 126, 100,
+       188, 118, 92, 188, 118, 92, 172, 98, 76, 164, 94, 68, 180, 110, 92,
+      188, 122, 92, 188, 114, 92, 180, 114, 84, 204, 130, 108, 196, 126, 100,
+       188, 118, 92, 188, 122, 92, 196, 122, 100, 188, 122, 92, 188, 122, 92,
+       188, 114, 92, 180, 114, 84, 180, 110, 84, 180, 110, 84, 180, 114, 92,
+       180, 110, 84, 172, 102, 76, 172, 102, 76, 180, 106, 84, 180, 110, 92,
+       180, 106, 84, 172, 102, 76, 172, 98, 76, 164, 94, 76, 180, 106, 84,
+       180, 110, 92, 180, 106, 84, 172, 102, 76, 172, 98, 84, 172, 102, 76,
+       180, 110, 84, 180, 110, 84, 180, 106, 84, 180, 110, 92, 180, 114, 92,
+       172, 110, 92, 172, 106, 92, 172, 106, 84, 180, 110, 92, 180, 118, 100,
+   188, 122, 100, 180, 122, 100, 188, 118, 100, 188, 126, 108, 188, 118, 100,
+       180, 114, 92, 172, 106, 84, 172, 106, 84, 172, 110, 92, 180, 114, 92,
+       180, 114, 92, 172, 114, 92, 180, 110, 92, 172, 106, 84, 164, 102, 84,
+       164, 102, 84, 172, 106, 84, 172, 106, 84, 172, 106, 92, 180, 110, 84,
+       172, 110, 92, 180, 110, 92, 172, 110, 92, 180, 110, 92, 180, 114, 92,
+       172, 114, 92, 180, 110, 92, 164, 98, 76, 172, 110, 92, 180, 114, 92,
+       172, 106, 84, 172, 106, 84, 172, 110, 92, 172, 106, 84, 164, 102, 84,
+       172, 106, 84, 172, 110, 84, 172, 106, 92, 172, 106, 84, 172, 106, 84,
+       172, 110, 92, 172, 110, 92, 180, 110, 84, 172, 106, 84, 172, 106, 84,
+       180, 110, 84, 172, 110, 84, 172, 114, 92, 172, 110, 92, 172, 110, 84,
+       172, 110, 84, 180, 106, 92, 172, 102, 84, 180, 106, 92, 172, 106, 92,
+       172, 106, 92, 180, 122, 100, 148, 98, 76, 92, 34, 12, 100, 42, 28,
+       116, 54, 36, 148, 86, 68, 148, 90, 76, 148, 86, 76, 148, 86, 76,
+       140, 78, 60, 148, 78, 60, 140, 78, 60, 148, 78, 60, 148, 78, 60,
+       148, 82, 60, 156, 86, 68, 156, 90, 68, 156, 90, 68, 156, 90, 68,
+       148, 86, 68, 172, 102, 84, 164, 102, 84, 172, 102, 84, 164, 102, 84,
+       172, 106, 84, 172, 106, 84, 164, 102, 84, 164, 98, 76, 156, 94, 76,
+       164, 98, 76, 156, 94, 76, 164, 98, 76, 164, 94, 76, 164, 94, 76,
+       156, 94, 76, 164, 98, 76, 180, 110, 84, 188, 114, 84, 188, 114, 92,
+       180, 106, 84, 188, 114, 84, 188, 118, 92, 188, 114, 92, 188, 118, 92,
+       188, 118, 92, 188, 114, 92, 180, 110, 84, 188, 114, 92, 188, 118, 92,
+       188, 114, 92, 188, 118, 92, 188, 118, 92, 188, 114, 92, 188, 118, 92,
+       188, 118, 92, 188, 118, 92, 188, 114, 92, 180, 110, 84, 196, 122, 100,
+       188, 118, 92, 180, 114, 84, 188, 114, 92, 188, 122, 92, 196, 122, 100,
+       188, 118, 92, 188, 114, 92, 180, 110, 84, 188, 118, 92, 196, 122, 100,
+       196, 122, 92, 188, 118, 92, 188, 118, 100, 196, 122, 92, 188, 118, 92,
+     196, 122, 100, 196, 122, 92, 196, 122, 100, 188, 122, 92, 196, 122, 100,
+     188, 122, 92, 196, 122, 100, 196, 122, 100, 196, 122, 100, 196, 122, 92,
+       188, 114, 92, 180, 110, 84, 188, 114, 84, 188, 118, 92, 196, 122, 92,
+       188, 118, 92, 188, 122, 92, 188, 118, 92, 188, 114, 92, 188, 118, 92,
+      196, 122, 92, 188, 118, 92, 188, 118, 92, 196, 126, 100, 204, 130, 108,
+       204, 134, 108, 188, 122, 92, 180, 106, 84, 188, 114, 92, 188, 118, 92,
+    188, 118, 92, 196, 122, 100, 204, 134, 108, 196, 130, 100, 196, 122, 100,
+      188, 122, 92, 196, 122, 100, 196, 122, 100, 188, 118, 92, 188, 114, 92,
+       188, 114, 84, 180, 110, 84, 180, 110, 84, 188, 114, 92, 180, 110, 84,
+       180, 106, 84, 180, 106, 84, 188, 114, 92, 188, 118, 92, 188, 114, 92,
+       180, 110, 92, 180, 106, 84, 172, 102, 84, 180, 110, 84, 188, 118, 92,
+       180, 106, 84, 180, 106, 84, 172, 106, 84, 180, 106, 84, 180, 106, 92,
+       188, 114, 92, 180, 110, 92, 180, 110, 84, 188, 114, 92, 188, 114, 100,
+      180, 114, 92, 172, 110, 92, 180, 114, 92, 188, 122, 100, 188, 122, 108,
+    188, 122, 100, 180, 118, 100, 188, 122, 100, 180, 118, 100, 180, 114, 92,
+       180, 110, 92, 180, 114, 92, 180, 114, 92, 180, 114, 92, 172, 110, 92,
+       180, 110, 92, 172, 110, 84, 172, 106, 84, 164, 102, 84, 172, 102, 84,
+       164, 106, 84, 172, 106, 84, 180, 110, 92, 172, 114, 92, 180, 110, 92,
+       172, 110, 92, 180, 110, 92, 172, 110, 84, 172, 110, 92, 172, 110, 84,
+       180, 110, 92, 164, 102, 84, 172, 110, 92, 180, 114, 92, 180, 114, 92,
+       180, 110, 92, 172, 110, 84, 172, 110, 92, 172, 106, 84, 180, 114, 92,
+       180, 110, 92, 180, 110, 92, 172, 110, 92, 172, 110, 92, 172, 110, 84,
+       172, 110, 92, 180, 110, 92, 172, 110, 92, 180, 110, 84, 180, 114, 92,
+       180, 114, 92, 180, 114, 92, 180, 118, 92, 180, 114, 92, 180, 114, 92,
+    188, 118, 100, 188, 114, 92, 196, 122, 108, 188, 118, 100, 180, 118, 100,
+       188, 130, 108, 156, 106, 84, 100, 42, 28, 84, 30, 12, 116, 54, 36,
+       156, 90, 76, 156, 90, 76, 156, 90, 68, 156, 94, 76, 148, 86, 68,
+       164, 94, 84, 156, 94, 76, 156, 90, 76, 148, 86, 68, 148, 78, 60,
+       148, 78, 60, 148, 86, 68, 164, 94, 76, 164, 94, 76, 172, 98, 84,
+       164, 98, 76, 164, 102, 76, 172, 106, 84, 180, 110, 92, 180, 118, 100,
+       180, 118, 100, 180, 110, 92, 172, 110, 92, 164, 98, 76, 164, 94, 76,
+       164, 98, 76, 164, 98, 84, 164, 102, 76, 164, 102, 84, 172, 102, 84,
+      164, 102, 76, 188, 118, 92, 188, 122, 100, 196, 122, 100, 188, 114, 92,
+      180, 114, 92, 188, 114, 92, 196, 122, 100, 196, 122, 100, 188, 118, 92,
+       188, 114, 92, 188, 118, 92, 188, 118, 92, 188, 118, 92, 180, 110, 84,
+    196, 122, 100, 196, 122, 100, 188, 122, 92, 196, 122, 100, 196, 126, 100,
+      196, 122, 100, 188, 118, 92, 188, 118, 92, 196, 122, 100, 188, 118, 92,
+     188, 114, 92, 188, 118, 92, 196, 122, 100, 196, 126, 100, 196, 122, 100,
+       188, 118, 92, 188, 114, 84, 188, 122, 92, 196, 122, 100, 188, 122, 92,
+      188, 118, 92, 196, 122, 100, 196, 122, 92, 188, 118, 92, 196, 122, 100,
+   196, 126, 100, 196, 122, 100, 196, 126, 100, 196, 126, 100, 196, 126, 100,
+   196, 122, 100, 196, 126, 100, 196, 122, 100, 196, 126, 100, 196, 122, 100,
+    188, 118, 92, 188, 118, 100, 196, 126, 100, 196, 126, 100, 196, 122, 100,
+     196, 126, 100, 196, 122, 100, 188, 118, 92, 188, 122, 100, 196, 122, 92,
+       188, 114, 92, 188, 114, 92, 188, 122, 92, 188, 114, 92, 204, 130, 108,
+      196, 126, 100, 188, 118, 92, 188, 118, 92, 188, 118, 92, 196, 122, 100,
+    196, 126, 100, 204, 130, 108, 196, 126, 100, 196, 122, 100, 188, 118, 92,
+     196, 122, 100, 196, 126, 100, 196, 122, 100, 188, 118, 92, 188, 114, 92,
+       188, 114, 92, 188, 118, 92, 188, 118, 92, 188, 118, 92, 180, 114, 84,
+      188, 114, 92, 196, 126, 100, 196, 122, 100, 188, 114, 92, 180, 110, 84,
+       180, 106, 84, 172, 98, 76, 180, 110, 92, 188, 114, 92, 172, 102, 84,
+       196, 126, 100, 188, 114, 92, 188, 114, 92, 188, 114, 92, 188, 114, 92,
+      180, 110, 84, 188, 114, 92, 188, 114, 92, 188, 122, 100, 180, 118, 100,
+    180, 114, 92, 180, 118, 100, 188, 122, 100, 188, 126, 108, 188, 122, 100,
+    180, 118, 100, 188, 122, 100, 180, 118, 100, 180, 110, 92, 180, 114, 100,
+      180, 118, 100, 188, 118, 100, 172, 114, 92, 172, 106, 84, 172, 110, 92,
+       172, 106, 92, 172, 102, 84, 164, 102, 84, 172, 102, 76, 172, 106, 84,
+       172, 106, 92, 180, 114, 92, 180, 110, 92, 180, 114, 92, 172, 110, 92,
+       172, 110, 84, 172, 106, 84, 172, 106, 84, 172, 106, 92, 172, 110, 84,
+      172, 106, 84, 180, 110, 92, 180, 114, 92, 180, 118, 100, 180, 118, 100,
+       180, 110, 92, 172, 110, 92, 180, 110, 92, 180, 114, 92, 172, 114, 92,
+       172, 110, 92, 172, 106, 84, 172, 106, 84, 172, 106, 92, 172, 110, 84,
+       172, 106, 84, 180, 110, 84, 172, 110, 92, 180, 114, 92, 180, 114, 92,
+       180, 118, 92, 180, 118, 92, 180, 114, 92, 180, 118, 92, 188, 114, 100,
+    180, 110, 92, 188, 122, 108, 188, 122, 100, 180, 118, 108, 188, 126, 108,
+       148, 90, 76, 84, 30, 12, 92, 38, 28, 140, 78, 60, 156, 90, 68,
+       156, 90, 76, 156, 90, 68, 156, 94, 76, 164, 98, 76, 156, 94, 76,
+       164, 94, 76, 156, 94, 68, 156, 94, 76, 156, 90, 68, 156, 86, 68,
+       148, 86, 68, 156, 86, 68, 156, 94, 76, 164, 102, 76, 180, 110, 92,
+       172, 102, 84, 172, 98, 84, 172, 106, 84, 180, 114, 92, 188, 122, 100,
+       188, 114, 92, 172, 110, 92, 172, 102, 84, 164, 98, 76, 156, 90, 68,
+       156, 86, 68, 164, 94, 76, 172, 102, 84, 172, 106, 84, 180, 110, 92,
+      188, 114, 92, 196, 126, 100, 196, 126, 100, 188, 118, 92, 180, 110, 92,
+    188, 118, 92, 196, 130, 108, 196, 126, 100, 196, 122, 100, 188, 126, 100,
+     196, 126, 108, 196, 126, 100, 196, 122, 100, 180, 118, 92, 188, 114, 92,
+     188, 118, 92, 196, 122, 100, 188, 122, 100, 188, 122, 100, 188, 118, 92,
+     188, 118, 92, 188, 118, 92, 196, 126, 100, 188, 122, 100, 196, 122, 100,
+   188, 122, 100, 196, 126, 100, 196, 130, 100, 196, 126, 108, 196, 130, 100,
+   196, 122, 100, 188, 122, 100, 196, 126, 108, 196, 126, 100, 204, 130, 108,
+   196, 130, 100, 196, 130, 108, 196, 130, 108, 188, 122, 100, 196, 126, 100,
+   188, 122, 100, 196, 122, 100, 188, 122, 100, 196, 126, 100, 196, 126, 100,
+   196, 130, 100, 196, 130, 108, 196, 130, 100, 196, 126, 100, 196, 126, 100,
+   204, 130, 108, 196, 130, 100, 196, 126, 108, 188, 126, 100, 196, 122, 100,
+   196, 126, 100, 196, 130, 108, 204, 130, 108, 196, 126, 108, 196, 130, 100,
+   196, 122, 100, 188, 122, 100, 196, 126, 100, 204, 134, 108, 204, 134, 108,
+     196, 126, 100, 188, 114, 92, 188, 118, 92, 188, 122, 100, 196, 126, 100,
+   196, 130, 108, 196, 126, 108, 196, 126, 100, 196, 126, 100, 196, 126, 100,
+    188, 122, 92, 188, 122, 100, 188, 122, 100, 196, 122, 100, 188, 122, 100,
+    196, 122, 100, 188, 122, 100, 196, 122, 100, 188, 122, 100, 188, 118, 92,
+   188, 118, 100, 196, 126, 100, 188, 122, 100, 188, 122, 100, 188, 118, 100,
+       188, 118, 92, 188, 118, 92, 188, 114, 92, 188, 118, 92, 188, 122, 100,
+       188, 114, 92, 180, 114, 92, 180, 114, 84, 172, 102, 84, 172, 106, 84,
+    188, 118, 92, 188, 118, 100, 188, 122, 100, 188, 122, 100, 180, 118, 100,
+   188, 118, 100, 188, 122, 100, 188, 122, 100, 188, 118, 100, 180, 118, 100,
+       196, 130, 108, 180, 114, 92, 172, 106, 84, 172, 110, 92, 180, 114, 92,
+       172, 110, 92, 172, 106, 84, 172, 106, 84, 180, 110, 92, 180, 114, 92,
+       180, 114, 92, 180, 110, 92, 164, 102, 84, 164, 98, 84, 172, 102, 84,
+       172, 106, 84, 172, 106, 92, 172, 106, 84, 172, 106, 84, 180, 106, 92,
+       172, 106, 92, 180, 110, 92, 180, 110, 92, 172, 110, 92, 172, 102, 84,
+       172, 110, 92, 180, 114, 92, 180, 114, 100, 180, 114, 92, 172, 110, 92,
+       180, 114, 92, 172, 110, 92, 180, 114, 92, 180, 114, 92, 180, 110, 92,
+       180, 110, 92, 172, 110, 92, 180, 110, 84, 172, 110, 92, 172, 110, 92,
+       180, 110, 92, 180, 110, 92, 180, 114, 92, 180, 114, 92, 180, 118, 100,
+       180, 118, 100, 180, 114, 92, 180, 114, 92, 172, 102, 84, 172, 102, 84,
+       180, 106, 92, 164, 94, 84, 156, 94, 76, 172, 110, 100, 140, 82, 68,
+       92, 38, 28, 92, 34, 20, 124, 58, 44, 140, 78, 60, 148, 86, 68,
+       156, 90, 68, 156, 94, 76, 164, 94, 76, 148, 90, 68, 156, 90, 68,
+       164, 94, 76, 156, 94, 76, 156, 94, 76, 156, 90, 68, 148, 86, 60,
+       148, 86, 68, 156, 90, 68, 164, 94, 76, 164, 98, 76, 156, 94, 76,
+       156, 94, 76, 172, 98, 84, 180, 110, 92, 180, 118, 100, 188, 114, 100,
+       180, 114, 92, 172, 102, 84, 164, 98, 84, 164, 94, 76, 156, 94, 76,
+       156, 90, 68, 164, 94, 76, 164, 94, 76, 164, 94, 76, 164, 98, 76,
+    180, 110, 92, 196, 126, 100, 196, 126, 108, 204, 130, 100, 196, 126, 108,
+   196, 130, 108, 196, 126, 100, 188, 122, 100, 196, 122, 100, 196, 126, 100,
+    196, 126, 100, 188, 122, 100, 188, 118, 92, 196, 130, 108, 196, 134, 108,
+   204, 134, 108, 204, 134, 108, 196, 130, 108, 196, 130, 108, 196, 126, 108,
+   196, 130, 108, 196, 126, 100, 188, 126, 100, 188, 122, 100, 196, 126, 100,
+   196, 126, 100, 196, 126, 108, 196, 126, 100, 188, 126, 100, 188, 122, 100,
+   196, 126, 100, 188, 122, 100, 188, 122, 100, 188, 122, 100, 196, 122, 100,
+   196, 126, 100, 196, 126, 108, 204, 130, 108, 196, 130, 108, 196, 130, 108,
+   196, 130, 108, 196, 130, 108, 204, 130, 108, 196, 130, 108, 204, 130, 108,
+   196, 130, 108, 196, 126, 100, 188, 126, 108, 196, 126, 100, 196, 126, 108,
+   196, 130, 108, 196, 126, 100, 196, 126, 100, 196, 126, 100, 188, 126, 100,
+   196, 126, 100, 196, 126, 108, 196, 130, 100, 196, 126, 108, 188, 126, 100,
+   196, 122, 100, 188, 126, 100, 196, 130, 108, 196, 130, 108, 188, 122, 100,
+      180, 114, 92, 188, 118, 92, 188, 122, 100, 188, 122, 100, 188, 118, 92,
+    188, 122, 100, 188, 118, 100, 188, 122, 100, 188, 118, 92, 188, 118, 100,
+      188, 118, 92, 188, 122, 100, 188, 118, 92, 188, 122, 92, 188, 118, 100,
+       188, 118, 92, 188, 118, 92, 188, 118, 92, 188, 118, 100, 180, 118, 92,
+      188, 122, 100, 188, 122, 100, 188, 118, 92, 188, 118, 92, 180, 114, 92,
+      180, 114, 92, 180, 114, 92, 188, 118, 92, 196, 126, 100, 188, 118, 100,
+      188, 122, 100, 188, 118, 92, 180, 110, 84, 180, 114, 92, 188, 122, 100,
+       188, 122, 100, 180, 114, 92, 180, 114, 92, 180, 114, 92, 180, 114, 92,
+      180, 118, 100, 180, 118, 100, 180, 114, 92, 172, 110, 92, 172, 106, 84,
+       164, 94, 76, 164, 102, 84, 180, 114, 92, 180, 118, 100, 172, 106, 84,
+       164, 98, 76, 164, 98, 84, 164, 98, 76, 164, 98, 84, 172, 102, 84,
+       172, 102, 84, 164, 98, 76, 172, 102, 84, 172, 106, 84, 180, 110, 92,
+       180, 110, 92, 180, 110, 92, 180, 110, 92, 180, 110, 92, 180, 110, 92,
+       180, 110, 92, 172, 110, 92, 180, 110, 92, 172, 106, 84, 172, 110, 92,
+       180, 118, 92, 188, 118, 100, 180, 114, 92, 180, 114, 92, 180, 114, 92,
+    180, 114, 92, 180, 118, 100, 180, 118, 100, 180, 118, 100, 180, 118, 100,
+     188, 118, 92, 180, 118, 100, 180, 118, 100, 188, 118, 100, 180, 110, 92,
+   172, 110, 100, 180, 114, 100, 180, 118, 100, 180, 118, 100, 180, 118, 100,
+     188, 122, 100, 188, 118, 100, 180, 106, 84, 172, 102, 84, 188, 114, 100,
+       164, 98, 76, 164, 98, 84, 172, 110, 100, 132, 78, 68, 92, 34, 20,
+       92, 34, 20, 132, 70, 52, 156, 90, 68, 164, 102, 76, 164, 98, 76,
+       164, 98, 84, 164, 98, 76, 156, 90, 68, 156, 94, 76, 148, 82, 60,
+       148, 86, 68, 148, 82, 60, 148, 82, 60, 148, 82, 60, 148, 78, 60,
+       148, 82, 60, 148, 86, 68, 148, 82, 68, 148, 82, 60, 156, 82, 68,
+       156, 90, 68, 164, 98, 76, 172, 102, 84, 172, 106, 84, 172, 106, 84,
+       164, 102, 76, 172, 98, 84, 164, 98, 76, 156, 90, 76, 156, 82, 60,
+       140, 78, 60, 140, 70, 52, 132, 70, 52, 156, 82, 60, 172, 98, 76,
+    188, 114, 92, 196, 122, 100, 196, 126, 100, 196, 126, 108, 196, 130, 108,
+   196, 130, 108, 196, 126, 100, 188, 126, 100, 196, 126, 100, 188, 126, 100,
+   196, 126, 100, 188, 122, 100, 196, 130, 108, 204, 130, 108, 196, 130, 108,
+   196, 130, 108, 196, 122, 100, 188, 122, 100, 196, 122, 100, 188, 126, 100,
+   196, 126, 100, 196, 122, 100, 188, 122, 100, 188, 122, 100, 196, 122, 100,
+   188, 126, 100, 188, 122, 100, 188, 122, 100, 196, 122, 100, 188, 122, 100,
+    196, 126, 100, 188, 122, 100, 188, 118, 100, 188, 118, 92, 188, 122, 100,
+   188, 126, 100, 196, 126, 100, 196, 126, 100, 196, 130, 108, 196, 126, 100,
+   196, 126, 100, 196, 126, 108, 196, 126, 100, 188, 122, 100, 196, 130, 108,
+   196, 130, 100, 196, 126, 108, 196, 126, 100, 196, 130, 108, 204, 130, 108,
+   196, 130, 108, 196, 126, 108, 196, 130, 108, 204, 134, 108, 196, 130, 108,
+   196, 130, 108, 196, 130, 108, 196, 130, 108, 204, 130, 108, 196, 134, 108,
+   204, 130, 108, 204, 134, 116, 196, 130, 108, 196, 122, 100, 188, 122, 100,
+    196, 126, 108, 196, 126, 100, 196, 126, 100, 188, 118, 100, 188, 118, 92,
+     188, 118, 92, 188, 122, 92, 188, 118, 100, 188, 122, 100, 188, 122, 100,
+    188, 122, 100, 188, 122, 100, 188, 118, 100, 188, 122, 92, 188, 118, 100,
+    188, 122, 100, 188, 122, 100, 188, 122, 100, 188, 122, 100, 188, 118, 92,
+     188, 122, 100, 188, 122, 100, 188, 118, 100, 188, 118, 92, 188, 114, 92,
+    188, 122, 100, 188, 122, 100, 188, 122, 100, 188, 118, 92, 188, 122, 100,
+     188, 122, 100, 180, 110, 92, 180, 114, 92, 188, 122, 100, 188, 122, 100,
+   188, 118, 100, 180, 118, 100, 180, 118, 100, 188, 122, 100, 188, 122, 100,
+       188, 122, 100, 180, 114, 92, 180, 110, 92, 172, 110, 92, 164, 102, 76,
+      164, 102, 84, 188, 118, 100, 180, 118, 100, 172, 106, 84, 164, 102, 84,
+       172, 110, 92, 180, 110, 92, 180, 110, 92, 180, 110, 92, 180, 110, 92,
+       172, 106, 84, 180, 110, 92, 172, 110, 92, 180, 110, 92, 180, 110, 92,
+       180, 114, 92, 180, 110, 92, 180, 114, 92, 172, 110, 92, 180, 110, 84,
+       180, 110, 92, 180, 110, 92, 172, 102, 84, 172, 106, 84, 172, 110, 92,
+       180, 110, 92, 172, 110, 92, 172, 110, 92, 172, 106, 92, 172, 110, 92,
+       180, 114, 92, 180, 114, 92, 180, 114, 92, 180, 114, 92, 180, 114, 100,
+       180, 114, 92, 180, 114, 92, 180, 114, 92, 180, 110, 100, 180, 114, 92,
+     180, 114, 92, 180, 114, 100, 180, 118, 92, 180, 122, 100, 188, 122, 100,
+     188, 122, 100, 188, 118, 100, 180, 110, 92, 188, 114, 100, 172, 102, 92,
+       172, 106, 92, 180, 118, 100, 132, 78, 68, 92, 34, 20, 92, 34, 20,
+       132, 74, 60, 156, 90, 68, 164, 94, 76, 148, 90, 68, 156, 86, 68,
+       156, 90, 68, 156, 90, 68, 164, 98, 84, 156, 90, 68, 156, 90, 68,
+       156, 90, 76, 156, 94, 76, 164, 98, 76, 164, 98, 84, 164, 102, 76,
+       172, 102, 84, 172, 102, 84, 172, 106, 84, 172, 106, 84, 180, 110, 92,
+       180, 110, 92, 180, 110, 92, 180, 114, 100, 180, 114, 92, 180, 110, 92,
+       180, 114, 92, 180, 114, 92, 180, 110, 92, 164, 98, 84, 164, 94, 76,
+       156, 90, 68, 156, 90, 68, 172, 102, 84, 180, 110, 92, 188, 118, 92,
+    196, 122, 100, 196, 122, 100, 188, 122, 100, 188, 122, 100, 188, 118, 92,
+     188, 118, 100, 188, 118, 100, 180, 114, 92, 188, 114, 92, 188, 118, 100,
+    188, 118, 92, 196, 126, 100, 188, 126, 100, 196, 122, 100, 188, 122, 100,
+     180, 118, 92, 188, 118, 92, 188, 122, 100, 196, 122, 100, 196, 126, 108,
+   188, 126, 100, 188, 122, 100, 196, 122, 100, 188, 126, 100, 196, 122, 100,
+       188, 122, 100, 188, 118, 92, 180, 110, 92, 180, 114, 92, 188, 118, 92,
+       180, 114, 92, 180, 110, 84, 172, 110, 84, 180, 114, 92, 188, 114, 92,
+   188, 126, 100, 196, 126, 108, 196, 126, 100, 196, 130, 108, 196, 126, 108,
+   188, 126, 100, 188, 126, 100, 196, 122, 100, 188, 122, 100, 188, 122, 100,
+    188, 118, 92, 188, 122, 100, 188, 122, 100, 188, 126, 100, 188, 122, 100,
+    188, 118, 92, 196, 130, 108, 196, 130, 108, 196, 126, 108, 196, 126, 100,
+   196, 130, 108, 196, 130, 108, 196, 130, 108, 204, 130, 108, 196, 130, 108,
+     196, 130, 100, 196, 122, 100, 180, 118, 92, 188, 118, 92, 188, 122, 100,
+      196, 126, 100, 180, 118, 100, 188, 118, 92, 180, 118, 92, 180, 114, 92,
+       188, 118, 92, 180, 114, 92, 188, 118, 92, 180, 114, 92, 188, 114, 92,
+       180, 114, 92, 180, 114, 92, 180, 114, 92, 180, 114, 92, 188, 118, 92,
+       180, 114, 92, 188, 118, 92, 188, 118, 92, 180, 110, 92, 188, 114, 92,
+       188, 122, 92, 180, 118, 92, 180, 110, 92, 180, 110, 92, 180, 118, 92,
+     196, 122, 100, 188, 118, 100, 180, 114, 92, 188, 122, 100, 188, 118, 92,
+      180, 110, 92, 180, 114, 84, 188, 118, 100, 180, 118, 92, 188, 118, 100,
+   188, 122, 100, 188, 122, 100, 188, 122, 108, 188, 122, 100, 188, 122, 100,
+       180, 114, 92, 172, 106, 84, 164, 98, 84, 156, 94, 76, 164, 94, 76,
+       164, 102, 76, 172, 102, 84, 164, 98, 76, 172, 106, 84, 188, 122, 100,
+      188, 118, 100, 188, 118, 100, 180, 114, 92, 180, 114, 92, 180, 110, 92,
+       180, 110, 92, 180, 110, 92, 172, 110, 92, 180, 110, 92, 172, 110, 92,
+       180, 110, 84, 172, 110, 92, 180, 110, 92, 172, 106, 92, 172, 110, 84,
+       172, 106, 92, 172, 102, 84, 172, 106, 84, 172, 110, 92, 172, 110, 84,
+       172, 106, 84, 172, 106, 84, 172, 106, 84, 172, 106, 84, 172, 102, 84,
+       164, 102, 84, 172, 106, 84, 172, 106, 84, 172, 106, 84, 172, 106, 92,
+       172, 106, 84, 172, 106, 92, 180, 110, 92, 172, 110, 92, 180, 106, 92,
+       172, 110, 92, 172, 110, 92, 180, 114, 92, 180, 118, 92, 180, 118, 92,
+    188, 118, 100, 188, 114, 100, 188, 118, 100, 180, 110, 92, 180, 118, 108,
+       180, 122, 108, 132, 78, 68, 92, 34, 20, 92, 34, 20, 108, 50, 28,
+       132, 66, 52, 140, 74, 52, 132, 70, 52, 140, 74, 52, 140, 78, 60,
+       148, 86, 60, 164, 94, 76, 156, 94, 68, 156, 94, 76, 164, 98, 76,
+       164, 102, 84, 172, 106, 84, 172, 106, 84, 172, 110, 92, 172, 106, 84,
+       180, 110, 92, 180, 110, 92, 180, 114, 92, 180, 110, 92, 180, 110, 92,
+       180, 114, 92, 180, 110, 92, 180, 114, 92, 172, 106, 92, 180, 110, 92,
+       180, 114, 92, 180, 114, 92, 180, 110, 92, 180, 114, 92, 188, 114, 100,
+       188, 122, 100, 180, 110, 84, 188, 114, 92, 180, 114, 92, 188, 114, 92,
+       180, 110, 92, 180, 110, 92, 180, 110, 92, 180, 114, 92, 180, 114, 84,
+       180, 114, 92, 180, 110, 84, 180, 110, 92, 172, 110, 84, 180, 110, 92,
+       180, 114, 92, 180, 114, 92, 180, 114, 92, 180, 110, 92, 180, 110, 84,
+       180, 110, 92, 188, 118, 92, 188, 122, 100, 180, 114, 84, 180, 110, 92,
+       180, 110, 84, 180, 110, 84, 180, 110, 92, 180, 114, 92, 180, 106, 84,
+       172, 106, 84, 164, 102, 76, 172, 102, 84, 180, 110, 84, 180, 110, 84,
+       172, 110, 92, 180, 106, 84, 180, 110, 84, 180, 110, 92, 180, 118, 92,
+     188, 118, 92, 188, 118, 100, 188, 122, 100, 188, 122, 92, 188, 118, 100,
+       188, 118, 92, 180, 114, 92, 188, 118, 92, 180, 114, 92, 180, 110, 92,
+       180, 114, 92, 180, 114, 92, 188, 114, 92, 180, 114, 92, 180, 114, 92,
+       188, 114, 92, 188, 118, 92, 188, 122, 92, 188, 118, 100, 196, 122, 92,
+     188, 122, 100, 188, 118, 100, 188, 122, 92, 188, 118, 100, 188, 118, 92,
+       180, 114, 92, 172, 106, 84, 180, 110, 92, 180, 118, 92, 188, 114, 92,
+       172, 110, 84, 180, 110, 84, 180, 110, 92, 180, 110, 92, 180, 110, 84,
+       172, 110, 84, 180, 106, 84, 172, 106, 84, 172, 106, 84, 172, 102, 84,
+       172, 106, 76, 172, 106, 84, 172, 106, 84, 172, 106, 84, 172, 106, 84,
+       180, 110, 84, 172, 106, 84, 172, 102, 76, 172, 106, 84, 180, 110, 84,
+       172, 106, 84, 172, 102, 84, 172, 102, 76, 180, 106, 84, 180, 114, 92,
+       188, 118, 92, 180, 114, 92, 188, 118, 92, 188, 122, 100, 180, 110, 84,
+       180, 110, 92, 188, 118, 92, 180, 114, 92, 180, 114, 92, 172, 114, 92,
+       180, 114, 92, 180, 114, 92, 180, 114, 92, 172, 110, 84, 164, 98, 84,
+       156, 94, 76, 140, 74, 52, 140, 78, 60, 148, 86, 68, 156, 90, 68,
+       156, 94, 76, 156, 98, 76, 172, 102, 84, 172, 110, 92, 172, 106, 92,
+       172, 106, 84, 172, 106, 84, 172, 102, 84, 172, 106, 84, 172, 106, 84,
+       172, 106, 84, 180, 106, 84, 172, 106, 84, 172, 102, 84, 172, 106, 84,
+       172, 102, 84, 172, 106, 84, 180, 106, 84, 172, 106, 84, 172, 106, 84,
+       172, 106, 84, 172, 110, 92, 180, 110, 92, 180, 110, 92, 172, 106, 92,
+       172, 106, 84, 172, 106, 84, 172, 110, 92, 164, 102, 84, 172, 102, 84,
+       164, 106, 84, 172, 106, 84, 172, 106, 92, 172, 106, 84, 172, 106, 84,
+       172, 106, 84, 172, 106, 92, 172, 106, 92, 164, 102, 84, 172, 102, 84,
+       164, 106, 84, 164, 102, 84, 172, 106, 84, 172, 106, 84, 180, 110, 92,
+      180, 106, 92, 180, 110, 92, 172, 102, 92, 172, 114, 100, 180, 118, 100,
+       132, 74, 60, 92, 34, 20, 92, 34, 12, 124, 58, 44, 148, 78, 60,
+       148, 90, 68, 156, 86, 68, 156, 94, 76, 156, 94, 76, 156, 90, 68,
+       164, 98, 76, 156, 94, 76, 164, 94, 76, 156, 94, 68, 164, 94, 76,
+       164, 98, 76, 164, 98, 84, 164, 98, 76, 156, 98, 76, 164, 94, 76,
+       164, 98, 76, 164, 98, 84, 164, 98, 84, 172, 102, 76, 164, 102, 84,
+       172, 102, 84, 172, 102, 84, 172, 106, 84, 172, 106, 92, 180, 106, 84,
+       172, 106, 92, 172, 106, 84, 180, 110, 92, 180, 110, 92, 180, 114, 92,
+       180, 110, 92, 180, 106, 84, 180, 114, 92, 188, 118, 92, 188, 118, 92,
+       188, 114, 92, 188, 118, 92, 188, 118, 92, 188, 118, 100, 188, 118, 92,
+      188, 122, 100, 188, 122, 100, 188, 118, 92, 180, 118, 92, 188, 118, 92,
+       188, 118, 100, 188, 118, 92, 180, 118, 92, 188, 114, 92, 180, 118, 92,
+      188, 122, 100, 196, 130, 108, 188, 114, 92, 180, 114, 92, 180, 118, 92,
+       188, 118, 92, 188, 118, 100, 188, 118, 92, 180, 114, 92, 180, 110, 84,
+       180, 110, 92, 180, 114, 84, 180, 114, 92, 180, 114, 92, 188, 118, 92,
+     188, 118, 100, 188, 118, 92, 188, 118, 100, 188, 118, 92, 188, 118, 100,
+    188, 122, 92, 188, 122, 100, 188, 122, 100, 188, 122, 100, 188, 122, 100,
+    196, 122, 100, 188, 126, 100, 188, 122, 100, 188, 122, 92, 188, 122, 100,
+     196, 122, 100, 188, 126, 100, 196, 122, 100, 188, 118, 92, 180, 118, 92,
+    188, 118, 100, 188, 118, 92, 188, 122, 100, 188, 122, 100, 188, 122, 100,
+     188, 122, 100, 188, 122, 100, 188, 118, 92, 188, 118, 100, 180, 114, 92,
+       180, 110, 84, 180, 110, 92, 188, 118, 92, 180, 114, 92, 180, 110, 92,
+       188, 118, 92, 180, 118, 92, 188, 114, 92, 180, 114, 92, 180, 110, 92,
+       180, 110, 84, 180, 110, 84, 180, 110, 84, 180, 110, 84, 180, 110, 84,
+       180, 106, 84, 180, 110, 84, 180, 110, 92, 180, 110, 84, 180, 110, 92,
+       180, 110, 92, 172, 106, 84, 180, 110, 84, 180, 114, 92, 180, 110, 92,
+       172, 110, 84, 172, 110, 84, 180, 110, 92, 188, 118, 92, 188, 118, 92,
+       180, 114, 92, 188, 118, 100, 188, 118, 92, 180, 110, 92, 180, 114, 84,
+       188, 118, 100, 180, 114, 92, 180, 110, 92, 172, 110, 92, 172, 110, 92,
+       172, 110, 92, 172, 110, 92, 172, 102, 84, 164, 98, 76, 156, 94, 76,
+       156, 94, 68, 172, 102, 76, 172, 110, 92, 172, 110, 84, 172, 106, 92,
+       172, 110, 84, 172, 106, 84, 172, 106, 84, 172, 106, 84, 180, 106, 92,
+       172, 106, 84, 172, 106, 92, 172, 102, 84, 172, 102, 84, 172, 106, 92,
+       172, 106, 84, 172, 102, 84, 172, 102, 84, 172, 102, 84, 172, 102, 84,
+       172, 106, 84, 172, 102, 84, 172, 106, 92, 172, 102, 84, 164, 98, 76,
+       164, 102, 84, 164, 102, 84, 164, 102, 76, 164, 98, 76, 164, 98, 76,
+       164, 98, 84, 164, 98, 76, 164, 98, 76, 164, 98, 76, 164, 102, 84,
+       172, 102, 84, 164, 102, 84, 164, 102, 84, 164, 102, 84, 164, 98, 76,
+       172, 102, 84, 172, 102, 84, 172, 102, 84, 164, 98, 84, 164, 102, 76,
+       164, 98, 76, 164, 98, 76, 164, 98, 76, 172, 98, 84, 172, 98, 76,
+       172, 98, 84, 164, 94, 84, 172, 110, 92, 172, 110, 100, 116, 62, 52,
+       92, 34, 12, 92, 34, 20, 148, 90, 68, 172, 106, 84, 172, 110, 92,
+       172, 106, 84, 172, 110, 84, 180, 110, 92, 164, 102, 84, 172, 106, 84,
+       172, 106, 84, 172, 106, 84, 164, 102, 84, 172, 106, 84, 172, 106, 84,
+       172, 110, 92, 172, 106, 84, 172, 106, 92, 172, 106, 84, 172, 102, 84,
+       172, 106, 84, 172, 106, 84, 180, 110, 92, 180, 110, 92, 180, 110, 92,
+      180, 110, 92, 188, 118, 100, 188, 114, 100, 180, 114, 92, 180, 110, 92,
+       180, 110, 92, 172, 110, 92, 180, 110, 92, 172, 106, 84, 188, 118, 100,
+    188, 118, 92, 196, 122, 100, 196, 126, 108, 204, 130, 108, 188, 122, 100,
+     188, 118, 100, 180, 118, 92, 180, 114, 92, 188, 122, 100, 196, 122, 100,
+     188, 122, 100, 188, 118, 92, 180, 110, 92, 196, 122, 100, 188, 126, 100,
+   196, 126, 100, 188, 122, 100, 188, 122, 100, 196, 126, 100, 196, 126, 108,
+   196, 130, 108, 196, 130, 108, 196, 126, 100, 196, 126, 108, 196, 130, 108,
+    196, 134, 108, 204, 134, 108, 196, 130, 108, 188, 126, 108, 188, 118, 92,
+       180, 114, 92, 180, 106, 84, 180, 110, 84, 180, 114, 92, 180, 118, 92,
+     188, 118, 92, 180, 118, 92, 188, 126, 100, 188, 122, 100, 196, 126, 100,
+   196, 126, 100, 196, 126, 100, 196, 130, 108, 204, 130, 108, 196, 130, 108,
+    196, 122, 100, 188, 122, 100, 188, 118, 100, 188, 118, 92, 188, 122, 100,
+    188, 122, 100, 188, 122, 100, 188, 118, 100, 180, 118, 100, 188, 118, 92,
+      180, 114, 92, 188, 118, 92, 188, 118, 100, 188, 122, 92, 188, 122, 100,
+       196, 122, 100, 180, 118, 92, 188, 118, 92, 180, 114, 92, 172, 110, 84,
+       180, 110, 84, 180, 114, 92, 188, 118, 92, 180, 114, 92, 180, 118, 92,
+       188, 114, 92, 180, 114, 92, 180, 114, 92, 180, 114, 92, 180, 114, 92,
+       180, 114, 92, 180, 110, 92, 180, 114, 92, 180, 110, 92, 180, 114, 92,
+       180, 110, 92, 180, 114, 84, 180, 110, 92, 180, 110, 84, 180, 114, 84,
+       180, 110, 92, 180, 114, 92, 180, 114, 92, 180, 110, 84, 180, 110, 92,
+       180, 114, 84, 180, 114, 92, 180, 118, 92, 180, 110, 92, 172, 106, 84,
+       180, 110, 84, 180, 110, 84, 164, 102, 76, 172, 102, 84, 180, 110, 84,
+       172, 110, 84, 172, 106, 84, 172, 106, 84, 172, 102, 84, 172, 106, 84,
+       172, 110, 84, 172, 106, 92, 172, 106, 84, 164, 98, 76, 180, 118, 100,
+     188, 122, 100, 188, 118, 100, 188, 118, 100, 180, 114, 92, 172, 106, 92,
+       172, 106, 84, 164, 102, 84, 180, 106, 84, 172, 106, 92, 180, 110, 92,
+       172, 106, 84, 172, 102, 84, 172, 102, 84, 172, 102, 84, 172, 106, 92,
+       172, 98, 84, 164, 102, 84, 172, 102, 84, 172, 102, 84, 172, 106, 92,
+       180, 106, 84, 172, 110, 92, 180, 106, 92, 164, 98, 76, 164, 98, 76,
+       164, 98, 76, 164, 98, 76, 156, 94, 76, 156, 94, 76, 156, 94, 76,
+       164, 98, 76, 164, 98, 84, 164, 98, 76, 172, 102, 84, 164, 102, 84,
+       172, 102, 84, 164, 102, 84, 164, 98, 76, 156, 94, 76, 172, 102, 84,
+       172, 102, 92, 164, 102, 84, 172, 102, 84, 164, 106, 84, 164, 106, 84,
+       164, 102, 76, 172, 102, 84, 164, 98, 76, 172, 102, 84, 172, 102, 84,
+       164, 94, 84, 172, 106, 92, 164, 106, 92, 116, 62, 52, 92, 34, 20,
+       100, 46, 28, 148, 86, 76, 164, 98, 76, 164, 98, 76, 156, 90, 76,
+       164, 98, 76, 164, 102, 84, 172, 102, 84, 172, 106, 84, 164, 102, 84,
+       164, 102, 84, 164, 98, 76, 164, 98, 84, 172, 106, 84, 172, 110, 92,
+       180, 110, 92, 172, 110, 84, 180, 110, 92, 180, 106, 92, 172, 106, 84,
+       180, 110, 92, 180, 110, 92, 180, 114, 92, 180, 110, 92, 172, 110, 92,
+       172, 106, 84, 172, 102, 84, 164, 102, 84, 172, 106, 84, 180, 106, 92,
+       180, 110, 84, 172, 106, 84, 172, 102, 84, 180, 110, 92, 172, 102, 76,
+       172, 98, 76, 172, 106, 84, 180, 106, 84, 172, 98, 76, 164, 98, 76,
+       164, 94, 76, 164, 98, 76, 172, 102, 76, 172, 110, 84, 172, 106, 84,
+       172, 98, 76, 156, 94, 68, 164, 94, 68, 164, 94, 76, 164, 98, 76,
+       164, 94, 68, 164, 94, 68, 156, 90, 68, 164, 94, 68, 164, 98, 76,
+       164, 98, 76, 164, 98, 76, 164, 98, 76, 172, 102, 76, 172, 106, 84,
+       172, 106, 84, 172, 102, 76, 164, 98, 76, 172, 106, 84, 164, 98, 76,
+       148, 86, 60, 148, 82, 60, 156, 90, 68, 164, 94, 76, 164, 98, 76,
+       164, 94, 76, 172, 98, 76, 164, 98, 76, 164, 98, 76, 172, 102, 84,
+       172, 102, 76, 172, 106, 84, 172, 106, 84, 180, 110, 84, 172, 106, 84,
+       172, 102, 76, 172, 102, 76, 172, 102, 76, 172, 106, 84, 172, 106, 84,
+       172, 102, 76, 172, 102, 76, 172, 106, 84, 172, 102, 84, 172, 102, 76,
+       164, 102, 84, 172, 102, 76, 172, 106, 84, 180, 110, 84, 180, 114, 92,
+       172, 102, 76, 172, 106, 84, 172, 102, 84, 164, 94, 76, 164, 98, 76,
+       172, 102, 76, 172, 102, 84, 172, 102, 76, 164, 98, 76, 172, 98, 76,
+       164, 102, 76, 172, 102, 76, 164, 98, 76, 172, 102, 76, 164, 102, 76,
+       172, 102, 76, 172, 102, 76, 164, 102, 76, 172, 102, 76, 164, 102, 76,
+       172, 98, 76, 164, 98, 76, 164, 102, 76, 164, 98, 76, 172, 102, 84,
+       172, 102, 76, 172, 102, 76, 164, 98, 76, 172, 102, 76, 172, 102, 84,
+       172, 102, 76, 172, 102, 84, 172, 102, 76, 164, 98, 76, 164, 98, 76,
+       164, 102, 76, 156, 90, 68, 164, 94, 68, 164, 98, 76, 164, 98, 76,
+       164, 94, 76, 156, 94, 76, 156, 94, 76, 164, 94, 76, 164, 98, 76,
+       164, 102, 84, 164, 102, 76, 164, 98, 84, 164, 94, 76, 156, 90, 68,
+       156, 90, 76, 156, 94, 68, 156, 94, 76, 156, 90, 68, 156, 90, 68,
+       156, 94, 76, 156, 86, 68, 156, 90, 68, 164, 98, 76, 164, 94, 76,
+       164, 94, 76, 164, 98, 76, 172, 102, 84, 180, 114, 92, 164, 102, 76,
+       172, 102, 84, 172, 102, 84, 172, 106, 84, 172, 106, 84, 180, 110, 92,
+       180, 110, 92, 180, 114, 92, 172, 106, 92, 180, 110, 92, 172, 110, 92,
+       180, 110, 92, 172, 106, 84, 172, 106, 84, 172, 106, 84, 172, 110, 92,
+       172, 110, 84, 172, 110, 92, 180, 114, 92, 180, 114, 92, 180, 114, 92,
+       172, 110, 92, 172, 110, 84, 172, 106, 84, 172, 102, 92, 172, 106, 84,
+       172, 106, 92, 172, 110, 92, 172, 110, 92, 172, 110, 92, 180, 106, 84,
+       172, 106, 84, 180, 106, 92, 180, 110, 92, 180, 110, 100, 172, 102, 84,
+       180, 114, 100, 172, 110, 100, 124, 66, 52, 100, 46, 28, 100, 42, 28,
+       148, 78, 68, 156, 90, 68, 156, 94, 76, 164, 98, 76, 164, 98, 76,
+       164, 98, 76, 156, 90, 68, 148, 82, 60, 148, 82, 68, 148, 86, 60,
+       148, 82, 68, 148, 86, 60, 148, 86, 68, 156, 90, 68, 148, 86, 68,
+       156, 90, 68, 156, 90, 68, 164, 94, 76, 164, 98, 84, 164, 98, 76,
+       156, 94, 76, 164, 94, 76, 164, 98, 76, 164, 98, 76, 172, 102, 84,
+       156, 90, 68, 164, 94, 76, 164, 98, 76, 164, 94, 76, 156, 86, 68,
+       156, 94, 76, 180, 110, 92, 172, 98, 76, 172, 102, 76, 172, 102, 84,
+       164, 98, 76, 172, 98, 76, 180, 110, 84, 188, 122, 100, 188, 118, 92,
+      180, 114, 92, 188, 118, 100, 188, 118, 92, 188, 122, 100, 180, 114, 92,
+       180, 110, 92, 172, 102, 76, 172, 106, 84, 188, 118, 92, 188, 122, 100,
+      188, 122, 100, 188, 118, 92, 188, 118, 100, 188, 118, 92, 172, 102, 76,
+       172, 102, 76, 180, 106, 84, 180, 110, 92, 180, 114, 92, 188, 118, 92,
+       188, 114, 92, 180, 114, 92, 188, 114, 92, 188, 118, 100, 188, 118, 92,
+       180, 114, 92, 172, 102, 76, 164, 98, 76, 172, 102, 76, 172, 106, 84,
+       180, 110, 84, 172, 110, 84, 172, 102, 84, 172, 102, 76, 164, 98, 76,
+       172, 102, 76, 172, 106, 76, 172, 102, 84, 172, 102, 76, 172, 106, 84,
+       180, 110, 92, 180, 114, 92, 180, 110, 84, 172, 110, 84, 180, 106, 84,
+       180, 110, 92, 172, 106, 76, 172, 110, 84, 180, 110, 92, 180, 110, 84,
+       180, 106, 84, 172, 106, 84, 180, 106, 84, 172, 110, 84, 180, 110, 84,
+       172, 102, 84, 172, 102, 76, 172, 102, 76, 164, 94, 68, 164, 98, 76,
+       172, 102, 76, 164, 94, 76, 172, 102, 76, 164, 98, 76, 164, 94, 76,
+       164, 98, 76, 172, 102, 76, 172, 102, 84, 172, 102, 76, 164, 98, 76,
+       164, 102, 84, 172, 98, 76, 164, 98, 76, 172, 102, 76, 164, 98, 76,
+       156, 90, 68, 156, 90, 68, 164, 94, 76, 172, 102, 76, 172, 106, 84,
+       172, 106, 84, 164, 98, 76, 164, 98, 76, 172, 102, 76, 172, 102, 76,
+       164, 98, 76, 164, 102, 76, 164, 98, 76, 172, 102, 76, 172, 102, 84,
+       164, 94, 68, 164, 94, 76, 172, 102, 76, 164, 98, 76, 164, 102, 76,
+       164, 94, 76, 156, 90, 68, 156, 94, 76, 164, 98, 76, 156, 94, 76,
+       156, 90, 68, 156, 94, 76, 156, 90, 68, 156, 94, 76, 164, 98, 76,
+       164, 98, 76, 156, 94, 76, 156, 86, 68, 148, 86, 68, 148, 82, 60,
+       156, 86, 68, 156, 86, 68, 156, 86, 68, 156, 86, 68, 156, 82, 60,
+       148, 86, 68, 156, 86, 68, 156, 90, 76, 156, 90, 68, 156, 86, 68,
+       148, 78, 60, 148, 82, 60, 156, 86, 68, 156, 90, 76, 156, 90, 68,
+       156, 86, 68, 148, 86, 60, 156, 86, 68, 148, 86, 68, 148, 86, 68,
+       156, 90, 68, 156, 90, 68, 164, 94, 76, 156, 94, 76, 156, 86, 68,
+       156, 90, 68, 156, 90, 68, 156, 90, 76, 156, 90, 68, 156, 90, 68,
+       156, 86, 68, 148, 86, 68, 156, 86, 68, 156, 86, 68, 156, 90, 68,
+       156, 90, 76, 164, 98, 76, 164, 102, 76, 164, 102, 84, 172, 106, 84,
+       172, 102, 84, 164, 90, 76, 172, 102, 84, 172, 102, 84, 164, 102, 92,
+       164, 102, 92, 124, 70, 60, 100, 42, 28, 84, 30, 12, 132, 70, 52,
+       140, 74, 60, 148, 78, 60, 140, 74, 52, 140, 74, 60, 140, 78, 60,
+       140, 78, 60, 140, 74, 52, 148, 78, 60, 148, 82, 60, 148, 82, 60,
+       148, 82, 68, 156, 86, 60, 156, 90, 68, 156, 90, 68, 156, 90, 76,
+       148, 82, 68, 156, 90, 68, 156, 90, 68, 164, 90, 68, 156, 90, 68,
+       156, 86, 68, 156, 90, 68, 164, 90, 76, 172, 102, 84, 156, 94, 76,
+       156, 90, 68, 172, 98, 84, 164, 102, 84, 164, 94, 76, 164, 94, 76,
+       172, 102, 84, 180, 110, 84, 180, 110, 92, 188, 114, 92, 180, 110, 84,
+       180, 110, 92, 188, 114, 92, 188, 118, 92, 188, 118, 92, 180, 118, 92,
+       188, 114, 92, 188, 118, 92, 180, 118, 92, 180, 114, 92, 180, 110, 84,
+       180, 114, 92, 180, 118, 92, 188, 118, 100, 180, 114, 92, 180, 114, 92,
+       180, 114, 92, 188, 118, 92, 188, 122, 100, 180, 114, 92, 180, 114, 92,
+       180, 110, 84, 180, 114, 92, 180, 114, 92, 180, 114, 92, 172, 110, 84,
+       172, 102, 84, 172, 106, 76, 180, 110, 92, 188, 118, 92, 188, 118, 100,
+       188, 118, 92, 180, 114, 92, 180, 110, 92, 180, 114, 92, 180, 110, 84,
+       180, 106, 84, 180, 110, 92, 180, 114, 92, 180, 114, 92, 180, 110, 92,
+       180, 110, 84, 172, 110, 84, 172, 102, 84, 172, 106, 84, 180, 110, 84,
+       180, 114, 92, 180, 110, 92, 180, 114, 92, 180, 110, 84, 180, 110, 92,
+       172, 106, 84, 180, 106, 84, 180, 110, 84, 172, 110, 84, 172, 106, 84,
+       172, 106, 84, 180, 106, 84, 180, 110, 92, 180, 110, 92, 172, 106, 76,
+       172, 106, 84, 172, 106, 84, 164, 94, 76, 164, 98, 76, 172, 106, 84,
+       172, 102, 76, 172, 102, 76, 164, 102, 76, 172, 98, 76, 164, 102, 76,
+       172, 102, 84, 172, 106, 76, 172, 102, 84, 172, 102, 76, 172, 102, 76,
+       164, 102, 84, 172, 102, 76, 172, 102, 84, 172, 102, 76, 164, 94, 68,
+       164, 94, 76, 172, 102, 76, 172, 106, 84, 180, 106, 84, 172, 106, 84,
+       172, 102, 76, 172, 102, 76, 172, 106, 84, 172, 106, 84, 172, 102, 76,
+       172, 102, 76, 164, 98, 76, 172, 102, 84, 172, 106, 76, 164, 94, 76,
+       164, 98, 76, 172, 102, 76, 164, 98, 76, 172, 102, 84, 164, 98, 76,
+       156, 94, 76, 164, 102, 84, 172, 102, 84, 164, 98, 76, 164, 98, 76,
+       164, 98, 76, 156, 94, 76, 164, 94, 76, 164, 98, 76, 164, 102, 84,
+       164, 98, 76, 164, 98, 76, 164, 98, 76, 164, 102, 84, 164, 94, 76,
+       156, 94, 76, 164, 94, 76, 156, 94, 76, 156, 90, 68, 156, 86, 68,
+       156, 90, 68, 164, 94, 76, 164, 94, 76, 156, 90, 68, 156, 86, 68,
+       156, 86, 68, 156, 94, 76, 164, 98, 76, 164, 94, 76, 156, 90, 76,
+       156, 86, 68, 148, 90, 68, 156, 90, 68, 156, 94, 68, 156, 94, 76,
+       156, 94, 76, 156, 94, 76, 156, 94, 68, 156, 94, 76, 156, 94, 76,
+       164, 94, 76, 156, 98, 76, 164, 94, 76, 156, 94, 76, 156, 90, 68,
+       156, 90, 68, 164, 94, 84, 156, 94, 76, 164, 98, 84, 164, 98, 76,
+       164, 102, 76, 156, 98, 76, 164, 98, 76, 164, 94, 68, 156, 82, 68,
+       132, 66, 44, 140, 70, 52, 148, 78, 68, 156, 90, 76, 156, 102, 84,
+       124, 66, 52, 84, 30, 12, 92, 38, 28, 132, 66, 52, 140, 74, 52,
+       132, 74, 60, 132, 66, 44, 124, 66, 44, 140, 70, 52, 140, 78, 60,
+       148, 82, 60, 148, 82, 68, 148, 86, 60, 148, 86, 68, 156, 86, 68,
+       148, 90, 68, 156, 90, 76, 156, 94, 68, 156, 94, 76, 164, 90, 68,
+       164, 94, 76, 164, 98, 76, 164, 98, 84, 172, 98, 84, 164, 98, 84,
+       172, 98, 76, 164, 102, 84, 172, 102, 84, 172, 98, 84, 164, 98, 76,
+       172, 102, 84, 180, 110, 84, 180, 110, 92, 172, 110, 92, 172, 102, 76,
+       180, 106, 92, 180, 110, 84, 180, 110, 84, 180, 110, 92, 180, 106, 84,
+       172, 102, 84, 180, 118, 92, 188, 114, 92, 180, 114, 92, 180, 114, 92,
+       180, 114, 92, 188, 114, 92, 180, 110, 92, 172, 110, 84, 188, 118, 100,
+       188, 118, 92, 188, 114, 92, 180, 114, 92, 180, 110, 84, 180, 110, 92,
+       180, 114, 92, 188, 118, 92, 188, 114, 92, 180, 114, 92, 180, 114, 92,
+       180, 114, 92, 180, 114, 92, 180, 110, 84, 172, 102, 84, 172, 102, 76,
+      172, 102, 76, 172, 110, 84, 188, 118, 100, 188, 122, 100, 188, 118, 92,
+      188, 118, 100, 188, 122, 92, 188, 122, 100, 172, 110, 84, 180, 110, 92,
+       180, 114, 84, 180, 114, 92, 188, 114, 92, 180, 118, 92, 188, 114, 92,
+       180, 118, 92, 180, 106, 84, 172, 106, 84, 180, 106, 84, 180, 114, 84,
+       180, 114, 92, 188, 114, 92, 180, 114, 92, 180, 114, 84, 172, 106, 84,
+       180, 106, 84, 172, 110, 92, 180, 110, 84, 180, 106, 84, 172, 106, 84,
+       172, 106, 84, 172, 110, 84, 180, 110, 84, 172, 106, 84, 172, 106, 84,
+       172, 106, 84, 164, 94, 68, 164, 98, 76, 180, 106, 84, 172, 110, 84,
+       172, 102, 84, 172, 102, 84, 164, 102, 76, 172, 102, 76, 172, 106, 84,
+       172, 106, 84, 172, 106, 84, 172, 102, 84, 172, 102, 84, 172, 102, 76,
+       172, 106, 84, 172, 106, 84, 172, 102, 84, 164, 98, 76, 172, 102, 76,
+       172, 106, 84, 180, 110, 84, 180, 114, 92, 180, 110, 84, 172, 106, 84,
+       172, 106, 84, 180, 110, 92, 180, 110, 84, 172, 110, 84, 172, 102, 84,
+       172, 102, 76, 172, 106, 84, 180, 110, 84, 164, 98, 76, 164, 98, 76,
+       172, 106, 84, 164, 102, 76, 172, 102, 84, 164, 98, 84, 164, 98, 76,
+       172, 106, 84, 172, 110, 84, 172, 102, 84, 164, 102, 84, 164, 102, 84,
+       172, 106, 84, 164, 102, 84, 164, 102, 84, 172, 102, 84, 164, 102, 84,
+       156, 94, 76, 164, 98, 76, 172, 106, 84, 172, 102, 76, 164, 98, 84,
+       172, 102, 84, 164, 98, 76, 164, 94, 76, 164, 94, 76, 164, 98, 76,
+       164, 98, 84, 164, 98, 76, 164, 94, 76, 156, 94, 76, 164, 94, 76,
+       172, 102, 84, 172, 102, 84, 164, 98, 76, 164, 94, 76, 156, 86, 68,
+       156, 90, 68, 164, 94, 76, 164, 98, 84, 164, 98, 76, 164, 98, 76,
+       164, 94, 76, 164, 94, 76, 164, 98, 84, 164, 102, 76, 164, 98, 76,
+       164, 102, 84, 164, 98, 76, 164, 98, 76, 164, 98, 76, 164, 94, 76,
+       164, 98, 84, 172, 102, 84, 172, 102, 84, 172, 106, 92, 164, 102, 84,
+       164, 98, 76, 156, 94, 68, 156, 90, 68, 156, 86, 68, 132, 62, 44,
+       140, 66, 52, 140, 74, 60, 156, 94, 84, 172, 110, 100, 132, 74, 60,
+       92, 38, 28, 116, 58, 44, 164, 106, 84, 180, 114, 92, 180, 114, 92,
+      172, 106, 84, 172, 106, 84, 172, 110, 92, 188, 122, 100, 188, 126, 100,
+       180, 114, 92, 180, 114, 100, 180, 114, 92, 180, 114, 92, 180, 114, 92,
+       180, 110, 92, 172, 110, 92, 180, 110, 92, 164, 102, 84, 172, 106, 84,
+       180, 106, 92, 180, 110, 92, 180, 114, 92, 180, 110, 92, 180, 114, 92,
+       180, 110, 92, 172, 110, 84, 180, 114, 92, 180, 114, 100, 180, 114, 92,
+     180, 114, 100, 188, 122, 100, 188, 122, 100, 188, 114, 92, 180, 114, 92,
+       188, 114, 92, 188, 114, 92, 188, 122, 100, 188, 114, 92, 180, 110, 84,
+       180, 110, 92, 180, 110, 84, 180, 110, 92, 180, 114, 92, 180, 114, 92,
+       180, 110, 84, 180, 110, 92, 180, 110, 84, 180, 114, 92, 180, 114, 92,
+       180, 114, 92, 180, 114, 92, 180, 110, 84, 180, 110, 92, 180, 110, 84,
+       180, 110, 92, 172, 110, 84, 172, 106, 84, 180, 106, 84, 180, 110, 84,
+       180, 110, 84, 180, 110, 84, 172, 106, 84, 172, 102, 76, 180, 110, 92,
+       180, 114, 92, 180, 114, 92, 180, 114, 92, 180, 110, 84, 180, 114, 92,
+       188, 118, 92, 188, 122, 100, 188, 114, 92, 180, 110, 84, 172, 106, 84,
+       172, 106, 84, 172, 106, 84, 180, 110, 84, 180, 114, 92, 188, 118, 92,
+       180, 110, 92, 180, 114, 84, 180, 110, 92, 180, 114, 92, 180, 114, 92,
+       180, 114, 92, 180, 110, 84, 172, 106, 84, 172, 102, 84, 172, 106, 76,
+       172, 106, 84, 172, 106, 84, 172, 102, 76, 172, 102, 76, 172, 106, 84,
+       180, 106, 84, 172, 110, 84, 172, 102, 84, 180, 110, 84, 172, 106, 84,
+       164, 94, 68, 164, 98, 76, 172, 106, 84, 180, 110, 84, 172, 106, 84,
+       172, 102, 76, 172, 102, 76, 172, 102, 84, 172, 106, 84, 172, 106, 84,
+       172, 106, 76, 172, 102, 76, 172, 102, 84, 164, 102, 76, 172, 102, 84,
+       172, 106, 84, 172, 106, 84, 172, 102, 76, 172, 102, 84, 180, 110, 84,
+       180, 110, 92, 180, 114, 84, 180, 110, 92, 172, 106, 84, 180, 106, 84,
+       172, 110, 84, 180, 106, 84, 172, 110, 92, 180, 106, 84, 172, 106, 84,
+       180, 110, 84, 172, 106, 84, 164, 98, 76, 172, 98, 76, 180, 110, 84,
+       172, 106, 84, 172, 102, 84, 164, 98, 76, 164, 102, 84, 172, 106, 84,
+       172, 110, 92, 172, 106, 84, 172, 102, 84, 164, 102, 84, 172, 106, 84,
+       164, 98, 76, 164, 98, 76, 164, 102, 84, 164, 98, 76, 156, 90, 68,
+       156, 90, 68, 164, 98, 84, 164, 98, 84, 172, 102, 76, 172, 102, 84,
+       164, 102, 84, 164, 98, 76, 164, 98, 84, 172, 102, 84, 172, 106, 84,
+       172, 98, 84, 164, 98, 76, 164, 98, 76, 172, 98, 84, 172, 106, 84,
+       172, 106, 84, 164, 98, 84, 164, 94, 76, 156, 94, 76, 164, 98, 76,
+       164, 98, 76, 164, 102, 76, 164, 102, 84, 164, 98, 76, 164, 98, 76,
+       156, 94, 76, 164, 102, 76, 172, 102, 84, 164, 102, 84, 164, 102, 76,
+       164, 102, 84, 164, 98, 84, 164, 98, 76, 164, 98, 84, 164, 98, 84,
+       164, 98, 84, 172, 102, 84, 164, 102, 84, 172, 106, 84, 164, 102, 84,
+       164, 98, 76, 164, 98, 76, 172, 102, 84, 164, 90, 68, 164, 90, 76,
+       164, 94, 76, 164, 102, 92, 172, 114, 100, 140, 82, 68, 116, 58, 44,
+       116, 62, 52, 148, 86, 68, 164, 98, 76, 164, 102, 84, 164, 98, 76,
+       156, 94, 76, 164, 98, 76, 164, 102, 84, 172, 102, 84, 164, 102, 84,
+       164, 102, 76, 164, 102, 84, 164, 98, 84, 164, 98, 76, 164, 102, 84,
+       164, 98, 76, 164, 98, 76, 172, 102, 84, 172, 102, 84, 172, 106, 84,
+       180, 110, 84, 172, 110, 92, 180, 110, 84, 172, 106, 92, 172, 106, 84,
+       164, 90, 76, 172, 106, 84, 180, 110, 92, 172, 98, 84, 164, 98, 76,
+       172, 106, 84, 180, 110, 92, 180, 114, 92, 180, 110, 92, 180, 110, 84,
+       188, 114, 92, 188, 118, 100, 188, 114, 92, 180, 110, 84, 172, 106, 84,
+       172, 106, 84, 172, 106, 84, 180, 110, 84, 180, 110, 84, 180, 114, 92,
+       180, 110, 84, 180, 114, 92, 180, 106, 84, 172, 110, 84, 180, 106, 84,
+       172, 106, 84, 180, 110, 84, 172, 110, 84, 180, 110, 84, 172, 110, 84,
+       172, 102, 76, 172, 102, 76, 172, 102, 76, 172, 102, 84, 172, 110, 92,
+       180, 110, 84, 172, 106, 84, 172, 102, 84, 172, 110, 84, 180, 110, 84,
+       180, 110, 84, 180, 110, 84, 172, 106, 84, 172, 106, 84, 180, 110, 84,
+       180, 110, 92, 180, 114, 92, 180, 114, 92, 172, 106, 84, 172, 102, 84,
+       172, 102, 76, 172, 106, 84, 180, 106, 84, 180, 114, 92, 180, 114, 92,
+       180, 114, 92, 180, 110, 84, 180, 110, 84, 180, 110, 92, 180, 114, 84,
+       172, 106, 84, 172, 106, 84, 172, 102, 76, 172, 102, 76, 172, 102, 84,
+       172, 102, 76, 164, 98, 76, 164, 98, 76, 172, 102, 76, 172, 106, 84,
+       172, 102, 84, 172, 102, 76, 172, 106, 84, 172, 102, 76, 156, 90, 68,
+       164, 94, 68, 172, 106, 84, 172, 106, 84, 172, 102, 76, 172, 98, 76,
+       164, 98, 76, 164, 98, 76, 172, 102, 76, 172, 102, 76, 172, 102, 84,
+       164, 102, 76, 172, 102, 76, 164, 98, 76, 172, 102, 76, 180, 106, 84,
+       172, 106, 84, 164, 102, 76, 172, 102, 76, 172, 110, 92, 180, 110, 84,
+       172, 110, 84, 172, 106, 84, 172, 106, 84, 172, 106, 84, 172, 106, 84,
+       172, 106, 84, 172, 106, 84, 180, 114, 84, 172, 106, 84, 180, 106, 84,
+       172, 106, 84, 164, 94, 68, 164, 98, 76, 180, 110, 84, 180, 114, 92,
+       164, 98, 84, 156, 98, 76, 164, 98, 76, 172, 106, 84, 172, 110, 92,
+       172, 106, 84, 164, 102, 76, 164, 102, 84, 156, 90, 68, 156, 90, 68,
+       156, 94, 76, 164, 102, 76, 164, 98, 76, 156, 94, 76, 164, 98, 76,
+       164, 102, 84, 164, 98, 76, 164, 98, 76, 164, 98, 84, 172, 98, 76,
+       164, 98, 84, 172, 98, 76, 172, 102, 84, 172, 106, 92, 164, 98, 76,
+       164, 94, 76, 164, 98, 76, 164, 98, 84, 172, 106, 84, 172, 102, 84,
+       164, 98, 76, 156, 90, 68, 164, 98, 76, 164, 98, 76, 164, 98, 84,
+       164, 98, 76, 164, 98, 84, 164, 102, 76, 164, 98, 84, 164, 102, 76,
+       172, 102, 84, 164, 102, 84, 164, 98, 76, 164, 98, 84, 164, 98, 76,
+       164, 98, 76, 164, 102, 76, 164, 98, 76, 164, 98, 84, 172, 98, 84,
+       164, 102, 84, 164, 102, 84, 164, 102, 84, 164, 106, 84, 172, 102, 84,
+       172, 106, 84, 172, 102, 84, 172, 102, 84, 172, 102, 92, 164, 98, 84,
+       164, 102, 92, 156, 98, 84, 132, 74, 60, 116, 62, 52, 116, 58, 44,
+       148, 86, 68, 164, 94, 76, 164, 102, 84, 164, 102, 76, 164, 98, 76,
+       164, 98, 76, 164, 102, 84, 164, 98, 76, 172, 106, 84, 172, 106, 84,
+       172, 106, 92, 172, 110, 84, 172, 110, 92, 180, 110, 92, 180, 114, 92,
+       180, 114, 92, 164, 102, 84, 172, 102, 84, 172, 106, 84, 172, 106, 92,
+       180, 110, 92, 180, 110, 92, 172, 106, 84, 172, 102, 84, 164, 98, 84,
+       180, 114, 92, 188, 122, 100, 180, 114, 92, 172, 102, 84, 180, 106, 92,
+      188, 118, 100, 188, 122, 100, 172, 102, 84, 172, 106, 84, 180, 106, 84,
+       180, 110, 84, 180, 110, 84, 180, 106, 92, 172, 102, 76, 172, 102, 84,
+       180, 110, 84, 180, 110, 84, 180, 110, 92, 180, 110, 84, 180, 114, 92,
+       180, 114, 92, 180, 110, 84, 172, 106, 84, 172, 102, 76, 164, 98, 76,
+       172, 102, 84, 172, 106, 84, 180, 110, 92, 180, 114, 92, 172, 102, 84,
+       172, 102, 84, 172, 106, 84, 172, 106, 84, 180, 106, 84, 172, 106, 84,
+       172, 102, 76, 164, 98, 76, 172, 102, 76, 172, 102, 84, 172, 106, 84,
+       180, 110, 92, 180, 110, 84, 180, 110, 84, 172, 106, 84, 172, 106, 84,
+       180, 110, 84, 180, 114, 92, 180, 114, 92, 188, 114, 92, 180, 114, 92,
+       180, 110, 92, 172, 110, 84, 172, 106, 84, 180, 114, 92, 180, 110, 92,
+       180, 110, 84, 172, 110, 84, 180, 110, 84, 172, 106, 84, 172, 106, 84,
+       172, 102, 76, 172, 102, 84, 172, 102, 84, 172, 106, 76, 164, 98, 76,
+       164, 98, 76, 172, 98, 76, 172, 102, 84, 172, 106, 84, 172, 106, 76,
+       164, 98, 76, 172, 106, 84, 172, 102, 84, 164, 94, 68, 164, 94, 76,
+       172, 102, 76, 172, 102, 76, 164, 102, 84, 172, 102, 76, 164, 98, 76,
+       172, 102, 76, 172, 102, 84, 172, 106, 84, 172, 102, 76, 172, 102, 84,
+       164, 102, 76, 172, 98, 76, 164, 102, 76, 172, 106, 84, 172, 102, 76,
+       172, 102, 76, 172, 102, 84, 180, 110, 84, 180, 110, 84, 172, 102, 84,
+       172, 102, 76, 172, 106, 84, 172, 106, 76, 172, 102, 76, 172, 102, 84,
+       172, 106, 84, 180, 110, 84, 172, 106, 84, 180, 110, 84, 172, 102, 84,
+       156, 90, 68, 164, 94, 68, 172, 110, 84, 180, 114, 92, 172, 102, 76,
+       164, 94, 76, 164, 98, 76, 164, 102, 84, 172, 106, 84, 164, 102, 84,
+       164, 98, 76, 164, 98, 84, 156, 94, 76, 164, 98, 76, 164, 98, 84,
+       164, 102, 84, 164, 98, 76, 164, 98, 84, 164, 102, 76, 164, 102, 84,
+       164, 94, 76, 164, 94, 76, 164, 98, 76, 164, 98, 84, 164, 98, 76,
+       164, 98, 76, 172, 102, 84, 172, 106, 84, 164, 98, 76, 164, 98, 76,
+       164, 94, 76, 164, 98, 76, 172, 102, 84, 172, 102, 84, 164, 94, 76,
+       156, 90, 68, 164, 98, 84, 164, 98, 76, 164, 98, 76, 164, 98, 76,
+       164, 98, 76, 164, 98, 84, 164, 102, 84, 172, 102, 84, 164, 102, 84,
+       164, 98, 76, 164, 98, 84, 164, 98, 76, 164, 98, 76, 164, 98, 84,
+       164, 98, 76, 164, 98, 84, 172, 102, 84, 164, 102, 84, 172, 102, 84,
+       164, 98, 84, 164, 102, 76, 164, 98, 76, 164, 102, 76, 164, 98, 76,
+       172, 98, 84, 164, 98, 76, 172, 98, 84, 164, 94, 76, 164, 98, 84,
+       156, 98, 84, 124, 70, 60, 116, 58, 44, 116, 62, 44, 164, 98, 76,
+       164, 102, 84, 172, 106, 84, 164, 98, 84, 164, 102, 84, 172, 102, 84,
+       172, 106, 84, 164, 102, 84, 164, 98, 84, 164, 98, 76, 164, 102, 84,
+       172, 102, 84, 172, 106, 84, 172, 110, 84, 172, 110, 92, 180, 110, 92,
+       172, 110, 92, 180, 110, 92, 180, 110, 92, 180, 114, 92, 180, 114, 92,
+       180, 114, 92, 180, 106, 92, 164, 102, 84, 180, 106, 84, 180, 114, 100,
+     188, 118, 100, 188, 118, 100, 180, 114, 92, 180, 110, 92, 180, 118, 100,
+     188, 118, 100, 188, 114, 92, 188, 118, 100, 188, 118, 92, 188, 118, 100,
+       188, 114, 92, 188, 122, 100, 172, 106, 84, 172, 106, 84, 180, 110, 84,
+       172, 110, 92, 180, 110, 84, 172, 106, 84, 172, 110, 84, 180, 110, 84,
+       180, 114, 92, 172, 106, 84, 172, 102, 84, 172, 102, 76, 172, 106, 84,
+       180, 110, 84, 180, 114, 92, 180, 114, 92, 180, 110, 84, 172, 110, 84,
+       172, 106, 84, 180, 110, 84, 180, 114, 92, 180, 110, 84, 172, 106, 84,
+       172, 102, 76, 172, 106, 84, 172, 106, 84, 180, 110, 84, 180, 114, 92,
+       180, 114, 92, 180, 114, 92, 180, 106, 84, 172, 106, 84, 172, 106, 84,
+       180, 110, 84, 180, 114, 92, 188, 118, 92, 188, 118, 92, 180, 114, 92,
+       180, 110, 84, 172, 106, 84, 180, 106, 84, 172, 106, 84, 180, 106, 84,
+       172, 106, 84, 172, 106, 84, 172, 102, 84, 172, 102, 76, 172, 106, 84,
+       172, 106, 84, 172, 106, 84, 172, 106, 84, 172, 102, 76, 172, 102, 84,
+       172, 102, 76, 172, 106, 84, 180, 110, 84, 180, 106, 84, 172, 102, 76,
+       172, 106, 84, 172, 106, 84, 164, 98, 76, 164, 98, 76, 172, 102, 84,
+       164, 98, 76, 172, 106, 76, 172, 102, 84, 164, 98, 76, 172, 102, 76,
+       172, 106, 84, 172, 106, 84, 172, 106, 84, 172, 102, 76, 172, 102, 84,
+       172, 102, 76, 172, 102, 84, 172, 106, 84, 172, 106, 84, 172, 98, 76,
+       164, 102, 84, 180, 110, 84, 172, 110, 84, 172, 102, 84, 172, 102, 76,
+       172, 106, 84, 172, 106, 84, 172, 98, 76, 172, 102, 76, 172, 106, 84,
+       172, 106, 84, 172, 102, 84, 180, 110, 84, 172, 106, 84, 156, 94, 68,
+       164, 90, 68, 172, 106, 84, 180, 110, 84, 164, 102, 84, 164, 98, 76,
+       164, 98, 76, 164, 102, 84, 172, 106, 84, 164, 98, 84, 164, 98, 76,
+       164, 98, 76, 164, 98, 76, 172, 106, 84, 172, 106, 84, 164, 98, 76,
+       164, 94, 76, 164, 98, 76, 164, 98, 84, 164, 98, 76, 164, 98, 76,
+       164, 98, 84, 172, 102, 84, 172, 98, 76, 164, 98, 76, 164, 94, 76,
+       164, 98, 76, 172, 102, 84, 164, 98, 84, 164, 94, 76, 164, 94, 76,
+       164, 94, 76, 164, 98, 84, 164, 98, 76, 164, 94, 76, 156, 86, 68,
+       164, 94, 76, 156, 94, 76, 164, 98, 76, 164, 98, 76, 164, 102, 84,
+       172, 102, 76, 164, 102, 84, 164, 102, 76, 172, 102, 84, 164, 102, 76,
+       164, 102, 84, 164, 98, 76, 164, 98, 76, 164, 98, 76, 164, 98, 84,
+       164, 102, 76, 164, 102, 84, 172, 98, 84, 164, 102, 84, 164, 98, 76,
+       164, 102, 84, 156, 98, 76, 164, 98, 76, 164, 94, 76, 164, 98, 76,
+       172, 98, 84, 172, 98, 84, 164, 90, 76, 172, 106, 92, 164, 106, 92,
+       132, 70, 60, 116, 62, 44, 116, 58, 44, 164, 98, 84, 164, 98, 76,
+       164, 98, 76, 156, 90, 68, 156, 90, 68, 164, 98, 76, 164, 102, 84,
+       164, 98, 76, 172, 106, 84, 172, 102, 84, 172, 106, 84, 172, 106, 84,
+       172, 106, 92, 172, 106, 84, 172, 110, 92, 172, 106, 84, 180, 110, 92,
+       172, 106, 84, 180, 110, 92, 180, 110, 92, 180, 114, 100, 180, 110, 92,
+       172, 106, 84, 164, 98, 76, 180, 110, 92, 180, 110, 92, 180, 114, 92,
+      188, 118, 100, 188, 118, 100, 180, 114, 92, 180, 110, 92, 180, 110, 92,
+       180, 114, 92, 188, 118, 92, 188, 118, 100, 180, 110, 84, 180, 110, 92,
+       188, 118, 92, 172, 106, 84, 180, 110, 84, 180, 114, 92, 180, 110, 92,
+       180, 110, 84, 172, 106, 84, 172, 106, 84, 180, 106, 84, 180, 110, 92,
+       172, 106, 84, 180, 110, 84, 180, 110, 92, 180, 114, 92, 180, 114, 92,
+       180, 110, 92, 180, 106, 84, 172, 110, 84, 180, 106, 84, 180, 110, 92,
+       180, 110, 84, 180, 118, 100, 188, 114, 92, 180, 114, 92, 180, 110, 92,
+      188, 122, 100, 188, 118, 92, 180, 114, 100, 180, 114, 84, 180, 110, 92,
+       180, 110, 84, 180, 110, 92, 180, 110, 84, 172, 106, 84, 172, 110, 84,
+       180, 110, 84, 180, 110, 92, 180, 110, 84, 180, 110, 92, 180, 110, 84,
+       180, 110, 92, 164, 98, 76, 172, 102, 76, 172, 106, 84, 172, 102, 76,
+       172, 102, 76, 172, 102, 76, 172, 106, 84, 180, 106, 84, 180, 110, 84,
+       180, 110, 84, 180, 110, 92, 172, 106, 84, 172, 106, 84, 172, 106, 84,
+       172, 110, 84, 180, 114, 92, 180, 110, 92, 172, 106, 84, 180, 106, 84,
+       180, 110, 84, 172, 102, 76, 172, 102, 76, 172, 102, 76, 164, 94, 76,
+       172, 106, 84, 172, 102, 84, 172, 106, 84, 172, 102, 84, 172, 106, 84,
+       180, 110, 84, 172, 106, 84, 172, 106, 84, 172, 106, 84, 172, 106, 84,
+       172, 106, 84, 180, 110, 84, 172, 106, 84, 172, 102, 76, 172, 102, 84,
+       180, 110, 84, 180, 110, 92, 172, 106, 76, 172, 102, 84, 172, 106, 84,
+       172, 106, 84, 172, 102, 76, 164, 102, 76, 180, 106, 84, 164, 98, 76,
+       164, 102, 76, 180, 110, 84, 172, 110, 84, 164, 94, 76, 156, 94, 68,
+       172, 102, 84, 172, 106, 84, 172, 106, 92, 164, 102, 84, 164, 98, 76,
+       164, 102, 84, 172, 102, 84, 164, 98, 76, 164, 98, 84, 164, 102, 84,
+       156, 90, 68, 164, 102, 84, 164, 102, 84, 156, 86, 68, 148, 86, 68,
+       172, 102, 84, 172, 110, 84, 172, 102, 84, 172, 102, 84, 172, 102, 84,
+       172, 102, 84, 164, 98, 76, 164, 94, 76, 156, 94, 76, 164, 94, 76,
+       164, 98, 76, 172, 98, 84, 164, 98, 76, 156, 90, 76, 164, 94, 76,
+       172, 98, 76, 164, 98, 84, 164, 94, 76, 156, 90, 68, 148, 90, 68,
+       156, 94, 76, 164, 94, 76, 164, 102, 84, 164, 102, 84, 164, 102, 84,
+       164, 98, 76, 164, 98, 84, 172, 106, 84, 164, 102, 84, 172, 102, 84,
+       164, 98, 76, 164, 98, 84, 164, 98, 76, 164, 102, 76, 164, 98, 84,
+       164, 94, 76, 164, 94, 76, 164, 98, 84, 164, 102, 84, 164, 102, 84,
+       164, 98, 76, 164, 94, 76, 156, 94, 76, 164, 98, 76, 164, 94, 84,
+       164, 98, 84, 156, 94, 76, 164, 106, 92, 164, 102, 92, 124, 66, 52,
+       116, 58, 44, 116, 58, 36, 164, 106, 92, 172, 106, 84, 164, 106, 84,
+       172, 102, 84, 164, 102, 84, 164, 102, 84, 164, 102, 76, 164, 98, 84,
+       172, 106, 84, 172, 106, 84, 172, 110, 92, 172, 110, 84, 172, 106, 92,
+       172, 106, 84, 172, 110, 92, 180, 114, 92, 180, 110, 92, 180, 110, 92,
+      172, 110, 92, 180, 110, 92, 188, 118, 92, 188, 118, 100, 180, 114, 100,
+      180, 114, 92, 180, 114, 92, 180, 114, 92, 188, 118, 100, 180, 114, 100,
+       180, 114, 92, 180, 114, 92, 180, 110, 92, 172, 106, 84, 188, 118, 100,
+       188, 118, 92, 188, 118, 100, 188, 118, 92, 188, 118, 92, 180, 114, 92,
+      180, 106, 92, 180, 114, 92, 188, 118, 100, 180, 114, 100, 180, 110, 92,
+       172, 106, 84, 180, 110, 92, 180, 114, 92, 180, 114, 92, 180, 110, 92,
+      172, 106, 84, 172, 106, 84, 180, 114, 92, 188, 122, 100, 188, 118, 100,
+     180, 118, 92, 188, 114, 100, 180, 118, 92, 188, 118, 100, 188, 118, 100,
+     188, 118, 100, 180, 114, 92, 180, 118, 92, 188, 118, 100, 188, 122, 100,
+      188, 118, 100, 180, 114, 92, 188, 114, 92, 180, 114, 100, 180, 114, 92,
+       180, 110, 92, 172, 106, 84, 188, 118, 92, 180, 114, 92, 172, 110, 84,
+       172, 110, 84, 172, 110, 84, 172, 110, 84, 180, 110, 84, 172, 106, 84,
+       172, 110, 84, 172, 106, 84, 180, 106, 84, 172, 106, 84, 180, 106, 84,
+       172, 102, 84, 180, 106, 84, 172, 106, 84, 172, 106, 84, 172, 106, 84,
+       180, 110, 84, 180, 114, 84, 180, 110, 92, 180, 110, 84, 180, 110, 92,
+       180, 110, 84, 172, 106, 84, 172, 106, 76, 172, 102, 84, 164, 102, 76,
+       164, 102, 76, 172, 102, 84, 172, 106, 84, 172, 106, 84, 172, 102, 76,
+       172, 102, 84, 172, 106, 84, 180, 110, 84, 180, 110, 92, 172, 106, 84,
+       172, 106, 84, 172, 102, 84, 180, 106, 84, 172, 106, 84, 180, 106, 92,
+       172, 106, 84, 180, 106, 92, 172, 106, 84, 172, 106, 84, 172, 106, 84,
+       172, 106, 84, 172, 110, 84, 180, 110, 84, 172, 110, 84, 172, 98, 76,
+       164, 102, 76, 172, 110, 84, 180, 118, 92, 172, 106, 84, 172, 110, 84,
+       172, 102, 84, 172, 102, 76, 164, 102, 76, 164, 98, 76, 164, 98, 76,
+       164, 98, 68, 164, 102, 84, 164, 102, 76, 164, 98, 84, 164, 98, 76,
+       164, 98, 76, 164, 98, 76, 164, 102, 76, 164, 102, 84, 164, 98, 76,
+       164, 98, 76, 156, 98, 76, 164, 94, 76, 156, 94, 76, 164, 98, 76,
+       164, 98, 84, 164, 106, 84, 164, 98, 76, 164, 98, 76, 156, 94, 76,
+       156, 94, 76, 164, 94, 76, 164, 98, 76, 172, 102, 84, 164, 102, 84,
+       164, 94, 76, 156, 98, 76, 164, 94, 76, 164, 98, 76, 164, 98, 76,
+       164, 102, 76, 164, 94, 76, 156, 94, 76, 148, 86, 68, 164, 94, 76,
+       164, 102, 84, 164, 102, 76, 164, 94, 76, 156, 94, 76, 164, 98, 76,
+       164, 98, 76, 164, 98, 76, 164, 98, 76, 164, 98, 76, 164, 98, 76,
+       164, 98, 76, 164, 98, 84, 164, 98, 76, 164, 98, 76, 164, 98, 84,
+       164, 94, 84, 164, 90, 76, 164, 94, 76, 164, 98, 84, 164, 98, 84,
+       164, 94, 76, 164, 94, 76, 172, 102, 84, 164, 98, 76, 172, 98, 84,
+       164, 98, 84, 172, 110, 92, 164, 102, 84, 124, 66, 52, 116, 58, 36,
+       108, 46, 28, 180, 110, 92, 180, 110, 92, 172, 110, 92, 172, 110, 84,
+       172, 106, 84, 172, 106, 84, 172, 106, 84, 172, 106, 84, 172, 110, 92,
+       172, 110, 92, 180, 110, 92, 172, 110, 92, 172, 110, 84, 172, 110, 92,
+       180, 114, 92, 180, 118, 100, 180, 110, 92, 172, 106, 84, 180, 110, 92,
+      180, 110, 92, 180, 114, 100, 188, 118, 100, 180, 114, 92, 180, 114, 92,
+      180, 114, 100, 180, 114, 92, 180, 114, 100, 180, 114, 92, 180, 110, 92,
+       180, 110, 92, 172, 106, 92, 180, 106, 84, 180, 114, 92, 180, 110, 92,
+       180, 114, 92, 180, 114, 92, 180, 114, 92, 180, 114, 92, 172, 110, 92,
+       180, 110, 92, 188, 118, 100, 180, 114, 92, 180, 110, 92, 172, 106, 84,
+       180, 106, 92, 180, 110, 92, 180, 114, 92, 172, 106, 92, 172, 106, 84,
+      180, 106, 92, 180, 114, 92, 188, 118, 100, 188, 118, 100, 180, 114, 92,
+    180, 110, 92, 180, 114, 100, 188, 118, 100, 188, 118, 100, 180, 118, 100,
+   188, 118, 100, 188, 118, 100, 188, 118, 100, 196, 126, 108, 188, 122, 100,
+   188, 118, 100, 188, 118, 100, 188, 122, 100, 188, 118, 100, 180, 118, 100,
+       180, 114, 92, 188, 118, 100, 180, 118, 92, 180, 110, 84, 180, 110, 92,
+       180, 114, 84, 180, 114, 92, 180, 110, 92, 180, 110, 84, 180, 110, 92,
+       180, 110, 84, 180, 110, 92, 180, 110, 92, 188, 114, 84, 180, 110, 92,
+       180, 110, 84, 188, 114, 92, 188, 114, 92, 180, 118, 92, 188, 118, 100,
+      188, 118, 92, 188, 122, 100, 188, 118, 92, 188, 118, 100, 180, 118, 92,
+       180, 106, 84, 172, 106, 84, 172, 102, 76, 172, 102, 76, 172, 102, 84,
+       172, 102, 76, 172, 106, 84, 172, 106, 84, 172, 102, 84, 164, 102, 84,
+       172, 102, 84, 172, 106, 84, 172, 106, 84, 172, 102, 84, 172, 102, 84,
+       164, 98, 84, 172, 106, 84, 172, 110, 92, 172, 106, 84, 180, 110, 92,
+       172, 106, 84, 172, 110, 92, 180, 106, 92, 172, 110, 92, 180, 110, 84,
+       172, 114, 92, 180, 114, 92, 172, 110, 84, 172, 106, 84, 172, 106, 84,
+       180, 114, 84, 180, 118, 92, 180, 110, 84, 172, 110, 84, 172, 110, 84,
+       172, 106, 84, 164, 102, 76, 172, 102, 76, 164, 102, 76, 164, 102, 84,
+       172, 102, 76, 164, 102, 84, 164, 98, 76, 164, 98, 84, 164, 98, 76,
+       164, 102, 84, 164, 102, 84, 172, 98, 76, 164, 98, 84, 164, 98, 76,
+       164, 94, 76, 156, 94, 68, 164, 94, 76, 164, 98, 76, 164, 98, 76,
+       164, 102, 84, 172, 102, 84, 164, 102, 84, 164, 98, 76, 164, 98, 76,
+       156, 94, 76, 164, 98, 76, 164, 98, 76, 164, 102, 76, 164, 98, 76,
+       164, 98, 76, 156, 94, 76, 164, 98, 76, 164, 102, 84, 164, 98, 84,
+       164, 98, 76, 164, 94, 76, 156, 94, 68, 164, 102, 84, 172, 106, 84,
+       172, 110, 92, 172, 102, 84, 164, 102, 76, 172, 102, 84, 164, 106, 84,
+       164, 98, 84, 164, 98, 76, 164, 98, 84, 156, 98, 76, 164, 98, 76,
+       164, 98, 76, 164, 98, 76, 164, 98, 84, 164, 98, 84, 164, 94, 76,
+       164, 94, 76, 164, 94, 76, 164, 98, 84, 164, 98, 84, 164, 98, 84,
+       164, 94, 76, 156, 94, 84, 156, 94, 76, 156, 94, 76, 156, 90, 76,
+       164, 98, 84, 156, 90, 76, 116, 54, 36, 108, 46, 28, 116, 54, 36,
+       172, 110, 92, 172, 110, 92, 180, 110, 92, 172, 110, 92, 172, 106, 84,
+       172, 106, 92, 164, 106, 84, 172, 106, 84, 172, 106, 84, 172, 106, 84,
+       172, 110, 84, 172, 106, 92, 172, 106, 84, 172, 106, 84, 172, 106, 84,
+       180, 110, 92, 172, 106, 84, 172, 106, 84, 172, 106, 84, 180, 110, 92,
+       180, 114, 92, 180, 114, 92, 188, 114, 100, 180, 114, 92, 180, 110, 92,
+       180, 110, 92, 180, 110, 92, 180, 110, 92, 172, 106, 84, 180, 106, 92,
+       172, 110, 84, 172, 106, 92, 180, 110, 84, 180, 110, 92, 180, 110, 92,
+       180, 110, 84, 180, 110, 92, 180, 106, 84, 180, 106, 84, 180, 114, 92,
+       180, 114, 100, 180, 114, 92, 172, 106, 92, 172, 106, 84, 172, 106, 84,
+       172, 106, 92, 180, 110, 92, 172, 106, 84, 172, 102, 84, 172, 106, 84,
+       180, 114, 92, 180, 114, 100, 180, 114, 92, 180, 114, 92, 180, 110, 92,
+     180, 114, 92, 188, 122, 100, 188, 118, 100, 188, 118, 100, 180, 114, 92,
+       180, 114, 92, 180, 114, 92, 180, 110, 92, 172, 106, 92, 172, 106, 84,
+       172, 106, 84, 172, 106, 92, 172, 106, 84, 180, 110, 92, 172, 110, 84,
+       180, 114, 92, 180, 114, 92, 172, 110, 84, 172, 110, 84, 172, 110, 84,
+       180, 110, 92, 180, 114, 84, 172, 110, 84, 172, 102, 84, 172, 106, 76,
+       172, 106, 84, 180, 106, 84, 172, 106, 84, 180, 106, 84, 180, 106, 84,
+       172, 106, 84, 180, 106, 84, 180, 110, 84, 172, 110, 92, 180, 110, 84,
+       180, 110, 92, 172, 110, 84, 180, 110, 84, 172, 106, 84, 172, 106, 84,
+       172, 106, 84, 164, 102, 84, 172, 102, 76, 164, 102, 76, 172, 102, 84,
+       172, 106, 76, 172, 106, 84, 172, 102, 84, 172, 102, 84, 172, 106, 84,
+       180, 106, 84, 172, 106, 92, 172, 106, 84, 172, 102, 84, 172, 102, 84,
+       172, 102, 84, 172, 106, 84, 172, 102, 84, 172, 106, 84, 172, 106, 92,
+       180, 106, 84, 172, 106, 92, 172, 110, 84, 180, 110, 92, 180, 110, 92,
+       172, 114, 92, 180, 110, 84, 172, 114, 92, 180, 110, 84, 172, 114, 92,
+       180, 110, 92, 172, 114, 92, 180, 110, 92, 172, 106, 84, 172, 106, 84,
+       164, 106, 84, 172, 106, 84, 164, 102, 84, 172, 106, 84, 164, 98, 76,
+       164, 98, 76, 164, 98, 84, 164, 102, 76, 164, 102, 84, 164, 98, 76,
+       164, 98, 84, 164, 98, 76, 164, 98, 76, 164, 98, 76, 156, 94, 76,
+       156, 90, 76, 156, 94, 68, 156, 94, 76, 156, 94, 76, 164, 98, 76,
+       164, 102, 84, 164, 102, 76, 164, 98, 76, 156, 94, 76, 156, 94, 76,
+       156, 94, 68, 156, 90, 76, 156, 94, 76, 164, 98, 76, 164, 98, 76,
+       156, 94, 76, 164, 98, 76, 164, 98, 76, 164, 98, 76, 164, 98, 76,
+       156, 94, 76, 156, 86, 68, 156, 94, 68, 164, 98, 76, 164, 98, 76,
+       156, 94, 76, 156, 90, 68, 156, 94, 76, 164, 94, 76, 156, 98, 76,
+       164, 94, 76, 156, 98, 76, 164, 94, 76, 164, 98, 76, 156, 94, 76,
+       164, 98, 76, 156, 94, 76, 164, 94, 76, 156, 90, 76, 156, 90, 76,
+       156, 90, 76, 156, 94, 76, 164, 94, 76, 156, 90, 76, 156, 94, 76,
+       164, 98, 84, 164, 94, 76, 164, 98, 84, 156, 94, 76, 164, 102, 84,
+       156, 94, 76, 116, 58, 36, 116, 54, 36, 116, 58, 36, 180, 114, 100,
+       180, 118, 92, 180, 114, 92, 180, 114, 92, 180, 114, 92, 180, 114, 92,
+       180, 110, 92, 172, 110, 92, 180, 114, 92, 180, 114, 100, 180, 114, 92,
+       180, 114, 92, 172, 110, 92, 172, 110, 92, 180, 114, 92, 180, 118, 100,
+    180, 114, 92, 180, 114, 100, 188, 118, 100, 188, 118, 100, 188, 122, 100,
+   196, 126, 108, 188, 122, 108, 196, 126, 100, 188, 122, 108, 188, 122, 100,
+   188, 118, 100, 180, 118, 100, 188, 114, 100, 180, 118, 100, 188, 118, 100,
+   188, 118, 100, 196, 126, 108, 188, 126, 100, 196, 126, 108, 188, 122, 100,
+    180, 114, 100, 180, 114, 92, 188, 122, 100, 196, 122, 108, 196, 126, 108,
+    196, 126, 100, 188, 118, 100, 180, 114, 100, 188, 114, 92, 180, 118, 100,
+   188, 122, 100, 188, 118, 100, 188, 114, 100, 188, 118, 100, 188, 122, 100,
+   196, 122, 108, 188, 126, 108, 188, 122, 100, 196, 126, 108, 196, 130, 108,
+   196, 130, 116, 196, 130, 108, 196, 126, 108, 188, 118, 100, 180, 114, 100,
+       180, 110, 92, 172, 106, 84, 172, 106, 84, 172, 102, 84, 172, 102, 84,
+       172, 106, 84, 180, 106, 92, 180, 114, 92, 180, 114, 92, 180, 118, 92,
+       180, 118, 92, 180, 118, 92, 180, 118, 92, 188, 118, 92, 180, 118, 92,
+       180, 118, 92, 188, 118, 100, 180, 114, 84, 180, 110, 92, 188, 114, 92,
+       180, 110, 92, 188, 114, 92, 188, 118, 92, 188, 118, 100, 188, 118, 92,
+       180, 114, 92, 180, 114, 92, 180, 114, 92, 180, 114, 92, 180, 110, 84,
+       180, 110, 92, 180, 110, 84, 180, 110, 84, 188, 118, 92, 180, 114, 92,
+       180, 114, 92, 180, 110, 84, 180, 110, 92, 180, 114, 92, 180, 114, 92,
+    188, 118, 92, 188, 118, 100, 188, 122, 100, 188, 122, 100, 188, 122, 108,
+    188, 122, 100, 188, 122, 100, 188, 122, 100, 188, 118, 100, 180, 114, 92,
+     180, 114, 92, 180, 114, 100, 188, 114, 92, 180, 118, 100, 188, 118, 100,
+   188, 118, 100, 188, 118, 100, 188, 122, 100, 180, 122, 100, 188, 118, 100,
+    188, 122, 100, 188, 122, 100, 188, 126, 108, 188, 122, 100, 180, 118, 92,
+       172, 106, 84, 172, 110, 84, 172, 106, 84, 164, 102, 84, 172, 102, 76,
+       164, 102, 76, 164, 102, 84, 172, 102, 76, 156, 94, 76, 164, 98, 76,
+       164, 98, 76, 164, 102, 84, 164, 98, 76, 164, 102, 76, 164, 98, 76,
+       156, 98, 76, 164, 98, 84, 164, 98, 76, 156, 94, 76, 164, 94, 68,
+       156, 94, 76, 156, 94, 68, 164, 94, 76, 156, 94, 76, 164, 98, 76,
+       164, 98, 84, 164, 98, 76, 156, 94, 76, 156, 90, 68, 156, 94, 76,
+       156, 90, 68, 156, 94, 76, 164, 94, 76, 156, 94, 76, 164, 94, 76,
+       156, 98, 76, 164, 98, 76, 164, 98, 84, 156, 98, 76, 156, 94, 68,
+       164, 94, 76, 164, 98, 76, 164, 102, 84, 164, 102, 84, 164, 98, 76,
+       164, 98, 76, 164, 98, 76, 164, 98, 76, 156, 94, 76, 156, 94, 68,
+       156, 94, 76, 156, 94, 76, 156, 94, 76, 156, 94, 76, 156, 94, 68,
+       156, 94, 76, 172, 98, 84, 164, 98, 84, 172, 98, 76, 164, 94, 84,
+       172, 98, 84, 164, 98, 84, 164, 98, 84, 172, 98, 84, 164, 98, 84,
+       164, 98, 84, 164, 106, 84, 164, 102, 84, 172, 110, 92, 164, 98, 84,
+       124, 66, 44, 116, 58, 36, 116, 50, 36, 172, 106, 84, 164, 102, 84,
+       172, 102, 84, 164, 102, 84, 172, 102, 84, 164, 102, 84, 164, 102, 84,
+       172, 102, 84, 164, 102, 84, 172, 106, 84, 164, 106, 84, 172, 102, 84,
+       164, 102, 76, 172, 102, 84, 164, 102, 84, 172, 106, 84, 172, 102, 84,
+       180, 106, 84, 172, 110, 92, 180, 114, 92, 180, 110, 92, 180, 114, 92,
+       180, 114, 92, 180, 114, 100, 180, 114, 92, 180, 110, 92, 180, 110, 92,
+       172, 106, 84, 180, 110, 84, 172, 106, 84, 180, 110, 92, 180, 110, 92,
+       180, 118, 92, 180, 114, 100, 180, 110, 92, 180, 110, 92, 180, 106, 92,
+       172, 102, 84, 180, 114, 92, 180, 114, 92, 180, 114, 100, 180, 114, 92,
+       180, 110, 92, 180, 106, 92, 172, 106, 84, 172, 106, 84, 180, 106, 92,
+       172, 110, 92, 172, 106, 84, 180, 110, 92, 180, 110, 92, 180, 114, 92,
+      180, 110, 92, 180, 110, 92, 180, 110, 92, 188, 114, 100, 188, 122, 100,
+       188, 118, 100, 180, 110, 92, 172, 106, 84, 172, 102, 84, 164, 98, 76,
+       172, 102, 84, 172, 102, 84, 164, 102, 84, 172, 98, 76, 164, 98, 84,
+       172, 106, 84, 180, 106, 92, 180, 110, 92, 172, 106, 92, 172, 110, 84,
+       172, 106, 84, 172, 110, 92, 172, 106, 84, 172, 110, 92, 180, 106, 84,
+       172, 110, 92, 180, 110, 84, 172, 110, 92, 180, 110, 84, 180, 110, 92,
+       180, 114, 92, 180, 114, 92, 188, 114, 92, 188, 114, 92, 180, 110, 92,
+       180, 110, 92, 180, 110, 92, 180, 110, 84, 180, 110, 92, 172, 110, 84,
+       172, 106, 84, 172, 106, 92, 172, 106, 84, 180, 106, 84, 172, 106, 84,
+       172, 102, 84, 172, 106, 84, 172, 106, 84, 172, 106, 84, 172, 106, 84,
+       180, 110, 92, 180, 110, 92, 180, 110, 92, 180, 114, 92, 180, 114, 100,
+       180, 114, 92, 180, 110, 92, 180, 110, 92, 172, 102, 84, 172, 102, 84,
+       172, 106, 84, 172, 106, 84, 172, 106, 92, 180, 110, 84, 172, 110, 92,
+       180, 110, 92, 172, 106, 92, 172, 106, 84, 172, 106, 84, 172, 110, 92,
+       180, 114, 92, 180, 110, 92, 172, 110, 92, 172, 102, 84, 172, 106, 92,
+       164, 102, 84, 172, 102, 84, 164, 102, 84, 164, 98, 84, 164, 102, 76,
+       164, 98, 84, 164, 102, 84, 164, 98, 76, 164, 98, 76, 164, 98, 84,
+       172, 102, 76, 164, 102, 84, 164, 98, 84, 164, 98, 84, 164, 98, 76,
+       172, 102, 76, 164, 102, 84, 164, 102, 76, 164, 98, 84, 164, 98, 76,
+       164, 98, 76, 164, 98, 76, 164, 98, 76, 164, 98, 76, 164, 98, 76,
+       164, 98, 76, 164, 94, 76, 164, 98, 76, 164, 94, 76, 164, 98, 76,
+       164, 98, 76, 164, 98, 76, 164, 98, 76, 164, 98, 76, 164, 98, 76,
+       164, 102, 84, 164, 102, 84, 164, 98, 76, 156, 94, 76, 164, 98, 76,
+       164, 98, 84, 172, 102, 84, 164, 102, 76, 164, 98, 84, 164, 98, 76,
+       164, 98, 84, 164, 98, 76, 164, 94, 76, 164, 94, 76, 164, 94, 76,
+       156, 94, 76, 164, 94, 68, 164, 94, 76, 164, 94, 76, 156, 94, 76,
+       164, 94, 76, 164, 90, 76, 156, 94, 76, 164, 94, 76, 164, 94, 76,
+       156, 94, 76, 164, 94, 76, 164, 94, 76, 156, 94, 76, 164, 94, 76,
+       164, 102, 84, 164, 102, 84, 172, 106, 92, 156, 94, 76, 124, 62, 44,
+       116, 50, 36, 108, 50, 28, 156, 86, 68, 156, 90, 68, 148, 86, 68,
+       156, 90, 68, 148, 86, 68, 156, 90, 68, 156, 86, 68, 148, 90, 68,
+       156, 90, 68, 156, 90, 76, 156, 94, 76, 156, 90, 68, 148, 86, 68,
+       156, 86, 68, 156, 90, 68, 156, 90, 76, 148, 86, 68, 156, 86, 68,
+       156, 90, 68, 164, 90, 76, 156, 90, 68, 156, 90, 76, 164, 90, 68,
+       156, 90, 76, 164, 90, 68, 156, 90, 76, 156, 90, 68, 156, 90, 68,
+       156, 90, 76, 156, 90, 68, 156, 90, 68, 156, 90, 68, 156, 86, 76,
+       156, 86, 68, 156, 90, 76, 156, 90, 68, 156, 90, 76, 156, 90, 68,
+       164, 90, 76, 164, 94, 76, 164, 94, 76, 156, 94, 76, 156, 90, 68,
+       156, 90, 68, 156, 86, 68, 156, 86, 68, 156, 86, 68, 156, 86, 68,
+       156, 90, 68, 156, 90, 68, 156, 90, 76, 164, 90, 68, 156, 90, 76,
+       156, 90, 68, 148, 86, 68, 156, 86, 68, 164, 94, 76, 164, 94, 76,
+       156, 90, 68, 156, 90, 68, 156, 86, 68, 156, 86, 68, 156, 86, 68,
+       156, 86, 68, 156, 86, 68, 156, 86, 68, 156, 86, 68, 156, 86, 68,
+       156, 90, 68, 164, 94, 76, 156, 90, 68, 156, 94, 76, 164, 98, 76,
+       164, 94, 76, 156, 94, 68, 156, 90, 68, 156, 94, 68, 164, 94, 68,
+       156, 86, 68, 156, 86, 68, 156, 90, 68, 156, 90, 68, 164, 90, 68,
+       164, 90, 76, 164, 90, 68, 164, 90, 76, 164, 94, 76, 156, 94, 68,
+       164, 94, 68, 156, 90, 68, 156, 90, 68, 164, 90, 68, 164, 94, 76,
+       156, 90, 68, 156, 90, 68, 156, 90, 68, 156, 90, 68, 164, 90, 68,
+       156, 90, 68, 156, 90, 68, 164, 90, 68, 156, 90, 68, 156, 90, 76,
+       156, 90, 68, 156, 90, 76, 164, 90, 68, 156, 90, 68, 156, 90, 76,
+       156, 90, 68, 156, 90, 76, 156, 90, 68, 156, 90, 76, 156, 86, 68,
+       164, 90, 76, 156, 90, 68, 164, 90, 76, 156, 94, 68, 164, 94, 76,
+       156, 90, 68, 156, 90, 76, 156, 90, 68, 156, 90, 76, 156, 94, 76,
+       156, 94, 76, 156, 90, 76, 148, 86, 68, 164, 98, 84, 164, 98, 76,
+       164, 98, 76, 156, 94, 76, 164, 94, 76, 156, 94, 76, 164, 94, 76,
+       156, 94, 76, 164, 94, 76, 156, 98, 76, 164, 98, 76, 164, 98, 76,
+       164, 94, 76, 164, 98, 76, 156, 94, 76, 156, 94, 76, 164, 98, 76,
+       164, 98, 76, 164, 98, 76, 164, 98, 76, 164, 98, 76, 164, 98, 76,
+       164, 98, 76, 156, 94, 76, 156, 94, 76, 156, 90, 68, 156, 94, 76,
+       156, 94, 76, 164, 94, 76, 156, 98, 76, 164, 98, 76, 164, 98, 84,
+       156, 94, 76, 156, 94, 76, 156, 94, 76, 164, 94, 76, 164, 98, 76,
+       164, 98, 76, 164, 94, 76, 156, 90, 76, 156, 90, 68, 156, 90, 68,
+       156, 94, 76, 156, 90, 68, 156, 90, 68, 156, 90, 68, 148, 90, 68,
+       156, 90, 68, 156, 90, 76, 156, 94, 68, 156, 90, 68, 156, 94, 76,
+       156, 90, 68, 156, 94, 76, 156, 90, 68, 156, 94, 68, 156, 82, 68,
+       156, 86, 76, 156, 90, 76, 156, 86, 76, 148, 86, 68, 156, 86, 68,
+       156, 86, 76, 156, 90, 68, 156, 94, 76, 164, 94, 84, 164, 98, 84,
+       156, 94, 76, 156, 98, 76, 148, 86, 68, 116, 54, 36, 108, 50, 28,
+       108, 50, 36, 140, 78, 60, 140, 78, 60, 148, 78, 60, 140, 78, 60,
+       140, 78, 60, 140, 78, 60, 140, 78, 60, 140, 78, 60, 148, 82, 60,
+       148, 82, 60, 148, 82, 60, 148, 78, 60, 140, 74, 52, 140, 74, 52,
+       140, 78, 60, 148, 82, 60, 140, 70, 52, 140, 74, 52, 148, 74, 60,
+       140, 78, 60, 148, 74, 60, 140, 74, 52, 140, 74, 52, 140, 78, 60,
+       140, 74, 52, 148, 78, 60, 140, 74, 60, 148, 78, 60, 148, 74, 60,
+       148, 78, 60, 148, 74, 60, 148, 78, 60, 140, 70, 52, 140, 70, 52,
+       148, 74, 60, 140, 74, 60, 148, 78, 60, 148, 78, 68, 140, 78, 60,
+       148, 78, 60, 140, 78, 60, 148, 78, 60, 148, 78, 60, 148, 74, 60,
+       140, 74, 52, 140, 74, 52, 140, 74, 52, 140, 74, 52, 140, 74, 52,
+       148, 74, 60, 148, 78, 60, 140, 78, 60, 148, 74, 60, 140, 74, 52,
+       140, 70, 52, 140, 74, 52, 140, 78, 60, 148, 78, 60, 148, 78, 60,
+       148, 78, 60, 148, 78, 60, 148, 82, 60, 140, 74, 52, 140, 74, 52,
+       140, 78, 60, 140, 74, 52, 140, 74, 52, 140, 74, 52, 140, 74, 52,
+       140, 78, 60, 140, 82, 60, 148, 82, 60, 148, 86, 68, 148, 86, 60,
+       140, 82, 60, 148, 78, 60, 140, 78, 60, 140, 78, 60, 140, 70, 52,
+       140, 70, 52, 140, 74, 52, 140, 70, 52, 140, 74, 52, 140, 70, 52,
+       140, 74, 52, 140, 74, 52, 140, 78, 60, 148, 74, 60, 140, 74, 52,
+       140, 74, 60, 140, 74, 52, 140, 74, 60, 140, 78, 60, 148, 78, 60,
+       156, 82, 60, 148, 82, 68, 156, 82, 60, 148, 82, 68, 148, 82, 60,
+       156, 82, 68, 148, 82, 60, 148, 82, 68, 148, 82, 60, 148, 82, 60,
+       148, 82, 60, 148, 82, 68, 148, 78, 60, 156, 82, 60, 148, 82, 68,
+       148, 82, 60, 156, 82, 60, 148, 82, 60, 156, 82, 68, 148, 82, 60,
+       156, 86, 68, 148, 82, 60, 156, 82, 68, 148, 82, 60, 148, 82, 68,
+       148, 82, 68, 148, 82, 68, 148, 86, 68, 148, 82, 68, 156, 86, 68,
+       148, 82, 68, 148, 82, 60, 148, 82, 68, 140, 78, 60, 148, 78, 68,
+       140, 78, 60, 148, 78, 60, 140, 78, 60, 148, 78, 60, 140, 78, 60,
+       148, 82, 60, 148, 78, 60, 140, 78, 60, 140, 78, 60, 140, 78, 60,
+       140, 78, 60, 148, 78, 60, 148, 82, 60, 140, 78, 60, 148, 78, 60,
+       140, 78, 60, 148, 78, 60, 140, 78, 60, 140, 78, 60, 148, 78, 60,
+       148, 82, 60, 140, 74, 52, 140, 78, 60, 148, 78, 60, 140, 78, 60,
+       148, 82, 60, 148, 82, 60, 148, 82, 60, 148, 82, 60, 148, 78, 60,
+       148, 78, 60, 140, 78, 60, 140, 78, 60, 148, 82, 60, 148, 82, 60,
+       148, 78, 60, 140, 78, 60, 148, 86, 60, 148, 82, 68, 148, 82, 60,
+       148, 82, 60, 140, 78, 60, 148, 82, 60, 148, 78, 60, 148, 78, 60,
+       140, 78, 60, 140, 78, 60, 140, 78, 60, 140, 78, 60, 140, 78, 60,
+       140, 78, 60, 148, 78, 60, 140, 78, 60, 148, 82, 68, 148, 82, 68,
+       148, 86, 68, 156, 82, 68, 148, 82, 68, 148, 82, 68, 148, 82, 68,
+       148, 86, 68, 148, 82, 68, 148, 78, 60, 140, 82, 60, 140, 74, 60,
+       140, 78, 60, 140, 74, 60, 116, 50, 36, 108, 50, 36, 108, 50, 28,
+       108, 42, 28, 108, 42, 20, 108, 42, 20, 108, 42, 20, 116, 46, 28,
+       108, 42, 20, 116, 46, 28, 108, 42, 20, 108, 46, 28, 108, 46, 28,
+       116, 46, 28, 108, 46, 20, 108, 42, 20, 100, 42, 20, 108, 42, 20,
+       108, 42, 28, 108, 42, 20, 116, 46, 28, 116, 46, 28, 116, 46, 28,
+       108, 42, 20, 108, 38, 20, 108, 42, 28, 116, 42, 28, 108, 42, 20,
+       116, 46, 28, 116, 46, 28, 116, 46, 28, 116, 50, 28, 108, 46, 28,
+       116, 46, 28, 108, 42, 20, 108, 42, 28, 116, 42, 28, 108, 46, 28,
+       116, 46, 28, 116, 46, 28, 108, 46, 28, 116, 42, 28, 108, 42, 20,
+       116, 46, 28, 108, 42, 20, 116, 46, 28, 108, 46, 28, 108, 42, 20,
+       116, 42, 28, 108, 38, 20, 108, 42, 28, 116, 46, 28, 108, 46, 28,
+       116, 46, 28, 108, 42, 20, 108, 42, 20, 116, 42, 28, 116, 46, 28,
+       116, 50, 28, 116, 50, 28, 116, 50, 28, 116, 46, 28, 116, 46, 28,
+       116, 46, 28, 116, 50, 28, 116, 46, 28, 116, 50, 36, 124, 50, 36,
+       116, 50, 28, 116, 46, 28, 116, 46, 28, 116, 46, 28, 116, 46, 28,
+       108, 46, 20, 108, 50, 28, 116, 50, 28, 116, 54, 28, 108, 46, 28,
+       108, 46, 20, 108, 42, 20, 108, 42, 20, 116, 50, 28, 116, 46, 28,
+       116, 46, 28, 116, 46, 28, 116, 46, 28, 108, 46, 28, 116, 46, 28,
+       116, 46, 28, 116, 46, 28, 116, 46, 28, 116, 46, 28, 116, 42, 28,
+       116, 46, 28, 116, 46, 28, 116, 50, 28, 124, 50, 36, 124, 58, 36,
+       124, 58, 36, 124, 58, 36, 124, 58, 36, 124, 58, 44, 124, 58, 36,
+       124, 58, 36, 124, 54, 36, 132, 62, 44, 124, 54, 36, 124, 58, 36,
+       124, 58, 36, 124, 58, 36, 124, 54, 44, 124, 58, 36, 132, 62, 44,
+       124, 54, 36, 124, 58, 36, 124, 58, 36, 124, 58, 36, 124, 58, 36,
+       124, 54, 36, 124, 58, 36, 124, 58, 36, 124, 58, 44, 124, 58, 36,
+       124, 58, 44, 124, 54, 36, 124, 58, 44, 124, 58, 36, 124, 58, 44,
+       124, 58, 44, 132, 62, 44, 124, 62, 44, 132, 62, 44, 124, 58, 44,
+       124, 58, 44, 124, 58, 44, 132, 62, 44, 124, 62, 44, 132, 62, 44,
+       124, 62, 44, 124, 62, 44, 124, 58, 36, 124, 58, 36, 124, 62, 44,
+       124, 62, 44, 132, 62, 44, 116, 58, 36, 124, 58, 36, 124, 58, 44,
+       124, 62, 44, 124, 62, 44, 124, 62, 44, 124, 62, 44, 124, 58, 36,
+       124, 62, 44, 124, 58, 36, 124, 62, 44, 132, 62, 44, 124, 62, 44,
+       132, 62, 44, 124, 66, 44, 132, 62, 44, 124, 62, 44, 124, 58, 36,
+       124, 58, 36, 124, 62, 44, 132, 62, 44, 124, 62, 44, 124, 62, 44,
+       124, 58, 36, 124, 62, 44, 124, 58, 36, 124, 58, 36, 124, 58, 44,
+       124, 58, 36, 124, 58, 36, 116, 58, 36, 124, 58, 36, 124, 58, 36,
+       124, 58, 36, 124, 58, 36, 124, 58, 36, 124, 58, 36, 124, 58, 36,
+       124, 58, 36, 124, 58, 36, 124, 50, 36, 124, 54, 36, 124, 54, 36,
+       124, 54, 36, 116, 54, 36, 116, 50, 36, 124, 54, 36, 124, 54, 44,
+       124, 54, 36, 116, 54, 36, 116, 54, 36, 108, 46, 28, 124, 58, 44,
+       124, 58, 44, 100, 42, 20, 108, 50, 28
+};
diff --git a/hacks/glx/gears.c b/hacks/glx/gears.c
new file mode 100644 (file)
index 0000000..1350f73
--- /dev/null
@@ -0,0 +1,516 @@
+/* -*- Mode: C; tab-width: 4 -*- */
+/* gears --- 3D gear wheels */
+
+#if !defined( lint ) && !defined( SABER )
+static const char sccsid[] = "@(#)gears.c      4.07 97/11/24 xlockmore";
+
+#endif
+
+/*-
+ * 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.
+ *
+ * This file is provided AS IS with no warranties of any kind.  The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof.  In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * Revision History:
+ * 10-May-97: Compatible with xscreensaver
+ * 22-Mar-97: Added support for -mono mode, and monochrome X servers.
+ *              Ed Mackey, emackey@netaxs.com
+ * 13-Mar-97: Memory leak fix by Tom Schmidt <tschmidt@micron.com>
+ * 1996: "written" by Danny Sung <dannys@ucla.edu>
+ *       Based on 3-D gear wheels by Brian Paul which is in the public domain.
+ */
+
+/*-
+ * PURIFY 3.0a on SunOS4 reports an unitialized memory read on each of
+ * the glCallList() functions below when using MesaGL 2.1.  This has
+ * been fixed in MesaGL 2.2 and later releases.
+ */
+
+/*-
+ * due to a Bug/feature in VMS X11/Intrinsic.h has to be placed before xlock.
+ * otherwise caddr_t is not defined correctly
+ */
+
+#include <X11/Intrinsic.h>
+
+#ifdef STANDALONE
+# define PROGCLASS                                     "Gears"
+# define HACK_INIT                                     init_gears
+# define HACK_DRAW                                     draw_gears
+# define gears_opts                                    xlockmore_opts
+# define DEFAULTS      "*count:                1       \n"                     \
+                                       "*cycles:               2       \n"                     \
+                                       "*delay:                100     \n"                     \
+                                       "*wireframe:    False   \n"
+# include "xlockmore.h"                                /* from the xscreensaver distribution */
+#else  /* !STANDALONE */
+# include "xlock.h"                                    /* from the xlockmore distribution */
+#endif /* !STANDALONE */
+
+#ifdef USE_GL
+
+ModeSpecOpt gears_opts =
+{0, NULL, 0, NULL, NULL};
+
+#ifdef USE_MODULES
+ModStruct   gears_description =
+{"gears", "init_gears", "draw_gears", "release_gears",
+ "draw_gears", "init_gears", NULL, &gears_opts,
+ 1000, 1, 2, 1, 4, 1.0, "",
+ "Shows GL's gears", 0, NULL};
+
+#endif
+
+typedef struct {
+       GLfloat     view_rotx, view_roty, view_rotz;
+       GLuint      gear1, gear2, gear3;
+       GLfloat     angle;
+       GLXContext *glx_context;
+       Window      window;
+#if 0
+       Window      win;
+#endif
+} gearsstruct;
+
+static gearsstruct *gears = NULL;
+
+/*-
+ * Draw a gear wheel.  You'll probably want to call this function when
+ * building a display list since we do a lot of trig here.
+ *
+ * Input:  inner_radius - radius of hole at center
+ *         outer_radius - radius at center of teeth
+ *         width - width of gear
+ *         teeth - number of teeth
+ *         tooth_depth - depth of tooth
+ *         wire - true for wireframe mode
+ */
+static void
+gear(GLfloat inner_radius, GLfloat outer_radius, GLfloat width,
+     GLint teeth, GLfloat tooth_depth, Bool wire)
+{
+       GLint       i;
+       GLfloat     r0, r1, r2;
+       GLfloat     angle, da;
+       GLfloat     u, v, len;
+
+       r0 = inner_radius;
+       r1 = outer_radius - tooth_depth / 2.0;
+       r2 = outer_radius + tooth_depth / 2.0;
+
+       da = 2.0 * M_PI / teeth / 4.0;
+
+       glShadeModel(GL_FLAT);
+
+       /* This subroutine got kind of messy when I added all the checks
+        * for wireframe mode.  A much cleaner solution that I sometimes
+        * use is to have a variable hold the value GL_LINE_LOOP when
+        * in wireframe mode, or hold the value GL_POLYGON otherwise.
+        * Then I just call glBegin(that_variable), give my polygon
+        * coordinates, and glEnd().  Pretty neat eh?  Too bad I couldn't
+        * integrate that trick here.
+        *                                  --Ed.
+        */
+
+       if (!wire)
+               glNormal3f(0.0, 0.0, 1.0);
+
+       /* draw front face */
+       if (!wire)
+               glBegin(GL_QUAD_STRIP);
+       for (i = 0; i <= teeth; i++) {
+               if (wire)
+                       glBegin(GL_LINES);
+               angle = i * 2.0 * M_PI / teeth;
+               glVertex3f(r0 * cos(angle), r0 * sin(angle), width * 0.5);
+               glVertex3f(r1 * cos(angle), r1 * sin(angle), width * 0.5);
+               if (!wire) {
+                       glVertex3f(r0 * cos(angle), r0 * sin(angle), width * 0.5);
+                       glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), width * 0.5);
+               } else {
+                       glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), width * 0.5);
+                       glVertex3f(r1 * cos(angle + 4 * da), r1 * sin(angle + 4 * da), width * 0.5);
+                       glEnd();
+               }
+       }
+       if (!wire)
+               glEnd();
+
+       /* draw front sides of teeth */
+       if (!wire)
+               glBegin(GL_QUADS);
+       da = 2.0 * M_PI / teeth / 4.0;
+       for (i = 0; i < teeth; i++) {
+               angle = i * 2.0 * M_PI / teeth;
+
+               if (wire)
+                       glBegin(GL_LINE_LOOP);
+               glVertex3f(r1 * cos(angle), r1 * sin(angle), width * 0.5);
+               glVertex3f(r2 * cos(angle + da), r2 * sin(angle + da), width * 0.5);
+               glVertex3f(r2 * cos(angle + 2 * da), r2 * sin(angle + 2 * da), width * 0.5);
+               glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), width * 0.5);
+               if (wire)
+                       glEnd();
+       }
+       if (!wire)
+               glEnd();
+
+
+       if (!wire)
+               glNormal3f(0.0, 0.0, -1.0);
+
+       /* draw back face */
+       if (!wire)
+               glBegin(GL_QUAD_STRIP);
+       for (i = 0; i <= teeth; i++) {
+               angle = i * 2.0 * M_PI / teeth;
+               if (wire)
+                       glBegin(GL_LINES);
+               glVertex3f(r1 * cos(angle), r1 * sin(angle), -width * 0.5);
+               glVertex3f(r0 * cos(angle), r0 * sin(angle), -width * 0.5);
+               if (!wire) {
+                       glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), -width * 0.5);
+                       glVertex3f(r0 * cos(angle), r0 * sin(angle), -width * 0.5);
+               } else {
+                       glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), -width * 0.5);
+                       glVertex3f(r1 * cos(angle + 4 * da), r1 * sin(angle + 4 * da), -width * 0.5);
+                       glEnd();
+               }
+       }
+       if (!wire)
+               glEnd();
+
+       /* draw back sides of teeth */
+       if (!wire)
+               glBegin(GL_QUADS);
+       da = 2.0 * M_PI / teeth / 4.0;
+       for (i = 0; i < teeth; i++) {
+               angle = i * 2.0 * M_PI / teeth;
+
+               if (wire)
+                       glBegin(GL_LINE_LOOP);
+               glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), -width * 0.5);
+               glVertex3f(r2 * cos(angle + 2 * da), r2 * sin(angle + 2 * da), -width * 0.5);
+               glVertex3f(r2 * cos(angle + da), r2 * sin(angle + da), -width * 0.5);
+               glVertex3f(r1 * cos(angle), r1 * sin(angle), -width * 0.5);
+               if (wire)
+                       glEnd();
+       }
+       if (!wire)
+               glEnd();
+
+
+       /* draw outward faces of teeth */
+       if (!wire)
+               glBegin(GL_QUAD_STRIP);
+       for (i = 0; i < teeth; i++) {
+               angle = i * 2.0 * M_PI / teeth;
+
+               if (wire)
+                       glBegin(GL_LINES);
+               glVertex3f(r1 * cos(angle), r1 * sin(angle), width * 0.5);
+               glVertex3f(r1 * cos(angle), r1 * sin(angle), -width * 0.5);
+               u = r2 * cos(angle + da) - r1 * cos(angle);
+               v = r2 * sin(angle + da) - r1 * sin(angle);
+               len = sqrt(u * u + v * v);
+               u /= len;
+               v /= len;
+               glNormal3f(v, -u, 0.0);
+               glVertex3f(r2 * cos(angle + da), r2 * sin(angle + da), width * 0.5);
+               glVertex3f(r2 * cos(angle + da), r2 * sin(angle + da), -width * 0.5);
+               glNormal3f(cos(angle), sin(angle), 0.0);
+               glVertex3f(r2 * cos(angle + 2 * da), r2 * sin(angle + 2 * da), width * 0.5);
+               glVertex3f(r2 * cos(angle + 2 * da), r2 * sin(angle + 2 * da), -width * 0.5);
+               u = r1 * cos(angle + 3 * da) - r2 * cos(angle + 2 * da);
+               v = r1 * sin(angle + 3 * da) - r2 * sin(angle + 2 * da);
+               glNormal3f(v, -u, 0.0);
+               glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), width * 0.5);
+               glVertex3f(r1 * cos(angle + 3 * da), r1 * sin(angle + 3 * da), -width * 0.5);
+               glNormal3f(cos(angle), sin(angle), 0.0);
+               if (wire)
+                       glEnd();
+       }
+
+       if (!wire) {
+               glVertex3f(r1 * cos(0), r1 * sin(0), width * 0.5);
+               glVertex3f(r1 * cos(0), r1 * sin(0), -width * 0.5);
+               glEnd();
+       }
+       if (!wire)
+               glShadeModel(GL_SMOOTH);
+
+       /* draw inside radius cylinder */
+       if (!wire)
+               glBegin(GL_QUAD_STRIP);
+       for (i = 0; i <= teeth; i++) {
+               angle = i * 2.0 * M_PI / teeth;
+               if (wire)
+                       glBegin(GL_LINES);
+               glNormal3f(-cos(angle), -sin(angle), 0.0);
+               glVertex3f(r0 * cos(angle), r0 * sin(angle), -width * 0.5);
+               glVertex3f(r0 * cos(angle), r0 * sin(angle), width * 0.5);
+               if (wire) {
+                       glVertex3f(r0 * cos(angle), r0 * sin(angle), -width * 0.5);
+                       glVertex3f(r0 * cos(angle + 4 * da), r0 * sin(angle + 4 * da), -width * 0.5);
+                       glVertex3f(r0 * cos(angle), r0 * sin(angle), width * 0.5);
+                       glVertex3f(r0 * cos(angle + 4 * da), r0 * sin(angle + 4 * da), width * 0.5);
+                       glEnd();
+               }
+       }
+       if (!wire)
+               glEnd();
+
+}
+
+static void
+draw(ModeInfo * mi)
+{
+       gearsstruct *gp = &gears[MI_SCREEN(mi)];
+       int         wire = MI_IS_WIREFRAME(mi);
+
+       if (!wire) {
+               glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+       } else {
+               glClear(GL_COLOR_BUFFER_BIT);
+       }
+
+       glPushMatrix();
+       glRotatef(gp->view_rotx, 1.0, 0.0, 0.0);
+       glRotatef(gp->view_roty, 0.0, 1.0, 0.0);
+       glRotatef(gp->view_rotz, 0.0, 0.0, 1.0);
+
+       glPushMatrix();
+       glTranslatef(-3.0, -2.0, 0.0);
+       glRotatef(gp->angle, 0.0, 0.0, 1.0);
+/* PURIFY 4.0.1 reports an unitialized memory read on the next line when using
+   * MesaGL 2.2 and -mono.  This has been fixed in MesaGL 2.3 and later. */
+       glCallList(gp->gear1);
+       glPopMatrix();
+
+       glPushMatrix();
+       glTranslatef(3.1, -2.0, 0.0);
+       glRotatef(-2.0 * gp->angle - 9.0, 0.0, 0.0, 1.0);
+       glCallList(gp->gear2);
+       glPopMatrix();
+
+       glPushMatrix();
+       glTranslatef(-3.1, 4.2, 0.0);
+       glRotatef(-2.0 * gp->angle - 25.0, 0.0, 0.0, 1.0);
+       glCallList(gp->gear3);
+       glPopMatrix();
+
+       glPopMatrix();
+}
+
+
+
+/* new window size or exposure */
+static void
+reshape(int width, int height)
+{
+       GLfloat     h = (GLfloat) height / (GLfloat) width;
+
+       glViewport(0, 0, (GLint) width, (GLint) height);
+       glMatrixMode(GL_PROJECTION);
+       glLoadIdentity();
+       glFrustum(-1.0, 1.0, -h, h, 5.0, 60.0);
+       glMatrixMode(GL_MODELVIEW);
+       glLoadIdentity();
+       glTranslatef(0.0, 0.0, -40.0);
+
+       /* The depth buffer will be cleared, if needed, before the
+        * next frame.  Right now we just want to black the screen.
+        */
+       glClear(GL_COLOR_BUFFER_BIT);
+
+}
+
+
+static void
+pinit(ModeInfo * mi)
+{
+       gearsstruct *gp = &gears[MI_SCREEN(mi)];
+       static GLfloat pos[4] =
+       {5.0, 5.0, 10.0, 1.0};
+       static GLfloat red[4] =
+       {0.8, 0.1, 0.0, 1.0};
+       static GLfloat green[4] =
+       {0.0, 0.8, 0.2, 1.0};
+       static GLfloat blue[4] =
+       {0.2, 0.2, 1.0, 1.0};
+       static GLfloat gray[4] =
+       {0.5, 0.5, 0.5, 1.0};
+       static GLfloat white[4] =
+       {1.0, 1.0, 1.0, 1.0};
+       int         wire = MI_IS_WIREFRAME(mi);
+       int         mono = MI_IS_MONO(mi);
+
+       if (!wire) {
+               glLightfv(GL_LIGHT0, GL_POSITION, pos);
+               glEnable(GL_CULL_FACE);
+               glEnable(GL_LIGHTING);
+               glEnable(GL_LIGHT0);
+               glEnable(GL_DEPTH_TEST);
+       }
+#if 0
+/*-
+ * Messes up on multiscreen Pseudocolor:0 StaticGray(monochrome):1
+ * 2nd time mode is run it is Grayscale on PseudoColor.
+ * The code below forces monochrome on TrueColor.
+ */
+       if (MI_IS_MONO(mi)) {
+               red[0] = red[1] = red[2] = 1.0;
+               green[0] = green[1] = green[2] = 1.0;
+               blue[0] = blue[1] = blue[2] = 1.0;
+       }
+#endif
+
+       /* make the gears */
+       gp->gear1 = glGenLists(1);
+       glNewList(gp->gear1, GL_COMPILE);
+       if (wire) {
+               if (mono)
+                       glColor4fv(white);
+               else
+                       glColor4fv(red);
+       } else {
+               if (mono)
+                       glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, gray);
+               else
+                       glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, red);
+       }
+       gear(1.0, 4.0, 1.0, 20, 0.7, wire);
+       glEndList();
+
+       gp->gear2 = glGenLists(1);
+       glNewList(gp->gear2, GL_COMPILE);
+       if (wire) {
+               if (mono)
+                       glColor4fv(white);
+               else
+                       glColor4fv(green);
+       } else {
+               if (mono)
+                       glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, gray);
+               else
+                       glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, green);
+       }
+       gear(0.5, 2.0, 2.0, 10, 0.7, wire);
+       glEndList();
+
+       gp->gear3 = glGenLists(1);
+       glNewList(gp->gear3, GL_COMPILE);
+       if (wire) {
+               if (mono)
+                       glColor4fv(white);
+               else
+                       glColor4fv(blue);
+       } else {
+               if (mono)
+                       glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, gray);
+               else
+                       glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, blue);
+       }
+       gear(1.3, 2.0, 0.5, 10, 0.7, wire);
+       glEndList();
+       if (!wire)
+               glEnable(GL_NORMALIZE);
+}
+
+void
+init_gears(ModeInfo * mi)
+{
+       int         screen = MI_SCREEN(mi);
+
+       /*Colormap    cmap; */
+       /* Boolean     rgba, doublebuffer, cmap_installed; */
+       gearsstruct *gp;
+
+       if (gears == NULL) {
+               if ((gears = (gearsstruct *) calloc(MI_NUM_SCREENS(mi),
+                                             sizeof (gearsstruct))) == NULL)
+                       return;
+       }
+       gp = &gears[screen];
+
+       gp->window = MI_WINDOW(mi);
+       gp->view_rotx = NRAND(360);
+       gp->view_roty = NRAND(360);
+       gp->view_rotz = NRAND(360);
+       gp->angle = NRAND(360);
+
+       if ((gp->glx_context = init_GL(mi)) != NULL) {
+               reshape(MI_WIDTH(mi), MI_HEIGHT(mi));
+               pinit(mi);
+       } else {
+               MI_CLEARWINDOW(mi);
+       }
+}
+
+void
+draw_gears(ModeInfo * mi)
+{
+       gearsstruct *gp = &gears[MI_SCREEN(mi)];
+       Display    *display = MI_DISPLAY(mi);
+       Window      window = MI_WINDOW(mi);
+       int         angle_incr = MI_CYCLES(mi) ? MI_CYCLES(mi) : 2;
+       int         rot_incr = MI_COUNT(mi) ? MI_COUNT(mi) : 1;
+
+       if (!gp->glx_context)
+               return;
+
+       glDrawBuffer(GL_BACK);
+
+       glXMakeCurrent(display, window, *(gp->glx_context));
+       draw(mi);
+
+       /* let's do something so we don't get bored */
+       gp->angle = (int) (gp->angle + angle_incr) % 360;
+       gp->view_rotx = (int) (gp->view_rotx + rot_incr) % 360;
+       gp->view_roty = (int) (gp->view_roty + rot_incr) % 360;
+       gp->view_rotz = (int) (gp->view_rotz + rot_incr) % 360;
+
+       glFinish();
+       glXSwapBuffers(display, window);
+}
+
+void
+release_gears(ModeInfo * mi)
+{
+       if (gears != NULL) {
+               int         screen;
+
+               for (screen = 0; screen < MI_NUM_SCREENS(mi); screen++) {
+                       gearsstruct *gp = &gears[screen];
+
+                       if (gp->glx_context) {
+                               /* Display lists MUST be freed while their glXContext is current. */
+                               glXMakeCurrent(MI_DISPLAY(mi), gp->window, *(gp->glx_context));
+
+                               if (glIsList(gp->gear1))
+                                       glDeleteLists(gp->gear1, 1);
+                               if (glIsList(gp->gear2))
+                                       glDeleteLists(gp->gear2, 1);
+                               if (glIsList(gp->gear3))
+                                       glDeleteLists(gp->gear3, 1);
+
+                       }
+               }
+               (void) free((void *) gears);
+               gears = NULL;
+       }
+       FreeAllGL(mi);
+}
+
+
+/*********************************************************/
+
+#endif
diff --git a/hacks/glx/glplanet.c b/hacks/glx/glplanet.c
new file mode 100644 (file)
index 0000000..39ae21b
--- /dev/null
@@ -0,0 +1,804 @@
+/* -*- Mode: C; tab-width: 4 -*- */
+/* glplanet --- 3D rotating planet, e.g., Earth. */
+
+#if !defined( lint ) && !defined( SABER )
+static const char sccsid[] = "@(#)plate.c      4.07 97/11/24 xlockmore";
+
+#endif
+
+/*-
+ * 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.
+ *
+ * This file is provided AS IS with no warranties of any kind.  The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof.  In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * Revision History:
+ * 9-Oct-98:  dek@cgl.ucsf.edu  Added stars.
+ *
+ * 8-Oct-98:  jwz@jwz.org   Made the 512x512x1 xearth image be built in.
+ *                          Made it possible to load XPM or XBM files.
+ *                          Made the planet bounce and roll around.
+ *
+ * 8-Oct-98: Released initial version of "glplanet"
+ * (David Konerding, dek@cgl.ucsf.edu)
+ *
+ * BUGS:
+ * -bounce is broken
+ * 
+ *   For even more spectacular results, grab the images from the "SSysten"
+ *   package (http://www.msu.edu/user/kamelkev/) and do this:
+ *
+ *     cd ssystem-1.4/hires/
+ *     foreach f ( *.jpg )
+ *       djpeg $f | ppmquant 254 | ppmtoxpm > /tmp/$f:r.xpm
+ *     end
+ *
+ *     cd /tmp
+ *     foreach f ( *.xpm )
+ *       glplanet -image $f
+ *     end
+ */
+
+
+/*-
+ * due to a Bug/feature in VMS X11/Intrinsic.h has to be placed before xlock.
+ * otherwise caddr_t is not defined correctly
+ */
+
+#include <X11/Intrinsic.h>
+
+#ifdef STANDALONE
+# define PROGCLASS                                             "Planet"
+# define HACK_INIT                                             init_planet
+# define HACK_DRAW                                             draw_planet
+# define planet_opts                                   xlockmore_opts
+#define DEFAULTS       "*delay:                        15000   \n"     \
+                    "*rotate:           True    \n" \
+                    "*roll:             True    \n" \
+                    "*bounce:           True    \n" \
+                                       "*wireframe:            False   \n"     \
+                                       "*light:                        True    \n"     \
+                                       "*texture:                      True    \n" \
+                                       "*stars:                        True    \n" \
+                                       "*image:                        BUILTIN \n" \
+                                       "*imageForeground:      Green   \n" \
+                                       "*imageBackground:      Blue    \n"
+
+# include "xlockmore.h"                                /* from the xscreensaver distribution */
+#else  /* !STANDALONE */
+# include "xlock.h"                                    /* from the xlockmore distribution */
+#endif /* !STANDALONE */
+
+#ifdef USE_GL /* whole file */
+
+#ifdef HAVE_XPM
+# include <X11/xpm.h>
+# ifndef PIXEL_ALREADY_TYPEDEFED
+#  define PIXEL_ALREADY_TYPEDEFED /* Sigh, Xmu/Drawing.h needs this... */
+# endif
+#endif
+
+#ifdef HAVE_XMU
+# ifndef VMS
+#  include <X11/Xmu/Drawing.h>
+#else  /* VMS */
+#  include <Xmu/Drawing.h>
+# endif /* VMS */
+#endif
+
+
+#include <GL/glu.h>
+
+#define DEF_ROTATE  "True"
+#define DEF_ROLL    "True"
+#define DEF_BOUNCE  "True"
+#define DEF_TEXTURE "True"
+#define DEF_STARS "True"
+#define DEF_LIGHT   "True"
+#define DEF_IMAGE   "BUILTIN"
+
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+static int do_rotate;
+static int do_roll;
+static int do_bounce;
+static int do_texture;
+static int do_stars;
+static int do_light;
+static char *which_image;
+static XrmOptionDescRec opts[] = {
+  {"-rotate",  ".glplanet.rotate",  XrmoptionNoArg, (caddr_t) "true" },
+  {"+rotate",  ".glplanet.rotate",  XrmoptionNoArg, (caddr_t) "false" },
+  {"-roll",    ".glplanet.roll",    XrmoptionNoArg, (caddr_t) "true" },
+  {"+roll",    ".glplanet.roll",    XrmoptionNoArg, (caddr_t) "false" },
+  {"-bounce",  ".glplanet.bounce",  XrmoptionNoArg, (caddr_t) "true" },
+  {"+bounce",  ".glplanet.bounce",  XrmoptionNoArg, (caddr_t) "false" },
+  {"-texture", ".glplanet.texture", XrmoptionNoArg, (caddr_t) "true" },
+  {"+texture", ".glplanet.texture", XrmoptionNoArg, (caddr_t) "false" },
+  {"-stars",   ".glplanet.stars",   XrmoptionNoArg, (caddr_t) "true" },
+  {"+stars",   ".glplanet.stars",   XrmoptionNoArg, (caddr_t) "false" },
+  {"-light",   ".glplanet.light",   XrmoptionNoArg, (caddr_t) "true" },
+  {"+light",   ".glplanet.light",   XrmoptionNoArg, (caddr_t) "false" },
+  {"-image",   ".glplanet.image",  XrmoptionSepArg, (caddr_t) 0 },
+};
+
+static argtype vars[] = {
+  {(caddr_t *) &do_rotate,   "rotate",  "Rotate",  DEF_ROTATE,  t_Bool},
+  {(caddr_t *) &do_roll,     "roll",    "Roll",    DEF_ROLL,    t_Bool},
+  {(caddr_t *) &do_bounce,   "bounce",  "Bounce",  DEF_BOUNCE,  t_Bool},
+  {(caddr_t *) &do_texture,  "texture", "Texture", DEF_TEXTURE, t_Bool},
+  {(caddr_t *) &do_stars,  "stars", "Stars", DEF_STARS, t_Bool},
+  {(caddr_t *) &do_light,    "light",   "Light",   DEF_LIGHT,   t_Bool},
+  {(caddr_t *) &which_image, "image",   "Image",   DEF_IMAGE,   t_String},
+};
+
+ModeSpecOpt planet_opts = {countof(opts), opts, countof(vars), vars, NULL};
+
+#ifdef USE_MODULES
+ModStruct   planet_description =
+{"planet", "init_planet", "draw_planet", "release_planet",
+ "draw_planet", "init_planet", NULL, &planet_opts,
+ 1000, 1, 2, 1, 4, 1.0, "",
+ "Animates texture mapped sphere (planet)", 0, NULL};
+#endif
+
+#include "../images/earth.xbm"
+#include "xpm-ximage.h"
+
+
+/*-
+ * slices and stacks are used in the sphere parameterization routine.
+ * more slices and stacks will increase the quality of the sphere,
+ * at the expense of rendering speed
+ */
+
+#define NUM_STARS 1000
+#define SLICES 15
+#define STACKS 15
+
+/* radius of the sphere- fairly arbitrary */
+#define RADIUS 4
+
+/* distance away from the sphere model */
+#define DIST 40
+
+
+
+/* structure for holding the planet data */
+typedef struct {
+  GLuint platelist;
+  GLuint starlist;
+  int screen_width, screen_height;
+  GLXContext *glx_context;
+  Window window;
+
+  XColor fg, bg;
+
+  GLfloat tx, ty, tz;
+  GLfloat dtx, dty, dtz;
+  GLfloat xpos, ypos, zpos;
+  GLfloat dx, dy, dz;
+  GLfloat box_width, box_height, box_depth;
+
+} planetstruct;
+
+
+static planetstruct *planets = NULL;
+
+
+static inline void
+normalize(GLfloat v[3])
+{
+       GLfloat     d = (GLfloat) sqrt((double) (v[0] * v[0] + v[1] * v[1] + v[2] * v[2]));
+
+       if (d != 0) {
+               v[0] /= d;
+               v[1] /= d;
+               v[2] /= d;
+       } else {
+               v[0] = v[1] = v[2] = 0;
+       }
+}
+
+
+/* Set up and enable texturing on our object */
+static void
+setup_xbm_texture (char *bits, int width, int height,
+                                  XColor *fgc, XColor *bgc)
+{
+  unsigned int fg = (((fgc->red  >> 8) << 16) |
+                                        ((fgc->green >> 8) << 8) |
+                                        ((fgc->blue >> 8)));
+  unsigned int bg = (((bgc->red  >> 8) << 16) |
+                                        ((bgc->green >> 8) << 8) |
+                                        ((bgc->blue >> 8)));
+
+  unsigned char *data = (unsigned char *)
+       malloc ((width * height * 24) / 8);
+  unsigned char *out = data;
+  int x, y;
+
+  for (y = 0; y < height; y++)
+       for (x = 0; x < width; x++)
+         {
+               unsigned char byte = bits [(y * (width / 8) + (x / 8))];
+               unsigned char bit = (byte & (1 << (x % 8))) >> (x % 8);
+               unsigned int word = (bit ? bg : fg);
+               *out++ = (word & 0xFF0000) >> 16;
+               *out++ = (word & 0x00FF00) >> 8;
+               *out++ = (word & 0x0000FF);
+         }
+
+  glTexImage2D(GL_TEXTURE_2D, 0, 3, width, height, 0,
+                          GL_RGB, GL_UNSIGNED_BYTE, data);
+
+  /* setup parameters for texturing */
+  glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
+  glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
+  glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+  glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+  glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+  glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+}
+
+
+static void
+setup_file_texture (ModeInfo *mi, char *filename)
+{
+  Display *dpy = mi->dpy;
+  Visual *visual = mi->xgwa.visual;
+  Colormap cmap = mi->xgwa.colormap;
+
+#ifdef HAVE_XPM
+  {
+       char **xpm_data = 0;
+       int result = XpmReadFileToData (filename, &xpm_data);
+       switch (result) {
+       case XpmSuccess:
+         {
+               XImage *image = xpm_to_ximage (dpy, visual, cmap, xpm_data);
+
+               glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,
+                                        image->width, image->height, 0,
+                                        GL_RGBA, GL_UNSIGNED_BYTE, image->data);
+
+               /* setup parameters for texturing */
+               glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
+               glPixelStorei(GL_UNPACK_ROW_LENGTH, image->width);
+
+               glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
+               glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+               glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+               glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+               glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+               return;
+         }
+         break;
+
+       case XpmOpenFailed:
+         fprintf (stderr, "%s: file %s doesn't exist.\n", progname, filename);
+         exit (-1);
+         break;
+
+       case XpmFileInvalid:
+         /* Fall through and try it as an XBM. */
+         break;
+
+       case XpmNoMemory:
+         fprintf (stderr, "%s: XPM: out of memory\n", progname);
+         exit (-1);
+         break;
+
+       default:
+         fprintf (stderr, "%s: XPM: unknown error code %d\n", progname, result);
+         exit (-1);
+         break;
+       }
+  }
+#endif /* HAVE_XPM */
+
+#ifdef HAVE_XMU
+  {
+       planetstruct *gp = &planets[MI_SCREEN(mi)];
+       unsigned int width = 0;
+       unsigned int height = 0;
+       unsigned char *data = 0;
+       int xhot, yhot;
+       int status = XmuReadBitmapDataFromFile (filename, &width, &height, &data,
+                                                                                       &xhot, &yhot);
+       if (status != Success)
+         {
+# ifdef HAVE_XPM
+               fprintf (stderr, "%s: not an XPM file: %s\n", progname, filename);
+# endif
+               fprintf (stderr, "%s: not an XBM file: %s\n", progname, filename);
+               exit (1);
+         }
+
+       setup_xbm_texture ((char *) data, width, height, &gp->fg, &gp->bg);
+  }
+#else  /* !XMU */
+
+# ifdef HAVE_XPM
+  fprintf (stderr, "%s: not an XPM file: %s\n", progname, filename);
+# endif
+  fprintf (stderr, "%s: your vendor doesn't ship the standard Xmu library.\n",
+                  progname);
+  fprintf (stderr, "%s: we can't load XBM files without it.\n",progname);
+  exit (1);
+#endif /* !XMU */
+}
+
+
+static void
+setup_texture(ModeInfo * mi)
+{
+  planetstruct *gp = &planets[MI_SCREEN(mi)];
+  if (!which_image ||
+         !*which_image ||
+         !strcmp(which_image, "BUILTIN"))
+       setup_xbm_texture (earth_bits, earth_width, earth_height,
+                                          &gp->fg, &gp->bg);
+  else
+       setup_file_texture (mi, which_image);
+}
+
+
+/* Set up and enable lighting */
+static void
+setup_light(void)
+{
+  /* set a number of parameters which make the scene look much nicer */
+  glEnable(GL_BLEND);
+  glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+  glShadeModel(GL_SMOOTH);
+}
+
+
+/* Set up and enable face culling so we don't see the inside of the sphere */
+static void
+setup_face(void)
+{
+  glEnable(GL_CULL_FACE);
+  glCullFace(GL_BACK); 
+}
+
+
+/* Function for determining points on the surface of the sphere */
+static void inline ParametricSphere(float theta, float rho, GLfloat *vector)
+{
+  vector[0] = -sin(theta) * sin(rho);
+  vector[1] = cos(theta) * sin(rho);
+  vector[2] = cos(rho);
+
+#if DO_HELIX
+  vector[0] = -(1- cos(theta)) * cos(rho); 
+  vector[1] = -(1- cos(theta)) * sin(rho); 
+  vector[2] = -(sin(theta) + rho); 
+#endif /* DO_HELIX */
+
+       return;
+}
+
+
+/* lame way to generate some random stars */
+void generate_stars(int width, int height)
+{
+  int i;
+/*  GLfloat size_range[2], size;*/
+  GLfloat x, y;
+
+  planetstruct *gp = &planets[MI_SCREEN(mi)];
+  
+/*    glGetFloatv(GL_POINT_SIZE_RANGE, size_range); */
+  
+/*    printf("size range: %f\t%f\n", size_range[0], size_range[1]); */
+  gp->starlist = glGenLists(1);
+  glNewList(gp->starlist, GL_COMPILE);
+
+  /* this hackery makes the viewport map one-to-one with Vertex arguments */
+  glMatrixMode(GL_PROJECTION);
+  glPushMatrix();
+  glMatrixMode(GL_PROJECTION);
+  glLoadIdentity();
+  gluOrtho2D(0, width, 0, height);
+  glMatrixMode(GL_MODELVIEW);
+  glLoadIdentity();
+
+  /* disable depth testing for the stars, so they don't obscure the planet */
+  glDisable(GL_DEPTH_TEST);
+  glEnable(GL_POINT_SMOOTH);
+  glEnable(GL_BLEND);
+  glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+  
+  glBegin(GL_POINTS);
+  for(i = 0 ; i < NUM_STARS ; i++)
+       {
+/*       size = (drand48()+size_range[0]) * size_range[1]/2.; */
+/*    glPointSize(size); */
+         x = drand48()*width;
+         y = drand48()*height;
+         glVertex2f(x,y);
+       }
+  glEnd();
+
+  /* return to original PROJECT and MODELVIEW */
+  glMatrixMode(GL_PROJECTION);
+  glPopMatrix();
+  glMatrixMode(GL_MODELVIEW);
+
+
+  glEndList();
+
+}
+
+/* Initialization function for screen saver */
+static void
+pinit(ModeInfo * mi)
+{
+  Bool wire = MI_IS_WIREFRAME(mi);
+  planetstruct *gp = &planets[MI_SCREEN(mi)];
+  int i, j;
+  int stacks=STACKS, slices=SLICES;
+  float radius=RADIUS;
+
+  float drho, dtheta;
+  float rho, theta;
+  GLfloat vector[3];
+  GLfloat ds, dt, t, s;;
+
+  if (wire) {
+       glEnable(GL_LINE_SMOOTH);
+       do_texture = False;
+  }
+
+  /* turn on various options we like */
+  if (do_texture)
+       setup_texture(mi);
+  if (do_light)
+       setup_light();
+
+  setup_face();
+
+  if (do_stars) {
+       glEnable(GL_POINT_SMOOTH);
+       generate_stars(MI_WIDTH(mi), MI_HEIGHT(mi));
+  }
+
+
+  /*-
+   * Generate a sphere with quadrilaterals.
+   * Quad vertices are determined using a parametric sphere function.
+   * For fun, you could generate practically any parameteric surface and
+   * map an image onto it. 
+   */
+
+  drho = M_PI / stacks;
+  dtheta = 2.0 * M_PI / slices;
+  ds = 1.0 / slices;
+  dt = 1.0 / stacks;
+  
+
+  gp->platelist=glGenLists(1);
+  glNewList(gp->platelist, GL_COMPILE);
+
+  glColor3f(1,1,1);
+  glBegin( wire ? GL_LINE_LOOP : GL_QUADS );
+
+  t = 0.0;
+  for(i=0; i<stacks; i++) {
+       rho = i * drho;
+       s = 0.0;
+       for(j=0; j<slices; j++) {
+         theta = j * dtheta;
+
+
+         glTexCoord2f(s,t);
+         ParametricSphere(theta, rho, vector);
+         normalize(vector);
+         glNormal3fv(vector);
+         ParametricSphere(theta, rho, vector);
+         glVertex3f( vector[0]*radius, vector[1]*radius, vector[2]*radius );
+
+         glTexCoord2f(s,t+dt);
+         ParametricSphere(theta, rho+drho, vector);
+         normalize(vector);
+         glNormal3fv(vector);
+         ParametricSphere(theta, rho+drho, vector);
+         glVertex3f( vector[0]*radius, vector[1]*radius, vector[2]*radius );
+
+         glTexCoord2f(s+ds,t+dt);
+         ParametricSphere(theta + dtheta, rho+drho, vector);
+         normalize(vector);
+         glNormal3fv(vector);
+         ParametricSphere(theta + dtheta, rho+drho, vector);
+         glVertex3f( vector[0]*radius, vector[1]*radius, vector[2]*radius );
+
+         glTexCoord2f(s+ds, t);
+         ParametricSphere(theta + dtheta, rho, vector);
+         normalize(vector);
+         glNormal3fv(vector);
+         ParametricSphere(theta + dtheta, rho, vector);
+         glVertex3f( vector[0]*radius, vector[1]*radius, vector[2]*radius );
+
+         s = s + ds;
+
+       }
+       t = t + dt;
+  }
+  glEnd();
+  glEndList();
+
+
+ }
+
+static void
+draw_sphere(ModeInfo * mi)
+{
+  planetstruct *gp = &planets[MI_SCREEN(mi)];
+
+  glEnable(GL_DEPTH_TEST);
+
+  /* turn on the various attributes for making the sphere look nice */
+  if (do_texture)
+       glEnable(GL_TEXTURE_2D);
+
+  if (do_light)
+       {
+         glEnable(GL_LIGHTING);
+         glEnable(GL_LIGHT0);
+         glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE);
+         glEnable(GL_COLOR_MATERIAL);
+       }
+
+  glCallList(gp->platelist);
+
+}
+
+
+#define RANDSIGN() ((random() & 1) ? 1 : -1)
+
+static void
+pick_velocity (ModeInfo * mi)
+{
+  planetstruct *gp = &planets[MI_SCREEN(mi)];
+
+  gp->box_width =  15.0;
+  gp->box_height = 15.0;
+  gp->box_depth =  5.0;
+
+  gp->tx = 0.0;
+  gp->ty = 0.0;
+  gp->tz = frand(360);
+
+  gp->dtx = (frand(0.4) + frand(0.3)) * RANDSIGN();
+  gp->dty = (frand(0.4) + frand(0.3)) * RANDSIGN();
+  gp->dtz = (frand(5.0) + frand(5.0));  /* the sun sets in the west */
+
+  gp->dx = (frand(0.2) + frand(0.2)) * RANDSIGN();
+  gp->dy = (frand(0.2) + frand(0.2)) * RANDSIGN();
+  gp->dz = (frand(0.2) + frand(0.2)) * RANDSIGN();
+}
+
+
+static void
+rotate_and_move (ModeInfo * mi)
+{
+  planetstruct *gp = &planets[MI_SCREEN(mi)];
+
+  if (do_roll)
+       {
+         gp->tx += gp->dtx;
+         while (gp->tx < 0)   gp->tx += 360;
+         while (gp->tx > 360) gp->tx -= 360;
+
+         gp->ty += gp->dty;
+         while (gp->ty < 0)   gp->ty += 360;
+         while (gp->ty > 360) gp->ty -= 360;
+       }
+
+  if (do_rotate)
+       {
+         gp->tz += gp->dtz;
+         while (gp->tz < 0)   gp->tz += 360;
+         while (gp->tz > 360) gp->tz -= 360;
+       }
+
+  if (do_bounce)
+       {
+         /* Move in the direction we had been moving in. */
+         gp->xpos += gp->dx;
+         gp->ypos += gp->dy;
+         gp->zpos += gp->dz;
+
+         /* Bounce. */
+         if (gp->xpos > gp->box_depth)
+               gp->xpos = gp->box_depth, gp->dx = -gp->dx;
+         else if (gp->xpos < 0)
+               gp->xpos = 0, gp->dx = -gp->dx;
+
+         if (gp->ypos > gp->box_width/2)
+               gp->ypos = gp->box_width/2, gp->dy = -gp->dy;
+         else if (gp->ypos < -gp->box_width/2)
+               gp->ypos = -gp->box_width/2, gp->dy = -gp->dy;
+
+         if (gp->zpos > gp->box_height/2)
+               gp->zpos = gp->box_height/2, gp->dz = -gp->dz;
+         else if (gp->zpos < -gp->box_height/2)
+               gp->zpos = -gp->box_height/2, gp->dz = -gp->dz;
+       }
+}
+
+
+/* Standard reshape function */
+static void
+reshape(int width, int height)
+{
+  GLfloat light[4];
+  GLfloat h = (GLfloat) height / (GLfloat) width;
+
+  light[0] = -1;
+  light[1] = (int) (((random() % 3) & 0xFF) - 1);
+  light[2] = (int) (((random() % 3) & 0xFF) - 1);
+  light[3] = 0;
+
+  glViewport(0, 0, (GLint) width, (GLint) height);
+  glMatrixMode(GL_PROJECTION);
+  glLoadIdentity();
+  glFrustum(-1.0, 1.0, -h, h, 5.0, 100.0);
+  glMatrixMode(GL_MODELVIEW);
+  glLoadIdentity();
+  glTranslatef(0.0, 0.0, -DIST);
+  glLightfv(GL_LIGHT0, GL_POSITION, light);
+  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+}
+
+
+void
+init_planet(ModeInfo * mi)
+{
+  int         screen = MI_SCREEN(mi);
+
+  planetstruct *gp;
+
+  if (planets == NULL) {
+       if ((planets = (planetstruct *) calloc(MI_NUM_SCREENS(mi),
+                                                                                 sizeof (planetstruct))) == NULL)
+         return;
+  }
+  gp = &planets[screen];
+
+  pick_velocity (mi);
+
+  {
+       char *f = get_string_resource("imageForeground", "Foreground");
+       char *b = get_string_resource("imageBackground", "Background");
+       char *s;
+       if (!f) f = strdup("white");
+       if (!b) b = strdup("black");
+       
+       for (s = f + strlen(f)-1; s > f; s--)
+         if (*s == ' ' || *s == '\t')
+               *s = 0;
+       for (s = b + strlen(b)-1; s > b; s--)
+         if (*s == ' ' || *s == '\t')
+               *s = 0;
+
+    if (!XParseColor(mi->dpy, mi->xgwa.colormap, f, &gp->fg))
+      {
+               fprintf(stderr, "%s: unparsable color: \"%s\"\n", progname, f);
+               exit(1);
+      }
+    if (!XParseColor(mi->dpy, mi->xgwa.colormap, b, &gp->bg))
+      {
+               fprintf(stderr, "%s: unparsable color: \"%s\"\n", progname, f);
+               exit(1);
+      }
+
+       free (f);
+       free (b);
+  }
+
+
+  gp->window = MI_WINDOW(mi);
+  if ((gp->glx_context = init_GL(mi)) != NULL) {
+       reshape(MI_WIDTH(mi), MI_HEIGHT(mi));
+       pinit(mi);
+  } else {
+       MI_CLEARWINDOW(mi);
+  }
+}
+
+void
+draw_planet(ModeInfo * mi)
+{
+  planetstruct *gp = &planets[MI_SCREEN(mi)];
+  Display    *display = MI_DISPLAY(mi);
+  Window      window = MI_WINDOW(mi);
+
+  if (!gp->glx_context)
+       return;
+
+  glDrawBuffer(GL_BACK);
+  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+  glXMakeCurrent(display, window, *(gp->glx_context));
+
+
+  if (do_stars) {
+       /* protect our modelview matrix and attributes */
+       glPushMatrix();
+       glPushAttrib(GL_ALL_ATTRIB_BITS);
+       {
+         glColor3f(1,1,1);
+         /* draw the star field. */
+         glCallList(gp->starlist);
+
+       }
+       glPopMatrix();
+       glPopAttrib();
+  }
+
+  /* protect our modelview matrix and attributes */
+  glPushMatrix();
+  glPushAttrib(GL_ALL_ATTRIB_BITS);
+  {
+       /* this pair of rotations seem to be necessary to orient the earth correctly */
+       glRotatef(90,0,0,1);
+       glRotatef(90,0,1,0);
+
+       glTranslatef(gp->xpos, gp->ypos, gp->zpos);
+       glRotatef(gp->tx, 1, 0, 0);
+       glRotatef(gp->ty, 0, 1, 0);
+       glRotatef(gp->tz, 0, 0, 1);
+       /* draw the sphere */
+       draw_sphere(mi);
+  }
+  glPopMatrix();
+  glPopAttrib();
+
+
+
+  glFinish();
+  glXSwapBuffers(display, window);
+
+  rotate_and_move (mi);
+}
+
+void
+release_planet(ModeInfo * mi)
+{
+  if (planets != NULL) {
+       int         screen;
+
+       for (screen = 0; screen < MI_NUM_SCREENS(mi); screen++) {
+         planetstruct *gp = &planets[screen];
+
+         if (gp->glx_context) {
+               /* Display lists MUST be freed while their glXContext is current. */
+               glXMakeCurrent(MI_DISPLAY(mi), gp->window, *(gp->glx_context));
+
+               if (glIsList(gp->platelist))
+                 glDeleteLists(gp->platelist, 1);
+               if (glIsList(gp->starlist))
+                 glDeleteLists(gp->starlist, 1);
+         }
+       }
+       (void) free((void *) planets);
+       planets = NULL;
+  }
+  FreeAllGL(mi);
+}
+
+
+#endif
+
diff --git a/hacks/glx/lament.c b/hacks/glx/lament.c
new file mode 100644 (file)
index 0000000..9aae80c
--- /dev/null
@@ -0,0 +1,2157 @@
+/* xscreensaver, Copyright (c) 1998 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software 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.  No representations are made about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or 
+ * implied warranty.
+ */
+
+/* Animates Lemarchand's Box, the Lament Configuration.  By jwz, 25-Jul-98.
+
+   TODO:
+
+     *  The "gold" color isn't quite right; it looks more like "yellow" than
+        "gold" to me.
+
+     *  For some reason, the interior surfaces are shinier than the exterior
+        surfaces.  I don't understand why, but this should be remedied.
+
+     *  Perhaps use a slightly-bumpy or oily texture for the interior surfaces?
+
+     *  Some of the edges don't line up perfectly (since the images are not
+        perfectly symetrical.)  Something should be done about this; either
+        making the edges overlap slightly (instead of leaving gaps) or fixing
+        the images so that the edges may be symmetrical.
+
+     *  I want the gold leaf to seem to be raised up from the surface, but I
+        think this isn't possible with OpenGL.  Supposedly, OpenGL only 
+        supports Gouraud shading (interpolating edge normals from face normals,
+        and shading smoothly) but bump-maps only work with Phong shading
+        (computing a normal for each rendered pixel.)
+
+     *  As far as I can tell, OpenGL doesn't do shadows.  As a result, the
+        forward-facing interior walls are drawn bright, not dark.  If it was
+        casting shadows properly, it wouldn't matter so much that the edges
+        don't quite line up, because the lines would be black, and thus not
+        visible.  But the edges don't match up, and so the bright interior
+        faces show through, and that sucks.
+
+       But apparently there are tricky ways around this:
+       http://reality.sgi.com/opengl/tips/rts/
+       I think these techniques require GLUT, however, which isn't 
+       (currently) required by any other xscreensaver hacks.
+
+     *  There should be strange lighting effects playing across the surface:
+        electric sparks, or little glittery blobs of light.  
+        http://reality.sgi.com/opengl/tips/lensflare/ might provide guidance.
+
+     *  Need to add some more modes, to effect the transition from the cube
+        shapes to the "spike" or "leviathan" shapes.  I have extensive notes
+        on how these transformations occur, but unfortunately, due to camera
+        trickery, the transitions require dematerializations which do not
+        preserve object volume.  But I suppose that's allowed, in
+        non-Euclidian or hyperdimensional spaces (since the extra mass could
+        simply be rotated along the axis to which one cannot point.)
+
+        The other hard thing about this is that the "leviathan" shapes contain
+        a much larger number of facets, and I modelled this whole thing by 
+        hand, since I don't have any 3d-object-editing tools that I know how
+        to use (or that look like they would take any less than several months
+        to become even marginally proficient with...)
+
+     *  Perhaps there should be a table top, on which it casts a shadow?
+        And then multiple light sources (for multiple shadows)?
+
+     *  Needs music.  ("Hellraiser Themes" by Coil: TORSO CD161; also
+        duplicated on the "Unnatural History 2" compilation, WORLN M04699.)
+
+     *  I'm not totally happy with the spinning motion; I like the
+        acceleration and deceleration, but it often feels like it's going too
+        fast, or not naturally enough, or something.
+
+     *  However, the motion is better than that used by gears, superquadrics,
+        etc.; so maybe I should make them all share the same motion code.
+ */
+
+#include <X11/Intrinsic.h>
+
+#define PROGCLASS      "Lament"
+#define HACK_INIT      init_lament
+#define HACK_DRAW      draw_lament
+#define lament_opts    xlockmore_opts
+#define DEFAULTS       "*delay:        10000   \n"     \
+                       "*wireframe:    False   \n"     \
+                       "*texture:      True    \n"
+#include "xlockmore.h"
+
+#ifdef USE_GL /* whole file */
+
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#define DEF_TEXTURE "True"
+
+static int do_texture;
+static XrmOptionDescRec opts[] = {
+  {"-texture", ".lament.texture", XrmoptionNoArg, (caddr_t) "true" },
+  {"+texture", ".lament.texture", XrmoptionNoArg, (caddr_t) "false" },
+};
+
+static argtype vars[] = {
+  {(caddr_t *) &do_texture, "texture", "Texture", DEF_TEXTURE, t_Bool},
+};
+
+ModeSpecOpt lament_opts = {countof(opts), opts, countof(vars), vars, NULL};
+
+#include "xpm-ximage.h"
+#include "../images/lament.xpm"
+
+#define RAND(n) ((long) ((random() & 0x7fffffff) % ((long) (n))))
+#define RANDSIGN() ((random() & 1) ? 1 : -1)
+
+typedef enum {
+  LAMENT_BOX,
+
+  LAMENT_STAR_OUT,
+  LAMENT_STAR_ROT,
+  LAMENT_STAR_ROT_IN,
+  LAMENT_STAR_ROT_OUT,
+  LAMENT_STAR_UNROT,
+  LAMENT_STAR_IN,
+
+  LAMENT_TETRA_UNE,
+  LAMENT_TETRA_USW,
+  LAMENT_TETRA_DWN,
+  LAMENT_TETRA_DSE,
+
+  LAMENT_LID_OPEN,
+  LAMENT_LID_CLOSE,
+  LAMENT_LID_ZOOM,
+
+  LAMENT_TASER_OUT,
+  LAMENT_TASER_SLIDE,
+  LAMENT_TASER_SLIDE_IN,
+  LAMENT_TASER_IN
+
+} lament_type;
+
+static GLfloat exterior_color[] = { 0.70, 0.60, 0.00, 1.00 };
+static GLfloat interior_color[] = { 0.25, 0.25, 0.20, 1.00 };
+
+
+typedef struct {
+  GLXContext *glx_context;
+
+  GLuint box;                     /* display list IDs */
+  GLuint star1, star2;
+  GLuint tetra_une, tetra_usw, tetra_dwn, tetra_dse, tetra_mid;
+  GLuint lid_0, lid_1, lid_2, lid_3, lid_4;
+  GLuint taser_base, taser_lifter, taser_slider;
+
+  GLfloat rotx, roty, rotz;       /* current object rotation */
+  GLfloat dx, dy, dz;             /* current rotational velocity */
+  GLfloat ddx, ddy, ddz;          /* current rotational acceleration */
+  GLfloat d_max;                  /* max velocity */
+  XImage *texture;                /* image bits */
+  GLuint texids[6];               /* texture map IDs */
+  lament_type type;               /* which mode of the object is current */
+
+  int anim_pause;                 /* countdown before animating again */
+  GLfloat anim_r, anim_y, anim_z;  /* relative position during anims */
+
+} lament_configuration;
+
+static lament_configuration *lcs = NULL;
+
+#define FACE_N 3
+#define FACE_S 2
+#define FACE_E 0
+#define FACE_W 4
+#define FACE_U 5
+#define FACE_D 1
+
+static void
+parse_image_data(ModeInfo *mi)
+{
+  lament_configuration *lc = &lcs[MI_SCREEN(mi)];
+  lc->texture = xpm_to_ximage (mi->dpy,
+                              mi->xgwa.visual,
+                              mi->xgwa.colormap,
+                              lament_faces);
+}
+
+
+\f
+/* Computing normal vectors (thanks to Nat Friedman <ndf@mit.edu>)
+ */
+
+typedef struct vector {
+  GLfloat x, y, z;
+} vector;
+
+typedef struct plane {
+  vector p1, p2, p3;
+} plane;
+
+static void
+vector_set(vector *v, GLfloat x, GLfloat y, GLfloat z)
+{
+  v->x = x;
+  v->y = y;
+  v->z = z;
+}
+
+static void
+vector_cross(vector v1, vector v2, vector *v3)
+{
+  v3->x = (v1.y * v2.z) - (v1.z * v2.y);
+  v3->y = (v1.z * v2.x) - (v1.x * v2.z);
+  v3->z = (v1.x * v2.y) - (v1.y * v2.x);
+}
+
+static void
+vector_subtract(vector v1, vector v2, vector *res)
+{
+  res->x = v1.x - v2.x;
+  res->y = v1.y - v2.y;
+  res->z = v1.z - v2.z;
+}
+
+static void
+plane_normal(plane p, vector *n)
+{
+  vector v1, v2;
+  vector_subtract(p.p1, p.p2, &v1);
+  vector_subtract(p.p1, p.p3, &v2);
+  vector_cross(v2, v1, n);
+}
+
+static void
+do_normal(GLfloat x1, GLfloat y1, GLfloat z1,
+         GLfloat x2, GLfloat y2, GLfloat z2,
+         GLfloat x3, GLfloat y3, GLfloat z3)
+{
+  plane plane;
+  vector n;
+  vector_set(&plane.p1, x1, y1, z1);
+  vector_set(&plane.p2, x2, y2, z2);
+  vector_set(&plane.p3, x3, y3, z3);
+  plane_normal(plane, &n);
+  n.x = -n.x; n.y = -n.y; n.z = -n.z;
+
+  glNormal3f(n.x, n.y, n.z);
+
+#ifdef DEBUG
+  /* Draw a line in the direction of this face's normal. */
+  {
+    GLfloat ax = n.x > 0 ? n.x : -n.x;
+    GLfloat ay = n.y > 0 ? n.y : -n.y;
+    GLfloat az = n.z > 0 ? n.z : -n.z;
+    GLfloat mx = (x1 + x2 + x3) / 3;
+    GLfloat my = (y1 + y2 + y3) / 3;
+    GLfloat mz = (z1 + z2 + z3) / 3;
+    GLfloat xx, yy, zz;
+
+    GLfloat max = ax > ay ? ax : ay;
+    if (az > max) max = az;
+    max *= 2;
+    xx = n.x / max;
+    yy = n.y / max;
+    zz = n.z / max;
+
+    glBegin(GL_LINE_LOOP);
+    glVertex3f(mx, my, mz);
+    glVertex3f(mx+xx, my+yy, mz+zz);
+    glEnd();
+  }
+#endif /* DEBUG */
+}
+
+
+\f
+/* Shorthand utilities for making faces, with proper normals.
+ */
+
+static void
+face3(GLint texture, GLfloat *color, Bool wire,
+      GLfloat s1, GLfloat t1, GLfloat x1, GLfloat y1, GLfloat z1,
+      GLfloat s2, GLfloat t2, GLfloat x2, GLfloat y2, GLfloat z2,
+      GLfloat s3, GLfloat t3, GLfloat x3, GLfloat y3, GLfloat z3)
+{
+#ifdef HAVE_GLBINDTEXTURE
+  glBindTexture(GL_TEXTURE_2D, texture);
+#endif /* HAVE_GLBINDTEXTURE */
+  glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, color);
+  do_normal(x1, y1, z1,  x2, y2, z2,  x3, y3, z3);
+  glBegin(wire ? GL_LINE_LOOP : GL_TRIANGLES);
+  glTexCoord2f(s1, t1); glVertex3f(x1, y1, z1);
+  glTexCoord2f(s2, t2); glVertex3f(x2, y2, z2);
+  glTexCoord2f(s3, t3); glVertex3f(x3, y3, z3);
+  glEnd();
+}
+
+static void
+face4(GLint texture, GLfloat *color, Bool wire,
+      GLfloat s1, GLfloat t1, GLfloat x1, GLfloat y1, GLfloat z1,
+      GLfloat s2, GLfloat t2, GLfloat x2, GLfloat y2, GLfloat z2,
+      GLfloat s3, GLfloat t3, GLfloat x3, GLfloat y3, GLfloat z3,
+      GLfloat s4, GLfloat t4, GLfloat x4, GLfloat y4, GLfloat z4)
+{
+#ifdef HAVE_GLBINDTEXTURE
+  glBindTexture(GL_TEXTURE_2D, texture);
+#endif /* HAVE_GLBINDTEXTURE */
+  glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, color);
+  do_normal(x1, y1, z1,  x2, y2, z2,  x3, y3, z3);
+  glBegin(wire ? GL_LINE_LOOP : GL_QUADS);
+  glTexCoord2f(s1, t1); glVertex3f(x1, y1, z1);
+  glTexCoord2f(s2, t2); glVertex3f(x2, y2, z2);
+  glTexCoord2f(s3, t3); glVertex3f(x3, y3, z3);
+  glTexCoord2f(s4, t4); glVertex3f(x4, y4, z4);
+  glEnd();
+}
+
+static void
+face5(GLint texture, GLfloat *color, Bool wire,
+      GLfloat s1, GLfloat t1, GLfloat x1, GLfloat y1, GLfloat z1,
+      GLfloat s2, GLfloat t2, GLfloat x2, GLfloat y2, GLfloat z2,
+      GLfloat s3, GLfloat t3, GLfloat x3, GLfloat y3, GLfloat z3,
+      GLfloat s4, GLfloat t4, GLfloat x4, GLfloat y4, GLfloat z4,
+      GLfloat s5, GLfloat t5, GLfloat x5, GLfloat y5, GLfloat z5)
+{
+#ifdef HAVE_GLBINDTEXTURE
+  glBindTexture(GL_TEXTURE_2D, texture);
+#endif /* HAVE_GLBINDTEXTURE */
+  glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, color);
+  do_normal(x1, y1, z1,  x2, y2, z2,  x3, y3, z3);
+  glBegin(wire ? GL_LINE_LOOP : GL_POLYGON);
+  glTexCoord2f(s1, t1); glVertex3f(x1, y1, z1);
+  glTexCoord2f(s2, t2); glVertex3f(x2, y2, z2);
+  glTexCoord2f(s3, t3); glVertex3f(x3, y3, z3);
+  glTexCoord2f(s4, t4); glVertex3f(x4, y4, z4);
+  glTexCoord2f(s5, t5); glVertex3f(x5, y5, z5);
+  glEnd();
+}
+
+
+\f
+/* Creating object models
+ */
+
+static void
+box(ModeInfo *mi, Bool wire)
+{
+  lament_configuration *lc = &lcs[MI_SCREEN(mi)];
+
+  glNewList(lc->box, GL_COMPILE);
+  glShadeModel(GL_SMOOTH);
+
+  /* N */
+  face4(lc->texids[FACE_N], exterior_color, wire,
+       0.0, 0.0,       -0.5,  0.5,  0.5,
+       1.0, 0.0,        0.5,  0.5,  0.5,
+       1.0, 1.0,        0.5,  0.5, -0.5,
+       0.0, 1.0,       -0.5,  0.5, -0.5);
+
+  /* S */
+  face4(lc->texids[FACE_S], exterior_color, wire,
+       0.0, 0.0,        -0.5, -0.5, -0.5,
+       1.0, 0.0,         0.5, -0.5, -0.5,
+       1.0, 1.0,         0.5, -0.5,  0.5,
+       0.0, 1.0,        -0.5, -0.5,  0.5);
+
+  /* E */
+  face4(lc->texids[FACE_E], exterior_color, wire,
+       0.0, 0.0,        0.5, -0.5, -0.5,
+       1.0, 0.0,        0.5,  0.5, -0.5,
+       1.0, 1.0,        0.5,  0.5,  0.5,
+       0.0, 1.0,        0.5, -0.5,  0.5);
+
+  /* W */
+  face4(lc->texids[FACE_W], exterior_color, wire,
+       1.0, 1.0,       -0.5, -0.5,  0.5,
+       0.0, 1.0,       -0.5,  0.5,  0.5,
+       0.0, 0.0,       -0.5,  0.5, -0.5,
+       1.0, 0.0,       -0.5, -0.5, -0.5);
+
+  /* U */
+  face4(lc->texids[FACE_U], exterior_color, wire,
+       1.0, 0.0,        0.5, -0.5,  0.5,
+       1.0, 1.0,        0.5,  0.5,  0.5,
+       0.0, 1.0,       -0.5,  0.5,  0.5,
+       0.0, 0.0,       -0.5, -0.5,  0.5);
+
+  /* D */
+  face4(lc->texids[FACE_D], exterior_color, wire,
+       0.0, 1.0,       -0.5, -0.5, -0.5,
+       0.0, 0.0,       -0.5,  0.5, -0.5,
+       1.0, 0.0,        0.5,  0.5, -0.5,
+       1.0, 1.0,        0.5, -0.5, -0.5);
+
+  glEndList();
+}
+
+
+static void
+star(ModeInfo *mi, Bool top, Bool wire)
+{
+  lament_configuration *lc = &lcs[MI_SCREEN(mi)];
+  int i;
+
+  int points[][2] = {
+    {  77,  74 }, {  60,  98 }, {   0,  71 }, {   0,   0 },    /* L1 */
+    {  60,  98 }, {  55, 127 }, {   0, 127 }, {   0,  71 },    /* L2 */
+    {  55, 127 }, {  60, 154 }, {   0, 179 }, {   0, 127 },    /* L3 */
+    {  60, 154 }, {  76, 176 }, {   0, 255 }, {   0, 179 },    /* L4 */
+    {  76, 176 }, { 100, 193 }, {  74, 255 }, {   0, 255 },    /* B1 */
+    { 100, 193 }, { 127, 198 }, { 127, 255 }, {  74, 255 },    /* B2 */
+    { 127, 198 }, { 151, 193 }, { 180, 255 }, { 127, 255 },    /* B3 */
+    { 151, 193 }, { 178, 177 }, { 255, 255 }, { 180, 255 },    /* B4 */
+    { 178, 177 }, { 193, 155 }, { 255, 181 }, { 255, 255 },    /* R4 */
+    { 193, 155 }, { 199, 127 }, { 255, 127 }, { 255, 181 },    /* R3 */
+    { 199, 127 }, { 194,  99 }, { 255,  74 }, { 255, 127 },    /* R2 */
+    { 194,  99 }, { 179,  76 }, { 255,   0 }, { 255,  74 },    /* R1 */
+    { 179,  76 }, { 155,  60 }, { 180,   0 }, { 255,   0 },    /* T4 */
+    { 155,  60 }, { 126,  55 }, { 126,   0 }, { 180,   0 },    /* T3 */
+    { 126,  55 }, { 100,  60 }, {  75,   0 }, { 126,   0 },    /* T2 */
+    { 100,  60 }, {  77,  74 }, {   0,   0 }, {  75,   0 },    /* T1 */
+  };
+
+  for (i = 0; i < countof(points); i++)
+    points[i][1] = 255-points[i][1];
+
+  if (top)
+    glNewList(lc->star1, GL_COMPILE);
+  else
+    glNewList(lc->star2, GL_COMPILE);
+
+  if (!top)
+    glRotatef(-180.0, 1.0, 0.0, 0.0);
+
+  for (i = 0; i < countof(points)/4; i += 2)
+    {
+      int j, k;
+
+      /* Top face.
+       */
+
+      GLfloat s[4], t[4], x[4], y[4], z[4];
+      for (j = 3, k = 0; j >= 0; j--, k++)
+       {
+         GLfloat xx = points[(i*4)+j][0] / 255.0L;
+         GLfloat yy = points[(i*4)+j][1] / 255.0L;
+         s[k] = xx;
+         t[k] = yy;
+         x[k] = xx-0.5;
+         y[k] = yy-0.5;
+         z[k] = 0.5;
+       }
+      face4(lc->texids[top ? FACE_U : FACE_D], exterior_color, wire,
+           s[0], t[0],  x[0], y[0], z[0],
+           s[1], t[1],  x[1], y[1], z[1],
+           s[2], t[2],  x[2], y[2], z[2],
+           s[3], t[3],  x[3], y[3], z[3]);
+
+      /* Bottom face.
+       */
+      for (j = 0, k = 0; j < 4; j++, k++)
+       {
+         GLfloat xx = points[(i*4)+j][0] / 255.0L;
+         GLfloat yy = points[(i*4)+j][1] / 255.0L;
+         s[k] = xx;
+         t[k] = 1.0 - yy;
+         x[k] = xx-0.5;
+         y[k] = yy-0.5;
+         z[k] = -0.5;
+       }
+      face4(lc->texids[top ? FACE_U : FACE_D], exterior_color, wire,
+           s[0], t[0],  x[0], y[0], z[0],
+           s[1], t[1],  x[1], y[1], z[1],
+           s[2], t[2],  x[2], y[2], z[2],
+           s[3], t[3],  x[3], y[3], z[3]);
+
+      /* Connecting faces.
+       */
+      for (j = 3; j >= 0; j--)
+       {
+         int k = (j == 0 ? 3 : j-1);
+         Bool front_p = (j == 3);
+         GLfloat x1 = points[(i*4)+j][0] / 255.0L;
+         GLfloat y1 = points[(i*4)+j][1] / 255.0L;
+         GLfloat x2 = points[(i*4)+k][0] / 255.0L;
+         GLfloat y2 = points[(i*4)+k][1] / 255.0L;
+
+         GLfloat tx1=0.0, tx2=1.0, ty1=0.0, ty2=1.0;
+
+         int texture = 0;
+         int facing = i/4;
+         facing = (facing + j + 5) % 4;
+
+         switch (facing) {
+         case 0:
+           texture = FACE_W;
+           if (top) {
+             tx1 = 1.0 - y1;  tx2 = 1.0 - y2;
+             ty1 = 0.0;       ty2 = 1.0;
+           } else {
+             tx1 = y1;  tx2 = y2;
+             ty1 = 1.0; ty2 = 0.0;
+           }
+           break;
+         case 1:
+           texture = top ? FACE_S : FACE_N;
+           tx1 = x1;  tx2 = x2;
+           ty1 = 0.0; ty2 = 1.0;
+           break;
+         case 2:
+           texture = FACE_E;
+           if (top) {
+             tx1 = y1;  tx2 = y2;
+             ty1 = 0.0; ty2 = 1.0;
+           } else {
+             tx1 = 1.0 - y1;  tx2 = 1.0 - y2;
+             ty1 = 1.0;       ty2 = 0.0;
+           }
+           break;
+         case 3:
+           texture = top ? FACE_N : FACE_S;
+           tx1 = x1;  tx2 = x2;
+           ty1 = 1.0; ty2 = 0.0;
+           break;
+         }
+
+         x1 -= 0.5; x2 -= 0.5;
+         y1 -= 0.5; y2 -= 0.5;
+
+         face4(front_p ? lc->texids[texture] : 0,
+               front_p ? exterior_color : interior_color,
+               wire,
+               tx1, ty2,  x1, y1,  0.5,
+               tx1, ty1,  x1, y1, -0.5,
+               tx2, ty1,  x2, y2, -0.5,
+               tx2, ty2,  x2, y2,  0.5);
+       }
+    }
+
+
+  /* Central core top cap.
+   */
+#ifdef HAVE_GLBINDTEXTURE
+  glBindTexture(GL_TEXTURE_2D, lc->texids[top ? FACE_U : FACE_D]);
+#endif /* HAVE_GLBINDTEXTURE */
+  glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, exterior_color);
+
+  i = 1;
+  do_normal(points[i+0][0], points[i+0][1], 0,
+           points[i+4][0], points[i+4][1], 0,
+           points[i+8][0], points[i+8][1], 0);
+  glBegin(wire ? GL_LINE_LOOP : GL_POLYGON);
+  for (i = 1; i < countof(points); i += 4)
+    {
+      GLfloat x = points[i][0] / 255.0L;
+      GLfloat y = points[i][1] / 255.0L;
+      glTexCoord2f(x, y);
+      glVertex3f(x-0.5, y-0.5, 0.5);
+    }
+  glEnd();
+
+
+  /* Central core bottom cap.
+   */
+#ifdef HAVE_GLBINDTEXTURE
+  glBindTexture(GL_TEXTURE_2D, 0);
+#endif /* HAVE_GLBINDTEXTURE */
+  glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, interior_color);
+
+  i = countof(points) - 9;
+  do_normal(points[i+0][0], points[i+0][1], 0,
+           points[i+4][0], points[i+4][1], 0,
+           points[i+8][0], points[i+8][1], 0);
+
+  glBegin(wire ? GL_LINE_LOOP : GL_POLYGON);
+  for (i = countof(points) - 3; i >= 0; i -= 4)
+    {
+      GLfloat x = points[i][0] / 255.0L;
+      GLfloat y = points[i][1] / 255.0L;
+      glVertex3f(x-0.5, y-0.5, 0);
+    }
+  glEnd();
+  
+
+  /* Central core walls.
+   */
+  for (i = 1; i < countof(points); i += 4)
+    {
+
+      GLfloat x1 = points[i-1][0] / 255.0L;
+      GLfloat y1 = points[i-1][1] / 255.0L;
+      GLfloat x2 = points[i][0] / 255.0L;
+      GLfloat y2 = points[i][1] / 255.0L;
+      face4(0, interior_color, wire,
+           0.0, 0.0,  x1-0.5, y1-0.5, 0.5,
+           0.0, 0.0,  x1-0.5, y1-0.5, 0.0,
+           0.0, 0.0,  x2-0.5, y2-0.5, 0.0,
+           0.0, 0.0,  x2-0.5, y2-0.5, 0.5);
+    }
+
+  glEndList();
+}
+
+
+static void
+tetra(ModeInfo *mi, Bool wire)
+{
+  lament_configuration *lc = &lcs[MI_SCREEN(mi)];
+
+  glNewList(lc->tetra_une, GL_COMPILE);
+  {
+    glShadeModel(GL_SMOOTH);
+
+    /* Ua */
+    face3(lc->texids[FACE_U], exterior_color, wire,
+         1.0, 0.0,      0.5, -0.5,  0.5,
+         1.0, 1.0,      0.5,  0.5,  0.5,
+         0.0, 1.0,     -0.5,  0.5,  0.5);
+
+    /* Na */
+    face3(lc->texids[FACE_N], exterior_color, wire,
+         0.0, 0.0,     -0.5,  0.5,  0.5,
+         1.0, 0.0,      0.5,  0.5,  0.5,
+         1.0, 1.0,      0.5,  0.5, -0.5);
+
+    /* Eb */
+    face3(lc->texids[FACE_E], exterior_color, wire,
+         1.0, 0.0,      0.5,  0.5, -0.5,
+         1.0, 1.0,      0.5,  0.5,  0.5,
+         0.0, 1.0,      0.5, -0.5,  0.5);
+
+    face3(0, interior_color, wire,
+         0.0, 0.0,      0.5,  0.5, -0.5,
+         0.0, 0.0,      0.5, -0.5,  0.5,
+         0.0, 0.0,     -0.5,  0.5,  0.5);
+  }
+  glEndList();
+
+  glNewList(lc->tetra_usw, GL_COMPILE);
+  {
+    /* Ub */
+    face3(lc->texids[FACE_U], exterior_color, wire,
+         0.0, 1.0,     -0.5,  0.5,  0.5,
+         0.0, 0.0,     -0.5, -0.5,  0.5,
+         1.0, 0.0,      0.5, -0.5,  0.5);
+
+    /* Sb */
+    face3(lc->texids[FACE_S], exterior_color, wire,
+         1.0, 1.0,      0.5, -0.5,  0.5,
+         0.0, 1.0,     -0.5, -0.5,  0.5,
+         0.0, 0.0,     -0.5, -0.5, -0.5);
+
+    /* Wb */
+    face3(lc->texids[FACE_W], exterior_color, wire,
+         1.0, 0.0,     -0.5, -0.5, -0.5,
+         1.0, 1.0,     -0.5, -0.5,  0.5,
+         0.0, 1.0,     -0.5,  0.5,  0.5);
+
+    face3(0, interior_color, wire,
+         0.0,0.0,      -0.5, -0.5, -0.5,
+         0.0,0.0,      -0.5,  0.5,  0.5,
+         0.0,0.0,       0.5, -0.5,  0.5);
+  }
+  glEndList();
+
+  glNewList(lc->tetra_dwn, GL_COMPILE);
+  {
+    /* Db */
+    face3(lc->texids[FACE_D], exterior_color, wire,
+         0.0, 1.0,     -0.5, -0.5, -0.5,
+         0.0, 0.0,     -0.5,  0.5, -0.5,
+         1.0, 0.0,      0.5,  0.5, -0.5);
+
+    /* Wa */
+    face3(lc->texids[FACE_W], exterior_color, wire,
+         0.0, 1.0,     -0.5,  0.5,  0.5,
+         0.0, 0.0,     -0.5,  0.5, -0.5,
+         1.0, 0.0,     -0.5, -0.5, -0.5);
+
+    /* Nb */
+    face3(lc->texids[FACE_N], exterior_color, wire,
+         1.0, 1.0,      0.5,  0.5, -0.5,
+         0.0, 1.0,     -0.5,  0.5, -0.5,
+         0.0, 0.0,     -0.5,  0.5,  0.5);
+
+    face3(0, interior_color, wire,
+         0.0, 0.0,      0.5,  0.5, -0.5,
+         0.0, 0.0,     -0.5,  0.5,  0.5,
+         0.0, 0.0,     -0.5, -0.5, -0.5);
+  }
+  glEndList();
+
+  glNewList(lc->tetra_dse, GL_COMPILE);
+  {
+    /* Sa */
+    face3(lc->texids[FACE_S], exterior_color, wire,
+         0.0, 0.0,     -0.5, -0.5, -0.5,
+         1.0, 0.0,      0.5, -0.5, -0.5,
+         1.0, 1.0,      0.5, -0.5,  0.5);
+
+    /* Ea */
+    face3(lc->texids[FACE_E], exterior_color, wire,
+         0.0, 1.0,      0.5, -0.5,  0.5,
+         0.0, 0.0,      0.5, -0.5, -0.5,
+         1.0, 0.0,      0.5,  0.5, -0.5);
+
+    /* Da */
+    face3(lc->texids[FACE_D], exterior_color, wire,
+         1.0, 0.0,      0.5,  0.5, -0.5,
+         1.0, 1.0,      0.5, -0.5, -0.5,
+         0.0, 1.0,     -0.5, -0.5, -0.5);
+
+    face3(0, interior_color, wire,
+         0.0, 0.0,      0.5, -0.5,  0.5,
+         0.0, 0.0,      0.5,  0.5, -0.5,
+         0.0, 0.0,     -0.5, -0.5, -0.5);
+  }
+  glEndList();
+
+  glNewList(lc->tetra_mid, GL_COMPILE);
+  {
+    face3(0, interior_color, wire,
+         0.0, 0.0,      0.5, -0.5,  0.5,
+         0.0, 0.0,      0.5,  0.5, -0.5,
+         0.0, 0.0,     -0.5,  0.5,  0.5);
+
+    face3(0, interior_color, wire,
+         0.0, 0.0,     -0.5,  0.5,  0.5,
+         0.0, 0.0,     -0.5, -0.5, -0.5,
+         0.0, 0.0,      0.5, -0.5,  0.5);
+
+    face3(0, interior_color, wire,
+         0.0, 0.0,     -0.5,  0.5,  0.5,
+         0.0, 0.0,      0.5,  0.5, -0.5,
+         0.0, 0.0,     -0.5, -0.5, -0.5);
+
+    face3(0, interior_color, wire,
+         0.0, 0.0,      0.5,  0.5, -0.5,
+         0.0, 0.0,      0.5, -0.5,  0.5,
+         0.0, 0.0,     -0.5, -0.5, -0.5);
+
+    face3(0, interior_color, wire,
+         0.0, 0.0,      0.5, -0.5,  0.5,
+         0.0, 0.0,      0.5,  0.5, -0.5,
+         0.0, 0.0,     -0.5, -0.5, -0.5);
+  }
+  glEndList();
+
+}
+
+static void
+lid(ModeInfo *mi, Bool wire)
+{
+  lament_configuration *lc = &lcs[MI_SCREEN(mi)];
+  int i;
+
+  int points[][2] = {
+    { 128,  20 },{  21, 129 },{   0, 129 },{   0,   0 },{ 128,   0 }, /* L1 */
+    {  21, 129 },{ 127, 234 },{ 127, 255 },{   0, 255 },{   0, 129 }, /* L2 */
+    { 127, 234 },{ 233, 127 },{ 255, 127 },{ 255, 255 },{ 127, 255 }, /* R2 */
+    { 233, 127 },{ 128,  20 },{ 128,   0 },{ 255,   0 },{ 255, 127 }, /* R1 */
+  };
+
+  for (i = 0; i < countof(points); i++)
+    points[i][1] = 255-points[i][1];
+
+  glNewList(lc->lid_0, GL_COMPILE);
+  glShadeModel(GL_SMOOTH);
+
+  /* N */
+  face4(lc->texids[FACE_N], exterior_color, wire,
+       0.0, 0.0,       -0.5,  0.5,  0.5,
+       1.0, 0.0,        0.5,  0.5,  0.5,
+       1.0, 1.0,        0.5,  0.5, -0.5,
+       0.0, 1.0,       -0.5,  0.5, -0.5);
+
+  /* S */
+  face4(lc->texids[FACE_S], exterior_color, wire,
+       0.0, 0.0,       -0.5, -0.5, -0.5,
+       1.0, 0.0,        0.5, -0.5, -0.5,
+       1.0, 1.0,        0.5, -0.5,  0.5,
+       0.0, 1.0,       -0.5, -0.5,  0.5);
+
+  /* E */
+  face4(lc->texids[FACE_E], exterior_color, wire,
+       0.0, 0.0,        0.5, -0.5, -0.5,
+       1.0, 0.0,        0.5,  0.5, -0.5,
+       1.0, 1.0,        0.5,  0.5,  0.5,
+       0.0, 1.0,        0.5, -0.5,  0.5);
+
+  /* U */
+  face4(lc->texids[FACE_U], exterior_color, wire,
+       1.0, 0.0,        0.5, -0.5,  0.5,
+       1.0, 1.0,        0.5,  0.5,  0.5,
+       0.0, 1.0,       -0.5,  0.5,  0.5,
+       0.0, 0.0,       -0.5, -0.5,  0.5);
+
+  /* D */
+  face4(lc->texids[FACE_D], exterior_color, wire,
+       0.0, 1.0,       -0.5, -0.5, -0.5,
+       0.0, 0.0,       -0.5,  0.5, -0.5,
+       1.0, 0.0,        0.5,  0.5, -0.5,
+       1.0, 1.0,        0.5, -0.5, -0.5);
+
+  /* W -- lid_0 */
+  for (i = 0; i < countof(points)/5; i++)
+    {
+      int j;
+      GLfloat s[5], t[5], x[5], y[5], z[5];
+      for (j = 0; j < 5; j++)
+       {
+         GLfloat xx = points[(i*5)+j][0] / 255.0L;
+         GLfloat yy = points[(i*5)+j][1] / 255.0L;
+         s[j] = 1.0-xx;
+         t[j] = yy;
+         x[j] = -0.5;
+         y[j] = xx-0.5;
+         z[j] = yy-0.5;
+       }
+      face5(lc->texids[FACE_W], exterior_color, wire,
+           s[0], t[0],  x[0], y[0], z[0],
+           s[1], t[1],  x[1], y[1], z[1],
+           s[2], t[2],  x[2], y[2], z[2],
+           s[3], t[3],  x[3], y[3], z[3],
+           s[4], t[4],  x[4], y[4], z[4]);
+    }
+  glEndList();
+
+
+  /* W -- lid_1 through lid_4 */
+  for (i = 0; i < 4; i++)
+    {
+      GLfloat x1, y1, x2, y2, x3, y3;
+
+      glNewList(lc->lid_1 + i, GL_COMPILE);
+      glShadeModel(GL_SMOOTH);
+
+      x1 = points[(i*5)+1][0] / 255.0L;
+      y1 = points[(i*5)+1][1] / 255.0L;
+      x2 = points[(i*5)][0] / 255.0L;
+      y2 = points[(i*5)][1] / 255.0L;
+      x3 = 0.5;
+      y3 = 0.5;
+
+      /* Outer surface */
+      face3(lc->texids[FACE_W], exterior_color, wire,
+           1.0-x1, y1,         -0.5, x1-0.5, y1-0.5,
+           1.0-x2, y2,         -0.5, x2-0.5, y2-0.5,
+           1.0-x3, y3,         -0.5, x3-0.5, y3-0.5);
+
+      /* Inner surface */
+      face3(0, interior_color, wire,
+           0.0, 0.0,   -0.48, x2-0.5, y2-0.5,
+           0.0, 0.0,   -0.48, x1-0.5, y1-0.5,
+           0.0, 0.0,   -0.48, x3-0.5, y3-0.5);
+
+      /* Lip 1 */
+      face4(0, interior_color, wire,
+           0.0, 0.0,   -0.5,  x1-0.5, y1-0.5,
+           0.0, 0.0,   -0.5,  x3-0.5, y3-0.5,
+           0.0, 0.0,   -0.48, x3-0.5, y3-0.5,
+           0.0, 0.0,   -0.48, x1-0.5, y1-0.5);
+
+      /* Lip 2 */
+      face4(0, interior_color, wire,
+           0.0, 0.0,   -0.48, x2-0.5, y2-0.5,
+           0.0, 0.0,   -0.48, x3-0.5, y3-0.5,
+           0.0, 0.0,   -0.5,  x3-0.5, y3-0.5,
+           0.0, 0.0,   -0.5,  x2-0.5, y2-0.5);
+
+      glEndList();
+    }
+}
+
+static void
+taser(ModeInfo *mi, Bool wire)
+{
+  lament_configuration *lc = &lcs[MI_SCREEN(mi)];
+  int i;
+
+  int slider_face_points[][2] = {
+    {  86,  58 },{  38, 106 },{  70, 106 },{ 118,  58 },{  -1,  -1 }, /* a */
+    { 136,  58 },{ 184, 106 },{ 216, 106 },{ 168,  58 },{  -1,  -1 }, /* b */
+    {  38, 106 },{   0, 144 },{   0, 190 },{  60, 190 },{ 108, 106 }, /* c */
+    { 144, 106 },{ 194, 190 },{ 254, 190 },{ 254, 144 },{ 216, 106 }, /* d */
+    {  98, 124 },{  60, 190 },{  92, 190 },{ 126, 158 },{ 126, 124 }, /* e */
+    { 126, 124 },{ 126, 158 },{ 160, 190 },{ 194, 190 },{ 154, 124 }, /* f */
+    {  22, 190 },{  22, 254 },{  60, 254 },{  60, 190 },{  -1,  -1 }, /* g */
+    { 194, 190 },{ 194, 254 },{ 230, 254 },{ 230, 190 },{  -1,  -1 }, /* h */
+    {  60, 190 },{  60, 210 },{  92, 210 },{  92, 190 },{  -1,  -1 }, /* i */
+    { 160, 190 },{ 160, 210 },{ 194, 210 },{ 194, 190 },{  -1,  -1 }, /* j */
+    { 110, 172 },{  92, 190 },{ 110, 190 },{  -1,  -1 },{  -1,  -1 }, /* k */
+    { 140, 172 },{ 140, 190 },{ 160, 190 },{  -1,  -1 },{  -1,  -1 }, /* l */
+    { 110, 172 },{ 140, 172 },{ 126, 156 },{  -1,  -1 },{  -1,  -1 }, /* m */
+  };
+
+  int body_face_points[][2] = {
+    {   0,   0 },{   0,  58 },{ 254,  58 },{ 254,   0 },{  -1,  -1 }, /* A */
+    {   0,  58 },{   0, 144 },{  86,  58 },{  -1,  -1 },{  -1,  -1 }, /* B */
+    { 168,  58 },{ 254, 144 },{ 254,  58 },{  -1,  -1 },{  -1,  -1 }, /* C */
+    { 118,  58 },{  70, 106 },{ 184, 106 },{ 136,  58 },{  -1,  -1 }, /* F */
+    { 108, 106 },{  98, 124 },{ 154, 124 },{ 144, 106 },{  -1,  -1 }, /* G */
+  };
+
+  int lifter_face_points[][2] = {
+    {   0, 190 },{   0, 254 },{  22, 254 },{  22, 190 },{  -1,  -1 }, /* D */
+    { 230, 190 },{ 230, 254 },{ 254, 254 },{ 254, 190 },{  -1,  -1 }, /* E */
+    {  60, 210 },{  60, 254 },{ 194, 254 },{ 194, 210 },{  -1,  -1 }, /* H */
+    {  92, 190 },{  92, 210 },{ 160, 210 },{ 160, 190 },{  -1,  -1 }, /* I */
+    { 110, 172 },{ 110, 190 },{ 140, 190 },{ 140, 172 },{  -1,  -1 }, /* J */
+  };
+
+  int body_perimiter_points[][2] = {
+    {   0, 144 },{  86,  59 },{ 119,  58 },{  71, 107 },
+    { 108, 107 },{  98, 124 },{ 155, 124 },{ 144, 107 },
+    { 185, 106 },{ 136,  59 },{ 169,  59 },{ 255, 145 },
+    { 255,   0 },{   0,   0 },
+  };
+
+  int slider_perimiter_points[][2] = {
+    {  86,  58 },{   0,  144 },{   0, 190 },{  22,  190 },{  22, 254 },
+    {  60, 254 },{  60,  210 },{  92, 210 },{  92,  190 },{ 110, 190 },
+    { 110, 172 },{  140, 172 },{ 140, 190 },{ 160,  190 },{ 160, 210 },
+    { 194, 210 },{  194, 254 },{ 230, 254 },{ 230,  190 },{ 254, 190 },
+    { 254, 144 },{  168,  58 },{ 136,  58 },{ 184,  106 },{ 144, 106 },
+    { 154, 124 },{  98,  124 },{ 108, 106 },{  70,  106 },{ 118,  58 },
+  };
+
+  int lifter_perimiter_points_1[][2] = {
+    {   0, 189 },{   0, 254 },{  22, 255 },{  23, 190 },
+  };
+
+  int lifter_perimiter_points_2[][2] = {
+    { 230, 254 },{ 255, 255 },{ 254, 190 },{ 230, 190 },
+  };
+
+  int lifter_perimiter_points_3[][2] = {
+    {  60, 254 },{ 194, 254 },{ 194, 211 },{ 160, 210 },
+    { 160, 190 },{ 140, 191 },{ 141, 172 },{ 111, 172 },
+    { 110, 190 },{ 93, 190 },{ 92, 210 },{ 60, 211 },
+  };
+
+  for (i = 0; i < countof(slider_face_points); i++)
+    slider_face_points[i][1] = 255-slider_face_points[i][1];
+  for (i = 0; i < countof(body_face_points); i++)
+    body_face_points[i][1] = 255-body_face_points[i][1];
+  for (i = 0; i < countof(lifter_face_points); i++)
+    lifter_face_points[i][1] = 255-lifter_face_points[i][1];
+  for (i = 0; i < countof(body_perimiter_points); i++)
+    body_perimiter_points[i][1] = 255-body_perimiter_points[i][1];
+  for (i = 0; i < countof(slider_perimiter_points); i++)
+    slider_perimiter_points[i][1] = 255-slider_perimiter_points[i][1];
+  for (i = 0; i < countof(lifter_perimiter_points_1); i++)
+    lifter_perimiter_points_1[i][1] = 255-lifter_perimiter_points_1[i][1];
+  for (i = 0; i < countof(lifter_perimiter_points_2); i++)
+    lifter_perimiter_points_2[i][1] = 255-lifter_perimiter_points_2[i][1];
+  for (i = 0; i < countof(lifter_perimiter_points_3); i++)
+    lifter_perimiter_points_3[i][1] = 255-lifter_perimiter_points_3[i][1];
+
+  /* -------------------------------------------------------------------- */
+
+  glNewList(lc->taser_base, GL_COMPILE);
+  glShadeModel(GL_SMOOTH);
+
+  /* N */
+  face4(lc->texids[FACE_N], exterior_color, wire,
+       0.0, 0.0,       -0.5,  0.5,  0.5,
+       0.75, 0.0,       0.25, 0.5,  0.5,
+       0.75, 0.75,      0.25, 0.5, -0.25,
+       0.0, 0.75,      -0.5,  0.5, -0.25);
+
+  /* S */
+  face4(lc->texids[FACE_S], exterior_color, wire,
+       0.0,  0.25,     -0.5,  -0.5, -0.25,
+       0.75, 0.25,      0.25, -0.5, -0.25,
+       0.75, 1.0,       0.25, -0.5,  0.5,
+       0.0,  1.0,      -0.5,  -0.5,  0.5);
+
+  /* interior E */
+  face4(0, interior_color, wire,
+       0.0, 0.0,        0.25, -0.5, -0.25,
+       1.0, 0.0,        0.25,  0.5, -0.25,
+       1.0, 1.0,        0.25,  0.5,  0.5,
+       0.0, 1.0,        0.25, -0.5,  0.5);
+
+  /* W */
+  face4(lc->texids[FACE_W], exterior_color, wire,
+       1.0, 1.0,       -0.5, -0.5,  0.5,
+       0.0, 1.0,       -0.5,  0.5,  0.5,
+       0.0, 0.25,      -0.5,  0.5, -0.25,
+       1.0, 0.25,      -0.5, -0.5, -0.25);
+
+  /* U */
+  face4(lc->texids[FACE_U], exterior_color, wire,
+       0.75, 0.0,       0.25, -0.5,  0.5,
+       0.75, 1.0,       0.25,  0.5,  0.5,
+       0.0, 1.0,       -0.5,   0.5,  0.5,
+       0.0, 0.0,       -0.5,  -0.5,  0.5);
+
+  /* interior D */
+  face4(0, interior_color, wire,
+       0.0, 1.0,       -0.5,  -0.5, -0.25,
+       0.0, 0.0,       -0.5,   0.5, -0.25,
+       1.0, 0.0,        0.25,  0.5, -0.25,
+       1.0, 1.0,        0.25, -0.5, -0.25);
+
+  /* Top face */
+  for (i = 0; i < countof(body_face_points)/5; i++)
+    {
+      int j;
+#ifdef HAVE_GLBINDTEXTURE
+      glBindTexture(GL_TEXTURE_2D, lc->texids[FACE_E]);
+#endif /* HAVE_GLBINDTEXTURE */
+      glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, exterior_color);
+
+      do_normal(0, body_face_points[(i*5)+0][0], body_face_points[(i*5)+0][1],
+               0, body_face_points[(i*5)+1][0], body_face_points[(i*5)+1][1],
+               0, body_face_points[(i*5)+2][0], body_face_points[(i*5)+2][1]
+               );
+      glBegin(wire ? GL_LINE_LOOP : GL_POLYGON);
+      for (j = 0; j < 5; j++)
+       {
+         int ix = body_face_points[(i*5)+j][0];
+         int iy = body_face_points[(i*5)+j][1];
+         GLfloat x, y;
+         if (ix == -1)  /* these are padding: ignore them */
+           continue;
+         x = ix / 255.0L;
+         y = iy / 255.0L;
+         glTexCoord2f(x, y);
+         glVertex3f(0.5, x-0.5, y-0.5);
+       }
+      glEnd();
+    }
+
+  /* Side walls */
+  for (i = 0; i < countof(body_perimiter_points); i++)
+    {
+      int j = (i+1 >= countof(body_perimiter_points) ? 0 : i+1);
+      GLfloat x1 = body_perimiter_points[i][0] / 255.0;
+      GLfloat y1 = body_perimiter_points[i][1] / 255.0;
+      GLfloat x2 = body_perimiter_points[j][0] / 255.0;
+      GLfloat y2 = body_perimiter_points[j][1] / 255.0;
+      int texture = -1;
+      GLfloat s1=0, t1=0, s2=0, t2=0, s3=0, t3=0, s4=0, t4=0;
+
+      if (i == 11)
+       {
+         texture = lc->texids[FACE_N];
+         s1 = 1.0;  t1 = 0.0;
+         s2 = 1.0;  t2 = 0.568;
+         s3 = 0.75, t3 = 0.568;
+         s4 = 0.75; t4 = 0.0;
+       }
+      else if (i == 12)
+       {
+         texture = lc->texids[FACE_U];
+         s1 = 1.0;  t1 = 0.0;
+         s2 = 1.0;  t2 = 1.0;
+         s3 = 0.75, t3 = 1.0;
+         s4 = 0.75; t4 = 0.0;
+       }
+      else if (i == 13)
+       {
+         texture = lc->texids[FACE_S];
+         s1 = 1.0;  t1 = 0.437;
+         s2 = 1.0;  t2 = 1.0;
+         s3 = 0.75; t3 = 1.0;
+         s4 = 0.75; t4 = 0.437;
+       }
+
+      face4((texture == -1 ? 0 : texture),
+           (texture == -1 ? interior_color : exterior_color),
+           wire,
+           s1, t1,  0.5,  x2-0.5, y2-0.5,
+           s2, t2,  0.5,  x1-0.5, y1-0.5,
+           s3, t3,  0.25, x1-0.5, y1-0.5,
+           s4, t4,  0.25, x2-0.5, y2-0.5);
+    }
+
+  glEndList();
+
+  /* -------------------------------------------------------------------- */
+
+  glNewList(lc->taser_lifter, GL_COMPILE);
+  glShadeModel(GL_SMOOTH);
+
+  /* N */
+  face4(lc->texids[FACE_N], exterior_color, wire,
+       0.0,  0.75,     -0.5,  0.5, -0.25,
+       0.75, 0.75,      0.25, 0.5, -0.25,
+       0.75, 1.0,       0.25, 0.5, -0.5,
+       0.0,  1.0,      -0.5,  0.5, -0.5);
+
+  /* S */
+  face4(lc->texids[FACE_S], exterior_color, wire,
+       0.0,  0.0,      -0.5,  -0.5, -0.5,
+       0.75, 0.0,       0.25, -0.5, -0.5,
+       0.75, 0.25,      0.25, -0.5, -0.25,
+       0.0,  0.25,     -0.5,  -0.5, -0.25);
+
+  /* interior E */
+  face4(0, interior_color, wire,
+       0.0, 1.0,        0.25, -0.5, -0.5,
+       1.0, 1.0,        0.25,  0.5, -0.5,
+       1.0, 0.0,        0.25,  0.5, -0.25,
+       0.0, 0.0,        0.25, -0.5, -0.25);
+
+  /* W */
+  face4(lc->texids[FACE_W], exterior_color, wire,
+       1.0, 0.25,      -0.5, -0.5, -0.25,
+       0.0, 0.25,      -0.5,  0.5, -0.25,
+       0.0, 0.0,       -0.5,  0.5, -0.5,
+       1.0, 0.0,       -0.5, -0.5, -0.5);
+
+  /* interior U */
+  face4(0, interior_color, wire,
+       1.0, 0.0,        0.25, -0.5,  -0.25,
+       1.0, 1.0,        0.25,  0.5,  -0.25,
+       0.0, 1.0,       -0.5,   0.5,  -0.25,
+       0.0, 0.0,       -0.5,  -0.5,  -0.25);
+
+  /* D */
+  face4(lc->texids[FACE_D], exterior_color, wire,
+       0.0, 1.0,       -0.5, -0.5, -0.5,
+       0.0, 0.0,       -0.5,  0.5, -0.5,
+       0.75, 0.0,       0.25,  0.5, -0.5,
+       0.75, 1.0,       0.25, -0.5, -0.5);
+
+
+  /* Top face */
+  for (i = 0; i < countof(lifter_face_points)/5; i++)
+    {
+      int j;
+
+#ifdef HAVE_GLBINDTEXTURE
+      glBindTexture(GL_TEXTURE_2D, lc->texids[FACE_E]);
+#endif /* HAVE_GLBINDTEXTURE */
+      glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, exterior_color);
+
+      do_normal(
+         0, lifter_face_points[(i*5)+0][0], lifter_face_points[(i*5)+0][1],
+        0, lifter_face_points[(i*5)+1][0], lifter_face_points[(i*5)+1][1],
+        0, lifter_face_points[(i*5)+2][0], lifter_face_points[(i*5)+2][1]);
+
+      glBegin(wire ? GL_LINE_LOOP : GL_POLYGON);
+      for (j = 0; j < 5; j++)
+       {
+         int ix = lifter_face_points[(i*5)+j][0];
+         int iy = lifter_face_points[(i*5)+j][1];
+         GLfloat x, y;
+         if (ix == -1)  /* these are padding: ignore them */
+           continue;
+         x = ix / 255.0L;
+         y = iy / 255.0L;
+         glTexCoord2f(x, y);
+         glVertex3f(0.5, x-0.5, y-0.5);
+       }
+      glEnd();
+    }
+
+  /* Side walls */
+  for (i = 0; i < countof(lifter_perimiter_points_1); i++)
+    {
+      int j = (i+1 >= countof(lifter_perimiter_points_1) ? 0 : i+1);
+      GLfloat x1 = lifter_perimiter_points_1[i][0] / 255.0;
+      GLfloat y1 = lifter_perimiter_points_1[i][1] / 255.0;
+      GLfloat x2 = lifter_perimiter_points_1[j][0] / 255.0;
+      GLfloat y2 = lifter_perimiter_points_1[j][1] / 255.0;
+      int texture = -1;
+      GLfloat s1=0, t1=0, s2=0, t2=0, s3=0, t3=0, s4=0, t4=0;
+
+      if (i == 0)
+       {
+         texture = lc->texids[FACE_S];
+         s1 = 1.0;  t1 = 0.0;
+         s2 = 1.0;  t2 = 0.26;
+         s3 = 0.75, t3 = 0.26;
+         s4 = 0.75; t4 = 0.0;
+       }
+      else if (i == 1)
+       {
+         texture = lc->texids[FACE_D];
+         s1 = 1.0;  t1 = 0.914;
+         s2 = 1.0;  t2 = 1.0;
+         s3 = 0.75; t3 = 1.0;
+         s4 = 0.75; t4 = 0.914;
+       }
+
+      face4((texture == -1 ? 0 : texture),
+           (texture == -1 ? interior_color : exterior_color),
+           wire,
+           s1, t1,  0.5,  x2-0.5, y2-0.5,
+           s2, t2,  0.5,  x1-0.5, y1-0.5,
+           s3, t3,  0.25, x1-0.5, y1-0.5,
+           s4, t4,  0.25, x2-0.5, y2-0.5);
+    }
+
+  for (i = 0; i < countof(lifter_perimiter_points_2); i++)
+    {
+      int j = (i+1 >= countof(lifter_perimiter_points_2) ? 0 : i+1);
+      GLfloat x1 = lifter_perimiter_points_2[i][0] / 255.0;
+      GLfloat y1 = lifter_perimiter_points_2[i][1] / 255.0;
+      GLfloat x2 = lifter_perimiter_points_2[j][0] / 255.0;
+      GLfloat y2 = lifter_perimiter_points_2[j][1] / 255.0;
+      int texture = -1;
+      GLfloat s1=0, t1=0, s2=0, t2=0, s3=0, t3=0, s4=0, t4=0;
+
+      if (i == 0)
+       {
+         texture = lc->texids[FACE_D];
+         s1 = 1.0;  t1 = 0.0;
+         s2 = 1.0;  t2 = 0.095;
+         s3 = 0.75; t3 = 0.095;
+         s4 = 0.75; t4 = 0.0;
+       }
+      else if (i == 1)
+       {
+         texture = lc->texids[FACE_N];
+         s1 = 1.0;  t1 = 0.745;
+         s2 = 1.0;  t2 = 1.0;
+         s3 = 0.75; t3 = 1.0;
+         s4 = 0.75; t4 = 0.745;
+       }
+
+      face4((texture == -1 ? 0 : texture),
+           (texture == -1 ? interior_color : exterior_color),
+           wire,
+           s1, t1,  0.5,  x2-0.5, y2-0.5,
+           s2, t2,  0.5,  x1-0.5, y1-0.5,
+           s3, t3,  0.25, x1-0.5, y1-0.5,
+           s4, t4,  0.25, x2-0.5, y2-0.5);
+    }
+
+  for (i = 0; i < countof(lifter_perimiter_points_3); i++)
+    {
+      int j = (i+1 >= countof(lifter_perimiter_points_3) ? 0 : i+1);
+      GLfloat x1 = lifter_perimiter_points_3[i][0] / 255.0;
+      GLfloat y1 = lifter_perimiter_points_3[i][1] / 255.0;
+      GLfloat x2 = lifter_perimiter_points_3[j][0] / 255.0;
+      GLfloat y2 = lifter_perimiter_points_3[j][1] / 255.0;
+      int texture = -1;
+      GLfloat s1=0, t1=0, s2=0, t2=0, s3=0, t3=0, s4=0, t4=0;
+
+      if (i == 0)
+       {
+         texture = lc->texids[FACE_D];
+         s1 = 1.0;  t1 = 0.235;
+         s2 = 1.0;  t2 = 0.765;
+         s3 = 0.75; t3 = 0.765;
+         s4 = 0.75; t4 = 0.235;
+       }
+
+      face4((texture == -1 ? 0 : texture),
+           (texture == -1 ? interior_color : exterior_color),
+           wire,
+           s1, t1,  0.5,  x2-0.5, y2-0.5,
+           s2, t2,  0.5,  x1-0.5, y1-0.5,
+           s3, t3,  0.25, x1-0.5, y1-0.5,
+           s4, t4,  0.25, x2-0.5, y2-0.5);
+    }
+
+  glEndList();
+
+  /* -------------------------------------------------------------------- */
+
+  glNewList(lc->taser_slider, GL_COMPILE);
+  glShadeModel(GL_SMOOTH);
+
+  /* Top face */
+  for (i = 0; i < countof(slider_face_points)/5; i++)
+    {
+      int j;
+#ifdef HAVE_GLBINDTEXTURE
+      glBindTexture(GL_TEXTURE_2D, lc->texids[FACE_E]);
+#endif /* HAVE_GLBINDTEXTURE */
+      glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, exterior_color);
+
+      do_normal(
+          0, slider_face_points[(i*5)+0][0], slider_face_points[(i*5)+0][1],
+          0, slider_face_points[(i*5)+1][0], slider_face_points[(i*5)+1][1],
+          0, slider_face_points[(i*5)+2][0], slider_face_points[(i*5)+2][1]);
+      glBegin(wire ? GL_LINE_LOOP : GL_POLYGON);
+      for (j = 0; j < 5; j++)
+       {
+         int ix = slider_face_points[(i*5)+j][0];
+         int iy = slider_face_points[(i*5)+j][1];
+         GLfloat x, y;
+         if (ix == -1)  /* these are padding: ignore them */
+           continue;
+         x = ix / 255.0L;
+         y = iy / 255.0L;
+         glTexCoord2f(x, y);
+         glVertex3f(0.5, x-0.5, y-0.5);
+       }
+      glEnd();
+    }
+
+  /* Bottom face */
+  for (i = countof(slider_face_points)/5 - 1; i >= 0; i--)
+    {
+      int j;
+#ifdef HAVE_GLBINDTEXTURE
+      glBindTexture(GL_TEXTURE_2D, 0);
+#endif /* HAVE_GLBINDTEXTURE */
+      glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, interior_color);
+
+      do_normal(
+          0, slider_face_points[(i*5)+2][0], slider_face_points[(i*5)+2][1],
+          0, slider_face_points[(i*5)+1][0], slider_face_points[(i*5)+1][1],
+          0, slider_face_points[(i*5)+0][0], slider_face_points[(i*5)+0][1]);
+      glBegin(wire ? GL_LINE_LOOP : GL_POLYGON);
+      for (j = 4; j >= 0; j--)
+       {
+         int ix = slider_face_points[(i*5)+j][0];
+         int iy = slider_face_points[(i*5)+j][1];
+         GLfloat x, y;
+         if (ix == -1)  /* these are padding: ignore them */
+           continue;
+         x = ix / 255.0L;
+         y = iy / 255.0L;
+         glTexCoord2f(x, y);
+         glVertex3f(0.25, x-0.5, y-0.5);
+       }
+      glEnd();
+    }
+
+  /* Side walls */
+  for (i = 0; i < countof(slider_perimiter_points); i++)
+    {
+      int j = (i+1 >= countof(slider_perimiter_points) ? 0 : i+1);
+      GLfloat x1 = slider_perimiter_points[i][0] / 255.0;
+      GLfloat y1 = slider_perimiter_points[i][1] / 255.0;
+      GLfloat x2 = slider_perimiter_points[j][0] / 255.0;
+      GLfloat y2 = slider_perimiter_points[j][1] / 255.0;
+      int texture = -1;
+      GLfloat s1=0, t1=0, s2=0, t2=0, s3=0, t3=0, s4=0, t4=0;
+
+      if (i == 1)
+       {
+         texture = lc->texids[FACE_S];
+         s1 = 1.0;  t1 = 0.255;
+         s2 = 1.0;  t2 = 0.435;
+         s3 = 0.75; t3 = 0.435;
+         s4 = 0.75; t4 = 0.255;
+       }
+      else if (i == 4)
+       {
+         texture = lc->texids[FACE_D];
+         s1 = 1.0;  t1 = 0.758;
+         s2 = 1.0;  t2 = 0.915;
+         s3 = 0.75; t3 = 0.915;
+         s4 = 0.75; t4 = 0.758;
+       }
+      else if (i == 16)
+       {
+         texture = lc->texids[FACE_D];
+         s1 = 1.0;  t1 = 0.095;
+         s2 = 1.0;  t2 = 0.24;
+         s3 = 0.75; t3 = 0.24;
+         s4 = 0.75; t4 = 0.095;
+       }
+      else if (i == 19)
+       {
+         texture = lc->texids[FACE_N];
+         s1 = 1.0;  t1 = 0.568;
+         s2 = 1.0;  t2 = 0.742;
+         s3 = 0.75; t3 = 0.742;
+         s4 = 0.75; t4 = 0.568;
+       }
+
+      face4((texture == -1 ? 0 : texture),
+           (texture == -1 ? interior_color : exterior_color),
+           wire,
+           s1, t1,  0.5,  x2-0.5, y2-0.5,
+           s2, t2,  0.5,  x1-0.5, y1-0.5,
+           s3, t3,  0.25, x1-0.5, y1-0.5,
+           s4, t4,  0.25, x2-0.5, y2-0.5);
+    }
+
+  glEndList();
+}
+
+
+\f
+/* Rendering and animating object models
+ */
+
+static void
+draw(ModeInfo *mi)
+{
+  lament_configuration *lc = &lcs[MI_SCREEN(mi)];
+  Bool wire = MI_IS_WIREFRAME(mi);
+
+  if (!wire)
+    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+  else
+    glClear(GL_COLOR_BUFFER_BIT);
+
+  glPushMatrix();
+  {
+    GLfloat x = lc->rotx;
+    GLfloat y = lc->roty;
+    GLfloat z = lc->rotz;
+
+#if 0
+ x=0.75; y=0; z=0; 
+#endif
+
+    if (x < 0) x = 1 - (x + 1);
+    if (y < 0) y = 1 - (y + 1);
+    if (z < 0) z = 1 - (z + 1);
+
+    /* Make into the screen be +Y right be +X, and up be +Z. */
+    glRotatef(-90.0, 1.0, 0.0, 0.0);
+
+    /* Scale it up. */
+    glScalef(4.0, 4.0, 4.0);
+
+#ifdef DEBUG
+    glPushMatrix();
+    {
+      /* Shift to the upper left, and draw the vanilla box. */
+      glTranslatef(-0.6, 0.0, 0.6);
+
+      /* Apply rotation to the object. */
+      glRotatef(x * 360, 1.0, 0.0, 0.0);
+      glRotatef(y * 360, 0.0, 1.0, 0.0);
+      glRotatef(z * 360, 0.0, 0.0, 1.0);
+
+      /* Draw it. */
+      glCallList(lc->box);
+    }
+    glPopMatrix();
+
+    /* Shift to the lower right, and draw the animated object. */
+    glTranslatef(0.6, 0.0, -0.6);
+#endif /* DEBUG */
+
+
+    glPushMatrix();
+    {
+      /* Apply rotation to the object. */
+      glRotatef(x * 360, 1.0, 0.0, 0.0);
+      glRotatef(y * 360, 0.0, 1.0, 0.0);
+      glRotatef(z * 360, 0.0, 0.0, 1.0);
+
+      switch (lc->type)
+       {
+       case LAMENT_BOX:
+         glCallList(lc->box);
+         break;
+
+       case LAMENT_STAR_OUT:
+       case LAMENT_STAR_ROT:
+       case LAMENT_STAR_ROT_IN:
+       case LAMENT_STAR_ROT_OUT:
+       case LAMENT_STAR_UNROT:
+       case LAMENT_STAR_IN:
+         glTranslatef(0.0, 0.0, lc->anim_z/2);
+         glRotatef(lc->anim_r/2, 0.0, 0.0, 1.0);
+         glCallList(lc->star1);
+
+         glTranslatef(0.0, 0.0, -lc->anim_z);
+         glRotatef(-lc->anim_r, 0.0, 0.0, 1.0);
+         glCallList(lc->star2);
+         break;
+
+       case LAMENT_TETRA_UNE:
+       case LAMENT_TETRA_USW:
+       case LAMENT_TETRA_DWN:
+       case LAMENT_TETRA_DSE:
+         {
+           int magic;
+           GLfloat x, y, z;
+           switch (lc->type) {
+           case LAMENT_TETRA_UNE: magic = lc->tetra_une;
+             x = 1.0; y = 1.0; z = 1.0; break;
+           case LAMENT_TETRA_USW: magic = lc->tetra_usw;
+             x = 1.0; y = 1.0; z = -1.0; break;
+           case LAMENT_TETRA_DWN: magic = lc->tetra_dwn;
+             x = 1.0; y = -1.0; z = 1.0; break;
+           case LAMENT_TETRA_DSE: magic = lc->tetra_dse;
+             x = -1.0; y = 1.0; z = 1.0; break;
+           default: abort(); break;
+           }
+           glCallList(lc->tetra_mid);
+           if (magic != lc->tetra_une) glCallList(lc->tetra_une);
+           if (magic != lc->tetra_usw) glCallList(lc->tetra_usw);
+           if (magic != lc->tetra_dwn) glCallList(lc->tetra_dwn);
+           if (magic != lc->tetra_dse) glCallList(lc->tetra_dse);
+           glRotatef(lc->anim_r, x, y, z);
+           glCallList(magic);
+         }
+         break;
+
+       case LAMENT_LID_OPEN:
+       case LAMENT_LID_CLOSE:
+       case LAMENT_LID_ZOOM:
+         {
+           GLfloat d = 0.417;
+
+           glTranslatef(lc->anim_z, 0.0, 0.0);
+
+           glCallList(lc->lid_0);
+
+           glPushMatrix();
+             glTranslatef(-0.5, -d, 0.0);
+             glRotatef(-lc->anim_r, 0.0, -1.0, -1.0);
+             glTranslatef( 0.5,  d, 0.0);
+             glCallList(lc->lid_1);
+           glPopMatrix();
+           glPushMatrix();
+             glTranslatef(-0.5, -d, 0.0);
+             glRotatef( lc->anim_r, 0.0, -1.0,   1.0);
+             glTranslatef( 0.5,  d, 0.0);
+             glCallList(lc->lid_2);
+           glPopMatrix();
+           glPushMatrix();
+             glTranslatef(-0.5,  d, 0.0);
+             glRotatef( lc->anim_r, 0.0,  -1.0,  -1.0);
+             glTranslatef( 0.5, -d, 0.0);
+             glCallList(lc->lid_3);
+           glPopMatrix();
+           glPushMatrix();
+             glTranslatef(-0.5,  d, 0.0);
+             glRotatef(-lc->anim_r, 0.0,  -1.0,   1.0);
+             glTranslatef( 0.5, -d, 0.0);
+             glCallList(lc->lid_4);
+           glPopMatrix();
+         }
+         break;
+
+       case LAMENT_TASER_OUT:
+       case LAMENT_TASER_SLIDE:
+       case LAMENT_TASER_SLIDE_IN:
+       case LAMENT_TASER_IN:
+
+         glTranslatef(-lc->anim_z/2, 0.0, 0.0);
+         glCallList(lc->taser_base);
+
+         glTranslatef(lc->anim_z, 0.0, 0.0);
+         glCallList(lc->taser_lifter);
+
+         glTranslatef(0.0, 0.0, lc->anim_y);
+         glCallList(lc->taser_slider);
+         break;
+
+       default:
+         abort();
+         break;
+       }
+    }
+    glPopMatrix();
+
+  }
+  glPopMatrix();
+}
+
+
+static void
+animate(ModeInfo *mi)
+{
+  lament_configuration *lc = &lcs[MI_SCREEN(mi)];
+  int pause = 10;
+/*  int pause2 = 60;*/
+  int pause3 = 120;
+
+  switch (lc->type)
+    {
+    case LAMENT_BOX:
+      {
+       /* Rather than just picking states randomly, pick an ordering randomly,
+          do it, and then re-randomize.  That way one can be assured of seeing
+          all states in a short time period, though not always in the same
+          order (it's frustrating to see it pick the same state 5x in a row.)
+        */
+       static lament_type states[] = {
+         LAMENT_STAR_OUT, LAMENT_STAR_OUT,
+         LAMENT_TETRA_UNE, LAMENT_TETRA_USW,
+         LAMENT_TETRA_DWN, LAMENT_TETRA_DSE,
+         LAMENT_LID_OPEN, LAMENT_LID_OPEN, LAMENT_LID_OPEN,
+         LAMENT_TASER_OUT, LAMENT_TASER_OUT,
+         LAMENT_BOX, LAMENT_BOX, LAMENT_BOX, LAMENT_BOX, LAMENT_BOX,
+         LAMENT_BOX, LAMENT_BOX, LAMENT_BOX, LAMENT_BOX, LAMENT_BOX,
+       };
+       static int state = countof(states);
+
+       if (state < countof(states))
+         {
+           lc->type = states[state++];
+         }
+       else
+         {
+           int i;
+           state = 0;
+           for (i = 0; i < countof(states); i++)
+             {
+               int a = random() % countof(states);
+               lament_type swap = states[a];
+               states[a] = states[i];
+               states[i] = swap;
+             }
+         }
+
+       if (lc->type == LAMENT_BOX)
+         lc->anim_pause = pause3;
+
+       lc->anim_r = 0.0;
+       lc->anim_y = 0.0;
+       lc->anim_z = 0.0;
+      }
+      break;
+
+      /* -------------------------------------------------------------- */
+
+    case LAMENT_STAR_OUT:
+      lc->anim_z += 0.01;
+      if (lc->anim_z >= 1.0)
+       {
+         lc->anim_z = 1.0;
+         lc->type = LAMENT_STAR_ROT;
+         lc->anim_pause = pause;
+       }
+      break;
+
+    case LAMENT_STAR_ROT:
+      lc->anim_r += 1.0;
+      if (lc->anim_r >= 45.0)
+       {
+         lc->anim_r = 45.0;
+         lc->type = LAMENT_STAR_ROT_IN;
+         lc->anim_pause = pause;
+       }
+      break;
+
+    case LAMENT_STAR_ROT_IN:
+      lc->anim_z -= 0.01;
+      if (lc->anim_z <= 0.0)
+       {
+         lc->anim_z = 0.0;
+         lc->type = LAMENT_STAR_ROT_OUT;
+         lc->anim_pause = pause3 * (1 + (random() % 4) + (random() % 4));
+       }
+      break;
+
+    case LAMENT_STAR_ROT_OUT:
+      lc->anim_z += 0.01;
+      if (lc->anim_z >= 1.0)
+       {
+         lc->anim_z = 1.0;
+         lc->type = LAMENT_STAR_UNROT;
+         lc->anim_pause = pause;
+       }
+      break;
+      
+    case LAMENT_STAR_UNROT:
+      lc->anim_r -= 1.0;
+      if (lc->anim_r <= 0.0)
+       {
+         lc->anim_r = 0.0;
+         lc->type = LAMENT_STAR_IN;
+         lc->anim_pause = pause;
+       }
+      break;
+
+    case LAMENT_STAR_IN:
+      lc->anim_z -= 0.01;
+      if (lc->anim_z <= 0.0)
+       {
+         lc->anim_z = 0.0;
+         lc->type = LAMENT_BOX;
+         lc->anim_pause = pause3;
+       }
+      break;
+
+      /* -------------------------------------------------------------- */
+
+    case LAMENT_TETRA_UNE:
+    case LAMENT_TETRA_USW:
+    case LAMENT_TETRA_DWN:
+    case LAMENT_TETRA_DSE:
+
+      lc->anim_r += 1.0;
+      if (lc->anim_r >= 360.0)
+       {
+         lc->anim_r = 0.0;
+         lc->type = LAMENT_BOX;
+         lc->anim_pause = pause3;
+       }
+      else if (lc->anim_r > 119.0 && lc->anim_r <= 120.0)
+       {
+         lc->anim_r = 120.0;
+         lc->anim_pause = pause;
+       }
+      else if (lc->anim_r > 239.0 && lc->anim_r <= 240.0)
+       {
+         lc->anim_r = 240.0;
+         lc->anim_pause = pause;
+       }
+      break;
+
+      /* -------------------------------------------------------------- */
+
+    case LAMENT_LID_OPEN:
+      lc->anim_r += 1.0;
+
+      if (lc->anim_r >= 112.0)
+       {
+         GLfloat hysteresis = 0.05;
+
+         lc->anim_r = 112.0;
+         lc->anim_z = 0.0;
+         lc->anim_pause = pause3;
+
+         if (lc->rotx >= -hysteresis &&
+             lc->rotx <=  hysteresis &&
+             ((lc->rotz >=  (0.25 - hysteresis) &&
+               lc->rotz <=  (0.25 + hysteresis)) ||
+              (lc->rotz >= (-0.25 - hysteresis) &&
+               lc->rotz <= (-0.25 + hysteresis))))
+           {
+             lc->type = LAMENT_LID_ZOOM;
+             lc->rotx = 0.00;
+             lc->rotz = (lc->rotz < 0 ? -0.25 : 0.25);
+           }
+         else
+           {
+             lc->type = LAMENT_LID_CLOSE;
+           }
+       }
+      break;
+
+    case LAMENT_LID_CLOSE:
+      lc->anim_r -= 1.0;
+      if (lc->anim_r <= 0.0)
+       {
+         lc->anim_r = 0.0;
+         lc->type = LAMENT_BOX;
+         lc->anim_pause = pause3;
+       }
+      break;
+
+    case LAMENT_LID_ZOOM:
+      lc->anim_z -= 0.1;
+      if (lc->anim_z < -50.0)
+       {
+         lc->anim_r = 0.0;
+         lc->anim_z = 0.0;
+         lc->rotx = frand(1.0) * RANDSIGN();
+         lc->roty = frand(1.0) * RANDSIGN();
+         lc->rotz = frand(1.0) * RANDSIGN();
+         lc->type = LAMENT_BOX;
+       }
+      break;
+
+      /* -------------------------------------------------------------- */
+
+    case LAMENT_TASER_OUT:
+      lc->anim_z += 0.0025;
+      if (lc->anim_z >= 0.25)
+       {
+         lc->anim_z = 0.25;
+         lc->type = LAMENT_TASER_SLIDE;
+         lc->anim_pause = pause * (1 + (random() % 5) + (random() % 5));
+       }
+      break;
+
+    case LAMENT_TASER_SLIDE:
+      lc->anim_y += 0.0025;
+      if (lc->anim_y >= 0.23)
+       {
+         lc->anim_y = 0.23;
+         lc->type = LAMENT_TASER_SLIDE_IN;
+         lc->anim_pause = pause3 * (1 + (random() % 5) + (random() % 5));
+       }
+      break;
+
+    case LAMENT_TASER_SLIDE_IN:
+      lc->anim_y -= 0.0025;
+      if (lc->anim_y <= 0.0)
+       {
+         lc->anim_y = 0.0;
+         lc->type = LAMENT_TASER_IN;
+         lc->anim_pause = pause;
+       }
+      break;
+
+    case LAMENT_TASER_IN:
+      lc->anim_z -= 0.0025;
+      if (lc->anim_z <= 0.0)
+       {
+         lc->anim_z = 0.0;
+         lc->type = LAMENT_BOX;
+         lc->anim_pause = pause3;
+       }
+      break;
+
+    default:
+      abort();
+      break;
+    }
+}
+
+
+static void
+rotate(GLfloat *pos, GLfloat *v, GLfloat *dv, GLfloat max_v)
+{
+  double ppos = *pos;
+
+  /* tick position */
+  if (ppos < 0)
+    ppos = -(ppos + *v);
+  else
+    ppos += *v;
+
+  if (ppos > 1.0)
+    ppos -= 1.0;
+  else if (ppos < 0)
+    ppos += 1.0;
+
+  if (ppos < 0) abort();
+  if (ppos > 1.0) abort();
+  *pos = (*pos > 0 ? ppos : -ppos);
+
+  /* accelerate */
+  *v += *dv;
+
+  /* clamp velocity */
+  if (*v > max_v || *v < -max_v)
+    {
+      *dv = -*dv;
+    }
+  /* If it stops, start it going in the other direction. */
+  else if (*v < 0)
+    {
+      if (random() % 4)
+       {
+         *v = 0;
+
+         /* keep going in the same direction */
+         if (random() % 2)
+           *dv = 0;
+         else if (*dv < 0)
+           *dv = -*dv;
+       }
+      else
+       {
+         /* reverse gears */
+         *v = -*v;
+         *dv = -*dv;
+         *pos = -*pos;
+       }
+    }
+
+  /* Alter direction of rotational acceleration randomly. */
+  if (! (random() % 120))
+    *dv = -*dv;
+
+  /* Change acceleration very occasionally. */
+  if (! (random() % 200))
+    {
+      if (*dv == 0)
+       *dv = 0.00001;
+      else if (random() & 1)
+       *dv *= 1.2;
+      else
+       *dv *= 0.8;
+    }
+}
+
+
+\f
+/* Window management, etc
+ */
+
+static void
+reshape(int width, int height)
+{
+  int target_size = 180;
+  int win_size = (width > height ? height : width);
+  GLfloat h = (GLfloat) height / (GLfloat) width;
+
+  glViewport(0, 0, (GLint) width, (GLint) height);
+
+/*  glViewport(-600, -600, 1800, 1800); */
+
+  glMatrixMode(GL_PROJECTION);
+  glLoadIdentity();
+  glFrustum(-1.0, 1.0, -h, h, 5.0, 60.0);
+  glMatrixMode(GL_MODELVIEW);
+  glLoadIdentity();
+  glTranslatef(0.0, 0.0, -40.0);
+
+  /* This scale makes the box take up most of the window */
+  glScalef(2.0, 2.0, 2.0);
+
+  /* But if the window is more than a little larger than our target size,
+     scale the object back down, so that the bits drawn on the screen end
+     up rougly target_size across (actually it ends up a little larger.)
+     Note that the image-map bits we have are 128x128.  Therefore, if the
+     image is magnified a lot, it looks pretty blocky.  So it's better to
+     have a 128x128 animation on a 1280x1024 screen that looks good, than
+     a 1024x1024 animation that looks really pixellated.
+   */
+  if (win_size > target_size * 1.5)
+    {
+      GLfloat ratio = ((GLfloat) target_size / (GLfloat) win_size);
+      ratio *= 2.0;
+      glScalef(ratio, ratio, ratio);
+    }
+
+  /* The depth buffer will be cleared, if needed, before the
+   * next frame.  Right now we just want to black the screen.
+   */
+  glClear(GL_COLOR_BUFFER_BIT);
+}
+
+
+static void
+gl_init(ModeInfo *mi)
+{
+  lament_configuration *lc = &lcs[MI_SCREEN(mi)];
+  Bool wire = MI_IS_WIREFRAME(mi);
+
+  if (wire)
+    do_texture = False;
+
+  if (!wire)
+    {
+      static GLfloat pos0[]  = { -4.0, 2.0, 5.0, 1.0 };
+      static GLfloat pos1[]  = { 12.0, 5.0, 1.0, 1.0 };
+      static GLfloat local[] = { 0.0 };
+      static GLfloat ambient[] = { 0.3, 0.3, 0.3, 1.0 };
+      static GLfloat spec[] = { 1.0, 1.0, 1.0, 1.0 };
+      static GLfloat shine[] = { 100.0 };
+
+      glLightfv(GL_LIGHT0, GL_POSITION, pos0);
+      glLightfv(GL_LIGHT1, GL_POSITION, pos1);
+
+      glLightfv(GL_LIGHT0, GL_AMBIENT, ambient);
+      glLightfv(GL_LIGHT1, GL_AMBIENT, ambient);
+
+      glLightfv(GL_LIGHT0, GL_SPECULAR, spec);
+      glLightfv(GL_LIGHT1, GL_SPECULAR, spec);
+
+      glLightModelfv(GL_LIGHT_MODEL_LOCAL_VIEWER, local);
+      glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, exterior_color);
+      glMaterialfv(GL_FRONT, GL_SPECULAR, spec);
+      glMaterialfv(GL_FRONT, GL_SHININESS, shine);
+
+      glEnable(GL_LIGHTING);
+      glEnable(GL_LIGHT0);
+      glEnable(GL_LIGHT1);
+      glDisable(GL_LIGHT1);
+
+      glEnable(GL_DEPTH_TEST);
+      glEnable(GL_TEXTURE_2D);
+      glEnable(GL_NORMALIZE);
+      glEnable(GL_CULL_FACE);
+    }
+
+  if (do_texture)
+    {
+#ifdef HAVE_GLBINDTEXTURE
+      int i;
+      for (i = 0; i < 6; i++)
+       glGenTextures(1, &lc->texids[i]);
+
+      parse_image_data(mi);
+
+      glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
+      glPixelStorei(GL_UNPACK_ROW_LENGTH, lc->texture->width);
+
+      for (i = 0; i < 6; i++)
+       {
+         int height = lc->texture->width;      /* assume square */
+         glBindTexture(GL_TEXTURE_2D, lc->texids[i]);
+         glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, exterior_color);
+         glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,
+                      lc->texture->width, height, 0,
+                      GL_RGBA, GL_UNSIGNED_BYTE,
+                      (lc->texture->data +
+                       (lc->texture->bytes_per_line * height * i)));
+
+         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+         glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
+         glTexGeni(GL_T, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);
+       }
+
+#else  /* !HAVE_GLBINDTEXTURE */
+      fprintf(stderr,
+             "%s: this version of GL doesn't support multiple texture maps.\n"
+             "\tGet OpenGL 1.1.\n",
+             progname);
+      exit (1);
+#endif /* !HAVE_GLBINDTEXTURE */
+    }
+
+  lc->box = glGenLists(16);
+  lc->star1 = lc->box+1;
+  lc->star2 = lc->box+2;
+  lc->tetra_une = lc->box+3;
+  lc->tetra_usw = lc->box+4;
+  lc->tetra_dwn = lc->box+5;
+  lc->tetra_dse = lc->box+6;
+  lc->tetra_mid = lc->box+7;
+  lc->lid_0 = lc->box+8;
+  lc->lid_1 = lc->box+9;
+  lc->lid_2 = lc->box+10;
+  lc->lid_3 = lc->box+11;
+  lc->lid_4 = lc->box+12;
+  lc->taser_base = lc->box+13;
+  lc->taser_lifter = lc->box+14;
+  lc->taser_slider = lc->box+15;
+
+  box(mi, wire);
+  star(mi, True, wire);
+  star(mi, False, wire);
+  tetra(mi, wire);
+  lid(mi, wire);
+  taser(mi, wire);
+}
+
+
+# ifdef HAVE_MESA_GL
+
+# include <signal.h>
+
+static RETSIGTYPE
+lament_signal_kludge (int sig)
+{
+  signal (sig, SIG_DFL);
+  fprintf (stderr,
+           "\n"
+           "%s: dying with signal %d (%s).\n"
+           "\n"
+           "\tThis is almost certainly a bug in the MesaGL library,\n"
+           "\tespecially if the stack trace in the core file mentions\n"
+           "\t`lambda_textured_triangle' or `render_quad'.\n"
+           "\n"
+           "\tI encourage you to report this to the Mesa maintainers\n"
+           "\tat <http://www.mesa3d.org/>.  I reported this bug more\n"
+           "\tthan a year ago, and it is trivially reproducible.\n"
+           "\tI do not know a workaround.\n"
+           "\n",
+           progname,
+           sig,
+           (sig == SIGILL ? "SIGILL" :
+            sig == SIGFPE ? "SIGFPE" :
+            sig == SIGBUS ? "SIGBUS" :
+            sig == SIGSEGV ? "SIGSEGV" : "???"));
+  fflush (stderr);
+  kill (getpid (), sig);
+}
+
+static void
+handle_signals (void)
+{
+  signal (SIGILL,  lament_signal_kludge);
+  signal (SIGFPE,  lament_signal_kludge);
+  signal (SIGBUS,  lament_signal_kludge);
+  signal (SIGSEGV, lament_signal_kludge);
+}
+# endif /* HAVE_MESA_GL */
+
+
+void
+init_lament(ModeInfo *mi)
+{
+  lament_configuration *lc;
+  if (!lcs)
+    {
+      lcs = (lament_configuration *)
+       calloc(MI_NUM_SCREENS(mi), sizeof (lament_configuration));
+      if (!lcs)
+       {
+         fprintf(stderr, "%s: out of memory\n", progname);
+         exit(1);
+       }
+    }
+
+  lc = &lcs[MI_SCREEN(mi)];
+
+  lc->rotx = frand(1.0) * RANDSIGN();
+  lc->roty = frand(1.0) * RANDSIGN();
+  lc->rotz = frand(1.0) * RANDSIGN();
+
+  /* bell curve from 0-1.5 degrees, avg 0.75 */
+  lc->dx = (frand(1) + frand(1) + frand(1)) / (360*2);
+  lc->dy = (frand(1) + frand(1) + frand(1)) / (360*2);
+  lc->dz = (frand(1) + frand(1) + frand(1)) / (360*2);
+
+  lc->d_max = lc->dx * 2;
+
+  lc->ddx = 0.00006 + frand(0.00003);
+  lc->ddy = 0.00006 + frand(0.00003);
+  lc->ddz = 0.00006 + frand(0.00003);
+
+  lc->ddx = 0.00001;
+  lc->ddy = 0.00001;
+  lc->ddz = 0.00001;
+
+  lc->type = LAMENT_BOX;
+  lc->anim_pause = 300 + (random() % 100);
+
+  if ((lc->glx_context = init_GL(mi)) != NULL)
+    {
+      reshape(MI_WIDTH(mi), MI_HEIGHT(mi));
+      gl_init(mi);
+    }
+
+# ifdef HAVE_MESA_GL
+  handle_signals ();
+# endif /* HAVE_MESA_GL */
+}
+
+
+void
+draw_lament(ModeInfo *mi)
+{
+  static int tick = 0;
+  lament_configuration *lc = &lcs[MI_SCREEN(mi)];
+  Display *dpy = MI_DISPLAY(mi);
+  Window window = MI_WINDOW(mi);
+
+  if (!lc->glx_context)
+    return;
+
+  glDrawBuffer(GL_BACK);
+
+  glXMakeCurrent(dpy, window, *(lc->glx_context));
+  draw(mi);
+  glFinish();
+  glXSwapBuffers(dpy, window);
+
+  if (lc->type != LAMENT_LID_ZOOM)
+    {
+      rotate(&lc->rotx, &lc->dx, &lc->ddx, lc->d_max);
+      rotate(&lc->roty, &lc->dy, &lc->ddy, lc->d_max);
+      rotate(&lc->rotz, &lc->dz, &lc->ddz, lc->d_max);
+    }
+
+  if (lc->anim_pause)
+    lc->anim_pause--;
+  else
+    animate(mi);
+
+  if (++tick > 500)
+    {
+      tick = 0;
+      reshape(MI_WIDTH(mi), MI_HEIGHT(mi));
+    }
+}
+
+#endif /* USE_GL */
diff --git a/hacks/glx/lament.man b/hacks/glx/lament.man
new file mode 100644 (file)
index 0000000..52cb6b4
--- /dev/null
@@ -0,0 +1,60 @@
+.TH XScreenSaver 1 "25-Jul-98" "X Version 11"
+.SH NAME
+lament - animates the Lament Configuration
+.SH SYNOPSIS
+.B lament
+[\-display \fIhost:display.screen\fP] [\-window] [\-root] [\-install] [\-visual \fIvisual\fP] [\-texture] [\-no\-texture] [\-wireframe]
+.SH DESCRIPTION
+The \fIlament\fP program draws an animation of a particular puzzle box
+repeatedly solving itself.
+.SH OPTIONS
+.I lament
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window.  This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP\fP
+Specify which visual to use.  Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-texture
+Use texture maps.  This is the default.
+.TP 8
+.B \-no\-texture
+Do not use texture maps.  This is boring and wrong.
+.TP 8
+.B \-wireframe
+Only draw outlines.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH BUGS
+This hack is glacially slow on machines lacking hardware texture support.
+
+Occasionally opens doors, admitting theologians of the Order of the Gash.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 1998 by Jamie Zawinski.  Permission to use, copy, modify, 
+distribute, and sell this software 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.  No representations are made about the 
+suitability of this software for any purpose.  It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Jamie Zawinski <jwz@jwz.org>, 25-Jul-98.
diff --git a/hacks/glx/moebius.c b/hacks/glx/moebius.c
new file mode 100644 (file)
index 0000000..66560fc
--- /dev/null
@@ -0,0 +1,709 @@
+/* -*- Mode: C; tab-width: 4 -*- */
+/* moebius --- Moebius Strip II, an Escher-like GL scene with ants. */
+
+#if !defined( lint ) && !defined( SABER )
+static const char sccsid[] = "@(#)moebius.c    4.08 97/01/04 xlockmore";
+
+#endif
+
+#undef DEBUG_LISTS
+
+/*-
+ * 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.
+ *
+ * This file is provided AS IS with no warranties of any kind.  The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof.  In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * The RotateAroundU() routine was adapted from the book
+ *    "Computer Graphics Principles and Practice 
+ *     Foley - vanDam - Feiner - Hughes
+ *     Second Edition" Pag. 227, exercise 5.15.
+ * 
+ * This mode shows some interesting scenes that are impossible OR very
+ * wierd to build in the real universe. Much of the scenes are inspirated
+ * on Mauritz Cornelis Escher's works which derivated the mode's name.
+ * M.C. Escher (1898-1972) was a dutch artist and many people prefer to
+ * say he was a mathematician.
+ *
+ * Thanks goes to Brian Paul for making it possible and inexpensive to use 
+ * OpenGL at home.
+ *
+ * Since I'm not a native English speaker, my apologies for any grammatical
+ * mistake.
+ *
+ * My e-mail address is
+ * m-vianna@usa.net
+ *
+ * Marcelo F. Vianna (Jun-01-1997)
+ *
+ * Revision History:
+ * 01-Jan-98: Mode separated from escher and renamed
+ * 08-Jun-97: New scene implemented: "Impossible Cage" based in a M.C. Escher's
+ *            painting with the same name (quite similar). The first GL mode
+ *            to use texture mapping.
+ *            The "Impossible Cage" scene doesn't use DEPTH BUFFER, the 
+ *            wood planks are drawn consistently using GL_CULL_FACE, and
+ *            the painter's algorithm is used to sort the planks.
+ *            Marcelo F. Vianna.
+ * 07-Jun-97: Speed ups in Moebius Strip using GL_CULL_FACE.
+ *            Marcelo F. Vianna.
+ * 03-Jun-97: Initial Release (Only one scene: "Moebius Strip")
+ *            The Moebius Strip scene was inspirated in a M.C. Escher's
+ *            painting named Moebius Strip II in wich ants walk across a
+ *            Moebius Strip path, sometimes meeting each other and sometimes
+ *            being in "opposite faces" (note that the moebius strip has
+ *            only one face and one edge).
+ *            Marcelo F. Vianna.
+ *
+ */
+
+/*-
+ * Texture mapping is only available on RGBA contexts, Mono and color index
+ * visuals DO NOT support texture mapping in OpenGL.
+ *
+ * BUT Mesa do implements RGBA contexts in pseudo color visuals, so texture
+ * mapping shuld work on PseudoColor, DirectColor, TrueColor using Mesa. Mono
+ * is not officially supported for both OpenGL and Mesa, but seems to not crash
+ * Mesa.
+ *
+ * In real OpenGL, PseudoColor DO NOT support texture map (as far as I know).
+ */
+
+#include <X11/Intrinsic.h>
+
+#ifdef STANDALONE
+# define PROGCLASS                     "Moebius"
+# define HACK_INIT                     init_moebius
+# define HACK_DRAW                     draw_moebius
+# define moebius_opts                  xlockmore_opts
+# define DEFAULTS                      "*cycles:               1       \n"                     \
+                                                       "*delay:                1000    \n"                     \
+                                                       "*wireframe:    False   \n"
+# include "xlockmore.h"                /* from the xscreensaver distribution */
+#else /* !STANDALONE */
+# include "xlock.h"            /* from the xlockmore distribution */
+
+#endif /* !STANDALONE */
+
+#ifdef USE_GL
+
+
+#include <GL/glu.h>
+#include "e_textures.h"
+
+#define DEF_SOLIDMOEBIUS  "False"
+#define DEF_NOANTS  "False"
+
+static int  solidmoebius;
+static int  noants;
+
+static XrmOptionDescRec opts[] =
+{
+  {"-solidmoebius", ".moebius.solidmoebius", XrmoptionNoArg, (caddr_t) "on"},
+ {"+solidmoebius", ".moebius.solidmoebius", XrmoptionNoArg, (caddr_t) "off"},
+       {"-noants", ".moebius.noants", XrmoptionNoArg, (caddr_t) "on"},
+       {"+noants", ".moebius.noants", XrmoptionNoArg, (caddr_t) "off"}
+};
+static argtype vars[] =
+{
+       {(caddr_t *) & solidmoebius, "solidmoebius", "Solidmoebius", DEF_SOLIDMOEBIUS, t_Bool},
+       {(caddr_t *) & noants, "noants", "Noants", DEF_NOANTS, t_Bool}
+};
+static OptionStruct desc[] =
+{
+       {"-/+solidmoebius", "select between a SOLID or a NET Moebius Strip"},
+       {"-/+noants", "turn on/off walking ants"}
+};
+
+ModeSpecOpt moebius_opts =
+{sizeof opts / sizeof opts[0], opts, sizeof vars / sizeof vars[0], vars, desc};
+
+#ifdef USE_MODULES
+ModStruct   moebius_description =
+{"moebius", "init_moebius", "draw_moebius", "release_moebius",
+ "draw_moebius", "change_moebius", NULL, &moebius_opts,
+ 1000, 1, 1, 1, 4, 1.0, "",
+ "Shows Moebius Strip II, an Escher-like GL scene with ants", 0, NULL};
+
+#endif
+
+#define Scale4Window               0.3
+#define Scale4Iconic               0.4
+
+#define sqr(A)                     ((A)*(A))
+
+#ifndef Pi
+#define Pi                         M_PI
+#endif
+
+/*************************************************************************/
+
+typedef struct {
+       GLint       WindH, WindW;
+       GLfloat     step;
+       GLfloat     ant_position;
+       int         AreObjectsDefined[2];
+       GLXContext *glx_context;
+} moebiusstruct;
+
+static float front_shininess[] =
+{60.0};
+static float front_specular[] =
+{0.7, 0.7, 0.7, 1.0};
+static float ambient[] =
+{0.0, 0.0, 0.0, 1.0};
+static float diffuse[] =
+{1.0, 1.0, 1.0, 1.0};
+static float position0[] =
+{1.0, 1.0, 1.0, 0.0};
+static float position1[] =
+{-1.0, -1.0, 1.0, 0.0};
+static float lmodel_ambient[] =
+{0.5, 0.5, 0.5, 1.0};
+static float lmodel_twoside[] =
+{GL_TRUE};
+
+static float MaterialRed[] =
+{0.7, 0.0, 0.0, 1.0};
+static float MaterialGreen[] =
+{0.1, 0.5, 0.2, 1.0};
+static float MaterialBlue[] =
+{0.0, 0.0, 0.7, 1.0};
+static float MaterialCyan[] =
+{0.2, 0.5, 0.7, 1.0};
+static float MaterialYellow[] =
+{0.7, 0.7, 0.0, 1.0};
+static float MaterialMagenta[] =
+{0.6, 0.2, 0.5, 1.0};
+static float MaterialWhite[] =
+{0.7, 0.7, 0.7, 1.0};
+static float MaterialGray[] =
+{0.2, 0.2, 0.2, 1.0};
+static float MaterialGray5[] =
+{0.5, 0.5, 0.5, 1.0};
+static float MaterialGray6[] =
+{0.6, 0.6, 0.6, 1.0};
+static float MaterialGray8[] =
+{0.8, 0.8, 0.8, 1.0};
+
+static moebiusstruct *moebius = NULL;
+static GLuint objects;
+
+#define NUM_SCENES      2
+
+#define ObjMoebiusStrip 0
+#define ObjAntBody      1
+
+static void
+mySphere(float radius)
+{
+       GLUquadricObj *quadObj;
+
+       quadObj = gluNewQuadric();
+       gluQuadricDrawStyle(quadObj, (GLenum) GLU_FILL);
+       gluSphere(quadObj, radius, 16, 16);
+       gluDeleteQuadric(quadObj);
+}
+
+static void
+myCone(float radius)
+{
+       GLUquadricObj *quadObj;
+
+       quadObj = gluNewQuadric();
+       gluQuadricDrawStyle(quadObj, (GLenum) GLU_FILL);
+       gluCylinder(quadObj, radius, 0, radius * 3, 8, 1);
+       gluDeleteQuadric(quadObj);
+}
+
+static void
+draw_moebius_ant(moebiusstruct * mp, float *Material, int mono)
+{
+       static float ant_step = 0;
+       float       cos1 = cos(ant_step);
+       float       cos2 = cos(ant_step + 2 * Pi / 3);
+       float       cos3 = cos(ant_step + 4 * Pi / 3);
+       float       sin1 = sin(ant_step);
+       float       sin2 = sin(ant_step + 2 * Pi / 3);
+       float       sin3 = sin(ant_step + 4 * Pi / 3);
+
+       if (mono)
+               glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialGray5);
+       else
+               glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, Material);
+       if (!mp->AreObjectsDefined[ObjAntBody]) {
+               glNewList(objects + ObjAntBody, GL_COMPILE_AND_EXECUTE);
+               glEnable(GL_CULL_FACE);
+               glPushMatrix();
+               glScalef(1, 1.3, 1);
+               mySphere(0.18);
+               glScalef(1, 1 / 1.3, 1);
+               glTranslatef(0.00, 0.30, 0.00);
+               mySphere(0.2);
+
+               glTranslatef(-0.05, 0.17, 0.05);
+               glRotatef(-90, 1, 0, 0);
+               glRotatef(-25, 0, 1, 0);
+               myCone(0.05);
+               glTranslatef(0.00, 0.10, 0.00);
+               myCone(0.05);
+               glRotatef(25, 0, 1, 0);
+               glRotatef(90, 1, 0, 0);
+
+               glScalef(1, 1.3, 1);
+               glTranslatef(0.15, -0.65, 0.05);
+               mySphere(0.25);
+               glScalef(1, 1 / 1.3, 1);
+               glPopMatrix();
+               glDisable(GL_CULL_FACE);
+               glEndList();
+               mp->AreObjectsDefined[ObjAntBody] = 1;
+#ifdef DEBUG_LISTS
+               (void) printf("Ant drawn SLOWLY\n");
+#endif
+       } else {
+               glCallList(objects + ObjAntBody);
+#ifdef DEBUG_LISTS
+               (void) printf("Ant drawn quickly\n");
+#endif
+       }
+
+       glDisable(GL_LIGHTING);
+       /* ANTENNAS */
+       glBegin(GL_LINES);
+       if (mono)
+               glColor3fv(MaterialGray5);
+       else
+               glColor3fv(Material);
+       glVertex3f(0.00, 0.30, 0.00);
+       glColor3fv(MaterialGray);
+       glVertex3f(0.40, 0.70, 0.40);
+       if (mono)
+               glColor3fv(MaterialGray5);
+       else
+               glColor3fv(Material);
+       glVertex3f(0.00, 0.30, 0.00);
+       glColor3fv(MaterialGray);
+       glVertex3f(0.40, 0.70, -0.40);
+       glEnd();
+       glBegin(GL_POINTS);
+       if (mono)
+               glColor3fv(MaterialGray6);
+       else
+               glColor3fv(MaterialRed);
+       glVertex3f(0.40, 0.70, 0.40);
+       glVertex3f(0.40, 0.70, -0.40);
+       glEnd();
+
+       /* LEFT-FRONT ARM */
+       glBegin(GL_LINE_STRIP);
+       if (mono)
+               glColor3fv(MaterialGray5);
+       else
+               glColor3fv(Material);
+       glVertex3f(0.00, 0.05, 0.18);
+       glVertex3f(0.35 + 0.05 * cos1, 0.15, 0.25);
+       glColor3fv(MaterialGray);
+       glVertex3f(-0.20 + 0.05 * cos1, 0.25 + 0.1 * sin1, 0.45);
+       glEnd();
+
+       /* LEFT-CENTER ARM */
+       glBegin(GL_LINE_STRIP);
+       if (mono)
+               glColor3fv(MaterialGray5);
+       else
+               glColor3fv(Material);
+       glVertex3f(0.00, 0.00, 0.18);
+       glVertex3f(0.35 + 0.05 * cos2, 0.00, 0.25);
+       glColor3fv(MaterialGray);
+       glVertex3f(-0.20 + 0.05 * cos2, 0.00 + 0.1 * sin2, 0.45);
+       glEnd();
+
+       /* LEFT-BACK ARM */
+       glBegin(GL_LINE_STRIP);
+       if (mono)
+               glColor3fv(MaterialGray5);
+       else
+               glColor3fv(Material);
+       glVertex3f(0.00, -0.05, 0.18);
+       glVertex3f(0.35 + 0.05 * cos3, -0.15, 0.25);
+       glColor3fv(MaterialGray);
+       glVertex3f(-0.20 + 0.05 * cos3, -0.25 + 0.1 * sin3, 0.45);
+       glEnd();
+
+       /* RIGHT-FRONT ARM */
+       glBegin(GL_LINE_STRIP);
+       if (mono)
+               glColor3fv(MaterialGray5);
+       else
+               glColor3fv(Material);
+       glVertex3f(0.00, 0.05, -0.18);
+       glVertex3f(0.35 - 0.05 * sin1, 0.15, -0.25);
+       glColor3fv(MaterialGray);
+       glVertex3f(-0.20 - 0.05 * sin1, 0.25 + 0.1 * cos1, -0.45);
+       glEnd();
+
+       /* RIGHT-CENTER ARM */
+       glBegin(GL_LINE_STRIP);
+       if (mono)
+               glColor3fv(MaterialGray5);
+       else
+               glColor3fv(Material);
+       glVertex3f(0.00, 0.00, -0.18);
+       glVertex3f(0.35 - 0.05 * sin2, 0.00, -0.25);
+       glColor3fv(MaterialGray);
+       glVertex3f(-0.20 - 0.05 * sin2, 0.00 + 0.1 * cos2, -0.45);
+       glEnd();
+
+       /* RIGHT-BACK ARM */
+       glBegin(GL_LINE_STRIP);
+       if (mono)
+               glColor3fv(MaterialGray5);
+       else
+               glColor3fv(Material);
+       glVertex3f(0.00, -0.05, -0.18);
+       glVertex3f(0.35 - 0.05 * sin3, -0.15, -0.25);
+       glColor3fv(MaterialGray);
+       glVertex3f(-0.20 - 0.05 * sin3, -0.25 + 0.1 * cos3, -0.45);
+       glEnd();
+
+       glBegin(GL_POINTS);
+       if (mono)
+               glColor3fv(MaterialGray8);
+       else
+               glColor3fv(MaterialMagenta);
+       glVertex3f(-0.20 + 0.05 * cos1, 0.25 + 0.1 * sin1, 0.45);
+       glVertex3f(-0.20 + 0.05 * cos2, 0.00 + 0.1 * sin2, 0.45);
+       glVertex3f(-0.20 + 0.05 * cos3, -0.25 + 0.1 * sin3, 0.45);
+       glVertex3f(-0.20 - 0.05 * sin1, 0.25 + 0.1 * cos1, -0.45);
+       glVertex3f(-0.20 - 0.05 * sin2, 0.00 + 0.1 * cos2, -0.45);
+       glVertex3f(-0.20 - 0.05 * sin3, -0.25 + 0.1 * cos3, -0.45);
+       glEnd();
+
+       glEnable(GL_LIGHTING);
+
+       ant_step += 0.3;
+}
+
+static void
+RotateAaroundU(float Ax, float Ay, float Az,
+              float Ux, float Uy, float Uz,
+              float *Cx, float *Cy, float *Cz,
+              float Theta)
+{
+       float       cosO = cos(Theta);
+       float       sinO = sin(Theta);
+       float       one_cosO = 1 - cosO;
+       float       Ux2 = sqr(Ux);
+       float       Uy2 = sqr(Uy);
+       float       Uz2 = sqr(Uz);
+       float       UxUy = Ux * Uy;
+       float       UxUz = Ux * Uz;
+       float       UyUz = Uy * Uz;
+
+       *Cx = (Ux2 + cosO * (1 - Ux2)) * Ax + (UxUy * one_cosO - Uz * sinO) * Ay + (UxUz * one_cosO + Uy * sinO) * Az;
+       *Cy = (UxUy * one_cosO + Uz * sinO) * Ax + (Uy2 + cosO * (1 - Uy2)) * Ay + (UyUz * one_cosO - Ux * sinO) * Az;
+       *Cz = (UxUz * one_cosO - Uy * sinO) * Ax + (UyUz * one_cosO + Ux * sinO) * Ay + (Uz2 + cosO * (1 - Uz2)) * Az;
+}
+
+#define MoebiusDivisions 40
+#define MoebiusTransversals 4
+static void
+draw_moebius_strip(ModeInfo * mi)
+{
+       GLfloat     Phi, Theta;
+       GLfloat     cPhi, sPhi;
+       moebiusstruct *mp = &moebius[MI_SCREEN(mi)];
+       int         i, j;
+       int         mono = MI_IS_MONO(mi);
+
+       float       Cx, Cy, Cz;
+
+       if (!mp->AreObjectsDefined[ObjMoebiusStrip]) {
+               glNewList(objects + ObjMoebiusStrip, GL_COMPILE_AND_EXECUTE);
+
+               if (solidmoebius) {
+                       glBegin(GL_QUAD_STRIP);
+                       Phi = 0;
+                       i = 0;
+                       while (i < (MoebiusDivisions * 2 + 1)) {
+                               Theta = Phi / 2;
+                               cPhi = cos(Phi);
+                               sPhi = sin(Phi);
+
+                               i++;
+                               if (mono)
+                                       glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialWhite);
+                               else if (i % 2)
+                                       glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialRed);
+                               else
+                                       glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialGray);
+
+                               RotateAaroundU(cPhi, sPhi, 0, -sPhi, cPhi, 0, &Cx, &Cy, &Cz, Theta);
+                               glNormal3f(Cx, Cy, Cz);
+                               RotateAaroundU(0, 0, 1, -sPhi, cPhi, 0, &Cx, &Cy, &Cz, Theta);
+                               glVertex3f(cPhi * 3 + Cx, sPhi * 3 + Cy, +Cz);
+                               glVertex3f(cPhi * 3 - Cx, sPhi * 3 - Cy, -Cz);
+
+                               Phi += Pi / MoebiusDivisions;
+                       }
+                       glEnd();
+               } else {
+                       for (j = -MoebiusTransversals; j < MoebiusTransversals; j++) {
+                               glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
+                               glBegin(GL_QUAD_STRIP);
+                               Phi = 0;
+                               i = 0;
+                               while (i < (MoebiusDivisions * 2 + 1)) {
+                                       Theta = Phi / 2;
+                                       cPhi = cos(Phi);
+                                       sPhi = sin(Phi);
+
+                                       RotateAaroundU(cPhi, sPhi, 0, -sPhi, cPhi, 0, &Cx, &Cy, &Cz, Theta);
+                                       glNormal3f(Cx, Cy, Cz);
+                                       RotateAaroundU(0, 0, 1, -sPhi, cPhi, 0, &Cx, &Cy, &Cz, Theta);
+                                       j++;
+                                       if (j == MoebiusTransversals || mono)
+                                               glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialWhite);
+                                       else if (i % 2)
+                                               glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialRed);
+                                       else
+                                               glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialGray);
+                                       glVertex3f(cPhi * 3 + Cx / MoebiusTransversals * j, sPhi * 3 + Cy / MoebiusTransversals * j, +Cz / MoebiusTransversals * j);
+                                       j--;
+                                       if (j == -MoebiusTransversals || mono)
+                                               glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialWhite);
+                                       else if (i % 2)
+                                               glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialRed);
+                                       else
+                                               glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialGray);
+                                       glVertex3f(cPhi * 3 + Cx / MoebiusTransversals * j, sPhi * 3 + Cy / MoebiusTransversals * j, +Cz / MoebiusTransversals * j);
+
+                                       Phi += Pi / MoebiusDivisions;
+                                       i++;
+                               }
+                               glEnd();
+                       }
+                       glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
+               }
+
+               glEndList();
+               mp->AreObjectsDefined[ObjMoebiusStrip] = 1;
+#ifdef DEBUG_LISTS
+               (void) printf("Strip drawn SLOWLY\n");
+#endif
+       } else {
+               glCallList(objects + ObjMoebiusStrip);
+#ifdef DEBUG_LISTS
+               (void) printf("Strip drawn quickly\n");
+#endif
+       }
+
+       if (!noants) {
+               /* DRAW BLUE ANT */
+               glPushMatrix();
+               glRotatef(mp->ant_position + 180, 0, 0, 1);
+               glTranslatef(3, 0, 0);
+               glRotatef(mp->ant_position / 2 + 90, 0, 1, 0);
+               glTranslatef(0.28, 0, -0.45);
+               draw_moebius_ant(mp, MaterialYellow, mono);
+               glPopMatrix();
+
+               /* DRAW YELLOW ANT */
+               glPushMatrix();
+               glRotatef(mp->ant_position, 0, 0, 1);
+               glTranslatef(3, 0, 0);
+               glRotatef(mp->ant_position / 2, 0, 1, 0);
+               glTranslatef(0.28, 0, -0.45);
+               draw_moebius_ant(mp, MaterialBlue, mono);
+               glPopMatrix();
+
+               /* DRAW GREEN ANT */
+               glPushMatrix();
+               glRotatef(-mp->ant_position, 0, 0, 1);
+               glTranslatef(3, 0, 0);
+               glRotatef(-mp->ant_position / 2, 0, 1, 0);
+               glTranslatef(0.28, 0, 0.45);
+               glRotatef(180, 1, 0, 0);
+               draw_moebius_ant(mp, MaterialGreen, mono);
+               glPopMatrix();
+
+               /* DRAW CYAN ANT */
+               glPushMatrix();
+               glRotatef(-mp->ant_position + 180, 0, 0, 1);
+               glTranslatef(3, 0, 0);
+               glRotatef(-mp->ant_position / 2 + 90, 0, 1, 0);
+               glTranslatef(0.28, 0, 0.45);
+               glRotatef(180, 1, 0, 0);
+               draw_moebius_ant(mp, MaterialCyan, mono);
+               glPopMatrix();
+       }
+       mp->ant_position += 1;
+}
+#undef MoebiusDivisions
+#undef MoebiusTransversals
+
+static void
+reshape(ModeInfo * mi, int width, int height)
+{
+       moebiusstruct *mp = &moebius[MI_SCREEN(mi)];
+
+       glViewport(0, 0, mp->WindW = (GLint) width, mp->WindH = (GLint) height);
+       glMatrixMode(GL_PROJECTION);
+       glLoadIdentity();
+       glFrustum(-1.0, 1.0, -1.0, 1.0, 5.0, 15.0);
+       glMatrixMode(GL_MODELVIEW);
+       if (width >= 1024) {
+               glLineWidth(3);
+               glPointSize(3);
+       } else if (width >= 512) {
+               glLineWidth(2);
+               glPointSize(2);
+       } else {
+               glLineWidth(1);
+               glPointSize(1);
+       }
+       mp->AreObjectsDefined[ObjMoebiusStrip] = 0;
+       mp->AreObjectsDefined[ObjAntBody] = 0;
+}
+
+static void
+pinit(void)
+{
+       glClearDepth(1.0);
+       glClearColor(0.0, 0.0, 0.0, 1.0);
+
+       glLightfv(GL_LIGHT0, GL_AMBIENT, ambient);
+       glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse);
+       glLightfv(GL_LIGHT0, GL_POSITION, position0);
+       glLightfv(GL_LIGHT1, GL_AMBIENT, ambient);
+       glLightfv(GL_LIGHT1, GL_DIFFUSE, diffuse);
+       glLightfv(GL_LIGHT1, GL_POSITION, position1);
+       glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient);
+       glLightModelfv(GL_LIGHT_MODEL_TWO_SIDE, lmodel_twoside);
+       glEnable(GL_LIGHTING);
+       glEnable(GL_LIGHT0);
+       glEnable(GL_LIGHT1);
+       glEnable(GL_NORMALIZE);
+       glFrontFace(GL_CCW);
+       glCullFace(GL_BACK);
+
+       /* moebius */
+       glShadeModel(GL_SMOOTH);
+       glEnable(GL_DEPTH_TEST);
+       glDisable(GL_TEXTURE_2D);
+       glDisable(GL_CULL_FACE);
+
+       glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
+       gluBuild2DMipmaps(GL_TEXTURE_2D, 3, WoodTextureWidth, WoodTextureHeight,
+                         GL_RGB, GL_UNSIGNED_BYTE, WoodTextureData);
+       glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
+       glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+       glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+       glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+       glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+
+       glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, front_shininess);
+       glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, front_specular);
+}
+
+void
+init_moebius(ModeInfo * mi)
+{
+       int         screen = MI_SCREEN(mi);
+       moebiusstruct *mp;
+
+       if (moebius == NULL) {
+               if ((moebius = (moebiusstruct *) calloc(MI_NUM_SCREENS(mi),
+                                           sizeof (moebiusstruct))) == NULL)
+                       return;
+       }
+       mp = &moebius[screen];
+       mp->step = NRAND(90);
+       mp->ant_position = NRAND(90);
+
+       if ((mp->glx_context = init_GL(mi)) != NULL) {
+
+               reshape(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+               glDrawBuffer(GL_BACK);
+               if (!glIsList(objects))
+                       objects = glGenLists(3);
+               pinit();
+       } else {
+               MI_CLEARWINDOW(mi);
+       }
+}
+
+void
+draw_moebius(ModeInfo * mi)
+{
+       moebiusstruct *mp = &moebius[MI_SCREEN(mi)];
+
+       Display    *display = MI_DISPLAY(mi);
+       Window      window = MI_WINDOW(mi);
+
+       if (!mp->glx_context)
+               return;
+
+       glXMakeCurrent(display, window, *(mp->glx_context));
+
+       glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+       glPushMatrix();
+
+       glTranslatef(0.0, 0.0, -10.0);
+
+       if (!MI_IS_ICONIC(mi)) {
+               glScalef(Scale4Window * mp->WindH / mp->WindW, Scale4Window, Scale4Window);
+       } else {
+               glScalef(Scale4Iconic * mp->WindH / mp->WindW, Scale4Iconic, Scale4Iconic);
+       }
+
+       /* moebius */
+       glRotatef(mp->step * 100, 1, 0, 0);
+       glRotatef(mp->step * 95, 0, 1, 0);
+       glRotatef(mp->step * 90, 0, 0, 1);
+       draw_moebius_strip(mi);
+
+       glPopMatrix();
+
+       glFlush();
+
+       glXSwapBuffers(display, window);
+
+       mp->step += 0.025;
+}
+
+void
+change_moebius(ModeInfo * mi)
+{
+       moebiusstruct *mp = &moebius[MI_SCREEN(mi)];
+
+       if (!mp->glx_context)
+               return;
+
+       glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(mp->glx_context));
+       pinit();
+}
+
+void
+release_moebius(ModeInfo * mi)
+{
+       if (moebius != NULL) {
+               (void) free((void *) moebius);
+               moebius = NULL;
+       }
+       if (glIsList(objects)) {
+               glDeleteLists(objects, 3);
+       }
+       FreeAllGL(mi);
+}
+
+#endif
diff --git a/hacks/glx/morph3d.c b/hacks/glx/morph3d.c
new file mode 100644 (file)
index 0000000..d210016
--- /dev/null
@@ -0,0 +1,888 @@
+/* -*- Mode: C; tab-width: 4 -*- */
+/* morph3d --- Shows 3D morphing objects */
+
+#if !defined( lint ) && !defined( SABER )
+static const char sccsid[] = "@(#)morph3d.c    4.07 97/11/24 xlockmore";
+
+#endif
+
+#undef DEBUG_CULL_FACE
+
+/*-
+ * 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.
+ *
+ * This file is provided AS IS with no warranties of any kind.  The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof.  In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * The original code for this mode was written by Marcelo Fernandes Vianna 
+ * (me...) and was inspired on a WindowsNT(R)'s screen saver (Flower Box).
+ * It was written from scratch and it was not based on any other source code. 
+ * 
+ * Porting it to xlock (the final objective of this code since the moment I 
+ * decided to create it) was possible by comparing the original Mesa's gear 
+ * demo with it's ported version to xlock, so thanks for Danny Sung (look at
+ * gear.c) for his indirect help.
+ *
+ * Thanks goes also to Brian Paul for making it possible and inexpensive
+ * to use OpenGL at home.
+ *
+ * If you are interested in the original version of this program (not a xlock
+ * mode, please refer to the Mesa package (ftp iris.ssec.wisc.edu on /pub/Mesa)
+ *
+ * Since I'm not a native English speaker, my apologies for any grammatical
+ * mistake.
+ *
+ * My e-mail address is
+ * m-vianna@usa.net
+ *
+ * Marcelo F. Vianna (Feb-13-1997)
+ *
+ * Revision History:
+ * 27-Jul-97: Speed ups by Marcelo F. Vianna.
+ * 08-May-97: Speed ups by Marcelo F. Vianna.
+ *
+ */
+
+/*-
+ * PURIFY 3.0a on SunOS4 reports an unitialized memory read on each of
+ * the glCallList() functions below when using MesaGL 2.1.  This has
+ * been fixed in MesaGL 2.2 and later releases.
+ */
+
+/*-
+ * due to a Bug/feature in VMS X11/Intrinsic.h has to be placed before xlock.
+ * otherwise caddr_t is not defined correctly
+ */
+
+#include <X11/Intrinsic.h>
+
+#ifdef STANDALONE
+# define PROGCLASS             "Morph3d"
+# define HACK_INIT             init_morph3d
+# define HACK_DRAW             draw_morph3d
+# define morph3d_opts          xlockmore_opts
+# define DEFAULTS              "*delay: 1000 \n" \
+                               "*count: 0 \n"
+# include "xlockmore.h"                /* from the xscreensaver distribution */
+#else /* !STANDALONE */
+# include "xlock.h"            /* from the xlockmore distribution */
+#endif /* !STANDALONE */
+
+#ifdef USE_GL
+
+ModeSpecOpt morph3d_opts =
+{0, NULL, 0, NULL, NULL};
+
+#ifdef USE_MODULES
+ModStruct   morph3d_description =
+{"morph3d", "init_morph3d", "draw_morph3d", "release_morph3d",
+ "draw_morph3d", "change_morph3d", NULL, &morph3d_opts,
+ 1000, 0, 1, 1, 4, 1.0, "",
+ "Shows GL morphing polyhedra", 0, NULL};
+
+#endif
+
+#define Scale4Window               0.3
+#define Scale4Iconic               1.0
+
+#define VectMul(X1,Y1,Z1,X2,Y2,Z2) (Y1)*(Z2)-(Z1)*(Y2),(Z1)*(X2)-(X1)*(Z2),(X1)*(Y2)-(Y1)*(X2)
+#define sqr(A)                     ((A)*(A))
+
+/* Increasing this values produces better image quality, the price is speed. */
+#define tetradivisions             23
+#define cubedivisions              20
+#define octadivisions              21
+#define dodecadivisions            10
+#define icodivisions               15
+
+#define tetraangle                 109.47122063449069174
+#define cubeangle                  90.000000000000000000
+#define octaangle                  109.47122063449069174
+#define dodecaangle                63.434948822922009981
+#define icoangle                   41.810314895778596167
+
+#ifndef Pi
+#define Pi                         M_PI
+#endif
+#define SQRT2                      1.4142135623730951455
+#define SQRT3                      1.7320508075688771932
+#define SQRT5                      2.2360679774997898051
+#define SQRT6                      2.4494897427831778813
+#define SQRT15                     3.8729833462074170214
+#define cossec36_2                 0.8506508083520399322
+#define cos72                      0.3090169943749474241
+#define sin72                      0.9510565162951535721
+#define cos36                      0.8090169943749474241
+#define sin36                      0.5877852522924731292
+
+/*************************************************************************/
+
+typedef struct {
+       GLint       WindH, WindW;
+       GLfloat     step;
+       GLfloat     seno;
+       int         object;
+       int         edgedivisions;
+       int         VisibleSpikes;
+       void        (*draw_object) (ModeInfo * mi);
+       float       Magnitude;
+       float      *MaterialColor[20];
+       GLXContext *glx_context;
+} morph3dstruct;
+
+static float front_shininess[] =
+{60.0};
+static float front_specular[] =
+{0.7, 0.7, 0.7, 1.0};
+static float ambient[] =
+{0.0, 0.0, 0.0, 1.0};
+static float diffuse[] =
+{1.0, 1.0, 1.0, 1.0};
+static float position0[] =
+{1.0, 1.0, 1.0, 0.0};
+static float position1[] =
+{-1.0, -1.0, 1.0, 0.0};
+static float lmodel_ambient[] =
+{0.5, 0.5, 0.5, 1.0};
+static float lmodel_twoside[] =
+{GL_TRUE};
+
+static float MaterialRed[] =
+{0.7, 0.0, 0.0, 1.0};
+static float MaterialGreen[] =
+{0.1, 0.5, 0.2, 1.0};
+static float MaterialBlue[] =
+{0.0, 0.0, 0.7, 1.0};
+static float MaterialCyan[] =
+{0.2, 0.5, 0.7, 1.0};
+static float MaterialYellow[] =
+{0.7, 0.7, 0.0, 1.0};
+static float MaterialMagenta[] =
+{0.6, 0.2, 0.5, 1.0};
+static float MaterialWhite[] =
+{0.7, 0.7, 0.7, 1.0};
+static float MaterialGray[] =
+{0.5, 0.5, 0.5, 1.0};
+
+static morph3dstruct *morph3d = NULL;
+
+#define TRIANGLE(Edge, Amp, Divisions, Z, VS)                                                                    \
+{                                                                                                                \
+  GLfloat   Xf,Yf,Xa,Yb,Xf2,Yf2,Yf_2,Yb2,Yb_2;                                                                   \
+  GLfloat   Factor=0.0,Factor1,Factor2;                                                                          \
+  GLfloat   VertX,VertY,VertZ,NeiAX,NeiAY,NeiAZ,NeiBX,NeiBY,NeiBZ;                                               \
+  GLfloat   Ax,Ay;                                                                                               \
+  int       Ri,Ti;                                                                                               \
+  GLfloat   Vr=(Edge)*SQRT3/3;                                                                                   \
+  GLfloat   AmpVr2=(Amp)/sqr(Vr);                                                                                \
+  GLfloat   Zf=(Edge)*(Z);                                                                                       \
+                                                                                                                 \
+  Ax=(Edge)*(+0.5/(Divisions)), Ay=(Edge)*(-SQRT3/(2*Divisions));                                                \
+                                                                                                                 \
+  Yf=Vr+Ay; Yb=Yf+0.001;                                                                                         \
+  for (Ri=1; Ri<=(Divisions); Ri++) {                                                                            \
+    glBegin(GL_TRIANGLE_STRIP);                                                                                  \
+    Xf=(float)Ri*Ax; Xa=Xf+0.001;                                                                                \
+    Yf2=sqr(Yf); Yf_2=sqr(Yf-Ay);                                                                                \
+    Yb2=sqr(Yb); Yb_2=sqr(Yb-Ay);                                                                                \
+    for (Ti=0; Ti<Ri; Ti++) {                                                                                    \
+      Factor=1-(((Xf2=sqr(Xf))+Yf2)*AmpVr2);                                                                     \
+      Factor1=1-((sqr(Xa)+Yf2)*AmpVr2);                                                                          \
+      Factor2=1-((Xf2+Yb2)*AmpVr2);                                                                              \
+      VertX=Factor*Xf;        VertY=Factor*Yf;        VertZ=Factor*Zf;                                           \
+      NeiAX=Factor1*Xa-VertX; NeiAY=Factor1*Yf-VertY; NeiAZ=Factor1*Zf-VertZ;                                    \
+      NeiBX=Factor2*Xf-VertX; NeiBY=Factor2*Yb-VertY; NeiBZ=Factor2*Zf-VertZ;                                    \
+      glNormal3f(VectMul(NeiAX, NeiAY, NeiAZ, NeiBX, NeiBY, NeiBZ));                                             \
+      glVertex3f(VertX, VertY, VertZ);                                                                           \
+                                                                                                                 \
+      Xf-=Ax; Yf-=Ay; Xa-=Ax; Yb-=Ay;                                                                            \
+                                                                                                                 \
+      Factor=1-(((Xf2=sqr(Xf))+Yf_2)*AmpVr2);                                                                    \
+      Factor1=1-((sqr(Xa)+Yf_2)*AmpVr2);                                                                         \
+      Factor2=1-((Xf2+Yb_2)*AmpVr2);                                                                             \
+      VertX=Factor*Xf;        VertY=Factor*Yf;        VertZ=Factor*Zf;                                           \
+      NeiAX=Factor1*Xa-VertX; NeiAY=Factor1*Yf-VertY; NeiAZ=Factor1*Zf-VertZ;                                    \
+      NeiBX=Factor2*Xf-VertX; NeiBY=Factor2*Yb-VertY; NeiBZ=Factor2*Zf-VertZ;                                    \
+      glNormal3f(VectMul(NeiAX, NeiAY, NeiAZ, NeiBX, NeiBY, NeiBZ));                                             \
+      glVertex3f(VertX, VertY, VertZ);                                                                           \
+                                                                                                                 \
+      Xf-=Ax; Yf+=Ay; Xa-=Ax; Yb+=Ay;                                                                            \
+    }                                                                                                            \
+    Factor=1-(((Xf2=sqr(Xf))+(Yf2=sqr(Yf)))*AmpVr2);                                                             \
+    Factor1=1-((sqr(Xa)+Yf2)*AmpVr2);                                                                            \
+    Factor2=1-((Xf2+sqr(Yb))*AmpVr2);                                                                            \
+    VertX=Factor*Xf;        VertY=Factor*Yf;        VertZ=Factor*Zf;                                             \
+    NeiAX=Factor1*Xa-VertX; NeiAY=Factor1*Yf-VertY; NeiAZ=Factor1*Zf-VertZ;                                      \
+    NeiBX=Factor2*Xf-VertX; NeiBY=Factor2*Yb-VertY; NeiBZ=Factor2*Zf-VertZ;                                      \
+    glNormal3f(VectMul(NeiAX, NeiAY, NeiAZ, NeiBX, NeiBY, NeiBZ));                                               \
+    glVertex3f(VertX, VertY, VertZ);                                                                             \
+    Yf+=Ay; Yb+=Ay;                                                                                              \
+    glEnd();                                                                                                     \
+  }                                                                                                              \
+  VS=(Factor<0);                                                                                                 \
+}
+
+#define SQUARE(Edge, Amp, Divisions, Z, VS)                                                                      \
+{                                                                                                                \
+  int       Xi,Yi;                                                                                               \
+  GLfloat   Xf,Yf,Y,Xf2,Yf2,Y2,Xa,Xa2,Yb;                                                                        \
+  GLfloat   Factor=0.0,Factor1,Factor2;                                                                          \
+  GLfloat   VertX,VertY,VertZ,NeiAX,NeiAY,NeiAZ,NeiBX,NeiBY,NeiBZ;                                               \
+  GLfloat   Zf=(Edge)*(Z);                                                                                       \
+  GLfloat   AmpVr2=(Amp)/sqr((Edge)*SQRT2/2);                                                                    \
+                                                                                                                 \
+  for (Yi=0; Yi<(Divisions); Yi++) {                                                                             \
+    Yf=-((Edge)/2.0) + ((float)Yi)/(Divisions)*(Edge);                                                           \
+    Yf2=sqr(Yf);                                                                                                 \
+    Y=Yf+1.0/(Divisions)*(Edge);                                                                                 \
+    Y2=sqr(Y);                                                                                                   \
+    glBegin(GL_QUAD_STRIP);                                                                                      \
+    for (Xi=0; Xi<=(Divisions); Xi++) {                                                                          \
+      Xf=-((Edge)/2.0) + ((float)Xi)/(Divisions)*(Edge);                                                         \
+      Xf2=sqr(Xf);                                                                                               \
+                                                                                                                 \
+      Xa=Xf+0.001; Yb=Y+0.001;                                                                                   \
+      Factor=1-((Xf2+Y2)*AmpVr2);                                                                                \
+      Factor1=1-(((Xa2=sqr(Xa))+Y2)*AmpVr2);                                                                     \
+      Factor2=1-((Xf2+sqr(Yb))*AmpVr2);                                                                          \
+      VertX=Factor*Xf;        VertY=Factor*Y;         VertZ=Factor*Zf;                                           \
+      NeiAX=Factor1*Xa-VertX; NeiAY=Factor1*Y-VertY;  NeiAZ=Factor1*Zf-VertZ;                                    \
+      NeiBX=Factor2*Xf-VertX; NeiBY=Factor2*Yb-VertY; NeiBZ=Factor2*Zf-VertZ;                                    \
+      glNormal3f(VectMul(NeiAX, NeiAY, NeiAZ, NeiBX, NeiBY, NeiBZ));                                             \
+      glVertex3f(VertX, VertY, VertZ);                                                                           \
+                                                                                                                 \
+      Yb=Yf+0.001;                                                                                               \
+      Factor=1-((Xf2+Yf2)*AmpVr2);                                                                               \
+      Factor1=1-((Xa2+Yf2)*AmpVr2);                                                                              \
+      Factor2=1-((Xf2+sqr(Yb))*AmpVr2);                                                                          \
+      VertX=Factor*Xf;        VertY=Factor*Yf;        VertZ=Factor*Zf;                                           \
+      NeiAX=Factor1*Xa-VertX; NeiAY=Factor1*Yf-VertY; NeiAZ=Factor1*Zf-VertZ;                                    \
+      NeiBX=Factor2*Xf-VertX; NeiBY=Factor2*Yb-VertY; NeiBZ=Factor2*Zf-VertZ;                                    \
+      glNormal3f(VectMul(NeiAX, NeiAY, NeiAZ, NeiBX, NeiBY, NeiBZ));                                             \
+      glVertex3f(VertX, VertY, VertZ);                                                                           \
+    }                                                                                                            \
+    glEnd();                                                                                                     \
+  }                                                                                                              \
+  VS=(Factor<0);                                                                                                 \
+}
+
+#define PENTAGON(Edge, Amp, Divisions, Z, VS)                                                                    \
+{                                                                                                                \
+  int       Ri,Ti,Fi;                                                                                            \
+  GLfloat   Xf,Yf,Xa,Yb,Xf2,Yf2;                                                                                 \
+  GLfloat   Factor=0.0,Factor1,Factor2;                                                                          \
+  GLfloat   VertX,VertY,VertZ,NeiAX,NeiAY,NeiAZ,NeiBX,NeiBY,NeiBZ;                                               \
+  GLfloat   Zf=(Edge)*(Z);                                                                                       \
+  GLfloat   AmpVr2=(Amp)/sqr((Edge)*cossec36_2);                                                                 \
+                                                                                                                 \
+  static    GLfloat x[6],y[6];                                                                                   \
+  static    int arrayninit=1;                                                                                    \
+                                                                                                                 \
+  if (arrayninit) {                                                                                              \
+    for(Fi=0;Fi<6;Fi++) {                                                                                        \
+      x[Fi]=-cos( Fi*2*Pi/5 + Pi/10 )/(Divisions)*cossec36_2*(Edge);                                             \
+      y[Fi]=sin( Fi*2*Pi/5 + Pi/10 )/(Divisions)*cossec36_2*(Edge);                                              \
+    }                                                                                                            \
+    arrayninit=0;                                                                                                \
+  }                                                                                                              \
+                                                                                                                 \
+  for (Ri=1; Ri<=(Divisions); Ri++) {                                                                            \
+    for (Fi=0; Fi<5; Fi++) {                                                                                     \
+      glBegin(GL_TRIANGLE_STRIP);                                                                                \
+      for (Ti=0; Ti<Ri; Ti++) {                                                                                  \
+        Xf=(float)(Ri-Ti)*x[Fi] + (float)Ti*x[Fi+1];                                                             \
+        Yf=(float)(Ri-Ti)*y[Fi] + (float)Ti*y[Fi+1];                                                             \
+        Xa=Xf+0.001; Yb=Yf+0.001;                                                                                \
+       Factor=1-(((Xf2=sqr(Xf))+(Yf2=sqr(Yf)))*AmpVr2);                                                         \
+       Factor1=1-((sqr(Xa)+Yf2)*AmpVr2);                                                                        \
+       Factor2=1-((Xf2+sqr(Yb))*AmpVr2);                                                                        \
+        VertX=Factor*Xf;        VertY=Factor*Yf;        VertZ=Factor*Zf;                                         \
+        NeiAX=Factor1*Xa-VertX; NeiAY=Factor1*Yf-VertY; NeiAZ=Factor1*Zf-VertZ;                                  \
+        NeiBX=Factor2*Xf-VertX; NeiBY=Factor2*Yb-VertY; NeiBZ=Factor2*Zf-VertZ;                                  \
+        glNormal3f(VectMul(NeiAX, NeiAY, NeiAZ, NeiBX, NeiBY, NeiBZ));                                           \
+       glVertex3f(VertX, VertY, VertZ);                                                                         \
+                                                                                                                 \
+        Xf-=x[Fi]; Yf-=y[Fi]; Xa-=x[Fi]; Yb-=y[Fi];                                                              \
+                                                                                                                 \
+       Factor=1-(((Xf2=sqr(Xf))+(Yf2=sqr(Yf)))*AmpVr2);                                                         \
+       Factor1=1-((sqr(Xa)+Yf2)*AmpVr2);                                                                        \
+       Factor2=1-((Xf2+sqr(Yb))*AmpVr2);                                                                        \
+        VertX=Factor*Xf;        VertY=Factor*Yf;        VertZ=Factor*Zf;                                         \
+        NeiAX=Factor1*Xa-VertX; NeiAY=Factor1*Yf-VertY; NeiAZ=Factor1*Zf-VertZ;                                  \
+        NeiBX=Factor2*Xf-VertX; NeiBY=Factor2*Yb-VertY; NeiBZ=Factor2*Zf-VertZ;                                  \
+        glNormal3f(VectMul(NeiAX, NeiAY, NeiAZ, NeiBX, NeiBY, NeiBZ));                                           \
+       glVertex3f(VertX, VertY, VertZ);                                                                         \
+                                                                                                                 \
+      }                                                                                                          \
+      Xf=(float)Ri*x[Fi+1];                                                                                      \
+      Yf=(float)Ri*y[Fi+1];                                                                                      \
+      Xa=Xf+0.001; Yb=Yf+0.001;                                                                                  \
+      Factor=1-(((Xf2=sqr(Xf))+(Yf2=sqr(Yf)))*AmpVr2);                                                           \
+      Factor1=1-((sqr(Xa)+Yf2)*AmpVr2);                                                                          \
+      Factor2=1-((Xf2+sqr(Yb))*AmpVr2);                                                                          \
+      VertX=Factor*Xf;        VertY=Factor*Yf;        VertZ=Factor*Zf;                                           \
+      NeiAX=Factor1*Xa-VertX; NeiAY=Factor1*Yf-VertY; NeiAZ=Factor1*Zf-VertZ;                                    \
+      NeiBX=Factor2*Xf-VertX; NeiBY=Factor2*Yb-VertY; NeiBZ=Factor2*Zf-VertZ;                                    \
+      glNormal3f(VectMul(NeiAX, NeiAY, NeiAZ, NeiBX, NeiBY, NeiBZ));                                             \
+      glVertex3f(VertX, VertY, VertZ);                                                                           \
+      glEnd();                                                                                                   \
+    }                                                                                                            \
+  }                                                                                                              \
+  VS=(Factor<0);                                                                                             \
+}
+
+static void
+draw_tetra(ModeInfo * mi)
+{
+       GLuint      list;
+
+       morph3dstruct *mp = &morph3d[MI_SCREEN(mi)];
+
+       glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[0]);
+
+       list = glGenLists(1);
+       glNewList(list, GL_COMPILE_AND_EXECUTE);
+       TRIANGLE(2, mp->seno, mp->edgedivisions, 0.5 / SQRT6, mp->VisibleSpikes);
+       glEndList();
+
+       glPushMatrix();
+       glRotatef(180, 0, 0, 1);
+       glRotatef(-tetraangle, 1, 0, 0);
+       glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[1]);
+       glCallList(list);
+       glPopMatrix();
+       glPushMatrix();
+       glRotatef(180, 0, 1, 0);
+       glRotatef(-180 + tetraangle, 0.5, SQRT3 / 2, 0);
+       glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[2]);
+       glCallList(list);
+       glPopMatrix();
+       glRotatef(180, 0, 1, 0);
+       glRotatef(-180 + tetraangle, 0.5, -SQRT3 / 2, 0);
+       glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[3]);
+       glCallList(list);
+
+       glDeleteLists(list, 1);
+}
+
+static void
+draw_cube(ModeInfo * mi)
+{
+       GLuint      list;
+
+       morph3dstruct *mp = &morph3d[MI_SCREEN(mi)];
+
+
+       glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[0]);
+
+       list = glGenLists(1);
+       glNewList(list, GL_COMPILE_AND_EXECUTE);
+       SQUARE(2, mp->seno, mp->edgedivisions, 0.5, mp->VisibleSpikes)
+               glEndList();
+
+       glRotatef(cubeangle, 1, 0, 0);
+       glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[1]);
+       glCallList(list);
+       glRotatef(cubeangle, 1, 0, 0);
+       glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[2]);
+       glCallList(list);
+       glRotatef(cubeangle, 1, 0, 0);
+       glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[3]);
+       glCallList(list);
+       glRotatef(cubeangle, 0, 1, 0);
+       glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[4]);
+       glCallList(list);
+       glRotatef(2 * cubeangle, 0, 1, 0);
+       glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[5]);
+       glCallList(list);
+
+       glDeleteLists(list, 1);
+}
+
+static void
+draw_octa(ModeInfo * mi)
+{
+       GLuint      list;
+
+       morph3dstruct *mp = &morph3d[MI_SCREEN(mi)];
+
+       glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[0]);
+
+       list = glGenLists(1);
+       glNewList(list, GL_COMPILE_AND_EXECUTE);
+       TRIANGLE(2, mp->seno, mp->edgedivisions, 1 / SQRT6, mp->VisibleSpikes);
+       glEndList();
+
+       glPushMatrix();
+       glRotatef(180, 0, 0, 1);
+       glRotatef(-180 + octaangle, 1, 0, 0);
+       glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[1]);
+       glCallList(list);
+       glPopMatrix();
+       glPushMatrix();
+       glRotatef(180, 0, 1, 0);
+       glRotatef(-octaangle, 0.5, SQRT3 / 2, 0);
+       glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[2]);
+       glCallList(list);
+       glPopMatrix();
+       glPushMatrix();
+       glRotatef(180, 0, 1, 0);
+       glRotatef(-octaangle, 0.5, -SQRT3 / 2, 0);
+       glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[3]);
+       glCallList(list);
+       glPopMatrix();
+       glRotatef(180, 1, 0, 0);
+       glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[4]);
+       glCallList(list);
+       glPushMatrix();
+       glRotatef(180, 0, 0, 1);
+       glRotatef(-180 + octaangle, 1, 0, 0);
+       glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[5]);
+       glCallList(list);
+       glPopMatrix();
+       glPushMatrix();
+       glRotatef(180, 0, 1, 0);
+       glRotatef(-octaangle, 0.5, SQRT3 / 2, 0);
+       glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[6]);
+       glCallList(list);
+       glPopMatrix();
+       glRotatef(180, 0, 1, 0);
+       glRotatef(-octaangle, 0.5, -SQRT3 / 2, 0);
+       glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[7]);
+       glCallList(list);
+
+       glDeleteLists(list, 1);
+}
+
+static void
+draw_dodeca(ModeInfo * mi)
+{
+       GLuint      list;
+
+       morph3dstruct *mp = &morph3d[MI_SCREEN(mi)];
+
+#define TAU ((SQRT5+1)/2)
+
+       glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[0]);
+
+       list = glGenLists(1);
+       glNewList(list, GL_COMPILE_AND_EXECUTE);
+       PENTAGON(1, mp->seno, mp->edgedivisions, sqr(TAU) * sqrt((TAU + 2) / 5) / 2, mp->VisibleSpikes);
+       glEndList();
+
+       glPushMatrix();
+       glRotatef(180, 0, 0, 1);
+       glPushMatrix();
+       glRotatef(-dodecaangle, 1, 0, 0);
+       glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[1]);
+       glCallList(list);
+       glPopMatrix();
+       glPushMatrix();
+       glRotatef(-dodecaangle, cos72, sin72, 0);
+       glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[2]);
+       glCallList(list);
+       glPopMatrix();
+       glPushMatrix();
+       glRotatef(-dodecaangle, cos72, -sin72, 0);
+       glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[3]);
+       glCallList(list);
+       glPopMatrix();
+       glPushMatrix();
+       glRotatef(dodecaangle, cos36, -sin36, 0);
+       glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[4]);
+       glCallList(list);
+       glPopMatrix();
+       glRotatef(dodecaangle, cos36, sin36, 0);
+       glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[5]);
+       glCallList(list);
+       glPopMatrix();
+       glRotatef(180, 1, 0, 0);
+       glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[6]);
+       glCallList(list);
+       glRotatef(180, 0, 0, 1);
+       glPushMatrix();
+       glRotatef(-dodecaangle, 1, 0, 0);
+       glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[7]);
+       glCallList(list);
+       glPopMatrix();
+       glPushMatrix();
+       glRotatef(-dodecaangle, cos72, sin72, 0);
+       glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[8]);
+       glCallList(list);
+       glPopMatrix();
+       glPushMatrix();
+       glRotatef(-dodecaangle, cos72, -sin72, 0);
+       glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[9]);
+       glCallList(list);
+       glPopMatrix();
+       glPushMatrix();
+       glRotatef(dodecaangle, cos36, -sin36, 0);
+       glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[10]);
+       glCallList(list);
+       glPopMatrix();
+       glRotatef(dodecaangle, cos36, sin36, 0);
+       glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[11]);
+       glCallList(list);
+
+       glDeleteLists(list, 1);
+}
+
+static void
+draw_icosa(ModeInfo * mi)
+{
+       GLuint      list;
+
+       morph3dstruct *mp = &morph3d[MI_SCREEN(mi)];
+
+       glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[0]);
+
+       list = glGenLists(1);
+       glNewList(list, GL_COMPILE_AND_EXECUTE);
+       TRIANGLE(1.5, mp->seno, mp->edgedivisions, (3 * SQRT3 + SQRT15) / 12, mp->VisibleSpikes);
+       glEndList();
+
+       glPushMatrix();
+
+       glPushMatrix();
+       glRotatef(180, 0, 0, 1);
+       glRotatef(-icoangle, 1, 0, 0);
+       glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[1]);
+       glCallList(list);
+       glPushMatrix();
+       glRotatef(180, 0, 1, 0);
+       glRotatef(-180 + icoangle, 0.5, SQRT3 / 2, 0);
+       glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[2]);
+       glCallList(list);
+       glPopMatrix();
+       glRotatef(180, 0, 1, 0);
+       glRotatef(-180 + icoangle, 0.5, -SQRT3 / 2, 0);
+       glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[3]);
+       glCallList(list);
+       glPopMatrix();
+       glPushMatrix();
+       glRotatef(180, 0, 1, 0);
+       glRotatef(-180 + icoangle, 0.5, SQRT3 / 2, 0);
+       glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[4]);
+       glCallList(list);
+       glPushMatrix();
+       glRotatef(180, 0, 1, 0);
+       glRotatef(-180 + icoangle, 0.5, SQRT3 / 2, 0);
+       glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[5]);
+       glCallList(list);
+       glPopMatrix();
+       glRotatef(180, 0, 0, 1);
+       glRotatef(-icoangle, 1, 0, 0);
+       glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[6]);
+       glCallList(list);
+       glPopMatrix();
+       glRotatef(180, 0, 1, 0);
+       glRotatef(-180 + icoangle, 0.5, -SQRT3 / 2, 0);
+       glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[7]);
+       glCallList(list);
+       glPushMatrix();
+       glRotatef(180, 0, 1, 0);
+       glRotatef(-180 + icoangle, 0.5, -SQRT3 / 2, 0);
+       glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[8]);
+       glCallList(list);
+       glPopMatrix();
+       glRotatef(180, 0, 0, 1);
+       glRotatef(-icoangle, 1, 0, 0);
+       glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[9]);
+       glCallList(list);
+       glPopMatrix();
+       glRotatef(180, 1, 0, 0);
+       glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[10]);
+       glCallList(list);
+       glPushMatrix();
+       glRotatef(180, 0, 0, 1);
+       glRotatef(-icoangle, 1, 0, 0);
+       glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[11]);
+       glCallList(list);
+       glPushMatrix();
+       glRotatef(180, 0, 1, 0);
+       glRotatef(-180 + icoangle, 0.5, SQRT3 / 2, 0);
+       glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[12]);
+       glCallList(list);
+       glPopMatrix();
+       glRotatef(180, 0, 1, 0);
+       glRotatef(-180 + icoangle, 0.5, -SQRT3 / 2, 0);
+       glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[13]);
+       glCallList(list);
+       glPopMatrix();
+       glPushMatrix();
+       glRotatef(180, 0, 1, 0);
+       glRotatef(-180 + icoangle, 0.5, SQRT3 / 2, 0);
+       glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[14]);
+       glCallList(list);
+       glPushMatrix();
+       glRotatef(180, 0, 1, 0);
+       glRotatef(-180 + icoangle, 0.5, SQRT3 / 2, 0);
+       glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[15]);
+       glCallList(list);
+       glPopMatrix();
+       glRotatef(180, 0, 0, 1);
+       glRotatef(-icoangle, 1, 0, 0);
+       glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[16]);
+       glCallList(list);
+       glPopMatrix();
+       glRotatef(180, 0, 1, 0);
+       glRotatef(-180 + icoangle, 0.5, -SQRT3 / 2, 0);
+       glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[17]);
+       glCallList(list);
+       glPushMatrix();
+       glRotatef(180, 0, 1, 0);
+       glRotatef(-180 + icoangle, 0.5, -SQRT3 / 2, 0);
+       glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[18]);
+       glCallList(list);
+       glPopMatrix();
+       glRotatef(180, 0, 0, 1);
+       glRotatef(-icoangle, 1, 0, 0);
+       glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mp->MaterialColor[19]);
+       glCallList(list);
+
+       glDeleteLists(list, 1);
+}
+
+static void
+reshape(ModeInfo * mi, int width, int height)
+{
+       morph3dstruct *mp = &morph3d[MI_SCREEN(mi)];
+
+       glViewport(0, 0, mp->WindW = (GLint) width, mp->WindH = (GLint) height);
+       glMatrixMode(GL_PROJECTION);
+       glLoadIdentity();
+       glFrustum(-1.0, 1.0, -1.0, 1.0, 5.0, 15.0);
+       glMatrixMode(GL_MODELVIEW);
+}
+
+static void
+pinit(ModeInfo * mi)
+{
+       morph3dstruct *mp = &morph3d[MI_SCREEN(mi)];
+
+       glClearDepth(1.0);
+       glClearColor(0.0, 0.0, 0.0, 1.0);
+       glColor3f(1.0, 1.0, 1.0);
+
+       glLightfv(GL_LIGHT0, GL_AMBIENT, ambient);
+       glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse);
+       glLightfv(GL_LIGHT0, GL_POSITION, position0);
+       glLightfv(GL_LIGHT1, GL_AMBIENT, ambient);
+       glLightfv(GL_LIGHT1, GL_DIFFUSE, diffuse);
+       glLightfv(GL_LIGHT1, GL_POSITION, position1);
+       glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient);
+       glLightModelfv(GL_LIGHT_MODEL_TWO_SIDE, lmodel_twoside);
+       glEnable(GL_LIGHTING);
+       glEnable(GL_LIGHT0);
+       glEnable(GL_LIGHT1);
+       glEnable(GL_DEPTH_TEST);
+       glEnable(GL_NORMALIZE);
+
+       glShadeModel(GL_SMOOTH);
+       glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, front_shininess);
+       glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, front_specular);
+
+       switch (mp->object) {
+               case 2:
+                       mp->draw_object = draw_cube;
+                       mp->MaterialColor[0] = MaterialRed;
+                       mp->MaterialColor[1] = MaterialGreen;
+                       mp->MaterialColor[2] = MaterialCyan;
+                       mp->MaterialColor[3] = MaterialMagenta;
+                       mp->MaterialColor[4] = MaterialYellow;
+                       mp->MaterialColor[5] = MaterialBlue;
+                       mp->edgedivisions = cubedivisions;
+                       mp->Magnitude = 2.0;
+                       break;
+               case 3:
+                       mp->draw_object = draw_octa;
+                       mp->MaterialColor[0] = MaterialRed;
+                       mp->MaterialColor[1] = MaterialGreen;
+                       mp->MaterialColor[2] = MaterialBlue;
+                       mp->MaterialColor[3] = MaterialWhite;
+                       mp->MaterialColor[4] = MaterialCyan;
+                       mp->MaterialColor[5] = MaterialMagenta;
+                       mp->MaterialColor[6] = MaterialGray;
+                       mp->MaterialColor[7] = MaterialYellow;
+                       mp->edgedivisions = octadivisions;
+                       mp->Magnitude = 2.5;
+                       break;
+               case 4:
+                       mp->draw_object = draw_dodeca;
+                       mp->MaterialColor[0] = MaterialRed;
+                       mp->MaterialColor[1] = MaterialGreen;
+                       mp->MaterialColor[2] = MaterialCyan;
+                       mp->MaterialColor[3] = MaterialBlue;
+                       mp->MaterialColor[4] = MaterialMagenta;
+                       mp->MaterialColor[5] = MaterialYellow;
+                       mp->MaterialColor[6] = MaterialGreen;
+                       mp->MaterialColor[7] = MaterialCyan;
+                       mp->MaterialColor[8] = MaterialRed;
+                       mp->MaterialColor[9] = MaterialMagenta;
+                       mp->MaterialColor[10] = MaterialBlue;
+                       mp->MaterialColor[11] = MaterialYellow;
+                       mp->edgedivisions = dodecadivisions;
+                       mp->Magnitude = 2.0;
+                       break;
+               case 5:
+                       mp->draw_object = draw_icosa;
+                       mp->MaterialColor[0] = MaterialRed;
+                       mp->MaterialColor[1] = MaterialGreen;
+                       mp->MaterialColor[2] = MaterialBlue;
+                       mp->MaterialColor[3] = MaterialCyan;
+                       mp->MaterialColor[4] = MaterialYellow;
+                       mp->MaterialColor[5] = MaterialMagenta;
+                       mp->MaterialColor[6] = MaterialRed;
+                       mp->MaterialColor[7] = MaterialGreen;
+                       mp->MaterialColor[8] = MaterialBlue;
+                       mp->MaterialColor[9] = MaterialWhite;
+                       mp->MaterialColor[10] = MaterialCyan;
+                       mp->MaterialColor[11] = MaterialYellow;
+                       mp->MaterialColor[12] = MaterialMagenta;
+                       mp->MaterialColor[13] = MaterialRed;
+                       mp->MaterialColor[14] = MaterialGreen;
+                       mp->MaterialColor[15] = MaterialBlue;
+                       mp->MaterialColor[16] = MaterialCyan;
+                       mp->MaterialColor[17] = MaterialYellow;
+                       mp->MaterialColor[18] = MaterialMagenta;
+                       mp->MaterialColor[19] = MaterialGray;
+                       mp->edgedivisions = icodivisions;
+                       mp->Magnitude = 2.5;
+                       break;
+               default:
+                       mp->draw_object = draw_tetra;
+                       mp->MaterialColor[0] = MaterialRed;
+                       mp->MaterialColor[1] = MaterialGreen;
+                       mp->MaterialColor[2] = MaterialBlue;
+                       mp->MaterialColor[3] = MaterialWhite;
+                       mp->edgedivisions = tetradivisions;
+                       mp->Magnitude = 2.5;
+                       break;
+       }
+       if (MI_IS_MONO(mi)) {
+               int         loop;
+
+               for (loop = 0; loop < 20; loop++)
+                       mp->MaterialColor[loop] = MaterialGray;
+       }
+}
+
+void
+init_morph3d(ModeInfo * mi)
+{
+       int         screen = MI_SCREEN(mi);
+       morph3dstruct *mp;
+
+       if (morph3d == NULL) {
+               if ((morph3d = (morph3dstruct *) calloc(MI_NUM_SCREENS(mi),
+                                           sizeof (morph3dstruct))) == NULL)
+                       return;
+       }
+       mp = &morph3d[screen];
+       mp->step = NRAND(90);
+       mp->VisibleSpikes = 1;
+
+       if ((mp->glx_context = init_GL(mi)) != NULL) {
+
+               reshape(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+               mp->object = MI_COUNT(mi);
+               if (mp->object <= 0 || mp->object > 5)
+                       mp->object = NRAND(5) + 1;
+               pinit(mi);
+       } else {
+               MI_CLEARWINDOW(mi);
+       }
+}
+
+void
+draw_morph3d(ModeInfo * mi)
+{
+       morph3dstruct *mp = &morph3d[MI_SCREEN(mi)];
+
+       Display    *display = MI_DISPLAY(mi);
+       Window      window = MI_WINDOW(mi);
+
+       if (!mp->glx_context)
+               return;
+
+       glDrawBuffer(GL_BACK);
+       glXMakeCurrent(display, window, *(mp->glx_context));
+
+       glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+       glPushMatrix();
+
+       glTranslatef(0.0, 0.0, -10.0);
+
+       if (!MI_IS_ICONIC(mi)) {
+               glScalef(Scale4Window * mp->WindH / mp->WindW, Scale4Window, Scale4Window);
+               glTranslatef(2.5 * mp->WindW / mp->WindH * sin(mp->step * 1.11), 2.5 * cos(mp->step * 1.25 * 1.11), 0);
+       } else {
+               glScalef(Scale4Iconic * mp->WindH / mp->WindW, Scale4Iconic, Scale4Iconic);
+       }
+
+       glRotatef(mp->step * 100, 1, 0, 0);
+       glRotatef(mp->step * 95, 0, 1, 0);
+       glRotatef(mp->step * 90, 0, 0, 1);
+
+       mp->seno = (sin(mp->step) + 1.0 / 3.0) * (4.0 / 5.0) * mp->Magnitude;
+
+       if (mp->VisibleSpikes) {
+#ifdef DEBUG_CULL_FACE
+               int         loop;
+
+               for (loop = 0; loop < 20; loop++)
+                       mp->MaterialColor[loop] = MaterialGray;
+#endif
+               glDisable(GL_CULL_FACE);
+       } else {
+#ifdef DEBUG_CULL_FACE
+               int         loop;
+
+               for (loop = 0; loop < 20; loop++)
+                       mp->MaterialColor[loop] = MaterialWhite;
+#endif
+               glEnable(GL_CULL_FACE);
+       }
+
+       mp->draw_object(mi);
+
+       glPopMatrix();
+
+       glFlush();
+
+       glXSwapBuffers(display, window);
+
+       mp->step += 0.05;
+}
+
+void
+change_morph3d(ModeInfo * mi)
+{
+       morph3dstruct *mp = &morph3d[MI_SCREEN(mi)];
+
+       if (!mp->glx_context)
+               return;
+
+       mp->object = (mp->object) % 5 + 1;
+       pinit(mi);
+}
+
+void
+release_morph3d(ModeInfo * mi)
+{
+       if (morph3d != NULL) {
+               (void) free((void *) morph3d);
+               morph3d = NULL;
+       }
+       FreeAllGL(mi);
+}
+
+#endif
diff --git a/hacks/glx/pipeobjs.c b/hacks/glx/pipeobjs.c
new file mode 100644 (file)
index 0000000..e89f700
--- /dev/null
@@ -0,0 +1,3267 @@
+#if !defined( lint ) && !defined( SABER )
+static const char sccsid[] = "@(#)pipeobjs.c   4.04 97/07/28 xlockmore";
+
+#endif
+
+/*-
+ * Points, polygons, and normal vectors to render objects for pipes.
+ *
+ * Generated by lw2ogl.
+ */
+
+#ifndef STANDALONE
+#include "xlock.h"
+#endif
+
+#ifdef USE_GL
+
+#ifdef STANDALONE
+#include <GL/glx.h>
+#endif
+#include <GL/gl.h>
+#include "buildlwo.h"
+
+static GLfloat BigValve_PNTS[] =
+{
+       (GLfloat) 0.756788, (GLfloat) 0.614672, (GLfloat) - 0.000000,
+       (GLfloat) 0.779498, (GLfloat) 0.599497, (GLfloat) - 0.000000,
+       (GLfloat) 0.794672, (GLfloat) 0.576788, (GLfloat) - 0.000000,
+       (GLfloat) 0.800000, (GLfloat) 0.550000, (GLfloat) - 0.000000,
+       (GLfloat) 0.794672, (GLfloat) 0.523212, (GLfloat) - 0.000000,
+       (GLfloat) 0.779498, (GLfloat) 0.500503, (GLfloat) - 0.000000,
+       (GLfloat) 0.756788, (GLfloat) 0.485328, (GLfloat) - 0.000000,
+       (GLfloat) 0.730000, (GLfloat) 0.480000, (GLfloat) - 0.000000,
+       (GLfloat) 0.703212, (GLfloat) 0.485328, (GLfloat) - 0.000000,
+       (GLfloat) 0.680503, (GLfloat) 0.500503, (GLfloat) - 0.000000,
+       (GLfloat) 0.665328, (GLfloat) 0.523212, (GLfloat) - 0.000000,
+       (GLfloat) 0.660000, (GLfloat) 0.550000, (GLfloat) - 0.000000,
+       (GLfloat) 0.665328, (GLfloat) 0.576788, (GLfloat) - 0.000000,
+       (GLfloat) 0.680503, (GLfloat) 0.599497, (GLfloat) - 0.000000,
+       (GLfloat) 0.703212, (GLfloat) 0.614672, (GLfloat) - 0.000000,
+       (GLfloat) 0.730000, (GLfloat) 0.620000, (GLfloat) - 0.000000,
+       (GLfloat) 0.756788, (GLfloat) 0.602861, (GLfloat) 0.119916,
+       (GLfloat) 0.779498, (GLfloat) 0.587978, (GLfloat) 0.116956,
+       (GLfloat) 0.794672, (GLfloat) 0.565705, (GLfloat) 0.112526,
+       (GLfloat) 0.800000, (GLfloat) 0.539432, (GLfloat) 0.107300,
+       (GLfloat) 0.794672, (GLfloat) 0.513159, (GLfloat) 0.102074,
+       (GLfloat) 0.779498, (GLfloat) 0.490886, (GLfloat) 0.097643,
+       (GLfloat) 0.756788, (GLfloat) 0.476003, (GLfloat) 0.094683,
+       (GLfloat) 0.730000, (GLfloat) 0.470777, (GLfloat) 0.093643,
+       (GLfloat) 0.703212, (GLfloat) 0.476003, (GLfloat) 0.094683,
+       (GLfloat) 0.680503, (GLfloat) 0.490886, (GLfloat) 0.097643,
+       (GLfloat) 0.665328, (GLfloat) 0.513159, (GLfloat) 0.102074,
+       (GLfloat) 0.660000, (GLfloat) 0.539432, (GLfloat) 0.107300,
+       (GLfloat) 0.665328, (GLfloat) 0.565705, (GLfloat) 0.112526,
+       (GLfloat) 0.680503, (GLfloat) 0.587978, (GLfloat) 0.116956,
+       (GLfloat) 0.703212, (GLfloat) 0.602861, (GLfloat) 0.119916,
+       (GLfloat) 0.730000, (GLfloat) 0.608087, (GLfloat) 0.120956,
+       (GLfloat) 0.756788, (GLfloat) 0.567882, (GLfloat) 0.235225,
+       (GLfloat) 0.779498, (GLfloat) 0.553863, (GLfloat) 0.229418,
+       (GLfloat) 0.794672, (GLfloat) 0.532882, (GLfloat) 0.220727,
+       (GLfloat) 0.800000, (GLfloat) 0.508134, (GLfloat) 0.210476,
+       (GLfloat) 0.794672, (GLfloat) 0.483385, (GLfloat) 0.200225,
+       (GLfloat) 0.779498, (GLfloat) 0.462404, (GLfloat) 0.191534,
+       (GLfloat) 0.756788, (GLfloat) 0.448385, (GLfloat) 0.185727,
+       (GLfloat) 0.730000, (GLfloat) 0.443462, (GLfloat) 0.183688,
+       (GLfloat) 0.703212, (GLfloat) 0.448385, (GLfloat) 0.185727,
+       (GLfloat) 0.680503, (GLfloat) 0.462404, (GLfloat) 0.191534,
+       (GLfloat) 0.665328, (GLfloat) 0.483385, (GLfloat) 0.200225,
+       (GLfloat) 0.660000, (GLfloat) 0.508134, (GLfloat) 0.210476,
+       (GLfloat) 0.665328, (GLfloat) 0.532882, (GLfloat) 0.220727,
+       (GLfloat) 0.680503, (GLfloat) 0.553863, (GLfloat) 0.229418,
+       (GLfloat) 0.703212, (GLfloat) 0.567882, (GLfloat) 0.235225,
+       (GLfloat) 0.730000, (GLfloat) 0.572805, (GLfloat) 0.237264,
+       (GLfloat) 0.756788, (GLfloat) 0.511081, (GLfloat) 0.341493,
+       (GLfloat) 0.779498, (GLfloat) 0.498464, (GLfloat) 0.333063,
+       (GLfloat) 0.794672, (GLfloat) 0.479582, (GLfloat) 0.320446,
+       (GLfloat) 0.800000, (GLfloat) 0.457308, (GLfloat) 0.305564,
+       (GLfloat) 0.794672, (GLfloat) 0.435035, (GLfloat) 0.290681,
+       (GLfloat) 0.779498, (GLfloat) 0.416153, (GLfloat) 0.278064,
+       (GLfloat) 0.756788, (GLfloat) 0.403536, (GLfloat) 0.269634,
+       (GLfloat) 0.730000, (GLfloat) 0.399105, (GLfloat) 0.266674,
+       (GLfloat) 0.703212, (GLfloat) 0.403536, (GLfloat) 0.269634,
+       (GLfloat) 0.680503, (GLfloat) 0.416153, (GLfloat) 0.278064,
+       (GLfloat) 0.665328, (GLfloat) 0.435035, (GLfloat) 0.290681,
+       (GLfloat) 0.660000, (GLfloat) 0.457308, (GLfloat) 0.305564,
+       (GLfloat) 0.665328, (GLfloat) 0.479582, (GLfloat) 0.320446,
+       (GLfloat) 0.680503, (GLfloat) 0.498464, (GLfloat) 0.333063,
+       (GLfloat) 0.703212, (GLfloat) 0.511081, (GLfloat) 0.341493,
+       (GLfloat) 0.730000, (GLfloat) 0.515511, (GLfloat) 0.344454,
+       (GLfloat) 0.756788, (GLfloat) 0.434638, (GLfloat) 0.434638,
+       (GLfloat) 0.779498, (GLfloat) 0.423909, (GLfloat) 0.423909,
+       (GLfloat) 0.794672, (GLfloat) 0.407851, (GLfloat) 0.407851,
+       (GLfloat) 0.800000, (GLfloat) 0.388909, (GLfloat) 0.388909,
+       (GLfloat) 0.794672, (GLfloat) 0.369967, (GLfloat) 0.369967,
+       (GLfloat) 0.779498, (GLfloat) 0.353909, (GLfloat) 0.353909,
+       (GLfloat) 0.756788, (GLfloat) 0.343179, (GLfloat) 0.343179,
+       (GLfloat) 0.730000, (GLfloat) 0.339411, (GLfloat) 0.339411,
+       (GLfloat) 0.703212, (GLfloat) 0.343179, (GLfloat) 0.343179,
+       (GLfloat) 0.680503, (GLfloat) 0.353909, (GLfloat) 0.353909,
+       (GLfloat) 0.665328, (GLfloat) 0.369967, (GLfloat) 0.369967,
+       (GLfloat) 0.660000, (GLfloat) 0.388909, (GLfloat) 0.388909,
+       (GLfloat) 0.665328, (GLfloat) 0.407851, (GLfloat) 0.407851,
+       (GLfloat) 0.680503, (GLfloat) 0.423909, (GLfloat) 0.423909,
+       (GLfloat) 0.703212, (GLfloat) 0.434638, (GLfloat) 0.434638,
+       (GLfloat) 0.730000, (GLfloat) 0.438406, (GLfloat) 0.438406,
+       (GLfloat) 0.756788, (GLfloat) 0.341493, (GLfloat) 0.511081,
+       (GLfloat) 0.779498, (GLfloat) 0.333063, (GLfloat) 0.498464,
+       (GLfloat) 0.794672, (GLfloat) 0.320446, (GLfloat) 0.479582,
+       (GLfloat) 0.800000, (GLfloat) 0.305564, (GLfloat) 0.457308,
+       (GLfloat) 0.794672, (GLfloat) 0.290681, (GLfloat) 0.435035,
+       (GLfloat) 0.779498, (GLfloat) 0.278064, (GLfloat) 0.416153,
+       (GLfloat) 0.756788, (GLfloat) 0.269634, (GLfloat) 0.403536,
+       (GLfloat) 0.730000, (GLfloat) 0.266674, (GLfloat) 0.399105,
+       (GLfloat) 0.703212, (GLfloat) 0.269634, (GLfloat) 0.403536,
+       (GLfloat) 0.680503, (GLfloat) 0.278064, (GLfloat) 0.416153,
+       (GLfloat) 0.665328, (GLfloat) 0.290681, (GLfloat) 0.435035,
+       (GLfloat) 0.660000, (GLfloat) 0.305564, (GLfloat) 0.457308,
+       (GLfloat) 0.665328, (GLfloat) 0.320446, (GLfloat) 0.479582,
+       (GLfloat) 0.680503, (GLfloat) 0.333063, (GLfloat) 0.498464,
+       (GLfloat) 0.703212, (GLfloat) 0.341493, (GLfloat) 0.511081,
+       (GLfloat) 0.730000, (GLfloat) 0.344454, (GLfloat) 0.515511,
+       (GLfloat) 0.756788, (GLfloat) 0.235225, (GLfloat) 0.567882,
+       (GLfloat) 0.779498, (GLfloat) 0.229418, (GLfloat) 0.553863,
+       (GLfloat) 0.794672, (GLfloat) 0.220727, (GLfloat) 0.532882,
+       (GLfloat) 0.800000, (GLfloat) 0.210476, (GLfloat) 0.508134,
+       (GLfloat) 0.794672, (GLfloat) 0.200225, (GLfloat) 0.483385,
+       (GLfloat) 0.779498, (GLfloat) 0.191534, (GLfloat) 0.462404,
+       (GLfloat) 0.756788, (GLfloat) 0.185727, (GLfloat) 0.448385,
+       (GLfloat) 0.730000, (GLfloat) 0.183688, (GLfloat) 0.443462,
+       (GLfloat) 0.703212, (GLfloat) 0.185727, (GLfloat) 0.448385,
+       (GLfloat) 0.680503, (GLfloat) 0.191534, (GLfloat) 0.462404,
+       (GLfloat) 0.665328, (GLfloat) 0.200225, (GLfloat) 0.483385,
+       (GLfloat) 0.660000, (GLfloat) 0.210476, (GLfloat) 0.508134,
+       (GLfloat) 0.665328, (GLfloat) 0.220727, (GLfloat) 0.532882,
+       (GLfloat) 0.680503, (GLfloat) 0.229418, (GLfloat) 0.553863,
+       (GLfloat) 0.703212, (GLfloat) 0.235225, (GLfloat) 0.567882,
+       (GLfloat) 0.730000, (GLfloat) 0.237264, (GLfloat) 0.572805,
+       (GLfloat) 0.756788, (GLfloat) 0.119916, (GLfloat) 0.602861,
+       (GLfloat) 0.779498, (GLfloat) 0.116956, (GLfloat) 0.587978,
+       (GLfloat) 0.794672, (GLfloat) 0.112526, (GLfloat) 0.565705,
+       (GLfloat) 0.800000, (GLfloat) 0.107300, (GLfloat) 0.539432,
+       (GLfloat) 0.794672, (GLfloat) 0.102074, (GLfloat) 0.513159,
+       (GLfloat) 0.779498, (GLfloat) 0.097643, (GLfloat) 0.490886,
+       (GLfloat) 0.756788, (GLfloat) 0.094683, (GLfloat) 0.476003,
+       (GLfloat) 0.730000, (GLfloat) 0.093643, (GLfloat) 0.470777,
+       (GLfloat) 0.703212, (GLfloat) 0.094683, (GLfloat) 0.476003,
+       (GLfloat) 0.680503, (GLfloat) 0.097643, (GLfloat) 0.490886,
+       (GLfloat) 0.665328, (GLfloat) 0.102074, (GLfloat) 0.513159,
+       (GLfloat) 0.660000, (GLfloat) 0.107300, (GLfloat) 0.539432,
+       (GLfloat) 0.665328, (GLfloat) 0.112526, (GLfloat) 0.565705,
+       (GLfloat) 0.680503, (GLfloat) 0.116956, (GLfloat) 0.587978,
+       (GLfloat) 0.703212, (GLfloat) 0.119916, (GLfloat) 0.602861,
+       (GLfloat) 0.730000, (GLfloat) 0.120956, (GLfloat) 0.608087,
+       (GLfloat) 0.756788, (GLfloat) 0.000000, (GLfloat) 0.614672,
+       (GLfloat) 0.779498, (GLfloat) 0.000000, (GLfloat) 0.599497,
+       (GLfloat) 0.794672, (GLfloat) 0.000000, (GLfloat) 0.576788,
+       (GLfloat) 0.800000, (GLfloat) 0.000000, (GLfloat) 0.550000,
+       (GLfloat) 0.794672, (GLfloat) 0.000000, (GLfloat) 0.523212,
+       (GLfloat) 0.779498, (GLfloat) 0.000000, (GLfloat) 0.500503,
+       (GLfloat) 0.756788, (GLfloat) 0.000000, (GLfloat) 0.485328,
+       (GLfloat) 0.730000, (GLfloat) 0.000000, (GLfloat) 0.480000,
+       (GLfloat) 0.703212, (GLfloat) 0.000000, (GLfloat) 0.485328,
+       (GLfloat) 0.680503, (GLfloat) 0.000000, (GLfloat) 0.500503,
+       (GLfloat) 0.665328, (GLfloat) 0.000000, (GLfloat) 0.523212,
+       (GLfloat) 0.660000, (GLfloat) 0.000000, (GLfloat) 0.550000,
+       (GLfloat) 0.665328, (GLfloat) 0.000000, (GLfloat) 0.576788,
+       (GLfloat) 0.680503, (GLfloat) 0.000000, (GLfloat) 0.599497,
+       (GLfloat) 0.703212, (GLfloat) 0.000000, (GLfloat) 0.614672,
+       (GLfloat) 0.730000, (GLfloat) 0.000000, (GLfloat) 0.620000,
+       (GLfloat) 0.756788, (GLfloat) - 0.119916, (GLfloat) 0.602861,
+       (GLfloat) 0.779498, (GLfloat) - 0.116956, (GLfloat) 0.587978,
+       (GLfloat) 0.794672, (GLfloat) - 0.112526, (GLfloat) 0.565705,
+       (GLfloat) 0.800000, (GLfloat) - 0.107300, (GLfloat) 0.539432,
+       (GLfloat) 0.794672, (GLfloat) - 0.102074, (GLfloat) 0.513159,
+       (GLfloat) 0.779498, (GLfloat) - 0.097643, (GLfloat) 0.490886,
+       (GLfloat) 0.756788, (GLfloat) - 0.094683, (GLfloat) 0.476003,
+       (GLfloat) 0.730000, (GLfloat) - 0.093643, (GLfloat) 0.470777,
+       (GLfloat) 0.703212, (GLfloat) - 0.094683, (GLfloat) 0.476003,
+       (GLfloat) 0.680503, (GLfloat) - 0.097643, (GLfloat) 0.490886,
+       (GLfloat) 0.665328, (GLfloat) - 0.102074, (GLfloat) 0.513159,
+       (GLfloat) 0.660000, (GLfloat) - 0.107300, (GLfloat) 0.539432,
+       (GLfloat) 0.665328, (GLfloat) - 0.112526, (GLfloat) 0.565705,
+       (GLfloat) 0.680503, (GLfloat) - 0.116956, (GLfloat) 0.587978,
+       (GLfloat) 0.703212, (GLfloat) - 0.119916, (GLfloat) 0.602861,
+       (GLfloat) 0.730000, (GLfloat) - 0.120956, (GLfloat) 0.608087,
+       (GLfloat) 0.756788, (GLfloat) - 0.235225, (GLfloat) 0.567882,
+       (GLfloat) 0.779498, (GLfloat) - 0.229418, (GLfloat) 0.553863,
+       (GLfloat) 0.794672, (GLfloat) - 0.220727, (GLfloat) 0.532882,
+       (GLfloat) 0.800000, (GLfloat) - 0.210476, (GLfloat) 0.508134,
+       (GLfloat) 0.794672, (GLfloat) - 0.200225, (GLfloat) 0.483385,
+       (GLfloat) 0.779498, (GLfloat) - 0.191534, (GLfloat) 0.462404,
+       (GLfloat) 0.756788, (GLfloat) - 0.185727, (GLfloat) 0.448385,
+       (GLfloat) 0.730000, (GLfloat) - 0.183688, (GLfloat) 0.443462,
+       (GLfloat) 0.703212, (GLfloat) - 0.185727, (GLfloat) 0.448385,
+       (GLfloat) 0.680503, (GLfloat) - 0.191534, (GLfloat) 0.462404,
+       (GLfloat) 0.665328, (GLfloat) - 0.200225, (GLfloat) 0.483385,
+       (GLfloat) 0.660000, (GLfloat) - 0.210476, (GLfloat) 0.508134,
+       (GLfloat) 0.665328, (GLfloat) - 0.220727, (GLfloat) 0.532882,
+       (GLfloat) 0.680503, (GLfloat) - 0.229418, (GLfloat) 0.553863,
+       (GLfloat) 0.703212, (GLfloat) - 0.235225, (GLfloat) 0.567882,
+       (GLfloat) 0.730000, (GLfloat) - 0.237264, (GLfloat) 0.572805,
+       (GLfloat) 0.756788, (GLfloat) - 0.341493, (GLfloat) 0.511081,
+       (GLfloat) 0.779498, (GLfloat) - 0.333063, (GLfloat) 0.498464,
+       (GLfloat) 0.794672, (GLfloat) - 0.320446, (GLfloat) 0.479582,
+       (GLfloat) 0.800000, (GLfloat) - 0.305564, (GLfloat) 0.457308,
+       (GLfloat) 0.794672, (GLfloat) - 0.290681, (GLfloat) 0.435035,
+       (GLfloat) 0.779498, (GLfloat) - 0.278064, (GLfloat) 0.416153,
+       (GLfloat) 0.756788, (GLfloat) - 0.269634, (GLfloat) 0.403536,
+       (GLfloat) 0.730000, (GLfloat) - 0.266674, (GLfloat) 0.399105,
+       (GLfloat) 0.703212, (GLfloat) - 0.269634, (GLfloat) 0.403536,
+       (GLfloat) 0.680503, (GLfloat) - 0.278064, (GLfloat) 0.416153,
+       (GLfloat) 0.665328, (GLfloat) - 0.290681, (GLfloat) 0.435035,
+       (GLfloat) 0.660000, (GLfloat) - 0.305564, (GLfloat) 0.457308,
+       (GLfloat) 0.665328, (GLfloat) - 0.320446, (GLfloat) 0.479582,
+       (GLfloat) 0.680503, (GLfloat) - 0.333063, (GLfloat) 0.498464,
+       (GLfloat) 0.703212, (GLfloat) - 0.341493, (GLfloat) 0.511081,
+       (GLfloat) 0.730000, (GLfloat) - 0.344454, (GLfloat) 0.515511,
+       (GLfloat) 0.756788, (GLfloat) - 0.434638, (GLfloat) 0.434638,
+       (GLfloat) 0.779498, (GLfloat) - 0.423909, (GLfloat) 0.423909,
+       (GLfloat) 0.794672, (GLfloat) - 0.407851, (GLfloat) 0.407851,
+       (GLfloat) 0.800000, (GLfloat) - 0.388909, (GLfloat) 0.388909,
+       (GLfloat) 0.794672, (GLfloat) - 0.369967, (GLfloat) 0.369967,
+       (GLfloat) 0.779498, (GLfloat) - 0.353909, (GLfloat) 0.353909,
+       (GLfloat) 0.756788, (GLfloat) - 0.343179, (GLfloat) 0.343179,
+       (GLfloat) 0.730000, (GLfloat) - 0.339411, (GLfloat) 0.339411,
+       (GLfloat) 0.703212, (GLfloat) - 0.343179, (GLfloat) 0.343179,
+       (GLfloat) 0.680503, (GLfloat) - 0.353909, (GLfloat) 0.353909,
+       (GLfloat) 0.665328, (GLfloat) - 0.369967, (GLfloat) 0.369967,
+       (GLfloat) 0.660000, (GLfloat) - 0.388909, (GLfloat) 0.388909,
+       (GLfloat) 0.665328, (GLfloat) - 0.407851, (GLfloat) 0.407851,
+       (GLfloat) 0.680503, (GLfloat) - 0.423909, (GLfloat) 0.423909,
+       (GLfloat) 0.703212, (GLfloat) - 0.434638, (GLfloat) 0.434638,
+       (GLfloat) 0.730000, (GLfloat) - 0.438406, (GLfloat) 0.438406,
+       (GLfloat) 0.756788, (GLfloat) - 0.511081, (GLfloat) 0.341493,
+       (GLfloat) 0.779498, (GLfloat) - 0.498464, (GLfloat) 0.333063,
+       (GLfloat) 0.794672, (GLfloat) - 0.479582, (GLfloat) 0.320446,
+       (GLfloat) 0.800000, (GLfloat) - 0.457308, (GLfloat) 0.305564,
+       (GLfloat) 0.794672, (GLfloat) - 0.435035, (GLfloat) 0.290681,
+       (GLfloat) 0.779498, (GLfloat) - 0.416153, (GLfloat) 0.278064,
+       (GLfloat) 0.756788, (GLfloat) - 0.403536, (GLfloat) 0.269634,
+       (GLfloat) 0.730000, (GLfloat) - 0.399105, (GLfloat) 0.266674,
+       (GLfloat) 0.703212, (GLfloat) - 0.403536, (GLfloat) 0.269634,
+       (GLfloat) 0.680503, (GLfloat) - 0.416153, (GLfloat) 0.278064,
+       (GLfloat) 0.665328, (GLfloat) - 0.435035, (GLfloat) 0.290681,
+       (GLfloat) 0.660000, (GLfloat) - 0.457308, (GLfloat) 0.305564,
+       (GLfloat) 0.665328, (GLfloat) - 0.479582, (GLfloat) 0.320446,
+       (GLfloat) 0.680503, (GLfloat) - 0.498464, (GLfloat) 0.333063,
+       (GLfloat) 0.703212, (GLfloat) - 0.511081, (GLfloat) 0.341493,
+       (GLfloat) 0.730000, (GLfloat) - 0.515511, (GLfloat) 0.344454,
+       (GLfloat) 0.756788, (GLfloat) - 0.567882, (GLfloat) 0.235225,
+       (GLfloat) 0.779498, (GLfloat) - 0.553863, (GLfloat) 0.229418,
+       (GLfloat) 0.794672, (GLfloat) - 0.532882, (GLfloat) 0.220727,
+       (GLfloat) 0.800000, (GLfloat) - 0.508134, (GLfloat) 0.210476,
+       (GLfloat) 0.794672, (GLfloat) - 0.483385, (GLfloat) 0.200225,
+       (GLfloat) 0.779498, (GLfloat) - 0.462404, (GLfloat) 0.191534,
+       (GLfloat) 0.756788, (GLfloat) - 0.448385, (GLfloat) 0.185727,
+       (GLfloat) 0.730000, (GLfloat) - 0.443462, (GLfloat) 0.183688,
+       (GLfloat) 0.703212, (GLfloat) - 0.448385, (GLfloat) 0.185727,
+       (GLfloat) 0.680503, (GLfloat) - 0.462404, (GLfloat) 0.191534,
+       (GLfloat) 0.665328, (GLfloat) - 0.483385, (GLfloat) 0.200225,
+       (GLfloat) 0.660000, (GLfloat) - 0.508134, (GLfloat) 0.210476,
+       (GLfloat) 0.665328, (GLfloat) - 0.532882, (GLfloat) 0.220727,
+       (GLfloat) 0.680503, (GLfloat) - 0.553863, (GLfloat) 0.229418,
+       (GLfloat) 0.703212, (GLfloat) - 0.567882, (GLfloat) 0.235225,
+       (GLfloat) 0.730000, (GLfloat) - 0.572805, (GLfloat) 0.237264,
+       (GLfloat) 0.756788, (GLfloat) - 0.602861, (GLfloat) 0.119916,
+       (GLfloat) 0.779498, (GLfloat) - 0.587978, (GLfloat) 0.116956,
+       (GLfloat) 0.794672, (GLfloat) - 0.565705, (GLfloat) 0.112526,
+       (GLfloat) 0.800000, (GLfloat) - 0.539432, (GLfloat) 0.107300,
+       (GLfloat) 0.794672, (GLfloat) - 0.513159, (GLfloat) 0.102074,
+       (GLfloat) 0.779498, (GLfloat) - 0.490886, (GLfloat) 0.097643,
+       (GLfloat) 0.756788, (GLfloat) - 0.476003, (GLfloat) 0.094683,
+       (GLfloat) 0.730000, (GLfloat) - 0.470777, (GLfloat) 0.093643,
+       (GLfloat) 0.703212, (GLfloat) - 0.476003, (GLfloat) 0.094683,
+       (GLfloat) 0.680503, (GLfloat) - 0.490886, (GLfloat) 0.097643,
+       (GLfloat) 0.665328, (GLfloat) - 0.513159, (GLfloat) 0.102074,
+       (GLfloat) 0.660000, (GLfloat) - 0.539432, (GLfloat) 0.107300,
+       (GLfloat) 0.665328, (GLfloat) - 0.565705, (GLfloat) 0.112526,
+       (GLfloat) 0.680503, (GLfloat) - 0.587978, (GLfloat) 0.116956,
+       (GLfloat) 0.703212, (GLfloat) - 0.602861, (GLfloat) 0.119916,
+       (GLfloat) 0.730000, (GLfloat) - 0.608087, (GLfloat) 0.120956,
+       (GLfloat) 0.756788, (GLfloat) - 0.614672, (GLfloat) 0.000000,
+       (GLfloat) 0.779498, (GLfloat) - 0.599497, (GLfloat) 0.000000,
+       (GLfloat) 0.794672, (GLfloat) - 0.576788, (GLfloat) 0.000000,
+       (GLfloat) 0.800000, (GLfloat) - 0.550000, (GLfloat) 0.000000,
+       (GLfloat) 0.794672, (GLfloat) - 0.523212, (GLfloat) 0.000000,
+       (GLfloat) 0.779498, (GLfloat) - 0.500503, (GLfloat) 0.000000,
+       (GLfloat) 0.756788, (GLfloat) - 0.485328, (GLfloat) 0.000000,
+       (GLfloat) 0.730000, (GLfloat) - 0.480000, (GLfloat) 0.000000,
+       (GLfloat) 0.703212, (GLfloat) - 0.485328, (GLfloat) 0.000000,
+       (GLfloat) 0.680503, (GLfloat) - 0.500503, (GLfloat) 0.000000,
+       (GLfloat) 0.665328, (GLfloat) - 0.523212, (GLfloat) 0.000000,
+       (GLfloat) 0.660000, (GLfloat) - 0.550000, (GLfloat) 0.000000,
+       (GLfloat) 0.665328, (GLfloat) - 0.576788, (GLfloat) 0.000000,
+       (GLfloat) 0.680503, (GLfloat) - 0.599497, (GLfloat) 0.000000,
+       (GLfloat) 0.703212, (GLfloat) - 0.614672, (GLfloat) 0.000000,
+       (GLfloat) 0.730000, (GLfloat) - 0.620000, (GLfloat) 0.000000,
+       (GLfloat) 0.756788, (GLfloat) - 0.602861, (GLfloat) - 0.119916,
+       (GLfloat) 0.779498, (GLfloat) - 0.587978, (GLfloat) - 0.116956,
+       (GLfloat) 0.794672, (GLfloat) - 0.565705, (GLfloat) - 0.112526,
+       (GLfloat) 0.800000, (GLfloat) - 0.539432, (GLfloat) - 0.107300,
+       (GLfloat) 0.794672, (GLfloat) - 0.513159, (GLfloat) - 0.102074,
+       (GLfloat) 0.779498, (GLfloat) - 0.490886, (GLfloat) - 0.097643,
+       (GLfloat) 0.756788, (GLfloat) - 0.476003, (GLfloat) - 0.094683,
+       (GLfloat) 0.730000, (GLfloat) - 0.470777, (GLfloat) - 0.093643,
+       (GLfloat) 0.703212, (GLfloat) - 0.476003, (GLfloat) - 0.094683,
+       (GLfloat) 0.680503, (GLfloat) - 0.490886, (GLfloat) - 0.097643,
+       (GLfloat) 0.665328, (GLfloat) - 0.513159, (GLfloat) - 0.102074,
+       (GLfloat) 0.660000, (GLfloat) - 0.539432, (GLfloat) - 0.107300,
+       (GLfloat) 0.665328, (GLfloat) - 0.565705, (GLfloat) - 0.112526,
+       (GLfloat) 0.680503, (GLfloat) - 0.587978, (GLfloat) - 0.116956,
+       (GLfloat) 0.703212, (GLfloat) - 0.602861, (GLfloat) - 0.119916,
+       (GLfloat) 0.730000, (GLfloat) - 0.608087, (GLfloat) - 0.120956,
+       (GLfloat) 0.756788, (GLfloat) - 0.567882, (GLfloat) - 0.235225,
+       (GLfloat) 0.779498, (GLfloat) - 0.553863, (GLfloat) - 0.229418,
+       (GLfloat) 0.794672, (GLfloat) - 0.532882, (GLfloat) - 0.220727,
+       (GLfloat) 0.800000, (GLfloat) - 0.508134, (GLfloat) - 0.210476,
+       (GLfloat) 0.794672, (GLfloat) - 0.483385, (GLfloat) - 0.200225,
+       (GLfloat) 0.779498, (GLfloat) - 0.462404, (GLfloat) - 0.191534,
+       (GLfloat) 0.756788, (GLfloat) - 0.448385, (GLfloat) - 0.185727,
+       (GLfloat) 0.730000, (GLfloat) - 0.443462, (GLfloat) - 0.183688,
+       (GLfloat) 0.703212, (GLfloat) - 0.448385, (GLfloat) - 0.185727,
+       (GLfloat) 0.680503, (GLfloat) - 0.462404, (GLfloat) - 0.191534,
+       (GLfloat) 0.665328, (GLfloat) - 0.483385, (GLfloat) - 0.200225,
+       (GLfloat) 0.660000, (GLfloat) - 0.508134, (GLfloat) - 0.210476,
+       (GLfloat) 0.665328, (GLfloat) - 0.532882, (GLfloat) - 0.220727,
+       (GLfloat) 0.680503, (GLfloat) - 0.553863, (GLfloat) - 0.229418,
+       (GLfloat) 0.703212, (GLfloat) - 0.567882, (GLfloat) - 0.235225,
+       (GLfloat) 0.730000, (GLfloat) - 0.572805, (GLfloat) - 0.237264,
+       (GLfloat) 0.756788, (GLfloat) - 0.511081, (GLfloat) - 0.341493,
+       (GLfloat) 0.779498, (GLfloat) - 0.498464, (GLfloat) - 0.333063,
+       (GLfloat) 0.794672, (GLfloat) - 0.479582, (GLfloat) - 0.320446,
+       (GLfloat) 0.800000, (GLfloat) - 0.457308, (GLfloat) - 0.305564,
+       (GLfloat) 0.794672, (GLfloat) - 0.435035, (GLfloat) - 0.290681,
+       (GLfloat) 0.779498, (GLfloat) - 0.416153, (GLfloat) - 0.278064,
+       (GLfloat) 0.756788, (GLfloat) - 0.403536, (GLfloat) - 0.269634,
+       (GLfloat) 0.730000, (GLfloat) - 0.399105, (GLfloat) - 0.266674,
+       (GLfloat) 0.703212, (GLfloat) - 0.403536, (GLfloat) - 0.269634,
+       (GLfloat) 0.680503, (GLfloat) - 0.416153, (GLfloat) - 0.278064,
+       (GLfloat) 0.665328, (GLfloat) - 0.435035, (GLfloat) - 0.290681,
+       (GLfloat) 0.660000, (GLfloat) - 0.457308, (GLfloat) - 0.305564,
+       (GLfloat) 0.665328, (GLfloat) - 0.479582, (GLfloat) - 0.320446,
+       (GLfloat) 0.680503, (GLfloat) - 0.498464, (GLfloat) - 0.333063,
+       (GLfloat) 0.703212, (GLfloat) - 0.511081, (GLfloat) - 0.341493,
+       (GLfloat) 0.730000, (GLfloat) - 0.515511, (GLfloat) - 0.344454,
+       (GLfloat) 0.756788, (GLfloat) - 0.434638, (GLfloat) - 0.434638,
+       (GLfloat) 0.779498, (GLfloat) - 0.423909, (GLfloat) - 0.423909,
+       (GLfloat) 0.794672, (GLfloat) - 0.407851, (GLfloat) - 0.407851,
+       (GLfloat) 0.800000, (GLfloat) - 0.388909, (GLfloat) - 0.388909,
+       (GLfloat) 0.794672, (GLfloat) - 0.369967, (GLfloat) - 0.369967,
+       (GLfloat) 0.779498, (GLfloat) - 0.353909, (GLfloat) - 0.353909,
+       (GLfloat) 0.756788, (GLfloat) - 0.343179, (GLfloat) - 0.343179,
+       (GLfloat) 0.730000, (GLfloat) - 0.339411, (GLfloat) - 0.339411,
+       (GLfloat) 0.703212, (GLfloat) - 0.343179, (GLfloat) - 0.343179,
+       (GLfloat) 0.680503, (GLfloat) - 0.353909, (GLfloat) - 0.353909,
+       (GLfloat) 0.665328, (GLfloat) - 0.369967, (GLfloat) - 0.369967,
+       (GLfloat) 0.660000, (GLfloat) - 0.388909, (GLfloat) - 0.388909,
+       (GLfloat) 0.665328, (GLfloat) - 0.407851, (GLfloat) - 0.407851,
+       (GLfloat) 0.680503, (GLfloat) - 0.423909, (GLfloat) - 0.423909,
+       (GLfloat) 0.703212, (GLfloat) - 0.434638, (GLfloat) - 0.434638,
+       (GLfloat) 0.730000, (GLfloat) - 0.438406, (GLfloat) - 0.438406,
+       (GLfloat) 0.756788, (GLfloat) - 0.341493, (GLfloat) - 0.511081,
+       (GLfloat) 0.779498, (GLfloat) - 0.333063, (GLfloat) - 0.498464,
+       (GLfloat) 0.794672, (GLfloat) - 0.320446, (GLfloat) - 0.479582,
+       (GLfloat) 0.800000, (GLfloat) - 0.305564, (GLfloat) - 0.457308,
+       (GLfloat) 0.794672, (GLfloat) - 0.290681, (GLfloat) - 0.435035,
+       (GLfloat) 0.779498, (GLfloat) - 0.278064, (GLfloat) - 0.416153,
+       (GLfloat) 0.756788, (GLfloat) - 0.269634, (GLfloat) - 0.403536,
+       (GLfloat) 0.730000, (GLfloat) - 0.266674, (GLfloat) - 0.399105,
+       (GLfloat) 0.703212, (GLfloat) - 0.269634, (GLfloat) - 0.403536,
+       (GLfloat) 0.680503, (GLfloat) - 0.278064, (GLfloat) - 0.416153,
+       (GLfloat) 0.665328, (GLfloat) - 0.290681, (GLfloat) - 0.435035,
+       (GLfloat) 0.660000, (GLfloat) - 0.305564, (GLfloat) - 0.457308,
+       (GLfloat) 0.665328, (GLfloat) - 0.320446, (GLfloat) - 0.479582,
+       (GLfloat) 0.680503, (GLfloat) - 0.333063, (GLfloat) - 0.498464,
+       (GLfloat) 0.703212, (GLfloat) - 0.341493, (GLfloat) - 0.511081,
+       (GLfloat) 0.730000, (GLfloat) - 0.344454, (GLfloat) - 0.515511,
+       (GLfloat) 0.756788, (GLfloat) - 0.235225, (GLfloat) - 0.567882,
+       (GLfloat) 0.779498, (GLfloat) - 0.229418, (GLfloat) - 0.553863,
+       (GLfloat) 0.794672, (GLfloat) - 0.220727, (GLfloat) - 0.532882,
+       (GLfloat) 0.800000, (GLfloat) - 0.210476, (GLfloat) - 0.508134,
+       (GLfloat) 0.794672, (GLfloat) - 0.200225, (GLfloat) - 0.483385,
+       (GLfloat) 0.779498, (GLfloat) - 0.191534, (GLfloat) - 0.462404,
+       (GLfloat) 0.756788, (GLfloat) - 0.185727, (GLfloat) - 0.448385,
+       (GLfloat) 0.730000, (GLfloat) - 0.183688, (GLfloat) - 0.443462,
+       (GLfloat) 0.703212, (GLfloat) - 0.185727, (GLfloat) - 0.448385,
+       (GLfloat) 0.680503, (GLfloat) - 0.191534, (GLfloat) - 0.462404,
+       (GLfloat) 0.665328, (GLfloat) - 0.200225, (GLfloat) - 0.483385,
+       (GLfloat) 0.660000, (GLfloat) - 0.210476, (GLfloat) - 0.508134,
+       (GLfloat) 0.665328, (GLfloat) - 0.220727, (GLfloat) - 0.532882,
+       (GLfloat) 0.680503, (GLfloat) - 0.229418, (GLfloat) - 0.553863,
+       (GLfloat) 0.703212, (GLfloat) - 0.235225, (GLfloat) - 0.567882,
+       (GLfloat) 0.730000, (GLfloat) - 0.237264, (GLfloat) - 0.572805,
+       (GLfloat) 0.756788, (GLfloat) - 0.119916, (GLfloat) - 0.602861,
+       (GLfloat) 0.779498, (GLfloat) - 0.116956, (GLfloat) - 0.587978,
+       (GLfloat) 0.794672, (GLfloat) - 0.112526, (GLfloat) - 0.565705,
+       (GLfloat) 0.800000, (GLfloat) - 0.107300, (GLfloat) - 0.539432,
+       (GLfloat) 0.794672, (GLfloat) - 0.102074, (GLfloat) - 0.513159,
+       (GLfloat) 0.779498, (GLfloat) - 0.097643, (GLfloat) - 0.490885,
+       (GLfloat) 0.756788, (GLfloat) - 0.094683, (GLfloat) - 0.476003,
+       (GLfloat) 0.730000, (GLfloat) - 0.093643, (GLfloat) - 0.470777,
+       (GLfloat) 0.703212, (GLfloat) - 0.094683, (GLfloat) - 0.476003,
+       (GLfloat) 0.680503, (GLfloat) - 0.097643, (GLfloat) - 0.490885,
+       (GLfloat) 0.665328, (GLfloat) - 0.102074, (GLfloat) - 0.513159,
+       (GLfloat) 0.660000, (GLfloat) - 0.107300, (GLfloat) - 0.539432,
+       (GLfloat) 0.665328, (GLfloat) - 0.112526, (GLfloat) - 0.565705,
+       (GLfloat) 0.680503, (GLfloat) - 0.116956, (GLfloat) - 0.587978,
+       (GLfloat) 0.703212, (GLfloat) - 0.119916, (GLfloat) - 0.602861,
+       (GLfloat) 0.730000, (GLfloat) - 0.120956, (GLfloat) - 0.608087,
+       (GLfloat) 0.756788, (GLfloat) - 0.000000, (GLfloat) - 0.614672,
+       (GLfloat) 0.779498, (GLfloat) - 0.000000, (GLfloat) - 0.599497,
+       (GLfloat) 0.794672, (GLfloat) - 0.000000, (GLfloat) - 0.576788,
+       (GLfloat) 0.800000, (GLfloat) - 0.000000, (GLfloat) - 0.550000,
+       (GLfloat) 0.794672, (GLfloat) - 0.000000, (GLfloat) - 0.523212,
+       (GLfloat) 0.779498, (GLfloat) - 0.000000, (GLfloat) - 0.500503,
+       (GLfloat) 0.756788, (GLfloat) - 0.000000, (GLfloat) - 0.485328,
+       (GLfloat) 0.730000, (GLfloat) - 0.000000, (GLfloat) - 0.480000,
+       (GLfloat) 0.703212, (GLfloat) - 0.000000, (GLfloat) - 0.485328,
+       (GLfloat) 0.680503, (GLfloat) - 0.000000, (GLfloat) - 0.500503,
+       (GLfloat) 0.665328, (GLfloat) - 0.000000, (GLfloat) - 0.523212,
+       (GLfloat) 0.660000, (GLfloat) - 0.000000, (GLfloat) - 0.550000,
+       (GLfloat) 0.665328, (GLfloat) - 0.000000, (GLfloat) - 0.576788,
+       (GLfloat) 0.680503, (GLfloat) - 0.000000, (GLfloat) - 0.599497,
+       (GLfloat) 0.703212, (GLfloat) - 0.000000, (GLfloat) - 0.614672,
+       (GLfloat) 0.730000, (GLfloat) - 0.000000, (GLfloat) - 0.620000,
+       (GLfloat) 0.756788, (GLfloat) 0.119916, (GLfloat) - 0.602861,
+       (GLfloat) 0.779498, (GLfloat) 0.116956, (GLfloat) - 0.587978,
+       (GLfloat) 0.794672, (GLfloat) 0.112526, (GLfloat) - 0.565705,
+       (GLfloat) 0.800000, (GLfloat) 0.107300, (GLfloat) - 0.539432,
+       (GLfloat) 0.794672, (GLfloat) 0.102074, (GLfloat) - 0.513159,
+       (GLfloat) 0.779498, (GLfloat) 0.097643, (GLfloat) - 0.490886,
+       (GLfloat) 0.756788, (GLfloat) 0.094683, (GLfloat) - 0.476003,
+       (GLfloat) 0.730000, (GLfloat) 0.093643, (GLfloat) - 0.470777,
+       (GLfloat) 0.703212, (GLfloat) 0.094683, (GLfloat) - 0.476003,
+       (GLfloat) 0.680503, (GLfloat) 0.097643, (GLfloat) - 0.490886,
+       (GLfloat) 0.665328, (GLfloat) 0.102074, (GLfloat) - 0.513159,
+       (GLfloat) 0.660000, (GLfloat) 0.107300, (GLfloat) - 0.539432,
+       (GLfloat) 0.665328, (GLfloat) 0.112526, (GLfloat) - 0.565705,
+       (GLfloat) 0.680503, (GLfloat) 0.116956, (GLfloat) - 0.587978,
+       (GLfloat) 0.703212, (GLfloat) 0.119916, (GLfloat) - 0.602861,
+       (GLfloat) 0.730000, (GLfloat) 0.120956, (GLfloat) - 0.608087,
+       (GLfloat) 0.756788, (GLfloat) 0.235225, (GLfloat) - 0.567882,
+       (GLfloat) 0.779498, (GLfloat) 0.229418, (GLfloat) - 0.553863,
+       (GLfloat) 0.794672, (GLfloat) 0.220727, (GLfloat) - 0.532882,
+       (GLfloat) 0.800000, (GLfloat) 0.210476, (GLfloat) - 0.508134,
+       (GLfloat) 0.794672, (GLfloat) 0.200225, (GLfloat) - 0.483385,
+       (GLfloat) 0.779498, (GLfloat) 0.191534, (GLfloat) - 0.462404,
+       (GLfloat) 0.756788, (GLfloat) 0.185727, (GLfloat) - 0.448385,
+       (GLfloat) 0.730000, (GLfloat) 0.183688, (GLfloat) - 0.443462,
+       (GLfloat) 0.703212, (GLfloat) 0.185727, (GLfloat) - 0.448385,
+       (GLfloat) 0.680503, (GLfloat) 0.191534, (GLfloat) - 0.462404,
+       (GLfloat) 0.665328, (GLfloat) 0.200225, (GLfloat) - 0.483385,
+       (GLfloat) 0.660000, (GLfloat) 0.210476, (GLfloat) - 0.508134,
+       (GLfloat) 0.665328, (GLfloat) 0.220727, (GLfloat) - 0.532882,
+       (GLfloat) 0.680503, (GLfloat) 0.229418, (GLfloat) - 0.553863,
+       (GLfloat) 0.703212, (GLfloat) 0.235225, (GLfloat) - 0.567882,
+       (GLfloat) 0.730000, (GLfloat) 0.237264, (GLfloat) - 0.572805,
+       (GLfloat) 0.756788, (GLfloat) 0.341493, (GLfloat) - 0.511081,
+       (GLfloat) 0.779498, (GLfloat) 0.333063, (GLfloat) - 0.498464,
+       (GLfloat) 0.794672, (GLfloat) 0.320446, (GLfloat) - 0.479582,
+       (GLfloat) 0.800000, (GLfloat) 0.305564, (GLfloat) - 0.457308,
+       (GLfloat) 0.794672, (GLfloat) 0.290681, (GLfloat) - 0.435035,
+       (GLfloat) 0.779498, (GLfloat) 0.278064, (GLfloat) - 0.416153,
+       (GLfloat) 0.756788, (GLfloat) 0.269634, (GLfloat) - 0.403536,
+       (GLfloat) 0.730000, (GLfloat) 0.266674, (GLfloat) - 0.399105,
+       (GLfloat) 0.703212, (GLfloat) 0.269634, (GLfloat) - 0.403536,
+       (GLfloat) 0.680503, (GLfloat) 0.278064, (GLfloat) - 0.416153,
+       (GLfloat) 0.665328, (GLfloat) 0.290681, (GLfloat) - 0.435035,
+       (GLfloat) 0.660000, (GLfloat) 0.305564, (GLfloat) - 0.457308,
+       (GLfloat) 0.665328, (GLfloat) 0.320446, (GLfloat) - 0.479582,
+       (GLfloat) 0.680503, (GLfloat) 0.333063, (GLfloat) - 0.498464,
+       (GLfloat) 0.703212, (GLfloat) 0.341493, (GLfloat) - 0.511081,
+       (GLfloat) 0.730000, (GLfloat) 0.344454, (GLfloat) - 0.515511,
+       (GLfloat) 0.756788, (GLfloat) 0.434638, (GLfloat) - 0.434638,
+       (GLfloat) 0.779498, (GLfloat) 0.423909, (GLfloat) - 0.423909,
+       (GLfloat) 0.794672, (GLfloat) 0.407851, (GLfloat) - 0.407851,
+       (GLfloat) 0.800000, (GLfloat) 0.388909, (GLfloat) - 0.388909,
+       (GLfloat) 0.794672, (GLfloat) 0.369967, (GLfloat) - 0.369967,
+       (GLfloat) 0.779498, (GLfloat) 0.353909, (GLfloat) - 0.353909,
+       (GLfloat) 0.756788, (GLfloat) 0.343179, (GLfloat) - 0.343179,
+       (GLfloat) 0.730000, (GLfloat) 0.339411, (GLfloat) - 0.339411,
+       (GLfloat) 0.703212, (GLfloat) 0.343179, (GLfloat) - 0.343179,
+       (GLfloat) 0.680503, (GLfloat) 0.353909, (GLfloat) - 0.353909,
+       (GLfloat) 0.665328, (GLfloat) 0.369967, (GLfloat) - 0.369967,
+       (GLfloat) 0.660000, (GLfloat) 0.388909, (GLfloat) - 0.388909,
+       (GLfloat) 0.665328, (GLfloat) 0.407851, (GLfloat) - 0.407851,
+       (GLfloat) 0.680503, (GLfloat) 0.423909, (GLfloat) - 0.423909,
+       (GLfloat) 0.703212, (GLfloat) 0.434638, (GLfloat) - 0.434638,
+       (GLfloat) 0.730000, (GLfloat) 0.438406, (GLfloat) - 0.438406,
+       (GLfloat) 0.756788, (GLfloat) 0.511081, (GLfloat) - 0.341493,
+       (GLfloat) 0.779498, (GLfloat) 0.498464, (GLfloat) - 0.333063,
+       (GLfloat) 0.794672, (GLfloat) 0.479582, (GLfloat) - 0.320446,
+       (GLfloat) 0.800000, (GLfloat) 0.457308, (GLfloat) - 0.305564,
+       (GLfloat) 0.794672, (GLfloat) 0.435035, (GLfloat) - 0.290681,
+       (GLfloat) 0.779498, (GLfloat) 0.416153, (GLfloat) - 0.278064,
+       (GLfloat) 0.756788, (GLfloat) 0.403536, (GLfloat) - 0.269634,
+       (GLfloat) 0.730000, (GLfloat) 0.399105, (GLfloat) - 0.266674,
+       (GLfloat) 0.703212, (GLfloat) 0.403536, (GLfloat) - 0.269634,
+       (GLfloat) 0.680503, (GLfloat) 0.416153, (GLfloat) - 0.278064,
+       (GLfloat) 0.665328, (GLfloat) 0.435035, (GLfloat) - 0.290681,
+       (GLfloat) 0.660000, (GLfloat) 0.457308, (GLfloat) - 0.305564,
+       (GLfloat) 0.665328, (GLfloat) 0.479582, (GLfloat) - 0.320446,
+       (GLfloat) 0.680503, (GLfloat) 0.498464, (GLfloat) - 0.333063,
+       (GLfloat) 0.703212, (GLfloat) 0.511081, (GLfloat) - 0.341493,
+       (GLfloat) 0.730000, (GLfloat) 0.515511, (GLfloat) - 0.344454,
+       (GLfloat) 0.756788, (GLfloat) 0.567882, (GLfloat) - 0.235225,
+       (GLfloat) 0.779498, (GLfloat) 0.553863, (GLfloat) - 0.229418,
+       (GLfloat) 0.794672, (GLfloat) 0.532882, (GLfloat) - 0.220727,
+       (GLfloat) 0.800000, (GLfloat) 0.508134, (GLfloat) - 0.210476,
+       (GLfloat) 0.794672, (GLfloat) 0.483385, (GLfloat) - 0.200225,
+       (GLfloat) 0.779498, (GLfloat) 0.462404, (GLfloat) - 0.191534,
+       (GLfloat) 0.756788, (GLfloat) 0.448385, (GLfloat) - 0.185727,
+       (GLfloat) 0.730000, (GLfloat) 0.443462, (GLfloat) - 0.183688,
+       (GLfloat) 0.703212, (GLfloat) 0.448385, (GLfloat) - 0.185727,
+       (GLfloat) 0.680503, (GLfloat) 0.462404, (GLfloat) - 0.191534,
+       (GLfloat) 0.665328, (GLfloat) 0.483385, (GLfloat) - 0.200225,
+       (GLfloat) 0.660000, (GLfloat) 0.508134, (GLfloat) - 0.210476,
+       (GLfloat) 0.665328, (GLfloat) 0.532882, (GLfloat) - 0.220727,
+       (GLfloat) 0.680503, (GLfloat) 0.553863, (GLfloat) - 0.229418,
+       (GLfloat) 0.703212, (GLfloat) 0.567882, (GLfloat) - 0.235225,
+       (GLfloat) 0.730000, (GLfloat) 0.572805, (GLfloat) - 0.237264,
+       (GLfloat) 0.756788, (GLfloat) 0.602861, (GLfloat) - 0.119916,
+       (GLfloat) 0.779498, (GLfloat) 0.587978, (GLfloat) - 0.116956,
+       (GLfloat) 0.794672, (GLfloat) 0.565705, (GLfloat) - 0.112526,
+       (GLfloat) 0.800000, (GLfloat) 0.539432, (GLfloat) - 0.107300,
+       (GLfloat) 0.794672, (GLfloat) 0.513159, (GLfloat) - 0.102074,
+       (GLfloat) 0.779498, (GLfloat) 0.490885, (GLfloat) - 0.097643,
+       (GLfloat) 0.756788, (GLfloat) 0.476003, (GLfloat) - 0.094683,
+       (GLfloat) 0.730000, (GLfloat) 0.470777, (GLfloat) - 0.093643,
+       (GLfloat) 0.703212, (GLfloat) 0.476003, (GLfloat) - 0.094683,
+       (GLfloat) 0.680503, (GLfloat) 0.490885, (GLfloat) - 0.097643,
+       (GLfloat) 0.665328, (GLfloat) 0.513159, (GLfloat) - 0.102074,
+       (GLfloat) 0.660000, (GLfloat) 0.539432, (GLfloat) - 0.107300,
+       (GLfloat) 0.665328, (GLfloat) 0.565705, (GLfloat) - 0.112526,
+       (GLfloat) 0.680503, (GLfloat) 0.587978, (GLfloat) - 0.116956,
+       (GLfloat) 0.703212, (GLfloat) 0.602861, (GLfloat) - 0.119916,
+       (GLfloat) 0.730000, (GLfloat) 0.608087, (GLfloat) - 0.120956,
+       (GLfloat) 0.420000, (GLfloat) - 0.000000, (GLfloat) - 0.200000,
+       (GLfloat) 0.420000, (GLfloat) 0.051764, (GLfloat) - 0.193185,
+       (GLfloat) 0.420000, (GLfloat) 0.100000, (GLfloat) - 0.173205,
+       (GLfloat) 0.420000, (GLfloat) 0.141421, (GLfloat) - 0.141421,
+       (GLfloat) 0.420000, (GLfloat) 0.173205, (GLfloat) - 0.100000,
+       (GLfloat) 0.420000, (GLfloat) 0.193185, (GLfloat) - 0.051764,
+       (GLfloat) 0.420000, (GLfloat) 0.200000, (GLfloat) - 0.000000,
+       (GLfloat) 0.420000, (GLfloat) 0.193185, (GLfloat) 0.051764,
+       (GLfloat) 0.420000, (GLfloat) 0.173205, (GLfloat) 0.100000,
+       (GLfloat) 0.420000, (GLfloat) 0.141421, (GLfloat) 0.141421,
+       (GLfloat) 0.420000, (GLfloat) 0.100000, (GLfloat) 0.173205,
+       (GLfloat) 0.420000, (GLfloat) 0.051764, (GLfloat) 0.193185,
+       (GLfloat) 0.420000, (GLfloat) 0.000000, (GLfloat) 0.200000,
+       (GLfloat) 0.420000, (GLfloat) - 0.051764, (GLfloat) 0.193185,
+       (GLfloat) 0.420000, (GLfloat) - 0.100000, (GLfloat) 0.173205,
+       (GLfloat) 0.420000, (GLfloat) - 0.141421, (GLfloat) 0.141421,
+       (GLfloat) 0.420000, (GLfloat) - 0.173205, (GLfloat) 0.100000,
+       (GLfloat) 0.420000, (GLfloat) - 0.193185, (GLfloat) 0.051764,
+       (GLfloat) 0.420000, (GLfloat) - 0.200000, (GLfloat) 0.000000,
+       (GLfloat) 0.420000, (GLfloat) - 0.193185, (GLfloat) - 0.051764,
+       (GLfloat) 0.420000, (GLfloat) - 0.173205, (GLfloat) - 0.100000,
+       (GLfloat) 0.420000, (GLfloat) - 0.141421, (GLfloat) - 0.141421,
+       (GLfloat) 0.420000, (GLfloat) - 0.100000, (GLfloat) - 0.173205,
+       (GLfloat) 0.420000, (GLfloat) - 0.051764, (GLfloat) - 0.193185,
+       (GLfloat) 0.540000, (GLfloat) - 0.000000, (GLfloat) - 0.200000,
+       (GLfloat) 0.540000, (GLfloat) 0.051764, (GLfloat) - 0.193185,
+       (GLfloat) 0.540000, (GLfloat) 0.100000, (GLfloat) - 0.173205,
+       (GLfloat) 0.540000, (GLfloat) 0.141421, (GLfloat) - 0.141421,
+       (GLfloat) 0.540000, (GLfloat) 0.173205, (GLfloat) - 0.100000,
+       (GLfloat) 0.540000, (GLfloat) 0.193185, (GLfloat) - 0.051764,
+       (GLfloat) 0.540000, (GLfloat) 0.200000, (GLfloat) - 0.000000,
+       (GLfloat) 0.540000, (GLfloat) 0.193185, (GLfloat) 0.051764,
+       (GLfloat) 0.540000, (GLfloat) 0.173205, (GLfloat) 0.100000,
+       (GLfloat) 0.540000, (GLfloat) 0.141421, (GLfloat) 0.141421,
+       (GLfloat) 0.540000, (GLfloat) 0.100000, (GLfloat) 0.173205,
+       (GLfloat) 0.540000, (GLfloat) 0.051764, (GLfloat) 0.193185,
+       (GLfloat) 0.540000, (GLfloat) 0.000000, (GLfloat) 0.200000,
+       (GLfloat) 0.540000, (GLfloat) - 0.051764, (GLfloat) 0.193185,
+       (GLfloat) 0.540000, (GLfloat) - 0.100000, (GLfloat) 0.173205,
+       (GLfloat) 0.540000, (GLfloat) - 0.141421, (GLfloat) 0.141421,
+       (GLfloat) 0.540000, (GLfloat) - 0.173205, (GLfloat) 0.100000,
+       (GLfloat) 0.540000, (GLfloat) - 0.193185, (GLfloat) 0.051764,
+       (GLfloat) 0.540000, (GLfloat) - 0.200000, (GLfloat) 0.000000,
+       (GLfloat) 0.540000, (GLfloat) - 0.193185, (GLfloat) - 0.051764,
+       (GLfloat) 0.540000, (GLfloat) - 0.173205, (GLfloat) - 0.100000,
+       (GLfloat) 0.540000, (GLfloat) - 0.141421, (GLfloat) - 0.141421,
+       (GLfloat) 0.540000, (GLfloat) - 0.100000, (GLfloat) - 0.173205,
+       (GLfloat) 0.540000, (GLfloat) - 0.051764, (GLfloat) - 0.193185,
+       (GLfloat) 0.790000, (GLfloat) 0.060000, (GLfloat) - 0.000000,
+       (GLfloat) 0.785433, (GLfloat) 0.060000, (GLfloat) - 0.022961,
+       (GLfloat) 0.772426, (GLfloat) 0.060000, (GLfloat) - 0.042426,
+       (GLfloat) 0.752961, (GLfloat) 0.060000, (GLfloat) - 0.055433,
+       (GLfloat) 0.730000, (GLfloat) 0.060000, (GLfloat) - 0.060000,
+       (GLfloat) 0.707039, (GLfloat) 0.060000, (GLfloat) - 0.055433,
+       (GLfloat) 0.687574, (GLfloat) 0.060000, (GLfloat) - 0.042426,
+       (GLfloat) 0.674567, (GLfloat) 0.060000, (GLfloat) - 0.022961,
+       (GLfloat) 0.670000, (GLfloat) 0.060000, (GLfloat) - 0.000000,
+       (GLfloat) 0.674567, (GLfloat) 0.060000, (GLfloat) 0.022961,
+       (GLfloat) 0.687574, (GLfloat) 0.060000, (GLfloat) 0.042426,
+       (GLfloat) 0.707039, (GLfloat) 0.060000, (GLfloat) 0.055433,
+       (GLfloat) 0.730000, (GLfloat) 0.060000, (GLfloat) 0.060000,
+       (GLfloat) 0.752961, (GLfloat) 0.060000, (GLfloat) 0.055433,
+       (GLfloat) 0.772426, (GLfloat) 0.060000, (GLfloat) 0.042426,
+       (GLfloat) 0.785433, (GLfloat) 0.060000, (GLfloat) 0.022961,
+       (GLfloat) 0.790000, (GLfloat) 0.550000, (GLfloat) - 0.000000,
+       (GLfloat) 0.785433, (GLfloat) 0.550000, (GLfloat) - 0.022961,
+       (GLfloat) 0.772426, (GLfloat) 0.550000, (GLfloat) - 0.042426,
+       (GLfloat) 0.752961, (GLfloat) 0.550000, (GLfloat) - 0.055433,
+       (GLfloat) 0.730000, (GLfloat) 0.550000, (GLfloat) - 0.060000,
+       (GLfloat) 0.707039, (GLfloat) 0.550000, (GLfloat) - 0.055433,
+       (GLfloat) 0.687574, (GLfloat) 0.550000, (GLfloat) - 0.042426,
+       (GLfloat) 0.674567, (GLfloat) 0.550000, (GLfloat) - 0.022961,
+       (GLfloat) 0.670000, (GLfloat) 0.550000, (GLfloat) - 0.000000,
+       (GLfloat) 0.674567, (GLfloat) 0.550000, (GLfloat) 0.022961,
+       (GLfloat) 0.687574, (GLfloat) 0.550000, (GLfloat) 0.042426,
+       (GLfloat) 0.707039, (GLfloat) 0.550000, (GLfloat) 0.055433,
+       (GLfloat) 0.730000, (GLfloat) 0.550000, (GLfloat) 0.060000,
+       (GLfloat) 0.752961, (GLfloat) 0.550000, (GLfloat) 0.055433,
+       (GLfloat) 0.772426, (GLfloat) 0.550000, (GLfloat) 0.042426,
+       (GLfloat) 0.785433, (GLfloat) 0.550000, (GLfloat) 0.022961,
+       (GLfloat) 0.790000, (GLfloat) 0.000000, (GLfloat) 0.060000,
+       (GLfloat) 0.785433, (GLfloat) 0.022961, (GLfloat) 0.060000,
+       (GLfloat) 0.772426, (GLfloat) 0.042426, (GLfloat) 0.060000,
+       (GLfloat) 0.752961, (GLfloat) 0.055433, (GLfloat) 0.060000,
+       (GLfloat) 0.707039, (GLfloat) 0.055433, (GLfloat) 0.060000,
+       (GLfloat) 0.687574, (GLfloat) 0.042426, (GLfloat) 0.060000,
+       (GLfloat) 0.674567, (GLfloat) 0.022961, (GLfloat) 0.060000,
+       (GLfloat) 0.670000, (GLfloat) 0.000000, (GLfloat) 0.060000,
+       (GLfloat) 0.674567, (GLfloat) - 0.022961, (GLfloat) 0.060000,
+       (GLfloat) 0.687574, (GLfloat) - 0.042426, (GLfloat) 0.060000,
+       (GLfloat) 0.707039, (GLfloat) - 0.055433, (GLfloat) 0.060000,
+       (GLfloat) 0.730000, (GLfloat) - 0.060000, (GLfloat) 0.060000,
+       (GLfloat) 0.752961, (GLfloat) - 0.055433, (GLfloat) 0.060000,
+       (GLfloat) 0.772426, (GLfloat) - 0.042426, (GLfloat) 0.060000,
+       (GLfloat) 0.785433, (GLfloat) - 0.022961, (GLfloat) 0.060000,
+       (GLfloat) 0.790000, (GLfloat) 0.000000, (GLfloat) 0.550000,
+       (GLfloat) 0.785433, (GLfloat) 0.022961, (GLfloat) 0.550000,
+       (GLfloat) 0.772426, (GLfloat) 0.042426, (GLfloat) 0.550000,
+       (GLfloat) 0.752961, (GLfloat) 0.055433, (GLfloat) 0.550000,
+       (GLfloat) 0.730000, (GLfloat) 0.060000, (GLfloat) 0.550000,
+       (GLfloat) 0.707039, (GLfloat) 0.055433, (GLfloat) 0.550000,
+       (GLfloat) 0.687574, (GLfloat) 0.042426, (GLfloat) 0.550000,
+       (GLfloat) 0.674567, (GLfloat) 0.022961, (GLfloat) 0.550000,
+       (GLfloat) 0.670000, (GLfloat) 0.000000, (GLfloat) 0.550000,
+       (GLfloat) 0.674567, (GLfloat) - 0.022961, (GLfloat) 0.550000,
+       (GLfloat) 0.687574, (GLfloat) - 0.042426, (GLfloat) 0.550000,
+       (GLfloat) 0.707039, (GLfloat) - 0.055433, (GLfloat) 0.550000,
+       (GLfloat) 0.730000, (GLfloat) - 0.060000, (GLfloat) 0.550000,
+       (GLfloat) 0.752961, (GLfloat) - 0.055433, (GLfloat) 0.550000,
+       (GLfloat) 0.772426, (GLfloat) - 0.042426, (GLfloat) 0.550000,
+       (GLfloat) 0.785433, (GLfloat) - 0.022961, (GLfloat) 0.550000,
+       (GLfloat) 0.790000, (GLfloat) - 0.060000, (GLfloat) 0.000000,
+       (GLfloat) 0.785433, (GLfloat) - 0.060000, (GLfloat) 0.022961,
+       (GLfloat) 0.772426, (GLfloat) - 0.060000, (GLfloat) 0.042426,
+       (GLfloat) 0.752961, (GLfloat) - 0.060000, (GLfloat) 0.055433,
+       (GLfloat) 0.707039, (GLfloat) - 0.060000, (GLfloat) 0.055433,
+       (GLfloat) 0.687574, (GLfloat) - 0.060000, (GLfloat) 0.042426,
+       (GLfloat) 0.674567, (GLfloat) - 0.060000, (GLfloat) 0.022961,
+       (GLfloat) 0.670000, (GLfloat) - 0.060000, (GLfloat) 0.000000,
+       (GLfloat) 0.674567, (GLfloat) - 0.060000, (GLfloat) - 0.022961,
+       (GLfloat) 0.687574, (GLfloat) - 0.060000, (GLfloat) - 0.042426,
+       (GLfloat) 0.707039, (GLfloat) - 0.060000, (GLfloat) - 0.055433,
+       (GLfloat) 0.730000, (GLfloat) - 0.060000, (GLfloat) - 0.060000,
+       (GLfloat) 0.752961, (GLfloat) - 0.060000, (GLfloat) - 0.055433,
+       (GLfloat) 0.772426, (GLfloat) - 0.060000, (GLfloat) - 0.042426,
+       (GLfloat) 0.785433, (GLfloat) - 0.060000, (GLfloat) - 0.022961,
+       (GLfloat) 0.790000, (GLfloat) - 0.550000, (GLfloat) 0.000000,
+       (GLfloat) 0.785433, (GLfloat) - 0.550000, (GLfloat) 0.022961,
+       (GLfloat) 0.772426, (GLfloat) - 0.550000, (GLfloat) 0.042426,
+       (GLfloat) 0.752961, (GLfloat) - 0.550000, (GLfloat) 0.055433,
+       (GLfloat) 0.730000, (GLfloat) - 0.550000, (GLfloat) 0.060000,
+       (GLfloat) 0.707039, (GLfloat) - 0.550000, (GLfloat) 0.055433,
+       (GLfloat) 0.687574, (GLfloat) - 0.550000, (GLfloat) 0.042426,
+       (GLfloat) 0.674567, (GLfloat) - 0.550000, (GLfloat) 0.022961,
+       (GLfloat) 0.670000, (GLfloat) - 0.550000, (GLfloat) 0.000000,
+       (GLfloat) 0.674567, (GLfloat) - 0.550000, (GLfloat) - 0.022961,
+       (GLfloat) 0.687574, (GLfloat) - 0.550000, (GLfloat) - 0.042426,
+       (GLfloat) 0.707039, (GLfloat) - 0.550000, (GLfloat) - 0.055433,
+       (GLfloat) 0.730000, (GLfloat) - 0.550000, (GLfloat) - 0.060000,
+       (GLfloat) 0.752961, (GLfloat) - 0.550000, (GLfloat) - 0.055433,
+       (GLfloat) 0.772426, (GLfloat) - 0.550000, (GLfloat) - 0.042426,
+       (GLfloat) 0.785433, (GLfloat) - 0.550000, (GLfloat) - 0.022961,
+       (GLfloat) 0.790000, (GLfloat) - 0.000000, (GLfloat) - 0.060000,
+       (GLfloat) 0.785433, (GLfloat) - 0.022961, (GLfloat) - 0.060000,
+       (GLfloat) 0.772426, (GLfloat) - 0.042426, (GLfloat) - 0.060000,
+       (GLfloat) 0.752961, (GLfloat) - 0.055433, (GLfloat) - 0.060000,
+       (GLfloat) 0.707039, (GLfloat) - 0.055433, (GLfloat) - 0.060000,
+       (GLfloat) 0.687574, (GLfloat) - 0.042426, (GLfloat) - 0.060000,
+       (GLfloat) 0.674567, (GLfloat) - 0.022961, (GLfloat) - 0.060000,
+       (GLfloat) 0.670000, (GLfloat) - 0.000000, (GLfloat) - 0.060000,
+       (GLfloat) 0.674567, (GLfloat) 0.022961, (GLfloat) - 0.060000,
+       (GLfloat) 0.687574, (GLfloat) 0.042426, (GLfloat) - 0.060000,
+       (GLfloat) 0.707039, (GLfloat) 0.055433, (GLfloat) - 0.060000,
+       (GLfloat) 0.752961, (GLfloat) 0.055433, (GLfloat) - 0.060000,
+       (GLfloat) 0.772426, (GLfloat) 0.042426, (GLfloat) - 0.060000,
+       (GLfloat) 0.785433, (GLfloat) 0.022961, (GLfloat) - 0.060000,
+       (GLfloat) 0.790000, (GLfloat) - 0.000000, (GLfloat) - 0.550000,
+       (GLfloat) 0.785433, (GLfloat) - 0.022961, (GLfloat) - 0.550000,
+       (GLfloat) 0.772426, (GLfloat) - 0.042426, (GLfloat) - 0.550000,
+       (GLfloat) 0.752961, (GLfloat) - 0.055433, (GLfloat) - 0.550000,
+       (GLfloat) 0.730000, (GLfloat) - 0.060000, (GLfloat) - 0.550000,
+       (GLfloat) 0.707039, (GLfloat) - 0.055433, (GLfloat) - 0.550000,
+       (GLfloat) 0.687574, (GLfloat) - 0.042426, (GLfloat) - 0.550000,
+       (GLfloat) 0.674567, (GLfloat) - 0.022961, (GLfloat) - 0.550000,
+       (GLfloat) 0.670000, (GLfloat) - 0.000000, (GLfloat) - 0.550000,
+       (GLfloat) 0.674567, (GLfloat) 0.022961, (GLfloat) - 0.550000,
+       (GLfloat) 0.687574, (GLfloat) 0.042426, (GLfloat) - 0.550000,
+       (GLfloat) 0.707039, (GLfloat) 0.055433, (GLfloat) - 0.550000,
+       (GLfloat) 0.730000, (GLfloat) 0.060000, (GLfloat) - 0.550000,
+       (GLfloat) 0.752961, (GLfloat) 0.055433, (GLfloat) - 0.550000,
+       (GLfloat) 0.772426, (GLfloat) 0.042426, (GLfloat) - 0.550000,
+       (GLfloat) 0.785433, (GLfloat) 0.022961, (GLfloat) - 0.550000,
+       (GLfloat) 0.540000, (GLfloat) 0.000000, (GLfloat) - 0.100000,
+       (GLfloat) 0.540000, (GLfloat) 0.038268, (GLfloat) - 0.092388,
+       (GLfloat) 0.540000, (GLfloat) 0.070711, (GLfloat) - 0.070711,
+       (GLfloat) 0.540000, (GLfloat) 0.092388, (GLfloat) - 0.038268,
+       (GLfloat) 0.540000, (GLfloat) 0.100000, (GLfloat) - 0.000000,
+       (GLfloat) 0.540000, (GLfloat) 0.092388, (GLfloat) 0.038268,
+       (GLfloat) 0.540000, (GLfloat) 0.070711, (GLfloat) 0.070711,
+       (GLfloat) 0.540000, (GLfloat) 0.038268, (GLfloat) 0.092388,
+       (GLfloat) 0.540000, (GLfloat) 0.000000, (GLfloat) 0.100000,
+       (GLfloat) 0.540000, (GLfloat) - 0.038268, (GLfloat) 0.092388,
+       (GLfloat) 0.540000, (GLfloat) - 0.070711, (GLfloat) 0.070711,
+       (GLfloat) 0.540000, (GLfloat) - 0.092388, (GLfloat) 0.038268,
+       (GLfloat) 0.540000, (GLfloat) - 0.100000, (GLfloat) 0.000000,
+       (GLfloat) 0.540000, (GLfloat) - 0.092388, (GLfloat) - 0.038268,
+       (GLfloat) 0.540000, (GLfloat) - 0.070711, (GLfloat) - 0.070711,
+       (GLfloat) 0.540000, (GLfloat) - 0.038268, (GLfloat) - 0.092388,
+       (GLfloat) 0.800000, (GLfloat) 0.000000, (GLfloat) - 0.100000,
+       (GLfloat) 0.800000, (GLfloat) 0.038268, (GLfloat) - 0.092388,
+       (GLfloat) 0.800000, (GLfloat) 0.070711, (GLfloat) - 0.070711,
+       (GLfloat) 0.800000, (GLfloat) 0.092388, (GLfloat) - 0.038268,
+       (GLfloat) 0.800000, (GLfloat) 0.100000, (GLfloat) - 0.000000,
+       (GLfloat) 0.800000, (GLfloat) 0.092388, (GLfloat) 0.038268,
+       (GLfloat) 0.800000, (GLfloat) 0.070711, (GLfloat) 0.070711,
+       (GLfloat) 0.800000, (GLfloat) 0.038268, (GLfloat) 0.092388,
+       (GLfloat) 0.800000, (GLfloat) 0.000000, (GLfloat) 0.100000,
+       (GLfloat) 0.800000, (GLfloat) - 0.038268, (GLfloat) 0.092388,
+       (GLfloat) 0.800000, (GLfloat) - 0.070711, (GLfloat) 0.070711,
+       (GLfloat) 0.800000, (GLfloat) - 0.092388, (GLfloat) 0.038268,
+       (GLfloat) 0.800000, (GLfloat) - 0.100000, (GLfloat) 0.000000,
+       (GLfloat) 0.800000, (GLfloat) - 0.092388, (GLfloat) - 0.038268,
+       (GLfloat) 0.800000, (GLfloat) - 0.070711, (GLfloat) - 0.070711,
+       (GLfloat) 0.800000, (GLfloat) - 0.038268, (GLfloat) - 0.092388,
+};
+
+static GLfloat BigValve_normals[] =
+{
+       (GLfloat) - 1.000000, (GLfloat) 0.000000, (GLfloat) - 0.000000,
+       (GLfloat) - 0.000000, (GLfloat) 0.195090, (GLfloat) - 0.980785,
+       (GLfloat) - 0.000000, (GLfloat) 0.555570, (GLfloat) - 0.831470,
+       (GLfloat) - 0.000000, (GLfloat) 0.831470, (GLfloat) - 0.555570,
+       (GLfloat) - 0.000000, (GLfloat) 0.980785, (GLfloat) - 0.195090,
+       (GLfloat) - 0.000000, (GLfloat) 0.980785, (GLfloat) 0.195090,
+       (GLfloat) - 0.000000, (GLfloat) 0.831470, (GLfloat) 0.555570,
+       (GLfloat) - 0.000000, (GLfloat) 0.555570, (GLfloat) 0.831470,
+       (GLfloat) - 0.000000, (GLfloat) 0.195090, (GLfloat) 0.980785,
+       (GLfloat) - 0.000000, (GLfloat) - 0.195090, (GLfloat) 0.980785,
+       (GLfloat) - 0.000000, (GLfloat) - 0.555570, (GLfloat) 0.831470,
+       (GLfloat) - 0.000000, (GLfloat) - 0.831470, (GLfloat) 0.555570,
+       (GLfloat) - 0.000000, (GLfloat) - 0.980785, (GLfloat) 0.195090,
+       (GLfloat) 0.000000, (GLfloat) - 0.980785, (GLfloat) - 0.195090,
+       (GLfloat) 0.000000, (GLfloat) - 0.831470, (GLfloat) - 0.555570,
+       (GLfloat) 0.000000, (GLfloat) - 0.555570, (GLfloat) - 0.831470,
+       (GLfloat) 0.000000, (GLfloat) - 0.195090, (GLfloat) - 0.980785,
+       (GLfloat) 1.000000, (GLfloat) 0.000000, (GLfloat) - 0.000000,
+       (GLfloat) 0.980785, (GLfloat) - 0.195092, (GLfloat) - 0.000000,
+       (GLfloat) 0.831470, (GLfloat) - 0.555569, (GLfloat) - 0.000000,
+       (GLfloat) 0.555569, (GLfloat) - 0.831470, (GLfloat) - 0.000000,
+       (GLfloat) 0.195091, (GLfloat) - 0.980785, (GLfloat) - 0.000000,
+       (GLfloat) - 0.195090, (GLfloat) - 0.980785, (GLfloat) - 0.000000,
+       (GLfloat) - 0.555570, (GLfloat) - 0.831469, (GLfloat) - 0.000000,
+       (GLfloat) - 0.831469, (GLfloat) - 0.555571, (GLfloat) - 0.000000,
+       (GLfloat) - 0.980785, (GLfloat) - 0.195089, (GLfloat) 0.000000,
+       (GLfloat) - 0.980785, (GLfloat) 0.195089, (GLfloat) - 0.000000,
+       (GLfloat) - 0.831469, (GLfloat) 0.555571, (GLfloat) - 0.000000,
+       (GLfloat) - 0.555570, (GLfloat) 0.831469, (GLfloat) - 0.000000,
+       (GLfloat) - 0.195090, (GLfloat) 0.980785, (GLfloat) - 0.000000,
+       (GLfloat) 0.195091, (GLfloat) 0.980785, (GLfloat) 0.000000,
+       (GLfloat) 0.555569, (GLfloat) 0.831470, (GLfloat) 0.000000,
+       (GLfloat) 0.831470, (GLfloat) 0.555569, (GLfloat) 0.000000,
+       (GLfloat) 0.980785, (GLfloat) 0.195092, (GLfloat) - 0.000000,
+       (GLfloat) 0.980785, (GLfloat) 0.000000, (GLfloat) 0.195092,
+       (GLfloat) 0.831470, (GLfloat) 0.000000, (GLfloat) 0.555569,
+       (GLfloat) 0.555569, (GLfloat) 0.000000, (GLfloat) 0.831470,
+       (GLfloat) 0.195091, (GLfloat) 0.000000, (GLfloat) 0.980785,
+       (GLfloat) - 0.195090, (GLfloat) 0.000000, (GLfloat) 0.980785,
+       (GLfloat) - 0.555570, (GLfloat) 0.000000, (GLfloat) 0.831469,
+       (GLfloat) - 0.831469, (GLfloat) 0.000000, (GLfloat) 0.555571,
+       (GLfloat) - 0.980785, (GLfloat) 0.000000, (GLfloat) 0.195089,
+       (GLfloat) - 0.980785, (GLfloat) - 0.000000, (GLfloat) - 0.195089,
+       (GLfloat) - 0.831469, (GLfloat) - 0.000000, (GLfloat) - 0.555571,
+       (GLfloat) - 0.555570, (GLfloat) - 0.000000, (GLfloat) - 0.831469,
+       (GLfloat) - 0.195090, (GLfloat) - 0.000000, (GLfloat) - 0.980785,
+       (GLfloat) 0.195091, (GLfloat) 0.000000, (GLfloat) - 0.980785,
+       (GLfloat) 0.555569, (GLfloat) 0.000000, (GLfloat) - 0.831470,
+       (GLfloat) 0.831470, (GLfloat) 0.000000, (GLfloat) - 0.555569,
+       (GLfloat) 0.980785, (GLfloat) - 0.000000, (GLfloat) - 0.195092,
+       (GLfloat) 0.980785, (GLfloat) 0.195092, (GLfloat) - 0.000000,
+       (GLfloat) 0.831470, (GLfloat) 0.555569, (GLfloat) - 0.000000,
+       (GLfloat) 0.555569, (GLfloat) 0.831470, (GLfloat) - 0.000000,
+       (GLfloat) 0.195091, (GLfloat) 0.980785, (GLfloat) - 0.000000,
+       (GLfloat) - 0.195090, (GLfloat) 0.980785, (GLfloat) - 0.000000,
+       (GLfloat) - 0.555570, (GLfloat) 0.831469, (GLfloat) - 0.000000,
+       (GLfloat) - 0.831469, (GLfloat) 0.555571, (GLfloat) - 0.000000,
+       (GLfloat) - 0.980785, (GLfloat) 0.195089, (GLfloat) - 0.000000,
+       (GLfloat) - 0.980785, (GLfloat) - 0.195089, (GLfloat) 0.000000,
+       (GLfloat) - 0.831469, (GLfloat) - 0.555571, (GLfloat) 0.000000,
+       (GLfloat) - 0.555570, (GLfloat) - 0.831469, (GLfloat) 0.000000,
+       (GLfloat) - 0.195090, (GLfloat) - 0.980785, (GLfloat) 0.000000,
+       (GLfloat) 0.195091, (GLfloat) - 0.980785, (GLfloat) - 0.000000,
+       (GLfloat) 0.555569, (GLfloat) - 0.831470, (GLfloat) - 0.000000,
+       (GLfloat) 0.831470, (GLfloat) - 0.555569, (GLfloat) - 0.000000,
+       (GLfloat) 0.980785, (GLfloat) - 0.195092, (GLfloat) 0.000000,
+       (GLfloat) 0.980785, (GLfloat) 0.000000, (GLfloat) - 0.195092,
+       (GLfloat) 0.831470, (GLfloat) 0.000000, (GLfloat) - 0.555569,
+       (GLfloat) 0.555569, (GLfloat) 0.000000, (GLfloat) - 0.831470,
+       (GLfloat) 0.195091, (GLfloat) 0.000000, (GLfloat) - 0.980785,
+       (GLfloat) - 0.195090, (GLfloat) 0.000000, (GLfloat) - 0.980785,
+       (GLfloat) - 0.555570, (GLfloat) 0.000000, (GLfloat) - 0.831469,
+       (GLfloat) - 0.831469, (GLfloat) 0.000000, (GLfloat) - 0.555571,
+       (GLfloat) - 0.980785, (GLfloat) 0.000000, (GLfloat) - 0.195089,
+       (GLfloat) - 0.980785, (GLfloat) 0.000000, (GLfloat) 0.195089,
+       (GLfloat) - 0.831469, (GLfloat) 0.000000, (GLfloat) 0.555571,
+       (GLfloat) - 0.555570, (GLfloat) 0.000000, (GLfloat) 0.831469,
+       (GLfloat) - 0.195090, (GLfloat) 0.000000, (GLfloat) 0.980785,
+       (GLfloat) 0.195091, (GLfloat) - 0.000000, (GLfloat) 0.980785,
+       (GLfloat) 0.555569, (GLfloat) - 0.000000, (GLfloat) 0.831470,
+       (GLfloat) 0.831470, (GLfloat) - 0.000000, (GLfloat) 0.555569,
+       (GLfloat) 0.980785, (GLfloat) - 0.000000, (GLfloat) 0.195092,
+       (GLfloat) - 1.000000, (GLfloat) 0.000000, (GLfloat) - 0.000000,
+       (GLfloat) - 0.000000, (GLfloat) 0.130526, (GLfloat) - 0.991445,
+       (GLfloat) - 0.000000, (GLfloat) 0.382684, (GLfloat) - 0.923880,
+       (GLfloat) - 0.000000, (GLfloat) 0.608761, (GLfloat) - 0.793353,
+       (GLfloat) - 0.000000, (GLfloat) 0.793353, (GLfloat) - 0.608761,
+       (GLfloat) - 0.000000, (GLfloat) 0.923880, (GLfloat) - 0.382684,
+       (GLfloat) - 0.000000, (GLfloat) 0.991445, (GLfloat) - 0.130526,
+       (GLfloat) - 0.000000, (GLfloat) 0.991445, (GLfloat) 0.130526,
+       (GLfloat) - 0.000000, (GLfloat) 0.923880, (GLfloat) 0.382684,
+       (GLfloat) - 0.000000, (GLfloat) 0.793353, (GLfloat) 0.608761,
+       (GLfloat) - 0.000000, (GLfloat) 0.608761, (GLfloat) 0.793353,
+       (GLfloat) - 0.000000, (GLfloat) 0.382684, (GLfloat) 0.923880,
+       (GLfloat) - 0.000000, (GLfloat) 0.130526, (GLfloat) 0.991445,
+       (GLfloat) - 0.000000, (GLfloat) - 0.130526, (GLfloat) 0.991445,
+       (GLfloat) - 0.000000, (GLfloat) - 0.382684, (GLfloat) 0.923880,
+       (GLfloat) - 0.000000, (GLfloat) - 0.608761, (GLfloat) 0.793353,
+       (GLfloat) - 0.000000, (GLfloat) - 0.793353, (GLfloat) 0.608761,
+       (GLfloat) - 0.000000, (GLfloat) - 0.923880, (GLfloat) 0.382684,
+       (GLfloat) - 0.000000, (GLfloat) - 0.991445, (GLfloat) 0.130526,
+       (GLfloat) 0.000000, (GLfloat) - 0.991445, (GLfloat) - 0.130526,
+       (GLfloat) 0.000000, (GLfloat) - 0.923880, (GLfloat) - 0.382684,
+       (GLfloat) 0.000000, (GLfloat) - 0.793353, (GLfloat) - 0.608761,
+       (GLfloat) 0.000000, (GLfloat) - 0.608761, (GLfloat) - 0.793353,
+       (GLfloat) 0.000000, (GLfloat) - 0.382684, (GLfloat) - 0.923880,
+       (GLfloat) 0.000000, (GLfloat) - 0.130526, (GLfloat) - 0.991445,
+       (GLfloat) 1.000000, (GLfloat) 0.000000, (GLfloat) - 0.000000,
+       (GLfloat) 0.194185, (GLfloat) 0.976241, (GLfloat) 0.096151,
+       (GLfloat) - 0.194185, (GLfloat) 0.976241, (GLfloat) 0.096151,
+       (GLfloat) - 0.553718, (GLfloat) 0.828695, (GLfloat) 0.081619,
+       (GLfloat) - 0.830228, (GLfloat) 0.554740, (GLfloat) 0.054637,
+       (GLfloat) - 0.980604, (GLfloat) 0.195054, (GLfloat) 0.019211,
+       (GLfloat) - 0.980605, (GLfloat) - 0.195053, (GLfloat) - 0.019211,
+       (GLfloat) - 0.830227, (GLfloat) - 0.554741, (GLfloat) - 0.054637,
+       (GLfloat) - 0.553717, (GLfloat) - 0.828695, (GLfloat) - 0.081619,
+       (GLfloat) - 0.194187, (GLfloat) - 0.976241, (GLfloat) - 0.096151,
+       (GLfloat) 0.194188, (GLfloat) - 0.976241, (GLfloat) - 0.096151,
+       (GLfloat) 0.553716, (GLfloat) - 0.828696, (GLfloat) - 0.081619,
+       (GLfloat) 0.830227, (GLfloat) - 0.554741, (GLfloat) - 0.054637,
+       (GLfloat) 0.980604, (GLfloat) - 0.195053, (GLfloat) - 0.019211,
+       (GLfloat) 0.980604, (GLfloat) 0.195054, (GLfloat) 0.019211,
+       (GLfloat) 0.830228, (GLfloat) 0.554740, (GLfloat) 0.054637,
+       (GLfloat) 0.553717, (GLfloat) 0.828695, (GLfloat) 0.081619,
+       (GLfloat) 0.194186, (GLfloat) 0.938725, (GLfloat) 0.284759,
+       (GLfloat) - 0.194185, (GLfloat) 0.938725, (GLfloat) 0.284759,
+       (GLfloat) - 0.553717, (GLfloat) 0.796849, (GLfloat) 0.241721,
+       (GLfloat) - 0.830228, (GLfloat) 0.533421, (GLfloat) 0.161812,
+       (GLfloat) - 0.980604, (GLfloat) 0.187558, (GLfloat) 0.056895,
+       (GLfloat) - 0.980604, (GLfloat) - 0.187558, (GLfloat) - 0.056895,
+       (GLfloat) - 0.830227, (GLfloat) - 0.533422, (GLfloat) - 0.161812,
+       (GLfloat) - 0.553717, (GLfloat) - 0.796849, (GLfloat) - 0.241722,
+       (GLfloat) - 0.194186, (GLfloat) - 0.938725, (GLfloat) - 0.284759,
+       (GLfloat) 0.194187, (GLfloat) - 0.938724, (GLfloat) - 0.284759,
+       (GLfloat) 0.553716, (GLfloat) - 0.796849, (GLfloat) - 0.241722,
+       (GLfloat) 0.830227, (GLfloat) - 0.533422, (GLfloat) - 0.161812,
+       (GLfloat) 0.980604, (GLfloat) - 0.187558, (GLfloat) - 0.056895,
+       (GLfloat) 0.980604, (GLfloat) 0.187558, (GLfloat) 0.056895,
+       (GLfloat) 0.830228, (GLfloat) 0.533421, (GLfloat) 0.161811,
+       (GLfloat) 0.553716, (GLfloat) 0.796850, (GLfloat) 0.241722,
+       (GLfloat) 0.194186, (GLfloat) 0.865134, (GLfloat) 0.462423,
+       (GLfloat) - 0.194185, (GLfloat) 0.865134, (GLfloat) 0.462424,
+       (GLfloat) - 0.553717, (GLfloat) 0.734380, (GLfloat) 0.392534,
+       (GLfloat) - 0.830228, (GLfloat) 0.491604, (GLfloat) 0.262768,
+       (GLfloat) - 0.980604, (GLfloat) 0.172854, (GLfloat) 0.092393,
+       (GLfloat) - 0.980604, (GLfloat) - 0.172854, (GLfloat) - 0.092393,
+       (GLfloat) - 0.830227, (GLfloat) - 0.491605, (GLfloat) - 0.262768,
+       (GLfloat) - 0.553717, (GLfloat) - 0.734380, (GLfloat) - 0.392534,
+       (GLfloat) - 0.194187, (GLfloat) - 0.865134, (GLfloat) - 0.462424,
+       (GLfloat) 0.194187, (GLfloat) - 0.865134, (GLfloat) - 0.462423,
+       (GLfloat) 0.553716, (GLfloat) - 0.734381, (GLfloat) - 0.392534,
+       (GLfloat) 0.830227, (GLfloat) - 0.491605, (GLfloat) - 0.262768,
+       (GLfloat) 0.980604, (GLfloat) - 0.172854, (GLfloat) - 0.092393,
+       (GLfloat) 0.980604, (GLfloat) 0.172854, (GLfloat) 0.092393,
+       (GLfloat) 0.830228, (GLfloat) 0.491604, (GLfloat) 0.262768,
+       (GLfloat) 0.553716, (GLfloat) 0.734381, (GLfloat) 0.392535,
+       (GLfloat) 0.194186, (GLfloat) 0.758296, (GLfloat) 0.622317,
+       (GLfloat) - 0.194186, (GLfloat) 0.758296, (GLfloat) 0.622318,
+       (GLfloat) - 0.553717, (GLfloat) 0.643690, (GLfloat) 0.528263,
+       (GLfloat) - 0.830228, (GLfloat) 0.430895, (GLfloat) 0.353626,
+       (GLfloat) - 0.980604, (GLfloat) 0.151508, (GLfloat) 0.124340,
+       (GLfloat) - 0.980604, (GLfloat) - 0.151508, (GLfloat) - 0.124339,
+       (GLfloat) - 0.830227, (GLfloat) - 0.430895, (GLfloat) - 0.353627,
+       (GLfloat) - 0.553717, (GLfloat) - 0.643690, (GLfloat) - 0.528263,
+       (GLfloat) - 0.194186, (GLfloat) - 0.758296, (GLfloat) - 0.622317,
+       (GLfloat) 0.194186, (GLfloat) - 0.758296, (GLfloat) - 0.622318,
+       (GLfloat) 0.553716, (GLfloat) - 0.643690, (GLfloat) - 0.528263,
+       (GLfloat) 0.830227, (GLfloat) - 0.430895, (GLfloat) - 0.353627,
+       (GLfloat) 0.980604, (GLfloat) - 0.151508, (GLfloat) - 0.124339,
+       (GLfloat) 0.980604, (GLfloat) 0.151508, (GLfloat) 0.124340,
+       (GLfloat) 0.830228, (GLfloat) 0.430895, (GLfloat) 0.353626,
+       (GLfloat) 0.553716, (GLfloat) 0.643690, (GLfloat) 0.528263,
+       (GLfloat) 0.194186, (GLfloat) 0.622317, (GLfloat) 0.758296,
+       (GLfloat) - 0.194185, (GLfloat) 0.622318, (GLfloat) 0.758296,
+       (GLfloat) - 0.553717, (GLfloat) 0.528263, (GLfloat) 0.643690,
+       (GLfloat) - 0.830228, (GLfloat) 0.353626, (GLfloat) 0.430895,
+       (GLfloat) - 0.980604, (GLfloat) 0.124339, (GLfloat) 0.151508,
+       (GLfloat) - 0.980604, (GLfloat) - 0.124339, (GLfloat) - 0.151508,
+       (GLfloat) - 0.830227, (GLfloat) - 0.353627, (GLfloat) - 0.430895,
+       (GLfloat) - 0.553717, (GLfloat) - 0.528262, (GLfloat) - 0.643689,
+       (GLfloat) - 0.194187, (GLfloat) - 0.622317, (GLfloat) - 0.758296,
+       (GLfloat) 0.194187, (GLfloat) - 0.622317, (GLfloat) - 0.758296,
+       (GLfloat) 0.553716, (GLfloat) - 0.528263, (GLfloat) - 0.643690,
+       (GLfloat) 0.830227, (GLfloat) - 0.353627, (GLfloat) - 0.430895,
+       (GLfloat) 0.980604, (GLfloat) - 0.124339, (GLfloat) - 0.151508,
+       (GLfloat) 0.980604, (GLfloat) 0.124340, (GLfloat) 0.151508,
+       (GLfloat) 0.830228, (GLfloat) 0.353626, (GLfloat) 0.430895,
+       (GLfloat) 0.553716, (GLfloat) 0.528263, (GLfloat) 0.643690,
+       (GLfloat) 0.194186, (GLfloat) 0.462423, (GLfloat) 0.865134,
+       (GLfloat) - 0.194185, (GLfloat) 0.462424, (GLfloat) 0.865134,
+       (GLfloat) - 0.553717, (GLfloat) 0.392534, (GLfloat) 0.734380,
+       (GLfloat) - 0.830228, (GLfloat) 0.262768, (GLfloat) 0.491604,
+       (GLfloat) - 0.980604, (GLfloat) 0.092393, (GLfloat) 0.172855,
+       (GLfloat) - 0.980604, (GLfloat) - 0.092392, (GLfloat) - 0.172854,
+       (GLfloat) - 0.830227, (GLfloat) - 0.262768, (GLfloat) - 0.491605,
+       (GLfloat) - 0.553717, (GLfloat) - 0.392534, (GLfloat) - 0.734380,
+       (GLfloat) - 0.194186, (GLfloat) - 0.462424, (GLfloat) - 0.865134,
+       (GLfloat) 0.194187, (GLfloat) - 0.462423, (GLfloat) - 0.865134,
+       (GLfloat) 0.553716, (GLfloat) - 0.392535, (GLfloat) - 0.734381,
+       (GLfloat) 0.830227, (GLfloat) - 0.262768, (GLfloat) - 0.491605,
+       (GLfloat) 0.980604, (GLfloat) - 0.092392, (GLfloat) - 0.172854,
+       (GLfloat) 0.980604, (GLfloat) 0.092393, (GLfloat) 0.172855,
+       (GLfloat) 0.830228, (GLfloat) 0.262768, (GLfloat) 0.491604,
+       (GLfloat) 0.553716, (GLfloat) 0.392535, (GLfloat) 0.734381,
+       (GLfloat) 0.194185, (GLfloat) 0.284759, (GLfloat) 0.938725,
+       (GLfloat) - 0.194185, (GLfloat) 0.284759, (GLfloat) 0.938725,
+       (GLfloat) - 0.553718, (GLfloat) 0.241721, (GLfloat) 0.796848,
+       (GLfloat) - 0.830228, (GLfloat) 0.161812, (GLfloat) 0.533422,
+       (GLfloat) - 0.980604, (GLfloat) 0.056895, (GLfloat) 0.187558,
+       (GLfloat) - 0.980604, (GLfloat) - 0.056895, (GLfloat) - 0.187558,
+       (GLfloat) - 0.830227, (GLfloat) - 0.161812, (GLfloat) - 0.533423,
+       (GLfloat) - 0.553717, (GLfloat) - 0.241722, (GLfloat) - 0.796849,
+       (GLfloat) - 0.194187, (GLfloat) - 0.284759, (GLfloat) - 0.938725,
+       (GLfloat) 0.194188, (GLfloat) - 0.284759, (GLfloat) - 0.938724,
+       (GLfloat) 0.553716, (GLfloat) - 0.241722, (GLfloat) - 0.796849,
+       (GLfloat) 0.830227, (GLfloat) - 0.161812, (GLfloat) - 0.533423,
+       (GLfloat) 0.980604, (GLfloat) - 0.056895, (GLfloat) - 0.187557,
+       (GLfloat) 0.980604, (GLfloat) 0.056895, (GLfloat) 0.187558,
+       (GLfloat) 0.830228, (GLfloat) 0.161812, (GLfloat) 0.533422,
+       (GLfloat) 0.553717, (GLfloat) 0.241722, (GLfloat) 0.796849,
+       (GLfloat) 0.194186, (GLfloat) 0.096151, (GLfloat) 0.976241,
+       (GLfloat) - 0.194186, (GLfloat) 0.096151, (GLfloat) 0.976241,
+       (GLfloat) - 0.553717, (GLfloat) 0.081619, (GLfloat) 0.828695,
+       (GLfloat) - 0.830228, (GLfloat) 0.054637, (GLfloat) 0.554740,
+       (GLfloat) - 0.980604, (GLfloat) 0.019211, (GLfloat) 0.195054,
+       (GLfloat) - 0.980604, (GLfloat) - 0.019211, (GLfloat) - 0.195054,
+       (GLfloat) - 0.830227, (GLfloat) - 0.054637, (GLfloat) - 0.554741,
+       (GLfloat) - 0.553717, (GLfloat) - 0.081619, (GLfloat) - 0.828695,
+       (GLfloat) - 0.194187, (GLfloat) - 0.096151, (GLfloat) - 0.976241,
+       (GLfloat) 0.194187, (GLfloat) - 0.096151, (GLfloat) - 0.976241,
+       (GLfloat) 0.553716, (GLfloat) - 0.081619, (GLfloat) - 0.828696,
+       (GLfloat) 0.830227, (GLfloat) - 0.054637, (GLfloat) - 0.554741,
+       (GLfloat) 0.980604, (GLfloat) - 0.019211, (GLfloat) - 0.195054,
+       (GLfloat) 0.980604, (GLfloat) 0.019211, (GLfloat) 0.195054,
+       (GLfloat) 0.830228, (GLfloat) 0.054637, (GLfloat) 0.554740,
+       (GLfloat) 0.553716, (GLfloat) 0.081619, (GLfloat) 0.828696,
+       (GLfloat) 0.194185, (GLfloat) - 0.096151, (GLfloat) 0.976241,
+       (GLfloat) - 0.194185, (GLfloat) - 0.096151, (GLfloat) 0.976241,
+       (GLfloat) - 0.553718, (GLfloat) - 0.081619, (GLfloat) 0.828695,
+       (GLfloat) - 0.830228, (GLfloat) - 0.054637, (GLfloat) 0.554740,
+       (GLfloat) - 0.980604, (GLfloat) - 0.019211, (GLfloat) 0.195054,
+       (GLfloat) - 0.980605, (GLfloat) 0.019211, (GLfloat) - 0.195053,
+       (GLfloat) - 0.830227, (GLfloat) 0.054637, (GLfloat) - 0.554741,
+       (GLfloat) - 0.553717, (GLfloat) 0.081619, (GLfloat) - 0.828695,
+       (GLfloat) - 0.194187, (GLfloat) 0.096151, (GLfloat) - 0.976241,
+       (GLfloat) 0.194188, (GLfloat) 0.096151, (GLfloat) - 0.976241,
+       (GLfloat) 0.553716, (GLfloat) 0.081619, (GLfloat) - 0.828696,
+       (GLfloat) 0.830227, (GLfloat) 0.054637, (GLfloat) - 0.554741,
+       (GLfloat) 0.980604, (GLfloat) 0.019211, (GLfloat) - 0.195053,
+       (GLfloat) 0.980604, (GLfloat) - 0.019211, (GLfloat) 0.195054,
+       (GLfloat) 0.830228, (GLfloat) - 0.054637, (GLfloat) 0.554740,
+       (GLfloat) 0.553717, (GLfloat) - 0.081619, (GLfloat) 0.828695,
+       (GLfloat) 0.194186, (GLfloat) - 0.284759, (GLfloat) 0.938725,
+       (GLfloat) - 0.194185, (GLfloat) - 0.284759, (GLfloat) 0.938725,
+       (GLfloat) - 0.553717, (GLfloat) - 0.241721, (GLfloat) 0.796849,
+       (GLfloat) - 0.830228, (GLfloat) - 0.161812, (GLfloat) 0.533421,
+       (GLfloat) - 0.980604, (GLfloat) - 0.056895, (GLfloat) 0.187558,
+       (GLfloat) - 0.980604, (GLfloat) 0.056895, (GLfloat) - 0.187558,
+       (GLfloat) - 0.830227, (GLfloat) 0.161812, (GLfloat) - 0.533422,
+       (GLfloat) - 0.553717, (GLfloat) 0.241722, (GLfloat) - 0.796849,
+       (GLfloat) - 0.194186, (GLfloat) 0.284759, (GLfloat) - 0.938725,
+       (GLfloat) 0.194187, (GLfloat) 0.284759, (GLfloat) - 0.938724,
+       (GLfloat) 0.553716, (GLfloat) 0.241722, (GLfloat) - 0.796849,
+       (GLfloat) 0.830227, (GLfloat) 0.161812, (GLfloat) - 0.533422,
+       (GLfloat) 0.980604, (GLfloat) 0.056895, (GLfloat) - 0.187558,
+       (GLfloat) 0.980604, (GLfloat) - 0.056895, (GLfloat) 0.187558,
+       (GLfloat) 0.830228, (GLfloat) - 0.161811, (GLfloat) 0.533421,
+       (GLfloat) 0.553716, (GLfloat) - 0.241722, (GLfloat) 0.796850,
+       (GLfloat) 0.194186, (GLfloat) - 0.462423, (GLfloat) 0.865134,
+       (GLfloat) - 0.194185, (GLfloat) - 0.462424, (GLfloat) 0.865134,
+       (GLfloat) - 0.553717, (GLfloat) - 0.392534, (GLfloat) 0.734380,
+       (GLfloat) - 0.830228, (GLfloat) - 0.262768, (GLfloat) 0.491604,
+       (GLfloat) - 0.980604, (GLfloat) - 0.092393, (GLfloat) 0.172854,
+       (GLfloat) - 0.980604, (GLfloat) 0.092393, (GLfloat) - 0.172854,
+       (GLfloat) - 0.830227, (GLfloat) 0.262768, (GLfloat) - 0.491605,
+       (GLfloat) - 0.553717, (GLfloat) 0.392534, (GLfloat) - 0.734380,
+       (GLfloat) - 0.194187, (GLfloat) 0.462424, (GLfloat) - 0.865134,
+       (GLfloat) 0.194187, (GLfloat) 0.462423, (GLfloat) - 0.865134,
+       (GLfloat) 0.553716, (GLfloat) 0.392534, (GLfloat) - 0.734381,
+       (GLfloat) 0.830227, (GLfloat) 0.262768, (GLfloat) - 0.491605,
+       (GLfloat) 0.980604, (GLfloat) 0.092393, (GLfloat) - 0.172854,
+       (GLfloat) 0.980604, (GLfloat) - 0.092393, (GLfloat) 0.172854,
+       (GLfloat) 0.830228, (GLfloat) - 0.262768, (GLfloat) 0.491604,
+       (GLfloat) 0.553716, (GLfloat) - 0.392535, (GLfloat) 0.734381,
+       (GLfloat) 0.194186, (GLfloat) - 0.622317, (GLfloat) 0.758296,
+       (GLfloat) - 0.194186, (GLfloat) - 0.622318, (GLfloat) 0.758296,
+       (GLfloat) - 0.553717, (GLfloat) - 0.528263, (GLfloat) 0.643690,
+       (GLfloat) - 0.830228, (GLfloat) - 0.353626, (GLfloat) 0.430895,
+       (GLfloat) - 0.980604, (GLfloat) - 0.124340, (GLfloat) 0.151508,
+       (GLfloat) - 0.980604, (GLfloat) 0.124339, (GLfloat) - 0.151508,
+       (GLfloat) - 0.830227, (GLfloat) 0.353627, (GLfloat) - 0.430895,
+       (GLfloat) - 0.553717, (GLfloat) 0.528263, (GLfloat) - 0.643690,
+       (GLfloat) - 0.194186, (GLfloat) 0.622317, (GLfloat) - 0.758296,
+       (GLfloat) 0.194186, (GLfloat) 0.622318, (GLfloat) - 0.758296,
+       (GLfloat) 0.553716, (GLfloat) 0.528263, (GLfloat) - 0.643690,
+       (GLfloat) 0.830227, (GLfloat) 0.353627, (GLfloat) - 0.430895,
+       (GLfloat) 0.980604, (GLfloat) 0.124339, (GLfloat) - 0.151508,
+       (GLfloat) 0.980604, (GLfloat) - 0.124340, (GLfloat) 0.151508,
+       (GLfloat) 0.830228, (GLfloat) - 0.353626, (GLfloat) 0.430895,
+       (GLfloat) 0.553716, (GLfloat) - 0.528263, (GLfloat) 0.643690,
+       (GLfloat) 0.194186, (GLfloat) - 0.758296, (GLfloat) 0.622317,
+       (GLfloat) - 0.194185, (GLfloat) - 0.758296, (GLfloat) 0.622318,
+       (GLfloat) - 0.553717, (GLfloat) - 0.643690, (GLfloat) 0.528263,
+       (GLfloat) - 0.830228, (GLfloat) - 0.430895, (GLfloat) 0.353626,
+       (GLfloat) - 0.980604, (GLfloat) - 0.151508, (GLfloat) 0.124339,
+       (GLfloat) - 0.980604, (GLfloat) 0.151508, (GLfloat) - 0.124339,
+       (GLfloat) - 0.830227, (GLfloat) 0.430895, (GLfloat) - 0.353627,
+       (GLfloat) - 0.553717, (GLfloat) 0.643689, (GLfloat) - 0.528262,
+       (GLfloat) - 0.194187, (GLfloat) 0.758296, (GLfloat) - 0.622317,
+       (GLfloat) 0.194187, (GLfloat) 0.758296, (GLfloat) - 0.622317,
+       (GLfloat) 0.553716, (GLfloat) 0.643690, (GLfloat) - 0.528263,
+       (GLfloat) 0.830227, (GLfloat) 0.430895, (GLfloat) - 0.353627,
+       (GLfloat) 0.980604, (GLfloat) 0.151508, (GLfloat) - 0.124339,
+       (GLfloat) 0.980604, (GLfloat) - 0.151508, (GLfloat) 0.124340,
+       (GLfloat) 0.830228, (GLfloat) - 0.430895, (GLfloat) 0.353626,
+       (GLfloat) 0.553716, (GLfloat) - 0.643690, (GLfloat) 0.528263,
+       (GLfloat) 0.194186, (GLfloat) - 0.865134, (GLfloat) 0.462423,
+       (GLfloat) - 0.194185, (GLfloat) - 0.865134, (GLfloat) 0.462424,
+       (GLfloat) - 0.553717, (GLfloat) - 0.734380, (GLfloat) 0.392534,
+       (GLfloat) - 0.830228, (GLfloat) - 0.491604, (GLfloat) 0.262768,
+       (GLfloat) - 0.980604, (GLfloat) - 0.172855, (GLfloat) 0.092393,
+       (GLfloat) - 0.980604, (GLfloat) 0.172854, (GLfloat) - 0.092393,
+       (GLfloat) - 0.830227, (GLfloat) 0.491605, (GLfloat) - 0.262768,
+       (GLfloat) - 0.553717, (GLfloat) 0.734380, (GLfloat) - 0.392534,
+       (GLfloat) - 0.194186, (GLfloat) 0.865134, (GLfloat) - 0.462424,
+       (GLfloat) 0.194187, (GLfloat) 0.865134, (GLfloat) - 0.462423,
+       (GLfloat) 0.553716, (GLfloat) 0.734381, (GLfloat) - 0.392535,
+       (GLfloat) 0.830228, (GLfloat) 0.491605, (GLfloat) - 0.262768,
+       (GLfloat) 0.980604, (GLfloat) 0.172854, (GLfloat) - 0.092393,
+       (GLfloat) 0.980604, (GLfloat) - 0.172855, (GLfloat) 0.092393,
+       (GLfloat) 0.830228, (GLfloat) - 0.491604, (GLfloat) 0.262768,
+       (GLfloat) 0.553716, (GLfloat) - 0.734381, (GLfloat) 0.392535,
+       (GLfloat) 0.194185, (GLfloat) - 0.938725, (GLfloat) 0.284759,
+       (GLfloat) - 0.194185, (GLfloat) - 0.938725, (GLfloat) 0.284759,
+       (GLfloat) - 0.553718, (GLfloat) - 0.796848, (GLfloat) 0.241721,
+       (GLfloat) - 0.830228, (GLfloat) - 0.533422, (GLfloat) 0.161812,
+       (GLfloat) - 0.980604, (GLfloat) - 0.187558, (GLfloat) 0.056895,
+       (GLfloat) - 0.980605, (GLfloat) 0.187557, (GLfloat) - 0.056895,
+       (GLfloat) - 0.830227, (GLfloat) 0.533423, (GLfloat) - 0.161812,
+       (GLfloat) - 0.553717, (GLfloat) 0.796849, (GLfloat) - 0.241722,
+       (GLfloat) - 0.194187, (GLfloat) 0.938725, (GLfloat) - 0.284759,
+       (GLfloat) 0.194188, (GLfloat) 0.938724, (GLfloat) - 0.284759,
+       (GLfloat) 0.553716, (GLfloat) 0.796849, (GLfloat) - 0.241722,
+       (GLfloat) 0.830227, (GLfloat) 0.533423, (GLfloat) - 0.161812,
+       (GLfloat) 0.980604, (GLfloat) 0.187557, (GLfloat) - 0.056895,
+       (GLfloat) 0.980604, (GLfloat) - 0.187558, (GLfloat) 0.056895,
+       (GLfloat) 0.830228, (GLfloat) - 0.533422, (GLfloat) 0.161812,
+       (GLfloat) 0.553717, (GLfloat) - 0.796849, (GLfloat) 0.241722,
+       (GLfloat) 0.194186, (GLfloat) - 0.976241, (GLfloat) 0.096151,
+       (GLfloat) - 0.194186, (GLfloat) - 0.976241, (GLfloat) 0.096151,
+       (GLfloat) - 0.553717, (GLfloat) - 0.828695, (GLfloat) 0.081619,
+       (GLfloat) - 0.830228, (GLfloat) - 0.554740, (GLfloat) 0.054637,
+       (GLfloat) - 0.980604, (GLfloat) - 0.195054, (GLfloat) 0.019211,
+       (GLfloat) - 0.980604, (GLfloat) 0.195054, (GLfloat) - 0.019211,
+       (GLfloat) - 0.830227, (GLfloat) 0.554741, (GLfloat) - 0.054637,
+       (GLfloat) - 0.553717, (GLfloat) 0.828695, (GLfloat) - 0.081619,
+       (GLfloat) - 0.194187, (GLfloat) 0.976241, (GLfloat) - 0.096151,
+       (GLfloat) 0.194187, (GLfloat) 0.976241, (GLfloat) - 0.096151,
+       (GLfloat) 0.553716, (GLfloat) 0.828696, (GLfloat) - 0.081619,
+       (GLfloat) 0.830227, (GLfloat) 0.554741, (GLfloat) - 0.054637,
+       (GLfloat) 0.980604, (GLfloat) 0.195054, (GLfloat) - 0.019211,
+       (GLfloat) 0.980604, (GLfloat) - 0.195054, (GLfloat) 0.019211,
+       (GLfloat) 0.830228, (GLfloat) - 0.554740, (GLfloat) 0.054637,
+       (GLfloat) 0.553716, (GLfloat) - 0.828696, (GLfloat) 0.081619,
+       (GLfloat) 0.194185, (GLfloat) - 0.976241, (GLfloat) - 0.096151,
+       (GLfloat) - 0.194185, (GLfloat) - 0.976241, (GLfloat) - 0.096151,
+       (GLfloat) - 0.553718, (GLfloat) - 0.828695, (GLfloat) - 0.081619,
+       (GLfloat) - 0.830228, (GLfloat) - 0.554740, (GLfloat) - 0.054637,
+       (GLfloat) - 0.980604, (GLfloat) - 0.195054, (GLfloat) - 0.019211,
+       (GLfloat) - 0.980605, (GLfloat) 0.195053, (GLfloat) 0.019211,
+       (GLfloat) - 0.830227, (GLfloat) 0.554741, (GLfloat) 0.054637,
+       (GLfloat) - 0.553717, (GLfloat) 0.828695, (GLfloat) 0.081619,
+       (GLfloat) - 0.194187, (GLfloat) 0.976241, (GLfloat) 0.096151,
+       (GLfloat) 0.194188, (GLfloat) 0.976241, (GLfloat) 0.096151,
+       (GLfloat) 0.553716, (GLfloat) 0.828696, (GLfloat) 0.081619,
+       (GLfloat) 0.830227, (GLfloat) 0.554741, (GLfloat) 0.054637,
+       (GLfloat) 0.980604, (GLfloat) 0.195053, (GLfloat) 0.019211,
+       (GLfloat) 0.980604, (GLfloat) - 0.195054, (GLfloat) - 0.019211,
+       (GLfloat) 0.830228, (GLfloat) - 0.554740, (GLfloat) - 0.054637,
+       (GLfloat) 0.553717, (GLfloat) - 0.828695, (GLfloat) - 0.081619,
+       (GLfloat) 0.194186, (GLfloat) - 0.938725, (GLfloat) - 0.284759,
+       (GLfloat) - 0.194185, (GLfloat) - 0.938725, (GLfloat) - 0.284759,
+       (GLfloat) - 0.553717, (GLfloat) - 0.796849, (GLfloat) - 0.241721,
+       (GLfloat) - 0.830228, (GLfloat) - 0.533421, (GLfloat) - 0.161812,
+       (GLfloat) - 0.980604, (GLfloat) - 0.187558, (GLfloat) - 0.056895,
+       (GLfloat) - 0.980604, (GLfloat) 0.187558, (GLfloat) 0.056895,
+       (GLfloat) - 0.830227, (GLfloat) 0.533422, (GLfloat) 0.161812,
+       (GLfloat) - 0.553717, (GLfloat) 0.796849, (GLfloat) 0.241722,
+       (GLfloat) - 0.194186, (GLfloat) 0.938725, (GLfloat) 0.284759,
+       (GLfloat) 0.194187, (GLfloat) 0.938724, (GLfloat) 0.284759,
+       (GLfloat) 0.553716, (GLfloat) 0.796849, (GLfloat) 0.241722,
+       (GLfloat) 0.830227, (GLfloat) 0.533422, (GLfloat) 0.161812,
+       (GLfloat) 0.980604, (GLfloat) 0.187558, (GLfloat) 0.056895,
+       (GLfloat) 0.980604, (GLfloat) - 0.187558, (GLfloat) - 0.056895,
+       (GLfloat) 0.830228, (GLfloat) - 0.533421, (GLfloat) - 0.161811,
+       (GLfloat) 0.553716, (GLfloat) - 0.796850, (GLfloat) - 0.241722,
+       (GLfloat) 0.194186, (GLfloat) - 0.865134, (GLfloat) - 0.462423,
+       (GLfloat) - 0.194185, (GLfloat) - 0.865134, (GLfloat) - 0.462424,
+       (GLfloat) - 0.553717, (GLfloat) - 0.734380, (GLfloat) - 0.392534,
+       (GLfloat) - 0.830228, (GLfloat) - 0.491604, (GLfloat) - 0.262768,
+       (GLfloat) - 0.980604, (GLfloat) - 0.172854, (GLfloat) - 0.092393,
+       (GLfloat) - 0.980604, (GLfloat) 0.172854, (GLfloat) 0.092393,
+       (GLfloat) - 0.830227, (GLfloat) 0.491605, (GLfloat) 0.262768,
+       (GLfloat) - 0.553717, (GLfloat) 0.734380, (GLfloat) 0.392534,
+       (GLfloat) - 0.194187, (GLfloat) 0.865134, (GLfloat) 0.462424,
+       (GLfloat) 0.194187, (GLfloat) 0.865134, (GLfloat) 0.462423,
+       (GLfloat) 0.553716, (GLfloat) 0.734381, (GLfloat) 0.392534,
+       (GLfloat) 0.830227, (GLfloat) 0.491605, (GLfloat) 0.262768,
+       (GLfloat) 0.980604, (GLfloat) 0.172854, (GLfloat) 0.092393,
+       (GLfloat) 0.980604, (GLfloat) - 0.172854, (GLfloat) - 0.092393,
+       (GLfloat) 0.830228, (GLfloat) - 0.491604, (GLfloat) - 0.262768,
+       (GLfloat) 0.553716, (GLfloat) - 0.734381, (GLfloat) - 0.392535,
+       (GLfloat) 0.194186, (GLfloat) - 0.758296, (GLfloat) - 0.622317,
+       (GLfloat) - 0.194186, (GLfloat) - 0.758296, (GLfloat) - 0.622318,
+       (GLfloat) - 0.553717, (GLfloat) - 0.643690, (GLfloat) - 0.528263,
+       (GLfloat) - 0.830228, (GLfloat) - 0.430895, (GLfloat) - 0.353626,
+       (GLfloat) - 0.980604, (GLfloat) - 0.151508, (GLfloat) - 0.124340,
+       (GLfloat) - 0.980604, (GLfloat) 0.151508, (GLfloat) 0.124339,
+       (GLfloat) - 0.830227, (GLfloat) 0.430895, (GLfloat) 0.353627,
+       (GLfloat) - 0.553717, (GLfloat) 0.643690, (GLfloat) 0.528263,
+       (GLfloat) - 0.194186, (GLfloat) 0.758296, (GLfloat) 0.622317,
+       (GLfloat) 0.194186, (GLfloat) 0.758296, (GLfloat) 0.622318,
+       (GLfloat) 0.553716, (GLfloat) 0.643690, (GLfloat) 0.528263,
+       (GLfloat) 0.830227, (GLfloat) 0.430895, (GLfloat) 0.353627,
+       (GLfloat) 0.980604, (GLfloat) 0.151508, (GLfloat) 0.124339,
+       (GLfloat) 0.980604, (GLfloat) - 0.151508, (GLfloat) - 0.124340,
+       (GLfloat) 0.830228, (GLfloat) - 0.430895, (GLfloat) - 0.353626,
+       (GLfloat) 0.553716, (GLfloat) - 0.643690, (GLfloat) - 0.528263,
+       (GLfloat) 0.194186, (GLfloat) - 0.622317, (GLfloat) - 0.758296,
+       (GLfloat) - 0.194185, (GLfloat) - 0.622318, (GLfloat) - 0.758296,
+       (GLfloat) - 0.553717, (GLfloat) - 0.528263, (GLfloat) - 0.643690,
+       (GLfloat) - 0.830228, (GLfloat) - 0.353626, (GLfloat) - 0.430895,
+       (GLfloat) - 0.980604, (GLfloat) - 0.124339, (GLfloat) - 0.151508,
+       (GLfloat) - 0.980604, (GLfloat) 0.124339, (GLfloat) 0.151508,
+       (GLfloat) - 0.830227, (GLfloat) 0.353627, (GLfloat) 0.430895,
+       (GLfloat) - 0.553717, (GLfloat) 0.528262, (GLfloat) 0.643689,
+       (GLfloat) - 0.194187, (GLfloat) 0.622317, (GLfloat) 0.758296,
+       (GLfloat) 0.194187, (GLfloat) 0.622317, (GLfloat) 0.758296,
+       (GLfloat) 0.553716, (GLfloat) 0.528263, (GLfloat) 0.643690,
+       (GLfloat) 0.830227, (GLfloat) 0.353627, (GLfloat) 0.430895,
+       (GLfloat) 0.980604, (GLfloat) 0.124339, (GLfloat) 0.151508,
+       (GLfloat) 0.980604, (GLfloat) - 0.124340, (GLfloat) - 0.151508,
+       (GLfloat) 0.830228, (GLfloat) - 0.353626, (GLfloat) - 0.430895,
+       (GLfloat) 0.553716, (GLfloat) - 0.528263, (GLfloat) - 0.643690,
+       (GLfloat) 0.194186, (GLfloat) - 0.462423, (GLfloat) - 0.865134,
+       (GLfloat) - 0.194185, (GLfloat) - 0.462424, (GLfloat) - 0.865134,
+       (GLfloat) - 0.553717, (GLfloat) - 0.392534, (GLfloat) - 0.734380,
+       (GLfloat) - 0.830228, (GLfloat) - 0.262768, (GLfloat) - 0.491604,
+       (GLfloat) - 0.980604, (GLfloat) - 0.092393, (GLfloat) - 0.172855,
+       (GLfloat) - 0.980604, (GLfloat) 0.092393, (GLfloat) 0.172854,
+       (GLfloat) - 0.830227, (GLfloat) 0.262768, (GLfloat) 0.491605,
+       (GLfloat) - 0.553717, (GLfloat) 0.392534, (GLfloat) 0.734380,
+       (GLfloat) - 0.194186, (GLfloat) 0.462424, (GLfloat) 0.865134,
+       (GLfloat) 0.194187, (GLfloat) 0.462423, (GLfloat) 0.865134,
+       (GLfloat) 0.553716, (GLfloat) 0.392535, (GLfloat) 0.734381,
+       (GLfloat) 0.830228, (GLfloat) 0.262768, (GLfloat) 0.491605,
+       (GLfloat) 0.980604, (GLfloat) 0.092393, (GLfloat) 0.172854,
+       (GLfloat) 0.980604, (GLfloat) - 0.092393, (GLfloat) - 0.172855,
+       (GLfloat) 0.830228, (GLfloat) - 0.262768, (GLfloat) - 0.491604,
+       (GLfloat) 0.553716, (GLfloat) - 0.392535, (GLfloat) - 0.734381,
+       (GLfloat) 0.194185, (GLfloat) - 0.284759, (GLfloat) - 0.938725,
+       (GLfloat) - 0.194185, (GLfloat) - 0.284759, (GLfloat) - 0.938725,
+       (GLfloat) - 0.553718, (GLfloat) - 0.241721, (GLfloat) - 0.796848,
+       (GLfloat) - 0.830228, (GLfloat) - 0.161812, (GLfloat) - 0.533422,
+       (GLfloat) - 0.980604, (GLfloat) - 0.056895, (GLfloat) - 0.187558,
+       (GLfloat) - 0.980605, (GLfloat) 0.056895, (GLfloat) 0.187557,
+       (GLfloat) - 0.830227, (GLfloat) 0.161812, (GLfloat) 0.533422,
+       (GLfloat) - 0.553716, (GLfloat) 0.241722, (GLfloat) 0.796849,
+       (GLfloat) - 0.194187, (GLfloat) 0.284759, (GLfloat) 0.938725,
+       (GLfloat) 0.194188, (GLfloat) 0.284759, (GLfloat) 0.938724,
+       (GLfloat) 0.553716, (GLfloat) 0.241722, (GLfloat) 0.796850,
+       (GLfloat) 0.830227, (GLfloat) 0.161812, (GLfloat) 0.533423,
+       (GLfloat) 0.980604, (GLfloat) 0.056895, (GLfloat) 0.187557,
+       (GLfloat) 0.980604, (GLfloat) - 0.056895, (GLfloat) - 0.187558,
+       (GLfloat) 0.830228, (GLfloat) - 0.161812, (GLfloat) - 0.533422,
+       (GLfloat) 0.553717, (GLfloat) - 0.241722, (GLfloat) - 0.796849,
+       (GLfloat) 0.194186, (GLfloat) - 0.096151, (GLfloat) - 0.976241,
+       (GLfloat) - 0.194186, (GLfloat) - 0.096151, (GLfloat) - 0.976241,
+       (GLfloat) - 0.553717, (GLfloat) - 0.081619, (GLfloat) - 0.828695,
+       (GLfloat) - 0.830228, (GLfloat) - 0.054637, (GLfloat) - 0.554740,
+       (GLfloat) - 0.980604, (GLfloat) - 0.019211, (GLfloat) - 0.195054,
+       (GLfloat) - 0.980604, (GLfloat) 0.019211, (GLfloat) 0.195054,
+       (GLfloat) - 0.830227, (GLfloat) 0.054637, (GLfloat) 0.554741,
+       (GLfloat) - 0.553717, (GLfloat) 0.081619, (GLfloat) 0.828695,
+       (GLfloat) - 0.194187, (GLfloat) 0.096151, (GLfloat) 0.976241,
+       (GLfloat) 0.194187, (GLfloat) 0.096151, (GLfloat) 0.976241,
+       (GLfloat) 0.553716, (GLfloat) 0.081620, (GLfloat) 0.828696,
+       (GLfloat) 0.830227, (GLfloat) 0.054637, (GLfloat) 0.554741,
+       (GLfloat) 0.980604, (GLfloat) 0.019211, (GLfloat) 0.195054,
+       (GLfloat) 0.980604, (GLfloat) - 0.019211, (GLfloat) - 0.195054,
+       (GLfloat) 0.830228, (GLfloat) - 0.054637, (GLfloat) - 0.554740,
+       (GLfloat) 0.553716, (GLfloat) - 0.081619, (GLfloat) - 0.828696,
+       (GLfloat) 0.194185, (GLfloat) 0.096151, (GLfloat) - 0.976241,
+       (GLfloat) - 0.194185, (GLfloat) 0.096151, (GLfloat) - 0.976241,
+       (GLfloat) - 0.553718, (GLfloat) 0.081619, (GLfloat) - 0.828695,
+       (GLfloat) - 0.830228, (GLfloat) 0.054637, (GLfloat) - 0.554740,
+       (GLfloat) - 0.980604, (GLfloat) 0.019211, (GLfloat) - 0.195054,
+       (GLfloat) - 0.980605, (GLfloat) - 0.019211, (GLfloat) 0.195053,
+       (GLfloat) - 0.830227, (GLfloat) - 0.054637, (GLfloat) 0.554741,
+       (GLfloat) - 0.553717, (GLfloat) - 0.081619, (GLfloat) 0.828695,
+       (GLfloat) - 0.194187, (GLfloat) - 0.096151, (GLfloat) 0.976241,
+       (GLfloat) 0.194188, (GLfloat) - 0.096151, (GLfloat) 0.976241,
+       (GLfloat) 0.553716, (GLfloat) - 0.081619, (GLfloat) 0.828696,
+       (GLfloat) 0.830227, (GLfloat) - 0.054637, (GLfloat) 0.554741,
+       (GLfloat) 0.980604, (GLfloat) - 0.019211, (GLfloat) 0.195053,
+       (GLfloat) 0.980604, (GLfloat) 0.019211, (GLfloat) - 0.195054,
+       (GLfloat) 0.830228, (GLfloat) 0.054637, (GLfloat) - 0.554740,
+       (GLfloat) 0.553717, (GLfloat) 0.081619, (GLfloat) - 0.828695,
+       (GLfloat) 0.194186, (GLfloat) 0.284759, (GLfloat) - 0.938725,
+       (GLfloat) - 0.194185, (GLfloat) 0.284759, (GLfloat) - 0.938725,
+       (GLfloat) - 0.553717, (GLfloat) 0.241721, (GLfloat) - 0.796849,
+       (GLfloat) - 0.830228, (GLfloat) 0.161812, (GLfloat) - 0.533421,
+       (GLfloat) - 0.980604, (GLfloat) 0.056895, (GLfloat) - 0.187558,
+       (GLfloat) - 0.980604, (GLfloat) - 0.056895, (GLfloat) 0.187558,
+       (GLfloat) - 0.830227, (GLfloat) - 0.161812, (GLfloat) 0.533422,
+       (GLfloat) - 0.553717, (GLfloat) - 0.241722, (GLfloat) 0.796849,
+       (GLfloat) - 0.194186, (GLfloat) - 0.284759, (GLfloat) 0.938725,
+       (GLfloat) 0.194187, (GLfloat) - 0.284759, (GLfloat) 0.938724,
+       (GLfloat) 0.553716, (GLfloat) - 0.241722, (GLfloat) 0.796849,
+       (GLfloat) 0.830227, (GLfloat) - 0.161812, (GLfloat) 0.533422,
+       (GLfloat) 0.980604, (GLfloat) - 0.056895, (GLfloat) 0.187558,
+       (GLfloat) 0.980604, (GLfloat) 0.056895, (GLfloat) - 0.187558,
+       (GLfloat) 0.830228, (GLfloat) 0.161811, (GLfloat) - 0.533421,
+       (GLfloat) 0.553716, (GLfloat) 0.241722, (GLfloat) - 0.796850,
+       (GLfloat) 0.194186, (GLfloat) 0.462423, (GLfloat) - 0.865134,
+       (GLfloat) - 0.194185, (GLfloat) 0.462424, (GLfloat) - 0.865134,
+       (GLfloat) - 0.553717, (GLfloat) 0.392534, (GLfloat) - 0.734380,
+       (GLfloat) - 0.830228, (GLfloat) 0.262768, (GLfloat) - 0.491604,
+       (GLfloat) - 0.980604, (GLfloat) 0.092393, (GLfloat) - 0.172854,
+       (GLfloat) - 0.980604, (GLfloat) - 0.092393, (GLfloat) 0.172854,
+       (GLfloat) - 0.830227, (GLfloat) - 0.262768, (GLfloat) 0.491605,
+       (GLfloat) - 0.553717, (GLfloat) - 0.392534, (GLfloat) 0.734380,
+       (GLfloat) - 0.194187, (GLfloat) - 0.462424, (GLfloat) 0.865134,
+       (GLfloat) 0.194187, (GLfloat) - 0.462423, (GLfloat) 0.865134,
+       (GLfloat) 0.553716, (GLfloat) - 0.392534, (GLfloat) 0.734381,
+       (GLfloat) 0.830227, (GLfloat) - 0.262768, (GLfloat) 0.491605,
+       (GLfloat) 0.980604, (GLfloat) - 0.092393, (GLfloat) 0.172854,
+       (GLfloat) 0.980604, (GLfloat) 0.092393, (GLfloat) - 0.172854,
+       (GLfloat) 0.830228, (GLfloat) 0.262768, (GLfloat) - 0.491604,
+       (GLfloat) 0.553716, (GLfloat) 0.392535, (GLfloat) - 0.734381,
+       (GLfloat) 0.194186, (GLfloat) 0.622317, (GLfloat) - 0.758296,
+       (GLfloat) - 0.194186, (GLfloat) 0.622318, (GLfloat) - 0.758296,
+       (GLfloat) - 0.553717, (GLfloat) 0.528263, (GLfloat) - 0.643690,
+       (GLfloat) - 0.830228, (GLfloat) 0.353626, (GLfloat) - 0.430895,
+       (GLfloat) - 0.980604, (GLfloat) 0.124340, (GLfloat) - 0.151508,
+       (GLfloat) - 0.980604, (GLfloat) - 0.124339, (GLfloat) 0.151508,
+       (GLfloat) - 0.830227, (GLfloat) - 0.353627, (GLfloat) 0.430895,
+       (GLfloat) - 0.553717, (GLfloat) - 0.528263, (GLfloat) 0.643690,
+       (GLfloat) - 0.194186, (GLfloat) - 0.622317, (GLfloat) 0.758296,
+       (GLfloat) 0.194186, (GLfloat) - 0.622318, (GLfloat) 0.758296,
+       (GLfloat) 0.553716, (GLfloat) - 0.528263, (GLfloat) 0.643690,
+       (GLfloat) 0.830227, (GLfloat) - 0.353627, (GLfloat) 0.430895,
+       (GLfloat) 0.980604, (GLfloat) - 0.124339, (GLfloat) 0.151508,
+       (GLfloat) 0.980604, (GLfloat) 0.124340, (GLfloat) - 0.151508,
+       (GLfloat) 0.830228, (GLfloat) 0.353626, (GLfloat) - 0.430895,
+       (GLfloat) 0.553716, (GLfloat) 0.528263, (GLfloat) - 0.643690,
+       (GLfloat) 0.194186, (GLfloat) 0.758296, (GLfloat) - 0.622317,
+       (GLfloat) - 0.194185, (GLfloat) 0.758296, (GLfloat) - 0.622318,
+       (GLfloat) - 0.553717, (GLfloat) 0.643690, (GLfloat) - 0.528263,
+       (GLfloat) - 0.830228, (GLfloat) 0.430895, (GLfloat) - 0.353626,
+       (GLfloat) - 0.980604, (GLfloat) 0.151508, (GLfloat) - 0.124339,
+       (GLfloat) - 0.980604, (GLfloat) - 0.151508, (GLfloat) 0.124339,
+       (GLfloat) - 0.830227, (GLfloat) - 0.430895, (GLfloat) 0.353627,
+       (GLfloat) - 0.553717, (GLfloat) - 0.643689, (GLfloat) 0.528262,
+       (GLfloat) - 0.194187, (GLfloat) - 0.758296, (GLfloat) 0.622317,
+       (GLfloat) 0.194187, (GLfloat) - 0.758296, (GLfloat) 0.622317,
+       (GLfloat) 0.553716, (GLfloat) - 0.643690, (GLfloat) 0.528263,
+       (GLfloat) 0.830227, (GLfloat) - 0.430895, (GLfloat) 0.353627,
+       (GLfloat) 0.980604, (GLfloat) - 0.151508, (GLfloat) 0.124339,
+       (GLfloat) 0.980604, (GLfloat) 0.151508, (GLfloat) - 0.124340,
+       (GLfloat) 0.830228, (GLfloat) 0.430895, (GLfloat) - 0.353626,
+       (GLfloat) 0.553716, (GLfloat) 0.643690, (GLfloat) - 0.528263,
+       (GLfloat) 0.194186, (GLfloat) 0.865134, (GLfloat) - 0.462423,
+       (GLfloat) - 0.194185, (GLfloat) 0.865134, (GLfloat) - 0.462424,
+       (GLfloat) - 0.553717, (GLfloat) 0.734380, (GLfloat) - 0.392534,
+       (GLfloat) - 0.830228, (GLfloat) 0.491604, (GLfloat) - 0.262768,
+       (GLfloat) - 0.980604, (GLfloat) 0.172855, (GLfloat) - 0.092393,
+       (GLfloat) - 0.980604, (GLfloat) - 0.172854, (GLfloat) 0.092393,
+       (GLfloat) - 0.830227, (GLfloat) - 0.491605, (GLfloat) 0.262768,
+       (GLfloat) - 0.553717, (GLfloat) - 0.734380, (GLfloat) 0.392534,
+       (GLfloat) - 0.194186, (GLfloat) - 0.865134, (GLfloat) 0.462424,
+       (GLfloat) 0.194187, (GLfloat) - 0.865134, (GLfloat) 0.462423,
+       (GLfloat) 0.553716, (GLfloat) - 0.734381, (GLfloat) 0.392535,
+       (GLfloat) 0.830228, (GLfloat) - 0.491605, (GLfloat) 0.262768,
+       (GLfloat) 0.980604, (GLfloat) - 0.172854, (GLfloat) 0.092393,
+       (GLfloat) 0.980604, (GLfloat) 0.172855, (GLfloat) - 0.092393,
+       (GLfloat) 0.830228, (GLfloat) 0.491604, (GLfloat) - 0.262768,
+       (GLfloat) 0.553716, (GLfloat) 0.734381, (GLfloat) - 0.392535,
+       (GLfloat) 0.194185, (GLfloat) 0.938725, (GLfloat) - 0.284759,
+       (GLfloat) - 0.194185, (GLfloat) 0.938725, (GLfloat) - 0.284759,
+       (GLfloat) - 0.553718, (GLfloat) 0.796848, (GLfloat) - 0.241721,
+       (GLfloat) - 0.830228, (GLfloat) 0.533422, (GLfloat) - 0.161812,
+       (GLfloat) - 0.980604, (GLfloat) 0.187558, (GLfloat) - 0.056895,
+       (GLfloat) - 0.980605, (GLfloat) - 0.187557, (GLfloat) 0.056895,
+       (GLfloat) - 0.830227, (GLfloat) - 0.533422, (GLfloat) 0.161812,
+       (GLfloat) - 0.553716, (GLfloat) - 0.796849, (GLfloat) 0.241722,
+       (GLfloat) - 0.194187, (GLfloat) - 0.938725, (GLfloat) 0.284759,
+       (GLfloat) 0.194188, (GLfloat) - 0.938724, (GLfloat) 0.284759,
+       (GLfloat) 0.553716, (GLfloat) - 0.796850, (GLfloat) 0.241722,
+       (GLfloat) 0.830227, (GLfloat) - 0.533423, (GLfloat) 0.161812,
+       (GLfloat) 0.980604, (GLfloat) - 0.187557, (GLfloat) 0.056895,
+       (GLfloat) 0.980604, (GLfloat) 0.187558, (GLfloat) - 0.056895,
+       (GLfloat) 0.830228, (GLfloat) 0.533422, (GLfloat) - 0.161812,
+       (GLfloat) 0.553717, (GLfloat) 0.796849, (GLfloat) - 0.241722,
+       (GLfloat) 0.194186, (GLfloat) 0.976241, (GLfloat) - 0.096151,
+       (GLfloat) - 0.194186, (GLfloat) 0.976241, (GLfloat) - 0.096151,
+       (GLfloat) - 0.553717, (GLfloat) 0.828695, (GLfloat) - 0.081619,
+       (GLfloat) - 0.830228, (GLfloat) 0.554740, (GLfloat) - 0.054637,
+       (GLfloat) - 0.980604, (GLfloat) 0.195054, (GLfloat) - 0.019211,
+       (GLfloat) - 0.980604, (GLfloat) - 0.195054, (GLfloat) 0.019211,
+       (GLfloat) - 0.830227, (GLfloat) - 0.554741, (GLfloat) 0.054637,
+       (GLfloat) - 0.553717, (GLfloat) - 0.828695, (GLfloat) 0.081619,
+       (GLfloat) - 0.194187, (GLfloat) - 0.976241, (GLfloat) 0.096151,
+       (GLfloat) 0.194187, (GLfloat) - 0.976241, (GLfloat) 0.096151,
+       (GLfloat) 0.553716, (GLfloat) - 0.828696, (GLfloat) 0.081620,
+       (GLfloat) 0.830227, (GLfloat) - 0.554741, (GLfloat) 0.054637,
+       (GLfloat) 0.980604, (GLfloat) - 0.195054, (GLfloat) 0.019211,
+       (GLfloat) 0.980604, (GLfloat) 0.195054, (GLfloat) - 0.019211,
+       (GLfloat) 0.830228, (GLfloat) 0.554740, (GLfloat) - 0.054637,
+       (GLfloat) 0.553716, (GLfloat) 0.828696, (GLfloat) - 0.081619,
+};
+
+static unsigned short int BigValve_POLS[] =
+{
+       16, 684, 685, 686, 687, 688, 689, 690, 691, 692, 693, 694, 695, 696, 697, 698, 699, 1, 4, 700,
+       701, 685, 684, 1, 4, 701, 702, 686, 685, 1, 4, 702, 703, 687, 686, 1, 4, 703, 704, 688,
+       687, 1, 4, 704, 705, 689, 688, 1, 4, 705, 706, 690, 689, 1, 4, 706, 707, 691, 690, 1,
+       4, 707, 708, 692, 691, 1, 4, 708, 709, 693, 692, 1, 4, 709, 710, 694, 693, 1, 4, 710,
+       711, 695, 694, 1, 4, 711, 712, 696, 695, 1, 4, 712, 713, 697, 696, 1, 4, 713, 714, 698,
+       697, 1, 4, 714, 715, 699, 698, 1, 4, 715, 700, 684, 699, 1, 16, 700, 715, 714, 713, 712,
+       711, 710, 709, 708, 707, 706, 705, 704, 703, 702, 701, 1, 4, 668, 669, 655, 654, 1, 4, 669,
+       670, 656, 655, 1, 4, 670, 671, 657, 656, 1, 4, 671, 672, 634, 657, 1, 4, 672, 673, 658,
+       634, 1, 4, 673, 674, 659, 658, 1, 4, 674, 675, 660, 659, 1, 4, 675, 676, 661, 660, 1,
+       4, 676, 677, 662, 661, 1, 4, 677, 678, 663, 662, 1, 4, 678, 679, 664, 663, 1, 4, 679,
+       680, 564, 664, 1, 4, 680, 681, 665, 564, 1, 4, 681, 682, 666, 665, 1, 4, 682, 683, 667,
+       666, 1, 4, 683, 668, 654, 667, 1, 4, 638, 639, 624, 623, 1, 4, 639, 640, 625, 624, 1,
+       4, 640, 641, 626, 625, 1, 4, 641, 642, 603, 626, 1, 4, 642, 643, 627, 603, 1, 4, 643,
+       644, 628, 627, 1, 4, 644, 645, 629, 628, 1, 4, 645, 646, 630, 629, 1, 4, 646, 647, 631,
+       630, 1, 4, 647, 648, 632, 631, 1, 4, 648, 649, 633, 632, 1, 4, 649, 650, 634, 633, 1,
+       4, 650, 651, 635, 634, 1, 4, 651, 652, 636, 635, 1, 4, 652, 653, 637, 636, 1, 4, 653,
+       638, 623, 637, 1, 4, 607, 608, 593, 592, 1, 4, 608, 609, 594, 593, 1, 4, 609, 610, 595,
+       594, 1, 4, 610, 611, 572, 595, 1, 4, 611, 612, 596, 572, 1, 4, 612, 613, 597, 596, 1,
+       4, 613, 614, 598, 597, 1, 4, 614, 615, 599, 598, 1, 4, 615, 616, 600, 599, 1, 4, 616,
+       617, 601, 600, 1, 4, 617, 618, 602, 601, 1, 4, 618, 619, 603, 602, 1, 4, 619, 620, 604,
+       603, 1, 4, 620, 621, 605, 604, 1, 4, 621, 622, 606, 605, 1, 4, 622, 607, 592, 606, 1,
+       4, 576, 577, 561, 560, 1, 4, 577, 578, 562, 561, 1, 4, 578, 579, 563, 562, 1, 4, 579,
+       580, 564, 563, 1, 4, 580, 581, 565, 564, 1, 4, 581, 582, 566, 565, 1, 4, 582, 583, 567,
+       566, 1, 4, 583, 584, 568, 567, 1, 4, 584, 585, 569, 568, 1, 4, 585, 586, 570, 569, 1,
+       4, 586, 587, 571, 570, 1, 4, 587, 588, 572, 571, 1, 4, 588, 589, 573, 572, 1, 4, 589,
+       590, 574, 573, 1, 4, 590, 591, 575, 574, 1, 4, 591, 576, 560, 575, 1, 24, 512, 513, 514,
+       515, 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, 532, 533, 534,
+       535, 1, 4, 536, 537, 513, 512, 1, 4, 537, 538, 514, 513, 1, 4, 538, 539, 515, 514, 1,
+       4, 539, 540, 516, 515, 1, 4, 540, 541, 517, 516, 1, 4, 541, 542, 518, 517, 1, 4, 542,
+       543, 519, 518, 1, 4, 543, 544, 520, 519, 1, 4, 544, 545, 521, 520, 1, 4, 545, 546, 522,
+       521, 1, 4, 546, 547, 523, 522, 1, 4, 547, 548, 524, 523, 1, 4, 548, 549, 525, 524, 1,
+       4, 549, 550, 526, 525, 1, 4, 550, 551, 527, 526, 1, 4, 551, 552, 528, 527, 1, 4, 552,
+       553, 529, 528, 1, 4, 553, 554, 530, 529, 1, 4, 554, 555, 531, 530, 1, 4, 555, 556, 532,
+       531, 1, 4, 556, 557, 533, 532, 1, 4, 557, 558, 534, 533, 1, 4, 558, 559, 535, 534, 1,
+       4, 559, 536, 512, 535, 1, 24, 536, 559, 558, 557, 556, 555, 554, 553, 552, 551, 550, 549, 548,
+       547, 546, 545, 544, 543, 542, 541, 540, 539, 538, 537, 1, 4, 16, 31, 15, 0, 1, 4, 31,
+    30, 14, 15, 1, 4, 30, 29, 13, 14, 1, 4, 29, 28, 12, 13, 1, 4, 28, 27, 11,
+       12, 1, 4, 27, 26, 10, 11, 1, 4, 26, 25, 9, 10, 1, 4, 25, 24, 8, 9, 1,
+       4, 24, 23, 7, 8, 1, 4, 23, 22, 6, 7, 1, 4, 22, 21, 5, 6, 1, 4, 21,
+       20, 4, 5, 1, 4, 20, 19, 3, 4, 1, 4, 19, 18, 2, 3, 1, 4, 18, 17, 1,
+       2, 1, 4, 17, 16, 0, 1, 1, 4, 32, 47, 31, 16, 1, 4, 47, 46, 30, 31, 1,
+     4, 46, 45, 29, 30, 1, 4, 45, 44, 28, 29, 1, 4, 44, 43, 27, 28, 1, 4, 43,
+    42, 26, 27, 1, 4, 42, 41, 25, 26, 1, 4, 41, 40, 24, 25, 1, 4, 40, 39, 23,
+     24, 1, 4, 39, 38, 22, 23, 1, 4, 38, 37, 21, 22, 1, 4, 37, 36, 20, 21, 1,
+     4, 36, 35, 19, 20, 1, 4, 35, 34, 18, 19, 1, 4, 34, 33, 17, 18, 1, 4, 33,
+    32, 16, 17, 1, 4, 48, 63, 47, 32, 1, 4, 63, 62, 46, 47, 1, 4, 62, 61, 45,
+     46, 1, 4, 61, 60, 44, 45, 1, 4, 60, 59, 43, 44, 1, 4, 59, 58, 42, 43, 1,
+     4, 58, 57, 41, 42, 1, 4, 57, 56, 40, 41, 1, 4, 56, 55, 39, 40, 1, 4, 55,
+    54, 38, 39, 1, 4, 54, 53, 37, 38, 1, 4, 53, 52, 36, 37, 1, 4, 52, 51, 35,
+     36, 1, 4, 51, 50, 34, 35, 1, 4, 50, 49, 33, 34, 1, 4, 49, 48, 32, 33, 1,
+     4, 64, 79, 63, 48, 1, 4, 79, 78, 62, 63, 1, 4, 78, 77, 61, 62, 1, 4, 77,
+    76, 60, 61, 1, 4, 76, 75, 59, 60, 1, 4, 75, 74, 58, 59, 1, 4, 74, 73, 57,
+     58, 1, 4, 73, 72, 56, 57, 1, 4, 72, 71, 55, 56, 1, 4, 71, 70, 54, 55, 1,
+     4, 70, 69, 53, 54, 1, 4, 69, 68, 52, 53, 1, 4, 68, 67, 51, 52, 1, 4, 67,
+    66, 50, 51, 1, 4, 66, 65, 49, 50, 1, 4, 65, 64, 48, 49, 1, 4, 80, 95, 79,
+     64, 1, 4, 95, 94, 78, 79, 1, 4, 94, 93, 77, 78, 1, 4, 93, 92, 76, 77, 1,
+     4, 92, 91, 75, 76, 1, 4, 91, 90, 74, 75, 1, 4, 90, 89, 73, 74, 1, 4, 89,
+    88, 72, 73, 1, 4, 88, 87, 71, 72, 1, 4, 87, 86, 70, 71, 1, 4, 86, 85, 69,
+     70, 1, 4, 85, 84, 68, 69, 1, 4, 84, 83, 67, 68, 1, 4, 83, 82, 66, 67, 1,
+   4, 82, 81, 65, 66, 1, 4, 81, 80, 64, 65, 1, 4, 96, 111, 95, 80, 1, 4, 111,
+       110, 94, 95, 1, 4, 110, 109, 93, 94, 1, 4, 109, 108, 92, 93, 1, 4, 108, 107, 91,
+92, 1, 4, 107, 106, 90, 91, 1, 4, 106, 105, 89, 90, 1, 4, 105, 104, 88, 89, 1,
+       4, 104, 103, 87, 88, 1, 4, 103, 102, 86, 87, 1, 4, 102, 101, 85, 86, 1, 4, 101,
+  100, 84, 85, 1, 4, 100, 99, 83, 84, 1, 4, 99, 98, 82, 83, 1, 4, 98, 97, 81,
+       82, 1, 4, 97, 96, 80, 81, 1, 4, 112, 127, 111, 96, 1, 4, 127, 126, 110, 111, 1,
+       4, 126, 125, 109, 110, 1, 4, 125, 124, 108, 109, 1, 4, 124, 123, 107, 108, 1, 4, 123,
+       122, 106, 107, 1, 4, 122, 121, 105, 106, 1, 4, 121, 120, 104, 105, 1, 4, 120, 119, 103,
+       104, 1, 4, 119, 118, 102, 103, 1, 4, 118, 117, 101, 102, 1, 4, 117, 116, 100, 101, 1,
+       4, 116, 115, 99, 100, 1, 4, 115, 114, 98, 99, 1, 4, 114, 113, 97, 98, 1, 4, 113,
+       112, 96, 97, 1, 4, 128, 143, 127, 112, 1, 4, 143, 142, 126, 127, 1, 4, 142, 141, 125,
+       126, 1, 4, 141, 140, 124, 125, 1, 4, 140, 139, 123, 124, 1, 4, 139, 138, 122, 123, 1,
+       4, 138, 137, 121, 122, 1, 4, 137, 136, 120, 121, 1, 4, 136, 135, 119, 120, 1, 4, 135,
+       134, 118, 119, 1, 4, 134, 133, 117, 118, 1, 4, 133, 132, 116, 117, 1, 4, 132, 131, 115,
+       116, 1, 4, 131, 130, 114, 115, 1, 4, 130, 129, 113, 114, 1, 4, 129, 128, 112, 113, 1,
+       4, 144, 159, 143, 128, 1, 4, 159, 158, 142, 143, 1, 4, 158, 157, 141, 142, 1, 4, 157,
+       156, 140, 141, 1, 4, 156, 155, 139, 140, 1, 4, 155, 154, 138, 139, 1, 4, 154, 153, 137,
+       138, 1, 4, 153, 152, 136, 137, 1, 4, 152, 151, 135, 136, 1, 4, 151, 150, 134, 135, 1,
+       4, 150, 149, 133, 134, 1, 4, 149, 148, 132, 133, 1, 4, 148, 147, 131, 132, 1, 4, 147,
+       146, 130, 131, 1, 4, 146, 145, 129, 130, 1, 4, 145, 144, 128, 129, 1, 4, 160, 175, 159,
+       144, 1, 4, 175, 174, 158, 159, 1, 4, 174, 173, 157, 158, 1, 4, 173, 172, 156, 157, 1,
+       4, 172, 171, 155, 156, 1, 4, 171, 170, 154, 155, 1, 4, 170, 169, 153, 154, 1, 4, 169,
+       168, 152, 153, 1, 4, 168, 167, 151, 152, 1, 4, 167, 166, 150, 151, 1, 4, 166, 165, 149,
+       150, 1, 4, 165, 164, 148, 149, 1, 4, 164, 163, 147, 148, 1, 4, 163, 162, 146, 147, 1,
+       4, 162, 161, 145, 146, 1, 4, 161, 160, 144, 145, 1, 4, 176, 191, 175, 160, 1, 4, 191,
+       190, 174, 175, 1, 4, 190, 189, 173, 174, 1, 4, 189, 188, 172, 173, 1, 4, 188, 187, 171,
+       172, 1, 4, 187, 186, 170, 171, 1, 4, 186, 185, 169, 170, 1, 4, 185, 184, 168, 169, 1,
+       4, 184, 183, 167, 168, 1, 4, 183, 182, 166, 167, 1, 4, 182, 181, 165, 166, 1, 4, 181,
+       180, 164, 165, 1, 4, 180, 179, 163, 164, 1, 4, 179, 178, 162, 163, 1, 4, 178, 177, 161,
+       162, 1, 4, 177, 176, 160, 161, 1, 4, 192, 207, 191, 176, 1, 4, 207, 206, 190, 191, 1,
+       4, 206, 205, 189, 190, 1, 4, 205, 204, 188, 189, 1, 4, 204, 203, 187, 188, 1, 4, 203,
+       202, 186, 187, 1, 4, 202, 201, 185, 186, 1, 4, 201, 200, 184, 185, 1, 4, 200, 199, 183,
+       184, 1, 4, 199, 198, 182, 183, 1, 4, 198, 197, 181, 182, 1, 4, 197, 196, 180, 181, 1,
+       4, 196, 195, 179, 180, 1, 4, 195, 194, 178, 179, 1, 4, 194, 193, 177, 178, 1, 4, 193,
+       192, 176, 177, 1, 4, 208, 223, 207, 192, 1, 4, 223, 222, 206, 207, 1, 4, 222, 221, 205,
+       206, 1, 4, 221, 220, 204, 205, 1, 4, 220, 219, 203, 204, 1, 4, 219, 218, 202, 203, 1,
+       4, 218, 217, 201, 202, 1, 4, 217, 216, 200, 201, 1, 4, 216, 215, 199, 200, 1, 4, 215,
+       214, 198, 199, 1, 4, 214, 213, 197, 198, 1, 4, 213, 212, 196, 197, 1, 4, 212, 211, 195,
+       196, 1, 4, 211, 210, 194, 195, 1, 4, 210, 209, 193, 194, 1, 4, 209, 208, 192, 193, 1,
+       4, 224, 239, 223, 208, 1, 4, 239, 238, 222, 223, 1, 4, 238, 237, 221, 222, 1, 4, 237,
+       236, 220, 221, 1, 4, 236, 235, 219, 220, 1, 4, 235, 234, 218, 219, 1, 4, 234, 233, 217,
+       218, 1, 4, 233, 232, 216, 217, 1, 4, 232, 231, 215, 216, 1, 4, 231, 230, 214, 215, 1,
+       4, 230, 229, 213, 214, 1, 4, 229, 228, 212, 213, 1, 4, 228, 227, 211, 212, 1, 4, 227,
+       226, 210, 211, 1, 4, 226, 225, 209, 210, 1, 4, 225, 224, 208, 209, 1, 4, 240, 255, 239,
+       224, 1, 4, 255, 254, 238, 239, 1, 4, 254, 253, 237, 238, 1, 4, 253, 252, 236, 237, 1,
+       4, 252, 251, 235, 236, 1, 4, 251, 250, 234, 235, 1, 4, 250, 249, 233, 234, 1, 4, 249,
+       248, 232, 233, 1, 4, 248, 247, 231, 232, 1, 4, 247, 246, 230, 231, 1, 4, 246, 245, 229,
+       230, 1, 4, 245, 244, 228, 229, 1, 4, 244, 243, 227, 228, 1, 4, 243, 242, 226, 227, 1,
+       4, 242, 241, 225, 226, 1, 4, 241, 240, 224, 225, 1, 4, 256, 271, 255, 240, 1, 4, 271,
+       270, 254, 255, 1, 4, 270, 269, 253, 254, 1, 4, 269, 268, 252, 253, 1, 4, 268, 267, 251,
+       252, 1, 4, 267, 266, 250, 251, 1, 4, 266, 265, 249, 250, 1, 4, 265, 264, 248, 249, 1,
+       4, 264, 263, 247, 248, 1, 4, 263, 262, 246, 247, 1, 4, 262, 261, 245, 246, 1, 4, 261,
+       260, 244, 245, 1, 4, 260, 259, 243, 244, 1, 4, 259, 258, 242, 243, 1, 4, 258, 257, 241,
+       242, 1, 4, 257, 256, 240, 241, 1, 4, 272, 287, 271, 256, 1, 4, 287, 286, 270, 271, 1,
+       4, 286, 285, 269, 270, 1, 4, 285, 284, 268, 269, 1, 4, 284, 283, 267, 268, 1, 4, 283,
+       282, 266, 267, 1, 4, 282, 281, 265, 266, 1, 4, 281, 280, 264, 265, 1, 4, 280, 279, 263,
+       264, 1, 4, 279, 278, 262, 263, 1, 4, 278, 277, 261, 262, 1, 4, 277, 276, 260, 261, 1,
+       4, 276, 275, 259, 260, 1, 4, 275, 274, 258, 259, 1, 4, 274, 273, 257, 258, 1, 4, 273,
+       272, 256, 257, 1, 4, 288, 303, 287, 272, 1, 4, 303, 302, 286, 287, 1, 4, 302, 301, 285,
+       286, 1, 4, 301, 300, 284, 285, 1, 4, 300, 299, 283, 284, 1, 4, 299, 298, 282, 283, 1,
+       4, 298, 297, 281, 282, 1, 4, 297, 296, 280, 281, 1, 4, 296, 295, 279, 280, 1, 4, 295,
+       294, 278, 279, 1, 4, 294, 293, 277, 278, 1, 4, 293, 292, 276, 277, 1, 4, 292, 291, 275,
+       276, 1, 4, 291, 290, 274, 275, 1, 4, 290, 289, 273, 274, 1, 4, 289, 288, 272, 273, 1,
+       4, 304, 319, 303, 288, 1, 4, 319, 318, 302, 303, 1, 4, 318, 317, 301, 302, 1, 4, 317,
+       316, 300, 301, 1, 4, 316, 315, 299, 300, 1, 4, 315, 314, 298, 299, 1, 4, 314, 313, 297,
+       298, 1, 4, 313, 312, 296, 297, 1, 4, 312, 311, 295, 296, 1, 4, 311, 310, 294, 295, 1,
+       4, 310, 309, 293, 294, 1, 4, 309, 308, 292, 293, 1, 4, 308, 307, 291, 292, 1, 4, 307,
+       306, 290, 291, 1, 4, 306, 305, 289, 290, 1, 4, 305, 304, 288, 289, 1, 4, 320, 335, 319,
+       304, 1, 4, 335, 334, 318, 319, 1, 4, 334, 333, 317, 318, 1, 4, 333, 332, 316, 317, 1,
+       4, 332, 331, 315, 316, 1, 4, 331, 330, 314, 315, 1, 4, 330, 329, 313, 314, 1, 4, 329,
+       328, 312, 313, 1, 4, 328, 327, 311, 312, 1, 4, 327, 326, 310, 311, 1, 4, 326, 325, 309,
+       310, 1, 4, 325, 324, 308, 309, 1, 4, 324, 323, 307, 308, 1, 4, 323, 322, 306, 307, 1,
+       4, 322, 321, 305, 306, 1, 4, 321, 320, 304, 305, 1, 4, 336, 351, 335, 320, 1, 4, 351,
+       350, 334, 335, 1, 4, 350, 349, 333, 334, 1, 4, 349, 348, 332, 333, 1, 4, 348, 347, 331,
+       332, 1, 4, 347, 346, 330, 331, 1, 4, 346, 345, 329, 330, 1, 4, 345, 344, 328, 329, 1,
+       4, 344, 343, 327, 328, 1, 4, 343, 342, 326, 327, 1, 4, 342, 341, 325, 326, 1, 4, 341,
+       340, 324, 325, 1, 4, 340, 339, 323, 324, 1, 4, 339, 338, 322, 323, 1, 4, 338, 337, 321,
+       322, 1, 4, 337, 336, 320, 321, 1, 4, 352, 367, 351, 336, 1, 4, 367, 366, 350, 351, 1,
+       4, 366, 365, 349, 350, 1, 4, 365, 364, 348, 349, 1, 4, 364, 363, 347, 348, 1, 4, 363,
+       362, 346, 347, 1, 4, 362, 361, 345, 346, 1, 4, 361, 360, 344, 345, 1, 4, 360, 359, 343,
+       344, 1, 4, 359, 358, 342, 343, 1, 4, 358, 357, 341, 342, 1, 4, 357, 356, 340, 341, 1,
+       4, 356, 355, 339, 340, 1, 4, 355, 354, 338, 339, 1, 4, 354, 353, 337, 338, 1, 4, 353,
+       352, 336, 337, 1, 4, 368, 383, 367, 352, 1, 4, 383, 382, 366, 367, 1, 4, 382, 381, 365,
+       366, 1, 4, 381, 380, 364, 365, 1, 4, 380, 379, 363, 364, 1, 4, 379, 378, 362, 363, 1,
+       4, 378, 377, 361, 362, 1, 4, 377, 376, 360, 361, 1, 4, 376, 375, 359, 360, 1, 4, 375,
+       374, 358, 359, 1, 4, 374, 373, 357, 358, 1, 4, 373, 372, 356, 357, 1, 4, 372, 371, 355,
+       356, 1, 4, 371, 370, 354, 355, 1, 4, 370, 369, 353, 354, 1, 4, 369, 368, 352, 353, 1,
+       4, 384, 399, 383, 368, 1, 4, 399, 398, 382, 383, 1, 4, 398, 397, 381, 382, 1, 4, 397,
+       396, 380, 381, 1, 4, 396, 395, 379, 380, 1, 4, 395, 394, 378, 379, 1, 4, 394, 393, 377,
+       378, 1, 4, 393, 392, 376, 377, 1, 4, 392, 391, 375, 376, 1, 4, 391, 390, 374, 375, 1,
+       4, 390, 389, 373, 374, 1, 4, 389, 388, 372, 373, 1, 4, 388, 387, 371, 372, 1, 4, 387,
+       386, 370, 371, 1, 4, 386, 385, 369, 370, 1, 4, 385, 384, 368, 369, 1, 4, 400, 415, 399,
+       384, 1, 4, 415, 414, 398, 399, 1, 4, 414, 413, 397, 398, 1, 4, 413, 412, 396, 397, 1,
+       4, 412, 411, 395, 396, 1, 4, 411, 410, 394, 395, 1, 4, 410, 409, 393, 394, 1, 4, 409,
+       408, 392, 393, 1, 4, 408, 407, 391, 392, 1, 4, 407, 406, 390, 391, 1, 4, 406, 405, 389,
+       390, 1, 4, 405, 404, 388, 389, 1, 4, 404, 403, 387, 388, 1, 4, 403, 402, 386, 387, 1,
+       4, 402, 401, 385, 386, 1, 4, 401, 400, 384, 385, 1, 4, 416, 431, 415, 400, 1, 4, 431,
+       430, 414, 415, 1, 4, 430, 429, 413, 414, 1, 4, 429, 428, 412, 413, 1, 4, 428, 427, 411,
+       412, 1, 4, 427, 426, 410, 411, 1, 4, 426, 425, 409, 410, 1, 4, 425, 424, 408, 409, 1,
+       4, 424, 423, 407, 408, 1, 4, 423, 422, 406, 407, 1, 4, 422, 421, 405, 406, 1, 4, 421,
+       420, 404, 405, 1, 4, 420, 419, 403, 404, 1, 4, 419, 418, 402, 403, 1, 4, 418, 417, 401,
+       402, 1, 4, 417, 416, 400, 401, 1, 4, 432, 447, 431, 416, 1, 4, 447, 446, 430, 431, 1,
+       4, 446, 445, 429, 430, 1, 4, 445, 444, 428, 429, 1, 4, 444, 443, 427, 428, 1, 4, 443,
+       442, 426, 427, 1, 4, 442, 441, 425, 426, 1, 4, 441, 440, 424, 425, 1, 4, 440, 439, 423,
+       424, 1, 4, 439, 438, 422, 423, 1, 4, 438, 437, 421, 422, 1, 4, 437, 436, 420, 421, 1,
+       4, 436, 435, 419, 420, 1, 4, 435, 434, 418, 419, 1, 4, 434, 433, 417, 418, 1, 4, 433,
+       432, 416, 417, 1, 4, 448, 463, 447, 432, 1, 4, 463, 462, 446, 447, 1, 4, 462, 461, 445,
+       446, 1, 4, 461, 460, 444, 445, 1, 4, 460, 459, 443, 444, 1, 4, 459, 458, 442, 443, 1,
+       4, 458, 457, 441, 442, 1, 4, 457, 456, 440, 441, 1, 4, 456, 455, 439, 440, 1, 4, 455,
+       454, 438, 439, 1, 4, 454, 453, 437, 438, 1, 4, 453, 452, 436, 437, 1, 4, 452, 451, 435,
+       436, 1, 4, 451, 450, 434, 435, 1, 4, 450, 449, 433, 434, 1, 4, 449, 448, 432, 433, 1,
+       4, 464, 479, 463, 448, 1, 4, 479, 478, 462, 463, 1, 4, 478, 477, 461, 462, 1, 4, 477,
+       476, 460, 461, 1, 4, 476, 475, 459, 460, 1, 4, 475, 474, 458, 459, 1, 4, 474, 473, 457,
+       458, 1, 4, 473, 472, 456, 457, 1, 4, 472, 471, 455, 456, 1, 4, 471, 470, 454, 455, 1,
+       4, 470, 469, 453, 454, 1, 4, 469, 468, 452, 453, 1, 4, 468, 467, 451, 452, 1, 4, 467,
+       466, 450, 451, 1, 4, 466, 465, 449, 450, 1, 4, 465, 464, 448, 449, 1, 4, 480, 495, 479,
+       464, 1, 4, 495, 494, 478, 479, 1, 4, 494, 493, 477, 478, 1, 4, 493, 492, 476, 477, 1,
+       4, 492, 491, 475, 476, 1, 4, 491, 490, 474, 475, 1, 4, 490, 489, 473, 474, 1, 4, 489,
+       488, 472, 473, 1, 4, 488, 487, 471, 472, 1, 4, 487, 486, 470, 471, 1, 4, 486, 485, 469,
+       470, 1, 4, 485, 484, 468, 469, 1, 4, 484, 483, 467, 468, 1, 4, 483, 482, 466, 467, 1,
+       4, 482, 481, 465, 466, 1, 4, 481, 480, 464, 465, 1, 4, 496, 511, 495, 480, 1, 4, 511,
+       510, 494, 495, 1, 4, 510, 509, 493, 494, 1, 4, 509, 508, 492, 493, 1, 4, 508, 507, 491,
+       492, 1, 4, 507, 506, 490, 491, 1, 4, 506, 505, 489, 490, 1, 4, 505, 504, 488, 489, 1,
+       4, 504, 503, 487, 488, 1, 4, 503, 502, 486, 487, 1, 4, 502, 501, 485, 486, 1, 4, 501,
+       500, 484, 485, 1, 4, 500, 499, 483, 484, 1, 4, 499, 498, 482, 483, 1, 4, 498, 497, 481,
+       482, 1, 4, 497, 496, 480, 481, 1, 4, 0, 15, 511, 496, 1, 4, 15, 14, 510, 511, 1,
+4, 14, 13, 509, 510, 1, 4, 13, 12, 508, 509, 1, 4, 12, 11, 507, 508, 1, 4, 11,
+  10, 506, 507, 1, 4, 10, 9, 505, 506, 1, 4, 9, 8, 504, 505, 1, 4, 8, 7, 503,
+    504, 1, 4, 7, 6, 502, 503, 1, 4, 6, 5, 501, 502, 1, 4, 5, 4, 500, 501, 1,
+      4, 4, 3, 499, 500, 1, 4, 3, 2, 498, 499, 1, 4, 2, 1, 497, 498, 1, 4, 1,
+       0, 496, 497, 1,
+       0
+};
+
+struct lwo  LWO_BigValve =
+{
+       716,                    /* number of points */
+       BigValve_PNTS, BigValve_normals, BigValve_POLS, 0L
+};
+
+static GLfloat Bolts3D_PNTS[] =
+{
+       (GLfloat) - 0.160704, (GLfloat) 0.399000, (GLfloat) 0.600000,
+       (GLfloat) - 0.160704, (GLfloat) 0.399000, (GLfloat) - 0.500000,
+       (GLfloat) - 0.400000, (GLfloat) 0.160257, (GLfloat) 0.600000,
+       (GLfloat) - 0.400000, (GLfloat) 0.160257, (GLfloat) - 0.500000,
+       (GLfloat) - 0.400000, (GLfloat) - 0.170369, (GLfloat) 0.600000,
+       (GLfloat) - 0.400000, (GLfloat) - 0.170369, (GLfloat) - 0.500000,
+       (GLfloat) - 0.153738, (GLfloat) - 0.400000, (GLfloat) 0.600000,
+       (GLfloat) - 0.153738, (GLfloat) - 0.400000, (GLfloat) - 0.500000,
+       (GLfloat) 0.176887, (GLfloat) - 0.400000, (GLfloat) 0.600000,
+       (GLfloat) 0.176887, (GLfloat) - 0.400000, (GLfloat) - 0.500000,
+       (GLfloat) 0.400000, (GLfloat) - 0.163403, (GLfloat) 0.600000,
+       (GLfloat) 0.400000, (GLfloat) - 0.163403, (GLfloat) - 0.500000,
+       (GLfloat) 0.400000, (GLfloat) 0.167223, (GLfloat) 0.600000,
+       (GLfloat) 0.400000, (GLfloat) 0.167223, (GLfloat) - 0.500000,
+       (GLfloat) 0.169922, (GLfloat) 0.399000, (GLfloat) 0.600000,
+       (GLfloat) 0.169922, (GLfloat) 0.399000, (GLfloat) - 0.500000,
+       (GLfloat) - 0.160704, (GLfloat) 0.399000, (GLfloat) 0.500000,
+       (GLfloat) - 0.160704, (GLfloat) 0.399000, (GLfloat) - 0.600000,
+       (GLfloat) - 0.400000, (GLfloat) 0.160257, (GLfloat) - 0.600000,
+       (GLfloat) - 0.400000, (GLfloat) 0.160257, (GLfloat) 0.500000,
+       (GLfloat) - 0.400000, (GLfloat) - 0.170369, (GLfloat) - 0.600000,
+       (GLfloat) - 0.400000, (GLfloat) - 0.170369, (GLfloat) 0.500000,
+       (GLfloat) - 0.153738, (GLfloat) - 0.400000, (GLfloat) - 0.600000,
+       (GLfloat) - 0.153738, (GLfloat) - 0.400000, (GLfloat) 0.500000,
+       (GLfloat) 0.176887, (GLfloat) - 0.400000, (GLfloat) 0.500000,
+       (GLfloat) 0.176887, (GLfloat) - 0.400000, (GLfloat) - 0.600000,
+       (GLfloat) 0.400000, (GLfloat) - 0.163403, (GLfloat) 0.500000,
+       (GLfloat) 0.400000, (GLfloat) - 0.163403, (GLfloat) - 0.600000,
+       (GLfloat) 0.400000, (GLfloat) 0.167223, (GLfloat) - 0.600000,
+       (GLfloat) 0.400000, (GLfloat) 0.167223, (GLfloat) 0.500000,
+       (GLfloat) 0.169922, (GLfloat) 0.399000, (GLfloat) - 0.600000,
+       (GLfloat) 0.169922, (GLfloat) 0.399000, (GLfloat) 0.500000,
+};
+
+static GLfloat Bolts3D_normals[] =
+{
+       (GLfloat) 0.000000, (GLfloat) 1.000000, (GLfloat) 0.000000,
+       (GLfloat) 0.709703, (GLfloat) 0.704502, (GLfloat) 0.000000,
+       (GLfloat) 1.000000, (GLfloat) - 0.000000, (GLfloat) - 0.000000,
+       (GLfloat) 0.727535, (GLfloat) - 0.686070, (GLfloat) - 0.000000,
+       (GLfloat) 0.000000, (GLfloat) - 1.000000, (GLfloat) - 0.000000,
+       (GLfloat) - 0.681980, (GLfloat) - 0.731370, (GLfloat) - 0.000000,
+       (GLfloat) - 1.000000, (GLfloat) - 0.000000, (GLfloat) - 0.000000,
+       (GLfloat) - 0.706289, (GLfloat) 0.707924, (GLfloat) - 0.000000,
+       (GLfloat) - 0.000000, (GLfloat) - 0.000000, (GLfloat) 1.000000,
+       (GLfloat) 0.000000, (GLfloat) 1.000000, (GLfloat) 0.000000,
+       (GLfloat) 0.709703, (GLfloat) 0.704502, (GLfloat) 0.000000,
+       (GLfloat) 1.000000, (GLfloat) - 0.000000, (GLfloat) - 0.000000,
+       (GLfloat) 0.727535, (GLfloat) - 0.686070, (GLfloat) - 0.000000,
+       (GLfloat) 0.000000, (GLfloat) - 1.000000, (GLfloat) - 0.000000,
+       (GLfloat) - 0.681980, (GLfloat) - 0.731370, (GLfloat) - 0.000000,
+       (GLfloat) - 1.000000, (GLfloat) - 0.000000, (GLfloat) - 0.000000,
+       (GLfloat) - 0.706289, (GLfloat) 0.707924, (GLfloat) - 0.000000,
+       (GLfloat) - 0.000000, (GLfloat) 0.000000, (GLfloat) - 1.000000,
+};
+
+static unsigned short int Bolts3D_POLS[] =
+{
+      4, 16, 31, 14, 0, 1, 4, 31, 29, 12, 14, 1, 4, 29, 26, 10, 12, 1, 4, 26,
+       24, 8, 10, 1, 4, 24, 23, 6, 8, 1, 4, 23, 21, 4, 6, 1, 4, 21, 19, 2,
+       4, 1, 4, 19, 16, 0, 2, 1, 8, 14, 12, 10, 8, 6, 4, 2, 0, 1, 4, 17,
+      30, 15, 1, 1, 4, 30, 28, 13, 15, 1, 4, 28, 27, 11, 13, 1, 4, 27, 25, 9,
+       11, 1, 4, 25, 22, 7, 9, 1, 4, 22, 20, 5, 7, 1, 4, 20, 18, 3, 5, 1,
+       4, 18, 17, 1, 3, 1, 8, 30, 17, 18, 20, 22, 25, 27, 28, 1,
+       0
+};
+
+struct lwo  LWO_Bolts3D =
+{
+       32,                     /* number of points */
+       Bolts3D_PNTS, Bolts3D_normals, Bolts3D_POLS, 0L
+};
+
+static GLfloat GuageConnector_PNTS[] =
+{
+       (GLfloat) 0.200000, (GLfloat) 0.400000, (GLfloat) - 0.000000,
+       (GLfloat) 0.200000, (GLfloat) 0.800000, (GLfloat) - 0.000000,
+       (GLfloat) 0.193185, (GLfloat) 0.400000, (GLfloat) - 0.051764,
+       (GLfloat) 0.193185, (GLfloat) 0.800000, (GLfloat) - 0.051764,
+       (GLfloat) 0.173205, (GLfloat) 0.400000, (GLfloat) - 0.100000,
+       (GLfloat) 0.173205, (GLfloat) 0.800000, (GLfloat) - 0.100000,
+       (GLfloat) 0.141421, (GLfloat) 0.800000, (GLfloat) - 0.141421,
+       (GLfloat) 0.141421, (GLfloat) 0.400000, (GLfloat) - 0.141421,
+       (GLfloat) 0.100000, (GLfloat) 0.400000, (GLfloat) - 0.173205,
+       (GLfloat) 0.100000, (GLfloat) 0.800000, (GLfloat) - 0.173205,
+       (GLfloat) 0.051764, (GLfloat) 0.800000, (GLfloat) - 0.193185,
+       (GLfloat) 0.051764, (GLfloat) 0.400000, (GLfloat) - 0.193185,
+       (GLfloat) 0.000000, (GLfloat) 0.800000, (GLfloat) - 0.200000,
+       (GLfloat) 0.000000, (GLfloat) 0.400000, (GLfloat) - 0.200000,
+       (GLfloat) - 0.051764, (GLfloat) 0.800000, (GLfloat) - 0.193185,
+       (GLfloat) - 0.051764, (GLfloat) 0.400000, (GLfloat) - 0.193185,
+       (GLfloat) - 0.100000, (GLfloat) 0.800000, (GLfloat) - 0.173205,
+       (GLfloat) - 0.100000, (GLfloat) 0.400000, (GLfloat) - 0.173205,
+       (GLfloat) - 0.141421, (GLfloat) 0.400000, (GLfloat) - 0.141421,
+       (GLfloat) - 0.141421, (GLfloat) 0.800000, (GLfloat) - 0.141421,
+       (GLfloat) - 0.173205, (GLfloat) 0.800000, (GLfloat) - 0.100000,
+       (GLfloat) - 0.173205, (GLfloat) 0.400000, (GLfloat) - 0.100000,
+       (GLfloat) - 0.193185, (GLfloat) 0.400000, (GLfloat) - 0.051764,
+       (GLfloat) - 0.193185, (GLfloat) 0.800000, (GLfloat) - 0.051764,
+       (GLfloat) - 0.200000, (GLfloat) 0.400000, (GLfloat) - 0.000000,
+       (GLfloat) - 0.200000, (GLfloat) 0.800000, (GLfloat) - 0.000000,
+       (GLfloat) - 0.193185, (GLfloat) 0.400000, (GLfloat) 0.051764,
+       (GLfloat) - 0.193185, (GLfloat) 0.800000, (GLfloat) 0.051764,
+       (GLfloat) - 0.173205, (GLfloat) 0.400000, (GLfloat) 0.100000,
+       (GLfloat) - 0.173205, (GLfloat) 0.800000, (GLfloat) 0.100000,
+       (GLfloat) - 0.141421, (GLfloat) 0.800000, (GLfloat) 0.141421,
+       (GLfloat) - 0.141421, (GLfloat) 0.400000, (GLfloat) 0.141421,
+       (GLfloat) - 0.100000, (GLfloat) 0.800000, (GLfloat) 0.173205,
+       (GLfloat) - 0.100000, (GLfloat) 0.400000, (GLfloat) 0.173205,
+       (GLfloat) - 0.051764, (GLfloat) 0.800000, (GLfloat) 0.193185,
+       (GLfloat) - 0.051764, (GLfloat) 0.400000, (GLfloat) 0.193185,
+       (GLfloat) - 0.000000, (GLfloat) 0.800000, (GLfloat) 0.200000,
+       (GLfloat) - 0.000000, (GLfloat) 0.400000, (GLfloat) 0.200000,
+       (GLfloat) 0.051764, (GLfloat) 0.800000, (GLfloat) 0.193185,
+       (GLfloat) 0.051764, (GLfloat) 0.400000, (GLfloat) 0.193185,
+       (GLfloat) 0.100000, (GLfloat) 0.400000, (GLfloat) 0.173205,
+       (GLfloat) 0.100000, (GLfloat) 0.800000, (GLfloat) 0.173205,
+       (GLfloat) 0.141421, (GLfloat) 0.400000, (GLfloat) 0.141421,
+       (GLfloat) 0.141421, (GLfloat) 0.800000, (GLfloat) 0.141421,
+       (GLfloat) 0.173205, (GLfloat) 0.800000, (GLfloat) 0.100000,
+       (GLfloat) 0.173205, (GLfloat) 0.400000, (GLfloat) 0.100000,
+       (GLfloat) 0.193185, (GLfloat) 0.400000, (GLfloat) 0.051764,
+       (GLfloat) 0.193185, (GLfloat) 0.800000, (GLfloat) 0.051764,
+       (GLfloat) 0.200000, (GLfloat) 0.550000, (GLfloat) - 0.000000,
+       (GLfloat) 0.193185, (GLfloat) 0.550000, (GLfloat) - 0.051764,
+       (GLfloat) 0.173205, (GLfloat) 0.550000, (GLfloat) - 0.100000,
+       (GLfloat) 0.141421, (GLfloat) 0.550000, (GLfloat) - 0.141421,
+       (GLfloat) 0.100000, (GLfloat) 0.550000, (GLfloat) - 0.173205,
+       (GLfloat) 0.051764, (GLfloat) 0.550000, (GLfloat) - 0.193185,
+       (GLfloat) 0.000000, (GLfloat) 0.550000, (GLfloat) - 0.200000,
+       (GLfloat) - 0.051764, (GLfloat) 0.550000, (GLfloat) - 0.193185,
+       (GLfloat) - 0.100000, (GLfloat) 0.550000, (GLfloat) - 0.173205,
+       (GLfloat) - 0.141421, (GLfloat) 0.550000, (GLfloat) - 0.141421,
+       (GLfloat) - 0.173205, (GLfloat) 0.550000, (GLfloat) - 0.100000,
+       (GLfloat) - 0.193185, (GLfloat) 0.550000, (GLfloat) - 0.051764,
+       (GLfloat) - 0.200000, (GLfloat) 0.550000, (GLfloat) - 0.000000,
+       (GLfloat) - 0.193185, (GLfloat) 0.550000, (GLfloat) 0.051764,
+       (GLfloat) - 0.173205, (GLfloat) 0.550000, (GLfloat) 0.100000,
+       (GLfloat) - 0.141421, (GLfloat) 0.550000, (GLfloat) 0.141421,
+       (GLfloat) - 0.100000, (GLfloat) 0.550000, (GLfloat) 0.173205,
+       (GLfloat) - 0.051764, (GLfloat) 0.550000, (GLfloat) 0.193185,
+       (GLfloat) - 0.000000, (GLfloat) 0.550000, (GLfloat) 0.200000,
+       (GLfloat) 0.051764, (GLfloat) 0.550000, (GLfloat) 0.193185,
+       (GLfloat) 0.100000, (GLfloat) 0.550000, (GLfloat) 0.173205,
+       (GLfloat) 0.141421, (GLfloat) 0.550000, (GLfloat) 0.141421,
+       (GLfloat) 0.173205, (GLfloat) 0.550000, (GLfloat) 0.100000,
+       (GLfloat) 0.193185, (GLfloat) 0.550000, (GLfloat) 0.051764,
+       (GLfloat) 0.150000, (GLfloat) 0.550000, (GLfloat) - 0.000000,
+       (GLfloat) 0.144889, (GLfloat) 0.550000, (GLfloat) - 0.038823,
+       (GLfloat) 0.129904, (GLfloat) 0.550000, (GLfloat) - 0.075000,
+       (GLfloat) 0.106066, (GLfloat) 0.550000, (GLfloat) - 0.106066,
+       (GLfloat) 0.075000, (GLfloat) 0.550000, (GLfloat) - 0.129904,
+       (GLfloat) 0.038823, (GLfloat) 0.550000, (GLfloat) - 0.144889,
+       (GLfloat) 0.000000, (GLfloat) 0.550000, (GLfloat) - 0.150000,
+       (GLfloat) - 0.038823, (GLfloat) 0.550000, (GLfloat) - 0.144889,
+       (GLfloat) - 0.075000, (GLfloat) 0.550000, (GLfloat) - 0.129904,
+       (GLfloat) - 0.106066, (GLfloat) 0.550000, (GLfloat) - 0.106066,
+       (GLfloat) - 0.129904, (GLfloat) 0.550000, (GLfloat) - 0.075000,
+       (GLfloat) - 0.144889, (GLfloat) 0.550000, (GLfloat) - 0.038823,
+       (GLfloat) - 0.150000, (GLfloat) 0.550000, (GLfloat) - 0.000000,
+       (GLfloat) - 0.144889, (GLfloat) 0.550000, (GLfloat) 0.038823,
+       (GLfloat) - 0.129904, (GLfloat) 0.550000, (GLfloat) 0.075000,
+       (GLfloat) - 0.106066, (GLfloat) 0.550000, (GLfloat) 0.106066,
+       (GLfloat) - 0.075000, (GLfloat) 0.550000, (GLfloat) 0.129904,
+       (GLfloat) - 0.038823, (GLfloat) 0.550000, (GLfloat) 0.144889,
+       (GLfloat) - 0.000000, (GLfloat) 0.550000, (GLfloat) 0.150000,
+       (GLfloat) 0.038823, (GLfloat) 0.550000, (GLfloat) 0.144889,
+       (GLfloat) 0.075000, (GLfloat) 0.550000, (GLfloat) 0.129904,
+       (GLfloat) 0.106066, (GLfloat) 0.550000, (GLfloat) 0.106066,
+       (GLfloat) 0.129904, (GLfloat) 0.550000, (GLfloat) 0.075000,
+       (GLfloat) 0.144889, (GLfloat) 0.550000, (GLfloat) 0.038823,
+       (GLfloat) 0.150000, (GLfloat) 0.800000, (GLfloat) - 0.000000,
+       (GLfloat) 0.144889, (GLfloat) 0.800000, (GLfloat) - 0.038823,
+       (GLfloat) 0.129904, (GLfloat) 0.800000, (GLfloat) - 0.075000,
+       (GLfloat) 0.106066, (GLfloat) 0.800000, (GLfloat) - 0.106066,
+       (GLfloat) 0.075000, (GLfloat) 0.800000, (GLfloat) - 0.129904,
+       (GLfloat) 0.038823, (GLfloat) 0.800000, (GLfloat) - 0.144889,
+       (GLfloat) 0.000000, (GLfloat) 0.800000, (GLfloat) - 0.150000,
+       (GLfloat) - 0.038823, (GLfloat) 0.800000, (GLfloat) - 0.144889,
+       (GLfloat) - 0.075000, (GLfloat) 0.800000, (GLfloat) - 0.129904,
+       (GLfloat) - 0.106066, (GLfloat) 0.800000, (GLfloat) - 0.106066,
+       (GLfloat) - 0.129904, (GLfloat) 0.800000, (GLfloat) - 0.075000,
+       (GLfloat) - 0.144889, (GLfloat) 0.800000, (GLfloat) - 0.038823,
+       (GLfloat) - 0.150000, (GLfloat) 0.800000, (GLfloat) - 0.000000,
+       (GLfloat) - 0.144889, (GLfloat) 0.800000, (GLfloat) 0.038823,
+       (GLfloat) - 0.129904, (GLfloat) 0.800000, (GLfloat) 0.075000,
+       (GLfloat) - 0.106066, (GLfloat) 0.800000, (GLfloat) 0.106066,
+       (GLfloat) - 0.075000, (GLfloat) 0.800000, (GLfloat) 0.129904,
+       (GLfloat) - 0.038823, (GLfloat) 0.800000, (GLfloat) 0.144889,
+       (GLfloat) - 0.000000, (GLfloat) 0.800000, (GLfloat) 0.150000,
+       (GLfloat) 0.038823, (GLfloat) 0.800000, (GLfloat) 0.144889,
+       (GLfloat) 0.075000, (GLfloat) 0.800000, (GLfloat) 0.129904,
+       (GLfloat) 0.106066, (GLfloat) 0.800000, (GLfloat) 0.106066,
+       (GLfloat) 0.129904, (GLfloat) 0.800000, (GLfloat) 0.075000,
+       (GLfloat) 0.144889, (GLfloat) 0.800000, (GLfloat) 0.038823,
+       (GLfloat) 0.200000, (GLfloat) 0.875988, (GLfloat) - 0.000000,
+       (GLfloat) 0.193185, (GLfloat) 0.872346, (GLfloat) - 0.051764,
+       (GLfloat) 0.191342, (GLfloat) 0.871360, (GLfloat) - 0.056214,
+       (GLfloat) 0.173205, (GLfloat) 0.865859, (GLfloat) - 0.100000,
+       (GLfloat) 0.141421, (GLfloat) 0.856217, (GLfloat) - 0.141421,
+       (GLfloat) 0.100000, (GLfloat) 0.843652, (GLfloat) - 0.173205,
+       (GLfloat) 0.097545, (GLfloat) 0.842907, (GLfloat) - 0.174222,
+       (GLfloat) 0.051764, (GLfloat) 0.838398, (GLfloat) - 0.193185,
+       (GLfloat) 0.000000, (GLfloat) 0.833300, (GLfloat) - 0.200000,
+       (GLfloat) - 0.051764, (GLfloat) 0.838398, (GLfloat) - 0.193185,
+       (GLfloat) - 0.097545, (GLfloat) 0.842907, (GLfloat) - 0.174222,
+       (GLfloat) - 0.100000, (GLfloat) 0.843652, (GLfloat) - 0.173205,
+       (GLfloat) - 0.141421, (GLfloat) 0.856217, (GLfloat) - 0.141421,
+       (GLfloat) - 0.173205, (GLfloat) 0.865859, (GLfloat) - 0.100000,
+       (GLfloat) - 0.191342, (GLfloat) 0.871360, (GLfloat) - 0.056214,
+       (GLfloat) - 0.193185, (GLfloat) 0.872346, (GLfloat) - 0.051764,
+       (GLfloat) - 0.200000, (GLfloat) 0.875988, (GLfloat) - 0.000000,
+       (GLfloat) - 0.193185, (GLfloat) 0.872346, (GLfloat) 0.051764,
+       (GLfloat) - 0.173205, (GLfloat) 0.865859, (GLfloat) 0.100000,
+       (GLfloat) - 0.191342, (GLfloat) 0.871360, (GLfloat) 0.056214,
+       (GLfloat) - 0.141421, (GLfloat) 0.856217, (GLfloat) 0.141421,
+       (GLfloat) - 0.100000, (GLfloat) 0.843652, (GLfloat) 0.173205,
+       (GLfloat) - 0.051764, (GLfloat) 0.838398, (GLfloat) 0.193185,
+       (GLfloat) - 0.097545, (GLfloat) 0.842907, (GLfloat) 0.174222,
+       (GLfloat) - 0.000000, (GLfloat) 0.833300, (GLfloat) 0.200000,
+       (GLfloat) 0.051764, (GLfloat) 0.838398, (GLfloat) 0.193185,
+       (GLfloat) 0.100000, (GLfloat) 0.843652, (GLfloat) 0.173205,
+       (GLfloat) 0.097545, (GLfloat) 0.842907, (GLfloat) 0.174222,
+       (GLfloat) 0.141421, (GLfloat) 0.856217, (GLfloat) 0.141421,
+       (GLfloat) 0.173205, (GLfloat) 0.865859, (GLfloat) 0.100000,
+       (GLfloat) 0.193185, (GLfloat) 0.872346, (GLfloat) 0.051764,
+       (GLfloat) 0.191342, (GLfloat) 0.871360, (GLfloat) 0.056214,
+};
+
+static GLfloat GuageConnector_normals[] =
+{
+       (GLfloat) 0.991445, (GLfloat) 0.000000, (GLfloat) - 0.130526,
+       (GLfloat) 0.923880, (GLfloat) 0.000000, (GLfloat) - 0.382683,
+       (GLfloat) 0.793353, (GLfloat) 0.000000, (GLfloat) - 0.608761,
+       (GLfloat) 0.608761, (GLfloat) 0.000000, (GLfloat) - 0.793353,
+       (GLfloat) 0.382683, (GLfloat) 0.000000, (GLfloat) - 0.923880,
+       (GLfloat) 0.130526, (GLfloat) 0.000000, (GLfloat) - 0.991445,
+       (GLfloat) - 0.130526, (GLfloat) - 0.000000, (GLfloat) - 0.991445,
+       (GLfloat) - 0.382683, (GLfloat) - 0.000000, (GLfloat) - 0.923880,
+       (GLfloat) - 0.608761, (GLfloat) - 0.000000, (GLfloat) - 0.793353,
+       (GLfloat) - 0.793353, (GLfloat) - 0.000000, (GLfloat) - 0.608761,
+       (GLfloat) - 0.923880, (GLfloat) - 0.000000, (GLfloat) - 0.382683,
+       (GLfloat) - 0.991445, (GLfloat) - 0.000000, (GLfloat) - 0.130526,
+       (GLfloat) - 0.991445, (GLfloat) 0.000000, (GLfloat) 0.130526,
+       (GLfloat) - 0.923880, (GLfloat) 0.000000, (GLfloat) 0.382683,
+       (GLfloat) - 0.793353, (GLfloat) 0.000000, (GLfloat) 0.608761,
+       (GLfloat) - 0.608761, (GLfloat) 0.000000, (GLfloat) 0.793353,
+       (GLfloat) - 0.382683, (GLfloat) 0.000000, (GLfloat) 0.923880,
+       (GLfloat) - 0.130526, (GLfloat) 0.000000, (GLfloat) 0.991445,
+       (GLfloat) 0.130526, (GLfloat) 0.000000, (GLfloat) 0.991445,
+       (GLfloat) 0.382683, (GLfloat) 0.000000, (GLfloat) 0.923880,
+       (GLfloat) 0.608761, (GLfloat) 0.000000, (GLfloat) 0.793353,
+       (GLfloat) 0.793353, (GLfloat) 0.000000, (GLfloat) 0.608761,
+       (GLfloat) 0.923880, (GLfloat) 0.000000, (GLfloat) 0.382683,
+       (GLfloat) 0.991445, (GLfloat) 0.000000, (GLfloat) 0.130526,
+       (GLfloat) 0.991445, (GLfloat) 0.000000, (GLfloat) - 0.130526,
+       (GLfloat) 0.923880, (GLfloat) 0.000000, (GLfloat) - 0.382684,
+       (GLfloat) 0.793353, (GLfloat) 0.000000, (GLfloat) - 0.608761,
+       (GLfloat) 0.608761, (GLfloat) 0.000000, (GLfloat) - 0.793353,
+       (GLfloat) 0.382684, (GLfloat) 0.000000, (GLfloat) - 0.923880,
+       (GLfloat) 0.130526, (GLfloat) 0.000000, (GLfloat) - 0.991445,
+       (GLfloat) - 0.130526, (GLfloat) 0.000000, (GLfloat) - 0.991445,
+       (GLfloat) - 0.382684, (GLfloat) 0.000000, (GLfloat) - 0.923880,
+       (GLfloat) - 0.608761, (GLfloat) 0.000000, (GLfloat) - 0.793353,
+       (GLfloat) - 0.793353, (GLfloat) 0.000000, (GLfloat) - 0.608761,
+       (GLfloat) - 0.923880, (GLfloat) 0.000000, (GLfloat) - 0.382684,
+       (GLfloat) - 0.991445, (GLfloat) 0.000000, (GLfloat) - 0.130526,
+       (GLfloat) - 0.991445, (GLfloat) 0.000000, (GLfloat) 0.130526,
+       (GLfloat) - 0.923880, (GLfloat) 0.000000, (GLfloat) 0.382684,
+       (GLfloat) - 0.793353, (GLfloat) 0.000000, (GLfloat) 0.608761,
+       (GLfloat) - 0.608761, (GLfloat) 0.000000, (GLfloat) 0.793353,
+       (GLfloat) - 0.382684, (GLfloat) 0.000000, (GLfloat) 0.923880,
+       (GLfloat) - 0.130526, (GLfloat) 0.000000, (GLfloat) 0.991445,
+       (GLfloat) 0.130526, (GLfloat) - 0.000000, (GLfloat) 0.991445,
+       (GLfloat) 0.382684, (GLfloat) - 0.000000, (GLfloat) 0.923880,
+       (GLfloat) 0.608761, (GLfloat) - 0.000000, (GLfloat) 0.793353,
+       (GLfloat) 0.793353, (GLfloat) - 0.000000, (GLfloat) 0.608761,
+       (GLfloat) 0.923880, (GLfloat) - 0.000000, (GLfloat) 0.382684,
+       (GLfloat) 0.991445, (GLfloat) - 0.000000, (GLfloat) 0.130526,
+       (GLfloat) - 0.000000, (GLfloat) - 1.000000, (GLfloat) - 0.000000,
+       (GLfloat) 0.991445, (GLfloat) 0.000000, (GLfloat) - 0.130526,
+       (GLfloat) 0.923880, (GLfloat) 0.000000, (GLfloat) - 0.382684,
+       (GLfloat) 0.793353, (GLfloat) 0.000000, (GLfloat) - 0.608761,
+       (GLfloat) 0.608761, (GLfloat) 0.000000, (GLfloat) - 0.793353,
+       (GLfloat) 0.382684, (GLfloat) 0.000000, (GLfloat) - 0.923880,
+       (GLfloat) 0.130526, (GLfloat) 0.000000, (GLfloat) - 0.991445,
+       (GLfloat) - 0.130526, (GLfloat) 0.000000, (GLfloat) - 0.991445,
+       (GLfloat) - 0.382684, (GLfloat) 0.000000, (GLfloat) - 0.923880,
+       (GLfloat) - 0.608761, (GLfloat) 0.000000, (GLfloat) - 0.793353,
+       (GLfloat) - 0.793353, (GLfloat) 0.000000, (GLfloat) - 0.608761,
+       (GLfloat) - 0.923880, (GLfloat) 0.000000, (GLfloat) - 0.382684,
+       (GLfloat) - 0.991445, (GLfloat) 0.000000, (GLfloat) - 0.130526,
+       (GLfloat) - 0.991445, (GLfloat) 0.000000, (GLfloat) 0.130526,
+       (GLfloat) - 0.923880, (GLfloat) 0.000000, (GLfloat) 0.382684,
+       (GLfloat) - 0.793353, (GLfloat) 0.000000, (GLfloat) 0.608761,
+       (GLfloat) - 0.608761, (GLfloat) 0.000000, (GLfloat) 0.793353,
+       (GLfloat) - 0.382684, (GLfloat) 0.000000, (GLfloat) 0.923880,
+       (GLfloat) - 0.130526, (GLfloat) 0.000000, (GLfloat) 0.991445,
+       (GLfloat) 0.130526, (GLfloat) - 0.000000, (GLfloat) 0.991445,
+       (GLfloat) 0.382684, (GLfloat) - 0.000000, (GLfloat) 0.923880,
+       (GLfloat) 0.608761, (GLfloat) - 0.000000, (GLfloat) 0.793353,
+       (GLfloat) 0.793353, (GLfloat) - 0.000000, (GLfloat) 0.608761,
+       (GLfloat) 0.923880, (GLfloat) - 0.000000, (GLfloat) 0.382684,
+       (GLfloat) 0.991445, (GLfloat) - 0.000000, (GLfloat) 0.130526,
+       (GLfloat) - 0.000000, (GLfloat) 1.000000, (GLfloat) - 0.000000,
+};
+
+static unsigned short int GuageConnector_POLS[] =
+{
+    4, 1, 120, 121, 3, 1, 5, 3, 121, 122, 123, 5, 1, 4, 5, 123, 124, 6, 1, 4,
+6, 124, 125, 9, 1, 5, 9, 125, 126, 127, 10, 1, 4, 10, 127, 128, 12, 1, 4, 14,
+       12, 128, 129, 1, 5, 16, 14, 129, 130, 131, 1, 4, 19, 16, 131, 132, 1, 4, 20, 19,
+       132, 133, 1, 5, 23, 20, 133, 134, 135, 1, 4, 25, 23, 135, 136, 1, 4, 25, 136, 137,
+       27, 1, 5, 27, 137, 139, 138, 29, 1, 4, 29, 138, 140, 30, 1, 4, 30, 140, 141, 32,
+       1, 5, 32, 141, 143, 142, 34, 1, 4, 34, 142, 144, 36, 1, 4, 38, 36, 144, 145, 1,
+       5, 41, 38, 145, 147, 146, 1, 4, 43, 41, 146, 148, 1, 4, 44, 43, 148, 149, 1, 5,
+47, 44, 149, 151, 150, 1, 4, 1, 47, 150, 120, 1, 4, 96, 97, 73, 72, 1, 4, 97,
+ 98, 74, 73, 1, 4, 98, 99, 75, 74, 1, 4, 99, 100, 76, 75, 1, 4, 100, 101, 77,
+76, 1, 4, 101, 102, 78, 77, 1, 4, 102, 103, 79, 78, 1, 4, 103, 104, 80, 79, 1,
+       4, 104, 105, 81, 80, 1, 4, 105, 106, 82, 81, 1, 4, 106, 107, 83, 82, 1, 4, 107,
+       108, 84, 83, 1, 4, 108, 109, 85, 84, 1, 4, 109, 110, 86, 85, 1, 4, 110, 111, 87,
+86, 1, 4, 111, 112, 88, 87, 1, 4, 112, 113, 89, 88, 1, 4, 113, 114, 90, 89, 1,
+       4, 114, 115, 91, 90, 1, 4, 115, 116, 92, 91, 1, 4, 116, 117, 93, 92, 1, 4, 117,
+  118, 94, 93, 1, 4, 118, 119, 95, 94, 1, 4, 119, 96, 72, 95, 1, 24, 1, 3, 5,
+6, 9, 10, 12, 14, 16, 19, 20, 23, 25, 27, 29, 30, 32, 34, 36, 38, 41, 43, 44,
+       47, 1, 4, 48, 49, 2, 0, 1, 4, 49, 50, 4, 2, 1, 4, 50, 51, 7, 4, 1,
+       4, 51, 52, 8, 7, 1, 4, 52, 53, 11, 8, 1, 4, 53, 54, 13, 11, 1, 4, 54,
+    55, 15, 13, 1, 4, 55, 56, 17, 15, 1, 4, 56, 57, 18, 17, 1, 4, 57, 58, 21,
+     18, 1, 4, 58, 59, 22, 21, 1, 4, 59, 60, 24, 22, 1, 4, 60, 61, 26, 24, 1,
+     4, 61, 62, 28, 26, 1, 4, 62, 63, 31, 28, 1, 4, 63, 64, 33, 31, 1, 4, 64,
+    65, 35, 33, 1, 4, 65, 66, 37, 35, 1, 4, 66, 67, 39, 37, 1, 4, 67, 68, 40,
+     39, 1, 4, 68, 69, 42, 40, 1, 4, 69, 70, 45, 42, 1, 4, 70, 71, 46, 45, 1,
+ 4, 71, 48, 0, 46, 1, 24, 48, 71, 70, 69, 68, 67, 66, 65, 64, 63, 62, 61, 60,
+       59, 58, 57, 56, 55, 54, 53, 52, 51, 50, 49, 1,
+       0
+};
+
+struct lwo  LWO_GuageConnector =
+{
+       152,                    /* number of points */
+       GuageConnector_PNTS, GuageConnector_normals, GuageConnector_POLS, 0L
+};
+
+static GLfloat GuageDial_PNTS[] =
+{
+       (GLfloat) 0.000000, (GLfloat) 0.050000, (GLfloat) 0.300000,
+       (GLfloat) 0.019134, (GLfloat) 0.046194, (GLfloat) 0.300000,
+       (GLfloat) 0.035355, (GLfloat) 0.035355, (GLfloat) 0.300000,
+       (GLfloat) 0.046194, (GLfloat) 0.019134, (GLfloat) 0.300000,
+       (GLfloat) 0.050000, (GLfloat) - 0.000000, (GLfloat) 0.300000,
+       (GLfloat) 0.046194, (GLfloat) - 0.019134, (GLfloat) 0.300000,
+       (GLfloat) 0.035355, (GLfloat) - 0.035400, (GLfloat) 0.275000,
+       (GLfloat) 0.035355, (GLfloat) - 0.035400, (GLfloat) 0.300000,
+       (GLfloat) 0.019134, (GLfloat) - 0.046200, (GLfloat) 0.300000,
+       (GLfloat) 0.000000, (GLfloat) - 0.050000, (GLfloat) 0.300000,
+       (GLfloat) - 0.019134, (GLfloat) - 0.046200, (GLfloat) 0.300000,
+       (GLfloat) - 0.035355, (GLfloat) - 0.035400, (GLfloat) 0.275000,
+       (GLfloat) - 0.035355, (GLfloat) - 0.035400, (GLfloat) 0.300000,
+       (GLfloat) - 0.046194, (GLfloat) - 0.019134, (GLfloat) 0.300000,
+       (GLfloat) - 0.050000, (GLfloat) - 0.000000, (GLfloat) 0.300000,
+       (GLfloat) - 0.046194, (GLfloat) 0.019134, (GLfloat) 0.300000,
+       (GLfloat) - 0.035355, (GLfloat) 0.035355, (GLfloat) 0.300000,
+       (GLfloat) - 0.019134, (GLfloat) 0.046194, (GLfloat) 0.300000,
+       (GLfloat) 0.000000, (GLfloat) 0.050000, (GLfloat) 0.200000,
+       (GLfloat) 0.019134, (GLfloat) 0.046194, (GLfloat) 0.200000,
+       (GLfloat) 0.035355, (GLfloat) 0.035355, (GLfloat) 0.200000,
+       (GLfloat) 0.046194, (GLfloat) 0.019134, (GLfloat) 0.200000,
+       (GLfloat) 0.050000, (GLfloat) - 0.000000, (GLfloat) 0.200000,
+       (GLfloat) 0.046194, (GLfloat) - 0.019134, (GLfloat) 0.200000,
+       (GLfloat) 0.035355, (GLfloat) - 0.035355, (GLfloat) 0.200000,
+       (GLfloat) 0.019134, (GLfloat) - 0.046194, (GLfloat) 0.200000,
+       (GLfloat) 0.000000, (GLfloat) - 0.050000, (GLfloat) 0.200000,
+       (GLfloat) - 0.019134, (GLfloat) - 0.046194, (GLfloat) 0.200000,
+       (GLfloat) - 0.035355, (GLfloat) - 0.035355, (GLfloat) 0.200000,
+       (GLfloat) - 0.046194, (GLfloat) - 0.019134, (GLfloat) 0.200000,
+       (GLfloat) - 0.050000, (GLfloat) - 0.000000, (GLfloat) 0.200000,
+       (GLfloat) - 0.046194, (GLfloat) 0.019134, (GLfloat) 0.200000,
+       (GLfloat) - 0.035355, (GLfloat) 0.035355, (GLfloat) 0.200000,
+       (GLfloat) - 0.019134, (GLfloat) 0.046194, (GLfloat) 0.200000,
+       (GLfloat) 0.000000, (GLfloat) - 0.373300, (GLfloat) 0.275000,
+};
+
+static GLfloat GuageDial_normals[] =
+{
+       (GLfloat) - 0.000000, (GLfloat) - 0.000000, (GLfloat) 1.000000,
+       (GLfloat) - 0.000000, (GLfloat) 0.000000, (GLfloat) 1.000000,
+       (GLfloat) 0.195089, (GLfloat) 0.980786, (GLfloat) 0.000000,
+       (GLfloat) 0.555570, (GLfloat) 0.831470, (GLfloat) 0.000000,
+       (GLfloat) 0.831470, (GLfloat) 0.555570, (GLfloat) 0.000000,
+       (GLfloat) 0.980785, (GLfloat) 0.195090, (GLfloat) 0.000000,
+       (GLfloat) 0.980785, (GLfloat) - 0.195090, (GLfloat) - 0.000000,
+       (GLfloat) 0.831470, (GLfloat) - 0.555570, (GLfloat) - 0.000248,
+       (GLfloat) 0.555570, (GLfloat) - 0.831470, (GLfloat) - 0.000051,
+       (GLfloat) 0.195089, (GLfloat) - 0.980786, (GLfloat) - 0.000000,
+       (GLfloat) - 0.195089, (GLfloat) - 0.980786, (GLfloat) - 0.000060,
+       (GLfloat) - 0.555570, (GLfloat) - 0.831470, (GLfloat) - 0.000371,
+       (GLfloat) - 0.831470, (GLfloat) - 0.555570, (GLfloat) - 0.000000,
+       (GLfloat) - 0.980785, (GLfloat) - 0.195090, (GLfloat) - 0.000000,
+       (GLfloat) - 0.980785, (GLfloat) 0.195090, (GLfloat) - 0.000000,
+       (GLfloat) - 0.831470, (GLfloat) 0.555570, (GLfloat) - 0.000000,
+       (GLfloat) - 0.555570, (GLfloat) 0.831470, (GLfloat) - 0.000000,
+       (GLfloat) - 0.195089, (GLfloat) 0.980786, (GLfloat) - 0.000000,
+};
+
+static unsigned short int GuageDial_POLS[] =
+{
+       3, 11, 6, 34, 1, 16, 0, 1, 2, 3, 4, 5, 7, 8, 9, 10, 12, 13, 14, 15,
+       16, 17, 1, 4, 18, 19, 1, 0, 1, 4, 19, 20, 2, 1, 1, 4, 20, 21, 3, 2,
+       1, 4, 21, 22, 4, 3, 1, 4, 22, 23, 5, 4, 1, 4, 23, 24, 7, 5, 1, 4,
+       24, 25, 8, 7, 1, 4, 25, 26, 9, 8, 1, 4, 26, 27, 10, 9, 1, 4, 27, 28,
+    12, 10, 1, 4, 28, 29, 13, 12, 1, 4, 29, 30, 14, 13, 1, 4, 30, 31, 15, 14,
+       1, 4, 31, 32, 16, 15, 1, 4, 32, 33, 17, 16, 1, 4, 33, 18, 0, 17, 1,
+       0
+};
+
+struct lwo  LWO_GuageDial =
+{
+       35,                     /* number of points */
+       GuageDial_PNTS, GuageDial_normals, GuageDial_POLS, 0L
+};
+
+static GLfloat GuageFace_PNTS[] =
+{
+       (GLfloat) 0.000000, (GLfloat) 1.783300, (GLfloat) 0.200000,
+       (GLfloat) - 0.087791, (GLfloat) 1.774653, (GLfloat) 0.200000,
+       (GLfloat) - 0.172208, (GLfloat) 1.749046, (GLfloat) 0.200000,
+       (GLfloat) - 0.250007, (GLfloat) 1.707461, (GLfloat) 0.200000,
+       (GLfloat) - 0.318198, (GLfloat) 1.651498, (GLfloat) 0.200000,
+       (GLfloat) - 0.374161, (GLfloat) 1.583307, (GLfloat) 0.200000,
+       (GLfloat) - 0.415746, (GLfloat) 1.505508, (GLfloat) 0.200000,
+       (GLfloat) - 0.441353, (GLfloat) 1.421091, (GLfloat) 0.200000,
+       (GLfloat) - 0.450000, (GLfloat) 1.333300, (GLfloat) 0.200000,
+       (GLfloat) - 0.441353, (GLfloat) 1.245509, (GLfloat) 0.200000,
+       (GLfloat) - 0.415746, (GLfloat) 1.161092, (GLfloat) 0.200000,
+       (GLfloat) - 0.374161, (GLfloat) 1.083293, (GLfloat) 0.200000,
+       (GLfloat) - 0.318198, (GLfloat) 1.015102, (GLfloat) 0.200000,
+       (GLfloat) - 0.250007, (GLfloat) 0.959139, (GLfloat) 0.200000,
+       (GLfloat) - 0.172208, (GLfloat) 0.917554, (GLfloat) 0.200000,
+       (GLfloat) - 0.087791, (GLfloat) 0.891947, (GLfloat) 0.200000,
+       (GLfloat) 0.000000, (GLfloat) 0.883300, (GLfloat) 0.200000,
+       (GLfloat) 0.087791, (GLfloat) 0.891947, (GLfloat) 0.200000,
+       (GLfloat) 0.172208, (GLfloat) 0.917554, (GLfloat) 0.200000,
+       (GLfloat) 0.250007, (GLfloat) 0.959139, (GLfloat) 0.200000,
+       (GLfloat) 0.318198, (GLfloat) 1.015102, (GLfloat) 0.200000,
+       (GLfloat) 0.374161, (GLfloat) 1.083293, (GLfloat) 0.200000,
+       (GLfloat) 0.415746, (GLfloat) 1.161092, (GLfloat) 0.200000,
+       (GLfloat) 0.441353, (GLfloat) 1.245509, (GLfloat) 0.200000,
+       (GLfloat) 0.450000, (GLfloat) 1.333300, (GLfloat) 0.200000,
+       (GLfloat) 0.441353, (GLfloat) 1.421091, (GLfloat) 0.200000,
+       (GLfloat) 0.415746, (GLfloat) 1.505508, (GLfloat) 0.200000,
+       (GLfloat) 0.374161, (GLfloat) 1.583307, (GLfloat) 0.200000,
+       (GLfloat) 0.318198, (GLfloat) 1.651498, (GLfloat) 0.200000,
+       (GLfloat) 0.250007, (GLfloat) 1.707461, (GLfloat) 0.200000,
+       (GLfloat) 0.172208, (GLfloat) 1.749046, (GLfloat) 0.200000,
+       (GLfloat) 0.087791, (GLfloat) 1.774653, (GLfloat) 0.200000,
+};
+
+static GLfloat GuageFace_normals[] =
+{
+       (GLfloat) - 0.000000, (GLfloat) 0.000000, (GLfloat) 1.000000,
+};
+
+static unsigned short int GuageFace_POLS[] =
+{
+32, 0, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14,
+       13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 1,
+       0
+};
+
+struct lwo  LWO_GuageFace =
+{
+       32,                     /* number of points */
+       GuageFace_PNTS, GuageFace_normals, GuageFace_POLS, 0L
+};
+
+static GLfloat GuageHead_PNTS[] =
+{
+       (GLfloat) 0.000000, (GLfloat) 1.833300, (GLfloat) 0.333330,
+       (GLfloat) 0.097545, (GLfloat) 1.823693, (GLfloat) 0.333330,
+       (GLfloat) 0.191342, (GLfloat) 1.795240, (GLfloat) 0.333330,
+       (GLfloat) 0.277785, (GLfloat) 1.749035, (GLfloat) 0.333330,
+       (GLfloat) 0.353553, (GLfloat) 1.686853, (GLfloat) 0.333330,
+       (GLfloat) 0.415735, (GLfloat) 1.611085, (GLfloat) 0.333330,
+       (GLfloat) 0.461940, (GLfloat) 1.524642, (GLfloat) 0.333330,
+       (GLfloat) 0.490393, (GLfloat) 1.430845, (GLfloat) 0.333330,
+       (GLfloat) 0.500000, (GLfloat) 1.333300, (GLfloat) 0.333330,
+       (GLfloat) 0.490393, (GLfloat) 1.235755, (GLfloat) 0.333330,
+       (GLfloat) 0.461940, (GLfloat) 1.141958, (GLfloat) 0.333330,
+       (GLfloat) 0.415735, (GLfloat) 1.055515, (GLfloat) 0.333330,
+       (GLfloat) 0.353553, (GLfloat) 0.979747, (GLfloat) 0.333330,
+       (GLfloat) 0.277785, (GLfloat) 0.917565, (GLfloat) 0.333330,
+       (GLfloat) 0.191342, (GLfloat) 0.871360, (GLfloat) 0.333330,
+       (GLfloat) 0.097545, (GLfloat) 0.842907, (GLfloat) 0.333330,
+       (GLfloat) 0.000000, (GLfloat) 0.833300, (GLfloat) 0.333330,
+       (GLfloat) - 0.097545, (GLfloat) 0.842907, (GLfloat) 0.333330,
+       (GLfloat) - 0.191342, (GLfloat) 0.871360, (GLfloat) 0.333330,
+       (GLfloat) - 0.277785, (GLfloat) 0.917565, (GLfloat) 0.333330,
+       (GLfloat) - 0.353553, (GLfloat) 0.979747, (GLfloat) 0.333330,
+       (GLfloat) - 0.415735, (GLfloat) 1.055515, (GLfloat) 0.333330,
+       (GLfloat) - 0.461940, (GLfloat) 1.141958, (GLfloat) 0.333330,
+       (GLfloat) - 0.490393, (GLfloat) 1.235755, (GLfloat) 0.333330,
+       (GLfloat) - 0.500000, (GLfloat) 1.333300, (GLfloat) 0.333330,
+       (GLfloat) - 0.490393, (GLfloat) 1.430845, (GLfloat) 0.333330,
+       (GLfloat) - 0.461940, (GLfloat) 1.524642, (GLfloat) 0.333330,
+       (GLfloat) - 0.415735, (GLfloat) 1.611085, (GLfloat) 0.333330,
+       (GLfloat) - 0.353553, (GLfloat) 1.686853, (GLfloat) 0.333330,
+       (GLfloat) - 0.277785, (GLfloat) 1.749035, (GLfloat) 0.333330,
+       (GLfloat) - 0.191342, (GLfloat) 1.795240, (GLfloat) 0.333330,
+       (GLfloat) - 0.097545, (GLfloat) 1.823693, (GLfloat) 0.333330,
+       (GLfloat) 0.000000, (GLfloat) 1.833300, (GLfloat) - 0.333330,
+       (GLfloat) 0.097545, (GLfloat) 1.823693, (GLfloat) - 0.333330,
+       (GLfloat) 0.191342, (GLfloat) 1.795240, (GLfloat) - 0.333330,
+       (GLfloat) 0.277785, (GLfloat) 1.749035, (GLfloat) - 0.333330,
+       (GLfloat) 0.353553, (GLfloat) 1.686853, (GLfloat) - 0.333330,
+       (GLfloat) 0.415735, (GLfloat) 1.611085, (GLfloat) - 0.333330,
+       (GLfloat) 0.461940, (GLfloat) 1.524642, (GLfloat) - 0.333330,
+       (GLfloat) 0.490393, (GLfloat) 1.430845, (GLfloat) - 0.333330,
+       (GLfloat) 0.500000, (GLfloat) 1.333300, (GLfloat) - 0.333330,
+       (GLfloat) 0.490393, (GLfloat) 1.235755, (GLfloat) - 0.333330,
+       (GLfloat) 0.461940, (GLfloat) 1.141958, (GLfloat) - 0.333330,
+       (GLfloat) 0.415735, (GLfloat) 1.055515, (GLfloat) - 0.333330,
+       (GLfloat) 0.353553, (GLfloat) 0.979747, (GLfloat) - 0.333330,
+       (GLfloat) 0.277785, (GLfloat) 0.917565, (GLfloat) - 0.333330,
+       (GLfloat) 0.191342, (GLfloat) 0.871360, (GLfloat) - 0.333330,
+       (GLfloat) 0.097545, (GLfloat) 0.842907, (GLfloat) - 0.333330,
+       (GLfloat) 0.000000, (GLfloat) 0.833300, (GLfloat) - 0.333330,
+       (GLfloat) - 0.097545, (GLfloat) 0.842907, (GLfloat) - 0.333330,
+       (GLfloat) - 0.191342, (GLfloat) 0.871360, (GLfloat) - 0.333330,
+       (GLfloat) - 0.277785, (GLfloat) 0.917565, (GLfloat) - 0.333330,
+       (GLfloat) - 0.353553, (GLfloat) 0.979747, (GLfloat) - 0.333330,
+       (GLfloat) - 0.415735, (GLfloat) 1.055515, (GLfloat) - 0.333330,
+       (GLfloat) - 0.461940, (GLfloat) 1.141958, (GLfloat) - 0.333330,
+       (GLfloat) - 0.490393, (GLfloat) 1.235755, (GLfloat) - 0.333330,
+       (GLfloat) - 0.500000, (GLfloat) 1.333300, (GLfloat) - 0.333330,
+       (GLfloat) - 0.490393, (GLfloat) 1.430845, (GLfloat) - 0.333330,
+       (GLfloat) - 0.461940, (GLfloat) 1.524642, (GLfloat) - 0.333330,
+       (GLfloat) - 0.415735, (GLfloat) 1.611085, (GLfloat) - 0.333330,
+       (GLfloat) - 0.353553, (GLfloat) 1.686853, (GLfloat) - 0.333330,
+       (GLfloat) - 0.277785, (GLfloat) 1.749035, (GLfloat) - 0.333330,
+       (GLfloat) - 0.191342, (GLfloat) 1.795240, (GLfloat) - 0.333330,
+       (GLfloat) - 0.097545, (GLfloat) 1.823693, (GLfloat) - 0.333330,
+       (GLfloat) 0.087791, (GLfloat) 1.774653, (GLfloat) 0.333330,
+       (GLfloat) 0.000000, (GLfloat) 1.783300, (GLfloat) 0.333330,
+       (GLfloat) 0.172208, (GLfloat) 1.749046, (GLfloat) 0.333330,
+       (GLfloat) 0.250007, (GLfloat) 1.707461, (GLfloat) 0.333330,
+       (GLfloat) 0.318198, (GLfloat) 1.651498, (GLfloat) 0.333330,
+       (GLfloat) 0.374161, (GLfloat) 1.583307, (GLfloat) 0.333330,
+       (GLfloat) 0.415746, (GLfloat) 1.505508, (GLfloat) 0.333330,
+       (GLfloat) 0.441353, (GLfloat) 1.421091, (GLfloat) 0.333330,
+       (GLfloat) 0.450000, (GLfloat) 1.333300, (GLfloat) 0.333330,
+       (GLfloat) 0.441353, (GLfloat) 1.245509, (GLfloat) 0.333330,
+       (GLfloat) 0.415746, (GLfloat) 1.161092, (GLfloat) 0.333330,
+       (GLfloat) 0.374161, (GLfloat) 1.083293, (GLfloat) 0.333330,
+       (GLfloat) 0.318198, (GLfloat) 1.015102, (GLfloat) 0.333330,
+       (GLfloat) 0.250007, (GLfloat) 0.959139, (GLfloat) 0.333330,
+       (GLfloat) 0.172208, (GLfloat) 0.917554, (GLfloat) 0.333330,
+       (GLfloat) 0.087791, (GLfloat) 0.891947, (GLfloat) 0.333330,
+       (GLfloat) 0.000000, (GLfloat) 0.883300, (GLfloat) 0.333330,
+       (GLfloat) - 0.087791, (GLfloat) 0.891947, (GLfloat) 0.333330,
+       (GLfloat) - 0.172208, (GLfloat) 0.917554, (GLfloat) 0.333330,
+       (GLfloat) - 0.250007, (GLfloat) 0.959139, (GLfloat) 0.333330,
+       (GLfloat) - 0.318198, (GLfloat) 1.015102, (GLfloat) 0.333330,
+       (GLfloat) - 0.374161, (GLfloat) 1.083293, (GLfloat) 0.333330,
+       (GLfloat) - 0.415746, (GLfloat) 1.161092, (GLfloat) 0.333330,
+       (GLfloat) - 0.441353, (GLfloat) 1.245509, (GLfloat) 0.333330,
+       (GLfloat) - 0.450000, (GLfloat) 1.333300, (GLfloat) 0.333330,
+       (GLfloat) - 0.441353, (GLfloat) 1.421091, (GLfloat) 0.333330,
+       (GLfloat) - 0.415746, (GLfloat) 1.505508, (GLfloat) 0.333330,
+       (GLfloat) - 0.374161, (GLfloat) 1.583307, (GLfloat) 0.333330,
+       (GLfloat) - 0.318198, (GLfloat) 1.651498, (GLfloat) 0.333330,
+       (GLfloat) - 0.250007, (GLfloat) 1.707461, (GLfloat) 0.333330,
+       (GLfloat) - 0.172208, (GLfloat) 1.749046, (GLfloat) 0.333330,
+       (GLfloat) - 0.087791, (GLfloat) 1.774653, (GLfloat) 0.333330,
+       (GLfloat) 0.000000, (GLfloat) 1.783300, (GLfloat) 0.200000,
+       (GLfloat) - 0.087791, (GLfloat) 1.774653, (GLfloat) 0.200000,
+       (GLfloat) - 0.172208, (GLfloat) 1.749046, (GLfloat) 0.200000,
+       (GLfloat) - 0.250007, (GLfloat) 1.707461, (GLfloat) 0.200000,
+       (GLfloat) - 0.318198, (GLfloat) 1.651498, (GLfloat) 0.200000,
+       (GLfloat) - 0.374161, (GLfloat) 1.583307, (GLfloat) 0.200000,
+       (GLfloat) - 0.415746, (GLfloat) 1.505508, (GLfloat) 0.200000,
+       (GLfloat) - 0.441353, (GLfloat) 1.421091, (GLfloat) 0.200000,
+       (GLfloat) - 0.450000, (GLfloat) 1.333300, (GLfloat) 0.200000,
+       (GLfloat) - 0.441353, (GLfloat) 1.245509, (GLfloat) 0.200000,
+       (GLfloat) - 0.415746, (GLfloat) 1.161092, (GLfloat) 0.200000,
+       (GLfloat) - 0.374161, (GLfloat) 1.083293, (GLfloat) 0.200000,
+       (GLfloat) - 0.318198, (GLfloat) 1.015102, (GLfloat) 0.200000,
+       (GLfloat) - 0.250007, (GLfloat) 0.959139, (GLfloat) 0.200000,
+       (GLfloat) - 0.172208, (GLfloat) 0.917554, (GLfloat) 0.200000,
+       (GLfloat) - 0.087791, (GLfloat) 0.891947, (GLfloat) 0.200000,
+       (GLfloat) 0.000000, (GLfloat) 0.883300, (GLfloat) 0.200000,
+       (GLfloat) 0.087791, (GLfloat) 0.891947, (GLfloat) 0.200000,
+       (GLfloat) 0.172208, (GLfloat) 0.917554, (GLfloat) 0.200000,
+       (GLfloat) 0.250007, (GLfloat) 0.959139, (GLfloat) 0.200000,
+       (GLfloat) 0.318198, (GLfloat) 1.015102, (GLfloat) 0.200000,
+       (GLfloat) 0.374161, (GLfloat) 1.083293, (GLfloat) 0.200000,
+       (GLfloat) 0.415746, (GLfloat) 1.161092, (GLfloat) 0.200000,
+       (GLfloat) 0.441353, (GLfloat) 1.245509, (GLfloat) 0.200000,
+       (GLfloat) 0.450000, (GLfloat) 1.333300, (GLfloat) 0.200000,
+       (GLfloat) 0.441353, (GLfloat) 1.421091, (GLfloat) 0.200000,
+       (GLfloat) 0.415746, (GLfloat) 1.505508, (GLfloat) 0.200000,
+       (GLfloat) 0.374161, (GLfloat) 1.583307, (GLfloat) 0.200000,
+       (GLfloat) 0.318198, (GLfloat) 1.651498, (GLfloat) 0.200000,
+       (GLfloat) 0.250007, (GLfloat) 1.707461, (GLfloat) 0.200000,
+       (GLfloat) 0.172208, (GLfloat) 1.749046, (GLfloat) 0.200000,
+       (GLfloat) 0.087791, (GLfloat) 1.774653, (GLfloat) 0.200000,
+};
+
+static GLfloat GuageHead_normals[] =
+{
+       (GLfloat) 0.000000, (GLfloat) 0.000000, (GLfloat) 1.000000,
+       (GLfloat) 0.000000, (GLfloat) 0.000000, (GLfloat) 1.000000,
+       (GLfloat) 0.000000, (GLfloat) 0.000000, (GLfloat) 1.000000,
+       (GLfloat) 0.000000, (GLfloat) 0.000000, (GLfloat) 1.000000,
+       (GLfloat) - 0.000000, (GLfloat) 0.000000, (GLfloat) 1.000000,
+       (GLfloat) 0.000000, (GLfloat) 0.000000, (GLfloat) 1.000000,
+       (GLfloat) 0.000000, (GLfloat) 0.000000, (GLfloat) 1.000000,
+       (GLfloat) 0.000000, (GLfloat) 0.000000, (GLfloat) 1.000000,
+       (GLfloat) 0.000000, (GLfloat) 0.000000, (GLfloat) 1.000000,
+       (GLfloat) 0.000000, (GLfloat) 0.000000, (GLfloat) 1.000000,
+       (GLfloat) 0.000000, (GLfloat) 0.000000, (GLfloat) 1.000000,
+       (GLfloat) 0.000000, (GLfloat) - 0.000000, (GLfloat) 1.000000,
+       (GLfloat) 0.000000, (GLfloat) 0.000000, (GLfloat) 1.000000,
+       (GLfloat) 0.000000, (GLfloat) - 0.000000, (GLfloat) 1.000000,
+       (GLfloat) - 0.000000, (GLfloat) - 0.000000, (GLfloat) 1.000000,
+       (GLfloat) 0.000000, (GLfloat) - 0.000000, (GLfloat) 1.000000,
+       (GLfloat) 0.000000, (GLfloat) 0.000000, (GLfloat) 1.000000,
+       (GLfloat) 0.000000, (GLfloat) - 0.000000, (GLfloat) 1.000000,
+       (GLfloat) - 0.000000, (GLfloat) - 0.000000, (GLfloat) 1.000000,
+       (GLfloat) 0.000000, (GLfloat) - 0.000000, (GLfloat) 1.000000,
+       (GLfloat) 0.000000, (GLfloat) 0.000000, (GLfloat) 1.000000,
+       (GLfloat) 0.000000, (GLfloat) - 0.000000, (GLfloat) 1.000000,
+       (GLfloat) - 0.000000, (GLfloat) - 0.000000, (GLfloat) 1.000000,
+       (GLfloat) 0.000000, (GLfloat) - 0.000000, (GLfloat) 1.000000,
+       (GLfloat) - 0.000000, (GLfloat) - 0.000000, (GLfloat) 1.000000,
+       (GLfloat) 0.000000, (GLfloat) - 0.000000, (GLfloat) 1.000000,
+       (GLfloat) - 0.000000, (GLfloat) 0.000000, (GLfloat) 1.000000,
+       (GLfloat) - 0.000000, (GLfloat) - 0.000000, (GLfloat) 1.000000,
+       (GLfloat) - 0.000000, (GLfloat) - 0.000000, (GLfloat) 1.000000,
+       (GLfloat) - 0.000000, (GLfloat) - 0.000000, (GLfloat) 1.000000,
+       (GLfloat) - 0.000000, (GLfloat) 0.000000, (GLfloat) 1.000000,
+       (GLfloat) - 0.000000, (GLfloat) - 0.000000, (GLfloat) 1.000000,
+       (GLfloat) - 0.000000, (GLfloat) - 0.000000, (GLfloat) 1.000000,
+       (GLfloat) - 0.000000, (GLfloat) - 0.000000, (GLfloat) 1.000000,
+       (GLfloat) - 0.000000, (GLfloat) 0.000000, (GLfloat) 1.000000,
+       (GLfloat) - 0.000000, (GLfloat) - 0.000000, (GLfloat) 1.000000,
+       (GLfloat) - 0.000000, (GLfloat) - 0.000000, (GLfloat) 1.000000,
+       (GLfloat) - 0.000000, (GLfloat) - 0.000000, (GLfloat) 1.000000,
+       (GLfloat) - 0.000000, (GLfloat) 0.000000, (GLfloat) 1.000000,
+       (GLfloat) - 0.000000, (GLfloat) - 0.000000, (GLfloat) 1.000000,
+       (GLfloat) - 0.000000, (GLfloat) 0.000000, (GLfloat) 1.000000,
+       (GLfloat) - 0.000000, (GLfloat) - 0.000000, (GLfloat) 1.000000,
+       (GLfloat) - 0.000000, (GLfloat) 0.000000, (GLfloat) 1.000000,
+       (GLfloat) - 0.000000, (GLfloat) 0.000000, (GLfloat) 1.000000,
+       (GLfloat) - 0.000000, (GLfloat) 0.000000, (GLfloat) 1.000000,
+       (GLfloat) - 0.000000, (GLfloat) 0.000000, (GLfloat) 1.000000,
+       (GLfloat) - 0.000000, (GLfloat) 0.000000, (GLfloat) 1.000000,
+       (GLfloat) - 0.000000, (GLfloat) 0.000000, (GLfloat) 1.000000,
+       (GLfloat) - 0.000000, (GLfloat) 0.000000, (GLfloat) 1.000000,
+       (GLfloat) - 0.000000, (GLfloat) 0.000000, (GLfloat) 1.000000,
+       (GLfloat) - 0.000000, (GLfloat) 0.000000, (GLfloat) 1.000000,
+       (GLfloat) - 0.000000, (GLfloat) 0.000000, (GLfloat) 1.000000,
+       (GLfloat) - 0.000000, (GLfloat) - 0.000000, (GLfloat) 1.000000,
+       (GLfloat) - 0.000000, (GLfloat) - 0.000000, (GLfloat) 1.000000,
+       (GLfloat) - 0.000000, (GLfloat) - 0.000000, (GLfloat) 1.000000,
+       (GLfloat) - 0.000000, (GLfloat) - 0.000000, (GLfloat) 1.000000,
+       (GLfloat) - 0.000000, (GLfloat) 0.000000, (GLfloat) 1.000000,
+       (GLfloat) - 0.000000, (GLfloat) - 0.000000, (GLfloat) 1.000000,
+       (GLfloat) 0.000000, (GLfloat) - 0.000000, (GLfloat) 1.000000,
+       (GLfloat) - 0.000000, (GLfloat) - 0.000000, (GLfloat) 1.000000,
+       (GLfloat) - 0.000000, (GLfloat) - 0.000000, (GLfloat) 1.000000,
+       (GLfloat) 0.000000, (GLfloat) - 0.000000, (GLfloat) 1.000000,
+       (GLfloat) - 0.000000, (GLfloat) - 0.000000, (GLfloat) 1.000000,
+       (GLfloat) - 0.000000, (GLfloat) 0.000000, (GLfloat) 1.000000,
+       (GLfloat) 0.098017, (GLfloat) - 0.995185, (GLfloat) - 0.000000,
+       (GLfloat) 0.290285, (GLfloat) - 0.956940, (GLfloat) - 0.000000,
+       (GLfloat) 0.471397, (GLfloat) - 0.881921, (GLfloat) - 0.000000,
+       (GLfloat) 0.634393, (GLfloat) - 0.773010, (GLfloat) - 0.000000,
+       (GLfloat) 0.773011, (GLfloat) - 0.634393, (GLfloat) - 0.000000,
+       (GLfloat) 0.881921, (GLfloat) - 0.471397, (GLfloat) - 0.000000,
+       (GLfloat) 0.956940, (GLfloat) - 0.290284, (GLfloat) - 0.000000,
+       (GLfloat) 0.995185, (GLfloat) - 0.098017, (GLfloat) - 0.000000,
+       (GLfloat) 0.995185, (GLfloat) 0.098017, (GLfloat) 0.000000,
+       (GLfloat) 0.956940, (GLfloat) 0.290284, (GLfloat) 0.000000,
+       (GLfloat) 0.881921, (GLfloat) 0.471397, (GLfloat) 0.000000,
+       (GLfloat) 0.773011, (GLfloat) 0.634393, (GLfloat) 0.000000,
+       (GLfloat) 0.634393, (GLfloat) 0.773011, (GLfloat) 0.000000,
+       (GLfloat) 0.471397, (GLfloat) 0.881921, (GLfloat) 0.000000,
+       (GLfloat) 0.290285, (GLfloat) 0.956940, (GLfloat) 0.000000,
+       (GLfloat) 0.098017, (GLfloat) 0.995185, (GLfloat) 0.000000,
+       (GLfloat) - 0.098017, (GLfloat) 0.995185, (GLfloat) - 0.000000,
+       (GLfloat) - 0.290285, (GLfloat) 0.956940, (GLfloat) - 0.000000,
+       (GLfloat) - 0.471397, (GLfloat) 0.881921, (GLfloat) - 0.000000,
+       (GLfloat) - 0.634393, (GLfloat) 0.773011, (GLfloat) - 0.000000,
+       (GLfloat) - 0.773011, (GLfloat) 0.634393, (GLfloat) - 0.000000,
+       (GLfloat) - 0.881921, (GLfloat) 0.471397, (GLfloat) - 0.000000,
+       (GLfloat) - 0.956940, (GLfloat) 0.290284, (GLfloat) - 0.000000,
+       (GLfloat) - 0.995185, (GLfloat) 0.098017, (GLfloat) - 0.000000,
+       (GLfloat) - 0.995185, (GLfloat) - 0.098017, (GLfloat) - 0.000000,
+       (GLfloat) - 0.956940, (GLfloat) - 0.290284, (GLfloat) - 0.000000,
+       (GLfloat) - 0.881921, (GLfloat) - 0.471397, (GLfloat) - 0.000000,
+       (GLfloat) - 0.773011, (GLfloat) - 0.634393, (GLfloat) - 0.000000,
+       (GLfloat) - 0.634393, (GLfloat) - 0.773010, (GLfloat) - 0.000000,
+       (GLfloat) - 0.471397, (GLfloat) - 0.881921, (GLfloat) - 0.000000,
+       (GLfloat) - 0.290285, (GLfloat) - 0.956940, (GLfloat) - 0.000000,
+       (GLfloat) - 0.098017, (GLfloat) - 0.995185, (GLfloat) - 0.000000,
+       (GLfloat) 0.098017, (GLfloat) 0.995185, (GLfloat) 0.000000,
+       (GLfloat) 0.290285, (GLfloat) 0.956940, (GLfloat) 0.000000,
+       (GLfloat) 0.471397, (GLfloat) 0.881921, (GLfloat) 0.000000,
+       (GLfloat) 0.634393, (GLfloat) 0.773011, (GLfloat) 0.000000,
+       (GLfloat) 0.773011, (GLfloat) 0.634393, (GLfloat) 0.000000,
+       (GLfloat) 0.881921, (GLfloat) 0.471397, (GLfloat) 0.000000,
+       (GLfloat) 0.956940, (GLfloat) 0.290284, (GLfloat) 0.000000,
+       (GLfloat) 0.995185, (GLfloat) 0.098017, (GLfloat) 0.000000,
+       (GLfloat) 0.995185, (GLfloat) - 0.098017, (GLfloat) - 0.000000,
+       (GLfloat) 0.956940, (GLfloat) - 0.290284, (GLfloat) - 0.000000,
+       (GLfloat) 0.881921, (GLfloat) - 0.471397, (GLfloat) - 0.000000,
+       (GLfloat) 0.773011, (GLfloat) - 0.634393, (GLfloat) - 0.000000,
+       (GLfloat) 0.634393, (GLfloat) - 0.773010, (GLfloat) - 0.000000,
+       (GLfloat) 0.471396, (GLfloat) - 0.881921, (GLfloat) - 0.000000,
+       (GLfloat) 0.290285, (GLfloat) - 0.956940, (GLfloat) - 0.000000,
+       (GLfloat) 0.098017, (GLfloat) - 0.995185, (GLfloat) - 0.000000,
+       (GLfloat) - 0.098017, (GLfloat) - 0.995185, (GLfloat) - 0.000000,
+       (GLfloat) - 0.290285, (GLfloat) - 0.956940, (GLfloat) - 0.000000,
+       (GLfloat) - 0.471396, (GLfloat) - 0.881921, (GLfloat) - 0.000000,
+       (GLfloat) - 0.634393, (GLfloat) - 0.773010, (GLfloat) - 0.000000,
+       (GLfloat) - 0.773011, (GLfloat) - 0.634393, (GLfloat) - 0.000000,
+       (GLfloat) - 0.881921, (GLfloat) - 0.471397, (GLfloat) - 0.000000,
+       (GLfloat) - 0.956940, (GLfloat) - 0.290284, (GLfloat) - 0.000000,
+       (GLfloat) - 0.995185, (GLfloat) - 0.098017, (GLfloat) - 0.000000,
+       (GLfloat) - 0.995185, (GLfloat) 0.098017, (GLfloat) - 0.000000,
+       (GLfloat) - 0.956940, (GLfloat) 0.290284, (GLfloat) - 0.000000,
+       (GLfloat) - 0.881921, (GLfloat) 0.471397, (GLfloat) - 0.000000,
+       (GLfloat) - 0.773011, (GLfloat) 0.634393, (GLfloat) - 0.000000,
+       (GLfloat) - 0.634393, (GLfloat) 0.773011, (GLfloat) - 0.000000,
+       (GLfloat) - 0.471397, (GLfloat) 0.881921, (GLfloat) - 0.000000,
+       (GLfloat) - 0.290285, (GLfloat) 0.956940, (GLfloat) - 0.000000,
+       (GLfloat) - 0.098017, (GLfloat) 0.995185, (GLfloat) - 0.000000,
+       (GLfloat) - 0.000000, (GLfloat) 0.000000, (GLfloat) - 1.000000,
+};
+
+static unsigned short int GuageHead_POLS[] =
+{
+       3, 67, 3, 4, 1, 3, 68, 67, 4, 1, 3, 68, 4, 5, 1, 3, 69, 68, 5, 1,
+       3, 70, 69, 5, 1, 3, 70, 5, 6, 1, 3, 70, 6, 7, 1, 3, 71, 70, 7, 1,
+       3, 71, 7, 8, 1, 3, 72, 71, 8, 1, 3, 73, 72, 8, 1, 3, 73, 8, 9, 1,
+       3, 74, 73, 9, 1, 3, 74, 9, 10, 1, 3, 74, 10, 11, 1, 3, 75, 74, 11, 1,
+      3, 76, 75, 11, 1, 3, 76, 11, 12, 1, 3, 76, 12, 13, 1, 3, 77, 76, 13, 1,
+      3, 78, 77, 13, 1, 3, 78, 13, 14, 1, 3, 78, 14, 15, 1, 3, 79, 78, 15, 1,
+      3, 79, 15, 16, 1, 3, 80, 79, 16, 1, 3, 81, 80, 16, 1, 3, 81, 16, 17, 1,
+      3, 82, 81, 17, 1, 3, 82, 17, 18, 1, 3, 82, 18, 19, 1, 3, 83, 82, 19, 1,
+      3, 84, 83, 19, 1, 3, 84, 19, 20, 1, 3, 84, 20, 21, 1, 3, 85, 84, 21, 1,
+      3, 86, 85, 21, 1, 3, 86, 21, 22, 1, 3, 86, 22, 23, 1, 3, 87, 86, 23, 1,
+      3, 87, 23, 24, 1, 3, 88, 87, 24, 1, 3, 89, 88, 24, 1, 3, 89, 24, 25, 1,
+      3, 90, 89, 25, 1, 3, 90, 25, 26, 1, 3, 90, 26, 27, 1, 3, 91, 90, 27, 1,
+      3, 92, 91, 27, 1, 3, 92, 27, 28, 1, 3, 93, 92, 28, 1, 3, 93, 28, 29, 1,
+       3, 2, 3, 67, 1, 3, 2, 67, 66, 1, 3, 1, 2, 66, 1, 3, 1, 66, 64, 1,
+       3, 1, 64, 65, 1, 3, 0, 1, 65, 1, 3, 31, 0, 65, 1, 3, 31, 65, 95, 1,
+      3, 31, 95, 94, 1, 3, 30, 31, 94, 1, 3, 30, 94, 93, 1, 3, 93, 29, 30, 1,
+     4, 96, 97, 95, 65, 1, 4, 97, 98, 94, 95, 1, 4, 98, 99, 93, 94, 1, 4, 99,
+       100, 92, 93, 1, 4, 100, 101, 91, 92, 1, 4, 101, 102, 90, 91, 1, 4, 102, 103, 89,
+90, 1, 4, 103, 104, 88, 89, 1, 4, 104, 105, 87, 88, 1, 4, 105, 106, 86, 87, 1,
+       4, 106, 107, 85, 86, 1, 4, 107, 108, 84, 85, 1, 4, 108, 109, 83, 84, 1, 4, 109,
+       110, 82, 83, 1, 4, 110, 111, 81, 82, 1, 4, 111, 112, 80, 81, 1, 4, 112, 113, 79,
+80, 1, 4, 113, 114, 78, 79, 1, 4, 114, 115, 77, 78, 1, 4, 115, 116, 76, 77, 1,
+       4, 116, 117, 75, 76, 1, 4, 117, 118, 74, 75, 1, 4, 118, 119, 73, 74, 1, 4, 119,
+       120, 72, 73, 1, 4, 120, 121, 71, 72, 1, 4, 121, 122, 70, 71, 1, 4, 122, 123, 69,
+70, 1, 4, 123, 124, 68, 69, 1, 4, 124, 125, 67, 68, 1, 4, 125, 126, 66, 67, 1,
+    4, 126, 127, 64, 66, 1, 4, 127, 96, 65, 64, 1, 4, 32, 33, 1, 0, 1, 4, 33,
+       34, 2, 1, 1, 4, 34, 35, 3, 2, 1, 4, 35, 36, 4, 3, 1, 4, 36, 37, 5,
+       4, 1, 4, 37, 38, 6, 5, 1, 4, 38, 39, 7, 6, 1, 4, 39, 40, 8, 7, 1,
+       4, 40, 41, 9, 8, 1, 4, 41, 42, 10, 9, 1, 4, 42, 43, 11, 10, 1, 4, 43,
+    44, 12, 11, 1, 4, 44, 45, 13, 12, 1, 4, 45, 46, 14, 13, 1, 4, 46, 47, 15,
+     14, 1, 4, 47, 48, 16, 15, 1, 4, 48, 49, 17, 16, 1, 4, 49, 50, 18, 17, 1,
+     4, 50, 51, 19, 18, 1, 4, 51, 52, 20, 19, 1, 4, 52, 53, 21, 20, 1, 4, 53,
+    54, 22, 21, 1, 4, 54, 55, 23, 22, 1, 4, 55, 56, 24, 23, 1, 4, 56, 57, 25,
+     24, 1, 4, 57, 58, 26, 25, 1, 4, 58, 59, 27, 26, 1, 4, 59, 60, 28, 27, 1,
+     4, 60, 61, 29, 28, 1, 4, 61, 62, 30, 29, 1, 4, 62, 63, 31, 30, 1, 4, 63,
+32, 0, 31, 1, 32, 32, 63, 62, 61, 60, 59, 58, 57, 56, 55, 54, 53, 52, 51, 50,
+       49, 48, 47, 46, 45, 44, 43, 42, 41, 40, 39, 38, 37, 36, 35, 34, 33, 1,
+       0
+};
+
+struct lwo  LWO_GuageHead =
+{
+       128,                    /* number of points */
+       GuageHead_PNTS, GuageHead_normals, GuageHead_POLS, 0L
+};
+
+static GLfloat PipeBetweenBolts_PNTS[] =
+{
+       (GLfloat) 0.000000, (GLfloat) 0.500000, (GLfloat) 0.500000,
+       (GLfloat) 0.129410, (GLfloat) 0.482963, (GLfloat) 0.500000,
+       (GLfloat) 0.250000, (GLfloat) 0.433013, (GLfloat) 0.500000,
+       (GLfloat) 0.353553, (GLfloat) 0.353553, (GLfloat) 0.500000,
+       (GLfloat) 0.433013, (GLfloat) 0.250000, (GLfloat) 0.500000,
+       (GLfloat) 0.482963, (GLfloat) 0.129410, (GLfloat) 0.500000,
+       (GLfloat) 0.500000, (GLfloat) 0.000000, (GLfloat) 0.500000,
+       (GLfloat) 0.482963, (GLfloat) - 0.129410, (GLfloat) 0.500000,
+       (GLfloat) 0.433013, (GLfloat) - 0.250000, (GLfloat) 0.500000,
+       (GLfloat) 0.353553, (GLfloat) - 0.353553, (GLfloat) 0.500000,
+       (GLfloat) 0.250000, (GLfloat) - 0.433013, (GLfloat) 0.500000,
+       (GLfloat) 0.129410, (GLfloat) - 0.482963, (GLfloat) 0.500000,
+       (GLfloat) 0.000000, (GLfloat) - 0.500000, (GLfloat) 0.500000,
+       (GLfloat) - 0.129410, (GLfloat) - 0.482963, (GLfloat) 0.500000,
+       (GLfloat) - 0.250000, (GLfloat) - 0.433013, (GLfloat) 0.500000,
+       (GLfloat) - 0.353553, (GLfloat) - 0.353553, (GLfloat) 0.500000,
+       (GLfloat) - 0.433013, (GLfloat) - 0.250000, (GLfloat) 0.500000,
+       (GLfloat) - 0.482963, (GLfloat) - 0.129410, (GLfloat) 0.500000,
+       (GLfloat) - 0.500000, (GLfloat) - 0.000000, (GLfloat) 0.500000,
+       (GLfloat) - 0.482963, (GLfloat) 0.129410, (GLfloat) 0.500000,
+       (GLfloat) - 0.433013, (GLfloat) 0.250000, (GLfloat) 0.500000,
+       (GLfloat) - 0.353553, (GLfloat) 0.353553, (GLfloat) 0.500000,
+       (GLfloat) - 0.250000, (GLfloat) 0.433013, (GLfloat) 0.500000,
+       (GLfloat) - 0.129410, (GLfloat) 0.482963, (GLfloat) 0.500000,
+       (GLfloat) 0.000000, (GLfloat) 0.500000, (GLfloat) - 0.500000,
+       (GLfloat) 0.129410, (GLfloat) 0.482963, (GLfloat) - 0.500000,
+       (GLfloat) 0.250000, (GLfloat) 0.433013, (GLfloat) - 0.500000,
+       (GLfloat) 0.353553, (GLfloat) 0.353553, (GLfloat) - 0.500000,
+       (GLfloat) 0.433013, (GLfloat) 0.250000, (GLfloat) - 0.500000,
+       (GLfloat) 0.482963, (GLfloat) 0.129410, (GLfloat) - 0.500000,
+       (GLfloat) 0.500000, (GLfloat) 0.000000, (GLfloat) - 0.500000,
+       (GLfloat) 0.482963, (GLfloat) - 0.129410, (GLfloat) - 0.500000,
+       (GLfloat) 0.433013, (GLfloat) - 0.250000, (GLfloat) - 0.500000,
+       (GLfloat) 0.353553, (GLfloat) - 0.353553, (GLfloat) - 0.500000,
+       (GLfloat) 0.250000, (GLfloat) - 0.433013, (GLfloat) - 0.500000,
+       (GLfloat) 0.129410, (GLfloat) - 0.482963, (GLfloat) - 0.500000,
+       (GLfloat) 0.000000, (GLfloat) - 0.500000, (GLfloat) - 0.500000,
+       (GLfloat) - 0.129410, (GLfloat) - 0.482963, (GLfloat) - 0.500000,
+       (GLfloat) - 0.250000, (GLfloat) - 0.433013, (GLfloat) - 0.500000,
+       (GLfloat) - 0.353553, (GLfloat) - 0.353553, (GLfloat) - 0.500000,
+       (GLfloat) - 0.433013, (GLfloat) - 0.250000, (GLfloat) - 0.500000,
+       (GLfloat) - 0.482963, (GLfloat) - 0.129410, (GLfloat) - 0.500000,
+       (GLfloat) - 0.500000, (GLfloat) - 0.000000, (GLfloat) - 0.500000,
+       (GLfloat) - 0.482963, (GLfloat) 0.129410, (GLfloat) - 0.500000,
+       (GLfloat) - 0.433013, (GLfloat) 0.250000, (GLfloat) - 0.500000,
+       (GLfloat) - 0.353553, (GLfloat) 0.353553, (GLfloat) - 0.500000,
+       (GLfloat) - 0.250000, (GLfloat) 0.433013, (GLfloat) - 0.500000,
+       (GLfloat) - 0.129410, (GLfloat) 0.482963, (GLfloat) - 0.500000,
+};
+
+static GLfloat PipeBetweenBolts_normals[] =
+{
+       (GLfloat) - 0.000000, (GLfloat) 0.000000, (GLfloat) 1.000000,
+       (GLfloat) 0.130526, (GLfloat) 0.991445, (GLfloat) 0.000000,
+       (GLfloat) 0.382683, (GLfloat) 0.923880, (GLfloat) 0.000000,
+       (GLfloat) 0.608761, (GLfloat) 0.793353, (GLfloat) 0.000000,
+       (GLfloat) 0.793353, (GLfloat) 0.608761, (GLfloat) 0.000000,
+       (GLfloat) 0.923880, (GLfloat) 0.382683, (GLfloat) 0.000000,
+       (GLfloat) 0.991445, (GLfloat) 0.130526, (GLfloat) 0.000000,
+       (GLfloat) 0.991445, (GLfloat) - 0.130526, (GLfloat) - 0.000000,
+       (GLfloat) 0.923880, (GLfloat) - 0.382683, (GLfloat) - 0.000000,
+       (GLfloat) 0.793353, (GLfloat) - 0.608761, (GLfloat) - 0.000000,
+       (GLfloat) 0.608761, (GLfloat) - 0.793353, (GLfloat) - 0.000000,
+       (GLfloat) 0.382683, (GLfloat) - 0.923880, (GLfloat) - 0.000000,
+       (GLfloat) 0.130526, (GLfloat) - 0.991445, (GLfloat) - 0.000000,
+       (GLfloat) - 0.130526, (GLfloat) - 0.991445, (GLfloat) - 0.000000,
+       (GLfloat) - 0.382683, (GLfloat) - 0.923880, (GLfloat) - 0.000000,
+       (GLfloat) - 0.608761, (GLfloat) - 0.793353, (GLfloat) - 0.000000,
+       (GLfloat) - 0.793353, (GLfloat) - 0.608761, (GLfloat) - 0.000000,
+       (GLfloat) - 0.923880, (GLfloat) - 0.382683, (GLfloat) - 0.000000,
+       (GLfloat) - 0.991445, (GLfloat) - 0.130526, (GLfloat) - 0.000000,
+       (GLfloat) - 0.991445, (GLfloat) 0.130526, (GLfloat) - 0.000000,
+       (GLfloat) - 0.923880, (GLfloat) 0.382683, (GLfloat) - 0.000000,
+       (GLfloat) - 0.793353, (GLfloat) 0.608761, (GLfloat) - 0.000000,
+       (GLfloat) - 0.608761, (GLfloat) 0.793353, (GLfloat) - 0.000000,
+       (GLfloat) - 0.382683, (GLfloat) 0.923880, (GLfloat) - 0.000000,
+       (GLfloat) - 0.130526, (GLfloat) 0.991445, (GLfloat) - 0.000000,
+       (GLfloat) - 0.000000, (GLfloat) 0.000000, (GLfloat) - 1.000000,
+};
+
+static unsigned short int PipeBetweenBolts_POLS[] =
+{
+       24, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18,
+       19, 20, 21, 22, 23, 1, 4, 24, 25, 1, 0, 1, 4, 25, 26, 2, 1, 1, 4, 26,
+       27, 3, 2, 1, 4, 27, 28, 4, 3, 1, 4, 28, 29, 5, 4, 1, 4, 29, 30, 6,
+       5, 1, 4, 30, 31, 7, 6, 1, 4, 31, 32, 8, 7, 1, 4, 32, 33, 9, 8, 1,
+      4, 33, 34, 10, 9, 1, 4, 34, 35, 11, 10, 1, 4, 35, 36, 12, 11, 1, 4, 36,
+    37, 13, 12, 1, 4, 37, 38, 14, 13, 1, 4, 38, 39, 15, 14, 1, 4, 39, 40, 16,
+     15, 1, 4, 40, 41, 17, 16, 1, 4, 41, 42, 18, 17, 1, 4, 42, 43, 19, 18, 1,
+     4, 43, 44, 20, 19, 1, 4, 44, 45, 21, 20, 1, 4, 45, 46, 22, 21, 1, 4, 46,
+  47, 23, 22, 1, 4, 47, 24, 0, 23, 1, 24, 24, 47, 46, 45, 44, 43, 42, 41, 40,
+       39, 38, 37, 36, 35, 34, 33, 32, 31, 30, 29, 28, 27, 26, 25, 1,
+       0
+};
+
+struct lwo  LWO_PipeBetweenBolts =
+{
+       48,                     /* number of points */
+   PipeBetweenBolts_PNTS, PipeBetweenBolts_normals, PipeBetweenBolts_POLS, 0L
+};
+
+static GLfloat ElbowBolts_PNTS[] =
+{
+       (GLfloat) 0.273122, (GLfloat) - 0.600000, (GLfloat) - 0.403061,
+       (GLfloat) 0.273122, (GLfloat) 0.403061, (GLfloat) - 0.600000,
+       (GLfloat) 0.273122, (GLfloat) 0.333061, (GLfloat) - 0.600000,
+       (GLfloat) 0.273122, (GLfloat) - 0.600000, (GLfloat) - 0.333061,
+       (GLfloat) 0.212500, (GLfloat) 0.298061, (GLfloat) - 0.600000,
+       (GLfloat) 0.212500, (GLfloat) - 0.600000, (GLfloat) - 0.298061,
+       (GLfloat) 0.151878, (GLfloat) 0.333061, (GLfloat) - 0.600000,
+       (GLfloat) 0.151878, (GLfloat) - 0.600000, (GLfloat) - 0.333061,
+       (GLfloat) 0.151878, (GLfloat) 0.403061, (GLfloat) - 0.600000,
+       (GLfloat) 0.151878, (GLfloat) - 0.600000, (GLfloat) - 0.403061,
+       (GLfloat) 0.212500, (GLfloat) - 0.600000, (GLfloat) - 0.438061,
+       (GLfloat) 0.212500, (GLfloat) 0.438061, (GLfloat) - 0.600000,
+       (GLfloat) 0.273122, (GLfloat) - 0.660000, (GLfloat) - 0.403061,
+       (GLfloat) 0.273122, (GLfloat) 0.403061, (GLfloat) - 0.660000,
+       (GLfloat) 0.273122, (GLfloat) - 0.660000, (GLfloat) - 0.333061,
+       (GLfloat) 0.273122, (GLfloat) 0.333061, (GLfloat) - 0.660000,
+       (GLfloat) 0.212500, (GLfloat) 0.298061, (GLfloat) - 0.660000,
+       (GLfloat) 0.212500, (GLfloat) - 0.660000, (GLfloat) - 0.298061,
+       (GLfloat) 0.151878, (GLfloat) - 0.660000, (GLfloat) - 0.333061,
+       (GLfloat) 0.151878, (GLfloat) 0.333061, (GLfloat) - 0.660000,
+       (GLfloat) 0.151878, (GLfloat) 0.403061, (GLfloat) - 0.660000,
+       (GLfloat) 0.151878, (GLfloat) - 0.660000, (GLfloat) - 0.403061,
+       (GLfloat) 0.212500, (GLfloat) - 0.660000, (GLfloat) - 0.438061,
+       (GLfloat) 0.212500, (GLfloat) 0.438061, (GLfloat) - 0.660000,
+       (GLfloat) 0.273122, (GLfloat) 0.403061, (GLfloat) - 0.460000,
+       (GLfloat) 0.273122, (GLfloat) - 0.460000, (GLfloat) - 0.403061,
+       (GLfloat) 0.273122, (GLfloat) 0.333061, (GLfloat) - 0.460000,
+       (GLfloat) 0.273122, (GLfloat) - 0.460000, (GLfloat) - 0.333061,
+       (GLfloat) 0.212500, (GLfloat) 0.298061, (GLfloat) - 0.460000,
+       (GLfloat) 0.212500, (GLfloat) - 0.460000, (GLfloat) - 0.298061,
+       (GLfloat) 0.151878, (GLfloat) 0.333061, (GLfloat) - 0.460000,
+       (GLfloat) 0.151878, (GLfloat) - 0.460000, (GLfloat) - 0.333061,
+       (GLfloat) 0.151878, (GLfloat) 0.403061, (GLfloat) - 0.460000,
+       (GLfloat) 0.151878, (GLfloat) - 0.460000, (GLfloat) - 0.403061,
+       (GLfloat) 0.212500, (GLfloat) - 0.460000, (GLfloat) - 0.438061,
+       (GLfloat) 0.212500, (GLfloat) 0.438061, (GLfloat) - 0.460000,
+       (GLfloat) 0.273122, (GLfloat) 0.403061, (GLfloat) - 0.520000,
+       (GLfloat) 0.273122, (GLfloat) - 0.520000, (GLfloat) - 0.403061,
+       (GLfloat) 0.273122, (GLfloat) - 0.520000, (GLfloat) - 0.333061,
+       (GLfloat) 0.273122, (GLfloat) 0.333061, (GLfloat) - 0.520000,
+       (GLfloat) 0.212500, (GLfloat) 0.298061, (GLfloat) - 0.520000,
+       (GLfloat) 0.212500, (GLfloat) - 0.520000, (GLfloat) - 0.298061,
+       (GLfloat) 0.151878, (GLfloat) 0.333061, (GLfloat) - 0.520000,
+       (GLfloat) 0.151878, (GLfloat) - 0.520000, (GLfloat) - 0.333061,
+       (GLfloat) 0.151878, (GLfloat) 0.403061, (GLfloat) - 0.520000,
+       (GLfloat) 0.151878, (GLfloat) - 0.520000, (GLfloat) - 0.403061,
+       (GLfloat) 0.212500, (GLfloat) - 0.520000, (GLfloat) - 0.438061,
+       (GLfloat) 0.212500, (GLfloat) 0.438061, (GLfloat) - 0.520000,
+       (GLfloat) 0.485622, (GLfloat) - 0.035000, (GLfloat) - 0.460000,
+       (GLfloat) 0.485622, (GLfloat) - 0.460000, (GLfloat) 0.035000,
+       (GLfloat) 0.425000, (GLfloat) - 0.070000, (GLfloat) - 0.460000,
+       (GLfloat) 0.425000, (GLfloat) - 0.460000, (GLfloat) 0.070000,
+       (GLfloat) 0.364378, (GLfloat) - 0.460000, (GLfloat) 0.035000,
+       (GLfloat) 0.364378, (GLfloat) - 0.035000, (GLfloat) - 0.460000,
+       (GLfloat) 0.364378, (GLfloat) 0.035000, (GLfloat) - 0.460000,
+       (GLfloat) 0.364378, (GLfloat) - 0.460000, (GLfloat) - 0.035000,
+       (GLfloat) 0.425000, (GLfloat) 0.070000, (GLfloat) - 0.460000,
+       (GLfloat) 0.425000, (GLfloat) - 0.460000, (GLfloat) - 0.070000,
+       (GLfloat) 0.485622, (GLfloat) 0.035000, (GLfloat) - 0.460000,
+       (GLfloat) 0.485622, (GLfloat) - 0.460000, (GLfloat) - 0.035000,
+       (GLfloat) 0.485622, (GLfloat) - 0.520000, (GLfloat) 0.035000,
+       (GLfloat) 0.485622, (GLfloat) - 0.035000, (GLfloat) - 0.520000,
+       (GLfloat) 0.425000, (GLfloat) - 0.070000, (GLfloat) - 0.520000,
+       (GLfloat) 0.425000, (GLfloat) - 0.520000, (GLfloat) 0.070000,
+       (GLfloat) 0.364378, (GLfloat) - 0.035000, (GLfloat) - 0.520000,
+       (GLfloat) 0.364378, (GLfloat) - 0.520000, (GLfloat) 0.035000,
+       (GLfloat) 0.364378, (GLfloat) - 0.520000, (GLfloat) - 0.035000,
+       (GLfloat) 0.364378, (GLfloat) 0.035000, (GLfloat) - 0.520000,
+       (GLfloat) 0.425000, (GLfloat) 0.070000, (GLfloat) - 0.520000,
+       (GLfloat) 0.425000, (GLfloat) - 0.520000, (GLfloat) - 0.070000,
+       (GLfloat) 0.485622, (GLfloat) 0.035000, (GLfloat) - 0.520000,
+       (GLfloat) 0.485622, (GLfloat) - 0.520000, (GLfloat) - 0.035000,
+       (GLfloat) 0.485622, (GLfloat) - 0.035000, (GLfloat) - 0.600000,
+       (GLfloat) 0.485622, (GLfloat) - 0.600000, (GLfloat) 0.035000,
+       (GLfloat) 0.425000, (GLfloat) - 0.600000, (GLfloat) 0.070000,
+       (GLfloat) 0.425000, (GLfloat) - 0.070000, (GLfloat) - 0.600000,
+       (GLfloat) 0.364378, (GLfloat) - 0.600000, (GLfloat) 0.035000,
+       (GLfloat) 0.364378, (GLfloat) - 0.035000, (GLfloat) - 0.600000,
+       (GLfloat) 0.364378, (GLfloat) 0.035000, (GLfloat) - 0.600000,
+       (GLfloat) 0.364378, (GLfloat) - 0.600000, (GLfloat) - 0.035000,
+       (GLfloat) 0.425000, (GLfloat) 0.070000, (GLfloat) - 0.600000,
+       (GLfloat) 0.425000, (GLfloat) - 0.600000, (GLfloat) - 0.070000,
+       (GLfloat) 0.485622, (GLfloat) - 0.600000, (GLfloat) - 0.035000,
+       (GLfloat) 0.485622, (GLfloat) 0.035000, (GLfloat) - 0.600000,
+       (GLfloat) 0.485622, (GLfloat) - 0.660000, (GLfloat) 0.035000,
+       (GLfloat) 0.485622, (GLfloat) - 0.035000, (GLfloat) - 0.660000,
+       (GLfloat) 0.425000, (GLfloat) - 0.660000, (GLfloat) 0.070000,
+       (GLfloat) 0.425000, (GLfloat) - 0.070000, (GLfloat) - 0.660000,
+       (GLfloat) 0.364378, (GLfloat) - 0.035000, (GLfloat) - 0.660000,
+       (GLfloat) 0.364378, (GLfloat) - 0.660000, (GLfloat) 0.035000,
+       (GLfloat) 0.364378, (GLfloat) - 0.660000, (GLfloat) - 0.035000,
+       (GLfloat) 0.364378, (GLfloat) 0.035000, (GLfloat) - 0.660000,
+       (GLfloat) 0.425000, (GLfloat) 0.070000, (GLfloat) - 0.660000,
+       (GLfloat) 0.425000, (GLfloat) - 0.660000, (GLfloat) - 0.070000,
+       (GLfloat) 0.485622, (GLfloat) - 0.660000, (GLfloat) - 0.035000,
+       (GLfloat) 0.485622, (GLfloat) 0.035000, (GLfloat) - 0.660000,
+       (GLfloat) 0.212500, (GLfloat) - 0.438061, (GLfloat) - 0.460000,
+       (GLfloat) 0.212500, (GLfloat) - 0.460000, (GLfloat) 0.438061,
+       (GLfloat) 0.151878, (GLfloat) - 0.403061, (GLfloat) - 0.460000,
+       (GLfloat) 0.151878, (GLfloat) - 0.460000, (GLfloat) 0.403061,
+       (GLfloat) 0.151878, (GLfloat) - 0.460000, (GLfloat) 0.333061,
+       (GLfloat) 0.151878, (GLfloat) - 0.333061, (GLfloat) - 0.460000,
+       (GLfloat) 0.212500, (GLfloat) - 0.460000, (GLfloat) 0.298061,
+       (GLfloat) 0.212500, (GLfloat) - 0.298061, (GLfloat) - 0.460000,
+       (GLfloat) 0.273122, (GLfloat) - 0.460000, (GLfloat) 0.333061,
+       (GLfloat) 0.273122, (GLfloat) - 0.333061, (GLfloat) - 0.460000,
+       (GLfloat) 0.273122, (GLfloat) - 0.403061, (GLfloat) - 0.460000,
+       (GLfloat) 0.273122, (GLfloat) - 0.460000, (GLfloat) 0.403061,
+       (GLfloat) 0.212500, (GLfloat) - 0.520000, (GLfloat) 0.438061,
+       (GLfloat) 0.212500, (GLfloat) - 0.438061, (GLfloat) - 0.520000,
+       (GLfloat) 0.151878, (GLfloat) - 0.403061, (GLfloat) - 0.520000,
+       (GLfloat) 0.151878, (GLfloat) - 0.520000, (GLfloat) 0.403061,
+       (GLfloat) 0.151878, (GLfloat) - 0.333061, (GLfloat) - 0.520000,
+       (GLfloat) 0.151878, (GLfloat) - 0.520000, (GLfloat) 0.333061,
+       (GLfloat) 0.212500, (GLfloat) - 0.298061, (GLfloat) - 0.520000,
+       (GLfloat) 0.212500, (GLfloat) - 0.520000, (GLfloat) 0.298061,
+       (GLfloat) 0.273122, (GLfloat) - 0.333061, (GLfloat) - 0.520000,
+       (GLfloat) 0.273122, (GLfloat) - 0.520000, (GLfloat) 0.333061,
+       (GLfloat) 0.273122, (GLfloat) - 0.403061, (GLfloat) - 0.520000,
+       (GLfloat) 0.273122, (GLfloat) - 0.520000, (GLfloat) 0.403061,
+       (GLfloat) 0.212500, (GLfloat) - 0.438061, (GLfloat) - 0.600000,
+       (GLfloat) 0.212500, (GLfloat) - 0.600000, (GLfloat) 0.438061,
+       (GLfloat) 0.151878, (GLfloat) - 0.403061, (GLfloat) - 0.600000,
+       (GLfloat) 0.151878, (GLfloat) - 0.600000, (GLfloat) 0.403061,
+       (GLfloat) 0.151878, (GLfloat) - 0.600000, (GLfloat) 0.333061,
+       (GLfloat) 0.151878, (GLfloat) - 0.333061, (GLfloat) - 0.600000,
+       (GLfloat) 0.212500, (GLfloat) - 0.298061, (GLfloat) - 0.600000,
+       (GLfloat) 0.212500, (GLfloat) - 0.600000, (GLfloat) 0.298061,
+       (GLfloat) 0.273122, (GLfloat) - 0.333061, (GLfloat) - 0.600000,
+       (GLfloat) 0.273122, (GLfloat) - 0.600000, (GLfloat) 0.333061,
+       (GLfloat) 0.273122, (GLfloat) - 0.600000, (GLfloat) 0.403061,
+       (GLfloat) 0.273122, (GLfloat) - 0.403061, (GLfloat) - 0.600000,
+       (GLfloat) 0.212500, (GLfloat) - 0.660000, (GLfloat) 0.438061,
+       (GLfloat) 0.212500, (GLfloat) - 0.438061, (GLfloat) - 0.660000,
+       (GLfloat) 0.151878, (GLfloat) - 0.403061, (GLfloat) - 0.660000,
+       (GLfloat) 0.151878, (GLfloat) - 0.660000, (GLfloat) 0.403061,
+       (GLfloat) 0.151878, (GLfloat) - 0.333061, (GLfloat) - 0.660000,
+       (GLfloat) 0.151878, (GLfloat) - 0.660000, (GLfloat) 0.333061,
+       (GLfloat) 0.212500, (GLfloat) - 0.660000, (GLfloat) 0.298061,
+       (GLfloat) 0.212500, (GLfloat) - 0.298061, (GLfloat) - 0.660000,
+       (GLfloat) 0.273122, (GLfloat) - 0.660000, (GLfloat) 0.333061,
+       (GLfloat) 0.273122, (GLfloat) - 0.333061, (GLfloat) - 0.660000,
+       (GLfloat) 0.273122, (GLfloat) - 0.660000, (GLfloat) 0.403061,
+       (GLfloat) 0.273122, (GLfloat) - 0.403061, (GLfloat) - 0.660000,
+       (GLfloat) - 0.273122, (GLfloat) - 0.460000, (GLfloat) 0.403061,
+       (GLfloat) - 0.273122, (GLfloat) - 0.403061, (GLfloat) - 0.460000,
+       (GLfloat) - 0.273122, (GLfloat) - 0.460000, (GLfloat) 0.333061,
+       (GLfloat) - 0.273122, (GLfloat) - 0.333061, (GLfloat) - 0.460000,
+       (GLfloat) - 0.212500, (GLfloat) - 0.298061, (GLfloat) - 0.460000,
+       (GLfloat) - 0.212500, (GLfloat) - 0.460000, (GLfloat) 0.298061,
+       (GLfloat) - 0.151878, (GLfloat) - 0.333061, (GLfloat) - 0.460000,
+       (GLfloat) - 0.151878, (GLfloat) - 0.460000, (GLfloat) 0.333061,
+       (GLfloat) - 0.151878, (GLfloat) - 0.403061, (GLfloat) - 0.460000,
+       (GLfloat) - 0.151878, (GLfloat) - 0.460000, (GLfloat) 0.403061,
+       (GLfloat) - 0.212500, (GLfloat) - 0.460000, (GLfloat) 0.438061,
+       (GLfloat) - 0.212500, (GLfloat) - 0.438061, (GLfloat) - 0.460000,
+       (GLfloat) - 0.273122, (GLfloat) - 0.520000, (GLfloat) 0.403061,
+       (GLfloat) - 0.273122, (GLfloat) - 0.403061, (GLfloat) - 0.520000,
+       (GLfloat) - 0.273122, (GLfloat) - 0.333061, (GLfloat) - 0.520000,
+       (GLfloat) - 0.273122, (GLfloat) - 0.520000, (GLfloat) 0.333061,
+       (GLfloat) - 0.212500, (GLfloat) - 0.520000, (GLfloat) 0.298061,
+       (GLfloat) - 0.212500, (GLfloat) - 0.298061, (GLfloat) - 0.520000,
+       (GLfloat) - 0.151878, (GLfloat) - 0.333061, (GLfloat) - 0.520000,
+       (GLfloat) - 0.151878, (GLfloat) - 0.520000, (GLfloat) 0.333061,
+       (GLfloat) - 0.151878, (GLfloat) - 0.520000, (GLfloat) 0.403061,
+       (GLfloat) - 0.151878, (GLfloat) - 0.403061, (GLfloat) - 0.520000,
+       (GLfloat) - 0.212500, (GLfloat) - 0.520000, (GLfloat) 0.438061,
+       (GLfloat) - 0.212500, (GLfloat) - 0.438061, (GLfloat) - 0.520000,
+       (GLfloat) - 0.273122, (GLfloat) - 0.600000, (GLfloat) 0.403061,
+       (GLfloat) - 0.273122, (GLfloat) - 0.403061, (GLfloat) - 0.600000,
+       (GLfloat) - 0.273122, (GLfloat) - 0.600000, (GLfloat) 0.333061,
+       (GLfloat) - 0.273122, (GLfloat) - 0.333061, (GLfloat) - 0.600000,
+       (GLfloat) - 0.212500, (GLfloat) - 0.600000, (GLfloat) 0.298061,
+       (GLfloat) - 0.212500, (GLfloat) - 0.298061, (GLfloat) - 0.600000,
+       (GLfloat) - 0.151878, (GLfloat) - 0.333061, (GLfloat) - 0.600000,
+       (GLfloat) - 0.151878, (GLfloat) - 0.600000, (GLfloat) 0.333061,
+       (GLfloat) - 0.151878, (GLfloat) - 0.600000, (GLfloat) 0.403061,
+       (GLfloat) - 0.151878, (GLfloat) - 0.403061, (GLfloat) - 0.600000,
+       (GLfloat) - 0.212500, (GLfloat) - 0.438061, (GLfloat) - 0.600000,
+       (GLfloat) - 0.212500, (GLfloat) - 0.600000, (GLfloat) 0.438061,
+       (GLfloat) - 0.273122, (GLfloat) - 0.660000, (GLfloat) 0.403061,
+       (GLfloat) - 0.273122, (GLfloat) - 0.403061, (GLfloat) - 0.660000,
+       (GLfloat) - 0.273122, (GLfloat) - 0.333061, (GLfloat) - 0.660000,
+       (GLfloat) - 0.273122, (GLfloat) - 0.660000, (GLfloat) 0.333061,
+       (GLfloat) - 0.212500, (GLfloat) - 0.298061, (GLfloat) - 0.660000,
+       (GLfloat) - 0.212500, (GLfloat) - 0.660000, (GLfloat) 0.298061,
+       (GLfloat) - 0.151878, (GLfloat) - 0.660000, (GLfloat) 0.333061,
+       (GLfloat) - 0.151878, (GLfloat) - 0.333061, (GLfloat) - 0.660000,
+       (GLfloat) - 0.151878, (GLfloat) - 0.660000, (GLfloat) 0.403061,
+       (GLfloat) - 0.151878, (GLfloat) - 0.403061, (GLfloat) - 0.660000,
+       (GLfloat) - 0.212500, (GLfloat) - 0.438061, (GLfloat) - 0.660000,
+       (GLfloat) - 0.212500, (GLfloat) - 0.660000, (GLfloat) 0.438061,
+       (GLfloat) - 0.485622, (GLfloat) - 0.460000, (GLfloat) - 0.035000,
+       (GLfloat) - 0.485622, (GLfloat) 0.035000, (GLfloat) - 0.460000,
+       (GLfloat) - 0.425000, (GLfloat) 0.070000, (GLfloat) - 0.460000,
+       (GLfloat) - 0.425000, (GLfloat) - 0.460000, (GLfloat) - 0.070000,
+       (GLfloat) - 0.364378, (GLfloat) 0.035000, (GLfloat) - 0.460000,
+       (GLfloat) - 0.364378, (GLfloat) - 0.460000, (GLfloat) - 0.035000,
+       (GLfloat) - 0.364378, (GLfloat) - 0.460000, (GLfloat) 0.035000,
+       (GLfloat) - 0.364378, (GLfloat) - 0.035000, (GLfloat) - 0.460000,
+       (GLfloat) - 0.425000, (GLfloat) - 0.460000, (GLfloat) 0.070000,
+       (GLfloat) - 0.425000, (GLfloat) - 0.070000, (GLfloat) - 0.460000,
+       (GLfloat) - 0.485622, (GLfloat) - 0.035000, (GLfloat) - 0.460000,
+       (GLfloat) - 0.485622, (GLfloat) - 0.460000, (GLfloat) 0.035000,
+       (GLfloat) - 0.485622, (GLfloat) - 0.520000, (GLfloat) - 0.035000,
+       (GLfloat) - 0.485622, (GLfloat) 0.035000, (GLfloat) - 0.520000,
+       (GLfloat) - 0.425000, (GLfloat) 0.070000, (GLfloat) - 0.520000,
+       (GLfloat) - 0.425000, (GLfloat) - 0.520000, (GLfloat) - 0.070000,
+       (GLfloat) - 0.364378, (GLfloat) 0.035000, (GLfloat) - 0.520000,
+       (GLfloat) - 0.364378, (GLfloat) - 0.520000, (GLfloat) - 0.035000,
+       (GLfloat) - 0.364378, (GLfloat) - 0.035000, (GLfloat) - 0.520000,
+       (GLfloat) - 0.364378, (GLfloat) - 0.520000, (GLfloat) 0.035000,
+       (GLfloat) - 0.425000, (GLfloat) - 0.520000, (GLfloat) 0.070000,
+       (GLfloat) - 0.425000, (GLfloat) - 0.070000, (GLfloat) - 0.520000,
+       (GLfloat) - 0.485622, (GLfloat) - 0.035000, (GLfloat) - 0.520000,
+       (GLfloat) - 0.485622, (GLfloat) - 0.520000, (GLfloat) 0.035000,
+       (GLfloat) - 0.485622, (GLfloat) 0.035000, (GLfloat) - 0.600000,
+       (GLfloat) - 0.485622, (GLfloat) - 0.600000, (GLfloat) - 0.035000,
+       (GLfloat) - 0.425000, (GLfloat) - 0.600000, (GLfloat) - 0.070000,
+       (GLfloat) - 0.425000, (GLfloat) 0.070000, (GLfloat) - 0.600000,
+       (GLfloat) - 0.364378, (GLfloat) - 0.600000, (GLfloat) - 0.035000,
+       (GLfloat) - 0.364378, (GLfloat) 0.035000, (GLfloat) - 0.600000,
+       (GLfloat) - 0.364378, (GLfloat) - 0.600000, (GLfloat) 0.035000,
+       (GLfloat) - 0.364378, (GLfloat) - 0.035000, (GLfloat) - 0.600000,
+       (GLfloat) - 0.425000, (GLfloat) - 0.600000, (GLfloat) 0.070000,
+       (GLfloat) - 0.425000, (GLfloat) - 0.070000, (GLfloat) - 0.600000,
+       (GLfloat) - 0.485622, (GLfloat) - 0.600000, (GLfloat) 0.035000,
+       (GLfloat) - 0.485622, (GLfloat) - 0.035000, (GLfloat) - 0.600000,
+       (GLfloat) - 0.485622, (GLfloat) - 0.660000, (GLfloat) - 0.035000,
+       (GLfloat) - 0.485622, (GLfloat) 0.035000, (GLfloat) - 0.660000,
+       (GLfloat) - 0.425000, (GLfloat) - 0.660000, (GLfloat) - 0.070000,
+       (GLfloat) - 0.425000, (GLfloat) 0.070000, (GLfloat) - 0.660000,
+       (GLfloat) - 0.364378, (GLfloat) 0.035000, (GLfloat) - 0.660000,
+       (GLfloat) - 0.364378, (GLfloat) - 0.660000, (GLfloat) - 0.035000,
+       (GLfloat) - 0.364378, (GLfloat) - 0.660000, (GLfloat) 0.035000,
+       (GLfloat) - 0.364378, (GLfloat) - 0.035000, (GLfloat) - 0.660000,
+       (GLfloat) - 0.425000, (GLfloat) - 0.070000, (GLfloat) - 0.660000,
+       (GLfloat) - 0.425000, (GLfloat) - 0.660000, (GLfloat) 0.070000,
+       (GLfloat) - 0.485622, (GLfloat) - 0.660000, (GLfloat) 0.035000,
+       (GLfloat) - 0.485622, (GLfloat) - 0.035000, (GLfloat) - 0.660000,
+       (GLfloat) - 0.212500, (GLfloat) - 0.460000, (GLfloat) - 0.438061,
+       (GLfloat) - 0.212500, (GLfloat) 0.438061, (GLfloat) - 0.460000,
+       (GLfloat) - 0.151878, (GLfloat) 0.403061, (GLfloat) - 0.460000,
+       (GLfloat) - 0.151878, (GLfloat) - 0.460000, (GLfloat) - 0.403061,
+       (GLfloat) - 0.151878, (GLfloat) - 0.460000, (GLfloat) - 0.333061,
+       (GLfloat) - 0.151878, (GLfloat) 0.333061, (GLfloat) - 0.460000,
+       (GLfloat) - 0.212500, (GLfloat) 0.298061, (GLfloat) - 0.460000,
+       (GLfloat) - 0.212500, (GLfloat) - 0.460000, (GLfloat) - 0.298061,
+       (GLfloat) - 0.273122, (GLfloat) 0.333061, (GLfloat) - 0.460000,
+       (GLfloat) - 0.273122, (GLfloat) - 0.460000, (GLfloat) - 0.333061,
+       (GLfloat) - 0.273122, (GLfloat) - 0.460000, (GLfloat) - 0.403061,
+       (GLfloat) - 0.273122, (GLfloat) 0.403061, (GLfloat) - 0.460000,
+       (GLfloat) - 0.212500, (GLfloat) - 0.520000, (GLfloat) - 0.438061,
+       (GLfloat) - 0.212500, (GLfloat) 0.438061, (GLfloat) - 0.520000,
+       (GLfloat) - 0.151878, (GLfloat) 0.403061, (GLfloat) - 0.520000,
+       (GLfloat) - 0.151878, (GLfloat) - 0.520000, (GLfloat) - 0.403061,
+       (GLfloat) - 0.151878, (GLfloat) - 0.520000, (GLfloat) - 0.333061,
+       (GLfloat) - 0.151878, (GLfloat) 0.333061, (GLfloat) - 0.520000,
+       (GLfloat) - 0.212500, (GLfloat) 0.298061, (GLfloat) - 0.520000,
+       (GLfloat) - 0.212500, (GLfloat) - 0.520000, (GLfloat) - 0.298061,
+       (GLfloat) - 0.273122, (GLfloat) 0.333061, (GLfloat) - 0.520000,
+       (GLfloat) - 0.273122, (GLfloat) - 0.520000, (GLfloat) - 0.333061,
+       (GLfloat) - 0.273122, (GLfloat) 0.403061, (GLfloat) - 0.520000,
+       (GLfloat) - 0.273122, (GLfloat) - 0.520000, (GLfloat) - 0.403061,
+       (GLfloat) - 0.212500, (GLfloat) 0.438061, (GLfloat) - 0.600000,
+       (GLfloat) - 0.212500, (GLfloat) - 0.600000, (GLfloat) - 0.438061,
+       (GLfloat) - 0.151878, (GLfloat) - 0.600000, (GLfloat) - 0.403061,
+       (GLfloat) - 0.151878, (GLfloat) 0.403061, (GLfloat) - 0.600000,
+       (GLfloat) - 0.151878, (GLfloat) 0.333061, (GLfloat) - 0.600000,
+       (GLfloat) - 0.151878, (GLfloat) - 0.600000, (GLfloat) - 0.333061,
+       (GLfloat) - 0.212500, (GLfloat) - 0.600000, (GLfloat) - 0.298061,
+       (GLfloat) - 0.212500, (GLfloat) 0.298061, (GLfloat) - 0.600000,
+       (GLfloat) - 0.273122, (GLfloat) - 0.600000, (GLfloat) - 0.333061,
+       (GLfloat) - 0.273122, (GLfloat) 0.333061, (GLfloat) - 0.600000,
+       (GLfloat) - 0.273122, (GLfloat) - 0.600000, (GLfloat) - 0.403061,
+       (GLfloat) - 0.273122, (GLfloat) 0.403061, (GLfloat) - 0.600000,
+       (GLfloat) - 0.212500, (GLfloat) - 0.660000, (GLfloat) - 0.438061,
+       (GLfloat) - 0.212500, (GLfloat) 0.438061, (GLfloat) - 0.660000,
+       (GLfloat) - 0.151878, (GLfloat) - 0.660000, (GLfloat) - 0.403061,
+       (GLfloat) - 0.151878, (GLfloat) 0.403061, (GLfloat) - 0.660000,
+       (GLfloat) - 0.151878, (GLfloat) - 0.660000, (GLfloat) - 0.333061,
+       (GLfloat) - 0.151878, (GLfloat) 0.333061, (GLfloat) - 0.660000,
+       (GLfloat) - 0.212500, (GLfloat) - 0.660000, (GLfloat) - 0.298061,
+       (GLfloat) - 0.212500, (GLfloat) 0.298061, (GLfloat) - 0.660000,
+       (GLfloat) - 0.273122, (GLfloat) - 0.660000, (GLfloat) - 0.333061,
+       (GLfloat) - 0.273122, (GLfloat) 0.333061, (GLfloat) - 0.660000,
+       (GLfloat) - 0.273122, (GLfloat) 0.403061, (GLfloat) - 0.660000,
+       (GLfloat) - 0.273122, (GLfloat) - 0.660000, (GLfloat) - 0.403061,
+};
+
+static GLfloat ElbowBolts_normals[] =
+{
+       (GLfloat) - 0.000000, (GLfloat) - 0.000000, (GLfloat) 1.000000,
+       (GLfloat) 0.500000, (GLfloat) 0.866026, (GLfloat) 0.000000,
+       (GLfloat) 1.000000, (GLfloat) - 0.000000, (GLfloat) - 0.000000,
+       (GLfloat) 0.500000, (GLfloat) - 0.866025, (GLfloat) - 0.000000,
+       (GLfloat) - 0.500000, (GLfloat) - 0.866025, (GLfloat) - 0.000000,
+       (GLfloat) - 1.000000, (GLfloat) - 0.000000, (GLfloat) - 0.000000,
+       (GLfloat) - 0.500000, (GLfloat) 0.866025, (GLfloat) - 0.000000,
+       (GLfloat) - 0.000000, (GLfloat) 0.000000, (GLfloat) - 1.000000,
+       (GLfloat) - 0.000000, (GLfloat) - 0.000000, (GLfloat) 1.000000,
+       (GLfloat) 0.499999, (GLfloat) 0.866026, (GLfloat) 0.000000,
+       (GLfloat) 1.000000, (GLfloat) - 0.000000, (GLfloat) - 0.000000,
+       (GLfloat) 0.500000, (GLfloat) - 0.866025, (GLfloat) - 0.000000,
+       (GLfloat) - 0.500000, (GLfloat) - 0.866025, (GLfloat) - 0.000000,
+       (GLfloat) - 1.000000, (GLfloat) - 0.000000, (GLfloat) - 0.000000,
+       (GLfloat) - 0.500000, (GLfloat) 0.866025, (GLfloat) - 0.000000,
+       (GLfloat) - 0.000000, (GLfloat) 0.000000, (GLfloat) - 1.000000,
+       (GLfloat) 0.000000, (GLfloat) 0.000000, (GLfloat) 1.000000,
+       (GLfloat) - 0.500000, (GLfloat) 0.866025, (GLfloat) - 0.000000,
+       (GLfloat) 0.500000, (GLfloat) 0.866025, (GLfloat) 0.000000,
+       (GLfloat) 1.000000, (GLfloat) - 0.000000, (GLfloat) - 0.000000,
+       (GLfloat) 0.500000, (GLfloat) - 0.866025, (GLfloat) - 0.000000,
+       (GLfloat) - 0.500000, (GLfloat) - 0.866025, (GLfloat) - 0.000000,
+       (GLfloat) - 1.000000, (GLfloat) - 0.000000, (GLfloat) - 0.000000,
+       (GLfloat) - 0.000000, (GLfloat) 0.000000, (GLfloat) - 1.000000,
+       (GLfloat) 0.000000, (GLfloat) 0.000000, (GLfloat) 1.000000,
+       (GLfloat) - 0.500000, (GLfloat) 0.866025, (GLfloat) - 0.000000,
+       (GLfloat) 0.500000, (GLfloat) 0.866025, (GLfloat) 0.000000,
+       (GLfloat) 1.000000, (GLfloat) - 0.000000, (GLfloat) - 0.000000,
+       (GLfloat) 0.500000, (GLfloat) - 0.866025, (GLfloat) - 0.000000,
+       (GLfloat) - 0.500000, (GLfloat) - 0.866025, (GLfloat) - 0.000000,
+       (GLfloat) - 1.000000, (GLfloat) - 0.000000, (GLfloat) - 0.000000,
+       (GLfloat) - 0.000000, (GLfloat) 0.000000, (GLfloat) - 1.000000,
+       (GLfloat) - 0.000000, (GLfloat) 0.000000, (GLfloat) 1.000000,
+       (GLfloat) - 1.000000, (GLfloat) - 0.000000, (GLfloat) - 0.000000,
+       (GLfloat) - 0.500000, (GLfloat) 0.866026, (GLfloat) - 0.000000,
+       (GLfloat) 0.500000, (GLfloat) 0.866025, (GLfloat) 0.000000,
+       (GLfloat) 1.000000, (GLfloat) - 0.000000, (GLfloat) - 0.000000,
+       (GLfloat) 0.500000, (GLfloat) - 0.866026, (GLfloat) - 0.000000,
+       (GLfloat) - 0.500000, (GLfloat) - 0.866025, (GLfloat) - 0.000000,
+       (GLfloat) - 0.000000, (GLfloat) 0.000000, (GLfloat) - 1.000000,
+       (GLfloat) - 0.000000, (GLfloat) 0.000000, (GLfloat) 1.000000,
+       (GLfloat) - 1.000000, (GLfloat) - 0.000000, (GLfloat) - 0.000000,
+       (GLfloat) - 0.500000, (GLfloat) 0.866026, (GLfloat) - 0.000000,
+       (GLfloat) 0.500000, (GLfloat) 0.866025, (GLfloat) 0.000000,
+       (GLfloat) 1.000000, (GLfloat) - 0.000000, (GLfloat) - 0.000000,
+       (GLfloat) 0.500000, (GLfloat) - 0.866025, (GLfloat) - 0.000000,
+       (GLfloat) - 0.500000, (GLfloat) - 0.866025, (GLfloat) - 0.000000,
+       (GLfloat) - 0.000000, (GLfloat) 0.000000, (GLfloat) - 1.000000,
+       (GLfloat) - 0.000000, (GLfloat) 0.000000, (GLfloat) 1.000000,
+       (GLfloat) - 0.500000, (GLfloat) - 0.866026, (GLfloat) - 0.000000,
+       (GLfloat) - 1.000000, (GLfloat) 0.000000, (GLfloat) - 0.000000,
+       (GLfloat) - 0.500000, (GLfloat) 0.866025, (GLfloat) - 0.000000,
+       (GLfloat) 0.500000, (GLfloat) 0.866025, (GLfloat) 0.000000,
+       (GLfloat) 1.000000, (GLfloat) - 0.000000, (GLfloat) - 0.000000,
+       (GLfloat) 0.500000, (GLfloat) - 0.866025, (GLfloat) - 0.000000,
+       (GLfloat) - 0.000000, (GLfloat) - 0.000000, (GLfloat) - 1.000000,
+       (GLfloat) - 0.000000, (GLfloat) 0.000000, (GLfloat) 1.000000,
+       (GLfloat) - 0.499999, (GLfloat) - 0.866026, (GLfloat) - 0.000000,
+       (GLfloat) - 1.000000, (GLfloat) 0.000000, (GLfloat) - 0.000000,
+       (GLfloat) - 0.500000, (GLfloat) 0.866025, (GLfloat) - 0.000000,
+       (GLfloat) 0.500000, (GLfloat) 0.866025, (GLfloat) 0.000000,
+       (GLfloat) 1.000000, (GLfloat) - 0.000000, (GLfloat) - 0.000000,
+       (GLfloat) 0.500000, (GLfloat) - 0.866025, (GLfloat) - 0.000000,
+       (GLfloat) - 0.000000, (GLfloat) - 0.000000, (GLfloat) - 1.000000,
+       (GLfloat) - 0.000000, (GLfloat) 0.000000, (GLfloat) 1.000000,
+       (GLfloat) 0.500000, (GLfloat) - 0.866025, (GLfloat) - 0.000000,
+       (GLfloat) - 0.500000, (GLfloat) - 0.866025, (GLfloat) - 0.000000,
+       (GLfloat) - 1.000000, (GLfloat) - 0.000000, (GLfloat) - 0.000000,
+       (GLfloat) - 0.500000, (GLfloat) 0.866025, (GLfloat) - 0.000000,
+       (GLfloat) 0.500000, (GLfloat) 0.866025, (GLfloat) 0.000000,
+       (GLfloat) 1.000000, (GLfloat) - 0.000000, (GLfloat) - 0.000000,
+       (GLfloat) - 0.000000, (GLfloat) 0.000000, (GLfloat) - 1.000000,
+       (GLfloat) - 0.000000, (GLfloat) 0.000000, (GLfloat) 1.000000,
+       (GLfloat) 0.500000, (GLfloat) - 0.866025, (GLfloat) - 0.000000,
+       (GLfloat) - 0.500000, (GLfloat) - 0.866025, (GLfloat) - 0.000000,
+       (GLfloat) - 1.000000, (GLfloat) - 0.000000, (GLfloat) - 0.000000,
+       (GLfloat) - 0.500000, (GLfloat) 0.866025, (GLfloat) - 0.000000,
+       (GLfloat) 0.500000, (GLfloat) 0.866025, (GLfloat) 0.000000,
+       (GLfloat) 1.000000, (GLfloat) - 0.000000, (GLfloat) - 0.000000,
+       (GLfloat) - 0.000000, (GLfloat) 0.000000, (GLfloat) - 1.000000,
+       (GLfloat) - 0.000000, (GLfloat) - 0.000000, (GLfloat) 1.000000,
+       (GLfloat) 1.000000, (GLfloat) 0.000000, (GLfloat) 0.000000,
+       (GLfloat) 0.500000, (GLfloat) - 0.866026, (GLfloat) - 0.000000,
+       (GLfloat) - 0.500000, (GLfloat) - 0.866025, (GLfloat) - 0.000000,
+       (GLfloat) - 1.000000, (GLfloat) - 0.000000, (GLfloat) - 0.000000,
+       (GLfloat) - 0.500000, (GLfloat) 0.866026, (GLfloat) - 0.000000,
+       (GLfloat) 0.500000, (GLfloat) 0.866025, (GLfloat) 0.000000,
+       (GLfloat) 0.000000, (GLfloat) 0.000000, (GLfloat) - 1.000000,
+       (GLfloat) - 0.000000, (GLfloat) - 0.000000, (GLfloat) 1.000000,
+       (GLfloat) 1.000000, (GLfloat) 0.000000, (GLfloat) 0.000000,
+       (GLfloat) 0.500000, (GLfloat) - 0.866026, (GLfloat) - 0.000000,
+       (GLfloat) - 0.500000, (GLfloat) - 0.866025, (GLfloat) - 0.000000,
+       (GLfloat) - 1.000000, (GLfloat) - 0.000000, (GLfloat) - 0.000000,
+       (GLfloat) - 0.500000, (GLfloat) 0.866025, (GLfloat) - 0.000000,
+       (GLfloat) 0.500000, (GLfloat) 0.866025, (GLfloat) 0.000000,
+       (GLfloat) 0.000000, (GLfloat) 0.000000, (GLfloat) - 1.000000,
+       (GLfloat) - 0.000000, (GLfloat) 1.000000, (GLfloat) 0.000000,
+       (GLfloat) 0.500000, (GLfloat) 0.000000, (GLfloat) - 0.866026,
+       (GLfloat) 1.000000, (GLfloat) 0.000000, (GLfloat) 0.000000,
+       (GLfloat) 0.500000, (GLfloat) 0.000000, (GLfloat) 0.866025,
+       (GLfloat) - 0.500000, (GLfloat) 0.000000, (GLfloat) 0.866025,
+       (GLfloat) - 1.000000, (GLfloat) 0.000000, (GLfloat) 0.000000,
+       (GLfloat) - 0.500000, (GLfloat) - 0.000000, (GLfloat) - 0.866025,
+       (GLfloat) - 0.000000, (GLfloat) - 1.000000, (GLfloat) - 0.000000,
+       (GLfloat) - 0.000000, (GLfloat) 1.000000, (GLfloat) 0.000000,
+       (GLfloat) 0.499999, (GLfloat) 0.000000, (GLfloat) - 0.866026,
+       (GLfloat) 1.000000, (GLfloat) 0.000000, (GLfloat) 0.000000,
+       (GLfloat) 0.500000, (GLfloat) 0.000000, (GLfloat) 0.866025,
+       (GLfloat) - 0.500000, (GLfloat) 0.000000, (GLfloat) 0.866025,
+       (GLfloat) - 1.000000, (GLfloat) 0.000000, (GLfloat) 0.000000,
+       (GLfloat) - 0.500000, (GLfloat) - 0.000000, (GLfloat) - 0.866025,
+       (GLfloat) - 0.000000, (GLfloat) - 1.000000, (GLfloat) - 0.000000,
+       (GLfloat) 0.000000, (GLfloat) 1.000000, (GLfloat) - 0.000000,
+       (GLfloat) - 0.500000, (GLfloat) - 0.000000, (GLfloat) - 0.866025,
+       (GLfloat) 0.500000, (GLfloat) 0.000000, (GLfloat) - 0.866025,
+       (GLfloat) 1.000000, (GLfloat) 0.000000, (GLfloat) 0.000000,
+       (GLfloat) 0.500000, (GLfloat) 0.000000, (GLfloat) 0.866025,
+       (GLfloat) - 0.500000, (GLfloat) 0.000000, (GLfloat) 0.866025,
+       (GLfloat) - 1.000000, (GLfloat) 0.000000, (GLfloat) 0.000000,
+       (GLfloat) - 0.000000, (GLfloat) - 1.000000, (GLfloat) - 0.000000,
+       (GLfloat) 0.000000, (GLfloat) 1.000000, (GLfloat) - 0.000000,
+       (GLfloat) - 0.500000, (GLfloat) - 0.000000, (GLfloat) - 0.866025,
+       (GLfloat) 0.500000, (GLfloat) 0.000000, (GLfloat) - 0.866025,
+       (GLfloat) 1.000000, (GLfloat) 0.000000, (GLfloat) 0.000000,
+       (GLfloat) 0.500000, (GLfloat) 0.000000, (GLfloat) 0.866025,
+       (GLfloat) - 0.500000, (GLfloat) 0.000000, (GLfloat) 0.866025,
+       (GLfloat) - 1.000000, (GLfloat) 0.000000, (GLfloat) 0.000000,
+       (GLfloat) - 0.000000, (GLfloat) - 1.000000, (GLfloat) - 0.000000,
+       (GLfloat) - 0.000000, (GLfloat) 1.000000, (GLfloat) - 0.000000,
+       (GLfloat) - 1.000000, (GLfloat) 0.000000, (GLfloat) 0.000000,
+       (GLfloat) - 0.500000, (GLfloat) - 0.000000, (GLfloat) - 0.866026,
+       (GLfloat) 0.500000, (GLfloat) 0.000000, (GLfloat) - 0.866025,
+       (GLfloat) 1.000000, (GLfloat) 0.000000, (GLfloat) 0.000000,
+       (GLfloat) 0.500000, (GLfloat) 0.000000, (GLfloat) 0.866026,
+       (GLfloat) - 0.500000, (GLfloat) 0.000000, (GLfloat) 0.866025,
+       (GLfloat) - 0.000000, (GLfloat) - 1.000000, (GLfloat) - 0.000000,
+       (GLfloat) - 0.000000, (GLfloat) 1.000000, (GLfloat) - 0.000000,
+       (GLfloat) - 1.000000, (GLfloat) 0.000000, (GLfloat) 0.000000,
+       (GLfloat) - 0.500000, (GLfloat) - 0.000000, (GLfloat) - 0.866026,
+       (GLfloat) 0.500000, (GLfloat) 0.000000, (GLfloat) - 0.866025,
+       (GLfloat) 1.000000, (GLfloat) 0.000000, (GLfloat) 0.000000,
+       (GLfloat) 0.500000, (GLfloat) 0.000000, (GLfloat) 0.866025,
+       (GLfloat) - 0.500000, (GLfloat) 0.000000, (GLfloat) 0.866025,
+       (GLfloat) - 0.000000, (GLfloat) - 1.000000, (GLfloat) - 0.000000,
+       (GLfloat) - 0.000000, (GLfloat) 1.000000, (GLfloat) - 0.000000,
+       (GLfloat) - 0.500000, (GLfloat) 0.000000, (GLfloat) 0.866026,
+       (GLfloat) - 1.000000, (GLfloat) - 0.000000, (GLfloat) - 0.000000,
+       (GLfloat) - 0.500000, (GLfloat) - 0.000000, (GLfloat) - 0.866025,
+       (GLfloat) 0.500000, (GLfloat) 0.000000, (GLfloat) - 0.866025,
+       (GLfloat) 1.000000, (GLfloat) 0.000000, (GLfloat) 0.000000,
+       (GLfloat) 0.500000, (GLfloat) 0.000000, (GLfloat) 0.866025,
+       (GLfloat) - 0.000000, (GLfloat) - 1.000000, (GLfloat) 0.000000,
+       (GLfloat) - 0.000000, (GLfloat) 1.000000, (GLfloat) - 0.000000,
+       (GLfloat) - 0.499999, (GLfloat) 0.000000, (GLfloat) 0.866026,
+       (GLfloat) - 1.000000, (GLfloat) - 0.000000, (GLfloat) - 0.000000,
+       (GLfloat) - 0.500000, (GLfloat) - 0.000000, (GLfloat) - 0.866025,
+       (GLfloat) 0.500000, (GLfloat) 0.000000, (GLfloat) - 0.866025,
+       (GLfloat) 1.000000, (GLfloat) 0.000000, (GLfloat) 0.000000,
+       (GLfloat) 0.500000, (GLfloat) 0.000000, (GLfloat) 0.866025,
+       (GLfloat) - 0.000000, (GLfloat) - 1.000000, (GLfloat) 0.000000,
+       (GLfloat) - 0.000000, (GLfloat) 1.000000, (GLfloat) - 0.000000,
+       (GLfloat) 0.500000, (GLfloat) 0.000000, (GLfloat) 0.866025,
+       (GLfloat) - 0.500000, (GLfloat) 0.000000, (GLfloat) 0.866025,
+       (GLfloat) - 1.000000, (GLfloat) 0.000000, (GLfloat) 0.000000,
+       (GLfloat) - 0.500000, (GLfloat) - 0.000000, (GLfloat) - 0.866025,
+       (GLfloat) 0.500000, (GLfloat) 0.000000, (GLfloat) - 0.866025,
+       (GLfloat) 1.000000, (GLfloat) 0.000000, (GLfloat) 0.000000,
+       (GLfloat) - 0.000000, (GLfloat) - 1.000000, (GLfloat) - 0.000000,
+       (GLfloat) - 0.000000, (GLfloat) 1.000000, (GLfloat) - 0.000000,
+       (GLfloat) 0.500000, (GLfloat) 0.000000, (GLfloat) 0.866025,
+       (GLfloat) - 0.500000, (GLfloat) 0.000000, (GLfloat) 0.866025,
+       (GLfloat) - 1.000000, (GLfloat) 0.000000, (GLfloat) 0.000000,
+       (GLfloat) - 0.500000, (GLfloat) - 0.000000, (GLfloat) - 0.866025,
+       (GLfloat) 0.500000, (GLfloat) 0.000000, (GLfloat) - 0.866025,
+       (GLfloat) 1.000000, (GLfloat) 0.000000, (GLfloat) 0.000000,
+       (GLfloat) - 0.000000, (GLfloat) - 1.000000, (GLfloat) - 0.000000,
+       (GLfloat) - 0.000000, (GLfloat) 1.000000, (GLfloat) 0.000000,
+       (GLfloat) 1.000000, (GLfloat) 0.000000, (GLfloat) - 0.000000,
+       (GLfloat) 0.500000, (GLfloat) 0.000000, (GLfloat) 0.866026,
+       (GLfloat) - 0.500000, (GLfloat) 0.000000, (GLfloat) 0.866025,
+       (GLfloat) - 1.000000, (GLfloat) 0.000000, (GLfloat) 0.000000,
+       (GLfloat) - 0.500000, (GLfloat) - 0.000000, (GLfloat) - 0.866026,
+       (GLfloat) 0.500000, (GLfloat) 0.000000, (GLfloat) - 0.866025,
+       (GLfloat) 0.000000, (GLfloat) - 1.000000, (GLfloat) - 0.000000,
+       (GLfloat) - 0.000000, (GLfloat) 1.000000, (GLfloat) 0.000000,
+       (GLfloat) 1.000000, (GLfloat) 0.000000, (GLfloat) - 0.000000,
+       (GLfloat) 0.500000, (GLfloat) 0.000000, (GLfloat) 0.866026,
+       (GLfloat) - 0.500000, (GLfloat) 0.000000, (GLfloat) 0.866025,
+       (GLfloat) - 1.000000, (GLfloat) 0.000000, (GLfloat) 0.000000,
+       (GLfloat) - 0.500000, (GLfloat) - 0.000000, (GLfloat) - 0.866025,
+       (GLfloat) 0.500000, (GLfloat) 0.000000, (GLfloat) - 0.866025,
+       (GLfloat) 0.000000, (GLfloat) - 1.000000, (GLfloat) - 0.000000,
+};
+
+static unsigned short int ElbowBolts_POLS[] =
+{
+       6, 241, 242, 245, 246, 248, 251, 1, 4, 253, 254, 242, 241, 1, 4, 254, 257, 245, 242, 1,
+       4, 257, 258, 246, 245, 1, 4, 258, 260, 248, 246, 1, 4, 260, 262, 251, 248, 1, 4, 262,
+       253, 241, 251, 1, 6, 253, 262, 260, 258, 257, 254, 1, 6, 264, 267, 268, 271, 273, 275, 1,
+       4, 277, 279, 267, 264, 1, 4, 279, 281, 268, 267, 1, 4, 281, 283, 271, 268, 1, 4, 283,
+       285, 273, 271, 1, 4, 285, 286, 275, 273, 1, 4, 286, 277, 264, 275, 1, 6, 277, 286, 285,
+       283, 281, 279, 1, 6, 193, 194, 196, 199, 201, 202, 1, 4, 205, 206, 194, 193, 1, 4, 206,
+       208, 196, 194, 1, 4, 208, 210, 199, 196, 1, 4, 210, 213, 201, 199, 1, 4, 213, 214, 202,
+       201, 1, 4, 214, 205, 193, 202, 1, 6, 205, 214, 213, 210, 208, 206, 1, 6, 216, 219, 221,
+       223, 225, 227, 1, 4, 229, 231, 219, 216, 1, 4, 231, 232, 221, 219, 1, 4, 232, 235, 223,
+       221, 1, 4, 235, 236, 225, 223, 1, 4, 236, 239, 227, 225, 1, 4, 239, 229, 216, 227, 1,
+       6, 229, 239, 236, 235, 232, 231, 1, 6, 145, 147, 148, 150, 152, 155, 1, 4, 157, 158, 147,
+       145, 1, 4, 158, 161, 148, 147, 1, 4, 161, 162, 150, 148, 1, 4, 162, 165, 152, 150, 1,
+       4, 165, 167, 155, 152, 1, 4, 167, 157, 145, 155, 1, 6, 157, 167, 165, 162, 161, 158, 1,
+       6, 169, 171, 173, 174, 177, 178, 1, 4, 181, 182, 171, 169, 1, 4, 182, 184, 173, 171, 1,
+       4, 184, 187, 174, 173, 1, 4, 187, 189, 177, 174, 1, 4, 189, 190, 178, 177, 1, 4, 190,
+       181, 169, 178, 1, 6, 181, 190, 189, 187, 184, 182, 1, 6, 96, 98, 101, 103, 105, 106, 1,
+       4, 109, 110, 98, 96, 1, 4, 110, 112, 101, 98, 1, 4, 112, 114, 103, 101, 1, 4, 114,
+       116, 105, 103, 1, 4, 116, 118, 106, 105, 1, 4, 118, 109, 96, 106, 1, 6, 109, 118, 116,
+       114, 112, 110, 1, 6, 120, 122, 125, 126, 128, 131, 1, 4, 133, 134, 122, 120, 1, 4, 134,
+       136, 125, 122, 1, 4, 136, 139, 126, 125, 1, 4, 139, 141, 128, 126, 1, 4, 141, 143, 131,
+       128, 1, 4, 143, 133, 120, 131, 1, 6, 133, 143, 141, 139, 136, 134, 1, 6, 48, 50, 53,
+    54, 56, 58, 1, 4, 61, 62, 50, 48, 1, 4, 62, 64, 53, 50, 1, 4, 64, 67, 54,
+     53, 1, 4, 67, 68, 56, 54, 1, 4, 68, 70, 58, 56, 1, 4, 70, 61, 48, 58, 1,
+   6, 61, 70, 68, 67, 64, 62, 1, 6, 72, 75, 77, 78, 80, 83, 1, 4, 85, 87, 75,
+     72, 1, 4, 87, 88, 77, 75, 1, 4, 88, 91, 78, 77, 1, 4, 91, 92, 80, 78, 1,
+    4, 92, 95, 83, 80, 1, 4, 95, 85, 72, 83, 1, 6, 85, 95, 92, 91, 88, 87, 1,
+    6, 24, 26, 28, 30, 32, 35, 1, 4, 36, 39, 26, 24, 1, 4, 39, 40, 28, 26, 1,
+     4, 40, 42, 30, 28, 1, 4, 42, 44, 32, 30, 1, 4, 44, 47, 35, 32, 1, 4, 47,
+       36, 24, 35, 1, 6, 36, 47, 44, 42, 40, 39, 1, 6, 1, 2, 4, 6, 8, 11, 1,
+       4, 13, 15, 2, 1, 1, 4, 15, 16, 4, 2, 1, 4, 16, 19, 6, 4, 1, 4, 19,
+       20, 8, 6, 1, 4, 20, 23, 11, 8, 1, 4, 23, 13, 1, 11, 1, 6, 13, 23, 20,
+       19, 16, 15, 1, 6, 240, 243, 244, 247, 249, 250, 1, 4, 252, 255, 243, 240, 1, 4, 255,
+       256, 244, 243, 1, 4, 256, 259, 247, 244, 1, 4, 259, 261, 249, 247, 1, 4, 261, 263, 250,
+       249, 1, 4, 263, 252, 240, 250, 1, 6, 252, 263, 261, 259, 256, 255, 1, 6, 265, 266, 269,
+       270, 272, 274, 1, 4, 276, 278, 266, 265, 1, 4, 278, 280, 269, 266, 1, 4, 280, 282, 270,
+       269, 1, 4, 282, 284, 272, 270, 1, 4, 284, 287, 274, 272, 1, 4, 287, 276, 265, 274, 1,
+       6, 276, 287, 284, 282, 280, 278, 1, 6, 192, 195, 197, 198, 200, 203, 1, 4, 204, 207, 195,
+       192, 1, 4, 207, 209, 197, 195, 1, 4, 209, 211, 198, 197, 1, 4, 211, 212, 200, 198, 1,
+       4, 212, 215, 203, 200, 1, 4, 215, 204, 192, 203, 1, 6, 204, 215, 212, 211, 209, 207, 1,
+       6, 217, 218, 220, 222, 224, 226, 1, 4, 228, 230, 218, 217, 1, 4, 230, 233, 220, 218, 1,
+       4, 233, 234, 222, 220, 1, 4, 234, 237, 224, 222, 1, 4, 237, 238, 226, 224, 1, 4, 238,
+       228, 217, 226, 1, 6, 228, 238, 237, 234, 233, 230, 1, 6, 144, 146, 149, 151, 153, 154, 1,
+       4, 156, 159, 146, 144, 1, 4, 159, 160, 149, 146, 1, 4, 160, 163, 151, 149, 1, 4, 163,
+       164, 153, 151, 1, 4, 164, 166, 154, 153, 1, 4, 166, 156, 144, 154, 1, 6, 156, 166, 164,
+       163, 160, 159, 1, 6, 168, 170, 172, 175, 176, 179, 1, 4, 180, 183, 170, 168, 1, 4, 183,
+       185, 172, 170, 1, 4, 185, 186, 175, 172, 1, 4, 186, 188, 176, 175, 1, 4, 188, 191, 179,
+       176, 1, 4, 191, 180, 168, 179, 1, 6, 180, 191, 188, 186, 185, 183, 1, 6, 97, 99, 100,
+       102, 104, 107, 1, 4, 108, 111, 99, 97, 1, 4, 111, 113, 100, 99, 1, 4, 113, 115, 102,
+       100, 1, 4, 115, 117, 104, 102, 1, 4, 117, 119, 107, 104, 1, 4, 119, 108, 97, 107, 1,
+       6, 108, 119, 117, 115, 113, 111, 1, 6, 121, 123, 124, 127, 129, 130, 1, 4, 132, 135, 123,
+       121, 1, 4, 135, 137, 124, 123, 1, 4, 137, 138, 127, 124, 1, 4, 138, 140, 129, 127, 1,
+       4, 140, 142, 130, 129, 1, 4, 142, 132, 121, 130, 1, 6, 132, 142, 140, 138, 137, 135, 1,
+    6, 49, 51, 52, 55, 57, 59, 1, 4, 60, 63, 51, 49, 1, 4, 63, 65, 52, 51, 1,
+     4, 65, 66, 55, 52, 1, 4, 66, 69, 57, 55, 1, 4, 69, 71, 59, 57, 1, 4, 71,
+   60, 49, 59, 1, 6, 60, 71, 69, 66, 65, 63, 1, 6, 73, 74, 76, 79, 81, 82, 1,
+     4, 84, 86, 74, 73, 1, 4, 86, 89, 76, 74, 1, 4, 89, 90, 79, 76, 1, 4, 90,
+    93, 81, 79, 1, 4, 93, 94, 82, 81, 1, 4, 94, 84, 73, 82, 1, 6, 84, 94, 93,
+    90, 89, 86, 1, 6, 25, 27, 29, 31, 33, 34, 1, 4, 37, 38, 27, 25, 1, 4, 38,
+    41, 29, 27, 1, 4, 41, 43, 31, 29, 1, 4, 43, 45, 33, 31, 1, 4, 45, 46, 34,
+       33, 1, 4, 46, 37, 25, 34, 1, 6, 37, 46, 45, 43, 41, 38, 1, 6, 0, 3, 5,
+       7, 9, 10, 1, 4, 12, 14, 3, 0, 1, 4, 14, 17, 5, 3, 1, 4, 17, 18, 7,
+       5, 1, 4, 18, 21, 9, 7, 1, 4, 21, 22, 10, 9, 1, 4, 22, 12, 0, 10, 1,
+       6, 12, 22, 21, 18, 17, 14, 1,
+       0
+};
+
+struct lwo  LWO_ElbowBolts =
+{
+       288,                    /* number of points */
+       ElbowBolts_PNTS, ElbowBolts_normals, ElbowBolts_POLS, 0L
+};
+
+static GLfloat ElbowCoins_PNTS[] =
+{
+       (GLfloat) 0.000000, (GLfloat) - 0.520000, (GLfloat) - 0.500000,
+       (GLfloat) 0.097545, (GLfloat) - 0.520000, (GLfloat) - 0.490393,
+       (GLfloat) 0.191342, (GLfloat) - 0.520000, (GLfloat) - 0.461940,
+       (GLfloat) 0.277785, (GLfloat) - 0.520000, (GLfloat) - 0.415735,
+       (GLfloat) 0.353553, (GLfloat) - 0.520000, (GLfloat) - 0.353553,
+       (GLfloat) 0.415735, (GLfloat) - 0.520000, (GLfloat) - 0.277785,
+       (GLfloat) 0.461940, (GLfloat) - 0.520000, (GLfloat) - 0.191342,
+       (GLfloat) 0.490393, (GLfloat) - 0.520000, (GLfloat) - 0.097545,
+       (GLfloat) 0.500000, (GLfloat) - 0.520000, (GLfloat) - 0.000000,
+       (GLfloat) 0.490393, (GLfloat) - 0.520000, (GLfloat) 0.097545,
+       (GLfloat) 0.461940, (GLfloat) - 0.520000, (GLfloat) 0.191342,
+       (GLfloat) 0.415735, (GLfloat) - 0.520000, (GLfloat) 0.277785,
+       (GLfloat) 0.353553, (GLfloat) - 0.520000, (GLfloat) 0.353553,
+       (GLfloat) 0.277785, (GLfloat) - 0.520000, (GLfloat) 0.415735,
+       (GLfloat) 0.191342, (GLfloat) - 0.520000, (GLfloat) 0.461940,
+       (GLfloat) 0.097545, (GLfloat) - 0.520000, (GLfloat) 0.490393,
+       (GLfloat) 0.000000, (GLfloat) - 0.520000, (GLfloat) 0.500000,
+       (GLfloat) - 0.097545, (GLfloat) - 0.520000, (GLfloat) 0.490393,
+       (GLfloat) - 0.191342, (GLfloat) - 0.520000, (GLfloat) 0.461940,
+       (GLfloat) - 0.277785, (GLfloat) - 0.520000, (GLfloat) 0.415735,
+       (GLfloat) - 0.353553, (GLfloat) - 0.520000, (GLfloat) 0.353553,
+       (GLfloat) - 0.415735, (GLfloat) - 0.520000, (GLfloat) 0.277785,
+       (GLfloat) - 0.461940, (GLfloat) - 0.520000, (GLfloat) 0.191342,
+       (GLfloat) - 0.490393, (GLfloat) - 0.520000, (GLfloat) 0.097545,
+       (GLfloat) - 0.500000, (GLfloat) - 0.520000, (GLfloat) 0.000000,
+       (GLfloat) - 0.490393, (GLfloat) - 0.520000, (GLfloat) - 0.097545,
+       (GLfloat) - 0.461940, (GLfloat) - 0.520000, (GLfloat) - 0.191342,
+       (GLfloat) - 0.415735, (GLfloat) - 0.520000, (GLfloat) - 0.277785,
+       (GLfloat) - 0.353553, (GLfloat) - 0.520000, (GLfloat) - 0.353553,
+       (GLfloat) - 0.277785, (GLfloat) - 0.520000, (GLfloat) - 0.415735,
+       (GLfloat) - 0.191342, (GLfloat) - 0.520000, (GLfloat) - 0.461940,
+       (GLfloat) - 0.097545, (GLfloat) - 0.520000, (GLfloat) - 0.490393,
+       (GLfloat) 0.000000, (GLfloat) - 0.600000, (GLfloat) - 0.500000,
+       (GLfloat) 0.097545, (GLfloat) - 0.600000, (GLfloat) - 0.490393,
+       (GLfloat) 0.191342, (GLfloat) - 0.600000, (GLfloat) - 0.461940,
+       (GLfloat) 0.277785, (GLfloat) - 0.600000, (GLfloat) - 0.415735,
+       (GLfloat) 0.353553, (GLfloat) - 0.600000, (GLfloat) - 0.353553,
+       (GLfloat) 0.415735, (GLfloat) - 0.600000, (GLfloat) - 0.277785,
+       (GLfloat) 0.461940, (GLfloat) - 0.600000, (GLfloat) - 0.191342,
+       (GLfloat) 0.490393, (GLfloat) - 0.600000, (GLfloat) - 0.097545,
+       (GLfloat) 0.500000, (GLfloat) - 0.600000, (GLfloat) - 0.000000,
+       (GLfloat) 0.490393, (GLfloat) - 0.600000, (GLfloat) 0.097545,
+       (GLfloat) 0.461940, (GLfloat) - 0.600000, (GLfloat) 0.191342,
+       (GLfloat) 0.415735, (GLfloat) - 0.600000, (GLfloat) 0.277785,
+       (GLfloat) 0.353553, (GLfloat) - 0.600000, (GLfloat) 0.353553,
+       (GLfloat) 0.277785, (GLfloat) - 0.600000, (GLfloat) 0.415735,
+       (GLfloat) 0.191342, (GLfloat) - 0.600000, (GLfloat) 0.461940,
+       (GLfloat) 0.097545, (GLfloat) - 0.600000, (GLfloat) 0.490393,
+       (GLfloat) 0.000000, (GLfloat) - 0.600000, (GLfloat) 0.500000,
+       (GLfloat) - 0.097545, (GLfloat) - 0.600000, (GLfloat) 0.490393,
+       (GLfloat) - 0.191342, (GLfloat) - 0.600000, (GLfloat) 0.461940,
+       (GLfloat) - 0.277785, (GLfloat) - 0.600000, (GLfloat) 0.415735,
+       (GLfloat) - 0.353553, (GLfloat) - 0.600000, (GLfloat) 0.353553,
+       (GLfloat) - 0.415735, (GLfloat) - 0.600000, (GLfloat) 0.277785,
+       (GLfloat) - 0.461940, (GLfloat) - 0.600000, (GLfloat) 0.191342,
+       (GLfloat) - 0.490393, (GLfloat) - 0.600000, (GLfloat) 0.097545,
+       (GLfloat) - 0.500000, (GLfloat) - 0.600000, (GLfloat) 0.000000,
+       (GLfloat) - 0.490393, (GLfloat) - 0.600000, (GLfloat) - 0.097545,
+       (GLfloat) - 0.461940, (GLfloat) - 0.600000, (GLfloat) - 0.191342,
+       (GLfloat) - 0.415735, (GLfloat) - 0.600000, (GLfloat) - 0.277785,
+       (GLfloat) - 0.353553, (GLfloat) - 0.600000, (GLfloat) - 0.353553,
+       (GLfloat) - 0.277785, (GLfloat) - 0.600000, (GLfloat) - 0.415735,
+       (GLfloat) - 0.191342, (GLfloat) - 0.600000, (GLfloat) - 0.461940,
+       (GLfloat) - 0.097545, (GLfloat) - 0.600000, (GLfloat) - 0.490393,
+       (GLfloat) 0.000000, (GLfloat) 0.500000, (GLfloat) - 0.520000,
+       (GLfloat) 0.097545, (GLfloat) 0.490393, (GLfloat) - 0.520000,
+       (GLfloat) 0.191342, (GLfloat) 0.461940, (GLfloat) - 0.520000,
+       (GLfloat) 0.277785, (GLfloat) 0.415735, (GLfloat) - 0.520000,
+       (GLfloat) 0.353553, (GLfloat) 0.353553, (GLfloat) - 0.520000,
+       (GLfloat) 0.415735, (GLfloat) 0.277785, (GLfloat) - 0.520000,
+       (GLfloat) 0.461940, (GLfloat) 0.191342, (GLfloat) - 0.520000,
+       (GLfloat) 0.490393, (GLfloat) 0.097545, (GLfloat) - 0.520000,
+       (GLfloat) 0.500000, (GLfloat) 0.000000, (GLfloat) - 0.520000,
+       (GLfloat) 0.490393, (GLfloat) - 0.097545, (GLfloat) - 0.520000,
+       (GLfloat) 0.461940, (GLfloat) - 0.191342, (GLfloat) - 0.520000,
+       (GLfloat) 0.415735, (GLfloat) - 0.277785, (GLfloat) - 0.520000,
+       (GLfloat) 0.353553, (GLfloat) - 0.353553, (GLfloat) - 0.520000,
+       (GLfloat) 0.277785, (GLfloat) - 0.415735, (GLfloat) - 0.520000,
+       (GLfloat) 0.191342, (GLfloat) - 0.461940, (GLfloat) - 0.520000,
+       (GLfloat) 0.097545, (GLfloat) - 0.490393, (GLfloat) - 0.520000,
+       (GLfloat) 0.000000, (GLfloat) - 0.500000, (GLfloat) - 0.520000,
+       (GLfloat) - 0.097545, (GLfloat) - 0.490393, (GLfloat) - 0.520000,
+       (GLfloat) - 0.191342, (GLfloat) - 0.461940, (GLfloat) - 0.520000,
+       (GLfloat) - 0.277785, (GLfloat) - 0.415735, (GLfloat) - 0.520000,
+       (GLfloat) - 0.353553, (GLfloat) - 0.353553, (GLfloat) - 0.520000,
+       (GLfloat) - 0.415735, (GLfloat) - 0.277785, (GLfloat) - 0.520000,
+       (GLfloat) - 0.461940, (GLfloat) - 0.191342, (GLfloat) - 0.520000,
+       (GLfloat) - 0.490393, (GLfloat) - 0.097545, (GLfloat) - 0.520000,
+       (GLfloat) - 0.500000, (GLfloat) - 0.000000, (GLfloat) - 0.520000,
+       (GLfloat) - 0.490393, (GLfloat) 0.097545, (GLfloat) - 0.520000,
+       (GLfloat) - 0.461940, (GLfloat) 0.191342, (GLfloat) - 0.520000,
+       (GLfloat) - 0.415735, (GLfloat) 0.277785, (GLfloat) - 0.520000,
+       (GLfloat) - 0.353553, (GLfloat) 0.353553, (GLfloat) - 0.520000,
+       (GLfloat) - 0.277785, (GLfloat) 0.415735, (GLfloat) - 0.520000,
+       (GLfloat) - 0.191342, (GLfloat) 0.461940, (GLfloat) - 0.520000,
+       (GLfloat) - 0.097545, (GLfloat) 0.490393, (GLfloat) - 0.520000,
+       (GLfloat) 0.000000, (GLfloat) 0.500000, (GLfloat) - 0.600000,
+       (GLfloat) 0.097545, (GLfloat) 0.490393, (GLfloat) - 0.600000,
+       (GLfloat) 0.191342, (GLfloat) 0.461940, (GLfloat) - 0.600000,
+       (GLfloat) 0.277785, (GLfloat) 0.415735, (GLfloat) - 0.600000,
+       (GLfloat) 0.353553, (GLfloat) 0.353553, (GLfloat) - 0.600000,
+       (GLfloat) 0.415735, (GLfloat) 0.277785, (GLfloat) - 0.600000,
+       (GLfloat) 0.461940, (GLfloat) 0.191342, (GLfloat) - 0.600000,
+       (GLfloat) 0.490393, (GLfloat) 0.097545, (GLfloat) - 0.600000,
+       (GLfloat) 0.500000, (GLfloat) 0.000000, (GLfloat) - 0.600000,
+       (GLfloat) 0.490393, (GLfloat) - 0.097545, (GLfloat) - 0.600000,
+       (GLfloat) 0.461940, (GLfloat) - 0.191342, (GLfloat) - 0.600000,
+       (GLfloat) 0.415735, (GLfloat) - 0.277785, (GLfloat) - 0.600000,
+       (GLfloat) 0.353553, (GLfloat) - 0.353553, (GLfloat) - 0.600000,
+       (GLfloat) 0.277785, (GLfloat) - 0.415735, (GLfloat) - 0.600000,
+       (GLfloat) 0.191342, (GLfloat) - 0.461940, (GLfloat) - 0.600000,
+       (GLfloat) 0.097545, (GLfloat) - 0.490393, (GLfloat) - 0.600000,
+       (GLfloat) 0.000000, (GLfloat) - 0.500000, (GLfloat) - 0.600000,
+       (GLfloat) - 0.097545, (GLfloat) - 0.490393, (GLfloat) - 0.600000,
+       (GLfloat) - 0.191342, (GLfloat) - 0.461940, (GLfloat) - 0.600000,
+       (GLfloat) - 0.277785, (GLfloat) - 0.415735, (GLfloat) - 0.600000,
+       (GLfloat) - 0.353553, (GLfloat) - 0.353553, (GLfloat) - 0.600000,
+       (GLfloat) - 0.415735, (GLfloat) - 0.277785, (GLfloat) - 0.600000,
+       (GLfloat) - 0.461940, (GLfloat) - 0.191342, (GLfloat) - 0.600000,
+       (GLfloat) - 0.490393, (GLfloat) - 0.097545, (GLfloat) - 0.600000,
+       (GLfloat) - 0.500000, (GLfloat) - 0.000000, (GLfloat) - 0.600000,
+       (GLfloat) - 0.490393, (GLfloat) 0.097545, (GLfloat) - 0.600000,
+       (GLfloat) - 0.461940, (GLfloat) 0.191342, (GLfloat) - 0.600000,
+       (GLfloat) - 0.415735, (GLfloat) 0.277785, (GLfloat) - 0.600000,
+       (GLfloat) - 0.353553, (GLfloat) 0.353553, (GLfloat) - 0.600000,
+       (GLfloat) - 0.277785, (GLfloat) 0.415735, (GLfloat) - 0.600000,
+       (GLfloat) - 0.191342, (GLfloat) 0.461940, (GLfloat) - 0.600000,
+       (GLfloat) - 0.097545, (GLfloat) 0.490393, (GLfloat) - 0.600000,
+};
+
+static GLfloat ElbowCoins_normals[] =
+{
+       (GLfloat) - 0.000000, (GLfloat) 0.000000, (GLfloat) 1.000000,
+       (GLfloat) 0.098017, (GLfloat) 0.995185, (GLfloat) 0.000000,
+       (GLfloat) 0.290285, (GLfloat) 0.956940, (GLfloat) 0.000000,
+       (GLfloat) 0.471397, (GLfloat) 0.881921, (GLfloat) 0.000000,
+       (GLfloat) 0.634393, (GLfloat) 0.773010, (GLfloat) 0.000000,
+       (GLfloat) 0.773010, (GLfloat) 0.634393, (GLfloat) 0.000000,
+       (GLfloat) 0.881921, (GLfloat) 0.471397, (GLfloat) 0.000000,
+       (GLfloat) 0.956940, (GLfloat) 0.290285, (GLfloat) 0.000000,
+       (GLfloat) 0.995185, (GLfloat) 0.098017, (GLfloat) 0.000000,
+       (GLfloat) 0.995185, (GLfloat) - 0.098017, (GLfloat) - 0.000000,
+       (GLfloat) 0.956940, (GLfloat) - 0.290285, (GLfloat) - 0.000000,
+       (GLfloat) 0.881921, (GLfloat) - 0.471397, (GLfloat) - 0.000000,
+       (GLfloat) 0.773010, (GLfloat) - 0.634393, (GLfloat) - 0.000000,
+       (GLfloat) 0.634393, (GLfloat) - 0.773010, (GLfloat) - 0.000000,
+       (GLfloat) 0.471397, (GLfloat) - 0.881921, (GLfloat) - 0.000000,
+       (GLfloat) 0.290285, (GLfloat) - 0.956940, (GLfloat) - 0.000000,
+       (GLfloat) 0.098017, (GLfloat) - 0.995185, (GLfloat) - 0.000000,
+       (GLfloat) - 0.098017, (GLfloat) - 0.995185, (GLfloat) - 0.000000,
+       (GLfloat) - 0.290285, (GLfloat) - 0.956940, (GLfloat) - 0.000000,
+       (GLfloat) - 0.471397, (GLfloat) - 0.881921, (GLfloat) - 0.000000,
+       (GLfloat) - 0.634393, (GLfloat) - 0.773010, (GLfloat) - 0.000000,
+       (GLfloat) - 0.773010, (GLfloat) - 0.634393, (GLfloat) - 0.000000,
+       (GLfloat) - 0.881921, (GLfloat) - 0.471397, (GLfloat) - 0.000000,
+       (GLfloat) - 0.956940, (GLfloat) - 0.290285, (GLfloat) - 0.000000,
+       (GLfloat) - 0.995185, (GLfloat) - 0.098017, (GLfloat) - 0.000000,
+       (GLfloat) - 0.995185, (GLfloat) 0.098017, (GLfloat) - 0.000000,
+       (GLfloat) - 0.956940, (GLfloat) 0.290285, (GLfloat) - 0.000000,
+       (GLfloat) - 0.881921, (GLfloat) 0.471397, (GLfloat) - 0.000000,
+       (GLfloat) - 0.773010, (GLfloat) 0.634393, (GLfloat) - 0.000000,
+       (GLfloat) - 0.634393, (GLfloat) 0.773010, (GLfloat) - 0.000000,
+       (GLfloat) - 0.471397, (GLfloat) 0.881921, (GLfloat) - 0.000000,
+       (GLfloat) - 0.290285, (GLfloat) 0.956940, (GLfloat) - 0.000000,
+       (GLfloat) - 0.098017, (GLfloat) 0.995185, (GLfloat) - 0.000000,
+       (GLfloat) - 0.000000, (GLfloat) 0.000000, (GLfloat) - 1.000000,
+       (GLfloat) - 0.000000, (GLfloat) 1.000000, (GLfloat) - 0.000000,
+       (GLfloat) 0.098017, (GLfloat) 0.000000, (GLfloat) - 0.995185,
+       (GLfloat) 0.290285, (GLfloat) 0.000000, (GLfloat) - 0.956940,
+       (GLfloat) 0.471397, (GLfloat) 0.000000, (GLfloat) - 0.881921,
+       (GLfloat) 0.634393, (GLfloat) 0.000000, (GLfloat) - 0.773010,
+       (GLfloat) 0.773010, (GLfloat) 0.000000, (GLfloat) - 0.634393,
+       (GLfloat) 0.881921, (GLfloat) 0.000000, (GLfloat) - 0.471397,
+       (GLfloat) 0.956940, (GLfloat) 0.000000, (GLfloat) - 0.290285,
+       (GLfloat) 0.995185, (GLfloat) 0.000000, (GLfloat) - 0.098017,
+       (GLfloat) 0.995185, (GLfloat) 0.000000, (GLfloat) 0.098017,
+       (GLfloat) 0.956940, (GLfloat) 0.000000, (GLfloat) 0.290285,
+       (GLfloat) 0.881921, (GLfloat) 0.000000, (GLfloat) 0.471397,
+       (GLfloat) 0.773010, (GLfloat) 0.000000, (GLfloat) 0.634393,
+       (GLfloat) 0.634393, (GLfloat) 0.000000, (GLfloat) 0.773010,
+       (GLfloat) 0.471397, (GLfloat) 0.000000, (GLfloat) 0.881921,
+       (GLfloat) 0.290285, (GLfloat) 0.000000, (GLfloat) 0.956940,
+       (GLfloat) 0.098017, (GLfloat) 0.000000, (GLfloat) 0.995185,
+       (GLfloat) - 0.098017, (GLfloat) 0.000000, (GLfloat) 0.995185,
+       (GLfloat) - 0.290285, (GLfloat) 0.000000, (GLfloat) 0.956940,
+       (GLfloat) - 0.471397, (GLfloat) 0.000000, (GLfloat) 0.881921,
+       (GLfloat) - 0.634393, (GLfloat) 0.000000, (GLfloat) 0.773010,
+       (GLfloat) - 0.773010, (GLfloat) 0.000000, (GLfloat) 0.634393,
+       (GLfloat) - 0.881921, (GLfloat) 0.000000, (GLfloat) 0.471397,
+       (GLfloat) - 0.956940, (GLfloat) 0.000000, (GLfloat) 0.290285,
+       (GLfloat) - 0.995185, (GLfloat) - 0.000000, (GLfloat) 0.098017,
+       (GLfloat) - 0.995185, (GLfloat) - 0.000000, (GLfloat) - 0.098017,
+       (GLfloat) - 0.956940, (GLfloat) - 0.000000, (GLfloat) - 0.290285,
+       (GLfloat) - 0.881921, (GLfloat) - 0.000000, (GLfloat) - 0.471397,
+       (GLfloat) - 0.773010, (GLfloat) - 0.000000, (GLfloat) - 0.634393,
+       (GLfloat) - 0.634393, (GLfloat) - 0.000000, (GLfloat) - 0.773010,
+       (GLfloat) - 0.471397, (GLfloat) - 0.000000, (GLfloat) - 0.881921,
+       (GLfloat) - 0.290285, (GLfloat) - 0.000000, (GLfloat) - 0.956940,
+       (GLfloat) - 0.098017, (GLfloat) - 0.000000, (GLfloat) - 0.995185,
+       (GLfloat) - 0.000000, (GLfloat) - 1.000000, (GLfloat) - 0.000000,
+};
+
+static unsigned short int ElbowCoins_POLS[] =
+{
+       32, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82,
+ 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 1, 4, 96, 97, 65, 64, 1,
+   4, 97, 98, 66, 65, 1, 4, 98, 99, 67, 66, 1, 4, 99, 100, 68, 67, 1, 4, 100,
+       101, 69, 68, 1, 4, 101, 102, 70, 69, 1, 4, 102, 103, 71, 70, 1, 4, 103, 104, 72,
+71, 1, 4, 104, 105, 73, 72, 1, 4, 105, 106, 74, 73, 1, 4, 106, 107, 75, 74, 1,
+       4, 107, 108, 76, 75, 1, 4, 108, 109, 77, 76, 1, 4, 109, 110, 78, 77, 1, 4, 110,
+       111, 79, 78, 1, 4, 111, 112, 80, 79, 1, 4, 112, 113, 81, 80, 1, 4, 113, 114, 82,
+81, 1, 4, 114, 115, 83, 82, 1, 4, 115, 116, 84, 83, 1, 4, 116, 117, 85, 84, 1,
+       4, 117, 118, 86, 85, 1, 4, 118, 119, 87, 86, 1, 4, 119, 120, 88, 87, 1, 4, 120,
+       121, 89, 88, 1, 4, 121, 122, 90, 89, 1, 4, 122, 123, 91, 90, 1, 4, 123, 124, 92,
+91, 1, 4, 124, 125, 93, 92, 1, 4, 125, 126, 94, 93, 1, 4, 126, 127, 95, 94, 1,
+       4, 127, 96, 64, 95, 1, 32, 96, 127, 126, 125, 124, 123, 122, 121, 120, 119, 118, 117, 116,
+       115, 114, 113, 112, 111, 110, 109, 108, 107, 106, 105, 104, 103, 102, 101, 100, 99, 98, 97, 1,
+       32, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18,
+   19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 1, 4, 32, 33, 1, 0, 1,
+       4, 33, 34, 2, 1, 1, 4, 34, 35, 3, 2, 1, 4, 35, 36, 4, 3, 1, 4, 36,
+       37, 5, 4, 1, 4, 37, 38, 6, 5, 1, 4, 38, 39, 7, 6, 1, 4, 39, 40, 8,
+       7, 1, 4, 40, 41, 9, 8, 1, 4, 41, 42, 10, 9, 1, 4, 42, 43, 11, 10, 1,
+     4, 43, 44, 12, 11, 1, 4, 44, 45, 13, 12, 1, 4, 45, 46, 14, 13, 1, 4, 46,
+    47, 15, 14, 1, 4, 47, 48, 16, 15, 1, 4, 48, 49, 17, 16, 1, 4, 49, 50, 18,
+     17, 1, 4, 50, 51, 19, 18, 1, 4, 51, 52, 20, 19, 1, 4, 52, 53, 21, 20, 1,
+     4, 53, 54, 22, 21, 1, 4, 54, 55, 23, 22, 1, 4, 55, 56, 24, 23, 1, 4, 56,
+    57, 25, 24, 1, 4, 57, 58, 26, 25, 1, 4, 58, 59, 27, 26, 1, 4, 59, 60, 28,
+     27, 1, 4, 60, 61, 29, 28, 1, 4, 61, 62, 30, 29, 1, 4, 62, 63, 31, 30, 1,
+ 4, 63, 32, 0, 31, 1, 32, 32, 63, 62, 61, 60, 59, 58, 57, 56, 55, 54, 53, 52,
+51, 50, 49, 48, 47, 46, 45, 44, 43, 42, 41, 40, 39, 38, 37, 36, 35, 34, 33, 1,
+       0
+};
+
+struct lwo  LWO_ElbowCoins =
+{
+       128,                    /* number of points */
+       ElbowCoins_PNTS, ElbowCoins_normals, ElbowCoins_POLS, 0L
+};
+
+#endif /* USE_GL */
+
+/* End of pipeobjs.c */
diff --git a/hacks/glx/pipes.c b/hacks/glx/pipes.c
new file mode 100644 (file)
index 0000000..926b7e3
--- /dev/null
@@ -0,0 +1,1035 @@
+/* -*- Mode: C; tab-width: 4 -*- */
+/* pipes --- 3D selfbuiding pipe system */
+
+#if !defined( lint ) && !defined( SABER )
+static const char sccsid[] = "@(#)pipes.c      4.07 97/11/24 xlockmore";
+
+#endif
+
+/*-
+ * 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.
+ *
+ * This file is provided AS IS with no warranties of any kind.  The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof.  In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * This program was inspired on a WindowsNT(R)'s screen saver. It was written 
+ * from scratch and it was not based on any other source code.
+ *
+ * ==========================================================================
+ * The routine myElbow is derivated from the doughnut routine from the MesaGL
+ * library (more especifically the Mesaaux library) written by Brian Paul.
+ * ==========================================================================
+ *
+ * Thanks goes to Brian Paul for making it possible and inexpensive to use
+ * OpenGL at home.
+ *
+ * Since I'm not a native English speaker, my apologies for any grammatical
+ * mistake.
+ *
+ * My e-mail address is
+ * m-vianna@usa.net
+ * Marcelo F. Vianna (Apr-09-1997)
+ *
+ * Revision History:
+ * 29-Apr-97: Factory equipment by Ed Mackey.  Productive day today, eh?
+ * 29-Apr-97: Less tight turns Jeff Epler <jepler@inetnebr.com>
+ * 29-Apr-97: Efficiency speed-ups by Marcelo F. Vianna
+ */
+
+/*-
+ * due to a Bug/feature in VMS X11/Intrinsic.h has to be placed before xlock.
+ * otherwise caddr_t is not defined correctly
+ */
+
+#include <X11/Intrinsic.h>
+
+#ifdef STANDALONE
+# define PROGCLASS                                     "Pipes"
+# define HACK_INIT                                     init_pipes
+# define HACK_DRAW                                     draw_pipes
+# define pipes_opts                                    xlockmore_opts
+# define DEFAULTS      "*delay:                100     \n"                     \
+                                       "*count:                2       \n"                     \
+                                       "*cycles:               5       \n"                     \
+                                       "*size:                 500     \n"                     \
+                                       "*fisheye:              True    \n"                     \
+                                       "*tightturns:   False   \n"                     \
+                                       "*rotatepipes:  True    \n"
+# include "xlockmore.h"                                /* from the xscreensaver distribution */
+#else  /* !STANDALONE */
+# include "xlock.h"                                    /* from the xlockmore distribution */
+#endif /* !STANDALONE */
+
+#ifdef USE_GL
+
+#include <GL/glu.h>
+#include "buildlwo.h"
+
+#define DEF_FACTORY     "2"
+#define DEF_FISHEYE     "True"
+#define DEF_TIGHTTURNS  "False"
+#define DEF_ROTATEPIPES "True"
+#define NofSysTypes     3
+
+static int  factory;
+static Bool fisheye, tightturns, rotatepipes;
+
+static XrmOptionDescRec opts[] =
+{
+       {"-factory", ".pipes.factory", XrmoptionSepArg, (caddr_t) NULL},
+       {"-fisheye", ".pipes.fisheye", XrmoptionNoArg, (caddr_t) "on"},
+       {"+fisheye", ".pipes.fisheye", XrmoptionNoArg, (caddr_t) "off"},
+       {"-tightturns", ".pipes.tightturns", XrmoptionNoArg, (caddr_t) "on"},
+       {"+tightturns", ".pipes.tightturns", XrmoptionNoArg, (caddr_t) "off"},
+      {"-rotatepipes", ".pipes.rotatepipes", XrmoptionNoArg, (caddr_t) "on"},
+      {"+rotatepipes", ".pipes.rotatepipes", XrmoptionNoArg, (caddr_t) "off"}
+};
+static argtype vars[] =
+{
+       {(caddr_t *) & factory, "factory", "Factory", DEF_FACTORY, t_Int},
+       {(caddr_t *) & fisheye, "fisheye", "Fisheye", DEF_FISHEYE, t_Bool},
+       {(caddr_t *) & tightturns, "tightturns", "Tightturns", DEF_TIGHTTURNS, t_Bool},
+       {(caddr_t *) & rotatepipes, "rotatepipes", "Rotatepipes", DEF_ROTATEPIPES, t_Bool}
+};
+static OptionStruct desc[] =
+{
+       {"-factory num", "how much extra equipment in pipes (0 for none)"},
+       {"-/+fisheye", "turn on/off zoomed-in view of pipes"},
+       {"-/+tightturns", "turn on/off tight turns"},
+       {"-/+rotatepipes", "turn on/off pipe system rotation per screenful"}
+};
+
+ModeSpecOpt pipes_opts =
+{sizeof opts / sizeof opts[0], opts, sizeof vars / sizeof vars[0], vars, desc};
+
+#ifdef USE_MODULES
+ModStruct   pipes_description =
+{"pipes", "init_pipes", "draw_pipes", "release_pipes",
+#if defined( MESA ) && defined( SLOW )
+ "draw_pipes",
+#else
+ "change_pipes",
+#endif
+ "change_pipes", NULL, &pipes_opts,
+ 1000, 2, 5, 500, 4, 1.0, "",
+ "Shows a selfbuilding pipe system", 0, NULL};
+
+#endif
+
+#define Scale4Window               0.1
+#define Scale4Iconic               0.07
+
+#define one_third                  0.3333333333333333333
+
+#define dirNone -1
+#define dirUP 0
+#define dirDOWN 1
+#define dirLEFT 2
+#define dirRIGHT 3
+#define dirNEAR 4
+#define dirFAR 5
+
+#define HCELLS 33
+#define VCELLS 25
+#define DEFINEDCOLORS 7
+#define elbowradius 0.5
+
+/*************************************************************************/
+
+typedef struct {
+#if defined( MESA ) && defined( SLOW )
+       int         flip;
+#endif
+       GLint       WindH, WindW;
+       int         Cells[HCELLS][VCELLS][HCELLS];
+       int         usedcolors[DEFINEDCOLORS];
+       int         directions[6];
+       int         ndirections;
+       int         nowdir, olddir;
+       int         system_number;
+       int         counter;
+       int         PX, PY, PZ;
+       int         number_of_systems;
+       int         system_type;
+       int         system_length;
+       int         turncounter;
+       Window      window;
+       float      *system_color;
+       GLfloat     initial_rotation;
+       GLuint      valve, bolts, betweenbolts, elbowbolts, elbowcoins;
+       GLuint      guagehead, guageface, guagedial, guageconnector;
+       GLXContext *glx_context;
+} pipesstruct;
+
+extern struct lwo LWO_BigValve, LWO_PipeBetweenBolts, LWO_Bolts3D;
+extern struct lwo LWO_GuageHead, LWO_GuageFace, LWO_GuageDial, LWO_GuageConnector;
+extern struct lwo LWO_ElbowBolts, LWO_ElbowCoins;
+
+static float front_shininess[] =
+{60.0};
+static float front_specular[] =
+{0.7, 0.7, 0.7, 1.0};
+static float ambient0[] =
+{0.4, 0.4, 0.4, 1.0};
+static float diffuse0[] =
+{1.0, 1.0, 1.0, 1.0};
+static float ambient1[] =
+{0.2, 0.2, 0.2, 1.0};
+static float diffuse1[] =
+{0.5, 0.5, 0.5, 1.0};
+static float position0[] =
+{1.0, 1.0, 1.0, 0.0};
+static float position1[] =
+{-1.0, -1.0, 1.0, 0.0};
+static float lmodel_ambient[] =
+{0.5, 0.5, 0.5, 1.0};
+static float lmodel_twoside[] =
+{GL_TRUE};
+
+static float MaterialRed[] =
+{0.7, 0.0, 0.0, 1.0};
+static float MaterialGreen[] =
+{0.1, 0.5, 0.2, 1.0};
+static float MaterialBlue[] =
+{0.0, 0.0, 0.7, 1.0};
+static float MaterialCyan[] =
+{0.2, 0.5, 0.7, 1.0};
+static float MaterialYellow[] =
+{0.7, 0.7, 0.0, 1.0};
+static float MaterialMagenta[] =
+{0.6, 0.2, 0.5, 1.0};
+static float MaterialWhite[] =
+{0.7, 0.7, 0.7, 1.0};
+static float MaterialGray[] =
+{0.2, 0.2, 0.2, 1.0};
+
+static pipesstruct *pipes = NULL;
+
+
+static void
+MakeTube(int direction)
+{
+       float       an;
+       float       SINan_3, COSan_3;
+
+       /*dirUP    = 00000000 */
+       /*dirDOWN  = 00000001 */
+       /*dirLEFT  = 00000010 */
+       /*dirRIGHT = 00000011 */
+       /*dirNEAR  = 00000100 */
+       /*dirFAR   = 00000101 */
+
+       if (!(direction & 4)) {
+               glRotatef(90.0, (direction & 2) ? 0.0 : 1.0,
+                         (direction & 2) ? 1.0 : 0.0, 0.0);
+       }
+       glBegin(GL_QUAD_STRIP);
+       for (an = 0.0; an <= 2.0 * M_PI; an += M_PI / 12.0) {
+               glNormal3f((COSan_3 = cos(an) / 3.0), (SINan_3 = sin(an) / 3.0), 0.0);
+               glVertex3f(COSan_3, SINan_3, one_third);
+               glVertex3f(COSan_3, SINan_3, -one_third);
+       }
+       glEnd();
+}
+
+static void
+mySphere(float radius)
+{
+       GLUquadricObj *quadObj;
+
+       quadObj = gluNewQuadric();
+       gluQuadricDrawStyle(quadObj, (GLenum) GLU_FILL);
+       gluSphere(quadObj, radius, 16, 16);
+       gluDeleteQuadric(quadObj);
+}
+
+static void
+myElbow(ModeInfo * mi, int bolted)
+{
+#define nsides 25
+#define rings 25
+#define r one_third
+#define R one_third
+
+       pipesstruct *pp = &pipes[MI_SCREEN(mi)];
+
+       int         i, j;
+       GLfloat     p0[3], p1[3], p2[3], p3[3];
+       GLfloat     n0[3], n1[3], n2[3], n3[3];
+       GLfloat     COSphi, COSphi1, COStheta, COStheta1;
+       GLfloat     _SINtheta, _SINtheta1;
+
+       for (i = 0; i <= rings / 4; i++) {
+               GLfloat     theta, theta1;
+
+               theta = (GLfloat) i *2.0 * M_PI / rings;
+
+               theta1 = (GLfloat) (i + 1) * 2.0 * M_PI / rings;
+               for (j = 0; j < nsides; j++) {
+                       GLfloat     phi, phi1;
+
+                       phi = (GLfloat) j *2.0 * M_PI / nsides;
+
+                       phi1 = (GLfloat) (j + 1) * 2.0 * M_PI / nsides;
+
+                       p0[0] = (COStheta = cos(theta)) * (R + r * (COSphi = cos(phi)));
+                       p0[1] = (_SINtheta = -sin(theta)) * (R + r * COSphi);
+
+                       p1[0] = (COStheta1 = cos(theta1)) * (R + r * COSphi);
+                       p1[1] = (_SINtheta1 = -sin(theta1)) * (R + r * COSphi);
+
+                       p2[0] = COStheta1 * (R + r * (COSphi1 = cos(phi1)));
+                       p2[1] = _SINtheta1 * (R + r * COSphi1);
+
+                       p3[0] = COStheta * (R + r * COSphi1);
+                       p3[1] = _SINtheta * (R + r * COSphi1);
+
+                       n0[0] = COStheta * COSphi;
+                       n0[1] = _SINtheta * COSphi;
+
+                       n1[0] = COStheta1 * COSphi;
+                       n1[1] = _SINtheta1 * COSphi;
+
+                       n2[0] = COStheta1 * COSphi1;
+                       n2[1] = _SINtheta1 * COSphi1;
+
+                       n3[0] = COStheta * COSphi1;
+                       n3[1] = _SINtheta * COSphi1;
+
+                       p0[2] = p1[2] = r * (n0[2] = n1[2] = sin(phi));
+                       p2[2] = p3[2] = r * (n2[2] = n3[2] = sin(phi1));
+
+                       glBegin(GL_QUADS);
+                       glNormal3fv(n3);
+                       glVertex3fv(p3);
+                       glNormal3fv(n2);
+                       glVertex3fv(p2);
+                       glNormal3fv(n1);
+                       glVertex3fv(p1);
+                       glNormal3fv(n0);
+                       glVertex3fv(p0);
+                       glEnd();
+               }
+       }
+
+       if (factory > 0 && bolted) {
+               /* Bolt the elbow onto the pipe system */
+               glFrontFace(GL_CW);
+               glPushMatrix();
+               glRotatef(90.0, 0.0, 0.0, -1.0);
+               glRotatef(90.0, 0.0, 1.0, 0.0);
+               glTranslatef(0.0, one_third, one_third);
+               glCallList(pp->elbowcoins);
+               glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialGray);
+               glCallList(pp->elbowbolts);
+               glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, pp->system_color);
+               glPopMatrix();
+               glFrontFace(GL_CCW);
+       }
+#undef r
+#undef R
+#undef nsides
+#undef rings
+}
+
+static void
+FindNeighbors(ModeInfo * mi)
+{
+       pipesstruct *pp = &pipes[MI_SCREEN(mi)];
+
+       pp->ndirections = 0;
+       pp->directions[dirUP] = (!pp->Cells[pp->PX][pp->PY + 1][pp->PZ]) ? 1 : 0;
+       pp->ndirections += pp->directions[dirUP];
+       pp->directions[dirDOWN] = (!pp->Cells[pp->PX][pp->PY - 1][pp->PZ]) ? 1 : 0;
+       pp->ndirections += pp->directions[dirDOWN];
+       pp->directions[dirLEFT] = (!pp->Cells[pp->PX - 1][pp->PY][pp->PZ]) ? 1 : 0;
+       pp->ndirections += pp->directions[dirLEFT];
+       pp->directions[dirRIGHT] = (!pp->Cells[pp->PX + 1][pp->PY][pp->PZ]) ? 1 : 0;
+       pp->ndirections += pp->directions[dirRIGHT];
+       pp->directions[dirFAR] = (!pp->Cells[pp->PX][pp->PY][pp->PZ - 1]) ? 1 : 0;
+       pp->ndirections += pp->directions[dirFAR];
+       pp->directions[dirNEAR] = (!pp->Cells[pp->PX][pp->PY][pp->PZ + 1]) ? 1 : 0;
+       pp->ndirections += pp->directions[dirNEAR];
+}
+
+static int
+SelectNeighbor(ModeInfo * mi)
+{
+       pipesstruct *pp = &pipes[MI_SCREEN(mi)];
+       int         dirlist[6];
+       int         i, j;
+
+       for (i = 0, j = 0; i < 6; i++) {
+               if (pp->directions[i]) {
+                       dirlist[j] = i;
+                       j++;
+               }
+       }
+
+       return dirlist[NRAND(pp->ndirections)];
+}
+
+static void
+MakeValve(ModeInfo * mi, int newdir)
+{
+       pipesstruct *pp = &pipes[MI_SCREEN(mi)];
+
+       /* There is a glPopMatrix() right after this subroutine returns. */
+       switch (newdir) {
+               case dirUP:
+               case dirDOWN:
+                       glRotatef(90.0, 1.0, 0.0, 0.0);
+                       glRotatef(NRAND(3) * 90.0, 0.0, 0.0, 1.0);
+                       break;
+               case dirLEFT:
+               case dirRIGHT:
+                       glRotatef(90.0, 0.0, -1.0, 0.0);
+                       glRotatef((NRAND(3) * 90.0) - 90.0, 0.0, 0.0, 1.0);
+                       break;
+               case dirNEAR:
+               case dirFAR:
+                       glRotatef(NRAND(4) * 90.0, 0.0, 0.0, 1.0);
+                       break;
+       }
+       glFrontFace(GL_CW);
+       glCallList(pp->betweenbolts);
+       glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialGray);
+       glCallList(pp->bolts);
+       if (!MI_IS_MONO(mi)) {
+               if (pp->system_color == MaterialRed) {
+                       glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, NRAND(2) ? MaterialYellow : MaterialBlue);
+               } else if (pp->system_color == MaterialBlue) {
+                       glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, NRAND(2) ? MaterialRed : MaterialYellow);
+               } else if (pp->system_color == MaterialYellow) {
+                       glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, NRAND(2) ? MaterialBlue : MaterialRed);
+               } else {
+                       switch ((NRAND(3))) {
+                               case 0:
+                                       glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialRed);
+                                       break;
+                               case 1:
+                                       glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialBlue);
+                                       break;
+                               case 2:
+                                       glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialYellow);
+                       }
+               }
+       }
+       glRotatef((GLfloat) (NRAND(90)), 1.0, 0.0, 0.0);
+       glCallList(pp->valve);
+       glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, pp->system_color);
+       glFrontFace(GL_CCW);
+}
+
+static int
+MakeGuage(ModeInfo * mi, int newdir)
+{
+       pipesstruct *pp = &pipes[MI_SCREEN(mi)];
+
+       /* Can't have a guage on a vertical pipe. */
+       if ((newdir == dirUP) || (newdir == dirDOWN))
+               return (0);
+
+       /* Is there space above this pipe for a guage? */
+       if (!pp->directions[dirUP])
+               return (0);
+
+       /* Yes!  Mark the space as used. */
+       pp->Cells[pp->PX][pp->PY + 1][pp->PZ] = 1;
+
+       glFrontFace(GL_CW);
+       glPushMatrix();
+       if ((newdir == dirLEFT) || (newdir == dirRIGHT))
+               glRotatef(90.0, 0.0, 1.0, 0.0);
+       glCallList(pp->betweenbolts);
+       glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialGray);
+       glCallList(pp->bolts);
+       glPopMatrix();
+
+       glCallList(pp->guageconnector);
+       glPushMatrix();
+       glTranslatef(0.0, 1.33333, 0.0);
+       /* Do not change the above to 1 + ONE_THIRD, because */
+       /* the object really is centered on 1.3333300000. */
+       glRotatef(NRAND(270) + 45.0, 0.0, 0.0, -1.0);
+       /* Random rotation for the dial.  I love it. */
+       glCallList(pp->guagedial);
+       glPopMatrix();
+
+       glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, pp->system_color);
+       glCallList(pp->guagehead);
+
+       /* GuageFace is drawn last, in case of low-res depth buffers. */
+       glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialWhite);
+       glCallList(pp->guageface);
+
+       glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, pp->system_color);
+       glFrontFace(GL_CCW);
+
+       return (1);
+}
+
+static void
+MakeShape(ModeInfo * mi, int newdir)
+{
+       switch (NRAND(2)) {
+               case 1:
+                       if (!MakeGuage(mi, newdir))
+                               MakeTube(newdir);
+                       break;
+               default:
+                       MakeValve(mi, newdir);
+                       break;
+       }
+}
+
+static void
+reshape(ModeInfo * mi, int width, int height)
+{
+       pipesstruct *pp = &pipes[MI_SCREEN(mi)];
+
+       glViewport(0, 0, pp->WindW = (GLint) width, pp->WindH = (GLint) height);
+       glMatrixMode(GL_PROJECTION);
+       glLoadIdentity();
+       /*glFrustum(-1.0, 1.0, -1.0, 1.0, 5.0, 15.0); */
+       gluPerspective(65.0, (GLfloat) width / (GLfloat) height, 0.1, 20.0);
+       glMatrixMode(GL_MODELVIEW);
+}
+
+static void
+pinit(ModeInfo * mi, int zera)
+{
+       pipesstruct *pp = &pipes[MI_SCREEN(mi)];
+       int         X, Y, Z;
+
+       glClearDepth(1.0);
+       glClearColor(0.0, 0.0, 0.0, 1.0);
+       glColor3f(1.0, 1.0, 1.0);
+
+       glLightfv(GL_LIGHT0, GL_AMBIENT, ambient0);
+       glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse0);
+       glLightfv(GL_LIGHT0, GL_POSITION, position0);
+       glLightfv(GL_LIGHT1, GL_AMBIENT, ambient1);
+       glLightfv(GL_LIGHT1, GL_DIFFUSE, diffuse1);
+       glLightfv(GL_LIGHT1, GL_POSITION, position1);
+       glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient);
+       glLightModelfv(GL_LIGHT_MODEL_TWO_SIDE, lmodel_twoside);
+       glEnable(GL_LIGHTING);
+       glEnable(GL_LIGHT0);
+       glEnable(GL_LIGHT1);
+       glEnable(GL_DEPTH_TEST);
+       glEnable(GL_NORMALIZE);
+       glEnable(GL_CULL_FACE);
+
+       glShadeModel(GL_SMOOTH);
+       glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, front_shininess);
+       glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, front_specular);
+
+       if (zera) {
+               pp->system_number = 1;
+               glDrawBuffer(GL_FRONT_AND_BACK);
+               glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+               (void) memset(pp->Cells, 0, sizeof (pp->Cells));
+               for (X = 0; X < HCELLS; X++) {
+                       for (Y = 0; Y < VCELLS; Y++) {
+                               pp->Cells[X][Y][0] = 1;
+                               pp->Cells[X][Y][HCELLS - 1] = 1;
+                               pp->Cells[0][Y][X] = 1;
+                               pp->Cells[HCELLS - 1][Y][X] = 1;
+                       }
+               }
+               for (X = 0; X < HCELLS; X++) {
+                       for (Z = 0; Z < HCELLS; Z++) {
+                               pp->Cells[X][0][Z] = 1;
+                               pp->Cells[X][VCELLS - 1][Z] = 1;
+                       }
+               }
+               (void) memset(pp->usedcolors, 0, sizeof (pp->usedcolors));
+               if ((pp->initial_rotation += 10.0) > 45.0) {
+                       pp->initial_rotation -= 90.0;
+               }
+       }
+       pp->counter = 0;
+       pp->turncounter = 0;
+
+       if (!MI_IS_MONO(mi)) {
+               int         collist[DEFINEDCOLORS];
+               int         i, j, lower = 1000;
+
+               /* Avoid repeating colors on the same screen unless necessary */
+               for (i = 0; i < DEFINEDCOLORS; i++) {
+                       if (lower > pp->usedcolors[i])
+                               lower = pp->usedcolors[i];
+               }
+               for (i = 0, j = 0; i < DEFINEDCOLORS; i++) {
+                       if (pp->usedcolors[i] == lower) {
+                               collist[j] = i;
+                               j++;
+                       }
+               }
+               i = collist[NRAND(j)];
+               pp->usedcolors[i]++;
+               switch (i) {
+                       case 0:
+                               pp->system_color = MaterialRed;
+                               break;
+                       case 1:
+                               pp->system_color = MaterialGreen;
+                               break;
+                       case 2:
+                               pp->system_color = MaterialBlue;
+                               break;
+                       case 3:
+                               pp->system_color = MaterialCyan;
+                               break;
+                       case 4:
+                               pp->system_color = MaterialYellow;
+                               break;
+                       case 5:
+                               pp->system_color = MaterialMagenta;
+                               break;
+                       case 6:
+                               pp->system_color = MaterialWhite;
+                               break;
+               }
+       } else {
+               pp->system_color = MaterialGray;
+       }
+
+       do {
+               pp->PX = NRAND((HCELLS - 1)) + 1;
+               pp->PY = NRAND((VCELLS - 1)) + 1;
+               pp->PZ = NRAND((HCELLS - 1)) + 1;
+       } while (pp->Cells[pp->PX][pp->PY][pp->PZ] ||
+                (pp->Cells[pp->PX + 1][pp->PY][pp->PZ] && pp->Cells[pp->PX - 1][pp->PY][pp->PZ] &&
+                 pp->Cells[pp->PX][pp->PY + 1][pp->PZ] && pp->Cells[pp->PX][pp->PY - 1][pp->PZ] &&
+                 pp->Cells[pp->PX][pp->PY][pp->PZ + 1] && pp->Cells[pp->PX][pp->PY][pp->PZ - 1]));
+       pp->Cells[pp->PX][pp->PY][pp->PZ] = 1;
+       pp->olddir = dirNone;
+
+       FindNeighbors(mi);
+
+       pp->nowdir = SelectNeighbor(mi);
+}
+
+void
+init_pipes(ModeInfo * mi)
+{
+       int         screen = MI_SCREEN(mi);
+       pipesstruct *pp;
+
+       if (pipes == NULL) {
+               if ((pipes = (pipesstruct *) calloc(MI_NUM_SCREENS(mi),
+                                             sizeof (pipesstruct))) == NULL)
+                       return;
+       }
+       pp = &pipes[screen];
+
+       pp->window = MI_WINDOW(mi);
+       if ((pp->glx_context = init_GL(mi)) != NULL) {
+
+               reshape(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+               if (rotatepipes)
+                 pp->initial_rotation = NRAND(180); /* jwz */
+               else
+                 pp->initial_rotation = -10.0;
+               pinit(mi, 1);
+
+               if (factory > 0) {
+                       pp->valve = BuildLWO(MI_IS_WIREFRAME(mi), &LWO_BigValve);
+                       pp->bolts = BuildLWO(MI_IS_WIREFRAME(mi), &LWO_Bolts3D);
+                       pp->betweenbolts = BuildLWO(MI_IS_WIREFRAME(mi), &LWO_PipeBetweenBolts);
+
+                       pp->elbowbolts = BuildLWO(MI_IS_WIREFRAME(mi), &LWO_ElbowBolts);
+                       pp->elbowcoins = BuildLWO(MI_IS_WIREFRAME(mi), &LWO_ElbowCoins);
+
+                       pp->guagehead = BuildLWO(MI_IS_WIREFRAME(mi), &LWO_GuageHead);
+                       pp->guageface = BuildLWO(MI_IS_WIREFRAME(mi), &LWO_GuageFace);
+                       pp->guagedial = BuildLWO(MI_IS_WIREFRAME(mi), &LWO_GuageDial);
+                       pp->guageconnector = BuildLWO(MI_IS_WIREFRAME(mi), &LWO_GuageConnector);
+               }
+               /* else they are all 0, thanks to calloc(). */
+
+               if (MI_COUNT(mi) < 1 || MI_COUNT(mi) > NofSysTypes + 1) {
+                       pp->system_type = NRAND(NofSysTypes) + 1;
+               } else {
+                       pp->system_type = MI_COUNT(mi);
+               }
+
+               if (MI_CYCLES(mi) > 0 && MI_CYCLES(mi) < 11) {
+                       pp->number_of_systems = MI_CYCLES(mi);
+               } else {
+                       pp->number_of_systems = 5;
+               }
+
+               if (MI_SIZE(mi) < 10) {
+                       pp->system_length = 10;
+               } else if (MI_SIZE(mi) > 1000) {
+                       pp->system_length = 1000;
+               } else {
+                       pp->system_length = MI_SIZE(mi);
+               }
+       } else {
+               MI_CLEARWINDOW(mi);
+       }
+}
+
+void
+draw_pipes(ModeInfo * mi)
+{
+       pipesstruct *pp = &pipes[MI_SCREEN(mi)];
+
+       Display    *display = MI_DISPLAY(mi);
+       Window      window = MI_WINDOW(mi);
+
+       int         newdir;
+       int         OPX, OPY, OPZ;
+
+       if (!pp->glx_context)
+               return;
+
+       glXMakeCurrent(display, window, *(pp->glx_context));
+
+#if defined( MESA ) && defined( SLOW )
+       glDrawBuffer(GL_BACK);
+#else
+       glDrawBuffer(GL_FRONT);
+#endif
+       glPushMatrix();
+
+       glTranslatef(0.0, 0.0, fisheye ? -3.8 : -4.8);
+       if (rotatepipes)
+               glRotatef(pp->initial_rotation, 0.0, 1.0, 0.0);
+
+       if (!MI_IS_ICONIC(mi)) {
+               /* Width/height ratio handled by gluPerspective() now. */
+               glScalef(Scale4Window, Scale4Window, Scale4Window);
+       } else {
+               glScalef(Scale4Iconic, Scale4Iconic, Scale4Iconic);
+       }
+
+       FindNeighbors(mi);
+
+       glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, pp->system_color);
+
+       /* If it's the begining of a system, draw a sphere */
+       if (pp->olddir == dirNone) {
+               glPushMatrix();
+               glTranslatef((pp->PX - 16) / 3.0 * 4.0, (pp->PY - 12) / 3.0 * 4.0, (pp->PZ - 16) / 3.0 * 4.0);
+               mySphere(0.6);
+               glPopMatrix();
+       }
+       /* Check for stop conditions */
+       if (pp->ndirections == 0 || pp->counter > pp->system_length) {
+               glPushMatrix();
+               glTranslatef((pp->PX - 16) / 3.0 * 4.0, (pp->PY - 12) / 3.0 * 4.0, (pp->PZ - 16) / 3.0 * 4.0);
+               /* Finish the system with another sphere */
+               mySphere(0.6);
+#if defined( MESA ) && defined( SLOW )
+               glXSwapBuffers(display, window);
+#endif
+               glPopMatrix();
+
+               /* If the maximum number of system was drawn, restart (clearing the screen), */
+               /* else start a new system. */
+               if (++pp->system_number > pp->number_of_systems) {
+                       (void) sleep(1);
+                       pinit(mi, 1);
+               } else {
+                       pinit(mi, 0);
+               }
+
+               glPopMatrix();
+               return;
+       }
+       pp->counter++;
+       pp->turncounter++;
+
+       /* Do will the direction change? if so, determine the new one */
+       newdir = pp->nowdir;
+       if (!pp->directions[newdir]) {  /* cannot proceed in the current direction */
+               newdir = SelectNeighbor(mi);
+       } else {
+               if (tightturns) {
+                       /* random change (20% chance) */
+                       if ((pp->counter > 1) && (NRAND(100) < 20)) {
+                               newdir = SelectNeighbor(mi);
+                       }
+               } else {
+                       /* Chance to turn increases after each length of pipe drawn */
+                       if ((pp->counter > 1) && NRAND(50) < NRAND(pp->turncounter + 1)) {
+                               newdir = SelectNeighbor(mi);
+                               pp->turncounter = 0;
+                       }
+               }
+       }
+
+       /* Has the direction changed? */
+       if (newdir == pp->nowdir) {
+               /* If not, draw the cell's center pipe */
+               glPushMatrix();
+               glTranslatef((pp->PX - 16) / 3.0 * 4.0, (pp->PY - 12) / 3.0 * 4.0, (pp->PZ - 16) / 3.0 * 4.0);
+               /* Chance of factory shape here, if enabled. */
+               if ((pp->counter > 1) && (NRAND(100) < factory)) {
+                       MakeShape(mi, newdir);
+               } else {
+                       MakeTube(newdir);
+               }
+               glPopMatrix();
+       } else {
+               /* If so, draw the cell's center elbow/sphere */
+               int         sysT = pp->system_type;
+
+               if (sysT == NofSysTypes + 1) {
+                       sysT = ((pp->system_number - 1) % NofSysTypes) + 1;
+               }
+               glPushMatrix();
+
+               switch (sysT) {
+                       case 1:
+                               glTranslatef((pp->PX - 16) / 3.0 * 4.0, (pp->PY - 12) / 3.0 * 4.0, (pp->PZ - 16) / 3.0 * 4.0);
+                               mySphere(elbowradius);
+                               break;
+                       case 2:
+                       case 3:
+                               switch (pp->nowdir) {
+                                       case dirUP:
+                                               switch (newdir) {
+                                                       case dirLEFT:
+                                                               glTranslatef((pp->PX - 16) / 3.0 * 4.0 - (one_third), (pp->PY - 12) / 3.0 * 4.0 - (one_third), (pp->PZ - 16) / 3.0 * 4.0);
+                                                               glRotatef(180.0, 1.0, 0.0, 0.0);
+                                                               break;
+                                                       case dirRIGHT:
+                                                               glTranslatef((pp->PX - 16) / 3.0 * 4.0 + (one_third), (pp->PY - 12) / 3.0 * 4.0 - (one_third), (pp->PZ - 16) / 3.0 * 4.0);
+                                                               glRotatef(180.0, 1.0, 0.0, 0.0);
+                                                               glRotatef(180.0, 0.0, 1.0, 0.0);
+                                                               break;
+                                                       case dirFAR:
+                                                               glTranslatef((pp->PX - 16) / 3.0 * 4.0, (pp->PY - 12) / 3.0 * 4.0 - (one_third), (pp->PZ - 16) / 3.0 * 4.0 - (one_third));
+                                                               glRotatef(90.0, 0.0, 1.0, 0.0);
+                                                               glRotatef(180.0, 0.0, 0.0, 1.0);
+                                                               break;
+                                                       case dirNEAR:
+                                                               glTranslatef((pp->PX - 16) / 3.0 * 4.0, (pp->PY - 12) / 3.0 * 4.0 - (one_third), (pp->PZ - 16) / 3.0 * 4.0 + (one_third));
+                                                               glRotatef(90.0, 0.0, 1.0, 0.0);
+                                                               glRotatef(180.0, 1.0, 0.0, 0.0);
+                                                               break;
+                                               }
+                                               break;
+                                       case dirDOWN:
+                                               switch (newdir) {
+                                                       case dirLEFT:
+                                                               glTranslatef((pp->PX - 16) / 3.0 * 4.0 - (one_third), (pp->PY - 12) / 3.0 * 4.0 + (one_third), (pp->PZ - 16) / 3.0 * 4.0);
+                                                               break;
+                                                       case dirRIGHT:
+                                                               glTranslatef((pp->PX - 16) / 3.0 * 4.0 + (one_third), (pp->PY - 12) / 3.0 * 4.0 + (one_third), (pp->PZ - 16) / 3.0 * 4.0);
+                                                               glRotatef(180.0, 0.0, 1.0, 0.0);
+                                                               break;
+                                                       case dirFAR:
+                                                               glTranslatef((pp->PX - 16) / 3.0 * 4.0, (pp->PY - 12) / 3.0 * 4.0 + (one_third), (pp->PZ - 16) / 3.0 * 4.0 - (one_third));
+                                                               glRotatef(270.0, 0.0, 1.0, 0.0);
+                                                               break;
+                                                       case dirNEAR:
+                                                               glTranslatef((pp->PX - 16) / 3.0 * 4.0, (pp->PY - 12) / 3.0 * 4.0 + (one_third), (pp->PZ - 16) / 3.0 * 4.0 + (one_third));
+                                                               glRotatef(90.0, 0.0, 1.0, 0.0);
+                                                               break;
+                                               }
+                                               break;
+                                       case dirLEFT:
+                                               switch (newdir) {
+                                                       case dirUP:
+                                                               glTranslatef((pp->PX - 16) / 3.0 * 4.0 + (one_third), (pp->PY - 12) / 3.0 * 4.0 + (one_third), (pp->PZ - 16) / 3.0 * 4.0);
+                                                               glRotatef(180.0, 0.0, 1.0, 0.0);
+                                                               break;
+                                                       case dirDOWN:
+                                                               glTranslatef((pp->PX - 16) / 3.0 * 4.0 + (one_third), (pp->PY - 12) / 3.0 * 4.0 - (one_third), (pp->PZ - 16) / 3.0 * 4.0);
+                                                               glRotatef(180.0, 1.0, 0.0, 0.0);
+                                                               glRotatef(180.0, 0.0, 1.0, 0.0);
+                                                               break;
+                                                       case dirFAR:
+                                                               glTranslatef((pp->PX - 16) / 3.0 * 4.0 + (one_third), (pp->PY - 12) / 3.0 * 4.0, (pp->PZ - 16) / 3.0 * 4.0 - (one_third));
+                                                               glRotatef(270.0, 1.0, 0.0, 0.0);
+                                                               glRotatef(180.0, 0.0, 1.0, 0.0);
+                                                               break;
+                                                       case dirNEAR:
+                                                               glTranslatef((pp->PX - 16) / 3.0 * 4.0 + (one_third), (pp->PY - 12) / 3.0 * 4.0, (pp->PZ - 16) / 3.0 * 4.0 + (one_third));
+                                                               glRotatef(270.0, 1.0, 0.0, 0.0);
+                                                               glRotatef(180.0, 0.0, 0.0, 1.0);
+                                                               break;
+                                               }
+                                               break;
+                                       case dirRIGHT:
+                                               switch (newdir) {
+                                                       case dirUP:
+                                                               glTranslatef((pp->PX - 16) / 3.0 * 4.0 - (one_third), (pp->PY - 12) / 3.0 * 4.0 + (one_third), (pp->PZ - 16) / 3.0 * 4.0);
+                                                               break;
+                                                       case dirDOWN:
+                                                               glTranslatef((pp->PX - 16) / 3.0 * 4.0 - (one_third), (pp->PY - 12) / 3.0 * 4.0 - (one_third), (pp->PZ - 16) / 3.0 * 4.0);
+                                                               glRotatef(180.0, 1.0, 0.0, 0.0);
+                                                               break;
+                                                       case dirFAR:
+                                                               glTranslatef((pp->PX - 16) / 3.0 * 4.0 - (one_third), (pp->PY - 12) / 3.0 * 4.0, (pp->PZ - 16) / 3.0 * 4.0 - (one_third));
+                                                               glRotatef(270.0, 1.0, 0.0, 0.0);
+                                                               break;
+                                                       case dirNEAR:
+                                                               glTranslatef((pp->PX - 16) / 3.0 * 4.0 - (one_third), (pp->PY - 12) / 3.0 * 4.0, (pp->PZ - 16) / 3.0 * 4.0 + (one_third));
+                                                               glRotatef(90.0, 1.0, 0.0, 0.0);
+                                                               break;
+                                               }
+                                               break;
+                                       case dirNEAR:
+                                               switch (newdir) {
+                                                       case dirLEFT:
+                                                               glTranslatef((pp->PX - 16) / 3.0 * 4.0 - (one_third), (pp->PY - 12) / 3.0 * 4.0, (pp->PZ - 16) / 3.0 * 4.0 - (one_third));
+                                                               glRotatef(270.0, 1.0, 0.0, 0.0);
+                                                               break;
+                                                       case dirRIGHT:
+                                                               glTranslatef((pp->PX - 16) / 3.0 * 4.0 + (one_third), (pp->PY - 12) / 3.0 * 4.0, (pp->PZ - 16) / 3.0 * 4.0 - (one_third));
+                                                               glRotatef(270.0, 1.0, 0.0, 0.0);
+                                                               glRotatef(180.0, 0.0, 1.0, 0.0);
+                                                               break;
+                                                       case dirUP:
+                                                               glTranslatef((pp->PX - 16) / 3.0 * 4.0, (pp->PY - 12) / 3.0 * 4.0 + (one_third), (pp->PZ - 16) / 3.0 * 4.0 - (one_third));
+                                                               glRotatef(270.0, 0.0, 1.0, 0.0);
+                                                               break;
+                                                       case dirDOWN:
+                                                               glTranslatef((pp->PX - 16) / 3.0 * 4.0, (pp->PY - 12) / 3.0 * 4.0 - (one_third), (pp->PZ - 16) / 3.0 * 4.0 - (one_third));
+                                                               glRotatef(90.0, 0.0, 1.0, 0.0);
+                                                               glRotatef(180.0, 0.0, 0.0, 1.0);
+                                                               break;
+                                               }
+                                               break;
+                                       case dirFAR:
+                                               switch (newdir) {
+                                                       case dirUP:
+                                                               glTranslatef((pp->PX - 16) / 3.0 * 4.0, (pp->PY - 12) / 3.0 * 4.0 + (one_third), (pp->PZ - 16) / 3.0 * 4.0 + (one_third));
+                                                               glRotatef(90.0, 0.0, 1.0, 0.0);
+                                                               break;
+                                                       case dirDOWN:
+                                                               glTranslatef((pp->PX - 16) / 3.0 * 4.0, (pp->PY - 12) / 3.0 * 4.0 - (one_third), (pp->PZ - 16) / 3.0 * 4.0 + (one_third));
+                                                               glRotatef(90.0, 0.0, 1.0, 0.0);
+                                                               glRotatef(180.0, 1.0, 0.0, 0.0);
+                                                               break;
+                                                       case dirLEFT:
+                                                               glTranslatef((pp->PX - 16) / 3.0 * 4.0 - (one_third), (pp->PY - 12) / 3.0 * 4.0, (pp->PZ - 16) / 3.0 * 4.0 + (one_third));
+                                                               glRotatef(90.0, 1.0, 0.0, 0.0);
+                                                               break;
+                                                       case dirRIGHT:
+                                                               glTranslatef((pp->PX - 16) / 3.0 * 4.0 + (one_third), (pp->PY - 12) / 3.0 * 4.0, (pp->PZ - 16) / 3.0 * 4.0 + (one_third));
+                                                               glRotatef(270.0, 1.0, 0.0, 0.0);
+                                                               glRotatef(180.0, 0.0, 0.0, 1.0);
+                                                               break;
+                                               }
+                                               break;
+                               }
+                               myElbow(mi, (sysT == 2));
+                               break;
+               }
+               glPopMatrix();
+       }
+
+       OPX = pp->PX;
+       OPY = pp->PY;
+       OPZ = pp->PZ;
+       pp->olddir = pp->nowdir;
+       pp->nowdir = newdir;
+       switch (pp->nowdir) {
+               case dirUP:
+                       pp->PY++;
+                       break;
+               case dirDOWN:
+                       pp->PY--;
+                       break;
+               case dirLEFT:
+                       pp->PX--;
+                       break;
+               case dirRIGHT:
+                       pp->PX++;
+                       break;
+               case dirNEAR:
+                       pp->PZ++;
+                       break;
+               case dirFAR:
+                       pp->PZ--;
+                       break;
+       }
+       pp->Cells[pp->PX][pp->PY][pp->PZ] = 1;
+
+       /* Cells'face pipe */
+       glTranslatef(((pp->PX + OPX) / 2.0 - 16) / 3.0 * 4.0, ((pp->PY + OPY) / 2.0 - 12) / 3.0 * 4.0, ((pp->PZ + OPZ) / 2.0 - 16) / 3.0 * 4.0);
+       MakeTube(newdir);
+
+       glPopMatrix();
+
+       glFlush();
+
+#if defined( MESA ) && defined( SLOW )
+       pp->flip = !pp->flip;
+       if (pp->flip)
+               glXSwapBuffers(display, window);
+#endif
+}
+
+void
+change_pipes(ModeInfo * mi)
+{
+       pipesstruct *pp = &pipes[MI_SCREEN(mi)];
+
+       if (!pp->glx_context)
+               return;
+
+       glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(pp->glx_context));
+       pinit(mi, 1);
+}
+
+void
+release_pipes(ModeInfo * mi)
+{
+       if (pipes != NULL) {
+               int         screen;
+
+               for (screen = 0; screen < MI_NUM_SCREENS(mi); screen++) {
+                       pipesstruct *pp = &pipes[screen];
+
+                       if (pp->glx_context) {
+
+                               /* Display lists MUST be freed while their glXContext is current. */
+                               glXMakeCurrent(MI_DISPLAY(mi), pp->window, *(pp->glx_context));
+
+                               if (pp->valve)
+                                       glDeleteLists(pp->valve, 1);
+                               if (pp->bolts)
+                                       glDeleteLists(pp->bolts, 1);
+                               if (pp->betweenbolts)
+                                       glDeleteLists(pp->betweenbolts, 1);
+
+                               if (pp->elbowbolts)
+                                       glDeleteLists(pp->elbowbolts, 1);
+                               if (pp->elbowcoins)
+                                       glDeleteLists(pp->elbowcoins, 1);
+
+                               if (pp->guagehead)
+                                       glDeleteLists(pp->guagehead, 1);
+                               if (pp->guageface)
+                                       glDeleteLists(pp->guageface, 1);
+                               if (pp->guagedial)
+                                       glDeleteLists(pp->guagedial, 1);
+                               if (pp->guageconnector)
+                                       glDeleteLists(pp->guageconnector, 1);
+                       }
+               }
+
+               (void) free((void *) pipes);
+               pipes = NULL;
+       }
+       FreeAllGL(mi);
+}
+
+#endif
diff --git a/hacks/glx/pulsar.c b/hacks/glx/pulsar.c
new file mode 100644 (file)
index 0000000..b34ad5d
--- /dev/null
@@ -0,0 +1,841 @@
+/* -*- Mode: C; tab-width: 4 -*- */
+/* pulsar --- pulsar module for xscreensaver */
+/*-
+ * 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.
+ *
+ * This file is provided AS IS with no warranties of any kind.  The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof.  In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+
+ * Revision History:
+ * 4-Apr-1999:  dek@cgl.ucsf.edu  Created module "pulsar"
+ * 27-Apr-1999:  dek@cgl.ucsf.edu  Submitted module "pulsar"
+ * 4-May-1999:  jwz@jwz.org  Added module "pulsar"
+ * 4-May-1999:  dek@cgl.ucsf.edu  Submitted module "pulsar" updates
+ *
+ * Notes:
+ * The pulsar screensaver draws a number of rotating, pulsing rectangles
+ * on your screen.  Depending on the options you choose, you can set a number
+ * of interesting OpenGL parameters, including alpha blending, depth testing, fog,
+ * lighting, texturing, mipmapping, bilinear filtering, and line antialiasing.  
+ * Additionally, there is a "frames per second" meter which gives an estimate of
+ * the speed of your graphics card.  
+ *
+ * Example command-line switches:
+ * Only draw a single quad, and don't fill it (boring but fast)
+ * pulsar -wire -quads 1 -fps
+ *
+ * Only try this with hardware graphics acceleration (PPro 200 w/ a Voodoo 2 runs great)
+ * pulsar -quads 10 -texture -mipmap -texture_quality -light -fog -fps
+ *                                                                 
+ */
+
+#include <math.h> 
+#include <stdio.h>
+#include <stdlib.h>
+
+/*-
+ * due to a Bug/feature in VMS X11/Intrinsic.h has to be placed before xlock.
+ * otherwise caddr_t is not defined correctly
+ */
+
+#include <X11/Intrinsic.h>
+
+#ifdef STANDALONE
+# define PROGCLASS                                             "Screensaver"
+# define HACK_INIT                                             init_screensaver
+# define HACK_DRAW                                             draw_screensaver
+# define screensaver_opts                              xlockmore_opts
+#define        DEFAULTS                        "*light:                        False   \n" \
+                                        "*wire:                                False   \n" \
+                                        "*quads:                       5       \n" \
+                                        "*blend:                       True    \n" \
+                                        "*fog:                         False   \n" \
+                                        "*antialias:           False   \n" \
+                                        "*texture:                     False   \n" \
+                                        "*texture_quality:     False   \n" \
+                                        "*mipmap:                      False   \n" \
+                                        "*fps:                         False   \n" \
+                                        "*doDepth:                     False   \n" \
+                                                                               "*image:                        BUILTIN \n"
+
+# include "xlockmore.h"                                /* from the xscreensaver distribution */
+#else /* !STANDALONE */
+# include "xlock.h"                                    /* from the xlockmore distribution */
+#endif /* !STANDALONE */
+
+#ifdef USE_GL /* whole file */
+
+#ifdef HAVE_XPM
+# include <X11/xpm.h>
+# ifndef PIXEL_ALREADY_TYPEDEFED
+# define PIXEL_ALREADY_TYPEDEFED /* Sigh, Xmu/Drawing.h needs this... */
+# endif
+#endif
+
+#ifdef HAVE_XMU
+# ifndef VMS
+#  include <X11/Xmu/Drawing.h>
+#else  /* VMS */
+#  include <Xmu/Drawing.h>
+# endif /* VMS */
+#endif
+
+
+#include <GL/gl.h>
+#include <GL/glu.h>
+
+#include <string.h>
+#include <malloc.h>
+#include <stdio.h>
+
+/* Functions for loading and storing textures */
+
+#define checkImageWidth 64
+#define checkImageHeight 64
+
+/* Functions for handling the frames per second timer */
+#include "GL/glx.h"
+
+#ifndef SAMPLE_FRAMES
+#define SAMPLE_FRAMES 10
+#endif
+
+#undef countof
+#define countof(x) (sizeof((x))/sizeof((*x)))
+
+#define WIDTH 800
+#define HEIGHT 600
+
+#define NUM_QUADS 5
+#define DEF_NUM_QUADS  "5"
+#define DEF_LIGHT              "False"
+#define DEF_WIRE               "False"
+#define DEF_BLEND      "True"
+#define DEF_FOG                "False"
+#define DEF_ANTIALIAS   "False"
+#define DEF_TEXTURE    "False"
+#define DEF_TEXTURE_QUALITY   "False"
+#define DEF_MIPMAP     "False"
+#define DEF_FPS                "False"
+#define DEF_DO_DEPTH   "False"
+#define DEF_IMAGE      "BUILTIN"
+
+static int num_quads;
+static int do_light;
+static int do_wire;
+static int do_blend;
+static int do_fog;
+static int do_antialias;
+static int do_texture;
+static int do_texture_quality;
+static int do_mipmap;
+static int do_fps;
+static int do_depth;
+static char *which_image;
+
+
+static XrmOptionDescRec opts[] = {
+  {"-quads",   ".pulsar.quads",   XrmoptionSepArg, (caddr_t) NULL },
+  {"-light",   ".pulsar.light",   XrmoptionNoArg, (caddr_t) "true" },
+  {"+light",   ".pulsar.light",   XrmoptionNoArg, (caddr_t) "false" },
+  {"-wire",   ".pulsar.wire",   XrmoptionNoArg, (caddr_t) "true" },
+  {"+wire",   ".pulsar.wire",   XrmoptionNoArg, (caddr_t) "false" },
+  {"-blend",   ".pulsar.blend",   XrmoptionNoArg, (caddr_t) "true" },
+  {"+blend",   ".pulsar.blend",   XrmoptionNoArg, (caddr_t) "false" },
+  {"-fog",   ".pulsar.fog",   XrmoptionNoArg, (caddr_t) "true" },
+  {"+fog",   ".pulsar.fog",   XrmoptionNoArg, (caddr_t) "false" },
+  {"-antialias",   ".pulsar.antialias",   XrmoptionNoArg, (caddr_t) "true" },
+  {"+antialias",   ".pulsar.antialias",   XrmoptionNoArg, (caddr_t) "false" },
+  {"-texture",   ".pulsar.texture",   XrmoptionNoArg, (caddr_t) "true" },
+  {"+texture",   ".pulsar.texture",   XrmoptionNoArg, (caddr_t) "false" },
+  {"-texture_quality",   ".pulsar.texture_quality",   XrmoptionNoArg, (caddr_t) "true" },
+  {"+texture_quality",   ".pulsar.texture_quality",   XrmoptionNoArg, (caddr_t) "false" },
+  {"-mipmap",   ".pulsar.mipmap",   XrmoptionNoArg, (caddr_t) "true" },
+  {"+mipmap",   ".pulsar.mipmap",   XrmoptionNoArg, (caddr_t) "false" },
+  {"-fps",   ".pulsar.fps",   XrmoptionNoArg, (caddr_t) "true" },
+  {"+fps",   ".pulsar.fps",   XrmoptionNoArg, (caddr_t) "false" },
+  {"-do_depth",   ".pulsar.doDepth",   XrmoptionNoArg, (caddr_t) "true" },
+  {"+do_depth",   ".pulsar.doDepth",   XrmoptionNoArg, (caddr_t) "false" },
+  {"-image",   ".pulsar.image",  XrmoptionSepArg, (caddr_t) NULL },
+};
+
+
+static argtype vars[] = {
+  {(caddr_t *) &num_quads, "quads", "Quads", DEF_NUM_QUADS, t_Int},
+  {(caddr_t *) &do_light,    "light",   "Light",   DEF_LIGHT,   t_Bool},
+  {(caddr_t *) &do_wire,    "wire",   "Wire",   DEF_WIRE,   t_Bool},
+  {(caddr_t *) &do_blend,    "blend",   "Blend",   DEF_BLEND,   t_Bool},
+  {(caddr_t *) &do_fog,    "fog",   "Fog",   DEF_FOG,   t_Bool},
+  {(caddr_t *) &do_antialias,    "antialias",   "Antialias",   DEF_ANTIALIAS,   t_Bool},
+  {(caddr_t *) &do_texture,    "texture",   "Texture",   DEF_TEXTURE,   t_Bool},
+  {(caddr_t *) &do_texture_quality,    "texture_quality",   "Texture_quality",   DEF_TEXTURE_QUALITY,   t_Bool},
+  {(caddr_t *) &do_mipmap,    "mipmap",   "Mipmap",   DEF_MIPMAP,   t_Bool},
+  {(caddr_t *) &do_fps,    "fps",   "fps",   DEF_FPS,   t_Bool},
+  {(caddr_t *) &do_depth,    "doDepth",   "DoDepth",   DEF_DO_DEPTH,   t_Bool},
+  {(caddr_t *) &which_image, "image",   "Image",   DEF_IMAGE,   t_String},
+};
+
+
+static OptionStruct desc[] =
+{
+       {"-quads num", "how many quads to draw"},
+       {"-/+ light", "whether to do enable lighting (slower)"},
+       {"-/+ wire", "whether to do use wireframe instead of filled (faster)"},
+       {"-/+ blend", "whether to do enable blending (slower)"},
+       {"-/+ fog", "whether to do enable fog (?)"},
+       {"-/+ antialias", "whether to do enable antialiased lines (slower)"},
+       {"-/+ texture", "whether to do enable texturing (much slower)"},
+       {"-/+ texture_quality", "whether to do enable linear/mipmap filtering (much much slower)"},
+       {"-/+ mipmap", "whether to do enable mipmaps (much slower)"},
+       {"-/+ fps", "whether to do enable frames per second meter (?)"},
+       {"-/+ depth", "whether to do enable depth buffer checking (slower)"},
+       {"-image <filename>", "texture image to load (PPM, PPM4, TIFF(?), XPM(?))"},
+};
+
+ModeSpecOpt screensaver_opts = {countof(opts), opts, countof(vars), vars, desc};
+
+#ifdef USE_MODULES
+ModStruct   screensaver_description =
+{"screensaver", "init_screensaver", "draw_screensaver", "release_screensaver",
+ "draw_screensaver", "init_screensaver", NULL, &screensaver_opts,
+ 1000, 1, 2, 1, 4, 1.0, "",
+ "OpenGL screensaver", 0, NULL};
+#endif
+
+
+/* structure for holding the screensaver data */
+typedef struct {
+  int screen_width, screen_height;
+  GLXContext *glx_context;
+  Window window;
+  XColor fg, bg;
+} screensaverstruct;
+
+static screensaverstruct *Screensaver = NULL;
+
+struct quad
+{
+  GLfloat tx, ty, tz;
+  GLfloat rx, ry, rz;
+
+  GLfloat dtx, dty, dtz;
+  GLfloat drx, dry, drz;
+
+};
+
+int global_width=WIDTH, global_height=HEIGHT;
+
+
+static GLint base;
+static int FrameCounter = 0;
+static double oldtime=-1., newtime=-1.;
+static char FPSstring[1024]="FPS: NONE"; 
+
+static float x_pos=0, y_pos=0;
+
+#define FONT "-*-courier-medium-r-normal-*-240-*"
+GLint quad_list;
+
+static float scale_x=1, scale_y=1, scale_z=1;
+static int frame = 0;
+
+static GLenum errCode;
+static const GLubyte *errString;
+
+struct quad *quads;
+
+int checkError(int line, char *file)
+{
+  if((errCode = glGetError()) != GL_NO_ERROR) {
+    errString = (GLubyte *)gluErrorString(errCode);
+    fprintf(stderr, "OpenGL error: %s detected at line %d in file %s\n", errString, line, file);
+    exit(1);
+  }
+  return 0;
+}
+
+
+void FPS_Setup(void)
+{
+  Display *Dpy;
+  XFontStruct *fontInfo;
+  Font id;
+  int first=0, last=255;
+
+  Dpy = XOpenDisplay(NULL);
+  fontInfo = XLoadQueryFont(Dpy, FONT);
+  if (fontInfo == NULL)
+    {
+      fprintf(stderr, "Failed to load font %s\n", FONT);
+      exit(1);
+    }
+
+  id = fontInfo->fid;
+  first = fontInfo->min_char_or_byte2;
+  last = fontInfo->max_char_or_byte2;
+  
+  base = glGenLists((GLuint) last+1);
+  if (base == 0) {
+    fprintf (stderr, "out of display lists\n");
+    exit(1);
+  }
+  glXUseXFont(id, first, last-first+1, base+first);
+
+}
+
+void PrintString(float x, float y, char *string)
+{
+  int len, i;
+
+  /* save the current state */
+  /* note: could be expensive! */
+  glPushAttrib(GL_ALL_ATTRIB_BITS);
+  glMatrixMode(GL_PROJECTION);
+  glLoadIdentity();
+  gluOrtho2D(0, global_width, 0, global_height);
+  glMatrixMode(GL_MODELVIEW);
+  glLoadIdentity();
+
+  /* disable lighting and texturing when drawing bitmaps! */
+  glDisable(GL_TEXTURE_2D);
+  glDisable(GL_LIGHTING);
+  glDisable(GL_BLEND);
+
+  /* draw a black background */
+
+  /* draw the text */
+  glColor3f(1,1,1);
+  glRasterPos2f( x, y);
+  len = (int) strlen(string);
+  for (i = 0; i < len; i++) {
+       if (glIsList(base+string[i]))
+         glCallList(base+string[i]);
+       else
+         fprintf(stderr, "%d+string[%d] is not a display list!\n", base, i);
+  }
+
+  /* clean up after our state changes */
+  glPopAttrib();
+}
+
+double gettime(void)
+{
+  struct timeval now;
+#ifdef GETTIMEOFDAY_TWO_ARGS
+  struct timezone tzp;
+  gettimeofday(&now, &tzp);
+#else
+  gettimeofday(&now);
+#endif
+  return (double) (now.tv_sec + (((double) now.tv_usec) * 0.000001));
+}
+
+void DoFPS(void)
+{
+  /* every SAMPLE_FRAMES frames, get the time and use it to get the 
+     frames per second */
+  if (!(FrameCounter % SAMPLE_FRAMES)) {
+    oldtime = newtime;
+    newtime = gettime();
+    sprintf(FPSstring, "FPS: %.02f", SAMPLE_FRAMES/(newtime-oldtime));
+  }
+
+  PrintString(x_pos,y_pos,FPSstring);
+
+  FrameCounter++;
+}
+
+GLubyte *Generate_Image(int *width, int *height, int *format)
+{
+  GLubyte *result;
+  int i, j, c;
+  int counter=0;
+
+  *width = checkImageWidth;
+  *height = checkImageHeight;
+  result = (GLubyte *)malloc(4 * *width * *height);
+
+  counter = 0;
+  for (i = 0; i < checkImageWidth; i++) {
+    for (j = 0; j < checkImageHeight; j++) {
+      c = (((((i&0x8)==0))^(((j&0x8))==0)))*255;
+      result[counter++] = (GLubyte) c;
+      result[counter++] = (GLubyte) c;
+      result[counter++] = (GLubyte) c;
+      result[counter++] = (GLubyte) 255;
+    }
+  }
+
+  *format = GL_RGBA;
+  return result;
+}
+
+
+
+#ifdef TIFF
+#include <tiffio>
+/* Load a TIFF texture: requires libtiff */
+uint32 *LoadTIFF(char *filename, int *width, int *height, int *format)
+{
+  TIFF *tif;
+  char emsg[1024];
+  uint32 *raster;
+  TIFFRGBAImage img;
+  tsize_t npixels;
+
+  tif = TIFFOpen(filename, "r");
+  if (tif == NULL) {
+    fprintf(stderr, "Problem showing %s\n", filename);
+    return Generate_Image(&width, &height, &format);
+  }
+  if (TIFFRGBAImageBegin(&img, tif, 0, emsg)) {
+    npixels = (tsize_t) (img.width * img.height);
+    raster = (uint32 *) _TIFFmalloc(npixels * (tsize_t) sizeof(uint32));
+    if (raster != NULL) {
+      if (TIFFRGBAImageGet(&img, raster, img.width, img.height) == 0) {
+        TIFFError(filename, emsg);
+       return Generate_Image(&width, &height, &format);
+      }
+    }
+    TIFFRGBAImageEnd(&img);
+  } else {
+    TIFFError(filename, emsg);
+    return Generate_Image(&width, &height, &format);
+  }
+
+  *width = img.width;
+  *height = img.height;
+  *format = GL_RGBA;
+
+  TIFFClose(tif);
+  return raster;
+}
+#endif
+
+/* Load a modified version of PPM format with an extra byte for alpha */
+GLubyte *LoadPPM4(const char *filename, int *width, int *height, int *format)
+{
+  char buff[1024];
+  GLubyte *data;
+  int sizeX, sizeY;
+  FILE *fp;
+  int maxval;
+
+  fp = fopen(filename, "rb");
+  if (!fp)
+    {
+      fprintf(stderr, "Unable to open file '%s'\n", filename);
+      return  Generate_Image(width, height, format);
+    }
+
+  if (!fgets(buff, sizeof(buff), fp))
+    {
+      perror("Unable to read header filename\n");
+      return  Generate_Image(width, height, format);
+    }
+
+  if (buff[0] != '6' || buff[1] != 'P')
+    {
+      fprintf(stderr, "Invalid image format (must be `6P')\n");
+      return  Generate_Image(width, height, format);
+    }
+
+  do
+    {
+      fgets(buff, sizeof(buff), fp);
+    }
+  while (buff[0] == '#');
+    
+  if (sscanf(buff, "%d %d", &sizeX, &sizeY) != 2)
+    {
+      fprintf(stderr, "Error loading image `%s'\n", filename);
+      return  Generate_Image(width, height, format);
+    }
+
+  if (fscanf(fp, "%d", &maxval) != 1)
+    {
+      fprintf(stderr, "Error loading image `%s'\n", filename);
+      return  Generate_Image(width, height, format);
+    }
+
+  while (fgetc(fp) != '\n')
+    ;
+
+  data = (GLubyte *)malloc(4 * sizeX * sizeY);
+  if (data == NULL)
+    {
+      fprintf(stderr, "Unable to allocate memory\n");
+         exit(1);
+    }
+
+  if (fread(data, 4 * sizeX, sizeY, fp) != sizeY)
+    {
+      fprintf(stderr, "Error loading image `%s'\n", filename);
+      return  Generate_Image(width, height, format);
+    }
+
+  fclose(fp);
+
+  *width = sizeX;
+  *height = sizeY;
+  *format = GL_RGBA;
+  return data;
+}
+
+/* Load a plain PPM image */
+GLubyte *LoadPPM(const char *filename, int *width, int *height, int *format)
+{
+  char buff[1024];
+  GLubyte *data;
+  GLint sizeX, sizeY;
+  FILE *fp;
+  int maxval;
+
+  fp = fopen(filename, "rb");
+  if (!fp)
+    {
+      fprintf(stderr, "Unable to open file '%s'\n", filename);
+      return  Generate_Image(width, height, format);
+      exit(1);
+    }
+  if (!fgets(buff, sizeof(buff), fp))
+    {
+      perror(filename);
+      return  Generate_Image(width, height, format);
+    }
+
+  if (buff[0] != 'P' || buff[1] != '6')
+    {
+      fprintf(stderr, "Invalid image format (must be `P6')\n");
+      return  Generate_Image(width, height, format);
+    }
+
+  do
+    {
+      fgets(buff, sizeof(buff), fp);
+    }
+  while (buff[0] == '#');
+    
+  if (sscanf(buff, "%d %d", &sizeX, &sizeY) != 2)
+    {
+      fprintf(stderr, "Error loading image `%s'\n", filename);
+      return  Generate_Image(width, height, format);
+    }
+
+  if (fscanf(fp, "%d", &maxval) != 1)
+    {
+      fprintf(stderr, "Error loading image `%s'\n", filename);
+      return  Generate_Image(width, height, format);
+    }
+
+  while (fgetc(fp) != '\n')
+    ;
+
+  data = (GLubyte *)malloc(3 * sizeX * sizeY);
+  if (data == NULL)
+    {
+      fprintf(stderr, "Unable to allocate memory\n");
+         exit(1);
+    }
+
+  if (fread(data, 3 * sizeX, sizeY, fp) != sizeY)
+    {
+      fprintf(stderr, "Error loading image `%s'\n", filename);
+      return  Generate_Image(width, height, format);
+    }
+
+  fclose(fp);
+
+  *width = sizeX;
+  *height = sizeY;
+  *format = GL_RGB;
+  return data;
+}
+
+/* Create a texture in OpenGL.  First an image is loaded 
+   and stored in a raster buffer, then it's  */
+void Create_Texture(char *filename)
+{
+  int height, width;
+  GLubyte *image;
+  GLint a;
+  int format;
+
+  if ( !strncmp(filename, "BUILTIN", 7))
+    image = Generate_Image(&width, &height, &format);
+  else if ( !strncmp((filename+strlen(filename)-3), "ppm", 3))
+    image = LoadPPM(filename, &width, &height, &format);
+  else if ( !strncmp((filename+strlen(filename)-4), "ppm4", 4))
+    image = LoadPPM4(filename, &width, &height, &format);
+#ifdef TIFF
+  else if ( !strncmp((filename+strlen(filename)-4), "tiff", 4))
+    image = (GLubyte *)LoadTIFF(filename, &width, &height, &format);
+#endif
+  else {
+    fprintf(stderr, "Unknown file format extension: '%s'\n", filename);
+    image = Generate_Image(&width, &height, &format);
+  }
+
+  /* GL_MODULATE or GL_DECAL depending on what you want */
+  glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
+  glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+  glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+  glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
+  /* perhaps we can edge a bit more speed at the expense of quality */
+  glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_FASTEST);
+
+  if (do_texture_quality) {
+       /* with texture_quality, the min and mag filters look *much* nice but are *much* slower */
+       glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+       glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
+  }
+  else {
+       /* default is to do it quick and dirty */
+       /* if you have mipmaps turned on, but not texture quality, nothing will happen! */
+       glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+       glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+  }
+
+  /* mipmaps make the image look much nicer */
+  if (do_mipmap)
+       a=gluBuild2DMipmaps(GL_TEXTURE_2D, format, width, height, format, GL_UNSIGNED_BYTE, image);
+  else 
+       glTexImage2D(GL_TEXTURE_2D, 0, format, width, height, 0,
+                                format, GL_UNSIGNED_BYTE, image);
+
+  free(image);
+}
+
+void resetProjection(void) {
+  glMatrixMode(GL_PROJECTION);
+  glLoadIdentity();
+  glFrustum(-1, 1, -1, 1, 1, 100); 
+  glMatrixMode(GL_MODELVIEW);
+  glLoadIdentity();
+}
+
+
+void GenerateQuad(void)
+{
+  int i;
+
+  quad_list = glGenLists(1);
+  glNewList(quad_list,GL_COMPILE);
+#if 1
+  glBegin(GL_QUADS);
+  glColor4f(1,0,0,.4); glNormal3f(0,0,1);  glTexCoord2f(0,0); glVertex2f(-1, -1);
+  glColor4f(0,1,0,.4); glNormal3f(0,0,1);  glTexCoord2f(0,1); glVertex2f(-1,  1);
+  glColor4f(0,0,1,.4); glNormal3f(0,0,1);  glTexCoord2f(1,1); glVertex2f( 1,  1);
+  glColor4f(1,1,1,1); glNormal3f(0,0,1);  glTexCoord2f(1,0); glVertex2f( 1,  -1);
+#else
+  glBegin(GL_TRIANGLE_STRIP);
+  glColor4f(0,1,0,.4); glNormal3f(0,0,1);  glTexCoord2f(0,1); glVertex2f(-1,  1);
+  glColor4f(1,0,0,.4); glNormal3f(0,0,1);  glTexCoord2f(0,0); glVertex2f(-1, -1);
+  glColor4f(0,0,1,.4); glNormal3f(0,0,1);  glTexCoord2f(1,1); glVertex2f( 1,  1);
+  glColor4f(1,1,1,.4); glNormal3f(0,0,1);  glTexCoord2f(1,0); glVertex2f( 1,  -1);
+#endif
+  glEnd();
+  glEndList();
+
+  quads = (struct quad *) malloc(sizeof(struct quad) * num_quads);
+  for (i=0; i < num_quads; i++)
+    {
+      quads[i].rx = 0.;
+      quads[i].ry = 0.;
+      quads[i].rz = 0.;
+      quads[i].tx = 0.;
+      quads[i].ty = 0.;
+      quads[i].tz = -10;
+
+      quads[i].drx = drand48() * 5.;
+      quads[i].dry = drand48() * 5.;
+      quads[i].drz = 0;
+    }
+}
+
+void initializeGL(GLsizei width, GLsizei height) 
+{
+  GLfloat fogColor[4] = { 0.1, 0.1, 0.1, 0.1 };
+
+  global_width=width;
+  global_height=height;
+
+  glViewport( 0, 0, width, height ); 
+  resetProjection();
+
+  if (do_depth)
+       glEnable(GL_DEPTH_TEST);
+
+  if (do_fps)
+       FPS_Setup();
+
+  if (do_antialias) {
+       do_blend = 1;
+       glEnable(GL_LINE_SMOOTH);
+  }
+
+  if (do_blend) {
+       glEnable(GL_BLEND);
+       glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+  }
+
+
+  if (do_light) {
+       glShadeModel(GL_SMOOTH);
+       glEnable(GL_COLOR_MATERIAL);
+       glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE);
+  }
+
+  if (do_wire)
+       glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
+  else 
+       glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
+
+  if (do_fog) {
+       glEnable(GL_FOG);
+       glFogi(GL_FOG_MODE, GL_LINEAR);
+       glFogfv(GL_FOG_COLOR, fogColor);
+       glFogf(GL_FOG_DENSITY, 0.35);
+/*     glHint(GL_FOG_HINT, GL_FASTEST); */
+       glFogf(GL_FOG_START, 50.0);
+       glFogf(GL_FOG_END, 100.0);
+  }
+       
+
+  if (do_texture)
+         Create_Texture(which_image); 
+
+  GenerateQuad();
+}
+void drawQuads(void) {
+  int i;
+  for (i=0; i < num_quads; i++)
+    {
+      glPushMatrix();
+      glTranslatef(quads[i].tx,0,0);
+      glTranslatef(0,quads[i].ty,0);
+      glTranslatef(0,0,quads[i].tz);
+      glRotatef(quads[i].rx, 1,0,0);
+      glRotatef(quads[i].ry, 0,1,0);
+      glRotatef(quads[i].rz, 0,0,1);
+      glCallList(quad_list);
+      glPopMatrix();
+
+      quads[i].rx += quads[i].drx;
+      quads[i].ry += quads[i].dry;
+      quads[i].rz += quads[i].drz;
+
+    }
+}
+
+GLvoid drawScene(GLvoid) 
+{
+
+  checkError(__LINE__, __FILE__);
+  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+  /* we have to do this here because the FPS meter turns these 3 features off!! */
+  {
+       if (do_light) {
+         glEnable(GL_LIGHTING);
+         glEnable(GL_LIGHT0);
+       }
+       
+       if (do_texture) {
+         glEnable(GL_TEXTURE_2D);
+       }
+       
+       if (do_blend) {
+         glEnable(GL_BLEND);
+         glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+       }
+  }
+
+  resetProjection();
+
+  /* use XYZ scaling factors to change the size of the pulsar */
+  glScalef(scale_x, scale_y, scale_z);
+  drawQuads();
+
+  /* update the scaling factors- cyclic */
+  scale_x = cos(frame/360.)*10.;
+  scale_y = sin(frame/360.)*10.;
+  scale_z = 1;
+
+  /* increment frame-counter */
+  frame++;
+
+  if (do_fps)
+       DoFPS();
+  checkError(__LINE__, __FILE__);
+}
+
+
+void draw_screensaver(ModeInfo * mi)
+{
+  screensaverstruct *gp = &Screensaver[MI_SCREEN(mi)];
+  Display    *display = MI_DISPLAY(mi);
+  Window      window = MI_WINDOW(mi);
+
+  if (!gp->glx_context)
+       return;
+
+  glXMakeCurrent(display, window, *(gp->glx_context));
+  drawScene();
+  glXSwapBuffers(display, window);
+}
+
+/* Standard reshape function */
+static void
+reshape(int width, int height)
+{
+  glViewport( 0, 0, global_width, global_height );
+  resetProjection();
+}
+
+void
+init_screensaver(ModeInfo * mi)
+{
+  int screen = MI_SCREEN(mi);
+
+  screensaverstruct *gp;
+
+  if (Screensaver == NULL) {
+       if ((Screensaver = (screensaverstruct *) calloc(MI_NUM_SCREENS(mi), sizeof (screensaverstruct))) == NULL)
+         return;
+  }
+  gp = &Screensaver[screen];
+
+  gp->window = MI_WINDOW(mi);
+  if ((gp->glx_context = init_GL(mi)) != NULL) {
+       reshape(MI_WIDTH(mi), MI_HEIGHT(mi));
+       initializeGL(MI_WIDTH(mi), MI_HEIGHT(mi));
+  } else {
+       MI_CLEARWINDOW(mi);
+  }
+}
+
+
+/* all sorts of nice cleanup code should go here! */
+void release_screensaver(ModeInfo * mi)
+{
+  int screen;
+  if (Screensaver != NULL) {
+       for (screen = 0; screen < MI_NUM_SCREENS(mi); screen++) {
+/*       screensaverstruct *gp = &Screensaver[screen];*/
+       }
+       (void) free((void *) Screensaver);
+       Screensaver = NULL;
+  }
+  free(quads);
+  FreeAllGL(mi);
+}
+#endif
+
diff --git a/hacks/glx/rubik.c b/hacks/glx/rubik.c
new file mode 100644 (file)
index 0000000..3c651a6
--- /dev/null
@@ -0,0 +1,1863 @@
+/* -*- Mode: C; tab-width: 4 -*- */
+/* rubik --- Shows a auto-solving Rubik's cube */
+
+#if !defined( lint ) && !defined( SABER )
+static const char sccsid[] = "@(#)rubik.c      4.07 97/11/24 xlockmore";
+
+#endif
+
+#undef DEBUG_LISTS
+#undef LMN
+
+/*-
+ * 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.
+ *
+ * This file is provided AS IS with no warranties of any kind.  The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof.  In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * This mode shows an auto-solving rubik's cube "puzzle". If somebody
+ * intends to make a game or something based on this code, please let me
+ * know first, my e-mail address is provided in this comment. Marcelo.
+ *
+ * Thanks goes also to Brian Paul for making it possible and inexpensive
+ * to use OpenGL at home.
+ *
+ * Since I'm not a native English speaker, my apologies for any grammatical
+ * mistake.
+ *
+ * My e-mail address is
+ * m-vianna@usa.net
+ *
+ * Marcelo F. Vianna (Jul-31-1997)
+ *
+ * Revision History:
+ * 26-Sep-98: Added some more movement (the cube do not stays in the screen
+ *            center anymore. Also fixed the scale problem imediatelly after
+ *            shuffling when the puzzle is solved.
+ * 08-Aug-97: Now has some internals from xrubik by David Bagley
+ *            This should make it easier to add features.
+ * 02-Aug-97: Now behaves more like puzzle.c: first show the cube being
+ *            shuffled and then being solved. A mode specific option was added:
+ *            "+/-hideshuffling" to provide the original behavior (in which
+ *            only the solution is shown).
+ *            The color labels corners are now rounded.
+ *            Optimized the cubit() routine using glLists.
+ * 01-Aug-97: Shuffling now avoids movements that undoes the previous movement
+ *            and three consecutive identical moves (which is pretty stupid).
+ *            improved the "cycles" option in replacement of David's hack,
+ *            now rp->anglestep is a GLfloat, so this option selects the
+ *            "exact" number of frames that a rotation (movement) takes to
+ *            complete.
+ * 30-Jul-97: Initial release, there is no algorithm to solve the puzzle,
+ *            instead, it randomly shuffle the cube and then make the
+ *            movements in the reverse order.
+ *            The mode was written in 1 day (I got sick and had the day off).
+ *            There was not much to do since I could not leave home... :)
+ *
+ */
+
+/*-
+ * Color labels mapping:
+ * =====================
+ *
+ *                       +------------+
+ *                       |0-->        |
+ *                       ||           |
+ *                       |v           |
+ *                       |   TOP(0)   |
+ *                       |            |
+ *                       |            |
+ *                       |           8|
+ *           +-----------+------------+-----------+
+ *           |0-->       |0-->        |0-->       |
+ *           ||          ||           ||          |
+ *           |v          |v           |v          |
+ *           |  LEFT(1)  |  FRONT(2)  |  RIGHT(3) |
+ *           |           |            |           |
+ *           |           |            |           |
+ *           |          8|           8|          8|
+ *           +-----------+------------+-----------+
+ *                       |0-->        |
+ *                       ||           |
+ *                       |v           |
+ *                       |  BOTTOM(4) |  rp->faces[N][X+AVSIZE*Y]=
+ *                       |            |         rp->cubeLoc[N][X+AVSIZE*Y]=
+ *                       |            | 
+ *                       |           8|         +---+---+---+
+ *                       +------------+         |   |   |   |
+ *                       |0-->        |         | 0 | 1 | 2 |
+ *                       ||           |         |---+---+---+
+ *                       |v           |         |  xxxxx(N) |
+ *                       |   BACK(5)  |         | 3 | 4 | 5 |
+ *                       |            |         +---+---+---+
+ *                       |            |         |   |   |  |
+ *                       |           8|         | 6 | 7 | 8 |
+ *                       +------------+         +---+---+---+
+ *
+ *  Map to 3d
+ *  FRONT  => X, Y
+ *  BACK   => X, Y
+ *  LEFT   => Z, Y
+ *  RIGHT  => Z, Y
+ *  TOP    => X, Z
+ *  BOTTOM => X, Z
+ */
+
+/*-
+ * PURIFY 3.0a on SunOS4 reports an unitialized memory read on each of
+ * the glCallList() functions below when using MesaGL 2.1.  This has
+ * been fixed in MesaGL 2.2 and later releases.
+ */
+
+/*-
+ * due to a Bug/feature in VMS X11/Intrinsic.h has to be placed before xlock.
+ * otherwise caddr_t is not defined correctly
+ */
+#include <X11/Intrinsic.h>
+
+#ifdef STANDALONE
+# define PROGCLASS     "Rubik"
+# define HACK_INIT     init_rubik
+# define HACK_DRAW     draw_rubik
+# define rubik_opts    xlockmore_opts
+# define DEFAULTS      "*delay: 40000 \n"              \
+                                       "*count: -30 \n"                \
+                                       "*cycles: 5 \n"                 \
+                                       "*size:  -6 \n"
+# include "xlockmore.h"                                /* from the xscreensaver distribution */
+#else /* !STANDALONE */
+# include "xlock.h"                                    /* from the xlockmore distribution */
+# include "vis.h"
+#endif /* !STANDALONE */
+
+#ifdef USE_GL
+
+#define DEF_HIDESHUFFLING     "False"
+
+static Bool hideshuffling;
+
+static XrmOptionDescRec opts[] =
+{
+  {"-hideshuffling", ".rubik.hideshuffling", XrmoptionNoArg, (caddr_t) "on"},
+  {"+hideshuffling", ".rubik.hideshuffling", XrmoptionNoArg, (caddr_t) "off"}
+};
+
+static argtype vars[] =
+{
+       {(caddr_t *) & hideshuffling, "hideshuffling", "Hideshuffling", DEF_HIDESHUFFLING, t_Bool}
+};
+
+static OptionStruct desc[] =
+{
+       {"-/+hideshuffling", "turn on/off hidden shuffle phase"}
+};
+
+ModeSpecOpt rubik_opts =
+{sizeof opts / sizeof opts[0], opts, sizeof vars / sizeof vars[0], vars, desc};
+
+#ifdef USE_MODULES
+ModStruct   rubik_description =
+{"rubik", "init_rubik", "draw_rubik", "release_rubik",
+ "draw_rubik", "change_rubik", NULL, &rubik_opts,
+ 10000, -30, 5, -6, 4, 1.0, "",
+ "Shows an auto-solving Rubik's Cube", 0, NULL};
+
+#endif
+
+#define VectMul(X1,Y1,Z1,X2,Y2,Z2) (Y1)*(Z2)-(Z1)*(Y2),(Z1)*(X2)-(X1)*(Z2),(X1)*(Y2)-(Y1)*(X2)
+#define sqr(A)                     ((A)*(A))
+
+#ifndef Pi
+#define Pi                         M_PI
+#endif
+
+
+#define ACTION_SOLVE    1
+#define ACTION_SHUFFLE  0
+
+#define DELAY_AFTER_SHUFFLING  5
+#define DELAY_AFTER_SOLVING   20
+
+/*************************************************************************/
+
+#define MINSIZE 2
+#ifdef LMN                     /* LxMxN not completed yet... */
+#define MAXSIZEX (rp->sizex)
+#define MAXSIZEY (rp->sizey)
+#define MAXSIZEZ (rp->sizez)
+#define AVSIZE (rp->avsize)
+#define MAXSIZE (rp->maxsize)
+#define AVSIZESQ (rp->avsizeSq)
+#define MAXSIZESQ (rp->maxsizeSq)
+#else
+#define MAXSIZEX (rp->size)
+#define MAXSIZEY (rp->size)
+#define MAXSIZEZ (rp->size)
+#define AVSIZE (rp->size)
+#define MAXSIZE (rp->size)
+#define AVSIZESQ (rp->sizeSq)
+#define MAXSIZESQ (rp->sizeSq)
+#endif
+#define MAXSIZEXY (MAXSIZEX*MAXSIZEY)
+#define MAXSIZEZY (MAXSIZEZ*MAXSIZEY)
+#define MAXSIZEXZ (MAXSIZEX*MAXSIZEZ)
+#define LASTX (MAXSIZEX-1)
+#define LASTY (MAXSIZEY-1)
+#define LASTZ (MAXSIZEZ-1)
+/* These are not likely to change but... */
+#define FIRSTX 0
+#define FIRSTY 0
+#define FIRSTZ 0
+
+#define Scale4Window               (0.9/AVSIZE)
+#define Scale4Iconic               (2.1/AVSIZE)
+
+#define MAXORIENT 4            /* Number of orientations of a square */
+#define MAXFACES 6             /* Number of faces */
+
+/* Directions relative to the face of a cubie */
+#define TOP 0
+#define RIGHT 1
+#define BOTTOM 2
+#define LEFT 3
+#define CW (MAXORIENT+1)
+#define CCW (2*MAXORIENT-1)
+
+#define TOP_FACE 0
+#define LEFT_FACE 1
+#define FRONT_FACE 2
+#define RIGHT_FACE 3
+#define BOTTOM_FACE 4
+#define BACK_FACE 5
+#define NO_FACE (MAXFACES)
+#define NO_ROTATION (2*MAXORIENT)
+#define NO_DEPTH MAXSIZE
+
+#define REVX(a) (MAXSIZEX - a - 1)
+#define REVY(a) (MAXSIZEY - a - 1)
+#define REVZ(a) (MAXSIZEZ - a - 1)
+
+typedef struct _RubikLoc {
+       int         face;
+       int         rotation;   /* Not used yet */
+} RubikLoc;
+
+typedef struct _RubikRowNext {
+       int         face, direction, sideFace;
+} RubikRowNext;
+
+typedef struct _RubikMove {
+       int         face, direction;
+       int         position;
+} RubikMove;
+
+typedef struct _RubikSlice {
+       int         face, rotation;
+       int         depth;
+} RubikSlice;
+
+/*-
+ * Pick a face and a direction on face the next face and orientation
+ * is then known.
+ */
+static RubikLoc slideNextRow[MAXFACES][MAXORIENT] =
+{
+       {
+               {5, TOP},
+               {3, RIGHT},
+               {2, TOP},
+               {1, LEFT}},
+       {
+               {0, RIGHT},
+               {2, TOP},
+               {4, LEFT},
+               {5, BOTTOM}},
+       {
+               {0, TOP},
+               {3, TOP},
+               {4, TOP},
+               {1, TOP}},
+       {
+               {0, LEFT},
+               {5, BOTTOM},
+               {4, RIGHT},
+               {2, TOP}},
+       {
+               {2, TOP},
+               {3, LEFT},
+               {5, TOP},
+               {1, RIGHT}},
+       {
+               {4, TOP},
+               {3, BOTTOM},
+               {0, TOP},
+               {1, BOTTOM}}
+};
+
+/*-
+ * Examine cubie 0 on each face, its 4 movements (well only 2 since the
+ * other 2 will be opposites) and translate it into slice movements).
+ * Beware.. using this for NxNxN makes some assumptions that referenced
+ * cubes are along the diagonal top-left to bottom-right.
+ * CW = DEEP Depth CCW == SHALLOW Depth with reference to faces 0, 1, and 2
+ */
+static RubikLoc rotateSlice[MAXFACES][MAXORIENT / 2] =
+{
+       {
+               {1, CCW},
+               {2, CW},
+       },
+       {
+               {2, CW},
+               {0, CCW},
+       },
+       {
+               {1, CCW},
+               {0, CCW},
+       },
+       {
+               {2, CCW},
+               {0, CCW},
+       },
+       {
+               {1, CCW},
+               {2, CCW},
+       },
+       {
+               {1, CCW},
+               {0, CW},
+       }
+};
+
+/*-
+ * Rotate face clockwise by a number of orients, then the top of the
+ * face then points to this face
+ */
+static int  rowToRotate[MAXFACES][MAXORIENT] =
+{
+       {3, 2, 1, 5},
+       {2, 4, 5, 0},
+       {3, 4, 1, 0},
+       {5, 4, 2, 0},
+       {3, 5, 1, 2},
+       {3, 0, 1, 4}
+};
+
+/* 
+ * This translates a clockwise move to something more manageable
+ */
+static RubikRowNext rotateToRow[MAXFACES] =    /*CW to min face */
+{
+       {1, LEFT, TOP},
+       {0, BOTTOM, LEFT},
+       {0, RIGHT, BOTTOM},
+       {0, TOP, RIGHT},
+       {1, RIGHT, BOTTOM},
+       {0, LEFT, TOP}
+};
+
+typedef struct {
+       GLint       WindH, WindW;
+       GLfloat     step;
+       RubikMove  *moves;
+       int         storedmoves;
+       int         shufflingmoves;
+#ifdef LMN                     /* Under construction */
+       int         sizex, sizey, sizez;
+       int         avsize, maxsize;
+       int         avsizeSq, maxsizeSq;
+#else
+       int         size, sizeSq;
+#endif
+       int         action;
+       int         done;
+       GLfloat     anglestep;
+       RubikLoc   *cubeLoc[MAXFACES];
+       RubikLoc   *rowLoc[MAXORIENT];
+       RubikMove   movement;
+       GLfloat     rotatestep;
+       GLfloat     PX, PY, VX, VY;
+       GLXContext *glx_context;
+       int         AreObjectsDefined[1];
+} rubikstruct;
+
+static float front_shininess[] =
+{60.0};
+static float front_specular[] =
+{0.7, 0.7, 0.7, 1.0};
+static float ambient[] =
+{0.0, 0.0, 0.0, 1.0};
+static float diffuse[] =
+{1.0, 1.0, 1.0, 1.0};
+static float position0[] =
+{1.0, 1.0, 1.0, 0.0};
+static float position1[] =
+{-1.0, -1.0, 1.0, 0.0};
+static float lmodel_ambient[] =
+{0.5, 0.5, 0.5, 1.0};
+static float lmodel_twoside[] =
+{GL_TRUE};
+
+static float MaterialRed[] =
+{0.5, 0.0, 0.0, 1.0};
+static float MaterialGreen[] =
+{0.0, 0.5, 0.0, 1.0};
+static float MaterialBlue[] =
+{0.0, 0.0, 0.5, 1.0};
+static float MaterialYellow[] =
+{0.7, 0.7, 0.0, 1.0};
+static float MaterialOrange[] =
+{0.9, 0.45, 0.36, 1.0};
+
+#if 0
+static float MaterialMagenta[] =
+{0.7, 0.0, 0.7, 1.0};
+static float MaterialCyan[] =
+{0.0, 0.7, 0.7, 1.0};
+
+#endif
+static float MaterialWhite[] =
+{0.8, 0.8, 0.8, 1.0};
+static float MaterialGray[] =
+{0.2, 0.2, 0.2, 1.0};
+static float MaterialGray3[] =
+{0.3, 0.3, 0.3, 1.0};
+static float MaterialGray4[] =
+{0.4, 0.4, 0.4, 1.0};
+static float MaterialGray5[] =
+{0.5, 0.5, 0.5, 1.0};
+static float MaterialGray6[] =
+{0.6, 0.6, 0.6, 1.0};
+static float MaterialGray7[] =
+{0.7, 0.7, 0.7, 1.0};
+
+static rubikstruct *rubik = NULL;
+static GLuint objects;
+
+#define ObjCubit        0
+
+static void
+pickcolor(int C, int mono)
+{
+       switch (C) {
+               case TOP_FACE:
+                       if (mono)
+                               glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialGray3);
+                       else
+                               glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialRed);
+                       break;
+               case LEFT_FACE:
+                       if (mono)
+                               glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialGray6);
+                       else
+                               glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialYellow);
+                       break;
+               case FRONT_FACE:
+                       glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialWhite);
+                       break;
+               case RIGHT_FACE:
+                       if (mono)
+                               glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialGray4);
+                       else
+                               glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialGreen);
+                       break;
+               case BOTTOM_FACE:
+                       if (mono)
+                               glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialGray7);
+                       else
+                               glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialOrange);
+                       break;
+               case BACK_FACE:
+                       if (mono)
+                               glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialGray5);
+                       else
+                               glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialBlue);
+                       break;
+#if 0
+                       glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialCyan);
+                       glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialMagenta);
+#endif
+       }
+}
+
+
+static void
+draw_cubit(ModeInfo * mi,
+          int back, int front, int left, int right, int bottom, int top)
+{
+       rubikstruct *rp = &rubik[MI_SCREEN(mi)];
+       int         mono = MI_IS_MONO(mi);
+
+       if (!rp->AreObjectsDefined[ObjCubit]) {
+               glNewList(objects + ObjCubit, GL_COMPILE_AND_EXECUTE);
+               glBegin(GL_QUADS);
+               glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialGray);
+               glNormal3f(0.00, 0.00, 1.00);
+               glVertex3f(-0.45, -0.45, 0.50);
+               glVertex3f(0.45, -0.45, 0.50);
+               glVertex3f(0.45, 0.45, 0.50);
+               glVertex3f(-0.45, 0.45, 0.50);
+               glNormal3f(0.00, 0.00, -1.00);
+               glVertex3f(-0.45, 0.45, -0.50);
+               glVertex3f(0.45, 0.45, -0.50);
+               glVertex3f(0.45, -0.45, -0.50);
+               glVertex3f(-0.45, -0.45, -0.50);
+               glNormal3f(-1.00, 0.00, 0.00);
+               glVertex3f(-0.50, -0.45, 0.45);
+               glVertex3f(-0.50, 0.45, 0.45);
+               glVertex3f(-0.50, 0.45, -0.45);
+               glVertex3f(-0.50, -0.45, -0.45);
+               glNormal3f(1.00, 0.00, 0.00);
+               glVertex3f(0.50, -0.45, -0.45);
+               glVertex3f(0.50, 0.45, -0.45);
+               glVertex3f(0.50, 0.45, 0.45);
+               glVertex3f(0.50, -0.45, 0.45);
+               glNormal3f(0.00, -1.00, 0.00);
+               glVertex3f(0.45, -0.50, -0.45);
+               glVertex3f(0.45, -0.50, 0.45);
+               glVertex3f(-0.45, -0.50, 0.45);
+               glVertex3f(-0.45, -0.50, -0.45);
+               glNormal3f(0.00, 1.00, 0.00);
+               glVertex3f(-0.45, 0.50, -0.45);
+               glVertex3f(-0.45, 0.50, 0.45);
+               glVertex3f(0.45, 0.50, 0.45);
+               glVertex3f(0.45, 0.50, -0.45);
+               glNormal3f(-1.00, -1.00, 0.00);
+               glVertex3f(-0.45, -0.50, -0.45);
+               glVertex3f(-0.45, -0.50, 0.45);
+               glVertex3f(-0.50, -0.45, 0.45);
+               glVertex3f(-0.50, -0.45, -0.45);
+               glNormal3f(1.00, 1.00, 0.00);
+               glVertex3f(0.45, 0.50, -0.45);
+               glVertex3f(0.45, 0.50, 0.45);
+               glVertex3f(0.50, 0.45, 0.45);
+               glVertex3f(0.50, 0.45, -0.45);
+               glNormal3f(-1.00, 1.00, 0.00);
+               glVertex3f(-0.50, 0.45, -0.45);
+               glVertex3f(-0.50, 0.45, 0.45);
+               glVertex3f(-0.45, 0.50, 0.45);
+               glVertex3f(-0.45, 0.50, -0.45);
+               glNormal3f(1.00, -1.00, 0.00);
+               glVertex3f(0.50, -0.45, -0.45);
+               glVertex3f(0.50, -0.45, 0.45);
+               glVertex3f(0.45, -0.50, 0.45);
+               glVertex3f(0.45, -0.50, -0.45);
+               glNormal3f(0.00, -1.00, -1.00);
+               glVertex3f(-0.45, -0.45, -0.50);
+               glVertex3f(0.45, -0.45, -0.50);
+               glVertex3f(0.45, -0.50, -0.45);
+               glVertex3f(-0.45, -0.50, -0.45);
+               glNormal3f(0.00, 1.00, 1.00);
+               glVertex3f(-0.45, 0.45, 0.50);
+               glVertex3f(0.45, 0.45, 0.50);
+               glVertex3f(0.45, 0.50, 0.45);
+               glVertex3f(-0.45, 0.50, 0.45);
+               glNormal3f(0.00, -1.00, 1.00);
+               glVertex3f(-0.45, -0.50, 0.45);
+               glVertex3f(0.45, -0.50, 0.45);
+               glVertex3f(0.45, -0.45, 0.50);
+               glVertex3f(-0.45, -0.45, 0.50);
+               glNormal3f(0.00, 1.00, -1.00);
+               glVertex3f(-0.45, 0.50, -0.45);
+               glVertex3f(0.45, 0.50, -0.45);
+               glVertex3f(0.45, 0.45, -0.50);
+               glVertex3f(-0.45, 0.45, -0.50);
+               glNormal3f(-1.00, 0.00, -1.00);
+               glVertex3f(-0.50, -0.45, -0.45);
+               glVertex3f(-0.50, 0.45, -0.45);
+               glVertex3f(-0.45, 0.45, -0.50);
+               glVertex3f(-0.45, -0.45, -0.50);
+               glNormal3f(1.00, 0.00, 1.00);
+               glVertex3f(0.50, -0.45, 0.45);
+               glVertex3f(0.50, 0.45, 0.45);
+               glVertex3f(0.45, 0.45, 0.50);
+               glVertex3f(0.45, -0.45, 0.50);
+               glNormal3f(1.00, 0.00, -1.00);
+               glVertex3f(0.45, -0.45, -0.50);
+               glVertex3f(0.45, 0.45, -0.50);
+               glVertex3f(0.50, 0.45, -0.45);
+               glVertex3f(0.50, -0.45, -0.45);
+               glNormal3f(-1.00, 0.00, 1.00);
+               glVertex3f(-0.45, -0.45, 0.50);
+               glVertex3f(-0.45, 0.45, 0.50);
+               glVertex3f(-0.50, 0.45, 0.45);
+               glVertex3f(-0.50, -0.45, 0.45);
+               glEnd();
+               glBegin(GL_TRIANGLES);
+               glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialGray);
+               glNormal3f(1.00, 1.00, 1.00);
+               glVertex3f(0.45, 0.45, 0.50);
+               glVertex3f(0.50, 0.45, 0.45);
+               glVertex3f(0.45, 0.50, 0.45);
+               glNormal3f(-1.00, -1.00, -1.00);
+               glVertex3f(-0.45, -0.50, -0.45);
+               glVertex3f(-0.50, -0.45, -0.45);
+               glVertex3f(-0.45, -0.45, -0.50);
+               glNormal3f(-1.00, 1.00, 1.00);
+               glVertex3f(-0.45, 0.45, 0.50);
+               glVertex3f(-0.45, 0.50, 0.45);
+               glVertex3f(-0.50, 0.45, 0.45);
+               glNormal3f(1.00, -1.00, -1.00);
+               glVertex3f(0.50, -0.45, -0.45);
+               glVertex3f(0.45, -0.50, -0.45);
+               glVertex3f(0.45, -0.45, -0.50);
+               glNormal3f(1.00, -1.00, 1.00);
+               glVertex3f(0.45, -0.45, 0.50);
+               glVertex3f(0.45, -0.50, 0.45);
+               glVertex3f(0.50, -0.45, 0.45);
+               glNormal3f(-1.00, 1.00, -1.00);
+               glVertex3f(-0.50, 0.45, -0.45);
+               glVertex3f(-0.45, 0.50, -0.45);
+               glVertex3f(-0.45, 0.45, -0.50);
+               glNormal3f(-1.00, -1.00, 1.00);
+               glVertex3f(-0.45, -0.45, 0.50);
+               glVertex3f(-0.50, -0.45, 0.45);
+               glVertex3f(-0.45, -0.50, 0.45);
+               glNormal3f(1.00, 1.00, -1.00);
+               glVertex3f(0.50, 0.45, -0.45);
+               glVertex3f(0.45, 0.45, -0.50);
+               glVertex3f(0.45, 0.50, -0.45);
+               glEnd();
+               glEndList();
+               rp->AreObjectsDefined[ObjCubit] = 1;
+#ifdef DEBUG_LISTS
+               (void) printf("Cubit drawn SLOWLY\n");
+#endif
+       } else {
+               glCallList(objects + ObjCubit);
+#ifdef DEBUG_LISTS
+               (void) printf("Cubit drawn quickly\n");
+#endif
+       }
+
+       if (back != NO_FACE) {
+               glBegin(GL_POLYGON);
+               pickcolor(back, mono);
+               glNormal3f(0.00, 0.00, -1.00);
+               glVertex3f(-0.35, 0.40, -0.51);
+               glVertex3f(0.35, 0.40, -0.51);
+               glVertex3f(0.40, 0.35, -0.51);
+               glVertex3f(0.40, -0.35, -0.51);
+               glVertex3f(0.35, -0.40, -0.51);
+               glVertex3f(-0.35, -0.40, -0.51);
+               glVertex3f(-0.40, -0.35, -0.51);
+               glVertex3f(-0.40, 0.35, -0.51);
+               glEnd();
+       }
+       if (front != NO_FACE) {
+               glBegin(GL_POLYGON);
+               pickcolor(front, mono);
+               glNormal3f(0.00, 0.00, 1.00);
+               glVertex3f(-0.35, -0.40, 0.51);
+               glVertex3f(0.35, -0.40, 0.51);
+               glVertex3f(0.40, -0.35, 0.51);
+               glVertex3f(0.40, 0.35, 0.51);
+               glVertex3f(0.35, 0.40, 0.51);
+               glVertex3f(-0.35, 0.40, 0.51);
+               glVertex3f(-0.40, 0.35, 0.51);
+               glVertex3f(-0.40, -0.35, 0.51);
+               glEnd();
+       }
+       if (left != NO_FACE) {
+               glBegin(GL_POLYGON);
+               pickcolor(left, mono);
+               glNormal3f(-1.00, 0.00, 0.00);
+               glVertex3f(-0.51, -0.35, 0.40);
+               glVertex3f(-0.51, 0.35, 0.40);
+               glVertex3f(-0.51, 0.40, 0.35);
+               glVertex3f(-0.51, 0.40, -0.35);
+               glVertex3f(-0.51, 0.35, -0.40);
+               glVertex3f(-0.51, -0.35, -0.40);
+               glVertex3f(-0.51, -0.40, -0.35);
+               glVertex3f(-0.51, -0.40, 0.35);
+               glEnd();
+       }
+       if (right != NO_FACE) {
+               glBegin(GL_POLYGON);
+               pickcolor(right, mono);
+               glNormal3f(1.00, 0.00, 0.00);
+               glVertex3f(0.51, -0.35, -0.40);
+               glVertex3f(0.51, 0.35, -0.40);
+               glVertex3f(0.51, 0.40, -0.35);
+               glVertex3f(0.51, 0.40, 0.35);
+               glVertex3f(0.51, 0.35, 0.40);
+               glVertex3f(0.51, -0.35, 0.40);
+               glVertex3f(0.51, -0.40, 0.35);
+               glVertex3f(0.51, -0.40, -0.35);
+               glEnd();
+       }
+       if (bottom != NO_FACE) {
+               glBegin(GL_POLYGON);
+               pickcolor(bottom, mono);
+               glNormal3f(0.00, -1.00, 0.00);
+               glVertex3f(0.40, -0.51, -0.35);
+               glVertex3f(0.40, -0.51, 0.35);
+               glVertex3f(0.35, -0.51, 0.40);
+               glVertex3f(-0.35, -0.51, 0.40);
+               glVertex3f(-0.40, -0.51, 0.35);
+               glVertex3f(-0.40, -0.51, -0.35);
+               glVertex3f(-0.35, -0.51, -0.40);
+               glVertex3f(0.35, -0.51, -0.40);
+               glEnd();
+       }
+       if (top != NO_FACE) {
+               glBegin(GL_POLYGON);
+               pickcolor(top, mono);
+               glNormal3f(0.00, 1.00, 0.00);
+               glVertex3f(-0.40, 0.51, -0.35);
+               glVertex3f(-0.40, 0.51, 0.35);
+               glVertex3f(-0.35, 0.51, 0.40);
+               glVertex3f(0.35, 0.51, 0.40);
+               glVertex3f(0.40, 0.51, 0.35);
+               glVertex3f(0.40, 0.51, -0.35);
+               glVertex3f(0.35, 0.51, -0.40);
+               glVertex3f(-0.35, 0.51, -0.40);
+               glEnd();
+       }
+}
+
+
+static      RubikSlice
+convertMove(rubikstruct * rp, RubikMove move)
+{
+       RubikSlice  slice;
+       RubikLoc    plane;
+
+       plane = rotateSlice[(int) move.face][move.direction % 2];
+       slice.face = plane.face;
+       slice.rotation = plane.rotation;
+       if (slice.rotation == CW)       /* I just know this to be true... */
+               slice.depth = AVSIZESQ - 1 - move.position;
+       else
+               slice.depth = move.position;
+       slice.depth = slice.depth / AVSIZE;
+       /* If slice.depth = 0 then face 0, face 1, or face 2 moves */
+       if (move.direction / 2)
+               slice.rotation = (plane.rotation == CW) ? CCW : CW;
+       return slice;
+}
+
+/* Assume for the moment that the size is at least 2 */
+static void
+draw_cube(ModeInfo * mi)
+{
+#define S1 1
+#define SX ((GLint)S1*(MAXSIZEX-1))
+#define SY ((GLint)S1*(MAXSIZEY-1))
+#define SZ ((GLint)S1*(MAXSIZEZ-1))
+#define HALFX (((GLfloat)MAXSIZEX-1.0)/2.0)
+#define HALFY (((GLfloat)MAXSIZEY-1.0)/2.0)
+#define HALFZ (((GLfloat)MAXSIZEZ-1.0)/2.0)
+#define MIDX(a) (((GLfloat)(2*a-MAXSIZEX+1))/2.0)
+#define MIDY(a) (((GLfloat)(2*a-MAXSIZEY+1))/2.0)
+#define MIDZ(a) (((GLfloat)(2*a-MAXSIZEZ+1))/2.0)
+       rubikstruct *rp = &rubik[MI_SCREEN(mi)];
+       RubikSlice  slice;
+       GLfloat     rotatestep;
+       int         i, j, k;
+
+       if (rp->movement.face == NO_FACE) {
+               slice.face = NO_FACE;
+               slice.rotation = NO_ROTATION;
+               slice.depth = NO_DEPTH;
+       } else {
+               slice = convertMove(rp, rp->movement);
+       }
+       rotatestep = (slice.rotation == CCW) ? rp->rotatestep : -rp->rotatestep;
+
+/*-
+ * The glRotatef() routine transforms the coordinate system for every future
+ * vertex specification (this is not so simple, but by now comprehending this
+ * is sufficient). So if you want to rotate the inner slice, you can draw
+ * one slice, rotate the anglestep for the centerslice, draw the inner slice,
+ * rotate reversely and draw the other slice.
+ * There is a sequence for drawing cubies for each axis being moved...
+ */
+       switch (slice.face) {
+               case NO_FACE:
+               case TOP_FACE:  /* BOTTOM_FACE too */
+                       glPushMatrix();
+                       if (slice.depth == MAXSIZEY - 1)
+                               glRotatef(rotatestep, 0, HALFY, 0);
+
+                       glTranslatef(-HALFX, -HALFY, -HALFZ);
+                       draw_cubit(mi,
+                                  rp->cubeLoc[BACK_FACE][FIRSTX + MAXSIZEX * FIRSTY].face, NO_FACE,
+                                  rp->cubeLoc[LEFT_FACE][FIRSTZ + MAXSIZEZ * LASTY].face, NO_FACE,
+                                  rp->cubeLoc[BOTTOM_FACE][FIRSTX + MAXSIZEX * LASTZ].face, NO_FACE);
+                       for (k = 1; k < MAXSIZEZ - 1; k++) {
+                               glTranslatef(0, 0, S1);
+                               draw_cubit(mi,
+                                          NO_FACE, NO_FACE,
+                                          rp->cubeLoc[LEFT_FACE][k + MAXSIZEZ * LASTY].face, NO_FACE,
+                                          rp->cubeLoc[BOTTOM_FACE][FIRSTX + MAXSIZEX * REVZ(k)].face, NO_FACE);
+                       }
+                       glTranslatef(0, 0, S1);
+                       draw_cubit(mi,
+                                  NO_FACE, rp->cubeLoc[FRONT_FACE][FIRSTX + MAXSIZEX * LASTY].face,
+                                  rp->cubeLoc[LEFT_FACE][LASTZ + MAXSIZEZ * LASTY].face, NO_FACE,
+                                  rp->cubeLoc[BOTTOM_FACE][FIRSTX + MAXSIZEX * FIRSTZ].face, NO_FACE);
+                       for (i = 1; i < MAXSIZEX - 1; i++) {
+                               glTranslatef(S1, 0, -SZ);
+                               draw_cubit(mi,
+                                          rp->cubeLoc[BACK_FACE][i + MAXSIZEX * FIRSTY].face, NO_FACE,
+                                          NO_FACE, NO_FACE,
+                                          rp->cubeLoc[BOTTOM_FACE][i + MAXSIZEX * LASTZ].face, NO_FACE);
+                               for (k = 1; k < MAXSIZEZ - 1; k++) {
+                                       glTranslatef(0, 0, S1);
+                                       draw_cubit(mi,
+                                                  NO_FACE, NO_FACE,
+                                                  NO_FACE, NO_FACE,
+                                                  rp->cubeLoc[BOTTOM_FACE][i + MAXSIZEX * REVZ(k)].face, NO_FACE);
+                               }
+                               glTranslatef(0, 0, S1);
+                               draw_cubit(mi,
+                                          NO_FACE, rp->cubeLoc[FRONT_FACE][i + MAXSIZEX * LASTY].face,
+                                          NO_FACE, NO_FACE,
+                                          rp->cubeLoc[BOTTOM_FACE][i + MAXSIZEX * FIRSTZ].face, NO_FACE);
+                       }
+                       glTranslatef(1, 0, -SZ);
+                       draw_cubit(mi,
+                                  rp->cubeLoc[BACK_FACE][LASTX + MAXSIZEX * FIRSTY].face, NO_FACE,
+                                  NO_FACE, rp->cubeLoc[RIGHT_FACE][LASTZ + MAXSIZEZ * LASTY].face,
+                                  rp->cubeLoc[BOTTOM_FACE][LASTX + MAXSIZEX * LASTZ].face, NO_FACE);
+                       for (k = 1; k < MAXSIZEZ - 1; k++) {
+                               glTranslatef(0, 0, S1);
+                               draw_cubit(mi,
+                                          NO_FACE, NO_FACE,
+                                          NO_FACE, rp->cubeLoc[RIGHT_FACE][REVZ(k) + MAXSIZEZ * LASTY].face,
+                                          rp->cubeLoc[BOTTOM_FACE][LASTX + MAXSIZEX * REVZ(k)].face, NO_FACE);
+                       }
+                       glTranslatef(0, 0, S1);
+                       draw_cubit(mi,
+                                  NO_FACE, rp->cubeLoc[FRONT_FACE][LASTX + MAXSIZEX * LASTY].face,
+                                  NO_FACE, rp->cubeLoc[RIGHT_FACE][FIRSTZ + MAXSIZEZ * LASTY].face,
+                                  rp->cubeLoc[BOTTOM_FACE][LASTX + MAXSIZEX * FIRSTZ].face, NO_FACE);
+                       glPopMatrix();
+                       for (j = 1; j < MAXSIZEY - 1; j++) {
+                               glPushMatrix();
+                               if (slice.depth == REVY(j))
+                                       glRotatef(rotatestep, 0, HALFY, 0);
+                               glTranslatef(-HALFX, MIDY(j), -HALFZ);
+                               draw_cubit(mi,
+                                          rp->cubeLoc[BACK_FACE][FIRSTX + MAXSIZEX * j].face, NO_FACE,
+                                          rp->cubeLoc[LEFT_FACE][FIRSTZ + MAXSIZEZ * REVY(j)].face, NO_FACE,
+                                          NO_FACE, NO_FACE);
+                               for (k = 1; k < MAXSIZEZ - 1; k++) {
+                                       glTranslatef(0, 0, S1);
+                                       draw_cubit(mi,
+                                                  NO_FACE, NO_FACE,
+                                                  rp->cubeLoc[LEFT_FACE][k + MAXSIZEZ * REVY(j)].face, NO_FACE,
+                                                  NO_FACE, NO_FACE);
+                               }
+                               glTranslatef(0, 0, S1);
+                               draw_cubit(mi,
+                                          NO_FACE, rp->cubeLoc[FRONT_FACE][FIRSTX + MAXSIZEX * REVY(j)].face,
+                                          rp->cubeLoc[LEFT_FACE][LASTZ + MAXSIZEZ * REVY(j)].face, NO_FACE,
+                                          NO_FACE, NO_FACE);
+                               for (i = 1; i < MAXSIZEX - 1; i++) {
+                                       glTranslatef(1, 0, -SZ);
+                                       draw_cubit(mi,
+                                                  rp->cubeLoc[BACK_FACE][i + MAXSIZEX * j].face, NO_FACE,
+                                                  NO_FACE, NO_FACE,
+                                                  NO_FACE, NO_FACE);
+                                       /* Center */
+                                       glTranslatef(0, 0, SZ);
+                                       draw_cubit(mi,
+                                                  NO_FACE, rp->cubeLoc[FRONT_FACE][i + MAXSIZEX * REVY(j)].face,
+                                                  NO_FACE, NO_FACE,
+                                                  NO_FACE, NO_FACE);
+                               }
+                               glTranslatef(S1, 0, -SZ);
+                               draw_cubit(mi,
+                                          rp->cubeLoc[BACK_FACE][LASTX + MAXSIZEX * j].face, NO_FACE,
+                                          NO_FACE, rp->cubeLoc[RIGHT_FACE][LASTZ + MAXSIZEZ * REVY(j)].face,
+                                          NO_FACE, NO_FACE);
+                               for (k = 1; k < MAXSIZEZ - 1; k++) {
+                                       glTranslatef(0, 0, S1);
+                                       draw_cubit(mi,
+                                                  NO_FACE, NO_FACE,
+                                                  NO_FACE, rp->cubeLoc[RIGHT_FACE][REVZ(k) + MAXSIZEZ * REVY(j)].face,
+                                                  NO_FACE, NO_FACE);
+                               }
+                               glTranslatef(0, 0, S1);
+                               draw_cubit(mi,
+                                          NO_FACE, rp->cubeLoc[FRONT_FACE][LASTX + MAXSIZEX * REVY(j)].face,
+                                          NO_FACE, rp->cubeLoc[RIGHT_FACE][FIRSTZ + MAXSIZEZ * REVY(j)].face,
+                                          NO_FACE, NO_FACE);
+                               glPopMatrix();
+                       }
+                       if (slice.depth == 0)
+                               glRotatef(rotatestep, 0, HALFY, 0);
+
+                       glTranslatef(-HALFX, HALFY, -HALFZ);
+                       draw_cubit(mi,
+                                  rp->cubeLoc[BACK_FACE][FIRSTX + MAXSIZEX * LASTY].face, NO_FACE,
+                                  rp->cubeLoc[LEFT_FACE][FIRSTZ + MAXSIZEZ * FIRSTY].face, NO_FACE,
+                                  NO_FACE, rp->cubeLoc[TOP_FACE][FIRSTX + MAXSIZEX * FIRSTZ].face);
+                       for (k = 1; k < MAXSIZEZ - 1; k++) {
+                               glTranslatef(0, 0, S1);
+                               draw_cubit(mi,
+                                          NO_FACE, NO_FACE,
+                                          rp->cubeLoc[LEFT_FACE][k + MAXSIZEZ * FIRSTY].face, NO_FACE,
+                                          NO_FACE, rp->cubeLoc[TOP_FACE][FIRSTX + MAXSIZEX * k].face);
+                       }
+                       glTranslatef(0, 0, S1);
+                       draw_cubit(mi,
+                                  NO_FACE, rp->cubeLoc[FRONT_FACE][FIRSTX + MAXSIZEX * FIRSTY].face,
+                                  rp->cubeLoc[LEFT_FACE][LASTZ + MAXSIZEZ * FIRSTY].face, NO_FACE,
+                                  NO_FACE, rp->cubeLoc[TOP_FACE][FIRSTX + MAXSIZEX * LASTZ].face);
+                       for (i = 1; i < MAXSIZEX - 1; i++) {
+                               glTranslatef(S1, 0, -SZ);
+                               draw_cubit(mi,
+                                          rp->cubeLoc[BACK_FACE][i + MAXSIZEX * LASTY].face, NO_FACE,
+                                          NO_FACE, NO_FACE,
+                                          NO_FACE, rp->cubeLoc[TOP_FACE][i + MAXSIZEX * FIRSTZ].face);
+                               for (k = 1; k < MAXSIZEZ - 1; k++) {
+                                       glTranslatef(0, 0, S1);
+                                       draw_cubit(mi,
+                                                  NO_FACE, NO_FACE,
+                                                  NO_FACE, NO_FACE,
+                                                  NO_FACE, rp->cubeLoc[TOP_FACE][i + MAXSIZEX * k].face);
+                               }
+                               glTranslatef(0, 0, S1);
+                               draw_cubit(mi,
+                                          NO_FACE, rp->cubeLoc[FRONT_FACE][i + MAXSIZEX * FIRSTY].face,
+                                          NO_FACE, NO_FACE,
+                                          NO_FACE, rp->cubeLoc[TOP_FACE][i + MAXSIZEX * LASTZ].face);
+                       }
+                       glTranslatef(S1, 0, -SZ);
+                       draw_cubit(mi,
+                                  rp->cubeLoc[BACK_FACE][LASTX + MAXSIZEX * LASTY].face, NO_FACE,
+                                  NO_FACE, rp->cubeLoc[RIGHT_FACE][LASTZ + MAXSIZEZ * FIRSTY].face,
+                                  NO_FACE, rp->cubeLoc[TOP_FACE][LASTX + MAXSIZEX * FIRSTZ].face);
+                       for (k = 1; k < MAXSIZEZ - 1; k++) {
+                               glTranslatef(0, 0, S1);
+                               draw_cubit(mi,
+                                          NO_FACE, NO_FACE,
+                                          NO_FACE, rp->cubeLoc[RIGHT_FACE][REVZ(k) + MAXSIZEZ * FIRSTY].face,
+                                          NO_FACE, rp->cubeLoc[TOP_FACE][LASTX + MAXSIZEX * k].face);
+                       }
+                       glTranslatef(0, 0, S1);
+                       draw_cubit(mi,
+                                  NO_FACE, rp->cubeLoc[FRONT_FACE][LASTX + MAXSIZEX * FIRSTY].face,
+                                  NO_FACE, rp->cubeLoc[RIGHT_FACE][FIRSTZ + MAXSIZEZ * FIRSTY].face,
+                                  NO_FACE, rp->cubeLoc[TOP_FACE][LASTX + MAXSIZEX * LASTZ].face);
+                       break;
+               case LEFT_FACE: /* RIGHT_FACE too */
+                       /* rotatestep is negative because the RIGHT face is the default here */
+                       glPushMatrix();
+                       if (slice.depth == 0)
+                               glRotatef(-rotatestep, HALFX, 0, 0);
+
+                       glTranslatef(-HALFX, -HALFY, -HALFZ);
+                       draw_cubit(mi,
+                                  rp->cubeLoc[BACK_FACE][FIRSTX + MAXSIZEX * FIRSTY].face, NO_FACE,
+                                  rp->cubeLoc[LEFT_FACE][FIRSTZ + MAXSIZEZ * LASTY].face, NO_FACE,
+                                  rp->cubeLoc[BOTTOM_FACE][FIRSTX + MAXSIZEX * LASTZ].face, NO_FACE);
+                       for (j = 1; j < MAXSIZEY - 1; j++) {
+                               glTranslatef(0, S1, 0);
+                               draw_cubit(mi,
+                                          rp->cubeLoc[BACK_FACE][FIRSTX + MAXSIZEX * j].face, NO_FACE,
+                                          rp->cubeLoc[LEFT_FACE][FIRSTZ + MAXSIZEZ * REVY(j)].face, NO_FACE,
+                                          NO_FACE, NO_FACE);
+                       }
+                       glTranslatef(0, S1, 0);
+                       draw_cubit(mi,
+                                  rp->cubeLoc[BACK_FACE][FIRSTX + MAXSIZEX * LASTY].face, NO_FACE,
+                                  rp->cubeLoc[LEFT_FACE][FIRSTZ + MAXSIZEZ * FIRSTY].face, NO_FACE,
+                                  NO_FACE, rp->cubeLoc[TOP_FACE][FIRSTX + MAXSIZEX * FIRSTZ].face);
+                       for (k = 1; k < MAXSIZEZ - 1; k++) {
+                               glTranslatef(0, -SY, S1);
+                               draw_cubit(mi,
+                                          NO_FACE, NO_FACE,
+                                          rp->cubeLoc[LEFT_FACE][k + MAXSIZEZ * LASTY].face, NO_FACE,
+                                          rp->cubeLoc[BOTTOM_FACE][FIRSTX + MAXSIZEX * REVZ(k)].face, NO_FACE);
+                               for (j = 1; j < MAXSIZEY - 1; j++) {
+                                       glTranslatef(0, S1, 0);
+                                       draw_cubit(mi,
+                                                  NO_FACE, NO_FACE,
+                                                  rp->cubeLoc[LEFT_FACE][k + MAXSIZEZ * REVY(j)].face, NO_FACE,
+                                                  NO_FACE, NO_FACE);
+                               }
+                               glTranslatef(0, S1, 0);
+                               draw_cubit(mi,
+                                          NO_FACE, NO_FACE,
+                                          rp->cubeLoc[LEFT_FACE][k + MAXSIZEZ * FIRSTY].face, NO_FACE,
+                                          NO_FACE, rp->cubeLoc[TOP_FACE][FIRSTX + MAXSIZEX * k].face);
+                       }
+                       glTranslatef(0, -SY, S1);
+                       draw_cubit(mi,
+                                  NO_FACE, rp->cubeLoc[FRONT_FACE][FIRSTX + MAXSIZEX * LASTY].face,
+                                  rp->cubeLoc[LEFT_FACE][LASTZ + MAXSIZEZ * LASTY].face, NO_FACE,
+                                  rp->cubeLoc[BOTTOM_FACE][FIRSTX + MAXSIZEX * FIRSTZ].face, NO_FACE);
+                       for (j = 1; j < MAXSIZEY - 1; j++) {
+                               glTranslatef(0, S1, 0);
+                               draw_cubit(mi,
+                                          NO_FACE, rp->cubeLoc[FRONT_FACE][FIRSTX + MAXSIZEX * REVY(j)].face,
+                                          rp->cubeLoc[LEFT_FACE][LASTZ + MAXSIZEZ * REVY(j)].face, NO_FACE,
+                                          NO_FACE, NO_FACE);
+                       }
+                       glTranslatef(0, S1, 0);
+                       draw_cubit(mi,
+                                  NO_FACE, rp->cubeLoc[FRONT_FACE][FIRSTX + MAXSIZEX * FIRSTY].face,
+                                  rp->cubeLoc[LEFT_FACE][LASTZ + MAXSIZEZ * FIRSTY].face, NO_FACE,
+                                  NO_FACE, rp->cubeLoc[TOP_FACE][FIRSTX + MAXSIZEX * LASTZ].face);
+                       glPopMatrix();
+                       for (i = 1; i < MAXSIZEX - 1; i++) {
+                               glPushMatrix();
+                               if (slice.depth == i)
+                                       glRotatef(-rotatestep, HALFX, 0, 0);
+                               glTranslatef(MIDX(i), -HALFY, -HALFZ);
+                               draw_cubit(mi,
+                                          rp->cubeLoc[BACK_FACE][i + MAXSIZEX * FIRSTY].face, NO_FACE,
+                                          NO_FACE, NO_FACE,
+                                          rp->cubeLoc[BOTTOM_FACE][i + MAXSIZEX * LASTZ].face, NO_FACE);
+                               for (j = 1; j < MAXSIZEY - 1; j++) {
+                                       glTranslatef(0, S1, 0);
+                                       draw_cubit(mi,
+                                                  rp->cubeLoc[BACK_FACE][i + MAXSIZEX * j].face, NO_FACE,
+                                                  NO_FACE, NO_FACE,
+                                                  NO_FACE, NO_FACE);
+                               }
+                               glTranslatef(0, S1, 0);
+                               draw_cubit(mi,
+                                          rp->cubeLoc[BACK_FACE][i + MAXSIZEX * LASTY].face, NO_FACE,
+                                          NO_FACE, NO_FACE,
+                                          NO_FACE, rp->cubeLoc[TOP_FACE][i + MAXSIZEX * FIRSTZ].face);
+                               for (k = 1; k < MAXSIZEZ - 1; k++) {
+                                       glTranslatef(0, -SY, S1);
+                                       draw_cubit(mi,
+                                                  NO_FACE, NO_FACE,
+                                                  NO_FACE, NO_FACE,
+                                                  rp->cubeLoc[BOTTOM_FACE][i + MAXSIZEX * REVZ(k)].face, NO_FACE);
+                                       /* Center */
+                                       glTranslatef(0, SY, 0);
+                                       draw_cubit(mi,
+                                                  NO_FACE, NO_FACE,
+                                                  NO_FACE, NO_FACE,
+                                                  NO_FACE, rp->cubeLoc[TOP_FACE][i + MAXSIZEX * k].face);
+                               }
+                               glTranslatef(0, -SY, S1);
+                               draw_cubit(mi,
+                                          NO_FACE, rp->cubeLoc[FRONT_FACE][i + MAXSIZEX * LASTY].face,
+                                          NO_FACE, NO_FACE,
+                                          rp->cubeLoc[BOTTOM_FACE][i + MAXSIZEX * FIRSTZ].face, NO_FACE);
+                               for (j = 1; j < MAXSIZEY - 1; j++) {
+                                       glTranslatef(0, S1, 0);
+                                       draw_cubit(mi,
+                                                  NO_FACE, rp->cubeLoc[FRONT_FACE][i + MAXSIZEX * REVY(j)].face,
+                                                  NO_FACE, NO_FACE,
+                                                  NO_FACE, NO_FACE);
+                               }
+                               glTranslatef(0, S1, 0);
+                               draw_cubit(mi,
+                                          NO_FACE, rp->cubeLoc[FRONT_FACE][i + MAXSIZEX * FIRSTY].face,
+                                          NO_FACE, NO_FACE,
+                                          NO_FACE, rp->cubeLoc[TOP_FACE][i + MAXSIZEX * LASTZ].face);
+                               glPopMatrix();
+                       }
+                       if (slice.depth == MAXSIZEX - 1)
+                               glRotatef(-rotatestep, HALFX, 0, 0);
+                       glTranslatef(HALFX, -HALFY, -HALFZ);
+                       draw_cubit(mi,
+                                  rp->cubeLoc[BACK_FACE][LASTX + MAXSIZEX * FIRSTY].face, NO_FACE,
+                                  NO_FACE, rp->cubeLoc[RIGHT_FACE][LASTZ + MAXSIZEZ * LASTY].face,
+                                  rp->cubeLoc[BOTTOM_FACE][LASTX + MAXSIZEX * LASTZ].face, NO_FACE);
+                       for (j = 1; j < MAXSIZEY - 1; j++) {
+                               glTranslatef(0, S1, 0);
+                               draw_cubit(mi,
+                                          rp->cubeLoc[BACK_FACE][LASTX + MAXSIZEX * j].face, NO_FACE,
+                                          NO_FACE, rp->cubeLoc[RIGHT_FACE][LASTZ + MAXSIZEZ * REVY(j)].face,
+                                          NO_FACE, NO_FACE);
+                       }
+                       glTranslatef(0, S1, 0);
+                       draw_cubit(mi,
+                                  rp->cubeLoc[BACK_FACE][LASTX + MAXSIZEX * LASTY].face, NO_FACE,
+                                  NO_FACE, rp->cubeLoc[RIGHT_FACE][LASTZ + MAXSIZEZ * FIRSTY].face,
+                                  NO_FACE, rp->cubeLoc[TOP_FACE][LASTX + MAXSIZEX * FIRSTZ].face);
+                       for (k = 1; k < MAXSIZEZ - 1; k++) {
+                               glTranslatef(0, -SY, S1);
+                               draw_cubit(mi,
+                                          NO_FACE, NO_FACE,
+                                          NO_FACE, rp->cubeLoc[RIGHT_FACE][REVZ(k) + MAXSIZEZ * LASTY].face,
+                                          rp->cubeLoc[BOTTOM_FACE][LASTX + MAXSIZEX * REVZ(k)].face, NO_FACE);
+                               for (j = 1; j < MAXSIZEY - 1; j++) {
+                                       glTranslatef(0, S1, 0);
+                                       draw_cubit(mi,
+                                                  NO_FACE, NO_FACE,
+                                                  NO_FACE, rp->cubeLoc[RIGHT_FACE][REVZ(k) + MAXSIZEZ * REVY(j)].face,
+                                                  NO_FACE, NO_FACE);
+                               }
+                               glTranslatef(0, S1, 0);
+                               draw_cubit(mi,
+                                          NO_FACE, NO_FACE,
+                                          NO_FACE, rp->cubeLoc[RIGHT_FACE][REVZ(k) + MAXSIZEZ * FIRSTY].face,
+                                          NO_FACE, rp->cubeLoc[TOP_FACE][LASTX + MAXSIZEX * k].face);
+                       }
+                       glTranslatef(0, -SY, S1);
+                       draw_cubit(mi,
+                                  NO_FACE, rp->cubeLoc[FRONT_FACE][LASTX + MAXSIZEX * LASTY].face,
+                                  NO_FACE, rp->cubeLoc[RIGHT_FACE][FIRSTZ + MAXSIZEZ * LASTY].face,
+                                  rp->cubeLoc[BOTTOM_FACE][LASTX + MAXSIZEX * FIRSTZ].face, NO_FACE);
+                       for (j = 1; j < MAXSIZEY - 1; j++) {
+                               glTranslatef(0, S1, 0);
+                               draw_cubit(mi,
+                                          NO_FACE, rp->cubeLoc[FRONT_FACE][LASTX + MAXSIZEX * REVY(j)].face,
+                                          NO_FACE, rp->cubeLoc[RIGHT_FACE][FIRSTZ + MAXSIZEZ * REVY(j)].face,
+                                          NO_FACE, NO_FACE);
+                       }
+                       glTranslatef(0, S1, 0);
+                       draw_cubit(mi,
+                                  NO_FACE, rp->cubeLoc[FRONT_FACE][LASTX + MAXSIZEX * FIRSTY].face,
+                                  NO_FACE, rp->cubeLoc[RIGHT_FACE][FIRSTZ + MAXSIZEZ * FIRSTY].face,
+                                  NO_FACE, rp->cubeLoc[TOP_FACE][LASTX + MAXSIZEX * LASTZ].face);
+                       break;
+               case FRONT_FACE:        /* BACK_FACE too */
+                       glPushMatrix();
+                       if (slice.depth == MAXSIZEZ - 1)
+                               glRotatef(rotatestep, 0, 0, HALFZ);
+
+                       glTranslatef(-HALFX, -HALFY, -HALFZ);
+                       draw_cubit(mi,
+                                  rp->cubeLoc[BACK_FACE][FIRSTX + MAXSIZEX * FIRSTY].face, NO_FACE,
+                                  rp->cubeLoc[LEFT_FACE][FIRSTZ + MAXSIZEZ * LASTY].face, NO_FACE,
+                                  rp->cubeLoc[BOTTOM_FACE][FIRSTX + MAXSIZEX * LASTZ].face, NO_FACE);
+                       for (i = 1; i < MAXSIZEX - 1; i++) {
+                               glTranslatef(S1, 0, 0);
+                               draw_cubit(mi,
+                                          rp->cubeLoc[BACK_FACE][i + MAXSIZEX * FIRSTY].face, NO_FACE,
+                                          NO_FACE, NO_FACE,
+                                          rp->cubeLoc[BOTTOM_FACE][i + MAXSIZEX * LASTZ].face, NO_FACE);
+                       }
+                       glTranslatef(S1, 0, 0);
+                       draw_cubit(mi,
+                                  rp->cubeLoc[BACK_FACE][LASTX + MAXSIZEX * FIRSTY].face, NO_FACE,
+                                  NO_FACE, rp->cubeLoc[RIGHT_FACE][LASTZ + MAXSIZEZ * LASTY].face,
+                                  rp->cubeLoc[BOTTOM_FACE][LASTX + MAXSIZEX * LASTZ].face, NO_FACE);
+                       for (j = 1; j < MAXSIZEY - 1; j++) {
+                               glTranslatef(-SX, S1, 0);
+                               draw_cubit(mi,
+                                          rp->cubeLoc[BACK_FACE][FIRSTX + MAXSIZEX * j].face, NO_FACE,
+                                          rp->cubeLoc[LEFT_FACE][FIRSTZ + MAXSIZEZ * REVY(j)].face, NO_FACE,
+                                          NO_FACE, NO_FACE);
+                               for (i = 1; i < MAXSIZEX - 1; i++) {
+                                       glTranslatef(S1, 0, 0);
+                                       draw_cubit(mi,
+                                                  rp->cubeLoc[BACK_FACE][i + MAXSIZEX * j].face, NO_FACE,
+                                                  NO_FACE, NO_FACE,
+                                                  NO_FACE, NO_FACE);
+                               }
+                               glTranslatef(S1, 0, 0);
+                               draw_cubit(mi,
+                                          rp->cubeLoc[BACK_FACE][LASTX + MAXSIZEX * j].face, NO_FACE,
+                                          NO_FACE, rp->cubeLoc[RIGHT_FACE][LASTZ + MAXSIZEZ * REVY(j)].face,
+                                          NO_FACE, NO_FACE);
+                       }
+                       glTranslatef(-SX, S1, 0);
+                       draw_cubit(mi,
+                                  rp->cubeLoc[BACK_FACE][FIRSTX + MAXSIZEX * LASTY].face, NO_FACE,
+                                  rp->cubeLoc[LEFT_FACE][FIRSTZ + MAXSIZEZ * FIRSTY].face, NO_FACE,
+                                  NO_FACE, rp->cubeLoc[TOP_FACE][FIRSTX + MAXSIZEX * FIRSTZ].face);
+                       for (i = 1; i < MAXSIZEX - 1; i++) {
+                               glTranslatef(S1, 0, 0);
+                               draw_cubit(mi,
+                                          rp->cubeLoc[BACK_FACE][i + MAXSIZEX * LASTY].face, NO_FACE,
+                                          NO_FACE, NO_FACE,
+                                          NO_FACE, rp->cubeLoc[TOP_FACE][i + MAXSIZEX * FIRSTZ].face);
+                       }
+                       glTranslatef(S1, 0, 0);
+                       draw_cubit(mi,
+                                  rp->cubeLoc[BACK_FACE][LASTX + MAXSIZEX * LASTY].face, NO_FACE,
+                                  NO_FACE, rp->cubeLoc[RIGHT_FACE][LASTZ + MAXSIZEZ * FIRSTY].face,
+                                  NO_FACE, rp->cubeLoc[TOP_FACE][LASTX + MAXSIZEX * FIRSTZ].face);
+                       glPopMatrix();
+                       for (k = 1; k < MAXSIZEZ - 1; k++) {
+                               glPushMatrix();
+                               if (slice.depth == REVZ(k))
+                                       glRotatef(rotatestep, 0, 0, HALFZ);
+                               glTranslatef(-HALFX, -HALFY, MIDZ(k));
+                               draw_cubit(mi,
+                                          NO_FACE, NO_FACE,
+                                          rp->cubeLoc[LEFT_FACE][k + MAXSIZEZ * LASTY].face, NO_FACE,
+                                          rp->cubeLoc[BOTTOM_FACE][FIRSTX + MAXSIZEX * REVZ(k)].face, NO_FACE);
+                               for (i = 1; i < MAXSIZEX - 1; i++) {
+                                       glTranslatef(S1, 0, 0);
+                                       draw_cubit(mi,
+                                                  NO_FACE, NO_FACE,
+                                                  NO_FACE, NO_FACE,
+                                                  rp->cubeLoc[BOTTOM_FACE][i + MAXSIZEX * REVZ(k)].face, NO_FACE);
+                               }
+                               glTranslatef(S1, 0, 0);
+                               draw_cubit(mi,
+                                          NO_FACE, NO_FACE,
+                                          NO_FACE, rp->cubeLoc[RIGHT_FACE][REVZ(k) + MAXSIZEZ * LASTY].face,
+                                          rp->cubeLoc[BOTTOM_FACE][LASTX + MAXSIZEX * REVZ(k)].face, NO_FACE);
+                               for (j = 1; j < MAXSIZEY - 1; j++) {
+                                       glTranslatef(-SX, S1, 0);
+                                       draw_cubit(mi,
+                                                  NO_FACE, NO_FACE,
+                                                  rp->cubeLoc[LEFT_FACE][k + MAXSIZEZ * REVY(j)].face, NO_FACE,
+                                                  NO_FACE, NO_FACE);
+                                       /* Center */
+                                       glTranslatef(SX, 0, 0);
+                                       draw_cubit(mi,
+                                                  NO_FACE, NO_FACE,
+                                                  NO_FACE, rp->cubeLoc[RIGHT_FACE][REVZ(k) + MAXSIZEZ * REVY(j)].face,
+                                                  NO_FACE, NO_FACE);
+                               }
+                               glTranslatef(-SX, S1, 0);
+                               draw_cubit(mi,
+                                          NO_FACE, NO_FACE,
+                                          rp->cubeLoc[LEFT_FACE][k + MAXSIZEZ * FIRSTY].face, NO_FACE,
+                                          NO_FACE, rp->cubeLoc[TOP_FACE][FIRSTX + MAXSIZEX * k].face);
+                               for (i = 1; i < MAXSIZEX - 1; i++) {
+                                       glTranslatef(S1, 0, 0);
+                                       draw_cubit(mi,
+                                                  NO_FACE, NO_FACE,
+                                                  NO_FACE, NO_FACE,
+                                                  NO_FACE, rp->cubeLoc[TOP_FACE][i + MAXSIZEX * k].face);
+                               }
+                               glTranslatef(S1, 0, 0);
+                               draw_cubit(mi,
+                                          NO_FACE, NO_FACE,
+                                          NO_FACE, rp->cubeLoc[RIGHT_FACE][REVZ(k) + MAXSIZEZ * FIRSTY].face,
+                                          NO_FACE, rp->cubeLoc[TOP_FACE][LASTX + MAXSIZEX * k].face);
+                               glPopMatrix();
+                       }
+                       if (slice.depth == 0)
+                               glRotatef(rotatestep, 0, 0, HALFZ);
+                       glTranslatef(-HALFX, -HALFY, HALFZ);
+                       draw_cubit(mi,
+                                  NO_FACE, rp->cubeLoc[FRONT_FACE][FIRSTX + MAXSIZEX * LASTY].face,
+                                  rp->cubeLoc[LEFT_FACE][LASTZ + MAXSIZEZ * LASTY].face, NO_FACE,
+                                  rp->cubeLoc[BOTTOM_FACE][FIRSTX + MAXSIZEX * FIRSTZ].face, NO_FACE);
+                       for (i = 1; i < MAXSIZEX - 1; i++) {
+                               glTranslatef(S1, 0, 0);
+                               draw_cubit(mi,
+                                          NO_FACE, rp->cubeLoc[FRONT_FACE][i + MAXSIZEX * LASTY].face,
+                                          NO_FACE, NO_FACE,
+                                          rp->cubeLoc[BOTTOM_FACE][i + MAXSIZEX * FIRSTZ].face, NO_FACE);
+                       }
+                       glTranslatef(S1, 0, 0);
+                       draw_cubit(mi,
+                                  NO_FACE, rp->cubeLoc[FRONT_FACE][LASTX + MAXSIZEX * LASTY].face,
+                                  NO_FACE, rp->cubeLoc[RIGHT_FACE][FIRSTZ + MAXSIZEZ * LASTY].face,
+                                  rp->cubeLoc[BOTTOM_FACE][LASTX + MAXSIZEX * FIRSTZ].face, NO_FACE);
+                       for (j = 1; j < MAXSIZEY - 1; j++) {
+                               glTranslatef(-SX, S1, 0);
+                               draw_cubit(mi,
+                                          NO_FACE, rp->cubeLoc[FRONT_FACE][FIRSTX + MAXSIZEX * REVY(j)].face,
+                                          rp->cubeLoc[LEFT_FACE][LASTZ + MAXSIZEZ * REVY(j)].face, NO_FACE,
+                                          NO_FACE, NO_FACE);
+                               for (i = 1; i < MAXSIZEX - 1; i++) {
+                                       glTranslatef(S1, 0, 0);
+                                       draw_cubit(mi,
+                                                  NO_FACE, rp->cubeLoc[FRONT_FACE][i + MAXSIZEX * REVY(j)].face,
+                                                  NO_FACE, NO_FACE,
+                                                  NO_FACE, NO_FACE);
+                               }
+                               glTranslatef(S1, 0, 0);
+                               draw_cubit(mi,
+                                          NO_FACE, rp->cubeLoc[FRONT_FACE][LASTX + MAXSIZEX * REVY(j)].face,
+                                          NO_FACE, rp->cubeLoc[RIGHT_FACE][FIRSTZ + MAXSIZEZ * REVY(j)].face,
+                                          NO_FACE, NO_FACE);
+                       }
+                       glTranslatef(-SX, S1, 0);
+                       draw_cubit(mi,
+                                  NO_FACE, rp->cubeLoc[FRONT_FACE][FIRSTX + MAXSIZEX * FIRSTY].face,
+                                  rp->cubeLoc[LEFT_FACE][LASTZ + MAXSIZEZ * FIRSTY].face, NO_FACE,
+                                  NO_FACE, rp->cubeLoc[TOP_FACE][FIRSTX + MAXSIZEX * LASTZ].face);
+                       for (i = 1; i < MAXSIZEX - 1; i++) {
+                               glTranslatef(S1, 0, 0);
+                               draw_cubit(mi,
+                                          NO_FACE, rp->cubeLoc[FRONT_FACE][i + MAXSIZEX * FIRSTY].face,
+                                          NO_FACE, NO_FACE,
+                                          NO_FACE, rp->cubeLoc[TOP_FACE][i + MAXSIZEX * LASTZ].face);
+                       }
+                       glTranslatef(S1, 0, 0);
+                       draw_cubit(mi,
+                                  NO_FACE, rp->cubeLoc[FRONT_FACE][LASTX + MAXSIZEX * FIRSTY].face,
+                                  NO_FACE, rp->cubeLoc[RIGHT_FACE][FIRSTZ + MAXSIZEZ * FIRSTY].face,
+                                  NO_FACE, rp->cubeLoc[TOP_FACE][LASTX + MAXSIZEX * LASTZ].face);
+                       break;
+       }
+#undef S1
+}
+
+/* From David Bagley's xrubik.  Used by permission. ;)  */
+static void
+readRC(rubikstruct * rp, int face, int dir, int h, int orient, int size)
+{
+       int         g;
+
+       if (dir == TOP || dir == BOTTOM)
+               for (g = 0; g < size; g++)
+                       rp->rowLoc[orient][g] =
+                               rp->cubeLoc[face][g * size + h];
+       else                    /* dir == RIGHT || dir == LEFT */
+               for (g = 0; g < size; g++)
+                       rp->rowLoc[orient][g] =
+                               rp->cubeLoc[face][h * size + g];
+}
+
+static void
+rotateRC(rubikstruct * rp, int rotate, int orient, int size)
+{
+       int         g;
+
+       for (g = 0; g < size; g++)
+               rp->rowLoc[orient][g].rotation =
+                       (rp->rowLoc[orient][g].rotation + rotate) % MAXORIENT;
+}
+
+static void
+reverseRC(rubikstruct * rp, int orient, int size)
+{
+       int         g;
+       RubikLoc    temp;
+
+       for (g = 0; g < size / 2; g++) {
+               temp = rp->rowLoc[orient][size - 1 - g];
+               rp->rowLoc[orient][size - 1 - g] = rp->rowLoc[orient][g];
+               rp->rowLoc[orient][g] = temp;
+       }
+}
+
+static void
+writeRC(rubikstruct * rp, int face, int dir, int h, int orient, int size)
+{
+       int         g, position;
+
+       if (dir == TOP || dir == BOTTOM) {
+               for (g = 0; g < size; g++) {
+                       position = g * size + h;
+                       rp->cubeLoc[face][position] = rp->rowLoc[orient][g];
+                       /* DrawSquare(face, position); */
+               }
+       } else {                /* dir == RIGHT || dir == LEFT */
+               for (g = 0; g < size; g++) {
+                       position = h * size + g;
+                       rp->cubeLoc[face][position] = rp->rowLoc[orient][g];
+                       /* DrawSquare(face, position); */
+               }
+       }
+}
+
+static void
+rotateFace(rubikstruct * rp, int face, int direction)
+{
+       int         position, i, j;
+       RubikLoc   *faceLoc = NULL;
+
+       if ((faceLoc = (RubikLoc *) malloc(AVSIZESQ * sizeof (RubikLoc))) == NULL)
+               (void) fprintf(stderr,
+                "Could not allocate memory for rubik face position info\n");
+       /* Read Face */
+       for (position = 0; position < AVSIZESQ; position++)
+               faceLoc[position] = rp->cubeLoc[face][position];
+       /* Write Face */
+       for (position = 0; position < AVSIZESQ; position++) {
+               i = position % AVSIZE;
+               j = position / AVSIZE;
+               rp->cubeLoc[face][position] = (direction == CW) ?
+                       faceLoc[(AVSIZE - i - 1) * AVSIZE + j] :
+                       faceLoc[i * AVSIZE + AVSIZE - j - 1];
+               rp->cubeLoc[face][position].rotation =
+                       (rp->cubeLoc[face][position].rotation + direction - MAXORIENT) %
+                       MAXORIENT;
+               /* DrawSquare(face, position); */
+       }
+       if (faceLoc != NULL)
+               (void) free((void *) faceLoc);
+}
+
+static void
+moveRubik(rubikstruct * rp, int face, int direction, int position)
+{
+       int         newFace, newDirection, rotate, reverse = False;
+       int         h, k, newH = 0;
+       int         i, j;
+
+       if (direction == CW || direction == CCW) {
+               direction = (direction == CCW) ?
+                       (rotateToRow[face].direction + 2) % MAXORIENT :
+                       rotateToRow[face].direction;
+               i = j = (rotateToRow[face].sideFace == RIGHT ||
+                     rotateToRow[face].sideFace == BOTTOM) ? AVSIZE - 1 : 0;
+               face = rotateToRow[face].face;
+               position = j * AVSIZE + i;
+       }
+       i = position % AVSIZE;
+       j = position / AVSIZE;
+       h = (direction == TOP || direction == BOTTOM) ? i : j;
+       /* rotate sides CW or CCW */
+       if (h == AVSIZE - 1) {
+               newDirection = (direction == TOP || direction == BOTTOM) ?
+                       TOP : RIGHT;
+               if (direction == TOP || direction == RIGHT)
+                       rotateFace(rp, rowToRotate[face][newDirection], CW);
+               else            /* direction == BOTTOM || direction == LEFT */
+                       rotateFace(rp, rowToRotate[face][newDirection], CCW);
+       }
+       if (h == 0) {
+               newDirection = (direction == TOP || direction == BOTTOM) ?
+                       BOTTOM : LEFT;
+               if (direction == TOP || direction == RIGHT)
+                       rotateFace(rp, rowToRotate[face][newDirection], CCW);
+               else            /* direction == BOTTOM  || direction == LEFT */
+                       rotateFace(rp, rowToRotate[face][newDirection], CW);
+       }
+       /* Slide rows */
+       readRC(rp, face, direction, h, 0, AVSIZE);
+       for (k = 1; k <= MAXORIENT; k++) {
+               newFace = slideNextRow[face][direction].face;
+               rotate = slideNextRow[face][direction].rotation;
+               newDirection = (rotate + direction) % MAXORIENT;
+               switch (rotate) {
+                       case TOP:
+                               newH = h;
+                               reverse = False;
+                               break;
+                       case RIGHT:
+                               if (newDirection == TOP || newDirection == BOTTOM) {
+                                       newH = AVSIZE - 1 - h;
+                                       reverse = False;
+                               } else {        /* newDirection == RIGHT || newDirection == LEFT */
+                                       newH = h;
+                                       reverse = True;
+                               }
+                               break;
+                       case BOTTOM:
+                               newH = AVSIZE - 1 - h;
+                               reverse = True;
+                               break;
+                       case LEFT:
+                               if (newDirection == TOP || newDirection == BOTTOM) {
+                                       newH = h;
+                                       reverse = True;
+                               } else {        /* newDirection == RIGHT || newDirection == LEFT */
+                                       newH = AVSIZE - 1 - h;
+                                       reverse = False;
+                               }
+                               break;
+                       default:
+                               (void) printf("moveRubik: rotate %d\n", rotate);
+               }
+               if (k != MAXORIENT)
+                       readRC(rp, newFace, newDirection, newH, k, AVSIZE);
+               rotateRC(rp, rotate, k - 1, AVSIZE);
+               if (reverse == True)
+                       reverseRC(rp, k - 1, AVSIZE);
+               writeRC(rp, newFace, newDirection, newH, k - 1, AVSIZE);
+               face = newFace;
+               direction = newDirection;
+               h = newH;
+       }
+}
+
+#ifdef DEBUG
+void
+printCube(rubikstruct * rp)
+{
+       int         face, position;
+
+       for (face = 0; face < MAXFACES; face++) {
+               for (position = 0; position < AVSIZESQ; position++) {
+                       (void) printf("%d %d  ", rp->cubeLoc[face][position].face,
+                                     rp->cubeLoc[face][position].rotation);
+                       if (!((position + 1) % AVSIZE))
+                               (void) printf("\n");
+               }
+               (void) printf("\n");
+       }
+       (void) printf("\n");
+}
+
+#endif
+
+static void
+evalmovement(ModeInfo * mi, RubikMove movement)
+{
+       rubikstruct *rp = &rubik[MI_SCREEN(mi)];
+
+#ifdef DEBUG
+       printCube(rp);
+#endif
+       if (movement.face < 0 || movement.face >= MAXFACES)
+               return;
+
+       moveRubik(rp, movement.face, movement.direction, movement.position);
+
+}
+
+static      Bool
+compare_moves(rubikstruct * rp, RubikMove move1, RubikMove move2, Bool opp)
+{
+       RubikSlice  slice1, slice2;
+
+       slice1 = convertMove(rp, move1);
+       slice2 = convertMove(rp, move2);
+       if (slice1.face == slice2.face &&
+           slice1.depth == slice2.depth) {
+               if (slice1.rotation == slice2.rotation) {       /* CW or CCW */
+                       if (!opp)
+                               return True;
+               } else {
+                       if (opp)
+                               return True;
+               }
+       }
+       return False;
+}
+
+static void
+shuffle(ModeInfo * mi)
+{
+       rubikstruct *rp = &rubik[MI_SCREEN(mi)];
+       int         i, face, position;
+       RubikMove   move;
+
+       AVSIZE = MI_SIZE(mi);
+       if (AVSIZE < -MINSIZE)
+               AVSIZE = NRAND(-AVSIZE - MINSIZE + 1) + MINSIZE;
+       else if (AVSIZE < MINSIZE)
+               AVSIZE = MINSIZE;
+       /* Let me waste a little space for the moment */
+       /* Future cube to be LxMxN and not just NxNxN, but not done yet */
+       AVSIZESQ = AVSIZE * AVSIZE;
+#ifdef LMN
+       MAXSIZEX = AVSIZE;
+       MAXSIZEY = AVSIZE;
+       MAXSIZEZ = AVSIZE;
+       MAXSIZE = AVSIZE;
+       MAXSIZESQ = AVSIZESQ;
+#endif
+
+       for (face = 0; face < MAXFACES; face++) {
+               if (rp->cubeLoc[face] != NULL)
+                       (void) free((void *) rp->cubeLoc[face]);
+               if ((rp->cubeLoc[face] =
+                 (RubikLoc *) malloc(AVSIZESQ * sizeof (RubikLoc))) == NULL)
+                       (void) fprintf(stderr,
+                                      "Could not allocate memory for rubik cube position info\n");
+               for (position = 0; position < AVSIZESQ; position++) {
+                       rp->cubeLoc[face][position].face = face;
+                       rp->cubeLoc[face][position].rotation = TOP;
+               }
+       }
+       for (i = 0; i < MAXORIENT; i++) {
+               if (rp->rowLoc[i] != NULL)
+                       (void) free((void *) rp->rowLoc[i]);
+               if ((rp->rowLoc[i] =
+                    (RubikLoc *) malloc(AVSIZE * sizeof (RubikLoc))) == NULL)
+                       (void) fprintf(stderr,
+                                      "Could not allocate memory for rubik row position info\n");
+       }
+       rp->storedmoves = MI_COUNT(mi);
+       if (rp->storedmoves < 0) {
+               if (rp->moves != NULL)
+                       (void) free((void *) rp->moves);
+               rp->moves = NULL;
+               rp->storedmoves = NRAND(-rp->storedmoves) + 1;
+       }
+       if ((rp->storedmoves) && (rp->moves == NULL))
+               if ((rp->moves =
+                    (RubikMove *) calloc(rp->storedmoves + 1, sizeof (RubikMove))) == NULL)
+                       (void) fprintf(stderr,
+                       "Could not allocate memory for rubik move buffer\n");
+
+       if (MI_CYCLES(mi) <= 1) {
+               rp->anglestep = 90.0;
+       } else {
+               rp->anglestep = 90.0 / (GLfloat) (MI_CYCLES(mi));
+       }
+
+       for (i = 0; i < rp->storedmoves; i++) {
+               int         condition;
+
+               do {
+                       move.face = NRAND(6);
+                       move.direction = NRAND(4);      /* Exclude CW and CCW, its ok */
+                       /*
+                        * Randomize position along diagonal, each plane gets an equal chance.
+                        * This trick will only work for NxNxN cubes
+                        * draw_cube DEPENDS on that they are chosen this way.
+                        */
+                       move.position = NRAND(AVSIZE) * (AVSIZE + 1);
+
+
+                       condition = 1;
+
+                       if (i > 0)      /* avoid immediate undoing moves */
+                               if (compare_moves(rp, move, rp->moves[i - 1], True))
+                                       condition = 0;
+                       if (i > 1)      /* avoid 3 consecutive identical moves */
+                               if (compare_moves(rp, move, rp->moves[i - 1], False) &&
+                                   compare_moves(rp, move, rp->moves[i - 2], False))
+                                       condition = 0;
+                       /*
+                          * Still some silly moves being made....
+                        */
+               } while (!condition);
+               if (hideshuffling)
+                       evalmovement(mi, move);
+               rp->moves[i] = move;
+       }
+       rp->VX = 0.05;
+       if (NRAND(100) < 50)
+               rp->VX *= -1;
+       rp->VY = 0.05;
+       if (NRAND(100) < 50)
+               rp->VY *= -1;
+       rp->movement.face = NO_FACE;
+       rp->rotatestep = 0;
+       rp->action = hideshuffling ? ACTION_SOLVE : ACTION_SHUFFLE;
+       rp->shufflingmoves = 0;
+       rp->done = 0;
+}
+
+static void
+reshape(ModeInfo * mi, int width, int height)
+{
+       rubikstruct *rp = &rubik[MI_SCREEN(mi)];
+
+       glViewport(0, 0, rp->WindW = (GLint) width, rp->WindH = (GLint) height);
+       glMatrixMode(GL_PROJECTION);
+       glLoadIdentity();
+       glFrustum(-1.0, 1.0, -1.0, 1.0, 5.0, 15.0);
+       glMatrixMode(GL_MODELVIEW);
+
+       rp->AreObjectsDefined[ObjCubit] = 0;
+}
+
+static void
+pinit(ModeInfo * mi)
+{
+       glClearDepth(1.0);
+       glClearColor(0.0, 0.0, 0.0, 1.0);
+       glColor3f(1.0, 1.0, 1.0);
+
+       glLightfv(GL_LIGHT0, GL_AMBIENT, ambient);
+       glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse);
+       glLightfv(GL_LIGHT0, GL_POSITION, position0);
+       glLightfv(GL_LIGHT1, GL_AMBIENT, ambient);
+       glLightfv(GL_LIGHT1, GL_DIFFUSE, diffuse);
+       glLightfv(GL_LIGHT1, GL_POSITION, position1);
+       glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient);
+       glLightModelfv(GL_LIGHT_MODEL_TWO_SIDE, lmodel_twoside);
+       glEnable(GL_LIGHTING);
+       glEnable(GL_LIGHT0);
+       glEnable(GL_LIGHT1);
+       glEnable(GL_DEPTH_TEST);
+       glEnable(GL_NORMALIZE);
+       glEnable(GL_CULL_FACE);
+
+       glShadeModel(GL_FLAT);
+       glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, front_shininess);
+       glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, front_specular);
+
+       shuffle(mi);
+}
+
+void
+init_rubik(ModeInfo * mi)
+{
+       int         screen = MI_SCREEN(mi);
+       rubikstruct *rp;
+
+       if (rubik == NULL) {
+               if ((rubik = (rubikstruct *) calloc(MI_NUM_SCREENS(mi),
+                                             sizeof (rubikstruct))) == NULL)
+                       return;
+       }
+       rp = &rubik[screen];
+       rp->step = NRAND(90);
+
+       rp->PX = ((float) LRAND() / (float) RAND_MAX) * 2 - 1;
+       rp->PY = ((float) LRAND() / (float) RAND_MAX) * 2 - 1;
+
+       if ((rp->glx_context = init_GL(mi)) != NULL) {
+
+               reshape(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+               objects = glGenLists(1);
+               pinit(mi);
+       } else {
+               MI_CLEARWINDOW(mi);
+       }
+}
+
+void
+draw_rubik(ModeInfo * mi)
+{
+       int         bounced = 0;
+
+       rubikstruct *rp = &rubik[MI_SCREEN(mi)];
+       Display    *display = MI_DISPLAY(mi);
+       Window      window = MI_WINDOW(mi);
+
+       MI_IS_DRAWN(mi) = True;
+
+       if (!rp->glx_context)
+               return;
+
+       glDrawBuffer(GL_BACK);
+       glXMakeCurrent(display, window, *(rp->glx_context));
+
+       glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+       glPushMatrix();
+
+       glTranslatef(0.0, 0.0, -10.0);
+
+       rp->PX += rp->VX;
+       rp->PY += rp->VY;
+
+       if (rp->PY < -1) {
+               rp->PY += (-1) - (rp->PY);
+               rp->VY = -rp->VY;
+               bounced = 1;
+       }
+       if (rp->PY > 1) {
+               rp->PY -= (rp->PY) - 1;
+               rp->VY = -rp->VY;
+               bounced = 1;
+       }
+       if (rp->PX < -1) {
+               rp->PX += (-1) - (rp->PX);
+               rp->VX = -rp->VX;
+               bounced = 1;
+       }
+       if (rp->PX > 1) {
+               rp->PX -= (rp->PX) - 1;
+               rp->VX = -rp->VX;
+               bounced = 1;
+       }
+       if (bounced) {
+               rp->VX += ((float) LRAND() / (float) RAND_MAX) * 0.02 - 0.01;
+               rp->VX += ((float) LRAND() / (float) RAND_MAX) * 0.02 - 0.01;
+               if (rp->VX > 0.06)
+                       rp->VX = 0.06;
+               if (rp->VY > 0.06)
+                       rp->VY = 0.06;
+               if (rp->VX < -0.06)
+                       rp->VX = -0.06;
+               if (rp->VY < -0.06)
+                       rp->VY = -0.06;
+       }
+       if (!MI_IS_ICONIC(mi)) {
+               glTranslatef(rp->PX, rp->PY, 0);
+               glScalef(Scale4Window * rp->WindH / rp->WindW, Scale4Window, Scale4Window);
+       } else {
+               glScalef(Scale4Iconic * rp->WindH / rp->WindW, Scale4Iconic, Scale4Iconic);
+       }
+
+       glRotatef(rp->step * 100, 1, 0, 0);
+       glRotatef(rp->step * 95, 0, 1, 0);
+       glRotatef(rp->step * 90, 0, 0, 1);
+
+       draw_cube(mi);
+       glXSwapBuffers(display, window);
+
+       if (rp->action == ACTION_SHUFFLE) {
+               if (rp->done) {
+                       if (++rp->rotatestep > DELAY_AFTER_SHUFFLING) {
+                               rp->movement.face = NO_FACE;
+                               rp->rotatestep = 0;
+                               rp->action = ACTION_SOLVE;
+                               rp->done = 0;
+                       }
+               } else {
+                       if (rp->movement.face == NO_FACE) {
+                               if (rp->shufflingmoves < rp->storedmoves) {
+                                       rp->rotatestep = 0;
+                                       rp->movement = rp->moves[rp->shufflingmoves];
+                               } else {
+                                       rp->rotatestep = 0;
+                                       rp->done = 1;
+                               }
+                       } else {
+                               rp->rotatestep += rp->anglestep;
+                               if (rp->rotatestep > 90) {
+                                       evalmovement(mi, rp->movement);
+                                       rp->shufflingmoves++;
+                                       rp->movement.face = NO_FACE;
+                               }
+                       }
+               }
+       } else {
+               if (rp->done) {
+                       if (++rp->rotatestep > DELAY_AFTER_SOLVING)
+                               shuffle(mi);
+               } else {
+                       if (rp->movement.face == NO_FACE) {
+                               if (rp->storedmoves > 0) {
+                                       rp->rotatestep = 0;
+                                       rp->movement = rp->moves[rp->storedmoves - 1];
+                                       rp->movement.direction = (rp->movement.direction + (MAXORIENT / 2)) %
+                                               MAXORIENT;
+                               } else {
+                                       rp->rotatestep = 0;
+                                       rp->done = 1;
+                               }
+                       } else {
+                               rp->rotatestep += rp->anglestep;
+                               if (rp->rotatestep > 90) {
+                                       evalmovement(mi, rp->movement);
+                                       rp->storedmoves--;
+                                       rp->movement.face = NO_FACE;
+                               }
+                       }
+               }
+       }
+
+       glPopMatrix();
+
+       glFlush();
+
+       rp->step += 0.05;
+}
+
+void
+change_rubik(ModeInfo * mi)
+{
+       rubikstruct *rp = &rubik[MI_SCREEN(mi)];
+
+       if (!rp->glx_context)
+               return;
+       pinit(mi);
+}
+
+void
+release_rubik(ModeInfo * mi)
+{
+       if (rubik != NULL) {
+               int         screen;
+
+               for (screen = 0; screen < MI_NUM_SCREENS(mi); screen++) {
+                       rubikstruct *rp = &rubik[screen];
+                       int         i;
+
+                       for (i = 0; i < MAXFACES; i++)
+                               if (rp->cubeLoc[i] != NULL)
+                                       (void) free((void *) rp->cubeLoc[i]);
+                       for (i = 0; i < MAXORIENT; i++)
+                               if (rp->rowLoc[i] != NULL)
+                                       (void) free((void *) rp->rowLoc[i]);
+                       if (rp->moves != NULL)
+                               (void) free((void *) rp->moves);
+               }
+               (void) free((void *) rubik);
+               rubik = NULL;
+       }
+       FreeAllGL(mi);
+}
+
+#endif
diff --git a/hacks/glx/s1_1.c b/hacks/glx/s1_1.c
new file mode 100644 (file)
index 0000000..61dd91f
--- /dev/null
@@ -0,0 +1,1057 @@
+#if !defined( lint ) && !defined( SABER )
+static const char sccsid[] = "@(#)s1_1.c       4.04 97/07/28 xlockmore";
+
+#endif
+
+/*-
+ * Points, polygons, and normal vectors to render "s1_1" in 3D.
+ *
+ * Generated by lw2ogl.  Link this with your program but do
+ * not edit by hand.
+ */
+
+#ifndef STANDALONE
+#include "xlock.h"
+#endif
+
+#ifdef USE_GL
+
+#ifdef STANDALONE
+#include <GL/glx.h>
+#endif
+#include <GL/gl.h>
+#include "buildlwo.h"
+
+static GLfloat s1_1_PNTS[] =
+{
+       (GLfloat) 0.332422, (GLfloat) 0.132531, (GLfloat) - 0.332422,
+       (GLfloat) 0.332422, (GLfloat) 0.132531, (GLfloat) - 0.667578,
+       (GLfloat) 0.667578, (GLfloat) 0.132531, (GLfloat) - 0.332422,
+       (GLfloat) 0.667578, (GLfloat) 0.132531, (GLfloat) - 0.667578,
+       (GLfloat) 0.638667, (GLfloat) 0.007537, (GLfloat) - 0.638667,
+       (GLfloat) 0.361333, (GLfloat) 0.007537, (GLfloat) - 0.638667,
+       (GLfloat) 0.361333, (GLfloat) 0.007537, (GLfloat) - 0.361333,
+       (GLfloat) 0.638667, (GLfloat) 0.007537, (GLfloat) - 0.361333,
+       (GLfloat) 0.653656, (GLfloat) 0.494688, (GLfloat) - 0.653656,
+       (GLfloat) 0.346344, (GLfloat) 0.494688, (GLfloat) - 0.653656,
+       (GLfloat) 0.346344, (GLfloat) 0.494688, (GLfloat) - 0.346344,
+       (GLfloat) 0.653656, (GLfloat) 0.494688, (GLfloat) - 0.346344,
+       (GLfloat) 0.667578, (GLfloat) 0.838781, (GLfloat) - 0.667578,
+       (GLfloat) 0.667578, (GLfloat) 0.838781, (GLfloat) - 0.332422,
+       (GLfloat) 0.638667, (GLfloat) 0.958463, (GLfloat) - 0.361333,
+       (GLfloat) 0.638667, (GLfloat) 0.958463, (GLfloat) - 0.638667,
+       (GLfloat) 0.332422, (GLfloat) 0.838781, (GLfloat) - 0.332422,
+       (GLfloat) 0.361333, (GLfloat) 0.958463, (GLfloat) - 0.361333,
+       (GLfloat) 0.332422, (GLfloat) 0.838781, (GLfloat) - 0.667578,
+       (GLfloat) 0.361333, (GLfloat) 0.958463, (GLfloat) - 0.638667,
+       (GLfloat) 0.738539, (GLfloat) 0.926712, (GLfloat) - 0.500000,
+       (GLfloat) 0.714805, (GLfloat) 0.686547, (GLfloat) - 0.500000,
+       (GLfloat) 0.728516, (GLfloat) 0.838781, (GLfloat) - 0.500000,
+       (GLfloat) 0.500000, (GLfloat) 0.926712, (GLfloat) - 0.261461,
+       (GLfloat) 0.674539, (GLfloat) 0.926104, (GLfloat) - 0.325461,
+       (GLfloat) 0.500000, (GLfloat) 0.976924, (GLfloat) - 0.500000,
+       (GLfloat) 0.677562, (GLfloat) 0.965162, (GLfloat) - 0.500000,
+       (GLfloat) 0.500000, (GLfloat) 0.926712, (GLfloat) - 0.738539,
+       (GLfloat) 0.674539, (GLfloat) 0.926104, (GLfloat) - 0.674539,
+       (GLfloat) 0.500000, (GLfloat) 0.686547, (GLfloat) - 0.285195,
+       (GLfloat) 0.500000, (GLfloat) 0.838781, (GLfloat) - 0.271484,
+       (GLfloat) 0.261461, (GLfloat) 0.926712, (GLfloat) - 0.500000,
+       (GLfloat) 0.325461, (GLfloat) 0.926104, (GLfloat) - 0.325461,
+       (GLfloat) 0.500000, (GLfloat) 0.965162, (GLfloat) - 0.322437,
+       (GLfloat) 0.285195, (GLfloat) 0.686547, (GLfloat) - 0.500000,
+       (GLfloat) 0.271484, (GLfloat) 0.838781, (GLfloat) - 0.500000,
+       (GLfloat) 0.325461, (GLfloat) 0.926104, (GLfloat) - 0.674539,
+       (GLfloat) 0.322437, (GLfloat) 0.965162, (GLfloat) - 0.500000,
+       (GLfloat) 0.500000, (GLfloat) 0.686547, (GLfloat) - 0.714805,
+       (GLfloat) 0.500000, (GLfloat) 0.838781, (GLfloat) - 0.728516,
+       (GLfloat) 0.500000, (GLfloat) 0.965162, (GLfloat) - 0.677562,
+       (GLfloat) 0.657523, (GLfloat) 0.686547, (GLfloat) - 0.657523,
+       (GLfloat) 0.714805, (GLfloat) 0.295922, (GLfloat) - 0.500000,
+       (GLfloat) 0.709531, (GLfloat) 0.494688, (GLfloat) - 0.500000,
+       (GLfloat) 0.657523, (GLfloat) 0.686547, (GLfloat) - 0.342477,
+       (GLfloat) 0.342477, (GLfloat) 0.686547, (GLfloat) - 0.657523,
+       (GLfloat) 0.500000, (GLfloat) 0.295922, (GLfloat) - 0.714805,
+       (GLfloat) 0.500000, (GLfloat) 0.494688, (GLfloat) - 0.709531,
+       (GLfloat) 0.500000, (GLfloat) 0.295922, (GLfloat) - 0.285195,
+       (GLfloat) 0.500000, (GLfloat) 0.494688, (GLfloat) - 0.290469,
+       (GLfloat) 0.342477, (GLfloat) 0.686547, (GLfloat) - 0.342477,
+       (GLfloat) 0.285195, (GLfloat) 0.295922, (GLfloat) - 0.500000,
+       (GLfloat) 0.290469, (GLfloat) 0.494688, (GLfloat) - 0.500000,
+       (GLfloat) 0.500000, (GLfloat) 0.039819, (GLfloat) - 0.738539,
+       (GLfloat) 0.500000, (GLfloat) 0.132531, (GLfloat) - 0.728516,
+       (GLfloat) 0.657523, (GLfloat) 0.295922, (GLfloat) - 0.657523,
+       (GLfloat) 0.342477, (GLfloat) 0.295922, (GLfloat) - 0.657523,
+       (GLfloat) 0.342477, (GLfloat) 0.295922, (GLfloat) - 0.342477,
+       (GLfloat) 0.261461, (GLfloat) 0.039819, (GLfloat) - 0.500000,
+       (GLfloat) 0.271484, (GLfloat) 0.132531, (GLfloat) - 0.500000,
+       (GLfloat) 0.657523, (GLfloat) 0.295922, (GLfloat) - 0.342477,
+       (GLfloat) 0.500000, (GLfloat) 0.039819, (GLfloat) - 0.261461,
+       (GLfloat) 0.500000, (GLfloat) 0.132531, (GLfloat) - 0.271484,
+       (GLfloat) 0.738539, (GLfloat) 0.039819, (GLfloat) - 0.500000,
+       (GLfloat) 0.728516, (GLfloat) 0.132531, (GLfloat) - 0.500000,
+       (GLfloat) 0.674539, (GLfloat) 0.040427, (GLfloat) - 0.674539,
+       (GLfloat) 0.500000, (GLfloat) - 0.010924, (GLfloat) - 0.500000,
+       (GLfloat) 0.677562, (GLfloat) 0.000839, (GLfloat) - 0.500000,
+       (GLfloat) 0.674539, (GLfloat) 0.040427, (GLfloat) - 0.325461,
+       (GLfloat) 0.325461, (GLfloat) 0.040427, (GLfloat) - 0.674539,
+       (GLfloat) 0.500000, (GLfloat) 0.000839, (GLfloat) - 0.677562,
+       (GLfloat) 0.325461, (GLfloat) 0.040427, (GLfloat) - 0.325461,
+       (GLfloat) 0.322437, (GLfloat) 0.000839, (GLfloat) - 0.500000,
+       (GLfloat) 0.500000, (GLfloat) 0.000839, (GLfloat) - 0.322437,
+       (GLfloat) 0.721812, (GLfloat) 0.890313, (GLfloat) - 0.595062,
+       (GLfloat) 0.706063, (GLfloat) 0.769563, (GLfloat) - 0.588313,
+       (GLfloat) 0.713281, (GLfloat) 0.838781, (GLfloat) - 0.591406,
+       (GLfloat) 0.721812, (GLfloat) 0.890313, (GLfloat) - 0.404938,
+       (GLfloat) 0.737656, (GLfloat) 0.890313, (GLfloat) - 0.500000,
+       (GLfloat) 0.706000, (GLfloat) 0.949319, (GLfloat) - 0.587500,
+       (GLfloat) 0.722453, (GLfloat) 0.926408, (GLfloat) - 0.595141,
+       (GLfloat) 0.595062, (GLfloat) 0.890313, (GLfloat) - 0.721812,
+       (GLfloat) 0.674281, (GLfloat) 0.890313, (GLfloat) - 0.674281,
+       (GLfloat) 0.595062, (GLfloat) 0.890313, (GLfloat) - 0.278187,
+       (GLfloat) 0.674281, (GLfloat) 0.890313, (GLfloat) - 0.325719,
+       (GLfloat) 0.706000, (GLfloat) 0.949319, (GLfloat) - 0.412500,
+       (GLfloat) 0.722453, (GLfloat) 0.926408, (GLfloat) - 0.404859,
+       (GLfloat) 0.706063, (GLfloat) 0.769563, (GLfloat) - 0.411687,
+       (GLfloat) 0.713281, (GLfloat) 0.838781, (GLfloat) - 0.408594,
+       (GLfloat) 0.590500, (GLfloat) 0.971195, (GLfloat) - 0.409500,
+       (GLfloat) 0.664625, (GLfloat) 0.962948, (GLfloat) - 0.417500,
+       (GLfloat) 0.721500, (GLfloat) 0.950535, (GLfloat) - 0.500000,
+       (GLfloat) 0.587500, (GLfloat) 0.949319, (GLfloat) - 0.294000,
+       (GLfloat) 0.660875, (GLfloat) 0.948104, (GLfloat) - 0.339125,
+       (GLfloat) 0.587500, (GLfloat) 0.949319, (GLfloat) - 0.706000,
+       (GLfloat) 0.660875, (GLfloat) 0.948104, (GLfloat) - 0.660875,
+       (GLfloat) 0.590500, (GLfloat) 0.971195, (GLfloat) - 0.590500,
+       (GLfloat) 0.664625, (GLfloat) 0.962948, (GLfloat) - 0.582500,
+       (GLfloat) 0.588313, (GLfloat) 0.769563, (GLfloat) - 0.293938,
+       (GLfloat) 0.591406, (GLfloat) 0.838781, (GLfloat) - 0.286719,
+       (GLfloat) 0.404938, (GLfloat) 0.890313, (GLfloat) - 0.278187,
+       (GLfloat) 0.500000, (GLfloat) 0.890313, (GLfloat) - 0.262344,
+       (GLfloat) 0.595141, (GLfloat) 0.926408, (GLfloat) - 0.277547,
+       (GLfloat) 0.278187, (GLfloat) 0.890313, (GLfloat) - 0.404938,
+       (GLfloat) 0.325719, (GLfloat) 0.890313, (GLfloat) - 0.325719,
+       (GLfloat) 0.412500, (GLfloat) 0.949319, (GLfloat) - 0.294000,
+       (GLfloat) 0.404859, (GLfloat) 0.926408, (GLfloat) - 0.277547,
+       (GLfloat) 0.411687, (GLfloat) 0.769563, (GLfloat) - 0.293938,
+       (GLfloat) 0.408594, (GLfloat) 0.838781, (GLfloat) - 0.286719,
+       (GLfloat) 0.409500, (GLfloat) 0.971195, (GLfloat) - 0.409500,
+       (GLfloat) 0.417500, (GLfloat) 0.962948, (GLfloat) - 0.335375,
+       (GLfloat) 0.500000, (GLfloat) 0.950535, (GLfloat) - 0.278500,
+       (GLfloat) 0.294000, (GLfloat) 0.949319, (GLfloat) - 0.412500,
+       (GLfloat) 0.339125, (GLfloat) 0.948104, (GLfloat) - 0.339125,
+       (GLfloat) 0.582500, (GLfloat) 0.962948, (GLfloat) - 0.335375,
+       (GLfloat) 0.293938, (GLfloat) 0.769563, (GLfloat) - 0.411687,
+       (GLfloat) 0.286719, (GLfloat) 0.838781, (GLfloat) - 0.408594,
+       (GLfloat) 0.278187, (GLfloat) 0.890313, (GLfloat) - 0.595062,
+       (GLfloat) 0.262344, (GLfloat) 0.890313, (GLfloat) - 0.500000,
+       (GLfloat) 0.277547, (GLfloat) 0.926408, (GLfloat) - 0.404859,
+       (GLfloat) 0.404938, (GLfloat) 0.890313, (GLfloat) - 0.721812,
+       (GLfloat) 0.325719, (GLfloat) 0.890313, (GLfloat) - 0.674281,
+       (GLfloat) 0.294000, (GLfloat) 0.949319, (GLfloat) - 0.587500,
+       (GLfloat) 0.277547, (GLfloat) 0.926408, (GLfloat) - 0.595141,
+       (GLfloat) 0.293938, (GLfloat) 0.769563, (GLfloat) - 0.588313,
+       (GLfloat) 0.286719, (GLfloat) 0.838781, (GLfloat) - 0.591406,
+       (GLfloat) 0.409500, (GLfloat) 0.971195, (GLfloat) - 0.590500,
+       (GLfloat) 0.335375, (GLfloat) 0.962948, (GLfloat) - 0.582500,
+       (GLfloat) 0.278500, (GLfloat) 0.950535, (GLfloat) - 0.500000,
+       (GLfloat) 0.412500, (GLfloat) 0.949319, (GLfloat) - 0.706000,
+       (GLfloat) 0.339125, (GLfloat) 0.948104, (GLfloat) - 0.660875,
+       (GLfloat) 0.335375, (GLfloat) 0.962948, (GLfloat) - 0.417500,
+       (GLfloat) 0.411687, (GLfloat) 0.769563, (GLfloat) - 0.706063,
+       (GLfloat) 0.408594, (GLfloat) 0.838781, (GLfloat) - 0.713281,
+       (GLfloat) 0.500000, (GLfloat) 0.890313, (GLfloat) - 0.737656,
+       (GLfloat) 0.404859, (GLfloat) 0.926408, (GLfloat) - 0.722453,
+       (GLfloat) 0.595141, (GLfloat) 0.926408, (GLfloat) - 0.722453,
+       (GLfloat) 0.588313, (GLfloat) 0.769563, (GLfloat) - 0.706063,
+       (GLfloat) 0.591406, (GLfloat) 0.838781, (GLfloat) - 0.713281,
+       (GLfloat) 0.582500, (GLfloat) 0.962948, (GLfloat) - 0.664625,
+       (GLfloat) 0.500000, (GLfloat) 0.950535, (GLfloat) - 0.721500,
+       (GLfloat) 0.417500, (GLfloat) 0.962948, (GLfloat) - 0.664625,
+       (GLfloat) 0.500000, (GLfloat) 0.973972, (GLfloat) - 0.402250,
+       (GLfloat) 0.597750, (GLfloat) 0.973972, (GLfloat) - 0.500000,
+       (GLfloat) 0.402250, (GLfloat) 0.973972, (GLfloat) - 0.500000,
+       (GLfloat) 0.500000, (GLfloat) 0.973972, (GLfloat) - 0.597750,
+       (GLfloat) 0.661906, (GLfloat) 0.769563, (GLfloat) - 0.661906,
+       (GLfloat) 0.696875, (GLfloat) 0.593625, (GLfloat) - 0.584375,
+       (GLfloat) 0.700484, (GLfloat) 0.686547, (GLfloat) - 0.585922,
+       (GLfloat) 0.720781, (GLfloat) 0.769563, (GLfloat) - 0.500000,
+       (GLfloat) 0.696875, (GLfloat) 0.393625, (GLfloat) - 0.584375,
+       (GLfloat) 0.695563, (GLfloat) 0.494688, (GLfloat) - 0.583813,
+       (GLfloat) 0.696875, (GLfloat) 0.593625, (GLfloat) - 0.415625,
+       (GLfloat) 0.710938, (GLfloat) 0.593625, (GLfloat) - 0.500000,
+       (GLfloat) 0.584375, (GLfloat) 0.593625, (GLfloat) - 0.696875,
+       (GLfloat) 0.654688, (GLfloat) 0.593625, (GLfloat) - 0.654688,
+       (GLfloat) 0.584375, (GLfloat) 0.593625, (GLfloat) - 0.303125,
+       (GLfloat) 0.654688, (GLfloat) 0.593625, (GLfloat) - 0.345313,
+       (GLfloat) 0.700484, (GLfloat) 0.686547, (GLfloat) - 0.414078,
+       (GLfloat) 0.696875, (GLfloat) 0.393625, (GLfloat) - 0.415625,
+       (GLfloat) 0.695563, (GLfloat) 0.494688, (GLfloat) - 0.416187,
+       (GLfloat) 0.661906, (GLfloat) 0.769563, (GLfloat) - 0.338094,
+       (GLfloat) 0.338094, (GLfloat) 0.769563, (GLfloat) - 0.661906,
+       (GLfloat) 0.415625, (GLfloat) 0.593625, (GLfloat) - 0.696875,
+       (GLfloat) 0.414078, (GLfloat) 0.686547, (GLfloat) - 0.700484,
+       (GLfloat) 0.500000, (GLfloat) 0.769563, (GLfloat) - 0.720781,
+       (GLfloat) 0.415625, (GLfloat) 0.393625, (GLfloat) - 0.696875,
+       (GLfloat) 0.416187, (GLfloat) 0.494688, (GLfloat) - 0.695563,
+       (GLfloat) 0.500000, (GLfloat) 0.593625, (GLfloat) - 0.710938,
+       (GLfloat) 0.303125, (GLfloat) 0.593625, (GLfloat) - 0.584375,
+       (GLfloat) 0.345313, (GLfloat) 0.593625, (GLfloat) - 0.654688,
+       (GLfloat) 0.585922, (GLfloat) 0.686547, (GLfloat) - 0.700484,
+       (GLfloat) 0.584375, (GLfloat) 0.393625, (GLfloat) - 0.696875,
+       (GLfloat) 0.583813, (GLfloat) 0.494688, (GLfloat) - 0.695563,
+       (GLfloat) 0.500000, (GLfloat) 0.769563, (GLfloat) - 0.279219,
+       (GLfloat) 0.415625, (GLfloat) 0.593625, (GLfloat) - 0.303125,
+       (GLfloat) 0.414078, (GLfloat) 0.686547, (GLfloat) - 0.299516,
+       (GLfloat) 0.338094, (GLfloat) 0.769563, (GLfloat) - 0.338094,
+       (GLfloat) 0.585922, (GLfloat) 0.686547, (GLfloat) - 0.299516,
+       (GLfloat) 0.584375, (GLfloat) 0.393625, (GLfloat) - 0.303125,
+       (GLfloat) 0.583813, (GLfloat) 0.494688, (GLfloat) - 0.304437,
+       (GLfloat) 0.500000, (GLfloat) 0.593625, (GLfloat) - 0.289063,
+       (GLfloat) 0.303125, (GLfloat) 0.593625, (GLfloat) - 0.415625,
+       (GLfloat) 0.345313, (GLfloat) 0.593625, (GLfloat) - 0.345313,
+       (GLfloat) 0.415625, (GLfloat) 0.393625, (GLfloat) - 0.303125,
+       (GLfloat) 0.416187, (GLfloat) 0.494688, (GLfloat) - 0.304437,
+       (GLfloat) 0.279219, (GLfloat) 0.769563, (GLfloat) - 0.500000,
+       (GLfloat) 0.299516, (GLfloat) 0.686547, (GLfloat) - 0.585922,
+       (GLfloat) 0.299516, (GLfloat) 0.686547, (GLfloat) - 0.414078,
+       (GLfloat) 0.303125, (GLfloat) 0.393625, (GLfloat) - 0.415625,
+       (GLfloat) 0.304437, (GLfloat) 0.494688, (GLfloat) - 0.416187,
+       (GLfloat) 0.289063, (GLfloat) 0.593625, (GLfloat) - 0.500000,
+       (GLfloat) 0.303125, (GLfloat) 0.393625, (GLfloat) - 0.584375,
+       (GLfloat) 0.304437, (GLfloat) 0.494688, (GLfloat) - 0.583813,
+       (GLfloat) 0.411687, (GLfloat) 0.207062, (GLfloat) - 0.706063,
+       (GLfloat) 0.404938, (GLfloat) 0.077813, (GLfloat) - 0.721812,
+       (GLfloat) 0.408594, (GLfloat) 0.132531, (GLfloat) - 0.713281,
+       (GLfloat) 0.588313, (GLfloat) 0.207062, (GLfloat) - 0.706063,
+       (GLfloat) 0.500000, (GLfloat) 0.207062, (GLfloat) - 0.720781,
+       (GLfloat) 0.414078, (GLfloat) 0.295922, (GLfloat) - 0.700484,
+       (GLfloat) 0.293938, (GLfloat) 0.207062, (GLfloat) - 0.588313,
+       (GLfloat) 0.338094, (GLfloat) 0.207062, (GLfloat) - 0.661906,
+       (GLfloat) 0.706063, (GLfloat) 0.207062, (GLfloat) - 0.588313,
+       (GLfloat) 0.661906, (GLfloat) 0.207062, (GLfloat) - 0.661906,
+       (GLfloat) 0.585922, (GLfloat) 0.295922, (GLfloat) - 0.700484,
+       (GLfloat) 0.595062, (GLfloat) 0.077813, (GLfloat) - 0.721812,
+       (GLfloat) 0.591406, (GLfloat) 0.132531, (GLfloat) - 0.713281,
+       (GLfloat) 0.500000, (GLfloat) 0.393625, (GLfloat) - 0.710938,
+       (GLfloat) 0.654688, (GLfloat) 0.393625, (GLfloat) - 0.654688,
+       (GLfloat) 0.345313, (GLfloat) 0.393625, (GLfloat) - 0.654688,
+       (GLfloat) 0.299516, (GLfloat) 0.295922, (GLfloat) - 0.585922,
+       (GLfloat) 0.293938, (GLfloat) 0.207062, (GLfloat) - 0.411687,
+       (GLfloat) 0.279219, (GLfloat) 0.207062, (GLfloat) - 0.500000,
+       (GLfloat) 0.278187, (GLfloat) 0.077813, (GLfloat) - 0.595062,
+       (GLfloat) 0.286719, (GLfloat) 0.132531, (GLfloat) - 0.591406,
+       (GLfloat) 0.289063, (GLfloat) 0.393625, (GLfloat) - 0.500000,
+       (GLfloat) 0.345313, (GLfloat) 0.393625, (GLfloat) - 0.345313,
+       (GLfloat) 0.299516, (GLfloat) 0.295922, (GLfloat) - 0.414078,
+       (GLfloat) 0.278187, (GLfloat) 0.077813, (GLfloat) - 0.404938,
+       (GLfloat) 0.286719, (GLfloat) 0.132531, (GLfloat) - 0.408594,
+       (GLfloat) 0.411687, (GLfloat) 0.207062, (GLfloat) - 0.293938,
+       (GLfloat) 0.338094, (GLfloat) 0.207062, (GLfloat) - 0.338094,
+       (GLfloat) 0.414078, (GLfloat) 0.295922, (GLfloat) - 0.299516,
+       (GLfloat) 0.588313, (GLfloat) 0.207062, (GLfloat) - 0.293938,
+       (GLfloat) 0.500000, (GLfloat) 0.207062, (GLfloat) - 0.279219,
+       (GLfloat) 0.404938, (GLfloat) 0.077813, (GLfloat) - 0.278187,
+       (GLfloat) 0.408594, (GLfloat) 0.132531, (GLfloat) - 0.286719,
+       (GLfloat) 0.500000, (GLfloat) 0.393625, (GLfloat) - 0.289063,
+       (GLfloat) 0.654688, (GLfloat) 0.393625, (GLfloat) - 0.345313,
+       (GLfloat) 0.585922, (GLfloat) 0.295922, (GLfloat) - 0.299516,
+       (GLfloat) 0.595062, (GLfloat) 0.077813, (GLfloat) - 0.278187,
+       (GLfloat) 0.591406, (GLfloat) 0.132531, (GLfloat) - 0.286719,
+       (GLfloat) 0.706063, (GLfloat) 0.207062, (GLfloat) - 0.411687,
+       (GLfloat) 0.661906, (GLfloat) 0.207062, (GLfloat) - 0.338094,
+       (GLfloat) 0.700484, (GLfloat) 0.295922, (GLfloat) - 0.414078,
+       (GLfloat) 0.720781, (GLfloat) 0.207062, (GLfloat) - 0.500000,
+       (GLfloat) 0.721812, (GLfloat) 0.077813, (GLfloat) - 0.404938,
+       (GLfloat) 0.713281, (GLfloat) 0.132531, (GLfloat) - 0.408594,
+       (GLfloat) 0.710938, (GLfloat) 0.393625, (GLfloat) - 0.500000,
+       (GLfloat) 0.700484, (GLfloat) 0.295922, (GLfloat) - 0.585922,
+       (GLfloat) 0.721812, (GLfloat) 0.077813, (GLfloat) - 0.595062,
+       (GLfloat) 0.713281, (GLfloat) 0.132531, (GLfloat) - 0.591406,
+       (GLfloat) 0.737656, (GLfloat) 0.077813, (GLfloat) - 0.500000,
+       (GLfloat) 0.706000, (GLfloat) 0.016681, (GLfloat) - 0.412500,
+       (GLfloat) 0.722453, (GLfloat) 0.040123, (GLfloat) - 0.404859,
+       (GLfloat) 0.674281, (GLfloat) 0.077813, (GLfloat) - 0.325719,
+       (GLfloat) 0.674281, (GLfloat) 0.077813, (GLfloat) - 0.674281,
+       (GLfloat) 0.706000, (GLfloat) 0.016681, (GLfloat) - 0.587500,
+       (GLfloat) 0.722453, (GLfloat) 0.040123, (GLfloat) - 0.595141,
+       (GLfloat) 0.590500, (GLfloat) - 0.005194, (GLfloat) - 0.590500,
+       (GLfloat) 0.664625, (GLfloat) 0.003052, (GLfloat) - 0.582500,
+       (GLfloat) 0.721500, (GLfloat) 0.015465, (GLfloat) - 0.500000,
+       (GLfloat) 0.587500, (GLfloat) 0.016681, (GLfloat) - 0.706000,
+       (GLfloat) 0.660875, (GLfloat) 0.017896, (GLfloat) - 0.660875,
+       (GLfloat) 0.587500, (GLfloat) 0.016681, (GLfloat) - 0.294000,
+       (GLfloat) 0.660875, (GLfloat) 0.017896, (GLfloat) - 0.339125,
+       (GLfloat) 0.590500, (GLfloat) - 0.005194, (GLfloat) - 0.409500,
+       (GLfloat) 0.664625, (GLfloat) 0.003052, (GLfloat) - 0.417500,
+       (GLfloat) 0.500000, (GLfloat) 0.077813, (GLfloat) - 0.737656,
+       (GLfloat) 0.595141, (GLfloat) 0.040123, (GLfloat) - 0.722453,
+       (GLfloat) 0.325719, (GLfloat) 0.077813, (GLfloat) - 0.674281,
+       (GLfloat) 0.412500, (GLfloat) 0.016681, (GLfloat) - 0.706000,
+       (GLfloat) 0.404859, (GLfloat) 0.040123, (GLfloat) - 0.722453,
+       (GLfloat) 0.409500, (GLfloat) - 0.005194, (GLfloat) - 0.590500,
+       (GLfloat) 0.417500, (GLfloat) 0.003052, (GLfloat) - 0.664625,
+       (GLfloat) 0.500000, (GLfloat) 0.015465, (GLfloat) - 0.721500,
+       (GLfloat) 0.294000, (GLfloat) 0.016681, (GLfloat) - 0.587500,
+       (GLfloat) 0.339125, (GLfloat) 0.017896, (GLfloat) - 0.660875,
+       (GLfloat) 0.582500, (GLfloat) 0.003052, (GLfloat) - 0.664625,
+       (GLfloat) 0.262344, (GLfloat) 0.077813, (GLfloat) - 0.500000,
+       (GLfloat) 0.277547, (GLfloat) 0.040123, (GLfloat) - 0.595141,
+       (GLfloat) 0.325719, (GLfloat) 0.077813, (GLfloat) - 0.325719,
+       (GLfloat) 0.294000, (GLfloat) 0.016681, (GLfloat) - 0.412500,
+       (GLfloat) 0.277547, (GLfloat) 0.040123, (GLfloat) - 0.404859,
+       (GLfloat) 0.409500, (GLfloat) - 0.005194, (GLfloat) - 0.409500,
+       (GLfloat) 0.335375, (GLfloat) 0.003052, (GLfloat) - 0.417500,
+       (GLfloat) 0.278500, (GLfloat) 0.015465, (GLfloat) - 0.500000,
+       (GLfloat) 0.412500, (GLfloat) 0.016681, (GLfloat) - 0.294000,
+       (GLfloat) 0.339125, (GLfloat) 0.017896, (GLfloat) - 0.339125,
+       (GLfloat) 0.335375, (GLfloat) 0.003052, (GLfloat) - 0.582500,
+       (GLfloat) 0.500000, (GLfloat) 0.077813, (GLfloat) - 0.262344,
+       (GLfloat) 0.404859, (GLfloat) 0.040123, (GLfloat) - 0.277547,
+       (GLfloat) 0.595141, (GLfloat) 0.040123, (GLfloat) - 0.277547,
+       (GLfloat) 0.582500, (GLfloat) 0.003052, (GLfloat) - 0.335375,
+       (GLfloat) 0.500000, (GLfloat) 0.015465, (GLfloat) - 0.278500,
+       (GLfloat) 0.417500, (GLfloat) 0.003052, (GLfloat) - 0.335375,
+       (GLfloat) 0.500000, (GLfloat) - 0.007972, (GLfloat) - 0.597750,
+       (GLfloat) 0.597750, (GLfloat) - 0.007972, (GLfloat) - 0.500000,
+       (GLfloat) 0.402250, (GLfloat) - 0.007972, (GLfloat) - 0.500000,
+       (GLfloat) 0.500000, (GLfloat) - 0.007972, (GLfloat) - 0.402250,
+};
+
+static GLfloat s1_1_normals[] =
+{
+       (GLfloat) 0.844155, (GLfloat) - 0.175691, (GLfloat) - 0.506493,
+       (GLfloat) 0.844155, (GLfloat) - 0.175690, (GLfloat) - 0.506493,
+       (GLfloat) 0.971634, (GLfloat) - 0.172349, (GLfloat) - 0.161939,
+       (GLfloat) 0.971634, (GLfloat) - 0.172348, (GLfloat) - 0.161939,
+       (GLfloat) 0.985737, (GLfloat) - 0.023907, (GLfloat) - 0.166587,
+       (GLfloat) 0.986237, (GLfloat) - 0.017860, (GLfloat) - 0.164373,
+       (GLfloat) 0.856157, (GLfloat) - 0.009890, (GLfloat) - 0.516621,
+       (GLfloat) 0.857379, (GLfloat) - 0.016331, (GLfloat) - 0.514427,
+       (GLfloat) 0.844155, (GLfloat) - 0.175690, (GLfloat) 0.506493,
+       (GLfloat) 0.844155, (GLfloat) - 0.175690, (GLfloat) 0.506493,
+       (GLfloat) 0.856157, (GLfloat) - 0.009889, (GLfloat) 0.516621,
+       (GLfloat) 0.857379, (GLfloat) - 0.016331, (GLfloat) 0.514427,
+       (GLfloat) 0.985737, (GLfloat) - 0.023907, (GLfloat) 0.166587,
+       (GLfloat) 0.986237, (GLfloat) - 0.017860, (GLfloat) 0.164373,
+       (GLfloat) 0.971634, (GLfloat) - 0.172348, (GLfloat) 0.161939,
+       (GLfloat) 0.971634, (GLfloat) - 0.172348, (GLfloat) 0.161939,
+       (GLfloat) 0.283621, (GLfloat) 0.936578, (GLfloat) 0.205866,
+       (GLfloat) 0.264056, (GLfloat) 0.947923, (GLfloat) 0.178092,
+       (GLfloat) 0.315105, (GLfloat) 0.946548, (GLfloat) 0.068965,
+       (GLfloat) 0.304029, (GLfloat) 0.949849, (GLfloat) 0.073162,
+       (GLfloat) 0.783125, (GLfloat) 0.607180, (GLfloat) 0.134346,
+       (GLfloat) 0.804111, (GLfloat) 0.575131, (GLfloat) 0.150431,
+       (GLfloat) 0.650208, (GLfloat) 0.649088, (GLfloat) 0.394860,
+       (GLfloat) 0.665312, (GLfloat) 0.617634, (GLfloat) 0.419391,
+       (GLfloat) 0.264056, (GLfloat) 0.947923, (GLfloat) - 0.178092,
+       (GLfloat) 0.283621, (GLfloat) 0.936578, (GLfloat) - 0.205866,
+       (GLfloat) 0.650207, (GLfloat) 0.649089, (GLfloat) - 0.394860,
+       (GLfloat) 0.665311, (GLfloat) 0.617634, (GLfloat) - 0.419391,
+       (GLfloat) 0.804111, (GLfloat) 0.575131, (GLfloat) - 0.150431,
+       (GLfloat) 0.783125, (GLfloat) 0.607180, (GLfloat) - 0.134346,
+       (GLfloat) 0.304029, (GLfloat) 0.949849, (GLfloat) - 0.073162,
+       (GLfloat) 0.315105, (GLfloat) 0.946548, (GLfloat) - 0.068965,
+       (GLfloat) 0.506493, (GLfloat) - 0.175691, (GLfloat) 0.844155,
+       (GLfloat) 0.506493, (GLfloat) - 0.175691, (GLfloat) 0.844155,
+       (GLfloat) 0.161939, (GLfloat) - 0.172349, (GLfloat) 0.971633,
+       (GLfloat) 0.161939, (GLfloat) - 0.172349, (GLfloat) 0.971633,
+       (GLfloat) 0.166587, (GLfloat) - 0.023907, (GLfloat) 0.985737,
+       (GLfloat) 0.164373, (GLfloat) - 0.017860, (GLfloat) 0.986237,
+       (GLfloat) 0.516622, (GLfloat) - 0.009888, (GLfloat) 0.856157,
+       (GLfloat) 0.514427, (GLfloat) - 0.016331, (GLfloat) 0.857379,
+       (GLfloat) - 0.506493, (GLfloat) - 0.175691, (GLfloat) 0.844155,
+       (GLfloat) - 0.506493, (GLfloat) - 0.175691, (GLfloat) 0.844155,
+       (GLfloat) - 0.516622, (GLfloat) - 0.009887, (GLfloat) 0.856157,
+       (GLfloat) - 0.514427, (GLfloat) - 0.016331, (GLfloat) 0.857379,
+       (GLfloat) - 0.166587, (GLfloat) - 0.023907, (GLfloat) 0.985737,
+       (GLfloat) - 0.164373, (GLfloat) - 0.017860, (GLfloat) 0.986237,
+       (GLfloat) - 0.161939, (GLfloat) - 0.172349, (GLfloat) 0.971633,
+       (GLfloat) - 0.161939, (GLfloat) - 0.172349, (GLfloat) 0.971633,
+       (GLfloat) - 0.205866, (GLfloat) 0.936578, (GLfloat) 0.283621,
+       (GLfloat) - 0.178092, (GLfloat) 0.947923, (GLfloat) 0.264055,
+       (GLfloat) - 0.068965, (GLfloat) 0.946548, (GLfloat) 0.315105,
+       (GLfloat) - 0.073162, (GLfloat) 0.949849, (GLfloat) 0.304029,
+       (GLfloat) - 0.134346, (GLfloat) 0.607180, (GLfloat) 0.783125,
+       (GLfloat) - 0.150431, (GLfloat) 0.575131, (GLfloat) 0.804111,
+       (GLfloat) - 0.394861, (GLfloat) 0.649087, (GLfloat) 0.650209,
+       (GLfloat) - 0.419390, (GLfloat) 0.617634, (GLfloat) 0.665312,
+       (GLfloat) 0.178092, (GLfloat) 0.947923, (GLfloat) 0.264056,
+       (GLfloat) 0.205866, (GLfloat) 0.936578, (GLfloat) 0.283621,
+       (GLfloat) 0.394861, (GLfloat) 0.649087, (GLfloat) 0.650208,
+       (GLfloat) 0.419390, (GLfloat) 0.617634, (GLfloat) 0.665312,
+       (GLfloat) 0.150431, (GLfloat) 0.575131, (GLfloat) 0.804111,
+       (GLfloat) 0.134346, (GLfloat) 0.607180, (GLfloat) 0.783125,
+       (GLfloat) 0.073162, (GLfloat) 0.949849, (GLfloat) 0.304029,
+       (GLfloat) 0.068965, (GLfloat) 0.946548, (GLfloat) 0.315105,
+       (GLfloat) - 0.844155, (GLfloat) - 0.175691, (GLfloat) 0.506493,
+       (GLfloat) - 0.844155, (GLfloat) - 0.175691, (GLfloat) 0.506493,
+       (GLfloat) - 0.971633, (GLfloat) - 0.172349, (GLfloat) 0.161939,
+       (GLfloat) - 0.971633, (GLfloat) - 0.172349, (GLfloat) 0.161939,
+       (GLfloat) - 0.985737, (GLfloat) - 0.023907, (GLfloat) 0.166587,
+       (GLfloat) - 0.986237, (GLfloat) - 0.017860, (GLfloat) 0.164373,
+       (GLfloat) - 0.856157, (GLfloat) - 0.009887, (GLfloat) 0.516622,
+       (GLfloat) - 0.857379, (GLfloat) - 0.016331, (GLfloat) 0.514427,
+       (GLfloat) - 0.844155, (GLfloat) - 0.175691, (GLfloat) - 0.506493,
+       (GLfloat) - 0.844155, (GLfloat) - 0.175691, (GLfloat) - 0.506493,
+       (GLfloat) - 0.856157, (GLfloat) - 0.009888, (GLfloat) - 0.516622,
+       (GLfloat) - 0.857379, (GLfloat) - 0.016331, (GLfloat) - 0.514427,
+       (GLfloat) - 0.985737, (GLfloat) - 0.023907, (GLfloat) - 0.166587,
+       (GLfloat) - 0.986237, (GLfloat) - 0.017860, (GLfloat) - 0.164373,
+       (GLfloat) - 0.971633, (GLfloat) - 0.172349, (GLfloat) - 0.161939,
+       (GLfloat) - 0.971633, (GLfloat) - 0.172349, (GLfloat) - 0.161939,
+       (GLfloat) - 0.283621, (GLfloat) 0.936578, (GLfloat) - 0.205866,
+       (GLfloat) - 0.264056, (GLfloat) 0.947923, (GLfloat) - 0.178092,
+       (GLfloat) - 0.315105, (GLfloat) 0.946548, (GLfloat) - 0.068965,
+       (GLfloat) - 0.304029, (GLfloat) 0.949849, (GLfloat) - 0.073162,
+       (GLfloat) - 0.783125, (GLfloat) 0.607180, (GLfloat) - 0.134346,
+       (GLfloat) - 0.804111, (GLfloat) 0.575131, (GLfloat) - 0.150431,
+       (GLfloat) - 0.650208, (GLfloat) 0.649087, (GLfloat) - 0.394861,
+       (GLfloat) - 0.665312, (GLfloat) 0.617634, (GLfloat) - 0.419390,
+       (GLfloat) - 0.264055, (GLfloat) 0.947923, (GLfloat) 0.178092,
+       (GLfloat) - 0.283621, (GLfloat) 0.936578, (GLfloat) 0.205866,
+       (GLfloat) - 0.650209, (GLfloat) 0.649087, (GLfloat) 0.394861,
+       (GLfloat) - 0.665312, (GLfloat) 0.617634, (GLfloat) 0.419390,
+       (GLfloat) - 0.804111, (GLfloat) 0.575131, (GLfloat) 0.150431,
+       (GLfloat) - 0.783125, (GLfloat) 0.607180, (GLfloat) 0.134346,
+       (GLfloat) - 0.304029, (GLfloat) 0.949849, (GLfloat) 0.073162,
+       (GLfloat) - 0.315105, (GLfloat) 0.946548, (GLfloat) 0.068965,
+       (GLfloat) - 0.506493, (GLfloat) - 0.175690, (GLfloat) - 0.844155,
+       (GLfloat) - 0.506493, (GLfloat) - 0.175690, (GLfloat) - 0.844155,
+       (GLfloat) - 0.161939, (GLfloat) - 0.172348, (GLfloat) - 0.971634,
+       (GLfloat) - 0.161939, (GLfloat) - 0.172348, (GLfloat) - 0.971634,
+       (GLfloat) - 0.166587, (GLfloat) - 0.023907, (GLfloat) - 0.985737,
+       (GLfloat) - 0.164373, (GLfloat) - 0.017860, (GLfloat) - 0.986237,
+       (GLfloat) - 0.516621, (GLfloat) - 0.009889, (GLfloat) - 0.856157,
+       (GLfloat) - 0.514427, (GLfloat) - 0.016331, (GLfloat) - 0.857379,
+       (GLfloat) 0.506493, (GLfloat) - 0.175690, (GLfloat) - 0.844155,
+       (GLfloat) 0.506493, (GLfloat) - 0.175691, (GLfloat) - 0.844155,
+       (GLfloat) 0.516621, (GLfloat) - 0.009890, (GLfloat) - 0.856157,
+       (GLfloat) 0.514427, (GLfloat) - 0.016331, (GLfloat) - 0.857379,
+       (GLfloat) 0.166587, (GLfloat) - 0.023907, (GLfloat) - 0.985737,
+       (GLfloat) 0.164373, (GLfloat) - 0.017860, (GLfloat) - 0.986237,
+       (GLfloat) 0.161939, (GLfloat) - 0.172349, (GLfloat) - 0.971634,
+       (GLfloat) 0.161939, (GLfloat) - 0.172348, (GLfloat) - 0.971634,
+       (GLfloat) 0.205866, (GLfloat) 0.936578, (GLfloat) - 0.283621,
+       (GLfloat) 0.178092, (GLfloat) 0.947923, (GLfloat) - 0.264056,
+       (GLfloat) 0.068965, (GLfloat) 0.946548, (GLfloat) - 0.315105,
+       (GLfloat) 0.073162, (GLfloat) 0.949849, (GLfloat) - 0.304029,
+       (GLfloat) 0.134346, (GLfloat) 0.607180, (GLfloat) - 0.783125,
+       (GLfloat) 0.150431, (GLfloat) 0.575131, (GLfloat) - 0.804111,
+       (GLfloat) 0.394860, (GLfloat) 0.649089, (GLfloat) - 0.650207,
+       (GLfloat) 0.419391, (GLfloat) 0.617634, (GLfloat) - 0.665311,
+       (GLfloat) - 0.178092, (GLfloat) 0.947923, (GLfloat) - 0.264056,
+       (GLfloat) - 0.205866, (GLfloat) 0.936578, (GLfloat) - 0.283621,
+       (GLfloat) - 0.394860, (GLfloat) 0.649088, (GLfloat) - 0.650208,
+       (GLfloat) - 0.419391, (GLfloat) 0.617634, (GLfloat) - 0.665312,
+       (GLfloat) - 0.150431, (GLfloat) 0.575131, (GLfloat) - 0.804111,
+       (GLfloat) - 0.134346, (GLfloat) 0.607180, (GLfloat) - 0.783125,
+       (GLfloat) - 0.073162, (GLfloat) 0.949849, (GLfloat) - 0.304029,
+       (GLfloat) - 0.068965, (GLfloat) 0.946548, (GLfloat) - 0.315105,
+       (GLfloat) 0.135802, (GLfloat) 0.982944, (GLfloat) 0.124011,
+       (GLfloat) 0.124011, (GLfloat) 0.982944, (GLfloat) 0.135802,
+       (GLfloat) 0.043834, (GLfloat) 0.993006, (GLfloat) 0.109621,
+       (GLfloat) 0.039656, (GLfloat) 0.992607, (GLfloat) 0.114709,
+       (GLfloat) 0.030163, (GLfloat) 0.998998, (GLfloat) 0.033079,
+       (GLfloat) 0.033079, (GLfloat) 0.998998, (GLfloat) 0.030163,
+       (GLfloat) 0.109621, (GLfloat) 0.993006, (GLfloat) 0.043834,
+       (GLfloat) 0.114709, (GLfloat) 0.992607, (GLfloat) 0.039656,
+       (GLfloat) - 0.124011, (GLfloat) 0.982944, (GLfloat) 0.135803,
+       (GLfloat) - 0.135803, (GLfloat) 0.982944, (GLfloat) 0.124011,
+       (GLfloat) - 0.109621, (GLfloat) 0.993006, (GLfloat) 0.043834,
+       (GLfloat) - 0.114709, (GLfloat) 0.992607, (GLfloat) 0.039656,
+       (GLfloat) - 0.033079, (GLfloat) 0.998998, (GLfloat) 0.030163,
+       (GLfloat) - 0.030163, (GLfloat) 0.998998, (GLfloat) 0.033079,
+       (GLfloat) - 0.043834, (GLfloat) 0.993006, (GLfloat) 0.109621,
+       (GLfloat) - 0.039656, (GLfloat) 0.992607, (GLfloat) 0.114709,
+       (GLfloat) - 0.135802, (GLfloat) 0.982944, (GLfloat) - 0.124011,
+       (GLfloat) - 0.124011, (GLfloat) 0.982944, (GLfloat) - 0.135802,
+       (GLfloat) - 0.043834, (GLfloat) 0.993006, (GLfloat) - 0.109621,
+       (GLfloat) - 0.039656, (GLfloat) 0.992607, (GLfloat) - 0.114709,
+       (GLfloat) - 0.030163, (GLfloat) 0.998998, (GLfloat) - 0.033079,
+       (GLfloat) - 0.033079, (GLfloat) 0.998998, (GLfloat) - 0.030163,
+       (GLfloat) - 0.109621, (GLfloat) 0.993006, (GLfloat) - 0.043834,
+       (GLfloat) - 0.114709, (GLfloat) 0.992607, (GLfloat) - 0.039656,
+       (GLfloat) 0.124011, (GLfloat) 0.982944, (GLfloat) - 0.135802,
+       (GLfloat) 0.135802, (GLfloat) 0.982944, (GLfloat) - 0.124011,
+       (GLfloat) 0.109621, (GLfloat) 0.993006, (GLfloat) - 0.043834,
+       (GLfloat) 0.114709, (GLfloat) 0.992607, (GLfloat) - 0.039656,
+       (GLfloat) 0.033079, (GLfloat) 0.998998, (GLfloat) - 0.030163,
+       (GLfloat) 0.030163, (GLfloat) 0.998998, (GLfloat) - 0.033079,
+       (GLfloat) 0.043834, (GLfloat) 0.993006, (GLfloat) - 0.109621,
+       (GLfloat) 0.039656, (GLfloat) 0.992607, (GLfloat) - 0.114709,
+       (GLfloat) 0.852125, (GLfloat) - 0.111720, (GLfloat) - 0.511275,
+       (GLfloat) 0.852125, (GLfloat) - 0.111718, (GLfloat) - 0.511276,
+       (GLfloat) 0.855252, (GLfloat) - 0.072245, (GLfloat) - 0.513151,
+       (GLfloat) 0.855252, (GLfloat) - 0.072244, (GLfloat) - 0.513152,
+       (GLfloat) 0.983916, (GLfloat) - 0.070836, (GLfloat) - 0.163986,
+       (GLfloat) 0.983916, (GLfloat) - 0.070836, (GLfloat) - 0.163986,
+       (GLfloat) 0.980457, (GLfloat) - 0.109554, (GLfloat) - 0.163409,
+       (GLfloat) 0.980457, (GLfloat) - 0.109553, (GLfloat) - 0.163410,
+       (GLfloat) 0.857405, (GLfloat) - 0.014299, (GLfloat) - 0.514444,
+       (GLfloat) 0.857405, (GLfloat) - 0.014300, (GLfloat) - 0.514443,
+       (GLfloat) 0.986297, (GLfloat) - 0.014019, (GLfloat) - 0.164382,
+       (GLfloat) 0.986297, (GLfloat) - 0.014019, (GLfloat) - 0.164382,
+       (GLfloat) 0.985564, (GLfloat) - 0.041017, (GLfloat) - 0.164261,
+       (GLfloat) 0.985564, (GLfloat) - 0.041017, (GLfloat) - 0.164260,
+       (GLfloat) 0.856742, (GLfloat) - 0.041836, (GLfloat) - 0.514045,
+       (GLfloat) 0.856742, (GLfloat) - 0.041836, (GLfloat) - 0.514045,
+       (GLfloat) 0.857405, (GLfloat) - 0.014299, (GLfloat) 0.514443,
+       (GLfloat) 0.857405, (GLfloat) - 0.014299, (GLfloat) 0.514444,
+       (GLfloat) 0.856742, (GLfloat) - 0.041836, (GLfloat) 0.514045,
+       (GLfloat) 0.856742, (GLfloat) - 0.041836, (GLfloat) 0.514045,
+       (GLfloat) 0.985564, (GLfloat) - 0.041017, (GLfloat) 0.164260,
+       (GLfloat) 0.985564, (GLfloat) - 0.041017, (GLfloat) 0.164261,
+       (GLfloat) 0.986297, (GLfloat) - 0.014019, (GLfloat) 0.164382,
+       (GLfloat) 0.986297, (GLfloat) - 0.014019, (GLfloat) 0.164382,
+       (GLfloat) 0.852125, (GLfloat) - 0.111719, (GLfloat) 0.511275,
+       (GLfloat) 0.852125, (GLfloat) - 0.111718, (GLfloat) 0.511276,
+       (GLfloat) 0.980457, (GLfloat) - 0.109553, (GLfloat) 0.163410,
+       (GLfloat) 0.980457, (GLfloat) - 0.109554, (GLfloat) 0.163409,
+       (GLfloat) 0.983916, (GLfloat) - 0.070836, (GLfloat) 0.163986,
+       (GLfloat) 0.983916, (GLfloat) - 0.070836, (GLfloat) 0.163986,
+       (GLfloat) 0.855252, (GLfloat) - 0.072244, (GLfloat) 0.513152,
+       (GLfloat) 0.855252, (GLfloat) - 0.072245, (GLfloat) 0.513151,
+       (GLfloat) - 0.511275, (GLfloat) - 0.111719, (GLfloat) - 0.852125,
+       (GLfloat) - 0.511276, (GLfloat) - 0.111718, (GLfloat) - 0.852125,
+       (GLfloat) - 0.513151, (GLfloat) - 0.072245, (GLfloat) - 0.855252,
+       (GLfloat) - 0.513152, (GLfloat) - 0.072244, (GLfloat) - 0.855252,
+       (GLfloat) - 0.163986, (GLfloat) - 0.070836, (GLfloat) - 0.983916,
+       (GLfloat) - 0.163986, (GLfloat) - 0.070836, (GLfloat) - 0.983916,
+       (GLfloat) - 0.163409, (GLfloat) - 0.109554, (GLfloat) - 0.980457,
+       (GLfloat) - 0.163410, (GLfloat) - 0.109553, (GLfloat) - 0.980457,
+       (GLfloat) - 0.514444, (GLfloat) - 0.014299, (GLfloat) - 0.857405,
+       (GLfloat) - 0.514443, (GLfloat) - 0.014299, (GLfloat) - 0.857405,
+       (GLfloat) - 0.164382, (GLfloat) - 0.014019, (GLfloat) - 0.986297,
+       (GLfloat) - 0.164382, (GLfloat) - 0.014019, (GLfloat) - 0.986297,
+       (GLfloat) - 0.164261, (GLfloat) - 0.041017, (GLfloat) - 0.985564,
+       (GLfloat) - 0.164260, (GLfloat) - 0.041017, (GLfloat) - 0.985564,
+       (GLfloat) - 0.514045, (GLfloat) - 0.041836, (GLfloat) - 0.856742,
+       (GLfloat) - 0.514045, (GLfloat) - 0.041836, (GLfloat) - 0.856742,
+       (GLfloat) 0.514443, (GLfloat) - 0.014300, (GLfloat) - 0.857405,
+       (GLfloat) 0.514444, (GLfloat) - 0.014299, (GLfloat) - 0.857405,
+       (GLfloat) 0.514045, (GLfloat) - 0.041836, (GLfloat) - 0.856742,
+       (GLfloat) 0.514045, (GLfloat) - 0.041836, (GLfloat) - 0.856742,
+       (GLfloat) 0.164260, (GLfloat) - 0.041017, (GLfloat) - 0.985564,
+       (GLfloat) 0.164261, (GLfloat) - 0.041017, (GLfloat) - 0.985564,
+       (GLfloat) 0.164382, (GLfloat) - 0.014019, (GLfloat) - 0.986297,
+       (GLfloat) 0.164382, (GLfloat) - 0.014019, (GLfloat) - 0.986297,
+       (GLfloat) 0.511275, (GLfloat) - 0.111720, (GLfloat) - 0.852125,
+       (GLfloat) 0.511276, (GLfloat) - 0.111718, (GLfloat) - 0.852125,
+       (GLfloat) 0.163410, (GLfloat) - 0.109553, (GLfloat) - 0.980457,
+       (GLfloat) 0.163409, (GLfloat) - 0.109554, (GLfloat) - 0.980457,
+       (GLfloat) 0.163986, (GLfloat) - 0.070836, (GLfloat) - 0.983916,
+       (GLfloat) 0.163986, (GLfloat) - 0.070836, (GLfloat) - 0.983916,
+       (GLfloat) 0.513152, (GLfloat) - 0.072244, (GLfloat) - 0.855252,
+       (GLfloat) 0.513151, (GLfloat) - 0.072245, (GLfloat) - 0.855252,
+       (GLfloat) - 0.511275, (GLfloat) - 0.111719, (GLfloat) 0.852125,
+       (GLfloat) - 0.511275, (GLfloat) - 0.111719, (GLfloat) 0.852125,
+       (GLfloat) - 0.163410, (GLfloat) - 0.109554, (GLfloat) 0.980457,
+       (GLfloat) - 0.163409, (GLfloat) - 0.109555, (GLfloat) 0.980457,
+       (GLfloat) - 0.163986, (GLfloat) - 0.070835, (GLfloat) 0.983916,
+       (GLfloat) - 0.163986, (GLfloat) - 0.070835, (GLfloat) 0.983916,
+       (GLfloat) - 0.513151, (GLfloat) - 0.072244, (GLfloat) 0.855252,
+       (GLfloat) - 0.513151, (GLfloat) - 0.072245, (GLfloat) 0.855252,
+       (GLfloat) 0.511275, (GLfloat) - 0.111719, (GLfloat) 0.852125,
+       (GLfloat) 0.511275, (GLfloat) - 0.111719, (GLfloat) 0.852125,
+       (GLfloat) 0.513151, (GLfloat) - 0.072245, (GLfloat) 0.855252,
+       (GLfloat) 0.513151, (GLfloat) - 0.072244, (GLfloat) 0.855252,
+       (GLfloat) 0.163986, (GLfloat) - 0.070835, (GLfloat) 0.983916,
+       (GLfloat) 0.163986, (GLfloat) - 0.070835, (GLfloat) 0.983916,
+       (GLfloat) 0.163409, (GLfloat) - 0.109555, (GLfloat) 0.980457,
+       (GLfloat) 0.163410, (GLfloat) - 0.109554, (GLfloat) 0.980457,
+       (GLfloat) 0.514444, (GLfloat) - 0.014299, (GLfloat) 0.857405,
+       (GLfloat) 0.514443, (GLfloat) - 0.014299, (GLfloat) 0.857405,
+       (GLfloat) 0.164383, (GLfloat) - 0.014019, (GLfloat) 0.986297,
+       (GLfloat) 0.164383, (GLfloat) - 0.014019, (GLfloat) 0.986297,
+       (GLfloat) 0.164261, (GLfloat) - 0.041017, (GLfloat) 0.985564,
+       (GLfloat) 0.164261, (GLfloat) - 0.041017, (GLfloat) 0.985564,
+       (GLfloat) 0.514045, (GLfloat) - 0.041836, (GLfloat) 0.856742,
+       (GLfloat) 0.514045, (GLfloat) - 0.041836, (GLfloat) 0.856742,
+       (GLfloat) - 0.514443, (GLfloat) - 0.014299, (GLfloat) 0.857405,
+       (GLfloat) - 0.514443, (GLfloat) - 0.014299, (GLfloat) 0.857405,
+       (GLfloat) - 0.514045, (GLfloat) - 0.041836, (GLfloat) 0.856742,
+       (GLfloat) - 0.514045, (GLfloat) - 0.041836, (GLfloat) 0.856742,
+       (GLfloat) - 0.164261, (GLfloat) - 0.041017, (GLfloat) 0.985564,
+       (GLfloat) - 0.164261, (GLfloat) - 0.041017, (GLfloat) 0.985564,
+       (GLfloat) - 0.164383, (GLfloat) - 0.014019, (GLfloat) 0.986297,
+       (GLfloat) - 0.164383, (GLfloat) - 0.014019, (GLfloat) 0.986297,
+       (GLfloat) - 0.852125, (GLfloat) - 0.111719, (GLfloat) - 0.511275,
+       (GLfloat) - 0.852125, (GLfloat) - 0.111719, (GLfloat) - 0.511275,
+       (GLfloat) - 0.980457, (GLfloat) - 0.109554, (GLfloat) - 0.163410,
+       (GLfloat) - 0.980457, (GLfloat) - 0.109555, (GLfloat) - 0.163409,
+       (GLfloat) - 0.983916, (GLfloat) - 0.070835, (GLfloat) - 0.163986,
+       (GLfloat) - 0.983916, (GLfloat) - 0.070835, (GLfloat) - 0.163986,
+       (GLfloat) - 0.855252, (GLfloat) - 0.072244, (GLfloat) - 0.513151,
+       (GLfloat) - 0.855252, (GLfloat) - 0.072245, (GLfloat) - 0.513151,
+       (GLfloat) - 0.852125, (GLfloat) - 0.111719, (GLfloat) 0.511275,
+       (GLfloat) - 0.852125, (GLfloat) - 0.111719, (GLfloat) 0.511275,
+       (GLfloat) - 0.855252, (GLfloat) - 0.072245, (GLfloat) 0.513151,
+       (GLfloat) - 0.855252, (GLfloat) - 0.072244, (GLfloat) 0.513151,
+       (GLfloat) - 0.983916, (GLfloat) - 0.070835, (GLfloat) 0.163986,
+       (GLfloat) - 0.983916, (GLfloat) - 0.070835, (GLfloat) 0.163986,
+       (GLfloat) - 0.980457, (GLfloat) - 0.109555, (GLfloat) 0.163409,
+       (GLfloat) - 0.980457, (GLfloat) - 0.109554, (GLfloat) 0.163410,
+       (GLfloat) - 0.857405, (GLfloat) - 0.014299, (GLfloat) 0.514443,
+       (GLfloat) - 0.857405, (GLfloat) - 0.014299, (GLfloat) 0.514443,
+       (GLfloat) - 0.986297, (GLfloat) - 0.014019, (GLfloat) 0.164383,
+       (GLfloat) - 0.986297, (GLfloat) - 0.014019, (GLfloat) 0.164383,
+       (GLfloat) - 0.985564, (GLfloat) - 0.041017, (GLfloat) 0.164261,
+       (GLfloat) - 0.985564, (GLfloat) - 0.041017, (GLfloat) 0.164261,
+       (GLfloat) - 0.856742, (GLfloat) - 0.041836, (GLfloat) 0.514045,
+       (GLfloat) - 0.856742, (GLfloat) - 0.041836, (GLfloat) 0.514045,
+       (GLfloat) - 0.857405, (GLfloat) - 0.014299, (GLfloat) - 0.514443,
+       (GLfloat) - 0.857405, (GLfloat) - 0.014299, (GLfloat) - 0.514444,
+       (GLfloat) - 0.856742, (GLfloat) - 0.041836, (GLfloat) - 0.514045,
+       (GLfloat) - 0.856742, (GLfloat) - 0.041836, (GLfloat) - 0.514045,
+       (GLfloat) - 0.985564, (GLfloat) - 0.041017, (GLfloat) - 0.164261,
+       (GLfloat) - 0.985564, (GLfloat) - 0.041017, (GLfloat) - 0.164261,
+       (GLfloat) - 0.986297, (GLfloat) - 0.014019, (GLfloat) - 0.164383,
+       (GLfloat) - 0.986297, (GLfloat) - 0.014019, (GLfloat) - 0.164383,
+       (GLfloat) - 0.511714, (GLfloat) 0.103845, (GLfloat) - 0.852857,
+       (GLfloat) - 0.511715, (GLfloat) 0.103844, (GLfloat) - 0.852857,
+       (GLfloat) - 0.163545, (GLfloat) 0.101829, (GLfloat) - 0.981267,
+       (GLfloat) - 0.163544, (GLfloat) 0.101829, (GLfloat) - 0.981267,
+       (GLfloat) - 0.164038, (GLfloat) 0.066199, (GLfloat) - 0.984230,
+       (GLfloat) - 0.164039, (GLfloat) 0.066198, (GLfloat) - 0.984230,
+       (GLfloat) - 0.513322, (GLfloat) 0.067516, (GLfloat) - 0.855536,
+       (GLfloat) - 0.513322, (GLfloat) 0.067517, (GLfloat) - 0.855536,
+       (GLfloat) 0.511714, (GLfloat) 0.103845, (GLfloat) - 0.852857,
+       (GLfloat) 0.511715, (GLfloat) 0.103844, (GLfloat) - 0.852857,
+       (GLfloat) 0.513322, (GLfloat) 0.067517, (GLfloat) - 0.855536,
+       (GLfloat) 0.513322, (GLfloat) 0.067516, (GLfloat) - 0.855536,
+       (GLfloat) 0.164038, (GLfloat) 0.066199, (GLfloat) - 0.984230,
+       (GLfloat) 0.164039, (GLfloat) 0.066198, (GLfloat) - 0.984230,
+       (GLfloat) 0.163544, (GLfloat) 0.101829, (GLfloat) - 0.981267,
+       (GLfloat) 0.163545, (GLfloat) 0.101829, (GLfloat) - 0.981267,
+       (GLfloat) 0.514446, (GLfloat) 0.013998, (GLfloat) - 0.857409,
+       (GLfloat) 0.514445, (GLfloat) 0.013999, (GLfloat) - 0.857409,
+       (GLfloat) 0.164383, (GLfloat) 0.013724, (GLfloat) - 0.986301,
+       (GLfloat) 0.164383, (GLfloat) 0.013724, (GLfloat) - 0.986301,
+       (GLfloat) 0.164274, (GLfloat) 0.039013, (GLfloat) - 0.985643,
+       (GLfloat) 0.164273, (GLfloat) 0.039013, (GLfloat) - 0.985643,
+       (GLfloat) 0.514088, (GLfloat) 0.039792, (GLfloat) - 0.856814,
+       (GLfloat) 0.514088, (GLfloat) 0.039792, (GLfloat) - 0.856814,
+       (GLfloat) - 0.514445, (GLfloat) 0.013999, (GLfloat) - 0.857409,
+       (GLfloat) - 0.514446, (GLfloat) 0.013998, (GLfloat) - 0.857409,
+       (GLfloat) - 0.514088, (GLfloat) 0.039792, (GLfloat) - 0.856814,
+       (GLfloat) - 0.514088, (GLfloat) 0.039792, (GLfloat) - 0.856814,
+       (GLfloat) - 0.164273, (GLfloat) 0.039013, (GLfloat) - 0.985643,
+       (GLfloat) - 0.164274, (GLfloat) 0.039013, (GLfloat) - 0.985643,
+       (GLfloat) - 0.164383, (GLfloat) 0.013724, (GLfloat) - 0.986301,
+       (GLfloat) - 0.164383, (GLfloat) 0.013724, (GLfloat) - 0.986301,
+       (GLfloat) - 0.852857, (GLfloat) 0.103845, (GLfloat) - 0.511714,
+       (GLfloat) - 0.852857, (GLfloat) 0.103845, (GLfloat) - 0.511714,
+       (GLfloat) - 0.855536, (GLfloat) 0.067516, (GLfloat) - 0.513322,
+       (GLfloat) - 0.855536, (GLfloat) 0.067516, (GLfloat) - 0.513322,
+       (GLfloat) - 0.984230, (GLfloat) 0.066198, (GLfloat) - 0.164038,
+       (GLfloat) - 0.984230, (GLfloat) 0.066198, (GLfloat) - 0.164039,
+       (GLfloat) - 0.981266, (GLfloat) 0.101830, (GLfloat) - 0.163544,
+       (GLfloat) - 0.981266, (GLfloat) 0.101829, (GLfloat) - 0.163545,
+       (GLfloat) - 0.857409, (GLfloat) 0.013998, (GLfloat) - 0.514446,
+       (GLfloat) - 0.857409, (GLfloat) 0.013999, (GLfloat) - 0.514445,
+       (GLfloat) - 0.986301, (GLfloat) 0.013724, (GLfloat) - 0.164383,
+       (GLfloat) - 0.986301, (GLfloat) 0.013724, (GLfloat) - 0.164383,
+       (GLfloat) - 0.985643, (GLfloat) 0.039013, (GLfloat) - 0.164274,
+       (GLfloat) - 0.985643, (GLfloat) 0.039013, (GLfloat) - 0.164274,
+       (GLfloat) - 0.856814, (GLfloat) 0.039792, (GLfloat) - 0.514088,
+       (GLfloat) - 0.856814, (GLfloat) 0.039792, (GLfloat) - 0.514088,
+       (GLfloat) - 0.857409, (GLfloat) 0.013999, (GLfloat) 0.514445,
+       (GLfloat) - 0.857409, (GLfloat) 0.013998, (GLfloat) 0.514446,
+       (GLfloat) - 0.856814, (GLfloat) 0.039792, (GLfloat) 0.514088,
+       (GLfloat) - 0.856814, (GLfloat) 0.039792, (GLfloat) 0.514088,
+       (GLfloat) - 0.985643, (GLfloat) 0.039013, (GLfloat) 0.164274,
+       (GLfloat) - 0.985643, (GLfloat) 0.039013, (GLfloat) 0.164274,
+       (GLfloat) - 0.986301, (GLfloat) 0.013724, (GLfloat) 0.164383,
+       (GLfloat) - 0.986301, (GLfloat) 0.013724, (GLfloat) 0.164383,
+       (GLfloat) - 0.852857, (GLfloat) 0.103845, (GLfloat) 0.511714,
+       (GLfloat) - 0.852857, (GLfloat) 0.103845, (GLfloat) 0.511714,
+       (GLfloat) - 0.981266, (GLfloat) 0.101829, (GLfloat) 0.163545,
+       (GLfloat) - 0.981266, (GLfloat) 0.101830, (GLfloat) 0.163544,
+       (GLfloat) - 0.984230, (GLfloat) 0.066198, (GLfloat) 0.164038,
+       (GLfloat) - 0.984230, (GLfloat) 0.066198, (GLfloat) 0.164039,
+       (GLfloat) - 0.855536, (GLfloat) 0.067516, (GLfloat) 0.513322,
+       (GLfloat) - 0.855536, (GLfloat) 0.067516, (GLfloat) 0.513322,
+       (GLfloat) - 0.511714, (GLfloat) 0.103845, (GLfloat) 0.852857,
+       (GLfloat) - 0.511714, (GLfloat) 0.103845, (GLfloat) 0.852857,
+       (GLfloat) - 0.513322, (GLfloat) 0.067516, (GLfloat) 0.855536,
+       (GLfloat) - 0.513322, (GLfloat) 0.067516, (GLfloat) 0.855536,
+       (GLfloat) - 0.164038, (GLfloat) 0.066198, (GLfloat) 0.984230,
+       (GLfloat) - 0.164039, (GLfloat) 0.066198, (GLfloat) 0.984230,
+       (GLfloat) - 0.163544, (GLfloat) 0.101830, (GLfloat) 0.981266,
+       (GLfloat) - 0.163545, (GLfloat) 0.101829, (GLfloat) 0.981266,
+       (GLfloat) - 0.514446, (GLfloat) 0.013998, (GLfloat) 0.857409,
+       (GLfloat) - 0.514445, (GLfloat) 0.013999, (GLfloat) 0.857409,
+       (GLfloat) - 0.164383, (GLfloat) 0.013724, (GLfloat) 0.986301,
+       (GLfloat) - 0.164383, (GLfloat) 0.013724, (GLfloat) 0.986301,
+       (GLfloat) - 0.164274, (GLfloat) 0.039013, (GLfloat) 0.985643,
+       (GLfloat) - 0.164274, (GLfloat) 0.039013, (GLfloat) 0.985643,
+       (GLfloat) - 0.514088, (GLfloat) 0.039792, (GLfloat) 0.856814,
+       (GLfloat) - 0.514088, (GLfloat) 0.039792, (GLfloat) 0.856814,
+       (GLfloat) 0.514445, (GLfloat) 0.013999, (GLfloat) 0.857409,
+       (GLfloat) 0.514446, (GLfloat) 0.013998, (GLfloat) 0.857409,
+       (GLfloat) 0.514088, (GLfloat) 0.039792, (GLfloat) 0.856814,
+       (GLfloat) 0.514088, (GLfloat) 0.039792, (GLfloat) 0.856814,
+       (GLfloat) 0.164274, (GLfloat) 0.039013, (GLfloat) 0.985643,
+       (GLfloat) 0.164274, (GLfloat) 0.039013, (GLfloat) 0.985643,
+       (GLfloat) 0.164383, (GLfloat) 0.013724, (GLfloat) 0.986301,
+       (GLfloat) 0.164383, (GLfloat) 0.013724, (GLfloat) 0.986301,
+       (GLfloat) 0.511714, (GLfloat) 0.103845, (GLfloat) 0.852857,
+       (GLfloat) 0.511714, (GLfloat) 0.103845, (GLfloat) 0.852857,
+       (GLfloat) 0.163545, (GLfloat) 0.101829, (GLfloat) 0.981266,
+       (GLfloat) 0.163544, (GLfloat) 0.101830, (GLfloat) 0.981266,
+       (GLfloat) 0.164038, (GLfloat) 0.066198, (GLfloat) 0.984230,
+       (GLfloat) 0.164039, (GLfloat) 0.066198, (GLfloat) 0.984230,
+       (GLfloat) 0.513322, (GLfloat) 0.067516, (GLfloat) 0.855536,
+       (GLfloat) 0.513322, (GLfloat) 0.067516, (GLfloat) 0.855536,
+       (GLfloat) 0.852857, (GLfloat) 0.103845, (GLfloat) 0.511714,
+       (GLfloat) 0.852857, (GLfloat) 0.103844, (GLfloat) 0.511715,
+       (GLfloat) 0.855536, (GLfloat) 0.067517, (GLfloat) 0.513322,
+       (GLfloat) 0.855536, (GLfloat) 0.067516, (GLfloat) 0.513322,
+       (GLfloat) 0.984230, (GLfloat) 0.066199, (GLfloat) 0.164038,
+       (GLfloat) 0.984230, (GLfloat) 0.066198, (GLfloat) 0.164039,
+       (GLfloat) 0.981267, (GLfloat) 0.101829, (GLfloat) 0.163544,
+       (GLfloat) 0.981267, (GLfloat) 0.101829, (GLfloat) 0.163545,
+       (GLfloat) 0.857409, (GLfloat) 0.013998, (GLfloat) 0.514446,
+       (GLfloat) 0.857409, (GLfloat) 0.013999, (GLfloat) 0.514445,
+       (GLfloat) 0.986301, (GLfloat) 0.013724, (GLfloat) 0.164383,
+       (GLfloat) 0.986301, (GLfloat) 0.013724, (GLfloat) 0.164383,
+       (GLfloat) 0.985643, (GLfloat) 0.039013, (GLfloat) 0.164274,
+       (GLfloat) 0.985643, (GLfloat) 0.039013, (GLfloat) 0.164273,
+       (GLfloat) 0.856814, (GLfloat) 0.039792, (GLfloat) 0.514088,
+       (GLfloat) 0.856814, (GLfloat) 0.039792, (GLfloat) 0.514088,
+       (GLfloat) 0.857409, (GLfloat) 0.013999, (GLfloat) - 0.514445,
+       (GLfloat) 0.857409, (GLfloat) 0.013998, (GLfloat) - 0.514446,
+       (GLfloat) 0.856814, (GLfloat) 0.039792, (GLfloat) - 0.514088,
+       (GLfloat) 0.856814, (GLfloat) 0.039792, (GLfloat) - 0.514088,
+       (GLfloat) 0.985643, (GLfloat) 0.039013, (GLfloat) - 0.164273,
+       (GLfloat) 0.985643, (GLfloat) 0.039013, (GLfloat) - 0.164274,
+       (GLfloat) 0.986301, (GLfloat) 0.013724, (GLfloat) - 0.164383,
+       (GLfloat) 0.986301, (GLfloat) 0.013724, (GLfloat) - 0.164383,
+       (GLfloat) 0.852857, (GLfloat) 0.103845, (GLfloat) - 0.511714,
+       (GLfloat) 0.852857, (GLfloat) 0.103844, (GLfloat) - 0.511715,
+       (GLfloat) 0.981267, (GLfloat) 0.101829, (GLfloat) - 0.163545,
+       (GLfloat) 0.981267, (GLfloat) 0.101829, (GLfloat) - 0.163544,
+       (GLfloat) 0.984230, (GLfloat) 0.066199, (GLfloat) - 0.164038,
+       (GLfloat) 0.984230, (GLfloat) 0.066198, (GLfloat) - 0.164039,
+       (GLfloat) 0.855536, (GLfloat) 0.067516, (GLfloat) - 0.513322,
+       (GLfloat) 0.855536, (GLfloat) 0.067517, (GLfloat) - 0.513322,
+       (GLfloat) 0.845633, (GLfloat) 0.165745, (GLfloat) 0.507379,
+       (GLfloat) 0.845633, (GLfloat) 0.165745, (GLfloat) 0.507379,
+       (GLfloat) 0.973270, (GLfloat) 0.162582, (GLfloat) 0.162211,
+       (GLfloat) 0.973270, (GLfloat) 0.162582, (GLfloat) 0.162212,
+       (GLfloat) 0.985759, (GLfloat) 0.022905, (GLfloat) 0.166594,
+       (GLfloat) 0.986250, (GLfloat) 0.017105, (GLfloat) 0.164375,
+       (GLfloat) 0.856160, (GLfloat) 0.009467, (GLfloat) 0.516625,
+       (GLfloat) 0.857388, (GLfloat) 0.015640, (GLfloat) 0.514433,
+       (GLfloat) 0.845633, (GLfloat) 0.165745, (GLfloat) - 0.507380,
+       (GLfloat) 0.845633, (GLfloat) 0.165745, (GLfloat) - 0.507379,
+       (GLfloat) 0.856160, (GLfloat) 0.009468, (GLfloat) - 0.516624,
+       (GLfloat) 0.857388, (GLfloat) 0.015640, (GLfloat) - 0.514433,
+       (GLfloat) 0.985759, (GLfloat) 0.022905, (GLfloat) - 0.166594,
+       (GLfloat) 0.986250, (GLfloat) 0.017105, (GLfloat) - 0.164375,
+       (GLfloat) 0.973270, (GLfloat) 0.162582, (GLfloat) - 0.162211,
+       (GLfloat) 0.973270, (GLfloat) 0.162582, (GLfloat) - 0.162212,
+       (GLfloat) 0.283621, (GLfloat) - 0.936578, (GLfloat) - 0.205866,
+       (GLfloat) 0.264056, (GLfloat) - 0.947923, (GLfloat) - 0.178092,
+       (GLfloat) 0.315105, (GLfloat) - 0.946548, (GLfloat) - 0.068965,
+       (GLfloat) 0.304029, (GLfloat) - 0.949849, (GLfloat) - 0.073162,
+       (GLfloat) 0.789686, (GLfloat) - 0.598377, (GLfloat) - 0.135427,
+       (GLfloat) 0.809934, (GLfloat) - 0.566659, (GLfloat) - 0.151344,
+       (GLfloat) 0.656717, (GLfloat) - 0.640092, (GLfloat) - 0.398754,
+       (GLfloat) 0.671170, (GLfloat) - 0.608876, (GLfloat) - 0.422849,
+       (GLfloat) 0.264055, (GLfloat) - 0.947923, (GLfloat) 0.178092,
+       (GLfloat) 0.283621, (GLfloat) - 0.936578, (GLfloat) 0.205866,
+       (GLfloat) 0.656718, (GLfloat) - 0.640092, (GLfloat) 0.398754,
+       (GLfloat) 0.671170, (GLfloat) - 0.608876, (GLfloat) 0.422849,
+       (GLfloat) 0.809934, (GLfloat) - 0.566659, (GLfloat) 0.151344,
+       (GLfloat) 0.789686, (GLfloat) - 0.598377, (GLfloat) 0.135427,
+       (GLfloat) 0.304029, (GLfloat) - 0.949849, (GLfloat) 0.073162,
+       (GLfloat) 0.315105, (GLfloat) - 0.946548, (GLfloat) 0.068965,
+       (GLfloat) 0.507379, (GLfloat) 0.165745, (GLfloat) - 0.845633,
+       (GLfloat) 0.507380, (GLfloat) 0.165745, (GLfloat) - 0.845633,
+       (GLfloat) 0.162211, (GLfloat) 0.162582, (GLfloat) - 0.973270,
+       (GLfloat) 0.162212, (GLfloat) 0.162582, (GLfloat) - 0.973270,
+       (GLfloat) 0.166594, (GLfloat) 0.022905, (GLfloat) - 0.985759,
+       (GLfloat) 0.164375, (GLfloat) 0.017105, (GLfloat) - 0.986250,
+       (GLfloat) 0.516624, (GLfloat) 0.009468, (GLfloat) - 0.856160,
+       (GLfloat) 0.514433, (GLfloat) 0.015640, (GLfloat) - 0.857388,
+       (GLfloat) - 0.507379, (GLfloat) 0.165745, (GLfloat) - 0.845633,
+       (GLfloat) - 0.507379, (GLfloat) 0.165745, (GLfloat) - 0.845633,
+       (GLfloat) - 0.516625, (GLfloat) 0.009467, (GLfloat) - 0.856160,
+       (GLfloat) - 0.514433, (GLfloat) 0.015640, (GLfloat) - 0.857388,
+       (GLfloat) - 0.166594, (GLfloat) 0.022905, (GLfloat) - 0.985759,
+       (GLfloat) - 0.164375, (GLfloat) 0.017105, (GLfloat) - 0.986250,
+       (GLfloat) - 0.162211, (GLfloat) 0.162582, (GLfloat) - 0.973270,
+       (GLfloat) - 0.162212, (GLfloat) 0.162582, (GLfloat) - 0.973270,
+       (GLfloat) - 0.205866, (GLfloat) - 0.936578, (GLfloat) - 0.283621,
+       (GLfloat) - 0.178092, (GLfloat) - 0.947923, (GLfloat) - 0.264055,
+       (GLfloat) - 0.068965, (GLfloat) - 0.946548, (GLfloat) - 0.315105,
+       (GLfloat) - 0.073162, (GLfloat) - 0.949849, (GLfloat) - 0.304029,
+       (GLfloat) - 0.135427, (GLfloat) - 0.598377, (GLfloat) - 0.789686,
+       (GLfloat) - 0.151344, (GLfloat) - 0.566659, (GLfloat) - 0.809934,
+       (GLfloat) - 0.398754, (GLfloat) - 0.640092, (GLfloat) - 0.656718,
+       (GLfloat) - 0.422849, (GLfloat) - 0.608876, (GLfloat) - 0.671170,
+       (GLfloat) 0.178092, (GLfloat) - 0.947923, (GLfloat) - 0.264056,
+       (GLfloat) 0.205866, (GLfloat) - 0.936578, (GLfloat) - 0.283621,
+       (GLfloat) 0.398754, (GLfloat) - 0.640092, (GLfloat) - 0.656717,
+       (GLfloat) 0.422849, (GLfloat) - 0.608876, (GLfloat) - 0.671170,
+       (GLfloat) 0.151344, (GLfloat) - 0.566659, (GLfloat) - 0.809934,
+       (GLfloat) 0.135427, (GLfloat) - 0.598377, (GLfloat) - 0.789686,
+       (GLfloat) 0.073162, (GLfloat) - 0.949849, (GLfloat) - 0.304029,
+       (GLfloat) 0.068965, (GLfloat) - 0.946548, (GLfloat) - 0.315105,
+       (GLfloat) - 0.845633, (GLfloat) 0.165746, (GLfloat) - 0.507379,
+       (GLfloat) - 0.845632, (GLfloat) 0.165746, (GLfloat) - 0.507380,
+       (GLfloat) - 0.973270, (GLfloat) 0.162582, (GLfloat) - 0.162211,
+       (GLfloat) - 0.973270, (GLfloat) 0.162582, (GLfloat) - 0.162212,
+       (GLfloat) - 0.985759, (GLfloat) 0.022905, (GLfloat) - 0.166594,
+       (GLfloat) - 0.986250, (GLfloat) 0.017105, (GLfloat) - 0.164375,
+       (GLfloat) - 0.856160, (GLfloat) 0.009467, (GLfloat) - 0.516625,
+       (GLfloat) - 0.857388, (GLfloat) 0.015640, (GLfloat) - 0.514433,
+       (GLfloat) - 0.845633, (GLfloat) 0.165746, (GLfloat) 0.507379,
+       (GLfloat) - 0.845632, (GLfloat) 0.165746, (GLfloat) 0.507380,
+       (GLfloat) - 0.856159, (GLfloat) 0.009466, (GLfloat) 0.516625,
+       (GLfloat) - 0.857388, (GLfloat) 0.015640, (GLfloat) 0.514433,
+       (GLfloat) - 0.985759, (GLfloat) 0.022905, (GLfloat) 0.166594,
+       (GLfloat) - 0.986250, (GLfloat) 0.017105, (GLfloat) 0.164375,
+       (GLfloat) - 0.973270, (GLfloat) 0.162582, (GLfloat) 0.162211,
+       (GLfloat) - 0.973270, (GLfloat) 0.162582, (GLfloat) 0.162212,
+       (GLfloat) - 0.283620, (GLfloat) - 0.936578, (GLfloat) 0.205866,
+       (GLfloat) - 0.264055, (GLfloat) - 0.947923, (GLfloat) 0.178091,
+       (GLfloat) - 0.315105, (GLfloat) - 0.946548, (GLfloat) 0.068965,
+       (GLfloat) - 0.304029, (GLfloat) - 0.949849, (GLfloat) 0.073162,
+       (GLfloat) - 0.789686, (GLfloat) - 0.598377, (GLfloat) 0.135427,
+       (GLfloat) - 0.809934, (GLfloat) - 0.566659, (GLfloat) 0.151344,
+       (GLfloat) - 0.656718, (GLfloat) - 0.640090, (GLfloat) 0.398755,
+       (GLfloat) - 0.671170, (GLfloat) - 0.608876, (GLfloat) 0.422848,
+       (GLfloat) - 0.264055, (GLfloat) - 0.947923, (GLfloat) - 0.178092,
+       (GLfloat) - 0.283620, (GLfloat) - 0.936578, (GLfloat) - 0.205866,
+       (GLfloat) - 0.656718, (GLfloat) - 0.640091, (GLfloat) - 0.398755,
+       (GLfloat) - 0.671170, (GLfloat) - 0.608876, (GLfloat) - 0.422848,
+       (GLfloat) - 0.809934, (GLfloat) - 0.566659, (GLfloat) - 0.151344,
+       (GLfloat) - 0.789686, (GLfloat) - 0.598377, (GLfloat) - 0.135427,
+       (GLfloat) - 0.304029, (GLfloat) - 0.949849, (GLfloat) - 0.073163,
+       (GLfloat) - 0.315105, (GLfloat) - 0.946548, (GLfloat) - 0.068965,
+       (GLfloat) - 0.507380, (GLfloat) 0.165746, (GLfloat) 0.845632,
+       (GLfloat) - 0.507379, (GLfloat) 0.165746, (GLfloat) 0.845633,
+       (GLfloat) - 0.162211, (GLfloat) 0.162582, (GLfloat) 0.973270,
+       (GLfloat) - 0.162212, (GLfloat) 0.162582, (GLfloat) 0.973270,
+       (GLfloat) - 0.166594, (GLfloat) 0.022905, (GLfloat) 0.985759,
+       (GLfloat) - 0.164375, (GLfloat) 0.017105, (GLfloat) 0.986250,
+       (GLfloat) - 0.516625, (GLfloat) 0.009466, (GLfloat) 0.856159,
+       (GLfloat) - 0.514433, (GLfloat) 0.015640, (GLfloat) 0.857388,
+       (GLfloat) 0.507380, (GLfloat) 0.165746, (GLfloat) 0.845632,
+       (GLfloat) 0.507379, (GLfloat) 0.165746, (GLfloat) 0.845633,
+       (GLfloat) 0.516625, (GLfloat) 0.009467, (GLfloat) 0.856160,
+       (GLfloat) 0.514433, (GLfloat) 0.015640, (GLfloat) 0.857388,
+       (GLfloat) 0.166594, (GLfloat) 0.022905, (GLfloat) 0.985759,
+       (GLfloat) 0.164375, (GLfloat) 0.017105, (GLfloat) 0.986250,
+       (GLfloat) 0.162211, (GLfloat) 0.162582, (GLfloat) 0.973270,
+       (GLfloat) 0.162212, (GLfloat) 0.162582, (GLfloat) 0.973270,
+       (GLfloat) 0.205866, (GLfloat) - 0.936578, (GLfloat) 0.283620,
+       (GLfloat) 0.178092, (GLfloat) - 0.947923, (GLfloat) 0.264055,
+       (GLfloat) 0.068965, (GLfloat) - 0.946548, (GLfloat) 0.315105,
+       (GLfloat) 0.073163, (GLfloat) - 0.949849, (GLfloat) 0.304029,
+       (GLfloat) 0.135427, (GLfloat) - 0.598377, (GLfloat) 0.789686,
+       (GLfloat) 0.151344, (GLfloat) - 0.566659, (GLfloat) 0.809934,
+       (GLfloat) 0.398755, (GLfloat) - 0.640091, (GLfloat) 0.656718,
+       (GLfloat) 0.422848, (GLfloat) - 0.608876, (GLfloat) 0.671170,
+       (GLfloat) - 0.178091, (GLfloat) - 0.947923, (GLfloat) 0.264055,
+       (GLfloat) - 0.205866, (GLfloat) - 0.936578, (GLfloat) 0.283620,
+       (GLfloat) - 0.398755, (GLfloat) - 0.640090, (GLfloat) 0.656718,
+       (GLfloat) - 0.422848, (GLfloat) - 0.608876, (GLfloat) 0.671170,
+       (GLfloat) - 0.151344, (GLfloat) - 0.566659, (GLfloat) 0.809934,
+       (GLfloat) - 0.135427, (GLfloat) - 0.598377, (GLfloat) 0.789686,
+       (GLfloat) - 0.073162, (GLfloat) - 0.949849, (GLfloat) 0.304029,
+       (GLfloat) - 0.068965, (GLfloat) - 0.946548, (GLfloat) 0.315105,
+       (GLfloat) 0.135802, (GLfloat) - 0.982944, (GLfloat) - 0.124011,
+       (GLfloat) 0.124011, (GLfloat) - 0.982944, (GLfloat) - 0.135802,
+       (GLfloat) 0.043834, (GLfloat) - 0.993006, (GLfloat) - 0.109621,
+       (GLfloat) 0.039656, (GLfloat) - 0.992607, (GLfloat) - 0.114709,
+       (GLfloat) 0.030163, (GLfloat) - 0.998998, (GLfloat) - 0.033079,
+       (GLfloat) 0.033079, (GLfloat) - 0.998998, (GLfloat) - 0.030163,
+       (GLfloat) 0.109621, (GLfloat) - 0.993006, (GLfloat) - 0.043834,
+       (GLfloat) 0.114709, (GLfloat) - 0.992607, (GLfloat) - 0.039656,
+       (GLfloat) - 0.124011, (GLfloat) - 0.982944, (GLfloat) - 0.135802,
+       (GLfloat) - 0.135802, (GLfloat) - 0.982944, (GLfloat) - 0.124011,
+       (GLfloat) - 0.109621, (GLfloat) - 0.993006, (GLfloat) - 0.043834,
+       (GLfloat) - 0.114709, (GLfloat) - 0.992607, (GLfloat) - 0.039656,
+       (GLfloat) - 0.033079, (GLfloat) - 0.998998, (GLfloat) - 0.030163,
+       (GLfloat) - 0.030163, (GLfloat) - 0.998998, (GLfloat) - 0.033079,
+       (GLfloat) - 0.043834, (GLfloat) - 0.993006, (GLfloat) - 0.109621,
+       (GLfloat) - 0.039656, (GLfloat) - 0.992607, (GLfloat) - 0.114709,
+       (GLfloat) - 0.135802, (GLfloat) - 0.982944, (GLfloat) 0.124011,
+       (GLfloat) - 0.124011, (GLfloat) - 0.982944, (GLfloat) 0.135802,
+       (GLfloat) - 0.043834, (GLfloat) - 0.993006, (GLfloat) 0.109621,
+       (GLfloat) - 0.039656, (GLfloat) - 0.992607, (GLfloat) 0.114709,
+       (GLfloat) - 0.030163, (GLfloat) - 0.998998, (GLfloat) 0.033079,
+       (GLfloat) - 0.033079, (GLfloat) - 0.998998, (GLfloat) 0.030163,
+       (GLfloat) - 0.109621, (GLfloat) - 0.993006, (GLfloat) 0.043834,
+       (GLfloat) - 0.114709, (GLfloat) - 0.992607, (GLfloat) 0.039656,
+       (GLfloat) 0.124011, (GLfloat) - 0.982944, (GLfloat) 0.135802,
+       (GLfloat) 0.135802, (GLfloat) - 0.982944, (GLfloat) 0.124011,
+       (GLfloat) 0.109621, (GLfloat) - 0.993006, (GLfloat) 0.043834,
+       (GLfloat) 0.114709, (GLfloat) - 0.992607, (GLfloat) 0.039656,
+       (GLfloat) 0.033079, (GLfloat) - 0.998998, (GLfloat) 0.030163,
+       (GLfloat) 0.030163, (GLfloat) - 0.998998, (GLfloat) 0.033079,
+       (GLfloat) 0.043834, (GLfloat) - 0.993006, (GLfloat) 0.109621,
+       (GLfloat) 0.039656, (GLfloat) - 0.992607, (GLfloat) 0.114709,
+};
+
+static unsigned short int s1_1_POLS[] =
+{
+      3, 12, 76, 74, 1, 3, 12, 74, 82, 1, 3, 76, 22, 78, 1, 3, 78, 74, 76, 1,
+      3, 78, 20, 80, 1, 3, 80, 74, 78, 1, 3, 80, 28, 82, 1, 3, 82, 74, 80, 1,
+      3, 13, 84, 77, 1, 3, 13, 77, 88, 1, 3, 84, 24, 86, 1, 3, 86, 77, 84, 1,
+      3, 86, 20, 78, 1, 3, 78, 77, 86, 1, 3, 78, 22, 88, 1, 3, 88, 77, 78, 1,
+      3, 14, 90, 85, 1, 3, 14, 85, 93, 1, 3, 26, 91, 85, 1, 3, 26, 85, 90, 1,
+      3, 20, 86, 85, 1, 3, 20, 85, 91, 1, 3, 86, 24, 93, 1, 3, 93, 85, 86, 1,
+      3, 15, 95, 79, 1, 3, 15, 79, 97, 1, 3, 95, 28, 80, 1, 3, 80, 79, 95, 1,
+      3, 20, 91, 79, 1, 3, 20, 79, 80, 1, 3, 26, 97, 79, 1, 3, 26, 79, 91, 1,
+    3, 13, 99, 83, 1, 3, 13, 83, 84, 1, 3, 99, 30, 101, 1, 3, 101, 83, 99, 1,
+3, 101, 23, 102, 1, 3, 102, 83, 101, 1, 3, 102, 24, 84, 1, 3, 84, 83, 102, 1,
+       3, 16, 104, 100, 1, 3, 16, 100, 108, 1, 3, 104, 32, 106, 1, 3, 106, 100, 104, 1,
+       3, 106, 23, 101, 1, 3, 101, 100, 106, 1, 3, 101, 30, 108, 1, 3, 108, 100, 101, 1,
+       3, 17, 110, 105, 1, 3, 17, 105, 113, 1, 3, 33, 111, 105, 1, 3, 33, 105, 110, 1,
+       3, 23, 106, 105, 1, 3, 23, 105, 111, 1, 3, 106, 32, 113, 1, 3, 113, 105, 106, 1,
+   3, 14, 93, 92, 1, 3, 14, 92, 114, 1, 3, 93, 24, 102, 1, 3, 102, 92, 93, 1,
+  3, 23, 111, 92, 1, 3, 23, 92, 102, 1, 3, 33, 114, 92, 1, 3, 33, 92, 111, 1,
+       3, 16, 116, 103, 1, 3, 16, 103, 104, 1, 3, 116, 35, 118, 1, 3, 118, 103, 116, 1,
+       3, 118, 31, 119, 1, 3, 119, 103, 118, 1, 3, 119, 32, 104, 1, 3, 104, 103, 119, 1,
+       3, 18, 121, 117, 1, 3, 18, 117, 125, 1, 3, 121, 36, 123, 1, 3, 123, 117, 121, 1,
+       3, 123, 31, 118, 1, 3, 118, 117, 123, 1, 3, 118, 35, 125, 1, 3, 125, 117, 118, 1,
+       3, 19, 127, 122, 1, 3, 19, 122, 130, 1, 3, 37, 128, 122, 1, 3, 37, 122, 127, 1,
+       3, 31, 123, 122, 1, 3, 31, 122, 128, 1, 3, 123, 36, 130, 1, 3, 130, 122, 123, 1,
+       3, 17, 113, 112, 1, 3, 17, 112, 131, 1, 3, 113, 32, 119, 1, 3, 119, 112, 113, 1,
+       3, 31, 128, 112, 1, 3, 31, 112, 119, 1, 3, 37, 131, 112, 1, 3, 37, 112, 128, 1,
+       3, 18, 133, 120, 1, 3, 18, 120, 121, 1, 3, 133, 39, 134, 1, 3, 134, 120, 133, 1,
+       3, 134, 27, 135, 1, 3, 135, 120, 134, 1, 3, 135, 36, 121, 1, 3, 121, 120, 135, 1,
+   3, 12, 82, 81, 1, 3, 12, 81, 138, 1, 3, 82, 28, 136, 1, 3, 136, 81, 82, 1,
+       3, 136, 27, 134, 1, 3, 134, 81, 136, 1, 3, 134, 39, 138, 1, 3, 138, 81, 134, 1,
+   3, 15, 139, 94, 1, 3, 15, 94, 95, 1, 3, 40, 140, 94, 1, 3, 40, 94, 139, 1,
+  3, 27, 136, 94, 1, 3, 27, 94, 140, 1, 3, 136, 28, 95, 1, 3, 95, 94, 136, 1,
+       3, 19, 130, 129, 1, 3, 19, 129, 141, 1, 3, 130, 36, 135, 1, 3, 135, 129, 130, 1,
+       3, 27, 140, 129, 1, 3, 27, 129, 135, 1, 3, 40, 141, 129, 1, 3, 40, 129, 140, 1,
+ 3, 14, 114, 89, 1, 3, 14, 89, 90, 1, 3, 114, 33, 142, 1, 3, 142, 89, 114, 1,
+  3, 25, 143, 89, 1, 3, 25, 89, 142, 1, 3, 143, 26, 90, 1, 3, 90, 89, 143, 1,
+       3, 17, 131, 109, 1, 3, 17, 109, 110, 1, 3, 131, 37, 144, 1, 3, 144, 109, 131, 1,
+       3, 25, 142, 109, 1, 3, 25, 109, 144, 1, 3, 142, 33, 110, 1, 3, 110, 109, 142, 1,
+       3, 19, 141, 126, 1, 3, 19, 126, 127, 1, 3, 141, 40, 145, 1, 3, 145, 126, 141, 1,
+       3, 25, 144, 126, 1, 3, 25, 126, 145, 1, 3, 144, 37, 127, 1, 3, 127, 126, 144, 1,
+   3, 15, 97, 96, 1, 3, 15, 96, 139, 1, 3, 97, 26, 143, 1, 3, 143, 96, 97, 1,
+3, 25, 145, 96, 1, 3, 25, 96, 143, 1, 3, 145, 40, 139, 1, 3, 139, 96, 145, 1,
+  3, 76, 12, 146, 1, 3, 146, 75, 76, 1, 3, 41, 148, 75, 1, 3, 41, 75, 146, 1,
+ 3, 148, 21, 149, 1, 3, 149, 75, 148, 1, 3, 22, 76, 75, 1, 3, 22, 75, 149, 1,
+3, 8, 151, 147, 1, 3, 8, 147, 155, 1, 3, 151, 43, 153, 1, 3, 153, 147, 151, 1,
+       3, 21, 148, 147, 1, 3, 21, 147, 153, 1, 3, 148, 41, 155, 1, 3, 155, 147, 148, 1,
+       3, 11, 157, 152, 1, 3, 11, 152, 160, 1, 3, 157, 44, 158, 1, 3, 158, 152, 157, 1,
+       3, 21, 153, 152, 1, 3, 21, 152, 158, 1, 3, 153, 43, 160, 1, 3, 160, 152, 153, 1,
+   3, 161, 13, 88, 1, 3, 88, 87, 161, 1, 3, 22, 149, 87, 1, 3, 22, 87, 88, 1,
+3, 149, 21, 158, 1, 3, 158, 87, 149, 1, 3, 44, 161, 87, 1, 3, 44, 87, 158, 1,
+       3, 133, 18, 162, 1, 3, 162, 132, 133, 1, 3, 45, 164, 132, 1, 3, 45, 132, 162, 1,
+       3, 164, 38, 165, 1, 3, 165, 132, 164, 1, 3, 39, 133, 132, 1, 3, 39, 132, 165, 1,
+3, 9, 167, 163, 1, 3, 9, 163, 170, 1, 3, 167, 47, 168, 1, 3, 168, 163, 167, 1,
+       3, 38, 164, 163, 1, 3, 38, 163, 168, 1, 3, 164, 45, 170, 1, 3, 170, 163, 164, 1,
+3, 8, 155, 154, 1, 3, 8, 154, 173, 1, 3, 155, 41, 171, 1, 3, 171, 154, 155, 1,
+       3, 38, 168, 154, 1, 3, 38, 154, 171, 1, 3, 168, 47, 173, 1, 3, 173, 154, 168, 1,
+       3, 146, 12, 138, 1, 3, 138, 137, 146, 1, 3, 39, 165, 137, 1, 3, 39, 137, 138, 1,
+       3, 165, 38, 171, 1, 3, 171, 137, 165, 1, 3, 41, 146, 137, 1, 3, 41, 137, 171, 1,
+       3, 177, 16, 108, 1, 3, 108, 107, 177, 1, 3, 30, 174, 107, 1, 3, 30, 107, 108, 1,
+       3, 174, 29, 176, 1, 3, 176, 107, 174, 1, 3, 50, 177, 107, 1, 3, 50, 107, 176, 1,
+  3, 99, 13, 161, 1, 3, 161, 98, 99, 1, 3, 44, 178, 98, 1, 3, 44, 98, 161, 1,
+ 3, 178, 29, 174, 1, 3, 174, 98, 178, 1, 3, 30, 99, 98, 1, 3, 30, 98, 174, 1,
+       3, 11, 180, 156, 1, 3, 11, 156, 157, 1, 3, 180, 49, 181, 1, 3, 181, 156, 180, 1,
+       3, 29, 178, 156, 1, 3, 29, 156, 181, 1, 3, 178, 44, 157, 1, 3, 157, 156, 178, 1,
+       3, 10, 183, 175, 1, 3, 10, 175, 185, 1, 3, 183, 50, 176, 1, 3, 176, 175, 183, 1,
+       3, 29, 181, 175, 1, 3, 29, 175, 176, 1, 3, 181, 49, 185, 1, 3, 185, 175, 181, 1,
+       3, 162, 18, 125, 1, 3, 125, 124, 162, 1, 3, 35, 186, 124, 1, 3, 35, 124, 125, 1,
+       3, 186, 34, 187, 1, 3, 187, 124, 186, 1, 3, 45, 162, 124, 1, 3, 45, 124, 187, 1,
+       3, 116, 16, 177, 1, 3, 177, 115, 116, 1, 3, 50, 188, 115, 1, 3, 50, 115, 177, 1,
+       3, 188, 34, 186, 1, 3, 186, 115, 188, 1, 3, 35, 116, 115, 1, 3, 35, 115, 186, 1,
+       3, 10, 190, 182, 1, 3, 10, 182, 183, 1, 3, 190, 52, 191, 1, 3, 191, 182, 190, 1,
+       3, 34, 188, 182, 1, 3, 34, 182, 191, 1, 3, 188, 50, 183, 1, 3, 183, 182, 188, 1,
+3, 9, 170, 169, 1, 3, 9, 169, 193, 1, 3, 170, 45, 187, 1, 3, 187, 169, 170, 1,
+       3, 34, 191, 169, 1, 3, 34, 169, 187, 1, 3, 191, 52, 193, 1, 3, 193, 169, 191, 1,
+       3, 201, 1, 196, 1, 3, 196, 194, 201, 1, 3, 54, 198, 194, 1, 3, 54, 194, 196, 1,
+       3, 198, 46, 199, 1, 3, 199, 194, 198, 1, 3, 56, 201, 194, 1, 3, 56, 194, 199, 1,
+       3, 206, 3, 203, 1, 3, 203, 197, 206, 1, 3, 55, 204, 197, 1, 3, 55, 197, 203, 1,
+       3, 204, 46, 198, 1, 3, 198, 197, 204, 1, 3, 54, 206, 197, 1, 3, 54, 197, 198, 1,
+3, 8, 173, 172, 1, 3, 8, 172, 208, 1, 3, 173, 47, 207, 1, 3, 207, 172, 173, 1,
+       3, 46, 204, 172, 1, 3, 46, 172, 207, 1, 3, 204, 55, 208, 1, 3, 208, 172, 204, 1,
+3, 9, 209, 166, 1, 3, 9, 166, 167, 1, 3, 209, 56, 199, 1, 3, 199, 166, 209, 1,
+       3, 46, 207, 166, 1, 3, 46, 166, 199, 1, 3, 207, 47, 167, 1, 3, 167, 166, 207, 1,
+       3, 214, 1, 201, 1, 3, 201, 200, 214, 1, 3, 56, 210, 200, 1, 3, 56, 200, 201, 1,
+       3, 210, 51, 212, 1, 3, 212, 200, 210, 1, 3, 59, 214, 200, 1, 3, 59, 200, 212, 1,
+3, 9, 193, 192, 1, 3, 9, 192, 209, 1, 3, 193, 52, 215, 1, 3, 215, 192, 193, 1,
+       3, 51, 210, 192, 1, 3, 51, 192, 215, 1, 3, 210, 56, 209, 1, 3, 209, 192, 210, 1,
+       3, 10, 216, 189, 1, 3, 10, 189, 190, 1, 3, 216, 57, 217, 1, 3, 217, 189, 216, 1,
+       3, 51, 215, 189, 1, 3, 51, 189, 217, 1, 3, 215, 52, 190, 1, 3, 190, 189, 215, 1,
+       3, 221, 0, 219, 1, 3, 219, 211, 221, 1, 3, 59, 212, 211, 1, 3, 59, 211, 219, 1,
+       3, 212, 51, 217, 1, 3, 217, 211, 212, 1, 3, 57, 221, 211, 1, 3, 57, 211, 217, 1,
+       3, 226, 0, 221, 1, 3, 221, 220, 226, 1, 3, 57, 222, 220, 1, 3, 57, 220, 221, 1,
+       3, 222, 48, 224, 1, 3, 224, 220, 222, 1, 3, 62, 226, 220, 1, 3, 62, 220, 224, 1,
+       3, 10, 185, 184, 1, 3, 10, 184, 216, 1, 3, 185, 49, 227, 1, 3, 227, 184, 185, 1,
+       3, 48, 222, 184, 1, 3, 48, 184, 227, 1, 3, 222, 57, 216, 1, 3, 216, 184, 222, 1,
+       3, 11, 228, 179, 1, 3, 11, 179, 180, 1, 3, 228, 60, 229, 1, 3, 229, 179, 228, 1,
+       3, 48, 227, 179, 1, 3, 48, 179, 229, 1, 3, 227, 49, 180, 1, 3, 180, 179, 227, 1,
+       3, 233, 2, 231, 1, 3, 231, 223, 233, 1, 3, 62, 224, 223, 1, 3, 62, 223, 231, 1,
+       3, 224, 48, 229, 1, 3, 229, 223, 224, 1, 3, 60, 233, 223, 1, 3, 60, 223, 229, 1,
+       3, 237, 2, 233, 1, 3, 233, 232, 237, 1, 3, 60, 234, 232, 1, 3, 60, 232, 233, 1,
+       3, 234, 42, 235, 1, 3, 235, 232, 234, 1, 3, 64, 237, 232, 1, 3, 64, 232, 235, 1,
+       3, 11, 160, 159, 1, 3, 11, 159, 228, 1, 3, 160, 43, 238, 1, 3, 238, 159, 160, 1,
+       3, 42, 234, 159, 1, 3, 42, 159, 238, 1, 3, 234, 60, 228, 1, 3, 228, 159, 234, 1,
+3, 8, 208, 150, 1, 3, 8, 150, 151, 1, 3, 208, 55, 239, 1, 3, 239, 150, 208, 1,
+       3, 42, 238, 150, 1, 3, 42, 150, 239, 1, 3, 238, 43, 151, 1, 3, 151, 150, 238, 1,
+       3, 203, 3, 241, 1, 3, 241, 202, 203, 1, 3, 64, 235, 202, 1, 3, 64, 202, 241, 1,
+       3, 235, 42, 239, 1, 3, 239, 202, 235, 1, 3, 55, 203, 202, 1, 3, 55, 202, 239, 1,
+3, 2, 237, 236, 1, 3, 2, 236, 245, 1, 3, 237, 64, 242, 1, 3, 242, 236, 237, 1,
+       3, 242, 63, 244, 1, 3, 244, 236, 242, 1, 3, 244, 68, 245, 1, 3, 245, 236, 244, 1,
+3, 3, 246, 240, 1, 3, 3, 240, 241, 1, 3, 246, 65, 248, 1, 3, 248, 240, 246, 1,
+       3, 248, 63, 242, 1, 3, 242, 240, 248, 1, 3, 242, 64, 241, 1, 3, 241, 240, 242, 1,
+3, 4, 250, 247, 1, 3, 4, 247, 253, 1, 3, 67, 251, 247, 1, 3, 67, 247, 250, 1,
+       3, 63, 248, 247, 1, 3, 63, 247, 251, 1, 3, 248, 65, 253, 1, 3, 253, 247, 248, 1,
+3, 7, 255, 243, 1, 3, 7, 243, 257, 1, 3, 255, 68, 244, 1, 3, 244, 243, 255, 1,
+       3, 63, 251, 243, 1, 3, 63, 243, 244, 1, 3, 67, 257, 243, 1, 3, 67, 243, 251, 1,
+3, 3, 206, 205, 1, 3, 3, 205, 246, 1, 3, 206, 54, 258, 1, 3, 258, 205, 206, 1,
+       3, 258, 53, 259, 1, 3, 259, 205, 258, 1, 3, 259, 65, 246, 1, 3, 246, 205, 259, 1,
+3, 1, 260, 195, 1, 3, 1, 195, 196, 1, 3, 260, 69, 262, 1, 3, 262, 195, 260, 1,
+       3, 262, 53, 258, 1, 3, 258, 195, 262, 1, 3, 258, 54, 196, 1, 3, 196, 195, 258, 1,
+3, 5, 264, 261, 1, 3, 5, 261, 267, 1, 3, 70, 265, 261, 1, 3, 70, 261, 264, 1,
+       3, 53, 262, 261, 1, 3, 53, 261, 265, 1, 3, 262, 69, 267, 1, 3, 267, 261, 262, 1,
+3, 4, 253, 252, 1, 3, 4, 252, 268, 1, 3, 253, 65, 259, 1, 3, 259, 252, 253, 1,
+       3, 53, 265, 252, 1, 3, 53, 252, 259, 1, 3, 70, 268, 252, 1, 3, 70, 252, 265, 1,
+3, 1, 214, 213, 1, 3, 1, 213, 260, 1, 3, 214, 59, 269, 1, 3, 269, 213, 214, 1,
+       3, 269, 58, 270, 1, 3, 270, 213, 269, 1, 3, 270, 69, 260, 1, 3, 260, 213, 270, 1,
+3, 0, 271, 218, 1, 3, 0, 218, 219, 1, 3, 271, 71, 273, 1, 3, 273, 218, 271, 1,
+       3, 273, 58, 269, 1, 3, 269, 218, 273, 1, 3, 269, 59, 219, 1, 3, 219, 218, 269, 1,
+3, 6, 275, 272, 1, 3, 6, 272, 278, 1, 3, 72, 276, 272, 1, 3, 72, 272, 275, 1,
+       3, 58, 273, 272, 1, 3, 58, 272, 276, 1, 3, 273, 71, 278, 1, 3, 278, 272, 273, 1,
+3, 5, 267, 266, 1, 3, 5, 266, 279, 1, 3, 267, 69, 270, 1, 3, 270, 266, 267, 1,
+       3, 58, 276, 266, 1, 3, 58, 266, 270, 1, 3, 72, 279, 266, 1, 3, 72, 266, 276, 1,
+3, 0, 226, 225, 1, 3, 0, 225, 271, 1, 3, 226, 62, 280, 1, 3, 280, 225, 226, 1,
+       3, 280, 61, 281, 1, 3, 281, 225, 280, 1, 3, 281, 71, 271, 1, 3, 271, 225, 281, 1,
+3, 2, 245, 230, 1, 3, 2, 230, 231, 1, 3, 245, 68, 282, 1, 3, 282, 230, 245, 1,
+       3, 282, 61, 280, 1, 3, 280, 230, 282, 1, 3, 280, 62, 231, 1, 3, 231, 230, 280, 1,
+3, 7, 283, 254, 1, 3, 7, 254, 255, 1, 3, 73, 284, 254, 1, 3, 73, 254, 283, 1,
+       3, 61, 282, 254, 1, 3, 61, 254, 284, 1, 3, 282, 68, 255, 1, 3, 255, 254, 282, 1,
+3, 6, 278, 277, 1, 3, 6, 277, 285, 1, 3, 278, 71, 281, 1, 3, 281, 277, 278, 1,
+       3, 61, 284, 277, 1, 3, 61, 277, 281, 1, 3, 73, 285, 277, 1, 3, 73, 277, 284, 1,
+3, 4, 268, 249, 1, 3, 4, 249, 250, 1, 3, 268, 70, 286, 1, 3, 286, 249, 268, 1,
+       3, 66, 287, 249, 1, 3, 66, 249, 286, 1, 3, 287, 67, 250, 1, 3, 250, 249, 287, 1,
+3, 5, 279, 263, 1, 3, 5, 263, 264, 1, 3, 279, 72, 288, 1, 3, 288, 263, 279, 1,
+       3, 66, 286, 263, 1, 3, 66, 263, 288, 1, 3, 286, 70, 264, 1, 3, 264, 263, 286, 1,
+3, 6, 285, 274, 1, 3, 6, 274, 275, 1, 3, 285, 73, 289, 1, 3, 289, 274, 285, 1,
+       3, 66, 288, 274, 1, 3, 66, 274, 289, 1, 3, 288, 72, 275, 1, 3, 275, 274, 288, 1,
+3, 7, 257, 256, 1, 3, 7, 256, 283, 1, 3, 257, 67, 287, 1, 3, 287, 256, 257, 1,
+       3, 66, 289, 256, 1, 3, 66, 256, 287, 1, 3, 289, 73, 283, 1, 3, 283, 256, 289, 1,
+
+       0
+};
+
+struct lwo  LWO_s1_1 =
+{
+       290,                    /* number of points */
+       s1_1_PNTS, s1_1_normals, s1_1_POLS, 0L
+};
+
+#endif /* USE_GL */
+
+/* End of s1_1.c */
diff --git a/hacks/glx/s1_2.c b/hacks/glx/s1_2.c
new file mode 100644 (file)
index 0000000..bb7a35b
--- /dev/null
@@ -0,0 +1,1057 @@
+#if !defined( lint ) && !defined( SABER )
+static const char sccsid[] = "@(#)s1_2.c       4.04 97/07/28 xlockmore";
+
+#endif
+
+/*-
+ * Points, polygons, and normal vectors to render "s1_2" in 3D.
+ *
+ * Generated by lw2ogl.  Link this with your program but do
+ * not edit by hand.
+ */
+
+#ifndef STANDALONE
+#include "xlock.h"
+#endif
+
+#ifdef USE_GL
+
+#ifdef STANDALONE
+#include <GL/glx.h>
+#endif
+#include <GL/gl.h>
+#include "buildlwo.h"
+
+static GLfloat s1_2_PNTS[] =
+{
+       (GLfloat) 0.316229, (GLfloat) 0.114342, (GLfloat) - 0.309219,
+       (GLfloat) 0.316229, (GLfloat) 0.114342, (GLfloat) - 0.690781,
+       (GLfloat) 0.697100, (GLfloat) 0.103031, (GLfloat) - 0.309219,
+       (GLfloat) 0.697100, (GLfloat) 0.103031, (GLfloat) - 0.690781,
+       (GLfloat) 0.638667, (GLfloat) 0.007537, (GLfloat) - 0.638667,
+       (GLfloat) 0.361333, (GLfloat) 0.007537, (GLfloat) - 0.638667,
+       (GLfloat) 0.361333, (GLfloat) 0.007537, (GLfloat) - 0.361333,
+       (GLfloat) 0.638667, (GLfloat) 0.007537, (GLfloat) - 0.361333,
+       (GLfloat) 0.813840, (GLfloat) 0.310563, (GLfloat) - 0.755750,
+       (GLfloat) 0.308193, (GLfloat) 0.377118, (GLfloat) - 0.755750,
+       (GLfloat) 0.308193, (GLfloat) 0.377118, (GLfloat) - 0.244250,
+       (GLfloat) 0.813840, (GLfloat) 0.310563, (GLfloat) - 0.244250,
+       (GLfloat) 0.865458, (GLfloat) 0.513412, (GLfloat) - 0.690781,
+       (GLfloat) 0.865458, (GLfloat) 0.513412, (GLfloat) - 0.309219,
+       (GLfloat) 0.858509, (GLfloat) 0.615264, (GLfloat) - 0.361333,
+       (GLfloat) 0.858509, (GLfloat) 0.615264, (GLfloat) - 0.638667,
+       (GLfloat) 0.500319, (GLfloat) 0.618731, (GLfloat) - 0.309219,
+       (GLfloat) 0.596285, (GLfloat) 0.705555, (GLfloat) - 0.361333,
+       (GLfloat) 0.500319, (GLfloat) 0.618731, (GLfloat) - 0.690781,
+       (GLfloat) 0.596285, (GLfloat) 0.705555, (GLfloat) - 0.638667,
+       (GLfloat) 0.945338, (GLfloat) 0.554869, (GLfloat) - 0.500000,
+       (GLfloat) 0.927845, (GLfloat) 0.404808, (GLfloat) - 0.500000,
+       (GLfloat) 0.931847, (GLfloat) 0.494263, (GLfloat) - 0.500000,
+       (GLfloat) 0.716506, (GLfloat) 0.632271, (GLfloat) - 0.258297,
+       (GLfloat) 0.883750, (GLfloat) 0.575062, (GLfloat) - 0.323141,
+       (GLfloat) 0.733407, (GLfloat) 0.677865, (GLfloat) - 0.500000,
+       (GLfloat) 0.897467, (GLfloat) 0.608935, (GLfloat) - 0.500000,
+       (GLfloat) 0.716506, (GLfloat) 0.632271, (GLfloat) - 0.741703,
+       (GLfloat) 0.883750, (GLfloat) 0.575062, (GLfloat) - 0.676859,
+       (GLfloat) 0.622584, (GLfloat) 0.465571, (GLfloat) - 0.187109,
+       (GLfloat) 0.682889, (GLfloat) 0.566071, (GLfloat) - 0.239844,
+       (GLfloat) 0.487673, (GLfloat) 0.709673, (GLfloat) - 0.500000,
+       (GLfloat) 0.548866, (GLfloat) 0.688331, (GLfloat) - 0.323141,
+       (GLfloat) 0.729578, (GLfloat) 0.666743, (GLfloat) - 0.322437,
+       (GLfloat) 0.317323, (GLfloat) 0.526334, (GLfloat) - 0.500000,
+       (GLfloat) 0.433930, (GLfloat) 0.637880, (GLfloat) - 0.500000,
+       (GLfloat) 0.548866, (GLfloat) 0.688331, (GLfloat) - 0.676859,
+       (GLfloat) 0.561689, (GLfloat) 0.724552, (GLfloat) - 0.500000,
+       (GLfloat) 0.622584, (GLfloat) 0.465571, (GLfloat) - 0.812891,
+       (GLfloat) 0.682889, (GLfloat) 0.566071, (GLfloat) - 0.760156,
+       (GLfloat) 0.729578, (GLfloat) 0.666743, (GLfloat) - 0.677562,
+       (GLfloat) 0.846442, (GLfloat) 0.421012, (GLfloat) - 0.729453,
+       (GLfloat) 0.835067, (GLfloat) 0.192357, (GLfloat) - 0.500000,
+       (GLfloat) 0.905776, (GLfloat) 0.298462, (GLfloat) - 0.500000,
+       (GLfloat) 0.846442, (GLfloat) 0.421012, (GLfloat) - 0.270547,
+       (GLfloat) 0.398726, (GLfloat) 0.510130, (GLfloat) - 0.729453,
+       (GLfloat) 0.523830, (GLfloat) 0.217409, (GLfloat) - 0.812891,
+       (GLfloat) 0.561017, (GLfloat) 0.343841, (GLfloat) - 0.848750,
+       (GLfloat) 0.523830, (GLfloat) 0.217409, (GLfloat) - 0.187109,
+       (GLfloat) 0.561017, (GLfloat) 0.343841, (GLfloat) - 0.151250,
+       (GLfloat) 0.398726, (GLfloat) 0.510130, (GLfloat) - 0.270547,
+       (GLfloat) 0.212593, (GLfloat) 0.242461, (GLfloat) - 0.500000,
+       (GLfloat) 0.216258, (GLfloat) 0.389219, (GLfloat) - 0.500000,
+       (GLfloat) 0.500666, (GLfloat) 0.037435, (GLfloat) - 0.741703,
+       (GLfloat) 0.506665, (GLfloat) 0.108686, (GLfloat) - 0.760156,
+       (GLfloat) 0.752070, (GLfloat) 0.199038, (GLfloat) - 0.729453,
+       (GLfloat) 0.295589, (GLfloat) 0.235781, (GLfloat) - 0.729453,
+       (GLfloat) 0.295589, (GLfloat) 0.235781, (GLfloat) - 0.270547,
+       (GLfloat) 0.259010, (GLfloat) 0.038206, (GLfloat) - 0.500000,
+       (GLfloat) 0.246980, (GLfloat) 0.116398, (GLfloat) - 0.500000,
+       (GLfloat) 0.752070, (GLfloat) 0.199038, (GLfloat) - 0.270547,
+       (GLfloat) 0.500666, (GLfloat) 0.037435, (GLfloat) - 0.258297,
+       (GLfloat) 0.506665, (GLfloat) 0.108686, (GLfloat) - 0.239844,
+       (GLfloat) 0.742322, (GLfloat) 0.036664, (GLfloat) - 0.500000,
+       (GLfloat) 0.766349, (GLfloat) 0.100974, (GLfloat) - 0.500000,
+       (GLfloat) 0.677491, (GLfloat) 0.037477, (GLfloat) - 0.676859,
+       (GLfloat) 0.500000, (GLfloat) - 0.010924, (GLfloat) - 0.500000,
+       (GLfloat) 0.677562, (GLfloat) 0.000839, (GLfloat) - 0.500000,
+       (GLfloat) 0.677491, (GLfloat) 0.037477, (GLfloat) - 0.323141,
+       (GLfloat) 0.323842, (GLfloat) 0.038608, (GLfloat) - 0.676859,
+       (GLfloat) 0.500000, (GLfloat) 0.000839, (GLfloat) - 0.677562,
+       (GLfloat) 0.323842, (GLfloat) 0.038608, (GLfloat) - 0.323141,
+       (GLfloat) 0.322437, (GLfloat) 0.000839, (GLfloat) - 0.500000,
+       (GLfloat) 0.500000, (GLfloat) 0.000839, (GLfloat) - 0.322437,
+       (GLfloat) 0.925000, (GLfloat) 0.532253, (GLfloat) - 0.600125,
+       (GLfloat) 0.911045, (GLfloat) 0.457192, (GLfloat) - 0.613625,
+       (GLfloat) 0.915250, (GLfloat) 0.499050, (GLfloat) - 0.604062,
+       (GLfloat) 0.925000, (GLfloat) 0.532253, (GLfloat) - 0.399875,
+       (GLfloat) 0.940858, (GLfloat) 0.527164, (GLfloat) - 0.500000,
+       (GLfloat) 0.919197, (GLfloat) 0.584697, (GLfloat) - 0.587500,
+       (GLfloat) 0.929810, (GLfloat) 0.559801, (GLfloat) - 0.596406,
+       (GLfloat) 0.798138, (GLfloat) 0.572966, (GLfloat) - 0.733625,
+       (GLfloat) 0.877427, (GLfloat) 0.547520, (GLfloat) - 0.683563,
+       (GLfloat) 0.798138, (GLfloat) 0.572966, (GLfloat) - 0.266375,
+       (GLfloat) 0.877427, (GLfloat) 0.547520, (GLfloat) - 0.316437,
+       (GLfloat) 0.919197, (GLfloat) 0.584697, (GLfloat) - 0.412500,
+       (GLfloat) 0.929810, (GLfloat) 0.559801, (GLfloat) - 0.403594,
+       (GLfloat) 0.911045, (GLfloat) 0.457192, (GLfloat) - 0.386375,
+       (GLfloat) 0.915250, (GLfloat) 0.499050, (GLfloat) - 0.395938,
+       (GLfloat) 0.817112, (GLfloat) 0.642984, (GLfloat) - 0.409500,
+       (GLfloat) 0.884513, (GLfloat) 0.611054, (GLfloat) - 0.417500,
+       (GLfloat) 0.934249, (GLfloat) 0.580800, (GLfloat) - 0.500000,
+       (GLfloat) 0.807153, (GLfloat) 0.623277, (GLfloat) - 0.294000,
+       (GLfloat) 0.876135, (GLfloat) 0.598240, (GLfloat) - 0.339125,
+       (GLfloat) 0.807153, (GLfloat) 0.623277, (GLfloat) - 0.706000,
+       (GLfloat) 0.876135, (GLfloat) 0.598240, (GLfloat) - 0.660875,
+       (GLfloat) 0.817112, (GLfloat) 0.642984, (GLfloat) - 0.590500,
+       (GLfloat) 0.884513, (GLfloat) 0.611054, (GLfloat) - 0.582500,
+       (GLfloat) 0.764624, (GLfloat) 0.492766, (GLfloat) - 0.234875,
+       (GLfloat) 0.782472, (GLfloat) 0.537348, (GLfloat) - 0.257187,
+       (GLfloat) 0.607846, (GLfloat) 0.634036, (GLfloat) - 0.266375,
+       (GLfloat) 0.702992, (GLfloat) 0.603501, (GLfloat) - 0.249687,
+       (GLfloat) 0.807680, (GLfloat) 0.601112, (GLfloat) - 0.274594,
+       (GLfloat) 0.480984, (GLfloat) 0.674750, (GLfloat) - 0.399875,
+       (GLfloat) 0.528557, (GLfloat) 0.659482, (GLfloat) - 0.316437,
+       (GLfloat) 0.641688, (GLfloat) 0.680252, (GLfloat) - 0.294000,
+       (GLfloat) 0.625134, (GLfloat) 0.662855, (GLfloat) - 0.274594,
+       (GLfloat) 0.544994, (GLfloat) 0.546127, (GLfloat) - 0.234875,
+       (GLfloat) 0.583305, (GLfloat) 0.594795, (GLfloat) - 0.257187,
+       (GLfloat) 0.645973, (GLfloat) 0.701912, (GLfloat) - 0.409500,
+       (GLfloat) 0.650852, (GLfloat) 0.691510, (GLfloat) - 0.335375,
+       (GLfloat) 0.724816, (GLfloat) 0.652913, (GLfloat) - 0.278500,
+       (GLfloat) 0.529644, (GLfloat) 0.718831, (GLfloat) - 0.412500,
+       (GLfloat) 0.571915, (GLfloat) 0.702991, (GLfloat) - 0.339125,
+       (GLfloat) 0.806863, (GLfloat) 0.637791, (GLfloat) - 0.335375,
+       (GLfloat) 0.398573, (GLfloat) 0.581701, (GLfloat) - 0.386375,
+       (GLfloat) 0.450527, (GLfloat) 0.633092, (GLfloat) - 0.395938,
+       (GLfloat) 0.480984, (GLfloat) 0.674750, (GLfloat) - 0.600125,
+       (GLfloat) 0.465127, (GLfloat) 0.679839, (GLfloat) - 0.500000,
+       (GLfloat) 0.503003, (GLfloat) 0.704166, (GLfloat) - 0.403594,
+       (GLfloat) 0.607846, (GLfloat) 0.634036, (GLfloat) - 0.733625,
+       (GLfloat) 0.528557, (GLfloat) 0.659482, (GLfloat) - 0.683563,
+       (GLfloat) 0.529644, (GLfloat) 0.718831, (GLfloat) - 0.587500,
+       (GLfloat) 0.503003, (GLfloat) 0.704166, (GLfloat) - 0.596406,
+       (GLfloat) 0.398573, (GLfloat) 0.581701, (GLfloat) - 0.613625,
+       (GLfloat) 0.450527, (GLfloat) 0.633092, (GLfloat) - 0.604062,
+       (GLfloat) 0.645973, (GLfloat) 0.701912, (GLfloat) - 0.590500,
+       (GLfloat) 0.573201, (GLfloat) 0.718247, (GLfloat) - 0.582500,
+       (GLfloat) 0.515384, (GLfloat) 0.725027, (GLfloat) - 0.500000,
+       (GLfloat) 0.641688, (GLfloat) 0.680252, (GLfloat) - 0.706000,
+       (GLfloat) 0.571915, (GLfloat) 0.702991, (GLfloat) - 0.660875,
+       (GLfloat) 0.573201, (GLfloat) 0.718247, (GLfloat) - 0.417500,
+       (GLfloat) 0.544994, (GLfloat) 0.546127, (GLfloat) - 0.765125,
+       (GLfloat) 0.583305, (GLfloat) 0.594795, (GLfloat) - 0.742813,
+       (GLfloat) 0.702992, (GLfloat) 0.603501, (GLfloat) - 0.750313,
+       (GLfloat) 0.625134, (GLfloat) 0.662855, (GLfloat) - 0.725406,
+       (GLfloat) 0.807680, (GLfloat) 0.601112, (GLfloat) - 0.725406,
+       (GLfloat) 0.764624, (GLfloat) 0.492766, (GLfloat) - 0.765125,
+       (GLfloat) 0.782472, (GLfloat) 0.537348, (GLfloat) - 0.742813,
+       (GLfloat) 0.806863, (GLfloat) 0.637791, (GLfloat) - 0.664625,
+       (GLfloat) 0.724816, (GLfloat) 0.652913, (GLfloat) - 0.721500,
+       (GLfloat) 0.650852, (GLfloat) 0.691510, (GLfloat) - 0.664625,
+       (GLfloat) 0.732447, (GLfloat) 0.675074, (GLfloat) - 0.402250,
+       (GLfloat) 0.824871, (GLfloat) 0.643250, (GLfloat) - 0.500000,
+       (GLfloat) 0.640022, (GLfloat) 0.706898, (GLfloat) - 0.500000,
+       (GLfloat) 0.732447, (GLfloat) 0.675074, (GLfloat) - 0.597750,
+       (GLfloat) 0.856137, (GLfloat) 0.470533, (GLfloat) - 0.708313,
+       (GLfloat) 0.899707, (GLfloat) 0.356231, (GLfloat) - 0.635000,
+       (GLfloat) 0.907494, (GLfloat) 0.408859, (GLfloat) - 0.625156,
+       (GLfloat) 0.929348, (GLfloat) 0.452746, (GLfloat) - 0.500000,
+       (GLfloat) 0.851860, (GLfloat) 0.246808, (GLfloat) - 0.635000,
+       (GLfloat) 0.882792, (GLfloat) 0.301487, (GLfloat) - 0.639500,
+       (GLfloat) 0.899707, (GLfloat) 0.356231, (GLfloat) - 0.365000,
+       (GLfloat) 0.921826, (GLfloat) 0.352648, (GLfloat) - 0.500000,
+       (GLfloat) 0.722756, (GLfloat) 0.384892, (GLfloat) - 0.815000,
+       (GLfloat) 0.833350, (GLfloat) 0.366979, (GLfloat) - 0.747500,
+       (GLfloat) 0.722756, (GLfloat) 0.384892, (GLfloat) - 0.185000,
+       (GLfloat) 0.833350, (GLfloat) 0.366979, (GLfloat) - 0.252500,
+       (GLfloat) 0.907494, (GLfloat) 0.408859, (GLfloat) - 0.374844,
+       (GLfloat) 0.851860, (GLfloat) 0.246808, (GLfloat) - 0.365000,
+       (GLfloat) 0.882792, (GLfloat) 0.301487, (GLfloat) - 0.360500,
+       (GLfloat) 0.856137, (GLfloat) 0.470533, (GLfloat) - 0.291687,
+       (GLfloat) 0.453481, (GLfloat) 0.568361, (GLfloat) - 0.708313,
+       (GLfloat) 0.457330, (GLfloat) 0.427884, (GLfloat) - 0.815000,
+       (GLfloat) 0.500479, (GLfloat) 0.489876, (GLfloat) - 0.792031,
+       (GLfloat) 0.654809, (GLfloat) 0.519447, (GLfloat) - 0.784063,
+       (GLfloat) 0.405397, (GLfloat) 0.294044, (GLfloat) - 0.815000,
+       (GLfloat) 0.423113, (GLfloat) 0.361992, (GLfloat) - 0.825500,
+       (GLfloat) 0.590043, (GLfloat) 0.406388, (GLfloat) - 0.837500,
+       (GLfloat) 0.280379, (GLfloat) 0.456545, (GLfloat) - 0.635000,
+       (GLfloat) 0.346736, (GLfloat) 0.445797, (GLfloat) - 0.747500,
+       (GLfloat) 0.744688, (GLfloat) 0.441266, (GLfloat) - 0.792031,
+       (GLfloat) 0.673275, (GLfloat) 0.265703, (GLfloat) - 0.815000,
+       (GLfloat) 0.698920, (GLfloat) 0.325689, (GLfloat) - 0.825500,
+       (GLfloat) 0.654809, (GLfloat) 0.519447, (GLfloat) - 0.215937,
+       (GLfloat) 0.457330, (GLfloat) 0.427884, (GLfloat) - 0.185000,
+       (GLfloat) 0.500479, (GLfloat) 0.489876, (GLfloat) - 0.207969,
+       (GLfloat) 0.453481, (GLfloat) 0.568361, (GLfloat) - 0.291687,
+       (GLfloat) 0.744688, (GLfloat) 0.441266, (GLfloat) - 0.207969,
+       (GLfloat) 0.673275, (GLfloat) 0.265703, (GLfloat) - 0.185000,
+       (GLfloat) 0.698920, (GLfloat) 0.325689, (GLfloat) - 0.174500,
+       (GLfloat) 0.590043, (GLfloat) 0.406388, (GLfloat) - 0.162500,
+       (GLfloat) 0.280379, (GLfloat) 0.456545, (GLfloat) - 0.365000,
+       (GLfloat) 0.346736, (GLfloat) 0.445797, (GLfloat) - 0.252500,
+       (GLfloat) 0.405397, (GLfloat) 0.294044, (GLfloat) - 0.185000,
+       (GLfloat) 0.423113, (GLfloat) 0.361992, (GLfloat) - 0.174500,
+       (GLfloat) 0.380271, (GLfloat) 0.586148, (GLfloat) - 0.500000,
+       (GLfloat) 0.337674, (GLfloat) 0.522283, (GLfloat) - 0.625156,
+       (GLfloat) 0.337674, (GLfloat) 0.522283, (GLfloat) - 0.374844,
+       (GLfloat) 0.226812, (GLfloat) 0.312938, (GLfloat) - 0.365000,
+       (GLfloat) 0.239242, (GLfloat) 0.386194, (GLfloat) - 0.360500,
+       (GLfloat) 0.258260, (GLfloat) 0.460127, (GLfloat) - 0.500000,
+       (GLfloat) 0.226812, (GLfloat) 0.312938, (GLfloat) - 0.635000,
+       (GLfloat) 0.239242, (GLfloat) 0.386194, (GLfloat) - 0.639500,
+       (GLfloat) 0.400082, (GLfloat) 0.165542, (GLfloat) - 0.765125,
+       (GLfloat) 0.402616, (GLfloat) 0.069508, (GLfloat) - 0.733625,
+       (GLfloat) 0.402791, (GLfloat) 0.111771, (GLfloat) - 0.742813,
+       (GLfloat) 0.626577, (GLfloat) 0.153203, (GLfloat) - 0.765125,
+       (GLfloat) 0.513329, (GLfloat) 0.159372, (GLfloat) - 0.784063,
+       (GLfloat) 0.399335, (GLfloat) 0.227430, (GLfloat) - 0.792031,
+       (GLfloat) 0.249085, (GLfloat) 0.173768, (GLfloat) - 0.613625,
+       (GLfloat) 0.305709, (GLfloat) 0.170683, (GLfloat) - 0.708313,
+       (GLfloat) 0.777574, (GLfloat) 0.144976, (GLfloat) - 0.613625,
+       (GLfloat) 0.720950, (GLfloat) 0.148061, (GLfloat) - 0.708313,
+       (GLfloat) 0.648325, (GLfloat) 0.207388, (GLfloat) - 0.792031,
+       (GLfloat) 0.602715, (GLfloat) 0.067041, (GLfloat) - 0.733625,
+       (GLfloat) 0.610539, (GLfloat) 0.105601, (GLfloat) - 0.742813,
+       (GLfloat) 0.539336, (GLfloat) 0.279873, (GLfloat) - 0.837500,
+       (GLfloat) 0.784890, (GLfloat) 0.253894, (GLfloat) - 0.747500,
+       (GLfloat) 0.293781, (GLfloat) 0.305853, (GLfloat) - 0.747500,
+       (GLfloat) 0.233342, (GLfloat) 0.240791, (GLfloat) - 0.625156,
+       (GLfloat) 0.249085, (GLfloat) 0.173768, (GLfloat) - 0.386375,
+       (GLfloat) 0.230210, (GLfloat) 0.174796, (GLfloat) - 0.500000,
+       (GLfloat) 0.269217, (GLfloat) 0.071154, (GLfloat) - 0.600125,
+       (GLfloat) 0.264292, (GLfloat) 0.115884, (GLfloat) - 0.604062,
+       (GLfloat) 0.204489, (GLfloat) 0.315300, (GLfloat) - 0.500000,
+       (GLfloat) 0.293781, (GLfloat) 0.305853, (GLfloat) - 0.252500,
+       (GLfloat) 0.233342, (GLfloat) 0.240791, (GLfloat) - 0.374844,
+       (GLfloat) 0.269217, (GLfloat) 0.071154, (GLfloat) - 0.399875,
+       (GLfloat) 0.264292, (GLfloat) 0.115884, (GLfloat) - 0.395938,
+       (GLfloat) 0.400082, (GLfloat) 0.165542, (GLfloat) - 0.234875,
+       (GLfloat) 0.305709, (GLfloat) 0.170683, (GLfloat) - 0.291687,
+       (GLfloat) 0.399335, (GLfloat) 0.227430, (GLfloat) - 0.207969,
+       (GLfloat) 0.626577, (GLfloat) 0.153203, (GLfloat) - 0.234875,
+       (GLfloat) 0.513329, (GLfloat) 0.159372, (GLfloat) - 0.215937,
+       (GLfloat) 0.402616, (GLfloat) 0.069508, (GLfloat) - 0.266375,
+       (GLfloat) 0.402791, (GLfloat) 0.111771, (GLfloat) - 0.257187,
+       (GLfloat) 0.539336, (GLfloat) 0.279873, (GLfloat) - 0.162500,
+       (GLfloat) 0.784890, (GLfloat) 0.253894, (GLfloat) - 0.252500,
+       (GLfloat) 0.648325, (GLfloat) 0.207388, (GLfloat) - 0.207969,
+       (GLfloat) 0.602715, (GLfloat) 0.067041, (GLfloat) - 0.266375,
+       (GLfloat) 0.610539, (GLfloat) 0.105601, (GLfloat) - 0.257187,
+       (GLfloat) 0.777574, (GLfloat) 0.144976, (GLfloat) - 0.386375,
+       (GLfloat) 0.720950, (GLfloat) 0.148061, (GLfloat) - 0.291687,
+       (GLfloat) 0.814318, (GLfloat) 0.194027, (GLfloat) - 0.374844,
+       (GLfloat) 0.796449, (GLfloat) 0.143948, (GLfloat) - 0.500000,
+       (GLfloat) 0.736115, (GLfloat) 0.065395, (GLfloat) - 0.399875,
+       (GLfloat) 0.749037, (GLfloat) 0.101488, (GLfloat) - 0.395938,
+       (GLfloat) 0.874183, (GLfloat) 0.244447, (GLfloat) - 0.500000,
+       (GLfloat) 0.814318, (GLfloat) 0.194027, (GLfloat) - 0.625156,
+       (GLfloat) 0.736115, (GLfloat) 0.065395, (GLfloat) - 0.600125,
+       (GLfloat) 0.749037, (GLfloat) 0.101488, (GLfloat) - 0.604062,
+       (GLfloat) 0.752790, (GLfloat) 0.065190, (GLfloat) - 0.500000,
+       (GLfloat) 0.706000, (GLfloat) 0.016681, (GLfloat) - 0.412500,
+       (GLfloat) 0.726029, (GLfloat) 0.037019, (GLfloat) - 0.403594,
+       (GLfloat) 0.686090, (GLfloat) 0.066012, (GLfloat) - 0.316437,
+       (GLfloat) 0.686090, (GLfloat) 0.066012, (GLfloat) - 0.683563,
+       (GLfloat) 0.706000, (GLfloat) 0.016681, (GLfloat) - 0.587500,
+       (GLfloat) 0.726029, (GLfloat) 0.037019, (GLfloat) - 0.596406,
+       (GLfloat) 0.590500, (GLfloat) - 0.005194, (GLfloat) - 0.590500,
+       (GLfloat) 0.664625, (GLfloat) 0.003052, (GLfloat) - 0.582500,
+       (GLfloat) 0.721500, (GLfloat) 0.015465, (GLfloat) - 0.500000,
+       (GLfloat) 0.587500, (GLfloat) 0.016681, (GLfloat) - 0.706000,
+       (GLfloat) 0.660875, (GLfloat) 0.017896, (GLfloat) - 0.660875,
+       (GLfloat) 0.587500, (GLfloat) 0.016681, (GLfloat) - 0.294000,
+       (GLfloat) 0.660875, (GLfloat) 0.017896, (GLfloat) - 0.339125,
+       (GLfloat) 0.590500, (GLfloat) - 0.005194, (GLfloat) - 0.409500,
+       (GLfloat) 0.664625, (GLfloat) 0.003052, (GLfloat) - 0.417500,
+       (GLfloat) 0.502666, (GLfloat) 0.068274, (GLfloat) - 0.750313,
+       (GLfloat) 0.597054, (GLfloat) 0.037430, (GLfloat) - 0.725406,
+       (GLfloat) 0.319242, (GLfloat) 0.070537, (GLfloat) - 0.683563,
+       (GLfloat) 0.412500, (GLfloat) 0.016681, (GLfloat) - 0.706000,
+       (GLfloat) 0.404279, (GLfloat) 0.038047, (GLfloat) - 0.725406,
+       (GLfloat) 0.409500, (GLfloat) - 0.005194, (GLfloat) - 0.590500,
+       (GLfloat) 0.417500, (GLfloat) 0.003052, (GLfloat) - 0.664625,
+       (GLfloat) 0.500000, (GLfloat) 0.015465, (GLfloat) - 0.721500,
+       (GLfloat) 0.294000, (GLfloat) 0.016681, (GLfloat) - 0.587500,
+       (GLfloat) 0.339125, (GLfloat) 0.017896, (GLfloat) - 0.660875,
+       (GLfloat) 0.582500, (GLfloat) 0.003052, (GLfloat) - 0.664625,
+       (GLfloat) 0.252542, (GLfloat) 0.071359, (GLfloat) - 0.500000,
+       (GLfloat) 0.275304, (GLfloat) 0.038459, (GLfloat) - 0.596406,
+       (GLfloat) 0.319242, (GLfloat) 0.070537, (GLfloat) - 0.316437,
+       (GLfloat) 0.294000, (GLfloat) 0.016681, (GLfloat) - 0.412500,
+       (GLfloat) 0.275304, (GLfloat) 0.038459, (GLfloat) - 0.403594,
+       (GLfloat) 0.409500, (GLfloat) - 0.005194, (GLfloat) - 0.409500,
+       (GLfloat) 0.335375, (GLfloat) 0.003052, (GLfloat) - 0.417500,
+       (GLfloat) 0.278500, (GLfloat) 0.015465, (GLfloat) - 0.500000,
+       (GLfloat) 0.412500, (GLfloat) 0.016681, (GLfloat) - 0.294000,
+       (GLfloat) 0.339125, (GLfloat) 0.017896, (GLfloat) - 0.339125,
+       (GLfloat) 0.335375, (GLfloat) 0.003052, (GLfloat) - 0.582500,
+       (GLfloat) 0.502666, (GLfloat) 0.068274, (GLfloat) - 0.249687,
+       (GLfloat) 0.404279, (GLfloat) 0.038047, (GLfloat) - 0.274594,
+       (GLfloat) 0.597054, (GLfloat) 0.037430, (GLfloat) - 0.274594,
+       (GLfloat) 0.582500, (GLfloat) 0.003052, (GLfloat) - 0.335375,
+       (GLfloat) 0.500000, (GLfloat) 0.015465, (GLfloat) - 0.278500,
+       (GLfloat) 0.417500, (GLfloat) 0.003052, (GLfloat) - 0.335375,
+       (GLfloat) 0.500000, (GLfloat) - 0.007972, (GLfloat) - 0.597750,
+       (GLfloat) 0.597750, (GLfloat) - 0.007972, (GLfloat) - 0.500000,
+       (GLfloat) 0.402250, (GLfloat) - 0.007972, (GLfloat) - 0.500000,
+       (GLfloat) 0.500000, (GLfloat) - 0.007972, (GLfloat) - 0.402250,
+};
+
+static GLfloat s1_2_normals[] =
+{
+       (GLfloat) 0.838584, (GLfloat) - 0.185505, (GLfloat) - 0.512216,
+       (GLfloat) 0.838560, (GLfloat) - 0.185860, (GLfloat) - 0.512127,
+       (GLfloat) 0.951437, (GLfloat) - 0.260566, (GLfloat) - 0.163932,
+       (GLfloat) 0.951618, (GLfloat) - 0.260024, (GLfloat) - 0.163738,
+       (GLfloat) 0.973663, (GLfloat) - 0.157463, (GLfloat) - 0.164880,
+       (GLfloat) 0.975548, (GLfloat) - 0.148474, (GLfloat) - 0.162053,
+       (GLfloat) 0.859322, (GLfloat) - 0.074133, (GLfloat) - 0.506033,
+       (GLfloat) 0.859277, (GLfloat) - 0.081888, (GLfloat) - 0.504914,
+       (GLfloat) 0.838560, (GLfloat) - 0.185860, (GLfloat) 0.512127,
+       (GLfloat) 0.838584, (GLfloat) - 0.185505, (GLfloat) 0.512216,
+       (GLfloat) 0.859322, (GLfloat) - 0.074133, (GLfloat) 0.506034,
+       (GLfloat) 0.859277, (GLfloat) - 0.081888, (GLfloat) 0.504914,
+       (GLfloat) 0.973663, (GLfloat) - 0.157463, (GLfloat) 0.164880,
+       (GLfloat) 0.975548, (GLfloat) - 0.148474, (GLfloat) 0.162053,
+       (GLfloat) 0.951618, (GLfloat) - 0.260024, (GLfloat) 0.163738,
+       (GLfloat) 0.951437, (GLfloat) - 0.260566, (GLfloat) 0.163932,
+       (GLfloat) 0.573088, (GLfloat) 0.793214, (GLfloat) 0.205867,
+       (GLfloat) 0.558283, (GLfloat) 0.810311, (GLfloat) 0.178092,
+       (GLfloat) 0.606103, (GLfloat) 0.792390, (GLfloat) 0.068965,
+       (GLfloat) 0.596705, (GLfloat) 0.799118, (GLfloat) 0.073163,
+       (GLfloat) 0.896389, (GLfloat) 0.425982, (GLfloat) 0.122582,
+       (GLfloat) 0.910488, (GLfloat) 0.389376, (GLfloat) 0.139274,
+       (GLfloat) 0.787435, (GLfloat) 0.503715, (GLfloat) 0.355272,
+       (GLfloat) 0.794681, (GLfloat) 0.474299, (GLfloat) 0.378844,
+       (GLfloat) 0.558283, (GLfloat) 0.810311, (GLfloat) - 0.178092,
+       (GLfloat) 0.573088, (GLfloat) 0.793214, (GLfloat) - 0.205866,
+       (GLfloat) 0.787434, (GLfloat) 0.503716, (GLfloat) - 0.355272,
+       (GLfloat) 0.794681, (GLfloat) 0.474299, (GLfloat) - 0.378844,
+       (GLfloat) 0.910488, (GLfloat) 0.389376, (GLfloat) - 0.139274,
+       (GLfloat) 0.896389, (GLfloat) 0.425982, (GLfloat) - 0.122583,
+       (GLfloat) 0.596705, (GLfloat) 0.799118, (GLfloat) - 0.073163,
+       (GLfloat) 0.606103, (GLfloat) 0.792390, (GLfloat) - 0.068965,
+       (GLfloat) 0.528377, (GLfloat) - 0.013430, (GLfloat) 0.848903,
+       (GLfloat) 0.532136, (GLfloat) - 0.007543, (GLfloat) 0.846625,
+       (GLfloat) 0.209439, (GLfloat) 0.141946, (GLfloat) 0.967464,
+       (GLfloat) 0.218070, (GLfloat) 0.152719, (GLfloat) 0.963910,
+       (GLfloat) 0.237428, (GLfloat) 0.197257, (GLfloat) 0.951166,
+       (GLfloat) 0.225804, (GLfloat) 0.180417, (GLfloat) 0.957320,
+       (GLfloat) 0.549711, (GLfloat) 0.076255, (GLfloat) 0.831867,
+       (GLfloat) 0.550775, (GLfloat) 0.056452, (GLfloat) 0.832742,
+       (GLfloat) - 0.393177, (GLfloat) 0.417558, (GLfloat) 0.819181,
+       (GLfloat) - 0.379656, (GLfloat) 0.429289, (GLfloat) 0.819495,
+       (GLfloat) - 0.366688, (GLfloat) 0.451901, (GLfloat) 0.813219,
+       (GLfloat) - 0.369492, (GLfloat) 0.449132, (GLfloat) 0.813484,
+       (GLfloat) - 0.064014, (GLfloat) 0.313584, (GLfloat) 0.947400,
+       (GLfloat) - 0.066684, (GLfloat) 0.310439, (GLfloat) 0.948252,
+       (GLfloat) - 0.086424, (GLfloat) 0.278029, (GLfloat) 0.956677,
+       (GLfloat) - 0.074037, (GLfloat) 0.290647, (GLfloat) 0.953962,
+       (GLfloat) 0.110270, (GLfloat) 0.952576, (GLfloat) 0.283620,
+       (GLfloat) 0.140226, (GLfloat) 0.954260, (GLfloat) 0.264054,
+       (GLfloat) 0.237331, (GLfloat) 0.918949, (GLfloat) 0.314972,
+       (GLfloat) 0.245773, (GLfloat) 0.920155, (GLfloat) 0.304813,
+       (GLfloat) 0.105329, (GLfloat) 0.694128, (GLfloat) 0.712104,
+       (GLfloat) 0.087202, (GLfloat) 0.678641, (GLfloat) 0.729275,
+       (GLfloat) - 0.104644, (GLfloat) 0.803491, (GLfloat) 0.586048,
+       (GLfloat) - 0.129358, (GLfloat) 0.790652, (GLfloat) 0.598444,
+       (GLfloat) 0.490179, (GLfloat) 0.834739, (GLfloat) 0.250869,
+       (GLfloat) 0.486736, (GLfloat) 0.825366, (GLfloat) 0.286109,
+       (GLfloat) 0.575458, (GLfloat) 0.546427, (GLfloat) 0.608494,
+       (GLfloat) 0.582377, (GLfloat) 0.582433, (GLfloat) 0.567105,
+       (GLfloat) 0.347588, (GLfloat) 0.580631, (GLfloat) 0.736241,
+       (GLfloat) 0.339131, (GLfloat) 0.624243, (GLfloat) 0.703783,
+       (GLfloat) 0.378417, (GLfloat) 0.874281, (GLfloat) 0.304028,
+       (GLfloat) 0.373374, (GLfloat) 0.872526, (GLfloat) 0.315104,
+       (GLfloat) - 0.678225, (GLfloat) 0.555239, (GLfloat) 0.481373,
+       (GLfloat) - 0.681792, (GLfloat) 0.544639, (GLfloat) 0.488393,
+       (GLfloat) - 0.792737, (GLfloat) 0.589393, (GLfloat) 0.155511,
+       (GLfloat) - 0.790738, (GLfloat) 0.592627, (GLfloat) 0.153380,
+       (GLfloat) - 0.787611, (GLfloat) 0.595240, (GLfloat) 0.159243,
+       (GLfloat) - 0.781477, (GLfloat) 0.604504, (GLfloat) 0.154495,
+       (GLfloat) - 0.659940, (GLfloat) 0.576523, (GLfloat) 0.481768,
+       (GLfloat) - 0.666748, (GLfloat) 0.561105, (GLfloat) 0.490519,
+       (GLfloat) - 0.678225, (GLfloat) 0.555239, (GLfloat) - 0.481374,
+       (GLfloat) - 0.681792, (GLfloat) 0.544639, (GLfloat) - 0.488393,
+       (GLfloat) - 0.666748, (GLfloat) 0.561105, (GLfloat) - 0.490519,
+       (GLfloat) - 0.659940, (GLfloat) 0.576523, (GLfloat) - 0.481768,
+       (GLfloat) - 0.787611, (GLfloat) 0.595240, (GLfloat) - 0.159243,
+       (GLfloat) - 0.781477, (GLfloat) 0.604504, (GLfloat) - 0.154495,
+       (GLfloat) - 0.790738, (GLfloat) 0.592627, (GLfloat) - 0.153380,
+       (GLfloat) - 0.792737, (GLfloat) 0.589393, (GLfloat) - 0.155511,
+       (GLfloat) 0.036752, (GLfloat) 0.977890, (GLfloat) - 0.205867,
+       (GLfloat) 0.058945, (GLfloat) 0.982247, (GLfloat) - 0.178091,
+       (GLfloat) 0.010229, (GLfloat) 0.997567, (GLfloat) - 0.068965,
+       (GLfloat) 0.021776, (GLfloat) 0.997082, (GLfloat) - 0.073162,
+       (GLfloat) - 0.480804, (GLfloat) 0.867725, (GLfloat) - 0.126022,
+       (GLfloat) - 0.442857, (GLfloat) 0.886381, (GLfloat) - 0.134932,
+       (GLfloat) - 0.305505, (GLfloat) 0.879128, (GLfloat) - 0.365788,
+       (GLfloat) - 0.350437, (GLfloat) 0.860755, (GLfloat) - 0.369182,
+       (GLfloat) 0.058946, (GLfloat) 0.982247, (GLfloat) 0.178091,
+       (GLfloat) 0.036752, (GLfloat) 0.977890, (GLfloat) 0.205867,
+       (GLfloat) - 0.350437, (GLfloat) 0.860755, (GLfloat) 0.369182,
+       (GLfloat) - 0.305505, (GLfloat) 0.879128, (GLfloat) 0.365788,
+       (GLfloat) - 0.480804, (GLfloat) 0.867725, (GLfloat) 0.126022,
+       (GLfloat) - 0.442857, (GLfloat) 0.886381, (GLfloat) 0.134932,
+       (GLfloat) 0.021776, (GLfloat) 0.997082, (GLfloat) 0.073162,
+       (GLfloat) 0.010229, (GLfloat) 0.997567, (GLfloat) 0.068965,
+       (GLfloat) - 0.393178, (GLfloat) 0.417557, (GLfloat) - 0.819181,
+       (GLfloat) - 0.379655, (GLfloat) 0.429290, (GLfloat) - 0.819495,
+       (GLfloat) - 0.074037, (GLfloat) 0.290648, (GLfloat) - 0.953961,
+       (GLfloat) - 0.086424, (GLfloat) 0.278030, (GLfloat) - 0.956677,
+       (GLfloat) - 0.064013, (GLfloat) 0.313585, (GLfloat) - 0.947400,
+       (GLfloat) - 0.066684, (GLfloat) 0.310439, (GLfloat) - 0.948252,
+       (GLfloat) - 0.369492, (GLfloat) 0.449132, (GLfloat) - 0.813484,
+       (GLfloat) - 0.366688, (GLfloat) 0.451901, (GLfloat) - 0.813219,
+       (GLfloat) 0.532135, (GLfloat) - 0.007544, (GLfloat) - 0.846626,
+       (GLfloat) 0.528378, (GLfloat) - 0.013430, (GLfloat) - 0.848903,
+       (GLfloat) 0.550775, (GLfloat) 0.056452, (GLfloat) - 0.832742,
+       (GLfloat) 0.549711, (GLfloat) 0.076255, (GLfloat) - 0.831867,
+       (GLfloat) 0.225804, (GLfloat) 0.180419, (GLfloat) - 0.957320,
+       (GLfloat) 0.237428, (GLfloat) 0.197257, (GLfloat) - 0.951166,
+       (GLfloat) 0.209439, (GLfloat) 0.141946, (GLfloat) - 0.967464,
+       (GLfloat) 0.218070, (GLfloat) 0.152720, (GLfloat) - 0.963910,
+       (GLfloat) 0.490179, (GLfloat) 0.834739, (GLfloat) - 0.250870,
+       (GLfloat) 0.486736, (GLfloat) 0.825366, (GLfloat) - 0.286109,
+       (GLfloat) 0.373374, (GLfloat) 0.872526, (GLfloat) - 0.315104,
+       (GLfloat) 0.378417, (GLfloat) 0.874281, (GLfloat) - 0.304029,
+       (GLfloat) 0.339131, (GLfloat) 0.624243, (GLfloat) - 0.703783,
+       (GLfloat) 0.347588, (GLfloat) 0.580630, (GLfloat) - 0.736241,
+       (GLfloat) 0.582377, (GLfloat) 0.582434, (GLfloat) - 0.567105,
+       (GLfloat) 0.575458, (GLfloat) 0.546427, (GLfloat) - 0.608494,
+       (GLfloat) 0.140225, (GLfloat) 0.954260, (GLfloat) - 0.264055,
+       (GLfloat) 0.110270, (GLfloat) 0.952576, (GLfloat) - 0.283620,
+       (GLfloat) - 0.104644, (GLfloat) 0.803491, (GLfloat) - 0.586047,
+       (GLfloat) - 0.129358, (GLfloat) 0.790652, (GLfloat) - 0.598444,
+       (GLfloat) 0.087202, (GLfloat) 0.678640, (GLfloat) - 0.729276,
+       (GLfloat) 0.105329, (GLfloat) 0.694128, (GLfloat) - 0.712104,
+       (GLfloat) 0.237332, (GLfloat) 0.918949, (GLfloat) - 0.314972,
+       (GLfloat) 0.245773, (GLfloat) 0.920155, (GLfloat) - 0.304813,
+       (GLfloat) 0.448419, (GLfloat) 0.885179, (GLfloat) 0.124011,
+       (GLfloat) 0.437269, (GLfloat) 0.889018, (GLfloat) 0.135803,
+       (GLfloat) 0.364737, (GLfloat) 0.924635, (GLfloat) 0.109622,
+       (GLfloat) 0.360657, (GLfloat) 0.925618, (GLfloat) 0.114709,
+       (GLfloat) 0.353761, (GLfloat) 0.934751, (GLfloat) 0.033079,
+       (GLfloat) 0.356519, (GLfloat) 0.933801, (GLfloat) 0.030163,
+       (GLfloat) 0.426940, (GLfloat) 0.903217, (GLfloat) 0.043834,
+       (GLfloat) 0.431621, (GLfloat) 0.901183, (GLfloat) 0.039656,
+       (GLfloat) 0.202761, (GLfloat) 0.969766, (GLfloat) 0.135803,
+       (GLfloat) 0.191612, (GLfloat) 0.973605, (GLfloat) 0.124011,
+       (GLfloat) 0.219643, (GLfloat) 0.974595, (GLfloat) 0.043834,
+       (GLfloat) 0.214702, (GLfloat) 0.975874, (GLfloat) 0.039656,
+       (GLfloat) 0.293965, (GLfloat) 0.955340, (GLfloat) 0.030163,
+       (GLfloat) 0.296722, (GLfloat) 0.954391, (GLfloat) 0.033079,
+       (GLfloat) 0.281846, (GLfloat) 0.953177, (GLfloat) 0.109622,
+       (GLfloat) 0.285665, (GLfloat) 0.951439, (GLfloat) 0.114709,
+       (GLfloat) 0.191612, (GLfloat) 0.973605, (GLfloat) - 0.124011,
+       (GLfloat) 0.202761, (GLfloat) 0.969766, (GLfloat) - 0.135803,
+       (GLfloat) 0.281846, (GLfloat) 0.953177, (GLfloat) - 0.109622,
+       (GLfloat) 0.285665, (GLfloat) 0.951439, (GLfloat) - 0.114709,
+       (GLfloat) 0.296722, (GLfloat) 0.954391, (GLfloat) - 0.033079,
+       (GLfloat) 0.293965, (GLfloat) 0.955340, (GLfloat) - 0.030163,
+       (GLfloat) 0.219643, (GLfloat) 0.974595, (GLfloat) - 0.043834,
+       (GLfloat) 0.214702, (GLfloat) 0.975874, (GLfloat) - 0.039656,
+       (GLfloat) 0.437270, (GLfloat) 0.889018, (GLfloat) - 0.135802,
+       (GLfloat) 0.448419, (GLfloat) 0.885179, (GLfloat) - 0.124011,
+       (GLfloat) 0.426940, (GLfloat) 0.903217, (GLfloat) - 0.043834,
+       (GLfloat) 0.431621, (GLfloat) 0.901183, (GLfloat) - 0.039656,
+       (GLfloat) 0.356519, (GLfloat) 0.933801, (GLfloat) - 0.030163,
+       (GLfloat) 0.353761, (GLfloat) 0.934751, (GLfloat) - 0.033079,
+       (GLfloat) 0.364737, (GLfloat) 0.924635, (GLfloat) - 0.109622,
+       (GLfloat) 0.360657, (GLfloat) 0.925618, (GLfloat) - 0.114709,
+       (GLfloat) 0.865947, (GLfloat) 0.016137, (GLfloat) - 0.499875,
+       (GLfloat) 0.868761, (GLfloat) 0.025708, (GLfloat) - 0.494564,
+       (GLfloat) 0.864411, (GLfloat) 0.044558, (GLfloat) - 0.500808,
+       (GLfloat) 0.867101, (GLfloat) 0.054429, (GLfloat) - 0.495149,
+       (GLfloat) 0.986611, (GLfloat) - 0.030929, (GLfloat) - 0.160132,
+       (GLfloat) 0.986294, (GLfloat) - 0.033936, (GLfloat) - 0.161472,
+       (GLfloat) 0.985351, (GLfloat) - 0.059326, (GLfloat) - 0.159886,
+       (GLfloat) 0.984981, (GLfloat) - 0.062150, (GLfloat) - 0.161092,
+       (GLfloat) 0.832885, (GLfloat) - 0.213353, (GLfloat) - 0.510669,
+       (GLfloat) 0.832050, (GLfloat) - 0.215053, (GLfloat) - 0.511318,
+       (GLfloat) 0.946090, (GLfloat) - 0.280224, (GLfloat) - 0.162447,
+       (GLfloat) 0.946491, (GLfloat) - 0.279128, (GLfloat) - 0.161996,
+       (GLfloat) 0.980117, (GLfloat) - 0.113104, (GLfloat) - 0.163030,
+       (GLfloat) 0.979875, (GLfloat) - 0.114395, (GLfloat) - 0.163582,
+       (GLfloat) 0.859139, (GLfloat) - 0.037704, (GLfloat) - 0.510352,
+       (GLfloat) 0.860908, (GLfloat) - 0.032422, (GLfloat) - 0.507727,
+       (GLfloat) 0.832885, (GLfloat) - 0.213353, (GLfloat) 0.510669,
+       (GLfloat) 0.832049, (GLfloat) - 0.215054, (GLfloat) 0.511318,
+       (GLfloat) 0.860908, (GLfloat) - 0.032422, (GLfloat) 0.507727,
+       (GLfloat) 0.859138, (GLfloat) - 0.037705, (GLfloat) 0.510352,
+       (GLfloat) 0.980117, (GLfloat) - 0.113104, (GLfloat) 0.163030,
+       (GLfloat) 0.979875, (GLfloat) - 0.114395, (GLfloat) 0.163582,
+       (GLfloat) 0.946491, (GLfloat) - 0.279128, (GLfloat) 0.161996,
+       (GLfloat) 0.946090, (GLfloat) - 0.280224, (GLfloat) 0.162447,
+       (GLfloat) 0.868761, (GLfloat) 0.025708, (GLfloat) 0.494563,
+       (GLfloat) 0.865947, (GLfloat) 0.016137, (GLfloat) 0.499875,
+       (GLfloat) 0.985351, (GLfloat) - 0.059326, (GLfloat) 0.159886,
+       (GLfloat) 0.984981, (GLfloat) - 0.062149, (GLfloat) 0.161092,
+       (GLfloat) 0.986294, (GLfloat) - 0.033936, (GLfloat) 0.161472,
+       (GLfloat) 0.986611, (GLfloat) - 0.030929, (GLfloat) 0.160132,
+       (GLfloat) 0.864411, (GLfloat) 0.044558, (GLfloat) 0.500808,
+       (GLfloat) 0.867101, (GLfloat) 0.054428, (GLfloat) 0.495149,
+       (GLfloat) - 0.329624, (GLfloat) 0.568782, (GLfloat) - 0.753548,
+       (GLfloat) - 0.303532, (GLfloat) 0.584080, (GLfloat) - 0.752808,
+       (GLfloat) - 0.337233, (GLfloat) 0.584915, (GLfloat) - 0.737664,
+       (GLfloat) - 0.311968, (GLfloat) 0.599454, (GLfloat) - 0.737110,
+       (GLfloat) - 0.032356, (GLfloat) 0.486520, (GLfloat) - 0.873070,
+       (GLfloat) - 0.057628, (GLfloat) 0.467531, (GLfloat) - 0.882096,
+       (GLfloat) - 0.019804, (GLfloat) 0.465587, (GLfloat) - 0.884780,
+       (GLfloat) - 0.045819, (GLfloat) 0.445898, (GLfloat) - 0.893910,
+       (GLfloat) - 0.451403, (GLfloat) 0.351833, (GLfloat) - 0.820029,
+       (GLfloat) - 0.442643, (GLfloat) 0.360683, (GLfloat) - 0.820960,
+       (GLfloat) - 0.125959, (GLfloat) 0.231940, (GLfloat) - 0.964540,
+       (GLfloat) - 0.133424, (GLfloat) 0.223158, (GLfloat) - 0.965608,
+       (GLfloat) - 0.071940, (GLfloat) 0.416419, (GLfloat) - 0.906322,
+       (GLfloat) - 0.089763, (GLfloat) 0.400364, (GLfloat) - 0.911949,
+       (GLfloat) - 0.381140, (GLfloat) 0.522054, (GLfloat) - 0.763015,
+       (GLfloat) - 0.362693, (GLfloat) 0.535129, (GLfloat) - 0.762949,
+       (GLfloat) 0.514033, (GLfloat) - 0.052564, (GLfloat) - 0.856158,
+       (GLfloat) 0.512829, (GLfloat) - 0.054517, (GLfloat) - 0.856758,
+       (GLfloat) 0.539192, (GLfloat) 0.146366, (GLfloat) - 0.829367,
+       (GLfloat) 0.531981, (GLfloat) 0.133703, (GLfloat) - 0.836133,
+       (GLfloat) 0.204167, (GLfloat) 0.278037, (GLfloat) - 0.938622,
+       (GLfloat) 0.217587, (GLfloat) 0.294489, (GLfloat) - 0.930555,
+       (GLfloat) 0.177512, (GLfloat) 0.093824, (GLfloat) - 0.979636,
+       (GLfloat) 0.182065, (GLfloat) 0.100184, (GLfloat) - 0.978170,
+       (GLfloat) 0.561737, (GLfloat) 0.205535, (GLfloat) - 0.801378,
+       (GLfloat) 0.550517, (GLfloat) 0.186829, (GLfloat) - 0.813650,
+       (GLfloat) 0.237090, (GLfloat) 0.326380, (GLfloat) - 0.915022,
+       (GLfloat) 0.257400, (GLfloat) 0.348104, (GLfloat) - 0.901426,
+       (GLfloat) 0.225204, (GLfloat) 0.351522, (GLfloat) - 0.908689,
+       (GLfloat) 0.244915, (GLfloat) 0.372788, (GLfloat) - 0.895012,
+       (GLfloat) 0.553162, (GLfloat) 0.233132, (GLfloat) - 0.799789,
+       (GLfloat) 0.542289, (GLfloat) 0.214487, (GLfloat) - 0.812354,
+       (GLfloat) - 0.303532, (GLfloat) 0.584080, (GLfloat) 0.752808,
+       (GLfloat) - 0.329624, (GLfloat) 0.568782, (GLfloat) 0.753548,
+       (GLfloat) - 0.019804, (GLfloat) 0.465588, (GLfloat) 0.884780,
+       (GLfloat) - 0.045820, (GLfloat) 0.445898, (GLfloat) 0.893910,
+       (GLfloat) - 0.057628, (GLfloat) 0.467531, (GLfloat) 0.882096,
+       (GLfloat) - 0.032356, (GLfloat) 0.486520, (GLfloat) 0.873070,
+       (GLfloat) - 0.337233, (GLfloat) 0.584915, (GLfloat) 0.737664,
+       (GLfloat) - 0.311968, (GLfloat) 0.599453, (GLfloat) 0.737110,
+       (GLfloat) 0.561737, (GLfloat) 0.205535, (GLfloat) 0.801378,
+       (GLfloat) 0.550517, (GLfloat) 0.186829, (GLfloat) 0.813650,
+       (GLfloat) 0.542289, (GLfloat) 0.214487, (GLfloat) 0.812354,
+       (GLfloat) 0.553162, (GLfloat) 0.233132, (GLfloat) 0.799789,
+       (GLfloat) 0.225204, (GLfloat) 0.351522, (GLfloat) 0.908689,
+       (GLfloat) 0.244915, (GLfloat) 0.372788, (GLfloat) 0.895012,
+       (GLfloat) 0.257400, (GLfloat) 0.348104, (GLfloat) 0.901426,
+       (GLfloat) 0.237091, (GLfloat) 0.326380, (GLfloat) 0.915021,
+       (GLfloat) 0.512829, (GLfloat) - 0.054517, (GLfloat) 0.856758,
+       (GLfloat) 0.514033, (GLfloat) - 0.052564, (GLfloat) 0.856158,
+       (GLfloat) 0.177512, (GLfloat) 0.093824, (GLfloat) 0.979636,
+       (GLfloat) 0.182065, (GLfloat) 0.100184, (GLfloat) 0.978170,
+       (GLfloat) 0.217587, (GLfloat) 0.294488, (GLfloat) 0.930555,
+       (GLfloat) 0.204167, (GLfloat) 0.278037, (GLfloat) 0.938622,
+       (GLfloat) 0.539192, (GLfloat) 0.146365, (GLfloat) 0.829367,
+       (GLfloat) 0.531981, (GLfloat) 0.133703, (GLfloat) 0.836133,
+       (GLfloat) - 0.451403, (GLfloat) 0.351833, (GLfloat) 0.820029,
+       (GLfloat) - 0.442643, (GLfloat) 0.360683, (GLfloat) 0.820960,
+       (GLfloat) - 0.362693, (GLfloat) 0.535129, (GLfloat) 0.762949,
+       (GLfloat) - 0.381140, (GLfloat) 0.522054, (GLfloat) 0.763015,
+       (GLfloat) - 0.071940, (GLfloat) 0.416419, (GLfloat) 0.906322,
+       (GLfloat) - 0.089763, (GLfloat) 0.400364, (GLfloat) 0.911949,
+       (GLfloat) - 0.133424, (GLfloat) 0.223158, (GLfloat) 0.965608,
+       (GLfloat) - 0.125959, (GLfloat) 0.231940, (GLfloat) 0.964540,
+       (GLfloat) - 0.574082, (GLfloat) 0.688221, (GLfloat) - 0.443601,
+       (GLfloat) - 0.590248, (GLfloat) 0.678175, (GLfloat) - 0.437821,
+       (GLfloat) - 0.687359, (GLfloat) 0.712967, (GLfloat) - 0.138621,
+       (GLfloat) - 0.682813, (GLfloat) 0.716686, (GLfloat) - 0.141874,
+       (GLfloat) - 0.682597, (GLfloat) 0.718360, (GLfloat) - 0.134243,
+       (GLfloat) - 0.678253, (GLfloat) 0.721849, (GLfloat) - 0.137502,
+       (GLfloat) - 0.574037, (GLfloat) 0.696240, (GLfloat) - 0.430966,
+       (GLfloat) - 0.589571, (GLfloat) 0.686777, (GLfloat) - 0.425139,
+       (GLfloat) - 0.574082, (GLfloat) 0.688221, (GLfloat) 0.443601,
+       (GLfloat) - 0.590248, (GLfloat) 0.678175, (GLfloat) 0.437821,
+       (GLfloat) - 0.589571, (GLfloat) 0.686777, (GLfloat) 0.425139,
+       (GLfloat) - 0.574037, (GLfloat) 0.696240, (GLfloat) 0.430966,
+       (GLfloat) - 0.682597, (GLfloat) 0.718360, (GLfloat) 0.134243,
+       (GLfloat) - 0.678253, (GLfloat) 0.721849, (GLfloat) 0.137502,
+       (GLfloat) - 0.682813, (GLfloat) 0.716686, (GLfloat) 0.141874,
+       (GLfloat) - 0.687359, (GLfloat) 0.712967, (GLfloat) 0.138621,
+       (GLfloat) - 0.741041, (GLfloat) 0.473108, (GLfloat) 0.476473,
+       (GLfloat) - 0.742406, (GLfloat) 0.464975, (GLfloat) 0.482319,
+       (GLfloat) - 0.850293, (GLfloat) 0.503676, (GLfloat) 0.152681,
+       (GLfloat) - 0.849127, (GLfloat) 0.506180, (GLfloat) 0.150879,
+       (GLfloat) - 0.738717, (GLfloat) 0.659007, (GLfloat) 0.141447,
+       (GLfloat) - 0.736283, (GLfloat) 0.662408, (GLfloat) 0.138214,
+       (GLfloat) - 0.631960, (GLfloat) 0.635245, (GLfloat) 0.443948,
+       (GLfloat) - 0.643540, (GLfloat) 0.626686, (GLfloat) 0.439455,
+       (GLfloat) - 0.741041, (GLfloat) 0.473108, (GLfloat) - 0.476473,
+       (GLfloat) - 0.742406, (GLfloat) 0.464975, (GLfloat) - 0.482319,
+       (GLfloat) - 0.631960, (GLfloat) 0.635245, (GLfloat) - 0.443948,
+       (GLfloat) - 0.643541, (GLfloat) 0.626686, (GLfloat) - 0.439455,
+       (GLfloat) - 0.738717, (GLfloat) 0.659007, (GLfloat) - 0.141447,
+       (GLfloat) - 0.736283, (GLfloat) 0.662408, (GLfloat) - 0.138214,
+       (GLfloat) - 0.849127, (GLfloat) 0.506180, (GLfloat) - 0.150879,
+       (GLfloat) - 0.850293, (GLfloat) 0.503676, (GLfloat) - 0.152681,
+       (GLfloat) - 0.489320, (GLfloat) - 0.355167, (GLfloat) - 0.796506,
+       (GLfloat) - 0.498398, (GLfloat) - 0.341072, (GLfloat) - 0.797038,
+       (GLfloat) - 0.172289, (GLfloat) - 0.401583, (GLfloat) - 0.899471,
+       (GLfloat) - 0.163102, (GLfloat) - 0.385135, (GLfloat) - 0.908333,
+       (GLfloat) - 0.182727, (GLfloat) - 0.410657, (GLfloat) - 0.893293,
+       (GLfloat) - 0.172422, (GLfloat) - 0.394484, (GLfloat) - 0.902581,
+       (GLfloat) - 0.506086, (GLfloat) - 0.336560, (GLfloat) - 0.794106,
+       (GLfloat) - 0.496896, (GLfloat) - 0.351037, (GLfloat) - 0.793642,
+       (GLfloat) 0.421643, (GLfloat) - 0.514114, (GLfloat) - 0.746930,
+       (GLfloat) 0.435781, (GLfloat) - 0.498195, (GLfloat) - 0.749598,
+       (GLfloat) 0.399104, (GLfloat) - 0.548391, (GLfloat) - 0.734836,
+       (GLfloat) 0.414969, (GLfloat) - 0.532774, (GLfloat) - 0.737532,
+       (GLfloat) 0.122126, (GLfloat) - 0.459168, (GLfloat) - 0.879915,
+       (GLfloat) 0.107835, (GLfloat) - 0.476533, (GLfloat) - 0.872518,
+       (GLfloat) 0.135473, (GLfloat) - 0.437168, (GLfloat) - 0.889118,
+       (GLfloat) 0.122726, (GLfloat) - 0.454818, (GLfloat) - 0.882088,
+       (GLfloat) 0.451859, (GLfloat) - 0.350279, (GLfloat) - 0.820444,
+       (GLfloat) 0.459996, (GLfloat) - 0.340221, (GLfloat) - 0.820154,
+       (GLfloat) 0.139327, (GLfloat) - 0.217141, (GLfloat) - 0.966146,
+       (GLfloat) 0.132987, (GLfloat) - 0.225779, (GLfloat) - 0.965059,
+       (GLfloat) 0.121571, (GLfloat) - 0.389814, (GLfloat) - 0.912834,
+       (GLfloat) 0.109716, (GLfloat) - 0.404550, (GLfloat) - 0.907910,
+       (GLfloat) 0.409974, (GLfloat) - 0.496912, (GLfloat) - 0.764852,
+       (GLfloat) 0.423414, (GLfloat) - 0.483036, (GLfloat) - 0.766418,
+       (GLfloat) - 0.517051, (GLfloat) 0.005478, (GLfloat) - 0.855937,
+       (GLfloat) - 0.518557, (GLfloat) 0.003075, (GLfloat) - 0.855038,
+       (GLfloat) - 0.515705, (GLfloat) - 0.236965, (GLfloat) - 0.823344,
+       (GLfloat) - 0.521517, (GLfloat) - 0.225403, (GLfloat) - 0.822930,
+       (GLfloat) - 0.189726, (GLfloat) - 0.318770, (GLfloat) - 0.928649,
+       (GLfloat) - 0.181223, (GLfloat) - 0.305795, (GLfloat) - 0.934691,
+       (GLfloat) - 0.179422, (GLfloat) - 0.111097, (GLfloat) - 0.977479,
+       (GLfloat) - 0.175584, (GLfloat) - 0.105473, (GLfloat) - 0.978798,
+       (GLfloat) - 0.822110, (GLfloat) - 0.303411, (GLfloat) - 0.481743,
+       (GLfloat) - 0.821692, (GLfloat) - 0.296307, (GLfloat) - 0.486851,
+       (GLfloat) - 0.829019, (GLfloat) - 0.285105, (GLfloat) - 0.481086,
+       (GLfloat) - 0.828324, (GLfloat) - 0.278227, (GLfloat) - 0.486280,
+       (GLfloat) - 0.955809, (GLfloat) - 0.248857, (GLfloat) - 0.156521,
+       (GLfloat) - 0.955462, (GLfloat) - 0.251102, (GLfloat) - 0.155051,
+       (GLfloat) - 0.949299, (GLfloat) - 0.272604, (GLfloat) - 0.156583,
+       (GLfloat) - 0.948870, (GLfloat) - 0.274919, (GLfloat) - 0.155132,
+       (GLfloat) - 0.850734, (GLfloat) 0.112614, (GLfloat) - 0.513391,
+       (GLfloat) - 0.850654, (GLfloat) 0.112793, (GLfloat) - 0.513484,
+       (GLfloat) - 0.974222, (GLfloat) 0.155109, (GLfloat) - 0.163808,
+       (GLfloat) - 0.974191, (GLfloat) 0.155230, (GLfloat) - 0.163874,
+       (GLfloat) - 0.980876, (GLfloat) - 0.109137, (GLfloat) - 0.161159,
+       (GLfloat) - 0.980855, (GLfloat) - 0.110647, (GLfloat) - 0.160255,
+       (GLfloat) - 0.853630, (GLfloat) - 0.150462, (GLfloat) - 0.498675,
+       (GLfloat) - 0.852599, (GLfloat) - 0.145646, (GLfloat) - 0.501859,
+       (GLfloat) - 0.850734, (GLfloat) 0.112614, (GLfloat) 0.513391,
+       (GLfloat) - 0.850654, (GLfloat) 0.112793, (GLfloat) 0.513484,
+       (GLfloat) - 0.852599, (GLfloat) - 0.145647, (GLfloat) 0.501859,
+       (GLfloat) - 0.853630, (GLfloat) - 0.150462, (GLfloat) 0.498676,
+       (GLfloat) - 0.980876, (GLfloat) - 0.109137, (GLfloat) 0.161159,
+       (GLfloat) - 0.980855, (GLfloat) - 0.110647, (GLfloat) 0.160255,
+       (GLfloat) - 0.974191, (GLfloat) 0.155230, (GLfloat) 0.163874,
+       (GLfloat) - 0.974222, (GLfloat) 0.155109, (GLfloat) 0.163808,
+       (GLfloat) - 0.821692, (GLfloat) - 0.296307, (GLfloat) 0.486851,
+       (GLfloat) - 0.822110, (GLfloat) - 0.303411, (GLfloat) 0.481743,
+       (GLfloat) - 0.949299, (GLfloat) - 0.272604, (GLfloat) 0.156583,
+       (GLfloat) - 0.948870, (GLfloat) - 0.274919, (GLfloat) 0.155132,
+       (GLfloat) - 0.955462, (GLfloat) - 0.251102, (GLfloat) 0.155051,
+       (GLfloat) - 0.955809, (GLfloat) - 0.248857, (GLfloat) 0.156520,
+       (GLfloat) - 0.829019, (GLfloat) - 0.285105, (GLfloat) 0.481086,
+       (GLfloat) - 0.828324, (GLfloat) - 0.278227, (GLfloat) 0.486280,
+       (GLfloat) - 0.498398, (GLfloat) - 0.341071, (GLfloat) 0.797038,
+       (GLfloat) - 0.489320, (GLfloat) - 0.355167, (GLfloat) 0.796507,
+       (GLfloat) - 0.506086, (GLfloat) - 0.336560, (GLfloat) 0.794106,
+       (GLfloat) - 0.496896, (GLfloat) - 0.351037, (GLfloat) 0.793642,
+       (GLfloat) - 0.182728, (GLfloat) - 0.410657, (GLfloat) 0.893293,
+       (GLfloat) - 0.172423, (GLfloat) - 0.394484, (GLfloat) 0.902581,
+       (GLfloat) - 0.163101, (GLfloat) - 0.385135, (GLfloat) 0.908333,
+       (GLfloat) - 0.172289, (GLfloat) - 0.401584, (GLfloat) 0.899470,
+       (GLfloat) - 0.518557, (GLfloat) 0.003076, (GLfloat) 0.855038,
+       (GLfloat) - 0.517051, (GLfloat) 0.005478, (GLfloat) 0.855937,
+       (GLfloat) - 0.179422, (GLfloat) - 0.111097, (GLfloat) 0.977479,
+       (GLfloat) - 0.175584, (GLfloat) - 0.105473, (GLfloat) 0.978798,
+       (GLfloat) - 0.181223, (GLfloat) - 0.305795, (GLfloat) 0.934691,
+       (GLfloat) - 0.189727, (GLfloat) - 0.318770, (GLfloat) 0.928649,
+       (GLfloat) - 0.521517, (GLfloat) - 0.225402, (GLfloat) 0.822930,
+       (GLfloat) - 0.515705, (GLfloat) - 0.236965, (GLfloat) 0.823344,
+       (GLfloat) 0.451859, (GLfloat) - 0.350279, (GLfloat) 0.820444,
+       (GLfloat) 0.459996, (GLfloat) - 0.340221, (GLfloat) 0.820154,
+       (GLfloat) 0.423414, (GLfloat) - 0.483036, (GLfloat) 0.766418,
+       (GLfloat) 0.409975, (GLfloat) - 0.496912, (GLfloat) 0.764853,
+       (GLfloat) 0.121571, (GLfloat) - 0.389814, (GLfloat) 0.912834,
+       (GLfloat) 0.109716, (GLfloat) - 0.404550, (GLfloat) 0.907911,
+       (GLfloat) 0.132987, (GLfloat) - 0.225779, (GLfloat) 0.965059,
+       (GLfloat) 0.139327, (GLfloat) - 0.217140, (GLfloat) 0.966146,
+       (GLfloat) 0.435780, (GLfloat) - 0.498195, (GLfloat) 0.749598,
+       (GLfloat) 0.421643, (GLfloat) - 0.514113, (GLfloat) 0.746930,
+       (GLfloat) 0.135473, (GLfloat) - 0.437169, (GLfloat) 0.889118,
+       (GLfloat) 0.122726, (GLfloat) - 0.454818, (GLfloat) 0.882088,
+       (GLfloat) 0.107835, (GLfloat) - 0.476534, (GLfloat) 0.872518,
+       (GLfloat) 0.122126, (GLfloat) - 0.459168, (GLfloat) 0.879915,
+       (GLfloat) 0.399104, (GLfloat) - 0.548391, (GLfloat) 0.734836,
+       (GLfloat) 0.414969, (GLfloat) - 0.532773, (GLfloat) 0.737532,
+       (GLfloat) 0.709825, (GLfloat) - 0.548164, (GLfloat) 0.442339,
+       (GLfloat) 0.706858, (GLfloat) - 0.559116, (GLfloat) 0.433291,
+       (GLfloat) 0.678133, (GLfloat) - 0.593660, (GLfloat) 0.433248,
+       (GLfloat) 0.674632, (GLfloat) - 0.604835, (GLfloat) 0.423140,
+       (GLfloat) 0.774649, (GLfloat) - 0.617973, (GLfloat) 0.134272,
+       (GLfloat) 0.777074, (GLfloat) - 0.614312, (GLfloat) 0.137026,
+       (GLfloat) 0.811265, (GLfloat) - 0.568214, (GLfloat) 0.137773,
+       (GLfloat) 0.813383, (GLfloat) - 0.564575, (GLfloat) 0.140223,
+       (GLfloat) 0.750611, (GLfloat) - 0.453426, (GLfloat) 0.480612,
+       (GLfloat) 0.748687, (GLfloat) - 0.462619, (GLfloat) 0.474817,
+       (GLfloat) 0.853444, (GLfloat) - 0.499176, (GLfloat) 0.149855,
+       (GLfloat) 0.854917, (GLfloat) - 0.496116, (GLfloat) 0.151614,
+       (GLfloat) 0.791852, (GLfloat) - 0.594634, (GLfloat) 0.139213,
+       (GLfloat) 0.794008, (GLfloat) - 0.591177, (GLfloat) 0.141637,
+       (GLfloat) 0.694144, (GLfloat) - 0.562907, (GLfloat) 0.448664,
+       (GLfloat) 0.690998, (GLfloat) - 0.573547, (GLfloat) 0.439961,
+       (GLfloat) 0.750611, (GLfloat) - 0.453426, (GLfloat) - 0.480612,
+       (GLfloat) 0.748687, (GLfloat) - 0.462620, (GLfloat) - 0.474817,
+       (GLfloat) 0.690999, (GLfloat) - 0.573546, (GLfloat) - 0.439961,
+       (GLfloat) 0.694144, (GLfloat) - 0.562907, (GLfloat) - 0.448664,
+       (GLfloat) 0.791852, (GLfloat) - 0.594634, (GLfloat) - 0.139213,
+       (GLfloat) 0.794008, (GLfloat) - 0.591177, (GLfloat) - 0.141637,
+       (GLfloat) 0.854917, (GLfloat) - 0.496116, (GLfloat) - 0.151614,
+       (GLfloat) 0.853444, (GLfloat) - 0.499176, (GLfloat) - 0.149855,
+       (GLfloat) 0.706858, (GLfloat) - 0.559116, (GLfloat) - 0.433291,
+       (GLfloat) 0.709825, (GLfloat) - 0.548164, (GLfloat) - 0.442339,
+       (GLfloat) 0.811265, (GLfloat) - 0.568214, (GLfloat) - 0.137773,
+       (GLfloat) 0.813383, (GLfloat) - 0.564575, (GLfloat) - 0.140223,
+       (GLfloat) 0.777074, (GLfloat) - 0.614312, (GLfloat) - 0.137026,
+       (GLfloat) 0.774649, (GLfloat) - 0.617973, (GLfloat) - 0.134272,
+       (GLfloat) 0.678133, (GLfloat) - 0.593660, (GLfloat) - 0.433248,
+       (GLfloat) 0.674631, (GLfloat) - 0.604835, (GLfloat) - 0.423139,
+       (GLfloat) 0.805725, (GLfloat) - 0.334902, (GLfloat) 0.488515,
+       (GLfloat) 0.805089, (GLfloat) - 0.341176, (GLfloat) 0.485212,
+       (GLfloat) 0.923877, (GLfloat) - 0.350079, (GLfloat) 0.154583,
+       (GLfloat) 0.924516, (GLfloat) - 0.347968, (GLfloat) 0.155526,
+       (GLfloat) 0.927012, (GLfloat) - 0.340158, (GLfloat) 0.157929,
+       (GLfloat) 0.924342, (GLfloat) - 0.348817, (GLfloat) 0.154657,
+       (GLfloat) 0.800744, (GLfloat) - 0.354688, (GLfloat) 0.482707,
+       (GLfloat) 0.801658, (GLfloat) - 0.348585, (GLfloat) 0.485626,
+       (GLfloat) 0.805725, (GLfloat) - 0.334902, (GLfloat) - 0.488516,
+       (GLfloat) 0.805089, (GLfloat) - 0.341176, (GLfloat) - 0.485212,
+       (GLfloat) 0.801658, (GLfloat) - 0.348585, (GLfloat) - 0.485626,
+       (GLfloat) 0.800744, (GLfloat) - 0.354688, (GLfloat) - 0.482707,
+       (GLfloat) 0.927012, (GLfloat) - 0.340158, (GLfloat) - 0.157929,
+       (GLfloat) 0.924342, (GLfloat) - 0.348818, (GLfloat) - 0.154657,
+       (GLfloat) 0.924516, (GLfloat) - 0.347968, (GLfloat) - 0.155526,
+       (GLfloat) 0.923877, (GLfloat) - 0.350079, (GLfloat) - 0.154583,
+       (GLfloat) 0.283621, (GLfloat) - 0.936578, (GLfloat) - 0.205866,
+       (GLfloat) 0.264056, (GLfloat) - 0.947923, (GLfloat) - 0.178092,
+       (GLfloat) 0.315105, (GLfloat) - 0.946548, (GLfloat) - 0.068965,
+       (GLfloat) 0.304029, (GLfloat) - 0.949849, (GLfloat) - 0.073162,
+       (GLfloat) 0.681274, (GLfloat) - 0.722487, (GLfloat) - 0.117805,
+       (GLfloat) 0.706887, (GLfloat) - 0.694350, (GLfloat) - 0.134864,
+       (GLfloat) 0.560017, (GLfloat) - 0.754527, (GLfloat) - 0.342154,
+       (GLfloat) 0.577334, (GLfloat) - 0.729313, (GLfloat) - 0.367135,
+       (GLfloat) 0.264055, (GLfloat) - 0.947923, (GLfloat) 0.178092,
+       (GLfloat) 0.283621, (GLfloat) - 0.936578, (GLfloat) 0.205866,
+       (GLfloat) 0.560017, (GLfloat) - 0.754527, (GLfloat) 0.342155,
+       (GLfloat) 0.577334, (GLfloat) - 0.729313, (GLfloat) 0.367135,
+       (GLfloat) 0.706888, (GLfloat) - 0.694350, (GLfloat) 0.134864,
+       (GLfloat) 0.681274, (GLfloat) - 0.722487, (GLfloat) 0.117805,
+       (GLfloat) 0.304029, (GLfloat) - 0.949849, (GLfloat) 0.073162,
+       (GLfloat) 0.315105, (GLfloat) - 0.946548, (GLfloat) 0.068965,
+       (GLfloat) 0.484153, (GLfloat) - 0.303994, (GLfloat) - 0.820478,
+       (GLfloat) 0.489225, (GLfloat) - 0.294821, (GLfloat) - 0.820816,
+       (GLfloat) 0.156385, (GLfloat) - 0.248336, (GLfloat) - 0.955967,
+       (GLfloat) 0.151648, (GLfloat) - 0.258100, (GLfloat) - 0.954142,
+       (GLfloat) 0.160268, (GLfloat) - 0.275037, (GLfloat) - 0.947981,
+       (GLfloat) 0.153877, (GLfloat) - 0.291476, (GLfloat) - 0.944120,
+       (GLfloat) 0.481923, (GLfloat) - 0.335378, (GLfloat) - 0.809489,
+       (GLfloat) 0.489881, (GLfloat) - 0.318876, (GLfloat) - 0.811378,
+       (GLfloat) - 0.511124, (GLfloat) - 0.173861, (GLfloat) - 0.841739,
+       (GLfloat) - 0.507919, (GLfloat) - 0.180984, (GLfloat) - 0.842177,
+       (GLfloat) - 0.502437, (GLfloat) - 0.243295, (GLfloat) - 0.829678,
+       (GLfloat) - 0.501146, (GLfloat) - 0.246358, (GLfloat) - 0.829554,
+       (GLfloat) - 0.162122, (GLfloat) - 0.255565, (GLfloat) - 0.953102,
+       (GLfloat) - 0.162682, (GLfloat) - 0.257426, (GLfloat) - 0.952505,
+       (GLfloat) - 0.167026, (GLfloat) - 0.217710, (GLfloat) - 0.961616,
+       (GLfloat) - 0.163395, (GLfloat) - 0.208930, (GLfloat) - 0.964184,
+       (GLfloat) - 0.205866, (GLfloat) - 0.936578, (GLfloat) - 0.283621,
+       (GLfloat) - 0.178092, (GLfloat) - 0.947923, (GLfloat) - 0.264055,
+       (GLfloat) - 0.068965, (GLfloat) - 0.946548, (GLfloat) - 0.315105,
+       (GLfloat) - 0.073162, (GLfloat) - 0.949849, (GLfloat) - 0.304029,
+       (GLfloat) - 0.124478, (GLfloat) - 0.692921, (GLfloat) - 0.710188,
+       (GLfloat) - 0.138779, (GLfloat) - 0.668059, (GLfloat) - 0.731052,
+       (GLfloat) - 0.361212, (GLfloat) - 0.721974, (GLfloat) - 0.590152,
+       (GLfloat) - 0.383785, (GLfloat) - 0.697396, (GLfloat) - 0.605267,
+       (GLfloat) 0.178092, (GLfloat) - 0.947923, (GLfloat) - 0.264056,
+       (GLfloat) 0.205866, (GLfloat) - 0.936578, (GLfloat) - 0.283621,
+       (GLfloat) 0.341480, (GLfloat) - 0.751054, (GLfloat) - 0.565075,
+       (GLfloat) 0.372366, (GLfloat) - 0.719604, (GLfloat) - 0.586101,
+       (GLfloat) 0.138114, (GLfloat) - 0.672674, (GLfloat) - 0.726935,
+       (GLfloat) 0.117913, (GLfloat) - 0.706722, (GLfloat) - 0.697597,
+       (GLfloat) 0.073162, (GLfloat) - 0.949849, (GLfloat) - 0.304029,
+       (GLfloat) 0.068965, (GLfloat) - 0.946548, (GLfloat) - 0.315105,
+       (GLfloat) - 0.850324, (GLfloat) - 0.141983, (GLfloat) - 0.506744,
+       (GLfloat) - 0.849870, (GLfloat) - 0.138328, (GLfloat) - 0.508515,
+       (GLfloat) - 0.979216, (GLfloat) - 0.120924, (GLfloat) - 0.162831,
+       (GLfloat) - 0.979161, (GLfloat) - 0.122085, (GLfloat) - 0.162295,
+       (GLfloat) - 0.968183, (GLfloat) - 0.188900, (GLfloat) - 0.164128,
+       (GLfloat) - 0.966893, (GLfloat) - 0.198288, (GLfloat) - 0.160620,
+       (GLfloat) - 0.836326, (GLfloat) - 0.225408, (GLfloat) - 0.499751,
+       (GLfloat) - 0.836389, (GLfloat) - 0.213159, (GLfloat) - 0.504991,
+       (GLfloat) - 0.850324, (GLfloat) - 0.141983, (GLfloat) 0.506744,
+       (GLfloat) - 0.849870, (GLfloat) - 0.138328, (GLfloat) 0.508515,
+       (GLfloat) - 0.836389, (GLfloat) - 0.213159, (GLfloat) 0.504991,
+       (GLfloat) - 0.836326, (GLfloat) - 0.225408, (GLfloat) 0.499751,
+       (GLfloat) - 0.968183, (GLfloat) - 0.188900, (GLfloat) 0.164128,
+       (GLfloat) - 0.966894, (GLfloat) - 0.198288, (GLfloat) 0.160620,
+       (GLfloat) - 0.979161, (GLfloat) - 0.122085, (GLfloat) 0.162295,
+       (GLfloat) - 0.979216, (GLfloat) - 0.120924, (GLfloat) 0.162831,
+       (GLfloat) - 0.283620, (GLfloat) - 0.936578, (GLfloat) 0.205866,
+       (GLfloat) - 0.264055, (GLfloat) - 0.947923, (GLfloat) 0.178091,
+       (GLfloat) - 0.315105, (GLfloat) - 0.946548, (GLfloat) 0.068965,
+       (GLfloat) - 0.304029, (GLfloat) - 0.949849, (GLfloat) 0.073162,
+       (GLfloat) - 0.727074, (GLfloat) - 0.675149, (GLfloat) 0.124651,
+       (GLfloat) - 0.751597, (GLfloat) - 0.644138, (GLfloat) 0.142086,
+       (GLfloat) - 0.595577, (GLfloat) - 0.717790, (GLfloat) 0.360647,
+       (GLfloat) - 0.614268, (GLfloat) - 0.686473, (GLfloat) 0.389139,
+       (GLfloat) - 0.264055, (GLfloat) - 0.947923, (GLfloat) - 0.178092,
+       (GLfloat) - 0.283620, (GLfloat) - 0.936578, (GLfloat) - 0.205866,
+       (GLfloat) - 0.595576, (GLfloat) - 0.717790, (GLfloat) - 0.360646,
+       (GLfloat) - 0.614268, (GLfloat) - 0.686473, (GLfloat) - 0.389139,
+       (GLfloat) - 0.751597, (GLfloat) - 0.644138, (GLfloat) - 0.142087,
+       (GLfloat) - 0.727074, (GLfloat) - 0.675149, (GLfloat) - 0.124651,
+       (GLfloat) - 0.304029, (GLfloat) - 0.949849, (GLfloat) - 0.073163,
+       (GLfloat) - 0.315105, (GLfloat) - 0.946548, (GLfloat) - 0.068965,
+       (GLfloat) - 0.511124, (GLfloat) - 0.173862, (GLfloat) 0.841739,
+       (GLfloat) - 0.507920, (GLfloat) - 0.180984, (GLfloat) 0.842177,
+       (GLfloat) - 0.167026, (GLfloat) - 0.217709, (GLfloat) 0.961616,
+       (GLfloat) - 0.163395, (GLfloat) - 0.208930, (GLfloat) 0.964184,
+       (GLfloat) - 0.162682, (GLfloat) - 0.257426, (GLfloat) 0.952505,
+       (GLfloat) - 0.162122, (GLfloat) - 0.255564, (GLfloat) 0.953102,
+       (GLfloat) - 0.501146, (GLfloat) - 0.246358, (GLfloat) 0.829554,
+       (GLfloat) - 0.502437, (GLfloat) - 0.243295, (GLfloat) 0.829677,
+       (GLfloat) 0.484153, (GLfloat) - 0.303994, (GLfloat) 0.820478,
+       (GLfloat) 0.489225, (GLfloat) - 0.294820, (GLfloat) 0.820816,
+       (GLfloat) 0.489881, (GLfloat) - 0.318876, (GLfloat) 0.811378,
+       (GLfloat) 0.481923, (GLfloat) - 0.335378, (GLfloat) 0.809489,
+       (GLfloat) 0.160269, (GLfloat) - 0.275036, (GLfloat) 0.947982,
+       (GLfloat) 0.153877, (GLfloat) - 0.291476, (GLfloat) 0.944120,
+       (GLfloat) 0.151647, (GLfloat) - 0.258100, (GLfloat) 0.954142,
+       (GLfloat) 0.156385, (GLfloat) - 0.248335, (GLfloat) 0.955967,
+       (GLfloat) 0.205866, (GLfloat) - 0.936578, (GLfloat) 0.283620,
+       (GLfloat) 0.178092, (GLfloat) - 0.947923, (GLfloat) 0.264055,
+       (GLfloat) 0.068965, (GLfloat) - 0.946548, (GLfloat) 0.315105,
+       (GLfloat) 0.073163, (GLfloat) - 0.949849, (GLfloat) 0.304029,
+       (GLfloat) 0.117913, (GLfloat) - 0.706722, (GLfloat) 0.697597,
+       (GLfloat) 0.138114, (GLfloat) - 0.672674, (GLfloat) 0.726935,
+       (GLfloat) 0.341480, (GLfloat) - 0.751053, (GLfloat) 0.565076,
+       (GLfloat) 0.372365, (GLfloat) - 0.719604, (GLfloat) 0.586101,
+       (GLfloat) - 0.178091, (GLfloat) - 0.947923, (GLfloat) 0.264055,
+       (GLfloat) - 0.205866, (GLfloat) - 0.936578, (GLfloat) 0.283620,
+       (GLfloat) - 0.361213, (GLfloat) - 0.721973, (GLfloat) 0.590152,
+       (GLfloat) - 0.383785, (GLfloat) - 0.697396, (GLfloat) 0.605267,
+       (GLfloat) - 0.138779, (GLfloat) - 0.668060, (GLfloat) 0.731052,
+       (GLfloat) - 0.124478, (GLfloat) - 0.692921, (GLfloat) 0.710188,
+       (GLfloat) - 0.073162, (GLfloat) - 0.949849, (GLfloat) 0.304029,
+       (GLfloat) - 0.068965, (GLfloat) - 0.946548, (GLfloat) 0.315105,
+       (GLfloat) 0.135802, (GLfloat) - 0.982944, (GLfloat) - 0.124011,
+       (GLfloat) 0.124011, (GLfloat) - 0.982944, (GLfloat) - 0.135802,
+       (GLfloat) 0.043834, (GLfloat) - 0.993006, (GLfloat) - 0.109621,
+       (GLfloat) 0.039656, (GLfloat) - 0.992607, (GLfloat) - 0.114709,
+       (GLfloat) 0.030163, (GLfloat) - 0.998998, (GLfloat) - 0.033079,
+       (GLfloat) 0.033079, (GLfloat) - 0.998998, (GLfloat) - 0.030163,
+       (GLfloat) 0.109621, (GLfloat) - 0.993006, (GLfloat) - 0.043834,
+       (GLfloat) 0.114709, (GLfloat) - 0.992607, (GLfloat) - 0.039656,
+       (GLfloat) - 0.124011, (GLfloat) - 0.982944, (GLfloat) - 0.135802,
+       (GLfloat) - 0.135802, (GLfloat) - 0.982944, (GLfloat) - 0.124011,
+       (GLfloat) - 0.109621, (GLfloat) - 0.993006, (GLfloat) - 0.043834,
+       (GLfloat) - 0.114709, (GLfloat) - 0.992607, (GLfloat) - 0.039656,
+       (GLfloat) - 0.033079, (GLfloat) - 0.998998, (GLfloat) - 0.030163,
+       (GLfloat) - 0.030163, (GLfloat) - 0.998998, (GLfloat) - 0.033079,
+       (GLfloat) - 0.043834, (GLfloat) - 0.993006, (GLfloat) - 0.109621,
+       (GLfloat) - 0.039656, (GLfloat) - 0.992607, (GLfloat) - 0.114709,
+       (GLfloat) - 0.135802, (GLfloat) - 0.982944, (GLfloat) 0.124011,
+       (GLfloat) - 0.124011, (GLfloat) - 0.982944, (GLfloat) 0.135802,
+       (GLfloat) - 0.043834, (GLfloat) - 0.993006, (GLfloat) 0.109621,
+       (GLfloat) - 0.039656, (GLfloat) - 0.992607, (GLfloat) 0.114709,
+       (GLfloat) - 0.030163, (GLfloat) - 0.998998, (GLfloat) 0.033079,
+       (GLfloat) - 0.033079, (GLfloat) - 0.998998, (GLfloat) 0.030163,
+       (GLfloat) - 0.109621, (GLfloat) - 0.993006, (GLfloat) 0.043834,
+       (GLfloat) - 0.114709, (GLfloat) - 0.992607, (GLfloat) 0.039656,
+       (GLfloat) 0.124011, (GLfloat) - 0.982944, (GLfloat) 0.135802,
+       (GLfloat) 0.135802, (GLfloat) - 0.982944, (GLfloat) 0.124011,
+       (GLfloat) 0.109621, (GLfloat) - 0.993006, (GLfloat) 0.043834,
+       (GLfloat) 0.114709, (GLfloat) - 0.992607, (GLfloat) 0.039656,
+       (GLfloat) 0.033079, (GLfloat) - 0.998998, (GLfloat) 0.030163,
+       (GLfloat) 0.030163, (GLfloat) - 0.998998, (GLfloat) 0.033079,
+       (GLfloat) 0.043834, (GLfloat) - 0.993006, (GLfloat) 0.109621,
+       (GLfloat) 0.039656, (GLfloat) - 0.992607, (GLfloat) 0.114709,
+};
+
+static unsigned short int s1_2_POLS[] =
+{
+      3, 12, 76, 74, 1, 3, 12, 74, 82, 1, 3, 22, 78, 74, 1, 3, 22, 74, 76, 1,
+      3, 78, 20, 80, 1, 3, 80, 74, 78, 1, 3, 80, 28, 82, 1, 3, 82, 74, 80, 1,
+      3, 13, 84, 77, 1, 3, 13, 77, 88, 1, 3, 84, 24, 86, 1, 3, 86, 77, 84, 1,
+      3, 86, 20, 78, 1, 3, 78, 77, 86, 1, 3, 22, 88, 77, 1, 3, 22, 77, 78, 1,
+      3, 14, 90, 85, 1, 3, 14, 85, 93, 1, 3, 26, 91, 85, 1, 3, 26, 85, 90, 1,
+      3, 20, 86, 85, 1, 3, 20, 85, 91, 1, 3, 86, 24, 93, 1, 3, 93, 85, 86, 1,
+      3, 15, 95, 79, 1, 3, 15, 79, 97, 1, 3, 95, 28, 80, 1, 3, 80, 79, 95, 1,
+      3, 20, 91, 79, 1, 3, 20, 79, 80, 1, 3, 26, 97, 79, 1, 3, 26, 79, 91, 1,
+    3, 13, 99, 83, 1, 3, 13, 83, 84, 1, 3, 99, 30, 101, 1, 3, 101, 83, 99, 1,
+   3, 23, 102, 83, 1, 3, 23, 83, 101, 1, 3, 24, 84, 83, 1, 3, 24, 83, 102, 1,
+       3, 108, 16, 104, 1, 3, 104, 100, 108, 1, 3, 32, 106, 100, 1, 3, 32, 100, 104, 1,
+       3, 106, 23, 101, 1, 3, 101, 100, 106, 1, 3, 30, 108, 100, 1, 3, 30, 100, 101, 1,
+       3, 17, 110, 105, 1, 3, 17, 105, 113, 1, 3, 110, 33, 111, 1, 3, 111, 105, 110, 1,
+       3, 23, 106, 105, 1, 3, 23, 105, 111, 1, 3, 106, 32, 113, 1, 3, 113, 105, 106, 1,
+   3, 114, 14, 93, 1, 3, 93, 92, 114, 1, 3, 24, 102, 92, 1, 3, 24, 92, 93, 1,
+  3, 23, 111, 92, 1, 3, 23, 92, 102, 1, 3, 33, 114, 92, 1, 3, 33, 92, 111, 1,
+       3, 104, 16, 116, 1, 3, 116, 103, 104, 1, 3, 35, 118, 103, 1, 3, 35, 103, 116, 1,
+       3, 118, 31, 119, 1, 3, 119, 103, 118, 1, 3, 32, 104, 103, 1, 3, 32, 103, 119, 1,
+       3, 125, 18, 121, 1, 3, 121, 117, 125, 1, 3, 36, 123, 117, 1, 3, 36, 117, 121, 1,
+       3, 123, 31, 118, 1, 3, 118, 117, 123, 1, 3, 35, 125, 117, 1, 3, 35, 117, 118, 1,
+       3, 19, 127, 122, 1, 3, 19, 122, 130, 1, 3, 37, 128, 122, 1, 3, 37, 122, 127, 1,
+       3, 128, 31, 123, 1, 3, 123, 122, 128, 1, 3, 36, 130, 122, 1, 3, 36, 122, 123, 1,
+       3, 17, 113, 112, 1, 3, 17, 112, 131, 1, 3, 32, 119, 112, 1, 3, 32, 112, 113, 1,
+       3, 119, 31, 128, 1, 3, 128, 112, 119, 1, 3, 37, 131, 112, 1, 3, 37, 112, 128, 1,
+       3, 121, 18, 133, 1, 3, 133, 120, 121, 1, 3, 39, 134, 120, 1, 3, 39, 120, 133, 1,
+       3, 134, 27, 135, 1, 3, 135, 120, 134, 1, 3, 36, 121, 120, 1, 3, 36, 120, 135, 1,
+    3, 12, 82, 81, 1, 3, 12, 81, 138, 1, 3, 28, 136, 81, 1, 3, 28, 81, 82, 1,
+3, 27, 134, 81, 1, 3, 27, 81, 136, 1, 3, 134, 39, 138, 1, 3, 138, 81, 134, 1,
+  3, 95, 15, 139, 1, 3, 139, 94, 95, 1, 3, 40, 140, 94, 1, 3, 40, 94, 139, 1,
+   3, 27, 136, 94, 1, 3, 27, 94, 140, 1, 3, 28, 95, 94, 1, 3, 28, 94, 136, 1,
+       3, 19, 130, 129, 1, 3, 19, 129, 141, 1, 3, 130, 36, 135, 1, 3, 135, 129, 130, 1,
+       3, 27, 140, 129, 1, 3, 27, 129, 135, 1, 3, 140, 40, 141, 1, 3, 141, 129, 140, 1,
+ 3, 14, 114, 89, 1, 3, 14, 89, 90, 1, 3, 114, 33, 142, 1, 3, 142, 89, 114, 1,
+  3, 25, 143, 89, 1, 3, 25, 89, 142, 1, 3, 143, 26, 90, 1, 3, 90, 89, 143, 1,
+       3, 17, 131, 109, 1, 3, 17, 109, 110, 1, 3, 131, 37, 144, 1, 3, 144, 109, 131, 1,
+       3, 25, 142, 109, 1, 3, 25, 109, 144, 1, 3, 142, 33, 110, 1, 3, 110, 109, 142, 1,
+       3, 19, 141, 126, 1, 3, 19, 126, 127, 1, 3, 141, 40, 145, 1, 3, 145, 126, 141, 1,
+       3, 25, 144, 126, 1, 3, 25, 126, 145, 1, 3, 144, 37, 127, 1, 3, 127, 126, 144, 1,
+   3, 15, 97, 96, 1, 3, 15, 96, 139, 1, 3, 97, 26, 143, 1, 3, 143, 96, 97, 1,
+3, 25, 145, 96, 1, 3, 25, 96, 143, 1, 3, 145, 40, 139, 1, 3, 139, 96, 145, 1,
+ 3, 12, 146, 75, 1, 3, 12, 75, 76, 1, 3, 146, 41, 148, 1, 3, 148, 75, 146, 1,
+  3, 21, 149, 75, 1, 3, 21, 75, 148, 1, 3, 149, 22, 76, 1, 3, 76, 75, 149, 1,
+       3, 155, 8, 151, 1, 3, 151, 147, 155, 1, 3, 43, 153, 147, 1, 3, 43, 147, 151, 1,
+       3, 153, 21, 148, 1, 3, 148, 147, 153, 1, 3, 41, 155, 147, 1, 3, 41, 147, 148, 1,
+       3, 160, 11, 157, 1, 3, 157, 152, 160, 1, 3, 44, 158, 152, 1, 3, 44, 152, 157, 1,
+       3, 158, 21, 153, 1, 3, 153, 152, 158, 1, 3, 43, 160, 152, 1, 3, 43, 152, 153, 1,
+   3, 13, 88, 87, 1, 3, 13, 87, 161, 1, 3, 88, 22, 149, 1, 3, 149, 87, 88, 1,
+3, 21, 158, 87, 1, 3, 21, 87, 149, 1, 3, 158, 44, 161, 1, 3, 161, 87, 158, 1,
+       3, 18, 162, 132, 1, 3, 18, 132, 133, 1, 3, 162, 45, 164, 1, 3, 164, 132, 162, 1,
+       3, 38, 165, 132, 1, 3, 38, 132, 164, 1, 3, 165, 39, 133, 1, 3, 133, 132, 165, 1,
+       3, 170, 9, 167, 1, 3, 167, 163, 170, 1, 3, 47, 168, 163, 1, 3, 47, 163, 167, 1,
+       3, 168, 38, 164, 1, 3, 164, 163, 168, 1, 3, 45, 170, 163, 1, 3, 45, 163, 164, 1,
+3, 8, 155, 154, 1, 3, 8, 154, 173, 1, 3, 155, 41, 171, 1, 3, 171, 154, 155, 1,
+       3, 38, 168, 154, 1, 3, 38, 154, 171, 1, 3, 168, 47, 173, 1, 3, 173, 154, 168, 1,
+       3, 146, 12, 138, 1, 3, 138, 137, 146, 1, 3, 39, 165, 137, 1, 3, 39, 137, 138, 1,
+       3, 165, 38, 171, 1, 3, 171, 137, 165, 1, 3, 41, 146, 137, 1, 3, 41, 137, 171, 1,
+       3, 16, 108, 107, 1, 3, 16, 107, 177, 1, 3, 108, 30, 174, 1, 3, 174, 107, 108, 1,
+       3, 29, 176, 107, 1, 3, 29, 107, 174, 1, 3, 176, 50, 177, 1, 3, 177, 107, 176, 1,
+  3, 99, 13, 161, 1, 3, 161, 98, 99, 1, 3, 44, 178, 98, 1, 3, 44, 98, 161, 1,
+ 3, 178, 29, 174, 1, 3, 174, 98, 178, 1, 3, 30, 99, 98, 1, 3, 30, 98, 174, 1,
+       3, 11, 180, 156, 1, 3, 11, 156, 157, 1, 3, 180, 49, 181, 1, 3, 181, 156, 180, 1,
+       3, 29, 178, 156, 1, 3, 29, 156, 181, 1, 3, 178, 44, 157, 1, 3, 157, 156, 178, 1,
+       3, 185, 10, 183, 1, 3, 183, 175, 185, 1, 3, 50, 176, 175, 1, 3, 50, 175, 183, 1,
+       3, 176, 29, 181, 1, 3, 181, 175, 176, 1, 3, 49, 185, 175, 1, 3, 49, 175, 181, 1,
+       3, 162, 18, 125, 1, 3, 125, 124, 162, 1, 3, 35, 186, 124, 1, 3, 35, 124, 125, 1,
+       3, 186, 34, 187, 1, 3, 187, 124, 186, 1, 3, 45, 162, 124, 1, 3, 45, 124, 187, 1,
+       3, 116, 16, 177, 1, 3, 177, 115, 116, 1, 3, 50, 188, 115, 1, 3, 50, 115, 177, 1,
+       3, 188, 34, 186, 1, 3, 186, 115, 188, 1, 3, 35, 116, 115, 1, 3, 35, 115, 186, 1,
+       3, 183, 10, 190, 1, 3, 190, 182, 183, 1, 3, 52, 191, 182, 1, 3, 52, 182, 190, 1,
+       3, 191, 34, 188, 1, 3, 188, 182, 191, 1, 3, 188, 50, 183, 1, 3, 183, 182, 188, 1,
+       3, 193, 9, 170, 1, 3, 170, 169, 193, 1, 3, 170, 45, 187, 1, 3, 187, 169, 170, 1,
+       3, 187, 34, 191, 1, 3, 191, 169, 187, 1, 3, 52, 193, 169, 1, 3, 52, 169, 191, 1,
+3, 1, 196, 194, 1, 3, 1, 194, 201, 1, 3, 54, 198, 194, 1, 3, 54, 194, 196, 1,
+       3, 198, 46, 199, 1, 3, 199, 194, 198, 1, 3, 199, 56, 201, 1, 3, 201, 194, 199, 1,
+3, 3, 203, 197, 1, 3, 3, 197, 206, 1, 3, 203, 55, 204, 1, 3, 204, 197, 203, 1,
+       3, 46, 198, 197, 1, 3, 46, 197, 204, 1, 3, 198, 54, 206, 1, 3, 206, 197, 198, 1,
+       3, 208, 8, 173, 1, 3, 173, 172, 208, 1, 3, 47, 207, 172, 1, 3, 47, 172, 173, 1,
+       3, 207, 46, 204, 1, 3, 204, 172, 207, 1, 3, 55, 208, 172, 1, 3, 55, 172, 204, 1,
+3, 9, 209, 166, 1, 3, 9, 166, 167, 1, 3, 56, 199, 166, 1, 3, 56, 166, 209, 1,
+       3, 46, 207, 166, 1, 3, 46, 166, 199, 1, 3, 207, 47, 167, 1, 3, 167, 166, 207, 1,
+3, 1, 201, 200, 1, 3, 1, 200, 214, 1, 3, 201, 56, 210, 1, 3, 210, 200, 201, 1,
+       3, 51, 212, 200, 1, 3, 51, 200, 210, 1, 3, 212, 59, 214, 1, 3, 214, 200, 212, 1,
+       3, 209, 9, 193, 1, 3, 193, 192, 209, 1, 3, 52, 215, 192, 1, 3, 52, 192, 193, 1,
+       3, 215, 51, 210, 1, 3, 210, 192, 215, 1, 3, 56, 209, 192, 1, 3, 56, 192, 210, 1,
+       3, 190, 10, 216, 1, 3, 216, 189, 190, 1, 3, 57, 217, 189, 1, 3, 57, 189, 216, 1,
+       3, 217, 51, 215, 1, 3, 215, 189, 217, 1, 3, 52, 190, 189, 1, 3, 52, 189, 215, 1,
+3, 0, 219, 211, 1, 3, 0, 211, 221, 1, 3, 219, 59, 212, 1, 3, 212, 211, 219, 1,
+       3, 51, 217, 211, 1, 3, 51, 211, 212, 1, 3, 217, 57, 221, 1, 3, 221, 211, 217, 1,
+3, 0, 221, 220, 1, 3, 0, 220, 226, 1, 3, 221, 57, 222, 1, 3, 222, 220, 221, 1,
+       3, 222, 48, 224, 1, 3, 224, 220, 222, 1, 3, 62, 226, 220, 1, 3, 62, 220, 224, 1,
+       3, 10, 185, 184, 1, 3, 10, 184, 216, 1, 3, 185, 49, 227, 1, 3, 227, 184, 185, 1,
+       3, 48, 222, 184, 1, 3, 48, 184, 227, 1, 3, 57, 216, 184, 1, 3, 57, 184, 222, 1,
+       3, 180, 11, 228, 1, 3, 228, 179, 180, 1, 3, 60, 229, 179, 1, 3, 60, 179, 228, 1,
+       3, 229, 48, 227, 1, 3, 227, 179, 229, 1, 3, 49, 180, 179, 1, 3, 49, 179, 227, 1,
+3, 2, 231, 223, 1, 3, 2, 223, 233, 1, 3, 231, 62, 224, 1, 3, 224, 223, 231, 1,
+       3, 48, 229, 223, 1, 3, 48, 223, 224, 1, 3, 229, 60, 233, 1, 3, 233, 223, 229, 1,
+3, 2, 233, 232, 1, 3, 2, 232, 237, 1, 3, 233, 60, 234, 1, 3, 234, 232, 233, 1,
+       3, 42, 235, 232, 1, 3, 42, 232, 234, 1, 3, 235, 64, 237, 1, 3, 237, 232, 235, 1,
+       3, 228, 11, 160, 1, 3, 160, 159, 228, 1, 3, 43, 238, 159, 1, 3, 43, 159, 160, 1,
+       3, 238, 42, 234, 1, 3, 234, 159, 238, 1, 3, 60, 228, 159, 1, 3, 60, 159, 234, 1,
+       3, 151, 8, 208, 1, 3, 208, 150, 151, 1, 3, 55, 239, 150, 1, 3, 55, 150, 208, 1,
+       3, 239, 42, 238, 1, 3, 238, 150, 239, 1, 3, 43, 151, 150, 1, 3, 43, 150, 238, 1,
+3, 3, 241, 202, 1, 3, 3, 202, 203, 1, 3, 241, 64, 235, 1, 3, 235, 202, 241, 1,
+       3, 42, 239, 202, 1, 3, 42, 202, 235, 1, 3, 239, 55, 203, 1, 3, 203, 202, 239, 1,
+       3, 245, 2, 237, 1, 3, 237, 236, 245, 1, 3, 64, 242, 236, 1, 3, 64, 236, 237, 1,
+       3, 242, 63, 244, 1, 3, 244, 236, 242, 1, 3, 68, 245, 236, 1, 3, 68, 236, 244, 1,
+       3, 241, 3, 246, 1, 3, 246, 240, 241, 1, 3, 65, 248, 240, 1, 3, 65, 240, 246, 1,
+       3, 248, 63, 242, 1, 3, 242, 240, 248, 1, 3, 64, 241, 240, 1, 3, 64, 240, 242, 1,
+3, 4, 250, 247, 1, 3, 4, 247, 253, 1, 3, 67, 251, 247, 1, 3, 67, 247, 250, 1,
+       3, 63, 248, 247, 1, 3, 63, 247, 251, 1, 3, 248, 65, 253, 1, 3, 253, 247, 248, 1,
+3, 7, 255, 243, 1, 3, 7, 243, 257, 1, 3, 255, 68, 244, 1, 3, 244, 243, 255, 1,
+       3, 63, 251, 243, 1, 3, 63, 243, 244, 1, 3, 67, 257, 243, 1, 3, 67, 243, 251, 1,
+       3, 246, 3, 206, 1, 3, 206, 205, 246, 1, 3, 54, 258, 205, 1, 3, 54, 205, 206, 1,
+       3, 258, 53, 259, 1, 3, 259, 205, 258, 1, 3, 65, 246, 205, 1, 3, 65, 205, 259, 1,
+       3, 196, 1, 260, 1, 3, 260, 195, 196, 1, 3, 69, 262, 195, 1, 3, 69, 195, 260, 1,
+       3, 53, 258, 195, 1, 3, 53, 195, 262, 1, 3, 258, 54, 196, 1, 3, 196, 195, 258, 1,
+3, 5, 264, 261, 1, 3, 5, 261, 267, 1, 3, 70, 265, 261, 1, 3, 70, 261, 264, 1,
+       3, 53, 262, 261, 1, 3, 53, 261, 265, 1, 3, 262, 69, 267, 1, 3, 267, 261, 262, 1,
+3, 4, 253, 252, 1, 3, 4, 252, 268, 1, 3, 253, 65, 259, 1, 3, 259, 252, 253, 1,
+       3, 53, 265, 252, 1, 3, 53, 252, 259, 1, 3, 70, 268, 252, 1, 3, 70, 252, 265, 1,
+       3, 260, 1, 214, 1, 3, 214, 213, 260, 1, 3, 59, 269, 213, 1, 3, 59, 213, 214, 1,
+       3, 269, 58, 270, 1, 3, 270, 213, 269, 1, 3, 69, 260, 213, 1, 3, 69, 213, 270, 1,
+       3, 219, 0, 271, 1, 3, 271, 218, 219, 1, 3, 71, 273, 218, 1, 3, 71, 218, 271, 1,
+       3, 273, 58, 269, 1, 3, 269, 218, 273, 1, 3, 59, 219, 218, 1, 3, 59, 218, 269, 1,
+3, 6, 275, 272, 1, 3, 6, 272, 278, 1, 3, 72, 276, 272, 1, 3, 72, 272, 275, 1,
+       3, 58, 273, 272, 1, 3, 58, 272, 276, 1, 3, 273, 71, 278, 1, 3, 278, 272, 273, 1,
+3, 5, 267, 266, 1, 3, 5, 266, 279, 1, 3, 267, 69, 270, 1, 3, 270, 266, 267, 1,
+       3, 58, 276, 266, 1, 3, 58, 266, 270, 1, 3, 72, 279, 266, 1, 3, 72, 266, 276, 1,
+       3, 271, 0, 226, 1, 3, 226, 225, 271, 1, 3, 226, 62, 280, 1, 3, 280, 225, 226, 1,
+       3, 61, 281, 225, 1, 3, 61, 225, 280, 1, 3, 71, 271, 225, 1, 3, 71, 225, 281, 1,
+       3, 231, 2, 245, 1, 3, 245, 230, 231, 1, 3, 68, 282, 230, 1, 3, 68, 230, 245, 1,
+       3, 282, 61, 280, 1, 3, 280, 230, 282, 1, 3, 62, 231, 230, 1, 3, 62, 230, 280, 1,
+3, 7, 283, 254, 1, 3, 7, 254, 255, 1, 3, 73, 284, 254, 1, 3, 73, 254, 283, 1,
+       3, 61, 282, 254, 1, 3, 61, 254, 284, 1, 3, 282, 68, 255, 1, 3, 255, 254, 282, 1,
+3, 6, 278, 277, 1, 3, 6, 277, 285, 1, 3, 278, 71, 281, 1, 3, 281, 277, 278, 1,
+       3, 61, 284, 277, 1, 3, 61, 277, 281, 1, 3, 73, 285, 277, 1, 3, 73, 277, 284, 1,
+3, 4, 268, 249, 1, 3, 4, 249, 250, 1, 3, 268, 70, 286, 1, 3, 286, 249, 268, 1,
+       3, 66, 287, 249, 1, 3, 66, 249, 286, 1, 3, 287, 67, 250, 1, 3, 250, 249, 287, 1,
+3, 5, 279, 263, 1, 3, 5, 263, 264, 1, 3, 279, 72, 288, 1, 3, 288, 263, 279, 1,
+       3, 66, 286, 263, 1, 3, 66, 263, 288, 1, 3, 286, 70, 264, 1, 3, 264, 263, 286, 1,
+3, 6, 285, 274, 1, 3, 6, 274, 275, 1, 3, 285, 73, 289, 1, 3, 289, 274, 285, 1,
+       3, 66, 288, 274, 1, 3, 66, 274, 289, 1, 3, 288, 72, 275, 1, 3, 275, 274, 288, 1,
+3, 7, 257, 256, 1, 3, 7, 256, 283, 1, 3, 257, 67, 287, 1, 3, 287, 256, 257, 1,
+       3, 66, 289, 256, 1, 3, 66, 256, 287, 1, 3, 289, 73, 283, 1, 3, 283, 256, 289, 1,
+
+       0
+};
+
+struct lwo  LWO_s1_2 =
+{
+       290,                    /* number of points */
+       s1_2_PNTS, s1_2_normals, s1_2_POLS, 0L
+};
+
+#endif /* USE_GL */
+
+/* End of s1_2.c */
diff --git a/hacks/glx/s1_3.c b/hacks/glx/s1_3.c
new file mode 100644 (file)
index 0000000..1e6f868
--- /dev/null
@@ -0,0 +1,1057 @@
+#if !defined( lint ) && !defined( SABER )
+static const char sccsid[] = "@(#)s1_3.c       4.04 97/07/28 xlockmore";
+
+#endif
+
+/*-
+ * Points, polygons, and normal vectors to render "s1_3" in 3D.
+ *
+ * Generated by lw2ogl.  Link this with your program but do
+ * not edit by hand.
+ */
+
+#ifndef STANDALONE
+#include "xlock.h"
+#endif
+
+#ifdef USE_GL
+
+#ifdef STANDALONE
+#include <GL/glx.h>
+#endif
+#include <GL/gl.h>
+#include "buildlwo.h"
+
+static GLfloat s1_3_PNTS[] =
+{
+       (GLfloat) 0.386176, (GLfloat) 0.201223, (GLfloat) - 0.326853,
+       (GLfloat) 0.386176, (GLfloat) 0.201223, (GLfloat) - 0.673147,
+       (GLfloat) 0.704261, (GLfloat) 0.116939, (GLfloat) - 0.326853,
+       (GLfloat) 0.704261, (GLfloat) 0.116939, (GLfloat) - 0.673147,
+       (GLfloat) 0.642426, (GLfloat) 0.035438, (GLfloat) - 0.638667,
+       (GLfloat) 0.369306, (GLfloat) 0.083596, (GLfloat) - 0.638667,
+       (GLfloat) 0.369306, (GLfloat) 0.083596, (GLfloat) - 0.361333,
+       (GLfloat) 0.642426, (GLfloat) 0.035438, (GLfloat) - 0.361333,
+       (GLfloat) 0.845007, (GLfloat) 0.268518, (GLfloat) - 0.678159,
+       (GLfloat) 0.620074, (GLfloat) 0.472355, (GLfloat) - 0.678159,
+       (GLfloat) 0.620074, (GLfloat) 0.472355, (GLfloat) - 0.321841,
+       (GLfloat) 0.845007, (GLfloat) 0.268518, (GLfloat) - 0.321841,
+       (GLfloat) 1.115671, (GLfloat) 0.352342, (GLfloat) - 0.673147,
+       (GLfloat) 1.115671, (GLfloat) 0.352342, (GLfloat) - 0.326853,
+       (GLfloat) 1.204957, (GLfloat) 0.421449, (GLfloat) - 0.361333,
+       (GLfloat) 1.204957, (GLfloat) 0.421449, (GLfloat) - 0.638667,
+       (GLfloat) 0.937575, (GLfloat) 0.636550, (GLfloat) - 0.326853,
+       (GLfloat) 1.066291, (GLfloat) 0.661627, (GLfloat) - 0.361333,
+       (GLfloat) 0.937575, (GLfloat) 0.636550, (GLfloat) - 0.673147,
+       (GLfloat) 1.066291, (GLfloat) 0.661627, (GLfloat) - 0.638667,
+       (GLfloat) 1.227578, (GLfloat) 0.320768, (GLfloat) - 0.500000,
+       (GLfloat) 1.017091, (GLfloat) 0.274757, (GLfloat) - 0.500000,
+       (GLfloat) 1.148052, (GLfloat) 0.300668, (GLfloat) - 0.500000,
+       (GLfloat) 1.107591, (GLfloat) 0.526937, (GLfloat) - 0.260702,
+       (GLfloat) 1.194861, (GLfloat) 0.375780, (GLfloat) - 0.324904,
+       (GLfloat) 1.151611, (GLfloat) 0.550768, (GLfloat) - 0.500000,
+       (GLfloat) 1.230206, (GLfloat) 0.391113, (GLfloat) - 0.500000,
+       (GLfloat) 1.107591, (GLfloat) 0.526937, (GLfloat) - 0.739298,
+       (GLfloat) 1.194861, (GLfloat) 0.375780, (GLfloat) - 0.675096,
+       (GLfloat) 0.885754, (GLfloat) 0.445570, (GLfloat) - 0.261655,
+       (GLfloat) 1.026623, (GLfloat) 0.494446, (GLfloat) - 0.263891,
+       (GLfloat) 0.987605, (GLfloat) 0.733106, (GLfloat) - 0.500000,
+       (GLfloat) 1.019270, (GLfloat) 0.677486, (GLfloat) - 0.324904,
+       (GLfloat) 1.141425, (GLfloat) 0.544887, (GLfloat) - 0.322437,
+       (GLfloat) 0.754416, (GLfloat) 0.616383, (GLfloat) - 0.500000,
+       (GLfloat) 0.905194, (GLfloat) 0.688224, (GLfloat) - 0.500000,
+       (GLfloat) 1.019270, (GLfloat) 0.677486, (GLfloat) - 0.675096,
+       (GLfloat) 1.052644, (GLfloat) 0.698661, (GLfloat) - 0.500000,
+       (GLfloat) 0.885754, (GLfloat) 0.445570, (GLfloat) - 0.738345,
+       (GLfloat) 1.026623, (GLfloat) 0.494446, (GLfloat) - 0.736109,
+       (GLfloat) 1.141425, (GLfloat) 0.544887, (GLfloat) - 0.677562,
+       (GLfloat) 0.982068, (GLfloat) 0.320307, (GLfloat) - 0.674787,
+       (GLfloat) 0.801608, (GLfloat) 0.169177, (GLfloat) - 0.500000,
+       (GLfloat) 0.885904, (GLfloat) 0.231457, (GLfloat) - 0.500000,
+       (GLfloat) 0.982068, (GLfloat) 0.320307, (GLfloat) - 0.325213,
+       (GLfloat) 0.789439, (GLfloat) 0.570833, (GLfloat) - 0.674787,
+       (GLfloat) 0.617093, (GLfloat) 0.264045, (GLfloat) - 0.738345,
+       (GLfloat) 0.732540, (GLfloat) 0.370437, (GLfloat) - 0.742944,
+       (GLfloat) 0.617093, (GLfloat) 0.264045, (GLfloat) - 0.261655,
+       (GLfloat) 0.732540, (GLfloat) 0.370437, (GLfloat) - 0.257056,
+       (GLfloat) 0.789439, (GLfloat) 0.570833, (GLfloat) - 0.325213,
+       (GLfloat) 0.432577, (GLfloat) 0.358913, (GLfloat) - 0.500000,
+       (GLfloat) 0.579177, (GLfloat) 0.509417, (GLfloat) - 0.500000,
+       (GLfloat) 0.513237, (GLfloat) 0.088956, (GLfloat) - 0.739298,
+       (GLfloat) 0.545218, (GLfloat) 0.159081, (GLfloat) - 0.736109,
+       (GLfloat) 0.752404, (GLfloat) 0.194475, (GLfloat) - 0.674787,
+       (GLfloat) 0.481782, (GLfloat) 0.333615, (GLfloat) - 0.674787,
+       (GLfloat) 0.481782, (GLfloat) 0.333615, (GLfloat) - 0.325213,
+       (GLfloat) 0.279139, (GLfloat) 0.132156, (GLfloat) - 0.500000,
+       (GLfloat) 0.328343, (GLfloat) 0.216547, (GLfloat) - 0.500000,
+       (GLfloat) 0.752404, (GLfloat) 0.194475, (GLfloat) - 0.325213,
+       (GLfloat) 0.513237, (GLfloat) 0.088956, (GLfloat) - 0.260702,
+       (GLfloat) 0.545218, (GLfloat) 0.159081, (GLfloat) - 0.263891,
+       (GLfloat) 0.747335, (GLfloat) 0.045755, (GLfloat) - 0.500000,
+       (GLfloat) 0.762094, (GLfloat) 0.101615, (GLfloat) - 0.500000,
+       (GLfloat) 0.684631, (GLfloat) 0.057942, (GLfloat) - 0.675096,
+       (GLfloat) 0.502661, (GLfloat) 0.041337, (GLfloat) - 0.500000,
+       (GLfloat) 0.679568, (GLfloat) 0.022087, (GLfloat) - 0.500000,
+       (GLfloat) 0.684631, (GLfloat) 0.057942, (GLfloat) - 0.324904,
+       (GLfloat) 0.342054, (GLfloat) 0.121167, (GLfloat) - 0.675096,
+       (GLfloat) 0.504703, (GLfloat) 0.052920, (GLfloat) - 0.677562,
+       (GLfloat) 0.342054, (GLfloat) 0.121167, (GLfloat) - 0.324904,
+       (GLfloat) 0.329838, (GLfloat) 0.083754, (GLfloat) - 0.500000,
+       (GLfloat) 0.504703, (GLfloat) 0.052920, (GLfloat) - 0.322437,
+       (GLfloat) 1.188046, (GLfloat) 0.322006, (GLfloat) - 0.596277,
+       (GLfloat) 1.077742, (GLfloat) 0.301825, (GLfloat) - 0.594388,
+       (GLfloat) 1.139957, (GLfloat) 0.313586, (GLfloat) - 0.594444,
+       (GLfloat) 1.188046, (GLfloat) 0.322006, (GLfloat) - 0.403722,
+       (GLfloat) 1.196159, (GLfloat) 0.308395, (GLfloat) - 0.500000,
+       (GLfloat) 1.230706, (GLfloat) 0.358565, (GLfloat) - 0.587500,
+       (GLfloat) 1.219224, (GLfloat) 0.334520, (GLfloat) - 0.595444,
+       (GLfloat) 1.123141, (GLfloat) 0.430895, (GLfloat) - 0.724648,
+       (GLfloat) 1.163707, (GLfloat) 0.362839, (GLfloat) - 0.676509,
+       (GLfloat) 1.123141, (GLfloat) 0.430895, (GLfloat) - 0.275352,
+       (GLfloat) 1.163707, (GLfloat) 0.362839, (GLfloat) - 0.323491,
+       (GLfloat) 1.230706, (GLfloat) 0.358565, (GLfloat) - 0.412500,
+       (GLfloat) 1.219224, (GLfloat) 0.334520, (GLfloat) - 0.404556,
+       (GLfloat) 1.077742, (GLfloat) 0.301825, (GLfloat) - 0.405612,
+       (GLfloat) 1.139957, (GLfloat) 0.313586, (GLfloat) - 0.405556,
+       (GLfloat) 1.191900, (GLfloat) 0.469528, (GLfloat) - 0.409500,
+       (GLfloat) 1.221821, (GLfloat) 0.401211, (GLfloat) - 0.417500,
+       (GLfloat) 1.239508, (GLfloat) 0.345749, (GLfloat) - 0.500000,
+       (GLfloat) 1.171456, (GLfloat) 0.461189, (GLfloat) - 0.294000,
+       (GLfloat) 1.207091, (GLfloat) 0.397037, (GLfloat) - 0.339125,
+       (GLfloat) 1.171456, (GLfloat) 0.461189, (GLfloat) - 0.706000,
+       (GLfloat) 1.207091, (GLfloat) 0.397037, (GLfloat) - 0.660875,
+       (GLfloat) 1.191900, (GLfloat) 0.469528, (GLfloat) - 0.590500,
+       (GLfloat) 1.221821, (GLfloat) 0.401211, (GLfloat) - 0.582500,
+       (GLfloat) 1.011218, (GLfloat) 0.399402, (GLfloat) - 0.279763,
+       (GLfloat) 1.075195, (GLfloat) 0.416935, (GLfloat) - 0.279631,
+       (GLfloat) 1.025784, (GLfloat) 0.594229, (GLfloat) - 0.275352,
+       (GLfloat) 1.074463, (GLfloat) 0.512562, (GLfloat) - 0.259306,
+       (GLfloat) 1.155185, (GLfloat) 0.444556, (GLfloat) - 0.276838,
+       (GLfloat) 0.960879, (GLfloat) 0.703118, (GLfloat) - 0.403722,
+       (GLfloat) 0.985218, (GLfloat) 0.662285, (GLfloat) - 0.323491,
+       (GLfloat) 1.083956, (GLfloat) 0.612743, (GLfloat) - 0.294000,
+       (GLfloat) 1.059471, (GLfloat) 0.609015, (GLfloat) - 0.276838,
+       (GLfloat) 0.911431, (GLfloat) 0.545768, (GLfloat) - 0.279763,
+       (GLfloat) 0.978052, (GLfloat) 0.571957, (GLfloat) - 0.279631,
+       (GLfloat) 1.101400, (GLfloat) 0.626279, (GLfloat) - 0.409500,
+       (GLfloat) 1.098258, (GLfloat) 0.615227, (GLfloat) - 0.335375,
+       (GLfloat) 1.128758, (GLfloat) 0.537574, (GLfloat) - 0.278500,
+       (GLfloat) 1.024706, (GLfloat) 0.715367, (GLfloat) - 0.412500,
+       (GLfloat) 1.046216, (GLfloat) 0.675680, (GLfloat) - 0.339125,
+       (GLfloat) 1.180758, (GLfloat) 0.472333, (GLfloat) - 0.335375,
+       (GLfloat) 0.844907, (GLfloat) 0.643346, (GLfloat) - 0.405612,
+       (GLfloat) 0.913289, (GLfloat) 0.675305, (GLfloat) - 0.405556,
+       (GLfloat) 0.960879, (GLfloat) 0.703118, (GLfloat) - 0.596277,
+       (GLfloat) 0.952766, (GLfloat) 0.716730, (GLfloat) - 0.500000,
+       (GLfloat) 0.995432, (GLfloat) 0.719051, (GLfloat) - 0.404556,
+       (GLfloat) 1.025784, (GLfloat) 0.594229, (GLfloat) - 0.724648,
+       (GLfloat) 0.985218, (GLfloat) 0.662285, (GLfloat) - 0.676509,
+       (GLfloat) 1.024706, (GLfloat) 0.715367, (GLfloat) - 0.587500,
+       (GLfloat) 0.995432, (GLfloat) 0.719051, (GLfloat) - 0.595444,
+       (GLfloat) 0.844907, (GLfloat) 0.643346, (GLfloat) - 0.594388,
+       (GLfloat) 0.913289, (GLfloat) 0.675305, (GLfloat) - 0.594444,
+       (GLfloat) 1.101400, (GLfloat) 0.626279, (GLfloat) - 0.590500,
+       (GLfloat) 1.057196, (GLfloat) 0.686350, (GLfloat) - 0.582500,
+       (GLfloat) 1.018008, (GLfloat) 0.729398, (GLfloat) - 0.500000,
+       (GLfloat) 1.083956, (GLfloat) 0.612743, (GLfloat) - 0.706000,
+       (GLfloat) 1.046216, (GLfloat) 0.675680, (GLfloat) - 0.660875,
+       (GLfloat) 1.057196, (GLfloat) 0.686350, (GLfloat) - 0.417500,
+       (GLfloat) 0.911431, (GLfloat) 0.545768, (GLfloat) - 0.720237,
+       (GLfloat) 0.978052, (GLfloat) 0.571957, (GLfloat) - 0.720369,
+       (GLfloat) 1.074463, (GLfloat) 0.512562, (GLfloat) - 0.740694,
+       (GLfloat) 1.059471, (GLfloat) 0.609015, (GLfloat) - 0.723162,
+       (GLfloat) 1.155185, (GLfloat) 0.444556, (GLfloat) - 0.723162,
+       (GLfloat) 1.011218, (GLfloat) 0.399402, (GLfloat) - 0.720237,
+       (GLfloat) 1.075195, (GLfloat) 0.416935, (GLfloat) - 0.720369,
+       (GLfloat) 1.180758, (GLfloat) 0.472333, (GLfloat) - 0.664625,
+       (GLfloat) 1.128758, (GLfloat) 0.537574, (GLfloat) - 0.721500,
+       (GLfloat) 1.098258, (GLfloat) 0.615227, (GLfloat) - 0.664625,
+       (GLfloat) 1.149055, (GLfloat) 0.549292, (GLfloat) - 0.402250,
+       (GLfloat) 1.197930, (GLfloat) 0.464638, (GLfloat) - 0.500000,
+       (GLfloat) 1.100180, (GLfloat) 0.633946, (GLfloat) - 0.500000,
+       (GLfloat) 1.149055, (GLfloat) 0.549292, (GLfloat) - 0.597750,
+       (GLfloat) 1.052796, (GLfloat) 0.338416, (GLfloat) - 0.673044,
+       (GLfloat) 0.938670, (GLfloat) 0.265970, (GLfloat) - 0.596525,
+       (GLfloat) 1.008335, (GLfloat) 0.286145, (GLfloat) - 0.595338,
+       (GLfloat) 1.086058, (GLfloat) 0.289628, (GLfloat) - 0.500000,
+       (GLfloat) 0.826297, (GLfloat) 0.209826, (GLfloat) - 0.596525,
+       (GLfloat) 0.875679, (GLfloat) 0.240722, (GLfloat) - 0.597178,
+       (GLfloat) 0.938670, (GLfloat) 0.265970, (GLfloat) - 0.403475,
+       (GLfloat) 0.948068, (GLfloat) 0.255539, (GLfloat) - 0.500000,
+       (GLfloat) 0.863485, (GLfloat) 0.349410, (GLfloat) - 0.725225,
+       (GLfloat) 0.910476, (GLfloat) 0.297260, (GLfloat) - 0.676962,
+       (GLfloat) 0.863485, (GLfloat) 0.349410, (GLfloat) - 0.274775,
+       (GLfloat) 0.910476, (GLfloat) 0.297260, (GLfloat) - 0.323037,
+       (GLfloat) 1.008335, (GLfloat) 0.286145, (GLfloat) - 0.404662,
+       (GLfloat) 0.826297, (GLfloat) 0.209826, (GLfloat) - 0.403475,
+       (GLfloat) 0.875679, (GLfloat) 0.240722, (GLfloat) - 0.402822,
+       (GLfloat) 1.052796, (GLfloat) 0.338416, (GLfloat) - 0.326956,
+       (GLfloat) 0.869854, (GLfloat) 0.606754, (GLfloat) - 0.673044,
+       (GLfloat) 0.750708, (GLfloat) 0.474572, (GLfloat) - 0.725225,
+       (GLfloat) 0.833218, (GLfloat) 0.513896, (GLfloat) - 0.722456,
+       (GLfloat) 0.961325, (GLfloat) 0.472585, (GLfloat) - 0.735969,
+       (GLfloat) 0.601974, (GLfloat) 0.366500, (GLfloat) - 0.725225,
+       (GLfloat) 0.671195, (GLfloat) 0.426029, (GLfloat) - 0.726748,
+       (GLfloat) 0.807096, (GLfloat) 0.411991, (GLfloat) - 0.741313,
+       (GLfloat) 0.675523, (GLfloat) 0.558012, (GLfloat) - 0.596525,
+       (GLfloat) 0.703717, (GLfloat) 0.526722, (GLfloat) - 0.676962,
+       (GLfloat) 0.938289, (GLfloat) 0.377245, (GLfloat) - 0.722456,
+       (GLfloat) 0.736568, (GLfloat) 0.272496, (GLfloat) - 0.725225,
+       (GLfloat) 0.793886, (GLfloat) 0.314845, (GLfloat) - 0.726748,
+       (GLfloat) 0.961325, (GLfloat) 0.472585, (GLfloat) - 0.264031,
+       (GLfloat) 0.750708, (GLfloat) 0.474572, (GLfloat) - 0.274775,
+       (GLfloat) 0.833218, (GLfloat) 0.513896, (GLfloat) - 0.277544,
+       (GLfloat) 0.869854, (GLfloat) 0.606754, (GLfloat) - 0.326956,
+       (GLfloat) 0.938289, (GLfloat) 0.377245, (GLfloat) - 0.277544,
+       (GLfloat) 0.736568, (GLfloat) 0.272496, (GLfloat) - 0.274775,
+       (GLfloat) 0.793886, (GLfloat) 0.314845, (GLfloat) - 0.273252,
+       (GLfloat) 0.807096, (GLfloat) 0.411991, (GLfloat) - 0.258687,
+       (GLfloat) 0.675523, (GLfloat) 0.558012, (GLfloat) - 0.403475,
+       (GLfloat) 0.703717, (GLfloat) 0.526722, (GLfloat) - 0.323037,
+       (GLfloat) 0.601974, (GLfloat) 0.366500, (GLfloat) - 0.274775,
+       (GLfloat) 0.671195, (GLfloat) 0.426029, (GLfloat) - 0.273252,
+       (GLfloat) 0.836591, (GLfloat) 0.655543, (GLfloat) - 0.500000,
+       (GLfloat) 0.763171, (GLfloat) 0.604996, (GLfloat) - 0.595338,
+       (GLfloat) 0.763171, (GLfloat) 0.604996, (GLfloat) - 0.404662,
+       (GLfloat) 0.512245, (GLfloat) 0.429169, (GLfloat) - 0.403475,
+       (GLfloat) 0.589401, (GLfloat) 0.500151, (GLfloat) - 0.402822,
+       (GLfloat) 0.666125, (GLfloat) 0.568442, (GLfloat) - 0.500000,
+       (GLfloat) 0.512245, (GLfloat) 0.429169, (GLfloat) - 0.596525,
+       (GLfloat) 0.589401, (GLfloat) 0.500151, (GLfloat) - 0.597178,
+       (GLfloat) 0.495371, (GLfloat) 0.238512, (GLfloat) - 0.720237,
+       (GLfloat) 0.432817, (GLfloat) 0.138665, (GLfloat) - 0.724648,
+       (GLfloat) 0.458468, (GLfloat) 0.182068, (GLfloat) - 0.720369,
+       (GLfloat) 0.656244, (GLfloat) 0.179386, (GLfloat) - 0.720237,
+       (GLfloat) 0.575807, (GLfloat) 0.208949, (GLfloat) - 0.735969,
+       (GLfloat) 0.543287, (GLfloat) 0.301992, (GLfloat) - 0.722456,
+       (GLfloat) 0.388123, (GLfloat) 0.277930, (GLfloat) - 0.594388,
+       (GLfloat) 0.428341, (GLfloat) 0.263148, (GLfloat) - 0.673044,
+       (GLfloat) 0.763492, (GLfloat) 0.139968, (GLfloat) - 0.594388,
+       (GLfloat) 0.723274, (GLfloat) 0.154750, (GLfloat) - 0.673044,
+       (GLfloat) 0.690899, (GLfloat) 0.226098, (GLfloat) - 0.722456,
+       (GLfloat) 0.617440, (GLfloat) 0.099959, (GLfloat) - 0.724648,
+       (GLfloat) 0.631969, (GLfloat) 0.136095, (GLfloat) - 0.720369,
+       (GLfloat) 0.669271, (GLfloat) 0.319498, (GLfloat) - 0.741313,
+       (GLfloat) 0.792649, (GLfloat) 0.233327, (GLfloat) - 0.676962,
+       (GLfloat) 0.545894, (GLfloat) 0.405668, (GLfloat) - 0.676962,
+       (GLfloat) 0.444878, (GLfloat) 0.352588, (GLfloat) - 0.595338,
+       (GLfloat) 0.388123, (GLfloat) 0.277930, (GLfloat) - 0.405612,
+       (GLfloat) 0.374717, (GLfloat) 0.282857, (GLfloat) - 0.500000,
+       (GLfloat) 0.309735, (GLfloat) 0.164469, (GLfloat) - 0.596277,
+       (GLfloat) 0.342801, (GLfloat) 0.212716, (GLfloat) - 0.594444,
+       (GLfloat) 0.501029, (GLfloat) 0.437003, (GLfloat) - 0.500000,
+       (GLfloat) 0.545894, (GLfloat) 0.405668, (GLfloat) - 0.323037,
+       (GLfloat) 0.444878, (GLfloat) 0.352588, (GLfloat) - 0.404662,
+       (GLfloat) 0.309735, (GLfloat) 0.164469, (GLfloat) - 0.403722,
+       (GLfloat) 0.342801, (GLfloat) 0.212716, (GLfloat) - 0.405556,
+       (GLfloat) 0.495371, (GLfloat) 0.238512, (GLfloat) - 0.279763,
+       (GLfloat) 0.428341, (GLfloat) 0.263148, (GLfloat) - 0.326956,
+       (GLfloat) 0.543287, (GLfloat) 0.301992, (GLfloat) - 0.277544,
+       (GLfloat) 0.656244, (GLfloat) 0.179386, (GLfloat) - 0.279763,
+       (GLfloat) 0.575807, (GLfloat) 0.208949, (GLfloat) - 0.264031,
+       (GLfloat) 0.432817, (GLfloat) 0.138665, (GLfloat) - 0.275352,
+       (GLfloat) 0.458468, (GLfloat) 0.182068, (GLfloat) - 0.279631,
+       (GLfloat) 0.669271, (GLfloat) 0.319498, (GLfloat) - 0.258687,
+       (GLfloat) 0.792649, (GLfloat) 0.233327, (GLfloat) - 0.323037,
+       (GLfloat) 0.690899, (GLfloat) 0.226098, (GLfloat) - 0.277544,
+       (GLfloat) 0.617440, (GLfloat) 0.099959, (GLfloat) - 0.275352,
+       (GLfloat) 0.631969, (GLfloat) 0.136095, (GLfloat) - 0.279631,
+       (GLfloat) 0.763492, (GLfloat) 0.139968, (GLfloat) - 0.405612,
+       (GLfloat) 0.723274, (GLfloat) 0.154750, (GLfloat) - 0.326956,
+       (GLfloat) 0.789307, (GLfloat) 0.175501, (GLfloat) - 0.404662,
+       (GLfloat) 0.776898, (GLfloat) 0.135041, (GLfloat) - 0.500000,
+       (GLfloat) 0.740522, (GLfloat) 0.074155, (GLfloat) - 0.403722,
+       (GLfloat) 0.747636, (GLfloat) 0.105446, (GLfloat) - 0.405556,
+       (GLfloat) 0.837513, (GLfloat) 0.201992, (GLfloat) - 0.500000,
+       (GLfloat) 0.789307, (GLfloat) 0.175501, (GLfloat) - 0.595338,
+       (GLfloat) 0.740522, (GLfloat) 0.074155, (GLfloat) - 0.596277,
+       (GLfloat) 0.747636, (GLfloat) 0.105446, (GLfloat) - 0.594444,
+       (GLfloat) 0.755907, (GLfloat) 0.070930, (GLfloat) - 0.500000,
+       (GLfloat) 0.710325, (GLfloat) 0.032750, (GLfloat) - 0.412500,
+       (GLfloat) 0.731601, (GLfloat) 0.048967, (GLfloat) - 0.404556,
+       (GLfloat) 0.694366, (GLfloat) 0.083832, (GLfloat) - 0.323491,
+       (GLfloat) 0.694366, (GLfloat) 0.083832, (GLfloat) - 0.676509,
+       (GLfloat) 0.710325, (GLfloat) 0.032750, (GLfloat) - 0.587500,
+       (GLfloat) 0.731601, (GLfloat) 0.048967, (GLfloat) - 0.595444,
+       (GLfloat) 0.592781, (GLfloat) 0.031264, (GLfloat) - 0.590500,
+       (GLfloat) 0.667212, (GLfloat) 0.026513, (GLfloat) - 0.582500,
+       (GLfloat) 0.725378, (GLfloat) 0.028862, (GLfloat) - 0.500000,
+       (GLfloat) 0.593625, (GLfloat) 0.053327, (GLfloat) - 0.706000,
+       (GLfloat) 0.666096, (GLfloat) 0.041783, (GLfloat) - 0.660875,
+       (GLfloat) 0.593625, (GLfloat) 0.053327, (GLfloat) - 0.294000,
+       (GLfloat) 0.666096, (GLfloat) 0.041783, (GLfloat) - 0.339125,
+       (GLfloat) 0.592781, (GLfloat) 0.031264, (GLfloat) - 0.409500,
+       (GLfloat) 0.667212, (GLfloat) 0.026513, (GLfloat) - 0.417500,
+       (GLfloat) 0.525128, (GLfloat) 0.119312, (GLfloat) - 0.740694,
+       (GLfloat) 0.606658, (GLfloat) 0.072023, (GLfloat) - 0.723162,
+       (GLfloat) 0.355891, (GLfloat) 0.154793, (GLfloat) - 0.676509,
+       (GLfloat) 0.421284, (GLfloat) 0.083716, (GLfloat) - 0.706000,
+       (GLfloat) 0.419921, (GLfloat) 0.106487, (GLfloat) - 0.723162,
+       (GLfloat) 0.414531, (GLfloat) 0.062694, (GLfloat) - 0.590500,
+       (GLfloat) 0.423841, (GLfloat) 0.069426, (GLfloat) - 0.664625,
+       (GLfloat) 0.507243, (GLfloat) 0.067325, (GLfloat) - 0.721500,
+       (GLfloat) 0.304584, (GLfloat) 0.104293, (GLfloat) - 0.587500,
+       (GLfloat) 0.349234, (GLfloat) 0.097654, (GLfloat) - 0.660875,
+       (GLfloat) 0.586334, (GLfloat) 0.040774, (GLfloat) - 0.664625,
+       (GLfloat) 0.294350, (GLfloat) 0.167695, (GLfloat) - 0.500000,
+       (GLfloat) 0.294978, (GLfloat) 0.129544, (GLfloat) - 0.595444,
+       (GLfloat) 0.355891, (GLfloat) 0.154793, (GLfloat) - 0.323491,
+       (GLfloat) 0.304584, (GLfloat) 0.104293, (GLfloat) - 0.412500,
+       (GLfloat) 0.294978, (GLfloat) 0.129544, (GLfloat) - 0.404556,
+       (GLfloat) 0.414531, (GLfloat) 0.062694, (GLfloat) - 0.409500,
+       (GLfloat) 0.342964, (GLfloat) 0.083687, (GLfloat) - 0.417500,
+       (GLfloat) 0.289108, (GLfloat) 0.105788, (GLfloat) - 0.500000,
+       (GLfloat) 0.421284, (GLfloat) 0.083716, (GLfloat) - 0.294000,
+       (GLfloat) 0.349234, (GLfloat) 0.097654, (GLfloat) - 0.339125,
+       (GLfloat) 0.342964, (GLfloat) 0.083687, (GLfloat) - 0.582500,
+       (GLfloat) 0.525128, (GLfloat) 0.119312, (GLfloat) - 0.259306,
+       (GLfloat) 0.419921, (GLfloat) 0.106487, (GLfloat) - 0.276838,
+       (GLfloat) 0.606658, (GLfloat) 0.072023, (GLfloat) - 0.276838,
+       (GLfloat) 0.586334, (GLfloat) 0.040774, (GLfloat) - 0.335375,
+       (GLfloat) 0.507243, (GLfloat) 0.067325, (GLfloat) - 0.278500,
+       (GLfloat) 0.423841, (GLfloat) 0.069426, (GLfloat) - 0.335375,
+       (GLfloat) 0.503173, (GLfloat) 0.044243, (GLfloat) - 0.597750,
+       (GLfloat) 0.599438, (GLfloat) 0.027269, (GLfloat) - 0.500000,
+       (GLfloat) 0.406908, (GLfloat) 0.061217, (GLfloat) - 0.500000,
+       (GLfloat) 0.503173, (GLfloat) 0.044243, (GLfloat) - 0.402250,
+};
+
+static GLfloat s1_3_normals[] =
+{
+       (GLfloat) 0.156072, (GLfloat) - 0.866199, (GLfloat) - 0.474700,
+       (GLfloat) 0.133323, (GLfloat) - 0.866325, (GLfloat) - 0.481359,
+       (GLfloat) 0.156764, (GLfloat) - 0.975995, (GLfloat) - 0.151191,
+       (GLfloat) 0.165110, (GLfloat) - 0.975177, (GLfloat) - 0.147543,
+       (GLfloat) 0.361485, (GLfloat) - 0.917862, (GLfloat) - 0.163883,
+       (GLfloat) 0.371348, (GLfloat) - 0.914502, (GLfloat) - 0.160580,
+       (GLfloat) 0.350149, (GLfloat) - 0.787582, (GLfloat) - 0.507060,
+       (GLfloat) 0.331724, (GLfloat) - 0.792390, (GLfloat) - 0.511934,
+       (GLfloat) 0.156072, (GLfloat) - 0.866199, (GLfloat) 0.474700,
+       (GLfloat) 0.133323, (GLfloat) - 0.866325, (GLfloat) 0.481359,
+       (GLfloat) 0.331724, (GLfloat) - 0.792390, (GLfloat) 0.511934,
+       (GLfloat) 0.350149, (GLfloat) - 0.787582, (GLfloat) 0.507061,
+       (GLfloat) 0.361485, (GLfloat) - 0.917862, (GLfloat) 0.163883,
+       (GLfloat) 0.371348, (GLfloat) - 0.914502, (GLfloat) 0.160580,
+       (GLfloat) 0.165110, (GLfloat) - 0.975177, (GLfloat) 0.147543,
+       (GLfloat) 0.156764, (GLfloat) - 0.975995, (GLfloat) 0.151191,
+       (GLfloat) 0.952910, (GLfloat) 0.222669, (GLfloat) 0.205865,
+       (GLfloat) 0.952953, (GLfloat) 0.245285, (GLfloat) 0.178091,
+       (GLfloat) 0.977287, (GLfloat) 0.200386, (GLfloat) 0.068964,
+       (GLfloat) 0.974607, (GLfloat) 0.211631, (GLfloat) 0.073163,
+       (GLfloat) 0.910741, (GLfloat) - 0.389976, (GLfloat) 0.135901,
+       (GLfloat) 0.891878, (GLfloat) - 0.425931, (GLfloat) 0.152106,
+       (GLfloat) 0.882467, (GLfloat) - 0.235214, (GLfloat) 0.407340,
+       (GLfloat) 0.868268, (GLfloat) - 0.279083, (GLfloat) 0.410151,
+       (GLfloat) 0.952953, (GLfloat) 0.245285, (GLfloat) - 0.178091,
+       (GLfloat) 0.952910, (GLfloat) 0.222669, (GLfloat) - 0.205865,
+       (GLfloat) 0.868268, (GLfloat) - 0.279083, (GLfloat) - 0.410151,
+       (GLfloat) 0.882468, (GLfloat) - 0.235213, (GLfloat) - 0.407340,
+       (GLfloat) 0.891878, (GLfloat) - 0.425931, (GLfloat) - 0.152106,
+       (GLfloat) 0.910741, (GLfloat) - 0.389976, (GLfloat) - 0.135901,
+       (GLfloat) 0.974607, (GLfloat) 0.211631, (GLfloat) - 0.073163,
+       (GLfloat) 0.977287, (GLfloat) 0.200386, (GLfloat) - 0.068964,
+       (GLfloat) 0.086707, (GLfloat) - 0.551974, (GLfloat) 0.829341,
+       (GLfloat) 0.062265, (GLfloat) - 0.551355, (GLfloat) 0.831944,
+       (GLfloat) - 0.014960, (GLfloat) - 0.207986, (GLfloat) 0.978017,
+       (GLfloat) - 0.026687, (GLfloat) - 0.208021, (GLfloat) 0.977760,
+       (GLfloat) 0.102710, (GLfloat) - 0.133733, (GLfloat) 0.985681,
+       (GLfloat) 0.099775, (GLfloat) - 0.134244, (GLfloat) 0.985913,
+       (GLfloat) 0.231521, (GLfloat) - 0.464011, (GLfloat) 0.855039,
+       (GLfloat) 0.236951, (GLfloat) - 0.462930, (GLfloat) 0.854137,
+       (GLfloat) - 0.295570, (GLfloat) 0.436154, (GLfloat) 0.849946,
+       (GLfloat) - 0.280583, (GLfloat) 0.437172, (GLfloat) 0.854490,
+       (GLfloat) - 0.178752, (GLfloat) 0.492834, (GLfloat) 0.851565,
+       (GLfloat) - 0.184330, (GLfloat) 0.491982, (GLfloat) 0.850868,
+       (GLfloat) - 0.033888, (GLfloat) 0.173633, (GLfloat) 0.984227,
+       (GLfloat) - 0.032872, (GLfloat) 0.173792, (GLfloat) 0.984234,
+       (GLfloat) - 0.140362, (GLfloat) 0.111822, (GLfloat) 0.983765,
+       (GLfloat) - 0.136701, (GLfloat) 0.111911, (GLfloat) 0.984271,
+       (GLfloat) 0.725871, (GLfloat) 0.640449, (GLfloat) 0.250870,
+       (GLfloat) 0.717328, (GLfloat) 0.635281, (GLfloat) 0.286109,
+       (GLfloat) 0.785252, (GLfloat) 0.532999, (GLfloat) 0.315105,
+       (GLfloat) 0.786013, (GLfloat) 0.538285, (GLfloat) 0.304028,
+       (GLfloat) 0.473766, (GLfloat) 0.428968, (GLfloat) 0.769111,
+       (GLfloat) 0.445991, (GLfloat) 0.427917, (GLfloat) 0.786117,
+       (GLfloat) 0.380921, (GLfloat) 0.670539, (GLfloat) 0.636613,
+       (GLfloat) 0.351469, (GLfloat) 0.675507, (GLfloat) 0.648198,
+       (GLfloat) 0.909972, (GLfloat) 0.319731, (GLfloat) 0.264053,
+       (GLfloat) 0.914034, (GLfloat) 0.290005, (GLfloat) 0.283618,
+       (GLfloat) 0.764793, (GLfloat) - 0.009035, (GLfloat) 0.644213,
+       (GLfloat) 0.748359, (GLfloat) - 0.049564, (GLfloat) 0.661439,
+       (GLfloat) 0.584615, (GLfloat) 0.165625, (GLfloat) 0.794225,
+       (GLfloat) 0.606922, (GLfloat) 0.199970, (GLfloat) 0.769193,
+       (GLfloat) 0.856780, (GLfloat) 0.408314, (GLfloat) 0.314973,
+       (GLfloat) 0.856353, (GLfloat) 0.416833, (GLfloat) 0.304811,
+       (GLfloat) - 0.450621, (GLfloat) 0.737913, (GLfloat) 0.502419,
+       (GLfloat) - 0.436449, (GLfloat) 0.741403, (GLfloat) 0.509739,
+       (GLfloat) - 0.507433, (GLfloat) 0.846833, (GLfloat) 0.159329,
+       (GLfloat) - 0.502539, (GLfloat) 0.849165, (GLfloat) 0.162398,
+       (GLfloat) - 0.409636, (GLfloat) 0.897074, (GLfloat) 0.165699,
+       (GLfloat) - 0.419809, (GLfloat) 0.893103, (GLfloat) 0.161638,
+       (GLfloat) - 0.332199, (GLfloat) 0.791771, (GLfloat) 0.512584,
+       (GLfloat) - 0.350779, (GLfloat) 0.787278, (GLfloat) 0.507097,
+       (GLfloat) - 0.436449, (GLfloat) 0.741403, (GLfloat) - 0.509738,
+       (GLfloat) - 0.450621, (GLfloat) 0.737913, (GLfloat) - 0.502419,
+       (GLfloat) - 0.332198, (GLfloat) 0.791771, (GLfloat) - 0.512584,
+       (GLfloat) - 0.350779, (GLfloat) 0.787278, (GLfloat) - 0.507097,
+       (GLfloat) - 0.419809, (GLfloat) 0.893103, (GLfloat) - 0.161638,
+       (GLfloat) - 0.409636, (GLfloat) 0.897074, (GLfloat) - 0.165699,
+       (GLfloat) - 0.507433, (GLfloat) 0.846833, (GLfloat) - 0.159329,
+       (GLfloat) - 0.502539, (GLfloat) 0.849165, (GLfloat) - 0.162398,
+       (GLfloat) 0.669290, (GLfloat) 0.713912, (GLfloat) - 0.205866,
+       (GLfloat) 0.688897, (GLfloat) 0.702641, (GLfloat) - 0.178093,
+       (GLfloat) 0.661903, (GLfloat) 0.745850, (GLfloat) - 0.074780,
+       (GLfloat) 0.670351, (GLfloat) 0.738996, (GLfloat) - 0.067190,
+       (GLfloat) 0.158706, (GLfloat) 0.978584, (GLfloat) - 0.131091,
+       (GLfloat) 0.119709, (GLfloat) 0.981678, (GLfloat) - 0.148253,
+       (GLfloat) 0.261869, (GLfloat) 0.885538, (GLfloat) - 0.383728,
+       (GLfloat) 0.223051, (GLfloat) 0.883291, (GLfloat) - 0.412366,
+       (GLfloat) 0.688897, (GLfloat) 0.702640, (GLfloat) 0.178092,
+       (GLfloat) 0.669290, (GLfloat) 0.713912, (GLfloat) 0.205867,
+       (GLfloat) 0.261868, (GLfloat) 0.885538, (GLfloat) 0.383728,
+       (GLfloat) 0.223050, (GLfloat) 0.883291, (GLfloat) 0.412366,
+       (GLfloat) 0.119709, (GLfloat) 0.981678, (GLfloat) 0.148253,
+       (GLfloat) 0.158706, (GLfloat) 0.978584, (GLfloat) 0.131091,
+       (GLfloat) 0.661903, (GLfloat) 0.745850, (GLfloat) 0.074780,
+       (GLfloat) 0.670351, (GLfloat) 0.738996, (GLfloat) 0.067190,
+       (GLfloat) - 0.295570, (GLfloat) 0.436154, (GLfloat) - 0.849946,
+       (GLfloat) - 0.280583, (GLfloat) 0.437172, (GLfloat) - 0.854490,
+       (GLfloat) - 0.136701, (GLfloat) 0.111911, (GLfloat) - 0.984271,
+       (GLfloat) - 0.140362, (GLfloat) 0.111822, (GLfloat) - 0.983765,
+       (GLfloat) - 0.033889, (GLfloat) 0.173633, (GLfloat) - 0.984227,
+       (GLfloat) - 0.032872, (GLfloat) 0.173792, (GLfloat) - 0.984234,
+       (GLfloat) - 0.184329, (GLfloat) 0.491983, (GLfloat) - 0.850868,
+       (GLfloat) - 0.178752, (GLfloat) 0.492834, (GLfloat) - 0.851565,
+       (GLfloat) 0.062265, (GLfloat) - 0.551355, (GLfloat) - 0.831944,
+       (GLfloat) 0.086707, (GLfloat) - 0.551973, (GLfloat) - 0.829342,
+       (GLfloat) 0.231522, (GLfloat) - 0.464010, (GLfloat) - 0.855039,
+       (GLfloat) 0.236951, (GLfloat) - 0.462929, (GLfloat) - 0.854137,
+       (GLfloat) 0.099774, (GLfloat) - 0.134244, (GLfloat) - 0.985913,
+       (GLfloat) 0.102710, (GLfloat) - 0.133733, (GLfloat) - 0.985681,
+       (GLfloat) - 0.014960, (GLfloat) - 0.207986, (GLfloat) - 0.978017,
+       (GLfloat) - 0.026687, (GLfloat) - 0.208021, (GLfloat) - 0.977760,
+       (GLfloat) 0.914034, (GLfloat) 0.290005, (GLfloat) - 0.283618,
+       (GLfloat) 0.909972, (GLfloat) 0.319730, (GLfloat) - 0.264054,
+       (GLfloat) 0.856780, (GLfloat) 0.408314, (GLfloat) - 0.314973,
+       (GLfloat) 0.856353, (GLfloat) 0.416833, (GLfloat) - 0.304811,
+       (GLfloat) 0.606923, (GLfloat) 0.199970, (GLfloat) - 0.769193,
+       (GLfloat) 0.584616, (GLfloat) 0.165625, (GLfloat) - 0.794224,
+       (GLfloat) 0.764793, (GLfloat) - 0.009035, (GLfloat) - 0.644213,
+       (GLfloat) 0.748360, (GLfloat) - 0.049564, (GLfloat) - 0.661439,
+       (GLfloat) 0.725871, (GLfloat) 0.640449, (GLfloat) - 0.250871,
+       (GLfloat) 0.717328, (GLfloat) 0.635281, (GLfloat) - 0.286109,
+       (GLfloat) 0.380922, (GLfloat) 0.670539, (GLfloat) - 0.636613,
+       (GLfloat) 0.351469, (GLfloat) 0.675507, (GLfloat) - 0.648197,
+       (GLfloat) 0.445992, (GLfloat) 0.427917, (GLfloat) - 0.786116,
+       (GLfloat) 0.473767, (GLfloat) 0.428968, (GLfloat) - 0.769111,
+       (GLfloat) 0.786013, (GLfloat) 0.538285, (GLfloat) - 0.304029,
+       (GLfloat) 0.785252, (GLfloat) 0.532999, (GLfloat) - 0.315105,
+       (GLfloat) 0.919156, (GLfloat) 0.373864, (GLfloat) 0.124010,
+       (GLfloat) 0.913260, (GLfloat) 0.384076, (GLfloat) 0.135802,
+       (GLfloat) 0.881886, (GLfloat) 0.458542, (GLfloat) 0.109621,
+       (GLfloat) 0.879452, (GLfloat) 0.461960, (GLfloat) 0.114709,
+       (GLfloat) 0.880239, (GLfloat) 0.473377, (GLfloat) 0.033080,
+       (GLfloat) 0.881697, (GLfloat) 0.470851, (GLfloat) 0.030163,
+       (GLfloat) 0.914779, (GLfloat) 0.401569, (GLfloat) 0.043834,
+       (GLfloat) 0.916978, (GLfloat) 0.396963, (GLfloat) 0.039657,
+       (GLfloat) 0.789250, (GLfloat) 0.598868, (GLfloat) 0.135802,
+       (GLfloat) 0.783354, (GLfloat) 0.609080, (GLfloat) 0.124010,
+       (GLfloat) 0.805159, (GLfloat) 0.591437, (GLfloat) 0.043834,
+       (GLfloat) 0.802269, (GLfloat) 0.595644, (GLfloat) 0.039656,
+       (GLfloat) 0.848617, (GLfloat) 0.528147, (GLfloat) 0.030163,
+       (GLfloat) 0.850075, (GLfloat) 0.525621, (GLfloat) 0.033079,
+       (GLfloat) 0.838052, (GLfloat) 0.534464, (GLfloat) 0.109621,
+       (GLfloat) 0.839795, (GLfloat) 0.530647, (GLfloat) 0.114709,
+       (GLfloat) 0.783354, (GLfloat) 0.609080, (GLfloat) - 0.124010,
+       (GLfloat) 0.789250, (GLfloat) 0.598868, (GLfloat) - 0.135802,
+       (GLfloat) 0.838052, (GLfloat) 0.534464, (GLfloat) - 0.109621,
+       (GLfloat) 0.839795, (GLfloat) 0.530647, (GLfloat) - 0.114709,
+       (GLfloat) 0.850075, (GLfloat) 0.525621, (GLfloat) - 0.033079,
+       (GLfloat) 0.848617, (GLfloat) 0.528147, (GLfloat) - 0.030163,
+       (GLfloat) 0.805159, (GLfloat) 0.591437, (GLfloat) - 0.043834,
+       (GLfloat) 0.802269, (GLfloat) 0.595644, (GLfloat) - 0.039656,
+       (GLfloat) 0.913260, (GLfloat) 0.384076, (GLfloat) - 0.135802,
+       (GLfloat) 0.919156, (GLfloat) 0.373864, (GLfloat) - 0.124010,
+       (GLfloat) 0.914779, (GLfloat) 0.401569, (GLfloat) - 0.043834,
+       (GLfloat) 0.916978, (GLfloat) 0.396963, (GLfloat) - 0.039657,
+       (GLfloat) 0.881697, (GLfloat) 0.470851, (GLfloat) - 0.030163,
+       (GLfloat) 0.880239, (GLfloat) 0.473377, (GLfloat) - 0.033080,
+       (GLfloat) 0.881886, (GLfloat) 0.458542, (GLfloat) - 0.109621,
+       (GLfloat) 0.879452, (GLfloat) 0.461960, (GLfloat) - 0.114709,
+       (GLfloat) 0.190919, (GLfloat) - 0.865460, (GLfloat) - 0.463172,
+       (GLfloat) 0.162958, (GLfloat) - 0.864281, (GLfloat) - 0.475881,
+       (GLfloat) 0.232098, (GLfloat) - 0.863386, (GLfloat) - 0.447991,
+       (GLfloat) 0.201152, (GLfloat) - 0.862208, (GLfloat) - 0.464904,
+       (GLfloat) 0.208595, (GLfloat) - 0.967433, (GLfloat) - 0.143393,
+       (GLfloat) 0.220092, (GLfloat) - 0.966009, (GLfloat) - 0.135597,
+       (GLfloat) 0.173391, (GLfloat) - 0.973662, (GLfloat) - 0.148045,
+       (GLfloat) 0.183752, (GLfloat) - 0.972679, (GLfloat) - 0.141883,
+       (GLfloat) 0.370543, (GLfloat) - 0.826392, (GLfloat) - 0.423998,
+       (GLfloat) 0.337718, (GLfloat) - 0.831172, (GLfloat) - 0.441702,
+       (GLfloat) 0.357949, (GLfloat) - 0.923976, (GLfloat) - 0.134692,
+       (GLfloat) 0.370172, (GLfloat) - 0.920284, (GLfloat) - 0.126690,
+       (GLfloat) 0.265644, (GLfloat) - 0.954091, (GLfloat) - 0.138357,
+       (GLfloat) 0.277857, (GLfloat) - 0.951799, (GLfloat) - 0.129901,
+       (GLfloat) 0.288098, (GLfloat) - 0.854015, (GLfloat) - 0.433195,
+       (GLfloat) 0.255240, (GLfloat) - 0.854757, (GLfloat) - 0.451932,
+       (GLfloat) 0.370543, (GLfloat) - 0.826392, (GLfloat) 0.423998,
+       (GLfloat) 0.337718, (GLfloat) - 0.831172, (GLfloat) 0.441701,
+       (GLfloat) 0.255240, (GLfloat) - 0.854757, (GLfloat) 0.451932,
+       (GLfloat) 0.288099, (GLfloat) - 0.854015, (GLfloat) 0.433195,
+       (GLfloat) 0.265644, (GLfloat) - 0.954091, (GLfloat) 0.138357,
+       (GLfloat) 0.277857, (GLfloat) - 0.951799, (GLfloat) 0.129901,
+       (GLfloat) 0.370172, (GLfloat) - 0.920284, (GLfloat) 0.126690,
+       (GLfloat) 0.357949, (GLfloat) - 0.923976, (GLfloat) 0.134692,
+       (GLfloat) 0.162958, (GLfloat) - 0.864281, (GLfloat) 0.475881,
+       (GLfloat) 0.190920, (GLfloat) - 0.865460, (GLfloat) 0.463172,
+       (GLfloat) 0.173391, (GLfloat) - 0.973662, (GLfloat) 0.148045,
+       (GLfloat) 0.183752, (GLfloat) - 0.972679, (GLfloat) 0.141883,
+       (GLfloat) 0.220093, (GLfloat) - 0.966009, (GLfloat) 0.135597,
+       (GLfloat) 0.208595, (GLfloat) - 0.967433, (GLfloat) 0.143394,
+       (GLfloat) 0.232098, (GLfloat) - 0.863386, (GLfloat) 0.447991,
+       (GLfloat) 0.201153, (GLfloat) - 0.862208, (GLfloat) 0.464904,
+       (GLfloat) - 0.220569, (GLfloat) 0.498423, (GLfloat) - 0.838406,
+       (GLfloat) - 0.196440, (GLfloat) 0.495475, (GLfloat) - 0.846118,
+       (GLfloat) - 0.216090, (GLfloat) 0.523731, (GLfloat) - 0.824021,
+       (GLfloat) - 0.187439, (GLfloat) 0.518039, (GLfloat) - 0.834567,
+       (GLfloat) - 0.035834, (GLfloat) 0.186611, (GLfloat) - 0.981780,
+       (GLfloat) - 0.049583, (GLfloat) 0.189912, (GLfloat) - 0.980548,
+       (GLfloat) - 0.057093, (GLfloat) 0.164206, (GLfloat) - 0.984772,
+       (GLfloat) - 0.067095, (GLfloat) 0.165750, (GLfloat) - 0.983883,
+       (GLfloat) - 0.313656, (GLfloat) 0.500321, (GLfloat) - 0.807031,
+       (GLfloat) - 0.288105, (GLfloat) 0.497578, (GLfloat) - 0.818176,
+       (GLfloat) - 0.079226, (GLfloat) 0.180632, (GLfloat) - 0.980355,
+       (GLfloat) - 0.092817, (GLfloat) 0.182734, (GLfloat) - 0.978771,
+       (GLfloat) - 0.045426, (GLfloat) 0.193014, (GLfloat) - 0.980144,
+       (GLfloat) - 0.060897, (GLfloat) 0.196689, (GLfloat) - 0.978573,
+       (GLfloat) - 0.250277, (GLfloat) 0.526446, (GLfloat) - 0.812537,
+       (GLfloat) - 0.220552, (GLfloat) 0.520843, (GLfloat) - 0.824669,
+       (GLfloat) 0.247012, (GLfloat) - 0.528860, (GLfloat) - 0.811968,
+       (GLfloat) 0.280618, (GLfloat) - 0.529785, (GLfloat) - 0.800363,
+       (GLfloat) 0.197390, (GLfloat) - 0.535630, (GLfloat) - 0.821059,
+       (GLfloat) 0.231067, (GLfloat) - 0.540483, (GLfloat) - 0.809003,
+       (GLfloat) 0.104568, (GLfloat) - 0.158183, (GLfloat) - 0.981857,
+       (GLfloat) 0.094460, (GLfloat) - 0.156029, (GLfloat) - 0.983225,
+       (GLfloat) 0.111854, (GLfloat) - 0.162201, (GLfloat) - 0.980398,
+       (GLfloat) 0.101426, (GLfloat) - 0.160983, (GLfloat) - 0.981732,
+       (GLfloat) 0.117566, (GLfloat) - 0.537019, (GLfloat) - 0.835338,
+       (GLfloat) 0.146549, (GLfloat) - 0.540970, (GLfloat) - 0.828175,
+       (GLfloat) 0.055888, (GLfloat) - 0.173264, (GLfloat) - 0.983288,
+       (GLfloat) 0.045018, (GLfloat) - 0.171643, (GLfloat) - 0.984130,
+       (GLfloat) 0.088354, (GLfloat) - 0.160681, (GLfloat) - 0.983044,
+       (GLfloat) 0.078052, (GLfloat) - 0.158368, (GLfloat) - 0.984290,
+       (GLfloat) 0.157434, (GLfloat) - 0.535002, (GLfloat) - 0.830053,
+       (GLfloat) 0.189212, (GLfloat) - 0.540730, (GLfloat) - 0.819640,
+       (GLfloat) - 0.196440, (GLfloat) 0.495475, (GLfloat) 0.846118,
+       (GLfloat) - 0.220568, (GLfloat) 0.498423, (GLfloat) 0.838406,
+       (GLfloat) - 0.057093, (GLfloat) 0.164206, (GLfloat) 0.984772,
+       (GLfloat) - 0.067095, (GLfloat) 0.165750, (GLfloat) 0.983883,
+       (GLfloat) - 0.049583, (GLfloat) 0.189912, (GLfloat) 0.980548,
+       (GLfloat) - 0.035834, (GLfloat) 0.186611, (GLfloat) 0.981780,
+       (GLfloat) - 0.216090, (GLfloat) 0.523731, (GLfloat) 0.824021,
+       (GLfloat) - 0.187439, (GLfloat) 0.518039, (GLfloat) 0.834567,
+       (GLfloat) 0.117567, (GLfloat) - 0.537019, (GLfloat) 0.835337,
+       (GLfloat) 0.146549, (GLfloat) - 0.540970, (GLfloat) 0.828176,
+       (GLfloat) 0.189212, (GLfloat) - 0.540730, (GLfloat) 0.819640,
+       (GLfloat) 0.157434, (GLfloat) - 0.535002, (GLfloat) 0.830053,
+       (GLfloat) 0.088354, (GLfloat) - 0.160681, (GLfloat) 0.983044,
+       (GLfloat) 0.078052, (GLfloat) - 0.158368, (GLfloat) 0.984290,
+       (GLfloat) 0.045018, (GLfloat) - 0.171643, (GLfloat) 0.984130,
+       (GLfloat) 0.055888, (GLfloat) - 0.173264, (GLfloat) 0.983288,
+       (GLfloat) 0.280617, (GLfloat) - 0.529785, (GLfloat) 0.800363,
+       (GLfloat) 0.247012, (GLfloat) - 0.528861, (GLfloat) 0.811968,
+       (GLfloat) 0.111853, (GLfloat) - 0.162201, (GLfloat) 0.980398,
+       (GLfloat) 0.101425, (GLfloat) - 0.160983, (GLfloat) 0.981732,
+       (GLfloat) 0.094460, (GLfloat) - 0.156028, (GLfloat) 0.983225,
+       (GLfloat) 0.104568, (GLfloat) - 0.158182, (GLfloat) 0.981857,
+       (GLfloat) 0.197390, (GLfloat) - 0.535630, (GLfloat) 0.821059,
+       (GLfloat) 0.231068, (GLfloat) - 0.540483, (GLfloat) 0.809003,
+       (GLfloat) - 0.313656, (GLfloat) 0.500320, (GLfloat) 0.807031,
+       (GLfloat) - 0.288106, (GLfloat) 0.497578, (GLfloat) 0.818175,
+       (GLfloat) - 0.220552, (GLfloat) 0.520843, (GLfloat) 0.824669,
+       (GLfloat) - 0.250276, (GLfloat) 0.526446, (GLfloat) 0.812537,
+       (GLfloat) - 0.045425, (GLfloat) 0.193015, (GLfloat) 0.980144,
+       (GLfloat) - 0.060896, (GLfloat) 0.196690, (GLfloat) 0.978573,
+       (GLfloat) - 0.092818, (GLfloat) 0.182733, (GLfloat) 0.978771,
+       (GLfloat) - 0.079226, (GLfloat) 0.180631, (GLfloat) 0.980355,
+       (GLfloat) - 0.349743, (GLfloat) 0.793198, (GLfloat) - 0.498515,
+       (GLfloat) - 0.370416, (GLfloat) 0.791707, (GLfloat) - 0.485790,
+       (GLfloat) - 0.425027, (GLfloat) 0.892201, (GLfloat) - 0.152739,
+       (GLfloat) - 0.418180, (GLfloat) 0.894483, (GLfloat) - 0.158197,
+       (GLfloat) - 0.425590, (GLfloat) 0.893099, (GLfloat) - 0.145761,
+       (GLfloat) - 0.418336, (GLfloat) 0.895388, (GLfloat) - 0.152561,
+       (GLfloat) - 0.348153, (GLfloat) 0.802874, (GLfloat) - 0.483924,
+       (GLfloat) - 0.370992, (GLfloat) 0.802293, (GLfloat) - 0.467643,
+       (GLfloat) - 0.349743, (GLfloat) 0.793198, (GLfloat) 0.498515,
+       (GLfloat) - 0.370416, (GLfloat) 0.791707, (GLfloat) 0.485790,
+       (GLfloat) - 0.370992, (GLfloat) 0.802293, (GLfloat) 0.467643,
+       (GLfloat) - 0.348153, (GLfloat) 0.802874, (GLfloat) 0.483924,
+       (GLfloat) - 0.425590, (GLfloat) 0.893099, (GLfloat) 0.145761,
+       (GLfloat) - 0.418336, (GLfloat) 0.895388, (GLfloat) 0.152561,
+       (GLfloat) - 0.418180, (GLfloat) 0.894483, (GLfloat) 0.158197,
+       (GLfloat) - 0.425027, (GLfloat) 0.892201, (GLfloat) 0.152739,
+       (GLfloat) - 0.497325, (GLfloat) 0.745242, (GLfloat) 0.444165,
+       (GLfloat) - 0.479548, (GLfloat) 0.747889, (GLfloat) 0.459017,
+       (GLfloat) - 0.556394, (GLfloat) 0.819599, (GLfloat) 0.136684,
+       (GLfloat) - 0.551239, (GLfloat) 0.822088, (GLfloat) 0.142503,
+       (GLfloat) - 0.465768, (GLfloat) 0.872611, (GLfloat) 0.147004,
+       (GLfloat) - 0.472480, (GLfloat) 0.870146, (GLfloat) 0.140027,
+       (GLfloat) - 0.394421, (GLfloat) 0.789665, (GLfloat) 0.469959,
+       (GLfloat) - 0.416499, (GLfloat) 0.788420, (GLfloat) 0.452684,
+       (GLfloat) - 0.479547, (GLfloat) 0.747889, (GLfloat) - 0.459017,
+       (GLfloat) - 0.497325, (GLfloat) 0.745242, (GLfloat) - 0.444165,
+       (GLfloat) - 0.394421, (GLfloat) 0.789665, (GLfloat) - 0.469959,
+       (GLfloat) - 0.416498, (GLfloat) 0.788420, (GLfloat) - 0.452684,
+       (GLfloat) - 0.472480, (GLfloat) 0.870146, (GLfloat) - 0.140027,
+       (GLfloat) - 0.465768, (GLfloat) 0.872611, (GLfloat) - 0.147004,
+       (GLfloat) - 0.556394, (GLfloat) 0.819599, (GLfloat) - 0.136684,
+       (GLfloat) - 0.551239, (GLfloat) 0.822088, (GLfloat) - 0.142503,
+       (GLfloat) - 0.459423, (GLfloat) 0.314205, (GLfloat) - 0.830786,
+       (GLfloat) - 0.469135, (GLfloat) 0.308642, (GLfloat) - 0.827438,
+       (GLfloat) - 0.156023, (GLfloat) 0.098476, (GLfloat) - 0.982832,
+       (GLfloat) - 0.151547, (GLfloat) 0.101367, (GLfloat) - 0.983239,
+       (GLfloat) - 0.168365, (GLfloat) 0.083796, (GLfloat) - 0.982157,
+       (GLfloat) - 0.160419, (GLfloat) 0.086730, (GLfloat) - 0.983231,
+       (GLfloat) - 0.460048, (GLfloat) 0.328491, (GLfloat) - 0.824894,
+       (GLfloat) - 0.469062, (GLfloat) 0.325364, (GLfloat) - 0.821048,
+       (GLfloat) 0.495554, (GLfloat) - 0.246920, (GLfloat) - 0.832741,
+       (GLfloat) 0.477125, (GLfloat) - 0.265003, (GLfloat) - 0.837929,
+       (GLfloat) 0.446738, (GLfloat) - 0.363453, (GLfloat) - 0.817512,
+       (GLfloat) 0.441753, (GLfloat) - 0.366614, (GLfloat) - 0.818809,
+       (GLfloat) 0.138045, (GLfloat) - 0.145699, (GLfloat) - 0.979651,
+       (GLfloat) 0.135385, (GLfloat) - 0.146968, (GLfloat) - 0.979832,
+       (GLfloat) 0.154178, (GLfloat) - 0.091800, (GLfloat) - 0.983769,
+       (GLfloat) 0.160344, (GLfloat) - 0.086930, (GLfloat) - 0.983226,
+       (GLfloat) 0.316237, (GLfloat) - 0.497953, (GLfloat) - 0.807488,
+       (GLfloat) 0.343267, (GLfloat) - 0.493329, (GLfloat) - 0.799246,
+       (GLfloat) 0.113533, (GLfloat) - 0.172349, (GLfloat) - 0.978471,
+       (GLfloat) 0.101829, (GLfloat) - 0.173041, (GLfloat) - 0.979636,
+       (GLfloat) 0.123751, (GLfloat) - 0.168767, (GLfloat) - 0.977856,
+       (GLfloat) 0.114456, (GLfloat) - 0.171068, (GLfloat) - 0.978589,
+       (GLfloat) 0.385418, (GLfloat) - 0.444520, (GLfloat) - 0.808613,
+       (GLfloat) 0.397936, (GLfloat) - 0.439743, (GLfloat) - 0.805154,
+       (GLfloat) - 0.398435, (GLfloat) 0.428657, (GLfloat) - 0.810865,
+       (GLfloat) - 0.386943, (GLfloat) 0.429063, (GLfloat) - 0.816198,
+       (GLfloat) - 0.443045, (GLfloat) 0.369548, (GLfloat) - 0.816790,
+       (GLfloat) - 0.444436, (GLfloat) 0.369300, (GLfloat) - 0.816146,
+       (GLfloat) - 0.163680, (GLfloat) 0.101509, (GLfloat) - 0.981277,
+       (GLfloat) - 0.158806, (GLfloat) 0.102320, (GLfloat) - 0.981994,
+       (GLfloat) - 0.135291, (GLfloat) 0.136613, (GLfloat) - 0.981343,
+       (GLfloat) - 0.139056, (GLfloat) 0.136609, (GLfloat) - 0.980817,
+       (GLfloat) - 0.727675, (GLfloat) 0.496263, (GLfloat) - 0.473510,
+       (GLfloat) - 0.726249, (GLfloat) 0.505128, (GLfloat) - 0.466270,
+       (GLfloat) - 0.710606, (GLfloat) 0.534378, (GLfloat) - 0.457688,
+       (GLfloat) - 0.711650, (GLfloat) 0.528248, (GLfloat) - 0.463150,
+       (GLfloat) - 0.787870, (GLfloat) 0.599385, (GLfloat) - 0.141417,
+       (GLfloat) - 0.788753, (GLfloat) 0.597790, (GLfloat) - 0.143234,
+       (GLfloat) - 0.812157, (GLfloat) 0.564556, (GLfloat) - 0.147234,
+       (GLfloat) - 0.810846, (GLfloat) 0.567072, (GLfloat) - 0.144768,
+       (GLfloat) - 0.599894, (GLfloat) 0.659162, (GLfloat) - 0.453468,
+       (GLfloat) - 0.607958, (GLfloat) 0.656733, (GLfloat) - 0.446194,
+       (GLfloat) - 0.673258, (GLfloat) 0.726567, (GLfloat) - 0.137198,
+       (GLfloat) - 0.671022, (GLfloat) 0.728096, (GLfloat) - 0.140020,
+       (GLfloat) - 0.744575, (GLfloat) 0.652826, (GLfloat) - 0.139376,
+       (GLfloat) - 0.744638, (GLfloat) 0.652728, (GLfloat) - 0.139500,
+       (GLfloat) - 0.673012, (GLfloat) 0.585174, (GLfloat) - 0.452357,
+       (GLfloat) - 0.673042, (GLfloat) 0.585047, (GLfloat) - 0.452476,
+       (GLfloat) - 0.599894, (GLfloat) 0.659162, (GLfloat) 0.453468,
+       (GLfloat) - 0.607958, (GLfloat) 0.656733, (GLfloat) 0.446194,
+       (GLfloat) - 0.673012, (GLfloat) 0.585174, (GLfloat) 0.452357,
+       (GLfloat) - 0.673042, (GLfloat) 0.585047, (GLfloat) 0.452476,
+       (GLfloat) - 0.744638, (GLfloat) 0.652728, (GLfloat) 0.139500,
+       (GLfloat) - 0.744575, (GLfloat) 0.652826, (GLfloat) 0.139376,
+       (GLfloat) - 0.671022, (GLfloat) 0.728096, (GLfloat) 0.140020,
+       (GLfloat) - 0.673258, (GLfloat) 0.726567, (GLfloat) 0.137198,
+       (GLfloat) - 0.727676, (GLfloat) 0.496263, (GLfloat) 0.473510,
+       (GLfloat) - 0.726250, (GLfloat) 0.505128, (GLfloat) 0.466269,
+       (GLfloat) - 0.810846, (GLfloat) 0.567072, (GLfloat) 0.144768,
+       (GLfloat) - 0.812157, (GLfloat) 0.564556, (GLfloat) 0.147234,
+       (GLfloat) - 0.787870, (GLfloat) 0.599385, (GLfloat) 0.141417,
+       (GLfloat) - 0.788753, (GLfloat) 0.597789, (GLfloat) 0.143234,
+       (GLfloat) - 0.711650, (GLfloat) 0.528248, (GLfloat) 0.463150,
+       (GLfloat) - 0.710607, (GLfloat) 0.534378, (GLfloat) 0.457688,
+       (GLfloat) - 0.459423, (GLfloat) 0.314205, (GLfloat) 0.830786,
+       (GLfloat) - 0.469134, (GLfloat) 0.308642, (GLfloat) 0.827438,
+       (GLfloat) - 0.469062, (GLfloat) 0.325364, (GLfloat) 0.821048,
+       (GLfloat) - 0.460048, (GLfloat) 0.328491, (GLfloat) 0.824894,
+       (GLfloat) - 0.168365, (GLfloat) 0.083796, (GLfloat) 0.982157,
+       (GLfloat) - 0.160419, (GLfloat) 0.086730, (GLfloat) 0.983231,
+       (GLfloat) - 0.151547, (GLfloat) 0.101367, (GLfloat) 0.983239,
+       (GLfloat) - 0.156023, (GLfloat) 0.098476, (GLfloat) 0.982832,
+       (GLfloat) - 0.386943, (GLfloat) 0.429064, (GLfloat) 0.816198,
+       (GLfloat) - 0.398435, (GLfloat) 0.428657, (GLfloat) 0.810865,
+       (GLfloat) - 0.135291, (GLfloat) 0.136613, (GLfloat) 0.981343,
+       (GLfloat) - 0.139055, (GLfloat) 0.136609, (GLfloat) 0.980817,
+       (GLfloat) - 0.158806, (GLfloat) 0.102320, (GLfloat) 0.981994,
+       (GLfloat) - 0.163680, (GLfloat) 0.101509, (GLfloat) 0.981277,
+       (GLfloat) - 0.443045, (GLfloat) 0.369548, (GLfloat) 0.816790,
+       (GLfloat) - 0.444437, (GLfloat) 0.369300, (GLfloat) 0.816145,
+       (GLfloat) 0.316237, (GLfloat) - 0.497952, (GLfloat) 0.807488,
+       (GLfloat) 0.343268, (GLfloat) - 0.493329, (GLfloat) 0.799246,
+       (GLfloat) 0.397936, (GLfloat) - 0.439744, (GLfloat) 0.805154,
+       (GLfloat) 0.385418, (GLfloat) - 0.444521, (GLfloat) 0.808613,
+       (GLfloat) 0.123751, (GLfloat) - 0.168768, (GLfloat) 0.977856,
+       (GLfloat) 0.114455, (GLfloat) - 0.171068, (GLfloat) 0.978589,
+       (GLfloat) 0.101830, (GLfloat) - 0.173040, (GLfloat) 0.979637,
+       (GLfloat) 0.113533, (GLfloat) - 0.172348, (GLfloat) 0.978471,
+       (GLfloat) 0.477126, (GLfloat) - 0.265003, (GLfloat) 0.837929,
+       (GLfloat) 0.495553, (GLfloat) - 0.246921, (GLfloat) 0.832741,
+       (GLfloat) 0.154178, (GLfloat) - 0.091800, (GLfloat) 0.983769,
+       (GLfloat) 0.160344, (GLfloat) - 0.086930, (GLfloat) 0.983226,
+       (GLfloat) 0.135385, (GLfloat) - 0.146968, (GLfloat) 0.979832,
+       (GLfloat) 0.138045, (GLfloat) - 0.145699, (GLfloat) 0.979651,
+       (GLfloat) 0.446739, (GLfloat) - 0.363453, (GLfloat) 0.817512,
+       (GLfloat) 0.441753, (GLfloat) - 0.366614, (GLfloat) 0.818809,
+       (GLfloat) 0.786198, (GLfloat) - 0.394047, (GLfloat) 0.476047,
+       (GLfloat) 0.792547, (GLfloat) - 0.363224, (GLfloat) 0.489834,
+       (GLfloat) 0.707476, (GLfloat) - 0.538845, (GLfloat) 0.457301,
+       (GLfloat) 0.711142, (GLfloat) - 0.529032, (GLfloat) 0.463037,
+       (GLfloat) 0.801588, (GLfloat) - 0.580242, (GLfloat) 0.144141,
+       (GLfloat) 0.799043, (GLfloat) - 0.584300, (GLfloat) 0.141857,
+       (GLfloat) 0.903357, (GLfloat) - 0.400085, (GLfloat) 0.154524,
+       (GLfloat) 0.898654, (GLfloat) - 0.412515, (GLfloat) 0.149172,
+       (GLfloat) 0.471890, (GLfloat) - 0.763546, (GLfloat) 0.440814,
+       (GLfloat) 0.497278, (GLfloat) - 0.754424, (GLfloat) 0.428437,
+       (GLfloat) 0.515315, (GLfloat) - 0.846316, (GLfloat) 0.134909,
+       (GLfloat) 0.524719, (GLfloat) - 0.841405, (GLfloat) 0.129258,
+       (GLfloat) 0.671646, (GLfloat) - 0.728471, (GLfloat) 0.134984,
+       (GLfloat) 0.668271, (GLfloat) - 0.731195, (GLfloat) 0.136994,
+       (GLfloat) 0.610971, (GLfloat) - 0.657561, (GLfloat) 0.440826,
+       (GLfloat) 0.601302, (GLfloat) - 0.663396, (GLfloat) 0.445356,
+       (GLfloat) 0.497278, (GLfloat) - 0.754424, (GLfloat) - 0.428437,
+       (GLfloat) 0.471890, (GLfloat) - 0.763546, (GLfloat) - 0.440814,
+       (GLfloat) 0.610971, (GLfloat) - 0.657561, (GLfloat) - 0.440826,
+       (GLfloat) 0.601301, (GLfloat) - 0.663396, (GLfloat) - 0.445356,
+       (GLfloat) 0.668271, (GLfloat) - 0.731195, (GLfloat) - 0.136994,
+       (GLfloat) 0.671646, (GLfloat) - 0.728471, (GLfloat) - 0.134984,
+       (GLfloat) 0.515315, (GLfloat) - 0.846316, (GLfloat) - 0.134909,
+       (GLfloat) 0.524719, (GLfloat) - 0.841405, (GLfloat) - 0.129258,
+       (GLfloat) 0.792547, (GLfloat) - 0.363225, (GLfloat) - 0.489834,
+       (GLfloat) 0.786198, (GLfloat) - 0.394046, (GLfloat) - 0.476047,
+       (GLfloat) 0.903357, (GLfloat) - 0.400085, (GLfloat) - 0.154524,
+       (GLfloat) 0.898654, (GLfloat) - 0.412515, (GLfloat) - 0.149172,
+       (GLfloat) 0.799043, (GLfloat) - 0.584299, (GLfloat) - 0.141858,
+       (GLfloat) 0.801588, (GLfloat) - 0.580242, (GLfloat) - 0.144141,
+       (GLfloat) 0.707476, (GLfloat) - 0.538845, (GLfloat) - 0.457301,
+       (GLfloat) 0.711142, (GLfloat) - 0.529031, (GLfloat) - 0.463037,
+       (GLfloat) 0.844921, (GLfloat) - 0.202233, (GLfloat) 0.495188,
+       (GLfloat) 0.846624, (GLfloat) - 0.162790, (GLfloat) 0.506682,
+       (GLfloat) 0.967461, (GLfloat) - 0.195075, (GLfloat) 0.161136,
+       (GLfloat) 0.965076, (GLfloat) - 0.210256, (GLfloat) 0.156272,
+       (GLfloat) 0.933716, (GLfloat) - 0.317920, (GLfloat) 0.164623,
+       (GLfloat) 0.928870, (GLfloat) - 0.334244, (GLfloat) 0.159632,
+       (GLfloat) 0.801028, (GLfloat) - 0.328506, (GLfloat) 0.500438,
+       (GLfloat) 0.805814, (GLfloat) - 0.302226, (GLfloat) 0.509238,
+       (GLfloat) 0.844921, (GLfloat) - 0.202233, (GLfloat) - 0.495188,
+       (GLfloat) 0.846624, (GLfloat) - 0.162790, (GLfloat) - 0.506682,
+       (GLfloat) 0.805814, (GLfloat) - 0.302226, (GLfloat) - 0.509238,
+       (GLfloat) 0.801028, (GLfloat) - 0.328507, (GLfloat) - 0.500438,
+       (GLfloat) 0.933716, (GLfloat) - 0.317920, (GLfloat) - 0.164623,
+       (GLfloat) 0.928870, (GLfloat) - 0.334244, (GLfloat) - 0.159632,
+       (GLfloat) 0.965076, (GLfloat) - 0.210256, (GLfloat) - 0.156272,
+       (GLfloat) 0.967461, (GLfloat) - 0.195075, (GLfloat) - 0.161136,
+       (GLfloat) 0.116677, (GLfloat) - 0.971600, (GLfloat) - 0.205866,
+       (GLfloat) 0.095439, (GLfloat) - 0.979375, (GLfloat) - 0.178092,
+       (GLfloat) 0.145951, (GLfloat) - 0.986885, (GLfloat) - 0.068965,
+       (GLfloat) 0.134470, (GLfloat) - 0.988213, (GLfloat) - 0.073162,
+       (GLfloat) 0.572548, (GLfloat) - 0.810794, (GLfloat) - 0.121664,
+       (GLfloat) 0.603894, (GLfloat) - 0.784891, (GLfloat) - 0.138773,
+       (GLfloat) 0.437036, (GLfloat) - 0.822210, (GLfloat) - 0.364650,
+       (GLfloat) 0.472429, (GLfloat) - 0.800503, (GLfloat) - 0.368789,
+       (GLfloat) 0.095438, (GLfloat) - 0.979375, (GLfloat) 0.178092,
+       (GLfloat) 0.116677, (GLfloat) - 0.971600, (GLfloat) 0.205866,
+       (GLfloat) 0.472430, (GLfloat) - 0.800503, (GLfloat) 0.368789,
+       (GLfloat) 0.437036, (GLfloat) - 0.822210, (GLfloat) 0.364650,
+       (GLfloat) 0.603894, (GLfloat) - 0.784891, (GLfloat) 0.138773,
+       (GLfloat) 0.572548, (GLfloat) - 0.810794, (GLfloat) 0.121664,
+       (GLfloat) 0.134470, (GLfloat) - 0.988213, (GLfloat) 0.073162,
+       (GLfloat) 0.145951, (GLfloat) - 0.986885, (GLfloat) 0.068965,
+       (GLfloat) 0.531733, (GLfloat) - 0.073239, (GLfloat) - 0.843739,
+       (GLfloat) 0.511681, (GLfloat) - 0.104754, (GLfloat) - 0.852766,
+       (GLfloat) 0.176179, (GLfloat) 0.024438, (GLfloat) - 0.984055,
+       (GLfloat) 0.188717, (GLfloat) 0.040307, (GLfloat) - 0.981204,
+       (GLfloat) 0.150895, (GLfloat) - 0.104293, (GLfloat) - 0.983033,
+       (GLfloat) 0.147932, (GLfloat) - 0.109363, (GLfloat) - 0.982932,
+       (GLfloat) 0.481880, (GLfloat) - 0.227373, (GLfloat) - 0.846223,
+       (GLfloat) 0.480166, (GLfloat) - 0.230321, (GLfloat) - 0.846400,
+       (GLfloat) - 0.443443, (GLfloat) 0.349023, (GLfloat) - 0.825555,
+       (GLfloat) - 0.447255, (GLfloat) 0.345654, (GLfloat) - 0.824916,
+       (GLfloat) - 0.494732, (GLfloat) 0.167751, (GLfloat) - 0.852701,
+       (GLfloat) - 0.499143, (GLfloat) 0.160727, (GLfloat) - 0.851483,
+       (GLfloat) - 0.167121, (GLfloat) 0.020158, (GLfloat) - 0.985730,
+       (GLfloat) - 0.166487, (GLfloat) 0.021208, (GLfloat) - 0.985815,
+       (GLfloat) - 0.129817, (GLfloat) 0.178023, (GLfloat) - 0.975426,
+       (GLfloat) - 0.132948, (GLfloat) 0.174752, (GLfloat) - 0.975595,
+       (GLfloat) - 0.353563, (GLfloat) - 0.901143, (GLfloat) - 0.250869,
+       (GLfloat) - 0.351628, (GLfloat) - 0.891347, (GLfloat) - 0.286110,
+       (GLfloat) - 0.232284, (GLfloat) - 0.920192, (GLfloat) - 0.315104,
+       (GLfloat) - 0.236990, (GLfloat) - 0.922714, (GLfloat) - 0.304029,
+       (GLfloat) - 0.244093, (GLfloat) - 0.592931, (GLfloat) - 0.767366,
+       (GLfloat) - 0.249996, (GLfloat) - 0.572960, (GLfloat) - 0.780525,
+       (GLfloat) - 0.510472, (GLfloat) - 0.553764, (GLfloat) - 0.657848,
+       (GLfloat) - 0.520671, (GLfloat) - 0.533495, (GLfloat) - 0.666547,
+       (GLfloat) 0.010781, (GLfloat) - 0.964447, (GLfloat) - 0.264055,
+       (GLfloat) 0.040104, (GLfloat) - 0.958098, (GLfloat) - 0.283621,
+       (GLfloat) 0.223629, (GLfloat) - 0.775786, (GLfloat) - 0.590040,
+       (GLfloat) 0.262682, (GLfloat) - 0.745474, (GLfloat) - 0.612590,
+       (GLfloat) 0.033849, (GLfloat) - 0.640593, (GLfloat) - 0.767134,
+       (GLfloat) 0.004138, (GLfloat) - 0.677809, (GLfloat) - 0.735226,
+       (GLfloat) - 0.092889, (GLfloat) - 0.948124, (GLfloat) - 0.304029,
+       (GLfloat) - 0.096449, (GLfloat) - 0.944143, (GLfloat) - 0.315104,
+       (GLfloat) - 0.719211, (GLfloat) 0.510808, (GLfloat) - 0.470968,
+       (GLfloat) - 0.720697, (GLfloat) 0.504519, (GLfloat) - 0.475454,
+       (GLfloat) - 0.811897, (GLfloat) 0.564936, (GLfloat) - 0.147209,
+       (GLfloat) - 0.813044, (GLfloat) 0.562871, (GLfloat) - 0.148783,
+       (GLfloat) - 0.910433, (GLfloat) 0.380820, (GLfloat) - 0.161519,
+       (GLfloat) - 0.907768, (GLfloat) 0.388545, (GLfloat) - 0.158079,
+       (GLfloat) - 0.804000, (GLfloat) 0.309508, (GLfloat) - 0.507729,
+       (GLfloat) - 0.801647, (GLfloat) 0.326768, (GLfloat) - 0.500584,
+       (GLfloat) - 0.720697, (GLfloat) 0.504519, (GLfloat) 0.475454,
+       (GLfloat) - 0.719210, (GLfloat) 0.510808, (GLfloat) 0.470968,
+       (GLfloat) - 0.804000, (GLfloat) 0.309509, (GLfloat) 0.507729,
+       (GLfloat) - 0.801647, (GLfloat) 0.326768, (GLfloat) 0.500585,
+       (GLfloat) - 0.907768, (GLfloat) 0.388545, (GLfloat) 0.158079,
+       (GLfloat) - 0.910433, (GLfloat) 0.380820, (GLfloat) 0.161519,
+       (GLfloat) - 0.811897, (GLfloat) 0.564936, (GLfloat) 0.147209,
+       (GLfloat) - 0.813044, (GLfloat) 0.562871, (GLfloat) 0.148783,
+       (GLfloat) - 0.441947, (GLfloat) - 0.873099, (GLfloat) 0.205867,
+       (GLfloat) - 0.424648, (GLfloat) - 0.887670, (GLfloat) 0.178091,
+       (GLfloat) - 0.474684, (GLfloat) - 0.877450, (GLfloat) 0.068965,
+       (GLfloat) - 0.464350, (GLfloat) - 0.882625, (GLfloat) 0.073162,
+       (GLfloat) - 0.909934, (GLfloat) - 0.390292, (GLfloat) 0.140328,
+       (GLfloat) - 0.923715, (GLfloat) - 0.349249, (GLfloat) 0.157405,
+       (GLfloat) - 0.775101, (GLfloat) - 0.483039, (GLfloat) 0.407299,
+       (GLfloat) - 0.785487, (GLfloat) - 0.436754, (GLfloat) 0.438470,
+       (GLfloat) - 0.424649, (GLfloat) - 0.887669, (GLfloat) - 0.178092,
+       (GLfloat) - 0.441947, (GLfloat) - 0.873099, (GLfloat) - 0.205866,
+       (GLfloat) - 0.775100, (GLfloat) - 0.483039, (GLfloat) - 0.407299,
+       (GLfloat) - 0.785487, (GLfloat) - 0.436754, (GLfloat) - 0.438470,
+       (GLfloat) - 0.923715, (GLfloat) - 0.349249, (GLfloat) - 0.157405,
+       (GLfloat) - 0.909934, (GLfloat) - 0.390292, (GLfloat) - 0.140328,
+       (GLfloat) - 0.464350, (GLfloat) - 0.882625, (GLfloat) - 0.073162,
+       (GLfloat) - 0.474684, (GLfloat) - 0.877450, (GLfloat) - 0.068965,
+       (GLfloat) - 0.447255, (GLfloat) 0.345654, (GLfloat) 0.824916,
+       (GLfloat) - 0.443443, (GLfloat) 0.349023, (GLfloat) 0.825555,
+       (GLfloat) - 0.129817, (GLfloat) 0.178023, (GLfloat) 0.975426,
+       (GLfloat) - 0.132949, (GLfloat) 0.174752, (GLfloat) 0.975595,
+       (GLfloat) - 0.166487, (GLfloat) 0.021208, (GLfloat) 0.985815,
+       (GLfloat) - 0.167121, (GLfloat) 0.020158, (GLfloat) 0.985730,
+       (GLfloat) - 0.494732, (GLfloat) 0.167753, (GLfloat) 0.852701,
+       (GLfloat) - 0.499144, (GLfloat) 0.160728, (GLfloat) 0.851482,
+       (GLfloat) 0.531733, (GLfloat) - 0.073239, (GLfloat) 0.843739,
+       (GLfloat) 0.511681, (GLfloat) - 0.104754, (GLfloat) 0.852765,
+       (GLfloat) 0.480166, (GLfloat) - 0.230321, (GLfloat) 0.846400,
+       (GLfloat) 0.481881, (GLfloat) - 0.227371, (GLfloat) 0.846223,
+       (GLfloat) 0.150895, (GLfloat) - 0.104294, (GLfloat) 0.983033,
+       (GLfloat) 0.147933, (GLfloat) - 0.109363, (GLfloat) 0.982932,
+       (GLfloat) 0.188717, (GLfloat) 0.040307, (GLfloat) 0.981204,
+       (GLfloat) 0.176179, (GLfloat) 0.024438, (GLfloat) 0.984055,
+       (GLfloat) 0.040104, (GLfloat) - 0.958098, (GLfloat) 0.283620,
+       (GLfloat) 0.010781, (GLfloat) - 0.964447, (GLfloat) 0.264055,
+       (GLfloat) - 0.096449, (GLfloat) - 0.944143, (GLfloat) 0.315104,
+       (GLfloat) - 0.092889, (GLfloat) - 0.948124, (GLfloat) 0.304029,
+       (GLfloat) 0.004138, (GLfloat) - 0.677808, (GLfloat) 0.735227,
+       (GLfloat) 0.033849, (GLfloat) - 0.640593, (GLfloat) 0.767135,
+       (GLfloat) 0.223629, (GLfloat) - 0.775785, (GLfloat) 0.590040,
+       (GLfloat) 0.262682, (GLfloat) - 0.745474, (GLfloat) 0.612591,
+       (GLfloat) - 0.353563, (GLfloat) - 0.901143, (GLfloat) 0.250868,
+       (GLfloat) - 0.351627, (GLfloat) - 0.891347, (GLfloat) 0.286109,
+       (GLfloat) - 0.510472, (GLfloat) - 0.553764, (GLfloat) 0.657848,
+       (GLfloat) - 0.520671, (GLfloat) - 0.533495, (GLfloat) 0.666547,
+       (GLfloat) - 0.249996, (GLfloat) - 0.572959, (GLfloat) 0.780525,
+       (GLfloat) - 0.244093, (GLfloat) - 0.592931, (GLfloat) 0.767367,
+       (GLfloat) - 0.236991, (GLfloat) - 0.922714, (GLfloat) 0.304029,
+       (GLfloat) - 0.232284, (GLfloat) - 0.920192, (GLfloat) 0.315104,
+       (GLfloat) - 0.036947, (GLfloat) - 0.991593, (GLfloat) - 0.124011,
+       (GLfloat) - 0.048560, (GLfloat) - 0.989545, (GLfloat) - 0.135802,
+       (GLfloat) - 0.129266, (GLfloat) - 0.985532, (GLfloat) - 0.109621,
+       (GLfloat) - 0.133311, (GLfloat) - 0.984414, (GLfloat) - 0.114709,
+       (GLfloat) - 0.143769, (GLfloat) - 0.989058, (GLfloat) - 0.033079,
+       (GLfloat) - 0.140897, (GLfloat) - 0.989565, (GLfloat) - 0.030163,
+       (GLfloat) - 0.064478, (GLfloat) - 0.996956, (GLfloat) - 0.043834,
+       (GLfloat) - 0.059398, (GLfloat) - 0.997446, (GLfloat) - 0.039656,
+       (GLfloat) - 0.292813, (GLfloat) - 0.946477, (GLfloat) - 0.135802,
+       (GLfloat) - 0.304426, (GLfloat) - 0.944429, (GLfloat) - 0.124011,
+       (GLfloat) - 0.280390, (GLfloat) - 0.958885, (GLfloat) - 0.043834,
+       (GLfloat) - 0.285331, (GLfloat) - 0.957608, (GLfloat) - 0.039656,
+       (GLfloat) - 0.206051, (GLfloat) - 0.978076, (GLfloat) - 0.030163,
+       (GLfloat) - 0.203179, (GLfloat) - 0.978583, (GLfloat) - 0.033079,
+       (GLfloat) - 0.215602, (GLfloat) - 0.970309, (GLfloat) - 0.109621,
+       (GLfloat) - 0.211418, (GLfloat) - 0.970641, (GLfloat) - 0.114709,
+       (GLfloat) - 0.304426, (GLfloat) - 0.944429, (GLfloat) 0.124011,
+       (GLfloat) - 0.292813, (GLfloat) - 0.946477, (GLfloat) 0.135803,
+       (GLfloat) - 0.215602, (GLfloat) - 0.970309, (GLfloat) 0.109621,
+       (GLfloat) - 0.211418, (GLfloat) - 0.970641, (GLfloat) 0.114709,
+       (GLfloat) - 0.203179, (GLfloat) - 0.978583, (GLfloat) 0.033079,
+       (GLfloat) - 0.206051, (GLfloat) - 0.978076, (GLfloat) 0.030163,
+       (GLfloat) - 0.280390, (GLfloat) - 0.958885, (GLfloat) 0.043834,
+       (GLfloat) - 0.285331, (GLfloat) - 0.957608, (GLfloat) 0.039656,
+       (GLfloat) - 0.048560, (GLfloat) - 0.989545, (GLfloat) 0.135802,
+       (GLfloat) - 0.036947, (GLfloat) - 0.991593, (GLfloat) 0.124011,
+       (GLfloat) - 0.064478, (GLfloat) - 0.996956, (GLfloat) 0.043834,
+       (GLfloat) - 0.059398, (GLfloat) - 0.997446, (GLfloat) 0.039656,
+       (GLfloat) - 0.140897, (GLfloat) - 0.989565, (GLfloat) 0.030163,
+       (GLfloat) - 0.143769, (GLfloat) - 0.989058, (GLfloat) 0.033079,
+       (GLfloat) - 0.129266, (GLfloat) - 0.985532, (GLfloat) 0.109621,
+       (GLfloat) - 0.133311, (GLfloat) - 0.984414, (GLfloat) 0.114709,
+};
+
+static unsigned short int s1_3_POLS[] =
+{
+      3, 82, 12, 76, 1, 3, 76, 74, 82, 1, 3, 22, 78, 74, 1, 3, 22, 74, 76, 1,
+      3, 78, 20, 80, 1, 3, 80, 74, 78, 1, 3, 28, 82, 74, 1, 3, 28, 74, 80, 1,
+      3, 88, 13, 84, 1, 3, 84, 77, 88, 1, 3, 24, 86, 77, 1, 3, 24, 77, 84, 1,
+      3, 86, 20, 78, 1, 3, 78, 77, 86, 1, 3, 22, 88, 77, 1, 3, 22, 77, 78, 1,
+      3, 14, 90, 85, 1, 3, 14, 85, 93, 1, 3, 26, 91, 85, 1, 3, 26, 85, 90, 1,
+      3, 20, 86, 85, 1, 3, 20, 85, 91, 1, 3, 24, 93, 85, 1, 3, 24, 85, 86, 1,
+      3, 15, 95, 79, 1, 3, 15, 79, 97, 1, 3, 28, 80, 79, 1, 3, 28, 79, 95, 1,
+      3, 20, 91, 79, 1, 3, 20, 79, 80, 1, 3, 26, 97, 79, 1, 3, 26, 79, 91, 1,
+    3, 13, 99, 83, 1, 3, 13, 83, 84, 1, 3, 99, 30, 101, 1, 3, 101, 83, 99, 1,
+  3, 23, 102, 83, 1, 3, 23, 83, 101, 1, 3, 102, 24, 84, 1, 3, 84, 83, 102, 1,
+       3, 108, 16, 104, 1, 3, 104, 100, 108, 1, 3, 32, 106, 100, 1, 3, 32, 100, 104, 1,
+       3, 106, 23, 101, 1, 3, 101, 100, 106, 1, 3, 30, 108, 100, 1, 3, 30, 100, 101, 1,
+       3, 113, 17, 110, 1, 3, 110, 105, 113, 1, 3, 33, 111, 105, 1, 3, 33, 105, 110, 1,
+       3, 23, 106, 105, 1, 3, 23, 105, 111, 1, 3, 106, 32, 113, 1, 3, 113, 105, 106, 1,
+   3, 14, 93, 92, 1, 3, 14, 92, 114, 1, 3, 93, 24, 102, 1, 3, 102, 92, 93, 1,
+3, 23, 111, 92, 1, 3, 23, 92, 102, 1, 3, 111, 33, 114, 1, 3, 114, 92, 111, 1,
+       3, 16, 116, 103, 1, 3, 16, 103, 104, 1, 3, 116, 35, 118, 1, 3, 118, 103, 116, 1,
+       3, 31, 119, 103, 1, 3, 31, 103, 118, 1, 3, 119, 32, 104, 1, 3, 104, 103, 119, 1,
+       3, 18, 121, 117, 1, 3, 18, 117, 125, 1, 3, 121, 36, 123, 1, 3, 123, 117, 121, 1,
+       3, 31, 118, 117, 1, 3, 31, 117, 123, 1, 3, 118, 35, 125, 1, 3, 125, 117, 118, 1,
+       3, 19, 127, 122, 1, 3, 19, 122, 130, 1, 3, 127, 37, 128, 1, 3, 128, 122, 127, 1,
+       3, 31, 123, 122, 1, 3, 31, 122, 128, 1, 3, 123, 36, 130, 1, 3, 130, 122, 123, 1,
+       3, 17, 113, 112, 1, 3, 17, 112, 131, 1, 3, 113, 32, 119, 1, 3, 119, 112, 113, 1,
+       3, 31, 128, 112, 1, 3, 31, 112, 119, 1, 3, 128, 37, 131, 1, 3, 131, 112, 128, 1,
+       3, 121, 18, 133, 1, 3, 133, 120, 121, 1, 3, 39, 134, 120, 1, 3, 39, 120, 133, 1,
+       3, 134, 27, 135, 1, 3, 135, 120, 134, 1, 3, 36, 121, 120, 1, 3, 36, 120, 135, 1,
+   3, 12, 82, 81, 1, 3, 12, 81, 138, 1, 3, 82, 28, 136, 1, 3, 136, 81, 82, 1,
+3, 27, 134, 81, 1, 3, 27, 81, 136, 1, 3, 134, 39, 138, 1, 3, 138, 81, 134, 1,
+ 3, 15, 139, 94, 1, 3, 15, 94, 95, 1, 3, 139, 40, 140, 1, 3, 140, 94, 139, 1,
+  3, 27, 136, 94, 1, 3, 27, 94, 140, 1, 3, 136, 28, 95, 1, 3, 95, 94, 136, 1,
+       3, 141, 19, 130, 1, 3, 130, 129, 141, 1, 3, 130, 36, 135, 1, 3, 135, 129, 130, 1,
+       3, 27, 140, 129, 1, 3, 27, 129, 135, 1, 3, 40, 141, 129, 1, 3, 40, 129, 140, 1,
+ 3, 14, 114, 89, 1, 3, 14, 89, 90, 1, 3, 114, 33, 142, 1, 3, 142, 89, 114, 1,
+  3, 25, 143, 89, 1, 3, 25, 89, 142, 1, 3, 143, 26, 90, 1, 3, 90, 89, 143, 1,
+       3, 17, 131, 109, 1, 3, 17, 109, 110, 1, 3, 131, 37, 144, 1, 3, 144, 109, 131, 1,
+       3, 25, 142, 109, 1, 3, 25, 109, 144, 1, 3, 142, 33, 110, 1, 3, 110, 109, 142, 1,
+       3, 19, 141, 126, 1, 3, 19, 126, 127, 1, 3, 141, 40, 145, 1, 3, 145, 126, 141, 1,
+       3, 25, 144, 126, 1, 3, 25, 126, 145, 1, 3, 144, 37, 127, 1, 3, 127, 126, 144, 1,
+   3, 15, 97, 96, 1, 3, 15, 96, 139, 1, 3, 97, 26, 143, 1, 3, 143, 96, 97, 1,
+3, 25, 145, 96, 1, 3, 25, 96, 143, 1, 3, 145, 40, 139, 1, 3, 139, 96, 145, 1,
+ 3, 12, 146, 75, 1, 3, 12, 75, 76, 1, 3, 146, 41, 148, 1, 3, 148, 75, 146, 1,
+  3, 21, 149, 75, 1, 3, 21, 75, 148, 1, 3, 149, 22, 76, 1, 3, 76, 75, 149, 1,
+       3, 155, 8, 151, 1, 3, 151, 147, 155, 1, 3, 43, 153, 147, 1, 3, 43, 147, 151, 1,
+       3, 153, 21, 148, 1, 3, 148, 147, 153, 1, 3, 41, 155, 147, 1, 3, 41, 147, 148, 1,
+       3, 160, 11, 157, 1, 3, 157, 152, 160, 1, 3, 44, 158, 152, 1, 3, 44, 152, 157, 1,
+       3, 158, 21, 153, 1, 3, 153, 152, 158, 1, 3, 43, 160, 152, 1, 3, 43, 152, 153, 1,
+   3, 13, 88, 87, 1, 3, 13, 87, 161, 1, 3, 88, 22, 149, 1, 3, 149, 87, 88, 1,
+3, 21, 158, 87, 1, 3, 21, 87, 149, 1, 3, 158, 44, 161, 1, 3, 161, 87, 158, 1,
+       3, 18, 162, 132, 1, 3, 18, 132, 133, 1, 3, 162, 45, 164, 1, 3, 164, 132, 162, 1,
+       3, 38, 165, 132, 1, 3, 38, 132, 164, 1, 3, 165, 39, 133, 1, 3, 133, 132, 165, 1,
+       3, 170, 9, 167, 1, 3, 167, 163, 170, 1, 3, 47, 168, 163, 1, 3, 47, 163, 167, 1,
+       3, 168, 38, 164, 1, 3, 164, 163, 168, 1, 3, 45, 170, 163, 1, 3, 45, 163, 164, 1,
+3, 8, 155, 154, 1, 3, 8, 154, 173, 1, 3, 155, 41, 171, 1, 3, 171, 154, 155, 1,
+       3, 38, 168, 154, 1, 3, 38, 154, 171, 1, 3, 168, 47, 173, 1, 3, 173, 154, 168, 1,
+       3, 146, 12, 138, 1, 3, 138, 137, 146, 1, 3, 39, 165, 137, 1, 3, 39, 137, 138, 1,
+       3, 165, 38, 171, 1, 3, 171, 137, 165, 1, 3, 41, 146, 137, 1, 3, 41, 137, 171, 1,
+       3, 16, 108, 107, 1, 3, 16, 107, 177, 1, 3, 108, 30, 174, 1, 3, 174, 107, 108, 1,
+       3, 29, 176, 107, 1, 3, 29, 107, 174, 1, 3, 176, 50, 177, 1, 3, 177, 107, 176, 1,
+  3, 99, 13, 161, 1, 3, 161, 98, 99, 1, 3, 44, 178, 98, 1, 3, 44, 98, 161, 1,
+ 3, 178, 29, 174, 1, 3, 174, 98, 178, 1, 3, 30, 99, 98, 1, 3, 30, 98, 174, 1,
+       3, 11, 180, 156, 1, 3, 11, 156, 157, 1, 3, 180, 49, 181, 1, 3, 181, 156, 180, 1,
+       3, 29, 178, 156, 1, 3, 29, 156, 181, 1, 3, 178, 44, 157, 1, 3, 157, 156, 178, 1,
+       3, 185, 10, 183, 1, 3, 183, 175, 185, 1, 3, 50, 176, 175, 1, 3, 50, 175, 183, 1,
+       3, 176, 29, 181, 1, 3, 181, 175, 176, 1, 3, 49, 185, 175, 1, 3, 49, 175, 181, 1,
+       3, 162, 18, 125, 1, 3, 125, 124, 162, 1, 3, 35, 186, 124, 1, 3, 35, 124, 125, 1,
+       3, 186, 34, 187, 1, 3, 187, 124, 186, 1, 3, 45, 162, 124, 1, 3, 45, 124, 187, 1,
+       3, 116, 16, 177, 1, 3, 177, 115, 116, 1, 3, 50, 188, 115, 1, 3, 50, 115, 177, 1,
+       3, 188, 34, 186, 1, 3, 186, 115, 188, 1, 3, 35, 116, 115, 1, 3, 35, 115, 186, 1,
+       3, 10, 190, 182, 1, 3, 10, 182, 183, 1, 3, 190, 52, 191, 1, 3, 191, 182, 190, 1,
+       3, 34, 188, 182, 1, 3, 34, 182, 191, 1, 3, 188, 50, 183, 1, 3, 183, 182, 188, 1,
+3, 9, 170, 169, 1, 3, 9, 169, 193, 1, 3, 170, 45, 187, 1, 3, 187, 169, 170, 1,
+       3, 34, 191, 169, 1, 3, 34, 169, 187, 1, 3, 191, 52, 193, 1, 3, 193, 169, 191, 1,
+       3, 201, 1, 196, 1, 3, 196, 194, 201, 1, 3, 54, 198, 194, 1, 3, 54, 194, 196, 1,
+       3, 198, 46, 199, 1, 3, 199, 194, 198, 1, 3, 56, 201, 194, 1, 3, 56, 194, 199, 1,
+3, 3, 203, 197, 1, 3, 3, 197, 206, 1, 3, 203, 55, 204, 1, 3, 204, 197, 203, 1,
+       3, 46, 198, 197, 1, 3, 46, 197, 204, 1, 3, 198, 54, 206, 1, 3, 206, 197, 198, 1,
+       3, 208, 8, 173, 1, 3, 173, 172, 208, 1, 3, 47, 207, 172, 1, 3, 47, 172, 173, 1,
+       3, 207, 46, 204, 1, 3, 204, 172, 207, 1, 3, 55, 208, 172, 1, 3, 55, 172, 204, 1,
+3, 9, 209, 166, 1, 3, 9, 166, 167, 1, 3, 209, 56, 199, 1, 3, 199, 166, 209, 1,
+       3, 46, 207, 166, 1, 3, 46, 166, 199, 1, 3, 207, 47, 167, 1, 3, 167, 166, 207, 1,
+       3, 214, 1, 201, 1, 3, 201, 200, 214, 1, 3, 56, 210, 200, 1, 3, 56, 200, 201, 1,
+       3, 210, 51, 212, 1, 3, 212, 200, 210, 1, 3, 59, 214, 200, 1, 3, 59, 200, 212, 1,
+       3, 209, 9, 193, 1, 3, 193, 192, 209, 1, 3, 52, 215, 192, 1, 3, 52, 192, 193, 1,
+       3, 51, 210, 192, 1, 3, 51, 192, 215, 1, 3, 210, 56, 209, 1, 3, 209, 192, 210, 1,
+       3, 190, 10, 216, 1, 3, 216, 189, 190, 1, 3, 216, 57, 217, 1, 3, 217, 189, 216, 1,
+       3, 51, 215, 189, 1, 3, 51, 189, 217, 1, 3, 52, 190, 189, 1, 3, 52, 189, 215, 1,
+       3, 221, 0, 219, 1, 3, 219, 211, 221, 1, 3, 59, 212, 211, 1, 3, 59, 211, 219, 1,
+       3, 212, 51, 217, 1, 3, 217, 211, 212, 1, 3, 57, 221, 211, 1, 3, 57, 211, 217, 1,
+       3, 226, 0, 221, 1, 3, 221, 220, 226, 1, 3, 57, 222, 220, 1, 3, 57, 220, 221, 1,
+       3, 222, 48, 224, 1, 3, 224, 220, 222, 1, 3, 62, 226, 220, 1, 3, 62, 220, 224, 1,
+       3, 10, 185, 184, 1, 3, 10, 184, 216, 1, 3, 185, 49, 227, 1, 3, 227, 184, 185, 1,
+       3, 48, 222, 184, 1, 3, 48, 184, 227, 1, 3, 222, 57, 216, 1, 3, 216, 184, 222, 1,
+       3, 180, 11, 228, 1, 3, 228, 179, 180, 1, 3, 60, 229, 179, 1, 3, 60, 179, 228, 1,
+       3, 229, 48, 227, 1, 3, 227, 179, 229, 1, 3, 49, 180, 179, 1, 3, 49, 179, 227, 1,
+3, 2, 231, 223, 1, 3, 2, 223, 233, 1, 3, 231, 62, 224, 1, 3, 224, 223, 231, 1,
+       3, 48, 229, 223, 1, 3, 48, 223, 224, 1, 3, 229, 60, 233, 1, 3, 233, 223, 229, 1,
+3, 2, 233, 232, 1, 3, 2, 232, 237, 1, 3, 233, 60, 234, 1, 3, 234, 232, 233, 1,
+       3, 42, 235, 232, 1, 3, 42, 232, 234, 1, 3, 235, 64, 237, 1, 3, 237, 232, 235, 1,
+       3, 11, 160, 159, 1, 3, 11, 159, 228, 1, 3, 160, 43, 238, 1, 3, 238, 159, 160, 1,
+       3, 42, 234, 159, 1, 3, 42, 159, 238, 1, 3, 234, 60, 228, 1, 3, 228, 159, 234, 1,
+3, 8, 208, 150, 1, 3, 8, 150, 151, 1, 3, 208, 55, 239, 1, 3, 239, 150, 208, 1,
+       3, 42, 238, 150, 1, 3, 42, 150, 239, 1, 3, 238, 43, 151, 1, 3, 151, 150, 238, 1,
+3, 3, 241, 202, 1, 3, 3, 202, 203, 1, 3, 241, 64, 235, 1, 3, 235, 202, 241, 1,
+       3, 42, 239, 202, 1, 3, 42, 202, 235, 1, 3, 239, 55, 203, 1, 3, 203, 202, 239, 1,
+       3, 245, 2, 237, 1, 3, 237, 236, 245, 1, 3, 64, 242, 236, 1, 3, 64, 236, 237, 1,
+       3, 242, 63, 244, 1, 3, 244, 236, 242, 1, 3, 68, 245, 236, 1, 3, 68, 236, 244, 1,
+       3, 241, 3, 246, 1, 3, 246, 240, 241, 1, 3, 65, 248, 240, 1, 3, 65, 240, 246, 1,
+       3, 248, 63, 242, 1, 3, 242, 240, 248, 1, 3, 64, 241, 240, 1, 3, 64, 240, 242, 1,
+3, 4, 250, 247, 1, 3, 4, 247, 253, 1, 3, 67, 251, 247, 1, 3, 67, 247, 250, 1,
+       3, 63, 248, 247, 1, 3, 63, 247, 251, 1, 3, 65, 253, 247, 1, 3, 65, 247, 248, 1,
+3, 7, 255, 243, 1, 3, 7, 243, 257, 1, 3, 68, 244, 243, 1, 3, 68, 243, 255, 1,
+       3, 63, 251, 243, 1, 3, 63, 243, 244, 1, 3, 67, 257, 243, 1, 3, 67, 243, 251, 1,
+       3, 246, 3, 206, 1, 3, 206, 205, 246, 1, 3, 54, 258, 205, 1, 3, 54, 205, 206, 1,
+       3, 258, 53, 259, 1, 3, 259, 205, 258, 1, 3, 65, 246, 205, 1, 3, 65, 205, 259, 1,
+3, 1, 260, 195, 1, 3, 1, 195, 196, 1, 3, 260, 69, 262, 1, 3, 262, 195, 260, 1,
+       3, 53, 258, 195, 1, 3, 53, 195, 262, 1, 3, 258, 54, 196, 1, 3, 196, 195, 258, 1,
+       3, 267, 5, 264, 1, 3, 264, 261, 267, 1, 3, 70, 265, 261, 1, 3, 70, 261, 264, 1,
+       3, 53, 262, 261, 1, 3, 53, 261, 265, 1, 3, 262, 69, 267, 1, 3, 267, 261, 262, 1,
+3, 4, 253, 252, 1, 3, 4, 252, 268, 1, 3, 253, 65, 259, 1, 3, 259, 252, 253, 1,
+       3, 53, 265, 252, 1, 3, 53, 252, 259, 1, 3, 70, 268, 252, 1, 3, 70, 252, 265, 1,
+3, 1, 214, 213, 1, 3, 1, 213, 260, 1, 3, 214, 59, 269, 1, 3, 269, 213, 214, 1,
+       3, 58, 270, 213, 1, 3, 58, 213, 269, 1, 3, 270, 69, 260, 1, 3, 260, 213, 270, 1,
+3, 0, 271, 218, 1, 3, 0, 218, 219, 1, 3, 271, 71, 273, 1, 3, 273, 218, 271, 1,
+       3, 58, 269, 218, 1, 3, 58, 218, 273, 1, 3, 269, 59, 219, 1, 3, 219, 218, 269, 1,
+3, 6, 275, 272, 1, 3, 6, 272, 278, 1, 3, 72, 276, 272, 1, 3, 72, 272, 275, 1,
+       3, 58, 273, 272, 1, 3, 58, 272, 276, 1, 3, 273, 71, 278, 1, 3, 278, 272, 273, 1,
+3, 5, 267, 266, 1, 3, 5, 266, 279, 1, 3, 267, 69, 270, 1, 3, 270, 266, 267, 1,
+       3, 58, 276, 266, 1, 3, 58, 266, 270, 1, 3, 72, 279, 266, 1, 3, 72, 266, 276, 1,
+3, 0, 226, 225, 1, 3, 0, 225, 271, 1, 3, 226, 62, 280, 1, 3, 280, 225, 226, 1,
+       3, 61, 281, 225, 1, 3, 61, 225, 280, 1, 3, 281, 71, 271, 1, 3, 271, 225, 281, 1,
+       3, 231, 2, 245, 1, 3, 245, 230, 231, 1, 3, 68, 282, 230, 1, 3, 68, 230, 245, 1,
+       3, 282, 61, 280, 1, 3, 280, 230, 282, 1, 3, 62, 231, 230, 1, 3, 62, 230, 280, 1,
+3, 7, 283, 254, 1, 3, 7, 254, 255, 1, 3, 73, 284, 254, 1, 3, 73, 254, 283, 1,
+       3, 61, 282, 254, 1, 3, 61, 254, 284, 1, 3, 282, 68, 255, 1, 3, 255, 254, 282, 1,
+       3, 285, 6, 278, 1, 3, 278, 277, 285, 1, 3, 278, 71, 281, 1, 3, 281, 277, 278, 1,
+       3, 61, 284, 277, 1, 3, 61, 277, 281, 1, 3, 73, 285, 277, 1, 3, 73, 277, 284, 1,
+3, 4, 268, 249, 1, 3, 4, 249, 250, 1, 3, 268, 70, 286, 1, 3, 286, 249, 268, 1,
+       3, 66, 287, 249, 1, 3, 66, 249, 286, 1, 3, 287, 67, 250, 1, 3, 250, 249, 287, 1,
+3, 5, 279, 263, 1, 3, 5, 263, 264, 1, 3, 279, 72, 288, 1, 3, 288, 263, 279, 1,
+       3, 66, 286, 263, 1, 3, 66, 263, 288, 1, 3, 286, 70, 264, 1, 3, 264, 263, 286, 1,
+3, 6, 285, 274, 1, 3, 6, 274, 275, 1, 3, 285, 73, 289, 1, 3, 289, 274, 285, 1,
+       3, 66, 288, 274, 1, 3, 66, 274, 289, 1, 3, 288, 72, 275, 1, 3, 275, 274, 288, 1,
+3, 7, 257, 256, 1, 3, 7, 256, 283, 1, 3, 257, 67, 287, 1, 3, 287, 256, 257, 1,
+       3, 66, 289, 256, 1, 3, 66, 256, 287, 1, 3, 289, 73, 283, 1, 3, 283, 256, 289, 1,
+
+       0
+};
+
+struct lwo  LWO_s1_3 =
+{
+       290,                    /* number of points */
+       s1_3_PNTS, s1_3_normals, s1_3_POLS, 0L
+};
+
+#endif /* USE_GL */
+
+/* End of s1_3.c */
diff --git a/hacks/glx/s1_4.c b/hacks/glx/s1_4.c
new file mode 100644 (file)
index 0000000..1b3406d
--- /dev/null
@@ -0,0 +1,1057 @@
+#if !defined( lint ) && !defined( SABER )
+static const char sccsid[] = "@(#)s1_4.c       4.04 97/07/28 xlockmore";
+
+#endif
+
+/*-
+ * Points, polygons, and normal vectors to render "s1_4" in 3D.
+ *
+ * Generated by lw2ogl.  Link this with your program but do
+ * not edit by hand.
+ */
+
+#ifndef STANDALONE
+#include "xlock.h"
+#endif
+
+#ifdef USE_GL
+
+#ifdef STANDALONE
+#include <GL/glx.h>
+#endif
+#include <GL/gl.h>
+#include "buildlwo.h"
+
+static GLfloat s1_4_PNTS[] =
+{
+       (GLfloat) 0.691977, (GLfloat) 0.424648, (GLfloat) - 0.335934,
+       (GLfloat) 0.691977, (GLfloat) 0.424648, (GLfloat) - 0.664066,
+       (GLfloat) 0.910107, (GLfloat) 0.206343, (GLfloat) - 0.335934,
+       (GLfloat) 0.910107, (GLfloat) 0.206343, (GLfloat) - 0.664066,
+       (GLfloat) 0.820528, (GLfloat) 0.154011, (GLfloat) - 0.638667,
+       (GLfloat) 0.608078, (GLfloat) 0.332278, (GLfloat) - 0.638667,
+       (GLfloat) 0.608078, (GLfloat) 0.332278, (GLfloat) - 0.361333,
+       (GLfloat) 0.820528, (GLfloat) 0.154011, (GLfloat) - 0.361333,
+       (GLfloat) 1.065609, (GLfloat) 0.289676, (GLfloat) - 0.638205,
+       (GLfloat) 1.074101, (GLfloat) 0.505017, (GLfloat) - 0.638205,
+       (GLfloat) 1.074101, (GLfloat) 0.505017, (GLfloat) - 0.361795,
+       (GLfloat) 1.065609, (GLfloat) 0.289676, (GLfloat) - 0.361795,
+       (GLfloat) 1.235562, (GLfloat) 0.083949, (GLfloat) - 0.664066,
+       (GLfloat) 1.235562, (GLfloat) 0.083949, (GLfloat) - 0.335934,
+       (GLfloat) 1.331736, (GLfloat) 0.017726, (GLfloat) - 0.361333,
+       (GLfloat) 1.331736, (GLfloat) 0.017726, (GLfloat) - 0.638667,
+       (GLfloat) 1.431839, (GLfloat) 0.331232, (GLfloat) - 0.335934,
+       (GLfloat) 1.517309, (GLfloat) 0.223825, (GLfloat) - 0.361333,
+       (GLfloat) 1.431839, (GLfloat) 0.331232, (GLfloat) - 0.664066,
+       (GLfloat) 1.517309, (GLfloat) 0.223825, (GLfloat) - 0.638667,
+       (GLfloat) 1.243033, (GLfloat) - 0.034453, (GLfloat) - 0.500000,
+       (GLfloat) 1.136909, (GLfloat) 0.161755, (GLfloat) - 0.500000,
+       (GLfloat) 1.199875, (GLfloat) 0.038989, (GLfloat) - 0.500000,
+       (GLfloat) 1.400739, (GLfloat) 0.142695, (GLfloat) - 0.261940,
+       (GLfloat) 1.284897, (GLfloat) 0.013483, (GLfloat) - 0.325812,
+       (GLfloat) 1.438241, (GLfloat) 0.108423, (GLfloat) - 0.500000,
+       (GLfloat) 1.310688, (GLfloat) - 0.015661, (GLfloat) - 0.500000,
+       (GLfloat) 1.400739, (GLfloat) 0.142695, (GLfloat) - 0.738060,
+       (GLfloat) 1.284897, (GLfloat) 0.013483, (GLfloat) - 0.674188,
+       (GLfloat) 1.216443, (GLfloat) 0.317256, (GLfloat) - 0.300040,
+       (GLfloat) 1.333700, (GLfloat) 0.207591, (GLfloat) - 0.276273,
+       (GLfloat) 1.558444, (GLfloat) 0.319842, (GLfloat) - 0.500000,
+       (GLfloat) 1.515677, (GLfloat) 0.272720, (GLfloat) - 0.325812,
+       (GLfloat) 1.429500, (GLfloat) 0.116294, (GLfloat) - 0.322437,
+       (GLfloat) 1.295978, (GLfloat) 0.472757, (GLfloat) - 0.500000,
+       (GLfloat) 1.467526, (GLfloat) 0.376193, (GLfloat) - 0.500000,
+       (GLfloat) 1.515677, (GLfloat) 0.272720, (GLfloat) - 0.674188,
+       (GLfloat) 1.548313, (GLfloat) 0.248248, (GLfloat) - 0.500000,
+       (GLfloat) 1.216443, (GLfloat) 0.317256, (GLfloat) - 0.699960,
+       (GLfloat) 1.333700, (GLfloat) 0.207591, (GLfloat) - 0.723727,
+       (GLfloat) 1.429500, (GLfloat) 0.116294, (GLfloat) - 0.677562,
+       (GLfloat) 1.158118, (GLfloat) 0.203222, (GLfloat) - 0.646637,
+       (GLfloat) 0.998811, (GLfloat) 0.235426, (GLfloat) - 0.500000,
+       (GLfloat) 1.064065, (GLfloat) 0.250523, (GLfloat) - 0.500000,
+       (GLfloat) 1.158118, (GLfloat) 0.203222, (GLfloat) - 0.353363,
+       (GLfloat) 1.274769, (GLfloat) 0.431290, (GLfloat) - 0.646637,
+       (GLfloat) 0.920924, (GLfloat) 0.379919, (GLfloat) - 0.699960,
+       (GLfloat) 1.069855, (GLfloat) 0.397346, (GLfloat) - 0.688461,
+       (GLfloat) 0.920924, (GLfloat) 0.379919, (GLfloat) - 0.300040,
+       (GLfloat) 1.069855, (GLfloat) 0.397346, (GLfloat) - 0.311539,
+       (GLfloat) 1.274769, (GLfloat) 0.431290, (GLfloat) - 0.353363,
+       (GLfloat) 0.843038, (GLfloat) 0.524412, (GLfloat) - 0.500000,
+       (GLfloat) 1.075645, (GLfloat) 0.544169, (GLfloat) - 0.500000,
+       (GLfloat) 0.735693, (GLfloat) 0.265534, (GLfloat) - 0.738060,
+       (GLfloat) 0.801042, (GLfloat) 0.315496, (GLfloat) - 0.723727,
+       (GLfloat) 0.978041, (GLfloat) 0.273957, (GLfloat) - 0.646637,
+       (GLfloat) 0.863808, (GLfloat) 0.485881, (GLfloat) - 0.646637,
+       (GLfloat) 0.863808, (GLfloat) 0.485881, (GLfloat) - 0.353363,
+       (GLfloat) 0.555594, (GLfloat) 0.419060, (GLfloat) - 0.500000,
+       (GLfloat) 0.652318, (GLfloat) 0.464340, (GLfloat) - 0.500000,
+       (GLfloat) 0.978041, (GLfloat) 0.273957, (GLfloat) - 0.353363,
+       (GLfloat) 0.735693, (GLfloat) 0.265534, (GLfloat) - 0.261940,
+       (GLfloat) 0.801042, (GLfloat) 0.315496, (GLfloat) - 0.276273,
+       (GLfloat) 0.915792, (GLfloat) 0.112008, (GLfloat) - 0.500000,
+       (GLfloat) 0.949767, (GLfloat) 0.166652, (GLfloat) - 0.500000,
+       (GLfloat) 0.867858, (GLfloat) 0.153664, (GLfloat) - 0.674188,
+       (GLfloat) 0.702437, (GLfloat) 0.229003, (GLfloat) - 0.500000,
+       (GLfloat) 0.846018, (GLfloat) 0.123878, (GLfloat) - 0.500000,
+       (GLfloat) 0.867858, (GLfloat) 0.153664, (GLfloat) - 0.325812,
+       (GLfloat) 0.604310, (GLfloat) 0.378335, (GLfloat) - 0.674188,
+       (GLfloat) 0.709997, (GLfloat) 0.238013, (GLfloat) - 0.677562,
+       (GLfloat) 0.604310, (GLfloat) 0.378335, (GLfloat) - 0.325812,
+       (GLfloat) 0.573976, (GLfloat) 0.352148, (GLfloat) - 0.500000,
+       (GLfloat) 0.709997, (GLfloat) 0.238013, (GLfloat) - 0.322437,
+       (GLfloat) 1.231827, (GLfloat) 0.004686, (GLfloat) - 0.594296,
+       (GLfloat) 1.178115, (GLfloat) 0.109780, (GLfloat) - 0.584482,
+       (GLfloat) 1.208797, (GLfloat) 0.050229, (GLfloat) - 0.589491,
+       (GLfloat) 1.231827, (GLfloat) 0.004686, (GLfloat) - 0.405704,
+       (GLfloat) 1.221734, (GLfloat) - 0.007055, (GLfloat) - 0.500000,
+       (GLfloat) 1.279887, (GLfloat) - 0.026194, (GLfloat) - 0.587500,
+       (GLfloat) 1.253444, (GLfloat) - 0.022303, (GLfloat) - 0.594949,
+       (GLfloat) 1.312568, (GLfloat) 0.098620, (GLfloat) - 0.720025,
+       (GLfloat) 1.262105, (GLfloat) 0.039911, (GLfloat) - 0.672877,
+       (GLfloat) 1.312568, (GLfloat) 0.098620, (GLfloat) - 0.279975,
+       (GLfloat) 1.262105, (GLfloat) 0.039911, (GLfloat) - 0.327123,
+       (GLfloat) 1.279887, (GLfloat) - 0.026194, (GLfloat) - 0.412500,
+       (GLfloat) 1.253444, (GLfloat) - 0.022303, (GLfloat) - 0.405051,
+       (GLfloat) 1.178115, (GLfloat) 0.109780, (GLfloat) - 0.415518,
+       (GLfloat) 1.208797, (GLfloat) 0.050229, (GLfloat) - 0.410509,
+       (GLfloat) 1.373428, (GLfloat) 0.045002, (GLfloat) - 0.409500,
+       (GLfloat) 1.317700, (GLfloat) - 0.004566, (GLfloat) - 0.417500,
+       (GLfloat) 1.270418, (GLfloat) - 0.038526, (GLfloat) - 0.500000,
+       (GLfloat) 1.359179, (GLfloat) 0.061869, (GLfloat) - 0.294000,
+       (GLfloat) 1.309178, (GLfloat) 0.008154, (GLfloat) - 0.339125,
+       (GLfloat) 1.359179, (GLfloat) 0.061869, (GLfloat) - 0.706000,
+       (GLfloat) 1.309178, (GLfloat) 0.008154, (GLfloat) - 0.660875,
+       (GLfloat) 1.373428, (GLfloat) 0.045002, (GLfloat) - 0.590500,
+       (GLfloat) 1.317700, (GLfloat) - 0.004566, (GLfloat) - 0.582500,
+       (GLfloat) 1.236552, (GLfloat) 0.195985, (GLfloat) - 0.302876,
+       (GLfloat) 1.280170, (GLfloat) 0.140150, (GLfloat) - 0.291188,
+       (GLfloat) 1.433681, (GLfloat) 0.239521, (GLfloat) - 0.279975,
+       (GLfloat) 1.373124, (GLfloat) 0.169070, (GLfloat) - 0.264259,
+       (GLfloat) 1.337615, (GLfloat) 0.072243, (GLfloat) - 0.277994,
+       (GLfloat) 1.514422, (GLfloat) 0.333454, (GLfloat) - 0.405704,
+       (GLfloat) 1.484144, (GLfloat) 0.298229, (GLfloat) - 0.327123,
+       (GLfloat) 1.476277, (GLfloat) 0.191919, (GLfloat) - 0.294000,
+       (GLfloat) 1.463411, (GLfloat) 0.213552, (GLfloat) - 0.277994,
+       (GLfloat) 1.324207, (GLfloat) 0.325294, (GLfloat) - 0.302876,
+       (GLfloat) 1.387230, (GLfloat) 0.275032, (GLfloat) - 0.291188,
+       (GLfloat) 1.494540, (GLfloat) 0.179511, (GLfloat) - 0.409500,
+       (GLfloat) 1.483059, (GLfloat) 0.179084, (GLfloat) - 0.335375,
+       (GLfloat) 1.418631, (GLfloat) 0.126081, (GLfloat) - 0.278500,
+       (GLfloat) 1.555568, (GLfloat) 0.279982, (GLfloat) - 0.412500,
+       (GLfloat) 1.524471, (GLfloat) 0.247261, (GLfloat) - 0.339125,
+       (GLfloat) 1.372652, (GLfloat) 0.056465, (GLfloat) - 0.335375,
+       (GLfloat) 1.382643, (GLfloat) 0.411500, (GLfloat) - 0.415518,
+       (GLfloat) 1.458604, (GLfloat) 0.364953, (GLfloat) - 0.410509,
+       (GLfloat) 1.514422, (GLfloat) 0.333454, (GLfloat) - 0.594296,
+       (GLfloat) 1.524515, (GLfloat) 0.345196, (GLfloat) - 0.500000,
+       (GLfloat) 1.547582, (GLfloat) 0.308099, (GLfloat) - 0.405051,
+       (GLfloat) 1.433681, (GLfloat) 0.239521, (GLfloat) - 0.720025,
+       (GLfloat) 1.484144, (GLfloat) 0.298229, (GLfloat) - 0.672877,
+       (GLfloat) 1.555568, (GLfloat) 0.279982, (GLfloat) - 0.587500,
+       (GLfloat) 1.547582, (GLfloat) 0.308099, (GLfloat) - 0.594949,
+       (GLfloat) 1.382643, (GLfloat) 0.411500, (GLfloat) - 0.584482,
+       (GLfloat) 1.458604, (GLfloat) 0.364953, (GLfloat) - 0.589491,
+       (GLfloat) 1.494540, (GLfloat) 0.179511, (GLfloat) - 0.590500,
+       (GLfloat) 1.538011, (GLfloat) 0.240115, (GLfloat) - 0.582500,
+       (GLfloat) 1.566843, (GLfloat) 0.290687, (GLfloat) - 0.500000,
+       (GLfloat) 1.476277, (GLfloat) 0.191919, (GLfloat) - 0.706000,
+       (GLfloat) 1.524471, (GLfloat) 0.247261, (GLfloat) - 0.660875,
+       (GLfloat) 1.538011, (GLfloat) 0.240115, (GLfloat) - 0.417500,
+       (GLfloat) 1.324207, (GLfloat) 0.325294, (GLfloat) - 0.697124,
+       (GLfloat) 1.387230, (GLfloat) 0.275032, (GLfloat) - 0.708812,
+       (GLfloat) 1.373124, (GLfloat) 0.169070, (GLfloat) - 0.735741,
+       (GLfloat) 1.463411, (GLfloat) 0.213552, (GLfloat) - 0.722006,
+       (GLfloat) 1.337615, (GLfloat) 0.072243, (GLfloat) - 0.722006,
+       (GLfloat) 1.236552, (GLfloat) 0.195985, (GLfloat) - 0.697124,
+       (GLfloat) 1.280170, (GLfloat) 0.140150, (GLfloat) - 0.708812,
+       (GLfloat) 1.372652, (GLfloat) 0.056465, (GLfloat) - 0.664625,
+       (GLfloat) 1.418631, (GLfloat) 0.126081, (GLfloat) - 0.721500,
+       (GLfloat) 1.483059, (GLfloat) 0.179084, (GLfloat) - 0.664625,
+       (GLfloat) 1.436048, (GLfloat) 0.110398, (GLfloat) - 0.402250,
+       (GLfloat) 1.370641, (GLfloat) 0.037756, (GLfloat) - 0.500000,
+       (GLfloat) 1.501456, (GLfloat) 0.183040, (GLfloat) - 0.500000,
+       (GLfloat) 1.436048, (GLfloat) 0.110398, (GLfloat) - 0.597750,
+       (GLfloat) 1.200029, (GLfloat) 0.142107, (GLfloat) - 0.654883,
+       (GLfloat) 1.103513, (GLfloat) 0.226037, (GLfloat) - 0.576713,
+       (GLfloat) 1.142211, (GLfloat) 0.172121, (GLfloat) - 0.579984,
+       (GLfloat) 1.170811, (GLfloat) 0.099004, (GLfloat) - 0.500000,
+       (GLfloat) 1.027452, (GLfloat) 0.263727, (GLfloat) - 0.576713,
+       (GLfloat) 1.064451, (GLfloat) 0.260311, (GLfloat) - 0.575384,
+       (GLfloat) 1.103513, (GLfloat) 0.226037, (GLfloat) - 0.423287,
+       (GLfloat) 1.100538, (GLfloat) 0.216006, (GLfloat) - 0.500000,
+       (GLfloat) 1.127320, (GLfloat) 0.306289, (GLfloat) - 0.678998,
+       (GLfloat) 1.112441, (GLfloat) 0.256132, (GLfloat) - 0.640641,
+       (GLfloat) 1.127320, (GLfloat) 0.306289, (GLfloat) - 0.321002,
+       (GLfloat) 1.112441, (GLfloat) 0.256132, (GLfloat) - 0.359359,
+       (GLfloat) 1.142211, (GLfloat) 0.172121, (GLfloat) - 0.420016,
+       (GLfloat) 1.027452, (GLfloat) 0.263727, (GLfloat) - 0.423287,
+       (GLfloat) 1.064451, (GLfloat) 0.260311, (GLfloat) - 0.424615,
+       (GLfloat) 1.200029, (GLfloat) 0.142107, (GLfloat) - 0.345117,
+       (GLfloat) 1.360730, (GLfloat) 0.379173, (GLfloat) - 0.654883,
+       (GLfloat) 1.163029, (GLfloat) 0.426667, (GLfloat) - 0.678998,
+       (GLfloat) 1.248257, (GLfloat) 0.379456, (GLfloat) - 0.686629,
+       (GLfloat) 1.280379, (GLfloat) 0.260640, (GLfloat) - 0.711204,
+       (GLfloat) 0.979330, (GLfloat) 0.456830, (GLfloat) - 0.678998,
+       (GLfloat) 1.072171, (GLfloat) 0.456076, (GLfloat) - 0.675897,
+       (GLfloat) 1.145175, (GLfloat) 0.366478, (GLfloat) - 0.691783,
+       (GLfloat) 1.186836, (GLfloat) 0.506919, (GLfloat) - 0.576713,
+       (GLfloat) 1.177908, (GLfloat) 0.476825, (GLfloat) - 0.640641,
+       (GLfloat) 1.184630, (GLfloat) 0.255055, (GLfloat) - 0.686629,
+       (GLfloat) 1.008203, (GLfloat) 0.340968, (GLfloat) - 0.678998,
+       (GLfloat) 1.067539, (GLfloat) 0.338617, (GLfloat) - 0.675897,
+       (GLfloat) 1.280379, (GLfloat) 0.260640, (GLfloat) - 0.288796,
+       (GLfloat) 1.163029, (GLfloat) 0.426667, (GLfloat) - 0.321002,
+       (GLfloat) 1.248257, (GLfloat) 0.379456, (GLfloat) - 0.313371,
+       (GLfloat) 1.360730, (GLfloat) 0.379173, (GLfloat) - 0.345117,
+       (GLfloat) 1.184630, (GLfloat) 0.255055, (GLfloat) - 0.313371,
+       (GLfloat) 1.008203, (GLfloat) 0.340968, (GLfloat) - 0.321002,
+       (GLfloat) 1.067539, (GLfloat) 0.338617, (GLfloat) - 0.324103,
+       (GLfloat) 1.145175, (GLfloat) 0.366478, (GLfloat) - 0.308217,
+       (GLfloat) 1.186836, (GLfloat) 0.506919, (GLfloat) - 0.423287,
+       (GLfloat) 1.177908, (GLfloat) 0.476825, (GLfloat) - 0.359359,
+       (GLfloat) 0.979330, (GLfloat) 0.456830, (GLfloat) - 0.321002,
+       (GLfloat) 1.072171, (GLfloat) 0.456076, (GLfloat) - 0.324103,
+       (GLfloat) 1.389948, (GLfloat) 0.422275, (GLfloat) - 0.500000,
+       (GLfloat) 1.290676, (GLfloat) 0.462390, (GLfloat) - 0.579984,
+       (GLfloat) 1.290676, (GLfloat) 0.462390, (GLfloat) - 0.420016,
+       (GLfloat) 0.960081, (GLfloat) 0.534071, (GLfloat) - 0.423287,
+       (GLfloat) 1.075259, (GLfloat) 0.534381, (GLfloat) - 0.424615,
+       (GLfloat) 1.189812, (GLfloat) 0.516951, (GLfloat) - 0.500000,
+       (GLfloat) 0.960081, (GLfloat) 0.534071, (GLfloat) - 0.576713,
+       (GLfloat) 1.075259, (GLfloat) 0.534381, (GLfloat) - 0.575384,
+       (GLfloat) 0.808756, (GLfloat) 0.407522, (GLfloat) - 0.697124,
+       (GLfloat) 0.693423, (GLfloat) 0.349037, (GLfloat) - 0.720025,
+       (GLfloat) 0.741552, (GLfloat) 0.375033, (GLfloat) - 0.708812,
+       (GLfloat) 0.901933, (GLfloat) 0.290859, (GLfloat) - 0.697124,
+       (GLfloat) 0.855345, (GLfloat) 0.349190, (GLfloat) - 0.711204,
+       (GLfloat) 0.889770, (GLfloat) 0.437716, (GLfloat) - 0.686629,
+       (GLfloat) 0.746638, (GLfloat) 0.485298, (GLfloat) - 0.584482,
+       (GLfloat) 0.769932, (GLfloat) 0.456132, (GLfloat) - 0.654883,
+       (GLfloat) 0.964051, (GLfloat) 0.213083, (GLfloat) - 0.584482,
+       (GLfloat) 0.940757, (GLfloat) 0.242249, (GLfloat) - 0.654883,
+       (GLfloat) 0.952079, (GLfloat) 0.322122, (GLfloat) - 0.686629,
+       (GLfloat) 0.830643, (GLfloat) 0.226200, (GLfloat) - 0.720025,
+       (GLfloat) 0.860532, (GLfloat) 0.255958, (GLfloat) - 0.708812,
+       (GLfloat) 0.993766, (GLfloat) 0.398899, (GLfloat) - 0.691783,
+       (GLfloat) 1.020234, (GLfloat) 0.292692, (GLfloat) - 0.640641,
+       (GLfloat) 0.967299, (GLfloat) 0.505105, (GLfloat) - 0.640641,
+       (GLfloat) 0.848231, (GLfloat) 0.514780, (GLfloat) - 0.579984,
+       (GLfloat) 0.746638, (GLfloat) 0.485298, (GLfloat) - 0.415518,
+       (GLfloat) 0.738873, (GLfloat) 0.495020, (GLfloat) - 0.500000,
+       (GLfloat) 0.601944, (GLfloat) 0.430927, (GLfloat) - 0.594296,
+       (GLfloat) 0.662233, (GLfloat) 0.454417, (GLfloat) - 0.589491,
+       (GLfloat) 0.957675, (GLfloat) 0.543726, (GLfloat) - 0.500000,
+       (GLfloat) 0.967299, (GLfloat) 0.505105, (GLfloat) - 0.359359,
+       (GLfloat) 0.848231, (GLfloat) 0.514780, (GLfloat) - 0.420016,
+       (GLfloat) 0.601944, (GLfloat) 0.430927, (GLfloat) - 0.405704,
+       (GLfloat) 0.662233, (GLfloat) 0.454417, (GLfloat) - 0.410509,
+       (GLfloat) 0.808756, (GLfloat) 0.407522, (GLfloat) - 0.302876,
+       (GLfloat) 0.769932, (GLfloat) 0.456132, (GLfloat) - 0.345117,
+       (GLfloat) 0.889770, (GLfloat) 0.437716, (GLfloat) - 0.313371,
+       (GLfloat) 0.901933, (GLfloat) 0.290859, (GLfloat) - 0.302876,
+       (GLfloat) 0.855345, (GLfloat) 0.349190, (GLfloat) - 0.288796,
+       (GLfloat) 0.693423, (GLfloat) 0.349037, (GLfloat) - 0.279975,
+       (GLfloat) 0.741552, (GLfloat) 0.375033, (GLfloat) - 0.291188,
+       (GLfloat) 0.993766, (GLfloat) 0.398899, (GLfloat) - 0.308217,
+       (GLfloat) 1.020234, (GLfloat) 0.292692, (GLfloat) - 0.359359,
+       (GLfloat) 0.952079, (GLfloat) 0.322122, (GLfloat) - 0.313371,
+       (GLfloat) 0.830643, (GLfloat) 0.226200, (GLfloat) - 0.279975,
+       (GLfloat) 0.860532, (GLfloat) 0.255958, (GLfloat) - 0.291188,
+       (GLfloat) 0.964051, (GLfloat) 0.213083, (GLfloat) - 0.415518,
+       (GLfloat) 0.940757, (GLfloat) 0.242249, (GLfloat) - 0.345117,
+       (GLfloat) 0.993618, (GLfloat) 0.245059, (GLfloat) - 0.420016,
+       (GLfloat) 0.971816, (GLfloat) 0.203361, (GLfloat) - 0.500000,
+       (GLfloat) 0.922122, (GLfloat) 0.144310, (GLfloat) - 0.405704,
+       (GLfloat) 0.939852, (GLfloat) 0.176575, (GLfloat) - 0.410509,
+       (GLfloat) 1.029858, (GLfloat) 0.254072, (GLfloat) - 0.500000,
+       (GLfloat) 0.993618, (GLfloat) 0.245059, (GLfloat) - 0.579984,
+       (GLfloat) 0.922122, (GLfloat) 0.144310, (GLfloat) - 0.594296,
+       (GLfloat) 0.939852, (GLfloat) 0.176575, (GLfloat) - 0.589491,
+       (GLfloat) 0.933557, (GLfloat) 0.134073, (GLfloat) - 0.500000,
+       (GLfloat) 0.877985, (GLfloat) 0.117734, (GLfloat) - 0.412500,
+       (GLfloat) 0.903840, (GLfloat) 0.122594, (GLfloat) - 0.405051,
+       (GLfloat) 0.887817, (GLfloat) 0.175019, (GLfloat) - 0.327123,
+       (GLfloat) 0.887817, (GLfloat) 0.175019, (GLfloat) - 0.672877,
+       (GLfloat) 0.877985, (GLfloat) 0.117734, (GLfloat) - 0.587500,
+       (GLfloat) 0.903840, (GLfloat) 0.122594, (GLfloat) - 0.594949,
+       (GLfloat) 0.775446, (GLfloat) 0.175219, (GLfloat) - 0.590500,
+       (GLfloat) 0.837530, (GLfloat) 0.133890, (GLfloat) - 0.582500,
+       (GLfloat) 0.889078, (GLfloat) 0.106840, (GLfloat) - 0.500000,
+       (GLfloat) 0.787209, (GLfloat) 0.193905, (GLfloat) - 0.706000,
+       (GLfloat) 0.844199, (GLfloat) 0.147671, (GLfloat) - 0.660875,
+       (GLfloat) 0.787209, (GLfloat) 0.193905, (GLfloat) - 0.294000,
+       (GLfloat) 0.844199, (GLfloat) 0.147671, (GLfloat) - 0.339125,
+       (GLfloat) 0.775446, (GLfloat) 0.175219, (GLfloat) - 0.409500,
+       (GLfloat) 0.837530, (GLfloat) 0.133890, (GLfloat) - 0.417500,
+       (GLfloat) 0.762033, (GLfloat) 0.287619, (GLfloat) - 0.735741,
+       (GLfloat) 0.807717, (GLfloat) 0.204533, (GLfloat) - 0.722006,
+       (GLfloat) 0.636249, (GLfloat) 0.400218, (GLfloat) - 0.672877,
+       (GLfloat) 0.653151, (GLfloat) 0.306393, (GLfloat) - 0.706000,
+       (GLfloat) 0.664060, (GLfloat) 0.327000, (GLfloat) - 0.722006,
+       (GLfloat) 0.636792, (GLfloat) 0.291564, (GLfloat) - 0.590500,
+       (GLfloat) 0.648221, (GLfloat) 0.292739, (GLfloat) - 0.664625,
+       (GLfloat) 0.719399, (GLfloat) 0.249218, (GLfloat) - 0.721500,
+       (GLfloat) 0.562375, (GLfloat) 0.382563, (GLfloat) - 0.587500,
+       (GLfloat) 0.597724, (GLfloat) 0.354488, (GLfloat) - 0.660875,
+       (GLfloat) 0.774619, (GLfloat) 0.186679, (GLfloat) - 0.664625,
+       (GLfloat) 0.590509, (GLfloat) 0.441164, (GLfloat) - 0.500000,
+       (GLfloat) 0.567937, (GLfloat) 0.408940, (GLfloat) - 0.594949,
+       (GLfloat) 0.636249, (GLfloat) 0.400218, (GLfloat) - 0.327123,
+       (GLfloat) 0.562375, (GLfloat) 0.382563, (GLfloat) - 0.412500,
+       (GLfloat) 0.567937, (GLfloat) 0.408940, (GLfloat) - 0.405051,
+       (GLfloat) 0.636792, (GLfloat) 0.291564, (GLfloat) - 0.409500,
+       (GLfloat) 0.585310, (GLfloat) 0.345528, (GLfloat) - 0.417500,
+       (GLfloat) 0.549720, (GLfloat) 0.391595, (GLfloat) - 0.500000,
+       (GLfloat) 0.653151, (GLfloat) 0.306393, (GLfloat) - 0.294000,
+       (GLfloat) 0.597724, (GLfloat) 0.354488, (GLfloat) - 0.339125,
+       (GLfloat) 0.585310, (GLfloat) 0.345528, (GLfloat) - 0.582500,
+       (GLfloat) 0.762033, (GLfloat) 0.287619, (GLfloat) - 0.264259,
+       (GLfloat) 0.664060, (GLfloat) 0.327000, (GLfloat) - 0.277994,
+       (GLfloat) 0.807717, (GLfloat) 0.204533, (GLfloat) - 0.277994,
+       (GLfloat) 0.774619, (GLfloat) 0.186679, (GLfloat) - 0.335375,
+       (GLfloat) 0.719399, (GLfloat) 0.249218, (GLfloat) - 0.278500,
+       (GLfloat) 0.648221, (GLfloat) 0.292739, (GLfloat) - 0.335375,
+       (GLfloat) 0.704334, (GLfloat) 0.231264, (GLfloat) - 0.597750,
+       (GLfloat) 0.779215, (GLfloat) 0.168431, (GLfloat) - 0.500000,
+       (GLfloat) 0.629453, (GLfloat) 0.294096, (GLfloat) - 0.500000,
+       (GLfloat) 0.704334, (GLfloat) 0.231264, (GLfloat) - 0.402250,
+};
+
+static GLfloat s1_4_normals[] =
+{
+       (GLfloat) - 0.797489, (GLfloat) - 0.388285, (GLfloat) - 0.461786,
+       (GLfloat) - 0.806184, (GLfloat) - 0.357959, (GLfloat) - 0.471096,
+       (GLfloat) - 0.893364, (GLfloat) - 0.424111, (GLfloat) - 0.148429,
+       (GLfloat) - 0.889195, (GLfloat) - 0.434532, (GLfloat) - 0.143226,
+       (GLfloat) - 0.778943, (GLfloat) - 0.605569, (GLfloat) - 0.162894,
+       (GLfloat) - 0.772426, (GLfloat) - 0.614820, (GLfloat) - 0.159231,
+       (GLfloat) - 0.666558, (GLfloat) - 0.549876, (GLfloat) - 0.503327,
+       (GLfloat) - 0.677911, (GLfloat) - 0.530666, (GLfloat) - 0.508753,
+       (GLfloat) - 0.797489, (GLfloat) - 0.388284, (GLfloat) 0.461786,
+       (GLfloat) - 0.806184, (GLfloat) - 0.357959, (GLfloat) 0.471097,
+       (GLfloat) - 0.677911, (GLfloat) - 0.530666, (GLfloat) 0.508753,
+       (GLfloat) - 0.666558, (GLfloat) - 0.549876, (GLfloat) 0.503327,
+       (GLfloat) - 0.778943, (GLfloat) - 0.605569, (GLfloat) 0.162893,
+       (GLfloat) - 0.772426, (GLfloat) - 0.614820, (GLfloat) 0.159231,
+       (GLfloat) - 0.889195, (GLfloat) - 0.434532, (GLfloat) 0.143226,
+       (GLfloat) - 0.893364, (GLfloat) - 0.424111, (GLfloat) 0.148429,
+       (GLfloat) 0.506235, (GLfloat) - 0.837464, (GLfloat) 0.205866,
+       (GLfloat) 0.527758, (GLfloat) - 0.830515, (GLfloat) 0.178091,
+       (GLfloat) 0.492576, (GLfloat) - 0.867532, (GLfloat) 0.068965,
+       (GLfloat) 0.502441, (GLfloat) - 0.861510, (GLfloat) 0.073162,
+       (GLfloat) - 0.106119, (GLfloat) - 0.984780, (GLfloat) 0.137644,
+       (GLfloat) - 0.145376, (GLfloat) - 0.977399, (GLfloat) 0.153482,
+       (GLfloat) 0.021131, (GLfloat) - 0.914284, (GLfloat) 0.404523,
+       (GLfloat) - 0.012401, (GLfloat) - 0.903702, (GLfloat) 0.427982,
+       (GLfloat) 0.527757, (GLfloat) - 0.830515, (GLfloat) - 0.178092,
+       (GLfloat) 0.506235, (GLfloat) - 0.837464, (GLfloat) - 0.205866,
+       (GLfloat) 0.021132, (GLfloat) - 0.914284, (GLfloat) - 0.404523,
+       (GLfloat) - 0.012401, (GLfloat) - 0.903702, (GLfloat) - 0.427983,
+       (GLfloat) - 0.145376, (GLfloat) - 0.977399, (GLfloat) - 0.153482,
+       (GLfloat) - 0.106119, (GLfloat) - 0.984780, (GLfloat) - 0.137645,
+       (GLfloat) 0.502441, (GLfloat) - 0.861510, (GLfloat) - 0.073162,
+       (GLfloat) 0.492576, (GLfloat) - 0.867532, (GLfloat) - 0.068965,
+       (GLfloat) - 0.548436, (GLfloat) - 0.209256, (GLfloat) 0.809586,
+       (GLfloat) - 0.557133, (GLfloat) - 0.173326, (GLfloat) 0.812134,
+       (GLfloat) - 0.281454, (GLfloat) 0.011196, (GLfloat) 0.959509,
+       (GLfloat) - 0.287811, (GLfloat) 0.033884, (GLfloat) 0.957087,
+       (GLfloat) - 0.161493, (GLfloat) - 0.079455, (GLfloat) 0.983670,
+       (GLfloat) - 0.160469, (GLfloat) - 0.081504, (GLfloat) 0.983670,
+       (GLfloat) - 0.417652, (GLfloat) - 0.317957, (GLfloat) 0.851158,
+       (GLfloat) - 0.412553, (GLfloat) - 0.327906, (GLfloat) 0.849869,
+       (GLfloat) 0.183686, (GLfloat) 0.514678, (GLfloat) 0.837476,
+       (GLfloat) 0.191133, (GLfloat) 0.514047, (GLfloat) 0.836196,
+       (GLfloat) 0.305019, (GLfloat) 0.420960, (GLfloat) 0.854258,
+       (GLfloat) 0.309443, (GLfloat) 0.419398, (GLfloat) 0.853434,
+       (GLfloat) 0.070662, (GLfloat) 0.160554, (GLfloat) 0.984494,
+       (GLfloat) 0.072116, (GLfloat) 0.157712, (GLfloat) 0.984848,
+       (GLfloat) - 0.043552, (GLfloat) 0.248570, (GLfloat) 0.967634,
+       (GLfloat) - 0.045553, (GLfloat) 0.254642, (GLfloat) 0.965962,
+       (GLfloat) 0.833765, (GLfloat) - 0.473703, (GLfloat) 0.283620,
+       (GLfloat) 0.823611, (GLfloat) - 0.501937, (GLfloat) 0.264054,
+       (GLfloat) 0.753164, (GLfloat) - 0.577527, (GLfloat) 0.314971,
+       (GLfloat) 0.750976, (GLfloat) - 0.585768, (GLfloat) 0.304813,
+       (GLfloat) 0.524744, (GLfloat) - 0.282162, (GLfloat) 0.803137,
+       (GLfloat) 0.515479, (GLfloat) - 0.259037, (GLfloat) 0.816812,
+       (GLfloat) 0.731077, (GLfloat) - 0.100383, (GLfloat) 0.674870,
+       (GLfloat) 0.725771, (GLfloat) - 0.074391, (GLfloat) 0.683903,
+       (GLfloat) 0.576854, (GLfloat) - 0.777370, (GLfloat) 0.250869,
+       (GLfloat) 0.569572, (GLfloat) - 0.770539, (GLfloat) 0.286108,
+       (GLfloat) 0.204307, (GLfloat) - 0.721596, (GLfloat) 0.661481,
+       (GLfloat) 0.158422, (GLfloat) - 0.717392, (GLfloat) 0.678418,
+       (GLfloat) 0.308874, (GLfloat) - 0.483661, (GLfloat) 0.818944,
+       (GLfloat) 0.351163, (GLfloat) - 0.495655, (GLfloat) 0.794362,
+       (GLfloat) 0.653090, (GLfloat) - 0.688670, (GLfloat) 0.314971,
+       (GLfloat) 0.661058, (GLfloat) - 0.685633, (GLfloat) 0.304812,
+       (GLfloat) 0.403257, (GLfloat) 0.770775, (GLfloat) 0.493244,
+       (GLfloat) 0.393266, (GLfloat) 0.772882, (GLfloat) 0.497991,
+       (GLfloat) 0.471763, (GLfloat) 0.867363, (GLfloat) 0.158497,
+       (GLfloat) 0.475196, (GLfloat) 0.865916, (GLfloat) 0.156134,
+       (GLfloat) 0.590364, (GLfloat) 0.790041, (GLfloat) 0.165246,
+       (GLfloat) 0.597402, (GLfloat) 0.785461, (GLfloat) 0.161746,
+       (GLfloat) 0.528711, (GLfloat) 0.679696, (GLfloat) 0.508407,
+       (GLfloat) 0.514728, (GLfloat) 0.686399, (GLfloat) 0.513723,
+       (GLfloat) 0.403257, (GLfloat) 0.770775, (GLfloat) - 0.493244,
+       (GLfloat) 0.393266, (GLfloat) 0.772882, (GLfloat) - 0.497991,
+       (GLfloat) 0.514728, (GLfloat) 0.686399, (GLfloat) - 0.513723,
+       (GLfloat) 0.528711, (GLfloat) 0.679696, (GLfloat) - 0.508407,
+       (GLfloat) 0.590364, (GLfloat) 0.790041, (GLfloat) - 0.165246,
+       (GLfloat) 0.597402, (GLfloat) 0.785461, (GLfloat) - 0.161746,
+       (GLfloat) 0.475196, (GLfloat) 0.865916, (GLfloat) - 0.156134,
+       (GLfloat) 0.471763, (GLfloat) 0.867363, (GLfloat) - 0.158497,
+       (GLfloat) 0.885792, (GLfloat) - 0.415923, (GLfloat) - 0.205866,
+       (GLfloat) 0.881131, (GLfloat) - 0.438054, (GLfloat) - 0.178091,
+       (GLfloat) 0.914268, (GLfloat) - 0.399196, (GLfloat) - 0.068966,
+       (GLfloat) 0.909310, (GLfloat) - 0.409637, (GLfloat) - 0.073163,
+       (GLfloat) 0.961663, (GLfloat) 0.236259, (GLfloat) - 0.139234,
+       (GLfloat) 0.949193, (GLfloat) 0.273441, (GLfloat) - 0.155762,
+       (GLfloat) 0.901801, (GLfloat) 0.090517, (GLfloat) - 0.422565,
+       (GLfloat) 0.894672, (GLfloat) 0.141897, (GLfloat) - 0.423589,
+       (GLfloat) 0.881131, (GLfloat) - 0.438054, (GLfloat) 0.178091,
+       (GLfloat) 0.885792, (GLfloat) - 0.415923, (GLfloat) 0.205866,
+       (GLfloat) 0.894672, (GLfloat) 0.141897, (GLfloat) 0.423589,
+       (GLfloat) 0.901801, (GLfloat) 0.090518, (GLfloat) 0.422565,
+       (GLfloat) 0.949193, (GLfloat) 0.273441, (GLfloat) 0.155762,
+       (GLfloat) 0.961663, (GLfloat) 0.236259, (GLfloat) 0.139234,
+       (GLfloat) 0.909310, (GLfloat) - 0.409637, (GLfloat) 0.073163,
+       (GLfloat) 0.914268, (GLfloat) - 0.399196, (GLfloat) 0.068966,
+       (GLfloat) 0.191133, (GLfloat) 0.514047, (GLfloat) - 0.836196,
+       (GLfloat) 0.183686, (GLfloat) 0.514678, (GLfloat) - 0.837476,
+       (GLfloat) - 0.045553, (GLfloat) 0.254642, (GLfloat) - 0.965962,
+       (GLfloat) - 0.043552, (GLfloat) 0.248570, (GLfloat) - 0.967634,
+       (GLfloat) 0.070662, (GLfloat) 0.160554, (GLfloat) - 0.984494,
+       (GLfloat) 0.072116, (GLfloat) 0.157712, (GLfloat) - 0.984848,
+       (GLfloat) 0.305019, (GLfloat) 0.420960, (GLfloat) - 0.854258,
+       (GLfloat) 0.309443, (GLfloat) 0.419398, (GLfloat) - 0.853434,
+       (GLfloat) - 0.557133, (GLfloat) - 0.173326, (GLfloat) - 0.812134,
+       (GLfloat) - 0.548436, (GLfloat) - 0.209256, (GLfloat) - 0.809586,
+       (GLfloat) - 0.417652, (GLfloat) - 0.317957, (GLfloat) - 0.851158,
+       (GLfloat) - 0.412553, (GLfloat) - 0.327906, (GLfloat) - 0.849869,
+       (GLfloat) - 0.160469, (GLfloat) - 0.081504, (GLfloat) - 0.983670,
+       (GLfloat) - 0.161493, (GLfloat) - 0.079455, (GLfloat) - 0.983670,
+       (GLfloat) - 0.281454, (GLfloat) 0.011196, (GLfloat) - 0.959509,
+       (GLfloat) - 0.287811, (GLfloat) 0.033884, (GLfloat) - 0.957088,
+       (GLfloat) 0.576854, (GLfloat) - 0.777370, (GLfloat) - 0.250869,
+       (GLfloat) 0.569572, (GLfloat) - 0.770539, (GLfloat) - 0.286108,
+       (GLfloat) 0.653090, (GLfloat) - 0.688670, (GLfloat) - 0.314971,
+       (GLfloat) 0.661058, (GLfloat) - 0.685633, (GLfloat) - 0.304812,
+       (GLfloat) 0.351164, (GLfloat) - 0.495655, (GLfloat) - 0.794362,
+       (GLfloat) 0.308874, (GLfloat) - 0.483661, (GLfloat) - 0.818944,
+       (GLfloat) 0.204308, (GLfloat) - 0.721597, (GLfloat) - 0.661480,
+       (GLfloat) 0.158422, (GLfloat) - 0.717393, (GLfloat) - 0.678418,
+       (GLfloat) 0.823611, (GLfloat) - 0.501936, (GLfloat) - 0.264055,
+       (GLfloat) 0.833765, (GLfloat) - 0.473703, (GLfloat) - 0.283621,
+       (GLfloat) 0.731077, (GLfloat) - 0.100384, (GLfloat) - 0.674869,
+       (GLfloat) 0.725771, (GLfloat) - 0.074392, (GLfloat) - 0.683902,
+       (GLfloat) 0.515479, (GLfloat) - 0.259037, (GLfloat) - 0.816812,
+       (GLfloat) 0.524744, (GLfloat) - 0.282163, (GLfloat) - 0.803136,
+       (GLfloat) 0.753164, (GLfloat) - 0.577527, (GLfloat) - 0.314971,
+       (GLfloat) 0.750976, (GLfloat) - 0.585768, (GLfloat) - 0.304813,
+       (GLfloat) 0.639601, (GLfloat) - 0.758638, (GLfloat) 0.124011,
+       (GLfloat) 0.647491, (GLfloat) - 0.749875, (GLfloat) 0.135802,
+       (GLfloat) 0.708617, (GLfloat) - 0.697026, (GLfloat) 0.109621,
+       (GLfloat) 0.711116, (GLfloat) - 0.693654, (GLfloat) 0.114709,
+       (GLfloat) 0.722217, (GLfloat) - 0.690875, (GLfloat) 0.033080,
+       (GLfloat) 0.720265, (GLfloat) - 0.693043, (GLfloat) 0.030163,
+       (GLfloat) 0.664597, (GLfloat) - 0.745915, (GLfloat) 0.043834,
+       (GLfloat) 0.660896, (GLfloat) - 0.749429, (GLfloat) 0.039656,
+       (GLfloat) 0.813450, (GLfloat) - 0.565559, (GLfloat) 0.135803,
+       (GLfloat) 0.821340, (GLfloat) - 0.556796, (GLfloat) 0.124011,
+       (GLfloat) 0.811298, (GLfloat) - 0.582987, (GLfloat) 0.043835,
+       (GLfloat) 0.814407, (GLfloat) - 0.578938, (GLfloat) 0.039656,
+       (GLfloat) 0.764534, (GLfloat) - 0.643877, (GLfloat) 0.030163,
+       (GLfloat) 0.762583, (GLfloat) - 0.646044, (GLfloat) 0.033079,
+       (GLfloat) 0.767278, (GLfloat) - 0.631876, (GLfloat) 0.109621,
+       (GLfloat) 0.764186, (GLfloat) - 0.634714, (GLfloat) 0.114709,
+       (GLfloat) 0.821340, (GLfloat) - 0.556796, (GLfloat) - 0.124011,
+       (GLfloat) 0.813450, (GLfloat) - 0.565559, (GLfloat) - 0.135803,
+       (GLfloat) 0.767278, (GLfloat) - 0.631876, (GLfloat) - 0.109621,
+       (GLfloat) 0.764186, (GLfloat) - 0.634714, (GLfloat) - 0.114709,
+       (GLfloat) 0.762583, (GLfloat) - 0.646044, (GLfloat) - 0.033079,
+       (GLfloat) 0.764534, (GLfloat) - 0.643877, (GLfloat) - 0.030163,
+       (GLfloat) 0.811298, (GLfloat) - 0.582987, (GLfloat) - 0.043835,
+       (GLfloat) 0.814407, (GLfloat) - 0.578938, (GLfloat) - 0.039656,
+       (GLfloat) 0.647491, (GLfloat) - 0.749875, (GLfloat) - 0.135802,
+       (GLfloat) 0.639601, (GLfloat) - 0.758638, (GLfloat) - 0.124011,
+       (GLfloat) 0.664597, (GLfloat) - 0.745915, (GLfloat) - 0.043834,
+       (GLfloat) 0.660896, (GLfloat) - 0.749429, (GLfloat) - 0.039656,
+       (GLfloat) 0.720265, (GLfloat) - 0.693043, (GLfloat) - 0.030163,
+       (GLfloat) 0.722217, (GLfloat) - 0.690875, (GLfloat) - 0.033080,
+       (GLfloat) 0.708617, (GLfloat) - 0.697026, (GLfloat) - 0.109621,
+       (GLfloat) 0.711116, (GLfloat) - 0.693654, (GLfloat) - 0.114709,
+       (GLfloat) - 0.795834, (GLfloat) - 0.416890, (GLfloat) - 0.439148,
+       (GLfloat) - 0.804928, (GLfloat) - 0.376107, (GLfloat) - 0.458949,
+       (GLfloat) - 0.777496, (GLfloat) - 0.478056, (GLfloat) - 0.408610,
+       (GLfloat) - 0.791178, (GLfloat) - 0.423850, (GLfloat) - 0.440894,
+       (GLfloat) - 0.871703, (GLfloat) - 0.470947, (GLfloat) - 0.135440,
+       (GLfloat) - 0.863971, (GLfloat) - 0.488878, (GLfloat) - 0.120637,
+       (GLfloat) - 0.890766, (GLfloat) - 0.431382, (GLfloat) - 0.142987,
+       (GLfloat) - 0.885536, (GLfloat) - 0.445027, (GLfloat) - 0.133330,
+       (GLfloat) - 0.626883, (GLfloat) - 0.701314, (GLfloat) - 0.339376,
+       (GLfloat) - 0.543140, (GLfloat) - 0.727904, (GLfloat) - 0.418515,
+       (GLfloat) - 0.684101, (GLfloat) - 0.722860, (GLfloat) - 0.097361,
+       (GLfloat) - 0.656897, (GLfloat) - 0.743919, (GLfloat) - 0.122761,
+       (GLfloat) - 0.823965, (GLfloat) - 0.552405, (GLfloat) - 0.126218,
+       (GLfloat) - 0.810821, (GLfloat) - 0.575485, (GLfloat) - 0.106707,
+       (GLfloat) - 0.722436, (GLfloat) - 0.581233, (GLfloat) - 0.374506,
+       (GLfloat) - 0.749781, (GLfloat) - 0.512777, (GLfloat) - 0.418197,
+       (GLfloat) - 0.543140, (GLfloat) - 0.727904, (GLfloat) 0.418515,
+       (GLfloat) - 0.626883, (GLfloat) - 0.701314, (GLfloat) 0.339376,
+       (GLfloat) - 0.749781, (GLfloat) - 0.512777, (GLfloat) 0.418197,
+       (GLfloat) - 0.722436, (GLfloat) - 0.581233, (GLfloat) 0.374506,
+       (GLfloat) - 0.823965, (GLfloat) - 0.552405, (GLfloat) 0.126218,
+       (GLfloat) - 0.810821, (GLfloat) - 0.575485, (GLfloat) 0.106707,
+       (GLfloat) - 0.684101, (GLfloat) - 0.722860, (GLfloat) 0.097361,
+       (GLfloat) - 0.656897, (GLfloat) - 0.743919, (GLfloat) 0.122761,
+       (GLfloat) - 0.804928, (GLfloat) - 0.376106, (GLfloat) 0.458949,
+       (GLfloat) - 0.795834, (GLfloat) - 0.416890, (GLfloat) 0.439148,
+       (GLfloat) - 0.890766, (GLfloat) - 0.431382, (GLfloat) 0.142986,
+       (GLfloat) - 0.885536, (GLfloat) - 0.445027, (GLfloat) 0.133330,
+       (GLfloat) - 0.863971, (GLfloat) - 0.488878, (GLfloat) 0.120637,
+       (GLfloat) - 0.871703, (GLfloat) - 0.470947, (GLfloat) 0.135440,
+       (GLfloat) - 0.777496, (GLfloat) - 0.478056, (GLfloat) 0.408610,
+       (GLfloat) - 0.791178, (GLfloat) - 0.423850, (GLfloat) 0.440894,
+       (GLfloat) 0.229002, (GLfloat) 0.499702, (GLfloat) - 0.835378,
+       (GLfloat) 0.231853, (GLfloat) 0.486589, (GLfloat) - 0.842304,
+       (GLfloat) 0.233876, (GLfloat) 0.516110, (GLfloat) - 0.823973,
+       (GLfloat) 0.237238, (GLfloat) 0.494666, (GLfloat) - 0.836076,
+       (GLfloat) 0.010383, (GLfloat) 0.206054, (GLfloat) - 0.978486,
+       (GLfloat) 0.010515, (GLfloat) 0.204402, (GLfloat) - 0.978831,
+       (GLfloat) - 0.008079, (GLfloat) 0.222043, (GLfloat) - 0.975003,
+       (GLfloat) - 0.007459, (GLfloat) 0.217610, (GLfloat) - 0.976007,
+       (GLfloat) 0.144536, (GLfloat) 0.600180, (GLfloat) - 0.786698,
+       (GLfloat) 0.157013, (GLfloat) 0.570113, (GLfloat) - 0.806423,
+       (GLfloat) 0.037521, (GLfloat) 0.196979, (GLfloat) - 0.979689,
+       (GLfloat) 0.033902, (GLfloat) 0.207800, (GLfloat) - 0.977584,
+       (GLfloat) 0.024105, (GLfloat) 0.197695, (GLfloat) - 0.979967,
+       (GLfloat) 0.023654, (GLfloat) 0.201010, (GLfloat) - 0.979303,
+       (GLfloat) 0.210423, (GLfloat) 0.553707, (GLfloat) - 0.805687,
+       (GLfloat) 0.216765, (GLfloat) 0.524423, (GLfloat) - 0.823404,
+       (GLfloat) - 0.387850, (GLfloat) - 0.484551, (GLfloat) - 0.784081,
+       (GLfloat) - 0.344102, (GLfloat) - 0.564354, (GLfloat) - 0.750399,
+       (GLfloat) - 0.507279, (GLfloat) - 0.348613, (GLfloat) - 0.788123,
+       (GLfloat) - 0.488679, (GLfloat) - 0.433878, (GLfloat) - 0.756930,
+       (GLfloat) - 0.209869, (GLfloat) - 0.143196, (GLfloat) - 0.967187,
+       (GLfloat) - 0.216489, (GLfloat) - 0.097461, (GLfloat) - 0.971408,
+       (GLfloat) - 0.125932, (GLfloat) - 0.202782, (GLfloat) - 0.971092,
+       (GLfloat) - 0.140256, (GLfloat) - 0.165750, (GLfloat) - 0.976143,
+       (GLfloat) - 0.549569, (GLfloat) - 0.208003, (GLfloat) - 0.809141,
+       (GLfloat) - 0.543770, (GLfloat) - 0.257592, (GLfloat) - 0.798724,
+       (GLfloat) - 0.260213, (GLfloat) - 0.033756, (GLfloat) - 0.964961,
+       (GLfloat) - 0.263665, (GLfloat) - 0.004051, (GLfloat) - 0.964606,
+       (GLfloat) - 0.243217, (GLfloat) - 0.082726, (GLfloat) - 0.966438,
+       (GLfloat) - 0.245939, (GLfloat) - 0.044154, (GLfloat) - 0.968279,
+       (GLfloat) - 0.539327, (GLfloat) - 0.261873, (GLfloat) - 0.800343,
+       (GLfloat) - 0.532344, (GLfloat) - 0.329385, (GLfloat) - 0.779818,
+       (GLfloat) 0.231853, (GLfloat) 0.486589, (GLfloat) 0.842304,
+       (GLfloat) 0.229002, (GLfloat) 0.499702, (GLfloat) 0.835378,
+       (GLfloat) - 0.008079, (GLfloat) 0.222044, (GLfloat) 0.975003,
+       (GLfloat) - 0.007460, (GLfloat) 0.217609, (GLfloat) 0.976008,
+       (GLfloat) 0.010515, (GLfloat) 0.204402, (GLfloat) 0.978830,
+       (GLfloat) 0.010383, (GLfloat) 0.206054, (GLfloat) 0.978486,
+       (GLfloat) 0.233876, (GLfloat) 0.516110, (GLfloat) 0.823973,
+       (GLfloat) 0.237238, (GLfloat) 0.494666, (GLfloat) 0.836076,
+       (GLfloat) - 0.549569, (GLfloat) - 0.208003, (GLfloat) 0.809141,
+       (GLfloat) - 0.543770, (GLfloat) - 0.257592, (GLfloat) 0.798724,
+       (GLfloat) - 0.532344, (GLfloat) - 0.329384, (GLfloat) 0.779818,
+       (GLfloat) - 0.539327, (GLfloat) - 0.261873, (GLfloat) 0.800343,
+       (GLfloat) - 0.243217, (GLfloat) - 0.082726, (GLfloat) 0.966438,
+       (GLfloat) - 0.245939, (GLfloat) - 0.044154, (GLfloat) 0.968279,
+       (GLfloat) - 0.263665, (GLfloat) - 0.004051, (GLfloat) 0.964606,
+       (GLfloat) - 0.260214, (GLfloat) - 0.033755, (GLfloat) 0.964961,
+       (GLfloat) - 0.344101, (GLfloat) - 0.564354, (GLfloat) 0.750399,
+       (GLfloat) - 0.387850, (GLfloat) - 0.484551, (GLfloat) 0.784081,
+       (GLfloat) - 0.125932, (GLfloat) - 0.202782, (GLfloat) 0.971093,
+       (GLfloat) - 0.140255, (GLfloat) - 0.165749, (GLfloat) 0.976143,
+       (GLfloat) - 0.216489, (GLfloat) - 0.097462, (GLfloat) 0.971408,
+       (GLfloat) - 0.209869, (GLfloat) - 0.143196, (GLfloat) 0.967187,
+       (GLfloat) - 0.507278, (GLfloat) - 0.348612, (GLfloat) 0.788123,
+       (GLfloat) - 0.488678, (GLfloat) - 0.433878, (GLfloat) 0.756930,
+       (GLfloat) 0.144536, (GLfloat) 0.600181, (GLfloat) 0.786697,
+       (GLfloat) 0.157013, (GLfloat) 0.570113, (GLfloat) 0.806423,
+       (GLfloat) 0.216765, (GLfloat) 0.524422, (GLfloat) 0.823404,
+       (GLfloat) 0.210423, (GLfloat) 0.553707, (GLfloat) 0.805687,
+       (GLfloat) 0.024105, (GLfloat) 0.197695, (GLfloat) 0.979967,
+       (GLfloat) 0.023654, (GLfloat) 0.201010, (GLfloat) 0.979304,
+       (GLfloat) 0.033902, (GLfloat) 0.207800, (GLfloat) 0.977584,
+       (GLfloat) 0.037522, (GLfloat) 0.196978, (GLfloat) 0.979690,
+       (GLfloat) 0.429831, (GLfloat) 0.754772, (GLfloat) - 0.495545,
+       (GLfloat) 0.445178, (GLfloat) 0.753116, (GLfloat) - 0.484389,
+       (GLfloat) 0.504382, (GLfloat) 0.849100, (GLfloat) - 0.156932,
+       (GLfloat) 0.509098, (GLfloat) 0.847167, (GLfloat) - 0.152075,
+       (GLfloat) 0.473721, (GLfloat) 0.868820, (GLfloat) - 0.144012,
+       (GLfloat) 0.467781, (GLfloat) 0.870761, (GLfloat) - 0.151512,
+       (GLfloat) 0.426275, (GLfloat) 0.776501, (GLfloat) - 0.464043,
+       (GLfloat) 0.405841, (GLfloat) 0.776082, (GLfloat) - 0.482690,
+       (GLfloat) 0.445178, (GLfloat) 0.753116, (GLfloat) 0.484389,
+       (GLfloat) 0.429830, (GLfloat) 0.754772, (GLfloat) 0.495545,
+       (GLfloat) 0.426275, (GLfloat) 0.776501, (GLfloat) 0.464043,
+       (GLfloat) 0.405841, (GLfloat) 0.776082, (GLfloat) 0.482690,
+       (GLfloat) 0.467781, (GLfloat) 0.870761, (GLfloat) 0.151512,
+       (GLfloat) 0.473721, (GLfloat) 0.868820, (GLfloat) 0.144012,
+       (GLfloat) 0.504382, (GLfloat) 0.849100, (GLfloat) 0.156932,
+       (GLfloat) 0.509098, (GLfloat) 0.847167, (GLfloat) 0.152075,
+       (GLfloat) 0.229278, (GLfloat) 0.880155, (GLfloat) 0.415643,
+       (GLfloat) 0.209637, (GLfloat) 0.873049, (GLfloat) 0.440270,
+       (GLfloat) 0.229791, (GLfloat) 0.963838, (GLfloat) 0.134951,
+       (GLfloat) 0.235661, (GLfloat) 0.963590, (GLfloat) 0.126323,
+       (GLfloat) 0.380317, (GLfloat) 0.913635, (GLfloat) 0.143628,
+       (GLfloat) 0.386968, (GLfloat) 0.912260, (GLfloat) 0.134303,
+       (GLfloat) 0.360099, (GLfloat) 0.823680, (GLfloat) 0.438041,
+       (GLfloat) 0.336980, (GLfloat) 0.819830, (GLfloat) 0.462950,
+       (GLfloat) 0.229278, (GLfloat) 0.880155, (GLfloat) - 0.415643,
+       (GLfloat) 0.209637, (GLfloat) 0.873049, (GLfloat) - 0.440270,
+       (GLfloat) 0.336980, (GLfloat) 0.819830, (GLfloat) - 0.462951,
+       (GLfloat) 0.360099, (GLfloat) 0.823680, (GLfloat) - 0.438041,
+       (GLfloat) 0.380318, (GLfloat) 0.913635, (GLfloat) - 0.143628,
+       (GLfloat) 0.386968, (GLfloat) 0.912260, (GLfloat) - 0.134303,
+       (GLfloat) 0.235661, (GLfloat) 0.963590, (GLfloat) - 0.126323,
+       (GLfloat) 0.229791, (GLfloat) 0.963838, (GLfloat) - 0.134951,
+       (GLfloat) - 0.140641, (GLfloat) 0.581880, (GLfloat) - 0.801022,
+       (GLfloat) - 0.142183, (GLfloat) 0.582121, (GLfloat) - 0.800574,
+       (GLfloat) 0.051917, (GLfloat) 0.273318, (GLfloat) - 0.960522,
+       (GLfloat) 0.034217, (GLfloat) 0.274901, (GLfloat) - 0.960864,
+       (GLfloat) 0.048940, (GLfloat) 0.249448, (GLfloat) - 0.967151,
+       (GLfloat) 0.029460, (GLfloat) 0.256714, (GLfloat) - 0.966038,
+       (GLfloat) - 0.118911, (GLfloat) 0.595461, (GLfloat) - 0.794536,
+       (GLfloat) - 0.119035, (GLfloat) 0.595511, (GLfloat) - 0.794479,
+       (GLfloat) 0.515773, (GLfloat) - 0.229138, (GLfloat) - 0.825515,
+       (GLfloat) 0.492630, (GLfloat) - 0.312368, (GLfloat) - 0.812245,
+       (GLfloat) 0.432249, (GLfloat) - 0.426645, (GLfloat) - 0.794440,
+       (GLfloat) 0.467347, (GLfloat) - 0.336981, (GLfloat) - 0.817332,
+       (GLfloat) 0.202207, (GLfloat) - 0.074217, (GLfloat) - 0.976526,
+       (GLfloat) 0.254570, (GLfloat) - 0.084963, (GLfloat) - 0.963315,
+       (GLfloat) 0.231800, (GLfloat) - 0.012060, (GLfloat) - 0.972689,
+       (GLfloat) 0.278802, (GLfloat) - 0.009127, (GLfloat) - 0.960305,
+       (GLfloat) 0.001969, (GLfloat) - 0.610219, (GLfloat) - 0.792230,
+       (GLfloat) 0.016464, (GLfloat) - 0.619478, (GLfloat) - 0.784841,
+       (GLfloat) 0.038477, (GLfloat) - 0.206205, (GLfloat) - 0.977752,
+       (GLfloat) 0.042684, (GLfloat) - 0.210618, (GLfloat) - 0.976636,
+       (GLfloat) 0.147830, (GLfloat) - 0.145929, (GLfloat) - 0.978188,
+       (GLfloat) 0.187657, (GLfloat) - 0.166867, (GLfloat) - 0.967957,
+       (GLfloat) 0.332157, (GLfloat) - 0.490109, (GLfloat) - 0.805894,
+       (GLfloat) 0.291047, (GLfloat) - 0.549638, (GLfloat) - 0.783064,
+       (GLfloat) 0.018324, (GLfloat) 0.624772, (GLfloat) - 0.780593,
+       (GLfloat) 0.031411, (GLfloat) 0.609093, (GLfloat) - 0.792477,
+       (GLfloat) - 0.068754, (GLfloat) 0.615108, (GLfloat) - 0.785439,
+       (GLfloat) - 0.063190, (GLfloat) 0.611137, (GLfloat) - 0.788999,
+       (GLfloat) 0.050001, (GLfloat) 0.227113, (GLfloat) - 0.972584,
+       (GLfloat) 0.031314, (GLfloat) 0.240630, (GLfloat) - 0.970112,
+       (GLfloat) 0.046887, (GLfloat) 0.207201, (GLfloat) - 0.977174,
+       (GLfloat) 0.034344, (GLfloat) 0.223544, (GLfloat) - 0.974089,
+       (GLfloat) - 0.289358, (GLfloat) 0.846699, (GLfloat) - 0.446512,
+       (GLfloat) - 0.282981, (GLfloat) 0.846581, (GLfloat) - 0.450803,
+       (GLfloat) - 0.237609, (GLfloat) 0.869708, (GLfloat) - 0.432607,
+       (GLfloat) - 0.232787, (GLfloat) 0.868834, (GLfloat) - 0.436964,
+       (GLfloat) - 0.269102, (GLfloat) 0.953677, (GLfloat) - 0.134480,
+       (GLfloat) - 0.270832, (GLfloat) 0.953476, (GLfloat) - 0.132414,
+       (GLfloat) - 0.330792, (GLfloat) 0.933242, (GLfloat) - 0.140129,
+       (GLfloat) - 0.333075, (GLfloat) 0.932754, (GLfloat) - 0.137953,
+       (GLfloat) 0.010415, (GLfloat) 0.905793, (GLfloat) - 0.423593,
+       (GLfloat) 0.002305, (GLfloat) 0.910958, (GLfloat) - 0.412492,
+       (GLfloat) - 0.003726, (GLfloat) 0.991671, (GLfloat) - 0.128743,
+       (GLfloat) - 0.001231, (GLfloat) 0.992167, (GLfloat) - 0.124913,
+       (GLfloat) - 0.164759, (GLfloat) 0.977931, (GLfloat) - 0.128473,
+       (GLfloat) - 0.164919, (GLfloat) 0.977933, (GLfloat) - 0.128255,
+       (GLfloat) - 0.141914, (GLfloat) 0.895522, (GLfloat) - 0.421783,
+       (GLfloat) - 0.142144, (GLfloat) 0.895607, (GLfloat) - 0.421525,
+       (GLfloat) 0.010415, (GLfloat) 0.905793, (GLfloat) 0.423593,
+       (GLfloat) 0.002305, (GLfloat) 0.910958, (GLfloat) 0.412492,
+       (GLfloat) - 0.142144, (GLfloat) 0.895607, (GLfloat) 0.421525,
+       (GLfloat) - 0.141914, (GLfloat) 0.895522, (GLfloat) 0.421783,
+       (GLfloat) - 0.164759, (GLfloat) 0.977931, (GLfloat) 0.128473,
+       (GLfloat) - 0.164919, (GLfloat) 0.977933, (GLfloat) 0.128255,
+       (GLfloat) - 0.003726, (GLfloat) 0.991671, (GLfloat) 0.128743,
+       (GLfloat) - 0.001231, (GLfloat) 0.992167, (GLfloat) 0.124913,
+       (GLfloat) - 0.282980, (GLfloat) 0.846581, (GLfloat) 0.450803,
+       (GLfloat) - 0.289358, (GLfloat) 0.846699, (GLfloat) 0.446512,
+       (GLfloat) - 0.330792, (GLfloat) 0.933242, (GLfloat) 0.140129,
+       (GLfloat) - 0.333075, (GLfloat) 0.932754, (GLfloat) 0.137953,
+       (GLfloat) - 0.270832, (GLfloat) 0.953476, (GLfloat) 0.132414,
+       (GLfloat) - 0.269102, (GLfloat) 0.953677, (GLfloat) 0.134480,
+       (GLfloat) - 0.237609, (GLfloat) 0.869708, (GLfloat) 0.432607,
+       (GLfloat) - 0.232787, (GLfloat) 0.868834, (GLfloat) 0.436964,
+       (GLfloat) - 0.140641, (GLfloat) 0.581880, (GLfloat) 0.801022,
+       (GLfloat) - 0.142183, (GLfloat) 0.582121, (GLfloat) 0.800574,
+       (GLfloat) - 0.119034, (GLfloat) 0.595511, (GLfloat) 0.794479,
+       (GLfloat) - 0.118911, (GLfloat) 0.595461, (GLfloat) 0.794536,
+       (GLfloat) 0.048939, (GLfloat) 0.249448, (GLfloat) 0.967151,
+       (GLfloat) 0.029461, (GLfloat) 0.256714, (GLfloat) 0.966038,
+       (GLfloat) 0.034217, (GLfloat) 0.274901, (GLfloat) 0.960863,
+       (GLfloat) 0.051918, (GLfloat) 0.273319, (GLfloat) 0.960521,
+       (GLfloat) 0.031411, (GLfloat) 0.609093, (GLfloat) 0.792477,
+       (GLfloat) 0.018324, (GLfloat) 0.624772, (GLfloat) 0.780593,
+       (GLfloat) 0.046887, (GLfloat) 0.207200, (GLfloat) 0.977174,
+       (GLfloat) 0.034344, (GLfloat) 0.223543, (GLfloat) 0.974089,
+       (GLfloat) 0.031314, (GLfloat) 0.240631, (GLfloat) 0.970111,
+       (GLfloat) 0.050002, (GLfloat) 0.227113, (GLfloat) 0.972584,
+       (GLfloat) - 0.068754, (GLfloat) 0.615108, (GLfloat) 0.785440,
+       (GLfloat) - 0.063191, (GLfloat) 0.611137, (GLfloat) 0.788999,
+       (GLfloat) 0.001969, (GLfloat) - 0.610219, (GLfloat) 0.792230,
+       (GLfloat) 0.016464, (GLfloat) - 0.619478, (GLfloat) 0.784841,
+       (GLfloat) 0.332157, (GLfloat) - 0.490109, (GLfloat) 0.805894,
+       (GLfloat) 0.291047, (GLfloat) - 0.549638, (GLfloat) 0.783064,
+       (GLfloat) 0.147831, (GLfloat) - 0.145929, (GLfloat) 0.978188,
+       (GLfloat) 0.187656, (GLfloat) - 0.166866, (GLfloat) 0.967957,
+       (GLfloat) 0.042684, (GLfloat) - 0.210618, (GLfloat) 0.976636,
+       (GLfloat) 0.038477, (GLfloat) - 0.206204, (GLfloat) 0.977752,
+       (GLfloat) 0.515773, (GLfloat) - 0.229138, (GLfloat) 0.825515,
+       (GLfloat) 0.492630, (GLfloat) - 0.312368, (GLfloat) 0.812245,
+       (GLfloat) 0.231801, (GLfloat) - 0.012059, (GLfloat) 0.972689,
+       (GLfloat) 0.278802, (GLfloat) - 0.009127, (GLfloat) 0.960305,
+       (GLfloat) 0.254571, (GLfloat) - 0.084963, (GLfloat) 0.963315,
+       (GLfloat) 0.202207, (GLfloat) - 0.074217, (GLfloat) 0.976527,
+       (GLfloat) 0.467347, (GLfloat) - 0.336981, (GLfloat) 0.817332,
+       (GLfloat) 0.432250, (GLfloat) - 0.426645, (GLfloat) 0.794440,
+       (GLfloat) 0.731946, (GLfloat) - 0.508941, (GLfloat) 0.453029,
+       (GLfloat) 0.760718, (GLfloat) - 0.438585, (GLfloat) 0.478489,
+       (GLfloat) 0.696013, (GLfloat) - 0.585025, (GLfloat) 0.416308,
+       (GLfloat) 0.630794, (GLfloat) - 0.620580, (GLfloat) 0.465810,
+       (GLfloat) 0.757142, (GLfloat) - 0.637420, (GLfloat) 0.142942,
+       (GLfloat) 0.737097, (GLfloat) - 0.663598, (GLfloat) 0.127771,
+       (GLfloat) 0.847507, (GLfloat) - 0.509047, (GLfloat) 0.150342,
+       (GLfloat) 0.834151, (GLfloat) - 0.533962, (GLfloat) 0.138115,
+       (GLfloat) - 0.068175, (GLfloat) - 0.903325, (GLfloat) 0.423504,
+       (GLfloat) - 0.038664, (GLfloat) - 0.911816, (GLfloat) 0.408775,
+       (GLfloat) - 0.102320, (GLfloat) - 0.986404, (GLfloat) 0.128602,
+       (GLfloat) - 0.086898, (GLfloat) - 0.988753, (GLfloat) 0.121719,
+       (GLfloat) 0.488656, (GLfloat) - 0.861887, (GLfloat) 0.135524,
+       (GLfloat) 0.510932, (GLfloat) - 0.850761, (GLfloat) 0.123102,
+       (GLfloat) 0.415769, (GLfloat) - 0.794938, (GLfloat) 0.441826,
+       (GLfloat) 0.471036, (GLfloat) - 0.782278, (GLfloat) 0.407634,
+       (GLfloat) - 0.038664, (GLfloat) - 0.911816, (GLfloat) - 0.408775,
+       (GLfloat) - 0.068174, (GLfloat) - 0.903325, (GLfloat) - 0.423504,
+       (GLfloat) 0.415769, (GLfloat) - 0.794938, (GLfloat) - 0.441826,
+       (GLfloat) 0.471037, (GLfloat) - 0.782278, (GLfloat) - 0.407634,
+       (GLfloat) 0.510932, (GLfloat) - 0.850761, (GLfloat) - 0.123102,
+       (GLfloat) 0.488656, (GLfloat) - 0.861887, (GLfloat) - 0.135524,
+       (GLfloat) - 0.102320, (GLfloat) - 0.986404, (GLfloat) - 0.128602,
+       (GLfloat) - 0.086898, (GLfloat) - 0.988753, (GLfloat) - 0.121719,
+       (GLfloat) 0.760718, (GLfloat) - 0.438585, (GLfloat) - 0.478489,
+       (GLfloat) 0.731946, (GLfloat) - 0.508941, (GLfloat) - 0.453029,
+       (GLfloat) 0.847507, (GLfloat) - 0.509047, (GLfloat) - 0.150343,
+       (GLfloat) 0.834151, (GLfloat) - 0.533962, (GLfloat) - 0.138115,
+       (GLfloat) 0.737097, (GLfloat) - 0.663599, (GLfloat) - 0.127771,
+       (GLfloat) 0.757142, (GLfloat) - 0.637420, (GLfloat) - 0.142942,
+       (GLfloat) 0.630794, (GLfloat) - 0.620580, (GLfloat) - 0.465810,
+       (GLfloat) 0.696012, (GLfloat) - 0.585025, (GLfloat) - 0.416309,
+       (GLfloat) 0.774435, (GLfloat) - 0.417338, (GLfloat) 0.475479,
+       (GLfloat) 0.793442, (GLfloat) - 0.363272, (GLfloat) 0.488348,
+       (GLfloat) 0.884471, (GLfloat) - 0.440088, (GLfloat) 0.155030,
+       (GLfloat) 0.875885, (GLfloat) - 0.459272, (GLfloat) 0.147967,
+       (GLfloat) 0.768156, (GLfloat) - 0.618465, (GLfloat) 0.165642,
+       (GLfloat) 0.757446, (GLfloat) - 0.632850, (GLfloat) 0.160551,
+       (GLfloat) 0.645602, (GLfloat) - 0.572394, (GLfloat) 0.505533,
+       (GLfloat) 0.663605, (GLfloat) - 0.543212, (GLfloat) 0.514343,
+       (GLfloat) 0.774435, (GLfloat) - 0.417338, (GLfloat) - 0.475479,
+       (GLfloat) 0.793442, (GLfloat) - 0.363271, (GLfloat) - 0.488348,
+       (GLfloat) 0.663604, (GLfloat) - 0.543213, (GLfloat) - 0.514343,
+       (GLfloat) 0.645602, (GLfloat) - 0.572394, (GLfloat) - 0.505533,
+       (GLfloat) 0.768156, (GLfloat) - 0.618465, (GLfloat) - 0.165643,
+       (GLfloat) 0.757446, (GLfloat) - 0.632850, (GLfloat) - 0.160551,
+       (GLfloat) 0.875885, (GLfloat) - 0.459272, (GLfloat) - 0.147967,
+       (GLfloat) 0.884471, (GLfloat) - 0.440088, (GLfloat) - 0.155030,
+       (GLfloat) - 0.384755, (GLfloat) - 0.899768, (GLfloat) - 0.205866,
+       (GLfloat) - 0.407035, (GLfloat) - 0.895883, (GLfloat) - 0.178092,
+       (GLfloat) - 0.367045, (GLfloat) - 0.927643, (GLfloat) - 0.068965,
+       (GLfloat) - 0.377652, (GLfloat) - 0.923053, (GLfloat) - 0.073163,
+       (GLfloat) 0.147492, (GLfloat) - 0.980758, (GLfloat) - 0.127908,
+       (GLfloat) 0.187942, (GLfloat) - 0.971451, (GLfloat) - 0.144776,
+       (GLfloat) 0.017404, (GLfloat) - 0.922933, (GLfloat) - 0.384567,
+       (GLfloat) 0.060977, (GLfloat) - 0.919535, (GLfloat) - 0.388250,
+       (GLfloat) - 0.407035, (GLfloat) - 0.895883, (GLfloat) 0.178092,
+       (GLfloat) - 0.384755, (GLfloat) - 0.899768, (GLfloat) 0.205866,
+       (GLfloat) 0.060977, (GLfloat) - 0.919535, (GLfloat) 0.388250,
+       (GLfloat) 0.017405, (GLfloat) - 0.922933, (GLfloat) 0.384568,
+       (GLfloat) 0.187942, (GLfloat) - 0.971451, (GLfloat) 0.144776,
+       (GLfloat) 0.147492, (GLfloat) - 0.980758, (GLfloat) 0.127908,
+       (GLfloat) - 0.377652, (GLfloat) - 0.923053, (GLfloat) 0.073163,
+       (GLfloat) - 0.367045, (GLfloat) - 0.927643, (GLfloat) 0.068965,
+       (GLfloat) 0.525096, (GLfloat) - 0.217383, (GLfloat) - 0.822811,
+       (GLfloat) 0.542855, (GLfloat) - 0.154089, (GLfloat) - 0.825569,
+       (GLfloat) 0.263018, (GLfloat) 0.047234, (GLfloat) - 0.963634,
+       (GLfloat) 0.298263, (GLfloat) 0.059374, (GLfloat) - 0.952635,
+       (GLfloat) 0.152826, (GLfloat) - 0.078814, (GLfloat) - 0.985105,
+       (GLfloat) 0.157225, (GLfloat) - 0.076313, (GLfloat) - 0.984610,
+       (GLfloat) 0.407888, (GLfloat) - 0.328946, (GLfloat) - 0.851717,
+       (GLfloat) 0.393565, (GLfloat) - 0.338248, (GLfloat) - 0.854807,
+       (GLfloat) - 0.131636, (GLfloat) 0.588079, (GLfloat) - 0.798019,
+       (GLfloat) - 0.131727, (GLfloat) 0.588071, (GLfloat) - 0.798011,
+       (GLfloat) - 0.280070, (GLfloat) 0.459269, (GLfloat) - 0.842990,
+       (GLfloat) - 0.285882, (GLfloat) 0.456692, (GLfloat) - 0.842439,
+       (GLfloat) - 0.064116, (GLfloat) 0.179568, (GLfloat) - 0.981654,
+       (GLfloat) - 0.067311, (GLfloat) 0.177967, (GLfloat) - 0.981732,
+       (GLfloat) 0.071348, (GLfloat) 0.308885, (GLfloat) - 0.948419,
+       (GLfloat) 0.056168, (GLfloat) 0.305937, (GLfloat) - 0.950393,
+       (GLfloat) - 0.756765, (GLfloat) - 0.603631, (GLfloat) - 0.250870,
+       (GLfloat) - 0.750192, (GLfloat) - 0.596115, (GLfloat) - 0.286110,
+       (GLfloat) - 0.661260, (GLfloat) - 0.680768, (GLfloat) - 0.315104,
+       (GLfloat) - 0.666597, (GLfloat) - 0.680599, (GLfloat) - 0.304029,
+       (GLfloat) - 0.487239, (GLfloat) - 0.360038, (GLfloat) - 0.795595,
+       (GLfloat) - 0.481713, (GLfloat) - 0.339088, (GLfloat) - 0.808067,
+       (GLfloat) - 0.706427, (GLfloat) - 0.186136, (GLfloat) - 0.682872,
+       (GLfloat) - 0.704353, (GLfloat) - 0.163662, (GLfloat) - 0.690726,
+       (GLfloat) - 0.472887, (GLfloat) - 0.840626, (GLfloat) - 0.264056,
+       (GLfloat) - 0.444319, (GLfloat) - 0.849789, (GLfloat) - 0.283620,
+       (GLfloat) - 0.155246, (GLfloat) - 0.767829, (GLfloat) - 0.621561,
+       (GLfloat) - 0.107581, (GLfloat) - 0.759164, (GLfloat) - 0.641947,
+       (GLfloat) - 0.262880, (GLfloat) - 0.545316, (GLfloat) - 0.795943,
+       (GLfloat) - 0.306478, (GLfloat) - 0.563718, (GLfloat) - 0.767002,
+       (GLfloat) - 0.550890, (GLfloat) - 0.772860, (GLfloat) - 0.314972,
+       (GLfloat) - 0.559203, (GLfloat) - 0.770962, (GLfloat) - 0.304813,
+       (GLfloat) - 0.296632, (GLfloat) 0.840312, (GLfloat) - 0.453745,
+       (GLfloat) - 0.291339, (GLfloat) 0.841021, (GLfloat) - 0.455856,
+       (GLfloat) - 0.347498, (GLfloat) 0.926752, (GLfloat) - 0.142743,
+       (GLfloat) - 0.349577, (GLfloat) 0.926172, (GLfloat) - 0.141427,
+       (GLfloat) - 0.528222, (GLfloat) 0.834354, (GLfloat) - 0.157592,
+       (GLfloat) - 0.534297, (GLfloat) 0.830965, (GLfloat) - 0.154997,
+       (GLfloat) - 0.477964, (GLfloat) 0.727109, (GLfloat) - 0.492812,
+       (GLfloat) - 0.464577, (GLfloat) 0.733270, (GLfloat) - 0.496471,
+       (GLfloat) - 0.296632, (GLfloat) 0.840312, (GLfloat) 0.453745,
+       (GLfloat) - 0.291339, (GLfloat) 0.841021, (GLfloat) 0.455856,
+       (GLfloat) - 0.464577, (GLfloat) 0.733270, (GLfloat) 0.496471,
+       (GLfloat) - 0.477964, (GLfloat) 0.727109, (GLfloat) 0.492812,
+       (GLfloat) - 0.528222, (GLfloat) 0.834354, (GLfloat) 0.157592,
+       (GLfloat) - 0.534297, (GLfloat) 0.830965, (GLfloat) 0.154997,
+       (GLfloat) - 0.349577, (GLfloat) 0.926172, (GLfloat) 0.141427,
+       (GLfloat) - 0.347498, (GLfloat) 0.926752, (GLfloat) 0.142743,
+       (GLfloat) - 0.819286, (GLfloat) - 0.535153, (GLfloat) 0.205866,
+       (GLfloat) - 0.811591, (GLfloat) - 0.556420, (GLfloat) 0.178092,
+       (GLfloat) - 0.849813, (GLfloat) - 0.522553, (GLfloat) 0.068965,
+       (GLfloat) - 0.843450, (GLfloat) - 0.532202, (GLfloat) 0.073162,
+       (GLfloat) - 0.975674, (GLfloat) 0.164943, (GLfloat) 0.144407,
+       (GLfloat) - 0.965143, (GLfloat) 0.206428, (GLfloat) 0.160894,
+       (GLfloat) - 0.906538, (GLfloat) 0.014845, (GLfloat) 0.421862,
+       (GLfloat) - 0.890094, (GLfloat) 0.060087, (GLfloat) 0.451800,
+       (GLfloat) - 0.811591, (GLfloat) - 0.556419, (GLfloat) - 0.178092,
+       (GLfloat) - 0.819286, (GLfloat) - 0.535153, (GLfloat) - 0.205865,
+       (GLfloat) - 0.906538, (GLfloat) 0.014844, (GLfloat) - 0.421862,
+       (GLfloat) - 0.890094, (GLfloat) 0.060087, (GLfloat) - 0.451800,
+       (GLfloat) - 0.965143, (GLfloat) 0.206428, (GLfloat) - 0.160894,
+       (GLfloat) - 0.975674, (GLfloat) 0.164943, (GLfloat) - 0.144407,
+       (GLfloat) - 0.843450, (GLfloat) - 0.532202, (GLfloat) - 0.073162,
+       (GLfloat) - 0.849813, (GLfloat) - 0.522553, (GLfloat) - 0.068965,
+       (GLfloat) - 0.131727, (GLfloat) 0.588071, (GLfloat) 0.798011,
+       (GLfloat) - 0.131636, (GLfloat) 0.588079, (GLfloat) 0.798019,
+       (GLfloat) 0.071348, (GLfloat) 0.308886, (GLfloat) 0.948419,
+       (GLfloat) 0.056168, (GLfloat) 0.305937, (GLfloat) 0.950393,
+       (GLfloat) - 0.067311, (GLfloat) 0.177967, (GLfloat) 0.981732,
+       (GLfloat) - 0.064116, (GLfloat) 0.179568, (GLfloat) 0.981654,
+       (GLfloat) - 0.280070, (GLfloat) 0.459269, (GLfloat) 0.842990,
+       (GLfloat) - 0.285882, (GLfloat) 0.456692, (GLfloat) 0.842439,
+       (GLfloat) 0.542855, (GLfloat) - 0.154089, (GLfloat) 0.825569,
+       (GLfloat) 0.525096, (GLfloat) - 0.217383, (GLfloat) 0.822811,
+       (GLfloat) 0.393565, (GLfloat) - 0.338248, (GLfloat) 0.854807,
+       (GLfloat) 0.407888, (GLfloat) - 0.328946, (GLfloat) 0.851717,
+       (GLfloat) 0.152826, (GLfloat) - 0.078814, (GLfloat) 0.985105,
+       (GLfloat) 0.157225, (GLfloat) - 0.076313, (GLfloat) 0.984610,
+       (GLfloat) 0.298263, (GLfloat) 0.059374, (GLfloat) 0.952635,
+       (GLfloat) 0.263018, (GLfloat) 0.047234, (GLfloat) 0.963634,
+       (GLfloat) - 0.444319, (GLfloat) - 0.849789, (GLfloat) 0.283620,
+       (GLfloat) - 0.472887, (GLfloat) - 0.840626, (GLfloat) 0.264055,
+       (GLfloat) - 0.550890, (GLfloat) - 0.772861, (GLfloat) 0.314972,
+       (GLfloat) - 0.559203, (GLfloat) - 0.770962, (GLfloat) 0.304813,
+       (GLfloat) - 0.306478, (GLfloat) - 0.563718, (GLfloat) 0.767003,
+       (GLfloat) - 0.262880, (GLfloat) - 0.545316, (GLfloat) 0.795943,
+       (GLfloat) - 0.155245, (GLfloat) - 0.767828, (GLfloat) 0.621562,
+       (GLfloat) - 0.107581, (GLfloat) - 0.759164, (GLfloat) 0.641947,
+       (GLfloat) - 0.756765, (GLfloat) - 0.603631, (GLfloat) 0.250869,
+       (GLfloat) - 0.750192, (GLfloat) - 0.596115, (GLfloat) 0.286110,
+       (GLfloat) - 0.706427, (GLfloat) - 0.186135, (GLfloat) 0.682873,
+       (GLfloat) - 0.704352, (GLfloat) - 0.163662, (GLfloat) 0.690726,
+       (GLfloat) - 0.481713, (GLfloat) - 0.339088, (GLfloat) 0.808067,
+       (GLfloat) - 0.487239, (GLfloat) - 0.360037, (GLfloat) 0.795595,
+       (GLfloat) - 0.666597, (GLfloat) - 0.680599, (GLfloat) 0.304029,
+       (GLfloat) - 0.661260, (GLfloat) - 0.680768, (GLfloat) 0.315104,
+       (GLfloat) - 0.527794, (GLfloat) - 0.840271, (GLfloat) - 0.124011,
+       (GLfloat) - 0.536826, (GLfloat) - 0.832691, (GLfloat) - 0.135802,
+       (GLfloat) - 0.604714, (GLfloat) - 0.788863, (GLfloat) - 0.109621,
+       (GLfloat) - 0.607657, (GLfloat) - 0.785872, (GLfloat) - 0.114709,
+       (GLfloat) - 0.619037, (GLfloat) - 0.784665, (GLfloat) - 0.033079,
+       (GLfloat) - 0.616803, (GLfloat) - 0.786539, (GLfloat) - 0.030163,
+       (GLfloat) - 0.554318, (GLfloat) - 0.831150, (GLfloat) - 0.043834,
+       (GLfloat) - 0.550163, (GLfloat) - 0.834115, (GLfloat) - 0.039656,
+       (GLfloat) - 0.726822, (GLfloat) - 0.673266, (GLfloat) - 0.135802,
+       (GLfloat) - 0.735855, (GLfloat) - 0.665687, (GLfloat) - 0.124011,
+       (GLfloat) - 0.722267, (GLfloat) - 0.690224, (GLfloat) - 0.043834,
+       (GLfloat) - 0.725908, (GLfloat) - 0.686648, (GLfloat) - 0.039656,
+       (GLfloat) - 0.667483, (GLfloat) - 0.744014, (GLfloat) - 0.030163,
+       (GLfloat) - 0.665249, (GLfloat) - 0.745888, (GLfloat) - 0.033079,
+       (GLfloat) - 0.671871, (GLfloat) - 0.732511, (GLfloat) - 0.109621,
+       (GLfloat) - 0.668414, (GLfloat) - 0.734891, (GLfloat) - 0.114709,
+       (GLfloat) - 0.735855, (GLfloat) - 0.665687, (GLfloat) 0.124011,
+       (GLfloat) - 0.726822, (GLfloat) - 0.673266, (GLfloat) 0.135802,
+       (GLfloat) - 0.671871, (GLfloat) - 0.732511, (GLfloat) 0.109621,
+       (GLfloat) - 0.668414, (GLfloat) - 0.734891, (GLfloat) 0.114709,
+       (GLfloat) - 0.665249, (GLfloat) - 0.745888, (GLfloat) 0.033079,
+       (GLfloat) - 0.667483, (GLfloat) - 0.744014, (GLfloat) 0.030163,
+       (GLfloat) - 0.722267, (GLfloat) - 0.690224, (GLfloat) 0.043834,
+       (GLfloat) - 0.725908, (GLfloat) - 0.686648, (GLfloat) 0.039656,
+       (GLfloat) - 0.536826, (GLfloat) - 0.832691, (GLfloat) 0.135802,
+       (GLfloat) - 0.527794, (GLfloat) - 0.840271, (GLfloat) 0.124011,
+       (GLfloat) - 0.554318, (GLfloat) - 0.831150, (GLfloat) 0.043834,
+       (GLfloat) - 0.550163, (GLfloat) - 0.834115, (GLfloat) 0.039656,
+       (GLfloat) - 0.616803, (GLfloat) - 0.786539, (GLfloat) 0.030163,
+       (GLfloat) - 0.619037, (GLfloat) - 0.784665, (GLfloat) 0.033079,
+       (GLfloat) - 0.604714, (GLfloat) - 0.788863, (GLfloat) 0.109621,
+       (GLfloat) - 0.607657, (GLfloat) - 0.785872, (GLfloat) 0.114709,
+};
+
+static unsigned short int s1_4_POLS[] =
+{
+      3, 82, 12, 76, 1, 3, 76, 74, 82, 1, 3, 22, 78, 74, 1, 3, 22, 74, 76, 1,
+      3, 78, 20, 80, 1, 3, 80, 74, 78, 1, 3, 28, 82, 74, 1, 3, 28, 74, 80, 1,
+      3, 88, 13, 84, 1, 3, 84, 77, 88, 1, 3, 24, 86, 77, 1, 3, 24, 77, 84, 1,
+      3, 86, 20, 78, 1, 3, 78, 77, 86, 1, 3, 22, 88, 77, 1, 3, 22, 77, 78, 1,
+      3, 14, 90, 85, 1, 3, 14, 85, 93, 1, 3, 26, 91, 85, 1, 3, 26, 85, 90, 1,
+      3, 20, 86, 85, 1, 3, 20, 85, 91, 1, 3, 86, 24, 93, 1, 3, 93, 85, 86, 1,
+      3, 15, 95, 79, 1, 3, 15, 79, 97, 1, 3, 95, 28, 80, 1, 3, 80, 79, 95, 1,
+      3, 20, 91, 79, 1, 3, 20, 79, 80, 1, 3, 26, 97, 79, 1, 3, 26, 79, 91, 1,
+    3, 13, 99, 83, 1, 3, 13, 83, 84, 1, 3, 99, 30, 101, 1, 3, 101, 83, 99, 1,
+  3, 23, 102, 83, 1, 3, 23, 83, 101, 1, 3, 102, 24, 84, 1, 3, 84, 83, 102, 1,
+       3, 16, 104, 100, 1, 3, 16, 100, 108, 1, 3, 104, 32, 106, 1, 3, 106, 100, 104, 1,
+       3, 106, 23, 101, 1, 3, 101, 100, 106, 1, 3, 30, 108, 100, 1, 3, 30, 100, 101, 1,
+       3, 17, 110, 105, 1, 3, 17, 105, 113, 1, 3, 110, 33, 111, 1, 3, 111, 105, 110, 1,
+       3, 23, 106, 105, 1, 3, 23, 105, 111, 1, 3, 106, 32, 113, 1, 3, 113, 105, 106, 1,
+  3, 114, 14, 93, 1, 3, 93, 92, 114, 1, 3, 93, 24, 102, 1, 3, 102, 92, 93, 1,
+3, 23, 111, 92, 1, 3, 23, 92, 102, 1, 3, 111, 33, 114, 1, 3, 114, 92, 111, 1,
+       3, 104, 16, 116, 1, 3, 116, 103, 104, 1, 3, 35, 118, 103, 1, 3, 35, 103, 116, 1,
+       3, 118, 31, 119, 1, 3, 119, 103, 118, 1, 3, 32, 104, 103, 1, 3, 32, 103, 119, 1,
+       3, 125, 18, 121, 1, 3, 121, 117, 125, 1, 3, 36, 123, 117, 1, 3, 36, 117, 121, 1,
+       3, 123, 31, 118, 1, 3, 118, 117, 123, 1, 3, 35, 125, 117, 1, 3, 35, 117, 118, 1,
+       3, 19, 127, 122, 1, 3, 19, 122, 130, 1, 3, 37, 128, 122, 1, 3, 37, 122, 127, 1,
+       3, 31, 123, 122, 1, 3, 31, 122, 128, 1, 3, 36, 130, 122, 1, 3, 36, 122, 123, 1,
+       3, 17, 113, 112, 1, 3, 17, 112, 131, 1, 3, 32, 119, 112, 1, 3, 32, 112, 113, 1,
+       3, 31, 128, 112, 1, 3, 31, 112, 119, 1, 3, 37, 131, 112, 1, 3, 37, 112, 128, 1,
+       3, 18, 133, 120, 1, 3, 18, 120, 121, 1, 3, 39, 134, 120, 1, 3, 39, 120, 133, 1,
+       3, 134, 27, 135, 1, 3, 135, 120, 134, 1, 3, 135, 36, 121, 1, 3, 121, 120, 135, 1,
+   3, 12, 82, 81, 1, 3, 12, 81, 138, 1, 3, 82, 28, 136, 1, 3, 136, 81, 82, 1,
+3, 27, 134, 81, 1, 3, 27, 81, 136, 1, 3, 134, 39, 138, 1, 3, 138, 81, 134, 1,
+3, 95, 15, 139, 1, 3, 139, 94, 95, 1, 3, 139, 40, 140, 1, 3, 140, 94, 139, 1,
+  3, 27, 136, 94, 1, 3, 27, 94, 140, 1, 3, 136, 28, 95, 1, 3, 95, 94, 136, 1,
+       3, 19, 130, 129, 1, 3, 19, 129, 141, 1, 3, 130, 36, 135, 1, 3, 135, 129, 130, 1,
+       3, 27, 140, 129, 1, 3, 27, 129, 135, 1, 3, 140, 40, 141, 1, 3, 141, 129, 140, 1,
+ 3, 14, 114, 89, 1, 3, 14, 89, 90, 1, 3, 114, 33, 142, 1, 3, 142, 89, 114, 1,
+  3, 25, 143, 89, 1, 3, 25, 89, 142, 1, 3, 143, 26, 90, 1, 3, 90, 89, 143, 1,
+       3, 17, 131, 109, 1, 3, 17, 109, 110, 1, 3, 131, 37, 144, 1, 3, 144, 109, 131, 1,
+       3, 25, 142, 109, 1, 3, 25, 109, 144, 1, 3, 142, 33, 110, 1, 3, 110, 109, 142, 1,
+       3, 19, 141, 126, 1, 3, 19, 126, 127, 1, 3, 141, 40, 145, 1, 3, 145, 126, 141, 1,
+       3, 25, 144, 126, 1, 3, 25, 126, 145, 1, 3, 144, 37, 127, 1, 3, 127, 126, 144, 1,
+   3, 15, 97, 96, 1, 3, 15, 96, 139, 1, 3, 97, 26, 143, 1, 3, 143, 96, 97, 1,
+3, 25, 145, 96, 1, 3, 25, 96, 143, 1, 3, 145, 40, 139, 1, 3, 139, 96, 145, 1,
+ 3, 12, 146, 75, 1, 3, 12, 75, 76, 1, 3, 146, 41, 148, 1, 3, 148, 75, 146, 1,
+  3, 21, 149, 75, 1, 3, 21, 75, 148, 1, 3, 149, 22, 76, 1, 3, 76, 75, 149, 1,
+3, 8, 151, 147, 1, 3, 8, 147, 155, 1, 3, 151, 43, 153, 1, 3, 153, 147, 151, 1,
+       3, 153, 21, 148, 1, 3, 148, 147, 153, 1, 3, 41, 155, 147, 1, 3, 41, 147, 148, 1,
+       3, 11, 157, 152, 1, 3, 11, 152, 160, 1, 3, 44, 158, 152, 1, 3, 44, 152, 157, 1,
+       3, 158, 21, 153, 1, 3, 153, 152, 158, 1, 3, 153, 43, 160, 1, 3, 160, 152, 153, 1,
+   3, 13, 88, 87, 1, 3, 13, 87, 161, 1, 3, 88, 22, 149, 1, 3, 149, 87, 88, 1,
+3, 21, 158, 87, 1, 3, 21, 87, 149, 1, 3, 158, 44, 161, 1, 3, 161, 87, 158, 1,
+       3, 18, 162, 132, 1, 3, 18, 132, 133, 1, 3, 162, 45, 164, 1, 3, 164, 132, 162, 1,
+       3, 38, 165, 132, 1, 3, 38, 132, 164, 1, 3, 165, 39, 133, 1, 3, 133, 132, 165, 1,
+       3, 170, 9, 167, 1, 3, 167, 163, 170, 1, 3, 47, 168, 163, 1, 3, 47, 163, 167, 1,
+       3, 168, 38, 164, 1, 3, 164, 163, 168, 1, 3, 45, 170, 163, 1, 3, 45, 163, 164, 1,
+3, 8, 155, 154, 1, 3, 8, 154, 173, 1, 3, 155, 41, 171, 1, 3, 171, 154, 155, 1,
+       3, 38, 168, 154, 1, 3, 38, 154, 171, 1, 3, 168, 47, 173, 1, 3, 173, 154, 168, 1,
+       3, 146, 12, 138, 1, 3, 138, 137, 146, 1, 3, 39, 165, 137, 1, 3, 39, 137, 138, 1,
+       3, 165, 38, 171, 1, 3, 171, 137, 165, 1, 3, 41, 146, 137, 1, 3, 41, 137, 171, 1,
+       3, 16, 108, 107, 1, 3, 16, 107, 177, 1, 3, 108, 30, 174, 1, 3, 174, 107, 108, 1,
+       3, 29, 176, 107, 1, 3, 29, 107, 174, 1, 3, 176, 50, 177, 1, 3, 177, 107, 176, 1,
+  3, 99, 13, 161, 1, 3, 161, 98, 99, 1, 3, 44, 178, 98, 1, 3, 44, 98, 161, 1,
+ 3, 178, 29, 174, 1, 3, 174, 98, 178, 1, 3, 30, 99, 98, 1, 3, 30, 98, 174, 1,
+       3, 11, 180, 156, 1, 3, 11, 156, 157, 1, 3, 180, 49, 181, 1, 3, 181, 156, 180, 1,
+       3, 29, 178, 156, 1, 3, 29, 156, 181, 1, 3, 178, 44, 157, 1, 3, 157, 156, 178, 1,
+       3, 185, 10, 183, 1, 3, 183, 175, 185, 1, 3, 50, 176, 175, 1, 3, 50, 175, 183, 1,
+       3, 176, 29, 181, 1, 3, 181, 175, 176, 1, 3, 49, 185, 175, 1, 3, 49, 175, 181, 1,
+       3, 18, 125, 124, 1, 3, 18, 124, 162, 1, 3, 125, 35, 186, 1, 3, 186, 124, 125, 1,
+       3, 34, 187, 124, 1, 3, 34, 124, 186, 1, 3, 187, 45, 162, 1, 3, 162, 124, 187, 1,
+       3, 16, 177, 115, 1, 3, 16, 115, 116, 1, 3, 177, 50, 188, 1, 3, 188, 115, 177, 1,
+       3, 34, 186, 115, 1, 3, 34, 115, 188, 1, 3, 186, 35, 116, 1, 3, 116, 115, 186, 1,
+       3, 183, 10, 190, 1, 3, 190, 182, 183, 1, 3, 52, 191, 182, 1, 3, 52, 182, 190, 1,
+       3, 191, 34, 188, 1, 3, 188, 182, 191, 1, 3, 50, 183, 182, 1, 3, 50, 182, 188, 1,
+       3, 193, 9, 170, 1, 3, 170, 169, 193, 1, 3, 45, 187, 169, 1, 3, 45, 169, 170, 1,
+       3, 187, 34, 191, 1, 3, 191, 169, 187, 1, 3, 52, 193, 169, 1, 3, 52, 169, 191, 1,
+       3, 201, 1, 196, 1, 3, 196, 194, 201, 1, 3, 54, 198, 194, 1, 3, 54, 194, 196, 1,
+       3, 198, 46, 199, 1, 3, 199, 194, 198, 1, 3, 56, 201, 194, 1, 3, 56, 194, 199, 1,
+       3, 206, 3, 203, 1, 3, 203, 197, 206, 1, 3, 55, 204, 197, 1, 3, 55, 197, 203, 1,
+       3, 46, 198, 197, 1, 3, 46, 197, 204, 1, 3, 198, 54, 206, 1, 3, 206, 197, 198, 1,
+       3, 208, 8, 173, 1, 3, 173, 172, 208, 1, 3, 47, 207, 172, 1, 3, 47, 172, 173, 1,
+       3, 207, 46, 204, 1, 3, 204, 172, 207, 1, 3, 204, 55, 208, 1, 3, 208, 172, 204, 1,
+3, 9, 209, 166, 1, 3, 9, 166, 167, 1, 3, 209, 56, 199, 1, 3, 199, 166, 209, 1,
+       3, 46, 207, 166, 1, 3, 46, 166, 199, 1, 3, 207, 47, 167, 1, 3, 167, 166, 207, 1,
+3, 1, 201, 200, 1, 3, 1, 200, 214, 1, 3, 201, 56, 210, 1, 3, 210, 200, 201, 1,
+       3, 51, 212, 200, 1, 3, 51, 200, 210, 1, 3, 212, 59, 214, 1, 3, 214, 200, 212, 1,
+       3, 209, 9, 193, 1, 3, 193, 192, 209, 1, 3, 193, 52, 215, 1, 3, 215, 192, 193, 1,
+       3, 215, 51, 210, 1, 3, 210, 192, 215, 1, 3, 56, 209, 192, 1, 3, 56, 192, 210, 1,
+       3, 190, 10, 216, 1, 3, 216, 189, 190, 1, 3, 57, 217, 189, 1, 3, 57, 189, 216, 1,
+       3, 217, 51, 215, 1, 3, 215, 189, 217, 1, 3, 215, 52, 190, 1, 3, 190, 189, 215, 1,
+3, 0, 219, 211, 1, 3, 0, 211, 221, 1, 3, 219, 59, 212, 1, 3, 212, 211, 219, 1,
+       3, 51, 217, 211, 1, 3, 51, 211, 212, 1, 3, 217, 57, 221, 1, 3, 221, 211, 217, 1,
+       3, 226, 0, 221, 1, 3, 221, 220, 226, 1, 3, 57, 222, 220, 1, 3, 57, 220, 221, 1,
+       3, 222, 48, 224, 1, 3, 224, 220, 222, 1, 3, 62, 226, 220, 1, 3, 62, 220, 224, 1,
+       3, 10, 185, 184, 1, 3, 10, 184, 216, 1, 3, 185, 49, 227, 1, 3, 227, 184, 185, 1,
+       3, 48, 222, 184, 1, 3, 48, 184, 227, 1, 3, 222, 57, 216, 1, 3, 216, 184, 222, 1,
+       3, 180, 11, 228, 1, 3, 228, 179, 180, 1, 3, 228, 60, 229, 1, 3, 229, 179, 228, 1,
+       3, 229, 48, 227, 1, 3, 227, 179, 229, 1, 3, 49, 180, 179, 1, 3, 49, 179, 227, 1,
+       3, 233, 2, 231, 1, 3, 231, 223, 233, 1, 3, 231, 62, 224, 1, 3, 224, 223, 231, 1,
+       3, 48, 229, 223, 1, 3, 48, 223, 224, 1, 3, 60, 233, 223, 1, 3, 60, 223, 229, 1,
+3, 2, 233, 232, 1, 3, 2, 232, 237, 1, 3, 60, 234, 232, 1, 3, 60, 232, 233, 1,
+       3, 42, 235, 232, 1, 3, 42, 232, 234, 1, 3, 235, 64, 237, 1, 3, 237, 232, 235, 1,
+       3, 11, 160, 159, 1, 3, 11, 159, 228, 1, 3, 160, 43, 238, 1, 3, 238, 159, 160, 1,
+       3, 42, 234, 159, 1, 3, 42, 159, 238, 1, 3, 234, 60, 228, 1, 3, 228, 159, 234, 1,
+3, 8, 208, 150, 1, 3, 8, 150, 151, 1, 3, 208, 55, 239, 1, 3, 239, 150, 208, 1,
+       3, 42, 238, 150, 1, 3, 42, 150, 239, 1, 3, 238, 43, 151, 1, 3, 151, 150, 238, 1,
+3, 3, 241, 202, 1, 3, 3, 202, 203, 1, 3, 241, 64, 235, 1, 3, 235, 202, 241, 1,
+       3, 42, 239, 202, 1, 3, 42, 202, 235, 1, 3, 55, 203, 202, 1, 3, 55, 202, 239, 1,
+       3, 245, 2, 237, 1, 3, 237, 236, 245, 1, 3, 64, 242, 236, 1, 3, 64, 236, 237, 1,
+       3, 242, 63, 244, 1, 3, 244, 236, 242, 1, 3, 68, 245, 236, 1, 3, 68, 236, 244, 1,
+       3, 241, 3, 246, 1, 3, 246, 240, 241, 1, 3, 65, 248, 240, 1, 3, 65, 240, 246, 1,
+       3, 248, 63, 242, 1, 3, 242, 240, 248, 1, 3, 64, 241, 240, 1, 3, 64, 240, 242, 1,
+3, 4, 250, 247, 1, 3, 4, 247, 253, 1, 3, 67, 251, 247, 1, 3, 67, 247, 250, 1,
+       3, 63, 248, 247, 1, 3, 63, 247, 251, 1, 3, 65, 253, 247, 1, 3, 65, 247, 248, 1,
+3, 7, 255, 243, 1, 3, 7, 243, 257, 1, 3, 68, 244, 243, 1, 3, 68, 243, 255, 1,
+       3, 63, 251, 243, 1, 3, 63, 243, 244, 1, 3, 67, 257, 243, 1, 3, 67, 243, 251, 1,
+3, 3, 206, 205, 1, 3, 3, 205, 246, 1, 3, 54, 258, 205, 1, 3, 54, 205, 206, 1,
+       3, 258, 53, 259, 1, 3, 259, 205, 258, 1, 3, 65, 246, 205, 1, 3, 65, 205, 259, 1,
+3, 1, 260, 195, 1, 3, 1, 195, 196, 1, 3, 260, 69, 262, 1, 3, 262, 195, 260, 1,
+       3, 53, 258, 195, 1, 3, 53, 195, 262, 1, 3, 258, 54, 196, 1, 3, 196, 195, 258, 1,
+       3, 267, 5, 264, 1, 3, 264, 261, 267, 1, 3, 70, 265, 261, 1, 3, 70, 261, 264, 1,
+       3, 53, 262, 261, 1, 3, 53, 261, 265, 1, 3, 262, 69, 267, 1, 3, 267, 261, 262, 1,
+3, 4, 253, 252, 1, 3, 4, 252, 268, 1, 3, 253, 65, 259, 1, 3, 259, 252, 253, 1,
+       3, 53, 265, 252, 1, 3, 53, 252, 259, 1, 3, 265, 70, 268, 1, 3, 268, 252, 265, 1,
+       3, 260, 1, 214, 1, 3, 214, 213, 260, 1, 3, 59, 269, 213, 1, 3, 59, 213, 214, 1,
+       3, 269, 58, 270, 1, 3, 270, 213, 269, 1, 3, 69, 260, 213, 1, 3, 69, 213, 270, 1,
+       3, 219, 0, 271, 1, 3, 271, 218, 219, 1, 3, 71, 273, 218, 1, 3, 71, 218, 271, 1,
+       3, 273, 58, 269, 1, 3, 269, 218, 273, 1, 3, 59, 219, 218, 1, 3, 59, 218, 269, 1,
+3, 6, 275, 272, 1, 3, 6, 272, 278, 1, 3, 72, 276, 272, 1, 3, 72, 272, 275, 1,
+       3, 58, 273, 272, 1, 3, 58, 272, 276, 1, 3, 273, 71, 278, 1, 3, 278, 272, 273, 1,
+3, 5, 267, 266, 1, 3, 5, 266, 279, 1, 3, 267, 69, 270, 1, 3, 270, 266, 267, 1,
+       3, 58, 276, 266, 1, 3, 58, 266, 270, 1, 3, 72, 279, 266, 1, 3, 72, 266, 276, 1,
+3, 0, 226, 225, 1, 3, 0, 225, 271, 1, 3, 226, 62, 280, 1, 3, 280, 225, 226, 1,
+       3, 61, 281, 225, 1, 3, 61, 225, 280, 1, 3, 281, 71, 271, 1, 3, 271, 225, 281, 1,
+3, 2, 245, 230, 1, 3, 2, 230, 231, 1, 3, 68, 282, 230, 1, 3, 68, 230, 245, 1,
+       3, 282, 61, 280, 1, 3, 280, 230, 282, 1, 3, 62, 231, 230, 1, 3, 62, 230, 280, 1,
+3, 7, 283, 254, 1, 3, 7, 254, 255, 1, 3, 283, 73, 284, 1, 3, 284, 254, 283, 1,
+       3, 61, 282, 254, 1, 3, 61, 254, 284, 1, 3, 282, 68, 255, 1, 3, 255, 254, 282, 1,
+       3, 285, 6, 278, 1, 3, 278, 277, 285, 1, 3, 278, 71, 281, 1, 3, 281, 277, 278, 1,
+       3, 61, 284, 277, 1, 3, 61, 277, 281, 1, 3, 73, 285, 277, 1, 3, 73, 277, 284, 1,
+3, 4, 268, 249, 1, 3, 4, 249, 250, 1, 3, 268, 70, 286, 1, 3, 286, 249, 268, 1,
+       3, 66, 287, 249, 1, 3, 66, 249, 286, 1, 3, 287, 67, 250, 1, 3, 250, 249, 287, 1,
+3, 5, 279, 263, 1, 3, 5, 263, 264, 1, 3, 279, 72, 288, 1, 3, 288, 263, 279, 1,
+       3, 66, 286, 263, 1, 3, 66, 263, 288, 1, 3, 286, 70, 264, 1, 3, 264, 263, 286, 1,
+3, 6, 285, 274, 1, 3, 6, 274, 275, 1, 3, 285, 73, 289, 1, 3, 289, 274, 285, 1,
+       3, 66, 288, 274, 1, 3, 66, 274, 289, 1, 3, 288, 72, 275, 1, 3, 275, 274, 288, 1,
+3, 7, 257, 256, 1, 3, 7, 256, 283, 1, 3, 257, 67, 287, 1, 3, 287, 256, 257, 1,
+       3, 66, 289, 256, 1, 3, 66, 256, 287, 1, 3, 289, 73, 283, 1, 3, 283, 256, 289, 1,
+
+       0
+};
+
+struct lwo  LWO_s1_4 =
+{
+       290,                    /* number of points */
+       s1_4_PNTS, s1_4_normals, s1_4_POLS, 0L
+};
+
+#endif /* USE_GL */
+
+/* End of s1_4.c */
diff --git a/hacks/glx/s1_5.c b/hacks/glx/s1_5.c
new file mode 100644 (file)
index 0000000..53cd0bf
--- /dev/null
@@ -0,0 +1,1057 @@
+#if !defined( lint ) && !defined( SABER )
+static const char sccsid[] = "@(#)s1_5.c       4.04 97/07/28 xlockmore";
+
+#endif
+
+/*-
+ * Points, polygons, and normal vectors to render "s1_5" in 3D.
+ *
+ * Generated by lw2ogl.  Link this with your program but do
+ * not edit by hand.
+ */
+
+#ifndef STANDALONE
+#include "xlock.h"
+#endif
+
+#ifdef USE_GL
+
+#ifdef STANDALONE
+#include <GL/glx.h>
+#endif
+#include <GL/gl.h>
+#include "buildlwo.h"
+
+static GLfloat s1_5_PNTS[] =
+{
+       (GLfloat) 1.333479, (GLfloat) - 0.188456, (GLfloat) - 0.340079,
+       (GLfloat) 1.333479, (GLfloat) - 0.188456, (GLfloat) - 0.659921,
+       (GLfloat) 1.633195, (GLfloat) - 0.090616, (GLfloat) - 0.340079,
+       (GLfloat) 1.633195, (GLfloat) - 0.090616, (GLfloat) - 0.659921,
+       (GLfloat) 1.670754, (GLfloat) - 0.221475, (GLfloat) - 0.638667,
+       (GLfloat) 1.402870, (GLfloat) - 0.293254, (GLfloat) - 0.638667,
+       (GLfloat) 1.402870, (GLfloat) - 0.293254, (GLfloat) - 0.361333,
+       (GLfloat) 1.670754, (GLfloat) - 0.221475, (GLfloat) - 0.361333,
+       (GLfloat) 1.332183, (GLfloat) 0.266938, (GLfloat) - 0.619965,
+       (GLfloat) 1.190836, (GLfloat) 0.100363, (GLfloat) - 0.619965,
+       (GLfloat) 1.190836, (GLfloat) 0.100363, (GLfloat) - 0.380035,
+       (GLfloat) 1.332183, (GLfloat) 0.266938, (GLfloat) - 0.380035,
+       (GLfloat) 0.995497, (GLfloat) 0.593044, (GLfloat) - 0.659921,
+       (GLfloat) 0.995497, (GLfloat) 0.593044, (GLfloat) - 0.340079,
+       (GLfloat) 0.874620, (GLfloat) 0.619745, (GLfloat) - 0.361333,
+       (GLfloat) 0.874620, (GLfloat) 0.619745, (GLfloat) - 0.638667,
+       (GLfloat) 0.974692, (GLfloat) 0.281188, (GLfloat) - 0.340079,
+       (GLfloat) 0.874620, (GLfloat) 0.342412, (GLfloat) - 0.361333,
+       (GLfloat) 0.974692, (GLfloat) 0.281188, (GLfloat) - 0.659921,
+       (GLfloat) 0.874620, (GLfloat) 0.342412, (GLfloat) - 0.638667,
+       (GLfloat) 0.906869, (GLfloat) 0.713633, (GLfloat) - 0.500000,
+       (GLfloat) 1.161726, (GLfloat) 0.497346, (GLfloat) - 0.500000,
+       (GLfloat) 0.999280, (GLfloat) 0.649745, (GLfloat) - 0.500000,
+       (GLfloat) 0.905451, (GLfloat) 0.476683, (GLfloat) - 0.262505,
+       (GLfloat) 0.907098, (GLfloat) 0.650057, (GLfloat) - 0.326227,
+       (GLfloat) 0.856159, (GLfloat) 0.481079, (GLfloat) - 0.500000,
+       (GLfloat) 0.867922, (GLfloat) 0.658641, (GLfloat) - 0.500000,
+       (GLfloat) 0.905451, (GLfloat) 0.476683, (GLfloat) - 0.737495,
+       (GLfloat) 0.907098, (GLfloat) 0.650057, (GLfloat) - 0.673773,
+       (GLfloat) 1.114357, (GLfloat) 0.334395, (GLfloat) - 0.317564,
+       (GLfloat) 0.985095, (GLfloat) 0.437116, (GLfloat) - 0.281926,
+       (GLfloat) 0.904032, (GLfloat) 0.239732, (GLfloat) - 0.500000,
+       (GLfloat) 0.905018, (GLfloat) 0.303308, (GLfloat) - 0.326227,
+       (GLfloat) 0.867922, (GLfloat) 0.481079, (GLfloat) - 0.322437,
+       (GLfloat) 1.066987, (GLfloat) 0.171444, (GLfloat) - 0.500000,
+       (GLfloat) 0.970910, (GLfloat) 0.224487, (GLfloat) - 0.500000,
+       (GLfloat) 0.905018, (GLfloat) 0.303308, (GLfloat) - 0.673773,
+       (GLfloat) 0.867922, (GLfloat) 0.303516, (GLfloat) - 0.500000,
+       (GLfloat) 1.114357, (GLfloat) 0.334395, (GLfloat) - 0.682436,
+       (GLfloat) 0.985095, (GLfloat) 0.437116, (GLfloat) - 0.718074,
+       (GLfloat) 0.867922, (GLfloat) 0.481079, (GLfloat) - 0.677562,
+       (GLfloat) 1.149095, (GLfloat) 0.453892, (GLfloat) - 0.633787,
+       (GLfloat) 1.544380, (GLfloat) 0.092162, (GLfloat) - 0.500000,
+       (GLfloat) 1.357882, (GLfloat) 0.297224, (GLfloat) - 0.500000,
+       (GLfloat) 1.149095, (GLfloat) 0.453892, (GLfloat) - 0.366213,
+       (GLfloat) 1.079619, (GLfloat) 0.214898, (GLfloat) - 0.633787,
+       (GLfloat) 1.391060, (GLfloat) 0.010509, (GLfloat) - 0.682436,
+       (GLfloat) 1.261509, (GLfloat) 0.183650, (GLfloat) - 0.663589,
+       (GLfloat) 1.391060, (GLfloat) 0.010509, (GLfloat) - 0.317564,
+       (GLfloat) 1.261509, (GLfloat) 0.183650, (GLfloat) - 0.336411,
+       (GLfloat) 1.079619, (GLfloat) 0.214898, (GLfloat) - 0.366213,
+       (GLfloat) 1.237741, (GLfloat) - 0.071143, (GLfloat) - 0.500000,
+       (GLfloat) 1.165137, (GLfloat) 0.070077, (GLfloat) - 0.500000,
+       (GLfloat) 1.526344, (GLfloat) - 0.226473, (GLfloat) - 0.737495,
+       (GLfloat) 1.483337, (GLfloat) - 0.139536, (GLfloat) - 0.718074,
+       (GLfloat) 1.503495, (GLfloat) 0.070388, (GLfloat) - 0.633787,
+       (GLfloat) 1.278626, (GLfloat) - 0.049369, (GLfloat) - 0.633787,
+       (GLfloat) 1.278626, (GLfloat) - 0.049369, (GLfloat) - 0.366213,
+       (GLfloat) 1.297571, (GLfloat) - 0.288968, (GLfloat) - 0.500000,
+       (GLfloat) 1.278985, (GLfloat) - 0.206245, (GLfloat) - 0.500000,
+       (GLfloat) 1.503495, (GLfloat) 0.070388, (GLfloat) - 0.366213,
+       (GLfloat) 1.526344, (GLfloat) - 0.226473, (GLfloat) - 0.262505,
+       (GLfloat) 1.483337, (GLfloat) - 0.139536, (GLfloat) - 0.281926,
+       (GLfloat) 1.755118, (GLfloat) - 0.163978, (GLfloat) - 0.500000,
+       (GLfloat) 1.687689, (GLfloat) - 0.072827, (GLfloat) - 0.500000,
+       (GLfloat) 1.693578, (GLfloat) - 0.180157, (GLfloat) - 0.673773,
+       (GLfloat) 1.541590, (GLfloat) - 0.275196, (GLfloat) - 0.500000,
+       (GLfloat) 1.710058, (GLfloat) - 0.217878, (GLfloat) - 0.500000,
+       (GLfloat) 1.693578, (GLfloat) - 0.180157, (GLfloat) - 0.326227,
+       (GLfloat) 1.358796, (GLfloat) - 0.271614, (GLfloat) - 0.673773,
+       (GLfloat) 1.538546, (GLfloat) - 0.263835, (GLfloat) - 0.677562,
+       (GLfloat) 1.358796, (GLfloat) - 0.271614, (GLfloat) - 0.326227,
+       (GLfloat) 1.367033, (GLfloat) - 0.309791, (GLfloat) - 0.500000,
+       (GLfloat) 1.538546, (GLfloat) - 0.263835, (GLfloat) - 0.322437,
+       (GLfloat) 0.944384, (GLfloat) 0.679375, (GLfloat) - 0.593392,
+       (GLfloat) 1.071585, (GLfloat) 0.569561, (GLfloat) - 0.579959,
+       (GLfloat) 0.998334, (GLfloat) 0.635570, (GLfloat) - 0.587230,
+       (GLfloat) 0.944384, (GLfloat) 0.679375, (GLfloat) - 0.406608,
+       (GLfloat) 0.944762, (GLfloat) 0.694795, (GLfloat) - 0.500000,
+       (GLfloat) 0.883764, (GLfloat) 0.687079, (GLfloat) - 0.587500,
+       (GLfloat) 0.907078, (GLfloat) 0.697653, (GLfloat) - 0.594723,
+       (GLfloat) 0.941357, (GLfloat) 0.556014, (GLfloat) - 0.717914,
+       (GLfloat) 0.943249, (GLfloat) 0.633115, (GLfloat) - 0.671218,
+       (GLfloat) 0.941357, (GLfloat) 0.556014, (GLfloat) - 0.282086,
+       (GLfloat) 0.943249, (GLfloat) 0.633115, (GLfloat) - 0.328782,
+       (GLfloat) 0.883764, (GLfloat) 0.687079, (GLfloat) - 0.412500,
+       (GLfloat) 0.907078, (GLfloat) 0.697653, (GLfloat) - 0.405277,
+       (GLfloat) 1.071585, (GLfloat) 0.569561, (GLfloat) - 0.420041,
+       (GLfloat) 0.998334, (GLfloat) 0.635570, (GLfloat) - 0.412770,
+       (GLfloat) 0.861889, (GLfloat) 0.571579, (GLfloat) - 0.409500,
+       (GLfloat) 0.870135, (GLfloat) 0.645704, (GLfloat) - 0.417500,
+       (GLfloat) 0.882548, (GLfloat) 0.702579, (GLfloat) - 0.500000,
+       (GLfloat) 0.883764, (GLfloat) 0.568579, (GLfloat) - 0.294000,
+       (GLfloat) 0.884979, (GLfloat) 0.641954, (GLfloat) - 0.339125,
+       (GLfloat) 0.883764, (GLfloat) 0.568579, (GLfloat) - 0.706000,
+       (GLfloat) 0.884979, (GLfloat) 0.641954, (GLfloat) - 0.660875,
+       (GLfloat) 0.861889, (GLfloat) 0.571579, (GLfloat) - 0.590500,
+       (GLfloat) 0.870135, (GLfloat) 0.645704, (GLfloat) - 0.582500,
+       (GLfloat) 1.056455, (GLfloat) 0.468757, (GLfloat) - 0.313428,
+       (GLfloat) 0.990769, (GLfloat) 0.522168, (GLfloat) - 0.296464,
+       (GLfloat) 0.936818, (GLfloat) 0.370973, (GLfloat) - 0.282086,
+       (GLfloat) 0.939088, (GLfloat) 0.463494, (GLfloat) - 0.266520,
+       (GLfloat) 0.906322, (GLfloat) 0.571188, (GLfloat) - 0.278521,
+       (GLfloat) 0.933792, (GLfloat) 0.247612, (GLfloat) - 0.406608,
+       (GLfloat) 0.934927, (GLfloat) 0.293873, (GLfloat) - 0.328782,
+       (GLfloat) 0.883764, (GLfloat) 0.393579, (GLfloat) - 0.294000,
+       (GLfloat) 0.905187, (GLfloat) 0.382177, (GLfloat) - 0.278521,
+       (GLfloat) 1.033759, (GLfloat) 0.317550, (GLfloat) - 0.313428,
+       (GLfloat) 0.979421, (GLfloat) 0.352064, (GLfloat) - 0.296464,
+       (GLfloat) 0.861889, (GLfloat) 0.390579, (GLfloat) - 0.409500,
+       (GLfloat) 0.870135, (GLfloat) 0.398579, (GLfloat) - 0.335375,
+       (GLfloat) 0.882548, (GLfloat) 0.481079, (GLfloat) - 0.278500,
+       (GLfloat) 0.883764, (GLfloat) 0.275079, (GLfloat) - 0.412500,
+       (GLfloat) 0.884979, (GLfloat) 0.320204, (GLfloat) - 0.339125,
+       (GLfloat) 0.870135, (GLfloat) 0.563579, (GLfloat) - 0.335375,
+       (GLfloat) 1.018628, (GLfloat) 0.216746, (GLfloat) - 0.420041,
+       (GLfloat) 0.971855, (GLfloat) 0.238662, (GLfloat) - 0.412770,
+       (GLfloat) 0.933792, (GLfloat) 0.247612, (GLfloat) - 0.593392,
+       (GLfloat) 0.933414, (GLfloat) 0.232192, (GLfloat) - 0.500000,
+       (GLfloat) 0.904430, (GLfloat) 0.255712, (GLfloat) - 0.405277,
+       (GLfloat) 0.936818, (GLfloat) 0.370973, (GLfloat) - 0.717914,
+       (GLfloat) 0.934927, (GLfloat) 0.293873, (GLfloat) - 0.671218,
+       (GLfloat) 0.883764, (GLfloat) 0.275079, (GLfloat) - 0.587500,
+       (GLfloat) 0.904430, (GLfloat) 0.255712, (GLfloat) - 0.594723,
+       (GLfloat) 1.018628, (GLfloat) 0.216746, (GLfloat) - 0.579959,
+       (GLfloat) 0.971855, (GLfloat) 0.238662, (GLfloat) - 0.587230,
+       (GLfloat) 0.861889, (GLfloat) 0.390579, (GLfloat) - 0.590500,
+       (GLfloat) 0.870135, (GLfloat) 0.316454, (GLfloat) - 0.582500,
+       (GLfloat) 0.882548, (GLfloat) 0.259579, (GLfloat) - 0.500000,
+       (GLfloat) 0.883764, (GLfloat) 0.393579, (GLfloat) - 0.706000,
+       (GLfloat) 0.884979, (GLfloat) 0.320204, (GLfloat) - 0.660875,
+       (GLfloat) 0.870135, (GLfloat) 0.316454, (GLfloat) - 0.417500,
+       (GLfloat) 1.033759, (GLfloat) 0.317550, (GLfloat) - 0.686572,
+       (GLfloat) 0.979421, (GLfloat) 0.352064, (GLfloat) - 0.703536,
+       (GLfloat) 0.939088, (GLfloat) 0.463494, (GLfloat) - 0.733480,
+       (GLfloat) 0.905187, (GLfloat) 0.382177, (GLfloat) - 0.721479,
+       (GLfloat) 0.906322, (GLfloat) 0.571188, (GLfloat) - 0.721479,
+       (GLfloat) 1.056455, (GLfloat) 0.468757, (GLfloat) - 0.686572,
+       (GLfloat) 0.990769, (GLfloat) 0.522168, (GLfloat) - 0.703536,
+       (GLfloat) 0.870135, (GLfloat) 0.563579, (GLfloat) - 0.664625,
+       (GLfloat) 0.882548, (GLfloat) 0.481079, (GLfloat) - 0.721500,
+       (GLfloat) 0.870135, (GLfloat) 0.398579, (GLfloat) - 0.664625,
+       (GLfloat) 0.859111, (GLfloat) 0.481079, (GLfloat) - 0.402250,
+       (GLfloat) 0.859111, (GLfloat) 0.578829, (GLfloat) - 0.500000,
+       (GLfloat) 0.859111, (GLfloat) 0.383329, (GLfloat) - 0.500000,
+       (GLfloat) 0.859111, (GLfloat) 0.481079, (GLfloat) - 0.597750,
+       (GLfloat) 1.065911, (GLfloat) 0.531759, (GLfloat) - 0.646592,
+       (GLfloat) 1.253715, (GLfloat) 0.391468, (GLfloat) - 0.567669,
+       (GLfloat) 1.158568, (GLfloat) 0.486483, (GLfloat) - 0.572975,
+       (GLfloat) 1.073477, (GLfloat) 0.582162, (GLfloat) - 0.500000,
+       (GLfloat) 1.446226, (GLfloat) 0.186168, (GLfloat) - 0.567669,
+       (GLfloat) 1.351457, (GLfloat) 0.289652, (GLfloat) - 0.565436,
+       (GLfloat) 1.253715, (GLfloat) 0.391468, (GLfloat) - 0.432331,
+       (GLfloat) 1.258403, (GLfloat) 0.400600, (GLfloat) - 0.500000,
+       (GLfloat) 1.216209, (GLfloat) 0.318418, (GLfloat) - 0.657894,
+       (GLfloat) 1.239650, (GLfloat) 0.364075, (GLfloat) - 0.624059,
+       (GLfloat) 1.216209, (GLfloat) 0.318418, (GLfloat) - 0.342106,
+       (GLfloat) 1.239650, (GLfloat) 0.364075, (GLfloat) - 0.375941,
+       (GLfloat) 1.158568, (GLfloat) 0.486483, (GLfloat) - 0.427025,
+       (GLfloat) 1.446226, (GLfloat) 0.186168, (GLfloat) - 0.432331,
+       (GLfloat) 1.351457, (GLfloat) 0.289652, (GLfloat) - 0.434564,
+       (GLfloat) 1.065911, (GLfloat) 0.531759, (GLfloat) - 0.353408,
+       (GLfloat) 1.024302, (GLfloat) 0.254547, (GLfloat) - 0.646592,
+       (GLfloat) 1.159950, (GLfloat) 0.208844, (GLfloat) - 0.657894,
+       (GLfloat) 1.095409, (GLfloat) 0.269215, (GLfloat) - 0.670274,
+       (GLfloat) 1.045107, (GLfloat) 0.393153, (GLfloat) - 0.699898,
+       (GLfloat) 1.280017, (GLfloat) 0.059132, (GLfloat) - 0.657894,
+       (GLfloat) 1.222960, (GLfloat) 0.138221, (GLfloat) - 0.652683,
+       (GLfloat) 1.188080, (GLfloat) 0.263631, (GLfloat) - 0.669172,
+       (GLfloat) 1.122445, (GLfloat) 0.135794, (GLfloat) - 0.567669,
+       (GLfloat) 1.136509, (GLfloat) 0.163187, (GLfloat) - 0.624059,
+       (GLfloat) 1.133305, (GLfloat) 0.399575, (GLfloat) - 0.670274,
+       (GLfloat) 1.379742, (GLfloat) 0.135354, (GLfloat) - 0.657894,
+       (GLfloat) 1.300058, (GLfloat) 0.229080, (GLfloat) - 0.652683,
+       (GLfloat) 1.045107, (GLfloat) 0.393153, (GLfloat) - 0.300102,
+       (GLfloat) 1.159950, (GLfloat) 0.208844, (GLfloat) - 0.342106,
+       (GLfloat) 1.095409, (GLfloat) 0.269215, (GLfloat) - 0.329726,
+       (GLfloat) 1.024302, (GLfloat) 0.254547, (GLfloat) - 0.353408,
+       (GLfloat) 1.133305, (GLfloat) 0.399575, (GLfloat) - 0.329726,
+       (GLfloat) 1.379742, (GLfloat) 0.135354, (GLfloat) - 0.342106,
+       (GLfloat) 1.300058, (GLfloat) 0.229080, (GLfloat) - 0.347317,
+       (GLfloat) 1.188080, (GLfloat) 0.263631, (GLfloat) - 0.330828,
+       (GLfloat) 1.122445, (GLfloat) 0.135794, (GLfloat) - 0.432331,
+       (GLfloat) 1.136509, (GLfloat) 0.163187, (GLfloat) - 0.375941,
+       (GLfloat) 1.280017, (GLfloat) 0.059132, (GLfloat) - 0.342106,
+       (GLfloat) 1.222960, (GLfloat) 0.138221, (GLfloat) - 0.347317,
+       (GLfloat) 1.016736, (GLfloat) 0.204145, (GLfloat) - 0.500000,
+       (GLfloat) 1.070145, (GLfloat) 0.182308, (GLfloat) - 0.572975,
+       (GLfloat) 1.070145, (GLfloat) 0.182308, (GLfloat) - 0.427025,
+       (GLfloat) 1.213533, (GLfloat) 0.008318, (GLfloat) - 0.432331,
+       (GLfloat) 1.171562, (GLfloat) 0.077649, (GLfloat) - 0.434564,
+       (GLfloat) 1.117756, (GLfloat) 0.126662, (GLfloat) - 0.500000,
+       (GLfloat) 1.213533, (GLfloat) 0.008318, (GLfloat) - 0.567669,
+       (GLfloat) 1.171562, (GLfloat) 0.077649, (GLfloat) - 0.565436,
+       (GLfloat) 1.370721, (GLfloat) - 0.099359, (GLfloat) - 0.686572,
+       (GLfloat) 1.420971, (GLfloat) - 0.216460, (GLfloat) - 0.717914,
+       (GLfloat) 1.401596, (GLfloat) - 0.166219, (GLfloat) - 0.703536,
+       (GLfloat) 1.515124, (GLfloat) - 0.041541, (GLfloat) - 0.686572,
+       (GLfloat) 1.442923, (GLfloat) - 0.070450, (GLfloat) - 0.699898,
+       (GLfloat) 1.329732, (GLfloat) - 0.022152, (GLfloat) - 0.670274,
+       (GLfloat) 1.274453, (GLfloat) - 0.137904, (GLfloat) - 0.579959,
+       (GLfloat) 1.310553, (GLfloat) - 0.123450, (GLfloat) - 0.646592,
+       (GLfloat) 1.611392, (GLfloat) - 0.002996, (GLfloat) - 0.579959,
+       (GLfloat) 1.575292, (GLfloat) - 0.017451, (GLfloat) - 0.646592,
+       (GLfloat) 1.452388, (GLfloat) 0.043170, (GLfloat) - 0.670274,
+       (GLfloat) 1.599377, (GLfloat) - 0.164832, (GLfloat) - 0.717914,
+       (GLfloat) 1.565078, (GLfloat) - 0.112852, (GLfloat) - 0.703536,
+       (GLfloat) 1.329879, (GLfloat) 0.097243, (GLfloat) - 0.669172,
+       (GLfloat) 1.421294, (GLfloat) 0.167113, (GLfloat) - 0.624059,
+       (GLfloat) 1.238464, (GLfloat) 0.027373, (GLfloat) - 0.624059,
+       (GLfloat) 1.247962, (GLfloat) - 0.065700, (GLfloat) - 0.572975,
+       (GLfloat) 1.274453, (GLfloat) - 0.137904, (GLfloat) - 0.420041,
+       (GLfloat) 1.262419, (GLfloat) - 0.142723, (GLfloat) - 0.500000,
+       (GLfloat) 1.302034, (GLfloat) - 0.250880, (GLfloat) - 0.593392,
+       (GLfloat) 1.292609, (GLfloat) - 0.201797, (GLfloat) - 0.587230,
+       (GLfloat) 1.205222, (GLfloat) 0.001966, (GLfloat) - 0.500000,
+       (GLfloat) 1.238464, (GLfloat) 0.027373, (GLfloat) - 0.375941,
+       (GLfloat) 1.247962, (GLfloat) - 0.065700, (GLfloat) - 0.427025,
+       (GLfloat) 1.302034, (GLfloat) - 0.250880, (GLfloat) - 0.406608,
+       (GLfloat) 1.292609, (GLfloat) - 0.201797, (GLfloat) - 0.412770,
+       (GLfloat) 1.370721, (GLfloat) - 0.099359, (GLfloat) - 0.313428,
+       (GLfloat) 1.310553, (GLfloat) - 0.123450, (GLfloat) - 0.353408,
+       (GLfloat) 1.329732, (GLfloat) - 0.022152, (GLfloat) - 0.329726,
+       (GLfloat) 1.515124, (GLfloat) - 0.041541, (GLfloat) - 0.313428,
+       (GLfloat) 1.442923, (GLfloat) - 0.070450, (GLfloat) - 0.300102,
+       (GLfloat) 1.420971, (GLfloat) - 0.216460, (GLfloat) - 0.282086,
+       (GLfloat) 1.401596, (GLfloat) - 0.166219, (GLfloat) - 0.296464,
+       (GLfloat) 1.329879, (GLfloat) 0.097243, (GLfloat) - 0.330828,
+       (GLfloat) 1.421294, (GLfloat) 0.167113, (GLfloat) - 0.375941,
+       (GLfloat) 1.452388, (GLfloat) 0.043170, (GLfloat) - 0.329726,
+       (GLfloat) 1.599377, (GLfloat) - 0.164832, (GLfloat) - 0.282086,
+       (GLfloat) 1.565078, (GLfloat) - 0.112852, (GLfloat) - 0.296464,
+       (GLfloat) 1.611392, (GLfloat) - 0.002996, (GLfloat) - 0.420041,
+       (GLfloat) 1.575292, (GLfloat) - 0.017451, (GLfloat) - 0.353408,
+       (GLfloat) 1.534158, (GLfloat) 0.086718, (GLfloat) - 0.427025,
+       (GLfloat) 1.623426, (GLfloat) 0.001822, (GLfloat) - 0.500000,
+       (GLfloat) 1.718314, (GLfloat) - 0.130413, (GLfloat) - 0.406608,
+       (GLfloat) 1.674065, (GLfloat) - 0.077274, (GLfloat) - 0.412770,
+       (GLfloat) 1.454536, (GLfloat) 0.192520, (GLfloat) - 0.500000,
+       (GLfloat) 1.534158, (GLfloat) 0.086718, (GLfloat) - 0.572975,
+       (GLfloat) 1.718314, (GLfloat) - 0.130413, (GLfloat) - 0.593392,
+       (GLfloat) 1.674065, (GLfloat) - 0.077274, (GLfloat) - 0.587230,
+       (GLfloat) 1.733181, (GLfloat) - 0.126110, (GLfloat) - 0.500000,
+       (GLfloat) 1.733426, (GLfloat) - 0.195216, (GLfloat) - 0.412500,
+       (GLfloat) 1.739610, (GLfloat) - 0.167898, (GLfloat) - 0.405277,
+       (GLfloat) 1.673712, (GLfloat) - 0.143320, (GLfloat) - 0.328782,
+       (GLfloat) 1.673712, (GLfloat) - 0.143320, (GLfloat) - 0.671218,
+       (GLfloat) 1.733426, (GLfloat) - 0.195216, (GLfloat) - 0.587500,
+       (GLfloat) 1.739610, (GLfloat) - 0.167898, (GLfloat) - 0.594723,
+       (GLfloat) 1.627523, (GLfloat) - 0.246239, (GLfloat) - 0.590500,
+       (GLfloat) 1.696988, (GLfloat) - 0.219088, (GLfloat) - 0.582500,
+       (GLfloat) 1.748713, (GLfloat) - 0.192378, (GLfloat) - 0.500000,
+       (GLfloat) 1.618964, (GLfloat) - 0.225886, (GLfloat) - 0.706000,
+       (GLfloat) 1.689524, (GLfloat) - 0.205721, (GLfloat) - 0.660875,
+       (GLfloat) 1.618964, (GLfloat) - 0.225886, (GLfloat) - 0.294000,
+       (GLfloat) 1.689524, (GLfloat) - 0.205721, (GLfloat) - 0.339125,
+       (GLfloat) 1.627523, (GLfloat) - 0.246239, (GLfloat) - 0.409500,
+       (GLfloat) 1.696988, (GLfloat) - 0.219088, (GLfloat) - 0.417500,
+       (GLfloat) 1.510174, (GLfloat) - 0.190646, (GLfloat) - 0.733480,
+       (GLfloat) 1.617509, (GLfloat) - 0.201252, (GLfloat) - 0.721479,
+       (GLfloat) 1.346635, (GLfloat) - 0.237972, (GLfloat) - 0.671218,
+       (GLfloat) 1.449927, (GLfloat) - 0.271179, (GLfloat) - 0.706000,
+       (GLfloat) 1.435022, (GLfloat) - 0.251106, (GLfloat) - 0.721479,
+       (GLfloat) 1.452691, (GLfloat) - 0.293085, (GLfloat) - 0.590500,
+       (GLfloat) 1.458284, (GLfloat) - 0.283049, (GLfloat) - 0.664625,
+       (GLfloat) 1.534760, (GLfloat) - 0.249706, (GLfloat) - 0.721500,
+       (GLfloat) 1.335465, (GLfloat) - 0.301849, (GLfloat) - 0.587500,
+       (GLfloat) 1.378738, (GLfloat) - 0.288996, (GLfloat) - 0.660875,
+       (GLfloat) 1.617662, (GLfloat) - 0.240344, (GLfloat) - 0.664625,
+       (GLfloat) 1.287166, (GLfloat) - 0.255182, (GLfloat) - 0.500000,
+       (GLfloat) 1.312921, (GLfloat) - 0.284460, (GLfloat) - 0.594723,
+       (GLfloat) 1.346635, (GLfloat) - 0.237972, (GLfloat) - 0.328782,
+       (GLfloat) 1.335465, (GLfloat) - 0.301849, (GLfloat) - 0.412500,
+       (GLfloat) 1.312921, (GLfloat) - 0.284460, (GLfloat) - 0.405277,
+       (GLfloat) 1.452691, (GLfloat) - 0.293085, (GLfloat) - 0.409500,
+       (GLfloat) 1.378957, (GLfloat) - 0.304305, (GLfloat) - 0.417500,
+       (GLfloat) 1.320807, (GLfloat) - 0.307035, (GLfloat) - 0.500000,
+       (GLfloat) 1.449927, (GLfloat) - 0.271179, (GLfloat) - 0.294000,
+       (GLfloat) 1.378738, (GLfloat) - 0.288996, (GLfloat) - 0.339125,
+       (GLfloat) 1.378957, (GLfloat) - 0.304305, (GLfloat) - 0.582500,
+       (GLfloat) 1.510174, (GLfloat) - 0.190646, (GLfloat) - 0.266520,
+       (GLfloat) 1.435022, (GLfloat) - 0.251106, (GLfloat) - 0.278521,
+       (GLfloat) 1.617509, (GLfloat) - 0.201252, (GLfloat) - 0.278521,
+       (GLfloat) 1.617662, (GLfloat) - 0.240344, (GLfloat) - 0.335375,
+       (GLfloat) 1.534760, (GLfloat) - 0.249706, (GLfloat) - 0.278500,
+       (GLfloat) 1.458284, (GLfloat) - 0.283049, (GLfloat) - 0.335375,
+       (GLfloat) 1.540826, (GLfloat) - 0.272345, (GLfloat) - 0.597750,
+       (GLfloat) 1.635245, (GLfloat) - 0.247046, (GLfloat) - 0.500000,
+       (GLfloat) 1.446407, (GLfloat) - 0.297645, (GLfloat) - 0.500000,
+       (GLfloat) 1.540826, (GLfloat) - 0.272345, (GLfloat) - 0.402250,
+};
+
+static GLfloat s1_5_normals[] =
+{
+       (GLfloat) 0.600201, (GLfloat) 0.679955, (GLfloat) - 0.421211,
+       (GLfloat) 0.608958, (GLfloat) 0.677912, (GLfloat) - 0.411832,
+       (GLfloat) 0.631502, (GLfloat) 0.764222, (GLfloat) - 0.131036,
+       (GLfloat) 0.633915, (GLfloat) 0.762655, (GLfloat) - 0.128491,
+       (GLfloat) 0.439368, (GLfloat) 0.885949, (GLfloat) - 0.148491,
+       (GLfloat) 0.440253, (GLfloat) 0.885591, (GLfloat) - 0.148004,
+       (GLfloat) 0.401172, (GLfloat) 0.784782, (GLfloat) - 0.472417,
+       (GLfloat) 0.401344, (GLfloat) 0.784757, (GLfloat) - 0.472314,
+       (GLfloat) 0.608958, (GLfloat) 0.677912, (GLfloat) 0.411832,
+       (GLfloat) 0.600202, (GLfloat) 0.679955, (GLfloat) 0.421211,
+       (GLfloat) 0.401173, (GLfloat) 0.784782, (GLfloat) 0.472416,
+       (GLfloat) 0.401344, (GLfloat) 0.784757, (GLfloat) 0.472314,
+       (GLfloat) 0.440253, (GLfloat) 0.885591, (GLfloat) 0.148004,
+       (GLfloat) 0.439368, (GLfloat) 0.885949, (GLfloat) 0.148491,
+       (GLfloat) 0.631502, (GLfloat) 0.764222, (GLfloat) 0.131036,
+       (GLfloat) 0.633915, (GLfloat) 0.762655, (GLfloat) 0.128491,
+       (GLfloat) - 0.936578, (GLfloat) 0.283620, (GLfloat) 0.205866,
+       (GLfloat) - 0.947923, (GLfloat) 0.264055, (GLfloat) 0.178092,
+       (GLfloat) - 0.946548, (GLfloat) 0.315105, (GLfloat) 0.068965,
+       (GLfloat) - 0.949849, (GLfloat) 0.304029, (GLfloat) 0.073162,
+       (GLfloat) - 0.446501, (GLfloat) 0.882153, (GLfloat) 0.149808,
+       (GLfloat) - 0.408128, (GLfloat) 0.897939, (GLfloat) 0.164731,
+       (GLfloat) - 0.523643, (GLfloat) 0.729794, (GLfloat) 0.439543,
+       (GLfloat) - 0.481115, (GLfloat) 0.743166, (GLfloat) 0.465009,
+       (GLfloat) - 0.947923, (GLfloat) 0.264056, (GLfloat) - 0.178092,
+       (GLfloat) - 0.936578, (GLfloat) 0.283620, (GLfloat) - 0.205866,
+       (GLfloat) - 0.523644, (GLfloat) 0.729794, (GLfloat) - 0.439543,
+       (GLfloat) - 0.481115, (GLfloat) 0.743165, (GLfloat) - 0.465009,
+       (GLfloat) - 0.408128, (GLfloat) 0.897939, (GLfloat) - 0.164732,
+       (GLfloat) - 0.446501, (GLfloat) 0.882153, (GLfloat) - 0.149808,
+       (GLfloat) - 0.949849, (GLfloat) 0.304029, (GLfloat) - 0.073162,
+       (GLfloat) - 0.946548, (GLfloat) 0.315105, (GLfloat) - 0.068965,
+       (GLfloat) 0.509419, (GLfloat) 0.426080, (GLfloat) 0.747629,
+       (GLfloat) 0.498886, (GLfloat) 0.439986, (GLfloat) 0.746676,
+       (GLfloat) 0.381490, (GLfloat) 0.130964, (GLfloat) 0.915048,
+       (GLfloat) 0.367056, (GLfloat) 0.145561, (GLfloat) 0.918739,
+       (GLfloat) 0.169535, (GLfloat) 0.163155, (GLfloat) 0.971925,
+       (GLfloat) 0.178255, (GLfloat) 0.158993, (GLfloat) 0.971054,
+       (GLfloat) 0.289187, (GLfloat) 0.493355, (GLfloat) 0.820349,
+       (GLfloat) 0.295492, (GLfloat) 0.489598, (GLfloat) 0.820352,
+       (GLfloat) 0.072844, (GLfloat) - 0.526213, (GLfloat) 0.847227,
+       (GLfloat) 0.057982, (GLfloat) - 0.518213, (GLfloat) 0.853284,
+       (GLfloat) - 0.086528, (GLfloat) - 0.515478, (GLfloat) 0.852523,
+       (GLfloat) - 0.089419, (GLfloat) - 0.514364, (GLfloat) 0.852898,
+       (GLfloat) 0.052047, (GLfloat) - 0.167008, (GLfloat) 0.984581,
+       (GLfloat) 0.051822, (GLfloat) - 0.166918, (GLfloat) 0.984608,
+       (GLfloat) 0.242298, (GLfloat) - 0.179154, (GLfloat) 0.953517,
+       (GLfloat) 0.225634, (GLfloat) - 0.167006, (GLfloat) 0.959791,
+       (GLfloat) - 0.936578, (GLfloat) - 0.205866, (GLfloat) 0.283621,
+       (GLfloat) - 0.947923, (GLfloat) - 0.178092, (GLfloat) 0.264055,
+       (GLfloat) - 0.946548, (GLfloat) - 0.068965, (GLfloat) 0.315105,
+       (GLfloat) - 0.949849, (GLfloat) - 0.073162, (GLfloat) 0.304029,
+       (GLfloat) - 0.624880, (GLfloat) - 0.128758, (GLfloat) 0.770030,
+       (GLfloat) - 0.585268, (GLfloat) - 0.149307, (GLfloat) 0.796975,
+       (GLfloat) - 0.702251, (GLfloat) - 0.367360, (GLfloat) 0.609828,
+       (GLfloat) - 0.666949, (GLfloat) - 0.398310, (GLfloat) 0.629705,
+       (GLfloat) - 0.947923, (GLfloat) 0.178092, (GLfloat) 0.264055,
+       (GLfloat) - 0.936578, (GLfloat) 0.205866, (GLfloat) 0.283621,
+       (GLfloat) - 0.567140, (GLfloat) 0.430351, (GLfloat) 0.702247,
+       (GLfloat) - 0.540648, (GLfloat) 0.447171, (GLfloat) 0.712557,
+       (GLfloat) - 0.547735, (GLfloat) 0.144705, (GLfloat) 0.824043,
+       (GLfloat) - 0.571109, (GLfloat) 0.150867, (GLfloat) 0.806892,
+       (GLfloat) - 0.949849, (GLfloat) 0.073162, (GLfloat) 0.304029,
+       (GLfloat) - 0.946548, (GLfloat) 0.068965, (GLfloat) 0.315105,
+       (GLfloat) - 0.119299, (GLfloat) - 0.854945, (GLfloat) 0.504814,
+       (GLfloat) - 0.127336, (GLfloat) - 0.851794, (GLfloat) 0.508166,
+       (GLfloat) - 0.198715, (GLfloat) - 0.967024, (GLfloat) 0.159301,
+       (GLfloat) - 0.201251, (GLfloat) - 0.966323, (GLfloat) 0.160367,
+       (GLfloat) - 0.255603, (GLfloat) - 0.953134, (GLfloat) 0.161871,
+       (GLfloat) - 0.245412, (GLfloat) - 0.956309, (GLfloat) 0.158892,
+       (GLfloat) - 0.220327, (GLfloat) - 0.834921, (GLfloat) 0.504344,
+       (GLfloat) - 0.208789, (GLfloat) - 0.839323, (GLfloat) 0.501940,
+       (GLfloat) - 0.127336, (GLfloat) - 0.851794, (GLfloat) - 0.508166,
+       (GLfloat) - 0.119299, (GLfloat) - 0.854945, (GLfloat) - 0.504814,
+       (GLfloat) - 0.220327, (GLfloat) - 0.834921, (GLfloat) - 0.504344,
+       (GLfloat) - 0.208789, (GLfloat) - 0.839323, (GLfloat) - 0.501940,
+       (GLfloat) - 0.245412, (GLfloat) - 0.956309, (GLfloat) - 0.158892,
+       (GLfloat) - 0.255603, (GLfloat) - 0.953134, (GLfloat) - 0.161871,
+       (GLfloat) - 0.198715, (GLfloat) - 0.967024, (GLfloat) - 0.159301,
+       (GLfloat) - 0.201251, (GLfloat) - 0.966323, (GLfloat) - 0.160367,
+       (GLfloat) - 0.936578, (GLfloat) - 0.283621, (GLfloat) - 0.205866,
+       (GLfloat) - 0.947923, (GLfloat) - 0.264056, (GLfloat) - 0.178092,
+       (GLfloat) - 0.946548, (GLfloat) - 0.315105, (GLfloat) - 0.068965,
+       (GLfloat) - 0.949849, (GLfloat) - 0.304029, (GLfloat) - 0.073162,
+       (GLfloat) - 0.700995, (GLfloat) - 0.702740, (GLfloat) - 0.121503,
+       (GLfloat) - 0.672056, (GLfloat) - 0.727490, (GLfloat) - 0.138204,
+       (GLfloat) - 0.726368, (GLfloat) - 0.580019, (GLfloat) - 0.368737,
+       (GLfloat) - 0.700623, (GLfloat) - 0.608968, (GLfloat) - 0.371867,
+       (GLfloat) - 0.947923, (GLfloat) - 0.264056, (GLfloat) 0.178092,
+       (GLfloat) - 0.936578, (GLfloat) - 0.283621, (GLfloat) 0.205866,
+       (GLfloat) - 0.700623, (GLfloat) - 0.608968, (GLfloat) 0.371867,
+       (GLfloat) - 0.726368, (GLfloat) - 0.580019, (GLfloat) 0.368738,
+       (GLfloat) - 0.672055, (GLfloat) - 0.727490, (GLfloat) 0.138204,
+       (GLfloat) - 0.700994, (GLfloat) - 0.702740, (GLfloat) 0.121503,
+       (GLfloat) - 0.949849, (GLfloat) - 0.304029, (GLfloat) 0.073162,
+       (GLfloat) - 0.946548, (GLfloat) - 0.315105, (GLfloat) 0.068965,
+       (GLfloat) 0.072844, (GLfloat) - 0.526213, (GLfloat) - 0.847227,
+       (GLfloat) 0.057982, (GLfloat) - 0.518214, (GLfloat) - 0.853284,
+       (GLfloat) 0.225635, (GLfloat) - 0.167007, (GLfloat) - 0.959790,
+       (GLfloat) 0.242298, (GLfloat) - 0.179154, (GLfloat) - 0.953517,
+       (GLfloat) 0.052045, (GLfloat) - 0.167008, (GLfloat) - 0.984581,
+       (GLfloat) 0.051820, (GLfloat) - 0.166918, (GLfloat) - 0.984608,
+       (GLfloat) - 0.089420, (GLfloat) - 0.514364, (GLfloat) - 0.852897,
+       (GLfloat) - 0.086529, (GLfloat) - 0.515478, (GLfloat) - 0.852523,
+       (GLfloat) 0.498887, (GLfloat) 0.439986, (GLfloat) - 0.746675,
+       (GLfloat) 0.509419, (GLfloat) 0.426080, (GLfloat) - 0.747628,
+       (GLfloat) 0.289186, (GLfloat) 0.493355, (GLfloat) - 0.820349,
+       (GLfloat) 0.295491, (GLfloat) 0.489598, (GLfloat) - 0.820353,
+       (GLfloat) 0.178253, (GLfloat) 0.158994, (GLfloat) - 0.971054,
+       (GLfloat) 0.169534, (GLfloat) 0.163155, (GLfloat) - 0.971925,
+       (GLfloat) 0.381491, (GLfloat) 0.130963, (GLfloat) - 0.915048,
+       (GLfloat) 0.367056, (GLfloat) 0.145561, (GLfloat) - 0.918739,
+       (GLfloat) - 0.936578, (GLfloat) 0.205866, (GLfloat) - 0.283621,
+       (GLfloat) - 0.947923, (GLfloat) 0.178092, (GLfloat) - 0.264056,
+       (GLfloat) - 0.946548, (GLfloat) 0.068965, (GLfloat) - 0.315105,
+       (GLfloat) - 0.949849, (GLfloat) 0.073162, (GLfloat) - 0.304029,
+       (GLfloat) - 0.547736, (GLfloat) 0.144705, (GLfloat) - 0.824043,
+       (GLfloat) - 0.571109, (GLfloat) 0.150867, (GLfloat) - 0.806892,
+       (GLfloat) - 0.567141, (GLfloat) 0.430351, (GLfloat) - 0.702246,
+       (GLfloat) - 0.540648, (GLfloat) 0.447171, (GLfloat) - 0.712557,
+       (GLfloat) - 0.947923, (GLfloat) - 0.178092, (GLfloat) - 0.264056,
+       (GLfloat) - 0.936578, (GLfloat) - 0.205866, (GLfloat) - 0.283621,
+       (GLfloat) - 0.702251, (GLfloat) - 0.367360, (GLfloat) - 0.609828,
+       (GLfloat) - 0.666949, (GLfloat) - 0.398310, (GLfloat) - 0.629705,
+       (GLfloat) - 0.585269, (GLfloat) - 0.149307, (GLfloat) - 0.796974,
+       (GLfloat) - 0.624880, (GLfloat) - 0.128758, (GLfloat) - 0.770030,
+       (GLfloat) - 0.949849, (GLfloat) - 0.073162, (GLfloat) - 0.304029,
+       (GLfloat) - 0.946548, (GLfloat) - 0.068965, (GLfloat) - 0.315105,
+       (GLfloat) - 0.982944, (GLfloat) 0.135802, (GLfloat) 0.124011,
+       (GLfloat) - 0.982944, (GLfloat) 0.124011, (GLfloat) 0.135802,
+       (GLfloat) - 0.993006, (GLfloat) 0.043834, (GLfloat) 0.109621,
+       (GLfloat) - 0.992607, (GLfloat) 0.039656, (GLfloat) 0.114709,
+       (GLfloat) - 0.998998, (GLfloat) 0.030163, (GLfloat) 0.033079,
+       (GLfloat) - 0.998998, (GLfloat) 0.033079, (GLfloat) 0.030163,
+       (GLfloat) - 0.993006, (GLfloat) 0.109621, (GLfloat) 0.043834,
+       (GLfloat) - 0.992607, (GLfloat) 0.114709, (GLfloat) 0.039656,
+       (GLfloat) - 0.982944, (GLfloat) - 0.124011, (GLfloat) 0.135803,
+       (GLfloat) - 0.982944, (GLfloat) - 0.135802, (GLfloat) 0.124011,
+       (GLfloat) - 0.993006, (GLfloat) - 0.109621, (GLfloat) 0.043834,
+       (GLfloat) - 0.992607, (GLfloat) - 0.114709, (GLfloat) 0.039656,
+       (GLfloat) - 0.998998, (GLfloat) - 0.033079, (GLfloat) 0.030163,
+       (GLfloat) - 0.998998, (GLfloat) - 0.030163, (GLfloat) 0.033079,
+       (GLfloat) - 0.993006, (GLfloat) - 0.043834, (GLfloat) 0.109621,
+       (GLfloat) - 0.992607, (GLfloat) - 0.039656, (GLfloat) 0.114709,
+       (GLfloat) - 0.982944, (GLfloat) - 0.135802, (GLfloat) - 0.124011,
+       (GLfloat) - 0.982944, (GLfloat) - 0.124011, (GLfloat) - 0.135802,
+       (GLfloat) - 0.993006, (GLfloat) - 0.043834, (GLfloat) - 0.109621,
+       (GLfloat) - 0.992607, (GLfloat) - 0.039656, (GLfloat) - 0.114709,
+       (GLfloat) - 0.998998, (GLfloat) - 0.030163, (GLfloat) - 0.033079,
+       (GLfloat) - 0.998998, (GLfloat) - 0.033079, (GLfloat) - 0.030163,
+       (GLfloat) - 0.993006, (GLfloat) - 0.109621, (GLfloat) - 0.043834,
+       (GLfloat) - 0.992607, (GLfloat) - 0.114709, (GLfloat) - 0.039656,
+       (GLfloat) - 0.982944, (GLfloat) 0.124011, (GLfloat) - 0.135802,
+       (GLfloat) - 0.982944, (GLfloat) 0.135802, (GLfloat) - 0.124011,
+       (GLfloat) - 0.993006, (GLfloat) 0.109621, (GLfloat) - 0.043834,
+       (GLfloat) - 0.992607, (GLfloat) 0.114709, (GLfloat) - 0.039656,
+       (GLfloat) - 0.998998, (GLfloat) 0.033079, (GLfloat) - 0.030163,
+       (GLfloat) - 0.998998, (GLfloat) 0.030163, (GLfloat) - 0.033079,
+       (GLfloat) - 0.993006, (GLfloat) 0.043834, (GLfloat) - 0.109621,
+       (GLfloat) - 0.992607, (GLfloat) 0.039656, (GLfloat) - 0.114709,
+       (GLfloat) 0.642600, (GLfloat) 0.650149, (GLfloat) - 0.405429,
+       (GLfloat) 0.629315, (GLfloat) 0.651735, (GLfloat) - 0.423326,
+       (GLfloat) 0.650102, (GLfloat) 0.622930, (GLfloat) - 0.435116,
+       (GLfloat) 0.644794, (GLfloat) 0.639958, (GLfloat) - 0.417963,
+       (GLfloat) 0.686498, (GLfloat) 0.714292, (GLfloat) - 0.136042,
+       (GLfloat) 0.690339, (GLfloat) 0.711978, (GLfloat) - 0.128528,
+       (GLfloat) 0.670965, (GLfloat) 0.730702, (GLfloat) - 0.126017,
+       (GLfloat) 0.667564, (GLfloat) 0.732887, (GLfloat) - 0.131284,
+       (GLfloat) 0.646461, (GLfloat) 0.595725, (GLfloat) - 0.476656,
+       (GLfloat) 0.646365, (GLfloat) 0.610461, (GLfloat) - 0.457766,
+       (GLfloat) 0.713253, (GLfloat) 0.686364, (GLfloat) - 0.142034,
+       (GLfloat) 0.714947, (GLfloat) 0.683066, (GLfloat) - 0.149235,
+       (GLfloat) 0.700923, (GLfloat) 0.700421, (GLfloat) - 0.134601,
+       (GLfloat) 0.703355, (GLfloat) 0.696368, (GLfloat) - 0.142698,
+       (GLfloat) 0.650658, (GLfloat) 0.606520, (GLfloat) - 0.456922,
+       (GLfloat) 0.648063, (GLfloat) 0.624636, (GLfloat) - 0.435712,
+       (GLfloat) 0.646461, (GLfloat) 0.595725, (GLfloat) 0.476655,
+       (GLfloat) 0.646365, (GLfloat) 0.610461, (GLfloat) 0.457766,
+       (GLfloat) 0.648063, (GLfloat) 0.624636, (GLfloat) 0.435712,
+       (GLfloat) 0.650658, (GLfloat) 0.606520, (GLfloat) 0.456922,
+       (GLfloat) 0.700923, (GLfloat) 0.700421, (GLfloat) 0.134601,
+       (GLfloat) 0.703355, (GLfloat) 0.696368, (GLfloat) 0.142698,
+       (GLfloat) 0.714947, (GLfloat) 0.683066, (GLfloat) 0.149235,
+       (GLfloat) 0.713253, (GLfloat) 0.686364, (GLfloat) 0.142034,
+       (GLfloat) 0.642600, (GLfloat) 0.650149, (GLfloat) 0.405428,
+       (GLfloat) 0.629314, (GLfloat) 0.651735, (GLfloat) 0.423326,
+       (GLfloat) 0.667564, (GLfloat) 0.732887, (GLfloat) 0.131284,
+       (GLfloat) 0.670965, (GLfloat) 0.730702, (GLfloat) 0.126017,
+       (GLfloat) 0.686498, (GLfloat) 0.714292, (GLfloat) 0.136042,
+       (GLfloat) 0.690339, (GLfloat) 0.711978, (GLfloat) 0.128528,
+       (GLfloat) 0.650102, (GLfloat) 0.622930, (GLfloat) 0.435116,
+       (GLfloat) 0.644795, (GLfloat) 0.639958, (GLfloat) 0.417963,
+       (GLfloat) - 0.056496, (GLfloat) - 0.528883, (GLfloat) - 0.846813,
+       (GLfloat) - 0.064290, (GLfloat) - 0.519887, (GLfloat) - 0.851812,
+       (GLfloat) - 0.173805, (GLfloat) - 0.513816, (GLfloat) - 0.840110,
+       (GLfloat) - 0.175837, (GLfloat) - 0.508498, (GLfloat) - 0.842918,
+       (GLfloat) 0.089052, (GLfloat) - 0.185853, (GLfloat) - 0.978534,
+       (GLfloat) 0.093599, (GLfloat) - 0.208853, (GLfloat) - 0.973458,
+       (GLfloat) 0.164361, (GLfloat) - 0.176843, (GLfloat) - 0.970418,
+       (GLfloat) 0.176320, (GLfloat) - 0.196482, (GLfloat) - 0.964524,
+       (GLfloat) - 0.389065, (GLfloat) - 0.390805, (GLfloat) - 0.834206,
+       (GLfloat) - 0.391186, (GLfloat) - 0.409817, (GLfloat) - 0.824029,
+       (GLfloat) - 0.093477, (GLfloat) - 0.154476, (GLfloat) - 0.983565,
+       (GLfloat) - 0.093921, (GLfloat) - 0.156341, (GLfloat) - 0.983228,
+       (GLfloat) 0.000626, (GLfloat) - 0.183607, (GLfloat) - 0.983000,
+       (GLfloat) - 0.000487, (GLfloat) - 0.201385, (GLfloat) - 0.979512,
+       (GLfloat) - 0.285892, (GLfloat) - 0.471460, (GLfloat) - 0.834261,
+       (GLfloat) - 0.285514, (GLfloat) - 0.475831, (GLfloat) - 0.831905,
+       (GLfloat) 0.435732, (GLfloat) 0.380700, (GLfloat) - 0.815601,
+       (GLfloat) 0.428982, (GLfloat) 0.354155, (GLfloat) - 0.830993,
+       (GLfloat) 0.473609, (GLfloat) 0.392091, (GLfloat) - 0.788643,
+       (GLfloat) 0.469979, (GLfloat) 0.356952, (GLfloat) - 0.807283,
+       (GLfloat) 0.244505, (GLfloat) 0.073495, (GLfloat) - 0.966859,
+       (GLfloat) 0.248781, (GLfloat) 0.107298, (GLfloat) - 0.962598,
+       (GLfloat) 0.172068, (GLfloat) 0.089497, (GLfloat) - 0.981011,
+       (GLfloat) 0.177919, (GLfloat) 0.109952, (GLfloat) - 0.977883,
+       (GLfloat) 0.511512, (GLfloat) 0.425325, (GLfloat) - 0.746629,
+       (GLfloat) 0.520411, (GLfloat) 0.400470, (GLfloat) - 0.754185,
+       (GLfloat) 0.360534, (GLfloat) 0.109169, (GLfloat) - 0.926336,
+       (GLfloat) 0.349374, (GLfloat) 0.135180, (GLfloat) - 0.927181,
+       (GLfloat) 0.311593, (GLfloat) 0.086000, (GLfloat) - 0.946316,
+       (GLfloat) 0.308233, (GLfloat) 0.120081, (GLfloat) - 0.943702,
+       (GLfloat) 0.500412, (GLfloat) 0.409092, (GLfloat) - 0.763041,
+       (GLfloat) 0.503536, (GLfloat) 0.376115, (GLfloat) - 0.777811,
+       (GLfloat) - 0.064290, (GLfloat) - 0.519886, (GLfloat) 0.851813,
+       (GLfloat) - 0.056496, (GLfloat) - 0.528883, (GLfloat) 0.846813,
+       (GLfloat) 0.164361, (GLfloat) - 0.176843, (GLfloat) 0.970418,
+       (GLfloat) 0.176319, (GLfloat) - 0.196482, (GLfloat) 0.964524,
+       (GLfloat) 0.093599, (GLfloat) - 0.208853, (GLfloat) 0.973458,
+       (GLfloat) 0.089052, (GLfloat) - 0.185852, (GLfloat) 0.978534,
+       (GLfloat) - 0.173805, (GLfloat) - 0.513817, (GLfloat) 0.840110,
+       (GLfloat) - 0.175837, (GLfloat) - 0.508498, (GLfloat) 0.842918,
+       (GLfloat) 0.511512, (GLfloat) 0.425325, (GLfloat) 0.746629,
+       (GLfloat) 0.520411, (GLfloat) 0.400470, (GLfloat) 0.754186,
+       (GLfloat) 0.503536, (GLfloat) 0.376115, (GLfloat) 0.777810,
+       (GLfloat) 0.500412, (GLfloat) 0.409092, (GLfloat) 0.763041,
+       (GLfloat) 0.311592, (GLfloat) 0.086000, (GLfloat) 0.946316,
+       (GLfloat) 0.308233, (GLfloat) 0.120080, (GLfloat) 0.943702,
+       (GLfloat) 0.349373, (GLfloat) 0.135180, (GLfloat) 0.927181,
+       (GLfloat) 0.360533, (GLfloat) 0.109169, (GLfloat) 0.926336,
+       (GLfloat) 0.428982, (GLfloat) 0.354155, (GLfloat) 0.830993,
+       (GLfloat) 0.435731, (GLfloat) 0.380700, (GLfloat) 0.815602,
+       (GLfloat) 0.172068, (GLfloat) 0.089497, (GLfloat) 0.981011,
+       (GLfloat) 0.177918, (GLfloat) 0.109951, (GLfloat) 0.977883,
+       (GLfloat) 0.248781, (GLfloat) 0.107298, (GLfloat) 0.962598,
+       (GLfloat) 0.244505, (GLfloat) 0.073494, (GLfloat) 0.966859,
+       (GLfloat) 0.473609, (GLfloat) 0.392091, (GLfloat) 0.788643,
+       (GLfloat) 0.469979, (GLfloat) 0.356951, (GLfloat) 0.807283,
+       (GLfloat) - 0.389065, (GLfloat) - 0.390805, (GLfloat) 0.834206,
+       (GLfloat) - 0.391186, (GLfloat) - 0.409816, (GLfloat) 0.824029,
+       (GLfloat) - 0.285514, (GLfloat) - 0.475832, (GLfloat) 0.831905,
+       (GLfloat) - 0.285892, (GLfloat) - 0.471460, (GLfloat) 0.834261,
+       (GLfloat) 0.000626, (GLfloat) - 0.183607, (GLfloat) 0.983000,
+       (GLfloat) - 0.000486, (GLfloat) - 0.201385, (GLfloat) 0.979512,
+       (GLfloat) - 0.093921, (GLfloat) - 0.156340, (GLfloat) 0.983228,
+       (GLfloat) - 0.093477, (GLfloat) - 0.154476, (GLfloat) 0.983565,
+       (GLfloat) - 0.306817, (GLfloat) - 0.816247, (GLfloat) - 0.489494,
+       (GLfloat) - 0.306526, (GLfloat) - 0.816474, (GLfloat) - 0.489298,
+       (GLfloat) - 0.401007, (GLfloat) - 0.903402, (GLfloat) - 0.151850,
+       (GLfloat) - 0.400054, (GLfloat) - 0.903928, (GLfloat) - 0.151230,
+       (GLfloat) - 0.539523, (GLfloat) - 0.829080, (GLfloat) - 0.146769,
+       (GLfloat) - 0.536423, (GLfloat) - 0.831619, (GLfloat) - 0.143741,
+       (GLfloat) - 0.439125, (GLfloat) - 0.764873, (GLfloat) - 0.471315,
+       (GLfloat) - 0.443186, (GLfloat) - 0.759550, (GLfloat) - 0.476099,
+       (GLfloat) - 0.306817, (GLfloat) - 0.816247, (GLfloat) 0.489494,
+       (GLfloat) - 0.306526, (GLfloat) - 0.816474, (GLfloat) 0.489298,
+       (GLfloat) - 0.443186, (GLfloat) - 0.759550, (GLfloat) 0.476099,
+       (GLfloat) - 0.439125, (GLfloat) - 0.764873, (GLfloat) 0.471315,
+       (GLfloat) - 0.539523, (GLfloat) - 0.829080, (GLfloat) 0.146769,
+       (GLfloat) - 0.536423, (GLfloat) - 0.831619, (GLfloat) 0.143741,
+       (GLfloat) - 0.400054, (GLfloat) - 0.903928, (GLfloat) 0.151230,
+       (GLfloat) - 0.401007, (GLfloat) - 0.903402, (GLfloat) 0.151850,
+       (GLfloat) - 0.663042, (GLfloat) - 0.578347, (GLfloat) 0.475278,
+       (GLfloat) - 0.658558, (GLfloat) - 0.599157, (GLfloat) 0.455315,
+       (GLfloat) - 0.758279, (GLfloat) - 0.634927, (GLfloat) 0.147920,
+       (GLfloat) - 0.753882, (GLfloat) - 0.642163, (GLfloat) 0.138885,
+       (GLfloat) - 0.655091, (GLfloat) - 0.742671, (GLfloat) 0.138907,
+       (GLfloat) - 0.649182, (GLfloat) - 0.746545, (GLfloat) 0.145716,
+       (GLfloat) - 0.547340, (GLfloat) - 0.690985, (GLfloat) 0.472185,
+       (GLfloat) - 0.565022, (GLfloat) - 0.687356, (GLfloat) 0.456390,
+       (GLfloat) - 0.658558, (GLfloat) - 0.599157, (GLfloat) - 0.455315,
+       (GLfloat) - 0.663042, (GLfloat) - 0.578347, (GLfloat) - 0.475278,
+       (GLfloat) - 0.565022, (GLfloat) - 0.687356, (GLfloat) - 0.456390,
+       (GLfloat) - 0.547340, (GLfloat) - 0.690985, (GLfloat) - 0.472185,
+       (GLfloat) - 0.655091, (GLfloat) - 0.742671, (GLfloat) - 0.138907,
+       (GLfloat) - 0.649182, (GLfloat) - 0.746545, (GLfloat) - 0.145716,
+       (GLfloat) - 0.758279, (GLfloat) - 0.634927, (GLfloat) - 0.147920,
+       (GLfloat) - 0.753882, (GLfloat) - 0.642163, (GLfloat) - 0.138885,
+       (GLfloat) - 0.531808, (GLfloat) - 0.030854, (GLfloat) - 0.846303,
+       (GLfloat) - 0.547325, (GLfloat) - 0.021478, (GLfloat) - 0.836644,
+       (GLfloat) - 0.214400, (GLfloat) 0.129290, (GLfloat) - 0.968151,
+       (GLfloat) - 0.232550, (GLfloat) 0.136923, (GLfloat) - 0.962898,
+       (GLfloat) - 0.234685, (GLfloat) 0.079911, (GLfloat) - 0.968781,
+       (GLfloat) - 0.210181, (GLfloat) 0.075599, (GLfloat) - 0.974735,
+       (GLfloat) - 0.528653, (GLfloat) - 0.081793, (GLfloat) - 0.844888,
+       (GLfloat) - 0.538319, (GLfloat) - 0.109397, (GLfloat) - 0.835610,
+       (GLfloat) 0.375279, (GLfloat) 0.445115, (GLfloat) - 0.813043,
+       (GLfloat) 0.363044, (GLfloat) 0.448595, (GLfloat) - 0.816677,
+       (GLfloat) 0.362957, (GLfloat) 0.428038, (GLfloat) - 0.827675,
+       (GLfloat) 0.375627, (GLfloat) 0.426947, (GLfloat) - 0.822570,
+       (GLfloat) 0.060176, (GLfloat) 0.247143, (GLfloat) - 0.967109,
+       (GLfloat) 0.080139, (GLfloat) 0.245230, (GLfloat) - 0.966147,
+       (GLfloat) 0.077981, (GLfloat) 0.282100, (GLfloat) - 0.956211,
+       (GLfloat) 0.061364, (GLfloat) 0.287374, (GLfloat) - 0.955851,
+       (GLfloat) 0.394264, (GLfloat) 0.386154, (GLfloat) - 0.833931,
+       (GLfloat) 0.391969, (GLfloat) 0.379827, (GLfloat) - 0.837909,
+       (GLfloat) 0.108284, (GLfloat) 0.149184, (GLfloat) - 0.982863,
+       (GLfloat) 0.106809, (GLfloat) 0.145488, (GLfloat) - 0.983578,
+       (GLfloat) 0.087165, (GLfloat) 0.199761, (GLfloat) - 0.975960,
+       (GLfloat) 0.069423, (GLfloat) 0.198484, (GLfloat) - 0.977642,
+       (GLfloat) 0.378360, (GLfloat) 0.405238, (GLfloat) - 0.832242,
+       (GLfloat) 0.371158, (GLfloat) 0.404730, (GLfloat) - 0.835725,
+       (GLfloat) - 0.478648, (GLfloat) - 0.265386, (GLfloat) - 0.836939,
+       (GLfloat) - 0.486707, (GLfloat) - 0.296995, (GLfloat) - 0.821529,
+       (GLfloat) - 0.514523, (GLfloat) - 0.162550, (GLfloat) - 0.841929,
+       (GLfloat) - 0.525278, (GLfloat) - 0.195128, (GLfloat) - 0.828256,
+       (GLfloat) - 0.217558, (GLfloat) - 0.004195, (GLfloat) - 0.976038,
+       (GLfloat) - 0.206190, (GLfloat) 0.022881, (GLfloat) - 0.978244,
+       (GLfloat) - 0.182077, (GLfloat) - 0.080752, (GLfloat) - 0.979963,
+       (GLfloat) - 0.175153, (GLfloat) - 0.061621, (GLfloat) - 0.982611,
+       (GLfloat) - 0.843975, (GLfloat) - 0.195207, (GLfloat) - 0.499600,
+       (GLfloat) - 0.842535, (GLfloat) - 0.181717, (GLfloat) - 0.507064,
+       (GLfloat) - 0.827895, (GLfloat) - 0.272019, (GLfloat) - 0.490506,
+       (GLfloat) - 0.826118, (GLfloat) - 0.254451, (GLfloat) - 0.502777,
+       (GLfloat) - 0.933235, (GLfloat) - 0.321752, (GLfloat) - 0.159836,
+       (GLfloat) - 0.932223, (GLfloat) - 0.327025, (GLfloat) - 0.154968,
+       (GLfloat) - 0.954881, (GLfloat) - 0.249025, (GLfloat) - 0.161829,
+       (GLfloat) - 0.954307, (GLfloat) - 0.253099, (GLfloat) - 0.158871,
+       (GLfloat) - 0.754729, (GLfloat) - 0.466616, (GLfloat) - 0.461144,
+       (GLfloat) - 0.755670, (GLfloat) - 0.441894, (GLfloat) - 0.483419,
+       (GLfloat) - 0.851851, (GLfloat) - 0.501342, (GLfloat) - 0.151677,
+       (GLfloat) - 0.848780, (GLfloat) - 0.509248, (GLfloat) - 0.142264,
+       (GLfloat) - 0.902458, (GLfloat) - 0.401405, (GLfloat) - 0.156347,
+       (GLfloat) - 0.900638, (GLfloat) - 0.408254, (GLfloat) - 0.148931,
+       (GLfloat) - 0.801108, (GLfloat) - 0.337187, (GLfloat) - 0.494500,
+       (GLfloat) - 0.802422, (GLfloat) - 0.359565, (GLfloat) - 0.476269,
+       (GLfloat) - 0.754729, (GLfloat) - 0.466616, (GLfloat) 0.461144,
+       (GLfloat) - 0.755670, (GLfloat) - 0.441893, (GLfloat) 0.483419,
+       (GLfloat) - 0.802422, (GLfloat) - 0.359565, (GLfloat) 0.476269,
+       (GLfloat) - 0.801108, (GLfloat) - 0.337187, (GLfloat) 0.494500,
+       (GLfloat) - 0.902457, (GLfloat) - 0.401405, (GLfloat) 0.156348,
+       (GLfloat) - 0.900638, (GLfloat) - 0.408254, (GLfloat) 0.148931,
+       (GLfloat) - 0.848780, (GLfloat) - 0.509248, (GLfloat) 0.142264,
+       (GLfloat) - 0.851851, (GLfloat) - 0.501342, (GLfloat) 0.151677,
+       (GLfloat) - 0.842535, (GLfloat) - 0.181718, (GLfloat) 0.507064,
+       (GLfloat) - 0.843975, (GLfloat) - 0.195207, (GLfloat) 0.499600,
+       (GLfloat) - 0.954881, (GLfloat) - 0.249025, (GLfloat) 0.161829,
+       (GLfloat) - 0.954306, (GLfloat) - 0.253099, (GLfloat) 0.158871,
+       (GLfloat) - 0.932223, (GLfloat) - 0.327025, (GLfloat) 0.154968,
+       (GLfloat) - 0.933235, (GLfloat) - 0.321752, (GLfloat) 0.159836,
+       (GLfloat) - 0.827895, (GLfloat) - 0.272019, (GLfloat) 0.490506,
+       (GLfloat) - 0.826118, (GLfloat) - 0.254451, (GLfloat) 0.502777,
+       (GLfloat) - 0.547325, (GLfloat) - 0.021478, (GLfloat) 0.836644,
+       (GLfloat) - 0.531808, (GLfloat) - 0.030854, (GLfloat) 0.846303,
+       (GLfloat) - 0.538320, (GLfloat) - 0.109397, (GLfloat) 0.835610,
+       (GLfloat) - 0.528653, (GLfloat) - 0.081793, (GLfloat) 0.844888,
+       (GLfloat) - 0.210181, (GLfloat) 0.075599, (GLfloat) 0.974735,
+       (GLfloat) - 0.234685, (GLfloat) 0.079911, (GLfloat) 0.968781,
+       (GLfloat) - 0.214400, (GLfloat) 0.129290, (GLfloat) 0.968151,
+       (GLfloat) - 0.232550, (GLfloat) 0.136923, (GLfloat) 0.962898,
+       (GLfloat) - 0.486707, (GLfloat) - 0.296995, (GLfloat) 0.821529,
+       (GLfloat) - 0.478647, (GLfloat) - 0.265386, (GLfloat) 0.836939,
+       (GLfloat) - 0.182076, (GLfloat) - 0.080752, (GLfloat) 0.979963,
+       (GLfloat) - 0.175152, (GLfloat) - 0.061621, (GLfloat) 0.982611,
+       (GLfloat) - 0.206190, (GLfloat) 0.022882, (GLfloat) 0.978244,
+       (GLfloat) - 0.217558, (GLfloat) - 0.004194, (GLfloat) 0.976038,
+       (GLfloat) - 0.514523, (GLfloat) - 0.162550, (GLfloat) 0.841928,
+       (GLfloat) - 0.525277, (GLfloat) - 0.195127, (GLfloat) 0.828257,
+       (GLfloat) 0.394264, (GLfloat) 0.386154, (GLfloat) 0.833931,
+       (GLfloat) 0.391969, (GLfloat) 0.379827, (GLfloat) 0.837909,
+       (GLfloat) 0.378360, (GLfloat) 0.405238, (GLfloat) 0.832241,
+       (GLfloat) 0.371157, (GLfloat) 0.404730, (GLfloat) 0.835725,
+       (GLfloat) 0.069422, (GLfloat) 0.198484, (GLfloat) 0.977642,
+       (GLfloat) 0.087165, (GLfloat) 0.199761, (GLfloat) 0.975960,
+       (GLfloat) 0.106809, (GLfloat) 0.145488, (GLfloat) 0.983578,
+       (GLfloat) 0.108284, (GLfloat) 0.149183, (GLfloat) 0.982863,
+       (GLfloat) 0.375279, (GLfloat) 0.445115, (GLfloat) 0.813043,
+       (GLfloat) 0.363044, (GLfloat) 0.448594, (GLfloat) 0.816678,
+       (GLfloat) 0.061364, (GLfloat) 0.287374, (GLfloat) 0.955851,
+       (GLfloat) 0.077981, (GLfloat) 0.282099, (GLfloat) 0.956211,
+       (GLfloat) 0.060176, (GLfloat) 0.247143, (GLfloat) 0.967109,
+       (GLfloat) 0.080138, (GLfloat) 0.245229, (GLfloat) 0.966147,
+       (GLfloat) 0.375627, (GLfloat) 0.426947, (GLfloat) 0.822570,
+       (GLfloat) 0.362957, (GLfloat) 0.428038, (GLfloat) 0.827675,
+       (GLfloat) 0.646717, (GLfloat) 0.598054, (GLfloat) 0.473381,
+       (GLfloat) 0.647128, (GLfloat) 0.592930, (GLfloat) 0.479227,
+       (GLfloat) 0.644233, (GLfloat) 0.592287, (GLfloat) 0.483900,
+       (GLfloat) 0.644394, (GLfloat) 0.596473, (GLfloat) 0.478515,
+       (GLfloat) 0.743754, (GLfloat) 0.650774, (GLfloat) 0.152720,
+       (GLfloat) 0.743300, (GLfloat) 0.651663, (GLfloat) 0.151130,
+       (GLfloat) 0.748383, (GLfloat) 0.646124, (GLfloat) 0.149823,
+       (GLfloat) 0.749100, (GLfloat) 0.644879, (GLfloat) 0.151594,
+       (GLfloat) 0.643063, (GLfloat) 0.599196, (GLfloat) 0.476900,
+       (GLfloat) 0.642570, (GLfloat) 0.593487, (GLfloat) 0.484641,
+       (GLfloat) 0.726590, (GLfloat) 0.670731, (GLfloat) 0.148951,
+       (GLfloat) 0.727257, (GLfloat) 0.669291, (GLfloat) 0.152139,
+       (GLfloat) 0.736367, (GLfloat) 0.659214, (GLfloat) 0.152315,
+       (GLfloat) 0.736367, (GLfloat) 0.659216, (GLfloat) 0.152312,
+       (GLfloat) 0.642386, (GLfloat) 0.594552, (GLfloat) 0.483578,
+       (GLfloat) 0.642311, (GLfloat) 0.593780, (GLfloat) 0.484626,
+       (GLfloat) 0.642570, (GLfloat) 0.593487, (GLfloat) - 0.484641,
+       (GLfloat) 0.643063, (GLfloat) 0.599196, (GLfloat) - 0.476900,
+       (GLfloat) 0.642386, (GLfloat) 0.594552, (GLfloat) - 0.483577,
+       (GLfloat) 0.642311, (GLfloat) 0.593780, (GLfloat) - 0.484626,
+       (GLfloat) 0.736367, (GLfloat) 0.659216, (GLfloat) - 0.152312,
+       (GLfloat) 0.736367, (GLfloat) 0.659214, (GLfloat) - 0.152315,
+       (GLfloat) 0.726590, (GLfloat) 0.670731, (GLfloat) - 0.148951,
+       (GLfloat) 0.727257, (GLfloat) 0.669291, (GLfloat) - 0.152139,
+       (GLfloat) 0.646717, (GLfloat) 0.598054, (GLfloat) - 0.473381,
+       (GLfloat) 0.647128, (GLfloat) 0.592931, (GLfloat) - 0.479227,
+       (GLfloat) 0.749100, (GLfloat) 0.644879, (GLfloat) - 0.151594,
+       (GLfloat) 0.748383, (GLfloat) 0.646124, (GLfloat) - 0.149823,
+       (GLfloat) 0.743754, (GLfloat) 0.650774, (GLfloat) - 0.152720,
+       (GLfloat) 0.743300, (GLfloat) 0.651663, (GLfloat) - 0.151130,
+       (GLfloat) 0.644394, (GLfloat) 0.596473, (GLfloat) - 0.478515,
+       (GLfloat) 0.644234, (GLfloat) 0.592287, (GLfloat) - 0.483900,
+       (GLfloat) 0.648818, (GLfloat) 0.595244, (GLfloat) 0.474046,
+       (GLfloat) 0.647885, (GLfloat) 0.598960, (GLfloat) 0.470630,
+       (GLfloat) 0.751896, (GLfloat) 0.641953, (GLfloat) 0.150159,
+       (GLfloat) 0.751280, (GLfloat) 0.642895, (GLfloat) 0.149213,
+       (GLfloat) 0.855755, (GLfloat) 0.491872, (GLfloat) 0.160454,
+       (GLfloat) 0.854316, (GLfloat) 0.494902, (GLfloat) 0.158798,
+       (GLfloat) 0.746074, (GLfloat) 0.437172, (GLfloat) 0.502249,
+       (GLfloat) 0.745147, (GLfloat) 0.441097, (GLfloat) 0.500189,
+       (GLfloat) 0.647885, (GLfloat) 0.598960, (GLfloat) - 0.470630,
+       (GLfloat) 0.648818, (GLfloat) 0.595244, (GLfloat) - 0.474046,
+       (GLfloat) 0.746074, (GLfloat) 0.437172, (GLfloat) - 0.502249,
+       (GLfloat) 0.745147, (GLfloat) 0.441097, (GLfloat) - 0.500189,
+       (GLfloat) 0.854316, (GLfloat) 0.494902, (GLfloat) - 0.158798,
+       (GLfloat) 0.855755, (GLfloat) 0.491872, (GLfloat) - 0.160454,
+       (GLfloat) 0.751896, (GLfloat) 0.641953, (GLfloat) - 0.150159,
+       (GLfloat) 0.751280, (GLfloat) 0.642895, (GLfloat) - 0.149213,
+       (GLfloat) 0.516361, (GLfloat) - 0.831259, (GLfloat) - 0.205866,
+       (GLfloat) 0.500398, (GLfloat) - 0.847281, (GLfloat) - 0.178091,
+       (GLfloat) 0.549353, (GLfloat) - 0.832739, (GLfloat) - 0.068965,
+       (GLfloat) 0.539508, (GLfloat) - 0.838796, (GLfloat) - 0.073163,
+       (GLfloat) 0.955872, (GLfloat) - 0.254974, (GLfloat) - 0.145934,
+       (GLfloat) 0.962750, (GLfloat) - 0.217125, (GLfloat) - 0.161151,
+       (GLfloat) 0.832302, (GLfloat) - 0.349186, (GLfloat) - 0.430515,
+       (GLfloat) 0.834893, (GLfloat) - 0.309370, (GLfloat) - 0.455242,
+       (GLfloat) 0.500398, (GLfloat) - 0.847281, (GLfloat) 0.178091,
+       (GLfloat) 0.516361, (GLfloat) - 0.831259, (GLfloat) 0.205867,
+       (GLfloat) 0.832302, (GLfloat) - 0.349186, (GLfloat) 0.430515,
+       (GLfloat) 0.834893, (GLfloat) - 0.309369, (GLfloat) 0.455242,
+       (GLfloat) 0.962750, (GLfloat) - 0.217125, (GLfloat) 0.161151,
+       (GLfloat) 0.955872, (GLfloat) - 0.254973, (GLfloat) 0.145934,
+       (GLfloat) 0.539508, (GLfloat) - 0.838796, (GLfloat) 0.073163,
+       (GLfloat) 0.549353, (GLfloat) - 0.832739, (GLfloat) 0.068965,
+       (GLfloat) 0.365166, (GLfloat) 0.464177, (GLfloat) - 0.806966,
+       (GLfloat) 0.373210, (GLfloat) 0.459657, (GLfloat) - 0.805872,
+       (GLfloat) 0.064151, (GLfloat) 0.318725, (GLfloat) - 0.945674,
+       (GLfloat) 0.075117, (GLfloat) 0.311589, (GLfloat) - 0.947243,
+       (GLfloat) 0.127864, (GLfloat) 0.159455, (GLfloat) - 0.978890,
+       (GLfloat) 0.122956, (GLfloat) 0.165169, (GLfloat) - 0.978571,
+       (GLfloat) 0.446081, (GLfloat) 0.299065, (GLfloat) - 0.843547,
+       (GLfloat) 0.442539, (GLfloat) 0.302925, (GLfloat) - 0.844035,
+       (GLfloat) - 0.541197, (GLfloat) 0.047754, (GLfloat) - 0.839539,
+       (GLfloat) - 0.545743, (GLfloat) 0.029212, (GLfloat) - 0.837443,
+       (GLfloat) - 0.504199, (GLfloat) - 0.116458, (GLfloat) - 0.855699,
+       (GLfloat) - 0.503751, (GLfloat) - 0.117103, (GLfloat) - 0.855875,
+       (GLfloat) - 0.180218, (GLfloat) 0.028848, (GLfloat) - 0.983203,
+       (GLfloat) - 0.179757, (GLfloat) 0.028254, (GLfloat) - 0.983305,
+       (GLfloat) - 0.230218, (GLfloat) 0.184662, (GLfloat) - 0.955458,
+       (GLfloat) - 0.218138, (GLfloat) 0.174858, (GLfloat) - 0.960125,
+       (GLfloat) 0.043553, (GLfloat) - 0.957947, (GLfloat) - 0.283621,
+       (GLfloat) 0.073317, (GLfloat) - 0.961717, (GLfloat) - 0.264055,
+       (GLfloat) 0.178370, (GLfloat) - 0.932145, (GLfloat) - 0.315104,
+       (GLfloat) 0.175170, (GLfloat) - 0.936420, (GLfloat) - 0.304029,
+       (GLfloat) 0.021724, (GLfloat) - 0.600335, (GLfloat) - 0.799453,
+       (GLfloat) - 0.006371, (GLfloat) - 0.568607, (GLfloat) - 0.822585,
+       (GLfloat) - 0.212402, (GLfloat) - 0.727671, (GLfloat) - 0.652212,
+       (GLfloat) - 0.248701, (GLfloat) - 0.700487, (GLfloat) - 0.668929,
+       (GLfloat) 0.430757, (GLfloat) - 0.866899, (GLfloat) - 0.250869,
+       (GLfloat) 0.427975, (GLfloat) - 0.857309, (GLfloat) - 0.286110,
+       (GLfloat) 0.561354, (GLfloat) - 0.442015, (GLfloat) - 0.699646,
+       (GLfloat) 0.571558, (GLfloat) - 0.412112, (GLfloat) - 0.709567,
+       (GLfloat) 0.286734, (GLfloat) - 0.470609, (GLfloat) - 0.834453,
+       (GLfloat) 0.281923, (GLfloat) - 0.498471, (GLfloat) - 0.819784,
+       (GLfloat) 0.316508, (GLfloat) - 0.898548, (GLfloat) - 0.304029,
+       (GLfloat) 0.311600, (GLfloat) - 0.896446, (GLfloat) - 0.315104,
+       (GLfloat) - 0.857077, (GLfloat) - 0.113037, (GLfloat) - 0.502635,
+       (GLfloat) - 0.855920, (GLfloat) - 0.100677, (GLfloat) - 0.507214,
+       (GLfloat) - 0.973550, (GLfloat) - 0.162756, (GLfloat) - 0.160346,
+       (GLfloat) - 0.972585, (GLfloat) - 0.166359, (GLfloat) - 0.162491,
+       (GLfloat) - 0.942363, (GLfloat) - 0.290210, (GLfloat) - 0.166522,
+       (GLfloat) - 0.940343, (GLfloat) - 0.298398, (GLfloat) - 0.163441,
+       (GLfloat) - 0.819387, (GLfloat) - 0.257298, (GLfloat) - 0.512252,
+       (GLfloat) - 0.820563, (GLfloat) - 0.245585, (GLfloat) - 0.516105,
+       (GLfloat) - 0.857077, (GLfloat) - 0.113037, (GLfloat) 0.502635,
+       (GLfloat) - 0.855920, (GLfloat) - 0.100677, (GLfloat) 0.507214,
+       (GLfloat) - 0.820564, (GLfloat) - 0.245585, (GLfloat) 0.516104,
+       (GLfloat) - 0.819387, (GLfloat) - 0.257297, (GLfloat) 0.512252,
+       (GLfloat) - 0.942363, (GLfloat) - 0.290210, (GLfloat) 0.166522,
+       (GLfloat) - 0.940343, (GLfloat) - 0.298398, (GLfloat) 0.163441,
+       (GLfloat) - 0.973550, (GLfloat) - 0.162756, (GLfloat) 0.160346,
+       (GLfloat) - 0.972585, (GLfloat) - 0.166359, (GLfloat) 0.162491,
+       (GLfloat) - 0.031552, (GLfloat) - 0.978072, (GLfloat) 0.205866,
+       (GLfloat) - 0.009717, (GLfloat) - 0.983966, (GLfloat) 0.178091,
+       (GLfloat) - 0.059383, (GLfloat) - 0.995850, (GLfloat) 0.068965,
+       (GLfloat) - 0.047830, (GLfloat) - 0.996172, (GLfloat) 0.073163,
+       (GLfloat) - 0.608137, (GLfloat) - 0.782136, (GLfloat) 0.135767,
+       (GLfloat) - 0.575039, (GLfloat) - 0.805344, (GLfloat) 0.144053,
+       (GLfloat) - 0.440882, (GLfloat) - 0.803158, (GLfloat) 0.400699,
+       (GLfloat) - 0.474682, (GLfloat) - 0.782654, (GLfloat) 0.402654,
+       (GLfloat) - 0.009717, (GLfloat) - 0.983966, (GLfloat) - 0.178092,
+       (GLfloat) - 0.031552, (GLfloat) - 0.978072, (GLfloat) - 0.205866,
+       (GLfloat) - 0.474681, (GLfloat) - 0.782654, (GLfloat) - 0.402654,
+       (GLfloat) - 0.440881, (GLfloat) - 0.803159, (GLfloat) - 0.400699,
+       (GLfloat) - 0.608137, (GLfloat) - 0.782136, (GLfloat) - 0.135767,
+       (GLfloat) - 0.575039, (GLfloat) - 0.805344, (GLfloat) - 0.144053,
+       (GLfloat) - 0.047830, (GLfloat) - 0.996172, (GLfloat) - 0.073163,
+       (GLfloat) - 0.059383, (GLfloat) - 0.995850, (GLfloat) - 0.068965,
+       (GLfloat) - 0.545743, (GLfloat) 0.029212, (GLfloat) 0.837443,
+       (GLfloat) - 0.541197, (GLfloat) 0.047754, (GLfloat) 0.839539,
+       (GLfloat) - 0.218137, (GLfloat) 0.174858, (GLfloat) 0.960125,
+       (GLfloat) - 0.230218, (GLfloat) 0.184662, (GLfloat) 0.955458,
+       (GLfloat) - 0.180219, (GLfloat) 0.028850, (GLfloat) 0.983203,
+       (GLfloat) - 0.179757, (GLfloat) 0.028256, (GLfloat) 0.983305,
+       (GLfloat) - 0.503751, (GLfloat) - 0.117102, (GLfloat) 0.855875,
+       (GLfloat) - 0.504199, (GLfloat) - 0.116456, (GLfloat) 0.855699,
+       (GLfloat) 0.373209, (GLfloat) 0.459657, (GLfloat) 0.805872,
+       (GLfloat) 0.365166, (GLfloat) 0.464177, (GLfloat) 0.806966,
+       (GLfloat) 0.446081, (GLfloat) 0.299065, (GLfloat) 0.843547,
+       (GLfloat) 0.442539, (GLfloat) 0.302926, (GLfloat) 0.844035,
+       (GLfloat) 0.122955, (GLfloat) 0.165170, (GLfloat) 0.978571,
+       (GLfloat) 0.127864, (GLfloat) 0.159456, (GLfloat) 0.978889,
+       (GLfloat) 0.064151, (GLfloat) 0.318724, (GLfloat) 0.945674,
+       (GLfloat) 0.075117, (GLfloat) 0.311589, (GLfloat) 0.947243,
+       (GLfloat) 0.430757, (GLfloat) - 0.866899, (GLfloat) 0.250868,
+       (GLfloat) 0.427975, (GLfloat) - 0.857309, (GLfloat) 0.286110,
+       (GLfloat) 0.311600, (GLfloat) - 0.896446, (GLfloat) 0.315104,
+       (GLfloat) 0.316508, (GLfloat) - 0.898548, (GLfloat) 0.304029,
+       (GLfloat) 0.281923, (GLfloat) - 0.498471, (GLfloat) 0.819784,
+       (GLfloat) 0.286734, (GLfloat) - 0.470608, (GLfloat) 0.834453,
+       (GLfloat) 0.561354, (GLfloat) - 0.442014, (GLfloat) 0.699647,
+       (GLfloat) 0.571558, (GLfloat) - 0.412112, (GLfloat) 0.709567,
+       (GLfloat) 0.073318, (GLfloat) - 0.961717, (GLfloat) 0.264055,
+       (GLfloat) 0.043553, (GLfloat) - 0.957947, (GLfloat) 0.283620,
+       (GLfloat) - 0.212402, (GLfloat) - 0.727670, (GLfloat) 0.652213,
+       (GLfloat) - 0.248701, (GLfloat) - 0.700487, (GLfloat) 0.668929,
+       (GLfloat) - 0.006371, (GLfloat) - 0.568606, (GLfloat) 0.822585,
+       (GLfloat) 0.021725, (GLfloat) - 0.600335, (GLfloat) 0.799453,
+       (GLfloat) 0.175170, (GLfloat) - 0.936420, (GLfloat) 0.304028,
+       (GLfloat) 0.178370, (GLfloat) - 0.932145, (GLfloat) 0.315104,
+       (GLfloat) 0.385580, (GLfloat) - 0.914303, (GLfloat) - 0.124011,
+       (GLfloat) 0.374190, (GLfloat) - 0.917355, (GLfloat) - 0.135802,
+       (GLfloat) 0.299349, (GLfloat) - 0.947826, (GLfloat) - 0.109621,
+       (GLfloat) 0.295210, (GLfloat) - 0.948521, (GLfloat) - 0.114709,
+       (GLfloat) 0.287695, (GLfloat) - 0.957151, (GLfloat) - 0.033079,
+       (GLfloat) 0.290512, (GLfloat) - 0.956396, (GLfloat) - 0.030163,
+       (GLfloat) 0.362895, (GLfloat) - 0.930799, (GLfloat) - 0.043834,
+       (GLfloat) 0.367706, (GLfloat) - 0.929096, (GLfloat) - 0.039656,
+       (GLfloat) 0.134619, (GLfloat) - 0.981547, (GLfloat) - 0.135802,
+       (GLfloat) 0.123230, (GLfloat) - 0.984599, (GLfloat) - 0.124011,
+       (GLfloat) 0.151123, (GLfloat) - 0.987543, (GLfloat) - 0.043834,
+       (GLfloat) 0.146105, (GLfloat) - 0.988474, (GLfloat) - 0.039656,
+       (GLfloat) 0.226607, (GLfloat) - 0.973519, (GLfloat) - 0.030163,
+       (GLfloat) 0.229424, (GLfloat) - 0.972764, (GLfloat) - 0.033079,
+       (GLfloat) 0.214669, (GLfloat) - 0.970516, (GLfloat) - 0.109621,
+       (GLfloat) 0.218601, (GLfloat) - 0.969049, (GLfloat) - 0.114709,
+       (GLfloat) 0.123230, (GLfloat) - 0.984599, (GLfloat) 0.124011,
+       (GLfloat) 0.134619, (GLfloat) - 0.981547, (GLfloat) 0.135802,
+       (GLfloat) 0.214669, (GLfloat) - 0.970516, (GLfloat) 0.109621,
+       (GLfloat) 0.218601, (GLfloat) - 0.969049, (GLfloat) 0.114709,
+       (GLfloat) 0.229424, (GLfloat) - 0.972764, (GLfloat) 0.033079,
+       (GLfloat) 0.226607, (GLfloat) - 0.973519, (GLfloat) 0.030163,
+       (GLfloat) 0.151123, (GLfloat) - 0.987543, (GLfloat) 0.043834,
+       (GLfloat) 0.146105, (GLfloat) - 0.988474, (GLfloat) 0.039656,
+       (GLfloat) 0.374190, (GLfloat) - 0.917355, (GLfloat) 0.135803,
+       (GLfloat) 0.385580, (GLfloat) - 0.914303, (GLfloat) 0.124011,
+       (GLfloat) 0.362895, (GLfloat) - 0.930799, (GLfloat) 0.043834,
+       (GLfloat) 0.367706, (GLfloat) - 0.929096, (GLfloat) 0.039656,
+       (GLfloat) 0.290512, (GLfloat) - 0.956396, (GLfloat) 0.030163,
+       (GLfloat) 0.287695, (GLfloat) - 0.957151, (GLfloat) 0.033079,
+       (GLfloat) 0.299349, (GLfloat) - 0.947826, (GLfloat) 0.109621,
+       (GLfloat) 0.295210, (GLfloat) - 0.948521, (GLfloat) 0.114709,
+};
+
+static unsigned short int s1_5_POLS[] =
+{
+      3, 12, 76, 74, 1, 3, 12, 74, 82, 1, 3, 76, 22, 78, 1, 3, 78, 74, 76, 1,
+      3, 20, 80, 74, 1, 3, 20, 74, 78, 1, 3, 80, 28, 82, 1, 3, 82, 74, 80, 1,
+      3, 13, 84, 77, 1, 3, 13, 77, 88, 1, 3, 84, 24, 86, 1, 3, 86, 77, 84, 1,
+      3, 20, 78, 77, 1, 3, 20, 77, 86, 1, 3, 78, 22, 88, 1, 3, 88, 77, 78, 1,
+      3, 14, 90, 85, 1, 3, 14, 85, 93, 1, 3, 26, 91, 85, 1, 3, 26, 85, 90, 1,
+      3, 20, 86, 85, 1, 3, 20, 85, 91, 1, 3, 86, 24, 93, 1, 3, 93, 85, 86, 1,
+      3, 15, 95, 79, 1, 3, 15, 79, 97, 1, 3, 95, 28, 80, 1, 3, 80, 79, 95, 1,
+      3, 20, 91, 79, 1, 3, 20, 79, 80, 1, 3, 26, 97, 79, 1, 3, 26, 79, 91, 1,
+    3, 13, 99, 83, 1, 3, 13, 83, 84, 1, 3, 99, 30, 101, 1, 3, 101, 83, 99, 1,
+  3, 23, 102, 83, 1, 3, 23, 83, 101, 1, 3, 102, 24, 84, 1, 3, 84, 83, 102, 1,
+       3, 108, 16, 104, 1, 3, 104, 100, 108, 1, 3, 32, 106, 100, 1, 3, 32, 100, 104, 1,
+       3, 106, 23, 101, 1, 3, 101, 100, 106, 1, 3, 30, 108, 100, 1, 3, 30, 100, 101, 1,
+       3, 17, 110, 105, 1, 3, 17, 105, 113, 1, 3, 33, 111, 105, 1, 3, 33, 105, 110, 1,
+       3, 23, 106, 105, 1, 3, 23, 105, 111, 1, 3, 106, 32, 113, 1, 3, 113, 105, 106, 1,
+   3, 14, 93, 92, 1, 3, 14, 92, 114, 1, 3, 93, 24, 102, 1, 3, 102, 92, 93, 1,
+3, 102, 23, 111, 1, 3, 111, 92, 102, 1, 3, 33, 114, 92, 1, 3, 33, 92, 111, 1,
+       3, 16, 116, 103, 1, 3, 16, 103, 104, 1, 3, 116, 35, 118, 1, 3, 118, 103, 116, 1,
+       3, 31, 119, 103, 1, 3, 31, 103, 118, 1, 3, 119, 32, 104, 1, 3, 104, 103, 119, 1,
+       3, 18, 121, 117, 1, 3, 18, 117, 125, 1, 3, 121, 36, 123, 1, 3, 123, 117, 121, 1,
+       3, 31, 118, 117, 1, 3, 31, 117, 123, 1, 3, 118, 35, 125, 1, 3, 125, 117, 118, 1,
+       3, 19, 127, 122, 1, 3, 19, 122, 130, 1, 3, 37, 128, 122, 1, 3, 37, 122, 127, 1,
+       3, 31, 123, 122, 1, 3, 31, 122, 128, 1, 3, 36, 130, 122, 1, 3, 36, 122, 123, 1,
+       3, 17, 113, 112, 1, 3, 17, 112, 131, 1, 3, 32, 119, 112, 1, 3, 32, 112, 113, 1,
+       3, 31, 128, 112, 1, 3, 31, 112, 119, 1, 3, 37, 131, 112, 1, 3, 37, 112, 128, 1,
+       3, 121, 18, 133, 1, 3, 133, 120, 121, 1, 3, 39, 134, 120, 1, 3, 39, 120, 133, 1,
+       3, 134, 27, 135, 1, 3, 135, 120, 134, 1, 3, 36, 121, 120, 1, 3, 36, 120, 135, 1,
+   3, 12, 82, 81, 1, 3, 12, 81, 138, 1, 3, 82, 28, 136, 1, 3, 136, 81, 82, 1,
+3, 27, 134, 81, 1, 3, 27, 81, 136, 1, 3, 134, 39, 138, 1, 3, 138, 81, 134, 1,
+   3, 15, 139, 94, 1, 3, 15, 94, 95, 1, 3, 40, 140, 94, 1, 3, 40, 94, 139, 1,
+3, 140, 27, 136, 1, 3, 136, 94, 140, 1, 3, 136, 28, 95, 1, 3, 95, 94, 136, 1,
+       3, 19, 130, 129, 1, 3, 19, 129, 141, 1, 3, 130, 36, 135, 1, 3, 135, 129, 130, 1,
+       3, 27, 140, 129, 1, 3, 27, 129, 135, 1, 3, 40, 141, 129, 1, 3, 40, 129, 140, 1,
+ 3, 14, 114, 89, 1, 3, 14, 89, 90, 1, 3, 114, 33, 142, 1, 3, 142, 89, 114, 1,
+  3, 25, 143, 89, 1, 3, 25, 89, 142, 1, 3, 143, 26, 90, 1, 3, 90, 89, 143, 1,
+       3, 17, 131, 109, 1, 3, 17, 109, 110, 1, 3, 131, 37, 144, 1, 3, 144, 109, 131, 1,
+       3, 25, 142, 109, 1, 3, 25, 109, 144, 1, 3, 142, 33, 110, 1, 3, 110, 109, 142, 1,
+       3, 19, 141, 126, 1, 3, 19, 126, 127, 1, 3, 141, 40, 145, 1, 3, 145, 126, 141, 1,
+       3, 25, 144, 126, 1, 3, 25, 126, 145, 1, 3, 144, 37, 127, 1, 3, 127, 126, 144, 1,
+   3, 15, 97, 96, 1, 3, 15, 96, 139, 1, 3, 97, 26, 143, 1, 3, 143, 96, 97, 1,
+3, 25, 145, 96, 1, 3, 25, 96, 143, 1, 3, 145, 40, 139, 1, 3, 139, 96, 145, 1,
+3, 76, 12, 146, 1, 3, 146, 75, 76, 1, 3, 146, 41, 148, 1, 3, 148, 75, 146, 1,
+ 3, 148, 21, 149, 1, 3, 149, 75, 148, 1, 3, 22, 76, 75, 1, 3, 22, 75, 149, 1,
+       3, 155, 8, 151, 1, 3, 151, 147, 155, 1, 3, 43, 153, 147, 1, 3, 43, 147, 151, 1,
+       3, 153, 21, 148, 1, 3, 148, 147, 153, 1, 3, 41, 155, 147, 1, 3, 41, 147, 148, 1,
+       3, 160, 11, 157, 1, 3, 157, 152, 160, 1, 3, 44, 158, 152, 1, 3, 44, 152, 157, 1,
+       3, 158, 21, 153, 1, 3, 153, 152, 158, 1, 3, 43, 160, 152, 1, 3, 43, 152, 153, 1,
+   3, 161, 13, 88, 1, 3, 88, 87, 161, 1, 3, 22, 149, 87, 1, 3, 22, 87, 88, 1,
+       3, 149, 21, 158, 1, 3, 158, 87, 149, 1, 3, 158, 44, 161, 1, 3, 161, 87, 158, 1,
+       3, 18, 162, 132, 1, 3, 18, 132, 133, 1, 3, 162, 45, 164, 1, 3, 164, 132, 162, 1,
+       3, 38, 165, 132, 1, 3, 38, 132, 164, 1, 3, 165, 39, 133, 1, 3, 133, 132, 165, 1,
+       3, 170, 9, 167, 1, 3, 167, 163, 170, 1, 3, 47, 168, 163, 1, 3, 47, 163, 167, 1,
+       3, 168, 38, 164, 1, 3, 164, 163, 168, 1, 3, 45, 170, 163, 1, 3, 45, 163, 164, 1,
+3, 8, 155, 154, 1, 3, 8, 154, 173, 1, 3, 155, 41, 171, 1, 3, 171, 154, 155, 1,
+       3, 38, 168, 154, 1, 3, 38, 154, 171, 1, 3, 168, 47, 173, 1, 3, 173, 154, 168, 1,
+       3, 146, 12, 138, 1, 3, 138, 137, 146, 1, 3, 39, 165, 137, 1, 3, 39, 137, 138, 1,
+       3, 165, 38, 171, 1, 3, 171, 137, 165, 1, 3, 41, 146, 137, 1, 3, 41, 137, 171, 1,
+       3, 16, 108, 107, 1, 3, 16, 107, 177, 1, 3, 108, 30, 174, 1, 3, 174, 107, 108, 1,
+       3, 29, 176, 107, 1, 3, 29, 107, 174, 1, 3, 176, 50, 177, 1, 3, 177, 107, 176, 1,
+  3, 99, 13, 161, 1, 3, 161, 98, 99, 1, 3, 44, 178, 98, 1, 3, 44, 98, 161, 1,
+ 3, 178, 29, 174, 1, 3, 174, 98, 178, 1, 3, 30, 99, 98, 1, 3, 30, 98, 174, 1,
+       3, 11, 180, 156, 1, 3, 11, 156, 157, 1, 3, 180, 49, 181, 1, 3, 181, 156, 180, 1,
+       3, 29, 178, 156, 1, 3, 29, 156, 181, 1, 3, 178, 44, 157, 1, 3, 157, 156, 178, 1,
+       3, 185, 10, 183, 1, 3, 183, 175, 185, 1, 3, 50, 176, 175, 1, 3, 50, 175, 183, 1,
+       3, 176, 29, 181, 1, 3, 181, 175, 176, 1, 3, 49, 185, 175, 1, 3, 49, 175, 181, 1,
+       3, 162, 18, 125, 1, 3, 125, 124, 162, 1, 3, 35, 186, 124, 1, 3, 35, 124, 125, 1,
+       3, 186, 34, 187, 1, 3, 187, 124, 186, 1, 3, 45, 162, 124, 1, 3, 45, 124, 187, 1,
+       3, 116, 16, 177, 1, 3, 177, 115, 116, 1, 3, 50, 188, 115, 1, 3, 50, 115, 177, 1,
+       3, 188, 34, 186, 1, 3, 186, 115, 188, 1, 3, 35, 116, 115, 1, 3, 35, 115, 186, 1,
+       3, 10, 190, 182, 1, 3, 10, 182, 183, 1, 3, 190, 52, 191, 1, 3, 191, 182, 190, 1,
+       3, 191, 34, 188, 1, 3, 188, 182, 191, 1, 3, 50, 183, 182, 1, 3, 50, 182, 188, 1,
+3, 9, 170, 169, 1, 3, 9, 169, 193, 1, 3, 45, 187, 169, 1, 3, 45, 169, 170, 1,
+       3, 187, 34, 191, 1, 3, 191, 169, 187, 1, 3, 191, 52, 193, 1, 3, 193, 169, 191, 1,
+3, 1, 196, 194, 1, 3, 1, 194, 201, 1, 3, 196, 54, 198, 1, 3, 198, 194, 196, 1,
+       3, 46, 199, 194, 1, 3, 46, 194, 198, 1, 3, 56, 201, 194, 1, 3, 56, 194, 199, 1,
+       3, 206, 3, 203, 1, 3, 203, 197, 206, 1, 3, 55, 204, 197, 1, 3, 55, 197, 203, 1,
+       3, 204, 46, 198, 1, 3, 198, 197, 204, 1, 3, 54, 206, 197, 1, 3, 54, 197, 198, 1,
+       3, 208, 8, 173, 1, 3, 173, 172, 208, 1, 3, 47, 207, 172, 1, 3, 47, 172, 173, 1,
+       3, 46, 204, 172, 1, 3, 46, 172, 207, 1, 3, 204, 55, 208, 1, 3, 208, 172, 204, 1,
+3, 9, 209, 166, 1, 3, 9, 166, 167, 1, 3, 209, 56, 199, 1, 3, 199, 166, 209, 1,
+       3, 46, 207, 166, 1, 3, 46, 166, 199, 1, 3, 207, 47, 167, 1, 3, 167, 166, 207, 1,
+3, 1, 201, 200, 1, 3, 1, 200, 214, 1, 3, 201, 56, 210, 1, 3, 210, 200, 201, 1,
+       3, 51, 212, 200, 1, 3, 51, 200, 210, 1, 3, 212, 59, 214, 1, 3, 214, 200, 212, 1,
+       3, 209, 9, 193, 1, 3, 193, 192, 209, 1, 3, 52, 215, 192, 1, 3, 52, 192, 193, 1,
+       3, 215, 51, 210, 1, 3, 210, 192, 215, 1, 3, 192, 210, 56, 1, 3, 56, 209, 192, 1,
+       3, 190, 10, 216, 1, 3, 216, 189, 190, 1, 3, 189, 216, 57, 1, 3, 57, 217, 189, 1,
+       3, 217, 51, 215, 1, 3, 215, 189, 217, 1, 3, 52, 190, 189, 1, 3, 52, 189, 215, 1,
+3, 0, 219, 211, 1, 3, 0, 211, 221, 1, 3, 219, 59, 212, 1, 3, 212, 211, 219, 1,
+       3, 51, 217, 211, 1, 3, 51, 211, 212, 1, 3, 217, 57, 221, 1, 3, 221, 211, 217, 1,
+3, 0, 221, 220, 1, 3, 0, 220, 226, 1, 3, 57, 222, 220, 1, 3, 57, 220, 221, 1,
+       3, 48, 224, 220, 1, 3, 48, 220, 222, 1, 3, 224, 62, 226, 1, 3, 226, 220, 224, 1,
+       3, 10, 185, 184, 1, 3, 10, 184, 216, 1, 3, 185, 49, 227, 1, 3, 227, 184, 185, 1,
+       3, 48, 222, 184, 1, 3, 48, 184, 227, 1, 3, 222, 57, 216, 1, 3, 216, 184, 222, 1,
+       3, 180, 11, 228, 1, 3, 228, 179, 180, 1, 3, 228, 60, 229, 1, 3, 229, 179, 228, 1,
+       3, 48, 227, 179, 1, 3, 48, 179, 229, 1, 3, 49, 180, 179, 1, 3, 49, 179, 227, 1,
+       3, 233, 2, 231, 1, 3, 231, 223, 233, 1, 3, 62, 224, 223, 1, 3, 62, 223, 231, 1,
+       3, 224, 48, 229, 1, 3, 229, 223, 224, 1, 3, 60, 233, 223, 1, 3, 60, 223, 229, 1,
+       3, 237, 2, 233, 1, 3, 233, 232, 237, 1, 3, 60, 234, 232, 1, 3, 60, 232, 233, 1,
+       3, 234, 42, 235, 1, 3, 235, 232, 234, 1, 3, 64, 237, 232, 1, 3, 64, 232, 235, 1,
+       3, 11, 160, 159, 1, 3, 11, 159, 228, 1, 3, 160, 43, 238, 1, 3, 238, 159, 160, 1,
+       3, 42, 234, 159, 1, 3, 42, 159, 238, 1, 3, 234, 60, 228, 1, 3, 228, 159, 234, 1,
+3, 8, 208, 150, 1, 3, 8, 150, 151, 1, 3, 208, 55, 239, 1, 3, 239, 150, 208, 1,
+       3, 42, 238, 150, 1, 3, 42, 150, 239, 1, 3, 238, 43, 151, 1, 3, 151, 150, 238, 1,
+       3, 203, 3, 241, 1, 3, 241, 202, 203, 1, 3, 64, 235, 202, 1, 3, 64, 202, 241, 1,
+       3, 235, 42, 239, 1, 3, 239, 202, 235, 1, 3, 55, 203, 202, 1, 3, 55, 202, 239, 1,
+3, 2, 237, 236, 1, 3, 2, 236, 245, 1, 3, 237, 64, 242, 1, 3, 242, 236, 237, 1,
+       3, 63, 244, 236, 1, 3, 63, 236, 242, 1, 3, 244, 68, 245, 1, 3, 245, 236, 244, 1,
+3, 3, 246, 240, 1, 3, 3, 240, 241, 1, 3, 246, 65, 248, 1, 3, 248, 240, 246, 1,
+       3, 63, 242, 240, 1, 3, 63, 240, 248, 1, 3, 242, 64, 241, 1, 3, 241, 240, 242, 1,
+3, 4, 250, 247, 1, 3, 4, 247, 253, 1, 3, 67, 251, 247, 1, 3, 67, 247, 250, 1,
+       3, 63, 248, 247, 1, 3, 63, 247, 251, 1, 3, 248, 65, 253, 1, 3, 253, 247, 248, 1,
+3, 7, 255, 243, 1, 3, 7, 243, 257, 1, 3, 255, 68, 244, 1, 3, 244, 243, 255, 1,
+       3, 63, 251, 243, 1, 3, 63, 243, 244, 1, 3, 67, 257, 243, 1, 3, 67, 243, 251, 1,
+3, 3, 206, 205, 1, 3, 3, 205, 246, 1, 3, 206, 54, 258, 1, 3, 258, 205, 206, 1,
+       3, 53, 259, 205, 1, 3, 53, 205, 258, 1, 3, 259, 65, 246, 1, 3, 246, 205, 259, 1,
+3, 1, 260, 195, 1, 3, 1, 195, 196, 1, 3, 69, 262, 195, 1, 3, 69, 195, 260, 1,
+       3, 262, 53, 258, 1, 3, 258, 195, 262, 1, 3, 54, 196, 195, 1, 3, 54, 195, 258, 1,
+3, 5, 264, 261, 1, 3, 5, 261, 267, 1, 3, 70, 265, 261, 1, 3, 70, 261, 264, 1,
+       3, 53, 262, 261, 1, 3, 53, 261, 265, 1, 3, 262, 69, 267, 1, 3, 267, 261, 262, 1,
+       3, 268, 4, 253, 1, 3, 253, 252, 268, 1, 3, 253, 65, 259, 1, 3, 259, 252, 253, 1,
+       3, 53, 265, 252, 1, 3, 53, 252, 259, 1, 3, 70, 268, 252, 1, 3, 70, 252, 265, 1,
+       3, 260, 1, 214, 1, 3, 214, 213, 260, 1, 3, 214, 59, 269, 1, 3, 269, 213, 214, 1,
+       3, 269, 58, 270, 1, 3, 270, 213, 269, 1, 3, 69, 260, 213, 1, 3, 69, 213, 270, 1,
+       3, 219, 0, 271, 1, 3, 271, 218, 219, 1, 3, 71, 273, 218, 1, 3, 71, 218, 271, 1,
+       3, 273, 58, 269, 1, 3, 269, 218, 273, 1, 3, 269, 59, 219, 1, 3, 219, 218, 269, 1,
+3, 6, 275, 272, 1, 3, 6, 272, 278, 1, 3, 72, 276, 272, 1, 3, 72, 272, 275, 1,
+       3, 276, 58, 273, 1, 3, 273, 272, 276, 1, 3, 71, 278, 272, 1, 3, 71, 272, 273, 1,
+3, 5, 267, 266, 1, 3, 5, 266, 279, 1, 3, 69, 270, 266, 1, 3, 69, 266, 267, 1,
+       3, 270, 58, 276, 1, 3, 276, 266, 270, 1, 3, 72, 279, 266, 1, 3, 72, 266, 276, 1,
+3, 0, 226, 225, 1, 3, 0, 225, 271, 1, 3, 62, 280, 225, 1, 3, 62, 225, 226, 1,
+       3, 280, 61, 281, 1, 3, 281, 225, 280, 1, 3, 71, 271, 225, 1, 3, 71, 225, 281, 1,
+3, 2, 245, 230, 1, 3, 2, 230, 231, 1, 3, 245, 68, 282, 1, 3, 282, 230, 245, 1,
+       3, 61, 280, 230, 1, 3, 61, 230, 282, 1, 3, 280, 62, 231, 1, 3, 231, 230, 280, 1,
+       3, 255, 7, 283, 1, 3, 283, 254, 255, 1, 3, 73, 284, 254, 1, 3, 73, 254, 283, 1,
+       3, 61, 282, 254, 1, 3, 61, 254, 284, 1, 3, 282, 68, 255, 1, 3, 255, 254, 282, 1,
+3, 6, 278, 277, 1, 3, 6, 277, 285, 1, 3, 278, 71, 281, 1, 3, 281, 277, 278, 1,
+       3, 61, 284, 277, 1, 3, 61, 277, 281, 1, 3, 73, 285, 277, 1, 3, 73, 277, 284, 1,
+3, 4, 268, 249, 1, 3, 4, 249, 250, 1, 3, 268, 70, 286, 1, 3, 286, 249, 268, 1,
+       3, 66, 287, 249, 1, 3, 66, 249, 286, 1, 3, 287, 67, 250, 1, 3, 250, 249, 287, 1,
+3, 5, 279, 263, 1, 3, 5, 263, 264, 1, 3, 279, 72, 288, 1, 3, 288, 263, 279, 1,
+       3, 66, 286, 263, 1, 3, 66, 263, 288, 1, 3, 286, 70, 264, 1, 3, 264, 263, 286, 1,
+3, 6, 285, 274, 1, 3, 6, 274, 275, 1, 3, 285, 73, 289, 1, 3, 289, 274, 285, 1,
+       3, 66, 288, 274, 1, 3, 66, 274, 289, 1, 3, 288, 72, 275, 1, 3, 275, 274, 288, 1,
+3, 7, 257, 256, 1, 3, 7, 256, 283, 1, 3, 257, 67, 287, 1, 3, 287, 256, 257, 1,
+       3, 66, 289, 256, 1, 3, 66, 256, 287, 1, 3, 289, 73, 283, 1, 3, 283, 256, 289, 1,
+
+       0
+};
+
+struct lwo  LWO_s1_5 =
+{
+       290,                    /* number of points */
+       s1_5_PNTS, s1_5_normals, s1_5_POLS, 0L
+};
+
+#endif /* USE_GL */
+
+/* End of s1_5.c */
diff --git a/hacks/glx/s1_6.c b/hacks/glx/s1_6.c
new file mode 100644 (file)
index 0000000..fb9c60e
--- /dev/null
@@ -0,0 +1,1057 @@
+#if !defined( lint ) && !defined( SABER )
+static const char sccsid[] = "@(#)s1_6.c       4.04 97/07/28 xlockmore";
+
+#endif
+
+/*-
+ * Points, polygons, and normal vectors to render "s1_6" in 3D.
+ *
+ * Generated by lw2ogl.  Link this with your program but do
+ * not edit by hand.
+ */
+
+#ifndef STANDALONE
+#include "xlock.h"
+#endif
+
+#ifdef USE_GL
+
+#ifdef STANDALONE
+#include <GL/glx.h>
+#endif
+#include <GL/gl.h>
+#include "buildlwo.h"
+
+static GLfloat s1_6_PNTS[] =
+{
+       (GLfloat) 1.339151, (GLfloat) - 0.510672, (GLfloat) - 0.339151,
+       (GLfloat) 1.339151, (GLfloat) - 0.510672, (GLfloat) - 0.660849,
+       (GLfloat) 1.660849, (GLfloat) - 0.510672, (GLfloat) - 0.339151,
+       (GLfloat) 1.660849, (GLfloat) - 0.510672, (GLfloat) - 0.660849,
+       (GLfloat) 1.638667, (GLfloat) - 0.642463, (GLfloat) - 0.638667,
+       (GLfloat) 1.361333, (GLfloat) - 0.642463, (GLfloat) - 0.638667,
+       (GLfloat) 1.361333, (GLfloat) - 0.642463, (GLfloat) - 0.361333,
+       (GLfloat) 1.638667, (GLfloat) - 0.642463, (GLfloat) - 0.361333,
+       (GLfloat) 1.589301, (GLfloat) - 0.085107, (GLfloat) - 0.624049,
+       (GLfloat) 1.356947, (GLfloat) - 0.122198, (GLfloat) - 0.624049,
+       (GLfloat) 1.356947, (GLfloat) - 0.122198, (GLfloat) - 0.375951,
+       (GLfloat) 1.589301, (GLfloat) - 0.085107, (GLfloat) - 0.375951,
+       (GLfloat) 1.460394, (GLfloat) 0.412133, (GLfloat) - 0.660849,
+       (GLfloat) 1.460394, (GLfloat) 0.412133, (GLfloat) - 0.339151,
+       (GLfloat) 1.370035, (GLfloat) 0.524394, (GLfloat) - 0.361333,
+       (GLfloat) 1.370035, (GLfloat) 0.524394, (GLfloat) - 0.638667,
+       (GLfloat) 1.226863, (GLfloat) 0.204423, (GLfloat) - 0.339151,
+       (GLfloat) 1.177383, (GLfloat) 0.324897, (GLfloat) - 0.361333,
+       (GLfloat) 1.226863, (GLfloat) 0.204423, (GLfloat) - 0.660849,
+       (GLfloat) 1.177383, (GLfloat) 0.324897, (GLfloat) - 0.638667,
+       (GLfloat) 1.460683, (GLfloat) 0.568581, (GLfloat) - 0.500000,
+       (GLfloat) 1.564666, (GLfloat) 0.208184, (GLfloat) - 0.500000,
+       (GLfloat) 1.502855, (GLfloat) 0.449898, (GLfloat) - 0.500000,
+       (GLfloat) 1.294932, (GLfloat) 0.399266, (GLfloat) - 0.262379,
+       (GLfloat) 1.416649, (GLfloat) 0.522728, (GLfloat) - 0.326134,
+       (GLfloat) 1.260429, (GLfloat) 0.437469, (GLfloat) - 0.500000,
+       (GLfloat) 1.392236, (GLfloat) 0.557026, (GLfloat) - 0.500000,
+       (GLfloat) 1.294932, (GLfloat) 0.399266, (GLfloat) - 0.737621,
+       (GLfloat) 1.416649, (GLfloat) 0.522728, (GLfloat) - 0.673866,
+       (GLfloat) 1.412872, (GLfloat) 0.126752, (GLfloat) - 0.313640,
+       (GLfloat) 1.343629, (GLfloat) 0.308278, (GLfloat) - 0.280660,
+       (GLfloat) 1.129180, (GLfloat) 0.229952, (GLfloat) - 0.500000,
+       (GLfloat) 1.174088, (GLfloat) 0.274960, (GLfloat) - 0.326134,
+       (GLfloat) 1.268890, (GLfloat) 0.429299, (GLfloat) - 0.322437,
+       (GLfloat) 1.261078, (GLfloat) 0.045321, (GLfloat) - 0.500000,
+       (GLfloat) 1.184403, (GLfloat) 0.166658, (GLfloat) - 0.500000,
+       (GLfloat) 1.174088, (GLfloat) 0.274960, (GLfloat) - 0.673866,
+       (GLfloat) 1.145545, (GLfloat) 0.301571, (GLfloat) - 0.500000,
+       (GLfloat) 1.412872, (GLfloat) 0.126752, (GLfloat) - 0.686360,
+       (GLfloat) 1.343629, (GLfloat) 0.308278, (GLfloat) - 0.719340,
+       (GLfloat) 1.268890, (GLfloat) 0.429299, (GLfloat) - 0.677562,
+       (GLfloat) 1.524188, (GLfloat) 0.186469, (GLfloat) - 0.636664,
+       (GLfloat) 1.682599, (GLfloat) - 0.328303, (GLfloat) - 0.500000,
+       (GLfloat) 1.631547, (GLfloat) - 0.078363, (GLfloat) - 0.500000,
+       (GLfloat) 1.524188, (GLfloat) 0.186469, (GLfloat) - 0.363336,
+       (GLfloat) 1.301556, (GLfloat) 0.067036, (GLfloat) - 0.636664,
+       (GLfloat) 1.497312, (GLfloat) - 0.330832, (GLfloat) - 0.686360,
+       (GLfloat) 1.473124, (GLfloat) - 0.103652, (GLfloat) - 0.669158,
+       (GLfloat) 1.497312, (GLfloat) - 0.330832, (GLfloat) - 0.313640,
+       (GLfloat) 1.473124, (GLfloat) - 0.103652, (GLfloat) - 0.330842,
+       (GLfloat) 1.301556, (GLfloat) 0.067036, (GLfloat) - 0.363336,
+       (GLfloat) 1.312026, (GLfloat) - 0.333361, (GLfloat) - 0.500000,
+       (GLfloat) 1.314701, (GLfloat) - 0.128942, (GLfloat) - 0.500000,
+       (GLfloat) 1.500000, (GLfloat) - 0.609501, (GLfloat) - 0.737621,
+       (GLfloat) 1.500000, (GLfloat) - 0.510672, (GLfloat) - 0.719340,
+       (GLfloat) 1.633189, (GLfloat) - 0.328978, (GLfloat) - 0.636664,
+       (GLfloat) 1.361436, (GLfloat) - 0.332687, (GLfloat) - 0.636664,
+       (GLfloat) 1.361436, (GLfloat) - 0.332687, (GLfloat) - 0.363336,
+       (GLfloat) 1.262379, (GLfloat) - 0.609501, (GLfloat) - 0.500000,
+       (GLfloat) 1.280660, (GLfloat) - 0.510672, (GLfloat) - 0.500000,
+       (GLfloat) 1.633189, (GLfloat) - 0.328978, (GLfloat) - 0.363336,
+       (GLfloat) 1.500000, (GLfloat) - 0.609501, (GLfloat) - 0.262379,
+       (GLfloat) 1.500000, (GLfloat) - 0.510672, (GLfloat) - 0.280660,
+       (GLfloat) 1.737621, (GLfloat) - 0.609501, (GLfloat) - 0.500000,
+       (GLfloat) 1.719340, (GLfloat) - 0.510672, (GLfloat) - 0.500000,
+       (GLfloat) 1.673866, (GLfloat) - 0.608893, (GLfloat) - 0.673866,
+       (GLfloat) 1.500000, (GLfloat) - 0.660924, (GLfloat) - 0.500000,
+       (GLfloat) 1.677562, (GLfloat) - 0.649161, (GLfloat) - 0.500000,
+       (GLfloat) 1.673866, (GLfloat) - 0.608893, (GLfloat) - 0.326134,
+       (GLfloat) 1.326134, (GLfloat) - 0.608893, (GLfloat) - 0.673866,
+       (GLfloat) 1.500000, (GLfloat) - 0.649161, (GLfloat) - 0.677562,
+       (GLfloat) 1.326134, (GLfloat) - 0.608893, (GLfloat) - 0.326134,
+       (GLfloat) 1.322438, (GLfloat) - 0.649161, (GLfloat) - 0.500000,
+       (GLfloat) 1.500000, (GLfloat) - 0.649161, (GLfloat) - 0.322437,
+       (GLfloat) 1.470529, (GLfloat) 0.515074, (GLfloat) - 0.593594,
+       (GLfloat) 1.521298, (GLfloat) 0.332708, (GLfloat) - 0.580972,
+       (GLfloat) 1.492239, (GLfloat) 0.440457, (GLfloat) - 0.587736,
+       (GLfloat) 1.470529, (GLfloat) 0.515074, (GLfloat) - 0.406406,
+       (GLfloat) 1.481548, (GLfloat) 0.525864, (GLfloat) - 0.500000,
+       (GLfloat) 1.423386, (GLfloat) 0.566478, (GLfloat) - 0.587500,
+       (GLfloat) 1.449724, (GLfloat) 0.556950, (GLfloat) - 0.594774,
+       (GLfloat) 1.382377, (GLfloat) 0.428753, (GLfloat) - 0.718387,
+       (GLfloat) 1.437472, (GLfloat) 0.482703, (GLfloat) - 0.671590,
+       (GLfloat) 1.382377, (GLfloat) 0.428753, (GLfloat) - 0.281613,
+       (GLfloat) 1.437472, (GLfloat) 0.482703, (GLfloat) - 0.328410,
+       (GLfloat) 1.423386, (GLfloat) 0.566478, (GLfloat) - 0.412500,
+       (GLfloat) 1.449724, (GLfloat) 0.556950, (GLfloat) - 0.405226,
+       (GLfloat) 1.521298, (GLfloat) 0.332708, (GLfloat) - 0.419028,
+       (GLfloat) 1.492239, (GLfloat) 0.440457, (GLfloat) - 0.412264,
+       (GLfloat) 1.327417, (GLfloat) 0.498590, (GLfloat) - 0.409500,
+       (GLfloat) 1.384841, (GLfloat) 0.546182, (GLfloat) - 0.417500,
+       (GLfloat) 1.433279, (GLfloat) 0.578472, (GLfloat) - 0.500000,
+       (GLfloat) 1.341069, (GLfloat) 0.481236, (GLfloat) - 0.294000,
+       (GLfloat) 1.392914, (GLfloat) 0.533174, (GLfloat) - 0.339125,
+       (GLfloat) 1.341069, (GLfloat) 0.481236, (GLfloat) - 0.706000,
+       (GLfloat) 1.392914, (GLfloat) 0.533174, (GLfloat) - 0.660875,
+       (GLfloat) 1.327417, (GLfloat) 0.498590, (GLfloat) - 0.590500,
+       (GLfloat) 1.384841, (GLfloat) 0.546182, (GLfloat) - 0.582500,
+       (GLfloat) 1.438984, (GLfloat) 0.272283, (GLfloat) - 0.311066,
+       (GLfloat) 1.407319, (GLfloat) 0.364926, (GLfloat) - 0.295283,
+       (GLfloat) 1.250150, (GLfloat) 0.299272, (GLfloat) - 0.281613,
+       (GLfloat) 1.316263, (GLfloat) 0.364012, (GLfloat) - 0.266014,
+       (GLfloat) 1.361260, (GLfloat) 0.466583, (GLfloat) - 0.278403,
+       (GLfloat) 1.161998, (GLfloat) 0.212951, (GLfloat) - 0.406406,
+       (GLfloat) 1.195055, (GLfloat) 0.245321, (GLfloat) - 0.328410,
+       (GLfloat) 1.219504, (GLfloat) 0.355352, (GLfloat) - 0.294000,
+       (GLfloat) 1.229040, (GLfloat) 0.331527, (GLfloat) - 0.278403,
+       (GLfloat) 1.315513, (GLfloat) 0.181646, (GLfloat) - 0.311066,
+       (GLfloat) 1.279939, (GLfloat) 0.251630, (GLfloat) - 0.295283,
+       (GLfloat) 1.201684, (GLfloat) 0.368389, (GLfloat) - 0.409500,
+       (GLfloat) 1.213173, (GLfloat) 0.368416, (GLfloat) - 0.335375,
+       (GLfloat) 1.279412, (GLfloat) 0.419138, (GLfloat) - 0.278500,
+       (GLfloat) 1.137187, (GLfloat) 0.270110, (GLfloat) - 0.412500,
+       (GLfloat) 1.169407, (GLfloat) 0.301726, (GLfloat) - 0.339125,
+       (GLfloat) 1.327792, (GLfloat) 0.487107, (GLfloat) - 0.335375,
+       (GLfloat) 1.233200, (GLfloat) 0.121222, (GLfloat) - 0.419028,
+       (GLfloat) 1.195018, (GLfloat) 0.176099, (GLfloat) - 0.412264,
+       (GLfloat) 1.161998, (GLfloat) 0.212951, (GLfloat) - 0.593594,
+       (GLfloat) 1.150979, (GLfloat) 0.202161, (GLfloat) - 0.500000,
+       (GLfloat) 1.140576, (GLfloat) 0.241160, (GLfloat) - 0.405226,
+       (GLfloat) 1.250150, (GLfloat) 0.299272, (GLfloat) - 0.718387,
+       (GLfloat) 1.195055, (GLfloat) 0.245321, (GLfloat) - 0.671590,
+       (GLfloat) 1.137187, (GLfloat) 0.270110, (GLfloat) - 0.587500,
+       (GLfloat) 1.140576, (GLfloat) 0.241160, (GLfloat) - 0.594774,
+       (GLfloat) 1.233200, (GLfloat) 0.121222, (GLfloat) - 0.580972,
+       (GLfloat) 1.195018, (GLfloat) 0.176099, (GLfloat) - 0.587736,
+       (GLfloat) 1.201684, (GLfloat) 0.368389, (GLfloat) - 0.590500,
+       (GLfloat) 1.156124, (GLfloat) 0.309340, (GLfloat) - 0.582500,
+       (GLfloat) 1.125545, (GLfloat) 0.259804, (GLfloat) - 0.500000,
+       (GLfloat) 1.219504, (GLfloat) 0.355352, (GLfloat) - 0.706000,
+       (GLfloat) 1.169407, (GLfloat) 0.301726, (GLfloat) - 0.660875,
+       (GLfloat) 1.156124, (GLfloat) 0.309340, (GLfloat) - 0.417500,
+       (GLfloat) 1.315513, (GLfloat) 0.181646, (GLfloat) - 0.688934,
+       (GLfloat) 1.279939, (GLfloat) 0.251630, (GLfloat) - 0.704717,
+       (GLfloat) 1.316263, (GLfloat) 0.364012, (GLfloat) - 0.733986,
+       (GLfloat) 1.229040, (GLfloat) 0.331527, (GLfloat) - 0.721597,
+       (GLfloat) 1.361260, (GLfloat) 0.466583, (GLfloat) - 0.721597,
+       (GLfloat) 1.438984, (GLfloat) 0.272283, (GLfloat) - 0.688934,
+       (GLfloat) 1.407319, (GLfloat) 0.364926, (GLfloat) - 0.704717,
+       (GLfloat) 1.327792, (GLfloat) 0.487107, (GLfloat) - 0.664625,
+       (GLfloat) 1.279412, (GLfloat) 0.419138, (GLfloat) - 0.721500,
+       (GLfloat) 1.213173, (GLfloat) 0.368416, (GLfloat) - 0.664625,
+       (GLfloat) 1.262552, (GLfloat) 0.435419, (GLfloat) - 0.402250,
+       (GLfloat) 1.330455, (GLfloat) 0.505735, (GLfloat) - 0.500000,
+       (GLfloat) 1.194650, (GLfloat) 0.365104, (GLfloat) - 0.500000,
+       (GLfloat) 1.262552, (GLfloat) 0.435419, (GLfloat) - 0.597750,
+       (GLfloat) 1.490430, (GLfloat) 0.310049, (GLfloat) - 0.648448,
+       (GLfloat) 1.588828, (GLfloat) 0.061527, (GLfloat) - 0.569694,
+       (GLfloat) 1.554547, (GLfloat) 0.202755, (GLfloat) - 0.574544,
+       (GLfloat) 1.531587, (GLfloat) 0.340261, (GLfloat) - 0.500000,
+       (GLfloat) 1.647861, (GLfloat) - 0.211045, (GLfloat) - 0.569694,
+       (GLfloat) 1.620986, (GLfloat) - 0.080049, (GLfloat) - 0.567663,
+       (GLfloat) 1.588828, (GLfloat) 0.061527, (GLfloat) - 0.430306,
+       (GLfloat) 1.599013, (GLfloat) 0.064899, (GLfloat) - 0.500000,
+       (GLfloat) 1.507354, (GLfloat) 0.034552, (GLfloat) - 0.662619,
+       (GLfloat) 1.558275, (GLfloat) 0.051411, (GLfloat) - 0.627772,
+       (GLfloat) 1.507354, (GLfloat) 0.034552, (GLfloat) - 0.337381,
+       (GLfloat) 1.558275, (GLfloat) 0.051411, (GLfloat) - 0.372228,
+       (GLfloat) 1.554547, (GLfloat) 0.202755, (GLfloat) - 0.425456,
+       (GLfloat) 1.647861, (GLfloat) - 0.211045, (GLfloat) - 0.430306,
+       (GLfloat) 1.620986, (GLfloat) - 0.080049, (GLfloat) - 0.432337,
+       (GLfloat) 1.490430, (GLfloat) 0.310049, (GLfloat) - 0.351552,
+       (GLfloat) 1.264067, (GLfloat) 0.143881, (GLfloat) - 0.648448,
+       (GLfloat) 1.385142, (GLfloat) - 0.005911, (GLfloat) - 0.662619,
+       (GLfloat) 1.352154, (GLfloat) 0.094180, (GLfloat) - 0.673936,
+       (GLfloat) 1.377249, (GLfloat) 0.226965, (GLfloat) - 0.702430,
+       (GLfloat) 1.421273, (GLfloat) - 0.224532, (GLfloat) - 0.662619,
+       (GLfloat) 1.409755, (GLfloat) - 0.113768, (GLfloat) - 0.657881,
+       (GLfloat) 1.446248, (GLfloat) 0.014320, (GLfloat) - 0.674234,
+       (GLfloat) 1.303667, (GLfloat) - 0.032887, (GLfloat) - 0.569694,
+       (GLfloat) 1.334220, (GLfloat) - 0.022771, (GLfloat) - 0.627772,
+       (GLfloat) 1.473590, (GLfloat) 0.159325, (GLfloat) - 0.673936,
+       (GLfloat) 1.557226, (GLfloat) - 0.216440, (GLfloat) - 0.662619,
+       (GLfloat) 1.536493, (GLfloat) - 0.093537, (GLfloat) - 0.657881,
+       (GLfloat) 1.377249, (GLfloat) 0.226965, (GLfloat) - 0.297570,
+       (GLfloat) 1.385142, (GLfloat) - 0.005911, (GLfloat) - 0.337381,
+       (GLfloat) 1.352154, (GLfloat) 0.094180, (GLfloat) - 0.326064,
+       (GLfloat) 1.264067, (GLfloat) 0.143881, (GLfloat) - 0.351552,
+       (GLfloat) 1.473590, (GLfloat) 0.159325, (GLfloat) - 0.326064,
+       (GLfloat) 1.557226, (GLfloat) - 0.216440, (GLfloat) - 0.337381,
+       (GLfloat) 1.536493, (GLfloat) - 0.093537, (GLfloat) - 0.342119,
+       (GLfloat) 1.446248, (GLfloat) 0.014320, (GLfloat) - 0.325766,
+       (GLfloat) 1.303667, (GLfloat) - 0.032887, (GLfloat) - 0.430306,
+       (GLfloat) 1.334220, (GLfloat) - 0.022771, (GLfloat) - 0.372228,
+       (GLfloat) 1.421273, (GLfloat) - 0.224532, (GLfloat) - 0.337381,
+       (GLfloat) 1.409755, (GLfloat) - 0.113768, (GLfloat) - 0.342119,
+       (GLfloat) 1.222911, (GLfloat) 0.113669, (GLfloat) - 0.500000,
+       (GLfloat) 1.271198, (GLfloat) 0.050750, (GLfloat) - 0.574544,
+       (GLfloat) 1.271198, (GLfloat) 0.050750, (GLfloat) - 0.425456,
+       (GLfloat) 1.330638, (GLfloat) - 0.229927, (GLfloat) - 0.430306,
+       (GLfloat) 1.325262, (GLfloat) - 0.127256, (GLfloat) - 0.432337,
+       (GLfloat) 1.293483, (GLfloat) - 0.036258, (GLfloat) - 0.500000,
+       (GLfloat) 1.330638, (GLfloat) - 0.229927, (GLfloat) - 0.569694,
+       (GLfloat) 1.325262, (GLfloat) - 0.127256, (GLfloat) - 0.567663,
+       (GLfloat) 1.419028, (GLfloat) - 0.429344, (GLfloat) - 0.688934,
+       (GLfloat) 1.406406, (GLfloat) - 0.569469, (GLfloat) - 0.718387,
+       (GLfloat) 1.412264, (GLfloat) - 0.510672, (GLfloat) - 0.704717,
+       (GLfloat) 1.580972, (GLfloat) - 0.429344, (GLfloat) - 0.688934,
+       (GLfloat) 1.500000, (GLfloat) - 0.429344, (GLfloat) - 0.702430,
+       (GLfloat) 1.423198, (GLfloat) - 0.331844, (GLfloat) - 0.673936,
+       (GLfloat) 1.311066, (GLfloat) - 0.429344, (GLfloat) - 0.580972,
+       (GLfloat) 1.351552, (GLfloat) - 0.429344, (GLfloat) - 0.648448,
+       (GLfloat) 1.688934, (GLfloat) - 0.429344, (GLfloat) - 0.580972,
+       (GLfloat) 1.648448, (GLfloat) - 0.429344, (GLfloat) - 0.648448,
+       (GLfloat) 1.571427, (GLfloat) - 0.329821, (GLfloat) - 0.673936,
+       (GLfloat) 1.593594, (GLfloat) - 0.569469, (GLfloat) - 0.718387,
+       (GLfloat) 1.587736, (GLfloat) - 0.510672, (GLfloat) - 0.704717,
+       (GLfloat) 1.489249, (GLfloat) - 0.220486, (GLfloat) - 0.674234,
+       (GLfloat) 1.613873, (GLfloat) - 0.213068, (GLfloat) - 0.627772,
+       (GLfloat) 1.364627, (GLfloat) - 0.227904, (GLfloat) - 0.627772,
+       (GLfloat) 1.324378, (GLfloat) - 0.333193, (GLfloat) - 0.574544,
+       (GLfloat) 1.311066, (GLfloat) - 0.429344, (GLfloat) - 0.419028,
+       (GLfloat) 1.297570, (GLfloat) - 0.429344, (GLfloat) - 0.500000,
+       (GLfloat) 1.281613, (GLfloat) - 0.569469, (GLfloat) - 0.593594,
+       (GLfloat) 1.295283, (GLfloat) - 0.510672, (GLfloat) - 0.587736,
+       (GLfloat) 1.319309, (GLfloat) - 0.230602, (GLfloat) - 0.500000,
+       (GLfloat) 1.364627, (GLfloat) - 0.227904, (GLfloat) - 0.372228,
+       (GLfloat) 1.324378, (GLfloat) - 0.333193, (GLfloat) - 0.425456,
+       (GLfloat) 1.281613, (GLfloat) - 0.569469, (GLfloat) - 0.406406,
+       (GLfloat) 1.295283, (GLfloat) - 0.510672, (GLfloat) - 0.412264,
+       (GLfloat) 1.419028, (GLfloat) - 0.429344, (GLfloat) - 0.311066,
+       (GLfloat) 1.351552, (GLfloat) - 0.429344, (GLfloat) - 0.351552,
+       (GLfloat) 1.423198, (GLfloat) - 0.331844, (GLfloat) - 0.326064,
+       (GLfloat) 1.580972, (GLfloat) - 0.429344, (GLfloat) - 0.311066,
+       (GLfloat) 1.500000, (GLfloat) - 0.429344, (GLfloat) - 0.297570,
+       (GLfloat) 1.406406, (GLfloat) - 0.569469, (GLfloat) - 0.281613,
+       (GLfloat) 1.412264, (GLfloat) - 0.510672, (GLfloat) - 0.295283,
+       (GLfloat) 1.489249, (GLfloat) - 0.220486, (GLfloat) - 0.325766,
+       (GLfloat) 1.613873, (GLfloat) - 0.213068, (GLfloat) - 0.372228,
+       (GLfloat) 1.571427, (GLfloat) - 0.329821, (GLfloat) - 0.326064,
+       (GLfloat) 1.593594, (GLfloat) - 0.569469, (GLfloat) - 0.281613,
+       (GLfloat) 1.587736, (GLfloat) - 0.510672, (GLfloat) - 0.295283,
+       (GLfloat) 1.688934, (GLfloat) - 0.429344, (GLfloat) - 0.419028,
+       (GLfloat) 1.648448, (GLfloat) - 0.429344, (GLfloat) - 0.351552,
+       (GLfloat) 1.670246, (GLfloat) - 0.328472, (GLfloat) - 0.425456,
+       (GLfloat) 1.702430, (GLfloat) - 0.429344, (GLfloat) - 0.500000,
+       (GLfloat) 1.718387, (GLfloat) - 0.569469, (GLfloat) - 0.406406,
+       (GLfloat) 1.704717, (GLfloat) - 0.510672, (GLfloat) - 0.412264,
+       (GLfloat) 1.659190, (GLfloat) - 0.210370, (GLfloat) - 0.500000,
+       (GLfloat) 1.670246, (GLfloat) - 0.328472, (GLfloat) - 0.574544,
+       (GLfloat) 1.718387, (GLfloat) - 0.569469, (GLfloat) - 0.593594,
+       (GLfloat) 1.704717, (GLfloat) - 0.510672, (GLfloat) - 0.587736,
+       (GLfloat) 1.733986, (GLfloat) - 0.569469, (GLfloat) - 0.500000,
+       (GLfloat) 1.706000, (GLfloat) - 0.633319, (GLfloat) - 0.412500,
+       (GLfloat) 1.721597, (GLfloat) - 0.609197, (GLfloat) - 0.405226,
+       (GLfloat) 1.671590, (GLfloat) - 0.569469, (GLfloat) - 0.328410,
+       (GLfloat) 1.671590, (GLfloat) - 0.569469, (GLfloat) - 0.671590,
+       (GLfloat) 1.706000, (GLfloat) - 0.633319, (GLfloat) - 0.587500,
+       (GLfloat) 1.721597, (GLfloat) - 0.609197, (GLfloat) - 0.594774,
+       (GLfloat) 1.590500, (GLfloat) - 0.655194, (GLfloat) - 0.590500,
+       (GLfloat) 1.664625, (GLfloat) - 0.646948, (GLfloat) - 0.582500,
+       (GLfloat) 1.721500, (GLfloat) - 0.634535, (GLfloat) - 0.500000,
+       (GLfloat) 1.587500, (GLfloat) - 0.633319, (GLfloat) - 0.706000,
+       (GLfloat) 1.660875, (GLfloat) - 0.632104, (GLfloat) - 0.660875,
+       (GLfloat) 1.587500, (GLfloat) - 0.633319, (GLfloat) - 0.294000,
+       (GLfloat) 1.660875, (GLfloat) - 0.632104, (GLfloat) - 0.339125,
+       (GLfloat) 1.590500, (GLfloat) - 0.655194, (GLfloat) - 0.409500,
+       (GLfloat) 1.664625, (GLfloat) - 0.646948, (GLfloat) - 0.417500,
+       (GLfloat) 1.500000, (GLfloat) - 0.569469, (GLfloat) - 0.733986,
+       (GLfloat) 1.594774, (GLfloat) - 0.609197, (GLfloat) - 0.721597,
+       (GLfloat) 1.328410, (GLfloat) - 0.569469, (GLfloat) - 0.671590,
+       (GLfloat) 1.412500, (GLfloat) - 0.633319, (GLfloat) - 0.706000,
+       (GLfloat) 1.405226, (GLfloat) - 0.609197, (GLfloat) - 0.721597,
+       (GLfloat) 1.409500, (GLfloat) - 0.655194, (GLfloat) - 0.590500,
+       (GLfloat) 1.417500, (GLfloat) - 0.646948, (GLfloat) - 0.664625,
+       (GLfloat) 1.500000, (GLfloat) - 0.634535, (GLfloat) - 0.721500,
+       (GLfloat) 1.294000, (GLfloat) - 0.633319, (GLfloat) - 0.587500,
+       (GLfloat) 1.339125, (GLfloat) - 0.632104, (GLfloat) - 0.660875,
+       (GLfloat) 1.582500, (GLfloat) - 0.646948, (GLfloat) - 0.664625,
+       (GLfloat) 1.266014, (GLfloat) - 0.569469, (GLfloat) - 0.500000,
+       (GLfloat) 1.278403, (GLfloat) - 0.609197, (GLfloat) - 0.594774,
+       (GLfloat) 1.328410, (GLfloat) - 0.569469, (GLfloat) - 0.328410,
+       (GLfloat) 1.294000, (GLfloat) - 0.633319, (GLfloat) - 0.412500,
+       (GLfloat) 1.278403, (GLfloat) - 0.609197, (GLfloat) - 0.405226,
+       (GLfloat) 1.409500, (GLfloat) - 0.655194, (GLfloat) - 0.409500,
+       (GLfloat) 1.335375, (GLfloat) - 0.646948, (GLfloat) - 0.417500,
+       (GLfloat) 1.278500, (GLfloat) - 0.634535, (GLfloat) - 0.500000,
+       (GLfloat) 1.412500, (GLfloat) - 0.633319, (GLfloat) - 0.294000,
+       (GLfloat) 1.339125, (GLfloat) - 0.632104, (GLfloat) - 0.339125,
+       (GLfloat) 1.335375, (GLfloat) - 0.646948, (GLfloat) - 0.582500,
+       (GLfloat) 1.500000, (GLfloat) - 0.569469, (GLfloat) - 0.266014,
+       (GLfloat) 1.405226, (GLfloat) - 0.609197, (GLfloat) - 0.278403,
+       (GLfloat) 1.594774, (GLfloat) - 0.609197, (GLfloat) - 0.278403,
+       (GLfloat) 1.582500, (GLfloat) - 0.646948, (GLfloat) - 0.335375,
+       (GLfloat) 1.500000, (GLfloat) - 0.634535, (GLfloat) - 0.278500,
+       (GLfloat) 1.417500, (GLfloat) - 0.646948, (GLfloat) - 0.335375,
+       (GLfloat) 1.500000, (GLfloat) - 0.657972, (GLfloat) - 0.597750,
+       (GLfloat) 1.597750, (GLfloat) - 0.657972, (GLfloat) - 0.500000,
+       (GLfloat) 1.402250, (GLfloat) - 0.657972, (GLfloat) - 0.500000,
+       (GLfloat) 1.500000, (GLfloat) - 0.657972, (GLfloat) - 0.402250,
+};
+
+static GLfloat s1_6_normals[] =
+{
+       (GLfloat) 0.863661, (GLfloat) 0.210849, (GLfloat) - 0.457857,
+       (GLfloat) 0.863729, (GLfloat) 0.215548, (GLfloat) - 0.455534,
+       (GLfloat) 0.952947, (GLfloat) 0.267284, (GLfloat) - 0.143006,
+       (GLfloat) 0.953156, (GLfloat) 0.266032, (GLfloat) - 0.143950,
+       (GLfloat) 0.887569, (GLfloat) 0.433517, (GLfloat) - 0.155833,
+       (GLfloat) 0.886526, (GLfloat) 0.436070, (GLfloat) - 0.154645,
+       (GLfloat) 0.784332, (GLfloat) 0.380163, (GLfloat) - 0.490203,
+       (GLfloat) 0.785458, (GLfloat) 0.376379, (GLfloat) - 0.491319,
+       (GLfloat) 0.863661, (GLfloat) 0.210849, (GLfloat) 0.457857,
+       (GLfloat) 0.863729, (GLfloat) 0.215548, (GLfloat) 0.455534,
+       (GLfloat) 0.785458, (GLfloat) 0.376379, (GLfloat) 0.491319,
+       (GLfloat) 0.784333, (GLfloat) 0.380162, (GLfloat) 0.490203,
+       (GLfloat) 0.887569, (GLfloat) 0.433517, (GLfloat) 0.155833,
+       (GLfloat) 0.886526, (GLfloat) 0.436070, (GLfloat) 0.154645,
+       (GLfloat) 0.953156, (GLfloat) 0.266032, (GLfloat) 0.143950,
+       (GLfloat) 0.952947, (GLfloat) 0.267284, (GLfloat) 0.143006,
+       (GLfloat) - 0.476698, (GLfloat) 0.854621, (GLfloat) 0.205866,
+       (GLfloat) - 0.498450, (GLfloat) 0.848428, (GLfloat) 0.178092,
+       (GLfloat) - 0.462000, (GLfloat) 0.884194, (GLfloat) 0.068965,
+       (GLfloat) - 0.472068, (GLfloat) 0.878521, (GLfloat) 0.073162,
+       (GLfloat) 0.299348, (GLfloat) 0.942240, (GLfloat) 0.150245,
+       (GLfloat) 0.334834, (GLfloat) 0.927714, (GLfloat) 0.165022,
+       (GLfloat) 0.146237, (GLfloat) 0.884155, (GLfloat) 0.443716,
+       (GLfloat) 0.183286, (GLfloat) 0.864289, (GLfloat) 0.468413,
+       (GLfloat) - 0.498450, (GLfloat) 0.848429, (GLfloat) - 0.178092,
+       (GLfloat) - 0.476698, (GLfloat) 0.854621, (GLfloat) - 0.205865,
+       (GLfloat) 0.146237, (GLfloat) 0.884155, (GLfloat) - 0.443716,
+       (GLfloat) 0.183286, (GLfloat) 0.864289, (GLfloat) - 0.468413,
+       (GLfloat) 0.334834, (GLfloat) 0.927714, (GLfloat) - 0.165022,
+       (GLfloat) 0.299348, (GLfloat) 0.942240, (GLfloat) - 0.150245,
+       (GLfloat) - 0.472068, (GLfloat) 0.878521, (GLfloat) - 0.073162,
+       (GLfloat) - 0.462000, (GLfloat) 0.884194, (GLfloat) - 0.068965,
+       (GLfloat) 0.601151, (GLfloat) 0.064321, (GLfloat) 0.796542,
+       (GLfloat) 0.602133, (GLfloat) 0.074603, (GLfloat) 0.794903,
+       (GLfloat) 0.305416, (GLfloat) - 0.098916, (GLfloat) 0.947067,
+       (GLfloat) 0.305705, (GLfloat) - 0.083664, (GLfloat) 0.948443,
+       (GLfloat) 0.204663, (GLfloat) 0.031235, (GLfloat) 0.978334,
+       (GLfloat) 0.206924, (GLfloat) 0.024347, (GLfloat) 0.978054,
+       (GLfloat) 0.503723, (GLfloat) 0.214462, (GLfloat) 0.836821,
+       (GLfloat) 0.504738, (GLfloat) 0.210719, (GLfloat) 0.837160,
+       (GLfloat) - 0.295242, (GLfloat) - 0.450841, (GLfloat) 0.842363,
+       (GLfloat) - 0.299933, (GLfloat) - 0.431633, (GLfloat) 0.850725,
+       (GLfloat) - 0.391261, (GLfloat) - 0.341115, (GLfloat) 0.854725,
+       (GLfloat) - 0.390827, (GLfloat) - 0.342109, (GLfloat) 0.854527,
+       (GLfloat) - 0.083295, (GLfloat) - 0.151964, (GLfloat) 0.984870,
+       (GLfloat) - 0.083124, (GLfloat) - 0.152402, (GLfloat) 0.984817,
+       (GLfloat) 0.015860, (GLfloat) - 0.266588, (GLfloat) 0.963680,
+       (GLfloat) 0.013989, (GLfloat) - 0.247700, (GLfloat) 0.968736,
+       (GLfloat) - 0.816724, (GLfloat) 0.502516, (GLfloat) 0.283619,
+       (GLfloat) - 0.805591, (GLfloat) 0.530375, (GLfloat) 0.264055,
+       (GLfloat) - 0.732550, (GLfloat) 0.603459, (GLfloat) 0.314971,
+       (GLfloat) - 0.730076, (GLfloat) 0.611620, (GLfloat) 0.304811,
+       (GLfloat) - 0.516849, (GLfloat) 0.314381, (GLfloat) 0.796261,
+       (GLfloat) - 0.502724, (GLfloat) 0.272837, (GLfloat) 0.820261,
+       (GLfloat) - 0.744687, (GLfloat) 0.181500, (GLfloat) 0.642261,
+       (GLfloat) - 0.739362, (GLfloat) 0.135764, (GLfloat) 0.659478,
+       (GLfloat) - 0.549371, (GLfloat) 0.797029, (GLfloat) 0.250869,
+       (GLfloat) - 0.542332, (GLfloat) 0.789948, (GLfloat) 0.286109,
+       (GLfloat) - 0.086395, (GLfloat) 0.693389, (GLfloat) 0.715365,
+       (GLfloat) - 0.059539, (GLfloat) 0.687907, (GLfloat) 0.723353,
+       (GLfloat) - 0.265868, (GLfloat) 0.473566, (GLfloat) 0.839672,
+       (GLfloat) - 0.289224, (GLfloat) 0.481874, (GLfloat) 0.827131,
+       (GLfloat) - 0.628658, (GLfloat) 0.711043, (GLfloat) 0.314972,
+       (GLfloat) - 0.636726, (GLfloat) 0.708286, (GLfloat) 0.304813,
+       (GLfloat) - 0.602622, (GLfloat) - 0.619862, (GLfloat) 0.502612,
+       (GLfloat) - 0.608832, (GLfloat) - 0.607495, (GLfloat) 0.510170,
+       (GLfloat) - 0.718752, (GLfloat) - 0.676658, (GLfloat) 0.159776,
+       (GLfloat) - 0.721882, (GLfloat) - 0.672658, (GLfloat) 0.162535,
+       (GLfloat) - 0.782122, (GLfloat) - 0.600854, (GLfloat) 0.165107,
+       (GLfloat) - 0.776469, (GLfloat) - 0.609074, (GLfloat) 0.161631,
+       (GLfloat) - 0.682182, (GLfloat) - 0.521915, (GLfloat) 0.512086,
+       (GLfloat) - 0.675579, (GLfloat) - 0.534280, (GLfloat) 0.508073,
+       (GLfloat) - 0.608832, (GLfloat) - 0.607495, (GLfloat) - 0.510170,
+       (GLfloat) - 0.602622, (GLfloat) - 0.619862, (GLfloat) - 0.502612,
+       (GLfloat) - 0.682182, (GLfloat) - 0.521915, (GLfloat) - 0.512086,
+       (GLfloat) - 0.675579, (GLfloat) - 0.534280, (GLfloat) - 0.508073,
+       (GLfloat) - 0.776469, (GLfloat) - 0.609074, (GLfloat) - 0.161631,
+       (GLfloat) - 0.782122, (GLfloat) - 0.600854, (GLfloat) - 0.165107,
+       (GLfloat) - 0.718752, (GLfloat) - 0.676658, (GLfloat) - 0.159776,
+       (GLfloat) - 0.721882, (GLfloat) - 0.672658, (GLfloat) - 0.162535,
+       (GLfloat) - 0.870738, (GLfloat) 0.446582, (GLfloat) - 0.205866,
+       (GLfloat) - 0.865307, (GLfloat) 0.468537, (GLfloat) - 0.178091,
+       (GLfloat) - 0.899779, (GLfloat) 0.430861, (GLfloat) - 0.068965,
+       (GLfloat) - 0.894461, (GLfloat) 0.441120, (GLfloat) - 0.073162,
+       (GLfloat) - 0.988176, (GLfloat) - 0.083362, (GLfloat) - 0.128682,
+       (GLfloat) - 0.982213, (GLfloat) - 0.119589, (GLfloat) - 0.144763,
+       (GLfloat) - 0.919779, (GLfloat) 0.029098, (GLfloat) - 0.391357,
+       (GLfloat) - 0.919364, (GLfloat) - 0.008818, (GLfloat) - 0.393310,
+       (GLfloat) - 0.865307, (GLfloat) 0.468537, (GLfloat) 0.178091,
+       (GLfloat) - 0.870738, (GLfloat) 0.446582, (GLfloat) 0.205866,
+       (GLfloat) - 0.919364, (GLfloat) - 0.008818, (GLfloat) 0.393310,
+       (GLfloat) - 0.919779, (GLfloat) 0.029098, (GLfloat) 0.391357,
+       (GLfloat) - 0.982213, (GLfloat) - 0.119589, (GLfloat) 0.144763,
+       (GLfloat) - 0.988176, (GLfloat) - 0.083362, (GLfloat) 0.128682,
+       (GLfloat) - 0.894461, (GLfloat) 0.441120, (GLfloat) 0.073162,
+       (GLfloat) - 0.899779, (GLfloat) 0.430861, (GLfloat) 0.068965,
+       (GLfloat) - 0.295242, (GLfloat) - 0.450841, (GLfloat) - 0.842362,
+       (GLfloat) - 0.299933, (GLfloat) - 0.431632, (GLfloat) - 0.850725,
+       (GLfloat) 0.013989, (GLfloat) - 0.247700, (GLfloat) - 0.968736,
+       (GLfloat) 0.015860, (GLfloat) - 0.266588, (GLfloat) - 0.963680,
+       (GLfloat) - 0.083295, (GLfloat) - 0.151964, (GLfloat) - 0.984870,
+       (GLfloat) - 0.083124, (GLfloat) - 0.152402, (GLfloat) - 0.984817,
+       (GLfloat) - 0.390828, (GLfloat) - 0.342108, (GLfloat) - 0.854527,
+       (GLfloat) - 0.391261, (GLfloat) - 0.341115, (GLfloat) - 0.854725,
+       (GLfloat) 0.602133, (GLfloat) 0.074603, (GLfloat) - 0.794903,
+       (GLfloat) 0.601151, (GLfloat) 0.064322, (GLfloat) - 0.796542,
+       (GLfloat) 0.503722, (GLfloat) 0.214463, (GLfloat) - 0.836821,
+       (GLfloat) 0.504737, (GLfloat) 0.210719, (GLfloat) - 0.837161,
+       (GLfloat) 0.206924, (GLfloat) 0.024347, (GLfloat) - 0.978054,
+       (GLfloat) 0.204663, (GLfloat) 0.031235, (GLfloat) - 0.978334,
+       (GLfloat) 0.305416, (GLfloat) - 0.098916, (GLfloat) - 0.947067,
+       (GLfloat) 0.305705, (GLfloat) - 0.083664, (GLfloat) - 0.948443,
+       (GLfloat) - 0.549371, (GLfloat) 0.797029, (GLfloat) - 0.250870,
+       (GLfloat) - 0.542332, (GLfloat) 0.789948, (GLfloat) - 0.286110,
+       (GLfloat) - 0.628658, (GLfloat) 0.711043, (GLfloat) - 0.314972,
+       (GLfloat) - 0.636726, (GLfloat) 0.708286, (GLfloat) - 0.304813,
+       (GLfloat) - 0.289225, (GLfloat) 0.481875, (GLfloat) - 0.827131,
+       (GLfloat) - 0.265869, (GLfloat) 0.473567, (GLfloat) - 0.839672,
+       (GLfloat) - 0.086396, (GLfloat) 0.693390, (GLfloat) - 0.715365,
+       (GLfloat) - 0.059540, (GLfloat) 0.687907, (GLfloat) - 0.723352,
+       (GLfloat) - 0.805592, (GLfloat) 0.530374, (GLfloat) - 0.264056,
+       (GLfloat) - 0.816724, (GLfloat) 0.502516, (GLfloat) - 0.283619,
+       (GLfloat) - 0.744687, (GLfloat) 0.181500, (GLfloat) - 0.642260,
+       (GLfloat) - 0.739363, (GLfloat) 0.135764, (GLfloat) - 0.659478,
+       (GLfloat) - 0.502724, (GLfloat) 0.272838, (GLfloat) - 0.820261,
+       (GLfloat) - 0.516850, (GLfloat) 0.314382, (GLfloat) - 0.796260,
+       (GLfloat) - 0.732550, (GLfloat) 0.603460, (GLfloat) - 0.314971,
+       (GLfloat) - 0.730076, (GLfloat) 0.611620, (GLfloat) - 0.304812,
+       (GLfloat) - 0.612735, (GLfloat) 0.780498, (GLfloat) 0.124010,
+       (GLfloat) - 0.620926, (GLfloat) 0.772016, (GLfloat) 0.135801,
+       (GLfloat) - 0.683860, (GLfloat) 0.721331, (GLfloat) 0.109621,
+       (GLfloat) - 0.686475, (GLfloat) 0.718049, (GLfloat) 0.114708,
+       (GLfloat) - 0.697666, (GLfloat) 0.715659, (GLfloat) 0.033080,
+       (GLfloat) - 0.695640, (GLfloat) 0.717757, (GLfloat) 0.030164,
+       (GLfloat) - 0.638159, (GLfloat) 0.768656, (GLfloat) 0.043833,
+       (GLfloat) - 0.634338, (GLfloat) 0.772038, (GLfloat) 0.039657,
+       (GLfloat) - 0.793216, (GLfloat) 0.593605, (GLfloat) 0.135802,
+       (GLfloat) - 0.801406, (GLfloat) 0.585123, (GLfloat) 0.124011,
+       (GLfloat) - 0.790459, (GLfloat) 0.610945, (GLfloat) 0.043833,
+       (GLfloat) - 0.793705, (GLfloat) 0.607008, (GLfloat) 0.039656,
+       (GLfloat) - 0.741597, (GLfloat) 0.670167, (GLfloat) 0.030164,
+       (GLfloat) - 0.739572, (GLfloat) 0.672265, (GLfloat) 0.033079,
+       (GLfloat) - 0.744759, (GLfloat) 0.658269, (GLfloat) 0.109621,
+       (GLfloat) - 0.741569, (GLfloat) 0.660997, (GLfloat) 0.114710,
+       (GLfloat) - 0.801406, (GLfloat) 0.585123, (GLfloat) - 0.124011,
+       (GLfloat) - 0.793216, (GLfloat) 0.593605, (GLfloat) - 0.135802,
+       (GLfloat) - 0.744759, (GLfloat) 0.658269, (GLfloat) - 0.109621,
+       (GLfloat) - 0.741569, (GLfloat) 0.660997, (GLfloat) - 0.114710,
+       (GLfloat) - 0.739572, (GLfloat) 0.672265, (GLfloat) - 0.033079,
+       (GLfloat) - 0.741597, (GLfloat) 0.670167, (GLfloat) - 0.030164,
+       (GLfloat) - 0.790459, (GLfloat) 0.610945, (GLfloat) - 0.043833,
+       (GLfloat) - 0.793705, (GLfloat) 0.607008, (GLfloat) - 0.039656,
+       (GLfloat) - 0.620926, (GLfloat) 0.772016, (GLfloat) - 0.135801,
+       (GLfloat) - 0.612735, (GLfloat) 0.780498, (GLfloat) - 0.124010,
+       (GLfloat) - 0.638159, (GLfloat) 0.768656, (GLfloat) - 0.043833,
+       (GLfloat) - 0.634338, (GLfloat) 0.772038, (GLfloat) - 0.039657,
+       (GLfloat) - 0.695640, (GLfloat) 0.717757, (GLfloat) - 0.030164,
+       (GLfloat) - 0.697666, (GLfloat) 0.715659, (GLfloat) - 0.033080,
+       (GLfloat) - 0.683860, (GLfloat) 0.721331, (GLfloat) - 0.109621,
+       (GLfloat) - 0.686475, (GLfloat) 0.718049, (GLfloat) - 0.114708,
+       (GLfloat) 0.864441, (GLfloat) 0.198220, (GLfloat) - 0.462008,
+       (GLfloat) 0.865832, (GLfloat) 0.204848, (GLfloat) - 0.456478,
+       (GLfloat) 0.861398, (GLfloat) 0.190399, (GLfloat) - 0.470894,
+       (GLfloat) 0.864411, (GLfloat) 0.198309, (GLfloat) - 0.462024,
+       (GLfloat) 0.959873, (GLfloat) 0.240404, (GLfloat) - 0.144397,
+       (GLfloat) 0.959903, (GLfloat) 0.238290, (GLfloat) - 0.147664,
+       (GLfloat) 0.957414, (GLfloat) 0.250909, (GLfloat) - 0.142837,
+       (GLfloat) 0.957562, (GLfloat) 0.249145, (GLfloat) - 0.144919,
+       (GLfloat) 0.850599, (GLfloat) 0.179835, (GLfloat) - 0.494106,
+       (GLfloat) 0.855506, (GLfloat) 0.187394, (GLfloat) - 0.482693,
+       (GLfloat) 0.963921, (GLfloat) 0.218904, (GLfloat) - 0.151448,
+       (GLfloat) 0.963730, (GLfloat) 0.216664, (GLfloat) - 0.155826,
+       (GLfloat) 0.961835, (GLfloat) 0.230558, (GLfloat) - 0.147363,
+       (GLfloat) 0.961732, (GLfloat) 0.228244, (GLfloat) - 0.151580,
+       (GLfloat) 0.856249, (GLfloat) 0.184340, (GLfloat) - 0.482552,
+       (GLfloat) 0.860720, (GLfloat) 0.192749, (GLfloat) - 0.471178,
+       (GLfloat) 0.850599, (GLfloat) 0.179835, (GLfloat) 0.494106,
+       (GLfloat) 0.855506, (GLfloat) 0.187394, (GLfloat) 0.482693,
+       (GLfloat) 0.860720, (GLfloat) 0.192749, (GLfloat) 0.471179,
+       (GLfloat) 0.856249, (GLfloat) 0.184340, (GLfloat) 0.482552,
+       (GLfloat) 0.961835, (GLfloat) 0.230558, (GLfloat) 0.147363,
+       (GLfloat) 0.961732, (GLfloat) 0.228244, (GLfloat) 0.151580,
+       (GLfloat) 0.963730, (GLfloat) 0.216664, (GLfloat) 0.155826,
+       (GLfloat) 0.963921, (GLfloat) 0.218904, (GLfloat) 0.151448,
+       (GLfloat) 0.865832, (GLfloat) 0.204848, (GLfloat) 0.456478,
+       (GLfloat) 0.864441, (GLfloat) 0.198220, (GLfloat) 0.462008,
+       (GLfloat) 0.957414, (GLfloat) 0.250909, (GLfloat) 0.142837,
+       (GLfloat) 0.957562, (GLfloat) 0.249144, (GLfloat) 0.144919,
+       (GLfloat) 0.959903, (GLfloat) 0.238290, (GLfloat) 0.147664,
+       (GLfloat) 0.959873, (GLfloat) 0.240404, (GLfloat) 0.144397,
+       (GLfloat) 0.861398, (GLfloat) 0.190399, (GLfloat) 0.470894,
+       (GLfloat) 0.864411, (GLfloat) 0.198309, (GLfloat) 0.462024,
+       (GLfloat) - 0.368470, (GLfloat) - 0.398468, (GLfloat) - 0.839912,
+       (GLfloat) - 0.366469, (GLfloat) - 0.378022, (GLfloat) - 0.850177,
+       (GLfloat) - 0.433076, (GLfloat) - 0.339336, (GLfloat) - 0.835043,
+       (GLfloat) - 0.426924, (GLfloat) - 0.323639, (GLfloat) - 0.844390,
+       (GLfloat) - 0.078376, (GLfloat) - 0.184951, (GLfloat) - 0.979617,
+       (GLfloat) - 0.089636, (GLfloat) - 0.204692, (GLfloat) - 0.974714,
+       (GLfloat) - 0.031836, (GLfloat) - 0.216104, (GLfloat) - 0.975851,
+       (GLfloat) - 0.037496, (GLfloat) - 0.237942, (GLfloat) - 0.970555,
+       (GLfloat) - 0.516334, (GLfloat) - 0.149595, (GLfloat) - 0.843220,
+       (GLfloat) - 0.522141, (GLfloat) - 0.155987, (GLfloat) - 0.838473,
+       (GLfloat) - 0.160863, (GLfloat) - 0.078983, (GLfloat) - 0.983811,
+       (GLfloat) - 0.162216, (GLfloat) - 0.080222, (GLfloat) - 0.983489,
+       (GLfloat) - 0.124313, (GLfloat) - 0.142798, (GLfloat) - 0.981914,
+       (GLfloat) - 0.134702, (GLfloat) - 0.155051, (GLfloat) - 0.978680,
+       (GLfloat) - 0.485511, (GLfloat) - 0.259251, (GLfloat) - 0.834906,
+       (GLfloat) - 0.481803, (GLfloat) - 0.253626, (GLfloat) - 0.838773,
+       (GLfloat) 0.539229, (GLfloat) 0.099743, (GLfloat) - 0.836232,
+       (GLfloat) 0.527244, (GLfloat) 0.088685, (GLfloat) - 0.845073,
+       (GLfloat) 0.560111, (GLfloat) 0.087128, (GLfloat) - 0.823823,
+       (GLfloat) 0.546849, (GLfloat) 0.072324, (GLfloat) - 0.834101,
+       (GLfloat) 0.201167, (GLfloat) - 0.045810, (GLfloat) - 0.978485,
+       (GLfloat) 0.215853, (GLfloat) - 0.030110, (GLfloat) - 0.975962,
+       (GLfloat) 0.175573, (GLfloat) - 0.002365, (GLfloat) - 0.984464,
+       (GLfloat) 0.184916, (GLfloat) 0.005715, (GLfloat) - 0.982738,
+       (GLfloat) 0.593439, (GLfloat) 0.077285, (GLfloat) - 0.801160,
+       (GLfloat) 0.587937, (GLfloat) 0.063575, (GLfloat) - 0.806405,
+       (GLfloat) 0.272897, (GLfloat) - 0.086428, (GLfloat) - 0.958153,
+       (GLfloat) 0.279890, (GLfloat) - 0.067483, (GLfloat) - 0.957657,
+       (GLfloat) 0.236530, (GLfloat) - 0.071307, (GLfloat) - 0.969004,
+       (GLfloat) 0.249518, (GLfloat) - 0.051953, (GLfloat) - 0.966975,
+       (GLfloat) 0.579087, (GLfloat) 0.080825, (GLfloat) - 0.811250,
+       (GLfloat) 0.568834, (GLfloat) 0.065408, (GLfloat) - 0.819847,
+       (GLfloat) - 0.366469, (GLfloat) - 0.378021, (GLfloat) 0.850177,
+       (GLfloat) - 0.368470, (GLfloat) - 0.398468, (GLfloat) 0.839912,
+       (GLfloat) - 0.031836, (GLfloat) - 0.216104, (GLfloat) 0.975851,
+       (GLfloat) - 0.037496, (GLfloat) - 0.237942, (GLfloat) 0.970555,
+       (GLfloat) - 0.089636, (GLfloat) - 0.204692, (GLfloat) 0.974714,
+       (GLfloat) - 0.078376, (GLfloat) - 0.184951, (GLfloat) 0.979617,
+       (GLfloat) - 0.433076, (GLfloat) - 0.339336, (GLfloat) 0.835043,
+       (GLfloat) - 0.426924, (GLfloat) - 0.323639, (GLfloat) 0.844389,
+       (GLfloat) 0.593439, (GLfloat) 0.077284, (GLfloat) 0.801160,
+       (GLfloat) 0.587937, (GLfloat) 0.063575, (GLfloat) 0.806405,
+       (GLfloat) 0.568834, (GLfloat) 0.065408, (GLfloat) 0.819847,
+       (GLfloat) 0.579087, (GLfloat) 0.080825, (GLfloat) 0.811249,
+       (GLfloat) 0.236530, (GLfloat) - 0.071307, (GLfloat) 0.969004,
+       (GLfloat) 0.249518, (GLfloat) - 0.051953, (GLfloat) 0.966975,
+       (GLfloat) 0.279890, (GLfloat) - 0.067483, (GLfloat) 0.957657,
+       (GLfloat) 0.272897, (GLfloat) - 0.086428, (GLfloat) 0.958153,
+       (GLfloat) 0.527244, (GLfloat) 0.088685, (GLfloat) 0.845073,
+       (GLfloat) 0.539229, (GLfloat) 0.099743, (GLfloat) 0.836232,
+       (GLfloat) 0.175573, (GLfloat) - 0.002365, (GLfloat) 0.984464,
+       (GLfloat) 0.184916, (GLfloat) 0.005715, (GLfloat) 0.982738,
+       (GLfloat) 0.215853, (GLfloat) - 0.030110, (GLfloat) 0.975962,
+       (GLfloat) 0.201167, (GLfloat) - 0.045810, (GLfloat) 0.978485,
+       (GLfloat) 0.560111, (GLfloat) 0.087128, (GLfloat) 0.823823,
+       (GLfloat) 0.546849, (GLfloat) 0.072324, (GLfloat) 0.834101,
+       (GLfloat) - 0.516334, (GLfloat) - 0.149595, (GLfloat) 0.843220,
+       (GLfloat) - 0.522141, (GLfloat) - 0.155986, (GLfloat) 0.838473,
+       (GLfloat) - 0.481803, (GLfloat) - 0.253626, (GLfloat) 0.838773,
+       (GLfloat) - 0.485511, (GLfloat) - 0.259250, (GLfloat) 0.834906,
+       (GLfloat) - 0.124313, (GLfloat) - 0.142798, (GLfloat) 0.981914,
+       (GLfloat) - 0.134702, (GLfloat) - 0.155051, (GLfloat) 0.978680,
+       (GLfloat) - 0.162216, (GLfloat) - 0.080222, (GLfloat) 0.983489,
+       (GLfloat) - 0.160863, (GLfloat) - 0.078982, (GLfloat) 0.983811,
+       (GLfloat) - 0.686861, (GLfloat) - 0.525025, (GLfloat) - 0.502564,
+       (GLfloat) - 0.684324, (GLfloat) - 0.536936, (GLfloat) - 0.493357,
+       (GLfloat) - 0.799089, (GLfloat) - 0.580700, (GLfloat) - 0.155709,
+       (GLfloat) - 0.801122, (GLfloat) - 0.576989, (GLfloat) - 0.159016,
+       (GLfloat) - 0.862913, (GLfloat) - 0.481876, (GLfloat) - 0.152238,
+       (GLfloat) - 0.863678, (GLfloat) - 0.479780, (GLfloat) - 0.154502,
+       (GLfloat) - 0.750556, (GLfloat) - 0.441554, (GLfloat) - 0.491625,
+       (GLfloat) - 0.750719, (GLfloat) - 0.448983, (GLfloat) - 0.484598,
+       (GLfloat) - 0.686861, (GLfloat) - 0.525025, (GLfloat) 0.502564,
+       (GLfloat) - 0.684324, (GLfloat) - 0.536936, (GLfloat) 0.493357,
+       (GLfloat) - 0.750719, (GLfloat) - 0.448983, (GLfloat) 0.484598,
+       (GLfloat) - 0.750556, (GLfloat) - 0.441554, (GLfloat) 0.491625,
+       (GLfloat) - 0.862913, (GLfloat) - 0.481876, (GLfloat) 0.152238,
+       (GLfloat) - 0.863678, (GLfloat) - 0.479780, (GLfloat) 0.154503,
+       (GLfloat) - 0.801122, (GLfloat) - 0.576990, (GLfloat) 0.159016,
+       (GLfloat) - 0.799089, (GLfloat) - 0.580700, (GLfloat) 0.155709,
+       (GLfloat) - 0.845506, (GLfloat) - 0.204102, (GLfloat) 0.493419,
+       (GLfloat) - 0.849139, (GLfloat) - 0.212205, (GLfloat) 0.483666,
+       (GLfloat) - 0.962881, (GLfloat) - 0.220433, (GLfloat) 0.155789,
+       (GLfloat) - 0.962834, (GLfloat) - 0.223594, (GLfloat) 0.151516,
+       (GLfloat) - 0.918492, (GLfloat) - 0.365350, (GLfloat) 0.151297,
+       (GLfloat) - 0.918584, (GLfloat) - 0.364876, (GLfloat) 0.151885,
+       (GLfloat) - 0.806201, (GLfloat) - 0.341087, (GLfloat) 0.483425,
+       (GLfloat) - 0.806184, (GLfloat) - 0.341015, (GLfloat) 0.483504,
+       (GLfloat) - 0.849139, (GLfloat) - 0.212204, (GLfloat) - 0.483666,
+       (GLfloat) - 0.845506, (GLfloat) - 0.204102, (GLfloat) - 0.493419,
+       (GLfloat) - 0.806201, (GLfloat) - 0.341087, (GLfloat) - 0.483425,
+       (GLfloat) - 0.806184, (GLfloat) - 0.341015, (GLfloat) - 0.483504,
+       (GLfloat) - 0.918584, (GLfloat) - 0.364876, (GLfloat) - 0.151885,
+       (GLfloat) - 0.918492, (GLfloat) - 0.365350, (GLfloat) - 0.151297,
+       (GLfloat) - 0.962881, (GLfloat) - 0.220433, (GLfloat) - 0.155789,
+       (GLfloat) - 0.962834, (GLfloat) - 0.223594, (GLfloat) - 0.151516,
+       (GLfloat) - 0.503594, (GLfloat) 0.204765, (GLfloat) - 0.839324,
+       (GLfloat) - 0.503594, (GLfloat) 0.204765, (GLfloat) - 0.839324,
+       (GLfloat) - 0.161047, (GLfloat) 0.200914, (GLfloat) - 0.966280,
+       (GLfloat) - 0.161047, (GLfloat) 0.200914, (GLfloat) - 0.966280,
+       (GLfloat) - 0.165393, (GLfloat) 0.154386, (GLfloat) - 0.974069,
+       (GLfloat) - 0.162365, (GLfloat) 0.156806, (GLfloat) - 0.974192,
+       (GLfloat) - 0.508257, (GLfloat) 0.155255, (GLfloat) - 0.847095,
+       (GLfloat) - 0.512203, (GLfloat) 0.151943, (GLfloat) - 0.845318,
+       (GLfloat) 0.503594, (GLfloat) 0.204765, (GLfloat) - 0.839324,
+       (GLfloat) 0.503594, (GLfloat) 0.204765, (GLfloat) - 0.839324,
+       (GLfloat) 0.506875, (GLfloat) 0.175794, (GLfloat) - 0.843904,
+       (GLfloat) 0.506455, (GLfloat) 0.176110, (GLfloat) - 0.844091,
+       (GLfloat) 0.160943, (GLfloat) 0.163176, (GLfloat) - 0.973381,
+       (GLfloat) 0.162221, (GLfloat) 0.162243, (GLfloat) - 0.973325,
+       (GLfloat) 0.161047, (GLfloat) 0.200914, (GLfloat) - 0.966280,
+       (GLfloat) 0.161047, (GLfloat) 0.200914, (GLfloat) - 0.966280,
+       (GLfloat) 0.521791, (GLfloat) 0.120579, (GLfloat) - 0.844509,
+       (GLfloat) 0.514604, (GLfloat) 0.123502, (GLfloat) - 0.848487,
+       (GLfloat) 0.164688, (GLfloat) 0.065494, (GLfloat) - 0.984169,
+       (GLfloat) 0.164274, (GLfloat) 0.065656, (GLfloat) - 0.984227,
+       (GLfloat) 0.162599, (GLfloat) 0.118143, (GLfloat) - 0.979594,
+       (GLfloat) 0.160323, (GLfloat) 0.119382, (GLfloat) - 0.979819,
+       (GLfloat) 0.509344, (GLfloat) 0.149891, (GLfloat) - 0.847409,
+       (GLfloat) 0.511715, (GLfloat) 0.148557, (GLfloat) - 0.846214,
+       (GLfloat) - 0.523595, (GLfloat) - 0.008036, (GLfloat) - 0.851929,
+       (GLfloat) - 0.537099, (GLfloat) - 0.019782, (GLfloat) - 0.843287,
+       (GLfloat) - 0.515557, (GLfloat) 0.088028, (GLfloat) - 0.852322,
+       (GLfloat) - 0.525730, (GLfloat) 0.079884, (GLfloat) - 0.846892,
+       (GLfloat) - 0.173169, (GLfloat) 0.095066, (GLfloat) - 0.980293,
+       (GLfloat) - 0.165823, (GLfloat) 0.100484, (GLfloat) - 0.981023,
+       (GLfloat) - 0.177991, (GLfloat) 0.018184, (GLfloat) - 0.983864,
+       (GLfloat) - 0.169802, (GLfloat) 0.024484, (GLfloat) - 0.985174,
+       (GLfloat) - 0.839324, (GLfloat) 0.204765, (GLfloat) - 0.503594,
+       (GLfloat) - 0.839323, (GLfloat) 0.204765, (GLfloat) - 0.503595,
+       (GLfloat) - 0.849441, (GLfloat) 0.151406, (GLfloat) - 0.505496,
+       (GLfloat) - 0.847954, (GLfloat) 0.148744, (GLfloat) - 0.508773,
+       (GLfloat) - 0.975887, (GLfloat) 0.146977, (GLfloat) - 0.161379,
+       (GLfloat) - 0.975827, (GLfloat) 0.145984, (GLfloat) - 0.162638,
+       (GLfloat) - 0.966280, (GLfloat) 0.200913, (GLfloat) - 0.161047,
+       (GLfloat) - 0.966280, (GLfloat) 0.200913, (GLfloat) - 0.161047,
+       (GLfloat) - 0.869115, (GLfloat) - 0.045798, (GLfloat) - 0.492485,
+       (GLfloat) - 0.862005, (GLfloat) - 0.035136, (GLfloat) - 0.505681,
+       (GLfloat) - 0.985988, (GLfloat) - 0.044696, (GLfloat) - 0.160715,
+       (GLfloat) - 0.986683, (GLfloat) - 0.048596, (GLfloat) - 0.155223,
+       (GLfloat) - 0.984333, (GLfloat) 0.067324, (GLfloat) - 0.162959,
+       (GLfloat) - 0.984743, (GLfloat) 0.069793, (GLfloat) - 0.159404,
+       (GLfloat) - 0.856976, (GLfloat) 0.069431, (GLfloat) - 0.510658,
+       (GLfloat) - 0.861737, (GLfloat) 0.075800, (GLfloat) - 0.501660,
+       (GLfloat) - 0.869115, (GLfloat) - 0.045798, (GLfloat) 0.492485,
+       (GLfloat) - 0.862005, (GLfloat) - 0.035136, (GLfloat) 0.505681,
+       (GLfloat) - 0.856976, (GLfloat) 0.069431, (GLfloat) 0.510659,
+       (GLfloat) - 0.861738, (GLfloat) 0.075800, (GLfloat) 0.501660,
+       (GLfloat) - 0.984743, (GLfloat) 0.069793, (GLfloat) 0.159404,
+       (GLfloat) - 0.984333, (GLfloat) 0.067324, (GLfloat) 0.162959,
+       (GLfloat) - 0.986683, (GLfloat) - 0.048596, (GLfloat) 0.155223,
+       (GLfloat) - 0.985988, (GLfloat) - 0.044696, (GLfloat) 0.160715,
+       (GLfloat) - 0.839324, (GLfloat) 0.204766, (GLfloat) 0.503594,
+       (GLfloat) - 0.839323, (GLfloat) 0.204765, (GLfloat) 0.503595,
+       (GLfloat) - 0.966280, (GLfloat) 0.200913, (GLfloat) 0.161047,
+       (GLfloat) - 0.966280, (GLfloat) 0.200913, (GLfloat) 0.161047,
+       (GLfloat) - 0.975887, (GLfloat) 0.146977, (GLfloat) 0.161379,
+       (GLfloat) - 0.975827, (GLfloat) 0.145984, (GLfloat) 0.162638,
+       (GLfloat) - 0.847954, (GLfloat) 0.148744, (GLfloat) 0.508773,
+       (GLfloat) - 0.849441, (GLfloat) 0.151406, (GLfloat) 0.505496,
+       (GLfloat) - 0.503594, (GLfloat) 0.204766, (GLfloat) 0.839324,
+       (GLfloat) - 0.503595, (GLfloat) 0.204765, (GLfloat) 0.839323,
+       (GLfloat) - 0.512203, (GLfloat) 0.151943, (GLfloat) 0.845318,
+       (GLfloat) - 0.508258, (GLfloat) 0.155255, (GLfloat) 0.847095,
+       (GLfloat) - 0.165393, (GLfloat) 0.154386, (GLfloat) 0.974069,
+       (GLfloat) - 0.162365, (GLfloat) 0.156806, (GLfloat) 0.974192,
+       (GLfloat) - 0.161047, (GLfloat) 0.200914, (GLfloat) 0.966280,
+       (GLfloat) - 0.161047, (GLfloat) 0.200914, (GLfloat) 0.966280,
+       (GLfloat) - 0.537099, (GLfloat) - 0.019782, (GLfloat) 0.843287,
+       (GLfloat) - 0.523595, (GLfloat) - 0.008036, (GLfloat) 0.851930,
+       (GLfloat) - 0.177991, (GLfloat) 0.018183, (GLfloat) 0.983864,
+       (GLfloat) - 0.169802, (GLfloat) 0.024484, (GLfloat) 0.985174,
+       (GLfloat) - 0.165823, (GLfloat) 0.100484, (GLfloat) 0.981023,
+       (GLfloat) - 0.173169, (GLfloat) 0.095066, (GLfloat) 0.980293,
+       (GLfloat) - 0.515557, (GLfloat) 0.088028, (GLfloat) 0.852322,
+       (GLfloat) - 0.525730, (GLfloat) 0.079884, (GLfloat) 0.846892,
+       (GLfloat) 0.514604, (GLfloat) 0.123503, (GLfloat) 0.848487,
+       (GLfloat) 0.521791, (GLfloat) 0.120579, (GLfloat) 0.844509,
+       (GLfloat) 0.509344, (GLfloat) 0.149891, (GLfloat) 0.847409,
+       (GLfloat) 0.511715, (GLfloat) 0.148557, (GLfloat) 0.846214,
+       (GLfloat) 0.160323, (GLfloat) 0.119382, (GLfloat) 0.979819,
+       (GLfloat) 0.162599, (GLfloat) 0.118143, (GLfloat) 0.979594,
+       (GLfloat) 0.164688, (GLfloat) 0.065494, (GLfloat) 0.984169,
+       (GLfloat) 0.164275, (GLfloat) 0.065655, (GLfloat) 0.984227,
+       (GLfloat) 0.503594, (GLfloat) 0.204766, (GLfloat) 0.839324,
+       (GLfloat) 0.503595, (GLfloat) 0.204765, (GLfloat) 0.839323,
+       (GLfloat) 0.161047, (GLfloat) 0.200914, (GLfloat) 0.966280,
+       (GLfloat) 0.161047, (GLfloat) 0.200914, (GLfloat) 0.966280,
+       (GLfloat) 0.160943, (GLfloat) 0.163176, (GLfloat) 0.973381,
+       (GLfloat) 0.162221, (GLfloat) 0.162243, (GLfloat) 0.973325,
+       (GLfloat) 0.506455, (GLfloat) 0.176110, (GLfloat) 0.844090,
+       (GLfloat) 0.506875, (GLfloat) 0.175794, (GLfloat) 0.843904,
+       (GLfloat) 0.839324, (GLfloat) 0.204766, (GLfloat) 0.503594,
+       (GLfloat) 0.839323, (GLfloat) 0.204765, (GLfloat) 0.503595,
+       (GLfloat) 0.842767, (GLfloat) 0.188271, (GLfloat) 0.504280,
+       (GLfloat) 0.842301, (GLfloat) 0.187401, (GLfloat) 0.505381,
+       (GLfloat) 0.968491, (GLfloat) 0.190085, (GLfloat) 0.160914,
+       (GLfloat) 0.968481, (GLfloat) 0.189712, (GLfloat) 0.161414,
+       (GLfloat) 0.966280, (GLfloat) 0.200913, (GLfloat) 0.161047,
+       (GLfloat) 0.966280, (GLfloat) 0.200913, (GLfloat) 0.161047,
+       (GLfloat) 0.850151, (GLfloat) 0.182077, (GLfloat) 0.494055,
+       (GLfloat) 0.846712, (GLfloat) 0.177186, (GLfloat) 0.501681,
+       (GLfloat) 0.966795, (GLfloat) 0.202453, (GLfloat) 0.155950,
+       (GLfloat) 0.966634, (GLfloat) 0.200782, (GLfloat) 0.159079,
+       (GLfloat) 0.968271, (GLfloat) 0.191230, (GLfloat) 0.160881,
+       (GLfloat) 0.968343, (GLfloat) 0.192206, (GLfloat) 0.159274,
+       (GLfloat) 0.844217, (GLfloat) 0.179436, (GLfloat) 0.505074,
+       (GLfloat) 0.845886, (GLfloat) 0.181962, (GLfloat) 0.501364,
+       (GLfloat) 0.846712, (GLfloat) 0.177186, (GLfloat) - 0.501682,
+       (GLfloat) 0.850151, (GLfloat) 0.182077, (GLfloat) - 0.494055,
+       (GLfloat) 0.844217, (GLfloat) 0.179436, (GLfloat) - 0.505074,
+       (GLfloat) 0.845886, (GLfloat) 0.181962, (GLfloat) - 0.501365,
+       (GLfloat) 0.968343, (GLfloat) 0.192206, (GLfloat) - 0.159274,
+       (GLfloat) 0.968271, (GLfloat) 0.191230, (GLfloat) - 0.160881,
+       (GLfloat) 0.966795, (GLfloat) 0.202453, (GLfloat) - 0.155950,
+       (GLfloat) 0.966634, (GLfloat) 0.200782, (GLfloat) - 0.159079,
+       (GLfloat) 0.839324, (GLfloat) 0.204765, (GLfloat) - 0.503594,
+       (GLfloat) 0.839323, (GLfloat) 0.204765, (GLfloat) - 0.503595,
+       (GLfloat) 0.966280, (GLfloat) 0.200913, (GLfloat) - 0.161047,
+       (GLfloat) 0.966280, (GLfloat) 0.200913, (GLfloat) - 0.161047,
+       (GLfloat) 0.968491, (GLfloat) 0.190085, (GLfloat) - 0.160914,
+       (GLfloat) 0.968481, (GLfloat) 0.189713, (GLfloat) - 0.161414,
+       (GLfloat) 0.842301, (GLfloat) 0.187401, (GLfloat) - 0.505381,
+       (GLfloat) 0.842767, (GLfloat) 0.188271, (GLfloat) - 0.504280,
+       (GLfloat) 0.831768, (GLfloat) 0.243104, (GLfloat) 0.499061,
+       (GLfloat) 0.831768, (GLfloat) 0.243103, (GLfloat) 0.499062,
+       (GLfloat) 0.957902, (GLfloat) 0.238609, (GLfloat) 0.159651,
+       (GLfloat) 0.957902, (GLfloat) 0.238611, (GLfloat) 0.159650,
+       (GLfloat) 0.982539, (GLfloat) 0.084307, (GLfloat) 0.165861,
+       (GLfloat) 0.982460, (GLfloat) 0.089222, (GLfloat) 0.163743,
+       (GLfloat) 0.853634, (GLfloat) 0.079021, (GLfloat) 0.514845,
+       (GLfloat) 0.854444, (GLfloat) 0.084251, (GLfloat) 0.512667,
+       (GLfloat) 0.831768, (GLfloat) 0.243103, (GLfloat) - 0.499062,
+       (GLfloat) 0.831768, (GLfloat) 0.243104, (GLfloat) - 0.499061,
+       (GLfloat) 0.853634, (GLfloat) 0.079020, (GLfloat) - 0.514845,
+       (GLfloat) 0.854444, (GLfloat) 0.084251, (GLfloat) - 0.512667,
+       (GLfloat) 0.982460, (GLfloat) 0.089222, (GLfloat) - 0.163743,
+       (GLfloat) 0.982539, (GLfloat) 0.084307, (GLfloat) - 0.165861,
+       (GLfloat) 0.957902, (GLfloat) 0.238609, (GLfloat) - 0.159651,
+       (GLfloat) 0.957902, (GLfloat) 0.238611, (GLfloat) - 0.159650,
+       (GLfloat) 0.283620, (GLfloat) - 0.936578, (GLfloat) - 0.205866,
+       (GLfloat) 0.264056, (GLfloat) - 0.947923, (GLfloat) - 0.178092,
+       (GLfloat) 0.315105, (GLfloat) - 0.946548, (GLfloat) - 0.068965,
+       (GLfloat) 0.304029, (GLfloat) - 0.949849, (GLfloat) - 0.073163,
+       (GLfloat) 0.811943, (GLfloat) - 0.566920, (GLfloat) - 0.139104,
+       (GLfloat) 0.830641, (GLfloat) - 0.534923, (GLfloat) - 0.154571,
+       (GLfloat) 0.677706, (GLfloat) - 0.609532, (GLfloat) - 0.411322,
+       (GLfloat) 0.690948, (GLfloat) - 0.577758, (GLfloat) - 0.434496,
+       (GLfloat) 0.264055, (GLfloat) - 0.947923, (GLfloat) 0.178092,
+       (GLfloat) 0.283620, (GLfloat) - 0.936578, (GLfloat) 0.205866,
+       (GLfloat) 0.677707, (GLfloat) - 0.609531, (GLfloat) 0.411322,
+       (GLfloat) 0.690948, (GLfloat) - 0.577758, (GLfloat) 0.434496,
+       (GLfloat) 0.830641, (GLfloat) - 0.534923, (GLfloat) 0.154571,
+       (GLfloat) 0.811943, (GLfloat) - 0.566920, (GLfloat) 0.139104,
+       (GLfloat) 0.304029, (GLfloat) - 0.949849, (GLfloat) 0.073163,
+       (GLfloat) 0.315105, (GLfloat) - 0.946548, (GLfloat) 0.068965,
+       (GLfloat) 0.499061, (GLfloat) 0.243103, (GLfloat) - 0.831768,
+       (GLfloat) 0.499061, (GLfloat) 0.243104, (GLfloat) - 0.831768,
+       (GLfloat) 0.159650, (GLfloat) 0.238610, (GLfloat) - 0.957902,
+       (GLfloat) 0.159651, (GLfloat) 0.238610, (GLfloat) - 0.957902,
+       (GLfloat) 0.165862, (GLfloat) 0.084307, (GLfloat) - 0.982539,
+       (GLfloat) 0.163744, (GLfloat) 0.089222, (GLfloat) - 0.982460,
+       (GLfloat) 0.514845, (GLfloat) 0.079019, (GLfloat) - 0.853634,
+       (GLfloat) 0.512666, (GLfloat) 0.084251, (GLfloat) - 0.854444,
+       (GLfloat) - 0.499061, (GLfloat) 0.243104, (GLfloat) - 0.831768,
+       (GLfloat) - 0.499061, (GLfloat) 0.243103, (GLfloat) - 0.831768,
+       (GLfloat) - 0.514845, (GLfloat) 0.079019, (GLfloat) - 0.853634,
+       (GLfloat) - 0.512666, (GLfloat) 0.084251, (GLfloat) - 0.854444,
+       (GLfloat) - 0.163744, (GLfloat) 0.089222, (GLfloat) - 0.982460,
+       (GLfloat) - 0.165862, (GLfloat) 0.084307, (GLfloat) - 0.982539,
+       (GLfloat) - 0.159650, (GLfloat) 0.238610, (GLfloat) - 0.957902,
+       (GLfloat) - 0.159651, (GLfloat) 0.238610, (GLfloat) - 0.957902,
+       (GLfloat) - 0.205866, (GLfloat) - 0.936578, (GLfloat) - 0.283621,
+       (GLfloat) - 0.178092, (GLfloat) - 0.947923, (GLfloat) - 0.264056,
+       (GLfloat) - 0.068965, (GLfloat) - 0.946548, (GLfloat) - 0.315105,
+       (GLfloat) - 0.073162, (GLfloat) - 0.949849, (GLfloat) - 0.304029,
+       (GLfloat) - 0.139105, (GLfloat) - 0.566920, (GLfloat) - 0.811943,
+       (GLfloat) - 0.154572, (GLfloat) - 0.534923, (GLfloat) - 0.830641,
+       (GLfloat) - 0.411321, (GLfloat) - 0.609532, (GLfloat) - 0.677706,
+       (GLfloat) - 0.434496, (GLfloat) - 0.577758, (GLfloat) - 0.690948,
+       (GLfloat) 0.178092, (GLfloat) - 0.947923, (GLfloat) - 0.264056,
+       (GLfloat) 0.205866, (GLfloat) - 0.936578, (GLfloat) - 0.283621,
+       (GLfloat) 0.411321, (GLfloat) - 0.609532, (GLfloat) - 0.677706,
+       (GLfloat) 0.434496, (GLfloat) - 0.577758, (GLfloat) - 0.690948,
+       (GLfloat) 0.154572, (GLfloat) - 0.534923, (GLfloat) - 0.830641,
+       (GLfloat) 0.139105, (GLfloat) - 0.566920, (GLfloat) - 0.811943,
+       (GLfloat) 0.073162, (GLfloat) - 0.949849, (GLfloat) - 0.304029,
+       (GLfloat) 0.068965, (GLfloat) - 0.946548, (GLfloat) - 0.315105,
+       (GLfloat) - 0.831768, (GLfloat) 0.243104, (GLfloat) - 0.499061,
+       (GLfloat) - 0.831768, (GLfloat) 0.243103, (GLfloat) - 0.499062,
+       (GLfloat) - 0.957902, (GLfloat) 0.238609, (GLfloat) - 0.159651,
+       (GLfloat) - 0.957902, (GLfloat) 0.238611, (GLfloat) - 0.159650,
+       (GLfloat) - 0.982539, (GLfloat) 0.084307, (GLfloat) - 0.165861,
+       (GLfloat) - 0.982460, (GLfloat) 0.089222, (GLfloat) - 0.163743,
+       (GLfloat) - 0.853634, (GLfloat) 0.079020, (GLfloat) - 0.514845,
+       (GLfloat) - 0.854444, (GLfloat) 0.084251, (GLfloat) - 0.512667,
+       (GLfloat) - 0.831768, (GLfloat) 0.243103, (GLfloat) 0.499062,
+       (GLfloat) - 0.831768, (GLfloat) 0.243104, (GLfloat) 0.499061,
+       (GLfloat) - 0.853634, (GLfloat) 0.079021, (GLfloat) 0.514845,
+       (GLfloat) - 0.854444, (GLfloat) 0.084251, (GLfloat) 0.512667,
+       (GLfloat) - 0.982460, (GLfloat) 0.089222, (GLfloat) 0.163743,
+       (GLfloat) - 0.982539, (GLfloat) 0.084307, (GLfloat) 0.165861,
+       (GLfloat) - 0.957902, (GLfloat) 0.238609, (GLfloat) 0.159651,
+       (GLfloat) - 0.957902, (GLfloat) 0.238611, (GLfloat) 0.159650,
+       (GLfloat) - 0.283620, (GLfloat) - 0.936578, (GLfloat) 0.205866,
+       (GLfloat) - 0.264055, (GLfloat) - 0.947923, (GLfloat) 0.178092,
+       (GLfloat) - 0.315105, (GLfloat) - 0.946548, (GLfloat) 0.068965,
+       (GLfloat) - 0.304029, (GLfloat) - 0.949849, (GLfloat) 0.073163,
+       (GLfloat) - 0.811943, (GLfloat) - 0.566920, (GLfloat) 0.139104,
+       (GLfloat) - 0.830641, (GLfloat) - 0.534923, (GLfloat) 0.154571,
+       (GLfloat) - 0.677707, (GLfloat) - 0.609531, (GLfloat) 0.411322,
+       (GLfloat) - 0.690948, (GLfloat) - 0.577758, (GLfloat) 0.434496,
+       (GLfloat) - 0.264056, (GLfloat) - 0.947923, (GLfloat) - 0.178092,
+       (GLfloat) - 0.283620, (GLfloat) - 0.936578, (GLfloat) - 0.205866,
+       (GLfloat) - 0.677706, (GLfloat) - 0.609532, (GLfloat) - 0.411322,
+       (GLfloat) - 0.690948, (GLfloat) - 0.577758, (GLfloat) - 0.434496,
+       (GLfloat) - 0.830641, (GLfloat) - 0.534923, (GLfloat) - 0.154571,
+       (GLfloat) - 0.811943, (GLfloat) - 0.566920, (GLfloat) - 0.139104,
+       (GLfloat) - 0.304029, (GLfloat) - 0.949849, (GLfloat) - 0.073163,
+       (GLfloat) - 0.315105, (GLfloat) - 0.946548, (GLfloat) - 0.068965,
+       (GLfloat) - 0.499061, (GLfloat) 0.243104, (GLfloat) 0.831769,
+       (GLfloat) - 0.499061, (GLfloat) 0.243103, (GLfloat) 0.831768,
+       (GLfloat) - 0.159650, (GLfloat) 0.238610, (GLfloat) 0.957902,
+       (GLfloat) - 0.159651, (GLfloat) 0.238610, (GLfloat) 0.957902,
+       (GLfloat) - 0.165862, (GLfloat) 0.084307, (GLfloat) 0.982539,
+       (GLfloat) - 0.163744, (GLfloat) 0.089222, (GLfloat) 0.982460,
+       (GLfloat) - 0.514844, (GLfloat) 0.079021, (GLfloat) 0.853634,
+       (GLfloat) - 0.512667, (GLfloat) 0.084251, (GLfloat) 0.854444,
+       (GLfloat) 0.499061, (GLfloat) 0.243103, (GLfloat) 0.831768,
+       (GLfloat) 0.499061, (GLfloat) 0.243104, (GLfloat) 0.831769,
+       (GLfloat) 0.514844, (GLfloat) 0.079021, (GLfloat) 0.853634,
+       (GLfloat) 0.512667, (GLfloat) 0.084251, (GLfloat) 0.854444,
+       (GLfloat) 0.163744, (GLfloat) 0.089222, (GLfloat) 0.982460,
+       (GLfloat) 0.165862, (GLfloat) 0.084307, (GLfloat) 0.982539,
+       (GLfloat) 0.159650, (GLfloat) 0.238610, (GLfloat) 0.957902,
+       (GLfloat) 0.159651, (GLfloat) 0.238610, (GLfloat) 0.957902,
+       (GLfloat) 0.205866, (GLfloat) - 0.936578, (GLfloat) 0.283621,
+       (GLfloat) 0.178092, (GLfloat) - 0.947923, (GLfloat) 0.264055,
+       (GLfloat) 0.068965, (GLfloat) - 0.946548, (GLfloat) 0.315105,
+       (GLfloat) 0.073162, (GLfloat) - 0.949849, (GLfloat) 0.304029,
+       (GLfloat) 0.139105, (GLfloat) - 0.566920, (GLfloat) 0.811943,
+       (GLfloat) 0.154572, (GLfloat) - 0.534923, (GLfloat) 0.830641,
+       (GLfloat) 0.411321, (GLfloat) - 0.609531, (GLfloat) 0.677707,
+       (GLfloat) 0.434496, (GLfloat) - 0.577757, (GLfloat) 0.690948,
+       (GLfloat) - 0.178092, (GLfloat) - 0.947923, (GLfloat) 0.264055,
+       (GLfloat) - 0.205866, (GLfloat) - 0.936578, (GLfloat) 0.283621,
+       (GLfloat) - 0.411321, (GLfloat) - 0.609531, (GLfloat) 0.677707,
+       (GLfloat) - 0.434496, (GLfloat) - 0.577757, (GLfloat) 0.690948,
+       (GLfloat) - 0.154572, (GLfloat) - 0.534923, (GLfloat) 0.830641,
+       (GLfloat) - 0.139105, (GLfloat) - 0.566920, (GLfloat) 0.811943,
+       (GLfloat) - 0.073162, (GLfloat) - 0.949849, (GLfloat) 0.304029,
+       (GLfloat) - 0.068965, (GLfloat) - 0.946548, (GLfloat) 0.315105,
+       (GLfloat) 0.135802, (GLfloat) - 0.982944, (GLfloat) - 0.124011,
+       (GLfloat) 0.124011, (GLfloat) - 0.982944, (GLfloat) - 0.135802,
+       (GLfloat) 0.043834, (GLfloat) - 0.993006, (GLfloat) - 0.109621,
+       (GLfloat) 0.039656, (GLfloat) - 0.992607, (GLfloat) - 0.114709,
+       (GLfloat) 0.030163, (GLfloat) - 0.998998, (GLfloat) - 0.033079,
+       (GLfloat) 0.033079, (GLfloat) - 0.998998, (GLfloat) - 0.030163,
+       (GLfloat) 0.109621, (GLfloat) - 0.993006, (GLfloat) - 0.043834,
+       (GLfloat) 0.114709, (GLfloat) - 0.992607, (GLfloat) - 0.039656,
+       (GLfloat) - 0.124011, (GLfloat) - 0.982944, (GLfloat) - 0.135802,
+       (GLfloat) - 0.135802, (GLfloat) - 0.982944, (GLfloat) - 0.124011,
+       (GLfloat) - 0.109621, (GLfloat) - 0.993006, (GLfloat) - 0.043834,
+       (GLfloat) - 0.114709, (GLfloat) - 0.992607, (GLfloat) - 0.039656,
+       (GLfloat) - 0.033079, (GLfloat) - 0.998998, (GLfloat) - 0.030163,
+       (GLfloat) - 0.030163, (GLfloat) - 0.998998, (GLfloat) - 0.033079,
+       (GLfloat) - 0.043834, (GLfloat) - 0.993006, (GLfloat) - 0.109621,
+       (GLfloat) - 0.039656, (GLfloat) - 0.992607, (GLfloat) - 0.114709,
+       (GLfloat) - 0.135803, (GLfloat) - 0.982944, (GLfloat) 0.124011,
+       (GLfloat) - 0.124011, (GLfloat) - 0.982944, (GLfloat) 0.135802,
+       (GLfloat) - 0.043834, (GLfloat) - 0.993006, (GLfloat) 0.109621,
+       (GLfloat) - 0.039656, (GLfloat) - 0.992607, (GLfloat) 0.114709,
+       (GLfloat) - 0.030163, (GLfloat) - 0.998998, (GLfloat) 0.033079,
+       (GLfloat) - 0.033079, (GLfloat) - 0.998998, (GLfloat) 0.030163,
+       (GLfloat) - 0.109621, (GLfloat) - 0.993006, (GLfloat) 0.043834,
+       (GLfloat) - 0.114709, (GLfloat) - 0.992607, (GLfloat) 0.039656,
+       (GLfloat) 0.124011, (GLfloat) - 0.982944, (GLfloat) 0.135802,
+       (GLfloat) 0.135803, (GLfloat) - 0.982944, (GLfloat) 0.124011,
+       (GLfloat) 0.109621, (GLfloat) - 0.993006, (GLfloat) 0.043834,
+       (GLfloat) 0.114709, (GLfloat) - 0.992607, (GLfloat) 0.039656,
+       (GLfloat) 0.033079, (GLfloat) - 0.998998, (GLfloat) 0.030163,
+       (GLfloat) 0.030163, (GLfloat) - 0.998998, (GLfloat) 0.033079,
+       (GLfloat) 0.043834, (GLfloat) - 0.993006, (GLfloat) 0.109621,
+       (GLfloat) 0.039656, (GLfloat) - 0.992607, (GLfloat) 0.114709,
+};
+
+static unsigned short int s1_6_POLS[] =
+{
+      3, 82, 12, 76, 1, 3, 76, 74, 82, 1, 3, 22, 78, 74, 1, 3, 22, 74, 76, 1,
+      3, 78, 20, 80, 1, 3, 80, 74, 78, 1, 3, 28, 82, 74, 1, 3, 28, 74, 80, 1,
+      3, 88, 13, 84, 1, 3, 84, 77, 88, 1, 3, 24, 86, 77, 1, 3, 24, 77, 84, 1,
+      3, 86, 20, 78, 1, 3, 78, 77, 86, 1, 3, 22, 88, 77, 1, 3, 22, 77, 78, 1,
+      3, 14, 90, 85, 1, 3, 14, 85, 93, 1, 3, 26, 91, 85, 1, 3, 26, 85, 90, 1,
+      3, 20, 86, 85, 1, 3, 20, 85, 91, 1, 3, 86, 24, 93, 1, 3, 93, 85, 86, 1,
+      3, 15, 95, 79, 1, 3, 15, 79, 97, 1, 3, 95, 28, 80, 1, 3, 80, 79, 95, 1,
+      3, 20, 91, 79, 1, 3, 20, 79, 80, 1, 3, 26, 97, 79, 1, 3, 26, 79, 91, 1,
+    3, 13, 99, 83, 1, 3, 13, 83, 84, 1, 3, 99, 30, 101, 1, 3, 101, 83, 99, 1,
+  3, 23, 102, 83, 1, 3, 23, 83, 101, 1, 3, 102, 24, 84, 1, 3, 84, 83, 102, 1,
+       3, 108, 16, 104, 1, 3, 104, 100, 108, 1, 3, 32, 106, 100, 1, 3, 32, 100, 104, 1,
+       3, 106, 23, 101, 1, 3, 101, 100, 106, 1, 3, 30, 108, 100, 1, 3, 30, 100, 101, 1,
+       3, 17, 110, 105, 1, 3, 17, 105, 113, 1, 3, 110, 33, 111, 1, 3, 111, 105, 110, 1,
+       3, 23, 106, 105, 1, 3, 23, 105, 111, 1, 3, 106, 32, 113, 1, 3, 113, 105, 106, 1,
+  3, 114, 14, 93, 1, 3, 93, 92, 114, 1, 3, 93, 24, 102, 1, 3, 102, 92, 93, 1,
+3, 23, 111, 92, 1, 3, 23, 92, 102, 1, 3, 111, 33, 114, 1, 3, 114, 92, 111, 1,
+       3, 16, 116, 103, 1, 3, 16, 103, 104, 1, 3, 116, 35, 118, 1, 3, 118, 103, 116, 1,
+       3, 31, 119, 103, 1, 3, 31, 103, 118, 1, 3, 119, 32, 104, 1, 3, 104, 103, 119, 1,
+       3, 18, 121, 117, 1, 3, 18, 117, 125, 1, 3, 121, 36, 123, 1, 3, 123, 117, 121, 1,
+       3, 31, 118, 117, 1, 3, 31, 117, 123, 1, 3, 118, 35, 125, 1, 3, 125, 117, 118, 1,
+       3, 19, 127, 122, 1, 3, 19, 122, 130, 1, 3, 37, 128, 122, 1, 3, 37, 122, 127, 1,
+       3, 31, 123, 122, 1, 3, 31, 122, 128, 1, 3, 36, 130, 122, 1, 3, 36, 122, 123, 1,
+       3, 17, 113, 112, 1, 3, 17, 112, 131, 1, 3, 32, 119, 112, 1, 3, 32, 112, 113, 1,
+       3, 31, 128, 112, 1, 3, 31, 112, 119, 1, 3, 37, 131, 112, 1, 3, 37, 112, 128, 1,
+       3, 121, 18, 133, 1, 3, 133, 120, 121, 1, 3, 39, 134, 120, 1, 3, 39, 120, 133, 1,
+       3, 134, 27, 135, 1, 3, 135, 120, 134, 1, 3, 36, 121, 120, 1, 3, 36, 120, 135, 1,
+   3, 12, 82, 81, 1, 3, 12, 81, 138, 1, 3, 82, 28, 136, 1, 3, 136, 81, 82, 1,
+3, 27, 134, 81, 1, 3, 27, 81, 136, 1, 3, 134, 39, 138, 1, 3, 138, 81, 134, 1,
+3, 95, 15, 139, 1, 3, 139, 94, 95, 1, 3, 139, 40, 140, 1, 3, 140, 94, 139, 1,
+  3, 27, 136, 94, 1, 3, 27, 94, 140, 1, 3, 136, 28, 95, 1, 3, 95, 94, 136, 1,
+       3, 19, 130, 129, 1, 3, 19, 129, 141, 1, 3, 130, 36, 135, 1, 3, 135, 129, 130, 1,
+       3, 27, 140, 129, 1, 3, 27, 129, 135, 1, 3, 140, 40, 141, 1, 3, 141, 129, 140, 1,
+ 3, 14, 114, 89, 1, 3, 14, 89, 90, 1, 3, 114, 33, 142, 1, 3, 142, 89, 114, 1,
+  3, 25, 143, 89, 1, 3, 25, 89, 142, 1, 3, 143, 26, 90, 1, 3, 90, 89, 143, 1,
+       3, 17, 131, 109, 1, 3, 17, 109, 110, 1, 3, 131, 37, 144, 1, 3, 144, 109, 131, 1,
+       3, 25, 142, 109, 1, 3, 25, 109, 144, 1, 3, 142, 33, 110, 1, 3, 110, 109, 142, 1,
+       3, 19, 141, 126, 1, 3, 19, 126, 127, 1, 3, 141, 40, 145, 1, 3, 145, 126, 141, 1,
+       3, 25, 144, 126, 1, 3, 25, 126, 145, 1, 3, 144, 37, 127, 1, 3, 127, 126, 144, 1,
+   3, 15, 97, 96, 1, 3, 15, 96, 139, 1, 3, 97, 26, 143, 1, 3, 143, 96, 97, 1,
+3, 25, 145, 96, 1, 3, 25, 96, 143, 1, 3, 145, 40, 139, 1, 3, 139, 96, 145, 1,
+ 3, 12, 146, 75, 1, 3, 12, 75, 76, 1, 3, 146, 41, 148, 1, 3, 148, 75, 146, 1,
+  3, 21, 149, 75, 1, 3, 21, 75, 148, 1, 3, 149, 22, 76, 1, 3, 76, 75, 149, 1,
+       3, 155, 8, 151, 1, 3, 151, 147, 155, 1, 3, 43, 153, 147, 1, 3, 43, 147, 151, 1,
+       3, 153, 21, 148, 1, 3, 148, 147, 153, 1, 3, 41, 155, 147, 1, 3, 41, 147, 148, 1,
+       3, 160, 11, 157, 1, 3, 157, 152, 160, 1, 3, 44, 158, 152, 1, 3, 44, 152, 157, 1,
+       3, 158, 21, 153, 1, 3, 153, 152, 158, 1, 3, 43, 160, 152, 1, 3, 43, 152, 153, 1,
+   3, 13, 88, 87, 1, 3, 13, 87, 161, 1, 3, 88, 22, 149, 1, 3, 149, 87, 88, 1,
+3, 21, 158, 87, 1, 3, 21, 87, 149, 1, 3, 158, 44, 161, 1, 3, 161, 87, 158, 1,
+       3, 18, 162, 132, 1, 3, 18, 132, 133, 1, 3, 162, 45, 164, 1, 3, 164, 132, 162, 1,
+       3, 38, 165, 132, 1, 3, 38, 132, 164, 1, 3, 165, 39, 133, 1, 3, 133, 132, 165, 1,
+       3, 170, 9, 167, 1, 3, 167, 163, 170, 1, 3, 47, 168, 163, 1, 3, 47, 163, 167, 1,
+       3, 168, 38, 164, 1, 3, 164, 163, 168, 1, 3, 45, 170, 163, 1, 3, 45, 163, 164, 1,
+3, 8, 155, 154, 1, 3, 8, 154, 173, 1, 3, 155, 41, 171, 1, 3, 171, 154, 155, 1,
+       3, 38, 168, 154, 1, 3, 38, 154, 171, 1, 3, 168, 47, 173, 1, 3, 173, 154, 168, 1,
+       3, 146, 12, 138, 1, 3, 138, 137, 146, 1, 3, 39, 165, 137, 1, 3, 39, 137, 138, 1,
+       3, 165, 38, 171, 1, 3, 171, 137, 165, 1, 3, 41, 146, 137, 1, 3, 41, 137, 171, 1,
+       3, 16, 108, 107, 1, 3, 16, 107, 177, 1, 3, 108, 30, 174, 1, 3, 174, 107, 108, 1,
+       3, 29, 176, 107, 1, 3, 29, 107, 174, 1, 3, 176, 50, 177, 1, 3, 177, 107, 176, 1,
+  3, 99, 13, 161, 1, 3, 161, 98, 99, 1, 3, 44, 178, 98, 1, 3, 44, 98, 161, 1,
+ 3, 178, 29, 174, 1, 3, 174, 98, 178, 1, 3, 30, 99, 98, 1, 3, 30, 98, 174, 1,
+       3, 11, 180, 156, 1, 3, 11, 156, 157, 1, 3, 180, 49, 181, 1, 3, 181, 156, 180, 1,
+       3, 29, 178, 156, 1, 3, 29, 156, 181, 1, 3, 178, 44, 157, 1, 3, 157, 156, 178, 1,
+       3, 185, 10, 183, 1, 3, 183, 175, 185, 1, 3, 50, 176, 175, 1, 3, 50, 175, 183, 1,
+       3, 176, 29, 181, 1, 3, 181, 175, 176, 1, 3, 49, 185, 175, 1, 3, 49, 175, 181, 1,
+       3, 162, 18, 125, 1, 3, 125, 124, 162, 1, 3, 35, 186, 124, 1, 3, 35, 124, 125, 1,
+       3, 186, 34, 187, 1, 3, 187, 124, 186, 1, 3, 45, 162, 124, 1, 3, 45, 124, 187, 1,
+       3, 116, 16, 177, 1, 3, 177, 115, 116, 1, 3, 50, 188, 115, 1, 3, 50, 115, 177, 1,
+       3, 188, 34, 186, 1, 3, 186, 115, 188, 1, 3, 35, 116, 115, 1, 3, 35, 115, 186, 1,
+       3, 10, 190, 182, 1, 3, 10, 182, 183, 1, 3, 190, 52, 191, 1, 3, 191, 182, 190, 1,
+       3, 34, 188, 182, 1, 3, 34, 182, 191, 1, 3, 188, 50, 183, 1, 3, 183, 182, 188, 1,
+3, 9, 170, 169, 1, 3, 9, 169, 193, 1, 3, 170, 45, 187, 1, 3, 187, 169, 170, 1,
+       3, 34, 191, 169, 1, 3, 34, 169, 187, 1, 3, 191, 52, 193, 1, 3, 193, 169, 191, 1,
+       3, 201, 1, 196, 1, 3, 196, 194, 201, 1, 3, 54, 198, 194, 1, 3, 54, 194, 196, 1,
+       3, 198, 46, 199, 1, 3, 199, 194, 198, 1, 3, 56, 201, 194, 1, 3, 56, 194, 199, 1,
+       3, 206, 3, 203, 1, 3, 203, 197, 206, 1, 3, 55, 204, 197, 1, 3, 55, 197, 203, 1,
+       3, 204, 46, 198, 1, 3, 198, 197, 204, 1, 3, 54, 206, 197, 1, 3, 54, 197, 198, 1,
+3, 8, 173, 172, 1, 3, 8, 172, 208, 1, 3, 173, 47, 207, 1, 3, 207, 172, 173, 1,
+       3, 46, 204, 172, 1, 3, 46, 172, 207, 1, 3, 204, 55, 208, 1, 3, 208, 172, 204, 1,
+3, 9, 209, 166, 1, 3, 9, 166, 167, 1, 3, 209, 56, 199, 1, 3, 199, 166, 209, 1,
+       3, 46, 207, 166, 1, 3, 46, 166, 199, 1, 3, 207, 47, 167, 1, 3, 167, 166, 207, 1,
+       3, 214, 1, 201, 1, 3, 201, 200, 214, 1, 3, 56, 210, 200, 1, 3, 56, 200, 201, 1,
+       3, 210, 51, 212, 1, 3, 212, 200, 210, 1, 3, 59, 214, 200, 1, 3, 59, 200, 212, 1,
+       3, 209, 9, 193, 1, 3, 193, 192, 209, 1, 3, 52, 215, 192, 1, 3, 52, 192, 193, 1,
+       3, 51, 210, 192, 1, 3, 51, 192, 215, 1, 3, 210, 56, 209, 1, 3, 209, 192, 210, 1,
+       3, 190, 10, 216, 1, 3, 216, 189, 190, 1, 3, 216, 57, 217, 1, 3, 217, 189, 216, 1,
+       3, 51, 215, 189, 1, 3, 51, 189, 217, 1, 3, 52, 190, 189, 1, 3, 52, 189, 215, 1,
+       3, 221, 0, 219, 1, 3, 219, 211, 221, 1, 3, 59, 212, 211, 1, 3, 59, 211, 219, 1,
+       3, 212, 51, 217, 1, 3, 217, 211, 212, 1, 3, 57, 221, 211, 1, 3, 57, 211, 217, 1,
+       3, 226, 0, 221, 1, 3, 221, 220, 226, 1, 3, 57, 222, 220, 1, 3, 57, 220, 221, 1,
+       3, 222, 48, 224, 1, 3, 224, 220, 222, 1, 3, 62, 226, 220, 1, 3, 62, 220, 224, 1,
+       3, 10, 185, 184, 1, 3, 10, 184, 216, 1, 3, 185, 49, 227, 1, 3, 227, 184, 185, 1,
+       3, 48, 222, 184, 1, 3, 48, 184, 227, 1, 3, 222, 57, 216, 1, 3, 216, 184, 222, 1,
+       3, 11, 228, 179, 1, 3, 11, 179, 180, 1, 3, 228, 60, 229, 1, 3, 229, 179, 228, 1,
+       3, 48, 227, 179, 1, 3, 48, 179, 229, 1, 3, 227, 49, 180, 1, 3, 180, 179, 227, 1,
+       3, 233, 2, 231, 1, 3, 231, 223, 233, 1, 3, 62, 224, 223, 1, 3, 62, 223, 231, 1,
+       3, 224, 48, 229, 1, 3, 229, 223, 224, 1, 3, 60, 233, 223, 1, 3, 60, 223, 229, 1,
+       3, 237, 2, 233, 1, 3, 233, 232, 237, 1, 3, 60, 234, 232, 1, 3, 60, 232, 233, 1,
+       3, 234, 42, 235, 1, 3, 235, 232, 234, 1, 3, 64, 237, 232, 1, 3, 64, 232, 235, 1,
+       3, 11, 160, 159, 1, 3, 11, 159, 228, 1, 3, 160, 43, 238, 1, 3, 238, 159, 160, 1,
+       3, 42, 234, 159, 1, 3, 42, 159, 238, 1, 3, 234, 60, 228, 1, 3, 228, 159, 234, 1,
+3, 8, 208, 150, 1, 3, 8, 150, 151, 1, 3, 208, 55, 239, 1, 3, 239, 150, 208, 1,
+       3, 42, 238, 150, 1, 3, 42, 150, 239, 1, 3, 238, 43, 151, 1, 3, 151, 150, 238, 1,
+       3, 203, 3, 241, 1, 3, 241, 202, 203, 1, 3, 64, 235, 202, 1, 3, 64, 202, 241, 1,
+       3, 235, 42, 239, 1, 3, 239, 202, 235, 1, 3, 55, 203, 202, 1, 3, 55, 202, 239, 1,
+3, 2, 237, 236, 1, 3, 2, 236, 245, 1, 3, 237, 64, 242, 1, 3, 242, 236, 237, 1,
+       3, 63, 244, 236, 1, 3, 63, 236, 242, 1, 3, 244, 68, 245, 1, 3, 245, 236, 244, 1,
+3, 3, 246, 240, 1, 3, 3, 240, 241, 1, 3, 246, 65, 248, 1, 3, 248, 240, 246, 1,
+       3, 63, 242, 240, 1, 3, 63, 240, 248, 1, 3, 242, 64, 241, 1, 3, 241, 240, 242, 1,
+3, 4, 250, 247, 1, 3, 4, 247, 253, 1, 3, 67, 251, 247, 1, 3, 67, 247, 250, 1,
+       3, 63, 248, 247, 1, 3, 63, 247, 251, 1, 3, 248, 65, 253, 1, 3, 253, 247, 248, 1,
+3, 7, 255, 243, 1, 3, 7, 243, 257, 1, 3, 255, 68, 244, 1, 3, 244, 243, 255, 1,
+       3, 63, 251, 243, 1, 3, 63, 243, 244, 1, 3, 67, 257, 243, 1, 3, 67, 243, 251, 1,
+3, 3, 206, 205, 1, 3, 3, 205, 246, 1, 3, 206, 54, 258, 1, 3, 258, 205, 206, 1,
+       3, 53, 259, 205, 1, 3, 53, 205, 258, 1, 3, 259, 65, 246, 1, 3, 246, 205, 259, 1,
+3, 1, 260, 195, 1, 3, 1, 195, 196, 1, 3, 260, 69, 262, 1, 3, 262, 195, 260, 1,
+       3, 53, 258, 195, 1, 3, 53, 195, 262, 1, 3, 258, 54, 196, 1, 3, 196, 195, 258, 1,
+3, 5, 264, 261, 1, 3, 5, 261, 267, 1, 3, 70, 265, 261, 1, 3, 70, 261, 264, 1,
+       3, 53, 262, 261, 1, 3, 53, 261, 265, 1, 3, 262, 69, 267, 1, 3, 267, 261, 262, 1,
+3, 4, 253, 252, 1, 3, 4, 252, 268, 1, 3, 253, 65, 259, 1, 3, 259, 252, 253, 1,
+       3, 53, 265, 252, 1, 3, 53, 252, 259, 1, 3, 70, 268, 252, 1, 3, 70, 252, 265, 1,
+3, 1, 214, 213, 1, 3, 1, 213, 260, 1, 3, 214, 59, 269, 1, 3, 269, 213, 214, 1,
+       3, 58, 270, 213, 1, 3, 58, 213, 269, 1, 3, 270, 69, 260, 1, 3, 260, 213, 270, 1,
+3, 0, 271, 218, 1, 3, 0, 218, 219, 1, 3, 271, 71, 273, 1, 3, 273, 218, 271, 1,
+       3, 58, 269, 218, 1, 3, 58, 218, 273, 1, 3, 269, 59, 219, 1, 3, 219, 218, 269, 1,
+3, 6, 275, 272, 1, 3, 6, 272, 278, 1, 3, 72, 276, 272, 1, 3, 72, 272, 275, 1,
+       3, 58, 273, 272, 1, 3, 58, 272, 276, 1, 3, 273, 71, 278, 1, 3, 278, 272, 273, 1,
+3, 5, 267, 266, 1, 3, 5, 266, 279, 1, 3, 267, 69, 270, 1, 3, 270, 266, 267, 1,
+       3, 58, 276, 266, 1, 3, 58, 266, 270, 1, 3, 72, 279, 266, 1, 3, 72, 266, 276, 1,
+3, 0, 226, 225, 1, 3, 0, 225, 271, 1, 3, 226, 62, 280, 1, 3, 280, 225, 226, 1,
+       3, 61, 281, 225, 1, 3, 61, 225, 280, 1, 3, 281, 71, 271, 1, 3, 271, 225, 281, 1,
+3, 2, 245, 230, 1, 3, 2, 230, 231, 1, 3, 245, 68, 282, 1, 3, 282, 230, 245, 1,
+       3, 61, 280, 230, 1, 3, 61, 230, 282, 1, 3, 280, 62, 231, 1, 3, 231, 230, 280, 1,
+3, 7, 283, 254, 1, 3, 7, 254, 255, 1, 3, 73, 284, 254, 1, 3, 73, 254, 283, 1,
+       3, 61, 282, 254, 1, 3, 61, 254, 284, 1, 3, 282, 68, 255, 1, 3, 255, 254, 282, 1,
+3, 6, 278, 277, 1, 3, 6, 277, 285, 1, 3, 278, 71, 281, 1, 3, 281, 277, 278, 1,
+       3, 61, 284, 277, 1, 3, 61, 277, 281, 1, 3, 73, 285, 277, 1, 3, 73, 277, 284, 1,
+3, 4, 268, 249, 1, 3, 4, 249, 250, 1, 3, 268, 70, 286, 1, 3, 286, 249, 268, 1,
+       3, 66, 287, 249, 1, 3, 66, 249, 286, 1, 3, 287, 67, 250, 1, 3, 250, 249, 287, 1,
+3, 5, 279, 263, 1, 3, 5, 263, 264, 1, 3, 279, 72, 288, 1, 3, 288, 263, 279, 1,
+       3, 66, 286, 263, 1, 3, 66, 263, 288, 1, 3, 286, 70, 264, 1, 3, 264, 263, 286, 1,
+3, 6, 285, 274, 1, 3, 6, 274, 275, 1, 3, 285, 73, 289, 1, 3, 289, 274, 285, 1,
+       3, 66, 288, 274, 1, 3, 66, 274, 289, 1, 3, 288, 72, 275, 1, 3, 275, 274, 288, 1,
+3, 7, 257, 256, 1, 3, 7, 256, 283, 1, 3, 257, 67, 287, 1, 3, 287, 256, 257, 1,
+       3, 66, 289, 256, 1, 3, 66, 256, 287, 1, 3, 289, 73, 283, 1, 3, 283, 256, 289, 1,
+
+       0
+};
+
+struct lwo  LWO_s1_6 =
+{
+       290,                    /* number of points */
+       s1_6_PNTS, s1_6_normals, s1_6_POLS, 0L
+};
+
+#endif /* USE_GL */
+
+/* End of s1_6.c */
diff --git a/hacks/glx/s1_b.c b/hacks/glx/s1_b.c
new file mode 100644 (file)
index 0000000..8510d91
--- /dev/null
@@ -0,0 +1,537 @@
+#if !defined( lint ) && !defined( SABER )
+static const char sccsid[] = "@(#)s1_b.c       4.04 97/07/28 xlockmore";
+
+#endif
+
+/*-
+ * Points to render "s1_b" in 3D.
+ *
+ * Generated by lw2ogl.  Link this with your program but do
+ * not edit by hand.
+ */
+
+#ifndef STANDALONE
+#include "xlock.h"
+#endif
+
+#ifdef USE_GL
+
+#ifdef STANDALONE
+#include <GL/glx.h>
+#endif
+#include <GL/gl.h>
+#include "buildlwo.h"
+
+static GLfloat s1_b_PNTS[] =
+{
+       (GLfloat) - 0.137893, (GLfloat) 0.043508, (GLfloat) - 0.125711,
+       (GLfloat) - 0.095845, (GLfloat) - 0.165656, (GLfloat) 0.072892,
+       (GLfloat) - 0.093165, (GLfloat) 0.152051, (GLfloat) 0.327744,
+       (GLfloat) - 0.003795, (GLfloat) 0.001470, (GLfloat) - 0.102225,
+       (GLfloat) 0.152845, (GLfloat) - 0.430757, (GLfloat) - 0.031907,
+       (GLfloat) - 0.118828, (GLfloat) 0.399389, (GLfloat) 0.091047,
+       (GLfloat) - 0.169137, (GLfloat) - 0.181241, (GLfloat) - 0.288763,
+       (GLfloat) 0.048660, (GLfloat) 0.018262, (GLfloat) - 0.035049,
+       (GLfloat) 0.008859, (GLfloat) 0.208004, (GLfloat) - 0.059048,
+       (GLfloat) - 0.009212, (GLfloat) - 0.042229, (GLfloat) - 0.000692,
+       (GLfloat) - 0.040025, (GLfloat) 0.115695, (GLfloat) 0.178962,
+       (GLfloat) - 0.198525, (GLfloat) 0.018630, (GLfloat) 0.257202,
+       (GLfloat) 0.205081, (GLfloat) - 0.244569, (GLfloat) 0.136314,
+       (GLfloat) - 0.214336, (GLfloat) - 0.149946, (GLfloat) - 0.006872,
+       (GLfloat) 0.245675, (GLfloat) - 0.227316, (GLfloat) - 0.184201,
+       (GLfloat) - 0.001494, (GLfloat) 0.259139, (GLfloat) - 0.260652,
+       (GLfloat) 0.070243, (GLfloat) 0.038750, (GLfloat) 0.069425,
+       (GLfloat) - 0.033229, (GLfloat) - 0.259151, (GLfloat) 0.298856,
+       (GLfloat) 0.088773, (GLfloat) - 0.065324, (GLfloat) 0.260294,
+       (GLfloat) 0.009195, (GLfloat) 0.078651, (GLfloat) 0.055543,
+       (GLfloat) - 0.090795, (GLfloat) 0.025672, (GLfloat) 0.056988,
+       (GLfloat) - 0.163707, (GLfloat) - 0.011627, (GLfloat) - 0.096395,
+       (GLfloat) 0.068886, (GLfloat) 0.257031, (GLfloat) - 0.264175,
+       (GLfloat) - 0.018086, (GLfloat) - 0.285526, (GLfloat) 0.152989,
+       (GLfloat) - 0.017489, (GLfloat) 0.031671, (GLfloat) 0.000107,
+       (GLfloat) - 0.075583, (GLfloat) - 0.097617, (GLfloat) 0.030074,
+       (GLfloat) 0.129221, (GLfloat) - 0.087628, (GLfloat) 0.171748,
+       (GLfloat) - 0.007530, (GLfloat) - 0.084194, (GLfloat) 0.186045,
+       (GLfloat) 0.474638, (GLfloat) 0.004818, (GLfloat) 0.200460,
+       (GLfloat) 0.016796, (GLfloat) 0.096614, (GLfloat) - 0.221351,
+       (GLfloat) 0.187032, (GLfloat) 0.031017, (GLfloat) 0.039986,
+       (GLfloat) - 0.142119, (GLfloat) - 0.105297, (GLfloat) - 0.100849,
+       (GLfloat) 0.142768, (GLfloat) - 0.313960, (GLfloat) - 0.349716,
+       (GLfloat) - 0.146805, (GLfloat) 0.140482, (GLfloat) 0.035653,
+       (GLfloat) 0.039939, (GLfloat) - 0.051822, (GLfloat) - 0.017672,
+       (GLfloat) 0.057111, (GLfloat) - 0.075686, (GLfloat) - 0.103478,
+       (GLfloat) 0.049696, (GLfloat) - 0.135070, (GLfloat) 0.055097,
+       (GLfloat) 0.030271, (GLfloat) 0.075412, (GLfloat) - 0.103571,
+       (GLfloat) 0.100158, (GLfloat) - 0.022917, (GLfloat) 0.073895,
+       (GLfloat) 0.085544, (GLfloat) - 0.273613, (GLfloat) 0.092456,
+       (GLfloat) 0.077489, (GLfloat) - 0.309836, (GLfloat) - 0.003664,
+       (GLfloat) - 0.017590, (GLfloat) - 0.127869, (GLfloat) 0.153118,
+       (GLfloat) - 0.157014, (GLfloat) - 0.242184, (GLfloat) 0.070478,
+       (GLfloat) - 0.018167, (GLfloat) - 0.133639, (GLfloat) - 0.174937,
+       (GLfloat) - 0.106973, (GLfloat) - 0.189783, (GLfloat) 0.038622,
+       (GLfloat) - 0.000096, (GLfloat) 0.104429, (GLfloat) - 0.032589,
+       (GLfloat) - 0.032036, (GLfloat) - 0.021493, (GLfloat) 0.279829,
+       (GLfloat) - 0.093181, (GLfloat) - 0.058024, (GLfloat) 0.182239,
+       (GLfloat) 0.012941, (GLfloat) - 0.010409, (GLfloat) 0.088080,
+       (GLfloat) 0.256718, (GLfloat) - 0.118137, (GLfloat) - 0.078847,
+       (GLfloat) - 0.113382, (GLfloat) 0.135060, (GLfloat) 0.269946,
+       (GLfloat) 0.175810, (GLfloat) - 0.026321, (GLfloat) 0.013860,
+       (GLfloat) - 0.110606, (GLfloat) - 0.023553, (GLfloat) - 0.255525,
+       (GLfloat) 0.007163, (GLfloat) 0.068674, (GLfloat) 0.010214,
+       (GLfloat) 0.031631, (GLfloat) - 0.170381, (GLfloat) - 0.174604,
+       (GLfloat) 0.117242, (GLfloat) 0.014353, (GLfloat) - 0.021215,
+       (GLfloat) 0.090315, (GLfloat) 0.161755, (GLfloat) 0.074427,
+       (GLfloat) 0.285616, (GLfloat) 0.335824, (GLfloat) - 0.083891,
+       (GLfloat) - 0.145763, (GLfloat) 0.109292, (GLfloat) 0.121340,
+       (GLfloat) - 0.147459, (GLfloat) - 0.041936, (GLfloat) 0.010427,
+       (GLfloat) - 0.082626, (GLfloat) 0.151300, (GLfloat) - 0.030875,
+       (GLfloat) 0.217154, (GLfloat) - 0.288504, (GLfloat) - 0.202483,
+       (GLfloat) 0.026532, (GLfloat) - 0.106796, (GLfloat) 0.121041,
+       (GLfloat) 0.046695, (GLfloat) - 0.033673, (GLfloat) - 0.043721,
+       (GLfloat) 0.135596, (GLfloat) 0.217426, (GLfloat) - 0.219631,
+       (GLfloat) 0.137627, (GLfloat) 0.026335, (GLfloat) - 0.082390,
+       (GLfloat) - 0.031665, (GLfloat) - 0.115897, (GLfloat) 0.077834,
+       (GLfloat) - 0.214922, (GLfloat) - 0.162169, (GLfloat) 0.073035,
+       (GLfloat) - 0.076108, (GLfloat) 0.200481, (GLfloat) 0.036119,
+       (GLfloat) 0.012715, (GLfloat) - 0.161921, (GLfloat) 0.179804,
+       (GLfloat) 0.140409, (GLfloat) - 0.165899, (GLfloat) - 0.005149,
+       (GLfloat) - 0.054606, (GLfloat) 0.011149, (GLfloat) 0.045768,
+       (GLfloat) 0.116640, (GLfloat) - 0.180314, (GLfloat) 0.045320,
+       (GLfloat) 0.342166, (GLfloat) 0.295895, (GLfloat) - 0.049250,
+       (GLfloat) - 0.133242, (GLfloat) 0.129064, (GLfloat) 0.136969,
+       (GLfloat) 0.137520, (GLfloat) - 0.387145, (GLfloat) 0.132137,
+       (GLfloat) 0.023302, (GLfloat) 0.194298, (GLfloat) - 0.066187,
+       (GLfloat) 0.089302, (GLfloat) 0.128683, (GLfloat) - 0.072530,
+       (GLfloat) - 0.141374, (GLfloat) 0.035924, (GLfloat) - 0.079354,
+       (GLfloat) - 0.209233, (GLfloat) 0.018987, (GLfloat) - 0.004193,
+       (GLfloat) 0.156295, (GLfloat) - 0.034087, (GLfloat) 0.344315,
+       (GLfloat) - 0.005946, (GLfloat) 0.039791, (GLfloat) 0.071862,
+       (GLfloat) 0.076043, (GLfloat) - 0.094430, (GLfloat) 0.090122,
+       (GLfloat) 0.127394, (GLfloat) 0.031466, (GLfloat) - 0.028015,
+       (GLfloat) - 0.061000, (GLfloat) 0.169741, (GLfloat) - 0.127635,
+       (GLfloat) - 0.015117, (GLfloat) - 0.160883, (GLfloat) - 0.095443,
+       (GLfloat) - 0.185998, (GLfloat) - 0.182942, (GLfloat) 0.056857,
+       (GLfloat) 0.016499, (GLfloat) - 0.308118, (GLfloat) - 0.075513,
+       (GLfloat) 0.024971, (GLfloat) - 0.301226, (GLfloat) - 0.027251,
+       (GLfloat) - 0.035944, (GLfloat) 0.061566, (GLfloat) 0.013883,
+       (GLfloat) 0.007215, (GLfloat) 0.046198, (GLfloat) - 0.227891,
+       (GLfloat) 0.189165, (GLfloat) 0.079471, (GLfloat) - 0.067849,
+       (GLfloat) 0.026963, (GLfloat) 0.027982, (GLfloat) - 0.050419,
+       (GLfloat) - 0.050896, (GLfloat) 0.069604, (GLfloat) - 0.196938,
+       (GLfloat) 0.064274, (GLfloat) - 0.205263, (GLfloat) 0.297868,
+       (GLfloat) - 0.047543, (GLfloat) 0.147822, (GLfloat) 0.166593,
+       (GLfloat) 0.010318, (GLfloat) - 0.002148, (GLfloat) 0.029434,
+       (GLfloat) 0.036107, (GLfloat) - 0.523568, (GLfloat) - 0.118442,
+       (GLfloat) - 0.199410, (GLfloat) 0.233526, (GLfloat) - 0.161289,
+       (GLfloat) - 0.047441, (GLfloat) - 0.013973, (GLfloat) 0.112998,
+       (GLfloat) - 0.043494, (GLfloat) - 0.181796, (GLfloat) 0.065864,
+       (GLfloat) - 0.074984, (GLfloat) 0.177758, (GLfloat) - 0.156470,
+       (GLfloat) 0.225216, (GLfloat) 0.081058, (GLfloat) - 0.169876,
+       (GLfloat) - 0.041510, (GLfloat) 0.025763, (GLfloat) - 0.231350,
+       (GLfloat) 0.259015, (GLfloat) 0.274641, (GLfloat) 0.018290,
+       (GLfloat) 0.039196, (GLfloat) 0.010028, (GLfloat) 0.072771,
+       (GLfloat) 0.031646, (GLfloat) 0.075290, (GLfloat) 0.039258,
+       (GLfloat) 0.052930, (GLfloat) - 0.034809, (GLfloat) 0.165429,
+       (GLfloat) - 0.072511, (GLfloat) 0.095786, (GLfloat) - 0.222144,
+       (GLfloat) 0.038706, (GLfloat) 0.032296, (GLfloat) - 0.002495,
+       (GLfloat) 0.011675, (GLfloat) - 0.061944, (GLfloat) 0.082555,
+       (GLfloat) - 0.168400, (GLfloat) 0.074113, (GLfloat) 0.049321,
+       (GLfloat) 0.001263, (GLfloat) - 0.207436, (GLfloat) 0.013949,
+       (GLfloat) - 0.027045, (GLfloat) 0.015697, (GLfloat) - 0.047831,
+       (GLfloat) 0.121989, (GLfloat) - 0.043014, (GLfloat) - 0.004426,
+       (GLfloat) 0.238374, (GLfloat) - 0.320060, (GLfloat) - 0.111754,
+       (GLfloat) 0.095077, (GLfloat) 0.014640, (GLfloat) 0.070665,
+       (GLfloat) - 0.084367, (GLfloat) 0.016444, (GLfloat) 0.000788,
+       (GLfloat) - 0.117804, (GLfloat) 0.113550, (GLfloat) 0.087029,
+       (GLfloat) - 0.109080, (GLfloat) - 0.155795, (GLfloat) 0.040085,
+       (GLfloat) - 0.020370, (GLfloat) 0.118787, (GLfloat) 0.101787,
+       (GLfloat) 0.140877, (GLfloat) - 0.144829, (GLfloat) 0.107720,
+       (GLfloat) - 0.247002, (GLfloat) - 0.454632, (GLfloat) 0.070535,
+       (GLfloat) - 0.016278, (GLfloat) - 0.111440, (GLfloat) 0.270110,
+       (GLfloat) - 0.017624, (GLfloat) - 0.146232, (GLfloat) 0.154626,
+       (GLfloat) 0.214030, (GLfloat) 0.041025, (GLfloat) - 0.170250,
+       (GLfloat) 0.010009, (GLfloat) - 0.159290, (GLfloat) - 0.076895,
+       (GLfloat) 0.116168, (GLfloat) 0.156775, (GLfloat) - 0.077935,
+       (GLfloat) 0.199355, (GLfloat) 0.081120, (GLfloat) 0.003352,
+       (GLfloat) 0.054178, (GLfloat) - 0.036863, (GLfloat) - 0.004573,
+       (GLfloat) - 0.015149, (GLfloat) 0.057005, (GLfloat) - 0.008878,
+       (GLfloat) 0.374758, (GLfloat) - 0.007823, (GLfloat) - 0.078051,
+       (GLfloat) - 0.034977, (GLfloat) 0.026837, (GLfloat) 0.035441,
+       (GLfloat) 0.101867, (GLfloat) 0.121954, (GLfloat) 0.040450,
+       (GLfloat) - 0.136911, (GLfloat) 0.010061, (GLfloat) 0.082698,
+       (GLfloat) 0.121665, (GLfloat) - 0.589852, (GLfloat) 0.106401,
+       (GLfloat) - 0.064574, (GLfloat) 0.098679, (GLfloat) 0.059336,
+       (GLfloat) 0.103037, (GLfloat) - 0.075263, (GLfloat) 0.172586,
+       (GLfloat) - 0.217492, (GLfloat) - 0.170584, (GLfloat) - 0.025846,
+       (GLfloat) 0.260366, (GLfloat) 0.002117, (GLfloat) 0.041535,
+       (GLfloat) - 0.024112, (GLfloat) - 0.023437, (GLfloat) - 0.088146,
+       (GLfloat) - 0.007767, (GLfloat) 0.061738, (GLfloat) 0.116208,
+       (GLfloat) 0.253471, (GLfloat) 0.113278, (GLfloat) 0.231012,
+       (GLfloat) - 0.011399, (GLfloat) 0.116962, (GLfloat) - 0.037465,
+       (GLfloat) 0.233898, (GLfloat) 0.226108, (GLfloat) 0.077176,
+       (GLfloat) - 0.004640, (GLfloat) 0.209191, (GLfloat) - 0.091738,
+       (GLfloat) 0.093995, (GLfloat) 0.328937, (GLfloat) 0.245098,
+       (GLfloat) 0.155739, (GLfloat) - 0.327971, (GLfloat) - 0.115265,
+       (GLfloat) 0.125306, (GLfloat) 0.174931, (GLfloat) 0.130030,
+       (GLfloat) 0.005005, (GLfloat) - 0.022310, (GLfloat) 0.120651,
+       (GLfloat) 0.046982, (GLfloat) - 0.058839, (GLfloat) - 0.097958,
+       (GLfloat) - 0.059618, (GLfloat) - 0.068114, (GLfloat) 0.070137,
+       (GLfloat) 0.053184, (GLfloat) - 0.081163, (GLfloat) 0.000020,
+       (GLfloat) 0.188066, (GLfloat) - 0.082942, (GLfloat) - 0.013689,
+       (GLfloat) - 0.161390, (GLfloat) - 0.335891, (GLfloat) - 0.060737,
+       (GLfloat) 0.131189, (GLfloat) 0.036733, (GLfloat) - 0.093511,
+       (GLfloat) - 0.002496, (GLfloat) - 0.059035, (GLfloat) - 0.084055,
+       (GLfloat) 0.109820, (GLfloat) - 0.235531, (GLfloat) 0.130865,
+       (GLfloat) 0.018909, (GLfloat) 0.062351, (GLfloat) 0.111532,
+       (GLfloat) 0.123548, (GLfloat) 0.094008, (GLfloat) 0.056761,
+       (GLfloat) 0.106710, (GLfloat) - 0.049834, (GLfloat) - 0.147748,
+       (GLfloat) 0.102940, (GLfloat) - 0.113169, (GLfloat) 0.191710,
+       (GLfloat) - 0.028647, (GLfloat) 0.128038, (GLfloat) - 0.104189,
+       (GLfloat) 0.107226, (GLfloat) - 0.220633, (GLfloat) - 0.147310,
+       (GLfloat) - 0.205747, (GLfloat) 0.063433, (GLfloat) - 0.026135,
+       (GLfloat) - 0.064614, (GLfloat) 0.096963, (GLfloat) - 0.080108,
+       (GLfloat) - 0.083255, (GLfloat) 0.113008, (GLfloat) - 0.089852,
+       (GLfloat) 0.180961, (GLfloat) - 0.269100, (GLfloat) 0.115523,
+       (GLfloat) 0.044722, (GLfloat) - 0.023285, (GLfloat) 0.024813,
+       (GLfloat) 0.078986, (GLfloat) 0.037242, (GLfloat) 0.005124,
+       (GLfloat) 0.115141, (GLfloat) 0.124478, (GLfloat) - 0.034603,
+       (GLfloat) 0.022454, (GLfloat) 0.155937, (GLfloat) - 0.096183,
+       (GLfloat) 0.175318, (GLfloat) 0.007233, (GLfloat) - 0.138507,
+       (GLfloat) 0.019182, (GLfloat) - 0.037869, (GLfloat) 0.074242,
+       (GLfloat) 0.058218, (GLfloat) 0.212269, (GLfloat) - 0.003886,
+       (GLfloat) - 0.188525, (GLfloat) - 0.075703, (GLfloat) 0.075643,
+       (GLfloat) - 0.029085, (GLfloat) - 0.076746, (GLfloat) - 0.273473,
+       (GLfloat) - 0.105590, (GLfloat) - 0.238524, (GLfloat) - 0.087465,
+       (GLfloat) 0.086122, (GLfloat) - 0.340807, (GLfloat) - 0.192851,
+       (GLfloat) - 0.247936, (GLfloat) - 0.003160, (GLfloat) 0.082106,
+       (GLfloat) 0.137988, (GLfloat) - 0.041876, (GLfloat) - 0.012086,
+       (GLfloat) - 0.140714, (GLfloat) - 0.138827, (GLfloat) - 0.064179,
+       (GLfloat) - 0.059380, (GLfloat) 0.015642, (GLfloat) 0.113841,
+       (GLfloat) - 0.031501, (GLfloat) 0.007130, (GLfloat) - 0.125767,
+       (GLfloat) 0.021294, (GLfloat) - 0.021957, (GLfloat) - 0.069365,
+       (GLfloat) - 0.012419, (GLfloat) 0.019780, (GLfloat) - 0.077459,
+       (GLfloat) 0.085524, (GLfloat) 0.087513, (GLfloat) - 0.107484,
+       (GLfloat) - 0.303263, (GLfloat) 0.263672, (GLfloat) - 0.220649,
+       (GLfloat) - 0.090267, (GLfloat) - 0.376337, (GLfloat) - 0.127634,
+       (GLfloat) 0.087681, (GLfloat) 0.015985, (GLfloat) - 0.029860,
+       (GLfloat) 0.119257, (GLfloat) 0.140347, (GLfloat) 0.194003,
+       (GLfloat) 0.066270, (GLfloat) 0.127178, (GLfloat) - 0.003765,
+       (GLfloat) 0.037563, (GLfloat) - 0.110829, (GLfloat) 0.000382,
+       (GLfloat) 0.034295, (GLfloat) - 0.045737, (GLfloat) 0.045204,
+       (GLfloat) 0.017365, (GLfloat) - 0.072708, (GLfloat) 0.056698,
+       (GLfloat) 0.045238, (GLfloat) 0.187956, (GLfloat) - 0.055878,
+       (GLfloat) - 0.132755, (GLfloat) 0.017969, (GLfloat) - 0.041205,
+       (GLfloat) 0.189702, (GLfloat) - 0.020780, (GLfloat) - 0.077422,
+       (GLfloat) 0.210419, (GLfloat) 0.178041, (GLfloat) - 0.005855,
+       (GLfloat) 0.104527, (GLfloat) - 0.304323, (GLfloat) 0.002581,
+       (GLfloat) 0.043359, (GLfloat) - 0.060695, (GLfloat) - 0.011878,
+       (GLfloat) - 0.000267, (GLfloat) 0.020510, (GLfloat) - 0.046383,
+       (GLfloat) 0.252891, (GLfloat) 0.074246, (GLfloat) - 0.047689,
+       (GLfloat) - 0.069874, (GLfloat) 0.118962, (GLfloat) - 0.052781,
+       (GLfloat) 0.086188, (GLfloat) 0.068354, (GLfloat) - 0.213621,
+       (GLfloat) 0.086637, (GLfloat) - 0.171519, (GLfloat) 0.006447,
+       (GLfloat) 0.196785, (GLfloat) - 0.086044, (GLfloat) - 0.068059,
+       (GLfloat) 0.100401, (GLfloat) 0.243886, (GLfloat) - 0.142258,
+       (GLfloat) 0.173010, (GLfloat) 0.303375, (GLfloat) - 0.060085,
+       (GLfloat) - 0.041181, (GLfloat) - 0.097467, (GLfloat) 0.073776,
+       (GLfloat) - 0.013471, (GLfloat) - 0.133299, (GLfloat) - 0.143570,
+       (GLfloat) - 0.302092, (GLfloat) - 0.158342, (GLfloat) 0.230719,
+       (GLfloat) 0.074434, (GLfloat) - 0.143530, (GLfloat) 0.294895,
+       (GLfloat) - 0.165626, (GLfloat) 0.200869, (GLfloat) - 0.130737,
+       (GLfloat) 0.102444, (GLfloat) 0.277067, (GLfloat) 0.078210,
+       (GLfloat) - 0.183696, (GLfloat) - 0.010502, (GLfloat) - 0.150481,
+       (GLfloat) - 0.070029, (GLfloat) - 0.019635, (GLfloat) - 0.059141,
+       (GLfloat) - 0.005930, (GLfloat) 0.069199, (GLfloat) - 0.013126,
+       (GLfloat) - 0.119333, (GLfloat) - 0.007972, (GLfloat) 0.119489,
+       (GLfloat) 0.033072, (GLfloat) 0.081756, (GLfloat) - 0.034481,
+       (GLfloat) - 0.108282, (GLfloat) - 0.065310, (GLfloat) 0.146009,
+       (GLfloat) 0.080950, (GLfloat) 0.111320, (GLfloat) 0.004291,
+       (GLfloat) 0.071208, (GLfloat) - 0.112941, (GLfloat) 0.028135,
+       (GLfloat) - 0.024632, (GLfloat) 0.190525, (GLfloat) - 0.285626,
+       (GLfloat) - 0.105040, (GLfloat) 0.044008, (GLfloat) 0.020236,
+       (GLfloat) - 0.017815, (GLfloat) - 0.076684, (GLfloat) - 0.065840,
+       (GLfloat) 0.083563, (GLfloat) 0.100873, (GLfloat) - 0.141154,
+       (GLfloat) - 0.062066, (GLfloat) - 0.010894, (GLfloat) 0.066110,
+       (GLfloat) - 0.056763, (GLfloat) 0.024777, (GLfloat) - 0.176209,
+       (GLfloat) - 0.014442, (GLfloat) 0.052861, (GLfloat) 0.013010,
+       (GLfloat) - 0.157546, (GLfloat) - 0.118279, (GLfloat) - 0.237648,
+       (GLfloat) - 0.234497, (GLfloat) - 0.158049, (GLfloat) 0.102635,
+       (GLfloat) 0.061685, (GLfloat) - 0.052695, (GLfloat) - 0.042243,
+       (GLfloat) 0.093961, (GLfloat) - 0.025060, (GLfloat) 0.046602,
+       (GLfloat) 0.004395, (GLfloat) 0.150912, (GLfloat) 0.191784,
+       (GLfloat) 0.067299, (GLfloat) - 0.059575, (GLfloat) 0.161018,
+       (GLfloat) - 0.233155, (GLfloat) - 0.109721, (GLfloat) 0.194653,
+       (GLfloat) 0.217444, (GLfloat) 0.221231, (GLfloat) - 0.201241,
+       (GLfloat) - 0.033689, (GLfloat) - 0.341937, (GLfloat) - 0.099231,
+       (GLfloat) 0.042771, (GLfloat) - 0.028862, (GLfloat) 0.067736,
+       (GLfloat) 0.110240, (GLfloat) 0.274029, (GLfloat) - 0.157689,
+       (GLfloat) - 0.055994, (GLfloat) 0.144729, (GLfloat) 0.090901,
+       (GLfloat) 0.211192, (GLfloat) 0.058165, (GLfloat) - 0.149872,
+       (GLfloat) 0.102735, (GLfloat) - 0.044061, (GLfloat) - 0.044795,
+       (GLfloat) - 0.042153, (GLfloat) - 0.010955, (GLfloat) 0.014341,
+       (GLfloat) - 0.011649, (GLfloat) 0.099072, (GLfloat) - 0.086419,
+       (GLfloat) - 0.018920, (GLfloat) 0.000640, (GLfloat) - 0.031729,
+       (GLfloat) - 0.216886, (GLfloat) - 0.057512, (GLfloat) 0.071195,
+       (GLfloat) - 0.188150, (GLfloat) 0.049292, (GLfloat) 0.258489,
+       (GLfloat) - 0.023494, (GLfloat) 0.021489, (GLfloat) 0.199785,
+       (GLfloat) - 0.045818, (GLfloat) 0.066753, (GLfloat) - 0.035593,
+       (GLfloat) 0.010986, (GLfloat) 0.166767, (GLfloat) 0.275085,
+       (GLfloat) - 0.177039, (GLfloat) 0.010372, (GLfloat) 0.167936,
+       (GLfloat) - 0.423239, (GLfloat) 0.027466, (GLfloat) - 0.126114,
+       (GLfloat) - 0.102035, (GLfloat) 0.282640, (GLfloat) 0.022622,
+       (GLfloat) - 0.023997, (GLfloat) 0.176943, (GLfloat) 0.093272,
+       (GLfloat) - 0.090009, (GLfloat) 0.015338, (GLfloat) 0.250857,
+       (GLfloat) 0.011095, (GLfloat) 0.006703, (GLfloat) 0.057076,
+       (GLfloat) 0.133423, (GLfloat) 0.234639, (GLfloat) - 0.070260,
+       (GLfloat) - 0.295994, (GLfloat) 0.185615, (GLfloat) 0.117148,
+       (GLfloat) 0.235480, (GLfloat) 0.066195, (GLfloat) 0.078641,
+       (GLfloat) - 0.026545, (GLfloat) 0.093931, (GLfloat) 0.008019,
+       (GLfloat) 0.181656, (GLfloat) - 0.088719, (GLfloat) 0.045959,
+       (GLfloat) - 0.076308, (GLfloat) - 0.164584, (GLfloat) 0.018271,
+       (GLfloat) 0.092026, (GLfloat) 0.201866, (GLfloat) - 0.106051,
+       (GLfloat) 0.019876, (GLfloat) 0.050967, (GLfloat) 0.176081,
+       (GLfloat) - 0.018546, (GLfloat) 0.138749, (GLfloat) - 0.008255,
+       (GLfloat) - 0.026049, (GLfloat) - 0.068465, (GLfloat) - 0.055467,
+       (GLfloat) - 0.260245, (GLfloat) 0.221833, (GLfloat) - 0.048541,
+       (GLfloat) - 0.169783, (GLfloat) 0.354992, (GLfloat) - 0.017943,
+       (GLfloat) - 0.306063, (GLfloat) 0.074787, (GLfloat) 0.101971,
+       (GLfloat) 0.215973, (GLfloat) 0.107558, (GLfloat) - 0.008808,
+       (GLfloat) 0.390235, (GLfloat) - 0.275652, (GLfloat) - 0.117085,
+       (GLfloat) 0.033898, (GLfloat) 0.046047, (GLfloat) - 0.108977,
+       (GLfloat) - 0.263507, (GLfloat) - 0.091765, (GLfloat) - 0.250234,
+       (GLfloat) - 0.044613, (GLfloat) 0.149563, (GLfloat) 0.027937,
+       (GLfloat) - 0.015397, (GLfloat) - 0.040254, (GLfloat) 0.065692,
+       (GLfloat) - 0.017531, (GLfloat) - 0.013504, (GLfloat) 0.004021,
+       (GLfloat) 0.054665, (GLfloat) - 0.018996, (GLfloat) - 0.006954,
+       (GLfloat) 0.033068, (GLfloat) 0.219349, (GLfloat) - 0.194079,
+       (GLfloat) - 0.057780, (GLfloat) 0.011881, (GLfloat) 0.084904,
+       (GLfloat) 0.139243, (GLfloat) - 0.109890, (GLfloat) 0.039145,
+       (GLfloat) 0.223272, (GLfloat) 0.208110, (GLfloat) 0.165882,
+       (GLfloat) - 0.008046, (GLfloat) 0.103847, (GLfloat) 0.278718,
+       (GLfloat) - 0.035499, (GLfloat) 0.112662, (GLfloat) - 0.088418,
+       (GLfloat) - 0.053118, (GLfloat) 0.053871, (GLfloat) - 0.054706,
+       (GLfloat) 0.118632, (GLfloat) 0.086431, (GLfloat) - 0.022494,
+       (GLfloat) 0.014943, (GLfloat) 0.039622, (GLfloat) 0.047307,
+       (GLfloat) 0.006570, (GLfloat) 0.093461, (GLfloat) 0.058982,
+       (GLfloat) 0.031448, (GLfloat) 0.325716, (GLfloat) - 0.047305,
+       (GLfloat) - 0.193710, (GLfloat) 0.087226, (GLfloat) 0.051790,
+       (GLfloat) 0.116154, (GLfloat) - 0.080023, (GLfloat) - 0.106643,
+       (GLfloat) 0.156514, (GLfloat) - 0.222710, (GLfloat) 0.275425,
+       (GLfloat) - 0.084294, (GLfloat) - 0.101851, (GLfloat) 0.425222,
+       (GLfloat) 0.030344, (GLfloat) - 0.141370, (GLfloat) - 0.282460,
+       (GLfloat) 0.003022, (GLfloat) 0.108996, (GLfloat) - 0.229152,
+       (GLfloat) - 0.133040, (GLfloat) 0.061025, (GLfloat) - 0.128942,
+       (GLfloat) - 0.077348, (GLfloat) 0.013363, (GLfloat) - 0.072511,
+       (GLfloat) - 0.050317, (GLfloat) 0.452190, (GLfloat) 0.094114,
+       (GLfloat) 0.053309, (GLfloat) - 0.143722, (GLfloat) 0.249884,
+       (GLfloat) - 0.257016, (GLfloat) 0.100544, (GLfloat) 0.012236,
+       (GLfloat) - 0.022056, (GLfloat) - 0.212133, (GLfloat) 0.023533,
+       (GLfloat) 0.153299, (GLfloat) 0.031763, (GLfloat) 0.034577,
+       (GLfloat) 0.161729, (GLfloat) 0.084914, (GLfloat) 0.050770,
+       (GLfloat) 0.320438, (GLfloat) 0.112175, (GLfloat) 0.135015,
+       (GLfloat) - 0.040717, (GLfloat) 0.073400, (GLfloat) 0.080543,
+       (GLfloat) - 0.226004, (GLfloat) 0.143154, (GLfloat) 0.170139,
+       (GLfloat) 0.009756, (GLfloat) 0.068337, (GLfloat) 0.132111,
+       (GLfloat) 0.380191, (GLfloat) 0.233715, (GLfloat) 0.026664,
+       (GLfloat) - 0.018016, (GLfloat) 0.265426, (GLfloat) - 0.110691,
+       (GLfloat) 0.041281, (GLfloat) 0.056674, (GLfloat) - 0.119834,
+       (GLfloat) 0.170794, (GLfloat) - 0.112611, (GLfloat) 0.094839,
+       (GLfloat) 0.216318, (GLfloat) 0.002081, (GLfloat) 0.154653,
+       (GLfloat) - 0.036815, (GLfloat) 0.024332, (GLfloat) 0.172587,
+       (GLfloat) - 0.064554, (GLfloat) 0.160699, (GLfloat) 0.101229,
+       (GLfloat) 0.114451, (GLfloat) 0.016039, (GLfloat) 0.293489,
+       (GLfloat) 0.023010, (GLfloat) - 0.028932, (GLfloat) 0.014800,
+       (GLfloat) - 0.290527, (GLfloat) 0.172553, (GLfloat) 0.129526,
+       (GLfloat) - 0.048159, (GLfloat) - 0.181222, (GLfloat) 0.305871,
+       (GLfloat) 0.065351, (GLfloat) - 0.399962, (GLfloat) - 0.030479,
+       (GLfloat) 0.334123, (GLfloat) - 0.120149, (GLfloat) 0.241310,
+       (GLfloat) - 0.203728, (GLfloat) - 0.155627, (GLfloat) 0.140805,
+       (GLfloat) 0.061022, (GLfloat) - 0.016097, (GLfloat) 0.131688,
+       (GLfloat) 0.045050, (GLfloat) - 0.313782, (GLfloat) - 0.279077,
+       (GLfloat) 0.034252, (GLfloat) - 0.135512, (GLfloat) - 0.087765,
+       (GLfloat) 0.276236, (GLfloat) 0.036449, (GLfloat) 0.418332,
+       (GLfloat) - 0.122146, (GLfloat) 0.050998, (GLfloat) 0.131453,
+       (GLfloat) - 0.087629, (GLfloat) 0.330142, (GLfloat) 0.061353,
+       (GLfloat) 0.228676, (GLfloat) 0.093309, (GLfloat) - 0.009307,
+       (GLfloat) 0.435264, (GLfloat) 0.186185, (GLfloat) - 0.127484,
+       (GLfloat) 0.156565, (GLfloat) 0.013842, (GLfloat) - 0.103874,
+       (GLfloat) - 0.274053, (GLfloat) - 0.084119, (GLfloat) 0.096687,
+       (GLfloat) - 0.027947, (GLfloat) - 0.051152, (GLfloat) - 0.078997,
+       (GLfloat) 0.013399, (GLfloat) 0.194440, (GLfloat) 0.072030,
+       (GLfloat) 0.000082, (GLfloat) 0.130666, (GLfloat) 0.052218,
+       (GLfloat) 0.064984, (GLfloat) - 0.136859, (GLfloat) 0.092204,
+       (GLfloat) 0.109060, (GLfloat) 0.424779, (GLfloat) - 0.111867,
+       (GLfloat) 0.061748, (GLfloat) 0.160827, (GLfloat) - 0.068538,
+       (GLfloat) 0.062960, (GLfloat) 0.059638, (GLfloat) - 0.181514,
+       (GLfloat) 0.018961, (GLfloat) 0.072298, (GLfloat) 0.003517,
+       (GLfloat) - 0.099508, (GLfloat) - 0.225455, (GLfloat) - 0.021791,
+       (GLfloat) 0.001955, (GLfloat) - 0.320555, (GLfloat) 0.159506,
+       (GLfloat) - 0.057735, (GLfloat) - 0.054327, (GLfloat) - 0.095525,
+       (GLfloat) 0.319748, (GLfloat) - 0.146158, (GLfloat) - 0.198384,
+       (GLfloat) - 0.158741, (GLfloat) - 0.265443, (GLfloat) 0.036635,
+       (GLfloat) - 0.093089, (GLfloat) - 0.358379, (GLfloat) - 0.110549,
+       (GLfloat) - 0.049805, (GLfloat) 0.022246, (GLfloat) - 0.036724,
+       (GLfloat) 0.223000, (GLfloat) 0.247522, (GLfloat) - 0.232652,
+       (GLfloat) - 0.249441, (GLfloat) - 0.248325, (GLfloat) - 0.071169,
+       (GLfloat) 0.000369, (GLfloat) 0.094598, (GLfloat) - 0.162153,
+       (GLfloat) - 0.133873, (GLfloat) - 0.188473, (GLfloat) 0.272734,
+       (GLfloat) 0.046594, (GLfloat) 0.069766, (GLfloat) 0.015561,
+       (GLfloat) 0.111582, (GLfloat) - 0.239786, (GLfloat) 0.034658,
+       (GLfloat) 0.093232, (GLfloat) 0.183507, (GLfloat) - 0.011298,
+       (GLfloat) - 0.226805, (GLfloat) 0.514871, (GLfloat) - 0.064144,
+       (GLfloat) 0.085949, (GLfloat) 0.031412, (GLfloat) 0.042790,
+       (GLfloat) - 0.043755, (GLfloat) - 0.290797, (GLfloat) - 0.159142,
+       (GLfloat) 0.056671, (GLfloat) 0.167837, (GLfloat) 0.016536,
+       (GLfloat) - 0.034538, (GLfloat) 0.072185, (GLfloat) 0.066973,
+       (GLfloat) - 0.021211, (GLfloat) 0.064120, (GLfloat) - 0.174756,
+       (GLfloat) 0.090627, (GLfloat) - 0.055253, (GLfloat) 0.109457,
+       (GLfloat) 0.019686, (GLfloat) 0.004469, (GLfloat) - 0.096316,
+       (GLfloat) - 0.038864, (GLfloat) - 0.135083, (GLfloat) 0.244529,
+       (GLfloat) 0.034613, (GLfloat) - 0.069587, (GLfloat) 0.144533,
+       (GLfloat) - 0.100009, (GLfloat) - 0.057516, (GLfloat) - 0.079338,
+       (GLfloat) - 0.178026, (GLfloat) 0.085994, (GLfloat) 0.061804,
+       (GLfloat) - 0.189256, (GLfloat) 0.342739, (GLfloat) 0.043372,
+       (GLfloat) - 0.046206, (GLfloat) 0.168946, (GLfloat) - 0.133904,
+       (GLfloat) 0.015314, (GLfloat) - 0.090127, (GLfloat) - 0.058530,
+       (GLfloat) 0.169657, (GLfloat) - 0.097086, (GLfloat) 0.013746,
+       (GLfloat) 0.185131, (GLfloat) - 0.089445, (GLfloat) 0.347806,
+       (GLfloat) - 0.264432, (GLfloat) - 0.170170, (GLfloat) - 0.335858,
+       (GLfloat) - 0.086511, (GLfloat) 0.248252, (GLfloat) - 0.169698,
+       (GLfloat) 0.002287, (GLfloat) - 0.028338, (GLfloat) - 0.266432,
+       (GLfloat) - 0.085060, (GLfloat) 0.001974, (GLfloat) - 0.032789,
+       (GLfloat) 0.192750, (GLfloat) - 0.007081, (GLfloat) 0.098197,
+       (GLfloat) 0.012577, (GLfloat) 0.034983, (GLfloat) - 0.003058,
+       (GLfloat) - 0.039249, (GLfloat) 0.038498, (GLfloat) 0.067306,
+       (GLfloat) 0.021988, (GLfloat) 0.379705, (GLfloat) - 0.054619,
+       (GLfloat) - 0.151707, (GLfloat) 0.051034, (GLfloat) - 0.016003,
+       (GLfloat) - 0.057048, (GLfloat) 0.075729, (GLfloat) - 0.213397,
+       (GLfloat) - 0.137847, (GLfloat) 0.130600, (GLfloat) 0.046198,
+       (GLfloat) 0.024786, (GLfloat) 0.049556, (GLfloat) - 0.045772,
+       (GLfloat) - 0.082533, (GLfloat) 0.155397, (GLfloat) - 0.096145,
+       (GLfloat) 0.049152, (GLfloat) 0.270979, (GLfloat) - 0.147022,
+       (GLfloat) 0.061153, (GLfloat) - 0.104531, (GLfloat) - 0.103623,
+       (GLfloat) - 0.142997, (GLfloat) - 0.232885, (GLfloat) 0.040538,
+       (GLfloat) 0.048806, (GLfloat) - 0.013095, (GLfloat) - 0.003505,
+       (GLfloat) - 0.095063, (GLfloat) 0.241414, (GLfloat) - 0.202255,
+       (GLfloat) 0.108558, (GLfloat) - 0.147584, (GLfloat) 0.162682,
+       (GLfloat) 0.217105, (GLfloat) 0.252340, (GLfloat) - 0.114830,
+       (GLfloat) - 0.188028, (GLfloat) 0.417252, (GLfloat) - 0.077456,
+       (GLfloat) - 0.112855, (GLfloat) 0.105192, (GLfloat) 0.073968,
+       (GLfloat) - 0.186972, (GLfloat) 0.164022, (GLfloat) - 0.073415,
+       (GLfloat) - 0.074349, (GLfloat) - 0.324874, (GLfloat) - 0.056645,
+       (GLfloat) 0.327855, (GLfloat) - 0.271424, (GLfloat) - 0.141142,
+       (GLfloat) 0.151049, (GLfloat) 0.155239, (GLfloat) - 0.083116,
+       (GLfloat) 0.035395, (GLfloat) - 0.133176, (GLfloat) - 0.095112,
+       (GLfloat) 0.127283, (GLfloat) - 0.011837, (GLfloat) 0.199750,
+       (GLfloat) - 0.120775, (GLfloat) 0.103698, (GLfloat) 0.063302,
+       (GLfloat) 0.014222, (GLfloat) 0.198468, (GLfloat) 0.137537,
+       (GLfloat) - 0.269656, (GLfloat) 0.120644, (GLfloat) - 0.153958,
+       (GLfloat) - 0.136743, (GLfloat) - 0.119817, (GLfloat) - 0.073747,
+       (GLfloat) - 0.068156, (GLfloat) - 0.138484, (GLfloat) 0.033507,
+       (GLfloat) - 0.106835, (GLfloat) 0.114964, (GLfloat) 0.023924,
+       (GLfloat) - 0.222525, (GLfloat) 0.330321, (GLfloat) - 0.007431,
+       (GLfloat) - 0.011739, (GLfloat) 0.095156, (GLfloat) 0.139086,
+       (GLfloat) 0.146766, (GLfloat) 0.037685, (GLfloat) 0.136122,
+       (GLfloat) - 0.086532, (GLfloat) - 0.081295, (GLfloat) 0.009434,
+       (GLfloat) 0.189439, (GLfloat) 0.290592, (GLfloat) - 0.048317,
+       (GLfloat) 0.139152, (GLfloat) 0.224931, (GLfloat) 0.355509,
+       (GLfloat) 0.017162, (GLfloat) - 0.016825, (GLfloat) 0.094198,
+       (GLfloat) - 0.237595, (GLfloat) 0.205475, (GLfloat) - 0.041412,
+       (GLfloat) 0.050511, (GLfloat) 0.094900, (GLfloat) 0.252891,
+       (GLfloat) - 0.012538, (GLfloat) - 0.014082, (GLfloat) 0.064629,
+       (GLfloat) - 0.059810, (GLfloat) 0.020665, (GLfloat) - 0.260979,
+       (GLfloat) 0.073490, (GLfloat) - 0.242270, (GLfloat) 0.085847,
+       (GLfloat) 0.049499, (GLfloat) - 0.045617, (GLfloat) - 0.015894,
+       (GLfloat) - 0.121040, (GLfloat) 0.004350, (GLfloat) 0.381603,
+       (GLfloat) - 0.062798, (GLfloat) 0.055006, (GLfloat) 0.077472,
+       (GLfloat) - 0.156846, (GLfloat) - 0.033342, (GLfloat) 0.035284,
+       (GLfloat) 0.105383, (GLfloat) 0.002776, (GLfloat) - 0.046394,
+       (GLfloat) 0.247612, (GLfloat) 0.310528, (GLfloat) 0.046188,
+       (GLfloat) - 0.144567, (GLfloat) - 0.197996, (GLfloat) 0.083309,
+       (GLfloat) - 0.317845, (GLfloat) - 0.014793, (GLfloat) - 0.041608,
+       (GLfloat) - 0.169858, (GLfloat) 0.102631, (GLfloat) 0.283962,
+       (GLfloat) - 0.168757, (GLfloat) 0.093105, (GLfloat) 0.050325,
+       (GLfloat) - 0.013639, (GLfloat) 0.285100, (GLfloat) 0.047089,
+       (GLfloat) 0.216644, (GLfloat) 0.102018, (GLfloat) 0.031983,
+       (GLfloat) 0.046988, (GLfloat) 0.081482, (GLfloat) 0.021865,
+       (GLfloat) 0.124995, (GLfloat) - 0.193086, (GLfloat) 0.127870,
+       (GLfloat) 0.009153, (GLfloat) 0.178713, (GLfloat) - 0.077949,
+       (GLfloat) - 0.235371, (GLfloat) - 0.046817, (GLfloat) - 0.125764,
+       (GLfloat) - 0.089381, (GLfloat) 0.289172, (GLfloat) - 0.129356,
+       (GLfloat) 0.312993, (GLfloat) 0.120426, (GLfloat) 0.296957,
+       (GLfloat) - 0.106431, (GLfloat) 0.117096, (GLfloat) 0.156971,
+       (GLfloat) 0.030001, (GLfloat) 0.244577, (GLfloat) 0.085119,
+       (GLfloat) 0.002958, (GLfloat) - 0.035469, (GLfloat) - 0.084615,
+       (GLfloat) - 0.052248, (GLfloat) - 0.004298, (GLfloat) - 0.129170,
+       (GLfloat) - 0.158458, (GLfloat) 0.059061, (GLfloat) - 0.041780,
+       (GLfloat) - 0.007117, (GLfloat) - 0.174211, (GLfloat) 0.098819,
+       (GLfloat) - 0.158387, (GLfloat) 0.060840, (GLfloat) - 0.064818,
+       (GLfloat) 0.117241, (GLfloat) - 0.050754, (GLfloat) - 0.027945,
+       (GLfloat) - 0.014301, (GLfloat) 0.146402, (GLfloat) - 0.118414,
+       (GLfloat) 0.186611, (GLfloat) - 0.162182, (GLfloat) - 0.150909,
+       (GLfloat) - 0.106992, (GLfloat) 0.286109, (GLfloat) - 0.055512,
+       (GLfloat) 0.109689, (GLfloat) - 0.346409, (GLfloat) 0.072611,
+       (GLfloat) - 0.009694, (GLfloat) - 0.038102, (GLfloat) 0.098565,
+       (GLfloat) - 0.034598, (GLfloat) 0.323300, (GLfloat) 0.020962,
+       (GLfloat) - 0.149219, (GLfloat) 0.040596, (GLfloat) - 0.114206,
+       (GLfloat) 0.164744, (GLfloat) 0.048081, (GLfloat) 0.105464,
+       (GLfloat) 0.036214, (GLfloat) 0.099523, (GLfloat) 0.038595,
+       (GLfloat) 0.056537, (GLfloat) 0.036271, (GLfloat) 0.003042,
+       (GLfloat) - 0.157110, (GLfloat) 0.001614, (GLfloat) - 0.133994,
+       (GLfloat) - 0.104357, (GLfloat) - 0.032004, (GLfloat) 0.262334,
+       (GLfloat) 0.041215, (GLfloat) - 0.010418, (GLfloat) - 0.037968,
+       (GLfloat) 0.223491, (GLfloat) - 0.387946, (GLfloat) 0.117291,
+       (GLfloat) - 0.344434, (GLfloat) 0.110318, (GLfloat) - 0.031448,
+       (GLfloat) 0.123562, (GLfloat) - 0.315729, (GLfloat) 0.164533,
+       (GLfloat) 0.008207, (GLfloat) 0.042004, (GLfloat) 0.050014,
+       (GLfloat) - 0.191339, (GLfloat) - 0.069291, (GLfloat) - 0.220065,
+       (GLfloat) 0.023845, (GLfloat) 0.009474, (GLfloat) 0.035598,
+       (GLfloat) - 0.173295, (GLfloat) - 0.036604, (GLfloat) - 0.193323,
+       (GLfloat) - 0.040347, (GLfloat) - 0.106063, (GLfloat) - 0.055559,
+       (GLfloat) - 0.071543, (GLfloat) 0.136487, (GLfloat) 0.105697,
+       (GLfloat) - 0.179027, (GLfloat) - 0.071852, (GLfloat) 0.117512,
+       (GLfloat) 0.064769, (GLfloat) - 0.345895, (GLfloat) 0.012833,
+       (GLfloat) 0.044800, (GLfloat) - 0.032357, (GLfloat) - 0.042161,
+       (GLfloat) 0.243586, (GLfloat) 0.392499, (GLfloat) - 0.180641,
+       (GLfloat) - 0.148924, (GLfloat) - 0.181446, (GLfloat) 0.146644,
+       (GLfloat) - 0.042773, (GLfloat) 0.045843, (GLfloat) - 0.176893,
+       (GLfloat) 0.025938, (GLfloat) 0.058109, (GLfloat) 0.242063,
+       (GLfloat) - 0.028489, (GLfloat) - 0.024828, (GLfloat) 0.161289,
+       (GLfloat) 0.073899, (GLfloat) - 0.081205, (GLfloat) - 0.023751,
+       (GLfloat) 0.026149, (GLfloat) 0.051399, (GLfloat) - 0.072348,
+       (GLfloat) 0.024308, (GLfloat) - 0.041819, (GLfloat) - 0.030578,
+       (GLfloat) - 0.077778, (GLfloat) 0.010272, (GLfloat) 0.066967,
+       (GLfloat) - 0.139184, (GLfloat) - 0.018983, (GLfloat) 0.035150,
+       (GLfloat) - 0.061359, (GLfloat) - 0.152358, (GLfloat) - 0.072849,
+       (GLfloat) 0.043101, (GLfloat) 0.028278, (GLfloat) 0.077387,
+       (GLfloat) 0.065599, (GLfloat) - 0.049676, (GLfloat) 0.043708,
+       (GLfloat) - 0.255767, (GLfloat) 0.023510, (GLfloat) - 0.076982,
+       (GLfloat) 0.020468, (GLfloat) - 0.040630, (GLfloat) 0.208424,
+       (GLfloat) 0.044922, (GLfloat) 0.025184, (GLfloat) 0.004764,
+       (GLfloat) 0.107432, (GLfloat) - 0.009356, (GLfloat) 0.239863,
+       (GLfloat) - 0.005475, (GLfloat) 0.158400, (GLfloat) 0.089743,
+       (GLfloat) 0.018352, (GLfloat) 0.134559, (GLfloat) 0.221650,
+       (GLfloat) 0.094423, (GLfloat) 0.129390, (GLfloat) - 0.031274,
+       (GLfloat) 0.048541, (GLfloat) 0.100595, (GLfloat) - 0.155938,
+       (GLfloat) - 0.016298, (GLfloat) - 0.036518, (GLfloat) - 0.149178,
+       (GLfloat) - 0.329953, (GLfloat) - 0.327602, (GLfloat) - 0.150086,
+       (GLfloat) 0.148403, (GLfloat) - 0.363334, (GLfloat) 0.028237,
+       (GLfloat) - 0.305790, (GLfloat) - 0.009844, (GLfloat) - 0.075571,
+       (GLfloat) - 0.045131, (GLfloat) 0.152595, (GLfloat) 0.228720,
+       (GLfloat) 0.039725, (GLfloat) - 0.127469, (GLfloat) 0.066522,
+       (GLfloat) - 0.078576, (GLfloat) - 0.349749, (GLfloat) - 0.146881,
+       (GLfloat) 0.013160, (GLfloat) - 0.040312, (GLfloat) 0.129980,
+       (GLfloat) 0.221142, (GLfloat) - 0.106068, (GLfloat) 0.254967,
+       (GLfloat) 0.180912, (GLfloat) - 0.207357, (GLfloat) - 0.196999,
+       (GLfloat) 0.098219, (GLfloat) 0.085231, (GLfloat) 0.121963,
+};
+
+struct lwo  LWO_s1_b =
+{
+       500,                    /* number of points */
+       s1_b_PNTS, 0L, 0L, 0L
+};
+
+#endif /* USE_GL */
+
+/* End of s1_b.c */
diff --git a/hacks/glx/shark.c b/hacks/glx/shark.c
new file mode 100644 (file)
index 0000000..a3de1b9
--- /dev/null
@@ -0,0 +1,1404 @@
+/* atlantis --- Shows moving 3D sea animals */
+
+#if !defined( lint ) && !defined( SABER )
+static const char sccsid[] = "@(#)shark.c      1.2 98/06/16 xlockmore";
+
+#endif
+
+/* Copyright (c) E. Lassauge, 1998. */
+
+/*
+ * 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.
+ *
+ * This file is provided AS IS with no warranties of any kind.  The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof.  In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * The original code for this mode was written by Mark J. Kilgard
+ * as a demo for openGL programming.
+ * 
+ * Porting it to xlock  was possible by comparing the original Mesa's morph3d 
+ * demo with it's ported version to xlock, so thanks for Marcelo F. Vianna 
+ * (look at morph3d.c) for his indirect help.
+ *
+ * Thanks goes also to Brian Paul for making it possible and inexpensive
+ * to use OpenGL at home.
+ *
+ * My e-mail address is lassauge@sagem.fr
+ *
+ * Eric Lassauge  (May-13-1998)
+ *
+ */
+
+/**
+ * (c) Copyright 1993, 1994, Silicon Graphics, Inc.
+ * ALL RIGHTS RESERVED
+ * Permission to use, copy, modify, and distribute this software for
+ * any purpose and without fee is hereby granted, provided that the above
+ * copyright notice appear in all copies and that both the copyright notice
+ * and this permission notice appear in supporting documentation, and that
+ * the name of Silicon Graphics, Inc. not be used in advertising
+ * or publicity pertaining to distribution of the software without specific,
+ * written prior permission.
+ *
+ * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS"
+ * AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR
+ * FITNESS FOR A PARTICULAR PURPOSE.  IN NO EVENT SHALL SILICON
+ * GRAPHICS, INC.  BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT,
+ * SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY
+ * KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION,
+ * LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF
+ * THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC.  HAS BEEN
+ * ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
+ * POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
+ * US Government Users Restricted Rights
+ * Use, duplication, or disclosure by the Government is subject to
+ * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph
+ * (c)(1)(ii) of the Rights in Technical Data and Computer Software
+ * clause at DFARS 252.227-7013 and/or in similar or successor
+ * clauses in the FAR or the DOD or NASA FAR Supplement.
+ * Unpublished-- rights reserved under the copyright laws of the
+ * United States.  Contractor/manufacturer is Silicon Graphics,
+ * Inc., 2011 N.  Shoreline Blvd., Mountain View, CA 94039-7311.
+ *
+ * OpenGL(TM) is a trademark of Silicon Graphics, Inc.
+ */
+
+#ifndef STANDALONE
+#include "xlock.h"
+#endif
+
+#ifdef USE_GL
+
+#ifdef STANDALONE
+#include <math.h>
+#include <GL/glx.h>
+#endif
+
+#include "atlantis.h"
+/* *INDENT-OFF* */
+#if 0
+static float N001[3] = {0.000000 ,1.000000 ,0.000000};
+#endif
+static float N002[3] = {0.000077 ,-0.020611 ,0.999788};
+static float N003[3] = {0.961425 ,0.258729 ,-0.093390};
+static float N004[3] = {0.510811 ,-0.769633 ,-0.383063};
+static float N005[3] = {0.400123 ,0.855734 ,-0.328055};
+static float N006[3] = {-0.770715 ,0.610204 ,-0.183440};
+static float N007[3] = {-0.915597 ,-0.373345 ,-0.149316};
+static float N008[3] = {-0.972788 ,0.208921 ,-0.100179};
+static float N009[3] = {-0.939713 ,-0.312268 ,-0.139383};
+static float N010[3] = {-0.624138 ,-0.741047 ,-0.247589};
+static float N011[3] = {0.591434 ,-0.768401 ,-0.244471};
+static float N012[3] = {0.935152 ,-0.328495 ,-0.132598};
+static float N013[3] = {0.997102 ,0.074243 ,-0.016593};
+static float N014[3] = {0.969995 ,0.241712 ,-0.026186};
+static float N015[3] = {0.844539 ,0.502628 ,-0.184714};
+static float N016[3] = {-0.906608 ,0.386308 ,-0.169787};
+static float N017[3] = {-0.970016 ,0.241698 ,-0.025516};
+static float N018[3] = {-0.998652 ,0.050493 ,-0.012045};
+static float N019[3] = {-0.942685 ,-0.333051 ,-0.020556};
+static float N020[3] = {-0.660944 ,-0.750276 ,0.015480};
+static float N021[3] = {0.503549 ,-0.862908 ,-0.042749};
+static float N022[3] = {0.953202 ,-0.302092 ,-0.012089};
+static float N023[3] = {0.998738 ,0.023574 ,0.044344};
+static float N024[3] = {0.979297 ,0.193272 ,0.060202};
+static float N025[3] = {0.798300 ,0.464885 ,0.382883};
+static float N026[3] = {-0.756590 ,0.452403 ,0.472126};
+static float N027[3] = {-0.953855 ,0.293003 ,0.065651};
+static float N028[3] = {-0.998033 ,0.040292 ,0.048028};
+static float N029[3] = {-0.977079 ,-0.204288 ,0.059858};
+static float N030[3] = {-0.729117 ,-0.675304 ,0.111140};
+static float N031[3] = {0.598361 ,-0.792753 ,0.116221};
+static float N032[3] = {0.965192 ,-0.252991 ,0.066332};
+static float N033[3] = {0.998201 ,-0.002790 ,0.059892};
+static float N034[3] = {0.978657 ,0.193135 ,0.070207};
+static float N035[3] = {0.718815 ,0.680392 ,0.142733};
+static float N036[3] = {-0.383096 ,0.906212 ,0.178936};
+static float N037[3] = {-0.952831 ,0.292590 ,0.080647};
+static float N038[3] = {-0.997680 ,0.032417 ,0.059861};
+static float N039[3] = {-0.982629 ,-0.169881 ,0.074700};
+static float N040[3] = {-0.695424 ,-0.703466 ,0.146700};
+static float N041[3] = {0.359323 ,-0.915531 ,0.180805};
+static float N042[3] = {0.943356 ,-0.319387 ,0.089842};
+static float N043[3] = {0.998272 ,-0.032435 ,0.048993};
+static float N044[3] = {0.978997 ,0.193205 ,0.065084};
+static float N045[3] = {0.872144 ,0.470094 ,-0.135565};
+static float N046[3] = {-0.664282 ,0.737945 ,-0.119027};
+static float N047[3] = {-0.954508 ,0.288570 ,0.075107};
+static float N048[3] = {-0.998273 ,0.032406 ,0.048993};
+static float N049[3] = {-0.979908 ,-0.193579 ,0.048038};
+static float N050[3] = {-0.858736 ,-0.507202 ,-0.072938};
+static float N051[3] = {0.643545 ,-0.763887 ,-0.048237};
+static float N052[3] = {0.955580 ,-0.288954 ,0.058068};
+#if 0
+static float N053[3] = {0.000000 ,1.000000 ,0.000000};
+static float N054[3] = {0.000000 ,1.000000 ,0.000000};
+static float N055[3] = {0.000000 ,1.000000 ,0.000000};
+static float N056[3] = {0.000000 ,1.000000 ,0.000000};
+static float N057[3] = {0.000000 ,1.000000 ,0.000000};
+#endif
+static float N058[3] = {0.000050 ,0.793007 ,-0.609213};
+static float N059[3] = {0.913510 ,0.235418 ,-0.331779};
+static float N060[3] = {-0.807970 ,0.495000 ,-0.319625};
+static float N061[3] = {0.000000 ,0.784687 ,-0.619892};
+static float N062[3] = {0.000000 ,-1.000000 ,0.000000};
+static float N063[3] = {0.000000 ,1.000000 ,0.000000};
+static float N064[3] = {0.000000 ,1.000000 ,0.000000};
+static float N065[3] = {0.000000 ,1.000000 ,0.000000};
+static float N066[3] = {-0.055784 ,0.257059 ,0.964784};
+#if 0
+static float N067[3] = {0.000000 ,1.000000 ,0.000000};
+static float N068[3] = {0.000000 ,1.000000 ,0.000000};
+#endif
+static float N069[3] = {-0.000505 ,-0.929775 ,-0.368127};
+static float N070[3] = {0.000000 ,1.000000 ,0.000000};
+#if 0
+static float N071[3] = {-0.987102 ,0.131723 ,-0.090984};
+static float N072[3] = {-0.987102 ,0.131723 ,-0.090984};
+static float N073[3] = {-0.987102 ,0.131723 ,-0.090984};
+static float N074[3] = {0.000000 ,1.000000 ,0.000000};
+static float N075[3] = {0.000000 ,1.000000 ,0.000000};
+static float N076[3] = {0.000000 ,1.000000 ,0.000000};
+static float N077[3] = {0.995210 ,0.071962 ,-0.066168};
+static float N078[3] = {0.995210 ,0.071962 ,-0.066168};
+static float N079[3] = {0.995210 ,0.071962 ,-0.066168};
+static float N080[3] = {0.000000 ,1.000000 ,0.000000};
+static float N081[3] = {0.000000 ,1.000000 ,0.000000};
+static float N082[3] = {0.000000 ,1.000000 ,0.000000};
+static float P001[3] = {0.00, 0.00, 0.00};
+#endif
+static float P002[3] = {0.00, -36.59, 5687.72};
+static float P003[3] = {90.00, 114.73, 724.38};
+static float P004[3] = {58.24, -146.84, 262.35};
+static float P005[3] = {27.81, 231.52, 510.43};
+static float P006[3] = {-27.81, 230.43, 509.76};
+static float P007[3] = {-46.09, -146.83, 265.84};
+static float P008[3] = {-90.00, 103.84, 718.53};
+static float P009[3] = {-131.10, -165.92, 834.85};
+static float P010[3] = {-27.81, -285.31, 500.00};
+static float P011[3] = {27.81, -285.32, 500.00};
+static float P012[3] = {147.96, -170.89, 845.50};
+static float P013[3] = {180.00, 0.00, 2000.00};
+static float P014[3] = {145.62, 352.67, 2000.00};
+static float P015[3] = {55.62, 570.63, 2000.00};
+static float P016[3] = {-55.62, 570.64, 2000.00};
+static float P017[3] = {-145.62, 352.68, 2000.00};
+static float P018[3] = {-180.00, 0.01, 2000.00};
+static float P019[3] = {-178.20, -352.66, 2001.61};
+static float P020[3] = {-55.63, -570.63, 2000.00};
+static float P021[3] = {55.62, -570.64, 2000.00};
+static float P022[3] = {179.91, -352.69, 1998.39};
+static float P023[3] = {150.00, 0.00, 3000.00};
+static float P024[3] = {121.35, 293.89, 3000.00};
+static float P025[3] = {46.35, 502.93, 2883.09};
+static float P026[3] = {-46.35, 497.45, 2877.24};
+static float P027[3] = {-121.35, 293.90, 3000.00};
+static float P028[3] = {-150.00, 0.00, 3000.00};
+static float P029[3] = {-152.21, -304.84, 2858.68};
+static float P030[3] = {-46.36, -475.52, 3000.00};
+static float P031[3] = {46.35, -475.53, 3000.00};
+static float P032[3] = {155.64, -304.87, 2863.50};
+static float P033[3] = {90.00, 0.00, 4000.00};
+static float P034[3] = {72.81, 176.33, 4000.00};
+static float P035[3] = {27.81, 285.32, 4000.00};
+static float P036[3] = {-27.81, 285.32, 4000.00};
+static float P037[3] = {-72.81, 176.34, 4000.00};
+static float P038[3] = {-90.00, 0.00, 4000.00};
+static float P039[3] = {-72.81, -176.33, 4000.00};
+static float P040[3] = {-27.81, -285.31, 4000.00};
+static float P041[3] = {27.81, -285.32, 4000.00};
+static float P042[3] = {72.81, -176.34, 4000.00};
+static float P043[3] = {30.00, 0.00, 5000.00};
+static float P044[3] = {24.27, 58.78, 5000.00};
+static float P045[3] = {9.27, 95.11, 5000.00};
+static float P046[3] = {-9.27, 95.11, 5000.00};
+static float P047[3] = {-24.27, 58.78, 5000.00};
+static float P048[3] = {-30.00, 0.00, 5000.00};
+static float P049[3] = {-24.27, -58.78, 5000.00};
+static float P050[3] = {-9.27, -95.10, 5000.00};
+static float P051[3] = {9.27, -95.11, 5000.00};
+static float P052[3] = {24.27, -58.78, 5000.00};
+#if 0
+static float P053[3] = {0.00, 0.00, 0.00};
+static float P054[3] = {0.00, 0.00, 0.00};
+static float P055[3] = {0.00, 0.00, 0.00};
+static float P056[3] = {0.00, 0.00, 0.00};
+static float P057[3] = {0.00, 0.00, 0.00};
+#endif
+static float P058[3] = {0.00, 1212.72, 2703.08};
+static float P059[3] = {50.36, 0.00, 108.14};
+static float P060[3] = {-22.18, 0.00, 108.14};
+static float P061[3] = {0.00, 1181.61, 6344.65};
+static float P062[3] = {516.45, -887.08, 2535.45};
+static float P063[3] = {-545.69, -879.31, 2555.63};
+static float P064[3] = {618.89, -1005.64, 2988.32};
+static float P065[3] = {-635.37, -1014.79, 2938.68};
+static float P066[3] = {0.00, 1374.43, 3064.18};
+#if 0
+static float P067[3] = {158.49, -11.89, 1401.56};
+static float P068[3] = {-132.08, -17.90, 1394.31};
+#endif
+static float P069[3] = {0.00, -418.25, 5765.04};
+static float P070[3] = {0.00, 1266.91, 6629.60};
+static float P071[3] = {-139.12, -124.96, 997.98};
+static float P072[3] = {-139.24, -110.18, 1020.68};
+static float P073[3] = {-137.33, -94.52, 1022.63};
+static float P074[3] = {-137.03, -79.91, 996.89};
+static float P075[3] = {-135.21, -91.48, 969.14};
+static float P076[3] = {-135.39, -110.87, 968.76};
+static float P077[3] = {150.23, -78.44, 995.53};
+static float P078[3] = {152.79, -92.76, 1018.46};
+static float P079[3] = {154.19, -110.20, 1020.55};
+static float P080[3] = {151.33, -124.15, 993.77};
+static float P081[3] = {150.49, -111.19, 969.86};
+static float P082[3] = {150.79, -92.41, 969.70};
+static float iP002[3] = {0.00, -36.59, 5687.72};
+static float iP004[3] = {58.24, -146.84, 262.35};
+static float iP007[3] = {-46.09, -146.83, 265.84};
+static float iP010[3] = {-27.81, -285.31, 500.00};
+static float iP011[3] = {27.81, -285.32, 500.00};
+static float iP023[3] = {150.00, 0.00, 3000.00};
+static float iP024[3] = {121.35, 293.89, 3000.00};
+static float iP025[3] = {46.35, 502.93, 2883.09};
+static float iP026[3] = {-46.35, 497.45, 2877.24};
+static float iP027[3] = {-121.35, 293.90, 3000.00};
+static float iP028[3] = {-150.00, 0.00, 3000.00};
+static float iP029[3] = {-121.35, -304.84, 2853.86};
+static float iP030[3] = {-46.36, -475.52, 3000.00};
+static float iP031[3] = {46.35, -475.53, 3000.00};
+static float iP032[3] = {121.35, -304.87, 2853.86};
+static float iP033[3] = {90.00, 0.00, 4000.00};
+static float iP034[3] = {72.81, 176.33, 4000.00};
+static float iP035[3] = {27.81, 285.32, 4000.00};
+static float iP036[3] = {-27.81, 285.32, 4000.00};
+static float iP037[3] = {-72.81, 176.34, 4000.00};
+static float iP038[3] = {-90.00, 0.00, 4000.00};
+static float iP039[3] = {-72.81, -176.33, 4000.00};
+static float iP040[3] = {-27.81, -285.31, 4000.00};
+static float iP041[3] = {27.81, -285.32, 4000.00};
+static float iP042[3] = {72.81, -176.34, 4000.00};
+static float iP043[3] = {30.00, 0.00, 5000.00};
+static float iP044[3] = {24.27, 58.78, 5000.00};
+static float iP045[3] = {9.27, 95.11, 5000.00};
+static float iP046[3] = {-9.27, 95.11, 5000.00};
+static float iP047[3] = {-24.27, 58.78, 5000.00};
+static float iP048[3] = {-30.00, 0.00, 5000.00};
+static float iP049[3] = {-24.27, -58.78, 5000.00};
+static float iP050[3] = {-9.27, -95.10, 5000.00};
+static float iP051[3] = {9.27, -95.11, 5000.00};
+static float iP052[3] = {24.27, -58.78, 5000.00};
+#if 0
+static float iP053[3] = {0.00, 0.00, 0.00};
+#endif
+static float iP061[3] = {0.00, 1181.61, 6344.65};
+static float iP069[3] = {0.00, -418.25, 5765.04};
+static float iP070[3] = {0.00, 1266.91, 6629.60};
+/* *INDENT-ON* */
+
+
+
+static void
+Fish001(GLenum cap)
+{
+       glBegin(cap);
+       glNormal3fv(N005);
+       glVertex3fv(P005);
+       glNormal3fv(N059);
+       glVertex3fv(P059);
+       glNormal3fv(N060);
+       glVertex3fv(P060);
+       glNormal3fv(N006);
+       glVertex3fv(P006);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N015);
+       glVertex3fv(P015);
+       glNormal3fv(N005);
+       glVertex3fv(P005);
+       glNormal3fv(N006);
+       glVertex3fv(P006);
+       glNormal3fv(N016);
+       glVertex3fv(P016);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N006);
+       glVertex3fv(P006);
+       glNormal3fv(N060);
+       glVertex3fv(P060);
+       glNormal3fv(N008);
+       glVertex3fv(P008);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N016);
+       glVertex3fv(P016);
+       glNormal3fv(N006);
+       glVertex3fv(P006);
+       glNormal3fv(N008);
+       glVertex3fv(P008);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N016);
+       glVertex3fv(P016);
+       glNormal3fv(N008);
+       glVertex3fv(P008);
+       glNormal3fv(N017);
+       glVertex3fv(P017);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N017);
+       glVertex3fv(P017);
+       glNormal3fv(N008);
+       glVertex3fv(P008);
+       glNormal3fv(N018);
+       glVertex3fv(P018);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N008);
+       glVertex3fv(P008);
+       glNormal3fv(N009);
+       glVertex3fv(P009);
+       glNormal3fv(N018);
+       glVertex3fv(P018);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N008);
+       glVertex3fv(P008);
+       glNormal3fv(N060);
+       glVertex3fv(P060);
+       glNormal3fv(N009);
+       glVertex3fv(P009);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N007);
+       glVertex3fv(P007);
+       glNormal3fv(N010);
+       glVertex3fv(P010);
+       glNormal3fv(N009);
+       glVertex3fv(P009);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N009);
+       glVertex3fv(P009);
+       glNormal3fv(N019);
+       glVertex3fv(P019);
+       glNormal3fv(N018);
+       glVertex3fv(P018);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N009);
+       glVertex3fv(P009);
+       glNormal3fv(N010);
+       glVertex3fv(P010);
+       glNormal3fv(N019);
+       glVertex3fv(P019);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N010);
+       glVertex3fv(P010);
+       glNormal3fv(N020);
+       glVertex3fv(P020);
+       glNormal3fv(N019);
+       glVertex3fv(P019);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N010);
+       glVertex3fv(P010);
+       glNormal3fv(N011);
+       glVertex3fv(P011);
+       glNormal3fv(N021);
+       glVertex3fv(P021);
+       glNormal3fv(N020);
+       glVertex3fv(P020);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N004);
+       glVertex3fv(P004);
+       glNormal3fv(N011);
+       glVertex3fv(P011);
+       glNormal3fv(N010);
+       glVertex3fv(P010);
+       glNormal3fv(N007);
+       glVertex3fv(P007);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N004);
+       glVertex3fv(P004);
+       glNormal3fv(N012);
+       glVertex3fv(P012);
+       glNormal3fv(N011);
+       glVertex3fv(P011);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N012);
+       glVertex3fv(P012);
+       glNormal3fv(N022);
+       glVertex3fv(P022);
+       glNormal3fv(N011);
+       glVertex3fv(P011);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N011);
+       glVertex3fv(P011);
+       glNormal3fv(N022);
+       glVertex3fv(P022);
+       glNormal3fv(N021);
+       glVertex3fv(P021);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N059);
+       glVertex3fv(P059);
+       glNormal3fv(N005);
+       glVertex3fv(P005);
+       glNormal3fv(N015);
+       glVertex3fv(P015);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N015);
+       glVertex3fv(P015);
+       glNormal3fv(N014);
+       glVertex3fv(P014);
+       glNormal3fv(N003);
+       glVertex3fv(P003);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N015);
+       glVertex3fv(P015);
+       glNormal3fv(N003);
+       glVertex3fv(P003);
+       glNormal3fv(N059);
+       glVertex3fv(P059);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N014);
+       glVertex3fv(P014);
+       glNormal3fv(N013);
+       glVertex3fv(P013);
+       glNormal3fv(N003);
+       glVertex3fv(P003);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N003);
+       glVertex3fv(P003);
+       glNormal3fv(N012);
+       glVertex3fv(P012);
+       glNormal3fv(N059);
+       glVertex3fv(P059);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N013);
+       glVertex3fv(P013);
+       glNormal3fv(N012);
+       glVertex3fv(P012);
+       glNormal3fv(N003);
+       glVertex3fv(P003);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N013);
+       glVertex3fv(P013);
+       glNormal3fv(N022);
+       glVertex3fv(P022);
+       glNormal3fv(N012);
+       glVertex3fv(P012);
+       glEnd();
+       glBegin(cap);
+       glVertex3fv(P071);
+       glVertex3fv(P072);
+       glVertex3fv(P073);
+       glVertex3fv(P074);
+       glVertex3fv(P075);
+       glVertex3fv(P076);
+       glEnd();
+       glBegin(cap);
+       glVertex3fv(P077);
+       glVertex3fv(P078);
+       glVertex3fv(P079);
+       glVertex3fv(P080);
+       glVertex3fv(P081);
+       glVertex3fv(P082);
+       glEnd();
+}
+
+static void
+Fish002(GLenum cap)
+{
+       glBegin(cap);
+       glNormal3fv(N013);
+       glVertex3fv(P013);
+       glNormal3fv(N014);
+       glVertex3fv(P014);
+       glNormal3fv(N024);
+       glVertex3fv(P024);
+       glNormal3fv(N023);
+       glVertex3fv(P023);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N014);
+       glVertex3fv(P014);
+       glNormal3fv(N015);
+       glVertex3fv(P015);
+       glNormal3fv(N025);
+       glVertex3fv(P025);
+       glNormal3fv(N024);
+       glVertex3fv(P024);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N016);
+       glVertex3fv(P016);
+       glNormal3fv(N017);
+       glVertex3fv(P017);
+       glNormal3fv(N027);
+       glVertex3fv(P027);
+       glNormal3fv(N026);
+       glVertex3fv(P026);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N017);
+       glVertex3fv(P017);
+       glNormal3fv(N018);
+       glVertex3fv(P018);
+       glNormal3fv(N028);
+       glVertex3fv(P028);
+       glNormal3fv(N027);
+       glVertex3fv(P027);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N020);
+       glVertex3fv(P020);
+       glNormal3fv(N021);
+       glVertex3fv(P021);
+       glNormal3fv(N031);
+       glVertex3fv(P031);
+       glNormal3fv(N030);
+       glVertex3fv(P030);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N013);
+       glVertex3fv(P013);
+       glNormal3fv(N023);
+       glVertex3fv(P023);
+       glNormal3fv(N022);
+       glVertex3fv(P022);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N022);
+       glVertex3fv(P022);
+       glNormal3fv(N023);
+       glVertex3fv(P023);
+       glNormal3fv(N032);
+       glVertex3fv(P032);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N022);
+       glVertex3fv(P022);
+       glNormal3fv(N032);
+       glVertex3fv(P032);
+       glNormal3fv(N031);
+       glVertex3fv(P031);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N022);
+       glVertex3fv(P022);
+       glNormal3fv(N031);
+       glVertex3fv(P031);
+       glNormal3fv(N021);
+       glVertex3fv(P021);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N018);
+       glVertex3fv(P018);
+       glNormal3fv(N019);
+       glVertex3fv(P019);
+       glNormal3fv(N029);
+       glVertex3fv(P029);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N018);
+       glVertex3fv(P018);
+       glNormal3fv(N029);
+       glVertex3fv(P029);
+       glNormal3fv(N028);
+       glVertex3fv(P028);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N019);
+       glVertex3fv(P019);
+       glNormal3fv(N020);
+       glVertex3fv(P020);
+       glNormal3fv(N030);
+       glVertex3fv(P030);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N019);
+       glVertex3fv(P019);
+       glNormal3fv(N030);
+       glVertex3fv(P030);
+       glNormal3fv(N029);
+       glVertex3fv(P029);
+       glEnd();
+}
+
+static void
+Fish003(GLenum cap)
+{
+       glBegin(cap);
+       glNormal3fv(N032);
+       glVertex3fv(P032);
+       glNormal3fv(N023);
+       glVertex3fv(P023);
+       glNormal3fv(N033);
+       glVertex3fv(P033);
+       glNormal3fv(N042);
+       glVertex3fv(P042);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N031);
+       glVertex3fv(P031);
+       glNormal3fv(N032);
+       glVertex3fv(P032);
+       glNormal3fv(N042);
+       glVertex3fv(P042);
+       glNormal3fv(N041);
+       glVertex3fv(P041);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N023);
+       glVertex3fv(P023);
+       glNormal3fv(N024);
+       glVertex3fv(P024);
+       glNormal3fv(N034);
+       glVertex3fv(P034);
+       glNormal3fv(N033);
+       glVertex3fv(P033);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N024);
+       glVertex3fv(P024);
+       glNormal3fv(N025);
+       glVertex3fv(P025);
+       glNormal3fv(N035);
+       glVertex3fv(P035);
+       glNormal3fv(N034);
+       glVertex3fv(P034);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N030);
+       glVertex3fv(P030);
+       glNormal3fv(N031);
+       glVertex3fv(P031);
+       glNormal3fv(N041);
+       glVertex3fv(P041);
+       glNormal3fv(N040);
+       glVertex3fv(P040);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N025);
+       glVertex3fv(P025);
+       glNormal3fv(N026);
+       glVertex3fv(P026);
+       glNormal3fv(N036);
+       glVertex3fv(P036);
+       glNormal3fv(N035);
+       glVertex3fv(P035);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N026);
+       glVertex3fv(P026);
+       glNormal3fv(N027);
+       glVertex3fv(P027);
+       glNormal3fv(N037);
+       glVertex3fv(P037);
+       glNormal3fv(N036);
+       glVertex3fv(P036);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N027);
+       glVertex3fv(P027);
+       glNormal3fv(N028);
+       glVertex3fv(P028);
+       glNormal3fv(N038);
+       glVertex3fv(P038);
+       glNormal3fv(N037);
+       glVertex3fv(P037);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N028);
+       glVertex3fv(P028);
+       glNormal3fv(N029);
+       glVertex3fv(P029);
+       glNormal3fv(N039);
+       glVertex3fv(P039);
+       glNormal3fv(N038);
+       glVertex3fv(P038);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N029);
+       glVertex3fv(P029);
+       glNormal3fv(N030);
+       glVertex3fv(P030);
+       glNormal3fv(N040);
+       glVertex3fv(P040);
+       glNormal3fv(N039);
+       glVertex3fv(P039);
+       glEnd();
+}
+
+static void
+Fish004(GLenum cap)
+{
+       glBegin(cap);
+       glNormal3fv(N040);
+       glVertex3fv(P040);
+       glNormal3fv(N041);
+       glVertex3fv(P041);
+       glNormal3fv(N051);
+       glVertex3fv(P051);
+       glNormal3fv(N050);
+       glVertex3fv(P050);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N041);
+       glVertex3fv(P041);
+       glNormal3fv(N042);
+       glVertex3fv(P042);
+       glNormal3fv(N052);
+       glVertex3fv(P052);
+       glNormal3fv(N051);
+       glVertex3fv(P051);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N042);
+       glVertex3fv(P042);
+       glNormal3fv(N033);
+       glVertex3fv(P033);
+       glNormal3fv(N043);
+       glVertex3fv(P043);
+       glNormal3fv(N052);
+       glVertex3fv(P052);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N033);
+       glVertex3fv(P033);
+       glNormal3fv(N034);
+       glVertex3fv(P034);
+       glNormal3fv(N044);
+       glVertex3fv(P044);
+       glNormal3fv(N043);
+       glVertex3fv(P043);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N034);
+       glVertex3fv(P034);
+       glNormal3fv(N035);
+       glVertex3fv(P035);
+       glNormal3fv(N045);
+       glVertex3fv(P045);
+       glNormal3fv(N044);
+       glVertex3fv(P044);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N035);
+       glVertex3fv(P035);
+       glNormal3fv(N036);
+       glVertex3fv(P036);
+       glNormal3fv(N046);
+       glVertex3fv(P046);
+       glNormal3fv(N045);
+       glVertex3fv(P045);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N036);
+       glVertex3fv(P036);
+       glNormal3fv(N037);
+       glVertex3fv(P037);
+       glNormal3fv(N047);
+       glVertex3fv(P047);
+       glNormal3fv(N046);
+       glVertex3fv(P046);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N037);
+       glVertex3fv(P037);
+       glNormal3fv(N038);
+       glVertex3fv(P038);
+       glNormal3fv(N048);
+       glVertex3fv(P048);
+       glNormal3fv(N047);
+       glVertex3fv(P047);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N038);
+       glVertex3fv(P038);
+       glNormal3fv(N039);
+       glVertex3fv(P039);
+       glNormal3fv(N049);
+       glVertex3fv(P049);
+       glNormal3fv(N048);
+       glVertex3fv(P048);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N039);
+       glVertex3fv(P039);
+       glNormal3fv(N040);
+       glVertex3fv(P040);
+       glNormal3fv(N050);
+       glVertex3fv(P050);
+       glNormal3fv(N049);
+       glVertex3fv(P049);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N070);
+       glVertex3fv(P070);
+       glNormal3fv(N061);
+       glVertex3fv(P061);
+       glNormal3fv(N002);
+       glVertex3fv(P002);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N061);
+       glVertex3fv(P061);
+       glNormal3fv(N046);
+       glVertex3fv(P046);
+       glNormal3fv(N002);
+       glVertex3fv(P002);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N045);
+       glVertex3fv(P045);
+       glNormal3fv(N046);
+       glVertex3fv(P046);
+       glNormal3fv(N061);
+       glVertex3fv(P061);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N002);
+       glVertex3fv(P002);
+       glNormal3fv(N061);
+       glVertex3fv(P061);
+       glNormal3fv(N070);
+       glVertex3fv(P070);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N002);
+       glVertex3fv(P002);
+       glNormal3fv(N045);
+       glVertex3fv(P045);
+       glNormal3fv(N061);
+       glVertex3fv(P061);
+       glEnd();
+}
+
+static void
+Fish005(GLenum cap)
+{
+       glBegin(cap);
+       glNormal3fv(N002);
+       glVertex3fv(P002);
+       glNormal3fv(N044);
+       glVertex3fv(P044);
+       glNormal3fv(N045);
+       glVertex3fv(P045);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N002);
+       glVertex3fv(P002);
+       glNormal3fv(N043);
+       glVertex3fv(P043);
+       glNormal3fv(N044);
+       glVertex3fv(P044);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N002);
+       glVertex3fv(P002);
+       glNormal3fv(N052);
+       glVertex3fv(P052);
+       glNormal3fv(N043);
+       glVertex3fv(P043);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N002);
+       glVertex3fv(P002);
+       glNormal3fv(N051);
+       glVertex3fv(P051);
+       glNormal3fv(N052);
+       glVertex3fv(P052);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N002);
+       glVertex3fv(P002);
+       glNormal3fv(N046);
+       glVertex3fv(P046);
+       glNormal3fv(N047);
+       glVertex3fv(P047);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N002);
+       glVertex3fv(P002);
+       glNormal3fv(N047);
+       glVertex3fv(P047);
+       glNormal3fv(N048);
+       glVertex3fv(P048);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N002);
+       glVertex3fv(P002);
+       glNormal3fv(N048);
+       glVertex3fv(P048);
+       glNormal3fv(N049);
+       glVertex3fv(P049);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N002);
+       glVertex3fv(P002);
+       glNormal3fv(N049);
+       glVertex3fv(P049);
+       glNormal3fv(N050);
+       glVertex3fv(P050);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N050);
+       glVertex3fv(P050);
+       glNormal3fv(N051);
+       glVertex3fv(P051);
+       glNormal3fv(N069);
+       glVertex3fv(P069);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N051);
+       glVertex3fv(P051);
+       glNormal3fv(N002);
+       glVertex3fv(P002);
+       glNormal3fv(N069);
+       glVertex3fv(P069);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N050);
+       glVertex3fv(P050);
+       glNormal3fv(N069);
+       glVertex3fv(P069);
+       glNormal3fv(N002);
+       glVertex3fv(P002);
+       glEnd();
+}
+
+static void
+Fish006(GLenum cap)
+{
+       glBegin(cap);
+       glNormal3fv(N066);
+       glVertex3fv(P066);
+       glNormal3fv(N016);
+       glVertex3fv(P016);
+       glNormal3fv(N026);
+       glVertex3fv(P026);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N015);
+       glVertex3fv(P015);
+       glNormal3fv(N066);
+       glVertex3fv(P066);
+       glNormal3fv(N025);
+       glVertex3fv(P025);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N025);
+       glVertex3fv(P025);
+       glNormal3fv(N066);
+       glVertex3fv(P066);
+       glNormal3fv(N026);
+       glVertex3fv(P026);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N066);
+       glVertex3fv(P066);
+       glNormal3fv(N058);
+       glVertex3fv(P058);
+       glNormal3fv(N016);
+       glVertex3fv(P016);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N015);
+       glVertex3fv(P015);
+       glNormal3fv(N058);
+       glVertex3fv(P058);
+       glNormal3fv(N066);
+       glVertex3fv(P066);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N058);
+       glVertex3fv(P058);
+       glNormal3fv(N015);
+       glVertex3fv(P015);
+       glNormal3fv(N016);
+       glVertex3fv(P016);
+       glEnd();
+}
+
+static void
+Fish007(GLenum cap)
+{
+       glBegin(cap);
+       glNormal3fv(N062);
+       glVertex3fv(P062);
+       glNormal3fv(N022);
+       glVertex3fv(P022);
+       glNormal3fv(N032);
+       glVertex3fv(P032);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N062);
+       glVertex3fv(P062);
+       glNormal3fv(N032);
+       glVertex3fv(P032);
+       glNormal3fv(N064);
+       glVertex3fv(P064);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N022);
+       glVertex3fv(P022);
+       glNormal3fv(N062);
+       glVertex3fv(P062);
+       glNormal3fv(N032);
+       glVertex3fv(P032);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N062);
+       glVertex3fv(P062);
+       glNormal3fv(N064);
+       glVertex3fv(P064);
+       glNormal3fv(N032);
+       glVertex3fv(P032);
+       glEnd();
+}
+
+static void
+Fish008(GLenum cap)
+{
+       glBegin(cap);
+       glNormal3fv(N063);
+       glVertex3fv(P063);
+       glNormal3fv(N019);
+       glVertex3fv(P019);
+       glNormal3fv(N029);
+       glVertex3fv(P029);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N019);
+       glVertex3fv(P019);
+       glNormal3fv(N063);
+       glVertex3fv(P063);
+       glNormal3fv(N029);
+       glVertex3fv(P029);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N063);
+       glVertex3fv(P063);
+       glNormal3fv(N029);
+       glVertex3fv(P029);
+       glNormal3fv(N065);
+       glVertex3fv(P065);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N063);
+       glVertex3fv(P063);
+       glNormal3fv(N065);
+       glVertex3fv(P065);
+       glNormal3fv(N029);
+       glVertex3fv(P029);
+       glEnd();
+}
+
+static void
+Fish009(GLenum cap)
+{
+       glBegin(cap);
+       glVertex3fv(P059);
+       glVertex3fv(P012);
+       glVertex3fv(P009);
+       glVertex3fv(P060);
+       glEnd();
+       glBegin(cap);
+       glVertex3fv(P012);
+       glVertex3fv(P004);
+       glVertex3fv(P007);
+       glVertex3fv(P009);
+       glEnd();
+}
+
+static void
+Fish_1(GLenum cap)
+{
+       Fish004(cap);
+       Fish005(cap);
+       Fish003(cap);
+       Fish007(cap);
+       Fish006(cap);
+       Fish002(cap);
+       Fish008(cap);
+       Fish009(cap);
+       Fish001(cap);
+}
+
+static void
+Fish_2(GLenum cap)
+{
+       Fish005(cap);
+       Fish004(cap);
+       Fish003(cap);
+       Fish008(cap);
+       Fish006(cap);
+       Fish002(cap);
+       Fish007(cap);
+       Fish009(cap);
+       Fish001(cap);
+}
+
+static void
+Fish_3(GLenum cap)
+{
+       Fish005(cap);
+       Fish004(cap);
+       Fish007(cap);
+       Fish003(cap);
+       Fish002(cap);
+       Fish008(cap);
+       Fish009(cap);
+       Fish001(cap);
+       Fish006(cap);
+}
+
+static void
+Fish_4(GLenum cap)
+{
+       Fish005(cap);
+       Fish004(cap);
+       Fish008(cap);
+       Fish003(cap);
+       Fish002(cap);
+       Fish007(cap);
+       Fish009(cap);
+       Fish001(cap);
+       Fish006(cap);
+}
+
+static void
+Fish_5(GLenum cap)
+{
+       Fish009(cap);
+       Fish006(cap);
+       Fish007(cap);
+       Fish001(cap);
+       Fish002(cap);
+       Fish003(cap);
+       Fish008(cap);
+       Fish004(cap);
+       Fish005(cap);
+}
+
+static void
+Fish_6(GLenum cap)
+{
+       Fish009(cap);
+       Fish006(cap);
+       Fish008(cap);
+       Fish001(cap);
+       Fish002(cap);
+       Fish007(cap);
+       Fish003(cap);
+       Fish004(cap);
+       Fish005(cap);
+}
+
+static void
+Fish_7(GLenum cap)
+{
+       Fish009(cap);
+       Fish001(cap);
+       Fish007(cap);
+       Fish005(cap);
+       Fish002(cap);
+       Fish008(cap);
+       Fish003(cap);
+       Fish004(cap);
+       Fish006(cap);
+}
+
+static void
+Fish_8(GLenum cap)
+{
+       Fish009(cap);
+       Fish008(cap);
+       Fish001(cap);
+       Fish002(cap);
+       Fish007(cap);
+       Fish003(cap);
+       Fish005(cap);
+       Fish004(cap);
+       Fish006(cap);
+}
+
+void
+DrawShark(fishRec * fish, int wire)
+{
+       float       mat[4][4];
+       int         n;
+       float       seg1, seg2, seg3, seg4, segup;
+       float       thrash, chomp;
+       GLenum      cap;
+
+       fish->htail = (int) (fish->htail - (int) (5.0 * fish->v)) % 360;
+
+       thrash = 50.0 * fish->v;
+
+       seg1 = 0.6 * thrash * sin(fish->htail * RRAD);
+       seg2 = 1.8 * thrash * sin((fish->htail + 45.0) * RRAD);
+       seg3 = 3.0 * thrash * sin((fish->htail + 90.0) * RRAD);
+       seg4 = 4.0 * thrash * sin((fish->htail + 110.0) * RRAD);
+
+       chomp = 0.0;
+       if (fish->v > 2.0) {
+               chomp = -(fish->v - 2.0) * 200.0;
+       }
+       P004[1] = iP004[1] + chomp;
+       P007[1] = iP007[1] + chomp;
+       P010[1] = iP010[1] + chomp;
+       P011[1] = iP011[1] + chomp;
+
+       P023[0] = iP023[0] + seg1;
+       P024[0] = iP024[0] + seg1;
+       P025[0] = iP025[0] + seg1;
+       P026[0] = iP026[0] + seg1;
+       P027[0] = iP027[0] + seg1;
+       P028[0] = iP028[0] + seg1;
+       P029[0] = iP029[0] + seg1;
+       P030[0] = iP030[0] + seg1;
+       P031[0] = iP031[0] + seg1;
+       P032[0] = iP032[0] + seg1;
+       P033[0] = iP033[0] + seg2;
+       P034[0] = iP034[0] + seg2;
+       P035[0] = iP035[0] + seg2;
+       P036[0] = iP036[0] + seg2;
+       P037[0] = iP037[0] + seg2;
+       P038[0] = iP038[0] + seg2;
+       P039[0] = iP039[0] + seg2;
+       P040[0] = iP040[0] + seg2;
+       P041[0] = iP041[0] + seg2;
+       P042[0] = iP042[0] + seg2;
+       P043[0] = iP043[0] + seg3;
+       P044[0] = iP044[0] + seg3;
+       P045[0] = iP045[0] + seg3;
+       P046[0] = iP046[0] + seg3;
+       P047[0] = iP047[0] + seg3;
+       P048[0] = iP048[0] + seg3;
+       P049[0] = iP049[0] + seg3;
+       P050[0] = iP050[0] + seg3;
+       P051[0] = iP051[0] + seg3;
+       P052[0] = iP052[0] + seg3;
+       P002[0] = iP002[0] + seg4;
+       P061[0] = iP061[0] + seg4;
+       P069[0] = iP069[0] + seg4;
+       P070[0] = iP070[0] + seg4;
+
+       fish->vtail += ((fish->dtheta - fish->vtail) * 0.1);
+
+       if (fish->vtail > 0.5) {
+               fish->vtail = 0.5;
+       } else if (fish->vtail < -0.5) {
+               fish->vtail = -0.5;
+       }
+       segup = thrash * fish->vtail;
+
+       P023[1] = iP023[1] + segup;
+       P024[1] = iP024[1] + segup;
+       P025[1] = iP025[1] + segup;
+       P026[1] = iP026[1] + segup;
+       P027[1] = iP027[1] + segup;
+       P028[1] = iP028[1] + segup;
+       P029[1] = iP029[1] + segup;
+       P030[1] = iP030[1] + segup;
+       P031[1] = iP031[1] + segup;
+       P032[1] = iP032[1] + segup;
+       P033[1] = iP033[1] + segup * 5.0;
+       P034[1] = iP034[1] + segup * 5.0;
+       P035[1] = iP035[1] + segup * 5.0;
+       P036[1] = iP036[1] + segup * 5.0;
+       P037[1] = iP037[1] + segup * 5.0;
+       P038[1] = iP038[1] + segup * 5.0;
+       P039[1] = iP039[1] + segup * 5.0;
+       P040[1] = iP040[1] + segup * 5.0;
+       P041[1] = iP041[1] + segup * 5.0;
+       P042[1] = iP042[1] + segup * 5.0;
+       P043[1] = iP043[1] + segup * 12.0;
+       P044[1] = iP044[1] + segup * 12.0;
+       P045[1] = iP045[1] + segup * 12.0;
+       P046[1] = iP046[1] + segup * 12.0;
+       P047[1] = iP047[1] + segup * 12.0;
+       P048[1] = iP048[1] + segup * 12.0;
+       P049[1] = iP049[1] + segup * 12.0;
+       P050[1] = iP050[1] + segup * 12.0;
+       P051[1] = iP051[1] + segup * 12.0;
+       P052[1] = iP052[1] + segup * 12.0;
+       P002[1] = iP002[1] + segup * 17.0;
+       P061[1] = iP061[1] + segup * 17.0;
+       P069[1] = iP069[1] + segup * 17.0;
+       P070[1] = iP070[1] + segup * 17.0;
+
+       glPushMatrix();
+
+       glTranslatef(0.0, 0.0, -3000.0);
+
+       glGetFloatv(GL_MODELVIEW_MATRIX, &mat[0][0]);
+       n = 0;
+       if (mat[0][2] >= 0.0) {
+               n += 1;
+       }
+       if (mat[1][2] >= 0.0) {
+               n += 2;
+       }
+       if (mat[2][2] >= 0.0) {
+               n += 4;
+       }
+       glScalef(2.0, 1.0, 1.0);
+
+       glEnable(GL_CULL_FACE);
+       cap = wire ? GL_LINE_LOOP : GL_POLYGON;
+       switch (n) {
+               case 0:
+                       Fish_1(cap);
+                       break;
+               case 1:
+                       Fish_2(cap);
+                       break;
+               case 2:
+                       Fish_3(cap);
+                       break;
+               case 3:
+                       Fish_4(cap);
+                       break;
+               case 4:
+                       Fish_5(cap);
+                       break;
+               case 5:
+                       Fish_6(cap);
+                       break;
+               case 6:
+                       Fish_7(cap);
+                       break;
+               case 7:
+                       Fish_8(cap);
+                       break;
+       }
+       glDisable(GL_CULL_FACE);
+
+       glPopMatrix();
+}
+#endif
diff --git a/hacks/glx/sproingies.c b/hacks/glx/sproingies.c
new file mode 100644 (file)
index 0000000..aa79045
--- /dev/null
@@ -0,0 +1,827 @@
+/* -*- Mode: C; tab-width: 4 -*- */
+/* sproingies.c - 3D sproingies */
+
+#if !defined( lint ) && !defined( SABER )
+static const char sccsid[] = "@(#)sproingies.c 4.04 97/07/28 xlockmore";
+
+#endif
+
+/*-
+ *  sproingies.c - Copyright 1996 by Ed Mackey, freely distributable.
+ *
+ * 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.
+ *
+ * This file is provided AS IS with no warranties of any kind.  The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof.  In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * Revision History:
+ * 07-Dec-96: Written.
+ */
+
+#ifdef STANDALONE
+# include "xlockmoreI.h"               /* from the xscreensaver distribution */
+#else /* !STANDALONE */
+# include "xlock.h"            /* from the xlockmore distribution */
+#endif /* !STANDALONE */
+
+#ifdef USE_GL
+
+#include <GL/gl.h>
+#include <GL/glu.h>
+#include "buildlwo.h"
+
+#define MAXSPROING 100
+#define T_COUNT 40
+#define BOOM_FRAME 50
+
+struct sPosColor {
+       int         x, y, z, frame, life;
+       GLfloat     r, g, b;
+};
+
+typedef struct {
+       int         rotx, roty, dist, wireframe, flatshade, groundlevel,
+                   maxsproingies, mono;
+       int         sframe, target_rx, target_ry, target_dist, target_count;
+       GLuint      sproingies[6], TopsSides, SproingieBoom;
+       struct sPosColor *positions;
+} sp_instance;
+
+static sp_instance *si_list = NULL;
+static int  active_screens = 0;
+
+void        SproingieSwap(void);
+
+extern struct lwo LWO_s1_1, LWO_s1_2, LWO_s1_3, LWO_s1_4;
+extern struct lwo LWO_s1_5, LWO_s1_6, LWO_s1_b;
+
+static int
+myrand(int range)
+{
+       return ((int) (((float) range) * LRAND() / (MAXRAND)));
+}
+
+static      GLuint
+build_TopsSides(int wireframe)
+{
+       GLuint      dl_num;
+       GLfloat     mat_color[4] =
+       {0.0, 0.0, 0.0, 1.0};
+
+       dl_num = glGenLists(2);
+       if (!dl_num)
+               return (0);     /* 0 means out of display lists. */
+
+       /* Surface: Tops */
+       glNewList(dl_num, GL_COMPILE);
+       mat_color[0] = 0.392157;
+       mat_color[1] = 0.784314;
+       mat_color[2] = 0.941176;
+       if (wireframe)
+               glColor3fv(mat_color);
+       else {
+               glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, mat_color);
+       }
+       glEndList();
+
+       /* Surface: Sides */
+       glNewList(dl_num + 1, GL_COMPILE);
+       mat_color[0] = 0.156863;
+       mat_color[1] = 0.156863;
+       mat_color[2] = 0.392157;
+       if (wireframe)
+               glColor3fv(mat_color);
+       else {
+               glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, mat_color);
+       }
+       glEndList();
+       return (dl_num);
+}
+
+static void
+LayGround(int sx, int sy, int sz, int width, int height, sp_instance * si)
+{
+       int         x, y, z, w, h;
+       GLenum      begin_polygon;
+
+       if (si->wireframe)
+               begin_polygon = GL_LINE_LOOP;
+       else
+               begin_polygon = GL_POLYGON;
+
+       if (!si->wireframe) {
+               if (!si->mono)
+                       glCallList(si->TopsSides);      /* Render the tops */
+               glNormal3f(0.0, 1.0, 0.0);
+
+               for (h = 0; h < height; ++h) {
+                       x = sx + h;
+                       y = sy - (h << 1);
+                       z = sz + h;
+                       for (w = 0; w < width; ++w) {
+                               glBegin(begin_polygon);
+                               glVertex3i(x, y, z);
+                               glVertex3i(x, y, z - 1);
+                               glVertex3i(x + 1, y, z - 1);
+                               glVertex3i(x + 1, y, z);
+                               glEnd();
+                               glBegin(begin_polygon);
+                               glVertex3i(x + 1, y - 1, z);
+                               glVertex3i(x + 1, y - 1, z - 1);
+                               glVertex3i(x + 2, y - 1, z - 1);
+                               glVertex3i(x + 2, y - 1, z);
+                               glEnd();
+                               ++x;
+                               --z;
+                       }
+               }
+       }
+       if (!si->mono)
+               glCallList(si->TopsSides + 1);  /* Render the sides */
+       if (!si->wireframe)
+               glNormal3f(0.0, 0.0, 1.0);
+
+       for (h = 0; h < height; ++h) {
+               x = sx + h;
+               y = sy - (h << 1);
+               z = sz + h;
+               for (w = 0; w < width; ++w) {
+                       glBegin(begin_polygon);
+                       glVertex3i(x, y, z);
+                       glVertex3i(x + 1, y, z);
+                       glVertex3i(x + 1, y - 1, z);
+                       glVertex3i(x, y - 1, z);
+                       glEnd();
+                       glBegin(begin_polygon);
+                       glVertex3i(x + 1, y - 1, z);
+                       glVertex3i(x + 2, y - 1, z);
+                       glVertex3i(x + 2, y - 2, z);
+                       glVertex3i(x + 1, y - 2, z);
+/*-
+ * PURIFY 4.0.1 reports an unitialized memory read on the next line when using
+ * MesaGL 2.2 and -mono.  This has been fixed in MesaGL 2.3 and later. */
+                       glEnd();
+                       ++x;
+                       --z;
+               }
+       }
+
+       /* Render the other sides */
+       if (!si->wireframe)
+               glNormal3f(1.0, 0.0, 0.0);
+
+       for (h = 0; h < height; ++h) {
+               x = sx + h;
+               y = sy - (h << 1);
+               z = sz + h;
+               for (w = 0; w < width; ++w) {
+                       glBegin(begin_polygon);
+                       glVertex3i(x + 1, y, z);
+                       glVertex3i(x + 1, y, z - 1);
+                       glVertex3i(x + 1, y - 1, z - 1);
+                       glVertex3i(x + 1, y - 1, z);
+                       glEnd();
+                       glBegin(begin_polygon);
+                       glVertex3i(x + 2, y - 1, z);
+                       glVertex3i(x + 2, y - 1, z - 1);
+                       glVertex3i(x + 2, y - 2, z - 1);
+                       glVertex3i(x + 2, y - 2, z);
+                       glEnd();
+                       ++x;
+                       --z;
+               }
+       }
+
+       if (si->wireframe) {
+               if (!si->mono)
+                       glCallList(si->TopsSides);      /* Render the tops */
+
+               for (h = 0; h < height; ++h) {
+                       x = sx + h;
+                       y = sy - (h << 1);
+                       z = sz + h;
+                       for (w = 0; w < width; ++w) {
+                               glBegin(begin_polygon);
+                               glVertex3i(x, y, z);
+                               glVertex3i(x, y, z - 1);
+                               glVertex3i(x + 1, y, z - 1);
+                               glVertex3i(x + 1, y, z);
+                               glEnd();
+                               glBegin(begin_polygon);
+                               glVertex3i(x + 1, y - 1, z);
+                               glVertex3i(x + 1, y - 1, z - 1);
+                               glVertex3i(x + 2, y - 1, z - 1);
+                               glVertex3i(x + 2, y - 1, z);
+                               glEnd();
+                               ++x;
+                               --z;
+                       }
+               }
+       }
+}
+
+#define RESET_SPROINGIE (-30 + myrand(28))
+
+static void
+AdvanceSproingie(int t, sp_instance * si)
+{
+       int         g_higher, g_back, t2;
+       struct sPosColor *thisSproingie = &(si->positions[t]);
+       struct sPosColor *S2 = &(si->positions[0]);
+
+       if (thisSproingie->life > 0) {
+               if ((++(thisSproingie->frame)) > 11) {
+                       if (thisSproingie->frame >= BOOM_FRAME) {
+                               if ((thisSproingie->r -= 0.08) < 0.0)
+                                       thisSproingie->r = 0.0;
+                               if ((thisSproingie->g -= 0.08) < 0.0)
+                                       thisSproingie->g = 0.0;
+                               if ((thisSproingie->b -= 0.08) < 0.0)
+                                       thisSproingie->b = 0.0;
+                               if ((--(thisSproingie->life)) < 1) {
+                                       thisSproingie->life = RESET_SPROINGIE;
+                               }
+                               return;
+                       }
+                       thisSproingie->x += 1;
+                       thisSproingie->y -= 2;
+                       thisSproingie->z += 1;
+                       thisSproingie->frame = 0;
+
+                       for (t2 = 0; t2 < si->maxsproingies; ++t2) {
+                               if ((t2 != t) && (thisSproingie->x == S2->x) &&
+                                   (thisSproingie->y == S2->y) && (thisSproingie->z == S2->z) &&
+                                   (S2->life > 10) && (S2->frame < 6)) {
+#if 0
+                                       if (thisSproingie->life > S2->life) {
+                                               S2->life = 10;
+                                       } else {
+#endif
+                                               if (thisSproingie->life > 10) {
+                                                       thisSproingie->life = 10;
+                                                       thisSproingie->frame = BOOM_FRAME;
+                                                       if ((thisSproingie->r += 0.5) > 1.0)
+                                                               thisSproingie->r = 1.0;
+                                                       if ((thisSproingie->g += 0.5) > 1.0)
+                                                               thisSproingie->g = 1.0;
+                                                       if ((thisSproingie->b += 0.5) > 1.0)
+                                                               thisSproingie->b = 1.0;
+                                               }
+#if 0
+                                       }
+#endif
+                               }
+                               ++S2;
+                       }
+               }
+               if (!((thisSproingie->life == 10) &&
+                     (thisSproingie->frame > 0) &&
+                     (thisSproingie->frame < BOOM_FRAME))) {
+                       if ((--(thisSproingie->life)) < 1) {
+                               thisSproingie->life = RESET_SPROINGIE;
+                       } else if (thisSproingie->life < 9) {
+                               thisSproingie->frame -= 2;
+                       }
+               }               /* else wait here for frame 0 to come about. */
+       } else if (++(thisSproingie->life) >= 0) {
+               if (t > 1) {
+                       g_higher = -3 + myrand(5);
+                       g_back = -2 + myrand(5);
+               } else if (t == 1) {
+                       g_higher = -2 + myrand(3);
+                       g_back = -1 + myrand(3);
+               } else {
+                       g_higher = -1;
+                       g_back = 0;
+               }
+
+               thisSproingie->x = (-g_higher - g_back);
+               thisSproingie->y = (g_higher << 1);
+               thisSproingie->z = (g_back - g_higher);
+               thisSproingie->life = 40 + myrand(200);
+               thisSproingie->frame = -10;
+               thisSproingie->r = (GLfloat) (40 + myrand(200)) / 255.0;
+               thisSproingie->g = (GLfloat) (40 + myrand(200)) / 255.0;
+               thisSproingie->b = (GLfloat) (40 + myrand(200)) / 255.0;
+
+               for (t2 = 0; t2 < si->maxsproingies; ++t2) {
+                       if ((t2 != t) && (thisSproingie->x == S2->x) &&
+                           (thisSproingie->y == S2->y) && (thisSproingie->z == S2->z) &&
+                           (S2->life > 10) && (S2->frame < 0)) {
+                               /* If one is already being born, just wait. */
+                               thisSproingie->life = -1;
+                       }
+                       ++S2;
+               }
+       }
+}
+
+static void
+NextSproingie(int screen)
+{
+       sp_instance *si = &si_list[screen];
+       int         ddx, t;
+       struct sPosColor *thisSproingie = &(si->positions[0]);
+
+       if (++si->sframe > 11) {
+               si->sframe = 0;
+               for (t = 0; t < si->maxsproingies; ++t) {
+                       thisSproingie->x -= 1;
+                       thisSproingie->y += 2;
+                       thisSproingie->z -= 1;
+                       ++thisSproingie;
+               }
+       }
+       for (t = 0; t < si->maxsproingies; ++t) {
+               AdvanceSproingie(t, si);
+       }
+
+       if (si->target_count < 0) {     /* track to current target */
+               if (si->target_rx < si->rotx)
+                       --si->rotx;
+               else if (si->target_rx > si->rotx)
+                       ++si->rotx;
+
+               if (si->target_ry < si->roty)
+                       --si->roty;
+               else if (si->target_ry > si->roty)
+                       ++si->roty;
+
+               ddx = (si->target_dist - si->dist) / 8;
+               if (ddx)
+                       si->dist += ddx;
+               else if (si->target_dist < si->dist)
+                       --si->dist;
+               else if (si->target_dist > si->dist)
+                       ++si->dist;
+
+               if ((si->target_rx == si->rotx) && (si->target_ry == si->roty) &&
+                   (si->target_dist == si->dist)) {
+                       si->target_count = T_COUNT;
+                       if (si->target_dist <= 32)
+                               si->target_count >>= 2;
+               }
+       } else if (--si->target_count < 0) {    /* make up new target */
+               si->target_rx = myrand(100) - 35;
+               si->target_ry = -myrand(90);
+               si->target_dist = 32 << myrand(2);      /* could be 32, 64, or 128, (previously or 256) */
+
+               if (si->target_dist >= si->dist)        /* no duplicate distances */
+                       si->target_dist <<= 1;
+       }
+       /* Otherwise just hang loose for a while here */
+}
+
+#ifdef __AUXFUNCS__
+void
+PrintEm(void)
+{
+       int         t, count = 0;
+
+       for (t = 0; t < maxsproingies; ++t) {
+               if (positions[t].life > 0)
+                       ++count;
+       }
+       (void) printf("RotX: %d, RotY: %d, Dist: %d.  Targets: X %d, Y %d, D %d.  Visible: %d\n",
+                rotx, roty, dist, target_rx, target_ry, target_dist, count);
+}
+
+void
+ResetEm(void)
+{
+       int         t;
+
+       for (t = 0; t < maxsproingies; ++t) {
+               positions[t].x = 0;
+               positions[t].y = 0;
+               positions[t].z = 0;
+               positions[t].life = -2;
+               positions[t].frame = 0;
+       }
+}
+
+void
+distAdd(void)
+{
+       if (dist < (1 << 16 << 4))
+               dist <<= 1;
+}
+
+void
+distSubtract(void)
+{
+       if (dist > 1)
+               dist >>= 1;
+}
+
+void
+rotxAdd(void)
+{
+       rotx = (rotx + 5) % 360;
+}
+
+void
+rotxSubtract(void)
+{
+       rotx = (rotx - 5) % 360;
+}
+
+void
+rotyAdd(void)
+{
+       roty = (roty + 5) % 360;
+}
+
+void
+rotySubtract(void)
+{
+       roty = (roty - 5) % 360;
+}
+
+void
+rotxBAdd(void)
+{
+       rotx = (rotx + 45) % 360;
+}
+
+void
+rotxBSubtract(void)
+{
+       rotx = (rotx - 45) % 360;
+}
+
+void
+rotyBAdd(void)
+{
+       roty = (roty + 45) % 360;
+}
+
+void
+rotyBSubtract(void)
+{
+       roty = (roty - 45) % 360;
+}
+
+#endif
+
+static void
+RenderSproingie(int t, sp_instance * si)
+{
+       GLfloat     scale, pointsize, mat_color[4] =
+       {0.0, 0.0, 0.0, 1.0};
+       GLdouble    clipplane[4] =
+       {0.0, 1.0, 0.0, 0.0};
+       struct sPosColor *thisSproingie = &(si->positions[t]);
+
+       if (thisSproingie->life < 1)
+               return;
+
+       glPushMatrix();
+
+       if (!si->mono) {
+               mat_color[0] = thisSproingie->r;
+               mat_color[1] = thisSproingie->g;
+               mat_color[2] = thisSproingie->b;
+               if (si->wireframe)
+                       glColor3fv(mat_color);
+               else {
+                       glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, mat_color);
+               }
+       }
+       if (thisSproingie->frame < 0) {
+               glEnable(GL_CLIP_PLANE0);
+               glTranslatef((GLfloat) (thisSproingie->x),
+                            (GLfloat) (thisSproingie->y) +
+                            ((GLfloat) (thisSproingie->frame) / 9.0),
+                            (GLfloat) (thisSproingie->z));
+               clipplane[3] = ((GLdouble) (thisSproingie->frame) / 9.0) +
+                       (si->wireframe ? 0.0 : 0.1);
+               glClipPlane(GL_CLIP_PLANE0, clipplane);
+               glCallList(si->sproingies[0]);
+               glDisable(GL_CLIP_PLANE0);
+       } else if (thisSproingie->frame >= BOOM_FRAME) {
+               glTranslatef((GLfloat) (thisSproingie->x) + 0.5,
+                            (GLfloat) (thisSproingie->y) + 0.5,
+                            (GLfloat) (thisSproingie->z) - 0.5);
+               scale = (GLfloat) (1 << (thisSproingie->frame - BOOM_FRAME));
+               glScalef(scale, scale, scale);
+               if (!si->wireframe) {
+                       if (!si->mono)
+                               glColor3fv(mat_color);
+                       glDisable(GL_LIGHTING);
+               }
+               pointsize = (GLfloat) ((BOOM_FRAME + 8) - thisSproingie->frame) -
+                       (si->dist / 64.0);
+               glPointSize((pointsize < 1.0) ? 1.0 : pointsize);
+/*-
+ * PURIFY 4.0.1 reports an unitialized memory read on the next line when using
+ * MesaGL 2.2.  This has been tracked to MesaGL 2.2 src/points.c line 313. */
+               glCallList(si->SproingieBoom);
+               glPointSize(1.0);
+               if (!si->wireframe) {
+                       glEnable(GL_LIGHTING);
+               }
+       } else if (thisSproingie->frame > 5) {
+               glTranslatef((GLfloat) (thisSproingie->x + 1),
+                            (GLfloat) (thisSproingie->y - 1), (GLfloat) (thisSproingie->z - 1));
+               glRotatef((GLfloat) - 90.0, 0.0, 1.0, 0.0);
+               glCallList(si->sproingies[thisSproingie->frame - 6]);
+       } else {
+               glTranslatef((GLfloat) (thisSproingie->x), (GLfloat) (thisSproingie->y),
+                            (GLfloat) (thisSproingie->z));
+               glCallList(si->sproingies[thisSproingie->frame]);
+       }
+
+       glPopMatrix();
+
+}
+
+static void
+ComputeGround(sp_instance * si)
+{
+       int         g_higher, g_back, g_width, g_height;
+
+       /* higher: x-1, y+2, z-1 */
+       /* back: x-1, y, z+1 */
+
+       if (si->groundlevel == 0) {
+               g_back = 2;
+               g_width = 5;
+       } else if (si->groundlevel == 1) {
+               g_back = 4;
+               g_width = 8;
+       } else {
+               g_back = 8;
+               g_width = 16;
+       }
+
+       if ((g_higher = si->dist >> 3) < 4)
+               g_higher = 4;
+       if (g_higher > 16)
+               g_higher = 16;
+       g_height = g_higher << 1;
+
+       if (si->rotx < -10)
+               g_higher += (g_higher >> 2);
+       else if (si->rotx > 10)
+               g_higher -= (g_higher >> 2);
+
+#if 0
+       if (si->dist > 128) {
+               ++g_higher;
+               ++g_back;
+               g_back <<= 1;
+       } else if (si->dist > 64) {
+               ++g_higher;
+               ++g_back;
+       } else if (si->dist > 32) {
+               /* nothing special */
+       } else {
+               if (g_higher > 2) {
+                       g_higher = g_back = 4;
+               }
+       }
+#endif
+
+       /* startx, starty, startz, width, height */
+       LayGround((-g_higher - g_back), (g_higher << 1), (g_back - g_higher),
+                 (g_width), (g_height), si);
+}
+
+void
+DisplaySproingies(int screen)
+{
+       sp_instance *si = &si_list[screen];
+       int         t;
+       GLfloat     position[] =
+       {8.0, 5.0, -2.0, 0.1};
+
+       if (si->wireframe)
+               glClear(GL_COLOR_BUFFER_BIT);
+       else
+               glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+       glPushMatrix();
+       glTranslatef(0.0, 0.0, -(GLfloat) (si->dist) / 16.0);   /* viewing transform  */
+       glRotatef((GLfloat) si->rotx, 1.0, 0.0, 0.0);
+       glRotatef((GLfloat) si->roty, 0.0, 1.0, 0.0);
+
+       if (!si->wireframe)
+               glLightfv(GL_LIGHT0, GL_POSITION, position);
+
+#if 0                          /* Show light pos */
+       glPushMatrix();
+       glTranslatef(position[0], position[1], position[2]);
+       glColor3f(1.0, 1.0, 1.0);
+       if (!si->wireframe) {
+               glDisable(GL_LIGHTING);
+       }
+       glCallList(si->SproingieBoom);
+       if (!si->wireframe) {
+               glEnable(GL_LIGHTING);
+       }
+       glPopMatrix();
+#endif
+
+       glTranslatef((GLfloat) si->sframe * (-1.0 / 12.0) - 0.75,
+                    (GLfloat) si->sframe * (2.0 / 12.0) - 0.5,
+                    (GLfloat) si->sframe * (-1.0 / 12.0) + 0.75);
+
+       if (si->wireframe)
+               ComputeGround(si);
+
+       for (t = 0; t < si->maxsproingies; ++t) {
+               RenderSproingie(t, si);
+       }
+
+       if (!si->wireframe)
+               ComputeGround(si);
+
+       glPopMatrix();
+       glFlush();
+
+       SproingieSwap();
+}
+
+void
+NextSproingieDisplay(int screen)
+{
+       NextSproingie(screen);
+       DisplaySproingies(screen);
+}
+
+#if 0
+void
+ReshapeSproingies(int w, int h)
+{
+       glViewport(0, 0, w, h);
+       glMatrixMode(GL_PROJECTION);
+       glLoadIdentity();
+       gluPerspective(65.0, (GLfloat) w / (GLfloat) h, 0.1, 2000.0);   /* was 200000.0 */
+       glMatrixMode(GL_MODELVIEW);
+       glLoadIdentity();
+}
+
+#endif
+
+void
+CleanupSproingies(int screen)
+{
+       sp_instance *si = &si_list[screen];
+       int         t;
+
+       if (si->SproingieBoom) {
+               for (t = 0; t < 6; ++t)
+                       glDeleteLists(si->sproingies[t], 1);
+
+               glDeleteLists(si->TopsSides, 2);
+               glDeleteLists(si->SproingieBoom, 1);
+
+               --active_screens;
+               si->SproingieBoom = 0;
+       }
+       if (si->positions) {
+               (void) free((void *) (si->positions));
+               si->positions = NULL;
+       }
+       if ((active_screens == 0) && si_list) {
+               (void) free((void *) (si_list));
+               si_list = NULL;
+       }
+}
+
+void
+InitSproingies(int wfmode, int grnd, int mspr, int screen, int numscreens,
+              int mono)
+{
+       GLfloat     ambient[] =
+       {0.2, 0.2, 0.2, 1.0};
+       GLfloat     position[] =
+       {10.0, 1.0, 1.0, 10.0};
+       GLfloat     mat_diffuse[] =
+       {0.6, 0.6, 0.6, 1.0};
+       GLfloat     mat_specular[] =
+       {0.8, 0.8, 0.8, 1.0};
+       GLfloat     mat_shininess[] =
+       {50.0};
+
+       sp_instance *si;
+       int         t;
+
+       if (si_list == NULL) {
+               if ((si_list = (sp_instance *) calloc(numscreens,
+                                             sizeof (sp_instance))) == NULL)
+                       return;
+       }
+       si = &si_list[screen];
+
+       active_screens++;
+       CleanupSproingies(screen);
+
+       if (mspr < 0)
+               mspr = 0;
+       if (mspr >= MAXSPROING)
+               mspr = MAXSPROING - 1;
+
+       si->rotx = 0;
+       si->roty = -45;
+       si->dist = (16 << 2);
+       si->sframe = 0;
+       si->target_count = 0;
+       si->mono = mono;
+
+       si->wireframe = si->flatshade = 0;
+
+       if (wfmode == 2)
+               si->flatshade = 1;
+       else if (wfmode)
+               si->wireframe = 1;
+
+       si->groundlevel = grnd;
+       si->maxsproingies = mspr;
+
+       if (si->maxsproingies) {
+               si->positions = (struct sPosColor *) calloc(si->maxsproingies,
+                                                 sizeof (struct sPosColor));
+
+               if (!(si->positions))
+                       si->maxsproingies = 0;
+       }
+       for (t = 0; t < si->maxsproingies; ++t) {
+               si->positions[t].x = 0;
+               si->positions[t].y = 0;
+               si->positions[t].z = 0;
+               si->positions[t].life = (-t * ((si->maxsproingies > 19) ? 1 : 4)) - 2;
+               si->positions[t].frame = 0;
+       }
+
+#if 0                          /* Test boom */
+       si->positions[0].x = 0;
+       si->positions[0].y = 0;
+       si->positions[0].z = 0;
+       si->positions[0].life = 10;
+       si->positions[0].frame = BOOM_FRAME;
+       si->positions[0].r = 0.656863;
+       si->positions[0].g = 1.0;
+       si->positions[0].b = 0.656863;
+#endif
+
+       if (!(si->TopsSides = build_TopsSides(si->wireframe)))
+               (void) fprintf(stderr, "build_TopsSides\n");
+
+       if (!(si->sproingies[0] = BuildLWO(si->wireframe, &LWO_s1_1)))
+               (void) fprintf(stderr, "BuildLWO - 1\n");
+       if (!(si->sproingies[1] = BuildLWO(si->wireframe, &LWO_s1_2)))
+               (void) fprintf(stderr, "BuildLWO - 2\n");
+       if (!(si->sproingies[2] = BuildLWO(si->wireframe, &LWO_s1_3)))
+               (void) fprintf(stderr, "BuildLWO - 3\n");
+       if (!(si->sproingies[3] = BuildLWO(si->wireframe, &LWO_s1_4)))
+               (void) fprintf(stderr, "BuildLWO - 4\n");
+       if (!(si->sproingies[4] = BuildLWO(si->wireframe, &LWO_s1_5)))
+               (void) fprintf(stderr, "BuildLWO - 5\n");
+       if (!(si->sproingies[5] = BuildLWO(si->wireframe, &LWO_s1_6)))
+               (void) fprintf(stderr, "BuildLWO - 6\n");
+
+       if (!(si->SproingieBoom = BuildLWO(si->wireframe, &LWO_s1_b)))
+               (void) fprintf(stderr, "BuildLWO - b\n");
+
+       if (si->wireframe) {
+               glShadeModel(GL_FLAT);
+               glDisable(GL_LIGHTING);
+       } else {
+               if (si->flatshade) {
+                       glShadeModel(GL_FLAT);
+                       position[0] = 1.0;
+                       position[3] = 0.0;
+               }
+               glEnable(GL_LIGHTING);
+               glEnable(GL_LIGHT0);
+               glDepthFunc(GL_LEQUAL);
+               glEnable(GL_DEPTH_TEST);
+
+               glLightfv(GL_LIGHT0, GL_AMBIENT, ambient);
+               glLightfv(GL_LIGHT0, GL_POSITION, position);
+
+               glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, mat_diffuse);
+               glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, mat_specular);
+               glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, mat_shininess);
+
+               /* glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_FALSE); */
+               glCullFace(GL_BACK);
+               glEnable(GL_CULL_FACE);
+
+               glFrontFace(GL_CW);
+               /* glEnable(GL_NORMALIZE); */
+       }
+}
+
+#endif
+
+/* End of sproingies.c */
diff --git a/hacks/glx/sproingiewrap.c b/hacks/glx/sproingiewrap.c
new file mode 100644 (file)
index 0000000..dff236b
--- /dev/null
@@ -0,0 +1,244 @@
+/* -*- Mode: C; tab-width: 4 -*- */
+/* sproingiewrap.c - sproingies wrapper */
+
+#if !defined( lint ) && !defined( SABER )
+static const char sccsid[] = "@(#)sproingiewrap.c      4.07 97/11/24 xlockmore";
+
+#endif
+
+/*-
+ * sproingiewrap.c - Copyright 1996 Sproingie Technologies Incorporated.
+ *
+ * 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.
+ *
+ * This file is provided AS IS with no warranties of any kind.  The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof.  In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ *    Programming:  Ed Mackey, http://www.netaxs.com/~emackey/
+ *    Sproingie 3D objects modeled by:  Al Mackey, al@iam.com
+ *       (using MetaNURBS in NewTek's Lightwave 3D v5).
+ *
+ * Revision History:
+ * 26-Apr-97: Added glPointSize() calls around explosions, plus other fixes.
+ * 28-Mar-97: Added size support.
+ * 22-Mar-97: Updated to use glX interface instead of xmesa one.
+ *              Also, support for multiscreens added.
+ * 20-Mar-97: Updated for xlockmore v4.02alpha7 and higher, using
+ *              xlockmore's built-in Mesa/OpenGL support instead of
+ *              my own.  Submitted for inclusion in xlockmore.
+ * 09-Dec-96: Written.
+ */
+
+/*-
+ * The sproingies have six "real" frames, (s1_1 to s1_6) that show a
+ * sproingie jumping off a block, headed down and to the right.  But
+ * the program thinks of sproingies as having twelve "virtual" frames,
+ * with the latter six being copies of the first, only lowered and
+ * rotated by 90 degrees (jumping to the left).  So after going
+ * through 12 frames, a sproingie has gone down two rows but not
+ * moved horizontally. 
+ *
+ * To have the sproingies randomly choose left/right jumps at each
+ * block, the program should go back to thinking of only 6 frames,
+ * and jumping down only one row when it is done.  Then it can pick a
+ * direction for the next row.
+ *
+ * (Falling off the end might not be so bad either.  :) )  
+ */
+
+#ifdef STANDALONE
+# define PROGCLASS                                     "Sproingies"
+# define HACK_INIT                                     init_sproingies
+# define HACK_DRAW                                     draw_sproingies
+# define sproingies_opts                       xlockmore_opts
+# define DEFAULTS      "*delay:                100     \n"                     \
+                                       "*count:                5       \n"                     \
+                                       "*cycles:               0       \n"                     \
+                                       "*size:                 0       \n"                     \
+                                       "*wireframe:    False   \n"
+# include "xlockmore.h"                                /* from the xscreensaver distribution */
+#else  /* !STANDALONE */
+# include "xlock.h"                                    /* from the xlockmore distribution */
+#endif /* !STANDALONE */
+
+#ifdef USE_GL
+
+ModeSpecOpt sproingies_opts =
+{0, NULL, 0, NULL, NULL};
+
+#ifdef USE_MODULES
+ModStruct   sproingies_description =
+{"sproingies", "init_sproingies", "draw_sproingies", "release_sproingies",
+ "refresh_sproingies", "init_sproingies", NULL, &sproingies_opts,
+ 1000, 5, 0, 400, 4, 1.0, "",
+ "Shows Sproingies!  Nontoxic.  Safe for pets and small children", 0, NULL};
+
+#endif
+
+#define MINSIZE 32
+
+#include <GL/glu.h>
+#include <time.h>
+
+void        NextSproingie(int screen);
+void        NextSproingieDisplay(int screen);
+void        DisplaySproingies(int screen);
+
+#if 0
+void        ReshapeSproingies(int w, int h);
+
+#endif
+void        CleanupSproingies(int screen);
+void        InitSproingies(int wfmode, int grnd, int mspr, int screen, int numscreens, int mono);
+
+typedef struct {
+       GLfloat     view_rotx, view_roty, view_rotz;
+       GLint       gear1, gear2, gear3;
+       GLfloat     angle;
+       GLuint      limit;
+       GLuint      count;
+       GLXContext *glx_context;
+       int         mono;
+       Window      window;
+} sproingiesstruct;
+
+static sproingiesstruct *sproingies = NULL;
+
+static Display *swap_display;
+static Window swap_window;
+
+void
+SproingieSwap(void)
+{
+       glFinish();
+       glXSwapBuffers(swap_display, swap_window);
+}
+
+
+void
+init_sproingies(ModeInfo * mi)
+{
+       Display    *display = MI_DISPLAY(mi);
+       Window      window = MI_WINDOW(mi);
+       int         screen = MI_SCREEN(mi);
+
+       int         cycles = MI_CYCLES(mi);
+       int         count = MI_COUNT(mi);
+       int         size = MI_SIZE(mi);
+
+       sproingiesstruct *sp;
+       int         wfmode = 0, grnd, mspr, w, h;
+
+       if (sproingies == NULL) {
+               if ((sproingies = (sproingiesstruct *) calloc(MI_NUM_SCREENS(mi),
+                                        sizeof (sproingiesstruct))) == NULL)
+                       return;
+       }
+       sp = &sproingies[screen];
+
+       sp->mono = (MI_IS_MONO(mi) ? 1 : 0);
+       sp->window = window;
+       if ((sp->glx_context = init_GL(mi)) != NULL) {
+
+               if ((cycles & 1) || MI_IS_WIREFRAME(mi))
+                       wfmode = 1;
+               grnd = (cycles >> 1);
+               if (grnd > 2)
+                       grnd = 2;
+
+               mspr = count;
+               if (mspr > 100)
+                       mspr = 100;
+
+               /* wireframe, ground, maxsproingies */
+               InitSproingies(wfmode, grnd, mspr, MI_SCREEN(mi), MI_NUM_SCREENS(mi), sp->mono);
+
+               /* Viewport is specified size if size >= MINSIZE && size < screensize */
+               if (size == 0) {
+                       w = MI_WIDTH(mi);
+                       h = MI_HEIGHT(mi);
+               } else if (size < MINSIZE) {
+                       w = MINSIZE;
+                       h = MINSIZE;
+               } else {
+                       w = (size > MI_WIDTH(mi)) ? MI_WIDTH(mi) : size;
+                       h = (size > MI_HEIGHT(mi)) ? MI_HEIGHT(mi) : size;
+               }
+
+               glViewport((MI_WIDTH(mi) - w) / 2, (MI_HEIGHT(mi) - h) / 2, w, h);
+               glMatrixMode(GL_PROJECTION);
+               glLoadIdentity();
+               gluPerspective(65.0, (GLfloat) w / (GLfloat) h, 0.1, 2000.0);   /* was 200000.0 */
+               glMatrixMode(GL_MODELVIEW);
+               glLoadIdentity();
+
+               swap_display = display;
+               swap_window = window;
+               DisplaySproingies(MI_SCREEN(mi));
+       } else {
+               MI_CLEARWINDOW(mi);
+       }
+}
+
+/* ARGSUSED */
+void
+draw_sproingies(ModeInfo * mi)
+{
+       sproingiesstruct *sp = &sproingies[MI_SCREEN(mi)];
+       Display    *display = MI_DISPLAY(mi);
+       Window      window = MI_WINDOW(mi);
+
+       if (!sp->glx_context)
+               return;
+
+       glDrawBuffer(GL_BACK);
+       glXMakeCurrent(display, window, *(sp->glx_context));
+
+       swap_display = display;
+       swap_window = window;
+
+       NextSproingieDisplay(MI_SCREEN(mi));    /* It will swap. */
+}
+
+void
+refresh_sproingies(ModeInfo * mi)
+{
+       /* No need to do anything here... The whole screen is updated
+        * every frame anyway.  Otherwise this would be just like
+        * draw_sproingies, above, but replace NextSproingieDisplay(...)
+        * with DisplaySproingies(...).
+        */
+}
+
+void
+release_sproingies(ModeInfo * mi)
+{
+       if (sproingies != NULL) {
+               int         screen;
+
+               for (screen = 0; screen < MI_NUM_SCREENS(mi); screen++) {
+                       sproingiesstruct *sp = &sproingies[screen];
+
+                       if (sp->glx_context) {
+
+                               glXMakeCurrent(MI_DISPLAY(mi), sp->window, *(sp->glx_context));
+                               CleanupSproingies(MI_SCREEN(mi));
+                       }
+               }
+
+               (void) free((void *) sproingies);
+               sproingies = NULL;
+       }
+       FreeAllGL(mi);
+}
+
+#endif
+
+/* End of sproingiewrap.c */
diff --git a/hacks/glx/stairs.c b/hacks/glx/stairs.c
new file mode 100644 (file)
index 0000000..c12316a
--- /dev/null
@@ -0,0 +1,487 @@
+/* -*- Mode: C; tab-width: 4 -*- */
+/* stairs --- Infinite Stairs, and Escher-like scene. */
+
+#if !defined( lint ) && !defined( SABER )
+static const char sccsid[] = "@(#)stairs.c     4.07 97/11/24 xlockmore";
+
+#endif
+
+#undef DEBUG_LISTS
+
+/*-
+ * 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.
+ *
+ * This file is provided AS IS with no warranties of any kind.  The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof.  In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * This mode shows some interesting scenes that are impossible OR very
+ * weird to build in the real universe. Much of the scenes are inspirated
+ * on Mauritz Cornelis stairs's works which derivated the mode's name.
+ * M.C. Escher (1898-1972) was a dutch artist and many people prefer to
+ * say he was a mathematician.
+ *
+ * Thanks goes to Brian Paul for making it possible and inexpensive to use 
+ * OpenGL at home.
+ *
+ * Since I'm not a native English speaker, my apologies for any grammatical
+ * mistake.
+ *
+ * My e-mail address is
+ * m-vianna@usa.net
+ *
+ * Marcelo F. Vianna (Jun-01-1997)
+ *
+ * Revision History:
+ * 07-Jan-98: This would be a scene for the escher mode, but now escher mode
+ *            was splitted in different modes for each scene. This is the
+ *            initial release and is not working yet.
+ *            Marcelo F. Vianna.
+ *
+ */
+
+/*-
+ * Texture mapping is only available on RGBA contexts, Mono and color index
+ * visuals DO NOT support texture mapping in OpenGL.
+ *
+ * BUT Mesa do implements RGBA contexts in pseudo color visuals, so texture
+ * mapping shuld work on PseudoColor, DirectColor, TrueColor using Mesa. Mono
+ * is not officially supported for both OpenGL and Mesa, but seems to not crash
+ * Mesa.
+ *
+ * In real OpenGL, PseudoColor DO NOT support texture map (as far as I know).
+ */
+
+#include <X11/Intrinsic.h>
+
+#ifdef STANDALONE
+# define PROGCLASS                     "Stairs"
+# define HACK_INIT                     init_stairs
+# define HACK_DRAW                     draw_stairs
+# define stairs_opts           xlockmore_opts
+# define DEFAULTS                      "*cycles:               1       \n"                     \
+                                                       "*delay:                200000  \n"                     \
+                                                       "*wireframe:    False   \n"
+# include "xlockmore.h"                /* from the xscreensaver distribution */
+#else /* !STANDALONE */
+# include "xlock.h"                    /* from the xlockmore distribution */
+
+#endif /* !STANDALONE */
+
+#ifdef USE_GL
+
+#include <GL/glu.h>
+#include "e_textures.h"
+
+ModeSpecOpt stairs_opts =
+{0, NULL, 0, NULL, NULL};
+
+#ifdef USE_MODULES
+ModStruct   stairs_description =
+{"stairs", "init_stairs", "draw_stairs", "release_stairs",
+ "draw_stairs", "change_stairs", NULL, &stairs_opts,
+ 1000, 1, 1, 1, 4, 1.0, "",
+ "Shows Infinite Stairs, an Escher-like scene", 0, NULL};
+
+#endif
+
+#define Scale4Window               0.3
+#define Scale4Iconic               0.4
+
+#define sqr(A)                     ((A)*(A))
+
+#ifndef Pi
+#define Pi                         M_PI
+#endif
+
+/*************************************************************************/
+
+typedef struct {
+       GLint       WindH, WindW;
+       GLfloat     step;
+       Bool        direction;
+       int         AreObjectsDefined[1];
+       int         sphere_position;
+       GLXContext *glx_context;
+} stairsstruct;
+
+static float front_shininess[] =
+{60.0};
+static float front_specular[] =
+{0.7, 0.7, 0.7, 1.0};
+static float ambient[] =
+{0.0, 0.0, 0.0, 1.0};
+static float diffuse[] =
+{1.0, 1.0, 1.0, 1.0};
+static float position0[] =
+{1.0, 1.0, 1.0, 0.0};
+static float position1[] =
+{-1.0, -1.0, 1.0, 0.0};
+static float lmodel_ambient[] =
+{0.5, 0.5, 0.5, 1.0};
+static float lmodel_twoside[] =
+{GL_TRUE};
+
+#if 0
+static float MaterialRed[] =
+{0.7, 0.0, 0.0, 1.0};
+static float MaterialGreen[] =
+{0.1, 0.5, 0.2, 1.0};
+static float MaterialBlue[] =
+{0.0, 0.0, 0.7, 1.0};
+static float MaterialCyan[] =
+{0.2, 0.5, 0.7, 1.0};
+static float MaterialMagenta[] =
+{0.6, 0.2, 0.5, 1.0};
+static float MaterialGray[] =
+{0.2, 0.2, 0.2, 1.0};
+static float MaterialGray5[] =
+{0.5, 0.5, 0.5, 1.0};
+static float MaterialGray6[] =
+{0.6, 0.6, 0.6, 1.0};
+static float MaterialGray8[] =
+{0.8, 0.8, 0.8, 1.0};
+
+#endif
+static float MaterialYellow[] =
+{0.7, 0.7, 0.0, 1.0};
+static float MaterialWhite[] =
+{0.7, 0.7, 0.7, 1.0};
+
+static float positions[] =
+{
+       -2.5, 4.0, 0.0,         /* First one is FUDGED :) */
+       -3.0, 3.25, 1.0,
+       -3.0, 4.4, 1.5,
+       -3.0, 3.05, 2.0,
+       -3.0, 4.2, 2.5,
+
+       -3.0, 2.85, 3.0,
+       -2.5, 4.0, 3.0,
+       -2.0, 2.75, 3.0,
+       -1.5, 3.9, 3.0,
+       -1.0, 2.65, 3.0,
+       -0.5, 3.8, 3.0,
+       0.0, 2.55, 3.0,
+       0.5, 3.7, 3.0,
+       1.0, 2.45, 3.0,
+       1.5, 3.6, 3.0,
+       2.0, 2.35, 3.0,
+
+       2.0, 3.5, 2.5,
+       2.0, 2.25, 2.0,
+       2.0, 3.4, 1.5,
+       2.0, 2.15, 1.0,
+       2.0, 3.3, 0.5,
+       2.0, 2.05, 0.0,
+       2.0, 3.2, -0.5,
+       2.0, 1.95, -1.0,
+       2.0, 3.1, -1.5,
+       2.0, 1.85, -2.0,
+
+       1.5, 2.9, -2.0,
+       1.0, 1.65, -2.0,
+       0.5, 2.7, -2.0,
+       0.0, 1.55, -2.0,
+       -0.5, 2.5, -2.0,
+       -1.0, 1.45, -2.0,
+};
+
+#define NPOSITIONS ((sizeof positions) / (sizeof positions[0]))
+
+static stairsstruct *stairs = NULL;
+static GLuint objects;
+
+#define ObjSphere    0
+
+#define PlankWidth      3.0
+#define PlankHeight     0.35
+#define PlankThickness  0.15
+
+static void
+mySphere(float radius)
+{
+       GLUquadricObj *quadObj;
+
+       quadObj = gluNewQuadric();
+       gluQuadricDrawStyle(quadObj, (GLenum) GLU_FILL);
+       gluSphere(quadObj, radius, 16, 16);
+       gluDeleteQuadric(quadObj);
+}
+
+static void
+draw_block(GLfloat width, GLfloat height, GLfloat thickness)
+{
+       glBegin(GL_QUADS);
+       glNormal3f(0, 0, 1);
+       glTexCoord2f(0, 0);
+       glVertex3f(-width, -height, thickness);
+       glTexCoord2f(1, 0);
+       glVertex3f(width, -height, thickness);
+       glTexCoord2f(1, 1);
+       glVertex3f(width, height, thickness);
+       glTexCoord2f(0, 1);
+       glVertex3f(-width, height, thickness);
+       glNormal3f(0, 0, -1);
+       glTexCoord2f(0, 0);
+       glVertex3f(-width, height, -thickness);
+       glTexCoord2f(1, 0);
+       glVertex3f(width, height, -thickness);
+       glTexCoord2f(1, 1);
+       glVertex3f(width, -height, -thickness);
+       glTexCoord2f(0, 1);
+       glVertex3f(-width, -height, -thickness);
+       glNormal3f(0, 1, 0);
+       glTexCoord2f(0, 0);
+       glVertex3f(-width, height, thickness);
+       glTexCoord2f(1, 0);
+       glVertex3f(width, height, thickness);
+       glTexCoord2f(1, 1);
+       glVertex3f(width, height, -thickness);
+       glTexCoord2f(0, 1);
+       glVertex3f(-width, height, -thickness);
+       glNormal3f(0, -1, 0);
+       glTexCoord2f(0, 0);
+       glVertex3f(-width, -height, -thickness);
+       glTexCoord2f(1, 0);
+       glVertex3f(width, -height, -thickness);
+       glTexCoord2f(1, 1);
+       glVertex3f(width, -height, thickness);
+       glTexCoord2f(0, 1);
+       glVertex3f(-width, -height, thickness);
+       glNormal3f(1, 0, 0);
+       glTexCoord2f(0, 0);
+       glVertex3f(width, -height, thickness);
+       glTexCoord2f(1, 0);
+       glVertex3f(width, -height, -thickness);
+       glTexCoord2f(1, 1);
+       glVertex3f(width, height, -thickness);
+       glTexCoord2f(0, 1);
+       glVertex3f(width, height, thickness);
+       glNormal3f(-1, 0, 0);
+       glTexCoord2f(0, 0);
+       glVertex3f(-width, height, thickness);
+       glTexCoord2f(1, 0);
+       glVertex3f(-width, height, -thickness);
+       glTexCoord2f(1, 1);
+       glVertex3f(-width, -height, -thickness);
+       glTexCoord2f(0, 1);
+       glVertex3f(-width, -height, thickness);
+       glEnd();
+}
+
+static void
+draw_stairs_internal(ModeInfo * mi)
+{
+       stairsstruct *sp = &stairs[MI_SCREEN(mi)];
+       GLfloat     X;
+
+       glPushMatrix();
+       glPushMatrix();
+       glTranslatef(-3.0, 0.1, 2.0);
+       for (X = 0; X < 2; X++) {
+               draw_block(0.5, 2.7 + 0.1 * X, 0.5);
+               glTranslatef(0.0, 0.1, -1.0);
+       }
+       glPopMatrix();
+       glTranslatef(-3.0, 0.0, 3.0);
+       glPushMatrix();
+
+       for (X = 0; X < 6; X++) {
+               draw_block(0.5, 2.6 - 0.1 * X, 0.5);
+               glTranslatef(1.0, -0.1, 0.0);
+       }
+       glTranslatef(-1.0, -0.9, -1.0);
+       for (X = 0; X < 5; X++) {
+               draw_block(0.5, 3.0 - 0.1 * X, 0.5);
+               glTranslatef(0.0, 0.0, -1.0);
+       }
+       glTranslatef(-1.0, -1.1, 1.0);
+       for (X = 0; X < 3; X++) {
+               draw_block(0.5, 3.5 - 0.1 * X, 0.5);
+               glTranslatef(-1.0, -0.1, 0.0);
+       }
+       glPopMatrix();
+       glPopMatrix();
+
+       glPushMatrix();
+       glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialYellow);
+
+       glTranslatef((GLfloat) positions[sp->sphere_position],
+                    (GLfloat) positions[sp->sphere_position + 1],
+                    (GLfloat) positions[sp->sphere_position + 2]);
+       if (sp->sphere_position == 0)   /* FUDGE soo its not so obvious */
+               mySphere(0.48);
+       else
+               mySphere(0.5);
+       glPopMatrix();
+       sp->sphere_position += 3;
+       if (sp->sphere_position >= NPOSITIONS)
+               sp->sphere_position = 0;
+}
+
+static void
+reshape(ModeInfo * mi, int width, int height)
+{
+       stairsstruct *sp = &stairs[MI_SCREEN(mi)];
+
+       glViewport(0, 0, sp->WindW = (GLint) width, sp->WindH = (GLint) height);
+       glMatrixMode(GL_PROJECTION);
+       glLoadIdentity();
+       glFrustum(-1.0, 1.0, -1.0, 1.0, 5.0, 15.0);
+       glMatrixMode(GL_MODELVIEW);
+       if (width >= 1024) {
+               glLineWidth(3);
+               glPointSize(3);
+       } else if (width >= 512) {
+               glLineWidth(2);
+               glPointSize(2);
+       } else {
+               glLineWidth(1);
+               glPointSize(1);
+       }
+}
+
+static void
+pinit(void)
+{
+       glClearDepth(1.0);
+       glClearColor(0.0, 0.0, 0.0, 1.0);
+
+       glLightfv(GL_LIGHT0, GL_AMBIENT, ambient);
+       glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse);
+       glLightfv(GL_LIGHT0, GL_POSITION, position0);
+       glLightfv(GL_LIGHT1, GL_AMBIENT, ambient);
+       glLightfv(GL_LIGHT1, GL_DIFFUSE, diffuse);
+       glLightfv(GL_LIGHT1, GL_POSITION, position1);
+       glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient);
+       glLightModelfv(GL_LIGHT_MODEL_TWO_SIDE, lmodel_twoside);
+       glEnable(GL_LIGHTING);
+       glEnable(GL_LIGHT0);
+       glEnable(GL_LIGHT1);
+       glEnable(GL_NORMALIZE);
+       glFrontFace(GL_CCW);
+       glCullFace(GL_BACK);
+
+       glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, MaterialWhite);
+       glShadeModel(GL_FLAT);
+       glEnable(GL_DEPTH_TEST);
+       glEnable(GL_TEXTURE_2D);
+       glEnable(GL_CULL_FACE);
+
+       glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
+       gluBuild2DMipmaps(GL_TEXTURE_2D, 3, WoodTextureWidth, WoodTextureHeight,
+                         GL_RGB, GL_UNSIGNED_BYTE, WoodTextureData);
+       glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
+       glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+       glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+       glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+       glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+
+       glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, front_shininess);
+       glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, front_specular);
+}
+
+void
+init_stairs(ModeInfo * mi)
+{
+       int         screen = MI_SCREEN(mi);
+       stairsstruct *sp;
+
+       if (stairs == NULL) {
+               if ((stairs = (stairsstruct *) calloc(MI_NUM_SCREENS(mi),
+                                            sizeof (stairsstruct))) == NULL)
+                       return;
+       }
+       sp = &stairs[screen];
+       sp->step = 0.0;
+       sp->direction = LRAND() & 1;
+       sp->sphere_position = NRAND(NPOSITIONS / 3) * 3;
+
+       if ((sp->glx_context = init_GL(mi)) != NULL) {
+
+               reshape(mi, MI_WIDTH(mi), MI_HEIGHT(mi));
+               glDrawBuffer(GL_BACK);
+               if (!glIsList(objects))
+                       objects = glGenLists(1);
+               pinit();
+       } else {
+               MI_CLEARWINDOW(mi);
+       }
+}
+
+void
+draw_stairs(ModeInfo * mi)
+{
+       stairsstruct *sp = &stairs[MI_SCREEN(mi)];
+
+       Display    *display = MI_DISPLAY(mi);
+       Window      window = MI_WINDOW(mi);
+
+       if (!sp->glx_context)
+               return;
+
+       glXMakeCurrent(display, window, *(sp->glx_context));
+
+       glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+       glPushMatrix();
+
+       glTranslatef(0.0, 0.0, -10.0);
+
+       if (!MI_IS_ICONIC(mi)) {
+               glScalef(Scale4Window * sp->WindH / sp->WindW, Scale4Window, Scale4Window);
+       } else {
+               glScalef(Scale4Iconic * sp->WindH / sp->WindW, Scale4Iconic, Scale4Iconic);
+       }
+
+       glRotatef(44.5, 1, 0, 0);
+       glRotatef(50 + ((sp->direction) ? 1 : -1) *
+              ((sp->step * 100 > 120) ? sp->step * 100 - 120 : 0), 0, 1, 0);
+       if (sp->step * 100 >= 360 + 120) {      /* stop showing secrets */
+               sp->step = 0;
+               sp->direction = LRAND() & 1;
+       }
+       draw_stairs_internal(mi);
+
+       glPopMatrix();
+
+       glFlush();
+
+       glXSwapBuffers(display, window);
+
+       sp->step += 0.025;
+}
+
+void
+change_stairs(ModeInfo * mi)
+{
+       stairsstruct *sp = &stairs[MI_SCREEN(mi)];
+
+       if (!sp->glx_context)
+               return;
+
+       glXMakeCurrent(MI_DISPLAY(mi), MI_WINDOW(mi), *(sp->glx_context));
+       pinit();
+}
+
+void
+release_stairs(ModeInfo * mi)
+{
+       if (stairs != NULL) {
+               (void) free((void *) stairs);
+               stairs = NULL;
+       }
+       if (glIsList(objects)) {
+               glDeleteLists(objects, 1);
+       }
+       FreeAllGL(mi);
+}
+
+#endif
diff --git a/hacks/glx/superquadrics.c b/hacks/glx/superquadrics.c
new file mode 100644 (file)
index 0000000..cfc2999
--- /dev/null
@@ -0,0 +1,778 @@
+/* -*- Mode: C; tab-width: 4 -*- */
+/* superquadrics --- 3D mathematical shapes */
+
+#if !defined( lint ) && !defined( SABER )
+static const char sccsid[] = "@(#)superquadrics.c      4.07 97/11/24 xlockmore";
+
+#endif
+
+/*-
+ * 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.
+ *
+ * This file is provided AS IS with no warranties of any kind.  The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof.  In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * Superquadrics were invented by Dr. Alan Barr of Caltech University.
+ * They were first published in "Computer Graphics and Applications",
+ * volume 1, number 1, 1981, in the article "Superquadrics and Angle-
+ * Preserving Transformations."  Dr. Barr based the Superquadrics on
+ * Piet Hein's "super ellipses."  Super ellipses are like 2D ellipses,
+ * except that the formula includes an exponent, raising its X and Y
+ * values to a (fractional) power, and allowing them to gradually
+ * change from round to square edges.  Superquadrics extend this
+ * idea into 3 dimensions, using two exponents to modify a
+ * quadric surface in a similar fashion.
+ *
+ * Revision History:
+ * 30-Mar-97: Turned into a module for xlockmore 4.02 alpha.  The code
+ *    is almost unrecognizable now from the first revision, except for
+ *    a few remaining two-letter variable names.  I still don't have
+ *    the normal vectors working right (I wrote the buggy normal vector
+ *    code myself, can you tell?)
+ * 07-Jan-97: A legend reborn; Superquadrics make an appearance as a
+ *    real OpenGL program written in C.  I can even render them with
+ *    proper lighting and specular highlights.  Gee, they look almost
+ *    as good now as the original color plates of them that my uncle
+ *    showed me as a child in 1981.  I don't know what computer hardware
+ *    he was using at the time, but it's taken a couple decades for the
+ *    PC clone hardware to catch up to it.
+ * 05-Jan-97: After almost a decade, Superquadrics had almost faded away
+ *    into the myths and folklore of all the things my brother and I played
+ *    with on computers when we were kids with too much time on our hands.
+ *    I had since gotten involved in Unix, OpenGL, and other things.
+ *    A sudden flash of inspiration caused me to dig out the old Pascal
+ *    source code, run it through p2c, and start ripping away the old
+ *    wireframe rendering code, to be replaced by OpenGL.
+ * Late 1989 or early 1990:  Around this time I did the Turbo Pascal
+ *    port of the Superquadrics.  Unfortunately, many of the original variable
+ *    names remained the same from the C= 64 original.  This was unfortunate
+ *    because BASIC on the c64 only allowed 2-letter, global variable names.
+ *    But the speed improvement over BASIC was very impressive at the time.
+ * Thanksgiving, 1987: Written.  My uncle Al, who invented Superquadrics some
+ *    years earlier, came to visit us.  I was a high school kid at the time,
+ *    with nothing more than a Commodore 64.  Somehow we wrote this program,
+ *    (he did the math obviously, I just coded it into BASIC for the c64).
+ *    Yeah, 320x200 resolution, colorless white wireframe, and half an hour
+ *    rendering time per superquadric.  PLOT x,y.  THOSE were the days.
+ *    In the following years I would port Superquadrics to AppleBASIC,
+ *    AmigaBASIC, and then Turbo Pascal for IBM clones.  5 minutes on a 286!
+ *    Talk about fast rendering!  But these days, when my Pentium 166 runs
+ *    the same program, the superquadric will already be waiting on the
+ *    screen before my monitor can change frequency from text to graphics
+ *    mode.  Can't time the number of minutes that way!  Darn ;)
+ *
+ * Ed Mackey
+ */
+
+/*-
+ * due to a Bug/feature in VMS X11/Intrinsic.h has to be placed before xlock.
+ * otherwise caddr_t is not defined correctly
+ */
+
+#include <X11/Intrinsic.h>
+
+#ifdef STANDALONE
+# define PROGCLASS                                     "Superquadrics"
+# define HACK_INIT                                     init_superquadrics
+# define HACK_DRAW                                     draw_superquadrics
+# define superquadrics_opts                    xlockmore_opts
+# define DEFAULTS      "*delay:                100     \n"                     \
+                                       "*count:                25      \n"                     \
+                                       "*cycles:               40      \n"                     \
+                                       "*wireframe:    False   \n"
+# include "xlockmore.h"                                /* from the xscreensaver distribution */
+#else  /* !STANDALONE */
+# include "xlock.h"                                    /* from the xlockmore distribution */
+#endif /* !STANDALONE */
+
+#ifdef USE_GL
+
+/*-
+ * Note for low-CPU-speed machines:  If your frame rate is so low that
+ * attempts at animation appear futile, try using "-cycles 1", which puts
+ * Superquadrics into kind of a slide-show mode.  It will still use up
+ * all of your CPU power, but it may look nicer.
+ */
+
+#define DEF_SPINSPEED  "5.0"
+
+static float spinspeed;
+
+static XrmOptionDescRec opts[] =
+{
+  {"-spinspeed", ".superquadrics.spinspeed", XrmoptionSepArg, (caddr_t) NULL}
+};
+static argtype vars[] =
+{
+  {(caddr_t *) & spinspeed, "spinspeed", "Spinspeed", DEF_SPINSPEED, t_Float}
+};
+static OptionStruct desc[] =
+{
+       {"-spinspeed num", "speed of rotation, in degrees per frame"}
+};
+
+ModeSpecOpt superquadrics_opts =
+{sizeof opts / sizeof opts[0], opts, sizeof vars / sizeof vars[0], vars, desc};
+
+#ifdef USE_MODULES
+ModStruct   superquadrics_description =
+{"superquadrics", "init_superquadrics", "draw_superquadrics", "release_superquadrics",
+ "refresh_superquadrics", "init_superquadrics", NULL, &superquadrics_opts,
+ 1000, 25, 40, 1, 4, 1.0, "",
+ "Shows 3D mathematical shapes", 0, NULL};
+
+#endif
+
+#include <GL/glu.h>
+
+#define MaxRes          50
+#define MinRes          5
+
+typedef double dimi[MaxRes + 1];
+
+typedef struct {
+       double      xExponent, yExponent;
+       GLfloat     r[4], g[4], b[4];
+       long        Mode;
+       int         rotx, rotz;
+} state;
+
+typedef struct {
+       GLXContext *glx_context;
+       int         dist, wireframe, flatshade, shownorms, maxcount, maxwait;
+       int         counter, viewcount, viewwait, mono;
+       GLfloat     curmat[4][4], rotx, roty, rotz, spinspeed;
+       /* In dimi: the first letter stands for cosine/sine, the second
+        *          stands for North, South, East, or West.  I think.
+        */
+       dimi        cs, se, sw, sn, ss, ce, cw, cn, Prevxx, Prevyy, Prevzz,
+                   Prevxn, Prevyn, Prevzn;
+       double      xExponent, yExponent, Mode;
+       int         resolution;
+       state       now, later;
+} superquadricsstruct;
+
+static superquadricsstruct *superquadrics = NULL;
+
+#define CLIP_NORMALS 10000.0
+
+static void ReshapeSuperquadrics(int w, int h);
+
+static int
+myrand(int range)
+{
+       return ((int) (((float) range) * LRAND() / (MAXRAND)));
+}
+
+static float
+myrandreal(void)
+{
+       return (LRAND() / (MAXRAND));
+}
+
+/* Some old, old, OLD code follows.  Ahh this takes me back..... */
+
+/* Output from p2c, the Pascal-to-C translator */
+/* From input file "squad.pas" */
+
+static double
+XtoY(double x, double y)
+{
+       double      z, a;
+
+       /* This is NOT your typical raise-X-to-the-Y-power function.  Do not attempt
+        * to replace this with a standard exponent function.  If you must, just
+        * replace the "a = exp(y * log(z));" line with something faster.
+        */
+
+       z = fabs(x);
+       if (z < 1e-20) {
+               a = 0.0;
+               return a;
+       }
+       a = exp(y * log(z));
+       if (a > CLIP_NORMALS)
+               a = CLIP_NORMALS;
+       if (x < 0)
+               a = -a;
+       return a;
+}
+
+
+static double
+Sine(double x, double e)
+{
+       /* This is just the sine wave raised to the exponent.  BUT, you can't
+        * raise negative numbers to fractional exponents.  So we have a special
+        * XtoY routune which handles it in a way useful to superquadrics.
+        */
+
+       return (XtoY(sin(x), e));
+}
+
+
+static double
+Cosine(double x, double e)
+{
+       return (XtoY(cos(x), e));
+}
+
+
+static void
+MakeUpStuff(int allstuff, superquadricsstruct * sp)
+{
+       static int  pats[4][4] =
+       {
+               {0, 0, 0, 0},
+               {0, 1, 0, 1},
+               {0, 0, 1, 1},
+               {0, 1, 1, 0}
+       };
+
+       int         dostuff;
+       int         t, pat;
+       GLfloat     r, g, b, r2, g2, b2;
+
+       /* randomize it. */
+
+       if (sp->maxcount < 2)
+               allstuff = 1;
+       dostuff = allstuff * 15;
+       if (!dostuff) {
+               dostuff = myrand(3) + 1;
+               if (myrand(2) || (dostuff & 1))
+                       dostuff |= 4;
+               if (myrand(2))
+                       dostuff |= 8;
+       }
+       if (dostuff & 1) {
+               sp->later.xExponent = (((long) floor(myrandreal() * 250 + 0.5)) / 100.0) + 0.1;
+               sp->later.yExponent = (((long) floor(myrandreal() * 250 + 0.5)) / 100.0) + 0.1;
+
+               /* Increase the 2.0 .. 2.5 range to 2.0 .. 3.0 */
+               if (sp->later.xExponent > 2.0)
+                       sp->later.xExponent = (sp->later.xExponent * 2.0) - 2.0;
+               if (sp->later.yExponent > 2.0)
+                       sp->later.yExponent = (sp->later.yExponent * 2.0) - 2.0;
+       }
+       if (dostuff & 2) {
+               do {
+                       sp->later.Mode = myrand(3L) + 1;
+               } while (!allstuff && (sp->later.Mode == sp->now.Mode));
+               /* On init: make sure it can stay in mode 1 if it feels like it. */
+       }
+       if (dostuff & 4) {
+               if (sp->mono) {
+                       if (sp->wireframe) {
+                               b = g = r = 1.0;
+                               b2 = g2 = r2 = 1.0;
+                       } else {
+                               b = g = r = (GLfloat) (140 + myrand(100)) / 255.0;
+                               b2 = g2 = r2 = ((r > 0.69) ? (1.0 - r) : r);
+                       }
+               } else {
+                       r = (GLfloat) (40 + myrand(200)) / 255.0;
+                       g = (GLfloat) (40 + myrand(200)) / 255.0;
+                       b = (GLfloat) (40 + myrand(200)) / 255.0;
+
+                       r2 = ((myrand(4) && ((r < 0.31) || (r > 0.69))) ? (1.0 - r) : r);
+                       g2 = ((myrand(4) && ((g < 0.31) || (g > 0.69))) ? (1.0 - g) : g);
+                       b2 = ((myrand(4) && ((b < 0.31) || (b > 0.69))) ? (1.0 - b) : b);
+               }
+
+               pat = myrand(4);
+               for (t = 0; t < 4; ++t) {
+                       sp->later.r[t] = pats[pat][t] ? r : r2;
+                       sp->later.g[t] = pats[pat][t] ? g : g2;
+                       sp->later.b[t] = pats[pat][t] ? b : b2;
+               }
+       }
+       if (dostuff & 8) {
+               sp->later.rotx = myrand(360) - 180;
+               sp->later.rotz = myrand(160) - 80;
+       }
+}
+
+static void
+inputs(superquadricsstruct * sp)
+{
+       int         iv;
+       double      u, v, mode3, cn3, inverter2, flatu, flatv;
+
+       if (sp->Mode < 1.000001) {
+               mode3 = 1.0;
+               cn3 = 0.0;
+               inverter2 = 1.0;
+       } else if (sp->Mode < 2.000001) {
+               mode3 = 1.0;
+               cn3 = (sp->Mode - 1.0) * 1.5;
+               inverter2 = (sp->Mode - 1.0) * -2.0 + 1.0;
+       } else {
+               mode3 = (sp->Mode - 1.0);
+               cn3 = (sp->Mode - 2.0) / 2.0 + 1.5;
+               inverter2 = -1.0;
+       }
+
+       if (sp->flatshade) {
+               flatu = M_PI / (sp->resolution - 1);
+               flatv = mode3 * M_PI / ((sp->resolution - 1) * 2);
+       } else {
+               flatu = flatv = 0.0;
+       }
+
+       /* (void) printf("Calculating....\n"); */
+       for (iv = 1; iv <= sp->resolution; iv++) {
+
+               /* u ranges from PI down to -PI */
+               u = (1 - iv) * 2 * M_PI / (sp->resolution - 1) + M_PI;
+
+               /* v ranges from PI/2 down to -PI/2 */
+               v = (1 - iv) * mode3 * M_PI / (sp->resolution - 1) + M_PI * (mode3 / 2.0);
+
+               /* Use of xExponent */
+               sp->se[iv] = Sine(u, sp->xExponent);
+               sp->ce[iv] = Cosine(u, sp->xExponent);
+               sp->sn[iv] = Sine(v, sp->yExponent);
+               sp->cn[iv] = Cosine(v, sp->yExponent) * inverter2 + cn3;
+
+               /* Normal vector computations only */
+               sp->sw[iv] = Sine(u + flatu, 2 - sp->xExponent);
+               sp->cw[iv] = Cosine(u + flatu, 2 - sp->xExponent);
+               sp->ss[iv] = Sine(v + flatv, 2 - sp->yExponent) * inverter2;
+               sp->cs[iv] = Cosine(v + flatv, 2 - sp->yExponent);
+       }                       /* next */
+
+       /* Now fix up the endpoints */
+       sp->se[sp->resolution] = sp->se[1];
+       sp->ce[sp->resolution] = sp->ce[1];
+
+       if (sp->Mode > 2.999999) {
+               sp->sn[sp->resolution] = sp->sn[1];
+               sp->cn[sp->resolution] = sp->cn[1];
+       }
+}
+
+
+static void
+DoneScale(superquadricsstruct * sp)
+{
+       double      xx, yy, zz, xp = 0, yp = 0, zp = 0, xn, yn, zn, xnp = 0,
+                   ynp = 0, znp = 0;
+       int         ih, iv;
+
+       /* Hey don't knock my 2-letter variable names.  Simon's BASIC rules, man! ;-> */
+       /* Just kidding..... */
+       int         toggle = 0;
+
+       for (ih = 1; ih <= sp->resolution; ih++) {
+               toggle ^= 2;
+               for (iv = 1; iv <= sp->resolution; iv++) {
+                       toggle ^= 1;
+                       if (sp->wireframe)
+                               glColor3f(sp->curmat[toggle][0], sp->curmat[toggle][1], sp->curmat[toggle][2]);
+                       else
+                               glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, sp->curmat[toggle]);
+
+                       xx = sp->cn[iv] * sp->ce[ih];
+                       zz = sp->cn[iv] * sp->se[ih];
+                       yy = sp->sn[iv];
+
+                       if (sp->wireframe) {
+                               if ((ih > 1) || (iv > 1)) {
+                                       glBegin(GL_LINES);
+                                       if (ih > 1) {
+                                               glVertex3f(xx, yy, zz);
+                                               glVertex3f(sp->Prevxx[iv], sp->Prevyy[iv], sp->Prevzz[iv]);
+                                       }
+                                       if (iv > 1) {
+                                               glVertex3f(xx, yy, zz);
+                                               glVertex3f(sp->Prevxx[iv - 1], sp->Prevyy[iv - 1], sp->Prevzz[iv - 1]);
+                                       }
+/* PURIFY 4.0.1 reports an unitialized memory read on the next line when using
+   * MesaGL 2.2 and -mono.  This has been fixed in MesaGL 2.3 and later. */
+                                       glEnd();
+                               }
+                       } else {
+                               if ((sp->cs[iv] > 1e+10) || (sp->cs[iv] < -1e+10)) {
+                                       xn = sp->cs[iv];
+                                       zn = sp->cs[iv];
+                                       yn = sp->ss[iv];
+                               } else {
+                                       xn = sp->cs[iv] * sp->cw[ih];
+                                       zn = sp->cs[iv] * sp->sw[ih];
+                                       yn = sp->ss[iv];
+                               }
+                               if ((ih > 1) && (iv > 1)) {
+                                       glNormal3f(xn, yn, zn);
+                                       glBegin(GL_POLYGON);
+                                       glVertex3f(xx, yy, zz);
+                                       if (!sp->flatshade)
+                                               glNormal3f(sp->Prevxn[iv], sp->Prevyn[iv], sp->Prevzn[iv]);
+                                       glVertex3f(sp->Prevxx[iv], sp->Prevyy[iv], sp->Prevzz[iv]);
+                                       if (!sp->flatshade)
+                                               glNormal3f(xnp, ynp, znp);
+                                       glVertex3f(xp, yp, zp);
+                                       if (!sp->flatshade)
+                                               glNormal3f(sp->Prevxn[iv - 1], sp->Prevyn[iv - 1], sp->Prevzn[iv - 1]);
+                                       glVertex3f(sp->Prevxx[iv - 1], sp->Prevyy[iv - 1], sp->Prevzz[iv - 1]);
+                                       glEnd();
+                               }
+                               if (sp->shownorms) {
+                                       if (!sp->flatshade)
+                                               glShadeModel(GL_FLAT);
+                                       glDisable(GL_LIGHTING);
+                                       glBegin(GL_LINES);
+                                       glVertex3f(xx, yy, zz);
+                                       glVertex3f(xx + xn, yy + yn, zz + zn);
+                                       glEnd();
+                                       if (!sp->flatshade)
+                                               glShadeModel(GL_SMOOTH);
+                                       glEnable(GL_LIGHTING);
+                               }
+                               xnp = sp->Prevxn[iv];
+                               ynp = sp->Prevyn[iv];
+                               znp = sp->Prevzn[iv];
+                               sp->Prevxn[iv] = xn;
+                               sp->Prevyn[iv] = yn;
+                               sp->Prevzn[iv] = zn;
+                       }
+
+                       xp = sp->Prevxx[iv];
+                       yp = sp->Prevyy[iv];
+                       zp = sp->Prevzz[iv];
+                       sp->Prevxx[iv] = xx;
+                       sp->Prevyy[iv] = yy;
+                       sp->Prevzz[iv] = zz;
+
+               }               /* next */
+       }                       /* next */
+}
+
+/**** End of really old code ****/
+
+static void
+SetCull(int init, superquadricsstruct * sp)
+{
+       static int  cullmode;
+
+       if (init) {
+               cullmode = 0;
+               return;
+       }
+       if (sp->Mode < 1.0001) {
+               if (cullmode != 1) {
+                       glEnable(GL_CULL_FACE);
+                       glCullFace(GL_BACK);
+                       cullmode = 1;
+               }
+       } else if (sp->Mode > 2.9999) {
+               if (cullmode != 2) {
+                       glEnable(GL_CULL_FACE);
+                       glCullFace(GL_FRONT);
+                       cullmode = 2;
+               }
+       } else {
+               if (cullmode) {
+                       glDisable(GL_CULL_FACE);
+                       cullmode = 0;
+               }
+       }
+}
+
+static void
+SetCurrentShape(superquadricsstruct * sp)
+{
+       int         t;
+
+       sp->xExponent = sp->now.xExponent = sp->later.xExponent;
+       sp->yExponent = sp->now.yExponent = sp->later.yExponent;
+
+       for (t = 0; t < 4; ++t) {
+               sp->curmat[t][0] = sp->now.r[t] = sp->later.r[t];
+               sp->curmat[t][1] = sp->now.g[t] = sp->later.g[t];
+               sp->curmat[t][2] = sp->now.b[t] = sp->later.b[t];
+       }
+
+       sp->Mode = (double) (sp->now.Mode = sp->later.Mode);
+       sp->rotx = sp->now.rotx = sp->later.rotx;
+       sp->rotz = sp->now.rotz = sp->later.rotz;
+
+       sp->counter = -sp->maxwait;
+
+       inputs(sp);
+}
+
+static void
+NextSuperquadric(superquadricsstruct * sp)
+{
+       double      fnow, flater;
+       int         t;
+
+       sp->roty -= sp->spinspeed;
+       while (sp->roty >= 360.0)
+               sp->roty -= 360.0;
+       while (sp->roty < 0.0)
+               sp->roty += 360.0;
+
+       --sp->viewcount;
+
+       if (sp->counter > 0) {
+               if (--sp->counter == 0) {
+                       SetCurrentShape(sp);
+                       if (sp->counter == 0) {         /* Happens if sp->maxwait == 0 */
+                               MakeUpStuff(0, sp);
+                               sp->counter = sp->maxcount;
+                       }
+               } else {
+                       fnow = (double) sp->counter / (double) sp->maxcount;
+                       flater = (double) (sp->maxcount - sp->counter) / (double) sp->maxcount;
+                       sp->xExponent = sp->now.xExponent * fnow + sp->later.xExponent * flater;
+                       sp->yExponent = sp->now.yExponent * fnow + sp->later.yExponent * flater;
+
+                       for (t = 0; t < 4; ++t) {
+                               sp->curmat[t][0] = sp->now.r[t] * fnow + sp->later.r[t] * flater;
+                               sp->curmat[t][1] = sp->now.g[t] * fnow + sp->later.g[t] * flater;
+                               sp->curmat[t][2] = sp->now.b[t] * fnow + sp->later.b[t] * flater;
+                       }
+
+                       sp->Mode = (double) sp->now.Mode * fnow + (double) sp->later.Mode * flater;
+                       sp->rotx = (double) sp->now.rotx * fnow + (double) sp->later.rotx * flater;
+                       sp->rotz = (double) sp->now.rotz * fnow + (double) sp->later.rotz * flater;
+
+                       inputs(sp);
+               }
+       } else {
+               if (++sp->counter >= 0) {
+                       MakeUpStuff(0, sp);
+                       sp->counter = sp->maxcount;
+               }
+       }
+}
+
+static void
+DisplaySuperquadrics(superquadricsstruct * sp)
+{
+       glDrawBuffer(GL_BACK);
+       if (sp->wireframe)
+               glClear(GL_COLOR_BUFFER_BIT);
+       else
+               glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+       if (sp->viewcount < 1) {
+               sp->viewcount = sp->viewwait;
+               ReshapeSuperquadrics(-1, -1);
+       }
+       glPushMatrix();
+       glTranslatef(0.0, 0.0, -((GLfloat) (sp->dist) / 16.0) - (sp->Mode * 3.0 - 1.0));        /* viewing transform  */
+       glRotatef(sp->rotx, 1.0, 0.0, 0.0);     /* pitch */
+       glRotatef(sp->rotz, 0.0, 0.0, 1.0);     /* bank */
+       glRotatef(sp->roty, 0.0, 1.0, 0.0);     /* "spin", like heading but comes after P & B */
+
+       SetCull(0, sp);
+
+       DoneScale(sp);
+
+       glPopMatrix();
+
+       /* Remember to flush & swap the buffers after calling this function! */
+}
+
+static void
+NextSuperquadricDisplay(superquadricsstruct * sp)
+{
+       NextSuperquadric(sp);
+       DisplaySuperquadrics(sp);
+}
+
+#define MINSIZE 200
+static void
+ReshapeSuperquadrics(int w, int h)
+{
+       static int  last_w = 0, last_h = 0;
+       int         maxsize, cursize;
+
+       if (w < 0) {
+               w = last_w;
+               h = last_h;
+       } else {
+               last_w = w;
+               last_h = h;
+       }
+       maxsize = (w < h) ? w : h;
+       if (maxsize <= MINSIZE) {
+               cursize = maxsize;
+       } else {
+               cursize = myrand(maxsize - MINSIZE) + MINSIZE;
+       }
+       if ((w > cursize) && (h > cursize)) {
+               glViewport(myrand(w - cursize), myrand(h - cursize), cursize, cursize);
+               w = h = cursize;
+       } else {
+               glViewport(0, 0, w, h);
+       }
+       glMatrixMode(GL_PROJECTION);
+       glLoadIdentity();
+       gluPerspective(30.0, (GLfloat) w / (GLfloat) h, 0.1, 200.0);
+       glMatrixMode(GL_MODELVIEW);
+       glLoadIdentity();
+}
+
+static void
+InitSuperquadrics(int wfmode, int snorm, int res, int count, float speed, superquadricsstruct * sp)
+{
+       GLfloat     ambient[] =
+       {0.4, 0.4, 0.4, 1.0};
+       GLfloat     position[] =
+       {10.0, 1.0, 1.0, 10.0};
+       GLfloat     mat_diffuse[] =
+       {1.0, 0.5, 0.5, 1.0};
+       GLfloat     mat_specular[] =
+       {0.8, 0.8, 0.8, 1.0};
+       GLfloat     mat_shininess[] =
+       {50.0};
+
+       int         t;
+
+       for (t = 0; t < 4; ++t)
+               sp->curmat[t][3] = 1.0;
+
+       sp->rotx = 35.0;
+       sp->roty = 0.0;
+       sp->rotz = 0.0;
+       sp->dist = (16 << 3);
+       sp->wireframe = sp->flatshade = sp->shownorms = 0;
+       sp->maxcount = count;
+       if (sp->maxcount < 1)
+               sp->maxcount = 1;
+       sp->maxwait = sp->maxcount >> 1;
+       SetCull(1, sp);
+
+       sp->spinspeed = speed;
+       sp->viewcount = sp->viewwait = (sp->maxcount < 2) ? 1 : (sp->maxcount << 3);
+
+       if (res < MinRes)
+               res = MinRes;
+       if (res > MaxRes)
+               res = MaxRes;
+       sp->resolution = res;
+
+       if (wfmode == 2)
+               sp->flatshade = 1;
+       else if (wfmode)
+               sp->wireframe = 1;
+
+       if (snorm)
+               sp->shownorms = 1;
+
+       if (sp->wireframe) {
+               glShadeModel(GL_FLAT);
+               glDisable(GL_LIGHTING);
+               glColor3f(mat_diffuse[0], mat_diffuse[1], mat_diffuse[2]);
+       } else {
+               if (sp->flatshade) {
+                       glShadeModel(GL_FLAT);
+                       position[0] = 1.0;
+                       position[3] = 0.0;
+               }
+               glEnable(GL_LIGHTING);
+               glEnable(GL_LIGHT0);
+               glDepthFunc(GL_LEQUAL);
+               glEnable(GL_DEPTH_TEST);
+
+               glLightfv(GL_LIGHT0, GL_AMBIENT, ambient);
+               glLightfv(GL_LIGHT0, GL_POSITION, position);
+
+               /*glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, mat_diffuse); */
+               glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, mat_specular);
+               glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, mat_shininess);
+
+               glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE);
+
+               glFrontFace(GL_CW);
+               glEnable(GL_NORMALIZE);
+       }
+
+       MakeUpStuff(1, sp);
+       SetCurrentShape(sp);
+       MakeUpStuff(1, sp);     /* Initialize it */
+       sp->counter = sp->maxcount;
+}
+
+/* End of superquadrics main functions */
+
+void
+init_superquadrics(ModeInfo * mi)
+{
+       Display    *display = MI_DISPLAY(mi);
+       Window      window = MI_WINDOW(mi);
+       int         screen = MI_SCREEN(mi);
+
+       superquadricsstruct *sp;
+
+       if (superquadrics == NULL) {
+               if ((superquadrics = (superquadricsstruct *) calloc(MI_NUM_SCREENS(mi),
+                                     sizeof (superquadricsstruct))) == NULL)
+                       return;
+       }
+       sp = &superquadrics[screen];
+       sp->mono = (MI_IS_MONO(mi) ? 1 : 0);
+
+       if ((sp->glx_context = init_GL(mi)) != NULL) {
+
+               InitSuperquadrics(MI_IS_WIREFRAME(mi), 0,
+                                 MI_COUNT(mi), MI_CYCLES(mi), spinspeed, sp);
+               ReshapeSuperquadrics(MI_WIDTH(mi), MI_HEIGHT(mi));
+
+               DisplaySuperquadrics(sp);
+               glFinish();
+               glXSwapBuffers(display, window);
+       } else {
+               MI_CLEARWINDOW(mi);
+       }
+}
+
+void
+draw_superquadrics(ModeInfo * mi)
+{
+       superquadricsstruct *sp = &superquadrics[MI_SCREEN(mi)];
+       Display    *display = MI_DISPLAY(mi);
+       Window      window = MI_WINDOW(mi);
+
+       if (!sp->glx_context)
+               return;
+
+       glXMakeCurrent(display, window, *(sp->glx_context));
+
+       NextSuperquadricDisplay(sp);
+
+       glFinish();
+       glXSwapBuffers(display, window);
+}
+
+void
+refresh_superquadrics(ModeInfo * mi)
+{
+       /* Nothing happens here */
+}
+
+void
+release_superquadrics(ModeInfo * mi)
+{
+       if (superquadrics != NULL) {
+               (void) free((void *) superquadrics);
+               superquadrics = NULL;
+       }
+       FreeAllGL(mi);
+}
+
+
+#endif
+
+/* End of superquadrics.c */
diff --git a/hacks/glx/swim.c b/hacks/glx/swim.c
new file mode 100644 (file)
index 0000000..0848d46
--- /dev/null
@@ -0,0 +1,234 @@
+/* atlantis --- Shows moving 3D sea animals */
+
+#if !defined( lint ) && !defined( SABER )
+static const char sccsid[] = "@(#)swim.c       1.3 98/06/18 xlockmore";
+
+#endif
+
+/* Copyright (c) E. Lassauge, 1998. */
+
+/*
+ * 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.
+ *
+ * This file is provided AS IS with no warranties of any kind.  The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof.  In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * The original code for this mode was written by Mark J. Kilgard
+ * as a demo for openGL programming.
+ * 
+ * Porting it to xlock  was possible by comparing the original Mesa's morph3d 
+ * demo with it's ported version to xlock, so thanks for Marcelo F. Vianna 
+ * (look at morph3d.c) for his indirect help.
+ *
+ * Thanks goes also to Brian Paul for making it possible and inexpensive
+ * to use OpenGL at home.
+ *
+ * My e-mail address is lassauge@sagem.fr
+ *
+ * Eric Lassauge  (May-13-1998)
+ *
+ */
+
+/**
+ * (c) Copyright 1993, 1994, Silicon Graphics, Inc.
+ * ALL RIGHTS RESERVED
+ * Permission to use, copy, modify, and distribute this software for
+ * any purpose and without fee is hereby granted, provided that the above
+ * copyright notice appear in all copies and that both the copyright notice
+ * and this permission notice appear in supporting documentation, and that
+ * the name of Silicon Graphics, Inc. not be used in advertising
+ * or publicity pertaining to distribution of the software without specific,
+ * written prior permission.
+ *
+ * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS"
+ * AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR
+ * FITNESS FOR A PARTICULAR PURPOSE.  IN NO EVENT SHALL SILICON
+ * GRAPHICS, INC.  BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT,
+ * SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY
+ * KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION,
+ * LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF
+ * THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC.  HAS BEEN
+ * ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
+ * POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
+ * US Government Users Restricted Rights
+ * Use, duplication, or disclosure by the Government is subject to
+ * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph
+ * (c)(1)(ii) of the Rights in Technical Data and Computer Software
+ * clause at DFARS 252.227-7013 and/or in similar or successor
+ * clauses in the FAR or the DOD or NASA FAR Supplement.
+ * Unpublished-- rights reserved under the copyright laws of the
+ * United States.  Contractor/manufacturer is Silicon Graphics,
+ * Inc., 2011 N.  Shoreline Blvd., Mountain View, CA 94039-7311.
+ *
+ * OpenGL(TM) is a trademark of Silicon Graphics, Inc.
+ */
+
+#ifdef STANDALONE
+# include <math.h>
+# include "xlockmoreI.h"       /* from the xscreensaver distribution */
+#else /* !STANDALONE */
+# include "xlock.h"            /* from the xlockmore distribution */
+#endif /* !STANDALONE */
+
+#ifdef USE_GL
+
+#include "atlantis.h"
+
+void
+FishTransform(fishRec * fish)
+{
+
+       glTranslatef(fish->y, fish->z, -fish->x);
+       glRotatef(-fish->psi, 0.0, 1.0, 0.0);
+       glRotatef(fish->theta, 1.0, 0.0, 0.0);
+       glRotatef(-fish->phi, 0.0, 0.0, 1.0);
+}
+
+void
+WhalePilot(fishRec * fish, float whalespeed, Bool whaledir)
+{
+
+       fish->phi = -20.0;
+       fish->theta = 0.0;
+       fish->psi += ((whaledir) ? -0.5 : 0.5);
+
+       fish->x += whalespeed * fish->v * cos(fish->psi / RAD) * cos(fish->theta / RAD);
+       fish->y += whalespeed * fish->v * sin(fish->psi / RAD) * cos(fish->theta / RAD);
+       fish->z += whalespeed * fish->v * sin(fish->theta / RAD);
+}
+
+void
+SharkPilot(fishRec * fish, float sharkspeed)
+{
+       static int  sign = 1;
+       float       X, Y, Z, tpsi, ttheta, thetal;
+
+       fish->xt = 60000.0;
+       fish->yt = 0.0;
+       fish->zt = 0.0;
+
+       X = fish->xt - fish->x;
+       Y = fish->yt - fish->y;
+       Z = fish->zt - fish->z;
+
+       thetal = fish->theta;
+
+       ttheta = RAD * atan(Z / (sqrt(X * X + Y * Y)));
+
+       if (ttheta > fish->theta + 0.25) {
+               fish->theta += 0.5;
+       } else if (ttheta < fish->theta - 0.25) {
+               fish->theta -= 0.5;
+       }
+       if (fish->theta > 90.0) {
+               fish->theta = 90.0;
+       }
+       if (fish->theta < -90.0) {
+               fish->theta = -90.0;
+       }
+       fish->dtheta = fish->theta - thetal;
+
+       tpsi = RAD * atan2(Y, X);
+
+       fish->attack = 0;
+
+       if (fabs(tpsi - fish->psi) < 10.0) {
+               fish->attack = 1;
+       } else if (fabs(tpsi - fish->psi) < 45.0) {
+               if (fish->psi > tpsi) {
+                       fish->psi -= 0.5;
+                       if (fish->psi < -180.0) {
+                               fish->psi += 360.0;
+                       }
+               } else if (fish->psi < tpsi) {
+                       fish->psi += 0.5;
+                       if (fish->psi > 180.0) {
+                               fish->psi -= 360.0;
+                       }
+               }
+       } else {
+               if (NRAND(100) > 98) {
+                       sign = 1 - sign;
+               }
+               fish->psi += sign;
+               if (fish->psi > 180.0) {
+                       fish->psi -= 360.0;
+               }
+               if (fish->psi < -180.0) {
+                       fish->psi += 360.0;
+               }
+       }
+
+       if (fish->attack) {
+               if (fish->v < 1.1) {
+                       fish->spurt = 1;
+               }
+               if (fish->spurt) {
+                       fish->v += 0.2;
+               }
+               if (fish->v > 5.0) {
+                       fish->spurt = 0;
+               }
+               if ((fish->v > 1.0) && (!fish->spurt)) {
+                       fish->v -= 0.2;
+               }
+       } else {
+               if (!(NRAND(400)) && (!fish->spurt)) {
+                       fish->spurt = 1;
+               }
+               if (fish->spurt) {
+                       fish->v += 0.05;
+               }
+               if (fish->v > 3.0) {
+                       fish->spurt = 0;
+               }
+               if ((fish->v > 1.0) && (!fish->spurt)) {
+                       fish->v -= 0.05;
+               }
+       }
+
+       fish->x += sharkspeed * fish->v * cos(fish->psi / RAD) * cos(fish->theta / RAD);
+       fish->y += sharkspeed * fish->v * sin(fish->psi / RAD) * cos(fish->theta / RAD);
+       fish->z += sharkspeed * fish->v * sin(fish->theta / RAD);
+}
+
+void
+SharkMiss(atlantisstruct * ap, int i)
+{
+       int         j;
+       float       avoid, thetal;
+       float       X, Y, Z, R;
+
+       for (j = 0; j < ap->num_sharks; j++) {
+               if (j != i) {
+                       X = ap->sharks[j].x - ap->sharks[i].x;
+                       Y = ap->sharks[j].y - ap->sharks[i].y;
+                       Z = ap->sharks[j].z - ap->sharks[i].z;
+
+                       R = sqrt(X * X + Y * Y + Z * Z);
+
+                       avoid = 1.0;
+                       thetal = ap->sharks[i].theta;
+
+                       if (R < ap->sharksize) {
+                               if (Z > 0.0) {
+                                       ap->sharks[i].theta -= avoid;
+                               } else {
+                                       ap->sharks[i].theta += avoid;
+                               }
+                       }
+                       ap->sharks[i].dtheta += (ap->sharks[i].theta - thetal);
+               }
+       }
+}
+#endif
diff --git a/hacks/glx/whale.c b/hacks/glx/whale.c
new file mode 100644 (file)
index 0000000..afff1d3
--- /dev/null
@@ -0,0 +1,1895 @@
+/* atlantis --- Shows moving 3D sea animals */
+
+#if !defined( lint ) && !defined( SABER )
+static const char sccsid[] = "@(#)whale.c      1.3 98/06/18 xlockmore";
+
+#endif
+
+/* Copyright (c) E. Lassauge, 1998. */
+
+/*-
+ * 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.
+ *
+ * This file is provided AS IS with no warranties of any kind.  The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof.  In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * The original code for this mode was written by Mark J. Kilgard
+ * as a demo for openGL programming.
+ * 
+ * Porting it to xlock  was possible by comparing the original Mesa's morph3d 
+ * demo with it's ported version to xlock, so thanks for Marcelo F. Vianna 
+ * (look at morph3d.c) for his indirect help.
+ *
+ * Thanks goes also to Brian Paul for making it possible and inexpensive
+ * to use OpenGL at home.
+ *
+ * My e-mail address is lassauge@sagem.fr
+ *
+ * Eric Lassauge  (May-13-1998)
+ *
+ */
+
+/*-
+ * (c) Copyright 1993, 1994, Silicon Graphics, Inc.
+ * ALL RIGHTS RESERVED
+ * Permission to use, copy, modify, and distribute this software for
+ * any purpose and without fee is hereby granted, provided that the above
+ * copyright notice appear in all copies and that both the copyright notice
+ * and this permission notice appear in supporting documentation, and that
+ * the name of Silicon Graphics, Inc. not be used in advertising
+ * or publicity pertaining to distribution of the software without specific,
+ * written prior permission.
+ *
+ * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS"
+ * AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR
+ * FITNESS FOR A PARTICULAR PURPOSE.  IN NO EVENT SHALL SILICON
+ * GRAPHICS, INC.  BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT,
+ * SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY
+ * KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION,
+ * LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF
+ * THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC.  HAS BEEN
+ * ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON
+ * ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE
+ * POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
+ * US Government Users Restricted Rights
+ * Use, duplication, or disclosure by the Government is subject to
+ * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph
+ * (c)(1)(ii) of the Rights in Technical Data and Computer Software
+ * clause at DFARS 252.227-7013 and/or in similar or successor
+ * clauses in the FAR or the DOD or NASA FAR Supplement.
+ * Unpublished-- rights reserved under the copyright laws of the
+ * United States.  Contractor/manufacturer is Silicon Graphics,
+ * Inc., 2011 N.  Shoreline Blvd., Mountain View, CA 94039-7311.
+ *
+ * OpenGL(TM) is a trademark of Silicon Graphics, Inc.
+ */
+#ifndef STANDALONE
+#include "xlock.h"
+#endif
+
+#ifdef USE_GL
+
+#ifdef STANDALONE
+#include <math.h>
+#include <GL/glx.h>
+#endif
+
+#include "atlantis.h"
+/* *INDENT-OFF* */
+static float N001[3] = {0.019249 ,0.011340 ,-0.999750};
+static float N002[3] = {-0.132579 ,0.954547 ,0.266952};
+static float N003[3] = {-0.196061 ,0.980392 ,-0.019778};
+static float N004[3] = {0.695461 ,0.604704 ,0.388158};
+static float N005[3] = {0.870600 ,0.425754 ,0.246557};
+static float N006[3] = {-0.881191 ,0.392012 ,0.264251};
+#if 0
+static float N007[3] = {0.000000 ,1.000000 ,0.000000};
+#endif
+static float N008[3] = {-0.341437 ,0.887477 ,0.309523};
+static float N009[3] = {0.124035 ,-0.992278 ,0.000000};
+static float N010[3] = {0.242536 ,0.000000 ,-0.970143};
+static float N011[3] = {0.588172 ,0.000000 ,0.808736};
+static float N012[3] = {0.929824 ,-0.340623 ,-0.139298};
+static float N013[3] = {0.954183 ,0.267108 ,-0.134865};
+static float N014[3] = {0.495127 ,0.855436 ,-0.151914};
+static float N015[3] = {-0.390199 ,0.906569 ,-0.160867};
+static float N016[3] = {-0.923605 ,0.354581 ,-0.145692};
+static float N017[3] = {-0.955796 ,-0.260667 ,-0.136036};
+static float N018[3] = {-0.501283 ,-0.853462 ,-0.142540};
+static float N019[3] = {0.405300 ,-0.901974 ,-0.148913};
+static float N020[3] = {0.909913 ,-0.392746 ,-0.133451};
+static float N021[3] = {0.936494 ,0.331147 ,-0.115414};
+static float N022[3] = {0.600131 ,0.793724 ,-0.099222};
+static float N023[3] = {-0.231556 ,0.968361 ,-0.093053};
+static float N024[3] = {-0.844369 ,0.525330 ,-0.105211};
+static float N025[3] = {-0.982725 ,-0.136329 ,-0.125164};
+static float N026[3] = {-0.560844 ,-0.822654 ,-0.093241};
+static float N027[3] = {0.263884 ,-0.959981 ,-0.093817};
+static float N028[3] = {0.842057 ,-0.525192 ,-0.122938};
+static float N029[3] = {0.921620 ,0.367565 ,-0.124546};
+static float N030[3] = {0.613927 ,0.784109 ,-0.090918};
+static float N031[3] = {-0.448754 ,0.888261 ,-0.098037};
+static float N032[3] = {-0.891865 ,0.434376 ,-0.126077};
+static float N033[3] = {-0.881447 ,-0.448017 ,-0.149437};
+static float N034[3] = {-0.345647 ,-0.922057 ,-0.174183};
+static float N035[3] = {0.307998 ,-0.941371 ,-0.137688};
+static float N036[3] = {0.806316 ,-0.574647 ,-0.140124};
+static float N037[3] = {0.961346 ,0.233646 ,-0.145681};
+static float N038[3] = {0.488451 ,0.865586 ,-0.110351};
+static float N039[3] = {-0.374290 ,0.921953 ,-0.099553};
+static float N040[3] = {-0.928504 ,0.344533 ,-0.138485};
+static float N041[3] = {-0.918419 ,-0.371792 ,-0.135189};
+static float N042[3] = {-0.520666 ,-0.833704 ,-0.183968};
+static float N043[3] = {0.339204 ,-0.920273 ,-0.195036};
+static float N044[3] = {0.921475 ,-0.387382 ,-0.028636};
+static float N045[3] = {0.842465 ,0.533335 ,-0.076204};
+static float N046[3] = {0.380110 ,0.924939 ,0.002073};
+static float N047[3] = {-0.276128 ,0.961073 ,-0.009579};
+static float N048[3] = {-0.879684 ,0.473001 ,-0.049250};
+static float N049[3] = {-0.947184 ,-0.317614 ,-0.044321};
+static float N050[3] = {-0.642059 ,-0.764933 ,-0.051363};
+static float N051[3] = {0.466794 ,-0.880921 ,-0.077990};
+static float N052[3] = {0.898509 ,-0.432277 ,0.076279};
+static float N053[3] = {0.938985 ,0.328141 ,0.103109};
+static float N054[3] = {0.442420 ,0.895745 ,0.043647};
+static float N055[3] = {-0.255163 ,0.966723 ,0.018407};
+static float N056[3] = {-0.833769 ,0.540650 ,0.111924};
+static float N057[3] = {-0.953653 ,-0.289939 ,0.080507};
+static float N058[3] = {-0.672357 ,-0.730524 ,0.119461};
+static float N059[3] = {0.522249 ,-0.846652 ,0.102157};
+static float N060[3] = {0.885868 ,-0.427631 ,0.179914};
+#if 0
+static float N061[3] = {0.000000 ,1.000000 ,0.000000};
+#endif
+static float N062[3] = {0.648942 ,0.743116 ,0.163255};
+static float N063[3] = {-0.578967 ,0.807730 ,0.111219};
+#if 0
+static float N064[3] = {0.000000 ,1.000000 ,0.000000};
+#endif
+static float N065[3] = {-0.909864 ,-0.352202 ,0.219321};
+static float N066[3] = {-0.502541 ,-0.818090 ,0.279610};
+static float N067[3] = {0.322919 ,-0.915358 ,0.240504};
+static float N068[3] = {0.242536 ,0.000000 ,-0.970143};
+static float N069[3] = {0.000000 ,1.000000 ,0.000000};
+static float N070[3] = {0.000000 ,1.000000 ,0.000000};
+static float N071[3] = {0.000000 ,1.000000 ,0.000000};
+static float N072[3] = {0.000000 ,1.000000 ,0.000000};
+static float N073[3] = {0.000000 ,1.000000 ,0.000000};
+static float N074[3] = {0.000000 ,1.000000 ,0.000000};
+static float N075[3] = {0.031220 ,0.999025 ,-0.031220};
+static float N076[3] = {0.000000 ,1.000000 ,0.000000};
+static float N077[3] = {0.446821 ,0.893642 ,0.041889};
+static float N078[3] = {0.863035 ,-0.100980 ,0.494949};
+static float N079[3] = {0.585597 ,-0.808215 ,0.062174};
+static float N080[3] = {0.000000 ,1.000000 ,0.000000};
+static float N081[3] = {1.000000 ,0.000000 ,0.000000};
+static float N082[3] = {0.000000 ,1.000000 ,0.000000};
+static float N083[3] = {-1.000000 ,0.000000 ,0.000000};
+static float N084[3] = {-0.478893 ,0.837129 ,-0.264343};
+static float N085[3] = {0.000000 ,1.000000 ,0.000000};
+static float N086[3] = {0.763909 ,0.539455 ,-0.354163};
+static float N087[3] = {0.446821 ,0.893642 ,0.041889};
+static float N088[3] = {0.385134 ,-0.908288 ,0.163352};
+static float N089[3] = {-0.605952 ,0.779253 ,-0.159961};
+static float N090[3] = {0.000000 ,1.000000 ,0.000000};
+static float N091[3] = {0.000000 ,1.000000 ,0.000000};
+static float N092[3] = {0.000000 ,1.000000 ,0.000000};
+static float N093[3] = {0.000000 ,1.000000 ,0.000000};
+static float N094[3] = {1.000000 ,0.000000 ,0.000000};
+static float N095[3] = {-1.000000 ,0.000000 ,0.000000};
+static float N096[3] = {0.644444 ,-0.621516 ,0.445433};
+static float N097[3] = {-0.760896 ,-0.474416 ,0.442681};
+static float N098[3] = {0.636888 ,-0.464314 ,0.615456};
+static float N099[3] = {-0.710295 ,0.647038 ,0.277168};
+static float N100[3] = {0.009604 ,0.993655 ,0.112063};
+#if 0
+static float N101[3] = {0.000000 ,1.000000 ,0.000000};
+static float N102[3] = {0.000000 ,1.000000 ,0.000000};
+static float N103[3] = {0.000000 ,1.000000 ,0.000000};
+static float N104[3] = {0.031837 ,0.999285 ,0.020415};
+static float N105[3] = {0.031837 ,0.999285 ,0.020415};
+static float N106[3] = {0.031837 ,0.999285 ,0.020415};
+static float N107[3] = {0.014647 ,0.999648 ,0.022115};
+static float N108[3] = {0.014647 ,0.999648 ,0.022115};
+static float N109[3] = {0.014647 ,0.999648 ,0.022115};
+static float N110[3] = {-0.985141 ,0.039475 ,0.167149};
+static float N111[3] = {-0.985141 ,0.039475 ,0.167149};
+static float N112[3] = {-0.985141 ,0.039475 ,0.167149};
+static float N113[3] = {0.000000 ,1.000000 ,0.000000};
+static float N114[3] = {0.000000 ,1.000000 ,0.000000};
+static float N115[3] = {0.000000 ,1.000000 ,0.000000};
+static float N116[3] = {0.000000 ,1.000000 ,0.000000};
+static float N117[3] = {0.000000 ,1.000000 ,0.000000};
+static float N118[3] = {0.000000 ,1.000000 ,0.000000};
+static float N119[3] = {0.000000 ,1.000000 ,0.000000};
+static float N120[3] = {0.000000 ,1.000000 ,0.000000};
+static float N121[3] = {0.000000 ,1.000000 ,0.000000};
+#endif
+static float iP001[3] = {18.74, 13.19, 3.76};
+static float P001[3] = {18.74, 13.19, 3.76};
+static float P002[3] = {0.00, 390.42, 10292.57};
+static float P003[3] = {55.80, 622.31, 8254.35};
+static float P004[3] = {20.80, 247.66, 10652.13};
+static float P005[3] = {487.51, 198.05, 9350.78};
+static float P006[3] = {-457.61, 199.04, 9353.01};
+#if 0
+static float P007[3] = {0.00, 259.00, 10276.27};
+#endif
+static float P008[3] = {-34.67, 247.64, 10663.71};
+static float iP009[3] = {97.46, 67.63, 593.82};
+static float iP010[3] = {-84.33, 67.63, 588.18};
+static float iP011[3] = {118.69, 8.98, -66.91};
+static float P009[3] = {97.46, 67.63, 593.82};
+static float P010[3] = {-84.33, 67.63, 588.18};
+static float P011[3] = {118.69, 8.98, -66.91};
+static float iP012[3] = {156.48, -31.95, 924.54};
+static float iP013[3] = {162.00, 110.22, 924.54};
+static float iP014[3] = {88.16, 221.65, 924.54};
+static float iP015[3] = {-65.21, 231.16, 924.54};
+static float iP016[3] = {-156.48, 121.97, 924.54};
+static float iP017[3] = {-162.00, -23.93, 924.54};
+static float iP018[3] = {-88.16, -139.10, 924.54};
+static float iP019[3] = {65.21, -148.61, 924.54};
+static float iP020[3] = {246.87, -98.73, 1783.04};
+static float iP021[3] = {253.17, 127.76, 1783.04};
+static float iP022[3] = {132.34, 270.77, 1783.04};
+static float iP023[3] = {-97.88, 285.04, 1783.04};
+static float iP024[3] = {-222.97, 139.80, 1783.04};
+static float iP025[3] = {-225.29, -86.68, 1783.04};
+static float iP026[3] = {-108.44, -224.15, 1783.04};
+static float iP027[3] = {97.88, -221.56, 1783.04};
+static float iP028[3] = {410.55, -200.66, 3213.87};
+static float iP029[3] = {432.19, 148.42, 3213.87};
+static float iP030[3] = {200.66, 410.55, 3213.87};
+static float iP031[3] = {-148.42, 432.19, 3213.87};
+static float iP032[3] = {-407.48, 171.88, 3213.87};
+static float iP033[3] = {-432.19, -148.42, 3213.87};
+static float iP034[3] = {-148.88, -309.74, 3213.87};
+static float iP035[3] = {156.38, -320.17, 3213.87};
+static float iP036[3] = {523.39, -303.81, 4424.57};
+static float iP037[3] = {574.66, 276.84, 4424.57};
+static float iP038[3] = {243.05, 492.50, 4424.57};
+static float iP039[3] = {-191.23, 520.13, 4424.57};
+static float iP040[3] = {-523.39, 304.01, 4424.57};
+static float iP041[3] = {-574.66, -231.83, 4424.57};
+static float iP042[3] = {-266.95, -578.17, 4424.57};
+static float iP043[3] = {211.14, -579.67, 4424.57};
+static float iP044[3] = {680.57, -370.27, 5943.46};
+static float iP045[3] = {834.01, 363.09, 5943.46};
+static float iP046[3] = {371.29, 614.13, 5943.46};
+static float iP047[3] = {-291.43, 621.86, 5943.46};
+static float iP048[3] = {-784.13, 362.60, 5943.46};
+static float iP049[3] = {-743.29, -325.82, 5943.46};
+static float iP050[3] = {-383.24, -804.77, 5943.46};
+static float iP051[3] = {283.47, -846.09, 5943.46};
+static float P012[3] = {156.48, -31.95, 924.54};
+static float P013[3] = {162.00, 110.22, 924.54};
+static float P014[3] = {88.16, 221.65, 924.54};
+static float P015[3] = {-65.21, 231.16, 924.54};
+static float P016[3] = {-156.48, 121.97, 924.54};
+static float P017[3] = {-162.00, -23.93, 924.54};
+static float P018[3] = {-88.16, -139.10, 924.54};
+static float P019[3] = {65.21, -148.61, 924.54};
+static float P020[3] = {246.87, -98.73, 1783.04};
+static float P021[3] = {253.17, 127.76, 1783.04};
+static float P022[3] = {132.34, 270.77, 1783.04};
+static float P023[3] = {-97.88, 285.04, 1783.04};
+static float P024[3] = {-222.97, 139.80, 1783.04};
+static float P025[3] = {-225.29, -86.68, 1783.04};
+static float P026[3] = {-108.44, -224.15, 1783.04};
+static float P027[3] = {97.88, -221.56, 1783.04};
+static float P028[3] = {410.55, -200.66, 3213.87};
+static float P029[3] = {432.19, 148.42, 3213.87};
+static float P030[3] = {200.66, 410.55, 3213.87};
+static float P031[3] = {-148.42, 432.19, 3213.87};
+static float P032[3] = {-407.48, 171.88, 3213.87};
+static float P033[3] = {-432.19, -148.42, 3213.87};
+static float P034[3] = {-148.88, -309.74, 3213.87};
+static float P035[3] = {156.38, -320.17, 3213.87};
+static float P036[3] = {523.39, -303.81, 4424.57};
+static float P037[3] = {574.66, 276.84, 4424.57};
+static float P038[3] = {243.05, 492.50, 4424.57};
+static float P039[3] = {-191.23, 520.13, 4424.57};
+static float P040[3] = {-523.39, 304.01, 4424.57};
+static float P041[3] = {-574.66, -231.83, 4424.57};
+static float P042[3] = {-266.95, -578.17, 4424.57};
+static float P043[3] = {211.14, -579.67, 4424.57};
+static float P044[3] = {680.57, -370.27, 5943.46};
+static float P045[3] = {834.01, 363.09, 5943.46};
+static float P046[3] = {371.29, 614.13, 5943.46};
+static float P047[3] = {-291.43, 621.86, 5943.46};
+static float P048[3] = {-784.13, 362.60, 5943.46};
+static float P049[3] = {-743.29, -325.82, 5943.46};
+static float P050[3] = {-383.24, -804.77, 5943.46};
+static float P051[3] = {283.47, -846.09, 5943.46};
+static float P052[3] = {599.09, -332.24, 7902.59};
+static float P053[3] = {735.48, 306.26, 7911.92};
+static float P054[3] = {321.55, 558.53, 7902.59};
+static float P055[3] = {-260.54, 559.84, 7902.59};
+static float P056[3] = {-698.66, 320.83, 7902.59};
+static float P057[3] = {-643.29, -299.16, 7902.59};
+static float P058[3] = {-341.47, -719.30, 7902.59};
+static float P059[3] = {252.57, -756.12, 7902.59};
+static float P060[3] = {458.39, -265.31, 9355.44};
+static float iP061[3] = {353.63, 138.70, 10214.20};
+static float P061[3] = {353.63, 138.70, 10214.20};
+static float P062[3] = {224.04, 438.98, 9364.77};
+static float P063[3] = {-165.71, 441.27, 9355.44};
+static float iP064[3] = {-326.40, 162.04, 10209.54};
+static float P064[3] = {-326.40, 162.04, 10209.54};
+static float P065[3] = {-473.99, -219.71, 9355.44};
+static float P066[3] = {-211.97, -479.87, 9355.44};
+static float P067[3] = {192.86, -504.03, 9355.44};
+static float iP068[3] = {-112.44, 9.25, -64.42};
+static float iP069[3] = {1155.63, 0.00, -182.46};
+static float iP070[3] = {-1143.13, 0.00, -181.54};
+static float iP071[3] = {1424.23, 0.00, -322.09};
+static float iP072[3] = {-1368.01, 0.00, -310.38};
+static float iP073[3] = {1255.57, 2.31, 114.05};
+static float iP074[3] = {-1149.38, 0.00, 117.12};
+static float iP075[3] = {718.36, 0.00, 433.36};
+static float iP076[3] = {-655.90, 0.00, 433.36};
+static float P068[3] = {-112.44, 9.25, -64.42};
+static float P069[3] = {1155.63, 0.00, -182.46};
+static float P070[3] = {-1143.13, 0.00, -181.54};
+static float P071[3] = {1424.23, 0.00, -322.09};
+static float P072[3] = {-1368.01, 0.00, -310.38};
+static float P073[3] = {1255.57, 2.31, 114.05};
+static float P074[3] = {-1149.38, 0.00, 117.12};
+static float P075[3] = {718.36, 0.00, 433.36};
+static float P076[3] = {-655.90, 0.00, 433.36};
+static float P077[3] = {1058.00, -2.66, 7923.51};
+static float P078[3] = {-1016.51, -15.47, 7902.87};
+static float P079[3] = {-1363.99, -484.50, 7593.38};
+static float P080[3] = {1478.09, -861.47, 7098.12};
+static float P081[3] = {1338.06, -284.68, 7024.15};
+static float P082[3] = {-1545.51, -860.64, 7106.60};
+static float P083[3] = {1063.19, -70.46, 7466.60};
+static float P084[3] = {-1369.18, -288.11, 7015.34};
+static float P085[3] = {1348.44, -482.50, 7591.41};
+static float P086[3] = {-1015.45, -96.80, 7474.86};
+static float P087[3] = {731.04, 148.38, 7682.58};
+static float P088[3] = {-697.03, 151.82, 7668.81};
+static float P089[3] = {-686.82, 157.09, 7922.29};
+static float P090[3] = {724.73, 147.75, 7931.39};
+static float iP091[3] = {0.00, 327.10, 2346.55};
+static float iP092[3] = {0.00, 552.28, 2311.31};
+static float iP093[3] = {0.00, 721.16, 2166.41};
+static float iP094[3] = {0.00, 693.42, 2388.80};
+static float iP095[3] = {0.00, 389.44, 2859.97};
+static float P091[3] = {0.00, 327.10, 2346.55};
+static float P092[3] = {0.00, 552.28, 2311.31};
+static float P093[3] = {0.00, 721.16, 2166.41};
+static float P094[3] = {0.00, 693.42, 2388.80};
+static float P095[3] = {0.00, 389.44, 2859.97};
+static float iP096[3] = {222.02, -183.67, 10266.89};
+static float iP097[3] = {-128.90, -182.70, 10266.89};
+static float iP098[3] = {41.04, 88.31, 10659.36};
+static float iP099[3] = {-48.73, 88.30, 10659.36};
+static float P096[3] = {222.02, -183.67, 10266.89};
+static float P097[3] = {-128.90, -182.70, 10266.89};
+static float P098[3] = {41.04, 88.31, 10659.36};
+static float P099[3] = {-48.73, 88.30, 10659.36};
+static float P100[3] = {0.00, 603.42, 9340.68};
+#if 0
+static float P101[3] = {5.70, 567.00, 7862.98};
+static float P102[3] = {521.61, 156.61, 9162.34};
+static float P103[3] = {83.68, 566.67, 7861.26};
+#endif
+static float P104[3] = {-9.86, 567.62, 7858.65};
+static float P105[3] = {31.96, 565.27, 7908.46};
+static float P106[3] = {22.75, 568.13, 7782.83};
+static float P107[3] = {58.93, 568.42, 7775.94};
+static float P108[3] = {55.91, 565.59, 7905.86};
+static float P109[3] = {99.21, 566.00, 7858.65};
+static float P110[3] = {-498.83, 148.14, 9135.10};
+static float P111[3] = {-495.46, 133.24, 9158.48};
+static float P112[3] = {-490.82, 146.23, 9182.76};
+static float P113[3] = {-489.55, 174.11, 9183.66};
+static float P114[3] = {-492.92, 189.00, 9160.28};
+static float P115[3] = {-497.56, 176.02, 9136.00};
+static float P116[3] = {526.54, 169.68, 9137.70};
+static float P117[3] = {523.49, 184.85, 9161.42};
+static float P118[3] = {518.56, 171.78, 9186.06};
+static float P119[3] = {516.68, 143.53, 9186.98};
+static float P120[3] = {519.73, 128.36, 9163.26};
+static float P121[3] = {524.66, 141.43, 9138.62};
+/* *INDENT-ON* */
+
+
+
+static void
+Whale001(GLenum cap)
+{
+       glBegin(cap);
+       glNormal3fv(N001);
+       glVertex3fv(P001);
+       glNormal3fv(N068);
+       glVertex3fv(P068);
+       glNormal3fv(N010);
+       glVertex3fv(P010);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N068);
+       glVertex3fv(P068);
+       glNormal3fv(N076);
+       glVertex3fv(P076);
+       glNormal3fv(N010);
+       glVertex3fv(P010);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N068);
+       glVertex3fv(P068);
+       glNormal3fv(N070);
+       glVertex3fv(P070);
+       glNormal3fv(N076);
+       glVertex3fv(P076);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N076);
+       glVertex3fv(P076);
+       glNormal3fv(N070);
+       glVertex3fv(P070);
+       glNormal3fv(N074);
+       glVertex3fv(P074);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N070);
+       glVertex3fv(P070);
+       glNormal3fv(N072);
+       glVertex3fv(P072);
+       glNormal3fv(N074);
+       glVertex3fv(P074);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N072);
+       glVertex3fv(P072);
+       glNormal3fv(N070);
+       glVertex3fv(P070);
+       glNormal3fv(N074);
+       glVertex3fv(P074);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N074);
+       glVertex3fv(P074);
+       glNormal3fv(N070);
+       glVertex3fv(P070);
+       glNormal3fv(N076);
+       glVertex3fv(P076);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N070);
+       glVertex3fv(P070);
+       glNormal3fv(N068);
+       glVertex3fv(P068);
+       glNormal3fv(N076);
+       glVertex3fv(P076);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N076);
+       glVertex3fv(P076);
+       glNormal3fv(N068);
+       glVertex3fv(P068);
+       glNormal3fv(N010);
+       glVertex3fv(P010);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N068);
+       glVertex3fv(P068);
+       glNormal3fv(N001);
+       glVertex3fv(P001);
+       glNormal3fv(N010);
+       glVertex3fv(P010);
+       glEnd();
+}
+
+static void
+Whale002(GLenum cap)
+{
+       glBegin(cap);
+       glNormal3fv(N011);
+       glVertex3fv(P011);
+       glNormal3fv(N001);
+       glVertex3fv(P001);
+       glNormal3fv(N009);
+       glVertex3fv(P009);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N075);
+       glVertex3fv(P075);
+       glNormal3fv(N011);
+       glVertex3fv(P011);
+       glNormal3fv(N009);
+       glVertex3fv(P009);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N069);
+       glVertex3fv(P069);
+       glNormal3fv(N011);
+       glVertex3fv(P011);
+       glNormal3fv(N075);
+       glVertex3fv(P075);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N069);
+       glVertex3fv(P069);
+       glNormal3fv(N075);
+       glVertex3fv(P075);
+       glNormal3fv(N073);
+       glVertex3fv(P073);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N071);
+       glVertex3fv(P071);
+       glNormal3fv(N069);
+       glVertex3fv(P069);
+       glNormal3fv(N073);
+       glVertex3fv(P073);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N001);
+       glVertex3fv(P001);
+       glNormal3fv(N011);
+       glVertex3fv(P011);
+       glNormal3fv(N009);
+       glVertex3fv(P009);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N009);
+       glVertex3fv(P009);
+       glNormal3fv(N011);
+       glVertex3fv(P011);
+       glNormal3fv(N075);
+       glVertex3fv(P075);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N011);
+       glVertex3fv(P011);
+       glNormal3fv(N069);
+       glVertex3fv(P069);
+       glNormal3fv(N075);
+       glVertex3fv(P075);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N069);
+       glVertex3fv(P069);
+       glNormal3fv(N073);
+       glVertex3fv(P073);
+       glNormal3fv(N075);
+       glVertex3fv(P075);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N069);
+       glVertex3fv(P069);
+       glNormal3fv(N071);
+       glVertex3fv(P071);
+       glNormal3fv(N073);
+       glVertex3fv(P073);
+       glEnd();
+}
+
+static void
+Whale003(GLenum cap)
+{
+       glBegin(cap);
+       glNormal3fv(N018);
+       glVertex3fv(P018);
+       glNormal3fv(N001);
+       glVertex3fv(P001);
+       glNormal3fv(N019);
+       glVertex3fv(P019);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N019);
+       glVertex3fv(P019);
+       glNormal3fv(N001);
+       glVertex3fv(P001);
+       glNormal3fv(N012);
+       glVertex3fv(P012);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N017);
+       glVertex3fv(P017);
+       glNormal3fv(N001);
+       glVertex3fv(P001);
+       glNormal3fv(N018);
+       glVertex3fv(P018);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N001);
+       glVertex3fv(P001);
+       glNormal3fv(N017);
+       glVertex3fv(P017);
+       glNormal3fv(N016);
+       glVertex3fv(P016);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N001);
+       glVertex3fv(P001);
+       glNormal3fv(N013);
+       glVertex3fv(P013);
+       glNormal3fv(N012);
+       glVertex3fv(P012);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N001);
+       glVertex3fv(P001);
+       glNormal3fv(N016);
+       glVertex3fv(P016);
+       glNormal3fv(N015);
+       glVertex3fv(P015);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N001);
+       glVertex3fv(P001);
+       glNormal3fv(N014);
+       glVertex3fv(P014);
+       glNormal3fv(N013);
+       glVertex3fv(P013);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N001);
+       glVertex3fv(P001);
+       glNormal3fv(N015);
+       glVertex3fv(P015);
+       glNormal3fv(N014);
+       glVertex3fv(P014);
+       glEnd();
+}
+
+static void
+Whale004(GLenum cap)
+{
+       glBegin(cap);
+       glNormal3fv(N014);
+       glVertex3fv(P014);
+       glNormal3fv(N015);
+       glVertex3fv(P015);
+       glNormal3fv(N023);
+       glVertex3fv(P023);
+       glNormal3fv(N022);
+       glVertex3fv(P022);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N015);
+       glVertex3fv(P015);
+       glNormal3fv(N016);
+       glVertex3fv(P016);
+       glNormal3fv(N024);
+       glVertex3fv(P024);
+       glNormal3fv(N023);
+       glVertex3fv(P023);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N016);
+       glVertex3fv(P016);
+       glNormal3fv(N017);
+       glVertex3fv(P017);
+       glNormal3fv(N025);
+       glVertex3fv(P025);
+       glNormal3fv(N024);
+       glVertex3fv(P024);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N017);
+       glVertex3fv(P017);
+       glNormal3fv(N018);
+       glVertex3fv(P018);
+       glNormal3fv(N026);
+       glVertex3fv(P026);
+       glNormal3fv(N025);
+       glVertex3fv(P025);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N013);
+       glVertex3fv(P013);
+       glNormal3fv(N014);
+       glVertex3fv(P014);
+       glNormal3fv(N022);
+       glVertex3fv(P022);
+       glNormal3fv(N021);
+       glVertex3fv(P021);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N012);
+       glVertex3fv(P012);
+       glNormal3fv(N013);
+       glVertex3fv(P013);
+       glNormal3fv(N021);
+       glVertex3fv(P021);
+       glNormal3fv(N020);
+       glVertex3fv(P020);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N018);
+       glVertex3fv(P018);
+       glNormal3fv(N019);
+       glVertex3fv(P019);
+       glNormal3fv(N027);
+       glVertex3fv(P027);
+       glNormal3fv(N026);
+       glVertex3fv(P026);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N019);
+       glVertex3fv(P019);
+       glNormal3fv(N012);
+       glVertex3fv(P012);
+       glNormal3fv(N020);
+       glVertex3fv(P020);
+       glNormal3fv(N027);
+       glVertex3fv(P027);
+       glEnd();
+}
+
+static void
+Whale005(GLenum cap)
+{
+       glBegin(cap);
+       glNormal3fv(N022);
+       glVertex3fv(P022);
+       glNormal3fv(N023);
+       glVertex3fv(P023);
+       glNormal3fv(N031);
+       glVertex3fv(P031);
+       glNormal3fv(N030);
+       glVertex3fv(P030);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N021);
+       glVertex3fv(P021);
+       glNormal3fv(N022);
+       glVertex3fv(P022);
+       glNormal3fv(N030);
+       glVertex3fv(P030);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N021);
+       glVertex3fv(P021);
+       glNormal3fv(N030);
+       glVertex3fv(P030);
+       glNormal3fv(N029);
+       glVertex3fv(P029);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N023);
+       glVertex3fv(P023);
+       glNormal3fv(N024);
+       glVertex3fv(P024);
+       glNormal3fv(N031);
+       glVertex3fv(P031);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N024);
+       glVertex3fv(P024);
+       glNormal3fv(N032);
+       glVertex3fv(P032);
+       glNormal3fv(N031);
+       glVertex3fv(P031);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N024);
+       glVertex3fv(P024);
+       glNormal3fv(N025);
+       glVertex3fv(P025);
+       glNormal3fv(N032);
+       glVertex3fv(P032);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N025);
+       glVertex3fv(P025);
+       glNormal3fv(N033);
+       glVertex3fv(P033);
+       glNormal3fv(N032);
+       glVertex3fv(P032);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N020);
+       glVertex3fv(P020);
+       glNormal3fv(N021);
+       glVertex3fv(P021);
+       glNormal3fv(N029);
+       glVertex3fv(P029);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N020);
+       glVertex3fv(P020);
+       glNormal3fv(N029);
+       glVertex3fv(P029);
+       glNormal3fv(N028);
+       glVertex3fv(P028);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N027);
+       glVertex3fv(P027);
+       glNormal3fv(N020);
+       glVertex3fv(P020);
+       glNormal3fv(N028);
+       glVertex3fv(P028);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N027);
+       glVertex3fv(P027);
+       glNormal3fv(N028);
+       glVertex3fv(P028);
+       glNormal3fv(N035);
+       glVertex3fv(P035);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N025);
+       glVertex3fv(P025);
+       glNormal3fv(N026);
+       glVertex3fv(P026);
+       glNormal3fv(N033);
+       glVertex3fv(P033);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N033);
+       glVertex3fv(P033);
+       glNormal3fv(N026);
+       glVertex3fv(P026);
+       glNormal3fv(N034);
+       glVertex3fv(P034);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N026);
+       glVertex3fv(P026);
+       glNormal3fv(N027);
+       glVertex3fv(P027);
+       glNormal3fv(N035);
+       glVertex3fv(P035);
+       glNormal3fv(N034);
+       glVertex3fv(P034);
+       glEnd();
+}
+
+static void
+Whale006(GLenum cap)
+{
+       glBegin(cap);
+       glNormal3fv(N092);
+       glVertex3fv(P092);
+       glNormal3fv(N093);
+       glVertex3fv(P093);
+       glNormal3fv(N094);
+       glVertex3fv(P094);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N093);
+       glVertex3fv(P093);
+       glNormal3fv(N092);
+       glVertex3fv(P092);
+       glNormal3fv(N094);
+       glVertex3fv(P094);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N092);
+       glVertex3fv(P092);
+       glNormal3fv(N091);
+       glVertex3fv(P091);
+       glNormal3fv(N095);
+       glVertex3fv(P095);
+       glNormal3fv(N094);
+       glVertex3fv(P094);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N091);
+       glVertex3fv(P091);
+       glNormal3fv(N092);
+       glVertex3fv(P092);
+       glNormal3fv(N094);
+       glVertex3fv(P094);
+       glNormal3fv(N095);
+       glVertex3fv(P095);
+       glEnd();
+}
+
+static void
+Whale007(GLenum cap)
+{
+       glBegin(cap);
+       glNormal3fv(N030);
+       glVertex3fv(P030);
+       glNormal3fv(N031);
+       glVertex3fv(P031);
+       glNormal3fv(N039);
+       glVertex3fv(P039);
+       glNormal3fv(N038);
+       glVertex3fv(P038);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N029);
+       glVertex3fv(P029);
+       glNormal3fv(N030);
+       glVertex3fv(P030);
+       glNormal3fv(N038);
+       glVertex3fv(P038);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N029);
+       glVertex3fv(P029);
+       glNormal3fv(N038);
+       glVertex3fv(P038);
+       glNormal3fv(N037);
+       glVertex3fv(P037);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N028);
+       glVertex3fv(P028);
+       glNormal3fv(N029);
+       glVertex3fv(P029);
+       glNormal3fv(N037);
+       glVertex3fv(P037);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N028);
+       glVertex3fv(P028);
+       glNormal3fv(N037);
+       glVertex3fv(P037);
+       glNormal3fv(N036);
+       glVertex3fv(P036);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N035);
+       glVertex3fv(P035);
+       glNormal3fv(N028);
+       glVertex3fv(P028);
+       glNormal3fv(N036);
+       glVertex3fv(P036);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N035);
+       glVertex3fv(P035);
+       glNormal3fv(N036);
+       glVertex3fv(P036);
+       glNormal3fv(N043);
+       glVertex3fv(P043);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N034);
+       glVertex3fv(P034);
+       glNormal3fv(N035);
+       glVertex3fv(P035);
+       glNormal3fv(N043);
+       glVertex3fv(P043);
+       glNormal3fv(N042);
+       glVertex3fv(P042);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N033);
+       glVertex3fv(P033);
+       glNormal3fv(N034);
+       glVertex3fv(P034);
+       glNormal3fv(N042);
+       glVertex3fv(P042);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N033);
+       glVertex3fv(P033);
+       glNormal3fv(N042);
+       glVertex3fv(P042);
+       glNormal3fv(N041);
+       glVertex3fv(P041);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N031);
+       glVertex3fv(P031);
+       glNormal3fv(N032);
+       glVertex3fv(P032);
+       glNormal3fv(N039);
+       glVertex3fv(P039);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N039);
+       glVertex3fv(P039);
+       glNormal3fv(N032);
+       glVertex3fv(P032);
+       glNormal3fv(N040);
+       glVertex3fv(P040);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N032);
+       glVertex3fv(P032);
+       glNormal3fv(N033);
+       glVertex3fv(P033);
+       glNormal3fv(N040);
+       glVertex3fv(P040);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N040);
+       glVertex3fv(P040);
+       glNormal3fv(N033);
+       glVertex3fv(P033);
+       glNormal3fv(N041);
+       glVertex3fv(P041);
+       glEnd();
+}
+
+static void
+Whale008(GLenum cap)
+{
+       glBegin(cap);
+       glNormal3fv(N042);
+       glVertex3fv(P042);
+       glNormal3fv(N043);
+       glVertex3fv(P043);
+       glNormal3fv(N051);
+       glVertex3fv(P051);
+       glNormal3fv(N050);
+       glVertex3fv(P050);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N043);
+       glVertex3fv(P043);
+       glNormal3fv(N036);
+       glVertex3fv(P036);
+       glNormal3fv(N051);
+       glVertex3fv(P051);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N051);
+       glVertex3fv(P051);
+       glNormal3fv(N036);
+       glVertex3fv(P036);
+       glNormal3fv(N044);
+       glVertex3fv(P044);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N041);
+       glVertex3fv(P041);
+       glNormal3fv(N042);
+       glVertex3fv(P042);
+       glNormal3fv(N050);
+       glVertex3fv(P050);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N041);
+       glVertex3fv(P041);
+       glNormal3fv(N050);
+       glVertex3fv(P050);
+       glNormal3fv(N049);
+       glVertex3fv(P049);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N036);
+       glVertex3fv(P036);
+       glNormal3fv(N037);
+       glVertex3fv(P037);
+       glNormal3fv(N044);
+       glVertex3fv(P044);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N044);
+       glVertex3fv(P044);
+       glNormal3fv(N037);
+       glVertex3fv(P037);
+       glNormal3fv(N045);
+       glVertex3fv(P045);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N040);
+       glVertex3fv(P040);
+       glNormal3fv(N041);
+       glVertex3fv(P041);
+       glNormal3fv(N049);
+       glVertex3fv(P049);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N040);
+       glVertex3fv(P040);
+       glNormal3fv(N049);
+       glVertex3fv(P049);
+       glNormal3fv(N048);
+       glVertex3fv(P048);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N039);
+       glVertex3fv(P039);
+       glNormal3fv(N040);
+       glVertex3fv(P040);
+       glNormal3fv(N048);
+       glVertex3fv(P048);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N039);
+       glVertex3fv(P039);
+       glNormal3fv(N048);
+       glVertex3fv(P048);
+       glNormal3fv(N047);
+       glVertex3fv(P047);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N037);
+       glVertex3fv(P037);
+       glNormal3fv(N038);
+       glVertex3fv(P038);
+       glNormal3fv(N045);
+       glVertex3fv(P045);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N038);
+       glVertex3fv(P038);
+       glNormal3fv(N046);
+       glVertex3fv(P046);
+       glNormal3fv(N045);
+       glVertex3fv(P045);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N038);
+       glVertex3fv(P038);
+       glNormal3fv(N039);
+       glVertex3fv(P039);
+       glNormal3fv(N047);
+       glVertex3fv(P047);
+       glNormal3fv(N046);
+       glVertex3fv(P046);
+       glEnd();
+}
+
+static void
+Whale009(GLenum cap)
+{
+       glBegin(cap);
+       glNormal3fv(N050);
+       glVertex3fv(P050);
+       glNormal3fv(N051);
+       glVertex3fv(P051);
+       glNormal3fv(N059);
+       glVertex3fv(P059);
+       glNormal3fv(N058);
+       glVertex3fv(P058);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N051);
+       glVertex3fv(P051);
+       glNormal3fv(N044);
+       glVertex3fv(P044);
+       glNormal3fv(N059);
+       glVertex3fv(P059);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N059);
+       glVertex3fv(P059);
+       glNormal3fv(N044);
+       glVertex3fv(P044);
+       glNormal3fv(N052);
+       glVertex3fv(P052);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N044);
+       glVertex3fv(P044);
+       glNormal3fv(N045);
+       glVertex3fv(P045);
+       glNormal3fv(N053);
+       glVertex3fv(P053);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N044);
+       glVertex3fv(P044);
+       glNormal3fv(N053);
+       glVertex3fv(P053);
+       glNormal3fv(N052);
+       glVertex3fv(P052);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N049);
+       glVertex3fv(P049);
+       glNormal3fv(N050);
+       glVertex3fv(P050);
+       glNormal3fv(N058);
+       glVertex3fv(P058);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N049);
+       glVertex3fv(P049);
+       glNormal3fv(N058);
+       glVertex3fv(P058);
+       glNormal3fv(N057);
+       glVertex3fv(P057);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N048);
+       glVertex3fv(P048);
+       glNormal3fv(N049);
+       glVertex3fv(P049);
+       glNormal3fv(N057);
+       glVertex3fv(P057);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N048);
+       glVertex3fv(P048);
+       glNormal3fv(N057);
+       glVertex3fv(P057);
+       glNormal3fv(N056);
+       glVertex3fv(P056);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N047);
+       glVertex3fv(P047);
+       glNormal3fv(N048);
+       glVertex3fv(P048);
+       glNormal3fv(N056);
+       glVertex3fv(P056);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N047);
+       glVertex3fv(P047);
+       glNormal3fv(N056);
+       glVertex3fv(P056);
+       glNormal3fv(N055);
+       glVertex3fv(P055);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N045);
+       glVertex3fv(P045);
+       glNormal3fv(N046);
+       glVertex3fv(P046);
+       glNormal3fv(N053);
+       glVertex3fv(P053);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N046);
+       glVertex3fv(P046);
+       glNormal3fv(N054);
+       glVertex3fv(P054);
+       glNormal3fv(N053);
+       glVertex3fv(P053);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N046);
+       glVertex3fv(P046);
+       glNormal3fv(N047);
+       glVertex3fv(P047);
+       glNormal3fv(N055);
+       glVertex3fv(P055);
+       glNormal3fv(N054);
+       glVertex3fv(P054);
+       glEnd();
+}
+
+static void
+Whale010(GLenum cap)
+{
+       glBegin(cap);
+       glNormal3fv(N080);
+       glVertex3fv(P080);
+       glNormal3fv(N081);
+       glVertex3fv(P081);
+       glNormal3fv(N085);
+       glVertex3fv(P085);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N081);
+       glVertex3fv(P081);
+       glNormal3fv(N083);
+       glVertex3fv(P083);
+       glNormal3fv(N085);
+       glVertex3fv(P085);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N085);
+       glVertex3fv(P085);
+       glNormal3fv(N083);
+       glVertex3fv(P083);
+       glNormal3fv(N077);
+       glVertex3fv(P077);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N083);
+       glVertex3fv(P083);
+       glNormal3fv(N087);
+       glVertex3fv(P087);
+       glNormal3fv(N077);
+       glVertex3fv(P077);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N077);
+       glVertex3fv(P077);
+       glNormal3fv(N087);
+       glVertex3fv(P087);
+       glNormal3fv(N090);
+       glVertex3fv(P090);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N081);
+       glVertex3fv(P081);
+       glNormal3fv(N080);
+       glVertex3fv(P080);
+       glNormal3fv(N085);
+       glVertex3fv(P085);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N083);
+       glVertex3fv(P083);
+       glNormal3fv(N081);
+       glVertex3fv(P081);
+       glNormal3fv(N085);
+       glVertex3fv(P085);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N083);
+       glVertex3fv(P083);
+       glNormal3fv(N085);
+       glVertex3fv(P085);
+       glNormal3fv(N077);
+       glVertex3fv(P077);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N087);
+       glVertex3fv(P087);
+       glNormal3fv(N083);
+       glVertex3fv(P083);
+       glNormal3fv(N077);
+       glVertex3fv(P077);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N087);
+       glVertex3fv(P087);
+       glNormal3fv(N077);
+       glVertex3fv(P077);
+       glNormal3fv(N090);
+       glVertex3fv(P090);
+       glEnd();
+}
+
+static void
+Whale011(GLenum cap)
+{
+       glBegin(cap);
+       glNormal3fv(N082);
+       glVertex3fv(P082);
+       glNormal3fv(N084);
+       glVertex3fv(P084);
+       glNormal3fv(N079);
+       glVertex3fv(P079);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N084);
+       glVertex3fv(P084);
+       glNormal3fv(N086);
+       glVertex3fv(P086);
+       glNormal3fv(N079);
+       glVertex3fv(P079);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N079);
+       glVertex3fv(P079);
+       glNormal3fv(N086);
+       glVertex3fv(P086);
+       glNormal3fv(N078);
+       glVertex3fv(P078);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N086);
+       glVertex3fv(P086);
+       glNormal3fv(N088);
+       glVertex3fv(P088);
+       glNormal3fv(N078);
+       glVertex3fv(P078);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N078);
+       glVertex3fv(P078);
+       glNormal3fv(N088);
+       glVertex3fv(P088);
+       glNormal3fv(N089);
+       glVertex3fv(P089);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N088);
+       glVertex3fv(P088);
+       glNormal3fv(N086);
+       glVertex3fv(P086);
+       glNormal3fv(N089);
+       glVertex3fv(P089);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N089);
+       glVertex3fv(P089);
+       glNormal3fv(N086);
+       glVertex3fv(P086);
+       glNormal3fv(N078);
+       glVertex3fv(P078);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N086);
+       glVertex3fv(P086);
+       glNormal3fv(N084);
+       glVertex3fv(P084);
+       glNormal3fv(N078);
+       glVertex3fv(P078);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N078);
+       glVertex3fv(P078);
+       glNormal3fv(N084);
+       glVertex3fv(P084);
+       glNormal3fv(N079);
+       glVertex3fv(P079);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N084);
+       glVertex3fv(P084);
+       glNormal3fv(N082);
+       glVertex3fv(P082);
+       glNormal3fv(N079);
+       glVertex3fv(P079);
+       glEnd();
+}
+
+static void
+Whale012(GLenum cap)
+{
+       glBegin(cap);
+       glNormal3fv(N058);
+       glVertex3fv(P058);
+       glNormal3fv(N059);
+       glVertex3fv(P059);
+       glNormal3fv(N067);
+       glVertex3fv(P067);
+       glNormal3fv(N066);
+       glVertex3fv(P066);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N059);
+       glVertex3fv(P059);
+       glNormal3fv(N052);
+       glVertex3fv(P052);
+       glNormal3fv(N060);
+       glVertex3fv(P060);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N059);
+       glVertex3fv(P059);
+       glNormal3fv(N060);
+       glVertex3fv(P060);
+       glNormal3fv(N067);
+       glVertex3fv(P067);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N058);
+       glVertex3fv(P058);
+       glNormal3fv(N066);
+       glVertex3fv(P066);
+       glNormal3fv(N065);
+       glVertex3fv(P065);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N058);
+       glVertex3fv(P058);
+       glNormal3fv(N065);
+       glVertex3fv(P065);
+       glNormal3fv(N057);
+       glVertex3fv(P057);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N056);
+       glVertex3fv(P056);
+       glNormal3fv(N057);
+       glVertex3fv(P057);
+       glNormal3fv(N065);
+       glVertex3fv(P065);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N056);
+       glVertex3fv(P056);
+       glNormal3fv(N065);
+       glVertex3fv(P065);
+       glNormal3fv(N006);
+       glVertex3fv(P006);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N056);
+       glVertex3fv(P056);
+       glNormal3fv(N006);
+       glVertex3fv(P006);
+       glNormal3fv(N063);
+       glVertex3fv(P063);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N056);
+       glVertex3fv(P056);
+       glNormal3fv(N063);
+       glVertex3fv(P063);
+       glNormal3fv(N055);
+       glVertex3fv(P055);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N054);
+       glVertex3fv(P054);
+       glNormal3fv(N062);
+       glVertex3fv(P062);
+       glNormal3fv(N005);
+       glVertex3fv(P005);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N054);
+       glVertex3fv(P054);
+       glNormal3fv(N005);
+       glVertex3fv(P005);
+       glNormal3fv(N053);
+       glVertex3fv(P053);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N053);
+       glVertex3fv(P053);
+       glNormal3fv(N005);
+       glVertex3fv(P005);
+       glNormal3fv(N060);
+       glVertex3fv(P060);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N053);
+       glVertex3fv(P053);
+       glNormal3fv(N060);
+       glVertex3fv(P060);
+       glNormal3fv(N052);
+       glVertex3fv(P052);
+       glEnd();
+}
+
+static void
+Whale013(GLenum cap)
+{
+       glBegin(cap);
+       glNormal3fv(N066);
+       glVertex3fv(P066);
+       glNormal3fv(N067);
+       glVertex3fv(P067);
+       glNormal3fv(N096);
+       glVertex3fv(P096);
+       glNormal3fv(N097);
+       glVertex3fv(P097);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N097);
+       glVertex3fv(P097);
+       glNormal3fv(N096);
+       glVertex3fv(P096);
+       glNormal3fv(N098);
+       glVertex3fv(P098);
+       glNormal3fv(N099);
+       glVertex3fv(P099);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N065);
+       glVertex3fv(P065);
+       glNormal3fv(N066);
+       glVertex3fv(P066);
+       glNormal3fv(N097);
+       glVertex3fv(P097);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N067);
+       glVertex3fv(P067);
+       glNormal3fv(N060);
+       glVertex3fv(P060);
+       glNormal3fv(N096);
+       glVertex3fv(P096);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N060);
+       glVertex3fv(P060);
+       glNormal3fv(N005);
+       glVertex3fv(P005);
+       glNormal3fv(N096);
+       glVertex3fv(P096);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N096);
+       glVertex3fv(P096);
+       glNormal3fv(N005);
+       glVertex3fv(P005);
+       glNormal3fv(N098);
+       glVertex3fv(P098);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N006);
+       glVertex3fv(P006);
+       glNormal3fv(N065);
+       glVertex3fv(P065);
+       glNormal3fv(N097);
+       glVertex3fv(P097);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N006);
+       glVertex3fv(P006);
+       glNormal3fv(N097);
+       glVertex3fv(P097);
+       glNormal3fv(N099);
+       glVertex3fv(P099);
+       glEnd();
+       glBegin(cap);
+       glVertex3fv(P005);
+       glVertex3fv(P006);
+       glVertex3fv(P099);
+       glVertex3fv(P098);
+       glEnd();
+}
+
+static void
+Whale014(GLenum cap)
+{
+       glBegin(cap);
+       glNormal3fv(N062);
+       glVertex3fv(P062);
+       glNormal3fv(N004);
+       glVertex3fv(P004);
+       glNormal3fv(N005);
+       glVertex3fv(P005);
+       glEnd();
+       glBegin(cap);
+       glVertex3fv(P006);
+       glVertex3fv(P005);
+       glVertex3fv(P004);
+       glVertex3fv(P008);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N063);
+       glVertex3fv(P063);
+       glNormal3fv(N006);
+       glVertex3fv(P006);
+       glNormal3fv(N002);
+       glVertex3fv(P002);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N002);
+       glVertex3fv(P002);
+       glNormal3fv(N006);
+       glVertex3fv(P006);
+       glNormal3fv(N008);
+       glVertex3fv(P008);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N002);
+       glVertex3fv(P002);
+       glNormal3fv(N008);
+       glVertex3fv(P008);
+       glNormal3fv(N004);
+       glVertex3fv(P004);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N062);
+       glVertex3fv(P062);
+       glNormal3fv(N002);
+       glVertex3fv(P002);
+       glNormal3fv(N004);
+       glVertex3fv(P004);
+       glEnd();
+}
+
+static void
+Whale015(GLenum cap)
+{
+       glBegin(cap);
+       glNormal3fv(N055);
+       glVertex3fv(P055);
+       glNormal3fv(N003);
+       glVertex3fv(P003);
+       glNormal3fv(N054);
+       glVertex3fv(P054);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N003);
+       glVertex3fv(P003);
+       glNormal3fv(N055);
+       glVertex3fv(P055);
+       glNormal3fv(N063);
+       glVertex3fv(P063);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N003);
+       glVertex3fv(P003);
+       glNormal3fv(N063);
+       glVertex3fv(P063);
+       glNormal3fv(N100);
+       glVertex3fv(P100);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N003);
+       glVertex3fv(P003);
+       glNormal3fv(N100);
+       glVertex3fv(P100);
+       glNormal3fv(N054);
+       glVertex3fv(P054);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N054);
+       glVertex3fv(P054);
+       glNormal3fv(N100);
+       glVertex3fv(P100);
+       glNormal3fv(N062);
+       glVertex3fv(P062);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N100);
+       glVertex3fv(P100);
+       glNormal3fv(N063);
+       glVertex3fv(P063);
+       glNormal3fv(N002);
+       glVertex3fv(P002);
+       glEnd();
+       glBegin(cap);
+       glNormal3fv(N100);
+       glVertex3fv(P100);
+       glNormal3fv(N002);
+       glVertex3fv(P002);
+       glNormal3fv(N062);
+       glVertex3fv(P062);
+       glEnd();
+}
+
+static void
+Whale016(GLenum cap)
+{
+       glBegin(cap);
+       glVertex3fv(P104);
+       glVertex3fv(P105);
+       glVertex3fv(P106);
+       glEnd();
+       glBegin(cap);
+       glVertex3fv(P107);
+       glVertex3fv(P108);
+       glVertex3fv(P109);
+       glEnd();
+       glBegin(cap);
+       glVertex3fv(P110);
+       glVertex3fv(P111);
+       glVertex3fv(P112);
+       glVertex3fv(P113);
+       glVertex3fv(P114);
+       glVertex3fv(P115);
+       glEnd();
+       glBegin(cap);
+       glVertex3fv(P116);
+       glVertex3fv(P117);
+       glVertex3fv(P118);
+       glVertex3fv(P119);
+       glVertex3fv(P120);
+       glVertex3fv(P121);
+       glEnd();
+}
+
+void
+DrawWhale(fishRec * fish, int wire)
+{
+       float       seg0, seg1, seg2, seg3, seg4, seg5, seg6, seg7;
+       float       pitch, thrash, chomp;
+       GLenum      cap;
+
+       fish->htail = (int) (fish->htail - (int) (5.0 * fish->v)) % 360;
+
+       thrash = 70.0 * fish->v;
+
+       seg0 = 1.5 * thrash * sin((fish->htail) * RRAD);
+       seg1 = 2.5 * thrash * sin((fish->htail + 10.0) * RRAD);
+       seg2 = 3.7 * thrash * sin((fish->htail + 15.0) * RRAD);
+       seg3 = 4.8 * thrash * sin((fish->htail + 23.0) * RRAD);
+       seg4 = 6.0 * thrash * sin((fish->htail + 28.0) * RRAD);
+       seg5 = 6.5 * thrash * sin((fish->htail + 35.0) * RRAD);
+       seg6 = 6.5 * thrash * sin((fish->htail + 40.0) * RRAD);
+       seg7 = 6.5 * thrash * sin((fish->htail + 55.0) * RRAD);
+
+       pitch = fish->v * sin((fish->htail - 160.0) * RRAD);
+
+       chomp = 0.0;
+       if (fish->v > 2.0) {
+               chomp = -(fish->v - 2.0) * 200.0;
+       }
+       P012[1] = iP012[1] + seg5;
+       P013[1] = iP013[1] + seg5;
+       P014[1] = iP014[1] + seg5;
+       P015[1] = iP015[1] + seg5;
+       P016[1] = iP016[1] + seg5;
+       P017[1] = iP017[1] + seg5;
+       P018[1] = iP018[1] + seg5;
+       P019[1] = iP019[1] + seg5;
+
+       P020[1] = iP020[1] + seg4;
+       P021[1] = iP021[1] + seg4;
+       P022[1] = iP022[1] + seg4;
+       P023[1] = iP023[1] + seg4;
+       P024[1] = iP024[1] + seg4;
+       P025[1] = iP025[1] + seg4;
+       P026[1] = iP026[1] + seg4;
+       P027[1] = iP027[1] + seg4;
+
+       P028[1] = iP028[1] + seg2;
+       P029[1] = iP029[1] + seg2;
+       P030[1] = iP030[1] + seg2;
+       P031[1] = iP031[1] + seg2;
+       P032[1] = iP032[1] + seg2;
+       P033[1] = iP033[1] + seg2;
+       P034[1] = iP034[1] + seg2;
+       P035[1] = iP035[1] + seg2;
+
+       P036[1] = iP036[1] + seg1;
+       P037[1] = iP037[1] + seg1;
+       P038[1] = iP038[1] + seg1;
+       P039[1] = iP039[1] + seg1;
+       P040[1] = iP040[1] + seg1;
+       P041[1] = iP041[1] + seg1;
+       P042[1] = iP042[1] + seg1;
+       P043[1] = iP043[1] + seg1;
+
+       P044[1] = iP044[1] + seg0;
+       P045[1] = iP045[1] + seg0;
+       P046[1] = iP046[1] + seg0;
+       P047[1] = iP047[1] + seg0;
+       P048[1] = iP048[1] + seg0;
+       P049[1] = iP049[1] + seg0;
+       P050[1] = iP050[1] + seg0;
+       P051[1] = iP051[1] + seg0;
+
+       P009[1] = iP009[1] + seg6;
+       P010[1] = iP010[1] + seg6;
+       P075[1] = iP075[1] + seg6;
+       P076[1] = iP076[1] + seg6;
+
+       P001[1] = iP001[1] + seg7;
+       P011[1] = iP011[1] + seg7;
+       P068[1] = iP068[1] + seg7;
+       P069[1] = iP069[1] + seg7;
+       P070[1] = iP070[1] + seg7;
+       P071[1] = iP071[1] + seg7;
+       P072[1] = iP072[1] + seg7;
+       P073[1] = iP073[1] + seg7;
+       P074[1] = iP074[1] + seg7;
+
+       P091[1] = iP091[1] + seg3 * 1.1;
+       P092[1] = iP092[1] + seg3;
+       P093[1] = iP093[1] + seg3;
+       P094[1] = iP094[1] + seg3;
+       P095[1] = iP095[1] + seg3 * 0.9;
+
+       P099[1] = iP099[1] + chomp;
+       P098[1] = iP098[1] + chomp;
+       P064[1] = iP064[1] + chomp;
+       P061[1] = iP061[1] + chomp;
+       P097[1] = iP097[1] + chomp;
+       P096[1] = iP096[1] + chomp;
+
+       glPushMatrix();
+
+       glRotatef(pitch, 1.0, 0.0, 0.0);
+
+       glTranslatef(0.0, 0.0, 8000.0);
+
+       glRotatef(180.0, 0.0, 1.0, 0.0);
+
+       glScalef(3.0, 3.0, 3.0);
+
+       glEnable(GL_CULL_FACE);
+
+       cap = wire ? GL_LINE_LOOP : GL_POLYGON;
+       Whale001(cap);
+       Whale002(cap);
+       Whale003(cap);
+       Whale004(cap);
+       Whale005(cap);
+       Whale006(cap);
+       Whale007(cap);
+       Whale008(cap);
+       Whale009(cap);
+       Whale010(cap);
+       Whale011(cap);
+       Whale012(cap);
+       Whale013(cap);
+       Whale014(cap);
+       Whale015(cap);
+       Whale016(cap);
+
+       glDisable(GL_CULL_FACE);
+
+       glPopMatrix();
+}
+#endif
diff --git a/hacks/glx/xlock-gl.c b/hacks/glx/xlock-gl.c
new file mode 100644 (file)
index 0000000..0256cf0
--- /dev/null
@@ -0,0 +1,99 @@
+/* xlock-gl.c --- xscreensaver compatibility layer for xlockmore GL modules.
+ * xscreensaver, Copyright (c) 1997, 1998, 1999 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software 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.  No representations are made about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or 
+ * implied warranty.
+ *
+ * This file, along with xlockmore.h, make it possible to compile an xlockmore
+ * GL module into a standalone program, and thus use it with xscreensaver.
+ * By Jamie Zawinski <jwz@jwz.org> on 31-May-97.
+ */
+
+#include <stdio.h>
+#include "screenhack.h"
+#include "xlockmoreI.h"
+
+#include <GL/gl.h>
+#include <GL/glx.h>
+
+/* Gag -- we use this to turn X errors from glXCreateContext() into
+   something that will actually make sense to the user.
+ */
+static XErrorHandler orig_ehandler = 0;
+static Bool got_error = 0;
+
+static int
+BadValue_ehandler (Display *dpy, XErrorEvent *error)
+{
+  if (error->error_code == BadValue)
+    {
+      got_error = True;
+      return 0;
+    }
+  else
+    return orig_ehandler (dpy, error);
+}
+
+
+GLXContext *
+init_GL(ModeInfo * mi)
+{
+  Display *dpy = mi->dpy;
+  Window window = mi->window;
+  Screen *screen = mi->xgwa.screen;
+  Visual *visual = mi->xgwa.visual;
+  GLXContext glx_context = 0;
+  XVisualInfo vi_in, *vi_out;
+  int out_count;
+
+  vi_in.screen = screen_number (screen);
+  vi_in.visualid = XVisualIDFromVisual (visual);
+  vi_out = XGetVisualInfo (dpy, VisualScreenMask|VisualIDMask,
+                          &vi_in, &out_count);
+  if (! vi_out) abort ();
+
+  {
+    XSync (dpy, False);
+    orig_ehandler = XSetErrorHandler (BadValue_ehandler);
+    glx_context = glXCreateContext (dpy, vi_out, 0, GL_TRUE);
+    XSync (dpy, False);
+    XSetErrorHandler (orig_ehandler);
+    if (got_error)
+      glx_context = 0;
+  }
+
+  XFree((char *) vi_out);
+
+  if (!glx_context)
+    {
+      fprintf(stderr, "%s: couldn't create GL context for visual 0x%x.\n",
+             progname, (unsigned int) XVisualIDFromVisual (visual));
+      exit(1);
+    }
+
+  glXMakeCurrent (dpy, window, glx_context);
+
+  {
+    GLboolean rgba_mode = 0;
+    glGetBooleanv(GL_RGBA_MODE, &rgba_mode);
+    if (!rgba_mode)
+      {
+       glIndexi (WhitePixelOfScreen (screen));
+       glClearIndex (BlackPixelOfScreen (screen));
+      }
+  }
+
+  /* GLXContext is already a pointer type.
+     Why this function returns a pointer to a pointer, I have no idea...
+   */
+  {
+    GLXContext *ptr = (GLXContext *) malloc(sizeof(GLXContext));
+    *ptr = glx_context;
+    return ptr;
+  }
+}
diff --git a/hacks/glx/xpm-ximage.c b/hacks/glx/xpm-ximage.c
new file mode 100644 (file)
index 0000000..ded8bbb
--- /dev/null
@@ -0,0 +1,146 @@
+/* xpm-ximage.c --- converts XPM data to an XImage for use with OpenGL.
+ * xscreensaver, Copyright (c) 1998 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software 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.  No representations are made about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or 
+ * implied warranty.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <X11/Intrinsic.h>
+
+extern char *progname;
+
+#ifdef HAVE_XPM                /* whole file */
+
+#include <X11/Xutil.h>
+#include <X11/xpm.h>
+
+static Bool
+bigendian (void)
+{
+  union { int i; char c[sizeof(int)]; } u;
+  u.i = 1;
+  return !u.c[0];
+}
+
+
+/* Returns an XImage structure containing the bits of the given XPM image.
+   This XImage will be 32 bits per pixel, 8 each per R, G, and B, with the
+   extra byte set to 0xFF.
+
+   The Display and Visual arguments are used only for creating the XImage;
+   no bits are pushed to the server.
+
+   The Colormap argument is used just for parsing color names; no colors
+   are allocated.
+ */
+XImage *
+xpm_to_ximage (Display *dpy, Visual *visual, Colormap cmap, char **xpm_data)
+{
+  /* All we want to do is get RGB data out of the XPM file built in to this
+     program.  This is a pain, because there is no way  (as of XPM version
+     4.6, at least) to get libXpm to make an XImage without also allocating
+     colors with XAllocColor.  So, instead, we create an XpmImage and parse
+     out the RGB values of the pixels ourselves; and construct an XImage
+     by hand.  Regardless of the depth of the visual we're using, this
+     XImage will have 32 bits per pixel, 8 each per R, G, and B.  We put
+     0xFF in the fourth slot, as GL will interpret that as "alpha".
+   */
+  XImage *ximage = 0;
+  XpmImage xpm_image;
+  XpmInfo xpm_info;
+  int result;
+  int x, y, i;
+  int bpl, wpl;
+  XColor colors[255];
+
+  memset (&xpm_image, 0, sizeof(xpm_image));
+  memset (&xpm_info, 0, sizeof(xpm_info));
+  result = XpmCreateXpmImageFromData (xpm_data, &xpm_image, &xpm_info);
+  if (result != XpmSuccess)
+    {
+      fprintf(stderr, "%s: unable to parse xpm data (%d).\n", progname,
+             result);
+      exit (1);
+    }
+
+  ximage = XCreateImage (dpy, visual, 32, ZPixmap, 0, 0,
+                        xpm_image.width, xpm_image.height, 32, 0);
+
+  bpl = ximage->bytes_per_line;
+  wpl = bpl/4;
+
+  ximage->data = (char *) malloc(xpm_image.height * bpl);
+
+  /* Parse the colors in the XPM into RGB values. */
+  for (i = 0; i < xpm_image.ncolors; i++)
+    if (!XParseColor(dpy, cmap, xpm_image.colorTable[i].c_color, &colors[i]))
+      {
+       fprintf(stderr, "%s: unparsable color: %s\n", progname,
+               xpm_image.colorTable[i].c_color);
+       exit(1);
+      }
+
+  /* Translate the XpmImage to an RGB XImage. */
+  {
+    int rpos, gpos, bpos, apos;  /* bitfield positions */
+
+    /* Note that unlike X, which is endianness-agnostic (since any XImage
+       can have its own specific bit ordering, with the server reversing
+       things as necessary) OpenGL pretends everything is client-side, so
+       we need to pack things in the right order for the client machine.
+     */
+    if (bigendian())
+      rpos = 24, gpos = 16, bpos =  8, apos =  0;
+    else
+      rpos =  0, gpos =  8, bpos = 16, apos = 24;
+
+    for (y = 0; y < xpm_image.height; y++)
+      {
+       int y2 = (xpm_image.height-1-y); /* Texture maps are upside down. */
+
+       unsigned int *oline = (unsigned int *) (ximage->data   + (y  * bpl));
+       unsigned int *iline = (unsigned int *) (xpm_image.data + (y2 * wpl));
+
+       for (x = 0; x < xpm_image.width; x++)
+         {
+           XColor *c = &colors[iline[x]];
+           /* pack it as RGBA */
+           oline[x] = (((c->red   >> 8) << rpos) |
+                       ((c->green >> 8) << gpos) |
+                       ((c->blue  >> 8) << bpos) |
+                       (0xFF            << apos));
+         }
+      }
+  }
+
+  /* I sure hope these only free the contents, and not the args. */
+#if 0  /* Apparently not?  Gotta love those well-documented APIs! */
+  XpmFreeXpmImage (&xpm_image);
+  XpmFreeXpmInfo (&xpm_info);
+#endif
+
+  return ximage;
+}
+
+
+#else  /* !HAVE_XPM */
+
+XImage *
+xpm_to_ximage (char **xpm_data)
+{
+  fprintf(stderr, "%s: not compiled with XPM support.\n", progname);
+  exit (1);
+}
+
+#endif /* !HAVE_XPM */
diff --git a/hacks/glx/xpm-ximage.h b/hacks/glx/xpm-ximage.h
new file mode 100644 (file)
index 0000000..cfe6e0d
--- /dev/null
@@ -0,0 +1,28 @@
+/* xpm-ximage.h --- converts XPM data to an XImage for use with OpenGL.
+ * xscreensaver, Copyright (c) 1998 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software 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.  No representations are made about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or 
+ * implied warranty.
+ */
+
+#ifndef _XPM_TEXTURE_H_
+#define _XPM_TEXTURE_H_
+
+/* Returns an XImage structure containing the bits of the given XPM image.
+   This XImage will be 32 bits per pixel, 8 each per R, G, and B, with the
+   extra byte set to 0xFF.
+
+   The Display and Visual arguments are used only for creating the XImage;
+   no bits are pushed to the server.
+
+   The Colormap argument is used just for parsing color names; no colors
+   are allocated.
+ */
+extern XImage *xpm_to_ximage (Display *, Visual *, Colormap, char **xpm_data);
+
+#endif /* _XPM_TEXTURE_H_ */
diff --git a/hacks/goop.c b/hacks/goop.c
new file mode 100644 (file)
index 0000000..ace2352
--- /dev/null
@@ -0,0 +1,543 @@
+/* xscreensaver, Copyright (c) 1997 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software 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.  No representations are made about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or 
+ * implied warranty.
+ */
+
+#include <math.h>
+#include "screenhack.h"
+#include "spline.h"
+#include "alpha.h"
+
+
+/* This is pretty compute-intensive, probably due to the large number of
+   polygon fills.  I tried introducing a scaling factor to make the spline
+   code emit fewer line segments, but that made the edges very rough.
+   However, tuning *maxVelocity, *elasticity and *delay can result in much
+   smoother looking animation.  I tuned these for a 1280x1024 Indy display,
+   but I don't know whether these values will be reasonable for a slower
+   machine...
+
+   The more planes the better -- SGIs have a 12-bit pseudocolor display
+   (4096 colormap cells) which is mostly useless, except for this program,
+   where it means you can have 11 or 12 mutually-transparent objects instead
+   of only 7 or 8.  But, if you are using the 12-bit visual, you should crank
+   down the velocity and elasticity, or server slowness will cause the
+   animation to look jerky (yes, it's sad but true, SGI's X server is
+   perceptibly slower when using plane masks on a 12-bit visual than on an
+   8-bit visual.)  Using -max-velocity 0.5 -elasticity 0.9 seems to work ok
+   on my Indy R5k with visual 0x27 and the bottom-of-the-line 24-bit graphics
+   board.
+
+   It might look better if each blob had an outline, which was a *slightly*
+   darker color than the center, to give them a bit more definition -- but
+   that would mean using two planes per blob.  (Or maybe allocating the
+   outline colors outside of the plane-space?  Then the outlines wouldn't be
+   transparent, but maybe that wouldn't be so noticeable?)
+
+   Oh, for an alpha channel... maybe I should rewrite this in GL.  Then the
+   blobs could have thickness, and curved edges with specular reflections...
+ */
+
+
+#define SCALE       10000  /* fixed-point math, for sub-pixel motion */
+#define DEF_COUNT   12    /* When planes and count are 0, how many blobs. */
+
+
+#define RAND(n) ((long) ((random() & 0x7fffffff) % ((long) (n))))
+#define RANDSIGN() ((random() & 1) ? 1 : -1)
+
+struct blob {
+  long x, y;           /* position of midpoint */
+  long dx, dy;         /* velocity and direction */
+  double torque;       /* rotational speed */
+  double th;           /* angle of rotation */
+  long elasticity;     /* how fast they deform */
+  long max_velocity;   /* speed limit */
+  long min_r, max_r;   /* radius range */
+  int npoints;         /* control points */
+  long *r;             /* radii */
+  spline *spline;
+};
+
+struct layer {
+  int nblobs;
+  struct blob **blobs;
+  Pixmap pixmap;
+  unsigned long pixel;
+  GC gc;
+};
+
+enum goop_mode {
+  transparent,
+  opaque,
+  xor,
+  outline
+};
+
+struct goop {
+  enum goop_mode mode;
+  int width, height;
+  int nlayers;
+  struct layer **layers;
+  unsigned long background;
+  Pixmap pixmap;
+  GC pixmap_gc;
+  GC window_gc;
+  Bool additive_p;
+  Bool cmap_p;
+};
+
+
+static struct blob *
+make_blob (int maxx, int maxy, int size)
+{
+  struct blob *b = (struct blob *) calloc(1, sizeof(*b));
+  int i;
+  int mid;
+
+  maxx *= SCALE;
+  maxy *= SCALE;
+  size *= SCALE;
+
+  b->max_r = size/2;
+  b->min_r = size/10;
+
+  if (b->min_r < (5*SCALE)) b->min_r = (5*SCALE);
+  mid = ((b->min_r + b->max_r) / 2);
+
+  b->torque       = get_float_resource ("torque", "Torque");
+  b->elasticity   = SCALE * get_float_resource ("elasticity", "Elasticity");
+  b->max_velocity = SCALE * get_float_resource ("maxVelocity", "MaxVelocity");
+
+  b->x = RAND(maxx);
+  b->y = RAND(maxy);
+
+  b->dx = RAND(b->max_velocity) * RANDSIGN();
+  b->dy = RAND(b->max_velocity) * RANDSIGN();
+  b->th = frand(M_PI+M_PI) * RANDSIGN();
+  b->npoints = (random() % 5) + 5;
+
+  b->spline = make_spline (b->npoints);
+  b->r = (long *) malloc (sizeof(*b->r) * b->npoints);
+  for (i = 0; i < b->npoints; i++)
+    b->r[i] = ((random() % mid) + (mid/2)) * RANDSIGN();
+  return b;
+}
+
+static void 
+throb_blob (struct blob *b)
+{
+  int i;
+  double frac = ((M_PI+M_PI) / b->npoints);
+
+  for (i = 0; i < b->npoints; i++)
+    {
+      long r = b->r[i];
+      long ra = (r > 0 ? r : -r);
+      double th = (b->th > 0 ? b->th : -b->th);
+      long x, y;
+
+      /* place control points evenly around perimiter, shifted by theta */
+      x = b->x + ra * cos (i * frac + th);
+      y = b->y + ra * sin (i * frac + th);
+
+      b->spline->control_x[i] = x / SCALE;
+      b->spline->control_y[i] = y / SCALE;
+
+      /* alter the radius by a random amount, in the direction in which
+        it had been going (the sign of the radius indicates direction.) */
+      ra += (RAND(b->elasticity) * (r > 0 ? 1 : -1));
+      r = ra * (r >= 0 ? 1 : -1);
+
+      /* If we've reached the end (too long or too short) reverse direction. */
+      if ((ra > b->max_r && r >= 0) ||
+         (ra < b->min_r && r < 0))
+       r = -r;
+      /* And reverse direction in mid-course once every 50 times. */
+      else if (! (random() % 50))
+       r = -r;
+
+      b->r[i] = r;
+    }
+}
+
+static void
+move_blob (struct blob *b, int maxx, int maxy)
+{
+  maxx *= SCALE;
+  maxy *= SCALE;
+
+  b->x += b->dx;
+  b->y += b->dy;
+
+  /* If we've reached the edge of the box, reverse direction. */
+  if ((b->x > maxx && b->dx >= 0) ||
+      (b->x < 0    && b->dx < 0))
+    {
+      b->dx = -b->dx;
+    }
+  if ((b->y > maxy && b->dy >= 0) ||
+      (b->y < 0    && b->dy < 0))
+    {
+      b->dy = -b->dy;
+    }
+
+  /* Alter velocity randomly. */
+  if (! (random() % 10))
+    {
+      b->dx += (RAND(b->max_velocity/2) * RANDSIGN());
+      b->dy += (RAND(b->max_velocity/2) * RANDSIGN());
+
+      /* Throttle velocity */
+      if (b->dx > b->max_velocity || b->dx < -b->max_velocity)
+       b->dx /= 2;
+      if (b->dy > b->max_velocity || b->dy < -b->max_velocity)
+       b->dy /= 2;
+    }
+
+  {
+    double th = b->th;
+    double d = (b->torque == 0 ? 0 : frand(b->torque));
+    if (th < 0)
+      th = -(th + d);
+    else
+      th += d;
+
+    if (th > (M_PI+M_PI))
+      th -= (M_PI+M_PI);
+    else if (th < 0)
+      th += (M_PI+M_PI);
+
+    b->th = (b->th > 0 ? th : -th);
+  }
+
+  /* Alter direction of rotation randomly. */
+  if (! (random() % 100))
+    b->th *= -1;
+}
+
+static void
+draw_blob (Display *dpy, Drawable drawable, GC gc, struct blob *b,
+          Bool fill_p)
+{
+  compute_closed_spline (b->spline);
+#ifdef DEBUG
+  {
+    int i;
+    for (i = 0; i < b->npoints; i++)
+      XDrawLine (dpy, drawable, gc, b->x/SCALE, b->y/SCALE,
+                b->spline->control_x[i], b->spline->control_y[i]);
+  }
+#else
+  if (fill_p)
+    XFillPolygon (dpy, drawable, gc, b->spline->points, b->spline->n_points,
+                 Nonconvex, CoordModeOrigin);
+  else
+#endif
+    XDrawLines (dpy, drawable, gc, b->spline->points, b->spline->n_points,
+               CoordModeOrigin);
+}
+
+
+static struct layer *
+make_layer (Display *dpy, Window window, int width, int height, int nblobs)
+{
+  int i;
+  struct layer *layer = (struct layer *) calloc(1, sizeof(*layer));
+  int blob_min, blob_max;
+  XGCValues gcv;
+  layer->nblobs = nblobs;
+
+  layer->blobs = (struct blob **) malloc(sizeof(*layer->blobs)*layer->nblobs);
+
+  blob_max = (width < height ? width : height) / 2;
+  blob_min = (blob_max * 2) / 3;
+  for (i = 0; i < layer->nblobs; i++)
+    layer->blobs[i] = make_blob (width, height,
+                                (random() % (blob_max-blob_min)) + blob_min);
+
+  layer->pixmap = XCreatePixmap (dpy, window, width, height, 1);
+  layer->gc = XCreateGC (dpy, layer->pixmap, 0, &gcv);
+
+  return layer;
+}
+
+static void
+draw_layer_plane (Display *dpy, struct layer *layer, int width, int height)
+{
+  int i;
+  for (i = 0; i < layer->nblobs; i++)
+    {
+      throb_blob (layer->blobs[i]);
+      move_blob (layer->blobs[i], width, height);
+      draw_blob (dpy, layer->pixmap, layer->gc, layer->blobs[i], True);
+    }
+}
+
+
+static void
+draw_layer_blobs (Display *dpy, Drawable drawable, GC gc,
+                 struct layer *layer, int width, int height,
+                 Bool fill_p)
+{
+  int i;
+  for (i = 0; i < layer->nblobs; i++)
+    {
+      draw_blob (dpy, drawable, gc, layer->blobs[i], fill_p);
+      throb_blob (layer->blobs[i]);
+      move_blob (layer->blobs[i], width, height);
+    }
+}
+
+
+static struct goop *
+make_goop (Screen *screen, Visual *visual, Window window, Colormap cmap,
+          int width, int height, long depth)
+{
+  Display *dpy = DisplayOfScreen (screen);
+  int i;
+  struct goop *goop = (struct goop *) calloc(1, sizeof(*goop));
+  XGCValues gcv;
+  int nblobs = get_integer_resource ("count", "Count");
+
+  unsigned long *plane_masks = 0;
+  unsigned long base_pixel = 0;
+
+  goop->mode = (get_boolean_resource("xor", "Xor")
+               ? xor
+               : (get_boolean_resource("transparent", "Transparent")
+                  ? transparent
+                  : opaque));
+
+  goop->width = width;
+  goop->height = height;
+
+
+  goop->nlayers = get_integer_resource ("planes", "Planes");
+  if (goop->nlayers <= 0)
+    goop->nlayers = (random() % (depth-2)) + 2;
+  goop->layers = (struct layer **) malloc(sizeof(*goop->layers)*goop->nlayers);
+
+  goop->additive_p = get_boolean_resource ("additive", "Additive");
+  goop->cmap_p = has_writable_cells (screen, visual);
+
+  if (mono_p && goop->mode == transparent)
+    goop->mode = opaque;
+
+  /* Try to allocate some color planes before committing to nlayers.
+   */
+  if (goop->mode == transparent)
+    {
+      int nplanes = goop->nlayers;
+      allocate_alpha_colors (screen, visual, cmap,
+                             &nplanes, goop->additive_p, &plane_masks,
+                            &base_pixel);
+      if (nplanes > 1)
+       goop->nlayers = nplanes;
+      else
+       {
+         fprintf (stderr,
+         "%s: couldn't allocate any color planes; turning transparency off.\n",
+                  progname);
+         goop->mode = opaque;
+       }
+    }
+
+  {
+    int lblobs[32];
+    int total = DEF_COUNT;
+    memset (lblobs, 0, sizeof(lblobs));
+    if (nblobs <= 0)
+      while (total)
+       for (i = 0; total && i < goop->nlayers; i++)
+         lblobs[i]++, total--;
+    for (i = 0; i < goop->nlayers; i++)
+      goop->layers[i] = make_layer (dpy, window, width, height, 
+                                   (nblobs > 0 ? nblobs : lblobs[i]));
+  }
+
+  if (goop->mode == transparent && plane_masks)
+    {
+      for (i = 0; i < goop->nlayers; i++)
+       goop->layers[i]->pixel = base_pixel | plane_masks[i];
+      goop->background = base_pixel;
+    }
+  if (plane_masks)
+    free (plane_masks);
+
+  if (goop->mode != transparent)
+    {
+      XColor color;
+      color.flags = DoRed|DoGreen|DoBlue;
+
+      goop->background =
+       get_pixel_resource ("background", "Background", dpy,cmap);
+
+      for (i = 0; i < goop->nlayers; i++)
+       {
+         int H = random() % 360;                          /* range 0-360    */
+         double S = ((double) (random()%70) + 30)/100.0;  /* range 30%-100% */
+         double V = ((double) (random()%34) + 66)/100.0;  /* range 66%-100% */
+         hsv_to_rgb (H, S, V, &color.red, &color.green, &color.blue);
+         if (XAllocColor (dpy, cmap, &color))
+           goop->layers[i]->pixel = color.pixel;
+         else
+           goop->layers[i]->pixel =
+             WhitePixelOfScreen(DefaultScreenOfDisplay(dpy));
+       }
+    }
+
+  goop->pixmap = XCreatePixmap (dpy, window, width, height,
+                               (goop->mode == xor ? 1L : depth));
+
+  gcv.background = goop->background;
+  gcv.foreground = get_pixel_resource ("foreground", "Foreground", dpy, cmap);
+  gcv.line_width = get_integer_resource ("thickness","Thickness");
+  goop->pixmap_gc = XCreateGC (dpy, goop->pixmap, GCLineWidth, &gcv);
+  goop->window_gc = XCreateGC (dpy, window, GCForeground|GCBackground, &gcv);
+
+  return goop;
+}
+
+static struct goop *
+init_goop (Display *dpy, Window window)
+{
+  XWindowAttributes xgwa;
+  XGetWindowAttributes (dpy, window, &xgwa);
+
+  return make_goop (xgwa.screen, xgwa.visual, window, xgwa.colormap,
+                   xgwa.width, xgwa.height, xgwa.depth);
+}
+
+static void
+run_goop (Display *dpy, Window window, struct goop *goop)
+{
+  int i, j;
+
+  switch (goop->mode)
+    {
+    case transparent:
+
+      for (i = 0; i < goop->nlayers; i++)
+       draw_layer_plane (dpy, goop->layers[i], goop->width, goop->height);
+
+      XSetForeground (dpy, goop->pixmap_gc, goop->background);
+      XSetFunction (dpy, goop->pixmap_gc, GXcopy);
+      XSetPlaneMask (dpy, goop->pixmap_gc, AllPlanes);
+      XFillRectangle (dpy, goop->pixmap, goop->pixmap_gc, 0, 0,
+                     goop->width, goop->height);
+
+      XSetForeground (dpy, goop->pixmap_gc, ~0L);
+
+      if (!goop->cmap_p && !goop->additive_p)
+        {
+          for (i = 0; i < goop->nlayers; i++)
+            for (j = 0; j < goop->layers[i]->nblobs; j++)
+              draw_blob (dpy, goop->pixmap, goop->pixmap_gc,
+                         goop->layers[i]->blobs[j], True);
+          XSetFunction (dpy, goop->pixmap_gc, GXclear);
+        }
+
+      for (i = 0; i < goop->nlayers; i++)
+       {
+         XSetPlaneMask (dpy, goop->pixmap_gc, goop->layers[i]->pixel);
+         draw_layer_blobs (dpy, goop->pixmap, goop->pixmap_gc,
+                           goop->layers[i], goop->width, goop->height,
+                           True);
+       }
+      XCopyArea (dpy, goop->pixmap, window, goop->window_gc, 0, 0,
+                goop->width, goop->height, 0, 0);
+      break;
+
+    case xor:
+      XSetFunction (dpy, goop->pixmap_gc, GXcopy);
+      XSetForeground (dpy, goop->pixmap_gc, 0);
+      XFillRectangle (dpy, goop->pixmap, goop->pixmap_gc, 0, 0,
+                     goop->width, goop->height);
+      XSetFunction (dpy, goop->pixmap_gc, GXxor);
+      XSetForeground (dpy, goop->pixmap_gc, 1);
+      for (i = 0; i < goop->nlayers; i++)
+       draw_layer_blobs (dpy, goop->pixmap, goop->pixmap_gc,
+                         goop->layers[i], goop->width, goop->height,
+                         (goop->mode != outline));
+      XCopyPlane (dpy, goop->pixmap, window, goop->window_gc, 0, 0,
+                 goop->width, goop->height, 0, 0, 1L);
+      break;
+
+    case opaque:
+    case outline:
+      XSetForeground (dpy, goop->pixmap_gc, goop->background);
+      XFillRectangle (dpy, goop->pixmap, goop->pixmap_gc, 0, 0,
+                     goop->width, goop->height);
+      for (i = 0; i < goop->nlayers; i++)
+       {
+         XSetForeground (dpy, goop->pixmap_gc, goop->layers[i]->pixel);
+         draw_layer_blobs (dpy, goop->pixmap, goop->pixmap_gc,
+                           goop->layers[i], goop->width, goop->height,
+                           (goop->mode != outline));
+       }
+      XCopyArea (dpy, goop->pixmap, window, goop->window_gc, 0, 0,
+                goop->width, goop->height, 0, 0);
+      break;
+
+    default:
+      abort ();
+      break;
+    }
+}
+
+\f
+char *progclass = "Goop";
+
+char *defaults [] = {
+  ".background:                black",
+  ".foreground:                white",
+  "*delay:             12000",
+  "*transparent:       true",
+  "*additive:          true",
+  "*xor:               false",
+  "*count:             0",
+  "*planes:            0",
+  "*thickness:         5",
+  "*torque:            0.0075",
+  "*elasticity:                1.8",
+  "*maxVelocity:       1.2",
+  0
+};
+
+XrmOptionDescRec options [] = {
+  { "-delay",          ".delay",       XrmoptionSepArg, 0 },
+  { "-count",          ".count",       XrmoptionSepArg, 0 },
+  { "-planes",         ".planes",      XrmoptionSepArg, 0 },
+  { "-transparent",    ".transparent", XrmoptionNoArg, "True" },
+  { "-non-transparent",        ".transparent", XrmoptionNoArg, "False" },
+  { "-additive",       ".additive",    XrmoptionNoArg, "True" },
+  { "-subtractive",    ".additive",    XrmoptionNoArg, "false" },
+  { "-xor",            ".xor",         XrmoptionNoArg, "true" },
+  { "-no-xor",         ".xor",         XrmoptionNoArg, "false" },
+  { "-thickness",      ".thickness",   XrmoptionSepArg, 0 },
+  { "-torque",         ".torque",      XrmoptionSepArg, 0 },
+  { "-elasticity",     ".elasticity",  XrmoptionSepArg, 0 },
+  { "-max-velocity",   ".maxVelocity", XrmoptionSepArg, 0 },
+  { 0, 0, 0, 0 }
+};
+
+void
+screenhack (Display *dpy, Window window)
+{
+  struct goop *g = init_goop (dpy, window);
+  int delay = get_integer_resource ("delay", "Integer");
+  while (1)
+    {
+      run_goop (dpy, window, g);
+      XSync (dpy, False);
+      screenhack_handle_events (dpy);
+      if (delay) usleep (delay);
+    }
+}
diff --git a/hacks/goop.man b/hacks/goop.man
new file mode 100644 (file)
index 0000000..adf79d8
--- /dev/null
@@ -0,0 +1,80 @@
+.TH XScreenSaver 1 "11-Jun-97" "X Version 11"
+.SH NAME
+goop - squishy transparent oil and bubble screenhack
+.SH SYNOPSIS
+.B goop
+[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-transparent] [\-non\-transparent] [\-additive] [\-subtractive] [\-xor] [\-no\-xor]
+.SH DESCRIPTION
+The \fIgoop\fP program draws a simulation of bubbles in layers of 
+overlapping multicolored translucent fluid.
+.SH OPTIONS
+.I goop
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window.  This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-mono 
+If on a color display, pretend we're on a monochrome display.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use.  Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-count \fIinteger\fP
+How many bubbles to draw per layer.  Default: random.
+.TP 8
+.B \-layers \fIinteger\fP
+How many layers to draw.  Default: random, based on screen depth.
+.TP 8
+.B \-delay \fImicroseconds\fP
+How much of a delay should be introduced between steps of the animation.
+Default 100000, or about 1/10th second.
+.TP 8
+.B \-transparent
+If \fI\-layers\fP is greater than 1, then each layer will be drawn in one
+color, and when they overlap, the colors will be mixed. This is the default.
+.TP 8
+.B \-non\-transparent
+Turns off \fI\-transparent\fP.
+.TP 8
+.B \-additive
+If \fI\-transparent\fP is specified, then this option means that the colors
+will be mixed using an additive color model, as if the blobs were projected
+light.  This is the default.
+.TP 8
+.B \-subtractive
+If \fI\-transparent\fP is specified, then this option means that the
+colors will be mixed using a subtractive color model, as if the blobs were
+translucent filters.
+.TP 8
+.B \-xor
+Draw with xor instead of the other color tricks.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 1997 by Jamie Zawinski.  Permission to use, copy, modify, 
+distribute, and sell this software 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.  No representations are made about the 
+suitability of this software for any purpose.  It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Jamie Zawinski <jwz@jwz.org>, 11-Jun-97.
diff --git a/hacks/grav.c b/hacks/grav.c
new file mode 100644 (file)
index 0000000..6ed41b8
--- /dev/null
@@ -0,0 +1,322 @@
+/* -*- Mode: C; tab-width: 4 -*-
+ * grav --- simulation of a planetary system.
+ */
+#if !defined( lint ) && !defined( SABER )
+static const char sccsid[] = "@(#)grav.c       4.00 97/01/01 xlockmore";
+#endif
+
+/* Copyright (c) 1993 Greg Bowering <greg@smug.student.adelaide.edu.au>
+ *
+ * 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.
+ *
+ * This file is provided AS IS with no warranties of any kind.  The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof.  In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * Revision history:
+ * 10-May-97: jwz@jwz.org: turned into a standalone program.
+ * 11-Jul-94: color version
+ * 06-Oct-93: by Greg Bowering <greg@smug.student.adelaide.edu.au>
+ */
+
+#ifdef STANDALONE
+# define PROGCLASS                                     "Grav"
+# define HACK_INIT                                     init_grav
+# define HACK_DRAW                                     draw_grav
+# define grav_opts                                     xlockmore_opts
+# define DEFAULTS      "*count:                12    \n"                       \
+                                       "*delay:                10000 \n"                       \
+                                       "*ncolors:              64   \n"
+# define BRIGHT_COLORS
+# include "xlockmore.h"                                /* from the xscreensaver distribution */
+#else  /* !STANDALONE */
+# include "xlock.h"                                    /* from the xlockmore distribution */
+#endif /* !STANDALONE */
+
+#define GRAV                   -0.02   /* Gravitational constant */
+#define DIST                   16.0
+#define COLLIDE                        0.0001
+#define ALMOST                 15.99
+#define HALF                   0.5
+/* #define INTRINSIC_RADIUS     200.0 */
+#define INTRINSIC_RADIUS       ((float) (gp->height/5))
+#define STARRADIUS             (unsigned int)(gp->height/(2*DIST))
+#define AVG_RADIUS             (INTRINSIC_RADIUS/DIST)
+#define RADIUS                 (unsigned int)(INTRINSIC_RADIUS/(POS(Z)+DIST))
+
+#define XR                     HALF*ALMOST
+#define YR                     HALF*ALMOST
+#define ZR                     HALF*ALMOST
+
+#define VR                     0.04
+
+#define DIMENSIONS             3
+#define X                      0
+#define Y                      1
+#define Z                      2
+
+#define DAMP                   0.999999
+#define MaxA                   0.1     /* Maximum acceleration (w/ damping) */
+
+#define POS(c) planet->P[c]
+#define VEL(c) planet->V[c]
+#define ACC(c) planet->A[c]
+
+#define Planet(x,y)\
+  if ((x) >= 0 && (y) >= 0 && (x) <= gp->width && (y) <= gp->height) {\
+    if (planet->ri < 2)\
+     XDrawPoint(display, window, gc, (x), (y));\
+    else\
+     XFillArc(display, window, gc,\
+      (x) - planet->ri / 2, (y) - planet->ri / 2, planet->ri, planet->ri,\
+      0, 23040);\
+   }
+
+#define FLOATRAND(min,max)     ((min)+(LRAND()/MAXRAND)*((max)-(min)))
+
+#define DEF_DECAY "False"      /* Damping for decaying orbits */
+#define DEF_TRAIL "False"      /* For trails (works good in mono only) */
+
+static Bool decay;
+static Bool trail;
+
+static XrmOptionDescRec opts[] =
+{
+       {"-decay", ".grav.decay", XrmoptionNoArg, (caddr_t) "on"},
+       {"+decay", ".grav.decay", XrmoptionNoArg, (caddr_t) "off"},
+       {"-trail", ".grav.trail", XrmoptionNoArg, (caddr_t) "on"},
+       {"+trail", ".grav.trail", XrmoptionNoArg, (caddr_t) "off"}
+};
+static argtype vars[] =
+{
+       {(caddr_t *) & decay, "decay", "Decay", DEF_DECAY, t_Bool},
+       {(caddr_t *) & trail, "trail", "Trail", DEF_TRAIL, t_Bool}
+};
+static OptionStruct desc[] =
+{
+       {"-/+decay", "turn on/off decaying orbits"},
+       {"-/+trail", "turn on/off trail dots"}
+};
+
+ModeSpecOpt grav_opts = { 4, opts, 2, vars, desc };
+
+typedef struct {
+       double        P[DIMENSIONS], V[DIMENSIONS], A[DIMENSIONS];
+       int           xi, yi, ri;
+       unsigned long colors;
+} planetstruct;
+
+typedef struct {
+       int         width, height;
+       int         x, y, sr, nplanets;
+       unsigned long starcolor;
+       planetstruct *planets;
+} gravstruct;
+
+static gravstruct *gravs = NULL;
+
+static void
+init_planet(ModeInfo * mi, planetstruct * planet)
+{
+       Display    *display = MI_DISPLAY(mi);
+       Window      window = MI_WINDOW(mi);
+       GC          gc = MI_GC(mi);
+       gravstruct *gp = &gravs[MI_SCREEN(mi)];
+
+       if (MI_NPIXELS(mi) > 2)
+               planet->colors = MI_PIXEL(mi, NRAND(MI_NPIXELS(mi)));
+       else
+               planet->colors = MI_WIN_WHITE_PIXEL(mi);
+       /* Initialize positions */
+       POS(X) = FLOATRAND(-XR, XR);
+       POS(Y) = FLOATRAND(-YR, YR);
+       POS(Z) = FLOATRAND(-ZR, ZR);
+
+       if (POS(Z) > -ALMOST) {
+               planet->xi = (int)
+                       ((double) gp->width * (HALF + POS(X) / (POS(Z) + DIST)));
+               planet->yi = (int)
+                       ((double) gp->height * (HALF + POS(Y) / (POS(Z) + DIST)));
+       } else
+               planet->xi = planet->yi = -1;
+       planet->ri = RADIUS;
+
+       /* Initialize velocities */
+       VEL(X) = FLOATRAND(-VR, VR);
+       VEL(Y) = FLOATRAND(-VR, VR);
+       VEL(Z) = FLOATRAND(-VR, VR);
+
+       /* Draw planets */
+       Planet(planet->xi, planet->yi);
+}
+
+static void
+draw_planet(ModeInfo * mi, planetstruct * planet)
+{
+       Display    *display = MI_DISPLAY(mi);
+       Window      window = MI_WINDOW(mi);
+       GC          gc = MI_GC(mi);
+       gravstruct *gp = &gravs[MI_SCREEN(mi)];
+       double      D;          /* A distance variable to work with */
+       register unsigned char cmpt;
+
+       D = POS(X) * POS(X) + POS(Y) * POS(Y) + POS(Z) * POS(Z);
+       if (D < COLLIDE)
+               D = COLLIDE;
+       D = sqrt(D);
+       D = D * D * D;
+       for (cmpt = X; cmpt < DIMENSIONS; cmpt++) {
+               ACC(cmpt) = POS(cmpt) * GRAV / D;
+               if (decay) {
+                       if (ACC(cmpt) > MaxA)
+                               ACC(cmpt) = MaxA;
+                       else if (ACC(cmpt) < -MaxA)
+                               ACC(cmpt) = -MaxA;
+                       VEL(cmpt) = VEL(cmpt) + ACC(cmpt);
+                       VEL(cmpt) *= DAMP;
+               } else {
+                       /* update velocity */
+                       VEL(cmpt) = VEL(cmpt) + ACC(cmpt);
+               }
+               /* update position */
+               POS(cmpt) = POS(cmpt) + VEL(cmpt);
+       }
+
+       gp->x = planet->xi;
+       gp->y = planet->yi;
+
+       if (POS(Z) > -ALMOST) {
+               planet->xi = (int)
+                       ((double) gp->width * (HALF + POS(X) / (POS(Z) + DIST)));
+               planet->yi = (int)
+                       ((double) gp->height * (HALF + POS(Y) / (POS(Z) + DIST)));
+       } else
+               planet->xi = planet->yi = -1;
+
+       /* Mask */
+       XSetForeground(display, gc, MI_WIN_BLACK_PIXEL(mi));
+       Planet(gp->x, gp->y);
+       if (trail) {
+               XSetForeground(display, gc, planet->colors);
+               XDrawPoint(display, MI_WINDOW(mi), gc, gp->x, gp->y);
+       }
+       /* Move */
+       gp->x = planet->xi;
+       gp->y = planet->yi;
+       planet->ri = RADIUS;
+
+       /* Redraw */
+       XSetForeground(display, gc, planet->colors);
+       Planet(gp->x, gp->y);
+}
+
+void
+init_grav(ModeInfo * mi)
+{
+       Display    *display = MI_DISPLAY(mi);
+       GC          gc = MI_GC(mi);
+       gravstruct *gp;
+       unsigned char ball;
+
+       if (gravs == NULL) {
+               if ((gravs = (gravstruct *) calloc(MI_NUM_SCREENS(mi),
+                                              sizeof (gravstruct))) == NULL)
+                       return;
+       }
+       gp = &gravs[MI_SCREEN(mi)];
+
+       gp->width = MI_WIN_WIDTH(mi);
+       gp->height = MI_WIN_HEIGHT(mi);
+
+       gp->sr = STARRADIUS;
+
+       gp->nplanets = MI_BATCHCOUNT(mi);
+       if (gp->nplanets < 0) {
+               if (gp->planets) {
+                       (void) free((void *) gp->planets);
+                       gp->planets = NULL;
+               }
+               gp->nplanets = NRAND(-gp->nplanets) + 1;        /* Add 1 so its not too boring */
+       }
+       if (!gp->planets)
+               gp->planets = (planetstruct *) calloc(gp->nplanets, sizeof (planetstruct));
+
+       XClearWindow(display, MI_WINDOW(mi));
+
+       if (MI_NPIXELS(mi) > 2)
+               gp->starcolor = MI_PIXEL(mi, NRAND(MI_NPIXELS(mi)));
+       else
+               gp->starcolor = MI_WIN_WHITE_PIXEL(mi);
+       for (ball = 0; ball < (unsigned char) gp->nplanets; ball++)
+               init_planet(mi, &gp->planets[ball]);
+
+       /* Draw centrepoint */
+       XDrawArc(display, MI_WINDOW(mi), gc,
+                gp->width / 2 - gp->sr / 2, gp->height / 2 - gp->sr / 2, gp->sr, gp->sr,
+                0, 23040);
+}
+
+void
+draw_grav(ModeInfo * mi)
+{
+       Display    *display = MI_DISPLAY(mi);
+       Window      window = MI_WINDOW(mi);
+       GC          gc = MI_GC(mi);
+       gravstruct *gp = &gravs[MI_SCREEN(mi)];
+       register unsigned char ball;
+
+       /* Mask centrepoint */
+       XSetForeground(display, gc, MI_WIN_BLACK_PIXEL(mi));
+       XDrawArc(display, window, gc,
+                gp->width / 2 - gp->sr / 2, gp->height / 2 - gp->sr / 2, gp->sr, gp->sr,
+                0, 23040);
+
+       /* Resize centrepoint */
+       switch (NRAND(4)) {
+               case 0:
+                       if (gp->sr < (int) STARRADIUS)
+                               gp->sr++;
+                       break;
+               case 1:
+                       if (gp->sr > 2)
+                               gp->sr--;
+       }
+
+       /* Draw centrepoint */
+       XSetForeground(display, gc, gp->starcolor);
+       XDrawArc(display, window, gc,
+                gp->width / 2 - gp->sr / 2, gp->height / 2 - gp->sr / 2, gp->sr, gp->sr,
+                0, 23040);
+
+       for (ball = 0; ball < (unsigned char) gp->nplanets; ball++)
+               draw_planet(mi, &gp->planets[ball]);
+}
+
+void
+release_grav(ModeInfo * mi)
+{
+       if (gravs != NULL) {
+               int         screen;
+
+               for (screen = 0; screen < MI_NUM_SCREENS(mi); screen++) {
+                       gravstruct *gp = &gravs[screen];
+
+                       if (gp->planets)
+                               (void) free((void *) gp->planets);
+               }
+               (void) free((void *) gravs);
+               gravs = NULL;
+       }
+}
+
+void
+refresh_grav(ModeInfo * mi)
+{
+       /* Do nothing, it will refresh by itself */
+}
diff --git a/hacks/grav.man b/hacks/grav.man
new file mode 100644 (file)
index 0000000..7cd42cb
--- /dev/null
@@ -0,0 +1,74 @@
+.TH XScreenSaver 1 "10-May-97" "X Version 11"
+.SH NAME
+grav - draws a simple orbital simulation
+.SH SYNOPSIS
+.B grav
+[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-ncolors \fIinteger\fP] [\-delay \fImicroseconds\fP] [\-count \fIinteger\fP] [\-decay] [\-no\-decay] [\-trail] [\-no\-trail]
+
+.SH DESCRIPTION
+The \fIgrav\fP program draws a simple orbital simulation
+.SH OPTIONS
+.I grav
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window.  This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-mono 
+If on a color display, pretend we're on a monochrome display.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use.  Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-ncolors \fIinteger\fP
+How many colors should be used (if possible).  Default 200.
+The colors are chosen randomly.
+.TP 8
+.B \-count \fIinteger\fP
+Default 12.
+.TP 8
+.B \-decay
+.TP 8
+.B \-no-\decay
+Whether orbits should decay.
+
+.TP 8
+.B \-trail
+.TP 8
+.B \-no\-trail
+Whether the objects should leave trails behind them (makes it look vaguely
+like a cloud-chamber.
+
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1),
+.BR xlock (1)
+.SH COPYRIGHT
+Copyright \(co 1993 by Greg Bowering.
+
+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. 
+.SH AUTHOR
+Greg Bowering <greg@smug.student.adelaide.edu.au>, 1993.
+
+Ability to run standalone or with \fIxscreensaver\fP added by 
+Jamie Zawinski <jwz@jwz.org>, 10-May-97.
diff --git a/hacks/greynetic.c b/hacks/greynetic.c
new file mode 100644 (file)
index 0000000..1377c95
--- /dev/null
@@ -0,0 +1,183 @@
+/* xscreensaver, Copyright (c) 1992, 1995, 1996, 1997, 1998
+ *  Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software 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.  No representations are made about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or 
+ * implied warranty.
+ */
+
+#include "screenhack.h"
+
+#define NBITS 12
+
+#ifndef VMS
+# include <X11/bitmaps/stipple>
+# include <X11/bitmaps/cross_weave>
+# include <X11/bitmaps/dimple1>
+# include <X11/bitmaps/dimple3>
+# include <X11/bitmaps/flipped_gray>
+# include <X11/bitmaps/gray1>
+# include <X11/bitmaps/gray3>
+# include <X11/bitmaps/hlines2>
+# include <X11/bitmaps/light_gray>
+# include <X11/bitmaps/root_weave>
+# include <X11/bitmaps/vlines2>
+# include <X11/bitmaps/vlines3>
+#else /* VMS */
+# include "sys$common:[decw$include.bitmaps]stipple.xbm"
+# include "sys$common:[decw$include.bitmaps]cross_weave.xbm"
+# include "sys$common:[decw$include.bitmaps]dimple1.xbm"
+# include "sys$common:[decw$include.bitmaps]dimple3.xbm"
+# include "sys$common:[decw$include.bitmaps]flipped_gray.xbm"
+# include "sys$common:[decw$include.bitmaps]gray1.xbm"
+# include "sys$common:[decw$include.bitmaps]gray3.xbm"
+# include "sys$common:[decw$include.bitmaps]hlines2.xbm"
+# include "sys$common:[decw$include.bitmaps]light_gray.xbm"
+# include "sys$common:[decw$include.bitmaps]root_weave.xbm"
+# include "sys$common:[decw$include.bitmaps]vlines2.xbm"
+# include "sys$common:[decw$include.bitmaps]vlines3.xbm"
+#endif /* VMS */
+
+static Pixmap pixmaps [NBITS];
+static GC gc;
+static int delay;
+static unsigned long fg, bg, pixels [512];
+static int npixels;
+
+static void
+init_greynetic (Display *dpy, Window window)
+{
+  int i;
+  XGCValues gcv;
+  XWindowAttributes xgwa;
+  Colormap cmap;
+  XGetWindowAttributes (dpy, window, &xgwa);
+  cmap = xgwa.colormap;
+  npixels = 0;
+  gcv.foreground= fg= get_pixel_resource("foreground","Foreground", dpy, cmap);
+  gcv.background= bg= get_pixel_resource("background","Background", dpy, cmap);
+  gcv.fill_style= FillOpaqueStippled;
+  gc = XCreateGC (dpy, window, GCForeground|GCBackground|GCFillStyle, &gcv);
+
+  delay = get_integer_resource ("delay", "Integer");
+  if (delay < 0) delay = 0;
+
+  i = 0;
+#define BITS(n,w,h) \
+  pixmaps [i++] = XCreatePixmapFromBitmapData (dpy, window, n, w, h, 1, 0, 1)
+
+  BITS (stipple_bits, stipple_width, stipple_height);
+  BITS (cross_weave_bits, cross_weave_width, cross_weave_height);
+  BITS (dimple1_bits, dimple1_width, dimple1_height);
+  BITS (dimple3_bits, dimple3_width, dimple3_height);
+  BITS (flipped_gray_bits, flipped_gray_width, flipped_gray_height);
+  BITS (gray1_bits, gray1_width, gray1_height);
+  BITS (gray3_bits, gray3_width, gray3_height);
+  BITS (hlines2_bits, hlines2_width, hlines2_height);
+  BITS (light_gray_bits, light_gray_width, light_gray_height);
+  BITS (root_weave_bits, root_weave_width, root_weave_height);
+  BITS (vlines2_bits, vlines2_width, vlines2_height);
+  BITS (vlines3_bits, vlines3_width, vlines3_height);
+}
+
+static void
+greynetic (Display *dpy, Window window)
+{
+  static int tick = 500, xlim, ylim;
+  static Colormap cmap;
+  int x, y, w, h, i;
+  XGCValues gcv;
+  if (tick++ == 500)
+    {
+      XWindowAttributes xgwa;
+      XGetWindowAttributes (dpy, window, &xgwa);
+      tick = 0;
+      xlim = xgwa.width;
+      ylim = xgwa.height;
+      cmap = xgwa.colormap;
+    }
+  for (i = 0; i < 10; i++) /* minimize area, but don't try too hard */
+    {
+      w = 50 + random () % (xlim - 50);
+      h = 50 + random () % (ylim - 50);
+      if (w + h < xlim && w + h < ylim)
+       break;
+    }
+  x = random () % (xlim - w);
+  y = random () % (ylim - h);
+  gcv.stipple = pixmaps [random () % NBITS];
+  if (mono_p)
+    {
+    MONO:
+      if (random () & 1)
+       gcv.foreground = fg, gcv.background = bg;
+      else
+       gcv.foreground = bg, gcv.background = fg;
+    }
+  else
+    {
+      XColor fgc, bgc;
+      if (npixels == sizeof (pixels) / sizeof (unsigned long))
+       goto REUSE;
+      fgc.flags = bgc.flags = DoRed|DoGreen|DoBlue;
+      fgc.red = random ();
+      fgc.green = random ();
+      fgc.blue = random ();
+      bgc.red = random ();
+      bgc.green = random ();
+      bgc.blue = random ();
+      if (! XAllocColor (dpy, cmap, &fgc))
+       goto REUSE;
+      pixels [npixels++] = fgc.pixel;
+      gcv.foreground = fgc.pixel;
+      if (! XAllocColor (dpy, cmap, &bgc))
+       goto REUSE;
+      pixels [npixels++] = bgc.pixel;
+      gcv.background = bgc.pixel;
+      goto DONE;
+    REUSE:
+      if (npixels <= 0)
+       {
+         mono_p = 1;
+         goto MONO;
+       }
+      gcv.foreground = pixels [random () % npixels];
+      gcv.background = pixels [random () % npixels];
+    DONE:
+      ;
+    }
+  XChangeGC (dpy, gc, GCStipple|GCForeground|GCBackground, &gcv);
+  XFillRectangle (dpy, window, gc, x, y, w, h);
+  XSync (dpy, False);
+}
+
+\f
+char *progclass = "Greynetic";
+
+char *defaults [] = {
+  ".background:        black",
+  ".foreground:        white",
+  "*delay:     0",
+  0
+};
+
+XrmOptionDescRec options [] = {
+  { "-delay",          ".delay",       XrmoptionSepArg, 0 },
+  { 0, 0, 0, 0 }
+};
+
+void
+screenhack (Display *dpy, Window window)
+{
+  init_greynetic (dpy, window);
+  while (1)
+    {
+      greynetic (dpy, window);
+      screenhack_handle_events (dpy);
+      if (delay) usleep (delay);
+    }
+}
diff --git a/hacks/greynetic.man b/hacks/greynetic.man
new file mode 100644 (file)
index 0000000..0b761cc
--- /dev/null
@@ -0,0 +1,52 @@
+.TH XScreenSaver 1 "13-aug-92" "X Version 11"
+.SH NAME
+greynetic - draw random stippled/color rectangles
+.SH SYNOPSIS
+.B greynetic
+[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-delay \fIusecs\fP]
+.SH DESCRIPTION
+The \fIgreynetic\fP program draws random rectangles.
+.SH OPTIONS
+.I greynetic
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window.  This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-mono 
+If on a color display, pretend we're on a monochrome display.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use.  Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-delay \fImicroseconds\fP
+Slow it down.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 1992 by Jamie Zawinski.  Permission to use, copy, modify, 
+distribute, and sell this software 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.  No representations are made about the 
+suitability of this software for any purpose.  It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Jamie Zawinski <jwz@jwz.org>, 13-aug-92.
diff --git a/hacks/halo.c b/hacks/halo.c
new file mode 100644 (file)
index 0000000..7cab38d
--- /dev/null
@@ -0,0 +1,466 @@
+/* xscreensaver, Copyright (c) 1993, 1995, 1996, 1997, 1998, 1999
+ *  Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software 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.  No representations are made about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or 
+ * implied warranty.
+ */
+
+/* I wanted to lay down new circles with TV:ALU-ADD instead of TV:ALU-XOR,
+   but X doesn't support arithmetic combinations of pixmaps!!  What losers.
+   I suppose I could crank out the 2's compliment math by hand, but that's
+   a real drag...
+
+   This would probably look good with shapes other than circles as well.
+
+ */
+
+#include "screenhack.h"
+#include <stdio.h>
+
+struct circle {
+  int x, y, radius;
+  int increment;
+  int dx, dy;
+};
+
+static enum color_mode {
+  seuss_mode, ramp_mode, random_mode
+} cmode;
+
+
+static struct circle *circles;
+static int count, global_count;
+static Pixmap pixmap, buffer;
+static int width, height, global_inc;
+static int delay, delay2, cycle_delay;
+static unsigned long fg_pixel, bg_pixel;
+static GC draw_gc, erase_gc, copy_gc, merge_gc;
+static Bool anim_p;
+static Colormap cmap;
+
+static int ncolors;
+static XColor *colors;
+static Bool cycle_p;
+static int fg_index;
+static int bg_index;
+
+
+#define min(x,y) ((x)<(y)?(x):(y))
+#define max(x,y) ((x)>(y)?(x):(y))
+
+static void
+init_circles_1 (Display *dpy, Window window)
+{
+  int i;
+  count = (global_count ? global_count
+          : (3 + (random () % max (1, (min (width, height) / 50)))
+               + (random () % max (1, (min (width, height) / 50)))));
+  circles = (struct circle *) malloc (count * sizeof (struct circle));
+  for (i = 0; i < count; i++)
+    {
+      circles [i].x = 10 + random () % (width - 20);
+      circles [i].y = 10 + random () % (height - 20);
+      if (global_inc)
+      circles [i].increment = global_inc;
+      else
+       { /* prefer smaller increments to larger ones */
+         int j = 8;
+         int inc = ((random()%j) + (random()%j) + (random()%j)) - ((j*3)/2);
+         if (inc < 0) inc = -inc + 3;
+         circles [i].increment = inc + 3;
+       }
+      circles [i].radius = random () % circles [i].increment;
+      circles [i].dx = ((random () % 3) - 1) * (1 + random () % 5);
+      circles [i].dy = ((random () % 3) - 1) * (1 + random () % 5);
+    }
+}
+
+static void
+init_circles (Display *dpy, Window window)
+{
+  XGCValues gcv;
+  XWindowAttributes xgwa;
+  char *mode_str = 0;
+  XGetWindowAttributes (dpy, window, &xgwa);
+  cmap = xgwa.colormap;
+  global_count = get_integer_resource ("count", "Integer");
+  if (global_count < 0) global_count = 0;
+  global_inc = get_integer_resource ("increment", "Integer");
+  if (global_inc < 0) global_inc = 0;
+  anim_p = get_boolean_resource ("animate", "Boolean");
+  delay = get_integer_resource ("delay", "Integer");
+  delay2 = get_integer_resource ("delay2", "Integer") * 1000000;
+  cycle_delay = get_integer_resource ("cycleDelay", "Integer");
+  mode_str = get_string_resource ("colorMode", "ColorMode");
+  if (! mode_str) cmode = random_mode;
+  else if (!strcmp (mode_str, "seuss"))  cmode = seuss_mode;
+  else if (!strcmp (mode_str, "ramp"))   cmode = ramp_mode;
+  else if (!strcmp (mode_str, "random")) cmode = random_mode;
+  else {
+    fprintf (stderr,
+            "%s: colorMode must be seuss, ramp, or random, not \"%s\"\n",
+            progname, mode_str);
+    exit (1);
+  }
+
+  if (mono_p) cmode = seuss_mode;
+  if (cmode == random_mode)
+    cmode = ((random()&3) == 1) ? ramp_mode : seuss_mode;
+
+  if (cmode == ramp_mode)
+    anim_p = False;    /* This combo doesn't work right... */
+
+  ncolors = get_integer_resource ("colors", "Colors");
+  if (ncolors < 2) ncolors = 2;
+  if (ncolors <= 2) mono_p = True;
+
+  if (mono_p)
+    colors = 0;
+  else
+    colors = (XColor *) malloc(sizeof(*colors) * (ncolors+1));
+
+  cycle_p = mono_p ? False : get_boolean_resource ("cycle", "Cycle");
+
+  /* If the visual isn't color-indexed, don't bother trying to
+     allocate writable cells. */
+  if (cycle_p && !has_writable_cells (xgwa.screen, xgwa.visual))
+    cycle_p = False;
+
+
+  if (mono_p)
+    ;
+  else if (random() % (cmode == seuss_mode ? 2 : 10))
+    make_uniform_colormap (dpy, xgwa.visual, cmap, colors, &ncolors,
+                          True, &cycle_p, True);
+  else
+    make_smooth_colormap (dpy, xgwa.visual, cmap, colors, &ncolors,
+                         True, &cycle_p, True);
+
+  if (ncolors <= 2) mono_p = True;
+  if (mono_p) cycle_p = False;
+  if (mono_p) cmode = seuss_mode;
+
+  if (mono_p)
+    {
+      fg_pixel = get_pixel_resource ("foreground", "Foreground", dpy, cmap);
+      bg_pixel = get_pixel_resource ("background", "Background", dpy, cmap);
+    }
+  else
+    {
+      fg_index = 0;
+      bg_index = ncolors / 4;
+      if (fg_index == bg_index) bg_index++;
+      fg_pixel = colors[fg_index].pixel;
+      bg_pixel = colors[bg_index].pixel;
+    }
+
+  width = max (50, xgwa.width);
+  height = max (50, xgwa.height);
+
+#ifdef DEBUG
+  width/=2; height/=2;
+#endif
+
+  pixmap = XCreatePixmap (dpy, window, width, height, 1);
+  if (cmode == seuss_mode)
+    buffer = XCreatePixmap (dpy, window, width, height, 1);
+  else
+    buffer = 0;
+
+  gcv.foreground = 1;
+  gcv.background = 0;
+  draw_gc = XCreateGC (dpy, pixmap, GCForeground | GCBackground, &gcv);
+  gcv.foreground = 0;
+  erase_gc = XCreateGC (dpy, pixmap, GCForeground, &gcv);
+  gcv.foreground = fg_pixel;
+  gcv.background = bg_pixel;
+  copy_gc = XCreateGC (dpy, window, GCForeground | GCBackground, &gcv);
+
+  if (cmode == seuss_mode)
+    {
+      gcv.foreground = 1;
+      gcv.background = 0;
+      gcv.function = GXxor;
+      merge_gc = XCreateGC (dpy, pixmap,
+                           GCForeground | GCBackground | GCFunction, &gcv);
+    }
+  else
+    {
+      gcv.foreground = fg_pixel;
+      gcv.background = bg_pixel;
+      gcv.function = GXcopy;
+      merge_gc = XCreateGC (dpy, window,
+                           GCForeground | GCBackground | GCFunction, &gcv);
+    }
+
+  init_circles_1 (dpy, window);
+  XClearWindow (dpy, window);
+  if (buffer) XFillRectangle (dpy, buffer, erase_gc, 0, 0, width, height);
+}
+
+static void
+run_circles (Display *dpy, Window window)
+{
+  int i;
+  static int iterations = 0;
+  static int oiterations = 0;
+  static Bool first_time_p = True;
+  Bool done = False;
+  Bool inhibit_sleep = False;
+  static int clear_tick = 0;
+
+  XFillRectangle (dpy, pixmap, erase_gc, 0, 0, width, height);
+  for (i = 0; i < count; i++)
+    {
+      int radius = circles [i].radius;
+      int inc = circles [i].increment;
+
+      if (! (iterations & 1))  /* never stop on an odd number of iterations */
+       ;
+      else if (radius == 0)    /* eschew inf */
+       ;
+      else if (radius < 0)     /* stop when the circles are points */
+       done = True;
+      else                     /* stop when the circles fill the window */
+       {
+         /* Probably there's a simpler way to ask the musical question,
+            "is this square completely enclosed by this circle," but I've
+            forgotten too much trig to know it...  (That's not really the
+            right question anyway, but the right question is too hard.) */
+         double x1 = ((double) (-circles [i].x)) / ((double) radius);
+         double y1 = ((double) (-circles [i].y)) / ((double) radius);
+         double x2 = ((double) (width - circles [i].x)) / ((double) radius);
+         double y2 = ((double) (height - circles [i].y)) / ((double) radius);
+         x1 *= x1; x2 *= x2; y1 *= y1; y2 *= y2;
+         if ((x1 + y1) < 1 && (x2 + y2) < 1 && (x1 + y2) < 1 && (x2 + y1) < 1)
+           done = True;
+       }
+
+      if (radius > 0 &&
+         (cmode == seuss_mode ||       /* drawing all circles, or */
+          circles [0].increment < 0))  /* on the way back in */
+       {
+         XFillArc (dpy,
+                   (cmode == seuss_mode ? pixmap : window),
+                   (cmode == seuss_mode ? draw_gc : merge_gc),
+                   circles [i].x - radius, circles [i].y - radius,
+                   radius * 2, radius * 2, 0, 360*64);
+       }
+      circles [i].radius += inc;
+    }
+
+  if (cycle_p && cmode != seuss_mode)
+    {
+      struct timeval now;
+      static struct timeval then = { 0, };
+      unsigned long diff;
+#ifdef GETTIMEOFDAY_TWO_ARGS
+      struct timezone tzp;
+      gettimeofday(&now, &tzp);
+#else
+      gettimeofday(&now);
+#endif
+      diff = (((now.tv_sec - then.tv_sec)  * 1000000) +
+             (now.tv_usec - then.tv_usec));
+      if (diff > cycle_delay)
+       {
+         rotate_colors (dpy, cmap, colors, ncolors, 1);
+         then = now;
+       }
+    }
+
+  if (anim_p && !first_time_p)
+    inhibit_sleep = !done;
+
+  if (done)
+    {
+      if (anim_p)
+       {
+         first_time_p = False;
+         for (i = 0; i < count; i++)
+           {
+             circles [i].x += circles [i].dx;
+             circles [i].y += circles [i].dy;
+             circles [i].radius %= circles [i].increment;
+             if (circles [i].x < 0 || circles [i].x >= width)
+               {
+                 circles [i].dx = -circles [i].dx;
+                 circles [i].x += (2 * circles [i].dx);
+               }
+             if (circles [i].y < 0 || circles [i].y >= height)
+               {
+                 circles [i].dy = -circles [i].dy;
+                 circles [i].y += (2 * circles [i].dy);
+               }
+           }
+       }
+      else if (circles [0].increment < 0)
+       {
+         /* We've zoomed out and the screen is blank -- re-pick the
+            center points, and shift the colors.
+          */
+         free (circles);
+         init_circles_1 (dpy, window);
+         if (! mono_p)
+           {
+             fg_index = (fg_index + 1) % ncolors;
+             bg_index = (fg_index + (ncolors/2)) % ncolors;
+             XSetForeground (dpy, copy_gc, colors [fg_index].pixel);
+             XSetBackground (dpy, copy_gc, colors [bg_index].pixel);
+           }
+       }
+      /* Sometimes go out from the inside instead of the outside */
+      else if (clear_tick == 0 && ((random () % 3) == 0))
+       {
+         iterations = 0; /* ick */
+         for (i = 0; i < count; i++)
+           circles [i].radius %= circles [i].increment;
+
+          clear_tick = ((random() % 8) + 4) | 1;   /* must be odd */
+       }
+      else
+       {
+         oiterations = iterations;
+         for (i = 0; i < count; i++)
+           {
+             circles [i].increment = -circles [i].increment;
+             circles [i].radius += (2 * circles [i].increment);
+           }
+       }
+    }
+
+  if (buffer)
+    XCopyPlane (dpy, pixmap, buffer, merge_gc, 0, 0, width, height, 0, 0, 1);
+  else if (cmode != seuss_mode)
+    {
+
+      if (!mono_p)
+       {
+         fg_index++;
+         bg_index++;
+         if (fg_index >= ncolors) fg_index = 0;
+         if (bg_index >= ncolors) bg_index = 0;
+         XSetForeground (dpy, merge_gc, colors [fg_index].pixel);
+       }
+
+      if (circles [0].increment >= 0)
+       inhibit_sleep = True;
+      else if (done && cmode == seuss_mode)
+       XFillRectangle (dpy, window, merge_gc, 0, 0, width, height);
+    }
+  else
+    XCopyPlane (dpy, pixmap, window, merge_gc, 0, 0, width, height, 0, 0, 1);
+
+  /* buffer is only used in seuss-mode or anim-mode */
+  if (buffer && (anim_p
+                ? (done || (first_time_p && (iterations & 1)))
+                : (iterations & 1)))
+    {
+      XCopyPlane (dpy, buffer, window, copy_gc, 0, 0, width, height, 0, 0, 1);
+      XSync (dpy, False);
+      if (anim_p && done)
+       XFillRectangle (dpy, buffer, erase_gc, 0, 0, width, height);
+    }
+
+#ifdef DEBUG
+  XCopyPlane (dpy, pixmap, window, copy_gc, 0,0,width,height,width,height, 1);
+  if (buffer)
+    XCopyPlane (dpy, buffer, window, copy_gc, 0,0,width,height,0,height, 1);
+  XSync (dpy, False);
+#endif
+
+  if (done)
+    iterations = 0;
+  else
+    iterations++;
+
+  if (delay && !inhibit_sleep)
+    {
+      static Bool really_first_p = True;
+      int direction = 1;
+      int d = delay;
+      if (done && cycle_p && cmode != seuss_mode && !really_first_p)
+       {
+         d = delay2;
+         if (! (random() % 10))
+           direction = -1;
+       }
+
+      XSync(dpy, False);
+      screenhack_handle_events (dpy);
+
+      if (cycle_p && cycle_delay)
+       {
+         int i = 0;
+         while (i < d)
+           {
+             rotate_colors (dpy, cmap, colors, ncolors, direction);
+             usleep(cycle_delay);
+              screenhack_handle_events (dpy);
+             i += cycle_delay;
+           }
+       }
+      else if (cmode != seuss_mode &&
+               done && !really_first_p && cycle_delay > 0)
+        usleep (cycle_delay * 50);
+      else
+        usleep (d);
+
+      if (done)
+       really_first_p = False;
+    }
+
+  if (done && clear_tick > 0)
+    {
+      clear_tick--;
+      if (!clear_tick)
+        {
+          XClearWindow (dpy, window);
+          if (buffer) XFillRectangle (dpy, buffer, erase_gc, 0,0,width,height);
+        }
+    }
+}
+
+\f
+char *progclass = "Halo";
+
+char *defaults [] = {
+  ".background:                black",
+  ".foreground:                white",
+  "*colorMode:         random",
+  "*colors:            100",
+  "*cycle:             true",
+  "*count:             0",
+  "*delay:             100000",
+  "*delay2:            20",
+  "*cycleDelay:                100000",
+  0
+};
+
+XrmOptionDescRec options [] = {
+  { "-count",          ".count",       XrmoptionSepArg, 0 },
+  { "-delay",          ".delay",       XrmoptionSepArg, 0 },
+  { "-cycle-delay",    ".cycleDelay",  XrmoptionSepArg, 0 },
+  { "-animate",                ".animate",     XrmoptionNoArg, "True" },
+  { "-mode",           ".colorMode",   XrmoptionSepArg, 0 },
+  { "-colors",         ".colors",      XrmoptionSepArg, 0 },
+  { "-cycle",          ".cycle",       XrmoptionNoArg, "True" },
+  { "-no-cycle",       ".cycle",       XrmoptionNoArg, "False" },
+  { 0, 0, 0, 0 }
+};
+
+void
+screenhack (Display *dpy, Window window)
+{
+  init_circles (dpy, window);
+  while (1)
+    {
+      run_circles (dpy, window);
+      screenhack_handle_events (dpy);
+    }
+}
diff --git a/hacks/halo.man b/hacks/halo.man
new file mode 100644 (file)
index 0000000..a499357
--- /dev/null
@@ -0,0 +1,80 @@
+.TH XScreenSaver 1 "12-Jun-97" "X Version 11"
+.SH NAME
+halo - draw circular patterns
+.SH SYNOPSIS
+.B halo
+[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-count \fIint\fP] [\-delay \fIusecs\fP] [\-mode seuss | ramp | random ] [\-animate] [\-colors \fIinteger\fP] [\-cycle] [\-no\-cycle] [\-cycle\-delay \fIusecs\fP] 
+.SH DESCRIPTION
+The \fIhalo\fP program draws cool patterns based on circles.
+.SH OPTIONS
+.I halo
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window.  This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-mono 
+If on a color display, pretend we're on a monochrome display.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use.  Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-count \fIinteger\fP
+How many circles to draw.  Default 0, meaning random.
+.TP 8
+.B \-mode "seuss | ramp | random"
+In \fIseuss\fP mode, alternating striped curves will be drawn.
+
+In \fIramp\fP mode, a color ramp will be drawn.
+
+\fIrandom\fP means pick the mode randomly.
+.TP 8
+.B \-delay \fImicroseconds\fP
+How much of a delay should be introduced between steps of the animation.
+Default 100000, or about 0.1 second.
+.TP 8
+.B \-colors \fIinteger\fP
+How many colors to use.  Default 100.
+.TP 8
+.B \-animate
+If specified, then the centerpoints of the circles will bounce around.
+Otherwise, the circles will be drawn once, erased, and a new set of
+circles will be drawn.
+.TP 8
+.B \-cycle
+.TP 8
+.B \-no\-cycle
+Whether to do colormap cycling.  Default is to cycle.
+.TP 8
+.B \-cycle\-delay
+Number of microseconds between shifts of the colormap; default 100000,
+or 1/10th second.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 1993 by Jamie Zawinski.  Permission to use, copy, modify, 
+distribute, and sell this software 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.  No representations are made about the 
+suitability of this software for any purpose.  It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Jamie Zawinski <jwz@jwz.org>, 6-jul-93.
diff --git a/hacks/helix.c b/hacks/helix.c
new file mode 100644 (file)
index 0000000..27c9d43
--- /dev/null
@@ -0,0 +1,306 @@
+/* xscreensaver, Copyright (c) 1992, 1995, 1996, 1997
+ *  Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software 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.  No representations are made about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or 
+ * implied warranty.
+ */
+
+/* Algorithm from a Mac program by Chris Tate, written in 1988 or so. */
+
+/* 18-Sep-97: Johannes Keukelaar (johannes@nada.kth.se): Improved screen
+ *            eraser.
+ * 10-May-97: merged ellipse code by Dan Stromberg <strombrg@nis.acs.uci.edu>
+ *            as found in xlockmore 4.03a10.
+ * 1992:      jwz created.
+ */
+
+#include <math.h>
+#include "screenhack.h"
+#include "erase.h"
+
+static double sins [360];
+static double coss [360];
+
+static GC draw_gc;
+static unsigned int default_fg_pixel;
+static int sleep_time;
+
+static void
+init_helix (Display *dpy, Window window)
+{
+  int i;
+  XGCValues gcv;
+  XWindowAttributes xgwa;
+  Colormap cmap;
+  XGetWindowAttributes (dpy, window, &xgwa);
+  cmap = xgwa.colormap;
+  gcv.foreground = default_fg_pixel =
+    get_pixel_resource ("foreground", "Foreground", dpy, cmap);
+  draw_gc = XCreateGC (dpy, window, GCForeground, &gcv);
+  gcv.foreground = get_pixel_resource ("background", "Background", dpy, cmap);
+
+  for (i = 0; i < 360; i++)
+    {
+      sins [i] = sin ((((double) i) / 180.0) * M_PI);
+      coss [i] = cos ((((double) i) / 180.0) * M_PI);
+    }
+}
+
+static int
+gcd (int a, int b)
+{
+  while (b > 0)
+    {
+      int tmp;
+      tmp = a % b;
+      a = b;
+      b = tmp;
+    }
+  return (a < 0 ? -a : a);
+}
+
+static void
+helix (Display *dpy, Window window,
+       int radius1, int radius2, int d_angle,
+       int factor1, int factor2, int factor3, int factor4)
+{
+  XWindowAttributes xgwa;
+  int width, height;
+  int xmid, ymid;
+  int x1, y1, x2, y2, angle, limit;
+  int i;
+
+  XClearWindow (dpy, window);
+  XGetWindowAttributes (dpy, window, &xgwa);
+  width = xgwa.width;
+  height = xgwa.height;
+
+  xmid = width / 2;
+  ymid = height / 2;
+  x1 = xmid;
+  y1 = ymid + radius2;
+  x2 = xmid;
+  y2 = ymid + radius1;
+  angle = 0;
+  limit = 1 + (360 / gcd (360, d_angle));
+  
+  for (i = 0; i < limit; i++)
+    {
+      int tmp;
+#define pmod(x,y) (tmp=((x) % (y)), (tmp >= 0 ? tmp : (tmp + (y))))
+
+      x1 = xmid + (((double) radius1) * sins [pmod ((angle * factor1), 360)]);
+      y1 = ymid + (((double) radius2) * coss [pmod ((angle * factor2), 360)]);
+      XDrawLine (dpy, window, draw_gc, x1, y1, x2, y2);
+      x2 = xmid + (((double) radius2) * sins [pmod ((angle * factor3), 360)]);
+      y2 = ymid + (((double) radius1) * coss [pmod ((angle * factor4), 360)]);
+
+      XDrawLine (dpy, window, draw_gc, x1, y1, x2, y2);
+      angle += d_angle;
+      XFlush (dpy);
+    }
+}
+
+static void
+trig (Display *dpy, Window window,
+      int d_angle, int factor1, int factor2,
+      int offset, int d_angle_offset, int dir, int density)
+{
+  XWindowAttributes xgwa;
+  int width, height;
+  int xmid, ymid;
+  int x1, y1, x2, y2;
+  int tmp, angle;
+  Colormap cmap;
+
+  XClearWindow (dpy, window);
+  XGetWindowAttributes (dpy, window, &xgwa);
+  cmap = xgwa.colormap;
+  width = xgwa.width;
+  height = xgwa.height;
+
+  xmid = width / 2;
+  ymid = height / 2;
+
+  while (d_angle >= -360 && d_angle <= 360)
+    {
+      angle = d_angle + d_angle_offset;
+      x1 = (sins [pmod(angle * factor1, 360)] * xmid) + xmid;
+      y1 = (coss [pmod(angle * factor1, 360)] * ymid) + ymid;
+      x2 = (sins [pmod(angle * factor2 + offset, 360)] * xmid) + xmid;
+      y2 = (coss [pmod(angle * factor2 + offset, 360)] * ymid) + ymid;
+      XDrawLine(dpy, window, draw_gc, x1, y1, x2, y2);
+      tmp = (int) 360 / (2 * density * factor1 * factor2);
+      if (tmp == 0)    /* Do not want it getting stuck... */
+       tmp = 1;        /* Would not need if floating point */
+      d_angle += dir * tmp;
+    }
+}
+
+#define min(a,b) ((a)<(b)?(a):(b))
+
+static void
+random_helix (Display *dpy, Window window, XColor *color, Bool *got_color)
+{
+  Colormap cmap;
+  int width, height;
+  int radius, radius1, radius2, d_angle, factor1, factor2, factor3, factor4;
+  double divisor;
+  XWindowAttributes xgwa;
+  XGetWindowAttributes (dpy, window, &xgwa);
+  width = xgwa.width;
+  height = xgwa.height;
+  cmap = xgwa.colormap;
+
+  radius = min (width, height) / 2;
+
+  d_angle = 0;
+  factor1 = 2;
+  factor2 = 2;
+  factor3 = 2;
+  factor4 = 2;
+
+  divisor = ((frand (3.0) + 1) * (((random() & 1) * 2) - 1));
+
+  if ((random () & 1) == 0)
+    {
+      radius1 = radius;
+      radius2 = radius / divisor;
+    }
+  else
+    {
+      radius2 = radius;
+      radius1 = radius / divisor;
+    }
+
+  while (gcd (360, d_angle) >= 2)
+    d_angle = random () % 360;
+
+#define random_factor()                                \
+  (((random() % 7) ? ((random() & 1) + 1) : 3) \
+   * (((random() & 1) * 2) - 1))
+
+  while (gcd (gcd (gcd (factor1, factor2), factor3), factor4) != 1)
+    {
+      factor1 = random_factor ();
+      factor2 = random_factor ();
+      factor3 = random_factor ();
+      factor4 = random_factor ();
+    }
+
+  if (mono_p)
+    XSetForeground (dpy, draw_gc, default_fg_pixel);
+  else
+    {
+      hsv_to_rgb (random () % 360, frand (1.0), frand (0.5) + 0.5,
+                 &color->red, &color->green, &color->blue);
+      if ((*got_color = XAllocColor (dpy, cmap, color)))
+       XSetForeground (dpy, draw_gc, color->pixel);
+      else
+       XSetForeground (dpy, draw_gc, default_fg_pixel);
+    }
+  helix (dpy, window, radius1, radius2, d_angle,
+        factor1, factor2, factor3, factor4);
+}
+
+static void
+random_trig (Display *dpy, Window window, XColor *color, Bool *got_color)
+{
+  Colormap cmap;
+  int width, height;
+  int radius, d_angle, factor1, factor2;
+  int offset, d_angle_offset, dir, density;
+
+  XWindowAttributes xgwa;
+  XGetWindowAttributes (dpy, window, &xgwa);
+  width = xgwa.width;
+  height = xgwa.height;
+  cmap = xgwa.colormap;
+
+  radius = min (width, height) / 2;
+
+  d_angle = 0;
+  factor1 = (random() % 8) + 1;
+  do {
+    factor2 = (random() % 8) + 1;
+  } while (factor1 == factor2);
+
+  dir = (random() & 1) ? 1 : -1;
+  d_angle_offset = random() % 360;
+  offset = ((random() % ((360 / 4) - 1)) + 1) / 4;
+  density = 1 << ((random() % 4) + 4); /* Higher density, higher angles */
+
+  if (mono_p)
+    XSetForeground (dpy, draw_gc, default_fg_pixel);
+  else
+    {
+      hsv_to_rgb (random () % 360, frand (1.0), frand (0.5) + 0.5,
+                 &color->red, &color->green, &color->blue);
+      if ((*got_color = XAllocColor (dpy, cmap, color)))
+       XSetForeground (dpy, draw_gc, color->pixel);
+      else
+       XSetForeground (dpy, draw_gc, default_fg_pixel);
+    }
+  trig (dpy, window, d_angle, factor1, factor2,
+       offset, d_angle_offset, dir, density);
+}
+
+static void
+random_helix_or_trig (Display *dpy, Window window)
+{
+  Bool free_color = False;
+  XColor color;
+  int width, height;
+  XWindowAttributes xgwa;
+  Colormap cmap;
+  XGetWindowAttributes (dpy, window, &xgwa);
+  width = xgwa.width;
+  height = xgwa.height;
+  cmap = xgwa.colormap;
+
+  if (random() & 1)
+    random_helix(dpy, window, &color, &free_color);
+  else
+    random_trig(dpy, window, &color, &free_color);
+
+  XSync (dpy, False);
+  screenhack_handle_events (dpy);
+  sleep ( sleep_time );
+
+  screenhack_handle_events (dpy);
+  erase_full_window(dpy, window);
+
+  if (free_color) XFreeColors (dpy, cmap, &color.pixel, 1, 0);
+  XSync (dpy, False);
+  screenhack_handle_events (dpy);
+  sleep (1);
+}
+
+\f
+char *progclass = "Helix";
+
+char *defaults [] = {
+  ".background: black",
+  "*delay:      5",
+  0
+};
+
+XrmOptionDescRec options [] = {   
+  { "-delay",           ".delay",               XrmoptionSepArg, 0 },
+  { 0 },
+};
+int options_size = (sizeof (options) / sizeof (options[0]));
+
+void
+screenhack (Display *dpy, Window window)
+{
+  sleep_time = get_integer_resource("delay", "Integer");
+  init_helix (dpy, window);
+  while (1)
+    random_helix_or_trig (dpy, window);
+}
diff --git a/hacks/helix.man b/hacks/helix.man
new file mode 100644 (file)
index 0000000..2c1c3e3
--- /dev/null
@@ -0,0 +1,63 @@
+.TH XScreenSaver 1 "18-sep-97" "X Version 11"
+.SH NAME
+helix - draw helical string-art patterns
+.SH SYNOPSIS
+.B helix
+[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-erase\-speed \fIusecs\fP] [\-erase\-mode \fIinteger\fP] [\-delay \fIseconds\fP] [\-install] [\-visual \fIvisual\fP]
+.SH DESCRIPTION
+The \fIhelix\fP program draws interesting patterns composed of line segments
+in random colors.
+.SH OPTIONS
+.I helix
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window.  This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-mono 
+If on a color display, pretend we're on a monochrome display.
+.TP 8
+.B \-erase\-speed \fIusecs\fP
+This controls the speed at which the screen will be erased. Lower numbers 
+erase faster.
+.TP 8
+.B \-erase\-mode \fIinteger\fP
+This sets the erase mode. Mode \-1 chooses a random mode each time. There
+are currently 6 modes defined (0\-5).
+.TP 8
+.B \-delay \fIseconds\fP
+This sets the number of seconds that the helix will be on the screen.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use.  Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 1992 by Jamie Zawinski.  Permission to use, copy, modify, 
+distribute, and sell this software 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.  No representations are made about the 
+suitability of this software for any purpose.  It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Jamie Zawinski <jwz@jwz.org>, 13-aug-92.
+Screen eraser improved by Johannes Keukelaar <johannes@nada.kth.se>, 
+ 18-sep-97.
diff --git a/hacks/hopalong.c b/hacks/hopalong.c
new file mode 100644 (file)
index 0000000..7b252e8
--- /dev/null
@@ -0,0 +1,552 @@
+/* -*- Mode: C; tab-width: 4 -*-
+ * hop --- real plane fractals.
+ */
+#if !defined( lint ) && !defined( SABER )
+static const char sccsid[] = "@(#)hop.c        4.02 97/04/01 xlockmore";
+#endif
+
+/* Copyright (c) 1988-91 by Patrick J. Naughton.
+ *
+ * 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.
+ *
+ * This file is provided AS IS with no warranties of any kind.  The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof.  In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * Revision History:
+ * Changes of David Bagley <bagleyd@bigfoot.com>
+ * 24-Jun-97: EJK and RR functions stolen from xmartin2.2
+ *            Ed Kubaitis <ejk@ux2.cso.uiuc.edu> ejk functions and xmartin 
+ *            Renaldo Recuerdo rr function, generalized exponent version
+ *              of the Barry Martin's square root function
+ * 10-May-97: jwz@jwz.org: ported from xlockmore 4.03a10 to be a 
+ *                       standalone program and thus usable with xscreensaver
+ *                       (I threw away my 1992 port and started over.)
+ * 27-Jul-95: added Peter de Jong's hop from Scientific American
+ *            July 87 p. 111.  Sometimes they are amazing but there are a
+ *            few duds (I did not see a pattern in the parameters).
+ * 29-Mar-95: changed name from hopalong to hop
+ * 09-Dec-94: added Barry Martin's sine hop
+ *
+ * (12-Aug-92: jwz@lucid.com: made xlock version run standalone.)
+ *
+ * Changes of Patrick J. Naughton
+ * 29-Oct-90: fix bad (int) cast.
+ * 29-Jul-90: support for multiple screens.
+ * 08-Jul-90: new timing and colors and new algorithm for fractals.
+ * 15-Dec-89: Fix for proper skipping of {White,Black}Pixel() in colors.
+ * 08-Oct-89: Fixed long standing typo bug in RandomInitHop();
+ *           Fixed bug in memory allocation in init_hop();
+ *           Moved seconds() to an extern.
+ *           Got rid of the % mod since .mod is slow on a sparc.
+ * 20-Sep-89: Lint.
+ * 31-Aug-88: Forked from xlock.c for modularity.
+ * 23-Mar-88: Coded HOPALONG routines from Scientific American Sept. 86 p. 14.
+ *            Hopalong was attributed to Barry Martin of Aston University
+ *            (Birmingham, England)
+ */
+
+#ifdef STANDALONE
+# define PROGCLASS                                     "Hopalong"
+# define HACK_INIT                                     init_hop
+# define HACK_DRAW                                     draw_hop
+# define HACK_FREE                                     release_hop
+# define hop_opts                                      xlockmore_opts
+# define DEFAULTS      "*delay:                10000   \n"                     \
+                                       "*count:                1000    \n"                     \
+                                       "*cycles:               2500    \n"                     \
+                                       "*ncolors:              200     \n"
+# define SMOOTH_COLORS
+# include "xlockmore.h"                                /* from the xscreensaver distribution */
+# include "erase.h"
+#else  /* !STANDALONE */
+# include "xlock.h"                                    /* from the xlockmore distribution */
+#endif /* !STANDALONE */
+
+#define DEF_MARTIN "False"
+#define DEF_POPCORN "False"
+#define DEF_EJK1 "False"
+#define DEF_EJK2 "False"
+#define DEF_EJK3 "False"
+#define DEF_EJK4 "False"
+#define DEF_EJK5 "False"
+#define DEF_EJK6 "False"
+#define DEF_RR "False"
+#define DEF_JONG "False"
+#define DEF_SINE "False"
+
+static Bool martin;
+static Bool popcorn;
+static Bool ejk1;
+static Bool ejk2;
+static Bool ejk3;
+static Bool ejk4;
+static Bool ejk5;
+static Bool ejk6;
+static Bool rr;
+static Bool jong;
+static Bool sine;
+
+static XrmOptionDescRec opts[] =
+{
+       {"-martin", ".hop.martin", XrmoptionNoArg, (caddr_t) "on"},
+       {"+martin", ".hop.martin", XrmoptionNoArg, (caddr_t) "off"},
+       {"-popcorn", ".hop.popcorn", XrmoptionNoArg, (caddr_t) "on"},
+       {"+popcorn", ".hop.popcorn", XrmoptionNoArg, (caddr_t) "off"},
+       {"-ejk1", ".hop.ejk1", XrmoptionNoArg, (caddr_t) "on"},
+       {"+ejk1", ".hop.ejk1", XrmoptionNoArg, (caddr_t) "off"},
+       {"-ejk2", ".hop.ejk2", XrmoptionNoArg, (caddr_t) "on"},
+       {"+ejk2", ".hop.ejk2", XrmoptionNoArg, (caddr_t) "off"},
+       {"-ejk3", ".hop.ejk3", XrmoptionNoArg, (caddr_t) "on"},
+       {"+ejk3", ".hop.ejk3", XrmoptionNoArg, (caddr_t) "off"},
+       {"-ejk4", ".hop.ejk4", XrmoptionNoArg, (caddr_t) "on"},
+       {"+ejk4", ".hop.ejk4", XrmoptionNoArg, (caddr_t) "off"},
+       {"-ejk5", ".hop.ejk5", XrmoptionNoArg, (caddr_t) "on"},
+       {"+ejk5", ".hop.ejk5", XrmoptionNoArg, (caddr_t) "off"},
+       {"-ejk6", ".hop.ejk6", XrmoptionNoArg, (caddr_t) "on"},
+       {"+ejk6", ".hop.ejk6", XrmoptionNoArg, (caddr_t) "off"},
+       {"-rr", ".hop.rr", XrmoptionNoArg, (caddr_t) "on"},
+       {"+rr", ".hop.rr", XrmoptionNoArg, (caddr_t) "off"},
+       {"-jong", ".hop.jong", XrmoptionNoArg, (caddr_t) "on"},
+       {"+jong", ".hop.jong", XrmoptionNoArg, (caddr_t) "off"},
+       {"-sine", ".hop.sine", XrmoptionNoArg, (caddr_t) "on"},
+       {"+sine", ".hop.sine", XrmoptionNoArg, (caddr_t) "off"}
+};
+static argtype vars[] =
+{
+       {(caddr_t *) & martin, "martin", "Martin", DEF_MARTIN, t_Bool},
+       {(caddr_t *) & popcorn, "popcorn", "Popcorn", DEF_POPCORN, t_Bool},
+       {(caddr_t *) & ejk1, "ejk1", "EJK1", DEF_EJK1, t_Bool},
+       {(caddr_t *) & ejk2, "ejk2", "EJK2", DEF_EJK2, t_Bool},
+       {(caddr_t *) & ejk3, "ejk3", "EJK3", DEF_EJK3, t_Bool},
+       {(caddr_t *) & ejk4, "ejk4", "EJK4", DEF_EJK4, t_Bool},
+       {(caddr_t *) & ejk5, "ejk5", "EJK5", DEF_EJK5, t_Bool},
+       {(caddr_t *) & ejk6, "ejk6", "EJK6", DEF_EJK6, t_Bool},
+       {(caddr_t *) & rr, "rr", "RR", DEF_RR, t_Bool},
+       {(caddr_t *) & jong, "jong", "Jong", DEF_JONG, t_Bool},
+       {(caddr_t *) & sine, "sine", "Sine", DEF_SINE, t_Bool}
+};
+static OptionStruct desc[] =
+{
+       {"-/+martin", "turn on/off sqrt format"},
+       {"-/+popcorn", "turn on/off Clifford A. Pickover's popcorn format"},
+       {"-/+ejk1", "turn on/off ejk1 format"},
+       {"-/+ejk2", "turn on/off ejk2 format"},
+       {"-/+ejk3", "turn on/off ejk3 format"},
+       {"-/+ejk4", "turn on/off ejk4 format"},
+       {"-/+ejk5", "turn on/off ejk5 format"},
+       {"-/+ejk6", "turn on/off ejk6 format"},
+       {"-/+rr", "turn on/off rr format"},
+       {"-/+jong", "turn on/off jong format"},
+       {"-/+sine", "turn on/off sine format"}
+};
+
+ModeSpecOpt hop_opts =
+{sizeof opts / sizeof opts[0], opts, sizeof vars / sizeof vars[0], vars, desc};
+
+#ifdef USE_MODULES
+ModStruct   hop_description =
+{"hop", "init_hop", "draw_hop", "release_hop",
+ "refresh_hop", "init_hop", NULL, &hop_opts,
+ 10000, 1000, 2500, 1, 64, 1.0, "",
+ "Shows real plane iterated fractals", 0, NULL};
+
+#endif
+
+#define MARTIN 0
+#define POPCORN 7
+#define SINE 8
+#define EJK1 1
+#define EJK2 2
+#define EJK3 9
+#define EJK4 3
+#define EJK5 4
+#define EJK6 10
+#define RR 5
+#define JONG 6
+#ifdef OFFENDING
+#define OPS 8                  /* 8, 9, 10 might be too close to a swastika for some... */
+#else
+#define OPS 11
+#endif
+
+typedef struct {
+       int         centerx, centery;   /* center of the screen */
+       double      a, b, c, d;
+       double      i, j;       /* hopalong parameters */
+       int         inc;
+       int         pix;
+       int         op;
+       int         count;
+       int         bufsize;
+       XPoint     *pointBuffer;        /* pointer for XDrawPoints */
+} hopstruct;
+
+static hopstruct *hops = NULL;
+
+void
+init_hop(ModeInfo * mi)
+{
+       Display    *display = MI_DISPLAY(mi);
+       GC          gc = MI_GC(mi);
+       hopstruct  *hp;
+       double      range;
+
+       if (hops == NULL) {
+               if ((hops = (hopstruct *) calloc(MI_NUM_SCREENS(mi),
+                                                sizeof (hopstruct))) == NULL)
+                       return;
+       }
+       hp = &hops[MI_SCREEN(mi)];
+
+       hp->centerx = MI_WIDTH(mi) / 2;
+       hp->centery = MI_HEIGHT(mi) / 2;
+       /* Make the other operations less common since they are less interesting */
+       if (MI_IS_FULLRANDOM(mi)) {
+               hp->op = NRAND(OPS);
+       } else {
+               if (martin)
+                       hp->op = MARTIN;
+               else if (popcorn)
+                       hp->op = POPCORN;
+               else if (ejk1)
+                       hp->op = EJK1;
+               else if (ejk2)
+                       hp->op = EJK2;
+               else if (ejk3)
+                       hp->op = EJK3;
+               else if (ejk4)
+                       hp->op = EJK4;
+               else if (ejk5)
+                       hp->op = EJK5;
+               else if (ejk6)
+                       hp->op = EJK6;
+               else if (rr)
+                       hp->op = RR;
+               else if (jong)
+                       hp->op = JONG;
+               else if (sine)
+                       hp->op = SINE;
+               else
+                       hp->op = NRAND(OPS);
+       }
+
+       range = sqrt((double) hp->centerx * hp->centerx +
+            (double) hp->centery * hp->centery) / (1.0 + LRAND() / MAXRAND);
+       hp->i = hp->j = 0.0;
+       hp->inc = (int) ((LRAND() / MAXRAND) * 200) - 100;
+#undef XMARTIN
+       switch (hp->op) {
+               case MARTIN:
+#ifdef XMARTIN
+                       hp->a = (LRAND() / MAXRAND) * 1500.0 + 40.0;
+                       hp->b = (LRAND() / MAXRAND) * 17.0 + 3.0;
+                       hp->c = (LRAND() / MAXRAND) * 3000.0 + 100.0;
+#else
+                       hp->a = ((LRAND() / MAXRAND) * 2.0 - 1.0) * range / 20.0;
+                       hp->b = ((LRAND() / MAXRAND) * 2.0 - 1.0) * range / 20.0;
+                       if (LRAND() & 1)
+                               hp->c = ((LRAND() / MAXRAND) * 2.0 - 1.0) * range / 20.0;
+                       else
+                               hp->c = 0.0;
+#endif
+                       if (MI_IS_VERBOSE(mi))
+                               (void) fprintf(stdout, "sqrt a=%g, b=%g, c=%g\n", hp->a, hp->b, hp->c);
+                       break;
+               case EJK1:
+#ifdef XMARTIN
+                       hp->a = (LRAND() / MAXRAND) * 500.0;
+                       hp->c = (LRAND() / MAXRAND) * 100.0 + 10.0;
+#else
+                       hp->a = ((LRAND() / MAXRAND) * 2.0 - 1.0) * range / 30.0;
+                       hp->c = ((LRAND() / MAXRAND) * 2.0 - 1.0) * range / 40.0;
+#endif
+                       hp->b = (LRAND() / MAXRAND) * 0.4;
+                       if (MI_IS_VERBOSE(mi))
+                               (void) fprintf(stdout, "ejk1 a=%g, b=%g, c=%g\n", hp->a, hp->b, hp->c);
+                       break;
+               case EJK2:
+#ifdef XMARTIN
+                       hp->a = (LRAND() / MAXRAND) * 500.0;
+#else
+                       hp->a = ((LRAND() / MAXRAND) * 2.0 - 1.0) * range / 30.0;
+#endif
+                       hp->b = pow(10.0, 6.0 + (LRAND() / MAXRAND) * 24.0);
+                       if (LRAND() & 1)
+                               hp->b = -hp->b;
+                       hp->c = pow(10.0, (LRAND() / MAXRAND) * 9.0);
+                       if (LRAND() & 1)
+                               hp->c = -hp->c;
+                       if (MI_IS_VERBOSE(mi))
+                               (void) fprintf(stdout, "ejk2 a=%g, b=%g, c=%g\n", hp->a, hp->b, hp->c);
+                       break;
+               case EJK3:
+#ifdef XMARTIN
+                       hp->a = (LRAND() / MAXRAND) * 500.0;
+                       hp->c = (LRAND() / MAXRAND) * 80.0 + 30.0;
+#else
+                       hp->a = ((LRAND() / MAXRAND) * 2.0 - 1.0) * range / 30.0;
+                       hp->c = ((LRAND() / MAXRAND) * 2.0 - 1.0) * range / 70.0;
+#endif
+                       hp->b = (LRAND() / MAXRAND) * 0.35 + 0.5;
+                       if (MI_IS_VERBOSE(mi))
+                               (void) fprintf(stdout, "ejk3 a=%g, b=%g, c=%g\n", hp->a, hp->b, hp->c);
+                       break;
+               case EJK4:
+#ifdef XMARTIN
+                       hp->a = (LRAND() / MAXRAND) * 1000.0;
+                       hp->c = (LRAND() / MAXRAND) * 40.0 + 30.0;
+#else
+                       hp->a = ((LRAND() / MAXRAND) * 2.0 - 1.0) * range / 2.0;
+                       hp->c = ((LRAND() / MAXRAND) * 2.0 - 1.0) * range / 200.0;
+#endif
+                       hp->b = (LRAND() / MAXRAND) * 9.0 + 1.0;
+                       if (MI_IS_VERBOSE(mi))
+                               (void) fprintf(stdout, "ejk4 a=%g, b=%g, c=%g\n", hp->a, hp->b, hp->c);
+                       break;
+               case EJK5:
+#ifdef XMARTIN
+                       hp->a = (LRAND() / MAXRAND) * 600.0;
+                       hp->c = (LRAND() / MAXRAND) * 90.0 + 20.0;
+#else
+                       hp->a = ((LRAND() / MAXRAND) * 2.0 - 1.0) * range / 2.0;
+                       hp->c = ((LRAND() / MAXRAND) * 2.0 - 1.0) * range / 200.0;
+#endif
+                       hp->b = (LRAND() / MAXRAND) * 0.3 + 0.1;
+                       if (MI_IS_VERBOSE(mi))
+                               (void) fprintf(stdout, "ejk5 a=%g, b=%g, c=%g\n", hp->a, hp->b, hp->c);
+                       break;
+               case EJK6:
+#ifdef XMARTIN
+                       hp->a = (LRAND() / MAXRAND) * 100.0 + 550.0;
+#else
+                       hp->a = ((LRAND() / MAXRAND) * 2.0 - 1.0) * range / 30.0;
+#endif
+                       hp->b = (LRAND() / MAXRAND) + 0.5;
+                       if (MI_IS_VERBOSE(mi))
+                               (void) fprintf(stdout, "ejk6 a=%g, b=%g\n", hp->a, hp->b);
+                       break;
+               case RR:
+#ifdef XMARTIN
+                       hp->a = (LRAND() / MAXRAND) * 100.0;
+                       hp->b = (LRAND() / MAXRAND) * 20.0;
+                       hp->c = (LRAND() / MAXRAND) * 200.0;
+#else
+                       hp->a = ((LRAND() / MAXRAND) * 2.0 - 1.0) * range / 40.0;
+                       hp->b = ((LRAND() / MAXRAND) * 2.0 - 1.0) * range / 200.0;
+                       hp->c = ((LRAND() / MAXRAND) * 2.0 - 1.0) * range / 20.0;
+#endif
+                       hp->d = (LRAND() / MAXRAND) * 0.9;
+                       if (MI_IS_VERBOSE(mi))
+                               (void) fprintf(stdout, "rr a=%g, b=%g, c=%g, d=%g\n",
+                                              hp->a, hp->b, hp->c, hp->d);
+                       break;
+               case POPCORN:
+                       hp->a = 0.0;
+                       hp->b = 0.0;
+                       hp->c = ((LRAND() / MAXRAND) * 2.0 - 1.0) * 0.24 + 0.25;
+                       hp->inc = 100;
+                       if (MI_IS_VERBOSE(mi))
+                               (void) fprintf(stdout, "popcorn a=%g, b=%g, c=%g, d=%g\n",
+                                              hp->a, hp->b, hp->c, hp->d);
+                       break;
+               case JONG:
+                       hp->a = ((LRAND() / MAXRAND) * 2.0 - 1.0) * M_PI;
+                       hp->b = ((LRAND() / MAXRAND) * 2.0 - 1.0) * M_PI;
+                       hp->c = ((LRAND() / MAXRAND) * 2.0 - 1.0) * M_PI;
+                       hp->d = ((LRAND() / MAXRAND) * 2.0 - 1.0) * M_PI;
+                       if (MI_IS_VERBOSE(mi))
+                               (void) fprintf(stdout, "jong a=%g, b=%g, c=%g, d=%g\n",
+                                              hp->a, hp->b, hp->c, hp->d);
+                       break;
+               case SINE:      /* MARTIN2 */
+#ifdef XMARTIN
+                       hp->a = M_PI + ((LRAND() / MAXRAND) * 2.0 - 1.0) * 0.07;
+#else
+                       hp->a = M_PI + ((LRAND() / MAXRAND) * 2.0 - 1.0) * 0.7;
+#endif
+                       if (MI_IS_VERBOSE(mi))
+                               (void) fprintf(stdout, "sine a=%g\n", hp->a);
+                       break;
+       }
+       if (MI_NPIXELS(mi) > 2)
+               hp->pix = NRAND(MI_NPIXELS(mi));
+       hp->bufsize = MI_COUNT(mi);
+
+       if (!hp->pointBuffer)
+               hp->pointBuffer = (XPoint *) malloc(hp->bufsize * sizeof (XPoint));
+
+       MI_CLEARWINDOW(mi);
+
+       XSetForeground(display, gc, MI_WHITE_PIXEL(mi));
+       hp->count = 0;
+}
+
+
+void
+draw_hop(ModeInfo * mi)
+{
+       hopstruct  *hp = &hops[MI_SCREEN(mi)];
+       double      oldj, oldi;
+       XPoint     *xp = hp->pointBuffer;
+       int         k = hp->bufsize;
+
+       MI_IS_DRAWN(mi) = True;
+
+       hp->inc++;
+       if (MI_NPIXELS(mi) > 2) {
+               XSetForeground(MI_DISPLAY(mi), MI_GC(mi), MI_PIXEL(mi, hp->pix));
+               if (++hp->pix >= MI_NPIXELS(mi))
+                       hp->pix = 0;
+       }
+       while (k--) {
+               oldj = hp->j;
+               switch (hp->op) {
+                       case MARTIN:    /* SQRT, MARTIN1 */
+                               oldi = hp->i + hp->inc;
+                               hp->j = hp->a - hp->i;
+                               hp->i = oldj + ((hp->i < 0)
+                                          ? sqrt(fabs(hp->b * oldi - hp->c))
+                                       : -sqrt(fabs(hp->b * oldi - hp->c)));
+                               xp->x = hp->centerx + (int) (hp->i + hp->j);
+                               xp->y = hp->centery - (int) (hp->i - hp->j);
+                               break;
+                       case EJK1:
+                               oldi = hp->i + hp->inc;
+                               hp->j = hp->a - hp->i;
+                               hp->i = oldj - ((hp->i > 0) ? (hp->b * oldi - hp->c) :
+                                               -(hp->b * oldi - hp->c));
+                               xp->x = hp->centerx + (int) (hp->i + hp->j);
+                               xp->y = hp->centery - (int) (hp->i - hp->j);
+                               break;
+                       case EJK2:
+                               oldi = hp->i + hp->inc;
+                               hp->j = hp->a - hp->i;
+                               hp->i = oldj - ((hp->i < 0) ? log(fabs(hp->b * oldi - hp->c)) :
+                                          -log(fabs(hp->b * oldi - hp->c)));
+                               xp->x = hp->centerx + (int) (hp->i + hp->j);
+                               xp->y = hp->centery - (int) (hp->i - hp->j);
+                               break;
+                       case EJK3:
+                               oldi = hp->i + hp->inc;
+                               hp->j = hp->a - hp->i;
+                               hp->i = oldj - ((hp->i > 0) ? sin(hp->b * oldi) - hp->c :
+                                               -sin(hp->b * oldi) - hp->c);
+                               xp->x = hp->centerx + (int) (hp->i + hp->j);
+                               xp->y = hp->centery - (int) (hp->i - hp->j);
+                               break;
+                       case EJK4:
+                               oldi = hp->i + hp->inc;
+                               hp->j = hp->a - hp->i;
+                               hp->i = oldj - ((hp->i > 0) ? sin(hp->b * oldi) - hp->c :
+                                         -sqrt(fabs(hp->b * oldi - hp->c)));
+                               xp->x = hp->centerx + (int) (hp->i + hp->j);
+                               xp->y = hp->centery - (int) (hp->i - hp->j);
+                               break;
+                       case EJK5:
+                               oldi = hp->i + hp->inc;
+                               hp->j = hp->a - hp->i;
+                               hp->i = oldj - ((hp->i > 0) ? sin(hp->b * oldi) - hp->c :
+                                               -(hp->b * oldi - hp->c));
+                               xp->x = hp->centerx + (int) (hp->i + hp->j);
+                               xp->y = hp->centery - (int) (hp->i - hp->j);
+                               break;
+                       case EJK6:
+                               oldi = hp->i + hp->inc;
+                               hp->j = hp->a - hp->i;
+                               hp->i = oldj - asin((hp->b * oldi) - (long) (hp->b * oldi));
+                               xp->x = hp->centerx + (int) (hp->i + hp->j);
+                               xp->y = hp->centery - (int) (hp->i - hp->j);
+                               break;
+                       case RR:        /* RR1 */
+                               oldi = hp->i + hp->inc;
+                               hp->j = hp->a - hp->i;
+                               hp->i = oldj - ((hp->i < 0) ? -pow(fabs(hp->b * oldi - hp->c), hp->d) :
+                                    pow(fabs(hp->b * oldi - hp->c), hp->d));
+                               xp->x = hp->centerx + (int) (hp->i + hp->j);
+                               xp->y = hp->centery - (int) (hp->i - hp->j);
+                               break;
+                       case POPCORN:
+#define HVAL 0.05
+#define INCVAL 50
+                               {
+                                       double      tempi, tempj;
+
+                                       if (hp->inc >= 100)
+                                               hp->inc = 0;
+                                       if (hp->inc == 0) {
+                                               if (hp->a++ >= INCVAL) {
+                                                       hp->a = 0;
+                                                       if (hp->b++ >= INCVAL)
+                                                               hp->b = 0;
+                                               }
+                                               hp->i = (-hp->c * INCVAL / 2 + hp->c * hp->a) * M_PI / 180.0;
+                                               hp->j = (-hp->c * INCVAL / 2 + hp->c * hp->b) * M_PI / 180.0;
+                                       }
+                                       tempi = hp->i - HVAL * sin(hp->j + tan(3.0 * hp->j));
+                                       tempj = hp->j - HVAL * sin(hp->i + tan(3.0 * hp->i));
+                                       xp->x = hp->centerx + (int) (MI_WIDTH(mi) / 40 * tempi);
+                                       xp->y = hp->centery + (int) (MI_HEIGHT(mi) / 40 * tempj);
+                                       hp->i = tempi;
+                                       hp->j = tempj;
+                               }
+                               break;
+                       case JONG:
+                               if (hp->centerx > 0)
+                                       oldi = hp->i + 4 * hp->inc / hp->centerx;
+                               else
+                                       oldi = hp->i;
+                               hp->j = sin(hp->c * hp->i) - cos(hp->d * hp->j);
+                               hp->i = sin(hp->a * oldj) - cos(hp->b * oldi);
+                               xp->x = hp->centerx + (int) (hp->centerx * (hp->i + hp->j) / 4.0);
+                               xp->y = hp->centery - (int) (hp->centery * (hp->i - hp->j) / 4.0);
+                               break;
+                       case SINE:      /* MARTIN2 */
+                               oldi = hp->i + hp->inc;
+                               hp->j = hp->a - hp->i;
+                               hp->i = oldj - sin(oldi);
+                               xp->x = hp->centerx + (int) (hp->i + hp->j);
+                               xp->y = hp->centery - (int) (hp->i - hp->j);
+                               break;
+               }
+               xp++;
+       }
+       XDrawPoints(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi),
+                   hp->pointBuffer, hp->bufsize, CoordModeOrigin);
+       if (++hp->count > MI_CYCLES(mi)) {
+#ifdef STANDALONE
+           erase_full_window(MI_DISPLAY(mi), MI_WINDOW(mi));
+#endif /* STANDALONE */
+               init_hop(mi);
+       }
+}
+
+void
+release_hop(ModeInfo * mi)
+{
+       if (hops != NULL) {
+               int         screen;
+
+               for (screen = 0; screen < MI_NUM_SCREENS(mi); screen++) {
+                       hopstruct  *hp = &hops[screen];
+
+                       if (hp->pointBuffer)
+                               (void) free((void *) hp->pointBuffer);
+               }
+
+               (void) free((void *) hops);
+               hops = NULL;
+       }
+}
+
+void
+refresh_hop(ModeInfo * mi)
+{
+       MI_CLEARWINDOW(mi);
+}
diff --git a/hacks/hopalong.man b/hacks/hopalong.man
new file mode 100644 (file)
index 0000000..d36a360
--- /dev/null
@@ -0,0 +1,78 @@
+.TH XScreenSaver 1 "10-May-97" "X Version 11"
+.SH NAME
+hopalong - draw real plane fractals
+.SH SYNOPSIS
+.B hopalong
+[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-ncolors \fIinteger\fP] [\-delay \fImicroseconds\fP] [\-cycles \fIinteger\fP] [\-count \fIinteger\fP] [\-jong] [\-no\-jong] [\-jong] [\-no\-sine]
+
+.SH DESCRIPTION
+The \fIhopalong\fP program generates real plane fractals as described in
+the September 1986 issue of Scientific American.
+.SH OPTIONS
+.I hopalong
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window.  This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-mono 
+If on a color display, pretend we're on a monochrome display.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use.  Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-ncolors \fIinteger\fP
+How many colors should be used (if possible).  Default 200.
+The colors used cycle through the hue, making N stops around
+the color wheel.
+.TP 8
+.B \-cycles \fIinteger\fP
+How long to run each batch.  Default 2500 pixels.
+.TP 8
+.B \-count \fIinteger\fP
+How many pixels should be drawn before a color change.  Default 1000.
+.TP 8
+.B \-jong \fIinteger\fP
+.TP 8
+.B \-no\-jong \fIinteger\fP
+Whether to use the Jong format (default is to choose randomly.)
+
+.TP 8
+.B \-sine \fIinteger\fP
+.TP 8
+.B \-no\-sine \fIinteger\fP
+Whether to use the Sine format (default is to choose randomly.)
+
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1),
+.BR xlock (1)
+.SH COPYRIGHT
+Copyright \(co 1988-91 by Patrick J. Naughton.
+
+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. 
+.SH AUTHOR
+Patrick J. Naughton <naughton@eng.sun.com>, 23-mar-88.
+
+Ability to run standalone or with \fIxscreensaver\fP added by 
+Jamie Zawinski <jwz@jwz.org>, 13-aug-92, and again on 10-May-97.
diff --git a/hacks/hypercube.c b/hacks/hypercube.c
new file mode 100644 (file)
index 0000000..5150ec3
--- /dev/null
@@ -0,0 +1,329 @@
+/* xscreensaver, Copyright (c) 1992, 1995, 1996, 1998
+ *  Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software 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.  No representations are made about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or 
+ * implied warranty.
+ *
+ * This code derived from TI Explorer Lisp code by Joe Keane, Fritz Mueller,
+ * and Jamie Zawinski.
+ */
+
+#include <math.h>
+#include "screenhack.h"
+
+static Display *dpy;
+static Window window;
+static GC color0, color1, color2, color3, color4, color5, color6, color7;
+static GC black;
+
+static int delay;
+
+static int observer_z;
+static int x_offset, y_offset;
+static int unit_pixels;
+
+struct point_state {
+  int old_x, old_y;
+  int new_x, new_y;
+  Bool same_p;
+};
+
+static void
+move_line (struct point_state *state0, struct point_state *state1, GC gc)
+{
+  if (state0->same_p && state1->same_p)
+    return;
+  if (mono_p)
+    {
+      XDrawLine (dpy, window, black,
+                state0->old_x, state0->old_y, state1->old_x, state1->old_y);
+      XDrawLine (dpy, window, gc,
+                state0->new_x, state0->new_y, state1->new_x, state1->new_y);
+    }
+  else
+    {
+      XSegment segments [2];
+      segments [0].x1 = state0->old_x; segments [0].y1 = state0->old_y;
+      segments [0].x2 = state1->old_x; segments [0].y2 = state1->old_y;
+      segments [1].x1 = state0->new_x; segments [1].y1 = state0->new_y;
+      segments [1].x2 = state1->new_x; segments [1].y2 = state1->new_y;
+      XDrawSegments (dpy, window, gc, segments, 2);
+    }
+}
+
+static void
+hyper (double xy, double xz, double yz, double xw, double yw, double zw)
+{
+  double cos_xy = cos (xy), sin_xy = sin (xy);
+  double cos_xz = cos (xz), sin_xz = sin (xz);
+  double cos_yz = cos (yz), sin_yz = sin (yz);
+  double cos_xw = cos (xw), sin_xw = sin (xw);
+  double cos_yw = cos (yw), sin_yw = sin (yw);
+  double cos_zw = cos (zw), sin_zw = sin (zw);
+
+  double ax = 1.0, ay = 0.0, az = 0.0, aw = 0.0;
+  double bx = 0.0, by = 1.0, bz = 0.0, bw = 0.0;
+  double cx = 0.0, cy = 0.0, cz = 1.0, cw = 0.0;
+  double dx = 0.0, dy = 0.0, dz = 0.0, dw = 1.0;
+
+  double _tmp0_, _tmp1_;
+
+  struct point_state points [16];
+  memset (points, 0, sizeof (points));
+
+#define mmmm (&points[0])
+#define mmmp (&points[1])
+#define mmpm (&points[2])
+#define mmpp (&points[3])
+#define mpmm (&points[4])
+#define mpmp (&points[5])
+#define mppm (&points[6])
+#define mppp (&points[7])
+#define pmmm (&points[8])
+#define pmmp (&points[9])
+#define pmpm (&points[10])
+#define pmpp (&points[11])
+#define ppmm (&points[12])
+#define ppmp (&points[13])
+#define pppm (&points[14])
+#define pppp (&points[15])
+
+  while (1)
+    {
+      double temp_mult;
+
+#define compute(a,b,c,d,point_state) \
+      temp_mult = (unit_pixels / (((a*az) + (b*bz) + (c*cz) + (d*dz) +   \
+                                  (a*aw) + (b*bw) + (c*cw) + (d*dw))     \
+                                 - observer_z));                         \
+  point_state->old_x = point_state->new_x;                               \
+  point_state->old_y = point_state->new_y;                               \
+  point_state->new_x = ((((a*ax) + (b*bx) + (c*cx) + (d*dx)) * temp_mult) \
+                       + x_offset);                                      \
+  point_state->new_y = ((((a*ay) + (b*by) + (c*cy) + (d*dy)) * temp_mult) \
+                       + y_offset);                                      \
+  point_state->same_p = (point_state->old_x == point_state->new_x &&     \
+                        point_state->old_y == point_state->new_y);
+
+      compute (-1, -1, -1, -1, mmmm);
+      compute (-1, -1, -1,  1, mmmp);
+      compute (-1, -1,  1, -1, mmpm);
+      compute (-1, -1,  1,  1, mmpp);
+      compute (-1,  1, -1, -1, mpmm);
+      compute (-1,  1, -1,  1, mpmp);
+      compute (-1,  1,  1, -1, mppm);
+      compute (-1,  1,  1,  1, mppp);
+      compute ( 1, -1, -1, -1, pmmm);
+      compute ( 1, -1, -1,  1, pmmp);
+      compute ( 1, -1,  1, -1, pmpm);
+      compute ( 1, -1,  1,  1, pmpp);
+      compute ( 1,  1, -1, -1, ppmm);
+      compute ( 1,  1, -1,  1, ppmp);
+      compute ( 1,  1,  1, -1, pppm);
+      compute ( 1,  1,  1,  1, pppp);
+
+      move_line (mmmm, mmmp, color0);
+      move_line (mmmm, mmpm, color0);
+      move_line (mmpm, mmpp, color0);
+      move_line (mmmp, mmpp, color0);
+      
+      move_line (pmmm, pmmp, color1);
+      move_line (pmmm, pmpm, color1);
+      move_line (pmpm, pmpp, color1);
+      move_line (pmmp, pmpp, color1);
+      
+      move_line (mpmm, mpmp, color2);
+      move_line (mpmm, mppm, color2);
+      move_line (mppm, mppp, color2);
+      move_line (mpmp, mppp, color2);
+      
+      move_line (mmpp, mppp, color3);
+      move_line (mmpp, pmpp, color3);
+      move_line (pmpp, pppp, color3);
+      move_line (mppp, pppp, color3);
+      
+      move_line (mmmm, mpmm, color4);
+      move_line (mmmm, pmmm, color4);
+      move_line (mpmm, ppmm, color4);
+      move_line (pmmm, ppmm, color4);
+      
+      move_line (mmmp, mpmp, color5);
+      move_line (mmmp, pmmp, color5);
+      move_line (pmmp, ppmp, color5);
+      move_line (mpmp, ppmp, color5);
+      
+      move_line (mmpm, mppm, color6);
+      move_line (mmpm, pmpm, color6);
+      move_line (pmpm, pppm, color6);
+      move_line (mppm, pppm, color6);
+      
+      move_line (ppmm, ppmp, color7);
+      move_line (ppmm, pppm, color7);
+      move_line (pppm, pppp, color7);
+      move_line (ppmp, pppp, color7);
+
+ /* If you get error messages about the following forms, and you think you're
+    using an ANSI C conforming compiler, then you're mistaken.  Possibly you're
+    mixing an ANSI compiler with a non-ANSI preprocessor, or vice versa.
+    Regardless, your system is broken; it's not a bug in this program.
+  */
+#if defined(__STDC__) || defined(__ANSI_CPP__)
+# define rotate(name,dim0,dim1,cos,sin) \
+      _tmp0_ = ((name##dim0 * cos) + (name##dim1 * sin)); \
+      _tmp1_ = ((name##dim1 * cos) - (name##dim0 * sin)); \
+      name##dim0 = _tmp0_; \
+      name##dim1 = _tmp1_;
+
+# define rotates(dim0,dim1) \
+      if (sin_##dim0##dim1 != 0) {                                \
+        rotate(a, dim0, dim1, cos_##dim0##dim1, sin_##dim0##dim1); \
+        rotate(b, dim0, dim1, cos_##dim0##dim1, sin_##dim0##dim1); \
+        rotate(c, dim0, dim1, cos_##dim0##dim1, sin_##dim0##dim1); \
+        rotate(d, dim0, dim1, cos_##dim0##dim1, sin_##dim0##dim1); \
+      }
+
+#else /* !__STDC__, courtesy of Andreas Luik <luik@isa.de> */
+# define rotate(name,dim0,dim1,cos,sin) \
+      _tmp0_ = ((name/**/dim0 * cos) + (name/**/dim1 * sin)); \
+      _tmp1_ = ((name/**/dim1 * cos) - (name/**/dim0 * sin)); \
+      name/**/dim0 = _tmp0_; \
+      name/**/dim1 = _tmp1_;
+
+# define rotates(dim0,dim1) \
+      if (sin_/**/dim0/**/dim1 != 0) {                                \
+        rotate(a,dim0,dim1,cos_/**/dim0/**/dim1,sin_/**/dim0/**/dim1); \
+        rotate(b,dim0,dim1,cos_/**/dim0/**/dim1,sin_/**/dim0/**/dim1); \
+        rotate(c,dim0,dim1,cos_/**/dim0/**/dim1,sin_/**/dim0/**/dim1); \
+        rotate(d,dim0,dim1,cos_/**/dim0/**/dim1,sin_/**/dim0/**/dim1); \
+      }
+#endif /* !__STDC__ */
+
+      rotates (x,y);
+      rotates (x,z);
+      rotates (y,z);
+      rotates (x,w);
+      rotates (y,w);
+      rotates (z,w);
+
+      XSync (dpy, False);
+      screenhack_handle_events (dpy);
+      if (delay) usleep (delay);
+    }
+}
+
+\f
+char *progclass = "Hypercube";
+
+char *defaults [] = {
+  ".background:        black",
+  ".foreground:        white",
+  "*color0:    red",
+  "*color1:    orange",
+  "*color2:    yellow",
+  "*color3:    white",
+  "*color4:    green",
+  "*color5:    cyan",
+  "*color6:    dodgerblue",
+  "*color7:    magenta",
+
+  "*xw:                0.000",
+  "*xy:                0.010",
+  "*xz:                0.005",
+  "*yw:                0.010",
+  "*yz:                0.000",
+  "*zw:                0.000",
+
+  "*observer-z:        5",
+  "*delay:     30000",
+  0
+};
+
+XrmOptionDescRec options [] = {
+  { "-color0",         ".color0",      XrmoptionSepArg, 0 },
+  { "-color1",         ".color1",      XrmoptionSepArg, 0 },
+  { "-color2",         ".color2",      XrmoptionSepArg, 0 },
+  { "-color3",         ".color3",      XrmoptionSepArg, 0 },
+  { "-color4",         ".color4",      XrmoptionSepArg, 0 },
+  { "-color5",         ".color5",      XrmoptionSepArg, 0 },
+  { "-color6",         ".color6",      XrmoptionSepArg, 0 },
+  { "-color7",         ".color7",      XrmoptionSepArg, 0 },
+
+  { "-xw",             ".xw",          XrmoptionSepArg, 0 },
+  { "-xy",             ".xy",          XrmoptionSepArg, 0 },
+  { "-xz",             ".xz",          XrmoptionSepArg, 0 },
+  { "-yw",             ".yw",          XrmoptionSepArg, 0 },
+  { "-yz",             ".yz",          XrmoptionSepArg, 0 },
+  { "-zw",             ".zw",          XrmoptionSepArg, 0 },
+
+  { "-observer-z",     ".observer-z",  XrmoptionSepArg, 0 },
+  { "-delay",          ".delay",       XrmoptionSepArg, 0 },
+  { 0, 0, 0, 0 }
+};
+
+void
+screenhack (Display *d, Window w)
+{
+  XGCValues gcv;
+  XWindowAttributes xgwa;
+  Colormap cmap;
+  double xy, xz, yz, xw, yw, zw;
+  unsigned long bg;
+
+  dpy = d;
+  window = w;
+  XGetWindowAttributes (dpy, window, &xgwa);
+  cmap = xgwa.colormap;
+
+  x_offset = xgwa.width / 2;
+  y_offset = xgwa.height / 2;
+  unit_pixels = xgwa.width < xgwa.height ? xgwa.width : xgwa.height;
+
+  xy = get_float_resource ("xy", "Float");
+  xz = get_float_resource ("xz", "Float");
+  yz = get_float_resource ("yz", "Float");
+  xw = get_float_resource ("xw", "Float");
+  yw = get_float_resource ("yw", "Float");
+  zw = get_float_resource ("zw", "Float");
+
+  observer_z = get_integer_resource ("observer-z", "Integer");
+
+  delay = get_integer_resource ("delay", "Integer");
+
+  bg = get_pixel_resource ("background", "Background", dpy, cmap);
+
+  if (mono_p)
+    {
+      gcv.function = GXcopy;
+      gcv.foreground = bg;
+      black = XCreateGC (dpy, window, GCForeground|GCFunction, &gcv);
+      gcv.foreground = get_pixel_resource ("foreground", "Foreground",
+                                          dpy, cmap);
+      color0 = color1 = color2 = color3 = color4 = color5 = color6 = color7 =
+       XCreateGC (dpy, window, GCForeground|GCFunction, &gcv);
+    }
+  else
+    {
+      black = 0;
+      gcv.function = GXxor;
+#define make_gc(color,name) \
+       gcv.foreground = bg ^ get_pixel_resource ((name), "Foreground", \
+                                                 dpy, cmap);           \
+       color = XCreateGC (dpy, window, GCForeground|GCFunction, &gcv)
+
+      make_gc (color0,"color0");
+      make_gc (color1,"color1");
+      make_gc (color2,"color2");
+      make_gc (color3,"color3");
+      make_gc (color4,"color4");
+      make_gc (color5,"color5");
+      make_gc (color6,"color6");
+      make_gc (color7,"color7");
+    }
+
+  hyper (xy, xz, yz, xw, yw, zw);
+}
diff --git a/hacks/hypercube.man b/hacks/hypercube.man
new file mode 100644 (file)
index 0000000..4c5f8f9
--- /dev/null
@@ -0,0 +1,93 @@
+.TH XScreenSaver 1 "6-dec-92" "X Version 11"
+.SH NAME
+hypercube - 2d projection of a 4d object
+.SH SYNOPSIS
+.B hypercube
+[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-color[0-7] \fIcolor\fP] [\-xy \fIfloat\fP] [\-xz \fIfloat\fP] [\-yz \fIfloat\fP] [\-xw \fIfloat\fP] [\-yw \fIfloat\fP] [\-zw \fIfloat\fP] [\-observer-z \fIint\fP] [\-delay \fIusecs\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP]
+.SH DESCRIPTION
+The \fIhypercube\fP program displays a wireframe projection of a hypercube
+which is rotating at user-specified rates around any or all of its four axes.
+.SH OPTIONS
+.I hypercube
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window.  This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-mono 
+If on a color display, pretend we're on a monochrome display.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use.  Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-delay \fImicroseconds\fP
+How much of a delay should be introduced between steps of the animation.
+Default 100000, or about 1/10th second.
+.TP 8
+.B \-observer-z \fIint\fP
+How far away the observer is from the center of the cube (the cube is one
+unit per side.)  Default 5.
+.TP 8
+.B \-color0 \fIcolor\fP
+.TP 8
+.B \-color1 \fIcolor\fP
+.TP 8
+.B \-color2 \fIcolor\fP
+.TP 8
+.B \-color3 \fIcolor\fP
+.TP 8
+.B \-color4 \fIcolor\fP
+.TP 8
+.B \-color5 \fIcolor\fP
+.TP 8
+.B \-color6 \fIcolor\fP
+.TP 8
+.B \-color7 \fIcolor\fP
+The colors used to draw the line segments bordering the eight faces of
+the cube.  Some of the faces have only two of their border-lines drawn in
+the specified color, and some have all four.
+.TP 8
+.B \-xw \fIfloat\fP
+.TP 8
+.B \-xy \fIfloat\fP
+.TP 8
+.B \-xz \fIfloat\fP
+.TP 8
+.B \-yw \fIfloat\fP
+.TP 8
+.B \-yz \fIfloat\fP
+.TP 8
+.B \-zw \fIfloat\fP
+The amount that the cube should be rotated around the specified axis at
+each frame of the animation, expressed in radians.  These should be small
+floating-point values (less than 0.05 works best.)  Default: xy=0.01,
+xz=0.005, yw=0.01.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 1992 by Jamie Zawinski.  Permission to use, copy, modify, 
+distribute, and sell this software 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.  No representations are made about the 
+suitability of this software for any purpose.  It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Jamie Zawinski <jwz@jwz.org>, 6-dec-92.
diff --git a/hacks/ifs.c b/hacks/ifs.c
new file mode 100644 (file)
index 0000000..3bccf87
--- /dev/null
@@ -0,0 +1,479 @@
+/* -*- Mode: C; tab-width: 4 -*-
+ * ifs --- Modified iterated functions system.
+ */
+#if !defined( lint ) && !defined( SABER )
+static const char sccsid[] = "@(#)ifs.c           4.02 97/04/01 xlockmore";
+#endif
+
+/* Copyright (c) 1997 by Massimino Pascal (Pascal.Massimon@ens.fr)
+ *
+ *
+ * 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.
+ *
+ * This file is provided AS IS with no warranties of any kind.  The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof.  In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * Revision History:
+ * 10-May-97: jwz@jwz.org: turned into a standalone program.
+ *                       Made it render into an offscreen bitmap and then copy
+ *                       that onto the screen, to reduce flicker.
+ */
+
+#ifdef STANDALONE
+# define PROGCLASS                                     "IFS"
+# define HACK_INIT                                     init_ifs
+# define HACK_DRAW                                     draw_ifs
+# define ifs_opts                                      xlockmore_opts
+# define DEFAULTS      "*delay:                20000 \n"                       \
+                                       "*ncolors:              100   \n"
+# define SMOOTH_COLORS
+# include "xlockmore.h"                                /* from the xscreensaver distribution */
+#else  /* !STANDALONE */
+# include "xlock.h"                                    /* from the xlockmore distribution */
+#endif /* !STANDALONE */
+
+ModeSpecOpt ifs_opts = {
+  0, NULL, 0, NULL, NULL };
+
+/*****************************************************/
+/*****************************************************/
+
+typedef float DBL;
+typedef short int F_PT;
+
+/* typedef float               F_PT; */
+
+/*****************************************************/
+
+#define FIX 12
+#define UNIT   ( 1<<FIX )
+#define MAX_SIMI  6
+
+   /* settings for a PC 120Mhz... */
+#define MAX_DEPTH_2  10
+#define MAX_DEPTH_3  6
+#define MAX_DEPTH_4  4
+#define MAX_DEPTH_5  3
+
+#define DBL_To_F_PT(x)  (F_PT)( (DBL)(UNIT)*(x) )
+
+/*****************************************************/
+
+static int  Max_Colors;
+static ModeInfo *The_MI;
+static F_PT Lx, Ly;
+static int  D;
+static Display *display;
+static GC   gc;
+static Window window;
+
+/*****************************************************/
+
+typedef struct Similitude_Struct SIMI;
+typedef struct Fractal_Struct FRACTAL;
+
+struct Similitude_Struct {
+
+       DBL         c_x, c_y;
+       DBL         r, r2, A, A2;
+       F_PT        Ct, St, Ct2, St2;
+       F_PT        Cx, Cy;
+       F_PT        R, R2;
+};
+
+struct Fractal_Struct {
+
+       int         Nb_Simi;
+       SIMI        Components[5 * MAX_SIMI];
+       int         Depth, Col;
+       int         Count, Speed;
+       int         Width, Height, Lx, Ly;
+       DBL         r_mean, dr_mean, dr2_mean;
+       int         Cur_Pt, Max_Pt;
+       XPoint     *Buffer1, *Buffer2;
+    Pixmap      dbuf;  /* jwz */
+    GC          dbuf_gc;
+};
+
+static FRACTAL *Root = NULL, *Cur_F;
+static XPoint *Buf;
+static int  Cur_Pt;
+
+
+/*****************************************************/
+/*****************************************************/
+
+static      DBL
+Gauss_Rand(DBL c, DBL A, DBL S)
+{
+       DBL         y;
+
+       y = (DBL) LRAND() / MAXRAND;
+       y = A * (1.0 - exp(-y * y * S)) / (1.0 - exp(-S));
+       if (NRAND(2))
+               return (c + y);
+       return (c - y);
+}
+
+static      DBL
+Half_Gauss_Rand(DBL c, DBL A, DBL S)
+{
+       DBL         y;
+
+       y = (DBL) LRAND() / MAXRAND;
+       y = A * (1.0 - exp(-y * y * S)) / (1.0 - exp(-S));
+       return (c + y);
+}
+
+static void
+Random_Simis(FRACTAL * F, SIMI * Cur, int i)
+{
+       while (i--) {
+               Cur->c_x = Gauss_Rand(0.0, .8, 4.0);
+               Cur->c_y = Gauss_Rand(0.0, .8, 4.0);
+               Cur->r = Gauss_Rand(F->r_mean, F->dr_mean, 3.0);
+               Cur->r2 = Half_Gauss_Rand(0.0, F->dr2_mean, 2.0);
+               Cur->A = Gauss_Rand(0.0, 360.0, 4.0) * (M_PI / 180.0);
+               Cur->A2 = Gauss_Rand(0.0, 360.0, 4.0) * (M_PI / 180.0);
+               Cur++;
+       }
+}
+
+/***************************************************************/
+
+void
+init_ifs(ModeInfo * mi)
+{
+       int         i;
+       FRACTAL    *Fractal;
+
+       if (Root == NULL) {
+               Root = (FRACTAL *) calloc(
+                                      MI_NUM_SCREENS(mi), sizeof (FRACTAL));
+               if (Root == NULL)
+                       return;
+       }
+       Fractal = &Root[MI_SCREEN(mi)];
+
+       if (Fractal->Max_Pt) {
+               free(Fractal->Buffer1);
+               free(Fractal->Buffer2);
+       }
+       i = (NRAND(4)) + 2;     /* Number of centers */
+       switch (i) {
+               case 3:
+                       Fractal->Depth = MAX_DEPTH_3;
+                       Fractal->r_mean = .6;
+                       Fractal->dr_mean = .4;
+                       Fractal->dr2_mean = .3;
+                       break;
+
+               case 4:
+                       Fractal->Depth = MAX_DEPTH_4;
+                       Fractal->r_mean = .5;
+                       Fractal->dr_mean = .4;
+                       Fractal->dr2_mean = .3;
+                       break;
+
+               case 5:
+                       Fractal->Depth = MAX_DEPTH_5;
+                       Fractal->r_mean = .5;
+                       Fractal->dr_mean = .4;
+                       Fractal->dr2_mean = .3;
+                       break;
+
+               default:
+               case 2:
+                       Fractal->Depth = MAX_DEPTH_2;
+                       Fractal->r_mean = .7;
+                       Fractal->dr_mean = .3;
+                       Fractal->dr2_mean = .4;
+                       break;
+       }
+       /* (void) fprintf( stderr, "N=%d\n", i ); */
+       Fractal->Nb_Simi = i;
+       Fractal->Max_Pt = Fractal->Nb_Simi - 1;
+       for (i = 0; i <= Fractal->Depth + 2; ++i)
+               Fractal->Max_Pt *= Fractal->Nb_Simi;
+
+       Fractal->Buffer1 = (XPoint *) calloc(Fractal->Max_Pt, sizeof (XPoint));
+       if (Fractal->Buffer1 == NULL)
+               goto Abort;
+       Fractal->Buffer2 = (XPoint *) calloc(Fractal->Max_Pt, sizeof (XPoint));
+       if (Fractal->Buffer2 == NULL)
+               goto Abort;
+
+       Fractal->Speed = 6;
+       Fractal->Width = MI_WIN_WIDTH(mi);
+       Fractal->Height = MI_WIN_HEIGHT(mi);
+       Fractal->Cur_Pt = 0;
+       Fractal->Count = 0;
+       Fractal->Lx = (Fractal->Width - 1) / 2;
+       Fractal->Ly = (Fractal->Height - 1) / 2;
+       Fractal->Col = NRAND(MI_NPIXELS(mi) - 1) + 1;
+
+       Random_Simis(Fractal, Fractal->Components, 5 * MAX_SIMI);
+
+       Fractal->dbuf = XCreatePixmap(MI_DISPLAY(mi), MI_WINDOW(mi),
+                                                                 Fractal->Width, Fractal->Height, 1);
+       if (Fractal->dbuf)
+         {
+               XGCValues gcv;
+               gcv.foreground = 0;
+               gcv.background = 0;
+               gcv.function = GXcopy;
+               Fractal->dbuf_gc = XCreateGC(MI_DISPLAY(mi), Fractal->dbuf,
+                                                                        GCForeground|GCBackground|GCFunction,
+                                                                        &gcv);
+               XFillRectangle(MI_DISPLAY(mi), Fractal->dbuf,
+                                          Fractal->dbuf_gc, 0,0, Fractal->Width, Fractal->Height);
+
+               XSetBackground(MI_DISPLAY(mi), MI_GC(mi), MI_WIN_BLACK_PIXEL(mi));
+               XSetFunction(MI_DISPLAY(mi), MI_GC(mi), GXcopy);
+         }
+
+       XClearWindow(MI_DISPLAY(mi), MI_WINDOW(mi));
+       return;
+
+      Abort:
+       if (Fractal->Buffer1 != NULL)
+               free(Fractal->Buffer1);
+       if (Fractal->Buffer2 != NULL)
+               free(Fractal->Buffer2);
+       Fractal->Buffer1 = NULL;
+       Fractal->Buffer2 = NULL;
+       Fractal->Max_Pt = 0;
+       return;
+}
+
+
+/***************************************************************/
+
+#ifndef __GNUC__
+# undef inline
+# define inline /* */
+#endif
+
+static inline void
+Transform(SIMI * Simi, F_PT xo, F_PT yo, F_PT * x, F_PT * y)
+{
+       F_PT        xx, yy;
+
+       xo = xo - Simi->Cx;
+       xo = (xo * Simi->R) / UNIT;
+       yo = yo - Simi->Cy;
+       yo = (yo * Simi->R) / UNIT;
+
+       xx = xo - Simi->Cx;
+       xx = (xx * Simi->R2) / UNIT;
+       yy = -yo - Simi->Cy;
+       yy = (yy * Simi->R2) / UNIT;
+
+       *x = ((xo * Simi->Ct - yo * Simi->St + xx * Simi->Ct2 - yy * Simi->St2) / UNIT) + Simi->Cx;
+       *y = ((xo * Simi->St + yo * Simi->Ct + xx * Simi->St2 + yy * Simi->Ct2) / UNIT) + Simi->Cy;
+}
+
+/***************************************************************/
+
+static void
+Trace(F_PT xo, F_PT yo)
+{
+       F_PT        x, y, i;
+       SIMI       *Cur;
+
+       Cur = Cur_F->Components;
+       for (i = Cur_F->Nb_Simi; i; --i, Cur++) {
+               Transform(Cur, xo, yo, &x, &y);
+               Buf->x = Lx + (x * Lx / (UNIT * 2));
+               Buf->y = Ly - (y * Ly / (UNIT * 2));
+               Buf++;
+               Cur_Pt++;
+
+               if (D && ((x - xo) >> 4) && ((y - yo) >> 4)) {
+                       D--;
+                       Trace(x, y);
+                       D++;
+               }
+       }
+}
+
+static void
+Draw_Fractal(FRACTAL * F)
+{
+       int         i, j;
+       F_PT        x, y, xo, yo;
+       SIMI       *Cur, *Simi;
+
+       for (Cur = F->Components, i = F->Nb_Simi; i; --i, Cur++) {
+               Cur->Cx = DBL_To_F_PT(Cur->c_x);
+               Cur->Cy = DBL_To_F_PT(Cur->c_y);
+
+               Cur->Ct = DBL_To_F_PT(cos(Cur->A));
+               Cur->St = DBL_To_F_PT(sin(Cur->A));
+               Cur->Ct2 = DBL_To_F_PT(cos(Cur->A2));
+               Cur->St2 = DBL_To_F_PT(sin(Cur->A2));
+
+               Cur->R = DBL_To_F_PT(Cur->r);
+               Cur->R2 = DBL_To_F_PT(Cur->r2);
+       }
+
+
+       Cur_Pt = 0;
+       Cur_F = F;
+       Buf = F->Buffer2;
+       Lx = F->Lx;
+       Ly = F->Ly;
+       D = F->Depth;
+       for (Cur = F->Components, i = F->Nb_Simi; i; --i, Cur++) {
+               xo = Cur->Cx;
+               yo = Cur->Cy;
+               for (Simi = F->Components, j = F->Nb_Simi; j; --j, Simi++) {
+                       if (Simi == Cur)
+                               continue;
+                       Transform(Simi, xo, yo, &x, &y);
+                       Trace(x, y);
+               }
+       }
+
+       /* Erase previous */
+
+       if (F->Cur_Pt) {
+               XSetForeground(display, gc, MI_WIN_BLACK_PIXEL(The_MI));
+               if (F->dbuf)    /* jwz */
+                 {
+                       XSetForeground(display, F->dbuf_gc, 0);
+/*                 XDrawPoints(display, F->dbuf, F->dbuf_gc, F->Buffer1, F->Cur_Pt,
+                                           CoordModeOrigin); */
+                   XFillRectangle(display, F->dbuf, F->dbuf_gc, 0, 0,
+                                                  F->Width, F->Height);
+                 }
+               else
+                 XDrawPoints(display, window, gc, F->Buffer1, F->Cur_Pt,
+                                         CoordModeOrigin);
+       }
+       if (Max_Colors < 2)
+               XSetForeground(display, gc, MI_WIN_WHITE_PIXEL(The_MI));
+       else
+               XSetForeground(display, gc, MI_PIXEL(The_MI, F->Col % Max_Colors));
+       if (Cur_Pt) {
+         if (F->dbuf)
+               {
+                 XSetForeground(display, F->dbuf_gc, 1);
+                 XDrawPoints(display, F->dbuf, F->dbuf_gc, F->Buffer2, Cur_Pt,
+                                         CoordModeOrigin);
+               }
+         else
+               XDrawPoints(display, window, gc, F->Buffer2, Cur_Pt, CoordModeOrigin);
+       }
+
+       if (F->dbuf)
+         XCopyPlane(display, F->dbuf, window, gc, 0,0,F->Width,F->Height,0,0, 1);
+
+       F->Cur_Pt = Cur_Pt;
+       Buf = F->Buffer1;
+       F->Buffer1 = F->Buffer2;
+       F->Buffer2 = Buf;
+}
+
+
+void
+draw_ifs(ModeInfo * mi)
+{
+       int         i;
+       FRACTAL    *F;
+       DBL         u, uu, v, vv, u0, u1, u2, u3;
+       SIMI       *S, *S1, *S2, *S3, *S4;
+
+       The_MI = mi;
+       display = MI_DISPLAY(mi);
+       window = MI_WINDOW(mi);
+       gc = MI_GC(mi);
+       Max_Colors = MI_NPIXELS(mi);
+
+       F = &Root[MI_SCREEN(mi)];
+
+       u = (DBL) (F->Count) * (DBL) (F->Speed) / 1000.0;
+       uu = u * u;
+       v = 1.0 - u;
+       vv = v * v;
+       u0 = vv * v;
+       u1 = 3.0 * vv * u;
+       u2 = 3.0 * v * uu;
+       u3 = u * uu;
+
+       S = F->Components;
+       S1 = S + F->Nb_Simi;
+       S2 = S1 + F->Nb_Simi;
+       S3 = S2 + F->Nb_Simi;
+       S4 = S3 + F->Nb_Simi;
+
+       for (i = F->Nb_Simi; i; --i, S++, S1++, S2++, S3++, S4++) {
+               S->c_x = u0 * S1->c_x + u1 * S2->c_x + u2 * S3->c_x + u3 * S4->c_x;
+               S->c_y = u0 * S1->c_y + u1 * S2->c_y + u2 * S3->c_y + u3 * S4->c_y;
+               S->r = u0 * S1->r + u1 * S2->r + u2 * S3->r + u3 * S4->r;
+               S->r2 = u0 * S1->r2 + u1 * S2->r2 + u2 * S3->r2 + u3 * S4->r2;
+               S->A = u0 * S1->A + u1 * S2->A + u2 * S3->A + u3 * S4->A;
+               S->A2 = u0 * S1->A2 + u1 * S2->A2 + u2 * S3->A2 + u3 * S4->A2;
+       }
+
+       Draw_Fractal(F);
+
+       if (F->Count >= 1000 / F->Speed) {
+               S = F->Components;
+               S1 = S + F->Nb_Simi;
+               S2 = S1 + F->Nb_Simi;
+               S3 = S2 + F->Nb_Simi;
+               S4 = S3 + F->Nb_Simi;
+
+               for (i = F->Nb_Simi; i; --i, S++, S1++, S2++, S3++, S4++) {
+                       S2->c_x = 2.0 * S4->c_x - S3->c_x;
+                       S2->c_y = 2.0 * S4->c_y - S3->c_y;
+                       S2->r = 2.0 * S4->r - S3->r;
+                       S2->r2 = 2.0 * S4->r2 - S3->r2;
+                       S2->A = 2.0 * S4->A - S3->A;
+                       S2->A2 = 2.0 * S4->A2 - S3->A2;
+
+                       *S1 = *S4;
+               }
+               Random_Simis(F, F->Components + 3 * F->Nb_Simi, F->Nb_Simi);
+
+               Random_Simis(F, F->Components + 4 * F->Nb_Simi, F->Nb_Simi);
+
+               F->Count = 0;
+       } else
+               F->Count++;
+
+       F->Col++;
+}
+
+
+/***************************************************************/
+
+void
+release_ifs(ModeInfo * mi)
+{
+       int         i;
+
+       if (Root == NULL)
+               return;
+
+       for (i = 0; i < MI_NUM_SCREENS(mi); ++i) {
+               if (Root[i].Buffer1 != NULL)
+                       free(Root[i].Buffer1);
+               if (Root[i].Buffer2 != NULL)
+                       free(Root[i].Buffer2);
+               if (Root[i].dbuf)
+                       XFreePixmap(MI_DISPLAY(mi), Root[i].dbuf);
+               if (Root[i].dbuf_gc)
+                       XFreeGC(MI_DISPLAY(mi), Root[i].dbuf_gc);
+       }
+       free(Root);
+       Root = NULL;
+}
diff --git a/hacks/ifs.man b/hacks/ifs.man
new file mode 100644 (file)
index 0000000..2d04eef
--- /dev/null
@@ -0,0 +1,59 @@
+.TH XScreenSaver 1 "10-May-97" "X Version 11"
+.SH NAME
+ifs - draws spinning, colliding iterated-function-system images
+.SH SYNOPSIS
+.B ifs
+[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-ncolors \fIinteger\fP] [\-delay \fImicroseconds\fP]
+
+.SH DESCRIPTION
+The \fIifs\fP program draws spinning, colliding iterated-function-system images.
+.SH OPTIONS
+.I ifs
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window.  This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-mono 
+If on a color display, pretend we're on a monochrome display.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use.  Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-ncolors \fIinteger\fP
+How many colors should be used (if possible).  Default 200.
+The colors used cycle through the hue, making N stops around
+the color wheel.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1),
+.BR xlock (1)
+.SH COPYRIGHT
+Copyright \(co 1997 by Massimino Pascal.
+
+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. 
+.SH AUTHOR
+Massimino Pascal <Pascal.Massimon@ens.fr>, 1997.
+
+Ability to run standalone or with \fIxscreensaver\fP added by 
+Jamie Zawinski <jwz@jwz.org>, 10-May-97.
diff --git a/hacks/images/amiga.xpm b/hacks/images/amiga.xpm
new file mode 100644 (file)
index 0000000..ed31447
--- /dev/null
@@ -0,0 +1,269 @@
+/* XPM */
+static char *amiga_hand[] = {
+/* width height num_colors chars_per_pixel */
+"   209   258        4            1",
+/* colors */
+". c #000000",
+"# c #6666cc",
+"a c #cccccc",
+"b c #ffffff",
+/* pixels */
+"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.......................................................................................................................................................bbbbbbbbbbbbbbbbbbb",
+"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.......................................................................................................................................................bbbbbbbbbbbbbbbbbbb",
+"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.........................................................................................................................................................bbbbbbbbbbbbbbbbb",
+"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.........................................................................................................................................................bbbbbbbbbbbbbbbbb",
+"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.....###################################.....aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.....###################.....bbbbbbbbbbbbbbbb",
+"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.....###################################.....aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.....###################.....bbbbbbbbbbbbbbbb",
+"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.....###################################.....aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.....#####################.....bbbbbbbbbbbbbb",
+"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.....###################################.....aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.....#####################.....bbbbbbbbbbbbbb",
+"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.....###################################.....aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa....................aaaa.....#######################.....bbbbbbbbbbbb",
+"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.....###################################.....aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa....................aaaa.....#######################.....bbbbbbbbbbbb",
+"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.....###################################.....aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa....................aaaa.....########################.....bbbbbbbbbbb",
+"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.....###################################.....aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa....................aaaa.....########################.....bbbbbbbbbbb",
+"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.....###################################.....aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.....##########.....aaaa.....##########################.....bbbbbbbbb",
+"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.....###################################.....aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.....##########.....aaaa.....##########################.....bbbbbbbbb",
+"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.....###################################.....aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.....##########.....aaaa.....############################....bbbbbbbb",
+"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.....###################################.....aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.....##########.....aaaa.....############################....bbbbbbbb",
+"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.....###################################.....aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.....##########.....aaaa.....#############################.....bbbbbb",
+"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.....###################################.....aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.....##########.....aaaa.....#############################.....bbbbbb",
+"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.....###################################.....aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.....##########.....aaaa.....###############################.....bbbb",
+"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.....###################################.....aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.....##########.....aaaa.....###############################.....bbbb",
+"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.....###################################.....aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.....##########.....aaaa.....################################.....bbb",
+"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.....###################################.....aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.....##########.....aaaa.....################################.....bbb",
+"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.....###################################.....aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.....##########.....aaaa.....##################################.....b",
+"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.....###################################.....aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.....##########.....aaaa.....##################################.....b",
+"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.....###################################.....aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.....##########.....aaaa.....####################################....",
+"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.....###################################.....aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.....##########.....aaaa.....####################################....",
+"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.....###################################.....aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.....##########.....aaaa.....####################################....",
+"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.....###################################.....aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.....##########.....aaaa.....####################################....",
+"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.....###################################.....aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.....##########.....aaaa.....####################################....",
+"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.....###################################.....aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.....##########.....aaaa.....####################################....",
+"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.....###################################.....aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.....##########.....aaaa.....####################################....",
+"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.....###################################.....aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.....##########.....aaaa.....####################################....",
+"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.....###################################.....aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.....##########.....aaaa.....####################################....",
+"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.....###################################.....aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.....##########.....aaaa.....####################################....",
+"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.....###################################.....aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa....................aaaa.....####################################....",
+"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.....###################################.....aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa....................aaaa.....####################################....",
+"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.....###################################.....aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa....................aaaa.....####################################....",
+"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.....###################################.....aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa....................aaaa.....####################################....",
+"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.....###################################.....aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.....####################################....",
+"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.....###################################.....aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.....####################################....",
+"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.....###################################.....aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.....####################################....",
+"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.....###################################.....aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.....####################################....",
+"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.....###################################.....aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.....####################################....",
+"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.....###################################.....aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.....####################################....",
+"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.....###################################..........................................................................................####################################....",
+"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.....###################################..........................................................................................####################################....",
+"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.....###################################..........................................................................................####################################....",
+"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.....###################################..........................................................................................####################################....",
+"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.....#################################################################################################################################################################....",
+"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.....#################################################################################################################################################################....",
+"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.....#################################################################################################################################################################....",
+"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.....#################################################################################################################################################################....",
+"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.....#################################################################################################################################################################....",
+"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.....#################################################################################################################################################################....",
+"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.....#################################################################################################################################################################....",
+"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.....#################################################################################################################################################################....",
+"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.....#################################################################################################################################################################....",
+"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.....#################################################################################################################################################################....",
+"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.....#################################################################################################################################################################....",
+"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.....#################################################################################################################################################################....",
+"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.....#################################################################################################################################################################....",
+"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.....#################################################################################################################################################################....",
+"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.....#################################################################################################################################################################....",
+"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.....#################################################################################################################################################################....",
+"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.....#################################################################################################################################################################....",
+"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.....#################################################################################################################################################################....",
+"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.....#################################################################################################################################################################....",
+"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.....#################################################################################################################################################################....",
+"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.....#################################################################################################################################################################....",
+"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.....#################################################################################################################################################################....",
+"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.....#################################################################################################################################################################....",
+"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.....#################################################################################################################################################################....",
+"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.....#################################################################################################################################################################....",
+"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.....#################################################################################################################################################################....",
+"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.....#################################################################################################################################################################....",
+"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.....#################################################################################################################################################################....",
+"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.....#################################################################################################################################################################....",
+"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.....#################################################################################################################################################################....",
+"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.....#################################################################################################################################################################....",
+"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.....#################################################################################################################################################################....",
+"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.....#################################################################################################################################################################....",
+"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.....#################################################################################################################################################################....",
+"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.....#################################################################################################################################################################....",
+"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.....#################################################################################################################################################################....",
+"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.....#################################################################################################################################################################....",
+"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.....#################################################################################################################################################################....",
+"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.....#################################################################################################################################################################....",
+"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.......#########################..................######################################################################################################################....",
+"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.......#########################..................######################################################################################################################....",
+"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb..........#########################..bbbbb.............####################################################################################################################....",
+"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb..........#########################..bbbbb.............####################################################################################################################....",
+"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.....bbb.....##############.............bbbbbbbbbbb..bbb.........................................................................................................#############....",
+"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.....bbb.....##############.............bbbbbbbbbbb..bbb.........................................................................................................#############....",
+"bbbbbbbbbbbbbbbbbbbbbbbbbbbb......bbbbb.....##############...........bbbbbbbbbbbbbbb..bbbb......................................................................................................#############....",
+"bbbbbbbbbbbbbbbbbbbbbbbbbbbb......bbbbb.....##############...........bbbbbbbbbbbbbbb..bbbb......................................................................................................#############....",
+"bbbbbbbbbbbbbbbbbbbbbbbbbb.....bbbbbbbb.....##############.....bbb...bbbbbbbbbbbbbbb...bbb....bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.....#############....",
+"bbbbbbbbbbbbbbbbbbbbbbbbbb.....bbbbbbbb.....##############.....bbb...bbbbbbbbbbbbbbb...bbb....bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.....#############....",
+"bbbbbbbbbbbbbbbbbbbbbbbb....bbbbbbbbbbb.....##############.....bbb...bbbbbbbbbbbbbbb...bbb....bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.....#############....",
+"bbbbbbbbbbbbbbbbbbbbbbbb....bbbbbbbbbbb.....##############.....bbb...bbbbbbbbbbbbbbb...bbb....bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.....#############....",
+"bbbbbbbbbbbbbbbbbbbbbbbb....bbbbbbbbbbb.....##############.....bb...bbbbbbbbbbbbbbbb...bbb....bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.....#############....",
+"bbbbbbbbbbbbbbbbbbbbbbbb....bbbbbbbbbbb.....##############.....bb...bbbbbbbbbbbbbbbb...bbb....bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.....#############....",
+"bbbbbbbbbbbbbbbbbbbbbbb...bbbbbbbbbbbbb.....##############..........bbbbbbbbbbbbbbbb...bbb....bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.....#############....",
+"bbbbbbbbbbbbbbbbbbbbbbb...bbbbbbbbbbbbb.....##############..........bbbbbbbbbbbbbbbb...bbb....bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.....#############....",
+"bbbbbbbbbbbbbbbbbbbbbbb...bbbbbbbbbbbbb.....##############...........bbbbbbbbbbbbbbb...bbb....bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.....#############....",
+"bbbbbbbbbbbbbbbbbbbbbbb...bbbbbbbbbbbbb.....##############...........bbbbbbbbbbbbbbb...bbb....bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.....#############....",
+"bbbbbbbbbbbbbbbbbbbbb...bbbbbbbbbbbbbbb.....##############.............bbbbbbbbbbbbb...bbb....bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.....#############....",
+"bbbbbbbbbbbbbbbbbbbbb...bbbbbbbbbbbbbbb.....##############.............bbbbbbbbbbbbb...bbb....bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.....#############....",
+"bbbbbbbbbbbbbbbbbbbbb...bbbbbbbbbbbbbbb.....##############..........b....bbbbbbbbbbb...bbb....bbbb####bbbb#####bbbbb########bbbbb###bbbbb###bbbbb########bbbbbbb########bbbbbbbbbbbbbbbbbbb.....#############....",
+"bbbbbbbbbbbbbbbbbbbbb...bbbbbbbbbbbbbbb.....##############..........b....bbbbbbbbbbb...bbb....bbbb####bbbb#####bbbbb########bbbbb###bbbbb###bbbbb########bbbbbbb########bbbbbbbbbbbbbbbbbbb.....#############....",
+"bbbbbbbbbbbbbbbbbbbb...bbbbbbbbbbbbbbbb.....##############........bbbbb................bbb....bbbb####bbbb####bbbb####bbbbb###bbb###bbbbb###bbbbbbbbbbb####bbb###bbbbb###bbbbbbbbbbbbbbbbbb.....#############....",
+"bbbbbbbbbbbbbbbbbbbb...bbbbbbbbbbbbbbbb.....##############........bbbbb................bbb....bbbb####bbbb####bbbb####bbbbb###bbb###bbbbb###bbbbbbbbbbb####bbb###bbbbb###bbbbbbbbbbbbbbbbbb.....#############....",
+"bbbbbbbbbbbbbbbbbbbb...bbbbbbbbbbbbbbbb.....###########........bbbbbbbbbb.............bbbb....bbbb####bbbb####bbbbbbbbbbbbb###bbb###bbbbb###bbb############bbb###bbbbb###bbbbbbbbbbbbbbbbbb.....#############....",
+"bbbbbbbbbbbbbbbbbbbb...bbbbbbbbbbbbbbbb.....###########........bbbbbbbbbb.............bbbb....bbbb####bbbb####bbbbbbbbbbbbb###bbb###bbbbb###bbb############bbb###bbbbb###bbbbbbbbbbbbbbbbbb.....#############....",
+"bbbbbbbbbbbbbbbbbbbb.bbbbbbbbbbbbbbbbbb.....#########........bbbbbbbbbbbbbbbbbbbbbbbbbbbbb....bbbb####bbb#####bbbb####bbbbb###bbb###bbbbb###bbb####bbbb####bbb###bbb#####bbbbbbbbbbbbbbbbbb.....#############....",
+"bbbbbbbbbbbbbbbbbbbb.bbbbbbbbbbbbbbbbbb.....#########........bbbbbbbbbbbbbbbbbbbbbbbbbbbbb....bbbb####bbb#####bbbb####bbbbb###bbb###bbbbb###bbb####bbbb####bbb###bbb#####bbbbbbbbbbbbbbbbbb.....#############....",
+"bbbbbbbbbbbbbbbbbb...bbbbbbbbbbbbbbbbbb.....########........bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb....bbbbbb#####b####bbbbbb########bbbbbbb#########bbbbb########bbbbbbb####bb###bbbbbbbbbbbbbbbbbb.....#############....",
+"bbbbbbbbbbbbbbbbbb...bbbbbbbbbbbbbbbbbb.....########........bbbbbbbbbbbbbbbbbbbbbbbbbbbbbb....bbbbbb#####b####bbbbbb########bbbbbbb#########bbbbb########bbbbbbb####bb###bbbbbbbbbbbbbbbbbb.....#############....",
+"bbbbbbbbbbbbbbbbbb...bbbbbbbbbbbbbbbbbb.....#####........bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb....bbbbbbbbbbbb####bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb###bbbbbbbbbbbbbbbbbb.....#############....",
+"bbbbbbbbbbbbbbbbbb...bbbbbbbbbbbbbbbbbb.....#####........bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb....bbbbbbbbbbbb####bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb###bbbbbbbbbbbbbbbbbb.....#############....",
+"bbbbbbbbbbbbbbbb....bbbbbbbbbbbbbbbbbbb.....###........bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb...bbbbbbbbbbbbbb#####bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb#####bbbbbbbbbbbbbbbb.....#############....",
+"bbbbbbbbbbbbbbbb....bbbbbbbbbbbbbbbbbbb.....###........bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb...bbbbbbbbbbbbbb#####bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb#####bbbbbbbbbbbbbbbb.....#############....",
+"bbbbbbbbbbbbbbb...bbbbb.bbbbbbbbbbbbbbb..............bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb...bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.....#############....",
+"bbbbbbbbbbbbbbb...bbbbb.bbbbbbbbbbbbbbb..............bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb...bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.....#############....",
+"bbbbbbbbbbbb....bbbbbbbb....bbbbbbbbbbb.....bbb...bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.....bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.....#############....",
+"bbbbbbbbbbbb....bbbbbbbb....bbbbbbbbbbb.....bbb...bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.....bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.....#############....",
+"bbbbbbbbbb...bbbbbbbbbbbbb.....bbbbb...........bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb....bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.....#############....",
+"bbbbbbbbbb...bbbbbbbbbbbbb.....bbbbb...........bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb....bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.....#############....",
+"bbbbbbbb....bbbbbbbbbbbbbbbb................bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb...bbbbbbbbbbbbbbbbbbbbb###bbbbb#####bbbbbbbb######bbbbb########bbbbb###bbbbbbb###bbbbbbbbbbbbbbbbbbbbbbbb.....#############....",
+"bbbbbbb...bbbbbbbbbbbbbbbbbbbbbb.........bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb...bbbbbbbbbbbbbbbbbbbbbbbb####bbb###bbbbbbbbbbb####bbbb####bbbb####bbb#####bbb#####bbbbbbbbbbbbbbbbbbbbbbbb.....#############....",
+"bbbbbbb...bbbbbbbbbbbbbbbbbbbbbb.........bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb...bbbbbbbbbbbbbbbbbbbbbbbb####bbb###bbbbbbbbbbb####bbbb####bbbb####bbb#####bbb#####bbbbbbbbbbbbbbbbbbbbbbbb.....#############....",
+"bbbbb...bbbbbbbbbbbbbbbbbbbbbbb......bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb...bbbbbbbbbbbbbbbbbbbbbbbbbbb########bbb####bbbb####bbbb####bbbb####bbb#############bbbbbbbbbbbbbbbbbbbbbbbb.....#############....",
+"bbbbb...bbbbbbbbbbbbbbbbbbbbbbb......bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb...bbbbbbbbbbbbbbbbbbbbbbbbbbb########bbb####bbbb####bbbb####bbbb####bbb#############bbbbbbbbbbbbbbbbbbbbbbbb.....#############....",
+"bbbbb...bbbbbbbbbbbbbbbbbbbbb..b..bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb...bbbbbbbbbbbbbbbbbbbbbbbbbbb####bbb###bbb####bbb#####bbbb####bbbb####bbb###bb###bb###bbbbbbbbbbbbbbbbbbbbbbbb.....#############....",
+"bbbbb...bbbbbbbbbbbbbbbbbbbbb..b..bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb...bbbbbbbbbbbbbbbbbbbbbbbbbbb####bbb###bbb####bbb#####bbbb####bbbb####bbb###bb###bb###bbbbbbbbbbbbbbbbbbbbbbbb.....#############....",
+"bbbb...bbbbbbbbbbbbbbbbbbbbb....bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb....bbbbbbbbbbbbbbbbbbbbbbbbbbb###bbbbb###bbbbb#####b#####bbbbb########bbbbb###bbbbbbb###bbbbbbbbbbbbbbbbbbbbbbbb.....#############....",
+"bbbb...bbbbbbbbbbbbbbbbbbbbb....bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb....bbbbbbbbbbbbbbbbbbbbbbbbbbb###bbbbb###bbbbb#####b#####bbbbb########bbbbb###bbbbbbb###bbbbbbbbbbbbbbbbbbbbbbbb.....#############....",
+"bb...bbbbbbbbbbbbbbbbbbb.....bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.....bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb###bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb###bbbbbbb###bbbbbbbbbbbbbbbbbbbbbbbb.....#############....",
+"bb...bbbbbbbbbbbbbbbbbbb.....bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.....bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb###bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb###bbbbbbb###bbbbbbbbbbbbbbbbbbbbbbbb.....#############....",
+"bb...bbbbbbbbbbbbbbbbbb.bb..bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb....bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb#####bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb###bbbbbbb###bbbbbbbbbbbbbbbbbbbbbbbb.....#############....",
+"bb...bbbbbbbbbbbbbbbbbb.bb..bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb....bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb#####bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb###bbbbbbb###bbbbbbbbbbbbbbbbbbbbbbbb.....#############....",
+"....bbbbbbbbbbbbbbbbb.....bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb...bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.....#############....",
+"....bbbbbbbbbbbbbbbbb.....bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb...bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.....#############....",
+"....bbbbbbbbbbbbbb.....bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb...bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.....#############....",
+"....bbbbbbbbbbbbbb.....bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb...bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.....#############....",
+"....bbbbbbbbbbbb..bb.bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb...bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.....#############....",
+"....bbbbbbbbbbbb..bb.bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb...bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.....#############....",
+"....bbbbbbbbbbb.....bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb...bbbbbbbbbbbbbaa........bbb.......aaa........abbbbbaa..........a..........baa..abb................bbb.......abbbbbbbbbb.....#############....",
+"....bbbbbbbbbbb.....bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb...bbbbbbbbbbbbbaa........bbb.......aaa........abbbbbaa..........a..........baa..abb................bbb.......abbbbbbbbbb.....#############....",
+"....bbbbbbbbbbb.bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb...bbbbbbbbbbbbbbbbba...bbbbbbb.aabbbaa...bba.....aabbbbba...aabbbbba....abbb....abbbbb...aabba...bbbbbbb.aabbbbbbbbbbbbb.....#############....",
+"....bbbbbbbbbbb.bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb...bbbbbbbbbbbbbbbbba...bbbbbbb.aabbbaa...bba.....aabbbbba...aabbbbba....abbb....abbbbb...aabba...bbbbbbb.aabbbbbbbbbbbbb.....#############....",
+"....bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb...bbbbbbbbbbbbbbbbba..........abbbbb...aabbbaa.....abbbba...bbbbbbba....bbba....abbb....bbbbba..........abbbbbbbbbbbbbbb.....#############....",
+"....bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb...bbbbbbbbbbbbbbbbba..........abbbbb...aabbbaa.....abbbba...bbbbbbba....bbba....abbb....bbbbba..........abbbbbbbbbbbbbbb.....#############....",
+"....bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb...bbbbbbbbbbbbbbbbba...bbbb.aabbbbb......aabbb.....abbbb...abbbbbbb...aabaa.....abb...bbbbbbba...bbbb.aabbbbbbbbbbbbbbbb.....#############....",
+"....bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb...bbbbbbbbbbbbbbbbba...bbbb.aabbbbb......aabbb.....abbbb...abbbbbbb...aabaa.....abb...bbbbbbba...bbbb.aabbbbbbbbbbbbbbbb.....#############....",
+"....bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb...bbbbbbbbbbbbbbbbba...bb..abbbbbbbbbbbbbbbbbb.....abbaa...bbbbbbaa...aaa..a....a...bbbbbbbbba...bb..abbbbbbbbbbbbbbbbbb.....#############....",
+"....bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb...bbbbbbbbbbbbbbbbba...bb..abbbbbbbbbbbbbbbbbb.....abbaa...bbbbbbaa...aaa..a....a...bbbbbbbbba...bb..abbbbbbbbbbbbbbbbbb.....#############....",
+"....bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb...bbbbbbbbbbbbbbbbba.....aabbbbbbbbb..bbbbbbaa...aabbb...aabbbbbb...aa...aab.......bbbbbbbbbba.....aabbbbbbbbbbbbbbbbbbb.....#############....",
+"....bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb...bbbbbbbbbbbbbbbbba.....aabbbbbbbbb..bbbbbbaa...aabbb...aabbbbbb...aa...aab.......bbbbbbbbbba.....aabbbbbbbbbbbbbbbbbbb.....#############....",
+"....bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb...bbbbbbbbbbbbbbbbba...aabbbbbbbbbbb..abbbba...aabbaaa...bbbbbbba.......abbb.....aabbbbbbbbbba...aabbbbbbbbbbbbbbbbbbbbb.....#############....",
+"....bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb...bbbbbbbbbbbbbbbbba...aabbbbbbbbbbb..abbbba...aabbaaa...bbbbbbba.......abbb.....aabbbbbbbbbba...aabbbbbbbbbbbbbbbbbbbbb.....#############....",
+"....bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb...bbbbbbbbbbbbbbbbba..abbbbbbbbbbbbb........aaabbaa........aaaaa......aabbbb.......abbbbbbbbba..abbbbbbbbbbbbbbbbbbbbbbb.....#############....",
+"....bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb...bbbbbbbbbbbbbbbbba..abbbbbbbbbbbbb........aaabbaa........aaaaa......aabbbb.......abbbbbbbbba..abbbbbbbbbbbbbbbbbbbbbbb.....#############....",
+"....bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb...bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.....#############....",
+"....bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb...bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.....#############....",
+"....bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb...bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.....#############....",
+"....bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb...bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.....#############....",
+"....bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.............................................................................................................................................",
+"....bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.............................................................................................................................................",
+"....bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb............................................................................................................................................",
+"....bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb............................................................................................................................................",
+"....bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb....b....bbbbbbbbbbbbbbbbbbbbbbbbb........bbbbbbbbbbbb...bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
+"....bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb....b....bbbbbbbbbbbbbbbbbbbbbbbbb........bbbbbbbbbbbb...bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
+"....bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb....bbbbb...bbbbbbbbbbbbbbbbbbbbb........bbbbbbbbbbbbb...bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
+"....bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb....bbbbb...bbbbbbbbbbbbbbbbbbbbb........bbbbbbbbbbbbb...bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
+"....bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb....bbb........bbbbbbbbbbbbbbbb........bbbbbbbbbbbbbbb...bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
+"....bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb....bbb........bbbbbbbbbbbbbbbb........bbbbbbbbbbbbbbb...bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
+"....bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.................bbbbbbbbbbbb........bbbbbbbbbbbbbbbbb...bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
+"....bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.................bbbbbbbbbbbb........bbbbbbbbbbbbbbbbb...bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
+"....bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.........bbbbbb...bbbbbbbbbb........bbbbbbbbbbbbbbbbbb...bbbbbbbbbbbbbb........bbb............bbbbbbbb.....bbbbbbbbbbbbbbbb.........bbbbbbbb",
+"....bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.........bbbbbb...bbbbbbbbbb........bbbbbbbbbbbbbbbbbb...bbbbbbbbbbbbbb........bbb............bbbbbbbb.....bbbbbbbbbbbbbbbb.........bbbbbbbb",
+"....bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb..bb.bbbbbbbbbbbb...bbbbbb........bbbbbbbbbbbbbbbbbb...bbbbbbbbbbbbbbbbbb.....bbbbbbbb.....bbbbbbbbb.......bbbbbbbbbbbbbb.............bbbbbb",
+"....bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb..bb.bbbbbbbbbbbb...bbbbbb........bbbbbbbbbbbbbbbbbb...bbbbbbbbbbbbbbbbbb.....bbbbbbbb.....bbbbbbbbb.......bbbbbbbbbbbbbb.............bbbbbb",
+"....bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb..bb.bbbbbbbbbbbbb...bbbb........bbbbbbbbbbbbbbbbbbb...bbbbbbbbbbbbbbbbbb.....bbbbbb.....bbbbbbbbbb........bbbbbbbbbbbb.......bbb.......bbbb",
+"....bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb..bb.bbbbbbbbbbbbb...bbbb........bbbbbbbbbbbbbbbbbbb...bbbbbbbbbbbbbbbbbb.....bbbbbb.....bbbbbbbbbb........bbbbbbbbbbbb.......bbb.......bbbb",
+"....bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb..bb.bbbbbbbbbbbbbbb...........bbbbbbbbbbbbbbbbbbb....bbbbbbbbbbbbbbbbbbb.....bbbb.....bbbbbbbbbbbbbbb.....bbbbbbbbbbbbbbbbbbbbbb.....bbbbbb",
+"....bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb..bb.bbbbbbbbbbbbbbb...........bbbbbbbbbbbbbbbbbbb....bbbbbbbbbbbbbbbbbbb.....bbbb.....bbbbbbbbbbbbbbb.....bbbbbbbbbbbbbbbbbbbbbb.....bbbbbb",
+"....bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb..bb...bbbbbbbbbbb...........bbbbbbbbbbbbbbbbbbbbb....bbbbbbbbbbbbbbbbbbb.....bbb.....bbbbbbbbbbbbbbbb.....bbbbbbbbbbbbbbbbbbb......bbbbbbbb",
+"....bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb..bb...bbbbbbbbbbb...........bbbbbbbbbbbbbbbbbbbbb....bbbbbbbbbbbbbbbbbbb.....bbb.....bbbbbbbbbbbbbbbb.....bbbbbbbbbbbbbbbbbbb......bbbbbbbb",
+"....bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb....bbb......bbbbb..........bbb.....bbbbbbbbbbbbb...bbbbbbbbbbbbbbbbbbbbb.....b.....bbbbbbbbbbbbbbbbbb.....bbbbbbbbbbbbbbbbbbb......bbbbbbbb",
+"....bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb....bbb......bbbbb..........bbb.....bbbbbbbbbbbbb...bbbbbbbbbbbbbbbbbbbbb.....b.....bbbbbbbbbbbbbbbbbb.....bbbbbbbbbbbbbbbbbbb......bbbbbbbb",
+"....bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.......bbbbbb..................bbbbb...bbbbbbbbbb...bbbbbbbbbbbbbbbbbbbbb.........bbbbbbbbbbbbbbbbbbbb.....bbbbbbbbbbbbbbbbbbbbbb.....bbbbbb",
+"....bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.......bbbbbb..................bbbbb...bbbbbbbbbb...bbbbbbbbbbbbbbbbbbbbb.........bbbbbbbbbbbbbbbbbbbb.....bbbbbbbbbbbbbbbbbbbbbb.....bbbbbb",
+"....bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb....bbb.....................bbbbbbbbbbb..bbbbbb...bbbbbbbbbbbbbbbbbbbbbbb........bbbbbbbbbbbbbbbbbbbbb.....bbbbbbbbbbbb.......bbb.......bbbb",
+"....bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb....bbbbbbbbbbbbbbbbb.......bbbbbbbbbbbbb.bbbbb...bbbbbbbbbbbbbbbbbbbbbbb......bbbbbbbbbbbbbbbbbbbb...........bbb...bbbbb.............bbbbbb",
+"....bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb....bbbbbbbbbbbbbbbbb.......bbbbbbbbbbbbb.bbbbb...bbbbbbbbbbbbbbbbbbbbbbb......bbbbbbbbbbbbbbbbbbbb...........bbb...bbbbb.............bbbbbb",
+".....bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb....bbbbbbbbbbbbbbbbb.......bbbbbbbbbbbbb.bbb....bbbbbbbbbbbbbbbbbbbbbbbb.....bbbbbbbbbbbbbbbbbbbbb...........bbb...bbbbbbb.........bbbbbbbb",
+".....bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb....bbbbbbbbbbbbbbbbb.......bbbbbbbbbbbbb.bbb....bbbbbbbbbbbbbbbbbbbbbbbb.....bbbbbbbbbbbbbbbbbbbbb...........bbb...bbbbbbb.........bbbbbbbb",
+"bb...bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb....bbbbbbbbbbbbbbbbbbb..b...bbbbbbbbbb..bbb...bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
+"bb...bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb....bbbbbbbbbbbbbbbbbbb..b...bbbbbbbbbb..bbb...bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
+"bb...bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb....bbbbbbbbbbbbbbbbbbbbb....bbbbbbb.....bbb...bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
+"bb...bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb....bbbbbbbbbbbbbbbbbbbbb....bbbbbbb.....bbb...bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
+"bb...bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb....bbbbbbbbbbbbbbbbbbbbb.bb........bbb......bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
+"bb...bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb....bbbbbbbbbbbbbbbbbbbbb.bb........bbb......bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
+"bb...bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb....bbbbbbbbbbbbbbbbbbbbbb..b..........bbb..bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
+"bb...bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb....bbbbbbbbbbbbbbbbbbbbbb..b..........bbb..bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
+"bb...bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb....bbbbbbbbbbbbbbbbbbbbbbbb........bbbbb.bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
+"bb...bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb....bbbbbbbbbbbbbbbbbbbbbbbb........bbbbb.bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
+"bb...bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb...bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb..b....bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
+"bb...bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb...bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb..b....bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
+"bb...bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb...bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb...bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
+"bb...bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb...bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb...bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
+"bb...bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb...bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb...bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
+"bb...bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb...bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb...bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
+"bb...bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb................bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb...bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
+"bb...bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb................bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb...bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
+"bb...bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb...............bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb...bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
+"bb...bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb...............bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb...bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
+"bb...bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb...bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb....bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
+"bb...bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb...bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb....bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
+"bb...bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb...bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb....bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
+"bb...bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb...bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb....bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
+"bb...bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb...bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb...bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
+"bb...bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb...bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb...bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
+"bb...bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb...bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb...bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
+"bb...bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb...bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb...bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
+"bb...bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb...bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb...bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
+"bb...bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb...bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb...bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
+"bb...bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb...bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.....bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
+"bb...bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb...bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb.....bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
+"bb...bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb...bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb......bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
+"bb...bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb...bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb......bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
+"bb...bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb...bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb........bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
+"bb...bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb...bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb........bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
+"bb...bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb...bbbbbbbbbbbbbbbbbbbbbbbbbbbb...bb...bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
+"bb...bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb...bbbbbbbbbbbbbbbbbbbbbbbbbbbb...bb...bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
+"bb...bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb...bbbbbbbbbbbbbbbbbbbbbbbbbbbb.....bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
+"bb...bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb...bbbbbbbbbbbbbbbbbbbbbbbbbbbb.....bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
+"bb...bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb...bbbbbbbbbbbbbbbbbbbbbbbbbbbb...bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
+"bb...bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb...bbbbbbbbbbbbbbbbbbbbbbbbbbbb...bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
+"bb...bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb...bbbbbbbbbbbbbbbbbbbbbbbbbbbb...bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
+"bb...bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb...bbbbbbbbbbbbbbbbbbbbbbbbbbbb...bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
+"bb...bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb...bbbbbbbbbbbbbbbbbbbbbbbbbbbb...bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
+"bb...bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb...bbbbbbbbbbbbbbbbbbbbbbbbbbbb...bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
+"bb...bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb...bbbbbbbbbbbbbbbbbbbbbbbbbbbb...bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
+"bb...bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb...bbbbbbbbbbbbbbbbbbbbbbbbbbbb...bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
+"bb...bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb...bbbbbbbbbbbbbbbbbbbbbbbbbbbb...bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
+"bb...bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb...bbbbbbbbbbbbbbbbbbbbbbbbbbbb...bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
+"bb...bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb...bbbbbbbbbbbbbbbbbbbbbbbbbbbb...bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
+"bb...bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb...bbbbbbbbbbbbbbbbbbbbbbbbbbbb...bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
+"bb...bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb...bbbbbbbbbbbbbbbbbbbbbbbbbbbb...bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
+"bb...bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb...bbbbbbbbbbbbbbbbbbbbbbbbbbbb...bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
+"bb...bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb...bbbbbbbbbbbbbbbbbbbbbbbbbbbb...bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
+"bb...bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb...bbbbbbbbbbbbbbbbbbbbbbbbbbbb...bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
+"bb...bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb...bbbbbbbbbbbbbbbbbbbbbbbbbbbb...bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
+"bb...bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb...bbbbbbbbbbbbbbbbbbbbbbbbbbbb...bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
+"bb..................................................................................bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
+"bb..................................................................................bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
+"bb..................................................................................bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"
+};
diff --git a/hacks/images/atari.xbm b/hacks/images/atari.xbm
new file mode 100644 (file)
index 0000000..57c2aa4
--- /dev/null
@@ -0,0 +1,6 @@
+#define atari_width 17
+#define atari_height 14
+static char atari_bits[] = {
+ 0x30,0x00,0x00,0x4a,0x00,0x00,0x80,0x00,0x00,0x09,0x01,0x00,0xc4,0x07,0x00,
+ 0xc0,0x07,0x00,0xf0,0x1f,0x00,0xf8,0x3f,0x00,0xd8,0x3f,0x00,0xfc,0x7f,0x00,
+ 0xfc,0x7b,0x00,0xf8,0x3b,0x00,0xf8,0x3d,0x00,0xf0,0x1f,0x00};
diff --git a/hacks/images/bob.xbm b/hacks/images/bob.xbm
new file mode 100644 (file)
index 0000000..f44adda
--- /dev/null
@@ -0,0 +1,43 @@
+#define bob_width 61
+#define bob_height 75
+static unsigned char bob_bits[] = {
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xff,0xff,0x07,0x00,
+ 0x00,0x00,0x00,0xfe,0xff,0xff,0x1f,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xfb,
+ 0x00,0x00,0x00,0xc0,0xff,0xcf,0x9f,0xd1,0x03,0x00,0x00,0xf0,0x7f,0x8c,0x33,
+ 0x91,0x07,0x00,0x00,0xf8,0xa7,0x18,0x27,0xb1,0x06,0x00,0x00,0xfc,0x47,0x31,
+ 0x4e,0xa6,0x0e,0x00,0x00,0xfe,0x4f,0x21,0x4c,0xae,0x3d,0x00,0x00,0xff,0xdf,
+ 0x23,0x8d,0xbe,0x7d,0x00,0x80,0xff,0xff,0x67,0xbd,0xfe,0xff,0x01,0x80,0xff,
+ 0xff,0x7f,0xbf,0xff,0xff,0x03,0xc0,0xff,0xff,0xff,0xbf,0xff,0xf8,0x07,0xc0,
+ 0xff,0xff,0xff,0xbf,0x3f,0xf8,0x07,0xc0,0xff,0xff,0xff,0xff,0x07,0xf8,0x0f,
+ 0xc0,0xff,0xff,0xff,0x3f,0x00,0xf8,0x0f,0xe0,0x7f,0x00,0xf8,0x07,0x00,0xf0,
+ 0x0f,0xe0,0x3f,0x00,0x00,0x00,0x00,0xf0,0x07,0xe0,0x3f,0x00,0x00,0x00,0x00,
+ 0xf0,0x07,0xe0,0x3f,0x00,0x00,0x00,0x00,0xf4,0x07,0xe0,0x3f,0x00,0x00,0x00,
+ 0x00,0xe4,0x07,0xe0,0x3f,0x00,0x00,0x00,0x00,0xe4,0x07,0xe0,0x3f,0x00,0x00,
+ 0x00,0x00,0xe6,0x07,0xe0,0x3f,0x00,0x00,0x00,0x00,0xe7,0x07,0xe0,0x3f,0x00,
+ 0x00,0x00,0x00,0xe6,0x07,0xe0,0x3f,0x00,0x00,0x00,0x00,0xe6,0x07,0xe0,0x3f,
+ 0x00,0x00,0x00,0x00,0xe6,0x07,0xc0,0x3f,0x00,0x00,0x00,0x78,0xf6,0x07,0xa0,
+ 0xbf,0xff,0x00,0x00,0xff,0xf7,0x07,0x70,0x9f,0xff,0x01,0x80,0xff,0xef,0x07,
+ 0xf0,0x1c,0x80,0x03,0xe0,0x01,0xef,0x07,0xf0,0x1f,0xbe,0x07,0xf0,0x3f,0xee,
+ 0x07,0xe0,0x9d,0x83,0x1f,0xf8,0xe1,0xdc,0x07,0xe0,0xc1,0x7f,0x1f,0xfc,0xff,
+ 0xc8,0x07,0xe0,0xc1,0x69,0x1e,0x7e,0xca,0xc0,0x03,0xe0,0x81,0xb8,0x1f,0xc0,
+ 0x0e,0xc0,0x03,0xe0,0x01,0xc0,0x1b,0xc0,0xcf,0xc1,0x03,0xc0,0x03,0xf7,0x11,
+ 0x00,0x7f,0xc0,0x03,0xc0,0x03,0x7c,0x18,0x00,0x1c,0xc0,0x02,0xc0,0x02,0x30,
+ 0x08,0x00,0x00,0x40,0x03,0x40,0x03,0x00,0x08,0x00,0x00,0x40,0x02,0x40,0x13,
+ 0x00,0x0c,0x00,0x00,0x60,0x02,0x40,0x12,0x00,0x0e,0x00,0x00,0xc0,0x03,0x80,
+ 0x33,0x80,0x0e,0x00,0x00,0xa8,0x01,0x00,0x33,0x40,0x0f,0xa0,0x03,0x2c,0x00,
+ 0x00,0x74,0x30,0x0f,0x38,0x07,0x2e,0x00,0x00,0x74,0x98,0x1f,0x1e,0x1e,0x2f,
+ 0x00,0x00,0xfc,0x8f,0xff,0x0f,0xfc,0x2f,0x00,0x00,0xf8,0xe3,0xff,0x03,0xf8,
+ 0x2f,0x00,0x00,0xf8,0xfd,0xff,0x81,0xff,0x3f,0x00,0x00,0xb8,0xf9,0x1f,0xf8,
+ 0x0f,0x1e,0x00,0x00,0x30,0xf1,0xf0,0x0f,0x03,0x0e,0x00,0x00,0x30,0xf1,0x01,
+ 0x80,0x01,0x0f,0x00,0x00,0x20,0xf1,0xf7,0xff,0x00,0x07,0x00,0x00,0x60,0xe3,
+ 0x01,0x60,0x80,0x07,0x00,0x00,0x60,0xc3,0xef,0x3f,0x80,0x03,0x00,0x00,0x40,
+ 0xc2,0xff,0x0f,0xc0,0x03,0x00,0x00,0xc0,0xe6,0x1f,0x00,0xc0,0x01,0x00,0x00,
+ 0x80,0xf4,0xfe,0x3f,0xe0,0x00,0x00,0x00,0x80,0x79,0xfe,0x1f,0xe0,0x00,0x00,
+ 0xc0,0x01,0x3d,0x3e,0x00,0x70,0x00,0x00,0x30,0x06,0x3e,0x0f,0x00,0x38,0x00,
+ 0x00,0xc8,0x8c,0x1f,0x07,0x00,0x38,0x00,0x00,0xf4,0xcc,0x8f,0x07,0x00,0x1c,
+ 0x00,0x00,0x72,0xee,0xf7,0x07,0x00,0x0e,0x00,0x00,0x02,0xff,0xe3,0x07,0x00,
+ 0x07,0x00,0x00,0x32,0xfe,0xc1,0xff,0x8f,0x03,0x00,0x00,0x3e,0xfe,0x80,0xff,
+ 0xff,0x01,0x00,0x00,0x7e,0x7c,0x00,0x00,0x7e,0x00,0x00,0x00,0x7c,0x3c,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0xfc,0x1c,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x1c,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,
+ 0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
diff --git a/hacks/images/bubbles/blood.pov b/hacks/images/bubbles/blood.pov
new file mode 100644 (file)
index 0000000..8166f4e
--- /dev/null
@@ -0,0 +1,24 @@
+#include "colors.inc"
+#include "shapes.inc"
+#include "textures.inc"
+
+/* The following make the field of view as wide as it is high
+ * Thus, you should have the -W and -H command line options
+ * equal to each other. */
+camera {
+        location <5.8, 0, 0>
+       up <0, 1, 0>
+       right <1, 0, 0>
+        look_at <0, 0, 0>
+}
+
+sphere {
+        <0,0,0>, 2.5
+       texture { Blood_Marble
+       scale <2, 2, 2> 
+       rotate <0, 20, 0> }
+       finish { Dull }
+}
+
+light_source {<6, 1, 0> color White}
+/* light_source {<6.1, 1, 0> color White} */
diff --git a/hacks/images/bubbles/blood1.xpm b/hacks/images/bubbles/blood1.xpm
new file mode 100644 (file)
index 0000000..c76131a
--- /dev/null
@@ -0,0 +1,74 @@
+/* XPM */
+static char *blood1[] = {
+/* width height ncolors chars_per_pixel */
+"10 10 57 2",
+/* colors */
+"`` c None",
+"`a c #250000",
+"`b c #415050",
+"`c c #013232",
+"`d c #000606",
+"`e c #0E2E2E",
+"`f c #60C0C0",
+"`g c #002020",
+"`h c #102222",
+"`i c #4D5454",
+"`j c #043737",
+"`k c #000505",
+"`l c #65A0A0",
+"`m c #7ED6D6",
+"`n c #196969",
+"`o c #0C4545",
+"`p c #642525",
+"`q c #385C5C",
+"`r c #002525",
+"`s c #6D8686",
+"`t c #354F4F",
+"`u c #5A7D7D",
+"`v c #030A0A",
+"`w c #001E1E",
+"`x c #71B1B1",
+"`y c #274E4E",
+"`z c #287373",
+"a` c #0D1A1A",
+"aa c #053333",
+"ab c #001717",
+"ac c #374343",
+"ad c #000303",
+"ae c #070000",
+"af c #537272",
+"ag c #520B0B",
+"ah c #0C3636",
+"ai c #297D7D",
+"aj c #AF5C5C",
+"ak c #003737",
+"al c #010000",
+"am c #042727",
+"an c #0C3C3C",
+"ao c #000202",
+"ap c #042020",
+"aq c #419A9A",
+"ar c #420707",
+"as c #064949",
+"at c #071212",
+"au c #1D4F4F",
+"av c #154747",
+"aw c #000101",
+"ax c #264747",
+"ay c #002828",
+"az c #000707",
+"b` c #364949",
+"ba c #001414",
+"bb c #002121",
+/* pixels */
+"```````k`aamaeal````",
+"````arahauai`nag`c``",
+"``aw`o`zaqafajaxam`r",
+"``akav`q`f`m`lb`anay",
+"```dahac`u`x`s`t`hab",
+"```aat`y`b`iaqai`ebb",
+"```gaaah`p`yava``jba",
+"````ad`c`vasaaap````",
+"``````aeaz`waoae````",
+"````````````````````"
+};
diff --git a/hacks/images/bubbles/blood10.xpm b/hacks/images/bubbles/blood10.xpm
new file mode 100644 (file)
index 0000000..7f948fb
--- /dev/null
@@ -0,0 +1,257 @@
+/* XPM */
+static char *blood10[] = {
+/* width height ncolors chars_per_pixel */
+"60 60 190 2",
+/* colors */
+"`` c None",
+"`a c #102A2A",
+"`b c #002E2E",
+"`c c #689494",
+"`d c #250000",
+"`e c #000D0D",
+"`f c #5D1616",
+"`g c #415050",
+"`h c #212A2A",
+"`i c #010404",
+"`j c #013232",
+"`k c #3C9090",
+"`l c #251A1A",
+"`m c #095454",
+"`n c #190101",
+"`o c #70D0D0",
+"`p c #000606",
+"`q c #003434",
+"`r c #0E2E2E",
+"`s c #001313",
+"`t c #115555",
+"`u c #213030",
+"`v c #60C0C0",
+"`w c #0F0404",
+"`x c #002020",
+"`y c #165D5D",
+"`z c #636A6A",
+"a` c #072A2A",
+"aa c #445C5C",
+"ab c #6C7676",
+"ac c #000C0C",
+"ad c #549393",
+"ae c #001919",
+"af c #102222",
+"ag c #4D5454",
+"ah c #002626",
+"ai c #163535",
+"aj c #043737",
+"ak c #4F6363",
+"al c #000505",
+"am c #65A0A0",
+"an c #052E2E",
+"ao c #041616",
+"ap c #044444",
+"aq c #76C1C1",
+"ar c #7ED6D6",
+"as c #001212",
+"at c #196969",
+"au c #385656",
+"av c #0C4545",
+"aw c #767F7F",
+"ax c #642525",
+"ay c #360505",
+"az c gray28",
+"b` c #5FB4B4",
+"ba c #002C2C",
+"bb c #0E2626",
+"bc c #8C9B9B",
+"bd c #000B0B",
+"be c #030404",
+"bf c #001818",
+"bg c #944040",
+"bh c #280404",
+"bi c #0A0E0E",
+"bj c #385C5C",
+"bk c #002525",
+"bl c #6D8686",
+"bm c #407E7E",
+"bn c #000404",
+"bo c #354F4F",
+"bp c #739999",
+"bq c #001111",
+"br c #5A7D7D",
+"bs c #347272",
+"bt c #030A0A",
+"bu c #5AABAB",
+"bv c #010808",
+"bw c #001E1E",
+"bx c #6E3B3B",
+"by c #71B1B1",
+"bz c #183C3C",
+"c` c #274E4E",
+"ca c #266464",
+"cb c #000A0A",
+"cc c #287373",
+"cd c #0D1A1A",
+"ce c #2B3E3E",
+"cf c #053333",
+"cg c #121515",
+"ch c #270C0C",
+"ci c #001717",
+"cj c #253838",
+"ck c #418888",
+"cl c #374343",
+"cm c #013C3C",
+"cn c #040707",
+"co c #031D1D",
+"cp c #192C2C",
+"cq c #000303",
+"cr c #070000",
+"cs c #164040",
+"ct c #537272",
+"cu c #5B8787",
+"cv c #120E0E",
+"cw c #032A2A",
+"cx c #520B0B",
+"cy c #001010",
+"cz c #062323",
+"d` c #435555",
+"da c #0C3636",
+"db c #8EAFAF",
+"dc c #282A2A",
+"dd c #001D1D",
+"de c #0C1515",
+"df c #515C5C",
+"dg c #1B5555",
+"dh c #297D7D",
+"di c #002A2A",
+"dj c #2B3030",
+"dk c #4F3939",
+"dl c #AF5C5C",
+"dm c #000909",
+"dn c #003737",
+"do c #010000",
+"dp c #001616",
+"dq c #042727",
+"dr c #0C3C3C",
+"ds c #030F0F",
+"dt c #010D0D",
+"du c #002323",
+"dv c #074E4E",
+"dw c #0C4949",
+"dx c #295555",
+"dy c #5E7272",
+"dz c #011A1A",
+"e` c #000202",
+"ea c #55A1A1",
+"eb c #000F0F",
+"ec c #176464",
+"ed c #042020",
+"ee c #0F0000",
+"ef c #001C1C",
+"eg c #8A5B5B",
+"eh c #419A9A",
+"ei c #000808",
+"ej c #205C5C",
+"ek c #420707",
+"el c #064949",
+"em c #041919",
+"en c #0C5C5C",
+"eo c #001515",
+"ep c #071212",
+"eq c #1D4F4F",
+"er c #171B1B",
+"es c #154747",
+"et c #2D8686",
+"eu c #031B1B",
+"ev c #000101",
+"ew c #3C1B1B",
+"ex c #286A6A",
+"ey c #044040",
+"ez c #000E0E",
+"f` c #264747",
+"fa c #0F4E4E",
+"fb c #0D1E1E",
+"fc c #396A6A",
+"fd c #001B1B",
+"fe c gray14",
+"ff c #0C4141",
+"fg c #031414",
+"fh c #011212",
+"fi c #172121",
+"fj c #002828",
+"fk c #060D0D",
+"fl c #063B3B",
+"fm c #2B5C5C",
+"fn c #645C5C",
+"fo c #000707",
+"fp c #343A3A",
+"fq c #396363",
+"fr c #182525",
+"fs c #364949",
+"ft c #001414",
+"fu c #467373",
+"fv c #AA7979",
+"fw c #506969",
+"fx c #022323",
+"fy c #002121",
+"fz c #1C7171",
+"g` c #213E3E",
+/* pixels */
+"````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````",
+"````````````````````````````````````````````````ebac`eefahahdi`jahdpe`aleb``````````````````````````````````````````````",
+"``````````````````````````````````````````fodmftev`eacebeobw`x`sfodmfj`qan`jdudi````````````````````````````````````````",
+"````````````````````````````````````du`p``cqdzdufydiebezeobq`ibvevdpbkek`ncr`dchdiefbw``````````````````````````````````",
+"`````````````````````````````````xe`ebalft`qcmapcpeydnfjbfdsdsbtcofxfjcmcmdrek`ndocr`b`eci``````````````````````````````",
+"``````````````````````````````bqebcbalftdicmff`n`davdvapeyajdqbtedajbh`wcr`hcmcmcmaydo`d`bdi````````````````````````````",
+"````````````````````````````e``e`palaediapaicmfleldv`m`melcfa`btanenaydvdvel`jbwfx`q`bdn`ncrbheo````````````````````````",
+"````````````````````````bd`e`easftae`jelapananflel`men`mfffbbidaencxdrcdepfkcnbtbedsfyfd`x`bfjbwei``````````````````````",
+"``````````````````````bneofj`bac`pfg`japcfdqa`da`men`tffffaf`rfsecffcvfbdadwffcfczfgcnbteveo`xeb`ecq````````````````````",
+"````````````````````cbdidn`q`qdudtfgcza`a`dadadrdwfa`aerfrcpecax`ybzercsavfaen`manczemfkbtbqftbqale`cq``````````````````",
+"``````````````````ebbh`nchdnapeycofkbibicd`raififraiaiaiesejfcfzeqfrcseq`t`yatcxenavajeddsfg`bdidpebcyeo````````````````",
+"````````````````cyan`nfrekeebhewcfa`dadacg`aficpeqdgcaeqejcadhdhdxfeg`ecatatcaewecdkcx`mcffgbtdp`jdmfybbcr``````````````",
+"``````````````ciee`b`bfrapcwcfek`mfp`f`taifrbzejdxcaexdxdxccbmdhc`djc`exejatbj`fbo`tecek`medemfhcwdnbqchchdd````````````",
+"``````````````eecycydncmcodsanekeqch`fatececcaexexccbsbsbsetdketbofpfmfmexcaccew`fececchendra`dscfcmdibdchef````````````",
+"`````````````dbqe`dm`bcofgepflchcxdkfzaxagdhexcabsbsbmckehbxeg`kfqclaubsetetdhetbxaxew`faxavdqfkcwelapdpbwbwcb``````````",
+"``````````bqdpbdfdaldsdsaoa`ffecbofz`ydhewfwdhbjfcbmckadazehckfuaaazfcckfnbx`kbmetazfzatatffdecncwapap`qaleecifo````````",
+"``````````cdcbbqbwfhcncnczff`m`ycafzfzetfwbxetbmfuckehdlbuadbrctfwagbmehcubgbr`kfudhca`y`y`adeepczflewcmdiebchbw````````",
+"````````ftduevbf`iedfgczav`fc`bobjfzccdhetbxeh`kehehbpegbucuctctdffwaddldlehbgehetexf`g`csfrcgfbdqflbheeeyddbk`d`e``````",
+"````````cy`xale`fy`jajcxcvekew`laxccdhbs`kegazadadbufvbuamcu`zdycucub`dlfvbxbgehbsbof`fe`hercgbbdaeyel`wcmdi``crbw``````",
+"````````cvdieobkdn`wbhesenecatdkaxbxetetehadbgbubudl`vam`cbl`zblam`v`vbydlbgbl`kbjfpdjdc`hfrerbbffeldc`n`l`b`sbacg``````",
+"``````eodo`qahch`delbzce`t`tdgccewdcbxfpazbxegam`vdlb`byambpblabby`oaq`v`vawbuckclbjfmcecjcper`affdvekfebheydudpfycr````",
+"``````cd`d`adnekekbzdjcv`f`ydgfzbsfudy`zbgdldlbcdbdl`oaqambpblabbpby`v`v`vdldlckazfqfqfmf`g`frfrdw`mewel`wcrdievdp`n````",
+"``````bwee`dcmee`dbhekcxdk`ydgejfmexbs`keheab``v`vdlfv`oaqaqbybpawbpbpbybub``vadaa`gfcfmdxf`cp`aavdvdvel`hayahe`ezdu````",
+"````bqfday`ddnfebhek`mfaescsg`g`cjclbjfuckadbu`v`vdbfvfvararar`obyawaw`camameacuak`gfsbof`g`fierdrfadrelap`qfjalcbddeb``",
+"`````eae`ddnayapekeldabbfberfrcjcefsauaackeaeab`byaq`odbfvfvdbaraqbpabawblcudyakdfaaaufpdjfecper`adadrcfajbadn`eacefem``",
+"````fofy`bbaaycpelancdbiaffr`hg`djfpbod`bmeabuamambybyaqararfvdb`obybpaw`z`zfndfakfcfqcldj`ubzfrcgcddrcfdq`bcmdu```xcv``",
+"````bnbfbwefdncrdranbiafaifrficjdjfsboazfuadeaam`c`cbpbpbyaqarawarbybpbpab`zdyfwfwfubjboce`h`ufrafdefbedfxdq`bfyev`xdz``",
+"````ebfoaccbbwapapdqbidreserfifef`bjauazfucuadam`cblblbpbpbyarfvfv`oaqambl`z`zfwfufuaufpcj`ucjcperafbifkco`bdueocbdpdp``",
+"````cibnbde`dteyela`dedwesfierg`dxaucl`gfubrcucublabblblbpbpaqarfv`o`oby`c`zfwfwaaazfpfpceg`bzaiafbbcdcnfx`bfd`se`dmbf``",
+"````ftfofdfy`papapdqep`rdaaifi`hcececl`gaaakctdybr`zabawabbpbyarfvfv`obybl`zakagd`aabofpcj`u`ucpafcdepbtdscwcidp``cqfy``",
+"````bfasfyefev`japembibbbbfificjdcfpfsaud`agagdffn`zababblbpby`ofvbcbyambr`zakdfaafcaufscj`uerfrafdeepepemdnbabw`s`ebf``",
+"````bfcyefftcbey`jdsdecdafercpg`f`ceclcl`gaaakctfn`zdy`zbl`cbyaqeg`obuamcubrbrfubmbsbjdxcjg`fierfbcdepepan`qdn`bfjfyfo``",
+"````bw`sac`eahayfhfkepdedecgaig`c`dxfsfpauaaakfwfwdydydy`z`zblam`veg`vbyeaadckckehetexf`cj`hercgcdbicncodqcmdnereecrfo``",
+"````cibfe`ei`b`qbeemepbidecgcseqeqexdxfpaud``gdfctbrctcudy`zdybr`cb`fndleg`cblabbg`ketfmg`cpercgdeepcndsed`q`b`dbkdu`s``",
+"````fo`n`edzdn`bbvaoeubifbcdaidgdgcadxdjboboclaaakfwfwctctdfdffwbradawegawbgdkbxdkbxaxfzeqfrcgdebbczaobtedciduee`x`x`n``",
+"````dmee`p`x`dbadtdsedemep`raicsesdgc`dcfsbofsd``gd`agagagdfagdffwctbmckehegegbxbxewdhatcsficgfb`rczcobebtacfyeefycieb``",
+"``````eealfj`n`beodtcoedbi`affescscsg`fecefsfpfp`g`gd`d`d`agagagaaaaaafqbmbmetetaxax`gejcserbbdrfla`cobtdmbqbkdq`sbq````",
+"``````asas`ser`qbfbvdsemfkfbdrfaesbzcp`h`udjdjclbjbjfqfqaa`gazazazclclaubjfcexcacafzaxdg`rcddrdweleydq`i`ifo`bahacdz````",
+"``````acez`eahee`jacbtfgcocfffdwesesbzfrfefedccedxbofqfcfcfcauclclfpfpclfsfmdxc`eqfzecbzcv`rdvdcfecpfxftdmcy`bahbfac````",
+"````````bdcifd`bchdufgaocfeleldwdwesaifrcpfe`hf`cafmexbsfcbsfqfscefsf`djcef`dxeqdgercscdcddrewbhfedrcwfte`ezdi`ddo``````",
+"````````evacfyafan`j`xdqcfdrdv`mavdrdaaicscpbzdgcaccccexcaexexf`cjc`cedccjf`dgecdk`t`acvbbffayekapbabwfoe`e`fyfyfo``````",
+"`````````pei`xdi`j`j`b`jcfajelapda`rdadacs`tatataxewazexc`c`c`cjfecj`u`hes`y`ydxcgfacdbicfdvbhewajcwftdmei``ft`edt``````",
+"````````````ezdd`b`bbb`layeyeyapcfa`drfffa`f`fecbodx`fcaeqg`g`g`frfifrbz`y`ydkcxcedwcdcdfl`w`najfjaecbdmeifoevcq````````",
+"````````````e`eodzchee`ncfeeekapana`a`ffavch`tesc`ax`lecesaibzaicpfifiesc``fceeq`mdabia`flfedadqaeezeicbefdzezei````````",
+"````````````al``e`ef`bba`d`n`dcmdqdqanajelcvdwavencx`f`fescsaibzaibb`ravfpcxcjcxelanfkczcwfl`jcidmbdcy`xcv`dbi``````````",
+"``````````````ev``eveobf`jcrbhfrajananapayela`bbdrfafacxfp`t`tfaavdrff`tewaycvcxflfkaocodq`jduftezbdftcgftee````````````",
+"``````````````evcqbnalcyeo`b`qayaybhfebhapaja`deczffffg`g`dvchdvdvdwdwcvbzcncnekancncofjfxdufycieibf`xeedpal````````````",
+"````````````````bnevevbdcqbq`xbafr`j`jflancoemfkbtdqczana`flelekcxchekflcfelcneydqbeedbk`xdzez`p``asbwefcq``````````````",
+"``````````````````e`bn````cq`e`eftdzdpddfgbtbecncnbefgaoepedcfajflflcwcoedajflcfdpcyfydzacdmbneidmbweffo````````````````",
+"````````````````````cbfoacezbnale`e`acfobde``p`pbebebtbecnfgemdseuaocodqdqdqahdp`pcidpcbevcq``fobdasdo``````````````````",
+"```````````````````````ebqaecifdaccq`pcqaleodubwdddpfgbvdzcwbkfgbt`pfgco`xfdcicbdmddci````al`pdmevcb````````````````````",
+"`````````````````````````e`n`naecieb`e`ecbebbfaedzbwbqdm`sbw`bbkcy`idmcibfeoebeicift`pezeodz`sfgev``````````````````````",
+"``````````````````````````btbqepbwbfdpdpcbcqfodmac`sfobdaseo`xahae`sfo`pacfoevbdbne``eaecv`wee``````````````````````````",
+"````````````````````````````````bneocr`nddbqcycyfocbevbnebdzbwduahbwbf`ee`cqe`dm`sbwcrdpciez````````````````````````````",
+"````````````````````````````````evcqfobqefcvdzcieb```p``alfoeoftdddpdm``dmeicybfeecyezdsfo``````````````````````````````",
+"````````````````````````````````````aleve`alacdzeecveo`sbdcbbqbqal``bneveibqciaebqdo`p``````````````````````````````````",
+"``````````````````````````````````````````cqevcbasbiepcvdpebdmcbal`eei`pcqevcbal````````````````````````````````````````",
+"````````````````````````````````````````````````eb`pbneidmbdcyeeeecycncrcr``````````````````````````````````````````````",
+"````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````",
+"````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````"
+};
diff --git a/hacks/images/bubbles/blood11.xpm b/hacks/images/bubbles/blood11.xpm
new file mode 100644 (file)
index 0000000..b6daa93
--- /dev/null
@@ -0,0 +1,269 @@
+/* XPM */
+static char *blood11[] = {
+/* width height ncolors chars_per_pixel */
+"72 72 190 2",
+/* colors */
+"`` c None",
+"`a c #102A2A",
+"`b c #002E2E",
+"`c c #689494",
+"`d c #250000",
+"`e c #000D0D",
+"`f c #5D1616",
+"`g c #415050",
+"`h c #212A2A",
+"`i c #010404",
+"`j c #013232",
+"`k c #3C9090",
+"`l c #251A1A",
+"`m c #095454",
+"`n c #190101",
+"`o c #70D0D0",
+"`p c #000606",
+"`q c #003434",
+"`r c #0E2E2E",
+"`s c #001313",
+"`t c #115555",
+"`u c #213030",
+"`v c #60C0C0",
+"`w c #0F0404",
+"`x c #002020",
+"`y c #165D5D",
+"`z c #636A6A",
+"a` c #072A2A",
+"aa c #445C5C",
+"ab c #6C7676",
+"ac c #000C0C",
+"ad c #549393",
+"ae c #001919",
+"af c #102222",
+"ag c #4D5454",
+"ah c #002626",
+"ai c #163535",
+"aj c #043737",
+"ak c #4F6363",
+"al c #000505",
+"am c #65A0A0",
+"an c #052E2E",
+"ao c #041616",
+"ap c #044444",
+"aq c #76C1C1",
+"ar c #7ED6D6",
+"as c #001212",
+"at c #196969",
+"au c #385656",
+"av c #0C4545",
+"aw c #767F7F",
+"ax c #642525",
+"ay c #360505",
+"az c gray28",
+"b` c #5FB4B4",
+"ba c #002C2C",
+"bb c #0E2626",
+"bc c #8C9B9B",
+"bd c #000B0B",
+"be c #030404",
+"bf c #001818",
+"bg c #944040",
+"bh c #280404",
+"bi c #0A0E0E",
+"bj c #385C5C",
+"bk c #002525",
+"bl c #6D8686",
+"bm c #407E7E",
+"bn c #000404",
+"bo c #354F4F",
+"bp c #739999",
+"bq c #001111",
+"br c #5A7D7D",
+"bs c #347272",
+"bt c #030A0A",
+"bu c #5AABAB",
+"bv c #010808",
+"bw c #001E1E",
+"bx c #6E3B3B",
+"by c #71B1B1",
+"bz c #183C3C",
+"c` c #274E4E",
+"ca c #266464",
+"cb c #000A0A",
+"cc c #287373",
+"cd c #0D1A1A",
+"ce c #2B3E3E",
+"cf c #053333",
+"cg c #121515",
+"ch c #270C0C",
+"ci c #001717",
+"cj c #253838",
+"ck c #418888",
+"cl c #374343",
+"cm c #013C3C",
+"cn c #040707",
+"co c #031D1D",
+"cp c #192C2C",
+"cq c #000303",
+"cr c #070000",
+"cs c #164040",
+"ct c #537272",
+"cu c #5B8787",
+"cv c #120E0E",
+"cw c #032A2A",
+"cx c #520B0B",
+"cy c #001010",
+"cz c #062323",
+"d` c #435555",
+"da c #0C3636",
+"db c #8EAFAF",
+"dc c #282A2A",
+"dd c #001D1D",
+"de c #0C1515",
+"df c #515C5C",
+"dg c #1B5555",
+"dh c #297D7D",
+"di c #002A2A",
+"dj c #2B3030",
+"dk c #4F3939",
+"dl c #AF5C5C",
+"dm c #000909",
+"dn c #003737",
+"do c #010000",
+"dp c #001616",
+"dq c #042727",
+"dr c #0C3C3C",
+"ds c #030F0F",
+"dt c #010D0D",
+"du c #002323",
+"dv c #074E4E",
+"dw c #0C4949",
+"dx c #295555",
+"dy c #5E7272",
+"dz c #011A1A",
+"e` c #000202",
+"ea c #55A1A1",
+"eb c #000F0F",
+"ec c #176464",
+"ed c #042020",
+"ee c #0F0000",
+"ef c #001C1C",
+"eg c #8A5B5B",
+"eh c #419A9A",
+"ei c #000808",
+"ej c #205C5C",
+"ek c #420707",
+"el c #064949",
+"em c #041919",
+"en c #0C5C5C",
+"eo c #001515",
+"ep c #071212",
+"eq c #1D4F4F",
+"er c #171B1B",
+"es c #154747",
+"et c #2D8686",
+"eu c #031B1B",
+"ev c #000101",
+"ew c #3C1B1B",
+"ex c #286A6A",
+"ey c #044040",
+"ez c #000E0E",
+"f` c #264747",
+"fa c #0F4E4E",
+"fb c #0D1E1E",
+"fc c #396A6A",
+"fd c #001B1B",
+"fe c gray14",
+"ff c #0C4141",
+"fg c #031414",
+"fh c #011212",
+"fi c #172121",
+"fj c #002828",
+"fk c #060D0D",
+"fl c #063B3B",
+"fm c #2B5C5C",
+"fn c #645C5C",
+"fo c #000707",
+"fp c #343A3A",
+"fq c #396363",
+"fr c #182525",
+"fs c #364949",
+"ft c #001414",
+"fu c #467373",
+"fv c #AA7979",
+"fw c #506969",
+"fx c #022323",
+"fy c #002121",
+"fz c #1C7171",
+"g` c #213E3E",
+/* pixels */
+"````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````",
+"``````````````````````````````````````````````````````````````ftcb`p`eacftasasace`cq````````````````````````````````````````````````````````````",
+"``````````````````````````````````````````````````````cqcqe`foeb`s`x`b`b`bahdpebcqezezasfdcv````````````````````````````````````````````````````",
+"````````````````````````````````````````````````cqevbdal`pdpfycifdbfcyezas`sezevdp`qdodo`nafdibkah``````````````````````````````````````````````",
+"````````````````````````````````````````````ei``ei`pbwdi`xfjbadz`sfhacacbddtbdbddufjapcrayee`day`jfydd``````````````````````````````````````````",
+"````````````````````````````````````````cyeoeibnft`jdncmaiffeydnbacofgdsdsdsfgfyahdicmcmeyfeay`ndo`d`laedz``````````````````````````````````````",
+"````````````````````````````````````ddbdebalcqbfdidnelaycrbhdcelapeyajanfxcnaoaneyayay`d`delapey`h`ddocr`qbkah``````````````````````````````````",
+"``````````````````````````````````cqeoebcqe`aedidn`u`ueyapcj`mdv`mdveyfldqbtedajesekdcewdvap`jbkfjdn`qdndodnbh`n````````````````````````````````",
+"``````````````````````````````foalcbbde`ebci`bey`hapancfcfey`mewen`mdafbdebidrenekdvcfczdqanembtbtfxduahdicmcm`qfydp````````````````````````````",
+"````````````````````````````cbeidzdzfoasdpdq`qdveldqczajeydven`mdwavdrfbcdffceewdwbbbideczcoeufgbtbedzdzcbebbkfjbwbfei``````````````````````````",
+"````````````````````````````cyah`bahcybdbtdqajeycfa`an`ravenen`tffda`rcgdrfsatfa`acdbbdadwdvffajdqemdscnbtcq`sftaee`dme`````````````````````````",
+"````````````````````````cbdu`rdndndndufhbtcodqana`cfdrdaavfafaaificgfraiecewecfa`aafcsesdwenen`manededcndtdtbqci`sfo`pe`cq``````````````````````",
+"``````````````````````ez`b`n`ddndncmajcocnfkembicd`rda`raffifrcpcpcpesdgfzfz`ycserbzeq`t`tendk`f`mdra`cocndsaoah`bbwcqcyebas````````````````````",
+"````````````````````cy`baychayapekekdvajczfbbbbbcvafaieraieqeqeqeqdgcacafcdhejg``hf`ejececat`fch`fchfp`mapaocnfgeddifdfofyfyed``````````````````",
+"``````````````````eo`bbh`jchayayapey`welffenenaverfieraieqeqejexdxc`fmexetfwfmg``uc`exatatfzax`lateneccvenflcofgdseu`qfdezer`nfy````````````````",
+"```````````````````ndifd`jcpcmahedancxenf`chc``tesbzg`dgcacaccccfmdxfmdhbgetfmcjdjdxexcacafzbx`fdk`t`tekew`manaocnbw`qcmfdduaydi````````````````",
+"````````````````cgciebdpdncmfxdsemflcvcechchdkfzfzatexexcaccccbsbsbsbm`kdk`kfcfpclfmcaexcaexdhewewfzat`f`fendrcfbefxcmey`jbn`bfdci``````````````",
+"``````````````fyefeidmas`bedfgaoemavchch`ffzfzewagdhcccaexbsbsbmbm`kehdkeg`kbsbofsbjbsetetdhdhfqbxax`f`l`ffpava`aoedaj`hapbwe`anacfo````````````",
+"``````````````dieifofdacfhbtdscoandwfpdkcaececagfebxdhfcfqbsbmckehbgbxehckfufc`g`gfcbm`kegbxetetdhaafqfzatejavcdepeucfelap`jbq`xdieb````````````",
+"````````````efezfofyaedtbtcnfka`fffa`tatfmecfzdfdfbxetbmfcfcckeh`cazeaadckfufwaaaabmehbxbgbg`ketbmdhfzecec`y`rdebiemcfap`hcm`be``qdias``````````",
+"````````````czcbeibw`ibfbtfkcfelenecfsdkfzfzccetckdk`kbmckck`keadldleacuctbrctagfwadbuegehbxckbretdhcaeqdgdg`adebifba`flbhekfefybq`n`d``````````",
+"```````````efy`pasaceffxcoa`elcxchecboaxfzccccdhetbgbxehehadeadlfvb`adbrdy`zdfctbrbuegbgblbxab`ketexc`cj`ucpficdfba`aneydc`new`jaebk`nbf````````",
+"``````````effy`edmefdqajeyaycncxayewew`fccdhdhdh`kbrbgeaadadb`dlbuam`ccu`zdycucuea`vdldlbxbgcu`kbsbocedj`ucpficgfb`rfleldv`dap`bah`peecd````````",
+"````````eieedifdcydnapaybh`mf`enecatdkaxbxdhet`kehehazaweab`dlbyamam`cab`zblamb``v`vbydldldleackbjfpfpdc`h`hfrerfbdadrdvdcbeekcmdieibafb`n``````",
+"````````aeee`jah`b`dek`ucsg`en`t`t`yd`fedcaxbxbxbxazbgdlb`bpdl`vambyam`cblabam`vdbaq`vbybpbpeafuclaubjcecj`ucpfi`adaav`mekekekaydndzdzbwfx``````",
+"````````cgcr`q`q`lcrfedvg`cv`fec`tdgfzbxaxaxbgegbgbgagdl`vbcdl`vbybybpbpblabbpby`v`o`vb`fvdlbubmazbjfcfmf`g`cjfrfrdafa`mewelbhcrdaddcqcied``````",
+"```````nbk`dcrcm`leebhewcxekay`yeqeqatccccdh`kcuawbub`by`vbcegfv`oaqbybybpawabbpbyby`vb``vdlbpckd`d`fcfqdxdxf`cpfi`rav`m`melek`day`xevfoducv````",
+"``````ci`xayeednay`d`nbhcxg`en`tdgdgeqc`dxfqbsckadadea`v`v`ofvabdbar`o`obybybpawbl`camamamb`bucuaaazbjfqdxdxf``ufiaifa`meldv`hapeybwcqdmfyco````",
+"``````aebwayay`q`dcp`ncj`mfaffbzaig`cjcjcebobjfuckadeab`b``v`ofvfvarararararaqbpawawbl`camamadctakd`clbofsf`cjfier`affavflapapaj`jdudmebeffd````",
+"```````sahaydncmdaewfeapdabbafcger`hcjcjceauauaackeaeabub`byaq`oarbcfvfvdbar`obyblabawblblbrctakdfaabjclfpdjfecpfifibbdadrajajan`j`q`eacbffd````",
+"````bd`efja``bdafeewelanfbdecvfrfi`ug`cjdjfs`gaabmeabuamamambybyaq`oarfvawdbaraqbpblab`z`zfndfdfakfwfqaudjdc`ucjfrercgbbffajedcw`jdn`xcqefbwez``",
+"````foacciahdu`j`n`hapanepde`a`aerfecjdjfpfpcl`gfuadbubuam`cbpbpbpaqaqararfvaraqbpbpbpab`z`zakakakfufqbjcldj`u`uaificdde`randqcw`b`qbk`pftefeo``",
+"````acbdebas`sahdnekapczbi`adaaierfe`hcjboaud`azfucuadamam`c`cbpbpbpbybyarfvdbarbybybpbl`zdydyctfufubjaucedj`h`uaifrcgcdbiaoeddq`bdudzcqacbfft``",
+"````aeeve`fo`pfd`b`dapczdedrfaaifi`h`hc`fmau`g`gfucuad`c`cblblblbpbpbpbyardbawaraqaqby`cdy`zakfwfwfcbjclfpcjcjcjbzfrfb`abifkemcw`jfddpcqe``sci``",
+"````eebnbdez`pdmcwbhapdqdeavdwbzerfig`dxdxfscld`fubrcucucuababawblblbpbyaqardbfv`o`oby`c`z`zfwfwagazclfpcececjcjbz`afbbbfbcnaoan`beoase`ev`seo``",
+"`````ncbbqeffyevahayeyczep`rdaaicpfi`hcecefpbo`gaaakfwdydybr`zabababawbpby`odbfvaq`obybldyakakagd`aaaucldjcj`u`ucp`afbfbepfkcnedbaftdpcqe`ac`s``",
+"````crbddpfybwfofxaycfeubibb`rbbfifr`udcdjclaud`aadfagak`z`z`zababblblbpby`ofvfv`obyambrdydfagagaafcaubocedj`herfiafdebibifkdsdq`qdibw`sbqe`dp``",
+"````eeeidpfd`scqfybhcwepepfbafafercpg`g`cefpfsclazagakfwfwfn`zababab`camby`ofvfv`vbuamcubrctctfufubsfqfmf`cjg`cperaffbdedefkedcf`qdndifydudmbf``",
+"````eeeiezftftebdndnfkbtaocddeaferaig`c`f`cefsfp`gaaakctfwdfdydy`z`zabbl`cby`veg`vb`b`eaadcubmbmckbmfcdxcecj`uficgcgfbbifkemfxdn`qcm`q`bdobfbd``",
+"````fkftftfo`pfyeeahbefgepepbicgercsesf`fmfmfsfpauaad`dfakctdydybrdy`z`zbl`cbu`vfnfvdlb`eaad`k`kck`kdhcaf`cjfrerercvdebifkfgco`jcm`qayaydi`xfo``",
+"````acfdeoeidmahfifxbtemepcncdcvafesdgeqcacac`fpboau`gd`akctbrctbrbrdyfn`zbrcuea`vfndlfnbgadbgbgbxfnetccc`g`cpercgcvdedecncnfg`b`bdi`nahducrdm``",
+"``````cveocydzbacmcobtemeucncdfbafcsdgdgcaejc`djbobocl`gaafwfwfwctctfwdfdfakbrcueadlegegabbxbxbxdkbxaxaxejesfrcgcgfbbbczaofgaodzbwaheefybwdz````",
+"``````fdbwcbbwficmdpe`aoedembi`a`aaicsesdgeqf`djfsbofs`gaad`aaagdfdfdfdfagdffwctbmckehehabbgegbgbgdcdhfcejcsficgdebbanczcodsdsebebah`nfyfyeo````",
+"``````ez`xevahdo`qbwdtcncoczepfbdaffcsbzesf`g`dccefsfsclfpazazaz`gagagagagagakakakakfuck`k`kckfuaxaxagfzejbzercd`rdacfczcodtbvbv`sahafcidzbf````",
+"``````cb`n`pfyaydnbkebbtaoedepep`rfffaescsai`ufecjcefpfpfsbjbjfqaaaad`d``g`g`g`g`g`gaufqbsbsbsccdhdhewateqcpcg`adreleycfedbtbvbvdp`bbacy`s`w````",
+"````````ddbdcb`b`d`bft`ibtembtem`rdadwesesbzcp`h`hdcdcfpbobjbjfqfcfcbjd`azclfsclfpclbobofmcafmfmejateweccsafbbffdvelelflfxbtalaleobhdudm`n``````",
+"````````ei`p`ebw`lerdidtbvdsdsandaffdwdwesesaififefefedjc`dxbobjfcbsfcfcaufsclfpfpfpfpcldxfmdxc`eqatdkes`rcdda`mcxbzelaibkbfdte`bfcvfjdpae``````",
+"````````cb`eciefah`ndnfdfgaocwapeldvdwdwdwaiaifrcpfefecjdxcafmexbsbsfcbsfqbodjfsfscedjcecedxeqeqdg`f`t`rcgfbdrg``newaieycwcievalascg`d`ne```````",
+"``````````e``ebw`bdoaydiddfxcwap`udvdvdwdrdaaiaibzcp`ug`ejcaccccccexexexexc`djc`c`cjdccjg`eqdgecfsecbzcdcdbbdrekbhekfl`bddezdmevcqdu`dfd````````",
+"``````````al`pfybk`n`b`qdi`b`jflapeleldada`rdaaicseseq`yatexaxagcccafmdxfmf`dccjf``u`hg`dgej`yecew`y`acdcd`rav`nekapanahaealalevfofdase`````````",
+"````````````aldpbwdi`bba`q`qdncmajapeyajcfa`dadres`ydkew`lewewaxfzejg`g`g`g``hfe`uer`ues`y`ycl`l`f`t`abicdeybhdcayey`bahebfodmfoeveial``````````",
+"````````````fobdeffy`d`j`lee`n`nayapapcfananffavfa`fcx`tecdxecew`f`yesbzcsbzcpfrercpbz`y`yf`ewf`eqdwbbepa`ey`n`wajfjfycydmbdeiac`e`pfo``````````",
+"``````````````evcbftbwcz`d`ddnbhbhayapana`ana`ffavew`tdwfaf`dk`lfsdgbzaibzaicpfierfres`y`fchenf``mdrcdcocfflaicp`bfdbqbddmcbbfbkdzac````````````",
+"``````````````cqbneial`x`bdifiaydobhcmcwczananajelch`mavfa`tcx`fcg`tcsbzaibzai`rbbaiav`tcvfpdcewelcfepemdqcwfl`qfyac`p`ecybw`n`naeee````````````",
+"```````````````````pe`alaebwdieedobhcmajcwcwcfapewewdaa`daavfafadjek`tfafafaavdrdrff`mdjchchcxeweyemdsemeddq`jfyfdcyac`e`sfjbwbwee``````````````",
+"````````````````````ale`fo`sft`j`q`deeficmey`lcnekeyajedfbdadwav`mchdjchekfafaavavdwewcvcvek`wekcfdsemeddqfxdifyfdciacciddcoaeas````````````````",
+"``````````````````e`evevfoezdmbqfyah`q`day`rbhayeyancwepfkedcfdaffeldrffewchdvdvg`djdceyelcnbhaicwbeaocwfxfy`xbfacfoalaebweebf``````````````````",
+"````````````````````bne```foe`bnebbwdu`jbaah`b`bfxemdsbedscnemeuedczdqajapfeay`wbzapana`flewfeeyfx`idpah`xciezcbevcqfoas`naobn``````````````````",
+"``````````````````````cqfo``e`ev`paceiacdpbfcydzfhbtbebebebebedsfgdsfkemdqananajanczededcfcmcmcwfhezfydzcifofoe``pev`sbwepei````````````````````",
+"````````````````````````cbeicbacaccqalbnevdmacfobde``pbv`pbebebtcnbebtaoembtememaocodqdqahcwfyfh`peodzezalevcqe`eialcbeodo``````````````````````",
+"``````````````````````````accyeoftbfdzac``eibdbn`pfhddbwdddzfgdsbvdsbwbadqfgbv`idtdzedfxbwdzeodmcbfdfdacale`e```aleibnac````````````````````````",
+"`````````````````````````````eci`n`xciftbdei`pdmbdbddzbkfdef`x`sbdebciducwdudpac`pbddpfddzbfbdalebdzcycqdmcyaeasftacbn``````````````````````````",
+"``````````````````````````````btcrcrddefaecibqbqe`eiasfteb`sdpeb`idmeoefahfyeodt`i`iebci`eace``sac`pe`bddpbffddo`w``````````````````````````````",
+"``````````````````````````````````cbeb`nbwddddbfezdm`pacfodmbdbnevcb`sdpdzahduefascbfoe`bnbnale`bn`pasdz`nef`nas````````````````````````````````",
+"````````````````````````````````````alevcbaeeedobwdpcyftcydmeie```ei`sdd`xbkahfjfdeodme`bn`pcbezdpefdoaeezdocb``````````````````````````````````",
+"````````````````````````````````````````cq``bdbqefcrdzci`s`e``focqcqbncbeoftfdefcyei``eidmbdftefeeasasbqcb``````````````````````````````````````",
+"````````````````````````````````````````````e```al`pbdddee`xddasebacbdbdasebfoe`evbnev`pebbfemciebcyez``````````````````````````````````````````",
+"````````````````````````````````````````````````evevevalbqdzeeeebwdpezezcbcydmaldmeibncqevdmasfkbn``````````````````````````````````````````````",
+"``````````````````````````````````````````````````````accqbdebcyeoeedpbqbqasezdmbdbdezacale`````````````````````````````````````````````````````",
+"``````````````````````````````````````````````````````````````cncbev``evbndmaccrdocb````````````````````````````````````````````````````````````",
+"````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````",
+"````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````"
+};
diff --git a/hacks/images/bubbles/blood2.xpm b/hacks/images/bubbles/blood2.xpm
new file mode 100644 (file)
index 0000000..e252985
--- /dev/null
@@ -0,0 +1,100 @@
+/* XPM */
+static char *blood2[] = {
+/* width height ncolors chars_per_pixel */
+"12 12 81 2",
+/* colors */
+"`` c None",
+"`a c #002E2E",
+"`b c #250000",
+"`c c #000D0D",
+"`d c #212A2A",
+"`e c #000606",
+"`f c #213030",
+"`g c #636A6A",
+"`h c #072A2A",
+"`i c #445C5C",
+"`j c #4D5454",
+"`k c #163535",
+"`l c #000505",
+"`m c #052E2E",
+"`n c #041616",
+"`o c #044444",
+"`p c #76C1C1",
+"`q c #0C4545",
+"`r c #767F7F",
+"`s c #002C2C",
+"`t c #000B0B",
+"`u c #030404",
+"`v c #280404",
+"`w c #385C5C",
+"`x c #354F4F",
+"`y c #001111",
+"`z c #347272",
+"a` c #6E3B3B",
+"aa c #71B1B1",
+"ab c #000A0A",
+"ac c #270C0C",
+"ad c #001717",
+"ae c #253838",
+"af c #418888",
+"ag c #013C3C",
+"ah c #192C2C",
+"ai c #000303",
+"aj c #164040",
+"ak c #032A2A",
+"al c #520B0B",
+"am c #001010",
+"an c #435555",
+"ao c #0C3636",
+"ap c #8EAFAF",
+"aq c #282A2A",
+"ar c #515C5C",
+"as c #1B5555",
+"at c #002A2A",
+"au c #2B3030",
+"av c #4F3939",
+"aw c #AF5C5C",
+"ax c #003737",
+"ay c #010000",
+"az c #001616",
+"b` c #042727",
+"ba c #0C3C3C",
+"bb c #030F0F",
+"bc c #002323",
+"bd c #0C4949",
+"be c #011A1A",
+"bf c #176464",
+"bg c #0F0000",
+"bh c #001C1C",
+"bi c #8A5B5B",
+"bj c #419A9A",
+"bk c #064949",
+"bl c #041919",
+"bm c #001515",
+"bn c #071212",
+"bo c #031B1B",
+"bp c #044040",
+"bq c #0F4E4E",
+"br c gray14",
+"bs c #031414",
+"bt c #063B3B",
+"bu c #2B5C5C",
+"bv c #396363",
+"bw c #182525",
+"bx c #001414",
+"by c #506969",
+"bz c #002121",
+/* pixels */
+"````````bxbpbbagay``````",
+"````abbc`hbqbfaj`m`yai``",
+"`````aac`j`zbi`za``q`o``",
+"``at`vavbjaw`gaa`wbwaq`s",
+"``axaoaeaf`pap`rarbrba`c",
+"``bzbn`d`i`gaaaaan`fbnaz",
+"``beboas`xbyarbiavbw`nbg",
+"``adbsbdahbubvauasbaak`b",
+"`````aagbkal`k`qbkbtam``",
+"````ab`l`t`ublb``eaiay``",
+"````````bh``bm``bg``````",
+"````````````````````````"
+};
diff --git a/hacks/images/bubbles/blood3.xpm b/hacks/images/bubbles/blood3.xpm
new file mode 100644 (file)
index 0000000..81fd4d4
--- /dev/null
@@ -0,0 +1,122 @@
+/* XPM */
+static char *blood3[] = {
+/* width height ncolors chars_per_pixel */
+"14 14 101 2",
+/* colors */
+"`` c None",
+"`a c #102A2A",
+"`b c #250000",
+"`c c #5D1616",
+"`d c #415050",
+"`e c #010404",
+"`f c #3C9090",
+"`g c #251A1A",
+"`h c #095454",
+"`i c #190101",
+"`j c #70D0D0",
+"`k c #000606",
+"`l c #60C0C0",
+"`m c #165D5D",
+"`n c #636A6A",
+"`o c #072A2A",
+"`p c #6C7676",
+"`q c #000C0C",
+"`r c #102222",
+"`s c #4D5454",
+"`t c #163535",
+"`u c #043737",
+"`v c #4F6363",
+"`w c #044444",
+"`x c #76C1C1",
+"`y c #001212",
+"`z c #0C4545",
+"a` c #767F7F",
+"aa c #642525",
+"ab c #360505",
+"ac c #000B0B",
+"ad c #385C5C",
+"ae c #6D8686",
+"af c #000404",
+"ag c #001111",
+"ah c #030A0A",
+"ai c #5AABAB",
+"aj c #001E1E",
+"ak c #6E3B3B",
+"al c #71B1B1",
+"am c #274E4E",
+"an c #0D1A1A",
+"ao c #2B3E3E",
+"ap c #053333",
+"aq c #121515",
+"ar c #270C0C",
+"as c #418888",
+"at c #374343",
+"au c #013C3C",
+"av c #040707",
+"aw c #031D1D",
+"ax c #192C2C",
+"ay c #000303",
+"az c #070000",
+"b` c #164040",
+"ba c #537272",
+"bb c #120E0E",
+"bc c #001010",
+"bd c #062323",
+"be c #282A2A",
+"bf c #0C1515",
+"bg c #515C5C",
+"bh c #1B5555",
+"bi c #002A2A",
+"bj c #2B3030",
+"bk c #4F3939",
+"bl c #000909",
+"bm c #003737",
+"bn c #010000",
+"bo c #001616",
+"bp c #042727",
+"bq c #030F0F",
+"br c #074E4E",
+"bs c #0C4949",
+"bt c #011A1A",
+"bu c #55A1A1",
+"bv c #000F0F",
+"bw c #042020",
+"bx c #419A9A",
+"by c #064949",
+"bz c #1D4F4F",
+"c` c #2D8686",
+"ca c #000101",
+"cb c #286A6A",
+"cc c #044040",
+"cd c #001B1B",
+"ce c #0C4141",
+"cf c #031414",
+"cg c #011212",
+"ch c #172121",
+"ci c #002828",
+"cj c #2B5C5C",
+"ck c #000707",
+"cl c #343A3A",
+"cm c #182525",
+"cn c #364949",
+"co c #AA7979",
+"cp c #506969",
+"cq c #002121",
+"cr c #1C7171",
+"cs c #213E3E",
+/* pixels */
+"``````````cqcqagbiab````````",
+"``````ajawbd`h`ranbdcfbc````",
+"`````bbmaochcbc`cjaaarcf`b``",
+"`````e`zcr`fbxbaas`fbhbfcc``",
+"``bnby`mbjak`lae`jbuam`abebt",
+"``ar`wcmataialcoa`bgatchbw`k",
+"``bt`u`tclcp`pal`x`vclaxavck",
+"``blahbbcb`dba`n`sbkcbaqbqci",
+"``afcgbdb`beadcnatcjbzbrck`q",
+"`````occ`o`c`gcsaxarbfaubl``",
+"````caciazapcebbbsabci`yaw``",
+"``````btafcdbobpbvbl``ag````",
+"``````````acbv`yay`i````````",
+"````````````````````````````"
+};
diff --git a/hacks/images/bubbles/blood4.xpm b/hacks/images/bubbles/blood4.xpm
new file mode 100644 (file)
index 0000000..d4f3ced
--- /dev/null
@@ -0,0 +1,171 @@
+/* XPM */
+static char *blood4[] = {
+/* width height ncolors chars_per_pixel */
+"20 20 144 2",
+/* colors */
+"`` c None",
+"`a c #102A2A",
+"`b c #002E2E",
+"`c c #689494",
+"`d c #250000",
+"`e c #000D0D",
+"`f c #5D1616",
+"`g c #415050",
+"`h c #212A2A",
+"`i c #013232",
+"`j c #095454",
+"`k c #70D0D0",
+"`l c #000606",
+"`m c #0E2E2E",
+"`n c #001313",
+"`o c #115555",
+"`p c #213030",
+"`q c #60C0C0",
+"`r c #002020",
+"`s c #445C5C",
+"`t c #6C7676",
+"`u c #000C0C",
+"`v c #549393",
+"`w c #102222",
+"`x c #4D5454",
+"`y c #002626",
+"`z c #163535",
+"a` c #043737",
+"aa c #4F6363",
+"ab c #000505",
+"ac c #65A0A0",
+"ad c #052E2E",
+"ae c #044444",
+"af c #7ED6D6",
+"ag c #001212",
+"ah c #196969",
+"ai c #385656",
+"aj c #0C4545",
+"ak c #767F7F",
+"al c #642525",
+"am c #002C2C",
+"an c #0E2626",
+"ao c #030404",
+"ap c #001818",
+"aq c #0A0E0E",
+"ar c #385C5C",
+"as c #002525",
+"at c #6D8686",
+"au c #000404",
+"av c #354F4F",
+"aw c #739999",
+"ax c #001111",
+"ay c #5A7D7D",
+"az c #347272",
+"b` c #030A0A",
+"ba c #010808",
+"bb c #001E1E",
+"bc c #6E3B3B",
+"bd c #71B1B1",
+"be c #183C3C",
+"bf c #274E4E",
+"bg c #000A0A",
+"bh c #287373",
+"bi c #0D1A1A",
+"bj c #053333",
+"bk c #270C0C",
+"bl c #001717",
+"bm c #253838",
+"bn c #418888",
+"bo c #374343",
+"bp c #013C3C",
+"bq c #040707",
+"br c #031D1D",
+"bs c #192C2C",
+"bt c #000303",
+"bu c #070000",
+"bv c #164040",
+"bw c #537272",
+"bx c #5B8787",
+"by c #120E0E",
+"bz c #032A2A",
+"c` c #520B0B",
+"ca c #0C3636",
+"cb c #001D1D",
+"cc c #0C1515",
+"cd c #297D7D",
+"ce c #002A2A",
+"cf c #AF5C5C",
+"cg c #000909",
+"ch c #003737",
+"ci c #010000",
+"cj c #001616",
+"ck c #042727",
+"cl c #0C3C3C",
+"cm c #030F0F",
+"cn c #002323",
+"co c #074E4E",
+"cp c #0C4949",
+"cq c #295555",
+"cr c #5E7272",
+"cs c #011A1A",
+"ct c #000202",
+"cu c #55A1A1",
+"cv c #000F0F",
+"cw c #176464",
+"cx c #042020",
+"cy c #0F0000",
+"cz c #001C1C",
+"d` c #8A5B5B",
+"da c #419A9A",
+"db c #420707",
+"dc c #064949",
+"dd c #0C5C5C",
+"de c #001515",
+"df c #071212",
+"dg c #1D4F4F",
+"dh c #154747",
+"di c #2D8686",
+"dj c #000101",
+"dk c #3C1B1B",
+"dl c #286A6A",
+"dm c #044040",
+"dn c #000E0E",
+"do c #264747",
+"dp c #396A6A",
+"dq c #001B1B",
+"dr c gray14",
+"ds c #0C4141",
+"dt c #031414",
+"du c #172121",
+"dv c #002828",
+"dw c #060D0D",
+"dx c #063B3B",
+"dy c #2B5C5C",
+"dz c #000707",
+"e` c #343A3A",
+"ea c #182525",
+"eb c #364949",
+"ec c #001414",
+"ed c #AA7979",
+"ee c #506969",
+"ef c #002121",
+"eg c #1C7171",
+"eh c #213E3E",
+/* pixels */
+"``````````````dzdjcv`rcgadce````````````",
+"``````````axabbp`daecka`bubpcice````````",
+"````````de`u`ick`jds`mdscabjbqde`e``````",
+"``````addbdkca`adgdgcddrahdkc`dt`ian````",
+"`````dcgdtbkegcdazbnd`bodididkajbzcjbg``",
+"````djcxajavbhbcdad`bweecfdadoeackcyas``",
+"``de`ydc`obhbcbc`qbdat`k`qbndybsdsdrcnbu",
+"``dqchdbdhehar`v`qedafakacbxebehcldcdvcb",
+"``apchad`zbmav`v`cawafbd`teear`h`wcx`b`r",
+"``dz`lckca`hboaaayakbdedat`xav`p`wb`blbt",
+"```n`ydwcceheb`seecratd`cubndl`hbibrchbu",
+"``cy`dcmdfbvbfav`g`x`xbwdabccddu`maoefbl",
+"```u`y`ubrcpbedrcqdpaie`ebbfcw`mdrec`b`u",
+"`````r`ibjaeca`oaldlbfbmdhcqbicoa`cgec``",
+"````abcz`dbpadbydd`f`zane`c`dwdxcg`raq``",
+"``````djbtam`ibrb`addcbkbjdmcxcs``cz````",
+"````````axdq`ldecbbaas`l`rbgblabdj``````",
+"````````````buaxdzaubbbbctcgbudn````````",
+"``````````````btagbycg`ebtab````````````",
+"````````````````````````````````````````"
+};
diff --git a/hacks/images/bubbles/blood5.xpm b/hacks/images/bubbles/blood5.xpm
new file mode 100644 (file)
index 0000000..76f2471
--- /dev/null
@@ -0,0 +1,201 @@
+/* XPM */
+static char *blood5[] = {
+/* width height ncolors chars_per_pixel */
+"24 24 170 2",
+/* colors */
+"`` c None",
+"`a c #102A2A",
+"`b c #002E2E",
+"`c c #689494",
+"`d c #250000",
+"`e c #000D0D",
+"`f c #5D1616",
+"`g c #415050",
+"`h c #212A2A",
+"`i c #013232",
+"`j c #3C9090",
+"`k c #251A1A",
+"`l c #095454",
+"`m c #190101",
+"`n c #000606",
+"`o c #003434",
+"`p c #0E2E2E",
+"`q c #001313",
+"`r c #115555",
+"`s c #213030",
+"`t c #60C0C0",
+"`u c #0F0404",
+"`v c #002020",
+"`w c #165D5D",
+"`x c #636A6A",
+"`y c #072A2A",
+"`z c #445C5C",
+"a` c #6C7676",
+"aa c #000C0C",
+"ab c #001919",
+"ac c #102222",
+"ad c #4D5454",
+"ae c #002626",
+"af c #163535",
+"ag c #4F6363",
+"ah c #000505",
+"ai c #65A0A0",
+"aj c #052E2E",
+"ak c #041616",
+"al c #044444",
+"am c #76C1C1",
+"an c #7ED6D6",
+"ao c #196969",
+"ap c #385656",
+"aq c #0C4545",
+"ar c #767F7F",
+"as c #642525",
+"at c #360505",
+"au c #5FB4B4",
+"av c #002C2C",
+"aw c #8C9B9B",
+"ax c #000B0B",
+"ay c #030404",
+"az c #001818",
+"b` c #280404",
+"ba c #0A0E0E",
+"bb c #385C5C",
+"bc c #002525",
+"bd c #407E7E",
+"be c #354F4F",
+"bf c #739999",
+"bg c #001111",
+"bh c #5A7D7D",
+"bi c #347272",
+"bj c #030A0A",
+"bk c #5AABAB",
+"bl c #010808",
+"bm c #001E1E",
+"bn c #6E3B3B",
+"bo c #71B1B1",
+"bp c #274E4E",
+"bq c #266464",
+"br c #000A0A",
+"bs c #2B3E3E",
+"bt c #053333",
+"bu c #121515",
+"bv c #270C0C",
+"bw c #001717",
+"bx c #253838",
+"by c #418888",
+"bz c #374343",
+"c` c #013C3C",
+"ca c #040707",
+"cb c #031D1D",
+"cc c #192C2C",
+"cd c #000303",
+"ce c #070000",
+"cf c #164040",
+"cg c #537272",
+"ch c #5B8787",
+"ci c #120E0E",
+"cj c #032A2A",
+"ck c #520B0B",
+"cl c #001010",
+"cm c #062323",
+"cn c #435555",
+"co c #0C3636",
+"cp c #8EAFAF",
+"cq c #282A2A",
+"cr c #001D1D",
+"cs c #0C1515",
+"ct c #515C5C",
+"cu c #1B5555",
+"cv c #297D7D",
+"cw c #002A2A",
+"cx c #2B3030",
+"cy c #4F3939",
+"cz c #AF5C5C",
+"d` c #000909",
+"da c #003737",
+"db c #010000",
+"dc c #001616",
+"dd c #042727",
+"de c #0C3C3C",
+"df c #030F0F",
+"dg c #010D0D",
+"dh c #002323",
+"di c #074E4E",
+"dj c #0C4949",
+"dk c #295555",
+"dl c #5E7272",
+"dm c #011A1A",
+"dn c #000202",
+"do c #000F0F",
+"dp c #176464",
+"dq c #042020",
+"dr c #0F0000",
+"ds c #001C1C",
+"dt c #8A5B5B",
+"du c #419A9A",
+"dv c #000808",
+"dw c #205C5C",
+"dx c #420707",
+"dy c #064949",
+"dz c #041919",
+"e` c #0C5C5C",
+"ea c #001515",
+"eb c #071212",
+"ec c #1D4F4F",
+"ed c #171B1B",
+"ee c #154747",
+"ef c #2D8686",
+"eg c #031B1B",
+"eh c #000101",
+"ei c #3C1B1B",
+"ej c #286A6A",
+"ek c #044040",
+"el c #000E0E",
+"em c #264747",
+"en c #0F4E4E",
+"eo c #0D1E1E",
+"ep c #001B1B",
+"eq c gray14",
+"er c #031414",
+"es c #172121",
+"et c #060D0D",
+"eu c #063B3B",
+"ev c #2B5C5C",
+"ew c #000707",
+"ex c #343A3A",
+"ey c #396363",
+"ez c #182525",
+"f` c #364949",
+"fa c #001414",
+"fb c #467373",
+"fc c #AA7979",
+"fd c #506969",
+"fe c #002121",
+"ff c #1C7171",
+"fg c #213E3E",
+/* pixels */
+"``````````````````cdew`v`bdoelci````````````````",
+"``````````````eafac`ekcbdffec`eqdbab````````````",
+"``````````ewaxbw`hbt`l`lcse`btajbjaec`dc````````",
+"````````brdadhcb`ycoenbudpencfe`ajcabgewcd``````",
+"``````ea`iat`ue`edafdwbpeffgejffaocicbegelfe````",
+"``````dv`bakbvffadbqbi`jdtbebicvbn`kaqdqalaj````",
+"````cmbmbjdyf`ffbybd`jczcgadbkbnefec`aeob`fe`d``",
+"````cwdab`e`cycvduarczai`xauboczbbcqezcocqc`av``",
+"```mcedrck`waocvarbodtambfbf`tczcneyem`p`l`dehci",
+"```qdaeicobubxapbybkamawcpboarbhctbzeqesdeaj`eep",
+"``ax`qdxbaaf`hapfbai`cbfananbfdlfbap`hezbadddmaz",
+"``brfeatebaf`hex`zdl`xa`bofcboagcnbz`s`aebdqdcaa",
+"``dvfadaakacfgbs`gcgdl`x`cdtauchbydk`sbuetda`oaz",
+"``cidmcbegeocudwbe`gfdcgctchdtbncyasezeoakdmdrdm",
+"``brfebcakebenafbxexbb`z`g`gapbicvaobudydqblav`u",
+"````bw`meraldjafccbxevbieyf`cxdkcu`pdeeicjah`d``",
+"````ahcw`oc`ek`yeeeieidwfgeq`s`w`fbab`ekdoewah``",
+"``````dv`batc`ajdyaqck`raf`paqexdydzeuaacl`m````",
+"``````dnewbg`o`pekebbtdyeidicqcacjcj`vewbm``````",
+"````````braaahd`axblayaydzdzddcj`nelcdahdb``````",
+"``````````bjcrbwdnfadcd`aedgdoaaaaaxep``````````",
+"````````````````dsbw``cdeads``axdrbg````````````",
+"``````````````````aadodrbgd`eldn````````````````",
+"````````````````````````````````````````````````"
+};
diff --git a/hacks/images/bubbles/blood6.xpm b/hacks/images/bubbles/blood6.xpm
new file mode 100644 (file)
index 0000000..50a6c22
--- /dev/null
@@ -0,0 +1,220 @@
+/* XPM */
+static char *blood6[] = {
+/* width height ncolors chars_per_pixel */
+"30 30 183 2",
+/* colors */
+"`` c None",
+"`a c #102A2A",
+"`b c #002E2E",
+"`c c #689494",
+"`d c #250000",
+"`e c #000D0D",
+"`f c #5D1616",
+"`g c #415050",
+"`h c #212A2A",
+"`i c #010404",
+"`j c #013232",
+"`k c #3C9090",
+"`l c #251A1A",
+"`m c #095454",
+"`n c #190101",
+"`o c #70D0D0",
+"`p c #000606",
+"`q c #003434",
+"`r c #0E2E2E",
+"`s c #001313",
+"`t c #115555",
+"`u c #213030",
+"`v c #60C0C0",
+"`w c #0F0404",
+"`x c #002020",
+"`y c #165D5D",
+"`z c #636A6A",
+"a` c #072A2A",
+"aa c #445C5C",
+"ab c #6C7676",
+"ac c #000C0C",
+"ad c #549393",
+"ae c #001919",
+"af c #102222",
+"ag c #4D5454",
+"ah c #002626",
+"ai c #163535",
+"aj c #043737",
+"ak c #4F6363",
+"al c #000505",
+"am c #65A0A0",
+"an c #052E2E",
+"ao c #041616",
+"ap c #044444",
+"aq c #76C1C1",
+"ar c #7ED6D6",
+"as c #001212",
+"at c #196969",
+"au c #385656",
+"av c #0C4545",
+"aw c #767F7F",
+"ax c #642525",
+"ay c #360505",
+"az c gray28",
+"b` c #000B0B",
+"ba c #030404",
+"bb c #001818",
+"bc c #944040",
+"bd c #280404",
+"be c #0A0E0E",
+"bf c #385C5C",
+"bg c #002525",
+"bh c #6D8686",
+"bi c #407E7E",
+"bj c #000404",
+"bk c #354F4F",
+"bl c #739999",
+"bm c #001111",
+"bn c #5A7D7D",
+"bo c #347272",
+"bp c #030A0A",
+"bq c #5AABAB",
+"br c #001E1E",
+"bs c #6E3B3B",
+"bt c #71B1B1",
+"bu c #183C3C",
+"bv c #274E4E",
+"bw c #266464",
+"bx c #000A0A",
+"by c #287373",
+"bz c #0D1A1A",
+"c` c #2B3E3E",
+"ca c #053333",
+"cb c #121515",
+"cc c #270C0C",
+"cd c #001717",
+"ce c #253838",
+"cf c #418888",
+"cg c #374343",
+"ch c #013C3C",
+"ci c #040707",
+"cj c #031D1D",
+"ck c #192C2C",
+"cl c #000303",
+"cm c #070000",
+"cn c #164040",
+"co c #537272",
+"cp c #5B8787",
+"cq c #120E0E",
+"cr c #032A2A",
+"cs c #520B0B",
+"ct c #001010",
+"cu c #062323",
+"cv c #435555",
+"cw c #0C3636",
+"cx c #8EAFAF",
+"cy c #282A2A",
+"cz c #001D1D",
+"d` c #0C1515",
+"da c #515C5C",
+"db c #1B5555",
+"dc c #297D7D",
+"dd c #002A2A",
+"de c #2B3030",
+"df c #4F3939",
+"dg c #AF5C5C",
+"dh c #000909",
+"di c #003737",
+"dj c #010000",
+"dk c #001616",
+"dl c #042727",
+"dm c #0C3C3C",
+"dn c #030F0F",
+"do c #010D0D",
+"dp c #002323",
+"dq c #074E4E",
+"dr c #0C4949",
+"ds c #295555",
+"dt c #5E7272",
+"du c #011A1A",
+"dv c #000202",
+"dw c #55A1A1",
+"dx c #000F0F",
+"dy c #176464",
+"dz c #042020",
+"e` c #0F0000",
+"ea c #001C1C",
+"eb c #8A5B5B",
+"ec c #419A9A",
+"ed c #000808",
+"ee c #205C5C",
+"ef c #420707",
+"eg c #064949",
+"eh c #041919",
+"ei c #0C5C5C",
+"ej c #001515",
+"ek c #071212",
+"el c #1D4F4F",
+"em c #171B1B",
+"en c #154747",
+"eo c #2D8686",
+"ep c #031B1B",
+"eq c #000101",
+"er c #3C1B1B",
+"es c #286A6A",
+"et c #044040",
+"eu c #000E0E",
+"ev c #264747",
+"ew c #0F4E4E",
+"ex c #0D1E1E",
+"ey c #396A6A",
+"ez c #001B1B",
+"f` c gray14",
+"fa c #0C4141",
+"fb c #031414",
+"fc c #172121",
+"fd c #002828",
+"fe c #060D0D",
+"ff c #063B3B",
+"fg c #2B5C5C",
+"fh c #645C5C",
+"fi c #000707",
+"fj c #343A3A",
+"fk c #396363",
+"fl c #182525",
+"fm c #364949",
+"fn c #001414",
+"fo c #467373",
+"fp c #AA7979",
+"fq c #506969",
+"fr c #002121",
+"fs c #1C7171",
+"ft c #213E3E",
+/* pixels */
+"````````````````````````dx`eahddahdvdx``````````````````````",
+"``````````````````dp``dufrdxej`ieqbg`n`dddbr````````````````",
+"````````````````dxalddfa`ddqetdldzbdcmchchdj`b``````````````",
+"````````````b``efn`japanegeifabeeidmekcibafr`xfded``````````",
+"``````````bxdi`qdocua`cwdr`afldy`yemaveianehbpfnalcl````````",
+"````````ct`nefbdcacwcbfcelbweedcdsftatbwdycscabp`jfrcm``````",
+"````````ctdicjanel`fdybwesbobodfbkfgesby`fdyeia`caddcc``````",
+"``````dkezdnaofabk`yerdceycfazcfaaeyfh`keofsatd`crapalcd````",
+"````fneq`ifbavbvbfbyeoececblbqcodaaddgbceoevcncbdlbdetbg`e``",
+"````cqejdibdeiataxeoecbcbq`v`c`zam`vdgbhbfde`hemfacy`l`scb``",
+"`````ddiefde`fdbbodtbcdgcx`oambhbl`v`vdgazfkevfldrer`wdddk``",
+"``bmaydibd`menftcebfcfbq`vfpararbtawamdwakfmevfcdmdmapfdbxdx",
+"``fi`bayegbzaf`hdebkbibqambtarfp`obl`zfhakfkdebucbdmdlch``cq",
+"``dxacbrapbeenfcevaufoad`cbhblarfpaqbh`zfoauceceembecjdpbxdk",
+"``fnez`papekcwfcc`cgaacobnababbtfp`obhakcvbkce`uafekdncd``fr",
+"``bbeabx`jd`afckevcg`gakfhdtbhbtebbqcpbnbibfcefcexekandifdfi",
+"``cddv`bbaekd`cneldsau`gcocodtdt`cfhebbhbceoftemd`cidz`bbg`s",
+"``dh`p`ddodzekaienbvfmfm`gagagagfqbiecebbsdccncb`rcjbpfrfrdx",
+"````asembbdnfedmenck`udebffkaaazazcgbfesbwax`rdmegdl`i`bac``",
+"````b`ezccfbcaegdraick`hbweseyfkc`evc`dsdbcnbzerf`crdvdddj``",
+"`````p`x`j`bcaegcwcwcnataxazbvbvf``uen`ycbbzcabdajfnedfndo``",
+"``````dvdue`caefana`av`tbv`lenbuckfcbvc``mbeffcwaeedeaeu````",
+"``````````ej`jbdajanaya`dmewfj`tavfaercqffaodldpeufnfn``````",
+"````````bjeqcl`xfl`janehbpcua`egcsefcacidldz`xeu``brcl``````",
+"``````````bxacbjdvacb``pbabpciehepcjdlah`pdkeq``b`dj````````",
+"`````````````e`ncd`ebxbbdubm`s`bctdhbbdxcd`pej`seq``````````",
+"````````````````bjcmczctfieqdxbrahbbdvdv`scmcd``````````````",
+"``````````````````aldvace`ejb`bmalbjedcdbm`p````````````````",
+"````````````````````````dxbjdhcte`cicm``````````````````````",
+"````````````````````````````````````````````````````````````"
+};
diff --git a/hacks/images/bubbles/blood7.xpm b/hacks/images/bubbles/blood7.xpm
new file mode 100644 (file)
index 0000000..81a71ca
--- /dev/null
@@ -0,0 +1,228 @@
+/* XPM */
+static char *blood7[] = {
+/* width height ncolors chars_per_pixel */
+"36 36 185 2",
+/* colors */
+"`` c None",
+"`a c #102A2A",
+"`b c #002E2E",
+"`c c #689494",
+"`d c #250000",
+"`e c #000D0D",
+"`f c #5D1616",
+"`g c #415050",
+"`h c #212A2A",
+"`i c #013232",
+"`j c #3C9090",
+"`k c #251A1A",
+"`l c #095454",
+"`m c #190101",
+"`n c #70D0D0",
+"`o c #000606",
+"`p c #003434",
+"`q c #0E2E2E",
+"`r c #001313",
+"`s c #115555",
+"`t c #213030",
+"`u c #60C0C0",
+"`v c #0F0404",
+"`w c #002020",
+"`x c #165D5D",
+"`y c #636A6A",
+"`z c #072A2A",
+"a` c #445C5C",
+"aa c #6C7676",
+"ab c #000C0C",
+"ac c #549393",
+"ad c #001919",
+"ae c #102222",
+"af c #4D5454",
+"ag c #002626",
+"ah c #163535",
+"ai c #043737",
+"aj c #4F6363",
+"ak c #000505",
+"al c #65A0A0",
+"am c #052E2E",
+"an c #041616",
+"ao c #044444",
+"ap c #76C1C1",
+"aq c #7ED6D6",
+"ar c #001212",
+"as c #196969",
+"at c #385656",
+"au c #0C4545",
+"av c #767F7F",
+"aw c #642525",
+"ax c #360505",
+"ay c gray28",
+"az c #5FB4B4",
+"b` c #002C2C",
+"ba c #0E2626",
+"bb c #000B0B",
+"bc c #030404",
+"bd c #001818",
+"be c #944040",
+"bf c #280404",
+"bg c #0A0E0E",
+"bh c #385C5C",
+"bi c #002525",
+"bj c #6D8686",
+"bk c #407E7E",
+"bl c #000404",
+"bm c #354F4F",
+"bn c #739999",
+"bo c #001111",
+"bp c #5A7D7D",
+"bq c #347272",
+"br c #030A0A",
+"bs c #5AABAB",
+"bt c #010808",
+"bu c #001E1E",
+"bv c #6E3B3B",
+"bw c #71B1B1",
+"bx c #183C3C",
+"by c #274E4E",
+"bz c #266464",
+"c` c #000A0A",
+"ca c #287373",
+"cb c #0D1A1A",
+"cc c #2B3E3E",
+"cd c #053333",
+"ce c #121515",
+"cf c #270C0C",
+"cg c #001717",
+"ch c #253838",
+"ci c #418888",
+"cj c #374343",
+"ck c #013C3C",
+"cl c #040707",
+"cm c #031D1D",
+"cn c #192C2C",
+"co c #000303",
+"cp c #164040",
+"cq c #537272",
+"cr c #120E0E",
+"cs c #032A2A",
+"ct c #520B0B",
+"cu c #001010",
+"cv c #062323",
+"cw c #435555",
+"cx c #0C3636",
+"cy c #8EAFAF",
+"cz c #282A2A",
+"d` c #001D1D",
+"da c #0C1515",
+"db c #515C5C",
+"dc c #1B5555",
+"dd c #297D7D",
+"de c #002A2A",
+"df c #2B3030",
+"dg c #4F3939",
+"dh c #AF5C5C",
+"di c #000909",
+"dj c #003737",
+"dk c #010000",
+"dl c #001616",
+"dm c #042727",
+"dn c #0C3C3C",
+"do c #030F0F",
+"dp c #010D0D",
+"dq c #002323",
+"dr c #074E4E",
+"ds c #0C4949",
+"dt c #295555",
+"du c #5E7272",
+"dv c #011A1A",
+"dw c #000202",
+"dx c #55A1A1",
+"dy c #000F0F",
+"dz c #176464",
+"e` c #042020",
+"ea c #0F0000",
+"eb c #001C1C",
+"ec c #8A5B5B",
+"ed c #419A9A",
+"ee c #000808",
+"ef c #205C5C",
+"eg c #420707",
+"eh c #064949",
+"ei c #041919",
+"ej c #0C5C5C",
+"ek c #001515",
+"el c #071212",
+"em c #1D4F4F",
+"en c #171B1B",
+"eo c #154747",
+"ep c #2D8686",
+"eq c #031B1B",
+"er c #000101",
+"es c #3C1B1B",
+"et c #286A6A",
+"eu c #044040",
+"ev c #000E0E",
+"ew c #264747",
+"ex c #0F4E4E",
+"ey c #0D1E1E",
+"ez c #396A6A",
+"f` c #001B1B",
+"fa c gray14",
+"fb c #0C4141",
+"fc c #031414",
+"fd c #172121",
+"fe c #002828",
+"ff c #060D0D",
+"fg c #063B3B",
+"fh c #2B5C5C",
+"fi c #645C5C",
+"fj c #000707",
+"fk c #343A3A",
+"fl c #396363",
+"fm c #182525",
+"fn c #364949",
+"fo c #001414",
+"fp c #467373",
+"fq c #AA7979",
+"fr c #506969",
+"fs c #022323",
+"ft c #002121",
+"fu c #1C7171",
+"fv c #213E3E",
+/* pixels */
+"````````````````````````````````c``efoardw``````````````````````````````",
+"````````````````````````cobb`oftf`cuarevdldk`mdeag``````````````````````",
+"````````````````````cueefodjaheub`fcdofcagckeuaxdk`kdv``````````````````",
+"``````````````````ekcoaddj`tao`l`leudme`eoczdr`ife`pdkbf````````````````",
+"``````````````c`dvfjdl`pehcveuejdsdncbccdsbgcveqbrdvc`bibuee````````````",
+"````````````c``qdjdqbrdm`zdnauexfdfmdzdz`acpdsejame`dpbo`r`oco``````````",
+"``````````cuaxaxegdrcvbacrahahemembzezef`hefdz`f`ffkaocle`f`fte`````````",
+"``````````de`icke`ctewbyeofvbzcafhfhbefhdfetbzbvdg`sesamcl`pf`ax````````",
+"````````ebdi`bfceicf`ffuafcaetbqbkedecbqfnbqepddbv`f`fauanaiaodwab``````",
+"``````ebfjadbrfffb`sfhfudbepezci`cdxcifra`edbe`jbkfudz`qbgcd`h`b`par````",
+"``````ftarebcmehcfbmfucaepbveddxfqacdudbbpecbjaaepby`tfdeyamczesad`m````",
+"````eedecuaobfewdzdgbvepedaydxdhal`c`yal`ubwdhdxbhfk`hfmeydnczegdeb``m``",
+"````ce`p`kfafv`f`sfuawbebeaf`udhbwbnbjbn`u`ufqbsayezewchfmexesbfcxcoe```",
+"`````weaax`mctejdcemdtbqacdx`ufqcy`nbwbnbjalalbsa`bhdtewfdexeh`heucoft``",
+"````agdjcxfacxaeenchccatcidxazapaqfqcy`nbjavbjcqdbbhfkfafdbadnai`i`ebd``",
+"``fjcgdq`maoel`aenchfkcjfpbsalbnbnapaqaqbnbn`yajajflcj`tahcb`qdm`bbifoek",
+"``addw`o`baodaexfd`hfh`gfpac`cbjbnbnaqavapbwduajfrbhfkchbxeybgei`idldwcg",
+"```mboftageuelcxcn`hccbma`frdu`yaaavbwcyapbwduajcwatdf`tcneyelclb`dldw`r",
+"``eadl`rftcselaeenfvccfnayajfr`yaa`cbwfq`ualbpcqfpflewfveneydae``pdedqbd",
+"``fffo`oeabcelbgeneofhfnatcwajdubp`ybjbsfidhdx`jciddewfmendaffcmckaxdefj",
+"````ekdvckbreqcbaedcbzbybmcja`frcqfrdbbpdxecaabvdgaweffmcebaananbueabu``",
+"`````wag`pdpcmelcxcpeofvccfnfkay`gafafajajfp`jciawafefen`qcdcmbt`raedv``",
+"````d`c``dfobrbr`qdseocn`hczbmbhezbhayfnfkbmfhfhefescpbadrehfsakekdq`m``",
+"````c`cgagdjfccsehdsdsahcnfadtfhbqezfldffndfccemdc`scedn`mahcserar`ddw``",
+"```````obi`bde`iaoehcxcxcpemasawcafhfhczew`hdc`xes`acbauegamadakfjar````",
+"``````fjeb`d`k`maxaoamfbexctdzdz`feocpcnenbx`xesemba`z`maiftdiee`efj````",
+"````````blak`bfddkckcvameh`lexctcecpahahbaaucrczeheldmfgft`ocu`mad``````",
+"``````````akfjfo`peack`kegaieyds`ldfegexauescr`vcdeidmdef`abd`ad````````",
+"``````````bl``dwdydqb``bfsdodoeie`dmaoaxbxamfgfafsdl`weverfj`mbl````````",
+"````````````c`c`abakerabbb`o`obcclbreieiandmagft`odvakcoeec`dk``````````",
+"```````````````e`mcgbb`obbdvf``wbbcgcsdl`odldvbbdycudiadfobl````````````",
+"``````````````````dybud`ev`ofjbber`rdvdqarfjblakblar`m`m````````````````",
+"````````````````````cobbebdv`r``coblekf`cu``difoeaarc```````````````````",
+"````````````````````````ererboeabuevc`didiblerarbl``````````````````````",
+"````````````````````````````````c```blabdk``````````````````````````````",
+"````````````````````````````````````````````````````````````````````````"
+};
diff --git a/hacks/images/bubbles/blood8.xpm b/hacks/images/bubbles/blood8.xpm
new file mode 100644 (file)
index 0000000..050b6e2
--- /dev/null
@@ -0,0 +1,241 @@
+/* XPM */
+static char *blood8[] = {
+/* width height ncolors chars_per_pixel */
+"44 44 190 2",
+/* colors */
+"`` c None",
+"`a c #102A2A",
+"`b c #002E2E",
+"`c c #689494",
+"`d c #250000",
+"`e c #000D0D",
+"`f c #5D1616",
+"`g c #415050",
+"`h c #212A2A",
+"`i c #010404",
+"`j c #013232",
+"`k c #3C9090",
+"`l c #251A1A",
+"`m c #095454",
+"`n c #190101",
+"`o c #70D0D0",
+"`p c #000606",
+"`q c #003434",
+"`r c #0E2E2E",
+"`s c #001313",
+"`t c #115555",
+"`u c #213030",
+"`v c #60C0C0",
+"`w c #0F0404",
+"`x c #002020",
+"`y c #165D5D",
+"`z c #636A6A",
+"a` c #072A2A",
+"aa c #445C5C",
+"ab c #6C7676",
+"ac c #000C0C",
+"ad c #549393",
+"ae c #001919",
+"af c #102222",
+"ag c #4D5454",
+"ah c #002626",
+"ai c #163535",
+"aj c #043737",
+"ak c #4F6363",
+"al c #000505",
+"am c #65A0A0",
+"an c #052E2E",
+"ao c #041616",
+"ap c #044444",
+"aq c #76C1C1",
+"ar c #7ED6D6",
+"as c #001212",
+"at c #196969",
+"au c #385656",
+"av c #0C4545",
+"aw c #767F7F",
+"ax c #642525",
+"ay c #360505",
+"az c gray28",
+"b` c #5FB4B4",
+"ba c #002C2C",
+"bb c #0E2626",
+"bc c #8C9B9B",
+"bd c #000B0B",
+"be c #030404",
+"bf c #001818",
+"bg c #944040",
+"bh c #280404",
+"bi c #0A0E0E",
+"bj c #385C5C",
+"bk c #002525",
+"bl c #6D8686",
+"bm c #407E7E",
+"bn c #000404",
+"bo c #354F4F",
+"bp c #739999",
+"bq c #001111",
+"br c #5A7D7D",
+"bs c #347272",
+"bt c #030A0A",
+"bu c #5AABAB",
+"bv c #010808",
+"bw c #001E1E",
+"bx c #6E3B3B",
+"by c #71B1B1",
+"bz c #183C3C",
+"c` c #274E4E",
+"ca c #266464",
+"cb c #000A0A",
+"cc c #287373",
+"cd c #0D1A1A",
+"ce c #2B3E3E",
+"cf c #053333",
+"cg c #121515",
+"ch c #270C0C",
+"ci c #001717",
+"cj c #253838",
+"ck c #418888",
+"cl c #374343",
+"cm c #013C3C",
+"cn c #040707",
+"co c #031D1D",
+"cp c #192C2C",
+"cq c #000303",
+"cr c #070000",
+"cs c #164040",
+"ct c #537272",
+"cu c #5B8787",
+"cv c #120E0E",
+"cw c #032A2A",
+"cx c #520B0B",
+"cy c #001010",
+"cz c #062323",
+"d` c #435555",
+"da c #0C3636",
+"db c #8EAFAF",
+"dc c #282A2A",
+"dd c #001D1D",
+"de c #0C1515",
+"df c #515C5C",
+"dg c #1B5555",
+"dh c #297D7D",
+"di c #002A2A",
+"dj c #2B3030",
+"dk c #4F3939",
+"dl c #AF5C5C",
+"dm c #000909",
+"dn c #003737",
+"do c #010000",
+"dp c #001616",
+"dq c #042727",
+"dr c #0C3C3C",
+"ds c #030F0F",
+"dt c #010D0D",
+"du c #002323",
+"dv c #074E4E",
+"dw c #0C4949",
+"dx c #295555",
+"dy c #5E7272",
+"dz c #011A1A",
+"e` c #000202",
+"ea c #55A1A1",
+"eb c #000F0F",
+"ec c #176464",
+"ed c #042020",
+"ee c #0F0000",
+"ef c #001C1C",
+"eg c #8A5B5B",
+"eh c #419A9A",
+"ei c #000808",
+"ej c #205C5C",
+"ek c #420707",
+"el c #064949",
+"em c #041919",
+"en c #0C5C5C",
+"eo c #001515",
+"ep c #071212",
+"eq c #1D4F4F",
+"er c #171B1B",
+"es c #154747",
+"et c #2D8686",
+"eu c #031B1B",
+"ev c #000101",
+"ew c #3C1B1B",
+"ex c #286A6A",
+"ey c #044040",
+"ez c #000E0E",
+"f` c #264747",
+"fa c #0F4E4E",
+"fb c #0D1E1E",
+"fc c #396A6A",
+"fd c #001B1B",
+"fe c gray14",
+"ff c #0C4141",
+"fg c #031414",
+"fh c #011212",
+"fi c #172121",
+"fj c #002828",
+"fk c #060D0D",
+"fl c #063B3B",
+"fm c #2B5C5C",
+"fn c #645C5C",
+"fo c #000707",
+"fp c #343A3A",
+"fq c #396363",
+"fr c #182525",
+"fs c #364949",
+"ft c #001414",
+"fu c #467373",
+"fv c #AA7979",
+"fw c #506969",
+"fx c #022323",
+"fy c #002121",
+"fz c #1C7171",
+"g` c #213E3E",
+/* pixels */
+"````````````````````````````````````````````ac``````````````````````````````````````````",
+"`````````````````````````````````peie`bnbddidicicqae`xbwcg``````````````````````````````",
+"````````````````````````````cqcqddfydieoezebfoezbqahee`n`n`rbw``````````````````````````",
+"`````````````````````````pcbac`jap`nekapcweuaofhanapffekekdocr`dfd``````````````````````",
+"````````````````````ev`sal`pdieleleyel`m`mfla`emelbhdjelajfydn`jdo`ncd``````````````````",
+"``````````````````eveoezeobaelajdqfldv`mdw`rde`mcx`rfkemepdscncocbdidueo````````````````",
+"````````````````fo`bdndd`idqcfa`drdr`tfa`acgesatesfbdafadvfledfkbvacftbnev``````````````",
+"``````````````fj`dcmcmcmdsfkbibbdaaffrcpaidgccecaics`t`tdxfpffa`cnfg`baebqac````````````",
+"````````````ch`dcp`ddvcxcfdwfferercsejexc`caetex`uf`atfzaz`fenchdvemdsahcy`bcg``````````",
+"``````````dzef`xeycoedewench`yesdgcaexccfmbsbxfcdjdxcacafcew`ydkenajdsdqcmezchef````````",
+"``````````dzalfybwaodqch`ffz`fbscccabsbmckbgegbmclbjetetdhbxax`l`favczdqai`bacft````````",
+"````````crbdbwdtbtcodrenaxejaadcdhfqfu`kbgehckfwd`fucufp`ketaaatatdabiedapcmbwaf`s``````",
+"````````fteoevfgemelfpclfzfzdh`z`k`k`kbudladbrctdfadazehbr`kccc`eq`adeczaj`ncpei`d``````",
+"``````eoftfoahajekekcv`ldhdhdhehbxadeadlea`c`zbrcub`fnbxabbmbocj`uercg`rapcxeydiahdu````",
+"```````dahdiewayes`mecdkaxbxckegazbudl`vam`cab`c`oaqfvdlbufqfsfp`hfrfidrdvcnek`qacbk````",
+"````dd`ndnayewcjcvcl`tfzbxbg`zbgegb`eg`obybpblawby`v`vdlblaafqfqf`g`fidr`mdj`n`lacdp`n``",
+"````fy`day`d`wayewecdgdgdxfcckehbu`vfvab`oaqbybpaw`cambubufu`gfqc`f`frdr`mdvfefeebbdfy``",
+"````ci`ddn`lbhdvdr`acpcjceaufcadeab``odbfvfvdb`obpawbl`ccuakaafpce`ufr`adafleybadzebdd``",
+"````dp`j`j`heldqdeaferg`djbod`adbuambybyaqarawarbyblab`zdfdffcbjdj`uaicgfbfled`jbaevbw``",
+"`````scibwdrelembbaier`uf`auazbradam`cbpbpbyarfvaqbpbl`zdyctfubjce`hbzfrdeemczcwduevbw``",
+"````cq``bddnelepavbzfi`udxboazbrad`cblblbpbpaqbcaraqam`zfwfwaaclfpg`bzfr`acnco`jftalci``",
+"``eefofddp`jeyao`raifi`hf`fp`gakctdyababawblbyaraw`oam`zakagaafsdj`ucp`afbepbt`beoe`al`p",
+"````ezbw`efjajfkbbfberg`cecl`gazdfak`zababbpbydbdlbycudyfwakfcauceg`erafdeepeddn`bfdac``",
+"````cbbqevchdtepcdfbfrg`c`fsfpd`akct`zdy`zab`cb`eg`vbuadckckckfmcjcpcgcgbifkfxdndnafbk``",
+"````fd`p`scmcnepfkcv`rdgejfmfpau`gakbrctcu`zdycueafndlegbgbgfudhf`cpcgdedefkao`j`bah`d``",
+"````eeacahdn`iembibbbbesejdxdjboclaaakakfwdfdffwcueablabbgbxaxdkdgficgbba`cobfftbafyeo``",
+"````fdever`bdscnedepdrcscsg`dcf`clfp`gazd`agagaaakaafuck`kbgaxfzeqer`adadqaobt`s`jeodp``",
+"````ezebbk`deobeemaodafafaai`hdjdjfsbjfqfcaaazazclclaufqfmfmfzatbzafavelflfhalaceedmfk``",
+"``````ezefa``qdscncfffdwesbzfifefef`dxfqbsfcfqfpclfpfpc`dxeqboescgdacx`u`ledalaschef````",
+"````````fdcwer`xbkfldw`mffdaaiaiaiejexccexexexcjc`cj`uf`dgat`yafcdffayfe`baefocqfy`s````",
+"````````cbbk`bdn`jflapapda`rdr`tfsaxewaxcaf`g``u`h`hbz`yeccgfadebbewbhcmfjeidmbn`e``````",
+"``````````dzfjereebhekapcfa`av`tf``tdk`lecbzcscpfrcpeqc``fenfffkcfekcmfyebcqacasfo``````",
+"``````````e`e`ahdiay`ncmfxa`ajdcfadwfp`fdgcsaiai`a`r`tchdjesanfgcwflcwcbacaeeedd````````",
+"````````````bnfobq`jee`ndnajewewanfbavdwekcvewdwffdwcxaycnapdsemah`bbw`sasdueo`e````````",
+"``````````````ev`ecbbw`jchdn`hanczcnczanfldaescxbzayflelcnflbeahfybwacaldp`ncb``````````",
+"``````````````cb``e`bdcbcibffddtbebebeepepaoancffldqeuajeyfyebbwftei`pbnbwee````````````",
+"````````````````ezcy`sace`cb`p`pbqdpdsbebteudqbedteudqbkfde`aebqal``bn``bd``````````````",
+"``````````````````fh`naecybdcb`eaeciddfhdtdzdiddfocbaeci`edmae`pcyfdft`p````````````````",
+"````````````````````btdpbwefcidmalfocy`pbdftefbkbfeialbnale`bnbf`nepdm``````````````````",
+"````````````````````````cqebcvfycibqeibn```ebwbkbkaccqalebeoeebq````````````````````````",
+"``````````````````````````````bnbdcvdeftebbdasbdevbncqcydzasbq``````````````````````````",
+"````````````````````````````````ei`pbqft`nbqbdac`eacdmcqev``````````````````````````````",
+"````````````````````````````````````````````e```````````````````````````````````````````",
+"````````````````````````````````````````````````````````````````````````````````````````"
+};
diff --git a/hacks/images/bubbles/blood9.xpm b/hacks/images/bubbles/blood9.xpm
new file mode 100644 (file)
index 0000000..e6efa9e
--- /dev/null
@@ -0,0 +1,247 @@
+/* XPM */
+static char *blood9[] = {
+/* width height ncolors chars_per_pixel */
+"50 50 190 2",
+/* colors */
+"`` c None",
+"`a c #102A2A",
+"`b c #002E2E",
+"`c c #689494",
+"`d c #250000",
+"`e c #000D0D",
+"`f c #5D1616",
+"`g c #415050",
+"`h c #212A2A",
+"`i c #010404",
+"`j c #013232",
+"`k c #3C9090",
+"`l c #251A1A",
+"`m c #095454",
+"`n c #190101",
+"`o c #70D0D0",
+"`p c #000606",
+"`q c #003434",
+"`r c #0E2E2E",
+"`s c #001313",
+"`t c #115555",
+"`u c #213030",
+"`v c #60C0C0",
+"`w c #0F0404",
+"`x c #002020",
+"`y c #165D5D",
+"`z c #636A6A",
+"a` c #072A2A",
+"aa c #445C5C",
+"ab c #6C7676",
+"ac c #000C0C",
+"ad c #549393",
+"ae c #001919",
+"af c #102222",
+"ag c #4D5454",
+"ah c #002626",
+"ai c #163535",
+"aj c #043737",
+"ak c #4F6363",
+"al c #000505",
+"am c #65A0A0",
+"an c #052E2E",
+"ao c #041616",
+"ap c #044444",
+"aq c #76C1C1",
+"ar c #7ED6D6",
+"as c #001212",
+"at c #196969",
+"au c #385656",
+"av c #0C4545",
+"aw c #767F7F",
+"ax c #642525",
+"ay c #360505",
+"az c gray28",
+"b` c #5FB4B4",
+"ba c #002C2C",
+"bb c #0E2626",
+"bc c #8C9B9B",
+"bd c #000B0B",
+"be c #030404",
+"bf c #001818",
+"bg c #944040",
+"bh c #280404",
+"bi c #0A0E0E",
+"bj c #385C5C",
+"bk c #002525",
+"bl c #6D8686",
+"bm c #407E7E",
+"bn c #000404",
+"bo c #354F4F",
+"bp c #739999",
+"bq c #001111",
+"br c #5A7D7D",
+"bs c #347272",
+"bt c #030A0A",
+"bu c #5AABAB",
+"bv c #010808",
+"bw c #001E1E",
+"bx c #6E3B3B",
+"by c #71B1B1",
+"bz c #183C3C",
+"c` c #274E4E",
+"ca c #266464",
+"cb c #000A0A",
+"cc c #287373",
+"cd c #0D1A1A",
+"ce c #2B3E3E",
+"cf c #053333",
+"cg c #121515",
+"ch c #270C0C",
+"ci c #001717",
+"cj c #253838",
+"ck c #418888",
+"cl c #374343",
+"cm c #013C3C",
+"cn c #040707",
+"co c #031D1D",
+"cp c #192C2C",
+"cq c #000303",
+"cr c #070000",
+"cs c #164040",
+"ct c #537272",
+"cu c #5B8787",
+"cv c #120E0E",
+"cw c #032A2A",
+"cx c #520B0B",
+"cy c #001010",
+"cz c #062323",
+"d` c #435555",
+"da c #0C3636",
+"db c #8EAFAF",
+"dc c #282A2A",
+"dd c #001D1D",
+"de c #0C1515",
+"df c #515C5C",
+"dg c #1B5555",
+"dh c #297D7D",
+"di c #002A2A",
+"dj c #2B3030",
+"dk c #4F3939",
+"dl c #AF5C5C",
+"dm c #000909",
+"dn c #003737",
+"do c #010000",
+"dp c #001616",
+"dq c #042727",
+"dr c #0C3C3C",
+"ds c #030F0F",
+"dt c #010D0D",
+"du c #002323",
+"dv c #074E4E",
+"dw c #0C4949",
+"dx c #295555",
+"dy c #5E7272",
+"dz c #011A1A",
+"e` c #000202",
+"ea c #55A1A1",
+"eb c #000F0F",
+"ec c #176464",
+"ed c #042020",
+"ee c #0F0000",
+"ef c #001C1C",
+"eg c #8A5B5B",
+"eh c #419A9A",
+"ei c #000808",
+"ej c #205C5C",
+"ek c #420707",
+"el c #064949",
+"em c #041919",
+"en c #0C5C5C",
+"eo c #001515",
+"ep c #071212",
+"eq c #1D4F4F",
+"er c #171B1B",
+"es c #154747",
+"et c #2D8686",
+"eu c #031B1B",
+"ev c #000101",
+"ew c #3C1B1B",
+"ex c #286A6A",
+"ey c #044040",
+"ez c #000E0E",
+"f` c #264747",
+"fa c #0F4E4E",
+"fb c #0D1E1E",
+"fc c #396A6A",
+"fd c #001B1B",
+"fe c gray14",
+"ff c #0C4141",
+"fg c #031414",
+"fh c #011212",
+"fi c #172121",
+"fj c #002828",
+"fk c #060D0D",
+"fl c #063B3B",
+"fm c #2B5C5C",
+"fn c #645C5C",
+"fo c #000707",
+"fp c #343A3A",
+"fq c #396363",
+"fr c #182525",
+"fs c #364949",
+"ft c #001414",
+"fu c #467373",
+"fv c #AA7979",
+"fw c #506969",
+"fx c #022323",
+"fy c #002121",
+"fz c #1C7171",
+"g` c #213E3E",
+/* pixels */
+"````````````````````````````````````````````````````````````````````````````````````````````````````",
+"``````````````````````````````````````bnbnbddpfjdn`bahfdcq`pebfj````````````````````````````````````",
+"````````````````````````````````bnfocqftbwdddpeobqbddmfofyaydoaydnahbk``````````````````````````````",
+"````````````````````````````fd`seibw`q`qapcmahdzfgfgbtfh`x`qcmflcheecrbwah``````````````````````````",
+"````````````````````````dmdmezalfd`bapek`ddvelapajdqdscwdvaycravcm`j`rdoayahdd``````````````````````",
+"```````````````````````pftevevdzdn`heyajey`m`m`manczaoel`wapeyeyfxfh`bah`qfibhah````````````````````",
+"````````````````````bnfd`xezeo`jdvcfeddadvenavav`rcd`tfpdabicdczcoepbedzez`sahdzbq``````````````````",
+"``````````````````cbdi`qdifhdsancfa`drdafa`tbzafcgesej`tfbdaff`mdvfledfgbtbtcycifo``````````````````",
+"````````````````du`naydncmfxcnaobibbdr`aerfrcpcpeqdhatesfres`t`tdkdgdra`btfhbwdicyezei``````````````",
+"``````````````fbcr`rekeeayapdqda`rcg`afreqejejdxcadhccg``uejatfzaxclc`cx`mcodtfg`jev`bbk````````````",
+"````````````bw`jdzchcmdqeyg`ceekfaaibzdgejcccadxbsfnbsceceexejfzaxew`teccxelaocn`bdnevbh`x``````````",
+"```````````s`xfofjdnfhfgdvewayewdkatexexccbsbsbm`kfpckfsbofqccexdhewdkaz`fenflbtajap`xfdbqcb````````",
+"``````````fyacdpdzdsfgdqen`fatecagaxdhfmfcck`kbleg`kfud`d`bs`kfnetdhbs`gateca`fkcweldnebay`e````````",
+"````````bqdmaeftbtbecofffaecfzatakaxetbmfcckbubxehbrctakfw`kegdk`ketetatecfacdbidqapap`jdmercq``````",
+"`````````nevbfeoeueuavcxec`ffzccdh`k`z`keheadlb`cuctctdfbrbldlcuad`kccf`g`cscgfbdqflayekfybk`n``````",
+"``````alfj`pftfjflbhayekcxewccdhet`kbgehadbpb`am`cfnbrcububpdlbxadbmboce`ucpcgafdaelewapdibncrdz````",
+"``````dzbbddey`dayesenecatewewbmckabbxamb`dlb`am`cab`c`vdbbyfvdleafqclcedc`hfibbff`m`w`dcmaedu`d````",
+"``````bhay`qay`hcscvf``t`ybxaxbxegbgagfv`vfvbybybpblawby`v`v`vdlbuaabjfcf`cjcpfrdw`mewek`dahfoah````",
+"````efczeecm`n`wekcx`f`tdgexexbmeheabu`vaqegdbaqaqbpbpawambyb``vb`fu`gfcfmdx`ufrff`mdveweedievdddz``",
+"````bfer`ddnapbhfa`mesbzg`cjcebjfuckeab``vdbfvarararaqbpawblamamadfw`gfsboc``herdrdwapeldnfje`aeef``",
+"````cy`nfi`dai`uflfbcder`uceceauaaadeabubyaq`oarfvbcarbyblabblbrfwdfaabjfpdc`ufiafdaflanbadnbd`sdz``",
+"`````pbw`beyekeyczbi`afr`ucjfpcld`cubuamambpbyaqardbaraqbp`c`z`zdfdffufqcldc`ucpcdfbcfeddqdnbwbdbw``",
+"````al`e`sah`napep`acsfifecjauauazbradam`cblbpbpbyarawarbybpab`zfwctfubjfpdj`haifbcdepcocwah`saleo``",
+"````e`ei`pfh`leybiffeser`hc`fmfs`gbmadcublabblblbpaqardbaqaq`c`zfwfwd`clfpcecjbzaf`afkemanbwcy``eo``",
+"`````edzdd`pekflep`rdacpfecjcecl`gakfwdybr`zababbpbyarfv`obyblfnakagaabodjcj`ucpaffbepbefjcidpbnas``",
+"````cbdzaee`eyanfkbbafercpcjcjfs`g`gdfdffn`zabblbpby`ofv`vambrfwakaafcauf`cj`ufiafepfkaodn`j`xdz`p``",
+"````cbaseo`sayfkfkcdcdcgbzc`f`fsfpd`akctdfdy`z`zblambyegb`b`adcubmbmbmfqf``ucpcgcdbifkfxdndn`b`dcy``",
+"````aecbe``b`jcnaobicvereseqcadxfpbjd`dfctbrbrbr`zbr`cb`fnegbueaehehbmdhc``ufierdebicnaocm`qcrdudd``",
+"````dzei`s`qdibtaocnfbfbfadgcadxdjbocld`fwfwctctdfakdycub`agegbxbxbxbxaxcabzercgfbedfgfgddfyaybwde``",
+"````asbdbf`ddu`icocoep`rbzcsdgc`djfsfs`g`gagagagagagdfctfuckehegegbgdjdhecaicgcd`redcobtezfybhfyae``",
+"````foaeddeedidsbeedbi`ravesbzcjfececefpaud`aad`d``gd`aad`aabsbmdhfnbxaxdg`afbdreyanfg`pezbkahasfk``",
+"``````dd`p`j`qft`iemepa`dresesaifedcdccebjbjfcfcbjfsclclclfsbofmfmejcaboescgdadvcsflfgal``erfdae````",
+"``````alftdddo`jdscndqapavfaesbzfife`hcjfmdxbsbsfcfqclclcldjcedxdxeqat`tbbbb`mekaicpfxdmaccwfyfd````",
+"``````cb`pfyerayddfxajdcdwdwdraiaiai`uf`caccexexexexcef`c`dccjf`dgatec`rde`rcsbhap`jfddmcqfy`n`p````",
+"````````bn`xcz`b`j`jcfflelfldadadafa`yataxewccejc`c`cj`hcjfees`yeccx`ycddeff`wayajahdmcbcqftbd``````",
+"````````foacdddo`j`d`nfeapajandaav`tch`yejdx`fejg`g``ufrerbz`y`ychf`facdczelbhajfxfheialcbbnac``````",
+"`````````````edzererdnbeaycfa`a`dadwf`av`y`fcxeqaiaiaifiercsc`chf`djdacnanfldafjcyaccbbwfyac````````",
+"``````````evbn``ciduchcrayajdqanapcxdrdadw`tcedjfaavavdrdadwdjchewesczemfxcwcwbffoebbwcodo``````````",
+"``````````````bne``sci`jay`ncpdrbhapajema`avdway`maydwdwavcxekaycneydscofjahfydz`ebfbkefbd``````````",
+"``````````````evevbdcq`sbkdn`q`jajdqcobtbta`a`a`cfelchewcheycfewekajbeedduddasei``eocrbd````````````",
+"````````````````cb``e`bndmdmeoftaedtbebecncnaodsaodqanajanedfxajajcoezfydpalev`pacbwee``````````````",
+"```````````````````e`ecycyeievacal`iebfhfgbvbedscodqbedtfhfxahahbfevbfft``e`e`evev`e````````````````",
+"````````````````````ft`nefbfdmbndmcbfdfyddbwezcyfyfjdzezdm`sefaecb`paeebalebas`scq``````````````````",
+"``````````````````````do`wbwfdftft``eiacezeobnezeodufyftdmfocybd`pcbbndmciembicb````````````````````",
+"````````````````````````dme``scrcvaecyasfocb``bdbfbwdubkaeebe`cqalebfdcrcycrcb``````````````````````",
+"``````````````````````````````cqacdpbwcibqe`cqalfoasbqaseibndmacci`ncyebdm``````````````````````````",
+"````````````````````````````````cqe```ez`n`nciftac`ebqfofoe`evcb`wasal``````````````````````````````",
+"```````````````````````````````````````ecq`ebqeofgeo`sbdbdbqcbbn````````````````````````````````````",
+"````````````````````````````````````````````````````````````````````````````````````````````````````",
+"````````````````````````````````````````````````````````````````````````````````````````````````````"
+};
diff --git a/hacks/images/bubbles/blue.pov b/hacks/images/bubbles/blue.pov
new file mode 100644 (file)
index 0000000..86d1ff8
--- /dev/null
@@ -0,0 +1,22 @@
+#include "colors.inc"
+#include "shapes.inc"
+#include "textures.inc"
+
+/* The following make the field of view as wide as it is high
+ * Thus, you should have the -W and -H command line options
+ * equal to each other. */
+camera {
+        location <5.8, 0, 0>
+       up <0, 1, 0>
+       right <1, 0, 0>
+        look_at <0, 0, 0>
+}
+
+sphere {
+        <0,0,0>, 2.5
+       texture { Blue_Agate 
+       scale <0.7, 0.7, 0.7> }
+       finish { phong 1 }
+}
+
+light_source {<6, 1, 0> color White}
diff --git a/hacks/images/bubbles/blue1.xpm b/hacks/images/bubbles/blue1.xpm
new file mode 100644 (file)
index 0000000..49ff012
--- /dev/null
@@ -0,0 +1,63 @@
+/* XPM */
+static char *blue1[] = {
+/* width height ncolors chars_per_pixel */
+"10 10 46 2",
+/* colors */
+"`` c None",
+"`a c #2A2A47",
+"`b c #2E2E4E",
+"`c c #1D1D30",
+"`d c #1B1B2E",
+"`e c #0C0C12",
+"`f c #0A0A10",
+"`g c #17172A",
+"`h c #25253E",
+"`i c #12121E",
+"`j c #20202F",
+"`k c #141423",
+"`l c #2F2F4E",
+"`m c #1A1A2C",
+"`n c #333355",
+"`o c #1D1D2B",
+"`p c #282843",
+"`q c #303051",
+"`r c #111122",
+"`s c #161620",
+"`t c #0A0A14",
+"`u c #25253F",
+"`v c #2B2B48",
+"`w c #2F2F4F",
+"`x c #101020",
+"`y c #18182B",
+"`z c #353558",
+"a` c #15151E",
+"aa c #191925",
+"ab c #13131F",
+"ac c #0D0D19",
+"ad c #151524",
+"ae c #343456",
+"af c #1F1F34",
+"ag c #0C0C14",
+"ah c #0A0A12",
+"ai c #494967",
+"aj c #23233B",
+"ak c #0C0C17",
+"al c #292944",
+"am c #121223",
+"an c #BCBCD7",
+"ao c #1A1A2E",
+"ap c #0B0B15",
+"aq c #262640",
+"ar c #171724",
+/* pixels */
+"```````s`uaj`u`t````",
+"````ac`a`w`l`waqaa``",
+"```m`p`x`nae`n`waj`t",
+"``a``o`w`dan`z`q`yaf",
+"``ap`g`l`naiam`lal`k",
+"``ak`h`v`bao`b`v`h`s",
+"``ab`iaral`r`j`uafab",
+"````ad`c`sab`s`cag``",
+"```````eadahad`f````",
+"````````````````````"
+};
diff --git a/hacks/images/bubbles/blue10.xpm b/hacks/images/bubbles/blue10.xpm
new file mode 100644 (file)
index 0000000..9d6b278
--- /dev/null
@@ -0,0 +1,240 @@
+/* XPM */
+static char *blue10[] = {
+/* width height ncolors chars_per_pixel */
+"60 60 173 2",
+/* colors */
+"`` c None",
+"`a c #2A2A47",
+"`b c #1B1B2B",
+"`c c #282845",
+"`d c #191929",
+"`e c #323252",
+"`f c #303050",
+"`g c #111121",
+"`h c #2E2E4E",
+"`i c #0F0F1F",
+"`j c #1D1D30",
+"`k c #1B1B2E",
+"`l c #0C0C12",
+"`m c #0A0A10",
+"`n c #17172A",
+"`o c #212137",
+"`p c #767691",
+"`q c #1F1F35",
+"`r c #2F2F48",
+"`s c #101019",
+"`t c #0E0E17",
+"`u c #272740",
+"`v c #181824",
+"`w c #25253E",
+"`x c #12121E",
+"`y c #10101C",
+"`z c #20202F",
+"a` c #0E0E1A",
+"aa c #2B2B47",
+"ab c #0C0C18",
+"ac c #292945",
+"ad c #161625",
+"ae c #141423",
+"af c #242436",
+"ag c #313150",
+"ah c #121221",
+"ai c #2F2F4E",
+"aj c #2D2D4C",
+"ak c #2B2B4A",
+"al c #1A1A2C",
+"am c #5C5C7A",
+"an c #161628",
+"ao c #333355",
+"ap c #07070C",
+"aq c #313153",
+"ar c #05050A",
+"as c #0D0D15",
+"at c #07070F",
+"au c #24243C",
+"av c #202038",
+"aw c #0D0D18",
+"ax c #1D1D2B",
+"ay c #0B0B16",
+"az c #282843",
+"b` c #262641",
+"ba c #232334",
+"bb c #11111F",
+"bc c #0F0F1D",
+"bd c #2C2C4A",
+"be c #3C3C5D",
+"bf c #2A2A48",
+"bg c #1B1B2C",
+"bh c #19192A",
+"bi c #151526",
+"bj c #131324",
+"bk c #303051",
+"bl c #111122",
+"bm c #1F1F33",
+"bn c #19192D",
+"bo c #08080F",
+"bp c #161620",
+"bq c #23233A",
+"br c #212138",
+"bs c #0E0E18",
+"bt c #0A0A14",
+"bu c #272741",
+"bv c #25253F",
+"bw c #23233D",
+"bx c #12121F",
+"by c #10101D",
+"bz c #202030",
+"c` c #0E0E1B",
+"ca c #1E1E2E",
+"cb c #2B2B48",
+"cc c #0C0C19",
+"cd c #292946",
+"ce c #181828",
+"cf c #28283B",
+"cg c #262639",
+"ch c #2F2F4F",
+"ci c #101020",
+"cj c #1C1C2F",
+"ck c #2A2A40",
+"cl c #18182B",
+"cm c #353558",
+"cn c #09090F",
+"co c #333356",
+"cp c #07070D",
+"cq c #15151E",
+"cr c #202036",
+"cs c #1C1C32",
+"ct c #090912",
+"cu c #191925",
+"cv c #26263F",
+"cw c #24243D",
+"cx c #22223B",
+"cy c #13131F",
+"cz c #11111D",
+"d` c #0F0F1B",
+"da c #0D0D19",
+"db c #2A2A46",
+"dc c #262642",
+"dd c #171726",
+"de c #151524",
+"df c #131322",
+"dg c #111120",
+"dh c #2E2E4D",
+"di c #0F0F1E",
+"dj c #1D1D2F",
+"dk c #343456",
+"dl c #08080D",
+"dm c #151527",
+"dn c #06060B",
+"do c #1F1F34",
+"dp c #1B1B30",
+"dq c #0C0C14",
+"dr c #0A0A12",
+"ds c #494967",
+"dt c #23233B",
+"du c white",
+"dv c #14141F",
+"dw c #212139",
+"dx c #1E1E2C",
+"dy c #2B2B46",
+"dz c #0C0C17",
+"e` c #292944",
+"ea c #0A0A15",
+"eb c #262637",
+"ec c #141422",
+"ed c #2D2D4B",
+"ee c #0E0E1C",
+"ef c #1A1A2B",
+"eg c #373758",
+"eh c #181829",
+"ei c #161627",
+"ej c #333354",
+"ek c #141425",
+"el c #313152",
+"em c #121223",
+"en c #222236",
+"eo c #030307",
+"ep c #BCBCD7",
+"eq c #1E1E32",
+"er c #1C1C30",
+"es c #1A1A2E",
+"et c #0B0B12",
+"eu c #18182C",
+"ev c #28283F",
+"ew c #090910",
+"ex c #222239",
+"ey c #202037",
+"ez c #11111B",
+"f` c #1E1E35",
+"fa c #0F0F19",
+"fb c #0D0D17",
+"fc c #0B0B15",
+"fd c #1B1B28",
+"fe c #090913",
+"ff c #262640",
+"fg c #171724",
+"fh c #151522",
+"fi c #212131",
+"fj c #2C2C49",
+/* pixels */
+"````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````",
+"````````````````````````````````````````````````dn`tdvahbhdebhbhecehawbs`x``````````````````````````````````````````````",
+"```````````````````````````````````````````yaweffcerbpbpeqbmbmbbaneiahay`kcedqfh````````````````````````````````````````",
+"````````````````````````````````````cpddeffcbbbsbpbpbrexexal`kabdgdfabaway`v`jcjbt`tcz``````````````````````````````````",
+"````````````````````````````````dnddaler`kbpfdexbqaucw`nccdac``wcccucwfdcueqcrcreq`kbsddar``````````````````````````````",
+"``````````````````````````````dqefcjbpdzexcuau`wbvekdt`gciekdtbiaxbubuffbvbcandoexfgbtdvbiez````````````````````````````",
+"``````````````````````````drdzbgeqcldfbcbxdjdxbuazazcibcax`dci`qffb`biazazbuff`wcwbqc`bpeqbgcecz````````````````````````",
+"````````````````````````fcehfedzcrabbyalexbuaze`dbdfdidicbaxdfbuavdffidbdbe`azbuffc``qfhcreq`xbhec``````````````````````",
+"``````````````````````cz`yalahfgbqahdabjazacdbaacbfjbdauede`edciblcbenfjcbaadbac`zexdxcwbqbpanaybhec````````````````````",
+"````````````````````boezayclbidtexeedididbaacbbdededajdhdhdhdhdhdtesajededbdcbfiae`ndxff`wdtaldadrbhas``````````````````",
+"```````````````````tbherc``ndtdteeeeby`zcbfjedajdhdy`abnbvbzebebciavcwebdhajbierahah`qdxcu`wdtal`kdzbhcp````````````````",
+"````````````````bxeh`yawdadtcuclazac`acbbdeddh`hch`n`ncschdcaicsdmdmcif`ch`hdhfjdidiffbyahdx`wczcubmbsczbx``````````````",
+"``````````````asddbxbtcsda`wcsekac`acbbdajdhaich`favcicif`cgaq`jcb`navdm`fchaiekesbjeeesbmazffbcc``oeqbgctcn````````````",
+"``````````````ctez`j`dexfgcvbccw`acbbdbzdhch`fbkelfidpbleycfejcfdc`ndpbnelbkfiesbdbnfiexdt`ubucv`kexcr`jefde````````````",
+"````````````cyehdz`ybrbycsbubqeecbbdajdhch`fbkelaq`eafazakafaobnbheyeucscbelbacsb`badffidf`zdxbu`wdabrcufcctcy``````````",
+"```````````matdv`jcrehczbbazaccsfjeddhai`fbabz`eejejblchbkeuekcjcoaoaoaiej`eclemfifienafbiaaacazekccexcrdfctaddl````````",
+"``````````cydzfcehbrclclcae`dxbueddh`i`qbdbdbjaiaobnesembj`jdkdkdkdkedaoaoejbkcsbjchaidhedcbdbe`exfdaubrawbtfccy````````",
+"````````asezalayaydaahanaz`udganbvcici`gf`dmajbnao`jazekavdkdkdkcgbjbn`naoemancdbj`fchdhedbdaabcdtffcwexcrehbtad`m``````",
+"````````bxbofebbbierdw`kazdbcaemcidtdc`nelbvblaocobfeualcfcmcmazbmcmemebclbidmaibjbkchaidhbd`bbrahbu`wdt`ocjfece`l``````",
+"````````fhbhbtdzbybcclahe``afj`icsazblfiafdhancodkeuazcmcmcmcmcmcfejcfdkdkbj`n`naqel`faidhedaxcie`bucvfdexdodfbhfh``````",
+"``````bobxehayabda`jdaexaxaabdeudpbvf`bv`a`ccfcockbjf`ckbebebebecfalcmdkdkcocdbj`eel`fchdhedahbcdxc`fhcwexcrayalbobo````",
+"```````xddbcay`yfhbidgc`eecifiajfidcdmcidmfiaocoalekf`eq`eagdsdsdsbeegcmdkcoclcw`eelbkch`hajdwee`nc`by`wbqcr`va`ddbo````",
+"``````dfehfeanfheidgekaz`zbldmaj`hcaajeubn`haodkbj`kexcfegamam`pamdsbeegcmdkaocxbjelbkch`hajbv`qclfd`wbcdt`oeqbhdedf````",
+"````etcybhaycqfhbhcsfdazaxcadiaj`hchchdm`gajdmdk`kagbeds`p`pepep`pamdsbecmdkao`neuelbkch`hajblahclca`kbndtbrdocqdrecet``",
+"````bsfcbhd`dobrbrczbmazcacb`qca`hchbkeldmf`andkdkej`ramepduduepep`pambecmdkaoelblciebch`hajandtdibuekcccubrdoerctdebs``",
+"`````sfheifbdzfddfexdxazdbcbeuazfich`felbhblbidkanbmeg`pepdududuep`pambeegdkao`cavavblekdhaj`zclerbcdiciecbrcudvezat`s``",
+"`````yad`d`jaybrczcsby`zdbca`bdp`gef`felelavcgcobnbzam`pepdududuep`pambeegcoclchcddmdpcw`zeddidweedpc`aney`vbsdzez`sbs``",
+"````ezadcq`jdobrdtdfcvby`kahcwemajcwbabkelcsf`aocseq`ram`pepepepep`pdsbebmcbesbnbkci`nazfiedfjaafieec`dfahbr`vfcbhezfb``",
+"````ezadbherdo`odtbqffbb`nahcicicdbwbz`felbvavejcb`kdsds`p`p`pep`pamdsen`nancldpcici`cbafiedcb`aacexdmczdt`obbaebbec`y``",
+"````ez`tbhdzfc`obqcwffah`nciekerehfiai`fcsanek`eaoekef`rdsbedsamamdsbe`nem`eaqelbabaaidhedcaddaxe`axc`cubq`oaecjdzewdn``",
+"`````yct`xfcbtcrexaucvbuekeeesf`crdh`hbibv`ffiaq`eekbh`jcg`e`rdsbeegcmekblbaelbk`fch`hdhedfjaadbazbuda`vexcrabadct`sfa``",
+"`````sfh`sahaydzexdt`wffazdteebcbaeddh`gcibdbkelcxbjevdkaiejeqegcmdkejcgcsekbk`fchaidhedbdcb`aaccabbcwcuexcr`jbsehfhet``",
+"````cneccedrbyczbrbqcwffbu`nazemddbdajebcwci`fbk`qbnafaicbdweiejej`eelelahbjfichaidhajbdfjcadbazax`v`na`brdoahcqceasas``",
+"````arboddctekdgbpexau`wbucrerffbifjedajdfcieb`fahf`ek`f`h`gaaelelelelbk`fey`qaidhajedfjcbdbacazbu`wdadj`obmez`x`sctfb``",
+"````eodqaddffeay`jexdt`wfffdeeexdicbbdedajcs`haibz`q`gemb`bjbkbkchdb`f`fchaicx`iajedbdcb`aac`zbuffcyei`ncreqa`dzdzasdq``",
+"````arcnfhdrdzalbp`oexau`w`qdm`qax`acbfjedcsafdh`hdp`hcieubdes`fchchchai`hdhdhdififjcb`aace`axfd`wdgbiabay`jbpfccpezap``",
+"``````dqecctawaydzcrexdtbcccahfde`db`acbahdieiajdhdhdh`heiemf`aiai`hdhdhdhajeddmciee`adbe`azbucvcwbhaybbancjef`ydr`m````",
+"``````arbxadehaydzcj`ofhcreiee`zaze`ac`aercidibdedajajdhdhdmcbdhdhdhajajexbgcsdwciahace`azbucv`wdtcrayawfccqbhctbsas````",
+"``````arezfhddaefcaycr`obbekbndfbuazfdacaccsdpciazfi`uededey`ifiededbdbdfjdfdicxaxeebububuax`wauex`oayaycjalddboezcp````",
+"````````fadqadbofcbteqcrdf`ndf`wcvbuazbididibjf`ahcafjfjfjfidbeifjfjfjcbcbaa`ddbacazdpdaexbxaucsbrcrbhdebg`dadetfa``````",
+"````````ctasfhdqd`fc`vdoekay`vau`wcvbuc`eebc`z`zdb`a`acbcb`beeahcbcb`a`adb`zace`azbu`wdtccdaabbccrcqa`deefddfhfbap``````",
+"````````eofacyadawctbgeq`xeifdbqaucyfgeedabuazaze`acacdbfiddblbleedbacac`zb``zbudfffbvczdg`neqc`docja`ezceadcydnap``````",
+"``````````dqdqecctctczcjeqeafgbrexexc`ccciffbubuazazazdddf`qesercsazazazfdcx`gbbaubccwdt`vcualaleqcjfcezeiecezdq````````",
+"``````````eobs`xctdrctbgeraeeacrbrexabbicz`wcvffffbubudf`zaneecebqbububudxfddx`wcwaudtexbrcrah`jerbgctecfhcpbsar````````",
+"````````````bofaezdeecbhdvfeaw`vcr`ocjaya`cucw`w`wcvcvccerdfei`w`jffcvcv`w`wcwaudtexex`ocrdoeafcbgcqdzdrasareo``````````",
+"``````````````dq`ycpbs`sbhanbs`kef`qcrayd`exdtdtaucwcwer`ndfccbc`w`wcwcwaudtdtexex`ocr`qahekczdqbh`ybocpdnar````````````",
+"``````````````apasezcydeddfhcta`eaeqdoawaebbfgcuexbqababf`ek`kaudtdtdtbqexexexdafgcrdofcdfeialdzddcycp`tapap````````````",
+"````````````````bo`tbobodeezfedfa`cj`jeqayeiaybnbpbrbydzeifhcydjexexexbrbp`ocrdzdoeq`jdd`yfcfafcdqcyezdldl``````````````",
+"``````````````````cn`tezcyatctddbhal`kcj`jbsayal`qddbba``y`o`o`ocrcrcrcr`qdoaybt`jcj`kalfebofbcpctez`teo````````````````",
+"````````````````````ewfbdqdqcpfhddehefalcqdrehefeq`ya``vdododododobmeqeqeqcqfabpcqalef`sdebxbxbocpfbew``````````````````",
+"``````````````````````dndq`s`xdffhaddd`tctecczbpcjdzdzdv`jdveh`j`j`j`jbpalfcbgalcyeh`satdrfcbsdnascn````````````````````",
+"````````````````````````ardlfafbcpfbbtbo`yctbhbhasa``sbg`k`k`k`k`kbgbgalefbhbhceetdfbodfdr`metdrcp``````````````````````",
+"``````````````````````````dndrewfadnboecfhadeidddrdzfcbhbhbhezbhbhbh`dehceddeiboctctdndqdndneoap````````````````````````",
+"``````````````````````````````boewdq`lez`xcyecfhdeadfcbsecctdrdd`sdqadaddefheccybo`y`mareoar````````````````````````````",
+"````````````````````````````````apaparfbfa`ycz`xcyetcpcpcpatdqec`sececcycy`xdnasfadrdleoar``````````````````````````````",
+"````````````````````````````````````eoarbocnfbfafaasdrarfcbobsczczczez`yfafafbdqdreoar``````````````````````````````````",
+"``````````````````````````````````````````apbodretcncndqarar`mbsasfbasdqcndreoap````````````````````````````````````````",
+"````````````````````````````````````````````````apdneoeoeoarbocncnboapdnap``````````````````````````````````````````````",
+"````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````",
+"````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````"
+};
diff --git a/hacks/images/bubbles/blue11.xpm b/hacks/images/bubbles/blue11.xpm
new file mode 100644 (file)
index 0000000..c39e4f1
--- /dev/null
@@ -0,0 +1,254 @@
+/* XPM */
+static char *blue11[] = {
+/* width height ncolors chars_per_pixel */
+"72 72 175 2",
+/* colors */
+"`` c None",
+"`a c #2A2A47",
+"`b c #1B1B2B",
+"`c c #282845",
+"`d c #191929",
+"`e c #323252",
+"`f c #303050",
+"`g c #111121",
+"`h c #2E2E4E",
+"`i c #0F0F1F",
+"`j c #1D1D30",
+"`k c #1B1B2E",
+"`l c #0C0C12",
+"`m c #0A0A10",
+"`n c #17172A",
+"`o c #212137",
+"`p c #767691",
+"`q c #1F1F35",
+"`r c #2F2F48",
+"`s c #101019",
+"`t c #0E0E17",
+"`u c #272740",
+"`v c #181824",
+"`w c #25253E",
+"`x c #21213A",
+"`y c #12121E",
+"`z c #10101C",
+"a` c #20202F",
+"aa c #0E0E1A",
+"ab c #2B2B47",
+"ac c #0C0C18",
+"ad c #292945",
+"ae c #161625",
+"af c #141423",
+"ag c #242436",
+"ah c #313150",
+"ai c #121221",
+"aj c #2F2F4E",
+"ak c #2D2D4C",
+"al c #2B2B4A",
+"am c #1A1A2C",
+"an c #5C5C7A",
+"ao c #161628",
+"ap c #333355",
+"aq c #07070C",
+"ar c #313153",
+"as c #05050A",
+"at c #0D0D15",
+"au c #07070F",
+"av c #24243C",
+"aw c #202038",
+"ax c #0D0D18",
+"ay c #1D1D2B",
+"az c #0B0B16",
+"b` c #282843",
+"ba c #262641",
+"bb c #232334",
+"bc c #11111F",
+"bd c #0F0F1D",
+"be c #2C2C4A",
+"bf c #3C3C5D",
+"bg c #2A2A48",
+"bh c #1B1B2C",
+"bi c #19192A",
+"bj c #151526",
+"bk c #131324",
+"bl c #303051",
+"bm c #111122",
+"bn c #1F1F33",
+"bo c #19192D",
+"bp c #08080F",
+"bq c #161620",
+"br c #23233A",
+"bs c #212138",
+"bt c #0E0E18",
+"bu c #0A0A14",
+"bv c #272741",
+"bw c #25253F",
+"bx c #23233D",
+"by c #12121F",
+"bz c #10101D",
+"c` c #202030",
+"ca c #0E0E1B",
+"cb c #1E1E2E",
+"cc c #2B2B48",
+"cd c #0C0C19",
+"ce c #292946",
+"cf c #181828",
+"cg c #28283B",
+"ch c #262639",
+"ci c #2F2F4F",
+"cj c #101020",
+"ck c #1C1C2F",
+"cl c #2A2A40",
+"cm c #18182B",
+"cn c #353558",
+"co c #09090F",
+"cp c #333356",
+"cq c #07070D",
+"cr c #15151E",
+"cs c #202036",
+"ct c #1C1C32",
+"cu c #090912",
+"cv c #191925",
+"cw c #26263F",
+"cx c #24243D",
+"cy c #22223B",
+"cz c #13131F",
+"d` c #11111D",
+"da c #0F0F1B",
+"db c #0D0D19",
+"dc c #2A2A46",
+"dd c #262642",
+"de c #171726",
+"df c #151524",
+"dg c #131322",
+"dh c #111120",
+"di c #2E2E4D",
+"dj c #0F0F1E",
+"dk c #1D1D2F",
+"dl c #343456",
+"dm c #08080D",
+"dn c #151527",
+"do c #06060B",
+"dp c #1F1F34",
+"dq c #1B1B30",
+"dr c #0C0C14",
+"ds c #0A0A12",
+"dt c #494967",
+"du c #23233B",
+"dv c white",
+"dw c #14141F",
+"dx c #212139",
+"dy c #1E1E2C",
+"dz c #2B2B46",
+"e` c #0C0C17",
+"ea c #292944",
+"eb c #0A0A15",
+"ec c #262637",
+"ed c #141422",
+"ee c #2D2D4B",
+"ef c #0E0E1C",
+"eg c #1A1A2B",
+"eh c #373758",
+"ei c #181829",
+"ej c #161627",
+"ek c #333354",
+"el c #141425",
+"em c #313152",
+"en c #121223",
+"eo c #222236",
+"ep c #030307",
+"eq c #BCBCD7",
+"er c #1E1E32",
+"es c #1C1C30",
+"et c #1A1A2E",
+"eu c #0B0B12",
+"ev c #18182C",
+"ew c #28283F",
+"ex c #090910",
+"ey c #222239",
+"ez c #202037",
+"f` c #11111B",
+"fa c #1E1E35",
+"fb c #0F0F19",
+"fc c #0D0D17",
+"fd c #0B0B15",
+"fe c #1B1B28",
+"ff c #090913",
+"fg c #262640",
+"fh c #171724",
+"fi c #151522",
+"fj c #212131",
+"fk c #2E2E4B",
+"fl c #2C2C49",
+/* pixels */
+"````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````",
+"``````````````````````````````````````````````````````````````bpcudf`tdeded`aedfdrau````````````````````````````````````````````````````````````",
+"``````````````````````````````````````````````````````cqd`e`fdbh`kckck`yesesckckbzbiegaobped````````````````````````````````````````````````````",
+"`````````````````````````````````````````````````ydeeidack`jficv`vdecscsdbazaccmaadgaf`jckdacuf`ed``````````````````````````````````````````````",
+"````````````````````````````````````````````ae`dbhfdcmaoczcs`oeyeyeyfee`bzamazaaesacbiazczbnerckdgdfae``````````````````````````````````````````",
+"````````````````````````````````````````ds`ybh`j`k`vbq`yeyduavavbddbcadbca`wdhaabravfedudpej`ocseraabubiau``````````````````````````````````````",
+"````````````````````````````````````btcfbh`jfbaa`oeycvav`w`wamezaidgdbbjbselfebvbvfgcw`w`wcmbzet`o`vaaffbhde`t``````````````````````````````````",
+"``````````````````````````````````dregckerdbaaeyfiaccxcwbvbvfeb`cabcbz`qduaielamdfcab`bvbvfeeyfhduey`yejerckcfej````````````````````````````````",
+"``````````````````````````````bpdgbh`jdpfedbelctd`aedyb`b`eaaf`qbdbj`aaybnctelcxbvayadeab`b`bvfg`wfeetaadwdp`jbccfcz````````````````````````````",
+"````````````````````````````fccuaxazda`o`odbcabja`b`b`addc`afj`adjbjfl`devbw`ndg`aafab`adcadb`b`bvcxcaey`o`o`qaobheied``````````````````````````",
+"``````````````````````````ed`zfb`vesbhdudxelcmaib`addc`accflbebeeeeeeebbeeeeao`idjbebeflcc`adccbdecsdxbwcxdu`vaie`e``dfi````````````````````````",
+"````````````````````````bpcufibier`qduaiaielaiefdc`accflbeeeeeakdidididididibjao`nakeeeebeflcca`af`kbdbvfi`wductazebaa`dat``````````````````````",
+"``````````````````````auei`kbcfb`jdudbdbcacjcjdeccflbeeeakdia`faevenaoeab`brajcxbeawdidiakfldjaodhefdjfedhfe`w`oesdb`z`keids````````````````````",
+"````````````````````czcfbhaxcsaidufecacxdgad`accfleeakdidiajam`ncjaodncjboevelcydqet`xajdidibhevbk`i`qbddecmfg`wfe`kbq`de``zcz``````````````````",
+"``````````````````atdeamca`jazcacx`vbzb`ad`accbeeeakdiajci`fajcybxccctcmagbhawet`gbkbw`fciajdib`bkdjcjdjefb`bvcw`bdbbsdp`jamcud`````````````````",
+"```````````````````tbibi`jacd`cxdycabcad`accbeeedidiajci`fcievcjbmbmee`e`e`ebgaw`gfaccbl`fci`wawfab`bkboevaib`bv`wboaa`obnesbi`s````````````````",
+"````````````````cqeiff`vcsey`v`waidhbwayccbeeedi`hci`f`fememeablbmbmembrekbbetdqaoctevbiem`faocjdqfaelevezbv`bbnbv`wcseycsbq`kdaed``````````````",
+"```````````````zcuegbuaxbsbzaofgeoa`efavfleedidici`fblemem`e`ech`hbmenchap`jagbednbmctccememccbabaagbjaw`dela`cbbvfgfe`jbsdpbuamat`m````````````",
+"``````````````atbiffercsctavcsbvb`cbetflbeakdiaj`fbbdnem`eekek`n`nfab`cmelcmcpapapapcgek`eemciajeldkageaa`cbabadb`bvaieleycsbqbdd`fi````````````",
+"````````````dsedame`debs`qaidbb`adfjbwbeeediajb`fa`hejc`ekekagevfaceaoecdldldlcpcpapapekek`edd`nbjciajdieecbccdcadbzduesdubs`qaae`de`y``````````",
+"````````````fibtffebcmesdbezfeb`adelet`dbhcteldnbmencebmekapdncyenevctagdldldleldn`jamapcgbbevcidn`fci`hdieeflabadeyedfeaveyfh`kaicufi``````````",
+"``````````drdeamfdejazaidb`nb`eaaybwbabmen`ncy`cecalenceapcpdndndqetfacncncnecdnecbockcgagb`bketfadzciajdieebecccjduayfg`wdubsbqdeeide`t````````",
+"``````````eddefdcabdazducsbdb`ad`wejcjendqb`babbembgawelapcpbe`ecscncncncncnclcncgbmfkclbkcybmbaaobl`fcidiakbebbfacjb`bv`waveycs`je`cfed````````",
+"`````````mcqbiffamazaicmcmeyb`dcccfl`icjdxfacjecagemdqapcpdlevccagcncncncncncncgcnecdldlch`haofjarem`fciajdieecbawcbb`bvcwaveycsckaibifbfd``````",
+"`````````y`sdsazazer`jetdb`kerdcccbedubmdcbv`nfaenbkelapcpamelbwelehcgbfbfbfbfaocgcndldlcp`jaoee`eembl`fa`dieedgelbdeaefdycxbr`obqfdamde`y``````",
+"````````dgcfdabudgacdkcsdbcjej`nb`beakbhevel`nbkaodncgcpdlenevbkb``rclahdtdtbfbf`rcncndldlcpaodnagembl`fcidiakdgbodqdgetefavdubs`qacbycfdg``````",
+"``````btfdeiaafd`zaxd`cm`wet`nctbddjakdicmdi`n`genawapcpdlenelcmeyahahdtdtanandtbfbfcndldlcpdnbmcgembl`fcidiakezbdfgdgfebzfiaveycsbqe`f`fi`m````",
+"```````zcqbiffbjerdbduca`qb`adaidcceakdicicjbxdubmarcmcpdlcmbvewdzandt`panananandtbfehcndlcpewdnbmemem`fcidiakcjaiefdhayer`qaveycserbqcuae`l````",
+"```````ybpbidadw`jeydgdbfeb``wefbb`nakdiciagccejenctcecpdlcsehehehan`peqeqeq`p`pandtbfcndlcpagbxboecbl`fcidiakdgcfdueyayeserbyeycsercrcud``y````",
+"``````by`tcuda`v`oey`naybnb`ad`wea`icbdici`fblemdnaoenekdlclekcl`p`peqdvdveqeqeq`pdtbfehdlcpcgbwbmcydk`fcidiakdjbaef`netelcacaey`obnesazbpby````",
+"````asczdeaebubq`vdwef`qfeb`ad`acccyevejci`fblemaoen`hapdlcmerdtan`pdvdvdvdvdveq`panbfehdlapewevet`xb`fjagdiakegbkefdxaidgbkbjey`obhes`tbtczeu``",
+"````atfbdee``jeb`ofeejfaay`dad`acc`qbkbkeaciblemfjbwbgapdzdleranan`pdvdvdvdvdveq`panbfehdlapcmcycybmbvcyetdiak`bduezdncmdhdbesey`oafbie``tfbat``",
+"`````td`de`t`jcr`oeydkdbcffeayayfjdcdj`xet`g`fememendnapdib`csehdt`peqdvdvdveqeq`pdtbfehdlbkblakawfa`gbadgdieebedgefbdbodh`wdhax`oebdsatf`d``t``",
+"````btbydeamesbncseyavayfgdebvaicj`n`nctaddx`fblem`nbmekec`famcgan`peqeqeqeqeq`pandtbfckenbmbmdncicjcjctawc`eeflccdccw`g`g`ndbdacsaxckcudefbds``",
+"````btbpdeamckercseydufefgcb`n`gefcjdjadetcyci`fagad`gb`apce`kbf`rdtan`p`p`p`pandtbf`j`abkekenejelcj`cabdiakbeflabdceabodhbddueycsbidgegbpcqas``",
+"`````md``scre`bccseydu`wfgaiduefcjdgesdgew`hci`fctbmcj`eekagelbibbbfdtbfdtanandtbfbf`netcm`eemembbeceo`hdieecb`db`adb`bccaaydueyazebckcucudsdm``",
+"````eucqf`f`fffddbbsbrcxcwbvendhdncmbvfjakdiaj`gcicx`nem`eekaocmbn`e`rch`rbfdtbfehcnenboctemembl`fciajdiakeeflbrdcadb`bvcacabrbsfbdfaxcraeexeu``",
+"````asdr`sfbaie`bd`oeyav`wfga`cacjcjaicbb`didicccjbwaiemembmenbbdlbhfkajcgbfehcndlapbbbwdnembl`fciajdidieebeccabdceab`fe`ncvey`ocvbubtbi`se`dr``",
+"````dscqae`dbudsebaaeydu`wfgbvcfeyezefdgbeakdieecjbmamblbbdnevbbfkc`cybxaodldlapek`eemb`enc``fcici`hdiakbeflccdcadb`dhdectbyey`odpdbe``daecqco``",
+"````epd`dfcfdgebdbebeyducxbwbvb`aebobk`gbeeeakagfgelb``fblelbgdnemenfa`xej`e`e`eemem`ffjccdg`waj`hdiakeebecc`udceab`dyay`kaceycserafamcf`tdreu``",
+"````dof`eddefdejaiam`oeyav`wfgbva`dudccjccbeeeakejbk`ici`fddenbwfaevcjdgememememewblbl`f`fbxfa`hdiakeebeccabdcadb`bvfgcvdjfe`o`qerd`at`scqcqas``",
+"``````fbbpdedgdebibz`veyducxbwbvbwcaeyefccflbeeeakbeaoajcibh`qcjelcjbxeiblblblec`f`f`fcicicb`gecakeebeflccdcaddya`bvbwboejesbhdp`je`e`dscqfb````",
+"``````btcuaecufdfcelcsbseyav`wfgdjfgbv`d`accflbeeebjeedi`hajajawbmbmfacjen`f`fciciciciaj`hdidneleebeflcc`aadeaayayfgavdhbjbjeleresbjfdau`tbt````",
+"``````atf`ficufdaabu`ycseyducxdyejfeafeadc`accccfjetfaakdidiecagcbfaevbkctfjciajaj`hdididiakelbkflcbcc`adceab`bvfg`wcvdbdbazd`buckf`dgd``yat````",
+"``````ds`leddeedfdbuazcs`ofedacd`qbnfeb`eadc`accb`djbveeeeakdididiavdq`ib`didididididiakeeeebj`gdjfafjdceab`bvfgcw`wdueyazdhelaobhbiaefd`zds````",
+"````````asczdff``tckdf`vcscvazacducdfebvb`eaaddcceetcyezbjeeeeeeakakc`aoakdiakakakeeeeee`dccctdxaocjdheab`bvbvcw`wavbrbhdbe`ckbiamcfdr`zfb``````",
+"````````dod``yde`ybjbcbt`q`ocve`dhcxaibvbvb`cbayducydxdqbmctbbfjbeeeeecxdjeleeeebebebeflccceaicya`a`cj`qfjfeay`wavduey`oebbudgbhbidefdd`do``````",
+"````````bp`sdraecfdafcejercsaiazesca`wcwfgbva`dudjefefcyctaicbccflflbefjdcbobeflflccccccabfjdyadadb`bo`nbo`wbyaocm`v`ocsbid`ckegcfaeeu`sep``````",
+"``````````fc`zeddedacuffbqdpczcaerduav`wcwfgbhcjdqdgbzay`day`aabccccccdgefdxccccccab`a`adcfjadeab`b`dyeddbdbbzbzdbczcsbqelffam`ddeedf`fc````````",
+"``````````ep`satdfcubdcuaferdpaz`odpduav`wbwdgdbaib`b`eaadaddcdcdcdcaydhefdxdjdcdcdcdcay`gelbhb`bvbvfgcvbs`kbd`jaibddpbubhaxbidedfczdseu````````",
+"````````````fcdoedafejcudg`jercmesbseyducdcmctcabdbvbvb`b`b`eaeaadayfjbocjbdfaafadeaeaa`cmbdbvcfbjai`wedczda`jbze`fier`jaidrcfaeedd`co``````````",
+"````````````as`lbycqdabpbick`jdweb`v`oeyfhdhbidbdbcwfgbvbvbvb`b`bcbkbzeybjefbddyb`b`b`ay`kbjbcbdbifiavdubrey`obtesdw`jcfe`dscufibyfbds``````````",
+"``````````````ateuczdfbpcuamck`jbi`ycs`oey`zacdgcz`w`wcwfgfgbvbvcbaiaiaocadhfeaybvbvbv`obhdy`d`wcxavdueyey`ocsctbce`ckcfbudacufdfdco````````````",
+"``````````````asbtd`bpededbiamcmbubj`vcscsbsdbcaaacvcx`w`w`wcwcwdyeyeldgejcmfefgfgcwcw`w`w`wcxavdubreybscscsdpbze`crambue`bybydoaqas````````````",
+"````````````````eufb`y`sfdf`bifdaxbhacerdpcsfiazcabrduduavcxcx`wbycs`qdgbzbjed`w`w`wcxcxavdudubreybs`ocsdpbtaidbe`ambidfaubyeufdaq``````````````",
+"``````````````````drfbdscqaedebideffaabuerdpfdbzaicafecfbrdudufhfhdpacbscsavavavavavdudubreyey`zbqcscsdpbubzbudwamcrdedsfd`ycqep````````````````",
+"``````````````````dmat`zdobyaedefdcudgfbcr`jeraxeldb`kdbczeyeyazbjbd`vfielca`vbrbreyeybnbs`o`oebcvdperbqffacdgfcdr`saeed`s`zaqep````````````````",
+"````````````````````coatdo`yeddfczbpde`d`kck`jer`v`zaibdescs`bamdbercvfi`veyeybsbs`ocvcscscsebazerer`jckdgfddrf`aue`dr`y`zatep``````````````````",
+"``````````````````````exat`s`ydsbtcufibiegbh`kck`jaxbzaieldpbheiacbjcscscscscscscscs`qdpdpfh`jbt`jck`kbhegcuejfcdse`bp`satbp````````````````````",
+"````````````````````````exdr`ldoaucqfidecfbiegbhcrcfao`y`jer`zebazdpdpdpdpdpdpdpbnerereregf`debqcrbhegbibzdfbybtcqcq`tatex``````````````````````",
+"``````````````````````````coaqatf`byeddfaedeeibidgcubyfdckckfdbuff`j`jf`eicf`j`j`j`j`jaacadrbhf`e`bieibpaieucuexdododmco````````````````````````",
+"````````````````````````````epeubtcq`yczbp`sbpbpdsfdaeegambheiff`sckckckckckckck`k`kf`buamegbi`dcfdedfdse`bpdofccqcodm``````````````````````````",
+"``````````````````````````````aqeuatdocqfbds`tdfaededecfeiaacucregamamamamamamamegegbibieicfdedsbtdsbpbpcqbt`lasasaq````````````````````````````",
+"``````````````````````````````````coepcqbpcq`yczedfidfaedeaecubpdeeieif`cucueieicfcfdededeaeatbpbybpdobpfdasdoep````````````````````````````````",
+"````````````````````````````````````epaqasdofbf``ybyczedfifidfcucubpcubpeufificu`saedf`sfiedczdrcudo`mascq`maq``````````````````````````````````",
+"````````````````````````````````````````epasdr`tfb`zf``ybyczeubpdscqaubtdred`tedededczczbyds`meufb`tasbpep``````````````````````````````````````",
+"````````````````````````````````````````````asepaqdocofbfb`zfbbtdobpcq`zbt`y`y`yd`d`f``zfbfb`tateuepaq``````````````````````````````````````````",
+"````````````````````````````````````````````````dodoepeudrat`tdodseudoas`mfbfbfbfbbt`tatdreudsdoaq``````````````````````````````````````````````",
+"``````````````````````````````````````````````````````aqasepepasepcoasepexdrdreueuds`mepdoaq````````````````````````````````````````````````````",
+"``````````````````````````````````````````````````````````````epepepepepdoaqaqasepaq````````````````````````````````````````````````````````````",
+"````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````",
+"````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````"
+};
diff --git a/hacks/images/bubbles/blue2.xpm b/hacks/images/bubbles/blue2.xpm
new file mode 100644 (file)
index 0000000..9415216
--- /dev/null
@@ -0,0 +1,89 @@
+/* XPM */
+static char *blue2[] = {
+/* width height ncolors chars_per_pixel */
+"12 12 70 2",
+/* colors */
+"`` c None",
+"`a c #323252",
+"`b c #303050",
+"`c c #0F0F1F",
+"`d c #1B1B2E",
+"`e c #17172A",
+"`f c #1F1F35",
+"`g c #181824",
+"`h c #25253E",
+"`i c #10101C",
+"`j c #20202F",
+"`k c #0E0E1A",
+"`l c #292945",
+"`m c #141423",
+"`n c #242436",
+"`o c #2D2D4C",
+"`p c #333355",
+"`q c #313153",
+"`r c #0D0D15",
+"`s c #24243C",
+"`t c #262641",
+"`u c #232334",
+"`v c #3C3C5D",
+"`w c #19192A",
+"`x c #303051",
+"`y c #111122",
+"`z c #1F1F33",
+"a` c #08080F",
+"aa c #212138",
+"ab c #12121F",
+"ac c #0E0E1B",
+"ad c #1E1E2E",
+"ae c #2B2B48",
+"af c #2F2F4F",
+"ag c #1C1C2F",
+"ah c #18182B",
+"ai c #353558",
+"aj c #15151E",
+"ak c #1C1C32",
+"al c #26263F",
+"am c #13131F",
+"an c #0F0F1B",
+"ao c #2A2A46",
+"ap c #131322",
+"aq c #2E2E4D",
+"ar c #0F0F1E",
+"as c #343456",
+"at c #151527",
+"au c #1F1F34",
+"av c #0C0C14",
+"aw c #494967",
+"ax c #23233B",
+"ay c white",
+"az c #0C0C17",
+"b` c #141422",
+"ba c #2D2D4B",
+"bb c #0E0E1C",
+"bc c #161627",
+"bd c #333354",
+"be c #141425",
+"bf c #1E1E32",
+"bg c #1C1C30",
+"bh c #0B0B12",
+"bi c #18182C",
+"bj c #090910",
+"bk c #222239",
+"bl c #0F0F19",
+"bm c #1B1B28",
+"bn c #262640",
+"bo c #151522",
+/* pixels */
+"`````````d`sacbmbf``````",
+"````a`axaobaaqba`max`r``",
+"````aabbaf`a`pak`t`jaa``",
+"```wah`c`nbiaias`qbaal`w",
+"``an`zadatbday`v`y`obebg",
+"``azbnbgakbeaw`e`uadacag",
+"``apaxbk`o`f`x`b`o`lbcaz",
+"``avbf`haradaoae`lab`wbh",
+"````b``g`kalbcalaxauaz``",
+"````bjboaj`iaubfajabbj``",
+"````````blbhavambl``````",
+"````````````````````````"
+};
diff --git a/hacks/images/bubbles/blue3.xpm b/hacks/images/bubbles/blue3.xpm
new file mode 100644 (file)
index 0000000..b38a8d4
--- /dev/null
@@ -0,0 +1,103 @@
+/* XPM */
+static char *blue3[] = {
+/* width height ncolors chars_per_pixel */
+"14 14 82 2",
+/* colors */
+"`` c None",
+"`a c #2A2A47",
+"`b c #282845",
+"`c c #111121",
+"`d c #2E2E4E",
+"`e c #1B1B2E",
+"`f c #0A0A10",
+"`g c #17172A",
+"`h c #101019",
+"`i c #181824",
+"`j c #21213A",
+"`k c #10101C",
+"`l c #20202F",
+"`m c #0C0C18",
+"`n c #161628",
+"`o c #07070F",
+"`p c #24243C",
+"`q c #0B0B16",
+"`r c #282843",
+"`s c #11111F",
+"`t c #0F0F1D",
+"`u c #1B1B2C",
+"`v c #19192A",
+"`w c #151526",
+"`x c #303051",
+"`y c #111122",
+"`z c #19192D",
+"a` c #23233A",
+"aa c #212138",
+"ab c #0E0E18",
+"ac c #0A0A14",
+"ad c #272741",
+"ae c #23233D",
+"af c #202030",
+"ag c #1E1E2E",
+"ah c #2B2B48",
+"ai c #181828",
+"aj c #28283B",
+"ak c #2F2F4F",
+"al c #2D2D4D",
+"am c #1C1C2F",
+"an c #18182B",
+"ao c #353558",
+"ap c #15151E",
+"aq c #191925",
+"ar c #24243D",
+"as c #13131F",
+"at c #11111D",
+"au c #0D0D19",
+"av c #262642",
+"aw c #151524",
+"ax c #2E2E4D",
+"ay c #343456",
+"az c #06060B",
+"b` c #0C0C14",
+"ba c #494967",
+"bb c #23233B",
+"bc c white",
+"bd c #0C0C17",
+"be c #292944",
+"bf c #0A0A15",
+"bg c #2D2D4B",
+"bh c #0E0E1C",
+"bi c #1A1A2B",
+"bj c #373758",
+"bk c #181829",
+"bl c #161627",
+"bm c #141425",
+"bn c #313152",
+"bo c #121223",
+"bp c #1E1E32",
+"bq c #1C1C30",
+"br c #18182C",
+"bs c #222239",
+"bt c #11111B",
+"bu c #1E1E35",
+"bv c #0F0F19",
+"bw c #0D0D17",
+"bx c #0B0B15",
+"by c #1B1B28",
+"bz c #262640",
+"c` c #2C2C49",
+/* pixels */
+"``````````awbsau`mbp````````",
+"``````bdbhbe`wbu`lbe`p`w````",
+"`````var`aaxbmbn`caxbr`tb```",
+"````aqbeblbr`baybnboax`lat``",
+"``ai`pbq`g`ubmbaao`yak`g`pai",
+"```s`tahakalbabcbaajafbr`tbw",
+"``ap`p`cagav`vbabjbnax`l`i`n",
+"``aiaaadc``d`jbn`x`cc`adai`h",
+"``as`e`n`r`zagbzbgae`r`pacbx",
+"````as`qanad`r`n`rag`pbf`h``",
+"````bvbkbpbqaubba`byabbtbv``",
+"``````azaw`sauabambi`o`f````",
+"``````````abbw`katab````````",
+"````````````````````````````"
+};
diff --git a/hacks/images/bubbles/blue4.xpm b/hacks/images/bubbles/blue4.xpm
new file mode 100644 (file)
index 0000000..bb0843d
--- /dev/null
@@ -0,0 +1,157 @@
+/* XPM */
+static char *blue4[] = {
+/* width height ncolors chars_per_pixel */
+"20 20 130 2",
+/* colors */
+"`` c None",
+"`a c #2A2A47",
+"`b c #282845",
+"`c c #323252",
+"`d c #303050",
+"`e c #111121",
+"`f c #2E2E4E",
+"`g c #0F0F1F",
+"`h c #1D1D30",
+"`i c #1B1B2E",
+"`j c #0C0C12",
+"`k c #0A0A10",
+"`l c #17172A",
+"`m c #212137",
+"`n c #767691",
+"`o c #1F1F35",
+"`p c #2F2F48",
+"`q c #101019",
+"`r c #0E0E17",
+"`s c #181824",
+"`t c #25253E",
+"`u c #12121E",
+"`v c #10101C",
+"`w c #20202F",
+"`x c #0E0E1A",
+"`y c #0C0C18",
+"`z c #292945",
+"a` c #161625",
+"aa c #141423",
+"ab c #121221",
+"ac c #2F2F4E",
+"ad c #2D2D4C",
+"ae c #1A1A2C",
+"af c #5C5C7A",
+"ag c #161628",
+"ah c #333355",
+"ai c #07070C",
+"aj c #313153",
+"ak c #05050A",
+"al c #0D0D15",
+"am c #24243C",
+"an c #202038",
+"ao c #1D1D2B",
+"ap c #0B0B16",
+"aq c #282843",
+"ar c #11111F",
+"as c #2C2C4A",
+"at c #3C3C5D",
+"au c #1B1B2C",
+"av c #19192A",
+"aw c #131324",
+"ax c #303051",
+"ay c #111122",
+"az c #1F1F33",
+"b` c #19192D",
+"ba c #08080F",
+"bb c #161620",
+"bc c #23233A",
+"bd c #0E0E18",
+"be c #0A0A14",
+"bf c #272741",
+"bg c #25253F",
+"bh c #10101D",
+"bi c #1E1E2E",
+"bj c #2B2B48",
+"bk c #0C0C19",
+"bl c #292946",
+"bm c #2F2F4F",
+"bn c #101020",
+"bo c #1C1C2F",
+"bp c #2A2A40",
+"bq c #18182B",
+"br c #353558",
+"bs c #09090F",
+"bt c #07070D",
+"bu c #15151E",
+"bv c #1C1C32",
+"bw c #090912",
+"bx c #191925",
+"by c #24243D",
+"bz c #22223B",
+"c` c #13131F",
+"ca c #11111D",
+"cb c #0D0D19",
+"cc c #2A2A46",
+"cd c #171726",
+"ce c #151524",
+"cf c #131322",
+"cg c #0F0F1E",
+"ch c #343456",
+"ci c #08080D",
+"cj c #151527",
+"ck c #1F1F34",
+"cl c #1B1B30",
+"cm c #0C0C14",
+"cn c #0A0A12",
+"co c #494967",
+"cp c #23233B",
+"cq c white",
+"cr c #14141F",
+"cs c #1E1E2C",
+"ct c #0C0C17",
+"cu c #292944",
+"cv c #141422",
+"cw c #2D2D4B",
+"cx c #0E0E1C",
+"cy c #373758",
+"cz c #181829",
+"d` c #161627",
+"da c #141425",
+"db c #313152",
+"dc c #121223",
+"dd c #030307",
+"de c #BCBCD7",
+"df c #1C1C30",
+"dg c #1A1A2E",
+"dh c #0B0B12",
+"di c #18182C",
+"dj c #090910",
+"dk c #222239",
+"dl c #202037",
+"dm c #11111B",
+"dn c #1E1E35",
+"do c #0D0D17",
+"dp c #0B0B15",
+"dq c #1B1B28",
+"dr c #262640",
+"ds c #171724",
+"dt c #151522",
+"du c #2C2C49",
+/* pixels */
+"```````````````vdpbbazd``idt````````````",
+"``````````cmbbbxbg`ecpbfbgckbedm````````",
+"`````````vdscb`zbjamcwbjbj`zcsbbav``````",
+"``````czcbbq`acwbmbvaccjbmdudrcsbxca````",
+"````c``vbvcxad`dajaqahdlbjbvcf`w`tbxc```",
+"````aecbaqagbncjahdachawahblbmascpdkbe``",
+"``baap`haodidn`bbpbpataechaw`dcwcsbyapba",
+"``c`bubvaoadbmad`icodeafbr`laxadbqb`ckcv",
+"``a`apbvcccl`danb``ncq`ncybmclcwcxagbd`q",
+"```rdpby`ldfacagah`pcocodcdbacbicubxaadj",
+"``cvbhbcbfdcadbn`oacd``cabbmadbiao`xabal",
+"``bsct`m`t`objbv`fbndgbm`fcgbjcu`t`ybbdm",
+"``akcdaparcfdqbvaqcw`gcwdubzbfaodkapcdbt",
+"````c`bw`ubcdsbfcuccaycc`wbfbg`lckdmc```",
+"````bacecr`sbobx`tbkd`dr`tamdkckaucndd``",
+"```````rcecf`hd`bbctc`dkbbct`hdpcmci````",
+"````````cmcfcdcvbocrcz`haeae`qdpal``````",
+"``````````ba`jc`cebdcncmcec``kak````````",
+"``````````````aidhcm`kdobsai````````````",
+"````````````````````````````````````````"
+};
diff --git a/hacks/images/bubbles/blue5.xpm b/hacks/images/bubbles/blue5.xpm
new file mode 100644 (file)
index 0000000..e337885
--- /dev/null
@@ -0,0 +1,170 @@
+/* XPM */
+static char *blue5[] = {
+/* width height ncolors chars_per_pixel */
+"24 24 139 2",
+/* colors */
+"`` c None",
+"`a c #2A2A47",
+"`b c #323252",
+"`c c #303050",
+"`d c #111121",
+"`e c #2E2E4E",
+"`f c #0F0F1F",
+"`g c #1D1D30",
+"`h c #1B1B2E",
+"`i c #0C0C12",
+"`j c #0A0A10",
+"`k c #17172A",
+"`l c #212137",
+"`m c #767691",
+"`n c #1F1F35",
+"`o c #101019",
+"`p c #181824",
+"`q c #25253E",
+"`r c #12121E",
+"`s c #10101C",
+"`t c #20202F",
+"`u c #0E0E1A",
+"`v c #292945",
+"`w c #161625",
+"`x c #141423",
+"`y c #242436",
+"`z c #313150",
+"a` c #121221",
+"aa c #2F2F4E",
+"ab c #2D2D4C",
+"ac c #1A1A2C",
+"ad c #161628",
+"ae c #333355",
+"af c #07070C",
+"ag c #313153",
+"ah c #05050A",
+"ai c #0D0D15",
+"aj c #24243C",
+"ak c #202038",
+"al c #0D0D18",
+"am c #1D1D2B",
+"an c #0B0B16",
+"ao c #282843",
+"ap c #262641",
+"aq c #232334",
+"ar c #0F0F1D",
+"as c #2C2C4A",
+"at c #3C3C5D",
+"au c #19192A",
+"av c #151526",
+"aw c #131324",
+"ax c #303051",
+"ay c #111122",
+"az c #1F1F33",
+"b` c #08080F",
+"ba c #161620",
+"bb c #23233A",
+"bc c #212138",
+"bd c #0E0E18",
+"be c #0A0A14",
+"bf c #272741",
+"bg c #25253F",
+"bh c #12121F",
+"bi c #10101D",
+"bj c #202030",
+"bk c #0E0E1B",
+"bl c #1E1E2E",
+"bm c #2B2B48",
+"bn c #0C0C19",
+"bo c #181828",
+"bp c #28283B",
+"bq c #2F2F4F",
+"br c #101020",
+"bs c #1C1C2F",
+"bt c #18182B",
+"bu c #353558",
+"bv c #09090F",
+"bw c #333356",
+"bx c #07070D",
+"by c #15151E",
+"bz c #202036",
+"c` c #1C1C32",
+"ca c #090912",
+"cb c #191925",
+"cc c #26263F",
+"cd c #24243D",
+"ce c #22223B",
+"cf c #13131F",
+"cg c #11111D",
+"ch c #0F0F1B",
+"ci c #0D0D19",
+"cj c #2A2A46",
+"ck c #171726",
+"cl c #131322",
+"cm c #111120",
+"cn c #2E2E4D",
+"co c #0F0F1E",
+"cp c #343456",
+"cq c #08080D",
+"cr c #151527",
+"cs c #06060B",
+"ct c #1F1F34",
+"cu c #0C0C14",
+"cv c #0A0A12",
+"cw c #494967",
+"cx c #23233B",
+"cy c white",
+"cz c #0C0C17",
+"d` c #292944",
+"da c #0A0A15",
+"db c #262637",
+"dc c #141422",
+"dd c #2D2D4B",
+"de c #0E0E1C",
+"df c #1A1A2B",
+"dg c #161627",
+"dh c #333354",
+"di c #141425",
+"dj c #313152",
+"dk c #121223",
+"dl c #030307",
+"dm c #BCBCD7",
+"dn c #1E1E32",
+"do c #1C1C30",
+"dp c #1A1A2E",
+"dq c #0B0B12",
+"dr c #18182C",
+"ds c #090910",
+"dt c #222239",
+"du c #11111B",
+"dv c #1E1E35",
+"dw c #0F0F19",
+"dx c #0D0D17",
+"dy c #0B0B15",
+"dz c #1B1B28",
+"e` c #262640",
+"ea c #151522",
+"eb c #212131",
+"ec c #2C2C49",
+/* pixels */
+"``````````````````bxdybsdobsdfdc````````````````",
+"```````````````r`h`rajcibk`udzdgdnau````````````",
+"``````````b``gcicgao`xavazcd`vao`q`u`gcf````````",
+"````````b`aucxdicjecddcncnadddec`xbfcxdaai``````",
+"``````aibkbkbi`addaaaabm`ydpbgaaawcobfci`gcg````",
+"``````dfbce`deddbqdj`bayaeasc`djapak`te`bcac````",
+"````eadaciaodpc`ayaycrdrcpdiacaqcr`eecdtaj`hea``",
+"````auanbtcj`fdv`yaedrbububpcp`eagbqddblccbzau``",
+"``bd`ual`qc`abcndkbwdi`zcwcwbubwbp`cabe`bidtcz`j",
+"``bhchdtaz`qbl`ccrdhdh`mcydmatbway`cabdedidtdobh",
+"``cg`gdtboamco`ddjaebz`mcydmatawakapdddecmalcvcg",
+"``cgczdte`dedo`ec``bdiatcwcw`k`baq`ebl`vbkdtbscv",
+"``bxbe`u`qbodeabbraxdrbjadaedjbjbqabbmaoc``lczbx",
+"``dwclbicxbfdtecabaa`nbraxdb`cblabec`vbfdgctczdw",
+"``cvckbe`lbndzcjaoddcnajaocncnddcocjbf`qanad`wcv",
+"````cuchdnan`qbfcocebleccjecbmeb`v`kbh`paudfdq``",
+"````dx`xclbtdtbtaraod`ambr`xd`aravdc`geaa``wbv``",
+"``````cgdcbt`pbc`u`qccdtdge`cc`qcxbcctbyczcs````",
+"``````cqcsckcl`gdicidtardibbdt`lcbbacl`o`odl````",
+"````````dscseaauby`r`sctctctdndubyaubhbxds``````",
+"``````````afcscv`wbocaacacacaubobdb``iaf````````",
+"``````````````ahdw`rdqbxcudccfcvdwb`````````````",
+"``````````````````afdlbvdsdq`jaf````````````````",
+"````````````````````````````````````````````````"
+};
diff --git a/hacks/images/bubbles/blue6.xpm b/hacks/images/bubbles/blue6.xpm
new file mode 100644 (file)
index 0000000..f70bb6c
--- /dev/null
@@ -0,0 +1,195 @@
+/* XPM */
+static char *blue6[] = {
+/* width height ncolors chars_per_pixel */
+"30 30 158 2",
+/* colors */
+"`` c None",
+"`a c #2A2A47",
+"`b c #191929",
+"`c c #323252",
+"`d c #303050",
+"`e c #111121",
+"`f c #2E2E4E",
+"`g c #1D1D30",
+"`h c #1B1B2E",
+"`i c #0C0C12",
+"`j c #0A0A10",
+"`k c #17172A",
+"`l c #212137",
+"`m c #767691",
+"`n c #1F1F35",
+"`o c #2F2F48",
+"`p c #101019",
+"`q c #181824",
+"`r c #25253E",
+"`s c #12121E",
+"`t c #10101C",
+"`u c #20202F",
+"`v c #0E0E1A",
+"`w c #2B2B47",
+"`x c #0C0C18",
+"`y c #292945",
+"`z c #161625",
+"a` c #141423",
+"aa c #242436",
+"ab c #121221",
+"ac c #2F2F4E",
+"ad c #2D2D4C",
+"ae c #1A1A2C",
+"af c #5C5C7A",
+"ag c #161628",
+"ah c #333355",
+"ai c #07070C",
+"aj c #313153",
+"ak c #05050A",
+"al c #0D0D15",
+"am c #07070F",
+"an c #24243C",
+"ao c #202038",
+"ap c #0D0D18",
+"aq c #1D1D2B",
+"ar c #0B0B16",
+"as c #282843",
+"at c #232334",
+"au c #11111F",
+"av c #0F0F1D",
+"aw c #2C2C4A",
+"ax c #3C3C5D",
+"ay c #1B1B2C",
+"az c #19192A",
+"b` c #151526",
+"ba c #131324",
+"bb c #303051",
+"bc c #111122",
+"bd c #1F1F33",
+"be c #19192D",
+"bf c #08080F",
+"bg c #161620",
+"bh c #23233A",
+"bi c #212138",
+"bj c #0E0E18",
+"bk c #0A0A14",
+"bl c #272741",
+"bm c #25253F",
+"bn c #12121F",
+"bo c #10101D",
+"bp c #202030",
+"bq c #0E0E1B",
+"br c #1E1E2E",
+"bs c #2B2B48",
+"bt c #0C0C19",
+"bu c #181828",
+"bv c #28283B",
+"bw c #262639",
+"bx c #2F2F4F",
+"by c #101020",
+"bz c #18182B",
+"c` c #353558",
+"ca c #09090F",
+"cb c #333356",
+"cc c #07070D",
+"cd c #15151E",
+"ce c #202036",
+"cf c #1C1C32",
+"cg c #090912",
+"ch c #191925",
+"ci c #26263F",
+"cj c #24243D",
+"ck c #22223B",
+"cl c #13131F",
+"cm c #11111D",
+"cn c #0F0F1B",
+"co c #0D0D19",
+"cp c #2A2A46",
+"cq c #262642",
+"cr c #171726",
+"cs c #151524",
+"ct c #131322",
+"cu c #111120",
+"cv c #2E2E4D",
+"cw c #0F0F1E",
+"cx c #343456",
+"cy c #08080D",
+"cz c #151527",
+"d` c #06060B",
+"da c #1F1F34",
+"db c #1B1B30",
+"dc c #0C0C14",
+"dd c #0A0A12",
+"de c #494967",
+"df c #23233B",
+"dg c white",
+"dh c #14141F",
+"di c #212139",
+"dj c #1E1E2C",
+"dk c #0C0C17",
+"dl c #292944",
+"dm c #0A0A15",
+"dn c #262637",
+"do c #141422",
+"dp c #2D2D4B",
+"dq c #0E0E1C",
+"dr c #1A1A2B",
+"ds c #373758",
+"dt c #181829",
+"du c #161627",
+"dv c #333354",
+"dw c #141425",
+"dx c #313152",
+"dy c #121223",
+"dz c #222236",
+"e` c #030307",
+"ea c #BCBCD7",
+"eb c #1E1E32",
+"ec c #1C1C30",
+"ed c #1A1A2E",
+"ee c #0B0B12",
+"ef c #18182C",
+"eg c #28283F",
+"eh c #090910",
+"ei c #222239",
+"ej c #202037",
+"ek c #11111B",
+"el c #1E1E35",
+"em c #0F0F19",
+"en c #0D0D17",
+"eo c #0B0B15",
+"ep c #1B1B28",
+"eq c #090913",
+"er c #262640",
+"es c #171724",
+"et c #151522",
+"eu c #212131",
+"ev c #2C2C49",
+/* pixels */
+"````````````````````````d`dhazazdoap`s``````````````````````",
+"``````````````````ccdraubgbiei`hcu`xar`gbkcm````````````````",
+"````````````````drbgeianbmdfbydfaqblbmageibkb```````````````",
+"````````````eoeqceboeiascpcwbsctaoeucpaser`nce`sdo``````````",
+"``````````bfarb`eicwcpbsdpadcvcvdfaddpbsa`dj`raeddal````````",
+"````````bn`tcochas`aawcvbx`kbxacczbybxcvcwerab`rchbjbn``````",
+"````````ek`besav`aawcv`ddxdbejdvcqdbdxeuaweudfbl`hcedr``````",
+"``````am`gdtau`yevcv`dbpdvbcbbdwcbahdvbzeudzb``ydweict`z````",
+"````alaearabascubmbyeladahasaocxbwbeahagbabxdp`wdfcjcebk`j``",
+"````etbkbobzdlevcfbcaaagcxasc`c`bvbvcx`kaj`dcvaqdlcieictet``",
+"````craretcudqeueuczczahaeel`cdededscxbz`cbb`fdi`kbobh`qcr``",
+"``eeazcdazepaqcw`fbx`ecz`hax`mea`mdec`ahefbb`fbcbz`hdfdaddee",
+"```pdudkctdjcpefeu`dazb`agdseadgeaafdsahaobccv`ueccwdochek`p",
+"``ekcddadfci`hcjadatdxelcf`o`meaeadebdedbb`keueveubqab`qazen",
+"``ekazeobher`kdwdtaccfdwahdrdedeafaxdyajatacdpcrdlbqbha`dkd`",
+"```p`parei`rasdqatcvbybbckegacebc`dvcfbbbxcvaw`abrcjei`gdtee",
+"``akcrdwbganblecb`dpctdnabdw`f`wdxdx`d`ncvdpbs`yblco`lek`pen",
+"``aketdkbgei`rczaqbsdpaa`f`fefedbxbx`fcveubs`yaq`rb`arbgccai",
+"````bndtdk`lcedqas`yeccwdpadcvbscvadeicfby`yascidfareoazbj``",
+"````em`zeoebctctciascwbaabevevcpevevbs`b`ydbeianbiazay`zem``",
+"````e`clapay`sepanescoasdl`yeubcdq`y`u`uctbmcuebda`vbuclai``",
+"``````bjcgcgecdmbi`xcmcierbl`udqbhbldjdjcjdfbiabeccgetbj````",
+"`````````tbjazbjdrcecndfancj`kbt`rcjandfeiceabcmazbfd```````",
+"````````bfbfcseq`v`gararbgboducleieibgceda`g`temdcekcy``````",
+"``````````ehdccccrdrcddteb`vdadadaebebemcddrcsbncceh````````",
+"````````````akemccbk`tazal`p`h`h`haydrazeebfddeecc``````````",
+"````````````````eh`i`sdocseododd`p`zcsdobf`je```````````````",
+"``````````````````e`bfenemddeobjcmekemenddak````````````````",
+"````````````````````````aie`e`bfcaaiai``````````````````````",
+"````````````````````````````````````````````````````````````"
+};
diff --git a/hacks/images/bubbles/blue7.xpm b/hacks/images/bubbles/blue7.xpm
new file mode 100644 (file)
index 0000000..6f4ee48
--- /dev/null
@@ -0,0 +1,212 @@
+/* XPM */
+static char *blue7[] = {
+/* width height ncolors chars_per_pixel */
+"36 36 169 2",
+/* colors */
+"`` c None",
+"`a c #2A2A47",
+"`b c #1B1B2B",
+"`c c #191929",
+"`d c #323252",
+"`e c #303050",
+"`f c #111121",
+"`g c #2E2E4E",
+"`h c #0F0F1F",
+"`i c #1D1D30",
+"`j c #1B1B2E",
+"`k c #0C0C12",
+"`l c #0A0A10",
+"`m c #17172A",
+"`n c #212137",
+"`o c #767691",
+"`p c #1F1F35",
+"`q c #2F2F48",
+"`r c #101019",
+"`s c #0E0E17",
+"`t c #272740",
+"`u c #181824",
+"`v c #25253E",
+"`w c #21213A",
+"`x c #12121E",
+"`y c #10101C",
+"`z c #20202F",
+"a` c #0E0E1A",
+"aa c #2B2B47",
+"ab c #0C0C18",
+"ac c #292945",
+"ad c #161625",
+"ae c #141423",
+"af c #242436",
+"ag c #121221",
+"ah c #2F2F4E",
+"ai c #2D2D4C",
+"aj c #1A1A2C",
+"ak c #5C5C7A",
+"al c #161628",
+"am c #333355",
+"an c #07070C",
+"ao c #313153",
+"ap c #05050A",
+"aq c #0D0D15",
+"ar c #07070F",
+"as c #24243C",
+"at c #202038",
+"au c #0D0D18",
+"av c #1D1D2B",
+"aw c #0B0B16",
+"ax c #282843",
+"ay c #262641",
+"az c #232334",
+"b` c #11111F",
+"ba c #0F0F1D",
+"bb c #2C2C4A",
+"bc c #3C3C5D",
+"bd c #2A2A48",
+"be c #1B1B2C",
+"bf c #19192A",
+"bg c #151526",
+"bh c #131324",
+"bi c #303051",
+"bj c #111122",
+"bk c #1F1F33",
+"bl c #19192D",
+"bm c #08080F",
+"bn c #161620",
+"bo c #23233A",
+"bp c #212138",
+"bq c #0E0E18",
+"br c #0A0A14",
+"bs c #272741",
+"bt c #25253F",
+"bu c #23233D",
+"bv c #12121F",
+"bw c #10101D",
+"bx c #202030",
+"by c #0E0E1B",
+"bz c #1E1E2E",
+"c` c #2B2B48",
+"ca c #292946",
+"cb c #181828",
+"cc c #28283B",
+"cd c #262639",
+"ce c #2F2F4F",
+"cf c #101020",
+"cg c #1C1C2F",
+"ch c #2A2A40",
+"ci c #18182B",
+"cj c #353558",
+"ck c #09090F",
+"cl c #333356",
+"cm c #07070D",
+"cn c #15151E",
+"co c #202036",
+"cp c #1C1C32",
+"cq c #090912",
+"cr c #191925",
+"cs c #26263F",
+"ct c #24243D",
+"cu c #22223B",
+"cv c #13131F",
+"cw c #11111D",
+"cx c #0F0F1B",
+"cy c #0D0D19",
+"cz c #2A2A46",
+"d` c #262642",
+"da c #171726",
+"db c #151524",
+"dc c #131322",
+"dd c #111120",
+"de c #2E2E4D",
+"df c #0F0F1E",
+"dg c #1D1D2F",
+"dh c #343456",
+"di c #08080D",
+"dj c #151527",
+"dk c #06060B",
+"dl c #1F1F34",
+"dm c #1B1B30",
+"dn c #0C0C14",
+"do c #0A0A12",
+"dp c #494967",
+"dq c #23233B",
+"dr c white",
+"ds c #212139",
+"dt c #1E1E2C",
+"du c #2B2B46",
+"dv c #0C0C17",
+"dw c #292944",
+"dx c #0A0A15",
+"dy c #262637",
+"dz c #141422",
+"e` c #2D2D4B",
+"ea c #0E0E1C",
+"eb c #1A1A2B",
+"ec c #373758",
+"ed c #181829",
+"ee c #161627",
+"ef c #333354",
+"eg c #141425",
+"eh c #313152",
+"ei c #121223",
+"ej c #222236",
+"ek c #030307",
+"el c #BCBCD7",
+"em c #1E1E32",
+"en c #1C1C30",
+"eo c #1A1A2E",
+"ep c #0B0B12",
+"eq c #18182C",
+"er c #28283F",
+"es c #090910",
+"et c #222239",
+"eu c #11111B",
+"ev c #1E1E35",
+"ew c #0F0F19",
+"ex c #0D0D17",
+"ey c #0B0B15",
+"ez c #1B1B28",
+"f` c #090913",
+"fa c #262640",
+"fb c #171724",
+"fc c #151522",
+"fd c #212131",
+"fe c #2E2E4B",
+"ff c #2C2C49",
+/* pixels */
+"````````````````````````````````cq`sdaaddn``````````````````````````````",
+"`````````````````````````xedcgfc`ucocyaba`aecgcqdz``````````````````````",
+"````````````````````dobe`jbnetasbabybyddboezdl`nembrar``````````````````",
+"``````````````````ebema`fcctbsezbybwdqegdbaxbsetdq`xemcb````````````````",
+"``````````````exaucx`nby`zaxczfddfffeq`m`aaaczaxbsby`n`pbedz````````````",
+"````````````bmfcemdqagagczc`bbe`dededebg`me`bbc`aebafcdqawa`aq``````````",
+"``````````cvbecodqbydc`affaideajcfdjblegdm`wdebebh`pdafaezbndvcv````````",
+"``````````bf`icwdtb``abbdeah`eeqbje``dbd`fc``e`vevbheqax`va`bkbf````````",
+"````````cqbrbpalejeaffdecebieh`d`geiamafdjcpehc`aybg`c`zbsezbpbraq``````",
+"``````doajda`pcyacbte`aheveeefafevaldhdhclamefd`bgahe`c`acdqdq`pdv`x````",
+"``````daeyawcyaxavayeicudyeiamdjdmevcjdydycgafbhevcedebbcfav`vbpdada````",
+"`````lbfajagciaxc``hdscfafdmcleqafcjcjcjcjdhcdalao`eahe`ataxcsetcgbfey``",
+"````dccxdcdgcyeeaxaieq`malccdheqaxchdpbc`qcjdhalafbiceaibldceadq`pbvdc``",
+"````cmf`emdq`pacczaicebubjcidhbsdudpakakdpecdherbjehceaiagddemascobnad``",
+"`````scx`n`mbkacdwbzcebidjeidhef`oeldrel`obcdhccbjdgceaiay`megby`nenbm``",
+"``aqda`i`neeavacc`bhdwbifdbdduemakdrdrdr`obcdhcicubseoaidqdjdden`nbf`saq",
+"``bqdaencoasfabscf`mac`eehbjdyajakelelelakbceibjcecfate`c`cs`fcycocgdado",
+"```l`rdvcodqfadqcfenercecpcfefegazdpdpakbc`mciehazejdebzaxaxbydqawcgcqdi",
+"``ap`ragbaet`v`zcfagaxdecfageheidhfeccecdhazdjbicedee`c`czax`metcrbq`rdn",
+"``ekdbdccyetctbsadbhbbaifaaxbibdehevee`deh`ec``v`gaibb`tdwdt`jetemaj`sep",
+"````bmdcbf`udqbtbtetc`bbaialce`pegbubibi`e`ece`faibbc`ac`zbteebe`idvcm``",
+"````eucqa``xetcteeaeczc`fdevdedybzeqcpceahdedeegffc`czaxfacrcycwcgdc`x``",
+"````apdb`sdbcoawdqezaxaccacubge`aibxaiaiaie``ccpalddaxbs`vbocycgajdnew``",
+"````bmdncbexemagen`vfa`zdfeacpbzffbbczbbffc`aadtacblblbvci`nbfcgcbepek``",
+"```````rdbbaaedl`ndq`vdcagaxacczczaveadfczcz`fbebsfabpbaagdlbebfdbdo````",
+"``````apbvcxbf`idx`nfbbfcyfabsaxb`bwbgbaaxax`jb`bfasbo`nen`idvcqbvdo````",
+"````````bqbmdzajbr`ucocya`ct`vcsdtegeeezfacs`vctdqetcodldvajdvbvan``````",
+"``````````ewcmdadaa`emeyagezbodqfbabcoasasdqboetbncobrbrajdaeycm````````",
+"``````````ckdkdzcvda`j`i`uagen`bcycr`uetbpcrcodxem`idcdnardn`yek````````",
+"````````````es`karfccbebcnal`i`yawdldldlbkemebdacnebbwbvcm`ses``````````",
+"``````````````ekbq`xbmbmdoadajed`rcgcgcg`jeuajbfcbdbdvdkcmdi````````````",
+"``````````````````ekbm`xdzdbdacqdaedcqedcbdadaaqbvdkeydk````````````````",
+"````````````````````ekdneweubvepdoardn`sdzcvbv`lewapek``````````````````",
+"````````````````````````dkekdn`sdodk`lewew`sdndoan``````````````````````",
+"````````````````````````````````ekekdkanek``````````````````````````````",
+"````````````````````````````````````````````````````````````````````````"
+};
diff --git a/hacks/images/bubbles/blue8.xpm b/hacks/images/bubbles/blue8.xpm
new file mode 100644 (file)
index 0000000..d4babc4
--- /dev/null
@@ -0,0 +1,219 @@
+/* XPM */
+static char *blue8[] = {
+/* width height ncolors chars_per_pixel */
+"44 44 168 2",
+/* colors */
+"`` c None",
+"`a c #2A2A47",
+"`b c #1B1B2B",
+"`c c #282845",
+"`d c #191929",
+"`e c #323252",
+"`f c #303050",
+"`g c #111121",
+"`h c #2E2E4E",
+"`i c #1D1D30",
+"`j c #1B1B2E",
+"`k c #0A0A10",
+"`l c #17172A",
+"`m c #212137",
+"`n c #767691",
+"`o c #1F1F35",
+"`p c #2F2F48",
+"`q c #101019",
+"`r c #0E0E17",
+"`s c #272740",
+"`t c #181824",
+"`u c #25253E",
+"`v c #21213A",
+"`w c #12121E",
+"`x c #10101C",
+"`y c #20202F",
+"`z c #2B2B47",
+"a` c #0C0C18",
+"aa c #292945",
+"ab c #161625",
+"ac c #141423",
+"ad c #242436",
+"ae c #121221",
+"af c #2F2F4E",
+"ag c #2D2D4C",
+"ah c #2B2B4A",
+"ai c #1A1A2C",
+"aj c #5C5C7A",
+"ak c #161628",
+"al c #333355",
+"am c #07070C",
+"an c #05050A",
+"ao c #0D0D15",
+"ap c #07070F",
+"aq c #24243C",
+"ar c #202038",
+"as c #0D0D18",
+"at c #1D1D2B",
+"au c #0B0B16",
+"av c #282843",
+"aw c #262641",
+"ax c #232334",
+"ay c #11111F",
+"az c #0F0F1D",
+"b` c #2C2C4A",
+"ba c #3C3C5D",
+"bb c #2A2A48",
+"bc c #1B1B2C",
+"bd c #19192A",
+"be c #151526",
+"bf c #131324",
+"bg c #303051",
+"bh c #111122",
+"bi c #19192D",
+"bj c #08080F",
+"bk c #161620",
+"bl c #23233A",
+"bm c #212138",
+"bn c #0E0E18",
+"bo c #0A0A14",
+"bp c #272741",
+"bq c #25253F",
+"br c #23233D",
+"bs c #12121F",
+"bt c #10101D",
+"bu c #202030",
+"bv c #0E0E1B",
+"bw c #1E1E2E",
+"bx c #2B2B48",
+"by c #0C0C19",
+"bz c #292946",
+"c` c #181828",
+"ca c #28283B",
+"cb c #262639",
+"cc c #2F2F4F",
+"cd c #101020",
+"ce c #2D2D4D",
+"cf c #1C1C2F",
+"cg c #2A2A40",
+"ch c #18182B",
+"ci c #353558",
+"cj c #09090F",
+"ck c #333356",
+"cl c #07070D",
+"cm c #15151E",
+"cn c #202036",
+"co c #1C1C32",
+"cp c #090912",
+"cq c #191925",
+"cr c #26263F",
+"cs c #24243D",
+"ct c #22223B",
+"cu c #13131F",
+"cv c #11111D",
+"cw c #0F0F1B",
+"cx c #0D0D19",
+"cy c #2A2A46",
+"cz c #262642",
+"d` c #171726",
+"da c #151524",
+"db c #131322",
+"dc c #111120",
+"dd c #2E2E4D",
+"de c #0F0F1E",
+"df c #1D1D2F",
+"dg c #343456",
+"dh c #08080D",
+"di c #151527",
+"dj c #06060B",
+"dk c #1F1F34",
+"dl c #1B1B30",
+"dm c #0C0C14",
+"dn c #0A0A12",
+"do c #494967",
+"dp c #23233B",
+"dq c white",
+"dr c #14141F",
+"ds c #212139",
+"dt c #1E1E2C",
+"du c #2B2B46",
+"dv c #0C0C17",
+"dw c #292944",
+"dx c #0A0A15",
+"dy c #262637",
+"dz c #141422",
+"e` c #2D2D4B",
+"ea c #0E0E1C",
+"eb c #1A1A2B",
+"ec c #373758",
+"ed c #181829",
+"ee c #161627",
+"ef c #333354",
+"eg c #141425",
+"eh c #313152",
+"ei c #121223",
+"ej c #222236",
+"ek c #BCBCD7",
+"el c #1E1E32",
+"em c #1C1C30",
+"en c #1A1A2E",
+"eo c #0B0B12",
+"ep c #18182C",
+"eq c #28283F",
+"er c #090910",
+"es c #222239",
+"et c #202037",
+"eu c #11111B",
+"ev c #1E1E35",
+"ew c #0F0F19",
+"ex c #0D0D17",
+"ey c #0B0B15",
+"ez c #1B1B28",
+"f` c #090913",
+"fa c #262640",
+"fb c #171724",
+"fc c #151522",
+"fd c #212131",
+"fe c #2C2C49",
+/* pixels */
+"````````````````````````````````````````````ao``````````````````````````````````````````",
+"````````````````````````````````dmbs`wcffb`i`i`i`ieyaicxfc``````````````````````````````",
+"````````````````````````````c`euegcwcnbmesa`a`aza`cxcffb`ibo`x``````````````````````````",
+"````````````````````````c`cfau`mezdp`uenakaeeadpcr`u`ucxa``mbtcvc```````````````````````",
+"````````````````````cvaiel`lezazd`bpavdbbvdbdseaeiayavbpbvcsesa`eleufc``````````````````",
+"``````````````````eebeasaubycobpavaa`adic`cyeade`dbw`aaaavbpdbcvesdkdvd`````````````````",
+"````````````````bjdvcxeschaqavaa`zbxb`e`agagddbwbfbdb`bx`zaaemdt`uesauf`d```````````````",
+"``````````````d`cf`xcfazcx`j`ybxb`agddag`lchej`g`cbxddag`gdieaeaaz`ubeakcmbj````````````",
+"````````````dabcdxee`udedw`afee`ddafccaf`ccecobg`lcdejafddaecddedtbp`uchdk`w`q``````````",
+"``````````bnebdrcqbccxea`afee`ddcc`fbfbibhep`eaaawczbu`feqeiawbxegavfachbmelebcl````````",
+"``````````c`bdcncvezateafee`ddccbgeh`ecbetcaaldfbqegawehdibxad`vae`yavcr`lcnbocv````````",
+"````````dzaibkcwcvezaacse`ddccendf`eefbhdddlfeckckalef`ebfardddd`ybxaacseaes`taudz``````",
+"`````````xbobv`o`uavdtdcde`g`gawbgalck`vepfddgdg`leldwaketei`fafagfecyeacrdpbkf``r``````",
+"``````cuebazbvcdaedw`ybhegbqbudibfalcaahducicicaciegcbakei`lbgccddb`bmavbpcsbmbn`wcu````",
+"``````bjf`dx`jchcsaabxbfbrbhbh`cbfckctdgciecececadcidgckdiejeh`ffde`bmaad``uescq`jao````",
+"`````kd`dx`ofbenazcddbagbwcdcdawcbdgbrdi`i`pdodobaeccidgb`axeh`fafagbibpevdbdpcna`d`ex``",
+"`````w`dbofbeeakavc`cdagafctet`leqdg`cblecajajajajbacidgdwbbeh`fafagawaaatetdpcneudv`w``",
+"`````rbdcf`baidtavegdbebafeqcbbhavdg`i`pajekekek`ndobadgad`lai`fafagdpegazcoaz`m`ibodb``",
+"````dnbdelelcdeaavcybuevaf`feh`vcodgesba`ndqdqdqekajbadgalbhctbdaxagee`gaebvcv`mel`qdz``",
+"`````xcmau`mdfbt`yfdbwegbc`fehejbxdgefdo`ndqdqdq`najbadg`lepev`adye``lctem`jaz`mcfeudn``",
+"````fcebel`mdpezatcsdbenbqbzbgbe`lalakcgdo`nekek`ndoadakepbhcdcocde`bxcybv`oez`mbddbbn``",
+"``djcpbdeycndpesazeaeaemfdaf`fepaeefbpbdecajdoajdobaefaxehbgdyafagbw`yaaatdsdpcwdbdmcwdj",
+"````cwcmbd`jes`ubpdpcoegcyddenepdfehbxaxcgcgcabaecdgarbdeh`fccdde`fecyavezbiescney`rdz``",
+"````bnedf`auesaqfaavchazb`agcddidybgcdcacb`aegalef`eaxenfeccddagb`bxaaav`tevesdkbvedcl``",
+"````bjd`daau`mdp`ubpatawcrb`age`ch`fcdbhbibeehehehbg`fcfavddagb`bxcyavbp`ua``melcp`qdj``",
+"`````xabbdbodfescsfaeaarfdbxb`cyakafak`leieiax`f`fccccaf`lbwb`bx`aaadtfa`j`icv`iasas`x``",
+"`````kdzbndvdv`mdpbsbiabaa`abxbxbpddddaxbccddsafaf`hdddd`ycoeg`aaaavfa`ubydbbecfcpbjbn``",
+"````djcud`cpdbcnfcayaqezavaa`aazaaaxe`agagcdb`ddagage`ee`oakeaaaavbp`uaqfbcnbtd`eyewdn``",
+"```````xda`qeyelcnbv`iatbpavdteacocsdeesb`bueiavb`b`febxcdfdelbvbeezezescnazeybd`q`x````",
+"``````dmcud`eydvdkbeeaaq`ufadecdac`y`a`zbx`seaaqbx`z`acyaaavbpatbvbvaz`m`tdvaid`cuan````",
+"````````clfccvbt`iaycwescvdebv`yavavdwaaaa`yde`l`yaadwemavabel`uaeakeldk`iaec`fc`x``````",
+"````````dm`wap`x`j`icx`mescxbvaqfabpbpavaecodbabavavbpbmaebvcsdpes`mdv`i`j`x`r`wdm``````",
+"``````````ewcv`xbdakdx`tcnbmbycwcs`ubqcrbicxeeayfacrbq`ucsdpblbmcndk`i`jdncvcvbn````````",
+"``````````er`xex`qbddvbtbk`ocxazesdpaq`ta`by`jcscsaqaqbcescq`m`obecxbcbdcpbsaner````````",
+"````````````eobjcveebscwey`ibkeleldceselauezcxcqesesez`mcncuel`idvaydveudz`xan``````````",
+"``````````````dm`xaocpabebbccffbasbd`oegazcncncncncn`odkd`drcfbcazdzeybs`xdm````````````",
+"````````````````dhbjdm`qd`edebbkd`emdrazelelelelelel`ibocfbofcedee`xdmaneo``````````````",
+"``````````````````anbndjerbnbseydnebf`ai`jcfcfcf`jbcaiebbdc``qdmbndv`rdh````````````````",
+"````````````````````dhdjdnaodbfcabd`cpc``dbd`rbd`dedc`d`aodzbjdjdmcldh``````````````````",
+"````````````````````````anaoewcvbsdbdzeoclap`q`rdafcdzdbcldmewcjer``````````````````````",
+"````````````````````````````djdj`reweoexcldjbn`wcveu`xew`rdmdh``````````````````````````",
+"````````````````````````````````amcjdndjeoanandmdmdmdnamam``````````````````````````````",
+"````````````````````````````````````````````am``````````````````````````````````````````",
+"````````````````````````````````````````````````````````````````````````````````````````"
+};
diff --git a/hacks/images/bubbles/blue9.xpm b/hacks/images/bubbles/blue9.xpm
new file mode 100644 (file)
index 0000000..2026b9b
--- /dev/null
@@ -0,0 +1,227 @@
+/* XPM */
+static char *blue9[] = {
+/* width height ncolors chars_per_pixel */
+"50 50 170 2",
+/* colors */
+"`` c None",
+"`a c #2A2A47",
+"`b c #1B1B2B",
+"`c c #282845",
+"`d c #191929",
+"`e c #323252",
+"`f c #303050",
+"`g c #111121",
+"`h c #2E2E4E",
+"`i c #0F0F1F",
+"`j c #1D1D30",
+"`k c #1B1B2E",
+"`l c #0C0C12",
+"`m c #0A0A10",
+"`n c #17172A",
+"`o c #212137",
+"`p c #767691",
+"`q c #1F1F35",
+"`r c #2F2F48",
+"`s c #101019",
+"`t c #0E0E17",
+"`u c #272740",
+"`v c #181824",
+"`w c #25253E",
+"`x c #21213A",
+"`y c #12121E",
+"`z c #10101C",
+"a` c #20202F",
+"aa c #0E0E1A",
+"ab c #2B2B47",
+"ac c #0C0C18",
+"ad c #292945",
+"ae c #161625",
+"af c #141423",
+"ag c #242436",
+"ah c #313150",
+"ai c #121221",
+"aj c #2F2F4E",
+"ak c #2D2D4C",
+"al c #1A1A2C",
+"am c #5C5C7A",
+"an c #161628",
+"ao c #333355",
+"ap c #07070C",
+"aq c #313153",
+"ar c #05050A",
+"as c #0D0D15",
+"at c #24243C",
+"au c #202038",
+"av c #0D0D18",
+"aw c #1D1D2B",
+"ax c #0B0B16",
+"ay c #282843",
+"az c #262641",
+"b` c #232334",
+"ba c #11111F",
+"bb c #0F0F1D",
+"bc c #2C2C4A",
+"bd c #3C3C5D",
+"be c #1B1B2C",
+"bf c #19192A",
+"bg c #151526",
+"bh c #131324",
+"bi c #303051",
+"bj c #111122",
+"bk c #1F1F33",
+"bl c #19192D",
+"bm c #08080F",
+"bn c #161620",
+"bo c #23233A",
+"bp c #212138",
+"bq c #0E0E18",
+"br c #0A0A14",
+"bs c #272741",
+"bt c #25253F",
+"bu c #23233D",
+"bv c #12121F",
+"bw c #10101D",
+"bx c #202030",
+"by c #0E0E1B",
+"bz c #1E1E2E",
+"c` c #2B2B48",
+"ca c #0C0C19",
+"cb c #292946",
+"cc c #181828",
+"cd c #28283B",
+"ce c #262639",
+"cf c #2F2F4F",
+"cg c #101020",
+"ch c #1C1C2F",
+"ci c #2A2A40",
+"cj c #18182B",
+"ck c #353558",
+"cl c #09090F",
+"cm c #333356",
+"cn c #07070D",
+"co c #15151E",
+"cp c #202036",
+"cq c #1C1C32",
+"cr c #090912",
+"cs c #191925",
+"ct c #26263F",
+"cu c #24243D",
+"cv c #22223B",
+"cw c #13131F",
+"cx c #11111D",
+"cy c #0F0F1B",
+"cz c #0D0D19",
+"d` c #2A2A46",
+"da c #262642",
+"db c #171726",
+"dc c #151524",
+"dd c #131322",
+"de c #111120",
+"df c #2E2E4D",
+"dg c #0F0F1E",
+"dh c #1D1D2F",
+"di c #343456",
+"dj c #08080D",
+"dk c #151527",
+"dl c #06060B",
+"dm c #1F1F34",
+"dn c #1B1B30",
+"do c #0C0C14",
+"dp c #0A0A12",
+"dq c #494967",
+"dr c #23233B",
+"ds c white",
+"dt c #14141F",
+"du c #1E1E2C",
+"dv c #2B2B46",
+"dw c #0C0C17",
+"dx c #292944",
+"dy c #0A0A15",
+"dz c #262637",
+"e` c #141422",
+"ea c #2D2D4B",
+"eb c #0E0E1C",
+"ec c #1A1A2B",
+"ed c #373758",
+"ee c #181829",
+"ef c #161627",
+"eg c #333354",
+"eh c #141425",
+"ei c #313152",
+"ej c #121223",
+"ek c #222236",
+"el c #030307",
+"em c #BCBCD7",
+"en c #1E1E32",
+"eo c #1C1C30",
+"ep c #1A1A2E",
+"eq c #0B0B12",
+"er c #18182C",
+"es c #28283F",
+"et c #090910",
+"eu c #222239",
+"ev c #202037",
+"ew c #11111B",
+"ex c #1E1E35",
+"ey c #0F0F19",
+"ez c #0D0D17",
+"f` c #0B0B15",
+"fa c #1B1B28",
+"fb c #090913",
+"fc c #262640",
+"fd c #171724",
+"fe c #151522",
+"ff c #212131",
+"fg c #2C2C49",
+/* pixels */
+"````````````````````````````````````````````````````````````````````````````````````````````````````",
+"``````````````````````````````````````cnddbvalfeewchch`kbbbfcre`````````````````````````````````````",
+"````````````````````````````````e`eeaibvendmcp`o`oaxczeoaxbyax`jcydwe```````````````````````````````",
+"````````````````````````````e`ewchf`bnaaeudrataicacabyatatfebvaacpen`yewdp``````````````````````````",
+"````````````````````````aseechbncpeucs`wbtatefbbcqdrcpfabsfcbtehbaeucpbrchbqew``````````````````````",
+"``````````````````````f`al`jdydeacbabwbsaydccucgffa`eheu`wdxaybsfc`watch`y`janfe````````````````````",
+"````````````````````cybrbr`oblcz`nbsdxad`aecdkccfgerfgdebzc``aaddxbsdkawfa`odwaaef``````````````````",
+"``````````````````bm`k`kbadrddcpayad`ac`bceaeaakdfdfdf`ieheabcc``aadbtbw`wdrdwbybgdb````````````````",
+"````````````````ef`kefbgatbyczdrddc`bceadfdzdkanekc`ffexblb`dfeadgdkcgcgbacsateoen`kf```````````````",
+"``````````````dcbecjczdrebehad`afgeaakdfcfbudn`cazajepercgeacfdfbxehbbfcawductdrcsenbecr````````````",
+"````````````bmbfbfaibb`wefdx`afgeadfajcf`fcgcgbjbxaqbhbtcuan`fcfdxdnbtaibldxbsbkcpcp`jbfet``````````",
+"``````````dpccdd`qeu`vbzbbefc`abdfaj`fbiei`ebcejenegdhepeh`g`nbibhbtdkddbsehcgbsfaeu`qchbmdl````````",
+"``````````eqcobncpendgaybba`bcdfaj`fb`ei`eb`ehbhau`ndzaoaoch`eeiayerb`a`b`bzd`ayeb`qbpezecfe````````",
+"````````ewcrfbchdddefadxaibcakffbeaddkdzegejdk`xehdididicmaoeg`eaydacf`hakbc`adxdgczeucyf`cceq``````",
+"````````fealdwacdeefay`d`adk`gcgercqeh`naodkehexdidididkbjanaobjbjex`fcfdfeac`aidrctat`oaxbrfe``````",
+"``````eydcbralacehebdx`absercvbcdzdhaycdcmer`jckckckagckeocdb`ayehdkei`f`hakfg`qdhbscueudmfbdbas````",
+"``````cwbfbraxen`n`nadc`bc`gd`bjbgcfaycmdiejehckedededcdfgdidiblblffei`feadfboejaddu`wbocpbfbfcw````",
+"``````cwbfbrbqboddcgbtayeaefdfbj`n`ncdcmbldkep`r`rdqdqbdceckdicmejdzeibicfdf`bdgebefdbdr`o`jdtfe````",
+"`````tcxavdbdwblcpbzaeepaidfdzbudkejagcmbhdkdm`rdqamamambdeddicm`jeieibicfdfcgaiebfadgatbpencraeeq``",
+"````ewdbaxcofedebwayawffejdfcfcfepbjdncm`kah`r`p`pem`p`pambdckcmdz`nb`bicfdfef`bcjbzatcseudmeycrew``",
+"`````yccbvdmeuehbaaybz`u`nescfbiei`n`ndidvbxdq`pdsdsememamdqeddidxbj`fbxcfdfecazbhbyczaceudmchcr`y``",
+"````aseechdycsczbwcpd`c`bhcucf`feidkcucmdicedq`pdsdsdsem`pdqedcmandkcgcgcbdfeaazehbtczbbchavaiewbm``",
+"````cneechdmeudhbwawddbzbtcjdn`feiaqbjao`wenam`pdsdsdsemamdqck`nbt`adnbjaidfbcddbscjbgdecscwbw`ydp``",
+"````doeechdmbpatbodueobjep`gayddbi`nbjegdaatdqdq`p`pem`pdq`rbucqexcgdkcvddakbcabadbyanatdmbqafcrcn``",
+"````cnccbff``odreke``n`g`n`nekaj`fcqbj`eaocqffbddqdqamdqbdb`ej`eeibiagajdfeabzatdxbyeodr`oafbvcrcr``",
+"````cn`scrdw`obo`wbsebeb`nbgakdfcqbj`nei`edkceekajcibdbdckagbjb`ei`fcfdfakbcc`d`aybsbgbo`oaxf`dbbm``",
+"`````ydbcrbrdmeucufcay`kexayeadf`xcgbhbiadaycdcjfgcjdiaoeg`eaybh`fcf`hdfeafg`aaddudd`jeucpeffedbdl``",
+"````ewaecrddaxbpdr`wbsbzepddfgeadfcbev`fcf`xag`abcbf`eeieieibicgbo`hdfeafgc`a`aybs`weubpdmavecaveq``",
+"````eyfeczf`dycsbocufcbw`gbbc`bceaefdkajb`anbj`gehbibiag`f`fcfajbhdfeabcc`d`ctayfcanaccpenbacocney``",
+"````ase`avdwddcpeuat`wcz`kba`ac`bcd`cqdf`hbcc`cgc`ep`fcfcfaj`hdfbsejbcc``aadayfa`webdmal`jbnbm`yas``",
+"````dp`yae`zdydw`ochddcjfaayad`ac`cjbleaakdfdf`hbjepaj`hdfdfakea`dbbbs`aadaybsctcudeeeefbrecbm`ydp``",
+"```````zfe`ycrbgcpfd`qbpaibsayadd`bbcueubxeaakakcgbcakakakeabcdecqepdkawaybsct`wdrbpchcjeweeet`z````",
+"``````ascwdbdpdpencpbl`ncjfcbsaybgeberbsd`bzbcbcb`ehb`bcbcfgc`bgaiawdxbycueb`vcxeucpczcxecdbcneq````",
+"``````elewfeaaf`aadmcjaidr`wctbscgcgebafek`ac`c`ctbbffc`c``a`aawadayayfaddca`ndw`o`ybbbeccfeewdj````",
+"`````````tcwaeddax`j`yaleudre`fdebaiayaydxadd`d`dubjcqffd`ada`aybka`fcbtbwcpbbacdmdtcrbfaecwdp``````",
+"````````cnbmetcraach`jdy`oeuacbbczccfcbsbsaya`deayblazaeayaydbcqddexcwat`jeu`ybk`jbfcrdoe``zet``````",
+"``````````as`yfef`bfcobfcocpbpaibgcs`wbtfcfcbsbwbyczbabsbsfcfcbt`wcudreubpcpbqdcchezaebmcxar````````",
+"``````````elbq`t`zeyecaxbbbkcp`oaxbodratcu`w`weubhbwalbt`w`wcuatdrboeu`ocpbkdwbwecdwbmdoarap````````",
+"`````````````meyeze`ccbrcrbren`dbwbfbvcsbodrbaaieu`katatdrdrboeueucscpdmbrbff`ecccdobm`ldl``````````",
+"``````````````eqeqbmdc`screy`d`jenacac`qbnfdczbg`vcweueueubpbncpacbnen`jeecr`ycrdocw`sel````````````",
+"````````````````eqeybm`ze`coecbech`jbwandmbnaxbkcpcpcpcpcp`qdmen`kchchbeec`zf`dodleyeq``````````````",
+"``````````````````dlas`y`zaedb`decbnbfbe`jbrbfenenenenenen`j`jdpchf``y`ddpdobvbm`meq````````````````",
+"````````````````````elbqarcwdpcxcrdbccalbebefbchch`dchchch`kfbalbfeedbbqcrcneyarap``````````````````",
+"``````````````````````djdocncncne`aedbdbccdwbfbfecececbfbfbfeedbdbcxezcncnclarbm````````````````````",
+"````````````````````````eldlas`lcxcwe`fedcaedpe`bmdpdbeqefaedcfee`dpbq`mcnelap``````````````````````",
+"````````````````````````````elelasey`zcx`ycnbmbm`zcre`e`cwcw`ycx`zeyasdjap``````````````````````````",
+"````````````````````````````````dlararas`tcndparareq`z`zey`m`taseqclap``````````````````````````````",
+"``````````````````````````````````````apdlelaparelareqeqdpetelap````````````````````````````````````",
+"````````````````````````````````````````````````````````````````````````````````````````````````````",
+"````````````````````````````````````````````````````````````````````````````````````````````````````"
+};
diff --git a/hacks/images/bubbles/glass.pov b/hacks/images/bubbles/glass.pov
new file mode 100644 (file)
index 0000000..c189771
--- /dev/null
@@ -0,0 +1,27 @@
+#include "colors.inc"
+#include "shapes.inc"
+#include "textures.inc"
+
+/* The following make the field of view as wide as it is high
+ * Thus, you should have the -W and -H command line options
+ * equal to each other. */
+camera {
+        location <5.8, 0, 0>
+       up <0, 1, 0>
+       right <1, 0, 0>
+        look_at <0, 0, 0>
+}
+
+sphere {
+        <0,0,0>, 2.5
+       texture { Glass
+               scale <0.7, 0.7, 0.7> 
+               rotate y*clock
+               normal {bumps 0.4   scale 0.1}  
+               finish { Shiny }
+#              finish { phong 0.4 }
+       }
+}
+
+light_source {<6, 7, 0> color White}
+light_source {<6.1, 1, 0> color Blue}
diff --git a/hacks/images/bubbles/glass1.xpm b/hacks/images/bubbles/glass1.xpm
new file mode 100644 (file)
index 0000000..7d25395
--- /dev/null
@@ -0,0 +1,78 @@
+/* XPM */
+static char *glass1[] = {
+/* width height ncolors chars_per_pixel */
+"10 10 61 2",
+/* colors */
+"`` c None",
+"`a c #27274E",
+"`b c #29293F",
+"`c c #2C2C63",
+"`d c #353579",
+"`e c #242447",
+"`f c #222245",
+"`g c #25253E",
+"`h c #1C1C3F",
+"`i c #2B2B47",
+"`j c #252544",
+"`k c #222251",
+"`l c #323264",
+"`m c #212146",
+"`n c #37374B",
+"`o c #22223D",
+"`p c #252536",
+"`q c #232337",
+"`r c #34346C",
+"`s c #303068",
+"`t c #26264A",
+"`u c #5D5D97",
+"`v c #363674",
+"`w c #2C2C6A",
+"`x c #2E2E5B",
+"`y c #242451",
+"`z c #343464",
+"a` c #3C3C6F",
+"aa c #353572",
+"ab c #38386B",
+"ac c #242454",
+"ad c #181831",
+"ae c #28285B",
+"af c #37377A",
+"ag c #20203F",
+"ah c #26265C",
+"ai c #4C4C60",
+"aj c #383874",
+"ak c #333379",
+"al c #444458",
+"am c #272756",
+"an c #32326E",
+"ao c #30306C",
+"ap c #40407F",
+"aq c #292944",
+"ar c #212150",
+"as c #323271",
+"at c #2D2D76",
+"au c #21213F",
+"av c #25255A",
+"aw c #35356D",
+"ax c #313169",
+"ay c #2C2C6E",
+"az c #18182C",
+"b` c #232344",
+"ba c #292961",
+"bb c #202037",
+"bc c #1C1C33",
+"bd c #242452",
+"be c #45456F",
+"bf c #242455",
+/* pixels */
+"``````aibebebeal````",
+"`````n`zaw`ua``l`n``",
+"```i`xab`wasaj`r`x`q",
+"``auaean`daf`vao`c`t",
+"```haxahayatakbaaeb`",
+"``adbfav`wapao`sam`m",
+"``azagaracaaae`k`fbc",
+"````bb`ybd`aar`e`o``",
+"```````paq`j`b`g````",
+"````````````````````"
+};
diff --git a/hacks/images/bubbles/glass10.xpm b/hacks/images/bubbles/glass10.xpm
new file mode 100644 (file)
index 0000000..503f5f1
--- /dev/null
@@ -0,0 +1,256 @@
+/* XPM */
+static char *glass10[] = {
+/* width height ncolors chars_per_pixel */
+"60 60 189 2",
+/* colors */
+"`` c None",
+"`a c #27274E",
+"`b c #25254C",
+"`c c #383858",
+"`d c #23234A",
+"`e c #212148",
+"`f c #2E2E62",
+"`g c #292967",
+"`h c #3535A1",
+"`i c #272751",
+"`j c #23234D",
+"`k c #29293F",
+"`l c #2C2C63",
+"`m c #2A2A61",
+"`n c #33334C",
+"`o c #353579",
+"`p c #272754",
+"`q c #414188",
+"`r c #20202C",
+"`s c #2E2E3D",
+"`t c #1C1C28",
+"`u c #2E2E68",
+"`v c #242447",
+"`w c #2C2C66",
+"`x c #222245",
+"`y c #181824",
+"`z c #25253E",
+"a` c #161622",
+"aa c #B9B9ED",
+"ab c #3E3E67",
+"ac c #1C1C3F",
+"ad c #6767A3",
+"ae c #2B2B47",
+"af c #272743",
+"ag c #222248",
+"ah c #292931",
+"ai c #29295C",
+"aj c #1D1D39",
+"ak c #252544",
+"al c #1E1E47",
+"am c #2B2B61",
+"an c #29295F",
+"ao c #1F1F3E",
+"ap c #2F2F68",
+"aq c #2D2D66",
+"ar c #30305F",
+"as c #2C2C5B",
+"at c #11111C",
+"au c #262655",
+"av c #31316D",
+"aw c #4C4C6D",
+"ax c #222251",
+"ay c #323264",
+"az c #2D2D69",
+"b` c #33335B",
+"ba c #43436E",
+"bb c #2B2B67",
+"bc c #212146",
+"bd c #37374B",
+"be c #22223D",
+"bf c #252536",
+"bg c #1D1D42",
+"bh c #2A2A5C",
+"bi c #28285A",
+"bj c #2B2B53",
+"bk c #333372",
+"bl c #2F2F6E",
+"bm c #2B2B3F",
+"bn c #2C2C36",
+"bo c #424266",
+"bp c #232337",
+"bq c #2F2FB0",
+"br c #34346C",
+"bs c #525265",
+"bt c #32326A",
+"bu c #1B1B2F",
+"bv c #3B3B55",
+"bw c #303068",
+"bx c #21214C",
+"by c #2C2C64",
+"bz c #292957",
+"c` c #232351",
+"ca c #26264A",
+"cb c #2F2F60",
+"cc c #202044",
+"cd c #5D5D97",
+"ce c #2B2B5C",
+"cf c #363674",
+"cg c #3C3C66",
+"ch c #252556",
+"ci c #30306E",
+"cj c #3E3E54",
+"ck c #414178",
+"cl c #2C2C6A",
+"cm c #2F2F4F",
+"cn c #25252E",
+"co c #27275B",
+"cp c #363663",
+"cq c #4C4C68",
+"cr c #20204A",
+"cs c #2E2E5B",
+"ct c #29294C",
+"cu c #242451",
+"cv c #27274A",
+"cw c #343464",
+"cx c #4F4F64",
+"cy c #252548",
+"cz c #16162C",
+"d` c #292938",
+"da c #333384",
+"db c #3C3C6F",
+"dc c #353572",
+"dd c #1E1E37",
+"de c #38386B",
+"df c #414156",
+"dg c #242454",
+"dh c #31316E",
+"di c #181831",
+"dj c #232349",
+"dk c #272739",
+"dl c #393979",
+"dm c #4C4C85",
+"dn c #2F2F83",
+"do c #28285B",
+"dp c #292952",
+"dq c #36366C",
+"dr c #48486D",
+"ds c #23234C",
+"dt c #37377A",
+"du c #20203F",
+"dv c #1E1E3D",
+"dw c #26265C",
+"dx c #313174",
+"dy c #4C4C60",
+"dz c #27273F",
+"e` c #3C3C78",
+"ea c #48485C",
+"eb c white",
+"ec c #383874",
+"ed c #333379",
+"ee c #444458",
+"ef c #272756",
+"eg c #47477C",
+"eh c #32326E",
+"ei c #1B1B33",
+"ej c #1E1E2C",
+"ek c #30306C",
+"el c #40407F",
+"em c #292944",
+"en c #212150",
+"eo c #23233E",
+"ep c #141422",
+"eq c #343473",
+"er c #323271",
+"es c #2D2D76",
+"et c #2E2E6D",
+"eu c #40406E",
+"ev c #21213F",
+"ew c #272731",
+"ex c #8080BA",
+"ey c #23232D",
+"ez c #25255A",
+"f` c #1B1B39",
+"fa c #35356D",
+"fb c #191937",
+"fc c #262651",
+"fd c #313169",
+"fe c #2C2C6E",
+"ff c #22224D",
+"fg c #18182C",
+"fh c #373786",
+"fi c #2D2D65",
+"fj c #232344",
+"fk c #2B2B63",
+"fl c #292961",
+"fm c #27275F",
+"fn c #202037",
+"fo c #1C1C33",
+"fp c #242452",
+"fq c #45456F",
+"fr c #484868",
+"fs c #535380",
+"ft c #1F1F43",
+"fu c #2C2C5D",
+"fv c #3535DD",
+"fw c #353573",
+"fx c #262657",
+"fy c #393963",
+"fz c #242455",
+/* pixels */
+"````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````",
+"````````````````````````````````````````````````bsbsbsbsbsbsbsbsbsbsbscxbs``````````````````````````````````````````````",
+"``````````````````````````````````````````dycxdydycxawawawbsbsbsawcxcxcqdycxcxbs````````````````````````````````````````",
+"````````````````````````````````````dyeacxfrawcqawfrawcqcxawcqawawawawawawfrfrcxcqeabs``````````````````````````````````",
+"````````````````````````````````dfeadydyawcqawawfrcqawawdrawcqawawfqawcqcqfrawawfrdyeaeadf``````````````````````````````",
+"``````````````````````````````eadyeadyfreedrboawfqfqfqdrfqeufqawbaawbabofqeufqdrcqfreeboeadf````````````````````````````",
+"``````````````````````````dydffrbocjfrfrdrfrfrfqfqbabofrfqfsbaeubafqfqcgeubafqdrbaabbobobocjeedf````````````````````````",
+"````````````````````````dfeeeadffyboeecgeufrfreufqeueueucgbaeubadrdbbacdbaeucgbabocpboboabboeaeebd``````````````````````",
+"``````````````````````bdbdcjbd`cfyeefybaabcgfyeubaabdmfseudbdefsaackdbeudebaeudedebocgbofyfycjcjeecj````````````````````",
+"````````````````````cjdfabbvb`cg`cfyfyfycgabcgdeckbrfscddecdcddmdmfsabdeeucwcpdbdbcgcgcp`cbvbvcjbvbdcj``````````````````",
+"``````````````````bdbddfbv`ccgfyb`cgcgcpfycwdedbdbcdadcdexexckcd`u`uegdedbdbaycpaydecpcpb`bvfybvbdcj`s`s````````````````",
+"````````````````dfbdcjbvbd`c`c`cb`cpcwcgdededqayfabrcdexdbcdcdcddeexebbrdbecdedqcwfdaycpcgarb`b`bd`cbd`sbd``````````````",
+"```````````````sbdbd`n`ncmcscsarcscwcpdbbtbwbwbtbrfaebexegexaddbdeeceldqbrbrdqbtbkaybt`fbjcscpb`b``ncmctbdbd````````````",
+"``````````````aebd`c`ncmcsb`cwayascsdebraybwbrfdbtazdmdeexaddladexckdedmdme`btay`lcbcscwarasfucpb`cmcmae`nbd````````````",
+"`````````````saeeo`nbjcmcsarar`paycsbtcb`fbrbtfkfdciecdmdqebcdaacddmece`elbrazfabr`f`wbwbtarbzcsascsarbjbm`kbn``````````",
+"``````````ewd`ae`z`c`zbjcsb`cscscwcwbrbravbtecbrfackaadmckexavciexdme`bkfabtapanbr`ffabtfdbtdpcscsbjbjdpbeae`s`s````````",
+"``````````ahcm`kcm`bdparaycsay`fcscsfdbrfibwbtbrfdeqcd`qdmelbkeldmexdmeqdce`faerdcapbtbwfa`waucscscvdpdpafcmae`n````````",
+"````````cncmaeakcmct`adpcsarcbcbbwdqdeapamdcehcfclbldlbldmeqeradexade`esecelehehdc`ubrbrbtfucsbhcsas`actbecmbpbpey``````",
+"````````ejbpeo`vctcv`abzb`ef`ffxfucbbwapbldcdheqetesdlfwdmescfcddmdmdmbkbleldldhaq`ubrfabtcbcsbtcs`pcccycm`veobe`t``````",
+"`````````rae`aajevdjdsasas`jbifiapbrbtav`uapclcfdlad`odndnfvdxededexegeceqe`e`cfbybydcbrfmcwcbfdcbbjdjca`bcv`zdd`t``````",
+"``````ej`rbu`vcvcv`vcyfcbzefbz`f`uclapfderfeerclerdldlerdada`hedfhe`aacferdtcfciazapfk`ubramcbfuararbzfc`zaeaofo`t`r````",
+"``````bpfodibedsdp`jcs`abwbh`lfadccidcecerclet`gfe`hdxdx`hededdt`hdaelcfereterer`wbk`ubtfdbtef`fefcb`paudpbcdiczdi`y````",
+"``````ejddddemfcbjefcscs`faycedcececapciazcieqbldterdxdnbqelcdfhfv`h`oe`ererdnetfkfdekfabwbtfubifxfcar`affdpf``yepfo````",
+"`````tej`ycyevcuctftbzefdoaiapaqbrbrehfw`udcfwda`oerekfhfhdxdtdaes`hbqfwcferbkehflfkekcffabwfuco`lbzcsbzftbccaevfneja```",
+"````atddddem`xaocscsar`pdwdwfibwapbyapeccfdlcf`hdnfmbl`hfhdtdt`hclfvbq`qfhdxbkcfcl`gfkehfa`ufufpamaycsaydjcc`v`vfoepat``",
+"````ejfgbucy`vccceaseffdfldgai`ubbfzfdazazcfblereqdt`hdnbq`hedbqfedndndte`dtdtdletfmdhehfkapapbt`mdgfubzacdp`xf`dicz`y``",
+"````budddi`x`vevdpcsbzcwfxai`mapfdflfaavblercibkcffhcl`gfvfvfvdadaedclcfcfdteqecdcfkercfav`lbt`famchfdcsbe`bcaczfjbefg``",
+"````a`buepccevcrdpbzbzcbfxbifdfififacfekazereretblfe`hfhbqesesdnfh`h`hbq`hfwecdldcerclavecaqaqfifxbhbzbzcv`xfjfodufnat``",
+"````atepbufodualfcdp`lauauchfi`lapek`gcicieretfecl`gfhed`hesfm`gfefvfvfvdxbl`oederetfm`wdlfkfxaybzau`d`j`xduf`fgdufga```",
+"`````yepddfjacccbz`benamfd`f`mfdbr`mdwcidtcfclfmfebldadneddnesdadadx`hdaededdaclflfmflfmehbyaiaydofuarasftccfjdidiei`t``",
+"````a``yczczfbbcbc`bacficucraqfdanfkflaz`oehbbesbldndxfefefeesfvbqbqdnbbdtedciciazaqfkazaz`ubw`laicbas`pdjcccc`advddat``",
+"````fo`yddccf`fcalcefucbcufpbi`fbyav`wazbt`ucldxed`hblescldn`hbqdndncl`gazedazazazfw`wekfzanameffucbbzbxbz`jf`fbevbuep``",
+"````at`yfbaccy`a`bdsceaiffbzbichfi`manekaq`uclbkcffheletfvesfh`hesdx`qclci`gfkapap`wekapezanfzaifubxeffcfc`bdubufgepat``",
+"````a`czdvf`bcdv`bffbzbicrax`fbiezcofifiekbkfk`geredeserbqdndndtadfhazcfblfecl`u`laiflaq`f`lez`ucbdgff`j`bdpccdddiepep``",
+"````atczdidvaocy`v`edsbcaxdwbxfzefchameqecdlbl`gazdh`qfhaaadelesfhdaflblbkblerazapfidwbhchaqdobibzalfp`pccbgdveiczepat``",
+"````a`epfoczdi`dccac`jaufzcraxaubxdwez`wfkehekbbclbkelaa`obqeleddldafkdmekfm`wfk`wfibwfidobhaiaxef`j`pdsbcacbcaodiddat``",
+"``````eifgczevccfbau`jefdgffbhamaxfxezfd`w`l`odl`udcbk`wdneldtegadaaazetdlfmanan`waqfkehfifpbic``p`dbzagftao`vdifbfg````",
+"``````a``yfgdv`b`v`ifcbz`b`ibwbtamfxfxfmfxekdhcfby`lciehec`wdlaverapcdecelaz`lby`lfidofiap`mcefxfp`idsagbcagajeicza`````",
+"``````ata`czfbdv`vdjceasac`ibiamfian`maifxanazehave`apekehap`uege`ecazcfbkekdwfkfifiauchefbiencuftbcdvfbfof`fbdi`y`y````",
+"`````````yczbudvdvdvfbcubgfcaucrbicraxfzchco`wekfke`aqflav`uaa`udm`u`w`uamfzchfmanameffpdgaidgfpaldvaoevf``zfbfgbu``````",
+"````````a``tejeif`ajddajdsccbz`pbi`jfpdoanfzanbtai`f`ufkfkdq`lanebexaidcfme`fafiancodgenenbiai`pcracccf`bpddbufg`t``````",
+"`````````t`yfgfgbpacaoakdubgbiauffdsenanfidoamaidgcdcoezbtecdc`mdmanbifidoanan`uapfzaxfpfpbhcecr`xbcbgbxddbufoej`t``````",
+"```````````t`yfoddaodidv`i`xaleffpc`chfxamchezaichezfmfzanbwanfpcb`famfkanfxfzezcoanbifxc`ffefacbgccacf`ddddej`t````````",
+"```````````tcnfobpdvbgdvbgbxftefbibxaiaudofzaxfichanfxfpfxezananfxchdgefezfzfxcuc`crdsfpcubz`jft`eeofcfbfoejfg`r````````",
+"````````````eyfgbudiaoajbgdvbecrfpfpff`bffefbwaichchdgdgbhdgbjbidoaicofxfpaicubxds`afpdgas`e`vduag`z`zajdibuey``````````",
+"```````````````t`rbuddeodvft`zalbccr`ec``bc`auenfp`jezchfxaidpc`fxdgfpfiamfcdgfxcvcrfcfpalcr`zbeajf`dvajbfey````````````",
+"```````````````rbfbpfofbbgdvaffjfjcc`jfxbxfcc``b`bdsbiau`jc`biaibifxfpfcch`afpc``d`d`vdvfjfj`zdvajfbdvbp`tcn````````````",
+"````````````````cnfnfnbpfnaoftftdj`ecuftfpaubidgfp`j`bfcfpfc`afpdgc``jfpencuc``b`j`e`vcrevdkdzewbefnfobfej``````````````",
+"``````````````````bffnfnajfodvddccftaf`e`b`jdgcuai`jcv`jc`fcdj`jbxcvcvdsdsbxbxdjcr`xbxdjft`z`zddbefnbf`r````````````````",
+"````````````````````d`eyewbeduak`zfjemcads`dfp`jdj`b`bcu`jcudgfpefds`bcacacvctct`dagak`xaoddbeeybpfn`r``````````````````",
+"``````````````````````eyfnbpdkdz`z`zbmakfj`bag`v`dctctctctem`d`ecvctaeaeafcu`v`ecc`zakafbp`kbpewbfew````````````````````",
+"````````````````````````eyeybfbpdk`zemcvcyafemakcvcvaeaeffdjcvcv`j`vae`vemaf`vagcc`z`z`zeodkbfd`ey``````````````````````",
+"``````````````````````````cnbnfobe`kbe`kevemdzfj`k`z`b`edjctaeaeemds`eaf`vevdzdjafemd`dk`zbfd`ey````````````````````````",
+"``````````````````````````````bncneybf`kbeaf`kememem`kcvafemakaeaeakemem`kdk`z`kbebm`zd`d`ah````````````````````````````",
+"````````````````````````````````ahcnewd`dk`z`zaeaf`kaf`k`vemaedzcvakak`z`kdzd`dkdkbmbfbnah``````````````````````````````",
+"````````````````````````````````````cncnbf`z`sd``s`k`z`s`zbm`s`kd`d``s`s`k`kd`ahd`bncn``````````````````````````````````",
+"``````````````````````````````````````````bnd``s`s`kbnd`d`bfd``kbnbnd`bnd`ewahbn````````````````````````````````````````",
+"````````````````````````````````````````````````ahbnahbnd`ewdkbfewahahewbn``````````````````````````````````````````````",
+"````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````",
+"````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````"
+};
diff --git a/hacks/images/bubbles/glass11.xpm b/hacks/images/bubbles/glass11.xpm
new file mode 100644 (file)
index 0000000..0eb808c
--- /dev/null
@@ -0,0 +1,268 @@
+/* XPM */
+static char *glass11[] = {
+/* width height ncolors chars_per_pixel */
+"72 72 189 2",
+/* colors */
+"`` c None",
+"`a c #27274E",
+"`b c #25254C",
+"`c c #383858",
+"`d c #23234A",
+"`e c #212148",
+"`f c #2E2E62",
+"`g c #292967",
+"`h c #3535A1",
+"`i c #272751",
+"`j c #23234D",
+"`k c #29293F",
+"`l c #2C2C63",
+"`m c #2A2A61",
+"`n c #33334C",
+"`o c #353579",
+"`p c #272754",
+"`q c #414188",
+"`r c #20202C",
+"`s c #2E2E3D",
+"`t c #1C1C28",
+"`u c #2E2E68",
+"`v c #242447",
+"`w c #2C2C66",
+"`x c #222245",
+"`y c #181824",
+"`z c #25253E",
+"a` c #161622",
+"aa c #B9B9ED",
+"ab c #3E3E67",
+"ac c #1C1C3F",
+"ad c #6767A3",
+"ae c #2B2B47",
+"af c #272743",
+"ag c #222248",
+"ah c #292931",
+"ai c #29295C",
+"aj c #1D1D39",
+"ak c #252544",
+"al c #1E1E47",
+"am c #2B2B61",
+"an c #29295F",
+"ao c #1F1F3E",
+"ap c #2F2F68",
+"aq c #2D2D66",
+"ar c #30305F",
+"as c #2C2C5B",
+"at c #11111C",
+"au c #262655",
+"av c #31316D",
+"aw c #4C4C6D",
+"ax c #222251",
+"ay c #323264",
+"az c #2D2D69",
+"b` c #33335B",
+"ba c #43436E",
+"bb c #2B2B67",
+"bc c #212146",
+"bd c #37374B",
+"be c #22223D",
+"bf c #252536",
+"bg c #1D1D42",
+"bh c #2A2A5C",
+"bi c #28285A",
+"bj c #2B2B53",
+"bk c #333372",
+"bl c #2F2F6E",
+"bm c #2B2B3F",
+"bn c #2C2C36",
+"bo c #424266",
+"bp c #232337",
+"bq c #2F2FB0",
+"br c #34346C",
+"bs c #525265",
+"bt c #32326A",
+"bu c #1B1B2F",
+"bv c #3B3B55",
+"bw c #303068",
+"bx c #21214C",
+"by c #2C2C64",
+"bz c #292957",
+"c` c #232351",
+"ca c #26264A",
+"cb c #2F2F60",
+"cc c #202044",
+"cd c #5D5D97",
+"ce c #2B2B5C",
+"cf c #363674",
+"cg c #3C3C66",
+"ch c #252556",
+"ci c #30306E",
+"cj c #3E3E54",
+"ck c #414178",
+"cl c #2C2C6A",
+"cm c #2F2F4F",
+"cn c #25252E",
+"co c #27275B",
+"cp c #363663",
+"cq c #4C4C68",
+"cr c #20204A",
+"cs c #2E2E5B",
+"ct c #29294C",
+"cu c #242451",
+"cv c #27274A",
+"cw c #343464",
+"cx c #4F4F64",
+"cy c #252548",
+"cz c #16162C",
+"d` c #292938",
+"da c #333384",
+"db c #3C3C6F",
+"dc c #353572",
+"dd c #1E1E37",
+"de c #38386B",
+"df c #414156",
+"dg c #242454",
+"dh c #31316E",
+"di c #181831",
+"dj c #232349",
+"dk c #272739",
+"dl c #393979",
+"dm c #4C4C85",
+"dn c #2F2F83",
+"do c #28285B",
+"dp c #292952",
+"dq c #36366C",
+"dr c #48486D",
+"ds c #23234C",
+"dt c #37377A",
+"du c #20203F",
+"dv c #1E1E3D",
+"dw c #26265C",
+"dx c #313174",
+"dy c #4C4C60",
+"dz c #27273F",
+"e` c #3C3C78",
+"ea c #48485C",
+"eb c white",
+"ec c #383874",
+"ed c #333379",
+"ee c #444458",
+"ef c #272756",
+"eg c #47477C",
+"eh c #32326E",
+"ei c #1B1B33",
+"ej c #1E1E2C",
+"ek c #30306C",
+"el c #40407F",
+"em c #292944",
+"en c #212150",
+"eo c #23233E",
+"ep c #141422",
+"eq c #343473",
+"er c #323271",
+"es c #2D2D76",
+"et c #2E2E6D",
+"eu c #40406E",
+"ev c #21213F",
+"ew c #272731",
+"ex c #8080BA",
+"ey c #23232D",
+"ez c #25255A",
+"f` c #1B1B39",
+"fa c #35356D",
+"fb c #191937",
+"fc c #262651",
+"fd c #313169",
+"fe c #2C2C6E",
+"ff c #22224D",
+"fg c #18182C",
+"fh c #373786",
+"fi c #2D2D65",
+"fj c #232344",
+"fk c #2B2B63",
+"fl c #292961",
+"fm c #27275F",
+"fn c #202037",
+"fo c #1C1C33",
+"fp c #242452",
+"fq c #45456F",
+"fr c #484868",
+"fs c #535380",
+"ft c #1F1F43",
+"fu c #2C2C5D",
+"fv c #3535DD",
+"fw c #353573",
+"fx c #262657",
+"fy c #393963",
+"fz c #242455",
+/* pixels */
+"````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````",
+"``````````````````````````````````````````````````````````````bsbsbsbsbsbsdydybsbsea````````````````````````````````````````````````````````````",
+"``````````````````````````````````````````````````````eabsbsdybsbsbsbsbsbscqcxbsbsbsbsbscxdy````````````````````````````````````````````````````",
+"````````````````````````````````````````````````dydybsbsdycqcqdycxbsbsfrcqcxdyfrcqcxcxbseacxcxbsbs``````````````````````````````````````````````",
+"````````````````````````````````````````````eaeaeafrcqawawawdrdrawcxawawcqcqawawawawawbscqfrfrdycxcxea``````````````````````````````````````````",
+"````````````````````````````````````````frdfcxcqawcqcqawawfrcqdrawfrawawcqawawawfqawcqawcqdrawdrfrdycqdycx``````````````````````````````````````",
+"````````````````````````````````````eeeaeaeadycqdffrboboawfqfqfqdrdrfqbabadrdrdrdrbobodrdrbaawdrdyfreaeaboeeee``````````````````````````````````",
+"``````````````````````````````````eeeefreeeefrbofrfrbofrfqeudrbadrfqdrfqeubabababababafqdreufqfrbafrfreeeeeacjdf````````````````````````````````",
+"``````````````````````````````eecjboeebocjboboababboabdrfsfqfqbabobobafqfqawdrfqawbaeueudrdebafrbocgbobobobodfdfcjbd````````````````````````````",
+"````````````````````````````dfeeeedfcjbvab`ccgfyeuabboabbabaabdbadeucgdeabbabadbegfqfqfqbaeueueubobob`bocgcgdfeacjcjcj``````````````````````````",
+"``````````````````````````cjbddfcjbv`ccgdffycgfqbofyfyabdbeuabfqexbaeueudefqexadckdbbadedebaabdedeeufyboabcpfycjdfdfeecj````````````````````````",
+"````````````````````````cjcjdfdfbvb`cg`cfyfyfyfycgabcgdeeudbbregexdbdbadcddmegexeucgdedbdbayfydbdbabcgfycpb`bv`cbvcjdfbdcj``````````````````````",
+"``````````````````````bdbdcjbvbvfy`c`cb`cpcgfyfyfycpdededbdeegexdmaaebexckaadm`ucddbdedbdbcwcpcpfddedeb`fyb`bvfycjcmbdcj`s`s````````````````````",
+"````````````````````bd`nbvbvbv`ccg`c`ccscpcwcwcgdebrcwbraydqckdbcdegegcdcdade`btdcadbrdqfabrdebrcpbwaycpfyfyb``car`n`nbdcjbnbd``````````````````",
+"```````````````````n`s`n`ncj`nb`b`b`b`b`b`arcpdqfabrbrcwaybtbrexadcddbadaae`dedeexaddbdqdebrdedbdededeayb`b`cpb`b`fy`n`c`ncmbdbd````````````````",
+"```````````````````n`sbdaecmcmcscscscpcscscpcwfsbwfiaqfdaybtecadexaafsexe`exckdbbtecdedqfdaycpbrekcbcsaycb`icsaycpb`b``ncm`naebd````````````````",
+"`````````````````scj`c`ccmctbjcsb`cparasascsdqayaybwecbwbrbrbbe`dee`ebadegcdexadegdbcdade`ecbrbwfk`ffuarcwarcscscscpcscmcmct`nd`bd``````````````",
+"```````````````s`saecv`nbjaecmasarar`parcsayfdcb`fbrbtaq`fbtciecdmdbdeebcdebcdebehece`egfabtaqecbrcbazap`fayarcsas`casbjarcmem`n`sbn````````````",
+"``````````````ew`s`zcv`nevcmbjcscsbzcscwaydedqbwavfafdfadcdcckadebcke`aaehdhadebe`dcehdcbtbran`fbr`fbrfibtayaybzbjarcsb`bjbjafbm`sae````````````",
+"````````````bnaeae`kcmagdjfuaycsb``ffucscsbtbwdcaqfifdfabwave`exaaadcdcddh`oecadcddmfwapdbe`fdaqbrapbtbtfdecaqbhbzarcs`adpcmaf`zcmcncn``````````",
+"````````````dz`n`kctcmct`idparcwaybw`farfubrdqbr`ffdfafaecekerdcfeazeleqavdmexaddmelcibkegbrbtbkfa`uehbwfifiambzfxcscs`abjbjakctcmcm`z``````````",
+"``````````ey`saf`zafbjcv`befascsfuar`ffdbrde`faq`wdcdcbkerclesdlcfdmcdblfwcdebaddmdldxercdecbkavbkapbrbtfdbt`fcbbwcbbjbzcactaebectfn`zey````````",
+"``````````a`bf`zcacvdpcv`icucscsbi`fefbhar`fbr`uekbrekcierdxdxdlcieleqes`odmelelexdmcfere`eldcetaqfibwfadcapcbcscsbtcsfcccakdp`vcv`zfncn````````",
+"`````````tbpaecvao`vcccydsbzcsbzffaifiekbwbtbrap`uekbber`odladdteddndnbqdxeqedeqebeleceqdtelelerbyfkavdcfiancwarbtfdcsbjdjfcbjctaebpddbpbf``````",
+"````````bf`rfodpevcv`vfjcybz`idpefbhayapetblapfdciblcleqeteqeldldxdxdadadaesdadtadcdcfereqdldcekapap`wflbwayamcbbhcbasasdp`pbjakcvfjfo`y`y``````",
+"````````ewdddidvdj`abzagdpcu`p`lbzambwfdbbclehdcerfeetetflfedaedbldxdadndaeddada`qdmcfeqdxdheqblfkap`waqfddq`fdgaycs`pcsefef`afjeveieifo`k``````",
+"```````ybfevei`zft`afubzcsas`fam`fbwfaecdcdcdccfetbbblcieretedesed`h`heldm`qdafvdndleceqercledetaqbrapbkfaayfabwbz`fbiascs`p`j`vftf`a`epbu`t````",
+"```````y`ybufnaefc`bdpcucs`pfubw`lbwbrdqdcehavfw`wcfcfereqfwercidt`hdae``qdtbqbqeddle`cfdtdxercifk`uavavecbwbw`fbz`m`mefay`jbc`d`aaobua`fg`t````",
+"``````epbuddcvfjefca`bdsbzbzbhezbyaqaqbrdqehecdcfddccfeqdaedblazdtfhfhdxdtdnfednfvfvcfdtererdcehfl`wfkbkfafaap`fcefifiasasfudjbc`bcadudda``t````",
+"``````a`foeoemak`adparcsarefaidwamapbwapbyazeheccfeccfdxbqesfmblesbqeldtdtbq`g`hfvbq`q`qeqerfweqclbbfmdhbwfa`ufubifxbtarcscb`b`bcv`v`vfgfgbu````",
+"````atejfgfgcy`v`bbcfuasef`ffiezchco`uazezezap`uekdlererereqeddadnfvfved`ofvesesbqfvdle`dleddtdlclfmfkerbr`mapfibtbi`lbzfufuccfccvccdvfg`yfoat``",
+"`````yfodiaj`v`v`x`bdpcsbzdeamamaxfkaqehfm`wav`ueteretbkbkcffhdxfednfefv`hbqdadxesfedtfwcfdtfwe`dcflcldlbkfdfibtap`fanfpayasao`idpagczfneifg`t``",
+"````atfgfofgagccao`abjasbzcbfufxbibtbwfdapecdlavekerblbkeqeqdaesfedafvdndn`hfvfv`hdxeddtdtcffwdlecdhcleqehbkaqaqfkfkco`f`fayafctdjcadiajdv`yfo``",
+"````atejbpczaocc`aaldpbzbzfudoen`mbtfiambtbtereretererbletetfeesbq`hfv`g`gdn`hdafhdabqfvbkbkdldlfwerclfkekecaqaqfdfidgef`b`pctccftakfoajfgbua```",
+"````ata`befofoft`daldp`p`laubzambi`lby`lehfm`gavciererclfe`g`gfhdtdxed`g`gesfmdnfvfvdndnetdxedblblazfmfmapec`mfzcbarc`bzbxfcaoccftf`fgbcepfgbu``",
+"`````y`yevbefjdv`xfpdp`jenbifd`lfufkfdbtazdw`merdtdtci`g`gfebledfhesdnfeesdafvededfvdaed`hdadaclflfmflezfibtbycobwfudgfuarfuds`v`xaodidia`atat``",
+"````atfgaobudif`acfp`ebxacfu`fc`fxfdfdan`mdw`gaz`ocfekcletesdndxfecletesdn`h`hfvfhedclfheqfherek`gbyazfm`uaz`ubtamanfucbceaufcccccducaevfoatat``",
+"````atfoejfof`fbcc`jcrbheffufualaxamfiancifkbbciehekflcleleqdadxfedn`gbq`hfvesdnblfmflbberedcletazeqazehapfm`w`lfubzcbcsbzcr`jdpacf`ftdvfn`yat``",
+"````atfgbufodjfjdudp`afpfu`l`jfcbiefdoapavfkfketazbyazbldxdt`hes`hesdxdx`h`hesdndaet`gazeler`wazdhdhcidhanbxezfzchbibh`p`pfceffffcf`czfodd`yat``",
+"````atatczdif``b`v`v`afffu`facfcfubidgfmcoez`lapbbap`gbbedecfhedetdaesesfv`h`qcifhfhdadletfl`wekfianfkcifk`lfkchfl`lbzcrcufc`ift`aaodddda`buat``",
+"````at`tdif`dvagcycc`iff`pefcraxfz`fbianezfkap`uehfw`ufl`gcieqcderfh`hdnedeqdcfedmazdldxdl`gazaq`lfmfmdwfi`l`lan`wfdfucrc`fp`b`d`daoddbufnatat``",
+"``````fga`f`dvdvcycc`xffdsdscrchezcrfzeffxezfieqecdlbkfebbcidh`qfhfhad`qelfedndadnfkblcfclcierazapaqdwaibhchaqanfxcecealfpef`x`bdvf`eiczfg`y````",
+"``````at`yeiczeiajftftac`j`pfpaxalaxefbxfzch`maqfkbkerazclblbkdmdtdaaaedexfvaddafe`udmblflfkazbbazaqfiaqanbiamanaxfpbzds`pfcbcccdvftaoei`yep````",
+"``````a`a`didif`f`acbxalfp`pbxax`jcefufzfzfmfmbbfifkfibkdhaveqelexfv`qcddndmcdadfeekdl`hflanfkfm`wfdfkapapbhcuefchcuau`bbz`jacccf``vdidvat`y````",
+"``````a`epfoczdv`baoacefbxbzcscr`pfi`fcochchezez`mavekdcecfmfmdmfa`wdlapexcdcddmaabbazes`wfd`lan`maqaibwehapcofiauauau`befalbcdp`ddvfodieiat````",
+"````````ata`difbftao`a`bbzfu`bagbzfdbrfiandoaiaifp`wekeqfw`wfkeke`apckaqelecerfkckcdfherer`ufk`wbyaqaidoanamanbzcufx`b`pbgbcbgccagdieiczep``````",
+"````````at`yfgf`difbctagbzascrbcefaubififx`lananezdo`mcidhapav`uelcddcecape`dcflfaekbkeqekdwcofkfiapaidgefchbic`ffalftaldvf`bpf`fbdidia`a```````",
+"````````at`yczddeiaof`dvfb`jbgccasc`crbhcrfpenchchcoanekeh`we``wfkelececaaek`qcdaqfk`ufiezdgdwfman`lbhenfzfzaifpcealcraoaodueobeajdifg`ya```````",
+"``````````a`bueibueiajajddddbcbgalbzfcbh`j`pfpdoaichchavapdodmbtbyad`mfkbydweccfckaielfmbybt`l`mcodwanaxaxenbifxbzdsbxf`ftacfndkajfofgfg````````",
+"``````````a``teifgbubeftdvafccbgalamef`j`dbxcofkaqcodo`famdgdeanaidqanape``me`fiaianfk`m`mbwfdapaqfzffenfpc`bhfu`pftagagft`jddddfofofga`````````",
+"````````````fg`tbueibpf`dvevfbevbgfpfpcrenbxaxamfiananfkbiaxfpezezfxfkecbwbifzch`mezfiamdocochfi`lcobibibzfpfpbzcufjevccac`efgbubu`tej``````````",
+"`````````````tbu`rejf`aodidvdjfcagacbzbhaxdochfxanfzfpbiaichanbychchchbt`lfzbhezcofxaiaichchaufzc`fxch`jdoffenefbgalbgbcbccceiddfo`y`r``````````",
+"```````````````rejeifodvdvajacbcccccdgbibxfpdgaufuezfz`manfzanfxaufp`fcodocoezchchenauchfxchefff`jagffbxenbzbi`dftbc`edz`df`buddbudd````````````",
+"```````````````y`rbuf`diaoajacbgevevcrfpfpfp`afffffc`faqfxchchfzc`dgfxdgbjfxaiaiancofxfpcodg`bffds`adgbxbzbz`e`v`vftbeev`zajf`ddei`t````````````",
+"`````````````````yfoeyfbaj`zajbgevakalbxcccu`e`b`bc`efbic`axaxchfxfpezchbjfcdodochfx`fanbzcuaufxcv`bfp`pef`e`eeoeoaof`f`ajdv`rfn`r``````````````",
+"``````````````````cn`rejeidvacdveoak`vccccfffpbibx`ac``jcucu`jfxbifxfpfxfxfxcodgc`aybiai`i`jch`j`a`edjagacbc`x`zfnddajf`eodvey`t````````````````",
+"``````````````````eybfej`rejfoaoevcccc`v`xbcc`c`fffpbicubxcucuffc`cu`pfcfpdgbhdoaucu`jcuffbxbx`bcr`efjagbcfjeodkeodkevddfobpcney````````````````",
+"````````````````````eyejbpejbpdddvaoaodjbcagbcft`jefchfxbiauc``a`ac`c`fc`afcfccufcenfp`jfffp`jdsfpftcycrbcccdz`zdkbebebfddbf`r``````````````````",
+"``````````````````````cnbpeyfofofodudd`eacdjafcr`d`dcufpffef`jca`bff`jfcbxcuc`dsaecv`d`jds`dcy`vag`xagbcfteo`zbpfnbpbfej`r`r````````````````````",
+"````````````````````````d`bpddbfbebgak`zfj`z`kdsdsbxffff`bdj`b`b`jcucucudgcueffp`b`bcacacvcvctct`dagcyfjccevddeoeybpd`ej`r``````````````````````",
+"``````````````````````````eyddbp`r`k`z`zdzem`kfjfj`b`d`vdjcyctctcactctcv`dcr`bcvctaeaecv`b`jfjdsccakcveoakbedz`zd`ahewah````````````````````````",
+"````````````````````````````ewcnbnbndd`kdzfjdzemakemae`zcv`dcaaeaecy`e`acadsag`vaeaecvakaffjcacrbcajfj`zbp`z`kfnewewcn``````````````````````````",
+"```````````````````````````````rewbfbp`z`zbedzafcyakembeafctcaak`d`v`acvaeae`dff`dag`baeakfj`zcy`zbm`z`z`k`zbfd`ahcn````````````````````````````",
+"```````````````````````````````````sd`eyfnbmeobm`zdz`saf`v`k`kcvbcag`bcvemaeaecvagcyaecvevafaf`zem`zd`dkbmd`bfbf````````````````````````````````",
+"````````````````````````````````````ahewfoewbf`k`z`zdz`zafemememcvaf`kdz`vafaeafakemembmbpafdkdkbp`k`zbp`seyah``````````````````````````````````",
+"`````````````````````````````````````````sah`zewdk`z`zdzaeaf`kemdzakakaeae`kemakemeo`z`kemdkbfbpdk`kd`d`bn``````````````````````````````````````",
+"````````````````````````````````````````````ahbnbf`zd`d``sbm`kdz`sdkdk`sae`k`zbmd``k`sbmdz`kbnah`s`sbn``````````````````````````````````````````",
+"````````````````````````````````````````````````bncnbmbnd`dkdkdkdkbm`sbnbnbndzd`d``sbm`sbfd`bnewah``````````````````````````````````````````````",
+"``````````````````````````````````````````````````````cnd``s`s`sahd`dkbmbnbn`sbnd`bnbn`newah````````````````````````````````````````````````````",
+"``````````````````````````````````````````````````````````````ahcn`sbnahewbn`sewahbn````````````````````````````````````````````````````````````",
+"````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````",
+"````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````"
+};
diff --git a/hacks/images/bubbles/glass2.xpm b/hacks/images/bubbles/glass2.xpm
new file mode 100644 (file)
index 0000000..ee236e5
--- /dev/null
@@ -0,0 +1,94 @@
+/* XPM */
+static char *glass2[] = {
+/* width height ncolors chars_per_pixel */
+"12 12 75 2",
+/* colors */
+"`` c None",
+"`a c #25254C",
+"`b c #23234A",
+"`c c #212148",
+"`d c #2E2E62",
+"`e c #29293F",
+"`f c #272754",
+"`g c #414188",
+"`h c #20202C",
+"`i c #2E2E68",
+"`j c #242447",
+"`k c #25253E",
+"`l c #B9B9ED",
+"`m c #6767A3",
+"`n c #2B2B47",
+"`o c #29295C",
+"`p c #252544",
+"`q c #29295F",
+"`r c #1F1F3E",
+"`s c #2F2F68",
+"`t c #2D2D66",
+"`u c #30305F",
+"`v c #4C4C6D",
+"`w c #2B2B53",
+"`x c #2F2F6E",
+"`y c #34346C",
+"`z c #3B3B55",
+"a` c #303068",
+"aa c #2C2C64",
+"ab c #26264A",
+"ac c #5D5D97",
+"ad c #363674",
+"ae c #3C3C66",
+"af c #252556",
+"ag c #30306E",
+"ah c #3E3E54",
+"ai c #2C2C6A",
+"aj c #4C4C68",
+"ak c #20204A",
+"al c #2E2E5B",
+"am c #343464",
+"an c #16162C",
+"ao c #292938",
+"ap c #333384",
+"aq c #3C3C6F",
+"ar c #1E1E37",
+"as c #38386B",
+"at c #242454",
+"au c #31316E",
+"av c #181831",
+"aw c #232349",
+"ax c #272739",
+"ay c #23234C",
+"az c #37377A",
+"b` c #1E1E3D",
+"ba c #313174",
+"bb c #3C3C78",
+"bc c #383874",
+"bd c #1B1B33",
+"be c #40407F",
+"bf c #292944",
+"bg c #212150",
+"bh c #2D2D76",
+"bi c #191937",
+"bj c #313169",
+"bk c #22224D",
+"bl c #18182C",
+"bm c #2D2D65",
+"bn c #232344",
+"bo c #292961",
+"bp c #27275F",
+"bq c #242452",
+"br c #484868",
+"bs c #262657",
+"bt c #242455",
+/* pixels */
+"`````````vajajajbr``````",
+"````ahaeae`yacasaq`zah``",
+"`````w`f`dagacbb`y`u`u``",
+"```naybm`i`mbabcaaamawar",
+"``bf`ua`adbpaz`gai`ial`j",
+"``bnbgbjaz`xbhapboaa`uav",
+"``b`aybtbcaube`x`s`tbqbd",
+"``anbiakafbb`l`i`q`o`rbl",
+"`````rakbkaf`wbsay`c`k``",
+"````ao`pay`aatab`bar`h``",
+"````````ax`e`n`kax``````",
+"````````````````````````"
+};
diff --git a/hacks/images/bubbles/glass3.xpm b/hacks/images/bubbles/glass3.xpm
new file mode 100644 (file)
index 0000000..e22c86c
--- /dev/null
@@ -0,0 +1,111 @@
+/* XPM */
+static char *glass3[] = {
+/* width height ncolors chars_per_pixel */
+"14 14 90 2",
+/* colors */
+"`` c None",
+"`a c #27274E",
+"`b c #383858",
+"`c c #2E2E62",
+"`d c #292967",
+"`e c #3535A1",
+"`f c #272751",
+"`g c #23234D",
+"`h c #29293F",
+"`i c #353579",
+"`j c #272754",
+"`k c #20202C",
+"`l c #2E2E3D",
+"`m c #242447",
+"`n c #25253E",
+"`o c #3E3E67",
+"`p c #1C1C3F",
+"`q c #6767A3",
+"`r c #2B2B47",
+"`s c #29295C",
+"`t c #2B2B61",
+"`u c #29295F",
+"`v c #1F1F3E",
+"`w c #2F2F68",
+"`x c #2D2D66",
+"`y c #222251",
+"`z c #2D2D69",
+"a` c #33335B",
+"aa c #37374B",
+"ab c #22223D",
+"ac c #28285A",
+"ad c #2B2B53",
+"ae c #2C2C36",
+"af c #424266",
+"ag c #232337",
+"ah c #525265",
+"ai c #32326A",
+"aj c #1B1B2F",
+"ak c #303068",
+"al c #232351",
+"am c #363674",
+"an c #3C3C66",
+"ao c #252556",
+"ap c #27275B",
+"aq c #363663",
+"ar c #4C4C68",
+"as c #2E2E5B",
+"at c #29294C",
+"au c #27274A",
+"av c #252548",
+"aw c #16162C",
+"ax c #292938",
+"ay c #353572",
+"az c #38386B",
+"b` c #4C4C85",
+"ba c #2F2F83",
+"bb c #20203F",
+"bc c #313174",
+"bd c #333379",
+"be c #444458",
+"bf c #272756",
+"bg c #47477C",
+"bh c #32326E",
+"bi c #1B1B33",
+"bj c #30306C",
+"bk c #40407F",
+"bl c #23233E",
+"bm c #141422",
+"bn c #343473",
+"bo c #2D2D76",
+"bp c #2E2E6D",
+"bq c #40406E",
+"br c #21213F",
+"bs c #8080BA",
+"bt c #25255A",
+"bu c #1B1B39",
+"bv c #35356D",
+"bw c #262651",
+"bx c #18182C",
+"by c #373786",
+"bz c #2B2B63",
+"c` c #202037",
+"ca c #1C1C33",
+"cb c #242452",
+"cc c #484868",
+"cd c #1F1F43",
+"ce c #2C2C5D",
+"cf c #3535DD",
+"cg c #262657",
+"ch c #242455",
+/* pixels */
+"``````````arccaharcc````````",
+"``````bea``obqbqbqanafaa````",
+"`````ladaqbv`qbsbgai`ca``b``",
+"````a`a`asaib`bhb`bhakasau``",
+"``c``j`c`d`dbd`eb`am`wce`aca",
+"``bxasaobt`ibdbycf`iay`u`abx",
+"``bl`a`t`ubnbdbocfbcbt`cbwbu",
+"``bi`fch`sbhbkbabp`z`u`w`gaj",
+"``bm`a`a`u`xbjaibgbzcgbf`paw",
+"````agbralazap`t`ucbacbbaj``",
+"`````kbrcdcbcbcgbw`y`vab`k``",
+"``````axbrauatav`r`m`n`n````",
+"``````````ax`h`r`nae````````",
+"````````````````````````````"
+};
diff --git a/hacks/images/bubbles/glass4.xpm b/hacks/images/bubbles/glass4.xpm
new file mode 100644 (file)
index 0000000..6dc1aad
--- /dev/null
@@ -0,0 +1,178 @@
+/* XPM */
+static char *glass4[] = {
+/* width height ncolors chars_per_pixel */
+"20 20 151 2",
+/* colors */
+"`` c None",
+"`a c #27274E",
+"`b c #25254C",
+"`c c #383858",
+"`d c #23234A",
+"`e c #212148",
+"`f c #2E2E62",
+"`g c #292967",
+"`h c #3535A1",
+"`i c #29293F",
+"`j c #2C2C63",
+"`k c #2A2A61",
+"`l c #33334C",
+"`m c #353579",
+"`n c #272754",
+"`o c #20202C",
+"`p c #2E2E3D",
+"`q c #2E2E68",
+"`r c #242447",
+"`s c #2C2C66",
+"`t c #222245",
+"`u c #181824",
+"`v c #25253E",
+"`w c #B9B9ED",
+"`x c #1C1C3F",
+"`y c #6767A3",
+"`z c #2B2B47",
+"a` c #272743",
+"aa c #222248",
+"ab c #292931",
+"ac c #29295C",
+"ad c #1D1D39",
+"ae c #252544",
+"af c #2B2B61",
+"ag c #29295F",
+"ah c #1F1F3E",
+"ai c #2F2F68",
+"aj c #2D2D66",
+"ak c #30305F",
+"al c #2C2C5B",
+"am c #11111C",
+"an c #262655",
+"ao c #31316D",
+"ap c #4C4C6D",
+"aq c #222251",
+"ar c #323264",
+"as c #43436E",
+"at c #212146",
+"au c #37374B",
+"av c #22223D",
+"aw c #252536",
+"ax c #1D1D42",
+"ay c #2A2A5C",
+"az c #28285A",
+"b` c #2B2B53",
+"ba c #333372",
+"bb c #2F2F6E",
+"bc c #2B2B3F",
+"bd c #2C2C36",
+"be c #232337",
+"bf c #34346C",
+"bg c #525265",
+"bh c #32326A",
+"bi c #303068",
+"bj c #21214C",
+"bk c #2C2C64",
+"bl c #292957",
+"bm c #232351",
+"bn c #26264A",
+"bo c #2F2F60",
+"bp c #5D5D97",
+"bq c #363674",
+"br c #3C3C66",
+"bs c #252556",
+"bt c #30306E",
+"bu c #414178",
+"bv c #2C2C6A",
+"bw c #20204A",
+"bx c #2E2E5B",
+"by c #29294C",
+"bz c #242451",
+"c` c #27274A",
+"ca c #343464",
+"cb c #4F4F64",
+"cc c #252548",
+"cd c #292938",
+"ce c #333384",
+"cf c #3C3C6F",
+"cg c #353572",
+"ch c #1E1E37",
+"ci c #38386B",
+"cj c #414156",
+"ck c #242454",
+"cl c #181831",
+"cm c #232349",
+"cn c #272739",
+"co c #4C4C85",
+"cp c #2F2F83",
+"cq c #28285B",
+"cr c #36366C",
+"cs c #48486D",
+"ct c #23234C",
+"cu c #37377A",
+"cv c #20203F",
+"cw c #26265C",
+"cx c #313174",
+"cy c #4C4C60",
+"cz c #27273F",
+"d` c #3C3C78",
+"da c #48485C",
+"db c #383874",
+"dc c #333379",
+"dd c #444458",
+"de c #272756",
+"df c #32326E",
+"dg c #1B1B33",
+"dh c #1E1E2C",
+"di c #30306C",
+"dj c #40407F",
+"dk c #292944",
+"dl c #212150",
+"dm c #141422",
+"dn c #323271",
+"do c #2D2D76",
+"dp c #2E2E6D",
+"dq c #21213F",
+"dr c #8080BA",
+"ds c #23232D",
+"dt c #25255A",
+"du c #35356D",
+"dv c #191937",
+"dw c #262651",
+"dx c #313169",
+"dy c #2C2C6E",
+"dz c #22224D",
+"e` c #18182C",
+"ea c #373786",
+"eb c #232344",
+"ec c #2B2B63",
+"ed c #292961",
+"ee c #202037",
+"ef c #1C1C33",
+"eg c #242452",
+"eh c #45456F",
+"ei c #535380",
+"ej c #1F1F43",
+"ek c #2C2C5D",
+"el c #3535DD",
+"em c #262657",
+"en c #393963",
+"eo c #242455",
+/* pixels */
+"``````````````cycyapbgcbcybg````````````",
+"``````````dacycsehcsehapehcsddcj````````",
+"````````au`cenbraseicibucicibrendd``````",
+"``````auau`ccacidudrbpdrcfcrarakau`p````",
+"`````p`lbx`nbhbfdxcobpcodjdu`sakalb`bd``",
+"`````zbybxbocicgbvbbdn`ydbdfbfekbxbybe``",
+"``dh`r`rbl`faidydndn`hd`dnbtecafakdwah`o",
+"``dhdqejcqajdfcg`meacu`hbqdfdibi`jblbndh",
+"``ch`rbxemaidudnbq`geldcbqdbdn`jafbxbnav",
+"``dm`x`bdxdxcwbqdycpdocxdcbvedbkcqalebdg",
+"```uccctdzbsag`qbqdpeacxbtaidiagekdwcvdm",
+"``dmcl`xeoandtdfbv`wdjcediecbiaydectatch",
+"``amdvcm`xaf`kagaodi`qdbbaecanazejdvdv`u",
+"````e``xcvandlcqckdtcgagcq`qaqay`tbjef``",
+"````dsclaxbwdzdebsckb`acegbjeg`eaaadds``",
+"``````eeeeejbzanegdw`abmdl`b`rcnavaw````",
+"````````eeczbc`b`dby`dbya``eae`iaw``````",
+"``````````bdawa`dkc`aeae`i`i`vab````````",
+"``````````````bd`pcdcdbdcdbd````````````",
+"````````````````````````````````````````"
+};
diff --git a/hacks/images/bubbles/glass5.xpm b/hacks/images/bubbles/glass5.xpm
new file mode 100644 (file)
index 0000000..72aafe7
--- /dev/null
@@ -0,0 +1,195 @@
+/* XPM */
+static char *glass5[] = {
+/* width height ncolors chars_per_pixel */
+"24 24 164 2",
+/* colors */
+"`` c None",
+"`a c #27274E",
+"`b c #25254C",
+"`c c #383858",
+"`d c #23234A",
+"`e c #212148",
+"`f c #2E2E62",
+"`g c #292967",
+"`h c #3535A1",
+"`i c #272751",
+"`j c #23234D",
+"`k c #29293F",
+"`l c #2C2C63",
+"`m c #2A2A61",
+"`n c #33334C",
+"`o c #272754",
+"`p c #414188",
+"`q c #20202C",
+"`r c #2E2E3D",
+"`s c #1C1C28",
+"`t c #2E2E68",
+"`u c #242447",
+"`v c #2C2C66",
+"`w c #181824",
+"`x c #25253E",
+"`y c #161622",
+"`z c #B9B9ED",
+"a` c #3E3E67",
+"aa c #1C1C3F",
+"ab c #6767A3",
+"ac c #2B2B47",
+"ad c #222248",
+"ae c #292931",
+"af c #29295C",
+"ag c #252544",
+"ah c #1E1E47",
+"ai c #2B2B61",
+"aj c #29295F",
+"ak c #1F1F3E",
+"al c #2F2F68",
+"am c #2D2D66",
+"an c #30305F",
+"ao c #2C2C5B",
+"ap c #11111C",
+"aq c #262655",
+"ar c #31316D",
+"as c #4C4C6D",
+"at c #323264",
+"au c #2D2D69",
+"av c #33335B",
+"aw c #212146",
+"ax c #37374B",
+"ay c #22223D",
+"az c #252536",
+"b` c #1D1D42",
+"ba c #28285A",
+"bb c #2B2B53",
+"bc c #333372",
+"bd c #2F2F6E",
+"be c #2C2C36",
+"bf c #424266",
+"bg c #232337",
+"bh c #2F2FB0",
+"bi c #34346C",
+"bj c #525265",
+"bk c #32326A",
+"bl c #1B1B2F",
+"bm c #3B3B55",
+"bn c #303068",
+"bo c #21214C",
+"bp c #2C2C64",
+"bq c #292957",
+"br c #26264A",
+"bs c #202044",
+"bt c #5D5D97",
+"bu c #2B2B5C",
+"bv c #363674",
+"bw c #3C3C66",
+"bx c #252556",
+"by c #30306E",
+"bz c #3E3E54",
+"c` c #2C2C6A",
+"ca c #25252E",
+"cb c #27275B",
+"cc c #363663",
+"cd c #4C4C68",
+"ce c #20204A",
+"cf c #2E2E5B",
+"cg c #29294C",
+"ch c #242451",
+"ci c #27274A",
+"cj c #343464",
+"ck c #252548",
+"cl c #16162C",
+"cm c #292938",
+"cn c #333384",
+"co c #3C3C6F",
+"cp c #353572",
+"cq c #1E1E37",
+"cr c #38386B",
+"cs c #414156",
+"ct c #242454",
+"cu c #31316E",
+"cv c #181831",
+"cw c #232349",
+"cx c #272739",
+"cy c #4C4C85",
+"cz c #2F2F83",
+"d` c #28285B",
+"da c #292952",
+"db c #48486D",
+"dc c #23234C",
+"dd c #37377A",
+"de c #1E1E3D",
+"df c #26265C",
+"dg c #313174",
+"dh c #4C4C60",
+"di c #27273F",
+"dj c #3C3C78",
+"dk c #48485C",
+"dl c white",
+"dm c #383874",
+"dn c #333379",
+"do c #444458",
+"dp c #272756",
+"dq c #1B1B33",
+"dr c #1E1E2C",
+"ds c #30306C",
+"dt c #40407F",
+"du c #292944",
+"dv c #212150",
+"dw c #23233E",
+"dx c #343473",
+"dy c #323271",
+"dz c #2D2D76",
+"e` c #2E2E6D",
+"ea c #40406E",
+"eb c #21213F",
+"ec c #8080BA",
+"ed c #23232D",
+"ee c #25255A",
+"ef c #35356D",
+"eg c #191937",
+"eh c #262651",
+"ei c #313169",
+"ej c #2C2C6E",
+"ek c #22224D",
+"el c #18182C",
+"em c #373786",
+"en c #2D2D65",
+"eo c #232344",
+"ep c #2B2B63",
+"eq c #292961",
+"er c #27275F",
+"es c #1C1C33",
+"et c #242452",
+"eu c #45456F",
+"ev c #484868",
+"ew c #1F1F43",
+"ex c #2C2C5D",
+"ey c #3535DD",
+"ez c #262657",
+"f` c #393963",
+"fa c #242455",
+/* pixels */
+"``````````````````dkdhbjbjbjbjdh````````````````",
+"``````````````csasascdevcdascddbevdh````````````",
+"``````````dodobfa`dbeubfeueueacrbfbfcsax````````",
+"````````bzcsbwf`bwcrbicobteccratcof`bmbzbz``````",
+"```````n`navavanefcjbibt`zcrcobicratccf``nax````",
+"``````acbbao`oat`fambycobtdldjbkbialan`can`n````",
+"````dicg`icj`fbi`fefdyauarabbybiefbnaicfbbcg`x``",
+"````ac`udcbqenbk`tdyabczdgdxdmdtbpcpcjeicwcgcq``",
+"```wdq`acfaiefcpe`bydn`hcyeydmc`ambcef`fcf`u`y`s",
+"```ydudaandfbnaubvdgerbhdd`h`pdyc`cu`tezcf`b`ubl",
+"``elad`abqezbndmdsbccncnczeydnbvdmdxamep`fcgcv`w",
+"```weoetdv`leidfdd`gbddzdzdncncneqeebpexan`ucvap",
+"``elcwdaexehd`epaubd`hdz`hcz`gdycucueeba`oekcl`w",
+"``eldebsdcbxfaeedmejcuemdtcnbdbyalafambuet`bdq`w",
+"```yclakboce`fbx`mcper`veccyauei`mbncbaqdpdaesap",
+"````clakegbsceetbxdsdjdt`zbt`tctajdvafahakayel``",
+"````eldqdeebetboenepetezbnbxencb`lbaeteoaabldr``",
+"``````blakb`ceetekambxctbbafezctdcbo`eew`xcq````",
+"``````ed`qakbsawekchchchetd``jboceaddwcxesed````",
+"````````cmazag`xdcek`bchctetbrci`deocqbg`q``````",
+"```````````qbgayckaybr`uacek`beo`x`xazca````````",
+"``````````````aecxdi`kagacag`xcxcxcm````````````",
+"``````````````````ca`rcmbebebeae````````````````",
+"````````````````````````````````````````````````"
+};
diff --git a/hacks/images/bubbles/glass6.xpm b/hacks/images/bubbles/glass6.xpm
new file mode 100644 (file)
index 0000000..63b01d0
--- /dev/null
@@ -0,0 +1,218 @@
+/* XPM */
+static char *glass6[] = {
+/* width height ncolors chars_per_pixel */
+"30 30 181 2",
+/* colors */
+"`` c None",
+"`a c #27274E",
+"`b c #25254C",
+"`c c #383858",
+"`d c #23234A",
+"`e c #212148",
+"`f c #2E2E62",
+"`g c #3535A1",
+"`h c #23234D",
+"`i c #29293F",
+"`j c #2C2C63",
+"`k c #2A2A61",
+"`l c #33334C",
+"`m c #353579",
+"`n c #272754",
+"`o c #20202C",
+"`p c #2E2E3D",
+"`q c #1C1C28",
+"`r c #2E2E68",
+"`s c #242447",
+"`t c #2C2C66",
+"`u c #222245",
+"`v c #181824",
+"`w c #25253E",
+"`x c #161622",
+"`y c #B9B9ED",
+"`z c #3E3E67",
+"a` c #1C1C3F",
+"aa c #6767A3",
+"ab c #2B2B47",
+"ac c #272743",
+"ad c #292931",
+"ae c #29295C",
+"af c #1D1D39",
+"ag c #252544",
+"ah c #1E1E47",
+"ai c #2B2B61",
+"aj c #29295F",
+"ak c #1F1F3E",
+"al c #2F2F68",
+"am c #2D2D66",
+"an c #30305F",
+"ao c #2C2C5B",
+"ap c #11111C",
+"aq c #262655",
+"ar c #31316D",
+"as c #4C4C6D",
+"at c #222251",
+"au c #323264",
+"av c #2D2D69",
+"aw c #33335B",
+"ax c #43436E",
+"ay c #2B2B67",
+"az c #212146",
+"b` c #37374B",
+"ba c #22223D",
+"bb c #252536",
+"bc c #1D1D42",
+"bd c #28285A",
+"be c #2B2B53",
+"bf c #333372",
+"bg c #2F2F6E",
+"bh c #2C2C36",
+"bi c #424266",
+"bj c #232337",
+"bk c #2F2FB0",
+"bl c #34346C",
+"bm c #525265",
+"bn c #32326A",
+"bo c #1B1B2F",
+"bp c #3B3B55",
+"bq c #303068",
+"br c #21214C",
+"bs c #2C2C64",
+"bt c #292957",
+"bu c #232351",
+"bv c #26264A",
+"bw c #2F2F60",
+"bx c #202044",
+"by c #5D5D97",
+"bz c #2B2B5C",
+"c` c #363674",
+"ca c #3C3C66",
+"cb c #252556",
+"cc c #30306E",
+"cd c #3E3E54",
+"ce c #414178",
+"cf c #2C2C6A",
+"cg c #2F2F4F",
+"ch c #25252E",
+"ci c #27275B",
+"cj c #363663",
+"ck c #4C4C68",
+"cl c #20204A",
+"cm c #2E2E5B",
+"cn c #29294C",
+"co c #242451",
+"cp c #27274A",
+"cq c #343464",
+"cr c #4F4F64",
+"cs c #252548",
+"ct c #16162C",
+"cu c #292938",
+"cv c #333384",
+"cw c #3C3C6F",
+"cx c #353572",
+"cy c #1E1E37",
+"cz c #38386B",
+"d` c #414156",
+"da c #242454",
+"db c #31316E",
+"dc c #181831",
+"dd c #232349",
+"de c #272739",
+"df c #393979",
+"dg c #4C4C85",
+"dh c #2F2F83",
+"di c #28285B",
+"dj c #292952",
+"dk c #36366C",
+"dl c #48486D",
+"dm c #23234C",
+"dn c #37377A",
+"do c #20203F",
+"dp c #1E1E3D",
+"dq c #26265C",
+"dr c #313174",
+"ds c #4C4C60",
+"dt c #27273F",
+"du c #3C3C78",
+"dv c #48485C",
+"dw c white",
+"dx c #383874",
+"dy c #333379",
+"dz c #444458",
+"e` c #272756",
+"ea c #47477C",
+"eb c #32326E",
+"ec c #1E1E2C",
+"ed c #30306C",
+"ee c #40407F",
+"ef c #292944",
+"eg c #212150",
+"eh c #23233E",
+"ei c #141422",
+"ej c #343473",
+"ek c #323271",
+"el c #2D2D76",
+"em c #2E2E6D",
+"en c #40406E",
+"eo c #21213F",
+"ep c #272731",
+"eq c #8080BA",
+"er c #23232D",
+"es c #25255A",
+"et c #1B1B39",
+"eu c #35356D",
+"ev c #191937",
+"ew c #262651",
+"ex c #313169",
+"ey c #2C2C6E",
+"ez c #22224D",
+"f` c #18182C",
+"fa c #373786",
+"fb c #2D2D65",
+"fc c #232344",
+"fd c #2B2B63",
+"fe c #292961",
+"ff c #27275F",
+"fg c #202037",
+"fh c #1C1C33",
+"fi c #242452",
+"fj c #45456F",
+"fk c #484868",
+"fl c #535380",
+"fm c #1F1F43",
+"fn c #2C2C5D",
+"fo c #353573",
+"fp c #262657",
+"fq c #393963",
+"fr c #242455",
+/* pixels */
+"````````````````````````bmbmbmbmbmbmbm``````````````````````",
+"``````````````````dscrasasascrckasasasfkckbm````````````````",
+"````````````````dsdsdzbifjfjfjfjaxaxfjfjckdzdv``````````````",
+"````````````d`dvfqdzenfkfjencaendlaxaxcabibi`zdvb```````````",
+"``````````cd`zaw`cfqcacaceflczbydg`zencjcwca`cbpbpcd````````",
+"````````d`cdb``cawcqczdkeubycwbyczdwcwczcqaucaawb`b`b```````",
+"````````b``lcmcqaoczaublbndgeqdfeqczdgbn`jcmanfnawcg`l``````",
+"``````cu`w`wcmcmcqblardxeu`yceareqdueualbleuexdjcmbeba`p````",
+"````chabcg`acmbwbqczaiebcfdfdgekeqdudxebcxblbncmcm`ababjer``",
+"`````o`aeodmaobdalbn`rcfdf`mdhdrdyeaejdubscxffbwbwdd`b`w`q``",
+"````fhbadjcmbq`jcxcxekemeydr`gdy`geeekek`t`rexe`e``ndjdcdc``",
+"```q`veocnbtdialbleb`rfo`medfadnelbkc`bffeedeufn`jcmfmbvfg`x",
+"``ecbo`sbze`feaeayexavbgej`gbkdyeydhdudnemdbfdal`kfna``udc`v",
+"```xeieodjbtfpexfbc`avekbg`gbkelfa`g`gdxcxcfdxamfpbtcpfcdoap",
+"```vcya`btegex`kbldqdncfeycvdyelcv`gdycvfefeebaedianfmfcdc`q",
+"``fhcyetahfncobdbs`tbncfdybgcf`gdhcfavavav`tfraifnbtbteteoei",
+"```xdpaz`bbtcl`fesfbedfdekelbkdhaaavbgcf`jfe`fesbwez`bbxdcei",
+"```xfhdcbx`hfratbresfdedcfee`meedffded`t`tbqdiaee``nazazdcap",
+"`````vdp`sew`bbqaifpfpdbbsccdxdfekbyee`j`jdialbzfidmazafct``",
+"`````vbodpevbcaqbdatcb`tfdamar`ydg`taicbaje`dadaahaketevbo``",
+"`````qf`bjakdobdezegfbaidacibncxdgbddiajalatfibz`ubccyfh`q``",
+"``````chbjbcbcfmbdaediatcbfpfpajfpdaesfpbudmco`h`eewfhf`````",
+"`````````ocydp`waz`e`baqfiesfpdjfpfiaidacpewah`wafdpbb``````",
+"````````chfgfgfmddcofibdfi`bfi`ada`hegbu`h`seodtbafhec``````",
+"``````````cuepdo`wefdmfidd`b`hdae``bbvcn`dagakbabj`o````````",
+"````````````erbbdeefcsefcpabezcp`habef`sbx`wehbber``````````",
+"````````````````chbbba`ief`iacagabef`i`wba`wcu``````````````",
+"``````````````````chbb`p`p`w`w`pcu`p`icucuch````````````````",
+"````````````````````````adadcudeepadbh``````````````````````",
+"````````````````````````````````````````````````````````````"
+};
diff --git a/hacks/images/bubbles/glass7.xpm b/hacks/images/bubbles/glass7.xpm
new file mode 100644 (file)
index 0000000..750c251
--- /dev/null
@@ -0,0 +1,230 @@
+/* XPM */
+static char *glass7[] = {
+/* width height ncolors chars_per_pixel */
+"36 36 187 2",
+/* colors */
+"`` c None",
+"`a c #27274E",
+"`b c #25254C",
+"`c c #383858",
+"`d c #23234A",
+"`e c #212148",
+"`f c #2E2E62",
+"`g c #292967",
+"`h c #3535A1",
+"`i c #272751",
+"`j c #23234D",
+"`k c #29293F",
+"`l c #2C2C63",
+"`m c #2A2A61",
+"`n c #33334C",
+"`o c #353579",
+"`p c #272754",
+"`q c #414188",
+"`r c #20202C",
+"`s c #2E2E3D",
+"`t c #1C1C28",
+"`u c #2E2E68",
+"`v c #242447",
+"`w c #2C2C66",
+"`x c #222245",
+"`y c #181824",
+"`z c #25253E",
+"a` c #161622",
+"aa c #B9B9ED",
+"ab c #3E3E67",
+"ac c #1C1C3F",
+"ad c #6767A3",
+"ae c #2B2B47",
+"af c #272743",
+"ag c #222248",
+"ah c #292931",
+"ai c #29295C",
+"aj c #1D1D39",
+"ak c #252544",
+"al c #1E1E47",
+"am c #2B2B61",
+"an c #29295F",
+"ao c #1F1F3E",
+"ap c #2F2F68",
+"aq c #2D2D66",
+"ar c #30305F",
+"as c #2C2C5B",
+"at c #11111C",
+"au c #262655",
+"av c #31316D",
+"aw c #4C4C6D",
+"ax c #222251",
+"ay c #323264",
+"az c #2D2D69",
+"b` c #33335B",
+"ba c #43436E",
+"bb c #2B2B67",
+"bc c #212146",
+"bd c #37374B",
+"be c #22223D",
+"bf c #252536",
+"bg c #1D1D42",
+"bh c #2A2A5C",
+"bi c #28285A",
+"bj c #2B2B53",
+"bk c #333372",
+"bl c #2F2F6E",
+"bm c #2B2B3F",
+"bn c #2C2C36",
+"bo c #424266",
+"bp c #232337",
+"bq c #2F2FB0",
+"br c #34346C",
+"bs c #525265",
+"bt c #32326A",
+"bu c #1B1B2F",
+"bv c #3B3B55",
+"bw c #303068",
+"bx c #21214C",
+"by c #2C2C64",
+"bz c #292957",
+"c` c #232351",
+"ca c #26264A",
+"cb c #2F2F60",
+"cc c #202044",
+"cd c #5D5D97",
+"ce c #2B2B5C",
+"cf c #363674",
+"cg c #3C3C66",
+"ch c #252556",
+"ci c #30306E",
+"cj c #3E3E54",
+"ck c #414178",
+"cl c #2C2C6A",
+"cm c #2F2F4F",
+"cn c #25252E",
+"co c #27275B",
+"cp c #363663",
+"cq c #4C4C68",
+"cr c #20204A",
+"cs c #2E2E5B",
+"ct c #29294C",
+"cu c #242451",
+"cv c #27274A",
+"cw c #343464",
+"cx c #4F4F64",
+"cy c #252548",
+"cz c #16162C",
+"d` c #292938",
+"da c #333384",
+"db c #3C3C6F",
+"dc c #353572",
+"dd c #1E1E37",
+"de c #38386B",
+"df c #414156",
+"dg c #242454",
+"dh c #31316E",
+"di c #181831",
+"dj c #232349",
+"dk c #272739",
+"dl c #393979",
+"dm c #4C4C85",
+"dn c #2F2F83",
+"do c #28285B",
+"dp c #292952",
+"dq c #48486D",
+"dr c #23234C",
+"ds c #37377A",
+"dt c #1E1E3D",
+"du c #26265C",
+"dv c #313174",
+"dw c #4C4C60",
+"dx c #27273F",
+"dy c #3C3C78",
+"dz c #48485C",
+"e` c white",
+"ea c #383874",
+"eb c #333379",
+"ec c #444458",
+"ed c #272756",
+"ee c #47477C",
+"ef c #32326E",
+"eg c #1B1B33",
+"eh c #1E1E2C",
+"ei c #30306C",
+"ej c #40407F",
+"ek c #292944",
+"el c #212150",
+"em c #23233E",
+"en c #141422",
+"eo c #343473",
+"ep c #323271",
+"eq c #2D2D76",
+"er c #2E2E6D",
+"es c #40406E",
+"et c #21213F",
+"eu c #272731",
+"ev c #8080BA",
+"ew c #23232D",
+"ex c #25255A",
+"ey c #1B1B39",
+"ez c #35356D",
+"f` c #191937",
+"fa c #262651",
+"fb c #313169",
+"fc c #2C2C6E",
+"fd c #22224D",
+"fe c #18182C",
+"ff c #373786",
+"fg c #2D2D65",
+"fh c #232344",
+"fi c #2B2B63",
+"fj c #292961",
+"fk c #27275F",
+"fl c #202037",
+"fm c #1C1C33",
+"fn c #242452",
+"fo c #45456F",
+"fp c #484868",
+"fq c #535380",
+"fr c #1F1F43",
+"fs c #2C2C5D",
+"ft c #3535DD",
+"fu c #353573",
+"fv c #262657",
+"fw c #393963",
+"fx c #242455",
+/* pixels */
+"````````````````````````````````bsbsbsdwbs``````````````````````````````",
+"````````````````````````dwbsdwcqcxbscqdwcqcxdzcxbs``````````````````````",
+"````````````````````fpcxawcqawcqawawcqawfocqcqawfpcqcx``````````````````",
+"``````````````````ececfpfpbofodqdqdqesbababadqfobafpeccj````````````````",
+"``````````````dfeccjabcgesbobaabadcgabbaeefobaesbob`cgdfcjcj````````````",
+"````````````cjdfbvcgfwfwcgcgesbrevdbcdeeesdedbfwdbcgcpbvbvdfcj``````````",
+"``````````bdbvbvcg`ccpcwdecwayckcdeecddydcbrezdecpayfwb`ar`ncjbd````````",
+"```````````saecmcscpcscwbwaqayeaevfqdyckbtdefbcpeicscbcscpb`cmae````````",
+"`````````scvbjcmar`pcsfb`fbt`fcidmdecdcdefdyezaqbraz`farasasarek`s``````",
+"``````bnaecmdjayb`fscsbwaqfbbwdyaacddheacdfudbfbbrbtfbaqbzcsdpafcmcn````",
+"```````s`zbj`basfs`fbr`f`wdcepeqcfcdfue`dmdvcdbkbkbrfb`fbwbjcaaect`z````",
+"`````taeaoccdrcsfdfgbwbr`ubb`oadebdndvebe`eadsejbyavfgcwbtcsdjbjaeddbf``",
+"````eudidjbzdp`pbzbwbbefeperfjdabldadada`qcfdveofi`wfb`fay`ped`aeteg`k``",
+"`````yflfadpcsfs`lbrdcav`wcfeoepdsda`qbqebdydsepfiaveabwbz`maybc`abufe``",
+"````fmek`aararaiambwbyefcfcfbqfkeqejds`gft`qeofuclfkbw`ubibtcs`bcv`vfe``",
+"```ydi`v`xdpbzamaxaqfkavererbkfffcfc`hdaeqdscffudcclbkfgapanayaodpczeg`t",
+"``atbpao`adpbzdo`mfgbtepereperfcbqft`g`hffbqbkdlfucleiaqfbdg`bctfrfmfea`",
+"```yetfh`xdpelfbfsfbaz`mdsci`gblffdneqftebda`hdafjfjfgbybwdgardr`xdia`at",
+"``ateheycccredfsaxfgcibbeffjejdafc`g`heqblfjepclazazap`wfscbbz`jacfrflat",
+"``atczey`v`afsacfsdgco`lbb`gebffereqft`qffdaer`wfgfifififjbzcu`i`adda`at",
+"````a`dtcy`xdrcrexfxfvfgeabkbbdhffadejdndnblclepapdubhaqfvcefn`xdtegfe``",
+"````a`dieybxfnbx`jfsfxfkfgfgdheoev`qdncdfcdlfjfi`wfiapcuchaubzaceydiat``",
+"````atdifr`abz`bbzbranaifneifufidyckejepckffepfibyaianancu`bbgbgagegen``",
+"````atczegeyf`bgascrcrelchanefdyfieaaa`qaq`uexduanbhfxaicecraoemajfea```",
+"```````tfebedtccaled`dcoaqdoamdeaiandydyaifi`mfbaqfdfnbh`pagfrddfmfe````",
+"```````t`reydidjagbzaxchanfnaianchch`lbhcoaichauc`chdoelbgbgbcegfm`r````",
+"`````````reyaoacetcrfn`afd`ffvchc`fvbjaianfvco`bdrdgbz`e`vbe`zeyeg``````",
+"```````````regacem`vccfnbxc`cu`jbifnfvcoc`bi`ich`adjac`xflajemew````````",
+"``````````ewbpbpdtaobcbc`jchbic``ac``afafafnfd`jfncybcdxdkbedd`r````````",
+"````````````d`ddbeakfh`kdrfd`b`b`jcudged`bcacvct`dcyccddewd``r``````````",
+"``````````````eubndddxdxakaecvcaae`ecaagaecvafcabcfhbp`keucn````````````",
+"``````````````````d`flem`z`s`v`kbc`bekaeagaeetafekd`bmbf````````````````",
+"`````````````````````s`zdk`zae`kdxakaeekek`zekbfdkd`bn``````````````````",
+"````````````````````````bnbmd`dkdk`sbndxd`bmbfbnah``````````````````````",
+"````````````````````````````````cnbneu`sah``````````````````````````````",
+"````````````````````````````````````````````````````````````````````````"
+};
diff --git a/hacks/images/bubbles/glass8.xpm b/hacks/images/bubbles/glass8.xpm
new file mode 100644 (file)
index 0000000..0fcd41b
--- /dev/null
@@ -0,0 +1,240 @@
+/* XPM */
+static char *glass8[] = {
+/* width height ncolors chars_per_pixel */
+"44 44 189 2",
+/* colors */
+"`` c None",
+"`a c #27274E",
+"`b c #25254C",
+"`c c #383858",
+"`d c #23234A",
+"`e c #212148",
+"`f c #2E2E62",
+"`g c #292967",
+"`h c #3535A1",
+"`i c #272751",
+"`j c #23234D",
+"`k c #29293F",
+"`l c #2C2C63",
+"`m c #2A2A61",
+"`n c #33334C",
+"`o c #353579",
+"`p c #272754",
+"`q c #414188",
+"`r c #20202C",
+"`s c #2E2E3D",
+"`t c #1C1C28",
+"`u c #2E2E68",
+"`v c #242447",
+"`w c #2C2C66",
+"`x c #222245",
+"`y c #181824",
+"`z c #25253E",
+"a` c #161622",
+"aa c #B9B9ED",
+"ab c #3E3E67",
+"ac c #1C1C3F",
+"ad c #6767A3",
+"ae c #2B2B47",
+"af c #272743",
+"ag c #222248",
+"ah c #292931",
+"ai c #29295C",
+"aj c #1D1D39",
+"ak c #252544",
+"al c #1E1E47",
+"am c #2B2B61",
+"an c #29295F",
+"ao c #1F1F3E",
+"ap c #2F2F68",
+"aq c #2D2D66",
+"ar c #30305F",
+"as c #2C2C5B",
+"at c #11111C",
+"au c #262655",
+"av c #31316D",
+"aw c #4C4C6D",
+"ax c #222251",
+"ay c #323264",
+"az c #2D2D69",
+"b` c #33335B",
+"ba c #43436E",
+"bb c #2B2B67",
+"bc c #212146",
+"bd c #37374B",
+"be c #22223D",
+"bf c #252536",
+"bg c #1D1D42",
+"bh c #2A2A5C",
+"bi c #28285A",
+"bj c #2B2B53",
+"bk c #333372",
+"bl c #2F2F6E",
+"bm c #2B2B3F",
+"bn c #2C2C36",
+"bo c #424266",
+"bp c #232337",
+"bq c #2F2FB0",
+"br c #34346C",
+"bs c #525265",
+"bt c #32326A",
+"bu c #1B1B2F",
+"bv c #3B3B55",
+"bw c #303068",
+"bx c #21214C",
+"by c #2C2C64",
+"bz c #292957",
+"c` c #232351",
+"ca c #26264A",
+"cb c #2F2F60",
+"cc c #202044",
+"cd c #5D5D97",
+"ce c #2B2B5C",
+"cf c #363674",
+"cg c #3C3C66",
+"ch c #252556",
+"ci c #30306E",
+"cj c #3E3E54",
+"ck c #414178",
+"cl c #2C2C6A",
+"cm c #2F2F4F",
+"cn c #25252E",
+"co c #27275B",
+"cp c #363663",
+"cq c #4C4C68",
+"cr c #20204A",
+"cs c #2E2E5B",
+"ct c #29294C",
+"cu c #242451",
+"cv c #27274A",
+"cw c #343464",
+"cx c #4F4F64",
+"cy c #252548",
+"cz c #16162C",
+"d` c #292938",
+"da c #333384",
+"db c #3C3C6F",
+"dc c #353572",
+"dd c #1E1E37",
+"de c #38386B",
+"df c #414156",
+"dg c #242454",
+"dh c #31316E",
+"di c #181831",
+"dj c #232349",
+"dk c #272739",
+"dl c #393979",
+"dm c #4C4C85",
+"dn c #2F2F83",
+"do c #28285B",
+"dp c #292952",
+"dq c #36366C",
+"dr c #48486D",
+"ds c #23234C",
+"dt c #37377A",
+"du c #20203F",
+"dv c #1E1E3D",
+"dw c #26265C",
+"dx c #313174",
+"dy c #4C4C60",
+"dz c #27273F",
+"e` c #3C3C78",
+"ea c #48485C",
+"eb c white",
+"ec c #383874",
+"ed c #333379",
+"ee c #444458",
+"ef c #272756",
+"eg c #47477C",
+"eh c #32326E",
+"ei c #1B1B33",
+"ej c #1E1E2C",
+"ek c #30306C",
+"el c #40407F",
+"em c #292944",
+"en c #212150",
+"eo c #23233E",
+"ep c #141422",
+"eq c #343473",
+"er c #323271",
+"es c #2D2D76",
+"et c #2E2E6D",
+"eu c #40406E",
+"ev c #21213F",
+"ew c #272731",
+"ex c #8080BA",
+"ey c #23232D",
+"ez c #25255A",
+"f` c #1B1B39",
+"fa c #35356D",
+"fb c #191937",
+"fc c #262651",
+"fd c #313169",
+"fe c #2C2C6E",
+"ff c #22224D",
+"fg c #18182C",
+"fh c #373786",
+"fi c #2D2D65",
+"fj c #232344",
+"fk c #2B2B63",
+"fl c #292961",
+"fm c #27275F",
+"fn c #202037",
+"fo c #1C1C33",
+"fp c #242452",
+"fq c #45456F",
+"fr c #484868",
+"fs c #535380",
+"ft c #1F1F43",
+"fu c #2C2C5D",
+"fv c #3535DD",
+"fw c #353573",
+"fx c #262657",
+"fy c #393963",
+"fz c #242455",
+/* pixels */
+"````````````````````````````````````````````bs``````````````````````````````````````````",
+"````````````````````````````````dybseabsawbsbscxawcxbsdybs``````````````````````````````",
+"````````````````````````````eedycqcqcqdrcxawcqawawawawfrfrcxcq``````````````````````````",
+"````````````````````````eadyfrdybafrfqawawfqdrawawfrfrdrawcqeaeeee``````````````````````",
+"````````````````````eeeebofrboawbofqdrbadrfqeufqfqbababafqfrbobobocjee``````````````````",
+"``````````````````dfeebvfybvcgbaboeueueueuababfqdefqegeuabeufybocgdfeacj````````````````",
+"````````````````bvbo`nfydffybocgcgdedbegfsfqeuegexeudbdqdedbdeabfybvcjdfcj``````````````",
+"``````````````bdcjbvfyfyb`defyfydedbckexexebckdmaqdbdbdbayaydeaycpbvab`ccjbd````````````",
+"`````````````s`ccjb`b`b`b`ardededeaydcexadckaddbdbaadqdqbrbtbrayb`cpb``c`ccm`n``````````",
+"```````````n`n`ncmcsb`cpascpegfi`ucwbrcdcdebehaddbbrdmfaayaqcbb`arcscs`ccmb`ae`s````````",
+"``````````aeafcmaeasfu`paraycbbtfd`lavecckegcdcdaaec`qfa`ufa`f`ubwarbzb`cscs`kbm````````",
+"````````ewaectfjbzcsb`arcwbtdcapec`fdcaadmcd`ueqaddmekecav`fapbtecbwdparbjcmaoct`n``````",
+"````````bddzcmbjdparcscb`fdbfdfidcdlcieqbbdlciebexeletegbwbk`ubtbwfufucsdpcm`zctbm``````",
+"```````ycmdjdpctauaramefcsbwapehekereddleledcfdmdmdmerelecaqaqbrehcbbzarfc`vbjcyem`r````",
+"``````bpaobefjccbzasenbw`ufafdblcl`oeldldnbqededdtcdbkdldlet`lekamcbbw`fbjauctdp`zfn````",
+"`````yfoaj`bbzeodsfibhbrekavcfcletfldneddxeddadtdadmbkerercleh`ubwbwcbbzarbhdpfjdiei`t``",
+"````atfoemfcdpbzasfi`ffadcekbkazeqerbkerdadtdmfhbqdldleddxfkfdapdcfdfcam`pbz`e`ifoepa```",
+"````a`dd`v`bbzbjefdw`lbwbtehdceccf`hfeerbqfhedesbqfvdlcifwcifldhbrficbficsefcc`v`xajbp``",
+"````fnfgeo`vfubzbwdwco`ufm`m`ucfbler`ofh`hfveddndnbqdldldtcffmbkbwapbwaiefaybgctczfgei``",
+"`````yczacaodpbjayfxcobwapbkehdhblerdtdnfe`hbqfhbqfedtcfeqecaqeqbwfiapanbhbr`zdjbcaofo``",
+"````atczf``bbzbzbhax`laqbwaqdhciblfeclfhfhdafmbqdabqdacidldtdhflcf`wby`fauef`vccakev`y``",
+"``ata`fnagccbzenbhfiaifdehezdhdlet`geteddnbqesfvedbqesdndabbfmfmbtbyamfufuasbcccdidiepat",
+"````fgfgao`dbg`e`falcobwfkfmdh`o`gcidnesdn`gdabqed`geteretblekazfk`u`fdocb`j`abgf`ev`y``",
+"`````yeicv`v`b`pamfcbhfxfidwetazazdx`q`heted`qfveder`get`wciekehchcodgbhffefeffcczbu`y``",
+"````epdvfjfj`acubzenanbifxbyaqci`w`gereleddnesehdnazdxbkcl`wfmfm`f`lfmayenau`bfceidia```",
+"`````ybuev`xcc`j`pfzaxau`jezekcferblcifhfhdmdmdldtfmblekdhekaq`fbififzbzftbidudvdifgbu``",
+"````atfgfoaobgal`pc`auamaxcoekapdcfwaqe`edeldnele`ekelfm`manapaqficubi`pdjfcacf`bgdvep``",
+"`````ya`f`ag`bdpasbcfubraibifmfmdhcfanekdcdmdtdhflexblcifkbyfiaifian`pau`pagbgbceicza```",
+"``````epdif`dubcefbgauenaxfmco`f`mecekfied`uavexfkbbaqfmdwanapcubifxffbgacftbef`di`y````",
+"``````a`czbuf`ddddbcfffcfcdgdoancofdezbwecfkap`wehaifmbtfiandwaxenbibzagf`ccbpaj`t`y````",
+"`````````yfoeyaceoevenfpffbx`mam`mbifpdwchapehaicocoamaibibtezfxdgfxeffjccfpeiddfg``````",
+"````````ej`rdidvaobzalbzfp`mauchfpfkezfkau`f`fdechchchfzbic`axbxfpauff`ebg`pejej`t``````",
+"```````````tf`f`ajal`zcrfpendsffaycochfzdgfzbjcoancofpdo`ben`affce`edjbcbebef`di````````",
+"```````````t`rf`dvaoeobcdu`ece`bfpencucofxbic`auc`dgficuef`bbxffbg`ebedddvaobfew````````",
+"````````````cnejbpaodvftdj`jcr`pcoen`j`jcu`ifcbifx`jc``jen`bbx`vccbe`z`zddddcn``````````",
+"``````````````ewbpddfbddaccycr`dfp`jfpca`jcu`dc`cacv`dff`d`d`x`dft`z`zbeejcn````````````",
+"````````````````fgfneoduembmfj`vag`act`bds`ac``j`j`acv`bbcagak`xdudvbpcn`t``````````````",
+"``````````````````ewd`fnaeakemcyaecvdjaeaecrcvdsakaeakafcy`jao`zfnd`cn`t````````````````",
+"````````````````````d`dkfndzd``zbm`v`k`b`ecvemaeca`vaedudz`zafew`kbfey``````````````````",
+"````````````````````````bfdkd`dz`kafdzae`vemcyafakakaedzdzbed`dkcn``````````````````````",
+"````````````````````````````ahdkbnbnbm`z`sdk`s`zd`bm`safd`bn`s``````````````````````````",
+"````````````````````````````````bnbn`sd`d`dk`sbmbnah`s`sah``````````````````````````````",
+"````````````````````````````````````````````cn``````````````````````````````````````````",
+"````````````````````````````````````````````````````````````````````````````````````````"
+};
diff --git a/hacks/images/bubbles/glass9.xpm b/hacks/images/bubbles/glass9.xpm
new file mode 100644 (file)
index 0000000..9e3ac20
--- /dev/null
@@ -0,0 +1,245 @@
+/* XPM */
+static char *glass9[] = {
+/* width height ncolors chars_per_pixel */
+"50 50 188 2",
+/* colors */
+"`` c None",
+"`a c #27274E",
+"`b c #25254C",
+"`c c #383858",
+"`d c #23234A",
+"`e c #212148",
+"`f c #2E2E62",
+"`g c #292967",
+"`h c #3535A1",
+"`i c #272751",
+"`j c #23234D",
+"`k c #29293F",
+"`l c #2C2C63",
+"`m c #2A2A61",
+"`n c #33334C",
+"`o c #353579",
+"`p c #272754",
+"`q c #414188",
+"`r c #20202C",
+"`s c #2E2E3D",
+"`t c #1C1C28",
+"`u c #2E2E68",
+"`v c #242447",
+"`w c #2C2C66",
+"`x c #222245",
+"`y c #181824",
+"`z c #25253E",
+"a` c #161622",
+"aa c #B9B9ED",
+"ab c #3E3E67",
+"ac c #1C1C3F",
+"ad c #6767A3",
+"ae c #2B2B47",
+"af c #272743",
+"ag c #222248",
+"ah c #292931",
+"ai c #29295C",
+"aj c #1D1D39",
+"ak c #252544",
+"al c #1E1E47",
+"am c #2B2B61",
+"an c #29295F",
+"ao c #1F1F3E",
+"ap c #2F2F68",
+"aq c #2D2D66",
+"ar c #30305F",
+"as c #2C2C5B",
+"at c #11111C",
+"au c #262655",
+"av c #31316D",
+"aw c #4C4C6D",
+"ax c #222251",
+"ay c #323264",
+"az c #2D2D69",
+"b` c #33335B",
+"ba c #43436E",
+"bb c #2B2B67",
+"bc c #212146",
+"bd c #37374B",
+"be c #22223D",
+"bf c #252536",
+"bg c #1D1D42",
+"bh c #2A2A5C",
+"bi c #28285A",
+"bj c #2B2B53",
+"bk c #333372",
+"bl c #2F2F6E",
+"bm c #2B2B3F",
+"bn c #2C2C36",
+"bo c #424266",
+"bp c #232337",
+"bq c #2F2FB0",
+"br c #34346C",
+"bs c #525265",
+"bt c #32326A",
+"bu c #1B1B2F",
+"bv c #3B3B55",
+"bw c #303068",
+"bx c #21214C",
+"by c #292957",
+"bz c #232351",
+"c` c #26264A",
+"ca c #2F2F60",
+"cb c #202044",
+"cc c #5D5D97",
+"cd c #2B2B5C",
+"ce c #363674",
+"cf c #3C3C66",
+"cg c #252556",
+"ch c #30306E",
+"ci c #3E3E54",
+"cj c #414178",
+"ck c #2C2C6A",
+"cl c #2F2F4F",
+"cm c #25252E",
+"cn c #27275B",
+"co c #363663",
+"cp c #4C4C68",
+"cq c #20204A",
+"cr c #2E2E5B",
+"cs c #29294C",
+"ct c #242451",
+"cu c #27274A",
+"cv c #343464",
+"cw c #4F4F64",
+"cx c #252548",
+"cy c #16162C",
+"cz c #292938",
+"d` c #333384",
+"da c #3C3C6F",
+"db c #353572",
+"dc c #1E1E37",
+"dd c #38386B",
+"de c #414156",
+"df c #242454",
+"dg c #31316E",
+"dh c #181831",
+"di c #232349",
+"dj c #272739",
+"dk c #393979",
+"dl c #4C4C85",
+"dm c #2F2F83",
+"dn c #28285B",
+"do c #292952",
+"dp c #36366C",
+"dq c #48486D",
+"dr c #23234C",
+"ds c #37377A",
+"dt c #20203F",
+"du c #1E1E3D",
+"dv c #26265C",
+"dw c #313174",
+"dx c #4C4C60",
+"dy c #27273F",
+"dz c #3C3C78",
+"e` c #48485C",
+"ea c white",
+"eb c #383874",
+"ec c #333379",
+"ed c #444458",
+"ee c #272756",
+"ef c #47477C",
+"eg c #32326E",
+"eh c #1B1B33",
+"ei c #1E1E2C",
+"ej c #30306C",
+"ek c #40407F",
+"el c #292944",
+"em c #212150",
+"en c #23233E",
+"eo c #141422",
+"ep c #343473",
+"eq c #323271",
+"er c #2D2D76",
+"es c #2E2E6D",
+"et c #40406E",
+"eu c #21213F",
+"ev c #272731",
+"ew c #8080BA",
+"ex c #23232D",
+"ey c #25255A",
+"ez c #1B1B39",
+"f` c #35356D",
+"fa c #191937",
+"fb c #262651",
+"fc c #313169",
+"fd c #2C2C6E",
+"fe c #22224D",
+"ff c #18182C",
+"fg c #373786",
+"fh c #2D2D65",
+"fi c #232344",
+"fj c #2B2B63",
+"fk c #292961",
+"fl c #27275F",
+"fm c #202037",
+"fn c #1C1C33",
+"fo c #242452",
+"fp c #45456F",
+"fq c #484868",
+"fr c #535380",
+"fs c #1F1F43",
+"ft c #2C2C5D",
+"fu c #3535DD",
+"fv c #353573",
+"fw c #262657",
+"fx c #393963",
+"fy c #242455",
+/* pixels */
+"````````````````````````````````````````````````````````````````````````````````````````````````````",
+"``````````````````````````````````````e`bscwbscwbsbsbsbsbsbsbscw````````````````````````````````````",
+"````````````````````````````````bse`bscpbse`awawcwbsbsdqawawbsdxdxcwcw``````````````````````````````",
+"````````````````````````````e`eddxfqcwcpfqfqawawdqawdqawawfqcwawawfqfqe`cw``````````````````````````",
+"````````````````````````cie`e`dxfqboboawfpfpdqfpbafpawfpdqbofpabdqfqfqedcfdee```````````````````````",
+"``````````````````````edede`cifqbodqabfpfpbabobaccbabafpbaddbaetfpfqabbobobodee`````````````````````",
+"````````````````````deedbvbvfxfxcfetboetfpcfewetddetetdaefetbaetabetbofxabcfedcici``````````````````",
+"``````````````````bdedbd`cabdefxababfxddetddcccjefbacjeaetddddcfdpdaddababb``cdeedde````````````````",
+"````````````````bvbdbvfx`cb`fxcfcffxdddaddefccaaeaefewbwdldadaddcoayddcvcfb``cbvbdbvci``````````````",
+"```````````````s`cbvbdb`b`b`cocvdddaddayf`braadlfrccdldzewdddaebddfcbwayfxcfb``cbd`cbd`s````````````",
+"````````````bd`sclclbjb`crb`arcofr`ubtbtfcdkaaewewdlcjdabtdabtcvddebayaycadoarb``c`n`ncl`s``````````",
+"``````````bdbv`c`ccub`b`b`ascrdp`fcadzaqbwfjebcjeaccewaaccdlfrdlegbw`f`lcab`crcrcrclclelbpbd````````",
+"``````````bnbmcuclclcrb``pararcv`ff`fcegf`dzewcjcjeqdleabkavf`fc`mbrcaegfcaycabjararcrae`sbm````````",
+"````````evaedycragcacvb`apcrasbwf``faybtavekewaddleqdkccccdkbrdzfcavapbrfhf`biascac`bjcuel`kbf``````",
+"````````aeae`vcldo`acrcacr`fbtddaqapebceckbleqdzdseqaaadekdwebdkavceapbrbt`fftamcrbybjaeclbpbp``````",
+"```````rfnbeakdocubzarfw`faiarbraqegejbkcheqeqekd``oefekewdzchekbkaqfhbtbkapcrcacr`j`vdocbbpfn`t````",
+"``````cz`zdoakbccbbyasdr`fap`uf`fcejck`obkdl`odmfudwecdwaadzbkdzdbaz`legaqftar`fcadofbdobjafdccm````",
+"``````bfehdc`aeefifbftaiambw`gavbkblck`gckd`eqecec`hfgd`addsepbkfvfkapazavf`fw`fbycrcd`a`vehbubp````",
+"`````tbuehdyfbasdocaapayayebebbteq`geqchfvdwecbqdkaddsfudwdzbkckdwfjbrapf`bwf`byfwbyasdr`iezbucy`t``",
+"`````yfnfieu`bdi`abydn`mfcf`f`egdbavdbec`odwcefgecdsd`dmbqepceeqf`az`wejdbbrambi`lcdft`bcbc``va`ei``",
+"````a`eoenfifsaycrbyfl`mfc`uan`webceebdmer`gdwbqdsdsdmdmbqekdkeccechckfkejegfhbiftarby`a`v`vfiffbu``",
+"````fmcycxdidt`iardpdnemanavflejazeqesepcefgblerfud`fgfderfgdkdsdkdzfkeqbkapapbt`lctfceuas`vcydhfn``",
+"````ehdheudtagbybjcabidnapapfcebejblchcheqer`hbqbqerbqfufgecdsebcedkbkbleqf`fjambicaaycu`vcxa`du`y``",
+"````fnfndhdtbgdobybifocnbwameqckdgeqeqfdesfdfgfgdwflfddmfufudwch`odschflejebdvayby`pee`vcbacfndcbu``",
+"````bube`vacfe`iembyfc`f`ufc`wdveqdkeqflfddwfudm`her`hd`fgbqecd`ecbbflfkfjapdvbwdnftas`jfifieh`yeo``",
+"````ffehdhdhdrcqalft`jembtai`wfkdg`obbesbldmfddm`gecfud`dmbbdw`ochbl`ufkap`weganaiar`j`j`ddu`adhff``",
+"````ffdcdrdtbj`a`pfhfebibh`legfkesapaqeq`obqbqfddkfu`hd`dwfkchdw`wcheq`ufjemfyaucdby`peectduezdhbu``",
+"`````tfadhag`v`iee`fcqfweefleyanaqfjazazebfg`g`qfu`hadcher`q`h`gazdwaibbap`lfw`waybxct`aagcbeueofn``",
+"````eoa`ffcbfididr`eaxeybzbhcgaqepdlbkckazeqds`qfueqfdblefeqdzchdg`wfheyamey`laibyalbiagdraodheheo``",
+"````at`ydhdh`dfsal`pfyalfyemeyey`waqdgazckepbkdw`qekepecfjdmejflazfj`ubw`lbiftaxee`beecbcbbcdu`ta```",
+"````a`a`a`ficbalcqeeauct`fcgdffyflejapds`wefdleradewegaaegeseqbr`lfl`u`megamamctfb`vfebc`deudceoat``",
+"``````eofffacb`abyftcbbybtfcanfwaidvapepap`wegazdzdlek`uerfgepdgfj`laqdncn`mbyfoct`p`vbgacezdhbu````",
+"```````yffdhfsficbeealbybxbiemcncnamflch`u`uccew`udgdlf``wdldbcgflanbweefycnaxeeacezfsdyfmdh`y`t````",
+"```````teoeiezajdcdc`ealeeai`jaxaiamcgavaiew`ucc`w`mandzanebflfcamfldvbiemdffw`pfeezcbdcbpeh`yeo````",
+"`````````tfffffmaoakdtalamfbdremfjamaiaidffraiddegdbfhancnbrdn`mamegfwaxfocgftct`x`efeezeifn`t``````",
+"````````ex`tehbeezdubydialcdaxcnbidndfbhfwbweydf`mandfcgdvananfyfofycncgcnaxfoacbg`e`pfadueiex``````",
+"```````````rbufndcajacfscbbycqfofodnaifhfyai`paxcnfweyddcg`pcgfwfofedifeaxbyalfs`j`kduehfmfm````````",
+"```````````yeifndhbefsao`vaxbxbxcsfebyfwbzfybidfcgbjfwaidnambibybzbx`afocdbc`vfidtezajbueha`````````",
+"`````````````y`r`rezduaocxficb`jfw`abz`jct`jdnfwbzfwdnaufofofw`afo`i`ddiducb`zdudcezdu`rex``````````",
+"``````````````evbudjfmajcbagbcctbcfwcgaufoct`afofb`afodf`jbzemfobx`dfe`val`xczdjbebpdccm````````````",
+"````````````````evcmezfneufsaoelcqcxctfeaufecsfectbxbzfeae`b`jdrc``b`x`ecb`zbpfmfmeiev``````````````",
+"``````````````````ffbubpfiafafbmbc`vag`bc`csdr`j`bct`jfefbcxcx`j`xdificxacbeenbfev`t````````````````",
+"````````````````````cmczczdy`zak`kcucucudrcuaecxc`cxdrcxaeelak`vc``jajakbpafbfbf`r``````````````````",
+"``````````````````````cmczbpdjdc`kcxelaoelakagbc`aaeel`bbxakakeu`zdtbm`zdjbpevbf````````````````````",
+"````````````````````````cmbfeibfbmeuel`kelelafelelakaeelaf`k`k`zdjbebm`zbncmah``````````````````````",
+"````````````````````````````czbnczbp`zafbmaedyafelbmdy`zdybeczdjczbf`kbpex``````````````````````````",
+"`````````````````````````````````sevdjbncz`zdj`sczcz`k`k`s`sdjbfahevbn``````````````````````````````",
+"``````````````````````````````````````evah`sbncz`kev`sbnczbnczah````````````````````````````````````",
+"````````````````````````````````````````````````````````````````````````````````````````````````````",
+"````````````````````````````````````````````````````````````````````````````````````````````````````"
+};
diff --git a/hacks/images/bubbles/jade.pov b/hacks/images/bubbles/jade.pov
new file mode 100644 (file)
index 0000000..7c1cb02
--- /dev/null
@@ -0,0 +1,24 @@
+#include "colors.inc"
+#include "shapes.inc"
+#include "textures.inc"
+
+/* The following make the field of view as wide as it is high
+ * Thus, you should have the -W and -H command line options
+ * equal to each other. */
+camera {
+        location <5.8, 0, 0>
+       up <0, 1, 0>
+       right <1, 0, 0>
+        look_at <0, 0, 0>
+}
+
+sphere {
+        <0,0,0>, 2.5
+       texture { Jade
+       scale <0.7, 0.7, 0.7> 
+       rotate y*clock }
+       finish { phong 0.4 }
+}
+
+light_source {<6, 1, 0> color White}
+light_source {<6.1, 1, 0> color White}
diff --git a/hacks/images/bubbles/jade1.xpm b/hacks/images/bubbles/jade1.xpm
new file mode 100644 (file)
index 0000000..2a13045
--- /dev/null
@@ -0,0 +1,75 @@
+/* XPM */
+static char *jade1[] = {
+/* width height ncolors chars_per_pixel */
+"10 10 58 2",
+/* colors */
+"`` c None",
+"`a c #69E169",
+"`b c #35CB35",
+"`c c #149914",
+"`d c #179317",
+"`e c #158B15",
+"`f c #148914",
+"`g c #148514",
+"`h c #0F890F",
+"`i c #0D830D",
+"`j c #0F730F",
+"`k c #0F6F0F",
+"`l c #0E6B0E",
+"`m c #077307",
+"`n c #0E630E",
+"`o c #0B630B",
+"`p c #026502",
+"`q c #046104",
+"`r c #0A550A",
+"`s c #0B530B",
+"`t c #065306",
+"`u c #054F05",
+"`v c #074B07",
+"`w c #064706",
+"`x c #003700",
+"`y c #042B04",
+"`z c #011901",
+"a` c #21B621",
+"aa c #1AAC1A",
+"ab c #18A818",
+"ac c #17A217",
+"ad c #189E18",
+"ae c #127C12",
+"af c #107C10",
+"ag c #0F7A0F",
+"ah c #0B800B",
+"ai c #0E720E",
+"aj c #0A760A",
+"ak c #106A10",
+"al c #0F6A0F",
+"am c #0A6E0A",
+"an c #0B620B",
+"ao c #0D580D",
+"ap c #076007",
+"aq c #045E04",
+"ar c #015E01",
+"as c #015201",
+"at c #034803",
+"au c #044604",
+"av c #083E08",
+"aw c #014601",
+"ax c #044004",
+"ay c #063606",
+"az c #052E05",
+"b` c #013401",
+"ba c #042404",
+"bb c #002600",
+"bc c #022002",
+/* pixels */
+"```````v`l`g`k`v````",
+"````an`gad`cajaqal``",
+"``az`f`hahah`parapao",
+"```wagac`m`aa`aa`o`x",
+"``ak`d`qai`babau`e`w",
+"``b`aeafat`u`ias`j`s",
+"``bc`n`kafam`jaw`xay",
+"````avaxau`t`r`n`z``",
+"```````ybbavazba````",
+"````````````````````"
+};
diff --git a/hacks/images/bubbles/jade10.xpm b/hacks/images/bubbles/jade10.xpm
new file mode 100644 (file)
index 0000000..e601fec
--- /dev/null
@@ -0,0 +1,259 @@
+/* XPM */
+static char *jade10[] = {
+/* width height ncolors chars_per_pixel */
+"60 60 192 2",
+/* colors */
+"`` c None",
+"`a c #69E169",
+"`b c #35CB35",
+"`c c #23BD23",
+"`d c #1CB11C",
+"`e c #1AA71A",
+"`f c #169D16",
+"`g c #179717",
+"`h c #149914",
+"`i c #179317",
+"`j c #139713",
+"`k c #149514",
+"`l c #1A8B1A",
+"`m c #159315",
+"`n c #129312",
+"`o c #158B15",
+"`p c #128D12",
+"`q c #148914",
+"`r c #158715",
+"`s c #148514",
+"`t c #0F890F",
+"`u c #128312",
+"`v c #0F870F",
+"`w c #0E850E",
+"`x c #108110",
+"`y c #0D830D",
+"`z c #0F7F0F",
+"a` c #127912",
+"aa c #137513",
+"ab c #107710",
+"ac c #0C7D0C",
+"ad c #0E750E",
+"ae c #0F730F",
+"af c #0F6F0F",
+"ag c #0F6D0F",
+"ah c #0E6B0E",
+"ai c #0E690E",
+"aj c #077307",
+"ak c #0F650F",
+"al c #0E630E",
+"am c #0B630B",
+"an c #0D5B0D",
+"ao c #0A5F0A",
+"ap c #036703",
+"aq c #0B570B",
+"ar c #075D07",
+"as c #026502",
+"at c #046104",
+"au c #0A550A",
+"av c #0B530B",
+"aw c #016101",
+"ax c #0C4F0C",
+"ay c #0A510A",
+"az c #025B02",
+"b` c #094F09",
+"ba c #045704",
+"bb c #0A4D0A",
+"bc c #065306",
+"bd c #0A4B0A",
+"be c #065106",
+"bf c #015901",
+"bg c #074D07",
+"bh c #054F05",
+"bi c #074B07",
+"bj c #084908",
+"bk c #094709",
+"bl c #084508",
+"bm c #064706",
+"bn c #014F01",
+"bo c #004B00",
+"bp c #063D06",
+"bq c #063B06",
+"br c #073907",
+"bs c #033D03",
+"bt c #004100",
+"bu c #013F01",
+"bv c #033B03",
+"bw c #053505",
+"bx c #003D00",
+"by c #063306",
+"bz c #053105",
+"c` c #023502",
+"ca c #003700",
+"cb c #042B04",
+"cc c #042904",
+"cd c #012301",
+"ce c #022102",
+"cf c #011D01",
+"cg c #021B02",
+"ch c #011901",
+"ci c #011701",
+"cj c #011501",
+"ck c #011301",
+"cl c #010D01",
+"cm c #21B621",
+"cn c #1CB41C",
+"co c #22AA22",
+"cp c #1AAC1A",
+"cq c #18A818",
+"cr c #1F9C1F",
+"cs c white",
+"ct c #18A418",
+"cu c #17A217",
+"cv c #189E18",
+"cw c #189A18",
+"cx c #149C14",
+"cy c #149014",
+"cz c #119011",
+"d` c #128A12",
+"da c #0F8C0F",
+"db c #128612",
+"dc c #148214",
+"dd c #138013",
+"de c #127E12",
+"df c #127C12",
+"dg c #107C10",
+"dh c #0F7A0F",
+"di c #0B800B",
+"dj c #0E780E",
+"dk c #0B7C0B",
+"dl c #117211",
+"dm c #0A7A0A",
+"dn c #0E720E",
+"do c #0A780A",
+"dp c #0A760A",
+"dq c #106A10",
+"dr c #0B720B",
+"ds c #0F6A0F",
+"dt c #0A700A",
+"du c #0A6E0A",
+"dv c #0B6C0B",
+"dw c #0A6A0A",
+"dx c #0B680B",
+"dy c #067006",
+"dz c #0C660C",
+"e` c #0A660A",
+"ea c #056E05",
+"eb c #056C05",
+"ec c #0B620B",
+"ed c #0C600C",
+"ee c #0D5E0D",
+"ef c #056A05",
+"eg c #066806",
+"eh c #076407",
+"ei c #0D580D",
+"ej c #0A5C0A",
+"ek c #076007",
+"el c #046404",
+"em c #0A5A0A",
+"en c #075A07",
+"eo c #085808",
+"ep c #045E04",
+"eq c #095409",
+"er c #015E01",
+"es c #055605",
+"et c #055405",
+"eu c #015601",
+"ev c #015401",
+"ew c #035003",
+"ex c #015201",
+"ey c #034C03",
+"ez c #034A03",
+"f` c #B1FFB1",
+"fa c #074207",
+"fb c #034803",
+"fc c #044604",
+"fd c #074007",
+"fe c #083E08",
+"ff c #014601",
+"fg c #024402",
+"fh c #034203",
+"fi c #044004",
+"fj c #053805",
+"fk c #063606",
+"fl c #013A01",
+"fm c #023802",
+"fn c #052E05",
+"fo c #013401",
+"fp c #013201",
+"fq c #042C04",
+"fr c #013001",
+"fs c #012E01",
+"ft c #012C01",
+"fu c #042604",
+"fv c #012A01",
+"fw c #022802",
+"fx c #042404",
+"fy c #002600",
+"fz c #022002",
+"g` c #011E01",
+"ga c #001000",
+"gb c #000A00",
+/* pixels */
+"````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````",
+"````````````````````````````````````````````````fwbdftaxbdbqavfjc`bkfvfycc``````````````````````````````````````````````",
+"``````````````````````````````````````````fnfjbpfaeefofrftaqbubifhbdbmfibkanfdfj````````````````````````````````````````",
+"````````````````````````````````````byfvfofidqaldqdqafa`a`bcfraoagafbubcbianeifafdfrce``````````````````````````````````",
+"````````````````````````````````byfraybjalfrbxfga`aidlenenffbsb`fffbeyddecaqbedlcafpbpbdby``````````````````````````````",
+"``````````````````````````````feeianbiezagbtakeyah`rdedge`bo`sfobndfffenafesffembsbubib`fofk````````````````````````````",
+"``````````````````````````bybqbjbmbxeqejenendde`addh`oadafbibobnbmboekbabne`dxffeyeybeagdqaqbkfq````````````````````````",
+"````````````````````````fwftaneebuedamaoenabdhdb`q`qdr`q`iaiejagbf`qcabaflbaekdgdceteoejbeayavfabz``````````````````````",
+"``````````````````````fkbqfialdsbtetdv`uduad`qdrdpcw`o`zazafcwcy`qdnevdpekcyahaeenar`rfrakakfdfifafw````````````````````",
+"````````````````````brbpb`emaafia``rdg`i`o`zcw`zdjcwct`w`oe`dodpaodnduelegexbfamaoaubaemakfgeyfybibqfv``````````````````",
+"``````````````````fec`bbaledfma`af`saddj`uehdbcv`ed`aj`fcpdp`madegerbx`oeldpd`d`dt`sev`rboa`dlafcacabkfw````````````````",
+"````````````````fwbkaydqecb`dcdv`rdc`scwexdp`g`ecvawdxdber`y`hctdiawdgfbdpduegcy`pdwepbodfenemaldsbmbmbqfn``````````````",
+"``````````````cffafralfjc`dnecaqaddb`x`zevatdp`vacfgeyerelfgetda`fdyaw`u`n`pdmd`cwdbexeqboa`ffeta`affhfmbzfn````````````",
+"``````````````fwfmeeemedaadca`eoepdrcvcvegeuebdoajefdhcncmeyetdicndocye`as`tcp`f`vcw`eeuaiflewaiffdldlayeife````````````",
+"````````````feavfieeaaeyfr`sdeexdwcvcu`meldk`fct`dcudidyamcyar`ycuct`tesdvea`eefdodp`e`peubearbobibhageeb`fvcd``````````",
+"``````````fxcdbdandlffesboek`xemdb`pdkbfel`k`dcncpajcmefewdjapdmefea`f`jcz`h`hdycydtd`cwegepfcfmdfaragemalbdbkch````````",
+"``````````fwbqbjakagenewencyad`gdrazeraccucpcpcncu`zdharap`kasdo`ndiap`k`dcuajcncpcwepdkcycydtdgdwafdlbcedeeblcc````````",
+"````````fxfrfnayeqbceyes`qekatexfldu`tcpdo`y`hcudiades`hewdmdicp`ccn`wapasaw`ges`xbherbxdbcy`idbekdlesa`dqaleibwcg``````",
+"````````fnfpeefhfbafalbodeehdwdder`p`e`yaddodicndkefcqcxdacq`c`d`ccz`h`eescme`drene`eaelfhegegdwedalewagauemavaxcc``````",
+"````````brbzakeebceyfcek`o`odhbief`k`ediapajcncx`fdict`ccucqcncm`ccx`tdr`ed`ardyebdpazegdgcvateoekaeenagedakeifdg```````",
+"``````cebdeieeala`alewekdrdrdbegeg`k`fcpdacmctdid`czczcn`ddacucm`c`cajasdmdmawdyea`fczacazcvexfgbnaraba`ameoeiblfech````",
+"``````byfjfadqfgauej`redaebnex`m`f`vczcxcpdadaawea`neadp`e`r`lcrcmcvdyefcncxajcydydyczdicwepcacabsbaabdea`ezb`bbbwfw````",
+"``````cdfebdakfgezet`s`u`z`uepeg`fcpctcpcqcq`teydmczdpa`coco`b`baacm`rdicmcn`jef`majascpdjbf`o`gemfhdddfddeobibsfefw````",
+"````cjbwfsbmbmbubh`rbodhdh`iegctefcwcucucncpcpdhaj`yabco`b`a`a`a`a`lcodpcmcqczdicp`ecpcvdb`efgehambmabdxaiemcabkbqfqga``",
+"````g`blblfifhdqbcfiba`qdhcw`xfbcwefacdydacncqeacmd`co`b`af`f`f``acocrcwcq`ccxeaef`merajegbxe`a``iba`renecemdqeibrchcc``",
+"````fxbqbdaneefgecffeydu`q`i`iepcpame`awdkcpcpar`ycm`b`a`af`f`f``a`b`l`e`ccn`jasdieady`pacatahcabuai`rewecfgdlcabqbqby``",
+"````cibkaxfianfafgffaie`cycwcvefelajdbbtawcz`jaw`t`e`b`a`af`csf``a`b`ldh`w`nasap`yczdpcw`kacahbcboba`odnbhbualalc`brg```",
+"````g`bkavbvb`bceebvetewekdh`xd`dp`kaccycydocncvdacvco`b`af`f`f``a`bcralapef`fcy`w`ycz`gcw`zazdb`qe``r`rfgfcdqakcdfefn``",
+"````fnfybqanfhbebhafenew`ibadu`wdp`k`wfbapdacparczcm`c`b`b`a`a`acocraed`cucpcpdoer`ydpdp`m`mcy`xbadca`dfdfecauavfafycc``",
+"````fzfvfdaudqbgecbcenbo`iaeeueheuelatefczcncuacdncu`cco`lcr`b`b`l`lcrczcq`wdkcpdpdhfcflducweh`i`oabdcdlemeqbmaqeichfn``",
+"````cbfrfjblfcagbxbha`dnarbobnehdxfbaz`kcv`fda`een`jcn`ddvdldlaecrdraoczcq`f`y`d`ndoac`eelcydhadardv`rdlejeqavbjbbbyfu``",
+"````fxbrbqbsfifhaifbah`oddduehdgcyeoeg`gcucvajdv`t`e`hcpdmcm`d`vajeo`ddy`n`ecx`dcv`f`meu`e`g`z`g`qdcahaheyedb`fmbdcdfx``",
+"````fncdfkbdb`bmafezdn`rdedn`xdueubu`o`ycw`fdidj`hcpct`deaen`udk`j`yefelebcz`dcpd``fac`edcbnex`i`sa`aea`beemaufpbwfuch``",
+"````cjfnfteib`c`ejecaoa`ad`idbbaeuaideazdkcv`pazdp`d`d`tdyasefcucn`fdibfbfcwdoct`p`wdpeuexameh`o`sendcaialakalc`bkfecf``",
+"````ckceftaxbsaqaldlejagde`uehepepbgexeg`e`wacerbfdmdi`dasapdpcvcpcueben`tdpfcdtdpdwdtekbcfidcada`aeabagakakaqbqfwbyfz``",
+"````clg`bzfafoblemdldzdfdfecfiexbnfcdg`icvegd`eufbat`ierct`ubhat`wdydvcp`y`kacfbelegexfibgexbodxaeabaabhfcayavfdcgfzck``",
+"``````fxfwbdfdfjfceedldzamboeqbebmbebhcvducy`gdregeuegdkaccyer`eaceladdgel`x`zevazcveoezboboe``raiddaibgfdfdbvbdcjfx````",
+"``````fxcdblfafofjbgdlbcbcaufrbsfidlexeu`q`icv`g`kcwcw`gcwegcwdeeodedhfgbu`iexatdudrbnbobadddgaeffbhaoeeakbdbrbdcjfz````",
+"``````ckfzfqfabpbjcaedakemakeya`abewdjardjcydbehdwdreg`ictdbdrdebu`gcteldwabepdu`i`xdgdr`re`dveyalb`anaubzfofwfyfnck````",
+"````````g`cccfbpbjfmbiaifceeakfieddcekdg`q`s`gdgdudrdrcwcvcvcweuflembudh`udtdv`gdwendne`ekesbtedaqavflflbdblbdcdch``````",
+"````````fzcecfbpcbfiaveeaufbeebheyetewdddn`u`q`i`odb`i`gcwcvdjehdgbgepdudwep`udjbafffhagedaaedafbmdqflc`fjfncdcfcg``````",
+"````````clcffzblcdbvfobsaldlbsecabddaf`odne`esbadgdr`x`o`ocwdudbdgekehbaaeeqdj`rdga`ffafbheoaadlcaftbdfmbkfzfkfxgb``````",
+"``````````fxcbfkfsc`frbmeibic`bedlabdzdcaeareyfiardvdnduaddge`dg`sduehboa`eje``r`rendleoaiaaaiakavfifnftfkfkcecj````````",
+"``````````gbfxfnfebpeibveiakflanfgejafdldxetbob`ardvdedv`o`oabene`dxekbnboaodfaebebibca`eqeqakdqeebsfqfvfwfwfxcl````````",
+"````````````clfxcdfkbwfwanbjavflfaafeya`agafeyddarah`se`aedeababdxenaoewdn`samdldsbcafejaibgdqalaqc`fqbrg`ceci``````````",
+"``````````````fxfubybkfsfjanayaubibubxdldsaidzaodfabafaoe`a`dddxe`fbewe`aea`anbcaodzagdqeedqaqeiaxftbwfwcech````````````",
+"``````````````gbfucgbzfebybpeieeaqfhdqeeakeqaiemdsdzeoaidcezecbhaidzeoemafecb`aaakagaqayaqb`blbkbdblfkcffzgb````````````",
+"````````````````gbcgfxbyfefjaxeieeayfiflfrbjeebxfcdsbxezagbxbcememeyaobhaubcbeakedaqalb`eiblavfrchccfzfzcj``````````````",
+"``````````````````clcgcjccbwaxavfaaqeeeib`fiblaybiemfgfhblblbdfcfhembeemdlbbdqaueianfableibdfrfvcbcccccj````````````````",
+"````````````````````gbfubzfnbrbkbpc`fpbpbvfjcafhakayavakflbmakbdbidqeefccabiakavbvfrbqblblfefqcbbzfxcj``````````````````",
+"``````````````````````gbcgcgg`fwfefvbkbdaxfmanfpalaycafaaudqalfob`bifmaxaqaneibdfrbqbkbkfeccbybyfxck````````````````````",
+"````````````````````````clcgcgfnfwfqfvfabwc`bqeiblbsfeavbvbsfrbvanbbfabzeiblc`bwbwbpfafeccg`fxfxcl``````````````````````",
+"``````````````````````````gbckchcfccbrbyfkbdfjbkfabpbrfkcdbveiaxaxbbfafdbwfefvfvfwbrfefkcffzcgcl````````````````````````",
+"``````````````````````````````gagafzcbfnbrfkfkfyfybzfebkbdbdfefefvbkfubzfnfnbzfebrfqfxfxcgck````````````````````````````",
+"````````````````````````````````gbclckfxfnbyfnfwfwbzfqfkfqcdfnfqchfucgbrccfnfwfncccjcgcjgb``````````````````````````````",
+"````````````````````````````````````clclcjcjcjckgaccfxcdcdcecicfcgfzcgcefufncefzckclgb``````````````````````````````````",
+"``````````````````````````````````````````clgacjcjcgcjcjcjgachcjfzcgfzfxfzckgacl````````````````````````````````````````",
+"````````````````````````````````````````````````clgbclckckcjcigackgaclgbgb``````````````````````````````````````````````",
+"````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````",
+"````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````"
+};
diff --git a/hacks/images/bubbles/jade11.xpm b/hacks/images/bubbles/jade11.xpm
new file mode 100644 (file)
index 0000000..a556fe2
--- /dev/null
@@ -0,0 +1,271 @@
+/* XPM */
+static char *jade11[] = {
+/* width height ncolors chars_per_pixel */
+"72 72 192 2",
+/* colors */
+"`` c None",
+"`a c #69E169",
+"`b c #35CB35",
+"`c c #23BD23",
+"`d c #1CB11C",
+"`e c #1AA71A",
+"`f c #169D16",
+"`g c #179717",
+"`h c #149914",
+"`i c #179317",
+"`j c #139713",
+"`k c #149514",
+"`l c #1A8B1A",
+"`m c #159315",
+"`n c #129312",
+"`o c #158B15",
+"`p c #128D12",
+"`q c #148914",
+"`r c #158715",
+"`s c #148514",
+"`t c #0F890F",
+"`u c #128312",
+"`v c #0F870F",
+"`w c #0E850E",
+"`x c #108110",
+"`y c #0D830D",
+"`z c #0F7F0F",
+"a` c #127912",
+"aa c #137513",
+"ab c #107710",
+"ac c #0C7D0C",
+"ad c #0E750E",
+"ae c #0F730F",
+"af c #0F6F0F",
+"ag c #0F6D0F",
+"ah c #0E6B0E",
+"ai c #0E690E",
+"aj c #077307",
+"ak c #0F650F",
+"al c #0E630E",
+"am c #0B630B",
+"an c #0D5B0D",
+"ao c #0A5F0A",
+"ap c #036703",
+"aq c #0B570B",
+"ar c #075D07",
+"as c #026502",
+"at c #046104",
+"au c #0A550A",
+"av c #0B530B",
+"aw c #016101",
+"ax c #0C4F0C",
+"ay c #0A510A",
+"az c #025B02",
+"b` c #094F09",
+"ba c #045704",
+"bb c #0A4D0A",
+"bc c #065306",
+"bd c #0A4B0A",
+"be c #065106",
+"bf c #015901",
+"bg c #074D07",
+"bh c #054F05",
+"bi c #074B07",
+"bj c #084908",
+"bk c #094709",
+"bl c #084508",
+"bm c #064706",
+"bn c #014F01",
+"bo c #004B00",
+"bp c #063D06",
+"bq c #063B06",
+"br c #073907",
+"bs c #033D03",
+"bt c #004100",
+"bu c #013F01",
+"bv c #033B03",
+"bw c #053505",
+"bx c #003D00",
+"by c #063306",
+"bz c #053105",
+"c` c #023502",
+"ca c #003700",
+"cb c #042B04",
+"cc c #042904",
+"cd c #012301",
+"ce c #022102",
+"cf c #011D01",
+"cg c #021B02",
+"ch c #011901",
+"ci c #011701",
+"cj c #011501",
+"ck c #011301",
+"cl c #010D01",
+"cm c #21B621",
+"cn c #1CB41C",
+"co c #22AA22",
+"cp c #1AAC1A",
+"cq c #18A818",
+"cr c #1F9C1F",
+"cs c white",
+"ct c #18A418",
+"cu c #17A217",
+"cv c #189E18",
+"cw c #189A18",
+"cx c #149C14",
+"cy c #149014",
+"cz c #119011",
+"d` c #128A12",
+"da c #0F8C0F",
+"db c #128612",
+"dc c #148214",
+"dd c #138013",
+"de c #127E12",
+"df c #127C12",
+"dg c #107C10",
+"dh c #0F7A0F",
+"di c #0B800B",
+"dj c #0E780E",
+"dk c #0B7C0B",
+"dl c #117211",
+"dm c #0A7A0A",
+"dn c #0E720E",
+"do c #0A780A",
+"dp c #0A760A",
+"dq c #106A10",
+"dr c #0B720B",
+"ds c #0F6A0F",
+"dt c #0A700A",
+"du c #0A6E0A",
+"dv c #0B6C0B",
+"dw c #0A6A0A",
+"dx c #0B680B",
+"dy c #067006",
+"dz c #0C660C",
+"e` c #0A660A",
+"ea c #056E05",
+"eb c #056C05",
+"ec c #0B620B",
+"ed c #0C600C",
+"ee c #0D5E0D",
+"ef c #056A05",
+"eg c #066806",
+"eh c #076407",
+"ei c #0D580D",
+"ej c #0A5C0A",
+"ek c #076007",
+"el c #046404",
+"em c #0A5A0A",
+"en c #075A07",
+"eo c #085808",
+"ep c #045E04",
+"eq c #095409",
+"er c #015E01",
+"es c #055605",
+"et c #055405",
+"eu c #015601",
+"ev c #015401",
+"ew c #035003",
+"ex c #015201",
+"ey c #034C03",
+"ez c #034A03",
+"f` c #B1FFB1",
+"fa c #074207",
+"fb c #034803",
+"fc c #044604",
+"fd c #074007",
+"fe c #083E08",
+"ff c #014601",
+"fg c #024402",
+"fh c #034203",
+"fi c #044004",
+"fj c #053805",
+"fk c #063606",
+"fl c #013A01",
+"fm c #023802",
+"fn c #052E05",
+"fo c #013401",
+"fp c #013201",
+"fq c #042C04",
+"fr c #013001",
+"fs c #012E01",
+"ft c #012C01",
+"fu c #042604",
+"fv c #012A01",
+"fw c #022802",
+"fx c #042404",
+"fy c #002600",
+"fz c #022002",
+"g` c #011E01",
+"ga c #001000",
+"gb c #000A00",
+/* pixels */
+"````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````",
+"``````````````````````````````````````````````````````````````brfebwfabdfafvbwbqfqbr````````````````````````````````````````````````````````````",
+"``````````````````````````````````````````````````````feblaxfnfofjbkfaaqeibmfiavblavblbdbwfk````````````````````````````````````````````````````",
+"````````````````````````````````````````````````fnfrftfpbjalavfcdqfjbmakedagafakbmfcaqbsfyanavaxbz``````````````````````````````````````````````",
+"````````````````````````````````````````````ftbqfmbjanakalaldldlaaafemaqbtfbafagdlfhflbufvalbpfwc`frft``````````````````````````````````````````",
+"````````````````````````````````````````fvbdbdbmalfyb`bhfgdqaianeydzesa`bsbvdlbheyesddafbjezaufhcaakbwbbbl``````````````````````````````````````",
+"````````````````````````````````````cebkanalbgbmedfbfsfbbeah`rdcdf`samdlbncaewbofh`raraeaeaveoejfdfcbmavanfkcb``````````````````````````````````",
+"``````````````````````````````````bravayfcbialaaeoa`eyesecdvdedxdnen`oedfcaieobedle`ekabarambjemfmbifbdqdqanfabz````````````````````````````````",
+"``````````````````````````````fwfaaxfmeefyejemaoamenewardv`qcydbdbadafafepexemfhex`oca`oenad`odndcddddaaafdqeefafvfk````````````````````````````",
+"````````````````````````````fqftayfidqb`eoecetarde`i`i`g`o`u`idb`idpdgdgdzejexatepafeudfbhddevdnabaoc`anbcfgbubdaycdfk``````````````````````````",
+"``````````````````````````fkbdcabldqaiafece`dg`idrad`q`uegdr`id``xegad`qategfgfh`ieudtdu`gflaoahewbafi`sftaybxbubbfifqfy````````````````````````",
+"````````````````````````brbdbsaueqdlfiaeddaedg`i`o`x`o`mdudpcwcwcyege``xdodperdnbfegelegevbfbnejaobibaekfffffgeyfhanbvfjfv``````````````````````",
+"``````````````````````fefacaakeqalaudcah`r`idg`q`xdudrcv`m`e`tdk`k`ed`erarcyeneabfameudteg`wdbdbdudeedevaoewfibtbxfleeavaxfe````````````````````",
+"````````````````````ccblfadqaqeoeedcecewbofoa`ddbiegac`ecpcydpbfatap`yctcpdkefdp`dbce`ategeg`v`i`iduekbaaien`rbiauejbgfab`fjfn``````````````````",
+"``````````````````ccbkavfiembeaiaedfbnbndtdu`zdoeueldpcw`n`h`xeren`z`derelda`ddkd`erbx`y`pacac`gctdjepfcafba`saqffecaabgfvbqbwci````````````````",
+"``````````````````fxeifmakbxalbtahffbodj`u`xcycyazbfebdpajapdgaodhapcnaddvapcpcucnasaodk`k`pcycp`kctdtbffhfobnfretendlafbmfefwbr````````````````",
+"````````````````fwblfoanakdzeyaoekboemeudjcyct`gdycwebacdmacdpcn`uascwekdrajcpczdy`edxd``wct`dd`dk`gctdhdeaedlba`oaibtdldqakbkfvfy``````````````",
+"``````````````ccfyfdeiemaabhejekdudgexatcycv`gd`eldpcv`jcpcqcudidyawe``uardmczcp`f`wesdhcn`nczegdodtcw`wdjexbebabnflfraoagedakbzfjfn````````````",
+"``````````````fefdbmaldlbhbtfme`dgdjbidrcy`mdo`ibf`n`dcncn`daj`z`eetd`ezapdmajeadkcndadi`w`e`tbferaj`wcwd`dubafcdc`rdvaoaieqdqbbfdfe````````````",
+"````````````cebzblayakdsbcbcboardhdjexd`docvfger`h`dcncpcn`fas`kapasaw`p`dehapasawad`w`d`d`f`tap`ecpajdk`mdj`zbaendgabdedlbcdqanayblg```````````",
+"````````````brbpavauedamdzeye``oadepadatcweb`pcu`f`hcq`fcm`yeydjcue`cvas`m`ycucncxdoawasea`wapad`ueycyesdrcwcw`o`q`iesdxafecauananfafe``````````",
+"``````````cfbwfjeebmbeeoagff`se`ehexep`sdpcy`dcxerajdmdacpeaeyapead``ddacxcq`c`c`j`yasdrasd`ffdv`ddjer`oendp`z`xadddboaiesdlafdqanbdfece````````",
+"``````````fefaanfceqeoaiaia``odrehegdxafac`f`ddp`qdoeacpcueaefcxcpcqcxcp`c`d`ccu`j`jcyewdvenffdrbtaoeldybfeyepegbabaembseya`ememakavaxfq````````",
+"````````fzccbzeeeqeebhbtfcba`rcyd`djbieucy`ecvajapdo`f`ndabtdicx`ccn`jcqcncn`ccn`w`wdr`fcmd``udyebdobfajeffccvepeuepbobnendcejemalavfdcech``````",
+"````````fnfabdanakbefgbteybadhdh`x`geueu`tcu`e`hdkcp`dcudyasdacxcu`c`j`p`fcp`ccmcqebaseaajeaad`wajcx`kdodmahaz`odzbnboehdnabahecdqbmbkfvfz``````",
+"````````ccbdfaaledfbaqdcbnbna`bueoegct`pcy`y`fcpcq`f`hczenaj`tdida`d`i`r`r`e`ccm`feb`k`ncqdaaraserdoda`ydyddeladeccafoe`a`dddfedbmdqeifdfn``````",
+"``````fxfvfrfaakbmfbauezfmboekdrepeodr`ecv`hcxctcncudiea`mdm`fdicmcrcrcr`bcrcr`r`z`rea`dcncxdo`eapebaj`yazeyelamde`ibiboa``ra`dlflbiaybqfyg`````",
+"``````fxfac`bbakbxfbbheneodedb`z`zexbfd`cv`ectcncncqcueaasaj`wdj`bcoco`bcr`a`a`l`raadicm`ccnczaw`zapapctdveoazfgeuafeoejdgabaea`bmfcbzfqfvch````",
+"``````cbbqbjfib`bubiejbmetdv`zdjcvepcyeaacct`d`ncncncndmareaaca`cr`b`a`a`a`a`bcr`leiaccmcpcqdidk`ednbfey`eeueubuatepezaiabaedzembgfpbdbrfvcd````",
+"``````fnbweifibgbufaeyagba`q`u`icwdrfbdjerdy`tajdacmcqcxawapd`co`b`a`af`f`f``a`bcrcocwcu`ccn`yefefcucnerdyegbxahfhem`iev`rendzemfbbkeiblccfw````",
+"````cgg`bdbdalb`ezfgamffewdh`i`g`od`euazbeafbfapdicqcn`wbh`wcm`b`b`af`f`csf`f``a`b`bcocn`ccp`tcndmapajdy`wdpazfl`ubueoae`sesecaobheeeifrbqfyck``",
+"````fzbybkanbmeeflbtejffewen`gcw`i`idpelbfe`ad`meaczcmeaaj`jco`b`a`af`f`f`f`f``a`acrdbcvcpczdyasdi`ydy`tcv`pdpflbhexddekdddxeoemeqeqaufwaxfecg``",
+"````cgbrfjanbseqbuftftemffendu`ucw`o`zebacd`efcpenajcqdyaj`pcv`c`a`af`f`f`f``a`a`ldq`celawardhefdk`k`f`k`md`dudcbnehenardc`sbhfgejaleefaaxfqfx``",
+"````cgbzftbdfobdembeaieqekbaexdjepdhcyacd``edpbt`mdm`najdo`j`eco`b`b`a`af``a`a`bcocrdudy`naccpd``wdo`h`gcvcvdpegdhdb`ie`dddcaheyfcakaqfdfjfqch``",
+"````g`cbfqfwfmbueqbcbhfaenaragbobaduacdudk`kelardydacx`j`p`hcm`c`b`bco`a`a`a`b`b`ldj`p`ncq`f`j`ycydpdpazeg`pcw`g`zbnekdcdeabdlagakayavayfafefz``",
+"````ccbzftbpauakaueyaoeyenewboam`iepehbfeuegafdycz`dcu`najascu`c`ccr`lcr`b`bcr`lcrducz`fcxdi`tcndp`dbxenecdocwduepa`badddcaiaiagfhfhaqanfkfecc``",
+"````fxbrfrfdbdbiakbcbcetabafbaboageuepdzeodnat`h`hcu`kdias`q`ncn`cdbafa`aa`ccobdegeb`n`fcpdmcz`d`jdpaceadnegcvdhduekesdx`sabaiecfcbkavaxfkfqfx``",
+"````cibzftfdfofibiafa`eydd`rdvdvepepdu`iev`odk`e`e`ncxefaodk`hctcucvegcmegdbdw`o`idwajczcq`kcp`dcv`n`vcyezazehcy`qdb`uaddxaheoaub`bsfmbkbzbyfx``",
+"````cjfqbrc`fabmbseebhfgaodc`sdhdv`zdhbf`iazel`e`e`d`perdmctcp`hcpctdpcmejdk`pdycnelapdi`hcp`e`dcvcv`pdtdxamfbex`q`oddaeafafeoemalbmbvfrbwfkci``",
+"````gaccfwfneibjfcauamfgag`rad`o`odjdwbfezdbbfac`k`k`e`ycwcu`dcpctcz`dfgdbdp`n`ndaapefcvapcpcpcp`pcw`vdpen`gdc`r`o`s`oahaga`aieqakeiavfrfwbrcj``",
+"````gag`fefeaxaybmfcaiecaoa`a``o`idebabaeqdgeobfdp`k`fdpffdicvcp`yapdpaseacu`d`ecxajctercvcv`y`e`v`xdodw`i`oejba`s`sabamdfaidlakdqb`bvaxcebzga``",
+"``````fzfnaxaxb`cdbxema`ejaeab`rdnekepepaheuepat`edk`felcweldm`yer`uefefdp`jcn`dczapendi`tbfdh`zdpatdudtcwdnfieoen`rabdfabdlageealbjbqfrcfce````",
+"``````fufeg`fafacafieeaaecdedc`rbo`rbabnah`gexazafep`eegbfflebaterbfcwbfeneldi`kaze`cv`y`n`pepbhdududwbu`sbgevdden`saba`a`ecbgbgayanfdfycjg`````",
+"``````cgbyfeaxfdbqblbgdlaaama`dfafafedbgflcafcaiat`xcwaceg`gfgctatatazcwerbhdkacbfdbcyegd`cyegbxfbaeflbebuboboewdxdeaeaidlbicafjbmblaxfwg`cg````",
+"``````clfxbyfjbdfmfyfhalafeoenbtb`ffbgfmfobmexba`z`icv`vdodod``mdk`vdpateuddeleuerejafadazdoduexehekbndfdebodvafdeahbcafalalakbbavfsbdccfuga````",
+"````````fucbfnaxaxcabdfcdleoeoa`bmb`fofodlbababadgcv`gcycycvd`ac`ect`gdt`e`qbcdvae`iamcyemfh`regdr`ue`arbadw`r`ra`fbfbfcakalakcabqbdbkfxcf``````",
+"````````fxcbfnc`bbfpbscaemdsalbtfgffddagboe`duekdg`gcwdhepdwdrep`pcv`ed`doexeoaoeufbegdreheodudrcyad`o`sdg`ramaobhbpb`bbaqaqfwfrbrcfbrfqfz``````",
+"````````cichccfkaxfsavfdbidlbcbxdsb`fieddcbodnde`q`z`idbaddrdrdrcycvcwcvcwatbufgecemdhdbdre``x`odwexdve`afenesfaemeyc`faflbsbjeifvfecdccga``````",
+"``````````cgcdfkbkbkfrbsanaleeezdqbteyeyewffe`deab`s`icwdb`xdh`i`icwcvcwdhdr`ueqbeekduehe`ducyehen`oeyb`ewfmaybhaaeoakcacafveibvbyfncfch````````",
+"``````````ckcig`fefrccbsalfidqfgdqaqeoaiafaoaf`rdnehdvdwdj`qdhdbcw`i`g`gdjdrdrbabaepexaieqex`udedvewa`bsc`fgbhdldlaibpflfrfmfjbkg`brgacg````````",
+"````````````fzcdfeblg`bvfrbsbieqflb`ema`dfabdcdcahamarbsaiepdwdjdg`u`i`odr`q`o`xe`ehexahafen`o`o`saoaabmeyejaoafafeqfcbseic`fvbyfncccg``````````",
+"````````````gafubybrbrfjc`caayakbgfrfbaiaadlecdcafenboafffbaekduekdv`s`udvehadadeke`bodlfhesab`rdeetagbhecaaakejeeanb`fpfrbdfsbkbrfzcg``````````",
+"``````````````fxcefqfebqfvaveiaqaleeauavfbaidla`dzeneyfiffendx`rdnab`q`idharekdndnenenewecdn`recbtbjbhdfaieqaualdqakaqfmfqfebzfqcjfz````````````",
+"``````````````cjchfxbzfjbwblbjavbgb`fleebjdqemdeagaebca`ffarah`sdne`dea`abdedvamararewafdeaeeobvdsbhaaamemakbgeeeialavftfqbzfwchcjga````````````",
+"````````````````cifubybybdfsfteieibjb`bsfhfyezafdsedemejamdlababdxecaedf`rahafar`rbhecafaedzbmeybcaadldldldqakakaneifdfvfqfkcffxcg``````````````",
+"``````````````````fxcccdfefefwfjeieialaqb`avbgdldlafaaagafdeafaoafamaresameyesafbceoaoamagbheyaaaidsalemauakeibmbjblfabqfefzcecj````````````````",
+"``````````````````gbcegaccfefvcdfaeianavanflbqcafhbueqbgeyemaibcbhfgfmdeaoaiaiamaiedbcejemfabeakededdqaqbvaqbjaxbdfjfjfkcecccgcl````````````````",
+"````````````````````clfzfxfwfefvfaavavbkavauavfidqbxfabkc`ejembgfbafc`bteybhfbdlbcecfbakejbqdlananayb`alb`eifaaxbwfyfycig`fxcj``````````````````",
+"``````````````````````clcjfzfwbzfkbdaxfdbkayeeavayfob`bqbpeeejfcbufhfabxbqbxbueqemb`eddqalauemaueianbsbdfaaxaxbzfvcbfnfnfuci````````````````````",
+"````````````````````````gbcgfzfkfebrbkfabqfrc`fibvbdfofibiakaydqbqfcbxbiakfsfheqakaqfcflfhanakb`bvfrbyfmaxbkfecdfqbyccfxcj``````````````````````",
+"``````````````````````````ckcjcccifqcbfwfjfvfrc`g`bvfdfrbsakbgfmfjfheedqdqfhfldqb`bvcdbianeeanblblfofdbdfdfefzbybycccgcl````````````````````````",
+"````````````````````````````clfxcicccefnfwchfrfrftc`blfmeiavblbsfvbsbbayfabdfaanavbseebjbsblfabdaxaxblbkfeccfucffxfzgb``````````````````````````",
+"``````````````````````````````gbcicicbfqcdbyblbqbdfdfebdavfofrbdaxfrfwbzaxblaneiaxfafrfjfsftfrfvfvbwfefeccfzccfxcgcl````````````````````````````",
+"``````````````````````````````````gackcgcgfxbrbybrfafkbwbqaxaxfabrfwfpbdbkbqbkbkblbqfafvcffyfyfnbyfkfececfcjfzcj````````````````````````````````",
+"````````````````````````````````````gbgacjfxbyccbzfebzfvccfvfwbqbkblbqblbqbqfsfkfybrbzfwfyfqbrfebrfucjchcgcjcl``````````````````````````````````",
+"````````````````````````````````````````clgbcgfxfnbyfqfqfwccbzcbbybyfyfwfnbzbzcfchfxbrfwbzcdfncccccjcjcjcl``````````````````````````````````````",
+"````````````````````````````````````````````clcifzcichckcgcbccfuccfwcbg`cecfbrfncefzfubybzcbchchgagacl``````````````````````````````````````````",
+"````````````````````````````````````````````````gbclcgchckfxcjchchcccifxckgachcicjchfzfufxcjgaclgb``````````````````````````````````````````````",
+"``````````````````````````````````````````````````````clclckcggacicicjcgcgcjcgcgcgcgckcjclgb````````````````````````````````````````````````````",
+"``````````````````````````````````````````````````````````````clgbgbgbgbgbclgbgbclgb````````````````````````````````````````````````````````````",
+"````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````",
+"````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````````"
+};
diff --git a/hacks/images/bubbles/jade2.xpm b/hacks/images/bubbles/jade2.xpm
new file mode 100644 (file)
index 0000000..b070304
--- /dev/null
@@ -0,0 +1,95 @@
+/* XPM */
+static char *jade2[] = {
+/* width height ncolors chars_per_pixel */
+"12 12 76 2",
+/* colors */
+"`` c None",
+"`a c #35CB35",
+"`b c #1AA71A",
+"`c c #158B15",
+"`d c #148914",
+"`e c #158715",
+"`f c #137513",
+"`g c #107710",
+"`h c #0F6D0F",
+"`i c #0E6B0E",
+"`j c #0E690E",
+"`k c #0F650F",
+"`l c #0E630E",
+"`m c #0A5F0A",
+"`n c #036703",
+"`o c #0B570B",
+"`p c #075D07",
+"`q c #0A550A",
+"`r c #0C4F0C",
+"`s c #0A510A",
+"`t c #045704",
+"`u c #065106",
+"`v c #074D07",
+"`w c #074B07",
+"`x c #094709",
+"`y c #063B06",
+"`z c #073907",
+"a` c #033D03",
+"aa c #033B03",
+"ab c #053505",
+"ac c #003D00",
+"ad c #053105",
+"ae c #003700",
+"af c #042904",
+"ag c #012301",
+"ah c #011501",
+"ai c #1CB41C",
+"aj c #17A217",
+"ak c #189E18",
+"al c #189A18",
+"am c #119011",
+"an c #128A12",
+"ao c #0F8C0F",
+"ap c #148214",
+"aq c #138013",
+"ar c #0F7A0F",
+"as c #0B800B",
+"at c #0A7A0A",
+"au c #0A780A",
+"av c #0A760A",
+"aw c #0B720B",
+"ax c #0F6A0F",
+"ay c #0A6A0A",
+"az c #056C05",
+"b` c #056A05",
+"ba c #076407",
+"bb c #0D580D",
+"bc c #0A5C0A",
+"bd c #046404",
+"be c #075A07",
+"bf c #045E04",
+"bg c #055605",
+"bh c #035003",
+"bi c #015201",
+"bj c #B1FFB1",
+"bk c #034803",
+"bl c #044604",
+"bm c #074007",
+"bn c #083E08",
+"bo c #024402",
+"bp c #044004",
+"bq c #013A01",
+"br c #052E05",
+"bs c #042C04",
+"bt c #012A01",
+"bu c #000A00",
+/* pixels */
+"`````````l`ja`aqae``````",
+"`````zbp`calaubd`mbobt``",
+"`````fbibdaj`pbgau`u`h``",
+"``adbl`w`nasaiawazakbebm",
+"``bp`tbkaoanbjalb`ac`ebb",
+"```qbebaamaj`aamavalap`o",
+"```rbcbf`batavbeavbp`g`y",
+"``af`wbp`dawalaraybgbqag",
+"````abbq`h`i`gbhax`vbs``",
+"````bu`xaa`s`kblaabnah``",
+"````````bradbr`zaf``````",
+"````````````````````````"
+};
diff --git a/hacks/images/bubbles/jade3.xpm b/hacks/images/bubbles/jade3.xpm
new file mode 100644 (file)
index 0000000..3e8a102
--- /dev/null
@@ -0,0 +1,114 @@
+/* XPM */
+static char *jade3[] = {
+/* width height ncolors chars_per_pixel */
+"14 14 93 2",
+/* colors */
+"`` c None",
+"`a c #35CB35",
+"`b c #1CB11C",
+"`c c #1AA71A",
+"`d c #169D16",
+"`e c #179717",
+"`f c #179317",
+"`g c #158B15",
+"`h c #148914",
+"`i c #158715",
+"`j c #0F890F",
+"`k c #128312",
+"`l c #0D830D",
+"`m c #127912",
+"`n c #137513",
+"`o c #0C7D0C",
+"`p c #0E750E",
+"`q c #0F730F",
+"`r c #0F6F0F",
+"`s c #0F6D0F",
+"`t c #0E6B0E",
+"`u c #077307",
+"`v c #0E630E",
+"`w c #0B630B",
+"`x c #0A5F0A",
+"`y c #0A550A",
+"`z c #0B530B",
+"a` c #0C4F0C",
+"aa c #094F09",
+"ab c #045704",
+"ac c #0A4D0A",
+"ad c #065306",
+"ae c #0A4B0A",
+"af c #065106",
+"ag c #015901",
+"ah c #054F05",
+"ai c #074B07",
+"aj c #084908",
+"ak c #084508",
+"al c #064706",
+"am c #073907",
+"an c #033D03",
+"ao c #053505",
+"ap c #063306",
+"aq c #042B04",
+"ar c #042904",
+"as c #011D01",
+"at c #011901",
+"au c #21B621",
+"av c #1CB41C",
+"aw c white",
+"ax c #18A418",
+"ay c #189A18",
+"az c #149C14",
+"b` c #149014",
+"ba c #0F8C0F",
+"bb c #128612",
+"bc c #148214",
+"bd c #138013",
+"be c #107C10",
+"bf c #0A760A",
+"bg c #0F6A0F",
+"bh c #0A6A0A",
+"bi c #0C660C",
+"bj c #0A660A",
+"bk c #0B620B",
+"bl c #0C600C",
+"bm c #056A05",
+"bn c #066806",
+"bo c #076407",
+"bp c #0D580D",
+"bq c #0A5C0A",
+"br c #076007",
+"bs c #046404",
+"bt c #0A5A0A",
+"bu c #075A07",
+"bv c #095409",
+"bw c #035003",
+"bx c #034C03",
+"by c #074207",
+"bz c #034803",
+"c` c #044604",
+"ca c #074007",
+"cb c #083E08",
+"cc c #024402",
+"cd c #053805",
+"ce c #023802",
+"cf c #012E01",
+"cg c #042604",
+"ch c #022802",
+"ci c #042404",
+"cj c #022002",
+"ck c #011E01",
+/* pixels */
+"``````````aa`rbdahbp````````",
+"``````akbi`gay`hal`qbgce````",
+"````aebu`kbnayah`c`o`xahcf``",
+"`````sb`cc`bbj`eaubmbfbbai``",
+"``ambd`q`o`dba`f`cbxbfbkbcae",
+"``aebk`fbeav`aawbc`j`obqadae",
+"``ca`wbvbsaxau`abfazcc`t`mbp",
+"``a``s`f`xax`d`ubm`lbo`i`nae",
+"``aqaaajab`ebhagbzagbwafc`cb",
+"````cjai`rbj`pbhbr`gafblam``",
+"````asaoanbtadbiad`v`yaecg``",
+"``````cichcdby`zceacaeci````",
+"``````````arcgckapat````````",
+"````````````````````````````"
+};
diff --git a/hacks/images/bubbles/jade4.xpm b/hacks/images/bubbles/jade4.xpm
new file mode 100644 (file)
index 0000000..ce3dc39
--- /dev/null
@@ -0,0 +1,170 @@
+/* XPM */
+static char *jade4[] = {
+/* width height ncolors chars_per_pixel */
+"20 20 143 2",
+/* colors */
+"`` c None",
+"`a c #69E169",
+"`b c #35CB35",
+"`c c #23BD23",
+"`d c #1CB11C",
+"`e c #1AA71A",
+"`f c #169D16",
+"`g c #179717",
+"`h c #149914",
+"`i c #179317",
+"`j c #1A8B1A",
+"`k c #158B15",
+"`l c #148914",
+"`m c #158715",
+"`n c #148514",
+"`o c #0F890F",
+"`p c #128312",
+"`q c #0E850E",
+"`r c #0D830D",
+"`s c #0F7F0F",
+"`t c #127912",
+"`u c #107710",
+"`v c #0C7D0C",
+"`w c #0E750E",
+"`x c #0F730F",
+"`y c #0F6F0F",
+"`z c #0E6B0E",
+"a` c #077307",
+"aa c #0F650F",
+"ab c #0E630E",
+"ac c #0B630B",
+"ad c #0D5B0D",
+"ae c #036703",
+"af c #0B570B",
+"ag c #075D07",
+"ah c #026502",
+"ai c #046104",
+"aj c #0A550A",
+"ak c #0B530B",
+"al c #016101",
+"am c #094F09",
+"an c #065306",
+"ao c #0A4B0A",
+"ap c #065106",
+"aq c #074D07",
+"ar c #054F05",
+"as c #074B07",
+"at c #084908",
+"au c #094709",
+"av c #084508",
+"aw c #064706",
+"ax c #014F01",
+"ay c #004B00",
+"az c #063B06",
+"b` c #073907",
+"ba c #004100",
+"bb c #013F01",
+"bc c #033B03",
+"bd c #053505",
+"be c #003700",
+"bf c #042B04",
+"bg c #042904",
+"bh c #012301",
+"bi c #022102",
+"bj c #021B02",
+"bk c #011901",
+"bl c #011701",
+"bm c #011501",
+"bn c #011301",
+"bo c #010D01",
+"bp c #21B621",
+"bq c #1CB41C",
+"br c #22AA22",
+"bs c #1AAC1A",
+"bt c #18A818",
+"bu c white",
+"bv c #18A418",
+"bw c #17A217",
+"bx c #189E18",
+"by c #189A18",
+"bz c #149014",
+"c` c #119011",
+"ca c #128A12",
+"cb c #128612",
+"cc c #127E12",
+"cd c #127C12",
+"ce c #107C10",
+"cf c #0F7A0F",
+"cg c #0B800B",
+"ch c #0E780E",
+"ci c #0B7C0B",
+"cj c #117211",
+"ck c #0A7A0A",
+"cl c #0E720E",
+"cm c #0A760A",
+"cn c #106A10",
+"co c #0B720B",
+"cp c #0F6A0F",
+"cq c #0A6E0A",
+"cr c #0B6C0B",
+"cs c #0A6A0A",
+"ct c #0B680B",
+"cu c #067006",
+"cv c #0A660A",
+"cw c #056C05",
+"cx c #0B620B",
+"cy c #0D5E0D",
+"cz c #056A05",
+"d` c #066806",
+"da c #076407",
+"db c #0D580D",
+"dc c #076007",
+"dd c #0A5A0A",
+"de c #075A07",
+"df c #085808",
+"dg c #045E04",
+"dh c #015E01",
+"di c #055605",
+"dj c #015201",
+"dk c #034C03",
+"dl c #034A03",
+"dm c #074207",
+"dn c #034803",
+"do c #044604",
+"dp c #083E08",
+"dq c #014601",
+"dr c #044004",
+"ds c #053805",
+"dt c #063606",
+"du c #013A01",
+"dv c #023802",
+"dw c #052E05",
+"dx c #013401",
+"dy c #042C04",
+"dz c #013001",
+"e` c #042604",
+"ea c #012A01",
+"eb c #022802",
+"ec c #042404",
+"ed c #002600",
+"ee c #022002",
+"ef c #011E01",
+"eg c #001000",
+/* pixels */
+"``````````````dwdmdzbbaoauds````````````",
+"``````````dpasba`zce`ncd`yddasdt````````",
+"````````azcpcr`wcm`sbycldc`x`maadm``````",
+"``````aucxcr`ncmbxcb`halcmbzdgdecpaz````",
+"````dpcydzdjbwci`dcuagbvcrcz`eapascybh``",
+"````dwan`ldj`o`rcg`hcgbqahdidhbzdc`tdb``",
+"``bicyabcod``fbpcabqbw`cckcuc`bxax`tdbbk",
+"``bdaw`mcfbvbwbsa`br`a`jbpcgbs`eacctbedy",
+"``auaddqbzczcbc``o`abu`b`qaecm`vayclabb`",
+"``eacnan`idaaibqclbr`b`jbtbsdoby`kcjawbk",
+"``bhamdlcccq`k`f`h`d`p`rcwbs`vax`n`taje`",
+"``efdxcjcddjced`dndharcu`rdndjdj`xarakee",
+"``bndmbedd`tchbzcs`ico`gcscqcecvabajebbn",
+"````eebcabcx`ycvce`kcqdc`x`mdqdfbedvdt``",
+"````bodtaddudk`yagcv`udeclcj`yaqafb`bl``",
+"``````bjdpdbdratdodlandkajaaabavbkee````",
+"````````bjebaudvabdmabasafaoaubgec``````",
+"``````````egbfdtedaudpaudwdpecbn````````",
+"``````````````bobmbmbkbjeebo````````````",
+"````````````````````````````````````````"
+};
diff --git a/hacks/images/bubbles/jade5.xpm b/hacks/images/bubbles/jade5.xpm
new file mode 100644 (file)
index 0000000..120e97b
--- /dev/null
@@ -0,0 +1,200 @@
+/* XPM */
+static char *jade5[] = {
+/* width height ncolors chars_per_pixel */
+"24 24 169 2",
+/* colors */
+"`` c None",
+"`a c #69E169",
+"`b c #35CB35",
+"`c c #23BD23",
+"`d c #1CB11C",
+"`e c #1AA71A",
+"`f c #169D16",
+"`g c #149914",
+"`h c #179317",
+"`i c #139713",
+"`j c #149514",
+"`k c #1A8B1A",
+"`l c #159315",
+"`m c #129312",
+"`n c #158B15",
+"`o c #148914",
+"`p c #158715",
+"`q c #148514",
+"`r c #128312",
+"`s c #0F870F",
+"`t c #0E850E",
+"`u c #108110",
+"`v c #0D830D",
+"`w c #0F7F0F",
+"`x c #127912",
+"`y c #137513",
+"`z c #107710",
+"a` c #0C7D0C",
+"aa c #0E750E",
+"ab c #0F730F",
+"ac c #0F6F0F",
+"ad c #0F6D0F",
+"ae c #0E6B0E",
+"af c #0E690E",
+"ag c #077307",
+"ah c #0F650F",
+"ai c #0E630E",
+"aj c #0B630B",
+"ak c #0D5B0D",
+"al c #0A5F0A",
+"am c #036703",
+"an c #0B570B",
+"ao c #075D07",
+"ap c #0A550A",
+"aq c #0B530B",
+"ar c #016101",
+"as c #0C4F0C",
+"at c #0A510A",
+"au c #025B02",
+"av c #045704",
+"aw c #0A4D0A",
+"ax c #065306",
+"ay c #0A4B0A",
+"az c #065106",
+"b` c #015901",
+"ba c #074D07",
+"bb c #054F05",
+"bc c #074B07",
+"bd c #084908",
+"be c #094709",
+"bf c #084508",
+"bg c #064706",
+"bh c #014F01",
+"bi c #004B00",
+"bj c #063B06",
+"bk c #073907",
+"bl c #033D03",
+"bm c #004100",
+"bn c #033B03",
+"bo c #053505",
+"bp c #003D00",
+"bq c #063306",
+"br c #053105",
+"bs c #003700",
+"bt c #042B04",
+"bu c #042904",
+"bv c #012301",
+"bw c #022102",
+"bx c #011D01",
+"by c #021B02",
+"bz c #011901",
+"c` c #011701",
+"ca c #011501",
+"cb c #011301",
+"cc c #010D01",
+"cd c #1CB41C",
+"ce c #1AAC1A",
+"cf c #1F9C1F",
+"cg c #18A418",
+"ch c #17A217",
+"ci c #189E18",
+"cj c #189A18",
+"ck c #149C14",
+"cl c #149014",
+"cm c #119011",
+"cn c #128A12",
+"co c #0F8C0F",
+"cp c #128612",
+"cq c #148214",
+"cr c #138013",
+"cs c #127C12",
+"ct c #0F7A0F",
+"cu c #0B800B",
+"cv c #0B7C0B",
+"cw c #117211",
+"cx c #0A7A0A",
+"cy c #0E720E",
+"cz c #0A780A",
+"d` c #0A760A",
+"da c #106A10",
+"db c #0B720B",
+"dc c #0F6A0F",
+"dd c #0A700A",
+"de c #0A6E0A",
+"df c #0B6C0B",
+"dg c #0A6A0A",
+"dh c #067006",
+"di c #0C660C",
+"dj c #0A660A",
+"dk c #056E05",
+"dl c #056C05",
+"dm c #0B620B",
+"dn c #0C600C",
+"do c #0D5E0D",
+"dp c #056A05",
+"dq c #066806",
+"dr c #076407",
+"ds c #0D580D",
+"dt c #0A5C0A",
+"du c #076007",
+"dv c #046404",
+"dw c #0A5A0A",
+"dx c #075A07",
+"dy c #045E04",
+"dz c #095409",
+"e` c #015E01",
+"ea c #055605",
+"eb c #015601",
+"ec c #035003",
+"ed c #015201",
+"ee c #034C03",
+"ef c #034A03",
+"eg c #B1FFB1",
+"eh c #074207",
+"ei c #034803",
+"ej c #044604",
+"ek c #074007",
+"el c #083E08",
+"em c #014601",
+"en c #024402",
+"eo c #034203",
+"ep c #044004",
+"eq c #053805",
+"er c #063606",
+"es c #013A01",
+"et c #023802",
+"eu c #052E05",
+"ev c #042C04",
+"ew c #013001",
+"ex c #012E01",
+"ey c #012C01",
+"ez c #012A01",
+"f` c #022802",
+"fa c #042404",
+"fb c #002600",
+"fc c #022002",
+"fd c #011E01",
+"fe c #001000",
+"ff c #000A00",
+/* pixels */
+"``````````````````eleubedsaqbfer````````````````",
+"``````````````ayaibbafdiblbbcrefbsaw````````````",
+"``````````f`etdtajaoclaadyeobsaacq`ydoer````````",
+"````````bkapepab`n`lcjdqczcydvb`alduenakez``````",
+"``````buepafbhdeebcj`u`wdvcvbpa`cgej`qdmezc`````",
+"``````ek`yduedcidv`icharaoceea`mcz`tazesadbr````",
+"````bkapdi`naadl`f`feedj`lcdar`t`reacj`hacakel``",
+"````brdoejclbc`eam`mcucdcdcddbcndlagcidydxdwek``",
+"``faeheietdbdb`gcddk`fcf`b`pdkckam`vdv`h`xcwatfd",
+"``euepehav`heidhcockcn`aeg`bcjcddpe`bpdw`pdwdsf`",
+"``bkbleyem`r`wcndxdhci`aeg`a`caocv`jdedrcqendoev",
+"``brapeedxajdrdqcm`mchcf`b`kcmcud`dxcj`xcqadanel",
+"``evehdoalctctau`ee`cecgdtdhamceciddei`nacdwbner",
+"``fcasbpdt`pdyeb`edvcx`rd``ddxb`d`ddep`p`zdobjbw",
+"``cceqfbacbmbabg`w`scn`sebebacczdrcsdfaeaiawayfe",
+"````buexbcbpepbi`ocpdbcicjenctdjdgdjeaeeesdsbv``",
+"````fcbfewdzdw`zaebldg`rdb`ueddx`qbgaldzdsbqby``",
+"``````faboaqesdaad`xaedj`zajecabdcajbaaievbz````",
+"``````ffbubvakeseobaafenalajaxehdnanbdeqbwcc````",
+"````````fferbeewbnepatejahdzejakbnetelbqca``````",
+"``````````ffbtbqayayewewasdseweyezelbucc````````",
+"``````````````ffeuevbrbqeubxbkbvbuca````````````",
+"``````````````````ccbyc`bybycbff````````````````",
+"````````````````````````````````````````````````"
+};
diff --git a/hacks/images/bubbles/jade6.xpm b/hacks/images/bubbles/jade6.xpm
new file mode 100644 (file)
index 0000000..521acf9
--- /dev/null
@@ -0,0 +1,222 @@
+/* XPM */
+static char *jade6[] = {
+/* width height ncolors chars_per_pixel */
+"30 30 185 2",
+/* colors */
+"`` c None",
+"`a c #69E169",
+"`b c #35CB35",
+"`c c #23BD23",
+"`d c #1CB11C",
+"`e c #1AA71A",
+"`f c #169D16",
+"`g c #179717",
+"`h c #149914",
+"`i c #179317",
+"`j c #139713",
+"`k c #149514",
+"`l c #1A8B1A",
+"`m c #159315",
+"`n c #129312",
+"`o c #158B15",
+"`p c #128D12",
+"`q c #148914",
+"`r c #158715",
+"`s c #148514",
+"`t c #0F890F",
+"`u c #128312",
+"`v c #0F870F",
+"`w c #0E850E",
+"`x c #108110",
+"`y c #0D830D",
+"`z c #0F7F0F",
+"a` c #127912",
+"aa c #137513",
+"ab c #107710",
+"ac c #0C7D0C",
+"ad c #0E750E",
+"ae c #0F730F",
+"af c #0F6F0F",
+"ag c #0F6D0F",
+"ah c #0E6B0E",
+"ai c #0E690E",
+"aj c #077307",
+"ak c #0F650F",
+"al c #0E630E",
+"am c #0B630B",
+"an c #0D5B0D",
+"ao c #0A5F0A",
+"ap c #036703",
+"aq c #0B570B",
+"ar c #075D07",
+"as c #026502",
+"at c #046104",
+"au c #0A550A",
+"av c #0B530B",
+"aw c #0C4F0C",
+"ax c #0A510A",
+"ay c #025B02",
+"az c #094F09",
+"b` c #045704",
+"ba c #065306",
+"bb c #0A4B0A",
+"bc c #065106",
+"bd c #015901",
+"be c #074D07",
+"bf c #054F05",
+"bg c #074B07",
+"bh c #084908",
+"bi c #094709",
+"bj c #084508",
+"bk c #064706",
+"bl c #014F01",
+"bm c #004B00",
+"bn c #063D06",
+"bo c #063B06",
+"bp c #073907",
+"bq c #033D03",
+"br c #004100",
+"bs c #013F01",
+"bt c #033B03",
+"bu c #053505",
+"bv c #003D00",
+"bw c #063306",
+"bx c #053105",
+"by c #023502",
+"bz c #003700",
+"c` c #042B04",
+"ca c #042904",
+"cb c #012301",
+"cc c #022102",
+"cd c #011D01",
+"ce c #021B02",
+"cf c #011901",
+"cg c #011701",
+"ch c #011501",
+"ci c #011301",
+"cj c #010D01",
+"ck c #21B621",
+"cl c #1CB41C",
+"cm c #22AA22",
+"cn c #1AAC1A",
+"co c #18A818",
+"cp c #1F9C1F",
+"cq c #18A418",
+"cr c #17A217",
+"cs c #189E18",
+"ct c #189A18",
+"cu c #149C14",
+"cv c #149014",
+"cw c #119011",
+"cx c #128A12",
+"cy c #0F8C0F",
+"cz c #128612",
+"d` c #148214",
+"da c #138013",
+"db c #127E12",
+"dc c #127C12",
+"dd c #107C10",
+"de c #0F7A0F",
+"df c #0B800B",
+"dg c #0E780E",
+"dh c #0B7C0B",
+"di c #117211",
+"dj c #0A7A0A",
+"dk c #0E720E",
+"dl c #0A780A",
+"dm c #0A760A",
+"dn c #106A10",
+"do c #0B720B",
+"dp c #0F6A0F",
+"dq c #0A6E0A",
+"dr c #0B6C0B",
+"ds c #0A6A0A",
+"dt c #0B680B",
+"du c #067006",
+"dv c #0C660C",
+"dw c #0A660A",
+"dx c #056E05",
+"dy c #056C05",
+"dz c #0B620B",
+"e` c #0C600C",
+"ea c #0D5E0D",
+"eb c #056A05",
+"ec c #066806",
+"ed c #076407",
+"ee c #0D580D",
+"ef c #0A5C0A",
+"eg c #076007",
+"eh c #046404",
+"ei c #0A5A0A",
+"ej c #075A07",
+"ek c #085808",
+"el c #045E04",
+"em c #095409",
+"en c #015E01",
+"eo c #055605",
+"ep c #055405",
+"eq c #015601",
+"er c #035003",
+"es c #015201",
+"et c #034C03",
+"eu c #B1FFB1",
+"ev c #074207",
+"ew c #034803",
+"ex c #044604",
+"ey c #074007",
+"ez c #083E08",
+"f` c #014601",
+"fa c #024402",
+"fb c #044004",
+"fc c #053805",
+"fd c #063606",
+"fe c #013A01",
+"ff c #023802",
+"fg c #052E05",
+"fh c #013401",
+"fi c #013201",
+"fj c #042C04",
+"fk c #013001",
+"fl c #012E01",
+"fm c #012C01",
+"fn c #042604",
+"fo c #012A01",
+"fp c #022802",
+"fq c #042404",
+"fr c #002600",
+"fs c #022002",
+"ft c #011E01",
+"fu c #001000",
+"fv c #000A00",
+/* pixels */
+"````````````````````````fpfmbbavbyfoca``````````````````````",
+"``````````````````bwfhdndnafa`fkagbsbgeeeycc````````````````",
+"````````````````eebgagakahdbdw`sblf`aff`bqbgfh``````````````",
+"````````````fpanbsamejde`qdo`iefbdbzfeegd`ekbcavbx``````````",
+"``````````bpazaaa`dd`octdgcq`odlaodqecbdaob`aketbgfo````````",
+"````````fpaxdzd``r`ses`gcsdten`hdfdddmec`peldceidpbkfg``````",
+"````````ffeiaaa`elcsecdyajdeckepclcvascn`v`eaierf`diee``````",
+"``````cbanf`bm`xczdheh`dcnckerapeb`fcw`hcvcxecexdcagalbi````",
+"````fqfgemet`qatfe`tdl`hdfeoerdf`c`was`g`xencz`iegeodneece``",
+"````bpakbaex`odeeb`eapcl`fcqcrcl`c`t`eardyayddategeje`eeft``",
+"````fcdnau`raees`fcwcncydxdx`e`lckduclajducwctbzbqaba`azbu``",
+"``chflbkbfbmdeecebcrclcnajab`b`a`acmckcwcncnczfaamabaibzbofu",
+"``fqbbeadzet`q`icndwdhcn`y`b`aeu`a`l`c`jdfduacahbs`rdzdibobw",
+"``ftavazeaepeg`xdmaccvclcycm`aeu`acpap`f`wcwctay`q`rfadncbfg",
+"``fseydndzej`ieqeqatcwcrdk`c`l`b`lcpcodhdmexdqed`od`eibkeefg",
+"``fqbofbaiahdaedcveccraj`t`hdj`daj`d`ncucs`m`e`z`qahetazbbfq",
+"``chfmazefaoadczeqdbdh`pdm`dduebcldfbddl`pdmesed`sd`alalbicd",
+"``cjbxfheidvdcfbblddcscxew`icqbf`wdr`yacehesbebmaeaaexavceci",
+"````cbevfcdibafkfbes`qcs`kctctctekdebsesdqblb`ddf`aoakbpch``",
+"````ftcdbhbgexake`eg`q`gdqdocsctfebs`udrdsdkegbraqfebbbbcf``",
+"````cjfscbfhalbqabafdkeodd`x`odqddedaedgddf`bfaabzbbbifdfv``",
+"``````fqezeeeefefaafdtbmardb`oabdwegbmdcbcbaemakeafjfpfq````",
+"````````fnbifcaxbgbvdpdvdcafdwdadweraeanaoageaaqawbucc``````",
+"````````fvfqezaweafbfkeaexbvagbaeiaoaubce`aleeavcffsch``````",
+"``````````fvbxbpbnfibtbzakavfeakbgeabzakbtbobjfjbxch````````",
+"````````````cjcefpfobubobjezbtfkaneveebybuevcafqcj``````````",
+"````````````````fuc`bpfdfrezbbezfofnfgbxbpfqce``````````````",
+"``````````````````cjchchfufqcbcgcecefncccifv````````````````",
+"````````````````````````cjcjcicgcicjfv``````````````````````",
+"````````````````````````````````````````````````````````````"
+};
diff --git a/hacks/images/bubbles/jade7.xpm b/hacks/images/bubbles/jade7.xpm
new file mode 100644 (file)
index 0000000..8c26b3d
--- /dev/null
@@ -0,0 +1,232 @@
+/* XPM */
+static char *jade7[] = {
+/* width height ncolors chars_per_pixel */
+"36 36 189 2",
+/* colors */
+"`` c None",
+"`a c #69E169",
+"`b c #35CB35",
+"`c c #23BD23",
+"`d c #1CB11C",
+"`e c #1AA71A",
+"`f c #169D16",
+"`g c #179717",
+"`h c #149914",
+"`i c #179317",
+"`j c #139713",
+"`k c #149514",
+"`l c #1A8B1A",
+"`m c #159315",
+"`n c #129312",
+"`o c #158B15",
+"`p c #128D12",
+"`q c #148914",
+"`r c #158715",
+"`s c #148514",
+"`t c #0F890F",
+"`u c #128312",
+"`v c #0F870F",
+"`w c #0E850E",
+"`x c #108110",
+"`y c #0D830D",
+"`z c #0F7F0F",
+"a` c #127912",
+"aa c #137513",
+"ab c #107710",
+"ac c #0C7D0C",
+"ad c #0E750E",
+"ae c #0F730F",
+"af c #0F6F0F",
+"ag c #0F6D0F",
+"ah c #0E6B0E",
+"ai c #0E690E",
+"aj c #077307",
+"ak c #0F650F",
+"al c #0E630E",
+"am c #0B630B",
+"an c #0D5B0D",
+"ao c #0A5F0A",
+"ap c #036703",
+"aq c #0B570B",
+"ar c #075D07",
+"as c #026502",
+"at c #046104",
+"au c #0A550A",
+"av c #0B530B",
+"aw c #016101",
+"ax c #0C4F0C",
+"ay c #0A510A",
+"az c #025B02",
+"b` c #094F09",
+"ba c #045704",
+"bb c #0A4D0A",
+"bc c #065306",
+"bd c #0A4B0A",
+"be c #065106",
+"bf c #015901",
+"bg c #074D07",
+"bh c #054F05",
+"bi c #074B07",
+"bj c #084908",
+"bk c #094709",
+"bl c #084508",
+"bm c #064706",
+"bn c #014F01",
+"bo c #004B00",
+"bp c #063D06",
+"bq c #063B06",
+"br c #073907",
+"bs c #033D03",
+"bt c #013F01",
+"bu c #033B03",
+"bv c #053505",
+"bw c #003D00",
+"bx c #063306",
+"by c #053105",
+"bz c #023502",
+"c` c #003700",
+"ca c #042904",
+"cb c #012301",
+"cc c #022102",
+"cd c #011D01",
+"ce c #021B02",
+"cf c #011901",
+"cg c #011701",
+"ch c #011501",
+"ci c #011301",
+"cj c #010D01",
+"ck c #21B621",
+"cl c #1CB41C",
+"cm c #22AA22",
+"cn c #1AAC1A",
+"co c #18A818",
+"cp c #1F9C1F",
+"cq c #18A418",
+"cr c #17A217",
+"cs c #189E18",
+"ct c #189A18",
+"cu c #149C14",
+"cv c #149014",
+"cw c #119011",
+"cx c #128A12",
+"cy c #0F8C0F",
+"cz c #128612",
+"d` c #148214",
+"da c #138013",
+"db c #127E12",
+"dc c #127C12",
+"dd c #107C10",
+"de c #0F7A0F",
+"df c #0B800B",
+"dg c #0E780E",
+"dh c #0B7C0B",
+"di c #117211",
+"dj c #0A7A0A",
+"dk c #0E720E",
+"dl c #0A780A",
+"dm c #0A760A",
+"dn c #106A10",
+"do c #0B720B",
+"dp c #0F6A0F",
+"dq c #0A700A",
+"dr c #0A6E0A",
+"ds c #0B6C0B",
+"dt c #0A6A0A",
+"du c #0B680B",
+"dv c #067006",
+"dw c #0C660C",
+"dx c #0A660A",
+"dy c #056E05",
+"dz c #056C05",
+"e` c #0B620B",
+"ea c #0C600C",
+"eb c #0D5E0D",
+"ec c #056A05",
+"ed c #066806",
+"ee c #076407",
+"ef c #0D580D",
+"eg c #0A5C0A",
+"eh c #076007",
+"ei c #046404",
+"ej c #0A5A0A",
+"ek c #075A07",
+"el c #085808",
+"em c #045E04",
+"en c #095409",
+"eo c #015E01",
+"ep c #055605",
+"eq c #055405",
+"er c #015601",
+"es c #015401",
+"et c #035003",
+"eu c #015201",
+"ev c #034C03",
+"ew c #034A03",
+"ex c #B1FFB1",
+"ey c #074207",
+"ez c #034803",
+"f` c #044604",
+"fa c #074007",
+"fb c #083E08",
+"fc c #014601",
+"fd c #024402",
+"fe c #034203",
+"ff c #044004",
+"fg c #053805",
+"fh c #063606",
+"fi c #013A01",
+"fj c #023802",
+"fk c #052E05",
+"fl c #013401",
+"fm c #013201",
+"fn c #042C04",
+"fo c #013001",
+"fp c #012E01",
+"fq c #012C01",
+"fr c #042604",
+"fs c #012A01",
+"ft c #022802",
+"fu c #042404",
+"fv c #002600",
+"fw c #022002",
+"fx c #011E01",
+"fy c #001000",
+"fz c #000A00",
+/* pixels */
+"````````````````````````````````fbeyeybvfn``````````````````````````````",
+"````````````````````````fkfqbjavdnbmeaafbmaqfvavby``````````````````````",
+"````````````````````fsbdalb`fdaievepbsdievdabjauc`bvbl``````````````````",
+"``````````````````avf`aleleve`dbdk`of`eldieharbjfjezdney````````````````",
+"``````````````fnaydneleqdb`i`o`i`idddweuemerbhesabbzbcbtayfh````````````",
+"````````````brbsenffdadd`o`odrctcvdxdleobfeiesbnaobafcfdfebufs``````````",
+"``````````caeyaqebe`boa`biaccndmat`ycnec`ddxed`v`iehai`raubgb`fk````````",
+"``````````efakalahbo`ucvazdzajdddecldscnclao`kcv`kdqfebneqdibmft````````",
+"````````fvefaaegdreucv`geicscncrdvdxarcw`fepclcwdlctdgbebnfoagakfg``````",
+"``````ccblakbcbodeeudlfd`hclclasapaw`dapaw`w`d`t`eaj`m`zekabdidnayfx````",
+"``````bvebbeag`seeemdm`deodjcnevdy`dcu`c`jasasfc`deoek`zadboepafanfb````",
+"````fwbyenbhf``rcxbicvcsap`fcydf`c`jcl`c`wdock`udzbfeccserboekegalfacf``",
+"````caeyeaaqbna`elcqcv`fco`hek`tcy`i`r`c`f`kcoareocydveie`fla`dcbmeffk``",
+"````eybbbwbhelcz`zbfcscqclcras`w`bcmcp`a`rdf`ccw`zapdsazerelddaebmbyfs``",
+"````bvffbtevba`uctezeo`tcycoawcx`b`aex`acpct`c`yeccldvbwfe`i`rdwezefca``",
+"``fwbkbmfieget`g`idmbfaddyckajcm`aexexex`aczcndvdfdvcsdmbhdadaelenauaxce",
+"``cefqflejaieheuemcvcxdm`m`ndl`e`b`aex`acmdr`ncn`w`hcsdmde`idaahf`aqfgcf",
+"``cafqauauaoekbo`ieeerafcwcrajcr`c`l`bcpcpcwcu`tdmbwe`ctembad`aifeaqfhca",
+"``cgfqflbia`dadsemdresdh`ecuao`hcrededdt`iajcocncs`vewee`q`uduelb`fjbyfu",
+"``fyfteff`amagad`odtewbf`k`ect`dcq`dcz`ncyecapcn`p`vekd``o`oagaiakavftch",
+"````fkaxcbejegabdkemahem`e`fctdjeoecdmclcwek`tdedmdrctffekababagalbqcd``",
+"````bxaxbqbgaaa`afeafif`atctedfdatazeodhbfcvcxedezfibtboduaedic`bmaxfx``",
+"````frfkaxbddielbmfldibadd`gcvcx`e`g`ebcaeamej`rdodxba`ra`ezakakbqbkcd``",
+"````cgcaaxavbibcdpffd`dk`q`iaddocvctctbte`dedo`xdtdsafepejbzfibjfscbfy``",
+"``````cgfbcaaldndnelafafdkdsdgdect`gdgdobaeuen`udsa`bzbhdibpfofgfxfy````",
+"``````fybxbrbzaybgezaae`afbofceheh`sdsadehbofeabdbage`akebb`fofpbrce````",
+"````````cfbybvbjbgfibjejagbcfcahdkdbabdsaretdbeldpaaejbgefavfnftch``````",
+"``````````cafbftefalb`bgdiaaafafafaramepbcaoagevaialauefbjeyfbcc````````",
+"``````````cjfufbeyavavavdneybzejezbzevezbcezegdianb`b`eybvfvfxch````````",
+"````````````fzfwfbbkbqbzbuflbiaybqbwakfeakf`feakbubxaxfbfncach``````````",
+"``````````````cjcgccftfofqblefblfsbbeyeyavebbseyaxblfbfrfufz````````````",
+"``````````````````cicebrbrfhbqaxbrfmbkbkbleycdfvbxfbcdfw````````````````",
+"````````````````````cjcefkfnftbybxfvfkbycfbrbyfkcachcj``````````````````",
+"````````````````````````fzcecichcfcgcicfchfwfufyfz``````````````````````",
+"````````````````````````````````fzfzfzfzcj``````````````````````````````",
+"````````````````````````````````````````````````````````````````````````"
+};
diff --git a/hacks/images/bubbles/jade8.xpm b/hacks/images/bubbles/jade8.xpm
new file mode 100644 (file)
index 0000000..3c73737
--- /dev/null
@@ -0,0 +1,240 @@
+/* XPM */
+static char *jade8[] = {
+/* width height ncolors chars_per_pixel */
+"44 44 189 2",
+/* colors */
+"`` c None",
+"`a c #69E169",
+"`b c #35CB35",
+"`c c #23BD23",
+"`d c #1CB11C",
+"`e c #1AA71A",
+"`f c #169D16",
+"`g c #179717",
+"`h c #149914",
+"`i c #179317",
+"`j c #139713",
+"`k c #149514",
+"`l c #1A8B1A",
+"`m c #159315",
+"`n c #129312",
+"`o c #158B15",
+"`p c #128D12",
+"`q c #148914",
+"`r c #158715",
+"`s c #148514",
+"`t c #0F890F",
+"`u c #128312",
+"`v c #0F870F",
+"`w c #0E850E",
+"`x c #108110",
+"`y c #0D830D",
+"`z c #0F7F0F",
+"a` c #127912",
+"aa c #137513",
+"ab c #107710",
+"ac c #0C7D0C",
+"ad c #0E750E",
+"ae c #0F730F",
+"af c #0F6F0F",
+"ag c #0F6D0F",
+"ah c #0E6B0E",
+"ai c #0E690E",
+"aj c #077307",
+"ak c #0F650F",
+"al c #0E630E",
+"am c #0B630B",
+"an c #0D5B0D",
+"ao c #0A5F0A",
+"ap c #036703",
+"aq c #0B570B",
+"ar c #075D07",
+"as c #026502",
+"at c #046104",
+"au c #0A550A",
+"av c #0B530B",
+"aw c #016101",
+"ax c #0C4F0C",
+"ay c #0A510A",
+"az c #025B02",
+"b` c #094F09",
+"ba c #045704",
+"bb c #0A4D0A",
+"bc c #065306",
+"bd c #0A4B0A",
+"be c #065106",
+"bf c #015901",
+"bg c #074D07",
+"bh c #054F05",
+"bi c #074B07",
+"bj c #084908",
+"bk c #094709",
+"bl c #084508",
+"bm c #064706",
+"bn c #014F01",
+"bo c #004B00",
+"bp c #063D06",
+"bq c #063B06",
+"br c #073907",
+"bs c #033D03",
+"bt c #004100",
+"bu c #013F01",
+"bv c #033B03",
+"bw c #053505",
+"bx c #003D00",
+"by c #063306",
+"bz c #053105",
+"c` c #023502",
+"ca c #003700",
+"cb c #042B04",
+"cc c #042904",
+"cd c #012301",
+"ce c #022102",
+"cf c #011D01",
+"cg c #021B02",
+"ch c #011901",
+"ci c #011701",
+"cj c #011501",
+"ck c #011301",
+"cl c #010D01",
+"cm c #21B621",
+"cn c #1CB41C",
+"co c #22AA22",
+"cp c #1AAC1A",
+"cq c #18A818",
+"cr c #1F9C1F",
+"cs c #18A418",
+"ct c #17A217",
+"cu c #189E18",
+"cv c #189A18",
+"cw c #149C14",
+"cx c #149014",
+"cy c #119011",
+"cz c #128A12",
+"d` c #0F8C0F",
+"da c #128612",
+"db c #148214",
+"dc c #138013",
+"dd c #127E12",
+"de c #127C12",
+"df c #107C10",
+"dg c #0F7A0F",
+"dh c #0B800B",
+"di c #0E780E",
+"dj c #0B7C0B",
+"dk c #117211",
+"dl c #0A7A0A",
+"dm c #0E720E",
+"dn c #0A780A",
+"do c #0A760A",
+"dp c #106A10",
+"dq c #0B720B",
+"dr c #0F6A0F",
+"ds c #0A6E0A",
+"dt c #0B6C0B",
+"du c #0A6A0A",
+"dv c #0B680B",
+"dw c #067006",
+"dx c #0C660C",
+"dy c #0A660A",
+"dz c #056E05",
+"e` c #056C05",
+"ea c #0B620B",
+"eb c #0C600C",
+"ec c #0D5E0D",
+"ed c #056A05",
+"ee c #066806",
+"ef c #076407",
+"eg c #0D580D",
+"eh c #0A5C0A",
+"ei c #076007",
+"ej c #046404",
+"ek c #0A5A0A",
+"el c #075A07",
+"em c #085808",
+"en c #045E04",
+"eo c #095409",
+"ep c #015E01",
+"eq c #055605",
+"er c #055405",
+"es c #015601",
+"et c #015401",
+"eu c #035003",
+"ev c #015201",
+"ew c #034C03",
+"ex c #034A03",
+"ey c #B1FFB1",
+"ez c #074207",
+"f` c #034803",
+"fa c #044604",
+"fb c #074007",
+"fc c #083E08",
+"fd c #014601",
+"fe c #024402",
+"ff c #034203",
+"fg c #044004",
+"fh c #053805",
+"fi c #063606",
+"fj c #013A01",
+"fk c #023802",
+"fl c #052E05",
+"fm c #013401",
+"fn c #013201",
+"fo c #042C04",
+"fp c #013001",
+"fq c #012E01",
+"fr c #012C01",
+"fs c #042604",
+"ft c #012A01",
+"fu c #022802",
+"fv c #042404",
+"fw c #002600",
+"fx c #022002",
+"fy c #011E01",
+"fz c #001000",
+/* pixels */
+"````````````````````````````````````````````br``````````````````````````````````````````",
+"````````````````````````````````bzftfkbvavakbsavb`aqbwfbfc``````````````````````````````",
+"````````````````````````````bwfgalaldpafafbcecebdkbubic`bpfmfq``````````````````````````",
+"````````````````````````fhavaubgbldkerahdbaoauekdeewaof`eadpfffmbw``````````````````````",
+"````````````````````fobbfaemdrewdrardfdfduekama`eoelamdydbfdbjaiakbbch``````````````````",
+"``````````````````fravakexamam`q`scx`odidiaoffdxenfaevdddyabeqfdembgaqbl````````````````",
+"````````````````bpbmekbeabdbdg`z`ods`z`mdqafeeatew`u`zemffba`rfdfdbubxbmft``````````````",
+"``````````````fbfkaufe`sdd`q`zdqdn`gcxdo`e`ydtfaedfeejdqczdg`qeuboecf`fjfmby````````````",
+"````````````fcecakbha`eaeuesefescz`f`yawdme`d`cpdzcsbf`ydocvdiekdebnfkaibiaybr``````````",
+"``````````fybjb`exbtei`odgdacxaoeddodydiapcucs`dd`asep`y`f`mcsdqdc`oabemaaecbzcd````````",
+"``````````bqayagbhewdtev`zcs`pdmctcp`fdhaj`eard`cp`wewas`jedaj`pefbeelb`emecanfh````````",
+"````````blegdpdxeleq`idd`xeebucscncncyepawewfeeierajcpcn`nbfepcz`pefabdddyekdpavfc``````",
+"````````c`egekeheu`udufjdm`z`edj`fcmapdiczapascq`cdjdtawapelbceadjcu`gdgeidcecalbw``````",
+"``````fobrffbedd`rdqdyabdscudlasdncpfe`fcq`h`ccn`j`jeicsdy`mdvdz`uejenbob`afemecegfo````",
+"``````bqegdpfeafba`ocudvdncpcy`tcnd`dzct`c`jcq`ccndncndnaraj`ke`dzesevdueqdvekdpblfl````",
+"````fvfpanaqbpddbobhaecu`fdhctcq`h`m`tdjct`o`rcm`eaj`ycqcpdwaj`nedatbhexefdbddbgakbqch``",
+"````fuftegbuembo`s`xdsencvcscncncycsdjdi`l`b`b`b`ldkcq`cd`eiedbf`gbfffahbe`rdkexezbrfi``",
+"````cdbkakbuemfddgdgcvemaj`hac`dcmcme``l`b`a`aey`aeccu`d`yedbuea`u`qcababo`raoembzfuce``",
+"````fcbdbmbuamfmdm`i`gbfeaarap`t`dfecu`b`aeyeyey`aco`dcmcy`eeddw`pencxfmdxafdxexfac`fc``",
+"````bravalbifkbmei`xcvdqatdwcpawcndwcx`b`aeyeyey`bdpdodo`das`j`w`pdsbuazel`rfdbeakfpfl``",
+"````fcblbwehbe`rarbadu`mdncsbtdncqedcpco`b`a`a`acrcodnctajcsacdjcu`xdidqdsa`dkbealbjbr``",
+"``cgflfkb`bgamfdbndxazef`eeedzcsctdldh`ccocr`b`b`lef`hcyac`h`gfecscvendddgddehffanegbzfz",
+"````bzbqfmaqbtam`sarahds`uazcuct`nbudhcqcmcr`cdi`demd``fcwcs`p`p`edi`xdqdmdbeheobqegfy``",
+"````flfpblffaoeldd`o`xadabes`kcu`tepcq`fcnapdm`pajedej`f`d`fctdobfdddy`rababemecfgc`cc``",
+"````fuftegfgaiela``s`ibacxevaz`w`ndfctcndwaje`cpctdl`zbx`ycu`xdsdxebdm`raoahagdpbdaxfl``",
+"````fxbkayfmebaidbdeeuaret`iefcu`m`oazedawdzepd`cybfajczbfdseeaz`sdberafdca`aqakblfufx``",
+"````ccfwezfbbmaaamahfpehfmbc`sdg`eeebxazdw`gazajdwfeaz`vdncaehbseo`sdvdedkaialbsaxfvfx``",
+"````fzccblbjayaubcf`alfkeoeles`g`gcs`e`pcu`wcuf`el`idfaoabdydgbabo`o`sfeewakcdfpfrcfcj``",
+"``````flfwbjbdffaffedbauffdydy`o`gdqefef`icu`xdccxfa`xeeef`gdy`ua`aobiakbjbgecfpbybz````",
+"``````cecdbdbybvebbgbmewew`rddadcx`o`u`icvcvdicvahatdyei`oefbob`eualdkewdpblblfibyce````",
+"````````cefcfxc`fjekftekdedddcdyetafefdfda`gdq`qdgeiafbe`r`seuafbcekaibgfmfnaxfuby``````",
+"````````fvbzezc`fmaybgbuamafddaofdbobaaddmdcdsdydteiboeoabdcagbcaaemdpaqfkfyfpbycj``````",
+"``````````chfibdfiavegfjfwbudeabbhfdei`sdy`rabdtameiardbaofkbeamecbgecanfqfwcdch````````",
+"``````````clflfcfpbqanecauaudkdka`a`a`dxagdxaheqeabhdxagbtdkdralauakfgaxfhbrfxcj````````",
+"````````````cjfxbrfrbkanalfgbkbbbibudrf`exfpemdxemehbhemexalecalbibjbkfqfucech``````````",
+"``````````````fzcffobzaxbdanauffblezdkfafec`ftfeekb`alfralaqanblayavbrcbflfx````````````",
+"````````````````cjflccfcfcc`c`fgfmbjavavbsaub`fqdpb`bwegecfmccbqezbzbzflci``````````````",
+"``````````````````chcjcccdbkfcfhfregbkaxc`bjbsfkavfgc`c`bpbkbdbdfccffvfz````````````````",
+"````````````````````clcjbzbzfifcbrezbkfnbzbpaxbkbkfbfhbzfcftfiflcffxcl``````````````````",
+"````````````````````````clfsflfoficbbzflbqftbqftchfublfofuflcgcgcj``````````````````````",
+"````````````````````````````cjckchckcefvfsfufsfychciflflcgckfz``````````````````````````",
+"````````````````````````````````clclfzcjchcgcicgfxfvcgcjcl``````````````````````````````",
+"````````````````````````````````````````````cl``````````````````````````````````````````",
+"````````````````````````````````````````````````````````````````````````````````````````"
+};
diff --git a/hacks/images/bubbles/jade9.xpm b/hacks/images/bubbles/jade9.xpm
new file mode 100644 (file)
index 0000000..85f5ca9
--- /dev/null
@@ -0,0 +1,248 @@
+/* XPM */
+static char *jade9[] = {
+/* width height ncolors chars_per_pixel */
+"50 50 191 2",
+/* colors */
+"`` c None",
+"`a c #69E169",
+"`b c #35CB35",
+"`c c #23BD23",
+"`d c #1CB11C",
+"`e c #1AA71A",
+"`f c #169D16",
+"`g c #179717",
+"`h c #149914",
+"`i c #179317",
+"`j c #139713",
+"`k c #149514",
+"`l c #1A8B1A",
+"`m c #159315",
+"`n c #129312",
+"`o c #158B15",
+"`p c #128D12",
+"`q c #148914",
+"`r c #158715",
+"`s c #148514",
+"`t c #0F890F",
+"`u c #128312",
+"`v c #0F870F",
+"`w c #0E850E",
+"`x c #108110",
+"`y c #0D830D",
+"`z c #0F7F0F",
+"a` c #127912",
+"aa c #137513",
+"ab c #107710",
+"ac c #0C7D0C",
+"ad c #0E750E",
+"ae c #0F730F",
+"af c #0F6F0F",
+"ag c #0F6D0F",
+"ah c #0E6B0E",
+"ai c #0E690E",
+"aj c #077307",
+"ak c #0F650F",
+"al c #0E630E",
+"am c #0B630B",
+"an c #0D5B0D",
+"ao c #0A5F0A",
+"ap c #036703",
+"aq c #0B570B",
+"ar c #075D07",
+"as c #026502",
+"at c #046104",
+"au c #0A550A",
+"av c #0B530B",
+"aw c #016101",
+"ax c #0C4F0C",
+"ay c #0A510A",
+"az c #025B02",
+"b` c #094F09",
+"ba c #045704",
+"bb c #0A4D0A",
+"bc c #065306",
+"bd c #0A4B0A",
+"be c #065106",
+"bf c #015901",
+"bg c #074D07",
+"bh c #054F05",
+"bi c #074B07",
+"bj c #084908",
+"bk c #094709",
+"bl c #084508",
+"bm c #064706",
+"bn c #014F01",
+"bo c #004B00",
+"bp c #063D06",
+"bq c #063B06",
+"br c #073907",
+"bs c #033D03",
+"bt c #004100",
+"bu c #013F01",
+"bv c #033B03",
+"bw c #053505",
+"bx c #003D00",
+"by c #063306",
+"bz c #053105",
+"c` c #023502",
+"ca c #003700",
+"cb c #042B04",
+"cc c #042904",
+"cd c #012301",
+"ce c #022102",
+"cf c #011D01",
+"cg c #021B02",
+"ch c #011901",
+"ci c #011701",
+"cj c #011501",
+"ck c #011301",
+"cl c #010D01",
+"cm c #21B621",
+"cn c #1CB41C",
+"co c #22AA22",
+"cp c #1AAC1A",
+"cq c #18A818",
+"cr c #1F9C1F",
+"cs c #18A418",
+"ct c #17A217",
+"cu c #189E18",
+"cv c #189A18",
+"cw c #149C14",
+"cx c #149014",
+"cy c #119011",
+"cz c #128A12",
+"d` c #0F8C0F",
+"da c #128612",
+"db c #148214",
+"dc c #138013",
+"dd c #127E12",
+"de c #127C12",
+"df c #107C10",
+"dg c #0F7A0F",
+"dh c #0B800B",
+"di c #0E780E",
+"dj c #0B7C0B",
+"dk c #117211",
+"dl c #0A7A0A",
+"dm c #0E720E",
+"dn c #0A780A",
+"do c #0A760A",
+"dp c #106A10",
+"dq c #0B720B",
+"dr c #0F6A0F",
+"ds c #0A700A",
+"dt c #0A6E0A",
+"du c #0B6C0B",
+"dv c #0A6A0A",
+"dw c #0B680B",
+"dx c #067006",
+"dy c #0C660C",
+"dz c #0A660A",
+"e` c #056E05",
+"ea c #056C05",
+"eb c #0B620B",
+"ec c #0C600C",
+"ed c #0D5E0D",
+"ee c #056A05",
+"ef c #066806",
+"eg c #076407",
+"eh c #0D580D",
+"ei c #0A5C0A",
+"ej c #076007",
+"ek c #046404",
+"el c #0A5A0A",
+"em c #075A07",
+"en c #085808",
+"eo c #045E04",
+"ep c #095409",
+"eq c #015E01",
+"er c #055605",
+"es c #055405",
+"et c #015601",
+"eu c #015401",
+"ev c #035003",
+"ew c #015201",
+"ex c #034C03",
+"ey c #034A03",
+"ez c #B1FFB1",
+"f` c #074207",
+"fa c #034803",
+"fb c #044604",
+"fc c #074007",
+"fd c #083E08",
+"fe c #014601",
+"ff c #024402",
+"fg c #034203",
+"fh c #044004",
+"fi c #053805",
+"fj c #063606",
+"fk c #013A01",
+"fl c #023802",
+"fm c #052E05",
+"fn c #013401",
+"fo c #013201",
+"fp c #042C04",
+"fq c #013001",
+"fr c #012E01",
+"fs c #012C01",
+"ft c #042604",
+"fu c #012A01",
+"fv c #022802",
+"fw c #042404",
+"fx c #002600",
+"fy c #022002",
+"fz c #011E01",
+"g` c #001000",
+"ga c #000A00",
+/* pixels */
+"````````````````````````````````````````````````````````````````````````````````````````````````````",
+"``````````````````````````````````````fvcdfsbwbsehehfqbdblbkbqfm````````````````````````````````````",
+"````````````````````````````````fvfvc`ayakalepauaabcakdkfgb`aufnbjbkfp``````````````````````````````",
+"````````````````````````````cdehbmaqanelbeexfeexdragfraobedebcfobbayedbqbl``````````````````````````",
+"````````````````````````fmbdedbiecelbmfeah`rafdc`o`sfba`ecemaffeenbufkbiedfdfj``````````````````````",
+"``````````````````````fpehfhaqenebema`ejdm`i`gdvfhbadcfhba`oevdmdwahaoaodkakblcd````````````````````",
+"````````````````````fsbbbmeyelemaodb`i`i`u`icudqbeaha`ateu`g`rahbnabdzflenbudpbjbz``````````````````",
+"``````````````````fdfobidkfeab`rad`xdf`zdt`mcxekbheadsbxetatdvfaamewbodbfea`fgbpbvfr````````````````",
+"````````````````brfndpakbcdz`r`q`odids`ecuczcycueeenbfeeeq`eefac`xdiaebabiesfabxbkbdcf``````````````",
+"``````````````fdbdedebfea`ahab`saeel`v`ecucxffcpdj`h`fdobxaododtaccxdqeoewdbexc`drbsbkfj````````````",
+"````````````ftehfnanfla`bseg`u`x`peme``yeacpdzeeerdv`f`fcu`x`t`t`p`pcsatfkewbgexagdkcacdfw``````````",
+"``````````cjfifhagaiexdz`ibn`zcv`mdadn`yd``vapeqemdq`t`nap`odqcycsdjcxcuazbgejbobmdkecfnfuce````````",
+"``````````brbbdpaffeec`rdueo`iczeke``dcpcnapff`gdfasdjdjcs`wdndh`weqdx`g`patecevemameialbvbq````````",
+"````````chbqb`akaoeserdfeg`xdtbedxcpcncqcqdzasapdqaseedncme`cnctdjeq`ods`zdgaddvdf`saiepalbbcd``````",
+"````````brfmb`enbefe`qbaetbeef`t`ee`d``jdhem`mczdjdhcn`c`fdxasas`madbceq`uda`i`uejfea`dkakehbr``````",
+"``````cefpedbmelaiabdcegetfa`vcpajeqee`cdlaj`dcqcs`ccncq`jasev`zex`uemdxat`idteoaifnaheiedavblfw````",
+"``````bzfvalakfaafev`ucv`zfa`pcp`t`ycmctev`ncq`ccwcp`c`cd`btawas`gdxcyekdnddeo`uejbadwaiaiayf`ch````",
+"``````fpanakffakfebn`gca`z`w`taccncn`jdje`d``y`dda`qcmcm`jej`j`hfaajdl`kdxdgdmcafbdzdddebcakehby````",
+"````chblavakbifebiegdidtbhcxcp`fcpcmcycndh`jdqcrco`b`ba`die``cct`ydze`dxbfdddybudmbo`ra`aibmf`fuce``",
+"````cjfuaybmffeieladdgcuduaj`pct`fcmcpemaj`z`l`b`a`a`acoa`cmcmcpd`e``icp`eazbcefamah`rafdycafifscd``",
+"````byfdbvfbavfaep`o`ucvekffcvajajcq`fcyas`e`b`aezezez`a`b`ictcmd`eqeqekdoekenendybnabdyenbxfobdcc``",
+"````cdfqbjedbudyfhdz`ucx`zdodudwcp`ycmdw`kcm`b`aezezez`acr`i`dcndxasacdxcsdn`ofbbmemdfexfaakfhbdbr``",
+"````fmbpbsbmfffqfhemdt`i`pac`zdn`e`dcwebcyco`b`aezezez`a`lcodufaardocy`hcxczeoeuegej`oesfaakavblfp``",
+"````cbbqbkakepfeboarbneo`x`w`p`naddo`jcpcy`c`c`b`a`a`acrcrcz`ncnaj`u`v`w`pcx`x`gdzdmaedebgecaybyby``",
+"````fdfqaldpbiaoboev`idfeoeobfatdx`f`f`wdm`d`c`lcr`bcocrdp`pcq`ycy`kbffbfgcxdiba`o`sdcafdrbmavf`fd``",
+"````fmbzbdfhalffdudcejboazcvduekcucpcteq`d`e`e`icr`bdgaacpdjcq`h`kct`p`zdcefcvaddudwdbececanfhfqby``",
+"````fzfdbjfgepeybe`r`oeg`uegamekcpcp`kdz`kcncp`hekel`wdx`iap`v`d`e`ncu`vbcaf`i`idcabdeenecayc`bkfm``",
+"````fmfsaxb`ehaibh`rdm`i`zbnenbudt`wctdnd`cpcqdhctcu`jcy`tasexdn`ecv`m`zeienfn`o`oaoa`dkededaxfuby``",
+"````fmfxavf`edelebaedbddaretbcetazefcvekeqdhee`easdo`dcp`wda`vateqczegdqejbnamdmdda`ahdkdpaqbpcdfy``",
+"````fwfxbkfnfieddkabdebna`ewendf`icucubffaefdu`odabhea`pbcdf`y`metetdvewamfl`oaraea`a`fbanavbdfpcg``",
+"````g`fzfrf`bzfgakelemelb`bsbvdceucz`g`zdtdodj`peqatateeazarazacdsetazddamboam`rardedpfkavfqbdcdck``",
+"``````fwbzavbdbkelenbcfsbvfhbodzeo`g`gcz`i`z`gcsczetbxadcxeb`rab`gdt`qejbaaedcaffabtalfkbdaxfdfy````",
+"``````ftcdfqfvb`fgafexagfefhdkdudv`ocvdgejdv`zcucu`wcuffeteg`xewdt`ieg`qdcdweybtbvalbiedbjcccgfy````",
+"``````cjcfchc`c`fkecbibtbtesevexdcdg`i`oda`u`gcu`gdgewey`idtdqegcxeg`s`obofsbtaafgfkfcanfufdftcj````",
+"````````cgfyf`cdbvfkalaaexabdbafdbdmdzewdfdmda`o`idt`xduejbaaeai`qddbnfebtbhebafcafrbqfqfjfjcc``````",
+"````````cjchfubwflfkaubgakebdedy`sduevb`erdvdzdtdfdzdidfejevdkbodf`rendkendkalalayfnc`fxbrbyci``````",
+"``````````fwccbqfibpalakbjc`bxaiabambhfneradabdm`odfdzdvdmarardcaba`alaienauauakalfqcdbwfyfw````````",
+"``````````gafwfzblfqbjavaqfhdkbxafaoenbeaiaeabam`r`rabaoeyenafabaaexafdkdkelededehbzbwcccega````````",
+"````````````cjfwfmfdblbdalanbibuafakafeca`ebdyarexebexdkenbcaheibcaadrelauakbjavbdfdccfwcj``````````",
+"``````````````g`fzbzfdfiavbbaqfhedfuf`fkfbelffbtanbcenexeibeauffafecelalb`avbkbqchcdfwcg````````````",
+"````````````````g`fybzfjbdbkblehayfbbdalbgaqfgbuanblfbepauedakfgauaqehbsbpaxbwfmcbfmcg``````````````",
+"``````````````````cjccfzfdfcbqflbvfhcafhedb`aybib`bibpanedbsakalalfnfjfoaxf`fvcccccj````````````````",
+"````````````````````cjcgfmcecdfufufnbqbpanbmbqf`ehbmehedbdfvbbblblaxaxbkblcdfmfwg```````````````````",
+"``````````````````````cjclfwftbrbzbkfiaxfifqbdbkfqf`ehavavbpc`fzfrfxfjfdfycfceck````````````````````",
+"````````````````````````gacgfycbccbrbrfxfxbzbdbdbdfdfdcffzfqfmbzfdbrbyfwchcgcl``````````````````````",
+"````````````````````````````gag`fyfwcececcfpbybzcbfucbcbcfcdbyfmfmcicjcgga``````````````````````````",
+"````````````````````````````````gackcgcifychchcccfchcjckcgchccfycjg`ga``````````````````````````````",
+"``````````````````````````````````````gagagackcjchfycjchcgg`clga````````````````````````````````````",
+"````````````````````````````````````````````````````````````````````````````````````````````````````",
+"````````````````````````````````````````````````````````````````````````````````````````````````````"
+};
diff --git a/hacks/images/earth.xbm b/hacks/images/earth.xbm
new file mode 100644 (file)
index 0000000..dab546c
--- /dev/null
@@ -0,0 +1,2192 @@
+/* The surface of the earth.  Created with:
+   xearth -proj mercator -noshade -ppm \
+     | ppmtopgm | pgmtopbm -thresh | pbmtoxbm
+ */
+#define earth_width 512
+#define earth_height 512
+static char earth_bits[] = {
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xc1,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xfc,0x80,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0x0f,0xfc,0x00,0xc7,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0x07,0xfc,0x00,0xc7,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xdf,0xff,0x07,0xfc,0x01,0xc2,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0xff,0x3f,0xff,0xdf,0x3f,0x00,0x7e,0x00,
+ 0xc0,0xc1,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x01,0xfe,0x1f,0xfe,0xff,
+ 0x3f,0x00,0x1e,0x00,0xc0,0x01,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x03,
+ 0xfe,0x1f,0xfc,0xff,0x3f,0x00,0x3f,0x00,0xc0,0x00,0xfe,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0x0f,0xfe,0x1f,0xfc,0xff,0x37,0x00,0x3f,0x00,0x80,0x00,0xe0,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xf7,0x7f,0xff,0x1f,0xfc,0xff,0x03,0x00,0x7f,
+ 0x00,0x80,0x00,0xe2,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf7,0xff,0xff,0x1f,0xfc,
+ 0xff,0x03,0x00,0x8f,0x03,0x80,0x00,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,
+ 0xf0,0xff,0x1f,0xfc,0xff,0x03,0x00,0x0f,0x00,0x00,0x00,0xc0,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0x3f,0xc0,0xff,0x3f,0xf8,0xff,0x07,0x00,0x0f,0x00,0x00,0x00,
+ 0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0x3f,0xc0,0x3f,0xe0,0xff,0x0f,0xf8,0xff,0x03,0x00,
+ 0xff,0x0c,0x00,0x00,0x00,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0xc0,0x1f,0xf0,0xff,0x03,
+ 0xf0,0xff,0x01,0x00,0x3f,0x00,0x00,0x00,0x00,0xfc,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x07,0xc0,
+ 0x1f,0xf8,0xff,0x07,0xf0,0xff,0x00,0x00,0x3f,0x00,0x00,0x00,0x00,0xfc,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0x03,0xe0,0x3f,0xf8,0xff,0x07,0xf0,0xff,0x03,0x00,0x7e,0x00,0x00,
+ 0x00,0x00,0xf8,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0x01,0xe0,0x7f,0xfc,0xff,0x3f,0xf0,0xff,0x07,
+ 0x00,0xfe,0x01,0x00,0x00,0x00,0xf8,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0xf0,0xff,0xff,0xff,
+ 0x3f,0x70,0xff,0x0f,0x00,0xf3,0x07,0x00,0x00,0x00,0xf8,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x3f,0x00,
+ 0xf0,0xff,0xff,0xff,0x7f,0x78,0xfc,0x1f,0x00,0xe3,0x0f,0x0e,0x00,0x00,0xfc,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0x0f,0x40,0xf0,0xff,0xff,0xef,0x7f,0x38,0xfc,0x30,0x80,0xc3,0x0f,
+ 0x03,0x00,0x00,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0x60,0xfc,0xff,0xff,0xef,0x7f,0x38,0xfc,
+ 0x00,0x80,0xc1,0xfd,0x03,0x00,0x00,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x07,0x70,0xfe,0xff,0xff,
+ 0xef,0x7f,0x38,0xf8,0x00,0x80,0xc1,0x70,0x06,0x00,0x00,0xe0,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x1f,
+ 0xf8,0xff,0xff,0xff,0xef,0xff,0x3c,0xf8,0x00,0x80,0x41,0x00,0x00,0x00,0x00,
+ 0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0x7f,0xfc,0xff,0xff,0xff,0xef,0xff,0x3f,0xf8,0x00,0x80,0x41,
+ 0x00,0x00,0x00,0x00,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0x87,0xff,0xff,0xff,0xff,0x3f,
+ 0xfc,0x00,0x80,0x41,0x00,0x00,0x00,0x00,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xcf,0x81,0xff,
+ 0xf9,0xff,0xff,0x3f,0xfc,0x00,0xc0,0x41,0x00,0x00,0x00,0x00,0xf0,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xe7,0x01,0xfe,0xf8,0xff,0xff,0xff,0x7f,0x00,0xf1,0x40,0x00,0x00,0x00,
+ 0x06,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xe7,0x03,0x7e,0xf8,0xff,0xff,0xff,0xff,0x00,0xff,
+ 0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0x00,0x7c,0xf8,0xff,0xff,
+ 0x7f,0xfe,0x80,0xff,0x00,0x00,0x00,0x00,0xf8,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x01,
+ 0x7c,0xfc,0xff,0xff,0x3f,0xfc,0xcf,0x41,0x00,0x00,0x00,0x00,0xf0,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0x00,0x7c,0xfc,0xf7,0xff,0x7f,0xf8,0xff,0xc0,0x01,0x00,0x00,
+ 0x80,0xff,0xd9,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0x1f,0x00,0x7c,0xfc,0xf7,0xff,0xff,0xff,0x7f,
+ 0x80,0x03,0x00,0x00,0xf8,0xff,0x08,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x1f,0x00,0x78,0xf8,0xff,
+ 0xff,0xff,0xff,0x7f,0x00,0x00,0x00,0xc0,0xff,0x7f,0x08,0xfc,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x3f,
+ 0x00,0x78,0xf8,0xe3,0xf3,0xf7,0xff,0xff,0x07,0x00,0x0c,0xf3,0x7f,0x27,0x08,
+ 0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0x0d,0x00,0xc0,0x67,0xe3,0xc3,0xbf,0xff,0x07,0x80,0x39,
+ 0xf7,0x0f,0x00,0x08,0x36,0x1f,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0x00,0xc0,0x7f,0xc3,0xc3,0xbf,
+ 0xc7,0x03,0x80,0xf7,0xff,0x07,0x00,0x00,0x16,0x3f,0xbc,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0xf0,0xff,0xff,0x01,0xc0,
+ 0x7f,0x82,0x83,0xff,0xc7,0x01,0x00,0xfe,0xff,0x07,0x00,0x00,0x1c,0x4b,0x1c,
+ 0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0xf0,
+ 0xff,0x0f,0x00,0xe0,0x3f,0xc0,0x83,0xff,0xc7,0x00,0x00,0xfc,0xff,0x07,0x00,
+ 0x00,0x08,0x8b,0x0c,0xf8,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0x0f,0xe0,0xff,0x03,0x00,0xe0,0x0f,0xc0,0x87,0xff,0xc7,0x08,0x00,
+ 0xf8,0xff,0x1f,0x00,0x00,0x00,0x8b,0x00,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0xc0,0xff,0x07,0x70,0x70,0x0f,0xc0,0x07,
+ 0xfe,0x84,0x05,0x00,0xfc,0xff,0x0f,0x00,0x00,0x00,0x0f,0x00,0xe0,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0x00,0xf8,0x07,0xfe,
+ 0x3f,0xff,0xe1,0x1f,0x2c,0x00,0x01,0x00,0xff,0xff,0x07,0x00,0x00,0x00,0x03,
+ 0x00,0xc0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,
+ 0x00,0xf0,0xff,0xff,0xff,0xff,0xe0,0x3f,0x1c,0x00,0x00,0x00,0xff,0xff,0x03,
+ 0x00,0x00,0x00,0x00,0x00,0xc4,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0x0f,0x00,0xf0,0xff,0xff,0xff,0x3f,0xe0,0x3f,0x38,0x00,0x10,
+ 0xc8,0xff,0xef,0x01,0x00,0x00,0x00,0x00,0x00,0xf0,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x07,0x00,0xe0,0xff,0xff,0xff,0x3f,0xf0,
+ 0x3f,0x78,0x00,0x18,0xfc,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x07,0x00,0xe0,0xff,
+ 0xff,0xff,0x3f,0xf8,0x3e,0xfe,0x01,0x30,0xfe,0x07,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0xc0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0x03,0x00,0xe0,0xff,0xff,0xff,0xff,0x3f,0x3c,0xfe,0x03,0xc0,0xff,0x07,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0x03,0x00,0xc0,0xff,0xff,0xff,0xff,0x1f,0x3c,0xfc,0x27,
+ 0xc0,0xff,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x01,0x00,0xf0,0xff,0xff,0xff,0xff,
+ 0x1f,0x1c,0xfc,0xff,0xc0,0xff,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x80,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x01,0x00,0x1c,
+ 0xff,0xff,0xff,0xff,0x1f,0x0c,0xfc,0xff,0x81,0xff,0x0f,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0xf0,0x81,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0x00,0x00,0x03,0xff,0xff,0xff,0xff,0x3f,0x0c,0xf8,0xff,0x81,0xff,0x1f,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc3,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0x00,0xc0,0x00,0xff,0x7f,0xfc,0xff,0x7f,0x0e,0xe0,
+ 0xff,0xc1,0xff,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0x00,0x60,0x80,0xff,0x7f,0xf8,
+ 0xff,0xff,0x0f,0xc0,0xf1,0xff,0xff,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0x00,0x30,
+ 0x80,0xf0,0x4f,0xf8,0x37,0xff,0x0f,0x00,0xc0,0xff,0xff,0xfb,0x01,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0xe7,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0x00,0x38,0x00,0x70,0x07,0xfc,0xe3,0xff,0x3f,0x00,0x80,0xfb,0xff,
+ 0xa1,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0x01,0x1c,0x00,0x70,0x87,0xfe,0x01,0xdf,0xff,
+ 0x01,0x00,0xff,0xff,0x43,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x03,0x1c,0x00,0x38,0x86,
+ 0xff,0x03,0x0f,0xff,0x01,0x00,0xff,0xff,0x07,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0xf8,0xf8,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x03,
+ 0x0e,0x00,0x00,0x06,0xff,0x83,0x07,0xfc,0x03,0x00,0xff,0xff,0x07,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x04,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0x07,0x1e,0x00,0x00,0x06,0x9f,0xc1,0x03,0xf8,0x3f,0x00,0xff,
+ 0xff,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0xf0,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x3f,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xc7,0x3f,0x00,0x00,0x82,0x1f,0xe1,0x03,
+ 0xf0,0xff,0x81,0xff,0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xf0,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0x1f,0xfb,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x07,0x00,
+ 0x86,0x1f,0xc0,0x03,0xf8,0xff,0xc3,0xff,0xff,0x03,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0xf8,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,
+ 0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0x1f,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0x00,0x00,0x86,0x3f,0xc0,0x01,0xfc,0xff,0xff,0xff,0xff,0x07,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0x7f,0xf8,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x07,0x00,0xdf,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0x1f,0x00,0x00,0x80,0x3f,0x80,0x01,0x7e,0xf8,0xff,
+ 0xff,0xff,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xf8,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x01,
+ 0x00,0x00,0xfe,0xff,0xff,0xff,0xff,0xfd,0xff,0x1f,0x00,0x00,0x80,0x7f,0x80,
+ 0x01,0x1f,0xf0,0xff,0xff,0xff,0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xf8,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xf3,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0x01,0x00,0x00,0xc0,0xf9,0xff,0xff,0xff,0xf9,0xff,0x3f,0x00,
+ 0x00,0x00,0x7f,0x80,0xb1,0x0f,0xf8,0xff,0xff,0xff,0xff,0x07,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0xc0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0x7f,0xf8,0xff,0xff,0xff,0xff,0xff,0xff,0x3f,0x30,0xe0,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0x00,0x00,0x00,0x00,0xf0,0xff,0xff,0xe7,
+ 0xf8,0xff,0xff,0x00,0x00,0x80,0xff,0xc0,0xf1,0x0f,0x3c,0xfe,0xff,0xff,0xff,
+ 0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0xf4,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0x7f,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0x3b,0x30,0xf0,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xc7,0xff,0xff,0xff,0x3f,0x00,0x00,0x00,0x00,
+ 0xc0,0xff,0xff,0x71,0x78,0xff,0xff,0x3f,0x00,0x80,0xff,0xc0,0xf9,0x07,0x0e,
+ 0xf4,0xff,0xff,0xff,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x03,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0x01,0xf1,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x83,0xff,0xff,0xff,0x1f,
+ 0x00,0x00,0x00,0x00,0x00,0xfc,0x7f,0x08,0x78,0xff,0xff,0x7f,0x00,0x80,0xff,
+ 0xe4,0xff,0x03,0x07,0xe0,0xff,0xff,0xff,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0x02,0xfb,
+ 0xff,0xff,0xff,0xff,0xff,0x01,0xf2,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xc1,
+ 0xff,0xff,0xff,0x0f,0x00,0x00,0x00,0x00,0x00,0xf8,0x23,0x06,0x30,0xe3,0x3f,
+ 0xe0,0x00,0x80,0xff,0xfd,0xfe,0x03,0x01,0x82,0xff,0xff,0xff,0x3f,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0x03,0xc3,0xff,0xff,0xff,0xff,0xff,0x03,0xf8,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xe1,0xff,0xff,0xff,0x0f,0x00,0x00,0x00,0x00,0x00,0xf0,0x01,
+ 0x00,0x00,0xc3,0x3f,0x00,0x00,0x80,0xff,0x7f,0xfc,0x81,0x01,0x00,0xff,0xff,
+ 0xff,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xdf,0xef,0xff,0xff,0xff,0x03,0x82,0xff,0xff,0xff,0xff,0x7f,0x03,0xfc,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfd,0xff,0xff,0xff,0x0f,0x00,0x00,0x00,
+ 0x00,0x00,0xc0,0x81,0x00,0x00,0x80,0x3f,0x00,0x00,0x00,0xff,0x3f,0xfc,0x81,
+ 0x01,0x00,0xff,0xff,0xff,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xf9,0xff,0xff,0xff,0x0f,0x83,0xff,0xff,0xff,
+ 0xff,0xff,0x03,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x46,0x00,0x00,0x00,0x7e,0x00,0x00,0x00,
+ 0xfe,0x1f,0xf8,0x81,0x03,0x06,0xff,0xff,0xff,0x1f,0x00,0x00,0x00,0x00,0x00,
+ 0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xbf,0xfd,0xf9,0xff,0xff,0xff,0xff,
+ 0xc3,0xff,0xff,0xff,0xff,0xff,0xc7,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x7c,0x00,0x00,0x00,0xfc,0x0f,0xf8,0x80,0x00,0x3f,0xff,0xff,0xff,0x1f,0x00,
+ 0x00,0x00,0x00,0x00,0xc0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xff,
+ 0xff,0xff,0xff,0xff,0xe3,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x07,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0xf8,0x03,0x00,0x00,0xf8,0x1f,0xf8,0x80,0x00,0xcf,0xff,
+ 0xff,0xff,0x3f,0x00,0x00,0x00,0x00,0x00,0xe0,0xff,0xff,0xff,0xff,0xbf,0xff,
+ 0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xf3,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x03,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x0f,0x00,0x00,0xf8,0x0f,0xfc,
+ 0x83,0x00,0x8c,0xff,0xff,0xff,0x3f,0x00,0x00,0x00,0x00,0x00,0xe0,0xff,0xff,
+ 0xff,0xff,0x1f,0xf9,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0e,0x00,
+ 0x00,0xf8,0x0f,0xf8,0x87,0x00,0x14,0xff,0xff,0xff,0x3f,0x00,0x00,0x00,0x00,
+ 0x00,0xf0,0xff,0xff,0xff,0x7f,0x17,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0x7f,0xfc,0xff,0xff,0xff,0xff,0xff,0xc3,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x0c,0x00,0x81,0xff,0x07,0xf8,0xc0,0x00,0x00,0xff,0xff,0xff,0x3f,
+ 0x00,0x00,0x00,0x00,0x00,0xe0,0xff,0xff,0xff,0x3f,0x71,0xe0,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0x3f,0xfe,0xff,0xff,0xff,0xff,0xff,0xc3,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0xe0,0x83,0xff,0x0e,0xf8,0x00,0x00,0xc0,
+ 0xff,0xff,0xff,0x1f,0x00,0x00,0x00,0x00,0x00,0xe0,0xff,0xff,0xff,0x3f,0x70,
+ 0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x3f,0x30,0xf8,0xff,0xff,0xff,
+ 0xff,0xf3,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xff,0x06,0x7e,0x0e,
+ 0xfc,0x01,0x00,0x00,0xfe,0xff,0xff,0x1f,0x00,0x00,0x00,0x00,0x00,0xe0,0xff,
+ 0xff,0xff,0x3f,0xe0,0xf8,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x3f,0x10,
+ 0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xcf,0xff,0xff,0xff,
+ 0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,
+ 0x1f,0x1c,0x7f,0x1c,0xfc,0x03,0x00,0x00,0xff,0xff,0xff,0x3f,0x00,0x00,0x00,
+ 0x00,0x00,0xc0,0xff,0xff,0xff,0x3f,0xe0,0xfd,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0x3f,0x00,0xe0,0xff,0xff,0xff,0xff,0xff,0x30,0xfc,0xff,0xff,0xff,
+ 0x0f,0xf0,0x8f,0xff,0xff,0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0xff,0x0f,0xfc,0x1f,0x7c,0xfe,0x0f,0x00,0x80,0xfe,0xff,0xff,
+ 0x1f,0x00,0x00,0x00,0x00,0x00,0xc0,0xff,0xff,0xff,0x3f,0xc0,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0x3f,0x00,0xe0,0xff,0xff,0xff,0xff,0x0f,0x04,
+ 0xfe,0x0f,0xfc,0xff,0x19,0x00,0x00,0xfe,0xff,0xff,0x07,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x7f,0xfc,0x3f,0x38,0xf8,0x0f,0x00,
+ 0x00,0xff,0xff,0xff,0x1f,0x00,0x00,0x00,0x00,0x00,0xdc,0xff,0xff,0xff,0x3f,
+ 0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x3f,0x00,0xc0,0xff,0xff,
+ 0xff,0xff,0x0f,0x10,0xf8,0x03,0xf8,0xff,0x3e,0x00,0x00,0xf8,0xff,0xff,0x0f,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0xf8,0x7f,
+ 0x18,0xf0,0x7f,0x00,0x00,0xf0,0xff,0xff,0x1f,0x00,0x00,0x00,0x00,0x00,0xfc,
+ 0xff,0xff,0xff,0x7f,0xe3,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x1f,
+ 0x00,0xc0,0xff,0xff,0xff,0xff,0x07,0x08,0xc0,0x01,0xf8,0x3f,0x3c,0x00,0x00,
+ 0xe0,0xff,0xff,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,
+ 0x00,0x1c,0xe0,0xff,0x38,0xf8,0x9f,0x01,0x00,0xf0,0xff,0xff,0x1f,0x00,0x00,
+ 0x00,0x00,0x00,0xfc,0xff,0xff,0xff,0xff,0x21,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0x3f,0x00,0xc0,0xff,0xff,0xff,0xff,0x07,0x00,0x00,0x00,0xf0,
+ 0x01,0x30,0x00,0x00,0x80,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x7c,0x00,0x00,0x10,0xc0,0x3f,0x3f,0xd8,0x0f,0x9f,0x01,0xfc,0xff,
+ 0xff,0x1f,0x00,0x00,0x00,0x00,0x00,0xfc,0xff,0xff,0xff,0x7f,0xf0,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x07,0x00,0xe0,0xff,0x9f,0xf9,0xff,0x0f,
+ 0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0x03,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x80,0x3f,0x00,0x00,0x10,0x00,0x3f,0x1e,0x98,0x0f,
+ 0xbe,0x01,0xf0,0xff,0xff,0x1f,0x00,0x00,0x00,0x00,0x00,0xf8,0xff,0xff,0xff,
+ 0xff,0x73,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0x00,0x00,0xe0,0xff,
+ 0x0f,0xf0,0xff,0x0f,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0xff,0xff,
+ 0xf7,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x78,0x02,0x00,0x10,0x00,
+ 0x40,0x06,0x88,0x1f,0xee,0x01,0xe8,0xff,0xff,0x0f,0x00,0x00,0x00,0x00,0x00,
+ 0xf8,0xff,0xff,0xff,0xff,0x39,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,
+ 0x00,0x00,0xb0,0xff,0x1f,0xf8,0xff,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x83,0xff,0xf3,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfa,
+ 0x03,0x00,0x10,0x00,0x00,0x02,0x80,0x0f,0xfc,0x03,0x80,0xff,0xff,0x0f,0x00,
+ 0x00,0x00,0x00,0x00,0xf8,0xff,0xff,0xff,0x7f,0x78,0xfe,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0x3f,0x00,0x10,0xf8,0xff,0x1f,0xe4,0xff,0x03,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0xfe,0x01,0x00,0x10,0x00,0x00,0x02,0x80,0x07,0xfc,0x03,0x80,
+ 0xff,0xff,0x27,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xfc,0xff,
+ 0xff,0xff,0xff,0xff,0xe3,0xff,0xff,0x0f,0x00,0x08,0xf8,0x83,0x7f,0xc6,0x3f,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x7c,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3e,0x00,0x00,0x00,0x00,0x00,0x02,0xc0,
+ 0x03,0xde,0x07,0xd0,0xff,0xff,0x23,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,
+ 0xff,0xff,0xfd,0xff,0xff,0xff,0xff,0xff,0xe3,0xff,0xff,0x07,0x00,0x07,0x08,
+ 0x01,0x00,0xe4,0x33,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x3e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x27,0x00,0x00,0x00,
+ 0x00,0x00,0x02,0xc0,0x02,0xff,0x03,0x10,0xff,0xff,0x37,0x00,0x00,0x00,0x00,
+ 0x00,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf1,0xff,0xff,
+ 0x07,0x00,0x01,0x1c,0x00,0x00,0xc0,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x3e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x12,0x00,0x00,0x00,0x00,0x00,0x01,0xc0,0x01,0xff,0x01,0x00,0xff,0xff,0x3f,
+ 0x00,0x00,0x00,0x00,0xc0,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0x3f,0xf8,0xff,0xf7,0x03,0x00,0x02,0x0e,0x00,0x00,0x80,0x07,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x80,0xff,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x00,0xff,0x0f,
+ 0xc0,0xff,0xff,0x3f,0x00,0x00,0x00,0x00,0x40,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0x1f,0xfc,0xff,0xff,0x01,0x00,0x00,0x06,0x02,0x00,0x00,
+ 0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0xc0,0xff,0x00,0x06,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0xff,0x1f,0x20,0xff,0xff,0x7f,0x00,0x00,0x00,0x00,0x8c,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0xfe,0xff,0xff,0x01,0x00,0x00,
+ 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xec,
+ 0xc0,0xff,0x01,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0x1c,0xc0,0xff,0xff,0x67,0x00,0x00,0x00,
+ 0x80,0x0b,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x87,0xff,0xff,
+ 0xff,0x03,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0xfc,0xc0,0xff,0xff,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0x14,0xe0,0xff,0xff,
+ 0x43,0x00,0x00,0x00,0x00,0xda,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xc3,0xff,0xff,0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0xc1,0xff,0xff,0x07,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x7f,
+ 0x34,0xe0,0xff,0xff,0x01,0x00,0x00,0x00,0x00,0xf7,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xc1,0xff,0xff,0xff,0x07,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0xcf,0xff,0xff,
+ 0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x81,0xc9,0x7f,0x3e,0xc0,0xff,0xff,0x11,0x00,0x00,0x00,0x00,0xe2,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xe1,0xff,0xff,0xff,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,
+ 0xff,0xff,0xff,0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x02,0xff,0xff,0x3f,0xc0,0xff,0xff,0x63,0x00,0x00,
+ 0x00,0x00,0xf2,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf1,0xff,
+ 0xff,0x1f,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0xf8,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc4,0xfb,0xff,0x1f,0x00,0xff,
+ 0xff,0x3b,0x00,0x00,0x00,0x00,0xf4,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xf1,0xff,0xff,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0xff,0xff,0xf0,0x1f,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x68,0xff,
+ 0xff,0x1f,0x00,0xfe,0xff,0x3f,0x00,0x00,0x00,0x20,0xf8,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xf8,0xff,0xff,0x0f,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xff,0xff,0xe7,
+ 0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x60,0xfe,0xff,0x07,0x00,0xfe,0xff,0x3f,0x00,0x00,0x00,0x00,0xf8,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf8,0xff,0xff,0x0f,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0xff,0xff,0xff,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x20,0xfc,0xff,0xc3,0x00,0xfe,0xff,0x1f,0x00,
+ 0x00,0x00,0x80,0xf8,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfc,
+ 0xff,0xfe,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x30,0x38,0x00,0x30,0x00,0x00,0x30,0xf8,0xff,0xc3,0x01,
+ 0xf8,0xff,0x03,0x00,0x00,0x00,0x90,0xf8,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xfd,0xff,0xb9,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0xff,0xff,0x07,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x1c,0x00,0x18,0x00,0x00,0x38,
+ 0xf0,0xef,0x03,0x10,0xfc,0xff,0x09,0x00,0x00,0x00,0x88,0xf8,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xfc,0xff,0xb0,0x71,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xff,
+ 0xff,0x07,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x07,0x00,
+ 0x00,0x00,0x90,0x1f,0xe0,0x47,0x00,0x30,0xf0,0xff,0x16,0x00,0x00,0x00,0xf0,
+ 0xf9,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x3f,0xfe,0x7f,0xb0,0xc3,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0xfc,0xff,0xff,0x07,0x00,0x00,0xe0,0x1c,0x00,0x00,0x00,0x00,0x00,
+ 0x80,0xf8,0x03,0x00,0x00,0x00,0xc0,0x0f,0xe0,0x03,0x00,0x3c,0xf0,0xff,0x08,
+ 0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x3f,
+ 0xfe,0x7f,0x90,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0xc0,0xff,0xff,0xff,0x1f,0x00,0x00,0x10,0x3c,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0xc0,0x3f,0xe6,0x07,0x10,
+ 0x38,0xf8,0xff,0x04,0x00,0x00,0x00,0x00,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0x3f,0xfe,0x7f,0x90,0x81,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xff,0xff,0xff,0x1f,0x00,
+ 0x00,0x18,0xdc,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0x00,0x00,0x00,0x00,0xf8,
+ 0x3f,0xc7,0xef,0x30,0x38,0xfc,0xff,0x01,0x00,0x00,0x00,0x00,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x1f,0xfe,0x7f,0x18,0x87,0x01,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0xff,
+ 0xff,0xff,0x1f,0x00,0x00,0x1c,0xfc,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0xfc,0xff,0xff,0xff,0x01,0x78,0xfe,0xff,0x00,0x00,0x00,0x00,
+ 0xc0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x1f,0xfe,0x3f,0x30,
+ 0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0xfc,0xff,0xff,0xff,0x1f,0x00,0x00,0x0c,0xff,0x7f,0x03,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0xff,0xff,0xff,0x03,0xf0,0xff,0xff,
+ 0x00,0x00,0x00,0x10,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0x7f,0xfc,0x3f,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x06,0x00,0xfe,0xff,0xff,0xff,0x33,0x02,0x80,0x9e,0xff,
+ 0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xf9,0xfd,
+ 0x03,0xe0,0xff,0xff,0x00,0x00,0x00,0x90,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xbf,0xf8,0x3f,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0xff,0xff,0xff,0xff,0xf3,
+ 0x07,0x20,0xcf,0xff,0xff,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0xff,0xff,0xfc,0xff,0x07,0xe0,0xff,0x7f,0x00,0x00,0x00,0xf8,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xf0,0x7f,0x20,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0xff,
+ 0xff,0xff,0xff,0xff,0x07,0x00,0xfe,0xff,0xff,0x4f,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0x87,0xe0,0xff,0xff,0x00,0x00,0x00,
+ 0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0x7f,
+ 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x02,0x80,0xff,0xff,0xff,0xff,0xff,0x07,0x00,0xfe,0xff,0xff,0x9f,0x02,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0xff,0xff,0x9f,0xf9,0x0f,0xe1,0xff,
+ 0xff,0x00,0x00,0x00,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xc9,0xff,
+ 0xff,0xff,0x9f,0x3f,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x84,0x03,0xc0,0xff,0xff,0xff,0xff,0xff,0xf7,0x07,0xfe,
+ 0xff,0xff,0xff,0x05,0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0xc0,0xff,0xff,0xdf,
+ 0xf0,0x0f,0xe3,0xff,0xff,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0x2f,0xc0,0xff,0xff,0xff,0xbf,0xfc,0x60,0x03,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8f,0x03,0xe4,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0x07,0xfb,0xff,0xff,0x7f,0x0a,0x00,0x00,0x00,0x00,0x08,0x00,0x00,
+ 0xe0,0xff,0xff,0xff,0x00,0x3f,0xf6,0xff,0xff,0x03,0x00,0xc8,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0x07,0xe0,0xff,0xff,0xff,0x7f,0xf0,0xe0,0x04,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xcf,0x01,0xef,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0x97,0xfb,0xff,0xff,0x7f,0x0a,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0xe0,0xff,0xff,0xff,0x01,0x3f,0xfc,0xff,0xff,0x01,0x00,
+ 0xf7,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0x05,0x00,0xff,0xff,0xfb,0xff,
+ 0xc0,0xc1,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x80,0xff,0xa0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xc7,0xf8,0xff,0xff,0xff,
+ 0x0b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xff,0xff,0xff,0x00,0xfe,0xfc,
+ 0xff,0xff,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,
+ 0xfe,0xff,0xf3,0xdf,0x00,0xc1,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0xc0,0xff,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xe3,
+ 0xfc,0xff,0xff,0xff,0x1d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xff,0xff,
+ 0xff,0x00,0xfe,0xfd,0xff,0xff,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0x7f,0x00,0x04,0xf0,0xff,0x7f,0x47,0x00,0xc0,0x08,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x7f,0xfc,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xf1,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0xe0,0xff,0xff,0xff,0x00,0xfc,0xff,0xff,0xff,0x00,0xc0,0xff,0xff,0x7f,
+ 0xff,0xff,0xff,0xff,0xff,0x2f,0x00,0x00,0xe0,0x9f,0x1f,0x01,0x00,0xc0,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x7f,0xfc,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf8,0xff,0xff,0xff,0xff,0x3d,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x01,0x80,0xff,0xff,0xff,0x00,0xf0,0xf7,0xff,0xff,0x01,
+ 0xc0,0xff,0xff,0x1f,0xbf,0xff,0xff,0xff,0xff,0x3f,0x00,0x00,0xc0,0x1f,0x0f,
+ 0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0xe0,0x3f,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xfc,0xff,0xff,0xff,
+ 0xff,0x0f,0x00,0x00,0x00,0x00,0x00,0x80,0x01,0x80,0xff,0xff,0xff,0x00,0xf0,
+ 0xff,0xff,0xff,0x01,0xc0,0xff,0xff,0x7f,0x01,0xff,0xff,0xff,0xff,0x0f,0x00,
+ 0x00,0x00,0x1e,0x07,0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0xe0,0x1f,0xf4,0xff,0xff,0xff,0xff,0xff,0xff,0x3f,
+ 0xfe,0xff,0xff,0xff,0xff,0x2f,0x00,0x38,0x00,0x00,0x00,0x80,0x00,0x80,0xff,
+ 0xff,0x7f,0x00,0xf0,0xff,0xff,0xff,0x01,0xe0,0xff,0xff,0x7f,0x00,0xff,0xff,
+ 0xff,0xff,0x0f,0x00,0x00,0x00,0xdc,0x01,0x00,0x00,0x20,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x1f,0xfe,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0x0f,0xff,0xff,0xff,0xff,0xff,0x4f,0x02,0x00,0x00,0x00,0x00,
+ 0x80,0x00,0x80,0xff,0xff,0x3f,0x00,0xf8,0xff,0xff,0xff,0x01,0xf0,0xff,0xff,
+ 0x3f,0x00,0xfe,0xff,0xff,0xff,0x07,0x00,0x00,0x00,0x9c,0x01,0x00,0x00,0x38,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xf9,0x1f,
+ 0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xd7,0xff,0xff,0xff,0xff,0xff,0xdf,0x00,
+ 0x00,0x00,0x00,0x00,0x40,0x00,0x00,0xff,0xff,0x3f,0x00,0xf8,0xfb,0xff,0xff,
+ 0x03,0xf8,0xff,0xff,0x7f,0x00,0xfe,0xff,0xff,0xff,0x03,0x00,0x00,0x00,0x3c,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0xf0,0xfd,0x0f,0xfa,0xff,0xff,0xff,0xff,0xff,0xff,0xf3,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xf8,0xff,0x3f,0x00,
+ 0xf8,0xfb,0xff,0xff,0x03,0xf8,0xff,0xff,0x3f,0x00,0xff,0xff,0xff,0xff,0x03,
+ 0x00,0x00,0x01,0x1e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0xc0,0xff,0xff,0x07,0xf8,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0xf0,0xff,0x7f,0x00,0xf8,0xf1,0xff,0xff,0x03,0xfc,0xff,0xff,0x7f,0x80,0xff,
+ 0xff,0xff,0xff,0x01,0x00,0x00,0x06,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0xff,0xff,0x03,0xf8,0xff,0xff,
+ 0xff,0xff,0xff,0x7f,0xfe,0xff,0xff,0xff,0xff,0xff,0xaf,0x03,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0xe0,0xff,0xff,0x00,0xe0,0xf1,0xff,0xff,0x27,0xfc,0xff,
+ 0xff,0xff,0xf0,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0xbc,0x01,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0xff,0xff,
+ 0x03,0xf8,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xcf,
+ 0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0xff,0xff,0x00,0x60,0xf0,0xff,
+ 0xff,0x3f,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x70,0x00,0xfc,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0xf8,0xff,0xff,0x01,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xdf,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xff,0xff,
+ 0x00,0x00,0xf0,0xff,0xff,0x7f,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,
+ 0x00,0x78,0x00,0xfc,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0xfc,0xff,0xff,0x01,0xfc,0xff,0xff,0xff,0xff,0xff,
+ 0xef,0xff,0xff,0xff,0xff,0xff,0xff,0xdf,0x07,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0xff,0xff,0x00,0x00,0xf0,0xff,0xff,0xbf,0xfe,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0x3f,0x00,0x78,0x00,0xdc,0x01,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xff,0xff,0x01,0xfc,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0x77,0x00,0x00,0xe0,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x1f,0x00,0x38,0x00,0x9c,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0xff,
+ 0xff,0x01,0xfc,0xff,0xff,0xff,0xff,0xff,0xfd,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0x3f,0x00,0x00,0x00,0x00,0x10,0x24,0x00,0x00,0xf0,0x7f,0x00,0x00,0xe0,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x1f,0x00,0x1c,0x00,
+ 0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0xff,0xff,0xff,0x01,0xf8,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0x1f,0x00,0x00,0x00,0x00,0x00,0x32,0x00,0x00,0xc0,
+ 0x3f,0x00,0x00,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0x07,0x00,0x0e,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0x01,0xf8,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x2f,0x00,0x00,0x00,0x00,0x00,
+ 0x3e,0x00,0x00,0xc0,0x0f,0x00,0x00,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0x03,0x00,0x07,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0x01,0xfe,
+ 0xff,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x1f,0x00,
+ 0x00,0x00,0x00,0x00,0x30,0x00,0x00,0xc0,0x03,0x00,0x00,0xe0,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x01,0xc0,0x83,0x02,0x04,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xff,
+ 0xff,0xff,0x01,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0x7f,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0xc0,0x03,0x00,0x00,
+ 0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0x00,0xc0,0x03,
+ 0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0xc0,0xff,0xff,0xff,0x03,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0x9f,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,
+ 0xc0,0x07,0x00,0x00,0xc0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0x7f,0x00,0xc0,0x03,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xff,0xff,0xff,0x03,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x1f,0x02,0x00,0x00,0x00,
+ 0x00,0x40,0x00,0x00,0xa0,0x03,0x00,0x20,0xc0,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0x7f,0x01,0xe0,0x03,0x00,0x04,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xff,0xff,0xff,0x83,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,
+ 0x06,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0xc0,0x03,0x00,0x00,0x80,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xbf,0x7f,0x00,0xe0,0x03,0x26,0x0c,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,
+ 0xbf,0xff,0xff,0xc7,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0x0c,0x00,0x00,0x00,0x00,0x48,0x00,0x00,0xc0,0x07,0x00,
+ 0xc0,0x01,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x3f,0x00,0xe0,
+ 0x03,0x60,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0xc0,0xf9,0xff,0xff,0xc7,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x09,0x00,0x00,0x00,0x00,0x48,0x00,
+ 0x00,0x80,0x07,0x00,0x00,0x00,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0x7f,0x00,0xc0,0x03,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x31,0xff,0xff,0xcf,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x1b,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x80,0x03,0x00,0x00,0x80,0xfc,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0x3f,0x00,0x80,0x8f,0xe7,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0xff,0xff,
+ 0xef,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0x1b,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0xfc,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xf9,0x7f,0x10,0x80,0xff,0x07,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x20,0xff,0xff,0xef,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0x13,0x00,0x00,0x00,0x00,0x00,0x02,0x04,0x00,0x00,
+ 0x00,0x00,0x00,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf9,0x3f,0x18,
+ 0xc1,0x3f,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x01,0x00,0x00,0x00,0x00,0x20,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x03,0x00,0x00,0x00,0x00,0x00,
+ 0x03,0x04,0x00,0x00,0x06,0x01,0x00,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xfc,0x7f,0x9c,0xe0,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0xfe,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x03,0x00,
+ 0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0xf8,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xe0,0xff,0x3f,0xf0,0x17,0x00,0x40,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x60,0xfe,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,
+ 0xf8,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf0,0xff,0x3f,0xf0,0x1f,0x00,
+ 0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,
+ 0x00,0x00,0x60,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x3e,0x00,
+ 0x00,0x00,0x00,0x00,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf8,0xff,
+ 0x37,0xb0,0x1f,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x80,0x01,0x00,0x00,0x00,0x00,0x60,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x03,0x00,0x00,0x00,0x00,
+ 0x00,0x80,0x3f,0x00,0x00,0x00,0x38,0xc0,0xfb,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xfc,0xff,0x77,0xf0,0x13,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0xe0,0xfc,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x03,
+ 0x00,0x00,0x00,0x00,0x00,0xc0,0x7f,0x00,0x00,0x00,0xfc,0xe3,0xfd,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xf1,0xff,0x71,0xf0,0x01,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x00,0x00,0x00,0x00,0x00,0xe0,
+ 0xf8,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0x03,0x00,0x00,0x00,0x00,0x00,0xc0,0xfd,0x00,0x00,0x00,0x7f,
+ 0xfe,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x8f,0xe0,0xff,0x79,0xfe,0x01,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x40,0x00,0x00,
+ 0x00,0x00,0x00,0xe0,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,
+ 0x00,0x00,0x80,0xc0,0xfd,0xf8,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x87,0xe3,
+ 0xff,0x51,0xfe,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x20,0x00,0x00,0x00,0x00,0x00,0xe0,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x03,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x7f,0xf8,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xc3,0xc3,0xff,0xf9,0xff,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0xe0,0xfe,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x03,0x00,0x00,0xf0,0x3f,0xe0,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xc3,0xc3,0xff,0xfb,0xff,0x00,0x00,0x00,0x00,
+ 0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,
+ 0xe0,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x13,0x00,0x00,
+ 0xe0,0x1f,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xc3,0xc1,0xff,0x93,0x47,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0xf0,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x1c,0x3e,0x00,0x00,0xf0,0x1f,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xc1,
+ 0xc1,0x3f,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0xf8,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x03,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x08,0x3e,0x00,0x00,0xe0,0xff,0xc7,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xf1,0x00,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0xf8,0xfe,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x0e,0x00,0x00,0x20,0xfb,0xcb,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0x00,0x0f,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0xf8,0xff,0xfd,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x04,0x00,
+ 0x00,0x90,0xfd,0xdf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x83,0x07,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0xf8,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x0c,0xc4,0x07,0x00,0x2e,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0x80,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x7d,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x03,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x0c,0x00,0x06,0xc0,0x03,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0x7f,0xfe,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0xd1,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x7a,0x00,0xf0,0xf3,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x08,0xfe,0xc1,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1f,
+ 0x00,0xf8,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x37,0x00,
+ 0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xc1,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x07,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0xf8,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7f,0xf0,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x07,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xff,
+ 0xf7,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0xf8,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0xa0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x03,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xff,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x1f,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0xff,0xfe,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,
+ 0x7f,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x07,0x20,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0xe0,0x01,0x0c,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0xfe,0x7f,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0xfa,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0x0f,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0xf0,0x01,0x0e,0x00,0x10,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xfc,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0xfa,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0x07,0x00,0x00,0x00,0x00,0x30,0x3c,0x00,0xfc,0x01,0x0f,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x80,0xff,0x7f,0xfc,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x07,0x00,0xa0,0x00,0x00,0x78,0x3c,
+ 0x00,0x7c,0x00,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0xc2,
+ 0xff,0x7f,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xe0,0x07,0x00,0xe0,
+ 0x00,0x00,0xf8,0x00,0x00,0x3e,0x00,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0xb8,0x87,0xff,0x7f,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x07,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0x00,0x00,0xc0,0xe3,0x01,0x00,0xfc,0x3e,0x00,0x7c,0x00,0x0d,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x07,0xff,0x3f,0xfc,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0x00,0x00,0xef,0xc3,0x01,0x00,0xfc,0x7f,0x00,0x7c,0x00,
+ 0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x07,0xff,0x1f,0xfe,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0xff,0xc2,0x07,0x00,0xfe,
+ 0xff,0x03,0xfc,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,
+ 0x1f,0xfe,0x07,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x8f,0x01,0x00,0x00,0x00,0x00,0x00,0x80,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0xff,
+ 0x86,0x0f,0x00,0xfe,0xff,0x07,0xf8,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x08,0x1f,0xfe,0x07,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x9f,0x03,0x00,0x00,
+ 0x00,0x00,0x00,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0x00,0xc0,0xff,0x0f,0x1e,0x00,0xfe,0xff,0x07,0xf0,0x07,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x1f,0xfc,0x80,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0x9f,0x03,0x00,0x00,0x00,0x00,0x00,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0x00,0xe0,0xff,0x3e,0x3e,0x00,0x7e,0xfc,0x03,0xe0,
+ 0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x3f,0x3c,0xf0,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0x3f,0x03,0x00,0x00,0x00,0x00,0x00,0xfc,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0x00,0xf0,0x7f,0x7e,0x38,0x00,
+ 0x10,0xe0,0x00,0xc0,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0xf0,0x1f,0x9f,0xf2,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0x06,0x00,0x00,0x00,0x00,0x00,
+ 0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0x00,0x78,
+ 0x7f,0xfe,0x34,0xf8,0x03,0x00,0x00,0xe0,0x03,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0xf0,0xff,0x4f,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x06,0x00,
+ 0x00,0x00,0x20,0x00,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0x00,0xf0,0x7f,0xff,0x3d,0x3c,0x00,0x00,0x00,0xe0,0x03,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0xff,0x27,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0x0c,0x00,0x00,0xf0,0xe3,0x03,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0x00,0xf8,0xff,0xff,0x7d,0x3c,0x00,0x00,0x00,
+ 0xf0,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xff,0xcf,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0x7f,0x1c,0x00,0x00,0xfc,0xff,0x1f,0xfe,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x03,0xfc,0xff,0xff,0x7d,
+ 0x7c,0x00,0x00,0x00,0xf0,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0xc0,0xff,0xef,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x38,0x00,0x00,0xfe,0xff,
+ 0x3f,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x07,
+ 0xfe,0xff,0x0f,0xff,0x78,0x00,0x00,0x80,0xe0,0x07,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0xc4,0xff,0xef,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x73,
+ 0x00,0x00,0xff,0xff,0x3f,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0x1f,0x04,0x3e,0xff,0xfc,0x00,0x00,0x00,0x80,0x07,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0x73,0x00,0x00,0xff,0xff,0x3f,0xfe,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf7,0x03,0x00,0xfc,0xff,0xfd,0x01,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf3,0x00,0x00,0xfe,0xff,0x3f,0xfc,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x07,0x00,0x00,0xfc,
+ 0xff,0xff,0x33,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x20,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xe7,0x01,0x00,0xfe,
+ 0xff,0x7f,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0x03,0x00,0x00,0xfc,0xff,0xff,0xff,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xcf,0x01,0x00,0xff,0xff,0x7f,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0x00,0x00,0x00,0xfe,0xff,0xcf,0x7f,0x06,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xdf,0x03,0x00,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0x00,0x00,0x00,0xfe,0xff,0xff,0xff,
+ 0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x07,0x00,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x3f,0x00,0x00,0x00,
+ 0xfc,0xff,0xff,0xff,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0x80,
+ 0xff,0xff,0xff,0xef,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0x1f,0x00,0x00,0x00,0xe0,0xff,0xff,0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0x0f,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0x1f,0x00,0x00,0x00,0x80,0x3f,0xfc,0xff,0x03,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0x80,0xff,0xff,0x9f,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x1f,0x00,0x00,0x00,0x00,0x3f,0xf0,
+ 0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0xc0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xfd,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0x00,0xff,0xff,0x37,
+ 0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x1f,0x00,0x00,
+ 0x00,0x00,0x3c,0x80,0xef,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,
+ 0x00,0xff,0x83,0xff,0xf1,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xf7,0x07,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0x1f,0x00,0xfe,0x83,0xff,0xe7,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xfe,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x3f,0x00,0xfe,0xc1,0xff,0x8f,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x40,0x00,0x00,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x70,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0x00,0xf8,0xc1,
+ 0xff,0x1f,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x78,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0x01,0x00,0xc0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0xe0,0x03,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0x07,0x00,0xe0,0xff,0xff,0x87,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,
+ 0x00,0xc0,0xe7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x1f,0x00,0xe0,0xff,0xe7,0x07,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x1f,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x07,0x00,0xc0,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0x0c,
+ 0xf0,0xff,0xff,0x8f,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0e,0x00,0x00,0xbf,0x1f,0x1f,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0xf8,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0x1f,0xf0,0xff,0xff,0xff,0xe7,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0e,0x00,0x00,0x9f,
+ 0xff,0x3f,0x00,0x00,0x00,0x40,0x00,0x00,0xc0,0xfd,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x3f,0x00,0xfc,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x1c,0x00,0x00,0x0e,0xff,0xff,0x00,0x00,0x00,0xc0,0x00,0x00,0xe0,0xfd,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0x00,0xf8,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x03,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0xfc,0xff,0x00,0x00,0x00,0xfc,0x00,
+ 0x00,0xf0,0xf8,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0x01,0xf8,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x03,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x00,0x00,0x00,0xf8,0xff,0x00,
+ 0x00,0x00,0xfe,0x01,0x00,0xf0,0xfc,0xff,0xf8,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0x07,0xf8,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x78,0x00,0x00,
+ 0x00,0xf0,0xff,0x01,0x00,0x00,0xfe,0x03,0x00,0xf0,0xfc,0xff,0xf8,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x1f,0xf8,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x70,0x00,0x00,0x00,0xf8,0xff,0x33,0x00,0x00,0xff,0x07,0x00,0xe0,0xff,
+ 0xff,0xf8,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x3f,0xf8,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x07,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0xfc,0xff,0x3f,0x00,0x80,0xff,
+ 0x0f,0x00,0xe0,0xff,0xff,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0xfe,0xff,
+ 0x3f,0x00,0xc0,0xff,0x0f,0x00,0xc0,0xff,0xff,0xfc,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xfc,0xff,0xf7,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x03,
+ 0x00,0x00,0xfe,0xff,0x3f,0x00,0xe0,0xff,0x8f,0x00,0x00,0xff,0xff,0xf9,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xf8,0xff,0xf8,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0xe0,0x03,0x00,0x00,0xff,0xff,0x3f,0x00,0xf0,0xff,0xcf,0x01,0x00,
+ 0xfe,0xff,0xe5,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xf9,0x3f,0x08,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x03,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x07,0x00,0x80,0xff,0xff,0x7f,0x00,0xf8,
+ 0xff,0xff,0x01,0x00,0xfe,0xff,0xfd,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0x73,0x3e,0x08,0xf8,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x0f,0x00,0xc0,0xff,
+ 0xff,0x7f,0x00,0xfc,0xff,0xff,0x01,0x00,0xfe,0xff,0x5b,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x07,0x09,0x08,0x00,0xfb,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,
+ 0x0f,0x00,0xf8,0xff,0xff,0x7f,0x00,0xff,0xff,0xff,0x03,0x00,0xfc,0xff,0xff,
+ 0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x9f,0x03,0x00,
+ 0x00,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x80,0x0f,0x00,0xfc,0xff,0xff,0xff,0x00,0xff,0xff,0xff,0x33,
+ 0x00,0xfe,0xff,0x8f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0x03,0x00,0x00,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x03,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x0f,0x00,0xfe,0xff,0xff,0xff,0x00,
+ 0xfe,0xff,0xfb,0xf7,0x00,0xfe,0xff,0xdf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0x07,0x00,0x00,0xf0,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0xc0,0xff,
+ 0xff,0xff,0xff,0x01,0xfe,0xff,0xfb,0xf7,0x01,0xff,0xff,0xdf,0xfd,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x07,0x00,0x00,0xe0,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x18,0xe0,0xff,0xff,0xff,0xff,0x01,0xfe,0xff,0xff,0xf7,0xc3,0xff,0xbf,
+ 0xff,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x07,
+ 0x00,0x00,0xc0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x07,0x00,0x00,0x00,0x00,
+ 0x08,0x00,0x00,0x00,0x00,0x10,0xfe,0xff,0xff,0xff,0xff,0x03,0xff,0xff,0xff,
+ 0xf7,0xcf,0xff,0xdf,0x1f,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0x07,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,
+ 0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0xa0,0xff,0xe7,0xff,0xff,0xff,
+ 0x03,0xff,0xff,0xff,0xf7,0xef,0xff,0xff,0x6f,0xfe,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x07,0x00,0x00,0x80,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xff,
+ 0xff,0xff,0xff,0xff,0x07,0xff,0xff,0xff,0xe7,0xff,0xff,0xff,0x7f,0xfe,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x03,0x00,0x00,0x00,
+ 0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x10,0xe0,0x0f,0xff,0xff,0xff,0xff,0x07,0xff,0xff,0xff,0xe7,0xff,0xff,
+ 0xdf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0x01,0x00,0x00,0x00,0xc0,0xff,0xff,0xff,0xff,0xff,0xff,0x3f,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x00,0xff,0xff,0xff,0xff,0x0f,0xfd,0xff,
+ 0xff,0xef,0xff,0xff,0x8f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,
+ 0xff,0xcf,0xf9,0xff,0xff,0x1f,0xff,0xff,0x07,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x3f,0x00,0x00,0x00,0x00,0x00,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0xff,0xff,0xff,0xff,0xff,0xf9,0xff,0xff,0x3f,0xfe,0xff,0x83,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xbf,0xff,0x3f,0x00,0x00,0x00,
+ 0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x01,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xf1,0xff,0xff,0x3f,0xfc,
+ 0xff,0x81,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0x1f,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x01,0x00,
+ 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0xff,0xff,0xff,0xff,0xff,0xf9,
+ 0xff,0x7f,0x3c,0xfc,0xff,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0x1f,0x00,0x00,0x00,0x00,0x00,0xfe,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0x78,0xfc,0x7f,0x80,0xff,0xbf,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x1f,0x00,0x00,0x00,0x00,0x00,0xfe,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0x07,0x00,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xe1,0xf8,0x3f,0x00,0xff,
+ 0x9e,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x3f,0x00,0x00,
+ 0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xdf,0xff,0xff,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xc3,
+ 0xf8,0x27,0x80,0xe3,0xdf,0xc7,0xff,0xff,0xdf,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0x1f,0x00,0x00,0x00,0x00,0xc0,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0x07,0xf3,0x07,0x80,0xfb,0xff,0x83,0xc5,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0x0f,0x00,0x00,0x00,0x00,0x40,0xe4,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0xfe,0x07,0x80,0xdb,0xdf,0x8f,0x03,
+ 0xfc,0xff,0xfd,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0x00,0x00,0x00,0x00,0x80,
+ 0xc2,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x3f,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0xf8,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x1f,0xf8,0x07,0xc0,
+ 0xe3,0xff,0x0f,0x01,0xc0,0xff,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x3f,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0x3f,0xf8,0x0f,0xc0,0xe3,0x3f,0x1c,0x00,0x00,0x7f,0xef,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0x3f,0x00,0x00,0x00,0x00,0x08,0x00,0xfe,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0x7f,0xe0,0x1f,0xc0,0xc9,0xef,0xff,0x03,0x00,0x8e,0xdf,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0xd0,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x1f,0x00,0x00,0x00,0x00,0x00,0x80,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xa0,0x1f,0xe0,0x81,0xff,0xff,
+ 0x1f,0x00,0xf8,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x3f,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x1f,0x00,0x00,0x00,
+ 0x48,0x00,0xc0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x7d,
+ 0xe7,0x57,0xff,0xff,0x1f,0x00,0xfc,0xff,0xf6,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x3f,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0x1f,0x00,0x00,0x00,0x00,0x00,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0x81,0xff,0xff,0x33,0xff,0x7f,0x3f,0x00,0xf8,0xff,0xdf,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0x0f,0x00,0x00,0x00,0xc0,0x00,0xf0,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0x83,0xff,0xff,0xff,0xff,0xff,0x1f,0xe0,0xf1,
+ 0xff,0xef,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x1f,0x00,0x00,0x00,0xe0,0x00,0xf8,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x87,0xff,0xff,0xff,0xff,
+ 0xf7,0xdf,0xe1,0xe3,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x1f,0x00,0x00,
+ 0x00,0xe0,0x00,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xdf,
+ 0xff,0xff,0xff,0xef,0xff,0xff,0xff,0x87,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0x3f,0x00,0x00,0x00,0x20,0x00,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0x7f,0x38,0xf8,0xff,0xdb,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xef,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0x7f,0x00,0x00,0x00,0x00,0x00,0xfe,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0xf0,0x8d,0xf7,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0x00,0x00,0x00,0x00,0x00,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x37,0xfe,
+ 0xf9,0xff,0xff,0xf7,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x01,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,
+ 0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xe7,0xfd,0xff,0xff,0xe7,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0x00,0x00,0x00,0x02,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x37,0xf2,0xc7,0xff,0xff,0xff,
+ 0xbf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x02,0x80,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0xf0,
+ 0xc7,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x03,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x02,
+ 0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0x07,0xf8,0x07,0xff,0xff,0xff,0xff,0xff,0xbf,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x07,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0x01,0x00,0x00,0x04,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0x03,0xf8,0x07,0xff,0xff,0xff,0xff,0xff,0xbf,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0x0f,0x04,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0x03,0x00,0x00,0x04,0x00,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xbf,0x03,0xf8,0x07,0xfe,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x3f,0x08,0x00,0x00,0x00,0x00,0xc0,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x03,0x00,0x00,0x08,0x00,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0x01,
+ 0xf0,0x07,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0x00,0x00,0x00,
+ 0x00,0x00,0xc0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x03,0x00,0x00,
+ 0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0x0f,0x00,0x80,0x07,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0x00,0x00,0x00,0x00,0x00,0xc0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0x03,0x00,0x00,0x00,0x00,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0x07,0x00,0x00,0x02,0xfc,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0x00,0xc0,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0x03,0x00,0x00,0x00,0x01,0xfe,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x03,0x00,0x00,0x00,0xfc,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0x00,0xc0,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x03,0x00,0x00,0x00,0x01,0xde,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,
+ 0x00,0x00,0x00,0xf0,0xff,0xff,0xdf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x01,0x00,
+ 0x00,0x00,0x00,0xc0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x03,0x00,
+ 0x00,0x00,0x01,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xc0,0xff,0xff,0xbf,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0x01,0x00,0x00,0x00,0x00,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0x01,0x00,0x00,0x00,0x01,0xfe,0xbf,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x80,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0x00,0xe0,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x01,0xfe,0x8f,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,
+ 0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0x00,
+ 0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,
+ 0xfc,0x0f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,
+ 0x00,0x00,0x00,0x00,0x00,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x01,
+ 0x00,0x00,0x00,0x00,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,
+ 0x00,0x00,0x00,0x00,0xfc,0x07,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0x1f,0x00,0x00,0x00,0x00,0x00,0xfe,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0xf8,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0x7f,0x00,0x00,0x00,0x00,0x00,0xfe,0x03,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x07,0x00,0x00,0x00,0x00,0x00,0xfc,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0xf8,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0x00,0x00,0x00,0x10,0x00,0x7e,0x80,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,
+ 0x00,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0x00,0x00,0x00,0x00,
+ 0x00,0x7f,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0x00,0x00,0x00,0x00,0x00,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,
+ 0x00,0x00,0x40,0x00,0x80,0x7f,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0x7f,0x00,0x00,0x00,0x00,0x60,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0x7f,0x00,0x00,0x00,0x00,0xe0,0x7f,0x80,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0x00,0x00,0x00,0x00,0xfc,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xf0,0x7f,0xc0,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x1f,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0x00,0x00,0x00,
+ 0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,
+ 0x00,0xf8,0x7f,0xc0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0x7f,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0x01,0x00,0x00,0x00,0xfc,0x7f,0xc0,0xff,0xfb,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0x3f,0x00,0x00,0x00,0xc0,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0xfe,0x7f,0xe0,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0xc0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x3f,0x00,0x00,0x00,0xc0,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0xfe,0x3f,
+ 0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x1f,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0xc0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x3f,0x00,0x00,
+ 0x00,0xc0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x03,0x00,
+ 0x00,0x00,0xfe,0x3f,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0x1f,0x00,0x00,0x00,0xc0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0x07,0x00,0x00,0x00,0xfc,0x3f,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0x1f,0x00,0x00,0x00,0xe0,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0x03,0x00,0x00,0x00,0xfc,0x3f,0xf0,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0xc0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x1f,0x00,0x02,0x00,0xf0,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x03,0x00,0x00,0x00,0xfc,
+ 0x3f,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x1f,0x00,
+ 0x00,0x00,0xf8,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x03,
+ 0x00,0x00,0x00,0xfc,0x3f,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0x1f,0x00,0x00,0x00,0xf8,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0x07,0x00,0x00,0x00,0xfc,0x7f,0xf8,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0xff,
+ 0xff,0xff,0xf3,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0x1f,0x00,0x00,0x00,0xfe,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x07,0x00,0x00,0x00,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0xf0,0x07,
+ 0x00,0x00,0xf0,0xff,0xff,0xff,0xf7,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0x00,0x00,0x00,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x07,0x00,0x00,0xc0,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0x01,0x00,0xfc,0x0f,0x00,0x00,0xf8,0xff,0xff,0xff,0xdf,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,
+ 0x00,0x00,0x40,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0x07,0x00,0x00,0xc0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0x01,0x80,0xff,0x1f,0x01,0x00,0xf8,0xff,0xff,0xff,0xcf,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0x07,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0x07,0x00,0x00,0xc0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x03,0xc0,0xff,0xbf,0x01,0x00,0xf8,
+ 0xff,0xff,0xff,0x1f,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x07,0x00,0x80,0xc0,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0x00,0x00,0xc0,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x03,0xc0,0xff,
+ 0xff,0x02,0x00,0xf8,0xff,0xff,0xff,0x0f,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x03,0x00,0x00,0xe3,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x1f,0x00,0x00,
+ 0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0x03,0xfe,0xff,0xff,0x0f,0x00,0xf8,0xff,0xff,0xff,0x0f,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0x03,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0x1f,0x00,0x00,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0x01,0xff,0xff,0xff,0x1f,0x00,0xf8,0xff,0xff,0xff,
+ 0x0f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0x01,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0x3f,0x00,0x00,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xc3,0xff,0xff,0xff,0x1f,0x00,
+ 0xff,0xff,0xff,0xff,0x9f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0xfe,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x3f,0x00,0x00,0xf8,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0x1f,0x80,0xff,0xff,0xff,0xff,0x9f,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x01,0x00,0x00,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x3f,0x00,
+ 0x00,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf9,0xff,0xff,0xff,0xff,0xd1,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0x01,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0x7f,0x00,0x00,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xf1,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0x01,0x00,0xc0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0x00,0x00,0xfe,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xf1,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0xfe,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0x00,0x00,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf8,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,
+ 0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x4f,0xfe,0xff,0xff,0x7f,0xfc,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0x02,0x10,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0x7f,0x00,0xc0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x1f,0xfc,0xff,
+ 0xff,0x3f,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0x7f,0x03,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0x00,0xf8,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0x1f,0xfe,0xff,0xff,0x1f,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0x01,0xf0,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf9,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0x3f,0xfe,0xff,0xff,0x0f,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x01,
+ 0xc0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x3f,0xff,0xff,0xff,0x0f,0xfe,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0x01,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0x07,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x01,0xf8,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0xf8,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0x00,0xf8,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0x3f,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x1f,0x00,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x3f,0x80,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0x3f,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0x7f,0x00,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x2f,0x00,0xfe,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x1f,0x00,0xfe,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0x3f,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0x3f,0xc0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x1f,0xc0,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0xf0,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0x3f,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x1f,0xf0,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xf8,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xbf,0xf2,0x7f,0xf9,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x5f,0xf2,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xe3,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xe3,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xc1,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x1b,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0x7f,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0x4f,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xbf,0xf1,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x6f,0xe8,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0x1f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0x8f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xc7,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xe1,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfd,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xdf,0x88,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfd,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0x4f,0xf8,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0x01,0x00,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x2f,0xfe,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0x3f,0x00,0x00,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x3f,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0x00,0x00,0xe8,0xef,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0x3f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x07,0x00,0x00,
+ 0x00,0xee,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0x3f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0x3f,0x07,0x00,0x00,0x00,0x00,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x1e,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0x3f,0x06,0x00,0x00,0x00,0x00,0xe0,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0x1e,
+ 0xfd,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0xc0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0x7f,0x1e,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xe7,0xff,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0x3f,0x06,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x83,
+ 0x3c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0x43,0xff,0xff,0xff,0x3f,0x06,0xfc,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0x3f,0xff,0xff,0xff,0x0f,0xff,0xff,0xff,0x3f,
+ 0x02,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x3f,0xff,0xff,0xff,0x77,
+ 0xff,0xff,0xff,0x18,0x00,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x1f,0xff,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,
+ 0xc6,0xff,0xff,0xfc,0xff,0xff,0xff,0x3f,0x04,0xfc,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x07,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xc7,0xfd,0xff,0xe1,0xdf,0xff,0xff,0x0f,0x00,0xfc,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xdf,0xff,0xf7,0xff,0x87,0xff,0xff,0xff,
+ 0x00,0x02,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0x0c,0x7f,0xb3,0xff,
+ 0x00,0x30,0xff,0xff,0x08,0x02,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0x03,
+ 0x00,0x00,0x30,0xff,0x01,0x00,0xfe,0xf7,0x1f,0x02,0xfc,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x1f,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0x01,0x00,0x00,0x80,0xff,0x01,0x00,0xf8,0xe7,0x1f,0x03,0xfc,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0x1f,0x00,0x00,0x00,0x80,0xff,0x03,0x00,0xf8,
+ 0xfd,0x03,0x03,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0x00,0x00,0x00,0x00,
+ 0xff,0x03,0x00,0xe0,0x3c,0xdf,0x03,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0x03,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0xff,0xff,0xff,0xff,0xff,0xff,0x03,
+ 0x00,0x00,0x00,0x00,0x80,0x03,0x00,0x40,0x38,0xff,0x01,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x3f,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x7f,0x00,
+ 0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x80,0xff,0xff,0xff,0xff,0xff,0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0xc0,0xff,0xff,0xff,0xff,0xff,0xff,0x07,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x03,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xff,0xff,
+ 0xff,0xff,0xff,0xfd,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0xe0,0xff,0xff,0xff,0xff,0x7f,0xf0,0x01,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0xc0,0xff,0xff,0xff,0xff,0x7f,0xc0,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0x7f,0xc0,0xff,0xff,0xff,0xff,0xff,0x1f,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0xff,0xff,0xff,0xff,0x7f,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0x3f,0x80,0xff,0xff,0xff,0xff,0xff,0x07,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0xff,
+ 0xff,0xff,0xff,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0xc0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x1f,0x00,0xfe,0xff,0xff,
+ 0xff,0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0xc0,0xff,0xff,0xff,0xff,0xff,0x06,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,
+ 0x00,0xfe,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0x07,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0xf4,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0x0f,0x00,0xfc,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,
+ 0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x03,0x00,0xfc,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x1f,0x00,0xe0,0x9f,0x3f,0xfe,0xff,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,
+ 0xff,0xff,0xff,0xff,0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,
+ 0x03,0x00,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,
+ 0x00,0xfe,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0xcf,0xff,0xff,0xff,0xe7,0x0f,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x80,0x03,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xdf,
+ 0x03,0x00,0x00,0x00,0x00,0xfc,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xee,0xff,0xff,0xff,0xc7,0x3f,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x0f,0xf0,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0x9f,0x01,0x00,0x00,0x00,0x00,0xfc,0xff,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xff,0xff,
+ 0xff,0x87,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3f,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0x00,0x00,0x00,0x00,0x00,0xfe,0x7f,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0xfc,0xff,0xff,0xff,0x87,0xff,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x03,0x00,0x00,0x00,
+ 0x00,0x00,0xfe,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0xf0,0xff,0xff,0xff,0x9f,0xff,0x03,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x04,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xff,0xff,0xff,0xff,0xff,
+ 0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0xfc,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x07,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0xff,
+ 0xff,0xff,0xff,0xff,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x38,0xf8,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfb,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,
+ 0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0xf8,0xff,0xff,0xff,0xff,0xff,0x07,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0xc0,0x70,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xbf,0x79,
+ 0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x07,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0xfe,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xff,0xff,0xff,0xff,0xff,0x07,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0xc0,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xbf,0x38,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xcf,0xff,
+ 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0x01,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0xff,0xff,0xff,0xff,
+ 0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0xf1,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0x3f,0x38,0xbf,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0x8f,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x01,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,
+ 0xff,0xff,0xff,0xff,0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x3f,0x18,0xfe,0xff,0xff,
+ 0xef,0xff,0xff,0xff,0xff,0xff,0x87,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x80,
+ 0x7f,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0xfe,0xff,0xff,0xff,0xff,0x83,0x01,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x3f,
+ 0x00,0xc0,0xff,0xff,0xe0,0xff,0xff,0xff,0xff,0xff,0x07,0xfe,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,0xfe,0xff,0xff,0xff,0xff,0x07,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x80,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0x1f,0x00,0x80,0x1f,0x00,0xc0,0xff,0xfd,0xff,0xff,0xff,0x03,
+ 0xfe,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfa,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0xff,0xff,0xff,
+ 0xff,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x87,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x02,0x00,0x00,0x02,0x00,0x80,0x03,0xc3,
+ 0xff,0xff,0xff,0x00,0xf4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0xfe,0xff,0xff,0xff,0xff,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,
+ 0xe1,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x01,0x00,0xff,0xff,0x1f,0x00,0x70,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0xfc,0xff,0xff,0xff,0xff,0x0f,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0xf8,0xf1,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xff,0x01,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x7c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0xff,0xff,0xff,0xff,0x1f,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x0f,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,0xfe,0xff,0xff,
+ 0xff,0xff,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0xf0,0xff,0xff,0xff,0xff,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfb,0x03,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x7e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0xf0,0xff,0xff,0xff,0xff,0x7f,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfb,
+ 0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x7e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xff,0xff,0xff,0xff,0x7f,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xfb,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3e,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xff,
+ 0xff,0xff,0xff,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xff,0xff,
+ 0xff,0x87,0xff,0xff,0xff,0xff,0xff,0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3e,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0xc0,0xff,0xff,0xff,0xff,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0xf8,0xff,0xff,0xff,0x03,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0x3f,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0xf8,0xf7,0xf9,0xff,0x00,0xff,0xff,0xff,0xff,0xff,
+ 0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,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,0xff,0xff,0xff,
+ 0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0xe7,0xfc,0xff,0x00,0xfe,
+ 0xff,0xff,0xff,0xff,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,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,0xff,0xff,0xff,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x0f,
+ 0xfc,0x7f,0x00,0xfe,0xff,0xff,0x3f,0xfc,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0xfc,0xff,0xff,0xff,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0xe0,0x1f,0xfe,0x3f,0x00,0xff,0xff,0x7f,0x00,0xe0,0x0f,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0xff,0xff,0xff,0x7f,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x1f,0xff,0x3f,0xc0,0xff,0xff,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,0xe0,0xff,0xff,
+ 0xff,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0xbf,0xff,0x1f,0xc0,
+ 0xff,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,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,0xff,0xff,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,
+ 0xff,0xff,0x07,0xc0,0xff,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,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,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x80,0xff,0xff,0x00,0xc0,0xbf,0x07,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,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,0xff,0xff,0xff,0x01,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xff,0x3f,0x00,0xe0,0xff,0x03,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf4,
+ 0xff,0xff,0xff,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xff,0x1f,0x00,
+ 0xe0,0xff,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,0xe0,0xff,0xff,0xff,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0xff,0x1f,0x00,0xe0,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xff,0xff,0xff,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0xff,0x3f,0x00,0xf0,0xff,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0xff,
+ 0xff,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0x00,0xf8,0xff,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0xc0,0xff,0xc7,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,
+ 0x0f,0xfe,0xff,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,0xff,0x07,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0xfe,0xff,0xff,0xff,0xff,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,0xf8,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0xff,0xff,0xff,0xff,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,0xfe,0xff,0xff,0xff,0xff,
+ 0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,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,
+ 0xff,0xff,0xff,0xff,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,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,0xff,0xff,0xff,0xff,0xff,0x03,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1e,0xfc,0xff,0xff,0xff,0xff,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xe0,0xff,0xff,
+ 0xff,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,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,0xff,0xff,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,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,0xff,0xff,0x1f,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3e,0xf0,0xff,0x1f,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,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,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,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,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
diff --git a/hacks/images/jigsaw/jigsaw.xbm b/hacks/images/jigsaw/jigsaw.xbm
new file mode 100644 (file)
index 0000000..90d0b1f
--- /dev/null
@@ -0,0 +1,1614 @@
+#define jigsaw_width 523
+#define jigsaw_height 366
+static char jigsaw_bits[] = {
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0xff,0xff,0x03,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0xff,0xff,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x07,0x00,
+ 0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x01,0x00,0x00,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x07,0x00,0x00,0x00,0x10,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,
+ 0x00,0x00,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,
+ 0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x80,0x07,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,
+ 0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x00,
+ 0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x08,0x00,0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x80,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x07,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x07,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x80,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,
+ 0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x07,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,
+ 0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x0c,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x18,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,
+ 0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x80,0x01,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x00,0x00,
+ 0x00,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0x00,0xf0,0x01,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0xe0,0xff,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,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,0x04,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,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,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,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,0x04,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,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,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,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,0x04,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0xf8,0xff,0x03,0x00,0x00,0x00,0x00,
+ 0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0xfe,0xff,0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0xc0,0x07,
+ 0x00,0x7c,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x20,0x00,0x00,0x00,0x00,0x00,0xf0,0x01,0x00,0x1f,0x00,0x00,0x00,0x00,0xf8,
+ 0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x80,0x03,0x00,0x00,0x00,0x00,0x10,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x0e,0x00,0x00,
+ 0xe0,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x1c,
+ 0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,
+ 0x00,0x00,0xc0,0x01,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,
+ 0xc0,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x18,0x00,
+ 0x00,0x00,0xf8,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x80,0x01,0x00,0x00,
+ 0x00,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,0x02,0x00,0x00,0x00,0x0c,
+ 0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x0c,0x00,0x00,
+ 0x00,0x00,0x00,0x06,0x00,0x00,0x00,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,0x04,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x80,0x01,0x00,0x00,0xf8,
+ 0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x80,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0xc0,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x06,0x00,0x00,0xf8,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x20,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,
+ 0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0xf8,0x00,0x00,0x60,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x30,
+ 0x00,0x00,0xf8,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,
+ 0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0xff,0xff,0x07,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0xf8,0x00,0x00,0x08,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0xf8,
+ 0x00,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x03,0x00,0xf8,0x00,0x00,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,0x04,0x00,0xf8,0x00,0x80,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x08,0x00,0xf8,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0xf8,0x00,0x20,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0xf8,
+ 0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x40,0x00,0xf8,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0xf8,0x00,0x08,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x80,0x00,0xf8,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xf8,0x00,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,0x02,0xf8,
+ 0x00,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,0x02,0xf8,0x00,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,0x04,0xf8,0x80,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x08,0xf8,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0xf8,0x40,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0xf8,
+ 0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x10,0xf8,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0xf8,0x20,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x20,0xf8,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0xf8,0x10,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0xf8,
+ 0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x80,0xf8,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xf8,0x08,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x80,0xf8,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf9,0x04,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf9,
+ 0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0xf9,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,0xfa,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,0xfa,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,0xfa,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,0xfa,
+ 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,0xfa,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,0xfc,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,0xfc,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,0xfc,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,0xfc,
+ 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,0xfc,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,0xfc,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,0xfc,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,0xfc,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,0xfc,
+ 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,0xfc,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,0xfc,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,0xfc,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,0xfc,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,0xfc,
+ 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,0xfc,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,0xfa,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,0xfa,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,0xfa,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,0xfa,
+ 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,0xfa,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf9,0x04,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0xf9,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf9,0x08,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xf8,
+ 0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x80,0xf8,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xf8,0x10,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x40,0xf8,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0xf8,0x20,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0xf8,
+ 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x20,0xf8,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0xf8,0x40,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x10,0xf8,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0xf8,0x80,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0xf8,
+ 0x00,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,0x04,0xf8,0x00,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,0x02,0xf8,0x00,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,0x02,0xf8,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0xf8,0x00,0x08,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0xf8,
+ 0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x40,0x00,0xf8,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0xf8,0x00,0x20,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x20,0x00,0xf8,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0xf8,0x00,0x80,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0xf8,
+ 0x00,0x00,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,0x04,0x00,0xf8,0x00,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0xf8,0x00,0x00,0x08,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,
+ 0x00,0x00,0xf8,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,
+ 0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0xff,0xff,0x07,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0xf8,0x00,0x00,0x60,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0xc0,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x20,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0xf8,
+ 0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x40,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x20,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x08,0x00,0x00,0xf8,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,
+ 0x18,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,
+ 0x00,0xc0,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0xf8,0x00,0x00,0x00,
+ 0x0c,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x00,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,0x04,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x80,0x01,
+ 0x00,0x00,0xf8,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x80,0x01,0x00,0x00,
+ 0x00,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,0x02,0x00,0x00,0x00,0x0c,
+ 0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0xc0,0x00,0x00,
+ 0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x01,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0xf8,
+ 0x00,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x00,0x08,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0xc0,0x01,0x00,0x00,
+ 0x00,0x07,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x80,0x03,
+ 0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,
+ 0x00,0x00,0x00,0x0e,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,
+ 0x00,0xc0,0x07,0x00,0x7c,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0xf0,0x01,0x00,0x1f,0x00,0x00,
+ 0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0xf8,0xff,0x03,0x00,0x00,0x00,0x00,
+ 0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0xfe,0xff,0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,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,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,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,0x02,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,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,0x04,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,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,0x04,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0xe0,0xff,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0x00,0xf0,0x01,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,
+ 0x00,0x0e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x80,0x01,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,
+ 0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0c,0x00,0x00,0x00,
+ 0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x01,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x80,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x80,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,
+ 0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x07,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x07,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x07,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x01,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x00,
+ 0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x80,0x07,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,
+ 0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x00,0x00,0x00,
+ 0x00,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x20,0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x80,0x07,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x00,0x0f,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x08,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x00,
+ 0x00,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x80,0x07,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0xff,0xff,0x03,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0xff,0xff,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0xf8};
diff --git a/hacks/images/jigsaw/jigsaw_a_e_f.xbm b/hacks/images/jigsaw/jigsaw_a_e_f.xbm
new file mode 100644 (file)
index 0000000..12cc9b1
--- /dev/null
@@ -0,0 +1,77 @@
+#define jigsaw_a_e_f_width 88
+#define jigsaw_a_e_f_height 78
+#define jigsaw_a_e_f_x_hot 20
+#define jigsaw_a_e_f_y_hot 6
+static unsigned char jigsaw_a_e_f_bits[] = {
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0xc0, 0x03, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0xfc, 0x07, 0x00, 0x00, 0xfe, 0x03, 0x00, 0x00, 0x00, 0x00,
+   0xc0, 0xff, 0x0f, 0x00, 0x00, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0xfc,
+   0xff, 0x1f, 0x00, 0x80, 0xff, 0xff, 0x03, 0x00, 0x00, 0xc0, 0xff, 0xff,
+   0x3f, 0x00, 0xc0, 0xff, 0xff, 0x3f, 0x00, 0x00, 0xe0, 0xff, 0xff, 0x7f,
+   0x00, 0xe0, 0xff, 0xff, 0x7f, 0x00, 0x00, 0xe0, 0xff, 0xff, 0x7f, 0x00,
+   0xe0, 0xff, 0xff, 0x7f, 0x00, 0x00, 0xe0, 0xff, 0xff, 0x7f, 0x00, 0xe0,
+   0xff, 0xff, 0x7f, 0x00, 0x00, 0xe0, 0xff, 0xff, 0x7f, 0x00, 0xe0, 0xff,
+   0xff, 0x7f, 0x00, 0x00, 0xc0, 0xff, 0xff, 0x7f, 0x00, 0xe0, 0xff, 0xff,
+   0x7f, 0x00, 0x00, 0xc0, 0xff, 0xff, 0x3f, 0x00, 0xc0, 0xff, 0xff, 0x7f,
+   0x00, 0x00, 0xc0, 0xff, 0xff, 0x3f, 0x00, 0xc0, 0xff, 0xff, 0x7f, 0x00,
+   0x00, 0xc0, 0xff, 0xff, 0x1f, 0x00, 0x80, 0xff, 0xff, 0x7f, 0x00, 0x00,
+   0x80, 0xff, 0xff, 0x1f, 0x00, 0x80, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x80,
+   0xff, 0xff, 0x1f, 0x00, 0x80, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x80, 0xff,
+   0xff, 0x1f, 0x00, 0x80, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x80, 0xff, 0xff,
+   0x1f, 0x00, 0x80, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x1f,
+   0x00, 0x80, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x1f, 0x00,
+   0x80, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x3f, 0x00, 0xc0,
+   0xff, 0xff, 0x7f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x3f, 0x00, 0xc0, 0xff,
+   0xff, 0x7f, 0x00, 0x00, 0x00, 0xfe, 0xff, 0x7f, 0x00, 0xe0, 0xff, 0xff,
+   0x7f, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0x00, 0xf0, 0xff, 0xff, 0x7f,
+   0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0x03, 0xfc, 0xff, 0xff, 0x7f, 0x00,
+   0x00, 0x00, 0xfe, 0xff, 0xff, 0x0f, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00,
+   0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x00,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x7e, 0x80, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xc0, 0xff, 0xc1, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0x7f, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0x7f, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0x7f, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0x7f, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0x7f, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f,
+   0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xfe,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xfe, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xfe, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xfe, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xfe, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0x7f, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0x7f, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0x7f, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0x7f, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0x7f, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f,
+   0xc0, 0xff, 0xc1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00,
+   0x7f, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00,
+   0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x00,
+   0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x00, 0xfe,
+   0xff, 0xff, 0x0f, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x00, 0xfe, 0xff,
+   0xff, 0x03, 0xfc, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff,
+   0x00, 0xf0, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x00, 0xfe, 0xff, 0x7f, 0x00,
+   0xe0, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x3f, 0x00, 0xc0,
+   0xff, 0xff, 0x7f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x3f, 0x00, 0xc0, 0xff,
+   0xff, 0x7f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x1f, 0x00, 0x80, 0xff, 0xff,
+   0x7f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x1f, 0x00, 0x80, 0xff, 0xff, 0x7f,
+   0x00, 0x00, 0x80, 0xff, 0xff, 0x1f, 0x00, 0x80, 0xff, 0xff, 0x7f, 0x00,
+   0x00, 0x80, 0xff, 0xff, 0x1f, 0x00, 0x80, 0xff, 0xff, 0x7f, 0x00, 0x00,
+   0x80, 0xff, 0xff, 0x1f, 0x00, 0x80, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x80,
+   0xff, 0xff, 0x1f, 0x00, 0x80, 0xff, 0xff, 0x7f, 0x00, 0x00, 0xc0, 0xff,
+   0xff, 0x1f, 0x00, 0x80, 0xff, 0xff, 0x7f, 0x00, 0x00, 0xc0, 0xff, 0xff,
+   0x3f, 0x00, 0xc0, 0xff, 0xff, 0x7f, 0x00, 0x00, 0xc0, 0xff, 0xff, 0x3f,
+   0x00, 0xc0, 0xff, 0xff, 0x7f, 0x00, 0x00, 0xc0, 0xff, 0xff, 0x7f, 0x00,
+   0xe0, 0xff, 0xff, 0x7f, 0x00, 0x00, 0xe0, 0xff, 0xff, 0x7f, 0x00, 0xe0,
+   0xff, 0xff, 0x7f, 0x00, 0x00, 0xe0, 0xff, 0xff, 0x7f, 0x00, 0xe0, 0xff,
+   0xff, 0x7f, 0x00, 0x00, 0xe0, 0xff, 0xff, 0x7f, 0x00, 0xe0, 0xff, 0xff,
+   0x7f, 0x00, 0x00, 0xe0, 0xff, 0xff, 0x7f, 0x00, 0xe0, 0xff, 0xff, 0x7f,
+   0x00, 0x00, 0xc0, 0xff, 0xff, 0x3f, 0x00, 0xc0, 0xff, 0xff, 0x3f, 0x00,
+   0x00, 0x00, 0xfc, 0xff, 0x1f, 0x00, 0x80, 0xff, 0xff, 0x03, 0x00, 0x00,
+   0x00, 0xc0, 0xff, 0x0f, 0x00, 0x00, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0xfc, 0x07, 0x00, 0x00, 0xfe, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0xc0, 0x03, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
diff --git a/hacks/images/jigsaw/jigsaw_a_e_h.xbm b/hacks/images/jigsaw/jigsaw_a_e_h.xbm
new file mode 100644 (file)
index 0000000..67bae2e
--- /dev/null
@@ -0,0 +1,77 @@
+#define jigsaw_a_e_h_width 88
+#define jigsaw_a_e_h_height 78
+#define jigsaw_a_e_h_x_hot 20
+#define jigsaw_a_e_h_y_hot 6
+static unsigned char jigsaw_a_e_h_bits[] = {
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0xc0, 0x03, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0xfc, 0x07, 0x00, 0x00, 0xfe, 0x03, 0x00, 0x00, 0x00, 0x00,
+   0xc0, 0x3f, 0x0c, 0x00, 0x00, 0xc3, 0x3f, 0x00, 0x00, 0x00, 0x00, 0xfc,
+   0x03, 0x18, 0x00, 0x80, 0x01, 0xfc, 0x03, 0x00, 0x00, 0xc0, 0x3f, 0x00,
+   0x30, 0x00, 0xc0, 0x00, 0xc0, 0x3f, 0x00, 0x00, 0xe0, 0x03, 0x00, 0x60,
+   0x00, 0x60, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00,
+   0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x60,
+   0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x60, 0x00,
+   0x00, 0x60, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, 0x00,
+   0x60, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x30, 0x00, 0xc0, 0x00, 0x00, 0x60,
+   0x00, 0x00, 0xc0, 0x00, 0x00, 0x38, 0x00, 0xc0, 0x01, 0x00, 0x60, 0x00,
+   0x00, 0xc0, 0x00, 0x00, 0x18, 0x00, 0x80, 0x01, 0x00, 0x60, 0x00, 0x00,
+   0x80, 0x01, 0x00, 0x18, 0x00, 0x80, 0x01, 0x00, 0x60, 0x00, 0x00, 0x80,
+   0x01, 0x00, 0x18, 0x00, 0x80, 0x01, 0x00, 0x60, 0x00, 0x00, 0x80, 0x01,
+   0x00, 0x18, 0x00, 0x80, 0x01, 0x00, 0x60, 0x00, 0x00, 0x80, 0x01, 0x00,
+   0x18, 0x00, 0x80, 0x01, 0x00, 0x60, 0x00, 0x00, 0x00, 0x03, 0x00, 0x18,
+   0x00, 0x80, 0x01, 0x00, 0x60, 0x00, 0x00, 0x00, 0x03, 0x00, 0x18, 0x00,
+   0x80, 0x01, 0x00, 0x60, 0x00, 0x00, 0x00, 0x03, 0x00, 0x38, 0x00, 0xc0,
+   0x01, 0x00, 0x60, 0x00, 0x00, 0x00, 0x03, 0x00, 0x30, 0x00, 0xc0, 0x00,
+   0x00, 0x60, 0x00, 0x00, 0x00, 0x06, 0x00, 0x60, 0x00, 0x60, 0x00, 0x00,
+   0x60, 0x00, 0x00, 0x00, 0x06, 0x00, 0xe0, 0x00, 0x70, 0x00, 0x00, 0x60,
+   0x00, 0x00, 0x00, 0x06, 0x00, 0xc0, 0x03, 0x3c, 0x00, 0x00, 0x60, 0x00,
+   0x00, 0x00, 0x06, 0x00, 0x80, 0x0f, 0x1f, 0x00, 0x00, 0x60, 0x00, 0x00,
+   0x00, 0x06, 0x00, 0x00, 0xfe, 0x07, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00,
+   0x07, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x60, 0x00, 0x7e, 0x80, 0x03,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0xc0, 0xff, 0xc1, 0x01, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0xe0, 0xc1, 0xff, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x60, 0x70, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x60, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x60, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x60, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x60, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60,
+   0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x06,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x06, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x06, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x06, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x06, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x60, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x60, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x60, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x60, 0x70, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x60, 0xe0, 0x80, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60,
+   0xc0, 0xff, 0xc1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00,
+   0x7f, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00,
+   0x00, 0x03, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00,
+   0x06, 0x00, 0x00, 0xfe, 0x07, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x06,
+   0x00, 0x80, 0x0f, 0x1f, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x06, 0x00,
+   0xc0, 0x03, 0x3c, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x06, 0x00, 0xe0,
+   0x00, 0x70, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x06, 0x00, 0x60, 0x00,
+   0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x03, 0x00, 0x30, 0x00, 0xc0,
+   0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x03, 0x00, 0x38, 0x00, 0xc0, 0x01,
+   0x00, 0x60, 0x00, 0x00, 0x00, 0x03, 0x00, 0x18, 0x00, 0x80, 0x01, 0x00,
+   0x60, 0x00, 0x00, 0x00, 0x03, 0x00, 0x18, 0x00, 0x80, 0x01, 0x00, 0x60,
+   0x00, 0x00, 0x80, 0x01, 0x00, 0x18, 0x00, 0x80, 0x01, 0x00, 0x60, 0x00,
+   0x00, 0x80, 0x01, 0x00, 0x18, 0x00, 0x80, 0x01, 0x00, 0x60, 0x00, 0x00,
+   0x80, 0x01, 0x00, 0x18, 0x00, 0x80, 0x01, 0x00, 0x60, 0x00, 0x00, 0x80,
+   0x01, 0x00, 0x18, 0x00, 0x80, 0x01, 0x00, 0x60, 0x00, 0x00, 0xc0, 0x00,
+   0x00, 0x18, 0x00, 0x80, 0x01, 0x00, 0x60, 0x00, 0x00, 0xc0, 0x00, 0x00,
+   0x38, 0x00, 0xc0, 0x01, 0x00, 0x60, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x30,
+   0x00, 0xc0, 0x00, 0x00, 0x60, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x60, 0x00,
+   0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x60,
+   0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x60, 0x00,
+   0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, 0x00,
+   0x60, 0x00, 0x00, 0xe0, 0x03, 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, 0x7c,
+   0x00, 0x00, 0xc0, 0x3f, 0x00, 0x30, 0x00, 0xc0, 0x00, 0xc0, 0x3f, 0x00,
+   0x00, 0x00, 0xfc, 0x03, 0x18, 0x00, 0x80, 0x01, 0xfc, 0x03, 0x00, 0x00,
+   0x00, 0xc0, 0x3f, 0x0c, 0x00, 0x00, 0xc3, 0x3f, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0xfc, 0x07, 0x00, 0x00, 0xfe, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0xc0, 0x03, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
diff --git a/hacks/images/jigsaw/jigsaw_a_f.xbm b/hacks/images/jigsaw/jigsaw_a_f.xbm
new file mode 100644 (file)
index 0000000..b704691
--- /dev/null
@@ -0,0 +1,96 @@
+#define jigsaw_a_f_width 108
+#define jigsaw_a_f_height 78
+#define jigsaw_a_f_x_hot 20
+#define jigsaw_a_f_y_hot 5
+static unsigned char jigsaw_a_f_bits[] = {
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x03, 0x00, 0x00, 0x3c, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x07, 0x00, 0x00,
+   0xfe, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0x0f,
+   0x00, 0x00, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc,
+   0xff, 0x1f, 0x00, 0x80, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0xc0, 0xff, 0xff, 0x3f, 0x00, 0xc0, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0xe0, 0xff, 0xff, 0x7f, 0x00, 0xe0, 0xff, 0xff, 0x7f, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0x7f, 0x00, 0xe0, 0xff, 0xff,
+   0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0x7f, 0x00, 0xe0,
+   0xff, 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0x7f,
+   0x00, 0xe0, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff,
+   0xff, 0x7f, 0x00, 0xe0, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0xc0, 0xff, 0xff, 0x3f, 0x00, 0xc0, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0xc0, 0xff, 0xff, 0x3f, 0x00, 0xc0, 0xff, 0xff, 0x3f, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0x1f, 0x00, 0x80, 0xff, 0xff,
+   0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, 0x1f, 0x00, 0x80,
+   0xff, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, 0x1f,
+   0x00, 0x80, 0xff, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff,
+   0xff, 0x1f, 0x00, 0x80, 0xff, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x80, 0xff, 0xff, 0x1f, 0x00, 0x80, 0xff, 0xff, 0x1f, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0xff, 0xff, 0x1f, 0x00, 0x80, 0xff, 0xff, 0x0f, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x1f, 0x00, 0x80, 0xff, 0xff,
+   0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x3f, 0x00, 0xc0,
+   0xff, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x3f,
+   0x00, 0xc0, 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe,
+   0xff, 0x7f, 0x00, 0xe0, 0xff, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0xfe, 0xff, 0xff, 0x00, 0xf0, 0xff, 0xff, 0x07, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0x03, 0xfc, 0xff, 0xff, 0x07, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0x0f, 0xff, 0xff, 0xff,
+   0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x80, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0xe0, 0x07, 0x00, 0xc0, 0xff,
+   0xc1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xf8, 0x3f, 0x00,
+   0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0x7f, 0x00, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0x00, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0xfc, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0xfe, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07,
+   0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0x07, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0x07, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0xfe, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0xfe, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07,
+   0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0x07, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0x03, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0xf0, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0xe0, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00,
+   0xc0, 0xff, 0xc1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xf8,
+   0x3f, 0x00, 0x00, 0x7f, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0x1f, 0xe0, 0x0f, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe,
+   0xff, 0xff, 0x0f, 0xff, 0xff, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0xfe, 0xff, 0xff, 0x03, 0xfc, 0xff, 0xff, 0x07, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0x00, 0xf0, 0xff, 0xff, 0x07, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xff, 0x7f, 0x00, 0xe0, 0xff, 0xff,
+   0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x3f, 0x00, 0xc0,
+   0xff, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x3f,
+   0x00, 0xc0, 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff,
+   0xff, 0x1f, 0x00, 0x80, 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0xff, 0xff, 0x1f, 0x00, 0x80, 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x80, 0xff, 0xff, 0x1f, 0x00, 0x80, 0xff, 0xff, 0x1f, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, 0x1f, 0x00, 0x80, 0xff, 0xff,
+   0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, 0x1f, 0x00, 0x80,
+   0xff, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, 0x1f,
+   0x00, 0x80, 0xff, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff,
+   0xff, 0x1f, 0x00, 0x80, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0xc0, 0xff, 0xff, 0x3f, 0x00, 0xc0, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0xc0, 0xff, 0xff, 0x3f, 0x00, 0xc0, 0xff, 0xff, 0x3f, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0x7f, 0x00, 0xe0, 0xff, 0xff,
+   0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0x7f, 0x00, 0xe0,
+   0xff, 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0x7f,
+   0x00, 0xe0, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff,
+   0xff, 0x7f, 0x00, 0xe0, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0xe0, 0xff, 0xff, 0x7f, 0x00, 0xe0, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0xc0, 0xff, 0xff, 0x3f, 0x00, 0xc0, 0xff, 0xff, 0x3f, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xff, 0x1f, 0x00, 0x80, 0xff, 0xff,
+   0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0x0f, 0x00, 0x00,
+   0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x07,
+   0x00, 0x00, 0xfe, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0xc0, 0x03, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
diff --git a/hacks/images/jigsaw/jigsaw_a_h.xbm b/hacks/images/jigsaw/jigsaw_a_h.xbm
new file mode 100644 (file)
index 0000000..108e117
--- /dev/null
@@ -0,0 +1,96 @@
+#define jigsaw_a_h_width 108
+#define jigsaw_a_h_height 78
+#define jigsaw_a_h_x_hot 20
+#define jigsaw_a_h_y_hot 5
+static unsigned char jigsaw_a_h_bits[] = {
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x03, 0x00, 0x00, 0x3c, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x07, 0x00, 0x00,
+   0xfe, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x3f, 0x0c,
+   0x00, 0x00, 0xc3, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc,
+   0x03, 0x18, 0x00, 0x80, 0x01, 0xfc, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0xc0, 0x3f, 0x00, 0x30, 0x00, 0xc0, 0x00, 0xc0, 0x3f, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0xe0, 0x03, 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, 0x7c, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, 0x00,
+   0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x60,
+   0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60,
+   0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00,
+   0x00, 0x60, 0x00, 0x60, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0xc0, 0x00, 0x00, 0x30, 0x00, 0xc0, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0xc0, 0x00, 0x00, 0x38, 0x00, 0xc0, 0x01, 0x00, 0x30, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x18, 0x00, 0x80, 0x01, 0x00,
+   0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x18, 0x00, 0x80,
+   0x01, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x18,
+   0x00, 0x80, 0x01, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01,
+   0x00, 0x18, 0x00, 0x80, 0x01, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x80, 0x01, 0x00, 0x18, 0x00, 0x80, 0x01, 0x00, 0x18, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x03, 0x00, 0x18, 0x00, 0x80, 0x01, 0x00, 0x0c, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x18, 0x00, 0x80, 0x01, 0x00,
+   0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x38, 0x00, 0xc0,
+   0x01, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x30,
+   0x00, 0xc0, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06,
+   0x00, 0x60, 0x00, 0x60, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x06, 0x00, 0xe0, 0x00, 0x70, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x06, 0x00, 0xc0, 0x03, 0x3c, 0x00, 0x00, 0x06, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x80, 0x0f, 0x1f, 0x00, 0x00,
+   0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0xfe, 0x07,
+   0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00,
+   0xf0, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x80, 0x03,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0xe0, 0x07, 0x00, 0xc0, 0xff,
+   0xc1, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0xf8, 0x3f, 0x00,
+   0xe0, 0xc1, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x3f,
+   0x78, 0x00, 0x70, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0xe0, 0x07, 0xe0, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x03, 0x0c, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x06, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06,
+   0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06,
+   0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x06, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x03, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x70, 0x00, 0x3e, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x07, 0xe0, 0x00, 0xe0, 0x80,
+   0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x1f, 0x70, 0x00,
+   0xc0, 0xff, 0xc1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0xf8,
+   0x3f, 0x00, 0x00, 0x7f, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x18, 0xe0, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0xf0, 0x00,
+   0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00,
+   0xfe, 0x07, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06,
+   0x00, 0x80, 0x0f, 0x1f, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x06, 0x00, 0xc0, 0x03, 0x3c, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x06, 0x00, 0xe0, 0x00, 0x70, 0x00, 0x00, 0x06, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x60, 0x00, 0x60, 0x00, 0x00,
+   0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x30, 0x00, 0xc0,
+   0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x38,
+   0x00, 0xc0, 0x01, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
+   0x00, 0x18, 0x00, 0x80, 0x01, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x03, 0x00, 0x18, 0x00, 0x80, 0x01, 0x00, 0x0c, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x80, 0x01, 0x00, 0x18, 0x00, 0x80, 0x01, 0x00, 0x18, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x18, 0x00, 0x80, 0x01, 0x00,
+   0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x18, 0x00, 0x80,
+   0x01, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x18,
+   0x00, 0x80, 0x01, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00,
+   0x00, 0x18, 0x00, 0x80, 0x01, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0xc0, 0x00, 0x00, 0x38, 0x00, 0xc0, 0x01, 0x00, 0x30, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0xc0, 0x00, 0x00, 0x30, 0x00, 0xc0, 0x00, 0x00, 0x30, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, 0x00,
+   0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x60,
+   0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60,
+   0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00,
+   0x00, 0x60, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0xe0, 0x03, 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0xc0, 0x3f, 0x00, 0x30, 0x00, 0xc0, 0x00, 0xc0, 0x3f, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x03, 0x18, 0x00, 0x80, 0x01, 0xfc,
+   0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x3f, 0x0c, 0x00, 0x00,
+   0xc3, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x07,
+   0x00, 0x00, 0xfe, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0xc0, 0x03, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
diff --git a/hacks/images/jigsaw/jigsaw_a_n_f.xbm b/hacks/images/jigsaw/jigsaw_a_n_f.xbm
new file mode 100644 (file)
index 0000000..ca6d1cd
--- /dev/null
@@ -0,0 +1,91 @@
+#define jigsaw_a_n_f_width 108
+#define jigsaw_a_n_f_height 73
+#define jigsaw_a_n_f_x_hot 21
+#define jigsaw_a_n_f_y_hot 1
+static unsigned char jigsaw_a_n_f_bits[] = {
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x7e,
+   0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0xe0, 0x07, 0x00,
+   0xc0, 0xff, 0xc1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xf8,
+   0x3f, 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0x7f, 0x00, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0xfc, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0xfc, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03,
+   0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0x07, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0x07, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0xfe, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0xfe, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07,
+   0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0x07, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0x07, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0xf8, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0xf0, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
+   0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0x7f, 0x00, 0xc0, 0xff, 0xc1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0x3f, 0xf8, 0x3f, 0x00, 0x00, 0x7f, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0x1f, 0xe0, 0x0f, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0xfe, 0xff, 0xff, 0x0f, 0xff, 0xff, 0xff, 0x07, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0x03, 0xfc, 0xff, 0xff, 0x07, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0x00, 0xf0, 0xff, 0xff,
+   0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xff, 0x7f, 0x00, 0xe0,
+   0xff, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x3f,
+   0x00, 0xc0, 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff,
+   0xff, 0x3f, 0x00, 0xc0, 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0xff, 0xff, 0x1f, 0x00, 0x80, 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0xff, 0xff, 0x1f, 0x00, 0x80, 0xff, 0xff, 0x0f, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, 0x1f, 0x00, 0x80, 0xff, 0xff,
+   0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, 0x1f, 0x00, 0x80,
+   0xff, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, 0x1f,
+   0x00, 0x80, 0xff, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff,
+   0xff, 0x1f, 0x00, 0x80, 0xff, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0xc0, 0xff, 0xff, 0x1f, 0x00, 0x80, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0xc0, 0xff, 0xff, 0x3f, 0x00, 0xc0, 0xff, 0xff, 0x3f, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0x3f, 0x00, 0xc0, 0xff, 0xff,
+   0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0x7f, 0x00, 0xe0,
+   0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0x7f,
+   0x00, 0xe0, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff,
+   0xff, 0x7f, 0x00, 0xe0, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0xe0, 0xff, 0xff, 0x7f, 0x00, 0xe0, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0xe0, 0xff, 0xff, 0x7f, 0x00, 0xe0, 0xff, 0xff, 0x7f, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0x3f, 0x00, 0xc0, 0xff, 0xff,
+   0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xff, 0x1f, 0x00, 0x80,
+   0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0x0f,
+   0x00, 0x00, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0xfc, 0x07, 0x00, 0x00, 0xfe, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0xc0, 0x03, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00};
diff --git a/hacks/images/jigsaw/jigsaw_a_n_h.xbm b/hacks/images/jigsaw/jigsaw_a_n_h.xbm
new file mode 100644 (file)
index 0000000..9e8dccf
--- /dev/null
@@ -0,0 +1,91 @@
+#define jigsaw_a_n_h_width 108
+#define jigsaw_a_n_h_height 73
+#define jigsaw_a_n_h_x_hot 21
+#define jigsaw_a_n_h_y_hot 1
+static unsigned char jigsaw_a_n_h_bits[] = {
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x7e,
+   0x80, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1c, 0xe0, 0x07, 0x00,
+   0xc0, 0xff, 0xc1, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0xf8,
+   0x3f, 0x00, 0xe0, 0xc1, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0xf0, 0x3f, 0x78, 0x00, 0x70, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0xe0, 0x07, 0xe0, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x1c, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x03, 0x0c, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
+   0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06,
+   0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x06, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x18, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x70, 0x00,
+   0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x07, 0xe0, 0x00,
+   0xe0, 0x80, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x1f,
+   0x70, 0x00, 0xc0, 0xff, 0xc1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x30, 0xf8, 0x3f, 0x00, 0x00, 0x7f, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x18, 0xe0, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00,
+   0xf0, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06,
+   0x00, 0x00, 0xfe, 0x07, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x06, 0x00, 0x80, 0x0f, 0x1f, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x06, 0x00, 0xc0, 0x03, 0x3c, 0x00, 0x00, 0x06, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0xe0, 0x00, 0x70, 0x00, 0x00,
+   0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x60, 0x00, 0x60,
+   0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x30,
+   0x00, 0xc0, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
+   0x00, 0x38, 0x00, 0xc0, 0x01, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x03, 0x00, 0x18, 0x00, 0x80, 0x01, 0x00, 0x0c, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x03, 0x00, 0x18, 0x00, 0x80, 0x01, 0x00, 0x0c, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x18, 0x00, 0x80, 0x01, 0x00,
+   0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x18, 0x00, 0x80,
+   0x01, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x18,
+   0x00, 0x80, 0x01, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01,
+   0x00, 0x18, 0x00, 0x80, 0x01, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0xc0, 0x00, 0x00, 0x18, 0x00, 0x80, 0x01, 0x00, 0x30, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0xc0, 0x00, 0x00, 0x38, 0x00, 0xc0, 0x01, 0x00, 0x30, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x30, 0x00, 0xc0, 0x00, 0x00,
+   0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x60, 0x00, 0x60,
+   0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60,
+   0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00,
+   0x00, 0x60, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x60, 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0xe0, 0x03, 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, 0x7c, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0xc0, 0x3f, 0x00, 0x30, 0x00, 0xc0, 0x00, 0xc0,
+   0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x03, 0x18, 0x00, 0x80,
+   0x01, 0xfc, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x3f, 0x0c,
+   0x00, 0x00, 0xc3, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0xfc, 0x07, 0x00, 0x00, 0xfe, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0xc0, 0x03, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00};
diff --git a/hacks/images/jigsaw/jigsaw_a_ne_f.xbm b/hacks/images/jigsaw/jigsaw_a_ne_f.xbm
new file mode 100644 (file)
index 0000000..c6e36e8
--- /dev/null
@@ -0,0 +1,79 @@
+#define jigsaw_a_ne_f_width 89
+#define jigsaw_a_ne_f_height 74
+#define jigsaw_a_ne_f_x_hot 21
+#define jigsaw_a_ne_f_y_hot 1
+static unsigned char jigsaw_a_ne_f_bits[] = {
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
+   0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
+   0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
+   0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
+   0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
+   0x00, 0x00, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
+   0x00, 0x00, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
+   0x00, 0x00, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
+   0x00, 0x00, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
+   0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
+   0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
+   0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
+   0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
+   0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
+   0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
+   0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
+   0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
+   0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
+   0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
+   0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
+   0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
+   0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
+   0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
+   0x00, 0x7e, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
+   0xc0, 0xff, 0xc1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
+   0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
+   0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
+   0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
+   0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
+   0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
+   0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
+   0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
+   0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
+   0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
+   0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
+   0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
+   0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
+   0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
+   0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
+   0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
+   0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
+   0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
+   0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
+   0xc0, 0xff, 0xc1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
+   0x00, 0x7f, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
+   0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
+   0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
+   0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0x0f, 0xfe, 0xff, 0xff, 0xff, 0x00,
+   0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0x03, 0xf8, 0xff, 0xff, 0xff, 0x00,
+   0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0x00, 0xe0, 0xff, 0xff, 0xff, 0x00,
+   0x00, 0x00, 0x00, 0xfe, 0xff, 0x7f, 0x00, 0xc0, 0xff, 0xff, 0xff, 0x00,
+   0x00, 0x00, 0x00, 0xff, 0xff, 0x3f, 0x00, 0x80, 0xff, 0xff, 0xff, 0x00,
+   0x00, 0x00, 0x00, 0xff, 0xff, 0x3f, 0x00, 0x80, 0xff, 0xff, 0xff, 0x00,
+   0x00, 0x00, 0x00, 0xff, 0xff, 0x1f, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00,
+   0x00, 0x00, 0x00, 0xff, 0xff, 0x1f, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00,
+   0x00, 0x00, 0x80, 0xff, 0xff, 0x1f, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00,
+   0x00, 0x00, 0x80, 0xff, 0xff, 0x1f, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00,
+   0x00, 0x00, 0x80, 0xff, 0xff, 0x1f, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00,
+   0x00, 0x00, 0x80, 0xff, 0xff, 0x1f, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00,
+   0x00, 0x00, 0xc0, 0xff, 0xff, 0x1f, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00,
+   0x00, 0x00, 0xc0, 0xff, 0xff, 0x3f, 0x00, 0x80, 0xff, 0xff, 0xff, 0x00,
+   0x00, 0x00, 0xc0, 0xff, 0xff, 0x3f, 0x00, 0x80, 0xff, 0xff, 0xff, 0x00,
+   0x00, 0x00, 0xc0, 0xff, 0xff, 0x7f, 0x00, 0xc0, 0xff, 0xff, 0xff, 0x00,
+   0x00, 0x00, 0xe0, 0xff, 0xff, 0x7f, 0x00, 0xc0, 0xff, 0xff, 0xff, 0x00,
+   0x00, 0x00, 0xe0, 0xff, 0xff, 0x7f, 0x00, 0xc0, 0xff, 0xff, 0xff, 0x00,
+   0x00, 0x00, 0xe0, 0xff, 0xff, 0x7f, 0x00, 0xc0, 0xff, 0xff, 0xff, 0x00,
+   0x00, 0x00, 0xe0, 0xff, 0xff, 0x7f, 0x00, 0xc0, 0xff, 0xff, 0xff, 0x00,
+   0x00, 0x00, 0xc0, 0xff, 0xff, 0x3f, 0x00, 0x80, 0xff, 0xff, 0x7f, 0x00,
+   0x00, 0x00, 0x00, 0xfc, 0xff, 0x1f, 0x00, 0x00, 0xff, 0xff, 0x07, 0x00,
+   0x00, 0x00, 0x00, 0xc0, 0xff, 0x0f, 0x00, 0x00, 0xfe, 0x7f, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0xfc, 0x07, 0x00, 0x00, 0xfc, 0x07, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0xc0, 0x03, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
diff --git a/hacks/images/jigsaw/jigsaw_a_ne_h.xbm b/hacks/images/jigsaw/jigsaw_a_ne_h.xbm
new file mode 100644 (file)
index 0000000..52ac3ed
--- /dev/null
@@ -0,0 +1,79 @@
+#define jigsaw_a_ne_h_width 89
+#define jigsaw_a_ne_h_height 74
+#define jigsaw_a_ne_h_x_hot 21
+#define jigsaw_a_ne_h_y_hot 1
+static unsigned char jigsaw_a_ne_h_bits[] = {
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
+   0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
+   0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00,
+   0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00,
+   0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00,
+   0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00,
+   0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00,
+   0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00,
+   0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00,
+   0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00,
+   0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00,
+   0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00,
+   0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00,
+   0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00,
+   0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00,
+   0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00,
+   0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00,
+   0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00,
+   0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00,
+   0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00,
+   0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00,
+   0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00,
+   0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00,
+   0x00, 0x7e, 0x80, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00,
+   0xc0, 0xff, 0xc1, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00,
+   0xe0, 0xc1, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00,
+   0x70, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00,
+   0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00,
+   0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00,
+   0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00,
+   0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00,
+   0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00,
+   0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00,
+   0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00,
+   0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00,
+   0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00,
+   0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00,
+   0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00,
+   0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00,
+   0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00,
+   0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00,
+   0x70, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00,
+   0xe0, 0x80, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00,
+   0xc0, 0xff, 0xc1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00,
+   0x00, 0x7f, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00,
+   0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0xf0, 0x01, 0x00, 0x00, 0xc0, 0x00,
+   0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0xfe, 0x0f, 0x00, 0x00, 0xc0, 0x00,
+   0x00, 0x00, 0x00, 0x06, 0x00, 0x80, 0x0f, 0x3e, 0x00, 0x00, 0xc0, 0x00,
+   0x00, 0x00, 0x00, 0x06, 0x00, 0xc0, 0x03, 0x78, 0x00, 0x00, 0xc0, 0x00,
+   0x00, 0x00, 0x00, 0x06, 0x00, 0xe0, 0x00, 0xe0, 0x00, 0x00, 0xc0, 0x00,
+   0x00, 0x00, 0x00, 0x06, 0x00, 0x60, 0x00, 0xc0, 0x00, 0x00, 0xc0, 0x00,
+   0x00, 0x00, 0x00, 0x03, 0x00, 0x30, 0x00, 0x80, 0x01, 0x00, 0xc0, 0x00,
+   0x00, 0x00, 0x00, 0x03, 0x00, 0x38, 0x00, 0x80, 0x03, 0x00, 0xc0, 0x00,
+   0x00, 0x00, 0x00, 0x03, 0x00, 0x18, 0x00, 0x00, 0x03, 0x00, 0xc0, 0x00,
+   0x00, 0x00, 0x00, 0x03, 0x00, 0x18, 0x00, 0x00, 0x03, 0x00, 0xc0, 0x00,
+   0x00, 0x00, 0x80, 0x01, 0x00, 0x18, 0x00, 0x00, 0x03, 0x00, 0xc0, 0x00,
+   0x00, 0x00, 0x80, 0x01, 0x00, 0x18, 0x00, 0x00, 0x03, 0x00, 0xc0, 0x00,
+   0x00, 0x00, 0x80, 0x01, 0x00, 0x18, 0x00, 0x00, 0x03, 0x00, 0xc0, 0x00,
+   0x00, 0x00, 0x80, 0x01, 0x00, 0x18, 0x00, 0x00, 0x03, 0x00, 0xc0, 0x00,
+   0x00, 0x00, 0xc0, 0x00, 0x00, 0x18, 0x00, 0x00, 0x03, 0x00, 0xc0, 0x00,
+   0x00, 0x00, 0xc0, 0x00, 0x00, 0x38, 0x00, 0x80, 0x03, 0x00, 0xc0, 0x00,
+   0x00, 0x00, 0xc0, 0x00, 0x00, 0x30, 0x00, 0x80, 0x01, 0x00, 0xc0, 0x00,
+   0x00, 0x00, 0xc0, 0x00, 0x00, 0x60, 0x00, 0xc0, 0x00, 0x00, 0xc0, 0x00,
+   0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0xc0, 0x00, 0x00, 0xc0, 0x00,
+   0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0xc0, 0x00, 0x00, 0xc0, 0x00,
+   0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0xc0, 0x00, 0x00, 0xc0, 0x00,
+   0x00, 0x00, 0xe0, 0x03, 0x00, 0x60, 0x00, 0xc0, 0x00, 0x00, 0xf8, 0x00,
+   0x00, 0x00, 0xc0, 0x3f, 0x00, 0x30, 0x00, 0x80, 0x01, 0x80, 0x7f, 0x00,
+   0x00, 0x00, 0x00, 0xfc, 0x03, 0x18, 0x00, 0x00, 0x03, 0xf8, 0x07, 0x00,
+   0x00, 0x00, 0x00, 0xc0, 0x3f, 0x0c, 0x00, 0x00, 0x86, 0x7f, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0xfc, 0x07, 0x00, 0x00, 0xfc, 0x07, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0xc0, 0x03, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
diff --git a/hacks/images/jigsaw/jigsaw_a_nw_f.xbm b/hacks/images/jigsaw/jigsaw_a_nw_f.xbm
new file mode 100644 (file)
index 0000000..ff4cafe
--- /dev/null
@@ -0,0 +1,73 @@
+#define jigsaw_a_nw_f_width 88
+#define jigsaw_a_nw_f_height 74
+#define jigsaw_a_nw_f_x_hot 1
+#define jigsaw_a_nw_f_y_hot 1
+static unsigned char jigsaw_a_nw_f_bits[] = {
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00, 0x00, 0xfe, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0x00, 0x00, 0xfe, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0x07, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0x07, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0x03, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0x03, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0x03, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03,
+   0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00,
+   0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00,
+   0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0xfe,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0xfe, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0x7f, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0x7f, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f,
+   0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00,
+   0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00,
+   0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00,
+   0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x7e, 0x00, 0xfe,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x83, 0xff, 0x03, 0xfe, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0xfe, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xfe, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0xfe, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0x3f, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0x7f, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0x7f, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0x7f, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0x7f, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f,
+   0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xfe,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xfe, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xfe, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xfe, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xfe, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0x0f, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0x07, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0x83, 0xff, 0x03, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01,
+   0xfe, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00,
+   0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x00,
+   0xfe, 0xff, 0xff, 0xff, 0xf0, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x00, 0xfe,
+   0xff, 0xff, 0x3f, 0xc0, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x00, 0xfe, 0xff,
+   0xff, 0x0f, 0x00, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff,
+   0x07, 0x00, 0xfe, 0xff, 0x7f, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0x03,
+   0x00, 0xfc, 0xff, 0xff, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0x03, 0x00,
+   0xfc, 0xff, 0xff, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0x01, 0x00, 0xf8,
+   0xff, 0xff, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0x01, 0x00, 0xf8, 0xff,
+   0xff, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0x01, 0x00, 0xf8, 0xff, 0xff,
+   0x01, 0x00, 0x00, 0xfe, 0xff, 0xff, 0x01, 0x00, 0xf8, 0xff, 0xff, 0x01,
+   0x00, 0x00, 0xfe, 0xff, 0xff, 0x01, 0x00, 0xf8, 0xff, 0xff, 0x01, 0x00,
+   0x00, 0xfe, 0xff, 0xff, 0x01, 0x00, 0xf8, 0xff, 0xff, 0x01, 0x00, 0x00,
+   0xfe, 0xff, 0xff, 0x01, 0x00, 0xf8, 0xff, 0xff, 0x03, 0x00, 0x00, 0xfe,
+   0xff, 0xff, 0x03, 0x00, 0xfc, 0xff, 0xff, 0x03, 0x00, 0x00, 0xfe, 0xff,
+   0xff, 0x03, 0x00, 0xfc, 0xff, 0xff, 0x03, 0x00, 0x00, 0xfe, 0xff, 0xff,
+   0x07, 0x00, 0xfe, 0xff, 0xff, 0x03, 0x00, 0x00, 0xfe, 0xff, 0xff, 0x07,
+   0x00, 0xfe, 0xff, 0xff, 0x07, 0x00, 0x00, 0xfe, 0xff, 0xff, 0x07, 0x00,
+   0xfe, 0xff, 0xff, 0x07, 0x00, 0x00, 0xfe, 0xff, 0xff, 0x07, 0x00, 0xfe,
+   0xff, 0xff, 0x07, 0x00, 0x00, 0xfe, 0xff, 0xff, 0x07, 0x00, 0xfe, 0xff,
+   0xff, 0x07, 0x00, 0x00, 0xfc, 0xff, 0xff, 0x03, 0x00, 0xfc, 0xff, 0xff,
+   0x03, 0x00, 0x00, 0xc0, 0xff, 0xff, 0x01, 0x00, 0xf8, 0xff, 0x3f, 0x00,
+   0x00, 0x00, 0x00, 0xfc, 0xff, 0x00, 0x00, 0xf0, 0xff, 0x03, 0x00, 0x00,
+   0x00, 0x00, 0xc0, 0x7f, 0x00, 0x00, 0xe0, 0x3f, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x3c, 0x00, 0x00, 0xc0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
diff --git a/hacks/images/jigsaw/jigsaw_a_nw_h.xbm b/hacks/images/jigsaw/jigsaw_a_nw_h.xbm
new file mode 100644 (file)
index 0000000..39b6df6
--- /dev/null
@@ -0,0 +1,73 @@
+#define jigsaw_a_nw_h_width 88
+#define jigsaw_a_nw_h_height 74
+#define jigsaw_a_nw_h_x_hot 1
+#define jigsaw_a_nw_h_y_hot 1
+static unsigned char jigsaw_a_nw_h_bits[] = {
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00, 0x00, 0xfe, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0x00, 0x00, 0x06, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x03, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x03, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x03, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
+   0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00,
+   0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00,
+   0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x06,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x06, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x60, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x60, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60,
+   0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00,
+   0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00,
+   0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00,
+   0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x01, 0x7e, 0x00, 0x06,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x83, 0xff, 0x03, 0x06, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x83, 0x07, 0x06, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x00, 0x0e, 0x06, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x06, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x30, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x60, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x60, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x60, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x60, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60,
+   0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x06,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x06, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x06, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x06, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x06, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x7c, 0x00, 0x0e, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0xfe, 0x01, 0x07, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x83, 0xff, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01,
+   0xfe, 0x00, 0x06, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0xc0, 0x00, 0x00,
+   0x00, 0x06, 0x00, 0x00, 0xe0, 0x7f, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00,
+   0x06, 0x00, 0x00, 0xf8, 0xf0, 0x01, 0x00, 0x60, 0x00, 0x00, 0x00, 0x06,
+   0x00, 0x00, 0x3c, 0xc0, 0x03, 0x00, 0x60, 0x00, 0x00, 0x00, 0x06, 0x00,
+   0x00, 0x0e, 0x00, 0x07, 0x00, 0x60, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00,
+   0x06, 0x00, 0x06, 0x00, 0x60, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x03,
+   0x00, 0x0c, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x80, 0x03, 0x00,
+   0x1c, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x80, 0x01, 0x00, 0x18,
+   0x00, 0xc0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x80, 0x01, 0x00, 0x18, 0x00,
+   0xc0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x80, 0x01, 0x00, 0x18, 0x00, 0x80,
+   0x01, 0x00, 0x00, 0x06, 0x00, 0x80, 0x01, 0x00, 0x18, 0x00, 0x80, 0x01,
+   0x00, 0x00, 0x06, 0x00, 0x80, 0x01, 0x00, 0x18, 0x00, 0x80, 0x01, 0x00,
+   0x00, 0x06, 0x00, 0x80, 0x01, 0x00, 0x18, 0x00, 0x80, 0x01, 0x00, 0x00,
+   0x06, 0x00, 0x80, 0x01, 0x00, 0x18, 0x00, 0x00, 0x03, 0x00, 0x00, 0x06,
+   0x00, 0x80, 0x03, 0x00, 0x1c, 0x00, 0x00, 0x03, 0x00, 0x00, 0x06, 0x00,
+   0x00, 0x03, 0x00, 0x0c, 0x00, 0x00, 0x03, 0x00, 0x00, 0x06, 0x00, 0x00,
+   0x06, 0x00, 0x06, 0x00, 0x00, 0x03, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06,
+   0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00,
+   0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x06,
+   0x00, 0x00, 0x06, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00,
+   0xc0, 0x07, 0x00, 0x00, 0xfc, 0x03, 0x00, 0x03, 0x00, 0x0c, 0x00, 0xfc,
+   0x03, 0x00, 0x00, 0xc0, 0x3f, 0x80, 0x01, 0x00, 0x18, 0xc0, 0x3f, 0x00,
+   0x00, 0x00, 0x00, 0xfc, 0xc3, 0x00, 0x00, 0x30, 0xfc, 0x03, 0x00, 0x00,
+   0x00, 0x00, 0xc0, 0x7f, 0x00, 0x00, 0xe0, 0x3f, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x3c, 0x00, 0x00, 0xc0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
diff --git a/hacks/images/jigsaw/jigsaw_a_s_f.xbm b/hacks/images/jigsaw/jigsaw_a_s_f.xbm
new file mode 100644 (file)
index 0000000..1ba034d
--- /dev/null
@@ -0,0 +1,91 @@
+#define jigsaw_a_s_f_width 108
+#define jigsaw_a_s_f_height 73
+#define jigsaw_a_s_f_x_hot 20
+#define jigsaw_a_s_f_y_hot 5
+static unsigned char jigsaw_a_s_f_bits[] = {
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x03, 0x00, 0x00, 0x3c, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x07, 0x00, 0x00,
+   0xfe, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0x0f,
+   0x00, 0x00, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc,
+   0xff, 0x1f, 0x00, 0x80, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0xc0, 0xff, 0xff, 0x3f, 0x00, 0xc0, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0xe0, 0xff, 0xff, 0x7f, 0x00, 0xe0, 0xff, 0xff, 0x7f, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0x7f, 0x00, 0xe0, 0xff, 0xff,
+   0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0x7f, 0x00, 0xe0,
+   0xff, 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0x7f,
+   0x00, 0xe0, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff,
+   0xff, 0x7f, 0x00, 0xe0, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0xc0, 0xff, 0xff, 0x3f, 0x00, 0xc0, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0xc0, 0xff, 0xff, 0x3f, 0x00, 0xc0, 0xff, 0xff, 0x3f, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0x1f, 0x00, 0x80, 0xff, 0xff,
+   0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, 0x1f, 0x00, 0x80,
+   0xff, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, 0x1f,
+   0x00, 0x80, 0xff, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff,
+   0xff, 0x1f, 0x00, 0x80, 0xff, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x80, 0xff, 0xff, 0x1f, 0x00, 0x80, 0xff, 0xff, 0x1f, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0xff, 0xff, 0x1f, 0x00, 0x80, 0xff, 0xff, 0x0f, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x1f, 0x00, 0x80, 0xff, 0xff,
+   0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x3f, 0x00, 0xc0,
+   0xff, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x3f,
+   0x00, 0xc0, 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe,
+   0xff, 0x7f, 0x00, 0xe0, 0xff, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0xfe, 0xff, 0xff, 0x00, 0xf0, 0xff, 0xff, 0x07, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0x03, 0xfc, 0xff, 0xff, 0x07, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0x0f, 0xff, 0xff, 0xff,
+   0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x80, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0xe0, 0x0f, 0x00, 0xc0, 0xff,
+   0xc1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xf8, 0x3f, 0x00,
+   0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0x7f, 0x00, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0x00, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0xfc, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0xfe, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07,
+   0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0x07, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0x07, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0xfe, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0xfe, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07,
+   0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0x07, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0x03, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0xf0, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0xe0, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00,
+   0xc0, 0xff, 0xc1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xf8,
+   0x3f, 0x00, 0x00, 0x7e, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0x1f, 0xe0, 0x07, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00};
diff --git a/hacks/images/jigsaw/jigsaw_a_s_h.xbm b/hacks/images/jigsaw/jigsaw_a_s_h.xbm
new file mode 100644 (file)
index 0000000..4012c2a
--- /dev/null
@@ -0,0 +1,91 @@
+#define jigsaw_a_s_h_width 108
+#define jigsaw_a_s_h_height 73
+#define jigsaw_a_s_h_x_hot 20
+#define jigsaw_a_s_h_y_hot 5
+static unsigned char jigsaw_a_s_h_bits[] = {
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x03, 0x00, 0x00, 0x3c, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0x07, 0x00, 0x00,
+   0xfe, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x3f, 0x0c,
+   0x00, 0x00, 0xc3, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc,
+   0x03, 0x18, 0x00, 0x80, 0x01, 0xfc, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0xc0, 0x3f, 0x00, 0x30, 0x00, 0xc0, 0x00, 0xc0, 0x3f, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0xe0, 0x03, 0x00, 0x60, 0x00, 0x60, 0x00, 0x00, 0x7c, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, 0x00,
+   0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x60,
+   0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60,
+   0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00,
+   0x00, 0x60, 0x00, 0x60, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0xc0, 0x00, 0x00, 0x30, 0x00, 0xc0, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0xc0, 0x00, 0x00, 0x38, 0x00, 0xc0, 0x01, 0x00, 0x30, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x18, 0x00, 0x80, 0x01, 0x00,
+   0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x18, 0x00, 0x80,
+   0x01, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x18,
+   0x00, 0x80, 0x01, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01,
+   0x00, 0x18, 0x00, 0x80, 0x01, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x80, 0x01, 0x00, 0x18, 0x00, 0x80, 0x01, 0x00, 0x18, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x03, 0x00, 0x18, 0x00, 0x80, 0x01, 0x00, 0x0c, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x18, 0x00, 0x80, 0x01, 0x00,
+   0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x38, 0x00, 0xc0,
+   0x01, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x30,
+   0x00, 0xc0, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06,
+   0x00, 0x60, 0x00, 0x60, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x06, 0x00, 0xe0, 0x00, 0x70, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x06, 0x00, 0xc0, 0x03, 0x3c, 0x00, 0x00, 0x06, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x80, 0x0f, 0x1f, 0x00, 0x00,
+   0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0xfe, 0x07,
+   0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00,
+   0xf0, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x7f, 0x80, 0x01,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0xe0, 0x0f, 0x00, 0xc0, 0xff,
+   0xc1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0xf8, 0x3f, 0x00,
+   0xe0, 0x80, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x1f,
+   0x70, 0x00, 0x70, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0xc0, 0x07, 0xe0, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x0c, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x06, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06,
+   0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x06, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06,
+   0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x06, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x03, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x80, 0x03, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x70, 0x00, 0x7e, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x07, 0xe0, 0x00, 0xe0, 0xc1,
+   0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x3f, 0x78, 0x00,
+   0xc0, 0xff, 0xc1, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0xf8,
+   0x3f, 0x00, 0x00, 0x7e, 0x80, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x1c, 0xe0, 0x07, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00};
diff --git a/hacks/images/jigsaw/jigsaw_a_se_f.xbm b/hacks/images/jigsaw/jigsaw_a_se_f.xbm
new file mode 100644 (file)
index 0000000..13f0554
--- /dev/null
@@ -0,0 +1,73 @@
+#define jigsaw_a_se_f_width 88
+#define jigsaw_a_se_f_height 74
+#define jigsaw_a_se_f_x_hot 20
+#define jigsaw_a_se_f_y_hot 6
+static unsigned char jigsaw_a_se_f_bits[] = {
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0xc0, 0x03, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0xfc, 0x07, 0x00, 0x00, 0xfe, 0x03, 0x00, 0x00, 0x00, 0x00,
+   0xc0, 0xff, 0x0f, 0x00, 0x00, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0xfc,
+   0xff, 0x1f, 0x00, 0x80, 0xff, 0xff, 0x03, 0x00, 0x00, 0xc0, 0xff, 0xff,
+   0x3f, 0x00, 0xc0, 0xff, 0xff, 0x3f, 0x00, 0x00, 0xe0, 0xff, 0xff, 0x7f,
+   0x00, 0xe0, 0xff, 0xff, 0x7f, 0x00, 0x00, 0xe0, 0xff, 0xff, 0x7f, 0x00,
+   0xe0, 0xff, 0xff, 0x7f, 0x00, 0x00, 0xe0, 0xff, 0xff, 0x7f, 0x00, 0xe0,
+   0xff, 0xff, 0x7f, 0x00, 0x00, 0xe0, 0xff, 0xff, 0x7f, 0x00, 0xe0, 0xff,
+   0xff, 0x7f, 0x00, 0x00, 0xc0, 0xff, 0xff, 0x7f, 0x00, 0xe0, 0xff, 0xff,
+   0x7f, 0x00, 0x00, 0xc0, 0xff, 0xff, 0x3f, 0x00, 0xc0, 0xff, 0xff, 0x7f,
+   0x00, 0x00, 0xc0, 0xff, 0xff, 0x3f, 0x00, 0xc0, 0xff, 0xff, 0x7f, 0x00,
+   0x00, 0xc0, 0xff, 0xff, 0x1f, 0x00, 0x80, 0xff, 0xff, 0x7f, 0x00, 0x00,
+   0x80, 0xff, 0xff, 0x1f, 0x00, 0x80, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x80,
+   0xff, 0xff, 0x1f, 0x00, 0x80, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x80, 0xff,
+   0xff, 0x1f, 0x00, 0x80, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x80, 0xff, 0xff,
+   0x1f, 0x00, 0x80, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x1f,
+   0x00, 0x80, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x1f, 0x00,
+   0x80, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x3f, 0x00, 0xc0,
+   0xff, 0xff, 0x7f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x3f, 0x00, 0xc0, 0xff,
+   0xff, 0x7f, 0x00, 0x00, 0x00, 0xfe, 0xff, 0x7f, 0x00, 0xe0, 0xff, 0xff,
+   0x7f, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0x00, 0xf0, 0xff, 0xff, 0x7f,
+   0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0x03, 0xfc, 0xff, 0xff, 0x7f, 0x00,
+   0x00, 0x00, 0xfe, 0xff, 0xff, 0x0f, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00,
+   0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x00,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x7f, 0x80, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xc0, 0xff, 0xc1, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0x7f, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0x7f, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0x7f, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0x7f, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0x7f, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f,
+   0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xfe,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xfe, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xfe, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xfe, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xfe, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0x7f, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0x7f, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0x7f, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0x7f, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0x7f, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f,
+   0xc0, 0xff, 0xc1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00,
+   0x7e, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00,
+   0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x00,
+   0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x00, 0xfe,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x00, 0xfe, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0x7f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0x7f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0x7f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f,
+   0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00,
+   0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00,
+   0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x80,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00, 0xc0, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00, 0xc0, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00, 0xc0, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00, 0xc0, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0x7f, 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0x7f, 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0x7f, 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0x7f, 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f,
+   0x00, 0x00, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
diff --git a/hacks/images/jigsaw/jigsaw_a_se_h.xbm b/hacks/images/jigsaw/jigsaw_a_se_h.xbm
new file mode 100644 (file)
index 0000000..a023af2
--- /dev/null
@@ -0,0 +1,73 @@
+#define jigsaw_a_se_h_width 88
+#define jigsaw_a_se_h_height 74
+#define jigsaw_a_se_h_x_hot 20
+#define jigsaw_a_se_h_y_hot 6
+static unsigned char jigsaw_a_se_h_bits[] = {
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0xc0, 0x03, 0x00, 0x00, 0x3c, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0xfc, 0x07, 0x00, 0x00, 0xfe, 0x03, 0x00, 0x00, 0x00, 0x00,
+   0xc0, 0x3f, 0x0c, 0x00, 0x00, 0xc3, 0x3f, 0x00, 0x00, 0x00, 0x00, 0xfc,
+   0x03, 0x18, 0x00, 0x80, 0x01, 0xfc, 0x03, 0x00, 0x00, 0xc0, 0x3f, 0x00,
+   0x30, 0x00, 0xc0, 0x00, 0xc0, 0x3f, 0x00, 0x00, 0xe0, 0x03, 0x00, 0x60,
+   0x00, 0x60, 0x00, 0x00, 0x7c, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00,
+   0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x60,
+   0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x60, 0x00,
+   0x00, 0x60, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x60, 0x00, 0x60, 0x00, 0x00,
+   0x60, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x30, 0x00, 0xc0, 0x00, 0x00, 0x60,
+   0x00, 0x00, 0xc0, 0x00, 0x00, 0x38, 0x00, 0xc0, 0x01, 0x00, 0x60, 0x00,
+   0x00, 0xc0, 0x00, 0x00, 0x18, 0x00, 0x80, 0x01, 0x00, 0x60, 0x00, 0x00,
+   0x80, 0x01, 0x00, 0x18, 0x00, 0x80, 0x01, 0x00, 0x60, 0x00, 0x00, 0x80,
+   0x01, 0x00, 0x18, 0x00, 0x80, 0x01, 0x00, 0x60, 0x00, 0x00, 0x80, 0x01,
+   0x00, 0x18, 0x00, 0x80, 0x01, 0x00, 0x60, 0x00, 0x00, 0x80, 0x01, 0x00,
+   0x18, 0x00, 0x80, 0x01, 0x00, 0x60, 0x00, 0x00, 0x00, 0x03, 0x00, 0x18,
+   0x00, 0x80, 0x01, 0x00, 0x60, 0x00, 0x00, 0x00, 0x03, 0x00, 0x18, 0x00,
+   0x80, 0x01, 0x00, 0x60, 0x00, 0x00, 0x00, 0x03, 0x00, 0x38, 0x00, 0xc0,
+   0x01, 0x00, 0x60, 0x00, 0x00, 0x00, 0x03, 0x00, 0x30, 0x00, 0xc0, 0x00,
+   0x00, 0x60, 0x00, 0x00, 0x00, 0x06, 0x00, 0x60, 0x00, 0x60, 0x00, 0x00,
+   0x60, 0x00, 0x00, 0x00, 0x06, 0x00, 0xe0, 0x00, 0x70, 0x00, 0x00, 0x60,
+   0x00, 0x00, 0x00, 0x06, 0x00, 0xc0, 0x03, 0x3c, 0x00, 0x00, 0x60, 0x00,
+   0x00, 0x00, 0x06, 0x00, 0x80, 0x0f, 0x1f, 0x00, 0x00, 0x60, 0x00, 0x00,
+   0x00, 0x06, 0x00, 0x00, 0xfe, 0x07, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00,
+   0x03, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x60, 0x00, 0x7f, 0x80, 0x01,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0xc0, 0xff, 0xc1, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0xe0, 0x80, 0x7f, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x60, 0x70, 0x00, 0x3e, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x60, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x60, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x60, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x60, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60,
+   0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x06,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x06, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x06, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x06, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x06, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x60, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x60, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x60, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x60, 0x70, 0x00, 0x7e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x60, 0xe0, 0xc1, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60,
+   0xc0, 0xff, 0xc1, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00,
+   0x7e, 0x80, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00,
+   0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00,
+   0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x06,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x06, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x60, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x60, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60,
+   0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00,
+   0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00,
+   0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x80,
+   0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0xc0, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0xc0, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x60, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x60, 0x00, 0x00, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f,
+   0x00, 0x00, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
diff --git a/hacks/images/jigsaw/jigsaw_a_sw_f.xbm b/hacks/images/jigsaw/jigsaw_a_sw_f.xbm
new file mode 100644 (file)
index 0000000..1b11399
--- /dev/null
@@ -0,0 +1,73 @@
+#define jigsaw_a_sw_f_width 88
+#define jigsaw_a_sw_f_height 74
+#define jigsaw_a_sw_f_x_hot 1
+#define jigsaw_a_sw_f_y_hot 6
+static unsigned char jigsaw_a_sw_f_bits[] = {
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x3c, 0x00, 0x00, 0xc0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0,
+   0x7f, 0x00, 0x00, 0xe0, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xff,
+   0x00, 0x00, 0xf0, 0xff, 0x03, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0x01,
+   0x00, 0xf8, 0xff, 0x3f, 0x00, 0x00, 0x00, 0xfc, 0xff, 0xff, 0x03, 0x00,
+   0xfc, 0xff, 0xff, 0x03, 0x00, 0x00, 0xfe, 0xff, 0xff, 0x07, 0x00, 0xfe,
+   0xff, 0xff, 0x07, 0x00, 0x00, 0xfe, 0xff, 0xff, 0x07, 0x00, 0xfe, 0xff,
+   0xff, 0x07, 0x00, 0x00, 0xfe, 0xff, 0xff, 0x07, 0x00, 0xfe, 0xff, 0xff,
+   0x07, 0x00, 0x00, 0xfe, 0xff, 0xff, 0x07, 0x00, 0xfe, 0xff, 0xff, 0x07,
+   0x00, 0x00, 0xfe, 0xff, 0xff, 0x07, 0x00, 0xfe, 0xff, 0xff, 0x03, 0x00,
+   0x00, 0xfe, 0xff, 0xff, 0x03, 0x00, 0xfc, 0xff, 0xff, 0x03, 0x00, 0x00,
+   0xfe, 0xff, 0xff, 0x03, 0x00, 0xfc, 0xff, 0xff, 0x03, 0x00, 0x00, 0xfe,
+   0xff, 0xff, 0x01, 0x00, 0xf8, 0xff, 0xff, 0x03, 0x00, 0x00, 0xfe, 0xff,
+   0xff, 0x01, 0x00, 0xf8, 0xff, 0xff, 0x01, 0x00, 0x00, 0xfe, 0xff, 0xff,
+   0x01, 0x00, 0xf8, 0xff, 0xff, 0x01, 0x00, 0x00, 0xfe, 0xff, 0xff, 0x01,
+   0x00, 0xf8, 0xff, 0xff, 0x01, 0x00, 0x00, 0xfe, 0xff, 0xff, 0x01, 0x00,
+   0xf8, 0xff, 0xff, 0x01, 0x00, 0x00, 0xfe, 0xff, 0xff, 0x01, 0x00, 0xf8,
+   0xff, 0xff, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0x01, 0x00, 0xf8, 0xff,
+   0xff, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0x03, 0x00, 0xfc, 0xff, 0xff,
+   0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0x03, 0x00, 0xfc, 0xff, 0xff, 0x00,
+   0x00, 0x00, 0xfe, 0xff, 0xff, 0x07, 0x00, 0xfe, 0xff, 0x7f, 0x00, 0x00,
+   0x00, 0xfe, 0xff, 0xff, 0x0f, 0x00, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x00,
+   0xfe, 0xff, 0xff, 0x3f, 0xc0, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x00, 0xfe,
+   0xff, 0xff, 0xff, 0xf0, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x00, 0xfe, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0x01, 0xfe, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0x83, 0xff, 0x03, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0x07, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0x0f, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0x1f, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0x3f, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0x3f, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f,
+   0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xfe,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xfe, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xfe, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xfe, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xfe, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0x7f, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0x3f, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0x3f, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0x1f, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0x0f, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07,
+   0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x83, 0xff, 0x03, 0xfe,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x7e, 0x00, 0xfe, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0x7f, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0x7f, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0x7f, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
+   0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00,
+   0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00,
+   0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0xfe,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0xfe, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0xfe, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0x03, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0x03, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0x03, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0x03, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0x07, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07,
+   0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0x00,
+   0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0x00, 0x00,
+   0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
diff --git a/hacks/images/jigsaw/jigsaw_a_sw_h.xbm b/hacks/images/jigsaw/jigsaw_a_sw_h.xbm
new file mode 100644 (file)
index 0000000..4f4d5ad
--- /dev/null
@@ -0,0 +1,73 @@
+#define jigsaw_a_sw_h_width 88
+#define jigsaw_a_sw_h_height 74
+#define jigsaw_a_sw_h_x_hot 1
+#define jigsaw_a_sw_h_y_hot 6
+static unsigned char jigsaw_a_sw_h_bits[] = {
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x3c, 0x00, 0x00, 0xc0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0,
+   0x7f, 0x00, 0x00, 0xe0, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xc3,
+   0x00, 0x00, 0x30, 0xfc, 0x03, 0x00, 0x00, 0x00, 0xc0, 0x3f, 0x80, 0x01,
+   0x00, 0x18, 0xc0, 0x3f, 0x00, 0x00, 0x00, 0xfc, 0x03, 0x00, 0x03, 0x00,
+   0x0c, 0x00, 0xfc, 0x03, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x06, 0x00, 0x06,
+   0x00, 0xc0, 0x07, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00,
+   0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00,
+   0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x06,
+   0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x03, 0x00,
+   0x00, 0x06, 0x00, 0x00, 0x03, 0x00, 0x0c, 0x00, 0x00, 0x03, 0x00, 0x00,
+   0x06, 0x00, 0x80, 0x03, 0x00, 0x1c, 0x00, 0x00, 0x03, 0x00, 0x00, 0x06,
+   0x00, 0x80, 0x01, 0x00, 0x18, 0x00, 0x00, 0x03, 0x00, 0x00, 0x06, 0x00,
+   0x80, 0x01, 0x00, 0x18, 0x00, 0x80, 0x01, 0x00, 0x00, 0x06, 0x00, 0x80,
+   0x01, 0x00, 0x18, 0x00, 0x80, 0x01, 0x00, 0x00, 0x06, 0x00, 0x80, 0x01,
+   0x00, 0x18, 0x00, 0x80, 0x01, 0x00, 0x00, 0x06, 0x00, 0x80, 0x01, 0x00,
+   0x18, 0x00, 0x80, 0x01, 0x00, 0x00, 0x06, 0x00, 0x80, 0x01, 0x00, 0x18,
+   0x00, 0xc0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x80, 0x01, 0x00, 0x18, 0x00,
+   0xc0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x80, 0x03, 0x00, 0x1c, 0x00, 0xc0,
+   0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x03, 0x00, 0x0c, 0x00, 0xc0, 0x00,
+   0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x60, 0x00, 0x00,
+   0x00, 0x06, 0x00, 0x00, 0x0e, 0x00, 0x07, 0x00, 0x60, 0x00, 0x00, 0x00,
+   0x06, 0x00, 0x00, 0x3c, 0xc0, 0x03, 0x00, 0x60, 0x00, 0x00, 0x00, 0x06,
+   0x00, 0x00, 0xf8, 0xf0, 0x01, 0x00, 0x60, 0x00, 0x00, 0x00, 0x06, 0x00,
+   0x00, 0xe0, 0x7f, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00,
+   0x00, 0x0f, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x80, 0x01, 0xfe, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x83, 0xff, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0xfe, 0x01, 0x07, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x7c, 0x00, 0x0e, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x18, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x30, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x30, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60,
+   0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x06,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x06, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x06, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x06, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x06, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x60, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x30, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x38, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x18, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7e, 0x00,
+   0x0e, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x83, 0x07,
+   0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x83, 0xff, 0x03, 0x06,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x01, 0x7e, 0x00, 0x06, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x60, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x60, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0,
+   0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00,
+   0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00,
+   0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00,
+   0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x06,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x06, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x06, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x03, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x03, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06,
+   0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00,
+   0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0x00, 0x00,
+   0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
diff --git a/hacks/images/jigsaw/jigsaw_a_w_f.xbm b/hacks/images/jigsaw/jigsaw_a_w_f.xbm
new file mode 100644 (file)
index 0000000..5700499
--- /dev/null
@@ -0,0 +1,77 @@
+#define jigsaw_a_w_f_width 88
+#define jigsaw_a_w_f_height 78
+#define jigsaw_a_w_f_x_hot 1
+#define jigsaw_a_w_f_y_hot 6
+static unsigned char jigsaw_a_w_f_bits[] = {
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x3c, 0x00, 0x00, 0xc0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0,
+   0x7f, 0x00, 0x00, 0xe0, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xff,
+   0x00, 0x00, 0xf0, 0xff, 0x03, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0x01,
+   0x00, 0xf8, 0xff, 0x3f, 0x00, 0x00, 0x00, 0xfc, 0xff, 0xff, 0x03, 0x00,
+   0xfc, 0xff, 0xff, 0x03, 0x00, 0x00, 0xfe, 0xff, 0xff, 0x07, 0x00, 0xfe,
+   0xff, 0xff, 0x07, 0x00, 0x00, 0xfe, 0xff, 0xff, 0x07, 0x00, 0xfe, 0xff,
+   0xff, 0x07, 0x00, 0x00, 0xfe, 0xff, 0xff, 0x07, 0x00, 0xfe, 0xff, 0xff,
+   0x07, 0x00, 0x00, 0xfe, 0xff, 0xff, 0x07, 0x00, 0xfe, 0xff, 0xff, 0x07,
+   0x00, 0x00, 0xfe, 0xff, 0xff, 0x07, 0x00, 0xfe, 0xff, 0xff, 0x03, 0x00,
+   0x00, 0xfe, 0xff, 0xff, 0x03, 0x00, 0xfc, 0xff, 0xff, 0x03, 0x00, 0x00,
+   0xfe, 0xff, 0xff, 0x03, 0x00, 0xfc, 0xff, 0xff, 0x03, 0x00, 0x00, 0xfe,
+   0xff, 0xff, 0x01, 0x00, 0xf8, 0xff, 0xff, 0x03, 0x00, 0x00, 0xfe, 0xff,
+   0xff, 0x01, 0x00, 0xf8, 0xff, 0xff, 0x01, 0x00, 0x00, 0xfe, 0xff, 0xff,
+   0x01, 0x00, 0xf8, 0xff, 0xff, 0x01, 0x00, 0x00, 0xfe, 0xff, 0xff, 0x01,
+   0x00, 0xf8, 0xff, 0xff, 0x01, 0x00, 0x00, 0xfe, 0xff, 0xff, 0x01, 0x00,
+   0xf8, 0xff, 0xff, 0x01, 0x00, 0x00, 0xfe, 0xff, 0xff, 0x01, 0x00, 0xf8,
+   0xff, 0xff, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0x01, 0x00, 0xf8, 0xff,
+   0xff, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0x03, 0x00, 0xfc, 0xff, 0xff,
+   0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0x03, 0x00, 0xfc, 0xff, 0xff, 0x00,
+   0x00, 0x00, 0xfe, 0xff, 0xff, 0x07, 0x00, 0xfe, 0xff, 0x7f, 0x00, 0x00,
+   0x00, 0xfe, 0xff, 0xff, 0x0f, 0x00, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x00,
+   0xfe, 0xff, 0xff, 0x3f, 0xc0, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x00, 0xfe,
+   0xff, 0xff, 0xff, 0xf0, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x00, 0xfe, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0x01, 0x7e, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0x83, 0xff, 0x03, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0x07, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0x0f, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0x1f, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0x3f, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0x3f, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f,
+   0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xfe,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xfe, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xfe, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xfe, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xfe, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0x7f, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0x3f, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0x3f, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0x1f, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0x0f, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07,
+   0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x83, 0xff, 0x03, 0xfe,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0xfe, 0x00, 0xfe, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff,
+   0xf0, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0x3f, 0xc0,
+   0xff, 0xff, 0x7f, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0x0f, 0x00, 0xff,
+   0xff, 0x7f, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0x07, 0x00, 0xfe, 0xff,
+   0x7f, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0x03, 0x00, 0xfc, 0xff, 0xff,
+   0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0x03, 0x00, 0xfc, 0xff, 0xff, 0x00,
+   0x00, 0x00, 0xfe, 0xff, 0xff, 0x01, 0x00, 0xf8, 0xff, 0xff, 0x00, 0x00,
+   0x00, 0xfe, 0xff, 0xff, 0x01, 0x00, 0xf8, 0xff, 0xff, 0x00, 0x00, 0x00,
+   0xfe, 0xff, 0xff, 0x01, 0x00, 0xf8, 0xff, 0xff, 0x01, 0x00, 0x00, 0xfe,
+   0xff, 0xff, 0x01, 0x00, 0xf8, 0xff, 0xff, 0x01, 0x00, 0x00, 0xfe, 0xff,
+   0xff, 0x01, 0x00, 0xf8, 0xff, 0xff, 0x01, 0x00, 0x00, 0xfe, 0xff, 0xff,
+   0x01, 0x00, 0xf8, 0xff, 0xff, 0x01, 0x00, 0x00, 0xfe, 0xff, 0xff, 0x01,
+   0x00, 0xf8, 0xff, 0xff, 0x03, 0x00, 0x00, 0xfe, 0xff, 0xff, 0x03, 0x00,
+   0xfc, 0xff, 0xff, 0x03, 0x00, 0x00, 0xfe, 0xff, 0xff, 0x03, 0x00, 0xfc,
+   0xff, 0xff, 0x03, 0x00, 0x00, 0xfe, 0xff, 0xff, 0x07, 0x00, 0xfe, 0xff,
+   0xff, 0x03, 0x00, 0x00, 0xfe, 0xff, 0xff, 0x07, 0x00, 0xfe, 0xff, 0xff,
+   0x07, 0x00, 0x00, 0xfe, 0xff, 0xff, 0x07, 0x00, 0xfe, 0xff, 0xff, 0x07,
+   0x00, 0x00, 0xfe, 0xff, 0xff, 0x07, 0x00, 0xfe, 0xff, 0xff, 0x07, 0x00,
+   0x00, 0xfe, 0xff, 0xff, 0x07, 0x00, 0xfe, 0xff, 0xff, 0x07, 0x00, 0x00,
+   0xfc, 0xff, 0xff, 0x03, 0x00, 0xfc, 0xff, 0xff, 0x03, 0x00, 0x00, 0xc0,
+   0xff, 0xff, 0x01, 0x00, 0xf8, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0xfc,
+   0xff, 0x00, 0x00, 0xf0, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x7f,
+   0x00, 0x00, 0xe0, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00,
+   0x00, 0xc0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
diff --git a/hacks/images/jigsaw/jigsaw_a_w_h.xbm b/hacks/images/jigsaw/jigsaw_a_w_h.xbm
new file mode 100644 (file)
index 0000000..3993528
--- /dev/null
@@ -0,0 +1,77 @@
+#define jigsaw_a_w_h_width 88
+#define jigsaw_a_w_h_height 78
+#define jigsaw_a_w_h_x_hot 1
+#define jigsaw_a_w_h_y_hot 6
+static unsigned char jigsaw_a_w_h_bits[] = {
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x3c, 0x00, 0x00, 0xc0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0,
+   0x7f, 0x00, 0x00, 0xe0, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xc3,
+   0x00, 0x00, 0x30, 0xfc, 0x03, 0x00, 0x00, 0x00, 0xc0, 0x3f, 0x80, 0x01,
+   0x00, 0x18, 0xc0, 0x3f, 0x00, 0x00, 0x00, 0xfc, 0x03, 0x00, 0x03, 0x00,
+   0x0c, 0x00, 0xfc, 0x03, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x06, 0x00, 0x06,
+   0x00, 0xc0, 0x07, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00,
+   0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00,
+   0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x06,
+   0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x03, 0x00,
+   0x00, 0x06, 0x00, 0x00, 0x03, 0x00, 0x0c, 0x00, 0x00, 0x03, 0x00, 0x00,
+   0x06, 0x00, 0x80, 0x03, 0x00, 0x1c, 0x00, 0x00, 0x03, 0x00, 0x00, 0x06,
+   0x00, 0x80, 0x01, 0x00, 0x18, 0x00, 0x00, 0x03, 0x00, 0x00, 0x06, 0x00,
+   0x80, 0x01, 0x00, 0x18, 0x00, 0x80, 0x01, 0x00, 0x00, 0x06, 0x00, 0x80,
+   0x01, 0x00, 0x18, 0x00, 0x80, 0x01, 0x00, 0x00, 0x06, 0x00, 0x80, 0x01,
+   0x00, 0x18, 0x00, 0x80, 0x01, 0x00, 0x00, 0x06, 0x00, 0x80, 0x01, 0x00,
+   0x18, 0x00, 0x80, 0x01, 0x00, 0x00, 0x06, 0x00, 0x80, 0x01, 0x00, 0x18,
+   0x00, 0xc0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x80, 0x01, 0x00, 0x18, 0x00,
+   0xc0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x80, 0x03, 0x00, 0x1c, 0x00, 0xc0,
+   0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x03, 0x00, 0x0c, 0x00, 0xc0, 0x00,
+   0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x60, 0x00, 0x00,
+   0x00, 0x06, 0x00, 0x00, 0x0e, 0x00, 0x07, 0x00, 0x60, 0x00, 0x00, 0x00,
+   0x06, 0x00, 0x00, 0x3c, 0xc0, 0x03, 0x00, 0x60, 0x00, 0x00, 0x00, 0x06,
+   0x00, 0x00, 0xf8, 0xf0, 0x01, 0x00, 0x60, 0x00, 0x00, 0x00, 0x06, 0x00,
+   0x00, 0xe0, 0x7f, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00,
+   0x00, 0x0f, 0x00, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0xc0, 0x01, 0x7e, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x80, 0x83, 0xff, 0x03, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0xff, 0x83, 0x07, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x7e, 0x00, 0x0e, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x18, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x38, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x30, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60,
+   0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x06,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x06, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x06, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x06, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x06, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x60, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x30, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x30, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x18, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7c, 0x00,
+   0x0e, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x01, 0x07,
+   0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x83, 0xff, 0x03, 0x06,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0xfe, 0x00, 0x06, 0x00,
+   0x00, 0x00, 0x0f, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00,
+   0xe0, 0x7f, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0xf8,
+   0xf0, 0x01, 0x00, 0x60, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x3c, 0xc0,
+   0x03, 0x00, 0x60, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x0e, 0x00, 0x07,
+   0x00, 0x60, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00,
+   0x60, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x03, 0x00, 0x0c, 0x00, 0xc0,
+   0x00, 0x00, 0x00, 0x06, 0x00, 0x80, 0x03, 0x00, 0x1c, 0x00, 0xc0, 0x00,
+   0x00, 0x00, 0x06, 0x00, 0x80, 0x01, 0x00, 0x18, 0x00, 0xc0, 0x00, 0x00,
+   0x00, 0x06, 0x00, 0x80, 0x01, 0x00, 0x18, 0x00, 0xc0, 0x00, 0x00, 0x00,
+   0x06, 0x00, 0x80, 0x01, 0x00, 0x18, 0x00, 0x80, 0x01, 0x00, 0x00, 0x06,
+   0x00, 0x80, 0x01, 0x00, 0x18, 0x00, 0x80, 0x01, 0x00, 0x00, 0x06, 0x00,
+   0x80, 0x01, 0x00, 0x18, 0x00, 0x80, 0x01, 0x00, 0x00, 0x06, 0x00, 0x80,
+   0x01, 0x00, 0x18, 0x00, 0x80, 0x01, 0x00, 0x00, 0x06, 0x00, 0x80, 0x01,
+   0x00, 0x18, 0x00, 0x00, 0x03, 0x00, 0x00, 0x06, 0x00, 0x80, 0x03, 0x00,
+   0x1c, 0x00, 0x00, 0x03, 0x00, 0x00, 0x06, 0x00, 0x00, 0x03, 0x00, 0x0c,
+   0x00, 0x00, 0x03, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00,
+   0x00, 0x03, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00,
+   0x06, 0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x06,
+   0x00, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0x00, 0x06, 0x00,
+   0x00, 0x3e, 0x00, 0x00, 0x06, 0x00, 0x06, 0x00, 0xc0, 0x07, 0x00, 0x00,
+   0xfc, 0x03, 0x00, 0x03, 0x00, 0x0c, 0x00, 0xfc, 0x03, 0x00, 0x00, 0xc0,
+   0x3f, 0x80, 0x01, 0x00, 0x18, 0xc0, 0x3f, 0x00, 0x00, 0x00, 0x00, 0xfc,
+   0xc3, 0x00, 0x00, 0x30, 0xfc, 0x03, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x7f,
+   0x00, 0x00, 0xe0, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0x00,
+   0x00, 0xc0, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
diff --git a/hacks/images/jigsaw/jigsaw_b_e_f.xbm b/hacks/images/jigsaw/jigsaw_b_e_f.xbm
new file mode 100644 (file)
index 0000000..d96d25a
--- /dev/null
@@ -0,0 +1,95 @@
+#define jigsaw_b_e_f_width 74
+#define jigsaw_b_e_f_height 108
+#define jigsaw_b_e_f_x_hot 6
+#define jigsaw_b_e_f_y_hot 21
+static unsigned char jigsaw_b_e_f_bits[] = {
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0xf8, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0xfe, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x3f,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0x7f, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0xe0, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0,
+   0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xff, 0xff,
+   0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xff, 0xff, 0x03, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0xf0, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0xf0, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0,
+   0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff,
+   0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0x01, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0xc0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0,
+   0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x03, 0x00, 0xc0, 0xff, 0xff,
+   0x00, 0x00, 0xf0, 0x01, 0xe0, 0x3f, 0x00, 0xe0, 0xff, 0xff, 0x01, 0x00,
+   0xff, 0x01, 0xe0, 0xff, 0x03, 0xf0, 0xff, 0xff, 0x03, 0xf0, 0xff, 0x01,
+   0xe0, 0xff, 0x3f, 0xf8, 0xff, 0xff, 0x07, 0xff, 0xff, 0x01, 0xe0, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0xf0, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0x01, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0x01, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01,
+   0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0xf8, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0xf8, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0x01, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0x01, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01,
+   0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0xfc, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0xfe, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0x01, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0x01, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01,
+   0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0xf8, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0xf0, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0xe0, 0x1f, 0xf0, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0x01, 0xc0, 0x07, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0x01, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01,
+   0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00,
+   0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0xfe,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0xfc, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0x01, 0x00, 0x00, 0x00, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01,
+   0x00, 0x00, 0x00, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00,
+   0x00, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0xfe,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0x01, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01,
+   0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0xc0, 0x07,
+   0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0xe0, 0x1f, 0xf0, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0x01, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0x01, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01,
+   0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0xfe, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0xfe, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0x01, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0x01, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01,
+   0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0xfc, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0xf8, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0x01, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0x01, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01,
+   0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0xf0, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0xf0, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0x01, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0x01, 0xe0, 0xff, 0x3f, 0xf8, 0xff, 0xff, 0x07, 0xff, 0xff, 0x01,
+   0xe0, 0xff, 0x03, 0xf0, 0xff, 0xff, 0x03, 0xf0, 0xff, 0x01, 0xe0, 0x3f,
+   0x00, 0xe0, 0xff, 0xff, 0x01, 0x00, 0xff, 0x01, 0xc0, 0x03, 0x00, 0xc0,
+   0xff, 0xff, 0x00, 0x00, 0xf0, 0x01, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0xe0, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0,
+   0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xff, 0xff,
+   0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xff, 0xff, 0x03, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0xf0, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0xf0, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0,
+   0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff,
+   0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0x01, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x80, 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x1f,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x07, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
diff --git a/hacks/images/jigsaw/jigsaw_b_e_h.xbm b/hacks/images/jigsaw/jigsaw_b_e_h.xbm
new file mode 100644 (file)
index 0000000..d2e1db7
--- /dev/null
@@ -0,0 +1,95 @@
+#define jigsaw_b_e_h_width 74
+#define jigsaw_b_e_h_height 108
+#define jigsaw_b_e_h_x_hot 6
+#define jigsaw_b_e_h_y_hot 21
+static unsigned char jigsaw_b_e_h_bits[] = {
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0xf8, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0xfe, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x38,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x03, 0x60, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0xe0, 0x00, 0xc0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x60, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60,
+   0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00,
+   0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x03, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x30, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70,
+   0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x80,
+   0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x80, 0x01, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0xc0, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0xc0, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0,
+   0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x03, 0x00, 0xc0, 0x00, 0xc0,
+   0x00, 0x00, 0xf0, 0x01, 0xe0, 0x3f, 0x00, 0xe0, 0x00, 0x80, 0x01, 0x00,
+   0xff, 0x01, 0x60, 0xfc, 0x03, 0x70, 0x00, 0x00, 0x03, 0xf0, 0x8f, 0x01,
+   0x60, 0xc0, 0x3f, 0x38, 0x00, 0x00, 0x06, 0xff, 0x80, 0x01, 0x60, 0x00,
+   0xfc, 0x1f, 0x00, 0x00, 0xfc, 0x0f, 0x80, 0x01, 0x30, 0x00, 0xc0, 0x0f,
+   0x00, 0x00, 0xf8, 0x00, 0x80, 0x01, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x80, 0x01, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x80, 0x01, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01,
+   0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x18, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x18, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x80, 0x01, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x80, 0x01, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01,
+   0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x0c, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x06, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x80, 0x01, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x80, 0x01, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01,
+   0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x18, 0xf0,
+   0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x30, 0xf8, 0x3f, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0xe0, 0x1f, 0xf0, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x80, 0x01, 0xc0, 0x07, 0xc0, 0x01, 0x00, 0x00, 0x00, 0x00,
+   0x80, 0x01, 0x00, 0x00, 0x80, 0x03, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01,
+   0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00,
+   0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x06,
+   0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00,
+   0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00,
+   0x80, 0x01, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01,
+   0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00,
+   0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x06,
+   0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00,
+   0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00,
+   0x80, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01,
+   0x00, 0x00, 0x80, 0x03, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0xc0, 0x07,
+   0xc0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0xe0, 0x1f, 0xf0, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x30, 0xf8, 0x3f, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x80, 0x01, 0x18, 0xf0, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x80, 0x01, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01,
+   0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x06, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x06, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x80, 0x01, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x80, 0x01, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01,
+   0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x0c, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x18, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x80, 0x01, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x80, 0x01, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01,
+   0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x30, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x30, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x30, 0x00, 0xc0, 0x0f, 0x00, 0x00,
+   0xf8, 0x00, 0x80, 0x01, 0x60, 0x00, 0xfc, 0x1f, 0x00, 0x00, 0xfc, 0x0f,
+   0x80, 0x01, 0x60, 0xc0, 0x3f, 0x38, 0x00, 0x00, 0x06, 0xff, 0x80, 0x01,
+   0x60, 0xfc, 0x03, 0x70, 0x00, 0x00, 0x03, 0xf0, 0x8f, 0x01, 0xe0, 0x3f,
+   0x00, 0xe0, 0x00, 0x80, 0x01, 0x00, 0xff, 0x01, 0xc0, 0x03, 0x00, 0xc0,
+   0x00, 0xc0, 0x00, 0x00, 0xf0, 0x01, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xc0,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xc0, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0xc0, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x60, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60,
+   0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x00, 0x00,
+   0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x03, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x30, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30,
+   0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00,
+   0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x80, 0x01, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0xc0, 0x01, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0xc0, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x80, 0x03, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x07, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x1f,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x07, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
diff --git a/hacks/images/jigsaw/jigsaw_b_f.xbm b/hacks/images/jigsaw/jigsaw_b_f.xbm
new file mode 100644 (file)
index 0000000..4001dd3
--- /dev/null
@@ -0,0 +1,95 @@
+#define jigsaw_b_f_width 78
+#define jigsaw_b_f_height 108
+#define jigsaw_b_f_x_hot 5
+#define jigsaw_b_f_y_hot 20
+static unsigned char jigsaw_b_f_bits[] = {
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0xf8, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0xfe, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x3f,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0x7f, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0xe0, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0,
+   0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xff, 0xff,
+   0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xff, 0xff, 0x03, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0xf0, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0xf0, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0,
+   0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff,
+   0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0x01, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0xc0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0,
+   0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x03, 0x00, 0xc0, 0xff, 0xff,
+   0x00, 0x00, 0xf0, 0x00, 0xe0, 0x3f, 0x00, 0xe0, 0xff, 0xff, 0x01, 0x00,
+   0xff, 0x01, 0xe0, 0xff, 0x03, 0xf0, 0xff, 0xff, 0x03, 0xf0, 0xff, 0x01,
+   0xe0, 0xff, 0x3f, 0xf8, 0xff, 0xff, 0x07, 0xff, 0xff, 0x01, 0xe0, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0xf0, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0x03, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0x03, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03,
+   0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0xf8, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0xf8, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0x07, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0x0f, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f,
+   0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xfc, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xfe, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0x1f, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0x1f, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f,
+   0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xf8, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0xf0, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0xe0, 0x1f, 0xf0, 0xff, 0xff, 0xff,
+   0xff, 0x03, 0xfe, 0x01, 0xc0, 0x07, 0xc0, 0xff, 0xff, 0xff, 0xff, 0x00,
+   0xf8, 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe,
+   0xff, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff,
+   0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xff, 0xff, 0x0f, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0xfc, 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0xfc, 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe,
+   0xff, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff,
+   0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x3f, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x00, 0xc0, 0x07,
+   0xc0, 0xff, 0xff, 0xff, 0xff, 0x00, 0xf8, 0x00, 0xe0, 0x1f, 0xf0, 0xff,
+   0xff, 0xff, 0xff, 0x03, 0xfe, 0x01, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0x03, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0x07, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f,
+   0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0xfe, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0xfe, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0x1f, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0x0f, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f,
+   0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xfc, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xf8, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0x07, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0x07, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07,
+   0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0xf0, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0xf0, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0x03, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0x01, 0xe0, 0xff, 0x3f, 0xf8, 0xff, 0xff, 0x07, 0xff, 0xff, 0x01,
+   0xe0, 0xff, 0x03, 0xf0, 0xff, 0xff, 0x03, 0xf0, 0xff, 0x01, 0xe0, 0x3f,
+   0x00, 0xe0, 0xff, 0xff, 0x01, 0x00, 0xff, 0x01, 0xc0, 0x03, 0x00, 0xc0,
+   0xff, 0xff, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0xe0, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0,
+   0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xff, 0xff,
+   0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xff, 0xff, 0x03, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0xf0, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0xf0, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0,
+   0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xff, 0xff,
+   0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0x01, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x80, 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x1f,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x07, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
diff --git a/hacks/images/jigsaw/jigsaw_b_h.xbm b/hacks/images/jigsaw/jigsaw_b_h.xbm
new file mode 100644 (file)
index 0000000..5fddc07
--- /dev/null
@@ -0,0 +1,95 @@
+#define jigsaw_b_h_width 78
+#define jigsaw_b_h_height 108
+#define jigsaw_b_h_x_hot 5
+#define jigsaw_b_h_y_hot 20
+static unsigned char jigsaw_b_h_bits[] = {
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0xf8, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0xfe, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x38,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x70, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0xe0, 0x00, 0xc0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x60, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30,
+   0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00,
+   0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x03, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x30, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30,
+   0x00, 0x80, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x80,
+   0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x80, 0x01, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0xc0, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0xc0, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0,
+   0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x03, 0x00, 0xc0, 0x00, 0xc0,
+   0x00, 0x00, 0xf0, 0x00, 0xe0, 0x3f, 0x00, 0x60, 0x00, 0xc0, 0x01, 0x00,
+   0xff, 0x01, 0x60, 0xfc, 0x03, 0x30, 0x00, 0x80, 0x03, 0xf0, 0x8f, 0x01,
+   0x60, 0xc0, 0x3f, 0x18, 0x00, 0x00, 0x07, 0xff, 0x80, 0x01, 0x60, 0x00,
+   0xfc, 0x0f, 0x00, 0x00, 0xfe, 0x0f, 0x80, 0x01, 0x30, 0x00, 0xc0, 0x07,
+   0x00, 0x00, 0xfc, 0x00, 0x00, 0x03, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x03, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x03, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
+   0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x18, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x18, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x06, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x0c, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c,
+   0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x0c, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x06, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x18, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x18, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18,
+   0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x18, 0xf0,
+   0x1f, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x03, 0x06, 0x30, 0xf8, 0x3f, 0x00,
+   0x00, 0x00, 0x00, 0xff, 0x07, 0x03, 0xe0, 0x1f, 0xf0, 0x00, 0x00, 0x00,
+   0xc0, 0x03, 0xfe, 0x01, 0xc0, 0x07, 0xc0, 0x01, 0x00, 0x00, 0xe0, 0x00,
+   0xf8, 0x00, 0x00, 0x00, 0x80, 0x03, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x07, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06,
+   0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00,
+   0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x0c, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x0c, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06,
+   0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00,
+   0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x38, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x80, 0x03, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0xc0, 0x07,
+   0xc0, 0x01, 0x00, 0x00, 0xe0, 0x00, 0xf8, 0x00, 0xe0, 0x1f, 0xf0, 0x00,
+   0x00, 0x00, 0xc0, 0x03, 0xfe, 0x01, 0x30, 0xf8, 0x3f, 0x00, 0x00, 0x00,
+   0x00, 0xff, 0x07, 0x03, 0x18, 0xf0, 0x1f, 0x00, 0x00, 0x00, 0x00, 0xfe,
+   0x03, 0x06, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c,
+   0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x06, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x06, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x18, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x0c, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c,
+   0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x0c, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x18, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x06, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x06, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06,
+   0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x30, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x30, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x30, 0x00, 0xc0, 0x07, 0x00, 0x00,
+   0xfc, 0x00, 0x00, 0x03, 0x60, 0x00, 0xfc, 0x0f, 0x00, 0x00, 0xfe, 0x0f,
+   0x80, 0x01, 0x60, 0xc0, 0x3f, 0x18, 0x00, 0x00, 0x07, 0xff, 0x80, 0x01,
+   0x60, 0xfc, 0x03, 0x30, 0x00, 0x80, 0x03, 0xf0, 0x8f, 0x01, 0xe0, 0x3f,
+   0x00, 0x60, 0x00, 0xc0, 0x01, 0x00, 0xff, 0x01, 0xc0, 0x03, 0x00, 0xc0,
+   0x00, 0xc0, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xc0,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xc0, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0xc0, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x60, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60,
+   0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x80,
+   0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x03, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x30, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30,
+   0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x80,
+   0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x80, 0x01, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0xc0, 0x01, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0xc0, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x80, 0x01, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x07, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x1f,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0x07, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
diff --git a/hacks/images/jigsaw/jigsaw_b_n_f.xbm b/hacks/images/jigsaw/jigsaw_b_n_f.xbm
new file mode 100644 (file)
index 0000000..3a5f241
--- /dev/null
@@ -0,0 +1,79 @@
+#define jigsaw_b_n_f_width 78
+#define jigsaw_b_n_f_height 88
+#define jigsaw_b_n_f_x_hot 6
+#define jigsaw_b_n_f_y_hot 1
+static unsigned char jigsaw_b_n_f_bits[] = {
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0xe0, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0x01, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0x01, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01,
+   0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0xf0, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0xf0, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0x03, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0x07, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07,
+   0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0xf8, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0xfc, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0x0f, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0x0f, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f,
+   0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0xfe, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0xfe, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0x1f, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0x0f, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07,
+   0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0xe0, 0x1f,
+   0xf0, 0xff, 0xff, 0xff, 0xff, 0x03, 0xfe, 0x01, 0xc0, 0x07, 0xc0, 0xff,
+   0xff, 0xff, 0xff, 0x00, 0xf8, 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff,
+   0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x3f, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0xfe, 0xff, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc,
+   0xff, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xff, 0xff,
+   0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xff, 0xff, 0x0f, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0xfe, 0xff, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff,
+   0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff,
+   0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0x7f, 0x00,
+   0x00, 0x00, 0xc0, 0x07, 0xc0, 0xff, 0xff, 0xff, 0xff, 0x00, 0xf8, 0x00,
+   0xe0, 0x1f, 0xf0, 0xff, 0xff, 0xff, 0xff, 0x03, 0xfe, 0x01, 0xf0, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0xf8, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0x0f, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0x1f, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f,
+   0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0xfe, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0xfc, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0x0f, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0x0f, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f,
+   0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0xf8, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0xf8, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0x07, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0x03, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03,
+   0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0xf0, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0xe0, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0xe0, 0xff, 0x3f, 0xf8, 0xff, 0xff,
+   0x07, 0xff, 0xff, 0x01, 0xe0, 0xff, 0x03, 0xf0, 0xff, 0xff, 0x03, 0xf0,
+   0xff, 0x01, 0xe0, 0x3f, 0x00, 0xe0, 0xff, 0xff, 0x01, 0x00, 0xff, 0x01,
+   0xc0, 0x03, 0x00, 0xc0, 0xff, 0xff, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00,
+   0x00, 0xc0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0,
+   0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0xf0, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0,
+   0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xff, 0xff,
+   0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xff, 0xff, 0x03, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0xf0, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0xe0, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0,
+   0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff,
+   0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0xfe, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0xf8, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00};
diff --git a/hacks/images/jigsaw/jigsaw_b_n_h.xbm b/hacks/images/jigsaw/jigsaw_b_n_h.xbm
new file mode 100644 (file)
index 0000000..70d1d5d
--- /dev/null
@@ -0,0 +1,79 @@
+#define jigsaw_b_n_h_width 78
+#define jigsaw_b_n_h_height 88
+#define jigsaw_b_n_h_x_hot 6
+#define jigsaw_b_n_h_y_hot 1
+static unsigned char jigsaw_b_n_h_bits[] = {
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0xe0, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x80, 0x01, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x80, 0x01, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01,
+   0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x30, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x30, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x03, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x06, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06,
+   0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x18, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x0c, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x0c, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x0c, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c,
+   0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x06, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x06, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x18, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x0c, 0x18, 0xf0, 0x1f, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x03, 0x06,
+   0x30, 0xf8, 0x3f, 0x00, 0x00, 0x00, 0x00, 0xff, 0x07, 0x03, 0xe0, 0x1f,
+   0xf0, 0x00, 0x00, 0x00, 0xc0, 0x03, 0xfe, 0x01, 0xc0, 0x07, 0xc0, 0x01,
+   0x00, 0x00, 0xe0, 0x00, 0xf8, 0x00, 0x00, 0x00, 0x80, 0x03, 0x00, 0x00,
+   0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x30, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x06, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c,
+   0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00,
+   0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x0c, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x06, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07,
+   0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00,
+   0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x03, 0x00, 0x00, 0x70, 0x00,
+   0x00, 0x00, 0xc0, 0x07, 0xc0, 0x01, 0x00, 0x00, 0xe0, 0x00, 0xf8, 0x00,
+   0xe0, 0x1f, 0xf0, 0x00, 0x00, 0x00, 0xc0, 0x03, 0xfe, 0x01, 0x30, 0xf8,
+   0x3f, 0x00, 0x00, 0x00, 0x00, 0xff, 0x07, 0x03, 0x18, 0xf0, 0x1f, 0x00,
+   0x00, 0x00, 0x00, 0xfe, 0x03, 0x06, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x0c, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x18, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18,
+   0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x06, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x0c, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x0c, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x0c, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c,
+   0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x18, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x18, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x06, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x03, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
+   0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x30, 0x00,
+   0xc0, 0x0f, 0x00, 0x00, 0xf8, 0x00, 0x00, 0x03, 0x60, 0x00, 0xfc, 0x1f,
+   0x00, 0x00, 0xfc, 0x0f, 0x80, 0x01, 0x60, 0xc0, 0x3f, 0x38, 0x00, 0x00,
+   0x06, 0xff, 0x80, 0x01, 0x60, 0xfc, 0x03, 0x70, 0x00, 0x00, 0x03, 0xf0,
+   0x8f, 0x01, 0xe0, 0x3f, 0x00, 0xe0, 0x00, 0x80, 0x01, 0x00, 0xff, 0x01,
+   0xc0, 0x03, 0x00, 0xc0, 0x00, 0xc0, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00,
+   0x00, 0xc0, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0,
+   0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xc0,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xc0, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x60, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x70, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30,
+   0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00,
+   0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x03, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x60, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60,
+   0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0xc0,
+   0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xc0, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x03, 0x60, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x07, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0xfe, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0xf8, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00};
diff --git a/hacks/images/jigsaw/jigsaw_b_ne_f.xbm b/hacks/images/jigsaw/jigsaw_b_ne_f.xbm
new file mode 100644 (file)
index 0000000..20629f5
--- /dev/null
@@ -0,0 +1,79 @@
+#define jigsaw_b_ne_f_width 74
+#define jigsaw_b_ne_f_height 88
+#define jigsaw_b_ne_f_x_hot 6
+#define jigsaw_b_ne_f_y_hot 1
+static unsigned char jigsaw_b_ne_f_bits[] = {
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0xe0, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0x01, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0x01, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01,
+   0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0xf0, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0xf0, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0x01, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0x01, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01,
+   0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0xf8, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0xfc, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0x01, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0x01, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01,
+   0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0xfe, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0xfe, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0x01, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0x01, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01,
+   0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0xe0, 0x1f,
+   0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0xc0, 0x07, 0xc0, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0x01, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01,
+   0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00,
+   0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0xfc,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0xfc, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0xfc, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0x01, 0x00, 0x00, 0x00, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01,
+   0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00,
+   0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0x01, 0xc0, 0x07, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01,
+   0xe0, 0x1f, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0xf0, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0xf8, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0x01, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0x01, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01,
+   0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0xfe, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0xfc, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0x01, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0x01, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01,
+   0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0xf8, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0xf8, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0x01, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0x01, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01,
+   0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0xf0, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0xe0, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0xe0, 0xff, 0x3f, 0xf8, 0xff, 0xff,
+   0x07, 0xff, 0xff, 0x01, 0xe0, 0xff, 0x03, 0xf0, 0xff, 0xff, 0x03, 0xf0,
+   0xff, 0x01, 0xe0, 0x3f, 0x00, 0xe0, 0xff, 0xff, 0x01, 0x00, 0xff, 0x01,
+   0xc0, 0x03, 0x00, 0xc0, 0xff, 0xff, 0x00, 0x00, 0xf0, 0x01, 0x00, 0x00,
+   0x00, 0xc0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0,
+   0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0xf0, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0,
+   0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xff, 0xff,
+   0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xff, 0xff, 0x03, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0xf0, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0xe0, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0,
+   0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff,
+   0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0x7f, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0xfe, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0xf8, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00};
diff --git a/hacks/images/jigsaw/jigsaw_b_ne_h.xbm b/hacks/images/jigsaw/jigsaw_b_ne_h.xbm
new file mode 100644 (file)
index 0000000..2b5da10
--- /dev/null
@@ -0,0 +1,79 @@
+#define jigsaw_b_ne_h_width 74
+#define jigsaw_b_ne_h_height 88
+#define jigsaw_b_ne_h_x_hot 6
+#define jigsaw_b_ne_h_y_hot 1
+static unsigned char jigsaw_b_ne_h_bits[] = {
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0xe0, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x80, 0x01, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x80, 0x01, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01,
+   0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x30, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x30, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x80, 0x01, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x80, 0x01, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01,
+   0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x18, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x0c, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x80, 0x01, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x80, 0x01, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01,
+   0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x06, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x06, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x80, 0x01, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x80, 0x01, 0x18, 0xf0, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01,
+   0x30, 0xf8, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0xe0, 0x1f,
+   0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0xc0, 0x07, 0xc0, 0x01,
+   0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x80, 0x03, 0x00, 0x00,
+   0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00,
+   0x80, 0x01, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01,
+   0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00,
+   0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x0c,
+   0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00,
+   0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00,
+   0x80, 0x01, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01,
+   0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00,
+   0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x07,
+   0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00,
+   0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x80, 0x03, 0x00, 0x00, 0x00, 0x00,
+   0x80, 0x01, 0xc0, 0x07, 0xc0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01,
+   0xe0, 0x1f, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x30, 0xf8,
+   0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x18, 0xf0, 0x1f, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x80, 0x01, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x80, 0x01, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01,
+   0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x06, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x0c, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x80, 0x01, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x80, 0x01, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01,
+   0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x18, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x18, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x80, 0x01, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x80, 0x01, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01,
+   0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x30, 0x00,
+   0xc0, 0x0f, 0x00, 0x00, 0xf8, 0x00, 0x80, 0x01, 0x60, 0x00, 0xfc, 0x1f,
+   0x00, 0x00, 0xfc, 0x0f, 0x80, 0x01, 0x60, 0xc0, 0x3f, 0x38, 0x00, 0x00,
+   0x06, 0xff, 0x80, 0x01, 0x60, 0xfc, 0x03, 0x70, 0x00, 0x00, 0x03, 0xf0,
+   0x8f, 0x01, 0xe0, 0x3f, 0x00, 0xe0, 0x00, 0x80, 0x01, 0x00, 0xff, 0x01,
+   0xc0, 0x03, 0x00, 0xc0, 0x00, 0xc0, 0x00, 0x00, 0xf0, 0x01, 0x00, 0x00,
+   0x00, 0xc0, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0,
+   0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xc0,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xc0, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x60, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x70, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30,
+   0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00,
+   0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x03, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x60, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60,
+   0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x00, 0xc0,
+   0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xc0, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x03, 0x60, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x07, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0xfe, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0xf8, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00};
diff --git a/hacks/images/jigsaw/jigsaw_b_nw_f.xbm b/hacks/images/jigsaw/jigsaw_b_nw_f.xbm
new file mode 100644 (file)
index 0000000..441fe2f
--- /dev/null
@@ -0,0 +1,79 @@
+#define jigsaw_b_nw_f_width 74
+#define jigsaw_b_nw_f_height 88
+#define jigsaw_b_nw_f_x_hot 1
+#define jigsaw_b_nw_f_y_hot 1
+static unsigned char jigsaw_b_nw_f_bits[] = {
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, 0xfe, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0x1f, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0x1f, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00,
+   0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0xfe, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0xfe, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0x3f, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0x7f, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00,
+   0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0xfe, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0xfe, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
+   0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0xfe, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0xfe, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0x01, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00,
+   0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0xfe, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0x3f, 0xe0, 0x1f, 0x00, 0xfe, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0x0f, 0x80, 0x0f, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0x07, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00,
+   0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00,
+   0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0xfe, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0x00, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00,
+   0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
+   0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0xfe, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0x03, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0x00,
+   0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x80, 0x0f, 0x00,
+   0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0xe0, 0x1f, 0x00, 0xfe, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0xfe, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0x01, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01,
+   0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0xfe, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0xfe, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
+   0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0xfe, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0xfe, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0x7f, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0x3f, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00,
+   0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0xfe, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0xfe, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0xfe, 0xff, 0x83, 0xff, 0xff, 0x7f,
+   0xf0, 0xff, 0x1f, 0x00, 0xfe, 0x3f, 0x00, 0xff, 0xff, 0x3f, 0x00, 0xff,
+   0x1f, 0x00, 0xfe, 0x03, 0x00, 0xfe, 0xff, 0x1f, 0x00, 0xf0, 0x1f, 0x00,
+   0x3e, 0x00, 0x00, 0xfc, 0xff, 0x0f, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00,
+   0x00, 0xfc, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc,
+   0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xff, 0x0f,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xff, 0x0f, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0xfe, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff,
+   0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x3f,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x3f, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0xff, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe,
+   0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xff, 0x1f,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xff, 0x0f, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0xf0, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0xe0, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
+   0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00};
diff --git a/hacks/images/jigsaw/jigsaw_b_nw_h.xbm b/hacks/images/jigsaw/jigsaw_b_nw_h.xbm
new file mode 100644 (file)
index 0000000..9f9bc0f
--- /dev/null
@@ -0,0 +1,79 @@
+#define jigsaw_b_nw_h_width 74
+#define jigsaw_b_nw_h_height 88
+#define jigsaw_b_nw_h_x_hot 1
+#define jigsaw_b_nw_h_y_hot 1
+static unsigned char jigsaw_b_nw_h_bits[] = {
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, 0xfe, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x18, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x18, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00,
+   0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x06, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x06, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x30, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x60, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00,
+   0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x06, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x06, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0xc0, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0xc0, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00,
+   0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x06, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x06, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x80, 0x01, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0xc0, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x3f, 0x60, 0x00,
+   0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x7f, 0x30, 0x00, 0x06, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x3c, 0xe0, 0x1f, 0x00, 0x06, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x0e, 0x80, 0x0f, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x07, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00,
+   0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x80, 0x03, 0x00, 0x00, 0x00,
+   0x06, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x06, 0x00,
+   0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00,
+   0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0xc0,
+   0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00,
+   0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00,
+   0x06, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x06, 0x00,
+   0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00,
+   0x00, 0x80, 0x03, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x03, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00,
+   0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x80, 0x0f, 0x00,
+   0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3c, 0xe0, 0x1f, 0x00, 0x06, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0xf0, 0x7f, 0x30, 0x00, 0x06, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0xe0, 0x3f, 0x60, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0xc0, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x80, 0x01, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01,
+   0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x06, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x06, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0xc0, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0xc0, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00,
+   0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x06, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x06, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x60, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x30, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00,
+   0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x06, 0x00,
+   0x7c, 0x00, 0x00, 0xc0, 0x0f, 0x00, 0x30, 0x00, 0x06, 0xc0, 0xff, 0x00,
+   0x00, 0xe0, 0xff, 0x00, 0x18, 0x00, 0x06, 0xfc, 0x83, 0x01, 0x00, 0x70,
+   0xf0, 0x0f, 0x18, 0x00, 0xc6, 0x3f, 0x00, 0x03, 0x00, 0x38, 0x00, 0xff,
+   0x18, 0x00, 0xfe, 0x03, 0x00, 0x06, 0x00, 0x1c, 0x00, 0xf0, 0x1f, 0x00,
+   0x3e, 0x00, 0x00, 0x0c, 0x00, 0x0c, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00,
+   0x00, 0x0c, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c,
+   0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x0c,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x0c, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x06, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x03, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
+   0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x30,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x30, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x03, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x03, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06,
+   0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x1c,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x0c, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x70, 0x80, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0xe0, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80,
+   0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00};
diff --git a/hacks/images/jigsaw/jigsaw_b_s_f.xbm b/hacks/images/jigsaw/jigsaw_b_s_f.xbm
new file mode 100644 (file)
index 0000000..b1a5934
--- /dev/null
@@ -0,0 +1,79 @@
+#define jigsaw_b_s_f_width 78
+#define jigsaw_b_s_f_height 88
+#define jigsaw_b_s_f_x_hot 5
+#define jigsaw_b_s_f_y_hot 20
+static unsigned char jigsaw_b_s_f_bits[] = {
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0xf8, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0xfe, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x3f,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0x7f, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0xe0, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0,
+   0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xff, 0xff,
+   0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xff, 0xff, 0x03, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0xf0, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0xf0, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0,
+   0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff,
+   0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0x01, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0xc0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0,
+   0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x03, 0x00, 0xc0, 0xff, 0xff,
+   0x00, 0x00, 0xf0, 0x00, 0xe0, 0x3f, 0x00, 0xe0, 0xff, 0xff, 0x01, 0x00,
+   0xff, 0x01, 0xe0, 0xff, 0x03, 0xf0, 0xff, 0xff, 0x03, 0xf0, 0xff, 0x01,
+   0xe0, 0xff, 0x3f, 0xf8, 0xff, 0xff, 0x07, 0xff, 0xff, 0x01, 0xe0, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0xf0, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0x03, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0x03, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03,
+   0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0xf8, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0xf8, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0x07, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0x0f, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f,
+   0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xfc, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xfe, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0x1f, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0x1f, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f,
+   0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xf8, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0xf0, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0xe0, 0x1f, 0xf0, 0xff, 0xff, 0xff,
+   0xff, 0x03, 0xfe, 0x01, 0xc0, 0x07, 0xc0, 0xff, 0xff, 0xff, 0xff, 0x00,
+   0xf8, 0x00, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe,
+   0xff, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff,
+   0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xff, 0xff, 0x0f, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0xfc, 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0xfc, 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe,
+   0xff, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff,
+   0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x3f, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0x7f, 0x00, 0x00, 0x00, 0xc0, 0x07,
+   0xc0, 0xff, 0xff, 0xff, 0xff, 0x00, 0xf8, 0x00, 0xe0, 0x1f, 0xf0, 0xff,
+   0xff, 0xff, 0xff, 0x03, 0xfe, 0x01, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0x03, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0x07, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f,
+   0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0xfe, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0xfe, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0x1f, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0x0f, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f,
+   0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xfc, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0xf8, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0x07, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0x07, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07,
+   0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0xf0, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0xf0, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0x03, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0x01, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01,
+   0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0xe0, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0xc0, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00};
diff --git a/hacks/images/jigsaw/jigsaw_b_s_h.xbm b/hacks/images/jigsaw/jigsaw_b_s_h.xbm
new file mode 100644 (file)
index 0000000..d1e496b
--- /dev/null
@@ -0,0 +1,79 @@
+#define jigsaw_b_s_h_width 78
+#define jigsaw_b_s_h_height 88
+#define jigsaw_b_s_h_x_hot 5
+#define jigsaw_b_s_h_y_hot 20
+static unsigned char jigsaw_b_s_h_bits[] = {
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0xf8, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0xfe, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x38,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x03, 0x60, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0xe0, 0x00, 0xc0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x60, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60,
+   0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00,
+   0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x03, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x30, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70,
+   0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x80,
+   0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x80, 0x01, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0xc0, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0xc0, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0,
+   0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x03, 0x00, 0xc0, 0x00, 0xc0,
+   0x00, 0x00, 0xf0, 0x00, 0xe0, 0x3f, 0x00, 0xe0, 0x00, 0x80, 0x01, 0x00,
+   0xff, 0x01, 0x60, 0xfc, 0x03, 0x70, 0x00, 0x00, 0x03, 0xf0, 0x8f, 0x01,
+   0x60, 0xc0, 0x3f, 0x38, 0x00, 0x00, 0x06, 0xff, 0x80, 0x01, 0x60, 0x00,
+   0xfc, 0x1f, 0x00, 0x00, 0xfc, 0x0f, 0x80, 0x01, 0x30, 0x00, 0xc0, 0x0f,
+   0x00, 0x00, 0xf8, 0x00, 0x00, 0x03, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x03, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x03, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
+   0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x18, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x18, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x06, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x0c, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c,
+   0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x0c, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x06, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x18, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x18, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18,
+   0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x18, 0xf0,
+   0x1f, 0x00, 0x00, 0x00, 0x00, 0xfe, 0x03, 0x06, 0x30, 0xf8, 0x3f, 0x00,
+   0x00, 0x00, 0x00, 0xff, 0x07, 0x03, 0xe0, 0x1f, 0xf0, 0x00, 0x00, 0x00,
+   0xc0, 0x03, 0xfe, 0x01, 0xc0, 0x07, 0xc0, 0x01, 0x00, 0x00, 0xe0, 0x00,
+   0xf8, 0x00, 0x00, 0x00, 0x80, 0x03, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x07, 0x00, 0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06,
+   0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00,
+   0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x0c, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x0c, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06,
+   0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00,
+   0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x38, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x30, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x80, 0x03, 0x00, 0x00, 0x70, 0x00, 0x00, 0x00, 0xc0, 0x07,
+   0xc0, 0x01, 0x00, 0x00, 0xe0, 0x00, 0xf8, 0x00, 0xe0, 0x1f, 0xf0, 0x00,
+   0x00, 0x00, 0xc0, 0x03, 0xfe, 0x01, 0x30, 0xf8, 0x3f, 0x00, 0x00, 0x00,
+   0x00, 0xff, 0x07, 0x03, 0x18, 0xf0, 0x1f, 0x00, 0x00, 0x00, 0x00, 0xfe,
+   0x03, 0x06, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c,
+   0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x06, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x06, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x18, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x0c, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c,
+   0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x0c, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x18, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x06, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x06, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06,
+   0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x30, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x30, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x03, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x80, 0x01, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01,
+   0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0xe0, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0xc0, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00};
diff --git a/hacks/images/jigsaw/jigsaw_b_se_f.xbm b/hacks/images/jigsaw/jigsaw_b_se_f.xbm
new file mode 100644 (file)
index 0000000..5564b8a
--- /dev/null
@@ -0,0 +1,79 @@
+#define jigsaw_b_se_f_width 74
+#define jigsaw_b_se_f_height 88
+#define jigsaw_b_se_f_x_hot 6
+#define jigsaw_b_se_f_y_hot 20
+static unsigned char jigsaw_b_se_f_bits[] = {
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0xf8, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0xfe, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x3f,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xff, 0x7f, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0xe0, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0,
+   0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xff, 0xff,
+   0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xff, 0xff, 0x03, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0xf0, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0xf0, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0,
+   0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff,
+   0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0xff, 0x01, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0xc0, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0,
+   0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x03, 0x00, 0xc0, 0xff, 0xff,
+   0x00, 0x00, 0xf0, 0x01, 0xe0, 0x3f, 0x00, 0xe0, 0xff, 0xff, 0x01, 0x00,
+   0xff, 0x01, 0xe0, 0xff, 0x03, 0xf0, 0xff, 0xff, 0x03, 0xf0, 0xff, 0x01,
+   0xe0, 0xff, 0x3f, 0xf8, 0xff, 0xff, 0x07, 0xff, 0xff, 0x01, 0xe0, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0xf0, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0x01, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0x01, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01,
+   0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0xf8, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0xf8, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0x01, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0x01, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01,
+   0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0xfc, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0xfe, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0x01, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0x01, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01,
+   0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0xf8, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0xf0, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0xe0, 0x1f, 0xf0, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0x01, 0xc0, 0x07, 0xc0, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0x01, 0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01,
+   0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00,
+   0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0xfe,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0xfc, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0x01, 0x00, 0x00, 0x00, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01,
+   0x00, 0x00, 0x00, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00,
+   0x00, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0xfe,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0x01, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01,
+   0x00, 0x00, 0x80, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0xc0, 0x07,
+   0xc0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0xe0, 0x1f, 0xf0, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0x01, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0x01, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01,
+   0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0xfe, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0xfe, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0x01, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0x01, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01,
+   0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0xfc, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0xf8, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0x01, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0x01, 0xf8, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01,
+   0xf0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0xf0, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0xf0, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0xf0, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0x01, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0x01, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01,
+   0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0xe0, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0xc0, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00};
diff --git a/hacks/images/jigsaw/jigsaw_b_se_h.xbm b/hacks/images/jigsaw/jigsaw_b_se_h.xbm
new file mode 100644 (file)
index 0000000..2a11d93
--- /dev/null
@@ -0,0 +1,79 @@
+#define jigsaw_b_se_h_width 74
+#define jigsaw_b_se_h_height 88
+#define jigsaw_b_se_h_x_hot 6
+#define jigsaw_b_se_h_y_hot 20
+static unsigned char jigsaw_b_se_h_bits[] = {
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0xf8, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0xfe, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x38,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x03, 0x60, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0xe0, 0x00, 0xc0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x60, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60,
+   0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00,
+   0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x03, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x30, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x30, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70,
+   0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x80,
+   0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x80, 0x01, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0xc0, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0xc0, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0,
+   0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x03, 0x00, 0xc0, 0x00, 0xc0,
+   0x00, 0x00, 0xf0, 0x01, 0xe0, 0x3f, 0x00, 0xe0, 0x00, 0x80, 0x01, 0x00,
+   0xff, 0x01, 0x60, 0xfc, 0x03, 0x70, 0x00, 0x00, 0x03, 0xf0, 0x8f, 0x01,
+   0x60, 0xc0, 0x3f, 0x38, 0x00, 0x00, 0x06, 0xff, 0x80, 0x01, 0x60, 0x00,
+   0xfc, 0x1f, 0x00, 0x00, 0xfc, 0x0f, 0x80, 0x01, 0x30, 0x00, 0xc0, 0x0f,
+   0x00, 0x00, 0xf8, 0x00, 0x80, 0x01, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x80, 0x01, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x80, 0x01, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01,
+   0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x18, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x18, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x80, 0x01, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x80, 0x01, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01,
+   0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x0c, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x06, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x80, 0x01, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x80, 0x01, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01,
+   0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x18, 0xf0,
+   0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x30, 0xf8, 0x3f, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0xe0, 0x1f, 0xf0, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x80, 0x01, 0xc0, 0x07, 0xc0, 0x01, 0x00, 0x00, 0x00, 0x00,
+   0x80, 0x01, 0x00, 0x00, 0x80, 0x03, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01,
+   0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00,
+   0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x06,
+   0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00,
+   0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00,
+   0x80, 0x01, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01,
+   0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00,
+   0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x06,
+   0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00,
+   0x00, 0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00,
+   0x80, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01,
+   0x00, 0x00, 0x80, 0x03, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0xc0, 0x07,
+   0xc0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0xe0, 0x1f, 0xf0, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x30, 0xf8, 0x3f, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x80, 0x01, 0x18, 0xf0, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x80, 0x01, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01,
+   0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x06, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x06, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x80, 0x01, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x80, 0x01, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01,
+   0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x0c, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x18, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x80, 0x01, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x80, 0x01, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01,
+   0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x30, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x30, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x80, 0x01, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x80, 0x01, 0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01,
+   0x60, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0xe0, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0xc0, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00};
diff --git a/hacks/images/jigsaw/jigsaw_b_sw_f.xbm b/hacks/images/jigsaw/jigsaw_b_sw_f.xbm
new file mode 100644 (file)
index 0000000..d9a77db
--- /dev/null
@@ -0,0 +1,79 @@
+#define jigsaw_b_sw_f_width 74
+#define jigsaw_b_sw_f_height 88
+#define jigsaw_b_sw_f_x_hot 1
+#define jigsaw_b_sw_f_y_hot 21
+static unsigned char jigsaw_b_sw_f_bits[] = {
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x80, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0,
+   0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xff, 0x03,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, 0x07, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0xfe, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0xfe, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff,
+   0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x3f,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x3f, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff,
+   0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xff, 0x1f,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xff, 0x1f, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0xfc, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0xfc, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc,
+   0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0xfc, 0xff, 0x0f,
+   0x00, 0x00, 0x0f, 0x00, 0xfe, 0x03, 0x00, 0xfe, 0xff, 0x1f, 0x00, 0xf0,
+   0x1f, 0x00, 0xfe, 0x3f, 0x00, 0xff, 0xff, 0x3f, 0x00, 0xff, 0x1f, 0x00,
+   0xfe, 0xff, 0x83, 0xff, 0xff, 0x7f, 0xf0, 0xff, 0x1f, 0x00, 0xfe, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0xfe, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0x3f, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0x3f, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00,
+   0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0xfe, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0xfe, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0x7f, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
+   0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0xfe, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0xfe, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0x01, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0x01, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01,
+   0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0xfe, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0xfe, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0x3f, 0xe0, 0x1f, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x80,
+   0x0f, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0x00, 0x00, 0x00,
+   0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0xfe, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0x01, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00,
+   0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
+   0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0x01, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00,
+   0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00,
+   0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0x00, 0x00, 0x00, 0xfe, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0x0f, 0x80, 0x0f, 0x00, 0xfe, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0x3f, 0xe0, 0x1f, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0x3f, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0x7f, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
+   0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0xfe, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0xfe, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0x01, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
+   0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0xfe, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0xfe, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0x7f, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0x7f, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00,
+   0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0xfe, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0xfe, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0x3f, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0x1f, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00,
+   0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0xfe, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0xfe, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00};
diff --git a/hacks/images/jigsaw/jigsaw_b_sw_h.xbm b/hacks/images/jigsaw/jigsaw_b_sw_h.xbm
new file mode 100644 (file)
index 0000000..d96c8c1
--- /dev/null
@@ -0,0 +1,79 @@
+#define jigsaw_b_sw_h_width 74
+#define jigsaw_b_sw_h_height 88
+#define jigsaw_b_sw_h_x_hot 1
+#define jigsaw_b_sw_h_y_hot 21
+static unsigned char jigsaw_b_sw_h_bits[] = {
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x80, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0,
+   0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x80, 0x03,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x07, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x0e, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x06, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
+   0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x30,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x30, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x03, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x03, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
+   0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x18,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x18, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x0c, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x0c, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c,
+   0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x0c, 0x00, 0x0c,
+   0x00, 0x00, 0x0f, 0x00, 0xfe, 0x03, 0x00, 0x06, 0x00, 0x1c, 0x00, 0xf0,
+   0x1f, 0x00, 0xc6, 0x3f, 0x00, 0x03, 0x00, 0x38, 0x00, 0xff, 0x18, 0x00,
+   0x06, 0xfc, 0x83, 0x01, 0x00, 0x70, 0xf0, 0x0f, 0x18, 0x00, 0x06, 0xc0,
+   0xff, 0x00, 0x00, 0xe0, 0xff, 0x00, 0x18, 0x00, 0x06, 0x00, 0x7c, 0x00,
+   0x00, 0xc0, 0x0f, 0x00, 0x30, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x30, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x30, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00,
+   0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x06, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x06, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x60, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0xc0, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00,
+   0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x06, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x06, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x80, 0x01, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x80, 0x01, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01,
+   0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x06, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0xe0, 0x3f, 0x60, 0x00, 0x06, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0xf0, 0x7f, 0x30, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x3c, 0xe0, 0x1f, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x80,
+   0x0f, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00,
+   0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x06, 0x00,
+   0x00, 0x00, 0x00, 0x80, 0x03, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00,
+   0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x80,
+   0x01, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00,
+   0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00,
+   0x06, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00,
+   0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00,
+   0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x80,
+   0x01, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x80, 0x03, 0x00,
+   0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
+   0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x06, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x0e, 0x80, 0x0f, 0x00, 0x06, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x3c, 0xe0, 0x1f, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0xf0, 0x7f, 0x30, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x3f,
+   0x60, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00,
+   0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x06, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x06, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x80, 0x01, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0xc0, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00,
+   0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x06, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x06, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x60, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x60, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00,
+   0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x06, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x06, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x30, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x18, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00,
+   0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0xfe, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0xfe, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00};
diff --git a/hacks/images/jigsaw/jigsaw_b_w_f.xbm b/hacks/images/jigsaw/jigsaw_b_w_f.xbm
new file mode 100644 (file)
index 0000000..5d7ece9
--- /dev/null
@@ -0,0 +1,95 @@
+#define jigsaw_b_w_f_width 74
+#define jigsaw_b_w_f_height 108
+#define jigsaw_b_w_f_x_hot 1
+#define jigsaw_b_w_f_y_hot 21
+static unsigned char jigsaw_b_w_f_bits[] = {
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x80, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0,
+   0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0xff, 0x03,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf8, 0xff, 0x07, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0xfe, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0xfe, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff,
+   0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x3f,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x3f, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff,
+   0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xff, 0x1f,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xff, 0x1f, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0xfc, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0xfc, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc,
+   0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0xfc, 0xff, 0x0f,
+   0x00, 0x00, 0x0f, 0x00, 0xfe, 0x03, 0x00, 0xfe, 0xff, 0x1f, 0x00, 0xf0,
+   0x1f, 0x00, 0xfe, 0x3f, 0x00, 0xff, 0xff, 0x3f, 0x00, 0xff, 0x1f, 0x00,
+   0xfe, 0xff, 0x83, 0xff, 0xff, 0x7f, 0xf0, 0xff, 0x1f, 0x00, 0xfe, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0xfe, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0x3f, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0x3f, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00,
+   0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0xfe, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0xfe, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0x7f, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
+   0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0xfe, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0xfe, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0x01, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0x01, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01,
+   0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0xfe, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0xfe, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0x3f, 0xe0, 0x1f, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0x0f, 0x80,
+   0x0f, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0x00, 0x00, 0x00,
+   0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0xfe, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0x01, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00,
+   0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
+   0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0x01, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0x01, 0x00, 0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00,
+   0x00, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0x03, 0x00, 0x00, 0x00,
+   0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0x07, 0x00, 0x00, 0x00, 0xfe, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0x0f, 0x80, 0x0f, 0x00, 0xfe, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0x3f, 0xe0, 0x1f, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0x3f, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0x7f, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
+   0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0xfe, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0xfe, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0x01, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0x01, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00,
+   0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0xfe, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0xfe, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0x7f, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0x7f, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0x7f, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f, 0x00,
+   0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0xfe, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0xfe, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0xff, 0xff, 0x3f, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0xff, 0xff, 0x3f, 0x00, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+   0x1f, 0x00, 0xfe, 0xff, 0x83, 0xff, 0xff, 0x7f, 0xf0, 0xff, 0x1f, 0x00,
+   0xfe, 0x3f, 0x00, 0xff, 0xff, 0x3f, 0x00, 0xff, 0x1f, 0x00, 0xfe, 0x03,
+   0x00, 0xfe, 0xff, 0x1f, 0x00, 0xf0, 0x1f, 0x00, 0x3e, 0x00, 0x00, 0xfc,
+   0xff, 0x0f, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xff, 0x0f,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xff, 0x0f, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0xfc, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0xfc, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0xfe, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe,
+   0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x3f,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x3f, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0xff, 0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff,
+   0xff, 0x3f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x1f,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xff, 0x1f, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0xfe, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0xfc, 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0xf8, 0xff, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0,
+   0xff, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0x01,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x7f, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
diff --git a/hacks/images/jigsaw/jigsaw_b_w_h.xbm b/hacks/images/jigsaw/jigsaw_b_w_h.xbm
new file mode 100644 (file)
index 0000000..670ae11
--- /dev/null
@@ -0,0 +1,95 @@
+#define jigsaw_b_w_h_width 74
+#define jigsaw_b_w_h_height 108
+#define jigsaw_b_w_h_x_hot 1
+#define jigsaw_b_w_h_y_hot 21
+static unsigned char jigsaw_b_w_h_bits[] = {
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x80, 0x7f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0,
+   0xff, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x80, 0x03,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x00, 0x07, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x0e, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x06, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
+   0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x30,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x30, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x03, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x03, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
+   0x00, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x18,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x18, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x0c, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x0c, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c,
+   0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x00, 0x00, 0x0c, 0x00, 0x0c,
+   0x00, 0x00, 0x0f, 0x00, 0xfe, 0x03, 0x00, 0x06, 0x00, 0x1c, 0x00, 0xf0,
+   0x1f, 0x00, 0xc6, 0x3f, 0x00, 0x03, 0x00, 0x38, 0x00, 0xff, 0x18, 0x00,
+   0x06, 0xfc, 0x83, 0x01, 0x00, 0x70, 0xf0, 0x0f, 0x18, 0x00, 0x06, 0xc0,
+   0xff, 0x00, 0x00, 0xe0, 0xff, 0x00, 0x18, 0x00, 0x06, 0x00, 0x7c, 0x00,
+   0x00, 0xc0, 0x0f, 0x00, 0x30, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x30, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x30, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00,
+   0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x06, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x06, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x60, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0xc0, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00,
+   0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x06, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x06, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x80, 0x01, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x80, 0x01, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01,
+   0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x06, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0xe0, 0x3f, 0x60, 0x00, 0x06, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0xf0, 0x7f, 0x30, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x3c, 0xe0, 0x1f, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x80,
+   0x0f, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00,
+   0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x06, 0x00,
+   0x00, 0x00, 0x00, 0x80, 0x03, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00,
+   0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x80,
+   0x01, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00,
+   0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00,
+   0x06, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00,
+   0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00,
+   0x00, 0x80, 0x01, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x80,
+   0x01, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x80, 0x03, 0x00,
+   0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00,
+   0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x06, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x0e, 0x80, 0x0f, 0x00, 0x06, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x3c, 0xe0, 0x1f, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0xf0, 0x7f, 0x30, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0x3f,
+   0x60, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00,
+   0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x06, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x06, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x80, 0x01, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x80, 0x01, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0xc0, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00,
+   0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x06, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0x00, 0x06, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x60, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x60, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00,
+   0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x06, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x06, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x06, 0x00, 0x7c, 0x00, 0x00, 0xc0,
+   0x0f, 0x00, 0x30, 0x00, 0x06, 0xc0, 0xff, 0x00, 0x00, 0xe0, 0xff, 0x00,
+   0x18, 0x00, 0x06, 0xfc, 0x83, 0x01, 0x00, 0x70, 0xf0, 0x0f, 0x18, 0x00,
+   0xc6, 0x3f, 0x00, 0x03, 0x00, 0x38, 0x00, 0xff, 0x18, 0x00, 0xfe, 0x03,
+   0x00, 0x06, 0x00, 0x1c, 0x00, 0xf0, 0x1f, 0x00, 0x3e, 0x00, 0x00, 0x0c,
+   0x00, 0x0c, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x0c,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x0c, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x0c, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x06, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06,
+   0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x38,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x30, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x03, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x03, 0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
+   0x00, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x18,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x18, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x1c, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x0c, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+   0x00, 0x18, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70,
+   0x80, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe0, 0xff, 0x01,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x7f, 0x00, 0x00, 0x00,
+   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
diff --git a/hacks/images/lament.xpm b/hacks/images/lament.xpm
new file mode 100644 (file)
index 0000000..96c4dbd
--- /dev/null
@@ -0,0 +1,791 @@
+/* XPM */
+static char *lament_faces[] = {
+/* width height num_colors chars_per_pixel */
+"   128   768       16            1",
+/* colors */
+". c #c7c913",
+"# c #241d15",
+"a c #5e5a1b",
+"b c #6a6a19",
+"c c #e7d60b",
+"d c #fceb05",
+"e c #d8c610",
+"f c #3e3a1b",
+"g c #2c2b16",
+"h c #88891a",
+"i c #99971a",
+"j c #a8a918",
+"k c #7c781b",
+"l c #050506",
+"m c #b9b817",
+"n c #4d4c1a",
+/* pixels */
+"lf........eeee.e.e.e..eee.eeee.ee..allfkkkbabaabnknabbbbbhhhhallajiiijiiiihmiiijiihjiiiillimmjjjijijjjjjjiiijjmmmmmjmm....ee.lll",
+"#lacdddccdicmjdbdedcdccjcjdjcjccmddcllgdddejd.ceceeddded.d.ddelliddddec.cmcjchchciejeddjlfdddicbeedi.h.ecjhejc..kchcbehedddeflll",
+"cnlbdddddddddddddddddddcdddedcdc.dddflleddcmd.dedc.dddidmdmddmlliddddcdcdmdjd.cje.ejeddnlidddec.ccdmcje.ceichcmdidhcieieddc#llia",
+"cdhlhdic.#####edekk#ggg##ggggggggkdccjiecdhgggggggggggfgggfcdcmmcdcngggggggfgfgfggfh.mdjic.cgggfffggggfgffgfnncdddbnnadijd#lljda",
+"edde.ki..bllll.dmljglllllllllllll#ecdkaaemjllllllllllll#iglee.nfmmelllllllllllllllljmmbnicekllllllllllllllllfmeijilllkb..kighcda",
+"edddblncbdklllkd.lgclllllllllllfbcde.hllkjdgllllllllllllkdjdjmllhdc#llllllllllllll#d.cll.lmfllllllllllllllliddllh#llidicglbdddda",
+"edd.dblgckcilllcdhmj.#lllllll.c.ajddcell#dhjllllk.i#lllg.j.cejllibeelllllllllllllladcilfdedmmjnllllllllllfedde..hllhdac#ll.cacda",
+".iemcealgc.mbllidddg#jllllllgcddcmjjccfllme.llfmefl#lllnededkmlli.cd#lllllllllllll.nc#lijmi.cajki#llllllk.kf#lljllkmjeallkjjckjn",
+"edjf.kdblgcdhhlbdd.ll.mlllamcecdmdmhde.llgmhnn.dffmcnll#cdbcdjllibeeillllllllllllfdcilleddbaah.dhmllllliellllllhlicecgllimcc#cdn",
+".hmlfdcdhlgekch#edc#f..jllecdj#iadddd.dgll.mehlhecn#bgll#cmddillih.ndcjlllllllllliadflhbhddcbmdkbdchlg.ddcccjfhbhdhc#llmebeg#hmn",
+"e.jllgcmdal#ebcbnddmckihflkddd.eaeddde.bllkmdb#.cenmhllllkhdeilli..gddd.lllllllllcjcllc.ddddddd#ljdcacddccemedd.ckegllh.hc#ll.cn",
+".jilllfdcdblg.cckjdddailjnd.iedddddddddell#dddc#hddif#ll#aedijllhaml.dddflllllllbmbal#.nddddddellbacdd.nlkfllmd.edgllhjec#ll#iif",
+"jkillllgc.jhl#cmcddddbfhjdjdh.ddddddihicbllhdc.limddddccdhacmhlliijlljddjlllllllccelli.cc.dddddckmheb#llljll#edhe#llm.e.#llllecn",
+"e.ebglll#mmeal#ehcdddilj.emijc..ddd.m#dj.llgdmchfaiabheddckcjhlliicii.mcd.lllllgmbjlgcnda.aaddddddjllllljblgmekegllicae#llll#imn",
+"mbdddeb#lfcadblgce.ddmlleklllgddddcl.#m.dlllei.ilcccmjhkhmdddkllijcdd#liddallllicdflhdddecg#cddddmlllllhefmdeedgllieac#l#lbagccn",
+"..ieddmccmmdacbl#eccddklgdmhbmddd..lja#mhjllf.c.g#.fhlll#jbcdblliidddjlgddhlllgegmll.ndmfmd.dddenllllljdiaecie#ll.jm.gbcccdddicn",
+"mjhkdclk.bmdd.cnl#ejcddnlhikmdi.dikbfebc.c#llejciidajllbjflcckllj.dhdd.ned.allb.enlndce#l#chacjlllllajcclbcaegllh.mcajddddccde.n",
+".jhl.dlcjllgcccdal#eiedcl#cllkigdcfdjmfi.cnllidd##ddflmbll#cdblljneebdagjddnllml.llckc#lllgmmglllfhc.lnd.j.c#lljdidddddddclgddcf",
+".ehlndadilllmddcdklgce.dflgmbnccd.kejbll.f.llgcbc.enlljlaeedjklljmd.mdhllmdblnmmal#c.cllllllllb.cdddjlkdemm#ll.ikdddddj#ncfijhmf",
+".ihlliddelllccdddcaf...millfecmddflfek##mmdflliej#llllj#dcaedblljhcm#cellnd.l.nillkhj.nillll#mi#jdddcmdcf.#llijecdddcdnlgi.nlecf",
+".eklll.dd#lgdbdncbdc##ejdallf.lbdgll.jed.damllgc.nllllmkdddddblljedd.ddillcegdcjl#cddcdfll##dflladdddchic#llmceddmagl.mecallljig",
+"ibhlll#.dblkdheagca.kl#ejchl#knljglgdglgid.ell#dijlllledd..cenlljkcel.cfmi.cdnj#lkeibnmb.iecm#l#..dddmee.#l.ehdmfllnmmaglllllccn",
+"m.hllllfde#bdddmnc.mmal#.c..i#bl.inidill#dmjbllhjellllkb.jaecalljcjkmcdl#ecf.mjllmcd.eddeddjhekmaaddekm#b.mhi.nl#hedi#lllllllm.n",
+"mkklllllndhkdjmdceh.jdbll.d.j#k#c#bddcbllcccclllckblllllllneimkamhceaadklgdeajnl#eacdhj.ldmelmblgddhgelll.hcjll#cddblllllllllceg",
+"..bllllllkccdmli.llfdacbl#mme.nndmheddamikacdflljeell#nbjmeddknbcdddccddhbcdhell.ec#meeeeilkme.mjdhmmllle.iilliekmkkllllllllljjn",
+".iblllllllbcdc##mg#mddkdall.idmjngned.n#.ilckillbemmmedmdkcddalleddmdcdmdedcbbl#dijfehlmmllfknclhekill#mjkml#hhachbelllllllllcef",
+"edklllllllgeddhlmddddddi.kll..malllkmlc#gdlhddnhccdcn..dcjafnlll#gnhjcdhegdddehjicgf#lbblll#mkcmenjlllebejllmkamflhjj.llllllljhf",
+".iklllllfjhcicd#ndddddddemkllm.bbllkil#iknlfcmeflndcin#nblllllllllllll#gajcdm#adbhllllllllllbjdhjjlllc.mj#n.ngjgllje.cfllllllccg",
+"e.hllllgeakllidagdddddcdcbdallmhckii.bif.ll#ddelllb#lllg.lllllllllllllllll#bglnddillllllllllncmcillg.cje.mj.li#nhkigadkllllllmig",
+".jillllfcblliddc#mdddjlmneacbll.#eiecddhagaddddglllllll#dllllllllllllllllllllladdecfllllllll.cihlllcjbmllllibd.a#bllgdallllllddg",
+".hilllllhjllcdddhg.#fhlljgcmihlljj.igkddccckdkgllllllllleglllllllllllllllllllll#h.ch.gllll#miaill#ci.dkbillhcd#fa#llkd.cilllljkf",
+".milllnjhmklcddd.l.gljbn..ccj.blljccaa.dccdj#llllllllllljn#gfnaanfg##llllllllllllfj.mdbllljjchllgeie.c#l.mfedcge.nkhejfej#llle.#",
+".ailllefjf.edddjm#g.lnddjggjmfcblljedhjdmccgllllllllll#bcddddddddddddehglllllllllllmdmemle.nbllledh.lfl#bfddde.ddb#jfllkjnll#hbg",
+"eehlllmjlkdddddddilnmehkbf.jjeichlle.ddchlg.lllllllnjcdddddddddddda#gajdejglllllll#efjcichmjll#ccjkahllfgnh##mddmhbjlllgcgll#ceg",
+"eddifl.cgndddbkaihlla.gijmalll..ma#eedcalllaklll#a.dddddddddddddddfllllcdddmalllllm#lljcdd.mlgeh.hjlmllilkflledddden##lacl#bedd#",
+"kddfcddjdddddkllillll#eelllllll.d.c#lh#lllllcglncdddddddddddddddddglll#dddddddalliallllbdklajckdaajfal#mlilladddddcj.ececjdihdd#",
+"lgcjc#e.ddddcckmgllllhmc#lllllll.jdillllllllf.mdddddddddddddddddddejm.cdddddddd.jhllllllgllfde.abacm.ccc.hllmccddd.lllhdc.kc.kgl",
+"##mnb.cadjddffhklllllijbmgllllllfdddglllllllbdddddddddddddddddddddfff#mddddddddddhllllllllgcci.gjncn#dddddjjk#bddddakm.jac..alll",
+"ee.nllfmdaefchgclllfl#djedkllllleddflllllllmddddddddddddddddddddddbgghddddddddddddelllllllbdd.#eccmlimdcjn.kmklkddddebfdmglbalgg",
+".ddcalllgbmmchcdeb#i.bm#ccehlllihckllllll#edddddddddddddddddddddddkkh.dddddddddddddefllllllbdh.diflhalj#lg.ige#kdjb...b#lllbe.dh",
+".ddjcebglllnmechccc.hhegc.lnllbcehllllllgcdddddddddddddddddddddddc#l#.ddddddddddddddegllllll.hddflfklbblljmbk.ceimi.allll#bmkddb",
+".mdjcfcd.glll#ad..hee#adddjlllcbdllllll#cddddddddddddddddddddddddddddddddddddddddddddd#llllllcadc.dnnd.fmkndcclcch#llllb.dhmhddb",
+".eeficdiceekllllnj.cmceddmhglmcckmfllll.ddddddddddddddddddddddddd.##bdddddddddddddddddcglllllicem##kn#gmdcjcacjn#lllgk.bei.iahjb",
+"...ll#hecebcehglllgi.chcccglfccilgmall.ddddddddddddddddddddddddddeabcdddddddddddddddddd.#llgmjinjblllfh...iejfllllgiemaj.hgllhjb",
+"ejmlllllgmccg.e.allllneccjdeeeellllijhdddddddddddddddddddddddddddcabdddddddddddddddddddd.lkc#llciilac.j#dealllllncjhge.#llllleea",
+".emlllllll#amcamkciflllgkmdmddnllllljddddddddddddddddddddddddddddhlkddddddddddddddddddddd.kllllnjmc.dhehgllllgj.chee.bhlllllljjn",
+".kmllllllllllfje.ke.jflllleecelllllleddddddddddddddddddddddddddddemdddddddddddddddddddddddglllllmdd.eb#llllnjcei.dmcflgjlllllecn",
+".djlllllllllllllgmdamdcil#d#lllllllkdddddddddddddddddddddddddddddbgdddddddddddddddddddddddjlllllndjjlllllidkjmddkclg.ecdilll#hkn",
+".hjlllllllllllllll#hdhcnemelllllll#ddddddddddddddddddddddddddddddnkddddddddddddddddddddddddalllllnlajla.chcjmakblfhfmkgicllllccn",
+".djllllllllllllllllfdem.jnd.glllllkddddddddddddddddddddddddddddddf.ddddddddddddddddddddddddclllllllndejch.icnljfb#jdd.llhbllljif",
+".djllllllllllllf#l.ddc#idddc#llll#cddddddddddddddddddddddddddddddjddddddddddddddddddddddddddflllllmde.ecallgc.jejeddfeallllllcdf",
+"mcjllllllllllg.dcedecdceccdjlllllhddddddddddddddddddddddddddddddddddddddddddddddddddddddddddjlllllmddkflllllg.dbibjd#billllllmhf",
+"mdjlllllllll#.dddea#cmkle.iallllledddddddddddddddddddddddddddddddddddddddddddddddddddddddddddgllllg.h#ll#lllllkmbdbcb#hllllllmjf",
+".jjllllllll#eddkmllgillledd#lllllddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddklllllifbllhenllllllchcmlllllll#i.f",
+"mcillllllkcdddmbkllmb#gjdmclllllhecddddddddddddddddddddddddddddddddddddddddddddddddddddddddddmllllljmjlladdihj#l#dce#llllllllhmg",
+"ejjlllll#cddde#hcmeddccdc.hlllllenkijcdddddddddddddddddddddddddddddddddddddddddddddddddddddddclllllhbellm.deg#mllce.lllkgblg#c.n",
+".dmlllllcddecggcddhcccmdddnllll#dgfmllkdddddddddddddddddddddddddddddddddddddddddddddddddddddddnlniccc.nlgmed.lkhlji.llmccbmjljnh",
+".cmlllfic.klc.dm.hf.#h#dem#llllfd#lc#llm#nedddddddddddddddddddddddddddddddddddddddddddddddddddcjkf#ge.alljbmdbljbhi.#mdddem#leef",
+".ee##kdd###hddmieemdec.dcclllllbd#legll.llhhkeddddddddddddddddddddddddddddddddddddddddddddddddelllllchkl#nmn.mlbdnhiecmcie#l#bhf",
+"eddedededcdcdcdcddccdddddelllllkelljfllmllkhlhbkddddddddddddddddddddddddddddddddddddddddddddddclllllmkj#gfmjbegfdnihiigmgcfgadcg",
+"eddhcbdjdhekckdbeh.hcj.idelllllhde.c.ikeafii#haljiicddddddddddddddddddddddddddddddddddddddddddclllllhddkchckckchmb.ichckekchiddf",
+"gamjkhhihhhhihijijijiijdjhllllljddddddddddddcdc.c.k.ddddddddddddddddddddddddddddddddddddddddddclllllhcdhci.jcjcj.jejcickebcbjcdf",
+"llfnllllllllllllllllll#clllllllmdddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddllllll#bj###########g###ggg#bdgn#",
+"ll#allllllllllllllllll#clllllll.dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddlllllllnhlllllllllllllllllllgelll",
+"fnkiffgg#g########ggg#ndgglllllmddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddclllll#nkmggg#g##############a.##l",
+"eddddecedddddddddddddddddclllllmddddddddddddddddddddddddddddddddddddddddddcimeedcddddddddddddddllllljdejdcdcdd.dcd.ddddddddc.ddg",
+".ddddiejdd.mjjcdjdjc.ddddelllllhdddddddddddddddddddddddddddddddddddddddddddmb#le#feghefejhecmedlllllidefekcimjamacbcackeijjkfdcl",
+".dcacdeccj.jcmdbhebkbkkmjmlllllbdddddddddddddddddddddddddddddddddddddddddddddcjelgmlbiljllhnlncllllliiddhddcccdddeijdde....m.ccl",
+"mdcfdddcd#aijacg#ciba#l#eelllllkddddddddddddddddddddddddddddddddddddddddddddddddceelbhlmll.llkelllllecdcem.imjdhbfljhllllllllbjl",
+".ddicddcflg.jk#hl.dddhllcdnfbijmdddddddddddddddddddddddddddddddddddddddddddddddddddm.ilmll.llj.llllleadfmmedddklngiclllllllll..l",
+".ddch..flllc.iljffdddblleddehfl#ddddddddddddddddddddddddddddddddddddddddddddddddddddddicnl.ll.hllllgdmdccddmfj#ljjdjllllllll#bil",
+"ehc#nlnllllcc.lgeggcdnll.emlllllcdddddddddddddddddddddddddddddddddddddddddddddddddddddddd.c#lcfllllfj.dh#a.llm#kdddnlllllllllccl",
+"ed.llllllll.dellgkh.dalljmclllllhddddddddddddddddddddddddddddddddddddddddddddddddddddddddddc..lllllkecbllbflncacmhallllllllllhjl",
+"ecellllllj#mdelbglllbjllb.d#llllgddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddillllljbc#lk.lidddelllllllllllllccl",
+".d.llll#fkcc.jcmdmlllllll.hallllledddddddddddddddddddddddddddddddddddddddddddddddddddddddddddnlllllemdkcdceddddalllllllllllllh.l",
+"ed.llla#cgjd.akeddjlllllkcdmllllliddddddddddddddddddddddddddcdddddddddddddddddddddddddddddddd#llllkcjddddddcjd.#lllllllllllll..l",
+"ec.lllmhkebdemc.nacnl#kck.de#llllfddddddddddddddddddddddddddkcddddddddddddddddddddddddddddddhlllll.ddddcdde#lgllllllllllllll#mel",
+"edcllladn.dkfgfinlae.dmcceilllllllidddddddddddddddddddddddddnddddddddddddddddddddddddddddddcllllllg.cdnedmlllllllllllllllllllccl",
+"edelll#edchlbkljla.ddd.bgg.lglllllgddddddddddddddddddddddddmnddddddddddddddddddddddddddddddilllllllbih.cic.hfllllllllllllllllkjl",
+"edmllllkjlhb#eeceddc.alll#djcalllll.dddddddddddddddddddddddakdddddddddddddddddddddddddddddc#lllllk#j#llaeem.dmglllllllllllllli.l",
+".c.llllgelhdddddcdklllllne.cdcllllllcddddddddddddddddddddddjhdddddddddddddddddddddddddddddklllllbdde#llll#kcc.ccilllllllllll#jel",
+".d.lllllgmcdidd.b#lllfhecjeeddfllln.mdddddddddddddddddddddmlhddddddddddddddddddddddddddddcilllll.ddj.mnllll#ajc.chjnllllllll#jel",
+"eemllllgmcbd..nllllgjc.cd.b#enjllk.flmddddddddddddddddddddmicddddddddddddddddddddddddddddnh.#llbdd.iijcea#llllamch.j.a#lllllleel",
+"edellaed.jcklllllacdbeddcgllndejcalll#ddddddddddddddddddddbljdddddddddddddddddddddddddddjllgdklcaellkccf..m#lllllb.c.hd.flll#k.l",
+"eddh..ce.b#lllgh.jim.dj#nehm.dkcnlllllfcdddddddddddddddddilljddddddddddddddddddddddddddjllllg.cjenl#l#.de.jcmalllllnmcjc..kg#..l",
+"edd.ei.fllllfjchcmca#illjfgmcddkjllllllkdddddddddddddddddbnhcdddddddddddddddddddddddddc#llllladkilln.#kdddccmdck#llll#kckdjc.jjl",
+"edddkllll#icc.edj#h#c#lnafmlnddddalllllladdddddddddddddddhfl.ddddddddddddddddddddddddcllllllleac#lllhdddmaddde.ec.nlllllnmdmgdcl",
+"m.he#llnic..ecb.g#jiekickilncd.cdmfllllllkddddddddddddddillledddddddddddddddddddddddegllllll.j.fll###d.kmnenmddeea.mb#llllgjcdcl",
+"llle#a.cicmdd.fnlgdieddddkleddgncje#llllllacddddddddddddhkhhddddddddddddddddddddddd.gllllllbdkmlllnccdhl.cnllbdkcjegcch#lllfca.#",
+"llgddkc.dddddcmllcflcmddddcdibblbddclllllllleddddddddddca#lgcdddddddddddddddddddddillllllladcelllll#jdejjnlllli..#cccidceklf.lll",
+"fidkc.jaadddddd#kjlfhi#ambddeflamhc#llllllllgedddddddddjl###ddddddddddddddddddddeallllllll#id.illllllbife#llllndblmddddh.m.jclll",
+"eddddenheddddddfe.lhljllhl.jagae..ib#mllllllcgfcdddddddcm...dddddddddddddddddddeallllllllllfckcallllllaccblll#c.hbiddddeehk.cjfl",
+"edeaek#leneddddddddhljl#albajaeee#ledddglllahlllaedddd.llllbdddddddddddddddddjglcflllllkc#bmljm.hllllll.jlllfcallcddcdcjmjecbddn",
+"edmb.iajif.ddddddm.llj#kfl#b.db.llgcdde.alg.llllllnmddmglllkddddddddddddddciflll#.gllliddcjlllicjhlgihebhhllgcllledddakehllnjddn",
+"ed.bdmdjkemaddddcljlljgelllc.ne#l#e.dhmcck.nllllllllgjcc.kn.dddddddddddceklllllllkcl#mcdd..glll.iciellilfeflleaibcdddkl.llllleea",
+"ehmlllmhlmllcddd.lgehhiblliimelllecdfllm.ddfllllllllllllfkmeedddddeemj#llllllllllliecckk#.kd#lllijedjmccnlmllgdddddd.#hhilll#men",
+"ecjlllmij.hhcedd.ll#kmcglkjjjll#ejmnllllbc..jflllllllllllll#l#####lllhllllllllllla.ejdd.bnebeflllj.cdcffbl#illedddenmhahklll#ejn",
+"ejmlllhjdi#cf#dddjllliciim#mll#.bcnllllll#.ic.i#llllllllllllllllllllljlllllllll#m.eheedjbbneee#lllemjeblmgleglgcddblhj.nlllll.kn",
+"edjll#j.djjllgcajdi.emhdki.lll.hdnlllllllllgecdd#lllllllllllllllllllliflllllllmcdaehaadenllfckc#lllmcmegbeidmlladc#llmgllllll..n",
+"ehklllanchmln.nlbdkgnn.cjjll#.ejbbllllllflllleckliehfllllllllllllllllbklllfallkddi#fjlcbfnkjkcaenll#miecdddddbll.cflkk.lllll#hjn",
+"c.hllllfcink..llkal#ddmk.lll.h.jbilllllkelllabeejdddd.in#llllllllllllnenj.dc#lieail.ik#hdhnl#.cecglllcbcddddd.llndc.nhjlllll#ddf",
+"ejmllll#cdcafiljklllemk.lll.adicfhallljclacnccjlh.ddmea.ic..jhllf.mececfjkddcmfbjinilnkgd.m.kggjjc#lllmkedddddfllcddcnllllll#khn",
+"ejjllll#.ejlhehmll#jk.jll#.c.abeahillkjcmdbncmfl.icccecchcn.dcllfddicheiibhkcllgmjienlhdd.h#lllb.kegll#mmidjnf.lljdde#llllll#eef",
+"emjllllifjgkmgj#llmc.mlllma.dhjfdbmfahnkadjdjml#.egm.#.dcdmccciijddjknlllllejnllcheeemjddkgmglll.ch.#ll#ej.#llcnlnddd.#lllll#hjf",
+"ef.lllbhnccnim#lbechmllleacddblle#fedjklndddealmjemdc#gcljmhjcf#bgj#lllllllia.llajcclllmdklljm#jb.eecllll.heabb.ll.dedd#llll#edf",
+"ccilll.amaemnghedjmjll#...dddmnhcbnddmjmjfdid##djdd.cnlei.fc..llfccgaabbbklgcefll.ndiglfd.b#lnchlmbij.#llfcf.cjc.#mcadd.#lllgjif",
+"emjllbeeflkdcdddkcmlll.cjdddddh#lcmckllinlc..lndmcdg#egen.heamllnhjgbhmddmllikhllijdaeb#d#beflmg#mljcn.lll.che#ijmem#cddhlllgeef",
+"edjliblgdmcddeejeee#lejmbedddegjmglllllgkcik#l.jjfdclledi.mdcellndcfmece.lllg.mllgelej#.clllncikai#aacjc#mageccmil.nl.dddfllfkj#",
+"c..mdilhddddddejjlaeehdklfdddehfllllllllgd..lnddalhdhlhcg.ajb.llnamikhcghlllne.klljmd.hjkigllenfbbmllem.eillncjdc#.lljddkcllgjeg",
+"c.dddd.dddccdikjlll.cmmkl#d.blll#hhlllllkdhiljjd#lfdcafd.keccellfcdndmflilli.km.llfc.ai.lg.imddddddalidea.lllgdbdebllide#dblfmef",
+"ccdddddddf#cncjll#cmmbjfij#lllg.cbnc#lll.ec#l..hl#cdde.d.kccfmllfbi.#lkmg#ccll.c#lldccfaindddddddddelledcam#llgci.nllhdb#cdggimg",
+"ccdddeanfgmimill#eddjae.klll#hcdmglijfiediilnem#llmddalnciid.ellg.e#niblliecihmkmllhhmgfmgcdddddngacilkdd...gllne.eilic##cdhfccg",
+"cccanlllle.billl.bcehfhblllkcddddclncehbedfleeellllmcd#ladcdnmllgjjhmllllghe#gcdcgllcem#dbeddddmillfclnd.hea.lllfcgc.chl#dd.fbig",
+"ecillll#cajkll#eemm#lhalnjcdccdddcgbgllmddlgdmklllll#.mll.ddccllfcce..mm..ha.lbcjklliadkddddddjlg.llgnfddbacne#llfe.dejiidddcddg",
+"eeilllg.bchllg.j.ceihcmcdddcjbddddddb#he.ilk.clllllllideb.dda.llgjkjbj..ihkihljcej#lncmdddddddcnlnnllmkdddkhj..fllfmcmafbicddjjf",
+"cmjlllec.kll#efedgbcdddcdddklke.edcddcd.j#lekhlllllllkddjamdeellgcebakkcc.kjcjfac.kll.gcdddddhjc.bcglidiedclheee#llfcbd#llfmd.eg",
+"cdjlfcijbll#cbdbhlll#nbmdcmi#labl.ddddcimlbddflllllllleddglcf.llf.ih###lll#ec.l.dkmllndmdcddmlliagicmhklkdd#lbenc#llncncflllahe#",
+"c.cf.gckllgemenhfllllnic.giaklfm#ncjcdcmal.delllllllll#kchl..ellfccjkllllljjadmfbeegl#cmdddd.il#illkmeiljddeflhmm.glla.emfllnic#",
+"cdccmmbll#e.calm##gheddelllimnecccnlkdhellcdblllllllllllbelenellgcjhcblllaindeiljehjllijbcagljllmglfdnmlcdddjllh.me#llnc.d#lnm.#",
+"cccmibll#eedfl#ecdddddillllgkhcjl.j#fdcblidclllllllllllladfeeellfdckddjlllkefkdegncdfllemmlllmlljmbjcgiej#mdd#llbefc#llaehcfnj.#",
+"cdddkllf.eeallkgnjcdcalllllllljheccecm.f#demllllllllllll#c.daellgem.cddal#hgkckgllm#jlljjdglljik.mhi.lgd#lgdd#lllicemgllacaejjc#",
+"ecd.llgc.mnllldfgaee#llllllllllhgmcicc.lfdealllllllllllllhddcellgddacdclllljklllllfcclladcillb.hhmlllllmllfddnllllijbellla..ma.#",
+"edbk.fcicgllladdddallllllllllllllln.mknljm.lllllllllllllllidfellgce.dd.mllllllllllldbjlle#..ahel#llllll#mgcddcllllladnc#lln.bdd#",
+"ehllicbenlll#edd.glllllllllllllllll.dclfdcblllllllllllllll#d.ellfddngh.#llllllllllljce#lb..ebhklllllllllbceddd#lllllimcjglb.cdc#",
+"lllgelcbllll.ddallllllllllllllllllgdcd.ccdglllllllllllllll#dkdc.c.jfllg#lllllllllll#.md..dnclllllllllllllhancdglllllliefebe#fdcl",
+"ll#cdcccccecddeecccccce.cccecec.eecddflcddccccccccccecec.ecddcllfddcccecccccec.cjc.ccdd##jddccccccccecccccdecdceje.cecdcddfllkd#",
+"lghdddhcdd.edd.cddddddehdcd.dcd.ccddjlndddc..mddjm.e.cjcmc.ddell#cccccmceccdjdmcicmccddnlgcdd.ddddddddjdcdjdidhefcbckdddddcfllal",
+"lbanfffnnnanabhbafnnaanaafbnnnaaaaanglgjhhbbbibbbajbbkbkhkhjjhlllllllllll##g#g##gg#fgfnlllfnnnanabbbbbbabkjbaaanbabnbabbbhknllll",
+"llllllllllkim..mjijmhkkhjj.ijmim....himbhaa...ibkbnaabbbaaakfffgfnnang##nbbbanlffl#ggabbnafnbbbabbbkhhimmmhijimbkecc.flgmec.klll",
+"llfjcd.hlnddddddddddddddddddddddddddddddilcddddddddddddddddddddddddddddd.dddddjdd.dddddddcddcddddddddddddddddddddecddagcdddddj#l",
+"lnddddddcgdddddddddddddddddddddeeddddddnhfcddddddddddddddddddddddddddddddddddddddddddddddbhckddddddddddddjncekddalnddbddddddddml",
+"lcdddddddedddjf.dddddhbddddddd...ddddcbcdlcdddddddddddeddddfadddd.kddddd.dddddddddddddddddbhkdd.cddcjahd.gmddcdnfm#cdddddddddddf",
+"kddddddddddddjcddddcid.ecdcdddddd.jdddddd#ceedddhedddjgcddkiacdijebdmmddhdjkhiddddddehdddde#add.khajlmddmc.nddigcdg.dddddddddddk",
+".dddddddddddddddddddddddde.dddddd#iddddddkdddddd.#nhb#eddbmdecddd.imlcddjcacdcddddjddddddddmaddddemdfcdddengcjl.ddajdddddddddddk",
+"mddddddddddddddddddddddd.jdddddmn.ddddddddddddddddcaeddc#.dddddddihmf.ddnhddddddddkbcdcdddm.nddd.gddmdddchcfdkhdddh.ddddddddddd#",
+"jddddddddcddddddddddddddedddddmgdecddedddddc.dddddcidddi.ddddddddccdmeddidddddddddcnfnjdddecnddd.edddc.dddcndhcddd.ddmddddddddml",
+"gcdddddddbccdddddddddddddddddddddddddhdddddc#cdddd.mdddddddddddddddddddddddddddddddddddddddcfddddddddjaddddjdddddddddfjddddddd#l",
+"laddddddhleddddddddkidddddddcmdddddddmddddddddddddj.dddddddddddddddddddddddddddddddddddddddcfdddddddddddddddddddddddd#lacddde#ll",
+"gacdddddibcdddc.jb#ln..e.mmialannabhmmddddddddddm.aim....mjmmeedd.mee.e.e.eeeeedddddddddddce.eeeeeeeee..ee.ee....eeedmjjedddc.ml",
+"eddddddddd.###lllllllllllllllllllllllbddddddddddflllllllllllllldcllllllllllllll.ddddddddd.lllllllllllllllllllllllllliddddddddddn",
+".ddddddddd.lllllllllllllllllllllllllljdddddddddd#llllllllllll#cddcnllllllllllll.dddden#g.bllllllllllllllllllllllllllidddcingfddh",
+".ddddd.dddmllllllllllllllllllllllllll.dddddddddd#lllllllllllgeddddcflllllllllllndddddebddhllllllllllllllllllllllllllidddmaabkdcg",
+".didddidddmlllllllllllllllllllllllllgdddjddddddelllllllllllleddddddcllllllllllll.ddddcnddmlllllllllllllllllllllllllljdddddddddel",
+"hdddddjedd.lllllllllllllllllllllllllgdddecddddd.llllllllllfeddddddddcflllllllllhddcdddk.dellllllllllllllllllllllllll#iddjednadel",
+"fcddcdddddmlllllllllllllllllllllllllfddddddddddhlllllllllfcddddddddddcnllllllllf.dedddchddlllllllllllllllllllllllllllhdcghdbfdel",
+"jddmjdddddmlllllllllllllllllllllllllkddjmddddddallllllllleddddddddddddcllllllllllcddddddddfllllllllllllllllllllllllllcdaiddjfdcl",
+"mddnmdddddilllllllllllllllllllllllllmdddddddddclllllllll.ddddddddddddddcgllllllgeddjidddddblllllllllllllllllllllllllgddjdddeadcl",
+"mddnidddddilllllllllllllllllllllllllcdddddddddcllllllllfddddddddddddddddbllllll#ddd.iddmambllllllllllllllllllllllllllcddc.dcmdel",
+".dddddd.ddillllllllllllllllllllllllbdddddcmddd.lllllll..ndddddddddddddddflllllllddddjddchddnllllllllllllllllllllllllledde#ddddel",
+"mddddddmddilllllllllllllllllllllll#cddddddccddhllllll.ddeeddddddddddbl##l#.#llll.d.n#iddjdd.llllllllllllllllllllllllledfmdddddel",
+".ddcddddddilllllllllllllllllllllllbdd.edddceddnlllllbddddddddddddddckcdcmcdj#llladek.cddccdd#llllllllllllllllllllllllmd.ckcdddel",
+"eddfadddddilllllllllllllllllllllllmddhdddddddclllllbddddddddddddddddddddddddellll.dfddddddddmlllllllllllllllllllllllllhdddddddel",
+".ddc#jddddillllllllllllllllllllllnddc#gkddddbfllll#cddddddddddddddddddddddddde#llhdedddddddddallllllllllllllllllllllllfddddddd.l",
+"mdddhacdddilllllllllllllllllllllledddicdddddjllllnghcddddddddddddddddddddddddd.#lfdddiedddddd.lllllllllllllllllllllllleddddcdd.l",
+".ddd.lheddilllllllllllllllllllllifcdddddddddd#llkddgnddddddddddddddddddddddddddelljdddddd.ddddmllllllllllllllllllllllkddddmndbll",
+"iddddmheddjllllllllllllllllllll.ccdddddde.ddnllkdddcaedddddddddddddddddddddddddd.#gddddedhhddddnlllllllllllllllllllllmdddikdddel",
+"#idddddddd.lllllllllllllllllllmddddddddddddmlladddddcnjddddddddddddcakddddddddddd.g.dddaceacdddcglllllllllllllllllllleddd.ddddcl",
+"lnddddddddmlllllllllllllllllljdddejedddddddglkddddddddb#iaddddddddelllbdddddddddddcliadcddddddddc#lllllllllllllllllll.dcddddddd#",
+"mdddddddddjllllllllllllllllljdddahecddddddk#nbdddddddddbfcddddddddnlaklfeddddddddddekdddddddkadddcglllllllllllllllllljdckmddddd#",
+"jcddddddddillllllllllllllllkddh.fedddddddcf.dcdddddddde#edddddddddca.dhg#hcddddddddddddddkjdddddddcflllllllllllllllllkddcn.ecddg",
+"l#hdddkkddjllllllllllllll#.ddddifeddcddddiedddddddddddhfddddddddddddddddcimdddddddddddddc#cddddddddhi#llllllllllllll#cdddd#l#cdg",
+"geddddcgcdjlllllllllllllaedcddddcdddddddddddddddddddddb.dddddddddddddddddddddddddddddddddcdcakfhddddddj#llllllllllll#cddidcccmdn",
+"mddcdddkjdjlllllllllllamdddmhcddddddddddddddddddddddddkdddddddddddddddddddddddddddddddddddddcdeedddddddcb#llllllllllgddddddd.hda",
+"eddfeddddd.lllllllllbcddddddddcdddddddddddddddddddddddcdddddddddddddddddddddddddddddddddddddcdddddddddddddjllllllllladddddckfddk",
+".ddikddddd.lllllfbnadddddddeahcdeffidddddddddddjidddddddddddddddddddddddd.#iddddddddddddddddcdddddncdddddddc.k#lllllbddddmm.dddf",
+"mdddfcddddchbimcdd.cddddjdddcgfdd.cddddddddddchljddddddddddddddddddddddddebcddcddddddddddddddj.dddjiddccdddddddcmjih.ddddddddddg",
+"mdddj#dddddddddddddddddddddddccddddddddddddddaliddddddddddddddddddddddddddddddfeddddddddddddde#dddmbdclhdddddddddndddddekkmddddg",
+"bdddd.ddddddddddddcdddddagaedddddddddddddddddal.dddddddddddddddecddddddddddekljdddddddddddddddcddddaidcdddddddcecaddddcghm.ddddg",
+"ndddcdddddddddddddbcd.ddea.dddddddddddddd.g.dd.ddddddddddddddddk.ddd.k.ce.alljdddddddddddddddddddddcaaedddddckhbfmddddcmdddcmdd#",
+"kddbfdddddddddddd.id.lbdddicddddddddddddcln#.ddddddddddddddddddajdddjlllllllkddddddddddddddddddddddddhidihddkdddieddddddcddkndd#",
+"kdcmdddddddddiddd.bdegfnddddddjkddddddddhedhlfhcdddddddddddddddnkdddellllllidddddddddc#beddddddddddddkmd..ddcdddfcdddddcdddbcdcl",
+"kdcdddddddddcfd.ibbdddilidddca#cddddddckedddmafggfaieddddddddddfbdddellll#jddddddddddmgagnhmdddd.bccckddddmddchdhcdehddcdddaddd#",
+"kdfe.bddddddc#flfcdddelbcddnlleddddddcl.dddddddddddddddddddddddfndddclllgeddddddddddc#.ddccddddddclfhcddddamdk#cddml.dddddcidddf",
+"kdcjmehedddddja.cdddddcchfll#eddddddhg.ddddddddddddddddddddddddffdddd#n.ddddddddddddnadddddddddddd.#la.cddccddf.dbhcdddddd.fedd#",
+"bdcdddciddddddddddddejnllllljddddddb#geddddddddddddddddddddddddgfddddcdddddddddddddabddddddddddddddblll#nk.cdddddbhhmddddddhbdcl",
+"bdhjdddhddddddddddhgllllllleddddddddddccddddddcddddddddddddddddlgdddddddddddddddddbli.ddddddddddddnlllllllllniddddddddddddddeddl",
+"kddgedmmddeafg##llllllllll.dddddddddddddddddddcgiddddddddddddddl#ddddddddddenddddcjikicddddddddmcdeieeglllllll#gfabjmdddaeddjccl",
+"kddkkdi.dd.lllllllllllllljddddddddddddddddddddde#neddddddddddcjl#ecddddddd.ghdddcddddddddddddcklkddddd.llllllllllllllcddifijfdcl",
+"kdddddddddmlllllllllllll.dddddddddddccccddddddddellbdddddddeflllllllhddddilnddd.lmddddddddddhl#jddddddddlllllllllllllcddddd.ddd#",
+"hddddddddd.lllllllllllljddddddcibfg#llllllgfhcddd.llg.dddmnllllllllll#kdbllmdddkbcdddddddddcmedddddddddd.#llllllllll#cddddddddcl",
+"hddddddddd.llllllllllliddddddjfgg###llllllll#cddddm#lljdjllllllllllllllglladdddddddddddddddddddddddddddddjlllllllllllcdddddddk#l",
+"hdddddddddmlllllllllljddddddddddddddcjh#llllcddddddc#ll#lllllllllllllllll#ddddddddddddddddddddddddddddddddmllllllllll.ddddddddjl",
+"idddej..ddmlllllllllidddddddddddddddddddcjfadddddddd.llllllllllllllllllllliikaahcdddddddddddddddmfeddddddddmllllllllljddddddddd#",
+"mdddddcacd.lllllllladdddddddd.mcdddddddddddcdddddddddklllllllllllllllllllll#nj.ccddddddddddddddd#lfdddddddddmllllllllndjcdddddda",
+".ddddcc.fd.lllllllkdddddddddanedddddddddddddccddddddclllllllllllllllllllllljdddddddddddddddddddcllleddddddddallllllllkdddddddddb",
+".dhedmedmd.lllllll.cdddddddhjdddddddddddddiflledddddhlllllllllllllllllllllladdddddddddddddddddddinacdddddddemdenlllllkdddddddddf",
+"mdgmdddm.d.lllllgbaahme.mjaidddddddddddd.g#fnicdddddfllllllllllllllllllllllleddddddddddddddddddddddddddddddddddc#llllk.mmeeecdda",
+".dkkddemdd.lllladddddddddceddddddddddddckedddddddddellllllllllllllllllllllllhddddddddddddddddddddddddddddddddddddllllfkh#ln#fddi",
+"mdc#dddddd.lllncdddddddddddddddddddddddddddddddddddmllllllllllllllllllllllllfddddddddddddddddddddddddddddddddddddcnlljdd.cdkcddm",
+"mddfmdddddellfddddddddddddddddddddddddddddddcee.jik#lllllllllllllllllllllllllaanakj.eccdddddddddddddddddddddddddddcnlmdddddhdddm",
+"bddd.dddddclnddddddddddddddddddddddddddddckgllllllllllllllllllllllllllllllllllllllllllliddddd.dddkcdddddddddddddddddfeddddd.dddi",
+"bddddddddddbcdddddddddddddddddddddddddddd.ihknf#llllllllllllllllllllllllllllll#naij.ecdddddddhddd#cdddegicdddddddddddddddddddddi",
+"bddddddddddddddddddddddddddddddddddddddddddddddddejallllllllllllllllllllllll#cddcdddddddddddcgdddlcdddd.l#adddddddddccdddddddddm",
+"kddddddddddddddddddddddddddddddddddddddddddddddddddcllllllllllllllllllllllllgddddddddddddddd.lcdd#adddddjlhddddddddc#cdddddddddj",
+"bddejddm.de#eddddddddd.dddddddddddddddddddddddddddddfllllllllllllllllllllllladddddddddddddddi#dddkljdddcghddddddddeglcddddkedddn",
+"bddfiddcddelg.dddddddhl.dddddckddddddddddddddddddddeglllllllllllllllllllllll.dddddddebeddddd#fdddckeddeghddddddddcfllcceeejbdddf",
+"bd.mddddddelllmddddddjgl.dddhll.ddddddddddddddhddcffj#lllllllllllllllllllllnddddddddhleddddclbdddddddh#mdddddddddllllcelabbhddel",
+"adkedddddd.lllljddddddci#gflfimcddddddddddddddaaahedd.lllllllllllllllllllllhdddddddddeddddi#lkcce.ibfjcddddddddefllll.djmdddddcl",
+"ndfceabddd.llllljdddddddjllhdddddddddddddddcce#hcdddddnlllllllllllllllllllgcddddddeddddddddcag#gggniddddddddddcfllllljddicdddem#",
+"fdblncnddd.llllllhdddddddigdddddddddddddddddklfddddddbllllllllllllllllllllhddddddjlcdddddddddddddddddddddddddc#llllllmdddedddbll",
+"nmf.ddfcdd.llllllliddddddcedddddjnfbkjcddddddnjdddddillllllllllllllllllllllbdddddhmdmkddddddddddddddddddddddcflllllllmddddddddeg",
+"lnddddm.dd.llllllllhddddddddddddjlllll#mdddd.addddd.llladalllllllllllllgallladdddcdiiddceecddddddddddddddddcnlllllllljdddddddddg",
+"adddbddddd.lllllllllndddddddddddd#llllledddclcddddc#lgcdddhllllllllllaedd.lllhddddcddddiallgedddddddddddddd#llllllllljdcne##jddf",
+"addmfddddd.llllllllllacddddddddddallllmddddk.ddddcglkdddddddjalllla.cdddddeallhdddddddddddmklhdddddddddddcnllllllllllmdchdecdddg",
+"addddddddd.lllllllllllgcdddddddddjlllfdddddedddddbljdddddddddddgll.dddddddddjllmddddddddcjbkjddddddddckccflllllllllllmddmddddddf",
+"bdddddddddmlllllllllllllccjdddddddfllmddddddddddaadddddddddddddnlledddddddddddaldddddjje#.ddddddddddddnllllllllllllllmdce.cdddc#",
+"addbaci.dddmjjhaglllllll#fedddddddhlndddddddddddjddddddddddddddbllcddddddddddddmhddddd.iahcddddmdddddd.llllllllg#llll.ddd.cdddd#",
+"bddfl#aadddddddddmfbgllllfcdddddddeljddddddddddddddddddddddddddhl#dddddddddddddddddddddddjfidddidddddcfllll#nicdclll#cddddddddd#",
+"kddaniiiddddddddddcddd.all#cdddddddl.ddddddddddddccddddddddddddmlndddddddddddddddddddddddddm#.ddddddclllla.dddddddmcdddddddddibl",
+"bddddddddd.niddddddf#fkecjnacddddddhcdddddddddddnfcddddddddddddelhddddcaedddddddddddddddddddea.ddddcfllbedddddk.dddddddddddddfll",
+"hdddddddccmlidddddcnfnnhdddjhddddddddddddddddddde.dddddddddddddd#eddddcf.dcjeddddddddddddddddddddddn#kcdddddddecddc.eddddddedjll",
+".dddddddnhcjd.dddddddddddddddmcdddddddddddddddddddddddddddddddddfddddddddddc#jddddddddddddddddddddnjdddddddddddddd.aaddceddgdd#l",
+"iddddddddddebbdddddck.ddddddd.cdddddddddddddddddddddddddddddddddkdddddddcdddelf.dddddddddddddddddcmddddddddccdddddddddddhnnljdfl",
+"idddiddddd.lkdcdddddflacdddddddddddd.keddddddddddddddmdddebmddddcddddddd.fkfgjeddddddddddddddddddddddccddddd.dddddddddddddcghdfl",
+".dddbhddddddddmcddddddcedddeddddddddhllfcddddddddddddhidddmlhdddddddddcddjlmddddddddddddddmdddddddddd#.ddddcgeejdacddddddddfddll",
+"fijkn#dddddddddd.fdddddddddjcddddddd.lfhcddcmbh.ddddddgedddhleddddddddmfa#.ddddddddddddddnnddddddddddebbdddded.km.dddddddddddill",
+"fiihhidddddddcdddddddddddcigdddddddddjddddddddh#amccddakdddd#hddddddddddkaddddddddddddddclfdddddddddcihhdddddd.ecddde#eddddddall",
+"hdddddddddcgn#nhcddddddddcn.ddddddddddddddddddddc.gl#fggddddakdddddddddddddddddddddddddddflmddddddddcfmddddddddeaccegkddddceddc#",
+"iddddddddd.llllll#njdddddddbmddddddddddddddddddddddemkakdddd..dddddddddddddddddddddddddddck#hcddddddcjfcdddddeiallllfddddmihdedk",
+"idaeddddddjlllllllllg.dddddd.dddddddddddddddcmmcddddddddddddddddddddddddddddddddddddddddddddccdddddddcddddcjflllllllnddcakdddiek",
+"jdhcdddddmllllllllllllgmdddddddddde#edddddddaflledddddddddddddddddddddddddddddddddddddddddddddddddddddddcfllllllllllgdcljdeddbmb",
+"iddddddddnllllllllllllllb.dddddddddjgdddddddddckidddddddddddddddddddddddddddddddieddddddddddijijddddddch#lllllllllll#ddbndicda.b",
+"hdddcidddcnlllllllllllllllidddddddddadddddddddddddddddddddddddddddddddddddddcdddddddddddddddiddcddddd.glllllllllllll#cddg.e.da.b",
+"idddn.ddddelllllllllllllllladddfnaf#.dddddddddddddddddddddddddddddddddddddnlleddddddddddddddddddddddalllllllllllllll#cddhbdddnek",
+"kdcffddddd.llllllllllllllllln.cm.ijcddddddkidddddddccddd.kdddddebhcdddddcbhmcddddddddddddddddddddd.glllllllllllllllllcddmfdddaca",
+"hdal.ddced.lllllllllllllllllllcddddddddddd.l.dddddjaeddelkdddddnllidddddddddddecddddddddeeeddddddelllllllllllllllllllcddcbddekcb",
+"hddcdddddd.lllllllllllllllllllgcdddddddddddaliddcnaddddnlhdddddkllmdddddddddddkcddddddchedddddddklllllllllllllllllll#cddd.ddcldf",
+"iddddddddd.llllllllllllllllllllbdddddddemddjllkdnfcddddblbddddddmmddddddddddddhmddmddekicdddddcalllllllllllllllllllllcdddddddjd#",
+"bdddd.c.ddilllllllllllllllllllllcdddddcbgddclll#l.ddddddk#cddddddddddddddddddd.ndigdd.gl#cdddelllllllllllllllllllllllcdddddddddg",
+"g.dd.fdhdd.lllllllllllllllllllllfdddmkaddjednllladdddddddcdddddddddddddddddddddillmddddcgkdddc#lllllllllllllllllllllledddddddddf",
+"liddhnh#miallllllllllllllllllllll.ddi#hdck.dcllllkdddddddddddddddddddddddddddddallhddddd.bdddellllllllllllllllllllllledddddciddg",
+"gdddhjmecekllllllllllllllllllllllndddjlhddddilllllkdddddddddddddddddddddddddddkllgmdddddmidddhllllllllllllllllllllllleddddcddddf",
+"ldddidddddcllllllllllllllllllllllljdkhdfbddddilllllfddddddddddddddddddddddddcgllleddddddcddde#lllllllllllllllllllllllcddddcbcddf",
+"lcdd.dddddcllllllllllllllllllllllladcgn..ddddcllllllndddddd.ddddddddddddddddblllgddddddddddc#llllllllllllllllllllllllcdchfdeacdf",
+"ldddddddcdclllllllllllllllllllllllgdd.#hddddddnllllllfcdddd#eddddddddddddddblllladddddddddd.llllllllllllllllllllllll#ccgidcddddn",
+"gddddddddddllllllllllllllllllllllll.ddddddddddjlllllll#edde#dddddddddddddcfllllljddddddddjhgllllllllllllllllllllllllgddbeddddddn",
+"#ddddmcdddcllllllllllllllllllllllllfddcia.dddd.llllllll#ccnmddddddddddddcallllllcddddddddcnlllllllllllllllllllllllllfdddidddddda",
+"gdddddddddclllllllllllllllllllllllllcdelmddeddclllllllllgffdddddddddddddalllllllddddddddddmlllllllllllllllllllllllllnddddddddddb",
+"lcdddeihddcllllllllllllllllllllllllleddfdddddddglllllllllfcdddddddddeddnlllllllgddddddddddalllllllllllllllllllllllllnddddddcddda",
+"ledkkhceddclllllllllllllllllllllllll.ddgcedddddhlllllllllladddddddddifbllllllllgddddcdddddflllllllllllllllllllllllllnddddddacddn",
+"#mdcddddddcllllllllllllllllllllllllljddfjgc.dddhllllllllllladdddddddd#lllllllllfcecnfedddd#lllllllllllllllllllllllllnddddddimddf",
+"nddejddddddlllllllllllllllllllllllllhddk#hdfdddhllllllllllllnddddddc#llllllllllk.jdddddddcllllllllllllllllllllllllllfdddddddddda",
+"ndddddddddcllllllllllllllllllllllllladdddddcdddjllllllllllllladdddcalllllllllll.mhdddddddmlllllllllllllllllllllllllladdddddddddb",
+"ndddddddddclllll######llllllllllllllbddddddddddcllllllllllllllbdddallllllllllllc.bdddddddilllllllllllllllllllllllllliddddddddddg",
+"gji.dddddecdcccddddddddddaf.cdccdceecdddddddddcdcecc.fembhjllkheddhkan#l#g#g##gd.addddddde#ll#glgggfbbbkhkiikkhkkhijcddddddddddf",
+"ll#jdddddafdddddddddddcddcdddddddddddddddddddd.ddddddddddddimdddddddddifcdddddddddddddddddccdddddddddddddddddddddddddmiddddd.g#l",
+"lledddddddidddcdddddddddddddenjmddddddddddddddmdddddddddddddddddddddddddddicddddddddddddddddddddddddddcddcdddddddddddacddddddhll",
+"lhdddddddddddddddddddddddddmhcdcfdddddddddddddddddddddddajddddagdddddamddd#cdddddjjdddddcdddddddddd.bngddddjbnfkjddddcddddddddal",
+"l.dddddddddddddddddddddddddcddddgdddddddddddddddddddddddjedddibedddcdbeddc#dddddcmdddddhlcdddjddddddcendddddddchhnidddddddddddjl",
+"lddddddddddddddcdddjdddddddddddmmdddmmdddddddddddc.ddddddddddcdddddadddddclcddddmcdddddfkedcdcddddddifgdddddeddbcladdddddddddd.l",
+"l.dddddddddddddbmddcdddddddddc.cdddddddddddddddddcaddddddddddddddd.fddddddajcnddjcddddgjeejgdnhdddddddndddddcdbmhlhddddddddddd.l",
+"lkddddddddcddddbidddddcaddddjcdddddncdddddddddddddnicdddddddddddddenfnadddcanedddccd.kide.c.ddddddddddkddddddc#cjmddddddddddddml",
+"l#cddddddcfddddhnhbfcdefddddhddemdel.dddddddddddddddddddfkbbkdddddddddbddddcidddddekhedd.jddeabcddddddjedddddcl.ecdddeddddddddal",
+"lllhddddm##ddddc..ecdddddddddddddddbaddmdddddjddddddddddcccccddddddddccdddddddddddddddddmidddccdddddbkddddddddmbjddddnbddddddill",
+"llll#nngllgdceeecdddddddiecddcdddcddddddddddhjddddcddddddcddddddchdcccccdcddcccdc......ekiecccceee.bllkj...........j.flfhm.mnlll",
+"lllllllllllglllll##gnl#llllll#g###ff#gn##lllll##gg##ggggg#l####llll#llllglllllllllllllllllllllllllllllllllllllllllllllllllllllll",
+"lllfieehllfhihijmjmimjjmknjjmjjjjjmiimm.mjf.mmmm.jmmemmhbkbnlggggfnanff#l#bannllfflnbbmjmhiijjiihhhi..e.eecccccee....#lgieeehlll",
+"llhdddddcnjdddddddddddddddddddddddddddddjgaddddddddddddddddd.cdddddddddc.dddddbadkaddddddddddddddddde.cmddddddddddccd#nddddddm#l",
+"lhdddddddddddddddddddddddddddddddddddddhagbddddddddddddddddddddddddddddddddddddddddddddddddd.edddddd.ie#cdddddddd.#ndbddddddddil",
+"bddddddddddddddddddddkmdddddecdddm.ddddcdgjdddddddddddddddddddddddiddddddddddcdddddddibcdddchiddchaamddjcddddeedchh#ddddddddddel",
+"mddddddddddddddj.ddcknghmdddcddddemddddddg.cedddmddddd.jdddddddcddjddcddddchaancddddjlgeddcb#iddnncceddcdddcdddc.dc#cdddddddddd#",
+".ddddddddddddddddddecdeggdddddddddddddddd#.ddddd.bihjjkdcfeddd.eddidd.dddc#mddjmdddedbdckidcghdhlheddddddddkedd.cddfcdddddddddcg",
+"jdddddddddddddddddddddddjddicddddhmdkidddedddddddcefhcddddddddd.edceddddhncdddddd.dddddc.ddegmdgmm#hdddddcddddg.dddcddddddddddc#",
+"bdddddddddddmeddddddddddddceddddcdddfhddddde.ddddddacdddkkkddehjedjjdddd.edddddddddddcjcdddeecdfmdenddd.ecddddbcddddd.ddddddddhl",
+"#cdddddddcmdeddd.mddddddddddddddjnedfhdddddilhdddddbdddcbheddedddddddddddddb.ccccdddcbl.ddddjedejddedddecdddcddddddddfhddddddell",
+"lbdddddddgjddddddddenedddddddcdddeedfhdddddd.eddddcadddddddddddddddddddddddeeccccdddc#feddddddddddcddddddddddddddddddnliddddb##l",
+"jmdddddddecdddddddmhicddddddjnmjiimd#aee....mm.cddekddddejcdddddd.cddddddddddddcccccceddddddcccddcccdddddddccddddddddcm.dddcmeml",
+"ddddddddddddddddddddddddddddflllll#dlllllllllllm.ddaddddnl#ddddddicddddddddddddnlll###ffffmh##g#f#ladddddd.ll.dddddddddd.hfgl.el",
+"ddddddddddddddddddddddddddddgllllllclllllllllllj.ddcddddd..dddddddddddddddddde.lllllllllllhalllllllfdddddddhlemedddddddebflllcel",
+"dddddddddddddd..cddddddddddc#lllllld#llllllllllnedddddddddcddddddddddmhkcddddd.llllllllllliflllllllgdd.gfmddacddddddddddddcmjdel",
+"ddddddddddddddddddddddddddd.llllll#d#llllllllll#kkddddd.hbfddddddddddn#cdddddejlllllllllllmflllllllledcjcddddddcdddddddddddibe.l",
+"dddddddddddddddddddddddddddhllnnffndngggglllllll.edddddcllgdddddddddhgcdddddddnlllllllllllmlllllllllhddddddcddcjddddddd.bddili.l",
+"ddddjddccddddddc.i.ddddddddnlnddd.eddddddkllljglhmddddddm.gedddddcd.lmejicddcc#lmmmmjiiijicijijijhllfddddm.eeddddddddddhnddmlm.l",
+"dddeedddddddcmjieccdddddddd#l.dddecddddddhllleil#cidddddddddddddccdalnl#.dddcallncdddnefj#.#cfcgcdnllcddd#nklcdmcdddcdda.ddel.ml",
+"dddddddddddddjcdd.cddcjdddkl#ddi#######ikhllleellbecddddddddddddiddhnh.dddd.mllllfe...bkbkbbabbkmemllidddh.dkfdmcijddddddcdd#mel",
+"dddddddddddddddddkcddh.ddcllndcglllllllhehllledallckcddddddddddmbdddddddddccall#llg.he#lllllllllnmefll.ddccdc#mddfiddddde#eda.el",
+"ddddddjncddddddddh.ddadddkll.jmllll#bllhjillledd#lgcmddddddddddkjdddddddddehllbdfllgd.e#lllllllllenhllnddcddd.lkd#addddn.gedmcel",
+"dddddddmddddddddddadddddillhedfllll#illhchlll.mkjllneccdddddddddccinddddekhllfcdcnllnec.nllllllllgmcbllbddddddebf#bddecg.acdddel",
+"ddddemdddddddddddcn.ddde#l#ecmlllllle#lichllledd.hllacbdcdddmcimec.cdddkccll#cmcg.nllgcac#lllllgll.a.#llmddddd.ddcdddkjcefcdddel",
+"ddddc.mdddddddddddddddcllldcclllllll.hlidhlllmj#ecklllececddcdddcddddim.befl.c.#dmm#l#dd.e#lllgd#llcdmllljddddcddddddjleddd.dd.l",
+"ddddcdddddddddddddddd.#lliddhllllllljclhchllleelnmeilllbdjem.dcdmdcchchglgdcmm#l#mhckef#memahijdhlmjcgllllacdddddddddelcdddjcdml",
+"mcddmedceddddddddddcillllnc..#lllllladbhchlllmjllnmejglambmmmcaebd..hglllndde#lllg.fehll#ebcgllhcjk.gl#k#llfedddddddddhdd..ee.hl",
+"liddicdekcddddddddeglll#ll#.cc#lllllled..hllleclllgmiejcllll#fhan#lllll#mmdmlllllllcejglllejeflledcfllmdcflljjmcddddddddjl#####l",
+".cdd.m.cdddddddehhhllbedfllfeceglllllndd.hlllimllll#j.i.if#lllllllll#bmjc.allllllll#jhenll#me.fmdde#le.dikjnjll#nkim.eddh.ddddel",
+"#kddchh.ddcikagllleamcdd.fllfcb.#llllledchllle.llllllnjea.jibnllllkmcddjjfllllllllllg.nefll#mkdeenc.jcea..eeh#lllllllicfcdddddcl",
+"cdddddddddmlllll#kcd.decad#lllckc#llll#dj.llljjllllllllf..jkjdjlllcdddddmjjjhmijhiijmmdddlllledc#l#cdcfllhdmjmjflllllfdgndddddc#",
+"ccdddddddd.lllnee.jecal#.icgllgmejflllljcdm#l..lnigllllll#fbedilllcdjckdajikdkciej..jencdcnll#j#llmiddka.igk.enec#lll#ccfndddddg",
+"fgfcdddddd.llljdcm.kllllgj.jfllfehe#llliddd.nm.llaeiglllllllkmelllhmjjjiijjjiicmiiiiijihkknllllllhcmnkcdhlll#bjcd#lllnddeghib.c#",
+"lncdddddddmlllmcmlllllllll.md#lljdad#lliddddd.illlljdkllllllkdilllllllllllllllj#lllllllllllllllljijfll#hglllllli.glllcdncdfhhlcg",
+"mdddddd.ddjlllmjhllllllllllmkdamhg.jjglicimdddcnllllhdm#llllkimlllbkbkhabbkbkbehbkkbbkbkkbknllljmcfllllllllllllimgllledbaddddhjg",
+"cddddddcddjlllmdillllllllll#mie.ll#...#idblidmjdjng##.d.#gnhe.mlllcdejbchcaeh.hiejcjehdiddcnlljejnlllllllllllllj.glll.ddcddddijg",
+"cdddddddddekafe.hllllllllllll.c.glllmkdedklladddddddeeddd.jmdk.lllcddccc.djccdced.dmdeddddglljbefllllllllllllllhfglll.dddddde#cg",
+"d.dddddddd.abkceillllllllllllljjcnllgeacdklllmeddddddchcdgllhcmlll.jg#gggg#g##gg###ggg..cgllmkeglllllllllllllllmcejjjddddehbkcdf",
+"chmdddddddjlllm.hlllllllllllll#jh.all#eddbllleenmcdd.#lkcjllhi.llleclllllllllllllllllh.inllhcmnllllllllllllllllj.agfnedmhhcddddf",
+"ckgdddddccmlll.cklllllllllllllll.dcgllledalllhmlllfalll#ddalkdmlllmmllllllllllllllllindfllmdeflllllllllllllllllmd#lllemllljkhddf",
+"cm.dddddddjlll.mi########lllll#ll.cdall#eklll.mlllllllllide#kcc.m.celllllllllllllllicefllmkcfllllllllllllllllllim#lllefaeedb.ddg",
+"cddecdddddjlll.dce...mcjemm.mcme.ccdcall##llljjllllllllllf#lkdeg##.jllllllllllllllkcekllh..alllllllllllllllllllmcllllmlcdddnddd#",
+"cddcdddcddkllled.mjj.hdjdhiehdkekejdddfllllllijlllllllllllllh..lllemlllllllllllllhke.elm.mflllllllll#hlllllllll.d#lll.#cdddbddcl",
+"cenddddddchlllgfffffnnffffffnfcnnnnnfn#lllllle.llllllllll#ahedmll#e.fllllllllllljieflkcj.flllllllllnc.lllllllllmdllllejidddbddcl",
+"d.adcdddddjlllllllllllllllllll.llllllllllllllccgllllll#ajceedd.lllcdemb#lllllllkehnllbeealllllllllbeidgllllllll.d#lllednmddfedcl",
+"dcgcm#cdddjlllllllllllllllllll.#lllllllllllllceegllllhdeabecdeillgcdgmidhlllllijmnllheaallllllllf.j#lchllllllnedd#lll.ddmddifdcl",
+"ddenm.feddillllfffanannnffffffcnfgfgfggg#fgllfek.flbejikehng#lllll#fbmciccbllik.flliienlllllabhjkglllke#lllb.bddd#llledddcdklccl",
+"deddddeiddjllllkedddddcd.c.c.ee.d.cj.ece.dcbllg..mim.n.eblllllllllllllhecbdjkm.blla.ebllllllbnglllllll.il#ji.hingllllecmcdddkicl",
+"ddddedjjddellllll#.ddd.dkeb.jmibdaek.kiibdddalll..dmcnlgd#lfahijibgllgcl#m.hdjnllhchbllllllllllllllllladhmbcillll#khjde#lfkbgccl",
+"ddddcdjeddcee.ialllfemedknnnnnnnnnnnnnnnafme.bllg.diglllc.eddddddddcmejlllbccfllhj.nllllllllllllllllllledcmfllghjmhmaecgemj.cdc#",
+"dddd.jkcddcmcmddckglljmcm#lllllllllllllllllijebllghlll#iddddddddddddddeflllakllbjeklllllllllllllllllllncdc#l#kci.eddecdaedddmmcl",
+"ddddddddddddddddccdbllhmcelllllllllnglllllll.ackllllladdddddddddddddddddmlllllidjalllllllllllllllllllfmgddkfcfcdddde#edddck#ljcl",
+"dddccdddddddddddddecm#licjmllllln..a#llllllll.ddblllkdddddddddddddddddddde#ll#cdclllllllllllllllllllljimncdijcdddddil.d.a#niedcl",
+"dddddddddddddddddddddeglmedflllnde#lllllllll#cde#llkdddddddddddddddddddddde#llkccallllllllllllllllllkjjlljdccddddddbl.e#lg.dddcl",
+"ddddddddddddddmjdddddd.l#en.lllmdbllllllllll.cclllbdddddddddddddddddddddddd.llljl.lllllllllllg.llllnjeflacddddddcddal.dd.bl#edcl",
+"ddddddddddddddmidddddcdjlncdbl#cdmlllllllllgceillfddddddddddddddddddddddddddillg.chllla#llllln.llllijhllebdddddjdddnlj.ihdm##ccl",
+"dddddddddddddd..dcddddddflciefjdddig#aallllhcc#lljdddddddddddddddddddddddddddlllebelll.llllllnelllgjk#laidddddmbddcf#ggffmdgfdcl",
+"cddddddddddddd..ddddddddmlmddcfgeddd.allll#cghlladdddddddddddddddddddddddddddmllgcdgll.llllllbclllie.l#dkdddddfjddddddddddmbddcl",
+"ddddddddddddddciddddddddd.ddmmlllgg#llllllaccjgl.dddddddddddddddddddddddddddddfghefhllmllllllk.lllejnlaacddddd#mdijddddddddddddn",
+"dddddddddddddddbk.ddddddddajedllllllllllllj.cmemddddddddddddddddddddddddddddddc.hjmclljllllllk.ll#eelljnddddddf#afaijjjmm.mihddb",
+"cddddddddddddddddccdddddcelnddgllllllllllledjlljddddddddddddddddddddddddddddddjllb.mflm#lllllijlla#hl#hidddddddc.hbbnkki#fb#nddb",
+"cdddddddddddddddddddddddddg#eenllllllllllledbllmddddddddddddddddddddddddddddddellgecnl.gllllljjllhehlfecdddckmddcjmmedddbedfiddn",
+"cddddddddmkdddddddddddddceale.blllllllllllccflleddddddddddddddddddddddddddddddd#l#ckbljfllllljilljbblkhdddddj#aedgllgcddmcdamdcl",
+"cddddddddcedddmdddddddddddhl.hhllllllllllgce#l#ddddddddddddddddddddddddddddddddfl#cjcjd.hkhhhcehhcdnlidddddddel#edil#cdddddmcddf",
+"cdddddddddddddcdddddddddccbljdcj.m.jeieiemddll#ddddddddddddddddddddddddddddddddflledmhddcmha.ccbcddnljhdddddddjmcdd.nddddddddddf",
+"eddddddddddddddddcmdddddccblmc.i.jeheichcjcell#ddddddddddddddddddddddddddddddddfllmce.edce.medc.ee.#ljeddddcdddddddddddddddcdddf",
+"edddddddddddddddddhiddddemfllllllllllllllllllllcddddddddddddddddddddddddddddddc#lllllll.#llllcallllllkkdddddddeeddddcdddddhhdddg",
+"edjedddmdddddddddddimdddddfllllllllllllllllllllmddddddddddddddddddddddddddddddclllllllljhlllgcbllllllf.cddddmknfddddddcddd.gddd#",
+"ecfeddddddddddddcdddddddcc#l##########llllllllliddddddddddddddddddddddddddddddmllllllllhelllfdalllllllhhddddddcgbdddddccejaljdd#",
+"eddcddddddddddde#gcdddddd.laddddddddddddccccellfcdddddddddddddddddddddddddddddbllgjiihied.mmede.jjiklljedddddddilcdddddl#nhmcdd#",
+"e.dddddddddddddd.fcddddd.hljddbcnckckmjeeidddglledddddddddddddddddddddddddddddgllmddidacddieddcbckddnlamddddddd.lc.gkddabdde.dd#",
+"eicdehadddddddddccddddddcgled.mmjcmjjjmmjmmdealliddddddddddddddddddddddddddddcll#ee.mmjm.dejcdcmjmed.l#ciddddddcl..l#cddbedaljcl",
+"eieaadidddddddddddddddc.hlnhjllllillllllllljn.bmccdddddddddddddddddddddddddddm.fh.mlllll#dklidalllgddllfcdddddemlmilgcdddcd.lmc#",
+"ejgmd.jdddddddddddddddcdglccmlll#klllllllllnd.ck#bdddddddddddddddddddddddddd.lnmdk.llllllecnjdalllljaillmiddddmglenlgcddddddfjc#",
+"kkddddcdddddddddddddddcblb.enlllablllllllll#dk.llleddddddddddddddddddddddddcgllahbnllllllbdccdallllaecfl#e.dddd.ncflnddddddd.id#",
+"mdddcdddddddddddddddddjlfccillll.nlllllllllladjbllledddddddddddddddddddddddfllgdcillllllll.dddbllllligmllgckcdddddccdddffgfnajd#",
+".dddkddddddddddddddcddalei.#llllcflllllllllll.kcgllgedddddddddddddddddddddnlllmemflllllllladddhlllll#cjjllgjm.ddddddddca.....cc#",
+"mdddddddddddddddcdedibc.cdfllll#dglllllllllllfdd.lllgeddddddddddddddddddcalllkddillllllllll.ddhllllllamekll#.eaccdddddbgedhdbcd#",
+"jdd.edddddddddccicdfl#cdcalllll#dffhbf#llllllnddhlllllkdddddddddddddddddnlllllmcdblllllllll#ddilllllllac..lbmnc.bdicedcedddcjdc#",
+".ddfgcmmdddmemcemn#lfemdallllll#df#nbmcejallaeh.#la#lllgjcdddddddddddmagm#lb#lli..blllllllllmdmllllllllachec#l#nh.mcjddcddddddd#",
+".dd#lfifddc..jkgll#kcecnlllllll#cblllndjed.kdd.llgd.fllll#ideccccc.iflllh.edmllle.dfllllllll#eelllllllllacich#llll#fhdddddddddcg",
+".dde.ikkcd.lllllfmc.cj#lllllllllj.lll.d#lidddjllnddc.m#lllbhlll#lllllllljceddelllikebllllllllnelllllllllllid#cek#lllfddddddddmgl",
+"mdddddddddjlllheemcjalllllllllllfdhlhdkllacdd.gfccmm.kjif#mgllllllllllliddekc.i#llhcjhllllllllillllllllllllnidhdclllfdddddccd#ll",
+"mdddddddccillledd.bllllllllllllll.dicellnecmcdcdc.l#hjj.cecn#####gfhjllidellg...lll.hcallllllllllllllllllllllf.dc#llgdceddmadkll",
+"mdddddddnhmllledbllllllllllllllll#.ddflacbklgcddjlllllaednjkecedc.mdcllijmlll#eac#llcickllllllllllllllllllllll#.clllgddgcddnmc#l",
+"mdddddddhijllledblllllllllllllllll#hblncdillfcddfllllll#nh.me.mejcmdc#li.jllllf.kjf.hhcmhlllllllllllllllllllll#.clllgcdakialadgl",
+".dddddddbmjlllecbllllllllllllllllllllfcdmllgcccdillllllllll#gnbbbfkecllj.mlllllfjecklleadnllllllllllllllllllll#cclll#dddccefadgl",
+"mdddddcdddde..ddejiikhhikhabbaaannaaidmillfdcjgddfllllfbllllllllllamclljcmllllll#mfc#lliech##l###llll#lll#llllf.clllgdddddjl.cll",
+"mdddcddddd.fnfededmjcmeickdbeici.emdddm#lge.m#lidjlll.cnllllllllllaeclljijlllllllg.jmglljddc.iehejejimick.mejidddlll#edddenjdall",
+"nmcjkdddddjllljmee...m.ceme.e.eeececc.llgcd.lllgcc#amdilllllllllllaicllicmllllllllgmme#lljddknegj#cbgmbdfmbkjbmddllllg.ddddddfll",
+".dddddddddmllllllllllllmnllllllllllllllfc.illllleddcednlllllllllllaeelljhmllllllllll.bcgll#g#f#ffbfbagfnficanbabbllllgidddddddjl",
+"edddddddddmllllllllllll.nlllllllllllll#cj.#llllncjn#lgllllllllllllb.c##jejllllllllll#...flllllllllllllllln.lllllllllgcddb##gcncl",
+".dddddddddilllieeeee...dem.....mjjbllfcd.lllllndflllllllllllllllllbedeedimlllllllllll#edclllnkbabanaangggbcgfffgglllbdcbfehhd#e#",
+"jdicdddddfllll.dmdbenei..bdidicddjlllbdmlllll#c#llllllllllllllllllbcellmjjllllllllllllledflllhdddkda.nmmheadmdmdd#llhdkndecdd#.l",
+"idcddddcflllll.dmkbkhkkkkkkkhdcdjllllbejlllllf.lllllllllllllllllllbjellj.jlllllllllllllmdfllllkdceejmj..i.h.meedd#llfddg.cjdcl.l",
+"idddddddcflllleealllllllllllnddmlllllbjjllllllkhllllllllllllllllllbcellmjjlllllllllllllmjglllllijchllllllllllln.c#llnddiadaddl.l",
+"iddd.iddddjllledhllllllllllhdchllfc#lbfilllllllehlllllllllllllllllbjellmcilllllllllllll.d#l#dfllhdeillllllllllgdcllladddbcmmd#cl",
+"idddjbddddmllleddcja#lllllbcdhllfcc#lbeilllllll#chllllllllllllllllkc.ll.hjlllllllllllll.jglgdcfllbcdilllllllgbeddlllnddd.cdkcgel",
+"jdccc.cdddmlllai.dddcalllaec.llfddc#lbhhllllllllacnlllllllfbm..e.eccellmccmjjjjjjjjijjjdd#l#dce#ll.cdkllll#idcee.lllnddddcdh.#e#",
+"iddchjdkddmlllllllccddcaidei.nadcdd#lbcilllllllllkdalllk.ckci..hchddd#l.dcndndnijkcfd.ncd#lfmcdcg#dic.illjedeh#lllllbdddddd.l#el",
+"idegiddiddcjjiaglah#bcedddjlgdcime.#lbhhlllllllll#cchkehe.mikaannbimillijjiiijiii.dijjmjjllfemjhc.albc.jjehb.#lllll#mddcdddcgl.#",
+"hdeeddddddddddddedfllg.ddmllgdd.lec#lbcillllllllllfcdc..jfllllllllllllllllllllllln.llllllllfcile..#llijdjj#lhelfh.cdddddddddhle#",
+"iddddddddddddddddddhlllbillbdjjllmhglbkhllllllllllbddd.#lllfkj..mia#llll#kbkbhbab.ebnaanallaiillmdcfllkcglllgcddddddddjcddddc#c#",
+"idddeddhcdddddddddddmgllllhd.mlll.c#lacillllllllla.icddhfjmded.emccemb#l#hddd.hckeie.eddd#lndill#jdcfll#lllkcdddddddddcdddd.ijc#",
+"hddcneckieddddddcddddcnllgddellllmiglabhllllllllk.cigdddddmddddddddemc.fllacdcjckebem.dddllnmillllcdd#lll#mddddddddddddddceemdc#",
+"iddcedddddddecdc#fdddddbllkdc#llled.kmchlllllllaecallmddddddddddddddddc.mllgcdelll####g.ellndillllnddgllgcddddddddddddc.kdnmddcl",
+"mddccddddddddddnambdddddnll.cellleckkmahllllllgcjillkjeddddddddm.dddddd.d.#lfdcjlllllll.c#lajilllledkllgcdmngfakiddddddi#.cecdc#",
+"mdddddedddddddc#.daiddddc#lncealled#ladhlllllljgmllhcmddddddddjl#ddddddddcc#lhdd#lllllljj#lbdilllnmjll#cddblidddcdddddj#.mcddddf",
+"mdddjncddddddeljdddfdddddml#.dellecglbnhlllllaedglachdddddddddegkdddddddddi.lledellllllec.mekhll#edfllmdddd.gidkbdddddc#.ddddddk",
+"iddmkcddddddcajddddbidddddjmiccbled#lbchlllll.hil#dmddek.ddcddddddddddddddde.ejddblllllmmllndillkjjllbddddddefabdddddddjfcdddddk",
+"jdddddd.idddindddddi#dddddd#lmd.led#lbfhllllfkjllhedddgl.mgfcddddddddddddddednljdmlllllecllnhkll.d#llcdddddddd#iddddddddafdddddb",
+"mddddda#iddddcdddddmlcddddd#lfddedc#lbcc.mm.ceilgebddblekgjdddddddddjeddddddmjlgdciikimccllac.kicellfdddddddddcgdddddddddcdhdddn",
+"idhhkbjjmdddddddddd.l.dedddnllcdmcd#lbdekchdddnlh.ddcliekcddddddkcdddc.ddddd.d#lddejebddclladdjddmlljdddebdddddmidddddddd.bfdddg",
+"#cnacddidddddddddddel.dacddhllnkhkbllgihhdmkkh#l.kddelcdddddddddkeddddddddddd.al.ceic.cdclladdecdalgdd.jaeddm.ddedddddddjllgcddg",
+".dbgdddddddddddddddcicdbeddellllllllllllleflllllmiddmmdddddddddddddddddddddddcilllllikllllll#gc#llladdil#ghdjkdddddd.ddcemlbk.mf",
+".ddcdddddddddekedddddddecdddgllllllllllllefllllgceddcdddddemeddddddddceeddddde.llllliklllllll#cllllhddijjjiddddddddddddddefdddda",
+"edddcdddddddddddddddddddddddbllllll#lllllcfllllnccdddddddjll.ddddddddnlleddddcellllljklllllll#clllljddddddddddddddddddddddiddddi",
+"bmeddddddiiddddddddddddddddddccccdddhaannda##gge.dddddddddmndddddddddflleddddddk#gfn..anf##l#gcg##lmdddddddddddddddddddddddddddh",
+"ll#cdddddb#ddddddddddddddddddddddddddddddddcddeddddddddddddddddddddddk#fcddddddddddddddddcccccddcccdddddddddddddddddcbidddddhffl",
+"ll.dddddddjddddddddddddddddd.heddddddddcccddddccdddddddddddddddddddddddddceddddckddddddddddddddddddddc.ddddddcc.jdddmgedddddd#ll",
+"lnddddddddddddddddddddeddddd.mjg.ddddddddcddddcdddddddddhhdddddacddddddddhnddddfcddddddafddcdddddddiflgddddcdcddccddeedddddddjll",
+"liddddddddddddddddddddmcdddddddi#cdddddd.cddddcfakkddddd#iddddhjdddddddddbndddmnddddddel#ddjcdddddcmm.addddcemeiadddddddddddddgl",
+"lmddddddddddddddddd.dddddddddddiaddddmdjlndeddddd.gdddddedddddddddmacddddhndcdebddddddkllddddddddddcebaddddddddkcdddddddddddddfl",
+"lidddddddddddddddddddddddddddddcddddd.dca.dddddddel.cdddddddddddddejce.mdelehmd.dddddc#.ldddddddddd.mhadddddddfnddddddddddddddfl",
+"lndddddddddddddddddddddcddddddddddddddcdddcmdddddel#jddddddddddddddmhhbfddffa#cdcccc.bemlcddddddmiddddfddddcdclndddddddddddddc#l",
+"llhdddddddbcddddddcmjdc.dddddddddddccdddddcedddddencdd.iiab#hddddddccc#iddcglneddcmhmddjlcddddednhddddbcddddd.llbdddi.dddddddbll",
+"lllkdddde##ddddddd..cddddddddddddddccddddddddkjddcddddccdcejmdddddelchlcddd.cddddddddddjlcddckmdddd.gmdcddddddccddddkgcdddddelll",
+"llll#nbflll.ddddddddddcddddddddddddddddddddd.l.dcdddccddddddddddcnccdccdddddddcdddddccdkleddddcddd.#lg.eeeeee.eccdcdal#im.jb#lll",
+"lllllllllll#kbbihjkng#ll#nnaabijbbbnhi...jha#llg##gf#l##fffnkhhkflakababbbnfgf#ngffg#l##lganf##ffnllllllllllllllllllllllllllllll",
+"llllgnglllk.ee.......mjjhikiceceecccccee....ee.....mjijm.e.e.e.eecceeee..m.mmmm.alllllllge.meeeeeee.e..mjj.m..eeche.eallllllllll",
+"ll#jdddmfljdddddddcccdddddc.dddddddddddddddddddddddddddddddddddddddddddddddddddd.#nhiia#jddcbaababbahddddddddddddhdddhlfjcccilll",
+"ll.ddddddgicacdma#l#mdddddcmdddddddddddddddddmhdddddddddddddddddddddddddddcnedddddddddddddddddddddh.dddddddddddddcdddh#dddddde#l",
+"lkdddddddcccled#nmcddddddddiddddcddccddddddddd.bdd..ddcjeddddddddddddfcdcajl.dddddchnamddddddddcddddddiddhdddddddddddccdddddddml",
+"leddddddddddnddcdddddkdddddaagcdbedddddddddddddicddkd.ahkdc#jcdddddddacdccdgeddddcnanijcdddddddddddddddcnjcdddddddddddddddddddcl",
+"fdddddddddddddddddd..ddddddddddk#cdddddddddddddc.ddhkl.dddclkidddddddbcddddfddddddddhjdddddddddddddddddeee#ddmddddcdddddddddddd#",
+"gddddddddddddddkaddddcddddddddhacdigeddkedecdddccddcgkddddcgdddddddddkdddddbddddddddaedddddede.dddddddddj#jdi.dddnjdddddddddddcl",
+"l.ddddddddcdddd.bmddddddddddddidddflhddaabiddddddddd.cddddcfdd.hkiedddddddcgbmdddddi#.ddddddcicdddddddddmjbjidddcg.dddddddddddml",
+"ladddddddiadddddddddddddddddddddddjljddekdddddddddddddddddefddeeddddddddddddddddddhmceddddddddddddddddddddbkddddddddd.cdddddddfl",
+"llnddddd.lbdddddddddddddhdddddddjddddddddddddddddddddddmddebdddddddddddddddddddddddddddddddddddddddddddddddddddddddddh#cdddddfll",
+"bkacddddikmddddddddddddcfdddjkbalabkkbdiijijmm.cdddddddcdd.iddddddddddddddddddddddddddddjcccdcccccnmddddddddddddddddd.kcdddd.aal",
+"edddddddddddddddddddddddddddgllllllllld#llllllljicddddddddhjddddddddddddddddddchbkhimmcj#ll#ellllllkddddddddddddddddddddddddddda",
+"eddbkddddddddddddddccedddddd#lllllllllc#lllllllb.dddddddddfjddddddddddddddddddmllllllllllll#.lllllladddddddddddddddddddddddddddb",
+".djndddddddddejdee.jmfjddddelllllllllld#lllllllg..ddddddek#mdddddde.ddddddddddkllllllllllllgmllllllfddddcdddeddccdddddddddddddda",
+"mddfidddddddd.dddddddijddddilllllllllld#llllllll.eddddddddn.dddddcgcddddddddddnllllllllllll#jllllll#ddddgcddgekllndddddddddddddf",
+"jdddifcddddddddddddddndd.ddbllecccmemecemem.ejllj.dddddcngledddddhkmafnfcddddd#laiinllmjijjmchkhhblliddclcddklfmecdddddeg.dddddl",
+"jddddegiddddddddddddnjddhddgl#ddhckcbciek.bdddnlnccddddddeiddcadd.gh..ekdddddilldddhl#ddijeiimc.dd#lfddc#id.gbddddddddd.aahddddl",
+"idddddm.dddddddddddhaddccdellik.fnfnaaaakkih.djlli.ddddddddddjhddd.dddcddddddllgdddbllcdemdceeceddbllcdd#gclhdddijdddddddddddddl",
+"iddddddddddddddddbb.ddddddgllceblllllllllllled.llfe.ddddddddd.ddddddddddddddillhickalldcnggggggfjcclliddklljddddeeddddddddddddcl",
+"hdde.dddddddddddclcddddddjlln..#llllllllll#jcm#llljccdddddddddddddddddddddd.llfce.bbllchglllllllgecblledc#fdddddddddddddddddddcl",
+"hddigdddddddddddclcdddddc#ll.dhlllllllllll.c.llnnlljcedddddddddcjddddddddddgllmakm.alldd#llllllllifmllnddecdde.dddddddddddkmddel",
+"hdddbcddddddddddel#n.dddfllhe.glllll#lll#ejmllfcc#llhcddddddddddeddddddddc#llhc.ljgbl#.hgllllllll#cmjlladddddd#fjdddddddddddddel",
+"idddemdddddddcddchedddcallledmlllfkjnll#mc.#lfeddmlllh.ddddddddddddddddd.gllnejnlm.nl#c.lllllggllliddfllidddddghdddddddddddddd.l",
+"mddddddddddddkhdddddddnlllljddfnednlllledcel#cidc.ell#ccdeddddddddddcedehllndcbllmgflle.llkedd.lllledd#llidddde.dddddddddddddd.l",
+"mdddddddddddd.leddddeglllfllhjdd.#lllgcmjlbcche#g.c.bcflnmd.e..cdcidckgljjicihlll..nl#dd.cddddellllmddhlllnddddddddddddddddddd.l",
+"mddbedddddddddedddeehlllmdbl#dddglllfebm#ln.cj#ll#.jdillllfkmm.e.mhallllfdhmillllifnlfddddceddelllmjhblllllgjcdddddddddfffbeddhl",
+"mddalcddddddddddenl#d#gcdddnbddmc#llebell#ckc#lllll.ec.flllllllllllllllkmndalllll.cfbddddeflddcll.jdblllnnlll#mdddddddd#dmdddcgl",
+"mddde.dddddmibn#llllkcci.ekccdnidmbecjllfc..#lllllllacccikgllllllll#ni.nei#llllllmkdddddallledda..ialllkdd.glll#fkj.dddbcdddddml",
+".dddddddddcllllllllfmcjef#eddel#mjdiillfedcejjhiihhhhjccjdd.ihlllajeciejnllllllllmmddddellllkdddhcalllbcddickgllllllbddhmdddddcl",
+"mddddddddddllllllhec#cjlll#dddglledelllcddhca.kch.#mibim.dddddgll.dddiglllllllllleddenjk#llll.ddcblllhjgebcejdmbllllgdddcdddddcl",
+"mddhmdddddcllllmcjeejfllllbddkcfl#klllnbbbbbkkbbk..hhhhihiiiihlllmmhllllllllllll.ddm##cmllll#.ddilllkb.jll#b.mcddnllgdddddddddcl",
+"idddacdddddllllcd.iflllllledeckm#llllllllllllllllknllllllllllllllmiklllllllllllndddfl#.hlll#ebddcflkekhllllllamddfllfdddddccddcl",
+"bdddmamidddglll.mllllllll#ddb#cdd#lllllllllllllllballllllllllllllmdallllllllll#ddd.fl#ejll#dcdfmddchnhlllllllllmdfllfdddddddddc#",
+"bddmnke.dddfllle.llllllllgddnlgeheflgecce.eee....ccm.mmmmjjjjilllmbklllllllllljdcddfl#cml#ekmnllhddehllllllllllhgfllfddeddddddd#",
+"bddibdd.dddglll.hllllllllgddallncbm#lfcdefcbdn.gendbefeaeijecclllmeallllllllllcc#.jfl#e.geicgllljdddhllllllllllmmmiimdddddddddd#",
+"bddmaddddddglllc.llllllllgddklllgimc#l#cede..eececcdcdddddddddhabdhalllllllllidklcdfl#.edceflllekjkkddblllllllljbn#gkddddddddddl",
+"bdd.addddddflllmmllllllll#ddjllllne#m#ln.eillllllllll#######ecaaaehblllllllllcilljanl#ccncfll#mhebll#ni.mhblllljiflladddddddddd#",
+"bddckdddddclllle.#g#llllll.d.lllllnemillni.illllllllllllllllijlllmeallllllllgd#ll..fl#ddegll#mcialllllllgffllllmmglladddddddddd#",
+"bdddjdddddd#lllmi#.demihbamdd#lllllnehellamajlllllllllllllllccllleinllllllllkblll.hflgdc#lllcbbnlllllllllllllllj.#llbdddddce.ee#",
+"bdddddddddcllll.mllghcddddddddcce...dddmaamcmhlllllllllllllljhlll.cnllllllllmllll.iglge#ll#mmeblllllllllllllllljigllbdddh#lfflll",
+"bddddddddddlllliillllfmdddddddddddddddddddddddemjikbaanfgg#lmjlll.hallllllllmllllje#l##lllmddebaanffffffffggg#fe.#llbdddcfl.dc.l",
+"addddddddddllllcellllllhddccddehjmjijijdedjiidddjibaababbhgljjlllednllllllllllllledllllllcddmm.eim.jcd.djdjdedcdd#llbdddddggdddl",
+"bdddddddddd#lllmhlllllll#llfddillllllllhebhllbdcnllllllllllgjjlllehblllllllllllladd#llllaeee.e.e..cecccdmcmc.dedd#lljdddddc#kddl",
+"bdddddddddd#llle.llllllllll#cdcllllllllljb.hlladcnlllll#fi.ddclllcdcebgllllllllfede#lllllllllllll#cag#ggggggfnfnnlllmdddheda#ddl",
+"bddddddddddllll.mllllllllllleddflllllllllmf.hllabeflllicjifddclllcdj.je.flllllne#.llllllllllllllllcgllllllllllllllllhdddkedhlcd#",
+"#cddcedddddglllcdjglllllllllcddnllllllllllj.nbllkmjkhckcjcianglllgnbm.emcm#llaihegllllllllllllllllcgllllllllllllllllkddddddg#ddl",
+"ndddddddddclllleddcigllllll#dddnlllllllllllmaebllhmdee.mcflllllllllllghd.hcbnejjcnlf.e....mmmjjj.mdmiihhhihhhhkhklllkdddcchlkdcl",
+"fdddddddddcllllln.cbdhlllllbdddfllllllllllllcaaklladd.glnhllllllllllllf.bdijc#jllehddcfekejk.lc#.hchbiadmcdddd.hgllliddc#llhddcl",
+"addddddddddhbgllllbmckm#lllhddelllllllllllll#m.mallabllllekjeeccce.if#.#lg.ddj#llkddc.imm.mm...mee.mm.mcmcddiglllgfacdddc.edddcl",
+"fcddddddddddddekglllk.ec#ll.ddbllllllllllllll#jidnlllll#iddddddddddddcellllj.lllfene#lllllllllllllllll#mi.mgllgb..ehcdddddi.ddel",
+"ndddddddddddddemce#llgcddgbddd#lllllllllllllllnddellllbdddddddddddddddde#llllllgdcclllllllllllllllllll.cehll#jem.eceddddddhkddcl",
+"bddjjddddddddddcdechllgckcdddnlllllllllllllllgmiegll#mddddddddddddddddddckllllnc.j#llllllllllllllllllm.kallh.cidddddddddddjbddcl",
+"bdddbddjjdddddddddmmjll#ccddjllllllllllllllllmjjfll#mdddddddddddddddddddddnllljddnllllllllllllllllllajeilljc.dehcdddddddddbhddd#",
+"adddmbddddddddddddddd.llecdc#lllllllllllllllnhhalll.dddddddddddddddddddddddbll#cajlllllllllllllllllfdehll.h.cgllnddddddddm#cddd#",
+"f.j.iledddddddddddddde..dddc#llllllllllllll#cjjllliddddddddddddddddddddddddcglln.dnlllllllllllllllljhmllihddc.iglcddddd.hicdddd#",
+"be..m.dddddddmdddddddcdddddckllllllllllllllfhiallfdddddddddddddddddddddddddd.lllci.lllllllllllllllncdb#bdmdddddelmddcdddddddddd#",
+"mddddddddddddgdddddddddddmhfjllllllllllllllicdjlledddddddddddddddddddddddddddnllhdcllllllllllllllldm.mdj.dddneddnkdelfddddccddd#",
+"jddddddddddddnkdcddddddde#lecnllllllllllll#enbfjeddddddddddddddddddddddddddddellbemnlllllllllllll#jm#l.cddddfmddikc#l#ddddb#mdd#",
+"hddcdddddddddjlmjmddddddc#l.ijllllllllllllbedgll.dddddddddddddddddddddddddddddmm.ecmlllllllllllllaihllmiddddddddg.c#l#ddddk#cddl",
+"hddnbdddddddddc#flcddddd.klbdclllllllllllljhc#llcdddddddddddddddddddddddddddddhllked#llllllllllll.khlbcddddddddd.cddjmdddddddddl",
+"idddn.eddddddddck#mddddddmlg.m#lllllllllll..illnddddddddddddddddddddddddddddddmllnccglllllllllllgdjnlmhdddddddddddjgddddddddddd#",
+"jdddbl#dddddddddddcddddd..llcdn#########l#jballjddddddddddddddddddddddddddddddellfccnlllllllllllncdlleddcdddcdddde#jdddcddd.cd.l",
+".dddf.lcddddddddcfnjdddddcll.decddcmceeec.ddglljdddddddddddddddddddddddddddddddgl#cdmkaabananfnnieml#hmdcdddbddddifdddaljdda#dnl",
+"mddnndgedddddddddcjbmddddcllmdijkmmijhihemdc#llmdddddddddddddddddddddddddddddddgl#cddjdicicicjceddil#cddddddfcddd.ndddjhfdd.jdcl",
+"jddeddjcddddddddddddddddddll#gffafffnaanfffnlllmdddddddddddddddddddddddddddddddgllmmmjmj.jcj.m.eeeal#jmdddddfeddddcdddddjhdddddl",
+"iddddddddddddd.eddddddddddllllllllllllllllllllljdddddddddddddddddddddddddddddddglllllllllljlllllllll#ccdddddfjdddddddddddcdddddg",
+".dddcddddddddi#bbkcddddde.llllllllllllllllllllljddddddddddddddddddddddddddddddcllllllllllljlllllllll#eedddddcdddddcnmdddddddcdcl",
+".dddmddddddddicddmaeddddc.llhhbbabnnnnnffnaf#llbdddddddddddddddddddddddddddddd.lll########m####l##llljmdddddd..dddjllhddddddn.cl",
+"mdddddddddddddddddddddddbmladdkmgehmcm.mckdd.ll#ddddddddddddddddddddddddddddddjllbddedcdccceddeddddfledddddddfgdddc#heddddidkmcl",
+".dddddcdddddddddddddddddcblkddmmj.mmmje.emcdd#lledddddddddddddddddddddddddddddalljddici.ee..jejedddklkcddddddckddddddddddibdbecl",
+"edddcnacddddddddddddddddm#lmmhlllllllll#l#gc.nllmddddddddddddddddddddddddddddd#ll.iifgffggggfgnggjbjllcdddddcnidddddddddenddbcd#",
+".ddddmddddddddddddheddddhllddglllllllllllllidjndjedddddddddddddddddddddddddddcj#adc#llllllllllnllgdeglicddddckmdddddddddddddhcd#",
+"mdddmddddddddeddddddddddglmimllllllllllllllnj.mflkddddddddddddddddddddddddddc#nmdkcllllllllllgelll.bmlgcidddddddddddddddddddjcd#",
+"mdddkbdddddddnncddddddddffcdbllllllllllllll#dcill#cdddddddddddddddddddddddddbllfddklllllllllliellljee#lkkcdddddddddddddddddddddg",
+"jddddacddddd.hddddddddddddmmllllllllllllllllfi.glllcdddddddddddddddddddddddhll#ebmllllllllllhdjlllljb.llcddddddddddddddddddddddf",
+"jdddejedddd.kcdddddddcdddddnllfnlllllllllllll.ee#llncdddddddddddddddddddddilllidcalllllllllfcdhllllbcjijbmdedddc#ncdddddddndddd#",
+"jddcihbjmiabddddddccc#iddddalncglllllllllllllnddilllfcdddddddddddddddddddmlllljdcfllllllllfcddhllllljkdil#maccdd.gedddddcc#cdddl",
+"jddejfedddddddddcciilladddddcdiieeejflllllllljcdklllll.dddddddddddddddddnllllllhkcnllllll#cdddmllllllch.gllkegcddddddddc#gfmdddl",
+"hddd.lcdddddc.acimnllkjdmcddddddddddd.nllllljmbbllllll.i.ddddddddddddcigllla.nllmjefllll#cddddcllllllgmcikllfidbdhd.dddhjddddddl",
+"adddjmdddd.bjijjbll#icke#ndddddddddddddilllikehll#.j#killnjccdddddcecgllllkdddfllmccflllmdddddd#llllll#ebc.#llfiehdbcccbhdddddcl",
+"kdddddddddiagllllljdkiklllfdddddebaahcddcl..dnll#eddddlllllll#gf#ll#d#llfecdcmdnlljc.f#eddd.eddkllllllllm.hcillllll#al#hcdddddcl",
+"hdddegcdddnllllajj.b.nlllllbdddalllll#bcdceinll#jadccd.alllllllllllldffjed.ngcmcgllmeccddd.#fcdclllllllllbckmeiagllln.cdddddddml",
+"eddddeddddallllce#ehllllllllbdhllllllllndddhll#..mfg.ddclll#llllll#fcccedjlllgcccfl#cddddcgllmddalllllllll#mcmdddlllkddddddddbll",
+"edddddddddkllllccflllllllllllbgllllllllehddmlgeg.glllbdellgdcc.eedchdjcbllllllfcccaedddd.llllnddcllllllllllllbcdelllbdddddddddcl",
+".dddddddddblllle.llllllllllllllllllll#.ehnhdj.cjgllllfdcllgddcddcccihn#llllllllfdddddddc.lllllhddmllllllllllll.dclllbdddidcnmdel",
+"fifbcdddddhllllcmlllllllllllllllllll#ebjnllhdkm#lllllnjmllf..bffgglllllllllllllgddddden.g.#llllcdd#lllllllllll.aclllbddddddccddl",
+"jgddddddddbllllccbnnnffkfggfggggggggeadgllg.ednllllllfcellgjhllllllllllllllllljdddddc#lgece#lll#cd.lll#llllllledelllbdkcddddccdl",
+"ehbdddddddbllllccbck.i.hcidbcheidk.ddefllg.m.he#llllln..llfdillllllllllllllgicdddejdde#l#edcee.eeddcj.c.m.m.i.ddclllbcl.ekdd.mcl",
+"ed#eddddddbllllm.jm.mj..c..j.j.m.i.cenllge#mllbelllllahmllfkkllllllllllllfmddddckllbce.#l#eccc.cecddmcccec.cieccelllbeljchdd..dl",
+"eddaddddddnlllllllllllll.llllllllllllllfcej#lllamllllncellfcillllllllfh.dddddddclllladd.lllllllll#edclllllllllllllllbdl.dddc#cdl",
+"edd.ddddddbllllnaannffnfcfgfgggg##llllnchillllllkklllajckhmmhllllbmeee.mjkngadddhlllladmellll#g#g##cdj###l#ll###llllbd#..mdijdd#",
+"eddddddddn#lllldd.dmdjccdcd.ce.ddegllgdd.llllllllk#llbeckkjjillll#ll#llllllllmdddfllllkcd.ll#eddddcddddcec.ccccdhlllbdfeh#dddddg",
+"cdddddddddjllllcdmceeeecceceeccdc#lllfdelllllllllllllkbmllacilllllllllllllllllmdd.lllllkdclll#edddeeecddcdececddjlllhdaedddddddl",
+"edddddddddhllllc.llllllllll#n.d.#llllfd.lllllllllllllkc.llaaklllllllllllllllll#.ddillllfdd#lll#cjdg###bcb#####eeilllideddddddddl",
+"edddddddddhfnakehllllllllllfc#.#lln#lnd.lllllllllllllhb.llacillllllllllllllllll#dddnlllfdd#leglgej.#lllgeallllmamlllmdddddddddc#",
+"edddddddddehbande#llllllllnjjclllhc##khmlllllllllllllhdellbnklllllllllllllllllll#eddbllnielldell#edelllllnflllcdilll.dddbfddddd#",
+"eddmcdddddhlllldcjjallllladjefllhdcmj.ccannnnnannnffnejellkcillllllllllllllllllllgmdcnlfdclldd.ll#cee#lllllgh.ddjlll.dddm.ddddd#",
+".ddmedddddilllledje.enllacamndfbmcellndcidjcjmided.cccdellb#hl##lllllllllllllllllllmdcnn.ellddd.ll#e.e#llgidjcccklll.dddddcddddl",
+"edddddddddjllllllnmec.ejhimll#cmddelladddcccec.dececdcc.llbcdeddde.jfllllllllllllllladdccel#cdce.ll#edefjdhcckllllllcddddddddddl",
+".dddddddddehkngllllfiiddmhlllhehhj.llggg####lhh#########llkdcjeeejemd.iglllllllllllllfmddel#ccjde.ll#c.ddcmb.lllgnakddddeddjbcdl",
+".ddddddddddddddek#l#lnedjlllhh.klc.lllllllllljnlllll##llllgflglllgfh.eedhllllllllllllllkddb#dd#icc.llgcdchllmaheddebbcddddde.ddl",
+"nddddddddddddddddd.glllklllmcmbllkillnccececedcccddccdc#llll#faaagllllkddcnllllllllllllnedccdm#lked.ll#m#llgeddddflllidddddddddl",
+".ddd.hdddddddddddddchllllljehalllm.llnddkdbmk.bcjedddjgllajeeedcdcemb#lgicdhlllllllllllace#adcallkdj.lllllhddddddmm..ddd..dddddl",
+"mdddhnjddddddddddddddmlllfdd.lll#kjllndcbfbanfafaedekllfccdcdcddddddddhllbcijllllllllllbe.l#mijegleddklll.ddddddddddddddhidddddl",
+".ddjadddddddddddddddddclllbimflllemllnm.lllllllli.cnl#e.dddddddddddddddcal#eejlllllllllac.lldellllcecll#cdddddddddddddddbcc#cdcl",
+"mdcg.dddddddddddddcdddde#lljec#l#bhllbh.llllllla.cflfeecddddckneddddddddcilgmdbllllllllkh.l#ej#llbdjal#edddkf.dddddddddd.ddhcdcl",
+"jddacdddddddddddddnbddddjllgemkllcellbc.llllll#deblncdddddcn.bjddddddcddcdklgc.gllllllladjl#dellgdcmll.ddddddddcjddddddddddddddl",
+"mddeaddddedddddddddedddddh#eee.glbkllbi.lllllljekl#cddddddcbcdddddddil#.dddhlbdelllllllbhc##jjlljdeidcddddddddef#ddddddddddegcdl",
+"jdddiddddckddddddddddccdddea#cch#e.llbj.lllllnc.#l.mdddddddddddddeddcjflmdddfljmnllllllb.el#delldeflgdddd.hkmcnllcdddddddddelccl",
+"mdddddddddjddddemcccmfmdddkllbj.#hbllbf.llllljmalacddddddddcddddh.ddddcladddelaee#lllllkg.l#jhgkccllhdddhbcdddd.#cddddddddddlccl",
+"idddddddddddddddn.nn.ddddddlllcded.llbddee.m.del#cjddddddcgcdddjeddmacdhfdd.inl.dcecce.dcjl#ddcddjlgddcfedddddddddddddddddddmdel",
+"iddddddddddddjddmedddddddddnlleddd.llbddkehnddhlkcdddddddfaddddddddml.ddcdddceladmkekdbcdil#ddjddglbddcakcddddddddddddcahdddddcl",
+"hddddddddddddi.dcfdddddddddhllk.ccklln.m.dcmmj#l.eddekk.blcdbbcdddddkbhicddde.f#khhm.bhhb#llkhhkalljddddfaddddddddddddhfcdddddd#",
+"hddddddmdddddegcdcadddddddd.llllailllllll.nlllllecddikkafmddekl.ddddddccdddddcbllllbhlllllllllllllledddddbfdhedddbjddddddddddddl",
+"idddddddddddddddddbcdddddcdcllllaillllllljnllllaeedddddddddddeeeddddddddddddd.hllllhklllllllllllll#cddedddn#hddcnfcddddddddddddl",
+"jdddddddddddddddddddddddchddglllhilllllll.fllllicdddddmaaidddadddddddddddddddd.llll.blllllllllllllnd.cn.dddmddddicddddddddddddcl",
+".ddcddddddddddddddddddddcgddjkbfmj#lllllgdbfg#g.mddddd.knjdddiddddddddddddddddchkkhcejhkafglllll#gkdjedddddddddddddddddddddcecjl",
+"faedddddibddddddddddddddciddddddddddccccddddddddddcddddddddddedddddddddddddddddddddddddddddillnecdddjcddddddddddddddngiddddcalll",
+"l#cdddddcgeddddddddddddddddddddddddddddddddddddhng#acdddddddddddddddddddddddddddddddddddddddgndddddd.cdddddddddddddd#bdddddddgll",
+"lmddddddddddddddddddicddddddddnnddddddcdddddddddcilcddddddddddddddddddddddddddddddddddddcdddddddddddc.dddjnnkdddddddmdddddddddll",
+"fdddddddddddddddddddddddddddddbjfidddddddddddcddcckdddddddddddddddddcmmdddddddddcm.ddddddddddddddddekhddd.becdddddddddddddddddal",
+"bddddddddddddddddddddddddddidddddbaddddddddddcddcc#edddddcacdddddddddcfedddddddddddddddddddddddddddddfdddd.eddddddddddddddddddal",
+"bddddddddddddddbbmddddddddddddddddeiddddddddhddd.mlgdddcddflidddddddddeddd.mddddddddddcedddddhjdddcjegmddddbcdd.ddddddddddddddgl",
+"fddddddddddddddchfcdddddddddddddddddddddddddejddcenhddefha#j#ndddddiddeiddmeddddddddcjhjdddddcjdddcjhamddddhjddkcdddkcdddddddill",
+"l.dddddddcddddddddddddddddddddddmedddddddjecdidddddddcmllgcdd.dddddddddkcddddddddddddddddddckdddddddddddddd.gjdedddd#hddddddd#ll",
+"l#cdddddc#mddddddddddddddddddddddnedddddddejcddddddddnlfdddddddddddddddcjdddddddddddddddddddcdddddddmdddddddcdcjddddf#kddddcalll",
+"ll#hee.klljdddddd.jcdddcce#fccdccgheeecccccdddddddddcecccdccccccceeececdh.dddddddddddddiddddddddccbj.eecddeeccfj.eeenllnbba#llll",
+"lllllllllllgggg#nlll#fglllllll#lllllllllll#ggfffffn#ll#ll#llllllllllllllll#ffgg#gfnggff#ffff#####lllllll##ll#lllllllllllllllllll",
+"l#liiiiihkhhhihiiiijjmjmmjjmm..eeecefl#jmjjjmjijjjm.mmmmjmmmmmjll.ee.....eeeeeeeeeeceecemlfe...eeeeeeeee.ee.eeeeeeeeccccccecelll",
+"ke#kcddddddccededmdcdcdcddcdcd.cdcddjll.dddcmddd.e..cjdjdjdcdd.l#ddc.emcjchdmdhcjcjdjeddilbdddd..djdidickeicmeiccdedidkddddcbl#l",
+"idclbddddd.jmjdidjdcdmccccedmd.edcddclladddd.dddeedddddcdcddddml#ddceejdcdmdmd.dcdcd.cdcllmdddddddcdddddcdddcddddddddddddddall.#",
+"iddmfddcmdhbabbcdddmabababbaaaanaa.dchgacm.agg#g##gg###ggj##cjcaicemggffffffffffffggkc.mniddcg#############ll#ncdm#lllgdcdcflecl",
+"iddddjkc.dhllllmdekjllllllllll#ggghdeddcceckllllllllllll#ciaemchidcjllllllllllllllllhccmmdddblllllllllllllll#idddnlllfc.ckf.mdcl",
+"mcdhd.lbdbdklllhdclamllllllllled..cdddfl#db.lllllllllllllcddde.lld.cllllllllllllllll.i.l#dddlllllllllllllllkddddclllgccdall.ddcl",
+"m.dcm.m#fcejbll#ediidm#llllllljciiebeemllhmc#llllnjllllllhdddemlldcdillllllllllllllncmfladcdma.glllllllllnejagfjmll#cicfllehddcl",
+"mcdj.ecjlb.gckllidddjnj#llllgb.dkgjlcdd#l#cbillgkmlllllljicbdc.l#dcddhlllllllllllll.jell.eddd.ecgfglllllhcbngllablgeidblljeeceel",
+"eid#bdndmladi.nlbddcllgc#ll.ddecadmhdmdnllmcd#bdc#lknllllcdddd.l#ddmdd.lllllllllll#ddhlndcddblfdemmnlll.dddddkli#l.edblljdibimel",
+"mcdllnci.jlne.dafddcllhmmll.djlbaddddddmllachjm#.#mblllllgcac.ml#dchcddcnlllllllllkam#lmm.debj#ciiak##.ddddddd.h#cejnllea.flim.l",
+"ehdlllk..chlkchcb.dcancmkincckm.fcddddacgllmbdalcecfballllkeceml#dchhdddillllllll#ecil#ceddddd.nllhijeddcmbfgn.ie.mkl#jm.bllhdel",
+"mddblllbdfdjlnddckdddd.mbcdcn#k.ddddddcdillac.d.a.cddikbj.ecd.ml#dckl.ddkllllllllam.flieedddddcll#a.ddddhflllljdmdklljdhalllbjel",
+".hdd.bllbcmeklnc.dddddjl.ddehbjddddddbdiell#c.dh#mecccdce.cccjjl#ddejeddcjlllllllmc.l#cdcddddddmebfeddddddchl#ddcnll.minllllbdcl",
+"meddddehnme.cklacdddddhlhdilkdgjdddimgkedflljcecmfeh.dcemkaic.ml#dedj#bcddmlllll#cjalndhcmcddddddmmdddc.d..cmmdmhllijcklllllkj.l",
+"mjdiddi#hddcgdbladcdddcicmellckedddbaklci.ll#midafmhcgllgfkdmkml#dddc#lgcddallllhmclljddfljaedddddddcfll.llhdddhllhcail#ieccddcl",
+".icledblndkjc.eklacdddddi#djmddddddhlhk..dgll.edigmhakllllkcdmml#cmddealkddallllc.jlfdmdjech.cddddigll#m.iic.dblljijdcccddddddcl",
+"m.clbda#cellie.dklkcddddblaemdccddjmnbmecbkllkjdijhcchl#ain#.n.l#dddedcjjddnlllfecgli.dci#nd#idejnlllf.dk#j.jillki.cdddddddke.el",
+"eael#djndjllkddbdblbdeddkllmndklnddgmelbdielllcekllbcl#egl#iddmlgd.i#djlfdcalll.emllcmdhllli.malllln.mladdhcdjlid.cddddcddmfdn.l",
+".dellbd.dellcmc.ddblaeddmllgene.cddcc.lejdehllhj.llhilkhgecd.n.lgddcb.ellndcglfeealhkmdfllllllllnmcddfl#c.cb#jecaddddd.##ichidel",
+"emellledddgadjhdcedbnecicglla.m.dddfbcj.#djellgdealkllkbedcccjmlgc.cnmdi#lcdilhce#lccdmlblllll#imcdddhgj.cillheedddcj.elgbhlhcel",
+"meelllgdddijddmjjdjdd#addclllijidd.llejd.cde#lleh.lllljbdd.f.f.lgddddbdb.hedelmmblf.iel#jllllfe#l.ddddddmkllhd.cddelllm.i#llhdel",
+".kelllladdcmdcke#dcccnla.icnklm#kdalkdg#acde.llgde#llledddfgcemlg.mcd.dagcdmgkcellmmcalhgbg.hdblheddddiekllidmddm.e#hjkgllllbdcl",
+"e..lllllkddddelaemc..calkchdkljln.#l.djlled.dgllemilln.cealf.amlgdcecaeegadk#cdmlfdkdabb#iid.bemalmddjchllkdecb#lgedk#llllllbcel",
+".f.llllll.ddddaljdnjdednlb.c.ginmj..ddd##dh..hllhdd#lll#blllc.mgfdjh.eeddedc.ddnlimdddhlgnedklhbllcdechllhdejlllia.m#lllllllkcml",
+".c.lllllllhdddcl#d#ndcddaladmdhaig##cddjfd#cccll#ccblll#aimedddhjddecjkdbbdkec.llceddd#ncck#bem.jcdeiblli.ckllhcjkjnflllllllbcel",
+"ebmlllllll#cdddnlj.cdd.icnlhdeeekijhddee.d#kjeblljd.bj.cicmddd.lgddddideehdkcdblji.cmdecdblll.#eddjmhllbdijllhciebbj##llllllbj.l",
+"edjlllllla.fecdmlnddddddecnlbccelllleelendf#dd.#kcddcccdce.ihklllgfnhmecccdddd.nddd#bc#hcllllncechdkllkdchllkmmadkjdi.jlllllbjel",
+"mamllllljjkb#fddalcdddddjednlncmef#fejlg.cglmjecagddciag.flllllllllllll#gajcdif.dkelmgljjllll#e.c.nlliehi#gjjb..nglcikmlllllkccl",
+".imllllljegllnddml.ccde.dcnenlkcjc.kkeknnclladdmllka#lllinlllllllllllllllll#b#lmddil#llj#llllgdmmkllkhcjhhbhmed.l..dniklllllbhel",
+".imlllllndgll.ddc#hjgchlc.hednlnddc.ddcdbegacdd.llllllllnbllllllllllllllllllll#cdddklllllllllmjdbllkdeeflllmddd.l.ijeemfflllhdel",
+".k.lllljdmmlbddddjlm##j#hmdmndnlfc.difedcdcdciglllllllllljlllllllllllllllllllll#kcdcenllllll.jcflljd.kfeekmf.ddckiaff.cmhlllkecl",
+"ecmllljcbl..dddddd#aelfjjibd..ealbcd.fhddcddflllllllllll#ennkhiiihbag#lllllllllll#hccchllllidiblladejllajjdlmcdmlnn#dcfmbnllhe.l",
+".h.lll.ilfddddcddd#lbihiealddmadnlndjcfcc.hmflllllllllnjcddddddddddddddjallllllllllnddde#lmedfllhcd.illb#lcai#jd..iemnbhhnllk.el",
+"edcfllmdhlmcddkhcdlllhcgh..f#kdicaladddmegl#eglllllamcdddddddddddddb#gnkccmalllllllaehddcecdflliedca.lljlf.fh.addb#gafkbcll#.del",
+".ddd.jdieicddelbcalll#hcjagllli.ccaf.cdmglllgmllla.ddddddddddddddddfllll.dddeb#lll#cnlaccddjllkd.jnb.#bnlinllccddina#nfje#keddcl",
+"bmdmeddmmddccdec#llllnedjllllllhdgcd#nmllllllb.gcddddddddddddddddddiflllcdddddchllmflllgedjdghddhl#ccddmhkllbdddddddi.dddddmmd.#",
+"ll#kcccjdddddhg.lllllladikllllllkecdnllllllllgcddddddddddddddddddddaakjedddddddd.jjllllllflgcechgkfehddddebfhf.ddddigedcidcek#ll",
+"g#ll.bm.d.dcdig.flll##me.cnllllllmddmlllllllncddddddddddddddddddddc#llldddddddddddillllllllhdcj#.jcjledddcccifkcddde.dhcjmebllll",
+"edi#jll#kdcndddd.llad.khgddalllllecd#llllllhdddddddddddddddddddddddcmkadddddddddddd.#lllllliddbdddegh#hd.##iljibdddd#cch#lkbllll",
+"eddccblll#amcd.cd.a#habcadejhlll.mjfllllllmddddddddddddddddddddddde#gn.dddddddddddddefllllll.ddd.nlnilnilliji..c.dmdjb#lllkhgjel",
+".ddjc.chglllnmecddd.fh#dcedgfllbkebllllllmdddddddddddddddddddddddd.lll.ddddddddddddddc#lllll#eddkggmlli#lgcg.deemejnllllllhcddcl",
+"eidbedddd.nllllkcdm.dchdelg.glndcillllllmddddddddddddddddddddddddddcjiddddddddddddddddd#lllllnddcmdbl.c.j.dd.jdchlllllllbcdacdel",
+".cmllgkeicdehgll#fmc.c.ddkllll.bcefllllmddddddddddddddddddddddddddm#g.ddddddddddddddddd.lllllljdel#hjf#bdddmcjf#lllllnmcideec.cl",
+"ejmllll#becdeciflllgjemd.chglaccnbeklladdddddddddddddddddddddddddddikcdddddddddddddddddd.lll#h.cdhll#becmdchflllll#b.dhdm.k#ik.#",
+"e..lllllll#hdcgcckllllaedcedcdkmlllj.addddddddddddddddddddddddddddilbddddddddddddddddddddblgdklfecnjdd.deallllll#mcckjdi#lllkdel",
+".mjlllllllll#bjdcdmjnlllficjmdc#llllkdddddddddddddddddddddddddddddkljddddddddddddddddddddd.mgllljddcheiflllll#k.cicedcflllllhdel",
+".hmllllllllllllfjeid..bgllgccdklllllhdddddddddddddddddddddddddddddb#ddddddddddddddddddddddclllllnddchllllllficdmceddhn.#llllkmcl",
+"mdjllllllllllllllln.jmidmgnhln#llll#cdddddddddddddddddddddddddddddafdddddddddddddddddddddddblllllbf.llll#hdd.cdddjkhmncbllllhdcl",
+".hmlllllllllllllllllf.ede..iglllllljddddddddddddddddddddddddddddddajdddddddddddddddddddddddclllllllkhlamjjmdmbnjgkiadeic#lllkmcl",
+".djlllllllllllllll#nkcfmdjhd.lllllgddddddddddddddddddddddddddddddd.dddddddddddddddddddddddddallllllad.dmmmmfllkng#hdcjlenlllkdcl",
+"..mllllllllllllljfcdddcddddcilllllicddddddddddddddddddddddddddddddddddddddddddddddddddddddddcllllljddidcnlllllkim.dd#.lkalllbdcl",
+"mcjllllllllllliedddemddcc.denllll#cddddddddddddddddddddddddddddddddddddddddddddddddddddddddddallllhddiflllllllljlnjd#hfgglllhjd#",
+"mcjllllllllllbdddckgbma#jmdelllllkdddddddddddddddddddddddddddddddddddddddddddddddddddddddddddjllll#cegllllllllgjbnkcng#lllllhec#",
+".h.lllllllllcdddcllle#lkjmdhlllll.dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddc#lllljnillllllllllabidnlllllllkam#",
+".cjllllllliedd.bkllhcmeddciflllllcbgidddddddddddddddddddddddddddddddddddddddddddddddddddddddddbllllic.llgemijinlgmjjllllflllkecl",
+"eijlllllliddd.lmmh.dcdmfjdcgllllad#lkkfccdddddddddddddddddddddddddddddddddddddddddddddddddddddjlll#hed#llm.ngljg#cijllaem#hlh.cl",
+"mdjlllllgdd.c#jdedbiheehib.lllllmellmglmlfcdddddddddddddddddddddddddddddddddddddddddddddddddddcbmecmdcfll.ddclfk#.hjlgddb.#lhkcl",
+".emlllnjeinleed.#bm.bmnjceelllllejllml#hlghfc.dddddddddddddddddddddddddddddddddddddddddddddddddbf#l#ceall.ddciligih.ljddmdllh.cl",
+".ccaabddiggmkddjjckjjejbii.llll#dkllilanlkafhlficddddddddddddddddddddddddddddddddddddddddddddddlllllekklfhccbclnehbmkmci.c#lhiel",
+".ddckddcidddddcddddddddcddmllll#deij.ama#cfkgllllgjddddddddddddddddddddddddddddddddddddddddddddgllll.ccj.ccdmdjjcc.ededd.dihcddl",
+"edccccdckdmdjdkd.dhen.kmedillllfddddddddcdccc...mjicdddddddddddddddddddddddddddddddddddddddddddnlllljceachdnekcncf.bckmiecdmddc#",
+"#f#gefffanaabbbbkkhhiiijeinllllfdddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddallllaccicec.ccc.cmcmc.ej.cdjddc#",
+"lllljllllllllllllllllllfillllllndddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddbllllllhkllllllllllllll#llll.gfgl",
+"lllljllllllllllllllllllnkllllllndddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddkllll##hhllllllllllllllllllljllll",
+"jmmjcjikbkbbbabbbkkkhhk.eibllllndddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddbllllfccc.mmjiiijbaaanfgg#g#.f#fl",
+".dddjdadcdndbebcmcaeijbiedellllfdddddddddddddddddddddddddddddddddddddddddddddibhbimdddccdddddddallllfdd.d.d.ckdbdncndkdidbdjddd#",
+".ddmmdecddcd.e.dmjemcdjjccellllgddddddddddddddddddddddddddddddddddddddddddddddmallgcac#fc#k.fadnllllncdmcjeddddddc.md.djcjdhcdd#",
+".dclldjeddecmbjdfleace#lmidllllgddddddddddddddddddddddddddddddddddddddddddddddddeki.aelfelbhl#d#llllb.dhejececdddelgcdcf#ffam.c#",
+"mdclndcddehl.hdamlbddcelkdd#ll#kddddddddddddddddddddddddddddddddddddddddddddddddddddcjlkjliflfclllllkcchjkibddd.ikaddcllllllkn.l",
+".ddkjf.h.#llmddgkfljddmlbjd.mmihcddddddddddddddddddddddddddddddddddddddddddddddddddddd.chlmllkclllll.cdicmddddhlneeddhllllllkjcl",
+".ccglk#fllll.ed##.ggnchlfdch#lllidddddddddddddddddddddddddddddddddddddddddddddddddddddddcielljmllll#ceddecdife#ndddde#llllllhael",
+"eiclllllllll.dd#l#mmmeel#.nkllllgdddddddddddddddddddddddddddddddddddddddddddddddddddddddddddichllllgddcglf.llelecdjbllllllllijc#",
+".d.lllllllllec.#llllll#lljc.lllllcddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddglllladdk#.cbfidmddjlllllllllligjl",
+".celllllllghddcheilllllllki.#llll.dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddelllllhddhcddddddddc#llllllllllh.cl",
+".dmllllll#jndemfed.llllllfddalllladddddddddddddddddddddddddddddddddddddddddddddddddddddddddddhllllledmdedddddj.j#lllllllllllkajl",
+"ec.llllhllebdecjcajkllllamddjllll#eddddddddddddddddddddddddddddddddddddddddddddddddddddddddddgllllfddccfkcd.alllllllllllllllk.c#",
+"ec.llllmflidcmmjk#lgl#aedcdcklllllkdddddddddddddddddddddddddddddddddddddddddddddddddddddddddmlllllacdbdcianlllllllllllllllllkfj#",
+"edellllndkjeg.ll.llfjdddd.dfllllll#dddddddddddddddddddddddddkddddddddddddddddddddddddddddddd#llllllfdedmdecnllllllllllllllllkdd#",
+"edellllldikj#femja.dddehflajnblllllhdddddddddddddddddddddddcndddddddddddddddddddddddddddddd.lllllgljblnjcicieh#lllllllllllllkae#",
+".d.llllljglb.hddcc.eeblllladdd#llll#cddddddddddddddddddddddbnddddddddddddddddddddddddddddddfllllfdie#lll#jeaehch#lllllllllllkcc#",
+"ecellllllmjmddddccigllllhddhddkllllledddddddddddddddddddddcladddddddddddddddddddddddddddddillllljdd.calllllnmedfdealllllllllki.l",
+"ec.llllllf.dded.kglllfiedidm.c.#llnmn.dddddddddddddddddddd.lkddddddddddddddddddddddddddddc.flllfcdcide.h#llllnjmcgemb#llllllhccl",
+"...llllnjdddceblllln.edbccklgddilimllfddddddddddddddddddddcnjddddddddddddddddddddddddddddff.allckcghek.jchgllll#ij.#cehgllllhhcl",
+"edclgjddddck#llllhc.dbdddmfn#ndddnllllndddddddddddddddddddfaedddddddddddddddddddddddddddilllj.kddalllncmmjd.flllllaeclei.nllkdcl",
+".dd.cddd.bglllfieecjddchjd.dckcdcllllllidddddddddddddddddcknmddddddddddddddddddddddddddilllllidbjllf##.dce.cc.alllllaicnjj.hmnel",
+"eddddcmnllllnmdjced.idblbhn.kcd.mblllllliddddddddddddddddkbmcddddddddddddddddddddddddd.lllllljidnllhdccmjaddmce.alllll#jcnejcmcl",
+"eddcc#lll#hddhedmakhdal#mgclgcdddcnlllllliddddddddddddddd#llmddddddddddddddddddddddddmllllllid.hll#lndb#df.#bccmbdm#lllllac..ddl",
+"jjb#.llnicecceifla.ec..cmjg#.j..mmcgllllllhddddddddddddddhafedddddddddddddddddddddddj#llllladi.lllamicjlch.al#kd.midjnllllfejddl",
+"llll.b.dccmddm##adcbgddddcfidghkfddc#llllllbddddddddddddbfhjdddddddddddddddddddddddhllllll#dddgllllg.dcacg#m#llejecdddenllljlnjl",
+"llljdddddddddddefdall.dddddddjl#dbdi#llllll#dedddddddddclllleddddddddddddddddddddcfllllllll.d.mllllllacndhllllljbladdddceifmllll",
+"hmcdddehgedddddblmmlgekcfjciclg.cecnfjkllllkb#kcddddddd.hihkcdddddddddddddddddddeklllllll#l#dhdhllllllhjhillllkdbjddddd.heccalll",
+"eddddck#lmddddd.hee.cffb#ikfcb.ceifddddallf.lllgmddddddnllgkdddddddddddddddddd.n#.llllllj.#ma..ehlllll#cdenllb.igcdddcdddmihechl",
+"eddkdggid..hccdddbl.d#mlaagbjdi.algdmddcmlmflllll#icddcflll#ddddddddddddddddj#lllnelll#edcdilljcejllnimjkjlllc#jjddddkkdcfjcdddg",
+"edcidg#ae##ledddclfcdmdghgl.endhlgedei.jdejllllllllgbedceibkddddddddddddd.bgllllllhhlncjcdjmll#.jcijcnjnm.jlleiddddddflic#lgmdd#",
+"e.egj.cdckk.edddcg.ddddm.##cc.kl#eddbll.cmdkllllllllllnh.cccddddddddddmkglllllllll#dmddc#ijdhlll.kcde#adc#bnlndddddcc#g.cfllbdd#",
+"e..lllmillnc#cddcajnddddcnde.blgdm.blllladcdcnlllllllllllll#fannnngg#mllllllllllllndddddmlbcmjll#mcedce#m#lmnljddd.lkcehhlllbkcg",
+"ee.lllihl#jfjmndjlincfiddccdklfe.dbllllllf.cbcjllllllllllllllllllllllmllllllllllnjdddeddkhlkdjjll#.mchj#ghg#jll.ddil#c.allllbhdg",
+"ei.ll#i.ne.mmi#e.lkkml#cdddkl#e.dhlllllfbllkdddfllllllllllllllllllllliflllllllgmddche#kcdn#licdhll#eicc.lidhd#lnddnlliblllllb.dg",
+".cmlllih..lljidhdgmdddcdmcblgcc.dblllllcfln#ejcll#ealllllllllllllllllkilllnhflfcdil#c#lmdcfgic.djll#ek.d.cdcdjllfc#lgcelllllkhd#",
+"ekalllllkdng.jil..manhd.dklfeheddj#lllidfmjf.icmabddeiaglllllllllllllheai.dd.lgddjljhjlbdemibiecdmll#ecddddcdclllhmiceflllllbjc#",
+"ed.lllllkcedd.llmd#lbdcdkllchdcciimllgddcdnhcdffedddddcdcmiannglfijm.dcdd.ddcbee.c#effkbdffb.hlmcdhllled.dddddflllcdefllllllbic#",
+"eamllllll.db.#ljdnlfddcalncedmmckmc#acd.cdbdaillnddddddddd.eddkljddbdcddcibmfj#lddjlenndcdig#fhddc.ill#efddjbnelllhdblllllllbmd#",
+"eemlllll#eh#if.djlfeccklgeccdjajhfbcckilnddhcalliiddmfedcdddddhf.ccihbn##llmmc#lkdc#mkmdddjihicdde.dill#chdnl#dallnddallllllbmcg",
+"encllllfcclkdddm#fcedkl#e.edclljm#gdc.fgjdcfc#lleeddclnddmccmjcmcfillllllllbhenlled.alliddflll#dm#cddbll#e.cj.mmll#cdc#lllllk.df",
+"ej.lllfml.jmfedccdcdklgcmcddcmmgnm.cddedfae.bllaimdddl#cdiccdcali.mlllbm#lll..mllhddhlllkdeklladngbhmchllbdccch.klliddclllllbjdf",
+"ecmllle.jjgllmddddce#g.ecdcdddflamnbnb#hlj.j#llecdddkmjddij..iblh.m#ejc.klllahcglgddcjfl#cgbjedc##hadc.h#maccdfkealndddjllllbmdn",
+"ej.llimfl.h#ndddcdjmccdccdddd.fmklllllim.di.llgdejddkl.d.mecddalihm#ddcbjlll#cimll.d.idjnalllh.gll.gcic.caladjcibjhfcdddklllbhdf",
+"cd.n.f.flidddddddklfdddklidddcbllllll#kgdcdnllkb.led.lndd#m.kialic.gcdcahllllmmcllfddkbdmm#llh#lnjdfbgj.dkllfce.cl#kdcdacallaicf",
+"cid.gfcc.cddddcdklgejcchlnddi#l#fanlllladk.lllcmblgccnfcdj.d.ealiec.cdjlilljbgjknllccilainiblmkjknnhlgjcaekllf.hdbllcdml.c#lb.cf",
+"eddc.dddcddcccdhlleedem.kbcfl#keddd.llleddblla.iglfccccddbndbinlhkee.ilfhlhellm..llkdell#nlj.calfikmllihm.efllnendnld.lljdmlkcdf",
+"eedddddddihd.cblgcccebcedjlgmddddigcekcdddgllmcelllccfl#mdecccalhe.llla.#gddn#bi.nll.jalgg#cdcmdclnejlaelhdcbllnc..mc#llkddakfdg",
+"eddccejbfaebckl#.dedmkfncijdddddd.lfc..mb.lllebnllliddflle.ejjnlijml#hkllbhejimcmilli.e#aakddddddnlih#gdk#ijcbllahicmf#ljddjaedg",
+"ejel#lllgdceblleecddkhmdddddddddd.#hblnccfllieelllllmdhlljddecalimc.d.ffkenhblbdl.#lfedbeddcdcdcdeli#n#ddfl.hmnllhe#cc.mddcc.gcf",
+"edmllllbcccbl#cecj.ddddddddn#hedddddmjdhell#djhllllllfcalhcdi.alh.egfnnaankkcl.cccjlljkdddddddd.cddblmaddcglhcjk#lacg.#l#n.ddccg",
+"ej.lllbcmeblg.idjllfidddddcnll#.ddddddecilla..gllllllledmjjdmmalhhchkkhkbbahcbkfdjcllfe.ddddddchgkem#accdd.llijdmllamjiglllnendg",
+"edmlladidflledcdemmmcddddhd.llladdddcdiegllj.illllllll.dml#ckhalidcahjj.mmmjdd#hdejfllc.dccdbfjbm#ahe#ilmddnll.ddfllbmie#lllbcdg",
+"eedlhcccnl#cdcd.ddddddddalmhjlkeeceddcejllnmbnllllllllncdjlmmmalib.mlllll#enbd.jbcjellkimcddc#blheblb.ellcddnllji.blladfe#llbadf",
+"cedjddealgmdemelnheddddbllgi.jcjl##cdcmnllhec#lllllllllghefjjjnlhmebhllllf#aehc#ge.efll.cdcecjhlgdinkgjbaddchll#hejbllbeh.glamdg",
+"ecddddfllcidkfhllllmddbllllfble.lgjeddd#llciillllllllllllfcei.alicdajklllla.flekege.illhnc#lkdcl#c.eecm.cddd.llll.bcfllbjjcgbgcg",
+"cddccglgc.dklkd..ccddgllllllllmdeededdhllbjj#llllllllllllledmenlhicacmebll#lle.hflkmc#lgc.klefckjcnahfgc#l#cdjlllljkcbllncfcecd#",
+"cdddjlgeechll.dddddmglllllllll#if#jdjc#ll.emllllllllllllllfcmmnlhecjcjaalllghnllll#dhjllijehk#cbnballllhlllcdelllllje.allaeb.idg",
+"eddkefcdehllgdddddilllllllllllllll#dc.llgdjklllllllllllllllmmenlhecfdmjbllllllllllle.cggkcjdknchjilllll#blkdddfllllljjcfllajcdc#",
+"ee#lndddklllmdddj#llllllllllllllllhccc..ccc#lllllllllllllllmbbhfmfckii.alllllllllllfib.nbcccb.mlllllllllbcddddc#llllljbckllhdddl",
+"bglneacilllncdcalllllllllllllllll#ejeffackjllllllllllllllll....iecclll#nllllllllllll..ellbj.hn#llllllllllacddddflllll#ciekfmkddl",
+"lllcdddce.edddd.m.mjjjjjiiijjiijm.dekllkdddemmmjmmmm..mmm..cdcaliedhbbkabbkbbbbbbbbhccdnll.dc.m...mm.m.emmcdddce.eeeeedcdddflicl",
+"lncdddd.dddcdccdedcddddkejdmm.bincddgll.ddcach.ikbbhicnjfmbeddalhddjmjn.icacndacndhdiddillkddcheacncndnef.neb.gjh.hkhb.gcddhllll",
+"lajjjmmjjjjjmmj...m..mmmm...mmmjjm.jlll.ecc.c.e.mmecee.e..meeeblhddeeejc.cmcmdmdedcdedddglfe..m.mmjjmmjjj.jijiiiijiijijijmjjglll",
+"lllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllllfnnnnnfffffffffffgffgfnllllllllllllllllllllllllllllllllllllllll",
+"llllllllllfiiijkkhj.e.mjjighe.ee.ceceeee.m.e.ee.e.mme..eeeeccccceeeeeeeeeee..ee.llllllllke.mjm...mjjm..eeeccccec.hceeglfjeekllll",
+"lllk.dcjalmdddddddddddddddhcddddcecdddddddddddecdcbcdddcdddddcdddddddd..cdddddddmbi..iafddbllll#llllf.ddddddd.cdckdddnbddddd.#ll",
+"ll.ddddddmmddddc.cddddddddedddddiddddddddddddngn.dgjdda#cdddddddddddddgllmncdddddddddddddde..m.m.j#mddmddedddehehhdddjddddjddell",
+"lhdddddddddddddcb.ddddddddbdddddcdddddddddcdjkddaddfcf.cmc.lfhdddddcddajcdjcdddddcng#feddddddddccedddcjdbjdddde.l.ddddddddddddhl",
+"gdddddddddddddddddddddddddfeddddj.ddddcddddddddckddik#cd.e.ammdddddjddddddeddddddmhdnjnedciddcmdddddddd.nceddddclahdddddddddddml",
+"hddddddddddddddddddegcbdddekddd.addddcajdddddddcmdddfhddddejdddddddccdddddddddddddddbddcdcedcddddddddddcdhedddddae.dddddddddddcl",
+"iddddddddddddddbddddmdeddddccdikdddddehmdddddddccddd.dc.dd.lakdddddd.ddddddddddddddcbdddddcfccjicddddddcbmddbkddj.ddddddddddddcl",
+"nddddddddddddddmdddddmdddddddeiddcddddcb...ddddjmiddddchdd.bijddddddneddddc.c.ddddeahddddddmbghd.jddcddccjmahddddcdddkddddddddjl",
+"l.dddddddddddddddddddddddddddcddddddddddjicenddiieddddcbddm.ddddddddjedddddcikddddddddddddddfcdalmdeadddddnidddddddddf.ddddddc#l",
+"lfdddddddhjdddddddddddcngj.ddddedddddddddddccdddcdddddcaddjeddddddddddddddddddddddddddddgjdddd.bmedddddddddddddddddddf#edddde#ll",
+"lgjddddddhccccee..mmminllllfhjnlfmmmjeddd.cdedddd..mmjhl#gl#gnkdddhffffnijmjihi.edddddddjbcmiijji#ahbkkkkbbbkhjjmjmmcdcddddddehl",
+".dddddddddc#lllllllllllllllllllllllllbddclkcldid.lllllllllllllmdddmllllllllllllllcddddddedhlllllllllllllllllllllllllidddddddddjl",
+"eddmddddddellllllllllllllllllllllllllkdddbgei.hd.llllllllllllidddddmlllllllllllledddddddcdkllllllllllllllllllllllllljdddddddddil",
+"edd.ddddddellllllllllllllllllllllllllkdccddddmkdmlllllllllllidddddddhlllllllllllddddddddddbllllllllllllllllllllllllliddeddddddbl",
+".dddddddddellllllllllllllllllllllllllmd.gmdcdkndhllllllllll.dddddddddklllllllllidddddddddeglllllllllllllllllllllllllhddgeddeedhl",
+".ddddddddd.lllllllllllllllllllllllll#dddccdcddcdbllllllll#mdddddddd.jd.llllllll.dddddddddcillllllllllllllllllllllllljddgfkcaadjl",
+"mddddde.dd.lllllllllllllllllllllllllbdddcdddddddgllllllllmdcdcddejalhddglllllllhddddddddddc#lllllllllllllllllllllllljddackllbdml",
+"mdddddcedd.lllllllllllllllllllllllllhdddcdddddddgllllllledddddddiaheddcgllllllladddddddddddblllllllllllllllllllllllljddhddhfcdml",
+".dddcmcdddelllllllllllllllllllllllll.ddd.ddddddd#llllllmdddddn.dddddddellllllllgdddddddddddillllllllllllllllllllllllmddbcddddd.l",
+"edddc#kcddelllllllllllllllllllllllllcdddcddddddjlllllljddddddgmdddddddckm.alllllcddddddcdccellllllllllllllllllllllll.ddkcdcdddml",
+"eddddicdddcllllllllllllllllllllllllkdddddddddddglllllmdddddddadddddddddddddbllllmdddcdchdejdlllllllllllllllllllllllljdd.ddddddjl",
+"edddddedddcllllllllllllllllllllllllcddddddddjdelllllmddddddddedddddcddddddddklllfddddddmddkdblllllllllllllllllllllllmdddddddddil",
+".dddddddddc#llllllllllllllllllllllfddddddddcjdillllmdddddddddddddddddddddddddfllledddddimdadcllllllllllllllllllllllljdddddddddhl",
+"menanijjedcgllllllllllllllllllllllmdddddddddddflll#cdddcddddddddddddddddddddddnllidddddindkddbllllllllllllllllllllllidddddddddbl",
+"mmbeeedccddklllllllllllllllllllllkdddddj##iddell#.h.dd.bdddfjdddddddddddddddddcnllcdddjm.dcddc#lllllllllllllllllllllidmb.kcdddnl",
+"jmmcdddddddbllllllllllllllllllllgcddddcbcjfaebl#mdddddeadddcdddddddejdddddddddddfladdjmeddddddilllllllllllllllllllllbdc#jlcdcall",
+".jmddddddddblllllllllllllllllll#cddddd.cdddefllcdddddddfddddddddddda#ddddddddddddfldd.ddddddddd#llllllllllllllllllllhddac#dddfll",
+".hcdddeddddhlllllllllllllllllll.ddddddddddddb#mddddddddkbdddddddddi#kidddddddddddiladdeddddddddcnlllllllllllllllllllbddedidddcbl",
+"jhdddeedddcglllllllllllllllllljddddddddddddel.dddddddddblhcddddddcn.djeddddddddddg#g.ddddddddcddmlllllllllllllllllllbddddddddd.l",
+"imdddkddddilllllllllllllllllljdddddddddddddheddddddddd.#j#lhcddddmcdddddddddcddddddddddddddddddddklllllllllllllllllladddddddddel",
+"idddcbddddcllllllllllllllllljdddckiddddddddcddddddddddhndcancdddddddddddddddfjddddddddddddddddddddnlllllllllllllllll#ecddddddd.l",
+"hddddcdddddallllllllllllll#.dddddcncdddhddddddddddddddbkddfdddddddddddddddd.gddddddddddddddddcmcdddbllllllllllllllll#.ddddddddel",
+"kddddddddddflllllllllllllgddddddddbddddiddddddddddddddbmd.addddddddddddddddj.ddddddddddddddddekdddddalllllllllllllllkdddddddkdel",
+"amjhkkkbbieallllllllllllhcdddddddmbdddedcbdddddc.cddddk.djjddddddddddddddddddddddddddddddddddecddddch.blllllllllllllkdcdddddcdel",
+"amka##lahk.kllllllllllf.dddddddddbh.jiddmgddddj#l#mdddh.d..ddddddddddddddddddddddddddddddddddcembddddddekgllllllllllhddiedddddcl",
+"nddjkda.dddbllllllllljdddcddmiddddmjddddd.dddmllllljddm.de.ddddddddddddddddddddddddddddddddd.gmehdddddddddefllllllllhddfkdddddcl",
+"nddedddcdddhllgnfnj.edddddenfhdcdddddddddddddalllllgddddddeddddddddddddddddddddddddddddddiabmcddcdddddddddddcma#llllkdddddddddel",
+"fdddcdddddddccddddddcdddd.fmckdddddddddddddddflllllledddddddddddddddddddddddddddddcddddd.#mddddddddddddcdddddddddmhkedddddddddel",
+"nddddddddddddddddddcccddddddeadddddddddddddddhlllllleddddddddddmddddddddddddddddddhdddddbcdddddddddedkllbdddddddddddddddbfglllll",
+"ndddddddddddcdddddddddddddcbngcddddddddddddddc#lllladddddddddddbdddddddddddddddmddimddddaddekdddjddkiacenmddd.iddddddddda#eeecml",
+"nddddddddddddddddddcmdddddcmdkmdddddddddddddedilllg.ddddddddddcgdddddddddddddddndd.l.dddeddj.ddddddhlcddddd.nf.dddddddddckbcddel",
+"fdddddemddddddddddddddddddddddadddddddddddcnlmdeecddddddddddddel.ddddddddddcddc#ddcl#edddddddddddddd.jddddd#mdddddddddddddigdd.l",
+"ndddddddddddddddddddddhcddddddmcdddddddddd.llkddddddddddddddddelidddddddddddddc#.efamddddddddddddddddddddddddddcmdddddddcddbidel",
+"fddi.ddddddddddddddddegmdddcmacdddddddddddcfl.ddddddddddddddddmlbddddddddddddddgffiddddddddddddddddddddddddddddjkdddddddbmdjgdel",
+"ledddddddcdddddddddddjcdddc##ddddddddddddcddddddddddddddddddddjladdddddddddddddhncdddddddddddddddddjjddacddddddceddddddddddmgdel",
+"lkddddmddddddddddcdddddchfl#.dddddddddddkgddddddddddddddddddddilfdddddddddddddddddddddddddddmjdddddcffalcddddddddmhjdddjdddmnd.l",
+"#dddddhdddddddjdefedcei#lllhdddddddddddd.mddddddcdddddddddddddhlgdddddeaddddddddddddddddddddbiddddddc#llgiecdddddeibeddnmddn.del",
+"ljddddddddddcilmnlf#lllllll#.dddddddddddddddddddnjddddddddddddkl#dddddcledddddddddddddddddddnnddddddddglllllficcdddddddd#inbddcl",
+"laddcmdddddhlllllllllllllkc.aeddddddddcddddddddde#bdddddddddddkl#dddddclmddddddddddddddddddda#ddddddddmlllllllll#fnkmddd.bjddd.l",
+"gdddkddddddklllllllllllljdddeiddddddddc.dddddddddmlkdddddddde.nlleddddclmdddchhdddddddddddddhlidddddddd.#llllllllllladdddcebnd.l",
+"fdddjddddddklllllllllll.dddddddddddddddicdddddddddnlfddddci#llllllgkcdml.dd.##cdddddddddddddelleddddddddclllllllllllnddde#lllccl",
+"gdddjidddddblllllllll#jddddddddddddddde.ddddddddddc#lg.ca#lllllllllllnffdca##edddddddddddicddabdddddddddd.#llllllllladddddehmdel",
+"#dcddhcddddallllllll#.ddddddddddddddddbddddddddddddjllfflllllllllllllllgmflljcddddddddddel.dddddddddddddddelllllllllbdci.cieddcl",
+"#dddddaddddhlllllll#dddddddddddddddddmddddddddddddddhllllllllllllllllllllllhdddddddddddd.icdddddddddddddddde#llllllladddddddddd#",
+"#hkkecfkdddkllllll#.dddddddddddddddddbddddedddddddddelllllllllllllllllllllkcddddieddddddddddddddddddddcddddde#lllllladdddddddddg",
+"#.eecddddddallllll.ddddddddddddddddddedcddmdddddddddhllllllllllllllllllll#cddddc#iddddddddddddddddddddhmddddif#lllllfcddddecddd#",
+"nddddddddddnlllllmcdcdddddddddddddddddddddcddddddddclllllllllllllllllllllladdddddd.edddddd..dddddddddedc.ddkhdcglllllfdddcl#hdd#",
+"ndddddddcddflll##fdddddddddddddddddddddddddddddddddblllllllllllllllllllllllmddddddbcddddddcdddddddddddddeiihdddegllllbddddamcddl",
+"gddddddddddfll#e.ndddddddddddddddddddddddddddddddddgllllllllllllllllllllllladddddddddddddddddddddddddddddigdddddelllkddddc.addc#",
+"#cdddddddddflndcddddddddddddddddddddddddddddddddddd#lllllllllllllllllllllll#cdddddddddddddddddddddddddnddacdddddde#lbdcdilgldddg",
+"lcdaedeicddfbcdddddddddddddddddddddddddddddddddcejbllllllllllllllllllllllllledddddddddddddddddddddddddnddidddddddd.#hcndn..edddl",
+"#ddedddedddmdddddddddddddddddddddddddddddde.iaf#llllllllllllllllllllllllllllkecccdddddddddddddddddddddkddddddddddddeec.cmdddddbl",
+"#cdd.dddddddddddddddddddddddddddddddddddcklllllllllllllllllllllllllllllllllllllllgniedddddddddddddddddddddddddddddddddddddmacdml",
+"#cddcdmmdddajddddddddddddddddddcddddddddddccc.mihkblllllllllllllllllllllllllll#g#akmcddddddddddddddddddddddddddddddddddijdelmdel",
+"lmdddddkdddnlmddddddddddddddddhiddddddddddddddddddd#llllllllllllllllllllllllkedddddddddddddddddddddddddddddddddddddheddnfddnedel",
+"nddddddceddnlljddddddddcddddddgiddddddddddddddddddd#llllllllllllllllllllllllcdedddddddddddddcdddddddddddddddddddddhledddn.diedel",
+"bddddddddddflll.ddddddccdddddd#ndddddddddddddddddddnlllllllllllllllllllllllfdddddddddddddddeleddcddddddddddddddddkllbcddceddddcl",
+"kdddddddddc#lll#edddddidddddddll.ddddddddddddddddddilllllllllllllllllllllllidddddddddddddddc.dddhbjdddddddddddddjllllkddddddddcl",
+"hddddddddddgllll#cdddaiddddddd#l#cddddddddddddddddddbllllllllllllllllllllllcdddddddddddddddddddddcbddddddddddddkllllnddddddddddg",
+"hddddcde.dc#lllll#.dibddddddddhlleddddddddceddddddddc#llllllllllllllllllllmddddddddddddddddddddddcedddddddddehblllllhdeacdddced#",
+"hddddcd.hdc#llllll#aledddddddddagcddddddcb#l#bcddddddmllllllllllllllllllladdddddddddddddddddddddd.cddddddddddglllllljdmlhdddc.dl",
+"hdddcdddddclllllllllmddddddddddddddddddddccenlfdddddclllllllllllllllllllliddddddddddddddddddddddehddddddddddillllllljddccddddmd#",
+"bdddi.ddddd#llllllllgcdddddddddddddddddddddddb#dddddjllglllllllllllllllll#ddddddddddcdddddddeddcedcedddddddkllllllllidddddddcidg",
+"hddddccdddd#lllllllllncddddddddddddddddddddddc#dddde#lnccallllllllllllafllkdddddddddmdddddddeddddddecdddddmlllllllllbdddddccmkd#",
+"iddddeedddd#llllllllll#cddddddddddddddddddddddaddddflnddddbf#lllllllhcddbllmddddddddddddddddmdddddddjdddchllllllllllidddddj#lid#",
+"idddd.fmeiallllllllllll#edcdddddddddddddddddddcdddhladddd.gddelll..cddddcklfdddddddddddddddddddddddddmdcglllllllllllcdddcdddmjd#",
+"iddddccdddclllllllllllllfcdddddddddddddddddddddddelbdddddbndddglgdddddddddhlhddddddddddddddddddddddddkimlllllllllllleddddddd.icl",
+"iddddmddddd#lllllllllllllgddddddddddd.dddddddddddbhdddddd#jdddalfdddddddddd.fddddddddcddddddddddddddddglllllllllllll.dddmddd.id#",
+"jddd.cdddddchaa#llllllllllfeddccddddd.fjcdddddddmkddddddifcdddklbdddddddddddcmdddddd.cdddddddddddddddallllllllllllll.dddkdddc.d#",
+"mdddddddddddddddc.ag#llllllljcncddddddcgfieeedddddddcjm.#kddddklidddddddddddddddddddcdddddddddddddddhlllllllllllllll.e..ndddddcl",
+"iddddcdddddddddddddddeifllllll.ddddddddddmb#gcddddddekgllleddd.l.ddddddddddddddddddddddecddddddddddnllllllllllnhjmc.#lll#dddddd#",
+".dddddcd.cdddcfcddddddddciflll.ddddddddddddddddddddddddbl#kddde#cddddddddddddddddddddddbeddddddd..fllllll#ajedddddddceceeddddcml",
+".dddmdde#eddddcjddddddddddd.nlkdddddddddddddddddddddccc#bcidddc#cddddddddddddddddddddddiddddddddnlllll#amcddddddddddddddddddefg#",
+"jdddccdddddddddddddddddddddddcgndddddddddddddddddddmgmll.ddddddaddddddddddddddddddddddneddddddddalllacdddddddd.njdddddddcmdddddf",
+"bimm.ecddddddcddddddddddddddcddmcdddddddddcddddddddmbdcb#cdddddcdddddmaddddddddddddddc.ddddddddi#fjedddecdddefhedddddddddedi.ddn",
+"fll#llkddddddddddddddddddddcfddddddddddddjfcdddddddejdddkjdddddddddddalicdddddddddddejdddddddddf.dddddhiddddm#ccddddd.iddcdddddb",
+"jjkcddddddddddddddddddddddd.adddddddddddbljddddddddddddddddddddddddddnllidddddddddddeddddddddddddddddddddddddl#jddddd.idjfddddda",
+"icncddddddddddddddddddddhedccddddddddddd.ncddddddddddddddddddddddddddd.hcddddddddddddddddddddddddddidddddddddmedddddd.kdddddccda",
+"hddjddddddddddddddddddddniddddddddb.ddddddddddciddddddddddddddddddddddddddddddddddcdddddddddddddddmbddddddjcdcddddddddcddddcacdf",
+"kddcddddddd.m.dddddddddddcdddddddd.lmdddddddddkfdddddddddddddddddddddddddddddddddddddddddddddddddddddddddil.daedddddddddckg#cddg",
+"hddddddmhkflll#gnbjedddddddddddddmd..dddddddddkkddddddddddddddddddddddddddddddddddddddddddddddddddddddddmgacdcdb.mjjcddde#nedddg",
+"bddddddddd.lllllllllbeddddd.dddddjddddddddddddkmdddddddcdddddddddddddddddddddddddddddddddddddjmiddddddddecddcjallllledddddcdddda",
+"hdddddadddelllllllllll#hcddcddddddddddddddddddi.ddddddel.ddddddddddddddddddddddddddddddddddddcckhddddddddck#lllllllleddddddddddb",
+"hddmingdddelllllllllllll#hidddh.deddddddddddddemdddddddjddddddddddddddddddddddddddddddddddddddddbddmddcjnllllllllllleddddddddddn",
+"kdddddkdddelllllllllllllllndddenemddddddddddddddddddddddddddddddddddddddddcdddddddddddddddddddddkddddefllllllllllllleddddddddddg",
+"hdddddddddcllllllllllllllllkddddddddddddddemddddddddddddddddddddddddddddddcfjdddddddddddddddcddiiddcalllllllllllllllcdddddce.ddf",
+"bdddddddddclllllllllllllllllnddddddddcm.ddcg.dddddddddddddddddciddddddddddflnddddddddddddddddddhad.glllllllllllllllleda#kbf.dddf",
+"ndddddddd.illlllllllllllllllladddddddj#mdddhledddddddddddcdddegmddddddddddn#hddddd.mddddddddddddab#lllllllllllllllllcdegdckdccdg",
+"gdddcdaddiklllllllllllllllllllkdddddcachdddclledddccdddddaddb#eddddddddddddcdddddh#cddddddddddddmllllllllllllllllllliddamdicdidg",
+"#mddddbdddmlllllllllllllllllllljdddd.edncdddmlfdddhjdddddgngn.ddddddddddddcdddddjlhddddddddcdddcflllllllllllllllllllgcdchdccdcdf",
+"#eddddhcdd.llllllllllllllllllll#.ddddddnkddddglfcdgadddddgacdddddddddddddelhdddml#ddddddmcdddddfllllllllllllllllllllljddeddddddf",
+"fddddddcddellllllllllllllllllllllmdcdddjlcdddhllgklbdddddbcddddddddddddddj#cddilliddddddciddddjllllllllllllllllllllllfddddddcddn",
+"fdddmihcdd.llllllllllllllllllllllfcdddddiddddelllllmdddddhmdddddeddddddddccddm#lledddddddddddmllllllllllllllllllllllmcdddddddddn",
+"gdddkaniddelllllllllllllllllllllllhddddddcddddallllcdddddmndddcaidddddddddddelllfddddddddddddfllllllllllllllllllllllcdddcdehddda",
+"fdddbcddddmlllllllllllllllllllllllgdddddddcbdd.llllfddddddfdd.lmddddddddccdmlllljdddddddddddhlllllllllllllllllllllllcddddddaddda",
+"nddcadddddjlllllllllllllllllllllllliddddddekddclllllndddddmhdcmddddddcddddm#llllcddddddddddcllllllllllllllllllllllllcdddaedidddn",
+"nddd.mdddklllllllllllllllllllllllll#cddddddddddflllllncddddgedddddddmmddd.lllllfdddddjcddddhllllllllllllllllllllllllcdddeddddddn",
+"fddddmdddelllllllllllllllllllllllllljdddddccdddhllllllndcdddacddddddn.ddhllllllfdddddeddddclllllllllllllllllllllllllcdddddddddda",
+"gddddcddddfllllllllllllllllllllllllladddddfbdddcllllllladddd.ncdjddd#idilllllllkddddddddddillllllllllllllllllllllllleddddddddddn",
+"gdddddddddhlllllllllllllllllllllllll#cddddmgdddd#llllllladdddjlj#dddjlfllllllllnccddddddddnlllllllllllllllllllllllllcdddddddddda",
+"fdddddddddmllllllllllllllllllllllllll.ddeddbjccdflllllllladdddm#gddddglllllllllmcddddddddclllllllllllllllllllllllllleddheddddddn",
+"fdddicccdc.llllllllllllllllllllllllllhddddde#eddnlllllllllhddddemddcflllllllllbddddddddddellllllllllllllllllllllllllcddkghedddda",
+"fdddajdeddclllllllllllllllllllllllllladcddcdmbddblllllllllledddddddflllllllllliddddddddddjlllllllllllllllllllllllllledddcjeddddn",
+"adddanddddellllllllllllllllllllllllllfdeedekgfedilllllllllll.dddddfllllllllllljdddddddddd#lllllllllllllllllllllllllledddddddddda",
+"bdcdj.ddddcllllllllllllllllllllllllllfddddddcdddmlllllllllllgeddcallllllllllllmddddddddddkllllllllllllllllllllllllll.ddddddddddf",
+"kdddddddddcllllllllllllllllllllllllllfdddddddddd.llllllllllllgddkllllllllllllleddddddddddalllllllllllllllllllllllllleddddddddddf",
+"gihedddddmccejmmjihbannbaakbkbnffggffidd.cddddddmlnnffffnbknab.cbffg##l###lll#cddddddddddm#llll#fnngllllijhkbkhjm.ecdijddddd.bbl",
+"llgedddddnhdddddddddddddddddddddddddddddm.ddddddemdddddddddddddddddddccdccccecdddddddddddddc.lgeddddddciddddddddddddd#bdddddenll",
+"l#cdddddddjddddcccddddcdddddeddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddneddddddddncddddddddddddhddddddddnl",
+"lhddddddddddd.lnmcddddddddd.#cddddddddddddcddjadddddddddddddddddddddddddddddddd..ddddddddddddddddcdddbngddddacceedddddddddddddml",
+"lcddddddddddd.l.dddddddj.dd.#ddddddddddddddd.fikijddddjiddddddddddddddddddddddcfjddddddddddddddddcdddemfddmdikddddddddddddddddd#",
+"lddddddddddddcleddddddclaccj#dddddddddcddddcledddaddddddfjdddddkedddddd.cdddddd.idddddddcddddddddddddd.ndd.kdiedddddddddddddddc#",
+"leddddddddddddjmddcdddelgbbbhddddddmaniddddbnaeddjdddddddcddddeladddddcndddcddjljdddddmnadddddefgeddddendddkicadceedddddddddddel",
+"liddddddddddddd.ddcbacckddddddddddei.dddddddc#jdcjdcdddddddcdd.l#cdddeee.ddcddh#hdddddeeiddcddddddddddcinmdc.dn.h#.ddcddddddddhl",
+"l#ddddddddmdddddddddcdddddddddddiddddddddddefbddddddddddchghddc#lbddddifndddddddcdddddddidddjjddddddddddddddddab.hcddadddddddd#l",
+"ll#.dddddffddddddddddddddddddjdcl.ddddddddddcddddddddddddccdddddccdddddcabddddddddddddddhddddcddddccdddddddcdddddcdddg#.ddddegll",
+"llllfkik#l#.cddddddddceccjkem#..fg.ceeccccddccdccccddddddcceeee..m.ecccem#eecceeccccdddcbccccccdcdaicceeccccccccedddd#llgaafllll",
+"lllllllllllllgfg#gllllll#lllllllllllllll#l##l###lllgfgf##llllllllllllllllllllllllllll##ll#llll####lllllllllllllllabnalllllllllll"
+};
diff --git a/hacks/images/mac.xbm b/hacks/images/mac.xbm
new file mode 100644 (file)
index 0000000..b4fe876
--- /dev/null
@@ -0,0 +1,10 @@
+#define mac_width 19
+#define mac_height 25
+static unsigned char mac_bits[] = {
+   0x00, 0x00, 0x00, 0xfe, 0xff, 0x03, 0x06, 0x00, 0x03, 0xfa, 0xff, 0x02,
+   0xaa, 0xaf, 0x02, 0xda, 0xdf, 0x02, 0xaa, 0xaf, 0x02, 0xfa, 0xf8, 0x02,
+   0xfa, 0xff, 0x02, 0x7a, 0xf0, 0x02, 0xba, 0xef, 0x02, 0xda, 0xdf, 0x02,
+   0xfa, 0xff, 0x02, 0x06, 0x00, 0x03, 0xfe, 0xff, 0x03, 0xfe, 0xff, 0x03,
+   0xfe, 0xff, 0x03, 0xf2, 0x07, 0x02, 0xfe, 0xff, 0x03, 0xfe, 0xff, 0x03,
+   0x00, 0x00, 0x00, 0xfc, 0xff, 0x01, 0xfc, 0xff, 0x01, 0xfc, 0xff, 0x01,
+   0x00, 0x00, 0x00};
diff --git a/hacks/images/matrix.xbm b/hacks/images/matrix.xbm
new file mode 100644 (file)
index 0000000..9d29751
--- /dev/null
@@ -0,0 +1,394 @@
+#define matrix_width 56
+#define matrix_height 837
+static char matrix_bits[] = {
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xbf,0xf7,0xff,0xff,0x7b,0xff,
+ 0xff,0xaf,0xc8,0xff,0xff,0x4d,0xfd,0xff,0x0f,0x22,0xff,0x7f,0x75,0xfb,0xff,
+ 0x17,0x89,0xff,0xff,0xda,0xf5,0xff,0x47,0x25,0xfe,0xff,0xfd,0xfb,0xff,0x0b,
+ 0x1f,0xff,0x7f,0xfa,0xf2,0xff,0x85,0x17,0xfe,0xbf,0xfd,0xf5,0xff,0x45,0x9d,
+ 0xfe,0x7f,0xf5,0xf7,0xff,0x52,0x17,0xfd,0xaf,0xfd,0xe9,0xff,0x81,0x1f,0xfe,
+ 0xbf,0xfe,0xf7,0xff,0x4a,0x2d,0xfa,0xbf,0xfa,0xe9,0xff,0xa1,0x1f,0xfd,0xbf,
+ 0xfd,0xf7,0xff,0x92,0x2e,0xfc,0xdf,0xda,0xe9,0xff,0x85,0x9b,0xfe,0x7f,0xfd,
+ 0xf7,0xff,0x52,0x0f,0xfe,0xdf,0xfa,0xf2,0xff,0x85,0x3d,0xfe,0xff,0xfa,0xfb,
+ 0xff,0x47,0x8f,0xfe,0x7f,0xf9,0xea,0xff,0x0b,0x15,0xfe,0xff,0xdd,0xf5,0xff,
+ 0x87,0x0b,0xff,0x7f,0x75,0xfb,0xff,0x17,0xad,0xfe,0xff,0xff,0xfe,0xff,0x5f,
+ 0xa1,0xff,0xff,0x4b,0xff,0xff,0x5f,0xd4,0xff,0xff,0xff,0xff,0xff,0x77,0xeb,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xfd,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xef,0xff,
+ 0xff,0xff,0xf4,0xff,0xff,0x57,0xff,0xff,0x3f,0x90,0xff,0xff,0x4b,0xfd,0xff,
+ 0x7f,0x48,0xff,0xff,0xa7,0xff,0xff,0x7f,0xe8,0xff,0xff,0xcf,0xff,0xff,0x3f,
+ 0xe8,0xff,0xff,0xa7,0xff,0xff,0x7f,0xf8,0xff,0xff,0xcb,0xff,0xff,0x3f,0xfc,
+ 0xff,0xff,0xcf,0xff,0xff,0x7f,0xf8,0xff,0xff,0xc7,0xff,0xff,0x3f,0xfa,0xff,
+ 0xff,0xeb,0xff,0xff,0x7f,0xf8,0xff,0xff,0xa7,0xff,0xff,0x3f,0xfc,0xff,0xff,
+ 0xcf,0xff,0xff,0x7f,0xf8,0xff,0xff,0xe7,0xff,0xff,0x3f,0xfa,0xff,0xff,0xcb,
+ 0xff,0xff,0x7f,0xf8,0xff,0xff,0xcf,0xff,0xff,0x3f,0xfc,0xff,0xff,0xc7,0xff,
+ 0xff,0x7f,0xf8,0xff,0xff,0xd7,0xff,0xff,0x3f,0xfc,0xff,0xff,0xcb,0xff,0xff,
+ 0x7f,0xf8,0xff,0xff,0xcf,0xff,0xff,0x3f,0xf8,0xff,0xff,0xe7,0xff,0xff,0x5f,
+ 0xfa,0xff,0xff,0xad,0xff,0xff,0x3f,0xe8,0xff,0xff,0xd7,0xff,0xff,0x57,0xf5,
+ 0xff,0xff,0xff,0xff,0xff,0xbf,0xfa,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0x7f,0xfb,0xff,0xff,0xed,0xff,0xff,0x4f,0xad,0xff,0xff,0xb5,0xfa,0xff,
+ 0x0f,0x12,0xff,0x7f,0x79,0xfb,0xff,0x07,0x09,0xff,0xff,0xea,0xf5,0xff,0x97,
+ 0x2a,0xff,0x7f,0xfd,0xff,0xff,0x87,0x5e,0xff,0xff,0xf4,0xf5,0xff,0x4b,0x2b,
+ 0xff,0xff,0xfa,0xff,0xff,0x05,0xbf,0xff,0xff,0xfa,0xff,0xff,0x8b,0xfd,0xff,
+ 0xff,0xfa,0xff,0xff,0x47,0xf7,0xff,0xff,0xda,0xff,0xff,0x8f,0xfe,0xff,0xff,
+ 0xf5,0xff,0xff,0x27,0xfa,0xff,0xff,0xdb,0xff,0xff,0x1f,0xfd,0xff,0xff,0xee,
+ 0xff,0xff,0xaf,0xea,0xff,0xff,0x57,0xff,0xff,0x5f,0xf4,0xff,0xff,0xef,0xff,
+ 0xff,0x77,0xd1,0xff,0xff,0xbb,0xfe,0xff,0xaf,0xd4,0xff,0xbf,0x5f,0xfd,0xff,
+ 0xbb,0x42,0xff,0xff,0x75,0xfb,0xff,0x4f,0x29,0xff,0x7f,0xdf,0xfa,0xff,0x25,
+ 0x05,0xff,0xff,0x55,0xfb,0xff,0x97,0x40,0xff,0x7f,0xab,0xfa,0xff,0x2f,0x12,
+ 0xff,0xff,0x75,0xfd,0xff,0x8b,0x44,0xff,0xff,0xdf,0xff,0xff,0x7f,0xb5,0xff,
+ 0xff,0xff,0xff,0xff,0xef,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x5f,0xf5,0xff,0xff,0x55,0xff,0xff,
+ 0x8f,0xd2,0xff,0xff,0x7a,0xfd,0xff,0x17,0x44,0xff,0x7f,0x55,0xff,0xff,0x07,
+ 0xa3,0xff,0xff,0xf9,0xfb,0xff,0x4f,0xa9,0xff,0xff,0xfc,0xfe,0xff,0x05,0x57,
+ 0xff,0xff,0xda,0xff,0xff,0x8b,0xad,0xff,0x7f,0xf5,0xff,0xff,0x47,0xfa,0xff,
+ 0xff,0xba,0xff,0xff,0x0f,0xfd,0xff,0xff,0xea,0xff,0xff,0x0f,0xf5,0xff,0xff,
+ 0xd5,0xff,0xff,0x47,0xfc,0xff,0x7f,0xf5,0xff,0xff,0x17,0xf5,0xff,0xff,0xaa,
+ 0xff,0xff,0x05,0xfa,0xff,0xbf,0xfd,0xff,0xff,0x4b,0xfd,0xff,0xff,0xf6,0xff,
+ 0xff,0x25,0xfb,0xff,0x5f,0xfd,0xff,0xff,0x91,0xff,0xff,0xbf,0xfb,0xff,0xff,
+ 0xc5,0xb6,0xff,0x7f,0xdd,0xfb,0xff,0x15,0x5b,0xff,0xff,0xfd,0xfa,0xff,0xc7,
+ 0x0d,0xff,0xff,0x76,0xfb,0xff,0x95,0x26,0xff,0xff,0xdd,0xff,0xff,0x5f,0x91,
+ 0xff,0xff,0x77,0xfd,0xff,0xaf,0xd4,0xff,0xff,0xdf,0xff,0xff,0x5f,0xd5,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0x5f,0xfd,0xff,0xff,0xd7,0xff,0xff,0x7f,0xfc,0xff,0xff,0xe5,0xff,0xff,0x17,
+ 0xf8,0xff,0xff,0xab,0xff,0xff,0xaf,0xf4,0xff,0xff,0xd7,0xff,0xff,0x2f,0xe8,
+ 0xff,0xff,0x55,0xff,0xff,0x9f,0xe4,0xff,0x7f,0xaf,0xfe,0xff,0x57,0xd0,0xff,
+ 0xff,0x55,0xff,0xff,0x2f,0xa2,0xff,0xff,0xaf,0xfa,0xff,0x5f,0x11,0xff,0xff,
+ 0x6a,0xfb,0xff,0x2f,0x44,0xff,0xff,0xad,0xf5,0xff,0x97,0x22,0xfe,0xff,0xd6,
+ 0xfa,0xff,0x2b,0x14,0xfd,0xff,0x55,0xeb,0xff,0x8f,0x48,0xfe,0xff,0x6a,0xf5,
+ 0xff,0x05,0x02,0xfa,0x7f,0x91,0xed,0xff,0x17,0x50,0xfd,0xff,0x4a,0xf5,0xff,
+ 0x03,0x08,0xfd,0x7f,0xeb,0xff,0xff,0x4d,0xd2,0xfe,0xff,0xb5,0xfe,0xff,0x2f,
+ 0xfa,0xff,0xff,0xef,0xff,0xff,0x57,0xed,0xff,0xff,0xfb,0xff,0xff,0xaf,0xfc,
+ 0xff,0xff,0xff,0xff,0xff,0x5f,0xff,0xff,0xff,0xef,0xff,0xff,0x7f,0xfd,0xff,
+ 0xff,0xff,0xff,0xff,0xdf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfd,0xff,0xff,0xff,0xff,0xff,
+ 0xaf,0xf6,0xff,0xff,0x55,0xff,0xff,0x5f,0xc1,0xff,0xff,0x5f,0xfd,0xff,0x97,
+ 0xa8,0xff,0xff,0xaa,0xfe,0xff,0x17,0x81,0xff,0xff,0x5f,0xfd,0xff,0x6f,0x62,
+ 0xff,0xff,0xf7,0xfe,0xff,0xbf,0x95,0xff,0xff,0x5f,0xfb,0xff,0xdf,0xa2,0xff,
+ 0xff,0xfe,0xfe,0xff,0xbf,0x4a,0xff,0xff,0x2b,0xfd,0xff,0xaf,0xa0,0xff,0xff,
+ 0xab,0xfe,0xff,0x17,0x80,0xff,0x7f,0x55,0xfb,0xff,0x4f,0xd5,0xff,0xff,0xfa,
+ 0xff,0xff,0x05,0xd2,0xff,0xff,0x6d,0xff,0xff,0x4b,0xf5,0xff,0x5f,0xf9,0xff,
+ 0xff,0x85,0xfe,0xff,0x7f,0xfd,0xff,0xff,0x13,0xf7,0xff,0xdf,0xf6,0xff,0xff,
+ 0xc5,0xfd,0xff,0xbf,0xfd,0xff,0xff,0x51,0xff,0xff,0xff,0xbe,0xff,0xff,0x8f,
+ 0xa5,0xff,0xff,0xf5,0xfa,0xff,0x4b,0x2b,0xff,0xff,0xfe,0xff,0xff,0x97,0x95,
+ 0xff,0xff,0xb7,0xfa,0xff,0xaf,0x4a,0xff,0xff,0xdf,0xff,0xff,0x5f,0xe5,0xff,
+ 0xff,0x7b,0xff,0xff,0x7f,0xd2,0xff,0xff,0xff,0xff,0xff,0xff,0xfd,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xdf,0xfe,0xff,0xff,0xeb,0xff,0xff,
+ 0x3f,0xfd,0xff,0xff,0xff,0xff,0xff,0xaf,0xfa,0xff,0xff,0xad,0xff,0xff,0x7f,
+ 0xe9,0xff,0xff,0xff,0xfe,0xff,0xbf,0xd2,0xff,0xff,0x2f,0xff,0xff,0xff,0xc2,
+ 0xff,0xff,0xff,0xfa,0xff,0x7f,0x2b,0xff,0xff,0xbf,0xfb,0xff,0xff,0x15,0xff,
+ 0xff,0xff,0xf5,0xff,0x7f,0x8b,0xfe,0xff,0x5b,0xf5,0xff,0x4f,0x11,0xfe,0x7f,
+ 0x6d,0xf1,0xff,0x97,0x04,0xff,0xff,0xa9,0xf4,0xff,0x0f,0x01,0xfe,0x7f,0xdd,
+ 0xf2,0xff,0x45,0x14,0xfe,0xff,0xf5,0xf5,0xff,0x0b,0x8b,0xfe,0xbf,0xfe,0xf5,
+ 0xff,0xc2,0x1d,0xff,0xdf,0xba,0xf7,0xff,0x2b,0x17,0xfe,0x7f,0xfd,0xf2,0xff,
+ 0x81,0x9d,0xfe,0xbf,0xff,0xfb,0xff,0x55,0x17,0xfe,0xff,0xfa,0xf5,0xff,0xa5,
+ 0x1b,0xff,0x7f,0xfb,0xf5,0xff,0x4b,0x8d,0xfe,0xff,0xbd,0xfa,0xff,0x0f,0x27,
+ 0xff,0x7f,0xf5,0xf7,0xff,0xcb,0x92,0xfe,0xff,0x7f,0xfd,0xff,0xaf,0xaa,0xff,
+ 0xff,0xd7,0xff,0xff,0x5f,0xd5,0xff,0xff,0x7f,0xff,0xff,0x7f,0xf5,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0x5f,0xf5,0xff,0xff,0xdb,0xff,0xff,0xef,0x96,0xff,0xff,0x7e,0xfd,0xff,0x1f,
+ 0x55,0xff,0xff,0xa9,0xf7,0xff,0x87,0x90,0xfe,0xff,0x74,0xf9,0xff,0x0f,0x0a,
+ 0xfd,0xff,0xd2,0xee,0xff,0x07,0x49,0xfe,0xff,0xfa,0xfb,0xff,0x17,0x55,0xff,
+ 0xff,0xad,0xff,0xff,0x4f,0xfa,0xff,0xff,0xfb,0xff,0xff,0x17,0xbd,0xff,0xff,
+ 0xee,0xff,0xff,0xaf,0xfa,0xff,0xff,0xd7,0xff,0xff,0x5f,0xfa,0xff,0xff,0xef,
+ 0xff,0xff,0x7f,0xfa,0xff,0xff,0xb7,0xff,0xff,0xbf,0xf8,0xff,0xff,0xef,0xff,
+ 0xff,0x7f,0xed,0xff,0xff,0xbf,0xff,0xff,0xbf,0xf4,0xff,0xff,0xef,0xff,0xff,
+ 0xff,0xea,0xff,0xff,0xbf,0xfe,0xff,0xff,0xe5,0xff,0xff,0x7f,0xff,0xff,0xff,
+ 0xe7,0xff,0xff,0x7f,0xff,0xff,0xff,0xd3,0xff,0xff,0xff,0xfd,0xff,0xff,0xa5,
+ 0xff,0xff,0xbf,0xfe,0xff,0xff,0xa7,0xff,0xff,0xff,0xfb,0xff,0xff,0x57,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0x2f,0xff,0xff,0xff,0xfb,0xff,0xff,0xbf,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0x5f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf5,0xff,0xff,0x6f,0xff,0xff,0xbf,0xd4,
+ 0xff,0xff,0xfb,0xff,0xff,0xaf,0x56,0xff,0xff,0xb6,0xfa,0xff,0x5f,0x29,0xff,
+ 0xff,0xfb,0xf5,0xff,0x87,0x8e,0xfe,0x7f,0xd9,0xf5,0xff,0x8f,0x12,0xfe,0xff,
+ 0xfd,0xf5,0xff,0x0f,0x1b,0xff,0xff,0x74,0xf3,0xff,0x07,0x15,0xfe,0xff,0xda,
+ 0xfa,0xff,0x97,0x8a,0xfe,0xff,0x6b,0xf5,0xff,0x0f,0x01,0xfe,0xff,0x15,0xf2,
+ 0xff,0x5f,0x20,0xff,0xff,0x56,0xf9,0xff,0x17,0x04,0xfe,0xff,0xab,0xea,0xff,
+ 0x4f,0x10,0xfd,0x7f,0xa5,0xf5,0xff,0x17,0x82,0xfe,0xff,0xda,0xf5,0xff,0x4f,
+ 0x28,0xfe,0xff,0xe9,0xf6,0xff,0x0f,0x16,0xfd,0xff,0xfd,0xeb,0xff,0x87,0x55,
+ 0xfd,0xff,0xb4,0xff,0xff,0x97,0x2e,0xfa,0xff,0xfb,0xea,0xff,0x0f,0x9b,0xfe,
+ 0x7f,0xf9,0xf3,0xff,0x47,0x1d,0xfd,0xff,0xfd,0xeb,0xff,0x97,0x16,0xfe,0xff,
+ 0xd7,0xfd,0xff,0x4f,0xab,0xfe,0xff,0x7d,0xf7,0xff,0x7f,0x55,0xff,0xff,0xff,
+ 0xff,0xff,0xbf,0xaa,0xff,0xff,0xb7,0xff,0xff,0xff,0xf7,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xe8,
+ 0xff,0xff,0x5f,0xff,0xff,0xbf,0xd6,0xff,0xff,0xf7,0xfd,0xff,0xaf,0x52,0xff,
+ 0xff,0xdd,0xf7,0xff,0x5f,0x2d,0xff,0xff,0xf5,0xfa,0xff,0x07,0x15,0xfe,0xff,
+ 0xfa,0xeb,0xff,0x97,0xae,0xfe,0xff,0xdd,0xfd,0xff,0x4f,0x1b,0xfa,0xff,0xfa,
+ 0xf7,0xff,0x8f,0xae,0xfd,0xff,0xfd,0xdb,0xff,0x47,0x5b,0xfc,0xff,0xf4,0xf6,
+ 0xff,0x0f,0x2f,0xfb,0xff,0xda,0xf7,0xff,0x8f,0x9a,0xfc,0xff,0xfa,0xea,0xff,
+ 0x87,0x2a,0xfe,0xff,0x55,0xfb,0xff,0x17,0x04,0xfd,0xff,0x50,0xe9,0xff,0x0f,
+ 0x81,0xfe,0xff,0xad,0xfa,0xff,0x07,0x14,0xff,0xff,0xd6,0xff,0xff,0x5f,0x50,
+ 0xff,0xff,0xeb,0xff,0xff,0x97,0xfc,0xff,0xff,0x57,0xff,0xff,0x3f,0xea,0xff,
+ 0xff,0xef,0xff,0xff,0xbf,0xe8,0xff,0xff,0xaf,0xfe,0xff,0x7f,0xe4,0xff,0xff,
+ 0x77,0xff,0xff,0xff,0xd2,0xff,0xff,0xbf,0xff,0xff,0x7f,0xd5,0xff,0xff,0xff,
+ 0xfd,0xff,0xff,0x57,0xff,0xff,0x7f,0xff,0xff,0xff,0xab,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xf7,0xff,0xff,0x7f,0xff,0xff,0xff,0xe2,0xff,0xff,
+ 0x5f,0xff,0xff,0xff,0xe5,0xff,0xff,0xbf,0xfe,0xff,0xff,0xd3,0xff,0xff,0x7f,
+ 0xff,0xff,0xff,0xe1,0xff,0xff,0xbf,0xfe,0xff,0xff,0xc7,0xff,0xff,0x7f,0xff,
+ 0xff,0xff,0xe1,0xff,0xff,0xbf,0xfd,0xff,0xff,0x97,0xff,0xff,0xff,0xfe,0xff,
+ 0xff,0x53,0xff,0xff,0xff,0xfb,0xff,0x7f,0xab,0xff,0xff,0x7f,0xff,0xff,0xdf,
+ 0x16,0xff,0xff,0xed,0xf5,0xff,0x5f,0xad,0xfe,0xff,0xff,0xfb,0xff,0xa7,0x3f,
+ 0xff,0xff,0xfa,0xfb,0xff,0x5b,0x8d,0xfe,0x7f,0xff,0xf7,0xff,0xa5,0x3f,0xff,
+ 0xbf,0xed,0xfa,0xff,0x92,0x8a,0xfc,0xaf,0xbe,0xa5,0xff,0xc9,0x0a,0xe2,0xbf,
+ 0xd6,0x52,0xff,0x20,0x02,0xd0,0x9f,0xbd,0xaa,0xff,0xa1,0x55,0xe8,0xff,0xff,
+ 0xff,0xfe,0xf5,0x56,0xf7,0xbf,0xff,0xff,0xff,0xf5,0xff,0xfd,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfb,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xff,
+ 0xff,0xff,0xff,0xff,0x7f,0xff,0xff,0xff,0xef,0xff,0xff,0xaf,0xfc,0xff,0xff,
+ 0xf5,0xff,0xff,0x2f,0xfd,0xff,0xff,0xdb,0xff,0xff,0x5f,0xfa,0xff,0xff,0xb7,
+ 0xff,0xff,0x7f,0xe9,0xff,0xff,0xdf,0xfe,0xff,0xbf,0xe4,0xff,0xff,0x7f,0xff,
+ 0xff,0xff,0xd2,0xff,0xff,0xdf,0xfd,0xff,0xff,0x4b,0xff,0xff,0x7f,0xf7,0xff,
+ 0xff,0x2d,0xff,0xff,0xff,0xfb,0xff,0xff,0x17,0xfe,0xff,0xff,0xf5,0xff,0xff,
+ 0x5f,0xff,0xff,0xff,0xf5,0xff,0xff,0x1f,0xfd,0xff,0xff,0xf7,0xff,0xff,0x17,
+ 0xfe,0xff,0x7f,0xfb,0xff,0xff,0xad,0xff,0xff,0xff,0xff,0xff,0xff,0x53,0xff,
+ 0xff,0xbf,0xfe,0xff,0xff,0xe5,0xff,0xff,0xdf,0xff,0xff,0x7f,0xea,0xff,0xff,
+ 0x6b,0xff,0xff,0xbf,0xf4,0xff,0xff,0xef,0xff,0xff,0x7f,0xfa,0xff,0xff,0xef,
+ 0xff,0xff,0x2f,0xfc,0xff,0xff,0xfb,0xff,0xff,0x9f,0xff,0xff,0xff,0xfd,0xff,
+ 0xff,0x57,0xff,0xff,0xff,0xff,0xff,0xff,0xdf,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0x7f,0xe5,0xff,0xff,0xb7,0xfe,0xff,0x5f,0xa9,0xff,0xff,0x7d,
+ 0xff,0xff,0x57,0x45,0xff,0xbf,0xbf,0xfa,0xff,0x55,0x53,0xfd,0xff,0x76,0xed,
+ 0xff,0xab,0x83,0xfa,0xbf,0xbf,0xf6,0xff,0xd1,0x51,0xfa,0x6f,0x7f,0xbf,0xff,
+ 0x6a,0xc7,0xfa,0xbf,0x7f,0xed,0xff,0xf1,0xa1,0xea,0xbf,0x7f,0xbf,0xff,0xf4,
+ 0xd7,0xea,0xdf,0xbe,0xf5,0xfe,0xd2,0x4b,0xd5,0xbf,0xff,0xdf,0x7d,0xf9,0xa5,
+ 0xca,0xaf,0xff,0xf5,0xfe,0xe2,0x1f,0xa6,0x7f,0xff,0xbb,0xff,0xb9,0x57,0xd5,
+ 0xaf,0xff,0xed,0xfd,0xe0,0x2f,0xca,0x7f,0xfb,0x77,0xff,0xf5,0x9f,0xea,0xbf,
+ 0xef,0xdb,0xff,0x97,0x3e,0xe9,0xff,0xfe,0x6f,0xff,0x6d,0xdb,0xf4,0xff,0xfb,
+ 0xbf,0xff,0x5f,0x7d,0xf9,0xff,0xef,0xff,0xff,0xff,0xff,0xfa,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0x7f,0x6d,0xfd,0xff,0xdf,0xab,0xff,0xbf,0x55,0xaa,0xff,0xbf,0xd6,
+ 0xfa,0xff,0x24,0x50,0xff,0xf7,0xd7,0xff,0x7f,0x5b,0xda,0xff,0xff,0xd7,0xff,
+ 0xff,0x57,0xe8,0xff,0xff,0xdb,0xff,0xff,0xbf,0xfc,0xff,0xbf,0xcf,0xff,0xbf,
+ 0x5a,0xb4,0xff,0xf7,0x6b,0xff,0xbf,0x5e,0xd8,0xff,0x7b,0xd7,0xfd,0x5f,0x25,
+ 0xea,0xfe,0xef,0xcb,0xff,0x3f,0x5d,0xb4,0xff,0xff,0x6f,0xff,0x7f,0x2b,0xd4,
+ 0xfe,0xff,0xd5,0xfb,0xff,0xbf,0xe8,0xff,0xdf,0xd7,0xff,0x7f,0x2b,0x7a,0xff,
+ 0xff,0xd7,0xff,0xff,0x7f,0xf8,0xff,0xff,0xef,0xff,0xff,0xbf,0xfc,0xff,0xff,
+ 0xd7,0xff,0xff,0x7f,0xfa,0xff,0xff,0xef,0xff,0xff,0x7f,0xfc,0xff,0xff,0xd7,
+ 0xff,0xff,0x7f,0xfa,0xff,0xff,0xef,0xff,0xff,0x7f,0xfc,0xff,0xff,0xd7,0xff,
+ 0xff,0xbf,0xf8,0xff,0xff,0xdf,0xff,0xff,0x7f,0xfa,0xff,0xff,0xe7,0xff,0xff,
+ 0x7f,0xf4,0xff,0xff,0xdf,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xff,0xff,
+ 0xff,0xff,0xff,0xbf,0xfe,0xff,0xff,0xef,0xff,0xff,0xff,0xfe,0xff,0xff,0xef,
+ 0xff,0xff,0x7f,0xfc,0xff,0xff,0xef,0xff,0xff,0x7f,0xfc,0xff,0xff,0xef,0xff,
+ 0xff,0x7f,0xfd,0xff,0xff,0xef,0xff,0xff,0x7f,0xfc,0xff,0xff,0xef,0xff,0xff,
+ 0x7f,0xfd,0xff,0xff,0xef,0xff,0xff,0x7f,0xfc,0xff,0xff,0xeb,0xff,0xff,0xbf,
+ 0xfc,0xff,0xff,0xdf,0xff,0xff,0x7f,0xfc,0xff,0xff,0xef,0xff,0xff,0xbf,0xfc,
+ 0xff,0xff,0xef,0xff,0xff,0x7f,0xfc,0xff,0xff,0xd7,0xff,0xff,0x7f,0xfd,0xff,
+ 0xff,0xef,0xff,0xff,0x7f,0xfa,0xff,0xff,0xef,0xff,0xff,0x7f,0xfc,0xff,0xff,
+ 0xdf,0xff,0xff,0xbf,0xfa,0xff,0xff,0xef,0xff,0xff,0xff,0xf4,0xff,0xff,0x7f,
+ 0xff,0xff,0xff,0xea,0xff,0xff,0x7f,0xff,0xff,0xff,0xe3,0xff,0xff,0xbf,0xff,
+ 0xff,0xff,0xd5,0xff,0xff,0xff,0xfe,0xff,0xff,0xf7,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xbf,0xff,0xff,0xff,0xff,0xff,0xff,0xdf,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xaf,0xaa,0xfe,0xff,0x55,0xf5,0xff,0x5f,0x95,0xfa,0xff,0xff,0xdf,
+ 0xff,0x2f,0x52,0xf9,0x7f,0xd9,0xb6,0xff,0x8f,0xad,0xfa,0xff,0xf6,0xdf,0xff,
+ 0x97,0xb6,0xf0,0xff,0xfb,0xab,0xff,0x0f,0x55,0xfa,0xff,0xac,0xde,0xff,0xa7,
+ 0x54,0xf1,0xff,0xd7,0xaa,0xff,0x17,0x02,0xf8,0xff,0xb4,0xaa,0xff,0x8d,0x54,
+ 0xf2,0x7f,0xab,0xd5,0xff,0x43,0x82,0xe8,0xbf,0xdd,0x6a,0xff,0x29,0x11,0xf4,
+ 0xaf,0xb6,0xda,0xff,0x05,0x8a,0xea,0x7f,0x6b,0xeb,0xff,0xaa,0x24,0xfa,0xff,
+ 0xbd,0xb1,0xff,0x57,0x09,0xfa,0xff,0xd6,0xed,0xff,0x8f,0x14,0xfd,0xff,0x7b,
+ 0xf5,0xff,0x2f,0x25,0xfa,0x7f,0xed,0xdb,0xff,0x8f,0x9a,0xfa,0xff,0xfa,0xff,
+ 0xff,0x4f,0xab,0xfa,0xff,0xdd,0xee,0xff,0x17,0xed,0xfe,0xff,0xf7,0xff,0xff,
+ 0x4f,0xb5,0xff,0xff,0x5a,0xff,0xff,0xaf,0xea,0xff,0xff,0xef,0xff,0xff,0x3f,
+ 0xf4,0xff,0xff,0xb7,0xff,0xff,0x5f,0xe9,0xff,0xff,0xcf,0xff,0xff,0x7f,0xf4,
+ 0xff,0xff,0x7f,0xff,0xff,0xbf,0xfa,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xaf,0xff,0xff,0xff,0xff,0xff,0xff,0xb7,0xff,0xff,0xff,0xfa,0xff,
+ 0xff,0x4b,0xff,0xff,0x7f,0xff,0xff,0xff,0xa5,0xff,0xff,0xdf,0xfa,0xff,0xbf,
+ 0x25,0xff,0x7f,0x75,0xfb,0xff,0x41,0x95,0xfe,0x5f,0xad,0xf5,0xff,0x01,0x08,
+ 0xff,0xbf,0xd5,0xfa,0xff,0x4a,0x25,0xfe,0xff,0x7a,0xf7,0xff,0x15,0x92,0xfe,
+ 0xff,0xcf,0xfb,0xff,0x97,0xa8,0xfa,0xff,0xea,0xde,0xff,0x4f,0x56,0xfd,0xff,
+ 0xaf,0xf7,0xff,0x3f,0xb8,0xfa,0xff,0xeb,0xdf,0xff,0xff,0xec,0xfa,0xff,0xdf,
+ 0xff,0xff,0x3f,0xfa,0xfb,0xff,0xef,0xff,0xff,0x7f,0xe9,0xfd,0xff,0x7f,0xff,
+ 0xff,0xff,0xed,0xff,0xff,0xbf,0xff,0xff,0x7f,0xe5,0xff,0xff,0xff,0xfe,0xff,
+ 0xff,0xdb,0xff,0xff,0xff,0xff,0xff,0xff,0xab,0xff,0xff,0xff,0xfd,0xff,0xff,
+ 0xef,0xff,0xff,0xff,0xff,0xff,0xff,0x5b,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xbf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xff,
+ 0xff,0xff,0xe7,0xff,0xff,0xbd,0xff,0xff,0x9f,0xf3,0xff,0xff,0xff,0xfe,0xff,
+ 0xaf,0xc5,0xff,0xff,0x5a,0xff,0xff,0x97,0xe2,0xff,0xff,0xbd,0xfe,0xff,0x4f,
+ 0xd3,0xff,0xff,0xba,0xfe,0xff,0x0f,0xc5,0xff,0xff,0x7b,0xff,0xff,0xa7,0xd1,
+ 0xff,0xff,0x5c,0xfd,0xff,0x8f,0x42,0xff,0xff,0x55,0xfe,0xff,0x8a,0x64,0xff,
+ 0x57,0xba,0xfa,0x3f,0x05,0x41,0xfd,0xef,0x29,0xd5,0xbf,0x44,0x80,0xfa,0x7b,
+ 0xb5,0xfe,0xbf,0x0a,0x45,0xfd,0xef,0xba,0xfa,0x7f,0x47,0xa1,0xfe,0xff,0x6d,
+ 0xff,0xff,0x17,0xa5,0xff,0x7f,0x7d,0xfd,0xff,0x8f,0x53,0xff,0xff,0xbb,0xf7,
+ 0xff,0xaf,0x4a,0xff,0xff,0xfd,0xfd,0xff,0x8f,0x55,0xff,0x7f,0x75,0xfb,0xff,
+ 0x4f,0x2b,0xff,0xff,0xfd,0xff,0xff,0x97,0x9f,0xfe,0xff,0xff,0xf5,0xff,0x4f,
+ 0x5f,0xff,0xff,0xfa,0xfb,0xff,0x97,0x2f,0xfe,0xff,0xfd,0xff,0xff,0xdf,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xaf,0xff,0xfa,0xff,0xff,0xdf,0xff,0xdf,0xff,0xfd,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xfe,0xff,0xff,0xef,0xff,0xff,0x7f,0xfd,0xff,0xff,0xf7,0xff,0xff,
+ 0x7f,0xfc,0xff,0xff,0xdf,0xff,0xff,0x7f,0xfa,0xff,0xff,0xe7,0xff,0xff,0xbf,
+ 0xf8,0xff,0xff,0xdb,0xff,0xff,0x5b,0xfc,0xff,0x7f,0xa7,0xff,0xff,0x2a,0x48,
+ 0xff,0x9f,0xad,0xf5,0xff,0xa1,0x24,0xfe,0xaf,0xc6,0xf6,0xff,0x10,0x10,0xfd,
+ 0x5f,0x6b,0xeb,0x7f,0x41,0x4a,0xfd,0x5f,0xd7,0xfd,0xff,0x34,0x28,0xfd,0xbf,
+ 0xcf,0xeb,0xff,0xa9,0x2c,0xfd,0x5f,0xe5,0xfe,0xff,0x20,0x94,0xfc,0x2f,0x57,
+ 0xeb,0xff,0x51,0x28,0xfe,0xbf,0xa5,0xf5,0xff,0x01,0x80,0xfa,0xdf,0xae,0xeb,
+ 0xff,0x6a,0x2a,0xfe,0xbf,0xd7,0xfe,0xff,0x35,0xb8,0xff,0xff,0xef,0xff,0xff,
+ 0xbb,0x5c,0xfd,0xff,0xd7,0xff,0xff,0x7f,0xf4,0xff,0xff,0xef,0xff,0xff,0xbf,
+ 0xfc,0xff,0xff,0xd7,0xff,0xff,0x7f,0xfa,0xff,0xff,0xef,0xff,0xff,0xbf,0xfc,
+ 0xff,0xff,0xff,0xff,0xff,0x7f,0xfd,0xff,0xff,0xef,0xff,0xff,0xff,0xfe,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xef,0xff,0xff,0x7f,0xff,0xff,0xff,0xd7,0xff,0xff,0xff,0xfd,0xff,0xff,
+ 0x53,0xff,0xff,0xbf,0xfe,0xff,0xff,0x45,0xfd,0xff,0x7f,0xf5,0xff,0xff,0x53,
+ 0xff,0xff,0x7f,0xff,0xff,0xff,0x85,0xfe,0xff,0xff,0xf2,0xff,0xff,0x2b,0xff,
+ 0xff,0xff,0xfb,0xff,0xff,0x97,0xfe,0xff,0x5f,0xf5,0xff,0xff,0x01,0xfe,0xff,
+ 0x7f,0xfd,0xff,0x7f,0x55,0xff,0xff,0x5f,0xf5,0xff,0xff,0x02,0xfd,0xff,0x7f,
+ 0xfb,0xff,0xff,0xa5,0xfe,0xff,0x5f,0xed,0xff,0xff,0x43,0xfd,0xff,0x7f,0xfd,
+ 0xff,0xff,0x92,0xfe,0xff,0xbf,0xea,0xff,0xff,0x45,0xfa,0xff,0x7f,0xdb,0xff,
+ 0xff,0x13,0xfa,0xff,0xff,0xed,0xff,0xff,0x85,0xfa,0xff,0x2f,0xf5,0xff,0x2f,
+ 0x25,0xfd,0xbf,0xf5,0xda,0xff,0xb5,0x10,0xfd,0x7f,0x97,0xfd,0xff,0x0a,0x8a,
+ 0xfe,0xff,0xfd,0xf7,0xff,0x6b,0x69,0xfd,0xdf,0xef,0xff,0xff,0xaa,0xbe,0xff,
+ 0x7f,0xff,0xdf,0xff,0xef,0xff,0xf9,0xff,0xff,0xff,0xff,0xf7,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xfd,0xff,0xff,0xef,0xff,0xff,0xbf,0xfe,0xff,0xff,0xff,0xff,0xff,0x7f,
+ 0xf9,0xff,0xff,0xcf,0xff,0xff,0x7f,0xfc,0xff,0xff,0xeb,0xff,0xff,0x7f,0xf4,
+ 0xff,0xff,0xaf,0xff,0xff,0x2b,0xd8,0xff,0xaf,0xa2,0xfd,0xff,0x21,0xa2,0xfe,
+ 0x3f,0x8b,0xf6,0xff,0x08,0x28,0xfd,0x9f,0x6a,0xfb,0xff,0x50,0x80,0xfe,0xbf,
+ 0xd7,0xee,0xff,0xa2,0xd4,0xfe,0xaf,0xbe,0xff,0xff,0x51,0x52,0xff,0xbf,0x6f,
+ 0xfd,0xff,0x68,0xd5,0xff,0x5f,0xbf,0xff,0xff,0xb3,0xa2,0xff,0xbf,0xfb,0xfe,
+ 0xff,0xd0,0xd3,0xff,0x7f,0x5f,0xff,0xff,0x6b,0xe5,0xff,0xdf,0x7d,0xfd,0xff,
+ 0xa9,0xa2,0xff,0x7f,0xb7,0xff,0xff,0x55,0xd5,0xff,0xff,0xfd,0xfe,0xff,0x0b,
+ 0xd5,0xff,0xff,0xd5,0xfb,0xff,0xa7,0xaa,0xfe,0xff,0xfa,0xff,0xff,0x17,0x3d,
+ 0xff,0xff,0xed,0xeb,0xff,0x8f,0x5e,0xfd,0xff,0xff,0xff,0xff,0x5f,0x7f,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xf7,0xff,0xff,0xbf,0xff,0xff,0xff,0x51,0x9f,
+ 0xfe,0xdf,0xfe,0xf5,0xff,0xea,0x5b,0xfe,0xbf,0xff,0xfb,0xff,0xb1,0x5f,0xfd,
+ 0xdf,0xfe,0xef,0xff,0xea,0x3e,0xfd,0xbf,0xff,0xf7,0xff,0xd1,0x57,0xfd,0x7f,
+ 0xff,0xdd,0xff,0x6a,0xaf,0xfa,0xaf,0xfb,0xf7,0xff,0xe9,0x3f,0xfd,0x7f,0xff,
+ 0xfb,0xff,0xb1,0x5b,0xfd,0xbf,0xff,0xdf,0xff,0xea,0x2f,0xfa,0xdf,0xfe,0xf5,
+ 0xff,0x69,0xbf,0xfd,0xbf,0xf7,0xef,0xff,0xe1,0x57,0xfc,0x5f,0xdf,0xf5,0xff,
+ 0xb5,0x2e,0xfb,0xbf,0xff,0xdb,0xff,0xa1,0x15,0xfd,0x7f,0x75,0xf5,0xff,0x54,
+ 0x95,0xfc,0x5f,0xdf,0xf7,0xff,0x43,0x15,0xfd,0xff,0xfd,0xed,0xff,0xb4,0x5b,
+ 0xfd,0xbf,0xff,0xfb,0xff,0xeb,0x5f,0xfe,0xdf,0xff,0xff,0xff,0xf2,0x7f,0xfb,
+ 0xff,0xff,0xff,0xff,0xff,0xbf,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xdb,0xfe,0xff,0x7f,0xed,0xff,0xff,0x55,0x53,
+ 0xfd,0xbf,0xb6,0xea,0xff,0x02,0x09,0xfa,0x5f,0x59,0xb5,0xff,0x41,0xa2,0xf4,
+ 0xff,0xb6,0xfe,0xff,0x17,0x91,0xfa,0xff,0x5b,0xf7,0xff,0x57,0x64,0xff,0xff,
+ 0xb7,0xfe,0xff,0x5f,0xd1,0xff,0xff,0x6f,0xff,0xff,0xaf,0xc2,0xff,0xff,0x5f,
+ 0xfd,0xff,0xff,0x65,0xff,0xff,0x7f,0xff,0xff,0xff,0xd2,0xff,0xff,0xbf,0xfe,
+ 0xff,0xff,0xe3,0xff,0xff,0x7f,0xff,0xff,0xff,0xd3,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xe5,0xff,0xff,0xbf,0xfe,0xff,0xff,0xd7,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xd3,0xff,0xff,0xff,0xfe,0xff,0xff,0xaf,0xff,0xff,0xff,0xff,0xff,0xff,0xb7,
+ 0xff,0xff,0xff,0xfb,0xff,0xff,0xbf,0xfe,0xff,0xff,0xff,0xff,0xff,0x5f,0xff,
+ 0xff,0xff,0xfb,0xff,0xff,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xbf,
+ 0x9c,0xfe,0xff,0xd7,0xf5,0xff,0x7f,0x5a,0xfe,0xff,0xef,0xf7,0xff,0xbf,0x2c,
+ 0xfd,0xff,0xdb,0xed,0xff,0x7f,0x3a,0xfd,0xff,0xef,0xfb,0xff,0x5f,0x98,0xfa,
+ 0xff,0xab,0xd7,0xff,0x77,0x4c,0xfc,0xff,0xd7,0xea,0xff,0x1f,0x28,0xf2,0xff,
+ 0x4a,0xab,0xff,0xa5,0x08,0xf9,0xff,0xd7,0xd5,0xff,0x17,0x52,0xe8,0xff,0x6b,
+ 0xbb,0xff,0x5f,0x14,0xfa,0xff,0xd7,0xed,0xff,0x7f,0xa8,0xfa,0xff,0xdf,0xf7,
+ 0xff,0xbf,0x2c,0xfd,0xff,0xe7,0xdb,0xff,0x7f,0xaa,0xfa,0xff,0xdf,0xf6,0xff,
+ 0x7f,0x38,0xfd,0xff,0xeb,0xdb,0xff,0xbf,0x4c,0xfa,0xff,0xcf,0xff,0xff,0x7f,
+ 0x3a,0xfd,0xff,0xef,0xeb,0xff,0x7f,0x94,0xfa,0xff,0xd7,0xf6,0xff,0x7f,0x5a,
+ 0xfd,0xff,0xef,0xdb,0xff,0x7f,0x14,0xfd,0xff,0xaf,0xf6,0xff,0x7f,0x54,0xfc,
+ 0xff,0xd7,0xf5,0xff,0x7f,0x08,0xfe,0xff,0xef,0xfb,0xff,0xbf,0xaa,0xfd,0xff,
+ 0xff,0xef,0xff,0xff,0xbe,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfb,
+ 0xff,0xff,0x7f,0xff,0xff,0xff,0xa5,0xff,0xff,0xaf,0xfd,0xff,0xff,0xa9,0xeb,
+ 0xff,0xbf,0x77,0xff,0xff,0x52,0x95,0xfe,0xff,0xde,0xe9,0xff,0xab,0x2a,0xf2,
+ 0xff,0x6b,0x55,0xff,0x56,0x00,0xd4,0x7f,0xaf,0xeb,0xff,0x2b,0x15,0xf1,0xff,
+ 0xf5,0xb5,0xff,0xaf,0xac,0xfc,0xff,0xdf,0xff,0xff,0x57,0x2a,0xf6,0xff,0xea,
+ 0xd6,0xff,0x17,0xbd,0xfa,0xff,0xf5,0xff,0xff,0x4f,0xdd,0xfa,0xbf,0xde,0xbf,
+ 0xff,0x25,0xfa,0xfa,0xff,0xf5,0xef,0xff,0x4b,0xfd,0xf9,0x5f,0xff,0xbf,0xff,
+ 0x29,0xdd,0xf4,0x7f,0xd7,0xdf,0xff,0xe1,0xfa,0xfa,0xaf,0xff,0xbf,0xff,0x74,
+ 0x7e,0xf1,0xff,0xd7,0xdf,0xff,0xb7,0xfa,0xf9,0xff,0xef,0xaf,0xff,0x7d,0xfc,
+ 0xf8,0xff,0xb7,0xdf,0xff,0xbf,0x6c,0xf5,0xff,0xdf,0xf5,0xff,0xff,0x92,0xf8,
+ 0xff,0x6f,0xad,0xff,0xbf,0x08,0xfd,0xff,0xbf,0xf5,0xff,0x7f,0x25,0xfc,0xff,
+ 0xff,0xfe,0xff,0xff,0x95,0xff,0xff,0xff,0xfb,0xff,0xff,0x77,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xbf,0xff,
+ 0xff,0xff,0xfd,0xff,0xff,0xdf,0xfe,0xff,0xff,0xf7,0xff,0xff,0xaf,0xfe,0xfa,
+ 0xff,0xff,0xdf,0xff,0x5f,0x5a,0xf9,0xff,0xd7,0xaf,0xff,0x2f,0xbd,0xf4,0xff,
+ 0xed,0xfb,0xff,0x7f,0x5a,0xfa,0xff,0xd7,0xed,0xff,0x5f,0x2c,0xfd,0xff,0xef,
+ 0xf7,0xff,0xbf,0xb8,0xfa,0xff,0xaf,0xfa,0xff,0x7f,0x0a,0xff,0xff,0xd7,0xff,
+ 0xff,0xbf,0xd0,0xfe,0xff,0x3f,0xf5,0xff,0xff,0x44,0xff,0xff,0xaf,0xfe,0xff,
+ 0x3f,0xa1,0xff,0xff,0xb7,0xfe,0xff,0xff,0xc4,0xff,0xff,0x2f,0xfd,0xff,0x5f,
+ 0x50,0xff,0xff,0xbb,0xfe,0xff,0x7f,0xa1,0xff,0xff,0xd6,0xf5,0xff,0x05,0x8a,
+ 0xfe,0xbf,0xea,0xfa,0xff,0x8b,0x14,0xfe,0xff,0xfa,0xf7,0xff,0x05,0x55,0xff,
+ 0xbf,0xef,0xfd,0xff,0xd5,0x5e,0xfd,0xff,0xfe,0xf7,0xff,0xd5,0xff,0xfb,0xdf,
+ 0xff,0xff,0xff,0xfb,0x7f,0xfd,0xff,0xff,0xff,0xff,0xfb,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xe9,0xff,0xff,
+ 0x57,0xff,0xff,0xbf,0xd2,0xff,0xff,0xbf,0xfd,0xff,0xbf,0xc8,0xff,0xff,0xdf,
+ 0xfe,0xff,0xff,0xa2,0xff,0xff,0x7f,0xff,0xff,0xff,0x95,0xff,0xff,0xdf,0xfd,
+ 0xff,0xff,0xa3,0xff,0xff,0xff,0xfa,0xff,0xff,0x4a,0xff,0xfa,0x7f,0xfd,0xdf,
+ 0xff,0x87,0xff,0xfa,0x7f,0xf9,0xef,0xff,0x0b,0x3f,0xf9,0xff,0xfd,0xfb,0xff,
+ 0x8f,0x5d,0xfd,0xff,0xf6,0xef,0xff,0xa7,0xbe,0xfe,0xff,0xfb,0xfb,0xff,0x9f,
+ 0x2a,0xff,0xff,0xd6,0xff,0xff,0x4f,0xbe,0xff,0xff,0xef,0xff,0xff,0x7f,0xf8,
+ 0xff,0xff,0xab,0xff,0xff,0x3f,0xfc,0xff,0xff,0xef,0xff,0xff,0xff,0xea,0xff,
+ 0xff,0xbf,0xfe,0xff,0x7f,0xe9,0xff,0xff,0xff,0xff,0xff,0xff,0xd5,0xff,0xff,
+ 0xff,0xfe,0xff,0xff,0xd7,0xff,0xff,0xbf,0xff,0xff,0xff,0x55,0xff,0xff,0xff,
+ 0xfb,0xff,0xff,0x2f,0xff,0xff,0xff,0xfd,0xff,0xff,0x5f,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xfd,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xfd,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff};
diff --git a/hacks/images/matrix.xpm b/hacks/images/matrix.xpm
new file mode 100644 (file)
index 0000000..0aab685
--- /dev/null
@@ -0,0 +1,904 @@
+/* XPM */
+static char * matrix[] = {
+"56 837 64 1",
+".     c #000000",
+"+     c #020E04",
+"@     c #021804",
+"#     c #062604",
+"$     c #0B3008",
+"%     c #021E04",
+"&     c #114410",
+"*     c #0C360E",
+"=     c #0D3E0E",
+"-     c #0E4E0C",
+";     c #1F561E",
+">     c #145417",
+",     c #136314",
+"'     c #1D5E1D",
+")     c #1C4E1C",
+"!     c #127410",
+"~     c #269624",
+"{     c #1AA614",
+"]     c #169614",
+"^     c #26B529",
+"/     c #178618",
+"(     c #246624",
+"_     c #2F832F",
+":     c #2B7729",
+"<     c #368B34",
+"[     c #3B9439",
+"}     c #298B27",
+"|     c #3AC237",
+"1     c #42D73C",
+"2     c #62DA61",
+"3     c #32D634",
+"4     c #88E688",
+"5     c #1E751C",
+"6     c #4CB34A",
+"7     c #44AB42",
+"8     c #42A244",
+"9     c #26C227",
+"0     c #FFFFFF",
+"a     c #40CC44",
+"b     c #52BB54",
+"c     c #3E9C3C",
+"d     c #5AC254",
+"e     c #286E26",
+"f     c #32CB34",
+"g     c #5ACA5C",
+"h     c #5ED05C",
+"i     c #2AA62C",
+"j     c #166E14",
+"k     c #62DE64",
+"l     c #3EDE3C",
+"m     c #36B634",
+"n     c #D9F9D8",
+"o     c #26CB24",
+"p     c #2E9A34",
+"q     c #66E561",
+"r     c #9DD89F",
+"s     c #7AF67C",
+"t     c #E8FEEA",
+"u     c #92F294",
+"v     c #D8F3D8",
+"w     c #76EE74",
+"x     c #73E774",
+"y     c #66E264",
+"z     c #D7F2D8",
+"........................................................",
+"...........++++++......................++++++...........",
+"........++++@++++++.................+@+@#@@@@++.........",
+".......+@@@###$#%@@++..............+@@#$$$&$#%@@+.......",
+"......+@####*#**$%%@+.............@@$$$=-=--&$#@@.......",
+".....+@$&;>>>,,'-)&$#++..........@%-!~{]]{{^]/!-$@+.....",
+"....+@#)(__:::<[_('&*@+.........+#$}|123|4442|{5-@+.....",
+"...+%%$([678[8668<:(=#@+.......+#%=90000000004a^,$%+....",
+"...+##-:[b8[<<c8c[<:;#@+.......@$&!a000044000041~&%@....",
+"..+@$-;_6d8_(e:_<86['*#@+.....+%-/~200019f|14000^-$%+...",
+".++%=;e[7gc:>>>>_8h6:=#++....++#,i|0000f]]]]1000a,$@+...",
+"..+@&(:cbg[j----:7k6:&##+.....@#5^|00009////|000a!=$@...",
+".+%#;:<c7b<e-&-&e8g6_>*$@....+%=~a400049////f0002]-=@...",
+".+@$;_[887_j---&:[g7_'&#@+...+%=i10000l9///!|0002i5&#+..",
+".+%$(<8777_'=&-&e[d6_()*@+...@%&^400001^!!/!|0002^/-%+..",
+".+@$(<888c_,--==:[b6<(;*%+...+#&m400003^//!!f0004^~-#+..",
+".+@*e[688c_>=&&=e8d6[('=@+...+%-|000003{!!!!|0000|i,#+..",
+".@@$([78cc:,--&&:[d6[e;=@+...@#&m000n0o{//!!|0000|~,#+..",
+".@@*;<c787<,--&&:[d6_;)*@+...@%-i400004^//!!f0004i/-#+..",
+".+@$':<86b<(----ecb7_;=#@+...+%=ia4000l9////|0002~,=@+..",
+".++$;e<86bp(--&-e[d8:)*#+....+%=~|400049////9000a/>$@...",
+".++#&;e[6g85->>>:8d6:&$#@....+@$!i|000qo/]]]f0003!-$%...",
+"..+@*-;cdk7:>>'(_7g8:=#++.....+#-/iq0003]]^^2000a,$@+...",
+"..+@$*)_dh75>,,e<7h6:$#@+.....+@=,/2000o]^^94000|-$@+...",
+"...+#*&e8bc_j::_<[8:'$@+.......@$-!a00n199o12002i=#@....",
+"...+@%$':<<_}_<[<:e'&@@+.......+@$=ia44214q041ri!%@+....",
+"....+%#='e_<cc8c<(&*$@+.........+#$,i|1400002^!>=#+.....",
+"....++@*&;;(ee::()=#@++.........+@@>!~im|||am/,=#++.....",
+".....++@$*&&))))=*#@+............++#=-!!}}/}!-$@%.......",
+".......+@@@##%%#%@+@...............+@#%$$$$$#%@%........",
+"........+++@@%+@@++.................++%@%#@@%++.........",
+"........................................................",
+"............+.+.........................+.+.............",
+"..........++@@+@++....................+@#%@@@+..........",
+".........+@%#$#%@++..................+%%$&=#%@+.........",
+"........+@#*=$*$#%++................+#$-,--=$#@+........",
+".......+@@)e<ee(;)&$+..............+@#/|4f|^~/5-@.......",
+".......+@#([d6[_:e()$..............@#$m000021|m}&.......",
+".......@@#_dskd8<<:(=..............@%=20t00002|m,.......",
+"......+@#*:gsh8_:(;=$.............+%$&a0t00aami5=.......",
+"......+@#*_bsd[;;))$@.............+#$-20t00ip}5=#.......",
+"......+@$$<dsb:&=##@+.............+#=-20t0a!,=$#+.......",
+"......+@#*<bu6:=$$@++.............+%=-20t0a,-=%@+.......",
+"......+%#*<bs6_=*#%@..............+#$>20t01,-$#%........",
+"......+@$$<dsb:=$#+@..............+#=-40t0a,-$@@........",
+"......+@$$<dsb:=##%+..............+%=-20t0f,=$#+........",
+"......@@#$<bs6:$$@++..............%%$-40t0a-=%%+........",
+"......+@$*<ds6:=##@...............+#=)20t0a,=$@.........",
+".....+@##$<bu6:=$@@..............+@$=-40t0|,=#@.........",
+"......+@$=<gsb:*##++..............%#=,20t01-=$@+........",
+".....+@#$$<bsb:=$#@+.............+@$=-40t01,=$@+........",
+".....+@#$=<gsb:=$#++.............+#$-,20t0o,-$@+........",
+".....++#$=_dsb:*$$@+.............+@$-,40t0a--=#+........",
+".....+%%$=<gs6:*$#@+.............+#$=,v0t0a,=*%+........",
+".....+%$$&_dwb_**#@+.............+#=-!40t01,-$#@........",
+".....@+$&;<6h8_,&=#@.............@@-!p20001{!,$@........",
+".....+@=)(_7d8_(>=#%+............+%,}m40002|],=%+.......",
+".....++=;e<[7[_e;&$@+............+@,i|20002|i5&#+.......",
+"......+$=);(:(;)=$@@..............+=,}ima|p_,=#@........",
+".......+%$*=&==$$@+................@$=),5,,=&#+.........",
+"........++@+@++@+...................+@@@@@@@+...........",
+".........++++++......................+++@++.............",
+"...........+++++.......................+++++............",
+"........+++@%++@++..................++@%#%%@@+..........",
+".......+@%#$*$#$#@++...............+##$=-=&=$%@+........",
+".....++@#$$=====$$%++............+@#$--,,,,,-=#@+.......",
+".....+@#&&))&)--&=*#@+...........+@=,!//////!,-=%+......",
+"....+%#;:<_ee(((((:'=+..........+#$~a429|9^^9|ai>@......",
+"...++#$e[d8[____<[[_)#+........+@$-|000011212002}$+.....",
+"...+%$=_bhdc<_<<[8b[;#+........+#=,2000044240000i$+.....",
+"...+#=)_bh6[:e(e_[7<;#+........+=,/40004ff9|2004p$@.....",
+"...+$)([bhc_,,>;(<c_;#+........@-/m00001^{{]|402~$+.....",
+"..+@=;([bg[e>--&;:[_)@+.......+%,~|0000f]//!ia02}#+.....",
+"..++$)([bh85--&&);(;$@+.......+@>/m00009//j!/imp>%+.....",
+"..+@$&;[6h8:--&*&&&&#+........+@-5i0000f//!,!55,$+......",
+"...+*&;[bh85--&=*$#@++.........@-5i0000o]/!,-=$#%+......",
+"...@$*)_8dc}j>-=$$#%+..........@=-/200039{/,-*$%%.......",
+"...+@$*:[78<_j'*=$#@++.........+%-,|000439{,,=$#++......",
+"..+@%$$(<[88c_,&=##@@+........+%#=-^400003{!,=$#@+......",
+"...+@#$>e_<p8_5>)=##++.........+#$-]91q4n3o{/,=$@+......",
+"...@@#$-'e_[7[}:,-*$@+.........@#$-/i910n0lo^/-=#@......",
+"...+%#*&->5~ccp[:'=##@+........+%=-!/]fl0n4qo{,=$@+.....",
+"..+@$$=->'e~[ccc_(>&$@+.......+%=-!/]{flqnnn19]!-%@.....",
+"...+$&;',!___~p8c}_(&#@........@&!]{^o331lqnn43^!$%.....",
+"...@=)'ee_555}c77c[:;#%+.......%,}^|93fool00n001~=%+....",
+"...@*;'5__}__~c7878};$++.......%>~if14l13l000004~=%+....",
+"...+$&;:<cp[[876778<>$++.......@=5~|40qq0n000004~=@+....",
+"...+$*):<878776768c_;#@........+&,}a000000000002~=%.....",
+"...+#*=(<8888c88c[[e)#+........+$-!m40000000000a/$@.....",
+"....+#$);(eee:ee((()*@+.........@$=/pm||mf|||mm}>%+.....",
+".....+@#$*=*&=&==**$@+...........@#$-),,!,!,,--*%+......",
+"......++@@######@@+++.............+@@%$$$$$$%%@%+.......",
+"........++.@++@+@++.................+++@@@@%%++.........",
+"..........++@+++......................++@+++............",
+"........+@@@###@++..................@%##$$$%%+..........",
+"......+@%#$*=$$*$%++..............+@#$&-,---*#@+........",
+".....++@$$=&&&&&$$@++............+%#=-,!!!!!-=%@+.......",
+"....++%=;';;;'';)=*#+...........+%%,]ii~iiii/,-$@.......",
+"....+%#;_c<:e::<:(;&#+..........+#=p2n4afa14am~5=+......",
+"...+@#*:7g6c_<[8[_:;=+.........+@$-a0000140002fp)@......",
+"...+@$&<bh6[_[[8[<:(=@.........+#&!400003400041m,@......",
+"...+$*)<6h7<e:_<_::;=@.........+=,_200029a222a|p,#......",
+"...+$);[6h8:''eeeee;*+.........@-/i0000f{^9|a||p>@......",
+"..+@=)([6g[e>';;(((;*+........+%,}^0000f]iiimmm~-+......",
+"..++*&)<7g7<(j';))&*#+........+@-!~4000499{~/}5>$+......",
+"..+@#$)_7g7[}:;&=$$%+.........+@$-/200001fi!j-=$+.......",
+"..+@#$&_8gbc<_;&$$@++.........+#=-!100004fi!-=%@+.......",
+"..+%$=)<8g67[_(&=$@@+.........+%=,/1000n01^!,=%%+.......",
+"..+@$&><8d67p_(;=#++..........%#-!~40000q19~,=@+........",
+"..+%=-;<7g68[_e;&*%++.........+#,/i4000002|~!-#%+.......",
+".+@@)(:[86c<:('-=$%@+........+@%/^o000n2f9i/,=#@+.......",
+"..+#;:<[cc<:,>)=$##+++........%$p|400043^]/,-*$@@+......",
+"..@#;<cc8p_,>-==*#$%@+........%$i40nnq3^]/!,-==#@+......",
+"..+#;:<ccc_j---->';)$+........+$~a000039////]ii/-@......",
+"..+@)e_<88_(>'>'e_<:)@+.......@#/|200019]{{{910a/#+.....",
+"..+%=;e[c6<!>>,e_8b['#+.......+#,i|40019]{^|2000i$+.....",
+"...+=&;:<8<:,ee__<c_;@+........@-5~a4n4o^9912002p%+.....",
+"...+#$&':___:___<__(=@+........+$-5ia413a122222m,#+.....",
+"....@@$&'ee_<<<[<e;)*++.........@#&!i||244404|i/-%+.....",
+"....+@+=);((:::ee;)=#@..........+@@,/im9|aa||i},$@......",
+".....+@#*=&)));;)=*$++...........+@$-,5//~~~_,-&@+......",
+".......++@###$###@+++..............+@#$$===$$%@++.......",
+"........+++@+@@@@@+.................++@@%%##%%+.........",
+"...........++++++.+....................++++++.+.........",
+"..........+.+.........................+.+...............",
+"........+@+@@++.....................@@%%@@+.............",
+"......+@@$##$@@++.................+@#=$&=#%++...........",
+"......+@$#**$$#@+.................+#==---=$#@...........",
+".....+@#&-;5e;=#@@...............+@=!/{9f~,$%@..........",
+".....@@=);_<8_'*$@++.............@#,/ia003i-=#@+........",
+"....+@#)(e8dh8e**$@+............+@$/^fn000f,-=%+........",
+"....+@%-(_c6h7<,-$%%+...........+#$/m100001^/-##@.......",
+"....@%#>j_86g7c_j-#%@+..........@#=]910000019/=#@+......",
+"....@#$;(_[6b68c_'*$@+..........%$=~^10000003{-=#@......",
+"....+##;e}[7bb78<(-=$@+.........@$=~f1q0000049/,=%+.....",
+"...+%%*,:}p77777c_5;*#@+.......+#$-{fl4n000n01f],$#+....",
+"...+%#*>:}pc77787p_:-$@+.......+#=-{olqnnn00n44f/=%@....",
+"...+%$=':~[i77i6ccc_'*#@+......+%=,iflq0n0n00n02i,$%+...",
+"...+#$-j_[88m7c8c87[e>*%+......+$-/91qnn0nn0nn0q|],$+...",
+"...+#=-([8i66i8}876c_'&$@......%=,/9qnn00nnl00003i!=%...",
+"..+@$&,5p766678}p6d8<()*@+....+%&!{f4n000nnl40004^/-#+..",
+"..++=>'<8b|ggmi87878_(>$%.....+@,~^4n00000nnn00029~-%...",
+"...@='e8bhghhb6i66mc_e;*@......@,i|n0000000n00002|p>%...",
+"..+@=;:cbghghg6m88c[_e;=%.....+#,ian00000000n0002|~,#...",
+"...+=-'_8mbmbi[}__ee;)=#+......%-/{1n0000nq1l3|9i/,=+...",
+"...@#$&e_ccc8}_,'>>-=$#@+......@$-!|10nn0lf^{]]/,-=@+...",
+"...+@##>(__<[5'&**$##%@+.......+#$=]91144f^!,>==$#%+....",
+"....@%$-(5___(-$*##%@+..........@$=/^fa149/--==%%+......",
+"....+@%=;(j::'&$#%%+++..........+@%'pm9a|i!=$##@++......",
+".....+@=);((e;=@@@+..............@#,/imm|~,#%@+.........",
+".....++$*&&))=$@++...............+@&>55//,=%++..........",
+".......+#$#$##++...................@$===&$++............",
+".........@+++........................@+++...............",
+"........................................................",
+"........................................................",
+"........++@+@+@+++..................++@@@@@@++..........",
+"......+@##$$*$*$#@+...............+#$&=-----=%@.........",
+".....++$=&)))>))=*%@+............+@=,5//}~//,-#%+.......",
+".....@#*);''';'()&$@+............@$>}~i^iiim}5&#@.......",
+"....+%$);ee__<<<_()&#+..........@$&/iaaa14401m/,$+......",
+"....@#=':<<<<87b[_;)$+..........@=,i|444000002i/-+......",
+"....%$=(_[c8cbghb[:;*@..........#=,m20n0000000ap>%......",
+"....+$*)(:_<_[6b7<:;&@+.........@=-~m|14100004ai,#+.....",
+"....@%$&;'j55}[7[<:'=@+.........%$&!]^9ool4001|i,@+.....",
+"...+@#$*&->',5_[<_e;&++........+@$=,!/]{{o1qq1ai!@+.....",
+"...++##&>'j5:[p7c_:'=%+........+%$=!]^9o3lq001ai,#+.....",
+"...+@#*>j__[~87b7<:;=++........+%$-]9334q00004ai,@+.....",
+"...+##*;:<876bgg6[:;=%+........@#=-ia400000000ap,#+.....",
+"..+@$*-:[8887876[_()$+........+@=,/o400nn00001^/-@......",
+"..++$)'}8d7c_<<<:')=#+........+%-/i400004144a^/,$+......",
+"..@%&'e8bg7~55(';)$$@+........@#!{f0000lf99^~_-&%+......",
+"..+#&e_86g8_j,'>&=#@++........+$5|2000039^{]!,=#@+......",
+"..@#>:<867<e'>>-=*$%++........@$~|4000qf{]]/,-=#@+......",
+"..+%;_cc[8_,-&&=$##%@.........%$p2n0003^/!!,-=$%%.......",
+"..+#;:<c[[_,-=&&==$#+.........+$~a00041{/!!!,,-$@.......",
+"..++&;:_[c_j>,,((;(;*+........+@5i|30039]{{^^im~>+......",
+"..@@*&;_[c_(>'e:___e&+........%@>!ia0029]{|a222|5@......",
+"...+$=-e<8_(>(:<<_[:&@.........%=,/|40l9]9o4440a5@......",
+"...+@$*;e_:5je_<:_e;*+.........+#=,{|2af9a2422|i>+......",
+"....@@#&>(e::__<:(;&$+..........@#$!~^|aa222ami5=+......",
+"....++%$&>(:__:_:;&*@+..........+@%-!]^a2a22|p5)#+......",
+".....+@#$=&);;(;)&$#@............+%$=,5]~iii}5=$@.......",
+"......++@#$$==**$$@...............+@#$=-,,)>==#+........",
+"........++@@+@@@+++.................+@@@%%##@++.........",
+"..........+++++++.....................+++++++...........",
+"........................................................",
+".......++###$%+@++.................+@$=$=$@@++..........",
+".......$=&);;)=#@++................=,5}pi/,&#@+.........",
+"......+=;e::_()=$#@++.............+,p|fa2m/,=$%++.......",
+"......+&;e:_<:(-&$@@+.............@,i|a24|^/!-##+.......",
+".....++*);(::__:(>*#@+...........++>_~ma2123^]-=%+......",
+".....++%*&;(:_c8<,&*#@+..........+@$-!i^f1004^!-$#+.....",
+".....+%#$*;;(<86c:>&*@+..........+%$=-]i92000f]!-%@.....",
+".....@@#$=->,:}8[<<(-$%+.........%#$-,/]^fl00449/=#@....",
+"....+@@$$=->,(_~[c7_(*%@........+@#=-,/]{93lqn04^-#@....",
+"....++##$*->>jj_p7b8(=#@+.......+%$=-,/]]991q000|,=#+...",
+"....@%$)(e555}}c7dh6:=$@+.......@#=/^9oooll00000f,=%+...",
+"...+@#=(<8c[[c77bgxb_-##+......+#=,m4000q0n000003/=$@...",
+"..++#$&_8g67876bgywg<-$#@.....++$-!30000n00000t04/=$@...",
+"..+@*)'<767p/[pcmgyb_-$#++....+%-/^2000qlqqn00003/-$@+..",
+"..+@&(e[76[_j55_[7h6_=*#@+....+#5^a00001^of340001!-$@+..",
+"..@#;:[[78<j'>>,:8d85&*#++....%$~a000019{{{{30009!-&%+..",
+"..+#;:c[88_,>>>,/cd8_=$#++....+$ia00001^]]]{3000a!=$@+..",
+"..+#;_[c[c_j->>>:cg75&$%@.....@$p2000n39/]]]f000o!-%@...",
+"..+#;_c[[[e,>---_pg8:=$@+.....@$i20000f^]/]/3000|,=#@...",
+"..+#)e<[[[_,->>,_8d85=#%+.....+$}a4400o^/]{{3000o,=#+...",
+"..++=;e<c8<j>,,(_8d8e*#%+.....+@,~|4n049]{^91000|-$#+...",
+"..+@$*):8b[e>,::[8b['$%+......+@=,/a004o{^fa4000^-%@....",
+"...+#*&e[8<:>e5__[8<'#@+.......@$-5|004f{9f12004i&@+....",
+"...+@$$)e_e5ee___:e;=%@+.......+%=-}|1a9|f122a|p,%%+....",
+"....+@#*)'(:::__e;&*#++.........+@$,/imaaaa2|i!-$@+.....",
+"....+++$=&'(::e:;)#@@++.........+@@*,!ima|aai!=##++.....",
+".....++@#*=&))))=$%@+............++#=-,!}//_,=#@+.......",
+".......+@@#$##$##@++...............+@#$=====$@@+........",
+".........+++@+@+++...................++@@@@@%+..........",
+"...........+++.+.......................+++.+............",
+"........................................................",
+"......+@#$#$$$*$#$##@+............+%$*&-----&==$%+......",
+".....+@$=);;;));)))=#@+..........+#-,/}~~}/~///,=%+.....",
+"....+@$&;'(eee(e'(;;=$@+........+#&5i^^|9|9|mmi~,&#+....",
+"....@#*;:<:__::_e_e()=#+........@$-pa422aaaaaaam},$@....",
+"....+#=:8d7[<<<<<[[<()=#........@$,a000044444004m/,$....",
+"....#$&<bxg7[[<<[86[:;&$........$&540t000q440000|i5=....",
+"....@$&[dxg6[[[<[[c[:;&#........%=500000q0q40000ap5=....",
+"....+#*:8g6c}_:e:::(;)*#........@$)2000nl1a9|aa|i5>$....",
+"....@@*([6c[_jj>);;&&*$+........%%-m00n0399]]~~5(>=@....",
+"....@@$'<8<__e'&==**$$#+........%#=i404419{!,,,--=$@....",
+"....+@@)(:<pc_,=&$$$#@@.........+@#/ma4403^!j-==$#@.....",
+".....@@=)(_[6_(==$#@@+...........@#,}^2002^,,-$%@+......",
+".....+@#=&:[b[,=$$#@+............+@*,/a00l9,-=$#%.......",
+"......+#$&e<8<e-=$#@@.............+$=!|2029/,-$@@.......",
+"......++%$;_[<(')$#@+.............+@$*i2049{/-$#+.......",
+".......@@#;:[_e')=#@+..............@#$~a02|i/,$#+.......",
+".......+%#=;(::_(&#%+..............+#$,i||119!$#@.......",
+"........+@$=)e<[:;#%@+..............+#=,/|20a~$#@+......",
+"........+@%$$'<6<;##++..............+@$=-^404{=$@+......",
+".........+@#$;<8<:=*#+...............+%$=i404|!-$+......",
+".........+@##;:8<:()$+...............+%$$~a0q|m}&@......",
+"..........+@#)e[<::;=@................+%$/|042|i,@......",
+"..........++@=;:::_e=+................++#(paaa2|,@......",
+"...........++$=)(:_e)+.................+@=,}ma2|5@......",
+"............++#$)e[:&@..................+@$=}|015@......",
+".............++@=;e;*+...................+@#(p|i;+......",
+"...............+$*&*#......................+=)5)$.......",
+".................++..........................++.........",
+"........................................................",
+"........................................................",
+"........................................................",
+"...........+++++++.....................+++@+++..........",
+".........+++@@%@+@++.................+@@%#%#@@@+........",
+".......++%$*===&$$%@+..............+@#&-,,,!-=$%@.......",
+"......+@#$&)'';';&*$%++...........+@$=!}iiii~!-=#@+.....",
+".....++@$=;(::::e'==$@+..........+@#&,~^aa1f|i!,=%@.....",
+".....+@=;(ee::::55:'&#@+.........+%,i||aaffaooai!$%@....",
+"....++#;_[<_e:5e_<c_'*%@........+@$~20419fff14n2i-#@....",
+"....+%#e[dc_ej55<7g85=#@+.......+#$|000199994000f,=#+...",
+"....+@$:7g8_5555}7g8e&$@+.......+%=a0001ooool000|,=%@...",
+"....+#$:6h7}(jjj[7g6_=##@.......@$&a00019999l0003!=$%...",
+"....@#$_6k7~jjj,}7h7_-$%@+......@$-2000l999930003/=$@+..",
+"...++#*e7g8p:___cbd6_-$#@+.....+%$-|000l3o33n0003/-$#+..",
+"...++#*e[6787i7m6|g85>$#++.....+@$-|000nnn000000f/-$@+..",
+"...+@$*;:[7mbghhhgg7:-&#%+.....+#=-ia0n000000000o/,=#+..",
+"...+@#$;_<6dhghhhgb7/&*$@+.....+#$-if0000000000n3/-=#+..",
+"...+%#*e_776gbb66bg8_>*#%+.....+%=-94n00000000003],=%@..",
+"...+%$$:cb|bdm7i7mg8_>&$@@.....+#=-fn00000nnn00n3],=%@..",
+"...+%#=5cb6|b7p}c6b7_'&$@+.....+#=,f00000nqln0001{!-%+..",
+"...+%$*:8g7cp}_5}p7c_,-*@+.....+#=,f0000ql3o14001^/-#+..",
+"...+@%=:7g7}55j!:}8p_(;*#+.....+%$,a00nloo993l0019],$@..",
+"...+%#=_6g8_>>,>5}[<_(,=%@.....+#$,20003{{{{o3441|i,#@..",
+"...+%#$:8hc5j>,>5<68_(;*@+.....+%=-|000o^{{]fq002^]>%+..",
+"....@%$:8g8_,',>5cd6_;)*++......@#-a0003^{{]o0002i/>@+..",
+"....@@$:8d8:,>>-:cg6<'&$@.......%#=|00no^{]/f0004i5=%...",
+"....++%;:[_:jj,,:<8<(&$@+.......+@#~a02a99^^f204m5-#+...",
+"....++@=;(ee:ee(:::e)$#@........++#,pm9|o|9|faa|}-$@....",
+"......+#$*;(e:::e(;)*@@+..........+$-,~m|a|a|mi/-#@+....",
+"......++%#=)';;;;&)*#@+...........+%%=,/i~pi~55>$@+.....",
+".......+@@#$=****$##.+.............+%#$&,>>--==$++......",
+"...........@+@+@++++..................+@@#@#@@++........",
+"............++++++......................++++++..........",
+"..........++@@@@+++...................++@@@%+++.........",
+"........++++@@@@@+++................++%@#####%@+........",
+".......++@$=)&))&*$#++.............+@#=,55//!-=$@+......",
+"......+@%#&;(((('&=*%@+...........@@#$!~9mmmi5,-$@+.....",
+".....+@@$$)e::::e'-=*@++.........+@#=-/9aaaa|{/,-#@+....",
+"....+@%=;(ee:::eee:()*%@........+%#,~9||afa9faa^/-$@....",
+"....+@#)_[__:e((:<[<'=$@+.......+%=~1441ff99|404^,=#+...",
+"...+@%*([68<55,,_868e)*#+......+%%-m0004f9^^1n00a/-=@...",
+"...+@#*ec6[_e(,'e<7[_>&$@+.....+@=-f00039^{{f400a~!=@+..",
+"...+%$*:cb[5,,>>j<c<:(>$@+.....+#=-an00f^{]]9404a^~-#+..",
+"...+@$*e8b[5>>>>(:<[:(;=%+.....%#=,f004o]]]]^f041|i,%@..",
+"..+@#*&_8gc5>,>-j_[[_e'=%@....+@$-!a000o{{]]91041|i,#@..",
+"...@%#=_7gc/>,>>j_8[_e'=#+.....@$=j100q3]{{]91n019i,$+..",
+"..+@$$=}6g8:>,',5_8c_e;=@+....+@==!100n3{{{{o1002|i,#@..",
+"...@%$&_6h6~5!5j_c6c_()$%+.....%$-j2000looo910001^/-#+..",
+"...@##=}bhdmc[~[c7b8:;&$@+.....@$=!10000nqlq0000ai!=@+..",
+"...+%$=_bkhb7667bbg8_)*%+......+#=,10000000000001/-$+...",
+"...+@#=:7ggdb66c877[(=$@+......+%=,a000000000000m,&#+...",
+"...+@##(<87bb7[___:()$@@.......+%$=^40000n03a2a|/-%@....",
+"....@#$>5<c76c/>>;)&$#++........@$=]f4n0003{]]/!&$%+....",
+"....++#&'5[8bp_'>=*$#@@+........+@$5if40041{]!,==#@+....",
+".....@@*&>_~8[_5(-*$#+++.........@#-!~1q00lf^/,*$@++....",
+".....+@#$*(<78c<5>*#%%+..........+@$-,m40004f]-=##+.....",
+"......+@##;:c[[[_'=$@++...........+@$={a0000a{,=#%+.....",
+".......@@#=;e:_<:';&$@.............%#$(~|a24a^]5=@......",
+"........+%$$=;(::ee;$+..............+%=-,~^aa||p-@......",
+".........++@%=;e(:e;&@...............+%%$,p||a|i,@......",
+"..........+@@$=))))=#+................+@#='}_}_,$+......",
+"...........+++@##$#@+..................++@#$*=$#+.......",
+"..............+++.+.......................@++++.........",
+"........................................................",
+"........................................................",
+"........................................................",
+"........................................................",
+".............++++........................++@+...........",
+"...........++@$$#+.....................+@%&=$@..........",
+"..........@#*&;e>&++..................@=-5i|~,@+........",
+"..........#*)(_[:)@+..................$>/m20a}%@........",
+".........+$=):[6<'#@+................+&,}a004i$%@.......",
+".........+#*)ecd[;$%@................+$)5|000i=#@.......",
+".........+@#*e[d[e$#%+...............+%=>r000|-$#@......",
+"........+@@#$(cg[e=#%@..............%%#$&|000|,*#@......",
+"........++%#*([6[e>=#@+.............+@#=-m000f],=@@.....",
+"......++%%#$$;_8<:()*%@...........++#%$=-{202a^/,#@.....",
+"......+@@##**'e[__e'=%++..........+%%$=--ia042|i,%@+....",
+".....+@$$&&));e::_:e)#@+.........@@&-!!//{|aa12|/$@+....",
+"....@@@=;';''';(:_[:>#@++.......@%%,~i{{i{i^f20a~&#@+...",
+"...+@%#)(:e(e,>-e_8_'*#@+......+##=/^1f9|^]/9102i-$@+...",
+"..+@#=&;:_5(;>>&(_8<(=#@++....+@=,!iaa|^{]]/^204^,$#@+..",
+".++%=;(e:_:,>>--j:8<'=$#@+...+%%,~^|a1f^]]//9104^,=$%@..",
+".+%#)e:___('---)(_8<(=*#%@+..+%$/||1129{////^104^!-=#%+.",
+".+@$;_[[<}:,'>>,_[6c}(;-=$#..+#-i20041f^{{{^300019~/,-$.",
+".+$=:cb8[__:(5__[6db8c<e()*+.%=,a000q41o99310000004a^/-@",
+"+@$&<bhb8____<c76dhgggb[:(&%+#=54000n123140000000000am5#",
+".@$&:6gc__:55_<[886666c[:;=%.#=!20004aff|12000000000ai,%",
+".+#=(<8_(;'>>;('e:::::e(')*+.@$,m2029~i]~i^m||aaaa|mi}>@",
+".@#$)e:;>*$$$*$*==&=&&&&&=$+.%$=~||i/,--->--(,5,55555,&+",
+".+@#=;'&*$$##$#%##$#$#$**$@..+#$'pi5-==$$=$$$=&$=*=>>=#.",
+"..+@$*=$#@@%@+@%@%@@@%@@@@@...+#&>,-$###%@#%#%%#%##%##@.",
+"....+@%+@@++++++++@+++@+........+#%%@@++++++++@+%+@+....",
+".......................+...........................+....",
+"........................................................",
+"........................................................",
+"..........+@@++.......................@@#@+.............",
+"........+@#$=$@+....................+@$-,=#+............",
+".......++%*&;=#++..................+@#>5~,=@+...........",
+".......@*=);()=@++.................#-,/im}>@@+..........",
+"......+$)'e:_(&#@++...............+-}i|12^!$%@+.........",
+"......+)e_<[[:>##%++..............+5|v200a]=$#@+........",
+"......+*(:<[[:()=$@++.............+,m2400am/,=%@+.......",
+"......+*&;e:<<_:,&$%++............+>5p|a4411^!=#@+......",
+".......+#*;e:<c8_'##@+.............@$)~|24002i=$@@......",
+".......++@&;:_87<(&*#%+............+@#5ia2004m!-=#@.....",
+".......+@@*&;(:<:_:(&$#+...........+@#-5~m|411a^5=$+....",
+"........+@#*=);(:<8_(=#@............@@$-(/i^a204^,=%....",
+"........++@#$*&):[68:&*#+...........+@%$=-!}a000a5-$+...",
+"........++@%$$=&e[bc:)$@+...........++%$=-,/|000|/-#+...",
+".........+@#$$=-e[68:)=#+............@@$=-,/9000a},$+...",
+".........+@@#$&&([6c:)$#+............+#%=-j!|000|/-$+...",
+"........++#$*);e::<:;=#+............++$=-/{||24ap,=@....",
+"........+@#$-(:<_e;;=#%+............+#*-/^a42|i~,=#+....",
+"........@@*&)e<c_(=$#@@.............@%-!/|402m,>$@%.....",
+".......+@$)(__:_()*#%++............@#=}m2222|/-$#@+.....",
+".......%$*(<c<:;)$$@@+.............#&,m402ai_-=%%+......",
+"......+#*):8dc(*$#+++.............+$,52000m-=$@++.......",
+"......+*)(:[c:;*%%@+..............+>}ma00ap-$#%+........",
+"......+=(_:ee;=@@++...............+,m2ar|~,#%++.........",
+".....++):[:;**$@+................++}a01p,>=%%...........",
+".......=;:;&*#+++..................,i|p5>$@++...........",
+".......#*)$$@%+....................$>}-=%#+.............",
+"........++++++......................+@++++..............",
+"..........+...........................+.................",
+"........................................................",
+"........................................................",
+"........................................................",
+".........+++@+@+@+...................++@@@@@@+..........",
+".......++@+%@%#%@+@++..............+@@@###$##@@@+.......",
+".....++%#**=&&&&&*$#@+...........++#&--,!!!!!,&$%+......",
+".....+@$=;;;'((e(;&*$+++........++@-,~~ii^9r^~!,&@++....",
+"...+@@#=;(ee:_<<_e')=%++.......+@#$,~|||a2442|i/,$@+....",
+"..++#$&;(eeee_<c<_e')=*#+.....++$-!~^9|||14041|i/,-$@...",
+"..+@=;e(e:(,':c6c<_ee')*@+....@#,p||rf9^{a00043||i/-%+..",
+".+@#;e<_:e(>-:[b7[__:e(&#@+..+%$~a221|^]/f000041aam5$#+.",
+"++@$'_[_:e'>-:cd6c____e)*#+.++#&i202f9i]/f00001111a}-$@.",
+".@$*(<[_'>>&=e[bc_jee::'&*$+.%=,m401^]]j!f00019f|a9i!,=+",
+"+#$&e[[_;==&&j[bc_',:_:('&$%+$=!|00ai!!!!94001{^f219~5-#",
+"+#$&:[8e>===&(<8[:,je::e(;=@%$-5a00|],,,,9400f{9ffa|mi,%",
+"@$=)ec7_>=*==>:[<_:_:ee::e)#@=,_f00a],,,,{a441aaf9|aa|}$",
+".$&;_[8e,*=**-(e__[_5ee_[<;#+&!p200f{>,,-/^a14q1f992q4p&",
+"@$&):c7:'=*=$->':_c[5,(_[<'*@=5~a001{,-,-/]^f4nqf^9z04i-",
+".%$):[7_>&=$=*->e<c[_ee:<_)$+$=5a002{!!-,,/]f2002f|122}=",
+".+#*ec6<(-&***=&j<78<e::_:)#.@$>r004^/!---,!92002f9a2a}$",
+".@+$([8_e>&=*$*=;<88<_e::e&#.%@=m002|]!!---,i4004aaaa|5$",
+".++#)(_ee('>>&==>e__<<_e()*+.+@$}ma||^{~]!,,]|22442|^~>@",
+"..++$&);(e('(>&$&;':_c<e&&#@..+%=5}pm|mim]!-!]^f40qr5,$@",
+"...++#$=;::ee'-$*&&;_8[(*#++...+@$=5i|a||i/-,!5i200m,$%+",
+"...+++#*&))))=*$$**);((&#++....++@$-5}}}/,)==--5i|m5$@+.",
+".....+@@$$$$$$$$###$*==$@+.......+@#*&-=--&=$=$=),,=@+..",
+".......++++@+@%#@@@@++++...........++@@@@@$$%@#@@%++....",
+"..........+++++@++++++................++++@%++++++......",
+"...............+...........................+............",
+"........................................................",
+"........................................................",
+"........................................................",
+".........++.+........................++.+...............",
+"..+++@+@@+@+@+@+++............++@@@%@@%@@@@+++..........",
+".++###$%@%%%#%@@@@++.........+@$$==#####$###%@@+........",
+".%#$$$=*$$##$#$##%@+++.......#$-&-,-=======$$#%@++......",
+"+#&);;>>->'(((>-&&&*#@+.....+=!}~~]]]]{^9^]/!!!-=%+.....",
+"@=;((:ee(5_[[_ee''')=#@+....@,~m|aa|9f1404a|^ii/,=%+....",
+"@&(:__<<__c7d7c:_:e(&$#+....#5m|22242100000aaaam5&$@....",
+"+*);(e(eje[7d8_(('')=$%@....@>}{^99f^f400019^ii},=#@....",
+"@$$&->,,',_8bc_'>>-&$#@+....%=-5/]{{^^100n1{]]/!-=#+....",
+"+##$$*&--,_7bc5-&=**$#@++...@$$=-,!//{3n00o]!,,-=$#@+...",
+"#$)>>>->',}8g8:>>-&=$$$@+...$-/]]]/]{^10003]]/!,-==@+...",
+"*)ee(>>,'j}6di},>,--=**@+...-}|a^{{{^9300nl^{{]/!,-#+...",
+"*(<c_e,j!5c7h7}j,>'>-&$$@...>|2039^999n00039^{{]/!-=%...",
+"$;:_ee''(!c6h7<j(''>)&*#+...=pa2|9{^99q00049^{{]/!,$@...",
+"$&;e'''(je[6g7}(,'-;-&*#+...&5i|ii{^99n0003^^i]~/5>$+...",
+"@*&))->',e<6g8_,,;>)&&*#+...#)5}/]~{^940001^^]]/5!-$+...",
+"+#$=&)->;,<8g8_'>>&&=*$++...+$-'!//]i{40003{]]5!,-&%+...",
+".@@#$**=->_8d[:&&=$$##@+.....@#$&>,,/]3000|!!,-=$$%+....",
+"..++@@#$$*:[b['=*##@++........+@#%$--,a000^,-=$#@+......",
+"....@@%#$$ecb['$*##@+...........@%%$=-|004^--$$@@.......",
+".....+@##*e[6<,*##+@+............+%$=-|004^-=$@%+.......",
+".....+.###e[6<'*##@+.............++%$=9004i-=$@+........",
+"......+@#$([b<'*$%++..............+#$=m001^-=#%+........",
+"......++@#([d[e=$#@+..............+@%$m0009,-$%+........",
+".......+%#([d[:)=#+................+#$m000f},$+.........",
+".......++@'[d[:)=#+................+@#i000|},=+.........",
+"........+@);_()*$@+.................+@5i2m},=@+.........",
+".........+$*=*$#@+...................+=)(,=$#+..........",
+"...........@+@++......................+@@@@+............",
+"............++.+........................++.+............",
+"........................................................",
+"...........++..........................+%...............",
+"........+@$*=$+.....................@%=>,&@.............",
+".......@#$&);&#....................%$>5_i,$.............",
+".......+$*)(e;$....................@&)}m|p).............",
+".......@#$;:[(*+...................@$=pa0i,+............",
+".......+@$;_8:&+...................+%&p2015+............",
+".......++$;[6:)++..................+@&i00a}@+...........",
+".......+%@;<6_)@+..................+##p402}@+...........",
+".......+%$;[6:)++..................+%&i00a}@@...........",
+".......@+#;<6_;%++.................@%$p002~#++..........",
+".......@@#;[6:;@@+.................@#$i002p#@+..........",
+".......@@$(_b_)#++.................@#=i402}$@+..........",
+".......@@$;[6_;#@+.................@#=i002~$#+..........",
+".......+@$;[6<;#%+.................@#&i004~$%@..........",
+".......@@$;[6_;##@+................@#=i004i$$@+.........",
+".......@@#(<b_'##@+................@#$m002{=$#+.........",
+".......+@#;[6_;$#@+................+#$i002i=$#@.........",
+".......+@#(:6<'$#%@+...............+#$i204i-=%@+........",
+".......++@;<c_(=*#++...............+@#i402^,-*@+........",
+"........@%)e[_e()$%+................@#_|02|^/-#@........",
+"........@+&;(::_e&$@+...............@%,p|a22|5=@+.......",
+".........+$=):[6_'#@+................@&,/|002i=#@.......",
+".........+@$*;:[:'&$@................+#=(ia0ai,=%.......",
+"..........+@$&;(';)=#.................@%&,pmip},$.......",
+"...........++#$*&;;)#..................+@$=>5~i}=.......",
+"............++@#*&;&$...................+%#$>5p5&.......",
+"..............++@$*$+.....................+@%&>=@.......",
+".................++..........................+@.........",
+"........................................................",
+"........................................................",
+"........................................................",
+"............+.+++.+.....................+.+++.+.........",
+"........+++@+@++@@+@+++.............++@@@%@@@%@@@++.....",
+".......+++%@%####%#@%@++...........++@###$$$$#$##%@+....",
+"......+#$===&=&*&=&&==$%@+........+$-,,,!,!,!!!!,,-$@+..",
+".....++=;((('(,(,,(,'>)*@+.......+@,~^m^^^^^^^^^{~/-#+..",
+"....+@@)(___________::'&#@+.....+%#/|232131a32a11f^!=%+.",
+"....+@#;_<<:_:_:_:__}__>$%+.....@#$~2022aa13a11114f]=#@.",
+"....@@#([8c_j55j555_[[<'*#@+....@%=m4041999o9oo34n4i,$@+",
+"...+%#*e[b~_jjjjj555p7c(&$@+...+#$-|00q399999oo3q009!=#+",
+"...+%#=:86c_j5,555/<cmcj=$@+...@#=,|000lo99o9ooln0n9!=#@",
+"..+@#*&:c68p<}}}}}}p7675&$%@..+@$-j3n0n43l3llllqn009!-#%",
+"..+@#*-_[78c8[pc878i66c/-##+..+@=,/f00nnnqqqnnnn00no/=$@",
+"..+@*)>_86m7i78i7i767m8:-*#@..+%-/]1n00nnnnnnnn00003/-$%",
+"..+#)(_<c8c888787m6668ce,=#@..@$/|20nnnnnnnnn000000f{!*%",
+"..+%;<c888iccip77m6m87p5'-*@..+$i20n0nn0nnnnn000nnq9{/-%",
+"..@#([78c8p88c8i76bm8p_e')*+..%$m000nnqnnqnnn000nq1fi/-%",
+"..@%)(_<pcp[ppcp8mgm7}_,-*$@..@#/m144nqq4qqqn000nl3^/,&@",
+"..++$&>e~cp[[}[p7bhb85,>=#@+..+@-5]fln4qqlqq0000nf^],=@+",
+"...@%$=,_c[}~}~}76hbp:>&$#++...%%=,^1nqllllln000qo]!=$@+",
+"...+%#*e[7p}<_:/~877<:'&$%+....%#=-940qll333l0004f^!=#+.",
+"...++#*j[bc}5/55_}p<_:(&#@+....+@$-9n0nloooo3lq41|^!=#+.",
+"...+%##e[b[:!5jj55_:::e)#+.....+%$=|0043oo99o93a1a|/$+..",
+"....@@$([8p_5jjj,(,''')*@+......%#*^40q3o9999^^^ii/-#+..",
+"....+@#'_8<__:5e'>)&&=$#+.......+#$i20413o99^]/!!,-$+...",
+".....@@)e_<___ej(-$*#@@+.........%%}|44111f9^/--&#@+....",
+".....+@&(e__[<_e'&$#%@+..........+#!ia24041a{!=$%#@.....",
+".....+@$=>:[7<_e'&#@@+...........+@&,]|000a|i!$%%+......",
+"......+@$$ecd7<e>*#++.............+#=>|0004|~,$@+.......",
+"......++@$;:<_(>&$@@..............++#=pa02m~!=%@........",
+".......++%*);;=*$@+................+@#)_i~5-=#+.........",
+".........+@%##%@++...................@%#$$%%@+..........",
+"........................................................",
+"........................................................",
+"...............+.+.........................+.+..........",
+".............++#%$##+....................+@$$==$@.......",
+"...........++##*==)=#+.................+@$=-,,/,$+......",
+".........++@%$*=);;)$+...............+@@#=-,}pi}-@......",
+"......+++%@##=>(((e;*@+...........++@##$=,]^^m|~>@+.....",
+"....++@+%###*>e:_::'&@+.........++@@#$$=-]|a1a|i!#@.....",
+"...++@%##$*=='_c<_e'&#@@.......++##$==-,,{1042ai!$%@....",
+"..+@$&>;>'>>'e_c[<<:;$%+......@#-5~]]{]{{f20044a~=#@....",
+".@%*;:<__<_::_}cc87<'*%@+....@%>pa44441aa1lqn004^-#@+...",
+".@$&:8d6668cp[<<c6bce*#@+....#&5a000000nq44l00009,$#+...",
+".@#=([7866878c[}c8bce&*@+....%$,m000000nnn4l0000|!-#@...",
+".@@#)(:<[87ccp}_[<c[e'&$@....%%=}ma40000nq43l0n0ai5=@...",
+"..+@$=)e<[887p_!_}<_:e'=@+....+%=,}|40nn0q1o1141a|i,%+..",
+"..+@%$=;:<c86[_j5e::::;&@+....+%$=,ia4000ql9ff1aa|i5#+..",
+"...++#$);(<i6c:',''(e:e)#@+....+@$=/i94n00f{{{i^|a|/&%+.",
+"...+++#$=-:cb[5---&)(:e;*#+....++@$-,/|n00o///!]ma|~>$+.",
+"....++%##=e[6<e-&**&;:e)*#+.....+@#$=,|0009/!,-5i||_>$@.",
+".....+@%##;_<<e'>&**&)=*#+.......+@%$=~a04|^]!--:},>$@..",
+"......+@%#)(::_:(-#$$##@+.........+%#$/^aaa1m/===&$#+...",
+".......++@$&((:_e)$#@%++...........+@%>/^|a1|/=$#%@+....",
+"........+@$$&;e:e)&*#@+.............+@=-5i|a|~!>$%+.....",
+".........+@#$;;:e;;&$++..............+@$*_ia|i~5&@+.....",
+"..........+++=;:e(;&$@+...............+%@,ia|mi5=@+.....",
+"...........++#&));;)*+.................++$,}}pp_>%......",
+"............++#$=&;&*#+.................+@$=,5p5)$@.....",
+"...............+$*)&*@@...................++=>}5>#@.....",
+"................+$*$#@......................@=-=$%......",
+".................@+++........................%@@+.......",
+"........................................................",
+"........................................................",
+"...........++++++......................++++++...........",
+"........+++++++@++..................+@+@@@@#@+..........",
+".......@$=$$#*);&$@+...............%&,==$-/p5-%+........",
+"......+$&;&=$)(_(=#@+.............@&5~5,=/m2^,$#+.......",
+".....+@=;(;=='_[:;$@@+...........+@,~|]!,{20a~=%#+......",
+"....+@@)e_e>=e<6_'$$#++.........@@#}|2|]!9404{-=$@+.....",
+"...+@@#;<c_(-e<b[j&##@++.......+%#*i402^/f0009!=$%@+....",
+"...+@#$([6<5'_8b[5==$#@+.......+%$&m004f{10009!,=$%+....",
+".+@%#$$:[6<5'_8gc/-=*#%@+....+##$=-f0049{100no/!-=$@+...",
+".+#$#$=:86c:j~8gc_>-=$$++....@$==-,|00039ln0q3]/,==@+...",
+"+@$**$=:c6p:j}7g8/>-*$$%++..+#----,fn0q39l00n3{/,-=$@+..",
+"@*)''';<7g7~:8mg6}5,,-=*%+..%-}ii{i400n33n0003o^{/,-#+..",
+"@&e_:eecbg78~7dkdc:5j',*#@+.@5|2aff0000nln000n3o9^{,=%+.",
+"#;<[[<[8bhb7cmghg6p~__()$%+.$i4004400000000000lllf|/&#+.",
+"@)(::::86g67}8dgm8__5('=#@+.@}maaa|n000nln000n13f^i,=#+.",
+"+$&);;;<mbc}/p6g6p5(,>&$%@..+=5}~~i4000l3q000q99^]!-%@..",
+".++##*=:cbp_j}cmc}j'&=$#++...+@$=-,a00q39ln0n19{!,=$%+..",
+".+++##*ecb<!'5p7p_j>-*#@@+...++@$&,|0049{oqnq39{/-=#@+..",
+"..+@%$#e[6<5,j_[<_:(-*$@+.....+@%=*|00qo{o1044|9/-=#@...",
+"...+@@$([6_(-(5__}<5>$#%@......+%%=m0029/^f31149]-$%%...",
+"....+@#(_6_(->,e:_<e>$#@+.......+#$m402^/]^9324a]-$#+...",
+"....+@@;<6_;&&>>(_[_'=$%+.......+%%i402i!!]~9202{,=%@...",
+".....+%;<8:;====;_[<(*$#@+.......+#i40ai,,,,i304^,=$@+..",
+".....+@;_8:;$$$*)e[_(&$#++.......+%p20a~----_|02m!-$@+..",
+"......+)e[(&####=;;;';&*@+........+}|0m!$$$$,~iii]5-#@..",
+".......&(_;=#@#@#*=&;(;=#@........+5m2p,$%$#$-,5~mp,$@..",
+".......*;e)*@+@+@@%$&(;=$++........)p|})%@@@%%#&5mi,&@+.",
+".......#*&*@@++++++#$==$@+.........$>5-#@+++++@$&,,&@+..",
+"........+@@+....+.++@#@+............@@@+....+.++#$#@....",
+"........................................................",
+"........................................................",
+"...........+++.........................+++..............",
+"........++@###@++...................++#$=$%++...........",
+".......++@$)(&*+++.................+@@-}m5-@@+..........",
+".....++@@#;:<e)#@+@+.............+@%#$~a4|/$%@@+........",
+"....+@%##$;_8:;$$%@++...........+@#$$=i401~=&##@+.......",
+"...+@@##$=e[6_,=$$#@++.........@#%$=-,|004^,-=$%@+......",
+"..@@#$$===:cb[(*=$$$%++.......@@$=-,,jf0009,,-==#@+.....",
+".+@#$&&&->_cdc:>-==*$%@+.....@%$-!!!/]1000f]/!!-=$@+....",
+"+%#=':__5([6h8_jj:5';=$@....+#$,{a33o94000399oo^~,-%....",
+"+#*):76c[_cbkbc__[c_e;&#+...+$,/10004l0000032404|~5=+...",
+"@$*'[bkbc~6dhb7}cc68_()=+...#=,i4000nl0000nl00002m}-@...",
+"+$*-<6d8}_pdhmc:}[8[_(;*+...@=,/4000l3n0000f10002m~>@...",
+"@$*&<6d8_5p7g7}j:<[<:(;$@...@=-/200n194000l93404am~-@...",
+"+#*&_8dp5,[7g7_>j_[<:(;*+...@$-!100qo^l00n1{9304am~>@...",
+"@#$=_7gc_jpbh7}5_<8<:(;*@...@$-j100qlo40003f34041m~>@...",
+"@#$=_7dm<_8bhbc_<c7[_()*+...%$=!a0004ln000n340002m}>@...",
+"+##*_6g6c~7gkb7_c768_()*@...@$=,10000400000400004m/)@...",
+"+%#$(<8[_:c6h7[:__8<:;)$+...+#$-90001fn0000f2404ai/&+...",
+"+@#$;:<e(,<7g7_'e:::;)*#+...+@$*~f2f^{20001{9|2ai},$+...",
+".+@#*)'--&e8b<(-)'(())*%.....@%$,}i//!|0009/}imi~5)$....",
+".++@$=)&**e[6[(==))&=*#%.....+@%=,/!,,|000^,!/~5,>$%....",
+"..++##$***ecb_(=$=**$@+.......++$=--->|002^,-,)>=#%.....",
+"....+@@%#$(<b_;$$#@++...........+@%#$*m002i=*$#@@.......",
+".....++@@#;_8_)%@%@+.............+@##$p202}$%#@+........",
+".......@@@):[e&#@++................%@%}|0r!$%@+.........",
+"........++&;_;&+@+..................++5i2i,@@+..........",
+"..........*)()$+.+...................+>}m}&+.+..........",
+"..........@$=$+.......................%&,=%.............",
+"...........+++.........................+@+..............",
+"........................................................",
+"........................................................",
+"...............++++++......................++++++.......",
+".............+@###@@@++..................+%==$%#%@+.....",
+"............+#*&=$*$#@@+................+$>5,--&$%#+....",
+"............+$&;;&=**$$+................@&5i~!,,-&=@....",
+"...........@+&':e'-&&*$@+..............%@,i1|i/!!,=%+...",
+"..........+@#):c<:'>-&=#+.............+#$/a02f^]/!,$+...",
+"..........@@#;<7[<(('>=#+.............@%$i200199i~,&@...",
+".........+@##(<68[_:'>=$@............+@$=^40001fi],=@...",
+".........++#$;_c[[<_(&$#+............+%$-i300041^!-$@...",
+".........+%$*>e<p87<(&$@@............%%=-]f440049!=#@...",
+"........+@#*&,e}pc7[,&$%@+..........+%=-!^flqn04^!=$@+..",
+"........++$&;:<8877<(-$#++..........+@=!~f4nnn049/-$@+..",
+"........+@$>(_cm7c8}e-=$++..........+@-]^10000n4|/,=@+..",
+"........@@=>e_8d77c_5>=$%+..........@#,]m4000n0l9],-#+..",
+".......+@@$-'_cb78p_e>-$@+.........+@%-/{3000n4lf]/-#@..",
+".......+@#$=-_8bmc}}5'-=#@.........+#$=!/1n00nl1f{/,$@..",
+"......+@@%**-jp668<_5'>=%@+.......+%#$-,/9q00n43f^],$@+.",
+".....@+@#$*=&:[b7i8<_e'&$++......@%%$=-,!fq00nn43|{!=@+.",
+"...++@%##$*=-!}76878}_(&$@+....++@#$==,!/9l000nn419!&%+.",
+"...++@#%*$==-5~877m8p_5)#@+....+%#$$--,!/oln0000q1f/=%+.",
+".+@#*=&->>,je<[8788c<:'&%@+..+#$-,!/]]^994q0nn0n4|i!$#+.",
+".+#$);e(e:__c[p[c88[e(-=%@+..@$-/i9|99140nq0nn04f^/,%@+.",
+".%*=':___<[8678pc[[<(-*$@+...%-,ia222400000400049/,=#@..",
+".@#*)(::::_<<_:e5:_5('&$@@...%$>}maaaa2222afffaf^i!-@%..",
+".+@$)'eeeee((;,;>'>'(;;*%+...@#=/i||||9^mi{~]i]i^i~,%+..",
+".+@@=;;';;)*$*$*$$$*'e'&+....+@#,~iiii/,----=--,i|i,%...",
+"..++$&)))-=*$###$%#$&))$+.....+@>,/}}/,-=$*$=$$-5}}=+...",
+"...+@#$$**##@%@+@%@%$$#@.......+#$-=--=$##%%##@#=-$#....",
+".....+++@@@@+@+@++++.+...........++@@@@@%%+@++++.+......",
+"........................................................",
+"........................................................",
+"...........++++........................++++.............",
+".........+@#$##@++...................+%=-=$%@+..........",
+".......+@+$&))=*#@+................+@@&5}/,-$%+.........",
+"......++%#&;e;)=*#++..............+@#$5p|i/,-$@+........",
+"....++@%##;:<:'=$#%@+...........+@##$=]a4aij-$#%+.......",
+"...+@###=$([6<'&$$$@+@.........+@$$=--^004^!--=#@@......",
+"..++@$$$=&:cg[:==*$$%++.......+@#=--,!|000f!,--=#@+.....",
+".+@#&'e(''<bh6<j,>-&=$#@.....+%$5i|^{^000029{{/!,-=%....",
+".+$=(<8<__7dybc__:e(';=$+....@=,m400110000031f|m{},&+...",
+".#$)<6gb8[bhxgbi[[__e(;$+....$-/40000000000n0442|m~-@...",
+"+@$=<bg6c[7dhg6cc<<:e;)$+...+#&540000400000n044a|i}&+...",
+".@$=:7d8_5<8b88c[_ee')=#+....%=,20001o4n00nnqlf|i/,=+...",
+".@#*:8d<:>!}[p<~__(;)*#@.....%$>|004a{o1q44l1a^i/-=@....",
+"+@@*:86<5'j:_~[p_5'>=*#@....+##>a0049{9f1lq41f^],-$%....",
+".@@$e86<(,,j5_p8_(>&$#@@.....@%-|0049{^9o1qn29]!-$#%....",
+".@@$([8<5>,>,:[6[j&=##@+.....@#=m004o{^{{30049!,=$@+....",
+".@@$([8<j',>,:<6<j&*$%@+.....@#=m0019{^{{o4049!-=##+....",
+".+@#;:[:_:jj,_<8<e-=##++.....+@=pa02ao99^14n4|/,=$@+....",
+".+@@)(:____:e_<<_'>&*@%+.....+@#}ma2113of3403^]!-%#+....",
+"..+@=(e:<<__5__<:(>)*#++......+%,i|a4021f112||]/-$@@....",
+"..+@$=):[7<<:5('(:e(;=$%+.....+%>5_a0002|f9m^||m~,&#+...",
+"...+@$=ecb8<:(;-;e<e(;&#+......+#=,a0004a^~/i|4a^~5=+...",
+"....@@#e[dc<:;&$)(<_e;&$+.......@#$|0004ai!-/|42|p5=+...",
+"....++%)(_e;;&*#=)(;;)=#+.......+@#5|2ri~!>$,}mi~/,=@...",
+".....++%&&&**$#@%$*===*#+........+@$,55)>=$%$=-(,,>$+...",
+".......++@+@++@%@++@$$$%+..........@+#@@@@%%@%@@&)&#+...",
+".........++++@++++++@#@+.............++++@++++++#$%+....",
+"....................+++.........................+++.....",
+"........................................................",
+"........................................................",
+"........................................................",
+"........................................................",
+"......++@+@+@+@+@+++..............+@@@@@@@@@@@++........",
+"....++@@%@##%#%@%@@@++..........+@@@##$$#$###%#%@+......",
+"...+@%###$#####$#$##%@+........+@#=$==$=$===$=$$#%+.....",
+"..++*)'>&*&$*$$#=&>)&$#@......+@-/i]!,,--=-=,!]/!-=%....",
+"..+#)e_:,>-==$==-':(;&=#+.....+$}|2f^]/,,-,,/ia|~5,$+...",
+".++#(<c_(,>-=&**>:<_e'&#@....+%$^4029{]/,!,,{f42|i!=@...",
+".+@#([8<5>>-*&&&,e<<e;)*+....+@=m0049{]/,!!!{f44|i}-@...",
+".+%#([8<e>--&&==,e<<:(;*@+...+%&m0049{//!j,!{944|^~>%+..",
+".+@$([8_(,--&&=&>:_<:(;=%+...+#=m0039{//!!!!{a423m~,#+..",
+".+@$([8<j--=&&&&':<_:('=@+...+%&m0029]/!!j!!{f4419i,#+..",
+".+@*([7<(,-&==&&>5[<_e;=%+...+#-|0049{/j,,!!{f42a9i,%@..",
+".@@$([8}j--==&=&>:<_:e;=%+...@%=m0019]/!,j,!{344a|ij#+..",
+".@%$([8<(,--===&,5[<_e'=@+...%#-m0019{//,!,!{fq4f|i,%+..",
+".+@$([7_j--====='5<_:('=#+...+#=|001^]/!>,!j{f44a9i,$@..",
+".+@$([8_(--&=*==,:[<_e'=@@...+#=m0019]/!,,,j{3q41|i,#@..",
+".+@$([7<5,,--->-j_[<_(;&@+...+#=|0049^{]//]/93041|{,#+..",
+".+@$([8[_e!j,,,(:<7[_e'=%+...+@=m0003o99{^^^a40029i,#@..",
+".+@#([7[[__:_::_<868<e;=%+...+#$m0004413afa140002|~,#+..",
+"..+#;<8c<_::eeee<[8c_e;=@+....@$i40041afff|f40001|~,%+..",
+"..+#;<[_e('';>',e_c<:';*++....@$i402f^i{~~{{9204a^~>@+..",
+"..+%;:[:'-&*=$=*>(<::;;*@.....+#pa0|i/!,,-,,]|42ai~)%...",
+"...@)e_()***$#$$&;ee';&$+......@}|2m/,--===-!i||ii5=+...",
+"...+$&)&$$##%##$*&))&)$#+......+=5}5-=$$$$$=-!_/55-$+...",
+"....+###@@@%%@@%%#$$###.........@$=$%%#%%#%%#=*&=$$+....",
+"......+++++++++@+@@@@+@...........+++++++++%@@#@#%@.....",
+"........+.+......+++................+.+......+++........",
+"........................................................",
+"........................................................",
+"........................................................",
+".......++++++++++..................++++@+++++...........",
+".....+++@@@%@@+++@+++............++@#####%@@@@@++.......",
+"....+@#####$$#$##%@++@+.........@#$$$$$=&$=$$#%@@@+.....",
+"...+%$*$$*$$**$*##$#%@%+.......+#=------,---==&$##%@....",
+"...@#&-------&-&&===*$#@@+.....@=!///////!/!!!,,--$%@+..",
+"...@&e____:5jj!5555(,(;=#@+....#!|2133o999oo99f9^^~,&%+.",
+"..+#(<7877[<_<<p[[[[<_e;=#@...+$m40000nl314qq00042ap,&@.",
+"..+#([b6bb78<p878888[[_'=$+...+$m000000n4qn0n000002i,=@.",
+"..+@)(_<88c8pc86c<_::e()$#@...+%}m20000nq0n0041fa|m5&$@.",
+"...+$=)e_ppcc877p_';;))=@+.....+&'}|24qnn0n043^{i~/,#+..",
+"...++#$)e_[}[i66[5>&&&=#++.....+@$*]f144qn00q9]!!!,$@+..",
+"....@@#&>(5__p8bc5-&=$$@+.......%#$,~^ff1q000o/!,-&%+...",
+"....++@$*->>,<cb[5-*$##++.......+%#=,/]{^3n00f/,-=$%+...",
+".....+@@#$*--_pdce**$%%+.........+@#$=,//10009,-=%#+....",
+"......+@@$$=&(c6<j=$$@@+..........+@#=-,!90049,-=#@+....",
+".......+@@#$='<6<(*$#%+............+@#$-,^401^,==%%.....",
+"........+@##*'_c_,$$#@+.............+%$$-i202{-=$@+.....",
+".........+@%#-:[_'&$$%+..............+#%=]|02{!-=#@.....",
+"..........+%#)e_e(-=#@@...............+#$/|2|^/,=%@.....",
+"..........+@@=;:e;;&*@+...............+@#(i||ii!-@@.....",
+"...........++$);'((;=$@+...............+@&/ii^m~,&%+....",
+"............@#*&)(e()=$@................@$-5}^am},&#....",
+".............++%&(_e;&*@.................+@#5m2|i5)%....",
+".............+@+*;e(;=*%.................+@@)~|m~,>#....",
+"..............+@#*&)**$@..................+@$>55,)&%....",
+"................++@####@....................+@#$$$$%....",
+"..................++@@++......................++#%@+....",
+"....................+@+.........................+%+.....",
+"........................................................",
+"........................................................",
+"........................................................",
+".........++@+@@+%+@@+++..............@+@@%@@%@%@@++.....",
+".......+@@#&)**#*=&&*#@+...........+@%&,/,-$-,5!,=%+....",
+"......++#$);:'&#&(e(')*#+.........+@$&/iai!=5^ami5,$+...",
+"......+@$=(<8:'=;_c<e'&#+.........+#=,m40ai,{a00ai5=@...",
+".....@@$$=e[7_'&;_8[_(>*%+.......@#=-,|004{!i200am]-#+..",
+"....+%#*=&e<b<(&(_[<_(;=@+......@#&-,5|0049!^1041m~,%@..",
+"....%$*==):[d<5>'_[<_e;&#@+.....#=),!}a000f]{1043|i!$%+.",
+"....@*&));_7d8:>:_c[<_()$@+.....#-5!/~2000f{f1n4419/-%+.",
+"....$=);(([6g7[5_c88[__;&$@.....=,_i^|0000qf1000q4ai!&#.",
+"....$&;e:<cdg68}[7b67c[e)=#+....&5i||40000n1q00000q|_,$+",
+"....$&;ee_cbhbc_p86688<e>=#....+=5p|az000001q000004|],$.",
+"....@$=&;(<6g7[e}p87c<:;=$@.....#=,5~m4000qf1q0004ai,=#.",
+"....++#$*&:8dc:,:<8[<:e)$@@.....+@==,5a0003{31n4qa|/>#@.",
+".....@+#$$e[dc5,j_p[_e(&#@+......@@$=-|000f{91q41f^!$#+.",
+".....+@@$*ec6[e-j_c<_:(&#@+......+%#=-|000f]910q1fm!$@+.",
+"......+@$#e[d[:-(_p[_5;&#++.......+%==|000f/^1401fi5$@+.",
+"......+@%$e[b<5-j:[<_e'=#@.......++%$*|0009]93q419i,$%..",
+"......++##([d[5-,_[__:;&@+........+%$=m000o/^3041fi!%@..",
+"......+@@$([b[e>,_p<:e'=%@........+@#=m0009]^344a|i,#@..",
+".......@@#(<b[e-,_<[_(;=@+.........@%$m0009/{10439i,#+..",
+".......+@#([d[_,e<c<_e'=%+.........+#$m0003^f4n02|i,#+..",
+".......++#(8d8<e_c7[_e;$@+.........+@$^0002f10002|~-#+..",
+".......+@@(cg6[_<868_(;*@..........+%#m0000240002m~>@...",
+"........++):[_e(::[_e;&$+...........+@}a02|^a242|i!=@...",
+"........++*;(;)=;(e(;)=#+...........++)pmi_!~m|^p/,$+...",
+".........++#$$$%*=))=*#@.............+@$=&*$-,_/(>=@....",
+"..........++@@@@$$=$$##+..............+@#%##=-,-=$$+....",
+"...........+@++++@##@++................+%++@@#$$%%+.....",
+".................+.+.........................+.+........",
+"........................................................",
+"........................................................",
+"...+@###$##@+%+@+@+++..........+%$===$$%@%@@@@+++.......",
+"..@#=;';&&=*##$$$#@++++.......%$,]i]/!,-$=&-==#@@++.....",
+".@#$;:_:e'-=*==&=*$$%@+@+....%$-ia2||{/,-,,!,-=&$%@@+...",
+".@$=e[8<_e'-*&);>)**$#%+++...%&(|0002f^/,!/]]/,-=$#@@+..",
+".+#*;:[__:(5,((5e::((;)&*#@..@$>ia021f99^99f|fa|^]}!>=@.",
+".+@$)e::::___}___[7c<_:';&#+.+#=_|a|af132121400042|i~5&+",
+".+@#&;(e:5_888[c7bgg78[_e'*@.+#$!]m9ff1n000000000002|i>@",
+"..%@=)>(5_[[8[__[8668<<:;)$+..%#,/{9f14400110000002ai_=+",
+".+@@$&>,:_~<8<:,_[88<_e;)=%+.+%%&!]^fll001f^140042ri/($+",
+"..+%#$-'/<<[p:j-'_<<_e;)$#@+..@#=-!^34q4q19/^1442|i5-$#+",
+"..@%$=-(_[p<[:'-'(::::()##+...@%=,/924q44f{/{91aff^/=$%.",
+"..@@*)':<8[[_5'=-;(':ee)$%@+..%#,/io4nqq1f{!/~^^a||/=#@+",
+"..@%=>(_[8c<_e,=&&-;e_e;$@+...@#,]^100n44f{j!j/i92a~-#@.",
+"..@@&(:_p[p[_j>=**=;e_:;$%@...%%59a1q0q419],,,,]|4|~=%%.",
+"..+#'_c<_:___(>==**;:[_;*@+...+$i2043f1119],,,,]a04i-@@.",
+"..@#ec7[5,(e_(>==**;:8['$@@...%=|000f{9|2^],,--~200i-%@.",
+"..+#(c6_'>,:_j-***=;_8[($@+...+$m002^]^a2^/,-,,]200m-#+.",
+"..++&(:;)&(<[:>=*==;:7c'*%+...+@5mai}!^101],-,,~20ni>#+.",
+"...+$=)&==(<7_'*=$=;_7[($++....@=,5!,,m402{,,-,p200m*%+.",
+"....+%$##$([8<,&&&&(:8[($@+.....@$==*-^004{!!j!^z00m&@+.",
+"....++%%##;:[<:(::__[[:)#+......+@%#$=pa04a9|a2200a}=@..",
+"......+@%#)e<[[c[88c[:e&#@........+%#$}|4000000002|5$%..",
+".......++@=;:<[866d8[e;=@+.........+@@,ia40000000|p,%+..",
+"........++$=);::_:__;)=#+...........+@&(}iaaa222i_,$+...",
+"..........%$*=);;;;;&*$@+.............%&-,}ppii}5>&#+...",
+"...........+%%$****$#++................@#$&>>))=$@+.....",
+"............+@@####%@+..................+@#$$$$$@++.....",
+".............++@+++++....................+@@@@%++.......",
+"................+...........................+...........",
+"........................................................",
+"........................................................",
+".........++++........................++++...............",
+".......@$==$$#+++++@@@++...........%-,,-=$@+++@@%%@+....",
+"......+$);))&=$@@@@#$=$+..........+&}i~}5,&%#%#$&>&@....",
+"......+='e(;;&*%%##$$=*#+.........+,i|mii!-##$=--,>*+...",
+"......+*(eeee;&$*=&;(e'&#+........@(i|r||~!=-,5~m|i5$+..",
+"......@=;e:__(>$&)'(:[_;$+........@,p|av2|]-!/ima02p=@..",
+".....++=;e__[:'=-;(:[8[($%+......+@(i|140f{,/]^1000m-#+.",
+".....++*&;:[8_'&;e__<<e;*@+......+%-5pa001^!~|2z44a~>%+.",
+"......@$*):[6<(-':<<::'&*@+.......@=,/|0049/^o04aai5>#+.",
+".....++%$*:[dc5>(_8[e;)=$#+......+%%&,f0009]9200|i},=$@.",
+".....+@%$=e[6c}5__<_()=$#+.......+@$=,900nlo1102m/,-$@..",
+".....+@##$e<77[[[__e;&*#@+.......+%$=-9400044l3|~!-$%+..",
+".....+@#$=,_c876[<e(=$#+++.......+@=-,^1n00002f^!=$%++..",
+".....+%#$=e<876d8<e;&##@+........@%$-,92n000019~!=$%+...",
+"....+@@$*=,_[mbg6_'>&$@%+.......+%#=-,^1000001^]!=%#+...",
+"...++%##=&j_c6gh6~'-$$#++......++#$=,!93n00004{/-=*%+...",
+"...+@$=->':_p86d8<e;-##@+......+#-,/]^f1q00004f{/=$@+...",
+"..+%=);:<[c[cp[pccc_'$#@+.....+#,/if2000040qn002i-$#@...",
+"..+#&;:[6d88<<:e<868e&#%@+....%$5i|0000n44a94000|!=%@+..",
+"..@$)e_[868[_:';:<6[:&*#@+....@=}|2000044f^i|q00f5-*%+..",
+"..+#)e__<<ee;>-&;(ee(;)=##+...@$}|2244||i]/!pm||mi},&$+.",
+"..+#)e_:e(;&*=$$==);;(;)=$@...+$_|2||m~!-,--,,}~pmi/,=%.",
+"...@&(:;;&=$#####%$=);;)=$@....%5m2i~5,-$$$$$$=,}ic/,&#.",
+"...+$&;&**$@@%@+@@@#*&=$%%+....+=5}5>-&#%##@@%#$>,,&$#+.",
+"....+@%#@@++++++++@+@@@@@+......@#$$%@@+++++++@+%###@+..",
+"........++++.........+..............++++.........+......",
+"........................................................",
+"........................................................",
+"........................................................",
+"........................................................",
+"........................................................",
+"...+@@#@+++....................+%%$%@++.................",
+"..++#*$$#@+...................+@*--=$@@.................",
+".+#$=&)=$$%@+................@$=,5/!-=$@+...............",
+"@$&>(eee'>=#++..............@&5~^|a|i],=@+..............",
+"+&(:_<[_:e;*@++.............@5ma24011m~-#@+.............",
+"@)':<[8<<:'=#@++............@5m|400042{,$@++............",
+"+$&;e<[<<<(-##@+++++@##+@...+&5p|40444m/=$%@++++%$$@@...",
+"+@$=(:[[[<e-*#%%+++@#$##%+..+%&,ma0000|/-$##@@@#$==$#@..",
+".+@$;::[[c:>$##%%%%#$&=$#@+..@#&~a240na]-=$###%=>!,-$@+.",
+".@@%&(:[76<(=*$#$*=;;:;&#+...@@$5^|0004^,-===-,/i|i5$@..",
+".+@@&)e[7g[,=$$#*);(:<:)$+...+@#!~90000^,-==-/~ma4|}=+..",
+"..+%$&;[bh8(&=$**;(e<[_;#+....@%-!i000q9!,--,~ma404~$+..",
+"..+@$=):cdc5>-=*-;:::e(*@+....+@&,/1000f]/,-/iaaa|m,#@..",
+"....##=:[8<:,>&$;(_:(;&$@+.....+$=,|000f^]!-]m2amp5&@+..",
+"...+@@#'_8[_e,-*;e<:;=$#+......+@%={20q1o^/,]|4|i,=$+...",
+"....+%$)(_<[c5>=&;(;&$#++.......%#=}m22009],5~mp5>$%+...",
+"....++%=>(_c6<,=&&)&$#@+........+@%,]^100q^,!!}!=$@%....",
+".....@@#$&_8hce=**#$@@@+.........%#=-510009,,-==##@+....",
+"......+%$=(<8<e'-=$##+@+..........+#-,m404f{/,=$$%@+....",
+"......++@$)(::__e&*##@++..........+@#=/m|a239/-$$@@+....",
+".......+@@#=)e_c:;#$@%++...........+##=,/|20a]==##@+....",
+"........@%#$=;e_:(;&$#@+............@%$-,i|2a^]!-$%+....",
+".........+@##&;(eee(&#@@.............+#$=5~||||^!=#%....",
+"..........+@@$=&(:[:'=#%..............+@%=,j^20ai,$#....",
+"...........++#$*)(:e;=*@+..............+@$&,_m1r],-%+...",
+"............++@$*&;);)&$+...............+@%*>5~}~}5&+...",
+"..............++%#$=&;)#+.................+@%$&,5~/&@...",
+"...............++++#*)&$+..................++@@&-}5=+...",
+"................+.++#$#+....................+.+@$=$@....",
+".....................++..........................++.....",
+"........................................................"};
diff --git a/hacks/images/noseguy/nose-f1.xbm b/hacks/images/noseguy/nose-f1.xbm
new file mode 100644 (file)
index 0000000..543af3e
--- /dev/null
@@ -0,0 +1,38 @@
+#define nose_f1_width 64
+#define nose_f1_height 64
+static unsigned char nose_f1_bits[] = {
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0xc0,0xff,0xff,0x07,0x00,0x00,0x00,0x00,0x40,0x00,
+ 0x00,0x04,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x40,
+ 0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x04,0x00,0x00,0x00,0x00,
+ 0x40,0x00,0x00,0x04,0x00,0x00,0x00,0xf8,0xff,0xff,0xff,0xff,0x3f,0x00,0x00,
+ 0x08,0x00,0xc0,0x1f,0x00,0x20,0x00,0x00,0x08,0x00,0x30,0x60,0x00,0x20,0x00,
+ 0x00,0xf8,0xff,0x0f,0x80,0xff,0x3f,0x00,0x00,0x00,0x02,0x02,0x00,0x82,0x00,
+ 0x00,0x00,0x00,0x03,0x01,0x00,0x84,0x01,0x00,0x00,0x00,0x81,0x00,0x00,0x08,
+ 0x01,0x00,0x00,0x80,0x80,0x00,0x00,0x08,0x02,0x00,0x00,0x80,0x40,0x00,0x00,
+ 0x10,0x02,0x00,0x00,0x40,0x40,0x00,0x00,0x10,0x04,0x00,0x00,0x40,0x20,0x00,
+ 0x00,0x20,0x04,0x00,0x00,0x60,0x20,0x00,0x00,0x20,0x0c,0x00,0x00,0x20,0x20,
+ 0x00,0x00,0x20,0x08,0x00,0x00,0x20,0x20,0x00,0x00,0x20,0x08,0x00,0x00,0x10,
+ 0x20,0x00,0x00,0x20,0x10,0x00,0x00,0x10,0x20,0x00,0x00,0x20,0x10,0x00,0x00,
+ 0x10,0x20,0x00,0x00,0x20,0x10,0x00,0x00,0x10,0x40,0x00,0x00,0x10,0x10,0x00,
+ 0x00,0x10,0x40,0x00,0x00,0x10,0x10,0x00,0x00,0x10,0x80,0x00,0x00,0x08,0x10,
+ 0x00,0x00,0x10,0x80,0x00,0x00,0x08,0x10,0x00,0x00,0x30,0x00,0x01,0x00,0x04,
+ 0x18,0x00,0x00,0x20,0x00,0x02,0x00,0x02,0x08,0x00,0x00,0x20,0x00,0x0c,0x80,
+ 0x01,0x08,0x00,0x00,0x60,0x00,0x30,0x60,0x00,0x0c,0x00,0x00,0x40,0x00,0xc0,
+ 0x1f,0x00,0x04,0x00,0x00,0xc0,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x01,
+ 0x00,0x00,0x00,0x02,0x00,0x00,0x00,0xfe,0xff,0xff,0xff,0x01,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x0f,0xc0,0x0f,0x00,0x00,0x00,
+ 0x00,0x40,0x10,0x20,0x10,0x00,0x00,0x00,0x00,0x20,0x60,0x30,0x20,0x00,0x00,
+ 0x00,0x00,0x20,0xc0,0x18,0x20,0x00,0x00,0xc0,0x7f,0x10,0x80,0x0d,0x40,0xe0,
+ 0x01,0x70,0xc0,0x18,0x00,0x05,0x40,0x1c,0x06,0x10,0x00,0x0f,0x00,0x05,0x80,
+ 0x07,0x08,0x08,0x00,0x06,0x00,0x05,0x80,0x01,0x08,0x08,0x00,0x18,0x00,0x05,
+ 0xc0,0x00,0x10,0x04,0x00,0x30,0x00,0x05,0x30,0x00,0x10,0x04,0x00,0x00,0x80,
+ 0x08,0x18,0x00,0x20,0x04,0x00,0x00,0x80,0x08,0x00,0x00,0x20,0x04,0x00,0x00,
+ 0x40,0x10,0x00,0x00,0x20,0x24,0x00,0x00,0x40,0x10,0x00,0x00,0x22,0x24,0x00,
+ 0x00,0x40,0x10,0x00,0x00,0x22,0x44,0x00,0x00,0x40,0x10,0x00,0x00,0x11,0x84,
+ 0x01,0x00,0xc0,0x18,0x00,0xc0,0x10,0x08,0x00,0x00,0x80,0x08,0x00,0x00,0x08,
+ 0x30,0x00,0x00,0x80,0x08,0x00,0x00,0x04,0xe0,0xff,0xff,0xff,0xf8,0xff,0xff,
+ 0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00};
diff --git a/hacks/images/noseguy/nose-f1.xpm b/hacks/images/noseguy/nose-f1.xpm
new file mode 100644 (file)
index 0000000..a6e03bf
--- /dev/null
@@ -0,0 +1,74 @@
+/* XPM */
+static char * nose_f1_xpm[] = {
+"64 64 7 1",
+"      c black         m black",
+".     c black         m white",
+"X     c gray          m black",
+"o     c yellow        m black",
+"O     c yellow2       m black",
+"+     c purple        m black",
+"@     c purple3       m black",
+"                                                                ",
+"                                                                ",
+"                                                                ",
+"                                                                ",
+"                                                                ",
+"                                                                ",
+"                      .....................                     ",
+"                      .XXXXXXXXXXXXXXXXXXX.                     ",
+"                      .XXXXXXXXXXXXXXXXXXX.                     ",
+"                      .XXXXXXXXXXXXXXXXXXX.                     ",
+"                      .XXXXXXXXXXXXXXXXXXX.                     ",
+"                      .XXXXXXXXXXXXXXXXXXX.                     ",
+"           ...........................................          ",
+"           .XXXXXXXXXXXXXXXXXX.......XXXXXXXXXXXXXXXX.          ",
+"           .XXXXXXXXXXXXXXXX..ooooooo..XXXXXXXXXXXXXX.          ",
+"           .................ooooooooooo...............          ",
+"                 .OOOOOOO.ooooooooooooooo.OOOOO.                ",
+"                ..OOOOOO.ooooooooooooooooo.OOOO..               ",
+"                .OOOOOO.ooooooooooooooooooo.OOOO.               ",
+"               .OOOOOOO.ooooooooooooooooooo.OOOOO.              ",
+"               .OOOOOO.ooooooooooooooooooooo.OOOO.              ",
+"              .OOOOOOO.ooooooooooooooooooooo.OOOOO.             ",
+"              .OOOOOO.ooooooooooooooooooooooo.OOOO.             ",
+"             ..OOOOOO.ooooooooooooooooooooooo.OOOO..            ",
+"             .OOOOOOO.ooooooooooooooooooooooo.OOOOO.            ",
+"             .OOOOOOO.ooooooooooooooooooooooo.OOOOO.            ",
+"            .OOOOOOOO.ooooooooooooooooooooooo.OOOOOO.           ",
+"            .OOOOOOOO.ooooooooooooooooooooooo.OOOOOO.           ",
+"            .OOOOOOOO.ooooooooooooooooooooooo.OOOOOO.           ",
+"            .OOOOOOOOO.ooooooooooooooooooooo.OOOOOOO.           ",
+"            .OOOOOOOOO.ooooooooooooooooooooo.OOOOOOO.           ",
+"            .OOOOOOOOOO.ooooooooooooooooooo.OOOOOOOO.           ",
+"            .OOOOOOOOOO.ooooooooooooooooooo.OOOOOOOO.           ",
+"            ..OOOOOOOOOO.ooooooooooooooooo.OOOOOOOO..           ",
+"             .OOOOOOOOOOO.ooooooooooooooo.OOOOOOOOO.            ",
+"             .OOOOOOOOOOOO..ooooooooooo..OOOOOOOOOO.            ",
+"             ..OOOOOOOOOOOOO..ooooooo..OOOOOOOOOOO..            ",
+"              .OOOOOOOOOOOOOOO.......OOOOOOOOOOOOO.             ",
+"              ..OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO..             ",
+"                .OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.              ",
+"                 ................................               ",
+"                                                                ",
+"                       .....          ......                    ",
+"                      .+++++.        .++++++.                   ",
+"                     .+++++++..     ..+++++++.                  ",
+"                     .++++++++..   ..++++++++.                  ",
+"      .........     .++++++++++.. ..++++++++++.      ....       ",
+"    ...+++++++..   ..+++++++++++. .+++++++++++.   ...++++..     ",
+"    .+++++++++++....@+++++++++++. .+++++++++++@....++++++++.    ",
+"   .+++++++++++++..@@+++++++++++. .++++++++++@@..++++++++++.    ",
+"   .+++++++++++++++..@++++++++++. .+++++++++@@..++++++++++++.   ",
+"  .+++++++++++++++++..@+++++++++. .++++++++@..++++++++++++++.   ",
+"  .++++++++++++++++++++++++++++.   .+++++++..++++++++++++++++.  ",
+"  .++++++++++++++++++++++++++++.   .+++++++++++++++++++++++++.  ",
+"  .+++++++++++++++++++++++++++.     .++++++++++++++++++++++++.  ",
+"  .+@.++++++++++++++++++++++++.     .++++++++++++++++++++.+++.  ",
+"  .+@.++++++++++++++++++++++++.     .++++++++++++++++++++.@++.  ",
+"  .+@@.+++++++++++++++++++++++.     .+++++++++++++++++++.@@+.   ",
+"  .++@@..+++++++++++++++++++++..   ..+++++++++++++++++..@@++.   ",
+"   .++@@++++++++++++++++++++++@.   .@++++++++++++++++++@@++.    ",
+"    ..@@@@@@@@@@@@@@@@@@@@@@@@@.   .@@@@@@@@@@@@@@@@@@@@@@.     ",
+"     ...........................   .......................      ",
+"                                                                ",
+"                                                                "};
diff --git a/hacks/images/noseguy/nose-f2.xbm b/hacks/images/noseguy/nose-f2.xbm
new file mode 100644 (file)
index 0000000..6851b20
--- /dev/null
@@ -0,0 +1,38 @@
+#define nose_f2_width 64
+#define nose_f2_height 64
+static unsigned char nose_f2_bits[] = {
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0xc0,0xff,0xff,0x07,0x00,0x00,0x00,0x00,0x40,0x00,
+ 0x00,0x04,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x40,
+ 0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x04,0x00,0x00,0x00,0x00,
+ 0x40,0x00,0x00,0x04,0x00,0x00,0x00,0xf8,0xff,0xff,0xff,0xff,0x3f,0x00,0x00,
+ 0x08,0x00,0xe0,0x0f,0x00,0x20,0x00,0x00,0x08,0x00,0x18,0x30,0x00,0x20,0x00,
+ 0x00,0xf8,0xff,0x07,0xc0,0xff,0x3f,0x00,0x00,0x00,0x02,0x01,0x00,0x81,0x00,
+ 0x00,0x00,0x00,0x83,0x00,0x00,0x82,0x01,0x00,0x00,0x00,0x41,0x00,0x00,0x04,
+ 0x01,0x00,0x00,0x80,0x40,0x00,0x00,0x04,0x02,0x00,0x00,0x80,0x20,0x00,0x00,
+ 0x08,0x02,0x00,0x00,0x40,0x20,0x00,0x00,0x08,0x04,0x00,0x00,0x40,0x10,0x00,
+ 0x00,0x10,0x04,0x00,0x00,0x60,0x10,0x00,0x00,0x10,0x0c,0x00,0x00,0x20,0x10,
+ 0x00,0x00,0x10,0x08,0x00,0x00,0x30,0x10,0x00,0x00,0x10,0x08,0x00,0x00,0x10,
+ 0x10,0x00,0x00,0x10,0x10,0x00,0x00,0x10,0x10,0x00,0x00,0x10,0x10,0x00,0x00,
+ 0x10,0x10,0x00,0x00,0x10,0x10,0x00,0x00,0x10,0x20,0x00,0x00,0x08,0x10,0x00,
+ 0x00,0x10,0x20,0x00,0x00,0x08,0x10,0x00,0x00,0x10,0x40,0x00,0x00,0x04,0x10,
+ 0x00,0x00,0x30,0x40,0x00,0x00,0x04,0x10,0x00,0x00,0x20,0x80,0x00,0x00,0x02,
+ 0x18,0x00,0x00,0x20,0x00,0x01,0x00,0x01,0x08,0x00,0x00,0x60,0x00,0x06,0xc0,
+ 0x00,0x08,0x00,0x00,0x80,0x00,0x18,0x30,0x00,0x0c,0x00,0x00,0x80,0x00,0xe0,
+ 0x0f,0x00,0x04,0x00,0x00,0x80,0x01,0x00,0x00,0x00,0x06,0x00,0x00,0x00,0x01,
+ 0x00,0x00,0x00,0x02,0x00,0x00,0x00,0xfe,0xff,0xff,0xff,0x01,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x0f,0x00,0x00,0x00,
+ 0x00,0xff,0x00,0x04,0x10,0x00,0x00,0x00,0xe0,0x00,0x07,0x02,0x10,0x00,0x00,
+ 0x00,0x30,0x00,0x8c,0x01,0x20,0x00,0x00,0x00,0x0c,0x00,0x90,0x00,0x20,0x00,
+ 0x00,0x00,0x04,0x03,0x60,0x00,0x20,0x00,0x00,0x00,0xc2,0x00,0xc0,0x00,0x20,
+ 0x00,0x00,0x00,0x42,0x00,0x00,0x01,0x20,0x00,0x00,0x00,0x21,0x00,0x00,0x02,
+ 0x20,0x00,0x00,0x00,0x21,0x00,0x00,0x06,0x20,0x00,0x00,0x00,0x21,0x00,0x00,
+ 0x00,0x20,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x03,0x00,
+ 0x00,0x00,0x40,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x02,
+ 0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x20,0x00,0x00,0x00,
+ 0x18,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x10,0x00,0x00,
+ 0x00,0xc0,0xff,0xff,0xff,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00};
diff --git a/hacks/images/noseguy/nose-f2.xpm b/hacks/images/noseguy/nose-f2.xpm
new file mode 100644 (file)
index 0000000..3763b58
--- /dev/null
@@ -0,0 +1,74 @@
+/* XPM */
+static char * nose_f2_xpm[] = {
+"64 64 7 1",
+"      c black         m black",
+".     c black         m white",
+"X     c gray          m black",
+"o     c yellow        m black",
+"O     c yellow2       m black",
+"+     c purple        m black",
+"@     c purple3       m black",
+"                                                                ",
+"                                                                ",
+"                                                                ",
+"                                                                ",
+"                                                                ",
+"                                                                ",
+"                      .....................                     ",
+"                      .XXXXXXXXXXXXXXXXXXX.                     ",
+"                      .XXXXXXXXXXXXXXXXXXX.                     ",
+"                      .XXXXXXXXXXXXXXXXXXX.                     ",
+"                      .XXXXXXXXXXXXXXXXXXX.                     ",
+"                      .XXXXXXXXXXXXXXXXXXX.                     ",
+"           ...........................................          ",
+"           .XXXXXXXXXXXXXXXXX.......XXXXXXXXXXXXXXXXX.          ",
+"           .XXXXXXXXXXXXXXX..ooooooo..XXXXXXXXXXXXXXX.          ",
+"           ................ooooooooooo................          ",
+"                 .OOOOOO.ooooooooooooooo.OOOOOO.                ",
+"                ..OOOOO.ooooooooooooooooo.OOOOO..               ",
+"                .OOOOO.ooooooooooooooooooo.OOOOO.               ",
+"               .OOOOOO.ooooooooooooooooooo.OOOOOO.              ",
+"               .OOOOO.ooooooooooooooooooooo.OOOOO.              ",
+"              .OOOOOO.ooooooooooooooooooooo.OOOOOO.             ",
+"              .OOOOO.ooooooooooooooooooooooo.OOOOO.             ",
+"             ..OOOOO.ooooooooooooooooooooooo.OOOOO..            ",
+"             .OOOOOO.ooooooooooooooooooooooo.OOOOOO.            ",
+"            ..OOOOOO.ooooooooooooooooooooooo.OOOOOO.            ",
+"            .OOOOOOO.ooooooooooooooooooooooo.OOOOOOO.           ",
+"            .OOOOOOO.ooooooooooooooooooooooo.OOOOOOO.           ",
+"            .OOOOOOO.ooooooooooooooooooooooo.OOOOOOO.           ",
+"            .OOOOOOOO.ooooooooooooooooooooo.OOOOOOOO.           ",
+"            .OOOOOOOO.ooooooooooooooooooooo.OOOOOOOO.           ",
+"            .OOOOOOOOO.ooooooooooooooooooo.OOOOOOOOO.           ",
+"            ..OOOOOOOO.ooooooooooooooooooo.OOOOOOOOO.           ",
+"             .OOOOOOOOO.ooooooooooooooooo.OOOOOOOOO..           ",
+"             .OOOOOOOOOO.ooooooooooooooo.OOOOOOOOOO.            ",
+"             ..OOOOOOOOOO..ooooooooooo..OOOOOOOOOOO.            ",
+"               .OOOOOOOOOOO..ooooooo..OOOOOOOOOOOO..            ",
+"               .OOOOOOOOOOOOO.......OOOOOOOOOOOOOO.             ",
+"               ..OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO..             ",
+"                .OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.              ",
+"                 ................................               ",
+"                                                                ",
+"                                   .........                    ",
+"                ........          .+++++++++.                   ",
+"             ...++++++++...      .++++++++++.                   ",
+"            ..++++++++++++..   ..++++++++++++.                  ",
+"          ..++++++++++++++++.  .@++++++++++++.                  ",
+"          .++++@..+++++++++++..@@++++++++++++.                  ",
+"         .++++..++++++++++++++..@++++++++++++.                  ",
+"         .+++@.+++++++++++++++++.@+++++++++++.                  ",
+"        .+++@.+++++++++++++++++++.@++++++++++.                  ",
+"        .+++@.+++++++++++++++++++..++++++++++.                  ",
+"        .+++@.+++++++++++++++++++++++++++++++.                  ",
+"        .++++++++++++++++++++++++++++++++++++@.                 ",
+"        ..@++++++++++++++++++++++++++++++++++@.                 ",
+"         .@@+++++++++++++++++++++++++++++++++@.                 ",
+"         .@@++++++++++++++++++++++++++++++++@@.                 ",
+"          .@@@++++++++++++++++++++++++++++++@.                  ",
+"           ..@@@++++++++++++++++++++@@@++++@@.                  ",
+"            ...@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.                   ",
+"              ..............................                    ",
+"                                                                ",
+"                                                                ",
+"                                                                "};
diff --git a/hacks/images/noseguy/nose-f3.xbm b/hacks/images/noseguy/nose-f3.xbm
new file mode 100644 (file)
index 0000000..e70f229
--- /dev/null
@@ -0,0 +1,38 @@
+#define nose_f3_width 64
+#define nose_f3_height 64
+static unsigned char nose_f3_bits[] = {
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0xe0,0xff,0xff,0x03,0x00,0x00,0x00,0x00,0x20,0x00,
+ 0x00,0x02,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x20,
+ 0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x02,0x00,0x00,0x00,0x00,
+ 0x20,0x00,0x00,0x02,0x00,0x00,0x00,0xfc,0xff,0xff,0xff,0xff,0x1f,0x00,0x00,
+ 0x04,0x00,0xf0,0x07,0x00,0x10,0x00,0x00,0x04,0x00,0x0c,0x18,0x00,0x10,0x00,
+ 0x00,0xfc,0xff,0x03,0xe0,0xff,0x1f,0x00,0x00,0x00,0x81,0x00,0x80,0x40,0x00,
+ 0x00,0x00,0x80,0x41,0x00,0x00,0xc1,0x00,0x00,0x00,0x80,0x20,0x00,0x00,0x82,
+ 0x00,0x00,0x00,0x40,0x20,0x00,0x00,0x02,0x01,0x00,0x00,0x40,0x10,0x00,0x00,
+ 0x04,0x01,0x00,0x00,0x20,0x10,0x00,0x00,0x04,0x02,0x00,0x00,0x20,0x08,0x00,
+ 0x00,0x08,0x02,0x00,0x00,0x30,0x08,0x00,0x00,0x08,0x06,0x00,0x00,0x10,0x08,
+ 0x00,0x00,0x08,0x04,0x00,0x00,0x10,0x08,0x00,0x00,0x08,0x0c,0x00,0x00,0x08,
+ 0x08,0x00,0x00,0x08,0x08,0x00,0x00,0x08,0x08,0x00,0x00,0x08,0x08,0x00,0x00,
+ 0x08,0x08,0x00,0x00,0x08,0x08,0x00,0x00,0x08,0x10,0x00,0x00,0x04,0x08,0x00,
+ 0x00,0x08,0x10,0x00,0x00,0x04,0x08,0x00,0x00,0x08,0x20,0x00,0x00,0x02,0x08,
+ 0x00,0x00,0x08,0x20,0x00,0x00,0x02,0x0c,0x00,0x00,0x18,0x40,0x00,0x00,0x01,
+ 0x04,0x00,0x00,0x10,0x80,0x00,0x80,0x00,0x04,0x00,0x00,0x10,0x00,0x03,0x60,
+ 0x00,0x06,0x00,0x00,0x30,0x00,0x0c,0x18,0x00,0x01,0x00,0x00,0x20,0x00,0xf0,
+ 0x07,0x00,0x01,0x00,0x00,0x60,0x00,0x00,0x00,0x80,0x01,0x00,0x00,0x40,0x00,
+ 0x00,0x00,0x80,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0x7f,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x1f,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x08,0x20,0x00,0xff,0x00,0x00,0x00,0x00,0x08,0x40,0xe0,0x00,0x07,0x00,
+ 0x00,0x00,0x04,0x80,0x31,0x00,0x0c,0x00,0x00,0x00,0x04,0x00,0x09,0x00,0x30,
+ 0x00,0x00,0x00,0x04,0x00,0x06,0xc0,0x20,0x00,0x00,0x00,0x04,0x00,0x03,0x00,
+ 0x43,0x00,0x00,0x00,0x04,0x80,0x00,0x00,0x42,0x00,0x00,0x00,0x04,0x40,0x00,
+ 0x00,0x84,0x00,0x00,0x00,0x04,0x60,0x00,0x00,0x84,0x00,0x00,0x00,0x04,0x00,
+ 0x00,0x00,0x84,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x02,
+ 0x00,0x00,0x00,0xc0,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x40,0x00,0x00,0x00,
+ 0x02,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x20,0x00,0x00,
+ 0x00,0x04,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x0e,0x00,
+ 0x00,0x00,0xf0,0xff,0xff,0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00};
diff --git a/hacks/images/noseguy/nose-f3.xpm b/hacks/images/noseguy/nose-f3.xpm
new file mode 100644 (file)
index 0000000..c60c5f3
--- /dev/null
@@ -0,0 +1,74 @@
+/* XPM */
+static char * nose_f3_xpm[] = {
+"64 64 7 1",
+"      c black         m black",
+".     c black         m white",
+"X     c gray          m black",
+"o     c yellow        m black",
+"O     c yellow2       m black",
+"+     c purple        m black",
+"@     c purple3       m black",
+"                                                                ",
+"                                                                ",
+"                                                                ",
+"                                                                ",
+"                                                                ",
+"                                                                ",
+"                     .....................                      ",
+"                     .XXXXXXXXXXXXXXXXXXX.                      ",
+"                     .XXXXXXXXXXXXXXXXXXX.                      ",
+"                     .XXXXXXXXXXXXXXXXXXX.                      ",
+"                     .XXXXXXXXXXXXXXXXXXX.                      ",
+"                     .XXXXXXXXXXXXXXXXXXX.                      ",
+"          ...........................................           ",
+"          .XXXXXXXXXXXXXXXXX.......XXXXXXXXXXXXXXXXX.           ",
+"          .XXXXXXXXXXXXXXX..ooooooo..XXXXXXXXXXXXXXX.           ",
+"          ................ooooooooooo................           ",
+"                .OOOOOO.ooooooooooooooo.OOOOOO.                 ",
+"               ..OOOOO.ooooooooooooooooo.OOOOO..                ",
+"               .OOOOO.ooooooooooooooooooo.OOOOO.                ",
+"              .OOOOOO.ooooooooooooooooooo.OOOOOO.               ",
+"              .OOOOO.ooooooooooooooooooooo.OOOOO.               ",
+"             .OOOOOO.ooooooooooooooooooooo.OOOOOO.              ",
+"             .OOOOO.ooooooooooooooooooooooo.OOOOO.              ",
+"            ..OOOOO.ooooooooooooooooooooooo.OOOOO..             ",
+"            .OOOOOO.ooooooooooooooooooooooo.OOOOOO.             ",
+"            .OOOOOO.ooooooooooooooooooooooo.OOOOOO..            ",
+"           .OOOOOOO.ooooooooooooooooooooooo.OOOOOOO.            ",
+"           .OOOOOOO.ooooooooooooooooooooooo.OOOOOOO.            ",
+"           .OOOOOOO.ooooooooooooooooooooooo.OOOOOOO.            ",
+"           .OOOOOOOO.ooooooooooooooooooooo.OOOOOOOO.            ",
+"           .OOOOOOOO.ooooooooooooooooooooo.OOOOOOOO.            ",
+"           .OOOOOOOOO.ooooooooooooooooooo.OOOOOOOOO.            ",
+"           .OOOOOOOOO.ooooooooooooooooooo.OOOOOOOO..            ",
+"           ..OOOOOOOOO.ooooooooooooooooo.OOOOOOOOO.             ",
+"            .OOOOOOOOOO.ooooooooooooooo.OOOOOOOOOO.             ",
+"            .OOOOOOOOOOO..ooooooooooo..OOOOOOOOOO..             ",
+"            ..OOOOOOOOOOOO..ooooooo..OOOOOOOOOOO.               ",
+"             .OOOOOOOOOOOOOO.......OOOOOOOOOOOOO.               ",
+"             ..OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO..               ",
+"              .OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.                ",
+"               ................................                 ",
+"                                                                ",
+"                    .........                                   ",
+"                   .+++++++++.          ........                ",
+"                   .++++++++++.      ...++++++++...             ",
+"                  .++++++++++++..   ..++++++++++++..            ",
+"                  .++++++++++++@.  .++++++++++++++++..          ",
+"                  .++++++++++++@@..+++++++++++..@++++.          ",
+"                  .++++++++++++@..++++++++++++++..++++.         ",
+"                  .+++++++++++@.+++++++++++++++++.@+++.         ",
+"                  .++++++++++@.+++++++++++++++++++.@+++.        ",
+"                  .++++++++++..+++++++++++++++++++.@+++.        ",
+"                  .+++++++++++++++++++++++++++++++.@+++.        ",
+"                 .@++++++++++++++++++++++++++++++++++++.        ",
+"                 .@++++++++++++++++++++++++++++++++++@..        ",
+"                 .@+++++++++++++++++++++++++++++++++@@.         ",
+"                 .@@++++++++++++++++++++++++++++++++@@.         ",
+"                  .@++++++++++++++++++++++++++++++@@@.          ",
+"                  .@@++++@@@++++++++++++++++++++@@@..           ",
+"                   .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@...            ",
+"                    ..............................              ",
+"                                                                ",
+"                                                                ",
+"                                                                "};
diff --git a/hacks/images/noseguy/nose-f4.xbm b/hacks/images/noseguy/nose-f4.xbm
new file mode 100644 (file)
index 0000000..024eead
--- /dev/null
@@ -0,0 +1,38 @@
+#define nose_f4_width 64
+#define nose_f4_height 64
+static unsigned char nose_f4_bits[] = {
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0xfc,0xff,0x01,0x00,0x00,0x00,0x00,0xc0,0x03,0x00,0x1e,0x00,
+ 0x00,0x00,0x00,0x38,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x06,0x00,0x00,0x00,
+ 0x03,0x00,0x00,0x80,0x01,0x00,0x00,0x00,0x04,0x00,0x00,0x40,0x00,0x00,0x00,
+ 0x00,0x08,0x00,0x00,0x20,0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x10,0x00,0x80,
+ 0x1f,0x00,0x40,0x00,0x00,0x08,0x00,0x60,0x60,0x00,0x80,0x00,0x00,0x08,0x00,
+ 0x10,0x80,0x00,0x80,0x00,0x00,0x04,0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x04,
+ 0x00,0x08,0x00,0x01,0x00,0x01,0x00,0x02,0x00,0x18,0x80,0x01,0x00,0x02,0x00,
+ 0x02,0x00,0x68,0x60,0x01,0x00,0x02,0x00,0x02,0x00,0x88,0x1f,0x01,0x00,0x02,
+ 0x00,0x02,0x00,0x08,0x00,0x01,0x00,0x02,0x00,0x02,0x00,0x10,0x80,0x00,0x00,
+ 0x03,0x00,0x06,0x00,0x60,0x60,0x00,0x80,0x02,0x00,0x0c,0x00,0x80,0x1f,0x00,
+ 0x40,0x01,0x00,0x14,0x00,0x00,0x00,0x00,0x20,0x01,0x00,0x28,0x00,0x00,0x00,
+ 0x00,0x90,0x00,0x00,0x50,0x00,0x00,0x00,0x00,0x48,0x00,0x00,0xa0,0x01,0x00,
+ 0x00,0x00,0x26,0x00,0x00,0x40,0x1e,0x00,0x00,0xc0,0x11,0x00,0x00,0x80,0xe1,
+ 0x03,0x00,0x3c,0x0c,0x00,0x00,0x00,0x0e,0xfc,0xff,0x83,0x03,0x00,0x00,0x00,
+ 0xf0,0x01,0x00,0x78,0x00,0x00,0x00,0x00,0x00,0xfe,0xff,0x0f,0x00,0x00,0x00,
+ 0x00,0x80,0x03,0x00,0x0c,0x00,0x00,0x00,0x00,0x80,0x02,0x00,0x14,0x00,0x00,
+ 0x00,0x00,0x60,0x04,0x00,0x12,0x00,0x00,0xc0,0x7f,0x10,0x04,0x00,0x22,0xe0,
+ 0x01,0x70,0xc0,0x18,0x08,0x00,0x61,0x1c,0x06,0x10,0x00,0x0f,0x30,0xc0,0x80,
+ 0x07,0x08,0x08,0x00,0x06,0xc0,0x3f,0x80,0x01,0x08,0x08,0x00,0x18,0x00,0x02,
+ 0xc0,0x00,0x10,0x04,0x00,0x30,0x00,0x05,0x30,0x00,0x10,0x04,0x00,0x00,0x80,
+ 0x08,0x18,0x00,0x20,0x04,0x00,0x00,0x80,0x08,0x00,0x00,0x20,0x04,0x00,0x00,
+ 0x40,0x10,0x00,0x00,0x20,0x24,0x00,0x00,0x40,0x10,0x00,0x00,0x22,0x24,0x00,
+ 0x00,0x40,0x10,0x00,0x00,0x22,0x44,0x00,0x00,0x40,0x10,0x00,0x00,0x11,0x84,
+ 0x01,0x00,0xc0,0x18,0x00,0xc0,0x10,0x08,0x00,0x00,0x80,0x08,0x00,0x00,0x08,
+ 0x30,0x00,0x00,0x80,0x08,0x00,0x00,0x04,0xe0,0xff,0xff,0xff,0xf8,0xff,0xff,
+ 0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00};
diff --git a/hacks/images/noseguy/nose-f4.xpm b/hacks/images/noseguy/nose-f4.xpm
new file mode 100644 (file)
index 0000000..faa52e0
--- /dev/null
@@ -0,0 +1,73 @@
+/* XPM */
+static char * nose_f4_xpm[] = {
+"64 64 6 1",
+"      c black         m black",
+".     c black         m white",
+"X     c gray          m black",
+"o     c yellow        m black",
+"+     c purple        m black",
+"@     c purple3       m black",
+"                                                                ",
+"                                                                ",
+"                                                                ",
+"                                                                ",
+"                                                                ",
+"                                                                ",
+"                                                                ",
+"                                                                ",
+"                                                                ",
+"                                                                ",
+"                                                                ",
+"                                                                ",
+"                                                                ",
+"                                                                ",
+"                                                                ",
+"                          ...............                       ",
+"                      ....XXXXXXXXXXXXXXX....                   ",
+"                   ...XXXXXXXXXXXXXXXXXXXXXXX...                ",
+"                 ..XXXXXXXXXXXXXXXXXXXXXXXXXXXXX..              ",
+"               ..XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.             ",
+"              .XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.            ",
+"             .XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX..          ",
+"            .XXXXXXXXXXXXXXXXXX......XXXXXXXXXXXXXXXXX.         ",
+"           .XXXXXXXXXXXXXXXXX..XXXXXX..XXXXXXXXXXXXXXXX.        ",
+"           .XXXXXXXXXXXXXXXX.XXXXXXXXXX.XXXXXXXXXXXXXXX.        ",
+"          .XXXXXXXXXXXXXXXX.XXXXXXXXXXXX.XXXXXXXXXXXXXXX.       ",
+"          .XXXXXXXXXXXXXXXX.XXXXXXXXXXXX.XXXXXXXXXXXXXXX.       ",
+"         .XXXXXXXXXXXXXXXXX..XXXXXXXXXX..XXXXXXXXXXXXXXXX.      ",
+"         .XXXXXXXXXXXXXXXXX.X..XXXXXX..X.XXXXXXXXXXXXXXXX.      ",
+"         .XXXXXXXXXXXXXXXXX.XXX......XXX.XXXXXXXXXXXXXXXX.      ",
+"         .XXXXXXXXXXXXXXXXX.XXXXXXXXXXXX.XXXXXXXXXXXXXXXX.      ",
+"         .XXXXXXXXXXXXXXXXXX.XXXXXXXXXX.XXXXXXXXXXXXXXXX..      ",
+"         ..XXXXXXXXXXXXXXXXXX..XXXXXX..XXXXXXXXXXXXXXXX. .      ",
+"          ..XXXXXXXXXXXXXXXXXXX......XXXXXXXXXXXXXXXXX.X.       ",
+"          .X.XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.XX.       ",
+"           .X.XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.XX.        ",
+"            .X.XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.XX.         ",
+"             .X..XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX..XX.          ",
+"              .XX....XXXXXXXXXXXXXXXXXXXXXXXXX...XXX.           ",
+"               ..XXXX.....XXXXXXXXXXXXXXXX....XXXX..            ",
+"                 ...XXXXXX................XXXXX...              ",
+"                    .....XXXXXXXXXXXXXXXXXX....                 ",
+"                         ...................                    ",
+"                       ...oooooooooooooooo..                    ",
+"                       .+.oooooooooooooooo.+.                   ",
+"                     ..+++.oooooooooooooo.++.                   ",
+"      .........     .+++++.oooooooooooooo.+++.       ....       ",
+"    ...+++++++..   ..++++++.oooooooooooo.++++..   ...++++..     ",
+"    .+++++++++++....@+++++++..oooooooo..++++++@....++++++++.    ",
+"   .+++++++++++++..@@+++++++++........+++++++@@..++++++++++.    ",
+"   .+++++++++++++++..@+++++++++++.++++++++++@@..++++++++++++.   ",
+"  .+++++++++++++++++..++++++++++. .+++++++++..++++++++++++++.   ",
+"  .++++++++++++++++++++++++++++.   .+++++++..++++++++++++++++.  ",
+"  .++++++++++++++++++++++++++++.   .+++++++++++++++++++++++++.  ",
+"  .+++++++++++++++++++++++++++.     .++++++++++++++++++++++++.  ",
+"  .+@.++++++++++++++++++++++++.     .++++++++++++++++++++.+++.  ",
+"  .++.++++++++++++++++++++++++.     .++++++++++++++++++++.@+@.  ",
+"  .@+@.+++++++++++++++++++++++.     .+++++++++++++++++++.@+@.   ",
+"  .@@+@..++++++++++++++++++++@..   ..@++++++++++++++++..@++@.   ",
+"   .@@+++++++++++++++++++++++@@.   .@@+++++++++++++++++++@@.    ",
+"    ..@@@@@@@@@@@@@@@@@@@@@@@@@.   .@@@@@@@@@@@@@@@@@@@@@@.     ",
+"     ...........................   .......................      ",
+"                                                                ",
+"                                                                "};
diff --git a/hacks/images/noseguy/nose-l1.xbm b/hacks/images/noseguy/nose-l1.xbm
new file mode 100644 (file)
index 0000000..e3cb703
--- /dev/null
@@ -0,0 +1,38 @@
+#define nose_l1_width 64
+#define nose_l1_height 64
+static unsigned char nose_l1_bits[] = {
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0xc0,0xff,0xff,0x07,0x00,0x00,0x00,0x00,0x40,0x00,
+ 0x00,0x04,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x40,
+ 0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x04,0x00,0x00,0x00,0x00,
+ 0x40,0x00,0x00,0x04,0x00,0x00,0x00,0xf8,0xff,0xff,0xff,0xff,0x3f,0x00,0x00,
+ 0x08,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x20,0x00,
+ 0x00,0xf8,0xff,0xff,0xff,0xff,0x3f,0x00,0x00,0xf0,0x03,0x00,0x00,0x80,0x00,
+ 0x00,0x00,0x0e,0x0c,0x00,0x00,0x80,0x01,0x00,0x00,0x03,0x30,0x00,0x00,0x00,
+ 0x01,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x02,0x00,0x40,0x00,0xc0,0x00,0x00,
+ 0x00,0x02,0x00,0x20,0x00,0x80,0x00,0x00,0x00,0x04,0x00,0x10,0x00,0x00,0x00,
+ 0x00,0x00,0x04,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x0c,0x00,0x08,0x00,0x00,
+ 0x00,0x00,0x00,0x08,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x08,0x00,
+ 0x00,0x00,0x00,0x00,0x10,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x08,
+ 0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x10,0x00,
+ 0x08,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x10,
+ 0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x10,0x00,0x00,0x01,0x00,0x00,
+ 0x18,0x00,0x20,0x00,0x00,0x01,0x00,0x00,0x08,0x00,0x40,0x00,0x80,0x00,0x00,
+ 0x00,0x08,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x0c,0x00,0x00,0x01,0x20,0x00,
+ 0x00,0x00,0x04,0x00,0x00,0x06,0x18,0x00,0x00,0x00,0x06,0x00,0x00,0xf8,0x07,
+ 0x00,0x00,0x00,0x02,0x00,0x00,0x00,0xf8,0xff,0xff,0xff,0x01,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x0f,0x00,0x00,0x00,
+ 0x00,0xff,0x00,0x04,0x10,0x00,0x00,0x00,0xc0,0x00,0x03,0x03,0x10,0x00,0x00,
+ 0x00,0x30,0x00,0x0c,0x01,0x20,0x00,0x00,0x00,0x08,0x00,0x98,0x00,0x20,0x00,
+ 0x00,0x00,0x0c,0x03,0x60,0x00,0x20,0x00,0x00,0x00,0xc2,0x00,0xc0,0x00,0x20,
+ 0x00,0x00,0x00,0x42,0x00,0x80,0x00,0x20,0x00,0x00,0x00,0x21,0x00,0x00,0x01,
+ 0x20,0x00,0x00,0x00,0x21,0x00,0x00,0x01,0x20,0x00,0x00,0x00,0x21,0x00,0x00,
+ 0x00,0x20,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x01,0x00,
+ 0x00,0x00,0x40,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x02,
+ 0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x20,0x00,0x00,0x00,
+ 0x18,0x00,0x00,0x00,0x20,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x10,0x00,0x00,
+ 0x00,0xc0,0xff,0xff,0xff,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00};
diff --git a/hacks/images/noseguy/nose-l1.xpm b/hacks/images/noseguy/nose-l1.xpm
new file mode 100644 (file)
index 0000000..205d18b
--- /dev/null
@@ -0,0 +1,74 @@
+/* XPM */
+static char * nose_l1_xpm[] = {
+"64 64 7 1",
+"      c black         m black",
+".     c black         m white",
+"X     c gray          m black",
+"o     c yellow        m black",
+"O     c yellow2       m black",
+"+     c purple        m black",
+"@     c purple3       m black",
+"                                                                ",
+"                                                                ",
+"                                                                ",
+"                                                                ",
+"                                                                ",
+"                                                                ",
+"                      .....................                     ",
+"                      .XXXXXXXXXXXXXXXXXXX.                     ",
+"                      .XXXXXXXXXXXXXXXXXXX.                     ",
+"                      .XXXXXXXXXXXXXXXXXXX.                     ",
+"                      .XXXXXXXXXXXXXXXXXXX.                     ",
+"                      .XXXXXXXXXXXXXXXXXXX.                     ",
+"           ...........................................          ",
+"           .XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.          ",
+"           .XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.          ",
+"           ...........................................          ",
+"            ......OOOOOOOOOOOOOOOOOOOOOOOOOOOOO.                ",
+"         ...ooOOOO..OOOOOOOOOOOOOOOOOOOOOOOOOOO..               ",
+"        ..oooOOOOOOO..OOOOOOOOOOOOOOOOOOOOOOOOOO.               ",
+"       .oooOOOOOOOOOOO.OOOOOOOOOOOOOOOOOOOOOOOOOO.              ",
+"      .ooOOOOOOOOOOOOO..OOOOOOOOOOOOOOOOOOOOOOOOO.              ",
+"     .ooOOOOOOOOOOOOOOO.OOOOOOOOOOOOOOOOOOOOOOOOOO.             ",
+"    .ooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.             ",
+"    .ooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO..            ",
+"   .oooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.            ",
+"   .ooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.            ",
+"   .ooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.           ",
+"   .ooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.           ",
+"   .ooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.           ",
+"   .ooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.           ",
+"   .oooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.           ",
+"   .oooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.           ",
+"    .oooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.           ",
+"    .ooooOOOOOOOOOOOOOOo.OOOOOOOOOOOOOOOOOOOOOOOOOO..           ",
+"     .ooooOOOOOOOOOOoooo.OOOOOOOOOOOOOOOOOOOOOOOOOO.            ",
+"      .oooooooOOOOOoooo.OOOOOOOOOOOOOOOOOOOOOOOOOOO.            ",
+"       .oooooooooooooo.OOOOOOOOOOOOOOOOOOOOOOOOOOO..            ",
+"        .oooooooooooo.OOOOOOOOOOOOOOOOOOOOOOOOOOOO.             ",
+"         ..oooooooo..OOOOOOOOOOOOOOOOOOOOOOOOOOOO..             ",
+"           ........OOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.              ",
+"                   ..............................               ",
+"                                                                ",
+"                                   .........                    ",
+"                ........          .+++++++++.                   ",
+"             ...++++++++...      .++++++++++.                   ",
+"            ..++++++++++++..   ..++++++++++++.                  ",
+"          ..++++++++++++++++.  .@++++++++++++.                  ",
+"          .++++@..+++++++++++..@@++++++++++++.                  ",
+"         .++++..++++++++++++++..@++++++++++++.                  ",
+"         .+++@.+++++++++++++++++.@+++++++++++.                  ",
+"        .+++@.+++++++++++++++++++.@++++++++++.                  ",
+"        .+++@.+++++++++++++++++++..++++++++++.                  ",
+"        .+++@.+++++++++++++++++++++++++++++++.                  ",
+"        .++++++++++++++++++++++++++++++++++++@.                 ",
+"        ..@++++++++++++++++++++++++++++++++++@.                 ",
+"         .@@+++++++++++++++++++++++++++++++++@.                 ",
+"         .@@++++++++++++++++++++++++++++++++@@.                 ",
+"          .@@@++++++++++++++++++++++++++++++@.                  ",
+"           ..@@@++++++++++++++++++++@@@++++@@.                  ",
+"            ...@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.                   ",
+"              ..............................                    ",
+"                                                                ",
+"                                                                ",
+"                                                                "};
diff --git a/hacks/images/noseguy/nose-l2.xbm b/hacks/images/noseguy/nose-l2.xbm
new file mode 100644 (file)
index 0000000..fa39343
--- /dev/null
@@ -0,0 +1,38 @@
+#define nose_l2_width 64
+#define nose_l2_height 64
+static unsigned char nose_l2_bits[] = {
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0xc0,0xff,0xff,0x07,0x00,0x00,0x00,0x00,0x40,0x00,
+ 0x00,0x04,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x40,
+ 0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x40,0x00,0x00,0x04,0x00,0x00,0x00,0x00,
+ 0x40,0x00,0x00,0x04,0x00,0x00,0x00,0xf8,0xff,0xff,0xff,0xff,0x3f,0x00,0x00,
+ 0x08,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x20,0x00,
+ 0x00,0xf8,0xff,0xff,0xff,0xff,0x3f,0x00,0x00,0xf0,0x03,0x00,0x00,0x80,0x00,
+ 0x00,0x00,0x0e,0x0c,0x00,0x00,0x80,0x01,0x00,0x00,0x03,0x30,0x00,0x00,0x00,
+ 0x01,0x00,0x80,0x00,0x40,0x00,0x00,0x00,0x02,0x00,0x40,0x00,0xc0,0x00,0x00,
+ 0x00,0x02,0x00,0x20,0x00,0x80,0x00,0x00,0x00,0x04,0x00,0x10,0x00,0x00,0x00,
+ 0x00,0x00,0x04,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x0c,0x00,0x08,0x00,0x00,
+ 0x00,0x00,0x00,0x08,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x08,0x00,
+ 0x00,0x00,0x00,0x00,0x10,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x08,
+ 0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x10,0x00,
+ 0x08,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x10,
+ 0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x10,0x00,0x00,0x01,0x00,0x00,
+ 0x18,0x00,0x10,0x00,0x00,0x01,0x00,0x00,0x08,0x00,0x20,0x00,0x80,0x00,0x00,
+ 0x00,0x08,0x00,0x40,0x00,0x40,0x00,0x00,0x00,0x0c,0x00,0x80,0x00,0x20,0x00,
+ 0x00,0x00,0xe4,0x00,0x00,0x03,0x18,0x00,0x00,0x00,0x26,0x03,0x00,0xfc,0x07,
+ 0x00,0x00,0x00,0x12,0x0c,0x00,0x00,0xf8,0xff,0xff,0xff,0x11,0x10,0x80,0x1f,
+ 0x00,0x00,0x00,0x00,0x08,0x20,0x60,0x60,0xc0,0x07,0x00,0x00,0x04,0x40,0x10,
+ 0xc0,0x20,0x08,0x00,0x1f,0x02,0x40,0x08,0x00,0x21,0x10,0xc0,0x60,0x02,0x40,
+ 0x04,0x00,0x12,0x20,0x20,0x80,0x02,0x20,0xc2,0x00,0x14,0x40,0x18,0x00,0x03,
+ 0x20,0x22,0x00,0x0c,0x80,0x04,0x03,0x02,0x10,0x12,0x00,0x08,0x80,0x86,0x00,
+ 0x04,0x10,0x12,0x00,0x10,0x80,0x42,0x00,0x18,0x08,0x12,0x00,0x10,0x40,0x42,
+ 0x00,0x00,0x04,0x02,0x00,0x20,0x40,0x42,0x00,0x00,0x04,0x02,0x00,0x00,0x20,
+ 0x42,0x00,0x00,0x02,0x04,0x00,0x00,0x20,0x02,0x00,0x00,0x01,0x04,0x00,0x00,
+ 0x20,0x02,0x00,0x00,0x01,0x08,0x00,0x00,0x20,0x04,0x00,0x80,0x00,0x10,0x00,
+ 0x00,0x20,0x0c,0x00,0x80,0x00,0x60,0x00,0x00,0x10,0x08,0x00,0x40,0x00,0x80,
+ 0xff,0xff,0x0f,0x30,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0xc0,0xff,0x0f,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00};
diff --git a/hacks/images/noseguy/nose-l2.xpm b/hacks/images/noseguy/nose-l2.xpm
new file mode 100644 (file)
index 0000000..f08a72e
--- /dev/null
@@ -0,0 +1,74 @@
+/* XPM */
+static char * nose_l2_xpm[] = {
+"64 64 7 1",
+"      c black         m black",
+".     c black         m white",
+"X     c gray          m black",
+"o     c yellow        m black",
+"O     c yellow2       m black",
+"+     c purple        m black",
+"@     c purple3       m black",
+"                                                                ",
+"                                                                ",
+"                                                                ",
+"                                                                ",
+"                                                                ",
+"                                                                ",
+"                      .....................                     ",
+"                      .XXXXXXXXXXXXXXXXXXX.                     ",
+"                      .XXXXXXXXXXXXXXXXXXX.                     ",
+"                      .XXXXXXXXXXXXXXXXXXX.                     ",
+"                      .XXXXXXXXXXXXXXXXXXX.                     ",
+"                      .XXXXXXXXXXXXXXXXXXX.                     ",
+"           ...........................................          ",
+"           .XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.          ",
+"           .XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.          ",
+"           ...........................................          ",
+"            ......OOOOOOOOOOOOOOOOOOOOOOOOOOOOO.                ",
+"         ...ooOOOO..OOOOOOOOOOOOOOOOOOOOOOOOOOO..               ",
+"        ..oooOOOOOOO..OOOOOOOOOOOOOOOOOOOOOOOOOO.               ",
+"       .oooOOOOOOOOOOO.OOOOOOOOOOOOOOOOOOOOOOOOOO.              ",
+"      .ooOOOOOOOOOOOOO..OOOOOOOOOOOOOOOOOOOOOOOOO.              ",
+"     .ooOOOOOOOOOOOOOOO.OOOOOOOOOOOOOOOOOOOOOOOOOO.             ",
+"    .ooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.             ",
+"    .ooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO..            ",
+"   .oooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.            ",
+"   .ooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.            ",
+"   .ooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.           ",
+"   .ooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.           ",
+"   .ooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.           ",
+"   .ooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.           ",
+"   .oooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.           ",
+"   .oooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.           ",
+"    .oooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.           ",
+"    .ooooOOOOOOOOOOOOOOo.OOOOOOOOOOOOOOOOOOOOOOOOOO..           ",
+"     .ooooOOOOOOOOOOoooo.OOOOOOOOOOOOOOOOOOOOOOOOOO.            ",
+"      .oooooooOOOOOoooo.OOOOOOOOOOOOOOOOOOOOOOOOOOO.            ",
+"       .oooooooooooooo.OOOOOOOOOOOOOOOOOOOOOOOOOOO..            ",
+"        .oooooooooooo.OOOOOOOOOOOOOOOOOOOOOOOOOOOO.  ...        ",
+"         ..oooooooo..OOOOOOOOOOOOOOOOOOOOOOOOOOOO..  .++..      ",
+"           ........OOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.  .+++++..    ",
+"                   ..............................   .+++++++.   ",
+"       ......                                      .+++++++++.  ",
+"     ..++++++..       .....                       .++++++++++@. ",
+"    .+++++++++..     .+++++.            .....    .+++++++++++@. ",
+"   .++++++++++++.    .++++++.         ..+++++..  .++++++++++@@. ",
+"  .++++++++++++++.  .++++++++.       .+++++++++. .@+++++++++@.  ",
+" .++++..++++++++++. .+++++++++.    ..+++++++++++..@++++++++@@.  ",
+" .+++.@@++++++++++..@++++++++++.  .+++++..+++++++.@@+++++++@.   ",
+" .++.@+++++++++++++.@@+++++++++. ..++++.@@++++++++.@@+++++@@.   ",
+" .++.@++++++++++++++.@+++++++++. .++++.@+++++++++++..++++@@.    ",
+" .++.@++++++++++++++.@++++++++.  .++++.@+++++++++++++++++@.     ",
+" .@++++++++++++++++++.@+++++++.  .++++.@++++++++++++++++@@.     ",
+" .@@+++++++++++++++++++++++++.   .++++.@+++++++++++++++@@.      ",
+"  .@++++++++++++++++++++++++@.   .+++++++++++++++++++++@.       ",
+"  .@@+++++++++++++++++++++++@.   .++++++++++++++++++++@@.       ",
+"   .@@++++++++++++++++++++++@.    .+++++++++++++++++++@.        ",
+"    .@@@+++++++++++++++++++@@.    ..+++++++++++++++++@@.        ",
+"     ..@@@@@@@@@@@@@@@@@@@@@.      .@@@+++@@@++++++@@@.         ",
+"       .....................        ..@@@@@@@@@@@@@@..          ",
+"                                      ..............            ",
+"                                                                ",
+"                                                                ",
+"                                                                ",
+"                                                                "};
diff --git a/hacks/images/noseguy/nose-r1.xbm b/hacks/images/noseguy/nose-r1.xbm
new file mode 100644 (file)
index 0000000..72df86c
--- /dev/null
@@ -0,0 +1,38 @@
+#define nose_r1_width 64
+#define nose_r1_height 64
+static unsigned char nose_r1_bits[] = {
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0xe0,0xff,0xff,0x03,0x00,0x00,0x00,0x00,0x20,0x00,
+ 0x00,0x02,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x20,
+ 0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x02,0x00,0x00,0x00,0x00,
+ 0x20,0x00,0x00,0x02,0x00,0x00,0x00,0xfc,0xff,0xff,0xff,0xff,0x1f,0x00,0x00,
+ 0x04,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x10,0x00,
+ 0x00,0xfc,0xff,0xff,0xff,0xff,0x1f,0x00,0x00,0x00,0x01,0x00,0x00,0xc0,0x0f,
+ 0x00,0x00,0x80,0x01,0x00,0x00,0x30,0x70,0x00,0x00,0x80,0x00,0x00,0x00,0x0c,
+ 0xc0,0x00,0x00,0x40,0x00,0x00,0x00,0x02,0x00,0x01,0x00,0x40,0x00,0x00,0x00,
+ 0x03,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x01,0x00,0x04,0x00,0x20,0x00,0x00,
+ 0x00,0x00,0x00,0x08,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x10,0x00,
+ 0x00,0x00,0x00,0x00,0x10,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x08,
+ 0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x10,0x00,
+ 0x08,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x10,
+ 0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x08,0x00,0x00,0x00,0x00,0x00,
+ 0x10,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x18,0x00,0x00,0x80,0x00,
+ 0x00,0x08,0x00,0x10,0x00,0x00,0x80,0x00,0x00,0x04,0x00,0x10,0x00,0x00,0x00,
+ 0x01,0x00,0x02,0x00,0x30,0x00,0x00,0x00,0x02,0x00,0x01,0x00,0x20,0x00,0x00,
+ 0x00,0x04,0x80,0x00,0x00,0x60,0x00,0x00,0x00,0x18,0x60,0x00,0x00,0x40,0x00,
+ 0x00,0x00,0xe0,0x1f,0x00,0x00,0x80,0xff,0xff,0xff,0x1f,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x1f,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x08,0x20,0x00,0xff,0x00,0x00,0x00,0x00,0x08,0xc0,0xc0,0x00,0x03,0x00,
+ 0x00,0x00,0x04,0x80,0x30,0x00,0x0c,0x00,0x00,0x00,0x04,0x00,0x19,0x00,0x10,
+ 0x00,0x00,0x00,0x04,0x00,0x06,0xc0,0x30,0x00,0x00,0x00,0x04,0x00,0x03,0x00,
+ 0x43,0x00,0x00,0x00,0x04,0x00,0x01,0x00,0x42,0x00,0x00,0x00,0x04,0x80,0x00,
+ 0x00,0x84,0x00,0x00,0x00,0x04,0x80,0x00,0x00,0x84,0x00,0x00,0x00,0x04,0x00,
+ 0x00,0x00,0x84,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x02,
+ 0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x02,0x00,0x00,0x00,0x40,0x00,0x00,0x00,
+ 0x02,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x20,0x00,0x00,
+ 0x00,0x04,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x0e,0x00,
+ 0x00,0x00,0xf0,0xff,0xff,0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00};
diff --git a/hacks/images/noseguy/nose-r1.xpm b/hacks/images/noseguy/nose-r1.xpm
new file mode 100644 (file)
index 0000000..901dd42
--- /dev/null
@@ -0,0 +1,74 @@
+/* XPM */
+static char * nose_r1_xpm[] = {
+"64 64 7 1",
+"      c black         m black",
+".     c black         m white",
+"X     c gray          m black",
+"o     c yellow        m black",
+"O     c yellow2       m black",
+"+     c purple        m black",
+"@     c purple3       m black",
+"                                                                ",
+"                                                                ",
+"                                                                ",
+"                                                                ",
+"                                                                ",
+"                                                                ",
+"                     .....................                      ",
+"                     .XXXXXXXXXXXXXXXXXXX.                      ",
+"                     .XXXXXXXXXXXXXXXXXXX.                      ",
+"                     .XXXXXXXXXXXXXXXXXXX.                      ",
+"                     .XXXXXXXXXXXXXXXXXXX.                      ",
+"                     .XXXXXXXXXXXXXXXXXXX.                      ",
+"          ...........................................           ",
+"          .XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.           ",
+"          .XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.           ",
+"          ...........................................           ",
+"                .OOOOOOOOOOOOOOOOOOOOOOOOOOOOO......            ",
+"               ..OOOOOOOOOOOOOOOOOOOOOOOOOOO..OOOOoo...         ",
+"               .OOOOOOOOOOOOOOOOOOOOOOOOOO..OOOOOOOooo..        ",
+"              .OOOOOOOOOOOOOOOOOOOOOOOOOO.OOOOOOOOOOOooo.       ",
+"              .OOOOOOOOOOOOOOOOOOOOOOOOO..OOOOOOOOOOOOOoo.      ",
+"             .OOOOOOOOOOOOOOOOOOOOOOOOOO.OOOOOOOOOOOOOOOoo.     ",
+"             .OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoo.    ",
+"            ..OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoo.    ",
+"            .OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooo.   ",
+"            .OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoo.   ",
+"           .OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoo.   ",
+"           .OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoo.   ",
+"           .OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoo.   ",
+"           .OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoo.   ",
+"           .OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooo.   ",
+"           .OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooo.   ",
+"           .OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooo.    ",
+"           ..OOOOOOOOOOOOOOOOOOOOOOOOOO.oOOOOOOOOOOOOOOoooo.    ",
+"            .OOOOOOOOOOOOOOOOOOOOOOOOOO.ooooOOOOOOOOOOoooo.     ",
+"            .OOOOOOOOOOOOOOOOOOOOOOOOOOO.ooooOOOOOooooooo.      ",
+"            ..OOOOOOOOOOOOOOOOOOOOOOOOOOO.oooooooooooooo.       ",
+"             .OOOOOOOOOOOOOOOOOOOOOOOOOOOO.oooooooooooo.        ",
+"             ..OOOOOOOOOOOOOOOOOOOOOOOOOOOO..oooooooo..         ",
+"              .OOOOOOOOOOOOOOOOOOOOOOOOOOOOOO........           ",
+"               ..............................                   ",
+"                                                                ",
+"                    .........                                   ",
+"                   .+++++++++.          ........                ",
+"                   .++++++++++.      ...++++++++...             ",
+"                  .++++++++++++..   ..++++++++++++..            ",
+"                  .++++++++++++@.  .++++++++++++++++..          ",
+"                  .++++++++++++@@..+++++++++++..@++++.          ",
+"                  .++++++++++++@..++++++++++++++..++++.         ",
+"                  .+++++++++++@.+++++++++++++++++.@+++.         ",
+"                  .++++++++++@.+++++++++++++++++++.@+++.        ",
+"                  .++++++++++..+++++++++++++++++++.@+++.        ",
+"                  .+++++++++++++++++++++++++++++++.@+++.        ",
+"                 .@++++++++++++++++++++++++++++++++++++.        ",
+"                 .@++++++++++++++++++++++++++++++++++@..        ",
+"                 .@+++++++++++++++++++++++++++++++++@@.         ",
+"                 .@@++++++++++++++++++++++++++++++++@@.         ",
+"                  .@++++++++++++++++++++++++++++++@@@.          ",
+"                  .@@++++@@@++++++++++++++++++++@@@..           ",
+"                   .@@@@@@@@@@@@@@@@@@@@@@@@@@@@@...            ",
+"                    ..............................              ",
+"                                                                ",
+"                                                                ",
+"                                                                "};
diff --git a/hacks/images/noseguy/nose-r2.xbm b/hacks/images/noseguy/nose-r2.xbm
new file mode 100644 (file)
index 0000000..eb750ca
--- /dev/null
@@ -0,0 +1,38 @@
+#define nose_r2_width 64
+#define nose_r2_height 64
+static unsigned char nose_r2_bits[] = {
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0xe0,0xff,0xff,0x03,0x00,0x00,0x00,0x00,0x20,0x00,
+ 0x00,0x02,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x20,
+ 0x00,0x00,0x02,0x00,0x00,0x00,0x00,0x20,0x00,0x00,0x02,0x00,0x00,0x00,0x00,
+ 0x20,0x00,0x00,0x02,0x00,0x00,0x00,0xfc,0xff,0xff,0xff,0xff,0x1f,0x00,0x00,
+ 0x04,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x04,0x00,0x00,0x00,0x00,0x10,0x00,
+ 0x00,0xfc,0xff,0xff,0xff,0xff,0x1f,0x00,0x00,0x00,0x01,0x00,0x00,0xc0,0x0f,
+ 0x00,0x00,0x80,0x01,0x00,0x00,0x30,0x70,0x00,0x00,0x80,0x00,0x00,0x00,0x0c,
+ 0xc0,0x00,0x00,0x40,0x00,0x00,0x00,0x02,0x00,0x01,0x00,0x40,0x00,0x00,0x00,
+ 0x03,0x00,0x02,0x00,0x20,0x00,0x00,0x00,0x01,0x00,0x04,0x00,0x20,0x00,0x00,
+ 0x00,0x00,0x00,0x08,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x10,0x00,
+ 0x00,0x00,0x00,0x00,0x10,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x08,
+ 0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x10,0x00,
+ 0x08,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x10,
+ 0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x08,0x00,0x00,0x00,0x00,0x00,
+ 0x10,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x18,0x00,0x00,0x80,0x00,
+ 0x00,0x08,0x00,0x10,0x00,0x00,0x80,0x00,0x00,0x08,0x00,0x10,0x00,0x00,0x00,
+ 0x01,0x00,0x04,0x00,0x30,0x00,0x00,0x00,0x02,0x00,0x02,0x00,0x27,0x00,0x00,
+ 0x00,0x04,0x00,0x01,0xc0,0x64,0x00,0x00,0x00,0x18,0xc0,0x00,0x30,0x48,0x00,
+ 0x00,0x00,0xe0,0x3f,0x00,0x08,0x88,0xff,0xff,0xff,0x1f,0x00,0x00,0x04,0x10,
+ 0x00,0x00,0x00,0x00,0xf8,0x01,0x02,0x20,0x00,0x00,0xe0,0x03,0x06,0x06,0x02,
+ 0x40,0xf8,0x00,0x10,0x04,0x03,0x08,0x02,0x40,0x06,0x03,0x08,0x84,0x00,0x10,
+ 0x04,0x40,0x01,0x04,0x04,0x48,0x00,0x20,0x04,0xc0,0x00,0x18,0x02,0x28,0x00,
+ 0x43,0x08,0x40,0xc0,0x20,0x01,0x30,0x00,0x44,0x08,0x20,0x00,0x61,0x01,0x10,
+ 0x00,0x48,0x10,0x18,0x00,0x42,0x01,0x08,0x00,0x48,0x20,0x00,0x00,0x42,0x02,
+ 0x08,0x00,0x48,0x20,0x00,0x00,0x42,0x02,0x04,0x00,0x40,0x40,0x00,0x00,0x42,
+ 0x04,0x00,0x00,0x40,0x80,0x00,0x00,0x40,0x04,0x00,0x00,0x20,0x80,0x00,0x00,
+ 0x40,0x04,0x00,0x00,0x20,0x00,0x01,0x00,0x20,0x04,0x00,0x00,0x10,0x00,0x01,
+ 0x00,0x30,0x04,0x00,0x00,0x08,0x00,0x02,0x00,0x10,0x08,0x00,0x00,0x06,0x00,
+ 0x0c,0x00,0x0c,0xf0,0xff,0xff,0x01,0x00,0xf0,0xff,0x03,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00};
diff --git a/hacks/images/noseguy/nose-r2.xpm b/hacks/images/noseguy/nose-r2.xpm
new file mode 100644 (file)
index 0000000..ddf0eda
--- /dev/null
@@ -0,0 +1,74 @@
+/* XPM */
+static char * nose_r2_xpm[] = {
+"64 64 7 1",
+"      c black         m black",
+".     c black         m white",
+"X     c gray          m black",
+"o     c yellow        m black",
+"O     c yellow2       m black",
+"+     c purple        m black",
+"@     c purple3       m black",
+"                                                                ",
+"                                                                ",
+"                                                                ",
+"                                                                ",
+"                                                                ",
+"                                                                ",
+"                     .....................                      ",
+"                     .XXXXXXXXXXXXXXXXXXX.                      ",
+"                     .XXXXXXXXXXXXXXXXXXX.                      ",
+"                     .XXXXXXXXXXXXXXXXXXX.                      ",
+"                     .XXXXXXXXXXXXXXXXXXX.                      ",
+"                     .XXXXXXXXXXXXXXXXXXX.                      ",
+"          ...........................................           ",
+"          .XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.           ",
+"          .XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.           ",
+"          ...........................................           ",
+"                .OOOOOOOOOOOOOOOOOOOOOOOOOOOOO......            ",
+"               ..OOOOOOOOOOOOOOOOOOOOOOOOOOO..OOOOoo...         ",
+"               .OOOOOOOOOOOOOOOOOOOOOOOOOO..OOOOOOOooo..        ",
+"              .OOOOOOOOOOOOOOOOOOOOOOOOOO.OOOOOOOOOOOooo.       ",
+"              .OOOOOOOOOOOOOOOOOOOOOOOOO..OOOOOOOOOOOOOoo.      ",
+"             .OOOOOOOOOOOOOOOOOOOOOOOOOO.OOOOOOOOOOOOOOOoo.     ",
+"             .OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoo.    ",
+"            ..OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoo.    ",
+"            .OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooo.   ",
+"            .OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoo.   ",
+"           .OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoo.   ",
+"           .OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoo.   ",
+"           .OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoo.   ",
+"           .OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOoo.   ",
+"           .OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooo.   ",
+"           .OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooo.   ",
+"           .OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOooo.    ",
+"           ..OOOOOOOOOOOOOOOOOOOOOOOOOO.oOOOOOOOOOOOOOOoooo.    ",
+"            .OOOOOOOOOOOOOOOOOOOOOOOOOO.ooooOOOOOOOOOOoooo.     ",
+"            .OOOOOOOOOOOOOOOOOOOOOOOOOOO.ooooOOOOOooooooo.      ",
+"            ..OOOOOOOOOOOOOOOOOOOOOOOOOOO.oooooooooooooo.       ",
+"        ...  .OOOOOOOOOOOOOOOOOOOOOOOOOOOO.oooooooooooo.        ",
+"      ..++.  ..OOOOOOOOOOOOOOOOOOOOOOOOOOOO..oooooooo..         ",
+"    ..+++++.  .OOOOOOOOOOOOOOOOOOOOOOOOOOOOOO........           ",
+"   .+++++++.   ..............................                   ",
+"  .+++++++++.                                      ......       ",
+" .@++++++++++.                       .....       ..++++++..     ",
+" .@+++++++++++.    .....            .+++++.     ..+++++++++.    ",
+" .@@++++++++++.  ..+++++..         .++++++.    .++++++++++++.   ",
+"  .@+++++++++@. .+++++++++.       .++++++++.  .++++++++++++++.  ",
+"  .@@++++++++@..+++++++++++..    .+++++++++. .++++++++++..++++. ",
+"   .@+++++++@@.+++++++..+++++.  .++++++++++@..++++++++++@@.+++. ",
+"   .@@+++++@@.++++++++@@.++++.. .+++++++++@@.+++++++++++++@.++. ",
+"    .@@++++..+++++++++++@.++++. .+++++++++@.++++++++++++++@.++. ",
+"     .@+++++++++++++++++@.++++.  .++++++++@.++++++++++++++@.++. ",
+"     .@@++++++++++++++++@.++++.  .+++++++@.++++++++++++++++++@. ",
+"      .@@+++++++++++++++@.++++.   .+++++++++++++++++++++++++@@. ",
+"       .@+++++++++++++++++++++.   .@++++++++++++++++++++++++@.  ",
+"       .@@++++++++++++++++++++.   .@+++++++++++++++++++++++@@.  ",
+"        .@+++++++++++++++++++.    .@++++++++++++++++++++++@@.   ",
+"        .@@+++++++++++++++++..    .@@+++++++++++++++++++@@@.    ",
+"         .@@@++++++@@@+++@@@.      .@@@@@@@@@@@@@@@@@@@@@..     ",
+"          ..@@@@@@@@@@@@@@..        .....................       ",
+"            ..............                                      ",
+"                                                                ",
+"                                                                ",
+"                                                                ",
+"                                                                "};
diff --git a/hacks/images/som.xbm b/hacks/images/som.xbm
new file mode 100644 (file)
index 0000000..cd24fd0
--- /dev/null
@@ -0,0 +1,1685 @@
+#define som_width 464
+#define som_height 435
+static unsigned char som_bits[] = {
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,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,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,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,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,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,0xfc,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,0xfc,0x03,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,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,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,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,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,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,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,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,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,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,
+ 0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,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,0x0f,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,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,0x0f,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,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,0x1f,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,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,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,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,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,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,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,
+ 0xff,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xff,0x7f,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xff,0x7f,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xff,0x7f,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0xf0,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0xf0,0xff,0xff,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,
+ 0xf0,0xff,0xff,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,0xf0,0xff,
+ 0xff,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,0xf8,0xff,0xff,0x03,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xff,0xff,0x03,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xff,0xff,0x03,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0xfc,0xff,0xff,0x07,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0xfc,0xff,0xff,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,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,0xff,0xff,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,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,
+ 0xff,0xff,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,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,0xff,0xff,
+ 0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,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,0xff,0xff,0x0f,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,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,0xff,0xff,0x1f,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,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,0xff,0xff,0x1f,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,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,0xff,0xff,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,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,0xff,0xff,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,
+ 0xff,0xff,0xff,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0xff,0xff,
+ 0xff,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0xff,0xff,0xff,0x7f,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0xff,0xff,0xff,0x7f,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0xe0,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0xf0,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0xf0,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0xff,
+ 0xff,0xff,0xff,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,0xf0,0xff,0xff,0xff,
+ 0xff,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,0xf8,0xff,0xff,0xff,0xff,0x03,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0xff,0xff,0xff,0xff,0x03,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0xf8,0xff,0xff,0xff,0xff,0x03,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0xf8,0xff,0xff,0xff,0xff,0x07,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0xfc,0xff,0xdf,0xff,0xff,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,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,
+ 0xff,0xdf,0xff,0xff,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,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,0xff,0x8f,
+ 0xff,0xff,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,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,0xff,0x0f,0xff,0xff,
+ 0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,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,0xff,0x0f,0xff,0xff,0x0f,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,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,0xff,0x07,0xff,0xff,0x1f,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,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,0xff,0x07,0xff,0xff,0x1f,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,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,0xff,0x07,0xfe,0xff,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,
+ 0xff,0xff,0x03,0xfc,0xff,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0xff,0xff,
+ 0x03,0xfc,0xff,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0xff,0xff,0x03,0xfc,
+ 0xff,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xff,0xff,0x01,0xf8,0xff,0x7f,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xff,0xff,0x01,0xf8,0xff,0x7f,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0xe0,0xff,0xff,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0xe0,0xff,0xff,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0xe0,0xff,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0xff,
+ 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,0xf0,0x07,0x00,0x00,
+ 0x80,0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0xff,0xff,
+ 0xff,0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0xff,0xff,0xff,0xff,
+ 0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,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,0xff,0xff,0xff,0xff,0xff,0xff,0x03,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0xc0,0xff,0xff,0xff,0x03,0x00,0x00,0xe0,0xff,0x7f,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0xfc,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0xe0,0xff,0x07,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xff,
+ 0x7f,0xfe,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x7f,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,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,0xff,0x01,0xfe,
+ 0x01,0x00,0x00,0x00,0x00,0x00,0xc0,0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 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,0xff,0x01,0xfe,0x01,0x00,
+ 0x00,0x00,0x00,0x00,0xc0,0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0xff,0x07,0x00,0xce,0x07,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0xfe,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,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,0x7f,0x00,0x00,0x87,0x1f,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0xc0,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0xe0,0xff,0x07,0x00,0x80,0x03,0x3e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0xfe,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,
+ 0x3f,0x00,0x00,0x80,0x03,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x3f,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x3f,0x00,
+ 0x00,0x80,0x03,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x3f,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,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,0x07,0x00,0x00,0xc0,
+ 0x01,0xe0,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,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,0xf0,0xff,0x7f,0x00,0x00,0xc0,0xfb,0xff,
+ 0x0f,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,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0xfe,0xff,0xff,0x07,0x00,0xc0,0xff,0xff,0x3f,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,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x80,0xff,0xc0,0xff,0x7f,0x00,0xe0,0xff,0xff,0x7f,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x80,0xff,0xc0,0xff,0x7f,0x00,0xe0,0xff,0xff,0x7f,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x1f,
+ 0x00,0xf8,0xff,0x0f,0xf0,0x0f,0xc0,0xff,0x01,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x0f,0x00,0x00,
+ 0xff,0x7f,0xf0,0x01,0x00,0xf8,0x03,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x01,0x00,0x00,0x80,0xff,
+ 0x7b,0x00,0x00,0xe0,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0xfc,0x3f,0x00,
+ 0x00,0x80,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0xfc,0x3f,0x00,0x00,0x80,
+ 0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x3c,0x00,0x00,0x00,0x00,0xe0,0x7f,0x00,0x00,0x00,0x7e,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x3e,0x00,0x00,0x00,0x00,0x00,0xff,0x03,0x00,0x00,0x70,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x80,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x0f,
+ 0x00,0x00,0x00,0x00,0x00,0xf0,0x1f,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,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x0f,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0xfe,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0xf0,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,0xc0,0x07,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0xf8,0x07,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,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x07,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0xf8,0x07,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0xe0,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x3f,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x0f,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0xf0,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xff,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0xf8,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x07,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,
+ 0x00,0x00,0x00,0xfe,0x03,0x00,0x00,0x00,0xf0,0x0f,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,
+ 0x00,0xfe,0x03,0x00,0x00,0x00,0xf0,0x0f,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,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x00,0x00,0xf0,0xff,
+ 0x1f,0x00,0x00,0x00,0x80,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,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,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3f,0x00,0x00,0xfc,0xff,0x7f,0x00,
+ 0x00,0x00,0x00,0xfe,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0xc0,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,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,0xff,0x47,0x7f,0x00,0x00,0x00,
+ 0x00,0xf8,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x0f,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0xf0,0x07,0x80,0xff,0xff,0x3f,0x7c,0x00,0x00,0x00,0x00,0xc0,
+ 0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3e,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0xf0,0x07,0x80,0xff,0xff,0x3f,0x7c,0x00,0x00,0x00,0x00,0xc0,0xff,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3e,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,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,0xc0,0xff,0xfe,0xff,0x7d,0x00,0x00,0x00,0x00,0x80,0xff,0x01,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0xff,0x00,0x40,
+ 0x00,0x00,0xfe,0x7f,0x00,0x00,0x00,0x00,0x80,0xff,0x07,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x3f,0x00,0x00,0x80,0x03,
+ 0xf8,0x3f,0x00,0x00,0x00,0x00,0x80,0xe7,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0xf0,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,0xfe,0x0f,0x00,0x00,0xf0,0xff,0xff,0x1f,
+ 0x00,0x00,0x00,0x00,0x80,0xc7,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0xe0,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,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,0x0f,0x00,0x00,0xf0,0xff,0xff,0x1f,0x00,0x00,
+ 0x00,0x00,0x80,0xc7,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0xe0,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0xc0,0xff,0x03,0x00,0x00,0xf0,0xff,0xff,0x0f,0x00,0x00,0x00,0x00,
+ 0xc0,0x0f,0xff,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x07,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0xf0,0x7f,0x00,0x00,0x00,0xc0,0xff,0xff,0x01,0x00,0x00,0x00,0x00,0xc0,0x0f,
+ 0xfc,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x0f,0x00,0x00,
+ 0x00,0x00,0x00,0x00,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,0x0f,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x0f,0xf0,0x0f,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0x00,0x00,0x00,0x00,
+ 0x00,0x00,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,0x01,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x1f,0x80,0x3f,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x0f,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x1c,0x00,0xfe,0x03,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0xf0,0x1c,0x00,0xfe,0x03,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x00,0x00,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,0x70,0x1c,0x00,0xf0,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,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,0x70,0x38,0x00,0xc0,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0xe0,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,0x80,
+ 0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,
+ 0x78,0x00,0x00,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x03,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x03,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x70,0x00,
+ 0x00,0xfc,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x07,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x03,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x70,0x00,0x00,0xfc,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x07,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x01,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x70,0x00,0x00,0xfe,0x03,0xfe,
+ 0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x38,0xf0,0x00,0x00,0xfe,0x0f,0xff,0xff,0x01,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0xe0,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x18,0xe0,0x00,0x80,0x9f,0xff,0x3f,0xfe,0x03,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0xe0,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x1c,0xe0,0x00,0x80,0x0f,0xff,0x07,0xc0,0x0f,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x1e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0xe0,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x1c,0xe0,0x00,0x80,0x0f,0xff,0x07,0xc0,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x1e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0xf1,
+ 0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0e,0xe0,
+ 0x00,0xc0,0x07,0xfc,0x01,0x00,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x3e,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0xe1,0xff,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0e,0xe0,0x01,0xe0,
+ 0x03,0x60,0x00,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0xc3,0xff,0x01,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xc0,0x01,0xf0,0x01,0x00,
+ 0xe0,0x03,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x07,0xf0,0x03,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xc0,0x03,0xf8,0x00,0x00,0xf8,0x1f,
+ 0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x80,0x07,0xf0,0x03,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x07,0xc0,0x03,0xf8,0x00,0x00,0xf8,0x1f,0xe0,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x80,0x0f,0xc0,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x07,0x80,0x03,0x78,0x00,0x00,0xf8,0x7f,0xe0,0x01,0x00,0x00,
+ 0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x0f,0x80,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x80,0x03,0x80,0x03,0x3e,0x00,0x00,0x78,0x7e,0xc0,0x03,0x00,0x00,0x00,0x00,
+ 0x00,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x1e,0x1c,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xf3,
+ 0x9f,0x03,0x1f,0x00,0x00,0x00,0xf0,0x80,0x03,0x00,0x00,0x00,0x00,0x00,0x70,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1e,0xfe,
+ 0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0xff,0xff,0x07,
+ 0x0f,0x00,0x00,0x00,0xe0,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1e,0xfe,0x0f,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0xff,0xff,0x07,0x0f,0x00,
+ 0x00,0x00,0xe0,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0xfc,0x0f,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0xff,0xff,0x87,0x07,0x00,0x00,0x00,
+ 0xe0,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0xf8,0x0f,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0xc0,0x3f,0xf4,0xc7,0x07,0x00,0x00,0x00,0xe0,0x00,
+ 0x07,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0xf0,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0xe0,0x03,0x80,0xe7,0x01,0x00,0x00,0x00,0xe0,0x00,0x07,0x00,
+ 0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0xf0,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0xe0,0x00,0x00,0xff,0x01,0x00,0x00,0x00,0xe0,0x80,0x07,0x00,0x00,0x00,
+ 0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0xe0,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0xff,0x00,0x00,0x00,0x00,0xf8,0x80,0x03,0x00,0x00,0x00,0x00,0x00,
+ 0xe0,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,0xe0,
+ 0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0xff,0x00,0x00,0x00,0x00,0xf8,0x80,0x03,0x00,0x00,0x00,0x00,0x00,0xe0,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,0x80,0x07,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7e,0x00,
+ 0x00,0x00,0x00,0x7c,0xc0,0x01,0x00,0x00,0x00,0x00,0x00,0xe0,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,0x1f,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3e,0x00,0x80,0x07,
+ 0xe0,0x3f,0xe0,0x01,0x00,0x00,0x00,0x00,0x00,0xc0,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,0x1f,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1e,0x00,0xc0,0xff,0xff,0x0f,
+ 0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,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,0x1e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0x00,0xe0,0xff,0xff,0x03,0xe0,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0xc0,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,0x1e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x1f,0x00,0xe0,0xff,0xff,0x03,0xe0,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0xc0,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0x3f,0x00,0x1e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x80,0x07,0x00,0x80,0xff,0x7f,0x00,0xf8,0x01,0x00,0x00,0x00,0x00,
+ 0x00,0xc0,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0x03,0x1e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0xc0,0x07,0x00,0x00,0x00,0x00,0x00,0xfc,0x07,0x00,0x00,0x00,0x00,0x00,0xc0,
+ 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x07,0x1e,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x03,
+ 0x00,0x00,0x00,0x00,0x00,0xfe,0x0f,0x00,0x00,0x00,0x00,0x00,0xc0,0x01,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0x0f,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x01,0x00,0x00,
+ 0x00,0x00,0x80,0xcf,0x3f,0x00,0x00,0xfe,0x01,0x00,0xc0,0x01,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0x0f,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x01,0x00,0x00,0x00,0x00,
+ 0x80,0xcf,0x3f,0x00,0x00,0xfe,0x01,0x00,0xc0,0x01,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x07,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x00,0x00,0xe0,0xe7,
+ 0xff,0x00,0x00,0xfe,0x0f,0x00,0xc0,0xe1,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0x03,0x00,0xfc,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0x03,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x7c,0x00,0x00,0x00,0x00,0xf0,0xff,0xf9,0xff,0x01,
+ 0x00,0xe0,0x1f,0x00,0xc0,0xe1,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0x03,0x00,0xf8,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0x03,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x7e,0x00,0x00,0x00,0xc0,0xff,0x7f,0xfe,0xe1,0x07,0x00,0xc0,
+ 0xff,0x00,0xc0,0xe1,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0x01,0x00,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0x03,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x1e,0x00,0x00,0x00,0xfc,0xff,0x1f,0xff,0x81,0x0f,0x00,0x80,0xf1,0x03,
+ 0xc0,0xe1,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0x00,0x00,
+ 0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x03,
+ 0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1e,
+ 0x00,0x00,0x00,0xfc,0xff,0x1f,0xff,0x81,0x0f,0x00,0x80,0xf1,0x03,0xc0,0xe1,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0x00,0x00,0xc0,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x81,0x0f,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0x00,0x00,
+ 0x00,0xff,0x3f,0x80,0xff,0x00,0x1f,0x00,0x80,0xc1,0x07,0xc0,0xe1,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x3f,0x00,0x00,0x00,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xc1,0xff,0x3f,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x0f,0x00,0x03,0xc0,0x3f,
+ 0x00,0xe0,0x7f,0x00,0x7e,0x00,0x80,0x01,0x1f,0xe0,0xe1,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0x00,0x00,0x00,0xfc,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xe0,0xff,0xff,0x03,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x0f,0x80,0x07,0xf0,0x07,0x00,0xf0,
+ 0x3f,0x00,0xf8,0x00,0x80,0x01,0x3c,0xe0,0xe1,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0x03,0x00,0x00,0x00,0xf8,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xe0,0xff,0xff,0x7f,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0xc0,0x03,0x80,0xff,0xff,0x01,0x00,0xfc,0x1f,0x00,
+ 0xf0,0x01,0xc0,0x01,0x38,0xe0,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0x00,0x00,0x00,0x00,0xc0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0x7f,0xf0,0x00,0xf8,0xff,0x07,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0xe0,0x03,0x00,0xfe,0x1f,0x00,0x80,0xbf,0x07,0x00,0x80,0x07,
+ 0xc0,0x01,0xe0,0xf1,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x1f,
+ 0x00,0x00,0x00,0x00,0xc0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0x7f,0xf0,0x00,0xf8,0xff,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0xe0,0x03,0x00,0xfe,0x1f,0x00,0x80,0xbf,0x07,0x00,0x80,0x07,0xc0,0x01,
+ 0xe0,0xf1,0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x1f,0x00,0x00,
+ 0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,
+ 0xf0,0x00,0x00,0xfe,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,
+ 0x01,0x00,0xf8,0x03,0x00,0xc0,0xcf,0x03,0x00,0x80,0x1f,0xf0,0x01,0xe0,0x71,
+ 0xe0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0x00,0x00,0x00,0x00,
+ 0x00,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xf0,0x00,
+ 0x00,0xe0,0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x00,0x00,
+ 0x00,0x00,0x00,0xe0,0xe7,0x03,0x00,0x00,0x7e,0xff,0x00,0xc0,0x73,0xf0,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x03,0x00,0x00,0x00,0x00,0x00,0xfc,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x3f,0xf0,0x00,0x00,0x00,
+ 0xfc,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x00,
+ 0x00,0xf8,0xf3,0x00,0x00,0x00,0xfc,0x7f,0x00,0x00,0x7f,0xf0,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0xff,0xff,
+ 0xff,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0xe0,0xff,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0x7c,
+ 0xf8,0x00,0x00,0x00,0xf8,0xff,0xff,0xff,0x7f,0xf0,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0xff,0xff,0xff,0x1f,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0xe0,0xff,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0x7c,0xf8,0x00,
+ 0x00,0x00,0xf8,0xff,0xff,0xff,0x7f,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xff,0xff,0xff,0x3f,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x80,0xff,0x0f,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x3e,0x00,0x00,0x00,0x00,0x00,0x7f,0x7c,0x00,0x00,0x00,
+ 0xe0,0xff,0xff,0xff,0x7f,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x1f,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x00,0xfe,0x7f,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x1e,0x00,0x00,0x00,0x00,0xc0,0x1f,0x3e,0x00,0x00,0x00,0xc0,0xff,
+ 0xff,0xff,0x7f,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x0f,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x7c,0x00,0x00,0x00,0x00,0xf0,0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x0f,0x00,0x00,0x00,0x00,0xe0,0x07,0x1f,0x00,0x00,0x00,0x80,0x0f,0x00,0x00,
+ 0x3c,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x03,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0xfc,0xff,0xff,0xff,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x3c,
+ 0x00,0x00,0x00,0x00,0x00,0xfe,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x00,
+ 0x00,0x00,0x00,0xfc,0x83,0x0f,0x00,0x00,0x00,0x00,0x0f,0x00,0x00,0x38,0xf0,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0xfc,0xff,0xff,0xff,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x00,0x00,
+ 0x00,0x00,0x00,0xfe,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x00,0x00,0x00,
+ 0x00,0xfc,0x83,0x0f,0x00,0x00,0x00,0x00,0x0f,0x00,0x00,0x38,0xf0,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,
+ 0xff,0xff,0xff,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x1e,0x00,0x00,0x00,0xf8,
+ 0xff,0xff,0x3f,0x00,0x00,0x00,0x00,0x00,0x80,0x07,0x00,0x00,0x00,0x00,0xff,
+ 0x80,0x07,0x00,0x00,0x00,0x00,0x3e,0x00,0x00,0x38,0x00,0x00,0x00,0x00,0x00,
+ 0xff,0xff,0xff,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0xff,0xff,
+ 0xff,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x00,0x00,0x00,0xff,0xff,0xff,
+ 0xff,0x03,0x00,0x00,0x00,0x00,0xe0,0x01,0x00,0x00,0x00,0xe0,0x1f,0xe0,0x03,
+ 0x00,0x00,0x00,0x00,0x78,0x00,0x00,0x1c,0x00,0x00,0x00,0x00,0xe0,0xff,0xff,
+ 0xff,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,
+ 0x00,0x00,0x00,0x00,0x00,0x80,0x0f,0x00,0x00,0x00,0xff,0x3f,0xe0,0xff,0x0f,
+ 0x00,0x00,0x00,0x00,0xf0,0x01,0x00,0x00,0x00,0xf8,0x07,0xf0,0x01,0x00,0x00,
+ 0x00,0x00,0xf0,0x01,0x00,0x1e,0x00,0x00,0x00,0x00,0xf0,0xff,0xff,0xff,0x07,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0xff,0xff,0xff,0x03,0x00,
+ 0x00,0x00,0x00,0x80,0x07,0x00,0x00,0x00,0xe0,0xff,0x01,0xfe,0x3f,0x00,0x00,
+ 0x00,0x00,0xf0,0x00,0x00,0x00,0x00,0xfe,0x01,0xf8,0x00,0x00,0x00,0x00,0x00,
+ 0xc0,0x03,0x00,0x0e,0x00,0x00,0x00,0x00,0xfc,0xff,0xff,0xff,0x01,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0xff,0xff,0xff,0x03,0x00,0x00,0x00,
+ 0x00,0x80,0x07,0x00,0x00,0x00,0xe0,0xff,0x01,0xfe,0x3f,0x00,0x00,0x00,0x00,
+ 0xf0,0x00,0x00,0x00,0x00,0xfe,0x01,0xf8,0x00,0x00,0x00,0x00,0x00,0xc0,0x03,
+ 0x00,0x0e,0x00,0x00,0x00,0x00,0xfc,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0xf8,0xff,0xff,0xff,0x07,0x00,0x00,0x00,0x00,0x80,
+ 0x07,0x00,0x00,0x00,0x00,0xf8,0x07,0xc0,0xff,0x01,0x00,0x00,0x00,0xf8,0x00,
+ 0x00,0x00,0x80,0x7f,0x00,0x78,0x00,0x00,0x00,0x00,0x00,0xc0,0x0f,0x00,0x0e,
+ 0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0xf0,0xff,0xff,0xff,0x1f,0x00,0x00,0x00,0x00,0xc0,0xe3,0xff,
+ 0xff,0x00,0x00,0xc0,0x1f,0x80,0xff,0x03,0x00,0x00,0x00,0x3c,0x00,0x00,0x00,
+ 0xe0,0x1f,0x00,0x3e,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x00,0x07,0x00,0x00,
+ 0x00,0x80,0xff,0xff,0xff,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0xc0,0xff,0xff,0xff,0x7f,0x00,0x00,0x00,0x00,0xc0,0xfb,0xff,0xff,0x0f,
+ 0x00,0x00,0x3e,0x80,0xf3,0x1f,0x00,0x00,0x00,0x3e,0x00,0x00,0x00,0xf8,0x07,
+ 0x00,0x1e,0x00,0x00,0x00,0x00,0x00,0x00,0x1e,0x00,0x07,0x00,0x00,0x00,0xe0,
+ 0xff,0xff,0xff,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xc0,0xff,0xff,0xff,0xff,0x00,0x00,
+ 0x7c,0xc0,0x81,0xff,0x00,0x00,0x00,0x1f,0x00,0x00,0x00,0xff,0x01,0x00,0x0f,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0x80,0x07,0x00,0x00,0x00,0xf0,0xff,0xff,
+ 0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xff,
+ 0xff,0xff,0x03,0x00,0x00,0x00,0xc0,0x7f,0x00,0xe0,0xff,0x3f,0x00,0xf0,0xc0,
+ 0x01,0xfe,0x03,0x00,0x00,0x0f,0x00,0x00,0xc0,0x7f,0x00,0xc0,0x07,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0xf0,0xc0,0x03,0x00,0x00,0x00,0xfc,0xff,0xff,0xff,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xff,0xff,0xff,
+ 0x03,0x00,0x00,0x00,0xc0,0x7f,0x00,0xe0,0xff,0x3f,0x00,0xf0,0xc0,0x01,0xfe,
+ 0x03,0x00,0x00,0x0f,0x00,0x00,0xc0,0x7f,0x00,0xc0,0x07,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0xf0,0xc0,0x03,0x00,0x00,0x00,0xfc,0xff,0xff,0xff,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0xff,0xff,0xff,0x07,0x00,
+ 0x00,0x00,0xc0,0x0f,0x00,0x00,0xfc,0xff,0x03,0xc0,0xe3,0x01,0xf0,0x07,0x00,
+ 0x80,0x07,0x00,0x00,0xf0,0x1f,0x00,0xc0,0x07,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0xf0,0xc1,0x01,0x00,0x00,0x00,0xff,0xff,0xff,0x7f,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xff,0xff,0xff,0x1f,0x00,0x00,0x00,
+ 0xc0,0x07,0x00,0x00,0x00,0xfc,0xff,0x00,0xf7,0x00,0x00,0x3f,0x00,0xc0,0x03,
+ 0x00,0x00,0xff,0x00,0x00,0xe0,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0xe3,
+ 0x01,0x00,0x00,0xc0,0xff,0xff,0xff,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0xc0,0x01,
+ 0x00,0x00,0x00,0xc0,0xff,0x07,0x7f,0x00,0x00,0xfc,0x00,0xe0,0x03,0x00,0xe0,
+ 0x3f,0x00,0x00,0xf0,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xff,0x00,0x00,
+ 0x00,0xf0,0xff,0xff,0xff,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0xfe,0xff,0xff,0xff,0x00,0x00,0x00,0xc0,0x01,0x00,0x00,
+ 0x00,0x00,0xfe,0x7f,0x7f,0x00,0x00,0xf8,0x01,0xe0,0x01,0x00,0xfc,0x07,0x00,
+ 0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xfc,
+ 0xff,0xff,0xff,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0xfe,0xff,0xff,0xff,0x00,0x00,0x00,0xc0,0x01,0x00,0x00,0x00,0x00,
+ 0xfe,0x7f,0x7f,0x00,0x00,0xf8,0x01,0xe0,0x01,0x00,0xfc,0x07,0x00,0x00,0xf8,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0xfc,0xff,0xff,
+ 0xff,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0xfc,0xff,0xff,0xff,0x03,0x00,0x00,0xc0,0x03,0x00,0x00,0x00,0x00,0xe0,0xff,
+ 0x3f,0x00,0x00,0xf0,0x07,0xf0,0x00,0x00,0xff,0x03,0x00,0x00,0x7c,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x7e,0x00,0x00,0x00,0xff,0xff,0xff,0x7f,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0xff,
+ 0xff,0xff,0x0f,0x00,0x00,0xc0,0x03,0x00,0x00,0x00,0x00,0x00,0xfe,0x3f,0x00,
+ 0x00,0xc0,0x3f,0xf8,0x00,0xf8,0x3f,0x00,0x00,0x00,0x3c,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x3c,0x00,0x00,0x80,0xff,0xff,0xff,0x3f,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0xff,0xff,0xff,
+ 0x3f,0x00,0x00,0xc0,0x03,0x00,0x00,0x00,0x00,0x00,0xf0,0xff,0x0f,0x00,0x00,
+ 0x7f,0x7c,0x00,0xfe,0x07,0x00,0x00,0x00,0x1e,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x1e,0x00,0x00,0xe0,0xff,0xff,0xff,0x0f,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0x7f,0x00,
+ 0x00,0x80,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x7f,0x00,0x00,0xfc,0x3e,
+ 0xe0,0x7f,0x00,0x00,0x00,0x00,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x1f,0x00,0x00,0xf8,0xff,0xff,0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0x7f,0x00,0x00,0x80,
+ 0x07,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x7f,0x00,0x00,0xfc,0x3e,0xe0,0x7f,
+ 0x00,0x00,0x00,0x00,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0x00,
+ 0x00,0xf8,0xff,0xff,0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0xff,0xff,0xff,0x01,0x00,0x80,0x0f,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0xf0,0xff,0x1f,0x00,0xf0,0x1f,0xfe,0x0f,0x00,0x00,
+ 0x00,0x80,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x00,0xfc,
+ 0xff,0xff,0xff,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0xf8,0xff,0xff,0xff,0x03,0x00,0x00,0x0f,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0xfc,0xff,0x3f,0xc0,0xff,0xff,0x00,0x00,0x00,0x00,0xc0,
+ 0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x03,0x00,0x00,0xff,0xff,0xff,
+ 0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0xf0,0xff,0xff,0xff,0x0f,0x00,0x00,0x1e,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0xfe,0xff,0xff,0xff,0x1f,0x00,0x00,0x00,0x00,0xe0,0x03,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x03,0x00,0xc0,0xff,0xff,0xff,0x1f,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x80,0xff,0xff,0xff,0x7f,0x00,0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0xfc,0xff,0xff,0x03,0x00,0x00,0x00,0x00,0xf0,0x01,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0xf8,0x00,0x00,0xf8,0xff,0xff,0xff,0x03,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xff,
+ 0xff,0xff,0x7f,0x00,0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0xfc,0xff,0xff,0x03,0x00,0x00,0x00,0x00,0xf0,0x01,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0xf8,0x00,0x00,0xf8,0xff,0xff,0xff,0x03,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0xff,0xff,
+ 0xff,0x00,0x00,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,
+ 0xff,0x1f,0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x7c,0x00,0x00,0xfc,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xff,0xff,0xff,0x03,
+ 0x00,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0x7f,
+ 0x00,0x00,0x00,0x00,0x7c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3e,0x00,
+ 0x00,0xff,0xff,0xff,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0xff,0xff,0xff,0x07,0x00,0xe0,
+ 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0xfe,0x00,0x00,
+ 0x00,0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x1f,0x00,0xc0,0xff,
+ 0xff,0xff,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xff,0xff,0xff,0x1f,0x00,0xc0,0x03,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0xf8,0x03,0x00,0x00,0x00,
+ 0x1e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x07,0x00,0xe0,0xff,0xff,0xff,
+ 0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0x7f,0x00,0x80,0x07,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0xe0,0x0f,0x00,0x00,0x00,0x0f,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x03,0x00,0xf8,0xff,0xff,0xff,0x03,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x80,0xff,0xff,0xff,0x7f,0x00,0x80,0x07,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x70,0xe0,0x0f,0x00,0x00,0x00,0x0f,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0xf0,0x03,0x00,0xf8,0xff,0xff,0xff,0x03,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0xff,0xff,0xff,0xff,0x00,0x80,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x70,0x00,0x3f,0x00,0x00,0x80,0x0f,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0xf8,0x01,0x00,0xfe,0xff,0xff,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,
+ 0xff,0xff,0xff,0x03,0x00,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x70,0x00,0xfe,0x00,0x00,0xc0,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x7e,0x00,0x80,0xff,0xff,0xff,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0xff,0xff,
+ 0xff,0x0f,0x00,0x3e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,
+ 0x00,0xf8,0x01,0x00,0xc0,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3e,0x00,
+ 0xc0,0xff,0xff,0xff,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0xff,0xff,0xff,0x3f,
+ 0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x80,
+ 0x0f,0x00,0xf0,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x0f,0x00,0xf8,0xff,
+ 0xff,0xff,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0xff,0xff,0xff,0x3f,0x00,0xf8,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x80,0x0f,0x00,
+ 0xf0,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x0f,0x00,0xf8,0xff,0xff,0xff,
+ 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0x00,0xe0,0x01,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x00,0x3e,0x00,0xf0,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x07,0x00,0xfe,0xff,0xff,0xff,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0xfc,0xff,0xff,0xff,0x03,0xc0,0x03,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x00,0xfc,0x00,0x78,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0xf8,0x01,0x80,0xff,0xff,0xff,0x3f,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0xf0,0xff,0xff,0xff,0x0f,0xc0,0x07,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x78,0x00,0x00,0xe0,0x03,0x3c,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x7c,0x00,0xe0,0xff,0xff,0xff,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0xc0,0xff,0xff,0xff,0x1f,0x00,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x7c,0x00,0x00,0xc0,0x1f,0x1e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x3e,0x00,0xf0,0xff,0xff,0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,
+ 0xff,0xff,0xff,0x1f,0x00,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x7c,0x00,0x00,0xc0,0x1f,0x1e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3e,0x00,
+ 0xf0,0xff,0xff,0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xff,0xff,
+ 0xff,0x7f,0x00,0x1e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0x00,
+ 0x00,0x00,0x3f,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x0f,0x00,0xfc,0xff,
+ 0xff,0xff,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,0xff,0xff,0xff,
+ 0x01,0x7c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x00,0x00,0x00,
+ 0xfc,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x07,0x00,0xff,0xff,0xff,0x3f,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xff,0xff,0xff,0x03,0x78,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x00,0x00,0x00,0xf8,0x07,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x01,0xc0,0xff,0xff,0xff,0x1f,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0xff,0xff,0xff,0x07,0xf0,0x01,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0xfc,0x03,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0xf8,0x00,0xf0,0xff,0xff,0xff,0x07,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0xf0,0xff,0xff,0xff,0x07,0xf0,0x01,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0xfc,0x03,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0xf8,0x00,0xf0,0xff,0xff,0xff,0x07,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0xe0,0xff,0xff,0xff,0x1f,0xe0,0x03,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x1c,0x00,0x00,0x00,0xfc,0x01,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x7e,0x00,0xf8,0xff,0xff,0xff,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,0xff,0xff,0xff,0xff,0x80,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x1e,0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x0f,0x00,
+ 0xfe,0xff,0xff,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0xfc,0xff,0xff,0xff,0x01,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0e,
+ 0x00,0x00,0x80,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x07,0x80,0xff,0xff,
+ 0xff,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0xff,
+ 0xff,0xff,0x07,0x3e,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0e,0x00,0x00,
+ 0xc0,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x01,0xe0,0xff,0xff,0xff,0x07,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xff,0xff,0xff,
+ 0x0f,0x7c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x00,0x00,0xe0,0x3f,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x01,0xf8,0xff,0xff,0xff,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,0xe0,0xff,0xff,0xff,0x0f,0x7c,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x00,0x00,0xe0,0x3f,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0xf8,0x01,0xf8,0xff,0xff,0xff,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,0xc0,0xff,0xff,0xff,0x3f,0xf0,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x00,0x00,0xf0,0x1f,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x7e,0x00,0xfc,0xff,0xff,0xff,0x00,0x00,0x00,0x00,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,0xff,0xff,0x7f,0xe0,0x01,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x80,0x07,0x00,0x00,0xfc,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x3e,0x00,0xff,0xff,0xff,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0xfc,0xff,0xff,0xff,0xe0,0x03,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x80,0x07,0x00,0x00,0xfc,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0xc0,
+ 0xff,0xff,0xff,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0xf0,0xff,0xff,0xff,0xc1,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,
+ 0x03,0x00,0x00,0xfe,0x07,0x00,0x00,0x00,0x00,0x00,0xc0,0x0f,0xf0,0xff,0xff,
+ 0xff,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0xf0,0xff,0xff,0xff,0xc1,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x03,0x00,
+ 0x00,0xfe,0x07,0x00,0x00,0x00,0x00,0x00,0xc0,0x0f,0xf0,0xff,0xff,0xff,0x07,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0xff,
+ 0xff,0xff,0x83,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x01,0x00,0x00,0xff,
+ 0x07,0x00,0x00,0x00,0x00,0x00,0xc0,0x07,0xf8,0xff,0xff,0xff,0x03,0x00,0x00,
+ 0x00,0x00,0x00,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,0xff,0xff,
+ 0x0f,0x1e,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x01,0x00,0xc0,0xef,0x03,0x00,
+ 0x00,0x00,0x00,0x00,0xe0,0x01,0xff,0xff,0xff,0x7f,0x00,0x00,0x00,0x00,0x00,
+ 0x00,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,0xff,0xff,0x0f,0x1c,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0xe0,0xf3,0x01,0x00,0x00,0x00,
+ 0x00,0x00,0xf0,0x80,0xff,0xff,0xff,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xff,0xff,0x1f,0x38,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x70,0x00,0x00,0xf0,0xf9,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x78,0xe0,0xff,0xff,0xff,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xff,0xff,0x1f,0x38,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x70,0x00,0x00,0xf0,0xf9,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0xe0,
+ 0xff,0xff,0xff,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0xf0,0xff,0xff,0x7f,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x78,0x00,0x00,0x78,0x7c,0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0xf0,0xff,0xff,
+ 0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,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,0xff,0xff,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x00,
+ 0x00,0x7e,0x7c,0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0xf8,0xff,0xff,0xff,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,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,0xff,0xff,0xe0,0x01,0x00,0x00,0x00,0x00,0x00,0x3c,0x00,0x00,0x3e,
+ 0x3e,0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0xfe,0xff,0xff,0x7f,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,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,
+ 0xff,0xff,0xc1,0x03,0x00,0x00,0x00,0x00,0x00,0x3c,0x00,0x00,0x0f,0x1e,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x0f,0xfe,0xff,0xff,0x1f,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,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,0xff,0xff,
+ 0xc1,0x03,0x00,0x00,0x00,0x00,0x00,0x3c,0x00,0x00,0x0f,0x1e,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x0f,0xfe,0xff,0xff,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xff,0xff,0x83,0x07,
+ 0x00,0x00,0x00,0x00,0x00,0x1e,0x00,0xc0,0x07,0x0f,0x00,0x00,0x00,0x00,0x00,
+ 0x80,0x07,0xff,0xff,0xff,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0xff,0xff,0x07,0x0f,0x00,0x00,
+ 0x00,0x00,0x00,0x0f,0x00,0xe0,0x83,0x0f,0x00,0x00,0x00,0x00,0x00,0x80,0xc7,
+ 0xff,0xff,0xff,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,0xc0,0xff,0xff,0x0f,0x0f,0x00,0x00,0x00,0x00,
+ 0x00,0x07,0x00,0xf0,0x81,0x07,0x00,0x00,0x00,0x00,0x00,0xc0,0xc3,0xff,0xff,
+ 0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,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,0xff,0x1f,0x1c,0x00,0x00,0x00,0x00,0x80,0x03,
+ 0x00,0x7c,0xc0,0x03,0x00,0x00,0x00,0x00,0x00,0xe0,0xe1,0xff,0xff,0x7f,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,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,0xff,0x3f,0x3c,0x00,0x00,0x00,0x00,0xc0,0x03,0x00,0x3f,
+ 0xe0,0x01,0x00,0x00,0x00,0x00,0x00,0xe0,0xe0,0xff,0xff,0x1f,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,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,0xff,0x3f,0x3c,0x00,0x00,0x00,0x00,0xc0,0x03,0x00,0x3f,0xe0,0x01,
+ 0x00,0x00,0x00,0x00,0x00,0xe0,0xe0,0xff,0xff,0x1f,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,
+ 0xff,0x3f,0x3c,0x00,0x00,0x00,0x00,0xe0,0x01,0x80,0x1f,0xe0,0x01,0x00,0x00,
+ 0x00,0x00,0x00,0xf0,0xe0,0xff,0xff,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0xff,0x3f,
+ 0x38,0x00,0x00,0x00,0x00,0xe0,0x00,0xe0,0x07,0xf0,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x78,0xf8,0xff,0xff,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,0xf8,0xff,0x3f,0x38,0x00,
+ 0x00,0x00,0x00,0xf0,0x00,0xf0,0x03,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x78,
+ 0xf8,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0xff,0x3f,0x38,0x00,0x00,0x00,
+ 0x00,0x70,0x00,0xfe,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0xfc,0xff,
+ 0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0xff,0x3f,0x38,0x00,0x00,0x00,0x00,0x70,
+ 0x00,0xfe,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0xfc,0xff,0x3f,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0xf8,0xff,0x3f,0x38,0x00,0x00,0x00,0x00,0x38,0x80,0x3f,
+ 0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0x00,0x1c,0xfc,0xff,0x3f,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0xfc,0xff,0x3f,0x38,0x00,0x00,0x00,0x00,0x1c,0xc0,0x0f,0x00,0x1c,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x1e,0xfc,0xff,0x3f,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0xfc,0xff,0x1f,0x38,0x00,0x00,0x00,0x00,0x1e,0xf0,0x03,0x00,0x1e,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x1e,0xfc,0xff,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,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,0xff,
+ 0x1f,0x38,0x00,0x00,0x00,0x00,0x0f,0x7f,0x00,0x00,0x0f,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x0f,0xfc,0xff,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,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,0xff,0x1f,0x38,
+ 0x00,0x00,0x00,0x00,0x0f,0x7f,0x00,0x00,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x0f,0xfc,0xff,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 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,0xff,0x1f,0x38,0x00,0x00,
+ 0x00,0x00,0xe7,0x3f,0x00,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0xfc,
+ 0xff,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,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,0xff,0x0f,0x38,0x00,0x00,0x00,0x80,
+ 0xfb,0x0f,0x00,0x80,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0xfc,0xff,0x7f,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,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,0xff,0x07,0x38,0x00,0x00,0x00,0xc0,0xff,0x01,
+ 0x00,0xc0,0x03,0x00,0x00,0x00,0x00,0x00,0x80,0x07,0xf8,0xff,0xff,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,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,0xff,0x07,0x38,0x00,0x00,0x00,0xe0,0x3f,0x00,0x00,0xc0,
+ 0x01,0x00,0x00,0x00,0x00,0x00,0xc0,0x03,0xf8,0xff,0xff,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,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,0xff,0x07,0x38,0x00,0x00,0x00,0xe0,0x3f,0x00,0x00,0xc0,0x01,0x00,
+ 0x00,0x00,0x00,0x00,0xc0,0x03,0xf8,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,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,
+ 0xff,0x07,0x38,0x00,0x00,0x00,0xe0,0x0f,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0xc0,0x03,0xf8,0xff,0xff,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,0x80,0xff,0xff,0x03,
+ 0x38,0x00,0x00,0x00,0xf0,0x03,0x00,0x00,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0xe0,0x01,0xf8,0xff,0xff,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,0xc0,0xff,0xff,0x03,0x38,0x00,
+ 0x00,0x00,0x70,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x01,
+ 0xf0,0xff,0xff,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,0xc0,0xff,0xff,0x01,0x38,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0xf0,0xff,
+ 0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0xe0,0xff,0xff,0x00,0x38,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x00,0xf0,0xff,0xff,0x03,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0xe0,0xff,0xff,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x38,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x00,0xf0,0xff,0xff,0x03,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0xe0,0xff,0xff,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0xf0,0x00,0xe0,0xff,0xff,0x07,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,
+ 0xff,0xff,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1e,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x78,0x00,0xe0,0xff,0xff,0x07,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0xff,0x7f,
+ 0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1e,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x78,0x00,0xc0,0xff,0xff,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0xff,0x7f,0x00,0x18,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x3c,
+ 0x00,0xc0,0xff,0xff,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0xff,0x7f,0x00,0x18,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x00,0xc0,
+ 0xff,0xff,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0xff,0x7f,0x00,0x1c,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x80,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x00,0x80,0xff,0xff,
+ 0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0xf8,0xff,0x3f,0x00,0x1c,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x80,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x1e,0x00,0x80,0xff,0xff,0x1f,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0xfc,0xff,0x1f,0x00,0x1c,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x03,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x1e,0x00,0x80,0xff,0xff,0x1f,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0xfc,0xff,0x1f,0x00,0x1c,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x03,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x1f,0x00,0x00,0xff,0xff,0x1f,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xff,
+ 0x1f,0x00,0x1c,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x03,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x1f,0x00,0x00,0xff,0xff,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,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,0xff,0x0f,0x00,
+ 0x1c,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x01,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x0f,0x00,0x00,0xff,0xff,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 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,0xff,0x0f,0x00,0x1c,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x00,
+ 0x00,0xff,0xff,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,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,0xff,0x07,0x00,0x1c,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x07,0x00,0x00,0xfe,
+ 0xff,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,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,0xff,0x07,0x00,0x1e,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x07,0x00,0x00,0xfe,0xff,0x7f,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,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,0xff,0x07,0x00,0x1e,0x00,0x00,0x00,0x00,0x00,0x00,0x70,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x07,0x00,0x00,0xfe,0xff,0x7f,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,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,0xff,0x07,0x00,0x1e,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x80,0x07,0x00,0x00,0xfc,0xff,0x7f,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,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,
+ 0xff,0x03,0x00,0x1e,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x80,0x03,0x00,0x00,0xfc,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,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,0xff,0x03,
+ 0x00,0x1e,0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0xc0,0x03,0x00,0x00,0xfc,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0xff,0xff,0x03,0x00,0x1e,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x1e,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x03,
+ 0x00,0x00,0xf8,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0xff,0xff,0x03,0x00,0x1e,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x1e,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x03,0x00,0x00,
+ 0xf8,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0xc0,0xff,0xff,0x01,0x00,0x1e,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x1e,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x03,0x00,0x00,0xf8,0xff,
+ 0xff,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,0xe0,0xff,0xff,0x01,0x00,0x1c,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x01,0x00,0x00,0xf0,0xff,0xff,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,0xe0,0xff,0xff,0x00,0x00,0x1c,0x00,0x00,0x00,0x00,0x00,0x80,0x07,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0xc0,0x01,0x00,0x00,0xf0,0xff,0xff,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,0xe0,
+ 0xff,0xff,0x00,0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0x80,0x07,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0xc0,0x01,0x00,0x00,0xf0,0xff,0xff,0x03,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0xff,0x7f,
+ 0x00,0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0x80,0x03,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0xc0,0x01,0x00,0x00,0xe0,0xff,0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0xff,0x7f,0x00,0x00,
+ 0x3c,0x00,0x00,0x00,0x00,0x00,0x80,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,
+ 0x01,0x00,0x00,0xe0,0xff,0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0xff,0x7f,0x00,0x00,0x38,0x00,
+ 0x00,0x00,0x00,0x00,0xc0,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x01,0x00,
+ 0x00,0xe0,0xff,0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0xff,0x3f,0x00,0x00,0x38,0x00,0x00,0x00,
+ 0x00,0x00,0xc0,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x01,0x00,0x00,0xe0,
+ 0xff,0xff,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0xf8,0xff,0x3f,0x00,0x00,0x38,0x00,0x00,0x00,0x00,0x00,
+ 0xe0,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x01,0x00,0x00,0xc0,0xff,0xff,
+ 0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0xfc,0xff,0x1f,0x00,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x01,0x00,0x00,0xc0,0xff,0xff,0x07,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0xfc,0xff,0x1f,0x00,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0xc0,0x01,0x00,0x00,0xc0,0xff,0xff,0x07,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xff,
+ 0x1f,0x00,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0xc0,0x01,0x00,0x00,0x80,0xff,0xff,0x0f,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xff,0x1f,0x00,
+ 0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0xc0,0x03,0x00,0x00,0x80,0xff,0xff,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 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,0xff,0x0f,0x00,0x00,0x38,
+ 0x00,0x00,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0x03,
+ 0x00,0x00,0x00,0xff,0xff,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,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,0xff,0x0f,0x00,0x00,0x3c,0x00,0x00,
+ 0x00,0x00,0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x07,0x00,0x00,
+ 0x00,0xff,0xff,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,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,0xff,0x0f,0x00,0x00,0x3c,0x00,0x00,0x00,0x00,
+ 0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x07,0x00,0x00,0x00,0xff,
+ 0xff,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,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,0x07,0x00,0x00,0xfc,0x3f,0x00,0x00,0x00,0x00,0x00,0x3e,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x07,0x00,0x00,0x00,0xfe,0xff,0x1f,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x0f,0x00,0xe0,0xff,0xff,0x3f,0x00,0x00,0x00,0x00,0x00,0x1e,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x0f,0x00,0x00,0x00,0xfe,0xff,0x3f,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0xfc,0xff,0xff,0xff,0x3f,0x00,0x00,0x00,0x00,0x00,0x0f,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x0f,0x00,0x00,0x00,0xfe,0xff,0x3f,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xff,0xff,
+ 0xff,0x0f,0x3c,0x00,0x00,0x00,0x00,0x00,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x0e,0x00,0x00,0x00,0xfc,0xff,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xff,0xff,0xff,0x0f,
+ 0x3c,0x00,0x00,0x00,0x00,0x00,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x0e,0x00,0x00,0x00,0xfc,0xff,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xff,0xff,0x01,0x00,0x38,0x00,
+ 0x00,0x00,0x00,0x80,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1e,0x00,
+ 0x00,0x00,0xfc,0xff,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0xf0,0xff,0xff,0x00,0x00,0x00,0x38,0x00,0x00,0x00,
+ 0x00,0x80,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x00,0x00,0x00,
+ 0xfc,0xff,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,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,0xff,0x03,0x00,0x00,0x00,0x38,0x00,0x00,0x00,0x00,0xc0,
+ 0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0xf8,0xff,
+ 0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0xfc,0xff,0x1f,0x00,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x00,0xc0,0x01,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0xf8,0xff,0xff,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0xff,0xff,
+ 0x01,0x00,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x00,0xe0,0x01,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0xf0,0x01,0x00,0x00,0xf0,0xff,0xff,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0xff,0xff,0x01,0x00,
+ 0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x00,0xe0,0x01,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0xf0,0x01,0x00,0x00,0xf0,0xff,0xff,0x00,0x00,0x00,0x00,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,0xff,0x07,0x00,0xfe,0x00,0x00,
+ 0x00,0x70,0x00,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0xe0,0x03,0x00,0x00,0xf0,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0xf0,0xff,0x1f,0x00,0xf8,0xff,0x00,0x00,0x00,0x70,
+ 0x00,0x00,0x00,0x00,0xf0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,
+ 0x03,0x00,0x00,0xf0,0xff,0xff,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,0xfe,0x7f,0x00,0xe0,0xff,0x7f,0x00,0x00,0x00,0x70,0x00,0x00,
+ 0x00,0x00,0xf8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x0f,0x00,
+ 0x00,0xf0,0xff,0xff,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,
+ 0xe0,0xff,0x03,0x00,0xf0,0xff,0x3f,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x00,
+ 0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0x00,0x00,0xe0,
+ 0xff,0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xff,
+ 0x03,0x00,0xf0,0xff,0x3f,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x00,0x78,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1f,0x00,0x00,0xe0,0xff,0xff,
+ 0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0x7f,0x00,0x00,
+ 0xf8,0xff,0x3f,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x00,0x78,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7c,0x00,0x00,0xe0,0xff,0xff,0x03,0x00,
+ 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,0x07,0x00,0x00,0xf8,0xff,
+ 0x1f,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x3c,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0xf8,0x01,0x00,0xe0,0xff,0xff,0x03,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0xff,0x00,0x00,0x00,0xfc,0xff,0x1f,0x00,
+ 0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0xe0,0x07,0x00,0xc0,0xff,0xff,0x03,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0xc0,0x1f,0x00,0x00,0x00,0xfe,0xff,0x1f,0x00,0x00,0x00,
+ 0xe0,0x00,0x00,0x00,0x00,0x3c,0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0xc0,0x3f,0x00,0xc0,0xff,0xff,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0xc0,0x1f,0x00,0x00,0x00,0xfe,0xff,0x1f,0x00,0x00,0x00,0xe0,0x00,
+ 0x00,0x00,0x00,0x3c,0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,
+ 0x3f,0x00,0xc0,0xff,0xff,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x80,0x03,0x00,0x00,0x00,0xfe,0xff,0x0f,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,
+ 0x00,0x3e,0x00,0x00,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x01,
+ 0x80,0xff,0xff,0x07,0x00,0x00,0x00,0x00,0x00,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,0xff,0x0f,0x00,0x00,0x00,0xe0,0x00,0x00,0x00,0x00,0x3f,
+ 0x00,0x00,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x3f,0x80,0xff,
+ 0xff,0x0f,0x00,0x00,0x00,0x00,0x00,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,0xff,0x07,0x00,0x00,0x00,0xc0,0x01,0x00,0x00,0x00,0xff,0x00,0x00,
+ 0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0xff,0x00,0xfc,0xff,0x0f,
+ 0x00,0x00,0x00,0x00,0x00,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,
+ 0xff,0x07,0x00,0x00,0x00,0xc0,0x01,0x00,0x00,0x00,0xf7,0x03,0x00,0x3c,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x0f,0xc0,0xff,0x0f,0x00,0x00,
+ 0x00,0x00,0x00,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,0xff,0x07,
+ 0x00,0x00,0x00,0xc0,0x01,0x00,0x00,0x00,0xf7,0x03,0x00,0x3c,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x0f,0xc0,0xff,0x0f,0x00,0x00,0x00,0x00,
+ 0x00,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,0xff,0x03,0x00,0x00,
+ 0x00,0xc0,0x01,0x00,0x00,0x80,0xe3,0x0f,0x00,0x3f,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0xf0,0x7f,0x00,0xf8,0x1f,0x00,0x00,0x00,0x00,0x00,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,0xff,0x03,0x00,0x00,0x00,0xc0,
+ 0x01,0x00,0x00,0x80,0xe3,0xff,0xff,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x80,0xff,0x03,0x80,0x0f,0x00,0x00,0x00,0x00,0x00,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,0xff,0x03,0x00,0x00,0x00,0xc0,0x01,0x00,
+ 0x00,0x80,0xc3,0xff,0xff,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0xfe,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0xc0,0xff,0xff,0x01,0x00,0x00,0x00,0xc0,0x01,0x00,0x00,0xc0,
+ 0x01,0xff,0xff,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,
+ 0xff,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,0xc0,0xff,0xff,0x00,0x00,0x00,0x00,0xc0,0x01,0x00,0x00,0xc0,0x01,0xfe,
+ 0x7f,0x38,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0x1f,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,
+ 0xff,0xff,0x00,0x00,0x00,0x00,0xc0,0x01,0x00,0x00,0xc0,0x01,0xfe,0x7f,0x38,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0x1f,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xff,0xff,
+ 0x00,0x00,0x00,0x00,0xc1,0x01,0x00,0x00,0xe0,0x00,0x3e,0x00,0x38,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0xff,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,0xe0,0xff,0xff,0x00,0x00,
+ 0x00,0x80,0xc3,0x01,0x00,0x00,0xe0,0x00,0x7c,0x00,0x3c,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,0x7f,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0xff,0x7f,0x00,0x00,0x00,0xf0,
+ 0xc3,0x01,0x00,0x00,0xf0,0x00,0xf0,0x00,0x3c,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0xff,0x7f,0x00,0x00,0x00,0xf8,0xc3,0x01,
+ 0x00,0x00,0xf0,0x00,0xe0,0x01,0x3c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0xe0,0xff,0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0xf8,0xff,0x7f,0x00,0x00,0x00,0xf8,0xc3,0x01,0x00,0x00,
+ 0xf0,0x00,0xe0,0x01,0x3c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0xe0,0xff,0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0xf8,0xff,0x7f,0x00,0x00,0x00,0xff,0xc3,0x03,0x00,0x00,0x70,0x00,
+ 0xc0,0x03,0x3c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x80,0xff,0xff,0xff,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0xf8,0xff,0x3f,0x00,0x00,0x80,0xff,0xc3,0x03,0x00,0x00,0x70,0x00,0xc0,0x03,
+ 0x3c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x01,0x00,
+ 0xf0,0xff,0xff,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0xff,
+ 0x1f,0x00,0x00,0xe0,0xff,0xc3,0x03,0x00,0x00,0x78,0x00,0x80,0x07,0x3c,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x7f,0x00,0x00,0x00,
+ 0xfc,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xff,0x1f,0x00,
+ 0x00,0xf8,0xff,0xc3,0x03,0x00,0x00,0x78,0x00,0x00,0x0f,0x3c,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xff,0x0f,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xff,0x1f,0x00,0x00,0xf8,
+ 0xff,0xc3,0x03,0x00,0x00,0x78,0x00,0x00,0x0f,0x3c,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xff,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xff,0x0f,0x00,0x00,0xfe,0xff,0x83,
+ 0x03,0x00,0x00,0x3c,0x00,0x00,0x1e,0x1c,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0xfc,0xff,0x01,0xe0,0xff,0xff,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,0xfe,0xff,0x0f,0x00,0x80,0xff,0xff,0x87,0x03,0x00,
+ 0x00,0x3c,0x00,0x00,0x3c,0x1c,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0xff,0xff,
+ 0xff,0xff,0xe1,0xff,0xff,0x03,0x00,0x00,0x00,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,0xff,0x0f,0x00,0xc0,0xff,0xff,0x87,0x03,0x00,0x00,0x3c,
+ 0x00,0x00,0x78,0x1c,0x00,0x00,0x00,0x00,0x00,0xfe,0xff,0xff,0xff,0xff,0xff,
+ 0xe1,0xff,0xff,0x03,0x00,0x00,0x00,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,0xff,0x07,0x00,0xf8,0xff,0xff,0xc7,0x03,0x00,0x00,0x1c,0x00,0x00,
+ 0xe0,0x1c,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0xc0,0xff,
+ 0xff,0x03,0x00,0x00,0x00,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,
+ 0xff,0x07,0x00,0xf8,0xff,0xff,0xc7,0x03,0x00,0x00,0x1c,0x00,0x00,0xe0,0x1c,
+ 0x00,0x00,0x00,0x80,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0xc0,0xff,0xff,0x03,
+ 0x00,0x00,0x00,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,0xff,0x03,
+ 0x00,0xfe,0xff,0xff,0xc7,0x03,0x00,0x00,0x1c,0x00,0x00,0xe0,0x1f,0x00,0x00,
+ 0x00,0xf0,0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x80,0xff,0xff,0x07,0x00,0x00,
+ 0x00,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,0xff,0x03,0x00,0xff,
+ 0xff,0xff,0xc7,0x03,0x00,0x00,0x1c,0x00,0x00,0x80,0x1f,0x00,0x00,0x00,0xff,
+ 0xff,0x03,0x00,0x00,0x00,0xfc,0x03,0x80,0xff,0xff,0x07,0x00,0x00,0x00,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,0xff,0x03,0xc0,0xff,0xff,0xff,
+ 0xc7,0x03,0x00,0x00,0x1e,0x00,0x00,0x00,0x1f,0x00,0x00,0xf8,0xff,0x0f,0x00,
+ 0x80,0xff,0xff,0xff,0x1f,0x00,0xff,0xff,0x07,0x00,0x00,0x00,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,0xff,0x01,0xf0,0xff,0xff,0xff,0xc3,0x03,
+ 0x00,0x00,0xfe,0xff,0x00,0x00,0x1f,0x00,0xe0,0xff,0x3f,0x00,0x00,0x80,0xff,
+ 0xff,0xff,0x3f,0x00,0xff,0xff,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0xc0,0xff,0xff,0x01,0xfc,0xff,0xff,0xff,0xc1,0x03,0x00,0x00,
+ 0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x80,0xff,0xff,0xff,
+ 0x7f,0x00,0xff,0xff,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0xc0,0xff,0xff,0x01,0xfc,0xff,0xff,0xff,0xc1,0x03,0x00,0x00,0xfe,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x80,0xff,0xff,0xff,0x7f,0x00,
+ 0xff,0xff,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,
+ 0xff,0xff,0x01,0xff,0xff,0xff,0xff,0x80,0x03,0x00,0x00,0xfe,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0x07,0x00,0x00,0x00,0x00,0xfe,0xff,0xff,0xff,0x01,0xfe,0xff,
+ 0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xff,0xff,
+ 0x80,0xff,0xff,0xff,0x3f,0x00,0x00,0x00,0x00,0x7c,0x00,0x00,0xf5,0xff,0xff,
+ 0x3f,0x00,0x00,0x00,0x00,0x00,0xfc,0xff,0xff,0xff,0x07,0xfe,0xff,0x1f,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xff,0x7f,0xf0,0xff,
+ 0xff,0xff,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0xf0,0xff,0xff,0xff,0x1f,0xfe,0xff,0x1f,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0xff,0x7f,0xf8,0xff,0xff,0xff,
+ 0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0xc0,0xff,0xff,0xff,0x3f,0xfe,0xff,0x3f,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0xff,0x7f,0xf8,0xff,0xff,0xff,0x03,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0xc0,0xff,0xff,0xff,0x3f,0xfe,0xff,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0xf0,0xff,0xff,0xff,0xff,0xff,0x7f,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xff,
+ 0xff,0xff,0xff,0xfc,0xff,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0xf8,0xff,0xff,0xff,0xff,0xff,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xff,0xff,
+ 0xff,0xff,0xff,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0xf8,0xff,0xff,0xff,0xff,0xff,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0xff,0xff,0xff,0xff,
+ 0xff,0x3f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xff,
+ 0xff,0xff,0xff,0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xff,0xff,0xff,0xff,0xff,0x7f,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xff,0xff,0xff,
+ 0xff,0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xff,0xff,0xff,0xff,0xff,0x7f,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xff,0xff,0xff,0xff,0xff,
+ 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,0x7f,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xff,0xff,0xff,0xff,0x7f,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0xfe,0xff,0xff,0xff,0xff,0xff,0x00,0x00,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,0xff,0xff,0xff,0xff,0x3f,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0xfc,0xff,0xff,0xff,0xff,0xff,0x00,0x00,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,0xff,0xff,0xff,0xff,0x07,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,
+ 0xff,0xff,0xff,0xff,0xff,0x00,0x00,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,0xff,0xff,0xff,0xff,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0xff,0xff,
+ 0xff,0xff,0xff,0x00,0x00,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,
+ 0xff,0xff,0xff,0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xff,0xff,0xff,0xff,
+ 0xff,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,0xff,0xff,0xff,
+ 0xff,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xff,0xff,0xff,0xff,0xff,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,0x80,0xff,0xff,0xff,0xff,0x3f,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0xff,0xff,0xff,0xff,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,0x80,0xff,0xff,0xff,0xff,0x1f,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0xf8,0xff,0xff,0xff,0xff,0x03,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0xc0,0xff,0xff,0xff,0xff,0x07,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0xf0,0xff,0xff,0xff,0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0xc0,0xff,0xff,0xff,0xff,0x07,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0xf0,0xff,0xff,0xff,0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0xc0,0xff,0xff,0xff,0xff,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,
+ 0xff,0xff,0xff,0xff,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,
+ 0xff,0xff,0xff,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,0xff,
+ 0xff,0xff,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xff,0xff,
+ 0xff,0x1f,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,0xff,0xff,0xff,
+ 0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xff,0xff,0xff,0x0f,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xff,0xff,0xff,0x0f,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xff,0xff,0xff,0x0f,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xff,0xff,0xff,0x0f,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0xff,0xff,0xff,0x03,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0xf8,0xff,0xff,0xff,0x0f,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0xf0,0xff,0xff,0xff,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,0xe0,0xff,0xff,0xff,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0xf8,0xff,0xff,0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0xc0,0xff,0xff,0xff,0x0f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0xf8,0xff,0xff,0x3f,0x00,0x00,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,0xff,0xff,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0xff,
+ 0xff,0x3f,0x00,0x00,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,0xff,
+ 0xff,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0xff,0xff,0x07,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xff,0xff,0x3f,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfc,0xff,0xff,0x03,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0xff,0xff,0x3f,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,0xff,0xff,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0xff,0xff,0x3f,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,0xff,0x3f,0x00,0x00,0x00,0x00,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,0xff,0x3f,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,0xff,0x3f,0x00,0x00,0x00,0x00,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,0xff,0x3f,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,0xff,0x0f,0x00,0x00,0x00,0x00,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,0xff,0x7f,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,
+ 0xff,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0xfc,0xff,0x7f,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,0xff,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0xff,
+ 0x7f,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,0x3f,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0xff,0x7f,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,0x1f,0x00,0x00,0x00,0x00,0x00,
+ 0x00,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,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,0x1f,0x00,0x00,0x00,0x00,0x00,0x00,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,0xff,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0xc0,0xff,0x03,0x00,0x00,0x00,0x00,0x00,0x00,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,0xff,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0xc0,0xff,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,0xfc,0xff,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,
+ 0x7f,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0xf0,0xff,0x01,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0xc0,0xff,0x01,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,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xc0,0xff,
+ 0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xe0,0x0f,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,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,0x01,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,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,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xfe,0x03,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xf8,0x03,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,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,
+ 0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,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,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0xc0,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
diff --git a/hacks/imsmap.c b/hacks/imsmap.c
new file mode 100644 (file)
index 0000000..15cb66a
--- /dev/null
@@ -0,0 +1,507 @@
+/* imsmap, Copyright (c) 1992 Juergen Nickelsen <nickel@cs.tu-berlin.de>
+ * Derived from code by Markus Schirmer, TU Berlin.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software 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.  No representations are made about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or 
+ * implied warranty.
+ *
+ * Revision History:
+ * 24-aug-92: jwz: hacked.
+ * 17-May-97: jwz: hacked more.
+ */
+
+#include <stdio.h>
+#include <math.h>
+#include <sys/time.h> /* for gettimeofday() */
+
+#include <X11/Xlib.h>
+#include <X11/Xutil.h>
+
+#include "screenhack.h"
+
+#define NSTEPS 7
+#define COUNT (1 << NSTEPS)
+#define CELL(c, r) cell[((unsigned int)(c)) + ((unsigned int) (r)) * xmax]
+
+static enum mode_t { MODE_H, MODE_S, MODE_V, MODE_RANDOM } mode;
+
+static GC gc, gc2;
+static XWindowAttributes xgwa;
+
+#if defined(sun) && !__STDC__  /* sun cc doesn't know "signed char" */
+#define signed /**/
+#endif
+
+static Colormap cmap;
+static int ncolors;
+static XColor *colors;
+static Bool cycle_p;
+static int cycle_direction;
+static Bool extra_krinkly_p;
+
+static int delay, cycle_delay;
+static signed char *cell = NULL;
+static int xmax, ymax;
+static int iterations;
+
+static void
+init_map (Display *dpy, Window window)
+{
+  unsigned long fg_pixel = 0, bg_pixel = 0;
+  int fg_h, bg_h;
+  double fg_s, fg_v, bg_s, bg_v;
+
+  enum mode_t this_mode;
+  static Bool rv_p;
+    
+  XGCValues gcv;
+
+  XGetWindowAttributes (dpy, window, &xgwa);
+  cmap = xgwa.colormap;
+
+  if (!ncolors)
+    {
+      char *mode_str = get_string_resource ("mode", "Mode");
+      rv_p = get_boolean_resource ("reverseVideo", "ReverseVideo");
+      cycle_p = get_boolean_resource ("cycle", "Cycle");
+      ncolors = get_integer_resource ("ncolors", "Integer");
+      delay = get_integer_resource ("delay", "Integer");
+      cycle_delay = get_integer_resource ("cycleDelay", "Integer");
+      iterations = get_integer_resource ("iterations", "Integer");
+      if (iterations < 0) iterations = 0;
+      else if (iterations > 7) iterations = 7;
+
+      if (ncolors <= 2) ncolors = 0;
+      if (ncolors == 0) mono_p = True;
+
+      fg_pixel = get_pixel_resource ("background", "Background", dpy, cmap);
+      bg_pixel = get_pixel_resource ("foreground", "Foreground", dpy, cmap);
+
+      if (fg_pixel == bg_pixel)
+       {
+         XColor black, white;
+         black.red = black.green = black.blue = 0;
+         white.red = white.green = white.blue = 0xFFFF;
+         black.flags = white.flags = DoRed|DoGreen|DoBlue;
+         XAllocColor(dpy, cmap, &black);
+         XAllocColor(dpy, cmap, &white);
+         if (bg_pixel == black.pixel)
+           fg_pixel = white.pixel;
+         else
+           fg_pixel = black.pixel;
+       }
+
+      if (mono_p) cycle_p = False;
+
+      gcv.foreground = fg_pixel;
+      gcv.background = bg_pixel;
+      gc = XCreateGC (dpy, window, GCForeground|GCBackground, &gcv);
+      gcv.foreground = bg_pixel;
+      gc2 = XCreateGC (dpy, window, GCForeground, &gcv);
+
+      if (!mode_str || !strcmp (mode_str, "random"))
+       mode = MODE_RANDOM;
+      else if (!strcmp (mode_str, "h") || !strcmp (mode_str, "hue"))
+       mode = MODE_H;
+      else if (!strcmp (mode_str, "s") || !strcmp (mode_str, "saturation"))
+       mode = MODE_S;
+      else if (!strcmp (mode_str, "v") || !strcmp (mode_str, "value"))
+       mode = MODE_V;
+      else
+       {
+         fprintf (stderr,
+          "%s: mode must be hue, saturation, value, or random, not \"%s\"\n",
+                  progname, mode_str);
+         mode = MODE_RANDOM;
+       }
+    }
+
+  this_mode = mode;
+  if (!mono_p && mode == MODE_RANDOM)
+    switch (random () % 6) {
+    case 0: this_mode = MODE_H; break;
+    case 1: this_mode = MODE_S; break;
+    case 2: this_mode = MODE_V; break;
+    default: break;
+    }
+
+  if (mono_p)
+    extra_krinkly_p = !(random() % 15);
+  else
+    extra_krinkly_p = !(random() % 5);
+
+  if (!mono_p)
+    {
+      double distance, fg_H, bg_H, dh;
+
+    RETRY:
+      fg_h = random() % 360;
+      fg_s = frand(1.0);
+      fg_v = frand(1.0);
+
+      bg_h = fg_h;
+      bg_s = fg_s;
+      bg_v = fg_v;
+
+      switch (this_mode)
+       {
+       case MODE_H:
+         bg_h = random() % 360;
+         if (fg_v < 0.4)
+           goto RETRY;
+         distance = fg_h - bg_h;
+         if (distance < 0)
+           distance = -distance;
+         if (distance > 360)
+           distance = 180 - (distance - 180);
+         if (distance < 30)
+           goto RETRY;
+         break;
+
+       case MODE_S:
+         bg_s = frand(1.0);
+         if (fg_v < 0.4)
+           goto RETRY;
+         distance = fg_s - bg_s;
+         if (distance < 0)
+           distance = -distance;
+         if (distance < 0.2)
+           goto RETRY;
+         break;
+
+       case MODE_V:
+         bg_v = frand(1.0);
+         distance = fg_v - bg_v;
+         if (distance < 0)
+           distance = -distance;
+         if (distance < 0.4)
+           goto RETRY;
+         break;
+
+       default:
+         bg_h = random() % 360;
+         bg_s = frand(1.0);
+         bg_v = frand(1.0);
+
+         fg_H = ((double) fg_h) / 360;
+         bg_H = ((double) bg_h) / 360;
+         dh = fg_H - bg_H;
+         if (dh < 0) dh = -dh;
+         if (dh > 0.5) dh = 0.5 - (dh - 0.5);
+         distance = sqrt ((dh * dh) +
+                          ((fg_s - bg_s) * (fg_s - bg_s)) +
+                          ((fg_v - bg_v) * (fg_v - bg_v)));
+         if (distance < 0.2)
+           goto RETRY;
+       }
+
+      cycle_p = True;
+      if (colors)
+       free_colors (dpy, cmap, colors, ncolors);
+      else
+       colors = (XColor *) malloc (ncolors * sizeof(*colors));
+
+      cycle_direction = (random() & 1 ? 1 : -1);
+
+    RETRY_NON_WRITABLE:
+      {
+       int n = ncolors;
+       make_color_ramp (dpy, cmap,
+                        fg_h, fg_s, fg_v,
+                        bg_h, bg_s, bg_v,
+                        colors, &n,
+                        True, True, cycle_p);
+       if (n == 0 && cycle_p)
+         {
+           cycle_p = False;
+           goto RETRY_NON_WRITABLE;
+         }
+       ncolors = n;
+      }
+
+      if (ncolors <= 0)
+       mono_p = 1;
+    }
+
+  if (mono_p)
+    {
+      static Bool done = False;
+      static XColor c[50];
+         colors = c;
+      cycle_p = False;
+      ncolors = sizeof(c)/sizeof(*c);
+      if (!done)
+       {
+         int i;
+         done = True;
+         colors[0].pixel = fg_pixel;
+         for (i = 1; i < ncolors; i++)
+           colors[i].pixel = bg_pixel;
+       }
+    }
+
+  XSetForeground (dpy, gc, colors[1].pixel);
+  XFillRectangle (dpy, window, gc, 0, 0, xgwa.width, xgwa.height);
+}
+
+
+#define HEIGHT_TO_PIXEL(height)                                \
+       ((height) < 0                                   \
+        ? (extra_krinkly_p                             \
+           ? ncolors - ((-(height)) % ncolors)         \
+           : 0)                                        \
+        : ((height) >= ncolors                         \
+           ? (extra_krinkly_p                          \
+              ? (height) % ncolors                     \
+              : ncolors-1)                             \
+           : (height)))
+
+
+static unsigned int
+set (unsigned int l,
+     unsigned int c,
+     unsigned int size,
+     int height)
+{
+  int rang = 1 << (NSTEPS - size);
+  height = height + (random () % rang) - rang / 2;
+  height = HEIGHT_TO_PIXEL(height);
+  CELL (l, c) = height;
+  return colors[height].pixel;
+}
+
+static void
+floyd_steinberg (Display *dpy, Window window)
+{
+  int x, y, err;
+
+  /* Instead of repeatedly calling XPutPixel(), we make an Image and then
+     send its bits over all at once.  This consumes much less network
+     bandwidth.  The image we create is Wx1 intead of WxH, so that we
+     don't use enormous amounts of memory.
+   */
+  XImage *image =
+    XCreateImage (dpy, xgwa.visual,
+                 1, XYBitmap, 0,               /* depth, format, offset */
+                 (char *) calloc ((xmax + 8) / 8, 1),  /* data */
+                 xmax, 1, 8, 0);               /* w, h, pad, bpl */
+
+  XSetForeground (dpy, gc, colors[0].pixel);
+  XSetBackground (dpy, gc, colors[1].pixel);
+
+  for (y = 0; y < ymax - 1; y++)
+    {
+      for (x = 0; x < xmax - 1; x++)
+       {
+         if (CELL(x, y) < 0)
+           {
+             err = CELL (x, y);
+             XPutPixel (image, x, 0, 1);
+           }
+         else
+           {
+             err = CELL (x, y) - 1;
+             XPutPixel (image, x, 0, 0);
+           }
+         /* distribute error */
+         CELL (x,   y+1) += (int) (((float) err) * 3.0/8.0);
+         CELL (x+1, y)   += (int) (((float) err) * 3.0/8.0);
+         CELL (x+1, y+1) += (int) (((float) err) * 1.0/4.0);
+       }
+      XPutImage (dpy, window, gc, image, 0, 0, 0, y, xmax, 1);
+    }
+  XDestroyImage (image);
+}
+
+static void
+draw (Display *dpy, Window window,
+      int x, int y, unsigned long pixel, int grid_size)
+{
+  static unsigned int last_pixel, last_valid = 0;
+  if (! (last_valid && pixel == last_pixel))
+    XSetForeground (dpy, gc, pixel);
+  last_valid = 1, last_pixel = pixel;
+  if (grid_size == 1)
+    XDrawPoint (dpy, window, gc, x, y);
+  else
+    XFillRectangle (dpy, window, gc, x, y, grid_size, grid_size);
+}
+
+
+static void 
+draw_map (Display *dpy, Window window)
+{
+  int xstep, ystep, xnextStep, ynextStep;
+  int x, y, i, x1, x2, y1, y2;
+  unsigned int pixel, qpixels [4];
+
+  int backwards = random() & 1;
+
+  xmax = xgwa.width;
+  ymax = xgwa.height;
+
+  cell = (signed char *) calloc (xmax * ymax, 1);
+  if (cell == NULL)
+    exit (1);
+
+  CELL (0, 0) = 0;
+  xstep = (backwards ? -COUNT : COUNT);
+  ystep = COUNT;
+  for (i = 0; i < iterations; i++)
+    {
+      xnextStep = xstep / 2;
+      ynextStep = ystep / 2;
+      for (x = (backwards ? xmax-1 : 0);
+          (backwards ? x >= 0 : x < xmax);
+          x += xstep)
+       {
+         x1 = x + xnextStep;
+         if (x1 < 0)
+           x1 = xmax-1;
+         else if (x1 >= xmax)
+           x1 = 0;
+
+         x2 = x + xstep;
+         if (x2 < 0)
+           x2 = xmax-1;
+         else if (x2 >= xmax)
+           x2 = 0;
+
+         for (y = 0; y < ymax; y += ystep)
+           {
+             y1 = y + ynextStep;
+             if (y1 < 0)
+               y1 = ymax-1;
+             else if (y1 >= ymax)
+               y1 = 0;
+
+             y2 = y + ystep;
+             if (y2 < 0)
+               y2 = ymax-1;
+             else if (y2 >= ymax)
+               y2 = 0;
+
+             qpixels [0] = colors [HEIGHT_TO_PIXEL (CELL (x, y))].pixel;
+             qpixels [1] = colors [HEIGHT_TO_PIXEL (CELL (x, y2))].pixel;
+             qpixels [2] = colors [HEIGHT_TO_PIXEL (CELL (x2, y))].pixel;
+             qpixels [3] = colors [HEIGHT_TO_PIXEL (CELL (x2, y2))].pixel;
+
+             pixel = set (x, y1, i,
+                          ((int) CELL (x, y) + (int) CELL (x, y2) + 1) / 2);
+             if (! mono_p &&
+                 (pixel != qpixels[0] || pixel != qpixels[1] || 
+                  pixel != qpixels[2] || pixel != qpixels[3]))
+               draw (dpy, window, x, y1, pixel, ynextStep);
+
+             pixel = set (x1, y, i,
+                          ((int) CELL (x, y) + (int) CELL (x2, y) + 1) / 2);
+             if (! mono_p &&
+                 (pixel != qpixels[0] || pixel != qpixels[1] || 
+                  pixel != qpixels[2] || pixel != qpixels[3]))
+               draw (dpy, window, x1, y, pixel, ynextStep);
+
+             pixel = set (x1, y1, i,
+                          ((int) CELL (x, y) + (int) CELL (x, y2) +
+                           (int) CELL (x2, y) + (int) CELL (x2, y2) + 2)
+                          / 4);
+             if (! mono_p &&
+                 (pixel != qpixels[0] || pixel != qpixels[1] || 
+                  pixel != qpixels[2] || pixel != qpixels[3]))
+               draw (dpy, window, x1, y1, pixel, ynextStep);
+
+
+             if (cycle_p)
+               {
+                 struct timeval now;
+                 static struct timeval then = { 0, };
+                 unsigned long diff;
+#ifdef GETTIMEOFDAY_TWO_ARGS
+                 struct timezone tzp;
+                 gettimeofday(&now, &tzp);
+#else
+                 gettimeofday(&now);
+#endif
+                 diff = (((now.tv_sec - then.tv_sec)  * 1000000) +
+                         (now.tv_usec - then.tv_usec));
+                 if (diff > cycle_delay)
+                   {
+                     rotate_colors (dpy, cmap, colors, ncolors,
+                                    cycle_direction);
+                     then = now;
+                   }
+               }
+           }
+       }
+      xstep = xnextStep;
+      ystep = ynextStep;
+      if (!mono_p)
+       XSync (dpy, False);
+      screenhack_handle_events (dpy);
+    }
+  if (mono_p)
+    /* in mono-mode, we do all the drawing at the end */
+    floyd_steinberg (dpy, window);
+  
+  free (cell);
+  XSync (dpy, False);
+}
+
+
+char *progclass = "Imsmap";
+
+char *defaults [] = {
+  ".background:        black",
+  ".foreground:        black",
+  "*mode:      random",
+  "*ncolors:   50",
+  "*iterations:        7",
+  "*delay:     10",
+  "*cycleDelay:        100000",
+  "*cycle:     true",
+  0
+};
+
+XrmOptionDescRec options [] = {
+  { "-ncolors",                ".ncolors",     XrmoptionSepArg, 0 },
+  { "-delay",          ".delay",       XrmoptionSepArg, 0 },
+  { "-cycle-delay",    ".cycleDelay",  XrmoptionSepArg, 0 },
+  { "-mode",           ".mode",        XrmoptionSepArg, 0 },
+  { "-iterations",     ".iterations",  XrmoptionSepArg, 0 },
+  { "-cycle",          ".cycle",       XrmoptionNoArg, "True"  },
+  { "-no-cycle",       ".cycle",       XrmoptionNoArg, "False" },
+  { 0, 0, 0, 0 }
+};
+
+
+void
+screenhack (Display *dpy, Window window)
+{
+    while (1)
+      {
+       init_map (dpy, window);
+       draw_map (dpy, window);
+       if (delay)
+         {
+           if (cycle_p)
+             {
+               time_t start = time((time_t) 0);
+               while (start + delay > time((time_t) 0))
+                 {
+                   rotate_colors (dpy, cmap, colors, ncolors,
+                                  cycle_direction);
+                   if (cycle_delay) usleep(cycle_delay);
+                    screenhack_handle_events (dpy);
+                 }
+             }
+           else
+              {
+                screenhack_handle_events (dpy);
+                sleep (delay);
+              }
+         }
+      }
+}
diff --git a/hacks/imsmap.man b/hacks/imsmap.man
new file mode 100644 (file)
index 0000000..b8f81ad
--- /dev/null
@@ -0,0 +1,66 @@
+.TH XScreenSaver 1 "17-May-97" "X Version 11"
+.SH NAME
+imsmap - generate fractal maps
+.SH SYNOPSIS
+.B imsmap
+[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-ncolors \fIint\fP] [\-delay \fIseconds\fP] [\-iterations \fIint\fP] [\-mode h|s|v|random] [\-cycle] [\-no\-cycle]
+.SH DESCRIPTION
+The \fIimsmap\fP program generates map or cloud-like patterns.  It looks
+quite different in monochrome and color.
+.SH OPTIONS
+.I imsmap
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window.  This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-mono 
+If on a color display, pretend we're on a monochrome display.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use.  Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-ncolors \fIinteger\fP
+How many colors to use.  Default 50.
+.TP 8
+.B \-delay \fIinteger\fP
+How long to delay between images.  Default 10 seconds.
+.TP 8
+.B \-iterations \fIinteger\fP
+A measure of the resolution of the resultant image, from 0 to 7.  Default 7.
+.TP 8
+.B \-mode [ hue | saturation | value | random ]
+The axis upon which colors should be interpolated between the foreground
+and background color.  Default random.  
+.TP 8
+.B \-cycle
+.TP 8
+.B \-no\-cycle
+Whether to do colormap cycling.  Default is to cycle.
+.TP 8
+.B \-cycle\-delay
+Number of microseconds between shifts of the colormap; default 100000,
+or 1/10th second.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH AUTHOR
+Juergen Nickelsen <nickel@cs.tu-berlin.de>, 23-aug-92.
+
+Hacked on by Jamie Zawinski <jwz@jwz.org>, 24-aug-92, 17-May-97.
diff --git a/hacks/interference.c b/hacks/interference.c
new file mode 100644 (file)
index 0000000..a7a9195
--- /dev/null
@@ -0,0 +1,445 @@
+/* interference.c --- colored fields via decaying sinusoidal waves.
+ * An entry for the RHAD Labs Screensaver Contest.
+ *
+ * Author: Hannu Mallat <hmallat@cs.hut.fi>
+ *
+ * Copyright (C) 1998 Hannu Mallat.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software 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.  No representations are made about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or 
+ * implied warranty.
+ *
+ * decaying sinusoidal waves, which extend spherically from their
+ * respective origins, move around the plane. a sort of interference
+ * between them is calculated and the resulting twodimensional wave
+ * height map is plotted in a grid, using softly changing colours.
+ *
+ * not physically (or in any sense) accurate, but fun to look at for 
+ * a while. you may tune the speed/resolution/interestingness tradeoff 
+ * with X resources, see below.
+ *
+ * Created      : Wed Apr 22 09:30:30 1998, hmallat
+ * Last modified: Wed Apr 22 09:30:30 1998, hmallat
+ *
+ * TODO:
+ *
+ *    This really needs to be sped up.
+ *
+ *    I've tried making it use XPutPixel/XPutImage instead of XFillRectangle,
+ *    but that doesn't seem to help (it's the same speed at gridsize=1, and
+ *    it actually makes it slower at larger sizes.)
+ *
+ *    I played around with shared memory, but clearly I still don't know how
+ *    to use the XSHM extension properly, because it doesn't work yet.
+ *
+ *    Hannu had put in code to use the double-buffering extension, but that
+ *    code didn't work for me on Irix.  I don't think it would help anyway,
+ *    since it's not the swapping of frames that is the bottleneck (or a source
+ *    of visible flicker.)
+ *
+ *     -- jwz, 4-Jun-98
+ */
+
+#include <math.h>
+
+#include "screenhack.h"
+
+# include <X11/Xutil.h>
+
+/* I thought it would be faster this way, but it turns out not to be... -jwz */
+#undef USE_XIMAGE
+
+#ifndef USE_XIMAGE
+# undef HAVE_XSHM_EXTENSION  /* only applicable when using XImages */
+#endif /* USE_XIMAGE */
+
+
+#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+# include "xdbe.h"
+#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
+
+#ifdef HAVE_XSHM_EXTENSION
+# include "xshm.h"
+#endif /* HAVE_XSHM_EXTENSION */
+
+char *progclass="Interference";
+
+char *defaults [] = {
+  "*count:       3",     /* number of waves */
+  "*gridsize:    4",     /* pixel size, smaller values for better resolution */
+  "*ncolors:     128",   /* number of colours used */
+  "*speed:       30",    /* speed of wave origins moving around */
+  "*delay:       30000", /* or something */
+  "*color-shift: 60",    /* h in hsv space, smaller values for smaller
+                         * color gradients */
+  "*radius:      800",   /* wave extent */
+  "*gray:        false", /* color or grayscale */
+  "*mono:        false", /* monochrome, not very much fun */
+
+  "*doubleBuffer: True",
+#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+  "*useDBE:      True", /* use double buffering extension */
+#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
+
+#ifdef HAVE_XSHM_EXTENSION
+  "*useSHM:      True", /* use shared memory extension */
+#endif /*  HAVE_XSHM_EXTENSION */
+  0
+};
+
+XrmOptionDescRec options [] = {
+  { "-count",       ".count",       XrmoptionSepArg, 0 }, 
+  { "-ncolors",     ".ncolors",     XrmoptionSepArg, 0 }, 
+  { "-gridsize",    ".gridsize",    XrmoptionSepArg, 0 }, 
+  { "-speed",       ".speed",       XrmoptionSepArg, 0 },
+  { "-delay",       ".delay",       XrmoptionSepArg, 0 },
+  { "-color-shift", ".color-shift", XrmoptionSepArg, 0 },
+  { "-radius",      ".radius",      XrmoptionSepArg, 0 },
+  { "-gray",        ".gray",        XrmoptionNoArg,  "True" },
+  { "-mono",        ".mono",        XrmoptionNoArg,  "True" },
+  { "-db",         ".doubleBuffer", XrmoptionNoArg,  "True" },
+  { "-no-db",      ".doubleBuffer", XrmoptionNoArg,  "False" },
+#ifdef HAVE_XSHM_EXTENSION
+  { "-shm",    ".useSHM",      XrmoptionNoArg, "True" },
+  { "-no-shm", ".useSHM",      XrmoptionNoArg, "False" },
+#endif /*  HAVE_XSHM_EXTENSION */
+  { 0, 0, 0, 0 }
+};
+
+int options_size = (sizeof (options) / sizeof (XrmOptionDescRec));
+
+struct inter_source {
+  int x; 
+  int y;
+  double x_theta;
+  double y_theta;
+};
+
+struct inter_context {
+  /*
+   * Display-related entries 
+   */
+  Display* dpy;
+  Window   win;
+
+#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+  XdbeBackBuffer back_buf;
+#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
+  Pixmap   pix_buf;
+
+  GC       copy_gc;
+#ifdef USE_XIMAGE
+  XImage  *ximage;
+#endif /* USE_XIMAGE */
+
+#ifdef HAVE_XSHM_EXTENSION
+  Bool use_shm;
+  XShmSegmentInfo shm_info;
+#endif /* HAVE_XSHM_EXTENSION */
+
+  /*
+   * Resources
+   */
+  int count;
+  int grid_size;
+  int colors;
+  int speed;
+  int delay;
+  int shift;
+  int radius;
+
+  /*
+   * Drawing-related entries
+   */
+  int w;
+  int h;
+  Colormap cmap;
+  XColor* pal;
+  GC* gcs;
+
+  /*
+   * lookup tables
+   */
+  int* wave_height;
+    
+  /*
+   * Interference sources
+   */
+  struct inter_source* source;
+};
+
+#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+# define TARGET(c) ((c)->back_buf ? (c)->back_buf : \
+                    (c)->pix_buf ? (c)->pix_buf : (c)->win)
+#else  /* HAVE_DOUBLE_BUFFER_EXTENSION */
+# define TARGET(c) ((c)->pix_buf ? (c)->pix_buf : (c)->win)
+#endif /* !HAVE_DOUBLE_BUFFER_EXTENSION */
+
+void inter_init(Display* dpy, Window win, struct inter_context* c) 
+{
+  XWindowAttributes xgwa;
+  double H[3], S[3], V[3];
+  int i;
+  int mono;
+  int gray;
+  XGCValues val;
+  unsigned long valmask = 0;
+  Bool dbuf = get_boolean_resource ("doubleBuffer", "Boolean");
+
+  memset (c, 0, sizeof(*c));
+
+  c->dpy = dpy;
+  c->win = win;
+
+  XGetWindowAttributes(c->dpy, c->win, &xgwa);
+  c->w = xgwa.width;
+  c->h = xgwa.height;
+  c->cmap = xgwa.colormap;
+
+#ifdef HAVE_XSHM_EXTENSION
+  c->use_shm = get_boolean_resource("useSHM", "Boolean");
+#endif /*  HAVE_XSHM_EXTENSION */
+
+  if (dbuf)
+    {
+#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+      c->back_buf = xdbe_get_backbuffer (c->dpy, c->win, XdbeUndefined);
+#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
+
+#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+      if (!c->back_buf)
+#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
+        c->pix_buf = XCreatePixmap (dpy, win, xgwa.width, xgwa.height,
+                                    xgwa.depth);
+    }
+
+  val.function = GXcopy;
+  c->copy_gc = XCreateGC(c->dpy, TARGET(c), GCFunction, &val);
+
+  c->count = get_integer_resource("count", "Integer");
+  if(c->count < 1)
+    c->count = 1;
+  c->grid_size = get_integer_resource("gridsize", "Integer");
+  if(c->grid_size < 1)
+    c->grid_size = 1;
+  mono = get_boolean_resource("mono", "Boolean");
+  if(!mono) {
+    c->colors = get_integer_resource("ncolors", "Integer");
+    if(c->colors < 2)
+      c->colors = 2;
+  }
+  c->speed = get_integer_resource("speed", "Integer");
+  c->shift = get_float_resource("color-shift", "Float");
+  while(c->shift >= 360.0)
+    c->shift -= 360.0;
+  while(c->shift <= -360.0)
+    c->shift += 360.0;
+  c->radius = get_integer_resource("radius", "Integer");;
+  if(c->radius < 1)
+    c->radius = 1;
+
+#ifdef USE_XIMAGE
+
+  c->ximage = 0;
+
+# ifdef HAVE_XSHM_EXTENSION
+  if (c->use_shm)
+    {
+      c->ximage = create_xshm_image(dpy, xgwa.visual, xgwa.depth,
+                                   ZPixmap, 0, &c->shm_info,
+                                   xgwa.width, c->grid_size);
+      if (!c->ximage)
+       c->use_shm = False;
+    }
+# endif /* HAVE_XSHM_EXTENSION */
+
+  if (!c->ximage)
+    {
+      c->ximage =
+       XCreateImage (dpy, xgwa.visual,
+                     xgwa.depth, ZPixmap, 0, 0, /* depth, fmt, offset, data */
+                     xgwa.width, c->grid_size,  /* width, height */
+                     8, 0);                     /* pad, bpl */
+      c->ximage->data = (unsigned char *)
+       calloc(c->ximage->height, c->ximage->bytes_per_line);
+    }
+#endif /* USE_XIMAGE */
+
+  if(!mono) {
+    c->pal = calloc(c->colors, sizeof(XColor));
+
+    srand48(time(NULL));
+
+    gray = get_boolean_resource("gray", "Boolean");
+    if(!gray) {
+      H[0] = frand(360.0); 
+      H[1] = H[0] + c->shift < 360.0 ? H[0]+c->shift : H[0] + c->shift-360.0; 
+      H[2] = H[1] + c->shift < 360.0 ? H[1]+c->shift : H[1] + c->shift-360.0; 
+      S[0] = S[1] = S[2] = 1.0;
+      V[0] = V[1] = V[2] = 1.0;
+    } else {
+      H[0] = H[1] = H[2] = 0.0;
+      S[0] = S[1] = S[2] = 0.0;
+      V[0] = 1.0; V[1] = 0.5; V[2] = 0.0;
+    }
+
+    make_color_loop(c->dpy, c->cmap, 
+                   H[0], S[0], V[0], 
+                   H[1], S[1], V[1], 
+                   H[2], S[2], V[2], 
+                   c->pal, &(c->colors), 
+                   True, False);
+    if(c->colors < 2) { /* color allocation failure */
+      mono = 1;
+      free(c->pal);
+    }
+  }
+
+  if(mono) { /* DON'T else this with the previous if! */
+    c->colors = 2;
+    c->pal = calloc(2, sizeof(XColor));
+    c->pal[0].pixel = BlackPixel(c->dpy, DefaultScreen(c->dpy));
+    c->pal[1].pixel = WhitePixel(c->dpy, DefaultScreen(c->dpy));
+  }    
+
+  valmask = GCForeground;
+  c->gcs = calloc(c->colors, sizeof(GC));
+  for(i = 0; i < c->colors; i++) {
+    val.foreground = c->pal[i].pixel;    
+    c->gcs[i] = XCreateGC(c->dpy, TARGET(c), valmask, &val);
+  }
+
+  c->wave_height = calloc(c->radius, sizeof(int));
+  for(i = 0; i < c->radius; i++) {
+    float max = 
+      ((float)c->colors) * 
+      ((float)c->radius - (float)i) /
+      ((float)c->radius);
+    c->wave_height[i] = 
+      (int)
+      ((max + max*cos((double)i/50.0)) / 2.0);
+  }
+
+  c->source = calloc(c->count, sizeof(struct inter_source));
+  for(i = 0; i < c->count; i++) {
+    c->source[i].x_theta = frand(2.0)*3.14159;
+    c->source[i].y_theta = frand(2.0)*3.14159;
+  }
+
+}
+
+#define source_x(c, i) \
+  (c->w/2 + ((int)(cos(c->source[i].x_theta)*((float)c->w/2.0))))
+#define source_y(c, i) \
+  (c->h/2 + ((int)(cos(c->source[i].y_theta)*((float)c->h/2.0))))
+
+/*
+ * this is rather suboptimal. the sqrt() doesn't seem to be a big
+ * performance hit, but all those separate XFillRectangle()'s are.
+ * hell, it's just a quick hack anyway -- if someone wishes to tune
+ * it, go ahead! 
+ */
+
+void do_inter(struct inter_context* c) 
+{
+  int i, j, k;
+  int result;
+  int dist;
+  int g;
+
+  int dx, dy;
+
+  for(i = 0; i < c->count; i++) {
+    c->source[i].x_theta += (c->speed/1000.0);
+    if(c->source[i].x_theta > 2.0*3.14159)
+      c->source[i].x_theta -= 2.0*3.14159;
+    c->source[i].y_theta += (c->speed/1000.0);
+    if(c->source[i].y_theta > 2.0*3.14159)
+      c->source[i].y_theta -= 2.0*3.14159;
+    c->source[i].x = source_x(c, i);
+    c->source[i].y = source_y(c, i);
+  }
+
+  g = c->grid_size;
+
+  for(j = 0; j < c->h/g; j++) {
+    for(i = 0; i < c->w/g; i++) {
+      result = 0;
+      for(k = 0; k < c->count; k++) {
+       dx = i*g + g/2 - c->source[k].x;
+       dy = j*g + g/2 - c->source[k].y;
+       dist = sqrt(dx*dx + dy*dy); /* what's the performance penalty here? */
+       result += (dist > c->radius ? 0 : c->wave_height[dist]);
+      }
+      result %= c->colors;
+
+#ifdef USE_XIMAGE
+      /* Fill in these `gridsize' horizontal bits in the scanline */
+      for(k = 0; k < g; k++)
+       XPutPixel(c->ximage, (g*i)+k, 0, c->pal[result].pixel);
+
+#else  /* !USE_XIMAGE */
+      XFillRectangle(c->dpy, TARGET(c), c->gcs[result], g*i, g*j, g, g); 
+#endif /* !USE_XIMAGE */
+    }
+
+#ifdef USE_XIMAGE
+
+    /* Only the first scanline of the image has been filled in; clone that
+       scanline to the rest of the `gridsize' lines in the ximage */
+    for(k = 0; k < (g-1); k++)
+      memcpy(c->ximage->data + (c->ximage->bytes_per_line * (k + 1)),
+            c->ximage->data + (c->ximage->bytes_per_line * k),
+            c->ximage->bytes_per_line);
+
+    /* Move the bits for this horizontal stripe to the server. */
+# ifdef HAVE_XSHM_EXTENSION
+    if (c->use_shm)
+      XShmPutImage(c->dpy, TARGET(c), c->copy_gc, c->ximage,
+                  0, 0, 0, g*j, c->ximage->width, c->ximage->height,
+                  False);
+    else
+# endif /*  HAVE_XSHM_EXTENSION */
+      XPutImage(c->dpy, TARGET(c), c->copy_gc, c->ximage,
+               0, 0, 0, g*j, c->ximage->width, c->ximage->height);
+
+#endif /* USE_XIMAGE */
+  }
+
+#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+  if (c->back_buf)
+    {
+      XdbeSwapInfo info[1];
+      info[0].swap_window = c->win;
+      info[0].swap_action = XdbeUndefined;
+      XdbeSwapBuffers(c->dpy, info, 1);
+    }
+  else
+#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
+    if (c->pix_buf)
+      {
+        XCopyArea (c->dpy, c->pix_buf, c->win, c->copy_gc,
+                   0, 0, c->w, c->h, 0, 0);
+      }
+
+  XSync(c->dpy, False);
+}
+
+void screenhack(Display *dpy, Window win) 
+{
+  struct inter_context c;
+  int delay;
+
+  delay = get_integer_resource("delay", "Integer");
+
+  inter_init(dpy, win, &c);
+  while(1) {
+    do_inter(&c); 
+    screenhack_handle_events (dpy);
+    if(delay) usleep(delay);
+  }
+}
diff --git a/hacks/jigsaw.c b/hacks/jigsaw.c
new file mode 100644 (file)
index 0000000..246c9da
--- /dev/null
@@ -0,0 +1,581 @@
+/* xscreensaver, Copyright (c) 1997, 1998 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software 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.  No representations are made about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or 
+ * implied warranty.
+ */
+
+/*
+  TODO:
+
+    =  Rather than just flickering the pieces before swapping them,
+       show them lifting up and moving to their new positions.
+       The path on which they move shouldn't be a straight line;
+       try to avoid having them cross each other by moving them in
+       oppositely-positioned arcs.
+
+    =  Rotate the pieces as well, so that we can swap the corner
+       and edge pieces with each other.
+
+    =  The shapes of the piece bitmaps still aren't quite right.
+       They should line up with no overlap.  They don't...
+    
+    =  Have it drop all pieces to the "floor" then pick them up to
+       reassemble the picture.
+
+    =  As a joke, maybe sometimes have one piece that doesn't fit?
+       Or lose a piece?
+ */
+
+#include "screenhack.h"
+
+#define DEBUG
+
+#include "images/jigsaw/jigsaw_a_h.xbm"
+#include "images/jigsaw/jigsaw_a_n_h.xbm"
+#include "images/jigsaw/jigsaw_a_ne_h.xbm"
+#include "images/jigsaw/jigsaw_a_e_h.xbm"
+#include "images/jigsaw/jigsaw_a_se_h.xbm"
+#include "images/jigsaw/jigsaw_a_s_h.xbm"
+#include "images/jigsaw/jigsaw_a_sw_h.xbm"
+#include "images/jigsaw/jigsaw_a_w_h.xbm"
+#include "images/jigsaw/jigsaw_a_nw_h.xbm"
+
+#include "images/jigsaw/jigsaw_b_h.xbm"
+#include "images/jigsaw/jigsaw_b_n_h.xbm"
+#include "images/jigsaw/jigsaw_b_ne_h.xbm"
+#include "images/jigsaw/jigsaw_b_e_h.xbm"
+#include "images/jigsaw/jigsaw_b_se_h.xbm"
+#include "images/jigsaw/jigsaw_b_s_h.xbm"
+#include "images/jigsaw/jigsaw_b_sw_h.xbm"
+#include "images/jigsaw/jigsaw_b_w_h.xbm"
+#include "images/jigsaw/jigsaw_b_nw_h.xbm"
+
+#include "images/jigsaw/jigsaw_a_f.xbm"
+#include "images/jigsaw/jigsaw_a_n_f.xbm"
+#include "images/jigsaw/jigsaw_a_ne_f.xbm"
+#include "images/jigsaw/jigsaw_a_e_f.xbm"
+#include "images/jigsaw/jigsaw_a_se_f.xbm"
+#include "images/jigsaw/jigsaw_a_s_f.xbm"
+#include "images/jigsaw/jigsaw_a_sw_f.xbm"
+#include "images/jigsaw/jigsaw_a_w_f.xbm"
+#include "images/jigsaw/jigsaw_a_nw_f.xbm"
+
+#include "images/jigsaw/jigsaw_b_f.xbm"
+#include "images/jigsaw/jigsaw_b_n_f.xbm"
+#include "images/jigsaw/jigsaw_b_ne_f.xbm"
+#include "images/jigsaw/jigsaw_b_e_f.xbm"
+#include "images/jigsaw/jigsaw_b_se_f.xbm"
+#include "images/jigsaw/jigsaw_b_s_f.xbm"
+#include "images/jigsaw/jigsaw_b_sw_f.xbm"
+#include "images/jigsaw/jigsaw_b_w_f.xbm"
+#include "images/jigsaw/jigsaw_b_nw_f.xbm"
+
+#define GRID_WIDTH  66
+#define GRID_HEIGHT 66
+
+#define CENTER   0
+#define NORTH    1
+#define NORTHEAST 2
+#define EAST     3
+#define SOUTHEAST 4
+#define SOUTH    5
+#define SOUTHWEST 6
+#define WEST     7
+#define NORTHWEST 8
+
+struct piece {
+  int width, height;
+  int x, y;
+  Pixmap pixmap;
+};
+
+struct set {
+  struct piece pieces[9];
+};
+
+#define PIECE_A_HOLLOW 0
+#define PIECE_A_FILLED 1
+#define PIECE_B_HOLLOW 2
+#define PIECE_B_FILLED 3
+
+static struct set all_pieces[4];
+
+static void
+init_images(Display *dpy, Window window)
+{
+# define LOAD_PIECE(PIECE,NAME)                                        \
+    PIECE.x = jigsaw_##NAME##_x_hot;                           \
+    PIECE.y = jigsaw_##NAME##_y_hot;                           \
+    PIECE.pixmap =                                             \
+    XCreatePixmapFromBitmapData(dpy, window,                   \
+                               (char *) jigsaw_##NAME##_bits,  \
+                               jigsaw_##NAME##_width,          \
+                               jigsaw_##NAME##_height,         \
+                               1, 0, 1)
+
+# define LOAD_PIECES(SET,PREFIX,SUFFIX)                                \
+    LOAD_PIECE(SET.pieces[CENTER],    PREFIX##_##SUFFIX);      \
+    LOAD_PIECE(SET.pieces[NORTH],     PREFIX##_n_##SUFFIX);    \
+    LOAD_PIECE(SET.pieces[NORTHEAST], PREFIX##_ne_##SUFFIX);   \
+    LOAD_PIECE(SET.pieces[EAST],      PREFIX##_e_##SUFFIX);    \
+    LOAD_PIECE(SET.pieces[SOUTHEAST], PREFIX##_se_##SUFFIX);   \
+    LOAD_PIECE(SET.pieces[SOUTH],     PREFIX##_s_##SUFFIX);    \
+    LOAD_PIECE(SET.pieces[SOUTHWEST], PREFIX##_sw_##SUFFIX);   \
+    LOAD_PIECE(SET.pieces[WEST],      PREFIX##_w_##SUFFIX);    \
+    LOAD_PIECE(SET.pieces[NORTHWEST], PREFIX##_nw_##SUFFIX)
+
+  LOAD_PIECES(all_pieces[PIECE_A_HOLLOW],a,h);
+  LOAD_PIECES(all_pieces[PIECE_A_FILLED],a,f);
+  LOAD_PIECES(all_pieces[PIECE_B_HOLLOW],b,h);
+  LOAD_PIECES(all_pieces[PIECE_B_FILLED],b,f);
+
+# undef LOAD_PIECE
+# undef LOAD_PIECES
+}
+
+static Pixmap
+read_screen (Display *dpy, Window window, int *widthP, int *heightP)
+{
+  Pixmap p;
+  XWindowAttributes xgwa;
+  XGCValues gcv;
+  GC gc;
+  XGetWindowAttributes (dpy, window, &xgwa);
+  *widthP = xgwa.width;
+  *heightP = xgwa.height;
+
+  XClearWindow(dpy, window);
+  grab_screen_image(xgwa.screen, window);
+  p = XCreatePixmap(dpy, window, *widthP, *heightP, xgwa.depth);
+  gcv.function = GXcopy;
+  gc = XCreateGC (dpy, window, GCFunction, &gcv);
+  XCopyArea (dpy, window, p, gc, 0, 0, *widthP, *heightP, 0, 0);
+
+  XFreeGC (dpy, gc);
+
+  return p;
+}
+
+
+static int width, height;
+static int x_border, y_border;
+static Pixmap source;
+static GC gc;
+static Bool tweak;
+static int fg, bg;
+static XPoint *state = 0;
+
+static void
+jigsaw_init(Display *dpy, Window window)
+{
+  XWindowAttributes xgwa;
+  int x, y;
+  XGCValues gcv;
+  Colormap cmap;
+  int source_w, source_h;
+
+  tweak = random()&1;
+
+  source = read_screen (dpy, window, &source_w, &source_h);
+
+  XGetWindowAttributes (dpy, window, &xgwa);
+  cmap = xgwa.colormap;
+  width  = xgwa.width  / GRID_WIDTH;
+  height = xgwa.height / GRID_HEIGHT;
+  x_border = (xgwa.width  - (width  * GRID_WIDTH)) / 2;
+  y_border = (xgwa.height - (height * GRID_WIDTH)) / 2;
+
+  if (!state)
+    state = (XPoint *) malloc(width * height * sizeof(XPoint));
+  gc = XCreateGC (dpy, window, 0, &gcv);
+
+  {
+    XColor fgc, bgc;
+    char *fgs = get_string_resource("foreground", "Foreground");
+    char *bgs = get_string_resource("background", "Background");
+    Bool fg_ok, bg_ok;
+    if (!XParseColor (dpy, cmap, fgs, &fgc))
+      XParseColor (dpy, cmap, "gray", &fgc);
+    if (!XParseColor (dpy, cmap, bgs, &bgc))
+      XParseColor (dpy, cmap, "black", &bgc);
+
+    fg_ok = XAllocColor (dpy, cmap, &fgc);
+    bg_ok = XAllocColor (dpy, cmap, &bgc);
+
+    /* If we weren't able to allocate the two colors we want from the
+       colormap (which is likely if the screen has been grabbed on an
+       8-bit SGI visual -- don't ask) then just go through the map
+       and find the closest color to the ones we wanted, and use those
+       pixels without actually allocating them.
+     */
+    if (fg_ok)
+      fg = fgc.pixel;
+    else
+      fg = 0;
+
+    if (bg_ok)
+      bg = bgc.pixel;
+    else
+      bg = 1;
+
+    if (!fg_ok || bg_ok)
+      {
+       int i;
+       unsigned long fgd = ~0;
+       unsigned long bgd = ~0;
+       int max = visual_cells (xgwa.screen, xgwa.visual);
+       XColor *all = (XColor *) calloc(sizeof (*all), max);
+       for (i = 0; i < max; i++)
+         {
+           all[i].flags = DoRed|DoGreen|DoBlue;
+           all[i].pixel = i;
+         }
+       XQueryColors (dpy, cmap, all, max);
+       for(i = 0; i < max; i++)
+         {
+           long rd, gd, bd;
+           unsigned long d;
+           if (!fg_ok)
+             {
+               rd = (all[i].red   >> 8) - (fgc.red   >> 8);
+               gd = (all[i].green >> 8) - (fgc.green >> 8);
+               bd = (all[i].blue  >> 8) - (fgc.blue  >> 8);
+               if (rd < 0) rd = -rd;
+               if (gd < 0) gd = -gd;
+               if (bd < 0) bd = -bd;
+               d = (rd << 1) + (gd << 2) + bd;
+               if (d < fgd)
+                 {
+                   fgd = d;
+                   fg = all[i].pixel;
+                   if (d == 0)
+                     fg_ok = True;
+                 }
+             }
+
+           if (!bg_ok)
+             {
+               rd = (all[i].red   >> 8) - (bgc.red   >> 8);
+               gd = (all[i].green >> 8) - (bgc.green >> 8);
+               bd = (all[i].blue  >> 8) - (bgc.blue  >> 8);
+               if (rd < 0) rd = -rd;
+               if (gd < 0) gd = -gd;
+               if (bd < 0) bd = -bd;
+               d = (rd << 1) + (gd << 2) + bd;
+               if (d < bgd)
+                 {
+                   bgd = d;
+                   bg = all[i].pixel;
+                   if (d == 0)
+                     bg_ok = True;
+                 }
+             }
+
+           if (fg_ok && bg_ok)
+             break;
+         }
+       XFree(all);
+      }
+  }
+
+  /* Reset the window's background color... */
+  XSetWindowBackground (dpy, window, bg);
+  XClearWindow(dpy, window);
+
+  for (y = 0; y < height; y++)
+    for (x = 0; x < width; x++)
+      {
+       state[y * width + x].x = x;
+       state[y * width + x].y = y;
+      }
+}
+
+
+static void
+get_piece(int x, int y, struct piece **hollow, struct piece **filled)
+{
+  int p;
+  Bool which = (x & 1) == (y & 1);
+
+  if      (x == 0       && y == 0)       p = NORTHWEST;
+  else if (x == width-1 && y == 0)       p = NORTHEAST;
+  else if (x == width-1 && y == height-1) p = SOUTHEAST;
+  else if (x == 0       && y == height-1) p = SOUTHWEST;
+  else if (y == 0)                       p = NORTH;
+  else if (x == width-1)                 p = EAST;
+  else if (y == height-1)                p = SOUTH;
+  else if (x == 0)                       p = WEST;
+  else                                   p = CENTER;
+
+  if (tweak) which = !which;
+  if (hollow)
+    *hollow = (which
+              ? &all_pieces[PIECE_A_HOLLOW].pieces[p]
+              : &all_pieces[PIECE_B_HOLLOW].pieces[p]);
+  if (filled)
+    *filled = (which
+              ? &all_pieces[PIECE_A_FILLED].pieces[p]
+              : &all_pieces[PIECE_B_FILLED].pieces[p]);
+}
+
+
+static void
+draw_piece(Display *dpy, Window window, int x, int y, int clear_p)
+{
+  struct piece *hollow, *filled;
+  int from_x = state[y * width + x].x;
+  int from_y = state[y * width + x].y;
+
+  get_piece(x, y, &hollow, &filled);
+         
+  XSetClipMask(dpy, gc, filled->pixmap);
+  XSetClipOrigin(dpy, gc,
+                x_border + (x * GRID_WIDTH) - filled->x - 1,
+                y_border + (y * GRID_WIDTH) - filled->y - 1);
+
+  if (clear_p)
+    {
+      XSetForeground(dpy, gc, bg);
+      XFillRectangle(dpy, window, gc,
+                    x_border + (x * GRID_WIDTH)  - GRID_WIDTH/2,
+                    y_border + (y * GRID_HEIGHT) - GRID_HEIGHT/2,
+                    GRID_WIDTH*2, GRID_HEIGHT*2);
+    }
+  else
+    XCopyArea(dpy, source, window, gc,
+             x_border + (from_x * GRID_WIDTH)  - GRID_WIDTH/2,
+             y_border + (from_y * GRID_HEIGHT) - GRID_HEIGHT/2,
+             GRID_WIDTH*2, GRID_HEIGHT*2,
+             x_border + (x * GRID_WIDTH)  - GRID_WIDTH/2,
+             y_border + (y * GRID_HEIGHT) - GRID_HEIGHT/2);
+
+  if (clear_p > 1)
+    return;
+
+  XSetForeground(dpy, gc, fg);
+  XSetClipMask(dpy, gc, hollow->pixmap);
+  XSetClipOrigin(dpy, gc,
+                x_border + (x * GRID_WIDTH) - hollow->x - 1,
+                y_border + (y * GRID_WIDTH) - hollow->y - 1);
+  XFillRectangle(dpy, window, gc,
+                x_border + (x * GRID_WIDTH)  - GRID_WIDTH/2,
+                y_border + (y * GRID_HEIGHT) - GRID_HEIGHT/2,
+                GRID_WIDTH*2, GRID_HEIGHT*2);
+
+  if (clear_p)
+    {
+      /* If the pieces lined up right, we could do this by just not drawing
+        the outline -- but that doesn't look right, since it eats the outlines
+        of the adjascent pieces.  So draw the outline, then chop off the outer
+        edge if this is a border piece.
+       */
+      XSetForeground(dpy, gc, bg);
+      if (x == 0)
+       XFillRectangle(dpy, window, gc,
+                      x_border - 2,
+                      y_border + (y * GRID_HEIGHT),
+                      3, GRID_HEIGHT);
+      else if (x == width-1)
+       XFillRectangle(dpy, window, gc,
+                      x_border + ((x+1) * GRID_WIDTH) - 2,
+                      y_border + (y * GRID_HEIGHT),
+                      3, GRID_HEIGHT);
+
+      if (y == 0)
+       XFillRectangle(dpy, window, gc,
+                      x_border + (x * GRID_WIDTH),
+                      y_border - 2,
+                      GRID_WIDTH, 3);
+      else if (y == height-1)
+       XFillRectangle(dpy, window, gc,
+                      x_border + (x * GRID_WIDTH),
+                      y_border + ((y+1) * GRID_HEIGHT) - 2,
+                      GRID_WIDTH, 3);
+    }
+}
+
+
+static void
+swap_pieces(Display *dpy, Window window,
+           int src_x, int src_y, int dst_x, int dst_y,
+           Bool draw_p)
+{
+  XPoint swap;
+  int i;
+  if (draw_p)
+    for (i = 0; i < 3; i++)
+      {
+       draw_piece(dpy, window, src_x, src_y, 1);
+       draw_piece(dpy, window, dst_x, dst_y, 1);
+       XSync(dpy, False);
+       usleep(50000);
+       draw_piece(dpy, window, src_x, src_y, 0);
+       draw_piece(dpy, window, dst_x, dst_y, 0);
+       XSync(dpy, False);
+       usleep(50000);
+      }
+
+  swap = state[src_y * width + src_x];
+  state[src_y * width + src_x] = state[dst_y * width + dst_x];
+  state[dst_y * width + dst_x] = swap;
+
+  if (draw_p)
+    {
+      draw_piece(dpy, window, src_x, src_y, 0);
+      draw_piece(dpy, window, dst_x, dst_y, 0);
+      XSync(dpy, False);
+    }
+}
+
+
+static void
+shuffle(Display *dpy, Window window, Bool draw_p)
+{
+  struct piece *p1, *p2;
+  int src_x, src_y, dst_x = -1, dst_y = -1;
+
+ AGAIN:
+  p1 = p2 = 0;
+  src_x = random() % width;
+  src_y = random() % height;
+
+  get_piece(src_x, src_y, &p1, 0);
+
+  /* Pick random coordinates until we find one that has the same kind of
+     piece as the first one we picked.  Note that it's possible for there
+     to be only one piece of a particular shape on the board (this commonly
+     happens with the corner pieces.)
+   */
+  while (p1 != p2)
+    {
+      dst_x = random() % width;
+      dst_y = random() % height;
+      get_piece(dst_x, dst_y, &p2, 0);
+    }
+
+  if (src_x == dst_x && src_y == dst_y)
+    goto AGAIN;
+
+  swap_pieces(dpy, window, src_x, src_y, dst_x, dst_y, draw_p);
+}
+
+
+static void
+shuffle_all(Display *dpy, Window window)
+{
+  int i = (width * height * 10);
+  while (i > 0)
+    {
+      shuffle(dpy, window, False);
+      i--;
+    }
+}
+
+static void
+unshuffle(Display *dpy, Window window)
+{
+  int i;
+  for (i = 0; i < width * height * 4; i++)
+    {
+      int x = random() % width;
+      int y = random() % height;
+      int x2 = state[y * width + x].x;
+      int y2 = state[y * width + x].y;
+      if (x != x2 || y != y2)
+       {
+         swap_pieces(dpy, window, x, y, x2, y2, True);
+         break;
+       }
+    }
+}
+
+static void
+clear_all(Display *dpy, Window window)
+{
+  int n = width * height;
+  while (n > 0)
+    {
+      int x = random() % width;
+      int y = random() % height;
+      XPoint *p = &state[y * width + x];
+      if (p->x == -1)
+       continue;
+      draw_piece(dpy, window, p->x, p->y, 2);
+      XSync(dpy, False);
+      usleep(1000);
+      p->x = p->y = -1;
+      n--;
+    }
+}
+
+static Bool
+done(void)
+{
+  int x, y;
+  for (y = 0; y < height; y++)
+    for (x = 0; x < width; x++)
+      {
+       int x2 = state[y * width + x].x;
+       int y2 = state[y * width + x].y;
+       if (x != x2 || y != y2)
+         return False;
+      }
+  return True;
+}
+
+
+\f
+char *progclass = "Jigsaw";
+
+char *defaults [] = {
+  ".background:                Black",
+  ".foreground:                Gray40",
+  "*delay:             70000",
+  "*delay2:            5",
+  0
+};
+
+XrmOptionDescRec options [] = {
+  { "-delay",          ".delay",               XrmoptionSepArg, 0 },
+  { "-delay2",         ".delay2",              XrmoptionSepArg, 0 },
+  { 0, 0, 0, 0 }
+};
+
+void
+screenhack (Display *dpy, Window window)
+{
+  int delay = get_integer_resource("delay", "Integer");
+  int delay2 = get_integer_resource("delay2", "Integer");
+
+  init_images(dpy, window);
+
+  while (1)
+    {
+      int x, y;
+      jigsaw_init (dpy, window);
+      shuffle_all(dpy, window);
+
+      for (y = 0; y < height; y++)
+       for (x = 0; x < width; x++)
+         draw_piece(dpy, window, x, y, 0);
+
+      while (!done())
+       {
+         unshuffle(dpy, window);
+         XSync (dpy, False);
+          screenhack_handle_events (dpy);
+         if (delay) usleep (delay);
+       }
+
+      screenhack_handle_events (dpy);
+      if (delay2)
+       usleep (delay2 * 1000000);
+
+      clear_all(dpy, window);
+    }
+}
diff --git a/hacks/jigsaw.man b/hacks/jigsaw.man
new file mode 100644 (file)
index 0000000..ae9f7a0
--- /dev/null
@@ -0,0 +1,74 @@
+.TH XScreenSaver 1 "25-Nov-97" "X Version 11"
+.SH NAME
+jigsaw - permute the screen image like a jigsaw puzzle
+.SH SYNOPSIS
+.B jigsaw
+[\-display \fIhost:display.screen\fP] [\-background \fIcolor\fP] [\-delay \fIusecs\fP] [\-window] [\-root] [\-install] [\-visual \fIvisual\fP]
+.SH DESCRIPTION
+The \fIjigsaw\fP program takes an image of the screen, carves it up into
+a jigsaw puzzle, shuffles it, and then solves it.
+.SH OPTIONS
+.I jigsaw
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window.  This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use.  Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-delay \fImicroseconds\fP
+How long to wait between shuffling pieces; default 700000, or 0.7 seconds.
+.SH RESOURCES
+On some systems (currently, only SGIs), this program can, instead of grabbing
+a desktop image, grab a frame of video from an external camera and manipulate
+that instead.  The following resources control that.
+.PP
+.TP 8
+.B grabVideoProbability \fR(Float)\fP
+What portion of the time to grab video rather than a screen image, 
+between 0.0 and 1.0.  Defaults to 0.5, or half the time.
+.TP 8
+.B videoDevice \fR(Integer)\fP
+The number of the default video input device to check first.  If unspecified, 
+the default camera (from videopanel(1)) will be checked first.  After that, all
+other available video input devices will be checked in order.  
+
+The first one which produces a non-black image will be used.  If all images
+are black, the others will be re-checked a few times before giving up and
+falling back to simply grabbing a desktop image (but note that this takes a
+few seconds, so if you don't actually have any video sources hooked up, you
+should consider turning off video grabbing by setting
+\fBgrabVideoProbability\fP to 0.0.)
+.TP 8
+.B videoGain \fR(Float)\fP
+The amount by which to brighten the grabbed image.  This defaults to 2.2.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 1997 by Jamie Zawinski.  Permission to use, copy, modify, 
+distribute, and sell this software 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.  No representations are made about the 
+suitability of this software for any purpose.  It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Jamie Zawinski <jwz@jwz.org>, 25-Nov-97.
diff --git a/hacks/julia.c b/hacks/julia.c
new file mode 100644 (file)
index 0000000..29cbb55
--- /dev/null
@@ -0,0 +1,420 @@
+/* -*- Mode: C; tab-width: 4 -*-
+ * julia --- continuously varying Julia set.
+ */
+#if !defined( lint ) && !defined( SABER )
+static const char sccsid[] = "@(#)julia.c      4.03 97/04/10 xlockmore";
+#endif
+
+/* Copyright (c) 1995 Sean McCullough <bankshot@mailhost.nmt.edu>.
+ *
+ * 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.
+ *
+ * This file is provided AS IS with no warranties of any kind.  The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof.  In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * Revision History:
+ * 28-May-97: jwz@jwz.org: added interactive frobbing with the mouse.
+ * 10-May-97: jwz@jwz.org: turned into a standalone program.
+ * 02-Dec-95: snagged boilerplate from hop.c
+ *           used ifs {w0 = sqrt(x-c), w1 = -sqrt(x-c)} with random iteration 
+ *           to plot the julia set, and sinusoidially varied parameter for set 
+ *          and plotted parameter with a circle.
+ */
+
+/*-
+ * One thing to note is that batchcount is the *depth* of the search tree,
+ * so the number of points computed is 2^batchcount - 1.  I use 8 or 9
+ * on a dx266 and it looks okay.  The sinusoidal variation of the parameter
+ * might not be as interesting as it could, but it still gives an idea of
+ * the effect of the parameter.
+ */
+
+#ifdef STANDALONE
+# define PROGCLASS                                     "Julia"
+# define HACK_INIT                                     init_julia
+# define HACK_DRAW                                     draw_julia
+# define julia_opts                                    xlockmore_opts
+# define DEFAULTS      "*count:                1000  \n"                       \
+                                       "*cycles:               20    \n"                       \
+                                       "*delay:                10000 \n"                       \
+                                       "*ncolors:              200   \n"
+# define UNIFORM_COLORS
+# include "xlockmore.h"                                /* in xscreensaver distribution */
+#else  /* !STANDALONE */
+# include "xlock.h"                                    /* in xlockmore distribution */
+#endif /* !STANDALONE */
+
+
+static Bool track_p;
+
+#define DEF_MOUSE "False"
+
+static XrmOptionDescRec opts[] =
+{
+       {"-mouse", ".julia.mouse", XrmoptionNoArg, (caddr_t) "on"},
+       {"+mouse", ".julia.mouse", XrmoptionNoArg, (caddr_t) "off"},
+};
+static argtype vars[] =
+{
+       {(caddr_t *) & track_p, "mouse", "Mouse", DEF_MOUSE, t_Bool},
+};
+static OptionStruct desc[] =
+{
+       {"-/+mouse", "turn on/off mouse tracking"},
+};
+
+ModeSpecOpt julia_opts = { 2, opts, 1, vars, desc };
+
+
+#define numpoints ((0x2<<jp->depth)-1)
+
+typedef struct {
+       int         centerx;
+       int         centery;    /* center of the screen */
+       double      cr;
+       double      ci;         /* julia params */
+       int         depth;
+       int         inc;
+       int         circsize;
+       int         erase;
+       int         pix;
+       long        itree;
+       int         buffer;
+       int         nbuffers;
+       int         redrawing, redrawpos;
+       Pixmap      pixmap;
+       Cursor      cursor;
+       GC          stippledGC;
+       XPoint    **pointBuffer;        /* pointer for XDrawPoints */
+
+} juliastruct;
+
+static juliastruct *julias = NULL;
+
+/* How many segments to draw per cycle when redrawing */
+#define REDRAWSTEP 3
+
+static void
+apply(juliastruct * jp, register double xr, register double xi, int d)
+{
+       double      theta, r;
+
+       jp->pointBuffer[jp->buffer][jp->itree].x =
+               (int) (0.5 * xr * jp->centerx + jp->centerx);
+       jp->pointBuffer[jp->buffer][jp->itree].y =
+               (int) (0.5 * xi * jp->centery + jp->centery);
+       jp->itree++;
+
+       if (d > 0) {
+               xi -= jp->ci;
+               xr -= jp->cr;
+
+/* Avoid atan2: DOMAIN error message */
+               if (xi == 0.0 && xr == 0.0)
+                       theta = 0.0;
+               else
+                       theta = atan2(xi, xr) / 2.0;
+
+               /*r = pow(xi * xi + xr * xr, 0.25); */
+               r = sqrt(sqrt(xi * xi + xr * xr));      /* 3 times faster */
+
+               xr = r * cos(theta);
+               xi = r * sin(theta);
+
+               d--;
+               apply(jp, xr, xi, d);
+               apply(jp, -xr, -xi, d);
+       }
+}
+
+static void
+incr(ModeInfo * mi, juliastruct * jp)
+{
+       int cx, cy;
+
+       if (track_p)
+         {
+               Window r, c;
+               int rx, ry;
+               unsigned int m;
+               XQueryPointer(MI_DISPLAY(mi), MI_WINDOW(mi),
+                                         &r, &c, &rx, &ry, &cx, &cy, &m);
+               if (cx <= 0 || cy <= 0 ||
+                       cx >= MI_WIN_WIDTH(mi) || cy >= MI_WIN_HEIGHT(mi))
+                 goto NOTRACK;
+         }
+
+       if (track_p)
+         {
+               jp->cr = ((double) (cx + 2 - jp->centerx)) * 2 / jp->centerx;
+               jp->ci = ((double) (cy + 2 - jp->centery)) * 2 / jp->centery;
+         }
+       else
+         {
+         NOTRACK:
+               jp->cr = 1.5 * (sin(M_PI * (jp->inc / 300.0)) *
+                                               sin(jp->inc * M_PI / 200.0));
+               jp->ci = 1.5 * (cos(M_PI * (jp->inc / 300.0)) *
+                                               cos(jp->inc * M_PI / 200.0));
+
+               jp->cr += 0.5 * cos(M_PI * jp->inc / 400.0);
+               jp->ci += 0.5 * sin(M_PI * jp->inc / 400.0);
+         }
+}
+
+void
+init_julia(ModeInfo * mi)
+{
+       Display    *display = MI_DISPLAY(mi);
+       Window      window = MI_WINDOW(mi);
+       juliastruct *jp;
+       XGCValues   gcv;
+       int         i;
+
+       if (julias == NULL) {
+               if ((julias = (juliastruct *) calloc(MI_NUM_SCREENS(mi),
+                                             sizeof (juliastruct))) == NULL)
+                       return;
+       }
+       jp = &julias[MI_SCREEN(mi)];
+
+       jp->centerx = MI_WIN_WIDTH(mi) / 2;
+       jp->centery = MI_WIN_HEIGHT(mi) / 2;
+
+       jp->depth = MI_BATCHCOUNT(mi);
+       if (jp->depth > 10)
+               jp->depth = 10;
+
+
+       if (track_p && !jp->cursor)
+         {
+               Pixmap bit;
+               XColor black;
+               black.red = black.green = black.blue = 0;
+               black.flags = DoRed|DoGreen|DoBlue;
+               bit = XCreatePixmapFromBitmapData (display, window, "\000", 1, 1,
+                                                                                  MI_WIN_BLACK_PIXEL(mi),
+                                                                                  MI_WIN_BLACK_PIXEL(mi), 1);
+               jp->cursor = XCreatePixmapCursor (display, bit, bit, &black, &black,
+                                                                                 0, 0);
+               XFreePixmap (display, bit);
+         }
+
+       if (jp->pixmap != None &&
+           jp->circsize != (MIN(jp->centerx, jp->centery) / 60) * 2 + 1) {
+               XFreePixmap(display, jp->pixmap);
+               jp->pixmap = None;
+       }
+       if (jp->pixmap == None) {
+               GC          fg_gc = None, bg_gc = None;
+
+               jp->circsize = (MIN(jp->centerx, jp->centery) / 96) * 2 + 1;
+               jp->pixmap = XCreatePixmap(display, window, jp->circsize, jp->circsize, 1);
+               gcv.foreground = 1;
+               fg_gc = XCreateGC(display, jp->pixmap, GCForeground, &gcv);
+               gcv.foreground = 0;
+               bg_gc = XCreateGC(display, jp->pixmap, GCForeground, &gcv);
+               XFillRectangle(display, jp->pixmap, bg_gc,
+                              0, 0, jp->circsize, jp->circsize);
+               if (jp->circsize < 2)
+                       XDrawPoint(display, jp->pixmap, fg_gc, 0, 0);
+               else
+                       XFillArc(display, jp->pixmap, fg_gc,
+                                0, 0, jp->circsize, jp->circsize, 0, 23040);
+               if (fg_gc != None)
+                       XFreeGC(display, fg_gc);
+               if (bg_gc != None)
+                       XFreeGC(display, bg_gc);
+       }
+
+       if (MI_WIN_IS_INROOT(mi))
+         ;
+       else if (jp->circsize > 0)
+         XDefineCursor (display, window, jp->cursor);
+       else
+         XUndefineCursor (display, window);
+
+       if (!jp->stippledGC) {
+               gcv.foreground = MI_WIN_BLACK_PIXEL(mi);
+               gcv.background = MI_WIN_BLACK_PIXEL(mi);
+               if ((jp->stippledGC = XCreateGC(display, window,
+                                GCForeground | GCBackground, &gcv)) == None)
+                       return;
+       }
+       if (MI_NPIXELS(mi) > 2)
+               jp->pix = NRAND(MI_NPIXELS(mi));
+       jp->inc = ((LRAND() & 1) * 2 - 1) * NRAND(200);
+       jp->nbuffers = (MI_CYCLES(mi) + 1);
+       if (!jp->pointBuffer)
+               jp->pointBuffer = (XPoint **) calloc(jp->nbuffers, sizeof (XPoint *));
+       for (i = 0; i < jp->nbuffers; ++i)
+               if (jp->pointBuffer[i])
+                       (void) memset((char *) jp->pointBuffer[i], 0,
+                                     numpoints * sizeof (XPoint));
+               else
+                       jp->pointBuffer[i] = (XPoint *) calloc(numpoints, sizeof (XPoint));
+       jp->buffer = 0;
+       jp->redrawing = 0;
+       jp->erase = 0;
+       XClearWindow(display, window);
+}
+
+
+/* hack: moved here by jwz. */
+#define ERASE_IMAGE(d,w,g,x,y,xl,yl,xs,ys) \
+if (yl<y) \
+(y<yl+ys)?XFillRectangle(d,w,g,xl,yl,xs,y-yl): \
+XFillRectangle(d,w,g,xl,yl,xs,ys); \
+else if (yl>y) \
+(y>yl-ys)?XFillRectangle(d,w,g,xl,y+ys,xs,yl-y): \
+XFillRectangle(d,w,g,xl,yl,xs,ys); \
+if (xl<x) \
+(x<xl+xs)?XFillRectangle(d,w,g,xl,yl,x-xl,ys): \
+XFillRectangle(d,w,g,xl,yl,xs,ys); \
+else if (xl>x) \
+(x>xl-xs)?XFillRectangle(d,w,g,x+xs,yl,xl-x,ys): \
+XFillRectangle(d,w,g,xl,yl,xs,ys)
+
+
+void
+draw_julia(ModeInfo * mi)
+{
+       Display    *display = MI_DISPLAY(mi);
+       Window      window = MI_WINDOW(mi);
+       GC          gc = MI_GC(mi);
+       juliastruct *jp = &julias[MI_SCREEN(mi)];
+       double      r, theta;
+       register double xr = 0.0, xi = 0.0;
+       int         k = 64, rnd = 0, i, j;
+       XPoint     *xp = jp->pointBuffer[jp->buffer], old_circle, new_circle;
+
+       old_circle.x = (int) (jp->centerx * jp->cr / 2) + jp->centerx - 2;
+       old_circle.y = (int) (jp->centery * jp->ci / 2) + jp->centery - 2;
+       incr(mi, jp);
+       new_circle.x = (int) (jp->centerx * jp->cr / 2) + jp->centerx - 2;
+       new_circle.y = (int) (jp->centery * jp->ci / 2) + jp->centery - 2;
+       XSetForeground(display, gc, MI_WIN_BLACK_PIXEL(mi));
+       ERASE_IMAGE(display, window, gc, new_circle.x, new_circle.y,
+                   old_circle.x, old_circle.y, jp->circsize, jp->circsize);
+       /* draw a circle at the c-parameter so you can see it's effect on the
+          structure of the julia set */
+       XSetTSOrigin(display, jp->stippledGC, new_circle.x, new_circle.y);
+       XSetForeground(display, jp->stippledGC, MI_WIN_WHITE_PIXEL(mi));
+       XSetStipple(display, jp->stippledGC, jp->pixmap);
+       XSetFillStyle(display, jp->stippledGC, FillOpaqueStippled);
+       XFillRectangle(display, window, jp->stippledGC, new_circle.x, new_circle.y,
+                      jp->circsize, jp->circsize);
+       XFlush(display);
+       if (jp->erase == 1) {
+               XDrawPoints(display, window, gc,
+                   jp->pointBuffer[jp->buffer], numpoints, CoordModeOrigin);
+       }
+       jp->inc++;
+       if (MI_NPIXELS(mi) > 2) {
+               XSetForeground(display, gc, MI_PIXEL(mi, jp->pix));
+               if (++jp->pix >= MI_NPIXELS(mi))
+                       jp->pix = 0;
+       } else
+               XSetForeground(display, gc, MI_WIN_WHITE_PIXEL(mi));
+       while (k--) {
+
+               /* save calls to LRAND by using bit shifts over and over on the same
+                  int for 32 iterations, then get a new random int */
+               if (!(k % 32))
+                       rnd = LRAND();
+
+               /* complex sqrt: x^0.5 = radius^0.5*(cos(theta/2) + i*sin(theta/2)) */
+
+               xi -= jp->ci;
+               xr -= jp->cr;
+
+               /* Avoid atan2: DOMAIN error message */
+               if (xi == 0.0 && xr == 0.0)
+                       theta = 0.0;
+               else
+                       theta = atan2(xi, xr) / 2.0;
+
+               /*r = pow(xi * xi + xr * xr, 0.25); */
+               r = sqrt(sqrt(xi * xi + xr * xr));      /* 3 times faster */
+
+               xr = r * cos(theta);
+               xi = r * sin(theta);
+
+               if ((rnd >> (k % 32)) & 0x1) {
+                       xi = -xi;
+                       xr = -xr;
+               }
+               xp->x = jp->centerx + (int) ((jp->centerx >> 1) * xr);
+               xp->y = jp->centery + (int) ((jp->centery >> 1) * xi);
+               xp++;
+       }
+
+       jp->itree = 0;
+       apply(jp, xr, xi, jp->depth);
+
+       XDrawPoints(display, window, gc,
+                   jp->pointBuffer[jp->buffer], numpoints, CoordModeOrigin);
+
+       jp->buffer++;
+       if (jp->buffer > jp->nbuffers - 1) {
+               jp->buffer -= jp->nbuffers;
+               jp->erase = 1;
+       }
+       if (jp->redrawing) {
+               for (i = 0; i < REDRAWSTEP; i++) {
+                       j = (jp->buffer - jp->redrawpos + jp->nbuffers) % jp->nbuffers;
+                       XDrawPoints(display, window, gc,
+                            jp->pointBuffer[j], numpoints, CoordModeOrigin);
+
+                       if (++(jp->redrawpos) >= jp->nbuffers) {
+                               jp->redrawing = 0;
+                               break;
+                       }
+               }
+       }
+}
+
+void
+release_julia(ModeInfo * mi)
+{
+       if (julias != NULL) {
+               int         screen;
+
+               for (screen = 0; screen < MI_NUM_SCREENS(mi); screen++) {
+                       Display    *display = MI_DISPLAY(mi);
+                       juliastruct *jp = &julias[screen];
+                       int         buffer;
+
+                       if (jp->pointBuffer) {
+                               for (buffer = 0; buffer < jp->nbuffers; buffer++)
+                                       if (jp->pointBuffer[buffer])
+                                               (void) free((void *) jp->pointBuffer[buffer]);
+                               (void) free((void *) jp->pointBuffer);
+                       }
+                       if (jp->stippledGC != None)
+                               XFreeGC(display, jp->stippledGC);
+                       if (jp->pixmap != None)
+                               XFreePixmap(display, jp->pixmap);
+                       if (jp->cursor)
+                         XFreeCursor (display, jp->cursor);
+               }
+               (void) free((void *) julias);
+               julias = NULL;
+       }
+}
+
+void
+refresh_julia(ModeInfo * mi)
+{
+       juliastruct *jp = &julias[MI_SCREEN(mi)];
+
+       jp->redrawing = 1;
+       jp->redrawpos = 0;
+}
diff --git a/hacks/julia.man b/hacks/julia.man
new file mode 100644 (file)
index 0000000..1aa6809
--- /dev/null
@@ -0,0 +1,83 @@
+.TH XScreenSaver 1 "28-May-97" "X Version 11"
+.SH NAME
+julia - draws spinning, animating julia-set fractals
+.SH SYNOPSIS
+.B julia
+[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-ncolors \fIinteger\fP] [\-delay \fImicroseconds\fP] [\-cycles \fIinteger\fP] [\-count \fIinteger\fP] [\-mouse] [\-nomouse]
+
+.SH DESCRIPTION
+The \fIjulia\fP program draws spinning, animating julia-set fractals.
+
+It uses ifs {w0 = sqrt(x-c), w1 = -sqrt(x-c)} with random iteration 
+to plot the julia set, and sinusoidially varied parameters for the set,
+and plots parameters with a circle.
+
+One thing to note is that count is the \fIdepth\fP of the search tree,
+so the number of points computed is (2^count)-1.  I use 8 or 9 on a
+dx266 and it looks okay.  The sinusoidal variation of the parameter
+might not be as interesting as it could, but it still gives an idea 
+of the effect of the parameter.
+
+.SH OPTIONS
+.I julia
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window.  This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-mono 
+If on a color display, pretend we're on a monochrome display.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use.  Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-ncolors \fIinteger\fP
+How many colors should be used (if possible).  Default 200.
+The colors used cycle through the hue, making N stops around
+the color wheel.
+.TP 8
+.B \-cycles \fIinteger\fP
+
+.TP 8
+.B \-count \fIinteger\fP
+
+.TP 8
+.B \-mouse
+.TP 8
+.B \-nomouse
+If \fI\-mouse\fP is specified, the control point of the Julia set will
+be derived from the position of the mouse in the window.  When the mouse
+is not in the window, the control point is chosen the normal way.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1),
+.BR xlock (1)
+.SH COPYRIGHT
+Copyright \(co 1995 by Sean McCullough.
+
+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. 
+.SH AUTHOR
+Sean McCullough <bankshot@mailhost.nmt.edu>, 1995.
+
+Ability to run standalone or with \fIxscreensaver\fP added by 
+Jamie Zawinski <jwz@jwz.org>, 10-May-97.
diff --git a/hacks/kaleidescope.c b/hacks/kaleidescope.c
new file mode 100644 (file)
index 0000000..6e66fdd
--- /dev/null
@@ -0,0 +1,454 @@
+/* kaleidescope, Copyright (c) 1997 Ron Tapia <tapia@nmia.com>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software 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.  No representations are made about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or 
+ * implied warranty. 
+ */
+
+/*
+ * The above, for lack of a better copyright statement in easy reach
+ * was just lifted from the xscreensaver source.
+ *
+ * One of the odd things about this hack is that the radial motion of the
+ * segments depends on roundoff error alone. 
+ *
+ * I tried to make the source easy to add other shapes. So far, I've
+ * only messed with elipses and I couldn't do much with them that looked
+ * cool. A nice addition would be to add some sort of spline based shapes.
+ * Maybe rectangles would look nice.
+ *
+ */
+
+
+#include <stdio.h>
+#include <math.h>
+#include <time.h>
+#include <X11/Xlib.h>
+#include "spline.h"
+#include "screenhack.h"
+
+#define NEWX(x,y) ((x*g.costheta) + (y*g.sintheta))
+#define NEWY(x,y) ((y*g.costheta) - (x*g.sintheta))
+
+
+typedef struct {
+  int  xoff, yoff;                    /* offset of origin xmax/2, ymax/2 */
+  int  xmax, ymax;                    /* width, height of window */
+  float costheta, sintheta;           
+  int symmetry;                       
+  int ntrails;          
+  int nsegments;
+  int narcs;
+  int nobjects;
+  int local_rotation;
+  int global_rotation;
+  int spring_constant;
+  Colormap cmap;
+  GC  draw_gc;
+  GC  erase_gc;
+  unsigned int default_fg_pixel;
+  Display *dpy;
+  Window window;
+  unsigned long delay;
+  unsigned short redmin,redrange,greenmin,greenrange,bluemin,bluerange;
+  int color_mode;
+} GLOBAL;
+
+typedef struct Obj OBJECT;
+struct Obj {
+  int type;
+  int time;
+  void (*propogate) (OBJECT *);
+  void (*draw) (OBJECT *);
+  void (*init) (OBJECT *);
+  void *cur;
+};
+
+typedef struct KSEGMENT {
+  struct KSEGMENT *next;
+  XColor color;
+  int drawn;
+  short int x1,y1,x2,y2;  /* these are in the natural coordinate system */
+  XSegment  *xsegments;  /* these are in the X coordinate system */
+} Ksegment;
+
+/* BEGIN global variables */
+
+GLOBAL g;
+OBJECT *objects;
+
+char *progclass = "Kaleidescope";
+char *defaults [] = {
+  ".background:             black",
+  ".foreground:             white",
+  "*color_mode:      nice",
+  "*symmetry:         11",
+  "*ntrails:         100",
+  "*nsegments:          7",
+  "*local_rotation:   -59",
+  "*global_rotation:    1",
+  "*spring_constant:    5",
+  "*delay:          20000",
+  "*redmin:         30000",
+  "*redrange:       20000",
+  "*greenmin:       30000",
+  "*greenrange:     20000",
+  "*bluemin:        30000",
+  "*bluerange:      20000",
+  0
+};
+
+XrmOptionDescRec options [] = {
+  { "-color_mode",       ".color_mode",     XrmoptionSepArg, 0 },
+  { "-symmetry",       ".symmetry",        XrmoptionSepArg, 0 },
+  { "-nsegments",       ".nsegments",       XrmoptionSepArg, 0 },
+  { "-ntrails",                ".ntrails",         XrmoptionSepArg, 0 },
+  { "-local_rotation",  ".local_rotation",  XrmoptionSepArg, 0 },
+  { "-global_rotation", ".global_rotation", XrmoptionSepArg, 0 },
+  { "-delay",           ".delay",           XrmoptionSepArg, 0 },
+  { "-spring_constant", ".spring_constant", XrmoptionSepArg, 0 },
+  { "-redmin",          ".redmin",          XrmoptionSepArg, 0 },
+  { "-redrange",        ".redmin",          XrmoptionSepArg, 0 },
+  { "-bluemin",         ".bluemin",         XrmoptionSepArg, 0 },
+  { "-bluerange",       ".bluerange",       XrmoptionSepArg, 0 },
+  { "-greenmin",        ".greenmin",        XrmoptionSepArg, 0 },
+  { "-greenrange",      ".greenrange",      XrmoptionSepArg, 0 },
+  { 0, 0, 0, 0 }
+};
+
+/* END global variables */
+
+static void
+krandom_color(XColor *color)
+{
+  int r;
+  r = random() % 3;
+
+  if((g.color_mode == 0) || (g.color_mode == 1)) {
+
+    color->blue  = ((r = random()) % g.bluerange) + g.bluemin;
+    color->green = ((r = random()) % g.greenrange) + g.greenmin;
+    color->red   = ((r = random()) % g.redrange) + g.redmin;
+
+    if(!XAllocColor(g.dpy, g.cmap, color)) {
+      color->pixel = g.default_fg_pixel;
+    } 
+    return;
+  } else {
+    color->pixel = g.default_fg_pixel;
+    return;
+  }
+}
+
+
+static void
+kcopy_color(XColor *to, XColor *from)
+{
+  to->red   = from->red;
+  to->green = from->green;
+  to->blue  = from->blue;
+  to->pixel = from->pixel;
+}
+
+static void
+kcycle_color(XColor *color,
+            unsigned short redstep,
+            unsigned short greenstep,
+            unsigned short bluestep) 
+{
+  unsigned short red,green,blue;
+
+  if (! g.color_mode) {
+    XColor copy;
+    color->flags = DoRed|DoGreen|DoBlue;
+    color->red   = (red = color->red) - redstep;
+    color->green = (green = color->green) - greenstep;
+    color->blue  = (blue = color->blue)  - bluestep;
+    copy = *color;
+
+    if(!XAllocColor(g.dpy, g.cmap, color)) {
+      /* printf("couldn't alloc color...\n"); */
+      color->pixel = g.default_fg_pixel;
+    }
+    copy.pixel = color->pixel;
+    *color = copy;
+
+    color->red   = red   - redstep;
+    color->green = green- greenstep;
+    color->blue  = blue  - bluestep;
+    return;
+  } 
+}
+
+
+static Ksegment *
+create_ksegment (void)
+{
+  Ksegment *seg, *prev;
+  XColor new_color;
+  int i;
+  unsigned short redstep,bluestep,greenstep;
+
+  krandom_color(&new_color);
+
+  redstep = new_color.red/(2 * g.ntrails);
+  greenstep = new_color.green/(2 * g.ntrails);
+  bluestep = new_color.blue/(2 * g.ntrails);
+
+  seg            = (Ksegment *) malloc(sizeof(Ksegment));
+  seg->xsegments = (XSegment  *) malloc(g.symmetry * sizeof(XSegment));
+
+  prev = seg;
+  for(i=0; i< (g.ntrails - 1); i++) {
+
+    kcycle_color(&new_color,redstep,greenstep,bluestep);
+
+    kcopy_color(&(prev->color), &new_color);
+
+    prev->next              = (Ksegment*)malloc(sizeof(Ksegment));
+    (prev->next)->xsegments = (XSegment*)malloc(g.symmetry * sizeof(XSegment));
+    prev->drawn             = 0;
+    prev = (prev->next);
+  } 
+
+  prev->drawn = 0;
+  prev->next = seg;
+  kcopy_color(&(prev->color), &new_color);
+
+  return seg;
+}
+
+static void
+init_ksegment (OBJECT *obj)
+{
+
+  /* Give the segment some random values */
+  ((Ksegment *)obj->cur)->x1 = random() % g.xoff;
+  ((Ksegment *)obj->cur)->y1 = random() % g.yoff;
+  ((Ksegment *)obj->cur)->x2 = random() % g.xoff;
+  ((Ksegment *)obj->cur)->y2 = random() % g.yoff;
+}
+
+
+static void
+draw_ksegment (OBJECT *obj)
+{
+  register short x1, y1, x2, y2;
+  int dx, dy;
+  int i;
+  static int counter=0;
+
+  counter++;
+
+  x1 = ((Ksegment *)obj->cur)->x1;   /* in the natural coordinate system */
+  y1 = ((Ksegment *)obj->cur)->y1;
+  x2 = ((Ksegment *)obj->cur)->x2;
+  y2 = ((Ksegment *)obj->cur)->y2;
+
+  dx = x2 - x1;
+  dy = y2 - y1;
+
+  /* maybe throw away values and start over */
+  if( ((dx*dx) + (dy * dy)) < 100) {
+    init_ksegment (obj);
+    x1 = ((Ksegment *)obj->cur)->x1;   /* in the natural coordinate system */
+    y1 = ((Ksegment *)obj->cur)->y1;
+    x2 = ((Ksegment *)obj->cur)->x2;
+    y2 = ((Ksegment *)obj->cur)->y2;
+  }
+
+  for (i=0; i<g.symmetry; i++) {
+    (((Ksegment *)obj->cur)->xsegments)[i].x1 = NEWX(x1,y1);
+    (((Ksegment *)obj->cur)->xsegments)[i].y1 = NEWY(x1,y1);
+    (((Ksegment *)obj->cur)->xsegments)[i].x2 = NEWX(x2,y2);
+    (((Ksegment *)obj->cur)->xsegments)[i].y2 = NEWY(x2,y2);
+
+    (((Ksegment *)obj->cur)->xsegments)[i].x1 = (x1 = (((Ksegment *)obj->cur)->xsegments)[i].x1) + g.xoff; 
+    (((Ksegment *)obj->cur)->xsegments)[i].y1 = (y1 = (((Ksegment *)obj->cur)->xsegments)[i].y1) + g.yoff;
+    (((Ksegment *)obj->cur)->xsegments)[i].x2 = (x2 = (((Ksegment *)obj->cur)->xsegments)[i].x2) + g.xoff;
+    (((Ksegment *)obj->cur)->xsegments)[i].y2 = (y2 = (((Ksegment *)obj->cur)->xsegments)[i].y2) + g.yoff;
+  }
+
+  XSetForeground(g.dpy, g.draw_gc, (((Ksegment *)obj->cur)->color).pixel);
+
+  XDrawSegments(g.dpy, g.window, g.draw_gc, ((Ksegment *)obj->cur)->xsegments, g.symmetry);
+  ((Ksegment *)obj->cur)->drawn = 1;
+
+  if (((((Ksegment *)obj->cur)->next)->drawn) != 0) {
+    XDrawSegments(g.dpy, g.window, g.erase_gc, ((Ksegment *)obj->cur)->next->xsegments, g.symmetry);
+  }
+}
+
+static void
+propogate_ksegment(OBJECT *obj)
+{
+  int t;
+  short int x1,y1,x2,y2;
+  short int midx,midy,nmidx,nmidy;
+  float lsin, lcos, gsin, gcos;
+
+  lsin = sin((2*M_PI/10000)*g.local_rotation);
+  lcos = cos((2*M_PI/10000)*g.local_rotation);
+  gsin = sin((2*M_PI/10000)*g.global_rotation);
+  gcos = cos((2*M_PI/10000)*g.global_rotation);
+
+  t=obj->time;
+  obj->time = t + 1;
+
+  x1 = ((Ksegment *) obj->cur)->x1;
+  y1 = ((Ksegment *) obj->cur)->y1;
+  x2 = ((Ksegment *) obj->cur)->x2;
+  y2 = ((Ksegment *) obj->cur)->y2;
+
+  midx = (x1 + x2)/2;
+  midy = (y1 + y2)/2;
+
+  nmidx = midx*gcos + midy*gsin;
+  nmidy = midy*gcos - midx*gsin;
+
+  x1 = x1 - midx;
+  x2 = x2 - midx;
+  y1 = y1 - midy;
+  y2 = y2 - midy;
+
+
+  /* This is where we move to the next ksegment... */
+  obj->cur = ((Ksegment *)obj->cur)->next;
+
+  ((Ksegment *)obj->cur)->x1 = ((x1*lcos) + (y1*lsin)) + nmidx;
+  ((Ksegment *)obj->cur)->y1 = ((y1*lcos) - (x1*lsin)) + nmidy;
+  ((Ksegment *)obj->cur)->x2 = ((x2*lcos) + (y2*lsin)) + nmidx;
+  ((Ksegment *)obj->cur)->y2 = ((y2*lcos) - (x2*lsin)) + nmidy;
+
+  return ;
+}
+
+static void
+init_objects (void)
+{
+  int i;
+  for (i=0; i<g.nobjects; i++) {
+    (objects[i].init)(objects + i);
+  }
+}
+
+static void
+create_objects (void)
+{
+  int i;
+
+  objects = (OBJECT *) malloc(g.nobjects * sizeof(OBJECT));
+
+  for (i=0; i< g.nsegments; i++) {
+    objects[i].cur = create_ksegment();
+    objects[i].type = 1;
+    objects[i].time = 0;
+    objects[i].propogate = propogate_ksegment;
+    objects[i].draw      = draw_ksegment;
+    objects[i].init      = init_ksegment;
+  }
+
+  /* Here we can add creation functions for other object types. */
+}
+
+
+static void
+propogate_objects (void)
+{
+  int i;
+
+  for(i=0; i<g.nobjects; i++) {
+    objects[i].propogate(objects + i);
+  }
+}
+
+static void
+draw_objects (void)
+{
+  int i;
+
+  for(i=0; i<g.nobjects; i++) {
+    objects[i].draw(objects + i);
+  }
+}
+
+static void
+init_g (Display *dpy, Window window)
+{
+  XWindowAttributes xgwa;
+  XGCValues gcv;
+  char *color_mode_str;
+
+  g.dpy    = dpy;
+  g.window = window;
+
+  g.symmetry        = get_integer_resource("symmetry",         "Integer");
+  g.ntrails         = get_integer_resource("ntrails"  ,        "Integer");
+  g.nsegments       = get_integer_resource("nsegments",        "Integer");
+  g.narcs           = get_integer_resource("narcs",            "Integer");
+  g.local_rotation  = get_integer_resource("local_rotation",   "Integer");
+  g.global_rotation = get_integer_resource("global_rotation",  "Integer");
+  g.spring_constant = get_integer_resource("sprint_constatnt", "Integer");
+  g.delay           = get_integer_resource("delay", "Integer");
+  g.nobjects        = g.nsegments + g.narcs;
+
+  color_mode_str = get_string_resource("color_mode", "color_mode");
+
+  /* make into an enum... */
+  if(!color_mode_str) {
+    g.color_mode = 0;
+  } else if (!strcmp(color_mode_str, "greedy")) {
+    g.color_mode = 0;
+  } else if (!strcmp(color_mode_str, "nice")) {
+    g.color_mode = 1;
+  } else {
+    g.color_mode = 2;
+  }
+
+  XGetWindowAttributes (dpy, (Drawable) window, &xgwa);
+  g.xmax     = xgwa.width;
+  g.ymax     = xgwa.height;  
+  g.xoff     = g.xmax/2;
+  g.yoff     = g.ymax/2;
+  g.costheta = cos(2*M_PI/g.symmetry);
+  g.sintheta  = sin(2*M_PI/g.symmetry);
+  g.cmap     = xgwa.colormap;
+
+  g.redmin     = get_integer_resource("redmin",     "Integer");
+  g.redrange   = get_integer_resource("redrange",   "Integer");
+  g.greenmin   = get_integer_resource("greenmin",   "Integer");
+  g.greenrange = get_integer_resource("greenrange", "Integer");
+  g.bluemin    = get_integer_resource("bluemin",    "Integer");
+  g.bluerange  = get_integer_resource("bluerange",  "Integer");
+
+  gcv.line_width = 1;
+  gcv.cap_style  = CapRound;
+  gcv.foreground = g.default_fg_pixel = get_pixel_resource ("foreground", "Foreground", dpy, g.cmap);
+  g.draw_gc      = XCreateGC (dpy, (Drawable) window, GCForeground|GCLineWidth|GCCapStyle, &gcv);
+
+  gcv.foreground = get_pixel_resource ("background", "Background", g.dpy, g.cmap);
+  g.erase_gc     = XCreateGC (dpy, (Drawable) window, GCForeground|GCLineWidth|GCCapStyle,&gcv);
+}
+
+void
+screenhack (Display *dpy, Window window)
+{
+  init_g (dpy, window);
+  create_objects();
+  init_objects ();
+
+  while (1)
+    {
+     draw_objects ();
+     XSync (dpy, False);
+     if(g.delay) {
+       screenhack_handle_events (dpy);
+       usleep(g.delay);
+     }
+     propogate_objects(); 
+   }
+}
diff --git a/hacks/kaleidescope.man b/hacks/kaleidescope.man
new file mode 100644 (file)
index 0000000..6eca5e3
--- /dev/null
@@ -0,0 +1,85 @@
+.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
+..
+.TH Kaleidescpe 1 "14-Dec-95" "X Version 11"
+.SH NAME
+Kaleidescope - rotating line segments
+.SH SYNOPSIS
+.B kaleidescope
+[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-install] [\-visual \fIvisual\fP] [\-color_mode \fImono | nice | greedy\fP] [-nsegments \fIint\fP] [\-ntrails \fIint\fP] [\-local_rotation \fIint\fP] [\-global_rotation \fIint\fP] [\-delay \fIusecs\fP] [\-redmin \fIint\fP] [\-greenmin \fIint\fP] [\-bluemin \fIint\fP] [\-redrange \fIint\fP] [\-greenrange \fIint\fP] [\-bluerange \fIint\fP]
+.SH DESCRIPTION
+The \fIkaleidescope\fP program draws line segments in a symmetric pattern
+that evolves over time. 
+.SH OPTIONS
+.I kaleidescope
+accepts the following options:
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-color_mode "mono | nice | greedy"
+Specify how kaleidescope uses colors. Mono uses
+just the default foreground and background colors. Nice uses one
+color for each segment (specified by nsegments). Greedy uses (ntrails * nsegments) + 1  colors.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use.  Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-nsegments integer
+The number of segments to draw. Default is 7.
+.TP 8
+.B \-ntrails integer
+The number of trails to draw. Default is 100.
+.TP 8
+.B \-local_rotation integer
+The rate at which segments rotate around their center. Default is -59.
+.TP 8
+.B \-global_rotation integer 
+The rate at which segments rotate around the center of the window.
+Default is 1. 
+.TP 8
+.B \-redmin, \-greenmin, \-bluemin, \-redrange, \-greenrange, \-bluerange
+All take an integer argument. When colors are randomly chosen, they 
+are chosen from the interval min to min plus range. The minimums default
+to 30000. The ranges default to 20000. 
+.TP 8
+.B \-delay microseconds
+How much of a delay should be introduced between steps of the animation.
+Default is 20000, or about 5 frames a second.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR kaleidescope (1)
+.SH COPYRIGHT
+Copyright \(co 1997 by Ron Tapia.  Permission to use, copy, modify, 
+distribute, and sell this software 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.  No representations are made about the 
+suitability of this software for any purpose.  It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Ron Tapia <tapia@nmia.com>, 20-Mar-97.
+
diff --git a/hacks/kumppa.c b/hacks/kumppa.c
new file mode 100644 (file)
index 0000000..7e88392
--- /dev/null
@@ -0,0 +1,482 @@
+/*
+
+Copyright (C) Teemu Suutari (temisu@utu.fi) Feb 1998
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR
+OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+
+Except as contained in this notice, the name of the X Consortium shall
+not be used in advertising or otherwise to promote the sale, use or
+other dealings in this Software without prior written authorization
+from the X Consortium.
+
+*/
+
+
+
+
+/*
+
+*** This is contest-version. Don't look any further, code is *very* ugly.
+
+*/
+
+
+#include <math.h>
+#include "screenhack.h"
+
+#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+# include "xdbe.h"
+#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
+
+char *progclass="Kumppa";
+
+char *defaults [] ={
+       ".background:           black",
+       "*speed:                0.1",
+       "*delay:                0",
+#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+        /* leave this off by default, since it slows things down.  -- jwz. */
+        "*useDBE:              False",
+#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
+       0
+};
+
+XrmOptionDescRec options [] = {
+       {"-delay",".delay",XrmoptionSepArg,0},
+       {"-speed",".speed",XrmoptionSepArg,0},
+       {"-random",".random",XrmoptionIsArg,0},
+#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+       {"-dbuf",".dbuf",XrmoptionIsArg,0},
+#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
+       {0,0,0,0}
+};
+
+const char colors[96]=
+       {0,0,255, 0,51,255, 0,102,255, 0,153,255, 0,204,255,
+       0,255,255,0,255,204, 0,255,153, 0,255,102, 0,255,51,
+       0,255,0, 51,255,0, 102,255,0, 153,255,0, 204,255,0,
+       255,255,0, 255,204,0, 255,153,0, 255,102,0, 255,51,0,
+       255,0,0, 255,0,51, 255,0,102, 255,0,153, 255,0,204,
+       255,0,255, 219,0,255, 182,0,255, 146,0,255, 109,0,255,
+       73,0,255, 37,0,255};
+const float cosinus[8][6]={{-0.07,0.12,-0.06,32,25,37},{0.08,-0.03,0.05,51,46,32},{0.12,0.07,-0.13,27,45,36},
+       {0.05,-0.04,-0.07,36,27,39},{-0.02,-0.07,0.1,21,43,42},{-0.11,0.06,0.02,51,25,34},{0.04,-0.15,0.02,42,32,25},
+       {-0.02,-0.04,-0.13,34,20,15}};
+
+static float acosinus[8][3]={{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0},{0,0,0}};
+static int coords[8];
+static int ocoords[8]={0,0,0,0,0,0,0,0};
+
+static Display *dpy;
+static Window win[2];
+static GC fgc[33];
+static GC cgc;
+static int sizx,sizy;
+static int midx,midy;
+static unsigned long delay;
+static Bool cosilines=True;
+#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+static Bool usedouble=False;
+#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
+
+static int *Xrotations;
+static int *Yrotations;
+static int *Xrottable;
+static int *Yrottable;
+
+static int *rotateX;
+static int *rotateY;
+
+static int rotsizeX,rotsizeY;
+static int stateX,stateY;
+
+static int rx,ry;
+
+
+int Satnum(int maxi)
+{
+return (int)(maxi*frand(1));
+}
+
+
+void palaRotate(int x,int y)
+{
+int ax,ay,bx,by,cx,cy;
+
+ax=rotateX[x];
+ay=rotateY[y];
+bx=rotateX[x+1]+2;
+by=rotateY[y+1]+2;
+cx=rotateX[x]-(y-ry)+x-rx;
+cy=rotateY[y]+(x-rx)+y-ry;
+if (cx<0)
+       {
+       ax-=cx;
+       cx=0;
+       }
+if (cy<0)
+       {
+       ay-=cy;
+       cy=0;
+       }
+if (cx+bx-ax>sizx) bx=ax-cx+sizx;
+if (cy+by-ay>sizy) by=ay-cy+sizy;
+if (ax<bx && ay<by)
+       XCopyArea(dpy,win[0],win[1],cgc,ax,ay,bx-ax,by-ay,cx,cy);
+}
+
+
+void rotate(void)
+{
+int x,y;
+int dx,dy;
+
+rx=Xrottable[stateX+1]-Xrottable[stateX];
+ry=Yrottable[stateY+1]-Yrottable[stateY];
+
+
+for (x=0;x<=rx;x++)
+       rotateX[x]=(x)?midx-1-Xrotations[Xrottable[stateX+1]-x]:0;
+for (x=0;x<=rx;x++)
+       rotateX[x+rx+1]=(x==rx)?sizx-1:midx+Xrotations[Xrottable[stateX]+x];
+for (y=0;y<=ry;y++)
+       rotateY[y]=(y)?midy-1-Yrotations[Yrottable[stateY+1]-y]:0;
+for (y=0;y<=ry;y++)
+       rotateY[y+ry+1]=(y==ry)?sizy-1:midy+Yrotations[Yrottable[stateY]+y];
+
+x=(rx>ry)?rx:ry;
+for (dy=0;dy<(x+1)<<1;dy++)
+       for (dx=0;dx<(x+1)<<1;dx++)
+               {
+               y=(rx>ry)?ry-rx:0;
+               if (dy+y>=0 && dy<(ry+1)<<1 && dx<(rx+1)<<1)
+                       if (dy+y+dx<=ry+rx && dy+y-dx<=ry-rx)
+                               {
+                               palaRotate((rx<<1)+1-dx,dy+y);
+                               palaRotate(dx,(ry<<1)+1-dy-y);
+                               }
+               y=(ry>rx)?rx-ry:0;
+               if (dy+y>=0 && dx<(ry+1)<<1 && dy<(rx+1)<<1)
+                       if (dy+y+dx<=ry+rx && dx-dy-y>=ry-rx)
+                               {
+                               palaRotate(dy+y,dx);
+                               palaRotate((rx<<1)+1-dy-y,(ry<<1)+1-dx);
+                               }
+               }
+stateX++;
+if (stateX==rotsizeX) stateX=0;
+stateY++;
+if (stateY==rotsizeY) stateY=0;
+}
+
+
+
+Bool make_rots(double xspeed,double yspeed)
+{
+int a,b,c,f,g,j,k=0,l;
+double m,om,ok;
+double d,ix,iy;
+int maxi;
+
+Bool *chks;
+
+rotsizeX=(int)(2/xspeed+1);
+ix=(double)(midx+1)/(double)(rotsizeX);
+rotsizeY=(int)(2/yspeed+1);
+iy=(double)(midy+1)/(double)(rotsizeY);
+
+Xrotations=malloc((midx+2)*sizeof(unsigned int));
+Xrottable=malloc((rotsizeX+1)*sizeof(unsigned int));
+Yrotations=malloc((midy+2)*sizeof(unsigned int));
+Yrottable=malloc((rotsizeY+1)*sizeof(unsigned int));
+chks=malloc(((midx>midy)?midx:midy)*sizeof(Bool));
+if (!Xrottable || !Yrottable || !Xrotations || !Yrotations || !chks) return False;
+
+
+maxi=0;
+c=0;
+d=0;
+g=0;
+for (a=0;a<midx;a++) chks[a]=True;
+for (a=0;a<rotsizeX;a++)
+       {
+       Xrottable[a]=c;
+       f=(int)(d+ix)-g;                                /*viivojen lkm.*/
+       g+=f;
+       if (g>midx)
+               {
+               f-=g-midx;
+               g=midx;
+               }
+       for (b=0;b<f;b++)
+               {
+               m=0;
+               for (j=0;j<midx;j++)                    /*testi*/
+                       {
+                       if (chks[j])
+                               {
+                               om=0;
+                               ok=1;
+                               l=0;
+                               while (j+l<midx && om+12*ok>m)
+                                       {
+                                       if (j-l>=0) if (chks[j-l]) om+=ok;
+                                               else; else if (chks[l-j]) om+=ok;
+                                       if (chks[j+l]) om+=ok;
+                                       ok/=1.5;
+                                       l++;
+                                       }
+                               if (om>=m)
+                                       {
+                                       k=j;
+                                       m=om;
+                                       }
+                               }
+                       }
+               chks[k]=False;
+               l=c;
+               while (l>=Xrottable[a])
+                       {
+                       if (l!=Xrottable[a]) Xrotations[l]=Xrotations[l-1];
+                       if (k>Xrotations[l] || l==Xrottable[a])
+                               {
+                               Xrotations[l]=k;
+                               c++;
+                               l=Xrottable[a];
+                               }
+                       l--;
+                       }
+               }
+       d+=ix;
+       if (maxi<c-Xrottable[a]) maxi=c-Xrottable[a];
+       }
+Xrottable[a]=c;
+rotateX=malloc((maxi+2)*sizeof(int)<<1);
+if (!rotateX) return False;
+
+maxi=0;
+c=0;
+d=0;
+g=0;
+for (a=0;a<midy;a++) chks[a]=True;
+for (a=0;a<rotsizeY;a++)
+       {
+       Yrottable[a]=c;
+       f=(int)(d+iy)-g;                                /*viivojen lkm.*/
+       g+=f;
+       if (g>midy)
+               {
+               f-=g-midy;
+               g=midy;
+               }
+       for (b=0;b<f;b++)
+               {
+               m=0;
+               for (j=0;j<midy;j++)                    /*testi*/
+                       {
+                       if (chks[j])
+                               {
+                               om=0;
+                               ok=1;
+                               l=0;
+                               while (j+l<midy && om+12*ok>m)
+                                       {
+                                       if (j-l>=0) if (chks[j-l]) om+=ok;
+                                               else; else if (chks[l-j]) om+=ok;
+                                       if (chks[j+l]) om+=ok;
+                                       ok/=1.5;
+                                       l++;
+                                       }
+                               if (om>=m)
+                                       {
+                                       k=j;
+                                       m=om;
+                                       }
+                               }
+                       }
+               chks[k]=False;
+               l=c;
+               while (l>=Yrottable[a])
+                       {
+                       if (l!=Yrottable[a]) Yrotations[l]=Yrotations[l-1];
+                       if (k>Yrotations[l] || l==Yrottable[a])
+                               {
+                               Yrotations[l]=k;
+                               c++;
+                               l=Yrottable[a];
+                               }
+                       l--;
+                       }
+
+               }
+       d+=iy;
+       if (maxi<c-Yrottable[a]) maxi=c-Yrottable[a];
+       }
+Yrottable[a]=c;
+rotateY=malloc((maxi+2)*sizeof(int)<<1);
+if (!rotateY) return False;
+
+free(chks);
+return (True);
+}
+
+
+Bool InitializeAll(void)
+{
+XGCValues xgcv;
+XWindowAttributes xgwa;
+XSetWindowAttributes xswa;
+Colormap cmap;
+XColor color;
+int n,i;
+double rspeed;
+
+XGetWindowAttributes(dpy,win[0],&xgwa);
+cmap=xgwa.colormap;
+xswa.backing_store=Always;
+XChangeWindowAttributes(dpy,win[0],CWBackingStore,&xswa);
+xgcv.function=GXcopy;
+
+xgcv.foreground=get_pixel_resource ("background", "Background", dpy, cmap);
+fgc[32]=XCreateGC(dpy,win[0],GCForeground|GCFunction,&xgcv);
+
+n=0;
+if (mono_p)
+       {
+       fgc[0]=fgc[32];
+       xgcv.foreground=get_pixel_resource ("foreground", "Foreground", dpy, cmap);
+       fgc[1]=XCreateGC(dpy,win[0],GCForeground|GCFunction,&xgcv);
+       for (i=0;i<32;i+=2) fgc[i]=fgc[0];
+       for (i=1;i<32;i+=2) fgc[i]=fgc[1];
+       } else
+       for (i=0;i<32;i++)
+       {
+               color.red=colors[n++]<<8;
+               color.green=colors[n++]<<8;
+               color.blue=colors[n++]<<8;
+               color.flags=DoRed|DoGreen|DoBlue;
+               XAllocColor(dpy,cmap,&color);
+               xgcv.foreground=color.pixel;
+               fgc[i]=XCreateGC(dpy,win[0],GCForeground|GCFunction,&xgcv);
+       }
+cgc=XCreateGC(dpy,win[0],GCForeground|GCFunction,&xgcv);
+XSetGraphicsExposures(dpy,cgc,False);
+
+if (get_string_resource("random","String")!=NULL && get_string_resource("random","String")[0]!=0) cosilines=False;
+
+#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+ usedouble = True;
+ win[1] = xdbe_get_backbuffer (dpy, win[0], XdbeUndefined);
+ if (!win[1])
+   {
+     usedouble = False;
+     win[1] = win[0];
+   }
+#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
+
+delay=get_integer_resource("delay","Integer");
+rspeed=get_float_resource("speed","Float");
+if (rspeed<0.0001 || rspeed>0.2)
+       {
+       fprintf(stderr,"Speed not in valid range! (0.0001 - 0.2), using 0.1 \n");
+       rspeed=0.1;
+       }
+
+sizx=xgwa.width;
+sizy=xgwa.height;
+midx=sizx>>1;
+midy=sizy>>1;
+stateX=0;
+stateY=0;
+
+if (!make_rots(rspeed,rspeed))
+       {
+       fprintf(stderr,"Not enough memory for tables!\n");
+       return False;
+       }
+return True;
+}
+
+
+void screenhack(Display *d, Window w)
+{
+#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+XdbeSwapInfo xdswp;
+#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
+int a,b,c=0,e;
+float f;
+
+dpy=d;
+win[0]=w;
+if (!InitializeAll()) return;
+
+#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+if (usedouble)
+       {
+       xdswp.swap_action=XdbeUndefined;
+       xdswp.swap_window=win[0];
+       }
+ else
+#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
+   win[1]=win[0];
+
+while (0==0)
+       {
+       if (cosilines)
+               {
+               c++;
+               for (a=0;a<8;a++)
+                       {
+                       f=0;
+                       for (b=0;b<3;b++)
+                               {
+                               acosinus[a][b]+=cosinus[a][b];
+                               f+=cosinus[a][b+3]*sin((double)acosinus[a][b]);
+                               }
+                       coords[a]=(int)f;
+                       }
+               for (a=0;a<4;a++)
+                       {
+                       XDrawLine(dpy,win[0],(mono_p)?fgc[1]:fgc[((a<<2)+c)&31],midx+ocoords[a<<1],midy+ocoords[(a<<1)+1]
+                       ,midx+coords[a<<1],midy+coords[(a<<1)+1]);
+                       ocoords[a<<1]=coords[a<<1];
+                       ocoords[(a<<1)+1]=coords[(a<<1)+1];
+                       }
+
+               } else {
+               for (e=0;e<8;e++)
+                       {
+                       a=Satnum(50);
+                       if (a>=32) a=32;
+                       b=Satnum(32)-16+midx;
+                       c=Satnum(32)-16+midy;
+                       XFillRectangle(dpy,win[0],fgc[a],b,c,2,2);
+                       }
+               }
+       XFillRectangle(dpy,win[0],fgc[32],midx-2,midy-2,4,4);
+       rotate();
+#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+       if (usedouble) XdbeSwapBuffers(dpy,&xdswp,1);
+#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
+       XSync(dpy, False);
+        screenhack_handle_events (dpy);
+       if (delay) usleep (delay);
+       }
+}
diff --git a/hacks/laser.c b/hacks/laser.c
new file mode 100644 (file)
index 0000000..de2a914
--- /dev/null
@@ -0,0 +1,319 @@
+/* -*- Mode: C; tab-width: 4 -*-
+ * laser --- draws swinging laser beams.
+ */
+#if !defined( lint ) && !defined( SABER )
+static const char sccsid[] = "@(#)laser.c      4.00 97/01/01 xlockmore";
+#endif
+
+/* Copyright (c) 1995 Pascal Pensa <pensa@aurora.unice.fr>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software 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.  No representations are made about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or
+ * implied warranty.
+ *
+ * Revision History:
+ * 10-May-97: jwz@jwz.org: turned into a standalone program.
+ */
+
+#ifdef STANDALONE
+# define PROGCLASS                                     "Laser"
+# define HACK_INIT                                     init_laser
+# define HACK_DRAW                                     draw_laser
+# define laser_opts                                    xlockmore_opts
+# define DEFAULTS      "*count:                10    \n"                       \
+                                       "*cycles:               200   \n"                       \
+                                       "*delay:                40000 \n"                       \
+                                       "*ncolors:              64   \n"
+# define SMOOTH_COLORS
+# include "xlockmore.h"                                /* from the xscreensaver distribution */
+#else  /* !STANDALONE */
+# include "xlock.h"                                    /* from the xlockmore distribution */
+#endif /* !STANDALONE */
+
+ModeSpecOpt laser_opts = {
+  0, NULL, 0, NULL, NULL };
+
+#define MINREDRAW 3            /* Number of redrawn on each frame */
+#define MAXREDRAW 8
+
+#define MINLASER  1            /* Laser number */
+
+#define MINWIDTH  2            /* Laser ray width range */
+#define MAXWIDTH 40
+
+#define MINSPEED  2            /* Speed range */
+#define MAXSPEED 17
+
+#define MINDIST  10            /* Minimal distance from edges */
+
+#define COLORSTEP 2            /* Laser color step */
+
+#define RANGE_RAND(min,max) ((min) + LRAND() % ((max) - (min)))
+
+typedef enum {
+       TOP, RIGHT, BOTTOM, LEFT
+} border;
+
+typedef struct {
+       int         bx;         /* border x */
+       int         by;         /* border y */
+       border      bn;         /* active border */
+       int         dir;        /* direction */
+       int         speed;      /* laser velocity from MINSPEED to MAXSPEED */
+       int         sx[MAXWIDTH];       /* x stack */
+       int         sy[MAXWIDTH];       /* x stack */
+       XGCValues   gcv;        /* for color */
+} laserstruct;
+
+typedef struct {
+       int         width;
+       int         height;
+       int         cx;         /* center x */
+       int         cy;         /* center y */
+       int         lw;         /* laser width */
+       int         ln;         /* laser number */
+       int         lr;         /* laser redraw */
+       int         sw;         /* stack width */
+       int         so;         /* stack offset */
+       int         time;       /* up time */
+       GC          stippledGC;
+       XGCValues   gcv_black;  /* for black color */
+       laserstruct *laser;
+} lasersstruct;
+
+static lasersstruct *lasers = NULL;
+
+
+void
+init_laser(ModeInfo * mi)
+{
+       int         i, c = 0;
+       lasersstruct *lp;
+
+       if (lasers == NULL) {
+               if ((lasers = (lasersstruct *) calloc(MI_NUM_SCREENS(mi),
+                                            sizeof (lasersstruct))) == NULL)
+                       return;
+       }
+       lp = &lasers[MI_SCREEN(mi)];
+
+       lp->width = MI_WIN_WIDTH(mi);
+       lp->height = MI_WIN_HEIGHT(mi);
+       lp->time = 0;
+
+       lp->ln = MI_BATCHCOUNT(mi);
+       if (lp->ln < -MINLASER) {
+               /* if lp->ln is random ... the size can change */
+               if (lp->laser != NULL) {
+                       (void) free((void *) lp->laser);
+                       lp->laser = NULL;
+               }
+               lp->ln = NRAND(-lp->ln - MINLASER + 1) + MINLASER;
+       } else if (lp->ln < MINLASER)
+               lp->ln = MINLASER;
+
+       if (!lp->laser) {
+               lp->laser = (laserstruct *) malloc(lp->ln * sizeof (laserstruct));
+       }
+       if (lp->stippledGC == NULL) {
+               XGCValues   gcv;
+
+               gcv.foreground = MI_WIN_WHITE_PIXEL(mi);
+               gcv.background = MI_WIN_BLACK_PIXEL(mi);
+               lp->gcv_black.foreground = MI_WIN_BLACK_PIXEL(mi);
+               lp->stippledGC = XCreateGC(MI_DISPLAY(mi), MI_WINDOW(mi),
+                                          GCForeground | GCBackground, &gcv);
+       }
+       XClearWindow(MI_DISPLAY(mi), MI_WINDOW(mi));
+
+       if (MINDIST < lp->width - MINDIST)
+               lp->cx = RANGE_RAND(MINDIST, lp->width - MINDIST);
+       else
+               lp->cx = RANGE_RAND(0, lp->width);
+       if (MINDIST < lp->height - MINDIST)
+               lp->cy = RANGE_RAND(MINDIST, lp->height - MINDIST);
+       else
+               lp->cy = RANGE_RAND(0, lp->height);
+       lp->lw = RANGE_RAND(MINWIDTH, MAXWIDTH);
+       lp->lr = RANGE_RAND(MINREDRAW, MAXREDRAW);
+       lp->sw = 0;
+       lp->so = 0;
+
+       if (MI_NPIXELS(mi) > 2)
+               c = NRAND(MI_NPIXELS(mi));
+
+       for (i = 0; i < lp->ln; i++) {
+               laserstruct *l = &lp->laser[i];
+
+               l->bn = (border) NRAND(4);
+
+               switch (l->bn) {
+                       case TOP:
+                               l->bx = NRAND(lp->width);
+                               l->by = 0;
+                               break;
+                       case RIGHT:
+                               l->bx = lp->width;
+                               l->by = NRAND(lp->height);
+                               break;
+                       case BOTTOM:
+                               l->bx = NRAND(lp->width);
+                               l->by = lp->height;
+                               break;
+                       case LEFT:
+                               l->bx = 0;
+                               l->by = NRAND(lp->height);
+               }
+
+               l->dir = LRAND() & 1;
+               l->speed = ((RANGE_RAND(MINSPEED, MAXSPEED) * lp->width) / 1000) + 1;
+               if (MI_NPIXELS(mi) > 2) {
+                       l->gcv.foreground = MI_PIXEL(mi, c);
+                       c = (c + COLORSTEP) % MI_NPIXELS(mi);
+               } else
+                       l->gcv.foreground = MI_WIN_WHITE_PIXEL(mi);
+       }
+}
+
+static void
+draw_laser_once(ModeInfo * mi)
+{
+       Display    *display = MI_DISPLAY(mi);
+       lasersstruct *lp = &lasers[MI_SCREEN(mi)];
+       int         i;
+
+       for (i = 0; i < lp->ln; i++) {
+               laserstruct *l = &lp->laser[i];
+
+               if (lp->sw >= lp->lw) {
+                       XChangeGC(display, lp->stippledGC, GCForeground, &(lp->gcv_black));
+                       XDrawLine(display, MI_WINDOW(mi), lp->stippledGC,
+                                 lp->cx, lp->cy,
+                                 l->sx[lp->so], l->sy[lp->so]);
+               }
+               if (l->dir) {
+                       switch (l->bn) {
+                               case TOP:
+                                       l->bx -= l->speed;
+                                       if (l->bx < 0) {
+                                               l->by = -l->bx;
+                                               l->bx = 0;
+                                               l->bn = LEFT;
+                                       }
+                                       break;
+                               case RIGHT:
+                                       l->by -= l->speed;
+                                       if (l->by < 0) {
+                                               l->bx = lp->width + l->by;
+                                               l->by = 0;
+                                               l->bn = TOP;
+                                       }
+                                       break;
+                               case BOTTOM:
+                                       l->bx += l->speed;
+                                       if (l->bx >= lp->width) {
+                                               l->by = lp->height - l->bx % lp->width;
+                                               l->bx = lp->width;
+                                               l->bn = RIGHT;
+                                       }
+                                       break;
+                               case LEFT:
+                                       l->by += l->speed;
+                                       if (l->by >= lp->height) {
+                                               l->bx = l->by % lp->height;
+                                               l->by = lp->height;
+                                               l->bn = BOTTOM;
+                                       }
+                       }
+               } else {
+                       switch (l->bn) {
+                               case TOP:
+                                       l->bx += l->speed;
+                                       if (l->bx >= lp->width) {
+                                               l->by = l->bx % lp->width;
+                                               l->bx = lp->width;
+                                               l->bn = RIGHT;
+                                       }
+                                       break;
+                               case RIGHT:
+                                       l->by += l->speed;
+                                       if (l->by >= lp->height) {
+                                               l->bx = lp->width - l->by % lp->height;
+                                               l->by = lp->height;
+                                               l->bn = BOTTOM;
+                                       }
+                                       break;
+                               case BOTTOM:
+                                       l->bx -= l->speed;
+                                       if (l->bx < 0) {
+                                               l->by = lp->height + l->bx;
+                                               l->bx = 0;
+                                               l->bn = LEFT;
+                                       }
+                                       break;
+                               case LEFT:
+                                       l->by -= l->speed;
+                                       if (l->by < 0) {
+                                               l->bx = -l->bx;
+                                               l->by = 0;
+                                               l->bn = TOP;
+                                       }
+                       }
+               }
+
+               XChangeGC(display, lp->stippledGC, GCForeground, &l->gcv);
+               XDrawLine(display, MI_WINDOW(mi), lp->stippledGC,
+                         lp->cx, lp->cy, l->bx, l->by);
+
+               l->sx[lp->so] = l->bx;
+               l->sy[lp->so] = l->by;
+
+       }
+
+       if (lp->sw < lp->lw)
+               ++lp->sw;
+
+       lp->so = (lp->so + 1) % lp->lw;
+}
+
+void
+draw_laser(ModeInfo * mi)
+{
+       lasersstruct *lp = &lasers[MI_SCREEN(mi)];
+       int         i;
+
+       for (i = 0; i < lp->lr; i++)
+               draw_laser_once(mi);
+
+       if (++lp->time > MI_CYCLES(mi))
+               init_laser(mi);
+}
+
+void
+release_laser(ModeInfo * mi)
+{
+       if (lasers != NULL) {
+               int         screen;
+
+               for (screen = 0; screen < MI_NUM_SCREENS(mi); screen++) {
+                       lasersstruct *lp = &lasers[screen];
+
+                       if (lp->laser != NULL)
+                               (void) free((void *) lp->laser);
+                       if (lp->stippledGC != NULL)
+                               XFreeGC(MI_DISPLAY(mi), lp->stippledGC);
+               }
+               (void) free((void *) lasers);
+               lasers = NULL;
+       }
+}
+
+void
+refresh_laser(ModeInfo * mi)
+{
+       /* Do nothing, it will refresh by itself */
+}
diff --git a/hacks/laser.man b/hacks/laser.man
new file mode 100644 (file)
index 0000000..70cec4e
--- /dev/null
@@ -0,0 +1,64 @@
+.TH XScreenSaver 1 "10-May-97" "X Version 11"
+.SH NAME
+laser - draws vaguely laser-like moving lines
+.SH SYNOPSIS
+.B laser
+[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-ncolors \fIinteger\fP] [\-delay \fImicroseconds\fP] [\-cycles \fIinteger\fP] [\-count \fIinteger\fP]
+
+.SH DESCRIPTION
+The \fIlaser\fP program draws vaguely laser-like moving lines
+.SH OPTIONS
+.I laser
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window.  This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-mono 
+If on a color display, pretend we're on a monochrome display.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use.  Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-ncolors \fIinteger\fP
+How many colors should be used (if possible).  Default 64.
+The colors used cycle through the hue, making N stops around the color wheel.
+.TP 8
+.B \-cycles \fIinteger\fP
+Default 200.
+.TP 8
+.B \-count \fIinteger\fP
+Default 10.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1),
+.BR xlock (1)
+.SH COPYRIGHT
+Copyright \(co 1995 by Pascal Pensa.
+
+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. 
+.SH AUTHOR
+Pascal Pensa <pensa@aurora.unice.fr>, 1995.
+
+Ability to run standalone or with \fIxscreensaver\fP added by 
+Jamie Zawinski <jwz@jwz.org>, 10-May-97.
diff --git a/hacks/lightning.c b/hacks/lightning.c
new file mode 100644 (file)
index 0000000..77be578
--- /dev/null
@@ -0,0 +1,580 @@
+/* -*- Mode: C; tab-width: 4 -*-
+ * lightning --- fractal lightning bolts.
+ */
+#if !defined( lint ) && !defined( SABER )
+static const char sccsid[] = "@(#)lightning.c  4.00 97/01/01 xlockmore";
+#endif
+
+/* Copyright (c) 1996 by Keith Romberg <kromberg@saxe.com>.
+ *
+ * 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.
+ *
+ * This file is provided AS IS with no warranties of any kind.  The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof.  In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * Revision History:
+ * 10-May-97: jwz@jwz.org: turned into a standalone program.
+ * 14-Jul-96: Cleaned up code.
+ * 27-Jun-96: Written and submitted by Keith Romberg <kromberg@saxe.com>.
+ */
+
+#ifdef STANDALONE
+# define PROGCLASS                                     "Lightning"
+# define HACK_INIT                                     init_lightning
+# define HACK_DRAW                                     draw_lightning
+# define lightning_opts                                xlockmore_opts
+# define DEFAULTS      "*delay:                10000 \n"                       \
+                                       "*ncolors:              200   \n"
+# define BRIGHT_COLORS
+# include "xlockmore.h"                                /* from the xscreensaver distribution */
+#else  /* !STANDALONE */
+# include "xlock.h"                                    /* from the xlockmore distribution */
+#endif /* !STANDALONE */
+
+ModeSpecOpt lightning_opts = {
+  0, NULL, 0, NULL, NULL };
+
+/*----------------------------   defines   -------------------------------*/
+
+#define BOLT_NUMBER 4
+#define BOLT_ITERATION 4
+#define LONG_FORK_ITERATION 3
+#define MEDIUM_FORK_ITERATION 2
+#define SMALL_FORK_ITERATION 1
+
+#define WIDTH_VARIATION 30
+#define HEIGHT_VARIATION 15
+
+#define DELAY_TIME_AMOUNT 15
+#define MULTI_DELAY_TIME_BASE 5
+
+#define MAX_WIGGLES 16
+#define WIGGLE_BASE 8
+#define WIGGLE_AMOUNT 14
+
+#define RANDOM_FORK_PROBILITY   4
+
+#define FIRST_LEVEL_STRIKE 0
+#define LEVEL_ONE_STRIKE 1
+#define LEVEL_TWO_STRIKE 2
+
+#define BOLT_VERTICIES ((1<<BOLT_ITERATION)-1)
+  /* BOLT_ITERATION = 4. 2^(BOLT_ITERATION) - 1 = 15 */
+
+#define NUMBER_FORK_VERTICIES 9
+
+#define FLASH_PROBILITY 20
+#define MAX_FLASH_AMOUNT 2     /*  half the total duration of the bolt  */
+
+typedef struct {
+       XPoint      ForkVerticies[NUMBER_FORK_VERTICIES];
+       int         num_used;
+} Fork;
+
+typedef struct {
+       XPoint      end1, end2;
+       XPoint      middle[BOLT_VERTICIES];
+       int         fork_number;
+       int         forks_start[2];
+       Fork        branch[2];
+       int         wiggle_number;
+       int         wiggle_amount;
+       int         delay_time;
+       int         flash;
+       int         flash_begin, flash_stop;
+       int         visible;
+       int         strike_level;
+} Lightning;
+
+typedef struct {
+       Lightning   bolts[BOLT_NUMBER];
+       int         scr_width, scr_height;
+       int         multi_strike;
+       int         give_it_hell;
+       int         draw_time;
+       int         stage;
+       unsigned long color;
+} Storm;
+
+static Storm *Helga = NULL;
+
+/*-------------------   function prototypes  ----------------------------*/
+
+static int  distance(XPoint a, XPoint b);
+
+static int  setup_multi_strike(void);
+static int  flashing_strike(void);
+static void flash_duration(int *start, int *end, int total_duration);
+static void random_storm(Storm * st);
+static void generate(XPoint A, XPoint B, int iter, XPoint * verts, int *index);
+static void create_fork(Fork * f, XPoint start, XPoint end, int level);
+
+static void first_strike(Lightning bolt, ModeInfo * mi);
+static void draw_bolt(Lightning * bolt, ModeInfo * mi);
+static void draw_line(ModeInfo * mi, XPoint * p, int number, GC use, int x_offset);
+static void level1_strike(Lightning bolt, ModeInfo * mi);
+static void level2_strike(Lightning bolt, ModeInfo * mi);
+
+static int  storm_active(Storm * st);
+static void update_bolt(Lightning * bolt, int time);
+static void wiggle_bolt(Lightning * bolt);
+static void wiggle_line(XPoint * p, int number, int wiggle_amount);
+
+/*-------------------------  functions  ---------------------------------*/
+
+static int
+setup_multi_strike(void)
+{
+       int         result, multi_prob;
+
+       multi_prob = NRAND(100);
+
+       if (multi_prob < 50)
+               result = 1;
+       else if ((multi_prob >= 51) && (multi_prob < 75))
+               result = 2;
+       else if ((multi_prob >= 76) && (multi_prob < 92))
+               result = 3;
+       else
+               result = BOLT_NUMBER;   /* 4 */
+
+       return (result);
+}
+
+/*-------------------------------------------------------------------------*/
+
+static int
+flashing_strike(void)
+{
+       int         tmp = NRAND(FLASH_PROBILITY);
+
+       if (tmp <= FLASH_PROBILITY)
+               return (1);
+       return (0);
+}
+
+/*-------------------------------------------------------------------------*/
+
+static void
+flash_duration(int *start, int *end, int total_duration)
+{
+       int         mid, d;
+
+       mid = total_duration / MAX_FLASH_AMOUNT;
+       d = NRAND(total_duration / MAX_FLASH_AMOUNT) / 2;
+       *start = mid - d;
+       *end = mid + d;
+}
+
+/*-------------------------------------------------------------------------*/
+
+static void
+random_storm(Storm * st)
+{
+       int         i, j, tmp;
+       XPoint      p;
+
+       for (i = 0; i < st->multi_strike; i++) {
+               st->bolts[i].end1.x = NRAND(st->scr_width);
+               st->bolts[i].end1.y = 0;
+               st->bolts[i].end2.x = NRAND(st->scr_width);
+               st->bolts[i].end2.y = st->scr_height;
+               st->bolts[i].wiggle_number = WIGGLE_BASE + NRAND(MAX_WIGGLES);
+               if ((st->bolts[i].flash = flashing_strike()))
+                       flash_duration(&(st->bolts[i].flash_begin), &(st->bolts[i].flash_stop),
+                                      st->bolts[i].wiggle_number);
+               else
+                       st->bolts[i].flash_begin = st->bolts[i].flash_stop = 0;
+               st->bolts[i].wiggle_amount = WIGGLE_AMOUNT;
+               if (i == 0)
+                       st->bolts[i].delay_time = NRAND(DELAY_TIME_AMOUNT);
+               else
+                       st->bolts[i].delay_time = NRAND(DELAY_TIME_AMOUNT) +
+                               (MULTI_DELAY_TIME_BASE * i);
+               st->bolts[i].strike_level = FIRST_LEVEL_STRIKE;
+               tmp = 0;
+               generate(st->bolts[i].end1, st->bolts[i].end2, BOLT_ITERATION,
+                        st->bolts[i].middle, &tmp);
+               st->bolts[i].fork_number = 0;
+               st->bolts[i].visible = 0;
+               for (j = 0; j < BOLT_VERTICIES; j++) {
+                       if (st->bolts[i].fork_number >= 2)
+                               break;
+                       if (NRAND(100) < RANDOM_FORK_PROBILITY) {
+                               p.x = NRAND(st->scr_width);
+                               p.y = st->scr_height;
+                               st->bolts[i].forks_start[st->bolts[i].fork_number] = j;
+                               create_fork(&(st->bolts[i].branch[st->bolts[i].fork_number]),
+                                           st->bolts[i].middle[j], p, j);
+                               st->bolts[i].fork_number++;
+                       }
+               }
+       }
+}
+
+static void
+generate(XPoint A, XPoint B, int iter, XPoint * verts, int *index)
+{
+       XPoint      mid;
+
+       mid.x = (A.x + B.x) / 2 + NRAND(WIDTH_VARIATION) - WIDTH_VARIATION / 2;
+       mid.y = (A.y + B.y) / 2 + NRAND(HEIGHT_VARIATION) - HEIGHT_VARIATION / 2;
+
+       if (!iter) {
+               verts[*index].x = mid.x;
+               verts[*index].y = mid.y;
+               (*index)++;
+               return;
+       }
+       generate(A, mid, iter - 1, verts, index);
+       generate(mid, B, iter - 1, verts, index);
+}
+
+/*------------------------------------------------------------------------*/
+
+static void
+create_fork(Fork * f, XPoint start, XPoint end, int level)
+{
+       int         tmp = 1;
+
+       f->ForkVerticies[0].x = start.x;
+       f->ForkVerticies[0].y = start.y;
+
+       if (level <= 6) {
+               generate(start, end, LONG_FORK_ITERATION, f->ForkVerticies, &tmp);
+               f->num_used = 9;
+       } else if ((level > 6) && (level <= 11)) {
+               generate(start, end, MEDIUM_FORK_ITERATION, f->ForkVerticies, &tmp);
+               f->num_used = 5;
+       } else {
+               if (distance(start, end) > 100) {
+                       generate(start, end, MEDIUM_FORK_ITERATION, f->ForkVerticies, &tmp);
+                       f->num_used = 5;
+               } else {
+                       generate(start, end, SMALL_FORK_ITERATION, f->ForkVerticies, &tmp);
+                       f->num_used = 3;
+               }
+       }
+
+       f->ForkVerticies[f->num_used - 1].x = end.x;
+       f->ForkVerticies[f->num_used - 1].y = end.y;
+}
+
+/*------------------------------------------------------------------------*/
+
+static void
+update_bolt(Lightning * bolt, int time)
+{
+       wiggle_bolt(bolt);
+       if ((bolt->wiggle_amount == 0) && (bolt->wiggle_number > 2))
+               bolt->wiggle_number = 0;
+       if (((time % 3) == 0))
+               bolt->wiggle_amount++;
+
+       if (((time >= bolt->delay_time) && (time < bolt->flash_begin)) ||
+           (time > bolt->flash_stop))
+               bolt->visible = 1;
+       else
+               bolt->visible = 0;
+
+       if (time == bolt->delay_time)
+               bolt->strike_level = FIRST_LEVEL_STRIKE;
+       else if (time == (bolt->delay_time + 1))
+               bolt->strike_level = LEVEL_ONE_STRIKE;
+       else if ((time > (bolt->delay_time + 1)) &&
+                (time <= (bolt->delay_time + bolt->flash_begin - 2)))
+               bolt->strike_level = LEVEL_TWO_STRIKE;
+       else if (time == (bolt->delay_time + bolt->flash_begin - 1))
+               bolt->strike_level = LEVEL_ONE_STRIKE;
+       else if (time == (bolt->delay_time + bolt->flash_stop + 1))
+               bolt->strike_level = LEVEL_ONE_STRIKE;
+       else
+               bolt->strike_level = LEVEL_TWO_STRIKE;
+}
+
+/*------------------------------------------------------------------------*/
+
+static void
+draw_bolt(Lightning * bolt, ModeInfo * mi)
+{
+       if (bolt->visible) {
+               if (bolt->strike_level == FIRST_LEVEL_STRIKE)
+                       first_strike(*bolt, mi);
+               else if (bolt->strike_level == LEVEL_ONE_STRIKE)
+                       level1_strike(*bolt, mi);
+               else
+                       level2_strike(*bolt, mi);
+       }
+}
+
+/*------------------------------------------------------------------------*/
+
+static void
+first_strike(Lightning bolt, ModeInfo * mi)
+{
+       Display    *display = MI_DISPLAY(mi);
+       Window      window = MI_WINDOW(mi);
+       GC          gc = MI_GC(mi);
+       int         i;
+
+       XSetForeground(display, gc, MI_WIN_WHITE_PIXEL(mi));
+       XDrawLine(display, window, gc,
+              bolt.end1.x, bolt.end1.y, bolt.middle[0].x, bolt.middle[0].y);
+       draw_line(mi, bolt.middle, BOLT_VERTICIES, gc, 0);
+       XDrawLine(display, window, gc,
+       bolt.middle[BOLT_VERTICIES - 1].x, bolt.middle[BOLT_VERTICIES - 1].y,
+                 bolt.end2.x, bolt.end2.y);
+
+       for (i = 0; i < bolt.fork_number; i++)
+               draw_line(mi, bolt.branch[i].ForkVerticies, bolt.branch[i].num_used,
+                         gc, 0);
+}
+
+/*------------------------------------------------------------------------*/
+
+static void
+draw_line(ModeInfo * mi, XPoint * points, int number, GC to_use, int offset)
+{
+       int         i;
+
+       for (i = 0; i < number - 1; i++) {
+               if (points[i].y <= points[i + 1].y)
+                       XDrawLine(MI_DISPLAY(mi), MI_WINDOW(mi), to_use, points[i].x + offset,
+                                 points[i].y, points[i + 1].x + offset, points[i + 1].y);
+               else {
+                       if (points[i].x < points[i + 1].x)
+                               XDrawLine(MI_DISPLAY(mi), MI_WINDOW(mi), to_use, points[i].x +
+                                         offset, points[i].y + offset, points[i + 1].x + offset,
+                                         points[i + 1].y + offset);
+                       else
+                               XDrawLine(MI_DISPLAY(mi), MI_WINDOW(mi), to_use, points[i].x -
+                                         offset, points[i].y + offset, points[i + 1].x - offset,
+                                         points[i + 1].y + offset);
+               }
+       }
+}
+
+/*------------------------------------------------------------------------*/
+
+static void
+level1_strike(Lightning bolt, ModeInfo * mi)
+{
+       Display    *display = MI_DISPLAY(mi);
+       Window      window = MI_WINDOW(mi);
+       Storm      *st = &Helga[MI_SCREEN(mi)];
+       GC          gc = MI_GC(mi);
+       int         i;
+
+       if (MI_NPIXELS(mi) > 2) /* color */
+               XSetForeground(display, gc, MI_PIXEL(mi, st->color));
+       else
+               XSetForeground(display, gc, MI_WIN_WHITE_PIXEL(mi));
+       XDrawLine(display, window, gc,
+       bolt.end1.x - 1, bolt.end1.y, bolt.middle[0].x - 1, bolt.middle[0].y);
+       draw_line(mi, bolt.middle, BOLT_VERTICIES, gc, -1);
+       XDrawLine(display, window, gc,
+                 bolt.middle[BOLT_VERTICIES - 1].x - 1,
+           bolt.middle[BOLT_VERTICIES - 1].y, bolt.end2.x - 1, bolt.end2.y);
+       XDrawLine(display, window, gc,
+       bolt.end1.x + 1, bolt.end1.y, bolt.middle[0].x + 1, bolt.middle[0].y);
+       draw_line(mi, bolt.middle, BOLT_VERTICIES, gc, 1);
+       XDrawLine(display, window, gc,
+                 bolt.middle[BOLT_VERTICIES - 1].x + 1,
+           bolt.middle[BOLT_VERTICIES - 1].y, bolt.end2.x + 1, bolt.end2.y);
+
+       for (i = 0; i < bolt.fork_number; i++) {
+               draw_line(mi, bolt.branch[i].ForkVerticies, bolt.branch[i].num_used,
+                         gc, -1);
+               draw_line(mi, bolt.branch[i].ForkVerticies, bolt.branch[i].num_used,
+                         gc, 1);
+       }
+       first_strike(bolt, mi);
+}
+
+/*------------------------------------------------------------------------*/
+
+static int
+distance(XPoint a, XPoint b)
+{
+       return ((int) sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y)));
+}
+
+/*------------------------------------------------------------------------*/
+
+static void
+level2_strike(Lightning bolt, ModeInfo * mi)
+{
+       Display    *display = MI_DISPLAY(mi);
+       Window      window = MI_WINDOW(mi);
+       Storm      *st = &Helga[MI_SCREEN(mi)];
+       GC          gc = MI_GC(mi);
+       int         i;
+
+       /* This was originally designed to be a little darker then the
+          level1 strike.  This was changed to get it to work on
+          multiscreens and to add more color variety.   I tried
+          stippling but it did not look good. */
+       if (MI_NPIXELS(mi) > 2)
+               XSetForeground(display, gc, MI_PIXEL(mi, st->color));
+       else
+               XSetForeground(display, gc, MI_WIN_WHITE_PIXEL(mi));
+       XDrawLine(display, window, gc,
+       bolt.end1.x - 2, bolt.end1.y, bolt.middle[0].x - 2, bolt.middle[0].y);
+       draw_line(mi, bolt.middle, BOLT_VERTICIES, gc, -2);
+       XDrawLine(display, window, gc,
+                 bolt.middle[BOLT_VERTICIES - 1].x - 2,
+           bolt.middle[BOLT_VERTICIES - 1].y, bolt.end2.x - 2, bolt.end2.y);
+
+       XDrawLine(display, window, gc,
+       bolt.end1.x + 2, bolt.end1.y, bolt.middle[0].x + 2, bolt.middle[0].y);
+       draw_line(mi, bolt.middle, BOLT_VERTICIES, gc, 2);
+       XDrawLine(display, window, gc,
+                 bolt.middle[BOLT_VERTICIES - 1].x + 2,
+           bolt.middle[BOLT_VERTICIES - 1].y, bolt.end2.x + 2, bolt.end2.y);
+
+       for (i = 0; i < bolt.fork_number; i++) {
+               draw_line(mi, bolt.branch[i].ForkVerticies, bolt.branch[i].num_used,
+                         gc, -2);
+               draw_line(mi, bolt.branch[i].ForkVerticies, bolt.branch[i].num_used,
+                         gc, 2);
+       }
+       level1_strike(bolt, mi);
+}
+
+/*------------------------------------------------------------------------*/
+
+static int
+storm_active(Storm * st)
+{
+       int         i, atleast_1 = 0;
+
+       for (i = 0; i < st->multi_strike; i++)
+               if (st->bolts[i].wiggle_number > 0)
+                       atleast_1++;
+
+       return (atleast_1);
+}
+
+/*------------------------------------------------------------------------*/
+
+static void
+wiggle_bolt(Lightning * bolt)
+{
+       int         i;
+
+       wiggle_line(bolt->middle, BOLT_VERTICIES, bolt->wiggle_amount);
+       bolt->end2.x += NRAND(bolt->wiggle_amount) - bolt->wiggle_amount / 2;
+       bolt->end2.y += NRAND(bolt->wiggle_amount) - bolt->wiggle_amount / 2;
+
+       for (i = 0; i < bolt->fork_number; i++) {
+               wiggle_line(bolt->branch[i].ForkVerticies, bolt->branch[i].num_used,
+                           bolt->wiggle_amount);
+               bolt->branch[i].ForkVerticies[0].x = bolt->middle[bolt->forks_start[i]].x;
+               bolt->branch[i].ForkVerticies[0].y = bolt->middle[bolt->forks_start[i]].y;
+       }
+
+       if (bolt->wiggle_amount > 1)
+               bolt->wiggle_amount -= 1;
+       else
+               bolt->wiggle_amount = 0;
+}
+
+/*------------------------------------------------------------------------*/
+
+static void
+wiggle_line(XPoint * p, int number, int amount)
+{
+       int         i;
+
+       for (i = 0; i < number; i++) {
+               p[i].x += NRAND(amount) - amount / 2;
+               p[i].y += NRAND(amount) - amount / 2;
+       }
+}
+
+/*------------------------------------------------------------------------*/
+
+void
+init_lightning(ModeInfo * mi)
+{
+       Storm      *st;
+
+       if (Helga == NULL) {
+               if ((Helga = (Storm *) calloc(MI_NUM_SCREENS(mi),
+                                             sizeof (Storm))) == NULL)
+                       return;
+       }
+       st = &Helga[MI_SCREEN(mi)];
+
+       st->scr_width = MI_WIN_WIDTH(mi);
+       st->scr_height = MI_WIN_HEIGHT(mi);
+
+       st->multi_strike = setup_multi_strike();
+       random_storm(st);
+       st->stage = 0;
+}
+
+/*------------------------------------------------------------------------*/
+
+void
+draw_lightning(ModeInfo * mi)
+{
+       Storm      *st = &Helga[MI_SCREEN(mi)];
+       int         i;
+
+       switch (st->stage) {
+               case 0:
+                       XClearWindow(MI_DISPLAY(mi), MI_WINDOW(mi));
+                       st->color = NRAND(MI_NPIXELS(mi));
+                       st->draw_time = 0;
+                       if (storm_active(st))
+                               st->stage++;
+                       else
+                               st->stage = 3;
+                       break;
+               case 1:
+                       for (i = 0; i < st->multi_strike; i++) {
+                               if (st->bolts[i].visible)
+                                       draw_bolt(&(st->bolts[i]), mi);
+                               update_bolt(&(st->bolts[i]), st->draw_time);
+                       }
+                       st->draw_time++;
+                       XFlush(MI_DISPLAY(mi));
+                       MI_PAUSE(mi) = 60000;
+                       st->stage++;
+                       break;
+               case 2:
+                       XClearWindow(MI_DISPLAY(mi), MI_WINDOW(mi));
+                       if (storm_active(st))
+                               st->stage = 1;
+                       else
+                               st->stage++;
+                       break;
+               case 3:
+                       MI_PAUSE(mi) = 1000000;
+                       init_lightning(mi);
+                       break;
+       }
+}
+
+void
+release_lightning(ModeInfo * mi)
+{
+       if (Helga != NULL) {
+               (void) free((void *) Helga);
+               Helga = NULL;
+       }
+}
+
+void
+refresh_lightning(ModeInfo * mi)
+{
+       /* Do nothing, it will refresh by itself */
+}
diff --git a/hacks/lightning.man b/hacks/lightning.man
new file mode 100644 (file)
index 0000000..786ee99
--- /dev/null
@@ -0,0 +1,58 @@
+.TH XScreenSaver 1 "10-May-97" "X Version 11"
+.SH NAME
+lightning - draws fractal lightning bolts
+.SH SYNOPSIS
+.B lightning
+[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-ncolors \fIinteger\fP] [\-delay \fImicroseconds\fP]
+
+.SH DESCRIPTION
+The \fIlightning\fP program draws fractal lightning bolts
+.SH OPTIONS
+.I lightning
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window.  This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-mono 
+If on a color display, pretend we're on a monochrome display.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use.  Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-ncolors \fIinteger\fP
+How many colors should be used (if possible).  Default 64.
+The colors are chosen randomly.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1),
+.BR xlock (1)
+.SH COPYRIGHT
+Copyright \(co 1996 by Keith Romberg.
+
+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. 
+.SH AUTHOR
+Keith Romberg <kromberg@saxe.com>, 27-Jun-96.
+
+Ability to run standalone or with \fIxscreensaver\fP added by 
+Jamie Zawinski <jwz@jwz.org>, 10-May-97.
diff --git a/hacks/link_axp.com b/hacks/link_axp.com
new file mode 100644 (file)
index 0000000..58ce031
--- /dev/null
@@ -0,0 +1,109 @@
+$! We fisrt test the version of DECW/Motif ; if 1.2 we need to link with new
+$! X11R5 libraries
+$@sys$update:decw$get_image_version sys$share:decw$xlibshr.exe decw$version
+$ if f$extract(4,3,decw$version).eqs."1.2"
+$ then
+$! DECW/Motif 1.2 : link with X11R5 libraries
+$ link/exe=attraction.exe   screenhack,attraction,vms_axp_12.opt/opt
+$ link/exe=blitspin.exe     screenhack,blitspin,vms_axp_12.opt/opt
+$ link/exe=bouboule.exe     screenhack-xlock,bouboule,xlockmore,vms_axp_12.opt/opt
+$ link/exe=braid.exe        screenhack-xlock,braid,xlockmore,vms_axp_12.opt/opt
+$ link/exe=bubbles.exe      screenhack,bubbles,bubbles_default,vms_axp_12.opt/opt
+$ link/exe=coral.exe        screenhack,coral,vms_axp_12.opt/opt
+$ link/exe=decayscreen.exe  screenhack,decayscreen,vms_axp_12.opt/opt
+$ link/exe=deco.exe         screenhack,deco,vms_axp_12.opt/opt
+$ link/exe=drift.exe        screenhack-xlock,drift,xlockmore,vms_axp_12.opt/opt
+$ link/exe=fadeplot.exe     screenhack-xlock,fadeplot,xlockmore,vms_axp_12.opt/opt
+$ link/exe=flag.exe         screenhack-xlock,flag,xlockmore,vms_axp_12.opt/opt
+$ link/exe=flame.exe        screenhack,flame,vms_axp_12.opt/opt
+$ link/exe=forest.exe       screenhack-xlock,forest,xlockmore,vms_axp_12.opt/opt
+$ link/exe=vines.exe        screenhack-xlock,vines,xlockmore,vms_axp_12.opt/opt
+$ link/exe=galaxy.exe       screenhack-xlock,galaxy,xlockmore,vms_axp_12.opt/opt
+$ link/exe=grav.exe         screenhack-xlock,grav,xlockmore,vms_axp_12.opt/opt
+$ link/exe=greynetic        screenhack,greynetic,vms_axp_12.opt/opt
+$ link/exe=halo.exe         screenhack,halo,vms_axp_12.opt/opt
+$ link/exe=helix.exe        screenhack,helix,vms_axp_12.opt/opt
+$ link/exe=hopalong.exe     screenhack-xlock,hopalong,xlockmore,vms_axp_12.opt/opt
+$ link/exe=hypercube.exe    screenhack,hypercube,vms_axp_12.opt/opt
+$ link/exe=ifs.exe          screenhack-xlock,ifs,xlockmore,vms_axp_12.opt/opt
+$ link/exe=imsmap.exe       screenhack,imsmap,vms_axp_12.opt/opt
+$ link/exe=julia.exe        screenhack-xlock,julia,xlockmore,vms_axp_12.opt/opt
+$ link/exe=kaleidescope.exe screenhack,kaleidescope,vms_axp_12.opt/opt
+$ link/exe=laser.exe        screenhack-xlock,laser,xlockmore,vms_axp_12.opt/opt
+$ link/exe=lightning.exe    screenhack-xlock,lightning,xlockmore,vms_axp_12.opt/opt
+$ link/exe=lisa.exe         screenhack-xlock,lisa,xlockmore,vms_axp_12.opt/opt
+$ link/exe=lmorph.exe       screenhack,lmorph,vms_axp_12.opt/opt
+$ link/exe=maze.exe         screenhack,maze,vms_axp_12.opt/opt
+$ link/exe=moire.exe        screenhack,moire,vms_axp_12.opt/opt
+$ link/exe=noseguy.exe      screenhack,noseguy,vms_axp_12.opt/opt
+$ link/exe=pedal.exe        screenhack,pedal,vms_axp_12.opt/opt
+$ link/exe=penrose.exe      screenhack-xlock,penrose,xlockmore,vms_axp_12.opt/opt
+$ link/exe=pyro.exe         screenhack,pyro,vms_axp_12.opt/opt
+$ link/exe=qix.exe          screenhack,qix,vms_axp_12.opt/opt
+$ link/exe=rd-bomb.exe      screenhack,rd-bomb,vms_axp_12.opt/opt
+$ link/exe=rocks.exe        screenhack,rocks,vms_axp_12.opt/opt
+$ link/exe=rorschach.exe    screenhack,rorschach,vms_axp_12.opt/opt
+$ link/exe=sierpinski.exe   screenhack-xlock,sierpinski,xlockmore,vms_axp_12.opt/opt
+$ link/exe=slidescreen.exe  screenhack,slidescreen,vms_axp_12.opt/opt
+$ link/exe=slip.exe         screenhack-xlock,slip,xlockmore,vms_axp_12.opt/opt
+$ link/exe=sphere.exe       screenhack-xlock,sphere,xlockmore,vms_axp_12.opt/opt
+$ link/exe=spiral.exe       screenhack-xlock,spiral,xlockmore,vms_axp_12.opt/opt
+$ link/exe=strange.exe      screenhack-xlock,strange,xlockmore,vms_axp_12.opt/opt
+$ link/exe=swirl.exe        screenhack-xlock,swirl,xlockmore,vms_axp_12.opt/opt
+$ link/exe=xroger.exe       screenhack,xroger-hack,vms_axp_12.opt/opt
+$ link/exe=goop.exe         screenhack,goop,vms_axp_12.opt/opt
+$ link/exe=starfish.exe     screenhack,starfish,vms_axp_12.opt/opt
+$ link/exe=munch.exe        screenhack,munch,vms_axp_12.opt/opt
+$ else
+$! Else, link with X11R4 libraries
+$ link/exe=attraction.exe   screenhack,attraction,vms_axp.opt/opt
+$ link/exe=blitspin.exe     screenhack,blitspin,vms_axp.opt/opt
+$ link/exe=bouboule.exe     screenhack-xlock,bouboule,xlockmore,vms_axp.opt/opt
+$ link/exe=braid.exe        screenhack-xlock,braid,xlockmore,vms_axp.opt/opt
+$ link/exe=bubbles.exe      screenhack,bubbles,bubbles_default,vms_axp.opt/opt
+$ link/exe=coral.exe        screenhack,coral,vms_axp.opt/opt
+$ link/exe=decayscreen.exe  screenhack,decayscreen,vms_axp.opt/opt
+$ link/exe=deco.exe         screenhack,deco,vms_axp.opt/opt
+$ link/exe=drift.exe        screenhack-xlock,drift,xlockmore,vms_axp.opt/opt
+$ link/exe=fadeplot.exe     screenhack-xlock,fadeplot,xlockmore,vms_axp.opt/opt
+$ link/exe=flag.exe         screenhack-xlock,flag,xlockmore,vms_axp.opt/opt
+$ link/exe=flame.exe        screenhack,flame,vms_axp.opt/opt
+$ link/exe=forest.exe       screenhack-xlock,forest,xlockmore,vms_axp.opt/opt
+$ link/exe=vines.exe        screenhack-xlock,vines,xlockmore,vms_axp.opt/opt
+$ link/exe=galaxy.exe       screenhack-xlock,galaxy,xlockmore,vms_axp.opt/opt
+$ link/exe=grav.exe         screenhack-xlock,grav,xlockmore,vms_axp.opt/opt
+$ link/exe=greynetic        screenhack,greynetic,vms_axp.opt/opt
+$ link/exe=halo.exe         screenhack,halo,vms_axp.opt/opt
+$ link/exe=helix.exe        screenhack,helix,vms_axp.opt/opt
+$ link/exe=hopalong.exe     screenhack-xlock,hopalong,xlockmore,vms_axp.opt/opt
+$ link/exe=hypercube.exe    screenhack,hypercube,vms_axp.opt/opt
+$ link/exe=ifs.exe          screenhack-xlock,ifs,xlockmore,vms_axp.opt/opt
+$ link/exe=imsmap.exe       screenhack,imsmap,vms_axp.opt/opt
+$ link/exe=julia.exe        screenhack-xlock,julia,xlockmore,vms_axp.opt/opt
+$ link/exe=kaleidescope.exe screenhack,kaleidescope,vms_axp.opt/opt
+$ link/exe=laser.exe        screenhack-xlock,laser,xlockmore,vms_axp.opt/opt
+$ link/exe=lightning.exe    screenhack-xlock,lightning,xlockmore,vms_axp.opt/opt
+$ link/exe=lisa.exe         screenhack-xlock,lisa,xlockmore,vms_axp.opt/opt
+$ link/exe=lmorph.exe       screenhack,lmorph,vms_axp.opt/opt
+$ link/exe=maze.exe         screenhack,maze,vms_axp.opt/opt
+$ link/exe=moire.exe        screenhack,moire,vms_axp.opt/opt
+$ link/exe=noseguy.exe      screenhack,noseguy,vms_axp.opt/opt
+$ link/exe=pedal.exe        screenhack,pedal,vms_axp.opt/opt
+$ link/exe=penrose.exe      screenhack-xlock,penrose,xlockmore,vms_axp.opt/opt
+$ link/exe=pyro.exe         screenhack,pyro,vms_axp.opt/opt
+$ link/exe=qix.exe          screenhack,qix,vms_axp.opt/opt
+$ link/exe=rd-bomb.exe      screenhack,rd-bomb,vms_axp.opt/opt
+$ link/exe=rocks.exe        screenhack,rocks,vms_axp.opt/opt
+$ link/exe=rorschach.exe    screenhack,rorschach,vms_axp.opt/opt
+$ link/exe=sierpinski.exe   screenhack-xlock,sierpinski,xlockmore,vms_axp.opt/opt
+$ link/exe=slidescreen.exe  screenhack,slidescreen,vms_axp.opt/opt
+$ link/exe=slip.exe         screenhack-xlock,slip,xlockmore,vms_axp.opt/opt
+$ link/exe=sphere.exe       screenhack-xlock,sphere,xlockmore,vms_axp.opt/opt
+$ link/exe=spiral.exe       screenhack-xlock,spiral,xlockmore,vms_axp.opt/opt
+$ link/exe=strange.exe      screenhack-xlock,strange,xlockmore,vms_axp.opt/opt
+$ link/exe=swirl.exe        screenhack-xlock,swirl,xlockmore,vms_axp.opt/opt
+$ link/exe=xroger.exe       screenhack,xroger-hack,vms_axp.opt/opt
+$ link/exe=goop.exe         screenhack,goop,vms_axp.opt/opt
+$ link/exe=starfish.exe     screenhack,starfish,vms_axp.opt/opt
+$ link/exe=munch.exe        screenhack,munch,vms_axp.opt/opt
+$ endif
diff --git a/hacks/link_decc.com b/hacks/link_decc.com
new file mode 100644 (file)
index 0000000..3e001cd
--- /dev/null
@@ -0,0 +1,109 @@
+$! We fisrt test the version of DECW/Motif ; if 1.2 we need to link with new
+$! X11R5 libraries
+$@sys$update:decw$get_image_version sys$share:decw$xlibshr.exe decw$version
+$ if f$extract(4,3,decw$version).eqs."1.2"
+$ then
+$! DECW/Motif 1.2 : link with X11R5 libraries
+$ link/exe=attraction.exe   screenhack,attraction,vms_decc_12.opt/opt
+$ link/exe=blitspin.exe     screenhack,blitspin,vms_decc_12.opt/opt
+$ link/exe=bouboule.exe     screenhack-xlock,bouboule,xlockmore,vms_decc_12.opt/opt
+$ link/exe=braid.exe        screenhack-xlock,braid,xlockmore,vms_decc_12.opt/opt
+$ link/exe=bubbles.exe      screenhack,bubbles,bubbles_default,vms_decc_12.opt/opt
+$ link/exe=coral.exe        screenhack,coral,vms_decc_12.opt/opt
+$ link/exe=decayscreen.exe  screenhack,decayscreen,vms_decc_12.opt/opt
+$ link/exe=deco.exe         screenhack,deco,vms_decc_12.opt/opt
+$ link/exe=drift.exe        screenhack-xlock,drift,xlockmore,vms_decc_12.opt/opt
+$ link/exe=fadeplot.exe     screenhack-xlock,fadeplot,xlockmore,vms_decc_12.opt/opt
+$ link/exe=flag.exe         screenhack-xlock,flag,xlockmore,vms_decc_12.opt/opt
+$ link/exe=flame.exe        screenhack,flame,vms_decc_12.opt/opt
+$ link/exe=forest.exe       screenhack-xlock,forest,xlockmore,vms_decc_12.opt/opt
+$ link/exe=vines.exe        screenhack-xlock,vines,xlockmore,vms_decc_12.opt/opt
+$ link/exe=galaxy.exe       screenhack-xlock,galaxy,xlockmore,vms_decc_12.opt/opt
+$ link/exe=grav.exe         screenhack-xlock,grav,xlockmore,vms_decc_12.opt/opt
+$ link/exe=greynetic        screenhack,greynetic,vms_decc_12.opt/opt
+$ link/exe=halo.exe         screenhack,halo,vms_decc_12.opt/opt
+$ link/exe=helix.exe        screenhack,helix,vms_decc_12.opt/opt
+$ link/exe=hopalong.exe     screenhack-xlock,hopalong,xlockmore,vms_decc_12.opt/opt
+$ link/exe=hypercube.exe    screenhack,hypercube,vms_decc_12.opt/opt
+$ link/exe=ifs.exe          screenhack-xlock,ifs,xlockmore,vms_decc_12.opt/opt
+$ link/exe=imsmap.exe       screenhack,imsmap,vms_decc_12.opt/opt
+$ link/exe=julia.exe        screenhack-xlock,julia,xlockmore,vms_decc_12.opt/opt
+$ link/exe=kaleidescope.exe screenhack,kaleidescope,vms_decc_12.opt/opt
+$ link/exe=laser.exe        screenhack-xlock,laser,xlockmore,vms_decc_12.opt/opt
+$ link/exe=lightning.exe    screenhack-xlock,lightning,xlockmore,vms_decc_12.opt/opt
+$ link/exe=lisa.exe         screenhack-xlock,lisa,xlockmore,vms_decc_12.opt/opt
+$ link/exe=lmorph.exe       screenhack,lmorph,vms_decc_12.opt/opt
+$ link/exe=maze.exe         screenhack,maze,vms_decc_12.opt/opt
+$ link/exe=moire.exe        screenhack,moire,vms_decc_12.opt/opt
+$ link/exe=noseguy.exe      screenhack,noseguy,vms_decc_12.opt/opt
+$ link/exe=pedal.exe        screenhack,pedal,vms_decc_12.opt/opt
+$ link/exe=penrose.exe      screenhack-xlock,penrose,xlockmore,vms_decc_12.opt/opt
+$ link/exe=pyro.exe         screenhack,pyro,vms_decc_12.opt/opt
+$ link/exe=qix.exe          screenhack,qix,vms_decc_12.opt/opt
+$ link/exe=rd-bomb.exe      screenhack,rd-bombs,vms_decc_12.opt/opt
+$ link/exe=rocks.exe        screenhack,rocks,vms_decc_12.opt/opt
+$ link/exe=rorschach.exe    screenhack,rorschach,vms_decc_12.opt/opt
+$ link/exe=sierpinski.exe   screenhack-xlock,sierpinski,xlockmore,vms_decc_12.opt/opt
+$ link/exe=slidescreen.exe  screenhack,slidescreen,vms_decc_12.opt/opt
+$ link/exe=slip.exe         screenhack-xlock,slip,xlockmore,vms_decc_12.opt/opt
+$ link/exe=sphere.exe       screenhack-xlock,sphere,xlockmore,vms_decc_12.opt/opt
+$ link/exe=spiral.exe       screenhack-xlock,spiral,xlockmore,vms_decc_12.opt/opt
+$ link/exe=strange.exe      screenhack-xlock,strange,xlockmore,vms_decc_12.opt/opt
+$ link/exe=swirl.exe        screenhack-xlock,swirl,xlockmore,vms_decc_12.opt/opt
+$ link/exe=xroger.exe       screenhack,xroger-hack,vms_decc_12.opt/opt
+$ link/exe=goop.exe         screenhack,goop,vms_decc_12.opt/opt
+$ link/exe=starfish.exe     screenhack,starfish,vms_decc_12.opt/opt
+$ link/exe=munch.exe        screenhack,munch,vms_decc_12.opt/opt
+$ else
+$! Else, link with X11R4 libraries
+$ link/exe=attraction.exe   screenhack,attraction,vms_decc.opt/opt
+$ link/exe=blitspin.exe     screenhack,blitspin,vms_decc.opt/opt
+$ link/exe=bouboule.exe     screenhack-xlock,bouboule,xlockmore,vms_decc.opt/opt
+$ link/exe=braid.exe        screenhack-xlock,braid,xlockmore,vms_decc.opt/opt
+$ link/exe=bubbles.exe      screenhack,bubbles,bubbles_default,vms_decc.opt/opt
+$ link/exe=coral.exe        screenhack,coral,vms_decc.opt/opt
+$ link/exe=decayscreen.exe  screenhack,decayscreen,vms_decc.opt/opt
+$ link/exe=deco.exe         screenhack,deco,vms_decc.opt/opt
+$ link/exe=drift.exe        screenhack-xlock,drift,xlockmore,vms_decc.opt/opt
+$ link/exe=fadeplot.exe     screenhack-xlock,fadeplot,xlockmore,vms_decc.opt/opt
+$ link/exe=flag.exe         screenhack-xlock,flag,xlockmore,vms_decc.opt/opt
+$ link/exe=flame.exe        screenhack,flame,vms_decc.opt/opt
+$ link/exe=forest.exe       screenhack-xlock,forest,xlockmore,vms_decc.opt/opt
+$ link/exe=vines.exe        screenhack-xlock,vines,xlockmore,vms_decc.opt/opt
+$ link/exe=galaxy.exe       screenhack-xlock,galaxy,xlockmore,vms_decc.opt/opt
+$ link/exe=grav.exe         screenhack-xlock,grav,xlockmore,vms_decc.opt/opt
+$ link/exe=greynetic        screenhack,greynetic,vms_decc.opt/opt
+$ link/exe=halo.exe         screenhack,halo,vms_decc.opt/opt
+$ link/exe=helix.exe        screenhack,helix,vms_decc.opt/opt
+$ link/exe=hopalong.exe     screenhack-xlock,hopalong,xlockmore,vms_decc.opt/opt
+$ link/exe=hypercube.exe    screenhack,hypercube,vms_decc.opt/opt
+$ link/exe=ifs.exe          screenhack-xlock,ifs,xlockmore,vms_decc.opt/opt
+$ link/exe=imsmap.exe       screenhack,imsmap,vms_decc.opt/opt
+$ link/exe=julia.exe        screenhack-xlock,julia,xlockmore,vms_decc.opt/opt
+$ link/exe=kaleidescope.exe screenhack,kaleidescope,vms_decc.opt/opt
+$ link/exe=laser.exe        screenhack-xlock,laser,xlockmore,vms_decc.opt/opt
+$ link/exe=lightning.exe    screenhack-xlock,lightning,xlockmore,vms_decc.opt/opt
+$ link/exe=lisa.exe         screenhack-xlock,lisa,xlockmore,vms_decc.opt/opt
+$ link/exe=lmorph.exe       screenhack,lmorph,vms_decc.opt/opt
+$ link/exe=maze.exe         screenhack,maze,vms_decc.opt/opt
+$ link/exe=moire.exe        screenhack,moire,vms_decc.opt/opt
+$ link/exe=noseguy.exe      screenhack,noseguy,vms_decc.opt/opt
+$ link/exe=pedal.exe        screenhack,pedal,vms_decc.opt/opt
+$ link/exe=penrose.exe      screenhack-xlock,penrose,xlockmore,vms_decc.opt/opt
+$ link/exe=pyro.exe         screenhack,pyro,vms_decc.opt/opt
+$ link/exe=qix.exe          screenhack,qix,vms_decc.opt/opt
+$ link/exe=rd-bombs.exe     screenhack,rd-bombs,vms_decc.opt/opt
+$ link/exe=rocks.exe        screenhack,rocks,vms_decc.opt/opt
+$ link/exe=rorschach.exe    screenhack,rorschach,vms_decc.opt/opt
+$ link/exe=sierpinski.exe   screenhack-xlock,sierpinski,xlockmore,vms_decc.opt/opt
+$ link/exe=slidescreen.exe  screenhack,slidescreen,vms_decc.opt/opt
+$ link/exe=slip.exe         screenhack-xlock,slip,xlockmore,vms_decc.opt/opt
+$ link/exe=sphere.exe       screenhack-xlock,sphere,xlockmore,vms_decc.opt/opt
+$ link/exe=spiral.exe       screenhack-xlock,spiral,xlockmore,vms_decc.opt/opt
+$ link/exe=strange.exe      screenhack-xlock,strange,xlockmore,vms_decc.opt/opt
+$ link/exe=swirl.exe        screenhack-xlock,swirl,xlockmore,vms_decc.opt/opt
+$ link/exe=xroger.exe       screenhack,xroger-hack,vms_decc.opt/opt
+$ link/exe=goop.exe         screenhack,goop,vms_decc.opt/opt
+$ link/exe=starfish.exe     screenhack,starfish,vms_decc.opt/opt
+$ link/exe=munch.exe        screenhack,munch,vms_decc.opt/opt
+$ endif
diff --git a/hacks/lisa.c b/hacks/lisa.c
new file mode 100644 (file)
index 0000000..af680ea
--- /dev/null
@@ -0,0 +1,485 @@
+/* -*- Mode: C; tab-width: 4 -*- */
+/* lisa --- animated full-loop lisajous figures */
+
+#if !defined( lint ) && !defined( SABER )
+static const char sccsid[] = "@(#)lisa.c       4.04 97/07/28 xlockmore";
+#endif
+
+/* Copyright (c) 1997 by Caleb Cullen.
+ *
+ * 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.
+ *
+ * This file is provided AS IS with no warranties of any kind.  The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof.  In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * Revision History:
+ * 10-May-97: Compatible with xscreensaver
+ *
+ * The inspiration for this program, Lasp, was written by Adam B. Roach 
+ * in 1990, assisted by me, Caleb Cullen.  It was written first in C, then
+ * in assembly, and used pre-calculated data tables to graph lisajous
+ * figures on 386 machines and lower.  This version bears only superficial
+ * resemblances to the original Lasp.
+ *
+ * The `lissie' module's source code was studied as an example of how
+ * to incorporate a new module into xlock.  Resemblances to it are
+ * expected, but not intended to be plaigiaristic.
+ */
+
+#ifdef STANDALONE
+# define PROGCLASS                                     "Lisa"
+# define HACK_INIT                                     init_lisa
+# define HACK_DRAW                                     draw_lisa
+# define lisa_opts                                     xlockmore_opts
+# define DEFAULTS      "*delay:                25000   \n"                     \
+                                       "*count:                1       \n"                     \
+                                       "*cycles:               256     \n"                     \
+                                       "*size:                 -1      \n"                     \
+                                       "*ncolors:              200     \n"
+# define UNIFORM_COLORS
+# include "xlockmore.h"                                /* from the xscreensaver distribution */
+  void refresh_lisa(ModeInfo * mi);
+  void change_lisa(ModeInfo * mi);
+#else  /* !STANDALONE */
+# include "xlock.h"                                    /* from the xlockmore distribution */
+#endif /* !STANDALONE */
+
+#define  DEF_ADDITIVE     "True"
+
+static Bool additive;
+
+static XrmOptionDescRec lisa_xrm_opts[] =
+{
+       {"-additive", ".lisa.additive", XrmoptionNoArg, (caddr_t) "True"},
+       {"+additive", ".lisa.additive", XrmoptionNoArg, (caddr_t) "False"}
+};
+
+static argtype lisa_vars[] =
+{
+       {(caddr_t *) & additive, "additive", "Additive", DEF_ADDITIVE, t_Bool}
+};
+
+static OptionStruct lisa_vars_desc[] =
+{
+       {"-/+additive", "turn on/off additive functions mode"}
+};
+
+ModeSpecOpt lisa_opts =
+{2, lisa_xrm_opts, 1, lisa_vars, lisa_vars_desc};
+
+
+#define  DRAWLINES    1
+#define  TWOLOOPS     1
+#define  XVMAX        10       /* Maximum velocities */
+#define  YVMAX        10
+#define  LISAMAXFUNCS 2
+#define  NUMSTDFUNCS  10
+#define  MAXCYCLES    3
+#define  MINLISAS 1
+#define  lisasetcolor() \
+if (MI_NPIXELS(mi) > 2) { \
+  XSetForeground(MI_DISPLAY(mi), MI_GC(mi), MI_PIXEL(mi, loop->color)); \
+  if (++(loop->color) >= MI_NPIXELS(mi)) { loop->color=0; } \
+  } else { XSetForeground(MI_DISPLAY(mi), MI_GC(mi), MI_WIN_WHITE_PIXEL(mi)); }
+#define getRadius(context) \
+  ((context->width > context->height)?context->height:context->width) * 3 / 8
+#define checkRadius(loop, context) \
+  if ((context->height / 2 > MI_SIZE(mi)) && (context->width / 2 > MI_SIZE(mi))) \
+      loop->radius = MI_SIZE(mi); \
+  if ((loop->radius < 0) || \
+      (loop->radius > loop->center.x) || \
+      (loop->radius > loop->center.y)) loop->radius = getRadius(context)
+
+
+typedef struct lisafunc_struct {
+       double      xcoeff[2], ycoeff[2];
+       int         nx, ny;
+       int         index;
+} lisafuncs;
+
+typedef struct lisa_struct {
+       int         radius, color, dx, dy, nsteps, nfuncs, melting;
+       double      pistep, phi, theta;
+       XPoint      center, *lastpoint;
+       lisafuncs  *function[LISAMAXFUNCS];
+} lisas;
+
+typedef struct lisacontext_struct {
+       lisas      *lisajous;
+       int         width, height, nlisajous, loopcount;
+       int         maxcycles;
+} lisacons;
+
+static lisacons *Lisa = NULL;
+
+static lisafuncs Function[NUMSTDFUNCS] =
+{
+       {
+               {1.0, 2.0},
+               {1.0, 2.0}, 2, 2, 0},
+       {
+               {1.0, 2.0},
+               {1.0, 1.0}, 2, 2, 1},
+       {
+               {1.0, 3.0},
+               {1.0, 2.0}, 2, 2, 2},
+       {
+               {1.0, 3.0},
+               {1.0, 3.0}, 2, 2, 3},
+       {
+               {2.0, 4.0},
+               {1.0, 2.0}, 2, 2, 4},
+       {
+               {1.0, 4.0},
+               {1.0, 3.0}, 2, 2, 5},
+       {
+               {1.0, 4.0},
+               {1.0, 4.0}, 2, 2, 6},
+       {
+               {1.0, 5.0},
+               {1.0, 5.0}, 2, 2, 7},
+       {
+               {2.0, 5.0},
+               {2.0, 5.0}, 2, 2, 8},
+       {
+               {1.0, 0.0},
+               {1.0, 0.0}, 1, 1, 9}
+};
+
+static void
+drawlisa(ModeInfo * mi, lisas * loop)
+{
+       XPoint     *np;
+       XPoint     *lp = loop->lastpoint;
+       lisacons   *lc = &Lisa[MI_SCREEN(mi)];
+       lisafuncs **lf = loop->function;
+       int         phase = lc->loopcount % loop->nsteps;
+       int         pctr, fctr, xctr, yctr;
+       double      xprod, yprod, xsum, ysum;
+
+       /* Allocate the np array */
+       np = (XPoint *) calloc(loop->nsteps, sizeof (XPoint));
+
+       /* Update the center */
+       loop->center.x += loop->dx;
+       loop->center.y += loop->dy;
+       checkRadius(loop, lc);
+       if ((loop->center.x - loop->radius) <= 0) {
+               loop->center.x = loop->radius;
+               loop->dx = NRAND(XVMAX);
+       } else if ((loop->center.x + loop->radius) >= lc->width) {
+               loop->center.x = lc->width - loop->radius;
+               loop->dx = -NRAND(XVMAX);
+       };
+       if ((loop->center.y - loop->radius) <= 0) {
+               loop->center.y = loop->radius;
+               loop->dy = NRAND(YVMAX);
+       } else if ((loop->center.y + loop->radius) >= lc->height) {
+               loop->center.y = lc->height - loop->radius;
+               loop->dy = -NRAND(YVMAX);
+       };
+
+       /* Now draw the points, and erase the ones from the last cycle */
+
+       for (pctr = 0; pctr < loop->nsteps; pctr++) {
+               fctr = loop->nfuncs;
+               loop->phi = (double) (pctr - phase) * loop->pistep;
+               loop->theta = (double) (pctr + phase) * loop->pistep;
+               xsum = ysum = 0;
+               while (fctr--) {
+                       xctr = lf[fctr]->nx;
+                       yctr = lf[fctr]->ny;
+                       if (additive) {
+                               xprod = yprod = 0.0;
+                               while (xctr--)
+                                       xprod += sin(lf[fctr]->xcoeff[xctr] * loop->theta);
+                               while (yctr--)
+                                       yprod += sin(lf[fctr]->ycoeff[yctr] * loop->phi);
+                               if (loop->melting) {
+                                       if (fctr) {
+                                               xsum += xprod \
+                                                       *(double) (loop->nsteps - loop->melting) \
+                                                       /(double) loop->nsteps;
+                                               ysum += yprod \
+                                                       *(double) (loop->nsteps - loop->melting) \
+                                                       /(double) loop->nsteps;
+                                       } else {
+                                               xsum += xprod \
+                                                       *(double) loop->melting \
+                                                       /(double) loop->nsteps;
+                                               ysum += yprod \
+                                                       *(double) loop->melting \
+                                                       /(double) loop->nsteps;
+                                       }
+                               } else {
+                                       xsum = xprod;
+                                       ysum = yprod;
+                               }
+                               if (!fctr) {
+                                       xsum = xsum \
+                                               *(double) loop->radius \
+                                               /(double) lf[fctr]->nx;
+                                       ysum = ysum \
+                                               *(double) loop->radius \
+                                               /(double) lf[fctr]->ny;
+                               }
+                       } else {
+                               if (loop->melting) {
+                                       if (fctr) {
+                                               yprod = xprod = (double) loop->radius \
+                                                       *(double) (loop->nsteps - loop->melting) \
+                                                       /(double) (loop->nsteps);
+                                       } else {
+                                               yprod = xprod = (double) loop->radius \
+                                                       *(double) (loop->melting) \
+                                                       /(double) (loop->nsteps);
+                                       }
+                               } else {
+                                       xprod = yprod = (double) loop->radius;
+                               }
+                               while (xctr--)
+                                       xprod *= sin(lf[fctr]->xcoeff[xctr] * loop->theta);
+                               while (yctr--)
+                                       yprod *= sin(lf[fctr]->ycoeff[yctr] * loop->phi);
+                               xsum += xprod;
+                               ysum += yprod;
+                       }
+               }
+               if ((loop->nfuncs > 1) && (!loop->melting)) {
+                       xsum /= (double) loop->nfuncs;
+                       ysum /= (double) loop->nfuncs;
+               }
+               xsum += (double) loop->center.x;
+               ysum += (double) loop->center.y;
+
+               np[pctr].x = (int) ceil(xsum);
+               np[pctr].y = (int) ceil(ysum);
+       }
+       if (loop->melting) {
+               if (!--loop->melting) {
+                       loop->nfuncs = 1;
+                       loop->function[0] = loop->function[1];
+               }
+       }
+       for (pctr = 0; pctr < loop->nsteps; pctr++) {
+
+#if defined DRAWLINES
+               /* erase the last cycle's point */
+               XSetForeground(MI_DISPLAY(mi), MI_GC(mi), MI_WIN_BLACK_PIXEL(mi));
+               XDrawLine(MI_DISPLAY(mi), MI_WINDOW(mi), \
+                         MI_GC(mi), lp[pctr].x, lp[pctr].y, \
+                         lp[(pctr + 1) % loop->nsteps].x, \
+                         lp[(pctr + 1) % loop->nsteps].y);
+
+               /* Set the new color */
+               lisasetcolor();
+
+               /* plot this cycle's point */
+               XDrawLine(MI_DISPLAY(mi), MI_WINDOW(mi), \
+                         MI_GC(mi), np[pctr].x, np[pctr].y, \
+                         np[(pctr + 1) % loop->nsteps].x, \
+                         np[(pctr + 1) % loop->nsteps].y);
+#else
+               /* erase the last cycle's point */
+               XSetForeground(MI_DISPLAY(mi), MI_GC(mi), MI_WIN_BLACK_PIXEL(mi));
+               XDrawPoint(MI_DISPLAY(mi), MI_WINDOW(mi), \
+                          MI_GC(mi), lp[pctr].x, lp[pctr].y);
+
+               /* Set the new color */
+               lisasetcolor();
+
+               /* plot this cycle's point */
+               XDrawPoint(MI_DISPLAY(mi), MI_WINDOW(mi), \
+                          MI_GC(mi), np[pctr].x, np[pctr].y);
+#endif
+       }
+       (void) free((void *) lp);
+       loop->lastpoint = np;
+}
+
+static void
+initlisa(ModeInfo * mi, lisas * loop)
+{
+       lisacons   *lc = &Lisa[MI_SCREEN(mi)];
+       lisafuncs **lf = loop->function;
+       XPoint     *lp;
+       int         phase, pctr, fctr, xctr, yctr;
+       double      xprod, yprod, xsum, ysum;
+
+       if (MI_NPIXELS(mi) > 2) {
+               loop->color = 0;
+       } else
+               loop->color = MI_WIN_WHITE_PIXEL(mi);
+       loop->nsteps = MI_CYCLES(mi);
+       if (loop->nsteps == 0)
+               loop->nsteps = 1;
+       lc->maxcycles = (MAXCYCLES * loop->nsteps) - 1;
+       loop->melting = 0;
+       loop->nfuncs = 1;
+       loop->pistep = 2.0 * M_PI / (double) loop->nsteps;
+       loop->center.x = lc->width / 2;
+       loop->center.y = lc->height / 2;
+       loop->radius = MI_SIZE(mi);
+       checkRadius(loop, lc);
+       loop->dx = NRAND(XVMAX);
+       loop->dy = NRAND(YVMAX);
+       loop->dx++;
+       loop->dy++;
+       lf[0] = &Function[lc->loopcount % NUMSTDFUNCS];
+       if ((lp = loop->lastpoint = (XPoint *)
+            calloc(loop->nsteps, sizeof (XPoint))) == NULL)
+               return;
+       phase = lc->loopcount % loop->nsteps;
+
+       for (pctr = 0; pctr < loop->nsteps; pctr++) {
+               loop->phi = (double) (pctr - phase) * loop->pistep;
+               loop->theta = (double) (pctr + phase) * loop->pistep;
+               fctr = loop->nfuncs;
+               xsum = ysum = 0.0;
+               while (fctr--) {
+                       xprod = yprod = (double) loop->radius;
+                       xctr = lf[fctr]->nx;
+                       yctr = lf[fctr]->ny;
+                       while (xctr--)
+                               xprod *= sin(lf[fctr]->xcoeff[xctr] * loop->theta);
+                       while (yctr--)
+                               yprod *= sin(lf[fctr]->ycoeff[yctr] * loop->phi);
+                       xsum += xprod;
+                       ysum += yprod;
+               }
+               if (loop->nfuncs > 1) {
+                       xsum /= 2.0;
+                       ysum /= 2.0;
+               }
+               xsum += (double) loop->center.x;
+               ysum += (double) loop->center.y;
+
+               lp[pctr].x = (int) ceil(xsum);
+               lp[pctr].y = (int) ceil(ysum);
+       }
+       for (pctr = 0; pctr < loop->nsteps; pctr++) {
+               /* Set the color */
+               lisasetcolor();
+#if defined DRAWLINES
+               XDrawLine(MI_DISPLAY(mi), MI_WINDOW(mi), \
+                         MI_GC(mi), lp[pctr].x, lp[pctr].y, \
+                         lp[(pctr + 1) % loop->nsteps].x, \
+                         lp[(pctr + 1) % loop->nsteps].y);
+#else
+               XDrawPoint(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi), \
+                          lp[pctr].x, lp[pctr].y);
+#endif
+       }
+
+       {
+         int line_width = -15;  /* #### make this a resource */
+         if (line_width == 0)
+               line_width = -8;
+         if (line_width < 0)
+               line_width = NRAND(-line_width)+1;
+         XSetLineAttributes(MI_DISPLAY(mi), MI_GC(mi), line_width,
+                                                LineSolid, CapProjecting, JoinMiter);
+       }
+}
+
+void
+init_lisa(ModeInfo * mi)
+{
+       lisacons   *lc;
+       int         lctr;
+
+       if (Lisa == NULL) {
+               if ((Lisa = (lisacons *) calloc(MI_NUM_SCREENS(mi), sizeof (lisacons))) \
+                   == NULL)
+                       return;
+       }
+       lc = &Lisa[MI_SCREEN(mi)];
+       lc->width = MI_WIN_WIDTH(mi);
+       lc->height = MI_WIN_HEIGHT(mi);
+       lc->loopcount = 0;
+       lc->nlisajous = MI_BATCHCOUNT(mi);
+       if (lc->nlisajous <= 0)
+               lc->nlisajous = 1;
+
+       if (lc->lisajous == NULL) {
+               if ((lc->lisajous = (lisas *) calloc(lc->nlisajous, sizeof (lisas))) \
+                   == NULL)
+                       return;
+               XClearWindow(MI_DISPLAY(mi), MI_WINDOW(mi));
+               for (lctr = 0; lctr < lc->nlisajous; lctr++) {
+                       initlisa(mi, &lc->lisajous[lctr]);
+                       lc->loopcount++;
+               }
+       } else {
+               refresh_lisa(mi);
+       }
+       XClearWindow(MI_DISPLAY(mi), MI_WINDOW(mi));
+}
+
+void
+draw_lisa(ModeInfo * mi)
+{
+       lisacons   *lc = &Lisa[MI_SCREEN(mi)];
+
+       if (++lc->loopcount > lc->maxcycles) {
+               change_lisa(mi);
+       }
+       refresh_lisa(mi);
+}
+
+void
+refresh_lisa(ModeInfo * mi)
+{
+       lisacons   *lc = &Lisa[MI_SCREEN(mi)];
+       int         lctr;
+
+       for (lctr = 0; lctr < lc->nlisajous; lctr++) {
+               drawlisa(mi, &lc->lisajous[lctr]);
+       }
+}
+
+void
+release_lisa(ModeInfo * mi)
+{
+       lisacons   *lc;
+       int         lctr, sctr;
+
+       if (Lisa) {
+               for (sctr = 0; sctr < MI_NUM_SCREENS(mi); sctr++) {
+                       lc = &Lisa[sctr];
+                       while (lc->lisajous) {
+                               for (lctr = 0; lctr < lc->nlisajous; lctr++) {
+                                       (void) free(lc->lisajous[lctr].lastpoint);
+                               }
+                               (void) free(lc->lisajous);
+                               lc->lisajous = NULL;
+                       }
+               }
+               (void) free(Lisa);
+               Lisa = NULL;
+       }
+}
+
+void
+change_lisa(ModeInfo * mi)
+{
+       lisacons   *lc = &Lisa[MI_SCREEN(mi)];
+       lisas      *loop;
+       int         lctr;
+
+       lc->loopcount = 0;
+       for (lctr = 0; lctr < lc->nlisajous; lctr++) {
+               loop = &lc->lisajous[lctr];
+               loop->function[1] = &Function[(loop->function[0]->index + 1) %
+                                             NUMSTDFUNCS];
+               loop->melting = loop->nsteps - 1;
+               loop->nfuncs = 2;
+       }
+}
diff --git a/hacks/lisa.man b/hacks/lisa.man
new file mode 100644 (file)
index 0000000..64cc06f
--- /dev/null
@@ -0,0 +1,67 @@
+.TH XScreenSaver 1 "27-May-97" "X Version 11"
+.SH NAME
+lisa - draws animated full-loop lisajous figures
+.SH SYNOPSIS
+.B lisa
+[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-ncolors \fIinteger\fP] [\-delay \fImicroseconds\fP] [\-cycles \fIinteger\fP] [\-count \fIinteger\fP] [\-size \fIinteger\fP]
+
+.SH DESCRIPTION
+The \fIlisa\fP program draws animated full-loop lisajous figures.
+.SH OPTIONS
+.I lisa
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window.  This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-mono 
+If on a color display, pretend we're on a monochrome display.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use.  Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-ncolors \fIinteger\fP
+How many colors should be used (if possible).  Default 200.
+The colors are chosen randomly.
+.TP 8
+.B \-cycles \fIinteger\fP
+
+.TP 8
+.B \-count \fIinteger\fP
+
+.TP 8
+.B \-size \fIinteger\fP
+
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1),
+.BR xlock (1)
+.SH COPYRIGHT
+Copyright \(co 1997 by Caleb Cullen.
+
+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. 
+.SH AUTHOR
+Caleb Cullen, 1997.
+
+Ability to run standalone or with \fIxscreensaver\fP added by 
+Jamie Zawinski <jwz@jwz.org>, 27-May-97.
diff --git a/hacks/lissie.c b/hacks/lissie.c
new file mode 100644 (file)
index 0000000..2a8fafa
--- /dev/null
@@ -0,0 +1,284 @@
+/* -*- Mode: C; tab-width: 4 -*- */
+/* lissie --- the Lissajous worm */
+
+#if !defined( lint ) && !defined( SABER )
+static const char sccsid[] = "@(#)lissie.c     4.04 97/07/28 xlockmore";
+#endif
+
+/*-
+ * lissie.c - The Lissajous worm for xlock, the X Window System
+ *               lockscreen.
+ *
+ * Copyright (c) 1996 by Alexander Jolk <ub9x@rz.uni-karlsruhe.de>
+ *
+ * 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.
+ *
+ * This file is provided AS IS with no warranties of any kind.  The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof.  In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * Revision History:
+ * 10-May-97: Compatible with xscreensaver
+ * 18-Aug-96: added refresh-hook.
+ * 01-May-96: written.
+ */
+
+#ifdef STANDALONE
+# define PROGCLASS "Lissie"
+# define HACK_INIT init_lissie
+# define HACK_DRAW draw_lissie
+# define lissie_opts xlockmore_opts
+# define DEFAULTS      "*delay:   10000 \n"    \
+                                       "*count:   1     \n"    \
+                                       "*cycles:  2000  \n"    \
+                                       "*size:   -200   \n"    \
+                                       "*ncolors: 64    \n"
+# define SMOOTH_COLORS
+# include "xlockmore.h"                /* in xscreensaver distribution */
+#else /* STANDALONE */
+# include "xlock.h"            /* in xlockmore distribution */
+#endif /* STANDALONE */
+
+ModeSpecOpt lissie_opts =
+{0, NULL, 0, NULL, NULL};
+
+#define MINSIZE 1
+
+#define Lissie(n)\
+       if (lissie->loc[(n)].x > 0 && lissie->loc[(n)].y > 0 &&\
+               lissie->loc[(n)].x <= lp->width && lissie->loc[(n)].y <= lp->height) {\
+               if (lissie->ri < 2)\
+                       XDrawPoint(display, MI_WINDOW(mi),\
+                               gc, lissie->loc[(n)].x, lissie->loc[(n)].y);\
+               else\
+                       XDrawArc(display, MI_WINDOW(mi), gc,\
+                               lissie->loc[(n)].x - lissie->ri / 2,\
+                               lissie->loc[(n)].y - lissie->ri / 2,\
+                               lissie->ri, lissie->ri, 0, 23040);\
+       }
+
+#define FLOATRAND(min,max)     ((min)+(LRAND()/MAXRAND)*((max)-(min)))
+#define INTRAND(min,max)     ((min)+NRAND((max)-(min)+1))
+
+#define MINDT  0.01
+#define MAXDT  0.15
+
+#define MAXLISSIELEN  100
+#define MINLISSIELEN  10
+#define MINLISSIES 1
+
+/* How many segments to draw per cycle when redrawing */
+#define REDRAWSTEP 3
+
+typedef struct {
+       double      tx, ty, dtx, dty;
+       int         xi, yi, ri, rx, ry, len, pos;
+       int         redrawing, redrawpos;
+       XPoint      loc[MAXLISSIELEN];
+       int         color;
+} lissiestruct;
+
+typedef struct {
+       int         width, height;
+       int         nlissies;
+       lissiestruct *lissie;
+       int         loopcount;
+} lissstruct;
+
+static lissstruct *lisses = NULL;
+
+
+static void
+drawlissie(ModeInfo * mi, lissiestruct * lissie)
+{
+       Display    *display = MI_DISPLAY(mi);
+       GC          gc = MI_GC(mi);
+       lissstruct *lp = &lisses[MI_SCREEN(mi)];
+       int         p = (++lissie->pos) % MAXLISSIELEN;
+       int         oldp = (lissie->pos - lissie->len + MAXLISSIELEN) % MAXLISSIELEN;
+
+       /* Let time go by ... */
+       lissie->tx += lissie->dtx;
+       lissie->ty += lissie->dty;
+       if (lissie->tx > 2 * M_PI)
+               lissie->tx -= 2 * M_PI;
+       if (lissie->ty > 2 * M_PI)
+               lissie->ty -= 2 * M_PI;
+
+       /* vary both (x/y) speeds by max. 1% */
+       lissie->dtx *= FLOATRAND(0.99, 1.01);
+       lissie->dty *= FLOATRAND(0.99, 1.01);
+       if (lissie->dtx < MINDT)
+               lissie->dtx = MINDT;
+       else if (lissie->dtx > MAXDT)
+               lissie->dtx = MAXDT;
+       if (lissie->dty < MINDT)
+               lissie->dty = MINDT;
+       else if (lissie->dty > MAXDT)
+               lissie->dty = MAXDT;
+
+       lissie->loc[p].x = lissie->xi + (int) (sin(lissie->tx) * lissie->rx);
+       lissie->loc[p].y = lissie->yi + (int) (sin(lissie->ty) * lissie->ry);
+
+       /* Mask */
+       XSetForeground(display, gc, MI_WIN_BLACK_PIXEL(mi));
+       Lissie(oldp);
+
+       /* Redraw */
+       if (MI_NPIXELS(mi) > 2) {
+               XSetForeground(display, gc, MI_PIXEL(mi, lissie->color));
+               if (++lissie->color >= MI_NPIXELS(mi))
+                       lissie->color = 0;
+       } else
+               XSetForeground(display, gc, MI_WIN_WHITE_PIXEL(mi));
+       Lissie(p);
+       if (lissie->redrawing) {
+               int         i;
+
+               lissie->redrawpos++;
+               /* This compensates for the changed p
+                  since the last callback. */
+
+               for (i = 0; i < REDRAWSTEP; i++) {
+                       Lissie((p - lissie->redrawpos + MAXLISSIELEN) % MAXLISSIELEN);
+                       if (++(lissie->redrawpos) >= lissie->len) {
+                               lissie->redrawing = 0;
+                               break;
+                       }
+               }
+       }
+}
+
+static void
+initlissie(ModeInfo * mi, lissiestruct * lissie)
+{
+       lissstruct *lp = &lisses[MI_SCREEN(mi)];
+       int         size = MI_SIZE(mi);
+       int         i;
+
+       if (MI_NPIXELS(mi) > 2)
+               lissie->color = NRAND(MI_NPIXELS(mi));
+       else
+               lissie->color = MI_WIN_WHITE_PIXEL(mi);
+       /* Initialize parameters */
+       if (size < -MINSIZE)
+               lissie->ri = NRAND(MIN(-size, MAX(MINSIZE,
+                  MIN(lp->width, lp->height) / 4)) - MINSIZE + 1) + MINSIZE;
+       else if (size < MINSIZE) {
+               if (!size)
+                       lissie->ri = MAX(MINSIZE, MIN(lp->width, lp->height) / 4);
+               else
+                       lissie->ri = MINSIZE;
+       } else
+               lissie->ri = MIN(size, MAX(MINSIZE, MIN(lp->width, lp->height) / 4));
+       lissie->xi = INTRAND(lp->width / 4 + lissie->ri,
+                            lp->width * 3 / 4 - lissie->ri);
+       lissie->yi = INTRAND(lp->height / 4 + lissie->ri,
+                            lp->height * 3 / 4 - lissie->ri);
+       lissie->rx = INTRAND(lp->width / 4,
+                  MIN(lp->width - lissie->xi, lissie->xi)) - 2 * lissie->ri;
+       lissie->ry = INTRAND(lp->height / 4,
+                 MIN(lp->height - lissie->yi, lissie->yi)) - 2 * lissie->ri;
+       lissie->len = INTRAND(MINLISSIELEN, MAXLISSIELEN - 1);
+       lissie->pos = 0;
+
+       lissie->redrawing = 0;
+
+       lissie->tx = FLOATRAND(0, 2 * M_PI);
+       lissie->ty = FLOATRAND(0, 2 * M_PI);
+       lissie->dtx = FLOATRAND(MINDT, MAXDT);
+       lissie->dty = FLOATRAND(MINDT, MAXDT);
+
+       for (i = 0; i < MAXLISSIELEN; i++)
+               lissie->loc[i].x = lissie->loc[i].y = 0;
+       /* Draw lissie */
+       drawlissie(mi, lissie);
+}
+
+void
+init_lissie(ModeInfo * mi)
+{
+       lissstruct *lp;
+       unsigned char ball;
+
+       if (lisses == NULL) {
+               if ((lisses = (lissstruct *) calloc(MI_NUM_SCREENS(mi),
+                                              sizeof (lissstruct))) == NULL)
+                       return;
+       }
+       lp = &lisses[MI_SCREEN(mi)];
+
+       lp->width = MI_WIN_WIDTH(mi);
+       lp->height = MI_WIN_HEIGHT(mi);
+
+       lp->nlissies = MI_BATCHCOUNT(mi);
+       if (lp->nlissies < -MINLISSIES) {
+               if (lp->lissie) {
+                       (void) free((void *) lp->lissie);
+                       lp->lissie = NULL;
+               }
+               lp->nlissies = NRAND(-lp->nlissies - MINLISSIES + 1) + MINLISSIES;
+       } else if (lp->nlissies < MINLISSIES)
+               lp->nlissies = MINLISSIES;
+
+       lp->loopcount = 0;
+
+       if (!lp->lissie)
+               lp->lissie = (lissiestruct *) calloc(lp->nlissies, sizeof (lissiestruct));
+       XClearWindow(MI_DISPLAY(mi), MI_WINDOW(mi));
+       for (ball = 0; ball < (unsigned char) lp->nlissies; ball++)
+               initlissie(mi, &lp->lissie[ball]);
+
+}
+
+void
+draw_lissie(ModeInfo * mi)
+{
+       lissstruct *lp = &lisses[MI_SCREEN(mi)];
+       register unsigned char ball;
+
+       if (++lp->loopcount > MI_CYCLES(mi))
+               init_lissie(mi);
+       else
+               for (ball = 0; ball < (unsigned char) lp->nlissies; ball++)
+                       drawlissie(mi, &lp->lissie[ball]);
+}
+
+void
+release_lissie(ModeInfo * mi)
+{
+       if (lisses != NULL) {
+               int         screen;
+
+               for (screen = 0; screen < MI_NUM_SCREENS(mi); screen++) {
+                       lissstruct *lp = &lisses[screen];
+
+                       if (lp->lissie) {
+                               (void) free((void *) lp->lissie);
+                               lp->lissie = NULL;
+                       }
+               }
+               (void) free((void *) lisses);
+               lisses = NULL;
+       }
+}
+
+void
+refresh_lissie(ModeInfo * mi)
+{
+       if (lisses != NULL) {
+               lissstruct *lp = &lisses[MI_SCREEN(mi)];
+               int         i;
+
+               for (i = 0; i < lp->nlissies; i++) {
+                       lp->lissie[i].redrawing = 1;
+                       lp->lissie[i].redrawpos = 0;
+               }
+       }
+}
diff --git a/hacks/lmorph.c b/hacks/lmorph.c
new file mode 100644 (file)
index 0000000..11099d2
--- /dev/null
@@ -0,0 +1,513 @@
+
+/**************************************************************************
+ *
+ *  FILE            lmorph.c
+ *  MODULE OF       xscreensaver
+ *
+ *  DESCRIPTION     Bilinear interpolation for morphing line shapes.
+ *
+ *  WRITTEN BY      Sverre H. Huseby                Glenn T. Lines
+ *                  Kurvn. 30                       Ã˜stgaardsgt. 5
+ *                  N-0495 Oslo                     N-0474 Oslo
+ *                  Norway                          Norway
+ *
+ *                  Phone:  +47 901 63 579          Phone:  +47 22 04 67 28
+ *                  E-mail: sverrehu@online.no      E-mail: gtl@si.sintef.no
+ *                  URL:    http://home.sol.no/~sverrehu/
+ *
+ *                  The original idea, and the bilinear interpolation
+ *                  mathematics used, emerged in the head of the wise
+ *                  Glenn T. Lines.
+ *
+ *  MODIFICATIONS   june 1998 (shh)
+ *                    * Minor code cleanup.
+ *
+ *                  march 1997 (shh)
+ *                    * Added -mailfile option to allow checking for
+ *                      new mail while the screensaver is active.
+ *
+ *                  january 1997 (shh)
+ *                    * Some code reformatting.
+ *                    * Added possibility to use float arithmetic.
+ *                    * Added -figtype option.
+ *                    * Made color blue default.
+ *
+ *                  december 1995 (jwz)
+ *                    * Function headers converted from ANSI to K&R.
+ *                    * Added posibility for random number of steps, and
+ *                      made this the default.
+ *
+ *                  march 1995 (shh)
+ *                    * Converted from an MS-Windows program to X Window.
+ *
+ **************************************************************************/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <math.h>
+#include "screenhack.h"
+
+/**************************************************************************
+ *                                                                        *
+ *                       P R I V A T E    D A T A                         *
+ *                                                                        *
+ **************************************************************************/
+
+/* define MARGINS to make some space around the figure. */
+#define MARGINS
+
+/* define USE_FLOAT to avoid using integer calculations in
+   createPoints. integer calculation is supposed to be faster, but it
+   won't work for displays larger than 2048x2048 or so pixels. */
+#undef USE_FLOAT
+
+#define MAXFIGS    20
+#define TWO_PI     (2.0 * M_PI)
+#define RND(x)     (random() % (x))
+
+#define FT_OPEN    1
+#define FT_CLOSED  2
+#define FT_ALL     (FT_OPEN | FT_CLOSED)
+
+static int
+    numFigs = 0,                /* number of figure arrays. */
+    numPoints,                  /* number of points in each array. */
+    nWork,                      /* current work array number. */
+    nFrom,                      /* current from array number. */
+    nTo,                        /* current to array number. */
+    figType;
+static long delay;              /* usecs to wait between updates. */
+static XPoint
+    *aWork[2],                  /* working arrays. */
+    *a[MAXFIGS],                /* the figure arrays. */
+    *aTmp,                      /* used as source when interrupting morph */
+    *aPrev,                     /* previous points displayed. */
+    *aCurr,                     /* the current points displayed. */  
+    *aFrom,                     /* figure converting from. */
+    *aTo;                       /* figure converting to. */
+static int         scrWidth, scrHeight;
+static double      currGamma, maxGamma = 1.0, deltaGamma;
+static GC          gcDraw, gcClear;
+static Display     *dpy;
+static Window      window;
+
+
+
+/**************************************************************************
+ *                                                                        *
+ *                        P U B L I C    D A T A                          *
+ *                                                                        *
+ **************************************************************************/
+
+char *progclass = "LMorph";
+
+char *defaults [] = {
+    ".background: black",
+    ".foreground: blue",
+    "*points: 150",
+    "*steps: 0",
+    "*delay: 50000",
+    "*figtype: all",
+    0
+};
+
+XrmOptionDescRec options [] = {
+  { "-points",      ".points",      XrmoptionSepArg, 0 },
+  { "-steps",       ".steps",       XrmoptionSepArg, 0 },
+  { "-delay",       ".delay",       XrmoptionSepArg, 0 },
+  { "-figtype",     ".figtype",     XrmoptionSepArg, 0 },
+  { 0, 0, 0, 0 }
+};
+int options_size = (sizeof (options) / sizeof (options[0]));
+
+
+
+/**************************************************************************
+ *                                                                        *
+ *                   P R I V A T E    F U N C T I O N S                   *
+ *                                                                        *
+ **************************************************************************/
+
+static void *
+xmalloc(size_t size)
+{
+    void *ret;
+
+    if ((ret = malloc(size)) == NULL) {
+       fprintf(stderr, "lmorph: out of memory\n");
+       exit(1);
+    }
+    return ret;
+}
+
+static void
+initPointArrays(void)
+{
+    int q, w,
+        mx, my,                 /* max screen coordinates. */
+        mp,                     /* max point number. */
+        s, rx, ry,
+        marginx, marginy;
+    double scalex, scaley;
+
+    mx = scrWidth - 1;
+    my = scrHeight - 1;
+    mp = numPoints - 1;
+
+    aWork[0] = (XPoint *) xmalloc(numPoints * sizeof(XPoint));
+    aWork[1] = (XPoint *) xmalloc(numPoints * sizeof(XPoint));
+    aTmp     = (XPoint *) xmalloc(numPoints * sizeof(XPoint));
+
+    if (figType & FT_CLOSED) {
+       /* rectangle */
+       a[numFigs] = (XPoint *) xmalloc(numPoints * sizeof(XPoint));
+       s = numPoints / 4;
+       for (q = 0; q < s; q++) {
+           a[numFigs][q].x = ((double) q / s) * mx;
+           a[numFigs][q].y = 0;
+           a[numFigs][s + q].x = mx;
+           a[numFigs][s + q].y = ((double) q / s) * my;
+           a[numFigs][2 * s + q].x = mx - ((double) q / s) * mx;
+           a[numFigs][2 * s + q].y = my;
+           a[numFigs][3 * s + q].x = 0;
+           a[numFigs][3 * s + q].y = my - ((double) q / s) * my;
+       }
+       for (q = 4 * s; q < numPoints; q++) 
+           a[numFigs][q].x = a[numFigs][q].y = 0;
+       a[numFigs][mp].x = a[numFigs][0].x;
+       a[numFigs][mp].y = a[numFigs][0].y;
+       ++numFigs;
+
+       /*  */
+       a[numFigs] = (XPoint *) xmalloc(numPoints * sizeof(XPoint));
+       rx = mx / 2;
+       ry = my / 2;
+       for (q = 0; q < numPoints; q++) {
+           a[numFigs][q].x = mx / 2 + rx * sin(1 * TWO_PI * (double) q / mp);
+           a[numFigs][q].y = my / 2 + ry * cos(3 * TWO_PI * (double) q / mp);
+       }
+       a[numFigs][mp].x = a[numFigs][0].x;
+       a[numFigs][mp].y = a[numFigs][0].y;
+       ++numFigs;
+
+       /*  */
+       a[numFigs] = (XPoint *) xmalloc(numPoints * sizeof(XPoint));
+       rx = mx / 2;
+       ry = my / 2;
+       for (q = 0; q < numPoints; q++) {
+           a[numFigs][q].x = mx / 2 + ry * sin(3 * TWO_PI * (double) q / mp);
+           a[numFigs][q].y = my / 2 + ry * cos(1 * TWO_PI * (double) q / mp);
+       }
+       a[numFigs][mp].x = a[numFigs][0].x;
+       a[numFigs][mp].y = a[numFigs][0].y;
+       ++numFigs;
+
+       /*  */
+       a[numFigs] = (XPoint *) xmalloc(numPoints * sizeof(XPoint));
+       rx = mx / 2;
+       ry = my / 2;
+       for (q = 0; q < numPoints; q++) {
+           a[numFigs][q].x = mx / 2 + ry 
+               * (0.8 - 0.2 * sin(30 * TWO_PI * q / mp))
+               * sin(TWO_PI * (double) q / mp);
+           a[numFigs][q].y = my / 2 + ry
+               * (0.8 - 0.2 * sin(30 * TWO_PI * q / mp))
+               * cos(TWO_PI * (double) q / mp);
+       }
+       a[numFigs][mp].x = a[numFigs][0].x;
+       a[numFigs][mp].y = a[numFigs][0].y;
+       ++numFigs;
+
+       /*  */
+       a[numFigs] = (XPoint *) xmalloc(numPoints * sizeof(XPoint));
+       rx = mx / 2;
+       ry = my / 2;
+       for (q = 0; q < numPoints; q++) {
+           a[numFigs][q].x = mx / 2 + ry * sin(TWO_PI * (double) q / mp);
+           a[numFigs][q].y = my / 2 + ry * cos(TWO_PI * (double) q / mp);
+       }
+       a[numFigs][mp].x = a[numFigs][0].x;
+       a[numFigs][mp].y = a[numFigs][0].y;
+       ++numFigs;
+
+       /*  */
+       a[numFigs] = (XPoint *) xmalloc(numPoints * sizeof(XPoint));
+       rx = mx / 2;
+       ry = my / 2;
+       for (q = 0; q < numPoints; q++) {
+           a[numFigs][q].x = mx / 2 + rx * cos(TWO_PI * (double) q / mp);
+           a[numFigs][q].y = my / 2 + ry * sin(TWO_PI * (double) q / mp);
+       }
+       a[numFigs][mp].x = a[numFigs][0].x;
+       a[numFigs][mp].y = a[numFigs][0].y;
+       ++numFigs;
+
+       /*  */
+       a[numFigs] = (XPoint *) xmalloc(numPoints * sizeof(XPoint));
+       rx = mx / 2;
+       ry = my / 2;
+       for (q = 0; q < numPoints; q++) {
+           a[numFigs][q].x = mx / 2 + rx * sin(2 * TWO_PI * (double) q / mp);
+           a[numFigs][q].y = my / 2 + ry * cos(3 * TWO_PI * (double) q / mp);
+       }
+       a[numFigs][mp].x = a[numFigs][0].x;
+       a[numFigs][mp].y = a[numFigs][0].y;
+       ++numFigs;
+    }
+
+    if (figType & FT_OPEN) {
+       /* sine wave, one period */
+       a[numFigs] = (XPoint *) xmalloc(numPoints * sizeof(XPoint));
+       for (q = 0; q < numPoints; q++) {
+           a[numFigs][q].x = ((double) q / numPoints) * mx;
+           a[numFigs][q].y = (1.0 - sin(((double) q / mp) * TWO_PI))
+               * my / 2.0;
+       }
+       ++numFigs;
+
+       /*  */
+       a[numFigs] = (XPoint *) xmalloc(numPoints * sizeof(XPoint));
+       for (q = 0; q < numPoints; q++) {
+           a[numFigs][q].x = ((double) q / mp) * mx;
+           a[numFigs][q].y = (1.0 - cos(((double) q / mp) * 3 * TWO_PI))
+               * my / 2.0;
+       }
+       ++numFigs;
+
+       /* spiral, one endpoint at bottom */
+       a[numFigs] = (XPoint *) xmalloc(numPoints * sizeof(XPoint));
+       rx = mx / 2;
+       ry = my / 2;
+       for (q = 0; q < numPoints; q++) {
+           a[numFigs][q].x = mx / 2 + ry * sin(5 * TWO_PI * (double) q / mp)
+               * ((double) q / mp);
+           a[numFigs][q].y = my / 2 + ry * cos(5 * TWO_PI * (double) q / mp)
+               * ((double) q / mp);
+       }
+       ++numFigs;
+
+       /* spiral, one endpoint at top */
+       a[numFigs] = (XPoint *) xmalloc(numPoints * sizeof(XPoint));
+       rx = mx / 2;
+       ry = my / 2;
+       for (q = 0; q < numPoints; q++) {
+           a[numFigs][q].x = mx / 2 + ry * sin(6 * TWO_PI * (double) q / mp)
+               * ((double) q / mp);
+           a[numFigs][q].y = my / 2 - ry * cos(6 * TWO_PI * (double) q / mp)
+               * ((double) q / mp);
+       }
+       ++numFigs;
+
+       /*  */
+       a[numFigs] = (XPoint *) xmalloc(numPoints * sizeof(XPoint));
+       for (q = 0; q < numPoints; q++) {
+           a[numFigs][q].x = ((double) q / mp) * mx;
+           a[numFigs][q].y = (1.0 - sin(((double) q / mp) * 5 * TWO_PI))
+               * my / 2.0;
+       }
+       ++numFigs;
+    }
+
+#ifdef MARGINS
+    /* make some space around the figures.  */
+    marginx = (mx + 1) / 10;
+    marginy = (my + 1) / 10;
+    scalex = (double) ((mx + 1) - 2.0 * marginx) / (mx + 1.0);
+    scaley = (double) ((my + 1) - 2.0 * marginy) / (my + 1.0);
+    for (q = 0; q < numFigs; q++)
+       for (w = 0; w < numPoints; w++) {
+           a[q][w].x = marginx + a[q][w].x * scalex;
+           a[q][w].y = marginy + a[q][w].y * scaley;
+       }
+#endif
+}
+
+static void
+initLMorph(void)
+{
+    int               steps;
+    XGCValues         gcv;
+    XWindowAttributes wa;
+    Colormap          cmap;
+    char              *ft;
+    
+    numPoints = get_integer_resource("points", "Integer");
+    steps = get_integer_resource("steps", "Integer");
+    delay = get_integer_resource("delay", "Integer");
+    ft = get_string_resource("figtype", "String");
+
+    if (strcmp(ft, "all") == 0)
+       figType = FT_ALL;
+    else if (strcmp(ft, "open") == 0)
+       figType = FT_OPEN;
+    else if (strcmp(ft, "closed") == 0)
+       figType = FT_CLOSED;
+    else {
+       fprintf(stderr, "figtype should be `all', `open' or `closed'.\n");
+       figType = FT_ALL;
+    }
+
+    if (steps <= 0)
+      steps = (random() % 400) + 100;
+
+    deltaGamma = 1.0 / steps;
+    XGetWindowAttributes(dpy, window, &wa);
+    scrWidth = wa.width;
+    scrHeight = wa.height;
+    cmap = wa.colormap;
+    gcv.foreground = get_pixel_resource("foreground", "Foreground", dpy, cmap);
+    gcDraw = XCreateGC(dpy, window, GCForeground, &gcv);
+    XSetForeground(dpy, gcDraw, gcv.foreground);
+    gcv.foreground = get_pixel_resource("background", "Background", dpy, cmap);
+    gcClear = XCreateGC(dpy, window, GCForeground, &gcv);
+    XClearWindow(dpy, window);
+
+    srandom(time(NULL));
+    initPointArrays();
+    aCurr = aWork[nWork = 0];
+    aPrev = NULL;
+    currGamma = maxGamma + 1.0;  /* force creation of new figure at startup */
+    nTo = RND(numFigs);
+
+    { /* jwz for version 2.11 */
+      int width = random() % 10;
+      int style = LineSolid;
+      int cap   = (width > 1 ? CapRound  : CapButt);
+      int join  = (width > 1 ? JoinRound : JoinBevel);
+      if (width == 1) width = 0;
+      XSetLineAttributes(dpy, gcDraw,  width, style, cap, join);
+      XSetLineAttributes(dpy, gcClear, width, style, cap, join);
+    }
+}
+
+/* 55% of execution time */
+static void
+createPoints(void)
+{
+    int             q;
+    XPoint *pa = aCurr, *pa1 = aFrom, *pa2 = aTo;
+#ifdef USE_FLOAT
+    float           fg, f1g;
+#else
+    long            lg, l1g;
+#endif
+
+#ifdef USE_FLOAT
+    fg  = currGamma;
+    f1g = 1.0 - currGamma;
+#else
+    lg  = 8192L * currGamma;
+    l1g = 8192L * (1.0 - currGamma);
+#endif
+    for (q = numPoints; q; q--) {
+#ifdef USE_FLOAT
+        pa->x = (short) (f1g * pa1->x + fg * pa2->x);
+        pa->y = (short) (f1g * pa1->y + fg * pa2->y);
+#else
+        pa->x = (short) ((l1g * pa1->x + lg * pa2->x) / 8192L);
+        pa->y = (short) ((l1g * pa1->y + lg * pa2->y) / 8192L);
+#endif
+        ++pa;
+        ++pa1;
+        ++pa2;
+    }
+}
+
+/* 36% of execution time */
+static void
+drawImage(void)
+{
+    int             q;
+    XPoint *old0, *old1, *new0, *new1;
+
+    /* Problem: update the window without too much flickering. I do
+     * this by handling each linesegment separately. First remove a
+     * line, then draw the new line. The problem is that this leaves
+     * small black pixels on the figure. To fix this, I draw the
+     * entire figure using XDrawLines() afterwards. */
+    if (aPrev) {
+       old0 = aPrev;
+       old1 = aPrev + 1;
+       new0 = aCurr;
+       new1 = aCurr + 1;
+       for (q = numPoints - 1; q; q--) {
+           XDrawLine(dpy, window, gcClear,
+                     old0->x, old0->y, old1->x, old1->y);
+           XDrawLine(dpy, window, gcDraw,
+                     new0->x, new0->y, new1->x, new1->y);
+           ++old0;
+           ++old1;
+           ++new0;
+           ++new1;
+       }
+    }
+    XDrawLines(dpy, window, gcDraw, aCurr, numPoints, CoordModeOrigin);
+
+    XFlush(dpy);
+}
+
+/* neglectible % of execution time */
+static void
+animateLMorph(void)
+{
+    if (currGamma > maxGamma) {
+        currGamma = 0.0;
+        if (maxGamma == 1.0) {
+            nFrom = nTo;
+            aFrom = a[nFrom];
+        } else {
+            memcpy(aTmp, aCurr, numPoints * sizeof(XPoint));
+            aFrom = aTmp;
+            nFrom = -1;
+        }
+        do {
+            nTo = RND(numFigs);
+        } while (nTo == nFrom);
+        aTo = a[nTo];
+        if (RND(2)) {
+            /* reverse the array to get more variation. */
+            int    i1, i2;
+            XPoint p;
+            
+            for (i1 = 0, i2 = numPoints - 1; i1 < numPoints / 2; i1++, i2--) {
+                p = aTo[i1];
+                aTo[i1] = aTo[i2];
+                aTo[i2] = p;
+            }
+        }
+        /* occationally interrupt the next run. */
+        if (RND(4) == 0)
+            maxGamma = 0.1 + 0.7 * (RND(1001) / 1000.0); /* partial run */
+        else
+            maxGamma = 1.0;                              /* full run */
+    }
+
+    createPoints();
+    drawImage();
+    aPrev = aCurr;
+    aCurr = aWork[nWork ^= 1];
+
+    currGamma += deltaGamma;
+}
+
+
+
+/**************************************************************************
+ *                                                                        *
+ *                    P U B L I C    F U N C T I O N S                    *
+ *                                                                        *
+ **************************************************************************/
+
+void
+screenhack(Display *disp, Window win)
+{
+    dpy = disp;
+    window = win;
+    initLMorph();
+    for (;;) {
+       animateLMorph();
+        screenhack_handle_events (dpy);
+       usleep(delay);
+    }
+}
diff --git a/hacks/lmorph.man b/hacks/lmorph.man
new file mode 100644 (file)
index 0000000..50cf8d2
--- /dev/null
@@ -0,0 +1,58 @@
+.TH LMORPH 1 "xscreensaver hack"
+.SH NAME
+lmorph \- morphing lines
+.SH SYNOPSIS
+.B lmorph
+[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-points \fIint\fP] [\-steps \fIint\fP] [\-delay \fIusecs\fP] [\-figtype \fItype\fP]
+.SH DESCRIPTION
+The \fIlmorph\fP program morphs between simple linedrawings using bilinear
+interpolation.
+.SH OPTIONS
+.I lmorph
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window. This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-mono 
+If on a color display, pretend we're on a monochrome display.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use. Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-points \fIinteger\fP
+Number of points in each line drawing. Default is 150 points.
+.TP 8
+.B \-steps \fIinteger\fP
+Interpolation steps from one drawing to the next. Default is 0, which
+means a random number between 100 and 500.
+.TP 8
+.B \-delay \fImicroseconds\fP
+How much of a delay should be introduced between steps of the animation.
+Default 50000.
+.TP 8
+.B \-figtype \fItype\fP
+Limit the figures to only open or closed figures. Possible types are
+"all" (default), "open" and "closed".
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH AUTHOR
+Sverre H. Huseby <sverrehu@online.no> and Glenn T. Lines <gtl@si.sintef.no>,
+built on top of the screen saver routines by Jamie Zawinski <jwz@jwz.org>.
diff --git a/hacks/loop.c b/hacks/loop.c
new file mode 100644 (file)
index 0000000..c7280ea
--- /dev/null
@@ -0,0 +1,1430 @@
+/* -*- Mode: C; tab-width: 4 -*- */
+/* loop --- Chris Langton's self-producing loops */
+
+#if !defined( lint ) && !defined( SABER )
+static const char sccsid[] = "@(#)loop.c       4.13 98/10/18 xlockmore";
+
+#endif
+
+/*-
+ * Copyright (c) 1996 by David Bagley.
+ *
+ * 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.
+ *
+ * This file is provided AS IS with no warranties of any kind.  The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof.  In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * Revision History:
+ * 18-Oct-98: Started creating a hexagon version, probably will not work
+ *            for a while since some work has to go into getting not
+ *            only the program to handle the hexagonal data but the loop
+ *            has to be "programmed" as well.  I suspect it should be easier
+ *            than the original since the loop will have six sides to
+ *            store its genes (data).
+ * 10-May-97: Compatible with xscreensaver
+ * 15-Nov-95: Coded from Chris Langton's Self-Reproduction in Cellular
+ *            Automata Physica 10D 135-144 1984
+ *            also used wire.c as a guide.
+ */
+
+/*-
+  Grid     Number of Neigbors
+  ----     ------------------
+  Square   4
+  Hexagon  6  (currently in development)
+*/
+
+/*-
+ * From Steven Levy's Artificial Life
+ * Chris Langton's cellular automata "loops" reproduce in the spirit of life.
+ * Beginning from a single organism, the loops from a colony.  As the loops
+ * on the outer fringes reproduce, the inner loops -- blocked by their
+ * daughters -- can no longer produce offspring.  These dead progenitors
+ * provide a base for future generations' expansion, much like the formation
+ * of a coral reef.  This self-organizing behavior emerges spontaneously,
+ * from the bottom up -- a key characteristic of artificial life.
+ */
+
+/*-
+   Don't Panic  --  When the artificial life tries to leave its petri
+   dish (ie. the screen) it will (usually) die...
+   The loops are short of "real" life because a general purpose Turing
+   machine is not contained in the loop.  This is a simplification of
+   von Neumann and Codd's self-producing Turing machine.
+   The data spinning around could be viewed as both its DNA and its internal
+   clock.
+ */
+
+#ifdef STANDALONE
+# define PROGCLASS "loop"
+# define HACK_INIT init_loop
+# define HACK_DRAW draw_loop
+# define loop_opts xlockmore_opts
+# define DEFAULTS      "*delay:  100000 \n" \
+                                       "*cycles:   1600 \n" \
+                                       "*size:      -12 \n" \
+                                       "*ncolors:    15 \n" \
+                                       "*neighbors:   0 \n"
+# define SMOOTH_COLORS
+# include "xlockmore.h"                /* in xscreensaver distribution */
+#else /* STANDALONE */
+# include "xlock.h"            /* in xlockmore distribution */
+#endif /* STANDALONE */
+
+#include "automata.h"
+
+/*-
+ * neighbors of 0 randomizes between 4 and 6.
+ */
+#ifdef STANDALONE
+static int neighbors;
+#else
+extern int  neighbors;
+#endif /* !STANDALONE */
+
+ModeSpecOpt loop_opts =
+{0, NULL, 0, NULL, NULL};
+
+#ifdef USE_MODULES
+ModStruct   loop_description =
+{"loop", "init_loop", "draw_loop", "release_loop",
+ "refresh_loop", "init_loop", NULL, &loop_opts,
+ 100000, 1, 1600, -12, 64, 1.0, "",
+ "Shows Langton's self-producing loops", 0, NULL};
+
+#endif
+
+#define LOOPBITS(n,w,h)\
+  lp->pixmaps[lp->init_bits++]=\
+  XCreatePixmapFromBitmapData(display,window,(char *)n,w,h,1,0,1)
+
+static int  local_neighbors = 0;
+static int  neighbor_kind = 0;
+
+#define COLORS 8
+#define REALCOLORS (COLORS-2)
+#define MINLOOPS 1
+#define REDRAWSTEP 2000                /* How many cells to draw per cycle */
+#define ADAM_SIZE 8 /* MIN 5 */
+#if 1
+# define ADAM_LOOPX  (ADAM_SIZE+2)
+# define ADAM_LOOPY  (ADAM_SIZE+2)
+#else
+# define ADAM_LOOPX 16
+# define ADAM_LOOPY 10
+#endif
+#define MINGRIDSIZE (3*ADAM_LOOPX)
+/* TRIA stuff was an attempt to make a triangular lifeform on a
+   hex grid but I got bored.  You probably need an additional 7th
+   state for a coherent step by step process of separation and
+   initial stem development.
+ */
+/* #define TRIA 1 */
+#ifdef TRIA
+# define HEX_ADAM_SIZE 3 /* MIN 3 */
+#else
+# define HEX_ADAM_SIZE 5 /* MIN 3 */
+#endif
+#if 1
+# define HEX_ADAM_LOOPX (2*HEX_ADAM_SIZE+1)
+# define HEX_ADAM_LOOPY (2*HEX_ADAM_SIZE+1)
+#else
+# define HEX_ADAM_LOOPX 3 
+# define HEX_ADAM_LOOPY 7
+#endif
+#define HEX_MINGRIDSIZE (6*HEX_ADAM_LOOPX)
+#define MINSIZE 5                        /* jwz -- really tiny cells don't look good */
+#define NEIGHBORKINDS 2
+#define ANGLES 360
+#define MAXNEIGHBORS 6
+
+/* Singly linked list */
+typedef struct _CellList {
+       XPoint      pt;
+       struct _CellList *next;
+} CellList;
+
+typedef struct {
+       int         init_bits;
+       int         generation;
+       int         xs, ys;
+       int         xb, yb;
+       int         nrows, ncols;
+       int         bx, by, bnrows, bncols;
+       int         mincol, minrow, maxcol, maxrow;
+       int         width, height;
+       int         redrawing, redrawpos;
+       unsigned char *newcells, *oldcells;
+       int         ncells[COLORS];
+       CellList   *cellList[COLORS];
+       unsigned long colors[COLORS];
+       GC          stippledGC;
+       Pixmap      pixmaps[COLORS];
+       union {
+               XPoint      hexagon[6];
+       } shape;
+} loopstruct;
+
+static loopstruct *loops = NULL;
+
+#define TRANSITION(TT,V) V=TT&7;TT>>=3
+#define TABLE(R,T,L,B) (table[((B)<<9)|((L)<<6)|((T)<<3)|(R)])
+#define HEX_TABLE(R,T,t,l,b,B) (table[((B)<<15)|((b)<<12)|((l)<<9)|((t)<<6)|((T)<<3)|(R)])
+#ifdef RAND_RULES              /* Hack, see below */
+#define TABLE_IN(C,R,T,L,B,I) (TABLE(R,T,L,B)&=~(7<<((C)*3)));\
+(TABLE(R,T,L,B)|=((I)<<((C)*3)))
+#define HEX_TABLE_IN(C,R,T,t,l,b,B,I) (HEX_TABLE(R,T,t,l,b,B)&=~(7<<((C)*3)));\
+(HEX_TABLE(R,T,t,l,b,B)|=((I)<<((C)*3)))
+#else
+#define TABLE_IN(C,R,T,L,B,I) (TABLE(R,T,L,B)|=((I)<<((C)*3)))
+#define HEX_TABLE_IN(C,R,T,t,l,b,B,I) (HEX_TABLE(R,T,t,l,b,B)|=((I)<<((C)*3)))
+#endif
+#define TABLE_OUT(C,R,T,L,B) ((TABLE(R,T,L,B)>>((C)*3))&7)
+#define HEX_TABLE_OUT(C,R,T,t,l,b,B) ((HEX_TABLE(R,T,t,l,b,B)>>((C)*3))&7)
+
+static unsigned int *table = NULL;     /* 8*8*8*8 = 2^12 = 2^3^4 = 4K */
+  /* 8*8*8*8*8*8 = too big? */
+
+static char plots[NEIGHBORKINDS] =
+{
+  4, 6 /* Neighborhoods */
+};
+
+static unsigned int transition_table[] =
+{                              /* Octal  CBLTR->I */
+  /* CBLTRI   CBLTRI   CBLTRI   CBLTRI   CBLTRI */
+    0000000, 0025271, 0113221, 0202422, 0301021,
+    0000012, 0100011, 0122244, 0202452, 0301220,
+    0000020, 0100061, 0122277, 0202520, 0302511,
+    0000030, 0100077, 0122434, 0202552, 0401120,
+    0000050, 0100111, 0122547, 0202622, 0401220,
+    0000063, 0100121, 0123244, 0202722, 0401250,
+    0000071, 0100211, 0123277, 0203122, 0402120,
+    0000112, 0100244, 0124255, 0203216, 0402221,
+    0000122, 0100277, 0124267, 0203226, 0402326,
+    0000132, 0100511, 0125275, 0203422, 0402520,
+    0000212, 0101011, 0200012, 0204222, 0403221,
+    0000220, 0101111, 0200022, 0205122, 0500022,
+    0000230, 0101244, 0200042, 0205212, 0500215,
+    0000262, 0101277, 0200071, 0205222, 0500225,
+    0000272, 0102026, 0200122, 0205521, 0500232,
+    0000320, 0102121, 0200152, 0205725, 0500272,
+    0000525, 0102211, 0200212, 0206222, 0500520,
+    0000622, 0102244, 0200222, 0206722, 0502022,
+    0000722, 0102263, 0200232, 0207122, 0502122,
+    0001022, 0102277, 0200242, 0207222, 0502152,
+    0001120, 0102327, 0200250, 0207422, 0502220,
+    0002020, 0102424, 0200262, 0207722, 0502244,
+    0002030, 0102626, 0200272, 0211222, 0502722,
+    0002050, 0102644, 0200326, 0211261, 0512122,
+    0002125, 0102677, 0200423, 0212222, 0512220,
+    0002220, 0102710, 0200517, 0212242, 0512422,
+    0002322, 0102727, 0200522, 0212262, 0512722,
+    0005222, 0105427, 0200575, 0212272, 0600011,
+    0012321, 0111121, 0200722, 0214222, 0600021,
+    0012421, 0111221, 0201022, 0215222, 0602120,
+    0012525, 0111244, 0201122, 0216222, 0612125,
+    0012621, 0111251, 0201222, 0217222, 0612131,
+    0012721, 0111261, 0201422, 0222272, 0612225,
+    0012751, 0111277, 0201722, 0222442, 0700077,
+    0014221, 0111522, 0202022, 0222462, 0701120,
+    0014321, 0112121, 0202032, 0222762, 0701220,
+    0014421, 0112221, 0202052, 0222772, 0701250,
+    0014721, 0112244, 0202073, 0300013, 0702120,
+    0016251, 0112251, 0202122, 0300022, 0702221,
+    0017221, 0112277, 0202152, 0300041, 0702251,
+    0017255, 0112321, 0202212, 0300076, 0702321,
+    0017521, 0112424, 0202222, 0300123, 0702525,
+    0017621, 0112621, 0202272, 0300421, 0702720,
+    0017721, 0112727, 0202321, 0300622
+};
+
+static unsigned int hex_transition_table[] =
+{                              /* Octal CBbltTR->I */
+  /* CBbltTRI   CBbltTRI   CBbltTRI   CBbltTRI   CBbltTRI */
+
+#ifdef TRIA
+    000000000, 000000020, 000000220, 000002220, 000022220,
+    011122121, 011121221, 011122221, 011221221,
+    011222221, 011112121, 011112221,
+    020021122, 020002122, 020211222, 021111222,
+    020221122, 020027122, 020020722, 020021022,
+    001127221,
+    011122727, 011227227, 010122121, 010222211,
+    021117222, 020112272,
+    070221220,
+    001227221,
+    010221121, 011721221, 011222277,
+    020111222, 020221172,
+    070211220,
+    001217221,
+    010212277, 010221221,
+    020122112,
+    070122220,
+    001722221,
+    010221271,
+    020002022, 021122172,
+    070121220,
+    011122277, 011172121,
+    010212177, 011212277,
+    070112220,
+    001772221,
+    021221772,
+    070121270, 070721220,
+    000112721, 000272211,
+    010022211, 012222277,
+    020072272, 020227122, 020217222,
+    010211121,
+    020002727,
+    070222220,
+    001727721,
+    020021072, 020070722,
+    070002072, 070007022,
+    001772721,
+    070002022,
+    000000070, 000000770, 000072220, 000000270,
+    020110222, 020220272, 020220722,
+    070007071, 070002072, 070007022,
+    000000012, 000000122, 000000212, 001277721,
+    020122072, 020202212,
+    010002121,
+    020001122, 020002112,
+    020021722,
+    020122022, 020027022, 020070122, 020020122,
+    010227027,
+    020101222,
+    010227227, 010227277,
+    021722172,
+    001727221,
+    010222277,
+    020702272,
+    070122020,
+    000172721,
+    010022277, 010202177, 010227127,
+
+    001214221,
+    010202244,
+    020024122, 020020422,
+    040122220,
+    001422221,
+    010221241, 010224224,
+    021122142,
+    040121220,
+    001124221,
+    010224274,
+    020112242, 021422172,
+    040221220,
+    001224221, 001427221,
+    010222244,
+    020227042,
+    040122020,
+    000142721,
+    010022244, 010202144, 010224124,
+    040112220,
+    001442221,
+    021221442,
+    040121240, 040421220,
+    000242211, 000112421,
+    020042242, 020214222, 020021422, 020220242, 020024022,
+    011224224,
+    020224122,
+    020220422,
+    012222244,
+    020002424,
+    040222220,
+    001244421, 000000420, 000000440, 000000240, 000000040,
+    020040121, 020021042,
+    040004022, 040004042, 040002042,
+    010021121,
+    020011122, 020002112,
+    001424421,
+    020040422,
+    001442421,
+    040002022,
+    001724221,
+    010227247,
+    020224072, 021417222,
+    000172421,
+    010021721,
+    020017022,
+    020120212,
+    020271727,
+    070207072, 070701220,
+    000001222,
+    020110122,
+    001277221,
+    001777721,
+    020021222, 020202272, 020120222, 020221722,
+    020027227,
+    070070222,
+    000007220,
+    020101272, 020272172, 020721422, 020721722,
+    020011222, 020202242,
+#if 0
+              {2,2,0,0,2,7,0},
+             {2,0,2,0,2,0,2},
+            {2,4,1,2,2,1,2},
+           {2,1,2,1,2,1,2},
+          {2,0,2,2,1,1,2},
+         {2,7,1,1,1,1,2},
+        {0,2,2,2,2,2,2},
+              {2,2,0,0,7,7,0},
+             {2,1,2,0,2,0,7},
+            {2,0,1,2,2,1,2},
+           {2,4,2,1,2,1,2},
+          {2,1,2,2,1,1,2},
+         {2,0,7,1,1,1,2},
+        {0,2,2,2,2,2,2},
+#endif
+#else
+    000000000, 000000020, 000000220, 000002220,
+    011212121, 011212221, 011221221, 011222221,
+    020002122, 020021122, 020211122,
+
+    010221221, 010222121,
+    020002022, 020021022, 020020122, 020112022,
+
+    010202121,
+    020102022, 020202112,
+
+    000000012, 000000122, 000000212,
+    010002121, 
+    020001122, 020002112, 020011122,
+
+
+    001227221, 001272221, 001272721,
+    012212277, 011222727, 011212727,
+    020021722, 020027122, 020020722, 020027022,
+    020211722, 020202172, 020120272,
+    020271122, 020202172, 020207122, 020217122,
+    020120272, 020210722, 020270722,
+    070212220, 070221220, 070212120,
+
+
+    012222277,
+    020002727,
+    070222220,
+
+    001277721, 000000070, 000000270, 000000720, 000000770,
+    020070122, 020021072,
+    070002072, 070007022, 070007071,
+
+    020070722,
+    070002022,
+
+    010227227, 010222727, 010202727,
+    020172022, 020202712,
+
+    001224221, 001242221, 001242421,
+    012212244, 011222424, 011212424,
+    020021422, 020024122, 020020422, 020024022,
+    020211422, 020202142, 020120242,
+    020241122, 020202142, 020204122, 020214122,
+    020120242, 020210422, 020240422,
+    040212220, 040221220, 040212120,
+
+
+    012222244,
+    020002424,
+    040222220,
+
+    001244421, 000000040, 000000240, 000000420, 000000440,
+    020040122, 020021042,
+    040002042,
+    040004021, 040004042,
+
+    020040422,
+    040002022,
+    
+    010224224, 010222424, 010202424,
+    020142022, 020202412,
+    020011722, 020112072, 020172072, 020142072,
+
+
+
+    000210225, 000022015, 000022522,
+    011225521, 
+    020120525, 020020152, 020005122, 020214255, 020021152,
+    020255242,
+    050215222, 050225121,
+
+    000225220, 001254222,
+    010221250, 011221251, 011225221,
+    020025122, 020152152, 020211252, 020214522, 020511125,
+    050212241, 05221120,
+    040521225,
+
+    000000250, 000000520, 000150220, 000220520, 000222210,
+    001224251,
+    010022152, 010251221, 010522121, 011212151, 011221251,
+    011215221,
+    020000220, 020002152, 020020220, 020021020, 020022152,
+    020021422, 020022152, 020022522, 020025425, 020050422,
+    020051022, 020051122, 020211122, 020211222, 020215222,
+    020245122,
+    050021125, 050021025, 050011125, 051242221,
+    041225220,
+
+    000220250, 000220520, 001227521, 001275221,
+    011257227, 011522727,
+    020002052, 020002752, 020021052, 020057125,
+    050020722, 050027125,
+    070215220,
+
+    070212255,
+    071225220,
+    020275122,
+    051272521,
+    020055725,
+    020021552,
+    012252277,
+    050002521,
+    020005725,     
+
+    050011022,
+    000000155,
+    020050722,
+    001227250,
+    010512727,
+    010002151,
+    020027112,
+    001227251,
+    012227257,
+    050002125,
+    020517122,
+    050002025,
+    020050102,
+    050002725,
+    020570722,
+    001252721,
+    020007051,
+    020102052,
+    020271072,
+    050001122,
+    010002151,
+    011227257,
+    020051722,
+    020057022,
+    020050122,
+
+
+    020051422,
+    011224254,
+    012224254,
+
+    020054022,
+    050002425,
+    040252220,
+    020002454,
+
+
+    000000540,
+    001254425,
+    050004024,
+    040004051,
+
+    000000142,
+    040001522,
+    010002547,
+    020045122,
+    051221240,
+    020002512,
+    020021522,
+
+
+    020020022,
+    021125522,
+    020521122,
+    020025022,
+    020025522,
+    020020522, 
+
+    020202222,
+    020212222,
+    021212222,
+    021222722,
+    021222422,
+    020002222,
+    020021222,
+    020022122,
+    020212122,
+    020027222,
+    020024222,
+    020020222,
+    020212722,
+    020212422,
+    020202122,
+    001222221,
+    020002522,
+
+    020017125,
+    010022722,
+    020212052,
+
+    020205052,
+#endif
+};
+
+
+/*-
+Neighborhoods are read as follows (rotations are not listed):
+    T
+  L C R  ==>  I
+    B
+
+   t T
+  l C R  ==>  I
+   b B
+ */
+
+static unsigned char self_reproducing_loop[ADAM_LOOPY][ADAM_LOOPX] =
+{
+/* 10x10 */
+       {0, 2, 2, 2, 2, 2, 2, 2, 2, 0},
+       {2, 4, 0, 1, 4, 0, 1, 1, 1, 2},
+       {2, 1, 2, 2, 2, 2, 2, 2, 1, 2},
+       {2, 0, 2, 0, 0, 0, 0, 2, 1, 2},
+       {2, 7, 2, 0, 0, 0, 0, 2, 7, 2},
+       {2, 1, 2, 0, 0, 0, 0, 2, 0, 2},
+       {2, 0, 2, 0, 0, 0, 0, 2, 1, 2},
+       {2, 7, 2, 2, 2, 2, 2, 2, 7, 2},
+       {2, 1, 0, 6, 1, 0, 7, 1, 0, 2},
+       {0, 2, 2, 2, 2, 2, 2, 2, 2, 0}
+};
+
+static unsigned char hex_self_reproducing_loop[HEX_ADAM_LOOPY][HEX_ADAM_LOOPX] =
+{
+#if 0
+/* Experimental TRIA5:7x7 */
+             {2,2,0,0,0,0,0},
+            {2,1,2,0,2,2,0},
+           {2,0,4,2,2,0,2},
+          {2,7,2,0,2,0,2},
+         {2,1,2,2,1,1,2},
+        {2,0,7,1,0,7,2},
+       {0,2,2,2,2,2,2},
+  /* Stem cells, only "5" will fully reproduce itself */
+/* 3:12x7 */
+             {2,2,2,2,0,0,0,0,0,0,0,0},
+            {2,1,1,1,2,0,0,0,0,0,0,0},
+           {2,1,2,2,1,2,2,2,2,2,2,0},
+          {2,1,2,0,2,7,1,1,1,1,1,2},
+         {0,2,1,2,2,0,2,2,2,2,2,2},
+        {0,0,2,0,4,1,2,0,0,0,0,0},
+       {0,0,0,2,2,2,2,0,0,0,0,0}
+/* 4:14x9 */
+               {2,2,2,2,2,0,0,0,0,0,0,0,0,0},
+              {2,1,1,1,1,2,0,0,0,0,0,0,0,0},
+             {2,1,2,2,2,1,2,0,0,0,0,0,0,0},
+            {2,1,2,0,0,2,1,2,2,2,2,2,2,0},
+           {2,1,2,0,0,0,2,7,1,1,1,1,1,2},
+          {0,2,1,2,0,0,2,0,2,2,2,2,2,2},
+         {0,0,2,0,2,2,2,1,2,0,0,0,0,0},
+        {0,0,0,2,4,1,0,7,2,0,0,0,0,0},
+       {0,0,0,0,2,2,2,2,2,0,0,0,0,0}
+/* 5:16x11 */
+                 {2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0},
+                {2,1,1,1,1,1,2,0,0,0,0,0,0,0,0,0},
+               {2,1,2,2,2,2,1,2,0,0,0,0,0,0,0,0},
+              {2,1,2,0,0,0,2,1,2,0,0,0,0,0,0,0},
+             {2,1,2,0,0,0,0,2,1,2,2,2,2,2,2,0},
+            {2,1,2,0,0,0,0,0,2,7,1,1,1,1,1,2},
+           {0,2,1,2,0,0,0,0,2,0,2,2,2,2,2,2},
+          {0,0,2,0,2,0,0,0,2,1,2,0,0,0,0,0},
+         {0,0,0,2,4,2,2,2,2,7,2,0,0,0,0,0},
+        {0,0,0,0,2,1,0,7,1,0,2,0,0,0,0,0},
+       {0,0,0,0,0,2,2,2,2,2,2,0,0,0,0,0}
+/* test:3x7  (0,4) is blank  ... very strange.
+          init_adam seems ok something after that I guess */
+                    {2,2,0},
+                   {2,0,2},
+                  {0,2,2},
+                 {0,0,0},
+                {2,2,0},
+               {2,1,2},
+              {0,2,2},
+#else /* this might be better for hexagons, spacewise efficient... */
+#ifdef TRIA
+/* Experimental TRIA5:7x7 */
+             {2,2,0,0,2,2,0},
+            {2,4,2,0,2,7,2},
+           {2,1,0,2,2,0,2},
+          {2,0,2,1,2,1,2},
+         {2,7,2,2,7,7,2},
+        {2,1,0,7,1,0,2},
+       {0,2,2,2,2,2,2},
+#else
+/* 5:11x11 */
+                 {2,2,2,2,2,2,0,0,0,0,0},
+                {2,1,1,7,0,1,2,0,0,0,0},
+               {2,1,2,2,2,2,7,2,0,0,0},
+              {2,1,2,0,0,0,2,0,2,0,0},
+             {2,1,2,0,0,0,0,2,1,2,0},
+            {2,1,2,0,0,0,0,0,2,7,2},
+           {0,2,1,2,0,0,0,0,2,0,2},
+          {0,0,2,1,2,0,0,0,2,1,2},
+         {0,0,0,2,1,2,2,2,2,4,2},
+        {0,0,0,0,2,1,1,1,1,5,2},
+       {0,0,0,0,0,2,2,2,2,2,2}
+#endif
+#endif
+};
+
+static void
+position_of_neighbor(int dir, int *pcol, int *prow)
+{
+       int         col = *pcol, row = *prow;
+
+       /* NO WRAPING */
+
+       if (local_neighbors == 6) {
+               switch (dir) {
+                       case 0:
+                               col = col + 1;
+                               break;
+                       case 60:
+                               if (row & 1)
+                                       col = col + 1;
+                               row = row - 1;
+                               break;
+                       case 120:
+                               if (!(row & 1))
+                                       col = col - 1;
+                               row = row - 1;
+                               break;
+                       case 180:
+                               col = col - 1;
+                               break;
+                       case 240:
+                               if (!(row & 1))
+                                       col = col - 1;
+                               row = row + 1;
+                               break;
+                       case 300:
+                               if (row & 1)
+                                       col = col + 1;
+                               row = row + 1;
+                               break;
+                       default:
+                               (void) fprintf(stderr, "wrong direction %d\n", dir);
+               }
+       } else {
+               switch (dir) {
+                       case 0:
+                               col = col + 1;
+                               break;
+                       case 90:
+                               row = row - 1;
+                               break;
+                       case 180:
+                               col = col - 1;
+                               break;
+                       case 270:
+                               row = row + 1;
+                               break;
+                       default:
+                               (void) fprintf(stderr, "wrong direction %d\n", dir);
+               }
+       }
+       *pcol = col;
+       *prow = row;
+}
+
+static      Bool
+withinBounds(loopstruct * lp, int col, int row)
+{
+       return (row >= 1 && row < lp->bnrows - 1 &&
+               col >= 1 && col < lp->bncols - 1 - (local_neighbors == 6 && (row % 2)));
+}
+
+static void
+fillcell(ModeInfo * mi, GC gc, int col, int row)
+{
+       loopstruct *lp = &loops[MI_SCREEN(mi)];
+
+       if (local_neighbors == 6) {
+               int         ccol = 2 * col + !(row & 1), crow = 2 * row;
+
+               lp->shape.hexagon[0].x = lp->xb + ccol * lp->xs;
+               lp->shape.hexagon[0].y = lp->yb + crow * lp->ys;
+               if (lp->xs == 1 && lp->ys == 1)
+                       XFillRectangle(MI_DISPLAY(mi), MI_WINDOW(mi), gc,
+                               lp->shape.hexagon[0].x, lp->shape.hexagon[0].y, 1, 1);
+               else
+                       XFillPolygon(MI_DISPLAY(mi), MI_WINDOW(mi), gc,
+                               lp->shape.hexagon, 6, Convex, CoordModePrevious);
+       } else {
+               XFillRectangle(MI_DISPLAY(mi), MI_WINDOW(mi), gc,
+                       lp->xb + lp->xs * col, lp->yb + lp->ys * row,
+                       lp->xs - (lp->xs > 3), lp->ys - (lp->ys > 3));
+       }
+}
+
+static void
+drawcell(ModeInfo * mi, int col, int row, int state)
+{
+       loopstruct *lp = &loops[MI_SCREEN(mi)];
+       XGCValues   gcv;
+       GC          gc;
+
+       if (MI_NPIXELS(mi) >= COLORS) {
+               gc = MI_GC(mi);
+               XSetForeground(MI_DISPLAY(mi), gc, lp->colors[state]);
+       } else {
+               gcv.stipple = lp->pixmaps[state];
+               gcv.foreground = MI_WHITE_PIXEL(mi);
+               gcv.background = MI_BLACK_PIXEL(mi);
+               XChangeGC(MI_DISPLAY(mi), lp->stippledGC,
+                         GCStipple | GCForeground | GCBackground, &gcv);
+               gc = lp->stippledGC;
+       }
+       fillcell(mi, gc, col, row);
+}
+
+static void
+addtolist(ModeInfo * mi, int col, int row, unsigned char state)
+{
+       loopstruct *lp = &loops[MI_SCREEN(mi)];
+       CellList   *current = lp->cellList[state];
+
+       lp->cellList[state] = NULL;
+       if ((lp->cellList[state] = (CellList *) malloc(sizeof (CellList))) == NULL) {
+               lp->cellList[state] = current;
+               return;
+       }
+       lp->cellList[state]->pt.x = col;
+       lp->cellList[state]->pt.y = row;
+       lp->cellList[state]->next = current;
+       lp->ncells[state]++;
+}
+
+#ifdef DEBUG
+static void
+print_state(ModeInfo * mi, int state)
+{
+       loopstruct *lp = &loops[MI_SCREEN(mi)];
+       CellList   *locallist = lp->cellList[state];
+       int         i = 0;
+
+       (void) printf("state %d\n", state);
+       while (locallist) {
+               (void) printf("%d x %d, y %d\n", i,
+                             locallist->pt.x, locallist->pt.y);
+               locallist = locallist->next;
+               i++;
+       }
+}
+
+#endif
+
+static void
+free_state(loopstruct * lp, int state)
+{
+       CellList   *current;
+
+       while (lp->cellList[state]) {
+               current = lp->cellList[state];
+               lp->cellList[state] = lp->cellList[state]->next;
+               (void) free((void *) current);
+       }
+       lp->ncells[state] = 0;
+}
+
+static void
+draw_state(ModeInfo * mi, int state)
+{
+       loopstruct *lp = &loops[MI_SCREEN(mi)];
+       GC          gc;
+       XGCValues   gcv;
+       CellList   *current = lp->cellList[state];
+
+       if (MI_NPIXELS(mi) >= COLORS) {
+               gc = MI_GC(mi);
+               XSetForeground(MI_DISPLAY(mi), gc, lp->colors[state]);
+       } else {
+               gcv.stipple = lp->pixmaps[state];
+               gcv.foreground = MI_WHITE_PIXEL(mi);
+               gcv.background = MI_BLACK_PIXEL(mi);
+               XChangeGC(MI_DISPLAY(mi), lp->stippledGC,
+                         GCStipple | GCForeground | GCBackground, &gcv);
+               gc = lp->stippledGC;
+       }
+
+       if (local_neighbors == 6) {       /* Draw right away, slow */
+               while (current) {
+                       int      col, row, ccol, crow;
+
+                       col = current->pt.x;
+                       row = current->pt.y;
+                       ccol = 2 * col + !(row & 1), crow = 2 * row;
+                       lp->shape.hexagon[0].x = lp->xb + ccol * lp->xs;
+                       lp->shape.hexagon[0].y = lp->yb + crow * lp->ys;
+                       if (lp->xs == 1 && lp->ys == 1)
+                               XFillRectangle(MI_DISPLAY(mi), MI_WINDOW(mi), gc,
+                                       lp->shape.hexagon[0].x, lp->shape.hexagon[0].y, 1, 1);
+                       else
+                               XFillPolygon(MI_DISPLAY(mi), MI_WINDOW(mi), gc,
+                                       lp->shape.hexagon, 6, Convex, CoordModePrevious);
+                       current = current->next;
+               }
+       } else {
+               /* Take advantage of XFillRectangles */
+               XRectangle *rects = NULL;
+               int         nrects = 0;
+
+               /* Create Rectangle list from part of the cellList */
+               if ((rects = (XRectangle *) malloc(lp->ncells[state] * sizeof (XRectangle))) == NULL) {
+                       return;
+               }
+
+               while (current) {
+                       rects[nrects].x = lp->xb + current->pt.x * lp->xs;
+                       rects[nrects].y = lp->yb + current->pt.y * lp->ys;
+                       rects[nrects].width = lp->xs - (lp->xs > 3);
+                       rects[nrects].height = lp->ys - (lp->ys > 3);
+                       current = current->next;
+                       nrects++;
+               }
+               /* Finally get to draw */
+               XFillRectangles(MI_DISPLAY(mi), MI_WINDOW(mi), gc, rects, nrects);
+               /* Free up rects list and the appropriate part of the cellList */
+               (void) free((void *) rects);
+       }
+       free_state(lp, state);
+       XFlush(MI_DISPLAY(mi));
+}
+
+static int
+init_table(void)
+{
+       if (table == NULL) {
+               int mult = 1;
+               unsigned int tt, c, n[MAXNEIGHBORS], i;
+               int         j, k;
+               int  size_transition_table = sizeof (transition_table) /
+                       sizeof (unsigned int);
+               int  size_hex_transition_table = sizeof (hex_transition_table) /
+                       sizeof (unsigned int);
+
+               for (j = 0; j < local_neighbors; j++)
+                       mult *= 8;
+
+               if ((table = (unsigned int *) calloc(mult, sizeof (unsigned int))) == NULL) {
+                       return 1;
+               }
+
+#ifdef RAND_RULES
+               /* Here I was interested to see what happens when it hits a wall....
+                  Rules not normally used take over... takes too much time though */
+               {
+                       for (j = 0; j < mult; j++) {
+                               for (k = 0; k < 8; k++)
+                                       table[j] |= (unsigned int) ((unsigned int) (NRAND(8)) << (k * 3));
+                       }
+               }
+#endif
+               if (local_neighbors == 6) {
+                       for (j = 0; j < size_hex_transition_table; j++) {
+                               tt = hex_transition_table[j];
+                               TRANSITION(tt, i);
+                               for (k = 0; k < local_neighbors; k++) {
+                                       TRANSITION(tt, n[k]);
+                               }
+                               TRANSITION(tt, c);
+                               HEX_TABLE_IN(c, n[0], n[1], n[2], n[3], n[4], n[5], i);
+                               HEX_TABLE_IN(c, n[1], n[2], n[3], n[4], n[5], n[0], i);
+                               HEX_TABLE_IN(c, n[2], n[3], n[4], n[5], n[0], n[1], i);
+                               HEX_TABLE_IN(c, n[3], n[4], n[5], n[0], n[1], n[2], i);
+                               HEX_TABLE_IN(c, n[4], n[5], n[0], n[1], n[2], n[3], i);
+                               HEX_TABLE_IN(c, n[5], n[0], n[1], n[2], n[3], n[4], i);
+                       }
+               } else {
+                       for (j = 0; j < size_transition_table; j++) {
+                               tt = transition_table[j];
+                               TRANSITION(tt, i);
+                               for (k = 0; k < local_neighbors; k++) {
+                                       TRANSITION(tt, n[k]);
+                               }
+                               TRANSITION(tt, c);
+                               TABLE_IN(c, n[0], n[1], n[2], n[3], i);
+                               TABLE_IN(c, n[1], n[2], n[3], n[0], i);
+                               TABLE_IN(c, n[2], n[3], n[0], n[1], i);
+                               TABLE_IN(c, n[3], n[0], n[1], n[2], i);
+                       }
+               }
+       }
+       return 0;
+}
+
+static void
+init_adam(ModeInfo * mi)
+{
+       loopstruct *lp = &loops[MI_SCREEN(mi)];
+       XPoint      start, dirx, diry;
+       int         i, j;
+
+  if (local_neighbors == 6) {
+               int k;
+
+               /* switch (0) */
+               switch (NRAND(6)) {
+                       case 0:
+                               start.x = (lp->bncols - HEX_ADAM_LOOPX / 2) / 2;
+                               start.y = (lp->bnrows - HEX_ADAM_LOOPY) / 2;
+                               lp->mincol = start.x - 2;
+                               lp->minrow = start.y - 1;
+                               lp->maxcol = start.x + HEX_ADAM_LOOPX + 1;
+                               lp->maxrow = start.y + HEX_ADAM_LOOPY + 1;
+                               for (j = 0; j < HEX_ADAM_LOOPY; j++) {
+                                       for (i = 0; i < HEX_ADAM_LOOPX; i++) {
+                                               k = (((lp->bnrows / 2 + HEX_ADAM_LOOPY / 2) % 2) ? -j / 2 : -(j + 1) / 2);
+                                               lp->newcells[(start.y + j) * lp->bncols + start.x + i + k] =
+                                                       hex_self_reproducing_loop[j][i];
+                                       }
+                               }
+                               break;
+                       case 1:
+                               start.x = (lp->bncols - (HEX_ADAM_LOOPX + HEX_ADAM_LOOPY) / 2) / 2;
+                               start.y = (lp->bnrows - HEX_ADAM_LOOPX + HEX_ADAM_LOOPY) / 2;
+                               lp->mincol = start.x - 1;
+                               lp->minrow = start.y - HEX_ADAM_LOOPX;
+                               lp->maxcol = start.x + (HEX_ADAM_LOOPX + HEX_ADAM_LOOPY) / 2 + 1;
+                               lp->maxrow = start.y + HEX_ADAM_LOOPY + 1;
+                               for (j = 0; j < HEX_ADAM_LOOPY; j++) {
+                                       for (i = 0; i < HEX_ADAM_LOOPX; i++) {
+                                               k = (((lp->bnrows / 2 + (HEX_ADAM_LOOPX + HEX_ADAM_LOOPY) / 2) % 2)
+              ? -(i + j + 1) / 2 : -(i + j) / 2);
+                                               lp->newcells[(start.y + j - i) * lp->bncols + start.x + i + j + k] =
+                                                       hex_self_reproducing_loop[j][i];
+                                       }
+                               }
+                               break;
+                       case 2:
+                               start.x = (lp->bncols - HEX_ADAM_LOOPY / 2) / 2;
+                               start.y = (lp->bnrows - HEX_ADAM_LOOPX) / 2;
+                               lp->mincol = start.x - 2;
+                               lp->minrow = start.y - 1;
+                               lp->maxcol = start.x + HEX_ADAM_LOOPY + 1;
+                               lp->maxrow = start.y + HEX_ADAM_LOOPX + 1;
+                               for (j = 0; j < HEX_ADAM_LOOPX; j++) {
+                                       for (i = 0; i < HEX_ADAM_LOOPY; i++) {
+                                               k = (((lp->bnrows / 2 + HEX_ADAM_LOOPX / 2) % 2) ? -(HEX_ADAM_LOOPX - j - 1) / 2 : -(HEX_ADAM_LOOPX - j) / 2);
+                                               lp->newcells[(start.y + j) * lp->bncols + start.x + i + k] =
+                                                       hex_self_reproducing_loop[i][HEX_ADAM_LOOPX - j - 1];
+                                       }
+                               }
+                               break;
+                       case 3:
+                               start.x = (lp->bncols - HEX_ADAM_LOOPX / 2) / 2;
+                               start.y = (lp->bnrows - HEX_ADAM_LOOPY) / 2;
+                               lp->mincol = start.x - 1, lp->minrow = start.y - 1;
+                               lp->maxcol = start.x + HEX_ADAM_LOOPX + 1, lp->maxrow = start.y + HEX_ADAM_LOOPY + 1;
+                               for (j = 0; j < HEX_ADAM_LOOPY; j++) {
+                                       for (i = 0; i < HEX_ADAM_LOOPX; i++) {
+                                               k = (((lp->bnrows / 2 + HEX_ADAM_LOOPY / 2) % 2) ? -j / 2 : -(j + 1) / 2);
+                                               lp->newcells[(start.y + j) * lp->bncols + start.x + i + k] =
+                                                       hex_self_reproducing_loop[HEX_ADAM_LOOPY - j - 1][HEX_ADAM_LOOPX - i - 1];
+                                       }
+                               }
+                               break;
+                       case 4:
+                               start.x = (lp->bncols - (HEX_ADAM_LOOPX + HEX_ADAM_LOOPY) / 2) / 2;
+                               start.y = (lp->bnrows - HEX_ADAM_LOOPX + HEX_ADAM_LOOPY) / 2;
+                               lp->mincol = start.x - 1;
+                               lp->minrow = start.y - HEX_ADAM_LOOPX;
+                               lp->maxcol = start.x + (HEX_ADAM_LOOPX + HEX_ADAM_LOOPY) / 2 + 1;
+                               lp->maxrow = start.y + HEX_ADAM_LOOPY + 1;
+                               for (j = 0; j < HEX_ADAM_LOOPY; j++) {
+                                       for (i = 0; i < HEX_ADAM_LOOPX; i++) {
+                                               k = (((lp->bnrows / 2 + (HEX_ADAM_LOOPX + HEX_ADAM_LOOPY) / 2) % 2)
+              ? -(i + j + 1) / 2 : -(i + j) / 2);
+                                               lp->newcells[(start.y + j - i) * lp->bncols + start.x + i + j + k] =
+                                                       hex_self_reproducing_loop[HEX_ADAM_LOOPY - j - 1][HEX_ADAM_LOOPX - i - 1];
+                                       }
+                               }
+                               break;
+                       case 5:
+                               start.x = (lp->bncols - HEX_ADAM_LOOPY / 2) / 2;
+                               start.y = (lp->bnrows - HEX_ADAM_LOOPX) / 2;
+                               lp->mincol = start.x - 2;
+                               lp->minrow = start.y - 1;
+                               lp->maxcol = start.x + HEX_ADAM_LOOPY + 1;
+                               lp->maxrow = start.y + HEX_ADAM_LOOPX + 1;
+                               for (j = 0; j < HEX_ADAM_LOOPX; j++) {
+                                       for (i = 0; i < HEX_ADAM_LOOPY; i++) {
+                                               k = (((lp->bnrows / 2 + HEX_ADAM_LOOPX / 2) % 2) ? -(HEX_ADAM_LOOPX - j - 1) / 2 : -(HEX_ADAM_LOOPX - j) / 2);
+                                               lp->newcells[(start.y + j) * lp->bncols + start.x + i + k] =
+                                                       hex_self_reproducing_loop[HEX_ADAM_LOOPX - i - 1][j];
+                                       }
+                               }
+                               break;
+               }
+#if DEBUGTEST
+                               /* printf ("s %d  s %d \n", start.x, start.y); */
+               printf ("%d %d %d %d %d\t",
+     start.x + i + ((lp->bnrows / 2 % 2) ? -j / 2 : -(j + 1) / 2) - lp->bx,
+                start.y + j - lp->by, i, j, hex_self_reproducing_loop[j][i]);
+               /* Draw right away */
+               drawcell(mi, start.x + i + ((lp->bnrows / 2 % 2) ? -j / 2 : -(j + 1) / 2) - lp->bx,
+                start.y + j - lp->by,
+                hex_self_reproducing_loop[j][i]);
+#endif
+#if DEBUGTEST
+                        printf ("\n");
+#endif
+#if DEBUGTEST
+                        printf ("\n");
+#endif
+  } else {
+               switch (NRAND(4)) {
+                       case 0:
+                               start.x = (lp->bncols - ADAM_LOOPX) / 2;
+                               start.y = (lp->bnrows - ADAM_LOOPY) / 2;
+                               dirx.x = 1, dirx.y = 0;
+                               diry.x = 0, diry.y = 1;
+                               lp->mincol = start.x, lp->minrow = start.y;
+                               lp->maxcol = start.x + ADAM_LOOPX, lp->maxrow = start.y + ADAM_LOOPY;
+                               break;
+                       case 1:
+                               start.x = (lp->bncols + ADAM_LOOPY) / 2;
+                               start.y = (lp->bnrows - ADAM_LOOPX) / 2;
+                               dirx.x = 0, dirx.y = 1;
+                               diry.x = -1, diry.y = 0;
+                               lp->mincol = start.x - ADAM_LOOPY, lp->minrow = start.y;
+                               lp->maxcol = start.x, lp->maxrow = start.y + ADAM_LOOPX;
+                               break;
+                       case 2:
+                               start.x = (lp->bncols + ADAM_LOOPX) / 2;
+                               start.y = (lp->bnrows + ADAM_LOOPY) / 2;
+                               dirx.x = -1, dirx.y = 0;
+                               diry.x = 0, diry.y = -1;
+                               lp->mincol = start.x - ADAM_LOOPX, lp->minrow = start.y - ADAM_LOOPY;
+                               lp->maxcol = start.x, lp->maxrow = start.y;
+                               break;
+                       case 3:
+                               start.x = (lp->bncols - ADAM_LOOPY) / 2;
+                               start.y = (lp->bnrows + ADAM_LOOPX) / 2;
+                               dirx.x = 0, dirx.y = -1;
+                               diry.x = 1, diry.y = 0;
+                               lp->mincol = start.x, lp->minrow = start.y - ADAM_LOOPX;
+                               lp->maxcol = start.x + ADAM_LOOPY, lp->maxrow = start.y;
+                               break;
+               }
+               for (j = 0; j < ADAM_LOOPY; j++)
+                       for (i = 0; i < ADAM_LOOPX; i++)
+                               lp->newcells[(start.y + dirx.y * i + diry.y * j) * lp->bncols +
+                                            start.x + dirx.x * i + diry.x * j] =
+                                       self_reproducing_loop[j][i];
+#if DEBUG
+               /* Draw right away */
+               drawcell(mi, start.x + dirx.x * i + diry.x * j - lp->bx,
+                start.y + dirx.y * i + diry.y * j - lp->by,
+                self_reproducing_loop[j][i]);
+#endif
+       }
+}
+
+
+static void
+do_gen(loopstruct * lp)
+{
+       int         i, j, k;
+       unsigned char *z;
+       unsigned int n[MAXNEIGHBORS];
+       unsigned int c;
+
+#define LOC(X, Y) (*(lp->oldcells + (X) + ((Y) * lp->bncols)))
+
+       for (j = lp->minrow; j <= lp->maxrow; j++) {
+               for (i = lp->mincol; i <= lp->maxcol; i++) {
+                       z = lp->newcells + i + j * lp->bncols;
+                       c = LOC(i, j);
+                       for (k = 0; k < local_neighbors; k++) {
+                               int         newi = i, newj = j;
+
+                               position_of_neighbor(k * ANGLES / local_neighbors, &newi, &newj);
+                               n[k] = 0;
+                   if (withinBounds(lp, newi, newj)) {
+                                       n[k] = LOC(newi, newj);
+                               }
+                       }
+                       if (local_neighbors == 6) {
+                               *z = HEX_TABLE_OUT(c, n[0], n[1], n[2], n[3], n[4], n[5]);
+                       } else {
+                               *z = TABLE_OUT(c, n[0], n[1], n[2], n[3]);
+                       }
+               }
+       }
+}
+
+static void
+free_list(loopstruct * lp)
+{
+       int         state;
+
+       for (state = 0; state < COLORS; state++)
+               free_state(lp, state);
+}
+
+void
+release_loop(ModeInfo * mi)
+{
+       if (loops != NULL) {
+               int         screen;
+
+               for (screen = 0; screen < MI_NUM_SCREENS(mi); screen++) {
+                       loopstruct *lp = &loops[screen];
+                       int         shade;
+
+                       for (shade = 0; shade < lp->init_bits; shade++)
+                               if (lp->pixmaps[shade] != None)
+                                       XFreePixmap(MI_DISPLAY(mi), lp->pixmaps[shade]);
+                       if (lp->stippledGC != None)
+                               XFreeGC(MI_DISPLAY(mi), lp->stippledGC);
+                       if (lp->oldcells != NULL)
+                               (void) free((void *) lp->oldcells);
+                       if (lp->newcells != NULL)
+                               (void) free((void *) lp->newcells);
+                       free_list(lp);
+               }
+               (void) free((void *) loops);
+               loops = NULL;
+       }
+       if (table != NULL) {
+               (void) free((void *) table);
+               table = NULL;
+       }
+}
+
+void
+init_loop(ModeInfo * mi)
+{
+       Display    *display = MI_DISPLAY(mi);
+       Window      window = MI_WINDOW(mi);
+       int         i, size = MI_SIZE(mi);
+       loopstruct *lp;
+       XGCValues   gcv;
+
+       if (loops == NULL) {
+               if ((loops = (loopstruct *) calloc(MI_NUM_SCREENS(mi),
+                                              sizeof (loopstruct))) == NULL)
+                       return;
+       }
+       lp = &loops[MI_SCREEN(mi)];
+
+       lp->redrawing = 0;
+
+       if ((MI_NPIXELS(mi) < COLORS) && (lp->init_bits == 0)) {
+               if (lp->stippledGC == None) {
+                       gcv.fill_style = FillOpaqueStippled;
+                       lp->stippledGC = XCreateGC(display, window, GCFillStyle, &gcv);
+                       if (lp->stippledGC == None) {
+                               release_loop(mi);
+                               return;
+                       }
+               }
+               LOOPBITS(stipples[0], STIPPLESIZE, STIPPLESIZE);
+               LOOPBITS(stipples[2], STIPPLESIZE, STIPPLESIZE);
+               LOOPBITS(stipples[3], STIPPLESIZE, STIPPLESIZE);
+               LOOPBITS(stipples[4], STIPPLESIZE, STIPPLESIZE);
+               LOOPBITS(stipples[6], STIPPLESIZE, STIPPLESIZE);
+               LOOPBITS(stipples[7], STIPPLESIZE, STIPPLESIZE);
+               LOOPBITS(stipples[8], STIPPLESIZE, STIPPLESIZE);
+               LOOPBITS(stipples[10], STIPPLESIZE, STIPPLESIZE);
+       if (lp->pixmaps[COLORS - 1] == None) {
+                       release_loop(mi);
+                       return;
+               }
+       }
+       if (MI_NPIXELS(mi) >= COLORS) {
+               /* Maybe these colors should be randomized */
+               lp->colors[0] = MI_BLACK_PIXEL(mi);
+               lp->colors[1] = MI_PIXEL(mi, 0);        /* RED */
+               lp->colors[5] = MI_PIXEL(mi, MI_NPIXELS(mi) / REALCOLORS);      /* YELLOW */
+               lp->colors[4] = MI_PIXEL(mi, 2 * MI_NPIXELS(mi) / REALCOLORS);  /* GREEN */
+               lp->colors[6] = MI_PIXEL(mi, 3 * MI_NPIXELS(mi) / REALCOLORS);  /* CYAN */
+               lp->colors[2] = MI_PIXEL(mi, 4 * MI_NPIXELS(mi) / REALCOLORS);  /* BLUE */
+               lp->colors[3] = MI_PIXEL(mi, 5 * MI_NPIXELS(mi) / REALCOLORS);  /* MAGENTA */
+               lp->colors[7] = MI_WHITE_PIXEL(mi);
+       }
+       free_list(lp);
+       lp->generation = 0;
+       lp->width = MI_WIDTH(mi);
+       lp->height = MI_HEIGHT(mi);
+
+  if (!local_neighbors) {
+    for (i = 0; i < NEIGHBORKINDS; i++) {
+      if (neighbors == plots[i]) {
+        local_neighbors = neighbors;
+        neighbor_kind = i;
+        break;
+      }
+                       if (i == NEIGHBORKINDS - 1) {
+
+#if 1
+                               local_neighbors = plots[NRAND(NEIGHBORKINDS)];
+                               neighbor_kind = (local_neighbors == 4) ? 0 : 1;
+#else
+                               local_neighbors = 4;
+                               neighbor_kind = 0;
+#endif
+                               break;
+                       }
+               }
+       }
+
+
+  if (local_neighbors == 6) {
+    int         nccols, ncrows;
+
+    if (lp->width < 4)
+      lp->width = 4;
+    if (lp->height < 4)
+      lp->height = 4;
+    if (size < -MINSIZE) {
+      lp->ys = NRAND(MIN(-size, MAX(MINSIZE, MIN(lp->width, lp->height) /
+              HEX_MINGRIDSIZE)) - MINSIZE + 1) + MINSIZE;
+    } else if (size < MINSIZE) {
+      if (!size)
+        lp->ys = MAX(MINSIZE, MIN(lp->width, lp->height) / HEX_MINGRIDSIZE);
+      else
+        lp->ys = MINSIZE;
+    } else
+      lp->ys = MIN(size, MAX(MINSIZE, MIN(lp->width, lp->height) /
+                 HEX_MINGRIDSIZE));
+    lp->xs = lp->ys;
+               nccols = MAX(lp->width / lp->xs - 2, HEX_ADAM_LOOPX + 1);
+               ncrows = MAX(lp->height / lp->ys - 1, HEX_ADAM_LOOPY + 1);
+    lp->ncols = nccols / 2;
+    lp->nrows = ncrows / 2;
+               lp->nrows -= !(lp->nrows & 1);  /* Must be odd */
+    lp->xb = (lp->width - lp->xs * nccols) / 2 + lp->xs;
+    lp->yb = (lp->height - lp->ys * ncrows) / 2 + lp->ys;
+    for (i = 0; i < 6; i++) {
+      lp->shape.hexagon[i].x = (lp->xs - 1) * hexagonUnit[i].x;
+      lp->shape.hexagon[i].y = ((lp->ys - 1) * hexagonUnit[i].y / 2) * 4 / 3;
+    }
+  } else {
+               if (size < -MINSIZE)
+                       lp->ys = NRAND(MIN(-size, MAX(MINSIZE, MIN(lp->width, lp->height) /
+                                             MINGRIDSIZE)) - MINSIZE + 1) + MINSIZE;
+               else if (size < MINSIZE) {
+                       if (!size)
+                               lp->ys = MAX(MINSIZE, MIN(lp->width, lp->height) / MINGRIDSIZE);
+                       else
+                               lp->ys = MINSIZE;
+               } else
+                       lp->ys = MIN(size, MAX(MINSIZE, MIN(lp->width, lp->height) /
+                                              MINGRIDSIZE));
+               lp->xs = lp->ys;
+               lp->ncols = MAX(lp->width / lp->xs, ADAM_LOOPX + 1);
+               lp->nrows = MAX(lp->height / lp->ys, ADAM_LOOPX + 1);
+               lp->xb = (lp->width - lp->xs * lp->ncols) / 2;
+               lp->yb = (lp->height - lp->ys * lp->nrows) / 2;
+       }
+       lp->bx = 1;
+       lp->by = 1;
+       lp->bncols = lp->ncols + 2 * lp->bx;
+       lp->bnrows = lp->nrows + 2 * lp->by;
+
+       MI_CLEARWINDOW(mi);
+
+       if (lp->oldcells != NULL) {
+               (void) free((void *) lp->oldcells);
+               lp->oldcells = NULL;
+       }       
+       if ((lp->oldcells = (unsigned char *) calloc(lp->bncols * lp->bnrows, sizeof (unsigned char))) == NULL) {
+               release_loop(mi);
+               return;
+       }
+       if (lp->newcells != NULL) {
+               (void) free((void *) lp->newcells);
+               lp->newcells = NULL;
+       }
+       if ((lp->newcells = (unsigned char *) calloc(lp->bncols * lp->bnrows, sizeof (unsigned char))) == NULL) {
+               release_loop(mi);
+               return;
+       }
+  if (init_table()) {
+               release_loop(mi);
+               return;
+       }
+       init_adam(mi);
+}
+
+void
+draw_loop(ModeInfo * mi)
+{
+       loopstruct *lp = &loops[MI_SCREEN(mi)];
+       int         offset, i, j, life = 0;
+       unsigned char *z, *znew;
+
+       if (loops == NULL) {
+               init_loop(mi);
+               return;
+       }
+       MI_IS_DRAWN(mi) = True;
+
+       for (j = lp->minrow; j <= lp->maxrow; j++) {
+               for (i = lp->mincol; i <= lp->maxcol; i++) {
+                       offset = j * lp->bncols + i;
+                       z = lp->oldcells + offset;
+                       znew = lp->newcells + offset;
+                       if (*z != *znew) {
+                               *z = *znew;
+                               addtolist(mi, i - lp->bx, j - lp->by, *znew);
+                               life = 1;
+                               if (i == lp->mincol && i > lp->bx)
+                                       lp->mincol--;
+                               if (j == lp->minrow && j > lp->by)
+                                       lp->minrow--;
+                               if (i == lp->maxcol && i < lp->bncols - 2 * lp->bx)
+                                       lp->maxcol++;
+                               if (j == lp->maxrow && j < lp->bnrows - 2 * lp->by)
+                                       lp->maxrow++;
+                       }
+               }
+       }
+       for (i = 0; i < COLORS; i++)
+               draw_state(mi, i);
+       if (++lp->generation > MI_CYCLES(mi) /* || !life */) {
+               init_loop(mi);
+               return;
+       } else
+               do_gen(lp);
+
+       if (lp->redrawing) {
+               for (i = 0; i < REDRAWSTEP; i++) {
+                       if ((*(lp->oldcells + lp->redrawpos))) {
+                               drawcell(mi, lp->redrawpos % lp->bncols - lp->bx,
+                                        lp->redrawpos / lp->bncols - lp->by,
+                                        *(lp->oldcells + lp->redrawpos));
+                       }
+                       if (++(lp->redrawpos) >= lp->bncols * (lp->bnrows - lp->bx)) {
+                               lp->redrawing = 0;
+                               break;
+                       }
+               }
+       }
+}
+
+void
+refresh_loop(ModeInfo * mi)
+{
+       loopstruct *lp = &loops[MI_SCREEN(mi)];
+
+       if (loops == NULL) {
+               init_loop(mi);
+               return;
+       }
+       MI_CLEARWINDOW(mi);
+       lp->redrawing = 1;
+       lp->redrawpos = lp->by * lp->ncols + lp->bx;
+}
diff --git a/hacks/maze.c b/hacks/maze.c
new file mode 100644 (file)
index 0000000..40edf41
--- /dev/null
@@ -0,0 +1,1764 @@
+/******************************************************************************
+ * [ maze ] ...
+ *
+ * modified:  [ 6-28-98 ]  Zack Weinberg <zack@rabi.phys.columbia.edu>
+ *
+ *              Made the maze-solver somewhat more intelligent.  There are
+ *              three optimizations:
+ *
+ *              - Straight-line lookahead: the solver does not enter dead-end
+ *                corridors.  This is a win with all maze generators.
+ *
+ *              - First order direction choice: the solver knows where the
+ *                exit is in relation to itself, and will try paths leading in
+ *                that direction first. This is a major win on maze generator 1
+ *                which tends to offer direct routes to the exit.
+ *
+ *              - Dead region elimination: the solver already has a map of
+ *                all squares visited.  Whenever it starts to backtrack, it
+ *                consults this map and marks off all squares that cannot be
+ *                reached from the exit without crossing a square already
+ *                visited.  Those squares can never contribute to the path to
+ *                the exit, so it doesn't bother checking them.  This helps a
+ *                lot with maze generator 2 and somewhat less with generator 1.
+ *
+ *              Further improvements would require knowledge of the wall map
+ *              as well as the position of the exit and the squares visited.
+ *              I would consider that to be cheating.  Generator 0 makes
+ *              mazes which are remarkably difficult to solve mechanically --
+ *              even with these optimizations the solver generally must visit
+ *              at least two-thirds of the squares.  This is partially
+ *              because generator 0's mazes have longer paths to the exit.
+ *
+ * modified:  [ 4-10-97 ]  Johannes Keukelaar <johannes@nada.kth.se>
+ *              Added multiple maze creators. Robustified solver.
+ *              Added bridge option.
+ * modified:  [ 8-11-95 ] Ed James <james@mml.mmc.com>
+ *              added fill of dead-end box to solve_maze while loop.
+ * modified:  [ 3-7-93 ]  Jamie Zawinski <jwz@jwz.org>
+ *             added the XRoger logo, cleaned up resources, made
+ *             grid size a parameter.
+ * modified:  [ 3-3-93 ]  Jim Randell <jmr@mddjmr.fc.hp.com>
+ *             Added the colour stuff and integrated it with jwz's
+ *             screenhack stuff.  There's still some work that could
+ *             be done on this, particularly allowing a resource to
+ *             specify how big the squares are.
+ * modified:  [ 10-4-88 ]  Richard Hess    ...!uunet!cimshop!rhess  
+ *              [ Revised primary execution loop within main()...
+ *              [ Extended X event handler, check_events()...
+ * modified:  [ 1-29-88 ]  Dave Lemke      lemke@sun.com  
+ *              [ Hacked for X11...
+ *              [  Note the word "hacked" -- this is extremely ugly, but at 
+ *              [   least it does the job.  NOT a good programming example 
+ *              [   for X.
+ * original:  [ 6/21/85 ]  Martin Weiss    Sun Microsystems  [ SunView ]
+ *
+ ******************************************************************************
+ Copyright 1988 by Sun Microsystems, Inc. Mountain View, CA.
+  
+ 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 permission notice appear in 
+ supporting documentation, and that the names of Sun or MIT not be
+ used in advertising or publicity pertaining to distribution of the
+ software without specific prior written permission. Sun and M.I.T. 
+ make no representations about the suitability of this software for 
+ any purpose. It is provided "as is" without any express or implied warranty.
+ SUN DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
+ ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ PURPOSE. IN NO EVENT SHALL SUN 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.
+ *****************************************************************************/
+
+#include "screenhack.h"
+#include "erase.h"
+
+#define XROGER
+
+static int solve_delay, pre_solve_delay, post_solve_delay;
+
+#include  <stdio.h>
+#include  <X11/Xlib.h>
+#include  <X11/Xutil.h>
+#ifndef VMS
+# include  <X11/bitmaps/gray1>
+#else  /* VMS */
+# include "sys$common:[decw$include.bitmaps]gray1.xbm"
+#endif /* VMS */
+
+#define MAX_MAZE_SIZE_X        500
+#define MAX_MAZE_SIZE_Y        500
+
+#define MOVE_LIST_SIZE  (MAX_MAZE_SIZE_X * MAX_MAZE_SIZE_Y)
+
+#define NOT_DEAD       0x8000
+#define SOLVER_VISIT    0x4000
+#define START_SQUARE   0x2000
+#define END_SQUARE     0x1000
+
+#define WALL_TOP       0x8
+#define WALL_RIGHT     0x4
+#define WALL_BOTTOM    0x2
+#define WALL_LEFT      0x1
+#define WALL_ANY       0xF
+
+#define DOOR_IN_TOP    0x800
+#define DOOR_IN_RIGHT  0x400
+#define DOOR_IN_BOTTOM 0x200
+#define DOOR_IN_LEFT   0x100
+#define DOOR_IN_ANY    0xF00
+
+#define DOOR_OUT_TOP   0x80
+#define DOOR_OUT_RIGHT 0x40
+#define DOOR_OUT_BOTTOM        0x20
+#define DOOR_OUT_LEFT  0x10
+
+
+#define        border_x        (0)
+#define        border_y        (0)
+
+#define        get_random(x)   (random() % (x))
+
+
+static int logo_x, logo_y;
+
+#ifdef XROGER
+# define logo_width  128
+# define logo_height 128
+#else
+# include  <X11/bitmaps/xlogo64>
+# define logo_width xlogo64_width
+# define logo_height xlogo64_height
+# define logo_bits xlogo64_bits
+#endif
+
+static unsigned short maze[MAX_MAZE_SIZE_X][MAX_MAZE_SIZE_Y];
+
+static struct {
+  unsigned char x;
+  unsigned char y;
+  unsigned char dir, ways;
+} move_list[MOVE_LIST_SIZE], save_path[MOVE_LIST_SIZE], path[MOVE_LIST_SIZE];
+
+static int maze_size_x, maze_size_y;
+static int sqnum, cur_sq_x, cur_sq_y, path_length;
+static int start_x, start_y, start_dir, end_x, end_y, end_dir;
+static int grid_width, grid_height;
+static int bw;
+
+static Display *dpy;
+static Window  win;
+static GC      gc, cgc, tgc, sgc, ugc, logo_gc, erase_gc;
+static Pixmap  logo_map;
+
+static int     x = 0, y = 0, restart = 0, stop = 1, state = 1, max_length;
+static int      sync_p, bridge_p;
+
+static int
+check_events (void)                        /* X event handler [ rhess ] */
+{
+  XEvent       e;
+
+  if (XPending(dpy)) {
+    XNextEvent(dpy, &e);
+    switch (e.type) {
+
+    case ButtonPress:
+      switch (e.xbutton.button) {
+      case 3:
+       exit (0);
+       break;
+      case 2:
+       stop = !stop ;
+       if (state == 5) state = 4 ;
+       else {
+         restart = 1;
+         stop = 0;
+       }
+       break;
+      default:
+       restart = 1 ;
+       stop = 0 ;
+       break;
+      }
+      break;
+
+    case ConfigureNotify:
+      restart = 1;
+      break;
+    case UnmapNotify:
+      stop = 1;
+      XClearWindow (dpy, win);
+      XSync (dpy, False);
+      break;
+    case Expose:
+      restart = 1;
+      break;
+    default:
+      screenhack_handle_event(dpy, &e);
+      break;
+    }
+    return(1);
+  }
+  return(0);
+}
+
+
+static void
+set_maze_sizes (int width, int height)
+{
+  maze_size_x = width / grid_width;
+  maze_size_y = height / grid_height;
+}
+
+
+static void
+initialize_maze (void) /* draw the surrounding wall and start/end squares */
+{
+  register int i, j, wall;
+  int logow = 1 + logo_width / grid_width;
+  int logoh = 1 + logo_height / grid_height;
+  
+  /* initialize all squares */
+  for ( i=0; i<maze_size_x; i++) {
+    for ( j=0; j<maze_size_y; j++) {
+      maze[i][j] = 0;
+    }
+  }
+  
+  /* top wall */
+  for ( i=0; i<maze_size_x; i++ ) {
+    maze[i][0] |= WALL_TOP;
+  }
+  
+  /* right wall */
+  for ( j=0; j<maze_size_y; j++ ) {
+    maze[maze_size_x-1][j] |= WALL_RIGHT;
+  }
+  
+  /* bottom wall */
+  for ( i=0; i<maze_size_x; i++ ) {
+    maze[i][maze_size_y-1] |= WALL_BOTTOM;
+  }
+  
+  /* left wall */
+  for ( j=0; j<maze_size_y; j++ ) {
+    maze[0][j] |= WALL_LEFT;
+  }
+  
+  /* set start square */
+  wall = get_random(4);
+  switch (wall) {
+  case 0:      
+    i = get_random(maze_size_x);
+    j = 0;
+    break;
+  case 1:      
+    i = maze_size_x - 1;
+    j = get_random(maze_size_y);
+    break;
+  case 2:      
+    i = get_random(maze_size_x);
+    j = maze_size_y - 1;
+    break;
+  case 3:      
+    i = 0;
+    j = get_random(maze_size_y);
+    break;
+  }
+  maze[i][j] |= START_SQUARE;
+  maze[i][j] |= ( DOOR_IN_TOP >> wall );
+  maze[i][j] &= ~( WALL_TOP >> wall );
+  cur_sq_x = i;
+  cur_sq_y = j;
+  start_x = i;
+  start_y = j;
+  start_dir = wall;
+  sqnum = 0;
+  
+  /* set end square */
+  wall = (wall + 2)%4;
+  switch (wall) {
+  case 0:
+    i = get_random(maze_size_x);
+    j = 0;
+    break;
+  case 1:
+    i = maze_size_x - 1;
+    j = get_random(maze_size_y);
+    break;
+  case 2:
+    i = get_random(maze_size_x);
+    j = maze_size_y - 1;
+    break;
+  case 3:
+    i = 0;
+    j = get_random(maze_size_y);
+    break;
+  }
+  maze[i][j] |= END_SQUARE;
+  maze[i][j] |= ( DOOR_OUT_TOP >> wall );
+  maze[i][j] &= ~( WALL_TOP >> wall );
+  end_x = i;
+  end_y = j;
+  end_dir = wall;
+  
+  /* set logo */
+  if ((maze_size_x-logow >= 6) && (maze_size_y-logoh >= 6))
+    {
+      /* not closer than 3 grid units from a wall */
+      logo_x = get_random (maze_size_x - logow - 5) + 3;
+      logo_y = get_random (maze_size_y - logoh - 5) + 3;
+      for (i=0; i<logow; i++)
+       for (j=0; j<logoh; j++)
+         maze[logo_x + i][logo_y + j] |= DOOR_IN_TOP;
+    }
+  else
+    logo_y = logo_x = -1;
+}
+
+static int choose_door (void);
+static int backup (void);
+static void draw_wall (int, int, int, GC);
+static void draw_solid_square (int, int, int, GC);
+/*static void enter_square (int);*/
+static void build_wall (int, int, int);
+/*static void break_wall (int, int, int);*/
+
+static void join_sets(int, int);
+
+/* For set_create_maze. */
+/* The sets that our squares are in. */
+static int *sets = 0;
+/* The `list' of hedges. */
+static int *hedges = 0;
+
+#define DEBUG_SETS 0
+
+/* Initialise the sets. */
+static void 
+init_sets(void)
+{
+  int i, t, r, x, y;
+
+  if(sets)
+    free(sets);
+  sets = (int *)malloc(maze_size_x*maze_size_y*sizeof(int));
+  if(!sets)
+    abort();
+  for(i = 0; i < maze_size_x*maze_size_y; i++)
+    {
+      sets[i] = i;
+    }
+  
+  if(hedges)
+    free(hedges);
+  hedges = (int *)malloc(maze_size_x*maze_size_y*2*sizeof(int));
+  if(!hedges)
+    abort();
+  for(i = 0; i < maze_size_x*maze_size_y*2; i++)
+    {
+      hedges[i] = i;
+    }
+  /* Mask out outside walls. */
+  for(i = 0; i < maze_size_y; i++)
+    {
+      hedges[2*((maze_size_x)*i+maze_size_x-1)+1] = -1;
+    }
+  for(i = 0; i < maze_size_x; i++)
+    {
+      hedges[2*((maze_size_y-1)*maze_size_x+i)] = -1;
+    }
+  /* Mask out a possible logo. */
+  if(logo_x!=-1)
+    {
+      int logow = 1 + logo_width / grid_width;
+      int logoh = 1 + logo_height / grid_height;
+      int bridge_dir, bridge_c;
+
+      if(bridge_p && logoh>=3 && logow>=3)
+       {
+         bridge_dir = 1+random()%2;
+         if(bridge_dir==1)
+           {
+             bridge_c = logo_y+random()%(logoh-2)+1;
+           }
+         else
+           {
+             bridge_c = logo_x+random()%(logow-2)+1;
+           }
+       }
+      else
+       {
+         bridge_dir = 0;
+         bridge_c = -1;
+       }
+
+      for(x = logo_x; x < logo_x+logow; x++)
+       for(y = logo_y; y < logo_y+logoh; y++)
+         {
+           /* I should check for the bridge here, except that I join the
+             * bridge together below.
+             */
+           hedges[2*(x+maze_size_x*y)+1] = -1;
+           hedges[2*(x+maze_size_x*y)] = -1;
+         }
+      for(x = logo_x; x < logo_x+logow; x++)
+       {
+         if(!(bridge_dir==2 && x==bridge_c))
+           {
+             build_wall(x, logo_y, 0);
+             build_wall(x, logo_y+logoh, 0);
+           }
+         hedges[2*(x+maze_size_x*(logo_y-1))] = -1;
+         if(bridge_dir==1)
+           {
+             build_wall(x, bridge_c, 0);
+             build_wall(x, bridge_c, 2);
+           }
+       }
+      for(y = logo_y; y < logo_y+logoh; y++)
+       {
+         if(!(bridge_dir==1 && y==bridge_c))
+           {
+             build_wall(logo_x, y, 3);
+             build_wall(logo_x+logow, y, 3);
+           }
+         hedges[2*(logo_x-1+maze_size_x*y)+1] = -1;
+         if(bridge_dir==2)
+           {
+             build_wall(bridge_c, y, 1);
+             build_wall(bridge_c, y, 3);
+           }
+       }
+      /* Join the whole bridge together. */
+      if(bridge_p)
+       {
+         if(bridge_dir==1)
+           {
+             x = logo_x-1;
+             y = bridge_c;
+             for(i = logo_x; i < logo_x+logow+1; i++)
+               join_sets(x+y*maze_size_x, i+y*maze_size_x);
+           }
+         else
+           {
+             y = logo_y-1;
+             x = bridge_c;
+             for(i = logo_y; i < logo_y+logoh+1; i++)
+               join_sets(x+y*maze_size_x, x+i*maze_size_x);
+           }
+       }
+    }
+
+  for(i = 0; i < maze_size_x*maze_size_y*2; i++)
+    {
+      t = hedges[i];
+      r = random()%(maze_size_x*maze_size_y*2);
+      hedges[i] = hedges[r];
+      hedges[r] = t;
+    }
+}
+
+/* Get the representative of a set. */
+static int
+get_set(int num)
+{
+  int s;
+
+  if(sets[num]==num)
+    return num;
+  else
+    {
+      s = get_set(sets[num]);
+      sets[num] = s;
+      return s;
+    }
+}
+
+/* Join two sets together. */
+static void
+join_sets(num1, num2)
+     int num1, num2;
+{
+  int s1, s2;
+
+  s1 = get_set(num1);
+  s2 = get_set(num2);
+  
+  if(s1<s2)
+    sets[s2] = s1;
+  else
+    sets[s1] = s2;
+}
+
+/* Exitialise the sets. */
+static void
+exit_sets(void)
+{
+  if(hedges)
+    free(hedges);
+  hedges = 0;
+  if(sets)
+    free(sets);
+  sets = 0;
+}
+
+#if DEBUG_SETS
+/* Temporary hack. */
+static void
+show_set(int num, GC gc)
+{
+  int x, y, set;
+
+  set = get_set(num);
+
+  for(x = 0; x < maze_size_x; x++)
+    for(y = 0; y < maze_size_y; y++)
+      {
+       if(get_set(x+y*maze_size_x)==set)
+         {
+           XFillRectangle(dpy, win, gc,  border_x + bw + grid_width * x, 
+                        border_y + bw + grid_height * y, 
+                        grid_width-2*bw , grid_height-2*bw);
+         }
+      }
+}
+#endif
+
+/* Second alternative maze creator: Put each square in the maze in a 
+ * separate set. Also, make a list of all the hedges. Randomize that list.
+ * Walk through the list. If, for a certain hedge, the two squares on both
+ * sides of it are in different sets, union the sets and remove the hedge.
+ * Continue until all hedges have been processed or only one set remains.
+ */
+static void
+set_create_maze(void)
+{
+  int i, h, x, y, dir, v, w;
+#if DEBUG_SETS
+  int cont = 0;
+  char c;
+#endif
+
+  /* Do almost all the setup. */
+  init_sets();
+
+  /* Start running through the hedges. */
+  for(i = 0; i < 2*maze_size_x*maze_size_y; i++)
+    { 
+      h = hedges[i];
+
+      /* This one is in the logo or outside border. */
+      if(h==-1)
+       continue;
+
+      dir = h%2?1:2;
+      x = (h>>1)%maze_size_x;
+      y = (h>>1)/maze_size_x;
+
+      v = x;
+      w = y;
+      switch(dir)
+       {
+       case 1:
+         v++;
+         break;
+       case 2:
+         w++;
+         break;
+       }
+
+#if DEBUG_SETS
+      show_set(x+y*maze_size_x, logo_gc);
+      show_set(v+w*maze_size_x, tgc);
+#endif
+      if(get_set(x+y*maze_size_x)!=get_set(v+w*maze_size_x))
+       {
+#if DEBUG_SETS
+         printf("Join!");
+#endif
+         join_sets(x+y*maze_size_x, v+w*maze_size_x);
+         /* Don't draw the wall. */
+       }
+      else
+       {
+#if DEBUG_SETS
+         printf("Build.");
+#endif
+         /* Don't join the sets. */
+         build_wall(x, y, dir); 
+       }
+#if DEBUG_SETS
+      if(!cont)
+       {
+         XSync(dpy, False);
+         c = getchar();
+         if(c=='c')
+           cont = 1;
+       }
+      show_set(x+y*maze_size_x, erase_gc);
+      show_set(v+w*maze_size_x, erase_gc);
+#endif
+    }
+
+  /* Free some memory. */
+  exit_sets();
+}
+
+/* First alternative maze creator: Pick a random, empty corner in the maze.
+ * Pick a random direction. Draw a wall in that direction, from that corner
+ * until we hit a wall. Option: Only draw the wall if it's going to be 
+ * shorter than a certain length. Otherwise we get lots of long walls.
+ */
+static void
+alt_create_maze(void)
+{
+  char *corners;
+  int *c_idx;
+  int i, j, height, width, open_corners, k, dir, x, y;
+
+  height = maze_size_y+1;
+  width = maze_size_x+1;
+
+  /* Allocate and clear some mem. */
+  corners = (char *)calloc(height*width, 1);
+  if(!corners)
+    return;
+
+  /* Set up the indexing array. */
+  c_idx = (int *)malloc(sizeof(int)*height*width);
+  if(!c_idx)
+    {
+      free(corners);
+      return;
+    }
+  for(i = 0; i < height*width; i++)
+    c_idx[i] = i;
+  for(i = 0; i < height*width; i++)
+    {
+      j = c_idx[i];
+      k = random()%(height*width);
+      c_idx[i] = c_idx[k];
+      c_idx[k] = j;
+    }
+
+  /* Set up some initial walls. */
+  /* Outside walls. */
+  for(i = 0; i < width; i++)
+    {
+      corners[i] = 1;
+      corners[i+width*(height-1)] = 1;
+    }
+  for(i = 0; i < height; i++)
+    {
+      corners[i*width] = 1;
+      corners[i*width+width-1] = 1;
+    }
+  /* Walls around logo. In fact, inside the logo, too. */
+  /* Also draw the walls. */
+  if(logo_x!=-1)
+    {
+      int logow = 1 + logo_width / grid_width;
+      int logoh = 1 + logo_height / grid_height;
+      int bridge_dir, bridge_c;
+
+      if(bridge_p && logoh>=3 && logow>=3)
+       {
+         bridge_dir = 1+random()%2;
+         if(bridge_dir==1)
+           {
+             bridge_c = logo_y+random()%(logoh-2)+1;
+           }
+         else
+           {
+             bridge_c = logo_x+random()%(logow-2)+1;
+           }
+       }
+      else
+       {
+         bridge_dir = 0;
+         bridge_c = -1;
+       }
+      for(i = logo_x; i <= logo_x + logow; i++)
+       {
+         for(j = logo_y; j <= logo_y + logoh; j++)
+           {
+             corners[i+width*j] = 1;
+           }
+       }
+      for(x = logo_x; x < logo_x+logow; x++)
+       {
+         if(!(bridge_dir==2 && x==bridge_c))
+           {
+             build_wall(x, logo_y, 0);
+             build_wall(x, logo_y+logoh, 0);
+           }
+         if(bridge_dir==1)
+           {
+             build_wall(x, bridge_c, 0);
+             build_wall(x, bridge_c, 2);
+           }
+       }
+      for(y = logo_y; y < logo_y+logoh; y++)
+       {
+         if(!(bridge_dir==1 && y==bridge_c))
+           {
+             build_wall(logo_x, y, 3);
+             build_wall(logo_x+logow, y, 3);
+           }
+         if(bridge_dir==2)
+           {
+             build_wall(bridge_c, y, 1);
+             build_wall(bridge_c, y, 3);
+           }
+       }
+      /* Connect one wall of the logo with an outside wall. */
+      if(bridge_p)
+       dir = (bridge_dir+1)%4;
+      else
+       dir = random()%4;
+      switch(dir)
+       {
+       case 0:
+         x = logo_x+(random()%(logow+1));
+         y = logo_y;
+         break;
+       case 1:
+         x = logo_x+logow;
+         y = logo_y+(random()%(logoh+1));
+         break;
+       case 2:
+         x = logo_x+(random()%(logow+1));
+         y = logo_y+logoh;
+         break;
+       case 3:
+         x = logo_x;
+         y = logo_y+(random()%(logoh+1));
+         break;
+       }
+      do
+       {
+         corners[x+width*y] = 1;
+         switch(dir)
+           {
+           case 0:
+             build_wall(x-1, y-1, 1);
+             y--;
+             break;
+           case 1:
+             build_wall(x, y, 0);
+             x++;
+             break;
+           case 2:
+             build_wall(x, y, 3);
+             y++;
+             break;
+           case 3:
+             build_wall(x-1, y-1, 2);
+             x--;
+             break;      
+           }
+       }
+      while(!corners[x+width*y]);
+      if(bridge_p)
+       {
+         dir = (dir+2)%4;
+         switch(dir)
+           {
+           case 0:
+             x = logo_x+(random()%(logow+1));
+             y = logo_y;
+             break;
+           case 1:
+             x = logo_x+logow;
+             y = logo_y+(random()%(logoh+1));
+             break;
+           case 2:
+             x = logo_x+(random()%(logow+1));
+             y = logo_y+logoh;
+             break;
+           case 3:
+             x = logo_x;
+             y = logo_y+(random()%(logoh+1));
+             break;
+           }
+         do
+           {
+             corners[x+width*y] = 1;
+             switch(dir)
+               {
+               case 0:
+                 build_wall(x-1, y-1, 1);
+                 y--;
+                 break;
+               case 1:
+                 build_wall(x, y, 0);
+                 x++;
+                 break;
+               case 2:
+                 build_wall(x, y, 3);
+                 y++;
+                 break;
+               case 3:
+                 build_wall(x-1, y-1, 2);
+                 x--;
+                 break;          
+               }
+           }
+         while(!corners[x+width*y]);
+       }
+    }
+
+  /* Count open gridpoints. */
+  open_corners = 0;
+  for(i = 0; i < width; i++)
+    for(j = 0; j < height; j++)
+      if(!corners[i+width*j])
+       open_corners++;
+
+  /* Now do actual maze generation. */
+  while(open_corners>0)
+    {
+      for(i = 0; i < width*height; i++)
+       {
+         if(!corners[c_idx[i]])
+           {
+             x = c_idx[i]%width;
+             y = c_idx[i]/width;
+             /* Choose a random direction. */
+             dir = random()%4;
+             
+             k = 0;
+             /* Measure the length of the wall we'd draw. */
+             while(!corners[x+width*y])
+               {
+                 k++;
+                 switch(dir)
+                   {
+                   case 0:
+                     y--;
+                     break;
+                   case 1:
+                     x++;
+                     break;
+                   case 2:
+                     y++;
+                     break;
+                   case 3:
+                     x--;
+                     break;
+                   }
+               }
+             
+             if(k<=max_length)
+               {
+                 x = c_idx[i]%width;
+                 y = c_idx[i]/width;
+                 
+                 /* Draw a wall until we hit something. */
+                 while(!corners[x+width*y])
+                   {
+                     open_corners--;
+                     corners[x+width*y] = 1;
+                     switch(dir)
+                       {
+                       case 0:
+                         build_wall(x-1, y-1, 1);
+                         y--;
+                         break;
+                       case 1:
+                         build_wall(x, y, 0);
+                         x++;
+                         break;
+                       case 2:
+                         build_wall(x, y, 3);
+                         y++;
+                         break;
+                       case 3:
+                         build_wall(x-1, y-1, 2);
+                         x--;
+                         break;
+                       }
+                   }
+               }
+           }
+       }
+    }
+
+  /* Free some memory we used. */
+  free(corners);
+  free(c_idx);
+}
+
+/* The original maze creator. Start somewhere. Take a step in a random 
+ * direction. Keep doing this until we hit a wall. Then, backtrack until
+ * we find a point where we can go in another direction.
+ */
+static void
+create_maze (void)    /* create a maze layout given the initialized maze */
+{
+  register int i, newdoor = 0;
+  int logow = 1 + logo_width / grid_width;
+  int logoh = 1 + logo_height / grid_height;
+  
+  /* Maybe we should make a bridge? */
+  if(bridge_p && logo_x>=0 && logow>=3 && logoh>=3)
+    {
+      int bridge_dir, bridge_c;
+
+      bridge_dir = 1+random()%2;
+      if(bridge_dir==1)
+       {
+         if(logoh>=3)
+           bridge_c = logo_y+random()%(logoh-2)+1;
+         else
+           bridge_c = logo_y+random()%logoh;
+       }
+      else
+       {
+         if(logow>=3)
+           bridge_c = logo_x+random()%(logow-2)+1;
+         else
+           bridge_c = logo_x+random()%logow;
+       }
+
+      if(bridge_dir==1)
+       {
+         for(i = logo_x; i < logo_x+logow; i++)
+           {
+             maze[i][bridge_c] &= ~DOOR_IN_TOP;
+           }
+       }
+      else
+       {
+         for(i = logo_y; i < logo_y+logoh; i++)
+           {
+             maze[bridge_c][i] &= ~DOOR_IN_TOP;
+           }
+       }
+    }
+
+  do {
+    move_list[sqnum].x = cur_sq_x;
+    move_list[sqnum].y = cur_sq_y;
+    move_list[sqnum].dir = newdoor;
+    while ( ( newdoor = choose_door() ) == -1 ) { /* pick a door */
+      if ( backup() == -1 ) { /* no more doors ... backup */
+       return; /* done ... return */
+      }
+    }
+    
+    /* mark the out door */
+    maze[cur_sq_x][cur_sq_y] |= ( DOOR_OUT_TOP >> newdoor );
+    
+    switch (newdoor) {
+    case 0: cur_sq_y--;
+      break;
+    case 1: cur_sq_x++;
+      break;
+    case 2: cur_sq_y++;
+      break;
+    case 3: cur_sq_x--;
+      break;
+    }
+    sqnum++;
+    
+    /* mark the in door */
+    maze[cur_sq_x][cur_sq_y] |= ( DOOR_IN_TOP >> ((newdoor+2)%4) );
+    
+    /* if end square set path length and save path */
+    if ( maze[cur_sq_x][cur_sq_y] & END_SQUARE ) {
+      path_length = sqnum;
+      for ( i=0; i<path_length; i++) {
+       save_path[i].x = move_list[i].x;
+       save_path[i].y = move_list[i].y;
+       save_path[i].dir = move_list[i].dir;
+      }
+    }
+    
+  } while (1);
+  
+}
+
+
+static int
+choose_door (void)                                   /* pick a new path */
+{
+  int candidates[3];
+  register int num_candidates;
+  
+  num_candidates = 0;
+  
+  /* top wall */
+  if ( maze[cur_sq_x][cur_sq_y] & DOOR_IN_TOP )
+    goto rightwall;
+  if ( maze[cur_sq_x][cur_sq_y] & DOOR_OUT_TOP )
+    goto rightwall;
+  if ( maze[cur_sq_x][cur_sq_y] & WALL_TOP )
+    goto rightwall;
+  if ( maze[cur_sq_x][cur_sq_y - 1] & DOOR_IN_ANY ) {
+    maze[cur_sq_x][cur_sq_y] |= WALL_TOP;
+    maze[cur_sq_x][cur_sq_y - 1] |= WALL_BOTTOM;
+    draw_wall(cur_sq_x, cur_sq_y, 0, gc);
+    goto rightwall;
+  }
+  candidates[num_candidates++] = 0;
+  
+ rightwall:
+  /* right wall */
+  if ( maze[cur_sq_x][cur_sq_y] & DOOR_IN_RIGHT )
+    goto bottomwall;
+  if ( maze[cur_sq_x][cur_sq_y] & DOOR_OUT_RIGHT )
+    goto bottomwall;
+  if ( maze[cur_sq_x][cur_sq_y] & WALL_RIGHT )
+    goto bottomwall;
+  if ( maze[cur_sq_x + 1][cur_sq_y] & DOOR_IN_ANY ) {
+    maze[cur_sq_x][cur_sq_y] |= WALL_RIGHT;
+    maze[cur_sq_x + 1][cur_sq_y] |= WALL_LEFT;
+    draw_wall(cur_sq_x, cur_sq_y, 1, gc);
+    goto bottomwall;
+  }
+  candidates[num_candidates++] = 1;
+  
+ bottomwall:
+  /* bottom wall */
+  if ( maze[cur_sq_x][cur_sq_y] & DOOR_IN_BOTTOM )
+    goto leftwall;
+  if ( maze[cur_sq_x][cur_sq_y] & DOOR_OUT_BOTTOM )
+    goto leftwall;
+  if ( maze[cur_sq_x][cur_sq_y] & WALL_BOTTOM )
+    goto leftwall;
+  if ( maze[cur_sq_x][cur_sq_y + 1] & DOOR_IN_ANY ) {
+    maze[cur_sq_x][cur_sq_y] |= WALL_BOTTOM;
+    maze[cur_sq_x][cur_sq_y + 1] |= WALL_TOP;
+    draw_wall(cur_sq_x, cur_sq_y, 2, gc);
+    goto leftwall;
+  }
+  candidates[num_candidates++] = 2;
+  
+ leftwall:
+  /* left wall */
+  if ( maze[cur_sq_x][cur_sq_y] & DOOR_IN_LEFT )
+    goto donewall;
+  if ( maze[cur_sq_x][cur_sq_y] & DOOR_OUT_LEFT )
+    goto donewall;
+  if ( maze[cur_sq_x][cur_sq_y] & WALL_LEFT )
+    goto donewall;
+  if ( maze[cur_sq_x - 1][cur_sq_y] & DOOR_IN_ANY ) {
+    maze[cur_sq_x][cur_sq_y] |= WALL_LEFT;
+    maze[cur_sq_x - 1][cur_sq_y] |= WALL_RIGHT;
+    draw_wall(cur_sq_x, cur_sq_y, 3, gc);
+    goto donewall;
+  }
+  candidates[num_candidates++] = 3;
+  
+ donewall:
+  if (num_candidates == 0)
+    return ( -1 );
+  if (num_candidates == 1)
+    return ( candidates[0] );
+  return ( candidates[ get_random(num_candidates) ] );
+  
+}
+
+
+static int
+backup (void)                                          /* back up a move */
+{
+  sqnum--;
+  cur_sq_x = move_list[sqnum].x;
+  cur_sq_y = move_list[sqnum].y;
+  return ( sqnum );
+}
+
+
+static void
+draw_maze_border (void)                         /* draw the maze outline */
+{
+  register int i, j;
+  
+  
+  for ( i=0; i<maze_size_x; i++) {
+    if ( maze[i][0] & WALL_TOP ) {
+      XDrawLine(dpy, win, gc,
+               border_x + grid_width * i,
+               border_y,
+               border_x + grid_width * (i+1) - 1,
+               border_y);
+    }
+    if ((maze[i][maze_size_y - 1] & WALL_BOTTOM)) {
+      XDrawLine(dpy, win, gc,
+               border_x + grid_width * i,
+               border_y + grid_height * (maze_size_y) - 1,
+               border_x + grid_width * (i+1) - 1,
+               border_y + grid_height * (maze_size_y) - 1);
+    }
+  }
+  for ( j=0; j<maze_size_y; j++) {
+    if ( maze[maze_size_x - 1][j] & WALL_RIGHT ) {
+      XDrawLine(dpy, win, gc,
+               border_x + grid_width * maze_size_x - 1,
+               border_y + grid_height * j,
+               border_x + grid_width * maze_size_x - 1,
+               border_y + grid_height * (j+1) - 1);
+    }
+    if ( maze[0][j] & WALL_LEFT ) {
+      XDrawLine(dpy, win, gc,
+               border_x,
+               border_y + grid_height * j,
+               border_x,
+               border_y + grid_height * (j+1) - 1);
+    }
+  }
+  
+  if (logo_x != -1)
+    {
+      Window r;
+      int x, y;
+      unsigned int w, h, bw, d;
+      XGetGeometry (dpy, logo_map, &r, &x, &y, &w, &h, &bw, &d);
+      XCopyPlane (dpy, logo_map, win, logo_gc,
+                 0, 0, w, h,
+                 border_x + 3 + grid_width * logo_x,
+                 border_y + 3 + grid_height * logo_y, 1);
+    }
+  draw_solid_square (start_x, start_y, WALL_TOP >> start_dir, tgc);
+  draw_solid_square (end_x, end_y, WALL_TOP >> end_dir, tgc);
+}
+
+
+static void
+draw_wall(int i, int j, int dir, GC gc)                /* draw a single wall */
+{
+  switch (dir) {
+  case 0:
+    XDrawLine(dpy, win, gc,
+             border_x + grid_width * i, 
+             border_y + grid_height * j,
+             border_x + grid_width * (i+1), 
+             border_y + grid_height * j);
+    break;
+  case 1:
+    XDrawLine(dpy, win, gc,
+             border_x + grid_width * (i+1), 
+             border_y + grid_height * j,
+             border_x + grid_width * (i+1), 
+             border_y + grid_height * (j+1));
+    break;
+  case 2:
+    XDrawLine(dpy, win, gc,
+             border_x + grid_width * i, 
+             border_y + grid_height * (j+1),
+             border_x + grid_width * (i+1), 
+             border_y + grid_height * (j+1));
+    break;
+  case 3:
+    XDrawLine(dpy, win, gc,
+             border_x + grid_width * i, 
+             border_y + grid_height * j,
+             border_x + grid_width * i, 
+             border_y + grid_height * (j+1));
+    break;
+  }
+  if(sync_p)
+    XSync(dpy, False);
+}
+
+/* Actually build a wall. */
+static void
+build_wall(i, j, dir)
+     int i, j, dir;
+{
+  /* Draw it on the screen. */
+  draw_wall(i, j, dir, gc);
+  /* Put it in the maze. */
+  switch(dir)
+    {
+    case 0:
+      maze[i][j] |= WALL_TOP;
+      if(j>0)
+       maze[i][j-1] |= WALL_BOTTOM;
+      break;
+    case 1:
+      maze[i][j] |= WALL_RIGHT;
+      if(i<maze_size_x-1)
+       maze[i+1][j] |= WALL_LEFT;
+      break;
+    case 2:
+      maze[i][j] |= WALL_BOTTOM;
+      if(j<maze_size_y-1)
+       maze[i][j+1] |= WALL_TOP;
+      break;
+    case 3:
+      maze[i][j] |= WALL_LEFT;
+      if(i>0)
+       maze[i-1][j] |= WALL_RIGHT;
+      break;
+    }
+}
+
+/* Break out a wall. */
+#if 0
+static void
+break_wall(i, j, dir)
+     int i, j, dir;
+{
+  /* Draw it on the screen. */
+  draw_wall(i, j, dir, erase_gc);
+  /* Put it in the maze. */
+  switch(dir)
+    {
+    case 0:
+      maze[i][j] &= ~WALL_TOP;
+      if(j>0)
+       maze[i][j-1] &= ~WALL_BOTTOM;
+      break;
+    case 1:
+      maze[i][j] &= ~WALL_RIGHT;
+      if(i<maze_size_x-1)
+       maze[i+1][j] &= ~WALL_LEFT;
+      break;
+    case 2:
+      maze[i][j] &= ~WALL_BOTTOM;
+      if(j<maze_size_y-1)
+       maze[i][j+1] &= ~WALL_BOTTOM;
+      break;
+    case 3:
+      maze[i][j] &= ~WALL_LEFT;
+      if(i>0)
+       maze[i-1][j] &= ~WALL_RIGHT;
+      break;
+    }
+}
+#endif /* 0 */
+
+
+static void
+draw_solid_square(int i, int j,          /* draw a solid square in a square */
+                 int dir, GC gc)
+{
+  switch (dir) {
+  case WALL_TOP:
+      XFillRectangle(dpy, win, gc,
+                    border_x + bw + grid_width * i, 
+                    border_y - bw + grid_height * j, 
+                    grid_width - (bw+bw), grid_height);
+      break;
+  case WALL_RIGHT:
+      XFillRectangle(dpy, win, gc,
+                    border_x + bw + grid_width * i, 
+                    border_y + bw + grid_height * j, 
+                    grid_width, grid_height - (bw+bw));
+      break;
+  case WALL_BOTTOM:
+      XFillRectangle(dpy, win, gc,
+                    border_x + bw + grid_width * i, 
+                    border_y + bw + grid_height * j, 
+                    grid_width - (bw+bw), grid_height);
+      break;
+  case WALL_LEFT:
+      XFillRectangle(dpy, win, gc,
+                    border_x - bw + grid_width * i, 
+                    border_y + bw + grid_height * j, 
+                    grid_width, grid_height - (bw+bw));
+      break;
+  }
+  XSync (dpy, False);
+}
+
+int
+longdeadend_p(int x1, int y1, int x2, int y2, int endwall)
+{
+    int dx = x2 - x1, dy = y2 - y1;
+    int sidewalls;
+
+    sidewalls = endwall | (endwall >> 2 | endwall << 2);
+    sidewalls = ~sidewalls & WALL_ANY;
+
+    while((maze[x2][y2] & WALL_ANY) == sidewalls)
+    {
+       x2 += dx;
+       y2 += dy;
+    }
+
+    if((maze[x2][y2] & WALL_ANY) == (sidewalls | endwall))
+    {
+       endwall = (endwall >> 2 | endwall << 2) & WALL_ANY;
+       while(x1 != x2 || y1 != y2)
+       {
+           x1 += dx;
+           y1 += dy;
+           draw_solid_square(x1, y1, endwall, sgc);
+           maze[x1][y1] |= SOLVER_VISIT;
+       }
+       return 1;
+    }
+    else
+       return 0;
+}
+
+/* Find all dead regions -- areas from which the goal cannot be reached --
+   and mark them visited. */
+void
+find_dead_regions(void)
+{
+    int x, y, flipped;
+
+    /* Find all not SOLVER_VISIT squares bordering NOT_DEAD squares
+       and mark them NOT_DEAD also.  Repeat until no more such squares. */
+    maze[start_x][start_y] |= NOT_DEAD;
+    
+    do
+    {
+       flipped = 0;
+       for(x = 0; x < maze_size_x; x++)
+           for(y = 0; y < maze_size_y; y++)
+               if(!(maze[x][y] & (SOLVER_VISIT | NOT_DEAD))
+                  && (   (x && (maze[x-1][y] & NOT_DEAD))
+                      || (y && (maze[x][y-1] & NOT_DEAD))))
+               {
+                   flipped = 1;
+                   maze[x][y] |= NOT_DEAD;
+               }
+       for(x = maze_size_x-1; x >= 0; x--)
+           for(y = maze_size_y-1; y >= 0; y--)
+               if(!(maze[x][y] & (SOLVER_VISIT | NOT_DEAD))
+                  && (   (x != maze_size_x-1 && (maze[x+1][y] & NOT_DEAD))
+                      || (y != maze_size_y-1 && (maze[x][y+1] & NOT_DEAD))))
+               {
+                   flipped = 1;
+                   maze[x][y] |= NOT_DEAD;
+               }
+    }
+    while(flipped);
+
+    for (y = 0; y < maze_size_y; y++)
+      for (x = 0; x < maze_size_x; x++)
+      {
+       if (maze[x][y] & NOT_DEAD)
+         maze[x][y] &= ~NOT_DEAD;
+       else if (!(maze[x][y] & SOLVER_VISIT))
+       {
+         maze[x][y] |= SOLVER_VISIT;
+         if((x < logo_x || x > logo_x + logo_width / grid_width) ||
+            (y < logo_y || y > logo_y + logo_height / grid_height))
+         {
+           if (!maze[x][y] & WALL_ANY)
+             XFillRectangle(dpy, win, ugc,
+                            border_x + bw + grid_width * x,
+                            border_y + bw + grid_height * y,
+                            grid_width - (bw+bw), grid_height - (bw+bw));
+           else
+           {
+             if (! (maze[x][y] & WALL_LEFT))
+               draw_solid_square(x, y, WALL_LEFT, ugc);
+             if (! (maze[x][y] & WALL_RIGHT))
+               draw_solid_square(x, y, WALL_RIGHT, ugc);
+             if (! (maze[x][y] & WALL_TOP))
+               draw_solid_square(x, y, WALL_TOP, ugc);
+             if (! (maze[x][y] & WALL_BOTTOM))
+               draw_solid_square(x, y, WALL_BOTTOM, ugc);
+           }
+         }
+       }
+      }
+    XSync(dpy, False);
+}
+
+static void
+solve_maze (void)                     /* solve it with graphical feedback */
+{
+    int i, dir, from, x, y, ways, bt = 0;
+
+    /* plug up the surrounding wall */
+    maze[end_x][end_y] |= (WALL_TOP >> end_dir);
+    
+    /* initialize search path */
+    i = 0;
+    path[i].x = end_x;
+    path[i].y = end_y;
+    path[i].dir = 0;
+    maze[end_x][end_y] |= SOLVER_VISIT;
+    
+    /* do it */
+    while (1)
+    {
+       if ( maze[path[i].x][path[i].y] & START_SQUARE )
+           return;
+
+       /* Abort solve on expose - cheapo repaint strategy */
+       if (check_events()) return;
+       
+       if (solve_delay) usleep (solve_delay);
+       
+       if(!path[i].dir)
+       {
+           ways = 0;
+           /* First visit this square.  Which adjacent squares are open? */
+           for(dir = WALL_TOP; dir & WALL_ANY; dir >>= 1)
+           {
+               if(maze[path[i].x][path[i].y] & dir)
+                   continue;
+               
+               y = path[i].y - !!(dir & WALL_TOP) + !!(dir & WALL_BOTTOM);
+               x = path[i].x + !!(dir & WALL_RIGHT) - !!(dir & WALL_LEFT);
+               
+               if(maze[x][y] & SOLVER_VISIT)
+                   continue;
+               
+               from = (dir << 2 & WALL_ANY) | (dir >> 2 & WALL_ANY);
+               /* don't enter obvious dead ends */
+               if(((maze[x][y] & WALL_ANY) | from) != WALL_ANY)
+               {
+                   if(!longdeadend_p(path[i].x, path[i].y, x, y, dir))
+                       ways |= dir;
+               }
+               else
+               {
+                   draw_solid_square(x, y, from, sgc);
+                   maze[x][y] |= SOLVER_VISIT;
+               }
+           }
+       }
+       else
+           ways = path[i].ways;
+       /* ways now has a bitmask of open paths. */
+       
+       if(!ways)
+           goto backtrack;
+      
+       x = path[i].x - start_x;
+       y = path[i].y - start_y;
+       /* choice one */
+       if(abs(y) <= abs(x))
+           dir = (x > 0) ? WALL_LEFT : WALL_RIGHT;
+       else
+           dir = (y > 0) ? WALL_TOP : WALL_BOTTOM;
+       
+       if(dir & ways)
+           goto found;
+       
+       /* choice two */
+       switch(dir)
+       {
+       case WALL_LEFT:
+       case WALL_RIGHT:
+           dir = (y > 0) ? WALL_TOP : WALL_BOTTOM; break;
+       case WALL_TOP:
+       case WALL_BOTTOM:
+           dir = (x > 0) ? WALL_LEFT : WALL_RIGHT;
+       }
+       
+       if(dir & ways)
+           goto found;
+       
+       /* choice three */
+       
+       dir = (dir << 2 & WALL_ANY) | (dir >> 2 & WALL_ANY);
+       if(dir & ways)
+           goto found;
+       
+       /* choice four */
+       dir = ways;
+       if(!dir)
+           goto backtrack;
+
+    found:
+       bt = 0;
+       ways &= ~dir;  /* tried this one */
+       
+       y = path[i].y - !!(dir & WALL_TOP) + !!(dir & WALL_BOTTOM);
+       x = path[i].x + !!(dir & WALL_RIGHT) - !!(dir & WALL_LEFT);
+       
+       /* advance in direction dir */
+       path[i].dir = dir;
+       path[i].ways = ways;
+       draw_solid_square(path[i].x, path[i].y, dir, tgc);
+       
+       i++;
+       path[i].dir = 0;
+       path[i].ways = 0;
+       path[i].x = x;
+       path[i].y = y;
+       maze[x][y] |= SOLVER_VISIT;
+       continue;
+
+    backtrack:
+       if(i == 0)
+       {
+           printf("Unsolvable maze.\n");
+           return;
+       }
+
+       if(!bt)
+           find_dead_regions();
+       bt = 1;
+       from = path[i-1].dir;
+       from = (from << 2 & WALL_ANY) | (from >> 2 & WALL_ANY);
+       
+       draw_solid_square(path[i].x, path[i].y, from, cgc);
+       i--;
+    }
+} 
+
+#if 0
+static void
+enter_square (int n)                      /* move into a neighboring square */
+{
+  draw_solid_square( (int)path[n].x, (int)path[n].y, 
+                   (int)path[n].dir, tgc);
+  
+  path[n+1].dir = -1;
+  switch (path[n].dir) {
+  case 0: path[n+1].x = path[n].x;
+    path[n+1].y = path[n].y - 1;
+    break;
+  case 1: path[n+1].x = path[n].x + 1;
+    path[n+1].y = path[n].y;
+    break;
+  case 2: path[n+1].x = path[n].x;
+    path[n+1].y = path[n].y + 1;
+    break;
+  case 3: path[n+1].x = path[n].x - 1;
+    path[n+1].y = path[n].y;
+    break;
+  }
+}
+#endif /* 0 */
+
+
+/*
+ *  jmr additions for Jamie Zawinski's <jwz@jwz.org> screensaver stuff,
+ *  note that the code above this has probably been hacked about in some
+ *  arbitrary way.
+ */
+
+char *progclass = "Maze";
+
+char *defaults[] = {
+  ".background:        black",
+  ".foreground:        white",
+  "*gridSize:  0",
+  "*solveDelay:        5000",
+  "*preDelay:  2000000",
+  "*postDelay: 4000000",
+  "*liveColor: green",
+  "*deadColor: red",
+  "*skipColor:  orange",
+  "*surroundColor: slateblue",
+  "*generator:  -1",
+  "*maxLength:  5",
+  "*syncDraw:   False",
+  "*bridge:     False",
+#ifdef XROGER
+  "*logoColor: red3",
+#endif
+  0
+};
+
+XrmOptionDescRec options[] = {
+  { "-grid-size",      ".gridSize",    XrmoptionSepArg, 0 },
+  { "-solve-delay",    ".solveDelay",  XrmoptionSepArg, 0 },
+  { "-pre-delay",      ".preDelay",    XrmoptionSepArg, 0 },
+  { "-post-delay",     ".postDelay",   XrmoptionSepArg, 0 },
+  { "-live-color",     ".liveColor",   XrmoptionSepArg, 0 },
+  { "-dead-color",     ".deadColor",   XrmoptionSepArg, 0 },
+  { "-skip-color",     ".skipColor",   XrmoptionSepArg, 0 },
+  { "-surround-color", ".surroundColor",XrmoptionSepArg, 0 },
+  { "-generator",       ".generator",   XrmoptionSepArg, 0 },
+  { "-max-length",      ".maxLength",   XrmoptionSepArg, 0 },
+  { "-bridge",          ".bridge",      XrmoptionNoArg, "True" },
+  { "-no-bridge",       ".bridge",      XrmoptionNoArg, "False" },
+  { 0, 0, 0, 0 }
+};
+
+#ifdef XROGER
+extern void skull (Display *, Window, GC, GC, int, int, int, int);
+#endif
+
+void
+screenhack(Display *display, Window window)
+{
+  Pixmap gray;
+  int size, root, generator, this_gen;
+  XWindowAttributes xgwa;
+  unsigned long bg, fg, pfg, pbg, lfg, sfg, ufg;
+
+  size = get_integer_resource ("gridSize", "Dimension");
+  root = get_boolean_resource("root", "Boolean");
+  solve_delay = get_integer_resource ("solveDelay", "Integer");
+  pre_solve_delay = get_integer_resource ("preDelay", "Integer");
+  post_solve_delay = get_integer_resource ("postDelay", "Integer");
+  generator = get_integer_resource("generator", "Integer");
+  max_length = get_integer_resource("maxLength", "Integer");
+  bridge_p = get_boolean_resource("bridge", "Boolean");
+
+  if (size < 2) size = 7 + (random () % 30);
+  grid_width = grid_height = size;
+  bw = (size > 6 ? 3 : (size-1)/2);
+
+  dpy = display; win = window; /* the maze stuff uses global variables */
+
+  XGetWindowAttributes (dpy, win, &xgwa);
+
+  x = 0;
+  y = 0;
+
+  set_maze_sizes (xgwa.width, xgwa.height);
+
+  if (! root)
+    {
+      XWindowAttributes xgwa;
+      XGetWindowAttributes (dpy, window, &xgwa);
+      XSelectInput (dpy, win,
+                    xgwa.your_event_mask | ExposureMask |
+                    ButtonPressMask |StructureNotifyMask);
+    }
+  
+  gc  = XCreateGC(dpy, win, 0, 0);
+  cgc = XCreateGC(dpy, win, 0, 0);
+  tgc = XCreateGC(dpy, win, 0, 0);
+  sgc = XCreateGC(dpy, win, 0, 0);
+  ugc = XCreateGC(dpy, win, 0, 0);
+  logo_gc = XCreateGC(dpy, win, 0, 0);
+  erase_gc = XCreateGC(dpy, win, 0, 0);
+  
+  gray = XCreateBitmapFromData (dpy,win,gray1_bits,gray1_width,gray1_height);
+
+  bg  = get_pixel_resource ("background","Background", dpy, xgwa.colormap);
+  fg  = get_pixel_resource ("foreground","Foreground", dpy, xgwa.colormap);
+  lfg = get_pixel_resource ("logoColor", "Foreground", dpy, xgwa.colormap);
+  pfg = get_pixel_resource ("liveColor", "Foreground", dpy, xgwa.colormap);
+  pbg = get_pixel_resource ("deadColor", "Foreground", dpy, xgwa.colormap);
+  sfg = get_pixel_resource ("skipColor", "Foreground", dpy, xgwa.colormap);
+  ufg = get_pixel_resource ("surroundColor", "Foreground", dpy, xgwa.colormap);
+  if (mono_p) lfg = pfg = fg;
+
+  if (lfg == bg)
+    lfg = ((bg == WhitePixel (dpy, DefaultScreen (dpy)))
+          ? BlackPixel (dpy, DefaultScreen (dpy))
+          : WhitePixel (dpy, DefaultScreen (dpy)));
+
+  XSetForeground (dpy, gc, fg);
+  XSetBackground (dpy, gc, bg);
+  XSetForeground (dpy, cgc, pbg);
+  XSetBackground (dpy, cgc, bg);
+  XSetForeground (dpy, tgc, pfg);
+  XSetBackground (dpy, tgc, bg);
+  XSetForeground (dpy, sgc, sfg);
+  XSetBackground (dpy, sgc, bg);
+  XSetForeground (dpy, ugc, ufg);
+  XSetBackground (dpy, ugc, bg);
+  XSetForeground (dpy, logo_gc, lfg);
+  XSetBackground (dpy, logo_gc, bg);
+  XSetForeground (dpy, erase_gc, bg);
+  XSetBackground (dpy, erase_gc, bg);
+
+  XSetStipple (dpy, cgc, gray);
+  XSetFillStyle (dpy, cgc, FillOpaqueStippled);
+  XSetStipple (dpy, sgc, gray);
+  XSetFillStyle (dpy, sgc, FillOpaqueStippled);
+  XSetStipple (dpy, ugc, gray);
+  XSetFillStyle (dpy, ugc, FillOpaqueStippled);
+  
+#ifdef XROGER
+  {
+    int w, h;
+    XGCValues gcv;
+    GC draw_gc, erase_gc;
+    /* round up to grid size */
+    w = ((logo_width  / grid_width) + 1)  * grid_width;
+    h = ((logo_height / grid_height) + 1) * grid_height;
+    logo_map = XCreatePixmap (dpy, win, w, h, 1);
+    gcv.foreground = 1L;
+    draw_gc = XCreateGC (dpy, logo_map, GCForeground, &gcv);
+    gcv.foreground = 0L;
+    erase_gc= XCreateGC (dpy, logo_map, GCForeground, &gcv);
+    XFillRectangle (dpy, logo_map, erase_gc, 0, 0, w, h);
+    skull (dpy, logo_map, draw_gc, erase_gc, 5, 0, w-10, h-10);
+    XFreeGC (dpy, draw_gc);
+    XFreeGC (dpy, erase_gc);
+  }
+#else
+  if  (!(logo_map = XCreateBitmapFromData (dpy, win, logo_bits,
+                                          logo_width, logo_height)))
+    {
+      fprintf (stderr, "Can't create logo pixmap\n");
+      exit (1);
+    }
+#endif
+  XMapRaised(dpy, win);
+
+  restart = root;
+
+  sync_p = !(random() % 10);
+
+  while (1) {                            /* primary execution loop [ rhess ] */
+    if (check_events()) continue ;
+    if (restart || stop) goto pop;
+    switch (state) {
+    case 1:
+      initialize_maze();
+      break;
+    case 2:
+      XClearWindow(dpy, win);
+      draw_maze_border();
+      break;
+    case 3:
+      this_gen = generator;
+      if(this_gen<0 || this_gen>2)
+       this_gen = random()%3;
+
+      switch(this_gen)
+       {
+       case 0:
+         create_maze();
+         break;
+       case 1:
+         alt_create_maze();
+         break;
+       case 2:
+         set_create_maze();
+         break;
+       }
+      break;
+    case 4:
+      XSync (dpy, False);
+      usleep (pre_solve_delay);
+      break;
+    case 5:
+      solve_maze();
+      break;
+    case 6:
+      XSync (dpy, False);
+      usleep (post_solve_delay);
+      state = 0 ;
+      erase_full_window(display, window);
+      break;
+    default:
+      abort ();
+    }
+    ++state;
+  pop:
+    if (restart)
+      {
+       static XWindowAttributes wattr;
+       restart = 0;
+       stop = 0;
+       state = 1;
+       XGetWindowAttributes (dpy, win, &wattr);
+       set_maze_sizes (wattr.width, wattr.height);
+       XClearWindow (dpy, win);
+       XSync (dpy, False);
+       sync_p = !(random() % 10);
+      }
+  }
+}
diff --git a/hacks/maze.man b/hacks/maze.man
new file mode 100644 (file)
index 0000000..f482650
--- /dev/null
@@ -0,0 +1,146 @@
+.TH XScreenSaver 1 "7-mar-93" "X Version 11"
+.SH NAME
+maze \- an automated X11 demo repeatedly creating and solving a random maze
+.SH SYNOPSIS
+.B maze 
+[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-install] [\-visual \fIvisual\fP] [\-grid\-size \fIpixels\fP] [\-live\-color \fIcolor\fP] [\-dead\-color \fIcolor\fP] [\-solve\-delay \fIusecs\fP] [\-pre\-delay \fIusecs\fP] [\-post\-delay \fIusecs\fP] [\-generator \fIinteger\fP] [\-max\-length \fIinteger\fP] [\-bridge] [\-no\-bridge]
+.SH DESCRIPTION
+The \fImaze\fP program creates a "random" maze and then solves it with 
+graphical feedback. 
+.SH OPTIONS
+.I maze
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window.  This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use.  Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-grid\-size \fIpixels\fP
+The size of each block of the maze, in pixels; default is 0, meaning
+pick a random grid size.
+.TP 8
+.B \-live\-color \fIcolor\fP
+The color of the path.
+.TP 8
+.B \-dead\-color \fIcolor\fP
+The color of the failed path (it is also stippled with a 50% pattern.)
+.TP 8
+.B \-skip\-color \fIcolor\fP
+The maze solver will choose to not go down a path if it can "see" (in a
+straight line) that it is a dead end.  This is the color to use for paths
+that are skipped for this reason.
+.TP 8
+.B \-surround\-color \fIcolor\fP
+If the maze solver ever completely encloses an area within the maze, then
+it knows that the exit is not in there (and in fact the interior of that
+area might not even be reachable.)  It will mark out those cells using this
+color.
+.TP 8
+.B \-solve\-delay \fIinteger\fP
+Delay (in microseconds) between each step of the solution path.
+Default 5000, or about 1/200th second.
+.TP 8
+.B \-pre\-delay \fIinteger\fP
+Delay (in microseconds) between generating a maze and starting to solve it.
+Default 2000000 (2 seconds.)
+.TP 8
+.B \-post\-delay \fIinteger\fP
+Delay (in microseconds) after solving a maze and before generating a new one.
+Default 4000000 (4 seconds.)
+.TP 8
+.B \-generator \fInum\fP
+Sets the algorithm that will be used to generate the mazes. The
+default is \-1, which randomly selects an algorithm for each maze that
+is generated. Generator 0 is the original one, and works by walking
+around randomly until we hit a place we've been before, then
+backtracking and trying a new direction somewhere. Generator 1 picks a
+random spot in the maze, then draws a straight wall from that spot in
+a random direction until it hits another wall (and continues until the
+maze is complete). Generator 2 is based on sets. Initially all cells
+are in different sets. Then two neighboring cells are chosen and if
+they are in different sets, their sets are joined. If they were in the
+same set, a wall is built between them. This continues until the maze is
+complete. 
+
+All generators generate mazes with a certain 'characteristic'. See if you
+can spot them!
+.TP 8
+.B \-max\-length \fInum\fP
+Controls the maximum length of walls drawn in one go by generator 1.
+.TP 8
+.B \-bridge
+.TP 8
+.B \-no\-bridge
+Controls whether or not a 'bridge' will appear over the logo.
+.PP
+Clicking the mouse in the maze window controls it.
+.TP 16
+.B "LeftButton
+Clears the window and restarts maze.
+.TP 16
+.B MiddleButton
+Pause or unpause the program.
+.TP 16
+.B RightButton
+Exit.
+.SH BUGS
+Expose events force a restart of maze.
+
+Mouse actions are based on "raw" values (Button1, Button2 and Button3)
+instead of using the pointer map.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+.PP
+Copyright \(co 1988 by Sun Microsystems, Inc. Mountain View, CA.
+.PP  
+All Rights Reserved
+.PP
+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 names of Sun or MIT not be used in advertising or publicity pertaining to
+distribution of the software without specific prior written permission. Sun
+and M.I.T.  make no representations about the suitability of this software for
+any purpose. It is provided "as is" without any express or implied warranty.
+.PP
+SUN DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN
+NO EVENT SHALL SUN 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.
+.SH AUTHOR(s)
+.nf
+Zack Weinberg [ Smarter maze-solver ] zack@rabi.phys.columbia.edu
+Johannes Keukelaar [ Generators 1 and 2 ] johannes@nada.kth.se 
+  Royal Institute of Technology, Stockholm, Sweden
+Jim Randell    [ XScreenSaver version ] jmr@mddjmr.fc.hp.com
+  HPLabs, Bristol
+Richard Hess   [ X11 extensions ]      {...}!uunet!cimshop!rhess
+  Consilium, Mountain View, CA
+Dave Lemke     [ X11 version ]         lemke@sun.COM
+  Sun MicroSystems, Mountain View, CA
+Martin Weiss   [ SunView version ]
+  Sun MicroSystems, Mountain View, CA
+.fi
diff --git a/hacks/moire.c b/hacks/moire.c
new file mode 100644 (file)
index 0000000..9b95c6b
--- /dev/null
@@ -0,0 +1,238 @@
+/* xscreensaver, Copyright (c) 1997, 1998 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software 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.  No representations are made about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or 
+ * implied warranty.
+ *
+ * Concept snarfed from Michael D. Bayne in
+ * http://www.go2net.com/internet/deep/1997/04/16/body.html
+ */
+
+#include "screenhack.h"
+#include <X11/Xutil.h>
+#include <stdio.h>
+
+#ifdef HAVE_XSHM_EXTENSION
+# include "xshm.h"
+static Bool use_shm;
+static XShmSegmentInfo shm_info;
+#endif /* HAVE_XSHM_EXTENSION */
+
+static int offset = 0;
+static XColor *colors = 0;
+static int ncolors = 0;
+static GC gc = 0;
+static unsigned long fg_pixel = 0;
+static unsigned long bg_pixel = 0;
+
+static void
+init_moire (Display *dpy, Window window)
+{
+  int oncolors;
+  int i;
+  int fgh, bgh;
+  double fgs, fgv, bgs, bgv;
+  XWindowAttributes xgwa;
+  XColor fgc, bgc;
+  XGCValues gcv;
+  XGetWindowAttributes (dpy, window, &xgwa);
+
+  offset = get_integer_resource ("offset", "Integer");
+  if (offset < 2) offset = 2;
+
+#ifdef HAVE_XSHM_EXTENSION
+  use_shm = get_boolean_resource("useSHM", "Boolean");
+#endif /*  HAVE_XSHM_EXTENSION */
+
+ MONO:
+  if (colors)
+    {
+      for (i = 0; i < ncolors; i++)
+       XFreeColors (dpy, xgwa.colormap, &colors[i].pixel, 1, 0);
+      free(colors);
+      colors = 0;
+    }
+
+  if (mono_p)
+    {
+      fg_pixel = WhitePixelOfScreen (DefaultScreenOfDisplay(dpy));
+      bg_pixel = BlackPixelOfScreen (DefaultScreenOfDisplay(dpy));
+    }
+  else
+    {
+      fg_pixel = get_pixel_resource ("foreground", "Foreground", dpy,
+                                    xgwa.colormap);
+      bg_pixel = get_pixel_resource ("background", "Background", dpy,
+                                    xgwa.colormap);
+    }
+
+  if (mono_p)
+    {
+      offset *= 20;   /* compensate for lack of shading */
+      gcv.foreground = fg_pixel;
+    }
+  else
+    {
+      ncolors = get_integer_resource ("ncolors", "Integer");
+      if (ncolors < 2) ncolors = 2;
+      oncolors = ncolors;
+
+      fgc.flags = bgc.flags = DoRed|DoGreen|DoBlue;
+      if (get_boolean_resource("random","Boolean"))
+       {
+         fgc.red   = random() & 0xFFFF;
+         fgc.green = random() & 0xFFFF;
+         fgc.blue  = random() & 0xFFFF;
+         bgc.red   = random() & 0xFFFF;
+         bgc.green = random() & 0xFFFF;
+         bgc.blue  = random() & 0xFFFF;
+       }
+      else
+       {
+         fgc.pixel = fg_pixel;
+         bgc.pixel = bg_pixel;
+         XQueryColor (dpy, xgwa.colormap, &fgc);
+         XQueryColor (dpy, xgwa.colormap, &bgc);
+       }
+      rgb_to_hsv (fgc.red, fgc.green, fgc.blue, &fgh, &fgs, &fgv);
+      rgb_to_hsv (bgc.red, bgc.green, bgc.blue, &bgh, &bgs, &bgv);
+
+      colors = (XColor *) malloc (sizeof (XColor) * (ncolors+2));
+      memset(colors, 0, (sizeof (XColor) * (ncolors+2)));
+      make_color_ramp (dpy, xgwa.colormap,
+                      fgh, fgs, fgv, bgh, bgs, bgv,
+                      colors, &ncolors,
+                      True, True, False);
+      if (ncolors != oncolors)
+       fprintf(stderr, "%s: got %d of %d requested colors.\n",
+               progname, ncolors, oncolors);
+
+      if (ncolors <= 2)
+       {
+         mono_p = True;
+         goto MONO;
+       }
+
+      gcv.foreground = colors[0].pixel;
+    }
+  gc = XCreateGC (dpy, window, GCForeground, &gcv);
+}
+
+
+static void
+moire (Display *dpy, Window window, int offset, XColor *colors, int ncolors)
+{
+  long x, y, xo, yo;
+  int factor = (random() % offset) + 1;
+  XGCValues gcv;
+  XWindowAttributes xgwa;
+  XImage *image;
+  int depth;
+  XGetWindowAttributes (dpy, window, &xgwa);
+
+  xo = (random() % xgwa.width)  - xgwa.width/2;
+  yo = (random() % xgwa.height) - xgwa.height/2;
+
+  depth = visual_depth(DefaultScreenOfDisplay(dpy), xgwa.visual);
+
+  image = 0;
+# ifdef HAVE_XSHM_EXTENSION
+  if (use_shm)
+    {
+      image = create_xshm_image(dpy, xgwa.visual, depth, ZPixmap, 0,
+                               &shm_info, xgwa.width, 1);
+      if (!image)
+       use_shm = False;
+    }
+# endif /* HAVE_XSHM_EXTENSION */
+
+  if (!image)
+    {
+      image = XCreateImage (dpy, xgwa.visual,
+                           depth, ZPixmap, 0,      /* depth, format, offset */
+                           0, xgwa.width, 1, 8, 0); /* data, w, h, pad, bpl */
+      image->data = (char *) calloc(image->height, image->bytes_per_line);
+    }
+
+  for (y = 0; y < xgwa.height; y++)
+    {
+      for (x = 0; x < xgwa.width; x++)
+       {
+         double xx = x + xo;
+         double yy = y + yo;
+         double i = ((xx * xx) + (yy * yy)) / (double) factor;
+         if (mono_p)
+           gcv.foreground = ((((long) i) & 1) ? fg_pixel : bg_pixel);
+         else
+           gcv.foreground = colors[((long) i) % ncolors].pixel;
+         XPutPixel (image, x, 0, gcv.foreground);
+       }
+
+# ifdef HAVE_XSHM_EXTENSION
+      if (use_shm)
+       XShmPutImage(dpy, window, gc, image, 0, 0, 0, y, xgwa.width, 1, False);
+      else
+# endif /*  HAVE_XSHM_EXTENSION */
+       XPutImage (dpy, window, gc, image, 0, 0, 0, y, xgwa.width, 1);
+
+      XSync(dpy, False);
+    }
+
+# ifdef HAVE_XSHM_EXTENSION
+  if (!use_shm)
+# endif /*  HAVE_XSHM_EXTENSION */
+    if (image->data)
+      {
+       free(image->data);
+       image->data = 0;
+      }
+
+  XDestroyImage (image);
+}
+
+\f
+char *progclass = "Moire";
+
+char *defaults [] = {
+  ".background:                blue",
+  ".foreground:                red",
+  "*random:            true",
+  "*delay:             5",
+  "*ncolors:           64",
+  "*offset:            50",
+#ifdef HAVE_XSHM_EXTENSION
+  "*useSHM:          True",
+#endif /*  HAVE_XSHM_EXTENSION */
+  0
+};
+
+XrmOptionDescRec options [] = {
+  { "-random",         ".random",      XrmoptionSepArg, 0 },
+  { "-delay",          ".delay",       XrmoptionSepArg, 0 },
+  { "-ncolors",                ".ncolors",     XrmoptionSepArg, 0 },
+  { "-offset",         ".offset",      XrmoptionSepArg, 0 },
+#ifdef HAVE_XSHM_EXTENSION
+  { "-shm",            ".useSHM",      XrmoptionNoArg, "True" },
+  { "-no-shm",         ".useSHM",      XrmoptionNoArg, "False" },
+#endif /*  HAVE_XSHM_EXTENSION */
+  { 0, 0, 0, 0 }
+};
+
+void
+screenhack (Display *dpy, Window window)
+{
+  int delay = get_integer_resource ("delay", "Integer");
+  while (1)
+    {
+      init_moire (dpy, window);
+      moire (dpy, window, offset, colors, ncolors);
+      XSync (dpy, False);
+      screenhack_handle_events (dpy);
+      if (delay)
+       sleep(delay);
+    }
+}
diff --git a/hacks/moire.man b/hacks/moire.man
new file mode 100644 (file)
index 0000000..c810265
--- /dev/null
@@ -0,0 +1,64 @@
+.TH XScreenSaver 1 "27-Apr-97" "X Version 11"
+.SH NAME
+halo - draw circular interference patterns
+.SH SYNOPSIS
+.B halo
+[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-delay \fIseconds\fP] [\-random \fIboolean\fP] [\-ncolors \fIint\fP] [\-offset \fIint\fP] 
+.SH DESCRIPTION
+The \fImoire\fP program draws cool circular interference patterns.
+.SH OPTIONS
+.I moire
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window.  This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-mono 
+If on a color display, pretend we're on a monochrome display.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use.  Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-delay \fIseconds\fP
+How long to wait before starting over.  Default 5 seconds.
+.TP 8
+.B \-random \fIboolean\fP
+Whether to ignore the foreground/background colors, and pick them randomly
+instead.
+.TP 8
+.B \-offset \fIinteger\fP
+The maximum random radius increment to use.
+.TP 8
+.B \-ncolors \fIinteger\fP
+How many colors should be allocated in the color ramp (note that this
+value interacts with \fIoffset\fP.)
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 1997 by Jamie Zawinski.  Permission to use, copy, modify, 
+distribute, and sell this software 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.  No representations are made about the 
+suitability of this software for any purpose.  It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Jamie Zawinski <jwz@jwz.org>, 27-Apr-97, based on code by
+Michael D. Bayne <mdb@go2net.com>.
diff --git a/hacks/moire2.c b/hacks/moire2.c
new file mode 100644 (file)
index 0000000..67199aa
--- /dev/null
@@ -0,0 +1,310 @@
+/* xscreensaver, Copyright (c) 1997, 1998 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software 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.  No representations are made about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or 
+ * implied warranty.
+ */
+
+#include "screenhack.h"
+#include <X11/Xutil.h>
+
+#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+# include "xdbe.h"
+#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
+
+static int ncolors;
+static XColor *colors = 0;
+static int fg_pixel, bg_pixel;
+static Pixmap p0 = 0, p1 = 0, p2 = 0, p3 = 0;
+static GC copy_gc = 0, erase_gc = 0, window_gc = 0;
+static int width, height, size;
+static int x1, x2, y1, y2, x3, y3;
+static int dx1, dx2, dx3, dy1, dy2, dy3;
+static int othickness, thickness;
+static Bool do_three;
+#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+XdbeBackBuffer back_buf = 0;
+#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
+
+static void
+init_moire2 (Display *dpy, Window window)
+{
+  XWindowAttributes xgwa;
+  XGetWindowAttributes (dpy, window, &xgwa);
+
+  othickness = get_integer_resource("thickness", "Thickness");
+
+  if (mono_p)
+    ncolors = 2;
+  else
+    ncolors = get_integer_resource ("colors", "Colors");
+  if (ncolors < 2) ncolors = 2;
+  if (ncolors <= 2) mono_p = True;
+
+  if (mono_p)
+    colors = 0;
+  else
+    colors = (XColor *) malloc(sizeof(*colors) * (ncolors+1));
+
+  if (mono_p)
+    ;
+  else
+    make_smooth_colormap (dpy, xgwa.visual, xgwa.colormap, colors, &ncolors,
+                         True, 0, True);
+
+  bg_pixel = get_pixel_resource("background", "Background", dpy,
+                               xgwa.colormap);
+  fg_pixel = get_pixel_resource("foreground", "Foreground", dpy,
+                               xgwa.colormap);
+
+#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+  back_buf = xdbe_get_backbuffer (dpy, window, XdbeUndefined);
+#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
+}
+
+
+static void
+reset_moire2 (Display *dpy, Window window)
+{
+  GC gc;
+  XWindowAttributes xgwa;
+  XGCValues gcv;
+  Bool xor;
+  XGetWindowAttributes (dpy, window, &xgwa);
+
+  do_three = (0 == (random() % 3));
+
+  width = xgwa.width;
+  height = xgwa.height;
+  size = width > height ? width : height;
+
+  if (p0) XFreePixmap(dpy, p0);
+  if (p1) XFreePixmap(dpy, p1);
+  if (p2) XFreePixmap(dpy, p2);
+  if (p3) XFreePixmap(dpy, p3);
+
+  p0 = XCreatePixmap(dpy, window, width, height, 1);
+  p1 = XCreatePixmap(dpy, window, width*2, height*2, 1);
+  p2 = XCreatePixmap(dpy, window, width*2, height*2, 1);
+  if (do_three)
+    p3 = XCreatePixmap(dpy, window, width*2, height*2, 1);
+  else
+    p3 = 0;
+
+  thickness = (othickness > 0 ? othickness : (1 + (random() % 4)));
+
+  gcv.foreground = 0;
+  gcv.line_width = (thickness == 1 ? 0 : thickness);
+  gc = XCreateGC (dpy, p1, GCForeground|GCLineWidth, &gcv);
+
+  XFillRectangle(dpy, p1, gc, 0, 0, width*2, height*2);
+  XFillRectangle(dpy, p2, gc, 0, 0, width*2, height*2);
+  if (do_three)
+    XFillRectangle(dpy, p3, gc, 0, 0, width*2, height*2);
+
+  XSetForeground(dpy, gc, 1);
+
+  xor = (do_three || (thickness == 1) || (random() & 1));
+
+  {
+    int i, ii, maxx, maxy;
+
+#define FROB(P) do { \
+    maxx = (size*4); \
+    maxy = (size*4); \
+    if (0 == (random() % 5)) { \
+       float f = 1.0 + frand(0.05); \
+       if (random() & 1) maxx *= f; \
+       else maxy *= f; \
+      } \
+    ii = (thickness + 1 + (xor ? 0 : 1) + (random() % (4 * thickness)));  \
+    for (i = 0; i < (size*2); i += ii)  \
+      XDrawArc(dpy, (P), gc, i-size, i-size, maxx-i-i, maxy-i-i, 0, 360*64); \
+    if (0 == (random() % 5)) \
+      { \
+       XSetFunction(dpy, gc, GXxor); \
+       XFillRectangle(dpy, (P), gc, 0, 0, width*2, height*2); \
+       XSetFunction(dpy, gc, GXcopy); \
+      } \
+    } while(0)
+
+    FROB(p1);
+    FROB(p2);
+    if (do_three)
+      FROB(p3);
+#undef FROB
+  }
+
+  XFreeGC(dpy, gc);
+
+  if (copy_gc) XFreeGC(dpy, copy_gc);
+  gcv.function = (xor ? GXxor : GXor);
+  gcv.foreground = 1;
+  gcv.background = 0;
+
+  copy_gc = XCreateGC (dpy, p0, GCFunction|GCForeground|GCBackground, &gcv);
+
+  gcv.foreground = 0;
+  if (erase_gc) XFreeGC(dpy, erase_gc);
+  erase_gc = XCreateGC (dpy, p0, GCForeground, &gcv);
+
+  gcv.foreground = fg_pixel;
+  gcv.background = bg_pixel;
+  if (window_gc) XFreeGC(dpy, window_gc);
+  window_gc = XCreateGC (dpy, window, GCForeground|GCBackground, &gcv);
+
+#define FROB(N,DN,MAX) \
+  N = (MAX/2) + (random() % MAX); \
+  DN = ((1 + (random() % (7*thickness))) * ((random() & 1) ? 1 : -1))
+
+  FROB(x1,dx1,width);
+  FROB(x2,dx2,width);
+  FROB(x3,dx3,width);
+  FROB(y1,dy1,height);
+  FROB(y2,dy2,height);
+  FROB(y3,dy3,height);
+#undef FROB
+}
+
+
+
+static void
+moire2 (Display *dpy, Window window)
+{
+#define FROB(N,DN,MAX) \
+  N += DN; \
+  if (N <= 0) N = 0, DN = -DN; \
+  else if (N >= MAX) N = MAX, DN = -DN; \
+  else if (0 == (random() % 100)) DN = -DN; \
+  else if (0 == (random() % 50)) \
+    DN += (DN <= -20 ? 1 : (DN >= 20 ? -1 : ((random() & 1) ? 1 : -1)))
+
+  FROB(x1,dx1,width);
+  FROB(x2,dx2,width);
+  FROB(x3,dx3,width);
+  FROB(y1,dy1,height);
+  FROB(y2,dy2,height);
+  FROB(y3,dy3,height);
+#undef FROB
+
+  XFillRectangle(dpy, p0, erase_gc, 0, 0, width, height);
+  XCopyArea(dpy, p1, p0, copy_gc, x1, y1, width, height, 0, 0);
+  XCopyArea(dpy, p2, p0, copy_gc, x2, y2, width, height, 0, 0);
+  if (do_three)
+    XCopyArea(dpy, p3, p0, copy_gc, x3, y3, width, height, 0, 0);
+
+#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+  if (back_buf)
+    {
+      XdbeSwapInfo info[1];
+      info[0].swap_window = window;
+      info[0].swap_action = XdbeUndefined;
+      XCopyPlane (dpy, p0, back_buf, window_gc, 0, 0, width, height, 0, 0, 1L);
+      XdbeSwapBuffers (dpy, info, 1);
+    }
+  else
+#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
+    XCopyPlane (dpy, p0, window, window_gc, 0, 0, width, height, 0, 0, 1L);
+
+  XSync(dpy, False);
+
+#if 0
+  XCopyPlane(dpy, p1, window, window_gc, (width*2)/3, (height*2)/3,
+            width/2, height/2,
+            0, height/2, 1L);
+  XCopyPlane(dpy, p2, window, window_gc, (width*2)/3, (height*2)/3,
+            width/2, height/2,
+            width/2, height/2, 1L);
+#endif
+}
+
+
+
+\f
+char *progclass = "Moire2";
+
+char *defaults [] = {
+  ".background:                black",
+  ".foreground:                white",
+  "*delay:             50000",
+  "*thickness:         0",
+  "*colors:            150",
+  "*colorShift:                5",
+
+#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+  /* Off by default, since it slows it down a lot, and the flicker isn't really
+     all that bad without it... Or rather, it flickers just as badly with it.
+     The XFree86 implementation of the XDBE extension totally blows!  There is
+     just *no* excuse for the "swap buffers" operation to flicker like it does.
+   */
+  "*useDBE:            False",
+#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
+
+  0
+};
+
+XrmOptionDescRec options [] = {
+  { "-delay",          ".delay",       XrmoptionSepArg, 0 },
+  { "-ncolors",                ".colors",      XrmoptionSepArg, 0 },
+  { "-thickness",      ".thickness",   XrmoptionSepArg, 0 },
+  { 0, 0, 0, 0 }
+};
+
+void
+screenhack (Display *dpy, Window window)
+{
+  int delay = get_integer_resource ("delay", "Integer");
+  int color_shift = get_integer_resource ("colorShift", "Integer");
+  int pix = 0;
+  Bool flip_a, flip_b;
+
+  if (color_shift <= 0) color_shift = 1;
+  init_moire2 (dpy, window);
+  while (1)
+    {
+      int iterations = 30 + (random() % 70) + (random() % 70);
+      reset_moire2 (dpy, window);
+
+      flip_a = mono_p ? False : (random() & 1);
+      flip_b = mono_p ? False : (random() & 1);
+
+      if (flip_b)
+       {
+         XSetForeground(dpy, window_gc, bg_pixel);
+         XSetBackground(dpy, window_gc, fg_pixel);
+       }
+      else
+       {
+         XSetForeground(dpy, window_gc, fg_pixel);
+         XSetBackground(dpy, window_gc, bg_pixel);
+       }
+
+      while (--iterations > 0)
+       {
+         int i;
+
+         if (!mono_p)
+           {
+             pix++;
+             pix = pix % ncolors;
+
+             if (flip_a)
+               XSetBackground(dpy, window_gc, colors[pix].pixel);
+             else
+               XSetForeground(dpy, window_gc, colors[pix].pixel);
+           }
+
+         for (i = 0; i < color_shift; i++)
+           {
+             moire2 (dpy, window);
+              screenhack_handle_events (dpy);
+             if (delay)
+               usleep(delay);
+           }
+       }
+    }
+}
diff --git a/hacks/mountain.c b/hacks/mountain.c
new file mode 100644 (file)
index 0000000..1853b93
--- /dev/null
@@ -0,0 +1,235 @@
+/* -*- Mode: C; tab-width: 4 -*- */
+/* mountain -- square grid mountains */
+
+#if !defined( lint ) && !defined( SABER )
+static const char sccsid[] = "@(#)mountain.c   4.04 97/07/28 xlockmore";
+
+#endif
+
+/*-
+ * Copyright (c) 1995 Pascal Pensa <pensa@aurora.unice.fr>
+ *
+ * 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.
+ *
+ * This file is provided AS IS with no warranties of any kind.  The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof.  In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * Revision History:
+ * 10-May-97: Compatible with xscreensaver
+ */
+
+#ifdef STANDALONE
+# define PROGCLASS "Mountain"
+# define HACK_INIT init_mountain
+# define HACK_DRAW draw_mountain
+# define mountain_opts xlockmore_opts
+# define DEFAULTS      "*delay: 0 \n"          \
+                                       "*count: 30 \n"         \
+                                       "*cycles: 100 \n"       \
+                                       "*ncolors: 64 \n"
+# define SMOOTH_COLORS
+#include "xlockmore.h"         /* in xscreensaver distribution */
+#else /* STANDALONE */
+#include "xlock.h"             /* in xlockmore distribution */
+#endif /* STANDALONE */
+
+ModeSpecOpt mountain_opts =
+{0, NULL, 0, NULL, NULL};
+
+/* ~ 5000 Max mountain height (1000 - 10000) */
+#define MAXHEIGHT  (3 * (mp->width + mp->height))
+
+#define WORLDWIDTH 50          /* World size x * y */
+
+#define RANGE_RAND(min,max) ((min) + NRAND((max) - (min)))
+
+typedef struct {
+       int         pixelmode;
+       int         width;
+       int         height;
+       int         x, y;
+       int         offset;
+       int         stage;
+       int         h[WORLDWIDTH][WORLDWIDTH];
+       int         time;       /* up time */
+       int         first;
+       GC          stippled_GC;
+} mountainstruct;
+
+static mountainstruct *mountains = NULL;
+
+static void
+spread(int  (*m)[50], int x, int y)
+{
+       int         x2, y2;
+       int         h = m[x][y];
+
+       for (y2 = y - 1; y2 <= y + 1; y2++)
+               for (x2 = x - 1; x2 <= x + 1; x2++)
+                       if (x2 >= 0 && y2 >= 0 && x2 < WORLDWIDTH && y2 < WORLDWIDTH)
+                               m[x2][y2] = (m[x2][y2] + h) / 2;
+}
+
+static void
+drawamountain(ModeInfo * mi)
+{
+       Display    *display = MI_DISPLAY(mi);
+       Window      window = MI_WINDOW(mi);
+       GC          gc = MI_GC(mi);
+       mountainstruct *mp = &mountains[MI_SCREEN(mi)];
+       int         x2, y2, x3, y3, y4, y5, c = 0;
+       XPoint      p[5];
+
+       if (MI_NPIXELS(mi) > 2) {
+               c = (mp->h[mp->x][mp->y] + mp->h[mp->x + 1][mp->y] +
+                 mp->h[mp->x][mp->y + 1] + mp->h[mp->x + 1][mp->y + 1]) / 4;
+               c = (c / 10 + mp->offset) % MI_NPIXELS(mi);
+       }
+       x2 = mp->x * (2 * mp->width) / (3 * WORLDWIDTH);
+       y2 = mp->y * (2 * mp->height) / (3 * WORLDWIDTH);
+       p[0].x = (x2 - y2 / 2) + (mp->width / 4);
+       p[0].y = (y2 - mp->h[mp->x][mp->y]) + mp->height / 4;
+
+       x3 = (mp->x + 1) * (2 * mp->width) / (3 * WORLDWIDTH);
+       y3 = mp->y * (2 * mp->height) / (3 * WORLDWIDTH);
+       p[1].x = (x3 - y3 / 2) + (mp->width / 4);
+       p[1].y = (y3 - mp->h[mp->x + 1][mp->y]) + mp->height / 4;
+
+       y4 = (mp->y + 1) * (2 * mp->height) / (3 * WORLDWIDTH);
+       p[2].x = (x3 - y4 / 2) + (mp->width / 4);
+       p[2].y = (y4 - mp->h[mp->x + 1][mp->y + 1]) + mp->height / 4;
+
+       y5 = (mp->y + 1) * (2 * mp->height) / (3 * WORLDWIDTH);
+       p[3].x = (x2 - y5 / 2) + (mp->width / 4);
+       p[3].y = (y5 - mp->h[mp->x][mp->y + 1]) + mp->height / 4;
+
+       p[4].x = p[0].x;
+       p[4].y = p[0].y;
+
+       if (MI_NPIXELS(mi) > 2)
+               XSetForeground(display, gc, MI_PIXEL(mi, c));
+       else
+               XSetForeground(display, gc, MI_WIN_WHITE_PIXEL(mi));
+       XFillPolygon(display, window, gc, p, 4, Complex, CoordModeOrigin);
+
+       if (!mp->pixelmode) {
+               XSetForeground(display, gc, MI_WIN_BLACK_PIXEL(mi));
+               XDrawLines(display, window, gc, p, 5, CoordModeOrigin);
+       }
+       mp->x++;
+       if (mp->x == WORLDWIDTH - 1) {
+               mp->y++;
+               mp->x = 0;
+       }
+       if (mp->y == WORLDWIDTH - 1)
+               mp->stage++;
+}
+
+void
+init_mountain(ModeInfo * mi)
+{
+       mountainstruct *mp;
+       int         i, j, x, y;
+       XGCValues   gcv;
+
+       if (mountains == NULL) {
+               if ((mountains = (mountainstruct *) calloc(MI_NUM_SCREENS(mi),
+                                          sizeof (mountainstruct))) == NULL)
+                       return;
+       }
+       mp = &mountains[MI_SCREEN(mi)];
+       mp->width = MI_WIN_WIDTH(mi);
+       mp->height = MI_WIN_HEIGHT(mi);
+       mp->pixelmode = (mp->width + mp->height < 200);
+       mp->stage = 0;
+       mp->time = 0;
+       mp->x = mp->y = 0;
+       if (!mp->first) {
+               mp->first = 1;
+               gcv.foreground = MI_WIN_WHITE_PIXEL(mi);
+               gcv.background = MI_WIN_BLACK_PIXEL(mi);
+
+               mp->stippled_GC = XCreateGC(MI_DISPLAY(mi), MI_WINDOW(mi),
+                                         GCForeground | GCBackground, &gcv);
+       }
+       XClearWindow(MI_DISPLAY(mi), MI_WINDOW(mi));
+
+       for (y = 0; y < WORLDWIDTH; y++)
+               for (x = 0; x < WORLDWIDTH; x++)
+                       mp->h[x][y] = 0;
+
+       j = MI_BATCHCOUNT(mi);
+       if (j < 0)
+               j = NRAND(-j) + 1;
+       for (i = 0; i < j; i++)
+               mp->h[RANGE_RAND(1, WORLDWIDTH - 1)][RANGE_RAND(1, WORLDWIDTH - 1)] =
+                       NRAND(MAXHEIGHT);
+
+       for (y = 0; y < WORLDWIDTH; y++)
+               for (x = 0; x < WORLDWIDTH; x++)
+                       spread(mp->h, x, y);
+
+       for (y = 0; y < WORLDWIDTH; y++)
+               for (x = 0; x < WORLDWIDTH; x++) {
+                       mp->h[x][y] = mp->h[x][y] + NRAND(10) - 5;
+                       if (mp->h[x][y] < 10)
+                               mp->h[x][y] = 0;
+               }
+
+       if (MI_NPIXELS(mi) > 2)
+               mp->offset = NRAND(MI_NPIXELS(mi));
+       else
+               mp->offset = 0;
+}
+
+void
+draw_mountain(ModeInfo * mi)
+{
+       mountainstruct *mp = &mountains[MI_SCREEN(mi)];
+
+       switch (mp->stage) {
+               case 0:
+                       drawamountain(mi);
+                       break;
+               case 1:
+                       MI_PAUSE(mi) = 2000000;
+                       /*if (++mp->time > MI_CYCLES(mi)); */
+                       mp->stage++;
+                       break;
+               case 2:
+                       init_mountain(mi);
+                       break;
+       }
+}
+
+void
+release_mountain(ModeInfo * mi)
+{
+       if (mountains != NULL) {
+               int         screen;
+
+               for (screen = 0; screen < MI_NUM_SCREENS(mi); screen++) {
+                       mountainstruct *mp = &mountains[screen];
+
+                       XFreeGC(MI_DISPLAY(mi), mp->stippled_GC);
+               }
+               (void) free((void *) mountains);
+               mountains = NULL;
+       }
+}
+
+void
+refresh_mountain(ModeInfo * mi)
+{
+       mountainstruct *mp = &mountains[MI_SCREEN(mi)];
+
+       mp->x = 0;
+       mp->y = 0;
+}
diff --git a/hacks/munch.c b/hacks/munch.c
new file mode 100644 (file)
index 0000000..b3cd735
--- /dev/null
@@ -0,0 +1,258 @@
+/* munch.c
+ * A munching squares implementation for X
+ * Tim Showalter <tjs@andrew.cmu.edu>
+ * 
+ * Copyright 1997, Tim Showalter
+ * Permission is granted to copy, modify, and use this as long
+ * as this notice remains intact.  No warranties are expressed or implied.
+ * CMU Sucks.
+ * 
+ * Some code stolen from / This is meant to work with
+ * xscreensaver, Copyright (c) 1992, 1995, 1996
+ * Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software 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.  No representations are made about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or 
+ * implied warranty.
+ */
+
+/* Munching Squares is this simplistic, silly screen hack (according
+   to HAKMEM, discovered by Jackson Wright in 1962) where you take
+   Y = X XOR T and graph it over and over.  According to HAKMEM, it 
+   takes 5 instructions of PDP-1 assembly.  This is a little more
+   complicated than that, mostly X's fault, but it does some other
+   random things.
+
+   http://www.inwap.com/pdp10/hbaker/hakmem/hacks.html#item146
+ */
+
+#include <math.h>
+/*#include <assert.h>*/
+#include "screenhack.h"
+
+/* flags for random things.  Must be < log2(random's maximum), incidentially.
+ */
+#define SHIFT_KX (0x01)
+#define SHIFT_KT (0x02)
+#define SHIFT_KY (0x04)
+#define GRAV     (0x08)
+
+char *progclass = "Munch";
+
+char *defaults [] = {
+    ".background:      black",
+    ".foreground:      white",
+    "*delay:           5000",
+    "*hold:            100000",
+    "*clear:           50",
+    "*logminwidth:     7",
+    "*shift:           True",
+    "*xor:             True",
+    0
+};
+
+XrmOptionDescRec options [] = {
+    { "-delay",                ".delay",       XrmoptionSepArg, 0 },
+    { "-hold",         ".hold",        XrmoptionSepArg, 0 },
+    { "-clear",         ".clear",       XrmoptionSepArg, "true" },
+    { "-shift",         ".shift",       XrmoptionNoArg, "true" },
+    { "-no-shift",     ".shift",       XrmoptionNoArg, "false" },
+    { "-logminwidth",  ".logminwidth", XrmoptionSepArg, 0 },
+    { "-xor",           ".xor",                XrmoptionNoArg, "true" },
+    { "-no-xor",       ".xor",         XrmoptionNoArg, "false" },
+    { 0, 0, 0, 0 }
+};
+
+
+static GC gc;
+/* only configurable things right now */
+static int delay, hold, clear, logminwidth, shiftk, xor;
+
+static void munchOnce (Display* dpy, Window w,
+                      int width, /* pixels */
+                      int atX, int atY, /* pixels */
+                      int kX, int kT, int kY, /* pixels */
+                      int grav /* 0 or not */) {
+
+    int x, y, t;
+    static Colormap cmap;
+    XWindowAttributes xgwa;
+    XColor fgc;
+    int drawX, drawY;
+
+    /*
+    fprintf(stderr,"Doing width %d at %d %d shift %d %d %d grav %d\n",
+           width, atX, atY, kX, kT, kY, grav);
+           */
+    
+    XGetWindowAttributes (dpy, w, &xgwa);
+
+    if (!mono_p) {
+       /* XXX there are probably bugs with this. */
+       cmap = xgwa.colormap;
+   
+       fgc.red = random() % 65535;
+       fgc.green = random() % 65535;
+       fgc.blue = random() % 65535;
+    
+       if (XAllocColor(dpy, cmap, &fgc)) {
+           XSetForeground(dpy, gc, fgc.pixel);
+       }
+    }
+    
+    /* Finally draw this munching square. */
+    for(t = 0; t < width; t++) {
+       for(x = 0; x < width; x++) {
+           /* figure out the next point */
+           y = ((x ^ ((t + kT) % width)) + kY) % width;
+
+           drawX = ((x + kX) % width) + atX;
+           drawY = (grav ? y + atY : atY + width - 1 - y);
+
+           /* used to be bugs where it would draw partially offscreen.
+              while that might be a pretty feature, I didn't want it to do
+              that yet.  if these trigger, please let me know.
+              */
+/*         assert(drawX >= 0 && drawX < xgwa.width);
+           assert(drawY >= 0 && drawY < xgwa.height);
+*/
+
+           XDrawPoint(dpy, w, gc, drawX, drawY);
+           /* XXX may want to change this to XDrawPoints,
+              but it's fast enough without it for the moment. */
+           
+       }
+       
+       /* we've drawn one pass' worth of points.  let the server catch up
+          or this won't be interesting to watch at all.  we call this here
+          in the hopes of having one whole sequence of dots appear at the
+          same time (one for each value of x, surprisingly enough)
+          */
+       XSync(dpy, False);
+        screenhack_handle_events (dpy);
+       if (delay) usleep(delay);
+    }
+}
+
+/*
+ * dumb way to get # of digits in number.  Probably faster than actually
+ * doing a log and a division, maybe.
+ */
+static int dumb_log_2(int k) {
+    int r = -1;
+    while (k > 0) {
+       k >>= 1; r++;
+    }
+    return r;
+}
+
+/* This parses arguments, initializes the window, etc., and finally starts
+ * calling munchOnce ad infinitum.
+ */
+void
+screenhack (dpy, w) Display *dpy; Window w;
+{
+    int logmaxwidth;
+    int maxwidth;
+    XWindowAttributes xgwa;
+    Colormap cmap;
+    XGCValues gcv;
+    int n = 0;  /* number of squares before we have to clear */
+    int randflags;
+    int thiswidth;
+    
+    /* get the dimensions of the window */
+    XGetWindowAttributes (dpy, w, &xgwa);
+    
+    /* We need a square; limit on screen size? */
+    /* we want a power of 2 for the width or the munch doesn't fill up.
+     */
+    logmaxwidth = (int)
+       dumb_log_2(xgwa.height < xgwa.width ? xgwa.height : xgwa.width);
+
+    maxwidth = 1 << logmaxwidth;
+
+    if (logmaxwidth < logminwidth) {
+       /* off-by-one error here?  Anyone running on < 640x480? */
+       fprintf(stderr, "munch: screen too small; use -logminwidth\n");
+       fprintf(stderr, "\t(width is %d; log is %d; log must be at least "
+               "%d)\n", 
+               (xgwa.height < xgwa.width ? xgwa.height : xgwa.width),
+               logmaxwidth, logminwidth);
+       exit(0);
+    }
+    
+    /* create the gc */
+    cmap = xgwa.colormap;
+    gcv.foreground= get_pixel_resource("foreground","Foreground",
+                                      dpy, cmap);
+    gcv.background= get_pixel_resource("background","Background",
+                                      dpy, cmap);
+    
+    gc = XCreateGC(dpy, w, GCForeground|GCBackground, &gcv);
+    
+    delay = get_integer_resource ("delay", "Integer");
+    if (delay < 0) delay = 0;
+    
+    hold = get_integer_resource ("hold", "Integer");
+    if (hold < 0) hold = 0;
+    
+    clear = get_integer_resource ("clear", "Integer");
+    if (clear < 0) clear = 0;
+
+    logminwidth = get_integer_resource ("logminwidth", "Integer");
+    if (logminwidth < 2) logminwidth = 2;
+
+    shiftk = get_boolean_resource("shift", "Boolean");
+
+    xor = get_boolean_resource("xor", "Boolean");
+
+    /* always draw xor on mono. */
+    if (mono_p || xor) {
+       XSetFunction(dpy, gc, GXxor);
+    }
+
+    for(;;) {
+       /* saves some calls to random.  big deal */
+       randflags = random();
+
+       /* choose size -- power of two */
+       thiswidth = 1 << (logminwidth +
+                         (random() % (1 + logmaxwidth - logminwidth)));
+
+       munchOnce(dpy, w,
+                 thiswidth, /* Width, in pixels */
+                 
+                 /* draw at this location */
+                 (random() % (xgwa.width <= thiswidth ? 1
+                              : xgwa.width - thiswidth)),
+                 (random() % (xgwa.height <= thiswidth ? 1
+                              : xgwa.width - thiswidth)),
+                 
+                 /* wrap-around by these values; no need to %
+                    as we end up doing that later anyway*/
+                 ((shiftk && (randflags & SHIFT_KX))
+                  ? (random() % thiswidth) : 0),
+                 ((shiftk && (randflags & SHIFT_KT))
+                  ? (random() % thiswidth) : 0),
+                 ((shiftk && (randflags & SHIFT_KY))
+                  ? (random() % thiswidth) : 0),
+                 
+                 /* set the gravity of the munch, or rather,
+                    which direction we draw stuff in. */
+                 (randflags & GRAV)
+                 );
+       
+        screenhack_handle_events (dpy);
+       if (hold) usleep(hold);
+       
+       if (clear && ++n >= clear) {
+           XClearWindow(dpy, w);
+           n = 0;
+       }
+    }
+}
diff --git a/hacks/munch.man b/hacks/munch.man
new file mode 100644 (file)
index 0000000..97b1b79
--- /dev/null
@@ -0,0 +1,133 @@
+.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
+..
+.TH XScreenSaver 1 "17-Jun-97" "X Version 11"
+.SH NAME
+munch - munching squares screen hack
+.SH SYNOPSIS
+.B munch
+[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP]
+[\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install]
+[\-visual \fIvisual\fP] [\-delay \fIseconds\fP] [\-xor] [\-noxor] [\-shift]
+[\-noshift] [\-logminwidth \fIminimum width\fP]
+.SH DESCRIPTION
+The
+.I munch
+program preforms the munching squares hack until killed.  It picks square
+size, position, and gravity randomly; configurable options are listed
+below.
+.PP
+The munching squares hack cosists of drawing Y = X XOR T for a range of X
+and T over and over until all the possible combinations of X and T have
+come up.  It was reportedly discovered by Jackson Wright in 1962 and took 5
+instructions of PDP-6 code.
+.SH OPTIONS
+.I munch
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window.  This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-mono 
+If on a color display, pretend we're on a monochrome display.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use.  Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-delay \fIseconds\fP
+How long to wait before starting over.  Default 5 seconds.
+.TP 8
+.B \-xor
+Use the XOR drawing function.  (Default.)
+.TP 8
+.B \-no\-xor
+Don't use the XOR drawing function.
+.TP 8
+.B \-shift
+Start drawing the square at weird starting points.  (Default.)
+.TP 8
+.B \-no\-shift
+Don't shift and start drawing the square at weird starting points.
+.TP 8
+.B \-logminwidth \fIminimum\-width\fP
+The logarithm (base 2) of the minimum with of a square (must be a power of
+2, or some parts of the square aren't.)
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1),
+.BR http://www.inwap.com/pdp10/hbaker/hakmem/hakmem.html,
+.BR http://www.comedia.com/Hot/jargon_3.0/JARGON_M/MUNCHSQR.HTML
+.SH HISTORY
+Quoted from HAKMEM, for historical interest.  As that document says, "Unless
+otherwise stated, all computer programs are in PDP-6/10 assembly language."
+.TP 8
+ITEM 146: MUNCHING SQUARES
+Another simple display program. It is thought that this was discovered by
+Jackson Wright on the RLE PDP-1 circa 1962.
+
+.EX
+    DATAI 2
+    ADDB 1,2
+    ROTC 2,-22
+    XOR 1,2
+    JRST .-4
+.EE
+.RS 8
+2=X, 3=Y. Try things like 1001002 in data switches. This also does
+interesting things with operations other than XOR, and rotations other 
+than -22. (Try IOR; AND; TSC; FADR; FDV(!); ROT -14, -9, -20, ...)
+.RE
+.TP 8
+ITEM 147 (Schroeppel):
+Munching squares is just views of the graph Y = X XOR T for consecutive
+values of T = time.
+.TP 8
+ITEM 148 (Cohen, Beeler):
+A modification to munching squares which reveals them in frozen states
+through opening and closing curtains: insert FADR 2,1 before the XOR. Try
+data switches =
+
+.EX
+    4000,,4    1000,,2002    2000,,4    0,,1002
+.EE
+.RS 8
+(Notation: <left half>,,<right half>)
+
+Also try the FADR after the XOR, switches = 1001,,1. 
+.SH COPYRIGHT
+Copyright \(co 1997 by Tim Showalter.  Permission to use, copy, modify, 
+distribute, and sell this software 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.  No representations are made about the 
+suitability of this software for any purpose.  It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Tim Showalter <tjs@andrew.cmu.edu>, 17-Jun-97, based on what's in the
+Jargon File and stealing stuff from existing xscreensaver modules.
diff --git a/hacks/noseguy.c b/hacks/noseguy.c
new file mode 100644 (file)
index 0000000..f0fa57f
--- /dev/null
@@ -0,0 +1,723 @@
+/* xscreensaver, Copyright (c) 1992, 1996, 1997, 1998
+ *  Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software 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.  No representations are made about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or 
+ * implied warranty.
+ */
+
+/* Make a little guy with a big nose and a hat wanter around the screen,
+   spewing out messages.  Derived from xnlock by Dan Heller <argv@sun.com>.
+ */
+
+#include "screenhack.h"
+#include <stdio.h>
+
+extern FILE *popen (const char *, const char *);
+extern int pclose (FILE *);
+
+#define font_height(font)              (font->ascent + font->descent)
+#define FONT_NAME                      "-*-times-*-*-*-*-18-*-*-*-*-*-*-*"
+
+static Display *dpy;
+static Window window;
+static int Width, Height;
+static GC fg_gc, bg_gc, text_fg_gc, text_bg_gc;
+static char *words;
+static char *get_words (void);
+static int x, y;
+static XFontStruct *font;
+static char *def_words = "I'm out running around.";
+static void walk (int dir);
+static void talk (int erase);
+static void talk_1 (void);
+static int think (void);
+static unsigned long interval;
+static unsigned long look (void); 
+static Pixmap left1, left2, right1, right2;
+static Pixmap left_front, right_front, front, down;
+
+static char *program, *orig_program, *filename, *text;
+
+#define FROM_ARGV    1
+#define FROM_PROGRAM 2
+#define FROM_FILE    3
+#define FROM_RESRC   4
+static int getwordsfrom;
+
+#define IS_MOVING  1
+#define GET_PASSWD 2
+static int state;      /* indicates states: walking or getting passwd */
+
+static void (*next_fn) (void);
+
+#ifdef HAVE_XPM
+# include <X11/xpm.h>
+
+# include "images/noseguy/nose-f1.xpm"
+# include "images/noseguy/nose-f2.xpm"
+# include "images/noseguy/nose-f3.xpm"
+# include "images/noseguy/nose-f4.xpm"
+# include "images/noseguy/nose-l1.xpm"
+# include "images/noseguy/nose-l2.xpm"
+# include "images/noseguy/nose-r1.xpm"
+# include "images/noseguy/nose-r2.xpm"
+#else
+# include "images/noseguy/nose-f1.xbm"
+# include "images/noseguy/nose-f2.xbm"
+# include "images/noseguy/nose-f3.xbm"
+# include "images/noseguy/nose-f4.xbm"
+# include "images/noseguy/nose-l1.xbm"
+# include "images/noseguy/nose-l2.xbm"
+# include "images/noseguy/nose-r1.xbm"
+# include "images/noseguy/nose-r2.xbm"
+#endif
+
+static void
+init_images (void)
+{
+  static Pixmap *images[] = {
+    &left1, &left2, &right1, &right2,
+    &left_front, &right_front, &front, &down
+  };
+  int i;
+#ifdef HAVE_XPM
+  static char **bits[] = {
+    nose_l1_xpm, nose_l2_xpm, nose_r1_xpm, nose_r2_xpm,
+    nose_f2_xpm, nose_f3_xpm, nose_f1_xpm, nose_f4_xpm
+  };
+  for (i = 0; i < sizeof (images) / sizeof(*images); i++)
+    {
+      XWindowAttributes xgwa;
+      XpmAttributes xpmattrs;
+      Pixmap pixmap = 0;
+      int result;
+      xpmattrs.valuemask = 0;
+
+      XGetWindowAttributes (dpy, window, &xgwa);
+
+# ifdef XpmCloseness
+      xpmattrs.valuemask |= XpmCloseness;
+      xpmattrs.closeness = 40000;
+# endif
+# ifdef XpmVisual
+      xpmattrs.valuemask |= XpmVisual;
+      xpmattrs.visual = xgwa.visual;
+# endif
+# ifdef XpmDepth
+      xpmattrs.valuemask |= XpmDepth;
+      xpmattrs.depth = xgwa.depth;
+# endif
+# ifdef XpmColormap
+      xpmattrs.valuemask |= XpmColormap;
+      xpmattrs.colormap = xgwa.colormap;
+# endif
+
+      result = XpmCreatePixmapFromData(dpy, window, bits[i],
+                                      &pixmap, 0 /* mask */, &xpmattrs);
+      if (!pixmap || (result != XpmSuccess && result != XpmColorError))
+       {
+         fprintf (stderr, "%s: Can't load nose images\n", progname);
+         exit (1);
+       }
+      *images[i] = pixmap;
+    }
+#else
+  static unsigned char *bits[] = {
+    nose_l1_bits, nose_l2_bits, nose_r1_bits, nose_r2_bits,
+    nose_f2_bits, nose_f3_bits, nose_f1_bits, nose_f4_bits
+  };
+
+  for (i = 0; i < sizeof (images) / sizeof(*images); i++)
+    if (!(*images[i] =
+         XCreatePixmapFromBitmapData(dpy, window,
+                                     (char *) bits[i], 64, 64, 1, 0, 1)))
+      {
+       fprintf (stderr, "%s: Can't load nose images\n", progname);
+       exit (1);
+      }
+#endif
+}
+
+#define LEFT   001
+#define RIGHT  002
+#define DOWN   004
+#define UP     010
+#define FRONT  020
+#define X_INCR 3
+#define Y_INCR 2
+
+static void
+move (void)
+{
+    static int      length,
+                    dir;
+
+    if (!length)
+    {
+       register int    tries = 0;
+       dir = 0;
+       if ((random() & 1) && think())
+       {
+           talk(0);            /* sets timeout to itself */
+           return;
+       }
+       if (!(random() % 3) && (interval = look()))
+       {
+           next_fn = move;
+           return;
+       }
+       interval = 20 + random() % 100;
+       do
+       {
+           if (!tries)
+               length = Width / 100 + random() % 90, tries = 8;
+           else
+               tries--;
+           switch (random() % 8)
+           {
+           case 0:
+               if (x - X_INCR * length >= 5)
+                   dir = LEFT;
+               break;
+           case 1:
+               if (x + X_INCR * length <= Width - 70)
+                   dir = RIGHT;
+               break;
+           case 2:
+               if (y - (Y_INCR * length) >= 5)
+                   dir = UP, interval = 40;
+               break;
+           case 3:
+               if (y + Y_INCR * length <= Height - 70)
+                   dir = DOWN, interval = 20;
+               break;
+           case 4:
+               if (x - X_INCR * length >= 5 && y - (Y_INCR * length) >= 5)
+                   dir = (LEFT | UP);
+               break;
+           case 5:
+               if (x + X_INCR * length <= Width - 70 &&
+                   y - Y_INCR * length >= 5)
+                   dir = (RIGHT | UP);
+               break;
+           case 6:
+               if (x - X_INCR * length >= 5 &&
+                   y + Y_INCR * length <= Height - 70)
+                   dir = (LEFT | DOWN);
+               break;
+           case 7:
+               if (x + X_INCR * length <= Width - 70 &&
+                   y + Y_INCR * length <= Height - 70)
+                   dir = (RIGHT | DOWN);
+               break;
+           default:
+               /* No Defaults */
+               break;
+           }
+       } while (!dir);
+    }
+    walk(dir);
+    --length;
+    next_fn = move;
+}
+
+#ifdef HAVE_XPM
+# define COPY(dpy,frame,window,gc,x,y,w,h,x2,y2) \
+  XCopyArea (dpy,frame,window,gc,x,y,w,h,x2,y2)
+#else
+# define COPY(dpy,frame,window,gc,x,y,w,h,x2,y2) \
+  XCopyPlane(dpy,frame,window,gc,x,y,w,h,x2,y2,1L)
+#endif
+
+static void
+walk(int dir)
+{
+    register int    incr = 0;
+    static int      lastdir;
+    static int      up = 1;
+    static Pixmap   frame;
+
+    if (dir & (LEFT | RIGHT))
+    {                          /* left/right movement (mabye up/down too) */
+       up = -up;               /* bouncing effect (even if hit a wall) */
+       if (dir & LEFT)
+       {
+           incr = X_INCR;
+           frame = (up < 0) ? left1 : left2;
+       }
+       else
+       {
+           incr = -X_INCR;
+           frame = (up < 0) ? right1 : right2;
+       }
+       if ((lastdir == FRONT || lastdir == DOWN) && dir & UP)
+       {
+
+           /*
+            * workaround silly bug that leaves screen dust when guy is
+            * facing forward or down and moves up-left/right.
+            */
+           COPY(dpy, frame, window, fg_gc, 0, 0, 64, 64, x, y);
+           XFlush(dpy);
+       }
+       /* note that maybe neither UP nor DOWN is set! */
+       if (dir & UP && y > Y_INCR)
+           y -= Y_INCR;
+       else if (dir & DOWN && y < Height - 64)
+           y += Y_INCR;
+    }
+    /* Explicit up/down movement only (no left/right) */
+    else if (dir == UP)
+       COPY(dpy, front, window, fg_gc, 0, 0, 64, 64, x, y -= Y_INCR);
+    else if (dir == DOWN)
+       COPY(dpy, down, window, fg_gc, 0, 0, 64, 64, x, y += Y_INCR);
+    else if (dir == FRONT && frame != front)
+    {
+       if (up > 0)
+           up = -up;
+       if (lastdir & LEFT)
+           frame = left_front;
+       else if (lastdir & RIGHT)
+           frame = right_front;
+       else
+           frame = front;
+       COPY(dpy, frame, window, fg_gc, 0, 0, 64, 64, x, y);
+    }
+    if (dir & LEFT)
+       while (--incr >= 0)
+       {
+           COPY(dpy, frame, window, fg_gc, 0, 0, 64, 64, --x, y + up);
+           XFlush(dpy);
+       }
+    else if (dir & RIGHT)
+       while (++incr <= 0)
+       {
+           COPY(dpy, frame, window, fg_gc, 0, 0, 64, 64, ++x, y + up);
+           XFlush(dpy);
+       }
+    lastdir = dir;
+}
+
+static int
+think (void)
+{
+    if (random() & 1)
+       walk(FRONT);
+    if (random() & 1)
+    {
+       if (getwordsfrom == FROM_PROGRAM)
+           words = get_words();
+       return 1;
+    }
+    return 0;
+}
+
+#define MAXLINES 40
+
+static void
+talk(int force_erase)
+{
+    int             width = 0,
+                    height,
+                    Z,
+                    total = 0;
+    static int      X,
+                    Y,
+                    talking;
+    static struct
+    {
+       int             x,
+                       y,
+                       width,
+                       height;
+    }               s_rect;
+    register char  *p,
+                   *p2;
+    char            buf[BUFSIZ],
+                    args[MAXLINES][256];
+
+    /* clear what we've written */
+    if (talking || force_erase)
+    {
+       if (!talking)
+           return;
+       XFillRectangle(dpy, window, bg_gc, s_rect.x - 5, s_rect.y - 5,
+                      s_rect.width + 10, s_rect.height + 10);
+       talking = 0;
+       if (!force_erase)
+         next_fn = move;
+       interval = 0;
+       {
+         /* might as well check the window for size changes now... */
+         XWindowAttributes xgwa;
+         XGetWindowAttributes (dpy, window, &xgwa);
+         Width = xgwa.width + 2;
+         Height = xgwa.height + 2;
+       }
+       return;
+    }
+    talking = 1;
+    walk(FRONT);
+    p = strcpy(buf, words);
+
+    if (!(p2 = strchr(p, '\n')) || !p2[1])
+      {
+       total = strlen (words);
+       strcpy (args[0], words);
+       width = XTextWidth(font, words, total);
+       height = 0;
+      }
+    else
+      /* p2 now points to the first '\n' */
+      for (height = 0; p; height++)
+       {
+         int             w;
+         *p2 = 0;
+         if ((w = XTextWidth(font, p, p2 - p)) > width)
+           width = w;
+         total += p2 - p;      /* total chars; count to determine reading
+                                * time */
+         (void) strcpy(args[height], p);
+         if (height == MAXLINES - 1)
+           {
+             puts("Message too long!");
+             break;
+           }
+         p = p2 + 1;
+         if (!(p2 = strchr(p, '\n')))
+           break;
+       }
+    height++;
+
+    /*
+     * Figure out the height and width in pixels (height, width) extend the
+     * new box by 15 pixels on the sides (30 total) top and bottom.
+     */
+    s_rect.width = width + 30;
+    s_rect.height = height * font_height(font) + 30;
+    if (x - s_rect.width - 10 < 5)
+       s_rect.x = 5;
+    else if ((s_rect.x = x + 32 - (s_rect.width + 15) / 2)
+            + s_rect.width + 15 > Width - 5)
+       s_rect.x = Width - 15 - s_rect.width;
+    if (y - s_rect.height - 10 < 5)
+       s_rect.y = y + 64 + 5;
+    else
+       s_rect.y = y - 5 - s_rect.height;
+
+    XFillRectangle(dpy, window, text_bg_gc,
+        s_rect.x, s_rect.y, s_rect.width, s_rect.height);
+
+    /* make a box that's 5 pixels thick. Then add a thin box inside it */
+    XSetLineAttributes(dpy, text_fg_gc, 5, 0, 0, 0);
+    XDrawRectangle(dpy, window, text_fg_gc,
+                  s_rect.x, s_rect.y, s_rect.width - 1, s_rect.height - 1);
+    XSetLineAttributes(dpy, text_fg_gc, 0, 0, 0, 0);
+    XDrawRectangle(dpy, window, text_fg_gc,
+        s_rect.x + 7, s_rect.y + 7, s_rect.width - 15, s_rect.height - 15);
+
+    X = 15;
+    Y = 15 + font_height(font);
+
+    /* now print each string in reverse order (start at bottom of box) */
+    for (Z = 0; Z < height; Z++)
+    {
+       XDrawString(dpy, window, text_fg_gc, s_rect.x + X, s_rect.y + Y,
+                   args[Z], strlen(args[Z]));
+       Y += font_height(font);
+    }
+    interval = (total / 15) * 1000;
+    if (interval < 2000) interval = 2000;
+    next_fn = talk_1;
+}
+
+static void talk_1 (void) 
+{
+  talk(0);
+}
+
+
+static unsigned long
+look (void)
+{
+    if (random() % 3)
+    {
+       COPY(dpy, (random() & 1) ? down : front, window, fg_gc,
+            0, 0, 64, 64, x, y);
+       return 1000L;
+    }
+    if (!(random() % 5))
+       return 0;
+    if (random() % 3)
+    {
+       COPY(dpy, (random() & 1) ? left_front : right_front,
+            window, fg_gc, 0, 0, 64, 64, x, y);
+       return 1000L;
+    }
+    if (!(random() % 5))
+       return 0;
+    COPY(dpy, (random() & 1) ? left1 : right1, window, fg_gc,
+        0, 0, 64, 64, x, y);
+    return 1000L;
+}
+
+
+static void
+init_words (void)
+{
+  char *mode = get_string_resource ("mode", "Mode");
+
+  program = get_string_resource ("program", "Program");
+  filename = get_string_resource ("filename", "Filename");
+  text = get_string_resource ("text", "Text");
+
+  if (program) /* get stderr on stdout, so it shows up on the window */
+    {
+      orig_program = program;
+      program = (char *) malloc (strlen (program) + 10);
+      strcpy (program, "( ");
+      strcat (program, orig_program);
+      strcat (program, " ) 2>&1");
+    }
+
+  if (!mode || !strcmp (mode, "program"))
+    getwordsfrom = FROM_PROGRAM;
+  else if (!strcmp (mode, "file"))
+    getwordsfrom = FROM_FILE;
+  else if (!strcmp (mode, "string"))
+    getwordsfrom = FROM_RESRC;
+  else
+    {
+      fprintf (stderr,
+              "%s: mode must be program, file, or string, not %s\n",
+              progname, mode);
+      exit (1);
+    }
+
+  if (getwordsfrom == FROM_PROGRAM && !program)
+    {
+      fprintf (stderr, "%s: no program specified.\n", progname);
+      exit (1);
+    }
+  if (getwordsfrom == FROM_FILE && !filename)
+    {
+      fprintf (stderr, "%s: no file specified.\n", progname);
+      exit (1);
+    }
+
+  words = get_words(); 
+}
+
+static int first_time = 1;
+
+static char *
+get_words (void)
+{
+    FILE           *pp;
+    static char     buf[BUFSIZ];
+    register char  *p = buf;
+
+    buf[0] = '\0';
+
+    switch (getwordsfrom)
+    {
+    case FROM_PROGRAM:
+#ifndef VMS
+       if ((pp = popen(program, "r")))
+       {
+           while (fgets(p, sizeof(buf) - strlen(buf), pp))
+           {
+               if (strlen(buf) + 1 < sizeof(buf))
+                   p = buf + strlen(buf);
+               else
+                   break;
+           }
+           (void) pclose(pp);
+           if (! buf[0])
+             sprintf (buf, "\"%s\" produced no output!", orig_program);
+           else if (!first_time &&
+                    (strstr (buf, ": not found") ||
+                     strstr (buf, ": Not found") ||
+                      strstr (buf, ": command not found") ||
+                      strstr (buf, ": Command not found")))
+             switch (random () % 20)
+               {
+               case 1: strcat (buf, "( Get with the program, bub. )\n");
+                 break;
+               case 2: strcat (buf,
+                 "( I blow my nose at you, you silly person! ) \n"); break;
+               case 3: strcat (buf,
+                 "\nThe resource you want to\nset is `noseguy.program'\n");
+                 break;
+               case 4:
+                 strcat(buf,"\nHelp!!  Help!!\nAAAAAAGGGGHHH!!  \n\n"); break;
+               case 5: strcpy (buf, "You have new mail.\n"); break;
+               case 6:
+                 strcat(buf,"( Hello?  Are you paying attention? )\n");break;
+               case 7:
+                 strcat (buf, "sh: what kind of fool do you take me for? \n");
+                 break;
+               }
+           first_time = 0;
+           p = buf;
+       }
+       else
+       {
+           perror(program);
+           p = def_words;
+       }
+       break;
+#endif /* VMS */
+    case FROM_FILE:
+       if ((pp = fopen(filename, "r")))
+       {
+           while (fgets(p, sizeof(buf) - strlen(buf), pp))
+           {
+               if (strlen(buf) + 1 < sizeof(buf))
+                   p = buf + strlen(buf);
+               else
+                   break;
+           }
+           (void) fclose(pp);
+           if (! buf[0])
+             sprintf (buf, "file \"%s\" is empty!", filename);
+           p = buf;
+       }
+       else
+       {
+         sprintf (buf, "couldn't read file \"%s\"!", filename);
+         p = buf;
+       }
+       break;
+    case FROM_RESRC:
+       p = text;
+       break;
+    default:
+       p = def_words;
+       break;
+    }
+
+    if (!p || *p == '\0')
+       p = def_words;
+    return p;
+}
+
+
+\f
+char *progclass = "Noseguy";
+
+char *defaults [] = {
+  ".background:                black",
+  ".foreground:                gray80",
+#ifndef VMS
+  "*mode:              program",
+#else
+  "*mode:              string",
+#endif
+  "*program:           " ZIPPY_PROGRAM,
+  "noseguy.font:       -*-new century schoolbook-*-r-*-*-*-180-*-*-*-*-*-*",
+  0
+};
+
+XrmOptionDescRec options [] = {
+  { "-mode",           ".mode",                XrmoptionSepArg, 0 },
+  { "-program",                ".program",             XrmoptionSepArg, 0 },
+  { "-text",           ".text",                XrmoptionSepArg, 0 },
+  { "-filename",       ".filename",            XrmoptionSepArg, 0 },
+  { "-font",           ".font",                XrmoptionSepArg, 0 },
+  { "-text-foreground",        ".textForeground",      XrmoptionSepArg, 0 },
+  { "-text-background",        ".textBackground",      XrmoptionSepArg, 0 },
+  { 0, 0, 0, 0 }
+};
+
+
+static void
+noseguy_init (Display *d, Window w)
+{
+  unsigned long fg, bg, text_fg, text_bg;
+  XWindowAttributes xgwa;
+  Colormap cmap;
+  char *fontname = get_string_resource ("font", "Font");
+  char **list;
+  int foo, i;
+  XGCValues gcvalues;
+  dpy = d;
+  window = w;
+  XGetWindowAttributes (dpy, window, &xgwa);
+  Width = xgwa.width + 2;
+  Height = xgwa.height + 2;
+  cmap = xgwa.colormap;
+
+  init_words();
+  init_images();
+
+  if (!fontname || !(font = XLoadQueryFont(dpy, fontname)))
+    {
+       list = XListFonts(dpy, FONT_NAME, 32767, &foo);
+       for (i = 0; i < foo; i++)
+           if ((font = XLoadQueryFont(dpy, list[i])))
+               break;
+       if (!font)
+         {
+           fprintf (stderr, "%s: Can't find a large font.", progname);
+           exit (1);
+         }
+       XFreeFontNames(list);
+    }
+
+  fg = get_pixel_resource ("foreground", "Foreground", dpy, cmap);
+  bg = get_pixel_resource ("background", "Background", dpy, cmap);
+  text_fg = get_pixel_resource ("textForeground", "Foreground", dpy, cmap);
+  text_bg = get_pixel_resource ("textBackground", "Background", dpy, cmap);
+  /* notice when unspecified */
+  if (! get_string_resource ("textForeground", "Foreground"))
+    text_fg = bg;
+  if (! get_string_resource ("textBackground", "Background"))
+    text_bg = fg;
+
+  gcvalues.font = font->fid;
+  gcvalues.graphics_exposures = False;
+  gcvalues.foreground = fg;
+  gcvalues.background = bg;
+  fg_gc = XCreateGC (dpy, window,
+                    GCForeground|GCBackground|GCGraphicsExposures|GCFont,
+                    &gcvalues);
+  gcvalues.foreground = bg;
+  gcvalues.background = fg;
+  bg_gc = XCreateGC (dpy, window,
+                    GCForeground|GCBackground|GCGraphicsExposures|GCFont,
+                    &gcvalues);
+  gcvalues.foreground = text_fg;
+  gcvalues.background = text_bg;
+  text_fg_gc = XCreateGC (dpy, window,
+                         GCForeground|GCBackground|GCGraphicsExposures|GCFont,
+                         &gcvalues);
+  gcvalues.foreground = text_bg;
+  gcvalues.background = text_fg;
+  text_bg_gc = XCreateGC (dpy, window,
+                         GCForeground|GCBackground|GCGraphicsExposures|GCFont,
+                         &gcvalues);
+  x = Width / 2;
+  y = Height / 2;
+  state = IS_MOVING;
+}
+     
+void
+screenhack (Display *d, Window w)
+{
+  noseguy_init (d, w);
+  next_fn = move;
+  while (1)
+    {
+      next_fn();
+      XSync (dpy, False);
+      screenhack_handle_events (dpy);
+      usleep (interval * 1000);
+    }
+}
+
diff --git a/hacks/noseguy.man b/hacks/noseguy.man
new file mode 100644 (file)
index 0000000..f23746b
--- /dev/null
@@ -0,0 +1,74 @@
+.TH XScreenSaver 1 "13-aug-92" "X Version 11"
+.SH NAME
+noseguy - a little guy with a big nose wanders around being witty
+.SH SYNOPSIS
+.B noseguy
+[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-text-foreground \fIcolor\fP] [\-text-background \fIcolor\fP] [\-font \fIfont\fP] [\-window] [\-root] [\-install] [\-visual \fIvisual\fP] [\-mode \fImode\fP] [\-program \fIprogram\fP] [\-filename \file\fP] [\-text \fItext\fP]
+.SH DESCRIPTION
+A little man with a big nose and a hat runs around spewing out messages to
+the screen.  This code (and its bitmaps) were extracted from the \fIxnlock\fP
+program.
+.SH OPTIONS
+.I noseguy
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window.  This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use.  Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-font \fIfont\fP
+The font used for the messages.
+.TP 8
+.B \-mode [ program | file | string ]
+In \fIprogram\fP mode, the messages are gotten by running a program.
+The program used is controlled by the \fI\-program\fP option, and 
+the \fI.program\fP resource.
+
+In \fIfilename\fP mode, the message used is the contents of a file.
+The file used is controlled by the \fI\-file\fP option, and 
+the \fI.filename\fP resource.
+
+In \fIstring\fP mode, the message is whatever was specified on the 
+command line as the \fI\-text\fP option, or in the resource database
+as the \fI.text\fP resource.
+.TP 8
+.B \-program \fIprogram\fP
+If \fImode\fP is \fIprogram\fP (the default), then this program will be
+run periodically, and its output will be the text of the messages.  The
+default program is \fI"fortune -s"\fP, but \fIyow\fP is also a good choice.
+.TP 8
+.B \-filename \fIfile\fP
+If \fImode\fP is \fIfile\fP, then the contents of this file will be used
+for all messages.
+.TP 8
+.B \-text \fIstring\fP
+If \fImode\fP is \fIstring\fP, then this text will be used for all messages.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1),
+.BR xnlock (1)
+.SH COPYRIGHT
+Copyright 1985, 1990 by Dan Heller <argv@sun.com>.
+.SH AUTHOR
+Dan Heller <argv@sun.com>, 1985.
+
+Ability to run standalone or with \fIxscreensaver\fP added by 
+Jamie Zawinski <jwz@jwz.org>, 13-aug-92.
diff --git a/hacks/pedal.c b/hacks/pedal.c
new file mode 100644 (file)
index 0000000..7f8e5bd
--- /dev/null
@@ -0,0 +1,382 @@
+/*
+ * pedal
+ *
+ * Based on a program for some old PDP-11 Graphics Display Processors
+ * at CMU.
+ *
+ * X version by
+ *
+ *  Dale Moore  <Dale.Moore@cs.cmu.edu>
+ *  24-Jun-1994
+ *
+ *  Copyright (c) 1994, by Carnegie Mellon University.  Permission to use,
+ *  copy, modify, distribute, and sell this software and its documentation
+ *  for any purpose is hereby granted without fee, provided fnord that the
+ *  above copyright notice appear in all copies and that both that copyright
+ *  notice and this permission notice appear in supporting documentation.
+ *  No representations are made about the  suitability of fnord this software
+ *  for any purpose.  It is provided "as is" without express or implied
+ *  warranty.
+ */
+
+#include <math.h>
+#include <stdlib.h>
+#include "screenhack.h"
+
+/* If MAXLINES is too big, we might not be able to get it
+ * to the X server in the 2byte length field. Must be less
+ * than 16k
+ */
+#define MAXLINES (16 * 1024)
+#define MAXPOINTS MAXLINES
+XPoint *points;
+
+/* 
+ * If the pedal has only this many lines, it must be ugly and we dont
+ * want to see it.
+ */
+#define MINLINES 7
+
+static int sizex, sizey;
+static int delay;
+static int fadedelay;
+static int maxlines;
+static GC gc;
+static XColor foreground, background;
+static Colormap cmap;
+
+static Bool fade_p;
+
+
+/*
+ * Routine (Macro actually)
+ *   mysin
+ * Description:
+ *   Assume that degrees is .. oh 360... meaning that
+ *   there are 360 degress in a circle.  Then this function
+ *   would return the sin of the angle in degrees.  But lets
+ *   say that they are really big degrees, with 4 big degrees
+ *   the same as one regular degree.  Then this routine
+ *   would be called mysin(t, 90) and would return sin(t degrees * 4)
+ */
+#define mysin(t, degrees) sin(t * 2 * M_PI / (degrees))
+#define mycos(t, degrees) cos(t * 2 * M_PI / (degrees))
+
+/*
+ * Macro:
+ *   rand_range
+ * Description:
+ *   Return a random number between a inclusive  and b exclusive.
+ *    rand (3, 6) returns 3 or 4 or 5, but not 6.
+ */
+#define rand_range(a, b) (a + random() % (b - a))
+
+
+static int
+gcd(int m, int n) /* Greatest Common Divisor (also Greates common factor). */
+{
+    int r;
+
+    for (;;) {
+        r = m % n;
+        if (r == 0) return (n);
+        m = n;
+        n = r;
+    }
+}
+
+static int numlines (int a, int b, int d)
+/*
+ * Description:
+ *
+ *      Given parameters a and b, how many lines will we have to draw?
+ *
+ * Algorithm:
+ *
+ *      This algorithm assumes that r = sin (theta * a), where we
+ *      evaluate theta on multiples of b.
+ *
+ *      LCM (i, j) = i * j / GCD (i, j);
+ *
+ *      So, at LCM (b, 360) we start over again.  But since we
+ *      got to LCM (b, 360) by steps of b, the number of lines is
+ *      LCM (b, 360) / b.
+ *
+ *      If a is odd, then at 180 we cross over and start the
+ *      negative.  Someone should write up an elegant way of proving
+ *      this.  Why?  Because I'm not convinced of it myself. 
+ *
+ */
+{
+#define odd(x) (x & 1)
+#define even(x) (!odd(x))
+    if ( odd(a) && odd(b) && even(d)) d /= 2;
+    return  (d / gcd (d, b));
+#undef odd
+}
+
+static int
+compute_pedal(XPoint *points, int maxpoints)
+/*
+ * Description:
+ *
+ *    Basically, it's combination spirograph and string art.
+ *    Instead of doing lines, we just use a complex polygon,
+ *    and use an even/odd rule for filling in between.
+ *
+ *    The spirograph, in mathematical terms is a polar
+ *    plot of the form r = sin (theta * c);
+ *    The string art of this is that we evaluate that
+ *    function only on certain multiples of theta.  That is
+ *    we let theta advance in some random increment.  And then
+ *    we draw a straight line between those two adjacent points.
+ *
+ *    Eventually, the lines will start repeating themselves
+ *    if we've evaluated theta on some rational portion of the
+ *    whole.
+ *
+ *    The number of lines generated is limited to the
+ *    ratio of the increment we put on theta to the whole.
+ *    If we say that there are 360 degrees in a circle, then we
+ *    will never have more than 360 lines.   
+ *
+ * Return:
+ *
+ *    The number of points.
+ *
+ */
+{
+    int a, b, d;  /* These describe a unique pedal */
+
+    double r;
+    int theta = 0;
+    XPoint *pp = points;
+    int count;
+    int numpoints;
+
+    /* Just to make sure that this division is not done inside the loop */
+    int h_width = sizex / 2, h_height = sizey / 2 ;
+
+    for (;;) {
+       d = rand_range (MINLINES, maxlines);
+
+       a = rand_range (1, d);
+       b = rand_range (1, d);
+       numpoints = numlines(a, b, d);
+       if (numpoints > MINLINES) break;
+    }
+
+    /* it might be nice to try to move as much sin and cos computing
+     * (or at least the argument computing) out of the loop.
+     */
+    for (count = numpoints; count-- ; )
+    {
+        r = mysin (theta * a, d);
+
+        /* Convert from polar to cartesian coordinates */
+       /* We could round the results, but coercing seems just fine */
+        pp->x = mysin (theta, d) * r * h_width  + h_width;
+        pp->y = mycos (theta, d) * r * h_height + h_height;
+
+        /* Advance index into array */
+        pp++;
+
+        /* Advance theta */
+        theta += b;
+        theta %= d;
+    }
+
+    return(numpoints);
+}
+
+static void
+init_pedal (Display *dpy, Window window)
+{
+  XGCValues gcv;
+  XWindowAttributes xgwa;
+
+  fade_p = !mono_p;
+
+  delay = get_integer_resource ("delay", "Integer");
+  if (delay < 0) delay = 0;
+
+  fadedelay = get_integer_resource ("fadedelay", "Integer");
+  if (fadedelay < 0) fadedelay = 0;
+
+  maxlines = get_integer_resource ("maxlines", "Integer");
+  if (maxlines < MINLINES) maxlines = MINLINES;
+  else if (maxlines > MAXLINES) maxlines = MAXLINES;
+
+  points = (XPoint *)malloc(sizeof(XPoint) * maxlines);
+
+  XGetWindowAttributes (dpy, window, &xgwa);
+  sizex = xgwa.width;
+  sizey = xgwa.height;
+
+  if ((xgwa.visual->class != GrayScale) && (xgwa.visual->class != PseudoColor))
+    fade_p = False;
+
+  cmap = xgwa.colormap;
+
+  gcv.function = GXcopy;
+  gcv.foreground = get_pixel_resource ("foreground", "Foreground", dpy, cmap);
+  gcv.background = get_pixel_resource ("background", "Background", dpy, cmap);
+  gc = XCreateGC (dpy, window, GCForeground | GCBackground |GCFunction, &gcv);
+
+  if (fade_p)
+  {
+      int status;
+      foreground.pixel = gcv.foreground;
+      XQueryColor (dpy, cmap, &foreground);
+
+      status = XAllocColorCells (
+                       dpy,
+                       cmap,
+                       0,
+                       NULL,
+                       0,
+                       &foreground.pixel,
+                       1);
+      if (status)
+      {
+         XStoreColor ( dpy, cmap, &foreground);
+         XSetForeground (dpy, gc, foreground.pixel);
+
+         background.pixel = gcv.background;
+         XQueryColor (dpy, cmap, &background);
+      }
+      else
+      {
+         /* If we cant allocate a color cell, then just forget the
+           * whole fade business.
+           */
+         fade_p = False;
+      }
+  }
+}
+
+static void
+fade_foreground (Display *dpy, Colormap cmap,
+                XColor from, XColor to, int steps)
+/*
+ * This routine assumes that we have a writeable colormap.
+ * That means that the default colormap is not full, and that
+ * the visual class is PseudoColor or GrayScale.
+ */
+{
+    int i;
+    XColor inbetween;
+    int udelay = fadedelay / (steps + 1);
+
+    inbetween = foreground;
+    for (i = 0; i <= steps; i++ )
+    {
+      inbetween.red   = from.red   + (to.red   - from.red)   * i / steps ;
+      inbetween.green = from.green + (to.green - from.green) * i / steps ;
+      inbetween.blue  = from.blue  + (to.blue  - from.blue)  * i / steps ;
+      XStoreColor (dpy, cmap, &inbetween);
+      /* If we don't sync, these can bunch up */
+      XSync(dpy, False);
+      screenhack_handle_events (dpy);
+      usleep(udelay);
+    }
+}
+
+static void
+pedal (Display *dpy, Window window)
+/*
+ *    Since the XFillPolygon doesn't require that the last
+ *    point == first point, the number of points is the same
+ *    as the number of lines.  We just let XFillPolygon supply
+ *    the line from the last point to the first point.
+ *
+ */
+{
+   int numpoints;
+
+   numpoints = compute_pedal(points, maxlines);
+
+   /* Fade out, make foreground the same as background */
+   if (fade_p)
+     fade_foreground (dpy, cmap, foreground, background, 32);
+
+    /* Clear the window of previous garbage */
+    XClearWindow (dpy, window);
+
+    XFillPolygon (
+                dpy,
+                window,
+                gc,
+                points,
+                numpoints,
+                Complex,
+                CoordModeOrigin);
+
+   /* Pick a new foreground color (added by jwz) */
+   if (! mono_p)
+     {
+       XColor color;
+       hsv_to_rgb (random()%360, 1.0, 1.0,
+                  &color.red, &color.green, &color.blue);
+       XSync(dpy, False);
+       if (fade_p)
+        {
+          foreground.red = color.red;
+          foreground.green = color.green;
+          foreground.blue = color.blue;
+          /* don't do this here -- let fade_foreground() bring it up! */
+          /* XStoreColor (dpy, cmap, &foreground); */
+        }
+       else if (XAllocColor (dpy, cmap, &color))
+        {
+          XSetForeground (dpy, gc, color.pixel);
+          XFreeColors (dpy, cmap, &foreground.pixel, 1, 0);
+          foreground.red = color.red;
+          foreground.green = color.green;
+          foreground.blue = color.blue;
+          foreground.pixel = color.pixel;
+        }
+       XSync(dpy, False);
+     }
+
+    /* Fade in by bringing the foreground back from background */
+    if (fade_p)
+       fade_foreground (dpy, cmap, background, foreground, 32);
+}
+
+\f
+char *progclass = "Pedal";
+
+/*
+ * If we are trying to save the screen, the background
+ * should be dark.
+ */
+char *defaults [] = {
+  ".background:                        black",
+  ".foreground:                        white",
+  "*delay:                     5",
+  "*fadedelay:                 200000",
+  "*maxlines:                  1000",
+  0
+};
+
+XrmOptionDescRec options [] = {
+  { "-delay",          ".delay",               XrmoptionSepArg, 0 },
+  { "-fadedelay",      ".fadedelay",           XrmoptionSepArg, 0 },
+  { "-maxlines",       ".maxlines",            XrmoptionSepArg, 0 },
+  { "-foreground",      ".foreground",          XrmoptionSepArg, 0 },
+  { "-background",      ".background",          XrmoptionSepArg, 0 },
+  { 0, 0, 0, 0 }
+};
+
+void
+screenhack (Display *dpy, Window window)
+{
+    init_pedal (dpy, window);
+    for (;;) {
+       pedal (dpy, window);
+       XSync(dpy, False);
+        screenhack_handle_events (dpy);
+       if (delay) sleep (delay);
+    }
+}
diff --git a/hacks/pedal.man b/hacks/pedal.man
new file mode 100644 (file)
index 0000000..7a0c3e5
--- /dev/null
@@ -0,0 +1,62 @@
+.TH XScreenSaver 1 "24-Jun-94" "X Version 11"
+.SH NAME
+pedal - pretty geometric picture program
+.SH SYNOPSIS
+.B pedal
+[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-delay \fIseconds\fP] [-maxlines \fInumber\fP] [-fadedelay \fIuseconds\fP] [-mono] [\-install] [\-visual \fIvisual\fP]
+.SH DESCRIPTION
+The \fIpedal\fP program displays pretty geometric pictures.
+.SH OPTIONS
+.I pedal
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window.  This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-foreground \fIcolor\fP
+The color for the foreground.  Default is white.
+.TP 8
+.B \-background \fIcolor\fP
+The color for the background.  Default is black.
+.TP 8
+.B \-delay \fIseconds\fP
+The number of seconds to pause between each picture.
+.TP 8
+.B \-maxlines \fInumber\fP
+The maximum number of lines in the drawing.  Good values are
+between 20 and 2000.  Maximum value is 16K.
+.TP 8
+.B \-fadedelay \fImicroseconds\fP
+The number of micro seconds to take when fading in and out.
+.TP 8
+.B \-mono
+Don't do fading.  Pretend we're on a monochrome display.
+.PP
+To make your X server grunt under load, and to impress your
+friends, try \fIpedal -mono -delay 0 -maxlines 100\fp.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 1994, by Carnegie Mellon University.  Permission to use,
+copy, modify, distribute, and sell this software and its documentation
+for any purpose is hereby granted without fee, provided fnord that the
+above copyright notice appear in all copies and that both that copyright
+notice and this permission notice appear in supporting documentation.
+No representations are made about the  suitability of fnord this software
+for any purpose.  It is provided "as is" without express or implied
+warranty.
+.SH AUTHOR
+Dale Moore <Dale.Moore@cs.cmu.edu>, 24-Jun-1994.
diff --git a/hacks/penetrate.c b/hacks/penetrate.c
new file mode 100644 (file)
index 0000000..3e41af8
--- /dev/null
@@ -0,0 +1,912 @@
+/* Copyright (c) 1999
+ *  Adam Miller adum@aya.yale.edu
+ *
+ * Permission to use, copy, modify, distribute, and sell this software 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.  No representations are made about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or 
+ * implied warranty.
+
+ * penetrate simulates the arcade classic with the cities and the stuff
+ * shooting down from the sky and stuff. The computer plays against itself,
+ * desperately defending the forces of good against those thingies raining
+ * down. Bonus cities are awarded at ever-increasing intervals. Every five
+ * levels appears a bonus round. The computer player gets progressively
+ * more intelligent as the game progresses. Better aim, more economical with
+ * ammo, and better target selection. Points are in the bottom right, and
+ * high score is in the bottom left. Start with -smart to have the computer
+ * player skip the learning process.
+
+ */
+
+#include "screenhack.h"
+
+#define kSleepTime 10000
+
+#define font_height(font)              (font->ascent + font->descent)
+#define FONT_NAME                      "-*-times-*-*-*-*-80-*-*-*-*-*-*-*"
+
+#define kCityPause 500000
+#define kLevelPause 1
+#define SCORE_MISSILE 100
+#define kFirstBonus 5000
+#define kMinRate 30
+#define kMaxRadius 100
+
+static XFontStruct *font, *scoreFont;
+static GC draw_gc, erase_gc, level_gc;
+static unsigned int default_fg_pixel;
+static XColor scoreColor;
+
+int bgrowth;
+int lrate = 80, startlrate;
+long loop = 0;
+long score = 0, highscore = 0;
+long nextBonus = kFirstBonus;
+int numBonus = 0;
+int bround = 0;
+long lastLaser = 0;
+int gamez = 0;
+int aim = 180;
+int econpersen = 0;
+int choosypersen = 0;
+int carefulpersen = 0;
+int smart = 0;
+
+typedef struct {
+  int alive;
+  int x, y;
+  int startx, starty;
+  int endx, endy;
+  int dcity;
+  float pos;
+  int enemies;
+  int jenis;
+  int splits;
+  XColor color;
+} Missile;
+
+typedef struct {
+  int alive;
+  int x, y, rad, oflaser;
+  int max, outgoing;
+  XColor color;
+} Boom;
+
+typedef struct {
+  int alive;
+  int x;
+  XColor color;
+} City;
+
+typedef struct {
+  int alive;
+  int x, y;
+  int startx, starty;
+  int endx, endy;
+  int oldx, oldy;
+  float velx, vely, fposx, fposy;
+  float lenMul;
+  XColor color;
+  int target;
+} Laser;
+
+#define kMaxMissiles 256
+#define kMaxBooms 512
+#define kMaxLasers 128
+#define kBoomRad 40
+#define kNumCities 5
+
+#define kLaserLength 12
+
+#define kMissileSpeed 0.003
+#define kLaserSpeed (kMissileSpeed * 6)
+
+Missile missile[kMaxMissiles];
+Boom boom[kMaxBooms];
+City city[kNumCities];
+Laser laser[kMaxLasers];
+int blive[kNumCities];
+
+static void Explode(int x, int y, int max, XColor color, int oflaser)
+{
+  int i;
+  Boom *m = 0;
+  for (i=0;i<kMaxBooms;i++)
+        if (!boom[i].alive) {
+               m = &boom[i];
+               break;
+        }
+  if (!m)
+        return;
+
+  m->alive = 1;
+  m->x = x;
+  m->y = y;
+  m->rad = 0;
+  if (max > kMaxRadius)
+        max = kMaxRadius;
+  m->max = max;
+  m->outgoing = 1;
+  m->color = color;
+  m->oflaser = oflaser;
+}
+
+static void launch (int xlim, int ylim,
+       Display *dpy, Colormap cmap, int src)
+{
+  int i;
+  Missile *m = 0, *msrc;
+  for (i=0;i<kMaxMissiles;i++)
+        if (!missile[i].alive) {
+               m = &missile[i];
+               break;
+        }
+  if (!m)
+        return;
+
+  m->alive = 1;
+  m->startx = (random() % xlim);
+  m->starty = 0;
+  m->endy = ylim;
+  m->pos = 0.0;
+  m->jenis = random() % 360;
+  m->splits = 0;
+  if (m->jenis < 50) {
+        m->splits = random() % ((int) (ylim * 0.4));
+        if (m->splits < ylim * 0.08)
+               m->splits = 0;
+  }
+
+  /* special if we're from another missile */
+  if (src >= 0) {
+        int dc = random() % (kNumCities - 1);
+        msrc = &missile[src];
+        if (dc == msrc->dcity)
+               dc++;
+        m->dcity = dc;
+        m->startx = msrc->x;
+        m->starty = msrc->y;
+        if (m->starty > ylim * 0.4 || m->splits <= m->starty)
+               m->splits = 0;  /* too far down already */
+        m->jenis = msrc->jenis;
+  }
+  else
+        m->dcity = random() % kNumCities;
+  m->endx = city[m->dcity].x + (random() % 20) - 10;
+  m->x = m->startx;
+  m->y = m->starty;
+  m->enemies = 0;
+
+  if (!mono_p) {
+        hsv_to_rgb (m->jenis, 1.0, 1.0,
+                                        &m->color.red, &m->color.green, &m->color.blue);
+        m->color.flags = DoRed | DoGreen | DoBlue;
+        if (!XAllocColor (dpy, cmap, &m->color)) {
+               m->color.pixel = WhitePixel (dpy, DefaultScreen (dpy));
+               m->color.red = m->color.green = m->color.blue = 0xFFFF;
+        }
+  }
+}
+
+static int fire(int xlim, int ylim,
+       Display *dpy, Window window, Colormap cmap)
+{
+  int i, j, cnt = 0;
+  int dcity;
+  long dx, dy, ex, ey;
+  Missile *mis = 0;
+  Laser *m = 0;
+  int untargeted = 0;
+  int choosy = 0, economic = 0, careful = 0;
+  int suitor[kMaxMissiles];
+  int livecity = 0;
+  int ytargetmin = ylim * 0.75;
+  int deepest = 0;
+  int misnum = 0;
+
+  choosy = (random() % 100) < choosypersen;
+  economic = (random() % 100) < econpersen;
+  careful = (random() % 100) < carefulpersen;
+
+  /* count our cities */
+  for (i=0;i<kNumCities;i++)
+        livecity += city[i].alive;
+  if (livecity == 0)
+        return 1;  /* no guns */
+
+  for (i=0;i<kMaxLasers;i++)
+        if (!laser[i].alive) {
+               m = &laser[i];
+               break;
+        }
+  if (!m)
+        return 1;
+
+  /* if no missiles on target, no need to be choosy */
+  if (choosy) {
+        int choo = 0;
+        for (j=0;j<kMaxMissiles;j++) {
+               mis = &missile[j];
+               if (!mis->alive || (mis->y > ytargetmin))
+                 continue;
+               if (city[mis->dcity].alive)
+                 choo++;
+        }
+        if (choo == 0)
+               choosy = 0;
+  }
+
+  for (j=0;j<kMaxMissiles;j++) {
+        mis = &missile[j];
+        suitor[j] = 0;
+        if (!mis->alive || (mis->y > ytargetmin))
+               continue;
+        if (choosy && (city[mis->dcity].alive == 0))
+               continue;
+        cnt++;
+        suitor[j] = 1;
+  }
+
+  /* count missiles that are on target and not being targeted */
+  if (choosy && economic)
+        for (j=0;j<kMaxMissiles;j++)
+               if (suitor[j] && missile[j].enemies == 0)
+                 untargeted++;
+
+  if (economic)
+        for (j=0;j<kMaxMissiles;j++) {
+               if (suitor[j] && cnt > 1)
+                 if (missile[j].enemies > 0)
+                        if (missile[j].enemies > 1 || untargeted == 0) {
+                               suitor[j] = 0;
+                               cnt--;
+                        }
+               /* who's closest? biggest threat */
+               if (suitor[j] && missile[j].y > deepest)
+                 deepest = missile[j].y;
+        }
+
+  if (deepest > 0 && careful) {
+        /* only target deepest missile */
+        cnt = 1;
+        for (j=0;j<kMaxMissiles;j++)
+               if (suitor[j] && missile[j].y != deepest)
+                 suitor[j] = 0;
+  }
+
+  if (cnt == 0)
+        return 1;  /* no targets available */
+  cnt = random() % cnt;
+  for (j=0;j<kMaxMissiles;j++)
+        if (suitor[j])
+               if (cnt-- == 0) {
+                 mis = &missile[j];
+                 misnum = j;
+                 break;
+               }
+
+  if (mis == 0)
+        return 1;  /* shouldn't happen */
+
+  dcity = random() % livecity;
+  for (j=0;j<kNumCities;j++)
+        if (city[j].alive)
+               if (dcity-- == 0) {
+                 dcity = j;
+                 break;
+               }
+  m->startx = city[dcity].x;
+  m->starty = ylim;
+#define kExpHelp 0.2
+#define kSpeedDiff 3.5
+  ex = mis->startx + ((float) (mis->endx - mis->startx)) * (mis->pos + kExpHelp + (1.0 - mis->pos) / kSpeedDiff);
+  ey = mis->starty + ((float) (mis->endy - mis->starty)) * (mis->pos + kExpHelp + (1.0 - mis->pos) / kSpeedDiff);
+  m->endx = ex + random() % 16 - 8 + (random() % aim) - aim / 2;
+  m->endy = ey + random() % 16 - 8 + (random() % aim) - aim / 2;
+  if (ey > ylim * 0.75)
+        return 0;  /* too far down */
+  mis->enemies++;
+  m->target = misnum;
+  m->x = m->startx;
+  m->y = m->starty;
+  m->oldx = m->x;
+  m->oldy = m->y;
+  m->fposx = m->x;
+  m->fposy = m->y;
+  dx = (m->endx - m->x);
+  dy = (m->endy - m->y);
+  m->velx = dx / 100.0;
+  m->vely = dy / 100.0;
+  m->alive = 1;
+  /* m->lenMul = (kLaserLength * kLaserLength) / (m->velx * m->velx + m->vely * m->vely); */
+  m->lenMul = -(kLaserLength / m->vely);
+
+  if (!mono_p) {
+        m->color.blue = 0x0000;
+        m->color.green = 0xFFFF;
+        m->color.red = 0xFFFF;
+        m->color.flags = DoRed | DoGreen | DoBlue;
+        if (!XAllocColor (dpy, cmap, &m->color)) {
+               m->color.pixel = WhitePixel (dpy, DefaultScreen (dpy));
+               m->color.red = m->color.green = m->color.blue = 0xFFFF;
+        }
+  }
+  return 1;
+}
+
+static Colormap
+init_penetrate(Display *dpy, Window window)
+{
+  int i;
+  /*char *fontname =   "-*-new century schoolbook-*-r-*-*-*-380-*-*-*-*-*-*"; */
+  char *fontname =   "-*-courier-*-r-*-*-*-380-*-*-*-*-*-*";
+  char **list;
+  int foo;
+  Colormap cmap;
+  XGCValues gcv;
+  XWindowAttributes xgwa;
+  XGetWindowAttributes (dpy, window, &xgwa);
+  cmap = xgwa.colormap;
+
+  if (get_string_resource("smart","String")!=NULL && get_string_resource("smart","String")[0]!=0)
+        smart = 1;
+  bgrowth = get_integer_resource ("bgrowth", "Integer");
+  lrate = get_integer_resource ("lrate", "Integer");
+  if (bgrowth < 0) bgrowth = 2;
+  if (lrate < 0) lrate = 2;
+  startlrate = lrate;
+
+  if (!fontname || !(font = XLoadQueryFont(dpy, fontname))) {
+        list = XListFonts(dpy, FONT_NAME, 32767, &foo);
+        for (i = 0; i < foo; i++)
+               if ((font = XLoadQueryFont(dpy, list[i])))
+                 break;
+        if (!font) {
+               fprintf (stderr, "%s: Can't find a large font.", progname);
+           exit (1);
+        }
+        XFreeFontNames(list);
+  }
+
+  if (!(scoreFont = XLoadQueryFont(dpy, "-*-times-*-r-*-*-*-180-*-*-*-*-*-*")))
+        fprintf(stderr, "%s: Can't load Times font.", progname);
+
+  for (i = 0; i < kMaxMissiles; i++)
+    missile[i].alive = 0;
+
+  for (i = 0; i < kMaxLasers; i++)
+    laser[i].alive = 0;
+
+  for (i = 0; i < kMaxBooms; i++)
+    boom[i].alive = 0;
+
+  for (i = 0; i < kNumCities; i++) {
+        City *m = &city[i];
+    m->alive = 1;
+        m->color.red = m->color.green = m->color.blue = 0xFFFF;
+        m->color.blue = 0x1111; m->color.green = 0x8888;
+        m->color.flags = DoRed | DoGreen | DoBlue;
+        if (!XAllocColor (dpy, cmap, &m->color)) {
+               m->color.pixel = WhitePixel (dpy, DefaultScreen (dpy));
+               m->color.red = m->color.green = m->color.blue = 0xFFFF;
+        }
+  }
+
+  gcv.foreground = default_fg_pixel =
+    get_pixel_resource("foreground", "Foreground", dpy, cmap);
+  gcv.font = scoreFont->fid;
+  draw_gc = XCreateGC(dpy, window, GCForeground | GCFont, &gcv);
+  gcv.font = font->fid;
+  level_gc = XCreateGC(dpy, window, GCForeground | GCFont, &gcv);
+  XSetForeground (dpy, level_gc, city[0].color.pixel);
+  gcv.foreground = get_pixel_resource("background", "Background", dpy, cmap);
+  erase_gc = XCreateGC(dpy, window, GCForeground, &gcv);
+
+  /* make a gray color for score */
+  if (!mono_p) {
+        scoreColor.red = scoreColor.green = scoreColor.blue = 0xAAAA;
+        scoreColor.flags = DoRed | DoGreen | DoBlue;
+        if (!XAllocColor (dpy, cmap, &scoreColor)) {
+               scoreColor.pixel = WhitePixel (dpy, DefaultScreen (dpy));
+               scoreColor.red = scoreColor.green = scoreColor.blue = 0xFFFF;
+        }
+  }
+
+  XClearWindow(dpy, window);
+  return cmap;
+}
+
+static void DrawScore(Display *dpy, Window window, Colormap cmap, int xlim, int ylim)
+{
+  char buf[16];
+  int width, height;
+  sprintf(buf, "%ld", score);
+  width = XTextWidth(scoreFont, buf, strlen(buf));
+  height = font_height(scoreFont);
+  XSetForeground (dpy, draw_gc, scoreColor.pixel);
+  XFillRectangle(dpy, window, erase_gc,
+                                 xlim - width - 6, ylim - height - 2, width + 6, height + 2);
+  XDrawString(dpy, window, draw_gc, xlim - width - 2, ylim - 2,
+                   buf, strlen(buf));
+
+  sprintf(buf, "%ld", highscore);
+  width = XTextWidth(scoreFont, buf, strlen(buf));
+  XFillRectangle(dpy, window, erase_gc,
+                                 4, ylim - height - 2, width + 4, height + 2);
+  XDrawString(dpy, window, draw_gc, 4, ylim - 2,
+                   buf, strlen(buf));
+}
+
+static void AddScore(Display *dpy, Window window, Colormap cmap, int xlim, int ylim, long dif)
+{
+  int i, sumlive = 0;
+  for (i=0;i<kNumCities;i++)
+        sumlive += city[i].alive;
+  if (sumlive == 0)
+        return;   /* no cities, not possible to score */
+
+  score += dif;
+  if (score > highscore)
+        highscore = score;
+  DrawScore(dpy, window, cmap, xlim, ylim);
+}
+
+static void DrawCity(Display *dpy, Window window, Colormap cmap, int x, int y, XColor col)
+{
+        XSetForeground (dpy, draw_gc, col.pixel);
+        XFillRectangle(dpy, window, draw_gc,
+                                 x - 30, y - 40, 60, 40);
+        XFillRectangle(dpy, window, draw_gc,
+                                                x - 20, y - 50, 10, 10);
+        XFillRectangle(dpy, window, draw_gc,
+                                 x + 10, y - 50, 10, 10);
+}
+
+static void DrawCities(Display *dpy, Window window, Colormap cmap, int xlim, int ylim)
+{
+  int i, x;
+  for (i = 0; i < kNumCities; i++) {
+        City *m = &city[i];
+        if (!m->alive)
+               continue;
+        x = (i + 1) * (xlim / (kNumCities + 1));
+        m->x = x;
+
+        DrawCity(dpy, window, cmap, x, ylim, m->color);
+  }
+}
+
+static void LoopMissiles(Display *dpy, Window window, Colormap cmap, int xlim, int ylim)
+{
+  int i, j, max = 0;
+  for (i = 0; i < kMaxMissiles; i++) {
+        int old_x, old_y;
+        Missile *m = &missile[i];
+        if (!m->alive)
+               continue;
+        old_x = m->x;
+        old_y = m->y;
+        m->pos += kMissileSpeed;
+        m->x = m->startx + ((float) (m->endx - m->startx)) * m->pos;
+        m->y = m->starty + ((float) (m->endy - m->starty)) * m->pos;
+
+      /* erase old one */
+
+        XSetLineAttributes(dpy, draw_gc, 4, 0,0,0);
+    XSetForeground (dpy, draw_gc, m->color.pixel);
+        XDrawLine(dpy, window, draw_gc,
+                                 old_x, old_y, m->x, m->y);
+
+        /* maybe split off a new missile? */
+        if (m->splits && (m->y > m->splits)) {
+               m->splits = 0;
+               launch(xlim, ylim, dpy, cmap, i);
+        }
+        
+        if (m->y >= ylim) {
+               m->alive = 0;
+               if (city[m->dcity].alive) {
+                 city[m->dcity].alive = 0;
+                 Explode(m->x, m->y, kBoomRad * 2, m->color, 0);
+               }
+        }
+
+        /* check hitting explosions */
+        for (j=0;j<kMaxBooms;j++) {
+               Boom *b = &boom[j];
+               if (!b->alive)
+                 continue;
+               else {
+                 int dx = abs(m->x - b->x);
+                 int dy = abs(m->y - b->y);
+                 int r = b->rad + 2;
+                 if ((dx < r) && (dy < r))
+                        if (dx * dx + dy * dy < r * r) {
+                               m->alive = 0;
+                               max = b->max + bgrowth - kBoomRad;
+                               AddScore(dpy, window, cmap, xlim, ylim, SCORE_MISSILE);
+                 }
+               }
+        }
+
+        if (m->alive == 0) {
+               /* we just died */
+               Explode(m->x, m->y, kBoomRad + max, m->color, 0);
+               XSetLineAttributes(dpy, erase_gc, 5, 0,0,0);
+               XDrawLine(dpy, window, erase_gc,
+                                        m->startx, m->starty, m->x, m->y);             
+        }
+  }
+}
+
+static void LoopLasers(Display *dpy, Window window, Colormap cmap, int xlim, int ylim)
+{
+  int i, j, miny = ylim * 0.8;
+  int x, y;
+  for (i = 0; i < kMaxLasers; i++) {
+        Laser *m = &laser[i];
+        if (!m->alive)
+               continue;
+        m->fposx += m->velx;
+        m->fposy += m->vely;
+        m->x = m->fposx;
+        m->y = m->fposy;
+        
+        x = m->fposx + (-m->velx * m->lenMul);
+        y = m->fposy + (-m->vely * m->lenMul);
+
+        XSetLineAttributes(dpy, erase_gc, 4, 0,0,0);
+        XDrawLine(dpy, window, erase_gc,
+                                 x, y, m->oldx, m->oldy);              
+        m->oldx = x;
+        m->oldy = y;
+
+        XSetLineAttributes(dpy, draw_gc, 2, 0,0,0);
+    XSetForeground (dpy, draw_gc, m->color.pixel);
+        XDrawLine(dpy, window, draw_gc,
+                                 m->x, m->y, x, y);
+        
+        if (m->y < m->endy) {
+               m->alive = 0;
+        }
+
+        /* check hitting explosions */
+        if (m->y < miny)
+               for (j=0;j<kMaxBooms;j++) {
+                 Boom *b = &boom[j];
+                 if (!b->alive)
+                        continue;
+                 else {
+                        int dx = abs(m->x - b->x);
+                        int dy = abs(m->y - b->y);
+                        int r = b->rad + 2;
+                        if (b->oflaser)
+                               continue;
+                        if ((dx < r) && (dy < r))
+                               if (dx * dx + dy * dy < r * r) {
+                                 m->alive = 0;
+                                 /* one less enemy on this missile -- it probably didn't make it */
+                                 if (missile[m->target].alive)
+                                        missile[m->target].enemies--;
+                               }
+                 }
+               }
+        
+        if (m->alive == 0) {
+               /* we just died */
+               XDrawLine(dpy, window, erase_gc,
+                                 m->x, m->y, x, y);
+               Explode(m->x, m->y, kBoomRad, m->color, 1);
+        }
+  }
+}
+
+static void LoopBooms(Display *dpy, Window window, Colormap cmap, int xlim, int ylim)
+{
+  int i;
+  for (i = 0; i < kMaxBooms; i++) {
+        Boom *m = &boom[i];
+        if (!m->alive)
+               continue;
+        
+        if (loop & 1)
+               if (m->outgoing) {
+                 m->rad++;
+                 if (m->rad >= m->max)
+                        m->outgoing = 0;
+                 XSetLineAttributes(dpy, draw_gc, 1, 0,0,0);
+                 XSetForeground (dpy, draw_gc, m->color.pixel);
+                 XDrawArc(dpy, window, draw_gc, m->x - m->rad, m->y - m->rad, m->rad * 2, m->rad * 2, 0, 360 * 64);
+               }
+               else {
+                 XSetLineAttributes(dpy, erase_gc, 1, 0,0,0);
+                 XDrawArc(dpy, window, erase_gc, m->x - m->rad, m->y - m->rad, m->rad * 2, m->rad * 2, 0, 360 * 64);
+                 m->rad--;
+                 if (m->rad <= 0)
+                        m->alive = 0;
+               }
+  }
+}
+
+int level = 0, levMissiles, levFreq;
+
+/* after they die, let's change a few things */
+static void Improve(void)
+{
+  if (smart)
+        return;
+  if (level > 20)
+        return;  /* no need, really */
+  aim -= 4;
+  if (level <= 2) aim -= 8;
+  if (level <= 5) aim -= 6;
+  if (gamez < 3)
+        aim -= 10;
+  carefulpersen += 6;
+  choosypersen += 4;
+  if (level <= 5) choosypersen += 3;
+  econpersen += 4;
+  lrate -= 2;
+  if (startlrate < kMinRate) {
+        if (lrate < startlrate)
+               lrate = startlrate;
+  }
+  else {
+        if (lrate < kMinRate)
+               lrate = kMinRate;
+  }
+  if (level <= 5) econpersen += 3;
+  if (aim < 1) aim = 1;
+  if (choosypersen > 100) choosypersen = 100;
+  if (carefulpersen > 100) carefulpersen = 100;
+  if (econpersen > 100) econpersen = 100;
+}
+
+static void NewLevel(Display *dpy, Window window, Colormap cmap, int xlim, int ylim)
+{
+  char buf[32];
+  int width, i, sumlive = 0;
+  int liv[kNumCities];
+  int freecity = 0;
+
+  if (level == 0) {
+        level++;
+        goto END_LEVEL;
+  }
+
+  /* check for a free city */
+  if (score >= nextBonus) {
+        numBonus++;
+        nextBonus += kFirstBonus * numBonus;
+        freecity = 1;
+  }
+
+  for (i=0;i<kNumCities;i++) {
+        if (bround)
+               city[i].alive = blive[i];
+        liv[i] = city[i].alive;
+        sumlive += liv[i];
+        if (!bround)
+               city[i].alive = 0;
+  }
+
+  /* print out screen */
+  XFillRectangle(dpy, window, erase_gc,
+                                 0, 0, xlim, ylim);
+  if (bround)
+        sprintf(buf, "Bonus Round Over");
+  else {
+        if (sumlive || freecity)
+               sprintf(buf, "Level %d Cleared", level);
+        else
+               sprintf(buf, "GAME OVER");
+  }
+  if (level > 0) {
+        width = XTextWidth(font, buf, strlen(buf));
+        XDrawString(dpy, window, level_gc, xlim / 2 - width / 2, ylim / 2 - font_height(font) / 2,
+                                        buf, strlen(buf));
+        XSync(dpy, False);
+         screenhack_handle_events(dpy);
+        sleep(1);
+  }
+
+  if (!bround) {
+        if (sumlive || freecity) {
+               int sumwidth;
+               /* draw live cities */
+               XFillRectangle(dpy, window, erase_gc,
+                                                       0, ylim - 100, xlim, 100);
+
+               sprintf(buf, "X %ld", level * 100L);
+               /* how much they get */
+               sumwidth = XTextWidth(font, buf, strlen(buf));
+               /* add width of city */
+               sumwidth += 60;
+               /* add spacer */
+               sumwidth += 40;
+               DrawCity(dpy, window, cmap, xlim / 2 - sumwidth / 2 + 30, ylim * 0.70, city[0].color);
+               XDrawString(dpy, window, level_gc, xlim / 2 - sumwidth / 2 + 40 + 60, ylim * 0.7, buf, strlen(buf));
+               for (i=0;i<kNumCities;i++) {
+                 if (liv[i]) {
+                        city[i].alive = 1;
+                        AddScore(dpy, window, cmap, xlim, ylim, 100 * level);
+                        DrawCities(dpy, window, cmap, xlim, ylim);
+                        XSync(dpy, False);
+                         screenhack_handle_events(dpy);
+                        usleep(kCityPause);
+                 }
+               }
+        }
+        else {
+               /* we're dead */
+                screenhack_handle_events(dpy);
+               sleep(3);
+                screenhack_handle_events(dpy);
+               /* start new */
+               gamez++;
+               Improve();
+               for (i=0;i<kNumCities;i++)
+                 city[i].alive = 1;
+               level = 0;
+               loop = 1;
+               score = 0;
+               nextBonus = kFirstBonus;
+               numBonus = 0;
+               DrawCities(dpy, window, cmap, xlim, ylim);
+        }
+  }
+
+  /* do free city part */
+  if (freecity && sumlive < 5) {
+        int ncnt = random() % (5 - sumlive) + 1;
+        for (i=0;i<kNumCities;i++)
+               if (!city[i].alive)
+                 if (!--ncnt)
+                        city[i].alive = 1;
+        strcpy(buf, "Bonus City");
+        width = XTextWidth(font, buf, strlen(buf));
+        XDrawString(dpy, window, level_gc, xlim / 2 - width / 2, ylim / 4, buf, strlen(buf));
+        DrawCities(dpy, window, cmap, xlim, ylim);
+        XSync(dpy, False);
+         screenhack_handle_events(dpy);
+        sleep(1);
+  }
+
+  XFillRectangle(dpy, window, erase_gc,
+                                         0, 0, xlim, ylim - 100);
+  
+  if (!bround)
+        level++;
+  if (level == 1) {
+        nextBonus = kFirstBonus;
+  }
+
+  if (level > 3 && (level % 5 == 1)) {
+        if (bround) {
+               bround = 0;
+               DrawCities(dpy, window, cmap, xlim, ylim);
+        }
+        else {
+               /* bonus round */
+               bround = 1;
+               levMissiles = 20 + level * 10;
+               levFreq = 10;
+               for (i=0;i<kNumCities;i++)
+                 blive[i] = city[i].alive;
+               sprintf(buf, "Bonus Round");
+               width = XTextWidth(font, buf, strlen(buf));
+               XDrawString(dpy, window, level_gc, xlim / 2 - width / 2, ylim / 2 - font_height(font) / 2, buf, strlen(buf));
+               XSync(dpy, False);
+                screenhack_handle_events(dpy);
+               sleep(1);
+               XFillRectangle(dpy, window, erase_gc,
+                                                       0, 0, xlim, ylim - 100);
+        }
+  }
+
+ END_LEVEL: ;
+
+  if (!bround) {
+        levMissiles = 5 + level * 3;
+        if (level > 5)
+               levMissiles += level * 5;
+        /*  levMissiles = 2; */
+        levFreq = 120 - level * 5;
+        if (levFreq < 30)
+               levFreq = 30;
+  }
+
+  /* ready to fire */
+  lastLaser = 0;
+}
+
+static void penetrate(Display *dpy, Window window, Colormap cmap)
+{
+  XWindowAttributes xgwa;
+  static int xlim, ylim;
+
+  XGetWindowAttributes(dpy, window, &xgwa);
+  xlim = xgwa.width;
+  ylim = xgwa.height;
+
+  /* see if just started */
+  if (loop == 0) {
+        if (smart) {
+               choosypersen = econpersen = carefulpersen = 100;
+               lrate = kMinRate; aim = 1;
+        }
+        NewLevel(dpy, window, cmap, xlim, ylim);
+        DrawScore(dpy, window, cmap, xlim, ylim);
+  }
+
+  loop++;
+
+  if (levMissiles == 0) {
+        /* see if anything's still on the screen, to know when to end level */
+        int i;
+        for (i=0;i<kMaxMissiles;i++)
+               if (missile[i].alive)
+                 goto END_CHECK;
+        for (i=0;i<kMaxBooms;i++)
+               if (boom[i].alive)
+                 goto END_CHECK;
+        for (i=0;i<kMaxLasers;i++)
+               if (laser[i].alive)
+                 goto END_CHECK;
+        /* okay, nothing's alive, start end of level countdown */
+         screenhack_handle_events(dpy);
+        sleep(kLevelPause);
+        NewLevel(dpy, window, cmap, xlim, ylim);
+        return;
+  END_CHECK: ;
+  }
+  else if ((random() % levFreq) == 0) {
+        launch(xlim, ylim, dpy, cmap, -1);
+        levMissiles--;
+  }
+
+  if (loop - lastLaser >= lrate) {
+        if (fire(xlim, ylim, dpy, window, cmap))
+               lastLaser = loop;
+  }
+
+  XSync(dpy, False);
+  screenhack_handle_events(dpy);
+  if (kSleepTime)
+        usleep(kSleepTime);
+
+  if ((loop & 7) == 0)
+        DrawCities(dpy, window, cmap, xlim, ylim);
+  LoopMissiles(dpy, window, cmap, xlim, ylim);
+  LoopLasers(dpy, window, cmap, xlim, ylim);
+  LoopBooms(dpy, window, cmap, xlim, ylim);
+}
+
+char *progclass = "Penetrate";
+
+char *defaults [] = {
+  ".background:        black",
+  ".foreground:        white",
+  "*bgrowth:   5",
+  "*lrate:     80",
+  "*geometry:  800x500",
+  0
+};
+
+XrmOptionDescRec options [] = {
+  { "-bgrowth",                ".bgrowth",     XrmoptionSepArg, 0 },
+  { "-lrate",          ".lrate",       XrmoptionSepArg, 0 },
+       {"-smart", ".smart", XrmoptionIsArg,0},
+  { 0, 0, 0, 0 }
+};
+
+void
+screenhack (Display *dpy, Window window)
+{
+  Colormap cmap = init_penetrate(dpy, window);
+  while (1)
+    penetrate(dpy, window, cmap);
+}
diff --git a/hacks/penrose.c b/hacks/penrose.c
new file mode 100644 (file)
index 0000000..a8af2e5
--- /dev/null
@@ -0,0 +1,1291 @@
+/* -*- Mode: C; tab-width: 4 -*-
+ * penrose --- quasiperiodic tilings.
+ */
+
+/*  As reported in News of the Weird:
+
+         In April, Sir Roger Penrose, a British math professor who has worked
+         with Stephen Hawking on such topics as relativity, black holes, and
+         whether time has a beginning, filed a copyright-infringement lawsuit
+         against the Kimberly-Clark Corporation, which Penrose said copied a
+         pattern he created (a pattern demonstrating that "a nonrepeating
+         pattern could exist in nature") for its Kleenex quilted toilet paper.
+         Penrose said he doesn't like litigation but, "When it comes to the
+         population of Great Britain being invited by a multinational to wipe
+         their bottoms on what appears to be the work of a Knight of the
+         Realm, then a last stand must be taken."
+
+                                NOTW #491, 4-jul-1997, by Chuck Shepherd.
+                                http://www.nine.org/notw/notw.html
+ */
+
+
+#if !defined( lint ) && !defined( SABER )
+static const char sccsid[] = "@(#)penrose.c    4.00 97/01/01 xlockmore";
+#endif
+
+/* Copyright (c) 1996 by Timo Korvola <tkorvola@dopey.hut.fi>
+ *
+ * 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.
+ *
+ * This file is provided AS IS with no warranties of any kind.  The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof.  In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * Revision History:
+ * 10-May-97: jwz@jwz.org: turned into a standalone program.
+ * 09-Sep-96: Written.  */
+
+/*-
+Be careful, this probably still has a few bugs (many of which may only
+appear with a very low probability).  These are seen with -verbose .
+If one of these are hit penrose will reinitialize.
+*/
+
+/*-
+ * See Onoda, Steinhardt, DiVincenzo and Socolar in
+ * Phys. Rev. Lett. 60, #25, 1988 or
+ * Strandburg in Computers in Physics, Sep/Oct 1991.
+ *
+ * This implementation uses the simpler version of the growth
+ * algorithm, i.e., if there are no forced vertices, a randomly chosen
+ * tile is added to a randomly chosen vertex (no preference for those
+ * 108 degree angles).
+ *
+ * There are two essential differences to the algorithm presented in
+ * the literature: First, we do not allow the tiling to enclose an
+ * untiled area.  Whenever this is in danger of happening, we just
+ * do not add the tile, hoping for a better random choice the next
+ * time.  Second, when choosing a vertex randomly, we will take
+ * one that lies withing the viewport if available.  If this seems to
+ * cause enclosures in the forced rule case, we will allow invisible
+ * vertices to be chosen.
+ *
+ * Tiling is restarted whenever one of the following happens: there
+ * are no incomplete vertices within the viewport or the tiling has
+ * extended a window's length beyond the edge of the window
+ * horizontally or vertically or forced rule choice has failed 100
+ * times due to areas about to become enclosed.
+ *
+ */
+
+#ifdef STANDALONE
+# define PROGCLASS                                     "Penrose"
+# define HACK_INIT                                     init_penrose
+# define HACK_DRAW                                     draw_penrose
+# define penrose_opts                          xlockmore_opts
+# define DEFAULTS      "*delay:                10000 \n"                       \
+                                       "*size:                 40    \n"                       \
+                                       "*ncolors:              64   \n"
+# include "xlockmore.h"                                /* from the xscreensaver distribution */
+#else  /* !STANDALONE */
+# include "xlock.h"                                    /* from the xlockmore distribution */
+#endif /* !STANDALONE */
+
+
+/*-
+ * Annoyingly the ANSI C library people have reserved all identifiers
+ * ending with _t for future use.  Hence we use _c as a suffix for
+ * typedefs (c for class, although this is not C++).
+ */
+
+#define MINSIZE 5
+
+/*-
+ * In theory one could fit 10 tiles to a single vertex.  However, the
+ * vertex rules only allow at most seven tiles to meet at a vertex.
+ */
+
+#define MAX_TILES_PER_VERTEX 7
+#define N_VERTEX_RULES 8
+#define ALLOC_NODE( type) ((type *)malloc( sizeof( type)))
+#define DEF_AMMANN  "False"
+
+static Bool ammann;
+
+/* How long in seconds should we wait before starting a new tiling? */
+static long redo_delay = 3;
+static long redo_delay_usec;
+
+static XrmOptionDescRec opts[] =
+{
+       {"-ammann", ".penrose.ammann", XrmoptionNoArg, (caddr_t) "on"},
+       {"+ammann", ".penrose.ammann", XrmoptionNoArg, (caddr_t) "off"},
+       {"-redoDelay", ".penrose.redoDelay", XrmoptionSepArg, NULL}
+};
+static argtype vars[] =
+{
+       {(caddr_t *) & ammann, "ammann", "Ammann", DEF_AMMANN, t_Bool},
+       {(caddr_t *) & redo_delay, "redoDelay", "RedoDelay", "3", t_Int}
+};
+static OptionStruct desc[] =
+{
+       {"-/+ammann", "turn on/off Ammann lines"},
+       {"-redoDelay", "delay between new tilings"}
+};
+
+ModeSpecOpt penrose_opts = { 3, opts, 2, vars, desc };
+
+
+/*-
+ * These are used to specify directions.  They can also be used in bit
+ * masks to specify a combination of directions.
+ */
+#define S_LEFT 1
+#define S_RIGHT 2
+
+
+/*-
+ * We do not actually maintain objects corresponding to the tiles since
+ * we do not really need them and they would only consume memory and
+ * cause additional bookkeeping.  Instead we only have vertices, and
+ * each vertex lists the type of each adjacent tile as well as the
+ * position of the vertex on the tile (hereafter refered to as
+ * "corner").  These positions are numbered in counterclockwise order
+ * so that 0 is where two double arrows meet (see one of the
+ * articles).  The tile type and vertex number are stored in a single
+ * integer (we use char, and even most of it remains unused).
+ *
+ * The primary use of tile objects would be draw traversal, but we do
+ * not currently do redraws at all (we just start over).
+ */
+#define VT_CORNER_MASK 0x3
+#define VT_TYPE_MASK 0x4
+#define VT_THIN 0
+#define VT_THICK 0x4
+#define VT_BITS 3
+#define VT_TOTAL_MASK 0x7
+
+typedef unsigned char vertex_type_c;
+
+/*-
+ * These allow one to compute the types of the other corners of the tile.  If
+ * you are standing at a vertex of type vt looking towards the middle of the
+ * tile, VT_LEFT( vt) is the vertex on your left etc.
+ */
+#define VT_LEFT( vt) ((((vt) - 1) & VT_CORNER_MASK) | (((vt) & VT_TYPE_MASK)))
+#define VT_RIGHT( vt) ((((vt) + 1) & VT_CORNER_MASK) | (((vt) & VT_TYPE_MASK)))
+#define VT_FAR( vt) ((vt) ^ 2)
+
+
+/*-
+ * Since we do not do redraws, we only store the vertices we need.  These are
+ * the ones with still some empty space around them for the growth algorithm
+ * to fill.
+ *
+ * Here we use a doubly chained ring-like structure as vertices often need
+ * to be removed or inserted (they are kept in geometrical order 
+ * circling the tiled area counterclockwise).  The ring is refered to by
+ * a pointer to one more or less random node.  When deleting nodes one
+ * must make sure that this pointer continues to refer to a valid
+ * node.  A vertex count is maintained to make it easier to pick
+ * vertices randomly.
+ */
+typedef struct forced_node forced_node_c;
+
+typedef struct fringe_node {
+       struct fringe_node *prev;
+       struct fringe_node *next;
+       /* These are numbered counterclockwise.  The gap, if any, lies
+          between the last and first tiles.  */
+       vertex_type_c tiles[MAX_TILES_PER_VERTEX];
+       int         n_tiles;
+       /* A bit mask used to indicate vertex rules that are still applicable for
+          completing this vertex.  Initialize this to (1 << N_VERTEX_RULES) - 1,
+          i.e., all ones, and the rule matching functions will automatically mask
+          out rules that no longer match. */
+       unsigned char rule_mask;
+       /* If the vertex is on the forced vertex list, this points to the
+          pointer to the appropriate node in the list.  To remove the
+          vertex from the list just set *list_ptr to the next node,
+          deallocate and decrement node count. */
+       struct forced_node **list_ptr;
+       /* Screen coordinates. */
+       XPoint      loc;
+       /* We also keep track of 5D coordinates to avoid rounding errors.
+          These are in units of edge length. */
+       int         fived[5];
+       /* This is used to quickly check if a vertex is visible. */
+       unsigned char off_screen;
+} fringe_node_c;
+
+typedef struct {
+       fringe_node_c *nodes;
+       /* This does not count off-screen nodes. */
+       int         n_nodes;
+} fringe_c;
+
+
+/*-
+ * The forced vertex pool contains vertices where at least one
+ * side of the tiled region can only be extended in one way.  Note
+ * that this does not necessarily mean that there would only be one
+ * applicable rule.  forced_sides are specified using S_LEFT and
+ * S_RIGHT as if looking at the untiled region from the vertex.
+ */
+struct forced_node {
+       fringe_node_c *vertex;
+       unsigned    forced_sides;
+       struct forced_node *next;
+};
+
+typedef struct {
+       forced_node_c *first;
+       int         n_nodes, n_visible;
+} forced_pool_c;
+
+
+/* This is the data related to the tiling of one screen. */
+typedef struct {
+       int         width, height;
+       XPoint      origin;
+       int         edge_length;
+       fringe_c    fringe;
+       forced_pool_c forced;
+       int         done, failures;
+       int         thick_color, thin_color;
+} tiling_c;
+
+static tiling_c *tilings;      /* = {0} */
+
+
+/* The tiles are listed in counterclockwise order. */
+typedef struct {
+       vertex_type_c tiles[MAX_TILES_PER_VERTEX];
+       int         n_tiles;
+} vertex_rule_c;
+
+static vertex_rule_c vertex_rules[N_VERTEX_RULES] =
+{
+       {
+  {VT_THICK | 2, VT_THICK | 2, VT_THICK | 2, VT_THICK | 2, VT_THICK | 2}, 5},
+       {
+  {VT_THICK | 0, VT_THICK | 0, VT_THICK | 0, VT_THICK | 0, VT_THICK | 0}, 5},
+       {
+               {VT_THICK | 0, VT_THICK | 0, VT_THICK | 0, VT_THIN | 0}, 4},
+       {
+        {VT_THICK | 2, VT_THICK | 2, VT_THIN | 1, VT_THIN | 3, VT_THICK | 2,
+         VT_THIN | 1, VT_THIN | 3}, 7},
+       {
+               {VT_THICK | 2, VT_THICK | 2, VT_THICK | 2, VT_THICK | 2,
+                VT_THIN | 1, VT_THIN | 3}, 6},
+       {
+               {VT_THICK | 1, VT_THICK | 3, VT_THIN | 2}, 3},
+       {
+               {VT_THICK | 0, VT_THIN | 0, VT_THIN | 0}, 3},
+       {
+     {VT_THICK | 2, VT_THIN | 1, VT_THICK | 3, VT_THICK | 1, VT_THIN | 3}, 5}
+};
+
+
+/* Match information returned by match_rules. */
+typedef struct {
+       int         rule;
+       int         pos;
+} rule_match_c;
+
+
+/* Occasionally floating point coordinates are needed. */
+typedef struct {
+       float       x, y;
+} fcoord_c;
+
+
+/* All angles are measured in multiples of 36 degrees. */
+typedef int angle_c;
+
+static angle_c vtype_angles[] =
+{4, 1, 4, 1, 2, 3, 2, 3};
+
+#define vtype_angle( v) (vtype_angles[ v])
+
+
+/* Direction angle of an edge. */
+static      angle_c
+vertex_dir(ModeInfo * mi, fringe_node_c * vertex, unsigned side)
+{
+       tiling_c   *tp = &tilings[MI_SCREEN(mi)];
+       fringe_node_c *v2 =
+       (side == S_LEFT ? vertex->next : vertex->prev);
+       register int i;
+
+       for (i = 0; i < 5; i++)
+               switch (v2->fived[i] - vertex->fived[i]) {
+                       case 1:
+                               return 2 * i;
+                       case -1:
+                               return (2 * i + 5) % 10;
+               }
+       tp->done = True;
+       if (MI_WIN_IS_VERBOSE(mi)) {
+               (void) fprintf(stderr,
+                  "Weirdness in vertex_dir (this has been reported)\n");
+               for (i = 0; i < 5; i++)
+                       (void) fprintf(stderr, "v2->fived[%d]=%d, vertex->fived[%d]=%d\n",
+                                     i, v2->fived[i], i, vertex->fived[i]);
+       }
+       MI_PAUSE(mi) = redo_delay_usec;
+       return 0;
+}
+
+
+/* Move one step to a given direction. */
+static void
+add_unit_vec(angle_c dir, int *fived)
+{
+       static int  dir2i[] =
+       {0, 3, 1, 4, 2};
+
+       while (dir < 0)
+               dir += 10;
+       fived[dir2i[dir % 5]] += (dir % 2 ? -1 : 1);
+}
+
+
+/* For comparing coordinates. */
+#define fived_equal( f1, f2) (!memcmp( (f1), (f2), 5 * sizeof( int)))
+
+
+/*-
+ * This computes screen coordinates from 5D representation.  Note that X
+ * uses left-handed coordinates (y increases downwards).
+ */
+static      XPoint
+fived_to_loc(int fived[], tiling_c * tp)
+{
+       static fcoord_c fived_table[5] =
+       {
+               {.0, .0}};
+       float       fifth = 8 * atan(1.) / 5;
+       register int i;
+       register float r;
+       register fcoord_c offset =
+       {.0, .0};
+       XPoint      pt = tp->origin;
+
+       if (fived_table[0].x == .0)
+               for (i = 0; i < 5; i++) {
+                       fived_table[i].x = cos(fifth * i);
+                       fived_table[i].y = sin(fifth * i);
+               }
+       for (i = 0; i < 5; i++) {
+               r = fived[i] * tp->edge_length;
+               offset.x += r * fived_table[i].x;
+               offset.y -= r * fived_table[i].y;
+       }
+       pt.x += (int) (offset.x + .5);
+       pt.y += (int) (offset.y + .5);
+       return pt;
+}
+
+
+/* Mop up dynamic data for one screen. */
+static void
+release_screen(tiling_c * tp)
+{
+       register fringe_node_c *fp1, *fp2;
+       register forced_node_c *lp1, *lp2;
+
+       if (tp->fringe.nodes == 0)
+               return;
+       fp1 = tp->fringe.nodes;
+       do {
+               fp2 = fp1;
+               fp1 = fp1->next;
+               (void) free((char *) fp2);
+       } while (fp1 != tp->fringe.nodes);
+       tp->fringe.nodes = 0;
+       for (lp1 = tp->forced.first; lp1 != 0;) {
+               lp2 = lp1;
+               lp1 = lp1->next;
+               (void) free((char *) lp2);
+       }
+       tp->forced.first = 0;
+}
+
+
+/* Called to init the mode. */
+void
+init_penrose(ModeInfo * mi)
+{
+       tiling_c   *tp;
+       fringe_node_c *fp;
+       int         i, size;
+
+       redo_delay_usec = redo_delay * 1000000;
+
+       if (tilings == NULL) {
+               if ((tilings = (tiling_c *) calloc(MI_NUM_SCREENS(mi),
+                                                sizeof (tiling_c))) == NULL)
+                       return;
+       }
+       tp = &tilings[MI_SCREEN(mi)];
+       tp->done = False;
+       tp->failures = 0;
+       tp->width = MI_WIN_WIDTH(mi);
+       tp->height = MI_WIN_HEIGHT(mi);
+       if (MI_NPIXELS(mi) > 2) {
+               tp->thick_color = NRAND(MI_NPIXELS(mi));
+               /* Insure good contrast */
+               tp->thin_color = (NRAND(2 * MI_NPIXELS(mi) / 3) + tp->thick_color +
+                                 MI_NPIXELS(mi) / 6) % MI_NPIXELS(mi);
+       }
+       size = MI_SIZE(mi);
+       if (size < -MINSIZE)
+               tp->edge_length = NRAND(MIN(-size, MAX(MINSIZE,
+                  MIN(tp->width, tp->height) / 2)) - MINSIZE + 1) + MINSIZE;
+       else if (size < MINSIZE) {
+               if (!size)
+                       tp->edge_length = MAX(MINSIZE, MIN(tp->width, tp->height) / 2);
+               else
+                       tp->edge_length = MINSIZE;
+       } else
+               tp->edge_length = MIN(size, MAX(MINSIZE,
+                                           MIN(tp->width, tp->height) / 2));
+       tp->origin.x = (tp->width / 2 + NRAND(tp->width)) / 2;
+       tp->origin.y = (tp->height / 2 + NRAND(tp->height)) / 2;
+       tp->fringe.n_nodes = 2;
+       if (tp->fringe.nodes != 0)
+               release_screen(tp);
+       if (tp->fringe.nodes != 0 || tp->forced.first != 0) {
+               if (MI_WIN_IS_VERBOSE(mi)) {
+                       (void) fprintf(stderr, "Weirdness in init_penrose()\n");
+                       (void) fprintf(stderr, "tp->fringe.nodes = 0 && tp->forced.first = 0\n");
+               }
+               release_screen(tp);     /* Try again */
+               tp->done = True;
+       }
+       tp->forced.n_nodes = tp->forced.n_visible = 0;
+       fp = tp->fringe.nodes = ALLOC_NODE(fringe_node_c);
+       if (fp == 0) {
+               if (MI_WIN_IS_VERBOSE(mi)) {
+                       (void) fprintf(stderr, "Weirdness in init_penrose()\n");
+                       (void) fprintf(stderr, "fp = 0\n");
+               }
+               fp = tp->fringe.nodes = ALLOC_NODE(fringe_node_c);
+               tp->done = True;
+       }
+       /* First vertex. */
+       fp->rule_mask = (1 << N_VERTEX_RULES) - 1;
+       fp->list_ptr = 0;
+       fp->prev = fp->next = ALLOC_NODE(fringe_node_c);
+       if (fp->next == 0) {
+               if (MI_WIN_IS_VERBOSE(mi)) {
+                       (void) fprintf(stderr, "Weirdness in init_penrose()\n");
+                       (void) fprintf(stderr, "fp->next = 0\n");
+               }
+               fp->prev = fp->next = ALLOC_NODE(fringe_node_c);
+               tp->done = True;
+       }
+       fp->n_tiles = 0;
+       fp->loc = tp->origin;
+       fp->off_screen = False;
+       for (i = 0; i < 5; i++)
+               fp->fived[i] = 0;
+
+       /* Second vertex. */
+       *(fp->next) = *fp;
+       fp->next->prev = fp->next->next = fp;
+       fp = fp->next;
+       i = NRAND(5);
+       fp->fived[i] = 2 * NRAND(2) - 1;
+       fp->loc = fived_to_loc(fp->fived, tp);
+       /* That's it!  We have created our first edge. */
+}
+
+/*-
+ * This attempts to match the configuration of vertex with the vertex
+ * rules.   The return value is a total match count.  If matches is
+ * non-null, it will be used to store information about the matches
+ * and must be large enough to contain it.  To play it absolutely
+ * safe, allocate room for MAX_TILES_PER_VERTEX * N_VERTEX_RULES
+ * entries when searching all matches.   The rule mask of vertex will
+ * be applied and rules masked out will not be searched.  Only strict
+ * subsequences match.  If first_only is true, the search stops when
+ * the first match is found.  Otherwise all matches will be found and
+ * the rule_mask of vertex will be updated, which also happens in
+ * single-match mode if no match is found.
+ */
+static int
+match_rules(fringe_node_c * vertex, rule_match_c * matches, int first_only)
+{
+       /* I will assume that I can fit all the relevant bits in vertex->tiles
+          into one unsigned long.  With 3 bits per element and at most 7
+          elements this means 21 bits, which should leave plenty of room.
+          After packing the bits the rest is just integer comparisons and
+          some bit shuffling.  This is essentially Rabin-Karp without
+          congruence arithmetic. */
+       register int i, j;
+       int         hits = 0, good_rules[N_VERTEX_RULES], n_good = 0;
+       unsigned long
+                   vertex_hash = 0, lower_bits_mask = ~(VT_TOTAL_MASK << VT_BITS * (vertex->n_tiles - 1));
+       unsigned    new_rule_mask = 0;
+
+       for (i = 0; i < N_VERTEX_RULES; i++)
+               if (vertex->n_tiles >= vertex_rules[i].n_tiles)
+                       vertex->rule_mask &= ~(1 << i);
+               else if (vertex->rule_mask & 1 << i)
+                       good_rules[n_good++] = i;
+       for (i = 0; i < vertex->n_tiles; i++)
+               vertex_hash |= (unsigned long) vertex->tiles[i] << (VT_BITS * i);
+
+       for (j = 0; j < n_good; j++) {
+               unsigned long rule_hash = 0;
+               vertex_rule_c *vr = vertex_rules + good_rules[j];
+
+               for (i = 0; i < vertex->n_tiles; i++)
+                       rule_hash |= (unsigned long) vr->tiles[i] << (VT_BITS * i);
+               if (rule_hash == vertex_hash) {
+                       if (matches != 0) {
+                               matches[hits].rule = good_rules[j];
+                               matches[hits].pos = 0;
+                       }
+                       hits++;
+                       if (first_only)
+                               return hits;
+                       else
+                               new_rule_mask |= 1 << good_rules[j];
+               }
+               for (i = vr->n_tiles - 1; i > 0; i--) {
+                       rule_hash = vr->tiles[i] | (rule_hash & lower_bits_mask) << VT_BITS;
+                       if (vertex_hash == rule_hash) {
+                               if (matches != 0) {
+                                       matches[hits].rule = good_rules[j];
+                                       matches[hits].pos = i;
+                               }
+                               hits++;
+                               if (first_only)
+                                       return hits;
+                               else
+                                       new_rule_mask |= 1 << good_rules[j];
+                       }
+               }
+       }
+       vertex->rule_mask = new_rule_mask;
+       return hits;
+}
+
+
+/*-
+ * find_completions finds the possible ways to add a tile to a vertex.
+ * The return values is the number of such possibilities.  You must
+ * first call match_rules to produce matches and n_matches.  sides
+ * specifies which side of the vertex to extend and can be S_LEFT or
+ * S_RIGHT.  If results is non-null, it should point to an array large
+ * enough to contain the results, which will be stored there.
+ * MAX_COMPL elements will always suffice.  If first_only is true we
+ * stop as soon as we find one possibility (NOT USED).
+ */
+#define MAX_COMPL 2
+
+static int
+find_completions(fringe_node_c * vertex, rule_match_c * matches, int n_matches,
+              unsigned side, vertex_type_c * results /*, int first_only */ )
+{
+       int         n_res = 0, cont;
+       register int i, j;
+       vertex_type_c buf[MAX_COMPL];
+
+       if (results == 0)
+               results = buf;
+       if (n_matches <= 0)
+               return 0;
+       for (i = 0; i < n_matches; i++) {
+               vertex_rule_c *rule = vertex_rules + matches[i].rule;
+               int         pos = (matches[i].pos
+                  + (side == S_RIGHT ? vertex->n_tiles : rule->n_tiles - 1))
+               % rule->n_tiles;
+               vertex_type_c vtype = rule->tiles[pos];
+
+               cont = 1;
+               for (j = 0; j < n_res; j++)
+                       if (vtype == results[j]) {
+                               cont = 0;
+                               break;
+                       }
+               if (cont)
+                       results[n_res++] = vtype;
+       }
+       return n_res;
+}
+
+
+/*-
+ * Draw a tile on the display.  Vertices must be given in a
+ * counterclockwise order.  vtype is the vertex type of v1 (and thus
+ * also gives the tile type).
+ */
+static void
+draw_tile(fringe_node_c * v1, fringe_node_c * v2,
+         fringe_node_c * v3, fringe_node_c * v4,
+         vertex_type_c vtype, ModeInfo * mi)
+{
+       Display    *display = MI_DISPLAY(mi);
+       Window      window = MI_WINDOW(mi);
+       GC          gc = MI_GC(mi);
+       tiling_c   *tp = &tilings[MI_SCREEN(mi)];
+       XPoint      pts[5];
+       vertex_type_c corner = vtype & VT_CORNER_MASK;
+
+       if (v1->off_screen && v2->off_screen && v3->off_screen && v4->off_screen)
+               return;
+       pts[corner] = v1->loc;
+       pts[VT_RIGHT(corner)] = v2->loc;
+       pts[VT_FAR(corner)] = v3->loc;
+       pts[VT_LEFT(corner)] = v4->loc;
+       pts[4] = pts[0];
+       if (MI_NPIXELS(mi) > 2) {
+               if ((vtype & VT_TYPE_MASK) == VT_THICK)
+                       XSetForeground(display, gc, MI_PIXEL(mi, tp->thick_color));
+               else
+                       XSetForeground(display, gc, MI_PIXEL(mi, tp->thin_color));
+       } else
+               XSetForeground(display, gc, MI_WIN_WHITE_PIXEL(mi));
+       XFillPolygon(display, window, gc, pts, 4, Convex, CoordModeOrigin);
+       XSetForeground(display, gc, MI_WIN_BLACK_PIXEL(mi));
+       XDrawLines(display, window, gc, pts, 5, CoordModeOrigin);
+
+       if (ammann) {
+               /* Draw some Ammann lines for debugging purposes.  This will probably
+                  fail miserably on a b&w display. */
+
+               if ((vtype & VT_TYPE_MASK) == VT_THICK) {
+                       static float r = .0;
+
+                       if (r == .0) {
+                               float       pi10 = 2 * atan(1.) / 5;
+
+                               r = 1 - sin(pi10) / (2 * sin(3 * pi10));
+                       }
+                       if (MI_NPIXELS(mi) > 2)
+                               XSetForeground(display, gc, MI_PIXEL(mi, tp->thin_color));
+                       else {
+                               XSetForeground(display, gc, MI_WIN_WHITE_PIXEL(mi));
+                               XSetLineAttributes(display, gc, 1, LineOnOffDash, CapNotLast, JoinMiter);
+                       }
+                       XDrawLine(display, window, gc,
+                             (int) (r * pts[3].x + (1 - r) * pts[0].x + .5),
+                             (int) (r * pts[3].y + (1 - r) * pts[0].y + .5),
+                             (int) (r * pts[1].x + (1 - r) * pts[0].x + .5),
+                            (int) (r * pts[1].y + (1 - r) * pts[0].y + .5));
+                       if (MI_NPIXELS(mi) <= 2)
+                               XSetLineAttributes(display, gc, 1, LineSolid, CapNotLast, JoinMiter);
+               } else {
+                       if (MI_NPIXELS(mi) > 2)
+                               XSetForeground(display, gc, MI_PIXEL(mi, tp->thick_color));
+                       else {
+                               XSetForeground(display, gc, MI_WIN_WHITE_PIXEL(mi));
+                               XSetLineAttributes(display, gc, 1, LineOnOffDash, CapNotLast, JoinMiter);
+                       }
+                       XDrawLine(display, window, gc,
+                                 (int) ((pts[3].x + pts[2].x) / 2 + .5),
+                                 (int) ((pts[3].y + pts[2].y) / 2 + .5),
+                                 (int) ((pts[1].x + pts[2].x) / 2 + .5),
+                                 (int) ((pts[1].y + pts[2].y) / 2 + .5));
+                       if (MI_NPIXELS(mi) <= 2)
+                               XSetLineAttributes(display, gc, 1, LineSolid, CapNotLast, JoinMiter);
+               }
+       }
+}
+
+/*-
+ * Update the status of this vertex on the forced vertex queue.  If
+ * the vertex has become untileable set tp->done.  This is supposed
+ * to detect dislocations -- never call this routine with a completely
+ * tiled vertex.
+ *
+ * Check for untileable vertices in check_vertex and stop tiling as
+ * soon as one finds one.  I don't know if it is possible to run out
+ * of forced vertices while untileable vertices exist (or will
+ * cavities inevitably appear).  If this can happen, add_random_tile
+ * might get called with an untileable vertex, causing ( n <= 1).
+ * (This is what the tp->done checks for).
+ *
+ * A MI_PAUSE celebrates the dislocation.
+ */
+static void
+check_vertex(ModeInfo * mi, fringe_node_c * vertex, tiling_c * tp)
+{
+       rule_match_c hits[MAX_TILES_PER_VERTEX * N_VERTEX_RULES];
+       int         n_hits = match_rules(vertex, hits, False);
+       unsigned    forced_sides = 0;
+
+       if (vertex->rule_mask == 0) {
+               tp->done = True;
+               if (MI_WIN_IS_VERBOSE(mi)) {
+                       (void) fprintf(stderr, "Dislocation occured!\n");
+               }
+               MI_PAUSE(mi) = redo_delay_usec; /* Should be able to recover */
+       }
+       if (1 == find_completions(vertex, hits, n_hits, S_LEFT, 0 /*, False */ ))
+               forced_sides |= S_LEFT;
+       if (1 == find_completions(vertex, hits, n_hits, S_RIGHT, 0 /*, False */ ))
+               forced_sides |= S_RIGHT;
+       if (forced_sides == 0) {
+               if (vertex->list_ptr != 0) {
+                       forced_node_c *node = *vertex->list_ptr;
+
+                       *vertex->list_ptr = node->next;
+                       if (node->next != 0)
+                               node->next->vertex->list_ptr = vertex->list_ptr;
+                       free(node);
+                       tp->forced.n_nodes--;
+                       if (!vertex->off_screen)
+                               tp->forced.n_visible--;
+                       vertex->list_ptr = 0;
+               }
+       } else {
+               forced_node_c *node;
+
+               if (vertex->list_ptr == 0) {
+                       node = ALLOC_NODE(forced_node_c);
+                       node->vertex = vertex;
+                       node->next = tp->forced.first;
+                       if (tp->forced.first != 0)
+                               tp->forced.first->vertex->list_ptr = &(node->next);
+                       tp->forced.first = node;
+                       vertex->list_ptr = &(tp->forced.first);
+                       tp->forced.n_nodes++;
+                       if (!vertex->off_screen)
+                               tp->forced.n_visible++;
+               } else
+                       node = *vertex->list_ptr;
+               node->forced_sides = forced_sides;
+       }
+}
+
+
+/*-
+ * Delete this vertex.  If the vertex is a member of the forced vertex queue,
+ * also remove that entry.  We assume that the vertex is no longer
+ * connected to the fringe.  Note that tp->fringe.nodes must not point to
+ * the vertex being deleted.
+ */
+static void
+delete_vertex(ModeInfo * mi, fringe_node_c * vertex, tiling_c * tp)
+{
+       if (tp->fringe.nodes == vertex) {
+               tp->done = True;
+               if (MI_WIN_IS_VERBOSE(mi)) {
+                       (void) fprintf(stderr, "Weirdness in delete_penrose()\n");
+                       (void) fprintf(stderr, "tp->fringe.nodes == vertex\n");
+               }
+               MI_PAUSE(mi) = redo_delay_usec;
+       }
+       if (vertex->list_ptr != 0) {
+               forced_node_c *node = *vertex->list_ptr;
+
+               *vertex->list_ptr = node->next;
+               if (node->next != 0)
+                       node->next->vertex->list_ptr = vertex->list_ptr;
+               free(node);
+               tp->forced.n_nodes--;
+               if (!vertex->off_screen)
+                       tp->forced.n_visible--;
+       }
+       if (!vertex->off_screen)
+               tp->fringe.n_nodes--;
+       free(vertex);
+}
+
+
+/* Check whether the addition of a tile of type vtype would completely fill *
+   the space available at vertex. */
+static int
+fills_vertex(ModeInfo * mi, vertex_type_c vtype, fringe_node_c * vertex)
+{
+       return
+               (vertex_dir(mi, vertex, S_LEFT) - vertex_dir(mi, vertex, S_RIGHT)
+                - vtype_angle(vtype)) % 10 == 0;
+}
+
+
+/*-
+ * If you were to add a tile of type vtype to a specified side of
+ * vertex, fringe_changes tells you which other vertices it would
+ * attach to.  The addresses of these vertices will be stored in the
+ * last three arguments.  Null is stored if the corresponding vertex
+ * would need to be allocated.
+ *
+ * The function also analyzes which vertices would be swallowed by the tiling
+ * and thus cut off from the fringe.  The result is returned as a bit pattern.
+ */
+#define FC_BAG 1               /* Total enclosure.  Should never occur. */
+#define FC_NEW_RIGHT 2
+#define FC_NEW_FAR 4
+#define FC_NEW_LEFT 8
+#define FC_NEW_MASK 0xe
+#define FC_CUT_THIS 0x10
+#define FC_CUT_RIGHT 0x20
+#define FC_CUT_FAR 0x40
+#define FC_CUT_LEFT 0x80
+#define FC_CUT_MASK 0xf0
+#define FC_TOTAL_MASK 0xff
+
+static unsigned
+fringe_changes(ModeInfo * mi, fringe_node_c * vertex,
+              unsigned side, vertex_type_c vtype,
+              fringe_node_c ** right, fringe_node_c ** far,
+              fringe_node_c ** left)
+{
+       fringe_node_c *v, *f = NULL;
+       unsigned    result = FC_NEW_FAR;        /* We clear this later if necessary. */
+
+       if (far)
+               *far = 0;
+       if (fills_vertex(mi, vtype, vertex)) {
+               result |= FC_CUT_THIS;
+       } else if (side == S_LEFT) {
+               result |= FC_NEW_RIGHT;
+               if (right)
+                       *right = 0;
+       } else {
+               result |= FC_NEW_LEFT;
+               if (left)
+                       *left = 0;
+       }
+
+       if (!(result & FC_NEW_LEFT)) {
+               v = vertex->next;
+               if (left)
+                       *left = v;
+               if (fills_vertex(mi, VT_LEFT(vtype), v)) {
+                       result = (result & ~FC_NEW_FAR) | FC_CUT_LEFT;
+                       f = v->next;
+                       if (far)
+                               *far = f;
+               }
+       }
+       if (!(result & FC_NEW_RIGHT)) {
+               v = vertex->prev;
+               if (right)
+                       *right = v;
+               if (fills_vertex(mi, VT_RIGHT(vtype), v)) {
+                       result = (result & ~FC_NEW_FAR) | FC_CUT_RIGHT;
+                       f = v->prev;
+                       if (far)
+                               *far = f;
+               }
+       }
+       if (!(result & FC_NEW_FAR)
+           && fills_vertex(mi, VT_FAR(vtype), f)) {
+               result |= FC_CUT_FAR;
+               result &= (~FC_NEW_LEFT & ~FC_NEW_RIGHT);
+               if (right && (result & FC_CUT_LEFT))
+                       *right = f->next;
+               if (left && (result & FC_CUT_RIGHT))
+                       *left = f->prev;
+       }
+       if (((result & FC_CUT_LEFT) && (result & FC_CUT_RIGHT))
+           || ((result & FC_CUT_THIS) && (result & FC_CUT_FAR)))
+               result |= FC_BAG;
+       return result;
+}
+
+
+/* A couple of lesser helper functions for add_tile. */
+static void
+add_vtype(fringe_node_c * vertex, unsigned side, vertex_type_c vtype)
+{
+       if (side == S_RIGHT)
+               vertex->tiles[vertex->n_tiles++] = vtype;
+       else {
+               register int i;
+
+               for (i = vertex->n_tiles; i > 0; i--)
+                       vertex->tiles[i] = vertex->tiles[i - 1];
+               vertex->tiles[0] = vtype;
+               vertex->n_tiles++;
+       }
+}
+
+static fringe_node_c *
+alloc_vertex(ModeInfo * mi, angle_c dir, fringe_node_c * from, tiling_c * tp)
+{
+       fringe_node_c *v = ALLOC_NODE(fringe_node_c);
+
+       if (v == 0) {
+               tp->done = True;
+               if (MI_WIN_IS_VERBOSE(mi)) {
+                       (void) fprintf(stderr, "Weirdness in alloc_vertex()\n");
+                       (void) fprintf(stderr, "v = 0\n");
+               }
+               MI_PAUSE(mi) = redo_delay_usec;
+       }
+       *v = *from;
+       add_unit_vec(dir, v->fived);
+       v->loc = fived_to_loc(v->fived, tp);
+       if (v->loc.x < 0 || v->loc.y < 0
+           || v->loc.x >= tp->width || v->loc.y >= tp->height) {
+               v->off_screen = True;
+               if (v->loc.x < -tp->width || v->loc.y < -tp->height
+                 || v->loc.x >= 2 * tp->width || v->loc.y >= 2 * tp->height)
+                       tp->done = True;
+       } else {
+               v->off_screen = False;
+               tp->fringe.n_nodes++;
+       }
+       v->n_tiles = 0;
+       v->rule_mask = (1 << N_VERTEX_RULES) - 1;
+       v->list_ptr = 0;
+       return v;
+}
+
+/* 
+ * Add a tile described by vtype to the side of vertex.  This must be
+ * allowed by the rules -- we do not check it here.  New vertices are
+ * allocated as necessary.  The fringe and the forced vertex pool are updated.
+ * The new tile is drawn on the display.
+ *
+ * One thing we do check here is whether the new tile causes an untiled
+ * area to become enclosed by the tiling.  If this would happen, the tile
+ * is not added.  The return value is true iff a tile was added.
+ */
+static int
+add_tile(ModeInfo * mi,
+        fringe_node_c * vertex, unsigned side, vertex_type_c vtype)
+{
+       tiling_c   *tp = &tilings[MI_SCREEN(mi)];
+
+       fringe_node_c
+               * left = 0,
+               *right = 0,
+               *far = 0,
+               *node;
+       unsigned    fc = fringe_changes(mi, vertex, side, vtype, &right, &far, &left);
+
+       vertex_type_c
+               ltype = VT_LEFT(vtype),
+               rtype = VT_RIGHT(vtype),
+               ftype = VT_FAR(vtype);
+
+       /* By our conventions vertex->next lies to the left of vertex and
+          vertex->prev to the right. */
+
+       /* This should never occur. */
+       if (fc & FC_BAG) {
+               tp->done = True;
+               if (MI_WIN_IS_VERBOSE(mi)) {
+                       (void) fprintf(stderr, "Weirdness in add_tile()\n");
+                       (void) fprintf(stderr, "fc = %d, FC_BAG = %d\n", fc, FC_BAG);
+               }
+       }
+       if (side == S_LEFT) {
+               if (right == 0)
+                       right = alloc_vertex(mi,
+                                            vertex_dir(mi, vertex, S_LEFT) - vtype_angle(vtype), vertex, tp);
+               if (far == 0)
+                       far = alloc_vertex(mi,
+                                          vertex_dir(mi, left, S_RIGHT) + vtype_angle(ltype), left, tp);
+       } else {
+               if (left == 0)
+                       left = alloc_vertex(mi,
+                                           vertex_dir(mi, vertex, S_RIGHT) + vtype_angle(vtype), vertex, tp);
+               if (far == 0)
+                       far = alloc_vertex(mi,
+                                          vertex_dir(mi, right, S_LEFT) - vtype_angle(rtype), right, tp);
+       }
+
+       /* Having allocated the new vertices, but before joining them with
+          the rest of the fringe, check if vertices with same coordinates
+          already exist.  If any such are found, give up. */
+       node = tp->fringe.nodes;
+       do {
+               if (((fc & FC_NEW_LEFT) && fived_equal(node->fived, left->fived))
+                   || ((fc & FC_NEW_RIGHT) && fived_equal(node->fived, right->fived))
+                   || ((fc & FC_NEW_FAR) && fived_equal(node->fived, far->fived))) {
+                       /* Better luck next time. */
+                       if (fc & FC_NEW_LEFT)
+                               delete_vertex(mi, left, tp);
+                       if (fc & FC_NEW_RIGHT)
+                               delete_vertex(mi, right, tp);
+                       if (fc & FC_NEW_FAR)
+                               delete_vertex(mi, far, tp);
+                       return False;
+               }
+               node = node->next;
+       } while (node != tp->fringe.nodes);
+
+       /* Rechain. */
+       if (!(fc & FC_CUT_THIS))
+               if (side == S_LEFT) {
+                       vertex->next = right;
+                       right->prev = vertex;
+               } else {
+                       vertex->prev = left;
+                       left->next = vertex;
+               }
+       if (!(fc & FC_CUT_FAR)) {
+               if (!(fc & FC_CUT_LEFT)) {
+                       far->next = left;
+                       left->prev = far;
+               }
+               if (!(fc & FC_CUT_RIGHT)) {
+                       far->prev = right;
+                       right->next = far;
+               }
+       }
+       draw_tile(vertex, right, far, left, vtype, mi);
+
+       /* Delete vertices that are no longer on the fringe.  Check the others. */
+       if (fc & FC_CUT_THIS) {
+               tp->fringe.nodes = far;
+               delete_vertex(mi, vertex, tp);
+       } else {
+               add_vtype(vertex, side, vtype);
+               check_vertex(mi, vertex, tp);
+               tp->fringe.nodes = vertex;
+       }
+       if (fc & FC_CUT_FAR)
+               delete_vertex(mi, far, tp);
+       else {
+               add_vtype(far, fc & FC_CUT_RIGHT ? S_LEFT : S_RIGHT, ftype);
+               check_vertex(mi, far, tp);
+       }
+       if (fc & FC_CUT_LEFT)
+               delete_vertex(mi, left, tp);
+       else {
+               add_vtype(left, fc & FC_CUT_FAR ? S_LEFT : S_RIGHT, ltype);
+               check_vertex(mi, left, tp);
+       }
+       if (fc & FC_CUT_RIGHT)
+               delete_vertex(mi, right, tp);
+       else {
+               add_vtype(right, fc & FC_CUT_FAR ? S_RIGHT : S_LEFT, rtype);
+               check_vertex(mi, right, tp);
+       }
+       return True;
+}
+
+
+/*-
+ * Add a forced tile to a given forced vertex.  Basically an easy job,
+ * since we know what to add.  But it might fail if adding the tile
+ * would cause some untiled area to become enclosed.  There is also another
+ * more exotic culprit: we might have a dislocation.  Fortunately, they
+ * are very rare (the PRL article reported that perfect tilings of over
+ * 2^50 tiles had been generated).  There is a version of the algorithm
+ * that doesn't produce dislocations, but it's a lot hairier than the
+ * simpler version I used.
+ */
+static int
+add_forced_tile(ModeInfo * mi, forced_node_c * node)
+{
+       tiling_c   *tp = &tilings[MI_SCREEN(mi)];
+       unsigned    side;
+       vertex_type_c vtype;
+       rule_match_c hits[MAX_TILES_PER_VERTEX * N_VERTEX_RULES];
+       int         n;
+
+       if (node->forced_sides == (S_LEFT | S_RIGHT))
+               side = NRAND(2) ? S_LEFT : S_RIGHT;
+       else
+               side = node->forced_sides;
+       n = match_rules(node->vertex, hits, True);
+       n = find_completions(node->vertex, hits, n, side, &vtype /*, True */ );
+       if (n <= 0) {
+               tp->done = True;
+               if (MI_WIN_IS_VERBOSE(mi)) {
+                       (void) fprintf(stderr, "Weirdness in add_forced_tile()\n");
+                       (void) fprintf(stderr, "n = %d\n", n);
+               }
+       }
+       return add_tile(mi, node->vertex, side, vtype);
+}
+
+
+/*-
+ * Whether the addition of a tile of vtype on the given side of vertex
+ * would conform to the rules.  The efficient way to do this would be
+ * to add the new tile and then use the same type of search as in
+ * match_rules.  However, this function is not a performance
+ * bottleneck (only needed for random tile additions, which are
+ * relatively infrequent), so I will settle for a simpler implementation.
+ */
+static int
+legal_move(fringe_node_c * vertex, unsigned side, vertex_type_c vtype)
+{
+       rule_match_c hits[MAX_TILES_PER_VERTEX * N_VERTEX_RULES];
+       vertex_type_c legal_vt[MAX_COMPL];
+       int         n_hits, n_legal, i;
+
+       n_hits = match_rules(vertex, hits, False);
+       n_legal = find_completions(vertex, hits, n_hits, side, legal_vt /*, False */ );
+       for (i = 0; i < n_legal; i++)
+               if (legal_vt[i] == vtype)
+                       return True;
+       return False;
+}
+
+
+/*-
+ * Add a randomly chosen tile to a given vertex.  This requires more checking
+ * as we must make sure the new tile conforms to the vertex rules at every
+ * vertex it touches. */
+static void
+add_random_tile(fringe_node_c * vertex, ModeInfo * mi)
+{
+       fringe_node_c *right, *left, *far;
+       int         i, j, n, n_hits, n_good;
+       unsigned    side, fc, no_good, s;
+       vertex_type_c vtypes[MAX_COMPL];
+       rule_match_c hits[MAX_TILES_PER_VERTEX * N_VERTEX_RULES];
+       tiling_c   *tp = &tilings[MI_SCREEN(mi)];
+
+       if (MI_NPIXELS(mi) > 2) {
+               tp->thick_color = NRAND(MI_NPIXELS(mi));
+               /* Insure good contrast */
+               tp->thin_color = (NRAND(2 * MI_NPIXELS(mi) / 3) + tp->thick_color +
+                                 MI_NPIXELS(mi) / 6) % MI_NPIXELS(mi);
+       } else
+               tp->thick_color = tp->thin_color = MI_WIN_WHITE_PIXEL(mi);
+       n_hits = match_rules(vertex, hits, False);
+       side = NRAND(2) ? S_LEFT : S_RIGHT;
+       n = find_completions(vertex, hits, n_hits, side, vtypes /*, False */ );
+       /* One answer would mean a forced tile. */
+       if (n <= 0) {
+               tp->done = True;
+               if (MI_WIN_IS_VERBOSE(mi)) {
+                       (void) fprintf(stderr, "Weirdness in add_random_tile()\n");
+                       (void) fprintf(stderr, "n = %d\n", n);
+               }
+       }
+       no_good = 0;
+       n_good = n;
+       for (i = 0; i < n; i++) {
+               fc = fringe_changes(mi, vertex, side, vtypes[i], &right, &far, &left);
+               if (fc & FC_BAG) {
+                       tp->done = True;
+                       if (MI_WIN_IS_VERBOSE(mi)) {
+                               (void) fprintf(stderr, "Weirdness in add_random_tile()\n");
+                               (void) fprintf(stderr, "fc = %d, FC_BAG = %d\n", fc, FC_BAG);
+                       }
+               }
+               if (right) {
+                       s = (((fc & FC_CUT_FAR) && (fc & FC_CUT_LEFT)) ? S_RIGHT : S_LEFT);
+                       if (!legal_move(right, s, VT_RIGHT(vtypes[i]))) {
+                               no_good |= (1 << i);
+                               n_good--;
+                               continue;
+                       }
+               }
+               if (left) {
+                       s = (((fc & FC_CUT_FAR) && (fc & FC_CUT_RIGHT)) ? S_LEFT : S_RIGHT);
+                       if (!legal_move(left, s, VT_LEFT(vtypes[i]))) {
+                               no_good |= (1 << i);
+                               n_good--;
+                               continue;
+                       }
+               }
+               if (far) {
+                       s = ((fc & FC_CUT_LEFT) ? S_RIGHT : S_LEFT);
+                       if (!legal_move(far, s, VT_FAR(vtypes[i]))) {
+                               no_good |= (1 << i);
+                               n_good--;
+                       }
+               }
+       }
+       if (n_good <= 0) {
+               tp->done = True;
+               if (MI_WIN_IS_VERBOSE(mi)) {
+                       (void) fprintf(stderr, "Weirdness in add_random_tile()\n");
+                       (void) fprintf(stderr, "n_good = %d\n", n_good);
+               }
+       }
+       n = NRAND(n_good);
+       for (i = j = 0; i <= n; i++, j++)
+               while (no_good & (1 << j))
+                       j++;
+
+       i = add_tile(mi, vertex, side, vtypes[j - 1]);
+       if (!i) {
+               tp->done = True;
+               if (MI_WIN_IS_VERBOSE(mi)) {
+                       (void) fprintf(stderr, "Weirdness in add_random_tile()\n");
+                       (void) fprintf(stderr, "i = %d\n", i);
+               }
+       }
+}
+
+/* One step of the growth algorithm. */
+void
+draw_penrose(ModeInfo * mi)
+{
+       tiling_c   *tp = &tilings[MI_SCREEN(mi)];
+       int         i = 0, n;
+       forced_node_c *p = tp->forced.first;
+
+       if (tp->done || tp->failures >= 100) {
+               init_penrose(mi);
+               return;
+       }
+       /* Check for the initial "2-gon". */
+       if (tp->fringe.nodes->prev == tp->fringe.nodes->next) {
+               vertex_type_c vtype = VT_TOTAL_MASK & LRAND();
+
+               XClearWindow(MI_DISPLAY(mi), MI_WINDOW(mi));
+               (void) add_tile(mi, tp->fringe.nodes, S_LEFT, vtype);
+               return;
+       }
+       /* No visible nodes left. */
+       if (tp->fringe.n_nodes == 0) {
+               tp->done = True;
+               MI_PAUSE(mi) = redo_delay_usec; /* Just finished drawing */
+               return;
+       }
+       if (tp->forced.n_visible > 0 && tp->failures < 10) {
+               n = NRAND(tp->forced.n_visible);
+               for (;;) {
+                       while (p->vertex->off_screen)
+                               p = p->next;
+                       if (i++ < n)
+                               p = p->next;
+                       else
+                               break;
+               }
+       } else if (tp->forced.n_nodes > 0) {
+               n = NRAND(tp->forced.n_nodes);
+               while (i++ < n)
+                       p = p->next;
+       } else {
+               fringe_node_c *p = tp->fringe.nodes;
+
+               n = NRAND(tp->fringe.n_nodes);
+               i = 0;
+               for (; i <= n; i++)
+                       do {
+                               p = p->next;
+                       } while (p->off_screen);
+               add_random_tile(p, mi);
+               tp->failures = 0;
+               return;
+       }
+       if (add_forced_tile(mi, p))
+               tp->failures = 0;
+       else
+               tp->failures++;
+}
+
+
+/* Total clean-up. */
+void
+release_penrose(ModeInfo * mi)
+{
+       if (tilings != NULL) {
+               int         screen;
+
+               for (screen = 0; screen < MI_NUM_SCREENS(mi); screen++) {
+                       tiling_c   *tp = &tilings[screen];
+
+                       release_screen(tp);
+               }
+               (void) free((void *) tilings);
+               tilings = NULL;
+       }
+}
diff --git a/hacks/penrose.man b/hacks/penrose.man
new file mode 100644 (file)
index 0000000..e4734bf
--- /dev/null
@@ -0,0 +1,106 @@
+.TH XScreenSaver 1 "10-May-97" "X Version 11"
+.SH NAME
+penrose - draws quasiperiodic tilings
+.SH SYNOPSIS
+.B penrose
+[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-ncolors \fIinteger\fP] [\-delay \fImicroseconds\fP] [\-redoDelay \fIseconds\fP] [\-size \fIinteger\fP] [\-ammann] [\-no\-ammann]
+
+.SH DESCRIPTION
+The \fIpenrose\fP program draws quasiperiodic tilings.
+
+See Onoda, Steinhardt, DiVincenzo and Socolar in
+Phys. Rev. Lett. 60, #25, 1988 or
+Strandburg in Computers in Physics, Sep/Oct 1991.
+
+This implementation uses the simpler version of the growth
+algorithm, i.e., if there are no forced vertices, a randomly chosen
+tile is added to a randomly chosen vertex (no preference for those
+108 degree angles).
+
+There are two essential differences to the algorithm presented in
+the literature: First, we do not allow the tiling to enclose an
+untiled area.  Whenever this is in danger of happening, we just
+do not add the tile, hoping for a better random choice the next
+time.  Second, when choosing a vertex randomly, we will take
+one that lies withing the viewport if available.  If this seems to
+cause enclosures in the forced rule case, we will allow invisible
+vertices to be chosen.
+
+Tiling is restarted whenever one of the following happens: there
+are no incomplete vertices within the viewport or the tiling has
+extended a window's length beyond the edge of the window
+horizontally or vertically or forced rule choice has failed 100
+times due to areas about to become enclosed.
+
+Although quasiperiodic tilings are produced, the tiles themselves are
+not penrose tiles (darts and kites). In contrast to penrose tiles,
+these tiles can be arranged to form a periodic tiling.
+
+.SH OPTIONS
+.I penrose
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window.  This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-mono 
+If on a color display, pretend we're on a monochrome display.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use.  Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-ncolors \fIinteger\fP
+How many colors should be used (if possible).  Default 64.
+The colors are chosen randomly.
+.TP 8
+.B \-size \fIinteger\fP
+How big the tiles should be.  Default 40 pixels.
+
+.TP 8
+.B \-delay \fImilliseconds\fP
+How long (in 1/1,000,000'ths of a second) to wait between drawing each
+tile.  Default 10,000 or .01 seconds.
+
+.TP 8
+.B \-redoDelay \fIseconds\fP
+How long to wait between starting a completely new tiling.  Default 3 seconds.
+
+.TP 8
+.B \-ammann \fIinteger\fP
+.TP 8
+.B \-no\-ammann \fIinteger\fP
+Whether Ammann lines should be added.
+
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1),
+.BR xlock (1)
+.SH COPYRIGHT
+Copyright \(co 1996 by Timo Korvola.
+
+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. 
+.SH AUTHOR
+Timo Korvola <tkorvola@dopey.hut.fi>, 1996.
+
+Ability to run standalone or with \fIxscreensaver\fP added by 
+Jamie Zawinski <jwz@jwz.org>, 10-May-97.
diff --git a/hacks/petri.c b/hacks/petri.c
new file mode 100644 (file)
index 0000000..8b70165
--- /dev/null
@@ -0,0 +1,646 @@
+/* petri, simulate mold in a petri dish. v2.6
+ * by Dan Bornstein, danfuzz@milk.com
+ * with help from Jamie Zawinski, jwz@jwz.org
+ * Copyright (c) 1992-1999 Dan Bornstein.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software 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.  No representations are made about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or 
+ * implied warranty.
+ *
+ *
+ * Brief description of options/resources:
+ *
+ * delay: the delay in microseconds between iterations
+ * size: the size of a cell in pixels
+ * count: the number of different kinds of mold (minimum: 2)
+ * diaglim: the age limit for diagonal growth as a multiplier of orthogonal
+ *   growth (minimum: 1, maximum 2). 1 means square growth, 1.414 
+ *   (i.e., sqrt(2)) means approximately circular growth, 2 means diamond
+ *   growth.
+ * anychan: the chance (fraction, between 0 and 1) that at each iteration,
+ *   any new cell will be born
+ * minorchan: the chance (fraction, between 0 and 1) that, given that new
+ *   cells will be added, that only two will be added (a minor cell birth
+ *   event)
+ * instantdeathchan: the chance (fraction, between 0 and 1) that, given
+ *   that death and destruction will happen, that instead of using plague
+ *   cells, death will be instantaneous
+ * minlifespan: the minimum lifespan of a colony (before black death ensues)
+ * maxlifespan: the maximum lifespan of a colony (before black death ensues)
+ * minlifespeed: the minimum speed for living cells as a fraction of the
+ *   maximum possible speed (fraction, between 0 and 1)
+ * maxlifespeed: the maximum speed for living cells as a fraction of the
+ *   maximum possible speed (fraction, between 0 and 1)
+ * mindeathspeed: the minimum speed for black death cells as a fraction of the
+ *   maximum possible speed (fraction, between 0 and 1)
+ * maxdeathspeed: the maximum speed for black death cells as a fraction of the
+ *   maximum possible speed (fraction, between 0 and 1)
+ * originalcolors: if true, count must be 8 or less and the colors are a 
+ *   fixed set of primary and secondary colors (the artist's original choices)
+ *
+ * Interesting settings:
+ *
+ *      petri -originalcolors -size 8
+ *      petri -size 2
+ *      petri -size 8 -diaglim 1.8
+ *      petri -diaglim 1.1
+ *
+ *      petri -count 4 -anychan 0.01 -minorchan 1 \
+ *              -minlifespan 2000 -maxlifespan 5000
+ *
+ *      petri -count 3 -anychan 1 -minlifespan 100000 \ 
+ *              -instantdeathchan 0
+ *
+ *      petri -minlifespeed 0.02 -maxlifespeed 0.03 -minlifespan 1 \
+ *              -maxlifespan 1 -instantdeathchan 0 -minorchan 0 \
+ *              -anychan 0.3 -delay 4000
+ */
+
+#include <math.h>
+#include "screenhack.h"
+#include "spline.h"
+
+#define FLOAT float
+#define RAND_FLOAT (((FLOAT) (random() & 0xffff)) / ((FLOAT) 0x10000))
+
+typedef struct cell_s 
+{
+    short x;                        /*  0    */
+    short y;                        /*  2    */
+    unsigned char col;              /*  4    */
+    unsigned char isnext;           /*  5    */
+    unsigned char nextcol;          /*  6    */
+                                    /*  7    */
+    struct cell_s *next;            /*  8    */
+    struct cell_s *prev;            /* 12    */
+    struct cell_s *(adj)[3][3];     /* 16    */
+    FLOAT speed;                    /* 52    */
+    FLOAT growth;                   /* 56 60 */
+    FLOAT nextspeed;                /* 60 68 */
+                                    /* 64 76 */
+} cell;
+
+static int arr_width;
+static int arr_height;
+static int count;
+
+static cell *arr;
+static cell *head;
+static cell *tail;
+static int blastcount;
+
+static Display *display;
+static Window window;
+static GC *coloredGCs;
+
+static int windowWidth;
+static int windowHeight;
+static int xOffset;
+static int yOffset;
+static int xSize;
+static int ySize;
+
+static FLOAT orthlim = 1.0;
+static FLOAT diaglim;
+static FLOAT anychan;
+static FLOAT minorchan;
+static FLOAT instantdeathchan;
+static int minlifespan;
+static int maxlifespan;
+static FLOAT minlifespeed;
+static FLOAT maxlifespeed;
+static FLOAT mindeathspeed;
+static FLOAT maxdeathspeed;
+static Bool originalcolors;
+
+static int random_life_value (void)
+{
+    return (int) ((RAND_FLOAT * (maxlifespan - minlifespan)) + minlifespan);
+}
+
+static void setup_random_colormap (XWindowAttributes *xgwa)
+{
+    XGCValues gcv;
+    int lose = 0;
+    int ncolors = count - 1;
+    int n;
+    XColor *colors = (XColor *) calloc (sizeof(*colors), count*2);
+    
+    colors[0].pixel = get_pixel_resource ("background", "Background",
+                                         display, xgwa->colormap);
+    
+    make_random_colormap (display, xgwa->visual, xgwa->colormap,
+                         colors+1, &ncolors, True, True, 0, True);
+    if (ncolors < 1)
+       exit (-1);
+    
+    ncolors++;
+    count = ncolors;
+    
+    memcpy (colors + count, colors, count * sizeof(*colors));
+    colors[count].pixel = get_pixel_resource ("foreground", "Foreground",
+                                             display, xgwa->colormap);
+    
+    for (n = 1; n < count; n++)
+    {
+       int m = n + count;
+       colors[n].red = colors[m].red / 2;
+       colors[n].green = colors[m].green / 2;
+       colors[n].blue = colors[m].blue / 2;
+       
+       if (!XAllocColor (display, xgwa->colormap, &colors[n]))
+       {
+           lose++;
+           colors[n] = colors[m];
+       }
+    }
+
+    if (lose)
+    {
+       fprintf (stderr, 
+                "%s: unable to allocate %d half-intensity colors.\n",
+                progname, lose);
+    }
+    
+    for (n = 0; n < count*2; n++) 
+    {
+       gcv.foreground = colors[n].pixel;
+       coloredGCs[n] = XCreateGC (display, window, GCForeground, &gcv);
+    }
+
+    free (colors);
+}
+
+static void setup_original_colormap (XWindowAttributes *xgwa)
+{
+    XGCValues gcv;
+    int lose = 0;
+    int n;
+    XColor *colors = (XColor *) calloc (sizeof(*colors), count*2);
+    
+    colors[0].pixel = get_pixel_resource ("background", "Background",
+                                         display, xgwa->colormap);
+
+    colors[count].pixel = get_pixel_resource ("foreground", "Foreground",
+                                             display, xgwa->colormap);
+
+    for (n = 1; n < count; n++)
+    {
+       int m = n + count;
+       colors[n].red =   ((n & 0x01) != 0) * 0x8000;
+       colors[n].green = ((n & 0x02) != 0) * 0x8000;
+       colors[n].blue =  ((n & 0x04) != 0) * 0x8000;
+
+       if (!XAllocColor (display, xgwa->colormap, &colors[n]))
+       {
+           lose++;
+           colors[n] = colors[0];
+       }
+
+       colors[m].red   = colors[n].red + 0x4000;
+       colors[m].green = colors[n].green + 0x4000;
+       colors[m].blue  = colors[n].blue + 0x4000;
+
+       if (!XAllocColor (display, xgwa->colormap, &colors[m]))
+       {
+           lose++;
+           colors[m] = colors[count];
+       }
+    }
+
+    if (lose)
+    {
+       fprintf (stderr, 
+                "%s: unable to allocate %d colors.\n",
+                progname, lose);
+    }
+    
+    for (n = 0; n < count*2; n++) 
+    {
+       gcv.foreground = colors[n].pixel;
+       coloredGCs[n] = XCreateGC (display, window, GCForeground, &gcv);
+    }
+
+    free (colors);
+}
+
+static void setup_display (void)
+{
+    XWindowAttributes xgwa;
+    Colormap cmap;
+
+    int cell_size = get_integer_resource ("size", "Integer");
+    if (cell_size < 1) cell_size = 1;
+
+    XGetWindowAttributes (display, window, &xgwa);
+
+    originalcolors = get_boolean_resource ("originalcolors", "Boolean");
+
+    count = get_integer_resource ("count", "Integer");
+    if (count < 2) count = 2;
+    if (count > (1L << (xgwa.depth-1)))
+      count = (1L << (xgwa.depth-1));
+
+    if (originalcolors && (count > 8))
+    {
+       count = 8;
+    }
+
+    coloredGCs = (GC *) calloc (sizeof(GC), count * 2);
+
+    diaglim  = get_float_resource ("diaglim", "Float");
+    if (diaglim < 1.0)
+    {
+       diaglim = 1.0;
+    }
+    else if (diaglim > 2.0)
+    {
+       diaglim = 2.0;
+    }
+    diaglim *= orthlim;
+
+    anychan  = get_float_resource ("anychan", "Float");
+    if (anychan < 0.0)
+    {
+       anychan = 0.0;
+    }
+    else if (anychan > 1.0)
+    {
+       anychan = 1.0;
+    }
+    
+    minorchan = get_float_resource ("minorchan","Float");
+    if (minorchan < 0.0)
+    {
+       minorchan = 0.0;
+    }
+    else if (minorchan > 1.0)
+    {
+       minorchan = 1.0;
+    }
+    
+    instantdeathchan = get_float_resource ("instantdeathchan","Float");
+    if (instantdeathchan < 0.0)
+    {
+       instantdeathchan = 0.0;
+    }
+    else if (instantdeathchan > 1.0)
+    {
+       instantdeathchan = 1.0;
+    }
+
+    minlifespan = get_integer_resource ("minlifespan", "Integer");
+    if (minlifespan < 1)
+    {
+       minlifespan = 1;
+    }
+
+    maxlifespan = get_integer_resource ("maxlifespan", "Integer");
+    if (maxlifespan < minlifespan)
+    {
+       maxlifespan = minlifespan;
+    }
+
+    minlifespeed = get_float_resource ("minlifespeed", "Float");
+    if (minlifespeed < 0.0)
+    {
+       minlifespeed = 0.0;
+    }
+    else if (minlifespeed > 1.0)
+    {
+       minlifespeed = 1.0;
+    }
+
+    maxlifespeed = get_float_resource ("maxlifespeed", "Float");
+    if (maxlifespeed < minlifespeed)
+    {
+       maxlifespeed = minlifespeed;
+    }
+    else if (maxlifespeed > 1.0)
+    {
+       maxlifespeed = 1.0;
+    }
+
+    mindeathspeed = get_float_resource ("mindeathspeed", "Float");
+    if (mindeathspeed < 0.0)
+    {
+       mindeathspeed = 0.0;
+    }
+    else if (mindeathspeed > 1.0)
+    {
+       mindeathspeed = 1.0;
+    }
+
+    maxdeathspeed = get_float_resource ("maxdeathspeed", "Float");
+    if (maxdeathspeed < mindeathspeed)
+    {
+       maxdeathspeed = mindeathspeed;
+    }
+    else if (maxdeathspeed > 1.0)
+    {
+       maxdeathspeed = 1.0;
+    }
+
+    minlifespeed *= diaglim;
+    maxlifespeed *= diaglim;
+    mindeathspeed *= diaglim;
+    maxdeathspeed *= diaglim;
+
+    cmap = xgwa.colormap;
+    
+    windowWidth = xgwa.width;
+    windowHeight = xgwa.height;
+    
+    arr_width = windowWidth / cell_size;
+    arr_height = windowHeight / cell_size;
+
+    xSize = windowWidth / arr_width;
+    ySize = windowHeight / arr_height;
+    if (xSize > ySize)
+    {
+       xSize = ySize;
+    }
+    else
+    {
+       ySize = xSize;
+    }
+    
+    xOffset = (windowWidth - (arr_width * xSize)) / 2;
+    yOffset = (windowHeight - (arr_height * ySize)) / 2;
+
+    if (originalcolors)
+    {
+       setup_original_colormap (&xgwa);
+    }
+    else
+    {
+       setup_random_colormap (&xgwa);
+    }
+}
+
+static void drawblock (int x, int y, unsigned char c)
+{
+  if (xSize == 1 && ySize == 1)
+    XDrawPoint (display, window, coloredGCs[c], x + xOffset, y + yOffset);
+  else
+    XFillRectangle (display, window, coloredGCs[c],
+                   x * xSize + xOffset, y * ySize + yOffset,
+                   xSize, ySize);
+}
+
+static void setup_arr (void)
+{
+    int x, y;
+    int i, j;
+    int a, b;
+
+    if (arr != NULL)
+    {
+       free (arr);
+    }
+
+    XFillRectangle (display, window, coloredGCs[0], 0, 0, 
+                   windowWidth, windowHeight);
+
+    arr = (cell *) calloc (sizeof(cell), arr_width * arr_height);  
+    if (!arr)
+      {
+        fprintf (stderr, "%s: out of memory allocating %dx%d grid\n",
+                 progname, arr_width, arr_height);
+        exit (1);
+      }
+
+    for (y = 0; y < arr_height; y++)
+    {
+      int row = y * arr_width;
+       for (x = 0; x < arr_width; x++) 
+       {
+           arr[row+x].x = x;
+           arr[row+x].y = y;
+           arr[row+x].speed = 0.0;
+           arr[row+x].growth = 0.0;
+           arr[row+x].col = 0;
+           arr[row+x].isnext = 0;
+           arr[row+x].next = 0;
+           arr[row+x].prev = 0;
+           for (i = 0; i < 3; i++) 
+           {
+               a = x + i - 1;
+               if (a < 0) a = arr_width - 1;
+               else if (a >= arr_width) a = 0;
+               for (j = 0; j < 3; j++) 
+               {
+                   b = y + j - 1;
+                   if (b < 0) b = arr_height - 1;
+                   else if (b >= arr_height) b = 0;
+                   arr[row+x].adj[i][j] = &arr[(b * arr_width) + a];
+               }
+           }
+       }
+    }
+
+    if (head == NULL)
+    {
+       head = (cell *) malloc (sizeof (cell));
+    }
+    
+    if (tail == NULL)
+    {
+       tail = (cell *) malloc (sizeof (cell));
+    }
+
+    head->next = tail;
+    head->prev = head;
+    tail->next = tail;
+    tail->prev = head;
+
+    blastcount = random_life_value ();
+}
+
+static void newcell (cell *c, unsigned char col, FLOAT sp)
+{
+    if (! c) return;
+    
+    if (c->col == col) return;
+    
+    c->nextcol = col;
+    c->nextspeed = sp;
+    c->isnext = 1;
+    
+    if (c->prev == 0) {
+       c->next = head->next;
+       c->prev = head;
+       head->next = c;
+       c->next->prev = c;
+    }
+}
+
+static void killcell (cell *c)
+{
+    c->prev->next = c->next;
+    c->next->prev = c->prev;
+    c->prev = 0;
+    c->speed = 0.0;
+    drawblock (c->x, c->y, c->col);
+}
+
+
+static void randblip (int doit)
+{
+    int n;
+    int b = 0;
+    if (!doit 
+       && (blastcount-- >= 0) 
+       && (RAND_FLOAT > anychan))
+    {
+       return;
+    }
+    
+    if (blastcount < 0) 
+    {
+       b = 1;
+       n = 2;
+       blastcount = random_life_value ();
+       if (RAND_FLOAT < instantdeathchan)
+       {
+           /* clear everything every so often to keep from getting into a
+            * rut */
+           setup_arr ();
+           b = 0;
+       }
+    }
+    else if (RAND_FLOAT <= minorchan) 
+    {
+       n = 2;
+    }
+    else 
+    {
+       n = random () % 3 + 3;
+    }
+    
+    while (n--) 
+    {
+       int x = random () % arr_width;
+       int y = random () % arr_height;
+       int c;
+       FLOAT s;
+       if (b)
+       {
+           c = 0;
+           s = RAND_FLOAT * (maxdeathspeed - mindeathspeed) + mindeathspeed;
+       }
+       else
+       {
+           c = (random () % (count-1)) + 1;
+           s = RAND_FLOAT * (maxlifespeed - minlifespeed) + minlifespeed;
+       }
+       newcell (&arr[y * arr_width + x], c, s);
+    }
+}
+
+static void update (void)
+{
+    cell *a;
+    
+    for (a = head->next; a != tail; a = a->next) 
+    {
+       if (a->speed == 0) continue;
+       a->growth += a->speed;
+       if (a->growth >= orthlim) 
+       {
+           newcell (a->adj[0][1], a->col, a->speed);
+           newcell (a->adj[2][1], a->col, a->speed);
+           newcell (a->adj[1][0], a->col, a->speed);
+           newcell (a->adj[1][2], a->col, a->speed);
+       }
+       if (a->growth >= diaglim) 
+       {
+           newcell (a->adj[0][0], a->col, a->speed);
+           newcell (a->adj[0][2], a->col, a->speed);
+           newcell (a->adj[2][0], a->col, a->speed);
+           newcell (a->adj[2][2], a->col, a->speed);
+           killcell (a);
+       }
+    }
+    
+    randblip ((head->next) == tail);
+    
+    for (a = head->next; a != tail; a = a->next)
+    {
+       if (a->isnext) 
+       {
+           a->isnext = 0;
+           a->speed = a->nextspeed;
+           a->growth = 0.0;
+           a->col = a->nextcol;
+           drawblock (a->x, a->y, a->col + count);
+       }
+    }
+}
+
+\f
+char *progclass = "Petri";
+
+char *defaults [] = {
+  ".background:                black",
+  ".foreground:                white",
+  "*delay:             10000",
+  "*count:             8",
+  "*size:              4",
+  "*diaglim:           1.414",
+  "*anychan:           0.0015",
+  "*minorchan:         0.5",
+  "*instantdeathchan:  0.2",
+  "*minlifespan:       500",
+  "*maxlifespan:       1500",
+  "*minlifespeed:      0.04",
+  "*maxlifespeed:      0.13",
+  "*mindeathspeed:     0.42",
+  "*maxdeathspeed:     0.46",
+  "*originalcolors:    false",
+    0
+};
+
+XrmOptionDescRec options [] = {
+  { "-delay",           ".delay",              XrmoptionSepArg, 0 },
+  { "-size",            ".size",               XrmoptionSepArg, 0 },
+  { "-count",           ".count",              XrmoptionSepArg, 0 },
+  { "-diaglim",                 ".diaglim",            XrmoptionSepArg, 0 },
+  { "-anychan",                 ".anychan",            XrmoptionSepArg, 0 },
+  { "-minorchan",       ".minorchan",          XrmoptionSepArg, 0 },
+  { "-instantdeathchan", ".instantdeathchan",  XrmoptionSepArg, 0 },
+  { "-minlifespan",     ".minlifespan",        XrmoptionSepArg, 0 },
+  { "-maxlifespan",     ".maxlifespan",        XrmoptionSepArg, 0 },
+  { "-minlifespeed",    ".minlifespeed",       XrmoptionSepArg, 0 },
+  { "-maxlifespeed",    ".maxlifespeed",       XrmoptionSepArg, 0 },
+  { "-mindeathspeed",   ".mindeathspeed",      XrmoptionSepArg, 0 },
+  { "-maxdeathspeed",   ".maxdeathspeed",      XrmoptionSepArg, 0 },
+  { "-originalcolors",  ".originalcolors",     XrmoptionNoArg,  "true" },
+  { 0, 0, 0, 0 }
+};
+
+void screenhack (Display *dpy, Window win)
+{
+    int delay = get_integer_resource ("delay", "Delay");
+    display = dpy;
+    window = win;
+    setup_display ();
+    
+    setup_arr ();
+    
+    randblip (1);
+    
+    for (;;) 
+    {
+       update ();
+        XSync (dpy, False);
+        screenhack_handle_events (dpy);
+       usleep (delay);
+    }
+}
+
+
diff --git a/hacks/phosphor.c b/hacks/phosphor.c
new file mode 100644 (file)
index 0000000..105f9b5
--- /dev/null
@@ -0,0 +1,806 @@
+/* xscreensaver, Copyright (c) 1999 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software 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.  No representations are made about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or 
+ * implied warranty.
+ *
+ * Phosphor -- simulate a glass tty with long-sustain phosphor.
+ */
+
+#include "screenhack.h"
+#include <stdio.h>
+#include <X11/Xutil.h>
+#include <X11/Xatom.h>
+#include <X11/Intrinsic.h>
+
+extern XtAppContext app;
+
+#define FUZZY_BORDER
+
+#define MAX(a,b) ((a)>(b)?(a):(b))
+#define MIN(a,b) ((a)<(b)?(a):(b))
+
+#define BLANK  0
+#define FLARE  1
+#define NORMAL 2
+#define FADE   3
+#define STATE_MAX FADE
+
+#define CURSOR_INDEX 128
+
+typedef struct {
+  unsigned char name;
+  int width, height;
+  Pixmap pixmap;
+#ifdef FUZZY_BORDER
+  Pixmap pixmap2;
+#endif /* FUZZY_BORDER */
+  Bool blank_p;
+} p_char;
+
+typedef struct {
+  p_char *p_char;
+  int state;
+  Bool changed;
+} p_cell;
+
+typedef struct {
+  Display *dpy;
+  Window window;
+  XWindowAttributes xgwa;
+  XFontStruct *font;
+  int grid_width, grid_height;
+  int char_width, char_height;
+  int scale;
+  int ticks;
+  p_char **chars;
+  p_cell *cells;
+  XGCValues gcv;
+  GC gc0;
+  GC gc1;
+#ifdef FUZZY_BORDER
+  GC gc2;
+#endif /* FUZZY_BORDER */
+  GC *gcs;
+  XImage *font_bits;
+
+  int cursor_x, cursor_y;
+  XtIntervalId cursor_timer;
+  Time cursor_blink;
+
+  FILE *pipe;
+  XtInputId pipe_id;
+  Bool input_available_p;
+  Time subproc_relaunch_delay;
+
+} p_state;
+
+
+static void capture_font_bits (p_state *state);
+static p_char *make_character (p_state *state, int c);
+static void drain_input (p_state *state);
+static void char_to_pixmap (p_state *state, p_char *pc, int c);
+static void launch_text_generator (p_state *state);
+
+
+/* About font metrics:
+
+   "lbearing" is the distance from the leftmost pixel of a character to
+   the logical origin of that character.  That is, it is the number of
+   pixels of the character which are to the left of its logical origin.
+
+   "rbearing" is the distance from the logical origin of a character to
+   the rightmost pixel of a character.  That is, it is the number of
+   pixels of the character to the right of its logical origin.
+
+   "descent" is the distance from the bottommost pixel of a character to
+   the logical baseline.  That is, it is the number of pixels of the
+   character which are below the baseline.
+
+   "ascent" is the distance from the logical baseline to the topmost pixel.
+   That is, it is the number of pixels of the character above the baseline.
+
+   Therefore, the bounding box of the "ink" of a character is
+   lbearing + rbearing by ascent + descent;
+
+   "width" is the distance from the logical origin of this character to
+   the position where the logical orgin of the next character should be
+   placed.
+
+   For our purposes, we're only interested in the part of the character
+   lying inside the "width" box.  If the characters have ink outside of
+   that box (the "charcell" box) then we're going to lose it.  Alas.
+ */
+
+static p_state *
+init_phosphor (Display *dpy, Window window)
+{
+  int i;
+  unsigned long flags;
+  p_state *state = (p_state *) calloc (sizeof(*state), 1);
+  char *fontname = get_string_resource ("font", "Font");
+  XFontStruct *font;
+
+  state->dpy = dpy;
+  state->window = window;
+
+  XGetWindowAttributes (dpy, window, &state->xgwa);
+
+  state->font = XLoadQueryFont (dpy, fontname);
+
+  if (!state->font)
+    {
+      fprintf(stderr, "couldn't load font \"%s\"\n", fontname);
+      state->font = XLoadQueryFont (dpy, "fixed");
+    }
+  if (!state->font)
+    {
+      fprintf(stderr, "couldn't load font \"fixed\"");
+      exit(1);
+    }
+
+  font = state->font;
+  state->scale = get_integer_resource ("scale", "Integer");
+  state->ticks = STATE_MAX + get_integer_resource ("ticks", "Integer");
+
+#if 0
+  for (i = 0; i < font->n_properties; i++)
+    if (font->properties[i].name == XA_FONT)
+      printf ("font: %s\n", XGetAtomName(dpy, font->properties[i].card32));
+#endif /* 0 */
+
+  state->cursor_blink = get_integer_resource ("cursor", "Time");
+  state->subproc_relaunch_delay =
+    (1000 * get_integer_resource ("relaunch", "Time"));
+
+  state->char_width  = font->max_bounds.width;
+  state->char_height = font->max_bounds.ascent + font->max_bounds.descent;
+
+  state->grid_width = state->xgwa.width / (state->char_width * state->scale);
+  state->grid_height = state->xgwa.height /(state->char_height * state->scale);
+  state->cells = (p_cell *) calloc (sizeof(p_cell),
+                                    state->grid_width * state->grid_height);
+  state->chars = (p_char **) calloc (sizeof(p_char *), 256);
+
+  state->gcs = (GC *) calloc (sizeof(GC), state->ticks + 1);
+
+  {
+    int ncolors = MAX (0, state->ticks - 3);
+    XColor *colors = (XColor *) calloc (ncolors, sizeof(XColor));
+    int h1, h2;
+    double s1, s2, v1, v2;
+
+    unsigned long fg = get_pixel_resource ("foreground", "Foreground",
+                                           state->dpy, state->xgwa.colormap);
+    unsigned long bg = get_pixel_resource ("background", "Background",
+                                           state->dpy, state->xgwa.colormap);
+    unsigned long flare = get_pixel_resource ("flareForeground", "Foreground",
+                                              state->dpy,state->xgwa.colormap);
+    unsigned long fade = get_pixel_resource ("fadeForeground", "Foreground",
+                                             state->dpy,state->xgwa.colormap);
+
+    XColor start, end;
+
+    start.pixel = fade;
+    XQueryColor (state->dpy, state->xgwa.colormap, &start);
+
+    end.pixel = bg;
+    XQueryColor (state->dpy, state->xgwa.colormap, &end);
+
+    /* Now allocate a ramp of colors from the main color to the background. */
+    rgb_to_hsv (start.red, start.green, start.blue, &h1, &s1, &v1);
+    rgb_to_hsv (end.red, end.green, end.blue, &h2, &s2, &v2);
+    make_color_ramp (state->dpy, state->xgwa.colormap,
+                     h1, s1, v1,
+                     h2, s2, v2,
+                     colors, &ncolors,
+                     False, True, False);
+
+    /* Adjust to the number of colors we actually got. */
+    state->ticks = ncolors + STATE_MAX;
+
+    /* Now, GCs all around.
+     */
+    state->gcv.font = font->fid;
+    state->gcv.cap_style = CapRound;
+#ifdef FUZZY_BORDER
+    state->gcv.line_width = (int) (((long) state->scale) * 1.3);
+    if (state->gcv.line_width == state->scale)
+      state->gcv.line_width++;
+#else /* !FUZZY_BORDER */
+    state->gcv.line_width = (int) (((long) state->scale) * 0.9);
+    if (state->gcv.line_width >= state->scale)
+      state->gcv.line_width = state->scale - 1;
+    if (state->gcv.line_width < 1)
+      state->gcv.line_width = 1;
+#endif /* !FUZZY_BORDER */
+
+    flags = (GCForeground | GCBackground | GCCapStyle | GCLineWidth);
+
+    state->gcv.background = bg;
+    state->gcv.foreground = bg;
+    state->gcs[BLANK] = XCreateGC (state->dpy, state->window, flags,
+                                   &state->gcv);
+
+    state->gcv.foreground = flare;
+    state->gcs[FLARE] = XCreateGC (state->dpy, state->window, flags,
+                                   &state->gcv);
+
+    state->gcv.foreground = fg;
+    state->gcs[NORMAL] = XCreateGC (state->dpy, state->window, flags,
+                                    &state->gcv);
+
+    for (i = 0; i < ncolors; i++)
+      {
+        state->gcv.foreground = colors[i].pixel;
+        state->gcs[STATE_MAX + i] = XCreateGC (state->dpy, state->window,
+                                               flags, &state->gcv);
+      }
+  }
+
+  capture_font_bits (state);
+
+  launch_text_generator (state);
+
+  return state;
+}
+
+
+static void
+capture_font_bits (p_state *state)
+{
+  XFontStruct *font = state->font;
+  int safe_width = font->max_bounds.rbearing - font->min_bounds.lbearing;
+  int height = state->char_height;
+  unsigned char string[257];
+  int i;
+  Pixmap p = XCreatePixmap (state->dpy, state->window,
+                            (safe_width * 256), height, 1);
+
+  for (i = 0; i < 256; i++)
+    string[i] = (unsigned char) i;
+  string[256] = 0;
+
+  state->gcv.foreground = 0;
+  state->gcv.background = 0;
+  state->gc0 = XCreateGC (state->dpy, p,
+                          (GCForeground | GCBackground),
+                          &state->gcv);
+
+  state->gcv.foreground = 1;
+  state->gc1 = XCreateGC (state->dpy, p,
+                          (GCFont | GCForeground | GCBackground |
+                           GCCapStyle | GCLineWidth),
+                          &state->gcv);
+
+#ifdef FUZZY_BORDER
+  {
+    state->gcv.line_width = (int) (((long) state->scale) * 0.8);
+    if (state->gcv.line_width >= state->scale)
+      state->gcv.line_width = state->scale - 1;
+    if (state->gcv.line_width < 1)
+      state->gcv.line_width = 1;
+    state->gc2 = XCreateGC (state->dpy, p,
+                            (GCFont | GCForeground | GCBackground |
+                             GCCapStyle | GCLineWidth),
+                            &state->gcv);
+  }
+#endif /* FUZZY_BORDER */
+
+  XFillRectangle (state->dpy, p, state->gc0, 0, 0, (safe_width * 256), height);
+
+  for (i = 0; i < 256; i++)
+    {
+      if (string[i] < font->min_char_or_byte2 ||
+          string[i] > font->max_char_or_byte2)
+        continue;
+      XDrawString (state->dpy, p, state->gc1,
+                   i * safe_width, font->ascent,
+                   string + i, 1);
+    }
+
+  /* Draw the cursor. */
+  XFillRectangle (state->dpy, p, state->gc1,
+                  (CURSOR_INDEX * safe_width), 1,
+                  (font->per_char
+                   ? font->per_char['n'-font->min_char_or_byte2].width
+                   : font->max_bounds.width),
+                  font->ascent - 1);
+
+#if 0
+  XCopyPlane (state->dpy, p, state->window, state->gcs[FLARE],
+              0, 0, (safe_width * 256), height, 0, 0, 1L);
+  XSync(state->dpy, False);
+#endif
+
+  XSync (state->dpy, False);
+  state->font_bits = XGetImage (state->dpy, p, 0, 0,
+                                (safe_width * 256), height, ~0L, XYPixmap);
+  XFreePixmap (state->dpy, p);
+
+  for (i = 0; i < 256; i++)
+    state->chars[i] = make_character (state, i);
+  state->chars[CURSOR_INDEX] = make_character (state, CURSOR_INDEX);
+}
+
+
+static p_char *
+make_character (p_state *state, int c)
+{
+  p_char *pc = (p_char *) malloc (sizeof (*pc));
+  pc->name = (unsigned char) c;
+  pc->width =  state->scale * state->char_width;
+  pc->height = state->scale * state->char_height;
+  char_to_pixmap (state, pc, c);
+  return pc;
+}
+
+
+static void
+char_to_pixmap (p_state *state, p_char *pc, int c)
+{
+  Pixmap p = 0;
+  GC gc;
+#ifdef FUZZY_BORDER
+  Pixmap p2 = 0;
+  GC gc2;
+#endif /* FUZZY_BORDER */
+  int from, to;
+  int x1, y;
+
+  XFontStruct *font = state->font;
+  int safe_width = font->max_bounds.rbearing - font->min_bounds.lbearing;
+
+  int width  = state->scale * state->char_width;
+  int height = state->scale * state->char_height;
+
+  if (c < font->min_char_or_byte2 ||
+      c > font->max_char_or_byte2)
+    goto DONE;
+
+  gc = state->gc1;
+  p = XCreatePixmap (state->dpy, state->window, width, height, 1);
+  XFillRectangle (state->dpy, p, state->gc0, 0, 0, width, height);
+#ifdef FUZZY_BORDER
+  gc2 = state->gc2;
+  p2 = XCreatePixmap (state->dpy, state->window, width, height, 1);
+  XFillRectangle (state->dpy, p2, state->gc0, 0, 0, width, height);
+#endif /* FUZZY_BORDER */
+
+  from = safe_width * c;
+  to =   safe_width * (c + 1);
+
+#if 0
+  if (c > 75 && c < 150)
+    {
+      printf ("\n=========== %d (%c)\n", c, c);
+      for (y = 0; y < state->char_height; y++)
+        {
+          for (x1 = from; x1 < to; x1++)
+            printf (XGetPixel (state->font_bits, x1, y) ? "* " : ". ");
+          printf ("\n");
+        }
+    }
+#endif
+
+  pc->blank_p = True;
+  for (y = 0; y < state->char_height; y++)
+    for (x1 = from; x1 < to; x1++)
+      if (XGetPixel (state->font_bits, x1, y))
+        {
+          int xoff = state->scale / 2;
+          int x2;
+          for (x2 = x1; x2 < to; x2++)
+            if (!XGetPixel (state->font_bits, x2, y))
+              break;
+          x2--;
+          XDrawLine (state->dpy, p, gc,
+                     (x1 - from) * state->scale + xoff, y * state->scale,
+                     (x2 - from) * state->scale + xoff, y * state->scale);
+#ifdef FUZZY_BORDER
+          XDrawLine (state->dpy, p2, gc2,
+                     (x1 - from) * state->scale + xoff, y * state->scale,
+                     (x2 - from) * state->scale + xoff, y * state->scale);
+#endif /* FUZZY_BORDER */
+          x1 = x2;
+          pc->blank_p = False;
+        }
+
+  /*  if (pc->blank_p && c == CURSOR_INDEX)
+    abort();*/
+
+ DONE:
+  pc->pixmap = p;
+#ifdef FUZZY_BORDER
+  pc->pixmap2 = p2;
+#endif /* FUZZY_BORDER */
+}
+
+\f
+/* Managing the display. 
+ */
+
+static void cursor_on_timer (XtPointer closure, XtIntervalId *id);
+static void cursor_off_timer (XtPointer closure, XtIntervalId *id);
+
+static Bool
+set_cursor_1 (p_state *state, Bool on)
+{
+  p_cell *cell = &state->cells[state->grid_width * state->cursor_y
+                              + state->cursor_x];
+  p_char *cursor = state->chars[CURSOR_INDEX];
+  int new_state = (on ? NORMAL : FADE);
+
+  if (cell->p_char != cursor)
+    cell->changed = True;
+
+  if (cell->state != new_state)
+    cell->changed = True;
+
+  cell->p_char = cursor;
+  cell->state = new_state;
+  return cell->changed;
+}
+
+static void
+set_cursor (p_state *state, Bool on)
+{
+  if (set_cursor_1 (state, on))
+;
+    {
+      if (state->cursor_timer)
+        XtRemoveTimeOut (state->cursor_timer);
+      state->cursor_timer = 0;
+      cursor_on_timer (state, 0);
+    }
+}
+
+
+
+
+static void
+cursor_off_timer (XtPointer closure, XtIntervalId *id)
+{
+  p_state *state = (p_state *) closure;
+  set_cursor_1 (state, False);
+  state->cursor_timer = XtAppAddTimeOut (app, state->cursor_blink,
+                                         cursor_on_timer, closure);
+}
+
+static void
+cursor_on_timer (XtPointer closure, XtIntervalId *id)
+{
+  p_state *state = (p_state *) closure;
+  set_cursor_1 (state, True);
+  state->cursor_timer = XtAppAddTimeOut (app, 2 * state->cursor_blink,
+                                         cursor_off_timer, closure);
+}
+
+
+static void
+clear (p_state *state)
+{
+  int x, y;
+  state->cursor_x = 0;
+  state->cursor_y = 0;
+  for (y = 0; y < state->grid_height; y++)
+    for (x = 0; x < state->grid_width; x++)
+      {
+        p_cell *cell = &state->cells[state->grid_width * y + x];
+        if (cell->state == FLARE || cell->state == NORMAL)
+          {
+            cell->state = FADE;
+            cell->changed = True;
+          }
+      }
+  set_cursor (state, True);
+}
+
+
+static void
+decay (p_state *state)
+{
+  int x, y;
+  for (y = 0; y < state->grid_height; y++)
+    for (x = 0; x < state->grid_width; x++)
+      {
+        p_cell *cell = &state->cells[state->grid_width * y + x];
+        if (cell->state == FLARE)
+          {
+            cell->state = NORMAL;
+            cell->changed = True;
+          }
+        else if (cell->state >= FADE)
+          {
+            cell->state++;
+            if (cell->state >= state->ticks)
+              cell->state = BLANK;
+            cell->changed = True;
+          }
+      }
+}
+
+
+static void
+scroll (p_state *state)
+{
+  int x, y;
+  for (x = 0; x < state->grid_width; x++)
+    {
+      p_cell *from = 0, *to = 0;
+      for (y = 1; y < state->grid_height; y++)
+        {
+          from = &state->cells[state->grid_width * y     + x];
+          to   = &state->cells[state->grid_width * (y-1) + x];
+
+          if ((from->state == FLARE || from->state == NORMAL) &&
+              !from->p_char->blank_p)
+            {
+              *to = *from;
+              to->state = NORMAL;  /* should be FLARE?  Looks bad... */
+            }
+          else
+            {
+              if (to->state == FLARE || to->state == NORMAL)
+                to->state = FADE;
+            }
+
+          to->changed = True;
+        }
+
+      to = from;
+      if (to->state == FLARE || to->state == NORMAL)
+        {
+          to->state = FADE;
+          to->changed = True;
+        }
+    }
+  set_cursor (state, True);
+}
+
+
+static void
+print_char (p_state *state, int c)
+{
+  p_cell *cell = &state->cells[state->grid_width * state->cursor_y
+                              + state->cursor_x];
+
+  /* Start the cursor fading (in case we don't end up overwriting it.) */
+  if (cell->state == FLARE || cell->state == NORMAL)
+    {
+      cell->state = FADE;
+      cell->changed = True;
+    }
+
+  if (c == '\t') c = ' ';   /* blah. */
+
+  if (c == '\r' || c == '\n')
+    {
+      state->cursor_x = 0;
+      if (state->cursor_y == state->grid_height - 1)
+        scroll (state);
+      else
+        state->cursor_y++;
+    }
+  else if (c == '\014')
+    {
+      clear (state);
+    }
+  else
+    {
+      cell->state = FLARE;
+      cell->p_char = state->chars[c];
+      cell->changed = True;
+      state->cursor_x++;
+
+      if (c != ' ' && cell->p_char->blank_p)
+        cell->p_char = state->chars[CURSOR_INDEX];
+
+      if (state->cursor_x >= state->grid_width - 1)
+        {
+          state->cursor_x = 0;
+          if (state->cursor_y >= state->grid_height - 1)
+            scroll (state);
+          else
+            state->cursor_y++;
+        }
+    }
+  set_cursor (state, True);
+}
+
+
+static void
+update_display (p_state *state, Bool changed_only)
+{
+  int x, y;
+
+  for (y = 0; y < state->grid_height; y++)
+    for (x = 0; x < state->grid_width; x++)
+      {
+        p_cell *cell = &state->cells[state->grid_width * y + x];
+        int width, height, tx, ty;
+
+        if (changed_only && !cell->changed)
+          continue;
+
+        width = state->char_width * state->scale;
+        height = state->char_height * state->scale;
+        tx = x * width;
+        ty = y * height;
+
+        if (cell->state == BLANK || cell->p_char->blank_p)
+          {
+            XFillRectangle (state->dpy, state->window, state->gcs[BLANK],
+                            tx, ty, width, height);
+          }
+        else
+          {
+#ifdef FUZZY_BORDER
+            GC gc1 = state->gcs[cell->state];
+            GC gc2 = ((cell->state + 2) < state->ticks
+                      ? state->gcs[cell->state + 2]
+                      : 0);
+            GC gc3 = (gc2 ? gc2 : gc1);
+            if (gc3)
+              XCopyPlane (state->dpy, cell->p_char->pixmap, state->window, gc3,
+                          0, 0, width, height, tx, ty, 1L);
+            if (gc2)
+              {
+                XSetClipMask (state->dpy, gc1, cell->p_char->pixmap2);
+                XSetClipOrigin (state->dpy, gc1, tx, ty);
+                XFillRectangle (state->dpy, state->window, gc1,
+                                tx, ty, width, height);
+                XSetClipMask (state->dpy, gc1, None);
+              }
+#else /* !FUZZY_BORDER */
+
+            XCopyPlane (state->dpy,
+                        cell->p_char->pixmap, state->window,
+                        state->gcs[cell->state],
+                        0, 0, width, height, tx, ty, 1L);
+
+#endif /* !FUZZY_BORDER */
+          }
+
+        cell->changed = False;
+      }
+}
+
+
+static void
+run_phosphor (p_state *state)
+{
+  update_display (state, True);
+  decay (state);
+  drain_input (state);
+}
+
+\f
+/* Subprocess.
+ */
+
+static void
+subproc_cb (XtPointer closure, int *source, XtInputId *id)
+{
+  p_state *state = (p_state *) closure;
+  state->input_available_p = True;
+}
+
+
+static void
+launch_text_generator (p_state *state)
+{
+  char *oprogram = get_string_resource ("program", "Program");
+  char *program = (char *) malloc (strlen (oprogram) + 10);
+
+  strcpy (program, "( ");
+  strcat (program, oprogram);
+  strcat (program, " ) 2>&1");
+
+  if ((state->pipe = popen (program, "r")))
+    {
+      state->pipe_id =
+        XtAppAddInput (app, fileno (state->pipe),
+                       (XtPointer) (XtInputReadMask | XtInputExceptMask),
+                       subproc_cb, (XtPointer) state);
+    }
+  else
+    {
+      perror (program);
+    }
+}
+
+
+static void
+relaunch_generator_timer (XtPointer closure, XtIntervalId *id)
+{
+  p_state *state = (p_state *) closure;
+  launch_text_generator (state);
+}
+
+
+static void
+drain_input (p_state *state)
+{
+  if (state->input_available_p)
+    {
+      unsigned char s[2];
+      int n = read (fileno (state->pipe), (void *) s, 1);
+      if (n == 1)
+        {
+          print_char (state, s[0]);
+        }
+      else
+        {
+          XtRemoveInput (state->pipe_id);
+          state->pipe_id = 0;
+          pclose (state->pipe);
+          state->pipe = 0;
+
+          if (state->cursor_x != 0)    /* break line if unbroken */
+            print_char (state, '\n');  /* blank line */
+          print_char (state, '\n');
+
+          /* Set up a timer to re-launch the subproc in a bit. */
+          XtAppAddTimeOut (app, state->subproc_relaunch_delay,
+                           relaunch_generator_timer,
+                           (XtPointer) state);
+        }
+        
+      state->input_available_p = False;
+    }
+}
+
+
+\f
+char *progclass = "Phosphor";
+
+char *defaults [] = {
+  ".background:                   Black",
+  ".foreground:                   Green",
+  "*fadeForeground:       DarkGreen",
+  "*flareForeground:      White",
+  "*font:                 fixed",
+  "*scale:                6",
+  "*ticks:                20",
+  "*delay:                50000",
+  "*cursor:               333",
+  "*program:            " ZIPPY_PROGRAM,
+  "*relaunch:             5",
+  0
+};
+
+XrmOptionDescRec options [] = {
+  { "-font",           ".font",                XrmoptionSepArg, 0 },
+  { "-scale",          ".scale",               XrmoptionSepArg, 0 },
+  { "-ticks",          ".ticks",               XrmoptionSepArg, 0 },
+  { "-delay",          ".delay",               XrmoptionSepArg, 0 },
+  { "-program",                ".program",             XrmoptionSepArg, 0 },
+  { 0, 0, 0, 0 }
+};
+
+
+void
+screenhack (Display *dpy, Window window)
+{
+  int delay = get_integer_resource ("delay", "Integer");
+  p_state *state = init_phosphor (dpy, window);
+
+  clear (state);
+
+  while (1)
+    {
+      run_phosphor (state);
+      XSync (dpy, False);
+      screenhack_handle_events (dpy);
+
+      if (XtAppPending (app) & (XtIMTimer|XtIMAlternateInput))
+        XtAppProcessEvent (app, XtIMTimer|XtIMAlternateInput);
+
+      if (delay) usleep (delay);
+    }
+}
diff --git a/hacks/pyro.c b/hacks/pyro.c
new file mode 100644 (file)
index 0000000..ddace39
--- /dev/null
@@ -0,0 +1,249 @@
+/* xscreensaver, Copyright (c) 1992, 1994, 1996, 1998
+ *  Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software 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.  No representations are made about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or 
+ * implied warranty.
+ */
+
+/* Draw some fireworks.  Inspired from TI Explorer Lisp code by 
+   John S. Pezaris <pz@hx.lcs.mit.edu>
+ */
+
+#include "screenhack.h"
+
+struct projectile {
+  int x, y;    /* position */
+  int dx, dy;  /* velocity */
+  int decay;
+  int size;
+  int fuse;
+  Bool primary;
+  Bool dead;
+  XColor color;
+  struct projectile *next_free;
+};
+
+static struct projectile *projectiles, *free_projectiles;
+
+static struct projectile *
+get_projectile (void)
+{
+  struct projectile *p;
+  if (free_projectiles)
+    {
+      p = free_projectiles;
+      free_projectiles = p->next_free;
+      p->next_free = 0;
+      p->dead = False;
+      return p;
+    }
+  else
+    return 0;
+}
+
+static void
+free_projectile (struct projectile *p)
+{
+  p->next_free = free_projectiles;
+  free_projectiles = p;
+  p->dead = True;
+}
+
+static void
+launch (int xlim, int ylim, int g,
+       Display *dpy, Colormap cmap)
+{
+  struct projectile *p = get_projectile ();
+  int x, dx, xxx;
+  if (! p) return;
+
+  do {
+    x = (random () % xlim);
+    dx = 30000 - (random () % 60000);
+    xxx = x + (dx * 200);
+  } while (xxx <= 0 || xxx >= xlim);
+
+  p->x = x;
+  p->y = ylim;
+  p->dx = dx;
+  p->size = 8000;
+  p->decay = 0;
+  p->dy = (random () % 4000) - 13000;
+  p->fuse = ((((random () % 500) + 500) * abs (p->dy / g)) / 1000);
+  p->primary = True;
+
+  if (! mono_p)
+    {
+      hsv_to_rgb (random () % 360, 1.0, 1.0,
+                 &p->color.red, &p->color.green, &p->color.blue);
+      p->color.flags = DoRed | DoGreen | DoBlue;
+      if (!XAllocColor (dpy, cmap, &p->color))
+       {
+         p->color.pixel = WhitePixel (dpy, DefaultScreen (dpy));
+         p->color.red = p->color.green = p->color.blue = 0xFFFF;
+       }
+    }
+}
+
+static struct projectile *
+shrapnel (struct projectile *parent, Display *dpy, Colormap cmap)
+{
+  struct projectile *p = get_projectile ();
+  if (! p) return 0;
+  p->x = parent->x;
+  p->y = parent->y;
+  p->dx = (random () % 5000) - 2500 + parent->dx;
+  p->dy = (random () % 5000) - 2500 + parent->dy;
+  p->decay = (random () % 50) - 60;
+  p->size = (parent->size * 2) / 3;
+  p->fuse = 0;
+  p->primary = False;
+
+  p->color = parent->color;
+  if (! mono_p)
+    XAllocColor (dpy, cmap, &p->color); /* dup the lock */
+  
+  return p;
+}
+
+static GC draw_gc, erase_gc;
+static unsigned int default_fg_pixel;
+
+static int how_many, frequency, scatter;
+
+static Colormap
+init_pyro (Display *dpy, Window window)
+{
+  int i;
+  Colormap cmap;
+  XGCValues gcv;
+  XWindowAttributes xgwa;
+  XGetWindowAttributes (dpy, window, &xgwa);
+  cmap = xgwa.colormap;
+  how_many = get_integer_resource ("count", "Integer");
+  frequency = get_integer_resource ("frequency", "Integer");
+  scatter = get_integer_resource ("scatter", "Integer");
+  if (how_many <= 0) how_many = 100;
+  if (frequency <= 0) frequency = 30;
+  if (scatter <= 0) scatter = 20;
+  projectiles = 0;
+  free_projectiles = 0;
+  projectiles = (struct projectile *)
+    calloc (how_many, sizeof (struct projectile));
+  for (i = 0; i < how_many; i++)
+    free_projectile (&projectiles [i]);
+  gcv.foreground = default_fg_pixel =
+    get_pixel_resource ("foreground", "Foreground", dpy, cmap);
+  draw_gc = XCreateGC (dpy, window, GCForeground, &gcv);
+  gcv.foreground = get_pixel_resource ("background", "Background", dpy, cmap);
+  erase_gc = XCreateGC (dpy, window, GCForeground, &gcv);
+  XClearWindow (dpy, window);
+  return cmap;
+}
+
+static void
+pyro (Display *dpy, Window window, Colormap cmap)
+{
+  XWindowAttributes xgwa;
+  static int xlim, ylim, real_xlim, real_ylim;
+  int g = 100;
+  int i;
+
+  if ((random () % frequency) == 0)
+    {
+      XGetWindowAttributes (dpy, window, &xgwa);
+      real_xlim = xgwa.width;
+      real_ylim = xgwa.height;
+      xlim = real_xlim * 1000;
+      ylim = real_ylim * 1000;
+      launch (xlim, ylim, g, dpy, cmap);
+    }
+
+  XSync (dpy, False);
+  screenhack_handle_events (dpy);
+  usleep (10000);
+
+  for (i = 0; i < how_many; i++)
+    {
+      struct projectile *p = &projectiles [i];
+      int old_x, old_y, old_size;
+      int size, x, y;
+      if (p->dead) continue;
+      old_x = p->x >> 10;
+      old_y = p->y >> 10;
+      old_size = p->size >> 10;
+      size = (p->size += p->decay) >> 10;
+      x = (p->x += p->dx) >> 10;
+      y = (p->y += p->dy) >> 10;
+      p->dy += (p->size >> 6);
+      if (p->primary) p->fuse--;
+
+      /* erase old one */
+      XFillRectangle (dpy, window, erase_gc, old_x, old_y,
+                     old_size, old_size);
+
+      if ((p->primary ? (p->fuse > 0) : (p->size > 0)) &&
+         x < real_xlim &&
+         y < real_ylim &&
+         x > 0 &&
+         y > 0)
+       {
+         if (mono_p || p->primary)
+           XSetForeground (dpy, draw_gc, default_fg_pixel);
+         else
+           XSetForeground (dpy, draw_gc, p->color.pixel);
+
+         if /*(p->primary)*/ (size > 2)
+           XFillArc (dpy, window, draw_gc, x, y, size, size, 0, 360*64);
+         else
+           XFillRectangle (dpy, window, draw_gc, x, y, size, size);
+       }
+      else
+       {
+         free_projectile (p);
+         if (! mono_p)
+           if (p->color.pixel != WhitePixel (dpy, DefaultScreen (dpy)))
+             XFreeColors (dpy, cmap, &p->color.pixel, 1, 0);
+       }
+
+      if (p->primary && p->fuse <= 0)
+       {
+         int j = (random () % scatter) + (scatter/2);
+         while (j--)
+           shrapnel (p, dpy, cmap);
+       }
+    }
+}
+
+\f
+char *progclass = "Pyro";
+
+char *defaults [] = {
+  ".background:        black",
+  ".foreground:        white",
+  "*count:     100",
+  "*frequency: 30",
+  "*scatter:   20",
+  "*geometry:  800x500",
+  0
+};
+
+XrmOptionDescRec options [] = {
+  { "-count",          ".count",       XrmoptionSepArg, 0 },
+  { "-frequency",      ".frequency",   XrmoptionSepArg, 0 },
+  { "-scatter",                ".scatter",     XrmoptionSepArg, 0 },
+  { 0, 0, 0, 0 }
+};
+
+void
+screenhack (Display *dpy, Window window)
+{
+  Colormap cmap = init_pyro (dpy, window);
+  while (1)
+    pyro (dpy, window, cmap);
+}
diff --git a/hacks/pyro.man b/hacks/pyro.man
new file mode 100644 (file)
index 0000000..106fc8a
--- /dev/null
@@ -0,0 +1,60 @@
+.TH XScreenSaver 1 "13-aug-92" "X Version 11"
+.SH NAME
+pyro - simulate fireworks
+.SH SYNOPSIS
+.B pyro
+[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-count \fIinteger\fP] [\-frequency \fIinteger\fP] [\-scatter \fIinteger\fP]
+.SH DESCRIPTION
+The \fIpyro\fP program simulates fireworks, in a way similar to a Macintosh
+program of the same name.
+.SH OPTIONS
+.I pyro
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window.  This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-mono 
+If on a color display, pretend we're on a monochrome display.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use.  Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-count \fIinteger\fP
+How many particles should be allowed on the screen at once.  Default 100.
+.TP 8
+.B \-frequency \fIinteger\fP
+How often new missiles should launch.  Default 30.
+.TP 8
+.B \-scatter \fIinteger\fP
+How many particles should appear when a missile explodes.  Default 20.
+The actual number used is between \fIN\fP and \fIN+(N/2)\fP.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 1992 by Jamie Zawinski.  Permission to use, copy, modify, 
+distribute, and sell this software 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.  No representations are made about the 
+suitability of this software for any purpose.  It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Jamie Zawinski <jwz@jwz.org>, 13-aug-92.
diff --git a/hacks/qix.c b/hacks/qix.c
new file mode 100644 (file)
index 0000000..44c85ec
--- /dev/null
@@ -0,0 +1,523 @@
+/* xscreensaver, Copyright (c) 1992, 1995, 1996, 1997, 1998
+ *  Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software 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.  No representations are made about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or 
+ * implied warranty.
+ */
+
+#include "screenhack.h"
+#include "alpha.h"
+#include <stdio.h>
+
+#define MAXPOLY        16
+#define SCALE  6
+
+struct qpoint {
+  int x, y;
+  int dx, dy;
+};
+
+struct qline {
+  struct qpoint *p;
+  XColor color;
+  Bool dead;
+};
+
+struct qix {
+  int id;
+  int fp;
+  int nlines;
+  int npoly;
+  struct qline *lines;
+};
+
+static GC draw_gc, erase_gc;
+static unsigned int default_fg_pixel;
+static long maxx, maxy, max_spread, max_size;
+static int color_shift;
+static Bool random_p, solid_p, xor_p, transparent_p, gravity_p;
+static int delay;
+static int count;
+static Colormap cmap;
+static int npoly;
+static Bool additive_p;
+static Bool cmap_p;
+
+
+static GC *gcs[2];
+
+static void
+get_geom (Display *dpy, Window window)
+{
+  XWindowAttributes xgwa;
+  XGetWindowAttributes (dpy, window, &xgwa);
+  maxx = ((long)(xgwa.width+1)<<SCALE)  - 1;
+  maxy = ((long)(xgwa.height+1)<<SCALE) - 1;
+}
+
+static struct qix *
+init_one_qix (Display *dpy, Window window, int nlines, int npoly)
+{
+  int i, j;
+  struct qix *qix = (struct qix *) calloc (1, sizeof (struct qix));
+  qix->nlines = nlines;
+  qix->lines = (struct qline *) calloc (qix->nlines, sizeof (struct qline));
+  qix->npoly = npoly;
+  for (i = 0; i < qix->nlines; i++)
+    qix->lines[i].p = (struct qpoint *)
+      calloc(qix->npoly, sizeof(struct qpoint));
+
+  if (!mono_p && !transparent_p)
+    {
+      hsv_to_rgb (random () % 360, frand (1.0), frand (0.5) + 0.5,
+                 &qix->lines[0].color.red, &qix->lines[0].color.green,
+                 &qix->lines[0].color.blue);
+      if (!XAllocColor (dpy, cmap, &qix->lines[0].color))
+       {
+         qix->lines[0].color.pixel = default_fg_pixel;
+         XQueryColor (dpy, cmap, &qix->lines[0].color);
+         if (!XAllocColor (dpy, cmap, &qix->lines[0].color))
+           abort ();
+       }
+    }
+
+  if (max_size == 0)
+    {
+      for (i = 0; i < qix->npoly; i++)
+       {
+         qix->lines[0].p[i].x = random () % maxx;
+         qix->lines[0].p[i].y = random () % maxy;
+       }
+    }
+  else
+    {
+      /*assert(qix->npoly == 2);*/
+      qix->lines[0].p[0].x = random () % maxx;
+      qix->lines[0].p[0].y = random () % maxy;
+      qix->lines[0].p[1].x = qix->lines[0].p[0].x + (random () % (max_size/2));
+      qix->lines[0].p[1].y = qix->lines[0].p[0].y + (random () % (max_size/2));
+      if (qix->lines[0].p[1].x > maxx) qix->lines[0].p[1].x = maxx;
+      if (qix->lines[0].p[1].y > maxy) qix->lines[0].p[1].y = maxy;
+    }
+
+  for (i = 0; i < qix->npoly; i++)
+    {
+      qix->lines[0].p[i].dx = (random () % (max_spread + 1)) - (max_spread /2);
+      qix->lines[0].p[i].dy = (random () % (max_spread + 1)) - (max_spread /2);
+    }
+  qix->lines[0].dead = True;
+
+  for (i = 1; i < qix->nlines; i++)
+    {
+      for(j=0; j<qix->npoly; j++)
+       qix->lines[i].p[j] = qix->lines[0].p[j];
+      qix->lines[i].color = qix->lines[0].color;
+      qix->lines[i].dead = qix->lines[0].dead;
+  
+      if (!mono_p && !transparent_p)
+       if (!XAllocColor (dpy, cmap, &qix->lines[i].color))
+         abort ();
+    }
+  return qix;
+}
+
+
+
+
+static struct qix **
+init_qix (Display *dpy, Window window)
+{
+  int nlines;
+  struct qix **qixes;
+  XGCValues gcv;
+  XWindowAttributes xgwa;
+  XGetWindowAttributes (dpy, window, &xgwa);
+  cmap = xgwa.colormap;
+  count = get_integer_resource ("count", "Integer");
+  if (count <= 0) count = 1;
+  nlines = get_integer_resource ("segments", "Integer");
+  if (nlines <= 0) nlines = 20;
+  npoly = get_integer_resource("poly", "Integer");
+  if (npoly <= 2) npoly = 2;
+  if (npoly > MAXPOLY) npoly = MAXPOLY;
+  get_geom (dpy, window);
+  max_spread = get_integer_resource ("spread", "Integer");
+  if (max_spread <= 0) max_spread = 10;
+  max_spread <<= SCALE;
+  max_size = get_integer_resource ("size", "Integer");
+  if (max_size < 0) max_size = 0;
+  max_size <<= SCALE;
+  random_p = get_boolean_resource ("random", "Boolean");
+  solid_p = get_boolean_resource ("solid", "Boolean");
+  xor_p = get_boolean_resource ("xor", "Boolean");
+  transparent_p = get_boolean_resource ("transparent", "Boolean");
+  gravity_p = get_boolean_resource("gravity", "Boolean");
+  delay = get_integer_resource ("delay", "Integer");
+  color_shift = get_integer_resource ("colorShift", "Integer");
+  if (color_shift < 0 || color_shift >= 360) color_shift = 5;
+  if (delay < 0) delay = 0;
+
+  /* Clear up ambiguities regarding npoly */
+  if (solid_p) 
+    {
+      if (npoly != 2)
+       fprintf(stderr, "%s: Can't have -solid and -poly; using -poly 2\n",
+               progname);
+      npoly = 2;
+    }      
+  if (npoly > 2)
+    {
+      if (max_size)
+       fprintf(stderr, "%s: Can't have -poly and -size; using -size 0\n",
+               progname);
+      max_size = 0;
+    }
+
+  if (count == 1 && transparent_p)
+    transparent_p = False; /* it's a no-op */
+
+  if (transparent_p && CellsOfScreen (DefaultScreenOfDisplay (dpy)) <= 2)
+    {
+      fprintf (stderr, "%s: -transparent only works on color displays.\n",
+              progname);
+      transparent_p = False;
+    }
+
+  if (xor_p && !transparent_p)
+    mono_p = True;
+
+  gcs[0] = gcs[1] = 0;
+  gcv.foreground = default_fg_pixel =
+    get_pixel_resource ("foreground", "Foreground", dpy, cmap);
+
+  additive_p = get_boolean_resource ("additive", "Boolean");
+  cmap_p = has_writable_cells (xgwa.screen, xgwa.visual);
+
+  if (transparent_p)
+    {
+      unsigned long *plane_masks = 0;
+      unsigned long base_pixel;
+      int nplanes = count;
+      int i;
+
+      allocate_alpha_colors (xgwa.screen, xgwa.visual, cmap,
+                             &nplanes, additive_p, &plane_masks,
+                            &base_pixel);
+
+      if (nplanes <= 1)
+       {
+         fprintf (stderr,
+         "%s: couldn't allocate any color planes; turning -transparent off.\n",
+                  progname);
+         transparent_p = False;
+         if (xor_p)
+           goto NON_TRANSPARENT_XOR;
+         else
+           goto NON_TRANSPARENT;
+       }
+      else if (nplanes != count)
+       {
+         fprintf (stderr,
+                  "%s: only allocated %d color planes (instead of %d).\n",
+                  progname, nplanes, count);
+         count = nplanes;
+       }
+
+      gcs[0] = (GC *) malloc (count * sizeof (GC));
+      gcs[1] = xor_p ? gcs[0] : (GC *) malloc (count * sizeof (GC));
+
+
+      for (i = 0; i < count; i++)
+       {
+         gcv.plane_mask = plane_masks [i];
+         gcv.foreground = ~0;
+
+/*  argh, I'm not sure how to make "-subtractive" work in truecolor...
+          if (!cmap_p && !additive_p)
+            gcv.function = GXclear;
+ */
+
+         if (xor_p)
+           {
+             gcv.function = GXxor;
+             gcs [0][i] = XCreateGC (dpy, window,
+                                     GCForeground|GCFunction|GCPlaneMask,
+                                     &gcv);
+           }
+         else
+           {
+             gcs [0][i] = XCreateGC (dpy, window, GCForeground|GCPlaneMask,
+                                     &gcv);
+             gcv.foreground = 0;
+             gcs [1][i] = XCreateGC (dpy, window, GCForeground|GCPlaneMask,
+                                     &gcv);
+           }
+       }
+
+      XSetWindowBackground (dpy, window, base_pixel);
+      XClearWindow (dpy, window);
+    }
+  else if (xor_p)
+    {
+    NON_TRANSPARENT_XOR:
+      gcv.function = GXxor;
+      gcv.foreground =
+       (default_fg_pixel ^ get_pixel_resource ("background", "Background",
+                                               dpy, cmap));
+      draw_gc = erase_gc = XCreateGC(dpy,window,GCForeground|GCFunction,&gcv);
+    }
+  else
+    {
+    NON_TRANSPARENT:
+      draw_gc = XCreateGC (dpy, window, GCForeground, &gcv);
+      gcv.foreground = get_pixel_resource ("background", "Background",
+                                          dpy, cmap);
+      erase_gc = XCreateGC (dpy, window, GCForeground, &gcv);
+    }
+
+  qixes = (struct qix **) malloc ((count + 1) * sizeof (struct qix *));
+  qixes [count] = 0;
+  while (count--)
+    {
+      qixes [count] = init_one_qix (dpy, window, nlines, npoly);
+      qixes [count]->id = count;
+    }
+  return qixes;
+}
+
+static void
+free_qline (Display *dpy, Window window, Colormap cmap,
+           struct qline *qline,
+           struct qline *prev,
+           struct qix *qix)
+{
+  int i;
+  if (qline->dead || !prev)
+    ;
+  else if (solid_p)
+    {
+      XPoint points [4];
+      /*assert(qix->npoly == 2);*/
+      points [0].x = qline->p[0].x >> SCALE; 
+      points [0].y = qline->p[0].y >> SCALE;
+      points [1].x = qline->p[1].x >> SCALE;
+      points [1].y = qline->p[1].y >> SCALE;
+      points [2].x = prev->p[1].x >> SCALE;
+      points [2].y = prev->p[1].y >> SCALE;
+      points [3].x = prev->p[0].x >> SCALE;
+      points [3].y = prev->p[0].y >> SCALE;
+      XFillPolygon (dpy, window, (transparent_p ? gcs[1][qix->id] : erase_gc),
+                   points, 4, Complex, CoordModeOrigin);
+    }
+  else
+    {
+      /*  XDrawLine (dpy, window, (transparent_p ? gcs[1][qix->id] : erase_gc),
+                    qline->p1.x, qline->p1.y, qline->p2.x, qline->p2.y);*/
+      static XPoint points[MAXPOLY+1];
+      for(i = 0; i < qix->npoly; i++)
+       {
+         points[i].x = qline->p[i].x >> SCALE;
+         points[i].y = qline->p[i].y >> SCALE;
+       }
+      points[qix->npoly] = points[0];
+      XDrawLines(dpy, window, (transparent_p ? gcs[1][qix->id] : erase_gc),
+                points, qix->npoly+1, CoordModeOrigin);
+    }
+
+  if (!mono_p && !transparent_p)
+    XFreeColors (dpy, cmap, &qline->color.pixel, 1, 0);
+
+  qline->dead = True;
+}
+
+static void
+add_qline (Display *dpy, Window window, Colormap cmap,
+          struct qline *qline,
+          struct qline *prev_qline,
+          struct qix *qix)
+{
+  int i;
+
+  for(i=0; i<qix->npoly; i++)
+    qline->p[i] = prev_qline->p[i];
+  qline->color = prev_qline->color;
+  qline->dead = prev_qline->dead;
+
+#define wiggle(point,delta,max)                                                \
+  if (random_p) delta += (random () % (1 << (SCALE+1))) - (1 << SCALE);        \
+  if (delta > max_spread) delta = max_spread;                          \
+  else if (delta < -max_spread) delta = -max_spread;                   \
+  point += delta;                                                      \
+  if (point < 0) point = 0, delta = -delta, point += delta<<1;         \
+  else if (point > max) point = max, delta = -delta, point += delta<<1;
+
+  if (gravity_p)
+    for(i=0; i<qix->npoly; i++)
+      qline->p[i].dy += 3;
+
+  for (i = 0; i < qix->npoly; i++)
+    {
+      wiggle (qline->p[i].x, qline->p[i].dx, maxx);
+      wiggle (qline->p[i].y, qline->p[i].dy, maxy);
+    }
+
+  if (max_size)
+    {
+      /*assert(qix->npoly == 2);*/
+      if (qline->p[0].x - qline->p[1].x > max_size)
+       qline->p[0].x = qline->p[1].x + max_size
+         - (random_p ? random() % max_spread : 0);
+      else if (qline->p[1].x - qline->p[0].x > max_size)
+       qline->p[1].x = qline->p[0].x + max_size
+         - (random_p ? random() % max_spread : 0);
+      if (qline->p[0].y - qline->p[1].y > max_size)
+       qline->p[0].y = qline->p[1].y + max_size
+         - (random_p ? random() % max_spread : 0);
+      else if (qline->p[1].y - qline->p[0].y > max_size)
+       qline->p[1].y = qline->p[0].y + max_size
+         - (random_p ? random() % max_spread : 0);
+    }
+
+  if (!mono_p && !transparent_p)
+    {
+      XColor desired;
+
+      int h;
+      double s, v;
+      rgb_to_hsv (qline->color.red, qline->color.green, qline->color.blue,
+                 &h, &s, &v);
+      h = (h + color_shift) % 360;
+      hsv_to_rgb (h, s, v,
+                 &qline->color.red, &qline->color.green, &qline->color.blue);
+
+      qline->color.flags = DoRed | DoGreen | DoBlue;
+      desired = qline->color;
+      if (XAllocColor (dpy, cmap, &qline->color))
+       {
+         /* XAllocColor returns the actual RGB that the hardware let us
+            allocate.  Restore the requested values into the XColor struct
+            so that limited-resolution hardware doesn't cause the cycle to
+            get "stuck". */
+         qline->color.red = desired.red;
+         qline->color.green = desired.green;
+         qline->color.blue = desired.blue;
+       }
+      else
+       {
+         qline->color = prev_qline->color;
+         if (!XAllocColor (dpy, cmap, &qline->color))
+           abort (); /* same color should work */
+       }
+      XSetForeground (dpy, draw_gc, qline->color.pixel);
+    }
+  if (! solid_p)
+    {
+      /*  XDrawLine (dpy, window, (transparent_p ? gcs[0][qix->id] : draw_gc),
+                    qline->p1.x, qline->p1.y, qline->p2.x, qline->p2.y);*/
+      static XPoint points[MAXPOLY+1];
+      for (i = 0; i < qix->npoly; i++)
+       {
+         points[i].x = qline->p[i].x >> SCALE;
+         points[i].y = qline->p[i].y >> SCALE;
+       }
+      points[qix->npoly] = points[0];
+      XDrawLines(dpy, window, (transparent_p ? gcs[0][qix->id] : draw_gc),
+                points, qix->npoly+1, CoordModeOrigin);
+    }
+  else if (!prev_qline->dead)
+    {
+      XPoint points [4];
+      points [0].x = qline->p[0].x >> SCALE;
+      points [0].y = qline->p[0].y >> SCALE;
+      points [1].x = qline->p[1].x >> SCALE;
+      points [1].y = qline->p[1].y >> SCALE;
+      points [2].x = prev_qline->p[1].x >> SCALE;
+      points [2].y = prev_qline->p[1].y >> SCALE;
+      points [3].x = prev_qline->p[0].x >> SCALE;
+      points [3].y = prev_qline->p[0].y >> SCALE;
+      XFillPolygon (dpy, window, (transparent_p ? gcs[0][qix->id] : draw_gc),
+                   points, 4, Complex, CoordModeOrigin);
+    }
+
+  qline->dead = False;
+}
+
+static void
+qix1 (Display *dpy, Window window, struct qix *qix)
+{
+  int ofp = qix->fp - 1;
+  static int gtick = 0;
+  if (ofp < 0) ofp = qix->nlines - 1;
+  if (gtick++ == 500)
+    get_geom (dpy, window), gtick = 0;
+  free_qline (dpy, window, cmap, &qix->lines [qix->fp],
+             &qix->lines[(qix->fp + 1) % qix->nlines], qix);
+  add_qline (dpy, window, cmap, &qix->lines[qix->fp], &qix->lines[ofp], qix);
+  if ((++qix->fp) >= qix->nlines)
+    qix->fp = 0;
+}
+
+\f
+char *progclass = "Qix";
+
+char *defaults [] = {
+  ".background:        black",
+  ".foreground:        white",
+  "*count:     1",
+  "*segments:  50",
+  "*poly:      2",
+  "*spread:    8",
+  "*size:      0",
+  "*colorShift:        3",
+  "*solid:     false",
+  "*delay:     10000",
+  "*random:    true",
+  "*xor:       false",
+  "*transparent:false",
+  "*gravity:   false",
+  "*additive:  true",
+  0
+};
+
+XrmOptionDescRec options [] = {
+  { "-count",          ".count",       XrmoptionSepArg, 0 },
+  { "-segments",       ".segments",    XrmoptionSepArg, 0 },
+  { "-poly",           ".poly",        XrmoptionSepArg, 0 },
+  { "-spread",         ".spread",      XrmoptionSepArg, 0 },
+  { "-size",           ".size",        XrmoptionSepArg, 0 },
+  { "-delay",          ".delay",       XrmoptionSepArg, 0 },
+  { "-color-shift",    ".colorShift",  XrmoptionSepArg, 0 },
+  { "-random",         ".random",      XrmoptionNoArg, "true" },
+  { "-linear",         ".random",      XrmoptionNoArg, "false" },
+  { "-solid",          ".solid",       XrmoptionNoArg, "true" },
+  { "-hollow",         ".solid",       XrmoptionNoArg, "false" },
+  { "-xor",            ".xor",         XrmoptionNoArg, "true" },
+  { "-no-xor",         ".xor",         XrmoptionNoArg, "false" },
+  { "-transparent",    ".transparent", XrmoptionNoArg, "true" },
+  { "-non-transparent",        ".transparent", XrmoptionNoArg, "false" },
+  { "-gravity",                ".gravity",     XrmoptionNoArg, "true" },
+  { "-no-gravity",     ".gravity",     XrmoptionNoArg, "false" },
+  { "-additive",       ".additive",    XrmoptionNoArg, "true" },
+  { "-subtractive",    ".additive",    XrmoptionNoArg, "false" },
+  { 0, 0, 0, 0 }
+};
+
+void
+screenhack (Display *dpy, Window window)
+{
+  struct qix **q1 = init_qix (dpy, window);
+  struct qix **qn;
+  while (1)
+    for (qn = q1; *qn; qn++)
+      {
+       qix1 (dpy, window, *qn);
+       XSync (dpy, False);
+        screenhack_handle_events (dpy);
+       if (delay) usleep (delay);
+      }
+}
diff --git a/hacks/qix.man b/hacks/qix.man
new file mode 100644 (file)
index 0000000..90dd67d
--- /dev/null
@@ -0,0 +1,128 @@
+.TH XScreenSaver 1 "27-Apr-97" "X Version 11"
+.SH NAME
+qix - bounce colored lines around a window
+.SH SYNOPSIS
+.B qix
+[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-segments \fIint\fP] [\-spread \fIpixels\fP] [\-size \fIpixels\fP] [\-count \fIint\fP] [\-color-shift \fIdegrees\fP] [\-delay \fIusecs\fP] [\-random] [\-linear] [\-solid] [\-hollow] [\-xor] [\-no\-xor] [\-transparent] [\-non\-transparent] [\-additive] [\-subtractive] [\-poly \fIint\fP] [\-gravity] [\-no\-gravity]
+.SH DESCRIPTION
+The \fIqix\fP program bounces a series of line segments around its window.
+This is truly the swiss army chainsaw of qix programs.  If you know of one
+with more display modes, I want to know about it.
+.SH OPTIONS
+.I qix
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window.  This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-mono 
+If on a color display, pretend we're on a monochrome display.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use.  Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-segments \fIinteger\fP
+How many line segments should be drawn.  Default 50.
+.TP 8
+.B \-spread \fIinteger\fP
+How far apart the endpoints of one segment should be from the next.
+Default 8.
+.TP 8
+.B \-size \fIinteger\fP
+The maximum distance one endpoint of a segment is allowed to be from
+the opposite end of that segment.  Default 0, meaning unlimited.
+.TP 8
+.B \-count \fIinteger\fP
+How many qixes to draw.  Default 1.
+.TP 8
+.B \-color\-shift \fIdegrees\fP
+If on a color display, the color of the line segments will cycle through
+the spectrum.  This specifies how far the hue of each segment should be
+from the next, in degrees on the HSV wheel.  Default 3.
+.TP 8
+.B \-delay \fImicroseconds\fP
+How much of a delay should be introduced between steps of the animation.
+Default 25000, or about 0.025 seconds.
+.TP 8
+.B \-random
+The \fIqix\fP will wander around the screen semi-randomly.  This is the
+default.
+.TP 8
+.B \-linear
+The opposite of \fI\-random\fP: the \fIqix\fP will travel in straight lines
+until it reaches a wall, and then it will bounce.
+.TP 8
+.B \-solid
+If this is specified, then the area between the line segments will be filled
+in with the appropriate color, instead of the \fIqix\fP simply being composed
+of one-pixel-wide line segments.  This option looks really good in color.
+.TP 8
+.B \-hollow
+The opposite of \fI\-solid\fP; this is the default.
+.TP 8
+.B \-xor
+If this is specified, then qix segments will be drawn and erased with xor,
+instead of being drawn in some color and erased in the background color.
+This implies \fI\-mono\fP, in that only two colors can be used.
+.TP 8
+.B \-transparent
+If this is specified, and \fI\-count\fP is greater than 1, then each qix
+will be drawn in one color, and when they overlap, the colors will be mixed.
+This looks best in conjuction with \fI\-solid\fP.
+.TP 8
+.B \-non\-transparent
+Turns off \fI\-transparent\fP.
+.TP 8
+.B \-additive
+If \fI\-transparent\fP is specified, then this option means that the colors
+will be mixed using an additive color model, as if the qixes were projected
+light.  This is the default.
+.TP 8
+.B \-subtractive
+If \fI\-transparent\fP is specified, then this option means that the
+colors will be mixed using a subtractive color model, as if the qixes were
+translucent filters.
+.TP 8
+.B \-poly \fIint\fP
+How many vertices each qix-line should have: the default is 2, meaning the
+traditional qix line shape.  Three will yield triangles, and so on.
+.TP 8
+.B \-gravity
+.TP 8
+.B \-no\-gravity
+Whether there should be downward attraction.  For example, the
+options
+.B \-gravity \-linear
+will make everything move in nice smooth parabolas.
+Gravity is off by default.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 1992 by Jamie Zawinski.  Permission to use, copy, modify, 
+distribute, and sell this software 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.  No representations are made about the 
+suitability of this software for any purpose.  It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Jamie Zawinski <jwz@jwz.org>, 13-aug-92.
+
+Thanks to Ariel Scolnicov for the \-poly and \-gravity options.
diff --git a/hacks/rd-bomb.c b/hacks/rd-bomb.c
new file mode 100644 (file)
index 0000000..e380c27
--- /dev/null
@@ -0,0 +1,582 @@
+/* xscreensaver, Copyright (c) 1992, 1995, 1997, 1998, 1999
+ *  Jamie Zawinski <jwz@jwz.org>
+ *
+ *  reaction/diffusion textures
+ *  Copyright (c) 1997 Scott Draves spot@transmeta.com
+ *  this code is derived from Bomb
+ *  see http://www.cs.cmu.edu/~spot/bomb.html
+ *
+ * Permission to use, copy, modify, distribute, and sell this software 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.  No representations are made about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or 
+ * implied warranty.
+ *
+ * And remember: X Windows is to graphics hacking as roman numerals are to
+ * the square root of pi.
+ */
+
+#include <math.h>
+
+#include "screenhack.h"
+#include <X11/Xutil.h>
+
+#ifdef HAVE_XSHM_EXTENSION
+# include "xshm.h"
+#endif /* HAVE_XSHM_EXTENSION */
+
+/* costs ~6% speed */
+#define dither_when_mapped 1
+
+static int verbose;
+static int ncolors = 0;
+static XColor *colors = 0;
+static Display *display;
+static Visual *visual;
+#if dither_when_mapped
+static unsigned char *mc = 0;
+#endif
+static Colormap cmap = 0;
+static Window window;
+static int mapped;
+static int pdepth;
+static void random_colors(void);
+
+/* -----------------------------------------------------------
+   pixel hack, 8-bit pixel grid, first/next frame interface
+
+   pixack_init(int *size_h, int *size_v)
+   pixack_frame(char *pix_buf)
+   */
+
+
+#define bps 16
+#define mx ((1<<16)-1)
+
+/* you can replace integer mults wish shift/adds with these,
+   but it doesn't help on my 586 */
+#define x5(n) ((n<<2)+n)
+#define x7(n) ((n<<3)-n)
+
+/* why strip bit? */
+#define R (ya_random()&((1<<30)-1))
+
+static int frame = 0, epoch_time;
+static ushort *r1, *r2, *r1b, *r2b;
+static int width, height, npix;
+static int radius;
+static int reaction = 0;
+static int diffusion = 0;
+
+/* returns number of pixels that the pixack produces.  called once. */
+static void
+pixack_init(int *size_h, int *size_v) 
+{
+  int sz_base;
+  width = get_integer_resource ("width", "Integer");
+  height = get_integer_resource ("height", "Integer");
+  sz_base = 80 + (R%40);
+  if (width <= 0) width = (R%20) ? sz_base : (28 + R%10);
+  if (height <= 0) height = (R%20) ? sz_base : (28 + R%10);
+
+  /* jwz: when (and only when) XSHM is in use on an SGI 8-bit visual,
+     we get shear unless width is a multiple of 4.  I don't understand
+     why.  This is undoubtedly the wrong fix... */
+  width &= ~0x7;
+
+  /* don't go there */
+  if (width < 10) width = 10;
+  if (height < 10) height = 10;
+  epoch_time = get_integer_resource ("epoch", "Integer");
+  npix = (width + 2) * (height + 2);
+  r1 = (ushort *) malloc(sizeof(ushort) * npix);
+  r2 = (ushort *) malloc(sizeof(ushort) * npix);
+  r1b = (ushort *) malloc(sizeof(ushort) * npix);
+  r2b = (ushort *) malloc(sizeof(ushort) * npix);
+
+  if (!r1 || !r2 || !r1b || !r2b) {
+    fprintf(stderr, "not enough memory for %d pixels.\n", npix);
+    exit(1);
+  }
+
+  *size_h = width;
+  *size_v = height;
+}
+
+#define test_pattern_hyper 0
+
+
+/* returns the pixels.  called many times. */
+static void
+pixack_frame(char *pix_buf) 
+{
+  int i, j;
+  int w2 = width + 2;
+  ushort *t;
+#if test_pattern_hyper
+  if (frame&0x100)
+    sleep(1);
+#endif
+  if (verbose) {
+    double tm = 0;
+    struct timeval tp;
+    if (!(frame%100)) {
+      double tm2;
+#ifdef GETTIMEOFDAY_TWO_ARGS
+      struct timezone tzp;
+      gettimeofday(&tp, &tzp);
+#else
+      gettimeofday(&tp);
+#endif
+      tm2 = tp.tv_sec + tp.tv_usec * 1e-6;
+      if (frame > 0)
+       printf("fps = %2.4g\n", 100.0 / (tm2 - tm));
+      tm = tm2;
+    }
+  }
+  if (!(frame%epoch_time)) {
+    int s;
+    if (0 != frame) {
+      int t = epoch_time / 500;
+      if (t > 15)
+       t = 15;
+      sleep(t);
+    }
+         
+    for (i = 0; i < npix; i++) {
+      /* equilibrium */
+      r1[i] = 65500;
+      r2[i] = 11;
+    }
+
+    random_colors();
+
+    XSetWindowBackground(display, window, colors[255 % ncolors].pixel);
+    XClearWindow(display, window);
+
+    s = w2 * (height/2) + width/2;
+    radius = get_integer_resource ("radius", "Integer");
+    {
+      int maxr = width/2-2;
+      int maxr2 = height/2-2;
+      if (maxr2 < maxr) maxr = maxr2;
+
+      if (radius < 0)
+       radius = 1 + ((R%10) ? (R%5) : (R % maxr));
+      if (radius > maxr) radius = maxr;
+    }
+    for (i = -radius; i < (radius+1); i++)
+      for (j = -radius; j < (radius+1); j++)
+       r2[s + i + j*w2] = mx - (R&63);
+    reaction = get_integer_resource ("reaction", "Integer");
+    if (reaction < 0 || reaction > 2) reaction = R&1;
+    diffusion = get_integer_resource ("diffusion", "Integer");
+    if (diffusion < 0 || diffusion > 2)
+      diffusion = (R%5) ? ((R%3)?0:1) : 2;
+    if (2 == reaction && 2 == diffusion)
+      reaction = diffusion = 0;
+      
+    if (verbose)
+      printf("reaction = %d\ndiffusion = %d\nradius = %d\n",
+            reaction, diffusion, radius);
+  }
+  for (i = 0; i <= width+1; i++) {
+    r1[i] = r1[i + w2 * height];
+    r2[i] = r2[i + w2 * height];
+    r1[i + w2 * (height + 1)] = r1[i + w2];
+    r2[i + w2 * (height + 1)] = r2[i + w2];
+  }
+  for (i = 0; i <= height+1; i++) {
+    r1[w2 * i] = r1[width + w2 * i];
+    r2[w2 * i] = r2[width + w2 * i];
+    r1[w2 * i + width + 1] = r1[w2 * i + 1];
+    r2[w2 * i + width + 1] = r2[w2 * i + 1];
+  }
+  for (i = 0; i < height; i++) {
+    int ii = i + 1;
+    char *q = pix_buf + width * i;
+    short *qq = ((short *) pix_buf) + width * i;
+    long  *qqq = ((long *) pix_buf) + width * i;
+    ushort *i1 = r1 + 1 + w2 * ii;
+    ushort *i2 = r2 + 1 + w2 * ii;
+    ushort *o1 = r1b + 1 + w2 * ii;
+    ushort *o2 = r2b + 1 + w2 * ii;
+    for (j = 0; j < width; j++) {
+#if test_pattern_hyper
+      int r1 = (i * j + (frame&127)*frame)&65535;
+#else
+      int uvv, r1 = 0, r2 = 0;
+      switch (diffusion) {
+      case 0:
+       r1 = i1[j] + i1[j+1] + i1[j-1] + i1[j+w2] + i1[j-w2];
+       r1 = r1 / 5;
+       r2 = (i2[j]<<3) + i2[j+1] + i2[j-1] + i2[j+w2] + i2[j-w2];
+       r2 = r2 / 12;
+       break;
+      case 1:
+       r1 = i1[j+1] + i1[j-1] + i1[j+w2] + i1[j-w2];
+       r1 = r1 >> 2;
+       r2 = (i2[j]<<2) + i2[j+1] + i2[j-1] + i2[j+w2] + i2[j-w2];
+       r2 = r2 >> 3;
+       break;
+      case 2:
+       r1 = (i1[j]<<1) + (i1[j+1]<<1) + (i1[j-1]<<1) + i1[j+w2] + i1[j-w2];
+       r1 = r1 >> 3;
+       r2 = (i2[j]<<2) + i2[j+1] + i2[j-1] + i2[j+w2] + i2[j-w2];
+       r2 = r2 >> 3;
+       break;
+      }
+
+      /* John E. Pearson "Complex Patterns in a Simple System"
+        Science, July 1993 */
+
+      uvv = (((r1 * r2) >> bps) * r2) >> bps;
+      switch (reaction) {  /* costs 4% */
+      case 0:
+       r1 += 4 * (((28 * (mx-r1)) >> 10) - uvv);
+       r2 += 4 * (uvv - ((80 * r2) >> 10));
+       break;
+      case 1:
+       r1 += 3 * (((27 * (mx-r1)) >> 10) - uvv);
+       r2 += 3 * (uvv - ((80 * r2) >> 10));
+       break;
+      case 2:
+       r1 += 2 * (((28 * (mx-r1)) >> 10) - uvv);
+       r2 += 3 * (uvv - ((80 * r2) >> 10));
+       break;
+      }
+      if (r1 > mx) r1 = mx;
+      if (r2 > mx) r2 = mx;
+      if (r1 < 0) r1 = 0;
+      if (r2 < 0) r2 = 0;
+      o1[j] = r1;
+      o2[j] = r2;
+#endif
+
+      /* this is terrible.  here i want to assume ncolors = 256.
+        should lose double indirection */
+
+      if (mapped)
+#if dither_when_mapped
+       q[j] = colors[mc[r1]  % ncolors].pixel;
+#else
+      q[j] = colors[(r1>>8) % ncolors].pixel;
+#endif
+      else if (pdepth == 8)
+       q[j] = colors[(r1>>8) % ncolors].pixel;
+      else if (pdepth == 16)
+#if dither_when_mapped
+       qq[j] = colors[mc[r1] % ncolors].pixel;
+#else
+       qq[j] = colors[(r1>>8) % ncolors].pixel;
+#endif
+      else if (pdepth == 32)
+#if dither_when_mapped
+       qqq[j] = colors[mc[r1] % ncolors].pixel;
+#else
+       qqq[j] = colors[(r1>>8) % ncolors].pixel;
+#endif
+      else
+       abort();
+    }
+  }
+  t = r1; r1 = r1b; r1b = t;
+  t = r2; r2 = r2b; r2b = t;  
+}
+
+
+/* ------------- xscreensaver rendering -------------- */
+
+
+
+char *progclass = "RD";
+
+
+char *defaults [] = {
+  ".background:        black",
+  ".foreground:        white",
+  "*width:     0",                     /* tried to use -1 but it complained */
+  "*height:    0",
+  "*epoch:     40000",
+  "*reaction:  -1",
+  "*diffusion: -1",
+  "*verbose:   off",
+  "*radius:    -1",
+  "*speed:     0.0",
+  "*size:      1.0",
+  "*delay:     1",
+  "*colors:    -1",
+#ifdef HAVE_XSHM_EXTENSION
+  "*useSHM:    True",
+#endif /* HAVE_XSHM_EXTENSION */
+  0
+};
+
+XrmOptionDescRec options [] = {
+  { "-width",          ".width",       XrmoptionSepArg, 0 },
+  { "-height",         ".height",      XrmoptionSepArg, 0 },
+  { "-epoch",          ".epoch",       XrmoptionSepArg, 0 },
+  { "-reaction",       ".reaction",    XrmoptionSepArg, 0 },
+  { "-diffusion",      ".diffusion",   XrmoptionSepArg, 0 },
+  { "-verbose",                ".verbose",     XrmoptionNoArg, "True" },
+  { "-radius",         ".radius",      XrmoptionSepArg, 0 },
+  { "-speed",          ".speed",       XrmoptionSepArg, 0 },
+  { "-size",           ".size",        XrmoptionSepArg, 0 },
+  { "-delay",          ".delay",       XrmoptionSepArg, 0 },
+  { "-ncolors",                ".colors",      XrmoptionSepArg, 0 },
+#ifdef HAVE_XSHM_EXTENSION
+  { "-shm",            ".useSHM",      XrmoptionNoArg, "True" },
+  { "-no-shm",         ".useSHM",      XrmoptionNoArg, "False" },
+#endif /* HAVE_XSHM_EXTENSION */
+  { 0, 0, 0, 0 }
+};
+
+
+static void
+random_colors(void)
+{
+  memset(colors, 0, ncolors*sizeof(*colors));
+  make_smooth_colormap (display, visual, cmap, colors, &ncolors,
+                       True, 0, True);
+  if (ncolors <= 2) {
+    mono_p = True;
+    ncolors = 2;
+    colors[0].flags = DoRed|DoGreen|DoBlue;
+    colors[0].red = colors[0].green = colors[0].blue = 0;
+    XAllocColor(display, cmap, &colors[0]);
+    colors[1].flags = DoRed|DoGreen|DoBlue;
+    colors[1].red = colors[1].green = colors[1].blue = 0xFFFF;
+    XAllocColor(display, cmap, &colors[1]);
+  }
+
+  /* Scale it up so that there are exactly 255 colors -- that keeps the
+     animation speed consistent, even when there aren't many allocatable
+     colors, and prevents the -mono mode from looking like static. */
+  if (ncolors != 255) {
+    int i, n = 255;
+    double scale = (double) ncolors / (double) (n+1);
+    XColor *c2 = (XColor *) malloc(sizeof(*c2) * (n+1));
+    for (i = 0; i < n; i++)
+      c2[i] = colors[(int) (i * scale)];
+    free(colors);
+    colors = c2;
+    ncolors = n;
+  }
+
+}
+
+/* should factor into RD-specfic and compute-every-pixel general */
+void
+screenhack (Display *dpy, Window win)
+{
+  GC gc;
+  XGCValues gcv;
+  XWindowAttributes xgwa;
+  XImage *image;
+  int array_width, array_height;
+  double array_x, array_y;
+  double array_dx, array_dy;
+  int w2;
+  char *p;
+  int vdepth;
+  int npix;
+#ifdef HAVE_XSHM_EXTENSION
+  Bool use_shm = get_boolean_resource("useSHM", "Boolean");
+  XShmSegmentInfo shm_info;
+#endif
+
+  double delay = get_float_resource ("delay", "Float");
+
+  display = dpy;
+  window = win;
+
+
+  XGetWindowAttributes (dpy, win, &xgwa);
+  visual = xgwa.visual;
+  pixack_init(&width, &height);
+  {
+    double s = get_float_resource ("size", "Float");
+    double p = get_float_resource ("speed", "Float");
+    if (s < 0.0 || s > 1.0)
+      s = 1.0;
+    s = sqrt(s);
+    array_width = xgwa.width * s;
+    array_height = xgwa.height * s;
+    if (s < 0.99) {
+      array_width = (array_width / width) * width;
+      array_height = (array_height / height) * height;
+    }
+    if (array_width < width) array_width = width;
+    if (array_height < height) array_height = height;
+    array_x = (xgwa.width - array_width)/2;
+    array_y = (xgwa.height - array_height)/2;
+    array_dx = p;
+    array_dy = .31415926 * p;
+
+    /* start in a random direction */
+    if (random() & 1) array_dx = -array_dx;
+    if (random() & 1) array_dy = -array_dy;
+
+  }
+  verbose = get_boolean_resource ("verbose", "Boolean");
+  npix = (width + 2) * (height + 2);
+  w2 = width + 2;
+  gcv.function = GXcopy;
+  gc = XCreateGC(dpy, win, GCFunction, &gcv);
+  vdepth = visual_depth(DefaultScreenOfDisplay(dpy), xgwa.visual);
+
+  /* This code only deals with pixmap depths of 1, 8, 16, and 32.
+     Therefore, we assume that those depths will be supported by the
+     coresponding visual depths (that depth-24 displays accept depth-32
+     pixmaps, and that depth-12 displays accept depth-16 pixmaps.) */
+  pdepth = (vdepth == 1 ? 1 :
+           vdepth <= 8 ? 8 :
+           vdepth <= 16 ? 16 :
+           32);
+
+  /* Ok, this like, sucks and stuff.  There are some XFree86 systems
+     that have depth-24 visuals, that do not accept depth-32 XImages!
+     Which if you ask me is just absurd, since all it would take is
+     for the server to truncate the bits in that case.  So, this crap
+     here detects the specific case of: we have chosen depth 32;
+     and the server does not support depth 32.  In that case, we
+     try and use depth 16 instead.
+
+     The real fix would be to rewrite this program to deal with
+     depth 24 directly (or even better, arbitrary depths, but that
+     would mean going through the XImage routines instead of messing
+     with the XImage->data directly.)
+
+     jwz, 18-Mar-99: well, the X servers I have access to these days do
+     support 32-deep images on deep visuals, so I no longer have the
+     ability to test this code -- but it was causing problems on the
+     visuals that I do have, and I think that's because I mistakenly
+     wrote `pfv[i].depth' when I meant to write `pfv[i].bits_per_pixel'.
+     The symptom I was seeing was that the grid was 64x64, but the
+     images were being drawn 32x32 -- so there was a black stripe on
+     every other row.  Wow, this code sucks so much.
+   */
+  if (pdepth == 32)
+    {
+      int i, pfvc = 0;
+      Bool ok = False;
+      XPixmapFormatValues *pfv = XListPixmapFormats (dpy, &pfvc);
+      for (i = 0; i < pfvc; i++)
+        if (pfv[i].bits_per_pixel == pdepth)
+          ok = True;
+      if (!ok)
+        pdepth = 16;
+    }
+
+  cmap = xgwa.colormap;
+  ncolors = get_integer_resource ("colors", "Integer");
+
+  if (ncolors <= 0) {
+    if (vdepth > 8)
+      ncolors = 2047;
+    else
+      ncolors = 255;
+  }
+
+  if (mono_p || ncolors < 2) ncolors = 2;
+  if (ncolors <= 2) mono_p = True;
+  colors = (XColor *) malloc(sizeof(*colors) * (ncolors+1));
+
+  mapped = (vdepth <= 8 &&
+           has_writable_cells(xgwa.screen, xgwa.visual));
+
+  {
+    int i, di;
+    mc = (unsigned char *) malloc(1<<16);
+    for (i = 0; i < (1<<16); i++) {
+      di = (i + (random()&255))>>8;
+      if (di > 255) di = 255;
+      mc[i] = di;
+    }
+  }
+
+  p = malloc(npix * (pdepth == 1 ? 1 : (pdepth / 8)));
+  if (!p) {
+    fprintf(stderr, "not enough memory for %d pixels.\n", npix);
+    exit(1);
+  }
+
+  image = 0;
+
+#ifdef HAVE_XSHM_EXTENSION
+  if (use_shm)
+    {
+      image = create_xshm_image(dpy, xgwa.visual, vdepth,
+                               ZPixmap, 0, &shm_info, width, height);
+      if (!image)
+       use_shm = False;
+      else
+       {
+         free(p);
+         p = image->data;
+       }
+    }
+#endif /* HAVE_XSHM_EXTENSION */
+
+  if (!image)
+    {
+      image = XCreateImage(dpy, xgwa.visual, vdepth,
+                          ZPixmap, 0, p,
+                          width, height, 8, 0);
+    }
+
+  while (1) {
+    Bool bump = False;
+
+    int i, j;
+    pixack_frame(p);
+    for (i = 0; i < array_width; i += width)
+      for (j = 0; j < array_height; j += height)
+#ifdef HAVE_XSHM_EXTENSION
+       if (use_shm)
+         XShmPutImage(dpy, win, gc, image, 0, 0, i+array_x, j+array_y,
+                      width, height, False);
+       else
+#endif
+         XPutImage(dpy, win, gc, image, 0, 0, i+array_x, j+array_y,
+                   width, height);
+
+    array_x += array_dx;
+    array_y += array_dy;
+    if (array_x < 0) {
+      array_x = 0;
+      array_dx = -array_dx;
+      bump = True;
+    } else if (array_x > (xgwa.width - array_width)) {
+      array_x = (xgwa.width - array_width);
+      array_dx = -array_dx;
+      bump = True;
+    }
+    if (array_y < 0) {
+      array_y = 0;
+      array_dy = -array_dy;
+      bump = True;
+    } else if (array_y > (xgwa.height - array_height)) {
+      array_y = (xgwa.height - array_height);
+      array_dy = -array_dy;
+      bump = True;
+    }
+
+    if (bump) {
+      if (random() & 1) {
+       double swap = array_dx;
+       array_dx = array_dy;
+       array_dy = swap;
+      }
+    }
+
+    frame++;
+
+    XSync(dpy, False);
+    screenhack_handle_events (dpy);
+    if (delay > 0)
+      usleep(1000 * delay);
+  }
+}
diff --git a/hacks/rd-bomb.man b/hacks/rd-bomb.man
new file mode 100644 (file)
index 0000000..161c478
--- /dev/null
@@ -0,0 +1,98 @@
+.TH XScreenSaver 1 "10-May-97" "X Version 11"
+.SH NAME
+rd-bomb - reaction/diffusion textures
+.SH SYNOPSIS
+.B rd-bomb
+[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP]
+[\-background \fIcolor\fP] [\-window] [\-root] [\-install]
+[\-visual \fIvisual\fP] [\-width \fIn\fP] [\-height \fIn\fP]
+[\-reaction \fIn\fP] [\-diffusion \fIn\fP]
+[\-size \fIf\fP] [\-speed \fIf\fP] [\-delay \fIusecs\fP]
+.SH DESCRIPTION
+
+The \fIrd-bomb\fP program draws reaction/diffusion textures.  The code
+is derived from the 'd' mode of the "bomb" visual musical instrument
+(see http://www.cs.cmu.edu/~spot/bomb.html).  I got the equations from
+xmorphia (http://www.ccsf.caltech.edu/ismap/image.html), which is
+based on a version of the Gray-Scott model taken from:
+    John E. Pearson "Complex Patterns in a Simple System"
+    Science, 261,189, 9 July 1993.
+
+If the frame-rate is too low, consider decreasing the width and height
+of the tile, or decreasing the size of the active part of the screen.
+
+.SH OPTIONS
+
+If one of the reaction, diffusion, radius, and palette options is set
+to a negative value, then that option will be set to a random
+appropriate value.
+
+Be sure to try "-speed 1 -size 0.1 -epoch 3000".
+
+.I rd-bomb
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window.  This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use.  Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-width \fIn\fP
+.TP 8
+.B \-height \fIn\fP
+Specify the size of the tile, in pixels.
+.TP 8
+.B \-reaction \fIn\fP
+.TP 8
+.B \-diffusion \fIn\fP
+These are constants in the equations that effect its visual nature.
+Each may be one of 0, 1, or 2.  
+.TP 8
+.B \-radius \fIn\fP
+Size of the seed.
+.TP 8
+.B \-palette \fIn\fP
+Selects a palette.  Must be between 0 and 80, inclusive.
+.TP 8
+.B \-size \fIf\fP
+What fraction of the window is actively drawn, a floating point number
+between 0 (exclusive) and 1 (inclusive).  Default is 0.66.
+.TP 8
+.B \-speed \fIf\fP
+When a fraction of the screen is active, the active area moves at this
+rate (a floating point number).  Default is zero.  Suggested value: 1.0.
+.TP 8
+.B \-delay \fIusecs\fP
+How many microseconds to delay between frames; default 1000, or 
+about 1/1000th of a second.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1),
+.BR xlock (1)
+.SH COPYRIGHT
+Copyright \(co 1997 by Scott Draves.
+
+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. 
+.SH AUTHOR
+Scott Draves <spot@cs.cmu.edu>, 9/97
diff --git a/hacks/rocks.c b/hacks/rocks.c
new file mode 100644 (file)
index 0000000..e5e0df5
--- /dev/null
@@ -0,0 +1,534 @@
+/* xscreensaver, Copyright (c) 1992, 1995, 1996, 1997, 1998
+ *  Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software 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.  No representations are made about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or 
+ * implied warranty.
+ */
+
+/* 18-Sep-97: Johannes Keukelaar <johannes@nada.kth.se>: Added some color.
+ * Using -mono gives the old behaviour.  (Modified by jwz.)
+ */
+/*   Flying through an asteroid field.  Based on TI Explorer Lisp code by 
+   John Nguyen <johnn@hx.lcs.mit.edu>
+ */
+
+#include <stdio.h>
+#include <math.h>
+#include "screenhack.h"
+
+#define MIN_ROCKS 1
+#define MIN_DEPTH 2            /* rocks disappear when they get this close */
+#define MAX_DEPTH 60           /* this is where rocks appear */
+#define MIN_SIZE 3             /* how small where pixmaps are not used */
+#define MAX_SIZE 200           /* how big (in pixels) rocks are at depth 1 */
+#define DEPTH_SCALE 100                /* how many ticks there are between depths */
+#define SIN_RESOLUTION 1000
+
+#define MAX_DEP 0.3            /* how far the displacement can be (percent) */
+#define DIRECTION_CHANGE_RATE 60
+#define MAX_DEP_SPEED 5                /* Maximum speed for movement */
+#define MOVE_STYLE 0           /* Only 0 and 1. Distinguishes the fact that
+                                  these are the rocks that are moving (1) 
+                                  or the rocks source (0). */
+
+/* there's not much point in the above being user-customizable, but those
+   numbers might want to be tweaked for displays with an order of magnitude
+   higher resolution or compute power.
+ */
+
+static double sins [SIN_RESOLUTION];
+static double coss [SIN_RESOLUTION];
+static double depths [(MAX_DEPTH + 1) * DEPTH_SCALE];
+
+static Display *dpy;
+static Window window;
+static int width, height, midx, midy;
+static int dep_x, dep_y;
+static int ncolors;
+static XColor *colors;
+static float max_dep;
+static GC erase_gc;
+static GC *draw_gcs;
+static Bool rotate_p;
+static Bool move_p;
+static int speed;
+static Bool threed;
+static GC threed_left_gc, threed_right_gc;
+static double threed_delta;
+
+#define GETZDIFF(z) \
+        (threed_delta * 40.0 * \
+        (1.0 - ((MAX_DEPTH * DEPTH_SCALE / 2) / \
+                ((z) + 20.0 * DEPTH_SCALE))))
+
+struct rock {
+  int real_size;
+  int r;
+  int theta;
+  int depth;
+  int size, x, y;
+  int diff;
+  int color;
+};
+
+static struct rock *rocks;
+static int nrocks;
+static Pixmap pixmaps [MAX_SIZE];
+static int delay;
+
+static void rock_compute (struct rock *);
+static void rock_draw (struct rock *, Bool draw_p);
+
+static void
+rock_reset (struct rock *rock)
+{
+  rock->real_size = MAX_SIZE;
+  rock->r = (SIN_RESOLUTION * 0.7) + (random () % (30 * SIN_RESOLUTION));
+  rock->theta = random () % SIN_RESOLUTION;
+  rock->depth = MAX_DEPTH * DEPTH_SCALE;
+  rock->color = random() % ncolors;
+  rock_compute (rock);
+  rock_draw (rock, True);
+}
+
+static void
+rock_tick (struct rock *rock, int d)
+{
+  if (rock->depth > 0)
+    {
+      rock_draw (rock, False);
+      rock->depth -= speed;
+      if (rotate_p)
+        {
+         rock->theta = (rock->theta + d) % SIN_RESOLUTION;
+        }
+      while (rock->theta < 0)
+       rock->theta += SIN_RESOLUTION;
+      if (rock->depth < (MIN_DEPTH * DEPTH_SCALE))
+       rock->depth = 0;
+      else
+       {
+         rock_compute (rock);
+         rock_draw (rock, True);
+       }
+    }
+  else if ((random () % 40) == 0)
+    rock_reset (rock);
+}
+
+static void
+rock_compute (struct rock *rock)
+{
+  double factor = depths [rock->depth];
+  double rsize = rock->real_size * factor;
+
+  rock->size = (int) (rsize + 0.5);
+  rock->diff = (int) GETZDIFF(rock->depth);
+  rock->x = midx + (coss [rock->theta] * rock->r * factor);
+  rock->y = midy + (sins [rock->theta] * rock->r * factor);
+
+  if (move_p)
+    {
+      double move_factor = (((double) MOVE_STYLE) -
+                           (((double) rock->depth) /
+                            (((double) (MAX_DEPTH + 1)) *
+                             ((double) DEPTH_SCALE))));
+      /* move_factor is 0 when the rock is close, 1 when far */
+      rock->x += (((double) dep_x) * move_factor);
+      rock->y += (((double) dep_y) * move_factor);
+    }
+}
+
+static void
+rock_draw (rock, draw_p)
+     struct rock *rock;
+     Bool draw_p;
+{
+  GC gc = (draw_p 
+          ? (threed ? erase_gc : draw_gcs[rock->color])
+          : erase_gc);
+
+  if (rock->x <= 0 || rock->y <= 0 || rock->x >= width || rock->y >= height)
+    {
+      /* this means that if a rock were to go off the screen at 12:00, but
+        would have been visible at 3:00, it won't come back once the observer
+        rotates around so that the rock would have been visible again.
+        Oh well.
+       */
+      if (!move_p)
+       rock->depth = 0;
+      return;
+    }
+  if (rock->size <= 1)
+    {
+      if (threed)
+       {
+         if (draw_p) gc = threed_left_gc;
+         XDrawPoint (dpy, window, gc, rock->x - rock->diff, rock->y);
+         if (draw_p) gc = threed_right_gc;
+         XDrawPoint (dpy, window, gc, rock->x + rock->diff, rock->y);
+       }
+      else
+       {
+         XDrawPoint (dpy, window, gc, rock->x, rock->y);
+       }
+    }
+  else if (rock->size <= MIN_SIZE || !draw_p)
+    {
+      if (threed)
+       {
+         if (draw_p) gc = threed_left_gc;
+         XFillRectangle(dpy, window, gc,
+                        rock->x - rock->size / 2 - rock->diff,
+                        rock->y - rock->size / 2,
+                        rock->size, rock->size);
+         if (draw_p) gc = threed_right_gc;
+         XFillRectangle(dpy, window, gc,
+                        rock->x - rock->size / 2 + rock->diff,
+                        rock->y - rock->size / 2,
+                        rock->size, rock->size);
+       }
+      else
+       {
+         XFillRectangle (dpy, window, gc,
+                         rock->x - rock->size/2, rock->y - rock->size/2,
+                         rock->size, rock->size);
+       }
+    }
+  else if (rock->size < MAX_SIZE)
+    {
+      if (threed)
+       {
+         gc = threed_left_gc;
+         XCopyPlane(dpy, pixmaps[rock->size], window, gc,
+                    0, 0, rock->size, rock->size,
+                    rock->x - rock->size / 2 - rock->diff,
+                    rock->y - rock->size / 2, 1L);
+         gc = threed_right_gc;
+         XCopyPlane(dpy, pixmaps[rock->size], window, gc,
+                    0, 0, rock->size, rock->size,
+                    rock->x - rock->size / 2 + rock->diff,
+                    rock->y - rock->size / 2, 1L);
+       }
+      else
+       {
+         XCopyPlane (dpy, pixmaps [rock->size], window, gc,
+                     0, 0, rock->size, rock->size,
+                     rock->x - rock->size/2, rock->y - rock->size/2,
+                     1L);
+       }
+    }
+}
+
+
+static void
+init_pixmaps (Display *dpy, Window window)
+{
+  int i;
+  XGCValues gcv;
+  GC fg_gc = 0, bg_gc = 0;
+  pixmaps [0] = pixmaps [1] = 0;
+  for (i = MIN_DEPTH; i < MAX_SIZE; i++)
+    {
+      int w = (1+(i/32))<<5; /* server might be faster if word-aligned */
+      int h = i;
+      Pixmap p = XCreatePixmap (dpy, window, w, h, 1);
+      XPoint points [7];
+      pixmaps [i] = p;
+      if (! p)
+       {
+         fprintf (stderr, "%s: couldn't allocate pixmaps", progname);
+         exit (1);
+       }
+      if (! fg_gc)
+       {       /* must use drawable of pixmap, not window (fmh) */
+         gcv.foreground = 1;
+         fg_gc = XCreateGC (dpy, p, GCForeground, &gcv);
+         gcv.foreground = 0;
+         bg_gc = XCreateGC (dpy, p, GCForeground, &gcv);
+       }
+      XFillRectangle (dpy, p, bg_gc, 0, 0, w, h);
+      points [0].x = i * 0.15; points [0].y = i * 0.85;
+      points [1].x = i * 0.00; points [1].y = i * 0.20;
+      points [2].x = i * 0.30; points [2].y = i * 0.00;
+      points [3].x = i * 0.40; points [3].y = i * 0.10;
+      points [4].x = i * 0.90; points [4].y = i * 0.10;
+      points [5].x = i * 1.00; points [5].y = i * 0.55;
+      points [6].x = i * 0.45; points [6].y = i * 1.00;
+      XFillPolygon (dpy, p, fg_gc, points, 7, Nonconvex, CoordModeOrigin);
+    }
+  XFreeGC (dpy, fg_gc);
+  XFreeGC (dpy, bg_gc);
+}
+
+
+static int
+compute_move(int axe)                          /* 0 for x, 1 for y */
+{
+  static int current_dep[2] = {0, 0};
+  static int speed[2] = {0, 0};
+  static short direction[2] = {0, 0};
+  static int limit[2] = {0, 0};
+  int change = 0;
+
+  limit[0] = midx;
+  limit[1] = midy;
+
+  current_dep[axe] += speed[axe];      /* We adjust the displacement */
+
+  if (current_dep[axe] > (int) (limit[axe] * max_dep))
+    {
+      if (current_dep[axe] > limit[axe])
+       current_dep[axe] = limit[axe];
+      direction[axe] = -1;
+    }                  /* This is when we reach the upper screen limit */
+  if (current_dep[axe] < (int) (-limit[axe] * max_dep))
+    {
+      if (current_dep[axe] < -limit[axe])
+       current_dep[axe] = -limit[axe];
+      direction[axe] = 1;
+    }                  /* This is when we reach the lower screen limit */
+  if (direction[axe] == 1)     /* We adjust the speed */
+    speed[axe] += 1;
+  else if (direction[axe] == -1)
+    speed[axe] -= 1;
+
+  if (speed[axe] > MAX_DEP_SPEED)
+    speed[axe] = MAX_DEP_SPEED;
+  else if (speed[axe] < -MAX_DEP_SPEED)
+    speed[axe] = -MAX_DEP_SPEED;
+
+  if (move_p && !(random() % DIRECTION_CHANGE_RATE))
+    {
+      /* We change direction */
+      change = random() & 1;
+      if (change != 1)
+       {
+         if (direction[axe] == 0)
+           direction[axe] = change - 1;        /* 0 becomes either 1 or -1 */
+         else
+           direction[axe] = 0;                 /* -1 or 1 become 0 */
+       }
+    }
+  return (current_dep[axe]);
+}
+
+static void
+tick_rocks (int d)
+{
+  int i;
+
+  if (move_p)
+    {
+      dep_x = compute_move(0);
+      dep_y = compute_move(1);
+    }
+
+  for (i = 0; i < nrocks; i++)
+    rock_tick (&rocks [i], d);
+}
+
+
+static void
+rocks_once (void)
+{
+  static int current_delta = 0;        /* observer Z rotation */
+  static int window_tick = 50;
+       static int  new_delta = 0;
+       static int  dchange_tick = 0;
+
+  if (window_tick++ == 50)
+    {
+      XWindowAttributes xgwa;
+      XGetWindowAttributes (dpy, window, &xgwa);
+      window_tick = 0;
+      width = xgwa.width;
+      height = xgwa.height;
+      midx = width/2;
+      midy = height/2;
+    }
+
+  if (current_delta != new_delta)
+    {
+      if (dchange_tick++ == 5)
+       {
+         dchange_tick = 0;
+         if (current_delta < new_delta)
+           current_delta++;
+         else
+           current_delta--;
+       }
+    }
+  else
+    {
+      if (! (random() % 50))
+       {
+         new_delta = ((random() % 11) - 5);
+         if (! (random() % 10))
+           new_delta *= 5;
+       }
+    }
+  tick_rocks (current_delta);
+}
+
+static void
+init_rocks (Display *d, Window w)
+{
+  int i;
+  XGCValues gcv;
+  Colormap cmap;
+  XWindowAttributes xgwa;
+  unsigned int bg;
+  dpy = d;
+  window = w;
+  XGetWindowAttributes (dpy, window, &xgwa);
+  cmap = xgwa.colormap;
+  delay = get_integer_resource ("delay", "Integer");
+  if (delay < 0) delay = 0;
+  speed = get_integer_resource ("speed", "Integer");
+  if (speed < 1) speed = 1;
+  if (speed > 100) speed = 100;
+  rotate_p = get_boolean_resource ("rotate", "Boolean");
+  move_p = get_boolean_resource ("move", "Boolean");
+  if (mono_p)
+    ncolors = 2;
+  else
+    ncolors = get_integer_resource ("colors", "Colors");
+
+  if (ncolors < 2)
+    {
+      ncolors = 2;
+      mono_p = True;
+  }
+
+  colors = (XColor *) malloc(ncolors * sizeof(*colors));
+  draw_gcs = (GC *) malloc(ncolors * sizeof(*draw_gcs));
+
+  bg = get_pixel_resource ("background", "Background", dpy, cmap);
+  colors[0].pixel = bg;
+  colors[0].flags = DoRed|DoGreen|DoBlue;
+  XQueryColor(dpy, cmap, &colors[0]);
+
+  ncolors--;
+  make_random_colormap(dpy, xgwa.visual, cmap, colors+1, &ncolors, True,
+                      True, 0, True);
+  ncolors++;
+
+  if (ncolors < 2)
+    {
+      ncolors = 2;
+      mono_p = True;
+  }
+
+  if (mono_p)
+    {
+      unsigned int fg = get_pixel_resource("foreground", "Foreground",
+                                          dpy, cmap);
+      colors[1].pixel = fg;
+      colors[1].flags = DoRed|DoGreen|DoBlue;
+      XQueryColor(dpy, cmap, &colors[1]);
+      gcv.foreground = fg;
+      gcv.background = bg;
+      draw_gcs[0] = XCreateGC (dpy, window, GCForeground|GCBackground, &gcv);
+      draw_gcs[1] = draw_gcs[0];
+    }
+  else
+    for( i = 0; i < ncolors; i++ )
+      {
+       gcv.foreground = colors[i].pixel;
+       gcv.background = bg;
+       draw_gcs[i] = XCreateGC (dpy, window, GCForeground|GCBackground, &gcv);
+      }
+
+  gcv.foreground = bg;
+  erase_gc = XCreateGC (dpy, window, GCForeground|GCBackground, &gcv);
+
+  max_dep = (move_p ? MAX_DEP : 0);
+
+  for (i = 0; i < SIN_RESOLUTION; i++)
+    {
+      sins [i] = sin ((((double) i) / (SIN_RESOLUTION / 2)) * M_PI);
+      coss [i] = cos ((((double) i) / (SIN_RESOLUTION / 2)) * M_PI);
+    }
+  /* we actually only need i/speed of these, but wtf */
+  for (i = 1; i < (sizeof (depths) / sizeof (depths[0])); i++)
+    depths [i] = atan (((double) 0.5) / (((double) i) / DEPTH_SCALE));
+  depths [0] = M_PI/2; /* avoid division by 0 */
+
+  threed = get_boolean_resource("use3d", "Boolean");
+  if (threed)
+    {
+      gcv.background = bg;
+      gcv.foreground = get_pixel_resource ("left3d", "Foreground", dpy, cmap);
+      threed_left_gc = XCreateGC (dpy, window, GCForeground|GCBackground,&gcv);
+      gcv.foreground = get_pixel_resource ("right3d", "Foreground", dpy, cmap);
+      threed_right_gc = XCreateGC (dpy, window,GCForeground|GCBackground,&gcv);
+      threed_delta = get_float_resource("delta3d", "Integer");
+    }
+
+  /* don't want any exposure events from XCopyPlane */
+  for( i = 0; i < ncolors; i++)
+    XSetGraphicsExposures (dpy, draw_gcs[i], False);
+  XSetGraphicsExposures (dpy, erase_gc, False);
+
+  nrocks = get_integer_resource ("count", "Count");
+  if (nrocks < 1) nrocks = 1;
+  rocks = (struct rock *) calloc (nrocks, sizeof (struct rock));
+  init_pixmaps (dpy, window);
+  XClearWindow (dpy, window);
+}
+
+
+\f
+char *progclass = "Rocks";
+
+char *defaults [] = {
+  ".background:        Black",
+  ".foreground:        #E9967A",
+  "*colors:    5",
+  "*count:     100",
+  "*delay:     50000",
+  "*speed:     100",
+  "*rotate:     true",
+  "*move:       true",
+  "*use3d:      False",
+  "*left3d:    Blue",
+  "*right3d:   Red",
+  "*delta3d:   1.5",
+  0
+};
+
+XrmOptionDescRec options [] = {
+  { "-count",          ".count",       XrmoptionSepArg, 0 },
+  { "-rotate",          ".rotate",      XrmoptionNoArg,  "true" },
+  { "-norotate",        ".rotate",      XrmoptionNoArg,  "false" },
+  { "-move",            ".move",        XrmoptionNoArg,  "true" },
+  { "-nomove",          ".move",        XrmoptionNoArg,  "false" },
+  { "-delay",          ".delay",       XrmoptionSepArg, 0 },
+  { "-speed",          ".speed",       XrmoptionSepArg, 0 },
+  {"-3d",              ".use3d",       XrmoptionNoArg, "True"},
+  {"-no-3d",           ".use3d",       XrmoptionNoArg, "False"},
+  {"-left3d",          ".left3d",      XrmoptionSepArg, 0 },
+  {"-right3d",         ".right3d",     XrmoptionSepArg, 0 },
+  {"-delta3d",         ".delta3d",     XrmoptionSepArg, 0 },
+  { "-colors",         ".colors",      XrmoptionSepArg, 0 },
+  { 0, 0, 0, 0 }
+};
+
+void
+screenhack (Display *dpy, Window window)
+{
+  init_rocks (dpy, window);
+  while (1)
+    {
+      rocks_once ();
+      XSync (dpy, False);
+      screenhack_handle_events (dpy);
+      if (delay) usleep (delay);
+    }
+}
diff --git a/hacks/rocks.man b/hacks/rocks.man
new file mode 100644 (file)
index 0000000..1d39130
--- /dev/null
@@ -0,0 +1,86 @@
+.TH XScreenSaver 1 "13-aug-92" "X Version 11"
+.SH NAME
+rocks - animation of flying through an asteroid field
+.SH SYNOPSIS
+.B rocks
+[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-ncolors \fIn\fP] [\-install] [\-visual \fIvisual\fP] [\-count \fIinteger\fP] [\-delay \fIusecs\fP] [\-speed \fIinteger\fP] [\-norotate] [\-nomove] [\-3d]
+.SH DESCRIPTION
+The \fIrocks\fP program draws an animation of an asteroid field moving past
+the observer (or vice versa).  Sometimes the observer picks up spin on Z axis.
+.SH OPTIONS
+.I rocks
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window.  This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-mono
+Make all the rocks the same color.
+.TP 8
+.B \-ncolors colors
+How many different colors to use.  Default 5.  Colors are chosen randomly.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use.  Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-count \fIinteger\fP
+Maximum number of rocks to draw on the screen at once.  Default 100.
+.TP 8
+.B \-speed \fIinteger\fP
+A measure of the speed with which the observer and the rocks pass each other,
+from 1 to 100.  Default 100, meaning ``very fast.''  If you're on a slow 
+display connection (the animation looks jerky) then try making this number 
+smaller, and/or decreasing the number of rocks.
+.TP 8
+.B \-delay \fImicroseconds\fP
+Number of microseconds to delay between each frame.  Default 50000, meaning
+about 1/20th second.  Compare and contrast with \fI\-speed\fP, above.
+.TP 8
+.B \-norotate
+Don't rotate the observer; just fly through the field on the level.
+.TP 8
+.B \-nomove
+Don't turn the observer; just fly straight ahead through the field.
+.TP 8
+.B \-3d
+Do red/blue 3d separations: if you look at the screen with 3d glasses,
+the rocks will be \fIjumping\fP right \fIout\fP at you.  Oooooh, scaaary!
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH BUGS
+There should be an option to display doppler shift (a gravity rainbow.)
+
+Speed of rotation should be settable.
+
+Default speed of rotation should be relative to forward velocity.
+.SH COPYRIGHT
+Copyright \(co 1992 by Jamie Zawinski.  Permission to use, copy, modify, 
+distribute, and sell this software 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.  No representations are made about the 
+suitability of this software for any purpose.  It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Based on Lisp Machine code copyright 1988 John Nguyen <johnn@hx.lcs.mit.edu>.
+
+Ported to C and X by Jamie Zawinski <jwz@jwz.org>, 13-aug-92.
+
+Steering code by Jeremie Petit; 3D code by theiling@coli.uni-sb.de.
diff --git a/hacks/rorschach.c b/hacks/rorschach.c
new file mode 100644 (file)
index 0000000..430fa9d
--- /dev/null
@@ -0,0 +1,140 @@
+/* xscreensaver, Copyright (c) 1992, 1996, 1998 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software 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.  No representations are made about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or 
+ * implied warranty.
+ *
+ * 19971004: Johannes Keukelaar <johannes@nada.kth.se>: Use helix screen
+ *           eraser.
+ */
+
+#include "screenhack.h"
+#include "erase.h"
+
+static GC draw_gc, erase_gc;
+static unsigned int default_fg_pixel;
+static int iterations, offset;
+static Bool xsym, ysym;
+static int sleep_time;
+
+static void
+init_rorschach (Display *dpy, Window window)
+{
+  XGCValues gcv;
+  Colormap cmap;
+  XWindowAttributes xgwa;
+  XGetWindowAttributes (dpy, window, &xgwa);
+  cmap = xgwa.colormap;
+  gcv.foreground = default_fg_pixel =
+    get_pixel_resource ("foreground", "Foreground", dpy, cmap);
+  draw_gc = XCreateGC (dpy, window, GCForeground, &gcv);
+  gcv.foreground = get_pixel_resource ("background", "Background", dpy, cmap);
+  erase_gc = XCreateGC (dpy, window, GCForeground, &gcv);
+  iterations = get_integer_resource ("iterations", "Integer");
+  offset = get_integer_resource ("offset", "Integer");
+  if (offset <= 0) offset = 3;
+  if (iterations < 10) iterations = 10;
+  xsym = get_boolean_resource ("xsymmetry", "Symmetry");
+  ysym = get_boolean_resource ("ysymmetry", "Symmetry");
+}
+
+static void
+hurm (Display *dpy, Window window)
+{
+  Colormap cmap;
+  XWindowAttributes xgwa;
+  int xlim, ylim, x, y, i, got_color = 0;
+  XPoint points [4];
+  XColor color;
+  XClearWindow (dpy, window);
+  XGetWindowAttributes (dpy, window, &xgwa);
+  xlim = xgwa.width;
+  ylim = xgwa.height;
+  cmap = xgwa.colormap;
+
+  if (! mono_p)
+    hsv_to_rgb (random()%360, 1.0, 1.0, &color.red, &color.green, &color.blue);
+  if ((!mono_p) && (got_color = XAllocColor (dpy, cmap, &color)))
+    XSetForeground (dpy, draw_gc, color.pixel);
+  else
+    XSetForeground (dpy, draw_gc, default_fg_pixel);
+
+  x = xlim/2;
+  y = ylim/2;
+  for (i = 0; i < iterations; i++)
+    {
+      int j = 0;
+      x += ((random () % (1 + (offset << 1))) - offset);
+      y += ((random () % (1 + (offset << 1))) - offset);
+      points [j].x = x;
+      points [j].y = y;
+      j++;
+      if (xsym)
+       {
+         points [j].x = xlim - x;
+         points [j].y = y;
+         j++;
+       }
+      if (ysym)
+       {
+         points [j].x = x;
+         points [j].y = ylim - y;
+         j++;
+       }
+      if (xsym && ysym)
+       {
+         points [j].x = xlim - x;
+         points [j].y = ylim - y;
+         j++;
+       }
+      XDrawPoints (dpy, window, draw_gc, points, j, CoordModeOrigin);
+      XSync (dpy, False);
+      screenhack_handle_events (dpy);
+    }
+  sleep ( sleep_time );
+
+  erase_full_window(dpy, window);
+
+  XClearWindow (dpy, window);
+  if (got_color) XFreeColors (dpy, cmap, &color.pixel, 1, 0);
+  XSync (dpy, False);
+  screenhack_handle_events (dpy);
+  sleep (1);
+}
+
+\f
+char *progclass = "Rorschach";
+
+char *defaults [] = {
+  ".background:        black",
+  ".foreground:        white",
+  "*xsymmetry: true",
+  "*ysymmetry: false",
+  "*iterations:        4000",
+  "*offset:    4",
+  "*delay:     5",
+  0
+};
+
+XrmOptionDescRec options [] = {
+  { "-iterations",     ".iterations",  XrmoptionSepArg, 0 },
+  { "-offset",         ".offset",      XrmoptionSepArg, 0 },
+  { "-xsymmetry",      ".xsymmetry",   XrmoptionNoArg, "true" },
+  { "-ysymmetry",      ".ysymmetry",   XrmoptionNoArg, "true" },
+  { "-erase-speed",    ".eraseSpeed",          XrmoptionSepArg, 0 },
+  { "-delay",           ".delay",               XrmoptionSepArg, 0 },
+  { 0, 0, 0, 0 }
+};
+
+void
+screenhack (Display *dpy, Window window)
+{
+  sleep_time = get_integer_resource("delay", "Integer");
+  init_rorschach (dpy, window);
+  while (1)
+    hurm (dpy, window);
+}
diff --git a/hacks/rorschach.man b/hacks/rorschach.man
new file mode 100644 (file)
index 0000000..56a6c48
--- /dev/null
@@ -0,0 +1,75 @@
+.TH XScreenSaver 1 "13-aug-92" "X Version 11"
+.SH NAME
+rorschach - simulate ink-blot patterns
+.SH SYNOPSIS
+.B rorschach
+[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-iterations \fIinteger\fP] [\-offset \fIinteger\fP] [\-xsymmetry] [\-ysymmetry] [\-erase\-mode \fIinteger\fP] [\-erase\-speed \fIusecs\fP] [\-delay \fIsecs\fP]
+.SH DESCRIPTION
+The \fIrorschach\fP program draws random patterns reminiscent of the
+psychological test of same name.
+.SH OPTIONS
+.I rorschach
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window.  This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-mono 
+If on a color display, pretend we're on a monochrome display.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use.  Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-iterations \fIinteger\fP
+How many dots should be drawn each time.  Default 4000.
+.TP 8
+.B \-offset \fIinteger\fP
+How far apart the dots should be.  Default 4 pixels.
+.TP 8
+.B \-xsymmetry
+Whether the images should be horizontally symmetrical.  Default true.
+.TP 8
+.B \-ysymmetry
+Whether the images should be vertically symmetrical.  Default false.
+.TP 8
+.B \-erase\-mode \fIinteger\fP
+This sets the erase mode. Mode \-1 chooses a random mode each time. There
+are currently 6 modes defined (0\-5).
+.TP 8
+.B \-erase\-speed \fIusecs\fP
+This controls the speed at which the screen will be erased. (Delay between
+erasing of individual lines.)
+.TP 8
+.B \-delay \fIseconds\fP
+This sets the number of seconds that the figure will be on the screen.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH BUGS
+May call your sanity into question.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 1992 by Jamie Zawinski.  Permission to use, copy, modify, 
+distribute, and sell this software 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.  No representations are made about the 
+suitability of this software for any purpose.  It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Jamie Zawinski <jwz@jwz.org>, 13-aug-92.
diff --git a/hacks/rotor.c b/hacks/rotor.c
new file mode 100644 (file)
index 0000000..135159e
--- /dev/null
@@ -0,0 +1,348 @@
+/* -*- Mode: C; tab-width: 4 -*- */
+/* rotor --- a swirly rotor */
+
+#if !defined( lint ) && !defined( SABER )
+static const char sccsid[] = "@(#)rotor.c      4.04 97/07/28 xlockmore";
+
+#endif
+
+/*-
+ * Copyright (c) 1991 by Patrick J. Naughton.
+ *
+ * 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.
+ *
+ * This file is provided AS IS with no warranties of any kind.  The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof.  In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * Revision History:
+ * 10-May-97:  Compatible with xscreensaver
+ * 08-Mar-95: CAT stuff for ## was tripping up some C compilers.  Removed.
+ * 01-Dec-93: added patch for AIXV3 from Tom McConnell
+ *            <tmcconne@sedona.intel.com>
+ * 11-Nov-90: put into xlock by Steve Zellers <zellers@sun.com>
+ * 16-Oct-90: Received from Tom Lawrence (tcl@cs.brown.edu: 'flight' simulator)
+ */
+
+#ifdef STANDALONE
+# define PROGCLASS "Rotor"
+# define HACK_INIT init_rotor
+# define HACK_DRAW draw_rotor
+# define rotor_opts xlockmore_opts
+# define DEFAULTS      "*delay:   10000 \n"    \
+                                       "*count:   4 \n"                \
+                                       "*size:   -6 \n"                \
+                                       "*cycles:  20 \n"               \
+                                       "*ncolors: 200 \n"
+# define SMOOTH_COLORS
+# include "xlockmore.h"                /* in xscreensaver distribution */
+#else /* STANDALONE */
+# include "xlock.h"                    /* in xlockmore distribution */
+#endif /* STANDALONE */
+
+ModeSpecOpt rotor_opts =
+{0, NULL, 0, NULL, NULL};
+
+/*-
+ * A 'batchcount' of 3 or 4 works best!
+ */
+
+#define MAXANGLE       3000.0  /* irrectangular (jwz: was 10000.0) */
+
+/* How many segments to draw per cycle when redrawing */
+#define REDRAWSTEP 3
+
+typedef struct {
+       float       angle;
+       float       radius;
+       float       start_radius;
+       float       end_radius;
+       float       radius_drift_max;
+       float       radius_drift_now;
+
+       float       ratio;
+       float       start_ratio;
+       float       end_ratio;
+       float       ratio_drift_max;
+       float       ratio_drift_now;
+} elem;
+
+typedef struct {
+       int         pix;
+       int         lastx, lasty;
+       int         num, rotor, prev;
+       int         nsave;
+       float       angle;
+       int         centerx, centery;
+       int         prevcenterx, prevcentery;
+       unsigned char firsttime;
+       unsigned char iconifiedscreen;  /* for iconified view */
+       unsigned char forward;
+       unsigned char unused;
+       elem       *elements;
+       XPoint     *save;
+       int         redrawing, redrawpos;
+} rotorstruct;
+
+static rotorstruct *rotors = NULL;
+
+void
+init_rotor(ModeInfo * mi)
+{
+       rotorstruct *rp;
+       int         x;
+       elem       *pelem;
+       unsigned char wasiconified;
+
+       if (rotors == NULL) {
+               if ((rotors = (rotorstruct *) calloc(MI_NUM_SCREENS(mi),
+                                             sizeof (rotorstruct))) == NULL)
+                       return;
+       }
+       rp = &rotors[MI_SCREEN(mi)];
+
+       rp->prevcenterx = rp->centerx;
+       rp->prevcentery = rp->centery;
+
+       rp->centerx = MI_WIN_WIDTH(mi) / 2;
+       rp->centery = MI_WIN_HEIGHT(mi) / 2;
+
+       rp->redrawing = 0;
+       /*
+        * sometimes, you go into iconified view, only to see a really whizzy pattern
+        * that you would like to look more closely at. Normally, clicking in the
+        * icon reinitializes everything - but I don't, cuz I'm that kind of guy.
+        * HENCE, the wasiconified stuff you see here.
+        */
+
+       wasiconified = rp->iconifiedscreen;
+       rp->iconifiedscreen = MI_WIN_IS_ICONIC(mi);
+
+       if (wasiconified && !rp->iconifiedscreen)
+               rp->firsttime = True;
+       else {
+
+               /* This is a fudge is needed since prevcenter may not be set when it comes
+                  from the the random mode and return is pressed (and its not the first
+                  mode that was running). This assumes that the size of the lock screen
+                  window / size of the icon window = 12 */
+               if (!rp->prevcenterx)
+                       rp->prevcenterx = rp->centerx * 12;
+               if (!rp->prevcentery)
+                       rp->prevcentery = rp->centery * 12;
+
+               rp->num = MI_BATCHCOUNT(mi);
+               if (rp->num < 0) {
+                       rp->num = NRAND(-rp->num) + 1;
+                       if (rp->elements != NULL) {
+                               (void) free((void *) rp->elements);
+                               rp->elements = NULL;
+                       }
+               }
+               if (rp->elements == NULL)
+                       rp->elements = (elem *) calloc(rp->num, sizeof (elem));
+               rp->nsave = MI_CYCLES(mi);
+               if (rp->nsave <= 1)
+                       rp->nsave = 2;
+               if (rp->save == NULL)
+                       rp->save = (XPoint *) calloc(rp->nsave, sizeof (XPoint));
+
+               pelem = rp->elements;
+
+               for (x = rp->num; --x >= 0; pelem++) {
+                       pelem->radius_drift_max = 1.0;
+                       pelem->radius_drift_now = 1.0;
+
+                       pelem->end_radius = 100.0;
+
+                       pelem->ratio_drift_max = 1.0;
+                       pelem->ratio_drift_now = 1.0;
+                       pelem->end_ratio = 10.0;
+               }
+               if (MI_NPIXELS(mi) > 2)
+                       rp->pix = NRAND(MI_NPIXELS(mi));
+
+               rp->rotor = 0;
+               rp->prev = 1;
+               rp->lastx = rp->centerx;
+               rp->lasty = rp->centery;
+               rp->angle = (float) NRAND((long) MAXANGLE) / 3.0;
+               rp->forward = rp->firsttime = True;
+       }
+
+       {
+         int line_width = MI_SIZE(mi);
+         if (line_width == 0)
+               line_width = -5;
+         if (line_width < 0)
+               line_width = NRAND(-line_width)+1;
+         XSetLineAttributes(MI_DISPLAY(mi), MI_GC(mi), line_width,
+                                                LineSolid, CapButt, JoinMiter);
+       }
+
+       XClearWindow(MI_DISPLAY(mi), MI_WINDOW(mi));
+}
+
+void
+draw_rotor(ModeInfo * mi)
+{
+       Display    *display = MI_DISPLAY(mi);
+       GC          gc = MI_GC(mi);
+       register rotorstruct *rp = &rotors[MI_SCREEN(mi)];
+       register elem *pelem;
+       int         thisx, thisy;
+       int         i;
+       int         x_1, y_1, x_2, y_2;
+
+       if (!rp->iconifiedscreen) {
+               thisx = rp->centerx;
+               thisy = rp->centery;
+       } else {
+               thisx = rp->prevcenterx;
+               thisy = rp->prevcentery;
+       }
+       for (i = rp->num, pelem = rp->elements; --i >= 0; pelem++) {
+               if (pelem->radius_drift_max <= pelem->radius_drift_now) {
+                       pelem->start_radius = pelem->end_radius;
+                       pelem->end_radius = (float) NRAND(40000) / 100.0 - 200.0;
+                       pelem->radius_drift_max = (float) NRAND(100000) + 10000.0;
+                       pelem->radius_drift_now = 0.0;
+               }
+               if (pelem->ratio_drift_max <= pelem->ratio_drift_now) {
+                       pelem->start_ratio = pelem->end_ratio;
+                       pelem->end_ratio = (float) NRAND(2000) / 100.0 - 10.0;
+                       pelem->ratio_drift_max = (float) NRAND(100000) + 10000.0;
+                       pelem->ratio_drift_now = 0.0;
+               }
+               pelem->ratio = pelem->start_ratio +
+                       (pelem->end_ratio - pelem->start_ratio) /
+                       pelem->ratio_drift_max * pelem->ratio_drift_now;
+               pelem->angle = rp->angle * pelem->ratio;
+               pelem->radius = pelem->start_radius +
+                       (pelem->end_radius - pelem->start_radius) /
+                       pelem->radius_drift_max * pelem->radius_drift_now;
+
+               thisx += (int) (COSF(pelem->angle) * pelem->radius);
+               thisy += (int) (SINF(pelem->angle) * pelem->radius);
+
+               pelem->ratio_drift_now += 1.0;
+               pelem->radius_drift_now += 1.0;
+       }
+       if (rp->firsttime)
+               rp->firsttime = False;
+       else {
+               XSetForeground(display, gc, MI_WIN_BLACK_PIXEL(mi));
+
+               x_1 = (int) rp->save[rp->rotor].x;
+               y_1 = (int) rp->save[rp->rotor].y;
+               x_2 = (int) rp->save[rp->prev].x;
+               y_2 = (int) rp->save[rp->prev].y;
+
+               if (rp->iconifiedscreen) {
+                       x_1 = x_1 * rp->centerx / rp->prevcenterx;
+                       x_2 = x_2 * rp->centerx / rp->prevcenterx;
+                       y_1 = y_1 * rp->centery / rp->prevcentery;
+                       y_2 = y_2 * rp->centery / rp->prevcentery;
+               }
+               XDrawLine(display, MI_WINDOW(mi), gc, x_1, y_1, x_2, y_2);
+
+               if (MI_NPIXELS(mi) > 2) {
+                       XSetForeground(display, gc, MI_PIXEL(mi, rp->pix));
+                       if (++rp->pix >= MI_NPIXELS(mi))
+                               rp->pix = 0;
+               } else
+                       XSetForeground(display, gc, MI_WIN_WHITE_PIXEL(mi));
+
+               x_1 = rp->lastx;
+               y_1 = rp->lasty;
+               x_2 = thisx;
+               y_2 = thisy;
+
+               if (rp->iconifiedscreen) {
+                       x_1 = x_1 * rp->centerx / rp->prevcenterx;
+                       x_2 = x_2 * rp->centerx / rp->prevcenterx;
+                       y_1 = y_1 * rp->centery / rp->prevcentery;
+                       y_2 = y_2 * rp->centery / rp->prevcentery;
+               }
+               XDrawLine(display, MI_WINDOW(mi), gc, x_1, y_1, x_2, y_2);
+       }
+       rp->save[rp->rotor].x = rp->lastx = thisx;
+       rp->save[rp->rotor].y = rp->lasty = thisy;
+
+       ++rp->rotor;
+       rp->rotor %= rp->nsave;
+       ++rp->prev;
+       rp->prev %= rp->nsave;
+       if (rp->forward) {
+               rp->angle += 0.01;
+               if (rp->angle >= MAXANGLE) {
+                       rp->angle = MAXANGLE;
+                       rp->forward = False;
+               }
+       } else {
+               rp->angle -= 0.1;
+               if (rp->angle <= 0) {
+                       rp->angle = 0.0;
+                       rp->forward = True;
+               }
+       }
+       if (rp->redrawing) {
+               int         j;
+
+               for (i = 0; i < REDRAWSTEP; i++) {
+                       j = (rp->rotor - rp->redrawpos + rp->nsave) % rp->nsave;
+
+                       x_1 = (int) rp->save[j].x;
+                       y_1 = (int) rp->save[j].y;
+                       x_2 = (int) rp->save[(j - 1 + rp->nsave) % rp->nsave].x;
+                       y_2 = (int) rp->save[(j - 1 + rp->nsave) % rp->nsave].y;
+
+                       if (rp->iconifiedscreen) {
+                               x_1 = x_1 * rp->centerx / rp->prevcenterx;
+                               x_2 = x_2 * rp->centerx / rp->prevcenterx;
+                               y_1 = y_1 * rp->centery / rp->prevcentery;
+                               y_2 = y_2 * rp->centery / rp->prevcentery;
+                       }
+                       XDrawLine(display, MI_WINDOW(mi), gc, x_1, y_1, x_2, y_2);
+
+                       if (++(rp->redrawpos) >= rp->nsave) {
+                               rp->redrawing = 0;
+                               break;
+                       }
+               }
+       }
+}
+
+void
+release_rotor(ModeInfo * mi)
+{
+       if (rotors != NULL) {
+               int         screen;
+
+               for (screen = 0; screen < MI_NUM_SCREENS(mi); screen++) {
+                       rotorstruct *rp = &rotors[screen];
+
+                       if (rp->elements != NULL)
+                               (void) free((void *) rp->elements);
+                       if (rp->save != NULL)
+                               (void) free((void *) rp->save);
+               }
+               (void) free((void *) rotors);
+               rotors = NULL;
+       }
+}
+
+void
+refresh_rotor(ModeInfo * mi)
+{
+       rotorstruct *rp = &rotors[MI_SCREEN(mi)];
+
+       rp->redrawing = 1;
+       rp->redrawpos = 1;
+}
diff --git a/hacks/screenhack.c b/hacks/screenhack.c
new file mode 100644 (file)
index 0000000..8a882fc
--- /dev/null
@@ -0,0 +1,488 @@
+/* xscreensaver, Copyright (c) 1992, 1995, 1997, 1998
+ *  Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software 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.  No representations are made about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or 
+ * implied warranty.
+ *
+ * And remember: X Windows is to graphics hacking as roman numerals are to
+ * the square root of pi.
+ */
+
+/* This file contains simple code to open a window or draw on the root.
+   The idea being that, when writing a graphics hack, you can just link
+   with this .o to get all of the uninteresting junk out of the way.
+
+   -  create a procedure `screenhack(dpy, window)'
+
+   -  create a variable `char *progclass' which names this program's
+      resource class.
+
+   -  create a variable `char defaults []' for the default resources, and
+      null-terminate it.
+
+   -  create a variable `XrmOptionDescRec options[]' for the command-line,
+      and null-terminate it.
+
+   And that's it...
+ */
+
+#include <stdio.h>
+#include <X11/Intrinsic.h>
+#include <X11/IntrinsicP.h>
+#include <X11/CoreP.h>
+#include <X11/Shell.h>
+#include <X11/StringDefs.h>
+#include <X11/Xutil.h>
+#include <X11/keysym.h>
+
+#ifdef __sgi
+# include <X11/SGIScheme.h>    /* for SgiUseSchemes() */
+#endif /* __sgi */
+
+#ifdef HAVE_XMU
+# ifndef VMS
+#  include <X11/Xmu/Error.h>
+# else /* VMS */
+#  include <Xmu/Error.h>
+# endif
+#else
+# include "xmu.h"
+#endif
+#include "screenhack.h"
+#include "version.h"
+#include "vroot.h"
+
+char *progname;
+XrmDatabase db;
+XtAppContext app;
+Bool mono_p;
+
+static XrmOptionDescRec default_options [] = {
+  { "-root",   ".root",                XrmoptionNoArg, "True" },
+  { "-window", ".root",                XrmoptionNoArg, "False" },
+  { "-mono",   ".mono",                XrmoptionNoArg, "True" },
+  { "-install",        ".installColormap",     XrmoptionNoArg, "True" },
+  { "-noinstall",".installColormap",   XrmoptionNoArg, "False" },
+  { "-visual", ".visualID",            XrmoptionSepArg, 0 },
+  { "-window-id", ".windowID",         XrmoptionSepArg, 0 },
+  { 0, 0, 0, 0 }
+};
+
+static char *default_defaults[] = {
+  ".root:              false",
+  "*geometry:          600x480", /* this should be .geometry, but nooooo... */
+  "*mono:              false",
+  "*installColormap:   false",
+  "*visualID:          default",
+  "*windowID:          ",
+  0
+};
+
+static XrmOptionDescRec *merged_options;
+static int merged_options_size;
+static char **merged_defaults;
+
+static void
+merge_options (void)
+{
+  int def_opts_size, opts_size;
+  int def_defaults_size, defaults_size;
+
+  for (def_opts_size = 0; default_options[def_opts_size].option;
+       def_opts_size++)
+    ;
+  for (opts_size = 0; options[opts_size].option; opts_size++)
+    ;
+
+  merged_options_size = def_opts_size + opts_size;
+  merged_options = (XrmOptionDescRec *)
+    malloc ((merged_options_size + 1) * sizeof(*default_options));
+  memcpy (merged_options, default_options,
+         (def_opts_size * sizeof(*default_options)));
+  memcpy (merged_options + def_opts_size, options,
+         ((opts_size + 1) * sizeof(*default_options)));
+
+  for (def_defaults_size = 0; default_defaults[def_defaults_size];
+       def_defaults_size++)
+    ;
+  for (defaults_size = 0; defaults[defaults_size]; defaults_size++)
+    ;
+  merged_defaults = (char **)
+    malloc ((def_defaults_size + defaults_size + 1) * sizeof (*defaults));;
+  memcpy (merged_defaults, default_defaults,
+         def_defaults_size * sizeof(*defaults));
+  memcpy (merged_defaults + def_defaults_size, defaults,
+         (defaults_size + 1) * sizeof(*defaults));
+
+  /* This totally sucks.  Xt should behave like this by default.
+     If the string in `defaults' looks like ".foo", change that
+     to "Progclass.foo".
+   */
+  {
+    char **s;
+    for (s = merged_defaults; *s; s++)
+      if (**s == '.')
+       {
+         const char *oldr = *s;
+         char *newr = (char *) malloc(strlen(oldr) + strlen(progclass) + 3);
+         strcpy (newr, progclass);
+         strcat (newr, oldr);
+         *s = newr;
+       }
+  }
+}
+
+\f
+/* Make the X errors print out the name of this program, so we have some
+   clue which one has a bug when they die under the screensaver.
+ */
+
+static int
+screenhack_ehandler (Display *dpy, XErrorEvent *error)
+{
+  fprintf (stderr, "\nX error in %s:\n", progname);
+  if (XmuPrintDefaultErrorMessage (dpy, error, stderr))
+    exit (-1);
+  else
+    fprintf (stderr, " (nonfatal.)\n");
+  return 0;
+}
+
+static Bool
+MapNotify_event_p (Display *dpy, XEvent *event, XPointer window)
+{
+  return (event->xany.type == MapNotify &&
+         event->xvisibility.window == (Window) window);
+}
+
+
+#ifdef XLOCKMORE
+extern void pre_merge_options (void);
+#endif
+
+
+static Atom XA_WM_PROTOCOLS, XA_WM_DELETE_WINDOW;
+
+/* Dead-trivial event handling: exits if "q" or "ESC" are typed.
+   Exit if the WM_PROTOCOLS WM_DELETE_WINDOW ClientMessage is received.
+ */
+void
+screenhack_handle_event (Display *dpy, XEvent *event)
+{
+  switch (event->xany.type)
+    {
+    case KeyPress:
+      {
+        KeySym keysym;
+        char c = 0;
+        XLookupString (&event->xkey, &c, 1, &keysym, 0);
+        if (c == 'q' ||
+            c == 'Q' ||
+            c == 3 ||  /* ^C */
+            c == 27)   /* ESC */
+          exit (0);
+        else if (! (keysym >= XK_Shift_L && keysym <= XK_Hyper_R))
+          XBell (dpy, 0);  /* beep for non-chord keys */
+      }
+      break;
+    case ButtonPress:
+      XBell (dpy, 0);
+      break;
+    case ClientMessage:
+      {
+        if (event->xclient.message_type != XA_WM_PROTOCOLS)
+          {
+            char *s = XGetAtomName(dpy, event->xclient.message_type);
+            if (!s) s = "(null)";
+            fprintf (stderr, "%s: unknown ClientMessage %s received!\n",
+                     progname, s);
+          }
+        else if (event->xclient.data.l[0] != XA_WM_DELETE_WINDOW)
+          {
+            char *s1 = XGetAtomName(dpy, event->xclient.message_type);
+            char *s2 = XGetAtomName(dpy, event->xclient.data.l[0]);
+            if (!s1) s1 = "(null)";
+            if (!s2) s2 = "(null)";
+            fprintf (stderr, "%s: unknown ClientMessage %s[%s] received!\n",
+                     progname, s1, s2);
+          }
+        else
+          {
+            exit (0);
+          }
+      }
+      break;
+    }
+}
+
+
+void
+screenhack_handle_events (Display *dpy)
+{
+  while (XPending (dpy))
+    {
+      XEvent event;
+      XNextEvent (dpy, &event);
+      screenhack_handle_event (dpy, &event);
+    }
+}
+
+
+static Visual *
+pick_visual (Screen *screen)
+{
+#ifdef USE_GL
+  /* If we're linking against GL (that is, this is the version of screenhack.o
+     that the GL hacks will use, which is different from the one that the
+     non-GL hacks will use) then try to pick the "best" visual by interrogating
+     the GL library instead of by asking Xlib.  GL knows better.
+   */
+  Visual *v = 0;
+  char *string = get_string_resource ("visualID", "VisualID");
+
+  if (!string || !*string ||
+      !strcmp (string, "gl") ||
+      !strcmp (string, "best") ||
+      !strcmp (string, "color") ||
+      !strcmp (string, "default"))
+    v = get_gl_visual (screen);                /* from ../utils/visual-gl.c */
+
+  if (string)
+    free (string);
+  if (v)
+    return v;
+#endif /* USE_GL */
+
+  return get_visual_resource (screen, "visualID", "VisualID", False);
+}
+
+
+int
+main (int argc, char **argv)
+{
+  Widget toplevel;
+  Display *dpy;
+  Window window;
+  Visual *visual;
+  Colormap cmap;
+  Bool root_p;
+  Window on_window = 0;
+  XEvent event;
+  Boolean dont_clear /*, dont_map */;
+  char version[255];
+
+#ifdef XLOCKMORE
+  pre_merge_options ();
+#endif
+  merge_options ();
+
+#ifdef __sgi
+  /* We have to do this on SGI to prevent the background color from being
+     overridden by the current desktop color scheme (we'd like our backgrounds
+     to be black, thanks.)  This should be the same as setting the
+     "*useSchemes: none" resource, but it's not -- if that resource is
+     present in the `default_defaults' above, it doesn't work, though it
+     does work when passed as an -xrm arg on the command line.  So screw it,
+     turn them off from C instead.
+   */
+  SgiUseSchemes ("none"); 
+#endif /* __sgi */
+
+  toplevel = XtAppInitialize (&app, progclass, merged_options,
+                             merged_options_size, &argc, argv,
+                             merged_defaults, 0, 0);
+  dpy = XtDisplay (toplevel);
+  db = XtDatabase (dpy);
+  XtGetApplicationNameAndClass (dpy, &progname, &progclass);
+  XSetErrorHandler (screenhack_ehandler);
+
+  XA_WM_PROTOCOLS = XInternAtom (dpy, "WM_PROTOCOLS", False);
+  XA_WM_DELETE_WINDOW = XInternAtom (dpy, "WM_DELETE_WINDOW", False);
+
+  {
+    char *v = (char *) strdup(strchr(screensaver_id, ' '));
+    char *s1, *s2, *s3, *s4;
+    s1 = (char *) strchr(v,  ' '); s1++;
+    s2 = (char *) strchr(s1, ' ');
+    s3 = (char *) strchr(v,  '('); s3++;
+    s4 = (char *) strchr(s3, ')');
+    *s2 = 0;
+    *s4 = 0;
+    sprintf (version, "%s: from the XScreenSaver %s distribution (%s.)",
+            progclass, s1, s3);
+    free(v);
+  }
+
+  if (argc > 1)
+    {
+      const char *s;
+      int i;
+      int x = 18;
+      int end = 78;
+      Bool help_p = !strcmp(argv[1], "-help");
+      fprintf (stderr, "%s\n", version);
+      for (s = progclass; *s; s++) fprintf(stderr, " ");
+      fprintf (stderr, "  http://www.jwz.org/xscreensaver/\n\n");
+
+      if (!help_p)
+       fprintf(stderr, "Unrecognised option: %s\n", argv[1]);
+      fprintf (stderr, "Options include: ");
+      for (i = 0; i < merged_options_size; i++)
+       {
+         char *sw = merged_options [i].option;
+         Bool argp = (merged_options [i].argKind == XrmoptionSepArg);
+         int size = strlen (sw) + (argp ? 6 : 0) + 2;
+         if (x + size >= end)
+           {
+             fprintf (stderr, "\n\t\t ");
+             x = 18;
+           }
+         x += size;
+         fprintf (stderr, "%s", sw);
+         if (argp) fprintf (stderr, " <arg>");
+         if (i != merged_options_size - 1) fprintf (stderr, ", ");
+       }
+      fprintf (stderr, ".\n");
+      exit (help_p ? 0 : 1);
+    }
+
+  dont_clear = get_boolean_resource ("dontClearRoot", "Boolean");
+/*dont_map = get_boolean_resource ("dontMapWindow", "Boolean"); */
+  mono_p = get_boolean_resource ("mono", "Boolean");
+  if (CellsOfScreen (DefaultScreenOfDisplay (dpy)) <= 2)
+    mono_p = True;
+
+  root_p = get_boolean_resource ("root", "Boolean");
+
+  {
+    char *s = get_string_resource ("windowID", "WindowID");
+    if (s && *s)
+      on_window = get_integer_resource ("windowID", "WindowID");
+    if (s) free (s);
+  }
+
+  if (on_window)
+    {
+      XWindowAttributes xgwa;
+      window = (Window) on_window;
+      XtDestroyWidget (toplevel);
+      XGetWindowAttributes (dpy, window, &xgwa);
+      cmap = xgwa.colormap;
+      visual = xgwa.visual;
+    }
+  else if (root_p)
+    {
+      XWindowAttributes xgwa;
+      window = RootWindowOfScreen (XtScreen (toplevel));
+      XtDestroyWidget (toplevel);
+      XGetWindowAttributes (dpy, window, &xgwa);
+      cmap = xgwa.colormap;
+      visual = xgwa.visual;
+    }
+  else
+    {
+      Boolean def_visual_p;
+      Screen *screen = XtScreen (toplevel);
+      visual = pick_visual (screen);
+
+      if (toplevel->core.width <= 0)
+       toplevel->core.width = 600;
+      if (toplevel->core.height <= 0)
+       toplevel->core.height = 480;
+
+      def_visual_p = (visual == DefaultVisualOfScreen (screen));
+
+      if (!def_visual_p)
+       {
+         unsigned int bg, bd;
+         Widget new;
+
+         cmap = XCreateColormap (dpy, RootWindowOfScreen(screen),
+                                 visual, AllocNone);
+         bg = get_pixel_resource ("background", "Background", dpy, cmap);
+         bd = get_pixel_resource ("borderColor", "Foreground", dpy, cmap);
+
+         new = XtVaAppCreateShell (progname, progclass,
+                                   topLevelShellWidgetClass, dpy,
+                                   XtNmappedWhenManaged, False,
+                                   XtNvisual, visual,
+                                   XtNdepth, visual_depth (screen, visual),
+                                   XtNwidth, toplevel->core.width,
+                                   XtNheight, toplevel->core.height,
+                                   XtNcolormap, cmap,
+                                   XtNbackground, (Pixel) bg,
+                                   XtNborderColor, (Pixel) bd,
+                                   0);
+         XtDestroyWidget (toplevel);
+         toplevel = new;
+         XtRealizeWidget (toplevel);
+         window = XtWindow (toplevel);
+       }
+      else
+       {
+         XtVaSetValues (toplevel, XtNmappedWhenManaged, False, 0);
+         XtRealizeWidget (toplevel);
+         window = XtWindow (toplevel);
+
+         if (get_boolean_resource ("installColormap", "InstallColormap"))
+           {
+             cmap = XCreateColormap (dpy, window,
+                                  DefaultVisualOfScreen (XtScreen (toplevel)),
+                                     AllocNone);
+             XSetWindowColormap (dpy, window, cmap);
+           }
+         else
+           {
+             cmap = DefaultColormap (dpy, DefaultScreen (dpy));
+           }
+       }
+
+/*
+      if (dont_map)
+       {
+         XtVaSetValues (toplevel, XtNmappedWhenManaged, False, 0);
+         XtRealizeWidget (toplevel);
+       }
+      else
+*/
+       {
+         XtPopup (toplevel, XtGrabNone);
+       }
+
+      XtVaSetValues(toplevel, XtNtitle, version, 0);
+
+      /* For screenhack_handle_events(): select KeyPress, and
+         announce that we accept WM_DELETE_WINDOW. */
+      {
+        XWindowAttributes xgwa;
+        XGetWindowAttributes (dpy, window, &xgwa);
+        XSelectInput (dpy, window,
+                      xgwa.your_event_mask | KeyPressMask | ButtonPressMask);
+        XChangeProperty (dpy, window, XA_WM_PROTOCOLS, XA_ATOM, 32,
+                         PropModeReplace,
+                         (unsigned char *) &XA_WM_DELETE_WINDOW, 1);
+      }
+    }
+
+  if (!dont_clear)
+    {
+      XSetWindowBackground (dpy, window,
+                           get_pixel_resource ("background", "Background",
+                                               dpy, cmap));
+      XClearWindow (dpy, window);
+    }
+
+  if (!root_p && !on_window)
+    /* wait for it to be mapped */
+    XIfEvent (dpy, &event, MapNotify_event_p, (XPointer) window);
+
+  XSync (dpy, False);
+  srandom ((int) time ((time_t *) 0));
+  screenhack (dpy, window); /* doesn't return */
+  return 0;
+}
diff --git a/hacks/screenhack.h b/hacks/screenhack.h
new file mode 100644 (file)
index 0000000..6322252
--- /dev/null
@@ -0,0 +1,100 @@
+/* xscreensaver, Copyright (c) 1992-1997 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software 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.  No representations are made about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or 
+ * implied warranty.
+ */
+
+/* Found in Don Hopkins' .plan file:
+ *
+ *   The color situation is a total flying circus.  The X approach to
+ *   device independence is to treat everything like a MicroVax framebuffer
+ *   on acid.  A truely portable X application is required to act like the
+ *   persistent customer in the Monty Python ``Cheese Shop'' sketch.  Even
+ *   the simplest applications must answer many difficult questions, like:
+ *
+ *   WHAT IS YOUR DISPLAY?
+ *       display = XOpenDisplay("unix:0");
+ *   WHAT IS YOUR ROOT?
+ *       root = RootWindow(display, DefaultScreen(display));
+ *   AND WHAT IS YOUR WINDOW?
+ *       win = XCreateSimpleWindow(display, root, 0, 0, 256, 256, 1,
+ *                                 BlackPixel(display, DefaultScreen(display)),
+ *                                 WhitePixel(display, DefaultScreen(display)))
+ *   OH ALL RIGHT, YOU CAN GO ON.
+ *
+ *   WHAT IS YOUR DISPLAY?
+ *         display = XOpenDisplay("unix:0");
+ *   WHAT IS YOUR COLORMAP?
+ *         cmap = DefaultColormap(display, DefaultScreen(display));
+ *   AND WHAT IS YOUR FAVORITE COLOR?
+ *         favorite_color = 0; / * Black. * /
+ *         / * Whoops! No, I mean: * /
+ *         favorite_color = BlackPixel(display, DefaultScreen(display));
+ *         / * AAAYYYYEEEEE!! (client dumps core & falls into the chasm) * /
+ *
+ *   WHAT IS YOUR DISPLAY?
+ *         display = XOpenDisplay("unix:0");
+ *   WHAT IS YOUR VISUAL?
+ *         struct XVisualInfo vinfo;
+ *         if (XMatchVisualInfo(display, DefaultScreen(display),
+ *                              8, PseudoColor, &vinfo) != 0)
+ *            visual = vinfo.visual;
+ *   AND WHAT IS THE NET SPEED VELOCITY OF AN XConfigureWindow REQUEST?
+ *         / * Is that a SubStructureRedirectMask or a ResizeRedirectMask? * /
+ *   WHAT?! HOW AM I SUPPOSED TO KNOW THAT?
+ *   AAAAUUUGGGHHH!!!! (server dumps core & falls into the chasm)
+ */
+
+#ifndef __SCREENHACK_H__
+#define __SCREENHACK_H__
+
+#include <stdlib.h>
+
+#include "config.h"
+
+#ifdef __hpux
+ /* Which of the ten billion standards does values.h belong to?
+    What systems always have it? */
+# include <values.h>
+#endif
+
+#include <stdio.h>
+
+#include <X11/Xlib.h>
+#include <X11/Xresource.h>
+#include <X11/Xos.h>
+
+/* M_PI ought to have been defined in math.h, but... */
+#ifndef M_PI
+# define M_PI 3.1415926535
+#endif
+
+#ifndef M_PI_2
+# define M_PI_2 1.5707963267
+#endif
+
+#include "yarandom.h"
+#include "usleep.h"
+#include "resources.h"
+#include "hsv.h"
+#include "colors.h"
+#include "grabscreen.h"
+#include "visual.h"
+
+extern Bool mono_p;
+extern char *progname;
+extern char *progclass;
+extern XrmDatabase db;
+extern XrmOptionDescRec options [];
+extern char *defaults [];
+
+extern void screenhack (Display*,Window);
+extern void screenhack_handle_event (Display*, XEvent*);
+extern void screenhack_handle_events (Display*);
+
+#endif /* __SCREENHACK_H__ */
diff --git a/hacks/shadebobs.c b/hacks/shadebobs.c
new file mode 100644 (file)
index 0000000..fc89cee
--- /dev/null
@@ -0,0 +1,390 @@
+/* shadebobs, Copyright (c) 1999 Shane Smit <blackend@inconnect.com>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software 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.  No representations are made about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or
+ * implied warranty.
+ *
+ * Module - "shadebobs.c"
+ *
+ * Description:
+ *  There are two little shading circles (bobs) that zip around the screen.
+ *  one of them shades up towards white, and the other shades down toward
+ *  black.
+ *  This keeps the screen in color balance at a chosen color.
+ *
+ *  Its kinda like 'The Force'
+ *   There is a light side, a dark side, and it keeps the world in balance.
+ *
+ * [05/23/99] - Shane Smit: Creation
+ * [05/26/99] - Shane Smit: Port to C/screenhack for use with XScreenSaver
+ * [06/11/99] - Shane Smit: Stopped trying to rape the palette.
+ * [06/20/99] - jwz: cleaned up ximage handling, gave resoources short names,
+ *                introduced delay, made it restart after N iterations.
+ * [06/21/99] - Shane Smit: Modified default values slightly, color changes
+ *                on cycle, and the extents of the sinus pattern change in
+ *                real-time.
+ * [06/22/99] - Shane Smit: Fixed delay to be fast and use little CPU :).
+ */
+
+#include <math.h>
+#include "screenhack.h"
+#include <X11/Xutil.h>
+
+/* #define VERBOSE */
+
+char *progclass = "ShadeBobs";
+
+char *defaults [] = {
+  "*degrees:  512",
+  "*color:    random",
+  "*count:    2",
+  "*cycles:   50",
+  "*ncolors:  64",    /* changing this doesn't work particularly well */
+  "*delay:    5000",
+  0
+};
+
+XrmOptionDescRec options [] = {
+  { "-degrees", ".degrees", XrmoptionSepArg, 0 },
+  { "-color",   ".color",   XrmoptionSepArg, 0 },
+  { "-count",   ".count",   XrmoptionSepArg, 0 },
+  { "-delay",   ".delay",   XrmoptionSepArg, 0 },
+  { "-cycles",  ".cycles",  XrmoptionSepArg, 0 },
+  { 0, 0, 0, 0 }
+};
+
+static unsigned short nDegreeCount;
+static double *anSinTable;
+static unsigned short nMaxExtentX, nMaxExtentY;
+static unsigned short nMinExtentX, nMinExtentY;
+static unsigned short nHalfWidth, nHalfHeight;
+static char *sColor;
+
+#define RANDOM() ((int) (random() & 0X7FFFFFFFL))
+
+
+/* Ahem. Chocolate is a flavor; not a food. Thank you */
+
+
+#define MAPSIZE 32
+
+typedef struct
+{
+  char anDeltaMap[ MAPSIZE * MAPSIZE ];  /* 32 x 32 Delta Map */
+  double nVelocityX, nVelocityY;
+  double nAngleX, nAngleY;
+  short nExtentX, nExtentY;
+} SShadeBob;
+
+
+static void ResetShadeBob( SShadeBob *pShadeBob )
+{
+  pShadeBob->nAngleX = RANDOM() % nDegreeCount;
+  pShadeBob->nAngleY = RANDOM() % nDegreeCount;
+
+  pShadeBob->nExtentX = (RANDOM() % (nMaxExtentX - nMinExtentX)) + nMinExtentX;
+  pShadeBob->nExtentY = (RANDOM() % (nMaxExtentY - nMinExtentY)) + nMinExtentY;
+}
+
+
+static void InitShadeBob( SShadeBob *pShadeBob, Bool bDark )
+{
+  double nDelta;
+  char iWidth, iHeight;
+
+  for( iHeight=-16; iHeight<16; iHeight++ )
+    for( iWidth=-16; iWidth<16; iWidth++ )
+    {
+      nDelta = 9 - (sqrt( pow( iWidth+0.5, 2 ) + pow( iHeight+0.5, 2 ) ) / 2 );
+      if( nDelta < 0 )  nDelta = 0;
+      if( bDark ) nDelta = -nDelta;
+      pShadeBob->anDeltaMap[ (iWidth+(MAPSIZE/2))*MAPSIZE
+                           + iHeight+(MAPSIZE/2) ] = (char)nDelta;
+    }
+
+       ResetShadeBob( pShadeBob );
+}
+
+
+static void Execute( SShadeBob *pShadeBob, Display *pDisplay,
+                     Window MainWindow,
+                     GC *pGC, XImage *pXImage,
+                     int ncolors, XColor *aXColors )
+{
+  long nColor;
+  short nIndex;
+  unsigned int nXPos, nYPos;
+  unsigned int iWidth, iHeight;
+
+  pShadeBob->nVelocityX += ( ( RANDOM() % 200 ) - 100 ) / 1000.0F;
+  pShadeBob->nVelocityY += ( ( RANDOM() % 200 ) - 100 ) / 1000.0F;
+
+  if(      pShadeBob->nVelocityX > 4 )  pShadeBob->nVelocityX = 4;
+  else if( pShadeBob->nVelocityX < 3 )  pShadeBob->nVelocityX = 3;
+  if(      pShadeBob->nVelocityY > 4 )  pShadeBob->nVelocityY = 4;
+  else if( pShadeBob->nVelocityY < 3 )  pShadeBob->nVelocityY = 3;
+
+  pShadeBob->nAngleX += pShadeBob->nVelocityX;
+  pShadeBob->nAngleY += pShadeBob->nVelocityY;
+
+  if(      pShadeBob->nAngleX >= nDegreeCount ) pShadeBob->nAngleX -= nDegreeCount;
+  else if( pShadeBob->nAngleX < 0 )             pShadeBob->nAngleX += nDegreeCount;
+  if(      pShadeBob->nAngleY >= nDegreeCount ) pShadeBob->nAngleY -= nDegreeCount;
+  else if( pShadeBob->nAngleY < 0 )             pShadeBob->nAngleY += nDegreeCount;
+
+  pShadeBob->nExtentX += ( RANDOM() % 5 ) - 2;
+  if( pShadeBob->nExtentX > nMaxExtentX ) pShadeBob->nExtentX = nMaxExtentX;
+  if( pShadeBob->nExtentX < nMinExtentX ) pShadeBob->nExtentX = nMinExtentX;
+  pShadeBob->nExtentY += ( RANDOM() % 5 ) - 2;
+  if( pShadeBob->nExtentY > nMaxExtentY ) pShadeBob->nExtentY = nMaxExtentY;
+  if( pShadeBob->nExtentY < nMinExtentY ) pShadeBob->nExtentY = nMinExtentY;
+
+  /* Trig is your friend :) */
+  nXPos = (unsigned int)(( anSinTable[ (int)pShadeBob->nAngleX ] * pShadeBob->nExtentX )
+                         + nHalfWidth);
+  nYPos = (unsigned int)(( anSinTable[ (int)pShadeBob->nAngleY ] * pShadeBob->nExtentY )
+                         + nHalfHeight);
+
+  for( iHeight=0; iHeight < MAPSIZE; iHeight++ )
+  {
+    for( iWidth=0; iWidth < MAPSIZE; iWidth++ )
+    {
+      nColor = XGetPixel( pXImage, nXPos + iWidth, nYPos + iHeight );
+
+      /*  FIXME: Here is a loop I'd love to take out. */
+      for( nIndex=0; nIndex < ncolors; nIndex++ )
+        if( aXColors[ nIndex ].pixel == nColor )
+          break;
+
+      nIndex += pShadeBob->anDeltaMap[ iWidth * MAPSIZE + iHeight ];
+      if( nIndex >= ncolors ) nIndex = ncolors-1;
+      if( nIndex < 0 )  nIndex = 0;
+
+      XPutPixel( pXImage, nXPos + iWidth, nYPos + iHeight,
+                 aXColors[ nIndex ].pixel );
+    }
+  }
+  /* Place graphics in window */
+  XPutImage( pDisplay, MainWindow, *pGC, pXImage,
+             nXPos, nYPos, nXPos, nYPos, MAPSIZE, MAPSIZE );
+  XSync (pDisplay, False);
+}
+
+
+static void CreateTables( unsigned int nDegrees )
+{
+  double nRadian;
+  unsigned int iDegree;
+  anSinTable = calloc( nDegrees, sizeof(double) );
+
+  for( iDegree=0; iDegree<nDegrees; iDegree++ )
+  {
+    nRadian = ( (double)(2*iDegree) / (double)nDegrees ) * M_PI;
+    anSinTable[ iDegree ] = sin( nRadian );
+  }
+}
+
+
+static void SetPalette(Display *pDisplay, Window Win, char *sColor,
+                       int *ncolorsP, XColor *aXColors )
+{
+  XWindowAttributes XWinAttrib;
+  Colormap CMap;
+  XColor Color;
+  int nHue;
+  double nSat, nVal;
+
+  XGetWindowAttributes( pDisplay, Win, &XWinAttrib );
+  CMap = XWinAttrib.colormap;
+
+  Color.red = ( RANDOM() % 3 ) * 0x7FFF;    /*  Either full, half or none. */
+  Color.green = ( RANDOM() % 3 ) * 0x7FFF;
+  Color.blue = ( RANDOM() % 3 ) * 0x7FFF;
+
+  /*  If Color is black, grey, or white, then make SURE its a color */
+  if( Color.red == Color.green && Color.green == Color.blue )
+  { Color.red = 0xFFFF;
+    Color.green = ( RANDOM() % 3 ) * 0x7FFF;
+    Color.blue = 0; }
+
+  if( strcasecmp( sColor, "random" ) &&
+      !XParseColor( pDisplay, CMap, sColor, &Color ) )
+    fprintf( stderr,
+             "%s: color %s not found in database. Choosing to random...\n",
+             progname, sColor );
+
+  rgb_to_hsv( Color.red, Color.green, Color.blue, &nHue, &nSat, &nVal );
+#ifdef VERBOSE
+  printf( "RGB (%d, %d, %d) = HSV (%d, %g, %g)\n",
+          Color.red, Color.green, Color.blue, nHue, nSat, nVal );
+#endif  /*  VERBOSE */
+
+  if (*ncolorsP != 0)
+    free_colors (pDisplay, CMap, aXColors, *ncolorsP);
+
+  *ncolorsP = get_integer_resource ("ncolors", "Integer");
+  if (*ncolorsP <= 0) *ncolorsP = 64;
+
+  /* allocate two color ramps, black -> color -> white. */
+  {
+    int n1, n2;
+    n1 = *ncolorsP / 2;
+    make_color_ramp( pDisplay, CMap, 0, 0, 0, nHue, nSat, nVal,
+                     aXColors, &n1,
+                     False, True, False );
+    n2 = *ncolorsP - n1;
+    make_color_ramp( pDisplay, CMap, nHue, nSat, nVal, 0, 0, 1,
+                     aXColors + n1, &n2,
+                     False, True, False );
+    *ncolorsP = n1 + n2;
+  }
+}
+
+
+static void Initialize( Display *pDisplay, Window Win,
+                        GC *pGC, XImage *pXImage,
+                        int *ncolorsP, XColor *aXColors )
+{
+  XGCValues gcValues;
+  XWindowAttributes XWinAttribs;
+  int bpp;
+
+  /* Create the Image for drawing */
+  XGetWindowAttributes( pDisplay, Win, &XWinAttribs );
+
+  /* Find the preferred bits-per-pixel. */
+  {
+    int i, pfvc = 0;
+    XPixmapFormatValues *pfv = XListPixmapFormats (pDisplay, &pfvc);
+    for (i = 0; i < pfvc; i++)
+      if (pfv[i].depth == XWinAttribs.depth)
+        {
+          bpp = pfv[i].bits_per_pixel;
+          break;
+        }
+    if (pfv)
+      XFree (pfv);
+  }
+
+  /*  Create the GC. */
+  *pGC = XCreateGC( pDisplay, Win, 0, &gcValues );
+
+  memset (pXImage, 0, sizeof(*pXImage));
+  pXImage->width = XWinAttribs.width;                   /* Width of image */
+  pXImage->height = XWinAttribs.height;                 /* Height of image */
+  pXImage->format = ZPixmap;                /* XYBitmap, XYPixmap, ZPixmap */
+
+  /* Pointer to image data */
+  pXImage->byte_order = ImageByteOrder(pDisplay);
+  pXImage->bitmap_unit = BitmapUnit(pDisplay);
+  pXImage->bitmap_bit_order = BitmapBitOrder(pDisplay);
+  pXImage->bitmap_pad = BitmapPad(pDisplay);
+  pXImage->depth = XWinAttribs.depth;
+  pXImage->bytes_per_line = 0;                /* Accelerator to next line */
+  pXImage->bits_per_pixel = bpp;
+  XInitImage( pXImage );
+  pXImage->data = calloc(pXImage->bytes_per_line, pXImage->height);
+
+  /*  These are precalculations used in Execute(). */
+  nMaxExtentX = ( XWinAttribs.width / 2 ) - 20;
+  nMaxExtentY = ( XWinAttribs.height / 2 ) - 20;
+  nMinExtentX = nMaxExtentX / 3;
+  nMinExtentY = nMaxExtentY / 3;
+  nHalfWidth = ( XWinAttribs.width / 2 ) - 16;
+  nHalfHeight = ( XWinAttribs.height / 2 ) - 16;
+
+  /*  Create the Sin and Cosine lookup tables. */
+  nDegreeCount = get_integer_resource( "degrees", "Integer" );
+  if( nDegreeCount < 90 ) nDegreeCount = 90;
+  if( nDegreeCount > 5400 ) nDegreeCount = 5400;
+  CreateTables( nDegreeCount );
+
+  /*  Get the colors. */
+  sColor = get_string_resource( "color", "Color" );
+  if( sColor == NULL)
+    SetPalette( pDisplay, Win, "random", ncolorsP, aXColors );
+  else
+    SetPalette( pDisplay, Win, sColor, ncolorsP, aXColors );
+}
+
+
+void screenhack(Display *pDisplay, Window Win )
+{
+  GC gc;
+  int ncolors = 0;
+  XColor aXColors[ 256 ];
+  XImage Image;
+  unsigned char nShadeBobCount, iShadeBob;
+  SShadeBob *aShadeBobs;
+#ifdef VERBOSE
+  time_t nTime = time( NULL );
+  unsigned short iFrame = 0;
+#endif  /*  VERBOSE */
+  int delay, cycles, i;
+
+  nShadeBobCount = get_integer_resource( "count", "Integer" );
+  if( nShadeBobCount > 64 ) nShadeBobCount = 64;
+  if( nShadeBobCount < 1 )  nShadeBobCount = 1;
+
+  if( ( aShadeBobs = calloc( nShadeBobCount, sizeof(SShadeBob) ) ) == NULL )
+  {
+    fprintf( stderr, "Could not allocate %d ShadeBobs\n", nShadeBobCount );
+    return;
+  }
+#ifdef VERBOSE 
+  printf( "Allocated %d ShadeBobs\n", nShadeBobCount );
+#endif  /*  VERBOSE */
+
+  Initialize( pDisplay, Win, &gc, &Image, &ncolors, aXColors );
+
+  for( iShadeBob=0; iShadeBob<nShadeBobCount; iShadeBob++ )
+    InitShadeBob( &aShadeBobs[ iShadeBob ], iShadeBob % 2 );
+
+  delay = get_integer_resource( "delay", "Integer" );
+  cycles = get_integer_resource( "cycles", "Integer" ) * (nDegreeCount / 3);
+  i = cycles;
+
+  while (1)
+  {
+    screenhack_handle_events( pDisplay );
+
+    if (i++ >= cycles)
+    {
+      i = 0;
+      XClearWindow (pDisplay, Win);
+      memset (Image.data, 0, Image.bytes_per_line * Image.height);
+      for( iShadeBob=0; iShadeBob<nShadeBobCount; iShadeBob++ )
+        ResetShadeBob( &aShadeBobs[ iShadeBob ] );
+      SetPalette( pDisplay, Win, sColor, &ncolors, aXColors );
+    }
+
+    for( iShadeBob=0; iShadeBob<nShadeBobCount; iShadeBob++ )
+      Execute( &aShadeBobs[ iShadeBob ], pDisplay, Win, &gc,
+               &Image, ncolors, aXColors );
+
+    if( delay && !(i % 4) )
+               usleep(delay);
+
+#ifdef VERBOSE
+    iFrame++;
+    if( nTime - time( NULL ) )
+    {
+      printf( "FPS: %d\n", iFrame );
+      nTime = time( NULL );
+      iFrame = 0;
+    }
+#endif  /*  VERBOSE */
+  }
+
+  free( anSinTable );
+  free( Image.data );
+  XDestroyImage( &Image );
+  free( aShadeBobs );
+}
+
+
+/* End of Module - "shadebobs.c" */
diff --git a/hacks/sierpinski.c b/hacks/sierpinski.c
new file mode 100644 (file)
index 0000000..ca22999
--- /dev/null
@@ -0,0 +1,184 @@
+/* -*- Mode: C; tab-width: 4 -*- */
+/* sierpinski --- Sierpinski's triangle fractal */
+
+#if !defined( lint ) && !defined( SABER )
+static const char sccsid[] = "@(#)sierpinski.c 4.05 97/09/19 xlockmore";
+#endif
+
+/* Copyright (c) 1996 by Desmond Daignault
+ *
+ * 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.
+ *
+ * This file is provided AS IS with no warranties of any kind.  The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof.  In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * Revision History:
+ * 18-Sep-97: 3D version Antti Kuntsi <kuntsi@iki.fi>.
+ * 20-May-97: Changed the name tri to sierpinski for more compatiblity
+ * 10-May-97: jwz@jwz.org: turned into a standalone program.
+ * 05-Sep-96: Desmond Daignault Datatimes Incorporated
+ *            <tekdd@dtol.datatimes.com> .
+ */
+
+#ifdef STANDALONE
+# define PROGCLASS                                     "Sierpinski"
+# define HACK_INIT                                     init_sierpinski
+# define HACK_DRAW                                     draw_sierpinski
+# define sierpinski_opts                       xlockmore_opts
+# define DEFAULTS      "*delay:                400000  \n"                     \
+                                       "*count:                2000    \n"                     \
+                                       "*cycles:               100     \n"                     \
+                                       "*ncolors:              64   \n"
+# define BRIGHT_COLORS
+# include "xlockmore.h"                                /* from the xscreensaver distribution */
+#else  /* !STANDALONE */
+# include "xlock.h"                                    /* from the xlockmore distribution */
+#endif /* !STANDALONE */
+
+ModeSpecOpt sierpinski_opts =
+{0, NULL, 0, NULL, NULL};
+
+#define MAXCORNERS 4
+
+typedef struct {
+       int         width, height;
+       int         time;
+       int         px, py;
+       int         total_npoints;
+  int         corners;
+       int         npoints[MAXCORNERS];
+       unsigned long colors[MAXCORNERS];
+       XPoint     *pointBuffer[MAXCORNERS];
+       XPoint      vertex[MAXCORNERS];
+} sierpinskistruct;
+
+static sierpinskistruct *tris = NULL;
+
+static void
+startover(ModeInfo * mi)
+{
+       int         j;
+       sierpinskistruct *sp = &tris[MI_SCREEN(mi)];
+
+       if (MI_NPIXELS(mi) > 2) {
+    if (sp->corners == 3) {
+               sp->colors[0] = (NRAND(MI_NPIXELS(mi)));
+               sp->colors[1] = (sp->colors[0] + MI_NPIXELS(mi) / 7 +
+                        NRAND(2 * MI_NPIXELS(mi) / 7 + 1)) % MI_NPIXELS(mi);
+               sp->colors[2] = (sp->colors[0] + 4 * MI_NPIXELS(mi) / 7 +
+                        NRAND(2 * MI_NPIXELS(mi) / 7 + 1)) % MI_NPIXELS(mi);
+   } else if (sp->corners == 4) {
+               sp->colors[0] = (NRAND(MI_NPIXELS(mi)));
+               sp->colors[1] = (sp->colors[0] + MI_NPIXELS(mi) / 7 +
+                        NRAND(MI_NPIXELS(mi) / 7 + 1)) % MI_NPIXELS(mi);
+               sp->colors[2] = (sp->colors[0] + 3 * MI_NPIXELS(mi) / 7 +
+                        NRAND(MI_NPIXELS(mi) / 7 + 1)) % MI_NPIXELS(mi);
+               sp->colors[3] = (sp->colors[0] + 5 * MI_NPIXELS(mi) / 7 +
+                        NRAND(MI_NPIXELS(mi) / 7 + 1)) % MI_NPIXELS(mi);
+   } else {
+     (void) fprintf(stderr, "colors not set for %d corners\n", sp->corners);
+        }
+       }
+       for (j = 0; j < sp->corners; j++) {
+               sp->vertex[j].x = NRAND(sp->width);
+               sp->vertex[j].y = NRAND(sp->height);
+       }
+       sp->px = NRAND(sp->width);
+       sp->py = NRAND(sp->height);
+       sp->time = 0;
+       XClearWindow(MI_DISPLAY(mi), MI_WINDOW(mi));
+}
+
+void
+init_sierpinski(ModeInfo * mi)
+{
+       sierpinskistruct *sp;
+       int         i;
+
+       if (tris == NULL) {
+               if ((tris = (sierpinskistruct *) calloc(MI_NUM_SCREENS(mi),
+                                        sizeof (sierpinskistruct))) == NULL)
+                       return;
+       }
+       sp = &tris[MI_SCREEN(mi)];
+
+       sp->width = MI_WIN_WIDTH(mi);
+       sp->height = MI_WIN_HEIGHT(mi);
+
+       sp->total_npoints = MI_BATCHCOUNT(mi);
+       if (sp->total_npoints < 1)
+               sp->total_npoints = 1;
+  sp->corners = MI_SIZE(mi);
+       if (sp->corners < 3 || sp->corners > 4) {
+               sp->corners = (LRAND() & 1) + 3;
+       }
+       for (i = 0; i < sp->corners; i++) {
+               if (!sp->pointBuffer[i])
+                       sp->pointBuffer[i] = (XPoint *) malloc(sp->total_npoints *
+                                                           sizeof (XPoint));
+       }
+       startover(mi);
+}
+
+void
+draw_sierpinski(ModeInfo * mi)
+{
+       Display    *display = MI_DISPLAY(mi);
+       GC          gc = MI_GC(mi);
+       sierpinskistruct *sp = &tris[MI_SCREEN(mi)];
+       XPoint     *xp[MAXCORNERS];
+       int         i = 0, v;
+
+       if (MI_NPIXELS(mi) <= 2)
+               XSetForeground(display, gc, MI_WIN_WHITE_PIXEL(mi));
+       for (i = 0; i < sp->corners; i++)
+               xp[i] = sp->pointBuffer[i];
+       for (i = 0; i < sp->total_npoints; i++) {
+               v = NRAND(sp->corners);
+               sp->px = (sp->px + sp->vertex[v].x) / 2;
+               sp->py = (sp->py + sp->vertex[v].y) / 2;
+               xp[v]->x = sp->px;
+               xp[v]->y = sp->py;
+               xp[v]++;
+               sp->npoints[v]++;
+       }
+       for (i = 0; i < sp->corners; i++) {
+               if (MI_NPIXELS(mi) > 2)
+                       XSetForeground(display, gc, MI_PIXEL(mi, sp->colors[i]));
+               XDrawPoints(display, MI_WINDOW(mi), gc, sp->pointBuffer[i], sp->npoints[i],
+                           CoordModeOrigin);
+               sp->npoints[i] = 0;
+       }
+       if (++sp->time >= MI_CYCLES(mi))
+               startover(mi);
+}
+
+void
+release_sierpinski(ModeInfo * mi)
+{
+       if (tris != NULL) {
+               int         screen, i;
+
+               for (screen = 0; screen < MI_NUM_SCREENS(mi); screen++) {
+                       for (i = 0; i < MAXCORNERS; i++)
+                               if (tris[screen].pointBuffer[i] != NULL) {
+                                       (void) free((void *) tris[screen].pointBuffer[i]);
+                               }
+               }
+               (void) free((void *) tris);
+               tris = NULL;
+       }
+}
+
+void
+refresh_sierpinski(ModeInfo * mi)
+{
+       /* Do nothing, it will refresh by itself */
+}
diff --git a/hacks/sierpinski.man b/hacks/sierpinski.man
new file mode 100644 (file)
index 0000000..f3fdb34
--- /dev/null
@@ -0,0 +1,65 @@
+.TH XScreenSaver 1 "10-May-97" "X Version 11"
+.SH NAME
+sierpinski - draws Sierpinski triangle fractals
+.SH SYNOPSIS
+.B sierpinski
+[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-ncolors \fIinteger\fP] [\-delay \fImicroseconds\fP] [\-cycles \fIinteger\fP] [\-count \fIinteger\fP]
+
+.SH DESCRIPTION
+The \fIsierpinski\fP program draws Sierpinski triangle fractals.
+.SH OPTIONS
+.I sierpinski
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window.  This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-mono 
+If on a color display, pretend we're on a monochrome display.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use.  Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-ncolors \fIinteger\fP
+How many colors should be used (if possible).  Default 64.
+The colors are chosen randomly.
+.TP 8
+.B \-cycles \fIinteger\fP
+
+.TP 8
+.B \-count \fIinteger\fP
+
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1),
+.BR xlock (1)
+.SH COPYRIGHT
+Copyright \(co 1996 by Desmond Daignault.
+
+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. 
+.SH AUTHOR
+Desmond Daignault <tekdd@dtol.datatimes.com>, 05-Sep-96.  (Original 
+xlock version was called tri.c.)
+
+Ability to run standalone or with \fIxscreensaver\fP added by 
+Jamie Zawinski <jwz@jwz.org>, 10-May-97.  (Renamed to sierpinski.)
diff --git a/hacks/slidescreen.c b/hacks/slidescreen.c
new file mode 100644 (file)
index 0000000..c2fc033
--- /dev/null
@@ -0,0 +1,363 @@
+/* xscreensaver, Copyright (c) 1992, 1993, 1994, 1996, 1997, 1998 
+ * Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software 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.  No representations are made about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or 
+ * implied warranty.
+ */
+
+#include "screenhack.h"
+
+static int grid_size;
+static int pix_inc;
+static int hole_x, hole_y;
+static int bitmap_w, bitmap_h;
+static int xoff, yoff;
+static int grid_w, grid_h;
+static int delay, delay2;
+static GC gc;
+static int max_width, max_height;
+
+static void
+init_slide (Display *dpy, Window window)
+{
+  int i;
+  XGCValues gcv;
+  XWindowAttributes xgwa;
+  long gcflags;
+  int border;
+  unsigned long fg, bg;
+  Drawable d;
+  Colormap cmap;
+  Visual *visual;
+
+  XGetWindowAttributes (dpy, window, &xgwa);
+  grab_screen_image (xgwa.screen, window);
+
+  XGetWindowAttributes (dpy, window, &xgwa);  /* re-retrieve colormap */
+  cmap = xgwa.colormap;
+  visual = xgwa.visual;
+  max_width = xgwa.width;
+  max_height = xgwa.height;
+
+  delay = get_integer_resource ("delay", "Integer");
+  delay2 = get_integer_resource ("delay2", "Integer");
+  grid_size = get_integer_resource ("gridSize", "Integer");
+  pix_inc = get_integer_resource ("pixelIncrement", "Integer");
+  border = get_integer_resource ("internalBorderWidth", "InternalBorderWidth");
+
+  {
+    XColor fgc, bgc;
+    char *fgs = get_string_resource("background", "Background");
+    char *bgs = get_string_resource("foreground", "Foreground");
+    Bool fg_ok, bg_ok;
+    if (!XParseColor (dpy, cmap, fgs, &fgc))
+      XParseColor (dpy, cmap, "black", &bgc);
+    if (!XParseColor (dpy, cmap, bgs, &bgc))
+      XParseColor (dpy, cmap, "gray", &fgc);
+
+    fg_ok = XAllocColor (dpy, cmap, &fgc);
+    bg_ok = XAllocColor (dpy, cmap, &bgc);
+
+    /* If we weren't able to allocate the two colors we want from the
+       colormap (which is likely if the screen has been grabbed on an
+       8-bit SGI visual -- don't ask) then just go through the map
+       and find the closest color to the ones we wanted, and use those
+       pixels without actually allocating them.
+     */
+    if (fg_ok)
+      fg = fgc.pixel;
+    else
+      fg = 0;
+
+    if (bg_ok)
+      bg = bgc.pixel;
+    else
+      bg = 1;
+
+    if (!fg_ok || bg_ok)
+      {
+       unsigned long fgd = ~0;
+       unsigned long bgd = ~0;
+       int max = visual_cells (xgwa.screen, visual);
+       XColor *all = (XColor *) calloc(sizeof (*all), max);
+       for (i = 0; i < max; i++)
+         {
+           all[i].flags = DoRed|DoGreen|DoBlue;
+           all[i].pixel = i;
+         }
+       XQueryColors (dpy, cmap, all, max);
+       for(i = 0; i < max; i++)
+         {
+           long rd, gd, bd;
+           unsigned long d;
+           if (!fg_ok)
+             {
+               rd = (all[i].red   >> 8) - (fgc.red   >> 8);
+               gd = (all[i].green >> 8) - (fgc.green >> 8);
+               bd = (all[i].blue  >> 8) - (fgc.blue  >> 8);
+               if (rd < 0) rd = -rd;
+               if (gd < 0) gd = -gd;
+               if (bd < 0) bd = -bd;
+               d = (rd << 1) + (gd << 2) + bd;
+               if (d < fgd)
+                 {
+                   fgd = d;
+                   fg = all[i].pixel;
+                   if (d == 0)
+                     fg_ok = True;
+                 }
+             }
+
+           if (!bg_ok)
+             {
+               rd = (all[i].red   >> 8) - (bgc.red   >> 8);
+               gd = (all[i].green >> 8) - (bgc.green >> 8);
+               bd = (all[i].blue  >> 8) - (bgc.blue  >> 8);
+               if (rd < 0) rd = -rd;
+               if (gd < 0) gd = -gd;
+               if (bd < 0) bd = -bd;
+               d = (rd << 1) + (gd << 2) + bd;
+               if (d < bgd)
+                 {
+                   bgd = d;
+                   bg = all[i].pixel;
+                   if (d == 0)
+                     bg_ok = True;
+                 }
+             }
+
+           if (fg_ok && bg_ok)
+             break;
+         }
+       XFree(all);
+      }
+  }
+
+
+  if (delay < 0) delay = 0;
+  if (delay2 < 0) delay2 = 0;
+  if (pix_inc < 1) pix_inc = 1;
+  if (grid_size < 1) grid_size = 1;
+
+  gcv.foreground = fg;
+  gcv.function = GXcopy;
+  gcv.subwindow_mode = IncludeInferiors;
+  gcflags = GCForeground |GCFunction;
+  if (use_subwindow_mode_p(xgwa.screen, window)) /* see grabscreen.c */
+    gcflags |= GCSubwindowMode;
+  gc = XCreateGC (dpy, window, gcflags, &gcv);
+
+  XGetWindowAttributes (dpy, window, &xgwa);
+  bitmap_w = xgwa.width;
+  bitmap_h = xgwa.height;
+
+  grid_w = bitmap_w / grid_size;
+  grid_h = bitmap_h / grid_size;
+  hole_x = random () % grid_w;
+  hole_y = random () % grid_h;
+  xoff = (bitmap_w - (grid_w * grid_size)) / 2;
+  yoff = (bitmap_h - (grid_h * grid_size)) / 2;
+
+  d = window;
+
+  if (border)
+    {
+      int half = border/2;
+      int half2 = (border & 1 ? half+1 : half);
+      XSetForeground(dpy, gc, bg);
+      for (i = 0; i < bitmap_w; i += grid_size)
+       {
+         int j;
+         for (j = 0; j < bitmap_h; j += grid_size)
+           XDrawRectangle (dpy, d, gc,
+                           xoff+i+half2, yoff+j+half2,
+                           grid_size-border-1, grid_size-border-1);
+       }
+
+      XSetForeground(dpy, gc, fg);
+      for (i = 0; i <= bitmap_w; i += grid_size)
+       XFillRectangle (dpy, d, gc, xoff+i-half, yoff, border, bitmap_h);
+      for (i = 0; i <= bitmap_h; i += grid_size)
+       XFillRectangle (dpy, d, gc, xoff, yoff+i-half, bitmap_w, border);
+    }
+
+  if (xoff)
+    {
+      XFillRectangle (dpy, d, gc, 0, 0, xoff, bitmap_h);
+      XFillRectangle (dpy, d, gc, bitmap_w - xoff, 0, xoff, bitmap_h);
+    }
+  if (yoff)
+    {
+      XFillRectangle (dpy, d, gc, 0, 0, bitmap_w, yoff);
+      XFillRectangle (dpy, d, gc, 0, bitmap_h - yoff, bitmap_w, yoff);
+    }
+
+  XSync (dpy, False);
+  if (delay2) usleep (delay2 * 2);
+ for (i = 0; i < grid_size; i += pix_inc)
+   {
+     XPoint points [3];
+     points[0].x = xoff + grid_size * hole_x;
+     points[0].y = yoff + grid_size * hole_y;
+     points[1].x = points[0].x + grid_size;
+     points[1].y = points[0].y;
+     points[2].x = points[0].x;
+     points[2].y = points[0].y + i;
+     XFillPolygon (dpy, window, gc, points, 3, Convex, CoordModeOrigin);
+
+     points[1].x = points[0].x;
+     points[1].y = points[0].y + grid_size;
+     points[2].x = points[0].x + i;
+     points[2].y = points[0].y + grid_size;
+     XFillPolygon (dpy, window, gc, points, 3, Convex, CoordModeOrigin);
+
+     points[0].x = points[1].x + grid_size;
+     points[0].y = points[1].y;
+     points[2].x = points[0].x;
+     points[2].y = points[0].y - i;
+     XFillPolygon (dpy, window, gc, points, 3, Convex, CoordModeOrigin);
+
+     points[1].x = points[0].x;
+     points[1].y = points[0].y - grid_size;
+     points[2].x = points[1].x - i;
+     points[2].y = points[1].y;
+     XFillPolygon (dpy, window, gc, points, 3, Convex, CoordModeOrigin);
+
+     XSync (dpy, False);
+     if (delay) usleep (delay);
+   }
+
+  XFillRectangle (dpy, window, gc,
+                 xoff + grid_size * hole_x,
+                 yoff + grid_size * hole_y,
+                 grid_size, grid_size);
+}
+
+static void
+slide1 (Display *dpy, Window window)
+{
+  /* this code is a total kludge, but who cares, it works... */
+ int i, x, y, ix, iy, dx, dy, dir, w, h, size, inc;
+ static int last = -1;
+ do {
+   dir = random () % 4;
+   switch (dir)
+     {
+     case 0: dx = 0,  dy = 1;  break;
+     case 1: dx = -1, dy = 0;  break;
+     case 2: dx = 0,  dy = -1; break;
+     case 3: dx = 1,  dy = 0;  break;
+     default: abort ();
+     }
+ } while (dir == last ||
+         hole_x + dx < 0 || hole_x + dx >= grid_w ||
+         hole_y + dy < 0 || hole_y + dy >= grid_h);
+ if (grid_w > 1 && grid_h > 1)
+   last = (dir == 0 ? 2 : dir == 2 ? 0 : dir == 1 ? 3 : 1);
+
+ switch (dir)
+   {
+   case 0: size = 1 + (random()%(grid_h - hole_y - 1)); h = size; w = 1; break;
+   case 1: size = 1 + (random()%hole_x);               w = size; h = 1; break;
+   case 2: size = 1 + (random()%hole_y);               h = size; w = 1; break;
+   case 3: size = 1 + (random()%(grid_w - hole_x - 1)); w = size; h = 1; break;
+   default: abort ();
+   }
+
+ if (dx == -1) hole_x -= (size - 1);
+ else if (dy == -1) hole_y -= (size - 1);
+
+ ix = x = xoff + (hole_x + dx) * grid_size;
+ iy = y = yoff + (hole_y + dy) * grid_size;
+ inc = pix_inc;
+ for (i = 0; i < grid_size; i += inc)
+   {
+     int fx, fy, tox, toy;
+     if (inc + i > grid_size)
+       inc = grid_size - i;
+     tox = x - dx * inc;
+     toy = y - dy * inc;
+
+     fx = (x < 0 ? 0 : x > max_width  ? max_width  : x);
+     fy = (y < 0 ? 0 : y > max_height ? max_height : y);
+     tox = (tox < 0 ? 0 : tox > max_width  ? max_width  : tox);
+     toy = (toy < 0 ? 0 : toy > max_height ? max_height : toy);
+
+     XCopyArea (dpy, window, window, gc,
+               fx, fy,
+               grid_size * w, grid_size * h,
+               tox, toy);
+
+     x -= dx * inc;
+     y -= dy * inc;
+     switch (dir)
+       {
+       case 0: XFillRectangle (dpy, window, gc,
+                              ix, y + grid_size * h, grid_size * w, iy - y);
+        break;
+       case 1: XFillRectangle (dpy, window, gc, ix, iy, x - ix, grid_size * h);
+        break;
+       case 2: XFillRectangle (dpy, window, gc, ix, iy, grid_size * w, y - iy);
+        break;
+       case 3: XFillRectangle (dpy, window, gc,
+                              x + grid_size * w, iy, ix - x, grid_size * h);
+        break;
+       }
+
+     XSync (dpy, False);
+     if (delay) usleep (delay);
+   }
+ switch (dir)
+   {
+   case 0: hole_y += size; break;
+   case 1: hole_x--; break;
+   case 2: hole_y--; break;
+   case 3: hole_x += size; break;
+   }
+}
+
+\f
+char *progclass = "SlidePuzzle";
+
+char *defaults [] = {
+  "*dontClearRoot:             True",
+
+#ifdef __sgi   /* really, HAVE_READ_DISPLAY_EXTENSION */
+  "*visualID:                  Best",
+#endif
+
+  ".background:                        Black",
+  ".foreground:                        Gray",
+  "*gridSize:                  70",
+  "*pixelIncrement:            10",
+  "*internalBorderWidth:       4",
+  "*delay:                     50000",
+  "*delay2:                    1000000",
+  0
+};
+
+XrmOptionDescRec options [] = {
+  { "-grid-size",      ".gridSize",            XrmoptionSepArg, 0 },
+  { "-ibw",            ".internalBorderWidth", XrmoptionSepArg, 0 },
+  { "-increment",      ".pixelIncrement",      XrmoptionSepArg, 0 },
+  { "-delay",          ".delay",               XrmoptionSepArg, 0 },
+  { "-delay2",         ".delay2",              XrmoptionSepArg, 0 },
+  { 0, 0, 0, 0 }
+};
+
+void
+screenhack (Display *dpy, Window window)
+{
+  init_slide (dpy, window);
+  while (1)
+    {
+      slide1 (dpy, window);
+      screenhack_handle_events (dpy);
+      if (delay2) usleep (delay2);
+    }
+}
diff --git a/hacks/slidescreen.man b/hacks/slidescreen.man
new file mode 100644 (file)
index 0000000..a3e9d90
--- /dev/null
@@ -0,0 +1,92 @@
+.TH XScreenSaver 1 "24-Nov-97" "X Version 11"
+.SH NAME
+slidescreen - permute the screen image like an 8-puzzle
+.SH SYNOPSIS
+.B slidescreen
+[\-display \fIhost:display.screen\fP] [\-background \fIcolor\fP] [\-grid-size \fIpixels\fP] [\-ibw \fIpixels\fP] [\-increment \fIpixels\fP] [\-delay \fIusecs\fP] [\-delay2 \fIusecs\fP] [\-window] [\-root] [\-install] [\-visual \fIvisual\fP]
+.SH DESCRIPTION
+The \fIslidescreen\fP program takes an image of the screen, divides it into
+a grid, deletes a random square of that grid, and then randomly slides 
+one of the neighbors of this "hole" into the hole (and repeat.)
+.SH OPTIONS
+.I slidescreen
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window.  This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use.  Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-grid-size \fIpixels\fP
+The size of the grid cells.  Default 70 pixels.
+.TP 8
+.B \-ibw \fIpixels\fP
+The size of the "gutter" between grid cells.  Default 1 pixel.
+.TP 8
+.B \-increment \fIpixels\fP
+How many pixels by which a piece should be moved when sliding to a new 
+location.  Default 10 pixels.
+.TP 8
+.B \-delay \fImicroseconds\fP
+How much of a delay should be introduced between steps of the animation of
+the motion of each segment.  Default 50000, which is 0.05 seconds.  This
+is closely related to the \fI\-increment\fP parameter.
+.TP 8
+.B \-delay \fImicroseconds\fP
+How much of a delay should be introduced between the end of the motion of
+one segment and the beginning of the motion of another.  Default 1000000,
+which is one second.
+.SH RESOURCES
+On some systems (currently, only SGIs), this program can, instead of grabbing
+a desktop image, grab a frame of video from an external camera and manipulate
+that instead.  The following resources control that.
+.PP
+.TP 8
+.B grabVideoProbability \fR(Float)\fP
+What portion of the time to grab video rather than a screen image, 
+between 0.0 and 1.0.  Defaults to 0.5, or half the time.
+.TP 8
+.B videoDevice \fR(Integer)\fP
+The number of the default video input device to check first.  If unspecified, 
+the default camera (from videopanel(1)) will be checked first.  After that, all
+other available video input devices will be checked in order.  
+
+The first one which produces a non-black image will be used.  If all images
+are black, the others will be re-checked a few times before giving up and
+falling back to simply grabbing a desktop image (but note that this takes a
+few seconds, so if you don't actually have any video sources hooked up, you
+should consider turning off video grabbing by setting
+\fBgrabVideoProbability\fP to 0.0.)
+.TP 8
+.B videoGain \fR(Float)\fP
+The amount by which to brighten the grabbed image.  This defaults to 2.2.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 1992 by Jamie Zawinski.  Permission to use, copy, modify, 
+distribute, and sell this software 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.  No representations are made about the 
+suitability of this software for any purpose.  It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Jamie Zawinski <jwz@jwz.org>, 3-dec-92.
diff --git a/hacks/slip.c b/hacks/slip.c
new file mode 100644 (file)
index 0000000..395fea1
--- /dev/null
@@ -0,0 +1,301 @@
+/* -*- Mode: C; tab-width: 4 -*-
+ * slip --- lots of blits.
+ */
+#if !defined( lint ) && !defined( SABER )
+static const char sccsid[] = "@(#)slip.c       4.00 97/01/01 xlockmore";
+#endif
+
+/* Copyright (c) 1992 by Scott Draves (spot@cs.cmu.edu)
+ *
+ * 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.
+ *
+ * This file is provided AS IS with no warranties of any kind.  The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof.  In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * Revision History:
+ * 12-May-97: jwz@jwz.org: turned into a standalone program.
+ * 01-Dec-95: Patched for VMS <joukj@alpha.chem.uva.nl>.
+ */
+
+#ifdef STANDALONE
+# define PROGCLASS                                     "Slip"
+# define HACK_INIT                                     init_slip
+# define HACK_DRAW                                     draw_slip
+# define slip_opts                                     xlockmore_opts
+# define DEFAULTS      "*count:                35    \n"                       \
+                                       "*cycles:               50    \n"                       \
+                                       "*delay:                50000 \n"                       \
+                                       "*ncolors:              200   \n"
+# include "xlockmore.h"                                /* from the xscreensaver distribution */
+#else  /* !STANDALONE */
+# include "xlock.h"                                    /* from the xlockmore distribution */
+#endif /* !STANDALONE */
+
+ModeSpecOpt slip_opts = {
+  0, NULL, 0, NULL, NULL };
+
+typedef struct {
+       int         width, height;
+       int         nblits_remaining;
+       int         blit_width, blit_height;
+       int         mode;
+       int         first_time;
+    int         backwards;
+} slipstruct;
+static slipstruct *slips = NULL;
+
+static short
+halfrandom(int mv)
+{
+       static short lasthalf = 0;
+       unsigned long r;
+
+       if (lasthalf) {
+               r = lasthalf;
+               lasthalf = 0;
+       } else {
+               r = LRAND();
+               lasthalf = r >> 16;
+       }
+       return r % mv;
+}
+
+static int
+erandom(int mv)
+{
+       static int  stage = 0;
+       static unsigned long r;
+       int         res;
+
+       if (0 == stage) {
+               r = LRAND();
+               stage = 7;
+       }
+       res = r & 0xf;
+       r = r >> 4;
+       stage--;
+       if (res & 8)
+               return res & mv;
+       else
+               return -(res & mv);
+}
+
+static void
+prepare_screen(ModeInfo * mi, slipstruct * s)
+{
+
+       Display    *display = MI_DISPLAY(mi);
+       GC          gc = MI_GC(mi);
+       int         i, n, w = s->width / 20;
+       int         not_solid = halfrandom(10);
+
+#ifdef STANDALONE                        /* jwz -- sometimes hack the desktop image! */
+       if (halfrandom(2) == 0)
+         {
+               grab_screen_image(DefaultScreenOfDisplay (MI_DISPLAY(mi)),
+                                                 MI_WINDOW(mi));
+               return;
+         }
+#endif
+
+       s->backwards = LRAND() & 1;             /* jwz: go the other way sometimes */
+
+       if (s->first_time || (0 == halfrandom(10))) {
+               XClearWindow(display, MI_WINDOW(mi));
+               n = 300;
+       } else {
+               if (halfrandom(5))
+                       return;
+               if (halfrandom(5))
+                       n = 100;
+               else
+                       n = 2000;
+       }
+
+       if (MI_NPIXELS(mi) > 2)
+               XSetForeground(display, gc, MI_PIXEL(mi, halfrandom(MI_NPIXELS(mi))));
+       else if (halfrandom(2))
+               XSetForeground(display, gc, MI_WIN_WHITE_PIXEL(mi));
+       else
+               XSetForeground(display, gc, MI_WIN_BLACK_PIXEL(mi));
+
+       for (i = 0; i < n; i++) {
+         int ww = ((w/2) + halfrandom(w));
+               if (not_solid)
+                       if (MI_NPIXELS(mi) > 2)
+                               XSetForeground(display, gc, MI_PIXEL(mi, halfrandom(MI_NPIXELS(mi))));
+                       else if (halfrandom(2))
+                               XSetForeground(display, gc, MI_WIN_WHITE_PIXEL(mi));
+                       else
+                               XSetForeground(display, gc, MI_WIN_BLACK_PIXEL(mi));
+               XFillRectangle(display, MI_WINDOW(mi), gc,
+                              halfrandom(s->width - ww),
+                              halfrandom(s->height - ww),
+                              ww, ww);
+       }
+       s->first_time = 0;
+}
+
+static int
+quantize(double d)
+{
+       int         i = (int) floor(d);
+       double      f = d - i;
+
+       if ((LRAND() & 0xff) < f * 0xff)
+               i++;
+       return i;
+}
+
+void
+init_slip(ModeInfo * mi)
+{
+       slipstruct *sp;
+
+       if (slips == NULL) {
+               if ((slips = (slipstruct *) calloc(MI_NUM_SCREENS(mi),
+                                              sizeof (slipstruct))) == NULL)
+                       return;
+       }
+       sp = &slips[MI_SCREEN(mi)];
+
+       sp->width = MI_WIN_WIDTH(mi);
+       sp->height = MI_WIN_HEIGHT(mi);
+
+       sp->blit_width = sp->width / 25;
+       sp->blit_height = sp->height / 25;
+       sp->nblits_remaining = 0;
+       sp->mode = 0;
+       sp->first_time = 1;
+
+       /* no "NoExpose" events from XCopyArea wanted */
+       XSetGraphicsExposures(MI_DISPLAY(mi), MI_GC(mi), False);
+}
+
+void
+draw_slip(ModeInfo * mi)
+{
+       Display    *display = MI_DISPLAY(mi);
+       Window      window = MI_WINDOW(mi);
+       GC          gc = MI_GC(mi);
+       slipstruct *s = &slips[MI_SCREEN(mi)];
+       int         timer;
+
+       timer = MI_BATCHCOUNT(mi) * MI_CYCLES(mi);
+
+       while (timer--) {
+               int         xi = halfrandom(s->width - s->blit_width);
+               int         yi = halfrandom(s->height - s->blit_height);
+               double      x, y, dx = 0, dy = 0, t, s1, s2;
+
+               if (0 == s->nblits_remaining--) {
+                       static int lut[] =
+                       {0, 0, 0, 1, 1, 1, 2};
+
+                       prepare_screen(mi, s);
+                       s->nblits_remaining = MI_BATCHCOUNT(mi) *
+                               (2000 + halfrandom(1000) + halfrandom(1000));
+                       if (s->mode == 2)
+                               s->mode = halfrandom(2);
+                       else
+                               s->mode = lut[halfrandom(7)];
+               }
+               x = (2 * xi + s->blit_width) / (double) s->width - 1;
+               y = (2 * yi + s->blit_height) / (double) s->height - 1;
+
+               /* (x,y) is in biunit square */
+               switch (s->mode) {
+                       case 0:                                                         /* rotor */
+                               dx = x;
+                               dy = y;
+
+                               if (dy < 0) {
+                                       dy += 0.04;
+                                       if (dy > 0)
+                                               dy = 0.00;
+                               }
+                               if (dy > 0) {
+                                       dy -= 0.04;
+                                       if (dy < 0)
+                                               dy = 0.00;
+                               }
+                               t = dx * dx + dy * dy + 1e-10;
+                               s1 = 2 * dx * dx / t - 1;
+                               s2 = 2 * dx * dy / t;
+                               dx = s1 * 5;
+                               dy = s2 * 5;
+                               if (s->backwards) {     /* jwz: go the other way sometimes */
+                                       dx = -dx;
+                                       dy = -dy;
+                               }
+                               break;
+                       case 1:                                                         /* shuffle */
+                               dx = erandom(3);
+                               dy = erandom(3);
+                               break;
+                       case 2:                                                         /* explode */
+                               dx = x * 3;
+                               dy = y * 3;
+                               break;
+               }
+               {
+                       int         qx = xi + quantize(dx), qy = yi + quantize(dy);
+                       int         wrap;
+
+                       if (qx < 0 || qy < 0 ||
+                           qx >= s->width - s->blit_width ||
+                           qy >= s->height - s->blit_height)
+                               continue;
+
+                       XCopyArea(display, window, window, gc, xi, yi,
+                                 s->blit_width, s->blit_height,
+                                 qx, qy);
+
+                       switch (s->mode) {
+                               case 0:
+                                       /* wrap */
+                                       wrap = s->width - (2 * s->blit_width);
+                                       if (qx > wrap)
+                                               XCopyArea(display, window, window, gc, qx, qy,
+                                               s->blit_width, s->blit_height,
+                                                         qx - wrap, qy);
+
+                                       if (qx < 2 * s->blit_width)
+                                               XCopyArea(display, window, window, gc, qx, qy,
+                                               s->blit_width, s->blit_height,
+                                                         qx + wrap, qy);
+
+                                       wrap = s->height - (2 * s->blit_height);
+                                       if (qy > wrap)
+                                               XCopyArea(display, window, window, gc, qx, qy,
+                                               s->blit_width, s->blit_height,
+                                                         qx, qy - wrap);
+
+                                       if (qy < 2 * s->blit_height)
+                                               XCopyArea(display, window, window, gc, qx, qy,
+                                               s->blit_width, s->blit_height,
+                                                         qx, qy + wrap);
+                                       break;
+                               case 1:
+                               case 2:
+                                       break;
+                       }
+               }
+       }
+}
+
+void
+release_slip(ModeInfo * mi)
+{
+       if (slips != NULL) {
+               (void) free((void *) slips);
+               slips = NULL;
+       }
+}
diff --git a/hacks/slip.man b/hacks/slip.man
new file mode 100644 (file)
index 0000000..d513654
--- /dev/null
@@ -0,0 +1,93 @@
+.TH XScreenSaver 1 "24-Nov-97" "X Version 11"
+.SH NAME
+slip - sucks your screen into a jet engine
+.SH SYNOPSIS
+.B slip
+[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-ncolors \fIinteger\fP] [\-iterations \fIinteger\fP] [\-points \fIinteger\fP] [\-delay \fImicroseconds\fP] [\-delay2 \fImicroseconds\fP]
+.SH DESCRIPTION
+The \fIslip\fP program does lots of blits and chews up your screen image.
+.SH OPTIONS
+.I slip
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window.  This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-mono 
+If on a color display, pretend we're on a monochrome display.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use.  Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-ncolors \fIinteger\fP
+How many colors should be used (if possible).  Default 128.
+The colors used cycle through the hue, making N stops around 
+the color wheel.
+.TP 8
+.B \-count \fIinteger\fP
+How many whooziwhatsis to generate.  Default 35.
+.TP 8
+.B \-cycles \fIinteger\fP
+How long to frobnicate.  Default 50.
+.TP 8
+.B \-delay \fImicroseconds\fP
+How long we should wait between drawing each step.  Default 50000,
+or about 1/20th second.
+
+.SH RESOURCES
+On some systems (currently, only SGIs), this program can, instead of grabbing
+a desktop image, grab a frame of video from an external camera and manipulate
+that instead.  The following resources control that.
+.PP
+.TP 8
+.B grabVideoProbability \fR(Float)\fP
+What portion of the time to grab video rather than a screen image, 
+between 0.0 and 1.0.  Defaults to 0.5, or half the time.
+.TP 8
+.B videoDevice \fR(Integer)\fP
+The number of the default video input device to check first.  If unspecified, 
+the default camera (from videopanel(1)) will be checked first.  After that, all
+other available video input devices will be checked in order.  
+
+The first one which produces a non-black image will be used.  If all images
+are black, the others will be re-checked a few times before giving up and
+falling back to simply grabbing a desktop image (but note that this takes a
+few seconds, so if you don't actually have any video sources hooked up, you
+should consider turning off video grabbing by setting
+\fBgrabVideoProbability\fP to 0.0.)
+.TP 8
+.B videoGain \fR(Float)\fP
+The amount by which to brighten the grabbed image.  This defaults to 2.2.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1),
+.BR xlock (1)
+.SH COPYRIGHT
+Copyright \(co 1992 by Scott Draves.
+
+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. 
+.SH AUTHOR
+Scott Graves <spot@cs.cmu.edu>.
+
+Ability to run standalone or with \fIxscreensaver\fP added by 
+Jamie Zawinski <jwz@jwz.org>, 18-Oct-93.
diff --git a/hacks/sonar.c b/hacks/sonar.c
new file mode 100644 (file)
index 0000000..7d965b5
--- /dev/null
@@ -0,0 +1,1752 @@
+/* sonar.c --- Simulate a sonar screen.
+ *
+ * This is an implementation of a general purpose reporting tool in the
+ * format of a Sonar display. It is designed such that a sensor is read
+ * on every movement of a sweep arm and the results of that sensor are
+ * displayed on the screen. The location of the display points (targets) on the
+ * screen are determined by the current localtion of the sweep and a distance
+ * value associated with the target. 
+ *
+ * Currently the only two sensors that are implemented are the simulator
+ * (the default) and the ping sensor. The simulator randomly creates a set
+ * of bogies that move around on the scope while the ping sensor can be
+ * used to display hosts on your network.
+ *
+ * The ping code is only compiled in if you define HAVE_ICMP or HAVE_ICMPHDR,
+ * because, unfortunately, different systems have different ways of creating
+ * these sorts of packets.
+ *
+ * Also: creating an ICMP socket is a privileged operation, so the program
+ * needs to be installed SUID root if you want to use the ping mode.  If you
+ * check the code you will see that this privilige is given up immediately
+ * after the socket is created.
+ *
+ * It should be easy to extend this code to support other sorts of sensors.
+ * Some ideas:
+ *   - search the output of "netstat" for the list of hosts to ping;
+ *   - plot the contents of /proc/interrupts;
+ *   - plot the process table, by process size, cpu usage, or total time;
+ *   - plot the logged on users by idle time or cpu usage.
+ *
+ * Copyright (C) 1998 by Stephen Martin (smartin@canada.com).
+ * Permission to use, copy, modify, distribute, and sell this software 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.  No representations are made about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or 
+ * implied warranty.
+ *
+ * $Revision: 1.12 $
+ *
+ * Version 1.0 April 27, 1998.
+ * - Initial version
+ * - Submitted to RedHat Screensaver Contest
+ * 
+ * Version 1.1 November 3, 1998.
+ * - Added simulation mode.
+ * - Added enhancements by Thomas Bahls <thommy@cs.tu-berlin.de>
+ * - Fixed huge memory leak.
+ * - Submitted to xscreensavers
+ * 
+ * Version 1.2
+ * - All ping code is now ifdef-ed by the compile time symbol HAVE_PING;
+ *   use -DHAVE_PING to include it when you compile.
+ * - Sweep now uses gradients.
+ * - Fixed portability problems with icmphdr on some systems.
+ * - removed lowColor option/resource.
+ * - changed copyright notice so that it could be included in the xscreensavers
+ *   collection.
+ *
+ * Version 1.3 November 16, 1998.
+ * - All ping code is now ifdef-ed by the compile time symbol PING use -DPING
+ *   to include it when you compile.
+ * - Sweep now uses gradients.
+ * - Fixed portability problems with icmphdr on some systems.
+ * - removed lowcolour option/resource.
+ * - changed copyright notice so that it could be included in the xscreensavers
+ *   collection.
+ *
+ * Version 1.4 November 18, 1998.
+ * - More ping portability fixes.
+ *
+ * Version 1.5 November 19, 1998.
+ * - Synced up with jwz's changes.
+ * - Now need to define HAVE_PING to compile in the ping stuff.
+ */
+
+/* These are computed by configure now:
+   #define HAVE_ICMP
+   #define HAVE_ICMPHDR
+ */
+
+
+/* Include Files */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <math.h>
+
+#include "screenhack.h"
+#include "colors.h"
+#include "hsv.h"
+
+#if defined(HAVE_ICMP) || defined(HAVE_ICMPHDR)
+# include <unistd.h>
+# include <limits.h>
+# include <signal.h>
+# include <fcntl.h>
+# include <sys/types.h>
+# include <sys/time.h>
+# include <sys/ipc.h>
+# include <sys/shm.h>
+# include <sys/socket.h>
+# include <netinet/in_systm.h>
+# include <netinet/in.h>
+# include <netinet/ip.h>
+# include <netinet/ip_icmp.h>
+# include <netinet/udp.h>
+# include <arpa/inet.h>
+# include <netdb.h>
+#endif /* HAVE_ICMP || HAVE_ICMPHDR */
+
+
+/* Defines */
+
+#undef MY_MIN
+#define MY_MIN(a,b) ((a)<(b)?(a - 50):(b - 10))
+
+#ifndef LINE_MAX
+# define LINE_MAX 2048
+#endif
+
+/* Frigging icmp */
+
+#if defined(HAVE_ICMP)
+# define HAVE_PING
+# define ICMP             icmp
+# define ICMP_TYPE(p)     (p)->icmp_type
+# define ICMP_CODE(p)     (p)->icmp_code
+# define ICMP_CHECKSUM(p) (p)->icmp_cksum
+# define ICMP_ID(p)       (p)->icmp_id
+# define ICMP_SEQ(p)      (p)->icmp_seq
+#elif defined(HAVE_ICMPHDR)
+# define HAVE_PING
+# define ICMP             icmphdr
+# define ICMP_TYPE(p)     (p)->type
+# define ICMP_CODE(p)     (p)->code
+# define ICMP_CHECKSUM(p) (p)->checksum
+# define ICMP_ID(p)       (p)->un.echo.id
+# define ICMP_SEQ(p)      (p)->un.echo.sequence
+#else
+# undef HAVE_PING
+#endif
+
+/* Forward References */
+
+#ifdef HAVE_PING
+static u_short checksum(u_short *, int);
+#endif
+static long delta(struct timeval *, struct timeval *);
+
+/* Data Structures */
+
+/*
+ * The Bogie.
+ *
+ * This represents an object that is visable on the scope.
+ */
+
+typedef struct Bogie {
+    char *name;                        /* The name of the thing being displayed */
+    int distance;              /* The distance to this thing (0 - 100) */
+    int tick;                  /* The tick that it was found on */
+    int ttl;                   /* The time to live */
+    int age;                    /* How long it's been around */
+    struct Bogie *next;                /* The next one in the list */
+} Bogie;
+
+/*
+ * Sonar Information.
+ *
+ * This contains all of the runtime information about the sonar scope.
+ */
+
+typedef struct {
+    Display *dpy;              /* The X display */
+    Window win;                        /* The window */
+    GC hi,                     /* The leading edge of the sweep */
+       lo,                     /* The trailing part of the sweep */
+       erase,                  /* Used to erase things */
+       grid,                   /* Used to draw the grid */
+       text;                   /* Used to draw text */
+    Colormap cmap;             /* The colormap */
+    XFontStruct *font;          /* The font to use for the labels */
+    int text_steps;            /* How many steps to fade text. */
+    XColor *text_colors;       /* Pixel values used to fade text */
+    int sweep_degrees;         /* How much of the circle the sweep uses */
+    int sweep_segs;            /* How many gradients in the sweep. */
+    XColor *sweep_colors;        /* The sweep pixel values */
+    int width, height;         /* Window dimensions */
+    int minx, miny, maxx, maxy, /* Bounds of the scope */
+       centrex, centrey, radius; /* Parts of the scope circle */
+    Bogie *visable;            /* List of visable objects */
+    int current;               /* Current position of sweep */
+
+    int delay;                 /* how long between each frame of the anim */
+
+} sonar_info;
+
+/* 
+ * Variables to support the differnt Sonar modes.
+ */
+
+Bogie *(*sensor)(sonar_info *, void *);        /* The current sensor */
+void *sensor_info;                     /* Information about the sensor */
+
+/*
+ * A list of targets to ping.
+ */
+
+#ifdef HAVE_PING
+typedef struct ping_target {
+    char *name;                        /* The name of the target */
+    struct sockaddr address;   /* The address of the target */
+    struct ping_target *next;  /* The next one in the list */
+} ping_target;
+
+/*
+ * Ping Information.
+ *
+ * This contains the information for the ping sensor.
+ */
+
+typedef struct {
+    int icmpsock;              /* Socket for sending pings */
+    int pid;                   /* Our process ID */
+    int seq;                   /* Packet sequence number */
+    int timeout;               /* Timeout value for pings */
+    ping_target *targets;      /* List of targets to ping */
+    int numtargets;             /* The number of targets to ping */
+} ping_info;
+
+/* Flag to indicate that the timer has expired on us */
+
+static int timer_expired;
+
+
+#endif /* HAVE_PING */
+
+/*
+ * A list of targets for the simulator
+ */
+
+typedef struct sim_target {
+    char *name;                        /* The name of the target */
+    int nexttick;              /* The next tick that this will be seen */
+    int nextdist;              /* The distance on that tick */
+    int movedlasttick;         /* Flag to indicate we just moved this one */
+} sim_target;
+
+/*
+ * Simulator Information.
+ *
+ * This contains the information for the simulator mode.
+ */
+
+typedef struct {
+    sim_target *teamA;         /* The bogies for the A team */
+    int numA;                  /* The number of bogies in team A */
+    char *teamAID;             /* The identifier for bogies in team A */
+    sim_target *teamB;         /* The bogies for the B team */
+    int numB;                  /* The number of bogies in team B */
+    char *teamBID;             /* The identifier for bogies in team B */
+} sim_info;
+
+/* Name of the Screensaver hack */
+
+char *progclass="sonar";
+
+/* Application Defaults */
+
+char *defaults [] = {
+    ".background:      #000000",
+    ".sweepColor:      #00FF00",
+    "*delay:          100000",
+    "*scopeColor:      #003300",
+    "*gridColor:       #00AA00",
+    "*textColor:       #FFFF00",
+    "*ttl:             90",
+    "*mode:            default",
+    "*font:            fixed",
+    "*sweepDegrees:    30",
+
+    "*textSteps:       80",    /* npixels */
+    "*sweepSegments:   80",    /* npixels */
+
+#ifdef HAVE_PING
+    "*pingTimeout:     3000",
+    "*pingSource:      file",
+    "*pingFile:        /etc/hosts",
+    "*pingList:        localhost",
+#endif /* HAVE_PING */
+    "*teamAName:       F18",
+    "*teamBName:       MIG",
+    "*teamACount:      4",
+    "*teamBCount:      4",
+    0
+};
+
+/* Options passed to this program */
+
+XrmOptionDescRec options [] = {
+    {"-background",   ".background",   XrmoptionSepArg, 0 },
+    {"-sweep-color",  ".sweepColor",   XrmoptionSepArg, 0 },
+    {"-scope-color",  ".scopeColor",   XrmoptionSepArg, 0 },
+    {"-grid-color",   ".gridColor",    XrmoptionSepArg, 0 },
+    {"-text-color",   ".textColor",    XrmoptionSepArg, 0 },
+    {"-ttl",          ".ttl",          XrmoptionSepArg, 0 },
+    {"-mode",         ".mode",         XrmoptionSepArg, 0 },
+    {"-font",         ".font",         XrmoptionSepArg, 0 },
+#ifdef HAVE_PING
+    {"-ping-timeout", ".pingTimeout",  XrmoptionSepArg, 0 },
+    {"-ping-source",  ".pingSource",   XrmoptionSepArg, 0 },
+    {"-ping-file",    ".pingFile",     XrmoptionSepArg, 0 },
+    {"-ping-list",    ".pingList",     XrmoptionSepArg, 0 },
+#endif /* HAVE_PING */
+    {"-team-a-name",   ".teamAName",   XrmoptionSepArg, 0 },
+    {"-team-b-name",   ".teamBName",   XrmoptionSepArg, 0 },
+    {"-team-a-count",  ".teamACount",  XrmoptionSepArg, 0 },
+    {"-team-b-count",  ".teamBCount",  XrmoptionSepArg, 0 },
+    { 0, 0, 0, 0 }
+};
+
+/*
+ * The number of ticks that bogies are visable on the screen before they
+ * fade away.
+ */
+
+static int TTL;
+
+/*
+ * Create a new Bogie and set some initial values.
+ *
+ * Args:
+ *    name     - The name of the bogie.
+ *    distance - The distance value.
+ *    tick     - The tick value.
+ *    ttl      - The time to live value.
+ *
+ * Returns:
+ *    The newly allocated bogie or null if a memory problem occured.
+ */
+
+static Bogie *
+newBogie(char *name, int distance, int tick, int ttl) 
+{
+
+    /* Local Variables */
+
+    Bogie *new;
+
+    /* Allocate a bogie and initialize it */
+
+    if ((new = (Bogie *) calloc(1, sizeof(Bogie))) == NULL) {
+       fprintf(stderr, "%s: Out of Memory\n", progname);
+       return NULL;
+    }
+    new->name = name;
+    new->distance = distance;
+    new->tick = tick;
+    new->ttl = ttl;
+    new->age = 0;
+    new->next = (Bogie *) 0;
+    return new;
+}
+
+/*
+ * Free a Bogie.
+ *
+ * Args:
+ *    b - The bogie to free.
+ */
+
+static void
+freeBogie(Bogie *b) 
+{
+    if (b->name != (char *) 0)
+       free(b->name);
+    free(b);
+}
+
+/*
+ * Find a bogie by name in a list.
+ *
+ * This does a simple linear search of the list for a given name.
+ *
+ * Args:
+ *    bl   - The Bogie list to search.
+ *    name - The name to look for.
+ *
+ * Returns:
+ *    The requested Bogie or null if it wasn't found.
+ */
+
+static Bogie *
+findNode(Bogie *bl, char *name) 
+{
+
+    /* Local Variables */
+
+    Bogie *p;
+
+    /* Abort if the list is empty or no name is given */
+
+    if ((name == NULL) || (bl == NULL))
+       return NULL;
+
+    /* Search the list for the desired name */
+
+    p = bl;
+    while (p != NULL) {
+       if (strcmp(p->name, name) == 0)
+           return p;
+       p = p->next;
+    }
+
+    /* Not found */
+
+    return NULL;
+}
+
+#ifdef HAVE_PING
+
+/*
+ * Lookup the address for a ping target;
+ *
+ * Args:
+ *    target - The ping_target fill in the address for.
+ *
+ * Returns:
+ *    1 if the host was successfully resolved, 0 otherwise.
+ */
+
+static int
+lookupHost(ping_target *target) 
+{
+
+    /* Local Variables */
+
+    struct sockaddr_in *iaddr;
+
+    /* Set up the target address we first assume that the name is the
+       IP address as a string */
+
+    iaddr = (struct sockaddr_in *) &(target->address);
+    iaddr->sin_family = AF_INET;
+    if ((iaddr->sin_addr.s_addr = inet_addr(target->name)) == -1) {
+
+       /* Conversion of IP address failed, try to look the host up by name */
+
+       struct hostent *hent = gethostbyname(target->name);
+       if (hent == NULL) {
+           fprintf(stderr, "%s: could not resolve host %s\n",
+                    progname, target->name);
+           return 0;
+       }
+       memcpy(&iaddr->sin_addr, hent->h_addr_list[0],
+              sizeof(iaddr->sin_addr));
+    }
+
+    /* Done */
+
+    return 1;
+}
+
+/*
+ * Create a target for a host.
+ *
+ * Args:
+ *    name - The name of the host.
+ *
+ * Returns:
+ *    A newly allocated target or null if the host could not be resolved.
+ */
+
+static ping_target *
+newHost(char *name) 
+{
+
+    /* Local Variables */
+
+    ping_target *target = NULL;
+
+    /* Create the target */
+
+    if ((target = calloc(1, sizeof(ping_target))) == NULL) {
+       fprintf(stderr, "%s: Out of Memory\n", progname);
+       goto target_init_error;
+    }
+    if ((target->name = strdup(name)) == NULL) {
+       fprintf(stderr, "%s: Out of Memory\n", progname);
+       goto target_init_error;
+    }
+
+    /* Lookup the host */
+
+    if (! lookupHost(target))
+       goto target_init_error;
+
+    /* Done */
+
+    return target;
+
+    /* Handle errors here */
+
+target_init_error:
+    if (target != NULL)
+       free(target);
+    return NULL;
+}
+
+/*
+ * Generate a list of ping targets from the entries in a file.
+ *
+ * Args:
+ *    fname - The name of the file. This file is expected to be in the same
+ *            format as /etc/hosts.
+ *
+ * Returns:
+ *    A list of targets to ping or null if an error occured.
+ */
+
+static ping_target *
+readPingHostsFile(char *fname) 
+{
+
+    /* Local Variables */
+
+    FILE *fp;
+    char buf[LINE_MAX];
+    char *p;
+    ping_target *list = NULL;
+    char *addr, *name;
+    ping_target *new;
+
+    /* Make sure we in fact have a file to process */
+
+    if ((fname == NULL) || (fname[0] == '\0')) {
+       fprintf(stderr, "%s: invalid ping host file name\n", progname);
+       return NULL;
+    }
+
+    /* Open the file */
+
+    if ((fp = fopen(fname, "r")) == NULL) {
+       char msg[1024];
+       sprintf(msg, "%s: unable to open host file %s", progname, fname);
+       perror(msg);
+       return NULL;
+    }
+
+    /* Read the file line by line */
+
+    while ((p = fgets(buf, LINE_MAX, fp)) != NULL) {
+
+       /*
+        * Parse the line skipping those that start with '#'.
+        * The rest of the lines in the file should be in the same
+        * format as a /etc/hosts file. We are only concerned with
+        * the first two field, the IP address and the name
+        */
+
+       while ((*p == ' ') || (*p == '\t'))
+           p++;
+       if (*p == '#')
+           continue;
+
+       /* Get the name and address */
+
+       name = addr = NULL;
+       if ((addr = strtok(buf, " \t\n")) != NULL)
+           name = strtok(NULL, " \t\n");
+       else
+           continue;
+
+        /* Check to see if the addr looks like an addr.  If not, assume
+           the addr is a name and there is no addr.  This way, we can
+           handle files whose lines have "xx.xx.xx.xx hostname" as their
+           first two tokens, and also files that have a hostname as their
+           first token (like .ssh/known_hosts and .rhosts.)
+         */
+        {
+          int i; char c;
+          if (4 != sscanf(addr, "%d.%d.%d.%d%c", &i, &i, &i, &i, &c))
+            {
+              name = addr;
+              addr = NULL;
+            }
+        }
+        printf ("\"%s\" \"%s\"\n", name, addr);
+
+       /* Create a new target using first the name then the address */
+
+       new = NULL;
+       if (name != NULL)
+           new = newHost(name);
+       if (new == NULL && addr != NULL)
+           new = newHost(addr);
+
+       /* Add it to the list if we got one */
+
+       if (new != NULL) {
+           new->next = list;
+           list = new;
+       }
+    }
+
+    /* Close the file and return the list */
+
+    fclose(fp);
+    return list;
+}
+
+/*
+ * Generate a list of ping targets from the entries in a string.
+ *
+ * Args:
+ *    list - A list of comma separated host names.
+ *
+ * Returns:
+ *    A list of targets to ping or null if an error occured.
+ */
+
+static ping_target *
+readPingHostsList(char *list) 
+{
+
+    /* Local Variables */
+
+    char *host;
+    ping_target *hostlist = NULL;
+    ping_target *new;
+
+    /* Check that there is a list */
+
+    if ((list == NULL) || (list[0] == '\0'))
+       return NULL;
+
+    /* Loop through the hosts and add them to the list to return */
+
+    host = strtok(list, ",");
+    while (host != NULL) {
+       new = newHost(host);
+       if (new != NULL) {
+           new->next = hostlist;
+           hostlist = new;
+       }
+       host = strtok(NULL, ",");
+    }
+
+    /* Done */
+
+    return hostlist;
+}
+
+/*
+ * Generate a list ping targets consisting of all of the entries on
+ * the same subnet.
+ *
+ * Returns:
+ *    A list of all of the hosts on this net.
+ */
+
+static ping_target *
+subnetHostsList(void) 
+{
+
+    /* Local Variables */
+
+    char hostname[BUFSIZ];
+    char address[BUFSIZ];
+    struct hostent *hent;
+    char *p;
+    int i;
+    ping_target *new;
+    ping_target *list = NULL;
+
+    /* Get our hostname */
+
+    if (gethostname(hostname, BUFSIZ)) {
+       fprintf(stderr, "%s: unable to get local hostname\n", progname);
+       return NULL;
+    }
+
+    /* Get our IP address and convert it to a string */
+
+    if ((hent = gethostbyname(hostname)) == NULL) {
+       fprintf(stderr, "%s: unable to lookup our IP address\n", progname);
+       return NULL;
+    }
+    strcpy(address, inet_ntoa(*((struct in_addr *)hent->h_addr_list[0])));
+
+    /* Get a pointer to the last "." in the string */
+
+    if ((p = strrchr(address, '.')) == NULL) {
+       fprintf(stderr, "%s: can't parse IP address %s\n", progname, address);
+       return NULL;
+    }
+    p++;
+
+    /* Construct targets for all addresses in this subnet */
+
+    /* #### jwz: actually, this is wrong, since it assumes a
+       netmask of 255.255.255.0.  But I'm not sure how to find
+       the local netmask.
+     */
+    for (i = 254; i > 0; i--) {
+       sprintf(p, "%d", i);
+       new = newHost(address);
+       if (new != NULL) {
+           new->next = list;
+           list = new;
+       }
+    }
+  
+    /* Done */
+
+    return list;
+}
+
+/*
+ * Initialize the ping sensor.
+ *
+ * Returns:
+ *    A newly allocated ping_info structure or null if an error occured.
+ */
+
+static ping_info *
+init_ping(void) 
+{
+
+    /* Local Variables */
+
+    ping_info *pi = NULL;              /* The new ping_info struct */
+    char *src;                         /* The source of the ping hosts */
+    ping_target *pt;                   /* Used to count the targets */
+
+    /* Create the ping info structure */
+
+    if ((pi = (ping_info *) calloc(1, sizeof(ping_info))) == NULL) {
+       fprintf(stderr, "%s: Out of memory\n", progname);
+       goto ping_init_error;
+    }
+
+    /* Create the ICMP socket and turn off SUID */
+
+    if ((pi->icmpsock = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP)) < 0) {
+       char msg[1024];
+       sprintf(msg, "%s: can't create ICMP socket", progname);
+       perror(msg);
+       fprintf(stderr,
+         "%s: this program must be setuid to root for `ping mode' to work.\n",
+                progname);
+       goto ping_init_error;
+    }
+    setuid(getuid());
+    pi->pid = getpid() & 0xFFFF;
+    pi->seq = 0;
+    pi->timeout = get_integer_resource("pingTimeout", "PingTimeout");
+
+    /* Generate a list of targets */
+
+    src = get_string_resource("pingSource", "PingSource");
+    if (strcmp(src, "file") == 0) {
+
+       /*
+         * The list of ping targets is to come from a file in
+        * /etc/hosts format
+        */
+
+       pi->targets = readPingHostsFile(get_string_resource("pingFile",
+                                                           "PingFile"));
+
+    } else if (strcmp(src, "list") == 0) {
+
+       /* The list of hosts is to come from the pinghostlist resource */
+
+       pi->targets = readPingHostsList(get_string_resource("pingList",
+                                                           "PingList"));
+
+    } else if (strcmp(src, "subnet") == 0) {
+
+       pi->targets = subnetHostsList();
+
+    } else {
+
+       /* Unknown source */
+
+       fprintf(stderr,
+               "%s: pingSource must be `file', `list', or `subnet', not: %s\n",
+                progname, src);
+        exit (1);
+    }
+
+    /* Make sure there is something to ping */
+
+    if (pi->targets == NULL) {
+       fprintf(stderr, "%s: nothing to ping", progname);
+       goto ping_init_error;
+    }
+
+    /* Count the targets */
+
+    pt = pi->targets;
+    pi->numtargets = 0;
+    while (pt != NULL) {
+       pi->numtargets++;
+       pt = pt->next;
+    }
+
+    /* Done */
+
+    return pi;
+
+    /* Handle initialization errors here */
+
+ping_init_error:
+    if (pi != NULL)
+       free(pi);
+    return NULL;
+}
+
+/*
+ * Ping a host.
+ *
+ * Args:
+ *    pi   - The ping information strcuture.
+ *    host - The name or IP address of the host to ping (in ascii).
+ */
+
+static void
+sendping(ping_info *pi, ping_target *pt) 
+{
+
+    /* Local Variables */
+
+    u_char *packet;
+    struct ICMP *icmph;
+    int result;
+
+    /*
+     * Note, we will send the character name of the host that we are
+     * pinging in the packet so that we don't have to keep track of the
+     * name or do an address lookup when it comes back.
+     */
+
+    int pcktsiz = sizeof(struct ICMP) + sizeof(struct timeval) +
+       strlen(pt->name) + 1;
+
+    /* Create the ICMP packet */
+
+    if ((packet = (u_char *) malloc(pcktsiz)) == (void *) 0)
+       return;  /* Out of memory */
+    icmph = (struct ICMP *) packet;
+    ICMP_TYPE(icmph) = ICMP_ECHO;
+    ICMP_CODE(icmph) = 0;
+    ICMP_CHECKSUM(icmph) = 0;
+    ICMP_ID(icmph) = pi->pid;
+    ICMP_SEQ(icmph) = pi->seq++;
+    gettimeofday((struct timeval *) &packet[sizeof(struct ICMP)],
+                (struct timezone *) 0);
+    strcpy((char *) &packet[sizeof(struct ICMP) + sizeof(struct timeval)],
+          pt->name);
+    ICMP_CHECKSUM(icmph) = checksum((u_short *)packet, pcktsiz);
+
+    /* Send it */
+
+    if ((result = sendto(pi->icmpsock, packet, pcktsiz, 0, 
+                        &pt->address, sizeof(pt->address))) !=  pcktsiz) {
+#if 0
+        char errbuf[BUFSIZ];
+        sprintf(errbuf, "%s: error sending ping to %s", progname, pt->name);
+       perror(errbuf);
+#endif
+    }
+}
+
+/*
+ * Catch a signal and do nothing.
+ *
+ * Args:
+ *    sig - The signal that was caught.
+ */
+
+static void
+sigcatcher(int sig)
+{
+    timer_expired = 1;
+}
+
+/*
+ * Compute the checksum on a ping packet.
+ *
+ * Args:
+ *    packet - A pointer to the packet to compute the checksum for.
+ *    size   - The size of the packet.
+ *
+ * Returns:
+ *    The computed checksum
+ *    
+ */
+
+static u_short
+checksum(u_short *packet, int size) 
+{
+
+    /* Local Variables */
+
+    register int nleft = size;
+    register u_short *w = packet;
+    register int sum = 0;
+    u_short answer = 0;
+
+    /*
+     * Our algorithm is simple, using a 32 bit accumulator (sum), we add
+     * sequential 16 bit words to it, and at the end, fold back all the
+     * carry bits from the top 16 bits into the lower 16 bits.
+     */
+
+    while (nleft > 1)  {
+       sum += *w++;
+       nleft -= 2;
+    }
+
+    /* mop up an odd byte, if necessary */
+
+    if (nleft == 1) {
+       *(u_char *)(&answer) = *(u_char *)w ;
+        *(1 + (u_char *)(&answer)) = 0;
+       sum += answer;
+    }
+
+    /* add back carry outs from top 16 bits to low 16 bits */
+
+    sum = (sum >> 16) + (sum & 0xffff);     /* add hi 16 to low 16 */
+    sum += (sum >> 16);                     /* add carry */
+    answer = ~sum;                          /* truncate to 16 bits */
+
+    /* Done */
+
+    return(answer);
+}
+
+/*
+ * Look for ping replies.
+ *
+ * Retrieve all outstanding ping replies.
+ *
+ * Args:
+ *    si - Information about the sonar.
+ *    pi - Ping information.
+ *    ttl - The time each bogie is to live on the screen
+ *
+ * Returns:
+ *    A Bogie list of all the machines that replied.
+ */
+
+static Bogie *
+getping(sonar_info *si, ping_info *pi, int ttl) 
+{
+
+    /* Local Variables */
+
+    struct sockaddr from;
+    int fromlen;
+    int result;
+    u_char packet[1024];
+    struct timeval now;
+    struct timeval *then;
+    struct ip *ip;
+    int iphdrlen;
+    struct ICMP *icmph;
+    Bogie *bl = NULL;
+    Bogie *new;
+    char *name;
+    struct sigaction sa;
+    struct itimerval it;
+
+    /* Set up a signal to interupt our wait for a packet */
+
+    sigemptyset(&sa.sa_mask);
+    sa.sa_flags = 0;
+    sa.sa_handler = sigcatcher;
+    if (sigaction(SIGALRM, &sa, 0) == -1) {
+       char msg[1024];
+       sprintf(msg, "%s: unable to trap SIGALRM", progname);
+       perror(msg);
+       exit(1);
+    }
+
+    /* Set up a timer to interupt us if we don't get a packet */
+
+    it.it_interval.tv_sec = 0;
+    it.it_interval.tv_usec = 0;
+    it.it_value.tv_sec = 0;
+    it.it_value.tv_usec = pi->timeout;
+    timer_expired = 0;
+    setitimer(ITIMER_REAL, &it, NULL);
+
+    /* Wait for a result packet */
+
+    fromlen = sizeof(from);
+    while (! timer_expired &&
+          (result = recvfrom(pi->icmpsock, packet, sizeof(packet),
+                             0, &from, &fromlen)) > 0) {
+
+       /* Check the packet */
+
+       gettimeofday(&now, (struct timezone *) 0);
+       ip = (struct ip *) packet;
+
+       iphdrlen = ip->ip_hl << 2;
+        /* On DEC OSF1 4.0, the preceeding line needs to be
+           iphdrlen = (ip->ip_vhl & 0x0F) << 2;
+           but I don't know how to do this portably.  -- jwz.
+         */
+
+       icmph = (struct ICMP *) &packet[iphdrlen];
+
+       /* Was the packet a reply?? */
+
+       if (ICMP_TYPE(icmph) != ICMP_ECHOREPLY) {
+           /* Ignore anything but ICMP Replies */
+           continue; /* Nope */
+       }
+
+       /* Was it for us? */
+
+       if (ICMP_ID(icmph) != pi->pid) {
+           /* Ignore packets not set from us */
+           continue; /* Nope */
+       }
+
+       /* Copy the name of the bogie */
+
+       if ((name =
+            strdup((char *) &packet[iphdrlen + 
+                                   + sizeof(struct ICMP)
+                                   + sizeof(struct timeval)])) == NULL) {
+           fprintf(stderr, "%s: Out of memory\n", progname);
+           return bl;
+       }
+
+        /* If the name is an IP addr, try to resolve it. */
+        {
+          int iip[4];
+          char c;
+          if (4 == sscanf(name, " %d.%d.%d.%d %c",
+                          &iip[0], &iip[1], &iip[2], &iip[3], &c))
+            {
+              unsigned char ip[4];
+              struct hostent *h;
+              ip[0] = iip[0]; ip[1] = iip[1]; ip[2] = iip[2]; ip[3] = iip[3];
+              h = gethostbyaddr ((char *) ip, 4, AF_INET);
+              if (h && h->h_name && *h->h_name)
+                {
+                  free (name);
+                  name = strdup (h->h_name);
+                }
+            }
+        }
+
+       /* Create the new Bogie and add it to the list we are building */
+
+       if ((new = newBogie(name, 0, si->current, ttl)) == NULL)
+           return bl;
+       new->next = bl;
+       bl = new;
+
+       /* Compute the round trip time */
+
+       then =  (struct timeval *) &packet[iphdrlen +
+                                         sizeof(struct ICMP)];
+       new->distance = delta(then, &now) / 100;
+       if (new->distance == 0)
+               new->distance = 2; /* HACK */
+    }
+
+    /* Done */
+
+    return bl;
+}
+
+/*
+ * Ping hosts.
+ *
+ * Args:
+ *    si - Sonar Information.
+ *    pi - Ping Information.
+ *
+ * Returns:
+ *    A list of hosts that replied to pings or null if there were none.
+ */
+
+static Bogie *
+ping(sonar_info *si, void *vpi) 
+{
+
+    ping_info *pi = (ping_info *) vpi;
+    static ping_target *ptr = NULL;
+
+    int tick = si->current * -1 + 1;
+    if ((ptr == NULL) && (tick == 1))
+       ptr = pi->targets;
+
+    if (pi->numtargets <= 90) {
+       int xdrant = 90 / pi->numtargets;
+       if ((tick % xdrant) == 0) {
+           if (ptr != (ping_target *) 0) {
+               sendping(pi, ptr);
+               ptr = ptr->next;
+           }
+       }
+
+    } else if (pi->numtargets > 90) {
+       if (ptr != (ping_target *) 0) {
+           sendping(pi, ptr);
+           ptr = ptr->next;
+       }
+    }
+
+    /* Get the results */
+
+    return getping(si, pi, TTL);
+}
+
+#endif /* HAVE_PING */
+
+/*
+ * Calculate the difference between two timevals in microseconds.
+ *
+ * Args:
+ *    then - The older timeval.
+ *    now  - The newer timeval.
+ *
+ * Returns:
+ *   The difference between the two in microseconds.
+ */
+
+static long
+delta(struct timeval *then, struct timeval *now) 
+{
+    return (((now->tv_sec - then->tv_sec) * 1000000) + 
+              (now->tv_usec - then->tv_usec));  
+}
+
+/*
+ * Initialize the simulation mode.
+ */
+
+static sim_info *
+init_sim(void) 
+{
+
+    /* Local Variables */
+
+    sim_info *si;
+    int i;
+
+    /* Create the simulation info structure */
+
+    if ((si = (sim_info *) calloc(1, sizeof(sim_info))) == NULL) {
+       fprintf(stderr, "%s: Out of memory\n", progname);
+       return NULL;
+    }
+
+    /* Team A */
+
+    si->numA = get_integer_resource("teamACount", "TeamACount");
+    if ((si->teamA = (sim_target *)calloc(si->numA, sizeof(sim_target)))
+       == NULL) {
+       free(si);
+       fprintf(stderr, "%s: Out of Memory\n", progname);
+       return NULL;
+    }
+    si->teamAID = get_string_resource("teamAName", "TeamAName");
+    for (i = 0; i < si->numA; i++) {
+       if ((si->teamA[i].name = (char *) malloc(strlen(si->teamAID) + 4))
+           == NULL) {
+           free(si);
+           fprintf(stderr, "%s: Out of Memory\n", progname);
+           return NULL;
+       }
+       sprintf(si->teamA[i].name, "%s%03d", si->teamAID, i+1);
+       si->teamA[i].nexttick = (int) (90.0 * random() / RAND_MAX);
+       si->teamA[i].nextdist = (int) (100.0 * random() / RAND_MAX);
+    }
+
+    /* Team B */
+
+    si->numB = get_integer_resource("teamBCount", "TeamBCount");
+    if ((si->teamB = (sim_target *)calloc(si->numB, sizeof(sim_target)))
+       == NULL) {
+       free(si);
+       fprintf(stderr, "%s: Out of Memory\n", progname);
+       return NULL;
+    }
+    si->teamBID = get_string_resource("teamBName", "TeamBName");
+    for (i = 0; i < si->numB; i++) {
+       if ((si->teamB[i].name = (char *) malloc(strlen(si->teamBID) + 4))
+           == NULL) {
+           free(si);
+           fprintf(stderr, "%s: Out of Memory\n", progname);
+           return NULL;
+       }
+       sprintf(si->teamB[i].name, "%s%03d", si->teamBID, i+1);
+       si->teamB[i].nexttick = (int) (90.0 * random() / RAND_MAX);
+       si->teamB[i].nextdist = (int) (100.0 * random() / RAND_MAX);
+    }
+
+    /* Done */
+
+    return si;
+}
+
+/*
+ * Initialize the Sonar.
+ *
+ * Args:
+ *    dpy - The X display.
+ *    win - The X window;
+ *
+ * Returns:
+ *   A sonar_info strcuture or null if memory allocation problems occur.
+ */
+
+static sonar_info *
+init_sonar(Display *dpy, Window win) 
+{
+
+    /* Local Variables */
+
+    XGCValues gcv;
+    XWindowAttributes xwa;
+    sonar_info *si;
+    XColor start, end;
+    int h1, h2;
+    double s1, s2, v1, v2;
+
+    /* Create the Sonar information structure */
+
+    if ((si = (sonar_info *) calloc(1, sizeof(sonar_info))) == NULL) {
+       fprintf(stderr, "%s: Out of memory\n", progname);
+       return NULL;
+    }
+
+    /* Initialize the structure for the current environment */
+
+    si->dpy = dpy;
+    si->win = win;
+    si->visable = NULL;
+    XGetWindowAttributes(dpy, win, &xwa);
+    si->cmap = xwa.colormap;
+    si->width = xwa.width;
+    si->height = xwa.height;
+    si->centrex = si->width / 2;
+    si->centrey = si->height / 2;
+    si->maxx = si->centrex + MY_MIN(si->centrex, si->centrey) - 10;
+    si->minx = si->centrex - MY_MIN(si->centrex, si->centrey) + 10;
+    si->maxy = si->centrey + MY_MIN(si->centrex, si->centrey) - 10;
+    si->miny = si->centrey - MY_MIN(si->centrex, si->centrey) + 10;
+    si->radius = si->maxx - si->centrex;
+    si->current = 0;
+
+    /* Get the font */
+
+    if (((si->font = XLoadQueryFont(dpy, get_string_resource ("font", "Font")))
+        == NULL) &&
+       ((si->font = XLoadQueryFont(dpy, "fixed")) == NULL)) {
+       fprintf(stderr, "%s: can't load an appropriate font\n", progname);
+       return NULL;
+    }
+
+    /* Get the delay between animation frames */
+
+    si->delay = get_integer_resource ("delay", "Integer");
+    if (si->delay < 0) si->delay = 0;
+
+    /* Create the Graphics Contexts that will be used to draw things */
+
+    gcv.foreground = 
+       get_pixel_resource ("sweepColor", "SweepColor", dpy, si->cmap);
+    si->hi = XCreateGC(dpy, win, GCForeground, &gcv);
+    gcv.font = si->font->fid;
+    si->text = XCreateGC(dpy, win, GCForeground|GCFont, &gcv);
+    gcv.foreground = get_pixel_resource("scopeColor", "ScopeColor",
+                                       dpy, si->cmap);
+    si->erase = XCreateGC (dpy, win, GCForeground, &gcv);
+    gcv.foreground = get_pixel_resource("gridColor", "GridColor",
+                                       dpy, si->cmap);
+    si->grid = XCreateGC (dpy, win, GCForeground, &gcv);
+
+    /* Compute pixel values for fading text on the display */
+
+    XParseColor(dpy, si->cmap, 
+               get_string_resource("textColor", "TextColor"), &start);
+    XParseColor(dpy, si->cmap, 
+               get_string_resource("scopeColor", "ScopeColor"), &end);
+
+    rgb_to_hsv (start.red, start.green, start.blue, &h1, &s1, &v1);
+    rgb_to_hsv (end.red, end.green, end.blue, &h2, &s2, &v2);
+
+    si->text_steps = get_integer_resource("textSteps", "TextSteps");
+    if (si->text_steps < 0 || si->text_steps > 255)
+      si->text_steps = 10;
+
+    si->text_colors = (XColor *) calloc(si->text_steps, sizeof(XColor));
+    make_color_ramp (dpy, si->cmap,
+                     h1, s1, v1,
+                     h2, s2, v2,
+                     si->text_colors, &si->text_steps,
+                     False, True, False);
+
+    /* Compute the pixel values for the fading sweep */
+
+    XParseColor(dpy, si->cmap, 
+                get_string_resource("sweepColor", "SweepColor"), &start);
+
+    rgb_to_hsv (start.red, start.green, start.blue, &h1, &s1, &v1);
+
+    si->sweep_degrees = get_integer_resource("sweepDegrees", "Degrees");
+    if (si->sweep_degrees <= 0) si->sweep_degrees = 20;
+    if (si->sweep_degrees > 350) si->sweep_degrees = 350;
+
+    si->sweep_segs = get_integer_resource("sweepSegments", "SweepSegments");
+    if (si->sweep_segs < 1 || si->sweep_segs > 255)
+      si->sweep_segs = 255;
+
+    si->sweep_colors = (XColor *) calloc(si->sweep_segs, sizeof(XColor));
+    make_color_ramp (dpy, si->cmap,
+                     h1, s1, v1,
+                     h2, s2, v2,
+                     si->sweep_colors, &si->sweep_segs,
+                     False, True, False);
+
+    /* Done */
+
+    return si;
+}
+
+/*
+ * Update the location of a simulated bogie.
+ */
+
+static void
+updateLocation(sim_target *t) 
+{
+
+    int xdist, xtick;
+
+    t->movedlasttick = 1;
+    xtick = (int) (3.0 * random() / RAND_MAX) - 1;
+    xdist = (int) (11.0 * random() / RAND_MAX) - 5;
+    if (((t->nexttick + xtick) < 90) && ((t->nexttick + xtick) >= 0))
+       t->nexttick += xtick;
+    else
+       t->nexttick -= xtick;
+    if (((t->nextdist + xdist) < 100) && ((t->nextdist+xdist) >= 0))
+       t->nextdist += xdist;
+    else
+       t->nextdist -= xdist;
+}
+
+/*
+ * The simulator. This uses information in the sim_info to simulate a bunch
+ * of bogies flying around on the screen.
+ */
+
+/*
+ * TODO: It would be cool to have the two teams chase each other around and
+ *       shoot it out.
+ */
+
+static Bogie *
+simulator(sonar_info *si, void *vinfo) 
+{
+
+    /* Local Variables */
+
+    int i;
+    Bogie *list = NULL;
+    Bogie *new;
+    sim_target *t;
+    sim_info *info = (sim_info *) vinfo;
+
+    /* Check team A */
+
+    for (i = 0; i < info->numA; i++) {
+       t = &info->teamA[i];
+       if (!t->movedlasttick && (t->nexttick == (si->current * -1))) {
+           new = newBogie(strdup(t->name), t->nextdist, si->current, TTL);
+           if (list != NULL)
+               new->next = list;
+           list = new;
+           updateLocation(t);
+       } else
+           t->movedlasttick = 0;
+    }
+
+    /* Team B */
+
+    for (i = 0; i < info->numB; i++) {
+       t = &info->teamB[i];
+       if (!t->movedlasttick && (t->nexttick == (si->current * -1))) {
+           new = newBogie(strdup(t->name), t->nextdist, si->current, TTL);
+           if (list != NULL)
+               new->next = list;
+           list = new;
+           t->movedlasttick = 1;
+           updateLocation(t);
+       } else
+           t->movedlasttick = 0;
+    }
+
+    /* Done */
+
+    return list;
+}
+
+/*
+ * Compute the X coordinate of the label.
+ *
+ * Args:
+ *    si - The sonar info block.
+ *    label - The label that will be drawn.
+ *    x - The x coordinate of the bogie.
+ *
+ * Returns:
+ *    The x coordinate of the start of the label.
+ */
+
+static int
+computeStringX(sonar_info *si, char *label, int x) 
+{
+
+    int width = XTextWidth(si->font, label, strlen(label));
+    return x - (width / 2);
+}
+
+/*
+ * Compute the Y coordinate of the label.
+ *
+ * Args:
+ *    si - The sonar information.
+ *    y - The y coordinate of the bogie.
+ *
+ * Returns:
+ *    The y coordinate of the start of the label.
+ */
+
+/* TODO: Add smarts to keep label in sonar screen */
+
+static int
+computeStringY(sonar_info *si, int y) 
+{
+
+    int fheight = si->font->ascent + si->font->descent;
+    return y + 5 + fheight;
+}
+
+/*
+ * Draw a Bogie on the radar screen.
+ *
+ * Args:
+ *    si       - Sonar Information.
+ *    draw     - A flag to indicate if the bogie should be drawn or erased.
+ *    name     - The name of the bogie.
+ *    degrees  - The number of degrees that it should apprear at.
+ *    distance - The distance the object is from the centre.
+ *    ttl      - The time this bogie has to live.
+ *    age      - The time this bogie has been around.
+ */
+
+static void
+DrawBogie(sonar_info *si, int draw, char *name, int degrees, 
+         int distance, int ttl, int age) 
+{
+
+    /* Local Variables */
+
+    int x, y;
+    GC gc;
+    int ox = si->centrex;
+    int oy = si->centrey;
+    int index, delta;
+
+    /* Compute the coordinates of the object */
+
+    distance = (log((double) distance) / 10.0) * si->radius;
+    x = ox + ((double) distance * cos(4.0 * ((double) degrees)/57.29578));
+    y = oy - ((double) distance * sin(4.0 * ((double) degrees)/57.29578));
+
+    /* Set up the graphics context */
+
+    if (draw) {
+
+       /* Here we attempt to compute the distance into the total life of
+        * object that we currently are. This distance is used against
+        * the total lifetime to compute a fraction which is the index of
+        * the color to draw the bogie.
+        */
+
+       if (si->current <= degrees)
+           delta = (si->current - degrees) * -1;
+       else
+           delta = 90 + (degrees - si->current);
+       delta += (age * 90);
+       index = (si->text_steps - 1) * ((float) delta / (90.0 * (float) ttl));
+       gc = si->text;
+       XSetForeground(si->dpy, gc, si->text_colors[index].pixel);
+
+    } else
+       gc = si->erase;
+
+  /* Draw (or erase) the Bogie */
+
+    XFillArc(si->dpy, si->win, gc, x, y, 5, 5, 0, 360 * 64);
+    XDrawString(si->dpy, si->win, gc,
+               computeStringX(si, name, x),
+               computeStringY(si, y), name, strlen(name));
+}
+
+
+/*
+ * Draw the sonar grid.
+ *
+ * Args:
+ *    si - Sonar information block.
+ */
+
+static void
+drawGrid(sonar_info *si) 
+{
+
+    /* Local Variables */
+
+    int i;
+    int width = si->maxx - si->minx;
+    int height = si->maxy - si->miny;
+  
+    /* Draw the circles */
+
+    XDrawArc(si->dpy, si->win, si->grid, si->minx - 10, si->miny - 10, 
+            width + 20, height + 20,  0, (360 * 64));
+
+    XDrawArc(si->dpy, si->win, si->grid, si->minx, si->miny, 
+            width, height,  0, (360 * 64));
+
+    XDrawArc(si->dpy, si->win, si->grid, 
+            (int) (si->minx + (.166 * width)), 
+            (int) (si->miny + (.166 * height)), 
+            (unsigned int) (.666 * width), (unsigned int)(.666 * height),
+            0, (360 * 64));
+
+    XDrawArc(si->dpy, si->win, si->grid, 
+            (int) (si->minx + (.333 * width)),
+            (int) (si->miny + (.333 * height)), 
+            (unsigned int) (.333 * width), (unsigned int) (.333 * height),
+            0, (360 * 64));
+
+    /* Draw the radial lines */
+
+    for (i = 0; i < 360; i += 10)
+       if (i % 30 == 0)
+           XDrawLine(si->dpy, si->win, si->grid, si->centrex, si->centrey,
+                     (int) (si->centrex +
+                     (si->radius + 10) * (cos((double) i / 57.29578))),
+                     (int) (si->centrey -
+                     (si->radius + 10)*(sin((double) i / 57.29578))));
+       else
+           XDrawLine(si->dpy, si->win, si->grid, 
+                     (int) (si->centrex + si->radius *
+                            (cos((double) i / 57.29578))),
+                     (int) (si->centrey - si->radius *
+                            (sin((double) i / 57.29578))),
+                     (int) (si->centrex +
+                     (si->radius + 10) * (cos((double) i / 57.29578))),
+                     (int) (si->centrey - 
+                     (si->radius + 10) * (sin((double) i / 57.29578))));
+}
+
+/*
+ * Update the Sonar scope.
+ *
+ * Args:
+ *    si - The Sonar information.
+ *    bl - A list  of bogies to add to the scope.
+ */
+
+static void
+Sonar(sonar_info *si, Bogie *bl) 
+{
+
+    /* Local Variables */
+
+    Bogie *bp, *prev;
+    int i;
+
+    /* Check for expired tagets and remove them from the visable list */
+
+    prev = NULL;
+    for (bp = si->visable; bp != NULL; bp = bp->next) {
+
+       /*
+        * Remove it from the visable list if it's expired or we have
+        * a new target with the same name.
+        */
+
+       bp->age ++;
+
+       if (((bp->tick == si->current) && (++bp->age >= bp->ttl)) ||
+           (findNode(bl, bp->name) != NULL)) {
+           DrawBogie(si, 0, bp->name, bp->tick,
+                     bp->distance, bp->ttl, bp->age);
+           if (prev == NULL)
+               si->visable = bp->next;
+           else
+               prev->next = bp->next;
+           freeBogie(bp);
+       } else
+           prev = bp;
+    }
+
+    /* Draw the sweep */
+
+    {
+      int seg_deg = (si->sweep_degrees * 64) / si->sweep_segs;
+      int start_deg = si->current * 4 * 64;
+      if (seg_deg <= 0) seg_deg = 1;
+      for (i = 0; i < si->sweep_segs; i++) {
+       XSetForeground(si->dpy, si->hi, si->sweep_colors[i].pixel);
+       XFillArc(si->dpy, si->win, si->hi, si->minx, si->miny, 
+                si->maxx - si->minx, si->maxy - si->miny,
+                 start_deg + (i * seg_deg),
+                 seg_deg);
+      }
+
+      /* Remove the trailing wedge the sonar */
+      XFillArc(si->dpy, si->win, si->erase, si->minx, si->miny, 
+               si->maxx - si->minx, si->maxy - si->miny, 
+               start_deg + (i * seg_deg),
+               (4 * 64));
+    }
+
+    /* Move the new targets to the visable list */
+
+    for (bp = bl; bp != (Bogie *) 0; bp = bl) {
+       bl = bl->next;
+       bp->next = si->visable;
+       si->visable = bp;
+    }
+
+    /* Draw the visable targets */
+
+    for (bp = si->visable; bp != NULL; bp = bp->next) {
+       if (bp->age < bp->ttl)          /* grins */
+          DrawBogie(si, 1, bp->name, bp->tick, bp->distance, bp->ttl,bp->age);
+    }
+
+    /* Redraw the grid */
+
+    drawGrid(si);
+}
+
+/*
+ * Main screen saver hack.
+ *
+ * Args:
+ *    dpy - The X display.
+ *    win - The X window.
+ */
+
+void 
+screenhack(Display *dpy, Window win) 
+{
+
+    /* Local Variables */
+
+    sonar_info *si;
+    struct timeval start, finish;
+    Bogie *bl;
+    long sleeptime;
+    char *mode;
+
+    /* 
+     * Initialize 
+     * Adding new sensors would involve supporting more modes other than
+     * ping and initiailizing the sensor in the same way.
+     */
+
+    mode = get_string_resource("mode", "Mode");
+
+    if (!mode || !*mode || !strcmp(mode, "default")) /* Pick a good default. */
+      {
+#ifdef HAVE_PING
+        if (geteuid() == 0)    /* we're root or setuid -- ping will work. */
+          mode = "ping";
+        else
+#endif
+          mode = "simulation";
+      }
+
+#ifdef HAVE_PING
+    if (strcmp(mode, "ping") == 0) {
+       sensor = ping;
+       if ((sensor_info = (void *) init_ping()) == (void *) 0)
+          {
+            fprintf (stderr, "%s: running in `simulation mode' instead.\n",
+                     progname);
+           goto SIM;
+          }
+    } else
+#endif /* HAVE_PING */
+    if (strcmp(mode, "simulation") == 0) {
+#ifdef HAVE_PING
+    SIM:
+#endif
+       sensor = simulator;
+       if ((sensor_info = (void *) init_sim()) == NULL)
+           exit(1);
+    } else {
+       fprintf(stderr, "%s: unsupported Sonar mode: %s\n", progname, mode);
+       fprintf(stderr,
+                "\tCurrently supported modes are `ping' and `simulation'\n");
+       exit(1);
+    }
+    if ((si = init_sonar(dpy, win)) == (sonar_info *) 0)
+       exit(1);
+  
+    /* Sonar loop */
+
+    TTL = get_integer_resource("ttl", "TTL");
+
+    while (1) {
+
+       /* Call the sensor and display the results */
+
+       gettimeofday(&start, (struct timezone *) 0);
+       bl = sensor(si, sensor_info);
+       Sonar(si, bl);
+
+        /* Set up and sleep for the next one */
+
+       si->current = (si->current - 1) % 90;
+       XSync (dpy, False);
+       gettimeofday(&finish, (struct timezone *) 0);
+       sleeptime = si->delay - delta(&start, &finish);
+        screenhack_handle_events (dpy);
+       if (sleeptime > 0L)
+           usleep(sleeptime);
+    }
+}
diff --git a/hacks/sonar.man b/hacks/sonar.man
new file mode 100644 (file)
index 0000000..1313972
--- /dev/null
@@ -0,0 +1,185 @@
+.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
+..
+.TH Sonar 1 "3-Nov-98" "X Version 11"
+.SH NAME
+sonar - display a sonar scope
+.SH SYNOPSIS
+.B sonar
+[\-background \fIcolor\fP]
+[\-sweep\-color \fIcolor\fP]
+[\-low\-color \fIcolor\fP] 
+[\-scope\-color \fIcolor\fP]
+[\-grid\-color \fIcolor\fP]
+[\-text\-color \fIcolor\fP]
+[\-ttl \fIinteger\fP]
+[\-mode ping]
+[\-font \fIfont\fP]
+[\-ping\-timeout \fIint\fP]
+[\-ping\-source list | file | subnet ] 
+[\-ping\-file \fIhosts-file\fP]
+[\-ping\-list \fIhost-name-list\fP]
+[\-team-a-name \fIstring\fP] 
+[\-team-b-name \fIstring\fP]
+[\-team-a-count \fIint\fP]
+[\-team-b-count \fIint\fP]
+.SH DESCRIPTION
+The \fIsonar\fP program displays a sonar scope on the computer's screen.
+This scope polls a sensor as the sweep goes around the scope and displays
+what it finds as bogies on the screen.  The program is designed to support
+different modes representing different types of sensors.  Currently the
+only implemented sensors are a simulator, and a network ping function that
+pings hosts and plots the results on the scope.
+.SH OPTIONS
+.I sonar
+understands the following options:
+.TP 8
+.B \-background \fIColor\fP
+The background Color of the screen not covered by the scope.
+.TP 8
+.B \-sweep\-color \fIColor\fP
+The color of the brightest part of the sweep.
+.TP 8
+.B \-scope\-color \fIColor\fP
+The color of the circular part of the scope.
+.TP 8
+.B \-grid\-color \fIColor\fP
+The color to the grid lines overlaying the scope.
+.TP 8
+.B \-text\-color \fIColor\fP
+The color of the text identifying bogies on the scope.
+.TP 8
+.B \-ttl \fIinteger\fP
+"Time to live": visible time of a Bogie. Try values between 10 (very short)
+and 100. 
+.TP 8
+.B \-mode \fIsimulation | ping\fP
+The sensor mode to use, the currently supported modes \fIsimulate\fP (the
+default) and \fIping\fP.
+.TP 8
+.B \-font \fIfont\fP
+The font used to display text on the scope.  Default "fixed".
+.TP 8
+.B \-ping\-timeout \fIint\fP
+The amount of time in milliseconds the program will wait for an answer
+to a ping.
+.TP 8
+.B \-ping\-source list | file | subnet
+Th source of the list of hosts to ping. Valid values are: \fIlist\fP,
+\fIfile\fP, \fIsubnet\fP.  The first two values are described below;
+and \fIsubnet\fP indicates that the sonar should ping all hosts in the
+same subnet as the current machine.  (All addresses are treated
+as class C nets, therefore this will at most ping 254 hosts.)
+.TP 8
+.B \-ping\-file \fIfilename\fP
+The path to a file listing the hosts to ping.  This file can be in the
+format used by \fI/etc/hosts\fP, or it can be any file that has host
+names as the first element on each line.  If you use ssh, try this:
+.EX
+sonar -mode ping -ping-file $HOME/.ssh/known_hosts
+.EE
+This is used only used when \fIpingSource\fP is set to \fBfile\fP.
+.TP 8
+.B \-ping\-list \fIlist\fP
+A comma separated list of hostnames, eg \fI"pinky,brain,dot"\fP.
+Only used when \fIpingSource\fP is set to \fBlist\fP.
+.TP 8
+.B \-team-a-name \fIstring\fP
+The name of team A, in simulation-mode.
+.TP 8
+.B \-team-b-name \fIstring\fP
+The name of team B, in simulation-mode.
+.TP 8
+.B \-team-a-count \fIint\fP
+The number of bogies on team A, in simulation-mode.
+.TP 8
+.B \-team-b-count \fIint\fP
+The number of bogies on team B, in simulation-mode.
+.SH RESOURCES
+Configuration of the targets to ping is best done by setting X Resources.
+.PP
+.TP 8
+.B background \fI(Color)\fP
+See option \-background, above; default value is \fIblack\fP.
+.TP 8
+.B sweepColor \fI(Color)\fP
+See option \-sweep\-color, above; default value is \fI#00ff00\fP.
+.TP 8
+.B scopeColor \fI(Color)\fP
+See option \-scope\-color, above; default value is \fI#003300\fP.
+.TP 8
+.B gridColor \fI(Color)\fP
+See option \-grid\-color, above; default value is \fI#00aa00\fP.
+.TP 8
+.B textColor \fI(Color)\fP
+See option \-text\-color, above; default value is \fI#ffff00\fP.
+.TP 8
+.B ttl \fI(integer)\fP
+See option \-ttl, above; default value is \fI90\fP or one sweep.
+.TP 8
+.B mode \fI(ping)\fP
+See option \-mode, above.  If set to \fBdefault\fP, it will ping hosts if
+possible, otherwise, will run in simulation-mode.
+.TP 8
+.B font \fI(font)\fP
+See option \-font, above; default value is \fIfixed\fP.
+.TP 8
+.B pingTimeout \fI(Integer)\fP
+See option \-pingtimeout, above; default value is 3000.
+.TP 8
+.B pingSource \fIlist | file | subnet\fP
+See option \-ping\-source, above.  Default value is \fIfile\fP.
+.TP 8
+.B pingFile \fIpathname\fP
+See option \-ping\-file, above.  Default value is \fI/etc/hosts\fP.
+.TP 8
+.B pingList \fIhost,host,host...\fP
+See option \-ping\-list, above; default value is \fBlocalhost\fP.
+.TP 8
+.B teamAName \fIstring\fP
+See option \-team\-a\-name, above.  Default value is \fBF18\fP.
+.TP 8
+.B teamBName \fIstring\fP
+See option \-teamBName, above.  Default value is \fBMIG\fP.
+.TP 8
+.B teamACount \fIint\fP
+See option \-teamACount, above.  Default value is 4.
+.TP 8
+.B teamBCount \fIint\fP
+See option \-teamBCount, above.  Default value is 4.
+.SH NOTES
+In order to use the ping sensor, this program must be installed as 
+setuid root, so that it can create an ICMP socket.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1),
+.BR ping (8)
+.SH COPYRIGHT
+Copyright \(co 1998 by Stephen Martin. (smartin@canada.com)
+
+Permission to use, copy, modify, distribute, and sell this software 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.  No representations are made about the suitability of this
+software for any purpose.  It is provided "as is" without express or 
+implied warranty.
+
+.SH AUTHORS
+Stephen Martin <smartin@canada.com>, 3-nov-98.
+
+Thanks to Tom Kelly for suggesting a modular approach to the sensor
+amoung other things.
+
+Thomas Bahls <thommy@cs.tu-berlin.de> hacked the "ttl" option, 12-jul-98.
+
diff --git a/hacks/sphere.c b/hacks/sphere.c
new file mode 100644 (file)
index 0000000..e0a81e3
--- /dev/null
@@ -0,0 +1,246 @@
+/* -*- Mode: C; tab-width: 4 -*-
+ * sphere.c --- draw a bunch of shaded spheres
+ */
+#if !defined( lint ) && !defined( SABER )
+static const char sccsid[] = "@(#)sphere.c     4.00 97/01/01 xlockmore";
+#endif
+
+/* Copyright 1988 by Sun Microsystems, Inc. Mountain View, CA.
+ *
+ * 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 permission notice appear in supporting
+ * documentation, and that the names of Sun or MIT not be used in advertising
+ * or publicity pertaining to distribution of the software without specific
+ * prior written permission. Sun and M.I.T. make no representations about the
+ * suitability of this software for any purpose. It is provided "as is"
+ * without any express or implied warranty.
+ *
+ * SUN DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+ * IN NO EVENT SHALL SUN 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.
+ * ***************************************************************************
+ *
+ * Revision History:
+ * 30-May-97: jwz@jwz.org: made it go vertically as well as horizontally.
+ * 27-May-97: jwz@jwz.org: turned into a standalone program.
+ * 2-Sep-93: xlock version (David Bagley bagleyd@bigfoot.com)
+ * 1988: Revised to use SunView canvas instead of gfxsw Sun Microsystems
+ * 1982: Orignal Algorithm  Tom Duff  Lucasfilm Ltd.
+ */
+
+#ifdef STANDALONE
+# define PROGCLASS                                     "Sphere"
+# define HACK_INIT                                     init_sphere
+# define HACK_DRAW                                     draw_sphere
+# define sphere_opts                           xlockmore_opts
+# define DEFAULTS      "*delay:                1000    \n"                     \
+                                       "*ncolors:              64      \n"
+# define BRIGHT_COLORS
+# include "xlockmore.h"                                /* from the xscreensaver distribution */
+#else  /* !STANDALONE */
+# include "xlock.h"                                    /* from the xlockmore distribution */
+#endif /* !STANDALONE */
+
+ModeSpecOpt sphere_opts = {
+  0, NULL, 0, NULL, NULL };
+
+/*-
+ * (NX, NY, NZ) is the light source vector -- length should be 100
+ */
+#define NX 48
+#define NY (-36)
+#define NZ 80
+#define NR 100
+#define SQRT(a) ((int)sqrt((double)(a)))
+
+typedef struct {
+       int         width, height;
+       int         radius;
+       int         x0;         /* x center */
+       int         y0;         /* y center */
+       int         color;
+       int         x, y;
+       int         dirx, diry;
+       int         maxx, maxy;
+       XPoint     *points;
+} spherestruct;
+
+static spherestruct *spheres = NULL;
+
+void
+init_sphere(ModeInfo * mi)
+{
+       spherestruct *sp;
+
+       if (spheres == NULL) {
+               if ((spheres = (spherestruct *) calloc(MI_NUM_SCREENS(mi),
+                                            sizeof (spherestruct))) == NULL)
+                       return;
+       }
+       sp = &spheres[MI_SCREEN(mi)];
+
+       if (sp->points) {
+               (void) free((void *) sp->points);
+               sp->points = NULL;
+       }
+       sp->width = MI_WIN_WIDTH(mi);
+       sp->height = MI_WIN_HEIGHT(mi);
+       sp->points = (XPoint *) malloc(sp->height * sizeof (XPoint));
+
+       XClearWindow(MI_DISPLAY(mi), MI_WINDOW(mi));
+
+       sp->dirx = 1;
+}
+
+void
+draw_sphere(ModeInfo * mi)
+{
+       Display    *display = MI_DISPLAY(mi);
+       GC          gc = MI_GC(mi);
+       spherestruct *sp = &spheres[MI_SCREEN(mi)];
+       int         minx = 0, maxx = 0, miny = 0, maxy = 0, npts = 0;
+
+       if ((sp->dirx && ABS(sp->x) >= sp->radius) ||
+           (sp->diry && ABS(sp->y) >= sp->radius)) {
+               sp->radius = NRAND(MIN(sp->width / 2, sp->height / 2) - 1) + 1;
+
+               if (LRAND() & 1) {
+                       sp->dirx = (LRAND() & 1) * 2 - 1;
+                       sp->diry = 0;
+               } else {
+                       sp->dirx = 0;
+                       sp->diry = (LRAND() & 1) * 2 - 1;
+               }
+               sp->x0 = NRAND(sp->width);
+               sp->y0 = NRAND(sp->height);
+
+               sp->x = -sp->radius * sp->dirx;
+               sp->y = -sp->radius * sp->diry;
+
+               if (MI_NPIXELS(mi) > 2)
+                       sp->color = NRAND(MI_NPIXELS(mi));
+       }
+       if (sp->dirx == 1) {
+               if (sp->x0 + sp->x < 0)
+                       sp->x = -sp->x0;
+       } else if (sp->dirx == -1) {
+               if (sp->x0 + sp->x >= sp->width)
+                       sp->x = sp->width - sp->x0 - 1;
+       }
+       if (sp->diry == 1) {
+               if (sp->y0 + sp->y < 0)
+                       sp->y = -sp->y0;
+       } else if (sp->diry == -1) {
+               if (sp->y0 + sp->y >= sp->height)
+                       sp->y = sp->height - sp->y0 - 1;
+       }
+       if (sp->dirx) {
+               sp->maxy = SQRT(sp->radius * sp->radius - sp->x * sp->x);
+               miny = -sp->maxy;
+               if (sp->y0 - sp->maxy < 0)
+                       miny = -sp->y0;
+               maxy = sp->maxy;
+       }
+       if (sp->diry) {
+               sp->maxx = SQRT(sp->radius * sp->radius - sp->y * sp->y);
+               minx = -sp->maxx;
+               if (sp->x0 - sp->maxx < 0)
+                       minx = -sp->x0;
+               maxx = sp->maxx;
+       }
+       if (sp->dirx) {
+               if (sp->y0 + sp->maxy >= sp->height)
+                       maxy = sp->height - sp->y0;
+       }
+       if (sp->diry) {
+               if (sp->x0 + sp->maxx >= sp->width)
+                       maxx = sp->width - sp->x0;
+       }
+       XSetForeground(display, gc, MI_WIN_BLACK_PIXEL(mi));
+
+       if (sp->dirx)
+               XDrawLine(display, MI_WINDOW(mi), gc,
+               sp->x0 + sp->x, sp->y0 + miny, sp->x0 + sp->x, sp->y0 + maxy);
+       if (sp->diry)
+               XDrawLine(display, MI_WINDOW(mi), gc,
+               sp->x0 + minx, sp->y0 + sp->y, sp->x0 + maxx, sp->y0 + sp->y);
+
+       if (MI_NPIXELS(mi) > 2)
+               XSetForeground(display, gc, MI_PIXEL(mi, sp->color));
+       else
+               XSetForeground(display, gc, MI_WIN_WHITE_PIXEL(mi));
+
+       if (sp->dirx)
+               for (sp->y = miny; sp->y <= maxy; sp->y++)
+                       if ((NRAND(sp->radius * NR)) <=
+                           (NX * sp->x + NY * sp->y + NZ *
+                            SQRT(sp->radius * sp->radius - sp->x * sp->x - sp->y * sp->y))) {
+                               sp->points[npts].x = sp->x + sp->x0;
+                               sp->points[npts].y = sp->y + sp->y0;
+                               npts++;
+                       }
+       if (sp->diry)
+               for (sp->x = minx; sp->x <= maxx; sp->x++)
+                       if ((NRAND(sp->radius * NR)) <=
+                           (NX * sp->x + NY * sp->y + NZ *
+                            SQRT(sp->radius * sp->radius - sp->x * sp->x - sp->y * sp->y))) {
+                               sp->points[npts].x = sp->x + sp->x0;
+                               sp->points[npts].y = sp->y + sp->y0;
+                               npts++;
+                       }
+       XDrawPoints(display, MI_WINDOW(mi), gc, sp->points, npts, CoordModeOrigin);
+       if (sp->dirx == 1) {
+               sp->x++;
+               if (sp->x0 + sp->x >= sp->width)
+                       sp->x = sp->radius;
+       } else if (sp->dirx == -1) {
+               sp->x--;
+               if (sp->x0 + sp->x < 0)
+                       sp->x = -sp->radius;
+       }
+       if (sp->diry == 1) {
+               sp->y++;
+               if (sp->y0 + sp->y >= sp->height)
+                       sp->y = sp->radius;
+       } else if (sp->diry == -1) {
+               sp->y--;
+               if (sp->y0 + sp->y < 0)
+                       sp->y = -sp->radius;
+       }
+}
+
+void
+release_sphere(ModeInfo * mi)
+{
+       if (spheres != NULL) {
+               int         screen;
+
+               for (screen = 0; screen < MI_NUM_SCREENS(mi); screen++) {
+                       spherestruct *sp = &spheres[screen];
+
+                       if (sp->points) {
+                               (void) free((void *) sp->points);
+                               sp->points = NULL;
+                       }
+               }
+               (void) free((void *) spheres);
+               spheres = NULL;
+       }
+}
+
+void
+refresh_sphere(ModeInfo * mi)
+{
+       spherestruct *sp = &spheres[MI_SCREEN(mi)];
+
+       XClearWindow(MI_DISPLAY(mi), MI_WINDOW(mi));
+       sp->x = -sp->radius;
+}
diff --git a/hacks/sphere.man b/hacks/sphere.man
new file mode 100644 (file)
index 0000000..1632ab9
--- /dev/null
@@ -0,0 +1,58 @@
+.TH XScreenSaver 1 "27-May-97" "X Version 11"
+.SH NAME
+sphere - draws shaded spheres
+.SH SYNOPSIS
+.B sphere
+[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-ncolors \fIinteger\fP] [\-delay \fImicroseconds\fP]
+
+.SH DESCRIPTION
+The \fIsphere\fP program draws shaded spheres.
+.SH OPTIONS
+.I sphere
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window.  This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-mono 
+If on a color display, pretend we're on a monochrome display.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use.  Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-ncolors \fIinteger\fP
+How many colors should be used (if possible).  Default 64.
+The colors are chosen randomly.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1),
+.BR xlock (1)
+.SH COPYRIGHT
+Copyright \(co 1988 by Sun Microsystems, Inc.
+
+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. 
+.SH AUTHOR
+Sun Microsystems, Inc, 1988.
+
+Ability to run standalone or with \fIxscreensaver\fP added by 
+Jamie Zawinski <jwz@jwz.org>, 27-May-97.
diff --git a/hacks/spiral.c b/hacks/spiral.c
new file mode 100644 (file)
index 0000000..10d319a
--- /dev/null
@@ -0,0 +1,300 @@
+/* -*- Mode: C; tab-width: 4 -*-
+ * spiral --- low cpu screen design.
+ */
+#if !defined( lint ) && !defined( SABER )
+static const char sccsid[] = "@(#)spiral.c     4.00 97/01/01 xlockmore";
+#endif
+
+/* Copyright (c) 1994 Darrick Brown.
+ *
+ * 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.
+ *
+ * This file is provided AS IS with no warranties of any kind.  The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof.  In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * Idea based on a graphics demo I saw a *LONG* time ago.
+ *
+ * See xlock.c for copying information.
+ *
+ * Revision History:
+ * 10-May-97: jwz@jwz.org: turned into a standalone program.
+ * 24-Jul-95: Fix to allow cycles not to have an arbitrary value by
+ *            Peter Schmitzberger (schmitz@coma.sbg.ac.at).
+ * 06-Mar-95: Finished cleaning up and final testing.
+ * Copyright (c) 1994 by Darrick Brown.
+ *
+ * 03-Mar-95: Cleaned up code.
+ * 12-Jul-94: Written.
+ */
+
+#ifdef STANDALONE
+# define PROGCLASS                                     "Spiral"
+# define HACK_INIT                                     init_spiral
+# define HACK_DRAW                                     draw_spiral
+# define spiral_opts                           xlockmore_opts
+# define DEFAULTS      "*count:                40    \n"                       \
+                                       "*cycles:               350   \n"                       \
+                                       "*delay:                50000 \n"                       \
+                                       "*ncolors:              64   \n"
+# define SMOOTH_COLORS
+# include "xlockmore.h"                                /* from the xscreensaver distribution */
+#else  /* !STANDALONE */
+# include "xlock.h"                                    /* from the xlockmore distribution */
+#endif /* !STANDALONE */
+
+ModeSpecOpt spiral_opts = {
+  0, NULL, 0, NULL, NULL };
+
+#define MAXTRAIL 512           /* The length of the trail */
+#define MAXDOTS 40
+#define MINDOTS 1
+#define TWOPI (2.0*M_PI)       /* for convienence */
+#define JAGGINESS 4            /* This sets the "Craziness" of the spiral (I like 4) */
+#define SPEED 2.0
+
+/* How many segments to draw per cycle when redrawing */
+#define REDRAWSTEP 3
+
+typedef struct {
+       float       hx, hy, ha, hr;
+} Traildots;
+
+typedef struct {
+       Traildots  *traildots;
+       float       cx, cy;
+       float       angle;
+       float       radius;
+       float       dr, da;
+       float       dx, dy;
+       int         erase;
+       int         inc;
+       float       colors;
+       int         width, height;
+       float       top, bottom, left, right;
+       int         dots, nlength;
+       int         redrawing, redrawpos;
+} spiralstruct;
+
+static spiralstruct *spirals = NULL;
+
+static void draw_dots(ModeInfo * mi, int in);
+
+#define TFX(sp,x) ((int)((x/sp->right)*(float)sp->width))
+#define TFY(sp,y) ((int)((y/sp->top)*(float)sp->height))
+
+static void
+draw_dots(ModeInfo * mi, int in)
+{
+
+       float       i, inc;
+       float       x, y;
+
+       spiralstruct *sp = &spirals[MI_SCREEN(mi)];
+
+       inc = TWOPI / (float) sp->dots;
+       for (i = 0.0; i < TWOPI; i += inc) {
+               x = sp->traildots[in].hx + COSF(i + sp->traildots[in].ha) *
+                       sp->traildots[in].hr;
+               y = sp->traildots[in].hy + SINF(i + sp->traildots[in].ha) *
+                       sp->traildots[in].hr;
+               XDrawPoint(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi),
+                          TFX(sp, x), TFY(sp, y));
+       }
+}
+
+void
+init_spiral(ModeInfo * mi)
+{
+       spiralstruct *sp;
+       int         i;
+
+       if (spirals == NULL) {
+               if ((spirals = (spiralstruct *) calloc(MI_NUM_SCREENS(mi),
+                                            sizeof (spiralstruct))) == NULL)
+                       return;
+       }
+       sp = &spirals[MI_SCREEN(mi)];
+
+       sp->width = MI_WIN_WIDTH(mi);
+       sp->height = MI_WIN_HEIGHT(mi);
+
+       XClearWindow(MI_DISPLAY(mi), MI_WINDOW(mi));
+
+       /* Init */
+       sp->nlength = MI_CYCLES(mi);
+
+       if (!sp->traildots)
+               sp->traildots = (Traildots *) malloc(sp->nlength * sizeof (Traildots));
+
+       /* initialize the allocated array */
+       for (i = 0; i < sp->nlength; i++) {
+               sp->traildots[i].hx = 0.0;
+               sp->traildots[i].hy = 0.0;
+               sp->traildots[i].ha = 0.0;
+               sp->traildots[i].hr = 0.0;
+       }
+       sp->redrawing = 0;
+
+       /* keep the window parameters proportional */
+       sp->top = 10000.0;
+       sp->bottom = 0;
+       sp->right = (float) (sp->width) / (float) (sp->height) * (10000.0);
+       sp->left = 0;
+
+       /* assign the initial values */
+       sp->cx = (float) (5000.0 - NRAND(2000)) / 10000.0 * sp->right;
+       sp->cy = (float) (5000.0 - NRAND(2000));
+       sp->radius = (float) (NRAND(200) + 200);
+       sp->angle = 0.0;
+       sp->dx = (float) (10 - NRAND(20)) * SPEED;
+       sp->dy = (float) (10 - NRAND(20)) * SPEED;
+       sp->dr = (float) ((NRAND(10) + 4) * (1 - (LRAND() & 1) * 2));
+       sp->da = (float) NRAND(360) / 7200.0 + 0.01;
+       if (MI_NPIXELS(mi) > 2)
+               sp->colors = (float) NRAND(MI_NPIXELS(mi));
+       sp->erase = 0;
+       sp->inc = 0;
+       sp->traildots[sp->inc].hx = sp->cx;
+       sp->traildots[sp->inc].hy = sp->cy;
+       sp->traildots[sp->inc].ha = sp->angle;
+       sp->traildots[sp->inc].hr = sp->radius;
+       sp->inc++;
+
+       sp->dots = MI_BATCHCOUNT(mi);
+       if (sp->dots < -MINDOTS)
+               sp->dots = NRAND(sp->dots - MINDOTS + 1) + MINDOTS;
+       /* Absolute minimum */
+       if (sp->dots < MINDOTS)
+               sp->dots = MINDOTS;
+}
+
+void
+draw_spiral(ModeInfo * mi)
+{
+       Display    *display = MI_DISPLAY(mi);
+       GC          gc = MI_GC(mi);
+       spiralstruct *sp = &spirals[MI_SCREEN(mi)];
+       int         i, j;
+
+       if (sp->erase == 1) {
+               XSetForeground(display, gc, MI_WIN_BLACK_PIXEL(mi));
+               draw_dots(mi, sp->inc);
+       }
+       sp->cx += sp->dx;
+       sp->traildots[sp->inc].hx = sp->cx;
+
+       if ((sp->cx > 9000.0) || (sp->cx < 1000.0))
+               sp->dx *= -1.0;
+
+       sp->cy += sp->dy;
+       sp->traildots[sp->inc].hy = sp->cy;
+
+       if ((sp->cy > 9000.0) || (sp->cy < 1000.0))
+               sp->dy *= -1.0;
+
+       sp->radius += sp->dr;
+       sp->traildots[sp->inc].hr = sp->radius;
+
+       if ((sp->radius > 2500.0) && (sp->dr > 0.0))
+               sp->dr *= -1.0;
+       else if ((sp->radius < 50.0) && (sp->radius < 0.0))
+               sp->dr *= -1.0;
+
+       /* Randomly give some variations to:  */
+
+       /* spiral direction (if it is within the boundaries) */
+       if ((NRAND(3000) < 1 * JAGGINESS) &&
+           (((sp->cx > 2000.0) && (sp->cx < 8000.0)) &&
+            ((sp->cy > 2000.0) && (sp->cy < 8000.0)))) {
+               sp->dx = (float) (10 - NRAND(20)) * SPEED;
+               sp->dy = (float) (10 - NRAND(20)) * SPEED;
+       }
+       /* The speed of the change in size of the spiral */
+       if (NRAND(3000) < 1 * JAGGINESS) {
+               if (LRAND() & 1)
+                       sp->dr += (float) (NRAND(3) + 1);
+               else
+                       sp->dr -= (float) (NRAND(3) + 1);
+
+               /* don't let it get too wild */
+               if (sp->dr > 18.0)
+                       sp->dr = 18.0;
+               else if (sp->dr < 4.0)
+                       sp->dr = 4.0;
+       }
+       /* The speed of rotation */
+       if (NRAND(3000) < 1 * JAGGINESS)
+               sp->da = (float) NRAND(360) / 7200.0 + 0.01;
+
+       /* Reverse rotation */
+       if (NRAND(3000) < 1 * JAGGINESS)
+               sp->da *= -1.0;
+
+       sp->angle += sp->da;
+       sp->traildots[sp->inc].ha = sp->angle;
+
+       if (sp->angle > TWOPI)
+               sp->angle -= TWOPI;
+       else if (sp->angle < 0.0)
+               sp->angle += TWOPI;
+
+       sp->colors += (float) MI_NPIXELS(mi) / ((float) (2 * sp->nlength));
+       if (sp->colors >= (float) MI_NPIXELS(mi))
+               sp->colors = 0.0;
+
+       if (MI_NPIXELS(mi) > 2)
+               XSetForeground(display, gc, MI_PIXEL(mi, (int) sp->colors));
+       else
+               XSetForeground(display, gc, MI_WIN_WHITE_PIXEL(mi));
+       draw_dots(mi, sp->inc);
+       sp->inc++;
+
+       if (sp->inc > sp->nlength - 1) {
+               sp->inc -= sp->nlength;
+               sp->erase = 1;
+       }
+       if (sp->redrawing) {
+               for (i = 0; i < REDRAWSTEP; i++) {
+                       j = (sp->inc - sp->redrawpos + sp->nlength) % sp->nlength;
+                       draw_dots(mi, j);
+
+                       if (++(sp->redrawpos) >= sp->nlength) {
+                               sp->redrawing = 0;
+                               break;
+                       }
+               }
+       }
+}
+
+void
+release_spiral(ModeInfo * mi)
+{
+       if (spirals != NULL) {
+               int         screen;
+
+               for (screen = 0; screen < MI_NUM_SCREENS(mi); screen++) {
+                       spiralstruct *sp = &spirals[screen];
+
+                       if (sp->traildots)
+                               (void) free((void *) sp->traildots);
+               }
+               (void) free((void *) spirals);
+               spirals = NULL;
+       }
+}
+
+void
+refresh_spiral(ModeInfo * mi)
+{
+       spiralstruct *sp = &spirals[MI_SCREEN(mi)];
+
+       sp->redrawing = 1;
+       sp->redrawpos = 0;
+}
diff --git a/hacks/spiral.man b/hacks/spiral.man
new file mode 100644 (file)
index 0000000..a32db1e
--- /dev/null
@@ -0,0 +1,67 @@
+.TH XScreenSaver 1 "10-May-97" "X Version 11"
+.SH NAME
+spiral - draws moving circular spiral patterns
+.SH SYNOPSIS
+.B spiral
+[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-ncolors \fIinteger\fP] [\-delay \fImicroseconds\fP] [\-count \fIinteger\fP]
+
+.SH DESCRIPTION
+The \fIspiral\fP program draws moving circular spiral patterns
+.SH OPTIONS
+.I spiral
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window.  This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-mono 
+If on a color display, pretend we're on a monochrome display.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use.  Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-ncolors \fIinteger\fP
+How many colors should be used (if possible).  Default 64.
+The colors are chosen randomly.
+.TP 8
+.B \-count \fIinteger\fP
+Default 40.
+.TP 8
+.B \-cycles \fIinteger\fP
+Default 350.
+
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1),
+.BR xlock (1)
+.SH COPYRIGHT
+Copyright \(co 1994 by Darrick Brown.
+
+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. 
+.SH AUTHOR
+Darrick Brown, 1994.
+
+Improved by Peter Schmitzberger <schmitz@coma.sbg.ac.at>, 24-Jul-95.
+
+Ability to run standalone or with \fIxscreensaver\fP added by 
+Jamie Zawinski <jwz@jwz.org>, 10-May-97.
diff --git a/hacks/spotlight.c b/hacks/spotlight.c
new file mode 100644 (file)
index 0000000..53bf34b
--- /dev/null
@@ -0,0 +1,243 @@
+/*
+ * spotlight - an xscreensaver module
+ * Copyright (c) 1999 Rick Schultz <rick@skapunx.net>
+ *
+ * loosely based on the BackSpace module "StefView" by Darcy Brockbank
+ */
+
+/* modified from a module from the xscreensaver distribution */
+
+/*
+ * xscreensaver, Copyright (c) 1992, 1993, 1994, 1996, 1997, 1998
+ * Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software 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.  No representations are made about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or 
+ * implied warranty.
+ */
+
+/* #define DEBUG */
+#include <math.h>
+#include "screenhack.h"
+#include <X11/Xutil.h>
+#include <sys/time.h>
+
+#define MINX 0.0
+#define MINY 0.0
+#define X_PERIOD 15000.0
+#define Y_PERIOD 12000.0
+
+static int sizex, sizey; /* screen size */
+static int delay;        /* in case it's too fast... */
+static GC window_gc;
+#ifdef DEBUG
+static GC white_gc;
+#endif
+static GC buffer_gc;     /* draw in buffer, then flush to screen
+                           to avoid flicker */
+static int radius;       /* radius of spotlight in pixels */
+
+static Pixmap pm;        /* pixmap grabbed from screen */
+static Pixmap clip_pm;   /* pixmap for clipping (spotlight shape) */
+static Pixmap buffer;    /* pixmap for the buffer */
+
+static GC clip_gc;       /* GC for the clip pixmap */
+
+static int x, y, s;      /* x & y coords of buffer (upper left corner) */
+                         /* s is the width of the buffer */
+
+static int oldx, oldy, max_x_speed, max_y_speed;
+                         /* used to keep the new buffer position
+                           over the old spotlight image to make sure 
+                           the old image is completely erased */
+
+/* The path the spotlight follows around the screen is sinusoidal.
+   This function is fed to sin() to get the x & y coords */
+static long
+currentTimeInMs(void)
+{
+  struct timeval curTime;
+#ifdef GETTIMEOFDAY_TWO_ARGS
+  struct timezone tz = {0,0};
+  gettimeofday(&curTime, &tz);
+#else
+  gettimeofday(&curTime);
+#endif
+  return curTime.tv_sec*1000 + curTime.tv_usec/1000.0;
+}
+
+
+static void
+init_hack (Display *dpy, Window window)
+{
+  XGCValues gcv;
+  XWindowAttributes xgwa;
+  long gcflags;
+  Colormap cmap;
+  unsigned long fg, bg;
+
+  XGetWindowAttributes (dpy, window, &xgwa);
+  sizex = xgwa.width;
+  sizey = xgwa.height;
+  cmap = xgwa.colormap;
+  fg = get_pixel_resource ("foreground", "Foreground", dpy, cmap);
+  bg = get_pixel_resource ("background", "Background", dpy, cmap);
+
+  /* read parameters, keep em sane */
+  delay = get_integer_resource ("delay", "Integer");
+  if (delay < 1) delay = 1;
+  radius = get_integer_resource ("radius", "Integer");
+  if (radius < 0) radius = 125;
+
+  /* do the dance */
+  gcv.function = GXcopy;
+  gcv.subwindow_mode = IncludeInferiors;
+  gcflags = GCForeground | GCFunction;
+  gcv.foreground = bg;
+
+#ifdef NOPE
+  if (use_subwindow_mode_p(xgwa.screen, window)) /* see grabscreen.c */
+    gcflags |= GCSubwindowMode;
+#endif
+  window_gc = XCreateGC(dpy, window, gcflags, &gcv);
+
+
+  /* grab screen to window */
+  grab_screen_image(xgwa.screen, window);
+
+  /* save screen to pixmap for copying later */
+  pm = XCreatePixmap(dpy, window, sizex, sizey, xgwa.depth);
+  XCopyArea(dpy, window, pm, window_gc, 0, 0, sizex, sizey, 0, 0);
+
+
+  /* create buffer to reduce flicker */
+  buffer = XCreatePixmap(dpy, window, sizex, sizey, xgwa.depth);
+  buffer_gc = XCreateGC(dpy, buffer, gcflags, &gcv);
+
+  /* blank out screen */
+  XFillRectangle(dpy, window, window_gc, 0, 0, sizex, sizey);
+  XSetWindowBackground (dpy, window, bg);
+
+  /* create clip mask (so it's a circle, not a square) */
+  clip_pm = XCreatePixmap(dpy, window, radius*4, radius*4, 1);
+
+  gcv.foreground = 0L;
+  clip_gc = XCreateGC(dpy, clip_pm, gcflags, &gcv);
+  XFillRectangle(dpy, clip_pm, clip_gc, 0, 0, radius*4, radius*4);
+
+  XSetForeground(dpy, clip_gc, 1L);
+  XFillArc(dpy, clip_pm, clip_gc, radius , radius,
+          radius*2, radius*2, 0, 360*64);
+
+  /* set buffer's clip mask to the one we just made */
+  XSetClipMask(dpy, buffer_gc, clip_pm);
+
+  /* free everything */
+  XFreeGC(dpy, clip_gc);
+  XFreePixmap(dpy, clip_pm);
+
+  /* avoid remants */
+  max_x_speed = max_y_speed = radius;
+
+#ifdef DEBUG
+  /* create GC with white fg */
+  gcv.foreground = fg;
+  white_gc = XCreateGC(dpy, window, gcflags, &gcv);
+#endif
+  
+  /* initialize x and y to avoid initial `jump' across screen */
+  x = ((1 + sin(((float)currentTimeInMs()) / X_PERIOD * 2. * M_PI))/2.0) 
+    * (sizex - s/2) -s/4  + MINX;
+  y = ((1 + sin(((float)currentTimeInMs()) / Y_PERIOD * 2. * M_PI))/2.0) 
+    * (sizey - s/2) -s/4  + MINY;
+
+}
+
+
+/*
+ * perform one iteration
+ */
+static void
+onestep (Display *dpy, Window window)
+{
+    long now;
+
+    /* clear buffer */
+    XFillRectangle(dpy, buffer, buffer_gc, x, y, s, s);
+
+    
+#define nrnd(x) (random() % (x))
+
+    oldx = x;
+    oldy = y;
+
+    s = radius *4 ;   /* s = width of buffer */
+
+    now = currentTimeInMs();
+
+    /* find new x,y */
+    x = ((1 + sin(((float)now) / X_PERIOD * 2. * M_PI))/2.0) 
+      * (sizex - s/2) -s/4  + MINX;
+    y = ((1 + sin(((float)now) / Y_PERIOD * 2. * M_PI))/2.0) 
+      * (sizey - s/2) -s/4  + MINY;
+    
+    /* limit change in x and y to buffer width */
+    if ( x < (oldx - max_x_speed) ) x = oldx - max_x_speed;
+    if ( x > (oldx + max_x_speed) ) x = oldx + max_x_speed;
+    if ( y < (oldy - max_y_speed) ) y = oldy - max_y_speed;
+    if ( y > (oldy + max_y_speed) ) y = oldy + max_y_speed;
+
+    /* copy area of screen image (pm) to buffer
+       Clip to a circle */
+    XSetClipOrigin(dpy, buffer_gc, x,y);
+    XCopyArea(dpy, pm, buffer, buffer_gc, x, y, s, s, x, y);
+    /* copy buffer to screen (window) */
+    XCopyArea(dpy, buffer, window, window_gc, x , y, s, s, x, y);
+
+#ifdef DEBUG
+    /* draw a box around the buffer */
+    XDrawLine(dpy, window, white_gc, x, y, x+s, y);
+    XDrawLine(dpy, window, white_gc, x, y, x, y+s);
+    XDrawLine(dpy, window, white_gc, x+s, y, x+s, y+s);
+    XDrawLine(dpy, window, white_gc, x, y+s, x+s, y+s);
+#endif
+
+}
+
+\f
+char *progclass = "Spotlight";
+
+char *defaults [] = {
+  "*dontClearRoot:             True",
+
+#ifdef __sgi   /* really, HAVE_READ_DISPLAY_EXTENSION */
+  "*visualID:                  Best",
+#endif
+
+  "*delay:                     10000",
+  "*radius:                    125",
+  0
+};
+
+XrmOptionDescRec options [] = {
+  { "-delay",          ".delay",               XrmoptionSepArg, 0 },
+  { "-radius",         ".radius",              XrmoptionSepArg, 0 },
+  { 0, 0, 0, 0 }
+};
+
+void
+screenhack (Display *dpy, Window window)
+{
+  init_hack (dpy, window);
+  while (1) {
+    onestep(dpy, window);
+    XSync(dpy, False);
+    if (delay) usleep (delay);
+    screenhack_handle_events (dpy);
+  }
+}
+  
diff --git a/hacks/spotlight.man b/hacks/spotlight.man
new file mode 100644 (file)
index 0000000..31e9f71
--- /dev/null
@@ -0,0 +1,57 @@
+.TH XScreenSaver 1 "05-Apr-1999" "X Version 11"
+.SH NAME
+spotlight - move spotlight around desktop
+.SH SYNOPSIS
+.B spotlight
+[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-delay \fIusecs\fP] [\-radius \fIpixels\fP]
+.SH DESCRIPTION
+The \fIspotlight\fP program draws random rectangles.
+.SH OPTIONS
+.I spotlight
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window.  This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-mono 
+If on a color display, pretend we're on a monochrome display.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use.  Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-delay \fImicroseconds\fP
+Slow it down.
+.TP 8
+.B \-radius \fIpixels\fP
+Radius of the spotlight in pixels.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 1999 by Rick Schultz.  Permission to use, copy, modify, 
+distribute, and sell this software 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.  No representations are made about the 
+suitability of this software for any purpose.  It is provided "as is" without
+express or implied warranty.
+.SH CREDITS
+Hacked together by Rick Schultz <rick@skapunx.net>, based on StefView for
+BackSpace by Darcy Brockbank and on several other xscreensaver hacks.
+
diff --git a/hacks/squiral.c b/hacks/squiral.c
new file mode 100644 (file)
index 0000000..fb7868f
--- /dev/null
@@ -0,0 +1,223 @@
+/* squiral, by "Jeff Epler" <jepler@inetnebr.com>, 18-mar-1999.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software 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.  No representations are made about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or 
+ * implied warranty.
+ */
+
+#include "screenhack.h"
+#include "colors.h"
+#include "erase.h"
+#include "yarandom.h"
+
+#define R(x)  (abs(random())%x)
+#define PROB(x) (abs(random())<(x*(double)RAND_MAX))
+
+#define NCOLORSMAX 255
+static int width, height, count, cycle;
+static double frac, disorder, handedness;
+static int ncolors=0;
+static GC draw_gc, erase_gc;
+static XColor colors[NCOLORSMAX];
+#define STATES 8
+
+/* 0- 3 left-winding  */
+/* 4- 7 right-winding */
+
+#define CLEAR1(x,y) (!fill[((y)%height)*width+(x)%width])
+#define MOVE1(x,y) (fill[((y)%height)*width+(x)%width]=1, XDrawPoint(dpy, window, draw_gc, (x)%width,(y)%height), cov++)
+
+static int cov;
+static int dirh[4];
+static int dirv[4];
+
+static int *fill;
+
+#define CLEARDXY(x,y,dx,dy) CLEAR1(x+dx, y+dy) && CLEAR1(x+dx+dx, y+dy+dy)
+#define MOVEDXY(x,y,dx,dy)  MOVE1 (x+dx, y+dy), MOVE1 (x+dx+dx, y+dy+dy)
+
+#define CLEAR(d) CLEARDXY(w->h,w->v, dirh[d],dirv[d])
+#define MOVE(d) (XSetForeground(dpy, draw_gc, colors[w->c].pixel), \
+                  MOVEDXY(w->h,w->v, dirh[d],dirv[d]), \
+                 w->h=w->h+dirh[d]*2, \
+                 w->v=w->v+dirv[d]*2, dir=d)
+
+#define RANDOM (void) (w->h = R(width), w->v = R(height), w->c = R(ncolors), \
+                 type=R(2), dir=R(4), (cycle && (w->cc=R(3)+ncolors)))
+
+struct worm {
+    int h;
+    int v;
+    int s;
+    int c;
+    int cc;
+} *worms;
+
+#define SUCC(x) ((x+1)%4)
+#define PRED(x) ((x+3)%4)
+#define CCW     PRED(dir)
+#define CW      SUCC(dir)
+#define REV     ((dir+2)%4)
+#define STR     (dir)
+#define TRY(x)  if (CLEAR(x)) { MOVE(x); break; }
+
+static void
+do_worm(Display *dpy, Window window, struct worm *w)
+{
+    int type = w->s / 4;
+    int dir = w->s % 4;
+
+    w->c = (w->c+w->cc) % ncolors;
+
+    if (PROB(disorder)) type=PROB(handedness);
+    switch(type) {
+    case 0: /* CCW */
+       TRY(CCW)
+       TRY(STR)
+       TRY(CW)
+       RANDOM;
+       break;
+    case 1: /* CW */
+       TRY(CW)
+       TRY(STR)
+       TRY(CCW)
+       RANDOM;
+       break;
+    }
+    w->s = type*4+dir;
+    w->h = w->h % width;
+    w->v = w->v % height;
+}
+
+static void
+init_squiral(Display *dpy, Window window)
+{
+    XGCValues gcv;
+    Colormap cmap;
+    XWindowAttributes xgwa;
+    Bool writeable = False;
+    int i;
+
+    XClearWindow(dpy, window);
+    XGetWindowAttributes(dpy, window, &xgwa);
+    width  = xgwa.width;
+    height = xgwa.height;
+
+    cmap = xgwa.colormap;
+    gcv.foreground = get_pixel_resource("foreground",
+       "Foreground", dpy, cmap);
+    draw_gc = XCreateGC(dpy, window, GCForeground, &gcv);
+    gcv.foreground = get_pixel_resource ("background", "Background",dpy, cmap);
+    erase_gc = XCreateGC (dpy, window, GCForeground, &gcv);
+    cmap = xgwa.colormap;
+    if( ncolors ) {
+        free_colors(dpy, cmap, colors, ncolors);
+        ncolors = 0;
+    }
+    if( mono_p ) {
+      ncolors=1;
+      colors[0].pixel=get_pixel_resource("foreground","Foreground", dpy, cmap);
+    } else {
+      ncolors = get_integer_resource("ncolors", "Integer");
+      if (ncolors < 0 || ncolors > NCOLORSMAX)
+        ncolors = NCOLORSMAX;
+      make_uniform_colormap(dpy, xgwa.visual, cmap, colors, &ncolors, True,
+         &writeable, False);
+      if (ncolors <= 0) {
+        ncolors = 1;
+        colors[0].pixel=get_pixel_resource("foreground","Foreground",dpy, cmap);
+      }
+    }
+    count= get_integer_resource("count", "Integer");
+    frac = get_integer_resource("fill",  "Integer")*0.01;
+    cycle= get_boolean_resource("cycle", "Cycle");
+    disorder=get_float_resource("disorder", "Float");
+    handedness=get_float_resource("handedness", "Float");
+
+    if(frac<0.01) frac=0.01;
+    if(frac>0.99) frac=0.99;
+    if(count==0) count=width/32;
+    if(count<1) count=1;
+    if(count>1000) count=1000;
+
+    if(worms) free(worms);
+    if(fill)  free(fill);
+
+    worms=calloc(count, sizeof(struct worm));
+    fill=calloc(width*height, sizeof(int));
+
+    dirh[0]=0; dirh[1]=1; dirh[2]=0; dirh[3]=width-1;
+    dirv[0]=height-1; dirv[1]=0; dirv[2]=1; dirv[3]=0;
+    for(i=0;i<count;i++) {
+       worms[i].h=R(width);
+       worms[i].v=R(height);
+       worms[i].s=R(4)+4*PROB(handedness);
+       worms[i].c=R(ncolors);
+       if(cycle) { worms[i].cc=R(3)+ncolors; }
+       else worms[i].cc=0;
+    }
+}
+
+void
+screenhack(Display *dpy, Window window)
+{
+   int inclear, i;
+   int delay= get_integer_resource("delay", "Integer");
+   init_squiral(dpy, window);
+   cov=0; inclear=height;
+   while(1) {
+       if(inclear<height) {
+           XDrawLine(dpy, window, erase_gc, 0, inclear, width-1, inclear);
+           memset(&fill[inclear*width], 0, sizeof(int)*width);
+           XDrawLine(dpy, window, erase_gc, 0, height-inclear-1, width-1,
+                   height-inclear-1);
+           memset(&fill[(height-inclear-1)*width], 0, sizeof(int)*width);
+           inclear++;
+           XDrawLine(dpy, window, erase_gc, 0, inclear, width-1, inclear);
+           memset(&fill[inclear*width], 0, sizeof(int)*width);
+           XDrawLine(dpy, window, erase_gc, 0, height-inclear-1, width-1,
+                   height-inclear-1);
+           memset(&fill[(height-inclear-1)*width], 0, sizeof(int)*width);
+           inclear++;
+           if(inclear>height/2) inclear=height;
+       }
+       else if(cov>(frac*width*height)) {
+           inclear=0;
+           cov=0;
+       }
+       for(i=0;i<count;i++) do_worm(dpy, window, &worms[i]);
+       screenhack_handle_events(dpy);
+       usleep(delay);
+    }  
+}
+
+char *progclass="Squiral";
+
+char *defaults[] = {
+  ".background: black",
+  ".foreground: white",
+  "*fill:       75",
+  "*count:      0",
+  "*ncolors:    100",
+  "*delay:      1000",
+  "*disorder:   0.005",
+  "*cycle:      False",
+  "*handedness: .5",
+  0
+};
+
+XrmOptionDescRec options[] = {
+    {"-fill", ".fill", XrmoptionSepArg, 0},
+    {"-count", ".count", XrmoptionSepArg, 0},
+    {"-delay", ".delay", XrmoptionSepArg, 0},
+    {"-disorder", ".disorder", XrmoptionSepArg, 0},
+    {"-handedness", ".handedness", XrmoptionSepArg, 0},
+    {"-ncolors", ".ncolors", XrmoptionSepArg, 0},
+    {"-cycle", ".cycle", XrmoptionNoArg, "True"},
+    {"-no-cycle", ".cycle", XrmoptionNoArg, "False"},
+    { 0, 0, 0, 0 }
+};
diff --git a/hacks/squiral.man b/hacks/squiral.man
new file mode 100644 (file)
index 0000000..9e3ce5f
--- /dev/null
@@ -0,0 +1,76 @@
+.TH XScreenSaver 1 "18-mar-1999" "X Version 11"
+.SH NAME
+squiral - square spirals screensaver
+.SH SYNOPSIS
+.B squiral
+[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP]
+[\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install]
+[\-noinstall] [\-visual \fIvisual\fP] [\-fill \fIpercent\fP] [-count
+\fInumber\fP] [-delay \fIusec\fP] [-disorder \fIfraction\fP] [-handedness
+\fIfraction\fP] [-cycle]
+.SH DESCRIPTION
+The \fIsquiral\fP program displays interacting, spiral-producing automata
+
+.SH OPTIONS
+.I squiral
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window.  This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-mono 
+If on a color display, pretend we're on a monochrome display.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use.  Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-fill \fIpercent\fP
+Specify the percent (0-100) of the screen which must be filled before
+the screen is cleared.  60-80 percent are good values.
+.TP 8
+.B \-count \fInumber\fP
+The number of squiralies.  By default, the screen width divided by 32.
+.TP 8
+.B \-delay \fIusec\fP
+The wait between steps.  The default is 1000.
+.TP 8
+.B \-disorder \fIfraction\fP
+The fraction of the time a squiraly will choose a new direction.
+The default is 0.005.
+.TP 8
+.B \-handedness \fIfraction\fP
+The fraction of the time a squiraly will choose to enter lefthanded
+mode.  0.0 means exclusively right-handed behavior, 0.5 (the default) is
+a balance between the two, and 1.0 is exclusively left-handed behaviour.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH BUGS
+None known
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 1999, by Jeff Epler.  Permission to use, copy, modify, 
+distribute, and sell this software and its documentation for any purpose is 
+hereby granted without fee, provided fnord that the above copyright notice 
+appear in all copies and that both that copyright notice and this permission 
+notice appear in supporting documentation.  No representations are made about
+the  suitability of fnord this software for any purpose.  It is provided "as
+is" without express or fnord implied warranty.
+.SH AUTHOR
+Jeff Epler <jepler@inetnebr.com>, 18-mar-1999
+
diff --git a/hacks/starfish.c b/hacks/starfish.c
new file mode 100644 (file)
index 0000000..070c034
--- /dev/null
@@ -0,0 +1,537 @@
+/* xscreensaver, Copyright (c) 1997, 1998 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software 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.  No representations are made about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or 
+ * implied warranty.
+ */
+
+#include <math.h>
+#include <sys/time.h> /* for gettimeofday() */
+#include "screenhack.h"
+#include "spline.h"
+
+
+static Colormap cmap;
+static Bool cycle_p;
+static XColor *colors;
+static int ncolors;
+static int fg_index;
+static GC gc;
+
+#define SCALE        1000      /* fixed-point math, for sub-pixel motion */
+
+
+#define RAND(n) ((long) ((random() & 0x7fffffff) % ((long) (n))))
+#define RANDSIGN() ((random() & 1) ? 1 : -1)
+
+enum starfish_mode {
+  pulse,
+  zoom
+};
+  
+
+struct starfish {
+  enum starfish_mode mode;
+  Bool blob_p;
+  int skip;
+  long x, y;           /* position of midpoint */
+  double th;           /* angle of rotation */
+  double rotv;         /* rotational velocity */
+  double rota;         /* rotational acceleration */
+  long elasticity;     /* how fast it deforms: radial velocity */
+  double rot_max;
+  long min_r, max_r;   /* radius range */
+  int npoints;         /* control points */
+  long *r;             /* radii */
+  spline *spline;
+  XPoint *prev;
+  int n_prev;
+};
+
+static struct starfish *
+make_starfish (int maxx, int maxy, int size)
+{
+  struct starfish *s = (struct starfish *) calloc(1, sizeof(*s));
+  int i;
+  int mid;
+
+  s->blob_p = get_boolean_resource ("blob", "Blob");
+  s->elasticity = SCALE * get_float_resource ("thickness", "Thickness");
+
+  if (s->elasticity == 0)
+    /* bell curve from 0-15, avg 7.5 */
+    s->elasticity = RAND(5*SCALE) + RAND(5*SCALE) + RAND(5*SCALE);
+
+  s->rotv = get_float_resource ("rotation", "Rotation");
+  if (s->rotv == -1)
+    /* bell curve from 0-12 degrees, avg 6 */
+    s->rotv = frand(4) + frand(4) + frand(4);
+
+  s->rotv /= 360;  /* convert degrees to ratio */
+
+  if (s->blob_p)
+    {
+      s->elasticity *= 3;
+      s->rotv *= 3;
+    }
+
+  s->rot_max = s->rotv * 2;
+  s->rota = 0.0004 + frand(0.0002);
+
+
+  if (! (random() % 20))
+    size *= frand(0.35) + frand(0.35) + 0.3;
+
+  {
+    static char skips[] = { 2, 2, 2, 2,
+                           3, 3, 3,
+                           6, 6,
+                           12 };
+    s->skip = skips[random() % sizeof(skips)];
+  }
+
+  if (! (random() % (s->skip == 2 ? 3 : 12)))
+    s->mode = zoom;
+  else
+    s->mode = pulse;
+
+  maxx *= SCALE;
+  maxy *= SCALE;
+  size *= SCALE;
+
+  s->max_r = size;
+  s->min_r = 0;
+
+  if (s->min_r < (5*SCALE)) s->min_r = (5*SCALE);
+  mid = ((s->min_r + s->max_r) / 2);
+
+  s->x = maxx/2;
+  s->y = maxy/2;
+
+  s->th = frand(M_PI+M_PI) * RANDSIGN();
+
+  {
+    static char sizes[] = { 3, 3, 3, 3, 3,
+                           4, 4, 4, 4,
+                           5, 5, 5, 5, 5, 5,
+                           8, 8, 8,
+                           10,
+                           35 };
+    int nsizes = sizeof(sizes);
+    if (s->skip > 3)
+      nsizes -= 4;
+    s->npoints = s->skip * sizes[random() % nsizes];
+  }
+
+  s->spline = make_spline (s->npoints);
+  s->r = (long *) malloc (sizeof(*s->r) * s->npoints);
+
+  for (i = 0; i < s->npoints; i++)
+    s->r[i] = ((i % s->skip) == 0) ? 0 : size;
+
+  return s;
+}
+
+
+static void
+free_starfish (struct starfish *s)
+{
+  if (s->r) free (s->r);
+  if (s->prev) free (s->prev);
+  if (s->spline)
+    {
+      if (s->spline->control_x) free (s->spline->control_x);
+      if (s->spline->control_y) free (s->spline->control_y);
+      if (s->spline->points) free (s->spline->points);
+      free (s->spline);
+    }
+  free (s);
+}
+
+
+static void 
+throb_starfish (struct starfish *s)
+{
+  int i;
+  double frac = ((M_PI+M_PI) / s->npoints);
+
+  for (i = 0; i < s->npoints; i++)
+    {
+      long r = s->r[i];
+      long ra = (r > 0 ? r : -r);
+      double th = (s->th > 0 ? s->th : -s->th);
+      long x, y;
+      long elasticity = s->elasticity;
+
+      /* place control points evenly around perimiter, shifted by theta */
+      x = s->x + ra * cos (i * frac + th);
+      y = s->y + ra * sin (i * frac + th);
+
+      s->spline->control_x[i] = x / SCALE;
+      s->spline->control_y[i] = y / SCALE;
+
+      if (s->mode == zoom && ((i % s->skip) == 0))
+       continue;
+
+      /* Slow down near the end points: move fastest in the middle. */
+      {
+       double ratio = (double)ra / (double)(s->max_r - s->min_r);
+       if (ratio > 0.5) ratio = 1-ratio;       /* flip */
+       ratio *= 2;                             /* normalize */
+       ratio = (ratio * 0.9) + 0.1;            /* fudge */
+       elasticity *= ratio;
+      }
+
+
+      /* Increase/decrease radius by elasticity */
+      ra += (r >= 0 ? elasticity : -elasticity);
+      if ((i % s->skip) == 0)
+       ra += (elasticity / 2);
+
+      r = ra * (r >= 0 ? 1 : -1);
+
+      /* If we've reached the end (too long or too short) reverse direction. */
+      if ((ra > s->max_r && r >= 0) ||
+         (ra < s->min_r && r < 0))
+       r = -r;
+
+      s->r[i] = r;
+    }
+}
+
+
+static void
+spin_starfish (struct starfish *s)
+{
+  double th = s->th;
+  if (th < 0)
+    th = -(th + s->rotv);
+  else
+    th += s->rotv;
+
+  if (th > (M_PI+M_PI))
+    th -= (M_PI+M_PI);
+  else if (th < 0)
+    th += (M_PI+M_PI);
+
+  s->th = (s->th > 0 ? th : -th);
+
+  s->rotv += s->rota;
+
+  if (s->rotv > s->rot_max || 
+      s->rotv < -s->rot_max)
+    {
+      s->rota = -s->rota;
+    }
+  /* If it stops, start it going in the other direction. */
+  else if (s->rotv < 0)
+    {
+      if (random() & 1)
+       {
+         /* keep going in the same direction */
+         s->rotv = 0;
+         if (s->rota < 0)
+           s->rota = -s->rota;
+       }
+      else
+       {
+         /* reverse gears */
+         s->rotv = -s->rotv;
+         s->rota = -s->rota;
+         s->th = -s->th;
+       }
+    }
+
+
+  /* Alter direction of rotational acceleration randomly. */
+  if (! (random() % 120))
+    s->rota = -s->rota;
+
+  /* Change acceleration very occasionally. */
+  if (! (random() % 200))
+    {
+      if (random() & 1)
+       s->rota *= 1.2;
+      else
+       s->rota *= 0.8;
+    }
+}
+
+
+static void
+draw_starfish (Display *dpy, Drawable drawable, GC gc, struct starfish *s,
+          Bool fill_p)
+{
+  compute_closed_spline (s->spline);
+  if (s->prev)
+    {
+      XPoint *points = (XPoint *)
+       malloc (sizeof(XPoint) * (s->n_prev + s->spline->n_points + 2));
+      int i = s->spline->n_points;
+      int j = s->n_prev;
+      memcpy (points, s->spline->points, (i * sizeof(*points)));
+      memcpy (points+i, s->prev, (j * sizeof(*points)));
+
+      if (s->blob_p)
+       XClearWindow (dpy, drawable);
+      XFillPolygon (dpy, drawable, gc, points, i+j, Complex, CoordModeOrigin);
+      free (points);
+
+      free (s->prev);
+      s->prev = 0;
+    }
+
+  s->prev = (XPoint *) malloc (s->spline->n_points * sizeof(XPoint));
+  memcpy (s->prev, s->spline->points, s->spline->n_points * sizeof(XPoint));
+  s->n_prev = s->spline->n_points;
+
+#ifdef DEBUG
+  if (s->blob_p)
+    {
+      int i;
+      for (i = 0; i < s->npoints; i++)
+       XDrawLine (dpy, drawable, gc, s->x/SCALE, s->y/SCALE,
+                  s->spline->control_x[i], s->spline->control_y[i]);
+    }
+#endif
+}
+
+
+static struct starfish *
+make_window_starfish (Display *dpy, Window window)
+{
+  XWindowAttributes xgwa;
+  int size;
+  Bool blob_p = get_boolean_resource ("blob", "Blob");
+  XGetWindowAttributes (dpy, window, &xgwa);
+  size = (xgwa.width < xgwa.height ? xgwa.width : xgwa.height);
+  if (blob_p) size /= 2;
+  else size *= 1.3;
+  return make_starfish (xgwa.width, xgwa.height, size);
+}
+
+
+static struct starfish *
+init_starfish (Display *dpy, Window window)
+{
+  static Bool first_time = True;
+  XGCValues gcv;
+  XWindowAttributes xgwa;
+  Bool blob_p = get_boolean_resource ("blob", "Blob");
+  XGetWindowAttributes (dpy, window, &xgwa);
+
+  cmap = xgwa.colormap;
+  cycle_p = get_boolean_resource ("cycle", "Cycle");
+
+  if (!first_time)
+    {
+      if (colors && ncolors)
+       free_colors (dpy, cmap, colors, ncolors);
+      if (colors)
+       free (colors);
+      colors = 0;
+    }
+
+  ncolors = get_integer_resource ("colors", "Colors");
+  if (ncolors < 2) ncolors = 2;
+  if (ncolors <= 2) mono_p = True;
+
+  if (mono_p)
+    colors = 0;
+  else
+    colors = (XColor *) malloc(sizeof(*colors) * (ncolors+1));
+
+  if (mono_p || blob_p)
+    cycle_p = False;
+
+  if (mono_p)
+    ;
+  else if (random() % 3)
+    make_smooth_colormap (dpy, xgwa.visual, cmap, colors, &ncolors,
+                         True, &cycle_p, True);
+  else
+    make_uniform_colormap (dpy, xgwa.visual, cmap, colors, &ncolors,
+                          True, &cycle_p, True);
+
+  if (ncolors < 2) ncolors = 2;
+  if (ncolors <= 2) mono_p = True;
+
+  if (mono_p) cycle_p = False;
+
+  fg_index = 0;
+
+  if (!mono_p && !blob_p)
+    {
+      gcv.foreground = colors[fg_index].pixel;
+      XSetWindowBackground (dpy, window, gcv.foreground);
+    }
+
+  if (first_time)
+    {
+      XClearWindow (dpy, window);
+      first_time = False;
+    }
+
+  gcv.fill_rule = EvenOddRule;
+  gc = XCreateGC (dpy, window, GCForeground | GCFillRule, &gcv);
+
+  return make_window_starfish (dpy, window);
+}
+
+
+
+static void
+run_starfish (Display *dpy, Window window, struct starfish *s)
+{
+  throb_starfish (s);
+  spin_starfish (s);
+  draw_starfish (dpy, window, gc, s, False);
+
+  if (mono_p)
+    {
+      static Bool init = False;
+      static unsigned long black, white;
+      if (!init)
+       {
+         black = get_pixel_resource ("background", "Background", dpy, cmap);
+         white = get_pixel_resource ("foreground", "Foreground", dpy, cmap);
+         init = True;
+         fg_index = white;
+         XSetForeground (dpy, gc, fg_index);
+       }
+      else if (!s->blob_p)
+       {
+         fg_index = (fg_index == black ? white : black);
+         XSetForeground (dpy, gc, fg_index);
+       }
+    }
+  else
+    {
+      fg_index = (fg_index + 1) % ncolors;
+      XSetForeground (dpy, gc, colors [fg_index].pixel);
+    }
+}
+
+
+
+\f
+char *progclass = "Starfish";
+
+char *defaults [] = {
+  ".background:                black",
+  ".foreground:                white",
+  "*delay:             10000",
+  "*cycleDelay:                100000",
+  "*thickness:         0",             /* pixels, 0 = random */
+  "*rotation:          -1",            /* degrees, -1 = "random" */
+  "*colors:            200",
+  "*cycle:             true",
+  "*duration:          30",
+  "*delay2:            5",
+  "*blob:              false",
+  0
+};
+
+XrmOptionDescRec options [] = {
+  { "-delay",          ".delay",       XrmoptionSepArg, 0 },
+  { "-delay2",         ".delay2",      XrmoptionSepArg, 0 },
+  { "-cycle-delay",    ".cycleDelay",  XrmoptionSepArg, 0 },
+  { "-thickness",      ".thickness",   XrmoptionSepArg, 0 },
+  { "-rotation",       ".rotation",    XrmoptionSepArg, 0 },
+  { "-colors",         ".colors",      XrmoptionSepArg, 0 },
+  { "-cycle",          ".cycle",       XrmoptionNoArg, "True" },
+  { "-no-cycle",       ".cycle",       XrmoptionNoArg, "False" },
+  { "-duration",       ".duration",    XrmoptionSepArg, 0 },
+  { "-blob",           ".blob",        XrmoptionNoArg, "True" },
+  { "-no-blob",                ".blob",        XrmoptionNoArg, "False" },
+  { 0, 0, 0, 0 }
+};
+
+void
+screenhack (Display *dpy, Window window)
+{
+  struct starfish *s = init_starfish (dpy, window);
+  int delay = get_integer_resource ("delay", "Delay");
+  int delay2 = get_integer_resource ("delay2", "Delay") * 1000000;
+  int cycle_delay = get_integer_resource ("cycleDelay", "Delay");
+  int duration = get_seconds_resource ("duration", "Seconds");
+  Bool blob_p = get_boolean_resource ("blob", "Blob");
+  time_t start = time ((time_t) 0);
+  time_t now;
+  int direction = (random() % 1) ? 1 : -1;
+
+  if (blob_p)
+    delay *= 3;
+
+  while (1)
+    {
+      run_starfish (dpy, window, s);
+      XSync (dpy, False);
+
+      screenhack_handle_events (dpy);
+      if (cycle_p && cycle_delay)
+       {
+         if (cycle_delay <= delay)
+           {
+             int i = 0;
+             while (i < delay)
+               {
+                 rotate_colors (dpy, cmap, colors, ncolors, direction);
+                 usleep(cycle_delay);
+                 i += cycle_delay;
+               }
+           }
+         else
+           {
+             static long tick = 0;
+             if (tick >= cycle_delay)
+               {
+                 rotate_colors (dpy, cmap, colors, ncolors, direction);
+                 tick = 0;
+               }
+             if (delay)
+               usleep(delay);
+             tick += delay;
+           }
+
+         if (! (random() % 1000))
+           direction = -direction;
+       }
+      else if (delay)
+       usleep (delay);
+
+      if (duration > 0)
+       {
+         now = time ((time_t) 0);
+         if (start + duration < now)
+           {
+             start = now;
+
+             free_starfish (s);
+
+             if (delay2 && !blob_p && cycle_p)
+               {
+                 int i = 0;
+                 while (i < delay2)
+                   {
+                     rotate_colors (dpy, cmap, colors, ncolors, direction);
+                      screenhack_handle_events (dpy);
+                     usleep(cycle_delay);
+                     i += cycle_delay;
+                   }
+               }
+
+             /* Every now and then, pick new colors; otherwise, just build
+                a new starfish with the current colors. */
+             if (! (random () % 10))
+               s = init_starfish (dpy, window);
+             else
+               s = make_window_starfish(dpy, window);
+           }
+       }
+    }
+}
diff --git a/hacks/starfish.man b/hacks/starfish.man
new file mode 100644 (file)
index 0000000..63c70d4
--- /dev/null
@@ -0,0 +1,89 @@
+.TH XScreenSaver 1 "14-Jun-97" "X Version 11"
+.SH NAME
+starfish - radially-symmetric throbbing colormap-hacking graphics demo
+.SH SYNOPSIS
+.B starfish
+[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-delay \fIusecs\fP] [\-delay2 \fIsecs\fP] [\-cycle\-delay2 \fIusecs\fP] [\-thickness \fIpixels\fP] [\-rotation \fIdegrees\fP] [\-duration \fIseconds\fP] [\-colors \fIint\fP] [\-cycle] [\-no\-cycle] [\-blob] [\-no\-blob]
+.SH DESCRIPTION
+The \fIstarfish\fP program draws radially symmetric objects, which expand,
+contract, rotate, and turn inside out.  It uses these shapes to lay down a
+field of smooth colors, and then rotates the colormap.
+.SH OPTIONS
+.I starfish
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window.  This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-mono 
+If on a color display, pretend we're on a monochrome display.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use.  Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-delay \fImicroseconds\fP
+How much of a delay should be introduced between steps of the animation.
+Default 10000, or about 1/100th second.
+.TP 8
+.B \-cycle\-delay \fImicroseconds\fP
+How long to wait between shifing the colormap by one step.
+Default 100000, or about 1/10th second.
+.TP 8
+.B \-thickness \fIpixels\fP
+How wide each color band should be.  Default 0, meaning random (the chosen
+value will be between 0 and 15.)
+.TP 8
+.B \-rotation \fIdegrees\fP
+How quickly the objects should rotate at each step.  Default 0, meaning 
+random (the chosen value will be between 0 and 12 degrees.)
+.TP 8
+.B \-colors \fIint\fP
+How many colors to use.  Default 200.  The more colors, the smoother the
+transitions will be, and the nicer the resultant images.
+.TP 8
+.B \-cycle
+.TP 8
+.B \-no\-cycle
+Whether to do colormap cycling.  Default true.
+.TP 8
+.B \-duration \fIseconds\fP
+How long to run before choosing a new shape.  Default 30 seconds.
+.TP 8
+.B \-delay2 \fIseconds\fP
+When \fIduration\fP expires, how long to wait before starting a new run.
+Default 5 seconds.
+.TP 8
+.B \-blob
+.TP 8
+.B \-no\-blob
+If \fIblob\fP option is specified, then the raw shapes will be shown, 
+instead of a field of colors generated from them.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 1997 by Jamie Zawinski.  Permission to use, copy, modify, 
+distribute, and sell this software 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.  No representations are made about the 
+suitability of this software for any purpose.  It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Jamie Zawinski <jwz@jwz.org>, 14-Jun-97.
diff --git a/hacks/strange.c b/hacks/strange.c
new file mode 100644 (file)
index 0000000..a1bda34
--- /dev/null
@@ -0,0 +1,420 @@
+/* -*- Mode: C; tab-width: 4 -*-
+ * strange --- Strange attractors are not so hard to find...
+ */
+#if !defined( lint ) && !defined( SABER )
+static const char sccsid[] = "@(#)strange.c       4.02 97/04/01 xlockmore";
+#endif
+
+/* Copyright (c) 1997 by Massimino Pascal (Pascal.Massimon@ens.fr)
+ *
+ * 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.
+ *
+ * This file is provided AS IS with no warranties of any kind.  The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof.  In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * Revision History:
+ * 30-Jul-98: sineswiper@resonatorsoft.com: added curve factor (discovered
+ *         while experimenting with the Gauss_Rand function).
+ * 10-May-97: jwz@jwz.org: turned into a standalone program.
+ *                       Made it render into an offscreen bitmap and then copy
+ *                       that onto the screen, to reduce flicker.
+ */
+
+#ifdef STANDALONE
+# define PROGCLASS                                     "Strange"
+# define HACK_INIT                                     init_strange
+# define HACK_DRAW                                     draw_strange
+# define strange_opts                          xlockmore_opts
+# define DEFAULTS      "*delay:                2000  \n"                       \
+                                       "*ncolors:              100   \n"
+# define SMOOTH_COLORS
+# include "xlockmore.h"                                /* from the xscreensaver distribution */
+#else  /* !STANDALONE */
+# include "xlock.h"                                    /* from the xlockmore distribution */
+#endif /* !STANDALONE */
+
+/*****************************************************/
+/*****************************************************/
+
+typedef float DBL;
+typedef int PRM;
+
+#define UNIT (1<<12)
+#define UNIT2 (1<<14)
+/* #define UNIT2 (3140*UNIT/1000) */
+
+#define SKIP_FIRST      100
+#define MAX_POINTS      5500
+#define DBL_To_PRM(x)  (PRM)( (DBL)(UNIT)*(x) )
+
+
+#define DO_FOLD(a) (a)<0 ? -Fold[ (-(a))&(UNIT2-1) ] : Fold[ (a)&(UNIT2-1) ]
+
+/* 
+   #define DO_FOLD(a) (a)<-UNIT2 ? -Fold[(-(a))%UNIT2] : (a)<0 ? -Fold[ -(a) ] 
+
+   :  \ (a)>UNIT2 ? Fold[ (a)%UNIT2 ] : Fold[ (a) ] */
+/* #define DO_FOLD(a) DBL_To_PRM( sin( (DBL)(a)/UNIT ) ) */
+/* 
+   #define DO_FOLD(a) (a)<0 ? DBL_To_PRM( exp( 16.0*(a)/UNIT2 ) )-1.0 : \
+   DBL_To_PRM( 1.0-exp( -16.0*(a)/UNIT2 ) ) */
+
+/******************************************************************/
+
+#define MAX_PRM 3*5
+
+typedef struct {
+       DBL         Prm1[MAX_PRM], Prm2[MAX_PRM];
+       void        (*Iterate) (PRM, PRM, PRM *, PRM *);
+       XPoint     *Buffer1, *Buffer2;
+       int         Cur_Pt, Max_Pt;
+       int         Col, Count, Speed;
+       int         Width, Height;
+    Pixmap      dbuf;  /* jwz */
+    GC          dbuf_gc;
+} ATTRACTOR;
+
+static ATTRACTOR *Root;
+static PRM  xmin, xmax, ymin, ymax;
+static PRM  Prm[MAX_PRM];
+static PRM *Fold = NULL;
+
+static int curve;
+
+static XrmOptionDescRec opts[] =
+{
+       {"-curve", ".strange.curve", XrmoptionSepArg, (caddr_t) "10"},
+};
+static OptionStruct desc[] =
+{
+       {"-curve", "set the curve factor of the attractors"},
+};
+
+ModeSpecOpt strange_opts = { 1, opts, 0, NULL, desc };
+
+/******************************************************************/
+/******************************************************************/
+
+static DBL  Amp_Prm[MAX_PRM] =
+{
+       1.0, 3.5, 3.5, 2.5, 4.7,
+       1.0, 3.5, 3.6, 2.5, 4.7,
+       1.0, 1.5, 2.2, 2.1, 3.5
+};
+static DBL  Mid_Prm[MAX_PRM] =
+{
+       0.0, 1.5, 0.0, .5, 1.5,
+       0.0, 1.5, 0.0, .5, 1.5,
+       0.0, 1.5, -1.0, -.5, 2.5,
+};
+
+static      DBL
+Gauss_Rand(DBL c, DBL A, DBL S)
+{
+       DBL         y,z;
+
+       y = (DBL) LRAND() / MAXRAND;
+       z = curve / 10;
+       y = A * (z - exp(-y * y * S)) / (z - exp(-S));
+       if (NRAND(2))
+               return (c + y);
+       else
+               return (c - y);
+}
+
+static void
+Random_Prm(DBL * Prm)
+{
+       int         i;
+
+       for (i = 0; i < MAX_PRM; ++i)
+               Prm[i] = Gauss_Rand(Mid_Prm[i], Amp_Prm[i], 4.0);
+}
+
+/***************************************************************/
+
+   /* 2 examples of non-linear map */
+
+static void
+Iterate_X2(PRM x, PRM y, PRM * xo, PRM * yo)
+{
+       PRM         xx, yy, xy, x2y, y2x, Tmp;
+
+       xx = (x * x) / UNIT;
+       x2y = (xx * y) / UNIT;
+       yy = (y * y) / UNIT;
+       y2x = (yy * x) / UNIT;
+       xy = (x * y) / UNIT;
+
+       Tmp = Prm[1] * xx + Prm[2] * xy + Prm[3] * yy + Prm[4] * x2y;
+       Tmp = Prm[0] - y + (Tmp / UNIT);
+       *xo = DO_FOLD(Tmp);
+       Tmp = Prm[6] * xx + Prm[7] * xy + Prm[8] * yy + Prm[9] * y2x;
+       Tmp = Prm[5] + x + (Tmp / UNIT);
+       *yo = DO_FOLD(Tmp);
+}
+
+static void
+Iterate_X3(PRM x, PRM y, PRM * xo, PRM * yo)
+{
+       PRM         xx, yy, xy, x2y, y2x, Tmp_x, Tmp_y, Tmp_z;
+
+       xx = (x * x) / UNIT;
+       x2y = (xx * y) / UNIT;
+       yy = (y * y) / UNIT;
+       y2x = (yy * x) / UNIT;
+       xy = (x * y) / UNIT;
+
+       Tmp_x = Prm[1] * xx + Prm[2] * xy + Prm[3] * yy + Prm[4] * x2y;
+       Tmp_x = Prm[0] - y + (Tmp_x / UNIT);
+       Tmp_x = DO_FOLD(Tmp_x);
+
+       Tmp_y = Prm[6] * xx + Prm[7] * xy + Prm[8] * yy + Prm[9] * y2x;
+       Tmp_y = Prm[5] + x + (Tmp_y / UNIT);
+
+       Tmp_y = DO_FOLD(Tmp_y);
+
+       Tmp_z = Prm[11] * xx + Prm[12] * xy + Prm[13] * yy + Prm[14] * y2x;
+       Tmp_z = Prm[10] + x + (Tmp_z / UNIT);
+       Tmp_z = UNIT + Tmp_z * Tmp_z / UNIT;
+
+       *xo = (Tmp_x * UNIT) / Tmp_z;
+       *yo = (Tmp_y * UNIT) / Tmp_z;
+}
+
+static void (*Funcs[2]) (PRM, PRM, PRM *, PRM *) = {
+       Iterate_X2, Iterate_X3
+};
+
+/***************************************************************/
+
+void
+draw_strange(ModeInfo * mi)
+{
+       int         i, j, n, Max_Colors, Cur_Pt;
+       PRM         x, y, xo, yo;
+       DBL         u;
+       ATTRACTOR  *A;
+       XPoint     *Buf;
+       Display    *display;
+       GC          gc;
+       Window      window;
+       DBL         Lx, Ly;
+       void        (*Iterate) (PRM, PRM, PRM *, PRM *);
+
+       display = MI_DISPLAY(mi);
+       window = MI_WINDOW(mi);
+       gc = MI_GC(mi);
+       Max_Colors = MI_NPIXELS(mi);
+
+       A = &Root[MI_SCREEN(mi)];
+
+       Cur_Pt = A->Cur_Pt;
+       Iterate = A->Iterate;
+
+       u = (DBL) (A->Count) / 1000.0;
+       for (j = MAX_PRM - 1; j >= 0; --j)
+               Prm[j] = DBL_To_PRM((1.0 - u) * A->Prm1[j] + u * A->Prm2[j]);
+
+       x = y = DBL_To_PRM(.0);
+       for (n = SKIP_FIRST; n; --n) {
+               (*Iterate) (x, y, &xo, &yo);
+               x = xo + NRAND(8) - 4;
+               y = yo + NRAND(8) - 4;
+       }
+
+       xmax = 0;
+       xmin = UNIT * 4;
+       ymax = 0;
+       ymin = UNIT * 4;
+       A->Cur_Pt = 0;
+       Buf = A->Buffer2;
+       Lx = (DBL) A->Width / UNIT / 2.2;
+       Ly = (DBL) A->Height / UNIT / 2.2;
+       for (n = A->Max_Pt; n; --n) {
+               (*Iterate) (x, y, &xo, &yo);
+               Buf->x = (short) (Lx * (x + DBL_To_PRM(1.1)));
+               Buf->y = (short) (Ly * (DBL_To_PRM(1.1) - y));
+               /* (void) fprintf( stderr, "X,Y: %d %d    ", Buf->x, Buf->y ); */
+               Buf++;
+               A->Cur_Pt++;
+               if (xo > xmax)
+                       xmax = xo;
+               else if (xo < xmin)
+                       xmin = xo;
+               if (yo > ymax)
+                       ymax = yo;
+               else if (yo < ymin)
+                       ymin = yo;
+               x = xo + NRAND(8) - 4;
+               y = yo + NRAND(8) - 4;
+       }
+
+       XSetForeground(display, gc, MI_WIN_BLACK_PIXEL(mi));
+
+       if (A->dbuf)    /* jwz */
+         {
+               XSetForeground(display, A->dbuf_gc, 0);
+/*         XDrawPoints(display, A->dbuf, A->dbuf_gc, A->Buffer1,
+                                   Cur_Pt,CoordModeOrigin);*/
+               XFillRectangle(display, A->dbuf, A->dbuf_gc, 0,0, A->Width, A->Height);
+         }
+       else
+         XDrawPoints(display, window, gc, A->Buffer1, Cur_Pt, CoordModeOrigin);
+
+       if (Max_Colors < 2)
+               XSetForeground(display, gc, MI_WIN_WHITE_PIXEL(mi));
+       else
+               XSetForeground(display, gc, MI_PIXEL(mi, A->Col % Max_Colors));
+
+       if (A->dbuf)
+         {
+               XSetForeground(display, A->dbuf_gc, 1);
+               XDrawPoints(display, A->dbuf, A->dbuf_gc, A->Buffer2, A->Cur_Pt,
+                                       CoordModeOrigin);
+         }
+       else
+         XDrawPoints(display, window, gc, A->Buffer2, A->Cur_Pt, CoordModeOrigin);
+
+       if (A->dbuf)
+         XCopyPlane(display, A->dbuf, window, gc, 0,0,A->Width,A->Height,0,0, 1);
+
+       Buf = A->Buffer1;
+       A->Buffer1 = A->Buffer2;
+       A->Buffer2 = Buf;
+
+       if ((xmax - xmin < DBL_To_PRM(.2)) && (ymax - ymin < DBL_To_PRM(.2)))
+               A->Count += 4 * A->Speed;
+       else
+               A->Count += A->Speed;
+       if (A->Count >= 1000) {
+               for (i = MAX_PRM - 1; i >= 0; --i)
+                       A->Prm1[i] = A->Prm2[i];
+               Random_Prm(A->Prm2);
+               A->Count = 0;
+       }
+       A->Col++;
+}
+
+
+/***************************************************************/
+
+void
+init_strange(ModeInfo * mi)
+{
+       ATTRACTOR  *Attractor;
+
+       curve = get_integer_resource ("curve", "Integer");
+       if (curve <= 0) curve = 10;
+
+       if (Root == NULL) {
+               Root = (ATTRACTOR *) calloc(
+                                    MI_NUM_SCREENS(mi), sizeof (ATTRACTOR));
+               if (Root == NULL)
+                       return;
+       }
+       if (Fold == NULL) {
+               int         i;
+
+               Fold = (PRM *) calloc(UNIT2 + 1, sizeof (PRM));
+               if (Fold == NULL)
+                       return;
+               for (i = 0; i <= UNIT2; ++i) {
+                       DBL         x;
+
+                       /* x = ( DBL )(i)/UNIT2; */
+                       /* x = sin( M_PI/2.0*x ); */
+                       /* x = sqrt( x ); */
+                       /* x = x*x; */
+                       /* x = x*(1.0-x)*4.0; */
+                       x = (DBL) (i) / UNIT;
+                       x = sin(x);
+                       Fold[i] = DBL_To_PRM(x);
+               }
+       }
+       Attractor = &Root[MI_SCREEN(mi)];
+
+       Attractor->Buffer1 = (XPoint *) calloc(MAX_POINTS, sizeof (XPoint));
+       if (Attractor->Buffer1 == NULL)
+               goto Abort;
+       Attractor->Buffer2 = (XPoint *) calloc(MAX_POINTS, sizeof (XPoint));
+       if (Attractor->Buffer2 == NULL)
+               goto Abort;
+       Attractor->Max_Pt = MAX_POINTS;
+
+       Attractor->Width = MI_WIN_WIDTH(mi);
+       Attractor->Height = MI_WIN_HEIGHT(mi);
+       Attractor->Cur_Pt = 0;
+       Attractor->Count = 0;
+       Attractor->Col = NRAND(MI_NPIXELS(mi));
+       Attractor->Speed = 4;
+
+       Attractor->Iterate = Funcs[NRAND(2)];
+       Random_Prm(Attractor->Prm1);
+       Random_Prm(Attractor->Prm2);
+
+       Attractor->dbuf = XCreatePixmap(MI_DISPLAY(mi), MI_WINDOW(mi),
+                                                                       Attractor->Width, Attractor->Height, 1);
+       if (Attractor->dbuf)
+         {
+               XGCValues gcv;
+               gcv.foreground = 0;
+               gcv.background = 0;
+               gcv.function = GXcopy;
+               Attractor->dbuf_gc = XCreateGC(MI_DISPLAY(mi), Attractor->dbuf,
+                                                                          GCForeground|GCBackground|GCFunction,
+                                                                          &gcv);
+               XFillRectangle(MI_DISPLAY(mi), Attractor->dbuf,
+                                          Attractor->dbuf_gc, 0,0, Attractor->Width,
+                                          Attractor->Height);
+               XSetBackground(MI_DISPLAY(mi), MI_GC(mi), MI_WIN_BLACK_PIXEL(mi));
+               XSetFunction(MI_DISPLAY(mi), MI_GC(mi), GXcopy);
+         }
+
+       XClearWindow(MI_DISPLAY(mi), MI_WINDOW(mi));
+       return;
+
+      Abort:
+       if (Attractor->Buffer1 != NULL)
+               free(Attractor->Buffer1);
+       if (Attractor->Buffer2 != NULL)
+               free(Attractor->Buffer2);
+       Attractor->Buffer1 = NULL;
+       Attractor->Buffer2 = NULL;
+       Attractor->Cur_Pt = 0;
+       return;
+}
+
+/***************************************************************/
+
+void
+release_strange(ModeInfo * mi)
+{
+       int         i;
+
+       if (Root == NULL)
+               return;
+
+       for (i = 0; i < MI_NUM_SCREENS(mi); ++i) {
+               if (Root[i].Buffer1 != NULL)
+                       free(Root[i].Buffer1);
+               if (Root[i].Buffer2 != NULL)
+                       free(Root[i].Buffer2);
+               if (Root[i].dbuf)
+                   XFreePixmap(MI_DISPLAY(mi), Root[i].dbuf);
+               if (Root[i].dbuf_gc)
+                   XFreeGC(MI_DISPLAY(mi), Root[i].dbuf_gc);
+       }
+       free(Root);
+       Root = NULL;
+       if (Fold != NULL)
+               free(Fold);
+       Fold = NULL;
+}
diff --git a/hacks/strange.man b/hacks/strange.man
new file mode 100644 (file)
index 0000000..088a9ee
--- /dev/null
@@ -0,0 +1,58 @@
+.TH XScreenSaver 1 "10-May-97" "X Version 11"
+.SH NAME
+strange - draws strange attractors
+.SH SYNOPSIS
+.B strange
+[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-ncolors \fIinteger\fP] [\-delay \fImicroseconds\fP]
+
+.SH DESCRIPTION
+The \fIstrange\fP program draws strange attractors
+.SH OPTIONS
+.I strange
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window.  This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-mono 
+If on a color display, pretend we're on a monochrome display.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use.  Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-ncolors \fIinteger\fP
+How many colors should be used (if possible).  Default 64.
+The colors are chosen randomly.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1),
+.BR xlock (1)
+.SH COPYRIGHT
+Copyright \(co 1997 by Massimino Pascal.
+
+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. 
+.SH AUTHOR
+Massimino Pascal <Pascal.Massimon@ens.fr>, 1997.
+
+Ability to run standalone or with \fIxscreensaver\fP added by 
+Jamie Zawinski <jwz@jwz.org>, 10-May-97.
diff --git a/hacks/swirl.c b/hacks/swirl.c
new file mode 100644 (file)
index 0000000..bfd2706
--- /dev/null
@@ -0,0 +1,1484 @@
+/* -*- Mode: C; tab-width: 4 -*-
+ * swirl --- swirly color-cycling patterns.
+ */
+#if !defined( lint ) && !defined( SABER )
+static const char sccsid[] = "@(#)swirl.c      4.00 97/01/01 xlockmore";
+#endif
+
+/* Copyright (c) 1994 M.Dobie <mrd@ecs.soton.ac.uk>
+ *
+ * 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.
+ *
+ * This file is provided AS IS with no warranties of any kind.  The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof.  In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * 13-May-97: jwz@jwz.org: turned into a standalone program.
+ * 21-Apr-95: improved startup time for TrueColour displays
+ *            (limited to 16bpp to save memory) S.Early <sde1000@cam.ac.uk>
+ * 09-Jan-95: fixed colour maps (more colourful) and the image now spirals
+ *            outwards from the centre with a fixed number of points drawn
+ *            every iteration. Thanks to M.Dobie <mrd@ecs.soton.ac.uk>.
+ * 1994:      written.   Copyright (c) 1994 M.Dobie <mrd@ecs.soton.ac.uk>
+ *            based on original code by R.Taylor
+ */
+
+#ifdef STANDALONE
+# define PROGCLASS                                     "Swirl"
+# define HACK_INIT                                     init_swirl
+# define HACK_DRAW                                     draw_swirl
+# define swirl_opts                                    xlockmore_opts
+# define DEFAULTS      "*count:                5       \n"                     \
+                                       "*delay:                10000   \n"                     \
+                                       "*ncolors:              200     \n"                     \
+                                       "*useSHM:               True    \n"
+# define SMOOTH_COLORS
+# define WRITABLE_COLORS
+# include "xlockmore.h"                                /* from the xscreensaver distribution */
+# include <X11/Xutil.h>
+# ifdef HAVE_XSHM_EXTENSION
+#  include "xshm.h"
+# endif /* HAVE_XSHM_EXTENSION */
+#else  /* !STANDALONE */
+# include "xlock.h"                                    /* from the xlockmore distribution */
+# undef HAVE_XSHM_EXTENSION
+#endif /* !STANDALONE */
+
+ModeSpecOpt swirl_opts = {
+  0, NULL, 0, NULL, NULL };
+
+#include <time.h>
+
+/****************************************************************/
+
+#define MASS            4      /* maximum mass of a knot */
+#define MIN_RES         5      /* minimim resolution (>= MIN_RES) */
+#define MAX_RES         1      /* maximum resolution (>0) */
+#define TWO_PLANE_PCNT  30     /* probability for two plane mode (0-100) */
+#define RESTART         2500   /* number of cycles before restart */
+#define BATCH_DRAW      100    /* points to draw per iteration */
+
+/* knot types */
+typedef enum {
+       NONE = 0,
+       ORBIT = (1 << 0),
+       WHEEL = (1 << 1),
+       PICASSO = (1 << 2),
+       RAY = (1 << 3),
+       HOOK = (1 << 4),
+       ALL = (1 << 5)
+} KNOT_T;
+
+/* a knot */
+typedef struct Knot {
+       int         x, y;       /* position */
+       int         m;          /* mass */
+       KNOT_T      t;          /* type in the first (or only) plane */
+       KNOT_T      T;          /* type in second plane if there is one */
+       int         M;          /* mass in second plane if there is one */
+} KNOT     , *KNOT_P;
+
+/* a colour specification */
+typedef struct Colour {
+       unsigned short r, g, b;
+} COLOUR   , *COLOUR_P;
+
+/* drawing direction */
+typedef enum {
+       DRAW_RIGHT, DRAW_DOWN, DRAW_LEFT, DRAW_UP
+} DIR_T;
+
+/****************************************************************/
+
+/* data associated with a swirl window */
+typedef struct swirl_data {
+       /* window paramaters */
+       Window      win;        /* the window */
+       int         width, height;      /* window size */
+       int         depth;      /* depth */
+       int         rdepth;     /* real depth (for XImage) */
+       Visual     *visual;     /* visual */
+
+       /* swirl drawing parameters */
+       int         n_knots;    /* number of knots */
+       KNOT_P      knots;      /* knot details */
+       KNOT_T      knot_type;  /* general type of knots */
+       int         resolution; /* drawing resolution, 1..5 */
+       int         max_resolution;     /* maximum resolution, MAX_RES */
+       int         r;          /* pixel step */
+       Bool        two_plane;  /* two plane mode? */
+       Bool        first_plane;        /* doing first plane? */
+       int         start_again;        /* when to restart */
+
+       /* spiral drawing parameters */
+       int         x, y;       /* current point */
+       DIR_T       direction;  /* current direction */
+       int         dir_todo, dir_done;         /* how many points in current direction? */
+       int         batch_todo, batch_done;     /* how many points in this batch */
+       Bool        started, drawing;   /* are we drawing? */
+
+       /* image stuff */
+       unsigned char *image;   /* image data */
+       XImage     *ximage;
+
+       /* colours stuff */
+       int         colours;    /* how many colours possible */
+       int         dcolours;   /* how many colours for shading */
+#ifndef STANDALONE
+       Bool        fixed_colourmap;    /* fixed colourmap? */
+#endif /* !STANDALONE */
+       Bool        monochrome; /* monochrome? */
+       Colormap    cmap;       /* colour map for the window */
+       XColor     *rgb_values; /* colour definitions array */
+#ifndef STANDALONE
+       int         current_map;        /* current colour map, 0..dcolours-1 */
+       unsigned long fg, bg, white, black;     /* black and white pixel values */
+       int         shift;      /* colourmap shift */
+       int         dshift;     /* colourmap shift while drawing */
+       XColor      fgcol, bgcol;       /* foreground and background colour specs */
+#endif /* !STANDALONE */
+       Bool       off_screen;
+} SWIRL    , *SWIRL_P;
+
+#define SWIRLCOLOURS 13
+
+#ifndef STANDALONE
+/* basic colours */
+static COLOUR basic_colours[SWIRLCOLOURS];
+#endif /* !STANDALONE */
+
+/* an array of swirls for each screen */
+static SWIRL_P swirls = NULL;
+
+/* 
+   random_no
+
+   Return a random integer between 0 and n inclusive
+
+   -      n is the maximum number
+
+   Returns a random integer */
+
+static int
+random_no(unsigned int n)
+{
+       return ((int) ((n + 1) * (double) LRAND() / MAXRAND));
+}
+
+/****************************************************************/
+
+/* 
+   initialise_swirl
+
+   Initialise all the swirl data
+
+   -      swirl is the swirl data */
+
+static void
+initialise_swirl(ModeInfo * mi, SWIRL_P swirl)
+{
+#ifndef STANDALONE
+       Display    *display = MI_DISPLAY(mi);
+#endif /* !STANDALONE */
+
+       swirl->width = 0;       /* width and height of window */
+       swirl->height = 0;
+       swirl->depth = 1;
+       swirl->rdepth = 1;
+       swirl->visual = NULL;
+       swirl->resolution = MIN_RES + 1;        /* current resolution */
+       swirl->max_resolution = MAX_RES;        /* maximum resolution */
+       swirl->n_knots = 0;     /* number of knots */
+       swirl->knot_type = ALL; /* general type of knots */
+       swirl->two_plane = False;       /* two plane mode? */
+       swirl->first_plane = False;     /* doing first plane? */
+       swirl->start_again = -1;        /* restart counter */
+
+       /* drawing parameters */
+       swirl->x = 0;
+       swirl->y = 0;
+       swirl->started = False;
+       swirl->drawing = False;
+
+       /* image stuff */
+       swirl->image = NULL;    /* image data */
+       swirl->ximage = NULL;
+
+       /* colours stuff */
+       swirl->colours = 0;     /* how many colours possible */
+       swirl->dcolours = 0;    /* how many colours for shading */
+       swirl->cmap = (Colormap) NULL;
+       swirl->rgb_values = NULL;       /* colour definitions array */
+#ifndef STANDALONE
+       swirl->current_map = 0; /* current colour map, 0..dcolours-1 */
+
+       /* set up fg fb colour specs */
+       swirl->white = MI_WIN_WHITE_PIXEL(mi);
+       swirl->black = MI_WIN_BLACK_PIXEL(mi);
+#endif /* !STANDALONE */
+
+
+#ifdef STANDALONE
+# define MI_COLORMAP MI_WIN_COLORMAP
+#else /* !STANDALONE */
+       swirl->fg = MI_FG_COLOR(mi);
+       swirl->bg = MI_BG_COLOR(mi);
+       swirl->fgcol.pixel = swirl->fg;
+       swirl->bgcol.pixel = swirl->bg;
+       XQueryColor(display, MI_COLORMAP(mi), &(swirl->fgcol));
+       XQueryColor(display, MI_COLORMAP(mi), &(swirl->bgcol));
+#endif /* !STANDALONE */
+}
+
+/****************************************************************/
+
+/* 
+ * initialise_image
+ *
+ * Initialise the image for drawing to
+ *
+ * -      swirl is the swirl data
+ */
+static void
+initialise_image(ModeInfo * mi, SWIRL_P swirl)
+{
+  Display *dpy = MI_DISPLAY(mi);
+
+  if (swirl->ximage != NULL)
+       XDestroyImage(swirl->ximage);
+
+  swirl->ximage = 0;
+#ifdef HAVE_XSHM_EXTENSION
+  if (mi->use_shm)
+       {
+         swirl->ximage = create_xshm_image(dpy, swirl->visual, swirl->rdepth,
+                                                                               ZPixmap, 0, &mi->shm_info,
+                                                                               swirl->width, swirl->height);
+         if (!swirl->ximage)
+               mi->use_shm = False;
+       }
+#endif /* HAVE_XSHM_EXTENSION */
+
+  if (!swirl->ximage)
+       {
+         swirl->ximage = XCreateImage(dpy, swirl->visual, swirl->rdepth, ZPixmap,
+                                                                  0, 0, swirl->width, swirl->height,
+                                                                  8, 0);
+         swirl->image = (unsigned char *)
+        calloc(swirl->height, swirl->ximage->bytes_per_line);
+      swirl->ximage->data = (char *) swirl->image;
+       }
+}
+
+/****************************************************************/
+
+#ifndef STANDALONE
+/* 
+ * initialise_colours
+ *
+ * Initialise the list of colours from which the colourmaps are derived
+ *
+ * -      colours is the array to initialise
+ * -      saturation is the saturation value to use 0->grey,
+ *            1.0->full saturation
+ */
+static void
+initialise_colours(COLOUR * colours, float saturate)
+{
+       int         i;
+
+       /* start off fully saturated, medium and bright colours */
+       colours[0].r = 0xA000;
+       colours[0].g = 0x0000;
+       colours[0].b = 0x0000;
+       colours[1].r = 0xD000;
+       colours[1].g = 0x0000;
+       colours[1].b = 0x0000;
+       colours[2].r = 0x0000;
+       colours[2].g = 0x6000;
+       colours[2].b = 0x0000;
+       colours[3].r = 0x0000;
+       colours[3].g = 0x9000;
+       colours[3].b = 0x0000;
+       colours[4].r = 0x0000;
+       colours[4].g = 0x0000;
+       colours[4].b = 0xC000;
+       colours[5].r = 0x0000;
+       colours[5].g = 0x0000;
+       colours[5].b = 0xF000;
+       colours[6].r = 0xA000;
+       colours[6].g = 0x6000;
+       colours[6].b = 0x0000;
+       colours[7].r = 0xD000;
+       colours[7].g = 0x9000;
+       colours[7].b = 0x0000;
+       colours[8].r = 0xA000;
+       colours[8].g = 0x0000;
+       colours[8].b = 0xC000;
+       colours[9].r = 0xD000;
+       colours[9].g = 0x0000;
+       colours[9].b = 0xF000;
+       colours[10].r = 0x0000;
+       colours[10].g = 0x6000;
+       colours[10].b = 0xC000;
+       colours[11].r = 0x0000;
+       colours[11].g = 0x9000;
+       colours[11].b = 0xF000;
+       colours[12].r = 0xA000;
+       colours[12].g = 0xA000;
+       colours[12].b = 0xA000;
+
+       /* add white for low saturation */
+       for (i = 0; i < SWIRLCOLOURS - 1; i++) {
+               unsigned short max_rg, max;
+
+               /* what is the max intensity for this colour? */
+               max_rg = (colours[i].r > colours[i].g) ? colours[i].r : colours[i].g;
+               max = (max_rg > colours[i].b) ? max_rg : colours[i].b;
+
+               /* bring elements up to max as saturation approaches 0.0 */
+               colours[i].r += (unsigned short) ((float) (1.0 - saturate) *
+                                              ((float) max - colours[i].r));
+               colours[i].g += (unsigned short) ((float) (1.0 - saturate) *
+                                              ((float) max - colours[i].g));
+               colours[i].b += (unsigned short) ((float) (1.0 - saturate) *
+                                              ((float) max - colours[i].b));
+       }
+}
+#endif /* !STANDALONE */
+
+/****************************************************************/
+
+#ifndef STANDALONE
+/* 
+ * set_black_and_white
+ *
+ * Set the entries for foreground & background pixels and
+ * WhitePixel & BlackPixel in an array of colour specifications.
+ *
+ * -      swirl is the swirl data
+ * -      values is the array of specifications 
+ */
+static void
+set_black_and_white(SWIRL_P swirl, XColor * values)
+{
+       unsigned long white, black;
+
+       /* where is black and white? */
+       white = swirl->white;
+       black = swirl->black;
+
+       /* set black and white up */
+       values[white].flags = DoRed | DoGreen | DoBlue;
+       values[white].pixel = white;
+       values[white].red = 0xFFFF;
+       values[white].green = 0xFFFF;
+       values[white].blue = 0xFFFF;
+       values[black].flags = DoRed | DoGreen | DoBlue;
+       values[black].pixel = black;
+       values[black].red = 0;
+       values[black].green = 0;
+       values[black].blue = 0;
+
+       /* copy the colour specs from the original entries */
+       values[swirl->fg] = swirl->fgcol;
+       values[swirl->bg] = swirl->bgcol;
+}
+
+/****************************************************************/
+
+/* 
+ * set_colour
+ *
+ * Set an entry in an array of XColor specifications. The given entry will be
+ * set to the given colour. If the entry corresponds to the foreground,
+ * background, WhitePixel, or BlackPixel it is ignored and the given colour
+ * is is put in the next entry.
+ *
+ * Therefore, the given colour may be placed up to four places after the
+ * specified entry in the array, if foreground, background, white, or black
+ * intervene.
+ *
+ * -      swirl is the swirl data
+ * -      value points to a pointer to the array entry. It gets updated to
+ *            point to the next free entry.
+ * -      pixel points to the current pixel number. It gets updated.
+ * -      c points to the colour to add
+ */
+static void
+set_colour(SWIRL_P swirl, XColor ** value, unsigned long *pixel, COLOUR_P c)
+{
+       Bool        done;
+       unsigned long fg, bg, white, black;
+
+       /* where are foreground, background, white, and black? */
+       fg = swirl->fg;
+       bg = swirl->bg;
+       white = swirl->white;
+       black = swirl->black;
+
+       /* haven't set it yet */
+       done = False;
+
+       /* try and set the colour */
+       while (!done) {
+               (**value).flags = DoRed | DoGreen | DoBlue;
+               (**value).pixel = *pixel;
+
+               /* white, black, fg, bg, or a colour? */
+               if ((*pixel != fg) && (*pixel != bg) &&
+                   (*pixel != white) && (*pixel != black)) {
+                       (**value).red = c->r;
+                       (**value).green = c->g;
+                       (**value).blue = c->b;
+
+                       /* now we've done it */
+                       done = True;
+               }
+               /* next pixel */
+               (*value)++;
+               (*pixel)++;
+       }
+}
+
+/****************************************************************/
+
+/* 
+ * get_colour
+ *
+ * Get an entry from an array of XColor specifications. The next colour from
+ * the array will be returned. Foreground, background, WhitePixel, or
+ * BlackPixel will be ignored.
+ *
+ * -      swirl is the swirl data
+ * -      value points the array entry. It is updated to point to the entry
+ *            following the one returned.
+ * -      c is set to the colour found
+ */
+static void
+get_colour(SWIRL_P swirl, XColor ** value, COLOUR_P c)
+{
+       Bool        done;
+       unsigned long fg, bg, white, black;
+
+       /* where is white and black? */
+       fg = swirl->fg;
+       bg = swirl->bg;
+       white = swirl->white;
+       black = swirl->black;
+
+       /* haven't set it yet */
+       done = False;
+
+       /* try and set the colour */
+       while (!done) {
+               /* black, white or a colour? */
+               if (((*value)->pixel != fg) && ((*value)->pixel != bg) &&
+                 ((*value)->pixel != white) && ((*value)->pixel != black)) {
+                       c->r = (*value)->red;
+                       c->g = (*value)->green;
+                       c->b = (*value)->blue;
+
+                       /* now we've done it */
+                       done = True;
+               }
+               /* next value */
+               (*value)++;
+       }
+}
+#endif /* !STANDALONE */
+
+/****************************************************************/
+
+#ifndef STANDALONE
+/* 
+ *  interpolate
+ *
+ * Generate n colours between c1 and c2.  n XColors at *value are set up with
+ * ascending pixel values.
+ *
+ * If the pixel range includes BlackPixel or WhitePixel they are set to black
+ * and white respectively but otherwise ignored. Therefore, up to n+2 colours
+ * may actually be set by this function.
+ *
+ * -      swirl is the swirl data
+ * -      values points a pointer to an array of XColors to update
+ * -      pixel points to the pixel number to start at
+ * -      k n is the number of colours to generate
+ * -      c1, c2 are the colours to interpolate between
+ */
+static void
+interpolate(SWIRL_P swirl, XColor ** values, unsigned long *pixel, int n, COLOUR_P c1, COLOUR_P c2)
+{
+       int         i, r, g, b;
+       COLOUR      c;
+       unsigned short maxv;
+
+       /* maximum value */
+       maxv = (255 << 8);
+
+       for (i = 0; i < n / 2 && (int) *pixel < swirl->colours; i++) {
+               /* work out the colour */
+               r = c1->r + 2 * i * ((int) c2->r) / n;
+               c.r = (r > (int) maxv) ? maxv : r;
+               g = c1->g + 2 * i * ((int) c2->g) / n;
+               c.g = (g > (int) maxv) ? maxv : g;
+               b = c1->b + 2 * i * ((int) c2->b) / n;
+               c.b = (b > (int) maxv) ? maxv : b;
+
+               /* set it up */
+               set_colour(swirl, values, pixel, &c);
+       }
+       for (i = n / 2; i >= 0 && (int) *pixel < swirl->colours; i--) {
+               r = c2->r + 2 * i * ((int) c1->r) / n;
+               c.r = (r > (int) maxv) ? maxv : r;
+               g = c2->g + 2 * i * ((int) c1->g) / n;
+               c.g = (g > (int) maxv) ? maxv : g;
+               b = c2->b + 2 * i * ((int) c1->b) / n;
+               c.b = (b > (int) maxv) ? maxv : b;
+
+               /* set it up */
+               set_colour(swirl, values, pixel, &c);
+       }
+}
+
+/****************************************************************/
+
+/* 
+ * basic_map
+ *
+ * Generate a `random' closed loop colourmap that occupies the whole colour
+ * map.
+ *
+ * -      swirl is the swirl data
+ * -      values is the array of colour definitions to set up
+ */
+static void
+basic_map(SWIRL_P swirl, XColor * values)
+{
+       COLOUR      c[3];
+       int         i;
+       unsigned short r1, g1, b1, r2, g2, b2, r3, g3, b3;
+       int         L1, L2, L3, L;
+       unsigned long pixel;
+       XColor     *value;
+
+       /* start at the beginning of the colour map */
+       pixel = 0;
+       value = values;
+
+       /* choose 3 different basic colours at random */
+       for (i = 0; i < 3;) {
+               int         j;
+               Bool        same;
+
+               /* choose colour i */
+               c[i] = basic_colours[random_no(SWIRLCOLOURS - 1)];
+
+               /* assume different */
+               same = False;
+
+               /* different from the rest? */
+               for (j = 0; j < i; j++)
+                       if ((c[i].r == c[j].r) &&
+                           (c[i].g == c[j].g) &&
+                           (c[i].b == c[j].b))
+                               same = True;
+
+               /* ready for the next colour? */
+               if (!same)
+                       i++;
+       }
+
+       /* extract components into variables */
+       r1 = c[0].r;
+       g1 = c[0].g;
+       b1 = c[0].b;
+       r2 = c[1].r;
+       g2 = c[1].g;
+       b2 = c[1].b;
+       r3 = c[2].r;
+       g3 = c[2].g;
+       b3 = c[2].b;
+
+       /* work out the lengths of each side of the triangle */
+       L1 = (int) sqrt((((double) r1 - r2) * ((double) r1 - r2) +
+                        ((double) g1 - g2) * ((double) g1 - g2) +
+                        ((double) b1 - b2) * ((double) b1 - b2)));
+
+       L2 = (int) sqrt((((double) r3 - r2) * ((double) r3 - r2) +
+                        ((double) g3 - g2) * ((double) g3 - g2) +
+                        ((double) b3 - b2) * ((double) b3 - b2)));
+
+       L3 = (int) sqrt((((double) r1 - r3) * ((double) r1 - r3) +
+                        ((double) g1 - g3) * ((double) g1 - g3) +
+                        ((double) b1 - b3) * ((double) b1 - b3)));
+
+       L = L1 + L2 + L3;
+
+       /* allocate colours in proportion to the lengths of the sides */
+       interpolate(swirl, &value, &pixel,
+                   (int) ((double) swirl->dcolours * ((double) L1 / (double) L)) + 1, c, c + 1);
+       interpolate(swirl, &value, &pixel,
+                   (int) ((double) swirl->dcolours * ((double) L2 / (double) L)) + 1, c + 1, c + 2);
+       interpolate(swirl, &value, &pixel,
+                   (int) ((double) swirl->dcolours * ((double) L3 / (double) L)) + 1, c + 2, c);
+
+       /* fill up any remaining slots (due to rounding) */
+       while ((int) pixel < swirl->colours) {
+               /* repeat the last colour */
+               set_colour(swirl, &value, &pixel, c);
+       }
+
+       /* ensure black and white are correct */
+       if (!swirl->fixed_colourmap)
+               set_black_and_white(swirl, values);
+}
+
+/****************************************************************/
+
+/* 
+ * pre_rotate
+ *
+ * Generate pre-rotated versions of the colour specifications
+ *
+ * -      swirl is the swirl data
+ * -      values is an array of colour specifications
+ */
+static void
+pre_rotate(SWIRL_P swirl, XColor * values)
+{
+       int         i, j;
+       XColor     *src, *dest;
+       int         dcolours;
+       unsigned long pixel;
+
+       /* how many colours to display? */
+       dcolours = swirl->dcolours;
+
+       /* start at the first map */
+       src = values;
+       dest = values + swirl->colours;
+
+       /* generate dcolours-1 rotated maps */
+       for (i = 0; i < dcolours - 1; i++) {
+               COLOUR      first;
+
+               /* start at the first pixel */
+               pixel = 0;
+
+               /* remember the first one and skip it */
+               get_colour(swirl, &src, &first);
+
+               /* put a rotated version of src at dest */
+               for (j = 0; j < dcolours - 1; j++) {
+                       COLOUR      c;
+
+                       /* get the source colour */
+                       get_colour(swirl, &src, &c);
+
+                       /* set the colour */
+                       set_colour(swirl, &dest, &pixel, &c);
+               }
+
+               /* put the first one at the end */
+               set_colour(swirl, &dest, &pixel, &first);
+
+               /* NB: src and dest should now be ready for the next table */
+
+               /* ensure black and white are properly set */
+               set_black_and_white(swirl, src);
+       }
+}
+
+/****************************************************************/
+
+/* 
+ * create_colourmap
+ *
+ * Create a read/write colourmap to use
+ *
+ * -      swirl is the swirl data
+ */
+
+static void
+create_colourmap(ModeInfo * mi, SWIRL_P swirl)
+{
+       Display    *display = MI_DISPLAY(mi);
+       int         preserve;
+       int         n_rotations;
+       int         i;
+       Bool        truecolor;
+  unsigned long redmask, greenmask, bluemask;
+
+       swirl->fixed_colourmap = !setupColormap(mi, &(swirl->colours),
+    &truecolor, &redmask, &greenmask, &bluemask);
+       preserve = preserveColors(swirl->fg, swirl->bg, swirl->white, swirl->black);
+
+       /* how many colours should we animate? */
+       swirl->dcolours = (swirl->colours > preserve + 1) ?
+               swirl->colours - preserve : swirl->colours;
+
+       if (MI_NPIXELS(mi) < 2)
+               return;
+
+       /* how fast to shift the colourmap? */
+       swirl->shift = (swirl->colours > 64) ? swirl->colours / 64 : 1;
+       swirl->dshift = (swirl->shift > 1) ? swirl->shift * 2 : 1;
+
+       /* how may colour map rotations are there? */
+       n_rotations = (swirl->fixed_colourmap) ? 1 : swirl->dcolours;
+
+       /* allocate space for colour definitions (if not already there) */
+       if (swirl->rgb_values == NULL) {
+               swirl->rgb_values = (XColor *) calloc((swirl->colours + 3) * n_rotations,
+                                                     sizeof (XColor));
+
+               /* create a colour map */
+               if (!swirl->fixed_colourmap)
+                       swirl->cmap =
+                               XCreateColormap(display, swirl->win, swirl->visual, AllocAll);
+       }
+       /* select a set of colours for the colour map */
+       basic_map(swirl, swirl->rgb_values);
+
+       /* are we rotating them? */
+       if (!swirl->fixed_colourmap) {
+               /* generate rotations of the colour maps */
+               pre_rotate(swirl, swirl->rgb_values);
+
+               /* store the colours in the colour map */
+               XStoreColors(display, swirl->cmap, swirl->rgb_values, swirl->colours);
+       } else {
+               if (truecolor) {
+                       int         rsh, gsh, bsh;
+                       unsigned long int t;
+
+                       t = redmask;
+                       for (i = 0; (int) t > 0; i++, t >>= 1);
+                       rsh = 16 - i;
+                       t = greenmask;
+                       for (i = 0; (int) t > 0; i++, t >>= 1);
+                       gsh = 16 - i;
+                       t = bluemask;
+                       for (i = 0; (int) t > 0; i++, t >>= 1);
+                       bsh = 16 - i;
+                       for (i = 0; i < swirl->colours; i++)
+                               swirl->rgb_values[i].pixel =
+                                       ((rsh > 0 ? (swirl->rgb_values[i].red) >> rsh :
+                                         (swirl->rgb_values[i].red) << (-rsh)) & redmask) |
+                                       ((gsh > 0 ? (swirl->rgb_values[i].green) >> gsh :
+                                         (swirl->rgb_values[i].green) << (-gsh)) & greenmask) |
+                                       ((bsh > 0 ? (swirl->rgb_values[i].blue) >> bsh :
+                                         (swirl->rgb_values[i].blue) << (-bsh)) & bluemask);
+               } else {
+                       /* lookup the colours in the fixed colour map */
+                       for (i = 0; i < swirl->colours; i++)
+                               (void) XAllocColor(display, MI_COLORMAP(mi),
+                                                  &(swirl->rgb_values[i]));
+               }
+       }
+}
+
+/****************************************************************/
+
+/* 
+ * install_map
+ *
+ * Install a new set of colours into the colour map
+ *
+ * -      dpy is the display
+ * -      swirl is the swirl data
+ * -      shift is the amount to rotate the colour map by
+ */
+static void
+install_map(Display * dpy, SWIRL_P swirl, int shift)
+{
+       if (!swirl->fixed_colourmap) {
+               /* shift the colour map */
+               swirl->current_map = (swirl->current_map + shift) %
+                       swirl->dcolours;
+
+               /* store it */
+               XStoreColors(dpy, swirl->cmap,
+                            swirl->rgb_values +
+                            swirl->current_map * swirl->colours,
+                            swirl->colours);
+       }
+}
+#endif /* !STANDALONE */
+
+/****************************************************************/
+
+/* 
+ * create_knots
+ *
+ * Initialise the array of knot
+ *
+ * swirl is the swirl data
+ */
+static void
+create_knots(SWIRL_P swirl)
+{
+       int         k;
+       Bool        orbit, wheel, picasso, ray, hook;
+       KNOT_P      knot;
+
+       /* create array for knots */
+       if (swirl->knots)
+               (void) free((void *) swirl->knots);
+       swirl->knots = (KNOT_P) calloc(swirl->n_knots, sizeof (KNOT));
+
+       /* no knots yet */
+       orbit = wheel = picasso = ray = hook = False;
+
+       /* what types do we have? */
+       if ((int) swirl->knot_type & (int) ALL) {
+               orbit = wheel = ray = hook = True;
+       } else {
+               if ((int) swirl->knot_type & (int) ORBIT)
+                       orbit = True;
+               if ((int) swirl->knot_type & (int) WHEEL)
+                       wheel = True;
+               if ((int) swirl->knot_type & (int) PICASSO)
+                       picasso = True;
+               if ((int) swirl->knot_type & (int) RAY)
+                       ray = True;
+               if ((int) swirl->knot_type & (int) HOOK)
+                       hook = True;
+       }
+
+       /* initialise each knot */
+       knot = swirl->knots;
+       for (k = 0; k < swirl->n_knots; k++) {
+               /* position */
+               knot->x = random_no((unsigned int) swirl->width);
+               knot->y = random_no((unsigned int) swirl->height);
+
+               /* mass */
+               knot->m = random_no(MASS) + 1;
+
+               /* can be negative */
+               if (random_no(100) > 50)
+                       knot->m *= -1;
+
+               /* type */
+               knot->t = NONE;
+               while (knot->t == NONE) {
+                       /* choose a random one from the types available */
+                       switch (random_no(4)) {
+                               case 0:
+                                       if (orbit)
+                                               knot->t = ORBIT;
+                                       break;
+                               case 1:
+                                       if (wheel)
+                                               knot->t = WHEEL;
+                                       break;
+                               case 2:
+                                       if (picasso)
+                                               knot->t = PICASSO;
+                                       break;
+                               case 3:
+                                       if (ray)
+                                               knot->t = RAY;
+                                       break;
+                               case 4:
+                                       if (hook)
+                                               knot->t = HOOK;
+                                       break;
+                       }
+               }
+
+               /* if two planes, do same for second plane */
+               if (swirl->two_plane) {
+                       knot->T = NONE;
+                       while (knot->T == NONE || knot->T == knot->t) {
+                               /* choose a different type */
+                               switch (random_no(4)) {
+                                       case 0:
+                                               if (orbit)
+                                                       knot->T = ORBIT;
+                                               break;
+                                       case 1:
+                                               if (wheel)
+                                                       knot->T = WHEEL;
+                                               break;
+                                       case 2:
+                                               if (picasso)
+                                                       knot->T = PICASSO;
+                                               break;
+                                       case 3:
+                                               if (ray)
+                                                       knot->T = RAY;
+                                               break;
+                                       case 4:
+                                               if (hook)
+                                                       knot->T = HOOK;
+                                               break;
+                               }
+                       }
+               }
+               /* next knot */
+               knot++;
+       }
+}
+
+/****************************************************************/
+
+/* 
+ * do_point
+ *
+ * Work out the pixel value at i, j. Ensure it does not clash with BlackPixel
+ * or WhitePixel.
+ *
+ * -      swirl is the swirl data
+ * -      i, j is the point to calculate
+ *
+ * Returns the value of the point
+ */
+static unsigned long
+do_point(SWIRL_P swirl, int i, int j)
+{
+       int         tT, k, value, add;
+       double      dx, dy, theta, dist;
+       int         dcolours, qcolours;
+       double      rads;
+       KNOT_P      knot;
+
+       /* how many colours? */
+       dcolours = swirl->dcolours;
+       qcolours = dcolours / 4;
+
+       /* colour step round a circle */
+       rads = (double) dcolours / (2.0 * M_PI);
+
+       /* start at zero */
+       value = 0;
+
+       /* go through all the knots */
+       knot = swirl->knots;
+       for (k = 0; k < swirl->n_knots; k++) {
+               dx = i - knot->x;
+               dy = j - knot->y;
+
+               /* in two_plane mode get the appropriate knot type */
+               if (swirl->two_plane)
+                       tT = (int) ((swirl->first_plane) ? knot->t : knot->T);
+               else
+                       tT = (int) knot->t;
+
+               /* distance from knot */
+               dist = sqrt(dx * dx + dy * dy);
+
+               /* nothing to add at first */
+               add = 0;
+
+               /* work out the contribution (if close enough) */
+               if (dist > 0.1)
+                       switch (tT) {
+                               case ORBIT:
+                                       add = (int) (dcolours / (1.0 + 0.01 * abs(knot->m) * dist));
+                                       break;
+                               case WHEEL:
+                                       /* Avoid atan2: DOMAIN error message */
+                                       if (dy == 0.0 && dx == 0.0)
+                                               theta = 1.0;
+                                       else
+                                               theta = (atan2(dy, dx) + M_PI) / M_PI;
+                                       if (theta < 1.0)
+                                               add = (int) (dcolours * theta +
+                                                 sin(0.1 * knot->m * dist) *
+                                               qcolours * exp(-0.01 * dist));
+                                       else
+                                               add = (int) (dcolours * (theta - 1.0) +
+                                                 sin(0.1 * knot->m * dist) *
+                                               qcolours * exp(-0.01 * dist));
+                                       break;
+                               case PICASSO:
+                                       add = (int) (dcolours *
+                                         fabs(cos(0.002 * knot->m * dist)));
+                                       break;
+                               case RAY:
+                                       /* Avoid atan2: DOMAIN error message */
+                                       if (dy == 0.0 && dx == 0.0)
+                                               add = 0;
+                                       else
+                                               add = (int) (dcolours * fabs(sin(2.0 * atan2(dy, dx))));
+
+                                       break;
+                               case HOOK:
+                                       /* Avoid atan2: DOMAIN error message */
+                                       if (dy == 0.0 && dx == 0.0)
+                                               add = (int) (0.05 * (abs(knot->m) - 1) * dist);
+                                       else
+                                               add = (int) (rads * atan2(dy, dx) +
+                                                            0.05 * (abs(knot->m) - 1) * dist);
+                                       break;
+                       }
+               /* for a +ve mass add on the contribution else take it off */
+               if (knot->m > 0)
+                       value += add;
+               else
+                       value -= add;
+
+               /* next knot */
+               knot++;
+       }
+
+       /* toggle plane */
+       swirl->first_plane = (!swirl->first_plane);
+
+       /* make sure we handle -ve values properly */
+       if (value >= 0)
+               value = (value % dcolours) + 2;
+       else
+               value = dcolours - (abs(value) % (dcolours - 1));
+
+#ifndef STANDALONE
+       /* if fg and bg are 1 and 0 we should be OK, but just in case */
+       while ((dcolours > 2) &&
+              (((value % swirl->colours) == (int) swirl->fg) ||
+               ((value % swirl->colours) == (int) swirl->bg) ||
+               ((value % swirl->colours) == (int) swirl->white) ||
+               ((value % swirl->colours) == (int) swirl->black))) {
+               value++;
+       }
+#endif /* !STANDALONE */
+
+       /* definitely make sure it is in range */
+       value = value % swirl->colours;
+
+       /* lookup the pixel value if necessary */
+#ifndef STANDALONE
+       if (swirl->fixed_colourmap && swirl->dcolours > 2)
+#endif
+               value = swirl->rgb_values[value].pixel;
+
+       /* return it */
+       return ((unsigned long) value);
+}
+
+/****************************************************************/
+
+/* 
+ * draw_block
+ *
+ * Draw a square block of points with the same value.
+ *
+ * -      ximage is the XImage to draw on.
+ * -      x, y is the top left corner
+ * -      s is the length of each side
+ * -      v is the value
+ */
+static void
+draw_block(XImage * ximage, int x, int y, int s, unsigned long v)
+{
+       int         a, b;
+
+       for (a = 0; a < s; a++)
+               for (b = 0; b < s; b++) {
+                       XPutPixel(ximage, x + b, y + a, v);
+               }
+}
+
+/****************************************************************/
+
+/* 
+ * draw_point  Draw the current point in a swirl pattern onto the XImage
+ *
+ * -    swirl is the swirl
+ * -    win is the window to update
+ */
+static void
+draw_point(ModeInfo * mi, SWIRL_P swirl)
+{
+       int         r;
+       int         x, y;
+
+       /* get current point coordinates and resolution */
+       x = swirl->x;
+       y = swirl->y;
+       r = swirl->r;
+
+       /* check we are within the window */
+       if ((x < 0) || (x > swirl->width - r) || (y < 0) || (y > swirl->height - r))
+               return;
+
+       /* what style are we drawing? */
+       if (swirl->two_plane) {
+               int         r2;
+
+               /* halve the block size */
+               r2 = r / 2;
+
+               /* interleave blocks at half r */
+               draw_block(swirl->ximage, x, y, r2, do_point(swirl, x, y));
+               draw_block(swirl->ximage, x + r2, y, r2, do_point(swirl, x + r2, y));
+               draw_block(swirl->ximage, x + r2, y + r2, r2, do_point(swirl,
+                       x + r2, y + r2));
+               draw_block(swirl->ximage, x, y + r2, r2, do_point(swirl, x, y + r2));
+       } else
+               draw_block(swirl->ximage, x, y, r, do_point(swirl, x, y));
+
+       /* update the screen */
+
+#ifdef HAVE_XSHM_EXTENSION
+       if (mi->use_shm)
+         XShmPutImage(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi), swirl->ximage,
+                                  x, y, x, y, r, r, False);
+       else
+#endif /* !HAVE_XSHM_EXTENSION */
+         /* PURIFY 4.0.1 on SunOS4 and on Solaris 2 reports a 256 byte memory
+                leak on the next line. */
+         XPutImage(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi), swirl->ximage,
+                               x, y, x, y, r, r);
+}
+
+/****************************************************************/
+
+/* 
+ * next_point  Move to the next point in the spiral pattern
+ *  -    swirl is the swirl
+ *  -    win is the window to update
+ */
+static void
+next_point(SWIRL_P swirl)
+{
+       /* more to do in this direction? */
+       if (swirl->dir_done < swirl->dir_todo) {
+               /* move in the current direction */
+               switch (swirl->direction) {
+                       case DRAW_RIGHT:
+                               swirl->x += swirl->r;
+                               break;
+                       case DRAW_DOWN:
+                               swirl->y += swirl->r;
+                               break;
+                       case DRAW_LEFT:
+                               swirl->x -= swirl->r;
+                               break;
+                       case DRAW_UP:
+                               swirl->y -= swirl->r;
+                               break;
+               }
+
+               /* done another point */
+               swirl->dir_done++;
+       } else {
+               /* none drawn yet */
+               swirl->dir_done = 0;
+
+               /* change direction - check and record if off screen */
+               switch (swirl->direction) {
+                       case DRAW_RIGHT:
+                               swirl->direction = DRAW_DOWN;
+                               if (swirl->x > swirl->width - swirl->r) {
+                                       /* skip these points */
+                                       swirl->dir_done = swirl->dir_todo;
+                                       swirl->y += (swirl->dir_todo * swirl->r);
+
+                                       /* check for finish */
+                                       if (swirl->off_screen)
+                                               swirl->drawing = False;
+                                       swirl->off_screen = True;
+                               } else
+                                       swirl->off_screen = False;
+                               break;
+                       case DRAW_DOWN:
+                               swirl->direction = DRAW_LEFT;
+                               swirl->dir_todo++;
+                               if (swirl->y > swirl->height - swirl->r) {
+                                       /* skip these points */
+                                       swirl->dir_done = swirl->dir_todo;
+                                       swirl->x -= (swirl->dir_todo * swirl->r);
+
+                                       /* check for finish */
+                                       if (swirl->off_screen)
+                                               swirl->drawing = False;
+                                       swirl->off_screen = True;
+                               } else
+                                       swirl->off_screen = False;
+                               break;
+                       case DRAW_LEFT:
+                               swirl->direction = DRAW_UP;
+                               if (swirl->x < 0) {
+                                       /* skip these points */
+                                       swirl->dir_done = swirl->dir_todo;
+                                       swirl->y -= (swirl->dir_todo * swirl->r);
+
+                                       /* check for finish */
+                                       if (swirl->off_screen)
+                                               swirl->drawing = False;
+                                       swirl->off_screen = True;
+                               } else
+                                       swirl->off_screen = False;
+                               break;
+                       case DRAW_UP:
+                               swirl->direction = DRAW_RIGHT;
+                               swirl->dir_todo++;
+                               if (swirl->y < 0) {
+                                       /* skip these points */
+                                       swirl->dir_done = swirl->dir_todo;
+                                       swirl->x += (swirl->dir_todo * swirl->r);
+
+                                       /* check for finish */
+                                       if (swirl->off_screen)
+                                               swirl->drawing = False;
+                                       swirl->off_screen = True;
+                               } else
+                                       swirl->off_screen = False;
+                               break;
+               }
+       }
+}
+
+/****************************************************************/
+
+/* 
+ * init_swirl
+ *
+ * Initialise things for swirling
+ *
+ * -      win is the window to draw in
+ */
+void
+init_swirl(ModeInfo * mi)
+{
+       Display    *display = MI_DISPLAY(mi);
+       Window      window = MI_WINDOW(mi);
+       SWIRL_P     swirl;
+
+       /* does the swirls array exist? */
+       if (swirls == NULL) {
+               int         i;
+
+               /* allocate an array, one entry for each screen */
+               swirls = (SWIRL_P) calloc(ScreenCount(display), sizeof (SWIRL));
+
+               /* initialise them all */
+               for (i = 0; i < ScreenCount(display); i++)
+                       initialise_swirl(mi, &swirls[i]);
+       }
+       /* get a pointer to this swirl */
+       swirl = &(swirls[MI_SCREEN(mi)]);
+
+       /* get window parameters */
+       swirl->win = window;
+       swirl->width = MI_WIN_WIDTH(mi);
+       swirl->height = MI_WIN_HEIGHT(mi);
+       swirl->depth = MI_WIN_DEPTH(mi);
+       swirl->rdepth = swirl->depth;
+       swirl->visual = MI_VISUAL(mi);
+
+       if (swirl->depth > 16)
+               swirl->depth = 16;
+
+       /* initialise image for speeding up drawing */
+       initialise_image(mi, swirl);
+
+       /* clear the window (before setting the colourmap) */
+       XClearWindow(display, MI_WINDOW(mi));
+
+#ifdef STANDALONE
+
+       swirl->rgb_values = mi->colors;
+       swirl->colours = mi->npixels;
+       swirl->dcolours = swirl->colours;
+/*     swirl->fixed_colourmap = !mi->writable_p;*/
+
+#else /* !STANDALONE */
+
+       /* initialise the colours from which the colourmap is derived */
+       initialise_colours(basic_colours, MI_SATURATION(mi));
+
+       /* set up the colour map */
+       create_colourmap(mi, swirl);
+
+       /* attach the colour map to the window (if we have one) */
+       if (!swirl->fixed_colourmap) {
+#if 1
+               setColormap(display, window, swirl->cmap, MI_WIN_IS_INWINDOW(mi));
+#else
+               XSetWindowColormap(display, window, swirl->cmap);
+               (void) XSetWMColormapWindows(display, window, &window, 1);
+               XInstallColormap(display, swirl->cmap);
+#endif
+       }
+#endif /* STANDALONE */
+
+       /* resolution starts off chunky */
+       swirl->resolution = MIN_RES + 1;
+
+       /* calculate the pixel step for this resulution */
+       swirl->r = (1 << (swirl->resolution - 1));
+
+       /* how many knots? */
+       swirl->n_knots = random_no((unsigned int) MI_BATCHCOUNT(mi) / 2) +
+               MI_BATCHCOUNT(mi) + 1;
+
+       /* what type of knots? */
+       swirl->knot_type = ALL; /* for now */
+
+       /* use two_plane mode occaisionally */
+       if (random_no(100) <= TWO_PLANE_PCNT) {
+               swirl->two_plane = swirl->first_plane = True;
+               swirl->max_resolution = 2;
+       } else
+               swirl->two_plane = False;
+
+       /* fix the knot values */
+       create_knots(swirl);
+
+       /* we are off */
+       swirl->started = True;
+       swirl->drawing = False;
+}
+
+/****************************************************************/
+
+/* 
+ * draw_swirl
+ *
+ * Draw one iteration of swirling
+ *
+ * -      win is the window to draw in
+ */
+void
+draw_swirl(ModeInfo * mi)
+{
+       SWIRL_P     swirl = &(swirls[MI_SCREEN(mi)]);
+
+       /* are we going? */
+       if (swirl->started) {
+               /* in the middle of drawing? */
+               if (swirl->drawing) {
+#ifdef STANDALONE
+                 if (mi->writable_p)
+                       rotate_colors(MI_DISPLAY(mi), MI_COLORMAP(mi),
+                                                 swirl->rgb_values, swirl->colours, 1);
+#else  /* !STANDALONE */
+                       /* rotate the colours */
+                       install_map(MI_DISPLAY(mi), swirl, swirl->dshift);
+#endif /* !STANDALONE */
+
+                       /* draw a batch of points */
+                       swirl->batch_todo = BATCH_DRAW;
+                       while ((swirl->batch_todo > 0) && swirl->drawing) {
+                               /* draw a point */
+                               draw_point(mi, swirl);
+
+                               /* move to the next point */
+                               next_point(swirl);
+
+                               /* done a point */
+                               swirl->batch_todo--;
+                       }
+               } else {
+#ifdef STANDALONE
+                 if (mi->writable_p)
+                       rotate_colors(MI_DISPLAY(mi), MI_COLORMAP(mi),
+                                                 swirl->rgb_values, swirl->colours, 1);
+#else  /* !STANDALONE */
+                       /* rotate the colours */
+                       install_map(MI_DISPLAY(mi), swirl, swirl->shift);
+#endif /* !STANDALONE */
+
+                       /* time for a higher resolution? */
+                       if (swirl->resolution > swirl->max_resolution) {
+                               /* move to higher resolution */
+                               swirl->resolution--;
+
+                               /* calculate the pixel step for this resulution */
+                               swirl->r = (1 << (swirl->resolution - 1));
+
+                               /* start drawing again */
+                               swirl->drawing = True;
+
+                               /* start in the middle of the screen */
+                               swirl->x = (swirl->width - swirl->r) / 2;
+                               swirl->y = (swirl->height - swirl->r) / 2;
+
+                               /* initialise spiral drawing parameters */
+                               swirl->direction = DRAW_RIGHT;
+                               swirl->dir_todo = 1;
+                               swirl->dir_done = 0;
+                       } else {
+                               /* all done, decide when to restart */
+                               if (swirl->start_again == -1) {
+                                       /* start the counter */
+                                       swirl->start_again = RESTART;
+                               } else if (swirl->start_again == 0) {
+                                       /* reset the counter */
+                                       swirl->start_again = -1;
+
+#ifdef STANDALONE
+                                       /* Pick a new colormap! */
+                                       XClearWindow (MI_DISPLAY(mi), MI_WINDOW(mi));
+                                       free_colors (MI_DISPLAY(mi), MI_COLORMAP(mi),
+                                                                mi->colors, mi->npixels);
+                                       make_smooth_colormap (MI_DISPLAY(mi),
+                                                                                 MI_VISUAL(mi),
+                                                                                 MI_COLORMAP(mi),
+                                                                                 mi->colors, &mi->npixels, True,
+                                                                                 &mi->writable_p, True);
+                                       swirl->colours = mi->npixels;
+#endif /* STANDALONE */
+
+                                       /* start again */
+                                       init_swirl(mi);
+                               } else
+                                       /* decrement the counter */
+                                       swirl->start_again--;
+                       }
+               }
+       }
+}
+
+/****************************************************************/
+
+void
+release_swirl(ModeInfo * mi)
+{
+       /* does the swirls array exist? */
+       if (swirls != NULL) {
+               int         i;
+
+               /* free them all */
+               for (i = 0; i < MI_NUM_SCREENS(mi); i++) {
+                       SWIRL_P     swirl = &(swirls[i]);
+
+                       if (swirl->cmap != (Colormap) NULL)
+                               XFreeColormap(MI_DISPLAY(mi), swirl->cmap);
+                       if (swirl->rgb_values != NULL)
+                               XFree((void *) swirl->rgb_values);
+                       if (swirl->ximage != NULL)
+                               XDestroyImage(swirl->ximage);
+                       if (swirl->knots)
+                               (void) free((void *) swirl->knots);
+               }
+               /* deallocate an array, one entry for each screen */
+               (void) free((void *) swirls);
+               swirls = NULL;
+       }
+}
+
+/****************************************************************/
+
+void
+refresh_swirl(ModeInfo * mi)
+{
+       SWIRL_P     swirl = &(swirls[MI_SCREEN(mi)]);
+
+       if (swirl->started) {
+               if (swirl->drawing)
+                       swirl->resolution = swirl->resolution + 1;
+               swirl->drawing = False;
+       }
+}
diff --git a/hacks/swirl.man b/hacks/swirl.man
new file mode 100644 (file)
index 0000000..c36733f
--- /dev/null
@@ -0,0 +1,64 @@
+.TH XScreenSaver 1 "13-May-97" "X Version 11"
+.SH NAME
+swirl - draws swirly color-cycling patterns
+.SH SYNOPSIS
+.B swirl
+[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-ncolors \fIinteger\fP] [\-delay \fImicroseconds\fP] [\-cycles \fIinteger\fP] [\-count \fIinteger\fP]
+
+.SH DESCRIPTION
+The \fIswirl\fP program draws swirly color-cycling patterns.
+.SH OPTIONS
+.I swirl
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window.  This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-mono 
+If on a color display, pretend we're on a monochrome display.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use.  Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-ncolors \fIinteger\fP
+How many colors should be used (if possible).  Default 200.
+.TP 8
+.B \-cycles \fIinteger\fP
+
+.TP 8
+.B \-count \fIinteger\fP
+
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1),
+.BR xlock (1)
+.SH COPYRIGHT
+Copyright \(co 1994 M. Dobie.
+
+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. 
+
+.SH AUTHOR
+M.Dobie <mrd@ecs.soton.ac.uk>, 1994.
+
+Ability to run standalone or with \fIxscreensaver\fP added by 
+Jamie Zawinski <jwz@jwz.org>, 13-May-97.
diff --git a/hacks/t3d.c b/hacks/t3d.c
new file mode 100644 (file)
index 0000000..698aad3
--- /dev/null
@@ -0,0 +1,970 @@
+/* t3d -- Flying Balls Clock Demo
+   by Bernd Paysan , paysan@informatik.tu-muenchen.de
+
+   Copy, modify, and distribute T3D either under GPL  version 2 or newer, 
+   or under the standard MIT/X license notice.
+
+  partly based on flying balls demo by Georg Acher, 
+  acher@informatik.tu-muenchen.de
+  (developed on HP9000/720 (55 MIPS,20 MFLOPS) )
+  NO warranty at all ! Complaints to /dev/null !
+
+  4-Jan-99 jwz@jwz.org -- adapted to xscreensaver framework, to take advantage
+                          of the command-line options provided by screenhack.c.
+*/
+
+#define FASTDRAW
+#define FASTCOPY
+#undef USE_POLYGON
+
+#include <stdio.h>
+#include <math.h>
+#include <time.h> /* for localtime() and gettimeofday() */
+
+#include "screenhack.h"
+
+
+static int maxk=34;
+
+#define   WIDTH      200
+#define   HEIGHT     200
+#define   norm       20.0
+
+int timewait=40000;
+
+#define   ROOT       0x1
+#define PI M_PI
+#define TWOPI 2*M_PI
+
+#define MIN(i,j) ((i)<(j)?(i):(j))
+
+#define kmax ((minutes?60:24))
+/* Anzahl der Kugeln */
+#define sines 52
+/* Werte in der Sinus-Tabelle */
+/*-----------------------------------------------------------------*/
+#define setink(inkcolor) \
+       XSetForeground (dpy,gc,inkcolor)
+
+#define drawline(xx1,yy1,xx2,yy2) \
+       XDrawLine(dpy,win,gc,xx1,yy1,xx2,yy2) 
+
+#define drawseg(segments,nr_segments) \
+       XDrawSegments(dpy,win,gc,segments,nr_segments) 
+
+
+#define polyfill(ppts,pcount) \
+       XFillPolygon(dpy,win,gc,ppts,pcount,Convex,CoordModeOrigin)
+
+
+#define frac(argument) argument-floor(argument)
+
+#undef ABS
+#define ABS(x) ((x)<0.0 ? -(x) : (x))
+
+static Colormap cmap;
+/* static XColor gray1; */
+static double r=1.0,g=1.0,b=1.0;
+static double hue=0.0,sat=0.0,val=1.0;
+
+typedef struct {
+  double x,y,z,r,d,r1;
+  int x1,y1;
+} kugeldat;
+
+/* Felder fuer 3D */
+
+static kugeldat kugeln[100];
+
+static double  a[3],/*m[3],*/am[3],x[3],y[3],v[3];
+static double zoom,speed,zaehler,vspeed/*,AE*/;
+static double vturn/*,aturn*/;
+/* static XPoint track[sines]; */
+static double sinus[sines];
+static double cosinus[sines];
+
+static int startx,starty;
+static double /*magx,magy,*/mag=10;
+/* static double lastx,lasty,lastz; */
+/* static int lastcx,lastcy,lastcz; */
+/* static int move=1; */
+static int minutes=0;
+static int cycl=0;
+static double hsvcycl=0.0;
+static double movef =0.5, wobber=2.0, cycle=6.0;
+
+/* time */
+
+/* static double sec; */
+
+/* Windows */
+static XWindowAttributes xgwa;
+static GC      gc;
+static GC orgc;
+static GC andgc;
+static Window  win;
+/* static Font font; */
+static Display *dpy;
+static int     screen, scrnWidth = WIDTH, scrnHeight = HEIGHT;
+static Pixmap  buffer;
+#define maxfast 100
+static int fastch=50;
+#ifdef FASTDRAW
+#      ifdef FASTCOPY
+#              define sum1ton(a) (((a)*(a)+1)/2)
+#              define fastcw sum1ton(fastch)
+               static Pixmap fastcircles;
+               static Pixmap fastmask;
+#      else
+               static XImage* fastcircles[maxfast];
+               static XImage* fastmask[maxfast];
+#      endif
+static int fastdraw=0;
+#endif
+
+static int scrnW2,scrnH2;
+/* static unsigned short flags = 0; */
+/* static char *text; */
+static XColor colors[64];
+static struct tm *zeit;
+
+static int planes;
+/* compute time */
+
+static double
+gettime (void)
+{
+  struct timeval time1;
+  struct tm *zeit;
+  time_t lt;
+
+#ifdef GETTIMEOFDAY_TWO_ARGS
+  struct timezone zone1;
+  gettimeofday(&time1,&zone1);
+#else
+  gettimeofday(&time1);
+#endif
+  lt = time1.tv_sec;   /* avoid type cast lossage */
+  zeit=localtime(&lt);
+  
+  return (zeit->tm_sec+60*(zeit->tm_min+60*(zeit->tm_hour))
+         + time1.tv_usec*1.0E-6);
+}
+
+/* --------------------COLORMAP---------------------*/ 
+
+static void
+hsv2rgb (double h, double s, double v, double *r, double *g, double *b)
+{
+  h/=360.0;    h=6*(h-floor(h));
+
+  if(s==0.0)
+    {
+      *r=*g=*b=v;
+    }
+  else
+    {  int i=(int)h;
+       double t,u,w;
+       
+       h=h-floor(h);
+       
+       u=v*(s*(1.0-h));
+       w=v*(1.0-s);
+       t=v*(s*h+1.0-s);
+       
+       switch(i)
+         {
+         case 0:       *r=v;   *g=t;   *b=w;   break;
+         case 1:       *r=u;   *g=v;   *b=w;   break;
+         case 2:       *r=w;   *g=v;   *b=t;   break;
+         case 3:       *r=w;   *g=u;   *b=v;   break;
+         case 4:       *r=t;   *g=w;   *b=v;   break;
+         case 5:       *r=v;   *g=w;   *b=u;   break;
+         }
+      }
+#ifdef PRTDBX
+  printf("HSV: %f %f %f to\nRGB: %f %f %f\n",h,s,v,*r,*g,*b);
+#endif
+}
+
+static void
+changeColor (double r, double g, double b)
+{
+  int n,n1;
+  
+  n1=0;
+  for(n=30;n<64;n+=3)
+    {
+      colors[n1].red   =1023+ n*(int)(1024.*r);
+      colors[n1].blue  =1023+ n*(int)(1024.*b);
+      colors[n1].green =1023+ n*(int)(1024.*g);
+      
+      n1++;
+    }
+  
+  XStoreColors (dpy, cmap, colors, 12);
+}
+
+static void 
+initColor (double r, double g, double b)
+{
+  int n,n1;
+  unsigned long pixels[12];
+  unsigned long dummy;
+  
+  cmap = xgwa.colormap;
+  
+  if(hsvcycl!=0.0 && XAllocColorCells(dpy, cmap, 0, &dummy, 0, pixels, 12))
+    {
+      for(n1=0;n1<12;n1++)
+       {
+         colors[n1].pixel=pixels[n1];
+         colors[n1].flags=DoRed | DoGreen | DoBlue;
+       }
+      
+      changeColor(r,g,b);
+    }
+  else
+    {
+      n1=0;
+      for(n=30;n<64;n+=3)
+       {
+         colors[n1].red   =1023+ n*(int)(1024.*r);
+         colors[n1].blue  =1023+ n*(int)(1024.*b);
+         colors[n1].green =1023+ n*(int)(1024.*g);
+         
+         if (!(XAllocColor (dpy, cmap, &colors[n1]))) {
+           (void) fprintf (stderr, "Error:  Cannot allocate colors\n");
+           exit (1);
+         }
+         
+         n1++;
+       }
+    }
+}
+
+/* ----------------WINDOW-------------------*/
+
+static void
+initialize (void)
+{
+  XGCValues *xgc;
+  XGCValues *xorgc;
+  XGCValues *xandgc;
+
+  XGetWindowAttributes (dpy, win, &xgwa);
+  scrnWidth = xgwa.width;
+  scrnHeight = xgwa.height;
+
+  {
+    float f = get_float_resource ("cycle", "Float");
+    if (f <= 0 || f > 60) f = 6.0;
+    cycle = 60.0 / f;
+  }
+  movef = get_float_resource ("move", "Float");
+  wobber = get_float_resource ("wobble", "Float");
+
+  {
+    double magfac = get_float_resource ("mag", "Float");
+    mag *= magfac;
+    fastch=(int)(fastch*magfac);
+  }
+
+  if (get_boolean_resource ("minutes", "Boolean")) {
+    minutes=1; maxk+=60-24;
+  }
+
+  timewait = get_integer_resource ("delay", "Integer");
+  fastch = get_integer_resource ("fast", "Integer");
+  cycl = get_boolean_resource ("colcycle", "Integer");
+  hsvcycl = get_float_resource ("hsvcycle", "Integer");
+
+  {
+    char *s = get_string_resource ("rgb", "RGB");
+    char dummy;
+    if (s && *s)
+      {
+        double rr, gg, bb;
+        if (3 == sscanf (s, "%lf %lf %lf %c", &rr, &gg, &bb, &dummy))
+          r = rr, g = gg, b = bb;
+      }
+    if (s) free (s);
+
+    s = get_string_resource ("hsv", "HSV");
+    if (s && *s)
+      {
+        double hh, ss, vv;
+        if (3 == sscanf (s, "%lf %lf %lf %c", &hh, &ss, &vv, &dummy)) {
+          hue = hh, sat = ss, val = vv;
+          hsv2rgb(hue,sat,val,&r,&g,&b);
+        }
+      }
+    if (s) free (s);
+  }
+
+  if (fastch>maxfast)
+               fastch=maxfast;
+  
+  xgc=( XGCValues *) malloc(sizeof(XGCValues) );
+  xorgc=( XGCValues *) malloc(sizeof(XGCValues) );
+  xandgc=( XGCValues *) malloc(sizeof(XGCValues) );
+
+  screen = screen_number (xgwa.screen);
+  
+  planes=xgwa.depth;
+
+  gc = XCreateGC (dpy, win, 0,  xgc);
+  xorgc->function =GXor;
+  orgc = XCreateGC (dpy, win, GCFunction,  xorgc);
+  xandgc->function =GXandInverted;
+  andgc = XCreateGC (dpy, win, GCFunction,  xandgc);
+  
+  buffer = XCreatePixmap (dpy, win, scrnWidth, scrnHeight,
+                         xgwa.depth); 
+  
+#ifdef DEBUG
+  printf("Time 3D drawing ");
+#ifdef FASTDRAW
+#      ifdef FASTCOPY
+  puts("fast by Pixmap copy");
+#      else
+  puts("fast by XImage copy");
+#      endif
+#else
+  puts("slow");
+#endif
+#endif /* DEBUG */
+  
+#ifdef FASTCOPY
+  fastcircles = XCreatePixmap (dpy, win, fastcw, fastch+1, xgwa.depth);
+  fastmask    = XCreatePixmap (dpy, win, fastcw, fastch+1, xgwa.depth);
+#endif
+  
+  setink(BlackPixel (dpy, screen));
+  XFillRectangle (dpy, buffer     , gc, 0, 0, scrnWidth, scrnHeight);  
+  
+#ifdef FASTCOPY
+  
+  setink(0);
+  XFillRectangle (dpy, fastcircles, gc, 0, 0, fastcw, fastch+1);
+  XFillRectangle (dpy, fastmask   , gc, 0, 0, fastcw, fastch+1);
+  
+#endif
+
+#ifdef PRTDBX
+  printf("move\t%.2f\nwobber\t%.2f\nmag\t%.2f\ncycle\t%.4f\n",
+        movef,wobber,mag/10,cycle);
+  printf("fast\t%i\nmarks\t%i\nwait\t%i\n",fastch,maxk,timewait);
+#endif
+}
+
+static void fill_kugel(int i, Pixmap buf, int setcol);
+
+
+/*------------------------------------------------------------------*/
+static void 
+init_kugel(void)
+{
+  
+#ifdef FASTDRAW
+  int i;
+
+  for(i=0; i<fastch; i++)
+    {
+#      ifdef FASTCOPY
+      kugeln[i].r1=-((double) i)/2 -1;
+      kugeln[i].x1=sum1ton(i);
+      kugeln[i].y1=((double) i)/2 +1;
+      
+      fill_kugel(i,fastcircles,1);
+      setink((1<<MIN(24,xgwa.depth))-1);
+      fill_kugel(i,fastmask,0);
+#      else
+      kugeln[i].r1=-((double) i)/2 -1;
+      kugeln[i].x1=kugeln[i].y1=((double) i)/2 +1;
+      
+      fill_kugel(i,buffer,1);
+      fastcircles[i]=XGetImage(dpy,buffer,0,0,i+2,i+2,(1<<planes)-1,ZPixmap);
+      
+      setink((1<<MIN(24,xgwa.depth))-1);
+      fill_kugel(i,buffer,0);
+      fastmask[i]=XGetImage(dpy,buffer,0,0,i+2,i+2,(1<<planes)-1,ZPixmap);
+      
+      setink(0);
+      XFillRectangle (dpy, buffer     , gc, 0, 0, scrnWidth, scrnHeight);      
+#      endif
+    }
+  fastdraw=1;
+#endif
+}
+
+/* Zeiger zeichnen */
+
+static void
+zeiger(double dist,double rad, double z, double sec, int *q)
+{
+  int i,n;
+  double gratio=sqrt(2.0/(1.0+sqrt(5.0)));
+  
+  n = *q;
+  
+  for(i=0;i<3;i++)
+    {
+      kugeln[n].x=dist*cos(sec);
+      kugeln[n].y=-dist*sin(sec);
+      kugeln[n].z=z;
+      kugeln[n].r=rad;
+      n++;
+
+      dist += rad;
+      rad = rad*gratio;
+    }
+  *q = n;
+}
+
+/*-----------------------------------------------------------------*
+ *                           Uhr zeichnen                          *
+ *-----------------------------------------------------------------*/
+
+static void
+manipulate(double k)
+{
+  double i,l,/*xs,*/ys,zs,mod;
+  double /*persec,*/sec,min,hour;
+  int n;
+  
+  sec=TWOPI*modf(k/60,&mod);
+  min=TWOPI*modf(k/3600,&mod);
+  hour=TWOPI*modf(k/43200,&mod);
+  
+  l=TWOPI*modf(k/300,&mod);
+  i=0.0;
+  for (n=0;n<kmax;n++)
+    {
+      
+      kugeln[n].x=4.0*sin(i);
+      kugeln[n].y=4.0*cos(i);
+      kugeln[n].z=wobber* /* (sin(floor(2+2*l/(PI))*i)*sin(2*l)); */
+       cos((i-sec)*floor(2+5*l/(PI)))*sin(5*l);
+      if(minutes)
+       {
+         kugeln[n].r=/* (1.0+0.3*cos(floor(2+2*l/(PI))*i)*sin(2*l))* */
+           ((n % 5!=0) ? 0.3 : 0.6)*
+             ((n % 15 ==0) ? 1.25 : .75);
+       }
+      else
+       {
+         kugeln[n].r=/* (1.0+0.3*cos(floor(2+2*l/(PI))*i)*sin(2*l))* */
+           ((n & 1) ? 0.5 : 1.0)*
+             ((n % 6==0) ? 1.25 : .75);
+       }
+      i+=TWOPI/kmax;
+    }
+
+  kugeln[n].x=0.0;
+  kugeln[n].y=0.0;
+  kugeln[n].z=0.0;
+  kugeln[n].r=2.0+cos(TWOPI*modf(k,&mod))/2;
+  n++;
+  
+  zeiger(2.0,0.75,-2.0,sec,&n);
+  zeiger(1.0,1.0,-1.5,min,&n);
+  zeiger(0.0,1.5,-1.0,hour,&n);
+  
+  for(n=0;n<maxk;n++)
+    {
+      ys=kugeln[n].y*cos(movef*sin(cycle*sec))+
+       kugeln[n].z*sin(movef*sin(cycle*sec));
+      zs=-kugeln[n].y*sin(movef*sin(cycle*sec))+
+       kugeln[n].z*cos(movef*sin(cycle*sec));
+      kugeln[n].y=ys;
+      kugeln[n].z=zs;
+    }
+}
+/*------------------------------------------------------------------*/
+static void
+t3d_sort(int l, int r)
+{
+  int i,j;
+  kugeldat ex;
+  double x;
+  
+  i=l;j=r;
+  x=kugeln[(l+r)/2].d;
+  while(1)
+    {
+      while(kugeln[i].d>x) i++;
+      while(x>kugeln[j].d) j--;
+      if (i<=j)
+       {
+         ex=kugeln[i];kugeln[i]=kugeln[j];kugeln[j]=ex;
+         i++;j--;
+       }
+      if (i>j) break;
+    }
+  if (l<j) t3d_sort(l,j);
+  if (i<r) t3d_sort (i,r);
+}
+
+/*------------------------------------------------------------------*/
+static void
+fill_kugel(int i, Pixmap buf, int setcol)
+{
+  double ra;
+  int m,col,inc=1,inr=3,d;
+  d=(int)((ABS(kugeln[i].r1)*2));
+  if (d==0) d=1;
+  
+#ifdef FASTDRAW
+  if(fastdraw && d<fastch)
+    {
+#      ifdef FASTCOPY
+      XCopyArea(dpy, fastmask, buf, andgc, sum1ton(d)-(d+1)/2, 1,d,d,
+               (int)(kugeln[i].x1)-d/2, (int)(kugeln[i].y1)-d/2);
+      XCopyArea(dpy, fastcircles, buf, orgc, sum1ton(d)-(d+1)/2, 1,d,d,
+               (int)(kugeln[i].x1)-d/2, (int)(kugeln[i].y1)-d/2);
+#      else
+      XPutImage(dpy, buf, andgc, fastmask[d-1], 0, 0,
+               (int)(kugeln[i].x1)-d/2, (int)(kugeln[i].y1)-d/2, d, d);
+      XPutImage(dpy, buf, orgc, fastcircles[d-1], 0, 0,
+               (int)(kugeln[i].x1)-d/2, (int)(kugeln[i].y1)-d/2, d, d);
+#      endif
+    }
+  else
+#endif
+    {
+      if(ABS(kugeln[i].r1)<6.0) inr=9;
+      
+      for (m=0;m<=28;m+=inr)
+       {
+         ra=kugeln[i].r1*sqrt(1-m*m/(28.0*28.0));
+#ifdef PRTDBX
+         printf("Radius: %f\n",ra);
+#endif
+         if(-ra< 3.0) inc=14;
+         else if(-ra< 6.0) inc=8;
+         else if(-ra<20.0) inc=4;
+         else if(-ra<40.0) inc=2;
+         if(setcol)
+           {
+             if (m==27) col=33;
+             else
+               col=(int)(m);
+             if (col>33) col=33;       col/=3;
+             setink(colors[col].pixel);
+           }
+
+#ifdef USE_POLYGON
+          {
+            int n, nr;
+         for (n=0,nr=0;n<=sines-1;n+=inc,nr++)
+           {
+             track[nr].x=kugeln[i].x1+(int)(ra*sinus[n])+(kugeln[i].r1-ra)/2;
+             track[nr].y=kugeln[i].y1+(int)(ra*cosinus[n])+(kugeln[i].r1-ra)/2;
+           }
+         XFillPolygon(dpy,buf,gc,track,nr,Convex,CoordModeOrigin);
+          }
+#else /* Use XFillArc */
+         XFillArc(dpy, buf, gc,
+                  (int)(kugeln[i].x1+(kugeln[i].r1+ra)/2),
+                  (int)(kugeln[i].y1+(kugeln[i].r1+ra)/2),
+                  (int)-(2*ra+1), (int)-(2*ra+1), 0, 360*64);
+#endif
+       }
+    }
+}
+
+/*------------------------------------------------------------------*/
+
+static void
+init_3d(void)
+{
+  double i;
+  int n=0;
+  
+  a[0]=0.0;
+  a[1]=0.0;
+  a[2]=-10.0;
+  
+  x[0]=10.0;
+  x[1]=0.0;
+  x[2]=0.0;
+  
+  y[0]=0.0;
+  y[1]=10.0;
+  y[2]=0.0;
+  
+  
+  zoom=-10.0;
+  speed=.0;
+  
+  for (i=0.0;n<sines;i+=TWOPI/sines,n++)
+    {
+      sinus[n]=sin(i);
+      cosinus[n]=cos(i);
+    }
+}
+/*------------------------------------------------------------------*/
+
+
+static void
+vektorprodukt(double feld1[], double feld2[], double feld3[])
+{
+  feld3[0]=feld1[1]*feld2[2]-feld1[2]*feld2[1];
+  feld3[1]=feld1[2]*feld2[0]-feld1[0]*feld2[2];
+  feld3[2]=feld1[0]*feld2[1]-feld1[1]*feld2[0];
+}
+/*------------------------------------------------------------------*/
+static void
+turn(double feld1[], double feld2[], double winkel)
+{
+  double temp[3];
+  double s,ca,sa,sx1,sx2,sx3;
+  
+  vektorprodukt(feld1,feld2,temp);
+  
+  s=feld1[0]*feld2[0]+feld1[1]*feld2[1]+feld1[2]*feld2[2];
+  
+  sx1=s*feld2[0];
+  sx2=s*feld2[1];
+  sx3=s*feld2[2];
+  sa=sin(winkel);ca=cos(winkel);
+  feld1[0]=ca*(feld1[0]-sx1)+sa*temp[0]+sx1;
+  feld1[1]=ca*(feld1[1]-sx2)+sa*temp[1]+sx2;
+  feld1[2]=ca*(feld1[2]-sx3)+sa*temp[2]+sx3;
+}
+/*------------------------------------------------------------------*/
+
+/* 1: Blickrichtung v;3:Ebenenmittelpunkt m 
+   double feld1[],feld3[]; */
+static void 
+viewpoint(void)
+{
+  am[0]=-zoom*v[0];
+  am[1]=-zoom*v[1];
+  am[2]=-zoom*v[2];
+  
+  zaehler=norm*norm*zoom;
+}
+/*------------------------------------------------------------------*/
+static void 
+projektion(void)
+{
+  double c1[3],c2[3],k[3],x1,y1;
+  double cno,cnorm/*,magnit*/;
+  int i;
+  
+  for (i=0;i<maxk;i++)
+    {
+      c1[0]=kugeln[i].x-a[0];
+      c1[1]=kugeln[i].y-a[1];
+      c1[2]=kugeln[i].z-a[2];
+      cnorm=sqrt(c1[0]*c1[0]+c1[1]*c1[1]+c1[2]*c1[2]);
+      
+      c2[0]=c1[0];
+      c2[1]=c1[1];
+      c2[2]=c1[2];
+      
+      cno=c2[0]*v[0]+c2[1]*v[1]+c2[2]*v[2];
+      kugeln[i].d=cnorm;
+      if (cno<0) kugeln[i].d=-20.0;
+      
+      
+      kugeln[i].r1=(mag*zoom*kugeln[i].r/cnorm);
+      
+      c2[0]=v[0]/cno;
+      c2[1]=v[1]/cno;
+      c2[2]=v[2]/cno;
+      
+      vektorprodukt(c2,c1,k);
+
+      
+      x1=(startx+(x[0]*k[0]+x[1]*k[1]+x[2]*k[2])*mag);
+      y1=(starty-(y[0]*k[0]+y[1]*k[1]+y[2]*k[2])*mag);
+      if(   (x1>-2000.0)
+        && (x1<scrnWidth+2000.0)
+        && (y1>-2000.0)
+        && (y1<scrnHeight+2000.0))
+       {
+         kugeln[i].x1=(int)x1;
+         kugeln[i].y1=(int)y1;
+       }
+      else
+       {
+         kugeln[i].x1=0;
+         kugeln[i].y1=0;
+         kugeln[i].d=-20.0;
+       }
+    }
+}
+
+/*---------- event-handler ----------------*/
+static void
+event_handler(void)
+{
+  while (XEventsQueued (dpy, QueuedAfterReading))
+    {
+      XEvent event;
+      
+      XNextEvent (dpy, &event);
+      switch (event.type)
+       {
+       case ConfigureNotify:
+         if (event.xconfigure.width != scrnWidth ||
+             event.xconfigure.height != scrnHeight)
+           {
+             XFreePixmap (dpy, buffer); 
+             scrnWidth = event.xconfigure.width;
+             scrnHeight = event.xconfigure.height;
+             buffer = XCreatePixmap (dpy, win, scrnWidth, scrnHeight,
+                                      xgwa.depth);
+             
+             startx=scrnWidth/2;
+             starty=scrnHeight/2;
+             scrnH2=startx;
+             scrnW2=starty;
+           };
+          break;
+
+       case KeyPress:
+         {
+           KeySym kpr=XKeycodeToKeysym(dpy,event.xkey.keycode,0);
+
+            switch (kpr)
+              {
+              case 's': case 'S':
+                vspeed = 0.5;
+                break;
+              case 'a': case 'A':
+                vspeed = -0.3;
+                break;
+
+              case '0':
+                speed = 0;
+                vspeed = 0;
+                break;
+
+              case 'z': case 'Z':
+                mag *= 1.02;
+                break;
+
+              case 'x': case 'X':
+                mag /= 1.02;
+                break;
+
+              default:
+                screenhack_handle_event (dpy, &event);
+                break;
+              }
+          }
+
+        case ButtonPress: case ButtonRelease:
+          break;
+
+       default:
+          screenhack_handle_event (dpy, &event);
+         break;
+       }
+    }
+  /*nap(40);-Ersatz*/ 
+  {
+    struct timeval timeout;
+    timeout.tv_sec=timewait/1000000;
+    timeout.tv_usec=timewait%1000000;
+    (void)select(0,0,0,0,&timeout);
+  }
+}
+
+
+/*-------------------------------------------------*/
+
+char *progclass = "T3D";
+
+char *defaults [] = {
+  ".background:        black",
+  ".foreground:        white",
+  "*move:      0.5",
+  "*wobble:    2.0",
+  "*cycle:     10.0",
+  "*mag:       1",
+  "*minutes:   False",
+  "*delay:      40000",
+  "*fast:      50",
+  "*ccycle:    False",
+  "*hsvcycle:  0.0",
+  0
+};
+
+XrmOptionDescRec options [] = {
+  { "-move",           ".move",        XrmoptionSepArg, 0 },
+  { "-wobble",         ".wobble",      XrmoptionSepArg, 0 },
+  { "-cycle",          ".cycle",       XrmoptionSepArg, 0 },
+  { "-mag",            ".mag",         XrmoptionSepArg, 0 },
+  { "-minutes",                ".minutes",     XrmoptionSepArg, 0 },
+  { "-delay",          ".delay",       XrmoptionSepArg, 0 },
+  { "-fast",           ".fast",        XrmoptionSepArg, 0 },
+  { "-colcycle",       ".colcycle",    XrmoptionSepArg, 0 },
+  { "-hsvcycle",       ".hsvcycle",    XrmoptionSepArg, 0 },
+  { "-rgb",            ".rgb",         XrmoptionSepArg, 0 },
+  { "-hsv",            ".hsv",         XrmoptionSepArg, 0 },
+  { 0, 0, 0, 0 }
+};
+
+
+void
+screenhack (Display *d, Window w)
+{
+  Window junk_win,in_win;
+  
+  int px,py,junk/*,wai*/;
+  unsigned int kb;
+/*  int act,act1,tc;*/
+  double vnorm;
+  /* double var=0.0; */
+  int color=0/*, dir=1*/;
+  
+  dpy = d;
+  win = w;
+  initialize();
+  
+  initColor(r,g,b);
+  init_3d();
+  zeit=(struct tm *)malloc(sizeof(struct tm));
+  init_kugel();
+  
+  startx=scrnWidth/2;
+  starty=scrnHeight/2;
+  scrnH2=startx;
+  scrnW2=starty;
+  vspeed=0;
+  
+  
+  vektorprodukt(x,y,v);
+  viewpoint(/*m,v*/);
+  
+  setink (BlackPixel (dpy, screen));
+  XFillRectangle (dpy, win, gc, 0, 0, scrnWidth, scrnHeight);
+  XQueryPointer (dpy, win, &junk_win, &junk_win, &junk, &junk,
+                &px, &py, &kb);
+  
+  for (;;)
+    {  double dtime;
+       
+       /*--------------- Zeichenteil --------------*/
+
+       event_handler();
+       
+       vektorprodukt(x,y,v);
+       
+       vnorm=sqrt(v[0]*v[0]+v[1]*v[1]+v[2]*v[2]);
+       v[0]=v[0]*norm/vnorm;
+       v[1]=v[1]*norm/vnorm;
+       v[2]=v[2]*norm/vnorm;
+       vnorm=sqrt(x[0]*x[0]+x[1]*x[1]+x[2]*x[2]);
+       x[0]=x[0]*norm/vnorm;
+       x[1]=x[1]*norm/vnorm;
+       x[2]=x[2]*norm/vnorm;
+       vnorm=sqrt(y[0]*y[0]+y[1]*y[1]+y[2]*y[2]);
+       y[0]=y[0]*norm/vnorm;
+       y[1]=y[1]*norm/vnorm;
+       y[2]=y[2]*norm/vnorm;
+       
+       projektion();
+       t3d_sort (0,maxk-1);
+       
+       dtime=gettime();
+       
+       if(cycl)
+         {
+           color=(int)(64.0*(dtime/60-floor(dtime/60)))-32;
+           
+           if(color<0)
+             color=-color;
+           
+           setink(colors[color/3].pixel);
+         }
+       else
+         setink(BlackPixel (dpy, screen));
+       
+       XFillRectangle(dpy,buffer,gc,0,0,scrnWidth,scrnHeight);
+       
+       {
+         int i;
+         
+         manipulate(dtime);
+         
+         for (i=0;i<maxk;i++)
+           {
+             if (kugeln[i].d>0.0)
+               fill_kugel(i,buffer,1);
+           }
+       }
+
+       XSync(dpy,0);
+       
+       /* manipulate(gettime());
+          var+=PI/500;
+          if (var>=TWOPI) var=PI/500; */
+       
+       /*event_handler();*/
+       
+       if(hsvcycl!=0.0)
+         {
+           dtime=hsvcycl*dtime/10.0+hue/360.0;
+           dtime=360*(dtime-floor(dtime));
+           
+           hsv2rgb(dtime,sat,val,&r,&g,&b);
+           changeColor(r,g,b);
+         }
+
+       XCopyArea (dpy, buffer, win, gc, 0, 0, scrnWidth, scrnHeight, 0, 0);
+       
+       
+       /*-------------------------------------------------*/
+       XSync(dpy,0);
+       
+       event_handler();
+       
+       (void)(XQueryPointer (dpy, win, &junk_win, &in_win, &junk, &junk,
+                             &px, &py, &kb));
+       
+       if ((px>0)&&(px<scrnWidth)&&(py>0)&&(py<scrnHeight) )           
+         {
+           if ((px !=startx)&&(kb&Button2Mask))
+             {
+               /* printf("y=(%f,%f,%f)",y[0],y[1],y[2]);*/
+               turn(y,x,((double)(px-startx))/(8000*mag));
+               /* printf("->(%f,%f,%f)\n",y[0],y[1],y[2]);*/
+             }
+           if ((py !=starty)&&(kb&Button2Mask)) 
+             {
+               /* printf("x=(%f,%f,%f)",x[0],x[1],x[2]);*/
+               turn(x,y,((double)(py-starty))/(-8000*mag));
+               /* printf("->(%f,%f,%f)\n",x[0],x[1],x[2]);*/
+             }
+           if ((kb&Button1Mask)) 
+             {
+               if (vturn==0.0) vturn=.005; else if (vturn<2)  vturn+=.01;
+               turn(x,v,.002*vturn);
+               turn(y,v,.002*vturn); 
+             }
+           if ((kb&Button3Mask)) 
+             {
+               if (vturn==0.0) vturn=.005; else if (vturn<2) vturn+=.01;
+               turn(x,v,-.002*vturn);
+               turn(y,v,-.002*vturn);
+             }
+         }
+       if (!(kb&Button1Mask)&&!(kb&Button3Mask)) 
+         vturn=0;
+       
+       speed=speed+speed*vspeed;
+       if ((speed<0.0000001) &&(vspeed>0.000001)) speed=0.000001;
+       vspeed=.1*vspeed;
+       if (speed>0.01) speed=.01;
+       a[0]=a[0]+speed*v[0];
+       a[1]=a[1]+speed*v[1];
+       a[2]=a[2]+speed*v[2];
+      }
+}
diff --git a/hacks/t3d.man b/hacks/t3d.man
new file mode 100644 (file)
index 0000000..54ef3fd
--- /dev/null
@@ -0,0 +1,129 @@
+.TH t3d 1 "Version 1.1" "Time 3D"
+.SH NAME
+t3d \- clock using flying balls to display the time
+.SH SYNOPSIS
+t3d [ \f2 options\f1 ]...
+.SH DESCRIPTION
+.PP
+Time 3D is a clock. It uses flying balls to display the time. This
+balls move and wobble around to give you the impression your
+graphic workstation with its many XStones is doing something.
+.PP
+t3d uses mouse and keyboard to let you fly through the balls. Hit
+.B S
+to speed up, 
+.B A
+to slow down,
+.B Z
+to zoom in and
+.B X
+to zoom out.
+Use the
+.B left mouse button
+to rotate to the left and the
+.B right mouse button
+to rotate the view to the right. Use the
+.B middle mouse button
+to change the optical axis and the moving direction.
+.B 0
+(zero) will stop you.
+.B Q
+quits.
+.PP
+.SH OPTIONS
+.TP
+.BI "-move " "factor"
+Modifies the direction move of t3d. The clock looks 30 degrees*
+.I factor
+to the left and to the right periodically.
+.TP
+.BI "-wobble " "factor"
+Modifies the wobbling (sounds nice :-) of t3d by multiplying the
+default deformation of the clock with
+.I factor.
+.TP
+.B -minutes
+Shows one small ball for every minute, instead of one for every 2.5 minutes.
+.TP
+.BI "-mag " "factor"
+Changes the magnification of t3d. By default, t3d draws a 200x200 image.
+A .I factor
+of 2 means, it will use a 400x400 image.
+.TP
+.BI "-cycle " "period"
+Sets the moving cycle to
+.I period
+seconds. By default, this value is 10 seconds.
+.TP
+.BI "-wait " "microsec"
+Inserts a wait after drawing one view of the clock. By default, t3d waits
+40 ms after each drawing. This helps you to keep the performance loss
+small.
+.TP
+.BI "-fast " "precalc_radius"
+t3d uses bitmap copy to draw precalculated balls. You can specify the radius
+in pixels up to which t3d should precalculate balls. t3d will set a useful
+range by itself using the magnification when it is started.
+.TP
+.B -colcycle
+Draws cyclic the color scale used for the balls in the background instead
+of the normal black.
+.TP
+.BI "-rgb " "red green blue"
+Selects the color in RGB color space of the lightning spot on the balls.
+All the other colors used for balls or
+.B -colcycle
+are less intensive colors of the same hue and saturation. All values
+in range of 0 to 1.
+.TP
+.BI "-hsv " "hue saturation value"
+Selects the color in HSV color space.
+.I hue
+is in degrees from 0 to 360, all other values in range from 0 to 1. It gives
+nice but rather unpredictable results, if you use a saturation of e.g. 2.
+Try it at your own risk.
+.TP
+.BI "-hsvcycle " "speed"
+Rotates the hue axis every 10 seconds*
+.I speed.
+.TP
+.B -help
+Prints a short usage message.
+
+.PP
+.SH AUTHOR
+.PP
+Bernd Paysan
+
+Email: bernd.paysan@gmx.de
+
+Hacked on by jwz@jwz.org for xscreensaver.
+
+.SH ACKNOWLEDGEMENT
+.PP
+Acknowledgement to Georg Acher, who wrote the initial program displaying
+balls.
+
+.SH COPYING
+.PP
+Copy, modify, and distribute T3D either under GPL version 2 or newer, or
+under the standard MIT/X license notice.
+
+.SH DISCLAIMER
+.PP
+T3D is not related to T3D(tm), the massive parallel Alpha--based
+supercomputer from Cray Research. T3D's name was invented in 1991,
+years before the project at Cray Research started. There is no
+relation from T3D to Cray's T3D, even the balls surrounding T3D on
+some posters weren't an inspiration for T3D. I don't know anything
+about the other way round.
+
+The programming style of T3D isn't intented as example of good style,
+but as example of how a fast prototyped demo may look like. T3D wasn't
+created to be useful, it was created to be nice.
+
+.SH KNOWN BUGS
+.PP
+There are no known bugs in T3D. Maybe there are bugs in X. Slight
+changes in the T3D sources are known to show these bugs, e.g. if
+you remove the (int) casting at the XFillArc x,y,w,h-coordinates...
diff --git a/hacks/triangle.c b/hacks/triangle.c
new file mode 100644 (file)
index 0000000..d8be189
--- /dev/null
@@ -0,0 +1,362 @@
+/* -*- Mode: C; tab-width: 4 -*- */
+/* triangle --- create a triangle-mountain */
+
+#if !defined( lint ) && !defined( SABER )
+static const char sccsid[] = "@(#)triangle.c   4.04 97/07/28 xlockmore";
+
+#endif
+
+/*-
+ * Copyright (c) 1995 by Tobias Gloth
+ *
+ * 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.
+ *
+ * This file is provided AS IS with no warranties of any kind.  The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof.  In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * Revision History:
+ * 10-May-97: Compatible with xscreensaver
+ * 10-Mar-96: re-arranged and re-formatted the code for appearance and
+ *            to make common subroutines.  Simplified.
+ *               Ron Hitchens <ron@idiom.com>
+ * 07-Mar-96: Removed internal delay code, set MI_PAUSE(mi) for inter-scene
+ *            delays.  No other delays are needed here.
+ *            Made pause time sensitive to value of cycles (in 10ths of a
+ *            second).  Removed (hopefully) all references to globals.
+ *               Ron Hitchens <ron@idiom.com>
+ * 27-Feb-96: Undid the changes listed below.  Added ModeInfo argument.
+ *               Implemented delay between scenes using the MI_PAUSE(mi)
+ *            scheme.  Ron Hitchens <ron@idiom.com>
+ * 27-Dec-95: Ron Hitchens <ron@idiom.com>
+ *            Modified logic of draw_triangle() to provide a delay
+ *            (sensitive to the value of cycles) between each iteration.
+ *            Because this mode is so compute intensive, when the new
+ *            event loop adjusted the delay to compensate, this mode had
+ *            almost no delay time left.  This change pauses between each
+ *            new landscape, but could still be done better (it is not
+ *            sensitive to input events while drawing, for example).
+ * 03-Nov-95: Many changes (hopefully some good ones) by David Bagley
+ * 01-Oct-95: Written by Tobias Gloth
+ */
+
+#ifdef STANDALONE
+# define PROGCLASS "Triangle"
+# define HACK_INIT init_triangle
+# define HACK_DRAW draw_triangle
+# define triangle_opts xlockmore_opts
+# define DEFAULTS      "*delay: 10000 \n"      \
+                                       "*ncolors: 128 \n"
+# define SMOOTH_COLORS
+# include "xlockmore.h"                /* in xscreensaver distribution */
+#else /* STANDALONE */
+# include "xlock.h"                    /* in xlockmore distribution */
+#endif /* STANDALONE */
+
+ModeSpecOpt triangle_opts =
+{0, NULL, 0, NULL, NULL};
+
+#define MAX_STEPS 8
+#define MAX_SIZE  (1<<MAX_STEPS)
+#define MAX_LEVELS 1000
+
+#define DELTA  0.4
+#define LEFT   (-0.25)
+#define RIGHT  1.25
+#define TOP    0.3
+#define BOTTOM 1.0
+#define BLUE   45              /* Just the right shade of blue */
+
+#define BACKFACE_REMOVAL
+
+#define DISPLACE(h,d) ((h)/2+LRAND()/(MAXRAND/(2*(d)+1))-d)
+
+typedef struct {
+       int         width;
+       int         height;
+       int         size;
+       int         steps;
+       int         stage;
+       int         init_now;
+       int         fast;
+       int         i;
+       int         j;
+       int         d;
+       short       level[MAX_LEVELS];
+       int         xpos[2 * MAX_SIZE + 1];
+       int         ypos[MAX_SIZE + 1];
+       short       H[(MAX_SIZE + 1) * (MAX_SIZE + 2) / 2];
+       short      *h[MAX_SIZE + 1];
+       short       delta[MAX_STEPS];
+} trianglestruct;
+
+static trianglestruct *triangles = NULL;
+
+static
+void
+draw_atriangle(ModeInfo * mi, XPoint * p, int y_0, int y_1, int y_2, double dinv)
+{
+       Display    *display = MI_DISPLAY(mi);
+       Window      window = MI_WINDOW(mi);
+       GC          gc = MI_GC(mi);
+
+       if (MI_NPIXELS(mi) > 2) {       /* color */
+               int         dmax, dmin;
+               long        color;
+
+               dmin = MIN(y_0, y_1);
+               dmin = MIN(dmin, y_2);
+               dmax = MAX(y_0, y_1);
+               dmax = MAX(dmax, y_2);
+
+               if (dmax == 0) {
+                       color = BLUE;
+               } else {
+                       color = MI_NPIXELS(mi) -
+                               (int) ((double) MI_NPIXELS(mi) / M_PI_2 * atan(dinv * (dmax - dmin)));
+               }
+
+               XSetForeground(display, gc, MI_PIXEL(mi, color % MI_NPIXELS(mi)));
+               XFillPolygon(display, window, gc, p, 3, Convex, CoordModeOrigin);
+       } else {
+               /* mono */
+#ifdef BACKFACE_REMOVAL
+               XSetForeground(display, gc, MI_WIN_BLACK_PIXEL(mi));
+               XFillPolygon(display, window, gc, p, 3, Convex, CoordModeOrigin);
+#endif
+               XSetForeground(display, gc, MI_WIN_WHITE_PIXEL(mi));
+               XDrawLine(display, window, gc, p[0].x, p[0].y, p[1].x, p[1].y);
+               XDrawLine(display, window, gc, p[1].x, p[1].y, p[2].x, p[2].y);
+               XDrawLine(display, window, gc, p[2].x, p[2].y, p[0].x, p[0].y);
+       }
+}
+
+static
+void
+calc_points1(trianglestruct * tp, int d, int *y0_p, int *y1_p, int *y2_p, XPoint * p)
+{
+       *y0_p = tp->level[MAX(tp->h[tp->i][tp->j], 0)];
+       *y1_p = tp->level[MAX(tp->h[tp->i + d][tp->j], 0)];
+       *y2_p = tp->level[MAX(tp->h[tp->i][tp->j + d], 0)];
+
+       p[0].x = tp->xpos[2 * tp->i + tp->j];
+       p[1].x = tp->xpos[2 * (tp->i + d) + tp->j];
+       p[2].x = tp->xpos[2 * tp->i + (tp->j + d)];
+
+       p[0].y = tp->ypos[tp->j] - *y0_p;
+       p[1].y = tp->ypos[tp->j] - *y1_p;
+       p[2].y = tp->ypos[tp->j + d] - *y2_p;
+}
+
+static
+void
+calc_points2(trianglestruct * tp, int d, int *y0_p, int *y1_p, int *y2_p, XPoint * p)
+{
+       *y0_p = tp->level[MAX(tp->h[tp->i + d][tp->j], 0)];
+       *y1_p = tp->level[MAX(tp->h[tp->i + d][tp->j + d], 0)];
+       *y2_p = tp->level[MAX(tp->h[tp->i][tp->j + d], 0)];
+
+       p[0].x = tp->xpos[2 * (tp->i + d) + tp->j];
+       p[1].x = tp->xpos[2 * (tp->i + d) + (tp->j + d)];
+       p[2].x = tp->xpos[2 * tp->i + (tp->j + d)];
+
+       p[0].y = tp->ypos[tp->j] - *y0_p;
+       p[1].y = tp->ypos[tp->j + d] - *y1_p;
+       p[2].y = tp->ypos[tp->j + d] - *y2_p;
+}
+
+
+static
+void
+draw_mesh(ModeInfo * mi, trianglestruct * tp, int d, int count)
+{
+       XPoint      p[3];
+       int         first = 1;
+       int         y_0, y_1, y_2;
+       double      dinv = 0.2 / d;
+
+       if ((tp->j == 0) && (tp->i == 0)) {
+#if 0 /* jwz */
+               XClearWindow(MI_DISPLAY(mi), MI_WINDOW(mi));
+#else
+               {
+                 int x = 0;
+                 int y = 0;
+                 int x2 = MI_WIN_WIDTH(mi);
+                 int y2 = tp->ypos[0];
+                 XSetForeground(MI_DISPLAY(mi), MI_GC(mi), MI_WIN_BLACK_PIXEL(mi));
+                 XFillRectangle(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi),
+                                                x, y, x2, y2);
+               }
+#endif
+       }
+       for (; (tp->j < tp->size) && (count > 0); tp->j += ((count) ? d : 0)) {
+               for (tp->i = (first) ? tp->i : 0, first = 0;
+                    (tp->i < MAX_SIZE - tp->j) && (count > 0);
+                    tp->i += d, count--) {
+                       if (tp->i + tp->j < tp->size) {
+                               calc_points1(tp, d, &y_0, &y_1, &y_2, p);
+                               draw_atriangle(mi, p, y_0, y_1, y_2, dinv);
+                       }
+                       if (tp->i + tp->j + d < tp->size) {
+                               calc_points2(tp, d, &y_0, &y_1, &y_2, p);
+                               draw_atriangle(mi, p, y_0, y_1, y_2, dinv);
+                       }
+               }
+       }
+
+       if (tp->j == tp->size) {
+               tp->init_now = 1;
+       }
+}
+
+void
+init_triangle(ModeInfo * mi)
+{
+       trianglestruct *tp;
+       short      *tmp;
+       int         i, dim, one;
+
+       if (triangles == NULL) {
+               if ((triangles = (trianglestruct *) calloc(MI_NUM_SCREENS(mi),
+                                          sizeof (trianglestruct))) == NULL)
+                       return;
+       }
+       tp = &triangles[MI_SCREEN(mi)];
+
+       tp->width = MI_WIN_WIDTH(mi);
+       tp->height = MI_WIN_HEIGHT(mi);
+       tp->init_now = 1;
+       tp->fast = 2;
+
+       XClearWindow(MI_DISPLAY(mi), MI_WINDOW(mi));
+
+
+
+       tp->steps = MAX_STEPS;
+       do {
+               tp->size = 1 << --tp->steps;
+       } while (tp->size * 5 > tp->width);
+       tmp = tp->H;
+       for (i = 0; i < tp->size + 1; i++) {
+               tp->h[i] = tmp;
+               tmp += (tp->size) + 1 - i;
+       }
+
+       tp->stage = -1;
+       dim = MIN(tp->width, tp->height);
+
+       for (i = 0; i < 2 * tp->size + 1; i++) {
+               tp->xpos[i] = (short) ((((double) i)
+                        / ((double) (2 * tp->size)) * (RIGHT - LEFT) + LEFT)
+                                      * dim) + (tp->width - dim) / 2;
+       }
+
+       for (i = 0; i < (tp->size + 1); i++) {
+               tp->ypos[i] = (short) ((((double) i)
+                        / ((double) tp->size) * (BOTTOM - TOP) + TOP) * dim)
+                       + (tp->height - dim) / 2;
+       }
+
+       for (i = 0; i < tp->steps; i++) {
+               tp->delta[i] = ((short) (DELTA * dim)) >> i;
+       }
+
+       one = tp->delta[0];
+
+       if (one > 0)
+               for (i = 0; i < MAX_LEVELS; i++) {
+                       tp->level[i] = (i * i) / one;
+               }
+}
+
+void
+draw_triangle(ModeInfo * mi)
+{
+       trianglestruct *tp = &triangles[MI_SCREEN(mi)];
+       int         d, d2, i, j, delta;
+
+       if (!tp->init_now) {
+               draw_mesh(mi, tp, tp->d / 2, MAX_SIZE / tp->d);
+
+               /* The init_now flag will pop up when the scene is complete.
+                * Cycles specifies how long to wait, in 1/10 secs.
+                TODO: This is wrong for multi-screens ***
+                */
+               if (tp->init_now) {
+#ifndef STANDALONE
+                       MI_PAUSE(mi) = 2000000;
+#else
+                       if (tp->stage == -1)
+                         {
+                               XSync(MI_DISPLAY(mi), False);
+                               usleep(2000000);
+                               XClearWindow(MI_DISPLAY(mi), MI_WINDOW(mi));
+# if 1
+                               if (!mono_p)
+                                 {
+                                       free_colors(mi->dpy, mi->xgwa.colormap, mi->colors,
+                                                               mi->npixels);
+                                       make_smooth_colormap (mi->dpy,
+                                                                                 mi->xgwa.visual, mi->xgwa.colormap,
+                                                                                 mi->colors, &mi->npixels,
+                                                                                 True, &mi->writable_p, True);
+                                 }
+# endif /* 0 */
+                         }
+#endif
+               }
+               return;
+       }
+       if (tp->delta[0] > 0) {
+               if (!(++tp->stage)) {
+                       tp->h[0][0] = (short int) MAX(0, DISPLACE(0, tp->delta[0]));
+                       tp->h[tp->size][0] = (short int) MAX(0, DISPLACE(0, tp->delta[0]));
+                       tp->h[0][tp->size] = (short int) MAX(0, DISPLACE(0, tp->delta[0]));
+               } else {
+                       d = 2 << (tp->steps - tp->stage);
+                       d2 = d / 2;
+                       delta = tp->delta[tp->stage - 1];
+
+                       for (i = 0; i < tp->size; i += d) {
+                               for (j = 0; j < (tp->size - i); j += d) {
+                                       tp->h[i + d2][j] = (short int) DISPLACE(tp->h[i][j] +
+                                                    tp->h[i + d][j], delta);
+                                       tp->h[i][j + d2] = (short int) DISPLACE(tp->h[i][j] +
+                                                    tp->h[i][j + d], delta);
+                                       tp->h[i + d2][j + d2] = (short int) DISPLACE(tp->h[i + d][j] +
+                                                    tp->h[i][j + d], delta);
+                               }
+
+                               tp->init_now = 0;
+                               tp->i = 0;
+                               tp->j = 0;
+                               tp->d = d;
+                       }
+               }
+       }
+       if (tp->stage == tp->steps) {
+               tp->stage = -1;
+       }
+}
+
+void
+release_triangle(ModeInfo * mi)
+{
+       if (triangles != NULL) {
+               (void) free((void *) triangles);
+               triangles = NULL;
+       }
+}
+
+void
+refresh_triangle(ModeInfo * mi)
+{
+       /* Do nothing, it will refresh by itself */
+}
diff --git a/hacks/truchet.c b/hacks/truchet.c
new file mode 100644 (file)
index 0000000..cb53913
--- /dev/null
@@ -0,0 +1,527 @@
+/* truchet --- curved and straight tilings
+ * Copyright (c) 1998 Adrian Likins <adrian@gimp.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software 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.  No representations are made about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or 
+ * implied warranty.
+ */
+
+/* This screensaver draws two varieties of truchet patterns, a curved one and
+   a straight one. There are lots and lots of command line options to play
+   with.
+
+   If your running remotely or on a slow machine or slow xserver, some of the
+   settings will be way too much. The default settings should be okay though. 
+
+   This screensaver doesnt use anything bizarre or special at all, just a few
+   standard xlib calls.
+
+   A few suggested commandline combos..All these were tested on a k6-200
+   running XFree86 3.3 on a ark2000, so your mileage may vary...
+
+      truchet -delay 200 -no-curves
+      truchet -delay 500 -no-curves -square -no-erase
+      truchet -delay 500 -no-erase -square -erase-count 5
+      truchet -scroll
+      truchet -scroll -no-erase -anim-step-size 9
+      truchet -delay 200 -no-angles -min-width 36 -max-width 36
+      truchet -delay 200 -no-curves -min-width 12 -max-width 12
+      truchet -delay 200 -no-curves -min-width 36 -max-width 36 -no-erase
+      truchet -delay 100 -min-width 256 -max-width 512 -no-erase \
+              -min-linewidth 96 -root
+      truchet -min-width 64 -max-width 128 -no-erase -max-linewidth 4 \
+              -root -no-angles
+      truchet -min-width 64 -max-width 128 -no-erase -max-linewidth 4 \
+              -root -no-curves -delay 25
+ */
+
+#include "screenhack.h"
+
+#define MAXRATIO 2
+
+
+char *progclass="Truchet";
+
+char *defaults [] = {
+  "*minWidth:                 40",
+  "*minHeight:                40",
+  "*max-Width:                150",
+  "*max-Height:               150",
+  "*maxLineWidth:             25",
+  "*minLineWidth:             2",
+  "*erase:                    True",
+  "*eraseCount:               25",        
+  "*square:                   True",
+  "*delay:                    1000",
+  "*curves:                   True",
+  "*angles:                   True",
+  "*angles-and-curves:        True",
+  "*scroll:                   False",
+  "*scroll-overlap:           400",
+  "*anim-delay:               100",
+  "*anim-step-size:           3",
+  "*randomize:               false",
+   0
+};
+
+/* options passed to this program */
+XrmOptionDescRec options [] = {
+  { "-min-width",      ".minWidth",       XrmoptionSepArg, 0 },
+  { "-max-height",     ".max-Height",      XrmoptionSepArg, 0 },
+  { "-max-width",      ".max-Width",       XrmoptionSepArg, 0 },
+  { "-min-height",     ".minHeight",      XrmoptionSepArg, 0 },
+  { "-max-linewidth",  ".maxLineWidth",   XrmoptionSepArg, 0 },
+  { "-min-linewidth",  ".minLineWidth",   XrmoptionSepArg, 0 },
+  { "-erase",          ".erase",          XrmoptionNoArg, "True" },
+  { "-no-erase",       ".erase",          XrmoptionNoArg, "False" },
+  { "-erase-count",    ".eraseCount",     XrmoptionSepArg, 0 },
+  { "-square",         ".square",         XrmoptionNoArg, "True" },
+  { "-not-square",     ".square",         XrmoptionNoArg, "False" },
+  { "-curves",         ".curves",         XrmoptionNoArg, "True" },
+  { "-angles",         ".angles",         XrmoptionNoArg,  "True" },
+  { "-no-angles",      ".angles",         XrmoptionNoArg,  "False" },
+  { "-no-curves",      ".curves",         XrmoptionNoArg, "False" },
+  { "-delay",          ".delay",          XrmoptionSepArg, 0 },
+  { "-scroll",         ".scroll",         XrmoptionNoArg, "True" },
+  { "-scroll-overlap", ".scroll-overlap", XrmoptionSepArg, 0 },
+  { "-anim-delay",     ".anim-delay",     XrmoptionSepArg, 0 },
+  { "-anim-step-size",  ".anim-step-size", XrmoptionSepArg, 0 },
+  { "-randomize",      ".randomize",     XrmoptionNoArg, "True" },
+  { 0, 0, 0, 0 }
+};
+
+static GC agc, bgc;
+static int linewidth;
+static int width, height;
+static XWindowAttributes xgwa;
+static Pixmap frame;
+static int overlap;
+
+static void draw_truchet(Display *disp, Window win);
+static void draw_angles(Display *disp, Window win);
+static void scroll_area(Display *disp, Window win, int delay, int step_size);
+
+static void draw_angles(Display *disp, Window win)
+{
+  int countX;
+  int countY;
+
+  countX=0;
+  countY=0;
+  
+  while((xgwa.height+overlap) > countY*height)
+       {
+         while((xgwa.width+overlap) > countX*width)
+           {
+             if(random()%2)
+             {
+               /* block1 */
+               XDrawLine(disp,frame,agc,
+                         (countX*width)+(width/2),
+                         (countY*height), 
+                         (countX*width)+(width),
+                         (countY*height)+(height/2));
+               XDrawLine(disp,frame,agc,
+                         (countX*width), 
+                         (countY*height)+(height/2),
+                         (countX*width)+(width/2),
+                         (countY*height)+(height));
+             }
+           else
+             {
+               /* block 2 */
+               XDrawLine(disp,frame,agc, 
+                         (countX*width)+(width/2),
+                         (countY*height),
+                         (countX*width),
+                         (countY*height)+(height/2));
+               XDrawLine(disp,frame,agc,
+                         (countX*width)+(width),
+                         (countY*height)+(height/2),
+                         (countX*width)+(width/2),
+                         (countY*height)+(height)); 
+             }
+             countX++;
+           }
+         countY++;
+         countX=0;
+       }
+
+  countX=0;
+  countY=0;
+}
+  
+
+static void draw_truchet(Display *disp, Window win)
+{
+  int countX;
+  int countY;
+
+
+  countX=0;
+  countY=0;
+
+
+  while(xgwa.height+overlap > countY*height)
+       {
+         while(xgwa.width+overlap > countX*width)
+           {
+             if(random()%2)
+             {
+               /* block1 */
+               XDrawArc(disp, frame, agc,
+                        ((countX*width)-(width/2)),
+                        ((countY*height)-(height/2)),
+                        width,
+                        height,
+                        0, -5760);
+               XDrawArc(disp,frame, agc,
+                        ((countX*width)+(width/2)),
+                        ((countY*height)+(height/2)),
+                        width,
+                        height,
+                        11520,
+                        -5760);
+             }
+           else
+             {
+               /* block 2 */
+               XDrawArc(disp,frame,agc,
+                        ((countX*width)+(width/2)),
+                        ((countY*height)-(height/2)),
+                        width,
+                        height,
+                        17280,
+                        -5760);
+               XDrawArc(disp,frame,agc,
+                        ((countX*width)-(width/2)),
+                        ((countY*height)+(height/2)),
+                        width,
+                        height,
+                        0,
+                        5760);
+             }
+             countX++;
+           }
+         countY++;
+         countX=0;
+       }
+   countX=0;
+   countY=0;
+}
+/* this is the function called for your screensaver */
+void screenhack(Display *disp, Window win)
+{
+  XGCValues gcv;
+  int countX;
+  int countY;
+  int maxlinewidth;
+  int minlinewidth;
+  int minwidth;
+  int minheight;
+  int max_height; 
+  int max_width; 
+  int delay;
+  int count;
+  int anim_delay;
+  int anim_step_size;
+
+
+  Colormap cmap;
+  XColor fgc;
+  Bool curves;
+  Bool square;
+  Bool angles;
+  Bool erase;
+  Bool eraseCount;
+  Bool scroll;
+  
+
+  maxlinewidth = get_integer_resource ("maxLineWidth", "Integer");
+  minlinewidth = get_integer_resource ("minLineWidth", "Integer");
+  minwidth = get_integer_resource ("minWidth", "Integer");
+  minheight = get_integer_resource ("minHeight", "Integer");
+  max_width = get_integer_resource ("max-Width", "Integer"); 
+  max_height = get_integer_resource ("max-Height", "Integer" ); 
+  delay = get_integer_resource ("delay", "Integer");
+  eraseCount = get_integer_resource ("eraseCount", "Integer");
+  square = get_boolean_resource ("square", "Boolean");
+  curves = get_boolean_resource ("curves", "Boolean");
+  angles = get_boolean_resource ("angles", "Boolean");
+  erase = get_boolean_resource ("erase", "Boolean");
+  scroll = get_boolean_resource ("scroll", "Boolean");
+  overlap = get_integer_resource ("scroll-overlap", "Integer");
+  anim_delay = get_integer_resource ("anim-delay", "Integer");
+  anim_step_size = get_integer_resource ("anim-step-size", "Integer");
+
+  if (get_boolean_resource("randomize", "Randomize"))
+    {
+      int i = (random() % 12);
+      switch(i) {
+      case 0:
+       break;
+      case 1:
+       curves = False;
+       break;
+      case 2:
+       curves = False;
+       square = True;
+       erase = False;
+       break;
+      case 3:
+       square = True;
+       erase = False;
+       eraseCount = 5;
+       break;
+      case 4:
+       scroll = True;
+       break;
+      case 5:
+       scroll = True;
+       erase = False;
+       anim_step_size = 9;
+       break;
+      case 6:
+       angles = False;
+       minwidth = max_width = 36;
+       break;
+      case 7:
+       curves = False;
+       minwidth = max_width = 12;
+       break;
+      case 8:
+       curves = False;
+       erase = False;
+       minwidth = max_width = 36;
+       break;
+      case 9:
+       erase = False;
+       minwidth = 256;
+       max_width = 512;
+       minlinewidth = 96;
+       break;
+      case 10:
+       angles = False;
+       minwidth = 64;
+       max_width = 128;
+       maxlinewidth = 4;
+       break;
+      case 11:
+       curves = False;
+       minwidth = 64;
+       max_width = 128;
+       maxlinewidth = 4;
+       break;
+      default:
+       abort();
+       break;
+      }
+    }
+
+  XGetWindowAttributes (disp, win, &xgwa);
+  gcv.foreground = BlackPixel(disp,0);
+  gcv.background = WhitePixel(disp,0);
+  gcv.line_width = 25;
+  cmap = xgwa.colormap;
+
+  gcv.foreground = get_pixel_resource("background", "Background",
+                                     disp, xgwa.colormap);
+
+  bgc = XCreateGC (disp, win, GCForeground, &gcv);
+  agc = XCreateGC(disp, win, GCForeground, &gcv);
+
+  XFillRectangle(disp, win, bgc, 0, 0, xgwa.width, xgwa.height);
+
+  width=60;
+  height=60;
+  linewidth=1;
+  countX=0;
+  countY=0;
+  count=0;
+  XSetForeground(disp, agc, gcv.background);
+  
+  
+  frame = XCreatePixmap(disp,win, xgwa.width+overlap, xgwa.height+overlap, xgwa.depth); 
+  
+
+  while(1)
+    {
+      if (!mono_p)
+       {
+       /* XXX there are probably bugs with this. */
+        /* could be...I just borrowed this code from munch */
+
+       fgc.red = random() % 65535;
+       fgc.green = random() % 65535;
+       fgc.blue = random() % 65535;
+       
+       if (XAllocColor(disp, cmap, &fgc)) 
+         {
+           XSetForeground(disp, agc, fgc.pixel);
+         }
+       else
+         {
+           /* use white if all else fails  */
+           XSetForeground(disp,agc, gcv.background);
+         }
+      }
+
+      
+      
+
+      /* generate a random line width */
+      linewidth=(random()% maxlinewidth);
+
+      /* check for lower bound */
+      if(linewidth < minlinewidth)
+       linewidth = minlinewidth;
+
+      /* try to get an odd linewidth as it seem to work a little better */
+      if(linewidth%2)
+       linewidth++;
+
+      /* grab a random height and width */ 
+      width=(random()%max_width);
+      height=(random()%max_height);
+
+      /* make sure we dont get a 0 height or width */
+      if(width == 0 || height == 0)
+       {
+         height=max_height;
+         width=max_width;
+       }
+
+
+      /* check for min height and width */
+      if(height < minheight)
+       {
+         height=minheight;
+       }
+      if(width < minwidth)
+       {
+         width=minwidth;
+       }
+
+      /* if tiles need to be square, fix it... */
+      if(square)
+       height=width;
+
+      /* check for sane aspect ratios */
+      if((width/height) > MAXRATIO) 
+       height=width;
+      if((height/width) > MAXRATIO)
+       width=height;
+      
+      /* to avoid linewidths of zero */
+      if(linewidth == 0 || linewidth < minlinewidth)
+       linewidth = minlinewidth;
+
+      /* try to keep from getting line widths that would be too big */
+      if(linewidth > 0 && linewidth >= (height/5))
+       linewidth = height/5;
+  
+      XSetLineAttributes(disp, agc, linewidth, LineSolid, CapRound, JoinRound);
+
+      if(erase || (count >= eraseCount))
+       {
+         /*  XClearWindow(disp,win); */
+         XFillRectangle(disp, frame, bgc, 0, 0, xgwa.width+overlap, xgwa.height+overlap);
+         count=0;
+       }
+            
+      if(!scroll)
+       overlap=0;
+            
+      /* do the fun stuff...*/
+      if(curves && angles)
+       {
+         if(random()%2)
+           draw_truchet(disp,win);
+         else
+           draw_angles(disp,win);
+       }
+      else if(curves && !angles)
+       draw_truchet(disp,win);
+      else if(!curves && angles)
+       draw_angles(disp,win);
+
+   
+      XCopyArea(disp,frame,win,agc,0,0,xgwa.width,xgwa.height,0,0);
+      if(scroll)
+       {
+         scroll_area(disp,win,anim_delay,anim_step_size);
+         delay = 0;
+       }
+      else
+       XSync(disp, False);
+      
+      screenhack_handle_events (disp);
+
+      /* the delay to try to minimize seizures */
+      usleep((delay*1000)); 
+      count++;
+      
+    }
+
+}
+
+static void scroll_area(Display *disp, Window win, int delay, int step_size)
+{
+
+  int scrollcount_x;
+  int scrollcount_y;
+  int offset;
+  int scroll;
+  /* note local delay overirdes static delay cause... */
+
+
+  scrollcount_x=0;
+  scrollcount_y=0;
+
+  offset=overlap/2;
+  scroll=overlap/4;
+  
+      /* if anyone knows a good way to generate a more random scrolling motion... */
+  while(scrollcount_x <= scroll)
+    {
+      XCopyArea(disp, frame, win, agc,scrollcount_x+offset,scrollcount_y+offset, xgwa.width, xgwa.height, 0,0);
+      XSync(disp, False);
+      scrollcount_x=scrollcount_x+step_size;
+      scrollcount_y=scrollcount_y+step_size;
+      usleep(1000*delay); 
+    }
+  while(scrollcount_x >= 0)
+    {
+      XCopyArea(disp, frame, win, agc,scrollcount_x+offset,scrollcount_y+offset, xgwa.width, xgwa.height, 0,0);
+      XSync(disp, False);
+      scrollcount_y=scrollcount_y+step_size;
+      scrollcount_x=scrollcount_x-step_size;
+      usleep(1000*delay); 
+    }
+  while(scrollcount_y >= scroll)
+    {
+      XCopyArea(disp, frame, win, agc,scrollcount_x+offset,scrollcount_y+offset, xgwa.width, xgwa.height, 0,0);
+      XSync(disp, False);
+      scrollcount_x=scrollcount_x-step_size;
+      scrollcount_y=scrollcount_y-step_size;
+      usleep(1000*delay); 
+    }
+  while(scrollcount_y > 0)
+    {
+      XCopyArea(disp, frame, win, agc,scrollcount_x+offset,scrollcount_y+offset, xgwa.width, xgwa.height, 0,0);
+      XSync(disp, False);
+      scrollcount_y=scrollcount_y-step_size;
+      scrollcount_x=scrollcount_x+step_size;
+      usleep(1000*delay); 
+    }
+  
+  XSync(disp, False);
+  scrollcount_x=0;
+  scrollcount_y=0;
+  
+}
diff --git a/hacks/vidwhacker b/hacks/vidwhacker
new file mode 100755 (executable)
index 0000000..a27e0c2
--- /dev/null
@@ -0,0 +1,405 @@
+#!/bin/sh
+#
+# vidwhacker, for xscreensaver.  Copyright (c) 1998, 1999 Jamie Zawinski.
+#
+# Permission to use, copy, modify, distribute, and sell this software 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.  No representations are made about the suitability of this
+# software for any purpose.  It is provided "as is" without express or 
+# implied warranty.
+#
+#
+# This script grabs a frame of video, then uses various pbm filters to
+# munge the image in random nefarious ways, then uses xv to put it on
+# the root window.  This works out really nicely if you just feed some
+# random TV station into it...
+#
+# The video grabbing part is SGI-specific -- if you want to use this on
+# another system, add a new clause to the grab() procedure.
+
+
+# need perl to generate random numbers -- I don't know another way to do
+# that from a shell script.
+perl=perl
+
+
+onroot=false
+verbose=false
+delay=3
+use_stdin=false
+use_stdout=false
+
+pid=""
+tmp=${TMPDIR:-/tmp}/vidwhacker.$$
+tmp_rgb=$tmp-00000.rgb
+tmp_ppm0=$tmp-0.ppm
+tmp_ppm1=$tmp-1.ppm
+tmp_ppm2=$tmp-2.ppm
+tmp_ppm3=$tmp-3.ppm
+tmp_ppm4=$tmp-4.ppm
+tmp_ppmS=$tmp-S.ppm
+
+
+# Process command-line args
+getargs() {
+
+  while [ $# != 0 ]; do
+    case "$1" in
+    -display | -disp | -dis | -dpy | -d )
+      shift
+      DISPLAY="$1"
+      export DISPLAY
+      ;;
+    -root )
+      onroot=true
+      ;;
+    -window )
+      onroot=false
+      ;;
+    -verbose )
+      verbose=true
+      ;;
+    -stdin )
+      use_stdin=true
+      ;;
+    -stdout )
+      use_stdout=true
+      ;;
+    -delay)
+      shift
+      delay="$1"
+      ;;
+    * )
+      echo "VidWhacker, Copyright (c) 1999 Jamie Zawinski <jwz@jwz.org>" >&2
+      echo "            http://www.jwz.org/xscreensaver/" >&2
+      echo "" >&2
+      echo "usage: $0 [-display dpy] [-verbose] [-root | -window]" >&2
+      echo "                  [-stdin] [-stdout] [-delay secs]" >&2
+      exit 1
+      ;;
+    esac
+    shift
+  done
+
+  xvargs="-quick24"
+
+  if [ "$onroot" = true ]; then
+    xvargs="$xvargs -root -rmode 5 -noresetroot -rfg black -rbg black -viewonly"
+  else
+    xvargs="$xvargs -geom +0+0"
+  fi
+
+
+  screen_width=''
+  if [ "$use_stdout" = false ]; then
+    screen_width=`xdpyinfo 2>/dev/null | 
+        sed -n 's/.* dimensions: *\([0-9]*\).*/\1/p'`
+    if [ "$screen_width" = "" ]; then
+      screen_width=800
+    fi
+  fi
+}
+
+
+clean() {
+  rm -f $tmp_rgb $tmp_ppm1 $tmp_ppm2 $tmp_ppm3 $tmp_ppm4
+}
+
+clean2() {
+  clean
+  rm -f $tmp_ppm0 $tmp_ppmS
+}
+
+
+# Grab a frame of video.  leaves it in $tmp_ppm1.
+#
+grab() {
+  uname=`uname`
+  if [ $uname = IRIX ]; then
+    #
+    # SGI's "vidtomem" returns an SGI RGB image of the default video input,
+    # and has stupid non-overridable ouput-file-naming conventions.  So, let 
+    # it write its file; and then convert it to a pgm.
+    #
+    
+    vidtomem -f $tmp
+    sgitopnm $tmp_rgb > $tmp_ppm1
+
+    # Cut off the close-captioning blips in the NTSC overscan region.  YMMV.
+    #  | pnmcut 12 7 695 477 
+
+  elif [ $uname = Linux ]; then
+
+    # Marcus Herbert says the following works with his Connectix Qcam.
+    # Don't have qcam?  Well, do something else then...  and send me a patch.
+
+    qcam > $tmp_ppm1
+
+    # Friedrich Delgado Friedrichs says the following works if you have
+    # XawTV installed:
+    #
+    #   streamer -o $tmp_ppm1
+    #
+
+  else
+    echo "$0: don't know how to grab video on this OS." >&2
+    clean2
+    exit 1
+  fi
+}
+
+
+# Use perl to pick a random foreground/background color in pbm's syntax.
+#
+randcolor() {
+  $perl -e 'srand(time ^ $$);
+            printf("#%02x%02x%02x-#%02x%02x%02x",
+                   int(rand()*60),
+                   int(rand()*60),
+                   int(rand()*60),
+                   120+int(rand()*135),
+                   120+int(rand()*135),
+                   120+int(rand()*135))'
+}
+
+rand() {
+  $perl -e "srand(time ^ $$); print int(rand() * $1)"
+}
+
+
+
+# Frobnicate the image in some random way.
+#
+frob() {
+
+  w_h=`head -2 $tmp_ppm1 | tail -1`
+  width=`echo $w_h | awk '{print $1}'`
+  height=`echo $w_h | awk '{print $2}'`
+
+  N=`rand 17`
+
+  if [ "$verbose" = true ]; then
+    echo "mode $N..." >&2
+  fi
+
+  if   [ $N = 0 ]; then
+    ppmtopgm $tmp_ppm1 | pgmedge | pgmtoppm `randcolor` | ppmnorm
+
+  elif [ $N = 1 ]; then
+    ppmtopgm $tmp_ppm1 | 
+    pgmenhance | 
+    pgmtoppm `randcolor`
+
+  elif [ $N = 2 ]; then
+    ppmtopgm $tmp_ppm1 | pgmoil | pgmtoppm `randcolor`
+
+  elif [ $N = 3 ]; then 
+    ppmrelief $tmp_ppm1 | ppmtopgm | pgmedge | ppmrelief | ppmtopgm |
+      pgmedge | pnminvert | pgmtoppm `randcolor`
+
+  elif [ $N = 4 ]; then
+    ppmspread 71 $tmp_ppm1 > $tmp_ppm2
+    pnmarith -add $tmp_ppm1 $tmp_ppm2
+
+  elif [ $N = 5 ]; then
+    pnmflip -lr $tmp_ppm1 > $tmp_ppm2
+    pnmarith -multiply $tmp_ppm1 $tmp_ppm2 > $tmp_ppm3
+    pnmflip -tb $tmp_ppm3 | ppmnorm > $tmp_ppm2
+    pnmarith -multiply $tmp_ppm1 $tmp_ppm2
+
+  elif [ $N = 6 ]; then
+    N2=`rand 3`
+    if [ $N2 = 0 ]; then
+      pnmflip -lr $tmp_ppm1 > $tmp_ppm2
+    elif [ $N2 = 1 ]; then
+      pnmflip -tb $tmp_ppm1 > $tmp_ppm2
+    else
+      pnmflip -lr $tmp_ppm1 > $tmp_ppm2
+      pnmflip -tb $tmp_ppm2 > $tmp_ppm3
+      cp $tmp_ppm3 $tmp_ppm2
+    fi
+
+    pnmarith -difference $tmp_ppm1 $tmp_ppm2
+
+  elif [ $N = 7 ]; then
+
+    for i in 1 2 3 ; do
+      ppmtopgm $tmp_ppm1 | pgmedge > $tmp_ppm2
+      pnmarith -difference $tmp_ppm1 $tmp_ppm2 > $tmp_ppm3
+      cp $tmp_ppm3 $tmp_ppm1
+    done
+    ppmnorm < $tmp_ppm1
+
+  elif [ $N = 8 ]; then
+    pnmflip -lr $tmp_ppm1 > $tmp_ppm2
+    pnmarith -multiply $tmp_ppm1 $tmp_ppm2 | ppmrelief | ppmnorm | pnminvert
+
+  elif [ $N = 9 ]; then
+    pnmflip -lr $tmp_ppm1 > $tmp_ppm2
+    pnmarith -subtract $tmp_ppm1 $tmp_ppm2 | ppmrelief | ppmtopgm | pgmedge
+
+  elif [ $N = 10 ]; then
+    ppmtopgm $tmp_ppm1 | pgmbentley | pgmtoppm `randcolor`
+
+  elif [ $N = 11 ]; then
+    pgmcrater -number 20000 -height $height -width $width | pgmtoppm `randcolor` > $tmp_ppm2
+    pnmarith -difference $tmp_ppm1 $tmp_ppm2 > $tmp_ppm3
+    pnmflip -tb $tmp_ppm3 | ppmnorm > $tmp_ppm2
+    pnmarith -multiply $tmp_ppm1 $tmp_ppm2
+
+  elif [ $N = 12 ]; then
+    ppmshift 30 $tmp_ppm1 | ppmtopgm | pgmoil | pgmedge |  pgmtoppm `randcolor` > $tmp_ppm2
+    pnmarith -difference $tmp_ppm1 $tmp_ppm2 
+
+ elif [ $N = 13 ]; then
+    ppmpat -madras $width $height | pnmdepth 255 > $tmp_ppm2
+    pnmarith -difference $tmp_ppm1 $tmp_ppm2
+  elif [ $N = 14 ]; then
+    ppmpat -tartan $width $height | pnmdepth 255 > $tmp_ppm2
+    pnmarith -difference  $tmp_ppm1 $tmp_ppm2 
+  
+  elif [ $N = 15 ]; then
+    ppmpat -camo $width $height | pnmdepth 255 | ppmshift 50 > $tmp_ppm2
+    pnmarith -multiply $tmp_ppm1 $tmp_ppm2
+  
+  elif [ $N = 16 ]; then
+    pgmnoise $width $height | pgmedge | pgmtoppm `randcolor` > $tmp_ppm2
+    pnmarith -difference $tmp_ppm1 $tmp_ppm2 | pnmdepth 255 | pnmsmooth
+
+  else cat $tmp_ppm1
+  fi
+}
+
+
+# Grab a frame and frob it.  leave it in $tmp_ppm3.
+#
+whack() {
+  clean
+
+  while [ ! -f $tmp_ppm1 ]; do
+    if [ "$use_stdin" != true ]; then
+      grab
+    else
+      cp $tmp_ppmS $tmp_ppm0
+      cp $tmp_ppm0 $tmp_ppm1
+    fi
+  done
+
+  rm -f $tmp_rgb
+
+  if [ "$screen_width" != "" ]; then
+    frob | pnmscale -width $screen_width > $tmp_ppm3
+  else
+    frob > $tmp_ppm3
+  fi
+
+  rm -f $tmp_ppm1 $tmp_ppm2
+}
+
+
+# Kill off the xv subprocess, if it's running
+#
+kill_pid() {
+  if [ "$pid" != "" ]; then
+
+    if [ "$verbose" = true ]; then
+      echo "killing pid $pid..." >&2
+    fi
+
+    # need to do this to avoid "6898 Terminated" messages!
+    # apparently one can't redirect the output of the builtin `kill' command.
+#    ( sh -c "kill $pid" ) >/dev/null 2>/dev/null </dev/null
+
+    # wtf?  that doesn't work either.  Is it writing to /dev/tty??
+    kill $pid >/dev/null 2>&1
+
+    pid=""
+  fi
+}
+
+# called when this process is signalled (for cleanup)
+#
+my_trap() {
+  if [ "$verbose" = true ]; then
+    echo "trapped signal!" >&2
+  fi
+  kill_pid
+  clean2
+  exit 1
+}
+
+main() {
+
+  getargs $@
+
+  trap my_trap 1 2 3 6 9 13 15
+
+  if [ "$use_stdin" = true ]; then
+   cat > $tmp_ppmS
+  fi
+
+  while true; do
+
+    # Loop grabbing and frobbing images.
+    #
+    # If we're running on the root, run xv in the foreground (with -exit)
+    # and then wait.
+    #
+    # If we're running in a window, spawn xv in the background; then when
+    # it's time to put up the new image, kill off the currently-running xv.
+
+    if [ "$verbose" = true ]; then
+      whack
+    else
+      whack >/dev/null 2>&1
+    fi
+
+    kill_pid
+
+    if [ ! -s $tmp_ppm3 ]; then
+      echo "$0: no image grabbed" >&2
+
+    elif [ "$use_stdout" = true ]; then
+
+      cat $tmp_ppm3
+      clean2
+      exit 0
+
+    else
+
+      pnmtosgi < $tmp_ppm3 > $tmp_ppm2
+      rm -f $tmp_ppm3
+
+      if [ -s $tmp_ppm2 ]; then
+        if [ "$verbose" = true ]; then
+          echo "launching xv $xvargs $tmp_ppm2" >&2
+         ls -lF $tmp_ppm2
+        fi
+
+       mv $tmp_ppm2 $tmp_ppm0
+        xv $xvargs $tmp_ppm0 &
+
+# this doesn't work -- leaves xv processes around, instead of stray xset
+# data.  Sigh.
+#
+#      # cat the file so that we can nuke it without racing against xv.
+#        cat $tmp_ppm2 | xv $xvargs - &
+
+        pid=$!
+      fi
+    fi
+
+    clean
+    sleep $delay
+
+  done
+  exit 1
+}
+
+main $@
+
+# to find stray xv data:
+# xwininfo -root -children|grep 'xv image comments' | awk '{print "xkill -id ", $1}'
diff --git a/hacks/vidwhacker.man b/hacks/vidwhacker.man
new file mode 100644 (file)
index 0000000..a1ffc10
--- /dev/null
@@ -0,0 +1,81 @@
+.TH XScreenSaver 1 "17-Jun-99" "X Version 11"
+.SH NAME
+vidwhacker - grab images and apply random filters to them
+.SH SYNOPSIS
+.B vidwhacker
+[\-display \fIhost:display.screen\fP] [\-root] [\-window] [\-verbose] [\-stdin] [\-stdout] [\-delay seconds]
+.SH DESCRIPTION
+The \fIvidwhacker\fP program grabs a image from the system's video input,
+applies random image filters to it, and displays the result.  
+The \fIvidwhacker\fP program does not terminate until killed.
+It depends heavily on
+.BR xv (1)
+and the various PBM tools
+(e.g.,
+.BR ppmrelief (1).)
+.SH OPTIONS
+.I vidwhacker
+accepts the following options:
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-window
+Pop up a new window displaying the image.  When a new image has been fully
+processed, destroy that window and pop up a new one.  This is the default.
+.TP 8
+.B \-verbose
+Print diagnostics.
+.TP 8
+.B \-stdin
+Instead of grabbing an image from the system's video input, read an image
+to maniupulate from stdin.  This image must be in 
+.TP 8
+.B \-delay \fIseconds\fP
+How long to sleep between images.  Default 3 seconds (the actual
+elapsed time is significantly longer, due to processing time.)
+.BR ppm (5)
+format.  The program will still perform repeated random image 
+transformations, but it will always use this one image as its starting point.
+.TP 8
+.B \-stdout
+Instead of displaying the image on a window or on the root, write the new
+image on stdout, and exit.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH BUGS
+Grabbing video images is, of course, very system-dependent.  It works
+on SGIs, and on Linux systems that have the
+.BR qcam (1)
+program.  If your system does things differently, you'll need to edit
+the vidwhacker script (look for the \fIgrab()\fP function.)
+
+It's slow.
+.SH TO DO
+It might be interesting to rewrite this to use
+.BR gimp (1)
+plugins instead of the pbm tools.  It probably wouldn't be any faster,
+but there would be a wider variety of effects available.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1),
+.BR xv (1),
+.BR ppmtogif (1),
+.BR cjpeg (1)
+.SH COPYRIGHT
+Copyright \(co 1998, 1999 by Jamie Zawinski.  Permission to use, copy, modify, 
+distribute, and sell this software 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.  No representations are made about the 
+suitability of this software for any purpose.  It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Jamie Zawinski <jwz@jwz.org>, 18-Jan-98.
diff --git a/hacks/vines.c b/hacks/vines.c
new file mode 100644 (file)
index 0000000..4c562f9
--- /dev/null
@@ -0,0 +1,142 @@
+/* -*- Mode: C; tab-width: 4 -*-
+ * vines --- another geometric pattern generator.
+ */
+#if !defined( lint ) && !defined( SABER )
+static const char sccsid[] = "@(#)vines.c      4.02 97/04/01 xlockmore";
+#endif
+
+/* xlockmore mode written by Tracy Camp
+ * campt@hurrah.com 1997
+ * released to the public domain
+ *
+ * This was modifed from a 'screen saver' that a friend and I
+ * wrote on our TI-8x calculators in high school physics one day
+ * Basically another geometric pattern generator, this ones claim
+ * to fame is a pseudo-fractal looking vine like pattern that creates
+ * nifty whorls and loops.
+ *
+ * Revision History:
+ * 10-May-97: jwz@jwz.org: turned into a standalone program.
+ * 21-Mar-97:  David Hansen <dhansen@metapath.com>
+ *             Updated mode to draw complete patterns on every
+ *             iteration instead of growing the vine.  Also made
+ *             adjustments to randomization and changed variable
+ *             names to make logic easier to follow.
+ */
+
+#ifdef STANDALONE
+# define PROGCLASS                                     "Vines"
+# define HACK_INIT                                     init_vines
+# define HACK_DRAW                                     draw_vines
+# define vines_opts                                    xlockmore_opts
+# define DEFAULTS              "*delay:        200000 \n"                      \
+                                               "*ncolors:      64     \n"                      \
+                                               "*eraseSpeed:   400 \n"                 \
+                                               "*eraseMode:    -1 \n"
+# include "xlockmore.h"                                /* from the xscreensaver distribution */
+# include "erase.h"
+#else  /* !STANDALONE */
+# include "xlock.h"                                    /* from the xlockmore distribution */
+#endif /* !STANDALONE */
+
+ModeSpecOpt vines_opts = {
+  0, NULL, 0, NULL, NULL };
+
+typedef struct {
+       int         a;
+       int         x1;
+       int         y1;
+       int         x2;
+       int         y2;
+       int         length;
+       int         iterations;
+       int         constant;
+       int         ang;
+       int         centerx;
+       int         centery;
+} vinestruct;
+
+static vinestruct *vines = NULL;
+
+void
+refresh_vines(ModeInfo * mi)
+{
+}
+
+void
+init_vines(ModeInfo * mi)
+{
+       Display    *display = MI_DISPLAY(mi);
+       vinestruct *fp;
+
+       if (vines == NULL) {
+               if ((vines = (vinestruct *) calloc(MI_NUM_SCREENS(mi), sizeof (vinestruct))) == NULL) {
+                       return;
+               }
+       }
+       fp = &vines[MI_SCREEN(mi)];
+
+       fp->iterations = 30 + NRAND(100);
+
+       XClearWindow(display, MI_WINDOW(mi));
+}
+
+void
+draw_vines(ModeInfo * mi)
+{
+       vinestruct *fp = &vines[MI_SCREEN(mi)];
+       Display    *display = MI_DISPLAY(mi);
+       GC          gc = MI_GC(mi);
+       int         i;
+
+       if (--(fp->iterations) == 0) {
+#ifdef STANDALONE
+         erase_full_window(MI_DISPLAY(mi), MI_WINDOW(mi));
+#endif /* STANDALONE */
+         init_vines(mi);
+       }
+
+       fp->centerx = NRAND(MI_WIN_WIDTH(mi));
+       fp->centery = NRAND(MI_WIN_HEIGHT(mi));
+
+       fp->ang = 60 + NRAND(720);
+       fp->length = 100 + NRAND(3000);
+       fp->constant = fp->length * (10 + NRAND(10));
+
+       fp->a = 0;
+       fp->x1 = 0;
+       fp->y1 = 0;
+       fp->x2 = 1;
+       fp->y2 = 0;
+
+       if (MI_NPIXELS(mi) > 2)
+               XSetForeground(display, gc, MI_PIXEL(mi, NRAND(MI_NPIXELS(mi))));
+       else
+               XSetForeground(display, gc, MI_WIN_WHITE_PIXEL(mi));
+
+
+       for (i = 0; i < fp->length; i++) {
+               XDrawLine(display, MI_WINDOW(mi), gc,
+                         fp->centerx + (fp->x1 / fp->constant),
+                         fp->centery - (fp->y1 / fp->constant),
+                         fp->centerx + (fp->x2 / fp->constant),
+                         fp->centery - (fp->y2 / fp->constant));
+
+               fp->a += (fp->ang * i);
+
+               fp->x1 = fp->x2;
+               fp->y1 = fp->y2;
+
+               fp->x2 += (int) (i * ((cos(fp->a) * 360) / (2 * M_PI)));
+               fp->y2 += (int) (i * ((sin(fp->a) * 360) / (2 * M_PI)));
+       }
+}
+
+void
+release_vines(ModeInfo * mi)
+{
+       if (vines != NULL) {
+               (void) free((void *) vines);
+               vines = NULL;
+       }
+}
diff --git a/hacks/vines.man b/hacks/vines.man
new file mode 100644 (file)
index 0000000..13b7dee
--- /dev/null
@@ -0,0 +1,62 @@
+.TH XScreenSaver 1 "10-May-97" "X Version 11"
+.SH NAME
+vines - draws pseudo-fractal geometric patterns
+.SH SYNOPSIS
+.B vines
+[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-ncolors \fIinteger\fP] [\-delay \fImicroseconds\fP]
+
+.SH DESCRIPTION
+The \fIvines\fP program is yet another geometric pattern generator, this
+one's claim to fame being a pseudo-fractal looking vine like pattern that
+creates nifty whorls and loops.
+.SH OPTIONS
+.I vines
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window.  This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-mono 
+If on a color display, pretend we're on a monochrome display.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use.  Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.TP 8
+.B \-ncolors \fIinteger\fP
+How many colors should be used (if possible).  Default 200.
+The colors are chosen randomly.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1),
+.BR xlock (1)
+.SH COPYRIGHT
+Copyright \(co 1997 by Tracy Camp.
+
+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. 
+.SH AUTHOR
+Tracy Camp <campt@hurrah.com>, 1997.
+
+Tweaked by David Hansen <dhansen@metapath.com>, 21-Mar-97.
+
+Ability to run standalone or with \fIxscreensaver\fP added by 
+Jamie Zawinski <jwz@jwz.org>, 10-May-97.
diff --git a/hacks/vms_axp.opt b/hacks/vms_axp.opt
new file mode 100644 (file)
index 0000000..6446159
--- /dev/null
@@ -0,0 +1,4 @@
+[-.UTILS]UTILS.OLB_AXP/LIB
+SYS$SHARE:DECW$XMULIBSHR.EXE/SHARE
+SYS$SHARE:DECW$XTSHR.EXE/SHARE
+SYS$SHARE:DECW$XLIBSHR.EXE/SHARE
diff --git a/hacks/vms_axp_12.opt b/hacks/vms_axp_12.opt
new file mode 100644 (file)
index 0000000..10f9426
--- /dev/null
@@ -0,0 +1,4 @@
+[-.UTILS]UTILS.OLB_AXP/LIB
+SYS$SHARE:DECW$XMULIBSHRR5.EXE/SHARE
+SYS$SHARE:DECW$XTLIBSHRR5.EXE/SHARE
+SYS$SHARE:DECW$XLIBSHR.EXE/SHARE
diff --git a/hacks/vms_decc.opt b/hacks/vms_decc.opt
new file mode 100644 (file)
index 0000000..43d6858
--- /dev/null
@@ -0,0 +1,4 @@
+[-.UTILS]UTILS.OLB_DECC/LIB
+SYS$SHARE:DECW$XMULIBSHR.EXE/SHARE
+SYS$SHARE:DECW$XTSHR.EXE/SHARE
+SYS$SHARE:DECW$XLIBSHR.EXE/SHARE
diff --git a/hacks/vms_decc_12.opt b/hacks/vms_decc_12.opt
new file mode 100644 (file)
index 0000000..dd6d2f3
--- /dev/null
@@ -0,0 +1,4 @@
+[-.UTILS]UTILS.OLB_DECC/LIB
+SYS$SHARE:DECW$XMULIBSHRR5.EXE/SHARE
+SYS$SHARE:DECW$XTLIBSHRR5.EXE/SHARE
+SYS$SHARE:DECW$XLIBSHR.EXE/SHARE
diff --git a/hacks/wander.c b/hacks/wander.c
new file mode 100644 (file)
index 0000000..2540fd9
--- /dev/null
@@ -0,0 +1,213 @@
+/* wander, by Rick Campbell <rick@campbellcentral.org>, 19 December 1998.
+ *
+ * Permission to use, copy, modify, distribute, and sell this software 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.  No representations are made about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or 
+ * implied warranty.
+ */
+
+#include <stdio.h>
+
+#include "screenhack.h"
+#include "colors.h"
+#include "erase.h"
+
+#define MAXIMUM_COLOR_COUNT (256)
+
+static unsigned int advance     = 0;
+static Bool         circles     = 0;
+static Colormap     color_map   = (Colormap)NULL;
+static int          color_count = 0;
+static int          color_index = 0;
+static XColor       colors      [MAXIMUM_COLOR_COUNT];
+static GC           context     = (GC)NULL;
+static unsigned int density     = 0;
+static int          depth       = 0;
+static int          height      = 0;
+static unsigned int length     = 0;
+static unsigned int reset      = 0;
+static unsigned int size       = 0;
+static int          width       = 0;
+
+static void
+init_wander (Display *display, Window window)
+{
+    XGCValues values;
+    XWindowAttributes attributes;
+
+    XClearWindow (display, window);
+    XGetWindowAttributes (display, window, &attributes);
+    width = attributes.width;
+    height = attributes.height;
+    depth = attributes.depth;
+    color_map = attributes.colormap;
+    if (color_count)
+    {
+        free_colors (display, color_map, colors, color_count);
+        color_count = 0;
+    }
+    context = XCreateGC (display, window, GCForeground, &values);
+    color_count = MAXIMUM_COLOR_COUNT;
+    make_color_loop (display, color_map,
+                    0,   1, 1,
+                    120, 1, 1,
+                    240, 1, 1,
+                    colors, &color_count, True, False);
+    if (color_count <= 0)
+    {
+        color_count = 2;
+        colors [0].red = colors [0].green = colors [0].blue = 0;
+        colors [1].red = colors [1].green = colors [1].blue = 0xFFFF;
+        XAllocColor (display, color_map, &colors [0]);
+        XAllocColor (display, color_map, &colors [1]);
+    }
+    color_index = random () % color_count;
+    
+    advance = get_integer_resource ("advance", "Integer");
+    density = get_integer_resource ("density", "Integer");
+    if (density < 1) density = 1;
+    reset = get_integer_resource ("reset", "Integer");
+    if (reset < 100) reset = 100;
+    circles = get_boolean_resource ("circles", "Boolean");
+    size = get_integer_resource ("size", "Integer");
+    if (size < 1) size = 1;
+    width = width / size;
+    height = height / size;
+    length = get_integer_resource ("length", "Integer");
+    if (length < 1) length = 1;
+    XSetForeground (display, context, colors [color_index].pixel);
+}
+
+
+static void
+wander (Display *display, Window window)
+{
+    int x = random () % width;
+    int y = random () % height;
+    int last_x = x;
+    int last_y = y;
+    int width_1 = width - 1;
+    int height_1 = height - 1;
+    int length_limit = length;
+    int reset_limit = reset;
+    int color_index = random () % color_count;
+    unsigned long color = colors [random () % color_count].pixel;
+    Pixmap pixmap = XCreatePixmap (display, DefaultRootWindow (display), size,
+                                  size, depth);
+    XSetForeground (display, context,
+                   BlackPixel (display, DefaultScreen (display)));
+    XFillRectangle (display, pixmap, context, 0, 0,
+                   width * size, height * size);
+    XSetForeground (display, context, color);
+    XFillArc (display, pixmap, context, 0, 0, size, size, 0, 360*64);
+
+    while (1)
+    {
+        if (random () % density)
+        {
+            x = last_x;
+            y = last_y;
+        }
+        else
+        {
+            last_x = x;
+            last_y = y;
+            x = (x + width_1  + (random () % 3)) % width;
+            y = (y + height_1 + (random () % 3)) % height;
+        }
+        if ((random () % length_limit) == 0)
+        {
+            if (advance == 0)
+            {
+                color_index = random () % color_count;
+            }
+            else
+            {
+                color_index = (color_index + advance) % color_count;
+            }
+            color = colors [color_index].pixel;
+            XSetForeground (display, context, color);
+            if (circles)
+            {
+                XFillArc (display, pixmap, context,
+                         0, 0, size, size, 0, 360 * 64);
+            }
+        }
+        if ((random () % reset_limit) == 0)
+        {
+            erase_full_window (display, window);
+            color = colors [random () % color_count].pixel;
+            x = random () % width;
+            y = random () % height;
+            last_x = x;
+            last_y = y;
+            if (circles)
+            {
+                XFillArc (display, pixmap, context, 0, 0, size, size, 0, 360*64);
+            }
+        }
+        if (size == 1)
+        {
+            XDrawPoint (display, window, context, x, y);
+        }
+        else
+        {
+            if (circles)
+            {
+                XCopyArea (display, pixmap, window, context, 0, 0, size, size,
+                           x * size, y * size);
+            }
+            else
+            {
+                XFillRectangle (display, window, context, x * size, y * size,
+                               size, size);
+            }
+        }
+        screenhack_handle_events (display);
+    }
+}
+
+char *progclass = "Wander";
+
+char *defaults [] =
+{
+    ".advance:    1",
+    ".density:    2",
+    ".length:     25000",
+    ".delay:      1",
+    ".reset:      2500000",
+    ".circles:    False",
+    ".size:       1",
+    0
+};
+
+XrmOptionDescRec options [] =
+{
+    { "-advance", ".advance", XrmoptionSepArg, 0 },
+    { "-circles", ".circles", XrmoptionSepArg, 0 },
+    { "-density", ".density", XrmoptionSepArg, 0 },
+    { "-length",  ".length",  XrmoptionSepArg, 0 },
+    { "-delay",   ".delay",   XrmoptionSepArg, 0 },
+    { "-reset",   ".reset",   XrmoptionSepArg, 0 },
+    { "-size",    ".size",    XrmoptionSepArg, 0 },
+    { 0, 0, 0, 0 }
+};
+
+void
+screenhack (display, window)
+    Display *display;
+    Window window;
+{
+    int delay = get_integer_resource ("delay", "Integer");
+    while (1)
+    {
+        init_wander (display, window);
+        wander (display, window);
+        screenhack_handle_events (display);
+        if (delay) sleep (delay);
+        erase_full_window (display, window);
+    }
+}
diff --git a/hacks/webcollage b/hacks/webcollage
new file mode 100755 (executable)
index 0000000..49768c9
--- /dev/null
@@ -0,0 +1,1717 @@
+#!/usr/local/bin/perl5 -w
+#
+# webcollage, Copyright (c) 1999 by Jamie Zawinski <jwz@jwz.org>
+# This program decorates the screen with random images from the web.
+# One satisfied customer described it as "a nonstop pop culture brainbath."
+#
+# Permission to use, copy, modify, distribute, and sell this software 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.  No representations are made about the suitability of this
+# software for any purpose.  It is provided "as is" without express or 
+# implied warranty.
+
+# To run this as a display mode with xscreensaver, add this to `programs':
+#
+#   default-n:  webcollage -root                                       \n\
+#   default-n: webcollage -root -filter 'vidwhacker -stdin -stdout'    \n\
+#
+# To run this as a CGI program on a web site, do this (these instructions
+# work with Apache 1.3 or newer):
+#
+#   1:  Place this program in your document directory, named "webcollage".
+#       The name shouldn't end in .cgi or .html, since this CGI behaves like
+#       a directory.
+#   2:  Make it world-readable and world-executable.
+#   3:  Create a ".htaccess" file in the same directory containing these lines:
+#         <Files ~ "^webcollage$">
+#         SetHandler cgi-script
+#         </Files>
+#   4:  Create these files in the same directory, world-writable, zero-length:
+#        collage.ppm
+#        collage.tmp
+#        collage.jpg
+#        collage.pending
+#        collage.map
+#
+# Now the CGI is ready to go.
+
+my $copyright = "WebCollage, Copyright (c) 1999" .
+    " Jamie Zawinski <jwz\@jwz.org>\n" .
+    "            http://www.jwz.org/xscreensaver/\n";
+
+my $argv0 = $0;
+my $progname = $argv0; $progname =~ s@.*/@@g;
+my $version = q{ $Revision: 1.7 $ }; $version =~ s/^[^0-9]+([0-9.]+).*$/$1/;
+
+use Socket;
+require Time::Local;
+require POSIX;
+use Fcntl ':flock'; # import LOCK_* constants
+
+
+#  CGI Parameters
+
+my $data_dir     = "";           # if you want the following files to go in
+                                  # some directory below ".", name it here.
+
+my $image_ppm    = "${data_dir}collage.ppm"; # names of the various data files.
+my $image_tmp    = "${data_dir}collage.tmp";
+my $image_jpg    = "${data_dir}collage.jpg";
+my $pending_file = "${data_dir}collage.pending";
+my $map_file     = "${data_dir}collage.map";
+
+my $url_generation_time  = 60;   # total time to spend getting URLs.
+my $image_retrieval_time = 60;    # maximum time to spend loading all images.
+my $max_map_entries = 100;       # how many lines to save in $map_file.
+my $pastes_per_load = 3;          # how many images to try and paste each time.
+
+my $max_age = 5 * 60;             # minutes before it is considered stale.
+my $scale = 1.0;                  # client-side image expansion.
+
+my $img_width = 800;             # size of the image being generated.
+my $img_height = 600;
+
+my @all_files = ($image_ppm, $image_tmp, $image_jpg, $pending_file, $map_file);
+my $script_date;
+
+# Other Parameters
+
+my $random_redirector = "http://random.yahoo.com/bin/ryl";
+my $image_randomizer_a = "http://image.altavista.com/";
+my $image_randomizer = $image_randomizer_a . "cgi-bin/avncgi" .
+                       "?do=3&verb=no&oshape=n&oorder=" .
+                       "&ophoto=1&oart=1&ocolor=1&obw=1" .
+                       "&stype=simage&oprem=0&query=";
+
+my $http_timeout = 30;
+my $ppm_to_root_window_cmd = "xv -root -rmode 5 -viewonly" .
+                             " +noresetroot %%PPM%% -quit";
+my $filter_cmd = undef;
+my $post_filter_cmd = undef;
+my $background = undef;
+my $no_output_p = 0;
+my $urls_only_p = 0;
+my $delay = 0;
+
+my $wordlist = "/usr/dict/words";
+
+if (!-r $wordlist) {
+    $wordlist = "/usr/share/lib/dict/words";    # irix
+}
+
+
+my $min_width = 50;
+my $min_height = 50;
+my $min_ratio = 1/5;
+
+my $DEBUG = 0;
+
+
+
+##############################################################################
+#
+# Retrieving URLs
+#
+##############################################################################
+
+# returns three values: the HTTP response line; the document headers;
+# and the document body.
+#
+sub get_document_1 {
+    my ( $url, $referer, $timeout ) = @_;
+
+    if (!defined($timeout)) { $timeout = $http_timeout; }
+    if ($timeout <= 0) { return undef; }
+    if ($timeout > $http_timeout) { $timeout = $http_timeout; }
+
+    if ( $DEBUG > 3 ) {
+       print STDERR "get_document_1 $url " .
+            ($referer ? $referer : "") . "\n";
+    }
+
+    my($url_proto, $dummy, $serverstring, $path) = split(/\//, $url, 4);
+    if (! ($url_proto && $url_proto =~ m/^http:$/i)) {
+        if ($DEBUG) { print STDERR "not an HTTP URL: $url\n"; }
+        return undef;
+    }
+    my($them,$port) = split(/:/, $serverstring);
+    $port = 80 unless $port;
+    my $size="";
+
+    my ($remote, $iaddr, $paddr, $proto, $line);
+    $remote = $them;
+    if ($port =~ /\D/) { $port = getservbyname($port, 'tcp') }
+    return unless $port;
+    $iaddr   = inet_aton($remote)               || return;
+    $paddr   = sockaddr_in($port, $iaddr);
+
+    @_ =
+    eval {
+        local $SIG{ALRM}  = sub {
+            if ($DEBUG > 0) {
+                print STDERR "timed out ($timeout) for $url\n";
+            }
+            die "alarm\n" };
+        alarm $timeout;
+
+        $proto   = getprotobyname('tcp');
+        socket(S, PF_INET, SOCK_STREAM, $proto)  || return;
+        connect(S, $paddr)    || return;
+
+        select(S); $| = 1; select(STDOUT);
+
+        print S ("GET /$path HTTP/1.0\n" .
+                 "Host: $them\n" .
+                 "User-Agent: $progname/$version\n" .
+                 ($referer ? "Referer: $referer\n" : "") .
+                 "\n");
+
+        my $http = <S>;
+
+        my $head = "";
+        my $body = "";
+        while (<S>) {
+            $head .= $_;
+            last if m@^[\r\n]@;
+        }
+        while (<S>) {
+            $body .= $_;
+        }
+
+        close S;
+
+        return ( $http, $head, $body );
+    };
+    die if ($@ && $@ ne "alarm\n");       # propagate errors
+    if ($@) {
+        # timed out
+        return undef;
+    } else {
+        # didn't
+        alarm 0;
+        return @_;
+    }
+}
+
+
+# returns two values: the document headers; and the document body.
+# if the given URL did a redirect, returns the redirected-to document.
+#
+sub get_document {
+    my ( $url, $referer, $timeout ) = @_;
+    my $start = time;
+
+    do {
+        if (defined($timeout) && $timeout <= 0) { return undef; }
+
+       my ( $http, $head, $body ) = get_document_1 ($url, $referer, $timeout);
+
+        if (defined ($timeout)) {
+            my $now = time;
+            my $elapsed = $now - $start;
+            $timeout -= $elapsed;
+            $start = $now;
+        }
+
+       return undef if ( ! $body );
+
+       if ( $http =~ m@HTTP/[0-9.]+ 30[23]@ ) {
+           $_ = $head;
+           my ( $location ) = m@^location:[ \t]*(.*)$@im;
+           if ( $location ) {
+
+               if ( $DEBUG > 3 ) {
+                   print STDERR "redirect from $url to $location\n";
+               }
+                $referer = $url;
+               $url = $location;
+           } else {
+               return ( $url, $body );
+           }
+
+        } elsif ( $http =~ m@HTTP/[0-9.]+ [4-9][0-9][0-9]@ ) {
+            # http errors -- return nothing.
+            return undef;
+
+       } else {
+
+           return ( $url, $body );
+       }
+
+    } while (1);
+}
+
+
+# given a URL and the body text at that URL, selects and returns a random
+# image from it.  returns undef if no suitable images found.
+#
+sub pick_image_from_body {
+    my ( $base, $body ) = @_;
+
+    $_ = $base;
+
+    # if there's at least one slash after the host, take off the last
+    # pathname component
+    if ( m@^http://[^/]+/@io ) {
+       ( $base = $base ) =~ s@[^/]+$@@go;
+    }
+
+    # if there are no slashes after the host at all, put one on the end.
+    if ( m@^http://[^/]+$@io ) {
+       $base .= "/";
+    }
+
+    if ( $DEBUG > 3 ) {
+       print STDERR "base is $base\n";
+    }
+
+
+    $_ = $body;
+
+    # strip out newlines, compress whitespace
+    s/[\r\n\t ]+/ /go;
+
+    # nuke comments
+    s/<!--.*?-->//go;
+
+    my @urls;
+    my %unique_urls;
+
+    foreach (split(/ *</)) {
+       if ( m/^(img|a) .*(src|href) ?= ?\"? ?(.*?)[ >\"]/io ) {
+
+           my $was_inline = ( "$1" eq "a" || "$1" eq "A" );
+           my $link = $3;
+           my ( $width )  = m/width ?=[ \"]*([0-9]+)/oi;
+           my ( $height ) = m/height ?=[ \"]*([0-9]+)/oi;
+           $_ = $link;
+
+           if ( m@^/@o ) {
+               my $site;
+               ( $site = $base ) =~ s@^(http://[^/]*).*@$1@gio;
+               $_ = "$site$link";
+           } elsif ( ! m@^[^/:?]+:@ ) {
+               $_ = "$base$link";
+                s@/\./@/@g;
+                while (s@/\.\./@/@g) {
+                }
+           }
+
+           # skip non-http
+           if ( ! m@^http://@io ) {
+               next;
+           }
+
+           # skip non-image
+           if ( ! m@[.](gif|jpg|jpeg|pjpg|pjpeg)$@io ) {
+               next;
+           }
+
+#          # skip GIF?
+#          if ( m@[.](gif)@io ) {
+##             if ( $DEBUG > 2 ) { print STDERR "skip GIF $_\n"; }
+#              next;
+#          }
+
+           # skip really short or really narrow images
+           if ( $width && $width < $min_width) {
+               if ( $DEBUG > 2 ) {
+                    if (!$height) { $height = "?"; }
+                   print STDERR "skip narrow image $_ ($width x $height)\n";
+               }
+               next;
+           }
+
+           if ( $height && $height < $min_height) {
+               if ( $DEBUG > 2 ) {
+                    if (!$width) { $width = "?"; }
+                   print STDERR "skip short image $_ ($width x $height)\n";
+               }
+               next;
+           }
+
+            # skip images with ratios that make them look like banners.
+           if ( $min_ratio && $width && $height &&
+                ($width * $min_ratio ) > $height ) {
+               if ( $DEBUG > 2 ) {
+                    if (!$height) { $height = "?"; }
+                   print STDERR "skip bad ratio $_ ($width x $height)\n";
+               }
+               next;
+           }
+
+           my $url = $_;
+
+           if ( $unique_urls{$url} ) {
+               if ( $DEBUG > 2 ) { print STDERR "skip duplicate image $_\n"; }
+               next;
+           }
+
+           if ( $DEBUG > 2 ) {
+               print STDERR "got $url" . 
+                   ($width && $height ? " (${width}x${height})" : "") .
+                   ($was_inline ? " (inline)" : "") . "\n";
+           }
+
+           $urls[++$#urls] = $url;
+           $unique_urls{$url}++;
+
+           # jpegs are preferable to gifs.
+            $_ = $url;
+            if ( ! m@[.]gif$@io ) {
+               $urls[++$#urls] = $url;
+            }
+
+           # pointers to images are preferable to inlined images.
+           if ( ! $was_inline ) {
+               $urls[++$#urls] = $url;
+               $urls[++$#urls] = $url;
+           }
+       }
+    }
+
+    if ( $#urls == 0 ) {
+       if ( $DEBUG > 2 ) {
+           print STDERR "no images on $base\n";
+       }
+       return undef;
+    }
+
+    return undef if ( $#urls < 1 );
+
+    # pick a random element of the table
+    my $i = ((rand() * 99999) % $#urls);
+    my $url = $urls[$i];
+
+    if ( $DEBUG > 2 ) {
+       print STDERR "picked $url\n";
+    }
+
+    return $url;
+}
+
+
+# Using the URL-randomizer, picks a random image on a random page, and
+# returns two URLs: the page containing the image, and the image.
+# Returns undef if nothing found this time.
+#
+sub pick_from_url_randomizer {
+    my ( $timeout ) = @_;
+
+    if ( $DEBUG > 3 ) {
+       print STDERR "\n\npicking from $random_redirector...\n\n";
+    }
+
+    my ( $base, $body ) = get_document ($random_redirector, undef, $timeout);
+
+    return if (!$base || !$body);
+    my $img = pick_image_from_body ($base, $body);
+
+    if ($img) {
+        return ($base, $img);
+    } else {
+        return undef;
+    }
+}
+
+
+sub random_word {
+    
+    my $word = 0;
+    if (open (IN, "<$wordlist")) {
+        my $size = (stat(IN))[7];
+        my $pos = rand $size;
+        if (seek (IN, $pos, 0)) {
+            $word = <IN>;   # toss partial line
+            $word = <IN>;   # keep next line
+        }
+        close (IN);
+    }
+
+    return 0 if (!$word);
+
+    $word =~ s/^[ \t\n\r]+//;
+    $word =~ s/[ \t\n\r]+$//;
+    $word =~ s/ys$/y/;
+    $word =~ s/ally$//;
+    $word =~ s/ly$//;
+    $word =~ s/ies$/y/;
+    $word =~ s/ally$/al/;
+    $word =~ s/izes$/ize/;
+    $word =~ tr/A-Z/a-z/;
+
+    return $word;
+}
+
+
+
+# Using the image-randomizer, picks a random image on a random page, and
+# returns two URLs: the page containing the image, and the image.
+# Returns undef if nothing found this time.
+#
+sub pick_from_image_randomizer {
+    my ( $timeout ) = @_;
+
+    my $words = random_word;
+    $words .= "%20" . random_word;
+    $words .= "%20" . random_word;
+    $words .= "%20" . random_word;
+    $words .= "%20" . random_word;
+
+    my $search_url = $image_randomizer . $words;
+
+    if ( $DEBUG > 3 ) {
+        $_ = $words; s/%20/ /g; print STDERR "search words: $_\n";
+    }
+
+    if ( $DEBUG > 3 ) {
+       print STDERR "\n\npicking from $search_url\n";
+    }
+
+    my $start = time;
+    my ( $base, $body ) = get_document ($search_url, undef, $timeout);
+    if (defined ($timeout)) {
+        $timeout -= (time - $start);
+        return undef if ($timeout <= 0);
+    }
+
+    return undef if (! $body);
+
+
+    my @subpages;
+    my $skipped = 0;
+
+    $_ = $body;
+    s/(<A )/\n$1/gi;
+    foreach (split(/\n/)) {
+
+        if ( m@<A HREF=([^>]+)><IMG SRC=http://image\.altavista\.com@i ) {
+
+            my $u = $1;
+            if (m/^"(.*)"$/) { $u = $1; }
+
+            if (m@\.corbis\.com/@) {
+                $skipped = 1;
+                if ( $DEBUG > 3 ) {
+                    print STDERR "skipping corbis URL: $_\n";
+                }
+                next;
+            } elsif ( $DEBUG > 3 ) {
+                print STDERR "sub-page: $1\n";
+            }
+
+            $subpages[++$#subpages] = $u;
+        }
+    }
+
+    if ( $#subpages <= 0 ) {
+        if (!$skipped) {
+            print STDERR "Found nothing on $base\n";
+        }
+       return undef;
+    }
+
+    # pick a random element of the table
+    my $i = ((rand() * 99999) % $#subpages);
+    my $subpage = $subpages[$i];
+
+    if ( $DEBUG > 3 ) {
+       print STDERR "picked page $subpage\n";
+    }
+
+
+
+    my ( $base2, $body2 ) = get_document ($subpage, $base, $timeout);
+
+    return undef if (!$base2 || !body2);
+
+    my $img = pick_image_from_body ($base2, $body2);
+
+    if ($img) {
+        return ($base2, $img);
+    } else {
+        return undef;
+    }
+}
+
+
+# Picks a random image on a random page, and returns two URLs:
+# the page containing the image, and the image. 
+# Returns undef if nothing found this time.
+# Uses the url-randomizer 1 time in 5, else the image randomizer.
+#
+sub pick_image {
+    my ( $timeout ) = @_;
+
+    if (int(rand 5) == 0) {
+        return pick_from_url_randomizer ($timeout);
+    } else {
+        return pick_from_image_randomizer ($timeout);
+    }
+}
+
+
+# Given the raw body of a GIF document, returns the dimensions of the image.
+#
+sub gif_size {
+    my ($body) = @_;
+    my $type = substr($body, 0, 6);
+    my $s;
+    return undef unless ($type =~ /GIF8[7,9]a/);
+    $s = substr ($body, 6, 10);
+    my ($a,$b,$c,$d) = unpack ("C"x4, $s);
+    return (($b<<8|$a), ($d<<8|$c));
+}
+
+# Given the raw body of a JPEG document, returns the dimensions of the image.
+#
+sub jpeg_size {
+    my ($body) = @_;
+    my $i = 0;
+    my $L = length($body);
+    
+    $c1 = substr($body, $i, 1); $i++;
+    $c2 = substr($body, $i, 1); $i++;
+    return undef unless (ord($c1) == 0xFF && ord($c2) == 0xD8);
+
+    my $ch = "0";
+    while (ord($ch) != 0xDA && $i < $L) {
+        # Find next marker, beginning with 0xFF.
+        while (ord($ch) != 0xFF) {
+            $ch = substr($body, $i, 1); $i++;
+        }
+        # markers can be padded with any number of 0xFF.
+        while (ord($ch) == 0xFF) {
+            $ch = substr($body, $i, 1); $i++;
+        }
+
+        # $ch contains the value of the marker.
+        my $marker = ord($ch);
+
+        if (($marker >= 0xC0) &&
+            ($marker <= 0xCF) &&
+            ($marker != 0xC4) &&
+            ($marker != 0xCC)) {  # it's a SOFn marker
+            $i += 3;
+            my $s = substr($body, $i, 4); $i += 4;
+            my ($a,$b,$c,$d) = unpack("C"x4, $s);
+            return (($c<<8|$d), ($a<<8|$b));
+
+        } else {
+            # We must skip variables, since FFs in variable names aren't
+            # valid JPEG markers.
+            my $s = substr($body, $i, 2); $i += 2;
+            my ($c1, $c2) = unpack ("C"x2, $s); 
+            my $length = ($c1 << 8) | $c2;
+            return undef if ($length < 2);
+            $i += $length-2;
+        }
+    }
+    return undef;
+}
+
+# Given the raw body of a GIF or JPEG document, returns the dimensions of
+# the image.
+#
+sub image_size {
+    my ($body) = @_;
+    my ($w, $h) = gif_size ($body);
+    if ($w && $h) { return ($w, $h); }
+    return jpeg_size ($body);
+}
+
+
+# returns the full path of the named program, or undef.
+#
+sub which {
+    my ($prog) = @_;
+    foreach (split (/:/, $ENV{PATH})) {
+        if (-x "$_/$prog") {
+            return $prog;
+        }
+    }
+    return undef;
+}
+
+##############################################################################
+#
+# Running as a CGI
+#
+##############################################################################
+
+my $body_tag = "<BODY BGCOLOR=\"#000000\" TEXT=\"#DDFFDD\"\n" .
+    "      LINK=\"#00EEEE\" VLINK=\"#EEEE00\" ALINK=\"#FF0000\">\n";
+
+my $html_document =
+    ("" .
+     "<HTML>\n" .
+     "<HEAD>\n" .
+     " <TITLE>WebCollage</TITLE>\n" .
+     "\n" .
+     "</HEAD>\n" .
+     $body_tag .
+     "\n" .
+     "<CENTER><FONT SIZE=1><BR></FONT>" .
+     "<TABLE BORDER=0 CELLPADDING=0 CELLSPACING=0 WIDTH=720>\n" .
+     " <TR>\n" .
+     "  <TD ALIGN=CENTER VALIGN=TOP NOWRAP>\n" .
+     "   <FONT SIZE=\"+3\"><B>WebCollage: </B></FONT>\n" .
+     "   <FONT SIZE=\"-1\"><BR><B>by\n" .
+     "     <A HREF=\"http://www.jwz.org/\">Jamie Zawinski</A></B>\n" .
+     "  </TD>\n" .
+     "  <TD ALIGN=LEFT VALIGN=TOP>\n" .
+     "\n" .
+     "   <P><FONT SIZE=\"+3\"><B>Exterminate All Rational Thought.\n" .
+     "   </B></FONT>\n" .
+     "   <BR>This program creates collages out of random images\n" .
+     "   found on the Web.\n" .
+     "   <P>More images are being added to the\n" .
+     "   collage now: please wait for the image below to load.\n" .
+     "   This will take a minute or two, since it has to contact\n" .
+     "   other web sites to retrieve the images before it can construct\n" .
+     "   the collage.  Once the image below is loaded, you can reload\n" .
+     "   this page to do it again.\n" .
+     "   <P>If you enjoy this, you might also enjoy\n" .
+     "   <A HREF=\"http://www.jwz.org/dadadodo/\">DadaDodo</A>.\n" .
+     "   WebCollage also works as a screen saver, for those of you\n" .
+     "   using Unix: it is included with the\n" .
+     "   <A HREF=\"http://www.jwz.org/xscreensaver/\">XScreenSaver</A>\n" .
+     "   package.<P>\n" .
+     "  </TD>\n" .
+     " </TR>\n" .
+     " <TR>\n" .
+     "  <TD COLSPAN=2 VALIGN=TOP ALIGN=CENTER><TABLE \n" .
+     "      BORDER=2 WIDTH=%%WIDTH%% HEIGHT=%%HEIGHT%% \n" .
+     "      CELLPADDING=0 CELLSPACING=0>\n" .
+     "    <TR><TD BGCOLOR=\"#C0C0C0\">\n" .
+     "      %%MAP%%\n" .
+     "     <A NAME=\"#image\">\n" .
+     "     <IMG SRC=\"%%IMAGE%%\" BORDER=0 \n" .
+     "      WIDTH=%%WIDTH%% HEIGHT=%%HEIGHT%% \n" .
+     "      USEMAP=\"#collage\"></A></TD></TR>\n" .
+     "  </TABLE></TD>\n" .
+     " </TR>\n" .
+     "</TABLE>\n" .
+     "<P>\n" .
+     "</CENTER>\n");
+
+
+my @time_fmt_days = ("Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat");
+my @time_fmt_months = ("Jan", "Feb", "Mar", "Apr", "May", "Jun",
+                       "Jul", "Aug", "Sep", "Oct", "Nov", "Dec");
+
+# Converts a time_t to a string acceptable to HTTP.
+#
+sub format_http_time {
+    my ($time) = @_;
+    my @t = gmtime($time);
+    my ($sec, $min, $hour, $mday, $mon, $year, $wday) = @t;
+    $year += 1900;
+    $wday = $time_fmt_days[$wday];
+    $mon = $time_fmt_months[$mon];
+    return sprintf("%s, %02d %s %d %02d:%02d:%02d GMT",
+                   $wday, $mday, $mon, $year, $hour, $min, $sec);
+}
+
+
+
+# Parses exactly the time format that HTTP requires, no more, no less.
+#
+sub parse_http_time {
+    ($_) = @_;
+
+    if (!m/^[SMTWF][a-z][a-z]+, (\d\d)[- ]([JFMAJSOND][a-z][a-z]+)[- ](\d\d\d?\d?)[- ](\d\d):(\d\d):(\d\d)( GMT)?$/o) {
+        return undef;
+    }
+
+    my @moy = qw(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec);
+    @moy{@moy} = (1..12);
+
+    my $t = Time::Local::timegm($6, $5, $4, $1, $moy{$2}-1,
+                                ($3 < 100 ? $3 : $3-1900));
+    return ($t < 0 ? undef : $t);
+}
+
+
+# Given a modification time, returns a time_t to use as the expiration time
+# of both the HTML and the JPEG.
+#
+sub compute_expires_time {
+    my ($mod_time) = (@_);
+    my $now = time;
+    if ($mod_time < $now) { $mod_time = $now; }
+    return $mod_time + $max_age;
+}
+
+
+# Parse the If-Modified-Since header, and write a response if appropriate.
+# If this returns 1, we're done.
+#
+sub do_ifmod {
+    # see http://vancouver-webpages.com/proxy/log-tail.pl and
+    # http://mnot.cbd.net.au/cache_docs/ for clues about how to
+    # do cacheing properly with CGI-generated documents.
+    my ($mod_time) = (@_);
+    if ($ENV{HTTP_IF_MODIFIED_SINCE}) {
+        my $ims = $ENV{HTTP_IF_MODIFIED_SINCE};
+        $ims =~ s/;.*// ; # lose trailing "; length=3082"
+        $ims = parse_http_time($ims);
+        if ($ims && $mod_time <= $ims) {
+            print "Status: 304 Not Modified\n\n" ;
+            return 1;
+        }
+    }
+    return 0;
+}
+
+
+# Returns N urls of images (and the pages on which they were found.)
+# Unless there is a significant surplus of URLs in the $pending_file,
+# this will spend $url_generation_time seconds generating as many URLs
+# as it can.  The first N will be returned, and the rest will be left
+# in the file.
+#
+sub get_image_urls {
+    my ($count) = @_;
+
+    my @urls;
+    my $body = "";
+    my $file_count = 0;
+
+    local *PEND;
+
+    # Open and lock the file (read/write.)
+    # rewind after locking, in case we had to wait for the lock.
+    #
+    open (PEND, "+<$pending_file") || die "couldn't open $pending_file: $!";
+
+    if ($DEBUG > 2) { print STDERR "jpeg: opened $pending_file\n"; }
+
+    my $flock_wait = time;
+    flock (PEND, LOCK_EX) || die "couldn't lock $pending_file: $!";
+    $flock_wait = (time - $flock_wait);
+
+    seek (PEND, 0, 0)     || die "couldn't rewind $pending_file: $!";
+
+    if ($DEBUG > 2) { print STDERR "jpeg: locked $pending_file\n"; }
+
+
+    # Take N URLs off the top, and leave the rest.
+    #
+    while (<PEND>) {
+        if (--$count >= 0) {
+            if ($DEBUG > 3) { print STDERR "  <   $_"; }
+            s/[\r\n]+$//;
+            $urls[++$#urls] = $_;
+        } else {
+            $body .= $_;
+            if ($DEBUG > 3) { print STDERR "  -   $_"; }
+            $file_count++;
+        }
+    }
+
+    # rewind and overwrite the file
+    seek (PEND, 0, 0)  || die "couldn't rewind $pending_file: $!";
+    truncate (PEND, 0) || die "couldn't truncate $pending_file: $!";
+    print PEND $body;
+
+
+    # If there are fewer than 3x as many URLs as we took left in the file,
+    # then generate as many URLs as we can in N seconds.  Take what we
+    # need from that, and append the rest to the file.  Note that we are
+    # still holding a lock on the file.
+    #
+    # Count the time spent waiting for flock as time spent gathering URLs.
+    # Because that means someone else was doing it.
+    #
+    $body = "";
+    if ($file_count < $count * 3) {
+        my $timeout = $url_generation_time - $flock_wait;
+        my $start = time;
+
+        while (1) {
+            last if ($timeout <= 0);
+
+            if ($DEBUG > 2) { print STDERR "time remaining: $timeout\n"; }
+            my ($base, $img) = pick_image ($timeout);
+
+            if ($img) {
+                $img  =~ s/ /%20/g;
+                $base =~ s/ /%20/g;
+                $_ = "$img $base";
+                if ($count-- >= 0) {
+                    if ($DEBUG > 3) { print STDERR "  <<   $img\n"; }
+                    $urls[++$#urls] = $_;
+                } else {
+                    if ($DEBUG > 3) { print STDERR "  >>   $img\n"; }
+                    print PEND "$_\n"; # append to file
+                    $file_count++;
+                }
+            }
+
+            my $now = time;
+            my $elapsed = $now - $start;
+            $timeout -= $elapsed;
+            $start = $now;
+        }
+    }
+
+    my $of = select(PEND); $| = 1; select($of);                # flush output
+    print PEND "";
+
+    flock (PEND, LOCK_UN) || die "couldn't unlock $pending_file: $!";
+    close (PEND)          || die "couldn't close $pending_file: $!";
+
+    if ($DEBUG > 2) {
+        print STDERR "jpeg: closed $pending_file; $file_count urls in file;" .
+            " returning $#urls.\n";
+    }
+
+    return @urls;
+}
+
+
+sub cgi_reset_all_files {
+    foreach (@all_files) {
+        my $file = $_;
+        local *OUT;
+        open (OUT, "+<$file") || die "couldn't open $file: $!";
+        flock (OUT, LOCK_EX)  || die "couldn't lock $file: $!";
+        truncate (OUT, 0)     || die "couldn't truncate $file: $!";
+        flock (OUT, LOCK_UN)  || die "couldn't unlock $file: $!";
+        close (OUT)           || die "couldn't close $file: $!";
+    }
+
+    system "ppmmake '#000000' $img_width $img_height > $image_ppm" ||
+        die "failed to create blank $image_ppm file: $!";
+    system "cjpeg -progressive $image_ppm > $image_jpg" ||
+        die "failed to create blank $image_jpg file: $!";
+}
+
+
+# Given the URL of an image and the page on which it was found, this will
+# load the image, and paste it at a random spot in $image_ppm and $img_jpg.
+# It will also update $map_file to contain the appropriate referer, and
+# will limit it to $max_map_entries lines.
+#
+sub cgi_paste_image {
+    my ($img, $referer) = @_;
+
+    my ( $base, $body ) = get_document ($img, $referer);
+    return if (!$base || !$body);
+
+    my ($iw, $ih) = image_size ($body);
+    return if (!$iw || !$ih);
+
+    if ($DEBUG > 2) { print STDERR "got $base ($iw x $ih)\n"; }
+
+    my $cmd;
+
+    if ($base =~ m/\.gif$/i) {
+        $cmd = "giftopnm";
+    } else {
+        $cmd = "djpeg";
+    }
+
+    if ($iw > $img_width || $ih > $img_height) {
+        while ($iw > $img_width || $ih > $img_height) {
+            $iw = int($iw / 2);
+            $ih = int($ih / 2);
+        }
+        $cmd .= " | pnmscale -xysize $iw $ih";
+    }
+
+    my $x = int (rand() * ($img_width - $iw));
+    my $y = int (rand() * ($img_height - $ih));
+
+    $cmd .= " | pnmpaste - $x $y $image_ppm";
+
+
+    local *MAP;
+    local *PIPE_OUT;
+
+    # Open and lock the map (read/write.)
+    # rewind after locking, in case we had to wait for the lock.
+    # This lock doubles as our lock on the image file itself.
+    #
+    open (MAP, "+<$map_file") || die "couldn't open $map_file: $!";
+
+    if ($DEBUG > 2) { print STDERR "jpeg: opened $map_file\n"; }
+
+    flock (MAP, LOCK_EX) || die "couldn't lock $map_file: $!";
+    seek (MAP, 0, 0)     || die "couldn't rewind $map_file: $!";
+
+    if ($DEBUG > 2) { print STDERR "jpeg: locked $map_file\n"; }
+
+    # Read in the first hundred lines of the map file.
+    #
+    my $map = "";
+    my $count = 0;
+    while (<MAP>) {
+        last if ($count++ > $max_map_entries);
+        $map .= $_;
+    }
+
+    # Add this entry to the front of the map data.
+    #
+    $map = "$x $y $iw $ih $referer\n" . $map;
+
+
+    # Ensure that the $image_ppm file exists and has a ppm in it.
+    #
+    my $ppm_size = $img_width * $img_height * 3 * 2;
+    my $s = (stat($image_ppm))[7];
+    if ($s < $ppm_size) {
+
+        if ( $DEBUG ) {
+            print STDERR "$image_ppm is $s bytes;" .
+                " should be at least $ppm_size\n";
+            print STDERR "resetting everything.";
+            cgi_reset_all_files();
+        }
+    }
+
+    # Paste the bits into the image.  Note that the map file is still locked.
+    #
+    local *TMP;
+    open (TMP, ">$image_tmp") || die "couldn't open $image_tmp: $!";
+    close (TMP);
+
+    if (! $DEBUG ) {
+        $cmd = "( $cmd ) 2>/dev/null";
+    }
+
+    $cmd .= " > $image_tmp";
+    if ($DEBUG > 2) { print STDERR "executing $cmd\n"; }
+
+    if (open(PIPE_OUT, "| $cmd")) {
+        print PIPE_OUT $body;
+        close(PIPE_OUT);
+
+        if ($DEBUG > 2) { system "ls -ldF $image_tmp >&2"; }
+
+        my @tmp_stat = stat($image_tmp);
+        if (@tmp_stat && $tmp_stat[7] < 200) {
+#            unlink ($image_tmp) || die "couldn't unlink $image_tmp: $!";
+            open (OUT, ">$image_tmp") || die "$image_tmp unwritable: $!";
+            close (OUT);
+            if ($DEBUG > 2) { print STDERR "FAILED writing $image_ppm\n"; }
+        } else {
+#            rename ($image_tmp, $image_ppm) ||
+#                die "couldn't rename $image_tmp to $image_ppm: $!";
+            local *IN;
+            local *OUT;
+            open (IN, "+<$image_tmp") || die "$image_tmp unreadable: $!";
+            open (OUT, ">$image_ppm") || die "$image_ppm unwritable: $!";
+            while (<IN>) { print OUT $_; }
+            truncate (IN, 0) || die "couldn't truncate $image_tmp: $!";
+            close (IN);
+            close (OUT) || die "couldn't write $image_ppm: $!";
+            if ($DEBUG > 2) { print STDERR "wrote $image_ppm\n"; }
+
+
+            # Now convert the PPM to a JPEG.
+            #
+            system "cjpeg -progressive $image_ppm > $image_tmp 2>/dev/null";
+
+            @tmp_stat = stat($image_tmp);
+            if (@tmp_stat && $tmp_stat[7] < 200) {
+#                unlink ($image_tmp) || die "couldn't unlink $image_tmp: $!";
+                open (OUT, ">$image_tmp") || die "$image_tmp unwritable: $!";
+                close (OUT);
+                if ($DEBUG > 2) { print STDERR "FAILED writing $image_jpg\n"; }
+            } else {
+#                rename ($image_tmp, $image_ppm) ||
+#                    die "couldn't rename $image_tmp to $image_ppm: $!";
+                open (IN, "+<$image_tmp") || die "$image_tmp unreadable: $!";
+                open (OUT, ">$image_jpg") || die "$image_jpg unwritable: $!";
+                while (<IN>) { print OUT $_; }
+                truncate (IN, 0) || die "couldn't truncate $image_tmp: $!";
+                close (IN);
+                close (OUT) || die "couldn't write $image_jpg: $!";
+                if ($DEBUG > 2) { print STDERR "wrote $image_jpg\n"; }
+            }
+        }
+
+        # Overwrite the map data.
+        #
+        seek (MAP, 0, 0)  || die "couldn't rewind $map_file: $!";
+        truncate (MAP, 0) || die "couldn't truncate $map_file: $!";
+        print MAP $map;
+    }
+
+    my $of = select(MAP); $| = 1; select($of);         # flush output
+    print MAP "";
+
+    flock (MAP, LOCK_UN) || die "couldn't unlock $map_file: $!";
+    close (MAP)          || die "couldn't close $map_file: $!";
+
+    if ($DEBUG > 2) { print STDERR "jpeg: closed $map_file\n"; }
+}
+
+
+sub cgi_generate_image {
+
+    $SIG{PIPE} = 'IGNORE';
+
+    my @urls = get_image_urls ($pastes_per_load);
+    my $end_time = time + $image_retrieval_time;
+
+    if ($DEBUG > 2) {
+        print STDERR "loading $#urls images\n";
+    }
+
+    foreach (@urls) {
+        my ($img, $referer) = m/^([^ ]+) ([^ ]+)/;
+        if ($img) {
+            cgi_paste_image ($img, $referer);
+        }
+        last if (time > $end_time);
+    }
+}
+
+
+sub cgi_sanity_check {
+    my $error = undef;
+    foreach (@all_files) {
+        if (! -e $_) { $error = "$_ does not exist.\n"; }
+        elsif (! -r $_) { $error = "$_ is unreadable.\n"; }
+        elsif (! -w $_) { $error = "$_ is unwritable.\n"; }
+        last if ($error);
+    }
+
+    return unless $error;
+
+    print "Content-Type: text/html\n";
+    print "\n\n<TITLE>Error</TITLE>$body_tag<H1>Error</H1>";
+    print POSIX::getcwd() . "/" . $error . "<P>\n";
+
+    $_ = join("</TT>, <TT>", @all_files);
+    s/,([^,]*)$/, and$1/;
+
+    print "Each of the files: <TT>$_</TT>\n";
+    print " must exist and be readable and writable by the httpd process\n";
+    print "(which probably means they must be globally readable and\n";
+    print "writable, since on most systems, CGI scripts run as the\n";
+    print "user <I>nobody</I>.)\n<P>\n";
+
+    exit (0);
+}
+
+
+# Write the encapsulating HTML document and associated HTTP headers.
+# This is fast -- it just writes out the wrapper document corresponding
+# to the data currently on disk.  It is the loading of the sub-image
+# that does the real work.
+#
+sub cgi_emit_html_document {
+
+    cgi_sanity_check;
+
+    my $map_file_date;
+    my $doc = $html_document;
+
+    my $w2 = int ($img_width  * $scale);
+    my $h2 = int ($img_height * $scale);
+    $doc =~ s/%%WIDTH%%/$w2/g;
+    $doc =~ s/%%HEIGHT%%/$h2/g;
+
+    local *MAP;
+    open (MAP, "<$map_file") || die "couldn't open $map_file: $!";
+    if ($DEBUG > 2) { print STDERR "html: opened $map_file\n"; }
+
+    flock (MAP, LOCK_SH) || die "couldn't lock $map_file: $!";
+    seek (MAP, 0, 0)     || die "couldn't rewind $map_file: $!";
+    if ($DEBUG > 2) { print STDERR "html: locked $map_file\n"; }
+
+    $map_file_date = (stat(MAP))[9];
+
+    my $map = "<MAP NAME=\"collage\">\n";
+    while (<MAP>) {
+        my ($x, $y, $w, $h, $url) =
+            m/^([0-9]+) ([0-9]+) ([0-9]+) ([0-9]+) (.*)$/;
+        if ($w && $h) {
+            $x = int($x * $scale);
+            $y = int($y * $scale);
+            $w = int($w * $scale);
+            $h = int($h * $scale);
+
+            # protect against URLs that contain <, >, or ".
+            $url =~ s/([<>\"])/uc sprintf("%%%02X",ord($1))/eg;
+
+            my $x2 = $x + $w;
+            my $y2 = $y + $h;
+            $map .=
+                "<AREA SHAPE=RECT COORDS=\"$x,$y,$x2,$y2\" HREF=\"$url\">\n";
+        }
+    }
+    $map .= "</MAP>";
+    flock (MAP, LOCK_UN) || die "couldn't unlock $map_file: $!";
+    close (MAP)          || die "couldn't close $map_file: $!";
+
+    if ($DEBUG > 2) { print STDERR "html: closed $map_file\n"; }
+
+    $doc =~ s/%%MAP%%/$map/g;
+
+    my $img_name = "current";
+
+    $doc =~ s@%%IMAGE%%@images/$img_name.jpg@g;
+
+
+    my $mod_time = $map_file_date;
+    if ($script_date > $mod_time) { $mod_time = $script_date; }
+
+    if (do_ifmod($mod_time)) {
+        return;
+    }
+
+    my $exp = compute_expires_time($mod_time);
+
+    print "Content-Type: text/html\n";
+    print "Content-Length: " . length($doc) . "\n";
+    print "Last-Modified: " . format_http_time($mod_time) . "\n";
+
+    # This is a suggestion to consider the object invalid after the given
+    # date.  This is sometimes ignored.
+    #
+    print "Expires: " . format_http_time($exp) . "\n";
+
+    # This may or may not cause a cacheing proxy to pass this stuff along.
+    # It's not standardized, but was historically used for... something.
+    print "Pragma: no-cache\n";
+
+    # This says the same thing as the Expires header, but it is a stronger
+    # assertion that we're serious and should be listened to.
+    #
+    my $age = $exp - time;
+    print "Cache-Control: max-age=$age, must-revalidate\n";
+
+    print "\n";
+    print $doc;
+}
+
+
+# Write the interior JPEG document and associated HTTP headers.
+#
+sub cgi_emit_jpeg_document {
+
+    my $image_data = "";
+    my $jpg_file_date;
+    my $do_ims = 0;
+
+    # The map file is the means by which we hold write-locks on the image
+    # file.  So first obtain the lock on that file.
+    #
+    local *MAP;
+    open (MAP, "+<$map_file") || die "couldn't open $map_file: $!";
+
+    if ($DEBUG > 2) { print STDERR "jpeg: opened $map_file\n"; }
+    flock (MAP, LOCK_SH) || die "couldn't lock $map_file: $!";
+    if ($DEBUG > 2) { print STDERR "jpeg: locked $map_file\n"; }
+
+    # Now we have exclusive access to the image file.  Read it.
+    #
+    local *IMG;
+    open (IMG, "<$image_jpg") || die "couldn't open $image_jpg: $!";
+
+    $jpg_file_date = (stat(IMG))[9];
+
+    if (do_ifmod($jpg_file_date)) {
+        $do_ims = 1;
+        if ($DEBUG > 2) {
+            my $ims = $ENV{HTTP_IF_MODIFIED_SINCE};
+            $ims =~ s/;.*//;
+            print STDERR "not-modified-since " .
+                localtime(parse_http_time($ims)) . "\n";
+            print STDERR "jpg date: " . localtime($jpg_file_date) . "\n";
+        }
+    }
+
+    if (!$do_ims) {
+        while (<IMG>) { $image_data .= $_; }
+    }
+    close (IMG) || die "couldn't close $image_jpg: $!";
+
+    # Now free the lock so that others can write to the file.
+    #
+    flock (MAP, LOCK_UN) || die "couldn't unlock $map_file: $!";
+    close (MAP)          || die "couldn't close $map_file: $!";
+    if ($DEBUG > 2) { print STDERR "jpeg: closed $map_file\n"; }
+
+    return if ($do_ims);
+
+
+    # At this point, we have the image data we will be returning.
+    # However, don't return it yet -- first go off and generate the
+    # *next* image, then we can return *this* one.  If we don't do it
+    # in this order, people will jump the gun hitting reload, and no
+    # image updates will happen.
+    #
+    my $type = "image/jpeg";
+    my $mod_time = $jpg_file_date;
+    if ($script_date > $mod_time) { $mod_time = $script_date; }
+
+    print "Last-Modified: " . format_http_time($mod_time) . "\n";
+    print "Expires: " . format_http_time(compute_expires_time($mod_time))
+        . "\n";
+    print "Content-Type: $type\n";
+    print "Content-Length: " . length($image_data) . "\n";
+    print "\n";
+
+    # Now, before returning the image data, go catatonic for a minute
+    # while we load some URLs and make the next image.
+    #
+    cgi_generate_image;
+
+    # Done setting up for next time -- now finish loading.
+    #
+    print $image_data;
+    $image_data = undef;
+}
+
+
+# Write the source code of this script as a text/plain document.
+#
+sub cgi_emit_source_document {
+    my $mod_time = $script_date;
+
+    if (do_ifmod($mod_time)) {
+        return;
+    }
+
+    print "Content-Type: text/plain\n";
+    print "Last-Modified: " . format_http_time($mod_time) . "\n";
+    print "\n";
+    open (IN, "<$argv0") || die "couldn't open $argv0: $!";
+    while (<IN>) {
+        print;
+    }
+    close (IN);
+}
+
+
+# Parse the various environment variables to decide how we were invoked,
+# and then do something about it.
+#
+sub cgi_main {
+
+    $DEBUG=4;
+
+    $ENV{PATH} .= ":/usr/local/bin";
+
+    # make sure the various programs we execute exist, right up front.
+    foreach ("ppmmake", "cjpeg", "djpeg", "giftopnm", "pnmpaste", "pnmscale") {
+        if (!which ($_)) {
+            print "Content-Type: text/html\n";
+            print "\n\n<TITLE>Error</TITLE>$body_tag<H1>Error</H1>";
+            print "The <TT>$_</TT> program was not found on \$PATH.<BR>\n";
+
+            my $p = $ENV{PATH};
+            $p =~ s/%/%25/g; $p =~ s/\&/%26/g;
+            $p =~ s/</%3C/g; $p =~ s/>/%3E/g;
+            $p =~ s/:/:<WBR>/g;
+            print "\$PATH is: <TT>$p</TT><P>\n";
+            exit (0);
+        }
+    }
+
+    $script_date = (stat($argv0))[9];
+
+    print "Blat: Foop\n";
+
+    if ($ENV{REQUEST_METHOD} &&
+        $ENV{REQUEST_METHOD} ne "GET" &&
+        $ENV{REQUEST_METHOD} ne "HEAD" ) {
+        print "Content-Type: text/html\n";
+        print "\n\n<TITLE>Error</TITLE>$body_tag<H1>Error</H1>";
+        $_ = $ENV{REQUEST_METHOD};
+        print "bad request method: <TT>$_</TT>\n";
+        exit (0);
+
+    } elsif ( $ENV{QUERY_STRING} ) {
+        if ( $ENV{QUERY_STRING} eq "reset" ) {
+            cgi_reset_all_files;
+
+            print "Content-Type: text/html\n";
+            print "\n\n<TITLE>Collage Reset</TITLE>";
+            print "$body_tag<H1>Collage Reset</H1><P>\n";
+            exit (0);
+
+        } else {
+            print "Content-Type: text/html\n";
+            print "\n\n<TITLE>Error</TITLE>$body_tag<H1>Error</H1>";
+            $_ = $ENV{QUERY_STRING};
+            print "malformed URL: <TT>$_</TT>\n";
+            exit (0);
+        }
+
+    } elsif ( !$ENV{PATH_INFO} || $ENV{PATH_INFO} eq "" ) {
+        # don't allow /webcollage as a URL -- force it to be /webcollage/
+        print "Status: 301 Moved Permanently\n";
+        print "Location: http://" .
+            ($ENV{HTTP_HOST} ? $ENV{HTTP_HOST} : 
+             $ENV{SERVER_NAME} ? $ENV{SERVER_NAME} : "???") .
+            ($ENV{REQUEST_URI} ? $ENV{REQUEST_URI} : "") .
+                "/\n\n";
+        exit (0);
+
+    } elsif ( $ENV{PATH_INFO} eq "/" ) {
+       cgi_emit_html_document;
+
+    } elsif ( $ENV{PATH_INFO} =~ m@^/images/[^/]+\.jpg$@ ) {
+        cgi_emit_jpeg_document;
+
+    } elsif ( $ENV{PATH_INFO} eq "/webcollage.pl" ) {
+        cgi_emit_source_document;
+
+    } else {
+        print "Content-Type: text/html\n";
+        print "\n\n<TITLE>Error</TITLE>$body_tag<H1>Error</H1>";
+        $_ = $ENV{PATH_INFO};
+        print "malformed URL: <TT>$_</TT>\n";
+        exit (0);
+    }
+}
+
+
+##############################################################################
+#
+# Generating a list of urls only
+#
+##############################################################################
+
+sub url_only_output {
+    $| = 1;
+    do {
+        my ($base, $img) = pick_image;
+        if ($img) {
+            $base =~ s/ /%20/g;
+            $img  =~ s/ /%20/g;
+            print "$img $base\n";
+        }
+    } while (1);
+}
+
+##############################################################################
+#
+# Running as an xscreensaver module
+#
+##############################################################################
+
+my $image_tmp2;
+my $image_tmp3;
+
+sub x_cleanup {
+    if ($DEBUG > 0) { print STDERR "caught signal\n"; }
+    unlink $image_ppm, $image_tmp, $image_tmp2, $image_tmp3;
+    exit 1;
+}
+
+
+sub x_output {
+
+    my $win_cmd = $ppm_to_root_window_cmd;
+    $win_cmd =~ s/^([^ \t\r\n]+).*$/$1/;
+
+    # make sure the various programs we execute exist, right up front.
+    foreach ("ppmmake", "giftopnm", "djpeg", "pnmpaste", "pnmscale",
+             $win_cmd) {
+        which ($_) || die "$progname: $_ not found on \$PATH.\n";
+    }
+
+    $SIG{HUP}  = \&x_cleanup;
+    $SIG{INT}  = \&x_cleanup;
+    $SIG{QUIT} = \&x_cleanup;
+    $SIG{ABRT} = \&x_cleanup;
+    $SIG{KILL} = \&x_cleanup;
+    $SIG{TERM} = \&x_cleanup;
+
+    # Need this so that if giftopnm dies, we don't die.
+    $SIG{PIPE} = 'IGNORE';
+
+    if (!$img_width || !$img_height) {
+        $_ = "xdpyinfo";
+        which ($_) || die "$progname: $_ not found on \$PATH.\n";
+        $_ = `$_`;
+        ($img_width, $img_height) = m/dimensions: *([0-9]+)x([0-9]+) /;
+    }
+
+    my $bgcolor = "#000000";
+    my $bgimage = undef;
+
+    if ($background) {
+        if ($background =~ m/^\#[0-9a-f]+$/i) {
+            $bgcolor = $background;
+        } elsif (-r $background) {
+            $bgimage = $background;
+            
+        } elsif (! $background =~ m@^[-a-z0-9 ]+$@i) {
+            print STDERR "not a color or readable file: $background\n";
+            exit 1;
+        } else {
+            # default to assuming it's a color
+            $bgcolor = $background;
+        }
+    }
+
+    # Create the sold-colored base image.
+    #
+    $_ = "ppmmake '$bgcolor' $img_width $img_height";
+    if ($DEBUG > 1) {
+        print STDERR "creating base image: $_\n";
+    }
+    system "$_ > $image_ppm";
+
+    # Paste the default background image in the middle of it.
+    #
+    if ($bgimage) {
+        my ($iw, $ih);
+        if (open(IMG, "<$bgimage")) {
+            $_ = <IMG>;
+            $_ = <IMG>;
+            ($iw, $ih) = m/^([0-9]+) ([0-9]+)$/;
+            close (IMG);
+        }
+        my $x = int (($img_width - $iw) / 2);
+        my $y = int (($img_height - $ih) / 2);
+        if ($DEBUG > 1) {
+            print STDERR "pasting $bgimage into base image at $x, $y\n";
+        }
+        system "pnmpaste $bgimage $x $y $image_ppm > $image_tmp2" .
+            " && mv $image_tmp2 $image_ppm";
+    }
+
+
+    do {
+        my ($base, $img) = pick_image;
+
+        my ($headers, $body);
+        if ($img) {
+            ($headers, $body) = get_document ($img, $base);
+        }
+
+        if ($body) {
+
+            if ($DEBUG > 0) {
+                print STDERR "got $img (" . length($body) . ")\n";
+            }
+
+            my $cmd;
+            if ($img =~ m/\.gif/i) {
+                $cmd = "giftopnm";
+            } else {
+                $cmd = "djpeg";
+            }
+
+            if ($DEBUG == 0) {
+                $cmd .= " 2>/dev/null";
+            }
+
+            if (open(PIPE, "| $cmd > $image_tmp")) {
+                print PIPE $body;
+                close PIPE;
+
+                if ($DEBUG > 1) {
+                    print STDERR "created $image_tmp ($cmd)\n";
+                }
+            }
+
+            if (-s $image_tmp) {
+
+                if ($filter_cmd) {
+                    if ($DEBUG > 1) {
+                        print STDERR "running $filter_cmd\n";
+                    }
+                    system "($filter_cmd) < $image_tmp > $image_tmp3" .
+                        " && mv $image_tmp3 $image_tmp";
+                }
+
+                my ($iw, $ih);
+                if (open(IMG, "<$image_tmp")) {
+                    $_ = <IMG>;
+                    $_ = <IMG>;
+                    ($iw, $ih) = m/^([0-9]+) ([0-9]+)$/;
+                    close (IMG);
+                }
+
+                if ($iw && $ih) {
+
+                    if ($DEBUG > 1) {
+                        print STDERR "image size is $iw x $ih\n";
+                    }
+
+                    if ($iw > $img_width || $ih > $img_height) {
+                        while ($iw > $img_width ||
+                               $ih > $img_height) {
+                            $iw = int($iw / 2);
+                            $ih = int($ih / 2);
+                        }
+                        if ($DEBUG > 1) {
+                            print STDERR "scaling to $iw x $ih\n";
+                        }
+                        system "pnmscale -xysize $iw $ih $image_tmp" .
+                            " > $image_tmp2" .
+                            " 2>/dev/null && mv $image_tmp2 $image_tmp";
+                    }
+
+                    my $x = int (rand() * ($img_width - $iw));
+                    my $y = int (rand() * ($img_height - $ih));
+
+                    if ($DEBUG > 1) {
+                        print STDERR "pasting at $x, $y in $image_ppm\n";
+                    }
+
+                    system "pnmpaste $image_tmp $x $y $image_ppm" .
+                        " > $image_tmp2" .
+                        " && mv $image_tmp2 $image_ppm";
+
+
+                    my $target = $image_ppm;
+                    if ($post_filter_cmd) {
+                        if ($DEBUG > 1) {
+                            print STDERR "running $post_filter_cmd\n";
+                        }
+                        system "($post_filter_cmd) < $image_ppm > $image_tmp3";
+                        $target = $image_tmp3;
+                    }
+
+                    if (!$no_output_p) {
+
+                        my $tsize = (stat($target))[7];
+                        if ($tsize > 200) {
+                            $_ = $ppm_to_root_window_cmd;
+                            s/%%PPM%%/$target/;
+
+                            if ($DEBUG > 1) {
+                                print STDERR "running $_\n";
+                            }
+                            system $_;
+
+                        } elsif ($DEBUG > 1) {
+                            print STDERR "$target size is $tsize\n";
+                        }
+                    }
+                }
+            }
+            unlink $image_tmp, $image_tmp2, $image_tmp3;
+        }
+
+        sleep $delay;
+
+    } while (1);
+}
+
+
+sub x_main {
+
+    # Unlike CGI, when running in X mode, the various tmp files should be
+    # in the /tmp directory and should have gensymed names.
+    #
+    $image_ppm = ($ENV{TMPDIR} ? $ENV{TMPDIR} : "/tmp") . "/webcollage." . $$;
+    $image_tmp   = $image_ppm . "-1";
+    $image_tmp2  = $image_ppm . "-2";
+    $image_tmp3  = $image_ppm . "-3";
+
+    # In X mode, these aren't used.  Set them to undef to error if we try.
+    #
+    $data_dir = undef;
+    $image_jpg = undef;
+    $pending_file = undef;
+    $map_file = undef;
+    $url_generation_time = undef;
+    $image_retrieval_time = undef;
+    $max_map_entries = undef;
+    $pastes_per_load = undef;
+    $max_age = undef;
+    $script_date = undef;
+    @all_files = undef;
+
+    # In X mode, these come either from the command line, or from the X server.
+    $img_width = undef;
+    $img_height = undef;
+
+
+    my $root_p = 0;
+
+    while ($_ = $ARGV[0]) {
+        shift @ARGV;
+        if ($_ eq "-display" ||
+            $_ eq "-displ" ||
+            $_ eq "-disp" ||
+            $_ eq "-dis" ||
+            $_ eq "-dpy" ||
+            $_ eq "-d") {
+            $ENV{DISPLAY} = shift @ARGV;
+        } elsif ($_ eq "-root") {
+            $root_p = 1;
+        } elsif ($_ eq "-no-output") {
+            $no_output_p = 1;
+        } elsif ($_ eq "-urls-only") {
+            $urls_only_p = 1;
+            $no_output_p = 1;
+        } elsif ($_ eq "-verbose") {
+            $DEBUG++;
+        } elsif (m/^-v+$/) {
+            $DEBUG += length($_)-1;
+        } elsif ($_ eq "-delay") {
+            $delay = shift @ARGV;
+        } elsif ($_ eq "-timeout") {
+            $http_timeout = shift @ARGV;
+        } elsif ($_ eq "-filter") {
+            $filter_cmd = shift @ARGV;
+        } elsif ($_ eq "-filter2") {
+            $post_filter_cmd = shift @ARGV;
+        } elsif ($_ eq "-background" || $_ eq "-bg") {
+            $background = shift @ARGV;
+        } elsif ($_ eq "-size") {
+            $_ = shift @ARGV;
+            if (m@^([0-9]+)x([0-9]+)$@) {
+                $img_width = $1;
+                $img_height = $2;
+            } else {
+                die "$progname: argument to \"-size\" must be" .
+                    " of the form \"640x400\"\n";
+            }
+        } else {
+            die "$copyright\nusage: $progname [-root]" .
+                " [-display dpy] [-root] [-verbose] [-timeout secs]\n" .
+                "\t\t  [-delay secs] [-filter cmd] [-filter2 cmd]\n";
+        }
+    }
+
+    if (!$root_p && !$no_output_p) {
+        die "$copyright" .
+            "$progname: the -root argument is manditory (for now.)\n";
+    }
+
+    if (!$no_output_p && !$ENV{DISPLAY}) {
+        die "$progname: \$DISPLAY is not set.\n";
+    }
+
+    if ($urls_only_p) {
+        url_only_output;
+    } else {
+        x_output;
+    }
+}
+
+
+##############################################################################
+#
+# Decide if we're in X or CGI mode, and dispatch.
+#
+##############################################################################
+
+sub main {
+    srand(time ^ $$);
+    if ( $progname =~ m/\.cgi$/i || $ENV{REQUEST_METHOD} ) {
+        cgi_main;
+    } else {
+        x_main;
+    }
+}
+
+main;
+exit (0);
diff --git a/hacks/webcollage.man b/hacks/webcollage.man
new file mode 100644 (file)
index 0000000..6004c45
--- /dev/null
@@ -0,0 +1,136 @@
+.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
+..
+.TH XScreenSaver 1 "17-Jun-99" "X Version 11"
+.SH NAME
+webcollage - decorate the screen with random images from the web
+.SH SYNOPSIS
+.B webcollage
+[\-display \fIhost:display.screen\fP] [\-root] [\-verbose]
+[\-delay \fIsecs\fP] [\-timeout \fIsecs\fP] [\-background \fIbg\fP]
+[\-filter \fIcommand\fP] [\-filter2 \fIcommand\fP]
+.SH DESCRIPTION
+The \fIwebcollage\fP program pulls random image off of the World Wide Web
+and scatters them on the root window.  One satisfied customer described it
+as "a nonstop pop culture brainbath."  This program finds its images by
+doing random web searches, and extracting images from the returned pages.
+It places the images on the root window by using the
+.BR xv (1),
+.BR giftopnm (1),
+and
+.BR djpeg (1)
+tools.
+
+\fIwebcollage\fP also works as a CGI program, that will add images to the
+collage on a web page each time the page is loaded.  See the comments at 
+the top of the source code for installation instructions.
+
+\fIwebcollage\fP is written in
+.BR perl (1)
+and requires Perl 5.
+.SH OPTIONS
+.I webcollage
+accepts the following options:
+.TP 8
+.B \-root
+Draw on the root window.  This option is manditory: drawing to a window
+other than the root window is not yet supported.
+.TP 8
+.B \-verbose \fRor\fP \-v
+Print diagnostics to stderr.  Multiple \fI-v\fP switches increase the
+amount of output.  \fI-v\fP will print out only the URLs of the 
+images; \fI-vv\fP will print all the commands being run; and \fI-vvv\fP
+will print more than you care about.
+.TP 8
+.B \-delay \fIseconds\fP
+How long to sleep between images.  Default 1 second.  (Remember that
+this program probably spends a lot of time waiting for the network.)
+.TP 8
+.B \-background \fIcolor-or-ppm\fP
+What to use for the background onto which images are pasted.  This may be
+a color name, a hexadecimal RGB specification in the form '#rrggbb', or 
+the name of a PPM file.
+.TP 8
+.B \-timeout \fIseconds\fP
+How long to wait for a URL to complete before giving up on it and
+moving on to the next one.
+Default 30 seconds.
+.TP 8
+.B \-filter \fIcommand\fP
+Filter all source images through this command.  The command must take
+a PPM file on stdin, and write a new PPM file to stdout.  One good 
+choice for a filter would be:
+.EX
+webcollage -root -filter 'vidwhacker -stdin -stdout'
+.EE
+.TP 8
+.B \-filter2 \fIcommand\fP
+Filter the \fIcomposite\fP image through this command.  The \fI-filter\fP
+option applies to the sub-images; the \fI-filter2\fP applies to the
+final, full-screen image.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH FILES AND URLS
+.TP
+.I /usr/dict/words \fRor\fP /usr/share/lib/dict/words
+To find the random words to feed to search engines.
+.PP
+.I http://random.yahoo.com/bin/ryl, http://image.altavista.com/
+To find random web pages.
+.SH BUGS
+When drawing on the root window, it always uses the default colormap.
+This is actually a limitation of xv.  But regardless, when using this
+program with xscreensaver, it must be given the \fBdefault-n\fP 
+visual specification (see the
+.BR xscreensaver (1)
+manual for more details.)
+
+Only the GIF and JPEG image formats are supported.
+
+Transparent and animating GIFs are not supported.
+
+It's slow.
+
+Too many of the images that it finds are text, not pictures.  This is 
+because most of the web is pictures of text.  Which is pretty sad.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1),
+.BR xv (1),
+.BR ppmmake (1),
+.BR giftopnm (1),
+.BR pnmpaste (1),
+.BR pnmscale (1),
+.BR djpeg (1),
+.BR cjpeg (1),
+.BR xdpyinfo (1),
+.BR perl (1),
+.BR vidwhacker (1),
+.BR dadadodo (1)
+.SH COPYRIGHT
+Copyright \(co 1998, 1999 by Jamie Zawinski.  Permission to use, copy, modify, 
+distribute, and sell this software 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.  No representations are made about the 
+suitability of this software for any purpose.  It is provided "as is" without
+express or implied warranty.
+.SH AUTHOR
+Jamie Zawinski <jwz@jwz.org>, 24-May-98.
diff --git a/hacks/worm.c b/hacks/worm.c
new file mode 100644 (file)
index 0000000..7eb5fdf
--- /dev/null
@@ -0,0 +1,441 @@
+
+/* -*- Mode: C; tab-width: 4 -*- */
+/* worm --- draw wiggly worms */
+
+#if !defined( lint ) && !defined( SABER )
+static const char sccsid[] = "@(#)worm.c       4.04 97/07/28 xlockmore";
+
+#endif
+
+/*-
+ * Copyright (c) 1991 by Patrick J. Naughton.
+ *
+ * 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.
+ *
+ * This file is provided AS IS with no warranties of any kind.  The author
+ * shall have no liability with respect to the infringement of copyrights,
+ * trade secrets or any patents by this file or any part thereof.  In no
+ * event will the author be liable for any lost revenue or profits or
+ * other special, indirect and consequential damages.
+ *
+ * Revision History:
+ * 10-May-97: Compatible with xscreensaver
+ * 03-Sep-96: fixed bug in allocation of space for worms, added 3d support
+ *            Henrik Theiling <theiling@coli.uni-sb.de>
+ * 27-Sep-95: put back malloc
+ * 23-Sep-93: got rid of "rint". (David Bagley)
+ * 27-Sep-91: got rid of all malloc calls since there were no calls to free().
+ * 25-Sep-91: Integrated into X11R5 contrib xlock.
+ *
+ * Adapted from a concept in the Dec 87 issue of Scientific American p. 142.
+ *
+ * SunView version: Brad Taylor <brad@sun.com>
+ * X11 version: Dave Lemke <lemke@ncd.com>
+ * xlock version: Boris Putanec <bp@cs.brown.edu>
+ */
+
+#ifdef STANDALONE
+# define PROGCLASS "Worm"
+# define HACK_INIT init_worm
+# define HACK_DRAW draw_worm
+# define worm_opts xlockmore_opts
+# define DEFAULTS      "*delay:  17000 \n"     \
+                                       "*count:  -20 \n"               \
+                                       "*cycles:  10 \n"               \
+                                       "*size:   -3 \n"                \
+                                       "*ncolors: 150 \n"              \
+                                       "*use3d:   False \n"    \
+                                       "*delta3d: 1.5 \n"              \
+                                       "*right3d: red \n"              \
+                                       "*left3d:  blue \n"             \
+                                       "*both3d:  magenta \n"  \
+                                       "*none3d:  black \n     "
+# define SMOOTH_COLORS
+# include "xlockmore.h"                /* in xscreensaver distribution */
+#else /* STANDALONE */
+# include "xlock.h"            /* in xlockmore distribution */
+#endif /* STANDALONE */
+
+ModeSpecOpt worm_opts =
+{0, NULL, 0, NULL, NULL};
+
+#define MINSIZE 1
+
+#define SEGMENTS  36
+#define MINWORMS 1
+
+#define MAXZ      750
+#define MINZ      100
+#define SCREENZ   200
+#define GETZDIFF(z) (MI_DELTA3D(mi)*20.0*(1.0-(SCREENZ)/((float)(z)+MINZ)))
+#define IRINT(x) ((int)(((x)>0.0)?(x)+0.5:(x)-0.5))
+
+/* How many segments to draw per cycle when redrawing */
+#define REDRAWSTEP 3
+
+typedef struct {
+       XPoint     *circ;
+       int        *diffcirc;
+       int         dir, dir2;
+       int         tail;
+       int         x, y, z;
+       int         redrawing, redrawpos;
+} wormstuff;
+
+typedef struct {
+       int         xsize, ysize, zsize;
+       int         wormlength;
+       int         nc;
+       int         nw;
+       int         circsize;
+       wormstuff  *worm;
+       XRectangle *rects;      /* [NUMCOLORS * batchcount/NUMCOLORS+1] */
+       int         maxsize;
+       int        *size;
+       unsigned int chromo;
+} wormstruct;
+
+static float sintab[SEGMENTS];
+static float costab[SEGMENTS];
+static int  init_table = 0;
+
+static wormstruct *worms = NULL;
+
+static void
+worm_doit(ModeInfo * mi, int which, unsigned long color)
+{
+       Display    *display = MI_DISPLAY(mi);
+       Window      window = MI_WINDOW(mi);
+       GC          gc = MI_GC(mi);
+       wormstruct *wp = &worms[MI_SCREEN(mi)];
+       wormstuff  *ws = &wp->worm[which];
+       int         x, y, z;
+       int         diff;
+
+       ws->tail++;
+       if (ws->tail == wp->wormlength)
+               ws->tail = 0;
+
+       x = ws->circ[ws->tail].x;
+       y = ws->circ[ws->tail].y;
+
+       if (MI_WIN_IS_USE3D(mi)) {
+               diff = ws->diffcirc[ws->tail];
+               if (MI_WIN_IS_INSTALL(mi)) {
+                       XSetForeground(display, gc, MI_NONE_COLOR(mi));
+                       XFillRectangle(display, window, gc, x - diff, y,
+                                      wp->circsize, wp->circsize);
+                       XFillRectangle(display, window, gc, x + diff, y,
+                                      wp->circsize, wp->circsize);
+               } else {
+                       XClearArea(display, window, x - diff, y,
+                                  wp->circsize, wp->circsize, False);
+                       XClearArea(display, window, x + diff, y,
+                                  wp->circsize, wp->circsize, False);
+               }
+       } else
+               XClearArea(display, window, x, y, wp->circsize, wp->circsize, False);
+
+       if (LRAND() & 1)
+               ws->dir = (ws->dir + 1) % SEGMENTS;
+       else
+               ws->dir = (ws->dir + SEGMENTS - 1) % SEGMENTS;
+
+       x = (ws->x + IRINT((float) wp->circsize * costab[ws->dir]) +
+            wp->xsize) % wp->xsize;
+       y = (ws->y + IRINT((float) wp->circsize * sintab[ws->dir]) +
+            wp->ysize) % wp->ysize;
+
+       ws->circ[ws->tail].x = x;
+       ws->circ[ws->tail].y = y;
+       ws->x = x;
+       ws->y = y;
+
+       if (MI_WIN_IS_USE3D(mi)) {
+               if (LRAND() & 1)
+                       ws->dir2 = (ws->dir2 + 1) % SEGMENTS;
+               else
+                       ws->dir2 = (ws->dir2 + SEGMENTS - 1) % SEGMENTS;
+               /* for the z-axis the wrap-around looks bad, so worms should just turn around. */
+               z = (int) (ws->z + wp->circsize * sintab[ws->dir2]);
+               if (z < 0 || z >= wp->zsize)
+                       z = (int) (ws->z - wp->circsize * sintab[ws->dir2]);
+
+               diff = (int) (GETZDIFF(z) + 0.5);       /* ROUND */
+               ws->diffcirc[ws->tail] = diff;
+
+               ws->z = z;
+
+               /* right eye */
+               color = 0;
+               wp->rects[color * wp->maxsize + wp->size[color]].x = x + diff;
+               wp->rects[color * wp->maxsize + wp->size[color]].y = y;
+               wp->size[color]++;
+
+               /* left eye */
+               color = 1;
+               wp->rects[color * wp->maxsize + wp->size[color]].x = x - diff;
+               wp->rects[color * wp->maxsize + wp->size[color]].y = y;
+               wp->size[color]++;
+
+#if 0
+               if (ws->redrawing) {    /* Too hard for now */
+                       int         j;
+
+                       for (j = 0; j < REDRAWSTEP; j++) {
+                               int         k = (ws->tail - ws->redrawpos + wp->wormlength)
+                               % wp->wormlength;
+
+                               color = 0;
+                               wp->rects[color * wp->maxsize + wp->size[color]].x =
+                                       ws->circ[k].x + ws->diffcirc[k];
+                               wp->rects[color * wp->maxsize + wp->size[color]].y =
+                                       ws->circ[k].y;
+                               wp->size[color]++;
+
+                               color = 1;
+                               wp->rects[color * wp->maxsize + wp->size[color]].x =
+                                       ws->circ[k].x - ws->diffcirc[k];
+                               wp->rects[color * wp->maxsize + wp->size[color]].y =
+                                       ws->circ[k].y;
+                               wp->size[color]++;
+
+                               if (++(ws->redrawpos) >= wp->wormlength) {
+                                       ws->redrawing = 0;
+                                       break;
+                               }
+                       }
+               }
+#endif
+
+       } else {
+
+               wp->rects[color * wp->maxsize + wp->size[color]].x = x;
+               wp->rects[color * wp->maxsize + wp->size[color]].y = y;
+               wp->size[color]++;
+               if (ws->redrawing) {
+                       int         j;
+
+                       ws->redrawpos++;
+                       /* Compensates for the changed ws->tail
+                          since the last callback. */
+
+                       for (j = 0; j < REDRAWSTEP; j++) {
+                               int         k = (ws->tail - ws->redrawpos + wp->wormlength)
+                               % wp->wormlength;
+
+                               wp->rects[color * wp->maxsize + wp->size[color]].x = ws->circ[k].x;
+                               wp->rects[color * wp->maxsize + wp->size[color]].y = ws->circ[k].y;
+                               wp->size[color]++;
+
+                               if (++(ws->redrawpos) >= wp->wormlength) {
+                                       ws->redrawing = 0;
+                                       break;
+                               }
+                       }
+               }
+       }
+}
+
+static void
+free_worms(wormstruct * wp)
+{
+       int         wn;
+
+       if (wp->worm) {
+               for (wn = 0; wn < wp->nw; wn++) {
+                       if (wp->worm[wn].circ)
+                               (void) free((void *) wp->worm[wn].circ);
+                       if (wp->worm[wn].diffcirc)
+                               (void) free((void *) wp->worm[wn].diffcirc);
+               }
+               (void) free((void *) wp->worm);
+               wp->worm = NULL;
+       }
+       if (wp->rects) {
+               (void) free((void *) wp->rects);
+               wp->rects = NULL;
+       }
+       if (wp->size) {
+               (void) free((void *) wp->size);
+               wp->size = NULL;
+       }
+}
+
+void
+init_worm(ModeInfo * mi)
+{
+       wormstruct *wp;
+       int         size = MI_SIZE(mi);
+       int         i, j;
+
+       if (worms == NULL) {
+               if ((worms = (wormstruct *) calloc(MI_NUM_SCREENS(mi),
+                                              sizeof (wormstruct))) == NULL)
+                       return;
+       }
+       wp = &worms[MI_SCREEN(mi)];
+       if (MI_NPIXELS(mi) <= 2 || MI_WIN_IS_USE3D(mi))
+               wp->nc = 2;
+       else
+               wp->nc = MI_NPIXELS(mi);
+       if (wp->nc > NUMCOLORS)
+               wp->nc = NUMCOLORS;
+
+       free_worms(wp);
+       wp->nw = MI_BATCHCOUNT(mi);
+       if (wp->nw < -MINWORMS)
+               wp->nw = NRAND(-wp->nw - MINWORMS + 1) + MINWORMS;
+       else if (wp->nw < MINWORMS)
+               wp->nw = MINWORMS;
+       if (!wp->worm)
+               wp->worm = (wormstuff *) malloc(wp->nw * sizeof (wormstuff));
+
+       if (!wp->size)
+               wp->size = (int *) malloc(NUMCOLORS * sizeof (int));
+
+       wp->maxsize = (REDRAWSTEP + 1) * wp->nw;        /*  / wp->nc + 1; */
+       if (!wp->rects)
+               wp->rects =
+                       (XRectangle *) malloc(wp->maxsize * NUMCOLORS * sizeof (XRectangle));
+
+
+       if (!init_table) {
+               init_table = 1;
+               for (i = 0; i < SEGMENTS; i++) {
+                       sintab[i] = SINF(i * 2.0 * M_PI / SEGMENTS);
+                       costab[i] = COSF(i * 2.0 * M_PI / SEGMENTS);
+               }
+       }
+       wp->xsize = MI_WIN_WIDTH(mi);
+       wp->ysize = MI_WIN_HEIGHT(mi);
+       wp->zsize = MAXZ - MINZ + 1;
+       if (MI_NPIXELS(mi) > 2)
+               wp->chromo = NRAND(MI_NPIXELS(mi));
+
+       if (size < -MINSIZE)
+               wp->circsize = NRAND(-size - MINSIZE + 1) + MINSIZE;
+       else if (size < MINSIZE)
+               wp->circsize = MINSIZE;
+       else
+               wp->circsize = size;
+
+       for (i = 0; i < wp->nc; i++) {
+               for (j = 0; j < wp->maxsize; j++) {
+                       wp->rects[i * wp->maxsize + j].width = wp->circsize;
+                       wp->rects[i * wp->maxsize + j].height = wp->circsize;
+
+               }
+       }
+       (void) memset((char *) wp->size, 0, wp->nc * sizeof (int));
+
+       wp->wormlength = (int) sqrt(wp->xsize + wp->ysize) *
+               MI_CYCLES(mi) / 8;      /* Fudge this to something reasonable */
+       for (i = 0; i < wp->nw; i++) {
+               wp->worm[i].circ = (XPoint *) malloc(wp->wormlength * sizeof (XPoint));
+               wp->worm[i].diffcirc = (int *) malloc(wp->wormlength * sizeof (int));
+
+               for (j = 0; j < wp->wormlength; j++) {
+                       wp->worm[i].circ[j].x = wp->xsize / 2;
+                       wp->worm[i].circ[j].y = wp->ysize / 2;
+                       if (MI_WIN_IS_USE3D(mi))
+                               wp->worm[i].diffcirc[j] = 0;
+               }
+               wp->worm[i].dir = NRAND(SEGMENTS);
+               wp->worm[i].dir2 = NRAND(SEGMENTS);
+               wp->worm[i].tail = 0;
+               wp->worm[i].x = wp->xsize / 2;
+               wp->worm[i].y = wp->ysize / 2;
+               wp->worm[i].z = SCREENZ - MINZ;
+               wp->worm[i].redrawing = 0;
+       }
+
+       if (MI_WIN_IS_INSTALL(mi) && MI_WIN_IS_USE3D(mi)) {
+               XSetForeground(MI_DISPLAY(mi), MI_GC(mi), MI_NONE_COLOR(mi));
+               XFillRectangle(MI_DISPLAY(mi), MI_WINDOW(mi), MI_GC(mi),
+                              0, 0, wp->xsize, wp->ysize);
+       } else
+               XClearWindow(MI_DISPLAY(mi), MI_WINDOW(mi));
+}
+
+void
+draw_worm(ModeInfo * mi)
+{
+       Display    *display = MI_DISPLAY(mi);
+       Window      window = MI_WINDOW(mi);
+       GC          gc = MI_GC(mi);
+       wormstruct *wp = &worms[MI_SCREEN(mi)];
+       unsigned long wcolor;
+       int         i;
+
+       (void) memset((char *) wp->size, 0, wp->nc * sizeof (int));
+
+       for (i = 0; i < wp->nw; i++) {
+               if (MI_NPIXELS(mi) > 2) {
+                       wcolor = (i + wp->chromo) % wp->nc;
+
+                       worm_doit(mi, i, wcolor);
+               } else
+                       worm_doit(mi, i, (unsigned long) 0);
+       }
+
+       if (MI_WIN_IS_USE3D(mi)) {
+               if (MI_WIN_IS_INSTALL(mi))
+                       XSetFunction(display, gc, GXor);
+               XSetForeground(display, gc, MI_RIGHT_COLOR(mi));
+               XFillRectangles(display, window, gc, &(wp->rects[0]), wp->size[0]);
+
+               XSetForeground(display, gc, MI_LEFT_COLOR(mi));
+               XFillRectangles(display, window, gc, &(wp->rects[wp->maxsize]), wp->size[1]);
+               if (MI_WIN_IS_INSTALL(mi))
+                       XSetFunction(display, gc, GXcopy);
+       } else if (MI_NPIXELS(mi) > 2) {
+               for (i = 0; i < wp->nc; i++) {
+                       XSetForeground(display, gc, MI_PIXEL(mi, i));
+                       XFillRectangles(display, window, gc, &(wp->rects[i * wp->maxsize]), wp->size[i]);
+               }
+       } else {
+               XSetForeground(display, gc, MI_WIN_WHITE_PIXEL(mi));
+               XFillRectangles(display, window, gc,
+                               &(wp->rects[0]), wp->size[0]);
+       }
+
+       if (++wp->chromo == (unsigned long) wp->nc)
+               wp->chromo = 0;
+}
+
+void
+release_worm(ModeInfo * mi)
+{
+       if (worms != NULL) {
+               int         screen;
+
+               for (screen = 0; screen < MI_NUM_SCREENS(mi); screen++)
+                       free_worms(&worms[screen]);
+               (void) free((void *) worms);
+               worms = NULL;
+       }
+}
+
+void
+refresh_worm(ModeInfo * mi)
+{
+       if (MI_WIN_IS_USE3D(mi))
+               /* The 3D code does drawing&clearing by XORing.  We do not
+                  want to go to too much trouble here to make it redraw
+                  correctly. */
+               XClearWindow(MI_DISPLAY(mi), MI_WINDOW(mi));
+       else if (worms != NULL) {
+               wormstruct *wp = &worms[MI_SCREEN(mi)];
+               int         i;
+
+               for (i = 0; i < wp->nw; i++) {
+                       wp->worm[i].redrawing = 1;
+                       wp->worm[i].redrawpos = 0;
+               }
+       }
+}
diff --git a/hacks/xflame.c b/hacks/xflame.c
new file mode 100644 (file)
index 0000000..c32e6a5
--- /dev/null
@@ -0,0 +1,749 @@
+/* xflame, Copyright (c) 1996-1999 Carsten Haitzler <raster@redhat.com>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software 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.  No representations are made about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or 
+ * implied warranty.
+ */
+
+/* Version history as near as I (jwz) can piece together:
+
+   * Carsten Haitzler <raster@redhat.com> wrote the first version in 1996.
+
+   * Rahul Jain <rahul@rice.edu> added support for TrueColor displays.
+
+   * Someone did a rough port of it to use the xscreensaver utility routines
+     instead of creating its own window by hand.
+
+   * Someone (probably Raster) came up with a subsequent version that had
+     a Red Hat logo hardcoded into it.
+
+   * Daniel Zahn <stumpy@religions.com> found that version in 1998, and 
+     hacked it to be able to load a different logo from a PGM (P5) file, 
+     with a single hardcoded pathname.
+
+   * Jamie Zawinski <jwz@jwz.org> found several versions of xflame in
+     March 1999, and pieced them together.  Changes:
+
+       - Correct and fault-tolerant use of the Shared Memory extension;
+         previous versions of xflame did not work when $DISPLAY was remote.
+
+       - Replaced PGM-reading code with code that can read arbitrary XBM
+         and XPM files (color ones will be converted to grayscale.)
+
+       - Command-line options all around -- no hardcoded pathnames or
+         behavioral constants.
+
+       - General cleanup and portability tweaks.
+ */
+
+
+/* portions by Daniel Zahn <stumpy@religions.com> */
+
+
+#include "screenhack.h"
+#include <X11/Xutil.h>
+#include <limits.h>
+
+#ifdef HAVE_XSHM_EXTENSION
+# include "xshm.h"
+#endif /* HAVE_XSHM_EXTENSION */
+
+#ifdef HAVE_XPM
+# include <X11/xpm.h>
+# ifndef PIXEL_ALREADY_TYPEDEFED
+#  define PIXEL_ALREADY_TYPEDEFED /* Sigh, Xmu/Drawing.h needs this... */
+# endif
+#endif
+
+#ifdef HAVE_XMU
+# ifndef VMS
+#  include <X11/Xmu/Drawing.h>
+# else  /* VMS */
+#  include <Xmu/Drawing.h>
+# endif /* VMS */
+#endif /* HAVE_XMU */
+
+#define MAX_VAL             255
+
+static Display         *display;
+static Window          window;
+static int             depth;
+static int             width;
+static int             height;
+static Colormap        colormap;
+static Visual          *visual;
+static Bool            shared;
+static Bool            bloom;
+static XImage          *xim;
+#ifdef HAVE_XSHM_EXTENSION
+static XShmSegmentInfo shminfo;
+#endif /* HAVE_XSHM_EXTENSION */
+static GC              gc;
+static int             ctab[256];
+
+static unsigned char  *flame;
+static unsigned char  *theim;
+static int             fwidth;
+static int             fheight;
+static int             top;
+static int             hspread;
+static int             vspread;
+static int             residual;
+
+static int ihspread;
+static int ivspread;
+static int iresidual;
+static int variance;
+static int vartrend;
+
+static void
+GetXInfo(Display *disp, Window win)
+{
+  XWindowAttributes xwa;
+   
+  XGetWindowAttributes(disp,win,&xwa);
+
+  window   = win;
+  display  = disp;
+  colormap = xwa.colormap;
+  depth    = xwa.depth;
+  visual   = xwa.visual;
+  width    = xwa.width;
+  height   = xwa.height;
+
+  if (width%2)
+    width++;
+  if (height%2)
+    height++;
+}
+
+static void
+MakeImage(void)
+{
+  XGCValues gcv;
+
+#ifdef HAVE_XSHM_EXTENSION
+  shared = True;
+  xim = create_xshm_image (display, visual, depth, ZPixmap, NULL,
+                           &shminfo, width, height);
+#else  /* !HAVE_XSHM_EXTENSION */
+  xim = 0;
+#endif /* !HAVE_XSHM_EXTENSION */
+
+  if (!xim)
+    {
+      shared = False;
+      xim = XCreateImage (display, visual, depth, ZPixmap, 0, NULL,
+                          width, height, 32, 0);
+      if (xim)
+        xim->data = (char *) calloc(xim->height, xim->bytes_per_line);
+      if (!xim || !xim->data)
+        {
+          fprintf(stderr,"%s: out of memory.\n", progname);
+          exit(1);
+        }
+    }
+
+  gc = XCreateGC(display,window,0,&gcv);
+  if (!gc) exit (1);
+}
+
+
+static void
+InitColors(void)
+{
+  int i = 0, j = 0, red = 0, green = 0, blue = 0;
+  XColor fg;
+
+  /* Make it possible to set the color of the flames, 
+     by Raymond Medeiros <ray@stommel.marine.usf.edu> and jwz.
+  */
+  fg.pixel = get_pixel_resource ("foreground", "Foreground",
+                                 display, colormap);
+  XQueryColor (display, colormap, &fg);
+
+  red   = 255 - (fg.red   >> 8);
+  green = 255 - (fg.green >> 8);
+  blue  = 255 - (fg.blue  >> 8);
+
+
+  for (i = 0; i < 256 * 2; i += 2)
+    {
+      XColor xcl;
+      int r = (i - red)   * 3;
+      int g = (i - green) * 3;
+      int b = (i - blue)  * 3;
+    
+      if (r < 0)   r = 0;
+      if (r > 255) r = 255;
+      if (g < 0)   g = 0;
+      if (g > 255) g = 255;
+      if (b < 0)   b = 0;
+      if (b > 255) b = 255;
+
+      xcl.red   = (unsigned short)((r << 8) | r);
+      xcl.green = (unsigned short)((g << 8) | g);
+      xcl.blue  = (unsigned short)((b << 8) | b);
+      xcl.flags = DoRed | DoGreen | DoBlue;
+
+      XAllocColor(display,colormap,&xcl);
+
+      ctab[j++] = (int)xcl.pixel;
+    }
+}
+
+
+static void
+DisplayImage(void)
+{
+#ifdef HAVE_XSHM_EXTENSION
+  if (shared)
+    XShmPutImage(display, window, gc, xim, 0,(top - 1) << 1, 0,
+                 (top - 1) << 1, width, height - ((top - 1) << 1), False);
+  else
+#endif /* HAVE_XSHM_EXTENSION */
+    XPutImage(display, window, gc, xim, 0, (top - 1) << 1, 0,
+              (top - 1) << 1, width, height - ((top - 1) << 1));
+}
+
+
+static void
+InitFlame(void)
+{
+  fwidth  = width / 2;
+  fheight = height / 2;
+  flame   = (unsigned char *) malloc((fwidth + 2) * (fheight + 2)
+                                     * sizeof(unsigned char));
+
+  if (!flame)
+    {
+      fprintf(stderr,"%s: out of memory\n", progname);
+      exit(1);
+    }
+
+  top      = 1;
+  ihspread  = get_integer_resource("hspread", "Integer");
+  ivspread  = get_integer_resource("vspread", "Integer");
+  iresidual = get_integer_resource("residual", "Integer");
+  variance  = get_integer_resource("variance", "Integer");
+  vartrend  = get_integer_resource("vartrend", "Integer");
+  bloom     = get_boolean_resource("bloom",    "Boolean");
+
+# define THROTTLE(VAR,NAME) \
+  if (VAR < 0 || VAR > 255) { \
+    fprintf(stderr, "%s: %s must be in the range 0-255 (not %d).\n", \
+            progname, NAME, VAR); \
+    exit(1); }
+  THROTTLE (ihspread, "hspread");
+  THROTTLE (ivspread, "vspread");
+  THROTTLE (iresidual,"residual");
+  THROTTLE (variance, "variance");
+  THROTTLE (vartrend, "vartrend");
+# undef THROTTLE
+
+
+
+  hspread = ihspread;
+  vspread = ivspread;
+  residual = iresidual;
+}
+
+
+static void
+Flame2Image16(void)
+{
+  int x,y;
+  unsigned short *ptr;
+  unsigned char *ptr1;
+  int v1,v2,v3,v4;
+
+  ptr  = (unsigned short *)xim->data;
+  ptr += (top << 1) * width;
+  ptr1 = flame + 1 + (top * (fwidth + 2));
+
+  for(y = top; y < fheight; y++)
+    {
+      for( x = 0; x < fwidth; x++)
+        {
+          v1 = (int)*ptr1;
+          v2 = (int)*(ptr1 + 1);
+          v3 = (int)*(ptr1 + fwidth + 2);
+          v4 = (int)*(ptr1 + fwidth + 2 + 1);
+          ptr1++;
+          *ptr++ = (unsigned short)ctab[v1];
+          *ptr   = (unsigned short)ctab[(v1 + v2) >> 1];
+          ptr   += width - 1;
+          *ptr++ = (unsigned short)ctab[(v1 + v3) >> 1];
+          *ptr   = (unsigned short)ctab[(v1 + v4) >> 1];
+          ptr   -= width - 1;
+        }
+      ptr  += width;
+      ptr1 += 2;
+    }
+}
+
+static void
+Flame2Image32(void)
+{
+  int x,y;
+  unsigned int *ptr;
+  unsigned char *ptr1;
+  int v1,v2,v3,v4;
+
+  ptr  = (unsigned int *)xim->data;
+  ptr += (top << 1) * width;
+  ptr1 = flame + 1 + (top * (fwidth + 2));
+
+  for( y = top; y < fheight; y++)
+    {
+      for( x = 0; x < fwidth; x++)
+        {
+          v1 = (int)*ptr1;
+          v2 = (int)*(ptr1 + 1);
+          v3 = (int)*(ptr1 + fwidth + 2);
+          v4 = (int)*(ptr1 + fwidth + 2 + 1);
+          ptr1++;
+          *ptr++ = (unsigned int)ctab[v1];
+          *ptr   = (unsigned int)ctab[(v1 + v2) >> 1];
+          ptr   += width - 1;
+          *ptr++ = (unsigned int)ctab[(v1 + v3) >> 1];
+          *ptr   = (unsigned int)ctab[(v1 + v4) >> 1];
+          ptr   -= width - 1;
+        }
+      ptr  += width;
+      ptr1 += 2;
+    }
+}
+
+static void
+Flame2Image8(void)
+{
+  int x,y;
+  unsigned char *ptr;
+  unsigned char *ptr1;
+  int v1,v2,v3,v4;
+
+  ptr  = (unsigned char *)xim->data;
+  ptr += (top << 1) * width;
+  ptr1 = flame + 1 + (top * (fwidth + 2));
+
+  for(y=top;y<fheight;y++)
+    {
+      for(x=0;x<fwidth;x++)
+        {
+          v1 = (int)*ptr1;
+          v2 = (int)*(ptr1 + 1);
+          v3 = (int)*(ptr1 + fwidth + 2);
+          v4 = (int)*(ptr1 + fwidth + 2 + 1);
+          ptr1++;
+          *ptr++ = (unsigned char)ctab[v1];
+          *ptr   = (unsigned char)ctab[(v1 + v2) >> 1];
+          ptr   += width - 1;
+          *ptr++ = (unsigned char)ctab[(v1 + v3) >> 1];
+          *ptr   = (unsigned char)ctab[(v1 + v4) >> 1];
+          ptr   -= width - 1;
+        }
+      ptr  += width;
+      ptr1 += 2;
+    }
+}
+
+static void
+Flame2Image1234567(void)
+{
+  int x,y;
+  unsigned char *ptr1;
+  int v1,v2,v3,v4;
+
+  ptr1 = flame + 1 + (top * (fwidth + 2));
+
+  for( y = top; y < fheight; y++)
+    {
+      for( x = 0; x < fwidth; x++)
+        {
+          v1 = (int)*ptr1;
+          v2 = (int)*(ptr1 + 1);
+          v3 = (int)*(ptr1 + fwidth + 2);
+          v4 = (int)*(ptr1 + fwidth + 2 + 1);
+          ptr1++;
+          XPutPixel(xim,(x << 1),    (y << 1),    ctab[v1]);
+          XPutPixel(xim,(x << 1) + 1,(y << 1),    ctab[(v1 + v2) >> 1]);
+          XPutPixel(xim,(x << 1),    (y << 1) + 1,ctab[(v1 + v3) >> 1]);
+          XPutPixel(xim,(x << 1) + 1,(y << 1) + 1,ctab[(v1 + v4) >> 1]);
+        }
+    }
+}
+
+static void
+Flame2Image(void)
+{
+  if (depth >= 24)      Flame2Image32();
+  else if (depth == 16) Flame2Image16();
+  else if (depth == 8)  Flame2Image8();
+  else if (depth == 15) Flame2Image16(); 
+  else if (depth <  8)  Flame2Image1234567();
+  else if (depth == 12) Flame2Image16();
+}
+
+static void
+FlameActive(void)
+{
+  int x,v1;
+  unsigned char *ptr1;
+   
+  ptr1 = flame + ((fheight + 1) * (fwidth + 2));
+
+  for (x = 0; x < fwidth + 2; x++)
+    {
+      v1      = *ptr1;
+      v1     += ((random() % variance) - vartrend);
+      *ptr1++ = v1 % 255;
+    }
+
+  if (bloom)
+    {
+      v1= (random() % 100);
+      if (v1 == 10)
+       residual += (random()%10);
+      else if (v1 == 20)
+       hspread += (random()%15);
+      else if (v1 == 30)
+       vspread += (random()%20);
+    }
+
+  residual = ((iresidual* 10) + (residual *90)) / 100;
+  hspread  = ((ihspread * 10) + (hspread  *90)) / 100;
+  vspread  = ((ivspread * 10) + (vspread  *90)) / 100;
+}
+
+
+static void
+FlameAdvance(void)
+{
+  int x,y;
+  unsigned char *ptr2;
+  int newtop = top;
+
+  for (y = fheight + 1; y >= top; y--)
+    {
+      int used = 0;
+      unsigned char *ptr1 = flame + 1 + (y * (fwidth + 2));
+      for (x = 0; x < fwidth; x++)
+        {
+          int v1 = (int)*ptr1;
+          int v2, v3;
+          if (v1 > 0)
+            {
+              used = 1;
+              ptr2 = ptr1 - fwidth - 2;
+              v3   = (v1 * vspread) >> 8;
+              v2   = (int)*(ptr2);
+              v2  += v3;
+              if (v2 > MAX_VAL) 
+                v2 = MAX_VAL;
+
+              *(ptr2) = (unsigned char)v2;
+              v3  = (v1 * hspread) >> 8;
+              v2  = (int)*(ptr2 + 1);
+              v2 += v3;
+              if (v2 > MAX_VAL) 
+                v2 = MAX_VAL;
+          
+              *(ptr2 + 1) = (unsigned char)v2;
+              v2          = (int)*(ptr2 - 1);
+              v2         += v3;
+              if (v2 > MAX_VAL) 
+                v2 = MAX_VAL;
+          
+              *(ptr2 - 1) = (unsigned char)v2;
+        
+              if (y < fheight + 1)
+                {
+                  v1    = (v1 * residual) >> 8;
+                  *ptr1 = (unsigned char)v1;
+                }
+            }
+          ptr1++;
+          if (used) 
+            newtop = y - 1;
+        }
+    }
+
+  top = newtop - 1;
+
+  if (top < 1)
+    top = 1;
+}
+
+
+static void
+FlameFill(int val)
+{
+  int x, y;
+  for (y = 0; y < fheight + 1; y++)
+    {
+      unsigned char *ptr1 = flame + 1 + (y * (fwidth + 2));
+      for (x = 0; x < fwidth; x++)
+        {
+          *ptr1 = val;
+          ptr1++;
+        }
+    }
+}
+
+
+static void
+FlamePasteData(unsigned char *d, int xx, int yy, int w, int h)
+{
+  unsigned char *ptr1,*ptr2;
+  ptr2 = d;
+
+  if (xx < 0) xx = 0;
+  if (yy < 0) yy = 0;
+
+  if ((xx >= 0) &&
+      (yy >= 0) &&
+      (xx + w <= fwidth) &&
+      (yy + h <= fheight))
+    {
+      int x, y;
+      for (y = 0; y < h; y++)
+        {
+          ptr1 = flame + 1 + xx + ((yy + y) * (fwidth + 2));
+          for (x = 0; x < w; x++)
+            {
+              if (*ptr2 / 24)
+                *ptr1 += random() % (*ptr2 / 24);
+
+              ptr1++;
+              ptr2++;
+            }
+        }
+    }
+  else
+    {
+      static Bool warned = False;
+      if (!warned)
+        {
+          fprintf (stderr, "%s: window is %dx%d; image must be "
+                   "smaller than %dx%d (not %dx%d).\n",
+                   progname, width, height, fwidth, fheight, w, h);
+          warned = True;
+        }
+    }
+}
+
+
+static unsigned char *
+loadBitmap(int *w, int *h)
+{
+  char *bitmap_name = get_string_resource ("bitmap", "Bitmap");
+
+  if (bitmap_name &&
+      *bitmap_name &&
+      !!strcmp(bitmap_name, "none"))
+    {
+#ifdef HAVE_XPM
+      XpmInfo xpm_info = { 0, };
+      XpmImage xpm_image = { 0, };
+
+      int result = XpmReadFileToXpmImage (bitmap_name, &xpm_image, &xpm_info);
+      if (result == XpmSuccess)
+        {
+          int x, y;
+          unsigned char *result, *o;
+          unsigned char *grays;
+          XWindowAttributes xgwa;
+
+          *w = xpm_image.width;
+          *h = xpm_image.height;
+          result = (unsigned char *) malloc ((*w) * (*h));
+          if (!result)
+            {
+              fprintf(stderr, "%s: out of memory loading %s\n",
+                      progname, bitmap_name);
+              exit (1);
+            }
+
+          XGetWindowAttributes (display, window, &xgwa);
+
+          grays = (unsigned char *) calloc (xpm_image.ncolors+1, 1);
+          for (x = 0; x < xpm_image.ncolors; x++)
+            {
+              XColor xc;
+              XpmColor *xpmc = &xpm_image.colorTable[x];
+              char *cstring = 0;
+              if (xpmc->g_color && *xpmc->g_color)
+                cstring = xpmc->g_color;
+              else if (xpmc->g4_color && *xpmc->g4_color)
+                cstring = xpmc->g4_color;
+              else if (xpmc->c_color && *xpmc->c_color)
+                cstring = xpmc->c_color;
+              else
+                cstring = xpmc->m_color;
+
+              memset (&xc, 0, sizeof(xc));
+              if (!cstring ||
+                  !*cstring ||
+                  !XParseColor (display, xgwa.colormap, cstring, &xc))
+                grays[x] = 0;
+              else
+                grays[x] = (int) (((xc.red   * 0.299) +
+                                   (xc.green * 0.587) +
+                                   (xc.blue  * 0.114))
+                                  / 255);
+            }
+
+          o = result;
+          for (y = 0; y < *h; y++)
+            for (x = 0; x < *w; x++)
+              {
+                int color = xpm_image.data[(y * (*w)) + x];
+                if (color < 0 || color > xpm_image.ncolors) abort();
+                *o++ = grays[color];
+              }
+          return result;
+        }
+      else      /* failed to read XPM -- fall through and try XBM */
+#endif /* HAVE_XPM */
+        {
+#ifdef HAVE_XMU
+          XImage *ximage = 0;
+          int width, height, xh, yh;
+          int x, y;
+          unsigned char *result, *o;
+          Pixmap bitmap =
+            XmuLocateBitmapFile (DefaultScreenOfDisplay (display),
+                                 bitmap_name, 0, 0, &width, &height, &xh, &yh);
+          if (!bitmap)
+            {
+              fprintf(stderr, "%s: unable to load bitmap file %s\n",
+                      progname, bitmap_name);
+              exit (1);
+            }
+          ximage = XGetImage (display, bitmap, 0, 0, width, height,
+                              1L, XYPixmap);
+          XFreePixmap (display, bitmap);
+
+          if (ximage->depth != 1) abort();
+
+          *w = ximage->width;
+          *h = ximage->height;
+          result = (unsigned char *) malloc ((*w) * (*h));
+          if (!result)
+            {
+              fprintf(stderr, "%s: out of memory loading %s\n",
+                      progname, bitmap_name);
+              exit (1);
+            }
+
+          o = result;
+          for (y = 0; y < *h; y++)
+            for (x = 0; x < *w; x++)
+              *o++ = (XGetPixel(ximage, x, y) ? 255 : 0);
+
+          return result;
+
+#else  /* !XMU */
+          fprintf (stderr,
+                   "%s: your vendor doesn't ship the standard Xmu library.\n",
+                   progname);
+          fprintf (stderr, "\tWe can't load XBM files without it.\n");
+          exit (1);
+#endif /* !XMU */
+        }
+    }
+
+  *w = 0;
+  *h = 0;
+  return 0;
+
+}
+
+
+\f
+char *progclass = "XFlame";
+
+char *defaults [] = {
+  ".background:     black",
+  ".foreground:     #FFAF5F",
+  "*bitmap:         none",
+  "*bitmapBaseline: 20",
+  "*delay:          10000",
+  "*hspread:        30",
+  "*vspread:        97",
+  "*residual:       99",
+  "*variance:       50",
+  "*vartrend:       20",
+  "*bloom:          True",   
+
+#ifdef HAVE_XSHM_EXTENSION
+  "*useSHM: False",   /* xshm turns out not to help. */
+#endif /* HAVE_XSHM_EXTENSION */
+   0
+};
+
+XrmOptionDescRec options [] = {
+  { "-delay",     ".delay",          XrmoptionSepArg, 0 },
+  { "-bitmap",    ".bitmap",         XrmoptionSepArg, 0 },
+  { "-baseline",  ".bitmapBaseline", XrmoptionSepArg, 0 },
+  { "-hspread",   ".hspread",        XrmoptionSepArg, 0 },
+  { "-vspread",   ".vspread",        XrmoptionSepArg, 0 },
+  { "-residual",  ".residual",       XrmoptionSepArg, 0 },
+  { "-variance",  ".variance",       XrmoptionSepArg, 0 },
+  { "-vartrend",  ".vartrend",       XrmoptionSepArg, 0 },
+  { "-bloom",     ".bloom",          XrmoptionNoArg, "True" },
+  { "-no-bloom",  ".bloom",          XrmoptionNoArg, "False" },
+#ifdef HAVE_XSHM_EXTENSION
+  { "-shm",       ".useSHM",         XrmoptionNoArg, "True" },
+  { "-no-shm",    ".useSHM",         XrmoptionNoArg, "False" },
+#endif /* HAVE_XSHM_EXTENSION */
+  { 0, 0, 0, 0 }
+};
+
+void
+screenhack (Display *disp, Window win)
+{
+  int theimx = 0, theimy = 0;
+  int baseline = get_integer_resource ("bitmapBaseline", "Integer");
+  int delay = get_integer_resource ("delay", "Integer");
+  xim      = NULL;
+  top      = 1;
+  flame    = NULL;
+
+  GetXInfo(disp,win);
+  InitColors();
+  theim = loadBitmap(&theimx, &theimy);
+
+  /* utils/xshm.c doesn't provide a way to free the shared-memory image, which
+     makes it hard for us to react to window resizing.  So, punt for now.  The
+     size of the window at startup is the size it will stay.
+  */
+  GetXInfo(disp,win);
+
+  MakeImage();
+  InitFlame();
+  FlameFill(0);
+
+  while (1)
+    {
+      FlameActive();
+
+      if (theim)
+        FlamePasteData(theim, (fwidth - theimx) / 2,
+                       fheight - theimy - baseline, theimx, theimy);
+
+      FlameAdvance();
+      Flame2Image();
+      DisplayImage();
+
+      XSync(display,False);
+      screenhack_handle_events(display);
+      if (delay)
+        usleep (delay);
+    }
+}
diff --git a/hacks/xjack.c b/hacks/xjack.c
new file mode 100644 (file)
index 0000000..623103c
--- /dev/null
@@ -0,0 +1,377 @@
+/* xscreensaver, Copyright (c) 1997 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software 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.  No representations are made about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or 
+ * implied warranty.
+ *
+ * Wendy, let me explain something to you.  Whenever you come in here and
+ * interrupt me, you're BREAKING my CONCENTRATION.  You're DISTRACTING me!
+ * And it will then take me time to get back to where I was. You understand?
+ * Now, we're going to make a new rule.  When you come in here and you hear
+ * me typing, or whether you DON'T hear me typing, or whatever the FUCK you
+ * hear me doing; when I'm in here, it means that I am working, THAT means
+ * don't come in!  Now, do you think you can handle that?
+ */
+
+#include <ctype.h>
+#include "screenhack.h"
+
+char *progclass = "XJack";
+
+char *defaults [] = {
+  ".background:                #FFF0B4",
+  ".foreground:                #000000",
+  "XJack.font:         -*-courier-medium-r-*-*-*-240-*-*-m-*-*-*",
+  "*delay:             50000",
+  0
+};
+
+XrmOptionDescRec options [] = {
+  { "-delay",          ".delay",       XrmoptionSepArg, 0 },
+  { "-font",           ".font",        XrmoptionSepArg, 0 },
+  { 0, 0, 0, 0 }
+};
+
+void
+screenhack (Display *dpy, Window window)
+{
+  static const char *source = "All work and no play makes Jack a dull boy.  ";
+  /* If you're here because you're thinking about making the above string be
+     customizable, then you don't get the joke.  You loser. */
+  const char *s = source;
+  int columns, rows;           /* characters */
+  int left, right;             /* characters */
+  int char_width, line_height; /* pixels */
+  int x, y;                    /* characters */
+  int mode = 0;
+  int hspace = 15;             /* pixels */
+  int vspace = 15;             /* pixels */
+  Bool break_para = True;
+  Bool caps = False;
+  int sentences = 0;
+  int paras = 0;
+
+  XWindowAttributes xgwa;
+  XGCValues gcv;
+  GC gc;
+  int delay = get_integer_resource ("delay", "Integer");
+  char *fontname = get_string_resource ("font", "Font");
+  XFontStruct *font = XLoadQueryFont (dpy, fontname);
+
+  if (!font)
+    font = XLoadQueryFont (dpy, "-*-*-medium-r-*-*-*-240-*-*-m-*-*-*");
+  if (!font)
+    font = XLoadQueryFont (dpy, "-*-courier-medium-r-*-*-*-180-*-*-m-*-*-*");
+  if (!font)
+    font = XLoadQueryFont (dpy, "-*-*-*-r-*-*-*-240-*-*-m-*-*-*");
+  if (!font)
+    {
+      fprintf(stderr, "no big fixed-width font like \"%s\"\n", fontname);
+      exit(1);
+    }
+
+  XGetWindowAttributes (dpy, window, &xgwa);
+
+  gcv.font = font->fid;
+  gcv.foreground = get_pixel_resource ("foreground", "Foreground", dpy,
+                                      xgwa.colormap);
+  gcv.background = get_pixel_resource ("background", "Background", dpy,
+                                      xgwa.colormap);
+  gc = XCreateGC (dpy, window, (GCFont | GCForeground | GCBackground), &gcv);
+
+  char_width = (font->per_char
+               ? font->per_char['n'-font->min_char_or_byte2].rbearing
+               : font->min_bounds.rbearing);
+  line_height = font->ascent + font->descent + 1;
+
+  columns = (xgwa.width - hspace - hspace) / char_width;
+  rows = (xgwa.height - vspace - vspace) / line_height;
+
+  left = 0xFF & (random() % ((columns / 2)+1));
+  right = left + (0xFF & (random() % (columns - left - 10)+10));
+  x = 0;
+  y = 0;
+
+  while (1)
+    {
+      int word_length = 0;
+      const char *s2;
+      for (s2 = s; *s2 && *s2 != ' '; s2++)
+       word_length++;
+
+      if (break_para ||
+         (*s != ' ' &&
+          (x + word_length) >= right))
+       {
+         x = left;
+         y++;
+
+         if (break_para)
+           y++;
+
+         if (mode == 1 || mode == 2)
+           {
+             /* 1 = left margin goes southwest; 2 = southeast */
+             left += (mode == 1 ? 1 : -1);
+             if (left >= right - 10)
+               {
+                 if ((right < (columns - 10)) && (random() & 1))
+                   right += (0xFF & (random() % (columns - right)));
+                 else
+                   mode = 2;
+               }
+             else if (left <= 0)
+               {
+                 left = 0;
+                 mode = 1;
+               }
+           }
+         else if (mode == 3 || mode == 4)
+           {
+             /* 3 = right margin goes southeast; 4 = southwest */
+             right += (mode == 3 ? 1 : -1);
+             if (right >= columns)
+               {
+                 right = columns;
+                 mode = 4;
+               }
+             else if (right <= left + 10)
+               mode = 3;
+           }
+
+         if (y >= rows)        /* bottom of page */
+           {
+             /* scroll by 1-5 lines */
+             int lines = (random() % 5 ? 0 : (0xFF & (random() % 5))) + 1;
+             if (break_para)
+               lines++;
+
+             /* but sometimes scroll by a whole page */
+             if (0 == (random() % 100))
+               lines += rows;
+
+             while (lines > 0)
+               {
+                  int i;
+                  int inc = line_height / 7;
+                  int pix_delay = delay / 1000;
+                  if (inc <= 0) inc = 1;
+                  for (i = 0; i < line_height; i += inc)
+                    {
+                      if (i > line_height)
+                        i = line_height;
+                      XCopyArea (dpy, window, window, gc,
+                                 0, inc,
+                                 xgwa.width, xgwa.height - inc,
+                                 0, 0);
+                      XSync (dpy, False);
+                      if (pix_delay) usleep (pix_delay);
+                    }
+                 y--;
+                 lines--;
+
+                  /* See? It's OK. He saw it on the television. */
+                  XClearArea (dpy, window,
+                              0, xgwa.height - vspace - line_height,
+                              xgwa.width, line_height + vspace + vspace,
+                              False);
+                  XSync (dpy, False);
+
+                  XGetWindowAttributes (dpy, window, &xgwa);
+                  columns = (xgwa.width - hspace - hspace) / char_width;
+                  rows = (xgwa.height - vspace - vspace) / line_height;
+                  if (y > rows) y = rows-1;
+                  if (x > columns) x = columns-2;
+
+                  if (delay) usleep (delay);
+               }
+             if (y < 0) y = 0;
+           }
+
+         break_para = False;
+       }
+
+      if (*s != ' ')
+       {
+         char c = *s;
+         int xshift = 0, yshift = 0;
+         if (0 == random() % 50)
+           {
+             xshift = random() % ((char_width / 3) + 1);      /* mis-strike */
+             yshift = random() % ((line_height / 6) + 1);
+             if (0 == (random() % 3))
+               yshift *= 2;
+             if (random() & 1)
+               xshift = -xshift;
+             if (random() & 1)
+               yshift = -yshift;
+           }
+
+         if (0 == (random() % 250))    /* introduce adjascent-key typo */
+           {
+             static const char * const typo[] = {
+               "asqw", "ASQW", "bgvhn", "cxdfv", "dserfcx", "ewsdrf",
+               "Jhuikmn", "kjiol,m", "lkop;.,", "mnjk,", "nbhjm", "oiklp09",
+               "pol;(-0", "redft54", "sawedxz", "uyhji87", "wqase32",
+               "yuhgt67", ".,l;/", 0 };
+             int i = 0;
+             while (typo[i] && typo[i][0] != c)
+               i++;
+             if (typo[i])
+               c = typo[i][0xFF & (random() % strlen(typo[i]+1))];
+           }
+
+         /* caps typo */
+         if (c >= 'a' && c <= 'z' && (caps || 0 == (random() % 350)))
+           {
+             c -= ('a'-'A');
+             if (c == 'O' && random() & 1)
+               c = '0';
+           }
+
+       OVERSTRIKE:
+         XDrawString (dpy, window, gc,
+                      (x * char_width) + hspace + xshift,
+                      (y * line_height) + vspace + font->ascent + yshift,
+                      &c, 1);
+         if (xshift == 0 && yshift == 0 && (0 == (random() & 3000)))
+           {
+             if (random() & 1)
+               xshift--;
+             else
+               yshift--;
+             goto OVERSTRIKE;
+           }
+
+         if ((tolower(c) != tolower(*s))
+             ? (0 == (random() % 10))          /* backup to correct */
+             : (0 == (random() % 400)))        /* fail to advance */
+           {
+             x--;
+             s--;
+             XSync (dpy, False);
+             if (delay) usleep (0xFFFF & (delay + (random() % (delay * 10))));
+           }
+       }
+
+      x++;
+      s++;
+
+      if (0 == random() % 200)
+       {
+         if (random() & 1 && s != source)
+           s--;        /* duplicate character */
+         else if (*s)
+           s++;        /* skip character */
+       }
+
+      if (*s == 0)
+       {
+         sentences++;
+         caps = (0 == random() % 40);  /* capitalize sentence */
+
+         if (0 == (random() % 10) ||   /* randomly break paragraph */
+             (mode == 0 &&
+              ((0 == (random() % 10)) || sentences > 20)))
+           {
+             break_para = True;
+             sentences = 0;
+             paras++;
+
+             if (random() & 1)         /* mode=0 50% of the time */
+               mode = 0;
+             else
+               mode = (0xFF & (random() % 5));
+
+             if (0 == (random() % 2))  /* re-pick margins */
+               {
+                 left = 0xFF & (random() % (columns / 3));
+                 right = columns - (0xFF & (random() % (columns / 3)));
+
+                 if (0 == random() % 3)        /* sometimes be wide */
+                   right = left + ((right - left) / 2);
+               }
+
+             if (right - left <= 10)   /* introduce sanity */
+               {
+                 left = 0;
+                 right = columns;
+               }
+
+             if (right - left > 50)    /* if wide, shrink and move */
+               {
+                 left += (0xFF & (random() % ((columns - 50) + 1)));
+                 right = left + (0xFF & ((random() % 40) + 10));
+               }
+
+             /* oh, gag. */
+             if (mode == 0 &&
+                 right - left < 25 &&
+                 columns > 40)
+               {
+                 right += 20;
+                 if (right > columns)
+                   left -= (right - columns);
+               }
+           }
+         s = source;
+       }
+
+      XSync (dpy, False);
+      if (delay)
+       {
+         usleep (delay);
+         if (0 == random() % 3)
+           usleep(0xFFFFFF & ((random() % (delay * 5)) + 1));
+
+         if (break_para)
+           usleep(0xFFFFFF & ((random() % (delay * 15)) + 1));
+       }
+
+      if (paras > 5 &&
+         (0 == (random() % 1000)) &&
+         y < rows-5)
+       {
+         int i;
+         int n = random() & 3;
+         y++;
+         for (i = 0; i < n; i++)
+           {
+             /* See also http://catalog.com/hopkins/unix-haters/login.html */
+             const char *n1 =
+               "NFS server overlook not responding, still trying...";
+             const char *n2 = "NFS server overlook ok.";
+             while (*n1)
+               {
+                 XDrawString (dpy, window, gc,
+                              (x * char_width) + hspace,
+                              (y * line_height) + vspace + font->ascent,
+                              n1, 1);
+                 x++;
+                 if (x >= columns) x = 0, y++;
+                 n1++;
+               }
+             XSync (dpy, False);
+             usleep (5000000);
+             while (*n2)
+               {
+                 XDrawString (dpy, window, gc,
+                              (x * char_width) + hspace,
+                              (y * line_height) + vspace + font->ascent,
+                              n2, 1);
+                 x++;
+                 if (x >= columns) x = 0, y++;
+                 n2++;
+               }
+             y++;
+             XSync (dpy, False);
+             usleep (500000);
+           }
+       }
+      screenhack_handle_events (dpy);
+    }
+}
diff --git a/hacks/xjack.man b/hacks/xjack.man
new file mode 100644 (file)
index 0000000..390e95f
--- /dev/null
@@ -0,0 +1,51 @@
+.TH XScreenSaver 1 "18-sep-97" "X Version 11"
+.SH NAME
+xjack - all work and no play makes jack a dull boy
+.SH SYNOPSIS
+.B xjack
+[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-delay \fIusecs\fP]
+.SH DESCRIPTION
+All work and no play makes jack a dull boy.  All work and no play makes jack
+a dull boy.  All work and no play makes jack a dull boy.  All work and no
+play makes jack a dull boy.  All work and no play makes jack a dull boy.
+All work and no play makes jack a dull boy.  
+.PP
+.RS 8
+All work and no play makes jack a dull boy.  All work and no play makes jack
+a dull boy.  All work and no play makes jack a dull boy.  All work and no
+play makes jack a dull boy.  All work and no play makes jack a dull boy.
+All work and no play makes jack a dull boy.  
+.PP
+All work and no play makes jack a dull boy.  All work and no play makes jack
+a dull boy.  All work and no play makes jack a dull boy.  All work and no
+play makes jack a dull boy.  All work and no play makes jack a dull boy.  All
+work and no play makes jack a dull boy.  All work and no play makes jack a
+dull boy.  All work and no play makes jack a dull boy.
+.PP
+.RE
+All work and no play makes jack a dull boy.
+All work and no play makes jack a dull boy.  All work and no play makes jack
+a dull boy.  All work and no play makes jack a dull boy.  All work and no
+play makes jack a dull boy.  All work and no play makes jack a dull boy.
+All work and no play makes jack a dull boy.  All work and no play makes jack 
+a dull boy.  
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+All work and no play makes jack a dull boy.  
+.TP 8
+.B XENVIRONMENT
+All work and no play makes jack a dull boy.  All work and no play makes jack
+a dull boy.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 1997 by Jamie Zawinski.  All work and no play makes jack a
+dull boy.  All work and no play makes jack a dull boy.  All work and no play
+makes jack a dull boy.  All work and no play makes jack a dull boy.  All work
+and no play makes jack a fnord dull boy.  All work and no play makes jack a
+dull boy.
+.SH AUTHOR
+Jamie Zawinski <jwz@jwz.org>, 15-Nov-97.
diff --git a/hacks/xlock_23.h b/hacks/xlock_23.h
new file mode 100644 (file)
index 0000000..d509f56
--- /dev/null
@@ -0,0 +1,192 @@
+/*
+**  Helpful definitions for porting xlock modes to xscreensaver.
+**  by Charles Hannum, mycroft@ai.mit.edu
+**
+**  for xlock 2.3 and xscreensaver 1.2, 28AUG92
+**
+**  Modified for xlockmore 3.0 by Anthony Thyssen <anthony@cit.gu.edu.au>
+**  on August 1995.
+**
+**  Tweaked by jwz to work with both ANSI and K&R compilers, 10-May-97.
+**
+**    Note: this file no longer works as of (at least) xlockmore 4.03a10:
+**    see jwz's new xlockmore.h file for a similar hack that works with
+**    code written for that version.
+**
+**  To use, just copy the appropriate file from xlock, add a target
+**  for it in the Imakefile, and do the following:
+**
+**  1) If you include math.h, make sure it is before xlock.h.
+**  2) Make sure the first thing you do in initfoo() is to call
+**     XGetWindowAttributes.  This is what actually sets up the
+**     colormap and whatnot.
+**  3) Add an appropriate PROGRAM() line at the end of the .c file.
+**     The information you need for this comes from xlock's file
+**     resource.c.
+**
+**  That's about all there is to it.
+**
+**  As an added bonus, if you put an empty definition of PROGRAM() in
+**  xlock's xlock.h, you can now use the code with either xlock or
+**  xscreensaver.
+**
+**
+**  If you make any improvements to this code, please send them to me!
+**  It could certainly use some more work.
+*/
+
+#include "screenhack.h"
+
+#define MAXSCREENS 1
+
+static GC gc;
+static unsigned long *pixels = 0, fg_pixel, bg_pixel;
+static int npixels;
+static Colormap cmap;
+
+static int batchcount;
+static unsigned int delay;
+static unsigned int cycles;
+static double saturation;
+
+#ifndef min
+#define min(a,b) ((a)<(b)?(a):(b))
+#endif
+
+typedef struct {
+  GC gc;
+  int npixels;
+  u_long *pixels;
+} perscreen;
+
+static perscreen Scr[MAXSCREENS];
+static Display *dsp;
+
+static int screen = 0;
+
+static void
+#ifdef __STDC__
+My_XGetWindowAttributes (Display *dpy, Window win, XWindowAttributes *xgwa)
+#else /* !__STDC__ */
+My_XGetWindowAttributes (dpy, win, xgwa)
+  Display *dpy;
+  Window win;
+  XWindowAttributes *xgwa;
+#endif /* !__STDC__ */
+{
+  XGetWindowAttributes (dpy, win, xgwa);
+
+  if (! pixels) {
+    XGCValues gcv;
+    XColor color;
+    int n;
+    int i, shift;
+
+    cmap = xgwa->colormap;
+
+    i = get_integer_resource ("ncolors", "Integer");
+    if (i <= 2) i = 2, mono_p = True;
+    shift = 360 / i;
+    pixels = (unsigned long *) calloc (i, sizeof (unsigned long));
+    fg_pixel = get_pixel_resource ("foreground", "Foreground", dpy, cmap);
+    bg_pixel = get_pixel_resource ("background", "Background", dpy, cmap);
+    if (! mono_p) {
+      for (npixels = 0; npixels < i; npixels++) {
+        hsv_to_rgb ((360*npixels)/i, saturation, 1.0,
+                   &color.red, &color.green, &color.blue);
+        if (! XAllocColor (dpy, cmap, &color))
+          break;
+        pixels[npixels] = color.pixel;
+      }
+    }
+    n = get_integer_resource ("delay", "Usecs");
+    if (n >= 0) delay = n;
+    n = get_integer_resource ("count", "Integer");
+    if (n > 0) batchcount = n;
+
+    n = get_integer_resource ("cycles", "Integer");
+    if (n >= 0) cycles = n;
+
+    gcv.foreground = fg_pixel;
+    gcv.background = bg_pixel;
+    gc = XCreateGC (dpy, win, GCForeground|GCBackground, &gcv);
+
+    XClearWindow (dpy, win);
+
+    Scr[screen].gc = gc;
+    Scr[screen].npixels = npixels;
+    Scr[screen].pixels = pixels;
+  }
+}
+
+#define XGetWindowAttributes(a,b,c) My_XGetWindowAttributes(a,b,c)
+
+#undef BlackPixel
+#define BlackPixel(a,b) bg_pixel
+#undef WhitePixel
+#define WhitePixel(a,b) fg_pixel
+#define mono mono_p
+
+#define seconds() time((time_t*)0)
+
+char *defaults[] = {
+  "*background:        black",
+  "*foreground:        white",
+  "*ncolors:   64",
+  "*delay:     -1",
+  "*count:     -1",
+  "*cycles:    -1",
+  0
+};
+
+XrmOptionDescRec options[] = {
+  {"-count",   ".count",       XrmoptionSepArg, 0},
+  {"-ncolors", ".ncolors",     XrmoptionSepArg, 0},
+  {"-delay",   ".delay",       XrmoptionSepArg, 0},
+  {"-cycles",   ".cycles",      XrmoptionSepArg, 0},
+  { 0, 0, 0, 0 }
+};
+
+#if defined(__STDC__) || defined(__ANSI_CPP__)
+# define XLOCK_INIT(Z) init##Z
+# define XLOCK_DRAW(Z) draw##Z
+#else  /* K&R CPP */
+# define XLOCK_INIT(Z) init/**/Z
+# define XLOCK_DRAW(Z) draw/**/Z
+#endif /* K&R CPP */
+
+#ifdef __STDC__
+# define XLOCK_SCREENHACK_PROTOTYPE()  \
+  screenhack(Display *dpy, Window window)
+# define XLOCK_PROTOS(Z) /* */
+#else  /* K&R C */
+# define XLOCK_SCREENHACK_PROTOTYPE()  \
+  screenhack(dpy, window)              \
+       Display *dpy;                   \
+       Window window;
+# define XLOCK_PROTOS(Z)               \
+  void init##Z(Window);                        \
+  void draw##Z(Window);                        \
+
+#endif /* K&R C */
+
+#define PROGRAM(Y,Z,D,B,C,S)           \
+  char *progclass = Y;                 \
+  XLOCK_PROTOS(Z)                      \
+                                       \
+  void XLOCK_SCREENHACK_PROTOTYPE()    \
+  {                                    \
+    batchcount = B;                    \
+    delay = D;                         \
+    cycles = C;                                \
+    saturation = S;                    \
+    dsp = dpy;                         \
+                                       \
+    XLOCK_INIT(Z) (window);            \
+    while (1)                          \
+      {                                        \
+       XLOCK_DRAW(Z) (window);         \
+       XSync (dpy, True);              \
+       if (delay) usleep (delay);      \
+      }                                        \
+  }
diff --git a/hacks/xlockmore.c b/hacks/xlockmore.c
new file mode 100644 (file)
index 0000000..62c2dc7
--- /dev/null
@@ -0,0 +1,350 @@
+/* xlockmore.c --- xscreensaver compatibility layer for xlockmore modules.
+ * xscreensaver, Copyright (c) 1997, 1998 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software 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.  No representations are made about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or 
+ * implied warranty.
+ *
+ * This file, along with xlockmore.h, make it possible to compile an xlockmore
+ * module into a standalone program, and thus use it with xscreensaver.
+ * By Jamie Zawinski <jwz@jwz.org> on 10-May-97; based on the ideas
+ * in the older xlock.h by Charles Hannum <mycroft@ai.mit.edu>.  (I had
+ * to redo it, since xlockmore has diverged so far from xlock...)
+ */
+
+#include <stdio.h>
+#include <math.h>
+#include <string.h>
+#include "screenhack.h"
+#include "xlockmoreI.h"
+
+#define countof(x) (sizeof((x))/sizeof(*(x)))
+
+extern ModeSpecOpt xlockmore_opts[];
+extern const char *app_defaults;
+
+void
+pre_merge_options (void)
+{
+  int i, j;
+  char *s;
+
+  /* Translate the xlockmore `opts[]' argument to a form that
+     screenhack.c expects.
+   */
+  for (i = 0; i < xlockmore_opts->numopts; i++)
+    {
+      XrmOptionDescRec *old = &xlockmore_opts->opts[i];
+      XrmOptionDescRec *new = &options[i];
+
+      if (old->option[0] == '-')
+       new->option = old->option;
+      else
+       {
+         /* Convert "+foo" to "-no-foo". */
+         new->option = (char *) malloc (strlen(old->option) + 5);
+         strcpy (new->option, "-no-");
+         strcat (new->option, old->option + 1);
+       }
+
+      new->specifier = strrchr (old->specifier, '.');
+      if (!new->specifier) abort();
+
+      new->argKind = old->argKind;
+      new->value = old->value;
+    }
+
+  /* Add extra args, if they're mentioned in the defaults... */
+  {
+    char *args[] = { "-count", "-cycles", "-delay", "-ncolors",
+                    "-size", "-wireframe", "-use3d", "-useSHM" };
+    for (j = 0; j < countof(args); j++)
+      if (strstr(app_defaults, args[j]+1))
+       {
+         XrmOptionDescRec *new = &options[i++];
+         new->option = args[j];
+         new->specifier = strdup(args[j]);
+         new->specifier[0] = '.';
+         if (!strcmp(new->option, "-wireframe"))
+           {
+             new->argKind = XrmoptionNoArg;
+             new->value = "True";
+             new = &options[i++];
+             new->option = "-no-wireframe";
+             new->specifier = options[i-2].specifier;
+             new->argKind = XrmoptionNoArg;
+             new->value = "False";
+           }
+         else if (!strcmp(new->option, "-use3d"))
+           {
+             new->option = "-3d";
+             new->argKind = XrmoptionNoArg;
+             new->value = "True";
+             new = &options[i++];
+             new->option = "-no-3d";
+             new->specifier = options[i-2].specifier;
+             new->argKind = XrmoptionNoArg;
+             new->value = "False";
+           }
+         else if (!strcmp(new->option, "-useSHM"))
+           {
+             new->option = "-shm";
+             new->argKind = XrmoptionNoArg;
+             new->value = "True";
+             new = &options[i++];
+             new->option = "-no-shm";
+             new->specifier = options[i-2].specifier;
+             new->argKind = XrmoptionNoArg;
+             new->value = "False";
+           }
+         else
+           {
+             new->argKind = XrmoptionSepArg;
+             new->value = 0;
+           }
+       }
+  }
+
+
+  /* Construct the kind of `defaults' that screenhack.c expects from
+     the xlockmore `vars[]' argument.
+   */
+  i = 0;
+
+  /* Put on the PROGCLASS.background/foreground resources. */
+  s = (char *) malloc(50);
+  strcpy (s, progclass);
+  strcat (s, ".background: black");
+  defaults [i++] = s;
+
+  s = (char *) malloc(50);
+  strcpy (s, progclass);
+  strcat (s, ".foreground: white");
+  defaults [i++] = s;
+
+  /* Copy the lines out of the `app_defaults' var and into this array. */
+  s = strdup (app_defaults);
+  while (s && *s)
+    {
+      defaults [i++] = s;
+      s = strchr(s, '\n');
+      if (s)
+       *s++ = 0;
+    }
+
+  /* Copy the defaults out of the `xlockmore_opts->' variable. */
+  for (j = 0; j < xlockmore_opts->numvarsdesc; j++)
+    {
+      const char *def = xlockmore_opts->vars[j].def;
+
+      if (!def) abort();
+      if (!*def) abort();
+      if (strlen(def) > 1000) abort();
+
+      s = (char *) malloc (strlen (xlockmore_opts->vars[j].name) +
+                          strlen (def) + 10);
+      strcpy (s, "*");
+      strcat (s, xlockmore_opts->vars[j].name);
+      strcat (s, ": ");
+      strcat (s, def);
+      defaults [i++] = s;
+    }
+
+  defaults [i] = 0;
+}
+
+
+static void
+xlockmore_read_resources (void)
+{
+  int i;
+  for (i = 0; i < xlockmore_opts->numvarsdesc; i++)
+    {
+      void  *var   = xlockmore_opts->vars[i].var;
+      Bool  *var_b = (Bool *)  var;
+      char **var_c = (char **) var;
+      int   *var_i = (int *) var;
+      float *var_f = (float *) var;
+
+      switch (xlockmore_opts->vars[i].type)
+       {
+       case t_String:
+         *var_c = get_string_resource (xlockmore_opts->vars[i].name,
+                                       xlockmore_opts->vars[i].classname);
+         break;
+       case t_Float:
+         *var_f = get_float_resource (xlockmore_opts->vars[i].name,
+                                      xlockmore_opts->vars[i].classname);
+         break;
+       case t_Int:
+         *var_i = get_integer_resource (xlockmore_opts->vars[i].name,
+                                        xlockmore_opts->vars[i].classname);
+         break;
+       case t_Bool:
+         *var_b = get_boolean_resource (xlockmore_opts->vars[i].name,
+                                        xlockmore_opts->vars[i].classname);
+         break;
+       default:
+         abort ();
+       }
+    }
+}
+
+
+
+void 
+xlockmore_screenhack (Display *dpy, Window window,
+                     Bool want_writable_colors,
+                     Bool want_uniform_colors,
+                     Bool want_smooth_colors,
+                     Bool want_bright_colors,
+                     void (*hack_init) (ModeInfo *),
+                     void (*hack_draw) (ModeInfo *),
+                     void (*hack_free) (ModeInfo *))
+{
+  ModeInfo mi;
+  XGCValues gcv;
+  XColor color;
+  int i;
+  time_t start, now;
+  int orig_pause;
+
+  memset(&mi, 0, sizeof(mi));
+  mi.dpy = dpy;
+  mi.window = window;
+  XGetWindowAttributes (dpy, window, &mi.xgwa);
+
+  color.flags = DoRed|DoGreen|DoBlue;
+  color.red = color.green = color.blue = 0;
+  if (!XAllocColor(dpy, mi.xgwa.colormap, &color))
+    abort();
+  mi.black = color.pixel;
+  color.red = color.green = color.blue = 0xFFFF;
+  if (!XAllocColor(dpy, mi.xgwa.colormap, &color))
+    abort();
+  mi.white = color.pixel;
+
+  if (mono_p)
+    {
+      static unsigned long pixels[2];
+      static XColor colors[2];
+    MONO:
+      mi.npixels = 2;
+      mi.pixels = pixels;
+      mi.colors = colors;
+      pixels[0] = mi.black;
+      pixels[1] = mi.white;
+      colors[0].flags = DoRed|DoGreen|DoBlue;
+      colors[1].flags = DoRed|DoGreen|DoBlue;
+      colors[0].red = colors[0].green = colors[0].blue = 0;
+      colors[1].red = colors[1].green = colors[1].blue = 0xFFFF;
+      mi.writable_p = False;
+    }
+  else
+    {
+      mi.npixels = get_integer_resource ("ncolors", "Integer");
+      if (mi.npixels <= 0)
+       mi.npixels = 64;
+      else if (mi.npixels > 256)
+       mi.npixels = 256;
+
+      mi.colors = (XColor *) calloc (mi.npixels, sizeof (*mi.colors));
+
+      mi.writable_p = want_writable_colors;
+
+      if (want_uniform_colors)
+       make_uniform_colormap (dpy, mi.xgwa.visual, mi.xgwa.colormap,
+                              mi.colors, &mi.npixels,
+                              True, &mi.writable_p, True);
+      else if (want_smooth_colors)
+       make_smooth_colormap (dpy, mi.xgwa.visual, mi.xgwa.colormap,
+                             mi.colors, &mi.npixels,
+                             True, &mi.writable_p, True);
+      else
+       make_random_colormap (dpy, mi.xgwa.visual, mi.xgwa.colormap,
+                             mi.colors, &mi.npixels,
+                             want_bright_colors,
+                             True, &mi.writable_p, True);
+
+      if (mi.npixels <= 2)
+       goto MONO;
+      else
+       {
+         int i;
+         mi.pixels = (unsigned long *)
+           calloc (mi.npixels, sizeof (*mi.pixels));
+         for (i = 0; i < mi.npixels; i++)
+           mi.pixels[i] = mi.colors[i].pixel;
+       }
+    }
+
+  gcv.foreground = mi.white;
+  gcv.background = mi.black;
+  mi.gc = XCreateGC(dpy, window, GCForeground|GCBackground, &gcv);
+
+  mi.fullrandom = True;
+
+  mi.pause      = get_integer_resource ("delay", "Usecs");
+
+  mi.cycles     = get_integer_resource ("cycles", "Int");
+  mi.batchcount = get_integer_resource ("count", "Int");
+  mi.size      = get_integer_resource ("size", "Int");
+
+  mi.threed = get_boolean_resource ("use3d", "Boolean");
+  mi.threed_delta = get_float_resource ("delta3d", "Boolean");
+  mi.threed_right_color = get_pixel_resource ("right3d", "Color", dpy,
+                                             mi.xgwa.colormap);
+  mi.threed_left_color = get_pixel_resource ("left3d", "Color", dpy,
+                                            mi.xgwa.colormap);
+  mi.threed_both_color = get_pixel_resource ("both3d", "Color", dpy,
+                                            mi.xgwa.colormap);
+  mi.threed_none_color = get_pixel_resource ("none3d", "Color", dpy,
+                                            mi.xgwa.colormap);
+
+  mi.wireframe_p = get_boolean_resource ("wireframe", "Boolean");
+  mi.root_p = (window == RootWindowOfScreen (mi.xgwa.screen));
+#ifdef HAVE_XSHM_EXTENSION
+  mi.use_shm = get_boolean_resource ("useSHM", "Boolean");
+#endif /* !HAVE_XSHM_EXTENSION */
+
+  if (mi.pause < 0)
+    mi.pause = 0;
+  else if (mi.pause > 100000000)
+    mi.pause = 100000000;
+  orig_pause = mi.pause;
+
+  xlockmore_read_resources ();
+
+  XClearWindow (dpy, window);
+
+  i = 0;
+  start = time((time_t) 0);
+
+  hack_init (&mi);
+  do {
+    hack_draw (&mi);
+    XSync(dpy, False);
+    screenhack_handle_events (dpy);
+    if (mi.pause)
+      usleep(mi.pause);
+    mi.pause = orig_pause;
+
+    if (hack_free)
+      {
+       if (i++ > (mi.batchcount / 4) &&
+           (start + 5) < (now = time((time_t) 0)))
+         {
+           i = 0;
+           start = now;
+           hack_free (&mi);
+           hack_init (&mi);
+           XSync(dpy, False);
+         }
+      }
+
+  } while (1);
+}
diff --git a/hacks/xlockmore.h b/hacks/xlockmore.h
new file mode 100644 (file)
index 0000000..d39119a
--- /dev/null
@@ -0,0 +1,169 @@
+/* xlockmore.h --- xscreensaver compatibility layer for xlockmore modules.
+ * xscreensaver, Copyright (c) 1997, 1998 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software 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.  No representations are made about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or 
+ * implied warranty.
+ *
+ * The definitions in this file make it possible to compile an xlockmore
+ * module into a standalone program, and thus use it with xscreensaver.
+ * By Jamie Zawinski <jwz@jwz.org> on 10-May-97; based on the ideas
+ * in the older xlock.h by Charles Hannum <mycroft@ai.mit.edu>.  (I had
+ * to redo it, since xlockmore has diverged so far from xlock...)
+ */
+
+#if !defined(PROGCLASS) || !defined(HACK_INIT) || !defined(HACK_DRAW)
+ERROR!  Define PROGCLASS, HACK_INIT, and HACK_DRAW before including xlockmore.h
+#endif
+
+#include "config.h"
+
+#ifndef __STDC__
+ERROR!  Sorry, xlockmore.h requires ANSI C (gcc, for example.)
+  /* (The ansi dependency is that we use string concatenation,
+     and cpp-based stringification of tokens.) */
+#endif
+
+#include <stdio.h>
+#include <math.h>
+#include "xlockmoreI.h"
+
+#ifdef USE_GL
+# include <GL/glx.h>
+  extern GLXContext *init_GL (ModeInfo *);
+# define FreeAllGL(dpy) /* */
+#endif
+
+/* Accessor macros for the ModeInfo structure
+ */
+
+#define MI_DISPLAY(MI)         ((MI)->dpy)
+#define MI_WINDOW(MI)          ((MI)->window)
+#define MI_NUM_SCREENS(MI)     (1)     /* Only manage one screen at a time; */
+#define MI_SCREEN(MI)          (0)     /*  this might be fragile... */
+#define MI_WIN_WHITE_PIXEL(MI) ((MI)->white)
+#define MI_WIN_BLACK_PIXEL(MI) ((MI)->black)
+#define MI_NPIXELS(MI)         ((MI)->npixels)
+#define MI_PIXEL(MI,N)         ((MI)->pixels[(N)])
+#define MI_WIN_WIDTH(MI)       ((MI)->xgwa.width)
+#define MI_WIN_HEIGHT(MI)      ((MI)->xgwa.height)
+#define MI_WIN_DEPTH(MI)       ((MI)->xgwa.depth)
+#define MI_WIN_COLORMAP(MI)    ((MI)->xgwa.colormap)
+#define MI_VISUAL(MI)          ((MI)->xgwa.visual)
+#define MI_GC(MI)              ((MI)->gc)
+#define MI_PAUSE(MI)           ((MI)->pause)
+#define MI_WIN_IS_FULLRANDOM(MI)((MI)->fullrandom)
+#define MI_WIN_IS_VERBOSE(MI)   (False)
+#define MI_WIN_IS_INSTALL(MI)   (True)
+#define MI_WIN_IS_MONO(MI)     (mono_p)
+#define MI_WIN_IS_INROOT(MI)   ((MI)->root_p)
+#define MI_WIN_IS_INWINDOW(MI) (!(MI)->root_p)
+#define MI_WIN_IS_ICONIC(MI)   (False)
+#define MI_WIN_IS_WIREFRAME(MI)        ((MI)->wireframe_p)
+#define MI_WIN_IS_USE3D(MI)    ((MI)->threed)
+#define MI_LEFT_COLOR(MI)      ((MI)->threed_left_color)
+#define MI_RIGHT_COLOR(MI)     ((MI)->threed_right_color)
+#define MI_BOTH_COLOR(MI)      ((MI)->threed_both_color)
+#define MI_NONE_COLOR(MI)      ((MI)->threed_none_color)
+#define MI_DELTA3D(MI)         ((MI)->threed_delta)
+#define MI_CYCLES(MI)          ((MI)->cycles)
+#define MI_BATCHCOUNT(MI)      ((MI)->batchcount)
+#define MI_SIZE(MI)            ((MI)->size)
+#define MI_IS_DRAWN(MI)                ((MI)->is_drawn)
+#define MI_IS_DRAWN(MI)                ((MI)->is_drawn)
+#define MI_NCOLORS(MI)         ((MI)->npixels)
+#define MI_NAME(MI)            (progname)
+
+#define MI_WIDTH(MI)           (MI_WIN_WIDTH((MI)))
+#define MI_HEIGHT(MI)          (MI_WIN_HEIGHT((MI)))
+#define MI_IS_ICONIC(MI)       (MI_WIN_IS_ICONIC((MI)))
+#define MI_IS_WIREFRAME(MI)    (MI_WIN_IS_WIREFRAME((MI)))
+#define MI_IS_MONO(MI)         (MI_WIN_IS_MONO((MI)))
+#define MI_COUNT(MI)           (MI_BATCHCOUNT((MI)))
+#define MI_BLACK_PIXEL(MI)     (MI_WIN_BLACK_PIXEL(MI))
+#define MI_WHITE_PIXEL(MI)     (MI_WIN_WHITE_PIXEL(MI))
+#define MI_IS_FULLRANDOM(MI)   (MI_WIN_IS_FULLRANDOM(MI))
+#define MI_IS_VERBOSE(MI)      (MI_WIN_IS_VERBOSE(MI))
+#define MI_IS_INSTALL(MI)      (MI_WIN_IS_INSTALL(MI))
+#define MI_IS_DEBUG(MI)                (False)
+
+#define MI_CLEARWINDOW(mi) XClearWindow(MI_DISPLAY(mi), MI_WINDOW(mi))
+
+/* Some other utility macros.
+ */
+#define SINF(n)                        ((float)sin((double)(n)))
+#define COSF(n)                        ((float)cos((double)(n)))
+#define FABSF(n)               ((float)fabs((double)(n)))
+
+#undef MAX
+#undef MIN
+#undef ABS
+#define MAX(a,b)((a)>(b)?(a):(b))
+#define MIN(a,b)((a)<(b)?(a):(b))
+#define ABS(a)((a)<0 ? -(a) : (a))
+
+/* Maximum possible number of colors (*not* default number of colors.) */
+#define NUMCOLORS 256
+
+/* The globals that screenhack.c expects (initialized by xlockmore.c).
+ */
+char *defaults[100];
+XrmOptionDescRec options[100];
+
+/* Prototypes for the actual drawing routines...
+ */
+extern void HACK_INIT(ModeInfo *);
+extern void HACK_DRAW(ModeInfo *);
+
+#ifdef HACK_FREE
+  extern void HACK_FREE(ModeInfo *);
+#else
+# define HACK_FREE 0
+#endif
+
+
+/* Emit code for the entrypoint used by screenhack.c, and pass control
+   down into xlockmore.c with the appropriate parameters.
+ */
+
+char *progclass = PROGCLASS;
+
+void screenhack (Display *dpy, Window window)
+{
+  xlockmore_screenhack (dpy, window,
+
+#ifdef WRITABLE_COLORS
+                       True,
+#else
+                       False,
+#endif
+
+#ifdef UNIFORM_COLORS
+                       True,
+#else
+                       False,
+#endif
+
+#ifdef SMOOTH_COLORS
+                       True,
+#else
+                       False,
+#endif
+
+#ifdef BRIGHT_COLORS
+                       True,
+#else
+                       False,
+#endif
+
+                       HACK_INIT,
+                       HACK_DRAW,
+                       HACK_FREE);
+}
+
+
+const char *app_defaults = DEFAULTS ;
diff --git a/hacks/xlockmoreI.h b/hacks/xlockmoreI.h
new file mode 100644 (file)
index 0000000..2813c75
--- /dev/null
@@ -0,0 +1,112 @@
+/* xlockmore.h --- xscreensaver compatibility layer for xlockmore modules.
+ * xscreensaver, Copyright (c) 1997, 1998 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software 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.  No representations are made about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or 
+ * implied warranty.
+ *
+ * See xlockmore.h and xlockmore.c.
+ */
+
+#ifndef __XLOCKMORE_INTERNAL_H__
+#define __XLOCKMORE_INTERNAL_H__
+
+#include "screenhack.h"
+
+#ifdef HAVE_XSHM_EXTENSION
+# include "xshm.h"
+#endif /* HAVE_XSHM_EXTENSION */
+
+
+/* I'm told that the Sun version of OpenGL needs to have the constant
+   SUN_OGL_NO_VERTEX_MACROS defined in order for morph3d to compile
+   (the number of arguments to the glNormal3f macro changes...)
+   Verified with gcc 2.7.2.2 and Sun cc 4.2 with OpenGL 1.1.1 dev 4
+   on Solaris 2.5.1.
+ */
+#ifndef HAVE_MESA_GL
+# if defined(__sun) && defined(__SVR4) /* Solaris */
+#  define SUN_OGL_NO_VERTEX_MACROS 1
+# endif /* Solaris */
+#endif /* !HAVE_MESA_GL */
+
+
+/* Compatibility with the xlockmore RNG API
+   (note that the xlockmore hacks never expect negative numbers.)
+ */
+#define LRAND()                        ((long) (random() & 0x7fffffff))
+#define NRAND(n)               ((int) (LRAND() % (n)))
+#define MAXRAND                        (2147483648.0) /* unsigned 1<<31 as a float */
+#define SRAND(n)               /* already seeded by screenhack.c */
+
+
+typedef struct ModeInfo {
+  Display *dpy;
+  Window window;
+  Bool root_p;
+  int npixels;
+  unsigned long *pixels;
+  XColor *colors;
+  Bool writable_p;
+  unsigned long white;
+  unsigned long black;
+  XWindowAttributes xgwa;
+  GC gc;
+  long pause;
+  Bool fullrandom;
+  long cycles;
+  long batchcount;
+  long size;
+  Bool threed;
+  long threed_left_color;
+  long threed_right_color;
+  long threed_both_color;
+  long threed_none_color;
+  long threed_delta;
+  Bool wireframe_p;
+  Bool is_drawn;
+
+#ifdef HAVE_XSHM_EXTENSION
+  Bool use_shm;
+  XShmSegmentInfo shm_info;
+#endif
+
+} ModeInfo;
+
+typedef enum {  t_String, t_Float, t_Int, t_Bool } xlockmore_type;
+
+typedef struct {
+  void *var;
+  char *name;
+  char *classname;
+  char *def;
+  xlockmore_type type;
+} argtype;
+
+typedef struct {
+  char *opt;
+  char *desc;
+} OptionStruct;
+
+typedef struct {
+  int numopts;
+  XrmOptionDescRec *opts;
+  int numvarsdesc;
+  argtype *vars;
+  OptionStruct *desc;
+} ModeSpecOpt;
+
+extern void xlockmore_screenhack (Display *dpy, Window window,
+                                 Bool want_writable_colors,
+                                 Bool want_uniform_colors,
+                                 Bool want_smooth_colors,
+                                 Bool want_bright_colors,
+                                 void (*hack_init) (ModeInfo *),
+                                 void (*hack_draw) (ModeInfo *),
+                                 void (*hack_free) (ModeInfo *));
+
+#endif /* __XLOCKMORE_INTERNAL_H__ */
diff --git a/hacks/xlyap.c b/hacks/xlyap.c
new file mode 100644 (file)
index 0000000..3742df6
--- /dev/null
@@ -0,0 +1,2008 @@
+/* Lyap - calculate and display Lyapunov exponents */
+
+/* Written by Ron Record (rr@sco) 03 Sep 1991 */
+
+/* The idea here is to calculate the Lyapunov exponent for a periodically
+ * forced logistic map (later i added several other nonlinear maps of the unit
+ * interval). In order to turn the 1-dimensional parameter space of the
+ * logistic map into a 2-dimensional parameter space, select two parameter
+ * values ('a' and 'b') then alternate the iterations of the logistic map using
+ * first 'a' then 'b' as the parameter. This program accepts an argument to
+ * specify a forcing function, so instead of just alternating 'a' and 'b', you
+ * can use 'a' as the parameter for say 6 iterations, then 'b' for 6 iterations
+ * and so on. An interesting forcing function to look at is abbabaab (the
+ * Morse-Thue sequence, an aperiodic self-similar, self-generating sequence).
+ * Anyway, step through all the values of 'a' and 'b' in the ranges you want,
+ * calculating the Lyapunov exponent for each pair of values. The exponent
+ * is calculated by iterating out a ways (specified by the variable "settle")
+ * then on subsequent iterations calculating an average of the logarithm of
+ * the absolute value of the derivative at that point. Points in parameter
+ * space with a negative Lyapunov exponent are colored one way (using the
+ * value of the exponent to index into a color map) while points with a
+ * non-negative exponent are colored differently.
+ *
+ * The algorithm was taken from the September 1991 Scientific American article
+ * by A. K. Dewdney who gives credit to Mario Markus of the Max Planck Institute
+ * for its creation. Additional information and ideas were gleaned from the
+ * discussion on alt.fractals involving Stephen Hall, Ed Kubaitis, Dave Platt
+ * and Baback Moghaddam. Assistance with colormaps and spinning color wheels
+ * and X was gleaned from Hiram Clawson. Rubber banding code was adapted from
+ * an existing Mandelbrot program written by Stacey Campbell.
+ */
+
+#define LYAP_PATCHLEVEL 4
+#define LYAP_VERSION "#(@) lyap 2.3 2/20/92"
+
+#include <assert.h>
+#include <math.h>
+
+#include "screenhack.h"
+#include "yarandom.h"
+#include "hsv.h"
+#include "vroot.h"
+
+#include <X11/cursorfont.h> 
+#include <X11/Xutil.h> 
+
+char *progclass = "XLyap";
+
+char *defaults [] = {
+  ".background:                black",
+  ".foreground:                white",
+  "*randomize:         false",
+  "*builtin:           -1",
+  "*minColor:          1",
+  "*maxColor:          256",
+  "*dwell:             50",
+  "*useLog:            false",
+  "*colorExponent:     1.0",
+  "*colorOffset:       0",
+  "*randomForce:       ",              /* 0.5 */
+  "*settle:            50",
+  "*minA:              2.0",
+  "*minB:              2.0",
+  "*wheels:            7",
+  "*function:          10101010",
+  "*forcingFunction:   abbabaab",
+  "*bRange:            ",              /* 2.0 */
+  "*startX:            0.65",
+  "*mapIndex:          ",              /* 0 */
+  "*outputFile:                ",
+  "*beNegative:                false",
+  "*rgbMax:            65000",
+  "*spinLength:                256",
+  "*show:              false",
+  "*aRange:            ",              /* 2.0 */
+  0
+};
+
+XrmOptionDescRec options [] = {
+  { "-randomize", ".randomize",        XrmoptionNoArg, "true" },
+  { "-builtin",   ".builtin",  XrmoptionSepArg, 0 },
+  { "-C", ".minColor",         XrmoptionSepArg, 0 },   /* n */
+  { "-D", ".dwell",            XrmoptionSepArg, 0 },   /* n */
+  { "-L", ".useLog",           XrmoptionNoArg, "true" },
+  { "-M", ".colorExponent",    XrmoptionSepArg, 0 },   /* r */
+  { "-O", ".colorOffset",      XrmoptionSepArg, 0 },   /* n */
+  { "-R", ".randomForce",      XrmoptionSepArg, 0 },   /* p */
+  { "-S", ".settle",           XrmoptionSepArg, 0 },   /* n */
+  { "-a", ".minA",             XrmoptionSepArg, 0 },   /* r */
+  { "-b", ".minB",             XrmoptionSepArg, 0 },   /* n */
+  { "-c", ".wheels",           XrmoptionSepArg, 0 },   /* n */
+  { "-F", ".function",         XrmoptionSepArg, 0 },   /* 10101010 */
+  { "-f", ".forcingFunction",  XrmoptionSepArg, 0 },   /* abbabaab */
+  { "-h", ".bRange",           XrmoptionSepArg, 0 },   /* r */
+  { "-i", ".startX",           XrmoptionSepArg, 0 },   /* r */
+  { "-m", ".mapIndex",         XrmoptionSepArg, 0 },   /* n */
+  { "-o", ".outputFile",       XrmoptionSepArg, 0 },   /* filename */
+  { "-p", ".beNegative",       XrmoptionNoArg, "true" },
+  { "-r", ".rgbMax",           XrmoptionSepArg, 0 },   /* n */
+  { "-s", ".spinLength",       XrmoptionSepArg, 0 },   /* n */
+  { "-v", ".show",             XrmoptionNoArg, "true" },
+  { "-w", ".aRange",           XrmoptionSepArg, 0 },   /* r */
+  { 0, 0, 0, 0 }
+};
+
+
+#define ABS(a) (((a)<0) ? (0-(a)) : (a) )
+#define Min(x,y) ((x < y)?x:y)
+#define Max(x,y) ((x > y)?x:y)
+
+#ifdef SIXTEEN_COLORS
+#define MAXPOINTS  128
+#ifdef BIGMEM
+#define MAXFRAMES 4
+#else
+#define MAXFRAMES 2
+#endif
+#define MAXCOLOR 16
+static int maxcolor=16, startcolor=0, color_offset=0, mincolindex=1;
+static int dwell=50, settle=25;
+static int width=128, height=128, xposition=128, yposition=128;
+#else
+#define MAXPOINTS  256
+#ifdef BIGMEM
+#define MAXFRAMES 8
+#else
+#define MAXFRAMES 2
+#endif
+#define MAXCOLOR 256
+static int maxcolor=256, startcolor=17, color_offset=96, mincolindex=33;
+static int dwell=100, settle=50;
+static int width=256, height=256;
+#endif
+
+#ifndef TRUE
+#define TRUE 1
+#define FALSE 0
+#endif
+
+static int screen;
+static Display*        dpy;
+static Visual *visual;
+
+static unsigned long foreground, background;
+
+static Window canvas;
+
+typedef struct {
+       int x, y;
+} xy_t;
+
+typedef struct {
+       int start_x, start_y;
+       int last_x, last_y;
+       } rubber_band_data_t;
+
+typedef struct {
+       Cursor band_cursor;
+       double p_min, p_max, q_min, q_max;
+       rubber_band_data_t rubber_band;
+       } image_data_t;
+
+typedef struct points_t {
+       XPoint data[MAXCOLOR][MAXPOINTS];
+       int npoints[MAXCOLOR];
+       } points_t;
+
+static points_t Points;
+static image_data_t rubber_data;
+
+#ifndef TRUE
+#define TRUE 1
+#define FALSE 0
+#endif
+
+static GC Data_GC[MAXCOLOR], RubberGC;
+
+#define MAXINDEX 64
+#define FUNCMAXINDEX 16
+#define MAXWHEELS 7
+#define NUMMAPS 5
+
+typedef double (*PFD)(double,double);
+
+static double logistic(double,double), circle(double,double), leftlog(double,double), rightlog(double,double), doublelog(double,double);
+static double dlogistic(double,double), dcircle(double,double), dleftlog(double,double), drightlog(double,double), ddoublelog(double,double);
+static PFD map, deriv;
+static PFD Maps[NUMMAPS] = { logistic, circle, leftlog, rightlog, doublelog };
+static PFD Derivs[NUMMAPS] = { dlogistic, dcircle, dleftlog, drightlog, ddoublelog };
+
+static int aflag=0, bflag=0, wflag=0, hflag=0, Rflag=0;
+static double pmins[NUMMAPS] = { 2.0, 0.0, 0.0, 0.0, 0.0 };
+static double pmaxs[NUMMAPS] = { 4.0, 1.0, 6.75, 6.75, 16.0 };
+static double amins[NUMMAPS] = { 2.0, 0.0, 0.0, 0.0, 0.0 };
+static double aranges[NUMMAPS] = { 2.0, 1.0, 6.75, 6.75, 16.0 };
+static double bmins[NUMMAPS] = { 2.0, 0.0, 0.0, 0.0, 0.0 };
+static double branges[NUMMAPS] = { 2.0, 1.0, 6.75, 6.75, 16.0 };
+
+static int   forcing[MAXINDEX] = { 0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,
+                       0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,
+                       0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1 };
+static int   Forcing[FUNCMAXINDEX] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 };
+
+static int   maxindex = MAXINDEX;
+static int   funcmaxindex = FUNCMAXINDEX;
+static double  min_a=2.0, min_b=2.0, a_range=2.0, b_range=2.0, minlyap=1.0;
+static double  max_a=4.0, max_b=4.0;
+static double  start_x=0.65, lyapunov, a_inc, b_inc, a, b;
+static int     numcolors=16, numfreecols, displayplanes, lowrange;
+static xy_t    point;
+static Pixmap  pixmap;
+static Colormap cmap;
+static XColor  Colors[MAXCOLOR];
+static double  *exponents[MAXFRAMES];
+static double  a_minimums[MAXFRAMES], b_minimums[MAXFRAMES];
+static double  a_maximums[MAXFRAMES], b_maximums[MAXFRAMES];
+static double  minexp, maxexp, prob=0.5;
+static int     expind[MAXFRAMES]={0}, resized[MAXFRAMES]={0};
+static int     numwheels=MAXWHEELS, force=0, Force=0, negative=1;
+static int     rgb_max=65000, nostart=1, stripe_interval=7;
+static int     save=1, show=0, useprod=1, spinlength=256, savefile=0;
+static int     maxframe=0, frame=0, dorecalc=0, mapindex=0, run=1;
+static char    *outname="lyap.out";
+
+
+const char * const version = LYAP_VERSION;
+
+static void resize(void);
+static void redisplay(Window w, XExposeEvent *event);
+static void Spin(Window w);
+static void show_defaults(void);
+static void StartRubberBand(Window w, image_data_t *data, XEvent *event);
+static void TrackRubberBand(Window w, image_data_t *data, XEvent *event);
+static void EndRubberBand(Window w, image_data_t *data, XEvent *event);
+static void CreateXorGC(void);
+static void InitBuffer(void);
+static void BufferPoint(Display *display, Window window, int color,
+                       int x, int y);
+static void FlushBuffer(void);
+static void init_canvas(void);
+static void init_data(void);
+static void init_color(void);
+static void parseargs(void);
+static void Clear(void);
+static void setupmem(void);
+static void main_event(void);
+static int complyap(void);
+static void Getkey(XKeyEvent *event);
+static int sendpoint(double expo);
+static void save_to_file(void);
+static void setforcing(void);
+static void check_params(int mapnum, int parnum);
+static void usage(void);
+static void Destroy_frame(void);
+static void freemem(void);
+static void Redraw(void);
+static void redraw(double *exparray, int index, int cont);
+static void recalc(void);
+static void SetupCorners(XPoint *corners, image_data_t *data);
+static void set_new_params(Window w, image_data_t *data);
+static void go_down(void);
+static void go_back(void);
+static void go_init(void);
+static void jumpwin(void);
+static void print_help(void);
+static void print_values(void);
+
+
+void
+screenhack (Display *d, Window window)
+{
+  XWindowAttributes xgwa;
+  int builtin = -1;
+  dpy = d;
+  XGetWindowAttributes (dpy, window, &xgwa);
+  width = xgwa.width;
+  height = xgwa.height;
+  visual = xgwa.visual;
+  cmap = xgwa.colormap;
+
+  parseargs();
+
+  if (get_boolean_resource("randomize", "Boolean"))
+    builtin = random() % 22;
+  else {
+    char *s = get_string_resource("builtin", "Integer");
+    if (s && *s)
+      builtin = atoi(s);
+    if (s) free (s);
+  }
+    
+  if (builtin >= 0)
+    {
+      char *ff = 0;
+      switch (builtin) {
+      case 0:
+       min_a = 3.75; aflag++;
+       min_b = 3.299999; bflag++;
+       a_range = 0.05; wflag++;
+       b_range = 0.05; hflag++;
+       dwell = 200;
+       settle = 100;
+       ff = "abaabbaaabbb";
+       break;
+
+      case 1:
+       min_a = 3.8; aflag++;
+       min_b = 3.2; bflag++;
+       b_range = .05; hflag++;
+       a_range = .05; wflag++;
+       ff = "bbbbbaaaaa";
+       break;
+
+      case 2:
+       min_a =  3.4; aflag++;
+       min_b =  3.04; bflag++;
+       a_range =  .5; wflag++;
+       b_range =  .5; hflag++;
+       ff = "abbbbbbbbb";
+       settle = 500;
+       dwell = 1000;
+       break;
+
+      case 3:
+       min_a = 3.5; aflag++;
+       min_b = 3.0; bflag++;
+       a_range = 0.2; wflag++;
+       b_range = 0.2; hflag++;
+       dwell = 600;
+       settle = 300;
+       ff = "aaabbbab";
+       break;
+
+      case 4:
+       min_a = 3.55667; aflag++;
+       min_b = 3.2; bflag++;
+       b_range = .05; hflag++;
+       a_range = .05; wflag++;
+       ff = "bbbbbaaaaa";
+       break;
+
+      case 5:
+       min_a = 3.79; aflag++;
+       min_b = 3.22; bflag++;
+       b_range = .02999; hflag++;
+       a_range = .02999; wflag++;
+       ff = "bbbbbaaaaa";
+       break;
+
+      case 6:
+       min_a = 3.7999; aflag++;
+       min_b = 3.299999; bflag++;
+       a_range = 0.2; wflag++;
+       b_range = 0.2; hflag++;
+       dwell = 300;
+       settle = 150;
+       ff = "abaabbaaabbb";
+       break;
+
+      case 7:
+       min_a = 3.89; aflag++;
+       min_b = 3.22; bflag++;
+       b_range = .028; hflag++;
+       a_range = .02999; wflag++;
+       ff = "bbbbbaaaaa";
+       settle = 600;
+       dwell = 1000;
+       break;
+
+      case 8:
+       min_a = 3.2; aflag++;
+       min_b = 3.7; bflag++;
+       a_range = 0.05; wflag++;
+       b_range = .005; hflag++;
+       ff = "abbbbaa";
+       break;
+
+      case 9:
+       ff = "aaaaaabbbbbb";
+       mapindex = 1;
+       dwell =  400;
+       settle =  200;
+       minlyap = maxexp = ABS(-0.85);
+       minexp = -1.0 * minlyap;
+       break;
+
+      case 10:
+       ff = "aaaaaabbbbbb";
+       mapindex = 1;
+       dwell =  400;
+       settle = 200;
+       minlyap = maxexp = ABS(-0.85);
+       minexp = -1.0 * minlyap;
+       break;
+
+      case 11:
+       mapindex = 1;
+       dwell =  400;
+       settle = 200;
+       minlyap = maxexp = ABS(-0.85);
+       minexp = -1.0 * minlyap;
+       break;
+
+      case 12:
+       ff = "abbb";
+       mapindex = 1;
+       dwell =  400;
+       settle = 200;
+       minlyap = maxexp = ABS(-0.85);
+       minexp = -1.0 * minlyap;
+       break;
+
+      case 13:
+       ff = "abbabaab";
+       mapindex = 1;
+       dwell =  400;
+       settle = 200;
+       minlyap = maxexp = ABS(-0.85);
+       minexp = -1.0 * minlyap;
+       break;
+
+      case 14:
+       ff = "abbabaab";
+       dwell =  800;
+       settle = 200;
+       minlyap = maxexp = ABS(-0.85);
+       minexp = -1.0 * minlyap;
+       /* ####  -x 0.05 */
+       min_a = 3.91; aflag++;
+       a_range =  0.0899999999; wflag++;
+       min_b =  3.28; bflag++;
+       b_range =  0.35; hflag++;
+       break;
+
+      case 15:
+       ff = "aaaaaabbbbbb";
+       dwell =  400;
+       settle = 200;
+       minlyap = maxexp = ABS(-0.85);
+       minexp = -1.0 * minlyap;
+       break;
+
+      case 16:
+       dwell =  400;
+       settle = 200;
+       minlyap = maxexp = ABS(-0.85);
+       minexp = -1.0 * minlyap;
+       break;
+
+      case 17:
+       ff = "abbb";
+       dwell =  400;
+       settle = 200;
+       minlyap = maxexp = ABS(-0.85);
+       minexp = -1.0 * minlyap;
+       break;
+
+      case 18:
+       ff = "abbabaab";
+       dwell =  400;
+       settle = 200;
+       minlyap = maxexp = ABS(-0.85);
+       minexp = -1.0 * minlyap;
+       break;
+
+      case 19:
+       mapindex = 2;
+       ff = "aaaaaabbbbbb";
+       dwell =  400;
+       settle = 200;
+       minlyap = maxexp = ABS(-0.85);
+       minexp = -1.0 * minlyap;
+       break;
+
+      case 20:
+       mapindex = 2;
+       dwell =  400;
+       settle = 200;
+       minlyap = maxexp = ABS(-0.85);
+       minexp = -1.0 * minlyap;
+       break;
+
+      case 21:
+       mapindex = 2;
+       ff = "abbb";
+       dwell =  400;
+       settle = 200;
+       minlyap = maxexp = ABS(-0.85);
+       minexp = -1.0 * minlyap;
+       break;
+
+      case 22:
+       mapindex = 2;
+       ff = "abbabaab";
+       dwell =  400;
+       settle = 200;
+       minlyap = maxexp = ABS(-0.85);
+       minexp = -1.0 * minlyap;
+       break;
+      }
+
+      if (ff) {
+       char *ch;
+       int bindex = 0;
+       maxindex = strlen(ff);
+       if (maxindex > MAXINDEX)
+         usage();
+       ch = ff;
+       force++;
+       while (bindex < maxindex) {
+         if (*ch == 'a')
+           forcing[bindex++] = 0;
+         else if (*ch == 'b')
+           forcing[bindex++] = 1;
+         else
+           usage();
+         ch++;
+       }
+      }
+    }
+
+  screen = DefaultScreen(dpy);
+  background = BlackPixel(dpy, screen);
+  setupmem();
+  init_data();
+  if (displayplanes > 1)
+    foreground = startcolor;
+  else
+    foreground = WhitePixel(dpy, screen);
+
+  /*
+  * Create the window to display the Lyapunov exponents
+  */
+  canvas = window;
+  init_canvas();
+
+  if (window != DefaultRootWindow(dpy))
+    XSelectInput(dpy,canvas,KeyPressMask|ButtonPressMask|ButtonMotionMask|
+                ButtonReleaseMask|ExposureMask|StructureNotifyMask);
+  if (displayplanes > 1) {
+    init_color();
+  } else {
+    XQueryColors(dpy, DefaultColormap(dpy, DefaultScreen(dpy)),
+       Colors, numcolors);
+  }
+  pixmap = XCreatePixmap(dpy, DefaultRootWindow(dpy),
+                        width, height, DefaultDepth(dpy, screen));
+  rubber_data.band_cursor = XCreateFontCursor(dpy, XC_hand2);
+  CreateXorGC();
+  Clear();
+  for(;;)
+      main_event();
+}
+
+static void
+main_event(void)
+{
+  int n;
+  XEvent event;
+
+  if (complyap() == TRUE)
+      run=0;
+  n = XEventsQueued(dpy, QueuedAfterFlush);
+  while (n--) {
+         XNextEvent(dpy, &event);
+           switch(event.type)
+           {
+           case KeyPress:
+    Getkey(&event.xkey);
+    break;
+           case Expose:
+    redisplay(canvas, &event.xexpose);
+         break;
+           case ConfigureNotify:
+    resize();
+         break;
+           case ButtonPress:
+    StartRubberBand(canvas, &rubber_data, &event);
+         break;
+           case MotionNotify:
+    TrackRubberBand(canvas, &rubber_data, &event);
+         break;
+           case ButtonRelease:
+    EndRubberBand(canvas, &rubber_data, &event);
+         break;
+            default: 
+    screenhack_handle_event (dpy, &event);
+         break;
+           }
+       }
+}
+
+/* complyap() is the guts of the program. This is where the Lyapunov exponent
+ * is calculated. For each iteration (past some large number of iterations)
+ * calculate the logarithm of the absolute value of the derivative at that
+ * point. Then average them over some large number of iterations. Some small
+ * speed up is achieved by utilizing the fact that log(a*b) = log(a) + log(b).
+ */
+static int
+complyap(void)
+{
+  int i, bindex;
+  double total, prod, x, dx, r;
+
+  if (!run)
+    return TRUE;
+  a += a_inc;
+  if (a >= max_a)
+    if (sendpoint(lyapunov) == TRUE)
+      return FALSE;
+    else {
+      FlushBuffer();
+      if (savefile)
+       save_to_file();
+      return TRUE;
+    }
+  if (b >= max_b) {
+    FlushBuffer();
+    if (savefile)
+      save_to_file();
+    return TRUE;
+  }
+  prod = 1.0;
+  total = 0.0;
+  bindex = 0;
+  x = start_x;
+  r = (forcing[bindex]) ? b : a;
+#ifdef MAPS
+  findex = 0;
+  map = Maps[Forcing[findex]];
+#endif
+  for (i=0;i<settle;i++) {     /* Here's where we let the thing */
+    x = (*map)(x, r);   /* "settle down". There is usually */
+    if (++bindex >= maxindex) { /* some initial "noise" in the */
+      bindex = 0;    /* iterations. How can we optimize */
+      if (Rflag)      /* the value of settle ??? */
+         setforcing();
+    }
+    r = (forcing[bindex]) ? b : a;
+#ifdef MAPS
+    if (++findex >= funcmaxindex)
+      findex = 0;
+    map = Maps[Forcing[findex]];
+#endif
+  }
+#ifdef MAPS
+  deriv = Derivs[Forcing[findex]];
+#endif
+  if (useprod) {      /* using log(a*b) */
+    for (i=0;i<dwell;i++) {
+      x = (*map)(x, r);
+      dx = (*deriv)(x, r); /* ABS is a macro, so don't be fancy */
+      dx = ABS(dx);
+      if (dx == 0.0) /* log(0) is nasty so break out. */
+      {
+        i++;
+        break;
+      }
+      prod *= dx;
+      /* we need to prevent overflow and underflow */
+      if ((prod > 1.0e12) || (prod < 1.0e-12)) {
+       total += log(prod);
+       prod = 1.0;
+      }
+      if (++bindex >= maxindex) {
+       bindex = 0;
+       if (Rflag)
+         setforcing();
+      }
+      r = (forcing[bindex]) ? b : a;
+#ifdef MAPS
+      if (++findex >= funcmaxindex)
+       findex = 0;
+      map = Maps[Forcing[findex]];
+      deriv = Derivs[Forcing[findex]];
+#endif
+    }
+    total += log(prod);
+    lyapunov = (total * M_LOG2E) / (double)i;   
+  }
+  else {       /* use log(a) + log(b) */
+    for (i=0;i<dwell;i++) {
+      x = (*map)(x, r);
+      dx = (*deriv)(x, r); /* ABS is a macro, so don't be fancy */
+      dx = ABS(dx);
+      if (x == 0.0)  /* log(0) check */
+      {
+        i++;
+        break;
+      }
+      total += log(dx);
+      if (++bindex >= maxindex) {
+       bindex = 0;
+       if (Rflag)
+         setforcing();
+      }
+      r = (forcing[bindex]) ? b : a;
+#ifdef MAPS
+      if (++findex >= funcmaxindex)
+       findex = 0;
+      map = Maps[Forcing[findex]];
+      deriv = Derivs[Forcing[findex]];
+#endif
+    }
+    lyapunov = (total * M_LOG2E) / (double)i;
+  }
+
+  if (sendpoint(lyapunov) == TRUE)
+    return FALSE;
+  else {
+    FlushBuffer();
+    if (savefile)
+      save_to_file();
+    return TRUE;
+  }
+}
+
+static double
+logistic(double x, double r)       /* the familiar logistic map */
+{
+  return(r * x * (1.0 - x));
+}
+
+static double
+dlogistic(double x, double r)      /* the derivative of logistic map */
+{
+  return(r - (2.0 * r * x));
+}
+
+static double
+circle(double x, double r)       /* sin() hump or sorta like the circle map */
+{
+  return(r * sin(M_PI * x));
+}
+
+static double
+dcircle(double x, double r)      /* derivative of the "sin() hump" */
+{
+  return(r * M_PI * cos(M_PI * x));
+}
+
+static double
+leftlog(double x, double r)      /* left skewed logistic */
+{
+  double d;
+
+  d = 1.0 - x;
+  return(r * x * d * d);
+}
+
+static double
+dleftlog(double x, double r)    /* derivative of the left skewed logistic */
+{
+  return(r * (1.0 - (4.0 * x) + (3.0 * x * x)));
+}
+
+static double
+rightlog(double x, double r)    /* right skewed logistic */
+{
+  return(r * x * x * (1.0 - x));
+}
+
+static double
+drightlog(double x, double r)    /* derivative of the right skewed logistic */
+{
+  return(r * ((2.0 * x) - (3.0 * x * x)));
+}
+
+static double
+doublelog(double x, double r)    /* double logistic */
+{
+  double d;
+
+  d = 1.0 - x;
+  return(r * x * x * d * d);
+}
+
+static double
+ddoublelog(double x, double r)   /* derivative of the double logistic */
+{
+  double d;
+
+  d = x * x;
+  return(r * ((2.0 * x) - (6.0 * d) + (4.0 * x * d)));
+}
+
+static void
+init_data(void)
+{
+  numcolors = XDisplayCells(dpy, XDefaultScreen(dpy));
+  displayplanes = DisplayPlanes(dpy, XDefaultScreen(dpy));
+  if (numcolors > maxcolor)
+    numcolors = maxcolor;
+  numfreecols = numcolors - mincolindex;
+  lowrange = mincolindex - startcolor;
+  a_inc = a_range / (double)width;
+  b_inc = b_range / (double)height;
+  point.x = -1;
+  point.y = 0;
+  a = rubber_data.p_min = min_a;
+  b = rubber_data.q_min = min_b;
+  rubber_data.p_max = max_a;
+  rubber_data.q_max = max_b;
+  if (show)
+    show_defaults();
+  InitBuffer();
+}
+
+static void
+init_canvas(void)
+{
+  static int i;
+
+  /*
+  * create default, writable, graphics contexts for the canvas.
+  */
+       for (i=0; i<maxcolor; i++) {
+           Data_GC[i] = XCreateGC(dpy, DefaultRootWindow(dpy),
+               (unsigned long) NULL, (XGCValues *) NULL);
+           /* set the background to black */
+           XSetBackground(dpy,Data_GC[i],BlackPixel(dpy,XDefaultScreen(dpy)));
+           /* set the foreground of the ith context to i */
+           XSetForeground(dpy, Data_GC[i], i);
+       }
+       if (displayplanes == 1) {
+           XSetForeground(dpy,Data_GC[0],BlackPixel(dpy,XDefaultScreen(dpy)));
+           XSetForeground(dpy,Data_GC[1],WhitePixel(dpy,XDefaultScreen(dpy)));
+       }
+}
+
+#if 0
+static void
+hls2rgb(int hue_light_sat[3],
+       int rgb[3])             /*      Each in range [0..65535]        */
+{
+  unsigned short r, g, b;
+  hsv_to_rgb((int) (hue_light_sat[0] / 10),            /* 0-3600 -> 0-360 */
+            (int) ((hue_light_sat[2]/1000.0) * 64435), /* 0-1000 -> 0-65535 */
+            (int) ((hue_light_sat[1]/1000.0) * 64435), /* 0-1000 -> 0-65535 */
+            &r, &g, &b);
+  rgb[0] = r;
+  rgb[1] = g;
+  rgb[2] = b;
+}
+#endif /* 0 */
+
+
+static void
+init_color(void)
+{
+#if 1
+
+  int i;
+  XColor colors[256];
+  int ncolors = maxcolor;
+  Bool writable = False;
+  make_smooth_colormap(dpy, visual, cmap,
+                       colors, &ncolors, True, &writable, True);
+
+  for (i = 0; i < maxcolor; i++)
+    XSetForeground(dpy, Data_GC[i],
+                  colors[((int) ((i / ((float)maxcolor)) * ncolors))].pixel);
+
+#else
+  static int i, j, colgap, leg, step;
+  static Visual *visual;
+  Colormap def_cmap;
+  int hls[3], rgb[3];
+
+  def_cmap = DefaultColormap(dpy, DefaultScreen(dpy));
+  for (i=0; i<numcolors; i++) {
+    Colors[i].pixel = i;
+    Colors[i].flags = DoRed|DoGreen|DoBlue;
+  }
+
+  /* Try to write into a new color map */
+  visual = DefaultVisual(dpy, DefaultScreen(dpy));
+  cmap = XCreateColormap(dpy, canvas, visual, AllocAll);
+  XQueryColors(dpy, def_cmap, Colors, numcolors);
+  if (mincolindex)
+    colgap = rgb_max / mincolindex;
+  else
+    colgap = rgb_max;
+  hls[0] = 50; /* Hue in low range */
+  hls[2] = 1000;  /* Fully saturated */
+  for (i=startcolor; i<lowrange + startcolor; i++) {
+    hls[1] = 1000L * (i-startcolor) / lowrange;
+    hls2rgb(hls, rgb);
+    Colors[i].red = rgb[0];
+    Colors[i].green = rgb[1];
+    Colors[i].blue = rgb[2];
+  }
+  colgap = rgb_max / numcolors;
+  if (numwheels == 0)
+    XQueryColors(dpy, def_cmap, Colors, numcolors);
+  else if (numwheels == 1) {
+    colgap = 2*rgb_max/(numcolors - color_offset);
+    for (i=mincolindex; i<(numcolors/2); i++) {
+      Colors[i].blue = 0;
+      Colors[i].green=((i+color_offset)*colgap);
+      Colors[i].red=((i+color_offset)*colgap);
+    }
+    for (i=(numcolors/2); i<(numcolors); i++) {
+      Colors[i].blue = 0;
+      Colors[i].green=(((numcolors-i)+color_offset)*colgap);
+      Colors[i].red=(((numcolors-i)+color_offset)*colgap);
+    }
+  }
+  else if (numwheels == 2) {
+         hls[0] = 800; /* Hue in mid range */
+         hls[2] = 1000;  /* Fully saturated */
+         for (i=startcolor; i<lowrange + startcolor; i++) {
+      hls[1] = 1000L * (i-startcolor) / lowrange;
+      hls2rgb(hls, rgb);
+      Colors[i].red = rgb[0];
+      Colors[i].green = rgb[1];
+      Colors[i].blue = rgb[2];
+         }
+    for (i=mincolindex; i<(numcolors/2); i++) {
+      Colors[i].blue = rgb_max;
+      Colors[i].green = 0;
+      Colors[i].red=(i*2*rgb_max/numcolors);
+    }
+    for (i=(numcolors/2); i<numcolors; i++) {
+      Colors[i].blue = rgb_max;
+      Colors[i].green = 0;
+      Colors[i].red=((numcolors - i)*2*rgb_max/numcolors);
+    }
+  }
+  else if (numwheels == 3) {
+         hls[0] = 800; /* Hue in mid range */
+         hls[2] = 1000;  /* Fully saturated */
+         for (i=startcolor; i<lowrange + startcolor; i++) {
+      hls[1] = 1000L * (i-startcolor) / lowrange;
+      hls2rgb(hls, rgb);
+      Colors[i].red = rgb[0];
+      Colors[i].green = rgb[1];
+      Colors[i].blue = rgb[2];
+         }
+    colgap = 4*rgb_max/numcolors;
+    for (i=mincolindex; i<(numcolors/4); i++) {
+      Colors[i].blue = rgb_max;
+      Colors[i].green = 0;
+      Colors[i].red=(i*colgap);
+    }
+    for (i=(numcolors/4); i<(numcolors/2); i++) {
+      Colors[i].red = rgb_max;
+      Colors[i].green = 0;
+      Colors[i].blue=((numcolors/2) - i) * colgap;
+    }
+    for (i=(numcolors/2); i<(0.75*numcolors); i++) {
+      Colors[i].red = rgb_max;
+      Colors[i].blue=(i * colgap);
+      Colors[i].green = 0;
+    }
+    for (i=(0.75*numcolors); i<numcolors; i++) {
+      Colors[i].blue = rgb_max;
+      Colors[i].green = 0;
+      Colors[i].red=(numcolors-i)*colgap;
+    }
+  }
+  else if (numwheels == 4) {
+         hls[0] = 800; /* Hue in mid range */
+         hls[2] = 1000;  /* Fully saturated */
+         for (i=startcolor; i<lowrange + startcolor; i++) {
+      hls[1] = 1000L * (i-startcolor) / lowrange;
+      hls2rgb(hls, rgb);
+      Colors[i].red = rgb[0];
+      Colors[i].green = rgb[1];
+      Colors[i].blue = rgb[2];
+         }
+    colgap = numwheels * rgb_max / numcolors;
+    for (i=mincolindex; i<(numcolors/numwheels); i++) {
+      Colors[i].blue = rgb_max;
+      Colors[i].green = 0;
+      Colors[i].red=(i*colgap);
+    }
+    for (i=(numcolors/numwheels); i<(2*numcolors/numwheels); i++) {
+      Colors[i].red = rgb_max;
+      Colors[i].green = 0;
+      Colors[i].blue=((2*numcolors/numwheels) - i) * colgap;
+    }
+    for (i=(2*numcolors/numwheels); i<numcolors; i++) {
+      Colors[i].red = rgb_max;
+      Colors[i].green=(i - (2*numcolors/numwheels)) * colgap;
+      Colors[i].blue = 0;
+    }
+  }
+  else if (numwheels == 5) {
+    hls[1] = 700; /* Lightness in midrange */
+    hls[2] = 1000;  /* Fully saturated */
+    for (i=mincolindex; i<numcolors; i++) {
+      hls[0] = 3600L * i / numcolors;
+      hls2rgb(hls, rgb);
+      Colors[i].red = rgb[0];
+      Colors[i].green = rgb[1];
+      Colors[i].blue = rgb[2];
+    }
+    for (i=mincolindex; i<numcolors; i+=stripe_interval) {
+      hls[0] = 3600L * i / numcolors;
+      hls2rgb(hls, rgb);
+      Colors[i].red = rgb[0] / 2;
+      Colors[i].green = rgb[1] / 2;
+      Colors[i].blue = rgb[2] / 2;
+    }
+  }
+  else if (numwheels == 6) {
+      hls[0] = 800; /* Hue in mid range */
+      hls[2] = 1000;  /* Fully saturated */
+      for (i=startcolor; i<lowrange + startcolor; i++) {
+    hls[1] = 1000L * (i-startcolor) / lowrange;
+    hls2rgb(hls, rgb);
+    Colors[i].red = rgb[0];
+    Colors[i].green = rgb[1];
+    Colors[i].blue = rgb[2];
+      }
+      step = numfreecols / 3;
+      leg = step+mincolindex;
+      for (i = mincolindex; i < leg; ++i)
+      {
+    Colors[i].pixel = i;
+    Colors[i].red = fabs(65535 - (double)i / step * 65535.0);
+    Colors[i].blue = (double)i / step * 65535.0;
+    Colors[i].green = 0;
+    Colors[i].flags = DoRed | DoGreen | DoBlue;
+      }
+      for (j = 0, i = leg, leg += step; i < leg; ++i, ++j)
+      {
+    Colors[i].pixel = i;
+    Colors[i].red = (double)j / step * 65535.0;
+    Colors[i].blue = 65535;
+    Colors[i].green = Colors[i].red;
+    Colors[i].flags = DoRed | DoGreen | DoBlue;
+      }
+      for (j = 0, i = leg, leg += step; i < leg; ++i, ++j)
+      {
+    Colors[i].pixel = i;
+    Colors[i].red = 65535;
+    Colors[i].blue = fabs(65535 - (double)j / step * 65535.0);
+    Colors[i].green = Colors[i].blue;
+    Colors[i].flags = DoRed | DoGreen | DoBlue;
+      }
+  }
+  else if (numwheels == MAXWHEELS) {  /* rainbow palette */
+    hls[1] = 500; /* Lightness in midrange */
+    hls[2] = 1000;  /* Fully saturated */
+    for (i=mincolindex; i<numcolors; i++) {
+      hls[0] = 3600L * i / numcolors;
+      hls2rgb(hls, rgb);
+      Colors[i].red = rgb[0];
+      Colors[i].green = rgb[1];
+      Colors[i].blue = rgb[2];
+    }
+  }
+  XStoreColors(dpy, cmap, Colors, numcolors);
+
+  XSetWindowColormap(dpy, canvas, cmap);
+#endif
+}
+
+static void
+parseargs()
+{
+  static int i;
+  int bindex=0, findex;
+  char *s, *ch;
+
+  map = Maps[0];
+  deriv = Derivs[0];
+  maxexp=minlyap; minexp= -1.0 * minlyap;
+
+  mincolindex = get_integer_resource("minColor", "Integer");
+  dwell = get_integer_resource("dwell", "Integer");
+#ifdef MAPS
+  {
+    char *optarg = get_string_resource("function", "String");
+    funcmaxindex = strlen(optarg);
+    if (funcmaxindex > FUNCMAXINDEX)
+      usage();
+    ch = optarg;
+    Force++;
+    for (findex=0;findex<funcmaxindex;findex++) {
+      Forcing[findex] = (int)(*ch++ - '0');;
+      if (Forcing[findex] >= NUMMAPS)
+       usage();
+    }
+  }
+#endif
+  if (get_boolean_resource("useLog", "Boolean"))
+    useprod=0;
+
+  minlyap=ABS(get_float_resource("colorExponent", "Float"));
+  maxexp=minlyap;
+  minexp= -1.0 * minlyap;
+
+  color_offset = get_integer_resource("colorOffset", "Integer");
+
+  maxcolor=ABS(get_integer_resource("maxColor", "Integer"));
+  if ((maxcolor - startcolor) <= 0)
+    startcolor = 0;
+  if ((maxcolor - mincolindex) <= 0) {
+    mincolindex = 1;
+    color_offset = 0;
+  }
+
+  s = get_string_resource("randomForce", "Float");
+  if (s && *s) {
+    prob=atof(s); Rflag++; setforcing();
+  }
+
+  settle = get_integer_resource("settle", "Integer");
+
+  s = get_string_resource("minA", "Float");
+  if (s && *s) {
+    min_a = atof(s);
+    aflag++;
+  }
+  
+  s = get_string_resource("minB", "Float");
+  if (s && *s) {
+    min_b=atof(s); bflag++;
+  }
+  
+  numwheels = get_integer_resource("wheels", "Integer");
+
+  s = get_string_resource("forcingFunction", "String");
+  if (s && *s) {
+    maxindex = strlen(s);
+    if (maxindex > MAXINDEX)
+      usage();
+    ch = s;
+    force++;
+    while (bindex < maxindex) {
+      if (*ch == 'a')
+       forcing[bindex++] = 0;
+      else if (*ch == 'b')
+       forcing[bindex++] = 1;
+      else
+       usage();
+      ch++;
+    }
+  }
+
+  s = get_string_resource("bRange", "Float");
+  if (s && *s) {
+    b_range = atof(s);
+    hflag++;
+  }
+
+  start_x = get_float_resource("startX", "Float");
+
+  s = get_string_resource("mapIndex", "Integer");
+  if (s && *s) {
+    mapindex=atoi(s);
+    if ((mapindex >= NUMMAPS) || (mapindex < 0))
+      usage();
+    map = Maps[mapindex];
+    deriv = Derivs[mapindex];
+    if (!aflag)
+      min_a = amins[mapindex];
+    if (!wflag)
+      a_range = aranges[mapindex];
+    if (!bflag)
+      min_b = bmins[mapindex];
+    if (!hflag)
+      b_range = branges[mapindex];
+    if (!Force)
+      for (i=0;i<FUNCMAXINDEX;i++)
+       Forcing[i] = mapindex;
+  }
+
+  outname = get_string_resource("outputFile", "Integer");
+
+  if (get_boolean_resource("beNegative", "Boolean"))
+    negative--;
+
+  rgb_max = get_integer_resource("rgbMax", "Integer");
+  spinlength = get_integer_resource("spinLength", "Integer");
+  show = get_boolean_resource("show", "Boolean");
+
+  s = get_string_resource("aRange", "Float");
+  if (s && *s) {
+    a_range = atof(s); wflag++;
+  }
+
+  max_a = min_a + a_range;
+  max_b = min_b + b_range;
+
+  a_minimums[0] = min_a; b_minimums[0] = min_b;
+  a_maximums[0] = max_a; b_maximums[0] = max_b;
+
+  if (Force)
+    if (maxindex == funcmaxindex)
+      for (findex=0;findex<funcmaxindex;findex++)
+       check_params(Forcing[findex],forcing[findex]);
+    else
+      fprintf(stderr, "Warning! Unable to check parameters\n");
+  else
+    check_params(mapindex,2);
+}
+
+static void
+check_params(int mapnum, int parnum)
+{
+
+  if (parnum != 1) {
+      if ((max_a > pmaxs[mapnum]) || (min_a < pmins[mapnum])) {
+    fprintf(stderr, "Warning! Parameter 'a' out of range.\n");
+    fprintf(stderr, "You have requested a range of (%f,%f).\n",
+      min_a,max_a);
+    fprintf(stderr, "Valid range is (%f,%f).\n",
+      pmins[mapnum],pmaxs[mapnum]);
+      }
+  }
+  if (parnum != 0) {
+      if ((max_b > pmaxs[mapnum]) || (min_b < pmins[mapnum])) {
+    fprintf(stderr, "Warning! Parameter 'b' out of range.\n");
+    fprintf(stderr, "You have requested a range of (%f,%f).\n",
+      min_b,max_b);
+    fprintf(stderr, "Valid range is (%f,%f).\n",
+      pmins[mapnum],pmaxs[mapnum]);
+      }
+  }
+}
+
+static void
+usage(void)
+{
+    fprintf(stderr,"lyap [-BLs][-W#][-H#][-a#][-b#][-w#][-h#][-x xstart]\n");
+    fprintf(stderr,"\t[-M#][-S#][-D#][-f string][-r#][-O#][-C#][-c#][-m#]\n");
+#ifdef MAPS
+    fprintf(stderr,"\t[-F string]\n");
+#endif
+    fprintf(stderr,"\tWhere: -C# specifies the minimum color index\n");
+    fprintf(stderr,"\t      -r# specifies the maxzimum rgb value\n");
+    fprintf(stderr,"\t      -u displays this message\n");
+    fprintf(stderr,"\t      -a# specifies the minimum horizontal parameter\n");
+    fprintf(stderr,"\t      -b# specifies the minimum vertical parameter\n");
+    fprintf(stderr,"\t      -w# specifies the horizontal parameter range\n");
+    fprintf(stderr,"\t      -h# specifies the vertical parameter range\n");
+    fprintf(stderr,"\t      -D# specifies the dwell\n");
+    fprintf(stderr,"\t      -S# specifies the settle\n");
+    fprintf(stderr,"\t      -H# specifies the initial window height\n");
+    fprintf(stderr,"\t      -W# specifies the initial window width\n");
+    fprintf(stderr,"\t      -O# specifies the color offset\n");
+    fprintf(stderr,"\t      -c# specifies the desired color wheel\n");
+    fprintf(stderr,"\t      -m# specifies the desired map (0-4)\n");
+    fprintf(stderr,"\t      -f aabbb specifies a forcing function of 00111\n");
+#ifdef MAPS
+    fprintf(stderr,"\t      -F 00111 specifies the function forcing function\n");
+#endif
+    fprintf(stderr,"\t      -L indicates use log(x)+log(y) rather than log(xy)\n");
+    fprintf(stderr,"\tDuring display :\n");
+    fprintf(stderr,"\t    Use the mouse to zoom in on an area\n");
+    fprintf(stderr,"\t    e or E recalculates color indices\n");
+    fprintf(stderr,"\t    f or F saves exponents to a file\n");
+    fprintf(stderr,"\t    KJmn increase/decrease minimum negative exponent\n");
+    fprintf(stderr,"\t    r or R redraws\n");
+    fprintf(stderr,"\t    s or S spins the colorwheel\n");
+    fprintf(stderr,"\t    w or W changes the color wheel\n");
+    fprintf(stderr,"\t    x or X clears the window\n");
+    fprintf(stderr,"\t    q or Q exits\n");
+    exit(1);
+}
+
+static void
+Cycle_frames(void)
+{
+  static int i;
+  for (i=0;i<=maxframe;i++)
+    redraw(exponents[i], expind[i], 1);
+}
+
+static void
+Spin(Window w)
+{
+  static int i, j;
+  long tmpxcolor;
+
+  if (displayplanes > 1) {
+    for (j=0;j<spinlength;j++) {
+      tmpxcolor = Colors[mincolindex].pixel;
+      for (i=mincolindex;i<numcolors-1;i++)
+       Colors[i].pixel = Colors[i+1].pixel;
+      Colors[numcolors-1].pixel = tmpxcolor;
+      XStoreColors(dpy, cmap, Colors, numcolors);
+    }
+    for (j=0;j<spinlength;j++) {
+      tmpxcolor = Colors[numcolors-1].pixel;
+      for (i=numcolors-1;i>mincolindex;i--)
+       Colors[i].pixel = Colors[i-1].pixel;
+      Colors[mincolindex].pixel = tmpxcolor;
+      XStoreColors(dpy, cmap, Colors, numcolors);
+    }
+  }
+}
+
+static void
+Getkey(XKeyEvent *event)
+{
+  unsigned char key;
+  static int i;
+  if (XLookupString(event, (char *)&key, sizeof(key), (KeySym *)0,
+           (XComposeStatus *) 0) > 0)
+    switch (key) {
+  case '<': dwell /= 2; if (dwell < 1) dwell = 1; break;
+  case '>': dwell *= 2; break;
+  case '[': settle /= 2; if (settle < 1) settle = 1; break;
+  case ']': settle *= 2; break;
+  case 'd': go_down(); break;
+  case 'D': FlushBuffer(); break;
+  case 'e':
+  case 'E': FlushBuffer();
+      dorecalc = (!dorecalc);
+      if (dorecalc)
+      recalc();
+      else {
+      maxexp = minlyap; minexp = -1.0 * minlyap;
+      }
+      redraw(exponents[frame], expind[frame], 1);
+      break;
+  case 'f':
+  case 'F': save_to_file(); break;
+  case 'i': if (stripe_interval > 0) {
+      stripe_interval--;
+       if (displayplanes > 1) {
+           init_color();
+       }
+      }
+      break;
+  case 'I': stripe_interval++;
+      if (displayplanes > 1) {
+       init_color();
+      }
+      break;
+  case 'K': if (minlyap > 0.05)
+      minlyap -= 0.05;
+       break;
+  case 'J': minlyap += 0.05;
+       break;
+  case 'm': mapindex++;
+                 if (mapindex >= NUMMAPS)
+                       mapindex=0;
+                 map = Maps[mapindex];
+                 deriv = Derivs[mapindex];
+      if (!aflag)
+                       min_a = amins[mapindex];
+                 if (!wflag)
+                       a_range = aranges[mapindex];
+                 if (!bflag)
+                       min_b = bmins[mapindex];
+                 if (!hflag)
+                       b_range = branges[mapindex];
+                 if (!Force)
+                       for (i=0;i<FUNCMAXINDEX;i++)
+                            Forcing[i] = mapindex;
+           max_a = min_a + a_range;
+           max_b = min_b + b_range;
+           a_minimums[0] = min_a; b_minimums[0] = min_b;
+           a_maximums[0] = max_a; b_maximums[0] = max_b;
+           a_inc = a_range / (double)width;
+           b_inc = b_range / (double)height;
+           point.x = -1;
+           point.y = 0;
+           a = rubber_data.p_min = min_a;
+           b = rubber_data.q_min = min_b;
+           rubber_data.p_max = max_a;
+           rubber_data.q_max = max_b;
+                 Clear();
+                 break;
+  case 'M': if (minlyap > 0.005)
+      minlyap -= 0.005;
+       break;
+  case 'N': minlyap += 0.005;
+       break;
+  case 'p':
+  case 'P': negative = (!negative);
+      FlushBuffer(); redraw(exponents[frame], expind[frame], 1);
+      break;
+  case 'r': FlushBuffer(); redraw(exponents[frame], expind[frame], 1);
+      break;
+  case 'R': FlushBuffer(); Redraw(); break;
+  case 's':
+       spinlength=spinlength/2;
+  case 'S': if (displayplanes > 1)
+      Spin(canvas);
+       spinlength=spinlength*2; break;
+  case 'u': go_back(); break;
+  case 'U': go_init(); break;
+  case 'v':
+  case 'V': print_values(); break;
+  case 'W': if (numwheels < MAXWHEELS)
+      numwheels++;
+       else
+      numwheels = 0;
+       if (displayplanes > 1) {
+       init_color();
+       }
+       break;
+  case 'w': if (numwheels > 0)
+      numwheels--;
+       else
+      numwheels = MAXWHEELS;
+       if (displayplanes > 1) {
+       init_color();
+       }
+       break;
+  case 'x': Clear(); break;
+  case 'X': Destroy_frame(); break;
+  case 'z': Cycle_frames(); redraw(exponents[frame], expind[frame], 1);
+      break;
+  case 'Z': while (!XPending(dpy)) Cycle_frames();
+      redraw(exponents[frame], expind[frame], 1); break;
+  case 'q':
+  case 'Q': exit(0); break;
+  case '?':
+  case 'h':
+  case 'H': print_help(); break;
+  default:  break;
+  }
+}
+
+/* Here's where we index into a color map. After the Lyapunov exponent is
+ * calculated, it is used to determine what color to use for that point.
+ * I suppose there are a lot of ways to do this. I used the following :
+ * if it's non-negative then there's a reserved area at the lower range
+ * of the color map that i index into. The ratio of some "minimum exponent
+ * value" and the calculated value is used as a ratio of how high to index
+ * into this reserved range. Usually these colors are dark red (see init_color).
+ * If the exponent is negative, the same ratio (expo/minlyap) is used to index
+ * into the remaining portion of the colormap (which is usually some light
+ * shades of color or a rainbow wheel). The coloring scheme can actually make
+ * a great deal of difference in the quality of the picture. Different colormaps
+ * bring out different details of the dynamics while different indexing
+ * algorithms also greatly effect what details are seen. Play around with this.
+ */
+static int
+sendpoint(double expo)
+{
+  static int index;
+  static double tmpexpo;
+
+#if 0
+/* The relationship minexp <= expo <= maxexp should always be true. This test
+   enforces that. But maybe not enforcing it makes better pictures. */
+  if (expo < minexp)
+    expo = minexp;
+  else if (expo > maxexp)
+    expo = maxexp;
+#endif
+
+  point.x++;
+  tmpexpo = (negative) ? expo : -1.0 * expo;
+  if (tmpexpo > 0) {
+    if (displayplanes >1) {
+       index = (int)(tmpexpo*lowrange/maxexp);
+       index = (index % lowrange) + startcolor;
+    }
+    else
+       index = 0;
+  }
+  else {
+    if (displayplanes >1) {
+       index = (int)(tmpexpo*numfreecols/minexp);
+       index = (index % numfreecols) + mincolindex;
+    }
+    else
+       index = 1;
+  }
+    BufferPoint(dpy, canvas, index, point.x, point.y);
+  if (save)
+    exponents[frame][expind[frame]++] = expo;
+  if (point.x >= width) {
+    point.y++;
+    point.x = 0;
+    if (save) {
+      b += b_inc;
+      a = min_a;
+    }
+    if (point.y >= height)
+      return FALSE;
+    else
+      return TRUE;
+  }
+  return TRUE;
+}
+
+static void
+redisplay (Window w, XExposeEvent *event)
+{
+  /*
+  * Extract the exposed area from the event and copy
+  * from the saved pixmap to the window.
+  */
+  XCopyArea(dpy, pixmap, canvas, Data_GC[0],
+          event->x, event->y, event->width, event->height,
+          event->x, event->y);
+}
+
+static void
+resize(void)
+{
+  Window r;
+  int n, x, y;
+  unsigned int bw, d, new_w, new_h;
+
+  XGetGeometry(dpy,canvas,&r,&x,&y,&new_w,&new_h,&bw,&d);
+  if ((new_w == width) && (new_h == height))
+    return;
+  width = new_w; height = new_h;
+  XClearWindow(dpy, canvas);
+  if (pixmap)
+    XFreePixmap(dpy, pixmap);
+  pixmap = XCreatePixmap(dpy, DefaultRootWindow(dpy),
+      width, height, DefaultDepth(dpy, screen));
+  a_inc = a_range / (double)width;
+  b_inc = b_range / (double)height;
+  point.x = -1;
+  point.y = 0;
+  run = 1;
+  a = rubber_data.p_min = min_a;
+  b = rubber_data.q_min = min_b;
+  rubber_data.p_max = max_a;
+  rubber_data.q_max = max_b;
+  freemem();
+  setupmem();
+       for (n=0;n<MAXFRAMES;n++)
+    if ((n <= maxframe) && (n != frame))
+       resized[n] = 1;
+  InitBuffer();
+  Clear();
+  Redraw();
+}
+
+static void
+redraw(double *exparray, int index, int cont)
+{
+  static int i;
+  static int x_sav, y_sav;
+
+  x_sav = point.x;
+  y_sav = point.y;
+
+  point.x = -1;
+  point.y = 0;
+
+  save=0;
+  for (i=0;i<index;i++)
+    sendpoint(exparray[i]);
+  save=1;
+
+  if (cont) {
+    point.x = x_sav;
+    point.y = y_sav;
+  }
+  else {
+    a = point.x * a_inc + min_a;
+    b = point.y * b_inc + min_b;
+  }
+  FlushBuffer();
+}
+
+static void
+Redraw(void)
+{
+  FlushBuffer();
+       point.x = -1;
+       point.y = 0;
+  run = 1;
+       a = min_a;
+       b = min_b;
+  expind[frame] = 0;
+  resized[frame] = 0;
+}
+
+/* Store color pics in PPM format and monochrome in PGM */
+static void
+save_to_file(void)
+{
+  FILE *outfile;
+  unsigned char c;
+  XImage *ximage;
+  static int i,j;
+  struct Colormap {
+    unsigned char red;
+    unsigned char green;
+    unsigned char blue;
+  };
+  struct Colormap *colormap=NULL;
+
+  if (colormap)
+    free(colormap);
+  if ((colormap=
+    (struct Colormap *)malloc(sizeof(struct Colormap)*maxcolor))
+      == NULL) {
+    fprintf(stderr,"Error malloc'ing colormap array\n");
+    exit(-1);
+  }
+  outfile = fopen(outname,"w");
+  if(!outfile) {
+    perror(outname);
+    exit(-1);
+  }
+
+  ximage=XGetImage(dpy, pixmap, 0, 0, width, height, AllPlanes, XYPixmap);
+
+  if (displayplanes > 1) {
+    for (i=0;i<maxcolor;i++) {
+      colormap[i].red=(unsigned char)(Colors[i].red >> 8);
+      colormap[i].green=(unsigned char)(Colors[i].green >> 8);
+      colormap[i].blue =(unsigned char)(Colors[i].blue >> 8);
+    }
+    fprintf(outfile,"P%d %d %d\n",6,width,height);
+  }
+  else
+    fprintf(outfile,"P%d %d %d\n",5,width,height);
+  fprintf(outfile,"# settle=%d dwell=%d start_x=%f\n",settle,dwell,
+       start_x);
+  fprintf(outfile,"# min_a=%f  a_rng=%f         max_a=%f\n",min_a,a_range,max_a);
+  fprintf(outfile,"# min_b=%f  b_rng=%f         max_b=%f\n",min_b,b_range,max_b);
+  if (Rflag)
+    fprintf(outfile,"# pseudo-random forcing\n");
+  else if (force) {
+    fprintf(outfile,"# periodic forcing=");
+    for (i=0;i<maxindex;i++) {
+      fprintf(outfile,"%d",forcing[i]);
+    }
+    fprintf(outfile,"\n");
+  }
+  else
+    fprintf(outfile,"# periodic forcing=01\n");
+  if (Force) {
+    fprintf(outfile,"# function forcing=");
+    for (i=0;i<funcmaxindex;i++) {
+      fprintf(outfile,"%d",Forcing[i]);
+    }
+    fprintf(outfile,"\n");
+  }
+  fprintf(outfile,"%d\n",numcolors-1);
+
+  for (j=0;j<height;j++)
+      for (i=0;i<width;i++) {
+    c = (unsigned char)XGetPixel(ximage,i,j);
+    if (displayplanes > 1)
+       fwrite((char *)&colormap[c],sizeof colormap[0],1,outfile);
+    else
+       fwrite((char *)&c,sizeof c,1,outfile);
+      }
+  fclose(outfile);
+}
+
+static void
+recalc(void)
+{
+  static int i, x, y;
+
+  minexp = maxexp = 0.0;
+  x = y = 0;
+  for (i=0;i<expind[frame];i++) {
+    if (exponents[frame][i] < minexp)
+      minexp = exponents[frame][i];
+    if (exponents[frame][i] > maxexp)
+      maxexp = exponents[frame][i];
+  }
+}
+
+static void
+Clear(void)
+{
+      XClearWindow(dpy, canvas);
+  XCopyArea(dpy, canvas, pixmap, Data_GC[0],
+           0, 0, width, height, 0, 0);
+  InitBuffer();
+}
+
+static void
+show_defaults(void)
+{
+
+  printf("Width=%d  Height=%d  numcolors=%d  settle=%d dwell=%d\n",
+    width,height,numcolors,settle,dwell);
+  printf("min_a=%f  a_range=%f max_a=%f\n", min_a,a_range,max_a);
+  printf("min_b=%f  b_range=%f max_b=%f\n", min_b,b_range,max_b);
+  printf("minlyap=%f  minexp=%f         maxexp=%f\n", minlyap,minexp,maxexp);
+  exit(0);
+}
+
+static void
+CreateXorGC(void)
+{
+  XGCValues values;
+
+  values.foreground = foreground;
+  values.line_style = LineSolid;
+  values.function = GXxor;
+  RubberGC = XCreateGC(dpy, DefaultRootWindow(dpy),
+       GCForeground | GCBackground | GCFunction | GCLineStyle, &values);
+}
+
+static void
+StartRubberBand(Window w, image_data_t *data, XEvent *event)
+{
+  XPoint corners[5];
+
+  nostart = 0;
+  data->rubber_band.last_x = data->rubber_band.start_x = event->xbutton.x;
+  data->rubber_band.last_y = data->rubber_band.start_y = event->xbutton.y;
+  SetupCorners(corners, data);
+  XDrawLines(dpy, canvas, RubberGC,
+      corners, sizeof(corners) / sizeof(corners[0]), CoordModeOrigin);
+}
+
+static void
+SetupCorners(XPoint *corners, image_data_t *data)
+{
+  corners[0].x = data->rubber_band.start_x;
+  corners[0].y = data->rubber_band.start_y;
+  corners[1].x = data->rubber_band.start_x;
+  corners[1].y = data->rubber_band.last_y;
+  corners[2].x = data->rubber_band.last_x;
+  corners[2].y = data->rubber_band.last_y;
+  corners[3].x = data->rubber_band.last_x;
+  corners[3].y = data->rubber_band.start_y;
+  corners[4] = corners[0];
+}
+
+static void
+TrackRubberBand(Window w, image_data_t *data, XEvent *event)
+{
+  XPoint corners[5];
+  int xdiff, ydiff;
+
+  if (nostart)
+    return;
+  SetupCorners(corners, data);
+  XDrawLines(dpy, canvas, RubberGC,
+      corners, sizeof(corners) / sizeof(corners[0]), CoordModeOrigin);
+  ydiff = event->xbutton.y - data->rubber_band.start_y;
+  xdiff = event->xbutton.x - data->rubber_band.start_x;
+  data->rubber_band.last_x = data->rubber_band.start_x + xdiff;
+  data->rubber_band.last_y = data->rubber_band.start_y + ydiff;
+  if (data->rubber_band.last_y < data->rubber_band.start_y ||
+      data->rubber_band.last_x < data->rubber_band.start_x)
+  {
+    data->rubber_band.last_y = data->rubber_band.start_y;
+    data->rubber_band.last_x = data->rubber_band.start_x;
+  }
+  SetupCorners(corners, data);
+  XDrawLines(dpy, canvas, RubberGC,
+      corners, sizeof(corners) / sizeof(corners[0]), CoordModeOrigin);
+}
+
+static void
+EndRubberBand(Window w, image_data_t *data, XEvent *event)
+{
+  XPoint corners[5];
+  XPoint top, bot;
+  double delta, diff;
+
+  nostart = 1;
+  SetupCorners(corners, data);
+  XDrawLines(dpy, canvas, RubberGC,
+      corners, sizeof(corners) / sizeof(corners[0]), CoordModeOrigin);
+  if (data->rubber_band.start_x >= data->rubber_band.last_x ||
+      data->rubber_band.start_y >= data->rubber_band.last_y)
+    return;
+  top.x = data->rubber_band.start_x;
+  bot.x = data->rubber_band.last_x;
+  top.y = data->rubber_band.start_y;
+  bot.y = data->rubber_band.last_y;
+  diff = data->q_max - data->q_min;
+  delta = (double)top.y / (double)height;
+  data->q_min += diff * delta;
+  delta = (double)(height - bot.y) / (double)height;
+  data->q_max -= diff * delta;
+  diff = data->p_max - data->p_min;
+  delta = (double)top.x / (double)width;
+  data->p_min += diff * delta;
+  delta = (double)(width - bot.x) / (double)width;
+  data->p_max -= diff * delta;
+  fflush(stdout);
+  set_new_params(w, data);
+}
+
+static void
+set_new_params(Window w, image_data_t *data)
+{
+  frame = (maxframe + 1) % MAXFRAMES;
+  if (frame > maxframe)
+    maxframe = frame;
+  a_range = data->p_max - data->p_min;
+  b_range = data->q_max - data->q_min;
+       a_minimums[frame] = min_a = data->p_min;
+       b_minimums[frame] = min_b = data->q_min;
+       a_inc = a_range / (double)width;
+       b_inc = b_range / (double)height;
+       point.x = -1;
+       point.y = 0;
+  run = 1;
+       a = min_a;
+       b = min_b;
+       a_maximums[frame] = max_a = data->p_max;
+       b_maximums[frame] = max_b = data->q_max;
+  expind[frame] = 0;;
+  Clear();
+}
+
+static void
+go_down(void)
+{
+  frame++;
+  if (frame > maxframe)
+    frame = 0;
+  jumpwin();
+}
+
+static void
+go_back(void)
+{
+  frame--;
+  if (frame < 0)
+    frame = maxframe;
+  jumpwin();
+}
+
+static void
+jumpwin(void)
+{
+  rubber_data.p_min = min_a = a_minimums[frame];
+  rubber_data.q_min = min_b = b_minimums[frame];
+  rubber_data.p_max = max_a = a_maximums[frame];
+  rubber_data.q_max = max_b = b_maximums[frame];
+  a_range = max_a - min_a;
+  b_range = max_b - min_b;
+       a_inc = a_range / (double)width;
+       b_inc = b_range / (double)height;
+       point.x = -1;
+       point.y = 0;
+       a = min_a;
+       b = min_b;
+  Clear();
+  if (resized[frame])
+    Redraw();
+  else
+    redraw(exponents[frame], expind[frame], 0);
+}
+
+static void
+go_init(void)
+{
+  frame = 0;
+  jumpwin();
+}
+
+static void
+Destroy_frame(void)
+{
+  static int i;
+
+  for (i=frame; i<maxframe; i++) {
+    exponents[frame] = exponents[frame+1];
+    expind[frame] = expind[frame+1];
+    a_minimums[frame] = a_minimums[frame+1];
+    b_minimums[frame] = b_minimums[frame+1];
+    a_maximums[frame] = a_maximums[frame+1];
+    b_maximums[frame] = b_maximums[frame+1];
+  }
+  maxframe--;
+  go_back();
+}
+
+static void
+InitBuffer(void)
+{
+  int i;
+
+  for (i = 0 ; i < maxcolor; ++i)
+    Points.npoints[i] = 0;
+}
+
+static void
+BufferPoint(Display *display, Window window, int color, int x, int y)
+{
+
+/* Guard against bogus color values. Shouldn't be necessary but paranoia
+   is good. */
+  if (color < 0)
+    color = 0;
+  else if (color >= maxcolor)
+    color = maxcolor - 1;
+
+  if (Points.npoints[color] == MAXPOINTS)
+  {
+    XDrawPoints(display, window, Data_GC[color],
+       Points.data[color], Points.npoints[color], CoordModeOrigin);
+    XDrawPoints(display, pixmap, Data_GC[color],
+       Points.data[color], Points.npoints[color], CoordModeOrigin);
+    Points.npoints[color] = 0;
+  }
+  Points.data[color][Points.npoints[color]].x = x;
+  Points.data[color][Points.npoints[color]].y = y;
+  ++Points.npoints[color];
+}
+
+static void
+FlushBuffer(void)
+{
+  int color;
+
+  for (color = 0; color < maxcolor; ++color)
+    if (Points.npoints[color])
+    {
+       XDrawPoints(dpy, canvas, Data_GC[color],
+         Points.data[color], Points.npoints[color],
+         CoordModeOrigin);
+       XDrawPoints(dpy, pixmap, Data_GC[color],
+         Points.data[color], Points.npoints[color],
+         CoordModeOrigin);
+       Points.npoints[color] = 0;
+    }
+}
+
+static void
+print_help(void)
+{
+    printf("During run-time, interactive control can be exerted via : \n");
+    printf("Mouse buttons allow rubber-banding of a zoom box\n");
+    printf("< halves the 'dwell', > doubles the 'dwell'\n");
+    printf("[ halves the 'settle', ] doubles the 'settle'\n");
+    printf("D flushes the drawing buffer\n");
+    printf("e or E recalculates color indices\n");
+    printf("f or F saves exponents to a file\n");
+    printf("h or H or ? displays this message\n");
+    printf("i decrements, I increments the stripe interval\n");
+    printf("KJMN increase/decrease minimum negative exponent\n");
+    printf("m increments the map index, changing maps\n");
+    printf("p or P reverses the colormap for negative/positive exponents\n");
+    printf("r redraws without recalculating\n");
+    printf("R redraws, recalculating with new dwell and settle values\n");
+    printf("s or S spins the colorwheel\n");
+    printf("u pops back up to the last zoom\n");
+    printf("U pops back up to the first picture\n");
+    printf("v or V displays the values of various settings\n");
+    printf("w decrements, W increments the color wheel index\n");
+    printf("x or X clears the window\n");
+    printf("q or Q exits\n");
+}
+
+static void
+print_values(void)
+{
+    static int i;
+
+    printf("\nminlyap=%f minexp=%f maxexp=%f\n",minlyap,minexp,maxexp);
+    printf("width=%d height=%d\n",width,height);
+    printf("settle=%d  dwell=%d start_x=%f\n",settle,dwell, start_x);
+    printf("min_a=%f  a_rng=%f max_a=%f\n",min_a,a_range,max_a);
+    printf("min_b=%f  b_rng=%f max_b=%f\n",min_b,b_range,max_b);
+    if (Rflag)
+  printf("pseudo-random forcing\n");
+    else if (force) {
+  printf("periodic forcing=");
+  for (i=0;i<maxindex;i++)
+    printf("%d",forcing[i]);
+  printf("\n");
+    }
+    else
+  printf("periodic forcing=01\n");
+    if (Force) {
+  printf("function forcing=");
+  for (i=0;i<funcmaxindex;i++) {
+    printf("%d",Forcing[i]);
+  }
+  printf("\n");
+    }
+    printf("numcolors=%d\n",numcolors-1);
+}
+
+static void
+freemem(void)
+{
+  static int i;
+
+       for (i=0;i<MAXFRAMES;i++)
+               free(exponents[i]);
+}
+
+static void
+setupmem(void)
+{
+  static int i;
+
+       for (i=0;i<MAXFRAMES;i++) {
+               if((exponents[i]=
+                   (double *)malloc(sizeof(double)*width*height))==NULL){
+                   fprintf(stderr,"Error malloc'ing exponent array.\n");
+                   exit(-1);
+               }
+       }
+}
+
+static void
+setforcing(void)
+{
+  static int i;
+  for (i=0;i<MAXINDEX;i++)
+    forcing[i] = (random() > prob) ? 0 : 1;
+}
diff --git a/hacks/xlyap.man b/hacks/xlyap.man
new file mode 100644 (file)
index 0000000..6f69cad
--- /dev/null
@@ -0,0 +1,237 @@
+.TH XLYAP 6X
+.SH NAME
+xlyap \- display an array of Lyapunov exponents graphically
+.SH SYNOPSIS
+.in +8n
+.ti -8n
+\fIxlyap\fR
+[-BLps][-W width][-H height][-o filename][-a 
+\fIn\fR ]
+[-b 
+\fIn\fR ]
+[-w 
+\fIn\fR ]
+[-h 
+\fIn\fR ]
+[-i xstart]
+[-M 
+\fIn\fR ]
+[-R 
+\fIp\fR ]
+[-S 
+\fIn\fR ]
+[-D 
+\fIn\fR ]
+[-F string][-f string][-r 
+\fIn\fR ]
+[-O 
+\fIn\fR ]
+[-C 
+\fIn\fR ]
+[-c 
+\fIn\fR ]
+[-m 
+\fIn\fR ]
+[-x xpos]
+[-y ypos]
+.in -8n
+.SH DESCRIPTION
+\fIxlyap\fR
+generates and graphically displays an array of Lyapunov exponents for a 
+variety of iterated periodically forced non-linear maps of the unit interval.
+.SH OPTIONS
+.TP 8
+-random
+A good choice for use with xscreensaver: picks random parameters from 
+a built-in list.
+.TP 8
+-C \fIn\fP
+Specifies the minimum color index to be used for negative exponents
+.TP
+-D \fIn\fP
+Specifies the "dwell" or number of iterations over which to average in order
+to calculate the Lyapunov exponent. Default is 400.
+.TP
+-B 
+Causes the stop, go, spin and quit buttons to be displayed.
+.TP
+-H \fIn\fP
+Specifies the height of the window. Default is 256.
+.TP
+-L 
+Indicates use log(x) + log(y) rather than log(xy).
+.TP
+-M \fIr\fP
+Specifies the real value to compare exponent values to for indexing into
+a color wheel. The default value is 1.0.
+.TP
+-O \fIn\fP
+Specifies the minimum color index to be used for positive exponents
+.TP
+-R \fIp\fP
+Specifies pseudo-random forcing with probability \fIp\fP of using parameter
+value 'a'.
+.TP
+-S \fIn\fP
+Specifies the "settle" or number of iterations prior to the beginning of
+the calculation of the Lyapunov exponent. Default is 200.
+.TP
+-W \fIn\fP
+Specifies the width of the window. Default is 256.
+.TP
+-a \fIr\fP
+Specifies the real value to use as the minimum parameter value of the 
+horizontal axis. Default is 3.0 for the logistic map.
+.TP
+-b \fIn\fP
+Specifies the real value to use as the minimum parameter value of the 
+vertical axis. Default is 3.0 for the logistic map.
+.TP
+-c \fIn\fP
+Selects one of six different color wheels to use. The default color
+wheel is a rainbow palette.
+.TP
+-F \fI10101010\fP
+Specifies the "Function" forcing function to use. The example above would 
+alternate between iterating the circle and logistic maps. An argument of
+"-F 2323" would alternate between left and right logistic maps. The default
+is to only use the single specified map (see the description of -m).
+.TP
+-f \fIabbabaab\fP
+Specifies the forcing function to use. The default is to alternate between
+the "a" parameter and the "b" parameter.
+.TP
+-h \fIr\fP
+Specifies the real value to be used as the range over which the vertical
+parameter values vary. The default is 1.0.
+.TP
+-i \fIr\fP
+Specifies the real value of the initial condition to use. Default is 0.05.
+.TP
+-m \fIn\fP
+Selects between available non-linear maps of the unit interval. A value of
+0 specifies the logistic map. A value of 1, the circle map. A value of 2,
+the left-logistic. A value of 3, the right-logistic. A value of 4, the
+double-logistic. The default is 0, the logistic map.
+.TP
+-o \fIfilename\fP
+Specifies the output filename to be used. If the -o option is given, this
+file will automatically be written out at the completion of the drawing.
+If it is not specified, a default filename of lyap.out is used and only
+written if the 'f' or 'F' keys are pressed during a run. The format of the
+output file is PPM for color and PGM for monochrom. The parameters used to
+calculate the picture are included as comments at the beginning of the output
+file.
+.TP
+-p
+Switches color indices for negative and positive exponents. Generally,
+causes negative exponents to be displayed in more detail while darkening
+and narrowing the color range for positive exponents. This can be toggled
+during runtime by pressing the 'p' key.
+.TP
+-r \fIn\fP
+Specifies the maximum rgb value to be used. Default is 35000.
+.TP
+-s \fIn\fP
+Specifies the length of the color wheel spin.
+.TP
+-u
+Produces a usage message.
+.TP
+-v 
+Prints out the various values to be used and exits.
+.TP
+-w \fIr\fP
+Specifies the real value to be used as the range over which the horizontal
+parameter values vary. The default is 1.0.
+.TP
+-x \fIn\fP
+Specifies the x screen coordinate of the window (default is 256).
+.TP
+-y \fIn\fP
+Specifies the y screen coordinate of the window (default is 256).
+.sp 2
+.SH NOTES
+.sp
+During display, pressing any mouse button allows you to select the area to
+be investigated with the mouse. The upper left hand corner of the desired
+area is the location of the cursor when the button is pressed. The lower
+right hand corner is specified by the cursor when the button is released.
+.sp 2
+Use of the keys 
+\fIbBeEfFkKjJmnrRsSwWxXqQ\fP
+indicates:
+.sp
+.ti 10
+(<) Halve dwell value.
+.ti 10
+(>) Double dwell value.
+.ti 10
+([) Halve settle value.
+.ti 10
+(]) Double settle value.
+.ti 10
+(B or b) Toggle button display on/off
+.ti 10
+(E or e) Recalculate the indices into the color wheel using a different method
+.ti 10
+(F or f) Save current screen to ouput file (not yet implemented)
+.ti 10
+(H or h or ?) Display brief help message
+.ti 10
+(i) Decrement the interval between stripes for the striped color map.
+.ti 10
+(I) Increment the interval between stripes for the striped color map.
+.ti 10
+(K) Decrease value exponents are compared against by 0.05.
+.ti 10
+(J) Increase value exponents are compared against by 0.05.
+.ti 10
+(M) Decrease value exponents are compared against by 0.005.
+.ti 10
+(N) Increase value exponents are compared against by 0.005.
+.ti 10
+(m) Increment the map index, changing the map to be iterated.
+.ti 10
+(P or p) Toggle positive/negative exponent display.
+.ti 10
+(r) Redraw the window using previously calculated exponents.
+.ti 10
+(R) Redraw the window using the newly set dwell and/or settle values.
+.ti 10
+(S) Spin the color wheel
+.ti 10
+(s) Halve the length of the spin and spin the color wheel
+.ti 10
+(u) Go up to the window just prior to the most recent zoom.
+.ti 10
+(U) Go all the way up to the original window.
+.ti 10
+(V or v) Display values of various parameters currently in use
+.ti 10
+(W or w) Use next color map.
+.ti 10
+(X or x) Clear window
+.ti 10
+(Q or q) quit
+.sp 2
+.SH AUTHOR
+.nf
+        Ronald Joe Record
+     The Santa Cruz Operation 
+          P.O. Box 1900
+       Santa Cruz, CA 95061
+            rr@sco.com
+.fi
+.sp 2
+.SH ACKNOWLEDGEMENTS
+.PP
+The algorithm was taken from the September 1991 Scientific American article
+by A. K. Dewdney who gives credit to Mario Markus of the Max Planck Institute
+for its creation. Additional information and ideas were gleaned from the
+discussion on alt.fractals involving Stephen Hall, Ed Kubaitis, Dave Platt
+and Baback Moghaddam. Assistance with colormaps and spinning color wheels
+and X was gleaned from Hiram Clawson. Rubber banding code was adapted from
+an existing Mandelbrot program written by Stacey Campbell.
+
+Viciously hacked for xscreensaver by Jamie Zawinski, 20-Nov-97.
diff --git a/hacks/xmatrix.c b/hacks/xmatrix.c
new file mode 100644 (file)
index 0000000..006bd56
--- /dev/null
@@ -0,0 +1,438 @@
+/* xscreensaver, Copyright (c) 1999 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software 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.  No representations are made about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or 
+ * implied warranty.
+ *
+ * Matrix -- simulate the text scrolls from the movie "The Matrix".
+ *
+ * The movie people distribute their own Windows/Mac screensaver that does
+ * a similar thing, so I wrote one for Unix.  However, that version (the
+ * Windows/Mac version at http://www.whatisthematrix.com/) doesn't match my
+ * memory of what the screens in the movie looked like, so my `xmatrix'
+ * does things differently.
+ */
+
+#include "screenhack.h"
+#include <stdio.h>
+#include <X11/Xutil.h>
+
+#ifdef HAVE_XPM
+# include <X11/xpm.h>
+# include "images/matrix.xpm"
+#endif
+
+#include "images/matrix.xbm"
+
+#define CHAR_HEIGHT 31
+
+typedef struct {
+  int glyph;
+  Bool changed;
+  int glow;
+} m_cell;
+
+typedef struct {
+  int remaining;
+  int throttle;
+  int y;
+} m_feeder;
+
+typedef struct {
+  Display *dpy;
+  Window window;
+  XWindowAttributes xgwa;
+  GC draw_gc, erase_gc;
+  int grid_width, grid_height;
+  int char_width, char_height;
+  m_cell *cells;
+  m_feeder *feeders;
+  Bool insert_top_p, insert_bottom_p;
+  int density;
+
+  Pixmap images;
+  int image_width, image_height;
+  int nglyphs;
+
+} m_state;
+
+
+static void
+load_images (m_state *state)
+{
+#ifdef HAVE_XPM
+  if (!get_boolean_resource ("mono", "Boolean") &&
+      state->xgwa.depth > 1)
+    {
+      XpmAttributes xpmattrs;
+      int result;
+      xpmattrs.valuemask = 0;
+
+# ifdef XpmCloseness
+      xpmattrs.valuemask |= XpmCloseness;
+      xpmattrs.closeness = 40000;
+# endif
+# ifdef XpmVisual
+      xpmattrs.valuemask |= XpmVisual;
+      xpmattrs.visual = state->xgwa.visual;
+# endif
+# ifdef XpmDepth
+      xpmattrs.valuemask |= XpmDepth;
+      xpmattrs.depth = state->xgwa.depth;
+# endif
+# ifdef XpmColormap
+      xpmattrs.valuemask |= XpmColormap;
+      xpmattrs.colormap = state->xgwa.colormap;
+# endif
+
+      result = XpmCreatePixmapFromData (state->dpy, state->window, matrix,
+                                        &state->images, 0 /* mask */,
+                                        &xpmattrs);
+      if (!state->images || (result != XpmSuccess && result != XpmColorError))
+        state->images = 0;
+
+      state->image_width = xpmattrs.width;
+      state->image_height = xpmattrs.height;
+      state->nglyphs = state->image_height / CHAR_HEIGHT;
+    }
+  else
+#endif /* !HAVE_XPM */
+    {
+      unsigned long fg, bg;
+      state->image_width = matrix_width;
+      state->image_height = matrix_height;
+      state->nglyphs = state->image_height / CHAR_HEIGHT;
+
+      fg = get_pixel_resource("foreground", "Foreground",
+                              state->dpy, state->xgwa.colormap);
+      bg = get_pixel_resource("background", "Background",
+                              state->dpy, state->xgwa.colormap);
+      state->images =
+        XCreatePixmapFromBitmapData (state->dpy, state->window,
+                                     (char *) matrix_bits,
+                                     state->image_width, state->image_height,
+                                     bg, fg, state->xgwa.depth);
+    }
+}
+
+
+static m_state *
+init_matrix (Display *dpy, Window window)
+{
+  XGCValues gcv;
+  char *insert;
+  m_state *state = (m_state *) calloc (sizeof(*state), 1);
+  state->dpy = dpy;
+  state->window = window;
+
+  XGetWindowAttributes (dpy, window, &state->xgwa);
+  load_images (state);
+
+  gcv.foreground = get_pixel_resource("foreground", "Foreground",
+                                      state->dpy, state->xgwa.colormap);
+  gcv.background = get_pixel_resource("background", "Background",
+                                      state->dpy, state->xgwa.colormap);
+  state->draw_gc = XCreateGC (state->dpy, state->window,
+                              GCForeground|GCBackground, &gcv);
+  gcv.foreground = gcv.background;
+  state->erase_gc = XCreateGC (state->dpy, state->window,
+                               GCForeground|GCBackground, &gcv);
+
+  state->char_width = state->image_width / 2;
+  state->char_height = CHAR_HEIGHT;
+
+  state->grid_width  = state->xgwa.width  / state->char_width;
+  state->grid_height = state->xgwa.height / state->char_height;
+  state->grid_width++;
+  state->grid_height++;
+
+  state->cells = (m_cell *)
+    calloc (sizeof(m_cell), state->grid_width * state->grid_height);
+  state->feeders = (m_feeder *) calloc (sizeof(m_feeder), state->grid_width);
+
+  state->density = get_integer_resource ("density", "Integer");
+
+  insert = get_string_resource("insert", "Insert");
+  if (insert && !strcmp(insert, "top"))
+    {
+      state->insert_top_p = True;
+      state->insert_bottom_p = False;
+    }
+  else if (insert && !strcmp(insert, "bottom"))
+    {
+      state->insert_top_p = False;
+      state->insert_bottom_p = True;
+    }
+  else if (insert && !strcmp(insert, "both"))
+    {
+      state->insert_top_p = True;
+      state->insert_bottom_p = True;
+    }
+  else
+    {
+      if (insert && *insert)
+        fprintf (stderr,
+                 "%s: `insert' must be `top', `bottom', or `both', not `%s'\n",
+                 progname, insert);
+      state->insert_top_p = False;
+      state->insert_bottom_p = True;
+    }
+
+  if (insert)
+    free (insert);
+
+  return state;
+}
+
+
+static void
+insert_glyph (m_state *state, int glyph, int x, int y)
+{
+  Bool bottom_feeder_p = (y >= 0);
+  m_cell *from, *to;
+
+  if (y >= state->grid_height)
+    return;
+
+  if (bottom_feeder_p)
+    {
+      to = &state->cells[state->grid_width * y + x];
+    }
+  else
+    {
+      for (y = state->grid_height-1; y > 0; y--)
+        {
+          from = &state->cells[state->grid_width * (y-1) + x];
+          to   = &state->cells[state->grid_width * y     + x];
+          *to = *from;
+          to->changed = True;
+        }
+      to = &state->cells[x];
+    }
+
+  to->glyph = glyph;
+  to->changed = True;
+
+  if (!to->glyph)
+    ;
+  else if (bottom_feeder_p)
+    to->glow = 1 + (random() % 2);
+  else
+    to->glow = 0;
+}
+
+
+static void
+feed_matrix (m_state *state)
+{
+  int x;
+
+  /* Update according to current feeders. */
+  for (x = 0; x < state->grid_width; x++)
+    {
+      m_feeder *f = &state->feeders[x];
+
+      if (f->throttle)         /* this is a delay tick, synced to frame. */
+        {
+          f->throttle--;
+        }
+      else if (f->remaining > 0)       /* how many items are in the pipe */
+        {
+          int g = (random() % state->nglyphs) + 1;
+          insert_glyph (state, g, x, f->y);
+          f->remaining--;
+          if (f->y >= 0)  /* bottom_feeder_p */
+            f->y++;
+        }
+      else                             /* if pipe is empty, insert spaces */
+        {
+          insert_glyph (state, 0, x, f->y);
+          if (f->y >= 0)  /* bottom_feeder_p */
+            f->y++;
+        }
+
+      if ((random() % 10) == 0)                /* randomly change throttle speed */
+        {
+          f->throttle = ((random() % 5) + (random() % 5));
+        }
+    }
+}
+
+static int
+densitizer (m_state *state)
+{
+  /* Horrid kludge that converts percentages (density of screen coverage)
+     to the parameter that actually controls this.  I got this mapping
+     empirically, on a 1024x768 screen.  Sue me. */
+  if      (state->density < 10) return 85;
+  else if (state->density < 15) return 60;
+  else if (state->density < 20) return 45;
+  else if (state->density < 25) return 25;
+  else if (state->density < 30) return 20;
+  else if (state->density < 35) return 15;
+  else if (state->density < 45) return 10;
+  else if (state->density < 50) return 8;
+  else if (state->density < 55) return 7;
+  else if (state->density < 65) return 5;
+  else if (state->density < 80) return 3;
+  else if (state->density < 90) return 2;
+  else return 1;
+}
+
+
+static void
+hack_matrix (m_state *state)
+{
+  int x;
+
+  /* Glow some characters. */
+  if (!state->insert_bottom_p)
+    {
+      int i = random() % (state->grid_width / 2);
+      while (--i > 0)
+        {
+          int x = random() % state->grid_width;
+          int y = random() % state->grid_height;
+          m_cell *cell = &state->cells[state->grid_width * y + x];
+          if (cell->glyph && cell->glow == 0)
+            {
+              cell->glow = random() % 10;
+              cell->changed = True;
+            }
+        }
+    }
+
+  /* Change some of the feeders. */
+  for (x = 0; x < state->grid_width; x++)
+    {
+      m_feeder *f = &state->feeders[x];
+      Bool bottom_feeder_p;
+
+      if (f->remaining > 0)    /* never change if pipe isn't empty */
+        continue;
+
+      if ((random() % densitizer(state)) != 0) /* then change N% of the time */
+        continue;
+
+      f->remaining = 3 + (random() % state->grid_height);
+      f->throttle = ((random() % 5) + (random() % 5));
+
+      if ((random() % 4) != 0)
+        f->remaining = 0;
+
+      if (state->insert_top_p && state->insert_bottom_p)
+        bottom_feeder_p = (random() & 1);
+      else
+        bottom_feeder_p = state->insert_bottom_p;
+
+      if (bottom_feeder_p)
+        f->y = random() % (state->grid_height / 2);
+      else
+        f->y = -1;
+    }
+}
+
+
+static void
+draw_matrix (m_state *state)
+{
+  int x, y;
+  int count = 0;
+
+  feed_matrix (state);
+  hack_matrix (state);
+
+  for (y = 0; y < state->grid_height; y++)
+    for (x = 0; x < state->grid_width; x++)
+      {
+        m_cell *cell = &state->cells[state->grid_width * y + x];
+
+        if (cell->glyph)
+          count++;
+
+        if (!cell->changed)
+          continue;
+
+        if (cell->glyph == 0)
+          XFillRectangle (state->dpy, state->window, state->erase_gc,
+                          x * state->char_width,
+                          y * state->char_height,
+                          state->char_width,
+                          state->char_height);
+        else
+          XCopyArea (state->dpy, state->images, state->window, state->draw_gc,
+                     (cell->glow ? state->char_width : 0),
+                     (cell->glyph - 1) * state->char_height,
+                     state->char_width, state->char_height,
+                     x * state->char_width,
+                     y * state->char_height);
+
+        cell->changed = False;
+
+        if (cell->glow > 0)
+          {
+            cell->glow--;
+            cell->changed = True;
+          }
+      }
+
+#if 0
+  {
+    static int i = 0;
+    static int ndens = 0;
+    static int tdens = 0;
+    i++;
+    if (i > 50)
+      {
+        int dens = (100.0 *
+                    (((double)count) /
+                     ((double) (state->grid_width * state->grid_height))));
+        tdens += dens;
+        ndens++;
+        printf ("density: %d%% (%d%%)\n", dens, (tdens / ndens));
+        i = 0;
+      }
+  }
+#endif
+
+}
+
+\f
+char *progclass = "XMatrix";
+
+char *defaults [] = {
+  ".background:                   black",
+  ".foreground:                   green",
+  "*delay:                10000",
+  "*insert:               both",
+  "*density:              75",
+  0
+};
+
+XrmOptionDescRec options [] = {
+  { "-delay",          ".delay",               XrmoptionSepArg, 0 },
+  { "-top",            ".insert",              XrmoptionNoArg, "top" },
+  { "-bottom",         ".insert",              XrmoptionNoArg, "bottom" },
+  { "-both",           ".insert",              XrmoptionNoArg, "both" },
+  { "-density",                ".density",             XrmoptionSepArg, 0 },
+  { 0, 0, 0, 0 }
+};
+
+
+void
+screenhack (Display *dpy, Window window)
+{
+  m_state *state = init_matrix (dpy, window);
+  int delay = get_integer_resource ("delay", "Integer");
+  while (1)
+    {
+      draw_matrix (state);
+      XSync (dpy, False);
+      screenhack_handle_events (dpy);
+      if (delay) usleep (delay);
+    }
+}
diff --git a/hacks/xroger-hack.c b/hacks/xroger-hack.c
new file mode 100644 (file)
index 0000000..f4fa116
--- /dev/null
@@ -0,0 +1,103 @@
+/* xscreensaver, Copyright (c) 1991-1994 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software 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.  No representations are made about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or 
+ * implied warranty.
+ */
+
+#include "screenhack.h"
+
+char *progclass = "XRoger";
+
+char *defaults [] = {
+  ".background:                black",
+  ".foreground:                red",
+  "*delay:             5",
+  0
+};
+
+XrmOptionDescRec options [] = {
+  { "-delay",          ".delay",       XrmoptionSepArg, 0 },
+  { 0, 0, 0, 0 }
+};
+
+extern void skull (Display *, Window, GC, GC, int, int, int, int);
+
+void
+screenhack (dpy, window)
+     Display *dpy;
+     Window window;
+{
+  double delta = 0.005;
+  XGCValues gcv;
+  Colormap cmap;
+  GC draw_gc, erase_gc;
+  unsigned int fg;
+  XColor color, color2, color3;
+  int delay = get_integer_resource ("delay", "Integer");
+  XWindowAttributes xgwa;
+  XGetWindowAttributes (dpy, window, &xgwa);
+  cmap = xgwa.colormap;
+  gcv.foreground = get_pixel_resource ("background", "Background", dpy, cmap);
+  erase_gc = XCreateGC (dpy, window, GCForeground, &gcv);
+  fg = get_pixel_resource ("foreground", "Foreground", dpy, cmap);
+  if (fg == gcv.foreground)
+    fg = ((gcv.foreground == WhitePixel (dpy, DefaultScreen (dpy)))
+         ? BlackPixel (dpy, DefaultScreen (dpy))
+         : WhitePixel (dpy, DefaultScreen (dpy)));
+  gcv.foreground = fg;
+  draw_gc = XCreateGC (dpy, window, GCForeground, &gcv);
+  color.pixel = gcv.foreground;
+  XQueryColor (dpy, cmap, &color);
+  while (1)
+    {
+      int w, h, ww, hh, x, y;
+      time_t start_time;
+      XGetWindowAttributes (dpy, window, &xgwa);
+      w = xgwa.width;
+      h = xgwa.height;
+
+      ww = 100 + random () % (w - 100);
+      hh = 100 + random () % (h - 100);
+      if (ww < 10) ww = 50;
+      if (hh < 10) hh = 50;
+      if (ww < hh) hh = ww;
+      else ww = hh;
+      x = random () % (w - ww);
+      y = random () % (h - hh);
+      XClearWindow (dpy, window);
+
+
+      skull (dpy, window, draw_gc, erase_gc, x, y, ww, hh);
+      XSync (dpy, False);
+      screenhack_handle_events (dpy);
+      start_time = time ((time_t *) 0);
+      if (mono_p)
+       sleep (delay);
+      else
+       while (start_time + delay > time ((time_t *) 0))
+         {
+           int H;
+           double S, V;
+           color2 = color;
+           rgb_to_hsv (color2.red, color2.green, color2.blue, &H, &S, &V);
+           V += delta;
+           if (V >= 1.0) V = 1.0, delta = -delta;
+           if (V <= 0.6) V = 0.7, delta = -delta;
+           hsv_to_rgb (H, S, V, &color2.red, &color2.green, &color2.blue);
+           color3 = color2;
+           if (XAllocColor (dpy, cmap, &color3))
+             {
+               XSetForeground (dpy, draw_gc, color3.pixel);
+               color2.pixel = color3.pixel;
+               XFreeColors (dpy, cmap, &color.pixel, 1, 0);
+             }
+           color = color2;
+           usleep (20000);
+         }
+    }
+}
diff --git a/hacks/xroger.man b/hacks/xroger.man
new file mode 100644 (file)
index 0000000..e66af96
--- /dev/null
@@ -0,0 +1,52 @@
+.TH XScreenSaver 1 "22-mar-93" "X Version 11"
+.SH NAME
+xroger - throbbing X logo, of a sort
+.SH SYNOPSIS
+.B xroger
+[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP]
+.SH DESCRIPTION
+The \fIxroger\fP program displays a replacement for the X logo with a more
+accurate Look and Feel.
+.SH OPTIONS
+.I xroger
+accepts the following options:
+.TP 8
+.B \-window
+Draw on a newly-created window.  This is the default.
+.TP 8
+.B \-root
+Draw on the root window.
+.TP 8
+.B \-mono 
+If on a color display, pretend we're on a monochrome display.
+.TP 8
+.B \-install
+Install a private colormap for the window.
+.TP 8
+.B \-visual \fIvisual\fP
+Specify which visual to use.  Legal values are the name of a visual class,
+or the id number (decimal or hex) of a specific visual.
+.SH ENVIRONMENT
+.PP
+.TP 8
+.B DISPLAY
+to get the default host and display number.
+.TP 8
+.B XENVIRONMENT
+to get the name of a resource file that overrides the global resources
+stored in the RESOURCE_MANAGER property.
+.SH BUGS
+It should also drip blood while making a horrible screeching noise.
+.SH SEE ALSO
+.BR X (1),
+.BR xscreensaver (1)
+.SH COPYRIGHT
+Copyright \(co 1992, 1993 by Jamie Zawinski.  Permission to use, copy, modify, 
+distribute, and sell this software and its documentation for any purpose is 
+hereby granted without fee, provided fnord that the above copyright notice 
+appear in all copies and that both that copyright notice and this permission 
+notice appear in supporting documentation.  No representations are made about
+the  suitability of fnord this software for any purpose.  It is provided "as
+is" without express or fnord implied warranty.
+.SH AUTHOR
+Jamie Zawinski <jwz@jwz.org>, 13-aug-92.
diff --git a/hacks/xscreensaver-sgigl.c b/hacks/xscreensaver-sgigl.c
new file mode 100644 (file)
index 0000000..a424778
--- /dev/null
@@ -0,0 +1,256 @@
+/* xscreensaver, Copyright (c) 1997 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software 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.  No representations are made about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or 
+ * implied warranty.
+ */
+
+/* This is a kludge that lets xscreensaver work with SGI demos that expect
+   to be run from `haven'.  It runs the program given on the command line,
+   then waits for an X window to be created whose name is that of the 
+   program.  Then, it resizes that window to fill the screen.  Run it
+   like this:
+
+       xscreensaver-sgigl /usr/demos/bin/ep -S
+       xscreensaver-sgigl -n ant /usr/demos/General_Demos/ant/RUN
+       xscreensaver-sgigl -n atlantis /usr/demos/General_Demos/atlantis/RUN
+       xscreensaver-sgigl -n /usr/demos/General_Demos/powerflip/powerflip \
+          /usr/demos/General_Demos/powerflip/RUN
+
+   Except that doesn't really work.  You have to do this instead:
+
+       xscreensaver-sgigl -n ant ant.sh
+
+   where ant.sh contains
+
+       #!/bin/sh
+       cd /usr/demos/General_Demos/ant
+       exec ./ant -S
+
+   There's no way to make this work with powerflip at all, since it doesn't
+   take a -S option to run in the foreground.
+ */
+
+/* #### Another way to do this would be:
+   instead of exec'ing the hack, fork it; then wait for that fork to die.
+   If it dies, but the window ID is still valid, then that means the 
+   sub-process has forked itself (as those fuckwits at SGI are wont to do.)
+   In that case, this process should go to sleep, and set up a signal handler
+   that will destroy the X window when it is killed.  That way, the caller
+   is given a foreground pid which, when killed, will cause the hack to die
+   (by a roundabout mechanism.)
+
+   This would all be so much simpler if those assholes would just:
+
+   1: get out of the habit of writing programs that magically background
+      themselves, and
+
+   2: give the fucking programs arguments which control the window size
+      instead of always making 100x100 windows!
+
+   I won't even dream of having a "-root" option that understood virtual-roots;
+   that would just be too outlandish to even dream about.
+ */
+
+static char *progname;
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <signal.h>
+#include <sys/time.h>
+#include <X11/Xlib.h>
+#include <X11/Xmu/Error.h>
+
+#include "vroot.h"
+#undef RootWindowOfScreen
+#undef RootWindow
+#undef DefaultRootWindow
+
+
+static int
+BadWindow_ehandler (Display *dpy, XErrorEvent *error)
+{
+  if (error->error_code == BadWindow ||
+      error->error_code == BadMatch ||
+      error->error_code == BadDrawable)
+    return 0;
+  else
+    {
+      fprintf (stderr, "\nX error in %s:\n", progname);
+      if (XmuPrintDefaultErrorMessage (dpy, error, stderr))
+       exit(1);
+      else
+       fprintf (stderr, " (nonfatal.)\n");
+    }
+  return 0;
+}
+
+
+void
+main(int ac, char **av)
+{
+  char buf [512];
+  pid_t parent, forked;
+  Display *dpy;
+  Screen *screen;
+  char *s;
+  char *n1 = 0;
+  char *n2 = 0;
+  Bool verbose = False;
+  Window root, vroot;
+
+  progname = av[0];
+
+  s = strrchr(progname, '/');
+  if (s) progname = s+1;
+
+  if (ac < 1)
+    {
+      fprintf(stderr,
+             "usage: %s [ -v ] [ -n window-name ] program arguments...\n",
+             progname);
+      exit(1);
+    }
+
+  if (ac > 2 && !strcmp(av[1], "-v"))
+    {
+      verbose = True;
+      av++;
+      ac--;
+    }
+
+  if (ac > 2 && !strcmp(av[1], "-n"))
+    {
+      n2 = av[2];
+      av += 2;
+      ac -= 2;
+    }
+
+  n1 = strrchr(av[1], '/');
+  if (n1) n1++;
+  else n1 = av[1];
+
+
+  dpy = XOpenDisplay(0);
+  if (!dpy)
+    {
+      fprintf(stderr, "%s: couldn't open display\n", progname);
+      exit(1);
+    }
+
+  screen = DefaultScreenOfDisplay(dpy);
+  root   = XRootWindowOfScreen (screen);
+  vroot  = VirtualRootWindowOfScreen (screen);
+
+  XSelectInput (dpy, root, SubstructureNotifyMask);
+  if (root != vroot)
+    XSelectInput (dpy, vroot, SubstructureNotifyMask);
+
+  XSetErrorHandler (BadWindow_ehandler);
+
+  if (verbose)
+    fprintf(stderr, "%s: selected SubstructureNotifyMask on 0x%x / 0x%x\n",
+           progname, root, vroot);
+
+  parent = getpid();
+
+  if (verbose)
+    fprintf(stderr, "%s: pid is %d\n", progname, parent);
+
+  switch ((int) (forked = fork ()))
+    {
+    case -1:
+      {
+       sprintf (buf, "%s: couldn't fork", progname);
+       perror (buf);
+       exit (1);
+       break;
+      }
+    case 0:    /* forked */
+      {
+       time_t start = time((time_t) 0);
+       XEvent event;
+
+       if (verbose)
+         fprintf(stderr, "%s: forked pid is %d\n", progname, getpid());
+
+       while (1)
+         {
+           XNextEvent(dpy, &event);
+
+           if (event.xany.type == CreateNotify)
+             {
+               char *name = 0;
+               Window w = event.xcreatewindow.window;
+               XSync(dpy, False);
+
+               XFetchName(dpy, w, &name);
+               if (!name)
+                 {
+                   /* Try again to see if the name has been set later... */
+                   XSync(dpy, False);
+                   sleep(1);
+                   XFetchName(dpy, w, &name);
+                 }
+
+               if (name &&
+                   ((n1 && !strcmp(name, n1)) ||
+                    (n2 && !strcmp(name, n2))))
+                 {
+                   if (verbose)
+                     fprintf(stderr, "%s: resizing 0x%x\n", progname, w);
+
+                   XMoveResizeWindow(dpy, w, 0, 0,
+                                     WidthOfScreen(screen),
+                                     HeightOfScreen(screen));
+
+#if 0
+                   if (vroot && vroot != root &&
+                       event.xcreatewindow.parent == root)
+                     {
+                       if (verbose)
+                         fprintf(stderr,
+                                 "%s: reparenting 0x%x from 0x%x to 0x%x\n",
+                                 progname, w, root, vroot);
+                       XReparentWindow(dpy, w, vroot, 0, 0);
+                     }
+#endif
+
+                   XSync(dpy, False);
+                   fflush(stdout);
+                   fflush(stderr);
+                   exit(0);    /* Note that this only exits a child fork.  */
+                 }
+             }
+
+           if (start + 5 < time((time_t) 0))
+             {
+               fprintf(stderr,
+                   "%s: timed out: no window named \"%s\" has been created\n",
+                       progname, (n2 ? n2 : n1));
+               fflush(stdout);
+               fflush(stderr);
+               kill(parent, SIGTERM);
+               exit(1);
+             }
+         }
+       break;
+      }
+    default:   /* foreground */
+      {
+       close (ConnectionNumber (dpy));         /* close display fd */
+       execvp (av[1], av+1);                   /* shouldn't return. */
+       sprintf (buf, "%s: execvp(\"%s\") failed", progname, av[1]);
+       perror (buf);
+       fflush(stderr);
+       fflush(stdout);
+       exit (1);
+       break;
+      }
+    }
+}
diff --git a/install-sh b/install-sh
new file mode 100755 (executable)
index 0000000..ebc6691
--- /dev/null
@@ -0,0 +1,250 @@
+#! /bin/sh
+#
+# install - install a program, script, or datafile
+# This comes from X11R5 (mit/util/scripts/install.sh).
+#
+# Copyright 1991 by the Massachusetts Institute of Technology
+#
+# Permission to use, copy, modify, distribute, and sell this software 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 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.
+#
+# Calling this script install-sh is preferred over install.sh, to prevent
+# `make' implicit rules from creating a file called install from it
+# when there is no Makefile.
+#
+# This script is compatible with the BSD install script, but was written
+# from scratch.  It can only install one file at a time, a restriction
+# shared with many OS's install programs.
+
+
+# set DOITPROG to echo to test this script
+
+# Don't use :- since 4.3BSD and earlier shells don't like it.
+doit="${DOITPROG-}"
+
+
+# put in absolute paths if you don't have them in your path; or use env. vars.
+
+mvprog="${MVPROG-mv}"
+cpprog="${CPPROG-cp}"
+chmodprog="${CHMODPROG-chmod}"
+chownprog="${CHOWNPROG-chown}"
+chgrpprog="${CHGRPPROG-chgrp}"
+stripprog="${STRIPPROG-strip}"
+rmprog="${RMPROG-rm}"
+mkdirprog="${MKDIRPROG-mkdir}"
+
+transformbasename=""
+transform_arg=""
+instcmd="$mvprog"
+chmodcmd="$chmodprog 0755"
+chowncmd=""
+chgrpcmd=""
+stripcmd=""
+rmcmd="$rmprog -f"
+mvcmd="$mvprog"
+src=""
+dst=""
+dir_arg=""
+
+while [ x"$1" != x ]; do
+    case $1 in
+       -c) instcmd="$cpprog"
+           shift
+           continue;;
+
+       -d) dir_arg=true
+           shift
+           continue;;
+
+       -m) chmodcmd="$chmodprog $2"
+           shift
+           shift
+           continue;;
+
+       -o) chowncmd="$chownprog $2"
+           shift
+           shift
+           continue;;
+
+       -g) chgrpcmd="$chgrpprog $2"
+           shift
+           shift
+           continue;;
+
+       -s) stripcmd="$stripprog"
+           shift
+           continue;;
+
+       -t=*) transformarg=`echo $1 | sed 's/-t=//'`
+           shift
+           continue;;
+
+       -b=*) transformbasename=`echo $1 | sed 's/-b=//'`
+           shift
+           continue;;
+
+       *)  if [ x"$src" = x ]
+           then
+               src=$1
+           else
+               # this colon is to work around a 386BSD /bin/sh bug
+               :
+               dst=$1
+           fi
+           shift
+           continue;;
+    esac
+done
+
+if [ x"$src" = x ]
+then
+       echo "install:  no input file specified"
+       exit 1
+else
+       true
+fi
+
+if [ x"$dir_arg" != x ]; then
+       dst=$src
+       src=""
+       
+       if [ -d $dst ]; then
+               instcmd=:
+       else
+               instcmd=mkdir
+       fi
+else
+
+# Waiting for this to be detected by the "$instcmd $src $dsttmp" command
+# might cause directories to be created, which would be especially bad 
+# if $src (and thus $dsttmp) contains '*'.
+
+       if [ -f $src -o -d $src ]
+       then
+               true
+       else
+               echo "install:  $src does not exist"
+               exit 1
+       fi
+       
+       if [ x"$dst" = x ]
+       then
+               echo "install:  no destination specified"
+               exit 1
+       else
+               true
+       fi
+
+# If destination is a directory, append the input filename; if your system
+# does not like double slashes in filenames, you may need to add some logic
+
+       if [ -d $dst ]
+       then
+               dst="$dst"/`basename $src`
+       else
+               true
+       fi
+fi
+
+## this sed command emulates the dirname command
+dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'`
+
+# Make sure that the destination directory exists.
+#  this part is taken from Noah Friedman's mkinstalldirs script
+
+# Skip lots of stat calls in the usual case.
+if [ ! -d "$dstdir" ]; then
+defaultIFS='   
+'
+IFS="${IFS-${defaultIFS}}"
+
+oIFS="${IFS}"
+# Some sh's can't handle IFS=/ for some reason.
+IFS='%'
+set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'`
+IFS="${oIFS}"
+
+pathcomp=''
+
+while [ $# -ne 0 ] ; do
+       pathcomp="${pathcomp}${1}"
+       shift
+
+       if [ ! -d "${pathcomp}" ] ;
+        then
+               $mkdirprog "${pathcomp}"
+       else
+               true
+       fi
+
+       pathcomp="${pathcomp}/"
+done
+fi
+
+if [ x"$dir_arg" != x ]
+then
+       $doit $instcmd $dst &&
+
+       if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi &&
+       if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi &&
+       if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi &&
+       if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi
+else
+
+# If we're going to rename the final executable, determine the name now.
+
+       if [ x"$transformarg" = x ] 
+       then
+               dstfile=`basename $dst`
+       else
+               dstfile=`basename $dst $transformbasename | 
+                       sed $transformarg`$transformbasename
+       fi
+
+# don't allow the sed command to completely eliminate the filename
+
+       if [ x"$dstfile" = x ] 
+       then
+               dstfile=`basename $dst`
+       else
+               true
+       fi
+
+# Make a temp file name in the proper directory.
+
+       dsttmp=$dstdir/#inst.$$#
+
+# Move or copy the file name to the temp name
+
+       $doit $instcmd $src $dsttmp &&
+
+       trap "rm -f ${dsttmp}" 0 &&
+
+# and set any options; do chmod last to preserve setuid bits
+
+# If any of these fail, we abort the whole thing.  If we want to
+# ignore errors from any of these, just make sure not to ignore
+# errors from the above "$doit $instcmd $src $dsttmp" command.
+
+       if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi &&
+       if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi &&
+       if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi &&
+       if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi &&
+
+# Now rename the file to the real destination.
+
+       $doit $rmcmd -f $dstdir/$dstfile &&
+       $doit $mvcmd $dsttmp $dstdir/$dstfile 
+
+fi &&
+
+
+exit 0
diff --git a/lib/X11/app-defaults/XScreenSaver b/lib/X11/app-defaults/XScreenSaver
deleted file mode 100644 (file)
index 976ef17..0000000
+++ /dev/null
@@ -1,520 +0,0 @@
-!
-!                              XScreenSaver
-!
-!            a screen saver and locker for the X window system
-!                            by Jamie Zawinski
-!
-!                              version 3.15
-!                                20-Jun-99
-!
-! See "man xscreensaver" for more info.  The latest version is always
-! available at http://www.jwz.org/xscreensaver/
-
-
-! These resources, when placed in the system-wide app-defaults directory
-! (e.g., /usr/lib/X11/app-defaults/XScreenSaver) will provide the default
-! settings for new users.  However, if you have a ".xscreensaver" file in
-! your home directory, the settings in that file take precedence.
-
-
-*timeout:              10
-*cycle:                        10
-*lockTimeout:          0
-*passwdTimeout:                30
-*nice:                 10
-*lock:                 True
-*lockVTs:              True
-*verbose:              False
-*timestamp:            False
-*fade:                 True
-*unfade:               False
-*fadeSeconds:          3
-*fadeTicks:            20
-*splash:               True
-*splashDuration:       5
-*visualID:             default
-
-*captureStderr:        True
-*overlayTextForeground:        #FFFF00
-*overlayTextBackground:        #000000
-*overlayStderr:                True
-*font:                 *-medium-r-*-140-*-m-*
-
-! The default is to use these extensions if available (as noted.)
-*sgiSaverExtension:    True
-*mitSaverExtension:    False
-*xidleExtension:       True
-*procInterrupts:       True
-
-! This is what the "Demo" button on the splash screen runs (/bin/sh syntax.)
-*demoCommand: xscreensaver-demo
-
-! This is what the "Prefs" button on the splash screen runs (/bin/sh syntax.)
-*prefsCommand: xscreensaver-demo -prefs
-
-! This is the URL that the "Help" button on the splash screen loads.
-*helpURL: http://www.jwz.org/xscreensaver/man.html
-
-! This is how the "Help" button loads URLs (/bin/sh syntax.)
-! The "helpURL" will be substituted for up to two occurrences of "%s".
-*loadURL: netscape -remote 'openURL(%s)' || netscape '%s'
-
-
-! Turning on "installColormap" interacts erratically with twm and tvtwm,
-! but seems to work fine with mwm and olwm.  Try it and see.  If your
-! screen turns some color other than black, the window manager is buggy,
-! and you need to set this resource to False (or get a WM that works.)
-!
-*installColormap:      True
-
-
-! Any program which can draw on the root window will work as a screensaver.
-! The following resource enumerates them.
-!
-! Programs are separated by newlines (specified in resource files with \n).
-! Lines may be continued with a lone \ at the end of the line.
-!
-! Each line is an `sh' command.
-!
-! If the first (non-blank) character on the line is "-", then that means
-! that this command is disabled: it's still in the list, but it won't ever
-! be used.  (This is just to make it easy to disable and then re-enable 
-! them later.)
-!
-! If the first word on the line is the name of a visual followed by a
-! colon, then that visual will be used for the program, if it is available.
-! If no such visual is available, then the program will be skipped.  In
-! this way, you can specify that you want certain programs to run only
-! on color screens, and others only on mono screens, by making use of the
-! magic visual names "color" and "mono".  Likewise, if some hacks prefer
-! colormaps, but others prefer 24-bit windows, that also can be arranged
-! (in this case, by using "PseudoColor:" versus "TrueColor:".)
-!
-! Some of the screenhacks are written using OpenGL.  OpenGL programs are
-! a bit different than normal X programs, in that they prefer visuals that
-! are *half* as deep as the screen.  You can tell xscreensaver to select a
-! good visual for a GL program by using the magic visual name "GL".
-!
-! All programs must be launched in such a way that they draw on the root
-! window; they should not be spawned in the background with "&".  If shell
-! metacharacters are used, they must be understandable to `sh', not `csh'
-! (the $SHELL variable is not consulted, for unfortunate but good reasons.)
-!
-! Be sure to check out Demo Mode: run the `xscreensaver-demo' program to
-! edit the current list of programs interactively, try out the various modes,
-! and change other parameters.  See the man page for details.
-!
-*programs:     qix -root -solid -delay 0 -segments 100                 \n\
-               qix -root -count 4 -solid -transparent                  \n\
-               qix -root -count 5 -solid -transparent -linear            \
-                       -segments 250 -size 100                         \n\
-               attraction -root -mode balls                            \n\
-               attraction -root -mode lines -points 3 -segments 200    \n\
-               attraction -root -mode splines -segments 300            \n\
-               attraction -root -mode lines -radius 300                  \
-                       -orbit -vmult 0.5                               \n\
-               pyro -root                                              \n\
-               helix -root                                             \n\
-               pedal -root                                             \n\
-               rorschach -root -offset 7                               \n\
-               hopalong -root                                          \n\
-               greynetic -root                                         \n\
-               xroger -root                                            \n\
-               imsmap -root                                            \n\
-               slidescreen -root                                       \n\
-               decayscreen -root                                       \n\
-               jigsaw -root                                            \n\
-               blitspin -root -grab                                    \n\
-               slip -root                                              \n\
-               distort -root                                           \n\
-               spotlight -root                                         \n\
-               hypercube -root                                         \n\
-               halo -root                                              \n\
-               maze -root                                              \n\
-               noseguy -root                                           \n\
-               flame -root                                             \n\
-               lmorph -root                                            \n\
-               deco -root                                              \n\
-               moire -root                                             \n\
-               moire2 -root                                            \n\
-               lightning -root                                         \n\
-               strange -root                                           \n\
-               spiral -root                                            \n\
-               laser -root                                             \n\
-               grav -root                                              \n\
-               grav -root -trail -decay                                \n\
-               drift -root                                             \n\
-               ifs -root                                               \n\
-               xjulia -root                                            \n\
-               penrose -root                                           \n\
-               sierpinski -root                                        \n\
-               braid -root                                             \n\
-               galaxy -root                                            \n\
-               bouboule -root                                          \n\
-               swirl -root                                             \n\
-               flag -root                                              \n\
-               sphere -root                                            \n\
-               forest -root                                            \n\
-               lisa -root                                              \n\
-               lissie -root                                            \n\
-               goop -root                                              \n\
-               starfish -root                                          \n\
-               starfish -root -blob                                    \n\
-               munch -root                                             \n\
-               fadeplot -root                                          \n\
-               xcoral -root                                            \n\
-               mountain -root                                          \n\
-               triangle -root                                          \n\
-               worm -root                                              \n\
-               rotor -root                                             \n\
-               ant -root                                               \n\
-               demon -root                                             \n\
-               loop -root                                              \n\
-               vines -root                                             \n\
-               kaleidescope -root                                      \n\
-               xjack -root                                             \n\
-  -            xlyap -root -randomize                                  \n\
-               cynosure -root                                          \n\
-               flow -root                                              \n\
-               epicycle -root                                          \n\
-               interference -root                                      \n\
-               truchet -root -randomize                                \n\
-               bsod -root                                              \n\
-               crystal -root                                           \n\
-               discrete -root                                          \n\
-               kumppa -root                                            \n\
-               rd-bomb -root                                           \n\
-               rd-bomb -root -speed 1 -size 0.1                        \n\
-               sonar -root                                             \n\
-               t3d -root                                               \n\
-               penetrate -root                                         \n\
-               deluxe -root                                            \n\
-               compass -root                                           \n\
-               squiral -root                                           \n\
-               xflame -root                                            \n\
-               wander -root                                            \n\
-               wander -root -advance 0 -size 10 -circles True            \
-                 -length 10000 -reset 100000                           \n\
-               critical -root                                          \n\
-               phosphor -root                                          \n\
-               xmatrix -root                                           \n\
-               petri -root -size 1 -count 20                           \n\
-               petri -root -minlifespeed 0.02 -maxlifespeed 0.03         \
-                  -minlifespan 1 -maxlifespan 1 -instantdeathchan 0      \
-                  -minorchan 0 -anychan 0.3                            \n\
-               shadebobs -root                                         \n\
-    default-n:  webcollage -root                                       \n\
- -  default-n  webcollage -root -filter 'vidwhacker -stdin -stdout'    \n\
- -  default-n  vidwhacker -root                                        \n\
-                                                                         \
-        mono:  rocks -root                                             \n\
-       color:  rocks -root -fg darksalmon                              \n\
-                                                                         \
-        mono:  qix -root -linear -count 5 -size 200 -spread 30           \
-                       -segments 75 -solid -xor                        \n\
-                                                                         \
-       color:  attraction -root -mode polygons                         \n\
-       color:  attraction -root -mode filled-splines -segments 0       \n\
-       color:  attraction -root -glow -points 10                       \n\
-       color:  bubbles -root                                           \n\
-                                                                         \
-          GL:  gears -root                                             \n\
-          GL:  superquadrics -root                                     \n\
-          GL:  morph3d -root                                           \n\
-          GL:  cage -root                                              \n\
-          GL:  moebius -root                                           \n\
-          GL:  stairs -root                                            \n\
-          GL:  pipes -root                                             \n\
-          GL:  sproingies -root                                        \n\
-          GL:  rubik -root                                             \n\
-          GL:  atlantis -root                                          \n\
-          GL:  lament -root                                            \n\
-          GL:  bubble3d -root                                          \n\
-          GL:  glplanet -root                                          \n\
-          GL:  pulsar -root                                            \n\
-  -       GL:  pulsar -root -texture -mipmap -texture_quality            \
-                      -light -fog                                      \n
-
-! Some other programs that you might want to track down (these work as
-! XScreenSaver helpers, but are not distributed with it):
-!
-!              xdaliclock -root -builtin2                              \n\
-!              xswarm -r 2>&-                                          \n\
-!              xwave -root                                             \n\
-!              xbouncebits ...                                         \n\
-!              ico -r -faces -sleep 1 -obj ico                         \n\
-!              xsplinefun                                              \n\
-!              xmountains -b -M                                        \n\
-!      color:  xfishtank -c black -d -r 2                              \n\
-!
-! xtacy is ok, but it only works on the default visual.  We can satisfy
-! that constraint like so:
-!
-!     default: xtacy -root -delay 100 -funky -number 3                 \n\
-!     default: xtacy -root -delay 100 -gravity                         \n\
-!     default: xtacy -root -delay 100 -mixer                           \n\
-!     default: xtacy -root -delay 100 -taffy -pal 4                    \n\
-! 
-! To display a randomized slideshow of images, you can do something like this:
-!
-!     default-n:  xv -root -rmode 5 -random -viewonly -wloop              \
-!                    -wait 30 $HOME/bitmaps/*.jpg                       \n\
-!
-! Note that we've used "default-n" as the visual name, rather than just
-! "default": this means "default visual, no install", that is, it's like
-! specifying the command-line arguments "-visual default -no-install".
-! This is necessary because, when XV is running in "-root" mode, it always
-! assumes that the default visual and colormap are being used, rather than 
-! examining the window it is drawing on to see what visual and colormap it
-! has.  If we didn't force the default visual to be used, xv would get an
-! X error.  If we didn't force the default colormap to be installed, the
-! colors would be all wrong.  "default-i" may also be used as a visual name
-! (meaning, "-visual default -install") but you probably won't ever need
-! to use that.
-!
-! XEarth is nice, too:
-!
-!     default-n: xearth -nostars -wait 0 -timewarp 400 -pos sunrel/38/-30
-!
-!
-! Some of the GL demos that SGI ships work with XScreenSaver; most don't.
-! XScreenSaver includes a program (not built or installed by default)
-! called "xscreensaver-sgigl".  To use the SGI demos with XScreenSaver,
-! build that program, and use it to launch the SGI demos.  For example,
-! on Irix 6.2, you can do this:
-!
-!     xscreensaver-sgigl /usr/demos/bin/ep -S
-!     xscreensaver-sgigl /usr/demos/bin/bongo
-!
-! On Irix 6.3, things have moved, so you need to do it like this:
-!
-!     xscreensaver-sgigl /usr/sbin/ep -S
-!
-! You can also use the "ant" demo, but first you need to wrap a shell script
-! around it that cds to its home directory, so that it can find its files;
-! and also pass it the -S argument, to prevent it from forking.
-!
-!
-! Also, since these actually end up mapping their own windows instead of
-! drawing on the XScreenSaver-provided root, when they are being run from
-! demo-mode, you can't pop up the demo-mode dialog just by clicking the
-! mouse: you must first type ESC to make the SGI programs exit.  This sucks.
-! Things should work properly when they are being run by xscreensaver in
-! non-demo-mode, however.
-!
-! Basically, the SGI demo writers went out of their way to make my life hell.
-
-
-
-!=============================================================================
-!
-!      You probably don't want to change anything after this point.
-!
-!=============================================================================
-
-
-XScreenSaver.pointerPollTime:          5
-XScreenSaver.initialDelay:             0
-XScreenSaver.windowCreationTimeout:    30
-XScreenSaver.bourneShell:              /bin/sh
-
-
-! Resources for the password and splash-screen dialog boxes of
-! the "xscreensaver" daemon.
-!
-*Dialog.headingFont:           *-times-bold-r-*-*-*-180-*-*-*-iso8859-1
-*Dialog.bodyFont:              *-helvetica-bold-r-*-*-*-140-*-*-*-iso8859-1
-*Dialog.labelFont:             *-helvetica-bold-r-*-*-*-140-*-*-*-iso8859-1
-*Dialog.buttonFont:            *-helvetica-bold-r-*-*-*-140-*-*-*-iso8859-1
-*Dialog.foreground:            #000000
-*Dialog.background:            #BFBFBF
-*Dialog.Button.foreground:     #000000
-*Dialog.Button.background:     #D0D0D0
-*Dialog.text.foreground:       #000000
-*Dialog.text.background:       #FFFFFF
-*Dialog.logo.foreground:       #FF0000
-*Dialog.logo.background:       #FFFFFF
-*Dialog.topShadowColor:                #E7E7E7
-*Dialog.bottomShadowColor:     #737373
-*Dialog.logo.width:            200
-*Dialog.logo.height:           200
-*Dialog.internalBorderWidth:   30
-*Dialog.borderWidth:           1
-*Dialog.shadowThickness:       4
-
-*passwd.heading.label:         XScreenSaver %s
-*passwd.body.label:            This display is locked.
-*passwd.user.label:            User:
-*passwd.passwd.label:          Password:
-*passwd.passwdFont:            *-courier-medium-r-*-*-*-140-*-*-*-iso8859-1
-*passwd.thermometer.width:     8
-
-*splash.heading.label:         XScreenSaver %s
-*splash.body.label:            Copyright Â© 1991-1999 by
-*splash.body2.label:           Jamie Zawinski <jwz@jwz.org>
-*splash.demo.label:            Demo
-*splash.prefs.label:           Prefs
-*splash.help.label:            Help
-
-
-! Resources for the Motif dialog boxes of the "xscreensaver-demo" program.
-! 
-*fontList:                       *-helvetica-medium-r-*-*-*-120-*-*-*-iso8859-1
-*demoDialog*label1.fontList:     *-helvetica-medium-r-*-*-*-140-*-*-*-iso8859-1
-*XmTextField.fontList:             *-courier-medium-r-*-*-*-120-*-*-*-iso8859-1
-*label0.fontList:                  *-helvetica-bold-r-*-*-*-140-*-*-*-iso8859-1
-XScreenSaver*XmList.fontList:      *-courier-medium-r-*-*-*-120-*-*-*-iso8859-1
-! Need to fully-qualify the preceeding in the case of of *sgiMode.
-
-*XmDialogShell*foreground:             #000000
-*XmDialogShell*background:             #E5E5E5
-*XmDialogShell*XmTextField.foreground: #000000
-*XmDialogShell*XmTextField.background: #FFFFFF
-*XmDialogShell*demoList.foreground:    #000000
-*XmDialogShell*demoList.background:    #FFFFFF
-
-*XmDialogShell.title:          XScreenSaver
-*versionWarning_popup.title:   XScreenSaver Warning
-*demoForm_popup.title:         XScreenSaver Demo
-*preferencesForm_popup.title:  XScreenSaver Preferences
-*allowShellResize:             True
-*autoUnmanage:                 False
-
-! This doesn't work.  Motif ignores it if there is a scroll-list!
-*demoDialog.maxWidth:          600
-
-*label1.labelString:           XScreenSaver %s
-*label1.label:                 XScreenSaver %s
-*label2.labelString: Copyright Â© 1991-1999 by Jamie Zawinski <jwz@jwz.org>
-*label2.label:      Copyright Â© 1991-1999 by Jamie Zawinski <jwz@jwz.org>
-*demoList.visibleItemCount:    10
-*demoList.automaticSelection:  True
-*next.labelString:             Run Next
-*prev.labelString:             Run Previous
-*edit.labelString:             Preferences
-*restart.labelString:          Reinitialize
-*done.labelString:             Quit
-
-*preferencesLabel.labelString: XScreenSaver Parameters
-
-*timeoutLabel.labelString:     Saver Timeout
-*cycleLabel.labelString:       Cycle Timeout
-*fadeSecondsLabel.labelString: Fade Duration
-*fadeTicksLabel.labelString:   Fade Ticks
-*lockLabel.labelString:                Lock Timeout
-*passwdLabel.labelString:      Password Timeout
-*preferencesForm*XmTextField.columns:  8
-
-*verboseToggle.labelString:    Verbose
-*cmapToggle.labelString:       Install Colormap
-*fadeToggle.labelString:       Fade Colormap
-*unfadeToggle.labelString:     Unfade Colormap
-*lockToggle.labelString:       Require Password
-*preferencesDone.labelString:  OK
-*preferencesCancel.labelString:        Cancel
-
-
-! Disable Motif drag-and-drop in dialog boxes.  This is kind of pathetic, but
-! in some older versions of Motif, most any attempt to drag cause immediate
-! flaming death from above.  This *should* rip the legs off that bug.
-! (But sadly, Lesstif 0.86 and earlier ignore these resources *and* have
-! buggy drag-and-drop.)
-!
-XScreenSaver*dragInitiatorProtocolStyle: DRAG_NONE
-XScreenSaver*dragReceiverProtocolStyle:  DRAG_NONE
-
-
-
-! Resources for the Athena dialog boxes of the "xscreensaver-demo" program.
-! 
-*demo_dialog.title:            XScreenSaver Demo
-*preferences_dialog.title:     XScreenSaver Preferences
-*warning_dialog.title:         XScreenSaver Warning
-
-! For some reason, it doesn't size correctly by itself.
-*demo_dialog.geometry:         =640x400
-
-*demo_dialog*font:             *-helvetica-bold-r-*-*-*-120-*-*-*-iso8859-1
-*preferences_dialog*font:      *-helvetica-bold-r-*-*-*-120-*-*-*-iso8859-1
-*demo_dialog*label1.font:      *-helvetica-bold-r-*-*-*-140-*-*-*-iso8859-1
-*preferences_dialog*label1.font:*-helvetica-bold-r-*-*-*-140-*-*-*-iso8859-1
-XScreenSaver*warning_dialog*label0.font:       \
-                               *-helvetica-bold-r-*-*-*-140-*-*-*-iso8859-1
-XScreenSaver*warning_dialog*Label.font:        \
-                               *-helvetica-bold-r-*-*-*-120-*-*-*-iso8859-1
-XScreenSaver*warning_dialog*Command.font: \
-                               *-helvetica-bold-r-*-*-*-140-*-*-*-iso8859-1
-XScreenSaver.demo_dialog*List.font:    \
-                               *-courier-medium-r-*-*-*-120-*-*-*-iso8859-1
-XScreenSaver.demo_dialog*Text*font:    \
-                               *-courier-medium-r-*-*-*-120-*-*-*-iso8859-1
-
-XScreenSaver.demo_dialog*foreground:                   #000000
-XScreenSaver.demo_dialog*background:                   #E5E5E5
-XScreenSaver.demo_dialog*List.background:              #FFFFFF
-XScreenSaver.demo_dialog*Scrollbar.background:         #D9D9D9
-XScreenSaver.demo_dialog*Command.background:           #D9D9D9
-XScreenSaver.demo_dialog*Text*background:              #FFFFFF
-
-XScreenSaver.preferences_dialog*foreground:            #000000
-XScreenSaver.preferences_dialog*background:            #E5E5E5
-XScreenSaver.preferences_dialog*Command.background:    #D9D9D9
-XScreenSaver.preferences_dialog*Toggle.background:     #D9D9D9
-XScreenSaver.preferences_dialog*Text*background:       #FFFFFF
-
-XScreenSaver.warning_dialog*foreground:                        #000000
-XScreenSaver.warning_dialog*background:                        #E5E5E5
-XScreenSaver.warning_dialog*Command.background:                #D9D9D9
-
-*preferences_dialog*Dialog.value.translations: #override\n\
-       <Key>Return: beginning-of-line()\n
-
-*demo_dialog*viewport.height:                  200
-*Form.borderWidth:                             0
-*Box.borderWidth:                              0
-*Label.borderWidth:                            0
-*preferences_dialog*Dialog.borderWidth:                0
-
-*demo_dialog*run.label:                                Run
-*demo_dialog*next.label:                       Run Next
-*demo_dialog*prev.label:                       Run Previous
-*demo_dialog*edit.label:                       Preferences
-*demo_dialog*restart.label:                    Reinitialize
-*demo_dialog*done.label:                       Quit
-XScreenSaver.demo_dialog*Command.internalWidth:  10
-XScreenSaver.demo_dialog*Command.internalHeight: 4
-
-*preferences_dialog*timeout.label:             Saver Timeout:
-*preferences_dialog*cycle.label:               Cycle Timeout:
-*preferences_dialog*fade.label:                        Fade Duration:
-*preferences_dialog*ticks.label:               Fade Ticks:
-*preferences_dialog*lockTime.label:            Lock Timeout:
-*preferences_dialog*passwdTime.label:          Password Timeout:
-XScreenSaver.preferences_dialog*Command.internalWidth:  10
-XScreenSaver.preferences_dialog*Command.internalHeight: 4
-
-*preferences_dialog*label1.label:              XScreenSaver Parameters
-*preferences_dialog*buttonbox.verbose.label:   Verbose
-*preferences_dialog*buttonbox.cmap.label:      Install Colormap
-*preferences_dialog*buttonbox.fade.label:      Fade Colormap
-*preferences_dialog*buttonbox.unfade.label:    Unfade Colormap
-*preferences_dialog*buttonbox.lock.label:      Require Password
-*preferences_dialog*done.label:                        Ok
-*preferences_dialog*cancel.label:              Cancel
-
-*warning_dialog*ok.label:                      Ok
-
-*warning_dialog*horizDistance:                 30
-*warning_dialog*vertDistance:                  0
-
-*warning_dialog*Label.internalWidth:           1
-*warning_dialog*Label.internalHeight:          0
-
-*warning_dialog*label0.horizDistance:          80
-*warning_dialog*label0.vertDistance:           20
-
-*warning_dialog*Command.horizDistance:         160
-*warning_dialog*Command.vertDistance:          20
-*warning_dialog*Command.internalWidth:         20
-*warning_dialog*Command.internalHeight:                5
diff --git a/local/bin/ant b/local/bin/ant
deleted file mode 100755 (executable)
index 1b9c793..0000000
Binary files a/local/bin/ant and /dev/null differ
diff --git a/local/bin/atlantis b/local/bin/atlantis
deleted file mode 100755 (executable)
index 7e3d1e1..0000000
Binary files a/local/bin/atlantis and /dev/null differ
diff --git a/local/bin/attraction b/local/bin/attraction
deleted file mode 100755 (executable)
index e9afa4a..0000000
Binary files a/local/bin/attraction and /dev/null differ
diff --git a/local/bin/blitspin b/local/bin/blitspin
deleted file mode 100755 (executable)
index 3ce49f9..0000000
Binary files a/local/bin/blitspin and /dev/null differ
diff --git a/local/bin/bouboule b/local/bin/bouboule
deleted file mode 100755 (executable)
index 2b485c3..0000000
Binary files a/local/bin/bouboule and /dev/null differ
diff --git a/local/bin/braid b/local/bin/braid
deleted file mode 100755 (executable)
index 7ac67af..0000000
Binary files a/local/bin/braid and /dev/null differ
diff --git a/local/bin/bsod b/local/bin/bsod
deleted file mode 100755 (executable)
index 8d16c35..0000000
Binary files a/local/bin/bsod and /dev/null differ
diff --git a/local/bin/bubble3d b/local/bin/bubble3d
deleted file mode 100755 (executable)
index a586ef5..0000000
Binary files a/local/bin/bubble3d and /dev/null differ
diff --git a/local/bin/bubbles b/local/bin/bubbles
deleted file mode 100755 (executable)
index d1abe79..0000000
Binary files a/local/bin/bubbles and /dev/null differ
diff --git a/local/bin/cage b/local/bin/cage
deleted file mode 100755 (executable)
index ae5e861..0000000
Binary files a/local/bin/cage and /dev/null differ
diff --git a/local/bin/compass b/local/bin/compass
deleted file mode 100755 (executable)
index 252e555..0000000
Binary files a/local/bin/compass and /dev/null differ
diff --git a/local/bin/critical b/local/bin/critical
deleted file mode 100755 (executable)
index 0f85c43..0000000
Binary files a/local/bin/critical and /dev/null differ
diff --git a/local/bin/crystal b/local/bin/crystal
deleted file mode 100755 (executable)
index fa08fb0..0000000
Binary files a/local/bin/crystal and /dev/null differ
diff --git a/local/bin/cynosure b/local/bin/cynosure
deleted file mode 100755 (executable)
index 4d8821f..0000000
Binary files a/local/bin/cynosure and /dev/null differ
diff --git a/local/bin/decayscreen b/local/bin/decayscreen
deleted file mode 100755 (executable)
index 9f55935..0000000
Binary files a/local/bin/decayscreen and /dev/null differ
diff --git a/local/bin/deco b/local/bin/deco
deleted file mode 100755 (executable)
index 87df713..0000000
Binary files a/local/bin/deco and /dev/null differ
diff --git a/local/bin/deluxe b/local/bin/deluxe
deleted file mode 100755 (executable)
index 1eb5760..0000000
Binary files a/local/bin/deluxe and /dev/null differ
diff --git a/local/bin/demon b/local/bin/demon
deleted file mode 100755 (executable)
index 5daf571..0000000
Binary files a/local/bin/demon and /dev/null differ
diff --git a/local/bin/discrete b/local/bin/discrete
deleted file mode 100755 (executable)
index 4a849a1..0000000
Binary files a/local/bin/discrete and /dev/null differ
diff --git a/local/bin/distort b/local/bin/distort
deleted file mode 100755 (executable)
index 1fe3ad9..0000000
Binary files a/local/bin/distort and /dev/null differ
diff --git a/local/bin/drift b/local/bin/drift
deleted file mode 100755 (executable)
index 5ca8dd1..0000000
Binary files a/local/bin/drift and /dev/null differ
diff --git a/local/bin/epicycle b/local/bin/epicycle
deleted file mode 100755 (executable)
index a48fce9..0000000
Binary files a/local/bin/epicycle and /dev/null differ
diff --git a/local/bin/fadeplot b/local/bin/fadeplot
deleted file mode 100755 (executable)
index 54206f3..0000000
Binary files a/local/bin/fadeplot and /dev/null differ
diff --git a/local/bin/flag b/local/bin/flag
deleted file mode 100755 (executable)
index fa1aae2..0000000
Binary files a/local/bin/flag and /dev/null differ
diff --git a/local/bin/flame b/local/bin/flame
deleted file mode 100755 (executable)
index 41cf34d..0000000
Binary files a/local/bin/flame and /dev/null differ
diff --git a/local/bin/flow b/local/bin/flow
deleted file mode 100755 (executable)
index 5c982fa..0000000
Binary files a/local/bin/flow and /dev/null differ
diff --git a/local/bin/forest b/local/bin/forest
deleted file mode 100755 (executable)
index 91f2c64..0000000
Binary files a/local/bin/forest and /dev/null differ
diff --git a/local/bin/galaxy b/local/bin/galaxy
deleted file mode 100755 (executable)
index 38e8df9..0000000
Binary files a/local/bin/galaxy and /dev/null differ
diff --git a/local/bin/gears b/local/bin/gears
deleted file mode 100755 (executable)
index 4e66d1d..0000000
Binary files a/local/bin/gears and /dev/null differ
diff --git a/local/bin/glplanet b/local/bin/glplanet
deleted file mode 100755 (executable)
index e580516..0000000
Binary files a/local/bin/glplanet and /dev/null differ
diff --git a/local/bin/goop b/local/bin/goop
deleted file mode 100755 (executable)
index 9911f6d..0000000
Binary files a/local/bin/goop and /dev/null differ
diff --git a/local/bin/grav b/local/bin/grav
deleted file mode 100755 (executable)
index 39b35a8..0000000
Binary files a/local/bin/grav and /dev/null differ
diff --git a/local/bin/greynetic b/local/bin/greynetic
deleted file mode 100755 (executable)
index b28b6e4..0000000
Binary files a/local/bin/greynetic and /dev/null differ
diff --git a/local/bin/halo b/local/bin/halo
deleted file mode 100755 (executable)
index 999096f..0000000
Binary files a/local/bin/halo and /dev/null differ
diff --git a/local/bin/helix b/local/bin/helix
deleted file mode 100755 (executable)
index 2a7288d..0000000
Binary files a/local/bin/helix and /dev/null differ
diff --git a/local/bin/hopalong b/local/bin/hopalong
deleted file mode 100755 (executable)
index 13497e0..0000000
Binary files a/local/bin/hopalong and /dev/null differ
diff --git a/local/bin/hypercube b/local/bin/hypercube
deleted file mode 100755 (executable)
index f4e5752..0000000
Binary files a/local/bin/hypercube and /dev/null differ
diff --git a/local/bin/ifs b/local/bin/ifs
deleted file mode 100755 (executable)
index 4e5f4f3..0000000
Binary files a/local/bin/ifs and /dev/null differ
diff --git a/local/bin/imsmap b/local/bin/imsmap
deleted file mode 100755 (executable)
index 0ea3f75..0000000
Binary files a/local/bin/imsmap and /dev/null differ
diff --git a/local/bin/interference b/local/bin/interference
deleted file mode 100755 (executable)
index 19b5271..0000000
Binary files a/local/bin/interference and /dev/null differ
diff --git a/local/bin/jigsaw b/local/bin/jigsaw
deleted file mode 100755 (executable)
index 8b987cb..0000000
Binary files a/local/bin/jigsaw and /dev/null differ
diff --git a/local/bin/kaleidescope b/local/bin/kaleidescope
deleted file mode 100755 (executable)
index b7c21c8..0000000
Binary files a/local/bin/kaleidescope and /dev/null differ
diff --git a/local/bin/kumppa b/local/bin/kumppa
deleted file mode 100755 (executable)
index 6ab5b44..0000000
Binary files a/local/bin/kumppa and /dev/null differ
diff --git a/local/bin/lament b/local/bin/lament
deleted file mode 100755 (executable)
index e19b579..0000000
Binary files a/local/bin/lament and /dev/null differ
diff --git a/local/bin/laser b/local/bin/laser
deleted file mode 100755 (executable)
index 3278df6..0000000
Binary files a/local/bin/laser and /dev/null differ
diff --git a/local/bin/lightning b/local/bin/lightning
deleted file mode 100755 (executable)
index 106798b..0000000
Binary files a/local/bin/lightning and /dev/null differ
diff --git a/local/bin/lisa b/local/bin/lisa
deleted file mode 100755 (executable)
index a2b03df..0000000
Binary files a/local/bin/lisa and /dev/null differ
diff --git a/local/bin/lissie b/local/bin/lissie
deleted file mode 100755 (executable)
index f355e0e..0000000
Binary files a/local/bin/lissie and /dev/null differ
diff --git a/local/bin/lmorph b/local/bin/lmorph
deleted file mode 100755 (executable)
index 110b5b9..0000000
Binary files a/local/bin/lmorph and /dev/null differ
diff --git a/local/bin/loop b/local/bin/loop
deleted file mode 100755 (executable)
index 7c8f098..0000000
Binary files a/local/bin/loop and /dev/null differ
diff --git a/local/bin/maze b/local/bin/maze
deleted file mode 100755 (executable)
index 698fd5d..0000000
Binary files a/local/bin/maze and /dev/null differ
diff --git a/local/bin/moebius b/local/bin/moebius
deleted file mode 100755 (executable)
index 8c62317..0000000
Binary files a/local/bin/moebius and /dev/null differ
diff --git a/local/bin/moire b/local/bin/moire
deleted file mode 100755 (executable)
index 2f151ba..0000000
Binary files a/local/bin/moire and /dev/null differ
diff --git a/local/bin/moire2 b/local/bin/moire2
deleted file mode 100755 (executable)
index c53bc02..0000000
Binary files a/local/bin/moire2 and /dev/null differ
diff --git a/local/bin/morph3d b/local/bin/morph3d
deleted file mode 100755 (executable)
index 5efefaf..0000000
Binary files a/local/bin/morph3d and /dev/null differ
diff --git a/local/bin/mountain b/local/bin/mountain
deleted file mode 100755 (executable)
index aaa7e45..0000000
Binary files a/local/bin/mountain and /dev/null differ
diff --git a/local/bin/munch b/local/bin/munch
deleted file mode 100755 (executable)
index 33a30d5..0000000
Binary files a/local/bin/munch and /dev/null differ
diff --git a/local/bin/noseguy b/local/bin/noseguy
deleted file mode 100755 (executable)
index a5338f3..0000000
Binary files a/local/bin/noseguy and /dev/null differ
diff --git a/local/bin/pedal b/local/bin/pedal
deleted file mode 100755 (executable)
index d15b204..0000000
Binary files a/local/bin/pedal and /dev/null differ
diff --git a/local/bin/penetrate b/local/bin/penetrate
deleted file mode 100755 (executable)
index 9ebca81..0000000
Binary files a/local/bin/penetrate and /dev/null differ
diff --git a/local/bin/penrose b/local/bin/penrose
deleted file mode 100755 (executable)
index 3711512..0000000
Binary files a/local/bin/penrose and /dev/null differ
diff --git a/local/bin/petri b/local/bin/petri
deleted file mode 100755 (executable)
index 74ceb51..0000000
Binary files a/local/bin/petri and /dev/null differ
diff --git a/local/bin/phosphor b/local/bin/phosphor
deleted file mode 100755 (executable)
index 644b13a..0000000
Binary files a/local/bin/phosphor and /dev/null differ
diff --git a/local/bin/pipes b/local/bin/pipes
deleted file mode 100755 (executable)
index 3884878..0000000
Binary files a/local/bin/pipes and /dev/null differ
diff --git a/local/bin/pulsar b/local/bin/pulsar
deleted file mode 100755 (executable)
index 96df10e..0000000
Binary files a/local/bin/pulsar and /dev/null differ
diff --git a/local/bin/pyro b/local/bin/pyro
deleted file mode 100755 (executable)
index 20ae769..0000000
Binary files a/local/bin/pyro and /dev/null differ
diff --git a/local/bin/qix b/local/bin/qix
deleted file mode 100755 (executable)
index e98aca9..0000000
Binary files a/local/bin/qix and /dev/null differ
diff --git a/local/bin/rd-bomb b/local/bin/rd-bomb
deleted file mode 100755 (executable)
index c914b1e..0000000
Binary files a/local/bin/rd-bomb and /dev/null differ
diff --git a/local/bin/rocks b/local/bin/rocks
deleted file mode 100755 (executable)
index 5bb57cd..0000000
Binary files a/local/bin/rocks and /dev/null differ
diff --git a/local/bin/rorschach b/local/bin/rorschach
deleted file mode 100755 (executable)
index cca92fd..0000000
Binary files a/local/bin/rorschach and /dev/null differ
diff --git a/local/bin/rotor b/local/bin/rotor
deleted file mode 100755 (executable)
index 3ef607b..0000000
Binary files a/local/bin/rotor and /dev/null differ
diff --git a/local/bin/rubik b/local/bin/rubik
deleted file mode 100755 (executable)
index f0b13ec..0000000
Binary files a/local/bin/rubik and /dev/null differ
diff --git a/local/bin/shadebobs b/local/bin/shadebobs
deleted file mode 100755 (executable)
index f841eca..0000000
Binary files a/local/bin/shadebobs and /dev/null differ
diff --git a/local/bin/sierpinski b/local/bin/sierpinski
deleted file mode 100755 (executable)
index 95810e7..0000000
Binary files a/local/bin/sierpinski and /dev/null differ
diff --git a/local/bin/slidescreen b/local/bin/slidescreen
deleted file mode 100755 (executable)
index 6709b6a..0000000
Binary files a/local/bin/slidescreen and /dev/null differ
diff --git a/local/bin/slip b/local/bin/slip
deleted file mode 100755 (executable)
index b1dd5dc..0000000
Binary files a/local/bin/slip and /dev/null differ
diff --git a/local/bin/sonar b/local/bin/sonar
deleted file mode 100755 (executable)
index 78c55d7..0000000
Binary files a/local/bin/sonar and /dev/null differ
diff --git a/local/bin/sphere b/local/bin/sphere
deleted file mode 100755 (executable)
index 4f8ee1a..0000000
Binary files a/local/bin/sphere and /dev/null differ
diff --git a/local/bin/spiral b/local/bin/spiral
deleted file mode 100755 (executable)
index 9930610..0000000
Binary files a/local/bin/spiral and /dev/null differ
diff --git a/local/bin/spotlight b/local/bin/spotlight
deleted file mode 100755 (executable)
index fe1f7a8..0000000
Binary files a/local/bin/spotlight and /dev/null differ
diff --git a/local/bin/sproingies b/local/bin/sproingies
deleted file mode 100755 (executable)
index fefbd57..0000000
Binary files a/local/bin/sproingies and /dev/null differ
diff --git a/local/bin/squiral b/local/bin/squiral
deleted file mode 100755 (executable)
index 5d2929c..0000000
Binary files a/local/bin/squiral and /dev/null differ
diff --git a/local/bin/stairs b/local/bin/stairs
deleted file mode 100755 (executable)
index a61c303..0000000
Binary files a/local/bin/stairs and /dev/null differ
diff --git a/local/bin/starfish b/local/bin/starfish
deleted file mode 100755 (executable)
index 0ebbb39..0000000
Binary files a/local/bin/starfish and /dev/null differ
diff --git a/local/bin/strange b/local/bin/strange
deleted file mode 100755 (executable)
index 881abb1..0000000
Binary files a/local/bin/strange and /dev/null differ
diff --git a/local/bin/superquadrics b/local/bin/superquadrics
deleted file mode 100755 (executable)
index 4abd3d5..0000000
Binary files a/local/bin/superquadrics and /dev/null differ
diff --git a/local/bin/swirl b/local/bin/swirl
deleted file mode 100755 (executable)
index a7a901c..0000000
Binary files a/local/bin/swirl and /dev/null differ
diff --git a/local/bin/t3d b/local/bin/t3d
deleted file mode 100755 (executable)
index 201a584..0000000
Binary files a/local/bin/t3d and /dev/null differ
diff --git a/local/bin/triangle b/local/bin/triangle
deleted file mode 100755 (executable)
index c57364d..0000000
Binary files a/local/bin/triangle and /dev/null differ
diff --git a/local/bin/truchet b/local/bin/truchet
deleted file mode 100755 (executable)
index a2ee81a..0000000
Binary files a/local/bin/truchet and /dev/null differ
diff --git a/local/bin/vidwhacker b/local/bin/vidwhacker
deleted file mode 100755 (executable)
index b35af3a..0000000
+++ /dev/null
@@ -1,401 +0,0 @@
-#!/bin/sh
-#
-# vidwhacker, for xscreensaver.  Copyright (c) 1998, 1999 Jamie Zawinski.
-#
-# Permission to use, copy, modify, distribute, and sell this software 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.  No representations are made about the suitability of this
-# software for any purpose.  It is provided "as is" without express or 
-# implied warranty.
-#
-#
-# This script grabs a frame of video, then uses various pbm filters to
-# munge the image in random nefarious ways, then uses xv to put it on
-# the root window.  This works out really nicely if you just feed some
-# random TV station into it...
-#
-# The video grabbing part is SGI-specific -- if you want to use this on
-# another system, add a new clause to the grab() procedure.
-
-
-# Process command-line args...
-
-onroot=false
-verbose=false
-delay=3
-use_stdin=false
-use_stdout=false
-
-pid=""
-tmp=${TMPDIR:-/tmp}/vidwhacker.$$
-tmp_rgb=$tmp-00000.rgb
-tmp_ppm0=$tmp-0.ppm
-tmp_ppm1=$tmp-1.ppm
-tmp_ppm2=$tmp-2.ppm
-tmp_ppm3=$tmp-3.ppm
-tmp_ppm4=$tmp-4.ppm
-tmp_ppmS=$tmp-S.ppm
-
-
-getargs() {
-
-  while [ $# != 0 ]; do
-    case "$1" in
-    -display | -disp | -dis | -dpy | -d )
-      shift
-      DISPLAY="$1"
-      export DISPLAY
-      ;;
-    -root )
-      onroot=true
-      ;;
-    -window )
-      onroot=false
-      ;;
-    -verbose )
-      verbose=true
-      ;;
-    -stdin )
-      use_stdin=true
-      ;;
-    -stdout )
-      use_stdout=true
-      ;;
-    -delay)
-      shift
-      delay="$1"
-      ;;
-    * )
-      echo "VidWhacker, Copyright (c) 1999 Jamie Zawinski <jwz@jwz.org>" >&2
-      echo "            http://www.jwz.org/xscreensaver/" >&2
-      echo "" >&2
-      echo "usage: $0 [-display dpy] [-verbose] [-root | -window]" >&2
-      echo "                  [-stdin] [-stdout] [-delay secs]" >&2
-      exit 1
-      ;;
-    esac
-    shift
-  done
-
-  xvargs="-quick24"
-
-  if [ "$onroot" = true ]; then
-    xvargs="$xvargs -root -rmode 5 -noresetroot -rfg black -rbg black -viewonly"
-  else
-    xvargs="$xvargs -geom +0+0"
-  fi
-
-
-  screen_width=''
-  if [ "$use_stdout" = false ]; then
-    screen_width=`xdpyinfo 2>/dev/null | 
-        sed -n 's/.* dimensions: *\([0-9]*\).*/\1/p'`
-    if [ "$screen_width" = "" ]; then
-      screen_width=800
-    fi
-  fi
-}
-
-
-clean() {
-  rm -f $tmp_rgb $tmp_ppm1 $tmp_ppm2 $tmp_ppm3 $tmp_ppm4
-}
-
-clean2() {
-  clean
-  rm -f $tmp_ppm0 $tmp_ppmS
-}
-
-
-# Grab a frame of video.  leaves it in $tmp_ppm1.
-#
-grab() {
-  uname=`uname`
-  if [ $uname = IRIX ]; then
-    #
-    # SGI's "vidtomem" returns an SGI RGB image of the default video input,
-    # and has stupid non-overridable ouput-file-naming conventions.  So, let 
-    # it write its file; and then convert it to a pgm.
-    #
-    
-    vidtomem -f $tmp
-    sgitopnm $tmp_rgb > $tmp_ppm1
-
-    # Cut off the close-captioning blips in the NTSC overscan region.  YMMV.
-    #  | pnmcut 12 7 695 477 
-
-  elif [ $uname = Linux ]; then
-
-    # Marcus Herbert says the following works with his Connectix Qcam.
-    # Don't have qcam?  Well, do something else then...  and send me a patch.
-
-    qcam > $tmp_ppm1
-
-    # Friedrich Delgado Friedrichs says the following works with a
-    # Brooktree 848 or 878 tuner card:
-    #
-    #   bttvgrab -Q -d q -l 1 -F /dev/null -o gif -f ${tmp}.gif -N PAL
-    #   giftopnm ${tmp}.gif > $tmp_ppm1
-    #   rm ${tmp}.gif
-    #
-    # He notes that you might need to run a TV application (e.g., xawtv)
-    # before the first time you run vidwhacker in order to initialize the
-    # tuner card and kernel modules.
-
-
-  else
-    echo "$0: don't know how to grab video on this OS." >&2
-    clean2
-    exit 1
-  fi
-}
-
-
-# Use perl to pick a random foreground/background color in pbm's syntax.
-#
-randcolor() {
-  perl -e 'srand; 
-          printf("#%02x%02x%02x-#%02x%02x%02x",
-                 int(rand()*60),
-                 int(rand()*60),
-                 int(rand()*60),
-                 120+int(rand()*135),
-                 120+int(rand()*135),
-                 120+int(rand()*135))'
-}
-
-# Frobnicate the image in some random way.
-#
-frob() {
-
-  w_h=`head -2 $tmp_ppm1 | tail -1`
-  width=`echo $w_h | awk '{print $1}'`
-  height=`echo $w_h | awk '{print $2}'`
-
-  N=`perl -e 'srand; print int(rand() * 17)'`
-
-  if [ "$verbose" = true ]; then
-    echo "mode $N..." >&2
-  fi
-
-  if   [ $N = 0 ]; then
-    ppmtopgm $tmp_ppm1 | pgmedge | pgmtoppm `randcolor` | ppmnorm
-
-  elif [ $N = 1 ]; then
-    ppmtopgm $tmp_ppm1 | 
-    pgmenhance | 
-    pgmtoppm `randcolor`
-
-  elif [ $N = 2 ]; then
-    ppmtopgm $tmp_ppm1 | pgmoil | pgmtoppm `randcolor`
-
-  elif [ $N = 3 ]; then 
-    ppmrelief $tmp_ppm1 | ppmtopgm | pgmedge | ppmrelief | ppmtopgm |
-      pgmedge | pnminvert | pgmtoppm `randcolor`
-
-  elif [ $N = 4 ]; then
-    ppmspread 71 $tmp_ppm1 > $tmp_ppm2
-    pnmarith -add $tmp_ppm1 $tmp_ppm2
-
-  elif [ $N = 5 ]; then
-    pnmflip -lr $tmp_ppm1 > $tmp_ppm2
-    pnmarith -multiply $tmp_ppm1 $tmp_ppm2 > $tmp_ppm3
-    pnmflip -tb $tmp_ppm3 | ppmnorm > $tmp_ppm2
-    pnmarith -multiply $tmp_ppm1 $tmp_ppm2
-
-  elif [ $N = 6 ]; then
-    N2=`perl -e 'srand; print int(rand() * 3)'`
-    if [ $N2 = 0 ]; then
-      pnmflip -lr $tmp_ppm1 > $tmp_ppm2
-    elif [ $N2 = 1 ]; then
-      pnmflip -tb $tmp_ppm1 > $tmp_ppm2
-    else
-      pnmflip -lr $tmp_ppm1 > $tmp_ppm2
-      pnmflip -tb $tmp_ppm2 > $tmp_ppm3
-      cp $tmp_ppm3 $tmp_ppm2
-    fi
-
-    pnmarith -difference $tmp_ppm1 $tmp_ppm2
-
-  elif [ $N = 7 ]; then
-
-    for i in 1 2 3 ; do
-      ppmtopgm $tmp_ppm1 | pgmedge > $tmp_ppm2
-      pnmarith -difference $tmp_ppm1 $tmp_ppm2 > $tmp_ppm3
-      cp $tmp_ppm3 $tmp_ppm1
-    done
-    ppmnorm < $tmp_ppm1
-
-  elif [ $N = 8 ]; then
-    pnmflip -lr $tmp_ppm1 > $tmp_ppm2
-    pnmarith -multiply $tmp_ppm1 $tmp_ppm2 | ppmrelief | ppmnorm | pnminvert
-
-  elif [ $N = 9 ]; then
-    pnmflip -lr $tmp_ppm1 > $tmp_ppm2
-    pnmarith -subtract $tmp_ppm1 $tmp_ppm2 | ppmrelief | ppmtopgm | pgmedge
-
-  elif [ $N = 10 ]; then
-    ppmtopgm $tmp_ppm1 | pgmbentley | pgmtoppm `randcolor`
-
-  elif [ $N = 11 ]; then
-    pgmcrater -number 20000 -height $height -width $width | pgmtoppm `randcolor` > $tmp_ppm2
-    pnmarith -difference $tmp_ppm1 $tmp_ppm2 > $tmp_ppm3
-    pnmflip -tb $tmp_ppm3 | ppmnorm > $tmp_ppm2
-    pnmarith -multiply $tmp_ppm1 $tmp_ppm2
-
-  elif [ $N = 12 ]; then
-    ppmshift 30 $tmp_ppm1 | ppmtopgm | pgmoil | pgmedge |  pgmtoppm `randcolor` > $tmp_ppm2
-    pnmarith -difference $tmp_ppm1 $tmp_ppm2 
-
- elif [ $N = 13 ]; then
-    ppmpat -madras $width $height | pnmdepth 255 > $tmp_ppm2
-    pnmarith -difference $tmp_ppm1 $tmp_ppm2
-  elif [ $N = 14 ]; then
-    ppmpat -tartan $width $height | pnmdepth 255 > $tmp_ppm2
-    pnmarith -difference  $tmp_ppm1 $tmp_ppm2 
-  
-  elif [ $N = 15 ]; then
-    ppmpat -camo $width $height | pnmdepth 255 | ppmshift 50 > $tmp_ppm2
-    pnmarith -multiply $tmp_ppm1 $tmp_ppm2
-  
-  elif [ $N = 16 ]; then
-    pgmnoise $width $height | pgmedge | pgmtoppm `randcolor` > $tmp_ppm2
-    pnmarith -difference $tmp_ppm1 $tmp_ppm2 | pnmdepth 255 | pnmsmooth
-
-  else cat $tmp_ppm1
-  fi
-}
-
-
-# Grab a frame and frob it.  leave it in $tmp_ppm3.
-#
-whack() {
-  clean
-
-  while [ ! -f $tmp_ppm1 ]; do
-    if [ "$use_stdin" != true ]; then
-      grab
-    else
-      cp $tmp_ppmS $tmp_ppm0
-      cp $tmp_ppm0 $tmp_ppm1
-    fi
-  done
-
-  rm -f $tmp_rgb
-
-  if [ "$screen_width" != "" ]; then
-    frob | pnmscale -width $screen_width > $tmp_ppm3
-  else
-    frob > $tmp_ppm3
-  fi
-
-  rm -f $tmp_ppm1 $tmp_ppm2
-}
-
-
-# Kill off the xv subprocess, if it's running
-#
-kill_pid() {
-  if [ "$pid" != "" ]; then
-
-    if [ "$verbose" = true ]; then
-      echo "killing pid $pid..." >&2
-    fi
-
-    # need to do this to avoid "6898 Terminated" messages!
-    # apparently one can't redirect the output of the builtin `kill' command.
-#    ( sh -c "kill $pid" ) >/dev/null 2>/dev/null </dev/null
-
-    # wtf?  that doesn't work either.  Is it writing to /dev/tty??
-    kill $pid >/dev/null 2>&1
-
-    pid=""
-  fi
-}
-
-# called when this process is signalled (for cleanup)
-#
-my_trap() {
-  if [ "$verbose" = true ]; then
-    echo "trapped signal!" >&2
-  fi
-  kill_pid
-  clean2
-  exit 1
-}
-
-main() {
-
-  getargs $@
-
-  trap my_trap 1 2 3 6 9 13 15
-
-  if [ "$use_stdin" = true ]; then
-   cat > $tmp_ppmS
-  fi
-
-  while true; do
-
-    # Loop grabbing and frobbing images.
-    #
-    # If we're running on the root, run xv in the foreground (with -exit)
-    # and then wait.
-    #
-    # If we're running in a window, spawn xv in the background; then when
-    # it's time to put up the new image, kill off the currently-running xv.
-
-    if [ "$verbose" = true ]; then
-      whack
-    else
-      whack >/dev/null 2>&1
-    fi
-
-    kill_pid
-
-    if [ ! -s $tmp_ppm3 ]; then
-      echo "$0: no image grabbed" >&2
-
-    elif [ "$use_stdout" = true ]; then
-
-      cat $tmp_ppm3
-      clean2
-      exit 0
-
-    else
-
-      pnmtosgi < $tmp_ppm3 > $tmp_ppm2
-      rm -f $tmp_ppm3
-
-      if [ -s $tmp_ppm2 ]; then
-        if [ "$verbose" = true ]; then
-          echo "launching xv $xvargs $tmp_ppm2" >&2
-         ls -lF $tmp_ppm2
-        fi
-
-       mv $tmp_ppm2 $tmp_ppm0
-        xv $xvargs $tmp_ppm0 &
-
-# this doesn't work -- leaves xv processes around, instead of stray xset
-# data.  Sigh.
-#
-#      # cat the file so that we can nuke it without racing against xv.
-#        cat $tmp_ppm2 | xv $xvargs - &
-
-        pid=$!
-      fi
-    fi
-
-    clean
-    sleep $delay
-
-  done
-  exit 1
-}
-
-main $@
-
-# to find stray xv data:
-# xwininfo -root -children|grep 'xv image comments' | awk '{print "xkill -id ", $1}'
diff --git a/local/bin/vines b/local/bin/vines
deleted file mode 100755 (executable)
index 78159ed..0000000
Binary files a/local/bin/vines and /dev/null differ
diff --git a/local/bin/wander b/local/bin/wander
deleted file mode 100755 (executable)
index 52fe3a3..0000000
Binary files a/local/bin/wander and /dev/null differ
diff --git a/local/bin/webcollage b/local/bin/webcollage
deleted file mode 100755 (executable)
index a218de1..0000000
+++ /dev/null
@@ -1,788 +0,0 @@
-#!/usr/local/bin/perl5 -w
-#
-# webcollage, for xscreensaver, Copyright (c) 1999 Jamie Zawinski <jwz@jwz.org>
-#
-# Permission to use, copy, modify, distribute, and sell this software 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.  No representations are made about the suitability of this
-# software for any purpose.  It is provided "as is" without express or 
-# implied warranty.
-#
-#
-# This program decorate the screen with random images from the web.
-
-
-use Socket;
-
-my $progname = "$0";
-my $version = "1.0";
-
-$progname =~ s@^.*/([^/]+)$@$1@;
-
-my $random_redirector = "http://random.yahoo.com/bin/ryl";
-my $image_randomizer_a = "http://image.altavista.com/";
-my $image_randomizer = $image_randomizer_a . "cgi-bin/avncgi" .
-                       "?do=3&verb=no&oshape=n&oorder=" .
-                       "&ophoto=1&oart=1&ocolor=1&obw=1" .
-                       "&stype=simage&oprem=0&query=";
-
-my $http_timeout = 30;
-my $ppm_to_root_window_cmd = "xv -root -rmode 5 -viewonly" .
-                             " +noresetroot %%PPM%% -quit";
-my $filter_cmd = undef;
-my $post_filter_cmd = undef;
-my $background = undef;
-my $no_output_p = 0;
-my $delay = 0;
-
-my $wordlist = "/usr/dict/words";
-
-if (!-r $wordlist) {
-    $wordlist = "/usr/share/lib/dict/words";    # irix
-}
-
-
-my $min_width = 50;
-my $min_height = 50;
-
-my $DEBUG = 0;
-
-
-# returns three values: the HTTP response line; the document headers;
-# and the document body.
-#
-sub get_document_1 {
-    my ( $url ) = @_;
-
-    if ( $DEBUG > 2 ) {
-       print STDERR "get_document_1 $url\n";
-    }
-
-    my($dummy, $dummy, $serverstring, $path) = split(/\//, $url, 4);
-    my($them,$port) = split(/:/, $serverstring);
-    $port = 80 unless $port;
-    my $size="";
-
-    my ($remote, $iaddr, $paddr, $proto, $line);
-    $remote = $them;
-    if ($port =~ /\D/) { $port = getservbyname($port, 'tcp') }
-    return unless $port;
-    $iaddr   = inet_aton($remote)               || return;
-    $paddr   = sockaddr_in($port, $iaddr);
-
-    @_ =
-    eval {
-        local $SIG{ALRM}  = sub {
-            if ($DEBUG > 0) {
-                print STDERR "timed out for $url\n";
-            }
-            die "alarm\n" };
-        alarm $http_timeout;
-
-        $proto   = getprotobyname('tcp');
-        socket(S, PF_INET, SOCK_STREAM, $proto)  || return;
-        connect(S, $paddr)    || return;
-
-        select(S); $| = 1; select(STDOUT);
-
-        print S ("GET /$path HTTP/1.0\n" .
-                 "Host: $them\n" .
-                 "User-Agent: $progname/$version\n" .
-                 "\n");
-
-        my $http = <S>;
-
-        my $head = "";
-        my $body = "";
-        while (<S>) {
-            $head .= $_;
-            last if m@^[\r\n]@;
-        }
-        while (<S>) {
-            $body .= $_;
-        }
-
-        close S;
-
-        return ( $http, $head, $body );
-    };
-    die if ($@ && $@ ne "alarm\n");       # propagate errors
-    if ($@) {
-        # timed out
-        return undef;
-    } else {
-        # didn't
-        alarm 0;
-        return @_;
-    }
-}
-
-
-# returns two values: the document headers; and the document body.
-# if the given URL did a redirect, returns the redirected-to document.
-#
-sub get_document {
-    my ( $url ) = @_;
-
-    do {
-       my ( $http, $head, $body ) = get_document_1 $url;
-
-       return undef if ( ! $body );
-
-       if ( $http =~ m@HTTP/[0-9.]+ 30[23]@ ) {
-           $_ = $head;
-           my ( $location ) = m@^location:[ \t]*(.*)$@im;
-           if ( $location ) {
-
-               if ( $DEBUG > 2 ) {
-                   print STDERR "redirect from $url to $location\n";
-               }
-               $url = $location;
-           } else {
-               return ( $url, $body );
-           }
-
-        } elsif ( $http =~ m@HTTP/[0-9.]+ [4-9][0-9][0-9]@ ) {
-            # http errors -- return nothing.
-            return undef;
-
-       } else {
-
-           return ( $url, $body );
-       }
-
-    } while (1);
-}
-
-
-# given a URL and the body text at that URL, selects and returns a random
-# image from it.  returns undef if no suitable images found.
-#
-sub pick_image_from_body {
-    my ( $base, $body ) = @_;
-
-    $_ = $base;
-
-    # if there's at least one slash after the host, take off the last
-    # pathname component
-    if ( m@^http://[^/]+/@io ) {
-       ( $base = $base ) =~ s@[^/]+$@@go;
-    }
-
-    # if there are no slashes after the host at all, put one on the end.
-    if ( m@^http://[^/]+$@io ) {
-       $base .= "/";
-    }
-
-    if ( $DEBUG > 2 ) {
-       print STDERR "base is $base\n";
-    }
-
-
-    $_ = $body;
-
-    # strip out newlines, compress whitespace
-    s/[\r\n\t ]+/ /go;
-
-    # nuke comments
-    s/<!--.*?-->//go;
-
-    my @urls;
-    my %unique_urls;
-
-    foreach (split(/ *</)) {
-       if ( m/^(img|a) .*(src|href) ?= ?\"? ?(.*?)[ >\"]/io ) {
-
-           my $was_inline = ( "$1" eq "a" || "$1" eq "A" );
-           my $link = $3;
-           my ( $width )  = m/width ?= ?([0-9]+)/oi;
-           my ( $height ) = m/height ?= ?([0-9]+)/oi;
-           $_ = $link;
-
-           if ( m@^/@o ) {
-               my $site;
-               ( $site = $base ) =~ s@^(http://[^/]*).*@$1@gio;
-               $_ = "$site$link";
-           } elsif ( ! m/:/ ) {
-               $_ = "$base$link";
-                s@/\./@/@;
-                while (s@/\.\./@/@g) {
-                }
-           }
-
-           # skip non-http
-           if ( ! m@^http://@io ) {
-               next;
-           }
-
-           # skip non-image
-           if ( ! m@[.](gif|jpg|jpeg|pjpg|pjpeg)@io ) {
-               next;
-           }
-
-           # skip GIF!
-#          if ( m@[.](gif)@io ) {
-##             if ( $DEBUG > 2 ) { print "skip GIF $_\n"; }
-#              next;
-#          }
-
-           # skip really short or really narrow images
-           if ( $width && $width < $min_width) {
-               if ( $DEBUG > 2 ) {
-                   print STDERR "skip narrow image $_ ($width x $height)\n";
-               }
-               next;
-           }
-
-           if ( $height && $height < $min_height) {
-               if ( $DEBUG > 2 ) {
-                   print STDERR "skip short image $_ ($width x $height)\n";
-               }
-               next;
-           }
-
-           my $url = $_;
-
-           if ( $unique_urls{$url} ) {
-               if ( $DEBUG > 2 ) { print STDERR "skip duplicate image $_\n"; }
-               next;
-           }
-
-           if ( $DEBUG > 2 ) {
-               print STDERR "got $url" . 
-                   ($width && $height ? " (${width}x${height})" : "") .
-                   ($was_inline ? " (inline)" : "") . "\n";
-           }
-
-           $urls[++$#urls] = $url;
-           $unique_urls{$url}++;
-
-           # pointers to images are preferable to inlined images
-           if ( ! $was_inline ) {
-               $urls[++$#urls] = $url;
-           }
-       }
-    }
-
-    if ( $#urls == 0 ) {
-       if ( $DEBUG > 2 ) {
-           print STDERR "no images on $base\n";
-       }
-       return undef;
-    }
-
-    return undef if ( $#urls < 1 );
-
-    # pick a random element of the table
-    my $i = ((rand() * 99999) % $#urls);
-
-    # if the page has several images on it, prefer the later ones most of
-    # the time.
-    my $fudge = 4;
-    if ($#urls > ($fudge * 2) && $i <= $fudge && ((rand() < 0.9))) {
-       if ( $DEBUG > 2 ) {
-           print STDERR "skipping first $fudge of $#urls images.\n";
-       }
-        $i += ($fudge - $i);
-    }
-
-    my $url = $urls[$i];
-
-    if ( $DEBUG > 2 ) {
-       print STDERR "picked $url\n";
-    }
-
-    return $url;
-}
-
-
-# Using the URL-randomizer, picks a random image on a random page, and
-# returns two URLs: the page containing the image, and the image.
-# Returns undef if nothing found this time.
-#
-sub pick_from_url_randomizer {
-
-    if ( $DEBUG > 2 ) {
-       print STDERR "\n\npicking from $random_redirector...\n\n";
-    }
-
-    my ( $base, $body ) = get_document $random_redirector;
-
-    return if (!$base || !$body);
-    my $img = pick_image_from_body ($base, $body);
-
-    if ($img) {
-        return ($base, $img);
-    } else {
-        return undef;
-    }
-}
-
-
-sub random_word {
-    
-    my $word = 0;
-    if (open (IN, "<$wordlist")) {
-        my $size = (stat(IN))[7];
-        my $pos = rand $size;
-        if (seek (IN, $pos, 0)) {
-            $word = <IN>;   # toss partial line
-            $word = <IN>;   # keep next line
-        }
-        close (IN);
-    }
-
-    return 0 if (!$word);
-
-    $word =~ s/^[ \t\n\r]+//;
-    $word =~ s/[ \t\n\r]+$//;
-    $word =~ s/ly$//;
-    $word =~ s/ies$/y/;
-    $word =~ s/ally$/al/;
-
-    return $word;
-}
-
-
-
-# Using the image-randomizer, picks a random image on a random page, and
-# returns two URLs: the page containing the image, and the image.
-# Returns undef if nothing found this time.
-#
-sub pick_from_image_randomizer {
-
-    my $words = random_word;
-    $words .= "%20" . random_word;
-    $words .= "%20" . random_word;
-
-    my $search_url = $image_randomizer . $words;
-
-    if ( $DEBUG > 2 ) {
-       print STDERR "\n\npicking from $search_url\n";
-    }
-
-    my ( $base, $body ) = get_document $search_url;
-
-    return if (! $body);
-
-
-    my @subpages;
-    my $skipped = 0;
-
-    $_ = $body;
-    s/(<A )/\n$1/gi;
-    foreach (split(/\n/)) {
-
-        if ( m@<A HREF=([^>]+)><IMG SRC=http://image\.altavista\.com@i ) {
-
-            my $u = $1;
-            if (m/^"(.*)"$/) { $u = $1; }
-
-            if (m@\.corbis\.com/@) {
-                $skipped = 1;
-                if ( $DEBUG > 2 ) {
-                    print STDERR "skipping corbis URL: $_\n";
-                }
-                next;
-            } elsif ( $DEBUG > 2 ) {
-                print STDERR "sub-page: $1\n";
-            }
-
-            $subpages[++$#subpages] = $u;
-        }
-    }
-
-    if ( $#subpages <= 0 ) {
-        if (!$skipped) {
-            print STDERR "Found nothing on $base\n";
-        }
-       return undef;
-    }
-
-    # pick a random element of the table
-    my $i = ((rand() * 99999) % $#subpages);
-    my $subpage = $subpages[$i];
-
-    if ( $DEBUG > 2 ) {
-       print STDERR "picked page $subpage\n";
-    }
-
-
-
-    my ( $base2, $body2 ) = get_document $subpage;
-
-    return undef if (!$base2 || !body2);
-
-    my $img = pick_image_from_body ($base2, $body2);
-
-    if ($img) {
-        return ($base2, $img);
-    } else {
-        return undef;
-    }
-}
-
-
-# Picks a random image on a random page, and returns two URLs:
-# the page containing the image, and the image. 
-# Returns undef if nothing found this time.
-# Uses the url-randomizer 1 time in 5, else the image randomizer.
-#
-sub pick_image {
-    if (int(rand 5) == 0) {
-        return pick_from_url_randomizer;
-    } else {
-        return pick_from_image_randomizer;
-    }
-}
-
-
-# returns the full path of the named program, or undef.
-#
-sub which {
-    my ($prog) = @_;
-    foreach (split (/:/, $ENV{PATH})) {
-        if (-x "$_/$prog") {
-            return $prog;
-        }
-    }
-    return undef;
-}
-
-
-
-#################################
-#
-# running as a CGI
-#
-#################################
-
-
-sub do_html_output {
-
-    $| = 1;
-
-    if ( $progname =~ m/nph-/o ) {
-       print "HTTP/1.0 200 OK\n";
-       print "Content-type: text/html\n";
-        print "\n";
-    }
-
-    print "<TITLE>random images</TITLE>\n";
-    print "<BODY BGCOLOR=\"#FFFFFF\" TEXT=\"#000000\"";
-    print "  LINK=\"#0000EE\" VLINK=\"#551A8B\" ALINK=\"#FF0000\">\n";
-    print "<H1 ALIGN=CENTER>random images</H1><P>\n";
-    print "<P><BLOCKQUOTE><BLOCKQUOTE>\n";
-    print "These images have been selected randomly from the web,\n";
-    print "by using both <A HREF=\"$random_redirector\">\n";
-    print "$random_redirector</A> and <A HREF=\"$image_randomizer_a\">\n";
-    print "$image_randomizer_a</A> as a source of URLs from which\n";
-    print "images are extracted.\n";
-    print "<P>\n";
-    print "Note: if you leave this running\n";
-    print "long enough, your browser will undoubtedly run out of memory\n";
-    print "and crash...\n";
-    print "</BLOCKQUOTE></BLOCKQUOTE><P><HR><P ALIGN=CENTER>\n";
-
-    do {
-        my ($base, $img) = pick_image;
-        if ($img) {
-            if ($DEBUG > 0) {
-                print STDERR "$img\n";
-            }
-            print "<A HREF=\"$base\">";
-            print "<IMG ALIGN=MIDDLE BORDER=0 SRC=\"$img\"></A>\n";
-        }
-
-        sleep $delay;
-
-    } while (1);
-}
-
-
-#################################
-#
-# running as an xscreensaver mode
-#
-#################################
-
-
-my $image = ($ENV{TMPDIR} ? $ENV{TMPDIR} : "/tmp") . "/webcollage." . $$;
-my $tmp   = $image . "-1";
-my $tmp2  = $image . "-2";
-my $tmp3  = $image . "-3";
-
-sub x_cleanup {
-    if ($DEBUG > 0) { print STDERR "caught signal\n"; }
-    unlink $image, $tmp, $tmp2, $tmp3;
-    exit 1;
-}
-
-my $screen_width = undef;
-my $screen_height = undef;
-
-sub do_x_output {
-
-    my $win_cmd = $ppm_to_root_window_cmd;
-    $win_cmd =~ s/^([^ \t\r\n]+).*$/$1/;
-
-    # make sure the various programs we execute exist, right up front.
-    foreach ("ppmmake", "giftopnm", "djpeg", "pnmpaste", $win_cmd) {
-        which ($_) || die "$progname: $_ not found on \$PATH.\n";
-    }
-
-    $SIG{HUP}  = \&x_cleanup;
-    $SIG{INT}  = \&x_cleanup;
-    $SIG{QUIT} = \&x_cleanup;
-    $SIG{ABRT} = \&x_cleanup;
-    $SIG{KILL} = \&x_cleanup;
-    $SIG{TERM} = \&x_cleanup;
-
-    # Need this so that if giftopnm dies, we don't die.
-    $SIG{PIPE} = 'IGNORE';
-
-    if (!$screen_width || !$screen_height) {
-        $_ = `xdpyinfo`;
-        ($screen_width, $screen_height) = m/dimensions: *([0-9]+)x([0-9]+) /;
-    }
-
-    my $bgcolor = "#000000";
-    my $bgimage = undef;
-
-    if ($background) {
-        if ($background =~ m/^\#[0-9a-f]+$/i) {
-            $bgcolor = $background;
-        } elsif (-r $background) {
-            $bgimage = $background;
-            
-        } elsif (! $background =~ m@^[-a-z0-9 ]+$@i) {
-            print STDERR "not a color or readable file: $background\n";
-            exit 1;
-        } else {
-            # default to assuming it's a color
-            $bgcolor = $background;
-        }
-    }
-
-    # Create the sold-colored base image.
-    #
-    $_ = "ppmmake '$bgcolor' $screen_width $screen_height";
-    if ($DEBUG > 1) {
-        print STDERR "creating base image: $_\n";
-    }
-    system "$_ > $image";
-
-    # Paste the default background image in the middle of it.
-    #
-    if ($bgimage) {
-        my ($iw, $ih);
-        if (open(IMG, "<$bgimage")) {
-            $_ = <IMG>;
-            $_ = <IMG>;
-            ($iw, $ih) = m/^([0-9]+) ([0-9]+)$/;
-            close (IMG);
-        }
-        my $x = int (($screen_width - $iw) / 2);
-        my $y = int (($screen_height - $ih) / 2);
-        if ($DEBUG > 1) {
-            print STDERR "pasting $bgimage into base image at $x, $y\n";
-        }
-        system "pnmpaste $bgimage $x $y $image > $tmp2 && mv $tmp2 $image";
-    }
-
-
-    do {
-        my ($base, $img) = pick_image;
-
-        my ($headers, $body);
-        if ($img) {
-            ($headers, $body) = get_document ($img);
-        }
-
-        if ($body) {
-
-            if ($DEBUG > 0) {
-                print STDERR "got $img (" . length($body) . ")\n";
-            }
-
-            my $cmd;
-            if ($img =~ m/\.gif/i) {
-                $cmd = "giftopnm";
-            } else {
-                $cmd = "djpeg";
-            }
-
-            if ($DEBUG == 0) {
-                $cmd .= " 2>/dev/null";
-            }
-
-            if (open(PIPE, "| $cmd > $tmp")) {
-                print PIPE $body;
-                close PIPE;
-
-                if ($DEBUG > 1) {
-                    print STDERR "created $tmp ($cmd)\n";
-                }
-            }
-
-            if (-s $tmp) {
-
-                if ($filter_cmd) {
-                    if ($DEBUG > 1) {
-                        print STDERR "running $filter_cmd\n";
-                    }
-                    system "($filter_cmd) < $tmp > $tmp3 && mv $tmp3 $tmp";
-                }
-
-                my ($iw, $ih);
-                if (open(IMG, "<$tmp")) {
-                    $_ = <IMG>;
-                    $_ = <IMG>;
-                    ($iw, $ih) = m/^([0-9]+) ([0-9]+)$/;
-                    close (IMG);
-                }
-
-                if ($iw && $ih) {
-
-                    if ($DEBUG > 1) {
-                        print STDERR "image size is $iw x $ih\n";
-                    }
-
-                    if ($iw > $screen_width || $ih > $screen_height) {
-                        while ($iw > $screen_width ||
-                               $ih > $screen_height) {
-                            $iw = int($iw / 2);
-                            $ih = int($ih / 2);
-                        }
-                        if ($DEBUG > 1) {
-                            print STDERR "scaling to $iw x $ih\n";
-                        }
-                        system "pnmscale -xysize $iw $ih $tmp > $tmp2" .
-                               " 2>/dev/null && mv $tmp2 $tmp";
-                    }
-
-                    my $x = int (rand() * ($screen_width - $iw));
-                    my $y = int (rand() * ($screen_height - $ih));
-
-                    if ($DEBUG > 1) {
-                        print STDERR "pasting at $x, $y in $image\n";
-                    }
-
-                    system "pnmpaste $tmp $x $y $image > $tmp2 " .
-                           "&& mv $tmp2 $image";
-
-
-                    my $target = $image;
-                    if ($post_filter_cmd) {
-                        if ($DEBUG > 1) {
-                            print STDERR "running $post_filter_cmd\n";
-                        }
-                        system "($post_filter_cmd) < $image > $tmp3";
-                        $target = $tmp3;
-                    }
-
-                    if (!$no_output_p) {
-
-                        my $tsize = (stat($target))[7];
-                        if ($tsize > 200) {
-                            $_ = $ppm_to_root_window_cmd;
-                            s/%%PPM%%/$target/;
-
-                            if ($DEBUG > 1) {
-                                print STDERR "running $_\n";
-                            }
-                            system $_;
-
-                        } elsif ($DEBUG > 1) {
-                            print STDERR "$target size is $tsize\n";
-                        }
-                    }
-                }
-            }
-            unlink $tmp, $tmp2, $tmp3;
-        }
-
-        sleep $delay;
-
-    } while (1);
-}
-
-
-#################################
-#
-# decide how to run
-#
-#################################
-
-sub main {
-    srand(time ^ $$);
-
-    my $usage ="WebCollage, Copyright (c) 1999" .
-        " Jamie Zawinski <jwz\@jwz.org>\n" .
-        "            http://www.jwz.org/xscreensaver/\n";
-
-    if ( $progname =~ m/\.cgi$/i ) {
-        $#ARGV == -1 || die "$usage\nusage: $progname (no arguments)\n";
-        do_html_output;
-
-    } else {
-        my $root_p = 0;
-
-        while ($_ = $ARGV[0]) {
-            shift @ARGV;
-            if ($_ eq "-display" ||
-                $_ eq "-displ" ||
-                $_ eq "-disp" ||
-                $_ eq "-dis" ||
-                $_ eq "-dpy" ||
-                $_ eq "-d") {
-                $ENV{DISPLAY} = shift @ARGV;
-            } elsif ($_ eq "-root") {
-                $root_p = 1;
-            } elsif ($_ eq "-no-output") {
-                $no_output_p = 1;
-            } elsif ($_ eq "-verbose") {
-                $DEBUG++;
-            } elsif (m/^-v+$/) {
-                $DEBUG += length($_)-1;
-            } elsif ($_ eq "-delay") {
-                $delay = shift @ARGV;
-            } elsif ($_ eq "-timeout") {
-                $http_timeout = shift @ARGV;
-            } elsif ($_ eq "-filter") {
-                $filter_cmd = shift @ARGV;
-            } elsif ($_ eq "-filter2") {
-                $post_filter_cmd = shift @ARGV;
-            } elsif ($_ eq "-background" || $_ eq "-bg") {
-                $background = shift @ARGV;
-            } elsif ($_ eq "-size") {
-                $_ = shift @ARGV;
-                if (m@^([0-9]+)x([0-9]+)$@) {
-                    $screen_width = $1;
-                    $screen_height = $2;
-                } else {
-                    die "$progname: argument to \"-size\" must be" .
-                        " of the form \"640x400\"\n";
-                }
-            } else {
-               die "$usage\nusage: $progname [-root]" .
-                   " [-display dpy] [-root] [-verbose] [-timeout secs]\n" .
-                   "\t\t  [-delay secs] [-filter cmd] [-filter2 cmd]\n";
-            }
-        }
-        if (!$root_p && !$no_output_p) {
-            die "$progname: the -root argument is manditory (for now.)\n";
-        }
-
-        if (!$no_output_p && !$ENV{DISPLAY}) {
-            die "$progname: \$DISPLAY is not set.\n";
-        }
-
-        do_x_output;
-    }
-}
-
-main;
-exit 0;
diff --git a/local/bin/worm b/local/bin/worm
deleted file mode 100755 (executable)
index c438bab..0000000
Binary files a/local/bin/worm and /dev/null differ
diff --git a/local/bin/xcoral b/local/bin/xcoral
deleted file mode 100755 (executable)
index fc62e52..0000000
Binary files a/local/bin/xcoral and /dev/null differ
diff --git a/local/bin/xflame b/local/bin/xflame
deleted file mode 100755 (executable)
index 4b95255..0000000
Binary files a/local/bin/xflame and /dev/null differ
diff --git a/local/bin/xjack b/local/bin/xjack
deleted file mode 100755 (executable)
index 91f79ee..0000000
Binary files a/local/bin/xjack and /dev/null differ
diff --git a/local/bin/xjulia b/local/bin/xjulia
deleted file mode 100755 (executable)
index 4dcfc00..0000000
Binary files a/local/bin/xjulia and /dev/null differ
diff --git a/local/bin/xlyap b/local/bin/xlyap
deleted file mode 100755 (executable)
index 82b994e..0000000
Binary files a/local/bin/xlyap and /dev/null differ
diff --git a/local/bin/xmatrix b/local/bin/xmatrix
deleted file mode 100755 (executable)
index 50603df..0000000
Binary files a/local/bin/xmatrix and /dev/null differ
diff --git a/local/bin/xroger b/local/bin/xroger
deleted file mode 100755 (executable)
index 30a52ca..0000000
Binary files a/local/bin/xroger and /dev/null differ
diff --git a/local/bin/xscreensaver b/local/bin/xscreensaver
deleted file mode 100755 (executable)
index 2ce5a47..0000000
Binary files a/local/bin/xscreensaver and /dev/null differ
diff --git a/local/bin/xscreensaver-command b/local/bin/xscreensaver-command
deleted file mode 100755 (executable)
index 0f3bad6..0000000
Binary files a/local/bin/xscreensaver-command and /dev/null differ
diff --git a/local/bin/xscreensaver-demo b/local/bin/xscreensaver-demo
deleted file mode 100755 (executable)
index b6c50f7..0000000
Binary files a/local/bin/xscreensaver-demo and /dev/null differ
diff --git a/local/man/cat.1/attraction.1 b/local/man/cat.1/attraction.1
deleted file mode 100644 (file)
index 629557b..0000000
+++ /dev/null
@@ -1,264 +0,0 @@
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-N\bNA\bAM\bME\bE
-       attraction - interactions of opposing forces
-
-S\bSY\bYN\bNO\bOP\bPS\bSI\bIS\bS
-       a\bat\btt\btr\bra\bac\bct\bti\bio\bon\bn   [-display  _\bh_\bo_\bs_\bt_\b:_\bd_\bi_\bs_\bp_\bl_\ba_\by_\b._\bs_\bc_\br_\be_\be_\bn]  [-foreground
-       _\bc_\bo_\bl_\bo_\br]  [-background  _\bc_\bo_\bl_\bo_\br]  [-window]  [-root]   [-mono]
-       [-install] [-visual _\bv_\bi_\bs_\bu_\ba_\bl] [-points _\bi_\bn_\bt] [-threshold _\bi_\bn_\bt]
-       [-mode balls | lines | polygons | splines | filled-splines
-       |  tails  ]  [-size  _\bi_\bn_\bt]  [-segments  _\bi_\bn_\bt] [-delay _\bu_\bs_\be_\bc_\bs]
-       [-color-shift _\bi_\bn_\bt]  [-radius  _\bi_\bn_\bt]  [-vx  _\bi_\bn_\bt]  [-vy  _\bi_\bn_\bt]
-       [-glow]  [-noglow]  [-orbit]  [-viscosity  _\bf_\bl_\bo_\ba_\bt] [-mouse]
-       [-no-mouse] [-mouse-size]
-
-D\bDE\bES\bSC\bCR\bRI\bIP\bPT\bTI\bIO\bON\bN
-       The _\ba_\bt_\bt_\br_\ba_\bc_\bt_\bi_\bo_\bn  program  has  several  visually  different
-       modes of operation, all of which are based on the interac-
-       tions of a set of control points which attract each  other
-       up  to  a  certain  distance, and then begin to repel each
-       other.  The attraction/repulsion is  proportional  to  the
-       distance between any two particles.
-
-O\bOP\bPT\bTI\bIO\bON\bNS\bS
-       _\ba_\bt_\bt_\br_\ba_\bc_\bt_\bi_\bo_\bn accepts the following options:
-
-       -\b-w\bwi\bin\bnd\bdo\bow\bw Draw  on  a  newly-created  window.   This  is the
-               default.
-
-       -\b-r\bro\boo\bot\bt   Draw on the root window.
-
-       -\b-m\bmo\bon\bno\bo   If  on  a  color  display,  pretend  we're  on   a
-               monochrome display.
-
-       -\b-i\bin\bns\bst\bta\bal\bll\bl
-               Install a private colormap for the window.
-
-       -\b-v\bvi\bis\bsu\bua\bal\bl _\bv_\bi_\bs_\bu_\ba_\bl
-               Specify which visual to use.  Legal values are the
-               name of a visual class, or the id number  (decimal
-               or hex) of a specific visual.
-
-       -\b-p\bpo\boi\bin\bnt\bts\bs i\bin\bnt\bte\beg\bge\ber\br
-               How  many  control  points should be used, or 0 to
-               select the number randomly.  Default 0.  Between 3
-               and 15 works best.
-
-       -\b-t\bth\bhr\bre\bes\bsh\bho\bol\bld\bd i\bin\bnt\bte\beg\bge\ber\br
-               The  distance  (in  pixels)  from each particle at
-               which  the  attractive  force  becomes  repulsive.
-               Default 100.
-
-       -\b-m\bmo\bod\bde\be b\bba\bal\bll\bls\bs |\b| l\bli\bin\bne\bes\bs |\b| p\bpo\bol\bly\byg\bgo\bon\bns\bs |\b| t\bta\bai\bil\bls\bs |\b| s\bsp\bpl\bli\bin\bne\bes\bs |\b| f\bfi\bil\bll\ble\bed\bd-\b-
-               s\bsp\bpl\bli\bin\bne\bes\bs
-               In _\bb_\ba_\bl_\bl_\bs mode (the default) the control points are
-               drawn as filled circles.  The larger  the  circle,
-
-
-
-X Version 11                14-Jun-97                           1
-
-
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-               the more massive the particle.
-
-               In _\bl_\bi_\bn_\be_\bs mode, the control points are connected by
-               straight lines; the effect is something like  _\bq_\bi_\bx.
-
-               In _\bp_\bo_\bl_\by_\bg_\bo_\bn_\bs mode, the control points are connected
-               by straight lines, and filled in.   This  is  most
-               interesting in color.
-
-               In  _\bs_\bp_\bl_\bi_\bn_\be_\bs  mode, a closed spline is interpolated
-               from the control points.
-
-               In _\bf_\bi_\bl_\bl_\be_\bd_\b-_\bs_\bp_\bl_\bi_\bn_\be_\bs mode, the splines are filled  in
-               instead of being outlines.  This is most interest-
-               ing in color.
-
-               In _\bt_\ba_\bi_\bl_\bs mode, the path which each  particle  fol-
-               lows  is  indicated  by  a  worm-like trail, whose
-               length is controlled by the _\bs_\be_\bg_\bm_\be_\bn_\bt_\bs parameter.
-
-       -\b-s\bsi\biz\bze\be i\bin\bnt\bte\beg\bge\ber\br
-               The size of the balls in pixels, or 0, meaning  to
-               select  the sizes randomly (the default.)  If this
-               is specified, then all  balls  will  be  the  same
-               size.   This  option  has  an effect in all modes,
-               since the ``size'' of  the  balls  controls  their
-               mass.
-
-       -\b-s\bse\beg\bgm\bme\ben\bnt\bts\bs i\bin\bnt\bte\beg\bge\ber\br
-               If  in  _\bl_\bi_\bn_\be_\bs  or  _\bp_\bo_\bl_\by_\bg_\bo_\bn_\bs mode, how many sets of
-               line segments or polygons should be drawn. Default
-               100.   This  has no effect in _\bb_\ba_\bl_\bl_\bs mode.  If _\bs_\be_\bg_\b-
-               _\bm_\be_\bn_\bt_\bs is 0, then no segments will ever  be  erased
-               (this is only useful in color.)
-
-       -\b-d\bde\bel\bla\bay\by m\bmi\bic\bcr\bro\bos\bse\bec\bco\bon\bnd\bds\bs
-               How  much  of a delay should be introduced between
-               steps of the animation.  Default 10000,  or  about
-               0.01 seconds.
-
-       -\b-c\bco\bol\blo\bor\br-\b-s\bsh\bhi\bif\bft\bt i\bin\bnt\bt
-               If  on a color display, the color of the line seg-
-               ments or polygons will  cycle  through  the  color
-               map.   This specifies how many lines will be drawn
-               before a new color is chosen.  (When a small  num-
-               ber of colors are available, increasing this value
-               will  yield  smoother  transitions.)   Default  3.
-               This has no effect in _\bb_\ba_\bl_\bl_\bs mode.
-
-       -\b-r\bra\bad\bdi\biu\bus\bs The  size  in  pixels  of  the circle on which the
-               points are initially positioned.  The  default  is
-               slightly smaller than the size of the window.
-
-       -\b-g\bgl\blo\bow\bw   This  is consulted only in _\bb_\ba_\bl_\bl_\bs mode.  If this is
-
-
-
-X Version 11                14-Jun-97                           2
-
-
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-               specified, then the saturation of  the  colors  of
-               the  points  will  vary according to their current
-               acceleration.  This has the effect that the  balls
-               flare  brighter  when  they  are  reacting to each
-               other most strongly.
-
-               In _\bg_\bl_\bo_\bw mode, all of the balls will be  drawn  the
-               same (random) color, modulo the saturation shifts.
-               In non-glow mode, the balls will each be drawn  in
-               a random color that doesn't change.
-
-       -\b-n\bno\bog\bgl\blo\bow\bw Don't do ``glowing.''  This is the default.
-
-       -\b-v\bvx\bx p\bpi\bix\bxe\bel\bls\bs
-
-       -\b-v\bvy\by p\bpi\bix\bxe\bel\bls\bs
-               Initial velocity of the balls.  This has no effect
-               in -\b-o\bor\brb\bbi\bit\bt mode.
-
-       -\b-o\bor\brb\bbi\bit\bt  Make the initial force on each ball be  tangential
-               to  the circle on which they are initially placed,
-               with the right velocity  to  hold  them  in  orbit
-               about  each other.  After a while, roundoff errors
-               will cause the orbit to decay.
-
-       -\b-v\bvm\bmu\bul\blt\bt f\bfl\blo\boa\bat\bt
-               In orbit mode, the initial velocity of  the  balls
-               is  multiplied  by this; a number less than 1 will
-               make the balls pull closer together, and a  larger
-               number  will make them move apart.  The default is
-               0.9, meaning a slight inward pull.
-
-       -\b-v\bvi\bis\bsc\bco\bos\bsi\bit\bty\by f\bfl\blo\boa\bat\bt
-               This sets the viscosity of the hypothetical  fluid
-               through which the control points move; the default
-               is 1, meaning no resistance.  Values higher than 1
-               aren't   interesting;   lower  values  cause  less
-               motion.
-
-               One interesting thing to try is
-
-                    attraction -viscosity 0.8 -points 75 \
-                      -mouse -geometry =500x500
-
-               Give it a few seconds to settle down into a stable
-               clump,  and then move the mouse through it to make
-               "waves".
-
-       -\b-m\bmo\bou\bus\bse\be  This will cause the mouse to be considered a  con-
-               trol  point;  it  will  not  be drawn, but it will
-               influence the other points, so you  can  wave  the
-               mouse and influence the images being created.
-
-
-
-
-
-X Version 11                14-Jun-97                           3
-
-
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-       -\b-n\bno\bo-\b-m\bmo\bou\bus\bse\be
-               Turns off -\b-m\bmo\bou\bus\bse\be.
-
-       -\b-m\bmo\bou\bus\bse\be-\b-s\bsi\biz\bze\be i\bin\bnt\bte\beg\bge\ber\br
-               In  -\b-m\bmo\bou\bus\bse\be  mode,  this sets the mass of the mouse
-               (analagously to the -\b-s\bsi\biz\bze\be parameter.)
-
-E\bEN\bNV\bVI\bIR\bRO\bON\bNM\bME\bEN\bNT\bT
-       D\bDI\bIS\bSP\bPL\bLA\bAY\bY to get the default host and display number.
-
-       X\bXE\bEN\bNV\bVI\bIR\bRO\bON\bNM\bME\bEN\bNT\bT
-               to get the name of a resource file that  overrides
-               the  global  resources stored in the RESOURCE_MAN-
-               AGER property.
-
-S\bSE\bEE\bE A\bAL\bLS\bSO\bO
-       X\bX(1), x\bxs\bsc\bcr\bre\bee\ben\bns\bsa\bav\bve\ber\br(1)
-
-C\bCO\bOP\bPY\bYR\bRI\bIG\bGH\bHT\bT
-       Copyright (C) 1992, 1993, 1997 by Jamie Zawinski.  Permis-
-       sion to use, copy, modify, distribute, and sell this soft-
-       ware 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.  No  representations  are  made  about  the
-       suitability  of this software for any purpose.  It is pro-
-       vided "as is" without express or implied warranty.
-
-A\bAU\bUT\bTH\bHO\bOR\bR
-       Jamie Zawinski <jwz@jwz.org>, 13-aug-92.
-
-       Viscosity and mouse support by Philip Edward Cutone,  III.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-X Version 11                14-Jun-97                           4
-
-
diff --git a/local/man/cat.1/blitspin.1 b/local/man/cat.1/blitspin.1
deleted file mode 100644 (file)
index a87f771..0000000
+++ /dev/null
@@ -1,198 +0,0 @@
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-N\bNA\bAM\bME\bE
-       blitspin - rotate a bitmap in an interesting way
-
-S\bSY\bYN\bNO\bOP\bPS\bSI\bIS\bS
-       b\bbl\bli\bit\bts\bsp\bpi\bin\bn   [-display   _\bh_\bo_\bs_\bt_\b:_\bd_\bi_\bs_\bp_\bl_\ba_\by_\b._\bs_\bc_\br_\be_\be_\bn]   [-foreground
-       _\bc_\bo_\bl_\bo_\br]  [-background  _\bc_\bo_\bl_\bo_\br]  [-window]  [-root]   [-mono]
-       [-install]  [-visual  _\bv_\bi_\bs_\bu_\ba_\bl]  [-bitmap  _\bf_\bi_\bl_\be_\bn_\ba_\bm_\be] [-delay
-       _\bu_\bs_\be_\bc_\bs] [-delay2 _\bu_\bs_\be_\bc_\bs]
-
-D\bDE\bES\bSC\bCR\bRI\bIP\bPT\bTI\bIO\bON\bN
-       The _\bb_\bl_\bi_\bt_\bs_\bp_\bi_\bn program repeatedly rotates  a  bitmap  by  90
-       degrees by using logical operations: the bitmap is divided
-       into quadrants, and the quadrants are  shifted  clockwise.
-       Then  the  same  thing  is  done  again with progressively
-       smaller quadrants, except  that  all  sub-quadrants  of  a
-       given  size  are  rotated  in  parallel.   So  this  takes
-       O\bO(\b(1\b16\b6*\b*l\blo\bog\bg2\b2(\b(N\bN)\b))\b) blits of size NxN, with the limitation  that
-       the  image must be square, and the size must be a power of
-       2.
-
-O\bOP\bPT\bTI\bIO\bON\bNS\bS
-       _\bb_\bl_\bi_\bt_\bs_\bp_\bi_\bn accepts the following options:
-
-       -\b-w\bwi\bin\bnd\bdo\bow\bw Draw on  a  newly-created  window.   This  is  the
-               default.
-
-       -\b-r\bro\boo\bot\bt   Draw on the root window.
-
-       -\b-m\bmo\bon\bno\bo   If   on  a  color  display,  pretend  we're  on  a
-               monochrome display.
-
-       -\b-i\bin\bns\bst\bta\bal\bll\bl
-               Install a private colormap for the window.
-
-       -\b-v\bvi\bis\bsu\bua\bal\bl _\bv_\bi_\bs_\bu_\ba_\bl
-               Specify which visual to use.  Legal values are the
-               name  of a visual class, or the id number (decimal
-               or hex) of a specific visual.
-
-       -\b-b\bbi\bit\btm\bma\bap\bp _\bf_\bi_\bl_\be_\bn_\ba_\bm_\be
-               The file name of a bitmap to rotate.  It need  not
-               be  square:  it will be padded with the background
-               color.  If unspecified or the string _\b(_\bd_\be_\bf_\ba_\bu_\bl_\bt_\b),  a
-               builtin bitmap is used.
-
-               If support for the _\bX_\bP_\bM library was enabled at com-
-               pile-time, the specified file may be in _\bX_\bP_\bM format
-               as well as _\bX_\bB_\bM, and thus may be a color image.
-
-               The  *\b*b\bbi\bit\btm\bma\bap\bpF\bFi\bil\ble\beP\bPa\bat\bth\bh  resource will be searched if
-               the bitmap name is not a fully-qualified pathname.
-
-       -\b-g\bgr\bra\bab\bb-\b-s\bsc\bcr\bre\bee\ben\bn
-               If  this option is specified, then the image which
-
-
-
-X Version 11                24-Nov-97                           1
-
-
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-               is spun will be grabbed from the  portion  of  the
-               screen  underlying  the  blitspin window.  (Or, it
-               may  come  from  an  external  video  source:  see
-               below.)
-
-
-       -\b-d\bde\bel\bla\bay\by _\bm_\bi_\bc_\br_\bo_\bs_\be_\bc_\bo_\bn_\bd_\bs
-               How  long  to  delay between steps of the rotation
-               process, in microseconds.  Default is 500000, one-
-               half second.
-
-
-       -\b-d\bde\bel\bla\bay\by2\b2 _\bm_\bi_\bc_\br_\bo_\bs_\be_\bc_\bo_\bn_\bd_\bs
-               How long to delay between each 90-degree rotation,
-               in microseconds.  Default is 500000, one-half sec-
-               ond.   D\bDI\bIS\bSP\bPL\bLA\bAY\bY to get the default host and display
-               number.
-
-R\bRE\bES\bSO\bOU\bUR\bRC\bCE\bES\bS
-       On some systems (currently, only SGIs), this program  can,
-       instead of grabbing a desktop image, grab a frame of video
-       from an external camera and manipulate that instead.   The
-       following resources control that.
-
-
-       g\bgr\bra\bab\bbV\bVi\bid\bde\beo\boP\bPr\bro\bob\bba\bab\bbi\bil\bli\bit\bty\by (Float)
-               What portion of the time to grab video rather than
-               a screen image, between 0.0 and 1.0.  Defaults  to
-               0.5, or half the time.
-
-       v\bvi\bid\bde\beo\boD\bDe\bev\bvi\bic\bce\be (Integer)
-               The  number  of  the default video input device to
-               check first.  If unspecified, the  default  camera
-               (from videopanel(1)) will be checked first.  After
-               that, all other available video input devices will
-               be checked in order.
-
-               The  first  one  which  produces a non-black image
-               will be used.  If all images are black, the others
-               will  be  re-checked  a few times before giving up
-               and falling back  to  simply  grabbing  a  desktop
-               image  (but note that this takes a few seconds, so
-               if you  don't  actually  have  any  video  sources
-               hooked  up,  you should consider turning off video
-               grabbing by setting g\bgr\bra\bab\bbV\bVi\bid\bde\beo\boP\bPr\bro\bob\bba\bab\bbi\bil\bli\bit\bty\by to  0.0.)
-
-       v\bvi\bid\bde\beo\boG\bGa\bai\bin\bn (Float)
-               The amount by which to brighten the grabbed image.
-               This defaults to 2.2.
-
-E\bEN\bNV\bVI\bIR\bRO\bON\bNM\bME\bEN\bNT\bT
-       X\bXE\bEN\bNV\bVI\bIR\bRO\bON\bNM\bME\bEN\bNT\bT to get the name of a resource file that over-
-       rides  the global resources stored in the RESOURCE_MANAGER
-       property.
-
-
-
-X Version 11                24-Nov-97                           2
-
-
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-S\bSE\bEE\bE A\bAL\bLS\bSO\bO
-       X\bX(1), x\bxs\bsc\bcr\bre\bee\ben\bns\bsa\bav\bve\ber\br(1)
-
-C\bCO\bOP\bPY\bYR\bRI\bIG\bGH\bHT\bT
-       Copyright (C) 1992, 1993, 1997 by Jamie Zawinski.  Permis-
-       sion to use, copy, modify, distribute, and sell this soft-
-       ware 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.  No  representations  are  made  about  the
-       suitability  of this software for any purpose.  It is pro-
-       vided "as is" without express or implied warranty.
-
-A\bAU\bUT\bTH\bHO\bOR\bR
-       Jamie Zawinski <jwz@jwz.org>, 17-aug-92.
-
-       Based on SmallTalk code which appeared in the August  1981
-       issue of Byte magazine.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-X Version 11                24-Nov-97                           3
-
-
diff --git a/local/man/cat.1/bouboule.1 b/local/man/cat.1/bouboule.1
deleted file mode 100644 (file)
index 852fcc7..0000000
+++ /dev/null
@@ -1,132 +0,0 @@
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-N\bNA\bAM\bME\bE
-       bouboule - draws spinning 3D blobs
-
-S\bSY\bYN\bNO\bOP\bPS\bSI\bIS\bS
-       b\bbo\bou\bub\bbo\bou\bul\ble\be   [-display   _\bh_\bo_\bs_\bt_\b:_\bd_\bi_\bs_\bp_\bl_\ba_\by_\b._\bs_\bc_\br_\be_\be_\bn]   [-foreground
-       _\bc_\bo_\bl_\bo_\br]  [-background  _\bc_\bo_\bl_\bo_\br]  [-window]  [-root]   [-mono]
-       [-install]  [-visual  _\bv_\bi_\bs_\bu_\ba_\bl]  [-ncolors  _\bi_\bn_\bt_\be_\bg_\be_\br] [-delay
-       _\bm_\bi_\bc_\br_\bo_\bs_\be_\bc_\bo_\bn_\bd_\bs] [-cycles _\bi_\bn_\bt_\be_\bg_\be_\br] [-count _\bi_\bn_\bt_\be_\bg_\be_\br] [-3d]
-
-
-D\bDE\bES\bSC\bCR\bRI\bIP\bPT\bTI\bIO\bON\bN
-       The _\bb_\bo_\bu_\bb_\bo_\bu_\bl_\be program draws spinning 3D blobs.
-
-O\bOP\bPT\bTI\bIO\bON\bNS\bS
-       _\bb_\bo_\bu_\bb_\bo_\bu_\bl_\be accepts the following options:
-
-       -\b-w\bwi\bin\bnd\bdo\bow\bw Draw on  a  newly-created  window.   This  is  the
-               default.
-
-       -\b-r\bro\boo\bot\bt   Draw on the root window.
-
-       -\b-m\bmo\bon\bno\bo   If   on  a  color  display,  pretend  we're  on  a
-               monochrome display.
-
-       -\b-i\bin\bns\bst\bta\bal\bll\bl
-               Install a private colormap for the window.
-
-       -\b-v\bvi\bis\bsu\bua\bal\bl _\bv_\bi_\bs_\bu_\ba_\bl
-               Specify which visual to use.  Legal values are the
-               name  of a visual class, or the id number (decimal
-               or hex) of a specific visual.
-
-       -\b-n\bnc\bco\bol\blo\bor\brs\bs _\bi_\bn_\bt_\be_\bg_\be_\br
-               How many colors  should  be  used  (if  possible).
-               Default  64.   The  colors  used cycle through the
-               hue, making N stops around the color wheel.
-
-       -\b-c\bcy\byc\bcl\ble\bes\bs _\bi_\bn_\bt_\be_\bg_\be_\br
-
-
-       -\b-c\bco\bou\bun\bnt\bt _\bi_\bn_\bt_\be_\bg_\be_\br
-
-
-       -\b-3\b3d\bd     Do red/blue 3d separations (for 3d glasses.)
-
-
-E\bEN\bNV\bVI\bIR\bRO\bON\bNM\bME\bEN\bNT\bT
-       D\bDI\bIS\bSP\bPL\bLA\bAY\bY to get the default host and display number.
-
-       X\bXE\bEN\bNV\bVI\bIR\bRO\bON\bNM\bME\bEN\bNT\bT
-               to get the name of a resource file that  overrides
-               the  global  resources stored in the RESOURCE_MAN-
-               AGER property.
-
-
-
-
-X Version 11                15-May-97                           1
-
-
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-S\bSE\bEE\bE A\bAL\bLS\bSO\bO
-       X\bX(1), x\bxs\bsc\bcr\bre\bee\ben\bns\bsa\bav\bve\ber\br(1), x\bxl\blo\boc\bck\bk(1)
-
-C\bCO\bOP\bPY\bYR\bRI\bIG\bGH\bHT\bT
-       Copyright (C) 1996 by Jeremie Petit.
-
-       Permission to use, copy, modify, and distribute this soft-
-       ware 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.
-
-
-A\bAU\bUT\bTH\bHO\bOR\bR
-       Jeremie Petit <jpetit@essi.fr>, 1996.
-
-       3D  support  by Henrik Theiling <theiling@coli-uni-sb.de>,
-       04-Sep-96.
-
-       VMS  support  by  Jouk  Jansen  <joukj@alpha.chem.uva.nl>,
-       01-Feb-96.
-
-       TrueColor  support  by David Bagley <bagleyd@bigfoot.com>,
-       01-Feb-96.
-
-       Ability to run standalone or with  _\bx_\bs_\bc_\br_\be_\be_\bn_\bs_\ba_\bv_\be_\br  added  by
-       Jamie Zawinski <jwz@jwz.org>, 15-May-97.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-X Version 11                15-May-97                           2
-
-
diff --git a/local/man/cat.1/braid.1 b/local/man/cat.1/braid.1
deleted file mode 100644 (file)
index 06d8d11..0000000
+++ /dev/null
@@ -1,132 +0,0 @@
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-N\bNA\bAM\bME\bE
-       braid - draws random color-cycling braids around a circle
-
-S\bSY\bYN\bNO\bOP\bPS\bSI\bIS\bS
-       b\bbr\bra\bai\bid\bd  [-display  _\bh_\bo_\bs_\bt_\b:_\bd_\bi_\bs_\bp_\bl_\ba_\by_\b._\bs_\bc_\br_\be_\be_\bn] [-foreground _\bc_\bo_\bl_\bo_\br]
-       [-background _\bc_\bo_\bl_\bo_\br] [-window] [-root]  [-mono]  [-install]
-       [-visual  _\bv_\bi_\bs_\bu_\ba_\bl] [-ncolors _\bi_\bn_\bt_\be_\bg_\be_\br] [-delay _\bm_\bi_\bc_\br_\bo_\bs_\be_\bc_\bo_\bn_\bd_\bs]
-       [-cycles _\bi_\bn_\bt_\be_\bg_\be_\br] [-count _\bi_\bn_\bt_\be_\bg_\be_\br]
-
-
-D\bDE\bES\bSC\bCR\bRI\bIP\bPT\bTI\bIO\bON\bN
-       The _\bb_\br_\ba_\bi_\bd program draws random color-cycling braids around
-       a circle.
-
-O\bOP\bPT\bTI\bIO\bON\bNS\bS
-       _\bb_\br_\ba_\bi_\bd accepts the following options:
-
-       -\b-w\bwi\bin\bnd\bdo\bow\bw Draw  on  a  newly-created  window.   This  is the
-               default.
-
-       -\b-r\bro\boo\bot\bt   Draw on the root window.
-
-       -\b-m\bmo\bon\bno\bo   If  on  a  color  display,  pretend  we're  on   a
-               monochrome display.
-
-       -\b-i\bin\bns\bst\bta\bal\bll\bl
-               Install a private colormap for the window.
-
-       -\b-v\bvi\bis\bsu\bua\bal\bl _\bv_\bi_\bs_\bu_\ba_\bl
-               Specify which visual to use.  Legal values are the
-               name of a visual class, or the id number  (decimal
-               or hex) of a specific visual.
-
-       -\b-n\bnc\bco\bol\blo\bor\brs\bs _\bi_\bn_\bt_\be_\bg_\be_\br
-               How  many  colors  should  be  used (if possible).
-               Default 64.  The colors  used  cycle  through  the
-               hue, making N stops around the color wheel.
-
-       -\b-c\bcy\byc\bcl\ble\bes\bs _\bi_\bn_\bt_\be_\bg_\be_\br
-
-
-       -\b-c\bco\bou\bun\bnt\bt _\bi_\bn_\bt_\be_\bg_\be_\br
-
-
-E\bEN\bNV\bVI\bIR\bRO\bON\bNM\bME\bEN\bNT\bT
-       D\bDI\bIS\bSP\bPL\bLA\bAY\bY to get the default host and display number.
-
-       X\bXE\bEN\bNV\bVI\bIR\bRO\bON\bNM\bME\bEN\bNT\bT
-               to  get the name of a resource file that overrides
-               the global resources stored in  the  RESOURCE_MAN-
-               AGER property.
-
-S\bSE\bEE\bE A\bAL\bLS\bSO\bO
-       X\bX(1), x\bxs\bsc\bcr\bre\bee\ben\bns\bsa\bav\bve\ber\br(1), x\bxl\blo\boc\bck\bk(1)
-
-
-
-X Version 11                10-May-97                           1
-
-
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-C\bCO\bOP\bPY\bYR\bRI\bIG\bGH\bHT\bT
-       Copyright (C) 1995 by John Neil.
-
-       Permission to use, copy, modify, and distribute this soft-
-       ware 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.
-
-A\bAU\bUT\bTH\bHO\bOR\bR
-       John Neil <neil@math.idbsu.edu>, 29-Aug-95.
-
-       Ability to run standalone or with  _\bx_\bs_\bc_\br_\be_\be_\bn_\bs_\ba_\bv_\be_\br  added  by
-       Jamie Zawinski <jwz@jwz.org>, 10-May-97.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-X Version 11                10-May-97                           2
-
-
diff --git a/local/man/cat.1/bsod.1 b/local/man/cat.1/bsod.1
deleted file mode 100644 (file)
index 52d9d20..0000000
+++ /dev/null
@@ -1,198 +0,0 @@
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-N\bNA\bAM\bME\bE
-       bsod - Blue Screen of Death emulator
-
-S\bSY\bYN\bNO\bOP\bPS\bSI\bIS\bS
-       b\bbs\bso\bod\bd  [-display  _\bh_\bo_\bs_\bt_\b:_\bd_\bi_\bs_\bp_\bl_\ba_\by_\b._\bs_\bc_\br_\be_\be_\bn]  [-foreground _\bc_\bo_\bl_\bo_\br]
-       [-background _\bc_\bo_\bl_\bo_\br] [-window] [-root]  [-mono]  [-install]
-       [-visual _\bv_\bi_\bs_\bu_\ba_\bl] [-delay _\bs_\be_\bc_\bo_\bn_\bd_\bs]
-
-D\bDE\bES\bSC\bCR\bRI\bIP\bPT\bTI\bIO\bON\bN
-       The _\bb_\bs_\bo_\bd program is the finest in personal computer emula-
-       tion.
-
-       _\bb_\bs_\bo_\bd steps through a set of screens, each one a recreation
-       of  a different failure mode of an operating system.  Sys-
-       tems depicted include Microsoft's Windows 95  and  Windows
-       NT, Commodore-Amiga's AmigaDOS 1.3, SPARC Linux, SCO UNIX,
-       the Apple Macintosh (both the  MacsBug  debugger  and  the
-       rarer "Sad Mac"), and the Atari ST.
-
-
-O\bOP\bPT\bTI\bIO\bON\bNS\bS
-       _\bb_\bs_\bo_\bd accepts the following options:
-
-       -\b-w\bwi\bin\bnd\bdo\bow\bw Draw  on  a  newly-created  window.   This  is the
-               default.
-
-       -\b-r\bro\boo\bot\bt   Draw on the root window.
-
-       -\b-m\bmo\bon\bno\bo   If  on  a  color  display,  pretend  we're  on   a
-               monochrome display.
-
-       -\b-i\bin\bns\bst\bta\bal\bll\bl
-               Install a private colormap for the window.
-
-       -\b-v\bvi\bis\bsu\bua\bal\bl _\bv_\bi_\bs_\bu_\ba_\bl
-               Specify which visual to use.  Legal values are the
-               name of a visual class, or the id number  (decimal
-               or hex) of a specific visual.
-
-       -\b-d\bde\bel\bla\bay\by _\bd_\be_\bl_\ba_\by
-               The   delay   between  displaying  one  crash  and
-               another.
-
-E\bEN\bNV\bVI\bIR\bRO\bON\bNM\bME\bEN\bNT\bT
-       D\bDI\bIS\bSP\bPL\bLA\bAY\bY to get the default host and display number.
-
-       X\bXE\bEN\bNV\bVI\bIR\bRO\bON\bNM\bME\bEN\bNT\bT
-               to get the name of a resource file that  overrides
-               the  global  resources stored in the RESOURCE_MAN-
-               AGER property.
-
-X\bX R\bRE\bES\bSO\bOU\bUR\bRC\bCE\bES\bS
-       Notable X resources supported include the following, which
-       control  which  hacks  are  displayed  and  which  aren't.
-
-
-
-X Version 11                28-Oct-98                           1
-
-
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-       d\bdo\boW\bWi\bin\bnd\bdo\bow\bws\bs,  d\bdo\boN\bNT\bT,  d\bdo\boA\bAm\bmi\big\bga\ba,   d\bdo\boM\bMa\bac\bc,   d\bdo\boM\bMa\bac\bcs\bsB\bBu\bug\bg,   d\bdo\boS\bSC\bCO\bO,
-       d\bdo\boA\bAt\bta\bar\bri\bi,  and  d\bdo\boS\bSp\bpa\bar\brc\bcL\bLi\bin\bnu\bux\bx.   Each  of these is a Boolean
-       resource, they all default to  true,  except  for  doSpar-
-       cLinux  and  doAtari,  which  are  turned  off by default,
-       because they're really not all  that  interesting  looking
-       unless  you're  a fan of those systems.  There aren't com-
-       mand-line options for these, so  to  change  them,  you'll
-       need  to  add  entries to your .Xdefaults file, or use the
-       -xrm option.  For example, to tell bsod not to show the NT
-       crash:
-
-            bsod -xrm '*doNT: false'
-
-
-B\bBU\bUG\bGS\bS
-       Unlike the systems that the images are borrowed from, _\bb_\bs_\bo_\bd
-       does not require a reboot after running.
-
-       _\bb_\bs_\bo_\bd should also emulate more systems,  but  systems  with
-       interesting  crash graphics are not as common as one might
-       hope.
-
-       One I'd really like to see is a Unix system getting a ker-
-       nel panic, rebooting, and running f\bfs\bsc\bck\bk(8).
-
-S\bSE\bEE\bE A\bAL\bLS\bSO\bO
-       X\bX(1),      x\bxs\bsc\bcr\bre\bee\ben\bns\bsa\bav\bve\ber\br(1),     h\bht\btt\btp\bp:\b:/\b//\b/w\bww\bww\bw.\b.m\bmi\bic\bcr\bro\bos\bso\bof\bft\bt.\b.c\bco\bom\bm/\b/,
-       h\bht\btt\btp\bp:\b:/\b//\b/w\bww\bww\bw.\b.a\bap\bpp\bpl\ble\be.\b.c\bco\bom\bm/\b/,      and       h\bht\btt\btp\bp:\b:/\b//\b/w\bww\bww\bw.\b.s\bsc\bco\bo.\b.c\bco\bom\bm/\b/,
-       h\bht\btt\btp\bp:\b:/\b//\b/w\bww\bww\bw.\b.k\bke\ber\brn\bne\bel\bl.\b.o\bor\brg\bg/\b/, and h\bht\btt\btp\bp:\b:/\b//\b/w\bww\bww\bw.\b.a\bam\bmi\big\bga\ba.\b.d\bde\be/\b/.
-
-T\bTR\bRA\bAD\bDE\bEM\bMA\bAR\bRK\bKS\bS
-       Microsoft  Windows,  Microsoft  Windows  95, and Microsoft
-       Windows NT are all registered trademarks of Microsoft Cor-
-       poration.   Apple  Macintosh  is a registered trademark of
-       Apple Computer.  Amiga is a registered trademark of  Amiga
-       International,  Inc.   Atari  ST  is probably a trademark,
-       too, but it's hard to tell who owns it. Linux is a  regis-
-       tered trademark of Linus Torvalds, but it isn't his fault.
-
-C\bCO\bOP\bPY\bYR\bRI\bIG\bGH\bHT\bT
-       Copyright (C) 1998 by Jamie Zawinski.  Permission to  use,
-       copy,  modify,  distribute, and sell this software 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.  No
-       representations are made about  the  suitability  of  this
-       software  for any purpose.  It is provided "as is" without
-       express or implied warranty.  No animals were harmed  dur-
-       ing  the  testing  of  these  simulations.  Always mount a
-       scratch monkey.
-
-A\bAU\bUT\bTH\bHO\bOR\bR
-       Concept cribbed  from  Stephen  Martin  <smartin@mks.com>.
-
-
-
-X Version 11                28-Oct-98                           2
-
-
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-       This version is by Jamie Zawinski <jwz@jwz.org>.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-X Version 11                28-Oct-98                           3
-
-
diff --git a/local/man/cat.1/bubbles.1 b/local/man/cat.1/bubbles.1
deleted file mode 100644 (file)
index 27e7ed8..0000000
+++ /dev/null
@@ -1,198 +0,0 @@
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-N\bNA\bAM\bME\bE
-       bubbles - frying pan / soft drink simulation
-
-S\bSY\bYN\bNO\bOP\bPS\bSI\bIS\bS
-       b\bbu\bub\bbb\bbl\ble\bes\bs [-display _\bh_\bo_\bs_\bt_\b:_\bd_\bi_\bs_\bp_\bl_\ba_\by_\b._\bs_\bc_\br_\be_\be_\bn] [-foreground _\bc_\bo_\bl_\bo_\br]
-       [-background _\bc_\bo_\bl_\bo_\br] [-window] [-root]  [-mono]  [-install]
-       [-visual  _\bv_\bi_\bs_\bu_\ba_\bl]  [-simple]  [-broken] [-3D] [-file file-
-       name] [-directory directoryname]
-
-D\bDE\bES\bSC\bCR\bRI\bIP\bPT\bTI\bIO\bON\bN
-       _\bB_\bu_\bb_\bb_\bl_\be_\bs sprays lots of little random bubbles all over  the
-       window which then grow until they reach their maximum size
-       and go pop.  The inspiration for this was watching  little
-       globules  of oil on the bottom of a frying pan and it also
-       looks a little like bubbles  in  fizzy  soft  drink.   The
-       default  mode  uses  fancy ray-traced bubbles but there is
-       also a mode which just draws circles in case  the  default
-       mode is too taxing on your hardware.
-
-O\bOP\bPT\bTI\bIO\bON\bNS\bS
-       Depending on how your _\bb_\bu_\bb_\bb_\bl_\be_\bs was compiled, it accepts the
-       following options:
-
-       -\b-f\bfo\bor\bre\beg\bgr\bro\bou\bun\bnd\bd
-               Colour of circles if _\b-_\bs_\bi_\bm_\bp_\bl_\be mode is selected.
-
-       -\b-b\bba\bac\bck\bkg\bgr\bro\bou\bun\bnd\bd
-               Colour of window background.
-
-       -\b-w\bwi\bin\bnd\bdo\bow\bw Draw on  a  newly-created  window.   This  is  the
-               default.
-
-       -\b-r\bro\boo\bot\bt   Draw on the root window.
-
-       -\b-m\bmo\bon\bno\bo   If   on  a  color  display,  pretend  we're  on  a
-               monochrome display.
-
-       -\b-i\bin\bns\bst\bta\bal\bll\bl
-               Install a private colormap for the window.
-
-       -\b-v\bvi\bis\bsu\bua\bal\bl _\bv_\bi_\bs_\bu_\ba_\bl
-               Specify which visual to use.  Legal values are the
-               name  of a visual class, or the id number (decimal
-               or hex) of a specific visual.
-
-       -\b-d\bde\bel\bla\bay\by m\bmi\bic\bcr\bro\bos\bse\bec\bco\bon\bnd\bds\bs
-               How much of a delay should be  introduced  between
-               steps  of  the  animation.   Default 1, or about 1
-               microsecond.  Actually, this is the delay  between
-               each  group  of  15 new bubbles since such a delay
-               between each step results in a very slow animation
-               rate.
-
-
-
-
-
-X Version 11                14-Dec-95                           1
-
-
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-       -\b-n\bno\bod\bde\bel\bla\bay\by
-               Same as _\b-_\bd_\be_\bl_\ba_\by _\b0.
-
-       -\b-s\bsi\bim\bmp\bpl\ble\be Don't  use the default fancy pixmap bubbles.  Just
-               draw circles instead.  This may give more bearable
-               performance  if your hardware wasn't made for this
-               sort of thing.
-
-       -\b-b\bbr\bro\bok\bke\ben\bn Don't hide bubbles when they pop.  This was a  bug
-               during  development  but the results were actually
-               quite attractive.  (This option is only  available
-               if  you  have  the  XPM  library available and the
-               imake generated Makefile has defined HAVE_XPM).
-
-       -\b-3\b3D\bD     Normally, the simulation is done completely in two
-               dimensions.   When  a  bubble  swallows up another
-               bubble, the areas of each are  added  to  get  the
-               area of the resulting bubble.  This option changes
-               the algorithm to  instead  add  volume  (imagining
-               each to be a sphere in 3D space).  The whole thing
-               looks more realistic but I find it attracts atten-
-               tion  to the flickering of each bubble as they are
-               move and are redrawn.  Your mileage may vary.
-
-       -\b-f\bfi\bil\ble\be f\bfi\bil\ble\ben\bna\bam\bme\be
-               Use the pixmap  definitions  in  the  given  file,
-               instead  of  the  default (if one is compiled in).
-               This is ignored if _\b-_\bs_\bi_\bm_\bp_\bl_\be is specified.   If  the
-               file is compressed (either with compress or gzip),
-               it is decompressed before use.  (This option  only
-               works  if  you  have XPM compiled into your binary
-               and you have compiled with BUBBLES_IO set in  bub-
-               bles.h.  This is n\bno\bot\bt the default).
-
-       -\b-d\bdi\bir\bre\bec\bct\bto\bor\bry\by d\bdi\bir\bre\bec\bct\bto\bor\bry\byn\bna\bam\bme\be
-               Similar to _\b-_\bf_\bi_\bl_\be except the file is taken randomly
-               from the  contents  of  the  specified  directory.
-               (Again,  this option is only available if you have
-               XPM and BUBBLES_IO was set  when  compiling.   See
-               above).
-
-       -\b-q\bqu\bui\bie\bet\bt  Don't print messages explaining why one or several
-               command line options were ignored.  This  is  dis-
-               abled by default.
-
-N\bNO\bOT\bTE\bES\bS
-       If  you  find  the  pace of things too slow, remember that
-       there is a delay even though you specify no _\b-_\bd_\be_\bl_\ba_\by option.
-       Try using _\b-_\bn_\bo_\bd_\be_\bl_\ba_\by although beware of the effects of irri-
-       tation of other users if you're on a shared system as  you
-       bleed their CPU time away.
-
-       Some  tools  to  assist  in  creation  of  new bubbles are
-       included in the source distribution.  These can either  be
-
-
-
-X Version 11                14-Dec-95                           2
-
-
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-       loaded with the _\b-_\bf_\bi_\bl_\be or _\b-_\bd_\bi_\br_\be_\bc_\bt_\bo_\br_\by options (if available)
-       or they can be used in place of  the  distributed  default
-       bubble  (bubble_default.c).   You might like to copy these
-       scripts to a permanent location and use them.   Read  bub-
-       bles.README.
-
-       Rendered bubbles are not supported on monochrome displays.
-       I'm not convinced that small bubbles, even dithered  prop-
-       erly are going to look like anything more than a jumble of
-       random dots.
-
-B\bBU\bUG\bGS\bS
-       There is a delay before something appears  on  the  screen
-       when  using  rendered  bubbles.   The XPM library seems to
-       take a l\blo\bon\bng\bg time to make pixmaps out of  raw  data.   This
-       can be irritating on slower systems.
-
-       The  movement  of the bubbles looks jerky if an incomplete
-       set of bubbles is used.
-
-       The hide/display algorithm could  do  with  some  work  to
-       avoid flickering when _\b-_\bn_\bo_\bd_\be_\bl_\ba_\by is set.
-
-E\bEN\bNV\bVI\bIR\bRO\bON\bNM\bME\bEN\bNT\bT
-       D\bDI\bIS\bSP\bPL\bLA\bAY\bY to get the default host and display number.
-
-       X\bXE\bEN\bNV\bVI\bIR\bRO\bON\bNM\bME\bEN\bNT\bT
-               to  get the name of a resource file that overrides
-               the global resources stored in  the  RESOURCE_MAN-
-               AGER property.
-
-S\bSE\bEE\bE A\bAL\bLS\bSO\bO
-       X\bX(1), x\bxs\bsc\bcr\bre\bee\ben\bns\bsa\bav\bve\ber\br(1)
-
-D\bDI\bIS\bST\bTR\bRI\bIB\bBU\bUT\bTI\bIO\bON\bN P\bPO\bOL\bLI\bIC\bCY\bY
-       This  work  is Copyright (C) 1995, 1996 by James Macnicol.
-       Distribution is allowed under the terms of the GNU General
-       Public License.  Look at the sources for the legalese.
-
-A\bAU\bUT\bTH\bHO\bOR\bR
-       James Macnicol <J.Macnicol@student.anu.edu.au>.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-X Version 11                14-Dec-95                           3
-
-
diff --git a/local/man/cat.1/critical.1 b/local/man/cat.1/critical.1
deleted file mode 100644 (file)
index a28582d..0000000
+++ /dev/null
@@ -1,132 +0,0 @@
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-N\bNA\bAM\bME\bE
-       critical - Draw a system showing self-organizing critical-
-       ity
-
-S\bSY\bYN\bNO\bOP\bPS\bSI\bIS\bS
-       c\bcr\bri\bit\bti\bic\bca\bal\bl   [-display   _\bh_\bo_\bs_\bt_\b:_\bd_\bi_\bs_\bp_\bl_\ba_\by_\b._\bs_\bc_\br_\be_\be_\bn]   [-foreground
-       _\bc_\bo_\bl_\bo_\br]   [-background  _\bc_\bo_\bl_\bo_\br]  [-window]  [-root]  [-mono]
-       [-install]  [-visual  _\bv_\bi_\bs_\bu_\ba_\bl]  [-delay  _\bs_\be_\bc_\bo_\bn_\bd_\bs]  [-random
-       _\bb_\bo_\bo_\bl_\be_\ba_\bn] [-ncolors _\bi_\bn_\bt] [-offset _\bi_\bn_\bt]
-
-D\bDE\bES\bSC\bCR\bRI\bIP\bPT\bTI\bIO\bON\bN
-       The  _\bc_\br_\bi_\bt_\bi_\bc_\ba_\bl  program displays a self-organizing critical
-       system that gradually emerges from chaos.
-
-       _\bc_\br_\bi_\bt_\bi_\bc_\ba_\bl performs a simulation on a two-dimensional  array
-       of  integers.   The array is initialized to random values.
-       On each iteration, it draws a line to the  array  position
-       with  the  greatest value.  It then replaces that location
-       and the eight neighboring locations with randomly-selected
-       values.
-
-       The  lines  are  initially random, but over time a chaotic
-       self-organizing system evolves: areas of the screen  which
-       happen  to have lower values are less likely to be updated
-       to new values, and so the line tends to avoid those areas.
-       Eventually, the histogram of changes approaches the power-
-       law curve typical of such systems.
-
-       The simplest documented self-organizing system is the one-
-       dimensional equivalent of _\bc_\br_\bi_\bt_\bi_\bc_\ba_\bl.
-
-       I heard about this algorithm second-hand: apparently there
-       was an article in _\bS_\bc_\bi_\be_\bn_\bt_\bi_\bf_\bi_\bc _\bA_\bm_\be_\br_\bi_\bc_\ba_\bn describing it  some-
-       time in 1997.
-
-O\bOP\bPT\bTI\bIO\bON\bNS\bS
-       _\bc_\br_\bi_\bt_\bi_\bc_\ba_\bl accepts the following options:
-
-       -\b-w\bwi\bin\bnd\bdo\bow\bw Draw  on  a  newly-created  window.   This  is the
-               default.
-
-       -\b-r\bro\boo\bot\bt   Draw on the root window.
-
-       -\b-m\bmo\bon\bno\bo   If  on  a  color  display,  pretend  we're  on   a
-               monochrome display.
-
-       -\b-i\bin\bns\bst\bta\bal\bll\bl
-               Install a private colormap for the window.
-
-       -\b-v\bvi\bis\bsu\bua\bal\bl _\bv_\bi_\bs_\bu_\ba_\bl
-               Specify which visual to use.  Legal values are the
-               name of a visual class, or the id number  (decimal
-               or hex) of a specific visual.
-
-
-
-
-X Version 11                13-Nov-98                           1
-
-
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-       -\b-d\bde\bel\bla\bay\by _\bu_\bs_\be_\bc_\bs
-               Number  of microseconds to wait after drawing each
-               line.
-
-       -\b-r\bra\ban\bnd\bdo\bom\bm _\bb_\bo_\bo_\bl_\be_\ba_\bn
-               Whether to use randomly  selected  colours  rather
-               than a cycle around the colour wheel.
-
-       -\b-o\bof\bff\bfs\bse\bet\bt _\bi_\bn_\bt_\be_\bg_\be_\br
-               The maximum random radius increment to use.
-
-       -\b-n\bnc\bco\bol\blo\bor\brs\bs _\bi_\bn_\bt_\be_\bg_\be_\br
-               How  many  colors should be allocated in the color
-               ramp (note that this value interacts with _\bo_\bf_\bf_\bs_\be_\bt.)
-
-E\bEN\bNV\bVI\bIR\bRO\bON\bNM\bME\bEN\bNT\bT
-       D\bDI\bIS\bSP\bPL\bLA\bAY\bY to get the default host and display number.
-
-       X\bXE\bEN\bNV\bVI\bIR\bRO\bON\bNM\bME\bEN\bNT\bT
-               to  get the name of a resource file that overrides
-               the global resources stored in  the  RESOURCE_MAN-
-               AGER property.
-
-S\bSE\bEE\bE A\bAL\bLS\bSO\bO
-       X\bX(1),   x\bxs\bsc\bcr\bre\bee\ben\bns\bsa\bav\bve\ber\br(1)  x\bxs\bsc\bcr\bre\bee\ben\bns\bsa\bav\bve\ber\br-\b-c\bco\bom\bmm\bma\ban\bnd\bd(1)  x\bxs\bsc\bcr\bre\bee\ben\bn-\b-
-       s\bsa\bav\bve\ber\br-\b-d\bde\bem\bmo\bo(1)
-
-C\bCO\bOP\bPY\bYR\bRI\bIG\bGH\bHT\bT
-       Copyright (C) 1998 by Martin Pool.
-
-       Permission to use, copy, modify, distribute, and sell this
-       software  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.   No  representations  are  made  about the
-       suitability of this software for any purpose.  It is  pro-
-       vided "as is" without express or implied warranty.
-
-A\bAU\bUT\bTH\bHO\bOR\bR
-       Martin  Pool  <mbp@humbug.org.au>,  13-Nov-1998.  Based in
-       part  on  the  XScreenSaver   code   by   Jamie   Zawinski
-       <jwz@jwz.org>.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-X Version 11                13-Nov-98                           2
-
-
diff --git a/local/man/cat.1/decayscreen.1 b/local/man/cat.1/decayscreen.1
deleted file mode 100644 (file)
index 8c3b79c..0000000
+++ /dev/null
@@ -1,132 +0,0 @@
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-N\bNA\bAM\bME\bE
-       decayscreen - make a screen meltdown.
-
-S\bSY\bYN\bNO\bOP\bPS\bSI\bIS\bS
-       d\bde\bec\bca\bay\bys\bsc\bcr\bre\bee\ben\bn   [-display   _\bh_\bo_\bs_\bt_\b:_\bd_\bi_\bs_\bp_\bl_\ba_\by_\b._\bs_\bc_\br_\be_\be_\bn]   [-window]
-       [-root] [-mono] [-install] [-visual _\bv_\bi_\bs_\bu_\ba_\bl] [-delay _\bu_\bs_\be_\bc_\bs]
-       [-mode _\bm_\bo_\bd_\be]
-
-D\bDE\bES\bSC\bCR\bRI\bIP\bPT\bTI\bIO\bON\bN
-       The  _\bd_\be_\bc_\ba_\by_\bs_\bc_\br_\be_\be_\bn  program creates a melting effect by ran-
-       domly shifting rectangles around the screen.
-
-O\bOP\bPT\bTI\bIO\bON\bNS\bS
-       _\bd_\be_\bc_\ba_\by_\bs_\bc_\br_\be_\be_\bn accepts the following options:
-
-       -\b-w\bwi\bin\bnd\bdo\bow\bw Draw on  a  newly-created  window.   This  is  the
-               default.
-
-       -\b-r\bro\boo\bot\bt   Draw on the root window.
-
-       -\b-m\bmo\bon\bno\bo   If   on  a  color  display,  pretend  we're  on  a
-               monochrome display.
-
-       -\b-i\bin\bns\bst\bta\bal\bll\bl
-               Install a private colormap for the window.
-
-       -\b-v\bvi\bis\bsu\bua\bal\bl _\bv_\bi_\bs_\bu_\ba_\bl
-               Specify which visual to use.  Legal values are the
-               name  of a visual class, or the id number (decimal
-               or hex) of a specific visual.
-
-       -\b-d\bde\bel\bla\bay\by _\bm_\bi_\bc_\br_\bo_\bs_\be_\bc_\bo_\bn_\bd_\bs
-               Slow it down.
-
-       -\b-m\bmo\bod\bde\be _\bm_\bo_\bd_\be
-               The direction in which the image  should  tend  to
-               slide.   Legal  values  are  _\br_\ba_\bn_\bd_\bo_\bm  (meaning pick
-               one), _\bu_\bp, _\bl_\be_\bf_\bt,  _\br_\bi_\bg_\bh_\bt,  _\bd_\bo_\bw_\bn,  _\bu_\bp_\bl_\be_\bf_\bt,  _\bd_\bo_\bw_\bn_\bl_\be_\bf_\bt,
-               _\bu_\bp_\br_\bi_\bg_\bh_\bt,  _\bd_\bo_\bw_\bn_\br_\bi_\bg_\bh_\bt,  _\bs_\bh_\bu_\bf_\bf_\bl_\be  (meaning  perfer no
-               particular direction),  _\bi_\bn  (meaning  move  things
-               toward  the center), _\bo_\bu_\bt (meaning move things away
-               from the  center),  _\bm_\be_\bl_\bt  (meaning  melt  straight
-               downward), and _\bs_\bt_\br_\be_\bt_\bc_\bh (meaning stretch the screen
-               downward).
-
-R\bRE\bES\bSO\bOU\bUR\bRC\bCE\bES\bS
-       On some systems (currently, only SGIs), this program  can,
-       instead of grabbing a desktop image, grab a frame of video
-       from an external camera and manipulate that instead.   The
-       following resources control that.
-
-
-       g\bgr\bra\bab\bbV\bVi\bid\bde\beo\boP\bPr\bro\bob\bba\bab\bbi\bil\bli\bit\bty\by (Float)
-               What portion of the time to grab video rather than
-
-
-
-X Version 11               05-Apr-1999                          1
-
-
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-               a screen image, between 0.0 and 1.0.  Defaults  to
-               0.5, or half the time.
-
-       v\bvi\bid\bde\beo\boD\bDe\bev\bvi\bic\bce\be (Integer)
-               The  number  of  the default video input device to
-               check first.  If unspecified, the  default  camera
-               (from videopanel(1)) will be checked first.  After
-               that, all other available video input devices will
-               be checked in order.
-
-               The  first  one  which  produces a non-black image
-               will be used.  If all images are black, the others
-               will  be  re-checked  a few times before giving up
-               and falling back  to  simply  grabbing  a  desktop
-               image  (but note that this takes a few seconds, so
-               if you  don't  actually  have  any  video  sources
-               hooked  up,  you should consider turning off video
-               grabbing by setting g\bgr\bra\bab\bbV\bVi\bid\bde\beo\boP\bPr\bro\bob\bba\bab\bbi\bil\bli\bit\bty\by to  0.0.)
-
-       v\bvi\bid\bde\beo\boG\bGa\bai\bin\bn (Float)
-               The amount by which to brighten the grabbed image.
-               This defaults to 2.2.
-
-E\bEN\bNV\bVI\bIR\bRO\bON\bNM\bME\bEN\bNT\bT
-       D\bDI\bIS\bSP\bPL\bLA\bAY\bY to get the default host and display number.
-
-       X\bXE\bEN\bNV\bVI\bIR\bRO\bON\bNM\bME\bEN\bNT\bT
-               to get the name of a resource file that  overrides
-               the  global  resources stored in the RESOURCE_MAN-
-               AGER property.
-
-S\bSE\bEE\bE A\bAL\bLS\bSO\bO
-       X(1), xscreensaver(1)
-
-C\bCO\bOP\bPY\bYR\bRI\bIG\bGH\bHT\bT
-       Copyright 1992 by Vivek Khera.  Permission to  use,  copy,
-       modify,  distribute,  and sell this software and its docu-
-       mentation 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  per-
-       mission  notice  appear  in  supporting documentation.  No
-       representations are made about  the  suitability  of  this
-       software  for any purpose.  It is provided "as is" without
-       express or implied warranty.
-
-A\bAU\bUT\bTH\bHO\bOR\bR
-       Vivek Khera <khera@cs.duke.edu>, 05-Aug-93; based on  code
-       by  David  Wald, 1988.  Modified by jwz, 28-Nov-97.  Modi-
-       fied by Rick Schultz <rick@skapunx.net> 05-Apr-1999.
-
-
-
-
-
-
-
-
-X Version 11               05-Apr-1999                          2
-
-
diff --git a/local/man/cat.1/deco.1 b/local/man/cat.1/deco.1
deleted file mode 100644 (file)
index 19a479d..0000000
+++ /dev/null
@@ -1,132 +0,0 @@
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-N\bNA\bAM\bME\bE
-       deco - draw tacky 70s basement wall panelling
-
-S\bSY\bYN\bNO\bOP\bPS\bSI\bIS\bS
-       d\bde\bec\bco\bo  [-display  _\bh_\bo_\bs_\bt_\b:_\bd_\bi_\bs_\bp_\bl_\ba_\by_\b._\bs_\bc_\br_\be_\be_\bn]  [-foreground _\bc_\bo_\bl_\bo_\br]
-       [-background _\bc_\bo_\bl_\bo_\br] [-window] [-root]  [-mono]  [-install]
-       [-visual   _\bv_\bi_\bs_\bu_\ba_\bl]   [-delay   _\bs_\be_\bc_\bo_\bn_\bd_\bs]  [-max-depth  _\bi_\bn_\bt]
-       [-min-width _\bi_\bn_\bt] [-min-height  _\bi_\bn_\bt]  [-cycle]  [-no-cycle]
-       [-cycle-delay]
-
-D\bDE\bES\bSC\bCR\bRI\bIP\bPT\bTI\bIO\bON\bN
-       The  _\bd_\be_\bc_\bo  program  subdivides  and colors rectangles ran-
-       domly.  It looks kind  of  like  Brady-Bunch-era  rec-room
-       wall  paneling.   (Raven  says:  "this screensaver is ugly
-       enough to peel paint.")
-
-O\bOP\bPT\bTI\bIO\bON\bNS\bS
-       _\bd_\be_\bc_\bo accepts the following options:
-
-       -\b-w\bwi\bin\bnd\bdo\bow\bw Draw on  a  newly-created  window.   This  is  the
-               default.
-
-       -\b-r\bro\boo\bot\bt   Draw on the root window.
-
-       -\b-m\bmo\bon\bno\bo   If   on  a  color  display,  pretend  we're  on  a
-               monochrome display.
-
-       -\b-i\bin\bns\bst\bta\bal\bll\bl
-               Install a private colormap for the window.
-
-       -\b-v\bvi\bis\bsu\bua\bal\bl _\bv_\bi_\bs_\bu_\ba_\bl
-               Specify which visual to use.  Legal values are the
-               name  of a visual class, or the id number (decimal
-               or hex) of a specific visual.
-
-       -\b-d\bde\bel\bla\bay\by _\bs_\be_\bc_\bo_\bn_\bd_\bs
-               How long to wait before starting over.  Default  5
-               seconds.
-
-       -\b-m\bma\bax\bx-\b-d\bde\bep\bpt\bth\bh _\bi_\bn_\bt_\be_\bg_\be_\br
-               How deep to subdivide.  Default 12.  Default 8.
-
-       -\b-m\bmi\bin\bn-\b-w\bwi\bid\bdt\bth\bh _\bi_\bn_\bt_\be_\bg_\be_\br
-               -\b-m\bmi\bin\bn-\b-h\bhe\bei\big\bgh\bht\bt _\bi_\bn_\bt_\be_\bg_\be_\br The size of the smallest rect-
-               angle to draw.  Default 20x20.
-
-       -\b-c\bcy\byc\bcl\ble\be
-
-       -\b-n\bno\bo-\b-c\bcy\byc\bcl\ble\be
-               Whether to do color cycling.  Default False.
-
-       -\b-c\bcy\byc\bcl\ble\be-\b-d\bde\bel\bla\bay\by _\bu_\bs_\be_\bc_\bs
-               If color cycling, how often to change the  colors.
-               Default 1000000, or 1 second.
-
-
-
-X Version 11                27-Apr-97                           1
-
-
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-E\bEN\bNV\bVI\bIR\bRO\bON\bNM\bME\bEN\bNT\bT
-       D\bDI\bIS\bSP\bPL\bLA\bAY\bY to get the default host and display number.
-
-       X\bXE\bEN\bNV\bVI\bIR\bRO\bON\bNM\bME\bEN\bNT\bT
-               to  get the name of a resource file that overrides
-               the global resources stored in  the  RESOURCE_MAN-
-               AGER property.
-
-S\bSE\bEE\bE A\bAL\bLS\bSO\bO
-       X\bX(1), x\bxs\bsc\bcr\bre\bee\ben\bns\bsa\bav\bve\ber\br(1)
-
-C\bCO\bOP\bPY\bYR\bRI\bIG\bGH\bHT\bT
-       Copyright  (C) 1997 by Jamie Zawinski.  Permission to use,
-       copy, modify, distribute, and sell this software  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.   No
-       representations  are  made  about  the suitability of this
-       software for any purpose.  It is provided "as is"  without
-       express or implied warranty.
-
-A\bAU\bUT\bTH\bHO\bOR\bR
-       Jamie  Zawinski <jwz@jwz.org>, 26-Apr-97, based on code by
-       Michael D. Bayne <mdb@go2net.com>.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-X Version 11                27-Apr-97                           2
-
-
diff --git a/local/man/cat.1/drift.1 b/local/man/cat.1/drift.1
deleted file mode 100644 (file)
index 75f982b..0000000
+++ /dev/null
@@ -1,132 +0,0 @@
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-N\bNA\bAM\bME\bE
-       drift - draws drifting recursive fractal cosmic flames
-
-S\bSY\bYN\bNO\bOP\bPS\bSI\bIS\bS
-       d\bdr\bri\bif\bft\bt  [-display  _\bh_\bo_\bs_\bt_\b:_\bd_\bi_\bs_\bp_\bl_\ba_\by_\b._\bs_\bc_\br_\be_\be_\bn] [-foreground _\bc_\bo_\bl_\bo_\br]
-       [-background _\bc_\bo_\bl_\bo_\br] [-window] [-root]  [-mono]  [-install]
-       [-visual  _\bv_\bi_\bs_\bu_\ba_\bl] [-ncolors _\bi_\bn_\bt_\be_\bg_\be_\br] [-delay _\bm_\bi_\bc_\br_\bo_\bs_\be_\bc_\bo_\bn_\bd_\bs]
-       [-count _\bi_\bn_\bt_\be_\bg_\be_\br] [-grow] [-no-grow] [-liss] [-no-liss]
-
-
-D\bDE\bES\bSC\bCR\bRI\bIP\bPT\bTI\bIO\bON\bN
-       The _\bd_\br_\bi_\bf_\bt program draws drifting recursive fractal  cosmic
-       flames
-
-O\bOP\bPT\bTI\bIO\bON\bNS\bS
-       _\bd_\br_\bi_\bf_\bt accepts the following options:
-
-       -\b-w\bwi\bin\bnd\bdo\bow\bw Draw  on  a  newly-created  window.   This  is the
-               default.
-
-       -\b-r\bro\boo\bot\bt   Draw on the root window.
-
-       -\b-m\bmo\bon\bno\bo   If  on  a  color  display,  pretend  we're  on   a
-               monochrome display.
-
-       -\b-i\bin\bns\bst\bta\bal\bll\bl
-               Install a private colormap for the window.
-
-       -\b-v\bvi\bis\bsu\bua\bal\bl _\bv_\bi_\bs_\bu_\ba_\bl
-               Specify which visual to use.  Legal values are the
-               name of a visual class, or the id number  (decimal
-               or hex) of a specific visual.
-
-       -\b-n\bnc\bco\bol\blo\bor\brs\bs _\bi_\bn_\bt_\be_\bg_\be_\br
-               How  many  colors  should  be  used (if possible).
-               Default 200.  The colors used  cycle  through  the
-               hue, making N stops around the color wheel.
-
-       -\b-c\bco\bou\bun\bnt\bt _\bi_\bn_\bt_\be_\bg_\be_\br
-
-
-       -\b-g\bgr\bro\bow\bw
-
-       -\b-n\bno\bo-\b-g\bgr\bro\bow\bw
-               Whether  fractals should grow; otherwise, they are
-               animated.
-
-
-       -\b-l\bli\bis\bss\bs
-
-       -\b-n\bno\bo-\b-l\bli\bis\bss\bs
-               Whether we should use  lissojous  figures  to  get
-               points.
-
-
-
-
-X Version 11                10-May-97                           1
-
-
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-E\bEN\bNV\bVI\bIR\bRO\bON\bNM\bME\bEN\bNT\bT
-       D\bDI\bIS\bSP\bPL\bLA\bAY\bY to get the default host and display number.
-
-       X\bXE\bEN\bNV\bVI\bIR\bRO\bON\bNM\bME\bEN\bNT\bT
-               to  get the name of a resource file that overrides
-               the global resources stored in  the  RESOURCE_MAN-
-               AGER property.
-
-S\bSE\bEE\bE A\bAL\bLS\bSO\bO
-       f\bfl\bla\bam\bme\be(1), X\bX(1), x\bxs\bsc\bcr\bre\bee\ben\bns\bsa\bav\bve\ber\br(1), x\bxl\blo\boc\bck\bk(1)
-
-C\bCO\bOP\bPY\bYR\bRI\bIG\bGH\bHT\bT
-       Copyright (C) 1991, 1995 by Scott Draves.
-
-       Permission to use, copy, modify, and distribute this soft-
-       ware 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.
-
-A\bAU\bUT\bTH\bHO\bOR\bR
-       Scott Draves <spot@cs.cmu.edu>, 06-Jun-91, 01-Jun-95.
-
-       Ability to run standalone or with  _\bx_\bs_\bc_\br_\be_\be_\bn_\bs_\ba_\bv_\be_\br  added  by
-       Jamie Zawinski <jwz@jwz.org>, 10-May-97.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-X Version 11                10-May-97                           2
-
-
diff --git a/local/man/cat.1/epicycle.1 b/local/man/cat.1/epicycle.1
deleted file mode 100644 (file)
index a263b9a..0000000
+++ /dev/null
@@ -1,264 +0,0 @@
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-N\bNA\bAM\bME\bE
-       epicycle  -  draws  a  point  moving around a circle which
-       moves around a cicle which...
-
-S\bSY\bYN\bNO\bOP\bPS\bSI\bIS\bS
-       e\bep\bpi\bic\bcy\byc\bcl\ble\be [-display _\bh_\bo_\bs_\bt_\b:_\bd_\bi_\bs_\bp_\bl_\ba_\by_\b._\bs_\bc_\br_\be_\be_\bn] [-root]  [-window]
-       [-mono]  [-install] [-noinstall] [-visual _\bv_\bi_\bz] [-colors _\bN]
-       [-foreground _\bn_\ba_\bm_\be] [-color-shift _\bN] [-delay  _\bm_\bi_\bc_\br_\bo_\bs_\be_\bc_\bo_\bn_\bd_\bs]
-       [-holdtime   _\bs_\be_\bc_\bo_\bn_\bd_\bs]   [-linewidth  _\bN]  [-min_circles  _\bN]
-       [-max_circles _\bN] [-min_speed _\bn_\bu_\bm_\bb_\be_\br]  [-max_speed  _\bn_\bu_\bm_\bb_\be_\br]
-       [-harmonics _\bN] [-timestep _\bn_\bu_\bm_\bb_\be_\br] [-divisor_poisson _\bp_\br_\bo_\bb_\ba_\b-
-       _\bb_\bi_\bl_\bi_\bt_\by] [-size_factor_min _\bn_\bu_\bm_\bb_\be_\br]  [-size_factor_max  _\bn_\bu_\bm_\b-
-       _\bb_\be_\br]
-
-D\bDE\bES\bSC\bCR\bRI\bIP\bPT\bTI\bIO\bON\bN
-       The  epicycle program draws the path traced out by a point
-       on the edge of a circle.  That  circle  rotates  around  a
-       point  on  the  rim  of another circle, and so on, several
-       times.  The random curves produced can be simple  or  com-
-       plex, convex or concave, but they are always closed curves
-       (they never go in indefinitely).
-
-       You can configure both the way the curves  are  drawn  and
-       the  way in which the random sequence of circles is gener-
-       ated, either with command-line options or X resources.
-
-O\bOP\bPT\bTI\bIO\bON\bNS\bS
-       -\b-d\bdi\bis\bsp\bpl\bla\bay\by _\bh_\bo_\bs_\bt_\b:_\bd_\bi_\bs_\bp_\bl_\ba_\by_\b._\bs_\bc_\br_\be_\be_\bn
-               Specifies which X display we should use  (see  the
-               section DISPLAY NAMES in X\bX(1) for more information
-               about this option).
-
-       -\b-r\bro\boo\bot\bt   Draw on the root window.
-
-       -\b-w\bwi\bin\bnd\bdo\bow\bw Draw on  a  newly-created  window.   This  is  the
-               default.
-
-       -\b-m\bmo\bon\bno\bo   If   on  a  color  display,  pretend  we're  on  a
-               monochrome display.  If we're on a  mono  display,
-               we have no choice.
-
-       -\b-i\bin\bns\bst\bta\bal\bll\bl
-               Install a private colormap for the window.
-
-       -\b-n\bno\boi\bin\bns\bst\bta\bal\bll\bl
-               Don't install a private colormap for the window.
-
-       -\b-v\bvi\bis\bsu\bua\bal\bl _\bv_\bi_\bz
-               Specify which visual to use.  Legal values are the
-               name of a visual class, or the id number  (decimal
-               or  hex)  of  a specific visual.  Possible choices
-               include
-
-               default,  best,  mono,  monochrome,  gray,   grey,
-
-
-
-X Version 11                27-Apr-97                           1
-
-
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-               color,    staticgray,    staticcolor,   truecolor,
-               grayscale,  greyscale,  pseudocolor,  directcolor,
-               _\bn_\bu_\bm_\bb_\be_\br
-
-               If  a  decimal  or  hexadecimal  number  is  used,
-               X\bXG\bGe\bet\btV\bVi\bis\bsu\bua\bal\blI\bIn\bnf\bfo\bo(3X)  is  consulted  to  obtain  the
-               required visual.
-
-       -\b-c\bco\bol\blo\bor\brs\bs _\bN
-               How many colors should be used (if possible).  The
-               colors are chosen randomly.
-
-       -\b-f\bfo\bor\bre\beg\bgr\bro\bou\bun\bnd\bd _\bn_\ba_\bm_\be
-               With -\b-m\bmo\bon\bno\bo, this  option  selects  the  foreground
-               colour.
-
-       -\b-d\bde\bel\bla\bay\by _\bm_\bi_\bc_\br_\bo_\bs_\be_\bc_\bo_\bn_\bd_\bs
-               Specifies  the  delay  between  drawing successive
-               line segments of the path.   If you do not specify
-               -\b-s\bsy\byn\bnc\bc, some X servers may batch up several drawing
-               operations  together,  producing  a  less   smooth
-               effect.     This  is  more  likely  to  happen  in
-               monochrome mode (on  monochrome  servers  or  when
-               -\b-m\bmo\bon\bno\bo is specified).
-
-       -\b-h\bho\bol\bld\bdt\bti\bim\bme\be _\bs_\be_\bc_\bo_\bn_\bd_\bs
-               When  the figure is complete, _\be_\bp_\bi_\bc_\by_\bc_\bl_\be pauses this
-               number of seconds.
-
-       -\b-l\bli\bin\bne\bew\bwi\bid\bdt\bth\bh _\bN
-               Width in pixels of the body's track.    Specifying
-               values  greater than one may cause slower drawing.
-               The fastest value is  usually  zero,  meaning  one
-               pixel.
-
-       -\b-m\bmi\bin\bn_\b_c\bci\bir\brc\bcl\ble\bes\bs _\bN
-               Smallest number of epicycles in the figure.
-
-       -\b-m\bma\bax\bx_\b_c\bci\bir\brc\bcl\ble\bes\bs _\bN
-               Largest number of epicycles in the figure.
-
-       -\b-m\bmi\bin\bn_\b_s\bsp\bpe\bee\bed\bd _\bn_\bu_\bm_\bb_\be_\br
-               Smallest possible value for the base speed of rev-
-               olution of the epicycles.  The  actual  speeds  of
-               the  epicycles  vary from this down to _\bm_\bi_\bn_\b__\bs_\bp_\be_\be_\bd _\b/
-               _\bh_\ba_\br_\bm_\bo_\bn_\bi_\bc_\bs.\b.
-
-       -\b-m\bma\bax\bx_\b_s\bsp\bpe\bee\bed\bd _\bn_\bu_\bm_\bb_\be_\br
-               Smallest possible value for the base speed of rev-
-               olution of the epicycles.
-
-       -\b-h\bha\bar\brm\bmo\bon\bni\bic\bcs\bs _\bN
-               Number  of  possible  harmonics;  the  larger this
-               value is, the  greater  the  possible  variety  of
-
-
-
-X Version 11                27-Apr-97                           2
-
-
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-               possible speeds of epicycle.
-
-       -\b-t\bti\bim\bme\bes\bst\bte\bep\bp _\bn_\bu_\bm_\bb_\be_\br
-               Decreasing this value will reduce the distance the
-               body moves for each line segment, possibly produc-
-               ing  a smoother figure.  Increasing it may produce
-               faster results.
-
-       -\b-d\bdi\biv\bvi\bis\bso\bor\br_\b_p\bpo\boi\bis\bss\bso\bon\bn _\bp_\br_\bo_\bb_\ba_\bb_\bi_\bl_\bi_\bt_\by
-               Each epicycle rotates at a rate which is a  factor
-               of  the base speed.  The speed of each epicycle is
-               the base speed divided by some integer  between  1
-               and  the  value  of  the  -\b-h\bha\bar\brm\bmo\bon\bni\bic\bcs\bs option.  This
-               integer is decided by starting at 1 and tossing  a
-               biased coin.  For each consecutive head, the value
-               is incremented by one.  The integer  will  not  be
-               incremented  above  the  value  of  the -\b-h\bha\bar\brm\bmo\bon\bni\bic\bcs\bs
-               option.  The argument of this option  decides  the
-               bias  of the coin; it is the probability that that
-               coin will produce a head at any given toss.
-
-       -\b-s\bsi\biz\bze\be_\b_f\bfa\bac\bct\bto\bor\br_\b_m\bmi\bin\bn _\bn_\bu_\bm_\bb_\be_\br
-               Epicycles are always at least this factor  smaller
-               than their parents.
-
-       -\b-s\bsi\biz\bze\be_\b_f\bfa\bac\bct\bto\bor\br_\b_m\bma\bax\bx _\bn_\bu_\bm_\bb_\be_\br
-               Epicycles  are never more than this factor smaller
-               than their parents.
-
-R\bRE\bES\bSO\bOU\bUR\bRC\bCE\bES\bS
-            Option            Resource               Default Value
-            ------            --------               -------------
-            -colors           .colors                100
-            -delay            .delay                 1000
-            -holdtime         .holdtime              2
-            -linewidth        .lineWidth             4
-            -min_circles      .minCircles            2
-            -max_circles      .maxCircles            10
-            -min_speed        .minSpeed              0.003
-            -max_speed        .maxSpeed              0.005
-            -harmonics        .harmonics             8
-            -timestep         .timestep              1.0
-            -divisor_poisson  .divisorPoisson        0.4
-            -size_factor_min  .sizeFactorMin         1.05
-            -size_factor_max  .sizeFactorMax         2.05
-                              .timestepCoarseFactor  1.0
-
-       Before the drawing of the figure is begun,  a  preliminary
-       calculation  of  the  path  is  done in order to scale the
-       radii of the epicycles so as to  fit  the  figure  on  the
-       screen or window.  For the sake of speed, This calculation
-       is done with a larger timestep than  the  actual  drawing.
-       The  time-step  used  is the value of the -\b-t\bti\bim\bme\bes\bst\bte\bep\bp option
-       multiplied  by  the  timestepCoarseFactor  resource.   The
-
-
-
-X Version 11                27-Apr-97                           3
-
-
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-       default value of 1 will almost always work fast enough and
-       so this  resource  is  not  available  as  a  command-line
-       option.
-
-U\bUS\bSE\bER\bR I\bIN\bNT\bTE\bER\bRF\bFA\bAC\bCE\bE
-       The  program  runs  mostly without user interaction.  When
-       running on the root window, no input  is  accepted.   When
-       running  in its own window, the program will exit if mouse
-       button 3  is  pressed.   If  any  other  mouse  button  is
-       pressed,  the current figure will be abandoned and another
-       will be started.
-
-H\bHI\bIS\bST\bTO\bOR\bRY\bY
-       The geometry of epicycles was perfected by  Hipparchus  of
-       Rhodes  at  some time around 125 B.C., 185 years after the
-       birth of Aristarchus of Samos, the inventor of the  helio-
-       centric  universe  model.  Hipparchus applied epicycles to
-       the Sun and the Moon.  Ptolemy of Alexandria  went  on  to
-       apply  them to what was then the known universe, at around
-       150 A.D.  Copernicus went on to apply them to  the  helio-
-       centric  model  at the beginning of the sixteenth century.
-       Johannes Kepler discovered that the planets actually  move
-       in  elliptical  orbits  in about 1602.  The inverse-square
-       law of gravity was suggested by Boulliau in  1645.   Isaac
-       Newton's  _\bP_\br_\bi_\bn_\bc_\bi_\bp_\bi_\ba _\bM_\ba_\bt_\bh_\be_\bm_\ba_\bt_\bi_\bc_\ba was published in 1687, and
-       proved that Kepler's laws derived from Newtonian  gravita-
-       tion.
-
-B\bBU\bUG\bGS\bS
-       The  colour  selection  is re-done for every figure.  This
-       may generate too much network traffic for this program  to
-       work well over slow or long links.
-
-C\bCO\bOP\bPY\bYR\bRI\bIG\bGH\bHT\bT
-       Copyright  (C)  1998,  James Youngman.  Permission to use,
-       copy, modify, distribute, and sell this software  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.   No
-       representations  are  made  about  the suitability of this
-       software for any purpose.  It is provided "as is"  without
-       express or implied warranty.
-
-A\bAU\bUT\bTH\bHO\bOR\bR
-       James Youngman <jay@gnu.org>, April 1998.
-
-
-
-
-
-
-
-
-
-
-
-X Version 11                27-Apr-97                           4
-
-
diff --git a/local/man/cat.1/flag.1 b/local/man/cat.1/flag.1
deleted file mode 100644 (file)
index 1420eb1..0000000
+++ /dev/null
@@ -1,132 +0,0 @@
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-N\bNA\bAM\bME\bE
-       flag - draws a waving flag, containing text or an image
-
-S\bSY\bYN\bNO\bOP\bPS\bSI\bIS\bS
-       f\bfl\bla\bag\bg  [-display  _\bh_\bo_\bs_\bt_\b:_\bd_\bi_\bs_\bp_\bl_\ba_\by_\b._\bs_\bc_\br_\be_\be_\bn]  [-foreground _\bc_\bo_\bl_\bo_\br]
-       [-background _\bc_\bo_\bl_\bo_\br] [-window] [-root]  [-mono]  [-install]
-       [-visual  _\bv_\bi_\bs_\bu_\ba_\bl] [-ncolors _\bi_\bn_\bt_\be_\bg_\be_\br] [-delay _\bm_\bi_\bc_\br_\bo_\bs_\be_\bc_\bo_\bn_\bd_\bs]
-       [-cycles _\bi_\bn_\bt_\be_\bg_\be_\br] [-size _\bi_\bn_\bt_\be_\bg_\be_\br]  [-text  _\bs_\bt_\br_\bi_\bn_\bg]  [-font
-       _\bf_\bo_\bn_\bt] [-bitmap _\bx_\bb_\bm_\b-_\bf_\bi_\bl_\be]
-
-
-D\bDE\bES\bSC\bCR\bRI\bIP\bPT\bTI\bIO\bON\bN
-       The _\bf_\bl_\ba_\bg program draws a waving flag that contains text or
-       a bitmap.
-
-O\bOP\bPT\bTI\bIO\bON\bNS\bS
-       _\bf_\bl_\ba_\bg accepts the following options:
-
-       -\b-w\bwi\bin\bnd\bdo\bow\bw Draw on  a  newly-created  window.   This  is  the
-               default.
-
-       -\b-r\bro\boo\bot\bt   Draw on the root window.
-
-       -\b-m\bmo\bon\bno\bo   If   on  a  color  display,  pretend  we're  on  a
-               monochrome display.
-
-       -\b-i\bin\bns\bst\bta\bal\bll\bl
-               Install a private colormap for the window.
-
-       -\b-v\bvi\bis\bsu\bua\bal\bl _\bv_\bi_\bs_\bu_\ba_\bl
-               Specify which visual to use.  Legal values are the
-               name  of a visual class, or the id number (decimal
-               or hex) of a specific visual.
-
-       -\b-n\bnc\bco\bol\blo\bor\brs\bs _\bi_\bn_\bt_\be_\bg_\be_\br
-               How many colors  should  be  used  (if  possible).
-               Default 200.
-
-       -\b-c\bcy\byc\bcl\ble\bes\bs _\bi_\bn_\bt_\be_\bg_\be_\br
-
-
-       -\b-c\bco\bou\bun\bnt\bt _\bi_\bn_\bt_\be_\bg_\be_\br
-
-
-       -\b-s\bsi\biz\bze\be _\bi_\bn_\bt_\be_\bg_\be_\br
-               How large the pixels in the flag should be, from 1
-               to 8.  If this is a  negative  number,  the  pixel
-               size is chosen randomly from the range 1 to -size.
-               Default -7.
-
-       -\b-t\bte\bex\bxt\bt _\bt_\be_\bx_\bt
-               The text to display in the flag.   Multiple  lines
-               of  text  are allowed; the lines will be displayed
-               centered atop one another.  Default: none.  If the
-
-
-
-X Version 11                24-May-97                           1
-
-
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-               text  is  the  magic  string _\b"_\b(_\bd_\be_\bf_\ba_\bu_\bl_\bt_\b)_\b", then the
-               text used will be the local machine name;  a  new-
-               line; and the local OS version.
-
-       -\b-b\bbi\bit\btm\bma\bap\bp _\bx_\bb_\bm_\b-_\bf_\bi_\bl_\be
-               The bitmap to display in the flag; this must be an
-               XBM file (color XPMs are not  allowed.)   Default:
-               none.    If   the   bitmap  is  the  magic  string
-               _\b"_\b(_\bd_\be_\bf_\ba_\bu_\bl_\bt_\b)_\b", then the bitmap used will be a charm-
-               ing little picture of J. R. "Bob" Dobbs.
-
-               If  neither  _\b-_\bt_\be_\bx_\bt nor _\b-_\bb_\bi_\bt_\bm_\ba_\bp are specified, then
-               either the builtin text or the builtin bitmap will
-               be chosen randomly.
-
-       -\b-f\bfo\bon\bnt\bt _\bf_\bo_\bn_\bt
-               The font in which to draw the text; the default is
-               "-*-helvetica-bold-r-*-240-*".
-
-E\bEN\bNV\bVI\bIR\bRO\bON\bNM\bME\bEN\bNT\bT
-       D\bDI\bIS\bSP\bPL\bLA\bAY\bY to get the default host and display number.
-
-       X\bXE\bEN\bNV\bVI\bIR\bRO\bON\bNM\bME\bEN\bNT\bT
-               to get the name of a resource file that  overrides
-               the  global  resources stored in the RESOURCE_MAN-
-               AGER property.
-
-S\bSE\bEE\bE A\bAL\bLS\bSO\bO
-       X\bX(1), x\bxs\bsc\bcr\bre\bee\ben\bns\bsa\bav\bve\ber\br(1), x\bxl\blo\boc\bck\bk(1)
-
-C\bCO\bOP\bPY\bYR\bRI\bIG\bGH\bHT\bT
-       Copyright (C) 1996 Charles Vidal.
-
-       Permission to use, copy, modify, and distribute this soft-
-       ware 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.
-
-
-A\bAU\bUT\bTH\bHO\bOR\bR
-       Charles Vidal <vidalc@univ-mlv.fr>, 1996.
-
-       Ability  to  run  standalone or with _\bx_\bs_\bc_\br_\be_\be_\bn_\bs_\ba_\bv_\be_\br, and the
-       -text  and  -bitmap  options,  added  by  Jamie   Zawinski
-       <jwz@jwz.org>, 24-May-97.
-
-
-
-
-
-
-
-
-
-
-X Version 11                24-May-97                           2
-
-
diff --git a/local/man/cat.1/flame.1 b/local/man/cat.1/flame.1
deleted file mode 100644 (file)
index e5c4eba..0000000
+++ /dev/null
@@ -1,132 +0,0 @@
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-N\bNA\bAM\bME\bE
-       flame - draw weird cosmic fractals
-
-S\bSY\bYN\bNO\bOP\bPS\bSI\bIS\bS
-       f\bfl\bla\bam\bme\be  [-display  _\bh_\bo_\bs_\bt_\b:_\bd_\bi_\bs_\bp_\bl_\ba_\by_\b._\bs_\bc_\br_\be_\be_\bn] [-foreground _\bc_\bo_\bl_\bo_\br]
-       [-background _\bc_\bo_\bl_\bo_\br] [-window] [-root]  [-mono]  [-install]
-       [-visual  _\bv_\bi_\bs_\bu_\ba_\bl]  [-colors _\bi_\bn_\bt_\be_\bg_\be_\br] [-iterations _\bi_\bn_\bt_\be_\bg_\be_\br]
-       [-points _\bi_\bn_\bt_\be_\bg_\be_\br] [-delay _\bm_\bi_\bc_\br_\bo_\bs_\be_\bc_\bo_\bn_\bd_\bs] [-delay2 _\bm_\bi_\bc_\br_\bo_\bs_\be_\bc_\b-
-       _\bo_\bn_\bd_\bs]
-
-D\bDE\bES\bSC\bCR\bRI\bIP\bPT\bTI\bIO\bON\bN
-       The _\bf_\bl_\ba_\bm_\be program generates colorful fractal displays.
-
-O\bOP\bPT\bTI\bIO\bON\bNS\bS
-       _\bf_\bl_\ba_\bm_\be accepts the following options:
-
-       -\b-w\bwi\bin\bnd\bdo\bow\bw Draw  on  a  newly-created  window.   This  is the
-               default.
-
-       -\b-r\bro\boo\bot\bt   Draw on the root window.
-
-       -\b-m\bmo\bon\bno\bo   If  on  a  color  display,  pretend  we're  on   a
-               monochrome display.
-
-       -\b-i\bin\bns\bst\bta\bal\bll\bl
-               Install a private colormap for the window.
-
-       -\b-v\bvi\bis\bsu\bua\bal\bl _\bv_\bi_\bs_\bu_\ba_\bl
-               Specify which visual to use.  Legal values are the
-               name of a visual class, or the id number  (decimal
-               or hex) of a specific visual.
-
-       -\b-c\bco\bol\blo\bor\brs\bs _\bi_\bn_\bt_\be_\bg_\be_\br
-               How  many  colors  should  be  used (if possible).
-               Default 64.
-
-       -\b-i\bit\bte\ber\bra\bat\bti\bio\bon\bns\bs _\bi_\bn_\bt_\be_\bg_\be_\br
-               How many fractals to generate.  Default 25.
-
-       -\b-p\bpo\boi\bin\bnt\bts\bs _\bi_\bn_\bt_\be_\bg_\be_\br
-               How many pixels to draw for each fractal.  Default
-               10000.
-
-       -\b-d\bde\bel\bla\bay\by _\bm_\bi_\bc_\br_\bo_\bs_\be_\bc_\bo_\bn_\bd_\bs
-               How long we should wait between drawing each frac-
-               tal.  Default 50000, or about 1/20th second.
-
-       -\b-d\bde\bel\bla\bay\by2\b2 _\bm_\bi_\bc_\br_\bo_\bs_\be_\bc_\bo_\bn_\bd_\bs
-               How long we should wait before clearing the screen
-               when  each run ends.  Default 2000000, or two sec-
-               onds.
-
-E\bEN\bNV\bVI\bIR\bRO\bON\bNM\bME\bEN\bNT\bT
-       D\bDI\bIS\bSP\bPL\bLA\bAY\bY to get the default host and display number.
-
-
-
-X Version 11                13-aug-92                           1
-
-
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-       X\bXE\bEN\bNV\bVI\bIR\bRO\bON\bNM\bME\bEN\bNT\bT
-               to get the name of a resource file that  overrides
-               the  global  resources stored in the RESOURCE_MAN-
-               AGER property.
-
-S\bSE\bEE\bE A\bAL\bLS\bSO\bO
-       X\bX(1), x\bxs\bsc\bcr\bre\bee\ben\bns\bsa\bav\bve\ber\br(1), x\bxl\blo\boc\bck\bk(1)
-
-C\bCO\bOP\bPY\bYR\bRI\bIG\bGH\bHT\bT
-       Copyright (C) 1991 by Patrick J. Naughton
-
-       Permission to use, copy, modify, and distribute this soft-
-       ware 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.
-
-A\bAU\bUT\bTH\bHO\bOR\bR
-       Scott Graves <spot@cs.cmu.edu>, 06-Jun-91.n
-
-       Ability  to  run  standalone or with _\bx_\bs_\bc_\br_\be_\be_\bn_\bs_\ba_\bv_\be_\br added by
-       Jamie Zawinski <jwz@jwz.org>, 18-Oct-93.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-X Version 11                13-aug-92                           2
-
-
diff --git a/local/man/cat.1/forest.1 b/local/man/cat.1/forest.1
deleted file mode 100644 (file)
index 4f5d39a..0000000
+++ /dev/null
@@ -1,132 +0,0 @@
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-N\bNA\bAM\bME\bE
-       forest - draws a fractal forest
-
-S\bSY\bYN\bNO\bOP\bPS\bSI\bIS\bS
-       f\bfo\bor\bre\bes\bst\bt  [-display _\bh_\bo_\bs_\bt_\b:_\bd_\bi_\bs_\bp_\bl_\ba_\by_\b._\bs_\bc_\br_\be_\be_\bn] [-foreground _\bc_\bo_\bl_\bo_\br]
-       [-background _\bc_\bo_\bl_\bo_\br] [-window] [-root]  [-mono]  [-install]
-       [-visual  _\bv_\bi_\bs_\bu_\ba_\bl] [-ncolors _\bi_\bn_\bt_\be_\bg_\be_\br] [-delay _\bm_\bi_\bc_\br_\bo_\bs_\be_\bc_\bo_\bn_\bd_\bs]
-       [-cycles _\bi_\bn_\bt_\be_\bg_\be_\br] [-count _\bi_\bn_\bt_\be_\bg_\be_\br]
-
-
-D\bDE\bES\bSC\bCR\bRI\bIP\bPT\bTI\bIO\bON\bN
-       The _\bf_\bo_\br_\be_\bs_\bt program draws a fractal forest.
-
-O\bOP\bPT\bTI\bIO\bON\bNS\bS
-       _\bf_\bo_\br_\be_\bs_\bt accepts the following options:
-
-       -\b-w\bwi\bin\bnd\bdo\bow\bw Draw on  a  newly-created  window.   This  is  the
-               default.
-
-       -\b-r\bro\boo\bot\bt   Draw on the root window.
-
-       -\b-m\bmo\bon\bno\bo   If   on  a  color  display,  pretend  we're  on  a
-               monochrome display.
-
-       -\b-i\bin\bns\bst\bta\bal\bll\bl
-               Install a private colormap for the window.
-
-       -\b-v\bvi\bis\bsu\bua\bal\bl _\bv_\bi_\bs_\bu_\ba_\bl
-               Specify which visual to use.  Legal values are the
-               name  of a visual class, or the id number (decimal
-               or hex) of a specific visual.
-
-       -\b-n\bnc\bco\bol\blo\bor\brs\bs _\bi_\bn_\bt_\be_\bg_\be_\br
-               How many colors  should  be  used  (if  possible).
-               Default 100.
-
-       -\b-c\bcy\byc\bcl\ble\bes\bs _\bi_\bn_\bt_\be_\bg_\be_\br
-
-
-       -\b-c\bco\bou\bun\bnt\bt _\bi_\bn_\bt_\be_\bg_\be_\br
-
-
-E\bEN\bNV\bVI\bIR\bRO\bON\bNM\bME\bEN\bNT\bT
-       D\bDI\bIS\bSP\bPL\bLA\bAY\bY to get the default host and display number.
-
-       X\bXE\bEN\bNV\bVI\bIR\bRO\bON\bNM\bME\bEN\bNT\bT
-               to  get the name of a resource file that overrides
-               the global resources stored in  the  RESOURCE_MAN-
-               AGER property.
-
-S\bSE\bEE\bE A\bAL\bLS\bSO\bO
-       X\bX(1), x\bxs\bsc\bcr\bre\bee\ben\bns\bsa\bav\bve\ber\br(1), x\bxl\blo\boc\bck\bk(1)
-
-
-
-
-
-X Version 11                27-May-97                           1
-
-
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-C\bCO\bOP\bPY\bYR\bRI\bIG\bGH\bHT\bT
-       Copyright (C) 1995 by Pascal Pensa.
-
-       Permission to use, copy, modify, and distribute this soft-
-       ware 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.
-
-A\bAU\bUT\bTH\bHO\bOR\bR
-       Pascal Pensa <pensa@aurora.unice.fr>, 1995.
-
-       Ability to run standalone or with  _\bx_\bs_\bc_\br_\be_\be_\bn_\bs_\ba_\bv_\be_\br  added  by
-       Jamie Zawinski <jwz@jwz.org>, 27-May-97.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-X Version 11                27-May-97                           2
-
-
diff --git a/local/man/cat.1/galaxy.1 b/local/man/cat.1/galaxy.1
deleted file mode 100644 (file)
index 59f9300..0000000
+++ /dev/null
@@ -1,132 +0,0 @@
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-N\bNA\bAM\bME\bE
-       galaxy - draws spinning galaxies
-
-S\bSY\bYN\bNO\bOP\bPS\bSI\bIS\bS
-       g\bga\bal\bla\bax\bxy\by  [-display _\bh_\bo_\bs_\bt_\b:_\bd_\bi_\bs_\bp_\bl_\ba_\by_\b._\bs_\bc_\br_\be_\be_\bn] [-foreground _\bc_\bo_\bl_\bo_\br]
-       [-background _\bc_\bo_\bl_\bo_\br] [-window] [-root]  [-mono]  [-install]
-       [-visual  _\bv_\bi_\bs_\bu_\ba_\bl] [-ncolors _\bi_\bn_\bt_\be_\bg_\be_\br] [-delay _\bm_\bi_\bc_\br_\bo_\bs_\be_\bc_\bo_\bn_\bd_\bs]
-       [-cycles  _\bi_\bn_\bt_\be_\bg_\be_\br]  [-count   _\bi_\bn_\bt_\be_\bg_\be_\br]   [-size   _\bi_\bn_\bt_\be_\bg_\be_\br]
-       [-trail] [-no-trail]
-
-
-D\bDE\bES\bSC\bCR\bRI\bIP\bPT\bTI\bIO\bON\bN
-       The _\bg_\ba_\bl_\ba_\bx_\by program draws spinning galaxies.
-
-O\bOP\bPT\bTI\bIO\bON\bNS\bS
-       _\bg_\ba_\bl_\ba_\bx_\by accepts the following options:
-
-       -\b-w\bwi\bin\bnd\bdo\bow\bw Draw  on  a  newly-created  window.   This  is the
-               default.
-
-       -\b-r\bro\boo\bot\bt   Draw on the root window.
-
-       -\b-m\bmo\bon\bno\bo   If  on  a  color  display,  pretend  we're  on   a
-               monochrome display.
-
-       -\b-i\bin\bns\bst\bta\bal\bll\bl
-               Install a private colormap for the window.
-
-       -\b-v\bvi\bis\bsu\bua\bal\bl _\bv_\bi_\bs_\bu_\ba_\bl
-               Specify which visual to use.  Legal values are the
-               name of a visual class, or the id number  (decimal
-               or hex) of a specific visual.
-
-       -\b-n\bnc\bco\bol\blo\bor\brs\bs _\bi_\bn_\bt_\be_\bg_\be_\br
-               How  many  colors  should  be  used (if possible).
-               Default 64.  The colors  used  cycle  through  the
-               hue, making N stops around the color wheel.
-
-       -\b-c\bcy\byc\bcl\ble\bes\bs _\bi_\bn_\bt_\be_\bg_\be_\br
-
-
-       -\b-c\bco\bou\bun\bnt\bt _\bi_\bn_\bt_\be_\bg_\be_\br
-
-
-       -\b-s\bsi\biz\bze\be _\bi_\bn_\bt_\be_\bg_\be_\br
-
-
-       -\b-t\btr\bra\bai\bil\bl
-
-       -\b-n\bno\bo-\b-t\btr\bra\bai\bil\bl
-
-
-E\bEN\bNV\bVI\bIR\bRO\bON\bNM\bME\bEN\bNT\bT
-       D\bDI\bIS\bSP\bPL\bLA\bAY\bY to get the default host and display number.
-
-
-
-X Version 11                10-May-97                           1
-
-
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-       X\bXE\bEN\bNV\bVI\bIR\bRO\bON\bNM\bME\bEN\bNT\bT
-               to  get the name of a resource file that overrides
-               the global resources stored in  the  RESOURCE_MAN-
-               AGER property.
-
-S\bSE\bEE\bE A\bAL\bLS\bSO\bO
-       X\bX(1), x\bxs\bsc\bcr\bre\bee\ben\bns\bsa\bav\bve\ber\br(1), x\bxl\blo\boc\bck\bk(1)
-
-C\bCO\bOP\bPY\bYR\bRI\bIG\bGH\bHT\bT
-       Copyright (C) 1994 by Hubert Feyrer.
-
-       Permission to use, copy, modify, and distribute this soft-
-       ware 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.
-
-A\bAU\bUT\bTH\bHO\bOR\bR
-       Original  Amiga  version   by   Uli   Siegmund   <uli@wom-
-       bat.okapi.sub.org>
-        for EGS in Cluster.
-
-       Ported  from Cluster/EGS to C/Intuition by Harald Backert.
-
-       Ported   to   X11   and   xlockmore   by   Hubert   Feyrer
-       <hubert.feyrer@rz.uni-regensburg.de>, 30-Sep-94.
-
-       Modified by David Bagley <bagleyd@bigfoot.com>, 23-Oct-94.
-
-       Modified by Dave Mitchell <davem@magnet.com>, 7-Apr-97.
-
-       Ability to run standalone or with  _\bx_\bs_\bc_\br_\be_\be_\bn_\bs_\ba_\bv_\be_\br  added  by
-       Jamie Zawinski <jwz@jwz.org>, 10-May-97.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-X Version 11                10-May-97                           2
-
-
diff --git a/local/man/cat.1/goop.1 b/local/man/cat.1/goop.1
deleted file mode 100644 (file)
index ad05f48..0000000
+++ /dev/null
@@ -1,132 +0,0 @@
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-N\bNA\bAM\bME\bE
-       goop - squishy transparent oil and bubble screenhack
-
-S\bSY\bYN\bNO\bOP\bPS\bSI\bIS\bS
-       g\bgo\boo\bop\bp  [-display  _\bh_\bo_\bs_\bt_\b:_\bd_\bi_\bs_\bp_\bl_\ba_\by_\b._\bs_\bc_\br_\be_\be_\bn]  [-foreground _\bc_\bo_\bl_\bo_\br]
-       [-background _\bc_\bo_\bl_\bo_\br] [-window] [-root]  [-mono]  [-install]
-       [-visual _\bv_\bi_\bs_\bu_\ba_\bl] [-transparent] [-non-transparent] [-addi-
-       tive] [-subtractive] [-xor] [-no-xor]
-
-D\bDE\bES\bSC\bCR\bRI\bIP\bPT\bTI\bIO\bON\bN
-       The _\bg_\bo_\bo_\bp program draws a simulation of bubbles  in  layers
-       of overlapping multicolored translucent fluid.
-
-O\bOP\bPT\bTI\bIO\bON\bNS\bS
-       _\bg_\bo_\bo_\bp accepts the following options:
-
-       -\b-w\bwi\bin\bnd\bdo\bow\bw Draw  on  a  newly-created  window.   This  is the
-               default.
-
-       -\b-r\bro\boo\bot\bt   Draw on the root window.
-
-       -\b-m\bmo\bon\bno\bo   If  on  a  color  display,  pretend  we're  on   a
-               monochrome display.
-
-       -\b-i\bin\bns\bst\bta\bal\bll\bl
-               Install a private colormap for the window.
-
-       -\b-v\bvi\bis\bsu\bua\bal\bl _\bv_\bi_\bs_\bu_\ba_\bl
-               Specify which visual to use.  Legal values are the
-               name of a visual class, or the id number  (decimal
-               or hex) of a specific visual.
-
-       -\b-c\bco\bou\bun\bnt\bt _\bi_\bn_\bt_\be_\bg_\be_\br
-               How many bubbles to draw per layer.  Default: ran-
-               dom.
-
-       -\b-l\bla\bay\bye\ber\brs\bs _\bi_\bn_\bt_\be_\bg_\be_\br
-               How many layers to draw.  Default:  random,  based
-               on screen depth.
-
-       -\b-d\bde\bel\bla\bay\by _\bm_\bi_\bc_\br_\bo_\bs_\be_\bc_\bo_\bn_\bd_\bs
-               How  much  of a delay should be introduced between
-               steps of the animation.  Default 100000, or  about
-               1/10th second.
-
-       -\b-t\btr\bra\ban\bns\bsp\bpa\bar\bre\ben\bnt\bt
-               If _\b-_\bl_\ba_\by_\be_\br_\bs is greater than 1, then each layer will
-               be drawn in one color, and when they overlap,  the
-               colors will be mixed. This is the default.
-
-       -\b-n\bno\bon\bn-\b-t\btr\bra\ban\bns\bsp\bpa\bar\bre\ben\bnt\bt
-               Turns off _\b-_\bt_\br_\ba_\bn_\bs_\bp_\ba_\br_\be_\bn_\bt.
-
-
-
-
-
-X Version 11                11-Jun-97                           1
-
-
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-       -\b-a\bad\bdd\bdi\bit\bti\biv\bve\be
-               If  _\b-_\bt_\br_\ba_\bn_\bs_\bp_\ba_\br_\be_\bn_\bt  is  specified,  then this option
-               means that the colors will be mixed using an addi-
-               tive  color  model, as if the blobs were projected
-               light.  This is the default.
-
-       -\b-s\bsu\bub\bbt\btr\bra\bac\bct\bti\biv\bve\be
-               If _\b-_\bt_\br_\ba_\bn_\bs_\bp_\ba_\br_\be_\bn_\bt is  specified,  then  this  option
-               means  that  the colors will be mixed using a sub-
-               tractive  color  model,  as  if  the  blobs   were
-               translucent filters.
-
-       -\b-x\bxo\bor\br    Draw with xor instead of the other color tricks.
-
-E\bEN\bNV\bVI\bIR\bRO\bON\bNM\bME\bEN\bNT\bT
-       D\bDI\bIS\bSP\bPL\bLA\bAY\bY to get the default host and display number.
-
-       X\bXE\bEN\bNV\bVI\bIR\bRO\bON\bNM\bME\bEN\bNT\bT
-               to  get the name of a resource file that overrides
-               the global resources stored in  the  RESOURCE_MAN-
-               AGER property.
-
-S\bSE\bEE\bE A\bAL\bLS\bSO\bO
-       X\bX(1), x\bxs\bsc\bcr\bre\bee\ben\bns\bsa\bav\bve\ber\br(1)
-
-C\bCO\bOP\bPY\bYR\bRI\bIG\bGH\bHT\bT
-       Copyright  (C) 1997 by Jamie Zawinski.  Permission to use,
-       copy, modify, distribute, and sell this software  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.   No
-       representations  are  made  about  the suitability of this
-       software for any purpose.  It is provided "as is"  without
-       express or implied warranty.
-
-A\bAU\bUT\bTH\bHO\bOR\bR
-       Jamie Zawinski <jwz@jwz.org>, 11-Jun-97.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-X Version 11                11-Jun-97                           2
-
-
diff --git a/local/man/cat.1/grav.1 b/local/man/cat.1/grav.1
deleted file mode 100644 (file)
index 1a9edb4..0000000
+++ /dev/null
@@ -1,132 +0,0 @@
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-N\bNA\bAM\bME\bE
-       grav - draws a simple orbital simulation
-
-S\bSY\bYN\bNO\bOP\bPS\bSI\bIS\bS
-       g\bgr\bra\bav\bv  [-display  _\bh_\bo_\bs_\bt_\b:_\bd_\bi_\bs_\bp_\bl_\ba_\by_\b._\bs_\bc_\br_\be_\be_\bn]  [-foreground _\bc_\bo_\bl_\bo_\br]
-       [-background _\bc_\bo_\bl_\bo_\br] [-window] [-root]  [-mono]  [-install]
-       [-visual  _\bv_\bi_\bs_\bu_\ba_\bl] [-ncolors _\bi_\bn_\bt_\be_\bg_\be_\br] [-delay _\bm_\bi_\bc_\br_\bo_\bs_\be_\bc_\bo_\bn_\bd_\bs]
-       [-count _\bi_\bn_\bt_\be_\bg_\be_\br] [-decay] [-no-decay] [-trail] [-no-trail]
-
-
-D\bDE\bES\bSC\bCR\bRI\bIP\bPT\bTI\bIO\bON\bN
-       The _\bg_\br_\ba_\bv program draws a simple orbital simulation
-
-O\bOP\bPT\bTI\bIO\bON\bNS\bS
-       _\bg_\br_\ba_\bv accepts the following options:
-
-       -\b-w\bwi\bin\bnd\bdo\bow\bw Draw  on  a  newly-created  window.   This  is the
-               default.
-
-       -\b-r\bro\boo\bot\bt   Draw on the root window.
-
-       -\b-m\bmo\bon\bno\bo   If  on  a  color  display,  pretend  we're  on   a
-               monochrome display.
-
-       -\b-i\bin\bns\bst\bta\bal\bll\bl
-               Install a private colormap for the window.
-
-       -\b-v\bvi\bis\bsu\bua\bal\bl _\bv_\bi_\bs_\bu_\ba_\bl
-               Specify which visual to use.  Legal values are the
-               name of a visual class, or the id number  (decimal
-               or hex) of a specific visual.
-
-       -\b-n\bnc\bco\bol\blo\bor\brs\bs _\bi_\bn_\bt_\be_\bg_\be_\br
-               How  many  colors  should  be  used (if possible).
-               Default 200.  The colors are chosen randomly.
-
-       -\b-c\bco\bou\bun\bnt\bt _\bi_\bn_\bt_\be_\bg_\be_\br
-               Default 12.
-
-       -\b-d\bde\bec\bca\bay\by
-
-       -\b-n\bno\bo-\b-e\bec\bca\bay\by
-               Whether orbits should decay.
-
-
-       -\b-t\btr\bra\bai\bil\bl
-
-       -\b-n\bno\bo-\b-t\btr\bra\bai\bil\bl
-               Whether the objects  should  leave  trails  behind
-               them  (makes it look vaguely like a cloud-chamber.
-
-
-E\bEN\bNV\bVI\bIR\bRO\bON\bNM\bME\bEN\bNT\bT
-       D\bDI\bIS\bSP\bPL\bLA\bAY\bY to get the default host and display number.
-
-
-
-X Version 11                10-May-97                           1
-
-
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-       X\bXE\bEN\bNV\bVI\bIR\bRO\bON\bNM\bME\bEN\bNT\bT
-               to get the name of a resource file that  overrides
-               the  global  resources stored in the RESOURCE_MAN-
-               AGER property.
-
-S\bSE\bEE\bE A\bAL\bLS\bSO\bO
-       X\bX(1), x\bxs\bsc\bcr\bre\bee\ben\bns\bsa\bav\bve\ber\br(1), x\bxl\blo\boc\bck\bk(1)
-
-C\bCO\bOP\bPY\bYR\bRI\bIG\bGH\bHT\bT
-       Copyright (C) 1993 by Greg Bowering.
-
-       Permission to use, copy, modify, and distribute this soft-
-       ware 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.
-
-A\bAU\bUT\bTH\bHO\bOR\bR
-       Greg Bowering <greg@smug.student.adelaide.edu.au>, 1993.
-
-       Ability  to  run  standalone or with _\bx_\bs_\bc_\br_\be_\be_\bn_\bs_\ba_\bv_\be_\br added by
-       Jamie Zawinski <jwz@jwz.org>, 10-May-97.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-X Version 11                10-May-97                           2
-
-
diff --git a/local/man/cat.1/greynetic.1 b/local/man/cat.1/greynetic.1
deleted file mode 100644 (file)
index 7280236..0000000
+++ /dev/null
@@ -1,132 +0,0 @@
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-N\bNA\bAM\bME\bE
-       greynetic - draw random stippled/color rectangles
-
-S\bSY\bYN\bNO\bOP\bPS\bSI\bIS\bS
-       g\bgr\bre\bey\byn\bne\bet\bti\bic\bc   [-display   _\bh_\bo_\bs_\bt_\b:_\bd_\bi_\bs_\bp_\bl_\ba_\by_\b._\bs_\bc_\br_\be_\be_\bn]  [-foreground
-       _\bc_\bo_\bl_\bo_\br]  [-background  _\bc_\bo_\bl_\bo_\br]  [-window]  [-root]   [-mono]
-       [-install] [-visual _\bv_\bi_\bs_\bu_\ba_\bl] [-delay _\bu_\bs_\be_\bc_\bs]
-
-D\bDE\bES\bSC\bCR\bRI\bIP\bPT\bTI\bIO\bON\bN
-       The _\bg_\br_\be_\by_\bn_\be_\bt_\bi_\bc program draws random rectangles.
-
-O\bOP\bPT\bTI\bIO\bON\bNS\bS
-       _\bg_\br_\be_\by_\bn_\be_\bt_\bi_\bc accepts the following options:
-
-       -\b-w\bwi\bin\bnd\bdo\bow\bw Draw  on  a  newly-created  window.   This  is the
-               default.
-
-       -\b-r\bro\boo\bot\bt   Draw on the root window.
-
-       -\b-m\bmo\bon\bno\bo   If  on  a  color  display,  pretend  we're  on   a
-               monochrome display.
-
-       -\b-i\bin\bns\bst\bta\bal\bll\bl
-               Install a private colormap for the window.
-
-       -\b-v\bvi\bis\bsu\bua\bal\bl _\bv_\bi_\bs_\bu_\ba_\bl
-               Specify which visual to use.  Legal values are the
-               name of a visual class, or the id number  (decimal
-               or hex) of a specific visual.
-
-       -\b-d\bde\bel\bla\bay\by _\bm_\bi_\bc_\br_\bo_\bs_\be_\bc_\bo_\bn_\bd_\bs
-               Slow it down.
-
-E\bEN\bNV\bVI\bIR\bRO\bON\bNM\bME\bEN\bNT\bT
-       D\bDI\bIS\bSP\bPL\bLA\bAY\bY to get the default host and display number.
-
-       X\bXE\bEN\bNV\bVI\bIR\bRO\bON\bNM\bME\bEN\bNT\bT
-               to  get the name of a resource file that overrides
-               the global resources stored in  the  RESOURCE_MAN-
-               AGER property.
-
-S\bSE\bEE\bE A\bAL\bLS\bSO\bO
-       X\bX(1), x\bxs\bsc\bcr\bre\bee\ben\bns\bsa\bav\bve\ber\br(1)
-
-C\bCO\bOP\bPY\bYR\bRI\bIG\bGH\bHT\bT
-       Copyright  (C) 1992 by Jamie Zawinski.  Permission to use,
-       copy, modify, distribute, and sell this software  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.   No
-       representations  are  made  about  the suitability of this
-       software for any purpose.  It is provided "as is"  without
-       express or implied warranty.
-
-
-
-X Version 11                13-aug-92                           1
-
-
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-A\bAU\bUT\bTH\bHO\bOR\bR
-       Jamie Zawinski <jwz@jwz.org>, 13-aug-92.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-X Version 11                13-aug-92                           2
-
-
diff --git a/local/man/cat.1/halo.1 b/local/man/cat.1/halo.1
deleted file mode 100644 (file)
index e5668e2..0000000
+++ /dev/null
@@ -1,132 +0,0 @@
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-N\bNA\bAM\bME\bE
-       halo - draw circular patterns
-
-S\bSY\bYN\bNO\bOP\bPS\bSI\bIS\bS
-       h\bha\bal\blo\bo  [-display  _\bh_\bo_\bs_\bt_\b:_\bd_\bi_\bs_\bp_\bl_\ba_\by_\b._\bs_\bc_\br_\be_\be_\bn]  [-foreground _\bc_\bo_\bl_\bo_\br]
-       [-background _\bc_\bo_\bl_\bo_\br] [-window] [-root]  [-mono]  [-install]
-       [-visual  _\bv_\bi_\bs_\bu_\ba_\bl] [-count _\bi_\bn_\bt] [-delay _\bu_\bs_\be_\bc_\bs] [-mode seuss
-       | ramp | random ] [-animate]  [-colors  _\bi_\bn_\bt_\be_\bg_\be_\br]  [-cycle]
-       [-no-cycle] [-cycle-delay _\bu_\bs_\be_\bc_\bs]
-
-D\bDE\bES\bSC\bCR\bRI\bIP\bPT\bTI\bIO\bON\bN
-       The _\bh_\ba_\bl_\bo program draws cool patterns based on circles.
-
-O\bOP\bPT\bTI\bIO\bON\bNS\bS
-       _\bh_\ba_\bl_\bo accepts the following options:
-
-       -\b-w\bwi\bin\bnd\bdo\bow\bw Draw  on  a  newly-created  window.   This  is the
-               default.
-
-       -\b-r\bro\boo\bot\bt   Draw on the root window.
-
-       -\b-m\bmo\bon\bno\bo   If  on  a  color  display,  pretend  we're  on   a
-               monochrome display.
-
-       -\b-i\bin\bns\bst\bta\bal\bll\bl
-               Install a private colormap for the window.
-
-       -\b-v\bvi\bis\bsu\bua\bal\bl _\bv_\bi_\bs_\bu_\ba_\bl
-               Specify which visual to use.  Legal values are the
-               name of a visual class, or the id number  (decimal
-               or hex) of a specific visual.
-
-       -\b-c\bco\bou\bun\bnt\bt _\bi_\bn_\bt_\be_\bg_\be_\br
-               How many circles to draw.  Default 0, meaning ran-
-               dom.
-
-       -\b-m\bmo\bod\bde\be s\bse\beu\bus\bss\bs |\b| r\bra\bam\bmp\bp |\b| r\bra\ban\bnd\bdo\bom\bm
-               In _\bs_\be_\bu_\bs_\bs mode, alternating striped curves will  be
-               drawn.
-
-               In _\br_\ba_\bm_\bp mode, a color ramp will be drawn.
-
-               _\br_\ba_\bn_\bd_\bo_\bm means pick the mode randomly.
-
-       -\b-d\bde\bel\bla\bay\by _\bm_\bi_\bc_\br_\bo_\bs_\be_\bc_\bo_\bn_\bd_\bs
-               How  much  of a delay should be introduced between
-               steps of the animation.  Default 100000, or  about
-               0.1 second.
-
-       -\b-c\bco\bol\blo\bor\brs\bs _\bi_\bn_\bt_\be_\bg_\be_\br
-               How many colors to use.  Default 100.
-
-       -\b-a\ban\bni\bim\bma\bat\bte\be
-               If specified, then the centerpoints of the circles
-
-
-
-X Version 11                12-Jun-97                           1
-
-
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-               will bounce around.  Otherwise, the  circles  will
-               be  drawn  once,  erased, and a new set of circles
-               will be drawn.
-
-       -\b-c\bcy\byc\bcl\ble\be
-
-       -\b-n\bno\bo-\b-c\bcy\byc\bcl\ble\be
-               Whether to do colormap  cycling.   Default  is  to
-               cycle.
-
-       -\b-c\bcy\byc\bcl\ble\be-\b-d\bde\bel\bla\bay\by
-               Number  of microseconds between shifts of the col-
-               ormap; default 100000, or 1/10th second.
-
-E\bEN\bNV\bVI\bIR\bRO\bON\bNM\bME\bEN\bNT\bT
-       D\bDI\bIS\bSP\bPL\bLA\bAY\bY to get the default host and display number.
-
-       X\bXE\bEN\bNV\bVI\bIR\bRO\bON\bNM\bME\bEN\bNT\bT
-               to get the name of a resource file that  overrides
-               the  global  resources stored in the RESOURCE_MAN-
-               AGER property.
-
-S\bSE\bEE\bE A\bAL\bLS\bSO\bO
-       X\bX(1), x\bxs\bsc\bcr\bre\bee\ben\bns\bsa\bav\bve\ber\br(1)
-
-C\bCO\bOP\bPY\bYR\bRI\bIG\bGH\bHT\bT
-       Copyright (C) 1993 by Jamie Zawinski.  Permission to  use,
-       copy,  modify,  distribute, and sell this software 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.  No
-       representations are made about  the  suitability  of  this
-       software  for any purpose.  It is provided "as is" without
-       express or implied warranty.
-
-A\bAU\bUT\bTH\bHO\bOR\bR
-       Jamie Zawinski <jwz@jwz.org>, 6-jul-93.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-X Version 11                12-Jun-97                           2
-
-
diff --git a/local/man/cat.1/helix.1 b/local/man/cat.1/helix.1
deleted file mode 100644 (file)
index 2b74553..0000000
+++ /dev/null
@@ -1,132 +0,0 @@
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-N\bNA\bAM\bME\bE
-       helix - draw helical string-art patterns
-
-S\bSY\bYN\bNO\bOP\bPS\bSI\bIS\bS
-       h\bhe\bel\bli\bix\bx  [-display  _\bh_\bo_\bs_\bt_\b:_\bd_\bi_\bs_\bp_\bl_\ba_\by_\b._\bs_\bc_\br_\be_\be_\bn] [-foreground _\bc_\bo_\bl_\bo_\br]
-       [-background    _\bc_\bo_\bl_\bo_\br]    [-window]    [-root]     [-mono]
-       [-erase-speed  _\bu_\bs_\be_\bc_\bs]  [-erase-mode  _\bi_\bn_\bt_\be_\bg_\be_\br] [-delay _\bs_\be_\bc_\b-
-       _\bo_\bn_\bd_\bs] [-install] [-visual _\bv_\bi_\bs_\bu_\ba_\bl]
-
-D\bDE\bES\bSC\bCR\bRI\bIP\bPT\bTI\bIO\bON\bN
-       The _\bh_\be_\bl_\bi_\bx program draws interesting patterns  composed  of
-       line segments in random colors.
-
-O\bOP\bPT\bTI\bIO\bON\bNS\bS
-       _\bh_\be_\bl_\bi_\bx accepts the following options:
-
-       -\b-w\bwi\bin\bnd\bdo\bow\bw Draw  on  a  newly-created  window.   This  is the
-               default.
-
-       -\b-r\bro\boo\bot\bt   Draw on the root window.
-
-       -\b-m\bmo\bon\bno\bo   If  on  a  color  display,  pretend  we're  on   a
-               monochrome display.
-
-       -\b-e\ber\bra\bas\bse\be-\b-s\bsp\bpe\bee\bed\bd _\bu_\bs_\be_\bc_\bs
-               This  controls  the speed at which the screen will
-               be erased. Lower numbers erase faster.
-
-       -\b-e\ber\bra\bas\bse\be-\b-m\bmo\bod\bde\be _\bi_\bn_\bt_\be_\bg_\be_\br
-               This sets the erase mode. Mode -1 chooses a random
-               mode  each  time.  There  are  currently  6  modes
-               defined (0-5).
-
-       -\b-d\bde\bel\bla\bay\by _\bs_\be_\bc_\bo_\bn_\bd_\bs
-               This sets the number of  seconds  that  the  helix
-               will be on the screen.
-
-       -\b-i\bin\bns\bst\bta\bal\bll\bl
-               Install a private colormap for the window.
-
-       -\b-v\bvi\bis\bsu\bua\bal\bl _\bv_\bi_\bs_\bu_\ba_\bl
-               Specify which visual to use.  Legal values are the
-               name of a visual class, or the id number  (decimal
-               or hex) of a specific visual.
-
-E\bEN\bNV\bVI\bIR\bRO\bON\bNM\bME\bEN\bNT\bT
-       D\bDI\bIS\bSP\bPL\bLA\bAY\bY to get the default host and display number.
-
-       X\bXE\bEN\bNV\bVI\bIR\bRO\bON\bNM\bME\bEN\bNT\bT
-               to  get the name of a resource file that overrides
-               the global resources stored in  the  RESOURCE_MAN-
-               AGER property.
-
-
-
-
-
-X Version 11                18-sep-97                           1
-
-
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-S\bSE\bEE\bE A\bAL\bLS\bSO\bO
-       X\bX(1), x\bxs\bsc\bcr\bre\bee\ben\bns\bsa\bav\bve\ber\br(1)
-
-C\bCO\bOP\bPY\bYR\bRI\bIG\bGH\bHT\bT
-       Copyright  (C) 1992 by Jamie Zawinski.  Permission to use,
-       copy, modify, distribute, and sell this software  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.   No
-       representations  are  made  about  the suitability of this
-       software for any purpose.  It is provided "as is"  without
-       express or implied warranty.
-
-A\bAU\bUT\bTH\bHO\bOR\bR
-       Jamie  Zawinski  <jwz@jwz.org>,  13-aug-92.  Screen eraser
-       improved by Johannes Keukelaar <johannes@nada.kth.se>,
-        18-sep-97.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-X Version 11                18-sep-97                           2
-
-
diff --git a/local/man/cat.1/hopalong.1 b/local/man/cat.1/hopalong.1
deleted file mode 100644 (file)
index fe9dafb..0000000
+++ /dev/null
@@ -1,132 +0,0 @@
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-N\bNA\bAM\bME\bE
-       hopalong - draw real plane fractals
-
-S\bSY\bYN\bNO\bOP\bPS\bSI\bIS\bS
-       h\bho\bop\bpa\bal\blo\bon\bng\bg   [-display   _\bh_\bo_\bs_\bt_\b:_\bd_\bi_\bs_\bp_\bl_\ba_\by_\b._\bs_\bc_\br_\be_\be_\bn]   [-foreground
-       _\bc_\bo_\bl_\bo_\br]  [-background  _\bc_\bo_\bl_\bo_\br]  [-window]  [-root]   [-mono]
-       [-install]  [-visual  _\bv_\bi_\bs_\bu_\ba_\bl]  [-ncolors  _\bi_\bn_\bt_\be_\bg_\be_\br] [-delay
-       _\bm_\bi_\bc_\br_\bo_\bs_\be_\bc_\bo_\bn_\bd_\bs] [-cycles _\bi_\bn_\bt_\be_\bg_\be_\br] [-count  _\bi_\bn_\bt_\be_\bg_\be_\br]  [-jong]
-       [-no-jong] [-jong] [-no-sine]
-
-
-D\bDE\bES\bSC\bCR\bRI\bIP\bPT\bTI\bIO\bON\bN
-       The  _\bh_\bo_\bp_\ba_\bl_\bo_\bn_\bg  program  generates  real  plane fractals as
-       described in the September 1986 issue of Scientific Ameri-
-       can.
-
-O\bOP\bPT\bTI\bIO\bON\bNS\bS
-       _\bh_\bo_\bp_\ba_\bl_\bo_\bn_\bg accepts the following options:
-
-       -\b-w\bwi\bin\bnd\bdo\bow\bw Draw  on  a  newly-created  window.   This  is the
-               default.
-
-       -\b-r\bro\boo\bot\bt   Draw on the root window.
-
-       -\b-m\bmo\bon\bno\bo   If  on  a  color  display,  pretend  we're  on   a
-               monochrome display.
-
-       -\b-i\bin\bns\bst\bta\bal\bll\bl
-               Install a private colormap for the window.
-
-       -\b-v\bvi\bis\bsu\bua\bal\bl _\bv_\bi_\bs_\bu_\ba_\bl
-               Specify which visual to use.  Legal values are the
-               name of a visual class, or the id number  (decimal
-               or hex) of a specific visual.
-
-       -\b-n\bnc\bco\bol\blo\bor\brs\bs _\bi_\bn_\bt_\be_\bg_\be_\br
-               How  many  colors  should  be  used (if possible).
-               Default 200.  The colors used  cycle  through  the
-               hue, making N stops around the color wheel.
-
-       -\b-c\bcy\byc\bcl\ble\bes\bs _\bi_\bn_\bt_\be_\bg_\be_\br
-               How  long to run each batch.  Default 2500 pixels.
-
-       -\b-c\bco\bou\bun\bnt\bt _\bi_\bn_\bt_\be_\bg_\be_\br
-               How many pixels should be  drawn  before  a  color
-               change.  Default 1000.
-
-       -\b-j\bjo\bon\bng\bg _\bi_\bn_\bt_\be_\bg_\be_\br
-
-       -\b-n\bno\bo-\b-j\bjo\bon\bng\bg _\bi_\bn_\bt_\be_\bg_\be_\br
-               Whether  to  use  the  Jong  format (default is to
-               choose randomly.)
-
-
-
-
-
-X Version 11                10-May-97                           1
-
-
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-       -\b-s\bsi\bin\bne\be _\bi_\bn_\bt_\be_\bg_\be_\br
-
-       -\b-n\bno\bo-\b-s\bsi\bin\bne\be _\bi_\bn_\bt_\be_\bg_\be_\br
-               Whether to use the  Sine  format  (default  is  to
-               choose randomly.)
-
-
-E\bEN\bNV\bVI\bIR\bRO\bON\bNM\bME\bEN\bNT\bT
-       D\bDI\bIS\bSP\bPL\bLA\bAY\bY to get the default host and display number.
-
-       X\bXE\bEN\bNV\bVI\bIR\bRO\bON\bNM\bME\bEN\bNT\bT
-               to  get the name of a resource file that overrides
-               the global resources stored in  the  RESOURCE_MAN-
-               AGER property.
-
-S\bSE\bEE\bE A\bAL\bLS\bSO\bO
-       X\bX(1), x\bxs\bsc\bcr\bre\bee\ben\bns\bsa\bav\bve\ber\br(1), x\bxl\blo\boc\bck\bk(1)
-
-C\bCO\bOP\bPY\bYR\bRI\bIG\bGH\bHT\bT
-       Copyright (C) 1988-91 by Patrick J. Naughton.
-
-       Permission to use, copy, modify, and distribute this soft-
-       ware 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.
-
-A\bAU\bUT\bTH\bHO\bOR\bR
-       Patrick J. Naughton <naughton@eng.sun.com>, 23-mar-88.
-
-       Ability to run standalone or with  _\bx_\bs_\bc_\br_\be_\be_\bn_\bs_\ba_\bv_\be_\br  added  by
-       Jamie  Zawinski  <jwz@jwz.org>,  13-aug-92,  and  again on
-       10-May-97.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-X Version 11                10-May-97                           2
-
-
diff --git a/local/man/cat.1/hypercube.1 b/local/man/cat.1/hypercube.1
deleted file mode 100644 (file)
index 78f9a23..0000000
+++ /dev/null
@@ -1,132 +0,0 @@
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-N\bNA\bAM\bME\bE
-       hypercube - 2d projection of a 4d object
-
-S\bSY\bYN\bNO\bOP\bPS\bSI\bIS\bS
-       h\bhy\byp\bpe\ber\brc\bcu\bub\bbe\be   [-display   _\bh_\bo_\bs_\bt_\b:_\bd_\bi_\bs_\bp_\bl_\ba_\by_\b._\bs_\bc_\br_\be_\be_\bn]  [-foreground
-       _\bc_\bo_\bl_\bo_\br] [-background _\bc_\bo_\bl_\bo_\br] [-color[0-7] _\bc_\bo_\bl_\bo_\br] [-xy _\bf_\bl_\bo_\ba_\bt]
-       [-xz  _\bf_\bl_\bo_\ba_\bt]  [-yz  _\bf_\bl_\bo_\ba_\bt]  [-xw  _\bf_\bl_\bo_\ba_\bt]  [-yw _\bf_\bl_\bo_\ba_\bt] [-zw
-       _\bf_\bl_\bo_\ba_\bt] [-observer-z _\bi_\bn_\bt] [-delay _\bu_\bs_\be_\bc_\bs] [-window]  [-root]
-       [-mono] [-install] [-visual _\bv_\bi_\bs_\bu_\ba_\bl]
-
-D\bDE\bES\bSC\bCR\bRI\bIP\bPT\bTI\bIO\bON\bN
-       The _\bh_\by_\bp_\be_\br_\bc_\bu_\bb_\be program displays a wireframe projection of a
-       hypercube which is rotating at user-specified rates around
-       any or all of its four axes.
-
-O\bOP\bPT\bTI\bIO\bON\bNS\bS
-       _\bh_\by_\bp_\be_\br_\bc_\bu_\bb_\be accepts the following options:
-
-       -\b-w\bwi\bin\bnd\bdo\bow\bw Draw  on  a  newly-created  window.   This  is the
-               default.
-
-       -\b-r\bro\boo\bot\bt   Draw on the root window.
-
-       -\b-m\bmo\bon\bno\bo   If  on  a  color  display,  pretend  we're  on   a
-               monochrome display.
-
-       -\b-i\bin\bns\bst\bta\bal\bll\bl
-               Install a private colormap for the window.
-
-       -\b-v\bvi\bis\bsu\bua\bal\bl _\bv_\bi_\bs_\bu_\ba_\bl
-               Specify which visual to use.  Legal values are the
-               name of a visual class, or the id number  (decimal
-               or hex) of a specific visual.
-
-       -\b-d\bde\bel\bla\bay\by _\bm_\bi_\bc_\br_\bo_\bs_\be_\bc_\bo_\bn_\bd_\bs
-               How  much  of a delay should be introduced between
-               steps of the animation.  Default 100000, or  about
-               1/10th second.
-
-       -\b-o\bob\bbs\bse\ber\brv\bve\ber\br-\b-z\bz _\bi_\bn_\bt
-               How  far  away  the observer is from the center of
-               the cube (the cube is one unit per side.)  Default
-               5.
-
-       -\b-c\bco\bol\blo\bor\br0\b0 _\bc_\bo_\bl_\bo_\br
-
-       -\b-c\bco\bol\blo\bor\br1\b1 _\bc_\bo_\bl_\bo_\br
-
-       -\b-c\bco\bol\blo\bor\br2\b2 _\bc_\bo_\bl_\bo_\br
-
-       -\b-c\bco\bol\blo\bor\br3\b3 _\bc_\bo_\bl_\bo_\br
-
-       -\b-c\bco\bol\blo\bor\br4\b4 _\bc_\bo_\bl_\bo_\br
-
-
-
-
-X Version 11                 6-dec-92                           1
-
-
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-       -\b-c\bco\bol\blo\bor\br5\b5 _\bc_\bo_\bl_\bo_\br
-
-       -\b-c\bco\bol\blo\bor\br6\b6 _\bc_\bo_\bl_\bo_\br
-
-       -\b-c\bco\bol\blo\bor\br7\b7 _\bc_\bo_\bl_\bo_\br
-               The  colors used to draw the line segments border-
-               ing the eight faces of  the  cube.   Some  of  the
-               faces have only two of their border-lines drawn in
-               the specified color, and some have all four.
-
-       -\b-x\bxw\bw _\bf_\bl_\bo_\ba_\bt
-
-       -\b-x\bxy\by _\bf_\bl_\bo_\ba_\bt
-
-       -\b-x\bxz\bz _\bf_\bl_\bo_\ba_\bt
-
-       -\b-y\byw\bw _\bf_\bl_\bo_\ba_\bt
-
-       -\b-y\byz\bz _\bf_\bl_\bo_\ba_\bt
-
-       -\b-z\bzw\bw _\bf_\bl_\bo_\ba_\bt
-               The amount that the cube should be rotated  around
-               the specified axis at each frame of the animation,
-               expressed  in  radians.   These  should  be  small
-               floating-point values (less than 0.05 works best.)
-               Default: xy=0.01, xz=0.005, yw=0.01.
-
-E\bEN\bNV\bVI\bIR\bRO\bON\bNM\bME\bEN\bNT\bT
-       D\bDI\bIS\bSP\bPL\bLA\bAY\bY to get the default host and display number.
-
-       X\bXE\bEN\bNV\bVI\bIR\bRO\bON\bNM\bME\bEN\bNT\bT
-               to get the name of a resource file that  overrides
-               the  global  resources stored in the RESOURCE_MAN-
-               AGER property.
-
-S\bSE\bEE\bE A\bAL\bLS\bSO\bO
-       X\bX(1), x\bxs\bsc\bcr\bre\bee\ben\bns\bsa\bav\bve\ber\br(1)
-
-C\bCO\bOP\bPY\bYR\bRI\bIG\bGH\bHT\bT
-       Copyright (C) 1992 by Jamie Zawinski.  Permission to  use,
-       copy,  modify,  distribute, and sell this software 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.  No
-       representations are made about  the  suitability  of  this
-       software  for any purpose.  It is provided "as is" without
-       express or implied warranty.
-
-A\bAU\bUT\bTH\bHO\bOR\bR
-       Jamie Zawinski <jwz@jwz.org>, 6-dec-92.
-
-
-
-
-
-
-X Version 11                 6-dec-92                           2
-
-
diff --git a/local/man/cat.1/ifs.1 b/local/man/cat.1/ifs.1
deleted file mode 100644 (file)
index b3a4a82..0000000
+++ /dev/null
@@ -1,132 +0,0 @@
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-N\bNA\bAM\bME\bE
-       ifs  -  draws spinning, colliding iterated-function-system
-       images
-
-S\bSY\bYN\bNO\bOP\bPS\bSI\bIS\bS
-       i\bif\bfs\bs  [-display  _\bh_\bo_\bs_\bt_\b:_\bd_\bi_\bs_\bp_\bl_\ba_\by_\b._\bs_\bc_\br_\be_\be_\bn]  [-foreground  _\bc_\bo_\bl_\bo_\br]
-       [-background  _\bc_\bo_\bl_\bo_\br]  [-window] [-root] [-mono] [-install]
-       [-visual _\bv_\bi_\bs_\bu_\ba_\bl] [-ncolors _\bi_\bn_\bt_\be_\bg_\be_\br] [-delay _\bm_\bi_\bc_\br_\bo_\bs_\be_\bc_\bo_\bn_\bd_\bs]
-
-
-D\bDE\bES\bSC\bCR\bRI\bIP\bPT\bTI\bIO\bON\bN
-       The _\bi_\bf_\bs program draws spinning,  colliding  iterated-func-
-       tion-system images.
-
-O\bOP\bPT\bTI\bIO\bON\bNS\bS
-       _\bi_\bf_\bs accepts the following options:
-
-       -\b-w\bwi\bin\bnd\bdo\bow\bw Draw  on  a  newly-created  window.   This  is the
-               default.
-
-       -\b-r\bro\boo\bot\bt   Draw on the root window.
-
-       -\b-m\bmo\bon\bno\bo   If  on  a  color  display,  pretend  we're  on   a
-               monochrome display.
-
-       -\b-i\bin\bns\bst\bta\bal\bll\bl
-               Install a private colormap for the window.
-
-       -\b-v\bvi\bis\bsu\bua\bal\bl _\bv_\bi_\bs_\bu_\ba_\bl
-               Specify which visual to use.  Legal values are the
-               name of a visual class, or the id number  (decimal
-               or hex) of a specific visual.
-
-       -\b-n\bnc\bco\bol\blo\bor\brs\bs _\bi_\bn_\bt_\be_\bg_\be_\br
-               How  many  colors  should  be  used (if possible).
-               Default 200.  The colors used  cycle  through  the
-               hue, making N stops around the color wheel.
-
-E\bEN\bNV\bVI\bIR\bRO\bON\bNM\bME\bEN\bNT\bT
-       D\bDI\bIS\bSP\bPL\bLA\bAY\bY to get the default host and display number.
-
-       X\bXE\bEN\bNV\bVI\bIR\bRO\bON\bNM\bME\bEN\bNT\bT
-               to  get the name of a resource file that overrides
-               the global resources stored in  the  RESOURCE_MAN-
-               AGER property.
-
-S\bSE\bEE\bE A\bAL\bLS\bSO\bO
-       X\bX(1), x\bxs\bsc\bcr\bre\bee\ben\bns\bsa\bav\bve\ber\br(1), x\bxl\blo\boc\bck\bk(1)
-
-C\bCO\bOP\bPY\bYR\bRI\bIG\bGH\bHT\bT
-       Copyright (C) 1997 by Massimino Pascal.
-
-       Permission to use, copy, modify, and distribute this soft-
-       ware and its documentation for any purpose and without fee
-
-
-
-X Version 11                10-May-97                           1
-
-
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-       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.
-
-A\bAU\bUT\bTH\bHO\bOR\bR
-       Massimino Pascal <Pascal.Massimon@ens.fr>, 1997.
-
-       Ability to run standalone or with  _\bx_\bs_\bc_\br_\be_\be_\bn_\bs_\ba_\bv_\be_\br  added  by
-       Jamie Zawinski <jwz@jwz.org>, 10-May-97.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-X Version 11                10-May-97                           2
-
-
diff --git a/local/man/cat.1/imsmap.1 b/local/man/cat.1/imsmap.1
deleted file mode 100644 (file)
index 4ec433c..0000000
+++ /dev/null
@@ -1,132 +0,0 @@
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-N\bNA\bAM\bME\bE
-       imsmap - generate fractal maps
-
-S\bSY\bYN\bNO\bOP\bPS\bSI\bIS\bS
-       i\bim\bms\bsm\bma\bap\bp  [-display _\bh_\bo_\bs_\bt_\b:_\bd_\bi_\bs_\bp_\bl_\ba_\by_\b._\bs_\bc_\br_\be_\be_\bn] [-foreground _\bc_\bo_\bl_\bo_\br]
-       [-background _\bc_\bo_\bl_\bo_\br] [-window] [-root]  [-mono]  [-install]
-       [-visual  _\bv_\bi_\bs_\bu_\ba_\bl] [-ncolors _\bi_\bn_\bt] [-delay _\bs_\be_\bc_\bo_\bn_\bd_\bs] [-itera-
-       tions _\bi_\bn_\bt] [-mode h|s|v|random] [-cycle] [-no-cycle]
-
-D\bDE\bES\bSC\bCR\bRI\bIP\bPT\bTI\bIO\bON\bN
-       The _\bi_\bm_\bs_\bm_\ba_\bp program generates map or  cloud-like  patterns.
-       It looks quite different in monochrome and color.
-
-O\bOP\bPT\bTI\bIO\bON\bNS\bS
-       _\bi_\bm_\bs_\bm_\ba_\bp accepts the following options:
-
-       -\b-w\bwi\bin\bnd\bdo\bow\bw Draw  on  a  newly-created  window.   This  is the
-               default.
-
-       -\b-r\bro\boo\bot\bt   Draw on the root window.
-
-       -\b-m\bmo\bon\bno\bo   If  on  a  color  display,  pretend  we're  on   a
-               monochrome display.
-
-       -\b-i\bin\bns\bst\bta\bal\bll\bl
-               Install a private colormap for the window.
-
-       -\b-v\bvi\bis\bsu\bua\bal\bl _\bv_\bi_\bs_\bu_\ba_\bl
-               Specify which visual to use.  Legal values are the
-               name of a visual class, or the id number  (decimal
-               or hex) of a specific visual.
-
-       -\b-n\bnc\bco\bol\blo\bor\brs\bs _\bi_\bn_\bt_\be_\bg_\be_\br
-               How many colors to use.  Default 50.
-
-       -\b-d\bde\bel\bla\bay\by _\bi_\bn_\bt_\be_\bg_\be_\br
-               How long to delay between images.  Default 10 sec-
-               onds.
-
-       -\b-i\bit\bte\ber\bra\bat\bti\bio\bon\bns\bs _\bi_\bn_\bt_\be_\bg_\be_\br
-               A measure  of  the  resolution  of  the  resultant
-               image, from 0 to 7.  Default 7.
-
-       -\b-m\bmo\bod\bde\be [\b[ h\bhu\bue\be |\b| s\bsa\bat\btu\bur\bra\bat\bti\bio\bon\bn |\b| v\bva\bal\blu\bue\be |\b| r\bra\ban\bnd\bdo\bom\bm ]\b]
-               The  axis upon which colors should be interpolated
-               between  the  foreground  and  background   color.
-               Default random.
-
-       -\b-c\bcy\byc\bcl\ble\be
-
-       -\b-n\bno\bo-\b-c\bcy\byc\bcl\ble\be
-               Whether  to  do  colormap  cycling.  Default is to
-               cycle.
-
-
-
-
-X Version 11                17-May-97                           1
-
-
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-       -\b-c\bcy\byc\bcl\ble\be-\b-d\bde\bel\bla\bay\by
-               Number of microseconds between shifts of the  col-
-               ormap; default 100000, or 1/10th second.
-
-E\bEN\bNV\bVI\bIR\bRO\bON\bNM\bME\bEN\bNT\bT
-       D\bDI\bIS\bSP\bPL\bLA\bAY\bY to get the default host and display number.
-
-       X\bXE\bEN\bNV\bVI\bIR\bRO\bON\bNM\bME\bEN\bNT\bT
-               to  get the name of a resource file that overrides
-               the global resources stored in  the  RESOURCE_MAN-
-               AGER property.
-
-S\bSE\bEE\bE A\bAL\bLS\bSO\bO
-       X\bX(1), x\bxs\bsc\bcr\bre\bee\ben\bns\bsa\bav\bve\ber\br(1)
-
-A\bAU\bUT\bTH\bHO\bOR\bR
-       Juergen Nickelsen <nickel@cs.tu-berlin.de>, 23-aug-92.
-
-       Hacked  on  by  Jamie  Zawinski  <jwz@jwz.org>, 24-aug-92,
-       17-May-97.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-X Version 11                17-May-97                           2
-
-
diff --git a/local/man/cat.1/jigsaw.1 b/local/man/cat.1/jigsaw.1
deleted file mode 100644 (file)
index 21893bb..0000000
+++ /dev/null
@@ -1,132 +0,0 @@
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-N\bNA\bAM\bME\bE
-       jigsaw - permute the screen image like a jigsaw puzzle
-
-S\bSY\bYN\bNO\bOP\bPS\bSI\bIS\bS
-       j\bji\big\bgs\bsa\baw\bw  [-display _\bh_\bo_\bs_\bt_\b:_\bd_\bi_\bs_\bp_\bl_\ba_\by_\b._\bs_\bc_\br_\be_\be_\bn] [-background _\bc_\bo_\bl_\bo_\br]
-       [-delay  _\bu_\bs_\be_\bc_\bs]  [-window]  [-root]  [-install]   [-visual
-       _\bv_\bi_\bs_\bu_\ba_\bl]
-
-D\bDE\bES\bSC\bCR\bRI\bIP\bPT\bTI\bIO\bON\bN
-       The _\bj_\bi_\bg_\bs_\ba_\bw program takes an image of the screen, carves it
-       up into a jigsaw puzzle, shuffles it, and then solves  it.
-
-O\bOP\bPT\bTI\bIO\bON\bNS\bS
-       _\bj_\bi_\bg_\bs_\ba_\bw accepts the following options:
-
-       -\b-w\bwi\bin\bnd\bdo\bow\bw Draw  on  a  newly-created  window.   This  is the
-               default.
-
-       -\b-r\bro\boo\bot\bt   Draw on the root window.
-
-       -\b-i\bin\bns\bst\bta\bal\bll\bl
-               Install a private colormap for the window.
-
-       -\b-v\bvi\bis\bsu\bua\bal\bl _\bv_\bi_\bs_\bu_\ba_\bl
-               Specify which visual to use.  Legal values are the
-               name  of a visual class, or the id number (decimal
-               or hex) of a specific visual.
-
-       -\b-d\bde\bel\bla\bay\by _\bm_\bi_\bc_\br_\bo_\bs_\be_\bc_\bo_\bn_\bd_\bs
-               How long to wait between shuffling pieces; default
-               700000, or 0.7 seconds.
-
-R\bRE\bES\bSO\bOU\bUR\bRC\bCE\bES\bS
-       On  some systems (currently, only SGIs), this program can,
-       instead of grabbing a desktop image, grab a frame of video
-       from  an external camera and manipulate that instead.  The
-       following resources control that.
-
-
-       g\bgr\bra\bab\bbV\bVi\bid\bde\beo\boP\bPr\bro\bob\bba\bab\bbi\bil\bli\bit\bty\by (Float)
-               What portion of the time to grab video rather than
-               a  screen image, between 0.0 and 1.0.  Defaults to
-               0.5, or half the time.
-
-       v\bvi\bid\bde\beo\boD\bDe\bev\bvi\bic\bce\be (Integer)
-               The number of the default video  input  device  to
-               check  first.   If unspecified, the default camera
-               (from videopanel(1)) will be checked first.  After
-               that, all other available video input devices will
-               be checked in order.
-
-               The first one which  produces  a  non-black  image
-               will be used.  If all images are black, the others
-               will be re-checked a few times  before  giving  up
-
-
-
-X Version 11                25-Nov-97                           1
-
-
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-               and  falling  back  to  simply  grabbing a desktop
-               image (but note that this takes a few seconds,  so
-               if  you  don't  actually  have  any  video sources
-               hooked up, you should consider turning  off  video
-               grabbing  by setting g\bgr\bra\bab\bbV\bVi\bid\bde\beo\boP\bPr\bro\bob\bba\bab\bbi\bil\bli\bit\bty\by to 0.0.)
-
-       v\bvi\bid\bde\beo\boG\bGa\bai\bin\bn (Float)
-               The amount by which to brighten the grabbed image.
-               This defaults to 2.2.
-
-E\bEN\bNV\bVI\bIR\bRO\bON\bNM\bME\bEN\bNT\bT
-       D\bDI\bIS\bSP\bPL\bLA\bAY\bY to get the default host and display number.
-
-       X\bXE\bEN\bNV\bVI\bIR\bRO\bON\bNM\bME\bEN\bNT\bT
-               to  get the name of a resource file that overrides
-               the global resources stored in  the  RESOURCE_MAN-
-               AGER property.
-
-S\bSE\bEE\bE A\bAL\bLS\bSO\bO
-       X\bX(1), x\bxs\bsc\bcr\bre\bee\ben\bns\bsa\bav\bve\ber\br(1)
-
-C\bCO\bOP\bPY\bYR\bRI\bIG\bGH\bHT\bT
-       Copyright  (C) 1997 by Jamie Zawinski.  Permission to use,
-       copy, modify, distribute, and sell this software  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.   No
-       representations  are  made  about  the suitability of this
-       software for any purpose.  It is provided "as is"  without
-       express or implied warranty.
-
-A\bAU\bUT\bTH\bHO\bOR\bR
-       Jamie Zawinski <jwz@jwz.org>, 25-Nov-97.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-X Version 11                25-Nov-97                           2
-
-
diff --git a/local/man/cat.1/kaleidescope.1 b/local/man/cat.1/kaleidescope.1
deleted file mode 100644 (file)
index 8aa4652..0000000
+++ /dev/null
@@ -1,132 +0,0 @@
-
-
-
-Kaleidescpe(1)                                     Kaleidescpe(1)
-
-
-N\bNA\bAM\bME\bE
-       Kaleidescope - rotating line segments
-
-S\bSY\bYN\bNO\bOP\bPS\bSI\bIS\bS
-       k\bka\bal\ble\bei\bid\bde\bes\bsc\bco\bop\bpe\be  [-display  _\bh_\bo_\bs_\bt_\b:_\bd_\bi_\bs_\bp_\bl_\ba_\by_\b._\bs_\bc_\br_\be_\be_\bn] [-foreground
-       _\bc_\bo_\bl_\bo_\br] [-background _\bc_\bo_\bl_\bo_\br]  [-window]  [-root]  [-install]
-       [-visual  _\bv_\bi_\bs_\bu_\ba_\bl]  [-color_mode  _\bm_\bo_\bn_\bo  _\b|  _\bn_\bi_\bc_\be  _\b|  _\bg_\br_\be_\be_\bd_\by]
-       [-nsegments  _\bi_\bn_\bt]  [-ntrails  _\bi_\bn_\bt]  [-local_rotation  _\bi_\bn_\bt]
-       [-global_rotation   _\bi_\bn_\bt]   [-delay  _\bu_\bs_\be_\bc_\bs]  [-redmin  _\bi_\bn_\bt]
-       [-greenmin _\bi_\bn_\bt] [-bluemin _\bi_\bn_\bt]  [-redrange  _\bi_\bn_\bt]  [-green-
-       range _\bi_\bn_\bt] [-bluerange _\bi_\bn_\bt]
-
-D\bDE\bES\bSC\bCR\bRI\bIP\bPT\bTI\bIO\bON\bN
-       The  _\bk_\ba_\bl_\be_\bi_\bd_\be_\bs_\bc_\bo_\bp_\be program draws line segments in a symmet-
-       ric pattern that evolves over time.
-
-O\bOP\bPT\bTI\bIO\bON\bNS\bS
-       _\bk_\ba_\bl_\be_\bi_\bd_\be_\bs_\bc_\bo_\bp_\be accepts the following options:
-
-       -\b-r\bro\boo\bot\bt   Draw on the root window.
-
-       -\b-c\bco\bol\blo\bor\br_\b_m\bmo\bod\bde\be m\bmo\bon\bno\bo |\b| n\bni\bic\bce\be |\b| g\bgr\bre\bee\bed\bdy\by
-               Specify how kaleidescope uses  colors.  Mono  uses
-               just the default foreground and background colors.
-               Nice uses one color for each segment (specified by
-               nsegments).  Greedy uses (ntrails * nsegments) + 1
-               colors.
-
-       -\b-i\bin\bns\bst\bta\bal\bll\bl
-               Install a private colormap for the window.
-
-       -\b-v\bvi\bis\bsu\bua\bal\bl _\bv_\bi_\bs_\bu_\ba_\bl
-               Specify which visual to use.  Legal values are the
-               name  of a visual class, or the id number (decimal
-               or hex) of a specific visual.
-
-       -\b-n\bns\bse\beg\bgm\bme\ben\bnt\bts\bs i\bin\bnt\bte\beg\bge\ber\br
-               The number of segments to draw. Default is 7.
-
-       -\b-n\bnt\btr\bra\bai\bil\bls\bs i\bin\bnt\bte\beg\bge\ber\br
-               The number of trails to draw. Default is 100.
-
-       -\b-l\blo\boc\bca\bal\bl_\b_r\bro\bot\bta\bat\bti\bio\bon\bn i\bin\bnt\bte\beg\bge\ber\br
-               The rate at which  segments  rotate  around  their
-               center. Default is -59.
-
-       -\b-g\bgl\blo\bob\bba\bal\bl_\b_r\bro\bot\bta\bat\bti\bio\bon\bn i\bin\bnt\bte\beg\bge\ber\br
-               The  rate at which segments rotate around the cen-
-               ter of the window.  Default is 1.
-
-       -\b-r\bre\bed\bdm\bmi\bin\bn,\b, -\b-g\bgr\bre\bee\ben\bnm\bmi\bin\bn,\b, -\b-b\bbl\blu\bue\bem\bmi\bin\bn,\b, -\b-r\bre\bed\bdr\bra\ban\bng\bge\be,\b, -\b-g\bgr\bre\bee\ben\bnr\bra\ban\bng\bge\be,\b,
-               -\b-b\bbl\blu\bue\ber\bra\ban\bng\bge\be
-               All take an integer argument. When colors are ran-
-               domly chosen, they are chosen  from  the  interval
-
-
-
-X Version 11                14-Dec-95                           1
-
-
-
-
-
-Kaleidescpe(1)                                     Kaleidescpe(1)
-
-
-               min  to  min  plus  range. The minimums default to
-               30000. The ranges default to 20000.
-
-       -\b-d\bde\bel\bla\bay\by m\bmi\bic\bcr\bro\bos\bse\bec\bco\bon\bnd\bds\bs
-               How much of a delay should be  introduced  between
-               steps  of  the  animation.   Default  is 20000, or
-               about 5 frames a second.
-
-E\bEN\bNV\bVI\bIR\bRO\bON\bNM\bME\bEN\bNT\bT
-       D\bDI\bIS\bSP\bPL\bLA\bAY\bY to get the default host and display number.
-
-       X\bXE\bEN\bNV\bVI\bIR\bRO\bON\bNM\bME\bEN\bNT\bT
-               to get the name of a resource file that  overrides
-               the  global  resources stored in the RESOURCE_MAN-
-               AGER property.
-
-S\bSE\bEE\bE A\bAL\bLS\bSO\bO
-       X\bX(1), k\bka\bal\ble\bei\bid\bde\bes\bsc\bco\bop\bpe\be(1)
-
-C\bCO\bOP\bPY\bYR\bRI\bIG\bGH\bHT\bT
-       Copyright (C) 1997 by Ron Tapia.  Permission to use, copy,
-       modify,  distribute,  and sell this software and its docu-
-       mentation 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  per-
-       mission  notice  appear  in  supporting documentation.  No
-       representations are made about  the  suitability  of  this
-       software  for any purpose.  It is provided "as is" without
-       express or implied warranty.
-
-A\bAU\bUT\bTH\bHO\bOR\bR
-       Ron Tapia <tapia@nmia.com>, 20-Mar-97.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-X Version 11                14-Dec-95                           2
-
-
diff --git a/local/man/cat.1/lament.1 b/local/man/cat.1/lament.1
deleted file mode 100644 (file)
index a441a9b..0000000
+++ /dev/null
@@ -1,132 +0,0 @@
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-N\bNA\bAM\bME\bE
-       lament - animates the Lament Configuration
-
-S\bSY\bYN\bNO\bOP\bPS\bSI\bIS\bS
-       l\bla\bam\bme\ben\bnt\bt  [-display  _\bh_\bo_\bs_\bt_\b:_\bd_\bi_\bs_\bp_\bl_\ba_\by_\b._\bs_\bc_\br_\be_\be_\bn]  [-window] [-root]
-       [-install]  [-visual  _\bv_\bi_\bs_\bu_\ba_\bl]   [-texture]   [-no-texture]
-       [-wireframe]
-
-D\bDE\bES\bSC\bCR\bRI\bIP\bPT\bTI\bIO\bON\bN
-       The _\bl_\ba_\bm_\be_\bn_\bt program draws an animation of a particular puz-
-       zle box repeatedly solving itself.
-
-O\bOP\bPT\bTI\bIO\bON\bNS\bS
-       _\bl_\ba_\bm_\be_\bn_\bt accepts the following options:
-
-       -\b-w\bwi\bin\bnd\bdo\bow\bw Draw on  a  newly-created  window.   This  is  the
-               default.
-
-       -\b-r\bro\boo\bot\bt   Draw on the root window.
-
-       -\b-i\bin\bns\bst\bta\bal\bll\bl
-               Install a private colormap for the window.
-
-       -\b-v\bvi\bis\bsu\bua\bal\bl _\bv_\bi_\bs_\bu_\ba_\bl
-               Specify which visual to use.  Legal values are the
-               name of a visual class, or the id number  (decimal
-               or hex) of a specific visual.
-
-       -\b-t\bte\bex\bxt\btu\bur\bre\be
-               Use texture maps.  This is the default.
-
-       -\b-n\bno\bo-\b-t\bte\bex\bxt\btu\bur\bre\be
-               Do  not  use  texture  maps.   This  is boring and
-               wrong.
-
-       -\b-w\bwi\bir\bre\bef\bfr\bra\bam\bme\be
-               Only draw outlines.
-
-E\bEN\bNV\bVI\bIR\bRO\bON\bNM\bME\bEN\bNT\bT
-       D\bDI\bIS\bSP\bPL\bLA\bAY\bY to get the default host and display number.
-
-       X\bXE\bEN\bNV\bVI\bIR\bRO\bON\bNM\bME\bEN\bNT\bT
-               to get the name of a resource file that  overrides
-               the  global  resources stored in the RESOURCE_MAN-
-               AGER property.
-
-B\bBU\bUG\bGS\bS
-       This hack is glacially slow on machines  lacking  hardware
-       texture support.
-
-       Occasionally  opens  doors,  admitting  theologians of the
-       Order of the Gash.
-
-
-
-
-
-X Version 11                25-Jul-98                           1
-
-
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-S\bSE\bEE\bE A\bAL\bLS\bSO\bO
-       X\bX(1), x\bxs\bsc\bcr\bre\bee\ben\bns\bsa\bav\bve\ber\br(1)
-
-C\bCO\bOP\bPY\bYR\bRI\bIG\bGH\bHT\bT
-       Copyright (C) 1998 by Jamie Zawinski.  Permission to  use,
-       copy,  modify,  distribute, and sell this software 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.  No
-       representations are made about  the  suitability  of  this
-       software  for any purpose.  It is provided "as is" without
-       express or implied warranty.
-
-A\bAU\bUT\bTH\bHO\bOR\bR
-       Jamie Zawinski <jwz@jwz.org>, 25-Jul-98.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-X Version 11                25-Jul-98                           2
-
-
diff --git a/local/man/cat.1/laser.1 b/local/man/cat.1/laser.1
deleted file mode 100644 (file)
index f97588a..0000000
+++ /dev/null
@@ -1,132 +0,0 @@
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-N\bNA\bAM\bME\bE
-       laser - draws vaguely laser-like moving lines
-
-S\bSY\bYN\bNO\bOP\bPS\bSI\bIS\bS
-       l\bla\bas\bse\ber\br  [-display  _\bh_\bo_\bs_\bt_\b:_\bd_\bi_\bs_\bp_\bl_\ba_\by_\b._\bs_\bc_\br_\be_\be_\bn] [-foreground _\bc_\bo_\bl_\bo_\br]
-       [-background _\bc_\bo_\bl_\bo_\br] [-window] [-root]  [-mono]  [-install]
-       [-visual  _\bv_\bi_\bs_\bu_\ba_\bl] [-ncolors _\bi_\bn_\bt_\be_\bg_\be_\br] [-delay _\bm_\bi_\bc_\br_\bo_\bs_\be_\bc_\bo_\bn_\bd_\bs]
-       [-cycles _\bi_\bn_\bt_\be_\bg_\be_\br] [-count _\bi_\bn_\bt_\be_\bg_\be_\br]
-
-
-D\bDE\bES\bSC\bCR\bRI\bIP\bPT\bTI\bIO\bON\bN
-       The _\bl_\ba_\bs_\be_\br program draws vaguely laser-like moving lines
-
-O\bOP\bPT\bTI\bIO\bON\bNS\bS
-       _\bl_\ba_\bs_\be_\br accepts the following options:
-
-       -\b-w\bwi\bin\bnd\bdo\bow\bw Draw on  a  newly-created  window.   This  is  the
-               default.
-
-       -\b-r\bro\boo\bot\bt   Draw on the root window.
-
-       -\b-m\bmo\bon\bno\bo   If   on  a  color  display,  pretend  we're  on  a
-               monochrome display.
-
-       -\b-i\bin\bns\bst\bta\bal\bll\bl
-               Install a private colormap for the window.
-
-       -\b-v\bvi\bis\bsu\bua\bal\bl _\bv_\bi_\bs_\bu_\ba_\bl
-               Specify which visual to use.  Legal values are the
-               name  of a visual class, or the id number (decimal
-               or hex) of a specific visual.
-
-       -\b-n\bnc\bco\bol\blo\bor\brs\bs _\bi_\bn_\bt_\be_\bg_\be_\br
-               How many colors  should  be  used  (if  possible).
-               Default  64.   The  colors  used cycle through the
-               hue, making N stops around the color wheel.
-
-       -\b-c\bcy\byc\bcl\ble\bes\bs _\bi_\bn_\bt_\be_\bg_\be_\br
-               Default 200.
-
-       -\b-c\bco\bou\bun\bnt\bt _\bi_\bn_\bt_\be_\bg_\be_\br
-               Default 10.
-
-E\bEN\bNV\bVI\bIR\bRO\bON\bNM\bME\bEN\bNT\bT
-       D\bDI\bIS\bSP\bPL\bLA\bAY\bY to get the default host and display number.
-
-       X\bXE\bEN\bNV\bVI\bIR\bRO\bON\bNM\bME\bEN\bNT\bT
-               to get the name of a resource file that  overrides
-               the  global  resources stored in the RESOURCE_MAN-
-               AGER property.
-
-S\bSE\bEE\bE A\bAL\bLS\bSO\bO
-       X\bX(1), x\bxs\bsc\bcr\bre\bee\ben\bns\bsa\bav\bve\ber\br(1), x\bxl\blo\boc\bck\bk(1)
-
-
-
-
-X Version 11                10-May-97                           1
-
-
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-C\bCO\bOP\bPY\bYR\bRI\bIG\bGH\bHT\bT
-       Copyright (C) 1995 by Pascal Pensa.
-
-       Permission to use, copy, modify, and distribute this soft-
-       ware 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.
-
-A\bAU\bUT\bTH\bHO\bOR\bR
-       Pascal Pensa <pensa@aurora.unice.fr>, 1995.
-
-       Ability  to  run  standalone or with _\bx_\bs_\bc_\br_\be_\be_\bn_\bs_\ba_\bv_\be_\br added by
-       Jamie Zawinski <jwz@jwz.org>, 10-May-97.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-X Version 11                10-May-97                           2
-
-
diff --git a/local/man/cat.1/lightning.1 b/local/man/cat.1/lightning.1
deleted file mode 100644 (file)
index e30ef01..0000000
+++ /dev/null
@@ -1,132 +0,0 @@
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-N\bNA\bAM\bME\bE
-       lightning - draws fractal lightning bolts
-
-S\bSY\bYN\bNO\bOP\bPS\bSI\bIS\bS
-       l\bli\big\bgh\bht\btn\bni\bin\bng\bg   [-display   _\bh_\bo_\bs_\bt_\b:_\bd_\bi_\bs_\bp_\bl_\ba_\by_\b._\bs_\bc_\br_\be_\be_\bn]  [-foreground
-       _\bc_\bo_\bl_\bo_\br]  [-background  _\bc_\bo_\bl_\bo_\br]  [-window]  [-root]   [-mono]
-       [-install]  [-visual  _\bv_\bi_\bs_\bu_\ba_\bl]  [-ncolors  _\bi_\bn_\bt_\be_\bg_\be_\br] [-delay
-       _\bm_\bi_\bc_\br_\bo_\bs_\be_\bc_\bo_\bn_\bd_\bs]
-
-
-D\bDE\bES\bSC\bCR\bRI\bIP\bPT\bTI\bIO\bON\bN
-       The _\bl_\bi_\bg_\bh_\bt_\bn_\bi_\bn_\bg program draws fractal lightning bolts
-
-O\bOP\bPT\bTI\bIO\bON\bNS\bS
-       _\bl_\bi_\bg_\bh_\bt_\bn_\bi_\bn_\bg accepts the following options:
-
-       -\b-w\bwi\bin\bnd\bdo\bow\bw Draw on  a  newly-created  window.   This  is  the
-               default.
-
-       -\b-r\bro\boo\bot\bt   Draw on the root window.
-
-       -\b-m\bmo\bon\bno\bo   If   on  a  color  display,  pretend  we're  on  a
-               monochrome display.
-
-       -\b-i\bin\bns\bst\bta\bal\bll\bl
-               Install a private colormap for the window.
-
-       -\b-v\bvi\bis\bsu\bua\bal\bl _\bv_\bi_\bs_\bu_\ba_\bl
-               Specify which visual to use.  Legal values are the
-               name  of a visual class, or the id number (decimal
-               or hex) of a specific visual.
-
-       -\b-n\bnc\bco\bol\blo\bor\brs\bs _\bi_\bn_\bt_\be_\bg_\be_\br
-               How many colors  should  be  used  (if  possible).
-               Default 64.  The colors are chosen randomly.
-
-E\bEN\bNV\bVI\bIR\bRO\bON\bNM\bME\bEN\bNT\bT
-       D\bDI\bIS\bSP\bPL\bLA\bAY\bY to get the default host and display number.
-
-       X\bXE\bEN\bNV\bVI\bIR\bRO\bON\bNM\bME\bEN\bNT\bT
-               to  get the name of a resource file that overrides
-               the global resources stored in  the  RESOURCE_MAN-
-               AGER property.
-
-S\bSE\bEE\bE A\bAL\bLS\bSO\bO
-       X\bX(1), x\bxs\bsc\bcr\bre\bee\ben\bns\bsa\bav\bve\ber\br(1), x\bxl\blo\boc\bck\bk(1)
-
-C\bCO\bOP\bPY\bYR\bRI\bIG\bGH\bHT\bT
-       Copyright (C) 1996 by Keith Romberg.
-
-       Permission to use, copy, modify, and distribute this soft-
-       ware 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
-
-
-
-X Version 11                10-May-97                           1
-
-
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-       notice  and  this  permission  notice appear in supporting
-       documentation.
-
-A\bAU\bUT\bTH\bHO\bOR\bR
-       Keith Romberg <kromberg@saxe.com>, 27-Jun-96.
-
-       Ability to run standalone or with  _\bx_\bs_\bc_\br_\be_\be_\bn_\bs_\ba_\bv_\be_\br  added  by
-       Jamie Zawinski <jwz@jwz.org>, 10-May-97.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-X Version 11                10-May-97                           2
-
-
diff --git a/local/man/cat.1/lisa.1 b/local/man/cat.1/lisa.1
deleted file mode 100644 (file)
index ab6ba00..0000000
+++ /dev/null
@@ -1,132 +0,0 @@
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-N\bNA\bAM\bME\bE
-       lisa - draws animated full-loop lisajous figures
-
-S\bSY\bYN\bNO\bOP\bPS\bSI\bIS\bS
-       l\bli\bis\bsa\ba  [-display  _\bh_\bo_\bs_\bt_\b:_\bd_\bi_\bs_\bp_\bl_\ba_\by_\b._\bs_\bc_\br_\be_\be_\bn]  [-foreground _\bc_\bo_\bl_\bo_\br]
-       [-background _\bc_\bo_\bl_\bo_\br] [-window] [-root]  [-mono]  [-install]
-       [-visual  _\bv_\bi_\bs_\bu_\ba_\bl] [-ncolors _\bi_\bn_\bt_\be_\bg_\be_\br] [-delay _\bm_\bi_\bc_\br_\bo_\bs_\be_\bc_\bo_\bn_\bd_\bs]
-       [-cycles _\bi_\bn_\bt_\be_\bg_\be_\br] [-count _\bi_\bn_\bt_\be_\bg_\be_\br] [-size _\bi_\bn_\bt_\be_\bg_\be_\br]
-
-
-D\bDE\bES\bSC\bCR\bRI\bIP\bPT\bTI\bIO\bON\bN
-       The _\bl_\bi_\bs_\ba program draws animated  full-loop  lisajous  fig-
-       ures.
-
-O\bOP\bPT\bTI\bIO\bON\bNS\bS
-       _\bl_\bi_\bs_\ba accepts the following options:
-
-       -\b-w\bwi\bin\bnd\bdo\bow\bw Draw  on  a  newly-created  window.   This  is the
-               default.
-
-       -\b-r\bro\boo\bot\bt   Draw on the root window.
-
-       -\b-m\bmo\bon\bno\bo   If  on  a  color  display,  pretend  we're  on   a
-               monochrome display.
-
-       -\b-i\bin\bns\bst\bta\bal\bll\bl
-               Install a private colormap for the window.
-
-       -\b-v\bvi\bis\bsu\bua\bal\bl _\bv_\bi_\bs_\bu_\ba_\bl
-               Specify which visual to use.  Legal values are the
-               name of a visual class, or the id number  (decimal
-               or hex) of a specific visual.
-
-       -\b-n\bnc\bco\bol\blo\bor\brs\bs _\bi_\bn_\bt_\be_\bg_\be_\br
-               How  many  colors  should  be  used (if possible).
-               Default 200.  The colors are chosen randomly.
-
-       -\b-c\bcy\byc\bcl\ble\bes\bs _\bi_\bn_\bt_\be_\bg_\be_\br
-
-
-       -\b-c\bco\bou\bun\bnt\bt _\bi_\bn_\bt_\be_\bg_\be_\br
-
-
-       -\b-s\bsi\biz\bze\be _\bi_\bn_\bt_\be_\bg_\be_\br
-
-
-E\bEN\bNV\bVI\bIR\bRO\bON\bNM\bME\bEN\bNT\bT
-       D\bDI\bIS\bSP\bPL\bLA\bAY\bY to get the default host and display number.
-
-       X\bXE\bEN\bNV\bVI\bIR\bRO\bON\bNM\bME\bEN\bNT\bT
-               to get the name of a resource file that  overrides
-               the  global  resources stored in the RESOURCE_MAN-
-               AGER property.
-
-
-
-
-X Version 11                27-May-97                           1
-
-
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-S\bSE\bEE\bE A\bAL\bLS\bSO\bO
-       X\bX(1), x\bxs\bsc\bcr\bre\bee\ben\bns\bsa\bav\bve\ber\br(1), x\bxl\blo\boc\bck\bk(1)
-
-C\bCO\bOP\bPY\bYR\bRI\bIG\bGH\bHT\bT
-       Copyright (C) 1997 by Caleb Cullen.
-
-       Permission to use, copy, modify, and distribute this soft-
-       ware 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.
-
-A\bAU\bUT\bTH\bHO\bOR\bR
-       Caleb Cullen, 1997.
-
-       Ability  to  run  standalone or with _\bx_\bs_\bc_\br_\be_\be_\bn_\bs_\ba_\bv_\be_\br added by
-       Jamie Zawinski <jwz@jwz.org>, 27-May-97.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-X Version 11                27-May-97                           2
-
-
diff --git a/local/man/cat.1/lmorph.1 b/local/man/cat.1/lmorph.1
deleted file mode 100644 (file)
index 8056614..0000000
+++ /dev/null
@@ -1,132 +0,0 @@
-
-
-
-LMORPH(1)                                               LMORPH(1)
-
-
-N\bNA\bAM\bME\bE
-       lmorph - morphing lines
-
-S\bSY\bYN\bNO\bOP\bPS\bSI\bIS\bS
-       l\blm\bmo\bor\brp\bph\bh  [-display _\bh_\bo_\bs_\bt_\b:_\bd_\bi_\bs_\bp_\bl_\ba_\by_\b._\bs_\bc_\br_\be_\be_\bn] [-foreground _\bc_\bo_\bl_\bo_\br]
-       [-background _\bc_\bo_\bl_\bo_\br] [-window] [-root]  [-mono]  [-install]
-       [-visual _\bv_\bi_\bs_\bu_\ba_\bl] [-points _\bi_\bn_\bt] [-steps _\bi_\bn_\bt] [-delay _\bu_\bs_\be_\bc_\bs]
-       [-figtype _\bt_\by_\bp_\be]
-
-D\bDE\bES\bSC\bCR\bRI\bIP\bPT\bTI\bIO\bON\bN
-       The _\bl_\bm_\bo_\br_\bp_\bh  program  morphs  between  simple  linedrawings
-       using bilinear interpolation.
-
-O\bOP\bPT\bTI\bIO\bON\bNS\bS
-       _\bl_\bm_\bo_\br_\bp_\bh accepts the following options:
-
-       -\b-w\bwi\bin\bnd\bdo\bow\bw Draw  on  a  newly-created  window.  This  is  the
-               default.
-
-       -\b-r\bro\boo\bot\bt   Draw on the root window.
-
-       -\b-m\bmo\bon\bno\bo   If  on  a  color  display,  pretend  we're  on   a
-               monochrome display.
-
-       -\b-i\bin\bns\bst\bta\bal\bll\bl
-               Install a private colormap for the window.
-
-       -\b-v\bvi\bis\bsu\bua\bal\bl _\bv_\bi_\bs_\bu_\ba_\bl
-               Specify  which visual to use. Legal values are the
-               name of a visual class, or the id number  (decimal
-               or hex) of a specific visual.
-
-       -\b-p\bpo\boi\bin\bnt\bts\bs _\bi_\bn_\bt_\be_\bg_\be_\br
-               Number  of points in each line drawing. Default is
-               150 points.
-
-       -\b-s\bst\bte\bep\bps\bs _\bi_\bn_\bt_\be_\bg_\be_\br
-               Interpolation steps from one drawing to the  next.
-               Default  is 0, which means a random number between
-               100 and 500.
-
-       -\b-d\bde\bel\bla\bay\by _\bm_\bi_\bc_\br_\bo_\bs_\be_\bc_\bo_\bn_\bd_\bs
-               How much of a delay should be  introduced  between
-               steps of the animation.  Default 50000.
-
-       -\b-f\bfi\big\bgt\bty\byp\bpe\be _\bt_\by_\bp_\be
-               Limit  the figures to only open or closed figures.
-               Possible types are  "all"  (default),  "open"  and
-               "closed".
-
-E\bEN\bNV\bVI\bIR\bRO\bON\bNM\bME\bEN\bNT\bT
-       D\bDI\bIS\bSP\bPL\bLA\bAY\bY to get the default host and display number.
-
-
-
-
-
-                        xscreensaver hack                       1
-
-
-
-
-
-LMORPH(1)                                               LMORPH(1)
-
-
-       X\bXE\bEN\bNV\bVI\bIR\bRO\bON\bNM\bME\bEN\bNT\bT
-               to  get the name of a resource file that overrides
-               the global resources stored in  the  RESOURCE_MAN-
-               AGER property.
-
-S\bSE\bEE\bE A\bAL\bLS\bSO\bO
-       X\bX(1), x\bxs\bsc\bcr\bre\bee\ben\bns\bsa\bav\bve\ber\br(1)
-
-A\bAU\bUT\bTH\bHO\bOR\bR
-       Sverre  H.  Huseby <sverrehu@online.no> and Glenn T. Lines
-       <gtl@si.sintef.no>, built on top of the screen saver  rou-
-       tines by Jamie Zawinski <jwz@jwz.org>.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-                        xscreensaver hack                       2
-
-
diff --git a/local/man/cat.1/maze.1 b/local/man/cat.1/maze.1
deleted file mode 100644 (file)
index 8c460d2..0000000
+++ /dev/null
@@ -1,264 +0,0 @@
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-N\bNA\bAM\bME\bE
-       maze - an automated X11 demo repeatedly creating and solv-
-       ing a random maze
-
-S\bSY\bYN\bNO\bOP\bPS\bSI\bIS\bS
-       m\bma\baz\bze\be [-display  _\bh_\bo_\bs_\bt_\b:_\bd_\bi_\bs_\bp_\bl_\ba_\by_\b._\bs_\bc_\br_\be_\be_\bn]  [-foreground  _\bc_\bo_\bl_\bo_\br]
-       [-background  _\bc_\bo_\bl_\bo_\br] [-window] [-root] [-install] [-visual
-       _\bv_\bi_\bs_\bu_\ba_\bl]   [-grid-size    _\bp_\bi_\bx_\be_\bl_\bs]    [-live-color    _\bc_\bo_\bl_\bo_\br]
-       [-dead-color   _\bc_\bo_\bl_\bo_\br]   [-solve-delay  _\bu_\bs_\be_\bc_\bs]  [-pre-delay
-       _\bu_\bs_\be_\bc_\bs]   [-post-delay    _\bu_\bs_\be_\bc_\bs]    [-generator    _\bi_\bn_\bt_\be_\bg_\be_\br]
-       [-max-length _\bi_\bn_\bt_\be_\bg_\be_\br] [-bridge] [-no-bridge]
-
-D\bDE\bES\bSC\bCR\bRI\bIP\bPT\bTI\bIO\bON\bN
-       The  _\bm_\ba_\bz_\be  program creates a "random" maze and then solves
-       it with graphical feedback.
-
-O\bOP\bPT\bTI\bIO\bON\bNS\bS
-       _\bm_\ba_\bz_\be accepts the following options:
-
-       -\b-w\bwi\bin\bnd\bdo\bow\bw Draw on  a  newly-created  window.   This  is  the
-               default.
-
-       -\b-r\bro\boo\bot\bt   Draw on the root window.
-
-       -\b-i\bin\bns\bst\bta\bal\bll\bl
-               Install a private colormap for the window.
-
-       -\b-v\bvi\bis\bsu\bua\bal\bl _\bv_\bi_\bs_\bu_\ba_\bl
-               Specify which visual to use.  Legal values are the
-               name of a visual class, or the id number  (decimal
-               or hex) of a specific visual.
-
-       -\b-g\bgr\bri\bid\bd-\b-s\bsi\biz\bze\be _\bp_\bi_\bx_\be_\bl_\bs
-               The  size  of  each  block of the maze, in pixels;
-               default is 0, meaning pick a random grid size.
-
-       -\b-l\bli\biv\bve\be-\b-c\bco\bol\blo\bor\br _\bc_\bo_\bl_\bo_\br
-               The color of the path.
-
-       -\b-d\bde\bea\bad\bd-\b-c\bco\bol\blo\bor\br _\bc_\bo_\bl_\bo_\br
-               The color of the failed path (it is also  stippled
-               with a 50% pattern.)
-
-       -\b-s\bsk\bki\bip\bp-\b-c\bco\bol\blo\bor\br _\bc_\bo_\bl_\bo_\br
-               The  maze solver will choose to not go down a path
-               if it can "see" (in a straight line) that it is  a
-               dead end.  This is the color to use for paths that
-               are skipped for this reason.
-
-       -\b-s\bsu\bur\brr\bro\bou\bun\bnd\bd-\b-c\bco\bol\blo\bor\br _\bc_\bo_\bl_\bo_\br
-               If the maze solver  ever  completely  encloses  an
-               area  within the maze, then it knows that the exit
-               is not in there (and in fact the interior of  that
-               area  might  not even be reachable.)  It will mark
-
-
-
-X Version 11                 7-mar-93                           1
-
-
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-               out those cells using this color.
-
-       -\b-s\bso\bol\blv\bve\be-\b-d\bde\bel\bla\bay\by _\bi_\bn_\bt_\be_\bg_\be_\br
-               Delay (in microseconds) between each step  of  the
-               solution  path.   Default  5000,  or about 1/200th
-               second.
-
-       -\b-p\bpr\bre\be-\b-d\bde\bel\bla\bay\by _\bi_\bn_\bt_\be_\bg_\be_\br
-               Delay (in microseconds) between generating a  maze
-               and starting to solve it.  Default 2000000 (2 sec-
-               onds.)
-
-       -\b-p\bpo\bos\bst\bt-\b-d\bde\bel\bla\bay\by _\bi_\bn_\bt_\be_\bg_\be_\br
-               Delay (in microseconds) after solving a  maze  and
-               before  generating  a new one.  Default 4000000 (4
-               seconds.)
-
-       -\b-g\bge\ben\bne\ber\bra\bat\bto\bor\br _\bn_\bu_\bm
-               Sets the algorithm that will be used  to  generate
-               the  mazes.  The  default  is  -1,  which randomly
-               selects an algorithm for each maze that is  gener-
-               ated.  Generator  0 is the original one, and works
-               by walking around randomly until we  hit  a  place
-               we've  been before, then backtracking and trying a
-               new direction somewhere. Generator 1 picks a  ran-
-               dom  spot  in the maze, then draws a straight wall
-               from that spot in a random direction until it hits
-               another wall (and continues until the maze is com-
-               plete). Generator 2 is based  on  sets.  Initially
-               all  cells  are in different sets. Then two neigh-
-               boring cells are chosen and if they are in differ-
-               ent  sets,  their sets are joined. If they were in
-               the same set, a wall is built between  them.  This
-               continues until the maze is complete.
-
-               All  generators  generate  mazes  with  a  certain
-               'characteristic'. See if you can spot them!
-
-       -\b-m\bma\bax\bx-\b-l\ble\ben\bng\bgt\bth\bh _\bn_\bu_\bm
-               Controls the maximum length of walls drawn in  one
-               go by generator 1.
-
-       -\b-b\bbr\bri\bid\bdg\bge\be
-
-       -\b-n\bno\bo-\b-b\bbr\bri\bid\bdg\bge\be
-               Controls  whether  or  not  a 'bridge' will appear
-               over the logo.
-
-       Clicking the mouse in the maze window controls it.
-
-       L\bLe\bef\bft\btB\bBu\but\btt\bto\bon\bn      Clears the window and restarts maze.
-
-       M\bMi\bid\bdd\bdl\ble\beB\bBu\but\btt\bto\bon\bn    Pause or unpause the program.
-
-
-
-
-X Version 11                 7-mar-93                           2
-
-
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-       R\bRi\big\bgh\bht\btB\bBu\but\btt\bto\bon\bn     Exit.
-
-B\bBU\bUG\bGS\bS
-       Expose events force a restart of maze.
-
-       Mouse actions are based on "raw" values (Button1,  Button2
-       and Button3) instead of using the pointer map.
-
-E\bEN\bNV\bVI\bIR\bRO\bON\bNM\bME\bEN\bNT\bT
-       D\bDI\bIS\bSP\bPL\bLA\bAY\bY to get the default host and display number.
-
-       X\bXE\bEN\bNV\bVI\bIR\bRO\bON\bNM\bME\bEN\bNT\bT
-               to  get the name of a resource file that overrides
-               the global resources stored in  the  RESOURCE_MAN-
-               AGER property.
-
-S\bSE\bEE\bE A\bAL\bLS\bSO\bO
-       X\bX(1), x\bxs\bsc\bcr\bre\bee\ben\bns\bsa\bav\bve\ber\br(1)
-
-C\bCO\bOP\bPY\bYR\bRI\bIG\bGH\bHT\bT
-       Copyright  (C)  1988  by  Sun  Microsystems, Inc. Mountain
-       View, CA.
-
-       All Rights Reserved
-
-       Permission to use, copy, modify, and distribute this soft-
-       ware 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  names of Sun or MIT not be
-       used in advertising or publicity pertaining  to  distribu-
-       tion  of  the software without specific prior written per-
-       mission. Sun and M.I.T.  make no representations about the
-       suitability  of  this software for any purpose. It is pro-
-       vided "as is" without any express or implied warranty.
-
-       SUN DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
-       INCLUDING  ALL  IMPLIED  WARRANTIES OF MERCHANTABILITY AND
-       FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SUN 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.
-
-A\bAU\bUT\bTH\bHO\bOR\bR(\b(s\bs)\b)
-       Zack Weinberg [ Smarter maze-solver ] zack@rabi.phys.columbia.edu
-       Johannes Keukelaar [ Generators 1 and 2 ] johannes@nada.kth.se
-         Royal Institute of Technology, Stockholm, Sweden
-       Jim Randell    [ XScreenSaver version ] jmr@mddjmr.fc.hp.com
-         HPLabs, Bristol
-       Richard Hess   [ X11 extensions ]       {...}!uunet!cimshop!rhess
-         Consilium, Mountain View, CA
-
-
-
-X Version 11                 7-mar-93                           3
-
-
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-       Dave Lemke     [ X11 version ]          lemke@sun.COM
-         Sun MicroSystems, Mountain View, CA
-       Martin Weiss   [ SunView version ]
-         Sun MicroSystems, Mountain View, CA
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-X Version 11                 7-mar-93                           4
-
-
diff --git a/local/man/cat.1/moire.1 b/local/man/cat.1/moire.1
deleted file mode 100644 (file)
index 4361a3c..0000000
+++ /dev/null
@@ -1,132 +0,0 @@
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-N\bNA\bAM\bME\bE
-       halo - draw circular interference patterns
-
-S\bSY\bYN\bNO\bOP\bPS\bSI\bIS\bS
-       h\bha\bal\blo\bo  [-display  _\bh_\bo_\bs_\bt_\b:_\bd_\bi_\bs_\bp_\bl_\ba_\by_\b._\bs_\bc_\br_\be_\be_\bn]  [-foreground _\bc_\bo_\bl_\bo_\br]
-       [-background _\bc_\bo_\bl_\bo_\br] [-window] [-root]  [-mono]  [-install]
-       [-visual   _\bv_\bi_\bs_\bu_\ba_\bl]   [-delay  _\bs_\be_\bc_\bo_\bn_\bd_\bs]  [-random  _\bb_\bo_\bo_\bl_\be_\ba_\bn]
-       [-ncolors _\bi_\bn_\bt] [-offset _\bi_\bn_\bt]
-
-D\bDE\bES\bSC\bCR\bRI\bIP\bPT\bTI\bIO\bON\bN
-       The _\bm_\bo_\bi_\br_\be program draws cool  circular  interference  pat-
-       terns.
-
-O\bOP\bPT\bTI\bIO\bON\bNS\bS
-       _\bm_\bo_\bi_\br_\be accepts the following options:
-
-       -\b-w\bwi\bin\bnd\bdo\bow\bw Draw  on  a  newly-created  window.   This  is the
-               default.
-
-       -\b-r\bro\boo\bot\bt   Draw on the root window.
-
-       -\b-m\bmo\bon\bno\bo   If  on  a  color  display,  pretend  we're  on   a
-               monochrome display.
-
-       -\b-i\bin\bns\bst\bta\bal\bll\bl
-               Install a private colormap for the window.
-
-       -\b-v\bvi\bis\bsu\bua\bal\bl _\bv_\bi_\bs_\bu_\ba_\bl
-               Specify which visual to use.  Legal values are the
-               name of a visual class, or the id number  (decimal
-               or hex) of a specific visual.
-
-       -\b-d\bde\bel\bla\bay\by _\bs_\be_\bc_\bo_\bn_\bd_\bs
-               How  long to wait before starting over.  Default 5
-               seconds.
-
-       -\b-r\bra\ban\bnd\bdo\bom\bm _\bb_\bo_\bo_\bl_\be_\ba_\bn
-               Whether to ignore the  foreground/background  col-
-               ors, and pick them randomly instead.
-
-       -\b-o\bof\bff\bfs\bse\bet\bt _\bi_\bn_\bt_\be_\bg_\be_\br
-               The maximum random radius increment to use.
-
-       -\b-n\bnc\bco\bol\blo\bor\brs\bs _\bi_\bn_\bt_\be_\bg_\be_\br
-               How  many  colors should be allocated in the color
-               ramp (note that this value interacts with _\bo_\bf_\bf_\bs_\be_\bt.)
-
-E\bEN\bNV\bVI\bIR\bRO\bON\bNM\bME\bEN\bNT\bT
-       D\bDI\bIS\bSP\bPL\bLA\bAY\bY to get the default host and display number.
-
-       X\bXE\bEN\bNV\bVI\bIR\bRO\bON\bNM\bME\bEN\bNT\bT
-               to  get the name of a resource file that overrides
-               the global resources stored in  the  RESOURCE_MAN-
-               AGER property.
-
-
-
-X Version 11                27-Apr-97                           1
-
-
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-S\bSE\bEE\bE A\bAL\bLS\bSO\bO
-       X\bX(1), x\bxs\bsc\bcr\bre\bee\ben\bns\bsa\bav\bve\ber\br(1)
-
-C\bCO\bOP\bPY\bYR\bRI\bIG\bGH\bHT\bT
-       Copyright  (C) 1997 by Jamie Zawinski.  Permission to use,
-       copy, modify, distribute, and sell this software  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.   No
-       representations  are  made  about  the suitability of this
-       software for any purpose.  It is provided "as is"  without
-       express or implied warranty.
-
-A\bAU\bUT\bTH\bHO\bOR\bR
-       Jamie  Zawinski <jwz@jwz.org>, 27-Apr-97, based on code by
-       Michael D. Bayne <mdb@go2net.com>.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-X Version 11                27-Apr-97                           2
-
-
diff --git a/local/man/cat.1/munch.1 b/local/man/cat.1/munch.1
deleted file mode 100644 (file)
index 35203b0..0000000
+++ /dev/null
@@ -1,198 +0,0 @@
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-N\bNA\bAM\bME\bE
-       munch - munching squares screen hack
-
-S\bSY\bYN\bNO\bOP\bPS\bSI\bIS\bS
-       m\bmu\bun\bnc\bch\bh  [-display  _\bh_\bo_\bs_\bt_\b:_\bd_\bi_\bs_\bp_\bl_\ba_\by_\b._\bs_\bc_\br_\be_\be_\bn] [-foreground _\bc_\bo_\bl_\bo_\br]
-       [-background _\bc_\bo_\bl_\bo_\br] [-window] [-root]  [-mono]  [-install]
-       [-visual _\bv_\bi_\bs_\bu_\ba_\bl] [-delay _\bs_\be_\bc_\bo_\bn_\bd_\bs] [-xor] [-noxor] [-shift]
-       [-noshift] [-logminwidth _\bm_\bi_\bn_\bi_\bm_\bu_\bm _\bw_\bi_\bd_\bt_\bh]
-
-D\bDE\bES\bSC\bCR\bRI\bIP\bPT\bTI\bIO\bON\bN
-       The _\bm_\bu_\bn_\bc_\bh program preforms the munching squares hack until
-       killed.   It picks square size, position, and gravity ran-
-       domly; configurable options are listed below.
-
-       The munching squares hack cosists of drawing Y = X  XOR  T
-       for  a range of X and T over and over until all the possi-
-       ble combinations of X and T have come up.  It was  report-
-       edly  discovered  by  Jackson  Wright  in  1962 and took 5
-       instructions of PDP-6 code.
-
-O\bOP\bPT\bTI\bIO\bON\bNS\bS
-       _\bm_\bu_\bn_\bc_\bh accepts the following options:
-
-       -\b-w\bwi\bin\bnd\bdo\bow\bw Draw on  a  newly-created  window.   This  is  the
-               default.
-
-       -\b-r\bro\boo\bot\bt   Draw on the root window.
-
-       -\b-m\bmo\bon\bno\bo   If   on  a  color  display,  pretend  we're  on  a
-               monochrome display.
-
-       -\b-i\bin\bns\bst\bta\bal\bll\bl
-               Install a private colormap for the window.
-
-       -\b-v\bvi\bis\bsu\bua\bal\bl _\bv_\bi_\bs_\bu_\ba_\bl
-               Specify which visual to use.  Legal values are the
-               name  of a visual class, or the id number (decimal
-               or hex) of a specific visual.
-
-       -\b-d\bde\bel\bla\bay\by _\bs_\be_\bc_\bo_\bn_\bd_\bs
-               How long to wait before starting over.  Default  5
-               seconds.
-
-       -\b-x\bxo\bor\br    Use the XOR drawing function.  (Default.)
-
-       -\b-n\bno\bo-\b-x\bxo\bor\br Don't use the XOR drawing function.
-
-       -\b-s\bsh\bhi\bif\bft\bt  Start drawing the square at weird starting points.
-               (Default.)
-
-       -\b-n\bno\bo-\b-s\bsh\bhi\bif\bft\bt
-               Don't shift and start drawing the square at  weird
-               starting points.
-
-
-
-
-X Version 11                17-Jun-97                           1
-
-
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-       -\b-l\blo\bog\bgm\bmi\bin\bnw\bwi\bid\bdt\bth\bh _\bm_\bi_\bn_\bi_\bm_\bu_\bm_\b-_\bw_\bi_\bd_\bt_\bh
-               The  logarithm  (base  2) of the minimum with of a
-               square (must be a power of 2, or some parts of the
-               square aren't.)
-
-E\bEN\bNV\bVI\bIR\bRO\bON\bNM\bME\bEN\bNT\bT
-       D\bDI\bIS\bSP\bPL\bLA\bAY\bY to get the default host and display number.
-
-       X\bXE\bEN\bNV\bVI\bIR\bRO\bON\bNM\bME\bEN\bNT\bT
-               to  get the name of a resource file that overrides
-               the global resources stored in  the  RESOURCE_MAN-
-               AGER property.
-
-S\bSE\bEE\bE A\bAL\bLS\bSO\bO
-       X\bX(1),                                     x\bxs\bsc\bcr\bre\bee\ben\bns\bsa\bav\bve\ber\br(1),
-       h\bht\btt\btp\bp:\b:/\b//\b/w\bww\bww\bw.\b.i\bin\bnw\bwa\bap\bp.\b.c\bco\bom\bm/\b/p\bpd\bdp\bp1\b10\b0/\b/h\bhb\bba\bak\bke\ber\br/\b/h\bha\bak\bkm\bme\bem\bm/\b/h\bha\bak\bkm\bme\bem\bm.\b.h\bht\btm\bml\bl,\b,
-       h\bht\btt\btp\bp:\b:/\b//\b/w\bww\bww\bw.\b.c\bco\bom\bme\bed\bdi\bia\ba.\b.c\bco\bom\bm/\b/H\bHo\bot\bt/\b/j\bja\bar\brg\bgo\bon\bn_\b_3\b3.\b.0\b0/\b/J\bJA\bAR\bRG\bGO\bON\bN_\b_M\bM/\b/M\bMU\bUN\bNC\bCH\bH-\b-
-       S\bSQ\bQR\bR.\b.H\bHT\bTM\bML\bL
-
-H\bHI\bIS\bST\bTO\bOR\bRY\bY
-       Quoted from HAKMEM, for historical interest.  As that doc-
-       ument  says,  "Unless  otherwise stated, all computer pro-
-       grams are in PDP-6/10 assembly language."
-
-       ITEM 146: MUNCHING SQUARES
-               Another simple display program. It is thought that
-               this  was  discovered by Jackson Wright on the RLE
-               PDP-1 circa 1962.
-
-
-                        DATAI 2
-                        ADDB 1,2
-                        ROTC 2,-22
-                        XOR 1,2
-                        JRST .-4
-
-               2=X,  3=Y.  Try  things  like  1001002   in   data
-               switches.  This  also does interesting things with
-               operations other than  XOR,  and  rotations  other
-               than  -22.  (Try  IOR; AND; TSC; FADR; FDV(!); ROT
-               -14, -9, -20, ...)
-
-       ITEM 147 (Schroeppel):
-               Munching squares is just views of the graph Y =  X
-               XOR T for consecutive values of T = time.
-
-       ITEM 148 (Cohen, Beeler):
-               A  modification  to munching squares which reveals
-               them in frozen states through opening and  closing
-               curtains: insert FADR 2,1 before the XOR. Try data
-               switches =
-
-
-
-
-
-
-X Version 11                17-Jun-97                           2
-
-
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-                        4000,,4    1000,,2002    2000,,4    0,,1002
-
-               (Notation: <left half>,,<right half>)
-
-               Also try  the  FADR  after  the  XOR,  switches  =
-               1001,,1.
-
-C\bCO\bOP\bPY\bYR\bRI\bIG\bGH\bHT\bT
-       Copyright  (C)  1997 by Tim Showalter.  Permission to use,
-       copy, modify, distribute, and sell this software  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.   No
-       representations  are  made  about  the suitability of this
-       software for any purpose.  It is provided "as is"  without
-       express or implied warranty.
-
-A\bAU\bUT\bTH\bHO\bOR\bR
-       Tim  Showalter  <tjs@andrew.cmu.edu>,  17-Jun-97, based on
-       what's in the Jargon File and stealing stuff from existing
-       xscreensaver modules.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-X Version 11                17-Jun-97                           3
-
-
diff --git a/local/man/cat.1/noseguy.1 b/local/man/cat.1/noseguy.1
deleted file mode 100644 (file)
index bf53609..0000000
+++ /dev/null
@@ -1,132 +0,0 @@
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-N\bNA\bAM\bME\bE
-       noseguy  -  a  little  guy  with a big nose wanders around
-       being witty
-
-S\bSY\bYN\bNO\bOP\bPS\bSI\bIS\bS
-       n\bno\bos\bse\beg\bgu\buy\by [-display _\bh_\bo_\bs_\bt_\b:_\bd_\bi_\bs_\bp_\bl_\ba_\by_\b._\bs_\bc_\br_\be_\be_\bn] [-foreground _\bc_\bo_\bl_\bo_\br]
-       [-background  _\bc_\bo_\bl_\bo_\br] [-text-foreground _\bc_\bo_\bl_\bo_\br] [-text-back-
-       ground _\bc_\bo_\bl_\bo_\br] [-font _\bf_\bo_\bn_\bt]  [-window]  [-root]  [-install]
-       [-visual  _\bv_\bi_\bs_\bu_\ba_\bl]  [-mode _\bm_\bo_\bd_\be] [-program _\bp_\br_\bo_\bg_\br_\ba_\bm] [-file-
-       name le_\b] _\b[_\b-_\bt_\be_\bx_\bt _\bt_\be_\bx_\bt_\b]
-
-D\bDE\bES\bSC\bCR\bRI\bIP\bPT\bTI\bIO\bON\bN
-       A little man with a big nose and a hat runs around spewing
-       out  messages  to the screen.  This code (and its bitmaps)
-       were extracted from the _\bx_\bn_\bl_\bo_\bc_\bk program.
-
-O\bOP\bPT\bTI\bIO\bON\bNS\bS
-       _\bn_\bo_\bs_\be_\bg_\bu_\by accepts the following options:
-
-       -\b-w\bwi\bin\bnd\bdo\bow\bw Draw on  a  newly-created  window.   This  is  the
-               default.
-
-       -\b-r\bro\boo\bot\bt   Draw on the root window.
-
-       -\b-i\bin\bns\bst\bta\bal\bll\bl
-               Install a private colormap for the window.
-
-       -\b-v\bvi\bis\bsu\bua\bal\bl _\bv_\bi_\bs_\bu_\ba_\bl
-               Specify which visual to use.  Legal values are the
-               name of a visual class, or the id number  (decimal
-               or hex) of a specific visual.
-
-       -\b-f\bfo\bon\bnt\bt _\bf_\bo_\bn_\bt
-               The font used for the messages.
-
-       -\b-m\bmo\bod\bde\be [\b[ p\bpr\bro\bog\bgr\bra\bam\bm |\b| f\bfi\bil\ble\be |\b| s\bst\btr\bri\bin\bng\bg ]\b]
-               In  _\bp_\br_\bo_\bg_\br_\ba_\bm  mode, the messages are gotten by run-
-               ning a program.  The program used is controlled by
-               the _\b-_\bp_\br_\bo_\bg_\br_\ba_\bm option, and the _\b._\bp_\br_\bo_\bg_\br_\ba_\bm resource.
-
-               In _\bf_\bi_\bl_\be_\bn_\ba_\bm_\be mode, the message used is the contents
-               of a file.  The file used  is  controlled  by  the
-               _\b-_\bf_\bi_\bl_\be option, and the _\b._\bf_\bi_\bl_\be_\bn_\ba_\bm_\be resource.
-
-               In _\bs_\bt_\br_\bi_\bn_\bg mode, the message is whatever was speci-
-               fied on the command line as the _\b-_\bt_\be_\bx_\bt  option,  or
-               in the resource database as the _\b._\bt_\be_\bx_\bt resource.
-
-       -\b-p\bpr\bro\bog\bgr\bra\bam\bm _\bp_\br_\bo_\bg_\br_\ba_\bm
-               If  _\bm_\bo_\bd_\be  is _\bp_\br_\bo_\bg_\br_\ba_\bm (the default), then this pro-
-               gram will be run periodically, and its output will
-               be  the text of the messages.  The default program
-               is _\b"_\bf_\bo_\br_\bt_\bu_\bn_\be _\b-_\bs_\b", but _\by_\bo_\bw is also a good choice.
-
-
-
-
-X Version 11                13-aug-92                           1
-
-
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-       -\b-f\bfi\bil\ble\ben\bna\bam\bme\be _\bf_\bi_\bl_\be
-               If _\bm_\bo_\bd_\be is _\bf_\bi_\bl_\be, then the contents  of  this  file
-               will be used for all messages.
-
-       -\b-t\bte\bex\bxt\bt _\bs_\bt_\br_\bi_\bn_\bg
-               If _\bm_\bo_\bd_\be is _\bs_\bt_\br_\bi_\bn_\bg, then this text will be used for
-               all messages.
-
-E\bEN\bNV\bVI\bIR\bRO\bON\bNM\bME\bEN\bNT\bT
-       D\bDI\bIS\bSP\bPL\bLA\bAY\bY to get the default host and display number.
-
-       X\bXE\bEN\bNV\bVI\bIR\bRO\bON\bNM\bME\bEN\bNT\bT
-               to get the name of a resource file that  overrides
-               the  global  resources stored in the RESOURCE_MAN-
-               AGER property.
-
-S\bSE\bEE\bE A\bAL\bLS\bSO\bO
-       X\bX(1), x\bxs\bsc\bcr\bre\bee\ben\bns\bsa\bav\bve\ber\br(1), x\bxn\bnl\blo\boc\bck\bk(1)
-
-C\bCO\bOP\bPY\bYR\bRI\bIG\bGH\bHT\bT
-       Copyright 1985, 1990 by Dan Heller <argv@sun.com>.
-
-A\bAU\bUT\bTH\bHO\bOR\bR
-       Dan Heller <argv@sun.com>, 1985.
-
-       Ability to run standalone or with  _\bx_\bs_\bc_\br_\be_\be_\bn_\bs_\ba_\bv_\be_\br  added  by
-       Jamie Zawinski <jwz@jwz.org>, 13-aug-92.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-X Version 11                13-aug-92                           2
-
-
diff --git a/local/man/cat.1/pedal.1 b/local/man/cat.1/pedal.1
deleted file mode 100644 (file)
index b31f6b8..0000000
+++ /dev/null
@@ -1,132 +0,0 @@
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-N\bNA\bAM\bME\bE
-       pedal - pretty geometric picture program
-
-S\bSY\bYN\bNO\bOP\bPS\bSI\bIS\bS
-       p\bpe\bed\bda\bal\bl  [-display  _\bh_\bo_\bs_\bt_\b:_\bd_\bi_\bs_\bp_\bl_\ba_\by_\b._\bs_\bc_\br_\be_\be_\bn] [-foreground _\bc_\bo_\bl_\bo_\br]
-       [-background _\bc_\bo_\bl_\bo_\br]  [-window]  [-root]  [-delay  _\bs_\be_\bc_\bo_\bn_\bd_\bs]
-       [-maxlines    _\bn_\bu_\bm_\bb_\be_\br]    [-fadedelay   _\bu_\bs_\be_\bc_\bo_\bn_\bd_\bs]   [-mono]
-       [-install] [-visual _\bv_\bi_\bs_\bu_\ba_\bl]
-
-D\bDE\bES\bSC\bCR\bRI\bIP\bPT\bTI\bIO\bON\bN
-       The _\bp_\be_\bd_\ba_\bl program displays pretty geometric pictures.
-
-O\bOP\bPT\bTI\bIO\bON\bNS\bS
-       _\bp_\be_\bd_\ba_\bl accepts the following options:
-
-       -\b-w\bwi\bin\bnd\bdo\bow\bw Draw on  a  newly-created  window.   This  is  the
-               default.
-
-       -\b-r\bro\boo\bot\bt   Draw on the root window.
-
-       -\b-f\bfo\bor\bre\beg\bgr\bro\bou\bun\bnd\bd _\bc_\bo_\bl_\bo_\br
-               The color for the foreground.  Default is white.
-
-       -\b-b\bba\bac\bck\bkg\bgr\bro\bou\bun\bnd\bd _\bc_\bo_\bl_\bo_\br
-               The color for the background.  Default is black.
-
-       -\b-d\bde\bel\bla\bay\by _\bs_\be_\bc_\bo_\bn_\bd_\bs
-               The  number  of seconds to pause between each pic-
-               ture.
-
-       -\b-m\bma\bax\bxl\bli\bin\bne\bes\bs _\bn_\bu_\bm_\bb_\be_\br
-               The maximum number of lines in the drawing.   Good
-               values  are between 20 and 2000.  Maximum value is
-               16K.
-
-       -\b-f\bfa\bad\bde\bed\bde\bel\bla\bay\by _\bm_\bi_\bc_\br_\bo_\bs_\be_\bc_\bo_\bn_\bd_\bs
-               The number of micro seconds to take when fading in
-               and out.
-
-       -\b-m\bmo\bon\bno\bo   Don't  do  fading.   Pretend we're on a monochrome
-               display.
-
-       To make your X server grunt under  load,  and  to  impress
-       your friends, try _\bp_\be_\bd_\ba_\bl _\b-_\bm_\bo_\bn_\bo _\b-_\bd_\be_\bl_\ba_\by _\b0 _\b-_\bm_\ba_\bx_\bl_\bi_\bn_\be_\bs _\b1_\b0_\b0_\b.
-
-E\bEN\bNV\bVI\bIR\bRO\bON\bNM\bME\bEN\bNT\bT
-       D\bDI\bIS\bSP\bPL\bLA\bAY\bY to get the default host and display number.
-
-       X\bXE\bEN\bNV\bVI\bIR\bRO\bON\bNM\bME\bEN\bNT\bT
-               to  get the name of a resource file that overrides
-               the global resources stored in  the  RESOURCE_MAN-
-               AGER property.
-
-
-
-
-
-X Version 11                24-Jun-94                           1
-
-
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-S\bSE\bEE\bE A\bAL\bLS\bSO\bO
-       X\bX(1), x\bxs\bsc\bcr\bre\bee\ben\bns\bsa\bav\bve\ber\br(1)
-
-C\bCO\bOP\bPY\bYR\bRI\bIG\bGH\bHT\bT
-       Copyright  (C)  1994, by Carnegie Mellon University.  Per-
-       mission to use, copy, modify, distribute,  and  sell  this
-       software  and  its documentation for any purpose is hereby
-       granted without fee, provided fnord that the  above  copy-
-       right notice appear in all copies and that both that copy-
-       right notice and this permission notice appear in support-
-       ing  documentation.  No representations are made about the
-       suitability of fnord this software for any purpose.  It is
-       provided "as is" without express or implied warranty.
-
-A\bAU\bUT\bTH\bHO\bOR\bR
-       Dale Moore <Dale.Moore@cs.cmu.edu>, 24-Jun-1994.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-X Version 11                24-Jun-94                           2
-
-
diff --git a/local/man/cat.1/penrose.1 b/local/man/cat.1/penrose.1
deleted file mode 100644 (file)
index 8bdb131..0000000
+++ /dev/null
@@ -1,198 +0,0 @@
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-N\bNA\bAM\bME\bE
-       penrose - draws quasiperiodic tilings
-
-S\bSY\bYN\bNO\bOP\bPS\bSI\bIS\bS
-       p\bpe\ben\bnr\bro\bos\bse\be [-display _\bh_\bo_\bs_\bt_\b:_\bd_\bi_\bs_\bp_\bl_\ba_\by_\b._\bs_\bc_\br_\be_\be_\bn] [-foreground _\bc_\bo_\bl_\bo_\br]
-       [-background _\bc_\bo_\bl_\bo_\br] [-window] [-root]  [-mono]  [-install]
-       [-visual  _\bv_\bi_\bs_\bu_\ba_\bl] [-ncolors _\bi_\bn_\bt_\be_\bg_\be_\br] [-delay _\bm_\bi_\bc_\br_\bo_\bs_\be_\bc_\bo_\bn_\bd_\bs]
-       [-redoDelay    _\bs_\be_\bc_\bo_\bn_\bd_\bs]    [-size    _\bi_\bn_\bt_\be_\bg_\be_\br]    [-ammann]
-       [-no-ammann]
-
-
-D\bDE\bES\bSC\bCR\bRI\bIP\bPT\bTI\bIO\bON\bN
-       The _\bp_\be_\bn_\br_\bo_\bs_\be program draws quasiperiodic tilings.
-
-       See  Onoda,  Steinhardt,  DiVincenzo  and Socolar in Phys.
-       Rev. Lett. 60, #25, 1988 or  Strandburg  in  Computers  in
-       Physics, Sep/Oct 1991.
-
-       This implementation uses the simpler version of the growth
-       algorithm, i.e., if there are no forced vertices,  a  ran-
-       domly chosen tile is added to a randomly chosen vertex (no
-       preference for those 108 degree angles).
-
-       There are two essential differences to the algorithm  pre-
-       sented  in  the  literature:  First,  we  do not allow the
-       tiling to enclose an untiled area.  Whenever  this  is  in
-       danger  of  happening, we just do not add the tile, hoping
-       for a better random choice the next  time.   Second,  when
-       choosing  a  vertex  randomly,  we will take one that lies
-       withing the viewport if available.  If this seems to cause
-       enclosures  in the forced rule case, we will allow invisi-
-       ble vertices to be chosen.
-
-       Tiling is restarted whenever one of the following happens:
-       there  are  no  incomplete vertices within the viewport or
-       the tiling has extended a window's length beyond the  edge
-       of  the  window  horizontally or vertically or forced rule
-       choice has failed 100 times due to areas about  to  become
-       enclosed.
-
-       Although  quasiperiodic  tilings  are  produced, the tiles
-       themselves are not penrose tiles  (darts  and  kites).  In
-       contrast  to penrose tiles, these tiles can be arranged to
-       form a periodic tiling.
-
-
-O\bOP\bPT\bTI\bIO\bON\bNS\bS
-       _\bp_\be_\bn_\br_\bo_\bs_\be accepts the following options:
-
-       -\b-w\bwi\bin\bnd\bdo\bow\bw Draw on  a  newly-created  window.   This  is  the
-               default.
-
-       -\b-r\bro\boo\bot\bt   Draw on the root window.
-
-
-
-
-X Version 11                10-May-97                           1
-
-
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-       -\b-m\bmo\bon\bno\bo   If   on  a  color  display,  pretend  we're  on  a
-               monochrome display.
-
-       -\b-i\bin\bns\bst\bta\bal\bll\bl
-               Install a private colormap for the window.
-
-       -\b-v\bvi\bis\bsu\bua\bal\bl _\bv_\bi_\bs_\bu_\ba_\bl
-               Specify which visual to use.  Legal values are the
-               name  of a visual class, or the id number (decimal
-               or hex) of a specific visual.
-
-       -\b-n\bnc\bco\bol\blo\bor\brs\bs _\bi_\bn_\bt_\be_\bg_\be_\br
-               How many colors  should  be  used  (if  possible).
-               Default 64.  The colors are chosen randomly.
-
-       -\b-s\bsi\biz\bze\be _\bi_\bn_\bt_\be_\bg_\be_\br
-               How big the tiles should be.  Default 40 pixels.
-
-
-       -\b-d\bde\bel\bla\bay\by _\bm_\bi_\bl_\bl_\bi_\bs_\be_\bc_\bo_\bn_\bd_\bs
-               How  long (in 1/1,000,000'ths of a second) to wait
-               between drawing each tile.  Default 10,000 or  .01
-               seconds.
-
-
-       -\b-r\bre\bed\bdo\boD\bDe\bel\bla\bay\by _\bs_\be_\bc_\bo_\bn_\bd_\bs
-               How long to wait between starting a completely new
-               tiling.  Default 3 seconds.
-
-
-       -\b-a\bam\bmm\bma\ban\bnn\bn _\bi_\bn_\bt_\be_\bg_\be_\br
-
-       -\b-n\bno\bo-\b-a\bam\bmm\bma\ban\bnn\bn _\bi_\bn_\bt_\be_\bg_\be_\br
-               Whether Ammann lines should be added.
-
-
-E\bEN\bNV\bVI\bIR\bRO\bON\bNM\bME\bEN\bNT\bT
-       D\bDI\bIS\bSP\bPL\bLA\bAY\bY to get the default host and display number.
-
-       X\bXE\bEN\bNV\bVI\bIR\bRO\bON\bNM\bME\bEN\bNT\bT
-               to get the name of a resource file that  overrides
-               the  global  resources stored in the RESOURCE_MAN-
-               AGER property.
-
-S\bSE\bEE\bE A\bAL\bLS\bSO\bO
-       X\bX(1), x\bxs\bsc\bcr\bre\bee\ben\bns\bsa\bav\bve\ber\br(1), x\bxl\blo\boc\bck\bk(1)
-
-C\bCO\bOP\bPY\bYR\bRI\bIG\bGH\bHT\bT
-       Copyright (C) 1996 by Timo Korvola.
-
-       Permission to use, copy, modify, and distribute this soft-
-       ware 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
-
-
-
-X Version 11                10-May-97                           2
-
-
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-       notice and this permission  notice  appear  in  supporting
-       documentation.
-
-A\bAU\bUT\bTH\bHO\bOR\bR
-       Timo Korvola <tkorvola@dopey.hut.fi>, 1996.
-
-       Ability  to  run  standalone or with _\bx_\bs_\bc_\br_\be_\be_\bn_\bs_\ba_\bv_\be_\br added by
-       Jamie Zawinski <jwz@jwz.org>, 10-May-97.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-X Version 11                10-May-97                           3
-
-
diff --git a/local/man/cat.1/pyro.1 b/local/man/cat.1/pyro.1
deleted file mode 100644 (file)
index d45279c..0000000
+++ /dev/null
@@ -1,132 +0,0 @@
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-N\bNA\bAM\bME\bE
-       pyro - simulate fireworks
-
-S\bSY\bYN\bNO\bOP\bPS\bSI\bIS\bS
-       p\bpy\byr\bro\bo  [-display  _\bh_\bo_\bs_\bt_\b:_\bd_\bi_\bs_\bp_\bl_\ba_\by_\b._\bs_\bc_\br_\be_\be_\bn]  [-foreground _\bc_\bo_\bl_\bo_\br]
-       [-background _\bc_\bo_\bl_\bo_\br] [-window] [-root]  [-mono]  [-install]
-       [-visual  _\bv_\bi_\bs_\bu_\ba_\bl]  [-count  _\bi_\bn_\bt_\be_\bg_\be_\br]  [-frequency _\bi_\bn_\bt_\be_\bg_\be_\br]
-       [-scatter _\bi_\bn_\bt_\be_\bg_\be_\br]
-
-D\bDE\bES\bSC\bCR\bRI\bIP\bPT\bTI\bIO\bON\bN
-       The _\bp_\by_\br_\bo program simulates fireworks, in a way similar  to
-       a Macintosh program of the same name.
-
-O\bOP\bPT\bTI\bIO\bON\bNS\bS
-       _\bp_\by_\br_\bo accepts the following options:
-
-       -\b-w\bwi\bin\bnd\bdo\bow\bw Draw  on  a  newly-created  window.   This  is the
-               default.
-
-       -\b-r\bro\boo\bot\bt   Draw on the root window.
-
-       -\b-m\bmo\bon\bno\bo   If  on  a  color  display,  pretend  we're  on   a
-               monochrome display.
-
-       -\b-i\bin\bns\bst\bta\bal\bll\bl
-               Install a private colormap for the window.
-
-       -\b-v\bvi\bis\bsu\bua\bal\bl _\bv_\bi_\bs_\bu_\ba_\bl
-               Specify which visual to use.  Legal values are the
-               name of a visual class, or the id number  (decimal
-               or hex) of a specific visual.
-
-       -\b-c\bco\bou\bun\bnt\bt _\bi_\bn_\bt_\be_\bg_\be_\br
-               How many particles should be allowed on the screen
-               at once.  Default 100.
-
-       -\b-f\bfr\bre\beq\bqu\bue\ben\bnc\bcy\by _\bi_\bn_\bt_\be_\bg_\be_\br
-               How often new missiles should launch.  Default 30.
-
-       -\b-s\bsc\bca\bat\btt\bte\ber\br _\bi_\bn_\bt_\be_\bg_\be_\br
-               How  many  particles  should appear when a missile
-               explodes.  Default 20.  The actual number used  is
-               between _\bN and _\bN_\b+_\b(_\bN_\b/_\b2_\b).
-
-E\bEN\bNV\bVI\bIR\bRO\bON\bNM\bME\bEN\bNT\bT
-       D\bDI\bIS\bSP\bPL\bLA\bAY\bY to get the default host and display number.
-
-       X\bXE\bEN\bNV\bVI\bIR\bRO\bON\bNM\bME\bEN\bNT\bT
-               to  get the name of a resource file that overrides
-               the global resources stored in  the  RESOURCE_MAN-
-               AGER property.
-
-S\bSE\bEE\bE A\bAL\bLS\bSO\bO
-       X\bX(1), x\bxs\bsc\bcr\bre\bee\ben\bns\bsa\bav\bve\ber\br(1)
-
-
-
-X Version 11                13-aug-92                           1
-
-
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-C\bCO\bOP\bPY\bYR\bRI\bIG\bGH\bHT\bT
-       Copyright  (C) 1992 by Jamie Zawinski.  Permission to use,
-       copy, modify, distribute, and sell this software  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.   No
-       representations  are  made  about  the suitability of this
-       software for any purpose.  It is provided "as is"  without
-       express or implied warranty.
-
-A\bAU\bUT\bTH\bHO\bOR\bR
-       Jamie Zawinski <jwz@jwz.org>, 13-aug-92.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-X Version 11                13-aug-92                           2
-
-
diff --git a/local/man/cat.1/qix.1 b/local/man/cat.1/qix.1
deleted file mode 100644 (file)
index d99d5d8..0000000
+++ /dev/null
@@ -1,198 +0,0 @@
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-N\bNA\bAM\bME\bE
-       qix - bounce colored lines around a window
-
-S\bSY\bYN\bNO\bOP\bPS\bSI\bIS\bS
-       q\bqi\bix\bx  [-display  _\bh_\bo_\bs_\bt_\b:_\bd_\bi_\bs_\bp_\bl_\ba_\by_\b._\bs_\bc_\br_\be_\be_\bn]  [-foreground  _\bc_\bo_\bl_\bo_\br]
-       [-background _\bc_\bo_\bl_\bo_\br] [-window] [-root]  [-mono]  [-install]
-       [-visual  _\bv_\bi_\bs_\bu_\ba_\bl]  [-segments _\bi_\bn_\bt] [-spread _\bp_\bi_\bx_\be_\bl_\bs] [-size
-       _\bp_\bi_\bx_\be_\bl_\bs] [-count _\bi_\bn_\bt] [-color-shift _\bd_\be_\bg_\br_\be_\be_\bs] [-delay _\bu_\bs_\be_\bc_\bs]
-       [-random]  [-linear]  [-solid]  [-hollow] [-xor] [-no-xor]
-       [-transparent] [-non-transparent]  [-additive]  [-subtrac-
-       tive] [-poly _\bi_\bn_\bt] [-gravity] [-no-gravity]
-
-D\bDE\bES\bSC\bCR\bRI\bIP\bPT\bTI\bIO\bON\bN
-       The  _\bq_\bi_\bx  program bounces a series of line segments around
-       its window.  This is truly the swiss army chainsaw of  qix
-       programs.   If  you know of one with more display modes, I
-       want to know about it.
-
-O\bOP\bPT\bTI\bIO\bON\bNS\bS
-       _\bq_\bi_\bx accepts the following options:
-
-       -\b-w\bwi\bin\bnd\bdo\bow\bw Draw on  a  newly-created  window.   This  is  the
-               default.
-
-       -\b-r\bro\boo\bot\bt   Draw on the root window.
-
-       -\b-m\bmo\bon\bno\bo   If   on  a  color  display,  pretend  we're  on  a
-               monochrome display.
-
-       -\b-i\bin\bns\bst\bta\bal\bll\bl
-               Install a private colormap for the window.
-
-       -\b-v\bvi\bis\bsu\bua\bal\bl _\bv_\bi_\bs_\bu_\ba_\bl
-               Specify which visual to use.  Legal values are the
-               name  of a visual class, or the id number (decimal
-               or hex) of a specific visual.
-
-       -\b-s\bse\beg\bgm\bme\ben\bnt\bts\bs _\bi_\bn_\bt_\be_\bg_\be_\br
-               How many line segments should be  drawn.   Default
-               50.
-
-       -\b-s\bsp\bpr\bre\bea\bad\bd _\bi_\bn_\bt_\be_\bg_\be_\br
-               How  far apart the endpoints of one segment should
-               be from the next.  Default 8.
-
-       -\b-s\bsi\biz\bze\be _\bi_\bn_\bt_\be_\bg_\be_\br
-               The maximum distance one endpoint of a segment  is
-               allowed  to  be from the opposite end of that seg-
-               ment.  Default 0, meaning unlimited.
-
-       -\b-c\bco\bou\bun\bnt\bt _\bi_\bn_\bt_\be_\bg_\be_\br
-               How many qixes to draw.  Default 1.
-
-
-
-
-
-X Version 11                27-Apr-97                           1
-
-
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-       -\b-c\bco\bol\blo\bor\br-\b-s\bsh\bhi\bif\bft\bt _\bd_\be_\bg_\br_\be_\be_\bs
-               If on a color display, the color of the line  seg-
-               ments will cycle through the spectrum.  This spec-
-               ifies how far the hue of each  segment  should  be
-               from  the  next,  in  degrees  on  the  HSV wheel.
-               Default 3.
-
-       -\b-d\bde\bel\bla\bay\by _\bm_\bi_\bc_\br_\bo_\bs_\be_\bc_\bo_\bn_\bd_\bs
-               How much of a delay should be  introduced  between
-               steps  of  the animation.  Default 25000, or about
-               0.025 seconds.
-
-       -\b-r\bra\ban\bnd\bdo\bom\bm The _\bq_\bi_\bx will wander around  the  screen  semi-ran-
-               domly.  This is the default.
-
-       -\b-l\bli\bin\bne\bea\bar\br The  opposite  of  _\b-_\br_\ba_\bn_\bd_\bo_\bm: the _\bq_\bi_\bx will travel in
-               straight lines until it reaches a wall,  and  then
-               it will bounce.
-
-       -\b-s\bso\bol\bli\bid\bd  If  this  is  specified, then the area between the
-               line segments will be filled in with the appropri-
-               ate  color,  instead  of the _\bq_\bi_\bx simply being com-
-               posed  of  one-pixel-wide  line  segments.    This
-               option looks really good in color.
-
-       -\b-h\bho\bol\bll\blo\bow\bw The opposite of _\b-_\bs_\bo_\bl_\bi_\bd; this is the default.
-
-       -\b-x\bxo\bor\br    If  this  is  specified, then qix segments will be
-               drawn and erased with xor, instead of being  drawn
-               in  some color and erased in the background color.
-               This implies _\b-_\bm_\bo_\bn_\bo, in that only two colors can be
-               used.
-
-       -\b-t\btr\bra\ban\bns\bsp\bpa\bar\bre\ben\bnt\bt
-               If  this  is specified, and _\b-_\bc_\bo_\bu_\bn_\bt is greater than
-               1, then each qix will be drawn in one  color,  and
-               when they overlap, the colors will be mixed.  This
-               looks best in conjuction with _\b-_\bs_\bo_\bl_\bi_\bd.
-
-       -\b-n\bno\bon\bn-\b-t\btr\bra\ban\bns\bsp\bpa\bar\bre\ben\bnt\bt
-               Turns off _\b-_\bt_\br_\ba_\bn_\bs_\bp_\ba_\br_\be_\bn_\bt.
-
-       -\b-a\bad\bdd\bdi\bit\bti\biv\bve\be
-               If _\b-_\bt_\br_\ba_\bn_\bs_\bp_\ba_\br_\be_\bn_\bt is  specified,  then  this  option
-               means that the colors will be mixed using an addi-
-               tive color model, as if the qixes  were  projected
-               light.  This is the default.
-
-       -\b-s\bsu\bub\bbt\btr\bra\bac\bct\bti\biv\bve\be
-               If  _\b-_\bt_\br_\ba_\bn_\bs_\bp_\ba_\br_\be_\bn_\bt  is  specified,  then this option
-               means that the colors will be mixed using  a  sub-
-               tractive   color  model,  as  if  the  qixes  were
-               translucent filters.
-
-
-
-
-X Version 11                27-Apr-97                           2
-
-
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-       -\b-p\bpo\bol\bly\by _\bi_\bn_\bt
-               How many vertices each qix-line should  have:  the
-               default  is  2,  meaning  the traditional qix line
-               shape.  Three will yield triangles, and so on.
-
-       -\b-g\bgr\bra\bav\bvi\bit\bty\by
-
-       -\b-n\bno\bo-\b-g\bgr\bra\bav\bvi\bit\bty\by
-               Whether there should be downward attraction.   For
-               example,  the  options  -\b-g\bgr\bra\bav\bvi\bit\bty\by -\b-l\bli\bin\bne\bea\bar\br will make
-               everything move in nice smooth parabolas.  Gravity
-               is off by default.
-
-E\bEN\bNV\bVI\bIR\bRO\bON\bNM\bME\bEN\bNT\bT
-       D\bDI\bIS\bSP\bPL\bLA\bAY\bY to get the default host and display number.
-
-       X\bXE\bEN\bNV\bVI\bIR\bRO\bON\bNM\bME\bEN\bNT\bT
-               to  get the name of a resource file that overrides
-               the global resources stored in  the  RESOURCE_MAN-
-               AGER property.
-
-S\bSE\bEE\bE A\bAL\bLS\bSO\bO
-       X\bX(1), x\bxs\bsc\bcr\bre\bee\ben\bns\bsa\bav\bve\ber\br(1)
-
-C\bCO\bOP\bPY\bYR\bRI\bIG\bGH\bHT\bT
-       Copyright  (C) 1992 by Jamie Zawinski.  Permission to use,
-       copy, modify, distribute, and sell this software  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.   No
-       representations  are  made  about  the suitability of this
-       software for any purpose.  It is provided "as is"  without
-       express or implied warranty.
-
-A\bAU\bUT\bTH\bHO\bOR\bR
-       Jamie Zawinski <jwz@jwz.org>, 13-aug-92.
-
-       Thanks  to  Ariel  Scolnicov  for  the  -poly and -gravity
-       options.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-X Version 11                27-Apr-97                           3
-
-
diff --git a/local/man/cat.1/rd-bomb.1 b/local/man/cat.1/rd-bomb.1
deleted file mode 100644 (file)
index cd9240f..0000000
+++ /dev/null
@@ -1,132 +0,0 @@
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-N\bNA\bAM\bME\bE
-       rd-bomb - reaction/diffusion textures
-
-S\bSY\bYN\bNO\bOP\bPS\bSI\bIS\bS
-       r\brd\bd-\b-b\bbo\bom\bmb\bb [-display _\bh_\bo_\bs_\bt_\b:_\bd_\bi_\bs_\bp_\bl_\ba_\by_\b._\bs_\bc_\br_\be_\be_\bn] [-foreground _\bc_\bo_\bl_\bo_\br]
-       [-background _\bc_\bo_\bl_\bo_\br] [-window] [-root] [-install]  [-visual
-       _\bv_\bi_\bs_\bu_\ba_\bl]  [-width  _\bn] [-height _\bn] [-reaction _\bn] [-diffusion
-       _\bn] [-size _\bf] [-speed _\bf] [-delay _\bu_\bs_\be_\bc_\bs]
-
-D\bDE\bES\bSC\bCR\bRI\bIP\bPT\bTI\bIO\bON\bN
-       The _\br_\bd_\b-_\bb_\bo_\bm_\bb  program  draws  reaction/diffusion  textures.
-       The code is derived from the 'd' mode of the "bomb" visual
-       musical                  instrument                   (see
-       http://www.cs.cmu.edu/~spot/bomb.html).   I  got the equa-
-       tions      from       xmorphia       (http://www.ccsf.cal-
-       tech.edu/ismap/image.html), which is based on a version of
-       the Gray-Scott model taken from:
-           John E. Pearson "Complex Patterns in a Simple System"
-           Science, 261,189, 9 July 1993.
-
-       If the frame-rate is  too  low,  consider  decreasing  the
-       width  and  height  of the tile, or decreasing the size of
-       the active part of the screen.
-
-
-O\bOP\bPT\bTI\bIO\bON\bNS\bS
-       If one of the reaction,  diffusion,  radius,  and  palette
-       options  is set to a negative value, then that option will
-       be set to a random appropriate value.
-
-       Be sure to try "-speed 1 -size 0.1 -epoch 3000".
-
-       _\br_\bd_\b-_\bb_\bo_\bm_\bb accepts the following options:
-
-       -\b-w\bwi\bin\bnd\bdo\bow\bw Draw on  a  newly-created  window.   This  is  the
-               default.
-
-       -\b-r\bro\boo\bot\bt   Draw on the root window.
-
-       -\b-i\bin\bns\bst\bta\bal\bll\bl
-               Install a private colormap for the window.
-
-       -\b-v\bvi\bis\bsu\bua\bal\bl _\bv_\bi_\bs_\bu_\ba_\bl
-               Specify which visual to use.  Legal values are the
-               name of a visual class, or the id number  (decimal
-               or hex) of a specific visual.
-
-       -\b-w\bwi\bid\bdt\bth\bh _\bn
-
-       -\b-h\bhe\bei\big\bgh\bht\bt _\bn
-               Specify the size of the tile, in pixels.
-
-       -\b-r\bre\bea\bac\bct\bti\bio\bon\bn _\bn
-
-
-
-
-X Version 11                10-May-97                           1
-
-
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-       -\b-d\bdi\bif\bff\bfu\bus\bsi\bio\bon\bn _\bn
-               These  are  constants in the equations that effect
-               its visual nature.  Each may be one of 0, 1, or 2.
-
-       -\b-r\bra\bad\bdi\biu\bus\bs _\bn
-               Size of the seed.
-
-       -\b-p\bpa\bal\ble\bet\btt\bte\be _\bn
-               Selects  a  palette.   Must  be  between 0 and 80,
-               inclusive.
-
-       -\b-s\bsi\biz\bze\be _\bf What fraction of the window is actively  drawn,  a
-               floating  point number between 0 (exclusive) and 1
-               (inclusive).  Default is 0.66.
-
-       -\b-s\bsp\bpe\bee\bed\bd _\bf
-               When a fraction  of  the  screen  is  active,  the
-               active  area  moves at this rate (a floating point
-               number).  Default is zero.  Suggested value:  1.0.
-
-       -\b-d\bde\bel\bla\bay\by _\bu_\bs_\be_\bc_\bs
-               How  many  microseconds  to  delay between frames;
-               default 1000, or about 1/1000th of a second.
-
-E\bEN\bNV\bVI\bIR\bRO\bON\bNM\bME\bEN\bNT\bT
-       D\bDI\bIS\bSP\bPL\bLA\bAY\bY to get the default host and display number.
-
-       X\bXE\bEN\bNV\bVI\bIR\bRO\bON\bNM\bME\bEN\bNT\bT
-               to get the name of a resource file that  overrides
-               the  global  resources stored in the RESOURCE_MAN-
-               AGER property.
-
-S\bSE\bEE\bE A\bAL\bLS\bSO\bO
-       X\bX(1), x\bxs\bsc\bcr\bre\bee\ben\bns\bsa\bav\bve\ber\br(1), x\bxl\blo\boc\bck\bk(1)
-
-C\bCO\bOP\bPY\bYR\bRI\bIG\bGH\bHT\bT
-       Copyright (C) 1997 by Scott Draves.
-
-       Permission to use, copy, modify, and distribute this soft-
-       ware 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.
-
-A\bAU\bUT\bTH\bHO\bOR\bR
-       Scott Draves <spot@cs.cmu.edu>, 9/97
-
-
-
-
-
-
-
-
-
-
-X Version 11                10-May-97                           2
-
-
diff --git a/local/man/cat.1/rocks.1 b/local/man/cat.1/rocks.1
deleted file mode 100644 (file)
index cc811b4..0000000
+++ /dev/null
@@ -1,132 +0,0 @@
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-N\bNA\bAM\bME\bE
-       rocks - animation of flying through an asteroid field
-
-S\bSY\bYN\bNO\bOP\bPS\bSI\bIS\bS
-       r\bro\boc\bck\bks\bs  [-display  _\bh_\bo_\bs_\bt_\b:_\bd_\bi_\bs_\bp_\bl_\ba_\by_\b._\bs_\bc_\br_\be_\be_\bn] [-foreground _\bc_\bo_\bl_\bo_\br]
-       [-background _\bc_\bo_\bl_\bo_\br] [-window] [-root] [-mono] [-ncolors _\bn]
-       [-install]   [-visual  _\bv_\bi_\bs_\bu_\ba_\bl]  [-count  _\bi_\bn_\bt_\be_\bg_\be_\br]  [-delay
-       _\bu_\bs_\be_\bc_\bs] [-speed _\bi_\bn_\bt_\be_\bg_\be_\br] [-norotate] [-nomove] [-3d]
-
-D\bDE\bES\bSC\bCR\bRI\bIP\bPT\bTI\bIO\bON\bN
-       The _\br_\bo_\bc_\bk_\bs program draws an animation of an asteroid  field
-       moving  past  the observer (or vice versa).  Sometimes the
-       observer picks up spin on Z axis.
-
-O\bOP\bPT\bTI\bIO\bON\bNS\bS
-       _\br_\bo_\bc_\bk_\bs accepts the following options:
-
-       -\b-w\bwi\bin\bnd\bdo\bow\bw Draw on  a  newly-created  window.   This  is  the
-               default.
-
-       -\b-r\bro\boo\bot\bt   Draw on the root window.
-
-       -\b-m\bmo\bon\bno\bo   Make all the rocks the same color.
-
-       -\b-n\bnc\bco\bol\blo\bor\brs\bs c\bco\bol\blo\bor\brs\bs
-               How  many  different  colors  to  use.  Default 5.
-               Colors are chosen randomly.
-
-       -\b-i\bin\bns\bst\bta\bal\bll\bl
-               Install a private colormap for the window.
-
-       -\b-v\bvi\bis\bsu\bua\bal\bl _\bv_\bi_\bs_\bu_\ba_\bl
-               Specify which visual to use.  Legal values are the
-               name  of a visual class, or the id number (decimal
-               or hex) of a specific visual.
-
-       -\b-c\bco\bou\bun\bnt\bt _\bi_\bn_\bt_\be_\bg_\be_\br
-               Maximum number of rocks to draw on the  screen  at
-               once.  Default 100.
-
-       -\b-s\bsp\bpe\bee\bed\bd _\bi_\bn_\bt_\be_\bg_\be_\br
-               A measure of the speed with which the observer and
-               the rocks pass each other, from 1 to 100.  Default
-               100,  meaning  ``very fast.''  If you're on a slow
-               display connection  (the  animation  looks  jerky)
-               then   try  making  this  number  smaller,  and/or
-               decreasing the number of rocks.
-
-       -\b-d\bde\bel\bla\bay\by _\bm_\bi_\bc_\br_\bo_\bs_\be_\bc_\bo_\bn_\bd_\bs
-               Number  of  microseconds  to  delay  between  each
-               frame.   Default  50000, meaning about 1/20th sec-
-               ond.  Compare and contrast with _\b-_\bs_\bp_\be_\be_\bd, above.
-
-
-
-
-
-X Version 11                13-aug-92                           1
-
-
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-       -\b-n\bno\bor\bro\bot\bta\bat\bte\be
-               Don't rotate the observer; just  fly  through  the
-               field on the level.
-
-       -\b-n\bno\bom\bmo\bov\bve\be Don't  turn  the observer; just fly straight ahead
-               through the field.
-
-       -\b-3\b3d\bd     Do red/blue 3d separations: if  you  look  at  the
-               screen  with 3d glasses, the rocks will be _\bj_\bu_\bm_\bp_\bi_\bn_\bg
-               right _\bo_\bu_\bt at you.  Oooooh, scaaary!
-
-E\bEN\bNV\bVI\bIR\bRO\bON\bNM\bME\bEN\bNT\bT
-       D\bDI\bIS\bSP\bPL\bLA\bAY\bY to get the default host and display number.
-
-       X\bXE\bEN\bNV\bVI\bIR\bRO\bON\bNM\bME\bEN\bNT\bT
-               to get the name of a resource file that  overrides
-               the  global  resources stored in the RESOURCE_MAN-
-               AGER property.
-
-S\bSE\bEE\bE A\bAL\bLS\bSO\bO
-       X\bX(1), x\bxs\bsc\bcr\bre\bee\ben\bns\bsa\bav\bve\ber\br(1)
-
-B\bBU\bUG\bGS\bS
-       There should be an option  to  display  doppler  shift  (a
-       gravity rainbow.)
-
-       Speed of rotation should be settable.
-
-       Default  speed  of  rotation should be relative to forward
-       velocity.
-
-C\bCO\bOP\bPY\bYR\bRI\bIG\bGH\bHT\bT
-       Copyright (C) 1992 by Jamie Zawinski.  Permission to  use,
-       copy,  modify,  distribute, and sell this software 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.  No
-       representations are made about  the  suitability  of  this
-       software  for any purpose.  It is provided "as is" without
-       express or implied warranty.
-
-A\bAU\bUT\bTH\bHO\bOR\bR
-       Based on Lisp Machine  code  copyright  1988  John  Nguyen
-       <johnn@hx.lcs.mit.edu>.
-
-       Ported  to  C  and  X  by  Jamie  Zawinski  <jwz@jwz.org>,
-       13-aug-92.
-
-       Steering  code  by  Jeremie  Petit;  3D  code  by   theil-
-       ing@coli.uni-sb.de.
-
-
-
-
-
-
-X Version 11                13-aug-92                           2
-
-
diff --git a/local/man/cat.1/rorschach.1 b/local/man/cat.1/rorschach.1
deleted file mode 100644 (file)
index 4592596..0000000
+++ /dev/null
@@ -1,132 +0,0 @@
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-N\bNA\bAM\bME\bE
-       rorschach - simulate ink-blot patterns
-
-S\bSY\bYN\bNO\bOP\bPS\bSI\bIS\bS
-       r\bro\bor\brs\bsc\bch\bha\bac\bch\bh   [-display   _\bh_\bo_\bs_\bt_\b:_\bd_\bi_\bs_\bp_\bl_\ba_\by_\b._\bs_\bc_\br_\be_\be_\bn]  [-foreground
-       _\bc_\bo_\bl_\bo_\br]  [-background  _\bc_\bo_\bl_\bo_\br]  [-window]  [-root]   [-mono]
-       [-install] [-visual _\bv_\bi_\bs_\bu_\ba_\bl] [-iterations _\bi_\bn_\bt_\be_\bg_\be_\br] [-offset
-       _\bi_\bn_\bt_\be_\bg_\be_\br] [-xsymmetry] [-ysymmetry]  [-erase-mode  _\bi_\bn_\bt_\be_\bg_\be_\br]
-       [-erase-speed _\bu_\bs_\be_\bc_\bs] [-delay _\bs_\be_\bc_\bs]
-
-D\bDE\bES\bSC\bCR\bRI\bIP\bPT\bTI\bIO\bON\bN
-       The _\br_\bo_\br_\bs_\bc_\bh_\ba_\bc_\bh program draws random patterns reminiscent of
-       the psychological test of same name.
-
-O\bOP\bPT\bTI\bIO\bON\bNS\bS
-       _\br_\bo_\br_\bs_\bc_\bh_\ba_\bc_\bh accepts the following options:
-
-       -\b-w\bwi\bin\bnd\bdo\bow\bw Draw on  a  newly-created  window.   This  is  the
-               default.
-
-       -\b-r\bro\boo\bot\bt   Draw on the root window.
-
-       -\b-m\bmo\bon\bno\bo   If   on  a  color  display,  pretend  we're  on  a
-               monochrome display.
-
-       -\b-i\bin\bns\bst\bta\bal\bll\bl
-               Install a private colormap for the window.
-
-       -\b-v\bvi\bis\bsu\bua\bal\bl _\bv_\bi_\bs_\bu_\ba_\bl
-               Specify which visual to use.  Legal values are the
-               name  of a visual class, or the id number (decimal
-               or hex) of a specific visual.
-
-       -\b-i\bit\bte\ber\bra\bat\bti\bio\bon\bns\bs _\bi_\bn_\bt_\be_\bg_\be_\br
-               How many dots should be drawn each time.   Default
-               4000.
-
-       -\b-o\bof\bff\bfs\bse\bet\bt _\bi_\bn_\bt_\be_\bg_\be_\br
-               How  far apart the dots should be.  Default 4 pix-
-               els.
-
-       -\b-x\bxs\bsy\bym\bmm\bme\bet\btr\bry\by
-               Whether the images should be horizontally  symmet-
-               rical.  Default true.
-
-       -\b-y\bys\bsy\bym\bmm\bme\bet\btr\bry\by
-               Whether  the images should be vertically symmetri-
-               cal.  Default false.
-
-       -\b-e\ber\bra\bas\bse\be-\b-m\bmo\bod\bde\be _\bi_\bn_\bt_\be_\bg_\be_\br
-               This sets the erase mode. Mode -1 chooses a random
-               mode  each  time.  There  are  currently  6  modes
-               defined (0-5).
-
-
-
-
-X Version 11                13-aug-92                           1
-
-
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-       -\b-e\ber\bra\bas\bse\be-\b-s\bsp\bpe\bee\bed\bd _\bu_\bs_\be_\bc_\bs
-               This controls the speed at which the  screen  will
-               be  erased.  (Delay  between erasing of individual
-               lines.)
-
-       -\b-d\bde\bel\bla\bay\by _\bs_\be_\bc_\bo_\bn_\bd_\bs
-               This sets the number of seconds  that  the  figure
-               will be on the screen.
-
-E\bEN\bNV\bVI\bIR\bRO\bON\bNM\bME\bEN\bNT\bT
-       D\bDI\bIS\bSP\bPL\bLA\bAY\bY to get the default host and display number.
-
-       X\bXE\bEN\bNV\bVI\bIR\bRO\bON\bNM\bME\bEN\bNT\bT
-               to  get the name of a resource file that overrides
-               the global resources stored in  the  RESOURCE_MAN-
-               AGER property.
-
-B\bBU\bUG\bGS\bS
-       May call your sanity into question.
-
-S\bSE\bEE\bE A\bAL\bLS\bSO\bO
-       X\bX(1), x\bxs\bsc\bcr\bre\bee\ben\bns\bsa\bav\bve\ber\br(1)
-
-C\bCO\bOP\bPY\bYR\bRI\bIG\bGH\bHT\bT
-       Copyright  (C) 1992 by Jamie Zawinski.  Permission to use,
-       copy, modify, distribute, and sell this software  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.   No
-       representations  are  made  about  the suitability of this
-       software for any purpose.  It is provided "as is"  without
-       express or implied warranty.
-
-A\bAU\bUT\bTH\bHO\bOR\bR
-       Jamie Zawinski <jwz@jwz.org>, 13-aug-92.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-X Version 11                13-aug-92                           2
-
-
diff --git a/local/man/cat.1/sierpinski.1 b/local/man/cat.1/sierpinski.1
deleted file mode 100644 (file)
index b09527f..0000000
+++ /dev/null
@@ -1,132 +0,0 @@
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-N\bNA\bAM\bME\bE
-       sierpinski - draws Sierpinski triangle fractals
-
-S\bSY\bYN\bNO\bOP\bPS\bSI\bIS\bS
-       s\bsi\bie\ber\brp\bpi\bin\bns\bsk\bki\bi   [-display  _\bh_\bo_\bs_\bt_\b:_\bd_\bi_\bs_\bp_\bl_\ba_\by_\b._\bs_\bc_\br_\be_\be_\bn]  [-foreground
-       _\bc_\bo_\bl_\bo_\br]  [-background  _\bc_\bo_\bl_\bo_\br]  [-window]  [-root]   [-mono]
-       [-install]  [-visual  _\bv_\bi_\bs_\bu_\ba_\bl]  [-ncolors  _\bi_\bn_\bt_\be_\bg_\be_\br] [-delay
-       _\bm_\bi_\bc_\br_\bo_\bs_\be_\bc_\bo_\bn_\bd_\bs] [-cycles _\bi_\bn_\bt_\be_\bg_\be_\br] [-count _\bi_\bn_\bt_\be_\bg_\be_\br]
-
-
-D\bDE\bES\bSC\bCR\bRI\bIP\bPT\bTI\bIO\bON\bN
-       The _\bs_\bi_\be_\br_\bp_\bi_\bn_\bs_\bk_\bi program draws Sierpinski triangle fractals.
-
-O\bOP\bPT\bTI\bIO\bON\bNS\bS
-       _\bs_\bi_\be_\br_\bp_\bi_\bn_\bs_\bk_\bi accepts the following options:
-
-       -\b-w\bwi\bin\bnd\bdo\bow\bw Draw  on  a  newly-created  window.   This  is the
-               default.
-
-       -\b-r\bro\boo\bot\bt   Draw on the root window.
-
-       -\b-m\bmo\bon\bno\bo   If  on  a  color  display,  pretend  we're  on   a
-               monochrome display.
-
-       -\b-i\bin\bns\bst\bta\bal\bll\bl
-               Install a private colormap for the window.
-
-       -\b-v\bvi\bis\bsu\bua\bal\bl _\bv_\bi_\bs_\bu_\ba_\bl
-               Specify which visual to use.  Legal values are the
-               name of a visual class, or the id number  (decimal
-               or hex) of a specific visual.
-
-       -\b-n\bnc\bco\bol\blo\bor\brs\bs _\bi_\bn_\bt_\be_\bg_\be_\br
-               How  many  colors  should  be  used (if possible).
-               Default 64.  The colors are chosen randomly.
-
-       -\b-c\bcy\byc\bcl\ble\bes\bs _\bi_\bn_\bt_\be_\bg_\be_\br
-
-
-       -\b-c\bco\bou\bun\bnt\bt _\bi_\bn_\bt_\be_\bg_\be_\br
-
-
-E\bEN\bNV\bVI\bIR\bRO\bON\bNM\bME\bEN\bNT\bT
-       D\bDI\bIS\bSP\bPL\bLA\bAY\bY to get the default host and display number.
-
-       X\bXE\bEN\bNV\bVI\bIR\bRO\bON\bNM\bME\bEN\bNT\bT
-               to get the name of a resource file that  overrides
-               the  global  resources stored in the RESOURCE_MAN-
-               AGER property.
-
-S\bSE\bEE\bE A\bAL\bLS\bSO\bO
-       X\bX(1), x\bxs\bsc\bcr\bre\bee\ben\bns\bsa\bav\bve\ber\br(1), x\bxl\blo\boc\bck\bk(1)
-
-
-
-
-
-X Version 11                10-May-97                           1
-
-
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-C\bCO\bOP\bPY\bYR\bRI\bIG\bGH\bHT\bT
-       Copyright (C) 1996 by Desmond Daignault.
-
-       Permission to use, copy, modify, and distribute this soft-
-       ware 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.
-
-A\bAU\bUT\bTH\bHO\bOR\bR
-       Desmond  Daignault  <tekdd@dtol.datatimes.com>, 05-Sep-96.
-       (Original xlock version was called tri.c.)
-
-       Ability to run standalone or with  _\bx_\bs_\bc_\br_\be_\be_\bn_\bs_\ba_\bv_\be_\br  added  by
-       Jamie  Zawinski  <jwz@jwz.org>,  10-May-97.   (Renamed  to
-       sierpinski.)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-X Version 11                10-May-97                           2
-
-
diff --git a/local/man/cat.1/slidescreen.1 b/local/man/cat.1/slidescreen.1
deleted file mode 100644 (file)
index 695d71d..0000000
+++ /dev/null
@@ -1,198 +0,0 @@
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-N\bNA\bAM\bME\bE
-       slidescreen - permute the screen image like an 8-puzzle
-
-S\bSY\bYN\bNO\bOP\bPS\bSI\bIS\bS
-       s\bsl\bli\bid\bde\bes\bsc\bcr\bre\bee\ben\bn  [-display  _\bh_\bo_\bs_\bt_\b:_\bd_\bi_\bs_\bp_\bl_\ba_\by_\b._\bs_\bc_\br_\be_\be_\bn]  [-background
-       _\bc_\bo_\bl_\bo_\br] [-grid-size _\bp_\bi_\bx_\be_\bl_\bs] [-ibw _\bp_\bi_\bx_\be_\bl_\bs] [-increment  _\bp_\bi_\bx_\b-
-       _\be_\bl_\bs]  [-delay  _\bu_\bs_\be_\bc_\bs]  [-delay2  _\bu_\bs_\be_\bc_\bs]  [-window] [-root]
-       [-install] [-visual _\bv_\bi_\bs_\bu_\ba_\bl]
-
-D\bDE\bES\bSC\bCR\bRI\bIP\bPT\bTI\bIO\bON\bN
-       The _\bs_\bl_\bi_\bd_\be_\bs_\bc_\br_\be_\be_\bn program takes  an  image  of  the  screen,
-       divides  it  into  a grid, deletes a random square of that
-       grid, and then randomly slides one  of  the  neighbors  of
-       this "hole" into the hole (and repeat.)
-
-O\bOP\bPT\bTI\bIO\bON\bNS\bS
-       _\bs_\bl_\bi_\bd_\be_\bs_\bc_\br_\be_\be_\bn accepts the following options:
-
-       -\b-w\bwi\bin\bnd\bdo\bow\bw Draw  on  a  newly-created  window.   This  is the
-               default.
-
-       -\b-r\bro\boo\bot\bt   Draw on the root window.
-
-       -\b-i\bin\bns\bst\bta\bal\bll\bl
-               Install a private colormap for the window.
-
-       -\b-v\bvi\bis\bsu\bua\bal\bl _\bv_\bi_\bs_\bu_\ba_\bl
-               Specify which visual to use.  Legal values are the
-               name  of a visual class, or the id number (decimal
-               or hex) of a specific visual.
-
-       -\b-g\bgr\bri\bid\bd-\b-s\bsi\biz\bze\be _\bp_\bi_\bx_\be_\bl_\bs
-               The size of the grid cells.  Default 70 pixels.
-
-       -\b-i\bib\bbw\bw _\bp_\bi_\bx_\be_\bl_\bs
-               The size  of  the  "gutter"  between  grid  cells.
-               Default 1 pixel.
-
-       -\b-i\bin\bnc\bcr\bre\bem\bme\ben\bnt\bt _\bp_\bi_\bx_\be_\bl_\bs
-               How  many  pixels by which a piece should be moved
-               when sliding to a new location.  Default  10  pix-
-               els.
-
-       -\b-d\bde\bel\bla\bay\by _\bm_\bi_\bc_\br_\bo_\bs_\be_\bc_\bo_\bn_\bd_\bs
-               How  much  of a delay should be introduced between
-               steps of the animation of the motion of each  seg-
-               ment.  Default 50000, which is 0.05 seconds.  This
-               is closely related to the _\b-_\bi_\bn_\bc_\br_\be_\bm_\be_\bn_\bt parameter.
-
-       -\b-d\bde\bel\bla\bay\by _\bm_\bi_\bc_\br_\bo_\bs_\be_\bc_\bo_\bn_\bd_\bs
-               How much of a delay should be  introduced  between
-               the  end  of  the  motion  of  one segment and the
-               beginning  of  the  motion  of  another.   Default
-               1000000, which is one second.
-
-
-
-X Version 11                24-Nov-97                           1
-
-
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-R\bRE\bES\bSO\bOU\bUR\bRC\bCE\bES\bS
-       On  some systems (currently, only SGIs), this program can,
-       instead of grabbing a desktop image, grab a frame of video
-       from  an external camera and manipulate that instead.  The
-       following resources control that.
-
-
-       g\bgr\bra\bab\bbV\bVi\bid\bde\beo\boP\bPr\bro\bob\bba\bab\bbi\bil\bli\bit\bty\by (Float)
-               What portion of the time to grab video rather than
-               a  screen image, between 0.0 and 1.0.  Defaults to
-               0.5, or half the time.
-
-       v\bvi\bid\bde\beo\boD\bDe\bev\bvi\bic\bce\be (Integer)
-               The number of the default video  input  device  to
-               check  first.   If unspecified, the default camera
-               (from videopanel(1)) will be checked first.  After
-               that, all other available video input devices will
-               be checked in order.
-
-               The first one which  produces  a  non-black  image
-               will be used.  If all images are black, the others
-               will be re-checked a few times  before  giving  up
-               and  falling  back  to  simply  grabbing a desktop
-               image (but note that this takes a few seconds,  so
-               if  you  don't  actually  have  any  video sources
-               hooked up, you should consider turning  off  video
-               grabbing  by setting g\bgr\bra\bab\bbV\bVi\bid\bde\beo\boP\bPr\bro\bob\bba\bab\bbi\bil\bli\bit\bty\by to 0.0.)
-
-       v\bvi\bid\bde\beo\boG\bGa\bai\bin\bn (Float)
-               The amount by which to brighten the grabbed image.
-               This defaults to 2.2.
-
-E\bEN\bNV\bVI\bIR\bRO\bON\bNM\bME\bEN\bNT\bT
-       D\bDI\bIS\bSP\bPL\bLA\bAY\bY to get the default host and display number.
-
-       X\bXE\bEN\bNV\bVI\bIR\bRO\bON\bNM\bME\bEN\bNT\bT
-               to  get the name of a resource file that overrides
-               the global resources stored in  the  RESOURCE_MAN-
-               AGER property.
-
-S\bSE\bEE\bE A\bAL\bLS\bSO\bO
-       X\bX(1), x\bxs\bsc\bcr\bre\bee\ben\bns\bsa\bav\bve\ber\br(1)
-
-C\bCO\bOP\bPY\bYR\bRI\bIG\bGH\bHT\bT
-       Copyright  (C) 1992 by Jamie Zawinski.  Permission to use,
-       copy, modify, distribute, and sell this software  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.   No
-       representations  are  made  about  the suitability of this
-       software for any purpose.  It is provided "as is"  without
-       express or implied warranty.
-
-
-
-
-X Version 11                24-Nov-97                           2
-
-
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-A\bAU\bUT\bTH\bHO\bOR\bR
-       Jamie Zawinski <jwz@jwz.org>, 3-dec-92.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-X Version 11                24-Nov-97                           3
-
-
diff --git a/local/man/cat.1/slip.1 b/local/man/cat.1/slip.1
deleted file mode 100644 (file)
index 46c8df7..0000000
+++ /dev/null
@@ -1,132 +0,0 @@
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-N\bNA\bAM\bME\bE
-       slip - sucks your screen into a jet engine
-
-S\bSY\bYN\bNO\bOP\bPS\bSI\bIS\bS
-       s\bsl\bli\bip\bp  [-display  _\bh_\bo_\bs_\bt_\b:_\bd_\bi_\bs_\bp_\bl_\ba_\by_\b._\bs_\bc_\br_\be_\be_\bn]  [-foreground _\bc_\bo_\bl_\bo_\br]
-       [-background _\bc_\bo_\bl_\bo_\br] [-window] [-root]  [-mono]  [-install]
-       [-visual  _\bv_\bi_\bs_\bu_\ba_\bl] [-ncolors _\bi_\bn_\bt_\be_\bg_\be_\br] [-iterations _\bi_\bn_\bt_\be_\bg_\be_\br]
-       [-points _\bi_\bn_\bt_\be_\bg_\be_\br] [-delay _\bm_\bi_\bc_\br_\bo_\bs_\be_\bc_\bo_\bn_\bd_\bs] [-delay2 _\bm_\bi_\bc_\br_\bo_\bs_\be_\bc_\b-
-       _\bo_\bn_\bd_\bs]
-
-D\bDE\bES\bSC\bCR\bRI\bIP\bPT\bTI\bIO\bON\bN
-       The  _\bs_\bl_\bi_\bp  program  does  lots  of blits and chews up your
-       screen image.
-
-O\bOP\bPT\bTI\bIO\bON\bNS\bS
-       _\bs_\bl_\bi_\bp accepts the following options:
-
-       -\b-w\bwi\bin\bnd\bdo\bow\bw Draw on  a  newly-created  window.   This  is  the
-               default.
-
-       -\b-r\bro\boo\bot\bt   Draw on the root window.
-
-       -\b-m\bmo\bon\bno\bo   If   on  a  color  display,  pretend  we're  on  a
-               monochrome display.
-
-       -\b-i\bin\bns\bst\bta\bal\bll\bl
-               Install a private colormap for the window.
-
-       -\b-v\bvi\bis\bsu\bua\bal\bl _\bv_\bi_\bs_\bu_\ba_\bl
-               Specify which visual to use.  Legal values are the
-               name  of a visual class, or the id number (decimal
-               or hex) of a specific visual.
-
-       -\b-n\bnc\bco\bol\blo\bor\brs\bs _\bi_\bn_\bt_\be_\bg_\be_\br
-               How many colors  should  be  used  (if  possible).
-               Default  128.   The  colors used cycle through the
-               hue, making N stops around the color wheel.
-
-       -\b-c\bco\bou\bun\bnt\bt _\bi_\bn_\bt_\be_\bg_\be_\br
-               How many whooziwhatsis to generate.  Default 35.
-
-       -\b-c\bcy\byc\bcl\ble\bes\bs _\bi_\bn_\bt_\be_\bg_\be_\br
-               How long to frobnicate.  Default 50.
-
-       -\b-d\bde\bel\bla\bay\by _\bm_\bi_\bc_\br_\bo_\bs_\be_\bc_\bo_\bn_\bd_\bs
-               How long we should wait between drawing each step.
-               Default 50000, or about 1/20th second.
-
-
-R\bRE\bES\bSO\bOU\bUR\bRC\bCE\bES\bS
-       On  some systems (currently, only SGIs), this program can,
-       instead of grabbing a desktop image, grab a frame of video
-       from  an external camera and manipulate that instead.  The
-       following resources control that.
-
-
-
-X Version 11                24-Nov-97                           1
-
-
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-       g\bgr\bra\bab\bbV\bVi\bid\bde\beo\boP\bPr\bro\bob\bba\bab\bbi\bil\bli\bit\bty\by (Float)
-               What portion of the time to grab video rather than
-               a  screen image, between 0.0 and 1.0.  Defaults to
-               0.5, or half the time.
-
-       v\bvi\bid\bde\beo\boD\bDe\bev\bvi\bic\bce\be (Integer)
-               The number of the default video  input  device  to
-               check  first.   If unspecified, the default camera
-               (from videopanel(1)) will be checked first.  After
-               that, all other available video input devices will
-               be checked in order.
-
-               The first one which  produces  a  non-black  image
-               will be used.  If all images are black, the others
-               will be re-checked a few times  before  giving  up
-               and  falling  back  to  simply  grabbing a desktop
-               image (but note that this takes a few seconds,  so
-               if  you  don't  actually  have  any  video sources
-               hooked up, you should consider turning  off  video
-               grabbing  by setting g\bgr\bra\bab\bbV\bVi\bid\bde\beo\boP\bPr\bro\bob\bba\bab\bbi\bil\bli\bit\bty\by to 0.0.)
-
-       v\bvi\bid\bde\beo\boG\bGa\bai\bin\bn (Float)
-               The amount by which to brighten the grabbed image.
-               This defaults to 2.2.
-
-E\bEN\bNV\bVI\bIR\bRO\bON\bNM\bME\bEN\bNT\bT
-       D\bDI\bIS\bSP\bPL\bLA\bAY\bY to get the default host and display number.
-
-       X\bXE\bEN\bNV\bVI\bIR\bRO\bON\bNM\bME\bEN\bNT\bT
-               to  get the name of a resource file that overrides
-               the global resources stored in  the  RESOURCE_MAN-
-               AGER property.
-
-S\bSE\bEE\bE A\bAL\bLS\bSO\bO
-       X\bX(1), x\bxs\bsc\bcr\bre\bee\ben\bns\bsa\bav\bve\ber\br(1), x\bxl\blo\boc\bck\bk(1)
-
-C\bCO\bOP\bPY\bYR\bRI\bIG\bGH\bHT\bT
-       Copyright (C) 1992 by Scott Draves.
-
-       Permission to use, copy, modify, and distribute this soft-
-       ware 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.
-
-A\bAU\bUT\bTH\bHO\bOR\bR
-       Scott Graves <spot@cs.cmu.edu>.
-
-       Ability to run standalone or with  _\bx_\bs_\bc_\br_\be_\be_\bn_\bs_\ba_\bv_\be_\br  added  by
-       Jamie Zawinski <jwz@jwz.org>, 18-Oct-93.
-
-
-
-
-
-
-X Version 11                24-Nov-97                           2
-
-
diff --git a/local/man/cat.1/sonar.1 b/local/man/cat.1/sonar.1
deleted file mode 100644 (file)
index 494dbc0..0000000
+++ /dev/null
@@ -1,264 +0,0 @@
-
-
-
-Sonar(1)                                                 Sonar(1)
-
-
-N\bNA\bAM\bME\bE
-       sonar - display a sonar scope
-
-S\bSY\bYN\bNO\bOP\bPS\bSI\bIS\bS
-       s\bso\bon\bna\bar\br [-background _\bc_\bo_\bl_\bo_\br] [-sweep-color _\bc_\bo_\bl_\bo_\br] [-low-color
-       _\bc_\bo_\bl_\bo_\br]   [-scope-color    _\bc_\bo_\bl_\bo_\br]    [-grid-color    _\bc_\bo_\bl_\bo_\br]
-       [-text-color  _\bc_\bo_\bl_\bo_\br]  [-ttl  _\bi_\bn_\bt_\be_\bg_\be_\br]  [-mode ping] [-font
-       _\bf_\bo_\bn_\bt] [-ping-timeout _\bi_\bn_\bt] [-ping-source list | file | sub-
-       net  ] [-ping-file _\bh_\bo_\bs_\bt_\bs_\b-_\bf_\bi_\bl_\be] [-ping-list _\bh_\bo_\bs_\bt_\b-_\bn_\ba_\bm_\be_\b-_\bl_\bi_\bs_\bt]
-       [-team-a-name _\bs_\bt_\br_\bi_\bn_\bg] [-team-b-name _\bs_\bt_\br_\bi_\bn_\bg] [-team-a-count
-       _\bi_\bn_\bt] [-team-b-count _\bi_\bn_\bt]
-
-D\bDE\bES\bSC\bCR\bRI\bIP\bPT\bTI\bIO\bON\bN
-       The _\bs_\bo_\bn_\ba_\br program displays a sonar scope on the computer's
-       screen.  This scope polls  a  sensor  as  the  sweep  goes
-       around  the  scope and displays what it finds as bogies on
-       the screen.  The program is designed to support  different
-       modes  representing different types of sensors.  Currently
-       the only implemented sensors are a simulator, and  a  net-
-       work  ping function that pings hosts and plots the results
-       on the scope.
-
-O\bOP\bPT\bTI\bIO\bON\bNS\bS
-       _\bs_\bo_\bn_\ba_\br understands the following options:
-
-       -\b-b\bba\bac\bck\bkg\bgr\bro\bou\bun\bnd\bd _\bC_\bo_\bl_\bo_\br
-               The background Color of the screen not covered  by
-               the scope.
-
-       -\b-s\bsw\bwe\bee\bep\bp-\b-c\bco\bol\blo\bor\br _\bC_\bo_\bl_\bo_\br
-               The color of the brightest part of the sweep.
-
-       -\b-s\bsc\bco\bop\bpe\be-\b-c\bco\bol\blo\bor\br _\bC_\bo_\bl_\bo_\br
-               The color of the circular part of the scope.
-
-       -\b-g\bgr\bri\bid\bd-\b-c\bco\bol\blo\bor\br _\bC_\bo_\bl_\bo_\br
-               The  color to the grid lines overlaying the scope.
-
-       -\b-t\bte\bex\bxt\bt-\b-c\bco\bol\blo\bor\br _\bC_\bo_\bl_\bo_\br
-               The color of the text identifying  bogies  on  the
-               scope.
-
-       -\b-t\btt\btl\bl _\bi_\bn_\bt_\be_\bg_\be_\br
-               "Time  to live": visible time of a Bogie. Try val-
-               ues between 10 (very short) and 100.
-
-       -\b-m\bmo\bod\bde\be _\bs_\bi_\bm_\bu_\bl_\ba_\bt_\bi_\bo_\bn _\b| _\bp_\bi_\bn_\bg
-               The sensor mode to use,  the  currently  supported
-               modes _\bs_\bi_\bm_\bu_\bl_\ba_\bt_\be (the default) and _\bp_\bi_\bn_\bg.
-
-       -\b-f\bfo\bon\bnt\bt _\bf_\bo_\bn_\bt
-               The  font  used  to  display  text  on  the scope.
-               Default "fixed".
-
-
-
-
-X Version 11                 3-Nov-98                           1
-
-
-
-
-
-Sonar(1)                                                 Sonar(1)
-
-
-       -\b-p\bpi\bin\bng\bg-\b-t\bti\bim\bme\beo\bou\but\bt _\bi_\bn_\bt
-               The amount of time  in  milliseconds  the  program
-               will wait for an answer to a ping.
-
-       -\b-p\bpi\bin\bng\bg-\b-s\bso\bou\bur\brc\bce\be l\bli\bis\bst\bt |\b| f\bfi\bil\ble\be |\b| s\bsu\bub\bbn\bne\bet\bt
-               Th source of the list of hosts to ping. Valid val-
-               ues are: _\bl_\bi_\bs_\bt, _\bf_\bi_\bl_\be, _\bs_\bu_\bb_\bn_\be_\bt.  The first two values
-               are described below; and _\bs_\bu_\bb_\bn_\be_\bt indicates that the
-               sonar should ping all hosts in the same subnet  as
-               the  current  machine.  (All addresses are treated
-               as class C nets, therefore this will at most  ping
-               254 hosts.)
-
-       -\b-p\bpi\bin\bng\bg-\b-f\bfi\bil\ble\be _\bf_\bi_\bl_\be_\bn_\ba_\bm_\be
-               The  path  to  a  file  listing the hosts to ping.
-               This file can be in the format used by _\b/_\be_\bt_\bc_\b/_\bh_\bo_\bs_\bt_\bs,
-               or  it  can be any file that has host names as the
-               first element on each line.  If you use  ssh,  try
-               this:
-
-                    sonar -mode ping -ping-file $HOME/.ssh/known_hosts
-
-               This  is  used only used when _\bp_\bi_\bn_\bg_\bS_\bo_\bu_\br_\bc_\be is set to
-               f\bfi\bil\ble\be.
-
-       -\b-p\bpi\bin\bng\bg-\b-l\bli\bis\bst\bt _\bl_\bi_\bs_\bt
-               A  comma   separated   list   of   hostnames,   eg
-               _\b"_\bp_\bi_\bn_\bk_\by_\b,_\bb_\br_\ba_\bi_\bn_\b,_\bd_\bo_\bt_\b".   Only  used when _\bp_\bi_\bn_\bg_\bS_\bo_\bu_\br_\bc_\be is
-               set to l\bli\bis\bst\bt.
-
-       -\b-t\bte\bea\bam\bm-\b-a\ba-\b-n\bna\bam\bme\be _\bs_\bt_\br_\bi_\bn_\bg
-               The name of team A, in simulation-mode.
-
-       -\b-t\bte\bea\bam\bm-\b-b\bb-\b-n\bna\bam\bme\be _\bs_\bt_\br_\bi_\bn_\bg
-               The name of team B, in simulation-mode.
-
-       -\b-t\bte\bea\bam\bm-\b-a\ba-\b-c\bco\bou\bun\bnt\bt _\bi_\bn_\bt
-               The number of bogies on  team  A,  in  simulation-
-               mode.
-
-       -\b-t\bte\bea\bam\bm-\b-b\bb-\b-c\bco\bou\bun\bnt\bt _\bi_\bn_\bt
-               The  number  of  bogies  on team B, in simulation-
-               mode.
-
-R\bRE\bES\bSO\bOU\bUR\bRC\bCE\bES\bS
-       Configuration of the targets to ping is best done by  set-
-       ting X Resources.
-
-
-       b\bba\bac\bck\bkg\bgr\bro\bou\bun\bnd\bd _\b(_\bC_\bo_\bl_\bo_\br_\b)
-               See  option  -background,  above; default value is
-               _\bb_\bl_\ba_\bc_\bk.
-
-
-
-
-
-X Version 11                 3-Nov-98                           2
-
-
-
-
-
-Sonar(1)                                                 Sonar(1)
-
-
-       s\bsw\bwe\bee\bep\bpC\bCo\bol\blo\bor\br _\b(_\bC_\bo_\bl_\bo_\br_\b)
-               See option -sweep-color, above; default  value  is
-               _\b#_\b0_\b0_\bf_\bf_\b0_\b0.
-
-       s\bsc\bco\bop\bpe\beC\bCo\bol\blo\bor\br _\b(_\bC_\bo_\bl_\bo_\br_\b)
-               See  option  -scope-color, above; default value is
-               _\b#_\b0_\b0_\b3_\b3_\b0_\b0.
-
-       g\bgr\bri\bid\bdC\bCo\bol\blo\bor\br _\b(_\bC_\bo_\bl_\bo_\br_\b)
-               See option -grid-color, above;  default  value  is
-               _\b#_\b0_\b0_\ba_\ba_\b0_\b0.
-
-       t\bte\bex\bxt\btC\bCo\bol\blo\bor\br _\b(_\bC_\bo_\bl_\bo_\br_\b)
-               See  option  -text-color,  above; default value is
-               _\b#_\bf_\bf_\bf_\bf_\b0_\b0.
-
-       t\btt\btl\bl _\b(_\bi_\bn_\bt_\be_\bg_\be_\br_\b)
-               See option -ttl, above; default value is _\b9_\b0 or one
-               sweep.
-
-       m\bmo\bod\bde\be _\b(_\bp_\bi_\bn_\bg_\b)
-               See  option  -mode,  above.  If set to d\bde\bef\bfa\bau\bul\blt\bt, it
-               will ping hosts if possible, otherwise,  will  run
-               in simulation-mode.
-
-       f\bfo\bon\bnt\bt _\b(_\bf_\bo_\bn_\bt_\b)
-               See option -font, above; default value is _\bf_\bi_\bx_\be_\bd.
-
-       p\bpi\bin\bng\bgT\bTi\bim\bme\beo\bou\but\bt _\b(_\bI_\bn_\bt_\be_\bg_\be_\br_\b)
-               See  option  -pingtimeout, above; default value is
-               3000.
-
-       p\bpi\bin\bng\bgS\bSo\bou\bur\brc\bce\be _\bl_\bi_\bs_\bt _\b| _\bf_\bi_\bl_\be _\b| _\bs_\bu_\bb_\bn_\be_\bt
-               See option -ping-source, above.  Default value  is
-               _\bf_\bi_\bl_\be.
-
-       p\bpi\bin\bng\bgF\bFi\bil\ble\be _\bp_\ba_\bt_\bh_\bn_\ba_\bm_\be
-               See  option  -ping-file,  above.  Default value is
-               _\b/_\be_\bt_\bc_\b/_\bh_\bo_\bs_\bt_\bs.
-
-       p\bpi\bin\bng\bgL\bLi\bis\bst\bt _\bh_\bo_\bs_\bt_\b,_\bh_\bo_\bs_\bt_\b,_\bh_\bo_\bs_\bt_\b._\b._\b.
-               See option -ping-list,  above;  default  value  is
-               l\blo\boc\bca\bal\blh\bho\bos\bst\bt.
-
-       t\bte\bea\bam\bmA\bAN\bNa\bam\bme\be _\bs_\bt_\br_\bi_\bn_\bg
-               See  option -team-a-name, above.  Default value is
-               F\bF1\b18\b8.
-
-       t\bte\bea\bam\bmB\bBN\bNa\bam\bme\be _\bs_\bt_\br_\bi_\bn_\bg
-               See option -teamBName, above.   Default  value  is
-               M\bMI\bIG\bG.
-
-       t\bte\bea\bam\bmA\bAC\bCo\bou\bun\bnt\bt _\bi_\bn_\bt
-               See  option  -teamACount, above.  Default value is
-
-
-
-X Version 11                 3-Nov-98                           3
-
-
-
-
-
-Sonar(1)                                                 Sonar(1)
-
-
-               4.
-
-       t\bte\bea\bam\bmB\bBC\bCo\bou\bun\bnt\bt _\bi_\bn_\bt
-               See option -teamBCount, above.  Default  value  is
-               4.
-
-N\bNO\bOT\bTE\bES\bS
-       In  order  to  use  the  ping sensor, this program must be
-       installed as setuid root, so that it can  create  an  ICMP
-       socket.
-
-S\bSE\bEE\bE A\bAL\bLS\bSO\bO
-       X\bX(1), x\bxs\bsc\bcr\bre\bee\ben\bns\bsa\bav\bve\ber\br(1), p\bpi\bin\bng\bg(8)
-
-C\bCO\bOP\bPY\bYR\bRI\bIG\bGH\bHT\bT
-       Copyright (C) 1998 by Stephen Martin. (smartin@canada.com)
-
-       Permission to use, copy, modify, distribute, and sell this
-       software  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.   No  representations  are  made  about the
-       suitability of this software for any purpose.  It is  pro-
-       vided "as is" without express or implied warranty.
-
-
-A\bAU\bUT\bTH\bHO\bOR\bRS\bS
-       Stephen Martin <smartin@canada.com>, 3-nov-98.
-
-       Thanks  to  Tom Kelly for suggesting a modular approach to
-       the sensor amoung other things.
-
-       Thomas Bahls  <thommy@cs.tu-berlin.de>  hacked  the  "ttl"
-       option, 12-jul-98.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-X Version 11                 3-Nov-98                           4
-
-
diff --git a/local/man/cat.1/sphere.1 b/local/man/cat.1/sphere.1
deleted file mode 100644 (file)
index 82d4792..0000000
+++ /dev/null
@@ -1,132 +0,0 @@
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-N\bNA\bAM\bME\bE
-       sphere - draws shaded spheres
-
-S\bSY\bYN\bNO\bOP\bPS\bSI\bIS\bS
-       s\bsp\bph\bhe\ber\bre\be  [-display _\bh_\bo_\bs_\bt_\b:_\bd_\bi_\bs_\bp_\bl_\ba_\by_\b._\bs_\bc_\br_\be_\be_\bn] [-foreground _\bc_\bo_\bl_\bo_\br]
-       [-background _\bc_\bo_\bl_\bo_\br] [-window] [-root]  [-mono]  [-install]
-       [-visual _\bv_\bi_\bs_\bu_\ba_\bl] [-ncolors _\bi_\bn_\bt_\be_\bg_\be_\br] [-delay _\bm_\bi_\bc_\br_\bo_\bs_\be_\bc_\bo_\bn_\bd_\bs]
-
-
-D\bDE\bES\bSC\bCR\bRI\bIP\bPT\bTI\bIO\bON\bN
-       The _\bs_\bp_\bh_\be_\br_\be program draws shaded spheres.
-
-O\bOP\bPT\bTI\bIO\bON\bNS\bS
-       _\bs_\bp_\bh_\be_\br_\be accepts the following options:
-
-       -\b-w\bwi\bin\bnd\bdo\bow\bw Draw  on  a  newly-created  window.   This  is the
-               default.
-
-       -\b-r\bro\boo\bot\bt   Draw on the root window.
-
-       -\b-m\bmo\bon\bno\bo   If  on  a  color  display,  pretend  we're  on   a
-               monochrome display.
-
-       -\b-i\bin\bns\bst\bta\bal\bll\bl
-               Install a private colormap for the window.
-
-       -\b-v\bvi\bis\bsu\bua\bal\bl _\bv_\bi_\bs_\bu_\ba_\bl
-               Specify which visual to use.  Legal values are the
-               name of a visual class, or the id number  (decimal
-               or hex) of a specific visual.
-
-       -\b-n\bnc\bco\bol\blo\bor\brs\bs _\bi_\bn_\bt_\be_\bg_\be_\br
-               How  many  colors  should  be  used (if possible).
-               Default 64.  The colors are chosen randomly.
-
-E\bEN\bNV\bVI\bIR\bRO\bON\bNM\bME\bEN\bNT\bT
-       D\bDI\bIS\bSP\bPL\bLA\bAY\bY to get the default host and display number.
-
-       X\bXE\bEN\bNV\bVI\bIR\bRO\bON\bNM\bME\bEN\bNT\bT
-               to get the name of a resource file that  overrides
-               the  global  resources stored in the RESOURCE_MAN-
-               AGER property.
-
-S\bSE\bEE\bE A\bAL\bLS\bSO\bO
-       X\bX(1), x\bxs\bsc\bcr\bre\bee\ben\bns\bsa\bav\bve\ber\br(1), x\bxl\blo\boc\bck\bk(1)
-
-C\bCO\bOP\bPY\bYR\bRI\bIG\bGH\bHT\bT
-       Copyright (C) 1988 by Sun Microsystems, Inc.
-
-       Permission to use, copy, modify, and distribute this soft-
-       ware 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
-
-
-
-X Version 11                27-May-97                           1
-
-
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-       documentation.
-
-A\bAU\bUT\bTH\bHO\bOR\bR
-       Sun Microsystems, Inc, 1988.
-
-       Ability  to  run  standalone or with _\bx_\bs_\bc_\br_\be_\be_\bn_\bs_\ba_\bv_\be_\br added by
-       Jamie Zawinski <jwz@jwz.org>, 27-May-97.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-X Version 11                27-May-97                           2
-
-
diff --git a/local/man/cat.1/spiral.1 b/local/man/cat.1/spiral.1
deleted file mode 100644 (file)
index e817143..0000000
+++ /dev/null
@@ -1,132 +0,0 @@
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-N\bNA\bAM\bME\bE
-       spiral - draws moving circular spiral patterns
-
-S\bSY\bYN\bNO\bOP\bPS\bSI\bIS\bS
-       s\bsp\bpi\bir\bra\bal\bl  [-display _\bh_\bo_\bs_\bt_\b:_\bd_\bi_\bs_\bp_\bl_\ba_\by_\b._\bs_\bc_\br_\be_\be_\bn] [-foreground _\bc_\bo_\bl_\bo_\br]
-       [-background _\bc_\bo_\bl_\bo_\br] [-window] [-root]  [-mono]  [-install]
-       [-visual  _\bv_\bi_\bs_\bu_\ba_\bl] [-ncolors _\bi_\bn_\bt_\be_\bg_\be_\br] [-delay _\bm_\bi_\bc_\br_\bo_\bs_\be_\bc_\bo_\bn_\bd_\bs]
-       [-count _\bi_\bn_\bt_\be_\bg_\be_\br]
-
-
-D\bDE\bES\bSC\bCR\bRI\bIP\bPT\bTI\bIO\bON\bN
-       The _\bs_\bp_\bi_\br_\ba_\bl program draws moving circular spiral patterns
-
-O\bOP\bPT\bTI\bIO\bON\bNS\bS
-       _\bs_\bp_\bi_\br_\ba_\bl accepts the following options:
-
-       -\b-w\bwi\bin\bnd\bdo\bow\bw Draw on  a  newly-created  window.   This  is  the
-               default.
-
-       -\b-r\bro\boo\bot\bt   Draw on the root window.
-
-       -\b-m\bmo\bon\bno\bo   If   on  a  color  display,  pretend  we're  on  a
-               monochrome display.
-
-       -\b-i\bin\bns\bst\bta\bal\bll\bl
-               Install a private colormap for the window.
-
-       -\b-v\bvi\bis\bsu\bua\bal\bl _\bv_\bi_\bs_\bu_\ba_\bl
-               Specify which visual to use.  Legal values are the
-               name  of a visual class, or the id number (decimal
-               or hex) of a specific visual.
-
-       -\b-n\bnc\bco\bol\blo\bor\brs\bs _\bi_\bn_\bt_\be_\bg_\be_\br
-               How many colors  should  be  used  (if  possible).
-               Default 64.  The colors are chosen randomly.
-
-       -\b-c\bco\bou\bun\bnt\bt _\bi_\bn_\bt_\be_\bg_\be_\br
-               Default 40.
-
-       -\b-c\bcy\byc\bcl\ble\bes\bs _\bi_\bn_\bt_\be_\bg_\be_\br
-               Default 350.
-
-
-E\bEN\bNV\bVI\bIR\bRO\bON\bNM\bME\bEN\bNT\bT
-       D\bDI\bIS\bSP\bPL\bLA\bAY\bY to get the default host and display number.
-
-       X\bXE\bEN\bNV\bVI\bIR\bRO\bON\bNM\bME\bEN\bNT\bT
-               to  get the name of a resource file that overrides
-               the global resources stored in  the  RESOURCE_MAN-
-               AGER property.
-
-S\bSE\bEE\bE A\bAL\bLS\bSO\bO
-       X\bX(1), x\bxs\bsc\bcr\bre\bee\ben\bns\bsa\bav\bve\ber\br(1), x\bxl\blo\boc\bck\bk(1)
-
-
-
-
-X Version 11                10-May-97                           1
-
-
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-C\bCO\bOP\bPY\bYR\bRI\bIG\bGH\bHT\bT
-       Copyright (C) 1994 by Darrick Brown.
-
-       Permission to use, copy, modify, and distribute this soft-
-       ware 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.
-
-A\bAU\bUT\bTH\bHO\bOR\bR
-       Darrick Brown, 1994.
-
-       Improved by Peter Schmitzberger  <schmitz@coma.sbg.ac.at>,
-       24-Jul-95.
-
-       Ability  to  run  standalone or with _\bx_\bs_\bc_\br_\be_\be_\bn_\bs_\ba_\bv_\be_\br added by
-       Jamie Zawinski <jwz@jwz.org>, 10-May-97.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-X Version 11                10-May-97                           2
-
-
diff --git a/local/man/cat.1/spotlight.1 b/local/man/cat.1/spotlight.1
deleted file mode 100644 (file)
index 9098673..0000000
+++ /dev/null
@@ -1,132 +0,0 @@
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-N\bNA\bAM\bME\bE
-       spotlight - move spotlight around desktop
-
-S\bSY\bYN\bNO\bOP\bPS\bSI\bIS\bS
-       s\bsp\bpo\bot\btl\bli\big\bgh\bht\bt   [-display   _\bh_\bo_\bs_\bt_\b:_\bd_\bi_\bs_\bp_\bl_\ba_\by_\b._\bs_\bc_\br_\be_\be_\bn]  [-foreground
-       _\bc_\bo_\bl_\bo_\br]  [-background  _\bc_\bo_\bl_\bo_\br]  [-window]  [-root]   [-mono]
-       [-install]  [-visual  _\bv_\bi_\bs_\bu_\ba_\bl] [-delay _\bu_\bs_\be_\bc_\bs] [-radius _\bp_\bi_\bx_\b-
-       _\be_\bl_\bs]
-
-D\bDE\bES\bSC\bCR\bRI\bIP\bPT\bTI\bIO\bON\bN
-       The _\bs_\bp_\bo_\bt_\bl_\bi_\bg_\bh_\bt program draws random rectangles.
-
-O\bOP\bPT\bTI\bIO\bON\bNS\bS
-       _\bs_\bp_\bo_\bt_\bl_\bi_\bg_\bh_\bt accepts the following options:
-
-       -\b-w\bwi\bin\bnd\bdo\bow\bw Draw on  a  newly-created  window.   This  is  the
-               default.
-
-       -\b-r\bro\boo\bot\bt   Draw on the root window.
-
-       -\b-m\bmo\bon\bno\bo   If   on  a  color  display,  pretend  we're  on  a
-               monochrome display.
-
-       -\b-i\bin\bns\bst\bta\bal\bll\bl
-               Install a private colormap for the window.
-
-       -\b-v\bvi\bis\bsu\bua\bal\bl _\bv_\bi_\bs_\bu_\ba_\bl
-               Specify which visual to use.  Legal values are the
-               name  of a visual class, or the id number (decimal
-               or hex) of a specific visual.
-
-       -\b-d\bde\bel\bla\bay\by _\bm_\bi_\bc_\br_\bo_\bs_\be_\bc_\bo_\bn_\bd_\bs
-               Slow it down.
-
-       -\b-r\bra\bad\bdi\biu\bus\bs _\bp_\bi_\bx_\be_\bl_\bs
-               Radius of the spotlight in pixels.
-
-E\bEN\bNV\bVI\bIR\bRO\bON\bNM\bME\bEN\bNT\bT
-       D\bDI\bIS\bSP\bPL\bLA\bAY\bY to get the default host and display number.
-
-       X\bXE\bEN\bNV\bVI\bIR\bRO\bON\bNM\bME\bEN\bNT\bT
-               to get the name of a resource file that  overrides
-               the  global  resources stored in the RESOURCE_MAN-
-               AGER property.
-
-S\bSE\bEE\bE A\bAL\bLS\bSO\bO
-       X\bX(1), x\bxs\bsc\bcr\bre\bee\ben\bns\bsa\bav\bve\ber\br(1)
-
-C\bCO\bOP\bPY\bYR\bRI\bIG\bGH\bHT\bT
-       Copyright (C) 1999 by Rick Schultz.   Permission  to  use,
-       copy,  modify,  distribute, and sell this software 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
-
-
-
-X Version 11               05-Apr-1999                          1
-
-
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-       permission  notice appear in supporting documentation.  No
-       representations are made about  the  suitability  of  this
-       software  for any purpose.  It is provided "as is" without
-       express or implied warranty.
-
-C\bCR\bRE\bED\bDI\bIT\bTS\bS
-       Hacked together by Rick Schultz <rick@skapunx.net>,  based
-       on  StefView  for BackSpace by Darcy Brockbank and on sev-
-       eral other xscreensaver hacks.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-X Version 11               05-Apr-1999                          2
-
-
diff --git a/local/man/cat.1/squiral.1 b/local/man/cat.1/squiral.1
deleted file mode 100644 (file)
index 6c9072d..0000000
+++ /dev/null
@@ -1,132 +0,0 @@
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-N\bNA\bAM\bME\bE
-       squiral - square spirals screensaver
-
-S\bSY\bYN\bNO\bOP\bPS\bSI\bIS\bS
-       s\bsq\bqu\bui\bir\bra\bal\bl [-display _\bh_\bo_\bs_\bt_\b:_\bd_\bi_\bs_\bp_\bl_\ba_\by_\b._\bs_\bc_\br_\be_\be_\bn] [-foreground _\bc_\bo_\bl_\bo_\br]
-       [-background _\bc_\bo_\bl_\bo_\br] [-window] [-root]  [-mono]  [-install]
-       [-noinstall] [-visual _\bv_\bi_\bs_\bu_\ba_\bl] [-fill _\bp_\be_\br_\bc_\be_\bn_\bt] [-count _\bn_\bu_\bm_\b-
-       _\bb_\be_\br] [-delay _\bu_\bs_\be_\bc] [-disorder _\bf_\br_\ba_\bc_\bt_\bi_\bo_\bn] [-handedness _\bf_\br_\ba_\bc_\b-
-       _\bt_\bi_\bo_\bn] [-cycle]
-
-D\bDE\bES\bSC\bCR\bRI\bIP\bPT\bTI\bIO\bON\bN
-       The _\bs_\bq_\bu_\bi_\br_\ba_\bl program displays interacting, spiral-producing
-       automata
-
-
-O\bOP\bPT\bTI\bIO\bON\bNS\bS
-       _\bs_\bq_\bu_\bi_\br_\ba_\bl accepts the following options:
-
-       -\b-w\bwi\bin\bnd\bdo\bow\bw Draw on  a  newly-created  window.   This  is  the
-               default.
-
-       -\b-r\bro\boo\bot\bt   Draw on the root window.
-
-       -\b-m\bmo\bon\bno\bo   If   on  a  color  display,  pretend  we're  on  a
-               monochrome display.
-
-       -\b-i\bin\bns\bst\bta\bal\bll\bl
-               Install a private colormap for the window.
-
-       -\b-v\bvi\bis\bsu\bua\bal\bl _\bv_\bi_\bs_\bu_\ba_\bl
-               Specify which visual to use.  Legal values are the
-               name  of a visual class, or the id number (decimal
-               or hex) of a specific visual.
-
-       -\b-f\bfi\bil\bll\bl _\bp_\be_\br_\bc_\be_\bn_\bt
-               Specify the percent (0-100) of  the  screen  which
-               must  be  filled  before  the  screen  is cleared.
-               60-80 percent are good values.
-
-       -\b-c\bco\bou\bun\bnt\bt _\bn_\bu_\bm_\bb_\be_\br
-               The number of squiralies.  By default, the  screen
-               width divided by 32.
-
-       -\b-d\bde\bel\bla\bay\by _\bu_\bs_\be_\bc
-               The wait between steps.  The default is 1000.
-
-       -\b-d\bdi\bis\bso\bor\brd\bde\ber\br _\bf_\br_\ba_\bc_\bt_\bi_\bo_\bn
-               The  fraction of the time a squiraly will choose a
-               new direction.  The default is 0.005.
-
-       -\b-h\bha\ban\bnd\bde\bed\bdn\bne\bes\bss\bs _\bf_\br_\ba_\bc_\bt_\bi_\bo_\bn
-               The fraction of the time a squiraly will choose to
-               enter  lefthanded  mode.   0.0  means  exclusively
-               right-handed behavior,  0.5  (the  default)  is  a
-
-
-
-X Version 11               18-mar-1999                          1
-
-
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-               balance  between  the  two, and 1.0 is exclusively
-               left-handed behaviour.
-
-E\bEN\bNV\bVI\bIR\bRO\bON\bNM\bME\bEN\bNT\bT
-       D\bDI\bIS\bSP\bPL\bLA\bAY\bY to get the default host and display number.
-
-       X\bXE\bEN\bNV\bVI\bIR\bRO\bON\bNM\bME\bEN\bNT\bT
-               to get the name of a resource file that  overrides
-               the  global  resources stored in the RESOURCE_MAN-
-               AGER property.
-
-B\bBU\bUG\bGS\bS
-       None known
-
-S\bSE\bEE\bE A\bAL\bLS\bSO\bO
-       X\bX(1), x\bxs\bsc\bcr\bre\bee\ben\bns\bsa\bav\bve\ber\br(1)
-
-C\bCO\bOP\bPY\bYR\bRI\bIG\bGH\bHT\bT
-       Copyright (C) 1999, by Jeff  Epler.   Permission  to  use,
-       copy,  modify,  distribute, and sell this software and its
-       documentation for any purpose is  hereby  granted  without
-       fee, provided fnord that the above copyright notice appear
-       in all copies and that both that copyright notice and this
-       permission  notice appear in supporting documentation.  No
-       representations are made about the  suitability  of  fnord
-       this  software  for  any  purpose.  It is provided "as is"
-       without express or fnord implied warranty.
-
-A\bAU\bUT\bTH\bHO\bOR\bR
-       Jeff Epler <jepler@inetnebr.com>, 18-mar-1999
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-X Version 11               18-mar-1999                          2
-
-
diff --git a/local/man/cat.1/starfish.1 b/local/man/cat.1/starfish.1
deleted file mode 100644 (file)
index 105c770..0000000
+++ /dev/null
@@ -1,132 +0,0 @@
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-N\bNA\bAM\bME\bE
-       starfish  -  radially-symmetric throbbing colormap-hacking
-       graphics demo
-
-S\bSY\bYN\bNO\bOP\bPS\bSI\bIS\bS
-       s\bst\bta\bar\brf\bfi\bis\bsh\bh   [-display   _\bh_\bo_\bs_\bt_\b:_\bd_\bi_\bs_\bp_\bl_\ba_\by_\b._\bs_\bc_\br_\be_\be_\bn]   [-foreground
-       _\bc_\bo_\bl_\bo_\br]   [-background  _\bc_\bo_\bl_\bo_\br]  [-window]  [-root]  [-mono]
-       [-install] [-visual _\bv_\bi_\bs_\bu_\ba_\bl] [-delay _\bu_\bs_\be_\bc_\bs] [-delay2  _\bs_\be_\bc_\bs]
-       [-cycle-delay2   _\bu_\bs_\be_\bc_\bs]   [-thickness  _\bp_\bi_\bx_\be_\bl_\bs]  [-rotation
-       _\bd_\be_\bg_\br_\be_\be_\bs]  [-duration  _\bs_\be_\bc_\bo_\bn_\bd_\bs]  [-colors   _\bi_\bn_\bt]   [-cycle]
-       [-no-cycle] [-blob] [-no-blob]
-
-D\bDE\bES\bSC\bCR\bRI\bIP\bPT\bTI\bIO\bON\bN
-       The  _\bs_\bt_\ba_\br_\bf_\bi_\bs_\bh  program  draws  radially symmetric objects,
-       which expand, contract, rotate, and turn inside  out.   It
-       uses  these  shapes  to lay down a field of smooth colors,
-       and then rotates the colormap.
-
-O\bOP\bPT\bTI\bIO\bON\bNS\bS
-       _\bs_\bt_\ba_\br_\bf_\bi_\bs_\bh accepts the following options:
-
-       -\b-w\bwi\bin\bnd\bdo\bow\bw Draw on  a  newly-created  window.   This  is  the
-               default.
-
-       -\b-r\bro\boo\bot\bt   Draw on the root window.
-
-       -\b-m\bmo\bon\bno\bo   If   on  a  color  display,  pretend  we're  on  a
-               monochrome display.
-
-       -\b-i\bin\bns\bst\bta\bal\bll\bl
-               Install a private colormap for the window.
-
-       -\b-v\bvi\bis\bsu\bua\bal\bl _\bv_\bi_\bs_\bu_\ba_\bl
-               Specify which visual to use.  Legal values are the
-               name  of a visual class, or the id number (decimal
-               or hex) of a specific visual.
-
-       -\b-d\bde\bel\bla\bay\by _\bm_\bi_\bc_\br_\bo_\bs_\be_\bc_\bo_\bn_\bd_\bs
-               How much of a delay should be  introduced  between
-               steps  of  the animation.  Default 10000, or about
-               1/100th second.
-
-       -\b-c\bcy\byc\bcl\ble\be-\b-d\bde\bel\bla\bay\by _\bm_\bi_\bc_\br_\bo_\bs_\be_\bc_\bo_\bn_\bd_\bs
-               How long to wait between shifing the  colormap  by
-               one step.  Default 100000, or about 1/10th second.
-
-       -\b-t\bth\bhi\bic\bck\bkn\bne\bes\bss\bs _\bp_\bi_\bx_\be_\bl_\bs
-               How wide each color band should  be.   Default  0,
-               meaning random (the chosen value will be between 0
-               and 15.)
-
-       -\b-r\bro\bot\bta\bat\bti\bio\bon\bn _\bd_\be_\bg_\br_\be_\be_\bs
-               How quickly the  objects  should  rotate  at  each
-               step.  Default 0, meaning random (the chosen value
-
-
-
-X Version 11                14-Jun-97                           1
-
-
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-               will be between 0 and 12 degrees.)
-
-       -\b-c\bco\bol\blo\bor\brs\bs _\bi_\bn_\bt
-               How many colors to use.  Default  200.   The  more
-               colors,  the smoother the transitions will be, and
-               the nicer the resultant images.
-
-       -\b-c\bcy\byc\bcl\ble\be
-
-       -\b-n\bno\bo-\b-c\bcy\byc\bcl\ble\be
-               Whether to do colormap cycling.  Default true.
-
-       -\b-d\bdu\bur\bra\bat\bti\bio\bon\bn _\bs_\be_\bc_\bo_\bn_\bd_\bs
-               How long to  run  before  choosing  a  new  shape.
-               Default 30 seconds.
-
-       -\b-d\bde\bel\bla\bay\by2\b2 _\bs_\be_\bc_\bo_\bn_\bd_\bs
-               When  _\bd_\bu_\br_\ba_\bt_\bi_\bo_\bn  expires,  how  long to wait before
-               starting a new run.  Default 5 seconds.
-
-       -\b-b\bbl\blo\bob\bb
-
-       -\b-n\bno\bo-\b-b\bbl\blo\bob\bb
-               If _\bb_\bl_\bo_\bb option is specified, then the  raw  shapes
-               will be shown, instead of a field of colors gener-
-               ated from them.
-
-E\bEN\bNV\bVI\bIR\bRO\bON\bNM\bME\bEN\bNT\bT
-       D\bDI\bIS\bSP\bPL\bLA\bAY\bY to get the default host and display number.
-
-       X\bXE\bEN\bNV\bVI\bIR\bRO\bON\bNM\bME\bEN\bNT\bT
-               to get the name of a resource file that  overrides
-               the  global  resources stored in the RESOURCE_MAN-
-               AGER property.
-
-S\bSE\bEE\bE A\bAL\bLS\bSO\bO
-       X\bX(1), x\bxs\bsc\bcr\bre\bee\ben\bns\bsa\bav\bve\ber\br(1)
-
-C\bCO\bOP\bPY\bYR\bRI\bIG\bGH\bHT\bT
-       Copyright (C) 1997 by Jamie Zawinski.  Permission to  use,
-       copy,  modify,  distribute, and sell this software 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.  No
-       representations are made about  the  suitability  of  this
-       software  for any purpose.  It is provided "as is" without
-       express or implied warranty.
-
-A\bAU\bUT\bTH\bHO\bOR\bR
-       Jamie Zawinski <jwz@jwz.org>, 14-Jun-97.
-
-
-
-
-
-
-X Version 11                14-Jun-97                           2
-
-
diff --git a/local/man/cat.1/strange.1 b/local/man/cat.1/strange.1
deleted file mode 100644 (file)
index 879ecaf..0000000
+++ /dev/null
@@ -1,132 +0,0 @@
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-N\bNA\bAM\bME\bE
-       strange - draws strange attractors
-
-S\bSY\bYN\bNO\bOP\bPS\bSI\bIS\bS
-       s\bst\btr\bra\ban\bng\bge\be [-display _\bh_\bo_\bs_\bt_\b:_\bd_\bi_\bs_\bp_\bl_\ba_\by_\b._\bs_\bc_\br_\be_\be_\bn] [-foreground _\bc_\bo_\bl_\bo_\br]
-       [-background _\bc_\bo_\bl_\bo_\br] [-window] [-root]  [-mono]  [-install]
-       [-visual _\bv_\bi_\bs_\bu_\ba_\bl] [-ncolors _\bi_\bn_\bt_\be_\bg_\be_\br] [-delay _\bm_\bi_\bc_\br_\bo_\bs_\be_\bc_\bo_\bn_\bd_\bs]
-
-
-D\bDE\bES\bSC\bCR\bRI\bIP\bPT\bTI\bIO\bON\bN
-       The _\bs_\bt_\br_\ba_\bn_\bg_\be program draws strange attractors
-
-O\bOP\bPT\bTI\bIO\bON\bNS\bS
-       _\bs_\bt_\br_\ba_\bn_\bg_\be accepts the following options:
-
-       -\b-w\bwi\bin\bnd\bdo\bow\bw Draw  on  a  newly-created  window.   This  is the
-               default.
-
-       -\b-r\bro\boo\bot\bt   Draw on the root window.
-
-       -\b-m\bmo\bon\bno\bo   If  on  a  color  display,  pretend  we're  on   a
-               monochrome display.
-
-       -\b-i\bin\bns\bst\bta\bal\bll\bl
-               Install a private colormap for the window.
-
-       -\b-v\bvi\bis\bsu\bua\bal\bl _\bv_\bi_\bs_\bu_\ba_\bl
-               Specify which visual to use.  Legal values are the
-               name of a visual class, or the id number  (decimal
-               or hex) of a specific visual.
-
-       -\b-n\bnc\bco\bol\blo\bor\brs\bs _\bi_\bn_\bt_\be_\bg_\be_\br
-               How  many  colors  should  be  used (if possible).
-               Default 64.  The colors are chosen randomly.
-
-E\bEN\bNV\bVI\bIR\bRO\bON\bNM\bME\bEN\bNT\bT
-       D\bDI\bIS\bSP\bPL\bLA\bAY\bY to get the default host and display number.
-
-       X\bXE\bEN\bNV\bVI\bIR\bRO\bON\bNM\bME\bEN\bNT\bT
-               to get the name of a resource file that  overrides
-               the  global  resources stored in the RESOURCE_MAN-
-               AGER property.
-
-S\bSE\bEE\bE A\bAL\bLS\bSO\bO
-       X\bX(1), x\bxs\bsc\bcr\bre\bee\ben\bns\bsa\bav\bve\ber\br(1), x\bxl\blo\boc\bck\bk(1)
-
-C\bCO\bOP\bPY\bYR\bRI\bIG\bGH\bHT\bT
-       Copyright (C) 1997 by Massimino Pascal.
-
-       Permission to use, copy, modify, and distribute this soft-
-       ware 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
-
-
-
-X Version 11                10-May-97                           1
-
-
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-       documentation.
-
-A\bAU\bUT\bTH\bHO\bOR\bR
-       Massimino Pascal <Pascal.Massimon@ens.fr>, 1997.
-
-       Ability  to  run  standalone or with _\bx_\bs_\bc_\br_\be_\be_\bn_\bs_\ba_\bv_\be_\br added by
-       Jamie Zawinski <jwz@jwz.org>, 10-May-97.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-X Version 11                10-May-97                           2
-
-
diff --git a/local/man/cat.1/swirl.1 b/local/man/cat.1/swirl.1
deleted file mode 100644 (file)
index 2dfcc77..0000000
+++ /dev/null
@@ -1,132 +0,0 @@
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-N\bNA\bAM\bME\bE
-       swirl - draws swirly color-cycling patterns
-
-S\bSY\bYN\bNO\bOP\bPS\bSI\bIS\bS
-       s\bsw\bwi\bir\brl\bl  [-display  _\bh_\bo_\bs_\bt_\b:_\bd_\bi_\bs_\bp_\bl_\ba_\by_\b._\bs_\bc_\br_\be_\be_\bn] [-foreground _\bc_\bo_\bl_\bo_\br]
-       [-background _\bc_\bo_\bl_\bo_\br] [-window] [-root]  [-mono]  [-install]
-       [-visual  _\bv_\bi_\bs_\bu_\ba_\bl] [-ncolors _\bi_\bn_\bt_\be_\bg_\be_\br] [-delay _\bm_\bi_\bc_\br_\bo_\bs_\be_\bc_\bo_\bn_\bd_\bs]
-       [-cycles _\bi_\bn_\bt_\be_\bg_\be_\br] [-count _\bi_\bn_\bt_\be_\bg_\be_\br]
-
-
-D\bDE\bES\bSC\bCR\bRI\bIP\bPT\bTI\bIO\bON\bN
-       The _\bs_\bw_\bi_\br_\bl program draws swirly color-cycling patterns.
-
-O\bOP\bPT\bTI\bIO\bON\bNS\bS
-       _\bs_\bw_\bi_\br_\bl accepts the following options:
-
-       -\b-w\bwi\bin\bnd\bdo\bow\bw Draw on  a  newly-created  window.   This  is  the
-               default.
-
-       -\b-r\bro\boo\bot\bt   Draw on the root window.
-
-       -\b-m\bmo\bon\bno\bo   If   on  a  color  display,  pretend  we're  on  a
-               monochrome display.
-
-       -\b-i\bin\bns\bst\bta\bal\bll\bl
-               Install a private colormap for the window.
-
-       -\b-v\bvi\bis\bsu\bua\bal\bl _\bv_\bi_\bs_\bu_\ba_\bl
-               Specify which visual to use.  Legal values are the
-               name  of a visual class, or the id number (decimal
-               or hex) of a specific visual.
-
-       -\b-n\bnc\bco\bol\blo\bor\brs\bs _\bi_\bn_\bt_\be_\bg_\be_\br
-               How many colors  should  be  used  (if  possible).
-               Default 200.
-
-       -\b-c\bcy\byc\bcl\ble\bes\bs _\bi_\bn_\bt_\be_\bg_\be_\br
-
-
-       -\b-c\bco\bou\bun\bnt\bt _\bi_\bn_\bt_\be_\bg_\be_\br
-
-
-E\bEN\bNV\bVI\bIR\bRO\bON\bNM\bME\bEN\bNT\bT
-       D\bDI\bIS\bSP\bPL\bLA\bAY\bY to get the default host and display number.
-
-       X\bXE\bEN\bNV\bVI\bIR\bRO\bON\bNM\bME\bEN\bNT\bT
-               to  get the name of a resource file that overrides
-               the global resources stored in  the  RESOURCE_MAN-
-               AGER property.
-
-S\bSE\bEE\bE A\bAL\bLS\bSO\bO
-       X\bX(1), x\bxs\bsc\bcr\bre\bee\ben\bns\bsa\bav\bve\ber\br(1), x\bxl\blo\boc\bck\bk(1)
-
-
-
-
-
-X Version 11                13-May-97                           1
-
-
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-C\bCO\bOP\bPY\bYR\bRI\bIG\bGH\bHT\bT
-       Copyright (C) 1994 M. Dobie.
-
-       Permission to use, copy, modify, and distribute this soft-
-       ware 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.
-
-
-A\bAU\bUT\bTH\bHO\bOR\bR
-       M.Dobie <mrd@ecs.soton.ac.uk>, 1994.
-
-       Ability to run standalone or with  _\bx_\bs_\bc_\br_\be_\be_\bn_\bs_\ba_\bv_\be_\br  added  by
-       Jamie Zawinski <jwz@jwz.org>, 13-May-97.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-X Version 11                13-May-97                           2
-
-
diff --git a/local/man/cat.1/t3d.1 b/local/man/cat.1/t3d.1
deleted file mode 100644 (file)
index 178599b..0000000
+++ /dev/null
@@ -1,198 +0,0 @@
-
-
-
-t3d(1)                                                     t3d(1)
-
-
-N\bNA\bAM\bME\bE
-       t3d - clock using flying balls to display the time
-
-S\bSY\bYN\bNO\bOP\bPS\bSI\bIS\bS
-       t3d [  _\bo_\bp_\bt_\bi_\bo_\bn_\bs ]...
-
-D\bDE\bES\bSC\bCR\bRI\bIP\bPT\bTI\bIO\bON\bN
-       Time  3D  is  a clock. It uses flying balls to display the
-       time. This balls move and wobble around to  give  you  the
-       impression  your graphic workstation with its many XStones
-       is doing something.
-
-       t3d uses mouse and keyboard to let  you  fly  through  the
-       balls. Hit S\bS to speed up, A\bA to slow down, Z\bZ to zoom in and
-       X\bX to zoom out.  Use the l\ble\bef\bft\bt m\bmo\bou\bus\bse\be b\bbu\but\btt\bto\bon\bn to rotate to the
-       left  and the r\bri\big\bgh\bht\bt m\bmo\bou\bus\bse\be b\bbu\but\btt\bto\bon\bn to rotate the view to the
-       right. Use the m\bmi\bid\bdd\bdl\ble\be m\bmo\bou\bus\bse\be b\bbu\but\btt\bto\bon\bn to change  the  optical
-       axis and the moving direction.  0\b0 (zero) will stop you.  Q\bQ
-       quits.
-
-
-O\bOP\bPT\bTI\bIO\bON\bNS\bS
-       -\b-m\bmo\bov\bve\be _\bf_\ba_\bc_\bt_\bo_\br
-              Modifies the direction move of t3d. The clock looks
-              30  degrees*  _\bf_\ba_\bc_\bt_\bo_\br  to  the left and to the right
-              periodically.
-
-       -\b-w\bwo\bob\bbb\bbl\ble\be _\bf_\ba_\bc_\bt_\bo_\br
-              Modifies the wobbling (sounds nice :-)  of  t3d  by
-              multiplying  the  default  deformation of the clock
-              with _\bf_\ba_\bc_\bt_\bo_\br_\b.
-
-       -\b-m\bmi\bin\bnu\but\bte\bes\bs
-              Shows one small ball for every minute,  instead  of
-              one for every 2.5 minutes.
-
-       -\b-m\bma\bag\bg _\bf_\ba_\bc_\bt_\bo_\br
-              Changes  the  magnification of t3d. By default, t3d
-              draws a 200x200 image.  A .I factor of 2 means,  it
-              will use a 400x400 image.
-
-       -\b-c\bcy\byc\bcl\ble\be _\bp_\be_\br_\bi_\bo_\bd
-              Sets   the  moving  cycle  to  _\bp_\be_\br_\bi_\bo_\bd  seconds.  By
-              default, this value is 10 seconds.
-
-       -\b-w\bwa\bai\bit\bt _\bm_\bi_\bc_\br_\bo_\bs_\be_\bc
-              Inserts a wait after drawing one view of the clock.
-              By  default,  t3d  waits  40 ms after each drawing.
-              This helps you to keep the performance loss  small.
-
-       -\b-f\bfa\bas\bst\bt _\bp_\br_\be_\bc_\ba_\bl_\bc_\b__\br_\ba_\bd_\bi_\bu_\bs
-              t3d  uses  bitmap copy to draw precalculated balls.
-              You can specify the radius in pixels  up  to  which
-              t3d  should  precalculate  balls.  t3d  will  set a
-
-
-
-Time 3D                    Version 1.1                          1
-
-
-
-
-
-t3d(1)                                                     t3d(1)
-
-
-              useful range by itself using the magnification when
-              it is started.
-
-       -\b-c\bco\bol\blc\bcy\byc\bcl\ble\be
-              Draws  cyclic the color scale used for the balls in
-              the background instead of the normal black.
-
-       -\b-r\brg\bgb\bb _\br_\be_\bd _\bg_\br_\be_\be_\bn _\bb_\bl_\bu_\be
-              Selects the color in RGB color space of the  light-
-              ning  spot on the balls.  All the other colors used
-              for balls or -\b-c\bco\bol\blc\bcy\byc\bcl\ble\be are less intensive colors of
-              the same hue and saturation. All values in range of
-              0 to 1.
-
-       -\b-h\bhs\bsv\bv _\bh_\bu_\be _\bs_\ba_\bt_\bu_\br_\ba_\bt_\bi_\bo_\bn _\bv_\ba_\bl_\bu_\be
-              Selects the color in HSV color space.   _\bh_\bu_\be  is  in
-              degrees  from  0  to 360, all other values in range
-              from 0 to 1. It gives nice but rather unpredictable
-              results, if you use a saturation of e.g. 2.  Try it
-              at your own risk.
-
-       -\b-h\bhs\bsv\bvc\bcy\byc\bcl\ble\be _\bs_\bp_\be_\be_\bd
-              Rotates the hue axis every 10 seconds* _\bs_\bp_\be_\be_\bd_\b.
-
-       -\b-h\bhe\bel\blp\bp  Prints a short usage message.
-
-
-
-A\bAU\bUT\bTH\bHO\bOR\bR
-       Bernd Paysan
-
-       Email: bernd.paysan@gmx.de
-
-       Hacked on by jwz@jwz.org for xscreensaver.
-
-
-A\bAC\bCK\bKN\bNO\bOW\bWL\bLE\bED\bDG\bGE\bEM\bME\bEN\bNT\bT
-       Acknowledgement to Georg Acher, who wrote the initial pro-
-       gram displaying balls.
-
-
-C\bCO\bOP\bPY\bYI\bIN\bNG\bG
-       Copy,  modify, and distribute T3D either under GPL version
-       2 or newer, or under the standard MIT/X license notice.
-
-
-D\bDI\bIS\bSC\bCL\bLA\bAI\bIM\bME\bER\bR
-       T3D is  not  related  to  T3D(tm),  the  massive  parallel
-       Alpha--based  supercomputer from Cray Research. T3D's name
-       was invented in 1991, years before  the  project  at  Cray
-       Research  started. There is no relation from T3D to Cray's
-       T3D, even  the  balls  surrounding  T3D  on  some  posters
-       weren't  an  inspiration  for  T3D.  I don't know anything
-       about the other way round.
-
-
-
-Time 3D                    Version 1.1                          2
-
-
-
-
-
-t3d(1)                                                     t3d(1)
-
-
-       The programming style of T3D isn't intented as example  of
-       good  style,  but as example of how a fast prototyped demo
-       may look like. T3D wasn't created to  be  useful,  it  was
-       created to be nice.
-
-
-K\bKN\bNO\bOW\bWN\bN B\bBU\bUG\bGS\bS
-       There are no known bugs in T3D. Maybe there are bugs in X.
-       Slight changes in the T3D sources are known to show  these
-       bugs, e.g. if you remove the (int) casting at the XFillArc
-       x,y,w,h-coordinates...
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-Time 3D                    Version 1.1                          3
-
-
diff --git a/local/man/cat.1/vidwhacker.1 b/local/man/cat.1/vidwhacker.1
deleted file mode 100644 (file)
index 4462451..0000000
+++ /dev/null
@@ -1,132 +0,0 @@
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-N\bNA\bAM\bME\bE
-       vidwhacker - grab images and apply random filters to them
-
-S\bSY\bYN\bNO\bOP\bPS\bSI\bIS\bS
-       v\bvi\bid\bdw\bwh\bha\bac\bck\bke\ber\br  [-display  _\bh_\bo_\bs_\bt_\b:_\bd_\bi_\bs_\bp_\bl_\ba_\by_\b._\bs_\bc_\br_\be_\be_\bn] [-root] [-win-
-       dow] [-verbose] [-stdin] [-stdout] [-delay seconds]
-
-D\bDE\bES\bSC\bCR\bRI\bIP\bPT\bTI\bIO\bON\bN
-       The _\bv_\bi_\bd_\bw_\bh_\ba_\bc_\bk_\be_\br program grabs a  image  from  the  system's
-       video  input, applies random image filters to it, and dis-
-       plays the result.  The _\bv_\bi_\bd_\bw_\bh_\ba_\bc_\bk_\be_\br program does not  termi-
-       nate  until  killed.   It depends heavily on x\bxv\bv(1) and the
-       various PBM tools (e.g., p\bpp\bpm\bmr\bre\bel\bli\bie\bef\bf(1).)
-
-O\bOP\bPT\bTI\bIO\bON\bNS\bS
-       _\bv_\bi_\bd_\bw_\bh_\ba_\bc_\bk_\be_\br accepts the following options:
-
-       -\b-r\bro\boo\bot\bt   Draw on the root window.
-
-       -\b-w\bwi\bin\bnd\bdo\bow\bw Pop up a new window displaying the image.  When  a
-               new  image  has been fully processed, destroy that
-               window and pop up a new one.  This is the default.
-
-       -\b-v\bve\ber\brb\bbo\bos\bse\be
-               Print diagnostics.
-
-       -\b-s\bst\btd\bdi\bin\bn  Instead  of  grabbing  an  image from the system's
-               video input, read an  image  to  maniupulate  from
-               stdin.  This image must be in
-
-       -\b-d\bde\bel\bla\bay\by _\bs_\be_\bc_\bo_\bn_\bd_\bs
-               How  long to sleep between images.  Default 3 sec-
-               onds (the actual  elapsed  time  is  significantly
-               longer,  due  to processing time.)  p\bpp\bpm\bm(5) format.
-               The program will  still  perform  repeated  random
-               image transformations, but it will always use this
-               one image as its starting point.
-
-       -\b-s\bst\btd\bdo\bou\but\bt Instead of displaying the image on a window or  on
-               the root, write the new image on stdout, and exit.
-
-E\bEN\bNV\bVI\bIR\bRO\bON\bNM\bME\bEN\bNT\bT
-       D\bDI\bIS\bSP\bPL\bLA\bAY\bY to get the default host and display number.
-
-       X\bXE\bEN\bNV\bVI\bIR\bRO\bON\bNM\bME\bEN\bNT\bT
-               to get the name of a resource file that  overrides
-               the  global  resources stored in the RESOURCE_MAN-
-               AGER property.
-
-B\bBU\bUG\bGS\bS
-       Grabbing video images is, of  course,  very  system-depen-
-       dent.   It  works  on SGIs, and on Linux systems that have
-       the q\bqc\bca\bam\bm(1) program.  If your system does  things  differ-
-       ently, you'll need to edit the vidwhacker script (look for
-
-
-
-X Version 11                17-Jun-99                           1
-
-
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-       the _\bg_\br_\ba_\bb_\b(_\b) function.)
-
-       It's slow.
-
-T\bTO\bO D\bDO\bO
-       It might be interesting to rewrite  this  to  use  g\bgi\bim\bmp\bp(1)
-       plugins instead of the pbm tools.  It probably wouldn't be
-       any faster, but there would be a wider variety of  effects
-       available.
-
-S\bSE\bEE\bE A\bAL\bLS\bSO\bO
-       X\bX(1), x\bxs\bsc\bcr\bre\bee\ben\bns\bsa\bav\bve\ber\br(1), x\bxv\bv(1), p\bpp\bpm\bmt\bto\bog\bgi\bif\bf(1), c\bcj\bjp\bpe\beg\bg(1)
-
-C\bCO\bOP\bPY\bYR\bRI\bIG\bGH\bHT\bT
-       Copyright (C) 1998, 1999 by Jamie Zawinski.  Permission to
-       use, copy, modify, distribute, and sell this software  and
-       its  documentation for any purpose is hereby granted with-
-       out 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.   No
-       representations  are  made  about  the suitability of this
-       software for any purpose.  It is provided "as is"  without
-       express or implied warranty.
-
-A\bAU\bUT\bTH\bHO\bOR\bR
-       Jamie Zawinski <jwz@jwz.org>, 18-Jan-98.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-X Version 11                17-Jun-99                           2
-
-
diff --git a/local/man/cat.1/vines.1 b/local/man/cat.1/vines.1
deleted file mode 100644 (file)
index c150472..0000000
+++ /dev/null
@@ -1,132 +0,0 @@
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-N\bNA\bAM\bME\bE
-       vines - draws pseudo-fractal geometric patterns
-
-S\bSY\bYN\bNO\bOP\bPS\bSI\bIS\bS
-       v\bvi\bin\bne\bes\bs  [-display  _\bh_\bo_\bs_\bt_\b:_\bd_\bi_\bs_\bp_\bl_\ba_\by_\b._\bs_\bc_\br_\be_\be_\bn] [-foreground _\bc_\bo_\bl_\bo_\br]
-       [-background _\bc_\bo_\bl_\bo_\br] [-window] [-root]  [-mono]  [-install]
-       [-visual _\bv_\bi_\bs_\bu_\ba_\bl] [-ncolors _\bi_\bn_\bt_\be_\bg_\be_\br] [-delay _\bm_\bi_\bc_\br_\bo_\bs_\be_\bc_\bo_\bn_\bd_\bs]
-
-
-D\bDE\bES\bSC\bCR\bRI\bIP\bPT\bTI\bIO\bON\bN
-       The _\bv_\bi_\bn_\be_\bs program is yet another geometric pattern genera-
-       tor, this one's claim to fame being a pseudo-fractal look-
-       ing vine like pattern that creates nifty whorls and loops.
-
-O\bOP\bPT\bTI\bIO\bON\bNS\bS
-       _\bv_\bi_\bn_\be_\bs accepts the following options:
-
-       -\b-w\bwi\bin\bnd\bdo\bow\bw Draw on  a  newly-created  window.   This  is  the
-               default.
-
-       -\b-r\bro\boo\bot\bt   Draw on the root window.
-
-       -\b-m\bmo\bon\bno\bo   If   on  a  color  display,  pretend  we're  on  a
-               monochrome display.
-
-       -\b-i\bin\bns\bst\bta\bal\bll\bl
-               Install a private colormap for the window.
-
-       -\b-v\bvi\bis\bsu\bua\bal\bl _\bv_\bi_\bs_\bu_\ba_\bl
-               Specify which visual to use.  Legal values are the
-               name  of a visual class, or the id number (decimal
-               or hex) of a specific visual.
-
-       -\b-n\bnc\bco\bol\blo\bor\brs\bs _\bi_\bn_\bt_\be_\bg_\be_\br
-               How many colors  should  be  used  (if  possible).
-               Default 200.  The colors are chosen randomly.
-
-E\bEN\bNV\bVI\bIR\bRO\bON\bNM\bME\bEN\bNT\bT
-       D\bDI\bIS\bSP\bPL\bLA\bAY\bY to get the default host and display number.
-
-       X\bXE\bEN\bNV\bVI\bIR\bRO\bON\bNM\bME\bEN\bNT\bT
-               to  get the name of a resource file that overrides
-               the global resources stored in  the  RESOURCE_MAN-
-               AGER property.
-
-S\bSE\bEE\bE A\bAL\bLS\bSO\bO
-       X\bX(1), x\bxs\bsc\bcr\bre\bee\ben\bns\bsa\bav\bve\ber\br(1), x\bxl\blo\boc\bck\bk(1)
-
-C\bCO\bOP\bPY\bYR\bRI\bIG\bGH\bHT\bT
-       Copyright (C) 1997 by Tracy Camp.
-
-       Permission to use, copy, modify, and distribute this soft-
-       ware and its documentation for any purpose and without fee
-       is  hereby  granted,  provided  that  the  above copyright
-
-
-
-X Version 11                10-May-97                           1
-
-
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-       notice appear in all copies and that both  that  copyright
-       notice  and  this  permission  notice appear in supporting
-       documentation.
-
-A\bAU\bUT\bTH\bHO\bOR\bR
-       Tracy Camp <campt@hurrah.com>, 1997.
-
-       Tweaked by David Hansen <dhansen@metapath.com>, 21-Mar-97.
-
-       Ability  to  run  standalone or with _\bx_\bs_\bc_\br_\be_\be_\bn_\bs_\ba_\bv_\be_\br added by
-       Jamie Zawinski <jwz@jwz.org>, 10-May-97.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-X Version 11                10-May-97                           2
-
-
diff --git a/local/man/cat.1/webcollage.1 b/local/man/cat.1/webcollage.1
deleted file mode 100644 (file)
index e023479..0000000
+++ /dev/null
@@ -1,198 +0,0 @@
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-N\bNA\bAM\bME\bE
-       webcollage  -  decorate the screen with random images from
-       the web
-
-S\bSY\bYN\bNO\bOP\bPS\bSI\bIS\bS
-       w\bwe\beb\bbc\bco\bol\bll\bla\bag\bge\be [-display _\bh_\bo_\bs_\bt_\b:_\bd_\bi_\bs_\bp_\bl_\ba_\by_\b._\bs_\bc_\br_\be_\be_\bn]  [-root]  [-ver-
-       bose]  [-delay  _\bs_\be_\bc_\bs]  [-timeout  _\bs_\be_\bc_\bs]  [-background  _\bb_\bg]
-       [-filter _\bc_\bo_\bm_\bm_\ba_\bn_\bd] [-filter2 _\bc_\bo_\bm_\bm_\ba_\bn_\bd]
-
-D\bDE\bES\bSC\bCR\bRI\bIP\bPT\bTI\bIO\bON\bN
-       The _\bw_\be_\bb_\bc_\bo_\bl_\bl_\ba_\bg_\be program pulls random image off of the World
-       Wide  Web  and scatters them on the root window.  It finds
-       these images by doing random web searches, and  extracting
-       images  from  the returned pages.  It places the images on
-       the root window  by  using  the  x\bxv\bv(1),  g\bgi\bif\bft\bto\bop\bpn\bnm\bm(1),  and
-       d\bdj\bjp\bpe\beg\bg(1) tools.
-
-       _\bw_\be_\bb_\bc_\bo_\bl_\bl_\ba_\bg_\be also works as a CGI program: simply make a sym-
-       bolic link to the _\bw_\be_\bb_\bc_\bo_\bl_\bl_\ba_\bg_\be executable called _\bn_\bp_\bh_\b-_\bw_\be_\bb_\bc_\bo_\bl_\b-
-       _\bl_\ba_\bg_\be_\b._\bc_\bg_\bi.   If this program sees that it is being run as a
-       CGI, then it will behave  appropriately.   (The  generated
-       web  page  will  list the images one after another, rather
-       than tiling them together.)
-
-       _\bw_\be_\bb_\bc_\bo_\bl_\bl_\ba_\bg_\be is written in p\bpe\ber\brl\bl(1) and requires Perl 5.
-
-O\bOP\bPT\bTI\bIO\bON\bNS\bS
-       _\bw_\be_\bb_\bc_\bo_\bl_\bl_\ba_\bg_\be accepts the following options:
-
-       -\b-r\bro\boo\bot\bt   Draw on the root window.  This  option  is  mandi-
-               tory: drawing to a window other than the root win-
-               dow is not yet supported.
-
-       -\b-v\bve\ber\brb\bbo\bos\bse\be or -\b-v\bv
-               Print diagnostics to stderr.  Multiple _\b-_\bv switches
-               increase  the amount of output.  _\b-_\bv will print out
-               only the URLs of the images; _\b-_\bv_\bv  will  print  all
-               the  commands  being run; and _\b-_\bv_\bv_\bv will print more
-               than you care about.
-
-       -\b-d\bde\bel\bla\bay\by _\bs_\be_\bc_\bo_\bn_\bd_\bs
-               How long to sleep between images.  Default 1  sec-
-               ond.   (Remember that this program probably spends
-               a lot of time waiting for the network.)
-
-       -\b-b\bba\bac\bck\bkg\bgr\bro\bou\bun\bnd\bd _\bc_\bo_\bl_\bo_\br_\b-_\bo_\br_\b-_\bp_\bp_\bm
-               What to use for the background onto  which  images
-               are pasted.  This may be a color name, a hexadeci-
-               mal RGB specification in the  form  '#rrggbb',  or
-               the name of a PPM file.
-
-       -\b-t\bti\bim\bme\beo\bou\but\bt _\bs_\be_\bc_\bo_\bn_\bd_\bs
-               How long to wait for a URL to complete before giv-
-               ing up on it  and  moving  on  to  the  next  one.
-
-
-
-X Version 11                17-Jun-99                           1
-
-
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-               Default 30 seconds.
-
-       -\b-f\bfi\bil\blt\bte\ber\br _\bc_\bo_\bm_\bm_\ba_\bn_\bd
-               Filter  all  source  images  through this command.
-               The command must take a PPM  file  on  stdin,  and
-               write  a  new PPM file to stdout.  One good choice
-               for a filter would be:
-
-                    webcollage -root -filter 'vidwhacker -stdin -stdout'
-
-
-       -\b-f\bfi\bil\blt\bte\ber\br2\b2 _\bc_\bo_\bm_\bm_\ba_\bn_\bd
-               Filter the _\bc_\bo_\bm_\bp_\bo_\bs_\bi_\bt_\be image through  this  command.
-               The  _\b-_\bf_\bi_\bl_\bt_\be_\br option applies to the sub-images; the
-               _\b-_\bf_\bi_\bl_\bt_\be_\br_\b2 applies to the final, full-screen  image.
-
-E\bEN\bNV\bVI\bIR\bRO\bON\bNM\bME\bEN\bNT\bT
-       D\bDI\bIS\bSP\bPL\bLA\bAY\bY to get the default host and display number.
-
-       X\bXE\bEN\bNV\bVI\bIR\bRO\bON\bNM\bME\bEN\bNT\bT
-               to  get the name of a resource file that overrides
-               the global resources stored in  the  RESOURCE_MAN-
-               AGER property.
-
-F\bFI\bIL\bLE\bES\bS A\bAN\bND\bD U\bUR\bRL\bLS\bS
-       _\b/_\bu_\bs_\br_\b/_\bd_\bi_\bc_\bt_\b/_\bw_\bo_\br_\bd_\bs or _\b/_\bu_\bs_\br_\b/_\bs_\bh_\ba_\br_\be_\b/_\bl_\bi_\bb_\b/_\bd_\bi_\bc_\bt_\b/_\bw_\bo_\br_\bd_\bs
-              To find the random words to feed to search engines.
-
-       _\bh_\bt_\bt_\bp_\b:_\b/_\b/_\br_\ba_\bn_\bd_\bo_\bm_\b._\by_\ba_\bh_\bo_\bo_\b._\bc_\bo_\bm_\b/_\bb_\bi_\bn_\b/_\br_\by_\bl_\b,
-       _\bh_\bt_\bt_\bp_\b:_\b/_\b/_\bi_\bm_\ba_\bg_\be_\b._\ba_\bl_\bt_\ba_\bv_\bi_\bs_\bt_\ba_\b._\bc_\bo_\bm_\b/ To find random web pages.
-
-B\bBU\bUG\bGS\bS
-       When  drawing  on  the  root  window,  it  always uses the
-       default colormap.  This is actually a  limitation  of  xv.
-       But regardless, when using this program with xscreensaver,
-       it must be given the d\bde\bef\bfa\bau\bul\blt\bt-\b-n\bn visual  specification  (see
-       the x\bxs\bsc\bcr\bre\bee\ben\bns\bsa\bav\bve\ber\br(1) manual for more details.)
-
-       Only the GIF and JPEG image formats are supported.
-
-       Transparent and animating GIFs are not supported.
-
-       It's slow.
-
-S\bSE\bEE\bE A\bAL\bLS\bSO\bO
-       X\bX(1),  x\bxs\bsc\bcr\bre\bee\ben\bns\bsa\bav\bve\ber\br(1), x\bxv\bv(1), g\bgi\bif\bft\bto\bop\bpn\bnm\bm(1), d\bdj\bjp\bpe\beg\bg(1), v\bvi\bid\bd-\b-
-       w\bwh\bha\bac\bck\bke\ber\br(1), p\bpe\ber\brl\bl(1)
-
-C\bCO\bOP\bPY\bYR\bRI\bIG\bGH\bHT\bT
-       Copyright (C) 1998, 1999 by Jamie Zawinski.  Permission to
-       use,  copy, modify, distribute, and sell this software and
-       its documentation for any purpose is hereby granted  with-
-       out  fee,  provided that the above copyright notice appear
-       in all copies and that both that copyright notice and this
-
-
-
-X Version 11                17-Jun-99                           2
-
-
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-       permission  notice appear in supporting documentation.  No
-       representations are made about  the  suitability  of  this
-       software  for any purpose.  It is provided "as is" without
-       express or implied warranty.
-
-A\bAU\bUT\bTH\bHO\bOR\bR
-       Jamie Zawinski <jwz@jwz.org>, 24-May-98.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-X Version 11                17-Jun-99                           3
-
-
diff --git a/local/man/cat.1/xjack.1 b/local/man/cat.1/xjack.1
deleted file mode 100644 (file)
index 4410c3b..0000000
+++ /dev/null
@@ -1,132 +0,0 @@
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-N\bNA\bAM\bME\bE
-       xjack - all work and no play makes jack a dull boy
-
-S\bSY\bYN\bNO\bOP\bPS\bSI\bIS\bS
-       x\bxj\bja\bac\bck\bk  [-display  _\bh_\bo_\bs_\bt_\b:_\bd_\bi_\bs_\bp_\bl_\ba_\by_\b._\bs_\bc_\br_\be_\be_\bn] [-foreground _\bc_\bo_\bl_\bo_\br]
-       [-background _\bc_\bo_\bl_\bo_\br] [-window] [-root] [-delay _\bu_\bs_\be_\bc_\bs]
-
-D\bDE\bES\bSC\bCR\bRI\bIP\bPT\bTI\bIO\bON\bN
-       All work and no play makes jack a dull boy.  All work  and
-       no play makes jack a dull boy.  All work and no play makes
-       jack a dull boy.  All work and no play makes jack  a  dull
-       boy.   All  work  and  no play makes jack a dull boy.  All
-       work and no play makes jack a dull boy.
-
-               All work and no play makes jack a dull  boy.   All
-               work  and no play makes jack a dull boy.  All work
-               and no play makes jack a dull boy.  All  work  and
-               no  play  makes  jack a dull boy.  All work and no
-               play makes jack a dull boy.  All work and no  play
-               makes jack a dull boy.
-
-               All  work  and no play makes jack a dull boy.  All
-               work and no play makes jack a dull boy.  All  work
-               and  no  play makes jack a dull boy.  All work and
-               no play makes jack a dull boy.  All  work  and  no
-               play  makes jack a dull boy.  All work and no play
-               makes jack a dull boy.  All work and no play makes
-               jack  a dull boy.  All work and no play makes jack
-               a dull boy.
-
-       All work and no play makes jack a dull boy.  All work  and
-       no play makes jack a dull boy.  All work and no play makes
-       jack a dull boy.  All work and no play makes jack  a  dull
-       boy.   All  work  and  no play makes jack a dull boy.  All
-       work and no play makes jack a dull boy.  All work  and  no
-       play  makes  jack  a dull boy.  All work and no play makes
-       jack a dull boy.
-
-E\bEN\bNV\bVI\bIR\bRO\bON\bNM\bME\bEN\bNT\bT
-       D\bDI\bIS\bSP\bPL\bLA\bAY\bY All work and no play makes jack a dull boy.
-
-       X\bXE\bEN\bNV\bVI\bIR\bRO\bON\bNM\bME\bEN\bNT\bT
-               All work and no play makes jack a dull  boy.   All
-               work and no play makes jack a dull boy.
-
-S\bSE\bEE\bE A\bAL\bLS\bSO\bO
-       X\bX(1), x\bxs\bsc\bcr\bre\bee\ben\bns\bsa\bav\bve\ber\br(1)
-
-C\bCO\bOP\bPY\bYR\bRI\bIG\bGH\bHT\bT
-       Copyright  (C)  1997  by  Jamie Zawinski.  All work and no
-       play makes jack a dull boy.  All work and  no  play  makes
-       jack  a  dull boy.  All work and no play makes jack a dull
-       boy.  All work and no play makes jack  a  dull  boy.   All
-       work  and  no  play makes jack a fnord dull boy.  All work
-
-
-
-X Version 11                18-sep-97                           1
-
-
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-       and no play makes jack a dull boy.
-
-A\bAU\bUT\bTH\bHO\bOR\bR
-       Jamie Zawinski <jwz@jwz.org>, 15-Nov-97.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-X Version 11                18-sep-97                           2
-
-
diff --git a/local/man/cat.1/xjulia.1 b/local/man/cat.1/xjulia.1
deleted file mode 100644 (file)
index 1ea5145..0000000
+++ /dev/null
@@ -1,132 +0,0 @@
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-N\bNA\bAM\bME\bE
-       julia - draws spinning, animating julia-set fractals
-
-S\bSY\bYN\bNO\bOP\bPS\bSI\bIS\bS
-       j\bju\bul\bli\bia\ba  [-display  _\bh_\bo_\bs_\bt_\b:_\bd_\bi_\bs_\bp_\bl_\ba_\by_\b._\bs_\bc_\br_\be_\be_\bn] [-foreground _\bc_\bo_\bl_\bo_\br]
-       [-background _\bc_\bo_\bl_\bo_\br] [-window] [-root]  [-mono]  [-install]
-       [-visual  _\bv_\bi_\bs_\bu_\ba_\bl] [-ncolors _\bi_\bn_\bt_\be_\bg_\be_\br] [-delay _\bm_\bi_\bc_\br_\bo_\bs_\be_\bc_\bo_\bn_\bd_\bs]
-       [-cycles _\bi_\bn_\bt_\be_\bg_\be_\br] [-count _\bi_\bn_\bt_\be_\bg_\be_\br] [-mouse] [-nomouse]
-
-
-D\bDE\bES\bSC\bCR\bRI\bIP\bPT\bTI\bIO\bON\bN
-       The _\bj_\bu_\bl_\bi_\ba  program  draws  spinning,  animating  julia-set
-       fractals.
-
-       It  uses ifs {w0 = sqrt(x-c), w1 = -sqrt(x-c)} with random
-       iteration to plot the julia set, and sinusoidially  varied
-       parameters  for  the set, and plots parameters with a cir-
-       cle.
-
-       One thing to note is that count is the _\bd_\be_\bp_\bt_\bh of the search
-       tree,  so the number of points computed is (2^count)-1.  I
-       use 8 or 9 on a dx266 and it looks okay.   The  sinusoidal
-       variation  of the parameter might not be as interesting as
-       it could, but it still gives an idea of the effect of  the
-       parameter.
-
-
-O\bOP\bPT\bTI\bIO\bON\bNS\bS
-       _\bj_\bu_\bl_\bi_\ba accepts the following options:
-
-       -\b-w\bwi\bin\bnd\bdo\bow\bw Draw  on  a  newly-created  window.   This  is the
-               default.
-
-       -\b-r\bro\boo\bot\bt   Draw on the root window.
-
-       -\b-m\bmo\bon\bno\bo   If  on  a  color  display,  pretend  we're  on   a
-               monochrome display.
-
-       -\b-i\bin\bns\bst\bta\bal\bll\bl
-               Install a private colormap for the window.
-
-       -\b-v\bvi\bis\bsu\bua\bal\bl _\bv_\bi_\bs_\bu_\ba_\bl
-               Specify which visual to use.  Legal values are the
-               name of a visual class, or the id number  (decimal
-               or hex) of a specific visual.
-
-       -\b-n\bnc\bco\bol\blo\bor\brs\bs _\bi_\bn_\bt_\be_\bg_\be_\br
-               How  many  colors  should  be  used (if possible).
-               Default 200.  The colors used  cycle  through  the
-               hue, making N stops around the color wheel.
-
-       -\b-c\bcy\byc\bcl\ble\bes\bs _\bi_\bn_\bt_\be_\bg_\be_\br
-
-
-
-
-
-X Version 11                28-May-97                           1
-
-
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-       -\b-c\bco\bou\bun\bnt\bt _\bi_\bn_\bt_\be_\bg_\be_\br
-
-
-       -\b-m\bmo\bou\bus\bse\be
-
-       -\b-n\bno\bom\bmo\bou\bus\bse\be
-               If  _\b-_\bm_\bo_\bu_\bs_\be  is specified, the control point of the
-               Julia set will be derived from the position of the
-               mouse in the window.  When the mouse is not in the
-               window, the control point  is  chosen  the  normal
-               way.
-
-E\bEN\bNV\bVI\bIR\bRO\bON\bNM\bME\bEN\bNT\bT
-       D\bDI\bIS\bSP\bPL\bLA\bAY\bY to get the default host and display number.
-
-       X\bXE\bEN\bNV\bVI\bIR\bRO\bON\bNM\bME\bEN\bNT\bT
-               to  get the name of a resource file that overrides
-               the global resources stored in  the  RESOURCE_MAN-
-               AGER property.
-
-S\bSE\bEE\bE A\bAL\bLS\bSO\bO
-       X\bX(1), x\bxs\bsc\bcr\bre\bee\ben\bns\bsa\bav\bve\ber\br(1), x\bxl\blo\boc\bck\bk(1)
-
-C\bCO\bOP\bPY\bYR\bRI\bIG\bGH\bHT\bT
-       Copyright (C) 1995 by Sean McCullough.
-
-       Permission to use, copy, modify, and distribute this soft-
-       ware 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.
-
-A\bAU\bUT\bTH\bHO\bOR\bR
-       Sean McCullough <bankshot@mailhost.nmt.edu>, 1995.
-
-       Ability to run standalone or with  _\bx_\bs_\bc_\br_\be_\be_\bn_\bs_\ba_\bv_\be_\br  added  by
-       Jamie Zawinski <jwz@jwz.org>, 10-May-97.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-X Version 11                28-May-97                           2
-
-
diff --git a/local/man/cat.1/xlyap.1 b/local/man/cat.1/xlyap.1
deleted file mode 100644 (file)
index b550d07..0000000
+++ /dev/null
@@ -1,264 +0,0 @@
-
-
-
-XLYAP(6X)                                               XLYAP(6X)
-
-
-N\bNA\bAM\bME\bE
-       xlyap - display an array of Lyapunov exponents graphically
-
-S\bSY\bYN\bNO\bOP\bPS\bSI\bIS\bS
-       _\bx_\bl_\by_\ba_\bp [-BLps][-W width][-H height][-o filename][-a _\bn ] [-b
-               _\bn  ]  [-w  _\bn ] [-h _\bn ] [-i xstart] [-M _\bn ] [-R _\bp ]
-               [-S _\bn ] [-D _\bn ] [-F string][-f string][-r _\bn ]  [-O
-               _\bn ] [-C _\bn ] [-c _\bn ] [-m _\bn ] [-x xpos] [-y ypos]
-
-D\bDE\bES\bSC\bCR\bRI\bIP\bPT\bTI\bIO\bON\bN
-       _\bx_\bl_\by_\ba_\bp  generates and graphically displays an array of Lya-
-       punov exponents for a  variety  of  iterated  periodically
-       forced non-linear maps of the unit interval.
-
-O\bOP\bPT\bTI\bIO\bON\bNS\bS
-       -random A  good  choice  for  use with xscreensaver: picks
-               random parameters from a built-in list.
-
-       -C _\bn    Specifies the minimum color index to be  used  for
-               negative exponents
-
-       -D _\bn    Specifies the "dwell" or number of iterations over
-               which to average in order to  calculate  the  Lya-
-               punov exponent. Default is 400.
-
-       -B      Causes  the  stop, go, spin and quit buttons to be
-               displayed.
-
-       -H _\bn    Specifies the height of  the  window.  Default  is
-               256.
-
-       -L      Indicates use log(x) + log(y) rather than log(xy).
-
-       -M _\br    Specifies the real value to compare exponent  val-
-               ues  to  for  indexing  into  a  color  wheel. The
-               default value is 1.0.
-
-       -O _\bn    Specifies the minimum color index to be  used  for
-               positive exponents
-
-       -R _\bp    Specifies pseudo-random forcing with probability _\bp
-               of using parameter value 'a'.
-
-       -S _\bn    Specifies the "settle"  or  number  of  iterations
-               prior  to  the beginning of the calculation of the
-               Lyapunov exponent. Default is 200.
-
-       -W _\bn    Specifies the width of the window. Default is 256.
-
-       -a _\br    Specifies  the  real  value  to use as the minimum
-               parameter value of the horizontal axis. Default is
-               3.0 for the logistic map.
-
-       -b _\bn    Specifies  the  real  value  to use as the minimum
-
-
-
-                                                                1
-
-
-
-
-
-XLYAP(6X)                                               XLYAP(6X)
-
-
-               parameter value of the vertical axis.  Default  is
-               3.0 for the logistic map.
-
-       -c _\bn    Selects  one of six different color wheels to use.
-               The default color wheel is a rainbow palette.
-
-       -F _\b1_\b0_\b1_\b0_\b1_\b0_\b1_\b0
-               Specifies the "Function" forcing function to  use.
-               The  example above would alternate between iterat-
-               ing the circle and logistic maps. An  argument  of
-               "-F  2323"  would alternate between left and right
-               logistic maps. The default is to only use the sin-
-               gle specified map (see the description of -m).
-
-       -f _\ba_\bb_\bb_\ba_\bb_\ba_\ba_\bb
-               Specifies the forcing function to use. The default
-               is to alternate between the "a" parameter and  the
-               "b" parameter.
-
-       -h _\br    Specifies  the  real value to be used as the range
-               over which the vertical parameter values vary. The
-               default is 1.0.
-
-       -i _\br    Specifies  the real value of the initial condition
-               to use. Default is 0.05.
-
-       -m _\bn    Selects between available non-linear maps  of  the
-               unit interval. A value of 0 specifies the logistic
-               map. A value of 1, the circle map. A value  of  2,
-               the  left-logistic. A value of 3, the right-logis-
-               tic.  A  value  of  4,  the  double-logistic.  The
-               default is 0, the logistic map.
-
-       -o _\bf_\bi_\bl_\be_\bn_\ba_\bm_\be
-               Specifies  the  output filename to be used. If the
-               -o option is given, this file  will  automatically
-               be  written  out at the completion of the drawing.
-               If it is not  specified,  a  default  filename  of
-               lyap.out  is  used  and only written if the 'f' or
-               'F' keys are pressed during a run. The  format  of
-               the  output  file  is  PPM  for  color and PGM for
-               monochrom. The parameters used  to  calculate  the
-               picture  are included as comments at the beginning
-               of the output file.
-
-       -p      Switches color indices for negative  and  positive
-               exponents. Generally, causes negative exponents to
-               be displayed in more detail  while  darkening  and
-               narrowing  the color range for positive exponents.
-               This can be toggled during runtime by pressing the
-               'p' key.
-
-       -r _\bn    Specifies  the  maximum  rgb  value  to  be  used.
-               Default is 35000.
-
-
-
-                                                                2
-
-
-
-
-
-XLYAP(6X)                                               XLYAP(6X)
-
-
-       -s _\bn    Specifies the length of the color wheel spin.
-
-       -u      Produces a usage message.
-
-       -v      Prints out the  various  values  to  be  used  and
-               exits.
-
-       -w _\br    Specifies  the  real value to be used as the range
-               over which the horizontal parameter  values  vary.
-               The default is 1.0.
-
-       -x _\bn    Specifies  the  x  screen coordinate of the window
-               (default is 256).
-
-       -y _\bn    Specifies the y screen coordinate  of  the  window
-               (default is 256).
-
-
-
-N\bNO\bOT\bTE\bES\bS
-       During  display,  pressing  any mouse button allows you to
-       select the area to be investigated  with  the  mouse.  The
-       upper left hand corner of the desired area is the location
-       of the cursor when the button is pressed. The lower  right
-       hand  corner is specified by the cursor when the button is
-       released.
-
-
-       Use of the keys _\bb_\bB_\be_\bE_\bf_\bF_\bk_\bK_\bj_\bJ_\bm_\bn_\br_\bR_\bs_\bS_\bw_\bW_\bx_\bX_\bq_\bQ indicates:
-
-          (<) Halve dwell value.
-          (>) Double dwell value.
-          ([) Halve settle value.
-          (]) Double settle value.
-          (B or b) Toggle button display on/off
-          (E or e) Recalculate the indices into the  color  wheel
-       using a different method
-          (F  or  f)  Save  current screen to ouput file (not yet
-       implemented)
-          (H or h or ?) Display brief help message
-          (i) Decrement the  interval  between  stripes  for  the
-       striped color map.
-          (I)  Increment  the  interval  between  stripes for the
-       striped color map.
-          (K) Decrease value exponents are  compared  against  by
-       0.05.
-          (J)  Increase  value  exponents are compared against by
-       0.05.
-          (M) Decrease value exponents are  compared  against  by
-       0.005.
-          (N)  Increase  value  exponents are compared against by
-       0.005.
-          (m) Increment the map index, changing  the  map  to  be
-       iterated.
-
-
-
-                                                                3
-
-
-
-
-
-XLYAP(6X)                                               XLYAP(6X)
-
-
-          (P or p) Toggle positive/negative exponent display.
-          (r) Redraw the window using previously calculated expo-
-       nents.
-          (R) Redraw the window using the newly set dwell  and/or
-       settle values.
-          (S) Spin the color wheel
-          (s)  Halve  the  length  of the spin and spin the color
-       wheel
-          (u) Go up to the window just prior to the  most  recent
-       zoom.
-          (U) Go all the way up to the original window.
-          (V or v) Display values of various parameters currently
-       in use
-          (W or w) Use next color map.
-          (X or x) Clear window
-          (Q or q) quit
-
-
-
-A\bAU\bUT\bTH\bHO\bOR\bR
-               Ronald Joe Record
-            The Santa Cruz Operation
-                 P.O. Box 1900
-              Santa Cruz, CA 95061
-                   rr@sco.com
-
-
-
-A\bAC\bCK\bKN\bNO\bOW\bWL\bLE\bED\bDG\bGE\bEM\bME\bEN\bNT\bTS\bS
-       The algorithm was taken from the September 1991 Scientific
-       American  article  by  A.  K.  Dewdney who gives credit to
-       Mario Markus of the Max Planck Institute for its creation.
-       Additional  information  and  ideas  were gleaned from the
-       discussion on  alt.fractals  involving  Stephen  Hall,  Ed
-       Kubaitis, Dave Platt and Baback Moghaddam. Assistance with
-       colormaps and spinning color wheels and X was gleaned from
-       Hiram  Clawson.  Rubber  banding  code was adapted from an
-       existing Mandelbrot program written by Stacey Campbell.
-
-       Viciously  hacked  for  xscreensaver  by  Jamie  Zawinski,
-       20-Nov-97.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-                                                                4
-
-
diff --git a/local/man/cat.1/xroger.1 b/local/man/cat.1/xroger.1
deleted file mode 100644 (file)
index ae599d6..0000000
+++ /dev/null
@@ -1,132 +0,0 @@
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-N\bNA\bAM\bME\bE
-       xroger - throbbing X logo, of a sort
-
-S\bSY\bYN\bNO\bOP\bPS\bSI\bIS\bS
-       x\bxr\bro\bog\bge\ber\br  [-display _\bh_\bo_\bs_\bt_\b:_\bd_\bi_\bs_\bp_\bl_\ba_\by_\b._\bs_\bc_\br_\be_\be_\bn] [-foreground _\bc_\bo_\bl_\bo_\br]
-       [-background _\bc_\bo_\bl_\bo_\br] [-window] [-root]  [-mono]  [-install]
-       [-visual _\bv_\bi_\bs_\bu_\ba_\bl]
-
-D\bDE\bES\bSC\bCR\bRI\bIP\bPT\bTI\bIO\bON\bN
-       The  _\bx_\br_\bo_\bg_\be_\br  program displays a replacement for the X logo
-       with a more accurate Look and Feel.
-
-O\bOP\bPT\bTI\bIO\bON\bNS\bS
-       _\bx_\br_\bo_\bg_\be_\br accepts the following options:
-
-       -\b-w\bwi\bin\bnd\bdo\bow\bw Draw on  a  newly-created  window.   This  is  the
-               default.
-
-       -\b-r\bro\boo\bot\bt   Draw on the root window.
-
-       -\b-m\bmo\bon\bno\bo   If   on  a  color  display,  pretend  we're  on  a
-               monochrome display.
-
-       -\b-i\bin\bns\bst\bta\bal\bll\bl
-               Install a private colormap for the window.
-
-       -\b-v\bvi\bis\bsu\bua\bal\bl _\bv_\bi_\bs_\bu_\ba_\bl
-               Specify which visual to use.  Legal values are the
-               name  of a visual class, or the id number (decimal
-               or hex) of a specific visual.
-
-E\bEN\bNV\bVI\bIR\bRO\bON\bNM\bME\bEN\bNT\bT
-       D\bDI\bIS\bSP\bPL\bLA\bAY\bY to get the default host and display number.
-
-       X\bXE\bEN\bNV\bVI\bIR\bRO\bON\bNM\bME\bEN\bNT\bT
-               to get the name of a resource file that  overrides
-               the  global  resources stored in the RESOURCE_MAN-
-               AGER property.
-
-B\bBU\bUG\bGS\bS
-       It should also drip blood while making a horrible screech-
-       ing noise.
-
-S\bSE\bEE\bE A\bAL\bLS\bSO\bO
-       X\bX(1), x\bxs\bsc\bcr\bre\bee\ben\bns\bsa\bav\bve\ber\br(1)
-
-C\bCO\bOP\bPY\bYR\bRI\bIG\bGH\bHT\bT
-       Copyright (C) 1992, 1993 by Jamie Zawinski.  Permission to
-       use, copy, modify, distribute, and sell this software  and
-       its  documentation for any purpose is hereby granted with-
-       out fee, provided fnord that the  above  copyright  notice
-       appear  in  all copies and that both that copyright notice
-       and this permission notice appear in supporting documenta-
-       tion.   No representations are made about the  suitability
-
-
-
-X Version 11                22-mar-93                           1
-
-
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-       of fnord this software for any purpose.   It  is  provided
-       "as is" without express or fnord implied warranty.
-
-A\bAU\bUT\bTH\bHO\bOR\bR
-       Jamie Zawinski <jwz@jwz.org>, 13-aug-92.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-X Version 11                22-mar-93                           2
-
-
diff --git a/local/man/cat.1/xscreensaver-command.1 b/local/man/cat.1/xscreensaver-command.1
deleted file mode 100644 (file)
index c8ca81f..0000000
+++ /dev/null
@@ -1,264 +0,0 @@
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-N\bNA\bAM\bME\bE
-       xscreensaver-command - control a running xscreensaver pro-
-       cess
-
-S\bSY\bYN\bNO\bOP\bPS\bSI\bIS\bS
-       x\bxs\bsc\bcr\bre\bee\ben\bns\bsa\bav\bve\ber\br-\b-c\bco\bom\bmm\bma\ban\bnd\bd [-help] [-demo] [-prefs]  [-activate]
-       [-deactivate] [-cycle] [-next] [-prev] [-select _\bn] [-exit]
-       [-restart] [-lock]  [-throttle]  [-unthrottle]  [-version]
-       [-time]
-
-D\bDE\bES\bSC\bCR\bRI\bIP\bPT\bTI\bIO\bON\bN
-       The   _\bx_\bs_\bc_\br_\be_\be_\bn_\bs_\ba_\bv_\be_\br_\b-_\bc_\bo_\bm_\bm_\ba_\bn_\bd   program  controls  a  running
-       _\bx_\bs_\bc_\br_\be_\be_\bn_\bs_\ba_\bv_\be_\br process by sending it client-messages.
-
-       x\bxs\bsc\bcr\bre\bee\ben\bns\bsa\bav\bve\ber\br(1) has a client-server  model:  the  xscreen-
-       saver  process is a daemon that runs in the background; it
-       is  controlled  by  other  foreground  programs  such   as
-       _\bx_\bs_\bc_\br_\be_\be_\bn_\bs_\ba_\bv_\be_\br_\b-_\bc_\bo_\bm_\bm_\ba_\bn_\bd and x\bxs\bsc\bcr\bre\bee\ben\bns\bsa\bav\bve\ber\br-\b-d\bde\bem\bmo\bo(1).
-
-       This program, _\bx_\bs_\bc_\br_\be_\be_\bn_\bs_\ba_\bv_\be_\br_\b-_\bc_\bo_\bm_\bm_\ba_\bn_\bd, is a command-line-ori-
-       ented tool; the x\bxs\bsc\bcr\bre\bee\ben\bns\bsa\bav\bve\ber\br-\b-d\bde\bem\bmo\bo(1).  program is a graph-
-       ical tool.
-
-O\bOP\bPT\bTI\bIO\bON\bNS\bS
-       _\bx_\bs_\bc_\br_\be_\be_\bn_\bs_\ba_\bv_\be_\br_\b-_\bc_\bo_\bm_\bm_\ba_\bn_\bd  accepts  the  following command-line
-       options:
-
-       -\b-h\bhe\bel\blp\bp   Prints a brief summary of command-line options.
-
-       -\b-d\bde\bem\bmo\bo   This just launches the  x\bxs\bsc\bcr\bre\bee\ben\bns\bsa\bav\bve\ber\br-\b-d\bde\bem\bmo\bo(1)  pro-
-               gram, in which one can experiment with the various
-               graphics hacks available, and edit parameters.
-
-       -\b-d\bde\bem\bmo\bo _\bn_\bu_\bm_\bb_\be_\br
-               When the _\b-_\bd_\be_\bm_\bo option is followed by  an  integer,
-               it  instructs  the _\bx_\bs_\bc_\br_\be_\be_\bn_\bs_\ba_\bv_\be_\br daemon to run that
-               hack, and wait for the user  to  click  the  mouse
-               before  deactivating  (i.e., mouse motion does not
-               deactivate.)   This  is  the  mechanism  by  which
-               x\bxs\bsc\bcr\bre\bee\ben\bns\bsa\bav\bve\ber\br-\b-d\bde\bem\bmo\bo(1)    communicates    with   the
-               x\bxs\bsc\bcr\bre\bee\ben\bns\bsa\bav\bve\ber\br(1) daemon.  (The first  hack  in  the
-               list is numbered 1, not 0.)
-
-       -\b-p\bpr\bre\bef\bfs\bs  Like  the no-argument form of _\b-_\bd_\be_\bm_\bo, but brings up
-               that program's Preferences panel by default.
-
-       -\b-a\bac\bct\bti\biv\bva\bat\bte\be
-               Tell xscreensaver to turn on immediately (that is,
-               blank the screen, as if the user had been idle for
-               long enough.)  The screensaver will deactivate  as
-               soon as there is any user activity, as usual.
-
-               It is useful to run this from a menu; you may wish
-
-
-
-
-X Version 11             20-Jun-99 (3.15)                       1
-
-
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-               to run it as
-
-                    sleep 5 ; xscreensaver-command -activate
-
-               to be sure that you have time to  take  your  hand
-               off  the  mouse  before  the screensaver comes on.
-               (Because if you  jiggle  the  mouse,  xscreensaver
-               will notice, and deactivate.)
-
-       -\b-d\bde\bea\bac\bct\bti\biv\bva\bat\bte\be
-               If  the  screensaver  is  active  (the  screen  is
-               blanked), this command will deactivate it just  as
-               if  there had been keyboard or mouse activity.  If
-               locking is  enabled,  then  the  screensaver  will
-               prompt for a password as usual.
-
-       -\b-c\bcy\byc\bcl\ble\be  If  the  screensaver  is  active  (the  screen  is
-               blanked), then stop the current graphics demo  and
-               run a new one (chosen randomly.)
-
-       -\b-n\bne\bex\bxt\bt   This is like either _\b-_\ba_\bc_\bt_\bi_\bv_\ba_\bt_\be or _\b-_\bc_\by_\bc_\bl_\be, depending
-               on which is  more  appropriate,  except  that  the
-               graphics  hack that will be run is the next one in
-               the list, instead of a  randomly-chosen  one.   In
-               other words, repeatedly executing -next will cause
-               the xscreensaver process to invoke  each  graphics
-               demo sequentially.  (Though using the _\b-_\bd_\be_\bm_\bo option
-               is probably an easier way to accomplish that.)
-
-       -\b-p\bpr\bre\bev\bv   This is like _\b-_\bn_\be_\bx_\bt, but cycles in the other direc-
-               tion.
-
-       -\b-s\bse\bel\ble\bec\bct\bt _\bn_\bu_\bm_\bb_\be_\br
-               Like  _\b-_\ba_\bc_\bt_\bi_\bv_\ba_\bt_\be,  but  runs the _\bNth element in the
-               list of hacks.  By knowing what is in the _\bp_\br_\bo_\bg_\br_\ba_\bm_\bs
-               list, and in what order, you can use this to acti-
-               vate the screensaver with  a  particular  graphics
-               demo.   (The first element in the list is numbered
-               1, not 0.)
-
-       -\b-e\bex\bxi\bit\bt   Causes the xscreensaver  process  to  exit  grace-
-               fully.   This  is  roughly the same as killing the
-               process with k\bki\bil\bll\bl(1), but it is easier, since  you
-               don't need to first figure out the pid.
-
-               W\bWa\bar\brn\bni\bin\bng\bg:\b: never use _\bk_\bi_\bl_\bl _\b-_\b9 with _\bx_\bs_\bc_\br_\be_\be_\bn_\bs_\ba_\bv_\be_\br while
-               the screensaver is active.  If  you  are  using  a
-               virtual root window manager, that can leave things
-               in an inconsistent state,  and  you  may  need  to
-               restart  your window manager to repair the damage.
-
-       -\b-l\blo\boc\bck\bk   Tells the running xscreensaver process to lock the
-               screen  immediately.   This is like _\b-_\ba_\bc_\bt_\bi_\bv_\ba_\bt_\be, but
-               forces locking as well, even if locking is not the
-
-
-
-X Version 11             20-Jun-99 (3.15)                       2
-
-
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-               default  (that  is,  even  if  xscreensaver's _\bl_\bo_\bc_\bk
-               resource is false, and  even  if  the  _\bl_\bo_\bc_\bk_\bT_\bi_\bm_\be_\bo_\bu_\bt
-               resource is non-zero.)
-
-               Note that locking doesn't work unless the _\bx_\bs_\bc_\br_\be_\be_\bn_\b-
-               _\bs_\ba_\bv_\be_\br process is running  as  you.   See  x\bxs\bsc\bcr\bre\bee\ben\bn-\b-
-               s\bsa\bav\bve\ber\br(1) for details.
-
-       -\b-t\bth\bhr\bro\bot\btt\btl\ble\be
-               Temporarily  switch  to ``blank screen'' mode, and
-               don't run any display  modes  at  all,  until  the
-               screensaver  is next de-activated.  This is useful
-               if you're using a machine remotely, and  you  find
-               that some display modes are using too much CPU.
-
-               (If  you want to do this _\bp_\be_\br_\bm_\ba_\bn_\be_\bn_\bt_\bl_\by, that is, you
-               want the screen saver to only blank the screen and
-               not  run  demos  at  all,  then  set  the _\bp_\br_\bo_\bg_\br_\ba_\bm_\bs
-               resource to an empty  list:   See  x\bxs\bsc\bcr\bre\bee\ben\bns\bsa\bav\bve\ber\br(1)
-               for details.)
-
-       -\b-u\bun\bnt\bth\bhr\bro\bot\btt\btl\ble\be
-               Turn `-throttle' mode off and resume normal behav-
-               ior.
-
-       -\b-v\bve\ber\brs\bsi\bio\bon\bn
-               Prints the version of xscreensaver  that  is  cur-
-               rently running on the display: that is, the actual
-               version number of the running  xscreensaver  back-
-               ground  process, rather than the version number of
-               xscreensaver-command.  (To see the version  number
-               of  _\bx_\bs_\bc_\br_\be_\be_\bn_\bs_\ba_\bv_\be_\br_\b-_\bc_\bo_\bm_\bm_\ba_\bn_\bd  itself,  use  the  _\b-_\bh_\be_\bl_\bp
-               option.)
-
-       -\b-t\bti\bim\bme\be   Prints the time  at  which  the  screensaver  last
-               activated  or  deactivated  (roughly, how long the
-               user has been idle or  non-idle:  but  not  quite,
-               since  it  only  tells  you when the screen became
-               blanked or un-blanked.)
-
-       -\b-r\bre\bes\bst\bta\bar\brt\bt
-               Causes the screensaver process to  exit  and  then
-               restart  with  the  same command line arguments as
-               last time.   Do  this  after  you've  changed  the
-               resource database, to cause xscreensaver to notice
-               the changes.
-
-               W\bWa\bar\brn\bni\bin\bng\bg:\b: if you have a  _\b._\bx_\bs_\bc_\br_\be_\be_\bn_\bs_\ba_\bv_\be_\br  file,  this
-               might  not  do  what  you expect.  You're probably
-               better off killing the existing xscreensaver (with
-               _\bx_\bs_\bc_\br_\be_\be_\bn_\bs_\ba_\bv_\be_\br_\b-_\bc_\bo_\bm_\bm_\ba_\bn_\bd  _\b-_\be_\bx_\bi_\bt) and then launching it
-               again.
-
-               The important point is, you need to make sure that
-
-
-
-X Version 11             20-Jun-99 (3.15)                       3
-
-
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-               the  xscreensaver  process  is running as you.  If
-               it's not, it won't be reading the right  _\b._\bx_\bs_\bc_\br_\be_\be_\bn_\b-
-               _\bs_\ba_\bv_\be_\br file.
-
-D\bDI\bIA\bAG\bGN\bNO\bOS\bST\bTI\bIC\bCS\bS
-       If  an  error occurs while communicating with the _\bx_\bs_\bc_\br_\be_\be_\bn_\b-
-       _\bs_\ba_\bv_\be_\br daemon, or if the daemon reports an error,  a  diag-
-       nostic  message  will  be  printed to stderr, and _\bx_\bs_\bc_\br_\be_\be_\bn_\b-
-       _\bs_\ba_\bv_\be_\br_\b-_\bc_\bo_\bm_\bm_\ba_\bn_\bd will exit with a  non-zero  value.   If  the
-       command is accepted, an indication of this will be printed
-       to stdout, and the exit value will be zero.
-
-E\bEN\bNV\bVI\bIR\bRO\bON\bNM\bME\bEN\bNT\bT
-       D\bDI\bIS\bSP\bPL\bLA\bAY\bY to get the host and display number of  the  screen
-               whose saver is to be manipulated.
-
-       P\bPA\bAT\bTH\bH    to   find  the  executable  to  restart  (for  the
-               _\b-_\br_\be_\bs_\bt_\ba_\br_\bt command).  Note  that  this  variable  is
-               consulted  in  the environment of the _\bx_\bs_\bc_\br_\be_\be_\bn_\bs_\ba_\bv_\be_\br
-               process, not the _\bx_\bs_\bc_\br_\be_\be_\bn_\bs_\ba_\bv_\be_\br_\b-_\bc_\bo_\bm_\bm_\ba_\bn_\bd process.
-
-U\bUP\bPG\bGR\bRA\bAD\bDE\bES\bS
-       The latest version of x\bxs\bsc\bcr\bre\bee\ben\bns\bsa\bav\bve\ber\br(1)  and  related  tools
-       can always be found at http://www.jwz.org/xscreensaver/
-
-S\bSE\bEE\bE A\bAL\bLS\bSO\bO
-       X\bX(1), x\bxs\bsc\bcr\bre\bee\ben\bns\bsa\bav\bve\ber\br(1) x\bxs\bsc\bcr\bre\bee\ben\bns\bsa\bav\bve\ber\br-\b-d\bde\bem\bmo\bo(1)
-
-C\bCO\bOP\bPY\bYR\bRI\bIG\bGH\bHT\bT
-       Copyright (C) 1992, 1993, 1997, 1998, 1999 by Jamie Zawin-
-       ski.  Permission to use,  copy,  modify,  distribute,  and
-       sell  this  software 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 sup-
-       porting  documentation.  No representations are made about
-       the suitability of this software for any purpose.   It  is
-       provided "as is" without express or implied warranty.
-
-A\bAU\bUT\bTH\bHO\bOR\bR
-       Jamie Zawinski <jwz@jwz.org>, 13-aug-92.
-
-       Please  let  me  know  if  you  find  any bugs or make any
-       improvements.
-
-
-
-
-
-
-
-
-
-
-
-
-
-X Version 11             20-Jun-99 (3.15)                       4
-
-
diff --git a/local/man/cat.1/xscreensaver-demo.1 b/local/man/cat.1/xscreensaver-demo.1
deleted file mode 100644 (file)
index dbea066..0000000
+++ /dev/null
@@ -1,330 +0,0 @@
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-N\bNA\bAM\bME\bE
-       xscreensaver-demo  -  interactively control the background
-       xscreensaver daemon
-
-S\bSY\bYN\bNO\bOP\bPS\bSI\bIS\bS
-       x\bxs\bsc\bcr\bre\bee\ben\bns\bsa\bav\bve\ber\br-\b-d\bde\bem\bmo\bo [-display _\bh_\bo_\bs_\bt_\b:_\bd_\bi_\bs_\bp_\bl_\ba_\by_\b._\bs_\bc_\br_\be_\be_\bn]  [-prefs]
-       [-xrm _\br_\be_\bs_\bo_\bu_\br_\bc_\be_\bs]
-
-D\bDE\bES\bSC\bCR\bRI\bIP\bPT\bTI\bIO\bON\bN
-       The _\bx_\bs_\bc_\br_\be_\be_\bn_\bs_\ba_\bv_\be_\br_\b-_\bd_\be_\bm_\bo program is a graphical front-end for
-       setting the parameters used  by  the  background  x\bxs\bsc\bcr\bre\bee\ben\bn-\b-
-       s\bsa\bav\bve\ber\br(1) daemon.  It is essentially two things: a tool for
-       editing the _\b~_\b/_\b._\bx_\bs_\bc_\br_\be_\be_\bn_\bs_\ba_\bv_\be_\br file; and a tool  for  demoing
-       the  various  graphics  hacks that the _\bx_\bs_\bc_\br_\be_\be_\bn_\bs_\ba_\bv_\be_\br daemon
-       will launch.
-
-       The main dialog box contains  a  scrolling  list,  a  text
-       field, and a number of buttons.
-
-       Double-clicking  on  one  of the programs in the list will
-       run it.  The screen will go black, and  the  program  will
-       run  in full-screen mode, just as it would if the _\bx_\bs_\bc_\br_\be_\be_\bn_\b-
-       _\bs_\ba_\bv_\be_\br daemon had launched it.  Clicking  the  mouse  again
-       will  stop  the  demo  and un-blank the screen, making the
-       dialog box visible again.
-
-       Single-clicking in the list will place the indicated  pro-
-       gram  and  its  args in the text field to be edited.  Edit
-       the arguments and hit return to run the program  with  the
-       parameters  you  have specified.  This will also save your
-       changes to your _\b~_\b/_\b._\bx_\bs_\bc_\br_\be_\be_\bn_\bs_\ba_\bv_\be_\br file: so any  changes  you
-       make in this way are persistent.
-
-       If  one of the lines in the scrolling list begins with the
-       character "-", then that means that the  program  is  dis-
-       abled:  _\bx_\bs_\bc_\br_\be_\be_\bn_\bs_\ba_\bv_\be_\br  will not select it to be run (though
-       you can still try it out by clicking on it.)  Rather  than
-       just  deleting  the  programs  you  don't want to run, you
-       might want to disable them in this way  instead,  so  that
-       you can more easily change your mind later.
-
-       If  the line begins with the name of a visual, followed by
-       a colon, then that program will only be run on  that  kind
-       of visual.  For example, you can specify that a particular
-       program should only be run  if  color  is  available,  and
-       another should only be run in monochrome.  See the discus-
-       sion of the _\bp_\br_\bo_\bg_\br_\ba_\bm_\bs parameter in the  _\bC_\bo_\bn_\bf_\bi_\bg_\bu_\br_\ba_\bt_\bi_\bo_\bn  sec-
-       tion of the x\bxs\bsc\bcr\bre\bee\ben\bns\bsa\bav\bve\ber\br(1) manual.
-
-       The buttons are:
-
-       R\bRu\bun\bn N\bNe\bex\bxt\bt
-               Clicking  this button will run the next program in
-               the list after  the  currently-selected  one,  and
-
-
-
-X Version 11             20-Jun-99 (3.15)                       1
-
-
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-               will  wrap  around  to the top when it reaches the
-               bottom.
-
-       R\bRu\bun\bn P\bPr\bre\bev\bvi\bio\bou\bus\bs
-               Opposite of Run Next; at the top, it wraps  around
-               to the bottom.
-
-       P\bPr\bre\bef\bfe\ber\bre\ben\bnc\bce\bes\bs
-               This  pops  up  a  second dialog box, in which you
-               have the option to interactively  change  most  of
-               the  screensaver's operational parameters, such as
-               its timeouts,  and  whether  it  should  lock  the
-               screen.   When  you click OK, your chosen settings
-               will take effect immediately,  and  will  also  be
-               saved  to  the  _\b~_\b/_\b._\bx_\bs_\bc_\br_\be_\be_\bn_\bs_\ba_\bv_\be_\br  file in your home
-               directory, so that the settings will persist  next
-               time.
-
-       Q\bQu\bui\bit\bt    Exits  the  _\bx_\bs_\bc_\br_\be_\be_\bn_\bs_\ba_\bv_\be_\br_\b-_\bd_\be_\bm_\bo  program.  The back-
-               ground _\bx_\bs_\bc_\br_\be_\be_\bn_\bs_\ba_\bv_\be_\br daemon will  continue  running
-               as before.
-
-       The  Preferences  dialog box lets you change the following
-       settings.
-
-       (There are more settings available, but these are the most
-       commonly used ones; see the manual for x\bxs\bsc\bcr\bre\bee\ben\bns\bsa\bav\bve\ber\br(1) for
-       other  parameters  that  can  be  set   by   editing   the
-       _\b~_\b/_\b._\bx_\bs_\bc_\br_\be_\be_\bn_\bs_\ba_\bv_\be_\br file, or the X resource database.)
-
-       S\bSa\bav\bve\ber\br T\bTi\bim\bme\beo\bou\but\bt
-               After  the  user  has  been  idle  this  long, the
-               _\bx_\bs_\bc_\br_\be_\be_\bn_\bs_\ba_\bv_\be_\br daemon will blank the screen.
-
-       C\bCy\byc\bcl\ble\be T\bTi\bim\bme\beo\bou\but\bt
-               After the screensaver has been  running  for  this
-               long,  the currently running graphics demo will be
-               killed, and a new one started.  If this is 0, then
-               the  graphics demo will never be changed: only one
-               demo will run until the screensaver is deactivated
-               by user activity.
-
-       V\bVe\ber\brb\bbo\bos\bse\be
-               Whether to print lots of debugging information.
-
-       I\bIn\bns\bst\bta\bal\bll\bl C\bCo\bol\blo\bor\brm\bma\bap\bp
-               Whether  to  install  a private colormap while the
-               screensaver is active, so that the graphics  hacks
-               can  get  as  many colors as possible.  (This only
-               applies when the screen's default visual is  being
-               used, since non-default visuals get their own col-
-               ormaps automatically.)  This can also be  overrid-
-               den on a per-demo basis.
-
-
-
-
-X Version 11             20-Jun-99 (3.15)                       2
-
-
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-       F\bFa\bad\bde\be C\bCo\bol\blo\bor\brm\bma\bap\bp
-               If  selected, then when the screensaver activates,
-               the current contents of the screen  will  fade  to
-               black  instead  of  simply winking out.  This only
-               works on displays with  writable  colormaps,  that
-               is,  if  the  screen's default visual is a Pseudo-
-               Color visual.  A  fade  will  also  be  done  when
-               switching  graphics  hacks (when the _\bC_\by_\bc_\bl_\be _\bT_\bi_\bm_\be_\bo_\bu_\bt
-               expires.)
-
-       U\bUn\bnf\bfa\bad\bde\be C\bCo\bol\blo\bor\brm\bma\bap\bp
-               The complement to _\bF_\ba_\bd_\be _\bC_\bo_\bl_\bo_\br_\bm_\ba_\bp: if selected, then
-               when  the  screensaver  deactivates,  the original
-               contents of the screen will  fade  in  from  black
-               instead of appearing immediately.  This only works
-               on displays with writable colormaps, and when _\bF_\ba_\bd_\be
-               _\bC_\bo_\bl_\bo_\br_\bm_\ba_\bp is also selected.
-
-       F\bFa\bad\bde\be D\bDu\bur\bra\bat\bti\bio\bon\bn
-               When  fading  or  unfading are selected, this con-
-               trols how long the fade will take.
-
-       F\bFa\bad\bde\be T\bTi\bic\bck\bks\bs
-               This controls how many times a second the colormap
-               will  be changed to effect a fade.  Higher numbers
-               yield smoother fades, but may make the fades  take
-               longer  than  the  specified number of seconds, if
-               your server isn't fast enough to keep up.
-
-       R\bRe\beq\bqu\bui\bir\bre\be P\bPa\bas\bss\bsw\bwo\bor\brd\bd
-               Whether the screen saver should  lock  the  screen
-               when it activates.
-
-       L\bLo\boc\bck\bk T\bTi\bim\bme\beo\bou\but\bt
-               If _\bR_\be_\bq_\bu_\bi_\br_\be _\bP_\ba_\bs_\bs_\bw_\bo_\br_\bd is selected, this controls the
-               length of the ``grace period''  between  when  the
-               screensaver activates, and when the screen becomes
-               locked.  For example,  if  this  is  0:05:00,  and
-               _\bS_\ba_\bv_\be_\br  _\bT_\bi_\bm_\be_\bo_\bu_\bt  is 0:10:00, then after 10 minutes,
-               the screen would blank.  If there was user  activ-
-               ity  at  12 minutes, no password would be required
-               to un-blank the screen.  But, if  there  was  user
-               activity  at  15  minutes  or later (that is, _\bL_\bo_\bc_\bk
-               _\bT_\bi_\bm_\be_\bo_\bu_\bt minutes after activation) then a  password
-               would be required.  The default is 0, meaning that
-               if locking is enabled, then  a  password  will  be
-               required as soon as the screen blanks.
-
-       P\bPa\bas\bss\bsw\bwo\bor\brd\bd T\bTi\bim\bme\beo\bou\but\bt
-               When  the screensaver is prompting for a password,
-               the prompt dialog box will stay on the screen  for
-               this  long  before  giving  up,  and  reverting to
-               screen-saving mode.
-
-
-
-
-X Version 11             20-Jun-99 (3.15)                       3
-
-
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-C\bCO\bOM\bMM\bMA\bAN\bND\bD-\b-L\bLI\bIN\bNE\bE O\bOP\bPT\bTI\bIO\bON\bNS\bS
-       _\bx_\bs_\bc_\br_\be_\be_\bn_\bs_\ba_\bv_\be_\br_\b-_\bd_\be_\bm_\bo  accepts  the  following  command   line
-       options.
-
-       -\b-d\bdi\bis\bsp\bpl\bla\bay\by _\bh_\bo_\bs_\bt_\b:_\bd_\bi_\bs_\bp_\bl_\ba_\by_\b._\bs_\bc_\br_\be_\be_\bn
-               The  X display to use.  The _\bx_\bs_\bc_\br_\be_\be_\bn_\bs_\ba_\bv_\be_\br_\b-_\bd_\be_\bm_\bo pro-
-               gram will open its window  on  that  display,  and
-               also  control the _\bx_\bs_\bc_\br_\be_\be_\bn_\bs_\ba_\bv_\be_\br daemon that is man-
-               aging that same display.
-
-       -\b-p\bpr\bre\bef\bfs\bs  Start up in Preferences mode: this  is  just  like
-               launching  the program with no arguments, and then
-               pressing the _\bP_\br_\be_\bf_\be_\br_\be_\bn_\bc_\be_\bs button.
-
-       It  is  important  that  the  _\bx_\bs_\bc_\br_\be_\be_\bn_\bs_\ba_\bv_\be_\br  and   _\bx_\bs_\bc_\br_\be_\be_\bn_\b-
-       _\bs_\ba_\bv_\be_\br_\b-_\bd_\be_\bm_\bo processes be running on the same machine, or at
-       least, on two machines that share  a  file  system.   When
-       _\bx_\bs_\bc_\br_\be_\be_\bn_\bs_\ba_\bv_\be_\br_\b-_\bd_\be_\bm_\bo  writes a new version of the _\b~_\b/_\b._\bx_\bs_\bc_\br_\be_\be_\bn_\b-
-       _\bs_\ba_\bv_\be_\br file, it's important that the _\bx_\bs_\bc_\br_\be_\be_\bn_\bs_\ba_\bv_\be_\br see  that
-       same  file.   If  the  two  processes are seeing different
-       _\b~_\b/_\b._\bx_\bs_\bc_\br_\be_\be_\bn_\bs_\ba_\bv_\be_\br files, things will malfunction.
-
-E\bEN\bNV\bVI\bIR\bRO\bON\bNM\bME\bEN\bNT\bT
-       D\bDI\bIS\bSP\bPL\bLA\bAY\bY to get the default host and display number.
-
-       P\bPA\bAT\bTH\bH    to find the sub-programs to  run.   However,  note
-               that the sub-programs are actually launched by the
-               _\bx_\bs_\bc_\br_\be_\be_\bn_\bs_\ba_\bv_\be_\br  daemon,  not  by   _\bx_\bs_\bc_\br_\be_\be_\bn_\bs_\ba_\bv_\be_\br_\b-_\bd_\be_\bm_\bo
-               itself.   So,  what  matters  is  what  $\b$P\bPA\bAT\bTH\bH  the
-               _\bx_\bs_\bc_\br_\be_\be_\bn_\bs_\ba_\bv_\be_\br program sees.
-
-       H\bHO\bOM\bME\bE    for the directory in which to read and  write  the
-               _\b._\bx_\bs_\bc_\br_\be_\be_\bn_\bs_\ba_\bv_\be_\br file.
-
-       X\bXE\bEN\bNV\bVI\bIR\bRO\bON\bNM\bME\bEN\bNT\bT
-               to  get the name of a resource file that overrides
-               the global resources stored in  the  RESOURCE_MAN-
-               AGER property.
-
-U\bUP\bPG\bGR\bRA\bAD\bDE\bES\bS
-       The    latest    version    can   always   be   found   at
-       http://www.jwz.org/xscreensaver/
-
-S\bSE\bEE\bE A\bAL\bLS\bSO\bO
-       X\bX(1), x\bxs\bsc\bcr\bre\bee\ben\bns\bsa\bav\bve\ber\br(1), x\bxs\bsc\bcr\bre\bee\ben\bns\bsa\bav\bve\ber\br-\b-c\bco\bom\bmm\bma\ban\bnd\bd(1)
-
-C\bCO\bOP\bPY\bYR\bRI\bIG\bGH\bHT\bT
-       Copyright (C) 1992, 1993, 1997, 1998, 1999 by Jamie Zawin-
-       ski.   Permission  to  use,  copy, modify, distribute, and
-       sell this software 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 sup-
-       porting documentation.  No representations are made  about
-
-
-
-X Version 11             20-Jun-99 (3.15)                       4
-
-
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-       the  suitability  of this software for any purpose.  It is
-       provided "as is" without express or implied warranty.
-
-A\bAU\bUT\bTH\bHO\bOR\bR
-       Jamie Zawinski <jwz@jwz.org>, 13-aug-92.
-
-       Please let me know if  you  find  any  bugs  or  make  any
-       improvements.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-X Version 11             20-Jun-99 (3.15)                       5
-
-
diff --git a/local/man/cat.1/xscreensaver.1 b/local/man/cat.1/xscreensaver.1
deleted file mode 100644 (file)
index 53b31a0..0000000
+++ /dev/null
@@ -1,1716 +0,0 @@
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-N\bNA\bAM\bME\bE
-       xscreensaver  -  graphics hack and screen locker, launched
-       when the user is idle
-
-S\bSY\bYN\bNO\bOP\bPS\bSI\bIS\bS
-       x\bxs\bsc\bcr\bre\bee\ben\bns\bsa\bav\bve\ber\br [-display _\bh_\bo_\bs_\bt_\b:_\bd_\bi_\bs_\bp_\bl_\ba_\by_\b._\bs_\bc_\br_\be_\be_\bn] [-timeout _\bi_\bn_\bt]
-       [-cycle  _\bi_\bn_\bt]  [-lock-mode] [-no-lock-mode] [-lock-timeout
-       _\bi_\bn_\bt] [-visual _\bv_\bi_\bs_\bu_\ba_\bl] [-install] [-no-install]  [-verbose]
-       [-silent]    [-timestamp]    [-capture-stderr]   [-no-cap-
-       ture-stderr]   [-splash]    [-no-splash]    [-nice    _\bi_\bn_\bt]
-       [-mit-extension]    [-no-mit-extension]   [-sgi-extension]
-       [-no-sgi-extension]  [-xidle-extension]  [-no-xidle-exten-
-       sion]   [-proc-interrupts]   [-no-proc-interrupts]   [-xrm
-       _\br_\be_\bs_\bo_\bu_\br_\bc_\be_\bs]
-
-D\bDE\bES\bSC\bCR\bRI\bIP\bPT\bTI\bIO\bON\bN
-       The _\bx_\bs_\bc_\br_\be_\be_\bn_\bs_\ba_\bv_\be_\br program  waits  until  the  keyboard  and
-       mouse  have been idle for a period, and then runs a graph-
-       ics demo chosen at random.  It turns off as soon as  there
-       is any mouse or keyboard activity.
-
-       This  program  can  lock your terminal in order to prevent
-       others from using it, though its default mode of operation
-       is  merely  to display pretty pictures on your screen when
-       it is not in use.
-
-       The benefit that this program has over the combination  of
-       the  x\bxl\blo\boc\bck\bk(1)  and  x\bxa\bau\but\bto\bol\blo\boc\bck\bk(1) programs is the ease with
-       which new graphics hacks can be installed.  You don't need
-       to  recompile  (or  even re-run) this program to add a new
-       display mode.
-
-G\bGE\bET\bTT\bTI\bIN\bNG\bG S\bST\bTA\bAR\bRT\bTE\bED\bD
-       For the impatient, try this:
-
-            xscreensaver &
-            xscreensaver-demo
-
-       The x\bxs\bsc\bcr\bre\bee\ben\bns\bsa\bav\bve\ber\br-\b-d\bde\bem\bmo\bo(1) program should pop  up  a  dialog
-       box  that  lets  you experiment with the xscreensaver set-
-       tings and graphics modes.
-
-       N\bNo\bot\bte\be:\b: unlike x\bxl\blo\boc\bck\bk(1), xscreensaver  has  a  client-server
-       model:  the  _\bx_\bs_\bc_\br_\be_\be_\bn_\bs_\ba_\bv_\be_\br program is a daemon that runs in
-       the  background;  it  is  controlled  by  the   foreground
-       x\bxs\bsc\bcr\bre\bee\ben\bns\bsa\bav\bve\ber\br-\b-d\bde\bem\bmo\bo(1) and x\bxs\bsc\bcr\bre\bee\ben\bns\bsa\bav\bve\ber\br-\b-c\bco\bom\bmm\bma\ban\bnd\bd(1) programs.
-
-C\bCO\bON\bNF\bFI\bIG\bGU\bUR\bRA\bAT\bTI\bIO\bON\bN
-       Options to  _\bx_\bs_\bc_\br_\be_\be_\bn_\bs_\ba_\bv_\be_\br  are  specified  in  one  of  two
-       places: in a _\b._\bx_\bs_\bc_\br_\be_\be_\bn_\bs_\ba_\bv_\be_\br file in your home directory; or
-       in the X resource database.   If  the  _\b._\bx_\bs_\bc_\br_\be_\be_\bn_\bs_\ba_\bv_\be_\br  file
-       exists,   it   overrides  any  settings  in  the  resource
-       database.
-
-
-
-
-X Version 11             20-Jun-99 (3.15)                       1
-
-
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-       The syntax of the _\b._\bx_\bs_\bc_\br_\be_\be_\bn_\bs_\ba_\bv_\be_\br file is similar to that of
-       the  _\b._\bX_\bd_\be_\bf_\ba_\bu_\bl_\bt_\bs  file;  for  example,  to  set the _\bt_\bi_\bm_\be_\bo_\bu_\bt
-       paramter in the _\b._\bx_\bs_\bc_\br_\be_\be_\bn_\bs_\ba_\bv_\be_\br file, you  would  write  the
-       following:
-
-            timeout: 5
-
-       whereas, in the _\b._\bX_\bd_\be_\bf_\ba_\bu_\bl_\bt_\bs file, you would write
-
-            xscreensaver.timeout: 5
-
-       If  you  change  a setting in the _\b._\bx_\bs_\bc_\br_\be_\be_\bn_\bs_\ba_\bv_\be_\br file while
-       xscreensaver is already running, it will notice this,  and
-       reload the file.  (The file will be reloaded the next time
-       the screen saver needs to take some action, such as blank-
-       ing  or  unblanking  the screen, or picking a new graphics
-       mode.)
-
-       If you change a setting in your X resource database, or if
-       you  want  xscreensaver to notice your changes immediately
-       instead of the next time it wakes up, then you  will  need
-       to  tell the running xscreensaver process to re-initialize
-       itself, like so:
-
-            xscreensaver-command -restart
-
-       Note that if you changed the _\b._\bX_\bd_\be_\bf_\ba_\bu_\bl_\bt_\bs  file,  you  might
-       also need to run x\bxr\brd\bdb\bb(1):
-
-            xrdb < ~/.Xdefaults
-
-       If  you  want  to  set the system-wide defaults, then make
-       your edits to the xscreensaver  app-defaults  file,  which
-       should  have  been  installed when xscreensaver itself was
-       installed.  The app-defaults file will  usually  be  named
-       /usr/lib/X11/app-defaults/XScreenSaver, but different sys-
-       tems might keep it in  a  different  place  (for  example,
-       /usr/openwin/lib/app-defaults/XScreenSaver on Solaris.)
-
-       When  settings  are  changed in the Preferences dialog box
-       (see above) the current settings will be  written  to  the
-       _\b._\bx_\bs_\bc_\br_\be_\be_\bn_\bs_\ba_\bv_\be_\br  file.   (The  _\b._\bX_\bd_\be_\bf_\ba_\bu_\bl_\bt_\bs  file and the app-
-       defaults  file  will  never  be  written  by  xscreensaver
-       itself.)
-
-
-       t\bti\bim\bme\beo\bou\but\bt (class T\bTi\bim\bme\be)
-               The  screensaver  will activate (blank the screen)
-               after the keyboard and mouse have  been  idle  for
-               this many minutes.  Default 10 minutes.
-
-       c\bcy\byc\bcl\ble\be (class T\bTi\bim\bme\be)
-               After  the  screensaver  has been running for this
-               many minutes, the currently running  graphics-hack
-
-
-
-X Version 11             20-Jun-99 (3.15)                       2
-
-
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-               sub-process  will  be killed (with S\bSI\bIG\bGT\bTE\bER\bRM\bM), and a
-               new one started.  If this is 0, then the  graphics
-               hack will never be changed: only one demo will run
-               until  the  screensaver  is  deactivated  by  user
-               activity.  Default 10 minutes.
-
-       l\blo\boc\bck\bk (class B\bBo\boo\bol\ble\bea\ban\bn)
-               Enable  locking:  before the screensaver will turn
-               off, it will require you to type the  password  of
-               the  logged-in  user  (really,  the person who ran
-               xscreensaver), or the root password.  (N\bNo\bot\bte\be:\b:  this
-               doesn't  work  if  the  screensaver is launched by
-               x\bxd\bdm\bm(1) because it can't know the  user-id  of  the
-               logged-in user.  See the ``_\bU_\bs_\bi_\bn_\bg _\bX_\bD_\bM_\b(_\b1_\b)'' section,
-               below.
-
-       l\blo\boc\bck\bkT\bTi\bim\bme\beo\bou\but\bt (class T\bTi\bim\bme\be)
-               If locking is enabled, this controls the length of
-               the  ``grace period'' between when the screensaver
-               activates, and when  the  screen  becomes  locked.
-               For  example,  if  this  is 5, and _\b-_\bt_\bi_\bm_\be_\bo_\bu_\bt is 10,
-               then after 10 minutes, the screen would blank.  If
-               there was user activity at 12 minutes, no password
-               would be required to un-blank the screen.  But, if
-               there  was  user  activity  at 15 minutes or later
-               (that is, _\b-_\bl_\bo_\bc_\bk_\b-_\bt_\bi_\bm_\be_\bo_\bu_\bt minutes after  activation)
-               then a password would be required.  The default is
-               0, meaning that if  locking  is  enabled,  then  a
-               password  will  be  required as soon as the screen
-               blanks.
-
-       p\bpa\bas\bss\bsw\bwd\bdT\bTi\bim\bme\beo\bou\but\bt (class T\bTi\bim\bme\be)
-               If the screen is locked, then  this  is  how  many
-               seconds  the password dialog box should be left on
-               the screen before giving up (default 30  seconds.)
-               This  should  not  be  too  large: the X server is
-               grabbed for the duration that the password  dialog
-               box  is up (for security purposes) and leaving the
-               server grabbed for too long can cause problems.
-
-       v\bvi\bis\bsu\bua\bal\blI\bID\bD (class V\bVi\bis\bsu\bua\bal\blI\bID\bD)
-               Specify which X visual to use by  default.   (Note
-               carefully  that  this resource is called v\bvi\bis\bsu\bua\bal\blI\bID\bD,
-               not merely v\bvi\bis\bsu\bua\bal\bl; if you set the v\bvi\bis\bsu\bua\bal\bl  resource
-               instead,  things  will malfunction in obscure ways
-               for obscure reasons.)
-
-               Legal values for the V\bVi\bis\bsu\bua\bal\blI\bID\bD resource are:
-
-               d\bde\bef\bfa\bau\bul\blt\bt Use  the  screen's  default  visual   (the
-                       visual  of  the root window.)  This is the
-                       default.
-
-               b\bbe\bes\bst\bt    Use the visual  which  supports  the  most
-
-
-
-X Version 11             20-Jun-99 (3.15)                       3
-
-
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-                       colors.   Note,  however,  that the visual
-                       with the most colors might be a  TrueColor
-                       visual,  which  does  not support colormap
-                       animation.  Some programs have more inter-
-                       esting  behavior  when  run on PseudoColor
-                       visuals than on TrueColor.
-
-               m\bmo\bon\bno\bo    Use a monochrome visual, if there is  one.
-
-               g\bgr\bra\bay\by    Use  a  grayscale or staticgray visual, if
-                       there is one and  it  has  more  than  one
-                       plane (that is, it's not monochrome.)
-
-               c\bco\bol\blo\bor\br   Use  the  best  of  the  color visuals, if
-                       there are any.
-
-               G\bGL\bL      Use the visual that  is  best  for  OpenGL
-                       programs.   (OpenGL programs have somewhat
-                       different requirements than other  X  pro-
-                       grams.)
-
-               _\bc_\bl_\ba_\bs_\bs   where  _\bc_\bl_\ba_\bs_\bs is one of S\bSt\bta\bat\bti\bic\bcG\bGr\bra\bay\by, S\bSt\bta\bat\bti\bic\bc-\b-
-                       C\bCo\bol\blo\bor\br, T\bTr\bru\bue\beC\bCo\bol\blo\bor\br, G\bGr\bra\bay\byS\bSc\bca\bal\ble\be,  P\bPs\bse\beu\bud\bdo\boC\bCo\bol\blo\bor\br,
-                       or   D\bDi\bir\bre\bec\bct\btC\bCo\bol\blo\bor\br.    Selects  the  deepest
-                       visual of the given class.
-
-               _\bn_\bu_\bm_\bb_\be_\br  where _\bn_\bu_\bm_\bb_\be_\br (decimal or  hex)  is  inter-
-                       preted  as a visual id number, as reported
-                       by the x\bxd\bdp\bpy\byi\bin\bnf\bfo\bo(1) program;  in  this  way
-                       you  can  have  finer control over exactly
-                       which visual gets used,  for  example,  to
-                       select  a  shallower one than would other-
-                       wise have been chosen.
-
-               Note that this option specifies only  the  _\bd_\be_\bf_\ba_\bu_\bl_\bt
-               visual  that  will be used: the visual used may be
-               overridden on a program-by-program basis.  See the
-               description of the p\bpr\bro\bog\bgr\bra\bam\bms\bs resource, below.
-
-       i\bin\bns\bst\bta\bal\bll\blC\bCo\bol\blo\bor\brm\bma\bap\bp (class B\bBo\boo\bol\ble\bea\ban\bn)
-               Install  a  private colormap while the screensaver
-               is active, so that the graphics hacks can  get  as
-               many  colors  as  possible.   This is the default.
-               (This  only  applies  when  the  screen's  default
-               visual  is  being  used, since non-default visuals
-               get their own colormaps automatically.)  This  can
-               also  be  overridden  on a per-hack basis: see the
-               discussion of the d\bde\bef\bfa\bau\bul\blt\bt-\b-n\bn name  in  the  section
-               about the p\bpr\bro\bog\bgr\bra\bam\bms\bs resource.
-
-       v\bve\ber\brb\bbo\bos\bse\be (class B\bBo\boo\bol\ble\bea\ban\bn)
-               Whether to print diagnostics.  Default false.
-
-
-
-
-
-X Version 11             20-Jun-99 (3.15)                       4
-
-
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-       t\bti\bim\bme\bes\bst\bta\bam\bmp\bp (class B\bBo\boo\bol\ble\bea\ban\bn)
-               Whether  to  print  the time of day along with any
-               other diagnostic messages.  Default false.
-
-       s\bsp\bpl\bla\bas\bsh\bh (class B\bBo\boo\bol\ble\bea\ban\bn)
-               Whether to display a  splash  screen  at  startup.
-               Default true.
-
-       s\bsp\bpl\bla\bas\bsh\bhD\bDu\bur\bra\bat\bti\bio\bon\bn (class T\bTi\bim\bme\be)
-               How  long the splash screen should remain visible;
-               default 5 seconds.
-
-       h\bhe\bel\blp\bpU\bUR\bRL\bL (class U\bUR\bRL\bL)
-               The splash screen has a _\bH_\be_\bl_\bp button on  it.   When
-               you  press  it, it will display the web page indi-
-               cated here in your web browser.
-
-       l\blo\boa\bad\bdU\bUR\bRL\bL (class L\bLo\boa\bad\bdU\bUR\bRL\bL)
-               This is the shell command used to load a URL  into
-               your  web  browser.  The default setting will load
-               it into Netscape if it is already running,  other-
-               wise,  will  launch  a new Netscape looking at the
-               _\bh_\be_\bl_\bp_\bU_\bR_\bL.
-
-       d\bde\bem\bmo\boC\bCo\bom\bmm\bma\ban\bnd\bd (class D\bDe\bem\bmo\boC\bCo\bom\bmm\bma\ban\bnd\bd)
-               This is the shell command run when the _\bD_\be_\bm_\bo button
-               on  the  splash window is pressed.  It defaults to
-               _\bx_\bs_\bc_\br_\be_\be_\bn_\bs_\ba_\bv_\be_\br_\b-_\bd_\be_\bm_\bo.
-
-       p\bpr\bre\bef\bfs\bsC\bCo\bom\bmm\bma\ban\bnd\bd (class P\bPr\bre\bef\bfs\bsC\bCo\bom\bmm\bma\ban\bnd\bd)
-               This is the shell command run when the _\bP_\br_\be_\bf_\bs  but-
-               ton  on the splash window is pressed.  It defaults
-               to _\bx_\bs_\bc_\br_\be_\be_\bn_\bs_\ba_\bv_\be_\br_\b-_\bd_\be_\bm_\bo _\b-_\bp_\br_\be_\bf_\bs.
-
-       n\bni\bic\bce\be (class N\bNi\bic\bce\be)
-               The sub-processes created by _\bx_\bs_\bc_\br_\be_\be_\bn_\bs_\ba_\bv_\be_\br will  be
-               ``niced''  to  this  level, so that they are given
-               lower priority than other processes on the system,
-               and  don't  increase  the load unnecessarily.  The
-               default is 10.
-
-               (Higher numbers mean lower priority;  see  n\bni\bic\bce\be(1)
-               for details.)
-
-       f\bfa\bad\bde\be (class B\bBo\boo\bol\ble\bea\ban\bn)
-               If  this  is true, then when the screensaver acti-
-               vates, the current contents  of  the  screen  will
-               fade to black instead of simply winking out.  This
-               only works on displays  with  writable  colormaps,
-               that is, if the screen's default visual is a Pseu-
-               doColor visual.  A fade will  also  be  done  when
-               switching  graphics  hacks  (when  the _\bc_\by_\bc_\bl_\be timer
-               expires.)  Default: true.
-
-
-
-
-X Version 11             20-Jun-99 (3.15)                       5
-
-
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-       u\bun\bnf\bfa\bad\bde\be (class B\bBo\boo\bol\ble\bea\ban\bn)
-               If this is true, then when the screensaver deacti-
-               vates,  the  original  contents of the screen will
-               fade in from black instead  of  appearing  immedi-
-               ately.   This only works on displays with writable
-               colormaps, and if _\bf_\ba_\bd_\be is true as  well.   Default
-               false.
-
-       f\bfa\bad\bde\beS\bSe\bec\bco\bon\bnd\bds\bs (class T\bTi\bim\bme\be)
-               If _\bf_\ba_\bd_\be is true, this is how long the fade will be
-               in seconds (default 3 seconds.)
-
-       f\bfa\bad\bde\beT\bTi\bic\bck\bks\bs (class I\bIn\bnt\bte\beg\bge\ber\br)
-               If _\bf_\ba_\bd_\be is true, this is how many times  a  second
-               the  colormap  will  be  changed to effect a fade.
-               Higher numbers yield smoother fades, but may  make
-               the  fades take longer than the specified _\bf_\ba_\bd_\be_\bS_\be_\bc_\b-
-               _\bo_\bn_\bd_\bs if your server isn't fast enough to keep  up.
-               Default 20.
-
-       c\bca\bap\bpt\btu\bur\bre\beS\bSt\btd\bde\ber\brr\br (class B\bBo\boo\bol\ble\bea\ban\bn)
-               Whether  _\bx_\bs_\bc_\br_\be_\be_\bn_\bs_\ba_\bv_\be_\br  should  redirect its stdout
-               and stderr streams to the  window  itself.   Since
-               its  nature  is to take over the screen, you would
-               not  normally  see  error  messages  generated  by
-               xscreensaver  or  the  sub-programs  it runs; this
-               resource will cause the  output  of  all  relevant
-               programs  to  be  drawn  on the screensaver window
-               itself, as well as being written to  the  control-
-               ling  terminal  of the screensaver driver process.
-               Default true.
-
-       f\bfo\bon\bnt\bt (class F\bFo\bon\bnt\bt)
-               The font used for the stdout/stderr text, if  c\bca\bap\bp-\b-
-               t\btu\bur\bre\beS\bSt\btd\bde\ber\brr\br         is        true.         Default
-               *\b*-\b-m\bme\bed\bdi\biu\bum\bm-\b-r\br-\b-*\b*-\b-1\b14\b40\b0-\b-*\b*-\b-m\bm-\b-*\b*  (a  14  point  fixed-width
-               font.)
-
-       p\bpr\bro\bog\bgr\bra\bam\bms\bs (class P\bPr\bro\bog\bgr\bra\bam\bms\bs)
-               The  graphics  hacks  which _\bx_\bs_\bc_\br_\be_\be_\bn_\bs_\ba_\bv_\be_\br runs when
-               the user is idle.  The value of this resource is a
-               string, one _\bs_\bh-syntax command per line.  Each line
-               must contain exactly one command:  no  semicolons,
-               no ampersands.
-
-               When  the  screensaver  starts up, one of these is
-               selected at random,  and  run.   After  the  _\bc_\by_\bc_\bl_\be
-               period  expires,  it  is  killed,  and  another is
-               selected and run.
-
-               If the value of this resource is  empty,  then  no
-               programs  will  be  run; the screen will simply be
-               made black.
-
-
-
-
-X Version 11             20-Jun-99 (3.15)                       6
-
-
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-               If the display has multiple screens, then  a  dif-
-               ferent  program will be run for each screen.  (All
-               screens are blanked and unblanked simultaniously.)
-
-               Note that you must escape the newlines; here is an
-               example  of  how  you  might  set  this  in   your
-               _\b~_\b/_\b._\bx_\bs_\bc_\br_\be_\be_\bn_\bs_\ba_\bv_\be_\br file:
-
-
-                    programs:  \
-                           qix -root                          \n\
-                           ico -r -faces -sleep 1 -obj ico    \n\
-                           xdaliclock -builtin2 -root         \n\
-                           xv -root -rmode 5 image.gif -quit  \n
-
-               Make  sure  your $\b$P\bPA\bAT\bTH\bH environment variable is set
-               up correctly _\bb_\be_\bf_\bo_\br_\be xscreensaver is  launched,  or
-               it  won't  be  able to find the programs listed in
-               the _\bp_\br_\bo_\bg_\br_\ba_\bm_\bs resource.
-
-               To use a program as a screensaver, two things  are
-               required:  that that program draw on the root win-
-               dow (or be able to be configured to  draw  on  the
-               root  window);  and  that  that program understand
-               ``virtual root'' windows, as used by virtual  win-
-               dow  managers  such as t\btv\bvt\btw\bwm\bm(1).  (Generally, this
-               is accomplished by just  including  the  _\b"_\bv_\br_\bo_\bo_\bt_\b._\bh_\b"
-               header file in the program's source.)
-
-               If  there  are  some programs that you want to run
-               only when using a color display, and  others  that
-               you  want to run only when using a monochrome dis-
-               play, you can specify that like this:
-
-                           mono:   mono-program  -root        \n\
-                           color:  color-program -root        \n\
-
-               More generally, you can specify the kind of visual
-               that  should  be  used for the window on which the
-               program will be drawing.  For example, if one pro-
-               gram  works best if it has a colormap, but another
-               works best if it has a 24-bit visual, both can  be
-               accommodated:
-
-                           PseudoColor: cmap-program  -root   \n\
-                           TrueColor:   24bit-program -root   \n\
-
-               In addition to the symbolic visual names described
-               above (in the discussion of the _\bv_\bi_\bs_\bu_\ba_\bl_\bI_\bD resource)
-               one other visual name is supported in the _\bp_\br_\bo_\bg_\br_\ba_\bm_\bs
-               list:
-
-                d\bde\bef\bfa\bau\bul\blt\bt-\b-n\bn
-                    This is like d\bde\bef\bfa\bau\bul\blt\bt, but also  requests  the
-
-
-
-X Version 11             20-Jun-99 (3.15)                       7
-
-
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-                    use  of  the  default  colormap, instead of a
-                    private colormap.  (That is, it behaves as if
-                    the _\b-_\bn_\bo_\b-_\bi_\bn_\bs_\bt_\ba_\bl_\bl command-line option was spec-
-                    ified, but only for  this  particular  hack.)
-                    This  is  provided  because  some third-party
-                    programs  that  draw  on  the   root   window
-                    (notably:  x\bxv\bv(1), and x\bxe\bea\bar\brt\bth\bh(1)) make assump-
-                    tions about the visual and  colormap  of  the
-                    root  window:  assumptions which xscreensaver
-                    can violate.
-
-               If you specify a particular visual for a  program,
-               and that visual does not exist on the screen, then
-               that program will not  be  chosen  to  run.   This
-               means  that  on  displays with multiple screens of
-               different depths, you can arrange for  appropriate
-               hacks  to  be  run  on  each.  For example, if one
-               screen is color and the other is monochrome, hacks
-               that  look  good  in  mono  can be run on one, and
-               hacks that only look good in color will show up on
-               the other.
-
-
-       Normally you won't need to change the following resources:
-
-
-       p\bpo\boi\bin\bnt\bte\ber\brP\bPo\bol\bll\blT\bTi\bim\bme\be (class T\bTi\bim\bme\be)
-               When server extensions are not in use,  this  con-
-               trols how frequently _\bx_\bs_\bc_\br_\be_\be_\bn_\bs_\ba_\bv_\be_\br checks to see if
-               the  mouse  position  or  buttons  have   changed.
-               Default 5 seconds.
-
-       w\bwi\bin\bnd\bdo\bow\bwC\bCr\bre\bea\bat\bti\bio\bon\bnT\bTi\bim\bme\beo\bou\but\bt (class T\bTi\bim\bme\be)
-               When  server  extensions are not in use, this con-
-               trols the delay between when windows  are  created
-               and  when  _\bx_\bs_\bc_\br_\be_\be_\bn_\bs_\ba_\bv_\be_\br  selects  events  on them.
-               Default 30 seconds.
-
-       i\bin\bni\bit\bti\bia\bal\blD\bDe\bel\bla\bay\by (class T\bTi\bim\bme\be)
-               When server extensions are not  in  use,  _\bx_\bs_\bc_\br_\be_\be_\bn_\b-
-               _\bs_\ba_\bv_\be_\br will wait this many seconds before selecting
-               events on existing windows, under  the  assumption
-               that  _\bx_\bs_\bc_\br_\be_\be_\bn_\bs_\ba_\bv_\be_\br  is  started  during your login
-               procedure, and the window state may  be  in  flux.
-               Default  0.  (This used to default to 30, but that
-               was back in the days when slow machines and X ter-
-               minals were more common...)
-
-       s\bsg\bgi\biS\bSa\bav\bve\ber\brE\bEx\bxt\bte\ben\bns\bsi\bio\bon\bn (class B\bBo\boo\bol\ble\bea\ban\bn)
-               There  are  a  number of different X server exten-
-               sions which can make  xscreensaver's  job  easier.
-               The  next  few  resources  specify  whether  these
-               extensions should be utilized if they  are  avail-
-               able.
-
-
-
-X Version 11             20-Jun-99 (3.15)                       8
-
-
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-               This    resource    controls   whether   the   SGI
-               S\bSC\bCR\bRE\bEE\bEN\bN_\b_S\bSA\bAV\bVE\bER\bR server  extension  will  be  used  to
-               decide  whether  the  user  is  idle.  This is the
-               default if _\bx_\bs_\bc_\br_\be_\be_\bn_\bs_\ba_\bv_\be_\br  has  been  compiled  with
-               support  for  this extension (which is the default
-               on  SGI  systems.).   If  it  is  available,   the
-               S\bSC\bCR\bRE\bEE\bEN\bN_\b_S\bSA\bAV\bVE\bER\bR  method  is  faster and more reliable
-               than what will be done otherwise, so use it if you
-               can.  (This extension is only available on Silicon
-               Graphics systems, unfortunately.)
-
-       m\bmi\bit\btS\bSa\bav\bve\ber\brE\bEx\bxt\bte\ben\bns\bsi\bio\bon\bn (class B\bBo\boo\bol\ble\bea\ban\bn)
-               This     resource     controls     whether     the
-               M\bMI\bIT\bT-\b-S\bSC\bCR\bRE\bEE\bEN\bN-\b-S\bSA\bAV\bVE\bER\bR  server extension will be used to
-               decide whether the user  is  idle.   However,  the
-               default  for  this resource is _\bf_\ba_\bl_\bs_\be, because even
-               if this extension is available, it is  flaky  (and
-               it  also makes the f\bfa\bad\bde\be option not work properly.)
-               Use of this extension is not recommended.
-
-       x\bxi\bid\bdl\ble\beE\bEx\bxt\bte\ben\bns\bsi\bio\bon\bn (class B\bBo\boo\bol\ble\bea\ban\bn)
-               This resource controls whether  the  X\bXI\bID\bDL\bLE\bE  server
-               extension  will be used to decide whether the user
-               is idle.  This is the default if _\bx_\bs_\bc_\br_\be_\be_\bn_\bs_\ba_\bv_\be_\br  has
-               been  compiled  with  support  for this extension.
-               (This extension is only available  for  X11R4  and
-               X11R5 systems, unfortunately.)
-
-       p\bpr\bro\boc\bcI\bIn\bnt\bte\ber\brr\bru\bup\bpt\bts\bs (class B\bBo\boo\bol\ble\bea\ban\bn)
-               This  resource  controls  whether the /\b/p\bpr\bro\boc\bc/\b/i\bin\bnt\bte\ber\br-\b-
-               r\bru\bup\bpt\bts\bs file should be consulted to  decide  whether
-               the user is idle.  This is the default if _\bx_\bs_\bc_\br_\be_\be_\bn_\b-
-               _\bs_\ba_\bv_\be_\br has been compiled on a system which supports
-               this mechanism (i.e., Linux systems.)
-
-               The benefit to doing this is that _\bx_\bs_\bc_\br_\be_\be_\bn_\bs_\ba_\bv_\be_\br can
-               note that the user is active even when the X  con-
-               sole  is not the active one: if the user is typing
-               in  another  virtual  console,  xscreensaver  will
-               notice  that and will fail to activate.  For exam-
-               ple, if you're playing Quake in VGA-mode, xscreen-
-               saver won't wake up in the middle of your game and
-               start competing for CPU.
-
-               The drawback to doing this  is  that  perhaps  you
-               _\br_\be_\ba_\bl_\bl_\by  _\bd_\bo want idleness on the X console to cause
-               the X display to lock, even if there  is  activity
-               on other virtual consoles.  If you want that, then
-               set this option to False.  (Or  just  lock  the  X
-               console manually.)
-
-               The  default  value  for this resource is True, on
-               systems where it works.
-
-
-
-
-X Version 11             20-Jun-99 (3.15)                       9
-
-
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-       o\bov\bve\ber\brl\bla\bay\byS\bSt\btd\bde\ber\brr\br (class B\bBo\boo\bol\ble\bea\ban\bn)
-               If c\bca\bap\bpt\btu\bur\bre\beS\bSt\btd\bde\ber\brr\br is True, and your server supports
-               ``overlay'' visuals, then the text will be written
-               into one of the higher layers instead of into  the
-               same layer as the running screenhack.  Set this to
-               False to disable that (though you  shouldn't  need
-               to.)
-
-       o\bov\bve\ber\brl\bla\bay\byT\bTe\bex\bxt\btF\bFo\bor\bre\beg\bgr\bro\bou\bun\bnd\bd (class F\bFo\bor\bre\beg\bgr\bro\bou\bun\bnd\bd)
-               The  foreground  color  used for the stdout/stderr
-               text, if c\bca\bap\bpt\btu\bur\bre\beS\bSt\btd\bde\ber\brr\br is true.  Default:  Yellow.
-
-       o\bov\bve\ber\brl\bla\bay\byT\bTe\bex\bxt\btB\bBa\bac\bck\bkg\bgr\bro\bou\bun\bnd\bd (class B\bBa\bac\bck\bkg\bgr\bro\bou\bun\bnd\bd)
-               The  background  color  used for the stdout/stderr
-               text, if c\bca\bap\bpt\btu\bur\bre\beS\bSt\btd\bde\ber\brr\br is true.  Default: Black.
-
-       b\bbo\bou\bur\brn\bne\beS\bSh\bhe\bel\bll\bl (class B\bBo\bou\bur\brn\bne\beS\bSh\bhe\bel\bll\bl)
-               The pathname of the shell that  _\bx_\bs_\bc_\br_\be_\be_\bn_\bs_\ba_\bv_\be_\br  uses
-               to start subprocesses.  This must be whatever your
-               local variant of /\b/b\bbi\bin\bn/\b/s\bsh\bh  is:  in  particular,  it
-               must not be c\bcs\bsh\bh.
-
-C\bCO\bOM\bMM\bMA\bAN\bND\bD-\b-L\bLI\bIN\bNE\bE O\bOP\bPT\bTI\bIO\bON\bNS\bS
-       _\bx_\bs_\bc_\br_\be_\be_\bn_\bs_\ba_\bv_\be_\br  also  accepts  the  following  command  line
-       options.  Except for the _\b-_\bd_\bi_\bs_\bp_\bl_\ba_\by option,  these  command-
-       line  options are all simply shorthand for the X resources
-       described in the _\bC_\bo_\bn_\bf_\bi_\bg_\bu_\br_\ba_\bt_\bi_\bo_\bn section, above.
-
-       -\b-d\bdi\bis\bsp\bpl\bla\bay\by _\bh_\bo_\bs_\bt_\b:_\bd_\bi_\bs_\bp_\bl_\ba_\by_\b._\bs_\bc_\br_\be_\be_\bn
-               The X display to use.  For displays with  multiple
-               screens,  XScreenSaver  will manage all screens on
-               the display simultaniously;  the  _\bs_\bc_\br_\be_\be_\bn  argument
-               (the  ``default'' screen) says which screen should
-               be used for dialog  boxes  (the  password  window,
-               _\bD_\be_\bm_\bo _\bM_\bo_\bd_\be, etc.)
-
-       -\b-t\bti\bim\bme\beo\bou\but\bt _\bm_\bi_\bn_\bu_\bt_\be_\bs
-               Same as the _\bt_\bi_\bm_\be_\bo_\bu_\bt resource.
-
-       -\b-c\bcy\byc\bcl\ble\be _\bm_\bi_\bn_\bu_\bt_\be_\bs
-               Same as the _\bc_\by_\bc_\bl_\be resource.
-
-       -\b-l\blo\boc\bck\bk-\b-m\bmo\bod\bde\be
-               Same as setting the _\bl_\bo_\bc_\bk resource to _\bt_\br_\bu_\be.
-
-       -\b-n\bno\bo-\b-l\blo\boc\bck\bk-\b-m\bmo\bod\bde\be
-               Same as setting the _\bl_\bo_\bc_\bk resource to _\bf_\ba_\bl_\bs_\be.
-
-       -\b-l\blo\boc\bck\bk-\b-t\bti\bim\bme\beo\bou\but\bt _\bm_\bi_\bn_\bu_\bt_\be_\bs
-               Same as the _\bl_\bo_\bc_\bk_\bT_\bi_\bm_\be_\bo_\bu_\bt resource.
-
-       -\b-v\bvi\bis\bsu\bua\bal\bl _\bv_\bi_\bs_\bu_\ba_\bl
-               Same as the _\bv_\bi_\bs_\bu_\ba_\bl_\bI_\bD resource.
-
-
-
-
-X Version 11             20-Jun-99 (3.15)                      10
-
-
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-       -\b-i\bin\bns\bst\bta\bal\bll\bl
-               Same  as  setting  the _\bi_\bn_\bs_\bt_\ba_\bl_\bl_\bC_\bo_\bl_\bo_\br_\bm_\ba_\bp resource to
-               _\bt_\br_\bu_\be.
-
-       -\b-n\bno\bo-\b-i\bin\bns\bst\bta\bal\bll\bl
-               Same as setting the  _\bi_\bn_\bs_\bt_\ba_\bl_\bl_\bC_\bo_\bl_\bo_\br_\bm_\ba_\bp  resource  to
-               _\bf_\ba_\bl_\bs_\be.
-
-       -\b-v\bve\ber\brb\bbo\bos\bse\be
-               Same as setting the _\bv_\be_\br_\bb_\bo_\bs_\be resource to _\bt_\br_\bu_\be.
-
-       -\b-s\bsi\bil\ble\ben\bnt\bt Same as setting the _\bv_\be_\br_\bb_\bo_\bs_\be resource to _\bf_\ba_\bl_\bs_\be.
-
-       -\b-t\bti\bim\bme\bes\bst\bta\bam\bmp\bp
-               Same as setting the _\bt_\bi_\bm_\be_\bs_\bt_\ba_\bm_\bp resource to _\bt_\br_\bu_\be.
-
-       -\b-c\bca\bap\bpt\btu\bur\bre\be-\b-s\bst\btd\bde\ber\brr\br
-               Same  as  setting  the  _\bc_\ba_\bp_\bt_\bu_\br_\be_\bS_\bt_\bd_\be_\br_\br  resource to
-               _\bt_\br_\bu_\be.
-
-       -\b-n\bno\bo-\b-c\bca\bap\bpt\btu\bur\bre\be-\b-s\bst\btd\bde\ber\brr\br
-               Same as  setting  the  _\bc_\ba_\bp_\bt_\bu_\br_\be_\bS_\bt_\bd_\be_\br_\br  resource  to
-               _\bf_\ba_\bl_\bs_\be.
-
-       -\b-s\bsp\bpl\bla\bas\bsh\bh Same as setting the _\bs_\bp_\bl_\ba_\bs_\bh resource to _\bt_\br_\bu_\be.
-
-       -\b-n\bno\bo-\b-s\bsp\bpl\bla\bas\bsh\bh
-               Same as setting the _\bs_\bp_\bl_\ba_\bs_\bh resource to _\bf_\ba_\bl_\bs_\be.
-
-       -\b-n\bni\bic\bce\be _\bi_\bn_\bt_\be_\bg_\be_\br
-               Same as the _\bn_\bi_\bc_\be resource.
-
-       -\b-s\bsg\bgi\bi-\b-e\bex\bxt\bte\ben\bns\bsi\bio\bon\bn
-               Same  as setting the _\bs_\bg_\bi_\bS_\ba_\bv_\be_\br_\bE_\bx_\bt_\be_\bn_\bs_\bi_\bo_\bn resource to
-               _\bt_\br_\bu_\be.
-
-       -\b-n\bno\bo-\b-s\bsg\bgi\bi-\b-e\bex\bxt\bte\ben\bns\bsi\bio\bon\bn
-               Same as setting the _\bs_\bg_\bi_\bS_\ba_\bv_\be_\br_\bE_\bx_\bt_\be_\bn_\bs_\bi_\bo_\bn resource  to
-               _\bf_\ba_\bl_\bs_\be.
-
-       -\b-m\bmi\bit\bt-\b-e\bex\bxt\bte\ben\bns\bsi\bio\bon\bn
-               Same  as setting the _\bm_\bi_\bt_\bS_\ba_\bv_\be_\br_\bE_\bx_\bt_\be_\bn_\bs_\bi_\bo_\bn resource to
-               _\bt_\br_\bu_\be.
-
-       -\b-n\bno\bo-\b-m\bmi\bit\bt-\b-e\bex\bxt\bte\ben\bns\bsi\bio\bon\bn
-               Same as setting the _\bm_\bi_\bt_\bS_\ba_\bv_\be_\br_\bE_\bx_\bt_\be_\bn_\bs_\bi_\bo_\bn resource  to
-               _\bf_\ba_\bl_\bs_\be.
-
-       -\b-x\bxi\bid\bdl\ble\be-\b-e\bex\bxt\bte\ben\bns\bsi\bio\bon\bn
-               Same  as  setting  the  _\bx_\bi_\bd_\bl_\be_\bE_\bx_\bt_\be_\bn_\bs_\bi_\bo_\bn resource to
-               _\bt_\br_\bu_\be.
-
-       -\b-n\bno\bo-\b-x\bxi\bid\bdl\ble\be-\b-e\bex\bxt\bte\ben\bns\bsi\bio\bon\bn
-               Same as setting  the  _\bx_\bi_\bd_\bl_\be_\bE_\bx_\bt_\be_\bn_\bs_\bi_\bo_\bn  resource  to
-
-
-
-X Version 11             20-Jun-99 (3.15)                      11
-
-
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-               _\bf_\ba_\bl_\bs_\be.
-
-       -\b-p\bpr\bro\boc\bc-\b-i\bin\bnt\bte\ber\brr\bru\bup\bpt\bts\bs
-               Same  as  setting  the  _\bp_\br_\bo_\bc_\bI_\bn_\bt_\be_\br_\br_\bu_\bp_\bt_\bs resource to
-               _\bt_\br_\bu_\be.
-
-       -\b-n\bno\bo-\b-p\bpr\bro\boc\bc-\b-i\bin\bnt\bte\ber\brr\bru\bup\bpt\bts\bs
-               Same as setting  the  _\bp_\br_\bo_\bc_\bI_\bn_\bt_\be_\br_\br_\bu_\bp_\bt_\bs  resource  to
-               _\bf_\ba_\bl_\bs_\be.
-
-       -\b-x\bxr\brm\bm _\br_\be_\bs_\bo_\bu_\br_\bc_\be_\b-_\bs_\bp_\be_\bc_\bi_\bf_\bi_\bc_\ba_\bt_\bi_\bo_\bn
-               As  with  all other Xt programs, you can specify X
-               resources on the command-line using the _\b-_\bx_\br_\bm argu-
-               ment.  Most of the interesting resources have com-
-               mand-line equivalents, however.
-
-H\bHO\bOW\bW I\bIT\bT W\bWO\bOR\bRK\bKS\bS
-       When it is time to activate the screensaver, a full-screen
-       black  window  is  created  on each screen of the display.
-       Each window is created in such a way that, to  any  subse-
-       quently-created programs, it will appear to be a ``virtual
-       root'' window.  Because of this, any program  which  draws
-       on  the  root window (and which understands virtual roots)
-       can be used as a screensaver.
-
-       When the user becomes active again, the  screensaver  win-
-       dows are unmapped, and the running subprocesses are killed
-       by sending them S\bSI\bIG\bGT\bTE\bER\bRM\bM.  This is  also  how  the  subpro-
-       cesses  are  killed when the screensaver decides that it's
-       time to run a different demo: the old one is killed and  a
-       new one is launched.
-
-       Before  launching  a  subprocess,  _\bx_\bs_\bc_\br_\be_\be_\bn_\bs_\ba_\bv_\be_\br  stores an
-       appropriate value for $\b$D\bDI\bIS\bSP\bPL\bLA\bAY\bY in the environment that the
-       child  will  recieve.   (This  is  so  that  if  you start
-       _\bx_\bs_\bc_\br_\be_\be_\bn_\bs_\ba_\bv_\be_\br with a _\b-_\bd_\bi_\bs_\bp_\bl_\ba_\by argument, the programs  which
-       _\bx_\bs_\bc_\br_\be_\be_\bn_\bs_\ba_\bv_\be_\br  launches  will draw on the same display; and
-       so that the child will end up drawing on  the  appropriate
-       screen of a multi-headed display.)
-
-       When  the  screensaver  turns  off,  or is killed, care is
-       taken to restore the ``real'' virtual root window if there
-       is  one.   Because  of  this, it is important that you not
-       kill the screensaver process with _\bk_\bi_\bl_\bl _\b-_\b9 if you are  run-
-       ning  a  virtual-root window manager.  If you kill it with
-       -9, you may need to restart your window manager to  repair
-       the  damage.   This isn't an issue if you aren't running a
-       virtual-root window manager.
-
-       For all the gory details, see the commentary at the top of
-       xscreensaver.c.
-
-       You can control a running screensaver process by using the
-       x\bxs\bsc\bcr\bre\bee\ben\bns\bsa\bav\bve\ber\br-\b-c\bco\bom\bmm\bma\ban\bnd\bd(1) program (which see.)
-
-
-
-X Version 11             20-Jun-99 (3.15)                      12
-
-
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-P\bPO\bOW\bWE\bER\bR M\bMA\bAN\bNA\bAG\bGE\bEM\bME\bEN\bNT\bT
-       Modern X servers contain support to power down the monitor
-       after  an  idle  period.  If the monitor has powered down,
-       then _\bx_\bs_\bc_\br_\be_\be_\bn_\bs_\ba_\bv_\be_\br will notice this, and will not waste CPU
-       by  drawing  graphics demos on a black screen.  An attempt
-       will also be made to explicitly power the monitor back  up
-       as soon as user activity is detected.
-
-       If  your  X server supports power management, then x\bxs\bse\bet\bt(1)
-       will accept a d\bdp\bpm\bms\bs option.  So, if you wanted _\bx_\bs_\bc_\br_\be_\be_\bn_\bs_\ba_\bv_\be_\br
-       to  activate  after 5 minutes, but you wanted your monitor
-       to power down after one hour (3600 seconds) you  would  do
-       this:
-
-            xset dpms 3600
-
-       See  the  man  page  for  the x\bxs\bse\bet\bt(1) program for details.
-       (Note that power management requires both software support
-       in  the  X  server,  and  hardware  support in the monitor
-       itself.)
-
-U\bUS\bSI\bIN\bNG\bG X\bXD\bDM\bM(\b(1\b1)\b)
-       You can run _\bx_\bs_\bc_\br_\be_\be_\bn_\bs_\ba_\bv_\be_\br from your x\bxd\bdm\bm(1) session, so that
-       the  screensaver will run even when nobody is logged in on
-       the console.
-
-       The trick to using xscreensaver with _\bx_\bd_\bm is this: keep  in
-       mind  the  two very different states in which xscreensaver
-       will be running:
-
-           1\b1:\b: N\bNo\bob\bbo\bod\bdy\by l\blo\bog\bgg\bge\bed\bd i\bin\bn.\b.
-
-              If you're thinking of running xscreensaver from XDM
-              at  all, then it's probably because you want graph-
-              ics demos to be running on the console when  nobody
-              is  logged  in  there.   In this case, xscreensaver
-              will function only as a screen saver, not a  screen
-              locker:  it  doesn't make sense for xscreensaver to
-              lock the screen, since nobody  is  logged  in  yet!
-              The  only  thing  on  the  screen  is the XDM login
-              prompt.
-
-           2\b2:\b: S\bSo\bom\bme\beb\bbo\bod\bdy\by l\blo\bog\bgg\bge\bed\bd i\bin\bn.\b.
-
-              Once someone has logged in through  the  XDM  login
-              window, the situation is very different.  For exam-
-              ple: now it makes sense to  lock  the  screen  (and
-              prompt  for the logged in user's password); and now
-              xscreensaver should consult that user's _\b~_\b/_\b._\bx_\bs_\bc_\br_\be_\be_\bn_\b-
-              _\bs_\ba_\bv_\be_\br file; and so on.
-
-       The  difference  between  these two states comes down to a
-       question of, which user is the _\bx_\bs_\bc_\br_\be_\be_\bn_\bs_\ba_\bv_\be_\br  process  run-
-       ning  as?  For the first state, it doesn't matter.  If you
-
-
-
-X Version 11             20-Jun-99 (3.15)                      13
-
-
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-       start _\bx_\bs_\bc_\br_\be_\be_\bn_\bs_\ba_\bv_\be_\br in the usual XDM way, then xscreensaver
-       will  probably  end  up running as root, which is fine for
-       the first case (the ``nobody logged in'' case.)
-
-       However, once someone is logged in, running as root is  no
-       longer  fine:  because  xscreensaver  will  be  consulting
-       root's _\b._\bx_\bs_\bc_\br_\be_\be_\bn_\bs_\ba_\bv_\be_\br file instead of that of the logged in
-       user,  and  won't  be  prompting  for the logged in user's
-       password, and so on.  (This is  not  a  security  problem,
-       it's just not what you want.)
-
-       So,  once  someone has logged in, you want xscreensaver to
-       be running as that user.  The way to accomplish this is to
-       kill  the old xscreensaver process and start a new one (as
-       the new user.)
-
-       The simplest way to accomplish all of this is as follows:
-
-           1\b1:\b: L\bLa\bau\bun\bnc\bch\bh x\bxs\bsc\bcr\bre\bee\ben\bns\bsa\bav\bve\ber\br b\bbe\bef\bfo\bor\bre\be a\ban\bny\byo\bon\bne\be l\blo\bog\bgs\bs i\bin\bn.\b.
-
-              To the file _\b/_\bu_\bs_\br_\b/_\bl_\bi_\bb_\b/_\bX_\b1_\b1_\b/_\bx_\bd_\bm_\b/_\bX_\bs_\be_\bt_\bu_\bp, add the lines
-
-                   xscreensaver-command -exit
-                   xscreensaver &
-
-              This will run xscreensaver as root,  over  the  XDM
-              login  window.   Moving  the  mouse  will cause the
-              screen to un-blank, and  allow  the  user  to  type
-              their password at XDM to log in.
-
-           2\b2:\b: R\bRe\bes\bst\bta\bar\brt\bt x\bxs\bsc\bcr\bre\bee\ben\bns\bsa\bav\bve\ber\br w\bwh\bhe\ben\bn s\bso\bom\bme\beo\bon\bne\be l\blo\bog\bgs\bs i\bin\bn.\b.
-
-              Near the top of the file _\b/_\bu_\bs_\br_\b/_\bl_\bi_\bb_\b/_\bX_\b1_\b1_\b/_\bx_\bd_\bm_\b/_\bX_\bs_\be_\bs_\bs_\bi_\bo_\bn,
-              add those same lines:
-
-                   xscreensaver-command -exit
-                   xscreensaver &
-
-              When someone logs in, this will kill off the exist-
-              ing  (root)  xscreensaver  process, and start a new
-              one, running as the user who has  just  logged  in.
-              If  the user's .xscreensaver file requests locking,
-              they'll get it.   They  will  also  get  their  own
-              choice  of timeouts, and graphics demos, and so on.
-
-              Alternately, each user could just put  those  lines
-              in their personal _\b~_\b/_\b._\bx_\bs_\be_\bs_\bs_\bi_\bo_\bn files.
-
-       Make  sure  you  have $\b$P\bPA\bAT\bTH\bH set up correctly in the _\bX_\bs_\be_\bt_\bu_\bp
-       and _\bX_\bs_\be_\bs_\bs_\bi_\bo_\bn  scripts,  or  _\bx_\bd_\bm  won't  be  able  to  find
-       _\bx_\bs_\bc_\br_\be_\be_\bn_\bs_\ba_\bv_\be_\br,  and/or  _\bx_\bs_\bc_\br_\be_\be_\bn_\bs_\ba_\bv_\be_\br  won't be able to find
-       its graphics demos.
-
-       (If your system does not seem to be executing  the  _\bX_\bs_\be_\bt_\bu_\bp
-
-
-
-X Version 11             20-Jun-99 (3.15)                      14
-
-
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-       file,  you  may  need to configure it to do so: the tradi-
-       tional way to do this is to make that file  the  value  of
-       the      _\bD_\bi_\bs_\bp_\bl_\ba_\by_\bM_\ba_\bn_\ba_\bg_\be_\br_\b*_\bs_\be_\bt_\bu_\bp      resource     in     the
-       _\b/_\bu_\bs_\br_\b/_\bl_\bi_\bb_\b/_\bX_\b1_\b1_\b/_\bx_\bd_\bm_\b/_\bx_\bd_\bm_\b-_\bc_\bo_\bn_\bf_\bi_\bg file.  See the  man  page  for
-       x\bxd\bdm\bm(1) for more details.)
-
-       It  is  safe to run _\bx_\bs_\bc_\br_\be_\be_\bn_\bs_\ba_\bv_\be_\br as root (as _\bx_\bd_\bm is likely
-       to do.)  If run as root, _\bx_\bs_\bc_\br_\be_\be_\bn_\bs_\ba_\bv_\be_\br changes  its  effec-
-       tive  user and group ids to something safe (like _\b"_\bn_\bo_\bb_\bo_\bd_\by_\b")
-       before connecting to the X server or launching user-speci-
-       fied programs.
-
-       An  unfortunate  side  effect of this (important) security
-       precaution is  that  it  may  conflict  with  cookie-based
-       authentication.
-
-       If  you  get  "connection  refused"  errors  when  running
-       _\bx_\bs_\bc_\br_\be_\be_\bn_\bs_\ba_\bv_\be_\br from _\bx_\bd_\bm, then this probably means  that  you
-       have  x\bxa\bau\but\bth\bh(1) or some other security mechanism turned on.
-       One way  around  this  is  to  add  "\b"x\bxh\bho\bos\bst\bt +\b+l\blo\boc\bca\bal\blh\bho\bos\bst\bt"\b"  to
-       _\bX_\bs_\be_\bt_\bu_\bp, just before _\bx_\bs_\bc_\br_\be_\be_\bn_\bs_\ba_\bv_\be_\br is launched.
-
-       Note  that this will give access to the X server to anyone
-       capable of logging in to the local  machine,  so  in  some
-       environments,  this  might not be appropriate.  If turning
-       off file-system-based access control  is  not  acceptable,
-       then  running  _\bx_\bs_\bc_\br_\be_\be_\bn_\bs_\ba_\bv_\be_\br from the _\bX_\bs_\be_\bt_\bu_\bp file might not
-       be possible, and xscreensaver will only work when  running
-       as a normal, unprivileged user.
-
-       For  more  information  on  the  X server's access control
-       mechanisms, see the  man  pages  for  X\bX(1),  X\bXs\bse\bec\bcu\bur\bri\bit\bty\by(1),
-       x\bxa\bau\but\bth\bh(1), and x\bxh\bho\bos\bst\bt(1).
-
-U\bUS\bSI\bIN\bNG\bG C\bCD\bDE\bE (\b(C\bCO\bOM\bMM\bMO\bON\bN D\bDE\bES\bSK\bKT\bTO\bOP\bP E\bEN\bNV\bVI\bIR\bRO\bON\bNM\bME\bEN\bNT\bT)\b)
-       The  easiest  way to use _\bx_\bs_\bc_\br_\be_\be_\bn_\bs_\ba_\bv_\be_\br on a system with CDE
-       is to simply switch off the built-in CDE screensaver,  and
-       use  _\bx_\bs_\bc_\br_\be_\be_\bn_\bs_\ba_\bv_\be_\br  instead;  and second, to tell the front
-       panel to run x\bxs\bsc\bcr\bre\bee\ben\bns\bsa\bav\bve\ber\br-\b-c\bco\bom\bmm\bma\ban\bnd\bd(1) with the _\b-_\bl_\bo_\bc_\bk option
-       when the _\bL_\bo_\bc_\bk icon is clicked.
-
-       To accomplish this involves five steps:
-
-           1\b1:\b: S\bSw\bwi\bit\btc\bch\bh o\bof\bff\bf C\bCD\bDE\bE'\b's\bs l\blo\boc\bck\bke\ber\br
-              Do  this  by  turning off ``_\bS_\bc_\br_\be_\be_\bn _\bS_\ba_\bv_\be_\br _\ba_\bn_\bd _\bS_\bc_\br_\be_\be_\bn
-              _\bL_\bo_\bc_\bk'' in the Screen section of the Style  Manager.
-
-           2\b2:\b: E\bEd\bdi\bit\bt s\bse\bes\bss\bsi\bio\bon\bne\bet\btc\bc
-              Edit  the file _\b~_\b/_\b._\bd_\bt_\b/_\bs_\be_\bs_\bs_\bi_\bo_\bn_\bs_\b/_\bs_\be_\bs_\bs_\bi_\bo_\bn_\be_\bt_\bc and add to
-              it the line
-
-                   xscreensaver &
-
-              This will cause _\bx_\bs_\bc_\br_\be_\be_\bn_\bs_\ba_\bv_\be_\br to  be  launched  when
-
-
-
-X Version 11             20-Jun-99 (3.15)                      15
-
-
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-              you  log  in.   (As always, make sure that xscreen-
-              saver and the graphics demos are on your $\b$P\bPA\bAT\bTH\bH; the
-              path  needs  to be set in _\b._\bc_\bs_\bh_\br_\bc and/or _\b._\bd_\bt_\bp_\br_\bo_\bf_\bi_\bl_\be,
-              not _\b._\bl_\bo_\bg_\bi_\bn.)
-
-           3\b3:\b: C\bCr\bre\bea\bat\bte\be X\bXS\bSc\bcr\bre\bee\ben\bnS\bSa\bav\bve\ber\br.\b.d\bdt\bt
-              Create a  file  called  _\b~_\b/_\b._\bd_\bt_\b/_\bt_\by_\bp_\be_\bs_\b/_\bX_\bS_\bc_\br_\be_\be_\bn_\bS_\ba_\bv_\be_\br_\b._\bd_\bt
-              with the following contents:
-
-                   ACTION XScreenSaver
-                   {
-                     LABEL         XScreenSaver
-                     TYPE          COMMAND
-                     EXEC_STRING   xscreensaver-command -lock
-                     ICON          Dtkey
-                     WINDOW_TYPE   NO_STDIO
-                   }
-
-              This  defines  a ``lock'' command for the CDE front
-              panel, that knows how to talk to _\bx_\bs_\bc_\br_\be_\be_\bn_\bs_\ba_\bv_\be_\br.
-
-           4\b4:\b: C\bCr\bre\bea\bat\bte\be L\bLo\boc\bck\bk.\b.f\bfp\bp
-              Create a file called _\b~_\b/_\b._\bd_\bt_\b/_\bt_\by_\bp_\be_\bs_\b/_\bL_\bo_\bc_\bk_\b._\bf_\bp  with  the
-              following contents:
-
-                   CONTROL Lock
-                   {
-                     TYPE             icon
-                     CONTAINER_NAME   Switch
-                     CONTAINER_TYPE   SWITCH
-                     POSITION_HINTS   1
-                     ICON             Fplock
-                     LABEL            Lock
-                     PUSH_ACTION      XScreenSaver
-                     HELP_TOPIC       FPOnItemLock
-                     HELP_VOLUME      FPanel
-                   }
-
-              This  associates  the CDE front panel ``Lock'' icon
-              with the lock command we just defined in step 3.
-
-           5\b5:\b: R\bRe\bes\bst\bta\bar\brt\bt
-              Select ``_\bR_\be_\bs_\bt_\ba_\br_\bt _\bW_\bo_\br_\bk_\bs_\bp_\ba_\bc_\be _\bM_\ba_\bn_\ba_\bg_\be_\br'' from the popup
-              menu  to  make your changes take effect.  If things
-              seem not to be working, check the file _\b~_\b/_\b._\bd_\bt_\b/_\be_\br_\br_\bo_\br_\b-
-              _\bl_\bo_\bg for error messages.
-
-U\bUS\bSI\bIN\bNG\bG H\bHP\bP V\bVU\bUE\bE (\b(V\bVI\bIS\bSU\bUA\bAL\bL U\bUS\bSE\bER\bR E\bEN\bNV\bVI\bIR\bRO\bON\bNM\bME\bEN\bNT\bT)\b)
-       Since  CDE  is  a  descendant of VUE, the instructions for
-       using xscreensaver under VUE are similar to the above:
-
-           1\b1:\b: S\bSw\bwi\bit\btc\bch\bh o\bof\bff\bf V\bVU\bUE\bE'\b's\bs l\blo\boc\bck\bke\ber\br
-              Open the ``_\bS_\bt_\by_\bl_\be _\bM_\ba_\bn_\ba_\bg_\be_\br'' and  select  ``_\bS_\bc_\br_\be_\be_\bn.''
-              Turn off ``_\bS_\bc_\br_\be_\be_\bn _\bS_\ba_\bv_\be_\br _\ba_\bn_\bd _\bS_\bc_\br_\be_\be_\bn _\bL_\bo_\bc_\bk'' option.
-
-
-
-X Version 11             20-Jun-99 (3.15)                      16
-
-
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-           2\b2:\b: M\bMa\bak\bke\be s\bsu\bur\bre\be y\byo\bou\bu h\bha\bav\bve\be a\ba S\bSe\bes\bss\bsi\bio\bon\bn
-              Next,  go to the Style Manager's, ``_\bS_\bt_\ba_\br_\bt_\bu_\bp'' page.
-              Click on ``_\bS_\be_\bt _\bH_\bo_\bm_\be _\bS_\be_\bs_\bs_\bi_\bo_\bn'' to create a  session,
-              then  on  ``_\bR_\be_\bt_\bu_\br_\bn _\bt_\bo _\bH_\bo_\bm_\be _\bS_\be_\bs_\bs_\bi_\bo_\bn'' to select this
-              session each time you log in.
-
-           3\b3:\b: E\bEd\bdi\bit\bt v\bvu\bue\be.\b.s\bse\bes\bss\bsi\bio\bon\bn
-              Edit the file _\b~_\b/_\b._\bv_\bu_\be_\b/_\bs_\be_\bs_\bs_\bi_\bo_\bn_\bs_\b/_\bh_\bo_\bm_\be_\b/_\bv_\bu_\be_\b._\bs_\be_\bs_\bs_\bi_\bo_\bn  and
-              add to it the line
-
-                   vuesmcmd -screen 0 -cmd "xscreensaver"
-
-              This  will  cause  _\bx_\bs_\bc_\br_\be_\be_\bn_\bs_\ba_\bv_\be_\br to be launched when
-              you log in.  (As always, make  sure  that  xscreen-
-              saver and the graphics demos are on your $\b$P\bPA\bAT\bTH\bH; the
-              path needs to be set in _\b._\bc_\bs_\bh_\br_\bc and/or _\b._\bp_\br_\bo_\bf_\bi_\bl_\be, not
-              _\b._\bl_\bo_\bg_\bi_\bn.)
-
-           3\b3:\b: E\bEd\bdi\bit\bt v\bvu\bue\bew\bwm\bmr\brc\bc
-              Edit  the  file  _\b~_\b/_\b._\bv_\bu_\be_\b/_\bv_\bu_\be_\bw_\bm_\br_\bc and add (or change)
-              the Lock control:
-
-                   CONTROL Lock
-                   {
-                     TYPE         button
-                     IMAGE        lock
-                     PUSH_ACTION  f.exec "xscreensaver-command -lock"
-                     HELP_TOPIC   FPLock
-                   }
-
-              This associates the VUE front panel  ``Lock''  icon
-              with the xscreensaver lock command.
-
-
-A\bAD\bDD\bDI\bIN\bNG\bG T\bTO\bO M\bME\bEN\bNU\bUS\bS
-       The x\bxs\bsc\bcr\bre\bee\ben\bns\bsa\bav\bve\ber\br-\b-c\bco\bom\bmm\bma\ban\bnd\bd(1) program is a perfect candidate
-       for something to add to your window manager's popup menus.
-       If  you  use m\bmw\bwm\bm(1), 4\b4D\bDw\bwm\bm(1), t\btw\bwm\bm(1), or (probably) any of
-       _\bt_\bw_\bm's many descendants, you can do it like this:
-
-       1\b1.\b. C\bCr\bre\bea\bat\bte\be ~\b~/\b/.\b.m\bmw\bwm\bmr\brc\bc (\b(o\bor\br ~\b~/\b/.\b.t\btw\bwm\bmr\brc\bc o\bor\br .\b..\b..\b.)\b)
-          If you don't have a  _\b~_\b/_\b._\bm_\bw_\bm_\br_\bc  file  (or,  on  SGIs,  a
-          _\b~_\b/_\b._\b4_\bD_\bw_\bm_\br_\bc  file;  or,  with  twm, a _\b~_\b/_\b._\bt_\bw_\bm_\br_\bc file) then
-          create one by making a copy  of  the  _\b/_\bu_\bs_\br_\b/_\bl_\bi_\bb_\b/_\bX_\b1_\b1_\b/_\bs_\by_\bs_\b-
-          _\bt_\be_\bm_\b._\bm_\bw_\bm_\br_\bc  file  (or _\b/_\bu_\bs_\br_\b/_\bl_\bi_\bb_\b/_\bX_\b1_\b1_\b/_\bt_\bw_\bm_\b/_\bs_\by_\bs_\bt_\be_\bm_\b._\bt_\bw_\bm_\br_\bc, and
-          so on.)
-
-       2\b2.\b. A\bAd\bdd\bd a\ba m\bme\ben\bnu\bu d\bde\bef\bfi\bin\bni\bit\bti\bio\bon\bn.\b.
-          Something like this:
-
-               menu XScreenSaver
-               {
-                "Blank Screen Now" !"sleep 3; xscreensaver-command -activate"
-                "Lock Screen Now"  !"sleep 3; xscreensaver-command -lock"
-
-
-
-X Version 11             20-Jun-99 (3.15)                      17
-
-
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-                "Screen Saver Demo"         !"xscreensaver-demo"
-                "Screen Saver Preferences"  !"xscreensaver-demo -prefs"
-                "Reinitialize Screen Saver" !"xscreensaver-command -restart"
-                "Kill Screen Saver"         !"xscreensaver-command -exit"
-                "Launch Screen Saver"       !"xscreensaver &"
-               }
-
-
-       3\b3.\b. A\bAd\bdd\bd t\bth\bhe\be m\bme\ben\bnu\bu
-          For m\bmw\bwm\bm(1) and 4\b4D\bDw\bwm\bm(1), find the section  of  the  file
-          that  says  _\bM_\be_\bn_\bu  _\bD_\be_\bf_\ba_\bu_\bl_\bt_\bR_\bo_\bo_\bt_\bM_\be_\bn_\bu.  For t\btw\bwm\bm(1), it will
-          probably be _\bm_\be_\bn_\bu _\b"_\bd_\be_\bf_\bo_\bp_\bs_\b".  If you add a line somewhere
-          in that menu definition that reads
-
-                 "XScreenSaver"        f.menu XScreenSaver
-
-          then  this  will  add  an XScreenSaver sub-menu to your
-          default root-window popup menu.  Alternately, you could
-          just  put the xscreensaver menu items directly into the
-          root menu.
-
-       Other window managers are guaranteed to do  things  gratu-
-       itously differently.
-
-B\bBU\bUG\bGS\bS
-       Bugs?   There  are no bugs.  Ok, well, maybe.  If you find
-       one,  please  let  me  know.   http://www.jwz.org/xscreen-
-       saver/bugs.html  explains how to construct the most useful
-       bug reports.
-
-       L\bLo\boc\bck\bki\bin\bng\bg a\ban\bnd\bd X\bXD\bDM\bM
-               If xscreensaver  has  been  launched  from  x\bxd\bdm\bm(1)
-               before anyone has logged in, you will need to kill
-               and then restart the xscreensaver daemon after you
-               have  logged  in,  or  you will be confused by the
-               results.  (For example, locking  won't  work,  and
-               your _\b~_\b/_\b._\bx_\bs_\bc_\br_\be_\be_\bn_\bs_\ba_\bv_\be_\br file will be ignored.)
-
-               When  you are logged in, you want the _\bx_\bs_\bc_\br_\be_\be_\bn_\bs_\ba_\bv_\be_\br
-               daemon to be running under _\by_\bo_\bu_\br user  id,  not  as
-               root or some other user.
-
-               If  it  has  already  been started by _\bx_\bd_\bm, you can
-               kill it by sending it the e\bex\bxi\bit\bt command,  and  then
-               re-launching  it as you, by putting something like
-               the following in your personal X startup script:
-
-                    xscreensaver-command -exit
-                    xscreensaver &
-
-               The ``_\bU_\bs_\bi_\bn_\bg _\bX_\bD_\bM_\b(_\b1_\b)''  section,  above,  goes  into
-               more  detail,  and  explains  how to configure the
-               system to do this for all users automatically.
-
-
-
-
-X Version 11             20-Jun-99 (3.15)                      18
-
-
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-       L\bLo\boc\bck\bki\bin\bng\bg a\ban\bnd\bd r\bro\boo\bot\bt l\blo\bog\bgi\bin\bns\bs
-               In order for it to be safe for xscreensaver to  be
-               launched  by  _\bx_\bd_\bm,  certain  precautions had to be
-               taken, among them that xscreensaver never runs  as
-               _\br_\bo_\bo_\bt.   In  particular,  if it is launched as root
-               (as _\bx_\bd_\bm is likely to do), xscreensaver  will  dis-
-               avow  its  privileges, and switch itself to a safe
-               user id (such as _\bn_\bo_\bb_\bo_\bd_\by.)
-
-               An implication of this is that if you  log  in  as
-               _\br_\bo_\bo_\bt  on  the console, xscreensaver will refuse to
-               lock the screen (because it can't tell the differ-
-               ence  between _\br_\bo_\bo_\bt being logged in on the console,
-               and a normal user being logged in on  the  console
-               but  xscreensaver  having  been  launched  by  the
-               x\bxd\bdm\bm(1) _\bX_\bs_\be_\bt_\bu_\bp file.)
-
-               The solution to this is simple: you  shouldn't  be
-               logging  in  on  the  console as _\br_\bo_\bo_\bt in the first
-               place!  (What, are you crazy or something?)
-
-               Proper Unix hygiene dictates that you  should  log
-               in  as  yourself,  and s\bsu\bu(1) to _\br_\bo_\bo_\bt as necessary.
-               People who spend their day logged in as  _\br_\bo_\bo_\bt  are
-               just begging for disaster.
-
-       X\bXA\bAU\bUT\bTH\bH a\ban\bnd\bd X\bXD\bDM\bM
-               For  xscreensaver to work when launched by x\bxd\bdm\bm(1),
-               programs running on  the  local  machine  as  user
-               _\b"_\bn_\bo_\bb_\bo_\bd_\by_\b"  must be able to connect to the X server.
-               This means that if you want to run xscreensaver on
-               the  console  while  nobody  is logged in, you may
-               need to disable cookie-based access  control  (and
-               allow  all  users  who  can  log  in  to the local
-               machine to connect to the display.)
-
-               You should be sure  that  this  is  an  acceptable
-               thing  to  do in your environment before doing it.
-               See the ``_\bU_\bs_\bi_\bn_\bg _\bX_\bD_\bM_\b(_\b1_\b)'' section, above, for  more
-               details.
-
-               If  anyone  has  suggestions  on  how xscreensaver
-               could be made to work with  x\bxd\bdm\bm(1)  without  first
-               turning   off  _\b._\bX_\ba_\bu_\bt_\bh_\bo_\br_\bi_\bt_\by-based  access  control,
-               please let me know.
-
-       P\bPa\bas\bss\bsw\bwo\bor\brd\bds\bs
-               If you  get  an  error  message  at  startup  like
-               ``couldn't get password of _\bu_\bs_\be_\br'' then this proba-
-               bly means that you're on a  system  in  which  the
-               g\bge\bet\btp\bpw\bwe\ben\bnt\bt(3)  library  routine  can  only be effec-
-               tively used by root.  If this is  the  case,  then
-               _\bx_\bs_\bc_\br_\be_\be_\bn_\bs_\ba_\bv_\be_\br  must  be installed as setuid to root
-               in order for locking to work.  Care has been taken
-
-
-
-X Version 11             20-Jun-99 (3.15)                      19
-
-
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-               to make this a safe thing to do.
-
-               It  also  may  mean  that  your system uses shadow
-               passwords  instead  of  the  standard  g\bge\bet\btp\bpw\bwe\ben\bnt\bt(3)
-               interface;  in  that  case, you may need to change
-               some options with _\bc_\bo_\bn_\bf_\bi_\bg_\bu_\br_\be and recompile.
-
-               If you change your password after xscreensaver has
-               been  launched,  it  will  continue using your old
-               password to unlock the screen  until  xscreensaver
-               is restarted.  So, after you change your password,
-               you'll have to do
-
-                    xscreensaver-command -restart
-
-               to make _\bx_\bs_\bc_\br_\be_\be_\bn_\bs_\ba_\bv_\be_\br notice.
-
-       P\bPA\bAM\bM P\bPa\bas\bss\bsw\bwo\bor\brd\bds\bs
-               If your system uses PAM (Pluggable  Authentication
-               Modules),  then  in  order for xscreensaver to use
-               PAM properly, PAM must be told about xscreensaver.
-               The   xscreensaver   installation  process  should
-               update the PAM data (on  Linux,  by  creating  the
-               file   _\b/_\be_\bt_\bc_\b/_\bp_\ba_\bm_\b._\bd_\b/_\bx_\bs_\bc_\br_\be_\be_\bn_\bs_\ba_\bv_\be_\br  for  you,  and  on
-               Solaris, by telling you what lines to add  to  the
-               _\b/_\be_\bt_\bc_\b/_\bp_\ba_\bm_\b._\bc_\bo_\bn_\bf file.)
-
-               If  the  PAM configuration files do not know about
-               xscreensaver, then you _\bm_\bi_\bg_\bh_\bt  be  in  a  situation
-               where  xscreensaver will refuse to ever unlock the
-               screen.
-
-               This is a design flaw in PAM (there is no way  for
-               a  client  to  tell  the  difference  between  PAM
-               responding ``I have never heard of your  module,''
-               and responding, ``you typed the wrong password.'')
-               As far as I can tell, there is no way for xscreen-
-               saver to automatically work around this, or detect
-               the problem in advance, so if you have  PAM,  make
-               sure it is configured correctly!
-
-       C\bCo\bol\blo\bor\brm\bma\bap\bp l\blo\bos\bss\bsa\bag\bge\be:\b: T\bTW\bWM\bM
-               The  i\bin\bns\bst\bta\bal\bll\blC\bCo\bol\blo\bor\brm\bma\bap\bp option doesn't work very well
-               with the t\btw\bwm\bm(1) window  manager  and  its  descen-
-               dants.
-
-               There  is a race condition between the screensaver
-               and this window manager, which can result  in  the
-               screensaver's colormap not getting installed prop-
-               erly, meaning the graphics hacks  will  appear  in
-               essentially  random  colors.   (If the screen goes
-               white instead of black, this is probably why.)
-
-               The m\bmw\bwm\bm(1) and o\bol\blw\bwm\bm(1) window managers don't  have
-
-
-
-X Version 11             20-Jun-99 (3.15)                      20
-
-
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-               this problem.  The race condition exists because X
-               (really, ICCCM) does not  provide  a  way  for  an
-               OverrideRedirect  window to have its own colormap,
-               short of grabbing the server (which is  neither  a
-               good  idea,  nor  really possible with the current
-               design.)   What  happens  is  that,  as  soon   as
-               xscreensaver  installs  its colormap, t\btw\bwm\bm responds
-               to  the  resultant  C\bCo\bol\blo\bor\brm\bma\bap\bpN\bNo\bot\bti\bif\bfy\by  event  by  re-
-               instaling  the  default colormap.  Apparently, t\btw\bwm\bm
-               doesn't _\ba_\bl_\bw_\ba_\by_\bs do this; it seems to  do  it  regu-
-               larly  if the screensaver is activated from a menu
-               item, but seems to not do it  if  the  screensaver
-               comes on of its own volition, or is activated from
-               another console.
-
-               A\bAt\btt\bte\ben\bnt\bti\bio\bon\bn,\b, w\bwi\bin\bnd\bdo\bow\bw m\bma\ban\bna\bag\bge\ber\br a\bau\but\bth\bho\bor\brs\bs!\b!
-                   You should only  call  X\bXI\bIn\bns\bst\bta\bal\bll\blC\bCo\bol\blo\bor\brm\bma\bap\bp(3)  in
-                   response  to  user  events.   That  is,  it is
-                   appropriate to install a colormap in  response
-                   to   F\bFo\boc\bcu\bus\bsI\bIn\bn,   F\bFo\boc\bcu\bus\bsO\bOu\but\bt,   E\bEn\bnt\bte\ber\brN\bNo\bot\bti\bif\bfy\by,   and
-                   L\bLe\bea\bav\bve\beN\bNo\bot\bti\bif\bfy\by events; but it is not  appropriate
-                   to  call  it  in  response  to  C\bCo\bol\blo\bor\brm\bma\bap\bpN\bNo\bot\bti\bif\bfy\by
-                   events.  If you install colormaps in  response
-                   to  _\ba_\bp_\bp_\bl_\bi_\bc_\ba_\bt_\bi_\bo_\bn actions as well as in response
-                   to _\bu_\bs_\be_\br actions, then you create the situation
-                   where  it  is impossible for override-redirect
-                   applications (such as xscreensaver) to display
-                   their windows in the proper colors.
-
-       C\bCo\bol\blo\bor\brm\bma\bap\bp l\blo\bos\bss\bsa\bag\bge\be:\b: X\bXV\bV,\b, X\bXA\bAn\bni\bim\bm,\b, X\bXE\bEa\bar\brt\bth\bh
-               Some  programs  don't  operate properly on visuals
-               other than the  default  one,  or  with  colormaps
-               other than the default one.  See the discussion of
-               the magic "default-n" visual name in the  descrip-
-               tion of the p\bpr\bro\bog\bgr\bra\bam\bms\bs resource in the _\bC_\bo_\bn_\bf_\bi_\bg_\bu_\br_\ba_\bt_\bi_\bo_\bn
-               section.  When programs only work with the default
-               colormap, you need to use a syntax like this:
-
-                       default-n: xv -root image-1.gif -quit  \n\
-                       default-n: xearth -nostars -wait 0     \n\
-
-               It would also work to turn off the i\bin\bns\bst\bta\bal\bll\blC\bCo\bol\blo\bor\brm\bma\bap\bp
-               option altogether, but that would deny extra  col-
-               ors  to  those programs that _\bc_\ba_\bn take advantage of
-               them.
-
-       M\bMa\bac\bch\bhi\bin\bne\be L\bLo\boa\bad\bd
-               Although this program ``nices''  the  subprocesses
-               that it starts, graphics-intensive subprograms can
-               still overload the machine by causing the X server
-               process  itself (which is not ``niced'') to suck a
-               lot of cycles.  Care should be taken to slow  down
-               programs  intended  for  use  as  screensavers  by
-               inserting strategic calls to s\bsl\ble\bee\bep\bp(3) or u\bus\bsl\ble\bee\bep\bp(3)
-
-
-
-X Version 11             20-Jun-99 (3.15)                      21
-
-
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-               (or making liberal use of any _\b-_\bd_\be_\bl_\ba_\by options which
-               the programs may provide.)
-
-               Note that the OpenGL-based graphics demos are real
-               pigs on machines that don't have texture hardware.
-
-               Also, an active  screensaver  will  cause  your  X
-               server  to  be pretty much permanently swapped in;
-               but the same is true of  any  program  that  draws
-               periodically, like x\bxc\bcl\blo\boc\bck\bk(1) or x\bxl\blo\boa\bad\bd(1).
-
-       L\bLa\bat\bte\ben\bnc\bcy\by a\ban\bnd\bd R\bRe\bes\bsp\bpo\bon\bns\bsi\biv\bve\ben\bne\bes\bss\bs
-               If  the  subprocess is drawing too quickly and the
-               connection to the X server is a slow one (such  as
-               an  X terminal running over a phone line) then the
-               screensaver might not turn off right away when the
-               user  becomes  active  again  (the i\bic\bco\bo(1) demo has
-               this problem if being  run  in  full-speed  mode).
-               This  can  be  alleviated  by  inserting strategic
-               calls to X\bXS\bSy\byn\bnc\bc(3) in code intended for  use  as  a
-               screensaver.   This  prevents  too  much  graphics
-               activity from being buffered up.
-
-       X\bXF\bFr\bre\bee\be8\b86\b6'\b's\bs M\bMa\bag\bgi\bic\bc K\bKe\bey\bys\bst\btr\bro\bok\bke\bes\bs
-               The  XFree86  X   server   traps   certain   magic
-               keystrokes  before  client programs ever see them.
-               Two that are of note are Ctrl+Alt+Backspace, which
-               causes  the  X  server  to  exit; and Ctrl+Alt+F_\bn,
-               which switches virtual  consoles.   The  X  server
-               will  respond to these keystrokes even if xscreen-
-               saver has the screen locked.   Depending  on  your
-               setup, you might consider this a problem.
-
-               Unfortunately,  there  is  no way for xscreensaver
-               itself to override  the  interpretation  of  these
-               keys.   If  you want to disable Ctrl+Alt+Backspace
-               globally, you need to set the _\bD_\bo_\bn_\bt_\bZ_\ba_\bp flag in your
-               _\b/_\be_\bt_\bc_\b/_\bX_\b1_\b1_\b/_\bX_\bF_\b8_\b6_\bC_\bo_\bn_\bf_\bi_\bg  file.   See the X\bXF\bF8\b86\b6C\bCo\bon\bnf\bfi\big\bg(5)
-               manual for details.
-
-               There is no way (as far as I can tell) to  disable
-               the VT-switching keystrokes.
-
-               Some  Linux  systems  come  with  a  VT_LOCKSWITCH
-               ioctl, that one could theoretically use to prevent
-               VT-switching  while  the  screen  is  locked;  but
-               unfortunately, this ioctl  can  only  be  used  by
-               root,  which  means that xscreensaver can't use it
-               (since  xscreensaver   disavows   its   privileges
-               shortly after startup, for security reasons.)
-
-               Any  suggestions for other solutions to this prob-
-               lem are welcome.
-
-
-
-
-X Version 11             20-Jun-99 (3.15)                      22
-
-
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-       X\bXV\bVi\bie\bew\bw C\bCl\bli\bie\ben\bnt\bts\bs
-               Apparently there are some problems with XView pro-
-               grams  getting  confused  and  thinking  that  the
-               screensaver window is the real  root  window  even
-               when the screensaver is not active: ClientMessages
-               intended for the window manager are  sent  to  the
-               screensaver  window instead.  This could be solved
-               by making xscreensaver  forward  all  unrecognised
-               ClientMessages  to the real root window, but there
-               may be other problems as well.  If anyone has  any
-               insight  on  the cause of this problem, please let
-               me know.  (XView is an X11 toolkit that implements
-               the  (quite  abominable)  Sun  OpenLook  look-and-
-               feel.)
-
-       M\bMI\bIT\bT E\bEx\bxt\bte\ben\bns\bsi\bio\bon\bn a\ban\bnd\bd F\bFa\bad\bdi\bin\bng\bg
-               The M\bMI\bIT\bT-\b-S\bSC\bCR\bRE\bEE\bEN\bN-\b-S\bSA\bAV\bVE\bER\bR extension is junk.  Don't use
-               it.
-
-               When  using the M\bMI\bIT\bT-\b-S\bSC\bCR\bRE\bEE\bEN\bN-\b-S\bSA\bAV\bVE\bER\bR extension in con-
-               junction with the f\bfa\bad\bde\be option,  you'll  notice  an
-               unattractive  flicker just before the fade begins.
-               This is because the server  maps  a  black  window
-               just  before  it tells the _\bx_\bs_\bc_\br_\be_\be_\bn_\bs_\ba_\bv_\be_\br process to
-               activate.  The  _\bx_\bs_\bc_\br_\be_\be_\bn_\bs_\ba_\bv_\be_\br  process  immediately
-               unmaps that window, but this results in a flicker.
-               I haven't figured a way  to get  around  this;  it
-               seems  to  be a fundamental property of the (mis-)
-               design of this server extension.
-
-               It sure would be nice if someone  would  implement
-               the  S\bSG\bGI\bI  S\bSC\bCR\bRE\bEE\bEN\bN_\b_S\bSA\bAV\bVE\bER\bR  extension in XFree86; it's
-               dead  simple,  and  works  far  better  than   the
-               overengineered  and broken M\bMI\bIT\bT-\b-S\bSC\bCR\bRE\bEE\bEN\bN-\b-S\bSA\bAV\bVE\bER\bR exten-
-               sion.
-
-       S\bSG\bGI\bI P\bPo\bow\bwe\ber\br S\bSa\bav\bve\ber\br
-               If you're running Irix 6.3, you  might  find  that
-               your monitor is powering down after an hour or two
-               even if you've told it not to.  This is  fixed  by
-               SGI patches 2447 and 2537.
-
-               If  you're  running Irix 6.5, this bug is back.  I
-               don't know a fix.
-
-       M\bMe\bes\bsa\baG\bGL\bL a\ban\bnd\bd V\bVo\boo\bod\bdo\boo\bo C\bCa\bar\brd\bds\bs
-               If you have a 3Dfx/Voodoo card, the  default  set-
-               tings  for  xscreensaver  will  run  the  GL-based
-               graphics demos in such a way that  they  will  not
-               take  advantage  of  the 3D acceleration hardware.
-               The solution is to change the p\bpr\bro\bog\bgr\bra\bam\bms\bs entries for
-
-
-
-
-
-
-X Version 11             20-Jun-99 (3.15)                      23
-
-
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-               the GL hacks from this:
-
-                           gears -root                        \n\
-
-               to this:
-
-                           MESA_GLX_FX=fullscreen  gears      \n\
-
-               That  is,  make  sure  that $\b$M\bME\bES\bSA\bA_\b_G\bGL\bLX\bX_\b_F\bFX\bX is set to
-               _\bf_\bu_\bl_\bl_\bs_\bc_\br_\be_\be_\bn, and don't tell the program to draw  on
-               the  root  window.  This may seem strange, but the
-               setup used by Mesa and these  kinds  of  cards  _\bi_\bs
-               strange!
-
-               For those who don't know, these cards work by sit-
-               ting between your normal video card and the  moni-
-               tor,  and seizing control of the monitor when it's
-               time to do 3D.  But this means that accelerated 3D
-               only  happens in full-screen mode (you can't do it
-               in a window, and you can't see the  output  of  3D
-               and  2D programs simultaniously), and that 3D will
-               probably drive your monitor at a lower resolution,
-               as well.  It's bizarre.
-
-               If  you  find  that GL programs only work properly
-               when run as root, and not as  normal  users,  then
-               the  problem  is  that  your _\b/_\bd_\be_\bv_\b/_\b3_\bd_\bf_\bx file is not
-               configured properly.  Check the Linux 3Dfx FAQ.
-
-       K\bKe\bey\byb\bbo\boa\bar\brd\bd L\bLE\bED\bDs\bs
-               If _\bp_\br_\bo_\bc_\bI_\bn_\bt_\be_\br_\br_\bu_\bp_\bt_\bs is on (which is the  default  on
-               Linux  systems) and you're using some program that
-               toggles the state of your keyboard LEDs,  xscreen-
-               saver  won't  work right: turning those LEDs on or
-               off causes a keyboard  interrupt,  which  xscreen-
-               saver  will  interpret  as  user  activity.  So if
-               you're using such a program,  set  the  _\bp_\br_\bo_\bc_\bI_\bn_\bt_\be_\br_\b-
-               _\br_\bu_\bp_\bt_\bs resource to False.
-
-       E\bEx\bxt\bte\ben\bns\bsi\bio\bon\bns\bs
-               If  you  are  not  making use of one of the server
-               extensions  (X\bXI\bID\bDL\bLE\bE,  S\bSG\bGI\bI  S\bSC\bCR\bRE\bEE\bEN\bN_\b_S\bSA\bAV\bVE\bER\bR,  or   M\bMI\bIT\bT-\b-
-               S\bSC\bCR\bRE\bEE\bEN\bN-\b-S\bSA\bAV\bVE\bER\bR), then it is possible, in rare situa-
-               tions, for _\bx_\bs_\bc_\br_\be_\be_\bn_\bs_\ba_\bv_\be_\br to  interfere  with  event
-               propagation  and  make  another X program malfunc-
-               tion.  For this to occur, that  other  application
-               would  need  to  _\bn_\bo_\bt select K\bKe\bey\byP\bPr\bre\bes\bss\bs events on its
-               non-leaf windows within the first  30  seconds  of
-               their  existence,  but then select for them later.
-               In this case, that client _\bm_\bi_\bg_\bh_\bt  fail  to  receive
-               those  events.  This isn't very likely, since pro-
-               grams generally select a constant  set  of  events
-               immediately  after creating their windows and then
-               don't change them, but this  is  the  reason  that
-
-
-
-X Version 11             20-Jun-99 (3.15)                      24
-
-
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-               it's  a  good  idea  to install and use one of the
-               server extensions instead,  to  work  around  this
-               shortcoming in the X protocol.
-
-               In  all these years, I've not heard of even a sin-
-               gle case of this happening, but  it  is  theoreti-
-               cally possible, so I'm mentioning it for complete-
-               ness...
-
-       R\bRe\bed\bd H\bHo\bot\bt L\bLa\bav\bva\ba
-               There need to be a lot more  graphics  hacks.   In
-               particular,  there  should  be  a  simulation of a
-               Lavalite (tm).
-
-E\bEN\bNV\bVI\bIR\bRO\bON\bNM\bME\bEN\bNT\bT
-       D\bDI\bIS\bSP\bPL\bLA\bAY\bY to get the default host and display number, and to
-               inform  the sub-programs of the screen on which to
-               draw.
-
-       P\bPA\bAT\bTH\bH    to find the sub-programs to run.
-
-       H\bHO\bOM\bME\bE    for the directory in which to read and  write  the
-               _\b._\bx_\bs_\bc_\br_\be_\be_\bn_\bs_\ba_\bv_\be_\br file.
-
-       X\bXE\bEN\bNV\bVI\bIR\bRO\bON\bNM\bME\bEN\bNT\bT
-               to  get the name of a resource file that overrides
-               the global resources stored in  the  RESOURCE_MAN-
-               AGER property.
-
-U\bUP\bPG\bGR\bRA\bAD\bDE\bES\bS
-       The    latest    version    can   always   be   found   at
-       http://www.jwz.org/xscreensaver/
-
-S\bSE\bEE\bE A\bAL\bLS\bSO\bO
-       X\bX(1),    x\bxs\bsc\bcr\bre\bee\ben\bns\bsa\bav\bve\ber\br-\b-d\bde\bem\bmo\bo(1),    x\bxs\bsc\bcr\bre\bee\ben\bns\bsa\bav\bve\ber\br-\b-c\bco\bom\bmm\bma\ban\bnd\bd(1),
-       x\bxd\bdm\bm(1),   x\bxs\bse\bet\bt(1),   X\bXs\bse\bec\bcu\bur\bri\bit\bty\by(1),   x\bxa\bau\but\bth\bh(1),   x\bxh\bho\bos\bst\bt(1).
-       a\ban\bnt\bt(1),    a\bat\btl\bla\ban\bnt\bti\bis\bs(1),    a\bat\btt\btr\bra\bac\bct\bti\bio\bon\bn(1),     b\bbl\bli\bit\bts\bsp\bpi\bin\bn(1),
-       b\bbo\bou\bub\bbo\bou\bul\ble\be(1),  b\bbr\bra\bai\bid\bd(1),  b\bbs\bso\bod\bd(1), b\bbu\bub\bbb\bbl\ble\be3\b3d\bd(1), b\bbu\bub\bbb\bbl\ble\bes\bs(1),
-       c\bca\bag\bge\be(1), c\bco\bom\bmp\bpa\bas\bss\bs(1),  c\bco\bor\bra\bal\bl(1),  c\bcr\bri\bit\bti\bic\bca\bal\bl(1),  c\bcr\bry\bys\bst\bta\bal\bl(1),
-       c\bcy\byn\bno\bos\bsu\bur\bre\be(1), d\bde\bec\bca\bay\bys\bsc\bcr\bre\bee\ben\bn(1), d\bde\bec\bco\bo(1), d\bde\bel\blu\bux\bxe\be(1), d\bde\bem\bmo\bon\bn(1),
-       d\bdi\bis\bsc\bcr\bre\bet\bte\be(1),  d\bdi\bis\bst\bto\bor\brt\bt(1),  d\bdr\bri\bif\bft\bt(1),  e\bep\bpi\bic\bcy\byc\bcl\ble\be(1),   f\bfa\bad\bde\be-\b-
-       p\bpl\blo\bot\bt(1), f\bfl\bla\bag\bg(1), f\bfl\bla\bam\bme\be(1), f\bfl\blo\bow\bw(1), f\bfo\bor\bre\bes\bst\bt(1), g\bga\bal\bla\bax\bxy\by(1),
-       g\bge\bea\bar\brs\bs(1),  g\bgl\blp\bpl\bla\ban\bne\bet\bt(1),  g\bgo\boo\bop\bp(1),  g\bgr\bra\bav\bv(1),  g\bgr\bre\bey\byn\bne\bet\bti\bic\bc(1),
-       h\bha\bal\blo\bo(1),   h\bhe\bel\bli\bix\bx(1),  h\bho\bop\bpa\bal\blo\bon\bng\bg(1),  h\bhy\byp\bpe\ber\brc\bcu\bub\bbe\be(1),  i\bif\bfs\bs(1),
-       i\bim\bms\bsm\bma\bap\bp(1), i\bin\bnt\bte\ber\brf\bfe\ber\bre\ben\bnc\bce\be(1),  j\bji\big\bgs\bsa\baw\bw(1),  j\bju\bul\bli\bia\ba(1),  k\bka\bal\ble\bei\bi-\b-
-       d\bde\bes\bsc\bco\bop\bpe\be(1),  k\bku\bum\bmp\bpp\bpa\ba(1), l\bla\bam\bme\ben\bnt\bt(1), l\bla\bas\bse\ber\br(1), l\bli\big\bgh\bht\btn\bni\bin\bng\bg(1),
-       l\bli\bis\bsa\ba(1),  l\bli\bis\bss\bsi\bie\be(1),  l\blm\bmo\bor\brp\bph\bh(1),  l\blo\boo\bop\bp(1),  m\bma\baz\bze\be(1),  m\bmo\boe\be-\b-
-       b\bbi\biu\bus\bs(1),  m\bmo\boi\bir\bre\be(1),  m\bmo\boi\bir\bre\be2\b2(1),  m\bmo\bor\brp\bph\bh3\b3d\bd(1),  m\bmo\bou\bun\bnt\bta\bai\bin\bn(1),
-       m\bmu\bun\bnc\bch\bh(1), n\bno\bos\bse\beg\bgu\buy\by(1), p\bpe\bed\bda\bal\bl(1), p\bpe\ben\bne\bet\btr\bra\bat\bte\be(1),  p\bpe\ben\bnr\bro\bos\bse\be(1),
-       p\bpe\bet\btr\bri\bi(1),   p\bph\bho\bos\bsp\bph\bho\bor\br(1),   p\bpi\bip\bpe\bes\bs(1),  p\bpu\bul\bls\bsa\bar\br(1),  p\bpy\byr\bro\bo(1),
-       q\bqi\bix\bx(1),  r\brd\bd-\b-b\bbo\bom\bmb\bb(1),  r\bro\boc\bck\bks\bs(1),  r\bro\bor\brs\bsc\bch\bha\bac\bch\bh(1),   r\bro\bot\bto\bor\br(1),
-       r\bru\bub\bbi\bik\bk(1),    s\bsi\bie\ber\brp\bpi\bin\bns\bsk\bki\bi(1),    s\bsl\bli\bid\bde\bes\bsc\bcr\bre\bee\ben\bn(1),    s\bsl\bli\bip\bp(1),
-       s\bso\bon\bna\bar\br(1),  s\bsp\bph\bhe\ber\bre\be(1),  s\bsp\bpi\bir\bra\bal\bl(1),  s\bsp\bpo\bot\btl\bli\big\bgh\bht\bt(1),   s\bsp\bpr\bro\boi\bin\bn-\b-
-       g\bgi\bie\bes\bs(1),  s\bsq\bqu\bui\bir\bra\bal\bl(1),  s\bst\bta\bai\bir\brs\bs(1), s\bst\bta\bar\brf\bfi\bis\bsh\bh(1), s\bst\btr\bra\ban\bng\bge\be(1),
-
-
-
-X Version 11             20-Jun-99 (3.15)                      25
-
-
-
-
-
-XScreenSaver(1)                                   XScreenSaver(1)
-
-
-       s\bsu\bup\bpe\ber\brq\bqu\bua\bad\bdr\bri\bic\bcs\bs(1),    s\bsw\bwi\bir\brl\bl(1),    t\bt3\b3d\bd(1),     t\btr\bri\bia\ban\bng\bgl\ble\be(1),
-       t\btr\bru\buc\bch\bhe\bet\bt(1),   v\bvi\bin\bne\bes\bs(1),   w\bwa\ban\bnd\bde\ber\br(1),  w\bwo\bor\brm\bm(1),  x\bxf\bfl\bla\bam\bme\be(1),
-       x\bxj\bja\bac\bck\bk(1),  x\bxl\bly\bya\bap\bp(1),  x\bxm\bma\bat\btr\bri\bix\bx(1),   x\bxr\bro\bog\bge\ber\br(1),   b\bbo\bon\bng\bgo\bo(1),
-       i\bic\bco\bo(1),   x\bxa\bao\bos\bs(1),   x\bxb\bbo\bou\bun\bnc\bce\beb\bbi\bit\bts\bs(1),  x\bxc\bct\bth\bhu\bug\bgh\bha\ba(1),  x\bxd\bda\bal\bli\bi-\b-
-       c\bcl\blo\boc\bck\bk(1),  x\bxf\bfi\bis\bsh\bht\bta\ban\bnk\bk(1),   x\bxm\bmo\bou\bun\bnt\bta\bai\bin\bns\bs(1),   x\bxs\bsp\bpl\bli\bin\bne\bef\bfu\bun\bn(1),
-       x\bxs\bsw\bwa\bar\brm\bm(1), x\bxt\bta\bac\bcy\by(1), x\bxv\bv(1), x\bxw\bwa\bav\bve\be(1).
-
-C\bCO\bOP\bPY\bYR\bRI\bIG\bGH\bHT\bT
-       Copyright  (C)  1991,  1992, 1993, 1994, 1995, 1996, 1997,
-       1998, 1999 by Jamie Zawinski.  Permission  to  use,  copy,
-       modify,  distribute,  and sell this software and its docu-
-       mentation 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  per-
-       mission  notice  appear  in  supporting documentation.  No
-       representations are made about  the  suitability  of  this
-       software  for any purpose.  It is provided "as is" without
-       express or implied warranty.
-
-A\bAU\bUT\bTH\bHO\bOR\bR
-       Jamie Zawinski <jwz@jwz.org>.  Written in late 1991; first
-       posted to comp.sources.x on 13-Aug-1992.
-
-       Please  let  me  know  if  you  find  any bugs or make any
-       improvements.
-
-A\bAC\bCK\bKN\bNO\bOW\bWL\bLE\bED\bDG\bGE\bEM\bME\bEN\bNT\bTS\bS
-       Thanks to the many people who  have  contributed  graphics
-       demos to the package.
-
-       Thanks to David Wojtowicz for implementing _\bl_\bo_\bc_\bk_\bT_\bi_\bm_\be_\bo_\bu_\bt.
-
-       Thanks  to  Martin  Kraemer  for adding support for shadow
-       passwords and locking-disabled diagnostics.
-
-       Thanks to Patrick Moreau for the VMS port.
-
-       Thanks to Mark Bowyer for figuring out how to hook  it  up
-       to CDE.
-
-       Thanks to Nat Lanza for the Kerberos support.
-
-       Thanks to Bill Nottingham for the initial PAM support.
-
-       And  thanks  to  Jon  A.  Christopher for implementing the
-       Athena dialog support, back in the days before Lesstif  or
-       Gtk were viable alternatives to Motif.
-
-
-
-
-
-
-
-
-
-
-X Version 11             20-Jun-99 (3.15)                      26
-
-
diff --git a/local/man/man.1/attraction.1 b/local/man/man.1/attraction.1
deleted file mode 100644 (file)
index fabdc8a..0000000
+++ /dev/null
@@ -1,178 +0,0 @@
-.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
-..
-.TH XScreenSaver 1 "14-Jun-97" "X Version 11"
-.SH NAME
-attraction - interactions of opposing forces
-.SH SYNOPSIS
-.B attraction
-[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-points \fIint\fP] [\-threshold \fIint\fP] [\-mode balls | lines | polygons | splines | filled-splines | tails ] [\-size \fIint\fP] [\-segments \fIint\fP] [\-delay \fIusecs\fP] [\-color-shift \fIint\fP] [\-radius \fIint\fP] [\-vx \fIint\fP] [\-vy \fIint\fP] [\-glow] [\-noglow] [\-orbit] [\-viscosity \fIfloat\fP] [\-mouse] [\-no-mouse] [\-mouse-size]
-.SH DESCRIPTION
-The \fIattraction\fP program has several visually different modes of 
-operation, all of which are based on the interactions of a set of control
-points which attract each other up to a certain distance, and then begin
-to repel each other.  The attraction/repulsion is proportional to the 
-distance between any two particles.
-.SH OPTIONS
-.I attraction
-accepts the following options:
-.TP 8
-.B \-window
-Draw on a newly-created window.  This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-mono 
-If on a color display, pretend we're on a monochrome display.
-.TP 8
-.B \-install
-Install a private colormap for the window.
-.TP 8
-.B \-visual \fIvisual\fP
-Specify which visual to use.  Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-points integer
-How many control points should be used, or 0 to select the number randomly.
-Default 0.  Between 3 and 15 works best.
-.TP 8
-.B \-threshold integer
-The distance (in pixels) from each particle at which the attractive force
-becomes repulsive.  Default 100.
-.TP 8
-.B \-mode "balls | lines | polygons | tails | splines | filled-splines"
-In \fIballs\fP mode (the default) the control points are drawn as filled
-circles.  The larger the circle, the more massive the particle.
-
-In \fIlines\fP mode, the control points are connected by straight lines;
-the effect is something like \fIqix\fP.
-
-In \fIpolygons\fP mode, the control points are connected by straight
-lines, and filled in.  This is most interesting in color.
-
-In \fIsplines\fP mode, a closed spline is interpolated from the control 
-points.
-
-In \fIfilled-splines\fP mode, the splines are filled in instead of being
-outlines.  This is most interesting in color.
-
-In \fItails\fP mode, the path which each particle follows is indicated
-by a worm-like trail, whose length is controlled by the \fIsegments\fP
-parameter.
-.TP 8
-.B \-size integer
-The size of the balls in pixels, or 0, meaning to select the sizes 
-randomly (the default.)  If this is specified, then all balls will be 
-the same size.  This option has an effect in all modes, since the ``size''
-of the balls controls their mass.
-.TP 8
-.B \-segments integer
-If in \fIlines\fP or \fIpolygons\fP mode, how many sets of line segments
-or polygons should be drawn. Default 100.  This has no effect in \fIballs\fP
-mode.  If \fIsegments\fP is 0, then no segments will ever be erased (this
-is only useful in color.)
-.TP 8
-.B \-delay microseconds
-How much of a delay should be introduced between steps of the animation.
-Default 10000, or about 0.01 seconds.
-.TP 8
-.B \-color-shift int
-If on a color display, the color of the line segments or polygons will 
-cycle through the color map.  This specifies how many lines will be drawn
-before a new color is chosen.  (When a small number of colors are available,
-increasing this value will yield smoother transitions.)  Default 3.
-This has no effect in \fIballs\fP mode.
-.TP 8
-.B \-radius
-The size in pixels of the circle on which the points are initially positioned.
-The default is slightly smaller than the size of the window.
-.TP 8
-.B \-glow
-This is consulted only in \fIballs\fP mode.  If this is specified, then 
-the saturation of the colors of the points will vary according to their
-current acceleration.  This has the effect that the balls flare brighter
-when they are reacting to each other most strongly.
-
-In \fIglow\fP mode, all of the balls will be drawn the same (random)
-color, modulo the saturation shifts.  In non-glow mode, the balls will
-each be drawn in a random color that doesn't change.
-.TP 8
-.B \-noglow
-Don't do ``glowing.''  This is the default.
-.TP 8
-.B \-vx pixels
-.TP 8
-.B \-vy pixels
-Initial velocity of the balls.  This has no effect in \fB\-orbit\fP mode.
-.TP 8
-.B \-orbit
-Make the initial force on each ball be tangential to the circle on which
-they are initially placed, with the right velocity to hold them in orbit
-about each other.  After a while, roundoff errors will cause the orbit
-to decay.
-.TP 8
-.B \-vmult float
-In orbit mode, the initial velocity of the balls is multiplied by this;
-a number less than 1 will make the balls pull closer together, and a larger
-number will make them move apart.  The default is 0.9, meaning a slight
-inward pull.
-.TP 8
-.B \-viscosity float
-This sets the viscosity of the hypothetical fluid through which the control
-points move; the default is 1, meaning no resistance.  Values higher than 1
-aren't interesting; lower values cause less motion.
-
-One interesting thing to try is
-.EX
-attraction -viscosity 0.8 -points 75 \\
-  -mouse -geometry =500x500
-.EE
-Give it a few seconds to settle down into a stable clump, and then move
-the mouse through it to make "waves".
-.TP 8
-.B \-mouse
-This will cause the mouse to be considered a control point; it will not be
-drawn, but it will influence the other points, so you can wave the mouse
-and influence the images being created.
-.TP 8
-.B \-no-mouse
-Turns off \fB\-mouse\fP.
-.TP 8
-.B \-mouse-size integer
-In \fB\-mouse\fP mode, this sets the mass of the mouse (analagously to the
-\fB\-size\fP parameter.)
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1)
-.SH COPYRIGHT
-Copyright \(co 1992, 1993, 1997 by Jamie Zawinski.  Permission to use, copy,
-modify, distribute, and sell this software 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.  No representations are
-made about the suitability of this software for any purpose.  It is provided
-"as is" without express or implied warranty.
-.SH AUTHOR
-Jamie Zawinski <jwz@jwz.org>, 13-aug-92.
-
-Viscosity and mouse support by Philip Edward Cutone, III.
diff --git a/local/man/man.1/blitspin.1 b/local/man/man.1/blitspin.1
deleted file mode 100644 (file)
index f374666..0000000
+++ /dev/null
@@ -1,106 +0,0 @@
-.TH XScreenSaver 1 "24-Nov-97" "X Version 11"
-.SH NAME
-blitspin - rotate a bitmap in an interesting way
-.SH SYNOPSIS
-.B blitspin
-[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-bitmap \fIfilename\fP] [\-delay \fIusecs\fP] [\-delay2 \fIusecs\fP]
-.SH DESCRIPTION
-The \fIblitspin\fP program repeatedly rotates a bitmap by 90 degrees by
-using logical operations: the bitmap is divided into quadrants, and the
-quadrants are shifted clockwise.  Then the same thing is done again with
-progressively smaller quadrants, except that all sub-quadrants of a 
-given size are rotated in parallel.  So this takes \fBO(16*log2(N))\fP 
-blits of size NxN, with the limitation that the image must be square,
-and the size must be a power of 2.
-.SH OPTIONS
-.I blitspin
-accepts the following options:
-.TP 8
-.B \-window
-Draw on a newly-created window.  This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-mono 
-If on a color display, pretend we're on a monochrome display.
-.TP 8
-.B \-install
-Install a private colormap for the window.
-.TP 8
-.B \-visual \fIvisual\fP
-Specify which visual to use.  Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-bitmap \fIfilename\fP
-The file name of a bitmap to rotate.  It need not be square: it 
-will be padded with the background color.  If unspecified or the
-string \fI(default)\fP, a builtin bitmap is used.
-
-If support for the \fIXPM\fP library was enabled at compile-time, 
-the specified file may be in \fIXPM\fP format as well as \fIXBM\fP, and 
-thus may be a color image.
-
-The \fB*bitmapFilePath\fP resource will be searched if the bitmap
-name is not a fully-qualified pathname.
-.TP 8
-.B \-grab\-screen
-If this option is specified, then the image which is spun will be grabbed
-from the portion of the screen underlying the blitspin window.  (Or, it
-may come from an external video source: see below.)
-.PP
-.TP 8
-.B \-delay \fImicroseconds\fP
-How long to delay between steps of the rotation process, in microseconds.
-Default is 500000, one-half second.
-.PP
-.TP 8
-.B \-delay2 \fImicroseconds\fP
-How long to delay between each 90-degree rotation, in microseconds.
-Default is 500000, one-half second.
-.B DISPLAY
-to get the default host and display number.
-.SH RESOURCES
-On some systems (currently, only SGIs), this program can, instead of grabbing
-a desktop image, grab a frame of video from an external camera and manipulate
-that instead.  The following resources control that.
-.PP
-.TP 8
-.B grabVideoProbability \fR(Float)\fP
-What portion of the time to grab video rather than a screen image, 
-between 0.0 and 1.0.  Defaults to 0.5, or half the time.
-.TP 8
-.B videoDevice \fR(Integer)\fP
-The number of the default video input device to check first.  If unspecified, 
-the default camera (from videopanel(1)) will be checked first.  After that, all
-other available video input devices will be checked in order.  
-
-The first one which produces a non-black image will be used.  If all images
-are black, the others will be re-checked a few times before giving up and
-falling back to simply grabbing a desktop image (but note that this takes a
-few seconds, so if you don't actually have any video sources hooked up, you
-should consider turning off video grabbing by setting
-\fBgrabVideoProbability\fP to 0.0.)
-.TP 8
-.B videoGain \fR(Float)\fP
-The amount by which to brighten the grabbed image.  This defaults to 2.2.
-.SH ENVIRONMENT
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1)
-.SH COPYRIGHT
-Copyright \(co 1992, 1993, 1997 by Jamie Zawinski.
-Permission to use, copy, modify, distribute, and sell this software 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.  No
-representations are made about the suitability of this software for any
-purpose.  It is provided "as is" without express or implied warranty.
-.SH AUTHOR
-Jamie Zawinski <jwz@jwz.org>, 17-aug-92.
-
-Based on SmallTalk code which appeared in the August 1981 issue of Byte
-magazine.
diff --git a/local/man/man.1/bouboule.1 b/local/man/man.1/bouboule.1
deleted file mode 100644 (file)
index b2a8df2..0000000
+++ /dev/null
@@ -1,76 +0,0 @@
-.TH XScreenSaver 1 "15-May-97" "X Version 11"
-.SH NAME
-bouboule - draws spinning 3D blobs
-.SH SYNOPSIS
-.B bouboule
-[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-ncolors \fIinteger\fP] [\-delay \fImicroseconds\fP] [\-cycles \fIinteger\fP] [\-count \fIinteger\fP] [\-3d]
-
-.SH DESCRIPTION
-The \fIbouboule\fP program draws spinning 3D blobs.
-.SH OPTIONS
-.I bouboule
-accepts the following options:
-.TP 8
-.B \-window
-Draw on a newly-created window.  This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-mono 
-If on a color display, pretend we're on a monochrome display.
-.TP 8
-.B \-install
-Install a private colormap for the window.
-.TP 8
-.B \-visual \fIvisual\fP
-Specify which visual to use.  Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-ncolors \fIinteger\fP
-How many colors should be used (if possible).  Default 64.
-The colors used cycle through the hue, making N stops around
-the color wheel.
-.TP 8
-.B \-cycles \fIinteger\fP
-
-.TP 8
-.B \-count \fIinteger\fP
-
-.TP 8
-.B \-3d
-Do red/blue 3d separations (for 3d glasses.)
-
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1),
-.BR xlock (1)
-.SH COPYRIGHT
-Copyright \(co 1996 by Jeremie Petit.
-
-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. 
-
-.SH AUTHOR
-Jeremie Petit <jpetit@essi.fr>, 1996.
-
-3D support by Henrik Theiling <theiling@coli-uni-sb.de>, 04-Sep-96.
-
-VMS support by Jouk Jansen <joukj@alpha.chem.uva.nl>, 01-Feb-96.
-
-TrueColor support by David Bagley <bagleyd@bigfoot.com>, 01-Feb-96.
-
-Ability to run standalone or with \fIxscreensaver\fP added by 
-Jamie Zawinski <jwz@jwz.org>, 15-May-97.
diff --git a/local/man/man.1/braid.1 b/local/man/man.1/braid.1
deleted file mode 100644 (file)
index 65637af..0000000
+++ /dev/null
@@ -1,65 +0,0 @@
-.TH XScreenSaver 1 "10-May-97" "X Version 11"
-.SH NAME
-braid - draws random color-cycling braids around a circle
-.SH SYNOPSIS
-.B braid
-[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-ncolors \fIinteger\fP] [\-delay \fImicroseconds\fP] [\-cycles \fIinteger\fP] [\-count \fIinteger\fP]
-
-.SH DESCRIPTION
-The \fIbraid\fP program draws random color-cycling braids around a circle.
-.SH OPTIONS
-.I braid
-accepts the following options:
-.TP 8
-.B \-window
-Draw on a newly-created window.  This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-mono 
-If on a color display, pretend we're on a monochrome display.
-.TP 8
-.B \-install
-Install a private colormap for the window.
-.TP 8
-.B \-visual \fIvisual\fP
-Specify which visual to use.  Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-ncolors \fIinteger\fP
-How many colors should be used (if possible).  Default 64.
-The colors used cycle through the hue, making N stops around
-the color wheel.
-.TP 8
-.B \-cycles \fIinteger\fP
-
-.TP 8
-.B \-count \fIinteger\fP
-
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1),
-.BR xlock (1)
-.SH COPYRIGHT
-Copyright \(co 1995 by John Neil.
-
-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. 
-.SH AUTHOR
-John Neil <neil@math.idbsu.edu>, 29-Aug-95.
-
-Ability to run standalone or with \fIxscreensaver\fP added by 
-Jamie Zawinski <jwz@jwz.org>, 10-May-97.
diff --git a/local/man/man.1/bsod.1 b/local/man/man.1/bsod.1
deleted file mode 100644 (file)
index 63bcee6..0000000
+++ /dev/null
@@ -1,126 +0,0 @@
-.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
-..
-.TH XScreenSaver 1 "28-Oct-98" "X Version 11"
-.SH NAME
-bsod - Blue Screen of Death emulator
-.SH SYNOPSIS
-.B bsod
-[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP]
-[\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install]
-[\-visual \fIvisual\fP] [\-delay \fIseconds\fP]
-.SH DESCRIPTION
-The
-.I bsod
-program is the finest in personal computer emulation.  
-.PP
-.I bsod
-steps through a set of screens, each one a recreation of a different failure
-mode of an operating system.  Systems depicted include Microsoft's Windows 95
-and Windows NT, Commodore-Amiga's AmigaDOS 1.3, SPARC Linux, SCO UNIX, the
-Apple Macintosh (both the MacsBug debugger and the rarer "Sad Mac"), and the
-Atari ST.
-.PP
-.SH OPTIONS
-.I bsod
-accepts the following options:
-.TP 8
-.B \-window
-Draw on a newly-created window.  This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-mono 
-If on a color display, pretend we're on a monochrome display.
-.TP 8
-.B \-install
-Install a private colormap for the window.
-.TP 8
-.B \-visual \fIvisual\fP
-Specify which visual to use.  Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-delay \fIdelay\fP
-The delay between displaying one crash and another.
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH X RESOURCES
-Notable X resources supported include the following, which control which
-hacks are displayed and which aren't.
-.BR doWindows ,
-.BR doNT ,
-.BR doAmiga ,
-.BR doMac ,
-.BR doMacsBug ,
-.BR doSCO ,
-.BR doAtari ,
-and
-.BR doSparcLinux .
-Each of these is a Boolean resource, they all default to true, except for
-doSparcLinux and doAtari, which are turned off by default, because they're
-really not all that interesting looking unless you're a fan of those systems.
-There aren't command-line options for these, so to change them, you'll need
-to add entries to your .Xdefaults file, or use the -xrm option.
-For example, to tell bsod not to show the NT crash:
-.EX
-bsod -xrm '*doNT: false'
-.EE
-.SH BUGS
-Unlike the systems that the images are borrowed from,
-.I bsod
-does not require a reboot after running.
-.PP
-.I bsod
-should also emulate more systems, but systems with interesting crash
-graphics are not as common as one might hope.
-
-One I'd really like to see is a Unix system getting a kernel panic, 
-rebooting, and running
-.BR fsck (8).
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1),
-.BR http://www.microsoft.com/ ,
-.BR http://www.apple.com/ ,
-and
-.BR http://www.sco.com/ ,
-.BR http://www.kernel.org/ ,
-and
-.BR http://www.amiga.de/ .
-.SH TRADEMARKS
-Microsoft Windows, Microsoft Windows 95, and Microsoft Windows NT are all
-registered trademarks of Microsoft Corporation.  Apple Macintosh is a
-registered trademark of Apple Computer.  Amiga is a registered trademark of
-Amiga International, Inc.  Atari ST is probably a trademark, too, but it's
-hard to tell who owns it. Linux is a registered trademark of Linus Torvalds,
-but it isn't his fault.
-.SH COPYRIGHT
-Copyright \(co 1998 by Jamie Zawinski.  Permission to use, copy, modify, 
-distribute, and sell this software 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.  No representations are made about the 
-suitability of this software for any purpose.  It is provided "as is" without
-express or implied warranty.  No animals were harmed during the testing of
-these simulations.  Always mount a scratch monkey.
-.SH AUTHOR
-Concept cribbed from Stephen Martin <smartin@mks.com>.  This version is by
-Jamie Zawinski <jwz@jwz.org>.
diff --git a/local/man/man.1/bubbles.1 b/local/man/man.1/bubbles.1
deleted file mode 100644 (file)
index c9016e6..0000000
+++ /dev/null
@@ -1,142 +0,0 @@
-.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
-..
-.TH XScreenSaver 1 "14-Dec-95" "X Version 11"
-.SH NAME
-bubbles - frying pan / soft drink simulation
-.SH SYNOPSIS
-.B bubbles
-[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-simple] [\-broken] [\-3D] [\-file filename] [\-directory directoryname]
-.SH DESCRIPTION
-\fIBubbles\fP sprays lots of little random bubbles all over the window which
-then grow until they reach their maximum size and go pop.  The inspiration
-for this was watching little globules of oil on the bottom of a frying pan
-and it also looks a little like bubbles in fizzy soft drink.  The default
-mode uses fancy ray-traced bubbles but there is also a mode which just draws 
-circles in case the default mode is too taxing on your hardware.
-.SH OPTIONS
-Depending on how your
-.I bubbles
-was compiled, it accepts the following options:
-.TP 8
-.B \-foreground
-Colour of circles if \fI\-simple\fP mode is selected.
-.TP 8
-.B \-background
-Colour of window background.
-.TP 8
-.B \-window
-Draw on a newly-created window.  This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-mono 
-If on a color display, pretend we're on a monochrome display.
-.TP 8
-.B \-install
-Install a private colormap for the window.
-.TP 8
-.B \-visual \fIvisual\fP
-Specify which visual to use.  Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-delay microseconds
-How much of a delay should be introduced between steps of the animation.
-Default 1, or about 1 microsecond.  Actually, this is the delay between each
-group of 15 new bubbles since such a delay between each step results in a
-very slow animation rate.
-.TP 8
-.B \-nodelay
-Same as \fI\-delay 0\fP.
-.TP 8
-.B \-simple
-Don't use the default fancy pixmap bubbles.  Just draw circles instead.
-This may give more bearable performance if your hardware wasn't made for
-this sort of thing.
-.TP 8
-.B \-broken
-Don't hide bubbles when they pop.  This was a bug during development
-but the results were actually quite attractive.  (This option is only
-available if you have the XPM library available and the imake generated
-Makefile has defined HAVE_XPM).
-.TP 8
-.B \-3D
-Normally, the simulation is done completely in two dimensions.  When a
-bubble swallows up another bubble, the areas of each are added to get
-the area of the resulting bubble.  This option changes the algorithm
-to instead add volume (imagining each to be a sphere in 3D space).  The
-whole thing looks more realistic but I find it attracts attention to
-the flickering of each bubble as they are move and are redrawn.  Your
-mileage may vary.
-.TP 8
-.B \-file filename
-Use the pixmap definitions in the given file, instead of the default (if
-one is compiled in).  This is ignored if \fI\-simple\fP is specified.  If
-the file is compressed (either with compress or gzip), it is decompressed
-before use.  (This option only works if you have XPM compiled into your
-binary and you have compiled with BUBBLES_IO set in bubbles.h.  This is
-\fBnot\fP the default).
-.TP 8
-.B \-directory directoryname
-Similar to \fI-file\fP except the file is taken randomly from the
-contents of the specified directory.  (Again, this option is only available
-if you have XPM and BUBBLES_IO was set when compiling.  See above).
-.TP 8
-.B \-quiet
-Don't print messages explaining why one or several command line options
-were ignored.  This is disabled by default.
-.SH NOTES
-If you find the pace of things too slow, remember that there is a delay
-even though you specify no \fI\-delay\fP option.  Try using \fI\-nodelay\fP
-although beware of the effects of irritation of other users if you're on a 
-shared system as you bleed their CPU time away.
-
-Some tools to assist in creation of new bubbles are included in the source
-distribution.  These can either be loaded with the \fI\-file\fP or
-\fI\-directory\fP options (if available) or they can be used in place
-of the distributed default bubble (bubble_default.c).
-You might like to copy these scripts to a permanent location and
-use them.  Read bubbles.README.
-
-Rendered bubbles are not supported on monochrome displays.  I'm not
-convinced that small bubbles, even dithered properly are going to look
-like anything more than a jumble of random dots.
-.SH BUGS
-There is a delay before something appears on the screen when using
-rendered bubbles.  The XPM library seems to take a \fBlong\fP time to make
-pixmaps out of raw data.  This can be irritating on slower systems.
-
-The movement of the bubbles looks jerky if an incomplete set of bubbles
-is used.  
-
-The hide/display algorithm could do with some work to avoid flickering
-when \fI\-nodelay\fP is set.
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1)
-.SH DISTRIBUTION POLICY
-This work is Copyright \(co 1995, 1996 by James Macnicol.  Distribution is
-allowed under the terms of the GNU General Public License.  Look at the
-sources for the legalese.
-.SH AUTHOR
-James Macnicol <J.Macnicol@student.anu.edu.au>.  
diff --git a/local/man/man.1/critical.1 b/local/man/man.1/critical.1
deleted file mode 100644 (file)
index 21eec6a..0000000
+++ /dev/null
@@ -1,87 +0,0 @@
-.TH XScreenSaver 1 "13-Nov-98" "X Version 11"
-.SH NAME
-critical - Draw a system showing self-organizing criticality
-.SH SYNOPSIS
-.B critical
-[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-delay \fIseconds\fP] [\-random \fIboolean\fP] [\-ncolors \fIint\fP] [\-offset \fIint\fP] 
-.SH DESCRIPTION
-The \fIcritical\fP program displays a self-organizing critical system
-that gradually emerges from chaos.
-
-\fIcritical\fP performs a simulation on a two-dimensional array of
-integers.  The array is initialized to random values.  On each
-iteration, it draws a line to the array position with the greatest
-value.  It then replaces that location and the eight neighboring
-locations with randomly-selected values.
-
-The lines are initially random, but over time a chaotic
-self-organizing system evolves: areas of the screen which happen to
-have lower values are less likely to be updated to new values, and so
-the line tends to avoid those areas.  Eventually, the histogram of
-changes approaches the power-law curve typical of such systems.
-
-The simplest documented self-organizing system is the one-dimensional
-equivalent of \fIcritical\fP.
-
-I heard about this algorithm second-hand: apparently there was an
-article in \fIScientific American\fP describing it sometime in 1997.
-.SH OPTIONS
-.I critical
-accepts the following options:
-.TP 8
-.B \-window
-Draw on a newly-created window.  This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-mono 
-If on a color display, pretend we're on a monochrome display.
-.TP 8
-.B \-install
-Install a private colormap for the window.
-.TP 8
-.B \-visual \fIvisual\fP
-Specify which visual to use.  Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-delay \fIusecs\fP
-Number of microseconds to wait after drawing each line.
-.TP 8
-.B \-random \fIboolean\fP
-Whether to use randomly selected colours rather than a cycle around
-the colour wheel.
-.TP 8
-.B \-offset \fIinteger\fP
-The maximum random radius increment to use.
-.TP 8
-.B \-ncolors \fIinteger\fP
-How many colors should be allocated in the color ramp (note that this
-value interacts with \fIoffset\fP.)
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1)
-.BR xscreensaver-command (1)
-.BR xscreensaver-demo (1)
-.SH COPYRIGHT
-Copyright \(co 1998 by Martin Pool.
-
-Permission to use, copy, modify, distribute, and sell this software
-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.  No representations are made about the
-suitability of this software for any purpose.  It is provided "as is"
-without express or implied warranty.
-.SH AUTHOR
-Martin Pool <mbp@humbug.org.au>, 13-Nov-1998.  Based in part on the
-XScreenSaver code by Jamie Zawinski <jwz@jwz.org>.
diff --git a/local/man/man.1/decayscreen.1 b/local/man/man.1/decayscreen.1
deleted file mode 100644 (file)
index 8dc0a0e..0000000
+++ /dev/null
@@ -1,88 +0,0 @@
-.TH XScreenSaver 1 "05-Apr-1999" "X Version 11"
-.SH NAME
-decayscreen - make a screen meltdown.
-.SH SYNOPSIS
-.B decayscreen
-[\-display \fIhost:display.screen\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-delay \fIusecs\fP] [\-mode \fImode\fP]
-.SH DESCRIPTION
-The \fIdecayscreen\fP program creates a melting effect by randomly
-shifting rectangles around the screen.
-.SH OPTIONS
-.I decayscreen
-accepts the following options:
-.TP 8
-.B \-window
-Draw on a newly-created window.  This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-mono 
-If on a color display, pretend we're on a monochrome display.
-.TP 8
-.B \-install
-Install a private colormap for the window.
-.TP 8
-.B \-visual \fIvisual\fP
-Specify which visual to use.  Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-delay \fImicroseconds\fP
-Slow it down.
-.TP 8
-.B \-mode \fImode\fP
-The direction in which the image should tend to slide.  Legal values are
-\fIrandom\fP (meaning pick one), \fIup\fP, \fIleft\fP, \fIright\fP, 
-\fIdown\fP, \fIupleft\fP, \fIdownleft\fP, \fIupright\fP, \fIdownright\fP, 
-\fIshuffle\fP (meaning perfer no particular direction), \fIin\fP (meaning
-move things toward the center), \fIout\fP (meaning move things away
-from the center), \fImelt\fP (meaning melt straight downward), and \fIstretch\fP 
-(meaning stretch the screen downward).
-.SH RESOURCES
-On some systems (currently, only SGIs), this program can, instead of grabbing
-a desktop image, grab a frame of video from an external camera and manipulate
-that instead.  The following resources control that.
-.PP
-.TP 8
-.B grabVideoProbability \fR(Float)\fP
-What portion of the time to grab video rather than a screen image, 
-between 0.0 and 1.0.  Defaults to 0.5, or half the time.
-.TP 8
-.B videoDevice \fR(Integer)\fP
-The number of the default video input device to check first.  If unspecified, 
-the default camera (from videopanel(1)) will be checked first.  After that, all
-other available video input devices will be checked in order.  
-
-The first one which produces a non-black image will be used.  If all images
-are black, the others will be re-checked a few times before giving up and
-falling back to simply grabbing a desktop image (but note that this takes a
-few seconds, so if you don't actually have any video sources hooked up, you
-should consider turning off video grabbing by setting
-\fBgrabVideoProbability\fP to 0.0.)
-.TP 8
-.B videoGain \fR(Float)\fP
-The amount by which to brighten the grabbed image.  This defaults to 2.2.
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH "SEE ALSO"
-X(1),
-xscreensaver(1)
-.SH COPYRIGHT
-Copyright 1992 by Vivek Khera.  Permission to use, copy, modify, distribute, 
-and sell this software 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.  No representations are made about the suitability
-of this software for any purpose.  It is provided "as is" without express or
-implied warranty.
-.SH AUTHOR
-Vivek Khera <khera@cs.duke.edu>, 05-Aug-93; based on code by David Wald, 1988.
-Modified by jwz, 28-Nov-97.  Modified by Rick Schultz <rick@skapunx.net> 05-Apr-1999.
-
diff --git a/local/man/man.1/deco.1 b/local/man/man.1/deco.1
deleted file mode 100644 (file)
index 5f8a6fc..0000000
+++ /dev/null
@@ -1,72 +0,0 @@
-.TH XScreenSaver 1 "27-Apr-97" "X Version 11"
-.SH NAME
-deco - draw tacky 70s basement wall panelling
-.SH SYNOPSIS
-.B deco
-[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-delay \fIseconds\fP] [\-max\-depth \fIint\fP] [\-min\-width \fIint\fP] [\-min\-height \fIint\fP] [\-cycle] [\-no\-cycle] [\-cycle\-delay]
-.SH DESCRIPTION
-The \fIdeco\fP program subdivides and colors rectangles randomly.
-It looks kind of like Brady-Bunch-era rec-room wall paneling.
-(Raven says: "this screensaver is ugly enough to peel paint.")
-.SH OPTIONS
-.I deco
-accepts the following options:
-.TP 8
-.B \-window
-Draw on a newly-created window.  This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-mono 
-If on a color display, pretend we're on a monochrome display.
-.TP 8
-.B \-install
-Install a private colormap for the window.
-.TP 8
-.B \-visual \fIvisual\fP
-Specify which visual to use.  Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-delay \fIseconds\fP
-How long to wait before starting over.  Default 5 seconds.
-.TP 8
-.B \-max\-depth \fIinteger\fP
-How deep to subdivide.  Default 12.
-Default 8.
-.TP 8
-.B \-min-width \fIinteger\fP
-.B \-min-height \fIinteger\fP
-The size of the smallest rectangle to draw.  Default 20x20.
-.TP 8
-.B \-cycle
-.TP 8
-.B \-no\-cycle
-Whether to do color cycling.  Default False.
-.TP 8
-.B \-cycle\-delay \fIusecs\fP
-If color cycling, how often to change the colors.  Default 1000000,
-or 1 second.
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1)
-.SH COPYRIGHT
-Copyright \(co 1997 by Jamie Zawinski.  Permission to use, copy, modify, 
-distribute, and sell this software 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.  No representations are made about the 
-suitability of this software for any purpose.  It is provided "as is" without
-express or implied warranty.
-.SH AUTHOR
-Jamie Zawinski <jwz@jwz.org>, 26-Apr-97, based on code by
-Michael D. Bayne <mdb@go2net.com>.
diff --git a/local/man/man.1/drift.1 b/local/man/man.1/drift.1
deleted file mode 100644 (file)
index 407f06a..0000000
+++ /dev/null
@@ -1,75 +0,0 @@
-.TH XScreenSaver 1 "10-May-97" "X Version 11"
-.SH NAME
-drift - draws drifting recursive fractal cosmic flames
-.SH SYNOPSIS
-.B drift
-[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-ncolors \fIinteger\fP] [\-delay \fImicroseconds\fP] [\-count \fIinteger\fP] [\-grow] [\-no\-grow] [\-liss] [\-no\-liss]
-
-.SH DESCRIPTION
-The \fIdrift\fP program draws drifting recursive fractal cosmic flames
-.SH OPTIONS
-.I drift
-accepts the following options:
-.TP 8
-.B \-window
-Draw on a newly-created window.  This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-mono 
-If on a color display, pretend we're on a monochrome display.
-.TP 8
-.B \-install
-Install a private colormap for the window.
-.TP 8
-.B \-visual \fIvisual\fP
-Specify which visual to use.  Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-ncolors \fIinteger\fP
-How many colors should be used (if possible).  Default 200.
-The colors used cycle through the hue, making N stops around
-the color wheel.
-.TP 8
-.B \-count \fIinteger\fP
-
-.TP 8
-.B \-grow
-.TP 8
-.B \-no\-grow
-Whether fractals should grow; otherwise, they are animated.
-
-.TP 8
-.B \-liss
-.TP 8
-.B \-no\-liss
-Whether we should use lissojous figures to get points.
-
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR flame (1),
-.BR X (1),
-.BR xscreensaver (1),
-.BR xlock (1)
-.SH COPYRIGHT
-Copyright \(co 1991, 1995 by Scott Draves.
-
-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. 
-.SH AUTHOR
-Scott Draves <spot@cs.cmu.edu>, 06-Jun-91, 01-Jun-95.
-
-Ability to run standalone or with \fIxscreensaver\fP added by 
-Jamie Zawinski <jwz@jwz.org>, 10-May-97.
diff --git a/local/man/man.1/epicycle.1 b/local/man/man.1/epicycle.1
deleted file mode 100644 (file)
index 3af0ed5..0000000
+++ /dev/null
@@ -1,200 +0,0 @@
-.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
-..
-.TH XScreenSaver 1 "27-Apr-97" "X Version 11"
-.SH NAME
-epicycle - draws a point moving around a circle which moves around a cicle which...
-.SH SYNOPSIS
-.B epicycle 
-[\-display \fIhost:display.screen\fP] [\-root] [\-window] [\-mono] [\-install] [\-noinstall] [\-visual \fIviz\fP] [\-colors \fIN\fP] [\-foreground \fIname\fP] [\-color\-shift \fIN\fP] [\-delay \fImicroseconds\fP] [\-holdtime \fIseconds\fP] [\-linewidth \fIN\fP] [\-min_circles \fIN\fP] [\-max_circles \fIN\fP] [\-min_speed \fInumber\fP] [\-max_speed \fInumber\fP] [\-harmonics \fIN\fP] [\-timestep \fInumber\fP] [\-divisor_poisson \fIprobability\fP] [\-size_factor_min \fInumber\fP] [\-size_factor_max \fInumber\fP]
-.SH DESCRIPTION
-The epicycle program draws the path traced out by a point on the edge
-of a circle.  That circle rotates around a point on the rim of another
-circle, and so on, several times.  The random curves produced can be
-simple or complex, convex or concave, but they are always closed
-curves (they never go in indefinitely).
-
-You can configure both the way the curves are drawn and the way in
-which the random sequence of circles is generated, either with
-command-line options or X resources.
-.SH OPTIONS
-.TP 8
-.B \-display \fIhost:display.screen\fP
-Specifies which X display we should use (see the section DISPLAY NAMES in
-.BR X (1)
-for more information about this option).
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-window
-Draw on a newly-created window.  This is the default.
-.TP 8
-.B \-mono
-If on a color display, pretend we're on a monochrome display.
-If we're on a mono display, we have no choice.
-.TP 8
-.B \-install
-Install a private colormap for the window.
-.TP 8
-.B \-noinstall
-Don't install a private colormap for the window.
-.TP 8
-.B \-visual \fIviz\fP
-Specify which visual to use.  Legal values are the name of a visual
-class, or the id number (decimal or hex) of a specific visual.
-Possible choices include
-
-.RS
-default, best, mono, monochrome, gray, grey, color, staticgray, staticcolor, 
-truecolor, grayscale, greyscale, pseudocolor, directcolor, \fInumber\fP
-
-If a decimal or hexadecimal number is used, 
-.BR XGetVisualInfo (3X)
-is consulted to obtain the required visual.
-.RE
-.TP 8
-.B \-colors \fIN\fP
-How many colors should be used (if possible).  The colors are chosen
-randomly.
-.TP 8
-.B \-foreground \fIname\fP
-With 
-.BR \-mono ,
-this option selects the foreground colour.   
-.TP 8
-.B \-delay \fImicroseconds\fP
-Specifies the delay between drawing successive line segments of the
-path.   If you do not specify 
-.BR -sync ,
-some X servers may batch up several drawing operations together,
-producing a less smooth effect.   This is more likely to happen 
-in monochrome mode (on monochrome servers or when 
-.B \-mono 
-is specified).
-.TP 8
-.B \-holdtime \fIseconds\fP
-When the figure is complete, 
-.I epicycle
-pauses this number of seconds.
-.TP 8
-.B \-linewidth \fIN\fP
-Width in pixels of the body's track.   Specifying values greater than
-one may cause slower drawing.   The fastest value is usually zero,
-meaning one pixel.   
-.TP 8
-.B \-min_circles \fIN\fP
-Smallest number of epicycles in the figure.
-.TP 8
-.B \-max_circles \fIN\fP
-Largest number of epicycles in the figure.
-.TP 8
-.B \-min_speed \fInumber\fP
-Smallest possible value for the base speed of revolution of the
-epicycles.  The actual speeds of the epicycles vary from this down
-to
-.IB "min_speed / harmonics" .
-.TP 8
-.B \-max_speed \fInumber\fP
-Smallest possible value for the base speed of revolution of the 
-epicycles.
-.TP 8
-.B \-harmonics \fIN\fP
-Number of possible harmonics; the larger this value is, the greater
-the possible variety of possible speeds of epicycle.
-.TP 8
-.B \-timestep \fInumber\fP
-Decreasing this value will reduce the distance the body moves for
-each line segment, possibly producing a smoother figure.  Increasing
-it may produce faster results.  
-.TP 8
-.B \-divisor_poisson \fIprobability\fP
-Each epicycle rotates at a rate which is a factor of the base speed.
-The speed of each epicycle is the base speed divided by some integer
-between 1 and the value of the 
-.B \-harmonics 
-option.  This integer is decided by starting at 1 and tossing 
-a biased coin.  For each consecutive head, the value is incremented by
-one.  The integer will not be incremented above the value of the 
-.B \-harmonics
-option.  The argument of this option decides the bias of the coin; it
-is the probability that that coin will produce a head at any given toss.
-.TP 8
-.B \-size_factor_min \fInumber\fP
-Epicycles are always at least this factor smaller than their
-parents.  
-.TP 8
-.B \-size_factor_max \fInumber\fP
-Epicycles are never more than this factor smaller than their parents.
-.SH RESOURCES
-.EX
-Option            Resource               Default Value
-------            --------               -------------
--colors           .colors                100
--delay            .delay                 1000
--holdtime         .holdtime              2
--linewidth        .lineWidth             4
--min_circles      .minCircles            2
--max_circles      .maxCircles            10
--min_speed        .minSpeed              0.003
--max_speed        .maxSpeed              0.005
--harmonics        .harmonics             8
--timestep         .timestep              1.0
--divisor_poisson  .divisorPoisson        0.4
--size_factor_min  .sizeFactorMin         1.05
--size_factor_max  .sizeFactorMax         2.05
-                  .timestepCoarseFactor  1.0
-.EE
-Before the drawing of the figure is begun, a preliminary calculation
-of the path is done in order to scale the radii of the epicycles so
-as to fit the figure on the screen or window.  For the sake of speed,
-This calculation is done with a larger timestep than the actual
-drawing.  The time-step used is the value of the
-.B \-timestep 
-option multiplied by the timestepCoarseFactor resource.  The default
-value of 1 will almost always work fast enough and so this resource
-is not available as a command-line option.
-.SH USER INTERFACE
-The program runs mostly without user interaction.  When running on the
-root window, no input is accepted.  When running in its own window,
-the program will exit if mouse button 3 is pressed.  If any other
-mouse button is pressed, the current figure will be abandoned and
-another will be started.
-.SH HISTORY
-The geometry of epicycles was perfected by Hipparchus of Rhodes at
-some time around 125 B.C., 185 years after the birth of Aristarchus of
-Samos, the inventor of the heliocentric universe model.  Hipparchus
-applied epicycles to the Sun and the Moon.  Ptolemy of Alexandria went
-on to apply them to what was then the known universe, at around 150
-A.D.  Copernicus went on to apply them to the heliocentric model at
-the beginning of the sixteenth century.  Johannes Kepler discovered
-that the planets actually move in elliptical orbits in about 1602.
-The inverse-square law of gravity was suggested by Boulliau in 1645.
-Isaac Newton's 
-.I Principia Mathematica
-was published in 1687, and proved that Kepler's laws derived from
-Newtonian gravitation.
-.SH BUGS
-The colour selection is re-done for every figure.  This may 
-generate too much network traffic for this program to work well 
-over slow or long links.   
-.SH COPYRIGHT
-Copyright \(co 1998, James Youngman.  Permission to use, copy, modify,
-distribute, and sell this software 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.  No representations are made about the
-suitability of this software for any purpose.  It is provided "as is" without
-express or implied warranty.
-.SH AUTHOR
-James Youngman <jay@gnu.org>, April 1998.
diff --git a/local/man/man.1/flag.1 b/local/man/man.1/flag.1
deleted file mode 100644 (file)
index 1c7d93b..0000000
+++ /dev/null
@@ -1,88 +0,0 @@
-.TH XScreenSaver 1 "24-May-97" "X Version 11"
-.SH NAME
-flag - draws a waving flag, containing text or an image
-.SH SYNOPSIS
-.B flag
-[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-ncolors \fIinteger\fP] [\-delay \fImicroseconds\fP] [\-cycles \fIinteger\fP] [\-size \fIinteger\fP] [\-text \fIstring\fP] [\-font \fIfont\fP] [\-bitmap \fIxbm-file\fP]
-
-.SH DESCRIPTION
-The \fIflag\fP program draws a waving flag that contains text or a bitmap.
-.SH OPTIONS
-.I flag
-accepts the following options:
-.TP 8
-.B \-window
-Draw on a newly-created window.  This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-mono 
-If on a color display, pretend we're on a monochrome display.
-.TP 8
-.B \-install
-Install a private colormap for the window.
-.TP 8
-.B \-visual \fIvisual\fP
-Specify which visual to use.  Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-ncolors \fIinteger\fP
-How many colors should be used (if possible).  Default 200.
-.TP 8
-.B \-cycles \fIinteger\fP
-
-.TP 8
-.B \-count \fIinteger\fP
-
-.TP 8
-.B \-size \fIinteger\fP
-How large the pixels in the flag should be, from 1 to 8.
-If this is a negative number, the pixel size is chosen randomly
-from the range 1 to -size.  Default -7.
-.TP 8
-.B \-text \fItext\fP
-The text to display in the flag.  Multiple lines of text are allowed;
-the lines will be displayed centered atop one another.  Default: none.
-If the text is the magic string \fI"(default)"\fP, then the text used 
-will be the local machine name; a newline; and the local OS version.
-.TP 8
-.B \-bitmap \fIxbm-file\fP
-The bitmap to display in the flag; this must be an XBM file (color XPMs
-are not allowed.)  Default: none.  If the bitmap is the magic 
-string \fI"(default)"\fP, then the bitmap used will be a charming 
-little picture of J. R. "Bob" Dobbs.
-
-If neither \fI\-text\fP nor \fI\-bitmap\fP are specified, then either
-the builtin text or the builtin bitmap will be chosen randomly.
-.TP 8
-.B \-font \fIfont\fP
-The font in which to draw the text; the default is
-"-*-helvetica-bold-r-*-240-*".
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1),
-.BR xlock (1)
-.SH COPYRIGHT
-Copyright \(co 1996 Charles Vidal.
-
-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. 
-
-.SH AUTHOR
-Charles Vidal <vidalc@univ-mlv.fr>, 1996.
-
-Ability to run standalone or with \fIxscreensaver\fP, and the \-text
-and \-bitmap options, added by Jamie Zawinski <jwz@jwz.org>, 24-May-97.
diff --git a/local/man/man.1/flame.1 b/local/man/man.1/flame.1
deleted file mode 100644 (file)
index a646973..0000000
+++ /dev/null
@@ -1,70 +0,0 @@
-.TH XScreenSaver 1 "13-aug-92" "X Version 11"
-.SH NAME
-flame - draw weird cosmic fractals
-.SH SYNOPSIS
-.B flame
-[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-colors \fIinteger\fP] [\-iterations \fIinteger\fP] [\-points \fIinteger\fP] [\-delay \fImicroseconds\fP] [\-delay2 \fImicroseconds\fP]
-.SH DESCRIPTION
-The \fIflame\fP program generates colorful fractal displays.
-.SH OPTIONS
-.I flame
-accepts the following options:
-.TP 8
-.B \-window
-Draw on a newly-created window.  This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-mono 
-If on a color display, pretend we're on a monochrome display.
-.TP 8
-.B \-install
-Install a private colormap for the window.
-.TP 8
-.B \-visual \fIvisual\fP
-Specify which visual to use.  Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-colors \fIinteger\fP
-How many colors should be used (if possible).  Default 64.
-.TP 8
-.B \-iterations \fIinteger\fP
-How many fractals to generate.  Default 25.
-.TP 8
-.B \-points \fIinteger\fP
-How many pixels to draw for each fractal.  Default 10000.
-.TP 8
-.B \-delay \fImicroseconds\fP
-How long we should wait between drawing each fractal.  Default 50000,
-or about 1/20th second.
-.TP 8
-.B \-delay2 \fImicroseconds\fP
-How long we should wait before clearing the screen when each run ends.
-Default 2000000, or two seconds.
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1),
-.BR xlock (1)
-.SH COPYRIGHT
-Copyright \(co 1991 by Patrick J. Naughton
-
-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. 
-.SH AUTHOR
-Scott Graves <spot@cs.cmu.edu>, 06-Jun-91.n
-
-Ability to run standalone or with \fIxscreensaver\fP added by 
-Jamie Zawinski <jwz@jwz.org>, 18-Oct-93.
diff --git a/local/man/man.1/forest.1 b/local/man/man.1/forest.1
deleted file mode 100644 (file)
index 9f2d2c6..0000000
+++ /dev/null
@@ -1,63 +0,0 @@
-.TH XScreenSaver 1 "27-May-97" "X Version 11"
-.SH NAME
-forest - draws a fractal forest
-.SH SYNOPSIS
-.B forest
-[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-ncolors \fIinteger\fP] [\-delay \fImicroseconds\fP] [\-cycles \fIinteger\fP] [\-count \fIinteger\fP]
-
-.SH DESCRIPTION
-The \fIforest\fP program draws a fractal forest.
-.SH OPTIONS
-.I forest
-accepts the following options:
-.TP 8
-.B \-window
-Draw on a newly-created window.  This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-mono 
-If on a color display, pretend we're on a monochrome display.
-.TP 8
-.B \-install
-Install a private colormap for the window.
-.TP 8
-.B \-visual \fIvisual\fP
-Specify which visual to use.  Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-ncolors \fIinteger\fP
-How many colors should be used (if possible).  Default 100.
-.TP 8
-.B \-cycles \fIinteger\fP
-
-.TP 8
-.B \-count \fIinteger\fP
-
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1),
-.BR xlock (1)
-.SH COPYRIGHT
-Copyright \(co 1995 by Pascal Pensa.
-
-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. 
-.SH AUTHOR
-Pascal Pensa <pensa@aurora.unice.fr>, 1995.
-
-Ability to run standalone or with \fIxscreensaver\fP added by 
-Jamie Zawinski <jwz@jwz.org>, 27-May-97.
diff --git a/local/man/man.1/galaxy.1 b/local/man/man.1/galaxy.1
deleted file mode 100644 (file)
index 2ef9e12..0000000
+++ /dev/null
@@ -1,83 +0,0 @@
-.TH XScreenSaver 1 "10-May-97" "X Version 11"
-.SH NAME
-galaxy - draws spinning galaxies
-.SH SYNOPSIS
-.B galaxy
-[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-ncolors \fIinteger\fP] [\-delay \fImicroseconds\fP] [\-cycles \fIinteger\fP] [\-count \fIinteger\fP] [\-size \fIinteger\fP] [\-trail] [\-no\-trail]
-
-.SH DESCRIPTION
-The \fIgalaxy\fP program draws spinning galaxies.
-.SH OPTIONS
-.I galaxy
-accepts the following options:
-.TP 8
-.B \-window
-Draw on a newly-created window.  This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-mono 
-If on a color display, pretend we're on a monochrome display.
-.TP 8
-.B \-install
-Install a private colormap for the window.
-.TP 8
-.B \-visual \fIvisual\fP
-Specify which visual to use.  Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-ncolors \fIinteger\fP
-How many colors should be used (if possible).  Default 64.
-The colors used cycle through the hue, making N stops around
-the color wheel.
-.TP 8
-.B \-cycles \fIinteger\fP
-
-.TP 8
-.B \-count \fIinteger\fP
-
-.TP 8
-.B \-size \fIinteger\fP
-
-.TP 8
-.B \-trail
-.TP 8
-.B \-no\-trail
-
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1),
-.BR xlock (1)
-.SH COPYRIGHT
-Copyright \(co 1994 by Hubert Feyrer.
-
-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. 
-.SH AUTHOR
-Original Amiga version by Uli Siegmund <uli@wombat.okapi.sub.org>
- for EGS in Cluster.
-
-Ported from Cluster/EGS to C/Intuition by Harald Backert.
-
-Ported to X11 and xlockmore by 
-Hubert Feyrer <hubert.feyrer@rz.uni-regensburg.de>, 30-Sep-94.
-
-Modified by David Bagley <bagleyd@bigfoot.com>, 23-Oct-94.
-
-Modified by Dave Mitchell <davem@magnet.com>, 7-Apr-97.
-
-Ability to run standalone or with \fIxscreensaver\fP added by 
-Jamie Zawinski <jwz@jwz.org>, 10-May-97.
diff --git a/local/man/man.1/goop.1 b/local/man/man.1/goop.1
deleted file mode 100644 (file)
index adf79d8..0000000
+++ /dev/null
@@ -1,80 +0,0 @@
-.TH XScreenSaver 1 "11-Jun-97" "X Version 11"
-.SH NAME
-goop - squishy transparent oil and bubble screenhack
-.SH SYNOPSIS
-.B goop
-[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-transparent] [\-non\-transparent] [\-additive] [\-subtractive] [\-xor] [\-no\-xor]
-.SH DESCRIPTION
-The \fIgoop\fP program draws a simulation of bubbles in layers of 
-overlapping multicolored translucent fluid.
-.SH OPTIONS
-.I goop
-accepts the following options:
-.TP 8
-.B \-window
-Draw on a newly-created window.  This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-mono 
-If on a color display, pretend we're on a monochrome display.
-.TP 8
-.B \-install
-Install a private colormap for the window.
-.TP 8
-.B \-visual \fIvisual\fP
-Specify which visual to use.  Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-count \fIinteger\fP
-How many bubbles to draw per layer.  Default: random.
-.TP 8
-.B \-layers \fIinteger\fP
-How many layers to draw.  Default: random, based on screen depth.
-.TP 8
-.B \-delay \fImicroseconds\fP
-How much of a delay should be introduced between steps of the animation.
-Default 100000, or about 1/10th second.
-.TP 8
-.B \-transparent
-If \fI\-layers\fP is greater than 1, then each layer will be drawn in one
-color, and when they overlap, the colors will be mixed. This is the default.
-.TP 8
-.B \-non\-transparent
-Turns off \fI\-transparent\fP.
-.TP 8
-.B \-additive
-If \fI\-transparent\fP is specified, then this option means that the colors
-will be mixed using an additive color model, as if the blobs were projected
-light.  This is the default.
-.TP 8
-.B \-subtractive
-If \fI\-transparent\fP is specified, then this option means that the
-colors will be mixed using a subtractive color model, as if the blobs were
-translucent filters.
-.TP 8
-.B \-xor
-Draw with xor instead of the other color tricks.
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1)
-.SH COPYRIGHT
-Copyright \(co 1997 by Jamie Zawinski.  Permission to use, copy, modify, 
-distribute, and sell this software 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.  No representations are made about the 
-suitability of this software for any purpose.  It is provided "as is" without
-express or implied warranty.
-.SH AUTHOR
-Jamie Zawinski <jwz@jwz.org>, 11-Jun-97.
diff --git a/local/man/man.1/grav.1 b/local/man/man.1/grav.1
deleted file mode 100644 (file)
index 7cd42cb..0000000
+++ /dev/null
@@ -1,74 +0,0 @@
-.TH XScreenSaver 1 "10-May-97" "X Version 11"
-.SH NAME
-grav - draws a simple orbital simulation
-.SH SYNOPSIS
-.B grav
-[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-ncolors \fIinteger\fP] [\-delay \fImicroseconds\fP] [\-count \fIinteger\fP] [\-decay] [\-no\-decay] [\-trail] [\-no\-trail]
-
-.SH DESCRIPTION
-The \fIgrav\fP program draws a simple orbital simulation
-.SH OPTIONS
-.I grav
-accepts the following options:
-.TP 8
-.B \-window
-Draw on a newly-created window.  This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-mono 
-If on a color display, pretend we're on a monochrome display.
-.TP 8
-.B \-install
-Install a private colormap for the window.
-.TP 8
-.B \-visual \fIvisual\fP
-Specify which visual to use.  Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-ncolors \fIinteger\fP
-How many colors should be used (if possible).  Default 200.
-The colors are chosen randomly.
-.TP 8
-.B \-count \fIinteger\fP
-Default 12.
-.TP 8
-.B \-decay
-.TP 8
-.B \-no-\decay
-Whether orbits should decay.
-
-.TP 8
-.B \-trail
-.TP 8
-.B \-no\-trail
-Whether the objects should leave trails behind them (makes it look vaguely
-like a cloud-chamber.
-
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1),
-.BR xlock (1)
-.SH COPYRIGHT
-Copyright \(co 1993 by Greg Bowering.
-
-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. 
-.SH AUTHOR
-Greg Bowering <greg@smug.student.adelaide.edu.au>, 1993.
-
-Ability to run standalone or with \fIxscreensaver\fP added by 
-Jamie Zawinski <jwz@jwz.org>, 10-May-97.
diff --git a/local/man/man.1/greynetic.1 b/local/man/man.1/greynetic.1
deleted file mode 100644 (file)
index 0b761cc..0000000
+++ /dev/null
@@ -1,52 +0,0 @@
-.TH XScreenSaver 1 "13-aug-92" "X Version 11"
-.SH NAME
-greynetic - draw random stippled/color rectangles
-.SH SYNOPSIS
-.B greynetic
-[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-delay \fIusecs\fP]
-.SH DESCRIPTION
-The \fIgreynetic\fP program draws random rectangles.
-.SH OPTIONS
-.I greynetic
-accepts the following options:
-.TP 8
-.B \-window
-Draw on a newly-created window.  This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-mono 
-If on a color display, pretend we're on a monochrome display.
-.TP 8
-.B \-install
-Install a private colormap for the window.
-.TP 8
-.B \-visual \fIvisual\fP
-Specify which visual to use.  Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-delay \fImicroseconds\fP
-Slow it down.
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1)
-.SH COPYRIGHT
-Copyright \(co 1992 by Jamie Zawinski.  Permission to use, copy, modify, 
-distribute, and sell this software 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.  No representations are made about the 
-suitability of this software for any purpose.  It is provided "as is" without
-express or implied warranty.
-.SH AUTHOR
-Jamie Zawinski <jwz@jwz.org>, 13-aug-92.
diff --git a/local/man/man.1/halo.1 b/local/man/man.1/halo.1
deleted file mode 100644 (file)
index a499357..0000000
+++ /dev/null
@@ -1,80 +0,0 @@
-.TH XScreenSaver 1 "12-Jun-97" "X Version 11"
-.SH NAME
-halo - draw circular patterns
-.SH SYNOPSIS
-.B halo
-[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-count \fIint\fP] [\-delay \fIusecs\fP] [\-mode seuss | ramp | random ] [\-animate] [\-colors \fIinteger\fP] [\-cycle] [\-no\-cycle] [\-cycle\-delay \fIusecs\fP] 
-.SH DESCRIPTION
-The \fIhalo\fP program draws cool patterns based on circles.
-.SH OPTIONS
-.I halo
-accepts the following options:
-.TP 8
-.B \-window
-Draw on a newly-created window.  This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-mono 
-If on a color display, pretend we're on a monochrome display.
-.TP 8
-.B \-install
-Install a private colormap for the window.
-.TP 8
-.B \-visual \fIvisual\fP
-Specify which visual to use.  Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-count \fIinteger\fP
-How many circles to draw.  Default 0, meaning random.
-.TP 8
-.B \-mode "seuss | ramp | random"
-In \fIseuss\fP mode, alternating striped curves will be drawn.
-
-In \fIramp\fP mode, a color ramp will be drawn.
-
-\fIrandom\fP means pick the mode randomly.
-.TP 8
-.B \-delay \fImicroseconds\fP
-How much of a delay should be introduced between steps of the animation.
-Default 100000, or about 0.1 second.
-.TP 8
-.B \-colors \fIinteger\fP
-How many colors to use.  Default 100.
-.TP 8
-.B \-animate
-If specified, then the centerpoints of the circles will bounce around.
-Otherwise, the circles will be drawn once, erased, and a new set of
-circles will be drawn.
-.TP 8
-.B \-cycle
-.TP 8
-.B \-no\-cycle
-Whether to do colormap cycling.  Default is to cycle.
-.TP 8
-.B \-cycle\-delay
-Number of microseconds between shifts of the colormap; default 100000,
-or 1/10th second.
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1)
-.SH COPYRIGHT
-Copyright \(co 1993 by Jamie Zawinski.  Permission to use, copy, modify, 
-distribute, and sell this software 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.  No representations are made about the 
-suitability of this software for any purpose.  It is provided "as is" without
-express or implied warranty.
-.SH AUTHOR
-Jamie Zawinski <jwz@jwz.org>, 6-jul-93.
diff --git a/local/man/man.1/helix.1 b/local/man/man.1/helix.1
deleted file mode 100644 (file)
index 2c1c3e3..0000000
+++ /dev/null
@@ -1,63 +0,0 @@
-.TH XScreenSaver 1 "18-sep-97" "X Version 11"
-.SH NAME
-helix - draw helical string-art patterns
-.SH SYNOPSIS
-.B helix
-[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-erase\-speed \fIusecs\fP] [\-erase\-mode \fIinteger\fP] [\-delay \fIseconds\fP] [\-install] [\-visual \fIvisual\fP]
-.SH DESCRIPTION
-The \fIhelix\fP program draws interesting patterns composed of line segments
-in random colors.
-.SH OPTIONS
-.I helix
-accepts the following options:
-.TP 8
-.B \-window
-Draw on a newly-created window.  This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-mono 
-If on a color display, pretend we're on a monochrome display.
-.TP 8
-.B \-erase\-speed \fIusecs\fP
-This controls the speed at which the screen will be erased. Lower numbers 
-erase faster.
-.TP 8
-.B \-erase\-mode \fIinteger\fP
-This sets the erase mode. Mode \-1 chooses a random mode each time. There
-are currently 6 modes defined (0\-5).
-.TP 8
-.B \-delay \fIseconds\fP
-This sets the number of seconds that the helix will be on the screen.
-.TP 8
-.B \-install
-Install a private colormap for the window.
-.TP 8
-.B \-visual \fIvisual\fP
-Specify which visual to use.  Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1)
-.SH COPYRIGHT
-Copyright \(co 1992 by Jamie Zawinski.  Permission to use, copy, modify, 
-distribute, and sell this software 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.  No representations are made about the 
-suitability of this software for any purpose.  It is provided "as is" without
-express or implied warranty.
-.SH AUTHOR
-Jamie Zawinski <jwz@jwz.org>, 13-aug-92.
-Screen eraser improved by Johannes Keukelaar <johannes@nada.kth.se>, 
- 18-sep-97.
diff --git a/local/man/man.1/hopalong.1 b/local/man/man.1/hopalong.1
deleted file mode 100644 (file)
index d36a360..0000000
+++ /dev/null
@@ -1,78 +0,0 @@
-.TH XScreenSaver 1 "10-May-97" "X Version 11"
-.SH NAME
-hopalong - draw real plane fractals
-.SH SYNOPSIS
-.B hopalong
-[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-ncolors \fIinteger\fP] [\-delay \fImicroseconds\fP] [\-cycles \fIinteger\fP] [\-count \fIinteger\fP] [\-jong] [\-no\-jong] [\-jong] [\-no\-sine]
-
-.SH DESCRIPTION
-The \fIhopalong\fP program generates real plane fractals as described in
-the September 1986 issue of Scientific American.
-.SH OPTIONS
-.I hopalong
-accepts the following options:
-.TP 8
-.B \-window
-Draw on a newly-created window.  This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-mono 
-If on a color display, pretend we're on a monochrome display.
-.TP 8
-.B \-install
-Install a private colormap for the window.
-.TP 8
-.B \-visual \fIvisual\fP
-Specify which visual to use.  Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-ncolors \fIinteger\fP
-How many colors should be used (if possible).  Default 200.
-The colors used cycle through the hue, making N stops around
-the color wheel.
-.TP 8
-.B \-cycles \fIinteger\fP
-How long to run each batch.  Default 2500 pixels.
-.TP 8
-.B \-count \fIinteger\fP
-How many pixels should be drawn before a color change.  Default 1000.
-.TP 8
-.B \-jong \fIinteger\fP
-.TP 8
-.B \-no\-jong \fIinteger\fP
-Whether to use the Jong format (default is to choose randomly.)
-
-.TP 8
-.B \-sine \fIinteger\fP
-.TP 8
-.B \-no\-sine \fIinteger\fP
-Whether to use the Sine format (default is to choose randomly.)
-
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1),
-.BR xlock (1)
-.SH COPYRIGHT
-Copyright \(co 1988-91 by Patrick J. Naughton.
-
-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. 
-.SH AUTHOR
-Patrick J. Naughton <naughton@eng.sun.com>, 23-mar-88.
-
-Ability to run standalone or with \fIxscreensaver\fP added by 
-Jamie Zawinski <jwz@jwz.org>, 13-aug-92, and again on 10-May-97.
diff --git a/local/man/man.1/hypercube.1 b/local/man/man.1/hypercube.1
deleted file mode 100644 (file)
index 4c5f8f9..0000000
+++ /dev/null
@@ -1,93 +0,0 @@
-.TH XScreenSaver 1 "6-dec-92" "X Version 11"
-.SH NAME
-hypercube - 2d projection of a 4d object
-.SH SYNOPSIS
-.B hypercube
-[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-color[0-7] \fIcolor\fP] [\-xy \fIfloat\fP] [\-xz \fIfloat\fP] [\-yz \fIfloat\fP] [\-xw \fIfloat\fP] [\-yw \fIfloat\fP] [\-zw \fIfloat\fP] [\-observer-z \fIint\fP] [\-delay \fIusecs\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP]
-.SH DESCRIPTION
-The \fIhypercube\fP program displays a wireframe projection of a hypercube
-which is rotating at user-specified rates around any or all of its four axes.
-.SH OPTIONS
-.I hypercube
-accepts the following options:
-.TP 8
-.B \-window
-Draw on a newly-created window.  This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-mono 
-If on a color display, pretend we're on a monochrome display.
-.TP 8
-.B \-install
-Install a private colormap for the window.
-.TP 8
-.B \-visual \fIvisual\fP
-Specify which visual to use.  Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-delay \fImicroseconds\fP
-How much of a delay should be introduced between steps of the animation.
-Default 100000, or about 1/10th second.
-.TP 8
-.B \-observer-z \fIint\fP
-How far away the observer is from the center of the cube (the cube is one
-unit per side.)  Default 5.
-.TP 8
-.B \-color0 \fIcolor\fP
-.TP 8
-.B \-color1 \fIcolor\fP
-.TP 8
-.B \-color2 \fIcolor\fP
-.TP 8
-.B \-color3 \fIcolor\fP
-.TP 8
-.B \-color4 \fIcolor\fP
-.TP 8
-.B \-color5 \fIcolor\fP
-.TP 8
-.B \-color6 \fIcolor\fP
-.TP 8
-.B \-color7 \fIcolor\fP
-The colors used to draw the line segments bordering the eight faces of
-the cube.  Some of the faces have only two of their border-lines drawn in
-the specified color, and some have all four.
-.TP 8
-.B \-xw \fIfloat\fP
-.TP 8
-.B \-xy \fIfloat\fP
-.TP 8
-.B \-xz \fIfloat\fP
-.TP 8
-.B \-yw \fIfloat\fP
-.TP 8
-.B \-yz \fIfloat\fP
-.TP 8
-.B \-zw \fIfloat\fP
-The amount that the cube should be rotated around the specified axis at
-each frame of the animation, expressed in radians.  These should be small
-floating-point values (less than 0.05 works best.)  Default: xy=0.01,
-xz=0.005, yw=0.01.
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1)
-.SH COPYRIGHT
-Copyright \(co 1992 by Jamie Zawinski.  Permission to use, copy, modify, 
-distribute, and sell this software 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.  No representations are made about the 
-suitability of this software for any purpose.  It is provided "as is" without
-express or implied warranty.
-.SH AUTHOR
-Jamie Zawinski <jwz@jwz.org>, 6-dec-92.
diff --git a/local/man/man.1/ifs.1 b/local/man/man.1/ifs.1
deleted file mode 100644 (file)
index 2d04eef..0000000
+++ /dev/null
@@ -1,59 +0,0 @@
-.TH XScreenSaver 1 "10-May-97" "X Version 11"
-.SH NAME
-ifs - draws spinning, colliding iterated-function-system images
-.SH SYNOPSIS
-.B ifs
-[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-ncolors \fIinteger\fP] [\-delay \fImicroseconds\fP]
-
-.SH DESCRIPTION
-The \fIifs\fP program draws spinning, colliding iterated-function-system images.
-.SH OPTIONS
-.I ifs
-accepts the following options:
-.TP 8
-.B \-window
-Draw on a newly-created window.  This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-mono 
-If on a color display, pretend we're on a monochrome display.
-.TP 8
-.B \-install
-Install a private colormap for the window.
-.TP 8
-.B \-visual \fIvisual\fP
-Specify which visual to use.  Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-ncolors \fIinteger\fP
-How many colors should be used (if possible).  Default 200.
-The colors used cycle through the hue, making N stops around
-the color wheel.
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1),
-.BR xlock (1)
-.SH COPYRIGHT
-Copyright \(co 1997 by Massimino Pascal.
-
-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. 
-.SH AUTHOR
-Massimino Pascal <Pascal.Massimon@ens.fr>, 1997.
-
-Ability to run standalone or with \fIxscreensaver\fP added by 
-Jamie Zawinski <jwz@jwz.org>, 10-May-97.
diff --git a/local/man/man.1/imsmap.1 b/local/man/man.1/imsmap.1
deleted file mode 100644 (file)
index b8f81ad..0000000
+++ /dev/null
@@ -1,66 +0,0 @@
-.TH XScreenSaver 1 "17-May-97" "X Version 11"
-.SH NAME
-imsmap - generate fractal maps
-.SH SYNOPSIS
-.B imsmap
-[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-ncolors \fIint\fP] [\-delay \fIseconds\fP] [\-iterations \fIint\fP] [\-mode h|s|v|random] [\-cycle] [\-no\-cycle]
-.SH DESCRIPTION
-The \fIimsmap\fP program generates map or cloud-like patterns.  It looks
-quite different in monochrome and color.
-.SH OPTIONS
-.I imsmap
-accepts the following options:
-.TP 8
-.B \-window
-Draw on a newly-created window.  This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-mono 
-If on a color display, pretend we're on a monochrome display.
-.TP 8
-.B \-install
-Install a private colormap for the window.
-.TP 8
-.B \-visual \fIvisual\fP
-Specify which visual to use.  Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-ncolors \fIinteger\fP
-How many colors to use.  Default 50.
-.TP 8
-.B \-delay \fIinteger\fP
-How long to delay between images.  Default 10 seconds.
-.TP 8
-.B \-iterations \fIinteger\fP
-A measure of the resolution of the resultant image, from 0 to 7.  Default 7.
-.TP 8
-.B \-mode [ hue | saturation | value | random ]
-The axis upon which colors should be interpolated between the foreground
-and background color.  Default random.  
-.TP 8
-.B \-cycle
-.TP 8
-.B \-no\-cycle
-Whether to do colormap cycling.  Default is to cycle.
-.TP 8
-.B \-cycle\-delay
-Number of microseconds between shifts of the colormap; default 100000,
-or 1/10th second.
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1)
-.SH AUTHOR
-Juergen Nickelsen <nickel@cs.tu-berlin.de>, 23-aug-92.
-
-Hacked on by Jamie Zawinski <jwz@jwz.org>, 24-aug-92, 17-May-97.
diff --git a/local/man/man.1/jigsaw.1 b/local/man/man.1/jigsaw.1
deleted file mode 100644 (file)
index ae9f7a0..0000000
+++ /dev/null
@@ -1,74 +0,0 @@
-.TH XScreenSaver 1 "25-Nov-97" "X Version 11"
-.SH NAME
-jigsaw - permute the screen image like a jigsaw puzzle
-.SH SYNOPSIS
-.B jigsaw
-[\-display \fIhost:display.screen\fP] [\-background \fIcolor\fP] [\-delay \fIusecs\fP] [\-window] [\-root] [\-install] [\-visual \fIvisual\fP]
-.SH DESCRIPTION
-The \fIjigsaw\fP program takes an image of the screen, carves it up into
-a jigsaw puzzle, shuffles it, and then solves it.
-.SH OPTIONS
-.I jigsaw
-accepts the following options:
-.TP 8
-.B \-window
-Draw on a newly-created window.  This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-install
-Install a private colormap for the window.
-.TP 8
-.B \-visual \fIvisual\fP
-Specify which visual to use.  Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-delay \fImicroseconds\fP
-How long to wait between shuffling pieces; default 700000, or 0.7 seconds.
-.SH RESOURCES
-On some systems (currently, only SGIs), this program can, instead of grabbing
-a desktop image, grab a frame of video from an external camera and manipulate
-that instead.  The following resources control that.
-.PP
-.TP 8
-.B grabVideoProbability \fR(Float)\fP
-What portion of the time to grab video rather than a screen image, 
-between 0.0 and 1.0.  Defaults to 0.5, or half the time.
-.TP 8
-.B videoDevice \fR(Integer)\fP
-The number of the default video input device to check first.  If unspecified, 
-the default camera (from videopanel(1)) will be checked first.  After that, all
-other available video input devices will be checked in order.  
-
-The first one which produces a non-black image will be used.  If all images
-are black, the others will be re-checked a few times before giving up and
-falling back to simply grabbing a desktop image (but note that this takes a
-few seconds, so if you don't actually have any video sources hooked up, you
-should consider turning off video grabbing by setting
-\fBgrabVideoProbability\fP to 0.0.)
-.TP 8
-.B videoGain \fR(Float)\fP
-The amount by which to brighten the grabbed image.  This defaults to 2.2.
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1)
-.SH COPYRIGHT
-Copyright \(co 1997 by Jamie Zawinski.  Permission to use, copy, modify, 
-distribute, and sell this software 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.  No representations are made about the 
-suitability of this software for any purpose.  It is provided "as is" without
-express or implied warranty.
-.SH AUTHOR
-Jamie Zawinski <jwz@jwz.org>, 25-Nov-97.
diff --git a/local/man/man.1/kaleidescope.1 b/local/man/man.1/kaleidescope.1
deleted file mode 100644 (file)
index 6eca5e3..0000000
+++ /dev/null
@@ -1,85 +0,0 @@
-.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
-..
-.TH Kaleidescpe 1 "14-Dec-95" "X Version 11"
-.SH NAME
-Kaleidescope - rotating line segments
-.SH SYNOPSIS
-.B kaleidescope
-[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-install] [\-visual \fIvisual\fP] [\-color_mode \fImono | nice | greedy\fP] [-nsegments \fIint\fP] [\-ntrails \fIint\fP] [\-local_rotation \fIint\fP] [\-global_rotation \fIint\fP] [\-delay \fIusecs\fP] [\-redmin \fIint\fP] [\-greenmin \fIint\fP] [\-bluemin \fIint\fP] [\-redrange \fIint\fP] [\-greenrange \fIint\fP] [\-bluerange \fIint\fP]
-.SH DESCRIPTION
-The \fIkaleidescope\fP program draws line segments in a symmetric pattern
-that evolves over time. 
-.SH OPTIONS
-.I kaleidescope
-accepts the following options:
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-color_mode "mono | nice | greedy"
-Specify how kaleidescope uses colors. Mono uses
-just the default foreground and background colors. Nice uses one
-color for each segment (specified by nsegments). Greedy uses (ntrails * nsegments) + 1  colors.
-.TP 8
-.B \-install
-Install a private colormap for the window.
-.TP 8
-.B \-visual \fIvisual\fP
-Specify which visual to use.  Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-nsegments integer
-The number of segments to draw. Default is 7.
-.TP 8
-.B \-ntrails integer
-The number of trails to draw. Default is 100.
-.TP 8
-.B \-local_rotation integer
-The rate at which segments rotate around their center. Default is -59.
-.TP 8
-.B \-global_rotation integer 
-The rate at which segments rotate around the center of the window.
-Default is 1. 
-.TP 8
-.B \-redmin, \-greenmin, \-bluemin, \-redrange, \-greenrange, \-bluerange
-All take an integer argument. When colors are randomly chosen, they 
-are chosen from the interval min to min plus range. The minimums default
-to 30000. The ranges default to 20000. 
-.TP 8
-.B \-delay microseconds
-How much of a delay should be introduced between steps of the animation.
-Default is 20000, or about 5 frames a second.
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR X (1),
-.BR kaleidescope (1)
-.SH COPYRIGHT
-Copyright \(co 1997 by Ron Tapia.  Permission to use, copy, modify, 
-distribute, and sell this software 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.  No representations are made about the 
-suitability of this software for any purpose.  It is provided "as is" without
-express or implied warranty.
-.SH AUTHOR
-Ron Tapia <tapia@nmia.com>, 20-Mar-97.
-
diff --git a/local/man/man.1/lament.1 b/local/man/man.1/lament.1
deleted file mode 100644 (file)
index 52cb6b4..0000000
+++ /dev/null
@@ -1,60 +0,0 @@
-.TH XScreenSaver 1 "25-Jul-98" "X Version 11"
-.SH NAME
-lament - animates the Lament Configuration
-.SH SYNOPSIS
-.B lament
-[\-display \fIhost:display.screen\fP] [\-window] [\-root] [\-install] [\-visual \fIvisual\fP] [\-texture] [\-no\-texture] [\-wireframe]
-.SH DESCRIPTION
-The \fIlament\fP program draws an animation of a particular puzzle box
-repeatedly solving itself.
-.SH OPTIONS
-.I lament
-accepts the following options:
-.TP 8
-.B \-window
-Draw on a newly-created window.  This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-install
-Install a private colormap for the window.
-.TP 8
-.B \-visual \fIvisual\fP\fP
-Specify which visual to use.  Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-texture
-Use texture maps.  This is the default.
-.TP 8
-.B \-no\-texture
-Do not use texture maps.  This is boring and wrong.
-.TP 8
-.B \-wireframe
-Only draw outlines.
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH BUGS
-This hack is glacially slow on machines lacking hardware texture support.
-
-Occasionally opens doors, admitting theologians of the Order of the Gash.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1)
-.SH COPYRIGHT
-Copyright \(co 1998 by Jamie Zawinski.  Permission to use, copy, modify, 
-distribute, and sell this software 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.  No representations are made about the 
-suitability of this software for any purpose.  It is provided "as is" without
-express or implied warranty.
-.SH AUTHOR
-Jamie Zawinski <jwz@jwz.org>, 25-Jul-98.
diff --git a/local/man/man.1/laser.1 b/local/man/man.1/laser.1
deleted file mode 100644 (file)
index 70cec4e..0000000
+++ /dev/null
@@ -1,64 +0,0 @@
-.TH XScreenSaver 1 "10-May-97" "X Version 11"
-.SH NAME
-laser - draws vaguely laser-like moving lines
-.SH SYNOPSIS
-.B laser
-[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-ncolors \fIinteger\fP] [\-delay \fImicroseconds\fP] [\-cycles \fIinteger\fP] [\-count \fIinteger\fP]
-
-.SH DESCRIPTION
-The \fIlaser\fP program draws vaguely laser-like moving lines
-.SH OPTIONS
-.I laser
-accepts the following options:
-.TP 8
-.B \-window
-Draw on a newly-created window.  This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-mono 
-If on a color display, pretend we're on a monochrome display.
-.TP 8
-.B \-install
-Install a private colormap for the window.
-.TP 8
-.B \-visual \fIvisual\fP
-Specify which visual to use.  Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-ncolors \fIinteger\fP
-How many colors should be used (if possible).  Default 64.
-The colors used cycle through the hue, making N stops around the color wheel.
-.TP 8
-.B \-cycles \fIinteger\fP
-Default 200.
-.TP 8
-.B \-count \fIinteger\fP
-Default 10.
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1),
-.BR xlock (1)
-.SH COPYRIGHT
-Copyright \(co 1995 by Pascal Pensa.
-
-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. 
-.SH AUTHOR
-Pascal Pensa <pensa@aurora.unice.fr>, 1995.
-
-Ability to run standalone or with \fIxscreensaver\fP added by 
-Jamie Zawinski <jwz@jwz.org>, 10-May-97.
diff --git a/local/man/man.1/lightning.1 b/local/man/man.1/lightning.1
deleted file mode 100644 (file)
index 786ee99..0000000
+++ /dev/null
@@ -1,58 +0,0 @@
-.TH XScreenSaver 1 "10-May-97" "X Version 11"
-.SH NAME
-lightning - draws fractal lightning bolts
-.SH SYNOPSIS
-.B lightning
-[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-ncolors \fIinteger\fP] [\-delay \fImicroseconds\fP]
-
-.SH DESCRIPTION
-The \fIlightning\fP program draws fractal lightning bolts
-.SH OPTIONS
-.I lightning
-accepts the following options:
-.TP 8
-.B \-window
-Draw on a newly-created window.  This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-mono 
-If on a color display, pretend we're on a monochrome display.
-.TP 8
-.B \-install
-Install a private colormap for the window.
-.TP 8
-.B \-visual \fIvisual\fP
-Specify which visual to use.  Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-ncolors \fIinteger\fP
-How many colors should be used (if possible).  Default 64.
-The colors are chosen randomly.
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1),
-.BR xlock (1)
-.SH COPYRIGHT
-Copyright \(co 1996 by Keith Romberg.
-
-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. 
-.SH AUTHOR
-Keith Romberg <kromberg@saxe.com>, 27-Jun-96.
-
-Ability to run standalone or with \fIxscreensaver\fP added by 
-Jamie Zawinski <jwz@jwz.org>, 10-May-97.
diff --git a/local/man/man.1/lisa.1 b/local/man/man.1/lisa.1
deleted file mode 100644 (file)
index 64cc06f..0000000
+++ /dev/null
@@ -1,67 +0,0 @@
-.TH XScreenSaver 1 "27-May-97" "X Version 11"
-.SH NAME
-lisa - draws animated full-loop lisajous figures
-.SH SYNOPSIS
-.B lisa
-[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-ncolors \fIinteger\fP] [\-delay \fImicroseconds\fP] [\-cycles \fIinteger\fP] [\-count \fIinteger\fP] [\-size \fIinteger\fP]
-
-.SH DESCRIPTION
-The \fIlisa\fP program draws animated full-loop lisajous figures.
-.SH OPTIONS
-.I lisa
-accepts the following options:
-.TP 8
-.B \-window
-Draw on a newly-created window.  This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-mono 
-If on a color display, pretend we're on a monochrome display.
-.TP 8
-.B \-install
-Install a private colormap for the window.
-.TP 8
-.B \-visual \fIvisual\fP
-Specify which visual to use.  Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-ncolors \fIinteger\fP
-How many colors should be used (if possible).  Default 200.
-The colors are chosen randomly.
-.TP 8
-.B \-cycles \fIinteger\fP
-
-.TP 8
-.B \-count \fIinteger\fP
-
-.TP 8
-.B \-size \fIinteger\fP
-
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1),
-.BR xlock (1)
-.SH COPYRIGHT
-Copyright \(co 1997 by Caleb Cullen.
-
-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. 
-.SH AUTHOR
-Caleb Cullen, 1997.
-
-Ability to run standalone or with \fIxscreensaver\fP added by 
-Jamie Zawinski <jwz@jwz.org>, 27-May-97.
diff --git a/local/man/man.1/lmorph.1 b/local/man/man.1/lmorph.1
deleted file mode 100644 (file)
index 50cf8d2..0000000
+++ /dev/null
@@ -1,58 +0,0 @@
-.TH LMORPH 1 "xscreensaver hack"
-.SH NAME
-lmorph \- morphing lines
-.SH SYNOPSIS
-.B lmorph
-[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-points \fIint\fP] [\-steps \fIint\fP] [\-delay \fIusecs\fP] [\-figtype \fItype\fP]
-.SH DESCRIPTION
-The \fIlmorph\fP program morphs between simple linedrawings using bilinear
-interpolation.
-.SH OPTIONS
-.I lmorph
-accepts the following options:
-.TP 8
-.B \-window
-Draw on a newly-created window. This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-mono 
-If on a color display, pretend we're on a monochrome display.
-.TP 8
-.B \-install
-Install a private colormap for the window.
-.TP 8
-.B \-visual \fIvisual\fP
-Specify which visual to use. Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-points \fIinteger\fP
-Number of points in each line drawing. Default is 150 points.
-.TP 8
-.B \-steps \fIinteger\fP
-Interpolation steps from one drawing to the next. Default is 0, which
-means a random number between 100 and 500.
-.TP 8
-.B \-delay \fImicroseconds\fP
-How much of a delay should be introduced between steps of the animation.
-Default 50000.
-.TP 8
-.B \-figtype \fItype\fP
-Limit the figures to only open or closed figures. Possible types are
-"all" (default), "open" and "closed".
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1)
-.SH AUTHOR
-Sverre H. Huseby <sverrehu@online.no> and Glenn T. Lines <gtl@si.sintef.no>,
-built on top of the screen saver routines by Jamie Zawinski <jwz@jwz.org>.
diff --git a/local/man/man.1/maze.1 b/local/man/man.1/maze.1
deleted file mode 100644 (file)
index f482650..0000000
+++ /dev/null
@@ -1,146 +0,0 @@
-.TH XScreenSaver 1 "7-mar-93" "X Version 11"
-.SH NAME
-maze \- an automated X11 demo repeatedly creating and solving a random maze
-.SH SYNOPSIS
-.B maze 
-[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-install] [\-visual \fIvisual\fP] [\-grid\-size \fIpixels\fP] [\-live\-color \fIcolor\fP] [\-dead\-color \fIcolor\fP] [\-solve\-delay \fIusecs\fP] [\-pre\-delay \fIusecs\fP] [\-post\-delay \fIusecs\fP] [\-generator \fIinteger\fP] [\-max\-length \fIinteger\fP] [\-bridge] [\-no\-bridge]
-.SH DESCRIPTION
-The \fImaze\fP program creates a "random" maze and then solves it with 
-graphical feedback. 
-.SH OPTIONS
-.I maze
-accepts the following options:
-.TP 8
-.B \-window
-Draw on a newly-created window.  This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-install
-Install a private colormap for the window.
-.TP 8
-.B \-visual \fIvisual\fP
-Specify which visual to use.  Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-grid\-size \fIpixels\fP
-The size of each block of the maze, in pixels; default is 0, meaning
-pick a random grid size.
-.TP 8
-.B \-live\-color \fIcolor\fP
-The color of the path.
-.TP 8
-.B \-dead\-color \fIcolor\fP
-The color of the failed path (it is also stippled with a 50% pattern.)
-.TP 8
-.B \-skip\-color \fIcolor\fP
-The maze solver will choose to not go down a path if it can "see" (in a
-straight line) that it is a dead end.  This is the color to use for paths
-that are skipped for this reason.
-.TP 8
-.B \-surround\-color \fIcolor\fP
-If the maze solver ever completely encloses an area within the maze, then
-it knows that the exit is not in there (and in fact the interior of that
-area might not even be reachable.)  It will mark out those cells using this
-color.
-.TP 8
-.B \-solve\-delay \fIinteger\fP
-Delay (in microseconds) between each step of the solution path.
-Default 5000, or about 1/200th second.
-.TP 8
-.B \-pre\-delay \fIinteger\fP
-Delay (in microseconds) between generating a maze and starting to solve it.
-Default 2000000 (2 seconds.)
-.TP 8
-.B \-post\-delay \fIinteger\fP
-Delay (in microseconds) after solving a maze and before generating a new one.
-Default 4000000 (4 seconds.)
-.TP 8
-.B \-generator \fInum\fP
-Sets the algorithm that will be used to generate the mazes. The
-default is \-1, which randomly selects an algorithm for each maze that
-is generated. Generator 0 is the original one, and works by walking
-around randomly until we hit a place we've been before, then
-backtracking and trying a new direction somewhere. Generator 1 picks a
-random spot in the maze, then draws a straight wall from that spot in
-a random direction until it hits another wall (and continues until the
-maze is complete). Generator 2 is based on sets. Initially all cells
-are in different sets. Then two neighboring cells are chosen and if
-they are in different sets, their sets are joined. If they were in the
-same set, a wall is built between them. This continues until the maze is
-complete. 
-
-All generators generate mazes with a certain 'characteristic'. See if you
-can spot them!
-.TP 8
-.B \-max\-length \fInum\fP
-Controls the maximum length of walls drawn in one go by generator 1.
-.TP 8
-.B \-bridge
-.TP 8
-.B \-no\-bridge
-Controls whether or not a 'bridge' will appear over the logo.
-.PP
-Clicking the mouse in the maze window controls it.
-.TP 16
-.B "LeftButton
-Clears the window and restarts maze.
-.TP 16
-.B MiddleButton
-Pause or unpause the program.
-.TP 16
-.B RightButton
-Exit.
-.SH BUGS
-Expose events force a restart of maze.
-
-Mouse actions are based on "raw" values (Button1, Button2 and Button3)
-instead of using the pointer map.
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1)
-.SH COPYRIGHT
-.PP
-Copyright \(co 1988 by Sun Microsystems, Inc. Mountain View, CA.
-.PP  
-All Rights Reserved
-.PP
-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 names of Sun or MIT not be used in advertising or publicity pertaining to
-distribution of the software without specific prior written permission. Sun
-and M.I.T.  make no representations about the suitability of this software for
-any purpose. It is provided "as is" without any express or implied warranty.
-.PP
-SUN DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. IN
-NO EVENT SHALL SUN 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.
-.SH AUTHOR(s)
-.nf
-Zack Weinberg [ Smarter maze-solver ] zack@rabi.phys.columbia.edu
-Johannes Keukelaar [ Generators 1 and 2 ] johannes@nada.kth.se 
-  Royal Institute of Technology, Stockholm, Sweden
-Jim Randell    [ XScreenSaver version ] jmr@mddjmr.fc.hp.com
-  HPLabs, Bristol
-Richard Hess   [ X11 extensions ]      {...}!uunet!cimshop!rhess
-  Consilium, Mountain View, CA
-Dave Lemke     [ X11 version ]         lemke@sun.COM
-  Sun MicroSystems, Mountain View, CA
-Martin Weiss   [ SunView version ]
-  Sun MicroSystems, Mountain View, CA
-.fi
diff --git a/local/man/man.1/moire.1 b/local/man/man.1/moire.1
deleted file mode 100644 (file)
index c810265..0000000
+++ /dev/null
@@ -1,64 +0,0 @@
-.TH XScreenSaver 1 "27-Apr-97" "X Version 11"
-.SH NAME
-halo - draw circular interference patterns
-.SH SYNOPSIS
-.B halo
-[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-delay \fIseconds\fP] [\-random \fIboolean\fP] [\-ncolors \fIint\fP] [\-offset \fIint\fP] 
-.SH DESCRIPTION
-The \fImoire\fP program draws cool circular interference patterns.
-.SH OPTIONS
-.I moire
-accepts the following options:
-.TP 8
-.B \-window
-Draw on a newly-created window.  This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-mono 
-If on a color display, pretend we're on a monochrome display.
-.TP 8
-.B \-install
-Install a private colormap for the window.
-.TP 8
-.B \-visual \fIvisual\fP
-Specify which visual to use.  Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-delay \fIseconds\fP
-How long to wait before starting over.  Default 5 seconds.
-.TP 8
-.B \-random \fIboolean\fP
-Whether to ignore the foreground/background colors, and pick them randomly
-instead.
-.TP 8
-.B \-offset \fIinteger\fP
-The maximum random radius increment to use.
-.TP 8
-.B \-ncolors \fIinteger\fP
-How many colors should be allocated in the color ramp (note that this
-value interacts with \fIoffset\fP.)
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1)
-.SH COPYRIGHT
-Copyright \(co 1997 by Jamie Zawinski.  Permission to use, copy, modify, 
-distribute, and sell this software 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.  No representations are made about the 
-suitability of this software for any purpose.  It is provided "as is" without
-express or implied warranty.
-.SH AUTHOR
-Jamie Zawinski <jwz@jwz.org>, 27-Apr-97, based on code by
-Michael D. Bayne <mdb@go2net.com>.
diff --git a/local/man/man.1/munch.1 b/local/man/man.1/munch.1
deleted file mode 100644 (file)
index 97b1b79..0000000
+++ /dev/null
@@ -1,133 +0,0 @@
-.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
-..
-.TH XScreenSaver 1 "17-Jun-97" "X Version 11"
-.SH NAME
-munch - munching squares screen hack
-.SH SYNOPSIS
-.B munch
-[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP]
-[\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install]
-[\-visual \fIvisual\fP] [\-delay \fIseconds\fP] [\-xor] [\-noxor] [\-shift]
-[\-noshift] [\-logminwidth \fIminimum width\fP]
-.SH DESCRIPTION
-The
-.I munch
-program preforms the munching squares hack until killed.  It picks square
-size, position, and gravity randomly; configurable options are listed
-below.
-.PP
-The munching squares hack cosists of drawing Y = X XOR T for a range of X
-and T over and over until all the possible combinations of X and T have
-come up.  It was reportedly discovered by Jackson Wright in 1962 and took 5
-instructions of PDP-6 code.
-.SH OPTIONS
-.I munch
-accepts the following options:
-.TP 8
-.B \-window
-Draw on a newly-created window.  This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-mono 
-If on a color display, pretend we're on a monochrome display.
-.TP 8
-.B \-install
-Install a private colormap for the window.
-.TP 8
-.B \-visual \fIvisual\fP
-Specify which visual to use.  Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-delay \fIseconds\fP
-How long to wait before starting over.  Default 5 seconds.
-.TP 8
-.B \-xor
-Use the XOR drawing function.  (Default.)
-.TP 8
-.B \-no\-xor
-Don't use the XOR drawing function.
-.TP 8
-.B \-shift
-Start drawing the square at weird starting points.  (Default.)
-.TP 8
-.B \-no\-shift
-Don't shift and start drawing the square at weird starting points.
-.TP 8
-.B \-logminwidth \fIminimum\-width\fP
-The logarithm (base 2) of the minimum with of a square (must be a power of
-2, or some parts of the square aren't.)
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1),
-.BR http://www.inwap.com/pdp10/hbaker/hakmem/hakmem.html,
-.BR http://www.comedia.com/Hot/jargon_3.0/JARGON_M/MUNCHSQR.HTML
-.SH HISTORY
-Quoted from HAKMEM, for historical interest.  As that document says, "Unless
-otherwise stated, all computer programs are in PDP-6/10 assembly language."
-.TP 8
-ITEM 146: MUNCHING SQUARES
-Another simple display program. It is thought that this was discovered by
-Jackson Wright on the RLE PDP-1 circa 1962.
-
-.EX
-    DATAI 2
-    ADDB 1,2
-    ROTC 2,-22
-    XOR 1,2
-    JRST .-4
-.EE
-.RS 8
-2=X, 3=Y. Try things like 1001002 in data switches. This also does
-interesting things with operations other than XOR, and rotations other 
-than -22. (Try IOR; AND; TSC; FADR; FDV(!); ROT -14, -9, -20, ...)
-.RE
-.TP 8
-ITEM 147 (Schroeppel):
-Munching squares is just views of the graph Y = X XOR T for consecutive
-values of T = time.
-.TP 8
-ITEM 148 (Cohen, Beeler):
-A modification to munching squares which reveals them in frozen states
-through opening and closing curtains: insert FADR 2,1 before the XOR. Try
-data switches =
-
-.EX
-    4000,,4    1000,,2002    2000,,4    0,,1002
-.EE
-.RS 8
-(Notation: <left half>,,<right half>)
-
-Also try the FADR after the XOR, switches = 1001,,1. 
-.SH COPYRIGHT
-Copyright \(co 1997 by Tim Showalter.  Permission to use, copy, modify, 
-distribute, and sell this software 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.  No representations are made about the 
-suitability of this software for any purpose.  It is provided "as is" without
-express or implied warranty.
-.SH AUTHOR
-Tim Showalter <tjs@andrew.cmu.edu>, 17-Jun-97, based on what's in the
-Jargon File and stealing stuff from existing xscreensaver modules.
diff --git a/local/man/man.1/noseguy.1 b/local/man/man.1/noseguy.1
deleted file mode 100644 (file)
index f23746b..0000000
+++ /dev/null
@@ -1,74 +0,0 @@
-.TH XScreenSaver 1 "13-aug-92" "X Version 11"
-.SH NAME
-noseguy - a little guy with a big nose wanders around being witty
-.SH SYNOPSIS
-.B noseguy
-[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-text-foreground \fIcolor\fP] [\-text-background \fIcolor\fP] [\-font \fIfont\fP] [\-window] [\-root] [\-install] [\-visual \fIvisual\fP] [\-mode \fImode\fP] [\-program \fIprogram\fP] [\-filename \file\fP] [\-text \fItext\fP]
-.SH DESCRIPTION
-A little man with a big nose and a hat runs around spewing out messages to
-the screen.  This code (and its bitmaps) were extracted from the \fIxnlock\fP
-program.
-.SH OPTIONS
-.I noseguy
-accepts the following options:
-.TP 8
-.B \-window
-Draw on a newly-created window.  This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-install
-Install a private colormap for the window.
-.TP 8
-.B \-visual \fIvisual\fP
-Specify which visual to use.  Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-font \fIfont\fP
-The font used for the messages.
-.TP 8
-.B \-mode [ program | file | string ]
-In \fIprogram\fP mode, the messages are gotten by running a program.
-The program used is controlled by the \fI\-program\fP option, and 
-the \fI.program\fP resource.
-
-In \fIfilename\fP mode, the message used is the contents of a file.
-The file used is controlled by the \fI\-file\fP option, and 
-the \fI.filename\fP resource.
-
-In \fIstring\fP mode, the message is whatever was specified on the 
-command line as the \fI\-text\fP option, or in the resource database
-as the \fI.text\fP resource.
-.TP 8
-.B \-program \fIprogram\fP
-If \fImode\fP is \fIprogram\fP (the default), then this program will be
-run periodically, and its output will be the text of the messages.  The
-default program is \fI"fortune -s"\fP, but \fIyow\fP is also a good choice.
-.TP 8
-.B \-filename \fIfile\fP
-If \fImode\fP is \fIfile\fP, then the contents of this file will be used
-for all messages.
-.TP 8
-.B \-text \fIstring\fP
-If \fImode\fP is \fIstring\fP, then this text will be used for all messages.
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1),
-.BR xnlock (1)
-.SH COPYRIGHT
-Copyright 1985, 1990 by Dan Heller <argv@sun.com>.
-.SH AUTHOR
-Dan Heller <argv@sun.com>, 1985.
-
-Ability to run standalone or with \fIxscreensaver\fP added by 
-Jamie Zawinski <jwz@jwz.org>, 13-aug-92.
diff --git a/local/man/man.1/pedal.1 b/local/man/man.1/pedal.1
deleted file mode 100644 (file)
index 7a0c3e5..0000000
+++ /dev/null
@@ -1,62 +0,0 @@
-.TH XScreenSaver 1 "24-Jun-94" "X Version 11"
-.SH NAME
-pedal - pretty geometric picture program
-.SH SYNOPSIS
-.B pedal
-[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-delay \fIseconds\fP] [-maxlines \fInumber\fP] [-fadedelay \fIuseconds\fP] [-mono] [\-install] [\-visual \fIvisual\fP]
-.SH DESCRIPTION
-The \fIpedal\fP program displays pretty geometric pictures.
-.SH OPTIONS
-.I pedal
-accepts the following options:
-.TP 8
-.B \-window
-Draw on a newly-created window.  This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-foreground \fIcolor\fP
-The color for the foreground.  Default is white.
-.TP 8
-.B \-background \fIcolor\fP
-The color for the background.  Default is black.
-.TP 8
-.B \-delay \fIseconds\fP
-The number of seconds to pause between each picture.
-.TP 8
-.B \-maxlines \fInumber\fP
-The maximum number of lines in the drawing.  Good values are
-between 20 and 2000.  Maximum value is 16K.
-.TP 8
-.B \-fadedelay \fImicroseconds\fP
-The number of micro seconds to take when fading in and out.
-.TP 8
-.B \-mono
-Don't do fading.  Pretend we're on a monochrome display.
-.PP
-To make your X server grunt under load, and to impress your
-friends, try \fIpedal -mono -delay 0 -maxlines 100\fp.
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1)
-.SH COPYRIGHT
-Copyright \(co 1994, by Carnegie Mellon University.  Permission to use,
-copy, modify, distribute, and sell this software and its documentation
-for any purpose is hereby granted without fee, provided fnord that the
-above copyright notice appear in all copies and that both that copyright
-notice and this permission notice appear in supporting documentation.
-No representations are made about the  suitability of fnord this software
-for any purpose.  It is provided "as is" without express or implied
-warranty.
-.SH AUTHOR
-Dale Moore <Dale.Moore@cs.cmu.edu>, 24-Jun-1994.
diff --git a/local/man/man.1/penrose.1 b/local/man/man.1/penrose.1
deleted file mode 100644 (file)
index e4734bf..0000000
+++ /dev/null
@@ -1,106 +0,0 @@
-.TH XScreenSaver 1 "10-May-97" "X Version 11"
-.SH NAME
-penrose - draws quasiperiodic tilings
-.SH SYNOPSIS
-.B penrose
-[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-ncolors \fIinteger\fP] [\-delay \fImicroseconds\fP] [\-redoDelay \fIseconds\fP] [\-size \fIinteger\fP] [\-ammann] [\-no\-ammann]
-
-.SH DESCRIPTION
-The \fIpenrose\fP program draws quasiperiodic tilings.
-
-See Onoda, Steinhardt, DiVincenzo and Socolar in
-Phys. Rev. Lett. 60, #25, 1988 or
-Strandburg in Computers in Physics, Sep/Oct 1991.
-
-This implementation uses the simpler version of the growth
-algorithm, i.e., if there are no forced vertices, a randomly chosen
-tile is added to a randomly chosen vertex (no preference for those
-108 degree angles).
-
-There are two essential differences to the algorithm presented in
-the literature: First, we do not allow the tiling to enclose an
-untiled area.  Whenever this is in danger of happening, we just
-do not add the tile, hoping for a better random choice the next
-time.  Second, when choosing a vertex randomly, we will take
-one that lies withing the viewport if available.  If this seems to
-cause enclosures in the forced rule case, we will allow invisible
-vertices to be chosen.
-
-Tiling is restarted whenever one of the following happens: there
-are no incomplete vertices within the viewport or the tiling has
-extended a window's length beyond the edge of the window
-horizontally or vertically or forced rule choice has failed 100
-times due to areas about to become enclosed.
-
-Although quasiperiodic tilings are produced, the tiles themselves are
-not penrose tiles (darts and kites). In contrast to penrose tiles,
-these tiles can be arranged to form a periodic tiling.
-
-.SH OPTIONS
-.I penrose
-accepts the following options:
-.TP 8
-.B \-window
-Draw on a newly-created window.  This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-mono 
-If on a color display, pretend we're on a monochrome display.
-.TP 8
-.B \-install
-Install a private colormap for the window.
-.TP 8
-.B \-visual \fIvisual\fP
-Specify which visual to use.  Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-ncolors \fIinteger\fP
-How many colors should be used (if possible).  Default 64.
-The colors are chosen randomly.
-.TP 8
-.B \-size \fIinteger\fP
-How big the tiles should be.  Default 40 pixels.
-
-.TP 8
-.B \-delay \fImilliseconds\fP
-How long (in 1/1,000,000'ths of a second) to wait between drawing each
-tile.  Default 10,000 or .01 seconds.
-
-.TP 8
-.B \-redoDelay \fIseconds\fP
-How long to wait between starting a completely new tiling.  Default 3 seconds.
-
-.TP 8
-.B \-ammann \fIinteger\fP
-.TP 8
-.B \-no\-ammann \fIinteger\fP
-Whether Ammann lines should be added.
-
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1),
-.BR xlock (1)
-.SH COPYRIGHT
-Copyright \(co 1996 by Timo Korvola.
-
-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. 
-.SH AUTHOR
-Timo Korvola <tkorvola@dopey.hut.fi>, 1996.
-
-Ability to run standalone or with \fIxscreensaver\fP added by 
-Jamie Zawinski <jwz@jwz.org>, 10-May-97.
diff --git a/local/man/man.1/pyro.1 b/local/man/man.1/pyro.1
deleted file mode 100644 (file)
index 106fc8a..0000000
+++ /dev/null
@@ -1,60 +0,0 @@
-.TH XScreenSaver 1 "13-aug-92" "X Version 11"
-.SH NAME
-pyro - simulate fireworks
-.SH SYNOPSIS
-.B pyro
-[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-count \fIinteger\fP] [\-frequency \fIinteger\fP] [\-scatter \fIinteger\fP]
-.SH DESCRIPTION
-The \fIpyro\fP program simulates fireworks, in a way similar to a Macintosh
-program of the same name.
-.SH OPTIONS
-.I pyro
-accepts the following options:
-.TP 8
-.B \-window
-Draw on a newly-created window.  This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-mono 
-If on a color display, pretend we're on a monochrome display.
-.TP 8
-.B \-install
-Install a private colormap for the window.
-.TP 8
-.B \-visual \fIvisual\fP
-Specify which visual to use.  Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-count \fIinteger\fP
-How many particles should be allowed on the screen at once.  Default 100.
-.TP 8
-.B \-frequency \fIinteger\fP
-How often new missiles should launch.  Default 30.
-.TP 8
-.B \-scatter \fIinteger\fP
-How many particles should appear when a missile explodes.  Default 20.
-The actual number used is between \fIN\fP and \fIN+(N/2)\fP.
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1)
-.SH COPYRIGHT
-Copyright \(co 1992 by Jamie Zawinski.  Permission to use, copy, modify, 
-distribute, and sell this software 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.  No representations are made about the 
-suitability of this software for any purpose.  It is provided "as is" without
-express or implied warranty.
-.SH AUTHOR
-Jamie Zawinski <jwz@jwz.org>, 13-aug-92.
diff --git a/local/man/man.1/qix.1 b/local/man/man.1/qix.1
deleted file mode 100644 (file)
index 90dd67d..0000000
+++ /dev/null
@@ -1,128 +0,0 @@
-.TH XScreenSaver 1 "27-Apr-97" "X Version 11"
-.SH NAME
-qix - bounce colored lines around a window
-.SH SYNOPSIS
-.B qix
-[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-segments \fIint\fP] [\-spread \fIpixels\fP] [\-size \fIpixels\fP] [\-count \fIint\fP] [\-color-shift \fIdegrees\fP] [\-delay \fIusecs\fP] [\-random] [\-linear] [\-solid] [\-hollow] [\-xor] [\-no\-xor] [\-transparent] [\-non\-transparent] [\-additive] [\-subtractive] [\-poly \fIint\fP] [\-gravity] [\-no\-gravity]
-.SH DESCRIPTION
-The \fIqix\fP program bounces a series of line segments around its window.
-This is truly the swiss army chainsaw of qix programs.  If you know of one
-with more display modes, I want to know about it.
-.SH OPTIONS
-.I qix
-accepts the following options:
-.TP 8
-.B \-window
-Draw on a newly-created window.  This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-mono 
-If on a color display, pretend we're on a monochrome display.
-.TP 8
-.B \-install
-Install a private colormap for the window.
-.TP 8
-.B \-visual \fIvisual\fP
-Specify which visual to use.  Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-segments \fIinteger\fP
-How many line segments should be drawn.  Default 50.
-.TP 8
-.B \-spread \fIinteger\fP
-How far apart the endpoints of one segment should be from the next.
-Default 8.
-.TP 8
-.B \-size \fIinteger\fP
-The maximum distance one endpoint of a segment is allowed to be from
-the opposite end of that segment.  Default 0, meaning unlimited.
-.TP 8
-.B \-count \fIinteger\fP
-How many qixes to draw.  Default 1.
-.TP 8
-.B \-color\-shift \fIdegrees\fP
-If on a color display, the color of the line segments will cycle through
-the spectrum.  This specifies how far the hue of each segment should be
-from the next, in degrees on the HSV wheel.  Default 3.
-.TP 8
-.B \-delay \fImicroseconds\fP
-How much of a delay should be introduced between steps of the animation.
-Default 25000, or about 0.025 seconds.
-.TP 8
-.B \-random
-The \fIqix\fP will wander around the screen semi-randomly.  This is the
-default.
-.TP 8
-.B \-linear
-The opposite of \fI\-random\fP: the \fIqix\fP will travel in straight lines
-until it reaches a wall, and then it will bounce.
-.TP 8
-.B \-solid
-If this is specified, then the area between the line segments will be filled
-in with the appropriate color, instead of the \fIqix\fP simply being composed
-of one-pixel-wide line segments.  This option looks really good in color.
-.TP 8
-.B \-hollow
-The opposite of \fI\-solid\fP; this is the default.
-.TP 8
-.B \-xor
-If this is specified, then qix segments will be drawn and erased with xor,
-instead of being drawn in some color and erased in the background color.
-This implies \fI\-mono\fP, in that only two colors can be used.
-.TP 8
-.B \-transparent
-If this is specified, and \fI\-count\fP is greater than 1, then each qix
-will be drawn in one color, and when they overlap, the colors will be mixed.
-This looks best in conjuction with \fI\-solid\fP.
-.TP 8
-.B \-non\-transparent
-Turns off \fI\-transparent\fP.
-.TP 8
-.B \-additive
-If \fI\-transparent\fP is specified, then this option means that the colors
-will be mixed using an additive color model, as if the qixes were projected
-light.  This is the default.
-.TP 8
-.B \-subtractive
-If \fI\-transparent\fP is specified, then this option means that the
-colors will be mixed using a subtractive color model, as if the qixes were
-translucent filters.
-.TP 8
-.B \-poly \fIint\fP
-How many vertices each qix-line should have: the default is 2, meaning the
-traditional qix line shape.  Three will yield triangles, and so on.
-.TP 8
-.B \-gravity
-.TP 8
-.B \-no\-gravity
-Whether there should be downward attraction.  For example, the
-options
-.B \-gravity \-linear
-will make everything move in nice smooth parabolas.
-Gravity is off by default.
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1)
-.SH COPYRIGHT
-Copyright \(co 1992 by Jamie Zawinski.  Permission to use, copy, modify, 
-distribute, and sell this software 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.  No representations are made about the 
-suitability of this software for any purpose.  It is provided "as is" without
-express or implied warranty.
-.SH AUTHOR
-Jamie Zawinski <jwz@jwz.org>, 13-aug-92.
-
-Thanks to Ariel Scolnicov for the \-poly and \-gravity options.
diff --git a/local/man/man.1/rd-bomb.1 b/local/man/man.1/rd-bomb.1
deleted file mode 100644 (file)
index 161c478..0000000
+++ /dev/null
@@ -1,98 +0,0 @@
-.TH XScreenSaver 1 "10-May-97" "X Version 11"
-.SH NAME
-rd-bomb - reaction/diffusion textures
-.SH SYNOPSIS
-.B rd-bomb
-[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP]
-[\-background \fIcolor\fP] [\-window] [\-root] [\-install]
-[\-visual \fIvisual\fP] [\-width \fIn\fP] [\-height \fIn\fP]
-[\-reaction \fIn\fP] [\-diffusion \fIn\fP]
-[\-size \fIf\fP] [\-speed \fIf\fP] [\-delay \fIusecs\fP]
-.SH DESCRIPTION
-
-The \fIrd-bomb\fP program draws reaction/diffusion textures.  The code
-is derived from the 'd' mode of the "bomb" visual musical instrument
-(see http://www.cs.cmu.edu/~spot/bomb.html).  I got the equations from
-xmorphia (http://www.ccsf.caltech.edu/ismap/image.html), which is
-based on a version of the Gray-Scott model taken from:
-    John E. Pearson "Complex Patterns in a Simple System"
-    Science, 261,189, 9 July 1993.
-
-If the frame-rate is too low, consider decreasing the width and height
-of the tile, or decreasing the size of the active part of the screen.
-
-.SH OPTIONS
-
-If one of the reaction, diffusion, radius, and palette options is set
-to a negative value, then that option will be set to a random
-appropriate value.
-
-Be sure to try "-speed 1 -size 0.1 -epoch 3000".
-
-.I rd-bomb
-accepts the following options:
-.TP 8
-.B \-window
-Draw on a newly-created window.  This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-install
-Install a private colormap for the window.
-.TP 8
-.B \-visual \fIvisual\fP
-Specify which visual to use.  Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-width \fIn\fP
-.TP 8
-.B \-height \fIn\fP
-Specify the size of the tile, in pixels.
-.TP 8
-.B \-reaction \fIn\fP
-.TP 8
-.B \-diffusion \fIn\fP
-These are constants in the equations that effect its visual nature.
-Each may be one of 0, 1, or 2.  
-.TP 8
-.B \-radius \fIn\fP
-Size of the seed.
-.TP 8
-.B \-palette \fIn\fP
-Selects a palette.  Must be between 0 and 80, inclusive.
-.TP 8
-.B \-size \fIf\fP
-What fraction of the window is actively drawn, a floating point number
-between 0 (exclusive) and 1 (inclusive).  Default is 0.66.
-.TP 8
-.B \-speed \fIf\fP
-When a fraction of the screen is active, the active area moves at this
-rate (a floating point number).  Default is zero.  Suggested value: 1.0.
-.TP 8
-.B \-delay \fIusecs\fP
-How many microseconds to delay between frames; default 1000, or 
-about 1/1000th of a second.
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1),
-.BR xlock (1)
-.SH COPYRIGHT
-Copyright \(co 1997 by Scott Draves.
-
-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. 
-.SH AUTHOR
-Scott Draves <spot@cs.cmu.edu>, 9/97
diff --git a/local/man/man.1/rocks.1 b/local/man/man.1/rocks.1
deleted file mode 100644 (file)
index 1d39130..0000000
+++ /dev/null
@@ -1,86 +0,0 @@
-.TH XScreenSaver 1 "13-aug-92" "X Version 11"
-.SH NAME
-rocks - animation of flying through an asteroid field
-.SH SYNOPSIS
-.B rocks
-[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-ncolors \fIn\fP] [\-install] [\-visual \fIvisual\fP] [\-count \fIinteger\fP] [\-delay \fIusecs\fP] [\-speed \fIinteger\fP] [\-norotate] [\-nomove] [\-3d]
-.SH DESCRIPTION
-The \fIrocks\fP program draws an animation of an asteroid field moving past
-the observer (or vice versa).  Sometimes the observer picks up spin on Z axis.
-.SH OPTIONS
-.I rocks
-accepts the following options:
-.TP 8
-.B \-window
-Draw on a newly-created window.  This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-mono
-Make all the rocks the same color.
-.TP 8
-.B \-ncolors colors
-How many different colors to use.  Default 5.  Colors are chosen randomly.
-.TP 8
-.B \-install
-Install a private colormap for the window.
-.TP 8
-.B \-visual \fIvisual\fP
-Specify which visual to use.  Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-count \fIinteger\fP
-Maximum number of rocks to draw on the screen at once.  Default 100.
-.TP 8
-.B \-speed \fIinteger\fP
-A measure of the speed with which the observer and the rocks pass each other,
-from 1 to 100.  Default 100, meaning ``very fast.''  If you're on a slow 
-display connection (the animation looks jerky) then try making this number 
-smaller, and/or decreasing the number of rocks.
-.TP 8
-.B \-delay \fImicroseconds\fP
-Number of microseconds to delay between each frame.  Default 50000, meaning
-about 1/20th second.  Compare and contrast with \fI\-speed\fP, above.
-.TP 8
-.B \-norotate
-Don't rotate the observer; just fly through the field on the level.
-.TP 8
-.B \-nomove
-Don't turn the observer; just fly straight ahead through the field.
-.TP 8
-.B \-3d
-Do red/blue 3d separations: if you look at the screen with 3d glasses,
-the rocks will be \fIjumping\fP right \fIout\fP at you.  Oooooh, scaaary!
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1)
-.SH BUGS
-There should be an option to display doppler shift (a gravity rainbow.)
-
-Speed of rotation should be settable.
-
-Default speed of rotation should be relative to forward velocity.
-.SH COPYRIGHT
-Copyright \(co 1992 by Jamie Zawinski.  Permission to use, copy, modify, 
-distribute, and sell this software 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.  No representations are made about the 
-suitability of this software for any purpose.  It is provided "as is" without
-express or implied warranty.
-.SH AUTHOR
-Based on Lisp Machine code copyright 1988 John Nguyen <johnn@hx.lcs.mit.edu>.
-
-Ported to C and X by Jamie Zawinski <jwz@jwz.org>, 13-aug-92.
-
-Steering code by Jeremie Petit; 3D code by theiling@coli.uni-sb.de.
diff --git a/local/man/man.1/rorschach.1 b/local/man/man.1/rorschach.1
deleted file mode 100644 (file)
index 56a6c48..0000000
+++ /dev/null
@@ -1,75 +0,0 @@
-.TH XScreenSaver 1 "13-aug-92" "X Version 11"
-.SH NAME
-rorschach - simulate ink-blot patterns
-.SH SYNOPSIS
-.B rorschach
-[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-iterations \fIinteger\fP] [\-offset \fIinteger\fP] [\-xsymmetry] [\-ysymmetry] [\-erase\-mode \fIinteger\fP] [\-erase\-speed \fIusecs\fP] [\-delay \fIsecs\fP]
-.SH DESCRIPTION
-The \fIrorschach\fP program draws random patterns reminiscent of the
-psychological test of same name.
-.SH OPTIONS
-.I rorschach
-accepts the following options:
-.TP 8
-.B \-window
-Draw on a newly-created window.  This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-mono 
-If on a color display, pretend we're on a monochrome display.
-.TP 8
-.B \-install
-Install a private colormap for the window.
-.TP 8
-.B \-visual \fIvisual\fP
-Specify which visual to use.  Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-iterations \fIinteger\fP
-How many dots should be drawn each time.  Default 4000.
-.TP 8
-.B \-offset \fIinteger\fP
-How far apart the dots should be.  Default 4 pixels.
-.TP 8
-.B \-xsymmetry
-Whether the images should be horizontally symmetrical.  Default true.
-.TP 8
-.B \-ysymmetry
-Whether the images should be vertically symmetrical.  Default false.
-.TP 8
-.B \-erase\-mode \fIinteger\fP
-This sets the erase mode. Mode \-1 chooses a random mode each time. There
-are currently 6 modes defined (0\-5).
-.TP 8
-.B \-erase\-speed \fIusecs\fP
-This controls the speed at which the screen will be erased. (Delay between
-erasing of individual lines.)
-.TP 8
-.B \-delay \fIseconds\fP
-This sets the number of seconds that the figure will be on the screen.
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH BUGS
-May call your sanity into question.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1)
-.SH COPYRIGHT
-Copyright \(co 1992 by Jamie Zawinski.  Permission to use, copy, modify, 
-distribute, and sell this software 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.  No representations are made about the 
-suitability of this software for any purpose.  It is provided "as is" without
-express or implied warranty.
-.SH AUTHOR
-Jamie Zawinski <jwz@jwz.org>, 13-aug-92.
diff --git a/local/man/man.1/sierpinski.1 b/local/man/man.1/sierpinski.1
deleted file mode 100644 (file)
index f3fdb34..0000000
+++ /dev/null
@@ -1,65 +0,0 @@
-.TH XScreenSaver 1 "10-May-97" "X Version 11"
-.SH NAME
-sierpinski - draws Sierpinski triangle fractals
-.SH SYNOPSIS
-.B sierpinski
-[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-ncolors \fIinteger\fP] [\-delay \fImicroseconds\fP] [\-cycles \fIinteger\fP] [\-count \fIinteger\fP]
-
-.SH DESCRIPTION
-The \fIsierpinski\fP program draws Sierpinski triangle fractals.
-.SH OPTIONS
-.I sierpinski
-accepts the following options:
-.TP 8
-.B \-window
-Draw on a newly-created window.  This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-mono 
-If on a color display, pretend we're on a monochrome display.
-.TP 8
-.B \-install
-Install a private colormap for the window.
-.TP 8
-.B \-visual \fIvisual\fP
-Specify which visual to use.  Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-ncolors \fIinteger\fP
-How many colors should be used (if possible).  Default 64.
-The colors are chosen randomly.
-.TP 8
-.B \-cycles \fIinteger\fP
-
-.TP 8
-.B \-count \fIinteger\fP
-
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1),
-.BR xlock (1)
-.SH COPYRIGHT
-Copyright \(co 1996 by Desmond Daignault.
-
-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. 
-.SH AUTHOR
-Desmond Daignault <tekdd@dtol.datatimes.com>, 05-Sep-96.  (Original 
-xlock version was called tri.c.)
-
-Ability to run standalone or with \fIxscreensaver\fP added by 
-Jamie Zawinski <jwz@jwz.org>, 10-May-97.  (Renamed to sierpinski.)
diff --git a/local/man/man.1/slidescreen.1 b/local/man/man.1/slidescreen.1
deleted file mode 100644 (file)
index a3e9d90..0000000
+++ /dev/null
@@ -1,92 +0,0 @@
-.TH XScreenSaver 1 "24-Nov-97" "X Version 11"
-.SH NAME
-slidescreen - permute the screen image like an 8-puzzle
-.SH SYNOPSIS
-.B slidescreen
-[\-display \fIhost:display.screen\fP] [\-background \fIcolor\fP] [\-grid-size \fIpixels\fP] [\-ibw \fIpixels\fP] [\-increment \fIpixels\fP] [\-delay \fIusecs\fP] [\-delay2 \fIusecs\fP] [\-window] [\-root] [\-install] [\-visual \fIvisual\fP]
-.SH DESCRIPTION
-The \fIslidescreen\fP program takes an image of the screen, divides it into
-a grid, deletes a random square of that grid, and then randomly slides 
-one of the neighbors of this "hole" into the hole (and repeat.)
-.SH OPTIONS
-.I slidescreen
-accepts the following options:
-.TP 8
-.B \-window
-Draw on a newly-created window.  This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-install
-Install a private colormap for the window.
-.TP 8
-.B \-visual \fIvisual\fP
-Specify which visual to use.  Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-grid-size \fIpixels\fP
-The size of the grid cells.  Default 70 pixels.
-.TP 8
-.B \-ibw \fIpixels\fP
-The size of the "gutter" between grid cells.  Default 1 pixel.
-.TP 8
-.B \-increment \fIpixels\fP
-How many pixels by which a piece should be moved when sliding to a new 
-location.  Default 10 pixels.
-.TP 8
-.B \-delay \fImicroseconds\fP
-How much of a delay should be introduced between steps of the animation of
-the motion of each segment.  Default 50000, which is 0.05 seconds.  This
-is closely related to the \fI\-increment\fP parameter.
-.TP 8
-.B \-delay \fImicroseconds\fP
-How much of a delay should be introduced between the end of the motion of
-one segment and the beginning of the motion of another.  Default 1000000,
-which is one second.
-.SH RESOURCES
-On some systems (currently, only SGIs), this program can, instead of grabbing
-a desktop image, grab a frame of video from an external camera and manipulate
-that instead.  The following resources control that.
-.PP
-.TP 8
-.B grabVideoProbability \fR(Float)\fP
-What portion of the time to grab video rather than a screen image, 
-between 0.0 and 1.0.  Defaults to 0.5, or half the time.
-.TP 8
-.B videoDevice \fR(Integer)\fP
-The number of the default video input device to check first.  If unspecified, 
-the default camera (from videopanel(1)) will be checked first.  After that, all
-other available video input devices will be checked in order.  
-
-The first one which produces a non-black image will be used.  If all images
-are black, the others will be re-checked a few times before giving up and
-falling back to simply grabbing a desktop image (but note that this takes a
-few seconds, so if you don't actually have any video sources hooked up, you
-should consider turning off video grabbing by setting
-\fBgrabVideoProbability\fP to 0.0.)
-.TP 8
-.B videoGain \fR(Float)\fP
-The amount by which to brighten the grabbed image.  This defaults to 2.2.
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1)
-.SH COPYRIGHT
-Copyright \(co 1992 by Jamie Zawinski.  Permission to use, copy, modify, 
-distribute, and sell this software 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.  No representations are made about the 
-suitability of this software for any purpose.  It is provided "as is" without
-express or implied warranty.
-.SH AUTHOR
-Jamie Zawinski <jwz@jwz.org>, 3-dec-92.
diff --git a/local/man/man.1/slip.1 b/local/man/man.1/slip.1
deleted file mode 100644 (file)
index d513654..0000000
+++ /dev/null
@@ -1,93 +0,0 @@
-.TH XScreenSaver 1 "24-Nov-97" "X Version 11"
-.SH NAME
-slip - sucks your screen into a jet engine
-.SH SYNOPSIS
-.B slip
-[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-ncolors \fIinteger\fP] [\-iterations \fIinteger\fP] [\-points \fIinteger\fP] [\-delay \fImicroseconds\fP] [\-delay2 \fImicroseconds\fP]
-.SH DESCRIPTION
-The \fIslip\fP program does lots of blits and chews up your screen image.
-.SH OPTIONS
-.I slip
-accepts the following options:
-.TP 8
-.B \-window
-Draw on a newly-created window.  This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-mono 
-If on a color display, pretend we're on a monochrome display.
-.TP 8
-.B \-install
-Install a private colormap for the window.
-.TP 8
-.B \-visual \fIvisual\fP
-Specify which visual to use.  Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-ncolors \fIinteger\fP
-How many colors should be used (if possible).  Default 128.
-The colors used cycle through the hue, making N stops around 
-the color wheel.
-.TP 8
-.B \-count \fIinteger\fP
-How many whooziwhatsis to generate.  Default 35.
-.TP 8
-.B \-cycles \fIinteger\fP
-How long to frobnicate.  Default 50.
-.TP 8
-.B \-delay \fImicroseconds\fP
-How long we should wait between drawing each step.  Default 50000,
-or about 1/20th second.
-
-.SH RESOURCES
-On some systems (currently, only SGIs), this program can, instead of grabbing
-a desktop image, grab a frame of video from an external camera and manipulate
-that instead.  The following resources control that.
-.PP
-.TP 8
-.B grabVideoProbability \fR(Float)\fP
-What portion of the time to grab video rather than a screen image, 
-between 0.0 and 1.0.  Defaults to 0.5, or half the time.
-.TP 8
-.B videoDevice \fR(Integer)\fP
-The number of the default video input device to check first.  If unspecified, 
-the default camera (from videopanel(1)) will be checked first.  After that, all
-other available video input devices will be checked in order.  
-
-The first one which produces a non-black image will be used.  If all images
-are black, the others will be re-checked a few times before giving up and
-falling back to simply grabbing a desktop image (but note that this takes a
-few seconds, so if you don't actually have any video sources hooked up, you
-should consider turning off video grabbing by setting
-\fBgrabVideoProbability\fP to 0.0.)
-.TP 8
-.B videoGain \fR(Float)\fP
-The amount by which to brighten the grabbed image.  This defaults to 2.2.
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1),
-.BR xlock (1)
-.SH COPYRIGHT
-Copyright \(co 1992 by Scott Draves.
-
-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. 
-.SH AUTHOR
-Scott Graves <spot@cs.cmu.edu>.
-
-Ability to run standalone or with \fIxscreensaver\fP added by 
-Jamie Zawinski <jwz@jwz.org>, 18-Oct-93.
diff --git a/local/man/man.1/sonar.1 b/local/man/man.1/sonar.1
deleted file mode 100644 (file)
index 1313972..0000000
+++ /dev/null
@@ -1,185 +0,0 @@
-.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
-..
-.TH Sonar 1 "3-Nov-98" "X Version 11"
-.SH NAME
-sonar - display a sonar scope
-.SH SYNOPSIS
-.B sonar
-[\-background \fIcolor\fP]
-[\-sweep\-color \fIcolor\fP]
-[\-low\-color \fIcolor\fP] 
-[\-scope\-color \fIcolor\fP]
-[\-grid\-color \fIcolor\fP]
-[\-text\-color \fIcolor\fP]
-[\-ttl \fIinteger\fP]
-[\-mode ping]
-[\-font \fIfont\fP]
-[\-ping\-timeout \fIint\fP]
-[\-ping\-source list | file | subnet ] 
-[\-ping\-file \fIhosts-file\fP]
-[\-ping\-list \fIhost-name-list\fP]
-[\-team-a-name \fIstring\fP] 
-[\-team-b-name \fIstring\fP]
-[\-team-a-count \fIint\fP]
-[\-team-b-count \fIint\fP]
-.SH DESCRIPTION
-The \fIsonar\fP program displays a sonar scope on the computer's screen.
-This scope polls a sensor as the sweep goes around the scope and displays
-what it finds as bogies on the screen.  The program is designed to support
-different modes representing different types of sensors.  Currently the
-only implemented sensors are a simulator, and a network ping function that
-pings hosts and plots the results on the scope.
-.SH OPTIONS
-.I sonar
-understands the following options:
-.TP 8
-.B \-background \fIColor\fP
-The background Color of the screen not covered by the scope.
-.TP 8
-.B \-sweep\-color \fIColor\fP
-The color of the brightest part of the sweep.
-.TP 8
-.B \-scope\-color \fIColor\fP
-The color of the circular part of the scope.
-.TP 8
-.B \-grid\-color \fIColor\fP
-The color to the grid lines overlaying the scope.
-.TP 8
-.B \-text\-color \fIColor\fP
-The color of the text identifying bogies on the scope.
-.TP 8
-.B \-ttl \fIinteger\fP
-"Time to live": visible time of a Bogie. Try values between 10 (very short)
-and 100. 
-.TP 8
-.B \-mode \fIsimulation | ping\fP
-The sensor mode to use, the currently supported modes \fIsimulate\fP (the
-default) and \fIping\fP.
-.TP 8
-.B \-font \fIfont\fP
-The font used to display text on the scope.  Default "fixed".
-.TP 8
-.B \-ping\-timeout \fIint\fP
-The amount of time in milliseconds the program will wait for an answer
-to a ping.
-.TP 8
-.B \-ping\-source list | file | subnet
-Th source of the list of hosts to ping. Valid values are: \fIlist\fP,
-\fIfile\fP, \fIsubnet\fP.  The first two values are described below;
-and \fIsubnet\fP indicates that the sonar should ping all hosts in the
-same subnet as the current machine.  (All addresses are treated
-as class C nets, therefore this will at most ping 254 hosts.)
-.TP 8
-.B \-ping\-file \fIfilename\fP
-The path to a file listing the hosts to ping.  This file can be in the
-format used by \fI/etc/hosts\fP, or it can be any file that has host
-names as the first element on each line.  If you use ssh, try this:
-.EX
-sonar -mode ping -ping-file $HOME/.ssh/known_hosts
-.EE
-This is used only used when \fIpingSource\fP is set to \fBfile\fP.
-.TP 8
-.B \-ping\-list \fIlist\fP
-A comma separated list of hostnames, eg \fI"pinky,brain,dot"\fP.
-Only used when \fIpingSource\fP is set to \fBlist\fP.
-.TP 8
-.B \-team-a-name \fIstring\fP
-The name of team A, in simulation-mode.
-.TP 8
-.B \-team-b-name \fIstring\fP
-The name of team B, in simulation-mode.
-.TP 8
-.B \-team-a-count \fIint\fP
-The number of bogies on team A, in simulation-mode.
-.TP 8
-.B \-team-b-count \fIint\fP
-The number of bogies on team B, in simulation-mode.
-.SH RESOURCES
-Configuration of the targets to ping is best done by setting X Resources.
-.PP
-.TP 8
-.B background \fI(Color)\fP
-See option \-background, above; default value is \fIblack\fP.
-.TP 8
-.B sweepColor \fI(Color)\fP
-See option \-sweep\-color, above; default value is \fI#00ff00\fP.
-.TP 8
-.B scopeColor \fI(Color)\fP
-See option \-scope\-color, above; default value is \fI#003300\fP.
-.TP 8
-.B gridColor \fI(Color)\fP
-See option \-grid\-color, above; default value is \fI#00aa00\fP.
-.TP 8
-.B textColor \fI(Color)\fP
-See option \-text\-color, above; default value is \fI#ffff00\fP.
-.TP 8
-.B ttl \fI(integer)\fP
-See option \-ttl, above; default value is \fI90\fP or one sweep.
-.TP 8
-.B mode \fI(ping)\fP
-See option \-mode, above.  If set to \fBdefault\fP, it will ping hosts if
-possible, otherwise, will run in simulation-mode.
-.TP 8
-.B font \fI(font)\fP
-See option \-font, above; default value is \fIfixed\fP.
-.TP 8
-.B pingTimeout \fI(Integer)\fP
-See option \-pingtimeout, above; default value is 3000.
-.TP 8
-.B pingSource \fIlist | file | subnet\fP
-See option \-ping\-source, above.  Default value is \fIfile\fP.
-.TP 8
-.B pingFile \fIpathname\fP
-See option \-ping\-file, above.  Default value is \fI/etc/hosts\fP.
-.TP 8
-.B pingList \fIhost,host,host...\fP
-See option \-ping\-list, above; default value is \fBlocalhost\fP.
-.TP 8
-.B teamAName \fIstring\fP
-See option \-team\-a\-name, above.  Default value is \fBF18\fP.
-.TP 8
-.B teamBName \fIstring\fP
-See option \-teamBName, above.  Default value is \fBMIG\fP.
-.TP 8
-.B teamACount \fIint\fP
-See option \-teamACount, above.  Default value is 4.
-.TP 8
-.B teamBCount \fIint\fP
-See option \-teamBCount, above.  Default value is 4.
-.SH NOTES
-In order to use the ping sensor, this program must be installed as 
-setuid root, so that it can create an ICMP socket.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1),
-.BR ping (8)
-.SH COPYRIGHT
-Copyright \(co 1998 by Stephen Martin. (smartin@canada.com)
-
-Permission to use, copy, modify, distribute, and sell this software 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.  No representations are made about the suitability of this
-software for any purpose.  It is provided "as is" without express or 
-implied warranty.
-
-.SH AUTHORS
-Stephen Martin <smartin@canada.com>, 3-nov-98.
-
-Thanks to Tom Kelly for suggesting a modular approach to the sensor
-amoung other things.
-
-Thomas Bahls <thommy@cs.tu-berlin.de> hacked the "ttl" option, 12-jul-98.
-
diff --git a/local/man/man.1/sphere.1 b/local/man/man.1/sphere.1
deleted file mode 100644 (file)
index 1632ab9..0000000
+++ /dev/null
@@ -1,58 +0,0 @@
-.TH XScreenSaver 1 "27-May-97" "X Version 11"
-.SH NAME
-sphere - draws shaded spheres
-.SH SYNOPSIS
-.B sphere
-[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-ncolors \fIinteger\fP] [\-delay \fImicroseconds\fP]
-
-.SH DESCRIPTION
-The \fIsphere\fP program draws shaded spheres.
-.SH OPTIONS
-.I sphere
-accepts the following options:
-.TP 8
-.B \-window
-Draw on a newly-created window.  This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-mono 
-If on a color display, pretend we're on a monochrome display.
-.TP 8
-.B \-install
-Install a private colormap for the window.
-.TP 8
-.B \-visual \fIvisual\fP
-Specify which visual to use.  Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-ncolors \fIinteger\fP
-How many colors should be used (if possible).  Default 64.
-The colors are chosen randomly.
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1),
-.BR xlock (1)
-.SH COPYRIGHT
-Copyright \(co 1988 by Sun Microsystems, Inc.
-
-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. 
-.SH AUTHOR
-Sun Microsystems, Inc, 1988.
-
-Ability to run standalone or with \fIxscreensaver\fP added by 
-Jamie Zawinski <jwz@jwz.org>, 27-May-97.
diff --git a/local/man/man.1/spiral.1 b/local/man/man.1/spiral.1
deleted file mode 100644 (file)
index a32db1e..0000000
+++ /dev/null
@@ -1,67 +0,0 @@
-.TH XScreenSaver 1 "10-May-97" "X Version 11"
-.SH NAME
-spiral - draws moving circular spiral patterns
-.SH SYNOPSIS
-.B spiral
-[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-ncolors \fIinteger\fP] [\-delay \fImicroseconds\fP] [\-count \fIinteger\fP]
-
-.SH DESCRIPTION
-The \fIspiral\fP program draws moving circular spiral patterns
-.SH OPTIONS
-.I spiral
-accepts the following options:
-.TP 8
-.B \-window
-Draw on a newly-created window.  This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-mono 
-If on a color display, pretend we're on a monochrome display.
-.TP 8
-.B \-install
-Install a private colormap for the window.
-.TP 8
-.B \-visual \fIvisual\fP
-Specify which visual to use.  Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-ncolors \fIinteger\fP
-How many colors should be used (if possible).  Default 64.
-The colors are chosen randomly.
-.TP 8
-.B \-count \fIinteger\fP
-Default 40.
-.TP 8
-.B \-cycles \fIinteger\fP
-Default 350.
-
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1),
-.BR xlock (1)
-.SH COPYRIGHT
-Copyright \(co 1994 by Darrick Brown.
-
-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. 
-.SH AUTHOR
-Darrick Brown, 1994.
-
-Improved by Peter Schmitzberger <schmitz@coma.sbg.ac.at>, 24-Jul-95.
-
-Ability to run standalone or with \fIxscreensaver\fP added by 
-Jamie Zawinski <jwz@jwz.org>, 10-May-97.
diff --git a/local/man/man.1/spotlight.1 b/local/man/man.1/spotlight.1
deleted file mode 100644 (file)
index 31e9f71..0000000
+++ /dev/null
@@ -1,57 +0,0 @@
-.TH XScreenSaver 1 "05-Apr-1999" "X Version 11"
-.SH NAME
-spotlight - move spotlight around desktop
-.SH SYNOPSIS
-.B spotlight
-[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-delay \fIusecs\fP] [\-radius \fIpixels\fP]
-.SH DESCRIPTION
-The \fIspotlight\fP program draws random rectangles.
-.SH OPTIONS
-.I spotlight
-accepts the following options:
-.TP 8
-.B \-window
-Draw on a newly-created window.  This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-mono 
-If on a color display, pretend we're on a monochrome display.
-.TP 8
-.B \-install
-Install a private colormap for the window.
-.TP 8
-.B \-visual \fIvisual\fP
-Specify which visual to use.  Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-delay \fImicroseconds\fP
-Slow it down.
-.TP 8
-.B \-radius \fIpixels\fP
-Radius of the spotlight in pixels.
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1)
-.SH COPYRIGHT
-Copyright \(co 1999 by Rick Schultz.  Permission to use, copy, modify, 
-distribute, and sell this software 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.  No representations are made about the 
-suitability of this software for any purpose.  It is provided "as is" without
-express or implied warranty.
-.SH CREDITS
-Hacked together by Rick Schultz <rick@skapunx.net>, based on StefView for
-BackSpace by Darcy Brockbank and on several other xscreensaver hacks.
-
diff --git a/local/man/man.1/squiral.1 b/local/man/man.1/squiral.1
deleted file mode 100644 (file)
index 9e3ce5f..0000000
+++ /dev/null
@@ -1,76 +0,0 @@
-.TH XScreenSaver 1 "18-mar-1999" "X Version 11"
-.SH NAME
-squiral - square spirals screensaver
-.SH SYNOPSIS
-.B squiral
-[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP]
-[\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install]
-[\-noinstall] [\-visual \fIvisual\fP] [\-fill \fIpercent\fP] [-count
-\fInumber\fP] [-delay \fIusec\fP] [-disorder \fIfraction\fP] [-handedness
-\fIfraction\fP] [-cycle]
-.SH DESCRIPTION
-The \fIsquiral\fP program displays interacting, spiral-producing automata
-
-.SH OPTIONS
-.I squiral
-accepts the following options:
-.TP 8
-.B \-window
-Draw on a newly-created window.  This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-mono 
-If on a color display, pretend we're on a monochrome display.
-.TP 8
-.B \-install
-Install a private colormap for the window.
-.TP 8
-.B \-visual \fIvisual\fP
-Specify which visual to use.  Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-fill \fIpercent\fP
-Specify the percent (0-100) of the screen which must be filled before
-the screen is cleared.  60-80 percent are good values.
-.TP 8
-.B \-count \fInumber\fP
-The number of squiralies.  By default, the screen width divided by 32.
-.TP 8
-.B \-delay \fIusec\fP
-The wait between steps.  The default is 1000.
-.TP 8
-.B \-disorder \fIfraction\fP
-The fraction of the time a squiraly will choose a new direction.
-The default is 0.005.
-.TP 8
-.B \-handedness \fIfraction\fP
-The fraction of the time a squiraly will choose to enter lefthanded
-mode.  0.0 means exclusively right-handed behavior, 0.5 (the default) is
-a balance between the two, and 1.0 is exclusively left-handed behaviour.
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH BUGS
-None known
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1)
-.SH COPYRIGHT
-Copyright \(co 1999, by Jeff Epler.  Permission to use, copy, modify, 
-distribute, and sell this software and its documentation for any purpose is 
-hereby granted without fee, provided fnord that the above copyright notice 
-appear in all copies and that both that copyright notice and this permission 
-notice appear in supporting documentation.  No representations are made about
-the  suitability of fnord this software for any purpose.  It is provided "as
-is" without express or fnord implied warranty.
-.SH AUTHOR
-Jeff Epler <jepler@inetnebr.com>, 18-mar-1999
-
diff --git a/local/man/man.1/starfish.1 b/local/man/man.1/starfish.1
deleted file mode 100644 (file)
index 63c70d4..0000000
+++ /dev/null
@@ -1,89 +0,0 @@
-.TH XScreenSaver 1 "14-Jun-97" "X Version 11"
-.SH NAME
-starfish - radially-symmetric throbbing colormap-hacking graphics demo
-.SH SYNOPSIS
-.B starfish
-[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-delay \fIusecs\fP] [\-delay2 \fIsecs\fP] [\-cycle\-delay2 \fIusecs\fP] [\-thickness \fIpixels\fP] [\-rotation \fIdegrees\fP] [\-duration \fIseconds\fP] [\-colors \fIint\fP] [\-cycle] [\-no\-cycle] [\-blob] [\-no\-blob]
-.SH DESCRIPTION
-The \fIstarfish\fP program draws radially symmetric objects, which expand,
-contract, rotate, and turn inside out.  It uses these shapes to lay down a
-field of smooth colors, and then rotates the colormap.
-.SH OPTIONS
-.I starfish
-accepts the following options:
-.TP 8
-.B \-window
-Draw on a newly-created window.  This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-mono 
-If on a color display, pretend we're on a monochrome display.
-.TP 8
-.B \-install
-Install a private colormap for the window.
-.TP 8
-.B \-visual \fIvisual\fP
-Specify which visual to use.  Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-delay \fImicroseconds\fP
-How much of a delay should be introduced between steps of the animation.
-Default 10000, or about 1/100th second.
-.TP 8
-.B \-cycle\-delay \fImicroseconds\fP
-How long to wait between shifing the colormap by one step.
-Default 100000, or about 1/10th second.
-.TP 8
-.B \-thickness \fIpixels\fP
-How wide each color band should be.  Default 0, meaning random (the chosen
-value will be between 0 and 15.)
-.TP 8
-.B \-rotation \fIdegrees\fP
-How quickly the objects should rotate at each step.  Default 0, meaning 
-random (the chosen value will be between 0 and 12 degrees.)
-.TP 8
-.B \-colors \fIint\fP
-How many colors to use.  Default 200.  The more colors, the smoother the
-transitions will be, and the nicer the resultant images.
-.TP 8
-.B \-cycle
-.TP 8
-.B \-no\-cycle
-Whether to do colormap cycling.  Default true.
-.TP 8
-.B \-duration \fIseconds\fP
-How long to run before choosing a new shape.  Default 30 seconds.
-.TP 8
-.B \-delay2 \fIseconds\fP
-When \fIduration\fP expires, how long to wait before starting a new run.
-Default 5 seconds.
-.TP 8
-.B \-blob
-.TP 8
-.B \-no\-blob
-If \fIblob\fP option is specified, then the raw shapes will be shown, 
-instead of a field of colors generated from them.
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1)
-.SH COPYRIGHT
-Copyright \(co 1997 by Jamie Zawinski.  Permission to use, copy, modify, 
-distribute, and sell this software 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.  No representations are made about the 
-suitability of this software for any purpose.  It is provided "as is" without
-express or implied warranty.
-.SH AUTHOR
-Jamie Zawinski <jwz@jwz.org>, 14-Jun-97.
diff --git a/local/man/man.1/strange.1 b/local/man/man.1/strange.1
deleted file mode 100644 (file)
index 088a9ee..0000000
+++ /dev/null
@@ -1,58 +0,0 @@
-.TH XScreenSaver 1 "10-May-97" "X Version 11"
-.SH NAME
-strange - draws strange attractors
-.SH SYNOPSIS
-.B strange
-[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-ncolors \fIinteger\fP] [\-delay \fImicroseconds\fP]
-
-.SH DESCRIPTION
-The \fIstrange\fP program draws strange attractors
-.SH OPTIONS
-.I strange
-accepts the following options:
-.TP 8
-.B \-window
-Draw on a newly-created window.  This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-mono 
-If on a color display, pretend we're on a monochrome display.
-.TP 8
-.B \-install
-Install a private colormap for the window.
-.TP 8
-.B \-visual \fIvisual\fP
-Specify which visual to use.  Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-ncolors \fIinteger\fP
-How many colors should be used (if possible).  Default 64.
-The colors are chosen randomly.
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1),
-.BR xlock (1)
-.SH COPYRIGHT
-Copyright \(co 1997 by Massimino Pascal.
-
-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. 
-.SH AUTHOR
-Massimino Pascal <Pascal.Massimon@ens.fr>, 1997.
-
-Ability to run standalone or with \fIxscreensaver\fP added by 
-Jamie Zawinski <jwz@jwz.org>, 10-May-97.
diff --git a/local/man/man.1/swirl.1 b/local/man/man.1/swirl.1
deleted file mode 100644 (file)
index c36733f..0000000
+++ /dev/null
@@ -1,64 +0,0 @@
-.TH XScreenSaver 1 "13-May-97" "X Version 11"
-.SH NAME
-swirl - draws swirly color-cycling patterns
-.SH SYNOPSIS
-.B swirl
-[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-ncolors \fIinteger\fP] [\-delay \fImicroseconds\fP] [\-cycles \fIinteger\fP] [\-count \fIinteger\fP]
-
-.SH DESCRIPTION
-The \fIswirl\fP program draws swirly color-cycling patterns.
-.SH OPTIONS
-.I swirl
-accepts the following options:
-.TP 8
-.B \-window
-Draw on a newly-created window.  This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-mono 
-If on a color display, pretend we're on a monochrome display.
-.TP 8
-.B \-install
-Install a private colormap for the window.
-.TP 8
-.B \-visual \fIvisual\fP
-Specify which visual to use.  Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-ncolors \fIinteger\fP
-How many colors should be used (if possible).  Default 200.
-.TP 8
-.B \-cycles \fIinteger\fP
-
-.TP 8
-.B \-count \fIinteger\fP
-
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1),
-.BR xlock (1)
-.SH COPYRIGHT
-Copyright \(co 1994 M. Dobie.
-
-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. 
-
-.SH AUTHOR
-M.Dobie <mrd@ecs.soton.ac.uk>, 1994.
-
-Ability to run standalone or with \fIxscreensaver\fP added by 
-Jamie Zawinski <jwz@jwz.org>, 13-May-97.
diff --git a/local/man/man.1/t3d.1 b/local/man/man.1/t3d.1
deleted file mode 100644 (file)
index 54ef3fd..0000000
+++ /dev/null
@@ -1,129 +0,0 @@
-.TH t3d 1 "Version 1.1" "Time 3D"
-.SH NAME
-t3d \- clock using flying balls to display the time
-.SH SYNOPSIS
-t3d [ \f2 options\f1 ]...
-.SH DESCRIPTION
-.PP
-Time 3D is a clock. It uses flying balls to display the time. This
-balls move and wobble around to give you the impression your
-graphic workstation with its many XStones is doing something.
-.PP
-t3d uses mouse and keyboard to let you fly through the balls. Hit
-.B S
-to speed up, 
-.B A
-to slow down,
-.B Z
-to zoom in and
-.B X
-to zoom out.
-Use the
-.B left mouse button
-to rotate to the left and the
-.B right mouse button
-to rotate the view to the right. Use the
-.B middle mouse button
-to change the optical axis and the moving direction.
-.B 0
-(zero) will stop you.
-.B Q
-quits.
-.PP
-.SH OPTIONS
-.TP
-.BI "-move " "factor"
-Modifies the direction move of t3d. The clock looks 30 degrees*
-.I factor
-to the left and to the right periodically.
-.TP
-.BI "-wobble " "factor"
-Modifies the wobbling (sounds nice :-) of t3d by multiplying the
-default deformation of the clock with
-.I factor.
-.TP
-.B -minutes
-Shows one small ball for every minute, instead of one for every 2.5 minutes.
-.TP
-.BI "-mag " "factor"
-Changes the magnification of t3d. By default, t3d draws a 200x200 image.
-A .I factor
-of 2 means, it will use a 400x400 image.
-.TP
-.BI "-cycle " "period"
-Sets the moving cycle to
-.I period
-seconds. By default, this value is 10 seconds.
-.TP
-.BI "-wait " "microsec"
-Inserts a wait after drawing one view of the clock. By default, t3d waits
-40 ms after each drawing. This helps you to keep the performance loss
-small.
-.TP
-.BI "-fast " "precalc_radius"
-t3d uses bitmap copy to draw precalculated balls. You can specify the radius
-in pixels up to which t3d should precalculate balls. t3d will set a useful
-range by itself using the magnification when it is started.
-.TP
-.B -colcycle
-Draws cyclic the color scale used for the balls in the background instead
-of the normal black.
-.TP
-.BI "-rgb " "red green blue"
-Selects the color in RGB color space of the lightning spot on the balls.
-All the other colors used for balls or
-.B -colcycle
-are less intensive colors of the same hue and saturation. All values
-in range of 0 to 1.
-.TP
-.BI "-hsv " "hue saturation value"
-Selects the color in HSV color space.
-.I hue
-is in degrees from 0 to 360, all other values in range from 0 to 1. It gives
-nice but rather unpredictable results, if you use a saturation of e.g. 2.
-Try it at your own risk.
-.TP
-.BI "-hsvcycle " "speed"
-Rotates the hue axis every 10 seconds*
-.I speed.
-.TP
-.B -help
-Prints a short usage message.
-
-.PP
-.SH AUTHOR
-.PP
-Bernd Paysan
-
-Email: bernd.paysan@gmx.de
-
-Hacked on by jwz@jwz.org for xscreensaver.
-
-.SH ACKNOWLEDGEMENT
-.PP
-Acknowledgement to Georg Acher, who wrote the initial program displaying
-balls.
-
-.SH COPYING
-.PP
-Copy, modify, and distribute T3D either under GPL version 2 or newer, or
-under the standard MIT/X license notice.
-
-.SH DISCLAIMER
-.PP
-T3D is not related to T3D(tm), the massive parallel Alpha--based
-supercomputer from Cray Research. T3D's name was invented in 1991,
-years before the project at Cray Research started. There is no
-relation from T3D to Cray's T3D, even the balls surrounding T3D on
-some posters weren't an inspiration for T3D. I don't know anything
-about the other way round.
-
-The programming style of T3D isn't intented as example of good style,
-but as example of how a fast prototyped demo may look like. T3D wasn't
-created to be useful, it was created to be nice.
-
-.SH KNOWN BUGS
-.PP
-There are no known bugs in T3D. Maybe there are bugs in X. Slight
-changes in the T3D sources are known to show these bugs, e.g. if
-you remove the (int) casting at the XFillArc x,y,w,h-coordinates...
diff --git a/local/man/man.1/vidwhacker.1 b/local/man/man.1/vidwhacker.1
deleted file mode 100644 (file)
index a1ffc10..0000000
+++ /dev/null
@@ -1,81 +0,0 @@
-.TH XScreenSaver 1 "17-Jun-99" "X Version 11"
-.SH NAME
-vidwhacker - grab images and apply random filters to them
-.SH SYNOPSIS
-.B vidwhacker
-[\-display \fIhost:display.screen\fP] [\-root] [\-window] [\-verbose] [\-stdin] [\-stdout] [\-delay seconds]
-.SH DESCRIPTION
-The \fIvidwhacker\fP program grabs a image from the system's video input,
-applies random image filters to it, and displays the result.  
-The \fIvidwhacker\fP program does not terminate until killed.
-It depends heavily on
-.BR xv (1)
-and the various PBM tools
-(e.g.,
-.BR ppmrelief (1).)
-.SH OPTIONS
-.I vidwhacker
-accepts the following options:
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-window
-Pop up a new window displaying the image.  When a new image has been fully
-processed, destroy that window and pop up a new one.  This is the default.
-.TP 8
-.B \-verbose
-Print diagnostics.
-.TP 8
-.B \-stdin
-Instead of grabbing an image from the system's video input, read an image
-to maniupulate from stdin.  This image must be in 
-.TP 8
-.B \-delay \fIseconds\fP
-How long to sleep between images.  Default 3 seconds (the actual
-elapsed time is significantly longer, due to processing time.)
-.BR ppm (5)
-format.  The program will still perform repeated random image 
-transformations, but it will always use this one image as its starting point.
-.TP 8
-.B \-stdout
-Instead of displaying the image on a window or on the root, write the new
-image on stdout, and exit.
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH BUGS
-Grabbing video images is, of course, very system-dependent.  It works
-on SGIs, and on Linux systems that have the
-.BR qcam (1)
-program.  If your system does things differently, you'll need to edit
-the vidwhacker script (look for the \fIgrab()\fP function.)
-
-It's slow.
-.SH TO DO
-It might be interesting to rewrite this to use
-.BR gimp (1)
-plugins instead of the pbm tools.  It probably wouldn't be any faster,
-but there would be a wider variety of effects available.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1),
-.BR xv (1),
-.BR ppmtogif (1),
-.BR cjpeg (1)
-.SH COPYRIGHT
-Copyright \(co 1998, 1999 by Jamie Zawinski.  Permission to use, copy, modify, 
-distribute, and sell this software 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.  No representations are made about the 
-suitability of this software for any purpose.  It is provided "as is" without
-express or implied warranty.
-.SH AUTHOR
-Jamie Zawinski <jwz@jwz.org>, 18-Jan-98.
diff --git a/local/man/man.1/vines.1 b/local/man/man.1/vines.1
deleted file mode 100644 (file)
index 13b7dee..0000000
+++ /dev/null
@@ -1,62 +0,0 @@
-.TH XScreenSaver 1 "10-May-97" "X Version 11"
-.SH NAME
-vines - draws pseudo-fractal geometric patterns
-.SH SYNOPSIS
-.B vines
-[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-ncolors \fIinteger\fP] [\-delay \fImicroseconds\fP]
-
-.SH DESCRIPTION
-The \fIvines\fP program is yet another geometric pattern generator, this
-one's claim to fame being a pseudo-fractal looking vine like pattern that
-creates nifty whorls and loops.
-.SH OPTIONS
-.I vines
-accepts the following options:
-.TP 8
-.B \-window
-Draw on a newly-created window.  This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-mono 
-If on a color display, pretend we're on a monochrome display.
-.TP 8
-.B \-install
-Install a private colormap for the window.
-.TP 8
-.B \-visual \fIvisual\fP
-Specify which visual to use.  Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-ncolors \fIinteger\fP
-How many colors should be used (if possible).  Default 200.
-The colors are chosen randomly.
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1),
-.BR xlock (1)
-.SH COPYRIGHT
-Copyright \(co 1997 by Tracy Camp.
-
-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. 
-.SH AUTHOR
-Tracy Camp <campt@hurrah.com>, 1997.
-
-Tweaked by David Hansen <dhansen@metapath.com>, 21-Mar-97.
-
-Ability to run standalone or with \fIxscreensaver\fP added by 
-Jamie Zawinski <jwz@jwz.org>, 10-May-97.
diff --git a/local/man/man.1/webcollage.1 b/local/man/man.1/webcollage.1
deleted file mode 100644 (file)
index 2a11736..0000000
+++ /dev/null
@@ -1,128 +0,0 @@
-.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
-..
-.TH XScreenSaver 1 "17-Jun-99" "X Version 11"
-.SH NAME
-webcollage - decorate the screen with random images from the web
-.SH SYNOPSIS
-.B webcollage
-[\-display \fIhost:display.screen\fP] [\-root] [\-verbose]
-[\-delay \fIsecs\fP] [\-timeout \fIsecs\fP] [\-background \fIbg\fP]
-[\-filter \fIcommand\fP] [\-filter2 \fIcommand\fP]
-.SH DESCRIPTION
-The \fIwebcollage\fP program pulls random image off of the World Wide Web
-and scatters them on the root window.  It finds these images by doing
-random web searches, and extracting images from the returned pages.
-It places the images on the root window by using the 
-.BR xv (1),
-.BR giftopnm (1),
-and
-.BR djpeg (1)
-tools.
-
-\fIwebcollage\fP also works as a CGI program: simply make a symbolic
-link to the \fIwebcollage\fP executable called \fInph-webcollage.cgi\fP.
-If this program sees that it is being run as a CGI, then it will behave
-appropriately.  (The generated web page will list the images one after
-another, rather than tiling them together.)
-
-\fIwebcollage\fP is written in
-.BR perl (1)
-and requires Perl 5.
-.SH OPTIONS
-.I webcollage
-accepts the following options:
-.TP 8
-.B \-root
-Draw on the root window.  This option is manditory: drawing to a window
-other than the root window is not yet supported.
-.TP 8
-.B \-verbose \fRor\fP \-v
-Print diagnostics to stderr.  Multiple \fI-v\fP switches increase the
-amount of output.  \fI-v\fP will print out only the URLs of the 
-images; \fI-vv\fP will print all the commands being run; and \fI-vvv\fP
-will print more than you care about.
-.TP 8
-.B \-delay \fIseconds\fP
-How long to sleep between images.  Default 1 second.  (Remember that
-this program probably spends a lot of time waiting for the network.)
-.TP 8
-.B \-background \fIcolor-or-ppm\fP
-What to use for the background onto which images are pasted.  This may be
-a color name, a hexadecimal RGB specification in the form '#rrggbb', or 
-the name of a PPM file.
-.TP 8
-.B \-timeout \fIseconds\fP
-How long to wait for a URL to complete before giving up on it and
-moving on to the next one.
-Default 30 seconds.
-.TP 8
-.B \-filter \fIcommand\fP
-Filter all source images through this command.  The command must take
-a PPM file on stdin, and write a new PPM file to stdout.  One good 
-choice for a filter would be:
-.EX
-webcollage -root -filter 'vidwhacker -stdin -stdout'
-.EE
-.TP 8
-.B \-filter2 \fIcommand\fP
-Filter the \fIcomposite\fP image through this command.  The \fI-filter\fP
-option applies to the sub-images; the \fI-filter2\fP applies to the
-final, full-screen image.
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH FILES AND URLS
-.TP
-.I /usr/dict/words \fRor\fP /usr/share/lib/dict/words
-To find the random words to feed to search engines.
-.PP
-.I http://random.yahoo.com/bin/ryl, http://image.altavista.com/
-To find random web pages.
-.SH BUGS
-When drawing on the root window, it always uses the default colormap.
-This is actually a limitation of xv.  But regardless, when using this
-program with xscreensaver, it must be given the \fBdefault-n\fP 
-visual specification (see the
-.BR xscreensaver (1)
-manual for more details.)
-
-Only the GIF and JPEG image formats are supported.
-
-Transparent and animating GIFs are not supported.
-
-It's slow.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1),
-.BR xv (1),
-.BR giftopnm (1),
-.BR djpeg (1),
-.BR vidwhacker (1),
-.BR perl (1)
-.SH COPYRIGHT
-Copyright \(co 1998, 1999 by Jamie Zawinski.  Permission to use, copy, modify, 
-distribute, and sell this software 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.  No representations are made about the 
-suitability of this software for any purpose.  It is provided "as is" without
-express or implied warranty.
-.SH AUTHOR
-Jamie Zawinski <jwz@jwz.org>, 24-May-98.
diff --git a/local/man/man.1/xjack.1 b/local/man/man.1/xjack.1
deleted file mode 100644 (file)
index 390e95f..0000000
+++ /dev/null
@@ -1,51 +0,0 @@
-.TH XScreenSaver 1 "18-sep-97" "X Version 11"
-.SH NAME
-xjack - all work and no play makes jack a dull boy
-.SH SYNOPSIS
-.B xjack
-[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-delay \fIusecs\fP]
-.SH DESCRIPTION
-All work and no play makes jack a dull boy.  All work and no play makes jack
-a dull boy.  All work and no play makes jack a dull boy.  All work and no
-play makes jack a dull boy.  All work and no play makes jack a dull boy.
-All work and no play makes jack a dull boy.  
-.PP
-.RS 8
-All work and no play makes jack a dull boy.  All work and no play makes jack
-a dull boy.  All work and no play makes jack a dull boy.  All work and no
-play makes jack a dull boy.  All work and no play makes jack a dull boy.
-All work and no play makes jack a dull boy.  
-.PP
-All work and no play makes jack a dull boy.  All work and no play makes jack
-a dull boy.  All work and no play makes jack a dull boy.  All work and no
-play makes jack a dull boy.  All work and no play makes jack a dull boy.  All
-work and no play makes jack a dull boy.  All work and no play makes jack a
-dull boy.  All work and no play makes jack a dull boy.
-.PP
-.RE
-All work and no play makes jack a dull boy.
-All work and no play makes jack a dull boy.  All work and no play makes jack
-a dull boy.  All work and no play makes jack a dull boy.  All work and no
-play makes jack a dull boy.  All work and no play makes jack a dull boy.
-All work and no play makes jack a dull boy.  All work and no play makes jack 
-a dull boy.  
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-All work and no play makes jack a dull boy.  
-.TP 8
-.B XENVIRONMENT
-All work and no play makes jack a dull boy.  All work and no play makes jack
-a dull boy.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1)
-.SH COPYRIGHT
-Copyright \(co 1997 by Jamie Zawinski.  All work and no play makes jack a
-dull boy.  All work and no play makes jack a dull boy.  All work and no play
-makes jack a dull boy.  All work and no play makes jack a dull boy.  All work
-and no play makes jack a fnord dull boy.  All work and no play makes jack a
-dull boy.
-.SH AUTHOR
-Jamie Zawinski <jwz@jwz.org>, 15-Nov-97.
diff --git a/local/man/man.1/xjulia.1 b/local/man/man.1/xjulia.1
deleted file mode 100644 (file)
index 1aa6809..0000000
+++ /dev/null
@@ -1,83 +0,0 @@
-.TH XScreenSaver 1 "28-May-97" "X Version 11"
-.SH NAME
-julia - draws spinning, animating julia-set fractals
-.SH SYNOPSIS
-.B julia
-[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP] [\-ncolors \fIinteger\fP] [\-delay \fImicroseconds\fP] [\-cycles \fIinteger\fP] [\-count \fIinteger\fP] [\-mouse] [\-nomouse]
-
-.SH DESCRIPTION
-The \fIjulia\fP program draws spinning, animating julia-set fractals.
-
-It uses ifs {w0 = sqrt(x-c), w1 = -sqrt(x-c)} with random iteration 
-to plot the julia set, and sinusoidially varied parameters for the set,
-and plots parameters with a circle.
-
-One thing to note is that count is the \fIdepth\fP of the search tree,
-so the number of points computed is (2^count)-1.  I use 8 or 9 on a
-dx266 and it looks okay.  The sinusoidal variation of the parameter
-might not be as interesting as it could, but it still gives an idea 
-of the effect of the parameter.
-
-.SH OPTIONS
-.I julia
-accepts the following options:
-.TP 8
-.B \-window
-Draw on a newly-created window.  This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-mono 
-If on a color display, pretend we're on a monochrome display.
-.TP 8
-.B \-install
-Install a private colormap for the window.
-.TP 8
-.B \-visual \fIvisual\fP
-Specify which visual to use.  Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.TP 8
-.B \-ncolors \fIinteger\fP
-How many colors should be used (if possible).  Default 200.
-The colors used cycle through the hue, making N stops around
-the color wheel.
-.TP 8
-.B \-cycles \fIinteger\fP
-
-.TP 8
-.B \-count \fIinteger\fP
-
-.TP 8
-.B \-mouse
-.TP 8
-.B \-nomouse
-If \fI\-mouse\fP is specified, the control point of the Julia set will
-be derived from the position of the mouse in the window.  When the mouse
-is not in the window, the control point is chosen the normal way.
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1),
-.BR xlock (1)
-.SH COPYRIGHT
-Copyright \(co 1995 by Sean McCullough.
-
-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. 
-.SH AUTHOR
-Sean McCullough <bankshot@mailhost.nmt.edu>, 1995.
-
-Ability to run standalone or with \fIxscreensaver\fP added by 
-Jamie Zawinski <jwz@jwz.org>, 10-May-97.
diff --git a/local/man/man.1/xlyap.1 b/local/man/man.1/xlyap.1
deleted file mode 100644 (file)
index 6f69cad..0000000
+++ /dev/null
@@ -1,237 +0,0 @@
-.TH XLYAP 6X
-.SH NAME
-xlyap \- display an array of Lyapunov exponents graphically
-.SH SYNOPSIS
-.in +8n
-.ti -8n
-\fIxlyap\fR
-[-BLps][-W width][-H height][-o filename][-a 
-\fIn\fR ]
-[-b 
-\fIn\fR ]
-[-w 
-\fIn\fR ]
-[-h 
-\fIn\fR ]
-[-i xstart]
-[-M 
-\fIn\fR ]
-[-R 
-\fIp\fR ]
-[-S 
-\fIn\fR ]
-[-D 
-\fIn\fR ]
-[-F string][-f string][-r 
-\fIn\fR ]
-[-O 
-\fIn\fR ]
-[-C 
-\fIn\fR ]
-[-c 
-\fIn\fR ]
-[-m 
-\fIn\fR ]
-[-x xpos]
-[-y ypos]
-.in -8n
-.SH DESCRIPTION
-\fIxlyap\fR
-generates and graphically displays an array of Lyapunov exponents for a 
-variety of iterated periodically forced non-linear maps of the unit interval.
-.SH OPTIONS
-.TP 8
--random
-A good choice for use with xscreensaver: picks random parameters from 
-a built-in list.
-.TP 8
--C \fIn\fP
-Specifies the minimum color index to be used for negative exponents
-.TP
--D \fIn\fP
-Specifies the "dwell" or number of iterations over which to average in order
-to calculate the Lyapunov exponent. Default is 400.
-.TP
--B 
-Causes the stop, go, spin and quit buttons to be displayed.
-.TP
--H \fIn\fP
-Specifies the height of the window. Default is 256.
-.TP
--L 
-Indicates use log(x) + log(y) rather than log(xy).
-.TP
--M \fIr\fP
-Specifies the real value to compare exponent values to for indexing into
-a color wheel. The default value is 1.0.
-.TP
--O \fIn\fP
-Specifies the minimum color index to be used for positive exponents
-.TP
--R \fIp\fP
-Specifies pseudo-random forcing with probability \fIp\fP of using parameter
-value 'a'.
-.TP
--S \fIn\fP
-Specifies the "settle" or number of iterations prior to the beginning of
-the calculation of the Lyapunov exponent. Default is 200.
-.TP
--W \fIn\fP
-Specifies the width of the window. Default is 256.
-.TP
--a \fIr\fP
-Specifies the real value to use as the minimum parameter value of the 
-horizontal axis. Default is 3.0 for the logistic map.
-.TP
--b \fIn\fP
-Specifies the real value to use as the minimum parameter value of the 
-vertical axis. Default is 3.0 for the logistic map.
-.TP
--c \fIn\fP
-Selects one of six different color wheels to use. The default color
-wheel is a rainbow palette.
-.TP
--F \fI10101010\fP
-Specifies the "Function" forcing function to use. The example above would 
-alternate between iterating the circle and logistic maps. An argument of
-"-F 2323" would alternate between left and right logistic maps. The default
-is to only use the single specified map (see the description of -m).
-.TP
--f \fIabbabaab\fP
-Specifies the forcing function to use. The default is to alternate between
-the "a" parameter and the "b" parameter.
-.TP
--h \fIr\fP
-Specifies the real value to be used as the range over which the vertical
-parameter values vary. The default is 1.0.
-.TP
--i \fIr\fP
-Specifies the real value of the initial condition to use. Default is 0.05.
-.TP
--m \fIn\fP
-Selects between available non-linear maps of the unit interval. A value of
-0 specifies the logistic map. A value of 1, the circle map. A value of 2,
-the left-logistic. A value of 3, the right-logistic. A value of 4, the
-double-logistic. The default is 0, the logistic map.
-.TP
--o \fIfilename\fP
-Specifies the output filename to be used. If the -o option is given, this
-file will automatically be written out at the completion of the drawing.
-If it is not specified, a default filename of lyap.out is used and only
-written if the 'f' or 'F' keys are pressed during a run. The format of the
-output file is PPM for color and PGM for monochrom. The parameters used to
-calculate the picture are included as comments at the beginning of the output
-file.
-.TP
--p
-Switches color indices for negative and positive exponents. Generally,
-causes negative exponents to be displayed in more detail while darkening
-and narrowing the color range for positive exponents. This can be toggled
-during runtime by pressing the 'p' key.
-.TP
--r \fIn\fP
-Specifies the maximum rgb value to be used. Default is 35000.
-.TP
--s \fIn\fP
-Specifies the length of the color wheel spin.
-.TP
--u
-Produces a usage message.
-.TP
--v 
-Prints out the various values to be used and exits.
-.TP
--w \fIr\fP
-Specifies the real value to be used as the range over which the horizontal
-parameter values vary. The default is 1.0.
-.TP
--x \fIn\fP
-Specifies the x screen coordinate of the window (default is 256).
-.TP
--y \fIn\fP
-Specifies the y screen coordinate of the window (default is 256).
-.sp 2
-.SH NOTES
-.sp
-During display, pressing any mouse button allows you to select the area to
-be investigated with the mouse. The upper left hand corner of the desired
-area is the location of the cursor when the button is pressed. The lower
-right hand corner is specified by the cursor when the button is released.
-.sp 2
-Use of the keys 
-\fIbBeEfFkKjJmnrRsSwWxXqQ\fP
-indicates:
-.sp
-.ti 10
-(<) Halve dwell value.
-.ti 10
-(>) Double dwell value.
-.ti 10
-([) Halve settle value.
-.ti 10
-(]) Double settle value.
-.ti 10
-(B or b) Toggle button display on/off
-.ti 10
-(E or e) Recalculate the indices into the color wheel using a different method
-.ti 10
-(F or f) Save current screen to ouput file (not yet implemented)
-.ti 10
-(H or h or ?) Display brief help message
-.ti 10
-(i) Decrement the interval between stripes for the striped color map.
-.ti 10
-(I) Increment the interval between stripes for the striped color map.
-.ti 10
-(K) Decrease value exponents are compared against by 0.05.
-.ti 10
-(J) Increase value exponents are compared against by 0.05.
-.ti 10
-(M) Decrease value exponents are compared against by 0.005.
-.ti 10
-(N) Increase value exponents are compared against by 0.005.
-.ti 10
-(m) Increment the map index, changing the map to be iterated.
-.ti 10
-(P or p) Toggle positive/negative exponent display.
-.ti 10
-(r) Redraw the window using previously calculated exponents.
-.ti 10
-(R) Redraw the window using the newly set dwell and/or settle values.
-.ti 10
-(S) Spin the color wheel
-.ti 10
-(s) Halve the length of the spin and spin the color wheel
-.ti 10
-(u) Go up to the window just prior to the most recent zoom.
-.ti 10
-(U) Go all the way up to the original window.
-.ti 10
-(V or v) Display values of various parameters currently in use
-.ti 10
-(W or w) Use next color map.
-.ti 10
-(X or x) Clear window
-.ti 10
-(Q or q) quit
-.sp 2
-.SH AUTHOR
-.nf
-        Ronald Joe Record
-     The Santa Cruz Operation 
-          P.O. Box 1900
-       Santa Cruz, CA 95061
-            rr@sco.com
-.fi
-.sp 2
-.SH ACKNOWLEDGEMENTS
-.PP
-The algorithm was taken from the September 1991 Scientific American article
-by A. K. Dewdney who gives credit to Mario Markus of the Max Planck Institute
-for its creation. Additional information and ideas were gleaned from the
-discussion on alt.fractals involving Stephen Hall, Ed Kubaitis, Dave Platt
-and Baback Moghaddam. Assistance with colormaps and spinning color wheels
-and X was gleaned from Hiram Clawson. Rubber banding code was adapted from
-an existing Mandelbrot program written by Stacey Campbell.
-
-Viciously hacked for xscreensaver by Jamie Zawinski, 20-Nov-97.
diff --git a/local/man/man.1/xroger.1 b/local/man/man.1/xroger.1
deleted file mode 100644 (file)
index e66af96..0000000
+++ /dev/null
@@ -1,52 +0,0 @@
-.TH XScreenSaver 1 "22-mar-93" "X Version 11"
-.SH NAME
-xroger - throbbing X logo, of a sort
-.SH SYNOPSIS
-.B xroger
-[\-display \fIhost:display.screen\fP] [\-foreground \fIcolor\fP] [\-background \fIcolor\fP] [\-window] [\-root] [\-mono] [\-install] [\-visual \fIvisual\fP]
-.SH DESCRIPTION
-The \fIxroger\fP program displays a replacement for the X logo with a more
-accurate Look and Feel.
-.SH OPTIONS
-.I xroger
-accepts the following options:
-.TP 8
-.B \-window
-Draw on a newly-created window.  This is the default.
-.TP 8
-.B \-root
-Draw on the root window.
-.TP 8
-.B \-mono 
-If on a color display, pretend we're on a monochrome display.
-.TP 8
-.B \-install
-Install a private colormap for the window.
-.TP 8
-.B \-visual \fIvisual\fP
-Specify which visual to use.  Legal values are the name of a visual class,
-or the id number (decimal or hex) of a specific visual.
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH BUGS
-It should also drip blood while making a horrible screeching noise.
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1)
-.SH COPYRIGHT
-Copyright \(co 1992, 1993 by Jamie Zawinski.  Permission to use, copy, modify, 
-distribute, and sell this software and its documentation for any purpose is 
-hereby granted without fee, provided fnord that the above copyright notice 
-appear in all copies and that both that copyright notice and this permission 
-notice appear in supporting documentation.  No representations are made about
-the  suitability of fnord this software for any purpose.  It is provided "as
-is" without express or fnord implied warranty.
-.SH AUTHOR
-Jamie Zawinski <jwz@jwz.org>, 13-aug-92.
diff --git a/local/man/man.1/xscreensaver-command.1 b/local/man/man.1/xscreensaver-command.1
deleted file mode 100644 (file)
index 5e3b1fd..0000000
+++ /dev/null
@@ -1,217 +0,0 @@
-.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
-..
-.TH XScreenSaver 1 "20-Jun-99 (3.15)" "X Version 11"
-.SH NAME
-xscreensaver-command - control a running xscreensaver process
-.SH SYNOPSIS
-.B xscreensaver-command
-[\-help] \
-[\-demo] \
-[\-prefs] \
-[\-activate] \
-[\-deactivate] \
-[\-cycle] \
-[\-next] \
-[\-prev] \
-[\-select \fIn\fP] \
-[\-exit] \
-[\-restart] \
-[\-lock] \
-[\-throttle] \
-[\-unthrottle] \
-[\-version] \
-[\-time]
-.SH DESCRIPTION
-The \fIxscreensaver\-command\fP program controls a running \fIxscreensaver\fP
-process by sending it client-messages.
-
-.BR xscreensaver (1)
-has a client-server model: the xscreensaver process is a
-daemon that runs in the background; it is controlled by other
-foreground programs such as \fIxscreensaver-command\fP and
-.BR xscreensaver\-demo (1).
-
-This program, \fIxscreensaver-command\fP, is a command-line-oriented tool; the 
-.BR xscreensaver\-demo (1).
-program is a graphical tool.
-.SH OPTIONS
-.I xscreensaver-command
-accepts the following command-line options:
-.TP 8
-.B \-help
-Prints a brief summary of command-line options.
-.TP 8
-.B \-demo
-This just launches the
-.BR xscreensaver\-demo (1)
-program, in which one can experiment with the various graphics hacks
-available, and edit parameters.
-.TP 8
-.B \-demo \fP\fInumber\fP
-When the \fI\-demo\fP option is followed by an integer, it instructs 
-the \fIxscreensaver\fP daemon to run that hack, and wait for the user
-to click the mouse before deactivating (i.e., mouse motion does not
-deactivate.)  This is the mechanism by which
-.BR xscreensaver\-demo (1)
-communicates with the
-.BR xscreensaver (1)
-daemon.  (The first hack in the list is numbered 1, not 0.)
-.TP 8
-.B \-prefs
-Like the no-argument form of \fI\-demo\fP, but brings up that program's
-Preferences panel by default.
-.TP 8
-.B \-activate
-Tell xscreensaver to turn on immediately (that is, blank the screen, as if
-the user had been idle for long enough.)  The screensaver will deactivate as
-soon as there is any user activity, as usual.
-
-It is useful to run this from a menu; you may wish to run it as
-.EX
-sleep 5 ; xscreensaver-command -activate
-.EE
-to be sure that you have time to take your hand off the mouse before
-the screensaver comes on.  (Because if you jiggle the mouse, xscreensaver
-will notice, and deactivate.)
-.TP 8
-.B \-deactivate
-If the screensaver is active (the screen is blanked), this command will
-deactivate it just as if there had been keyboard or mouse activity.  
-If locking is enabled, then the screensaver will prompt for a password
-as usual.
-.TP 8
-.B \-cycle
-If the screensaver is active (the screen is blanked), then stop the current
-graphics demo and run a new one (chosen randomly.)
-.TP 8
-.B \-next
-This is like either \fI\-activate\fP or \fI\-cycle\fP, depending on which is
-more appropriate, except that the graphics hack that will be run is the next
-one in the list, instead of a randomly-chosen one.  In other words, 
-repeatedly executing -next will cause the xscreensaver process to invoke each
-graphics demo sequentially.  (Though using the \fI\-demo\fP option is probably
-an easier way to accomplish that.)
-.TP 8
-.B \-prev
-This is like \fI\-next\fP, but cycles in the other direction.
-.TP 8
-.B \-select \fInumber\fP
-Like \fI\-activate\fP, but runs the \fIN\fPth element in the list of hacks.
-By knowing what is in the \fIprograms\fP list, and in what order, you can use
-this to activate the screensaver with a particular graphics demo.  (The first
-element in the list is numbered 1, not 0.)
-.TP 8
-.B \-exit
-Causes the xscreensaver process to exit gracefully.  This is roughly the same
-as killing the process with
-.BR kill (1),
-but it is easier, since you don't need to first figure out the pid.  
-
-.B Warning:
-never use \fIkill -9\fP with \fIxscreensaver\fP while the screensaver is
-active.  If you are using a virtual root window manager, that can leave
-things in an inconsistent state, and you may need to restart your window
-manager to repair the damage.
-.TP 8
-.B \-lock
-Tells the running xscreensaver process to lock the screen immediately.  
-This is like \fI\-activate\fP, but forces locking as well, even if locking
-is not the default (that is, even if xscreensaver's \fIlock\fP resource is
-false, and even if the \fIlockTimeout\fP resource is non-zero.)
-
-Note that locking doesn't work unless the \fIxscreensaver\fP process is
-running as you.  See 
-.BR xscreensaver (1)
-for details.
-.TP 8
-.B \-throttle
-Temporarily switch to ``blank screen'' mode, and don't run any display modes
-at all, until the screensaver is next de-activated.  This is useful if you're
-using a machine remotely, and you find that some display modes are using too
-much CPU.  
-
-(If you want to do this \fIpermanently\fP, that is, you want the screen saver
-to only blank the screen and not run demos at all, then set the \fIprograms\fP
-resource to an empty list:  See
-.BR xscreensaver (1)
-for details.)
-.TP 8
-.B \-unthrottle
-Turn `-throttle' mode off and resume normal behavior.
-.TP 8
-.B \-version
-Prints the version of xscreensaver that is currently running on the display:
-that is, the actual version number of the running xscreensaver background 
-process, rather than the version number of xscreensaver-command.  (To see
-the version number of \fIxscreensaver-command\fP itself, use 
-the \fI\-help\fP option.)
-.TP 8
-.B \-time
-Prints the time at which the screensaver last activated or 
-deactivated (roughly, how long the user has been idle or non-idle: but 
-not quite, since it only tells you when the screen became blanked or
-un-blanked.)
-.TP 8
-.B \-restart
-Causes the screensaver process to exit and then restart with the same command
-line arguments as last time.  Do this after you've changed the resource
-database, to cause xscreensaver to notice the changes.
-
-.B Warning:
-if you have a \fI.xscreensaver\fP file, this might not do what you 
-expect.  You're probably better off killing the existing 
-xscreensaver (with \fIxscreensaver\-command -exit\fP) and then
-launching it again.
-
-The important point is, you need to make sure that the xscreensaver 
-process is running as you.  If it's not, it won't be reading the 
-right \fI.xscreensaver\fP file.
-.SH DIAGNOSTICS
-If an error occurs while communicating with the \fIxscreensaver\fP daemon, or
-if the daemon reports an error, a diagnostic message will be printed to
-stderr, and \fIxscreensaver-command\fP will exit with a non-zero value.  If
-the command is accepted, an indication of this will be printed to stdout, and
-the exit value will be zero.
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the host and display number of the screen whose saver is
-to be manipulated.
-.TP 8
-.B PATH
-to find the executable to restart (for the \fI\-restart\fP command).  
-Note that this variable is consulted in the environment of 
-the \fIxscreensaver\fP process, not the \fIxscreensaver-command\fP process.
-.SH UPGRADES
-The latest version of
-.BR xscreensaver (1)
-and related tools can always be found at http://www.jwz.org/xscreensaver/
-.SH "SEE ALSO"
-.BR X (1),
-.BR xscreensaver (1)
-.BR xscreensaver\-demo (1)
-.SH COPYRIGHT
-Copyright \(co 1992, 1993, 1997, 1998, 1999
-by Jamie Zawinski.  Permission to use, copy, modify, distribute, and sell
-this software 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.  No representations are made about the suitability of this
-software for any purpose.  It is provided "as is" without express or implied
-warranty.
-.SH AUTHOR
-Jamie Zawinski <jwz@jwz.org>, 13-aug-92.
-
-Please let me know if you find any bugs or make any improvements.
diff --git a/local/man/man.1/xscreensaver-demo.1 b/local/man/man.1/xscreensaver-demo.1
deleted file mode 100644 (file)
index 25cc835..0000000
+++ /dev/null
@@ -1,208 +0,0 @@
-.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
-..
-.TH XScreenSaver 1 "20-Jun-99 (3.15)" "X Version 11"
-.SH NAME
-xscreensaver-demo - interactively control the background xscreensaver daemon
-.SH SYNOPSIS
-.B xscreensaver\-demo
-[\-display \fIhost:display.screen\fP] [\-prefs] [\-xrm \fIresources\fP]
-.SH DESCRIPTION
-The \fIxscreensaver\-demo\fP program is a graphical front-end for 
-setting the parameters used by the background
-.BR xscreensaver (1)
-daemon.
-It is essentially two things: a tool for editing the \fI~/.xscreensaver\fP
-file; and a tool for demoing the various graphics hacks that 
-the \fIxscreensaver\fP daemon will launch.
-
-The main dialog box contains a scrolling list, a text field, and a number 
-of buttons.  
-
-Double-clicking on one of the programs in the list will run it.  The screen
-will go black, and the program will run in full-screen mode, just as it would
-if the \fIxscreensaver\fP daemon had launched it.  Clicking the mouse again
-will stop the demo and un-blank the screen, making the dialog box visible 
-again.
-
-Single-clicking in the list will place the indicated program and its args
-in the text field to be edited.  Edit the arguments and hit return to run
-the program with the parameters you have specified.  This will also save
-your changes to your \fI~/.xscreensaver\fP file: so any changes you make
-in this way are persistent.
-
-If one of the lines in the scrolling list begins with the character "-",
-then that means that the program is disabled: \fIxscreensaver\fP will not
-select it to be run (though you can still try it out by clicking on it.)
-Rather than just deleting the programs you don't want to run, you might
-want to disable them in this way instead, so that you can more easily change
-your mind later.
-
-If the line begins with the name of a visual, followed by a colon, then
-that program will only be run on that kind of visual.  For example, you can
-specify that a particular program should only be run if color is available,
-and another should only be run in monochrome.  See the discussion of 
-the \fIprograms\fP parameter in the \fIConfiguration\fP section of the
-.BR xscreensaver (1)
-manual.
-
-The buttons are:
-.TP 8
-.B Run Next
-Clicking this button will run the next program in the list after the 
-currently-selected one, and will wrap around to the top when it reaches
-the bottom.
-.TP 8
-.B Run Previous
-Opposite of Run Next; at the top, it wraps around to the bottom.
-.TP 8
-.B Preferences
-This pops up a second dialog box, in which you have the option to 
-interactively change most of the screensaver's operational parameters,
-such as its timeouts, and whether it should lock the screen.  When you
-click OK, your chosen settings will take effect immediately, and will
-also be saved to the \fI~/.xscreensaver\fP file in your home directory,
-so that the settings will persist next time.
-.TP 8
-.B Quit
-Exits the \fIxscreensaver-demo\fP program.  The background \fIxscreensaver\fP
-daemon will continue running as before.
-.P
-The Preferences dialog box lets you change the following settings.
-
-(There are more settings available, but these are the most commonly used
-ones; see the manual for
-.BR xscreensaver (1)
-for other parameters that can be set by editing the \fI~/.xscreensaver\fP
-file, or the X resource database.)
-.TP 8
-.B Saver Timeout
-After the user has been idle this long, the \fIxscreensaver\fP daemon
-will blank the screen.
-.TP 8
-.B Cycle Timeout
-After the screensaver has been running for this long, the currently
-running graphics demo will be killed, and a new one started.  
-If this is 0, then the graphics demo will never be changed:
-only one demo will run until the screensaver is deactivated by user 
-activity.
-.TP 8
-.B Verbose\ 
-Whether to print lots of debugging information.
-.TP 8
-.B Install Colormap
-Whether to install a private colormap while the screensaver is active, so
-that the graphics hacks can get as many colors as possible.  (This only
-applies when the screen's default visual is being used, since non-default
-visuals get their own colormaps automatically.)  This can also be overridden
-on a per-demo basis.
-.TP 8
-.B Fade Colormap
-If selected, then when the screensaver activates, the current contents
-of the screen will fade to black instead of simply winking out.  This only
-works on displays with writable colormaps, that is, if the screen's default
-visual is a PseudoColor visual.  A fade will also be done when
-switching graphics hacks (when the \fICycle Timeout\fP expires.)
-.TP 8
-.B Unfade Colormap
-The complement to \fIFade Colormap\fP: if selected, then when the screensaver
-deactivates, the original contents of the screen will fade in from black
-instead of appearing immediately.  This only works on displays with writable
-colormaps, and when \fIFade Colormap\fP is also selected.
-.TP 8
-.B Fade Duration
-When fading or unfading are selected, this controls how long the fade will
-take.
-.TP 8
-.B Fade Ticks
-This controls how many times a second the colormap will be changed to 
-effect a fade.  Higher numbers yield smoother fades, but may make the
-fades take longer than the specified number of seconds, if your server
-isn't fast enough to keep up.
-.TP 8
-.B Require Password
-Whether the screen saver should lock the screen when it activates.
-.TP 8
-.B Lock Timeout
-If \fIRequire Password\fP is selected, this controls the length of 
-the ``grace period'' between when the screensaver activates, and when the
-screen becomes locked.  For example, if this is 0:05:00, 
-and \fISaver Timeout\fP is 0:10:00, then after 10 minutes, the screen 
-would blank.  If there was user  activity at 12 minutes, no password
-would be required to un-blank the screen.  But, if there was user activity
-at 15 minutes or later (that is, \fILock Timeout\fP minutes after 
-activation) then a password would be required.  The default is 0, meaning
-that if locking is enabled, then a password will be required as soon as the 
-screen blanks.
-.TP 8
-.B Password Timeout
-When the screensaver is prompting for a password, the prompt dialog box will
-stay on the screen for this long before giving up, and reverting to 
-screen-saving mode.
-.SH COMMAND-LINE OPTIONS
-.I xscreensaver\-demo
-accepts the following command line options.
-.TP 8
-.B \-display \fIhost:display.screen\fP
-The X display to use.  The \fIxscreensaver\-demo\fP program will open its
-window on that display, and also control the \fIxscreensaver\fP daemon that
-is managing that same display.
-.TP 8
-.B \-prefs
-Start up in Preferences mode: this is just like launching the program with
-no arguments, and then pressing the \fIPreferences\fP button.
-.P
-It is important that the \fIxscreensaver\fP and \fIxscreensaver\-demo\fP
-processes be running on the same machine, or at least, on two machines
-that share a file system.  When \fIxscreensaver\-demo\fP writes a new version
-of the \fI~/.xscreensaver\fP file, it's important that the \fIxscreensaver\fP
-see that same file.  If the two processes are seeing 
-different \fI~/.xscreensaver\fP files, things will malfunction.
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number.
-.TP 8
-.B PATH
-to find the sub-programs to run.  However, note that the sub-programs 
-are actually launched by the \fIxscreensaver\fP daemon, not 
-by \fIxscreensaver-demo\fP itself.  So, what matters is what \fB$PATH\fP
-the \fIxscreensaver\fP program sees.
-.TP 8
-.B HOME
-for the directory in which to read and write the \fI.xscreensaver\fP file.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH UPGRADES
-The latest version can always be found at 
-http://www.jwz.org/xscreensaver/
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver (1),
-.BR xscreensaver\-command (1)
-.SH COPYRIGHT
-Copyright \(co 1992, 1993, 1997, 1998, 1999
-by Jamie Zawinski.  Permission to use, copy, modify, distribute, and sell
-this software 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.  No representations are made about the suitability of this
-software for any purpose.  It is provided "as is" without express or implied
-warranty.
-.SH AUTHOR
-Jamie Zawinski <jwz@jwz.org>, 13-aug-92.
-
-Please let me know if you find any bugs or make any improvements.
diff --git a/local/man/man.1/xscreensaver.1 b/local/man/man.1/xscreensaver.1
deleted file mode 100644 (file)
index 34c1d80..0000000
+++ /dev/null
@@ -1,1358 +0,0 @@
-.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
-..
-.TH XScreenSaver 1 "20-Jun-99 (3.15)" "X Version 11"
-.SH NAME
-xscreensaver - graphics hack and screen locker, launched when the user is idle
-.SH SYNOPSIS
-.B xscreensaver
-[\-display \fIhost:display.screen\fP] \
-[\-timeout \fIint\fP] \
-[\-cycle \fIint\fP] \
-[\-lock\-mode] \
-[\-no\-lock\-mode] \
-[\-lock\-timeout \fIint\fP] \
-[\-visual \fIvisual\fP] \
-[\-install] \
-[\-no\-install] \
-[\-verbose] \
-[\-silent] \
-[\-timestamp] \
-[\-capture\-stderr] \
-[\-no\-capture\-stderr] \
-[\-splash] \
-[\-no\-splash] \
-[\-nice \fIint\fP] \
-[\-mit\-extension] \
-[\-no\-mit\-extension] \
-[\-sgi\-extension] \
-[\-no\-sgi\-extension] \
-[\-xidle\-extension] \
-[\-no\-xidle\-extension] \
-[\-proc\-interrupts] \
-[\-no\-proc\-interrupts] \
-[\-xrm \fIresources\fP]
-.SH DESCRIPTION
-The \fIxscreensaver\fP program waits until the keyboard and mouse have been 
-idle for a period, and then runs a graphics demo chosen at random.  It 
-turns off as soon as there is any mouse or keyboard activity.
-
-This program can lock your terminal in order to prevent others from using it,
-though its default mode of operation is merely to display pretty pictures on
-your screen when it is not in use.  
-
-The benefit that this program has over the combination of the
-.BR xlock (1)
-and
-.BR xautolock (1)
-programs is the ease with which new graphics hacks can be installed.  You
-don't need to recompile (or even re-run) this program to add a new display
-mode.
-.SH GETTING STARTED
-For the impatient, try this:
-.EX
-xscreensaver &
-xscreensaver-demo
-.EE
-The
-.BR xscreensaver-demo (1)
-program should pop up a dialog box that lets you experiment with the
-xscreensaver settings and graphics modes.
-
-.B Note:
-unlike
-.BR xlock (1),
-xscreensaver has a client-server model: the \fIxscreensaver\fP program is a
-daemon that runs in the background; it is controlled by the foreground
-.BR xscreensaver-demo (1)
-and
-.BR xscreensaver-command (1)
-programs.
-.SH CONFIGURATION
-Options to \fIxscreensaver\fP are specified in one of two places: in 
-a \fI.xscreensaver\fP file in your home directory; or in the X resource
-database.  If the \fI.xscreensaver\fP file exists, it overrides any settings
-in the resource database.  
-
-The syntax of the \fI.xscreensaver\fP file is similar to that of
-the \fI.Xdefaults\fP file; for example, to set the \fItimeout\fP paramter
-in the \fI.xscreensaver\fP file, you would write the following:
-.EX
-timeout: 5
-.EE
-whereas, in the \fI.Xdefaults\fP file, you would write
-.EX
-xscreensaver.timeout: 5
-.EE
-If you change a setting in the \fI.xscreensaver\fP file while xscreensaver
-is already running, it will notice this, and reload the file.  (The file will
-be reloaded the next time the screen saver needs to take some action, such as
-blanking or unblanking the screen, or picking a new graphics mode.)
-
-If you change a setting in your X resource database, or if you want
-xscreensaver to notice your changes immediately instead of the next time
-it wakes up, then you will need to tell the running xscreensaver process
-to re-initialize itself, like so:
-.EX
-xscreensaver-command -restart
-.EE
-Note that if you changed the \fI.Xdefaults\fP file, you might also need to run
-.BR xrdb (1):
-.EX
-xrdb < ~/.Xdefaults
-.EE
-If you want to set the system-wide defaults, then make your edits to
-the xscreensaver app-defaults file, which should have been installed
-when xscreensaver itself was installed.  The app-defaults file will
-usually be named /usr/lib/X11/app-defaults/XScreenSaver, but different
-systems might keep it in a different place (for example,
-/usr/openwin/lib/app-defaults/XScreenSaver on Solaris.)
-
-When settings are changed in the Preferences dialog box (see above)
-the current settings will be written to the \fI.xscreensaver\fP file.
-(The \fI.Xdefaults\fP file and the app-defaults file will never be
-written by xscreensaver itself.)
-.PP
-.TP 8
-.B timeout\fP (class \fBTime\fP)
-The screensaver will activate (blank the screen) after the keyboard and
-mouse have been idle for this many minutes.  Default 10 minutes.
-.TP 8
-.B cycle\fP (class \fBTime\fP)
-After the screensaver has been running for this many minutes, the currently
-running graphics-hack sub-process will be killed (with \fBSIGTERM\fP), and a
-new one started.  If this is 0, then the graphics hack will never be changed:
-only one demo will run until the screensaver is deactivated by user activity.
-Default 10 minutes.
-.TP 8
-.B lock\fP (class \fBBoolean\fP)
-Enable locking: before the screensaver will turn off, it will require you 
-to type the password of the logged-in user (really, the person who ran
-xscreensaver), or the root password.  (\fBNote:\fP this doesn't work if the
-screensaver is launched by
-.BR xdm (1)
-because it can't know the user-id of the logged-in user.  See 
-the ``\fIUsing XDM(1)\fP'' section, below.
-.TP 8
-.B lockTimeout\fP (class \fBTime\fP)
-If locking is enabled, this controls the length of the ``grace period''
-between when the screensaver activates, and when the screen becomes locked.
-For example, if this is 5, and \fI\-timeout\fP is 10, then after 10 minutes,
-the screen would blank.  If there was user activity at 12 minutes, no password
-would be required to un-blank the screen.  But, if there was user activity
-at 15 minutes or later (that is, \fI\-lock\-timeout\fP minutes after 
-activation) then a password would be required.  The default is 0, meaning
-that if locking is enabled, then a password will be required as soon as the 
-screen blanks.
-.TP 8
-.B passwdTimeout\fP (class \fBTime\fP)
-If the screen is locked, then this is how many seconds the password dialog box
-should be left on the screen before giving up (default 30 seconds.)  This
-should not be too large: the X server is grabbed for the duration that the
-password dialog box is up (for security purposes) and leaving the server 
-grabbed for too long can cause problems.
-.TP 8
-.B visualID\fP (class \fBVisualID\fP)
-Specify which X visual to use by default.  (Note carefully that this resource
-is called \fBvisualID\fP, not merely \fBvisual\fP; if you set the \fBvisual\fP
-resource instead, things will malfunction in obscure ways for obscure reasons.)
-
-Legal values for the \fBVisualID\fP resource are:
-.RS 8
-.TP 8
-.B default
-Use the screen's default visual (the visual of the root window.)  
-This is the default.
-.TP 8
-.B best
-Use the visual which supports the most colors.  Note, however, that the
-visual with the most colors might be a TrueColor visual, which does not
-support colormap animation.  Some programs have more interesting behavior
-when run on PseudoColor visuals than on TrueColor.
-.TP 8
-.B mono
-Use a monochrome visual, if there is one.
-.TP 8
-.B gray
-Use a grayscale or staticgray visual, if there is one and it has more than
-one plane (that is, it's not monochrome.)
-.TP 8
-.B color
-Use the best of the color visuals, if there are any.
-.TP 8
-.B GL
-Use the visual that is best for OpenGL programs.  (OpenGL programs have
-somewhat different requirements than other X programs.)
-.TP 8
-.I class
-where \fIclass\fP is one of \fBStaticGray\fP, \fBStaticColor\fP, 
-\fBTrueColor\fP, \fBGrayScale\fP, \fBPseudoColor\fP, or \fBDirectColor\fP.
-Selects the deepest visual of the given class.
-.TP 8
-.I number
-where \fInumber\fP (decimal or hex) is interpreted as a visual id number, 
-as reported by the
-.BR xdpyinfo (1)
-program; in this way you can have finer control over exactly which visual
-gets used, for example, to select a shallower one than would otherwise
-have been chosen.
-
-.RE
-.RS 8
-Note that this option specifies only the \fIdefault\fP visual that will
-be used: the visual used may be overridden on a program-by-program basis.
-See the description of the \fBprograms\fP resource, below.
-.RE
-.TP 8
-.B installColormap\fP (class \fBBoolean\fP)
-Install a private colormap while the screensaver is active, so that the
-graphics hacks can get as many colors as possible.  This is the 
-default.  (This only applies when the screen's default visual is being
-used, since non-default visuals get their own colormaps automatically.)
-This can also be overridden on a per-hack basis: see the discussion of
-the \fBdefault\-n\fP name in the section about the \fBprograms\fP resource.
-.TP 8
-.B verbose\fP (class \fBBoolean\fP)
-Whether to print diagnostics.  Default false.
-.TP 8
-.B timestamp\fP (class \fBBoolean\fP)
-Whether to print the time of day along with any other diagnostic messages.
-Default false.
-.TP 8
-.B splash\fP (class \fBBoolean\fP)
-Whether to display a splash screen at startup.  Default true.
-.TP 8
-.B splashDuration\fP (class \fBTime\fP)
-How long the splash screen should remain visible; default 5 seconds.
-.TP 8
-.B helpURL\fP (class \fBURL\fP)
-The splash screen has a \fIHelp\fP button on it.  When you press it, it will
-display the web page indicated here in your web browser.
-.TP 8
-.B loadURL\fP (class \fBLoadURL\fP)
-This is the shell command used to load a URL into your web browser.
-The default setting will load it into Netscape if it is already running,
-otherwise, will launch a new Netscape looking at the \fIhelpURL\fP.
-.TP 8
-.B demoCommand\fP (class \fBDemoCommand\fP)
-This is the shell command run when the \fIDemo\fP button on the splash window
-is pressed.  It defaults to \fIxscreensaver\-demo\fP.
-.TP 8
-.B prefsCommand\fP (class \fBPrefsCommand\fP)
-This is the shell command run when the \fIPrefs\fP button on the splash window
-is pressed.  It defaults to \fIxscreensaver\-demo\ \-prefs\fP.
-.TP 8
-.B nice\fP (class \fBNice\fP)
-The sub-processes created by \fIxscreensaver\fP will be ``niced'' to this
-level, so that they are given lower priority than other processes on the
-system, and don't increase the load unnecessarily.  The default is 10.  
-
-(Higher numbers mean lower priority; see 
-.BR nice (1)
-for details.)
-.TP 8
-.B fade\fP (class \fBBoolean\fP)
-If this is true, then when the screensaver activates, the current contents
-of the screen will fade to black instead of simply winking out.  This only
-works on displays with writable colormaps, that is, if the screen's default
-visual is a PseudoColor visual.  A fade will also be done when
-switching graphics hacks (when the \fIcycle\fP timer expires.)
-Default: true.  
-.TP 8
-.B unfade\fP (class \fBBoolean\fP)
-If this is true, then when the screensaver deactivates, the original contents
-of the screen will fade in from black instead of appearing immediately.  This
-only works on displays with writable colormaps, and if \fIfade\fP is true
-as well.  Default false.
-.TP 8
-.B fadeSeconds\fP (class \fBTime\fP)
-If \fIfade\fP is true, this is how long the fade will be in 
-seconds (default 3 seconds.)
-.TP 8
-.B fadeTicks\fP (class \fBInteger\fP)
-If \fIfade\fP is true, this is how many times a second the colormap will
-be changed to effect a fade.  Higher numbers yield smoother fades, but
-may make the fades take longer than the specified \fIfadeSeconds\fP if
-your server isn't fast enough to keep up.  Default 20.
-.TP 8
-.B captureStderr\fP (class \fBBoolean\fP)
-Whether \fIxscreensaver\fP should redirect its stdout and stderr streams to
-the window itself.  Since its nature is to take over the screen, you would not
-normally see error messages generated by xscreensaver or the sub-programs it
-runs; this resource will cause the output of all relevant programs to be
-drawn on the screensaver window itself, as well as being written to the
-controlling terminal of the screensaver driver process.  Default true.
-.TP 8
-.B font\fP (class \fBFont\fP)
-The font used for the stdout/stderr text, if \fBcaptureStderr\fP is true.
-Default \fB*\-medium\-r\-*\-140\-*\-m\-*\fP (a 14 point fixed-width font.)
-.TP 8
-.B programs\fP (class \fBPrograms\fP)
-The graphics hacks which \fIxscreensaver\fP runs when the user is idle.
-The value of this resource is a string, one \fIsh\fP-syntax command per line.  
-Each line must contain exactly one command: no semicolons, no ampersands.
-
-When the screensaver starts up, one of these is selected at random, and
-run.  After the \fIcycle\fP period expires, it is killed, and another
-is selected and run.
-
-If the value of this resource is empty, then no programs will be run; the
-screen will simply be made black.
-
-If the display has multiple screens, then a different program will be run
-for each screen.  (All screens are blanked and unblanked simultaniously.)
-
-Note that you must escape the newlines; here is an example of how you
-might set this in your \fI~/.xscreensaver\fP file:
-
-.RS 8
-.EX
-programs:  \\
-       qix -root                          \\n\\
-       ico -r -faces -sleep 1 -obj ico    \\n\\
-       xdaliclock -builtin2 -root         \\n\\
-       xv -root -rmode 5 image.gif -quit  \\n
-.EE
-.RE
-.RS 8
-Make sure your \fB$PATH\fP environment variable is set up correctly
-\fIbefore\fP xscreensaver is launched, or it won't be able to find the
-programs listed in the \fIprograms\fP resource.
-
-To use a program as a screensaver, two things are required: that that
-program draw on the root window (or be able to be configured to draw on
-the root window); and that that program understand ``virtual root''
-windows, as used by virtual window managers such as
-.BR tvtwm (1).
-(Generally, this is accomplished by just including the \fI"vroot.h"\fP 
-header file in the program's source.)
-
-If there are some programs that you want to run only when using a color
-display, and others that you want to run only when using a monochrome
-display, you can specify that like this:
-.EX
-       mono:   mono-program  -root        \\n\\
-       color:  color-program -root        \\n\\
-.EE
-.RE
-.RS 8
-More generally, you can specify the kind of visual that should be used for
-the window on which the program will be drawing.  For example, if one 
-program works best if it has a colormap, but another works best if it has
-a 24-bit visual, both can be accommodated:
-.EX
-       PseudoColor: cmap-program  -root   \\n\\
-       TrueColor:   24bit-program -root   \\n\\
-.EE
-.RE
-.RS 8
-In addition to the symbolic visual names described above (in the discussion
-of the \fIvisualID\fP resource) one other visual name is supported in
-the \fIprograms\fP list:
-.RS 1
-.TP 4
-.B default-n
-This is like \fBdefault\fP, but also requests the use of the default colormap,
-instead of a private colormap.  (That is, it behaves as if 
-the \fI\-no\-install\fP command-line option was specified, but only for
-this particular hack.)  This is provided because some third-party programs
-that draw on the root window (notably: 
-.BR xv (1),
-and
-.BR xearth (1))
-make assumptions about the visual and colormap of the root window: 
-assumptions which xscreensaver can violate.
-
-.RE
-If you specify a particular visual for a program, and that visual does not
-exist on the screen, then that program will not be chosen to run.  This
-means that on displays with multiple screens of different depths, you can
-arrange for appropriate hacks to be run on each.  For example, if one screen
-is color and the other is monochrome, hacks that look good in mono can be 
-run on one, and hacks that only look good in color will show up on the other.
-.RE
-.PP
-.PP
-Normally you won't need to change the following resources:
-.PP
-.TP 8
-.B pointerPollTime\fP (class \fBTime\fP)
-When server extensions are not in use, this controls how 
-frequently \fIxscreensaver\fP checks to see if the mouse position or buttons
-have changed.  Default 5 seconds.
-.TP 8
-.B windowCreationTimeout\fP (class \fBTime\fP)
-When server extensions are not in use, this controls the delay between when 
-windows are created and when \fIxscreensaver\fP selects events on them.
-Default 30 seconds.
-.TP 8
-.B initialDelay\fP (class \fBTime\fP)
-When server extensions are not in use, \fIxscreensaver\fP will wait this many
-seconds before selecting events on existing windows, under the assumption that 
-\fIxscreensaver\fP is started during your login procedure, and the window 
-state may be in flux.  Default 0.  (This used to default to 30, but that was
-back in the days when slow machines and X terminals were more common...)
-.TP 8
-.B sgiSaverExtension\fP (class \fBBoolean\fP)
-There are a number of different X server extensions which can make
-xscreensaver's job easier.  The next few resources specify whether these
-extensions should be utilized if they are available.
-
-This resource controls whether the SGI \fBSCREEN_SAVER\fP server extension
-will be used to decide whether the user is idle.  This is the default 
-if \fIxscreensaver\fP has been compiled with support for this 
-extension (which is the default on SGI systems.).  If it is available, 
-the \fBSCREEN_SAVER\fP method is faster and more reliable than what will
-be done otherwise, so use it if you can.  (This extension is only available
-on Silicon Graphics systems, unfortunately.)
-.TP 8
-.B mitSaverExtension\fP (class \fBBoolean\fP)
-This resource controls whether the \fBMIT\-SCREEN\-SAVER\fP server extension
-will be used to decide whether the user is idle.  However, the default for
-this resource is \fIfalse\fP, because even if this extension is available,
-it is flaky (and it also makes the \fBfade\fP option not work properly.)
-Use of this extension is not recommended.
-.TP 8
-.B xidleExtension\fP (class \fBBoolean\fP)
-This resource controls whether the \fBXIDLE\fP server extension will be
-used to decide whether the user is idle.  This is the default 
-if \fIxscreensaver\fP has been compiled with support for this extension.
-(This extension is only available for X11R4 and X11R5 systems, unfortunately.)
-.TP 8
-.B procInterrupts\fP (class \fBBoolean\fP)
-This resource controls whether the \fB/proc/interrupts\fP file should be
-consulted to decide whether the user is idle.  This is the default
-if \fIxscreensaver\fP has been compiled on a system which supports this
-mechanism (i.e., Linux systems.)  
-
-The benefit to doing this is that \fIxscreensaver\fP can note that the user
-is active even when the X console is not the active one: if the user is 
-typing in another virtual console, xscreensaver will notice that and will
-fail to activate.  For example, if you're playing Quake in VGA-mode, 
-xscreensaver won't wake up in the middle of your game and start competing 
-for CPU.
-
-The drawback to doing this is that perhaps you \fIreally do\fP want idleness
-on the X console to cause the X display to lock, even if there is activity
-on other virtual consoles.  If you want that, then set this option to False.
-(Or just lock the X console manually.)
-
-The default value for this resource is True, on systems where it works.
-.TP 8
-.B overlayStderr\fP (class \fBBoolean\fP)
-If \fBcaptureStderr\fP is True, and your server supports ``overlay'' visuals,
-then the text will be written into one of the higher layers instead of into
-the same layer as the running screenhack.  Set this to False to disable 
-that (though you shouldn't need to.)
-.TP 8
-.B overlayTextForeground\fP (class \fBForeground\fP)
-The foreground color used for the stdout/stderr text, if \fBcaptureStderr\fP
-is true.  Default: Yellow.
-.TP 8
-.B overlayTextBackground\fP (class \fBBackground\fP)
-The background color used for the stdout/stderr text, if \fBcaptureStderr\fP
-is true.  Default: Black.
-.TP 8
-.B bourneShell\fP (class \fBBourneShell\fP)
-The pathname of the shell that \fIxscreensaver\fP uses to start subprocesses.
-This must be whatever your local variant of \fB/bin/sh\fP is: in particular,
-it must not be \fBcsh\fP.
-.SH COMMAND-LINE OPTIONS
-.I xscreensaver
-also accepts the following command line options.  Except for 
-the \fI\-display\fP option, these command-line options are all 
-simply shorthand for the X resources described in 
-the \fIConfiguration\fP section, above.
-.TP 8
-.B \-display \fIhost:display.screen\fP
-The X display to use.  For displays with multiple screens, XScreenSaver 
-will manage all screens on the display simultaniously; the \fIscreen\fP 
-argument (the ``default'' screen) says which screen should be used for
-dialog boxes (the password window, \fIDemo Mode\fP, etc.)
-.TP 8
-.B \-timeout \fIminutes\fP
-Same as the \fItimeout\fP resource.
-.TP 8
-.B \-cycle \fIminutes\fP
-Same as the \fIcycle\fP resource.
-.TP 8
-.B \-lock\-mode
-Same as setting the \fIlock\fP resource to \fItrue\fP.
-.TP 8
-.B \-no\-lock\-mode
-Same as setting the \fIlock\fP resource to \fIfalse\fP.
-.TP 8
-.B \-lock\-timeout \fIminutes\fP
-Same as the \fIlockTimeout\fP resource.
-.TP 8
-.B \-visual \fIvisual\fP
-Same as the \fIvisualID\fP resource.
-.TP 8
-.B \-install
-Same as setting the \fIinstallColormap\fP resource to \fItrue\fP.
-.TP 8
-.B \-no\-install
-Same as setting the \fIinstallColormap\fP resource to \fIfalse\fP.
-.TP 8
-.B \-verbose
-Same as setting the \fIverbose\fP resource to \fItrue\fP.
-.TP 8
-.B \-silent
-Same as setting the \fIverbose\fP resource to \fIfalse\fP.
-.TP 8
-.B \-timestamp
-Same as setting the \fItimestamp\fP resource to \fItrue\fP.
-.TP 8
-.B \-capture\-stderr
-Same as setting the \fIcaptureStderr\fP resource to \fItrue\fP.
-.TP 8
-.B \-no\-capture\-stderr
-Same as setting the \fIcaptureStderr\fP resource to \fIfalse\fP.
-.TP 8
-.B \-splash
-Same as setting the \fIsplash\fP resource to \fItrue\fP.
-.TP 8
-.B \-no\-splash
-Same as setting the \fIsplash\fP resource to \fIfalse\fP.
-.TP 8
-.B \-nice \fIinteger\fP
-Same as the \fInice\fP resource.
-.TP 8
-.B \-sgi\-extension
-Same as setting the \fIsgiSaverExtension\fP resource to \fItrue\fP.
-.TP 8
-.B \-no\-sgi\-extension
-Same as setting the \fIsgiSaverExtension\fP resource to \fIfalse\fP.
-.TP 8
-.B \-mit\-extension
-Same as setting the \fImitSaverExtension\fP resource to \fItrue\fP.
-.TP 8
-.B \-no\-mit\-extension
-Same as setting the \fImitSaverExtension\fP resource to \fIfalse\fP.
-.TP 8
-.B \-xidle\-extension
-Same as setting the \fIxidleExtension\fP resource to \fItrue\fP.
-.TP 8
-.B \-no\-xidle\-extension
-Same as setting the \fIxidleExtension\fP resource to \fIfalse\fP.
-.TP 8
-.B \-proc\-interrupts
-Same as setting the \fIprocInterrupts\fP resource to \fItrue\fP.
-.TP 8
-.B \-no\-proc\-interrupts
-Same as setting the \fIprocInterrupts\fP resource to \fIfalse\fP.
-.TP 8
-.B \-xrm \fIresource-specification\fP
-As with all other Xt programs, you can specify X resources on the command-line
-using the \fI\-xrm\fP argument.  Most of the interesting resources have 
-command-line equivalents, however.
-.SH HOW IT WORKS
-When it is time to activate the screensaver, a full-screen black window is
-created on each screen of the display.  Each window is created in such a way
-that, to any subsequently-created programs, it will appear to be a ``virtual
-root'' window.  Because of this, any program which draws on the root 
-window (and which understands virtual roots) can be used as a screensaver.
-
-When the user becomes active again, the screensaver windows are unmapped, and
-the running subprocesses are killed by sending them \fBSIGTERM\fP.  This is 
-also how the subprocesses are killed when the screensaver decides that it's
-time to run a different demo: the old one is killed and a new one is launched.
-
-Before launching a subprocess, \fIxscreensaver\fP stores an appropriate value
-for \fB$DISPLAY\fP in the environment that the child will recieve.  (This is
-so that if you start \fIxscreensaver\fP with a \fI-display\fP argument, the
-programs which \fIxscreensaver\fP launches will draw on the same display;
-and so that the child will end up drawing on the appropriate screen of a
-multi-headed display.)
-
-When the screensaver turns off, or is killed, care is taken to restore 
-the ``real'' virtual root window if there is one.  Because of this, it is
-important that you not kill the screensaver process with \fIkill -9\fP if
-you are running a virtual-root window manager.  If you kill it with \-9,
-you may need to restart your window manager to repair the damage.  This
-isn't an issue if you aren't running a virtual-root window manager.
-
-For all the gory details, see the commentary at the top of xscreensaver.c.
-
-You can control a running screensaver process by using the
-.BR xscreensaver\-command (1)
-program (which see.)
-.SH POWER MANAGEMENT
-Modern X servers contain support to power down the monitor after an idle
-period.  If the monitor has powered down, then \fIxscreensaver\fP will
-notice this, and will not waste CPU by drawing graphics demos on a black
-screen.  An attempt will also be made to explicitly power the monitor
-back up as soon as user activity is detected.
-
-If your X server supports power management, then
-.BR xset (1)
-will accept a \fBdpms\fP option.  So, if you wanted \fIxscreensaver\fP
-to activate after 5 minutes, but you wanted your monitor to power down
-after one hour (3600 seconds) you would do this:
-.EX
-xset dpms 3600
-.EE
-See the man page for the
-.BR xset (1)
-program for details.  (Note that power management requires both software
-support in the X server, and hardware support in the monitor itself.)
-.SH USING XDM(1)
-You can run \fIxscreensaver\fP from your 
-.BR xdm (1)
-session, so that the screensaver will run even when nobody is logged 
-in on the console.
-
-The trick to using xscreensaver with \fIxdm\fP is this: keep in mind the 
-two very different states in which xscreensaver will be running:
-.RS 4
-.TP 3
-.B 1: Nobody logged in.
-
-If you're thinking of running xscreensaver from XDM at all, then it's 
-probably because you want graphics demos to be running on the console
-when nobody is logged in there.  In this case, xscreensaver will function
-only as a screen saver, not a screen locker: it doesn't make sense
-for xscreensaver to lock the screen, since nobody is logged in yet!
-The only thing on the screen is the XDM login prompt.
-.TP 3
-.B 2: Somebody logged in.
-
-Once someone has logged in through the XDM login window, the situation is
-very different.  For example: now it makes sense to lock the screen (and
-prompt for the logged in user's password); and now xscreensaver should
-consult that user's \fI~/.xscreensaver\fP file; and so on.
-.RE
-
-The difference between these two states comes down to a question of,
-which user is the \fIxscreensaver\fP process running as?  For the first
-state, it doesn't matter.  If you start \fIxscreensaver\fP in the usual
-XDM way, then xscreensaver will probably end up running as root, which 
-is fine for the first case (the ``nobody logged in'' case.)
-
-However, once someone is logged in, running as root is no longer fine:
-because xscreensaver will be consulting root's \fI.xscreensaver\fP file
-instead of that of the logged in user, and won't be prompting for the
-logged in user's password, and so on.  (This is not a security problem,
-it's just not what you want.)
-
-So, once someone has logged in, you want xscreensaver to be running as that
-user.  The way to accomplish this is to kill the old xscreensaver process
-and start a new one (as the new user.)
-
-The simplest way to accomplish all of this is as follows:
-.RS 4
-.TP 3
-.B 1: Launch xscreensaver before anyone logs in.
-
-To the file \fI/usr/lib/X11/xdm/Xsetup\fP, add the lines
-.EX
-xscreensaver-command -exit
-xscreensaver &
-.EE
-This will run xscreensaver as root, over the XDM login window.
-Moving the mouse will cause the screen to un-blank, and allow the user
-to type their password at XDM to log in.
-.TP 3
-.B 2: Restart xscreensaver when someone logs in.
-
-Near the top of the file \fI/usr/lib/X11/xdm/Xsession\fP, add those same lines:
-.EX
-xscreensaver-command -exit
-xscreensaver &
-.EE
-When someone logs in, this will kill off the existing (root) xscreensaver
-process, and start a new one, running as the user who has just logged in.
-If the user's .xscreensaver file requests locking, they'll get it.  They
-will also get their own choice of timeouts, and graphics demos, and so on.
-
-Alternately, each user could just put those lines in their 
-personal \fI~/.xsession\fP files.
-.RE
-
-Make sure you have \fB$PATH\fP set up correctly in the \fIXsetup\fP 
-and \fIXsession\fP scripts, or \fIxdm\fP won't be able to 
-find \fIxscreensaver\fP, and/or \fIxscreensaver\fP won't be able to 
-find its graphics demos.
-
-(If your system does not seem to be executing the \fIXsetup\fP file, you
-may need to configure it to do so: the traditional way to do this is
-to make that file the value of the \fIDisplayManager*setup\fP resource
-in the \fI/usr/lib/X11/xdm/xdm-config\fP file.  See the man page for
-.BR xdm (1)
-for more details.)
-
-It is safe to run \fIxscreensaver\fP as root (as \fIxdm\fP is likely to do.)  
-If run as root, \fIxscreensaver\fP changes its effective user and group ids 
-to something safe (like \fI"nobody"\fP) before connecting to the X server
-or launching user-specified programs.
-
-An unfortunate side effect of this (important) security precaution is that
-it may conflict with cookie-based authentication.
-
-If you get "connection refused" errors when running \fIxscreensaver\fP
-from \fIxdm\fP, then this probably means that you have
-.BR xauth (1)
-or some other security mechanism turned on.  One way around this is to
-add \fB"xhost\ +localhost"\fP to \fIXsetup\fP, just before \fIxscreensaver\fP
-is launched.  
-
-Note that this will give access to the X server to anyone capable of logging
-in to the local machine, so in some environments, this might not be 
-appropriate.  If turning off file-system-based access control is not
-acceptable, then running \fIxscreensaver\fP from the \fIXsetup\fP file
-might not be possible, and xscreensaver will only work when running as
-a normal, unprivileged user.
-
-For more information on the X server's access control mechanisms, see the
-man pages for
-.BR X (1),
-.BR Xsecurity (1),
-.BR xauth (1),
-and
-.BR xhost (1).
-.SH USING CDE (COMMON DESKTOP ENVIRONMENT)
-The easiest way to use \fIxscreensaver\fP on a system with CDE is to simply
-switch off the built-in CDE screensaver, and use \fIxscreensaver\fP instead;
-and second, to tell the front panel to run 
-.BR xscreensaver\-command (1)
-with the \fI\-lock\fP option when the \fILock\fP icon is clicked.
-
-To accomplish this involves five steps:
-.RS 4
-.TP 3
-\fB1: Switch off CDE's locker\fP
-Do this by turning off ``\fIScreen Saver and Screen Lock\fP'' in the
-Screen section of the Style Manager.
-.TP 3
-\fB2: Edit sessionetc\fP
-Edit the file \fI~/.dt/sessions/sessionetc\fP and add to it the line
-.EX
-xscreensaver &
-.EE
-This will cause \fIxscreensaver\fP to be launched when you log in.
-(As always, make sure that xscreensaver and the graphics demos are on
-your \fB$PATH\fP; the path needs to be set in \fI.cshrc\fP 
-and/or \fI.dtprofile\fP, not \fI.login\fP.)
-.TP 3
-\fB3: Create XScreenSaver.dt\fP
-Create a file called \fI~/.dt/types/XScreenSaver.dt\fP with the following
-contents:
-.EX
-ACTION XScreenSaver
-{
-  LABEL         XScreenSaver
-  TYPE          COMMAND
-  EXEC_STRING   xscreensaver-command -lock
-  ICON          Dtkey
-  WINDOW_TYPE   NO_STDIO
-}
-.EE
-This defines a ``lock'' command for the CDE front panel, that knows how
-to talk to \fIxscreensaver\fP.
-.TP 3
-\fB4: Create Lock.fp\fP
-Create a file called \fI~/.dt/types/Lock.fp\fP with the following
-contents:
-.EX
-CONTROL Lock
-{
-  TYPE             icon
-  CONTAINER_NAME   Switch
-  CONTAINER_TYPE   SWITCH
-  POSITION_HINTS   1
-  ICON             Fplock
-  LABEL            Lock
-  PUSH_ACTION      XScreenSaver
-  HELP_TOPIC       FPOnItemLock
-  HELP_VOLUME      FPanel
-}
-.EE
-This associates the CDE front panel ``Lock'' icon with the lock command
-we just defined in step 3.
-.TP 3
-\fB5: Restart\fP
-Select ``\fIRestart Workspace Manager\fP'' from the popup menu to make
-your changes take effect.  If things seem not to be working, check the
-file \fI~/.dt/errorlog\fP for error messages.
-.RE
-.SH USING HP VUE (VISUAL USER ENVIRONMENT)
-Since CDE is a descendant of VUE, the instructions for using xscreensaver
-under VUE are similar to the above:
-.RS 4
-.TP 3
-\fB1: Switch off VUE's locker\fP
-Open the ``\fIStyle Manager\fP'' and select ``\fIScreen\fP.''
-Turn off ``\fIScreen Saver and Screen Lock\fP'' option.
-.TP 3
-\fB2: Make sure you have a Session\fP
-Next, go to the Style Manager's, ``\fIStartup\fP'' page.
-Click on ``\fISet Home Session\fP'' to create a session, then 
-on ``\fIReturn to Home Session\fP'' to select this session each
-time you log in.
-.TP 3
-\fB3: Edit vue.session\fP
-Edit the file \fI~/.vue/sessions/home/vue.session\fP and add to it
-the line
-.EX
-vuesmcmd -screen 0 -cmd "xscreensaver"
-.EE
-This will cause \fIxscreensaver\fP to be launched when you log in.
-(As always, make sure that xscreensaver and the graphics demos are on
-your \fB$PATH\fP; the path needs to be set in \fI.cshrc\fP
-and/or \fI.profile\fP, not \fI.login\fP.)
-.TP 3
-\fB3: Edit vuewmrc\fP
-Edit the file \fI~/.vue/vuewmrc\fP and add (or change) the Lock control:
-.EX
-CONTROL Lock
-{
-  TYPE         button
-  IMAGE        lock
-  PUSH_ACTION  f.exec "xscreensaver-command -lock"
-  HELP_TOPIC   FPLock
-}
-.EE
-This associates the VUE front panel ``Lock'' icon with the xscreensaver 
-lock command.
-.RE
-.PP
-.SH ADDING TO MENUS
-The
-.BR xscreensaver-command (1)
-program is a perfect candidate for something to add to your window manager's
-popup menus.  If you use 
-.BR mwm (1),
-.BR 4Dwm (1),
-.BR twm (1),
-or (probably) any of \fItwm\fP's many descendants, you can do it like this:
-.RS 0
-.TP 3
-\fB1. Create ~/.mwmrc (or ~/.twmrc or ...)\fP
-If you don't have a \fI~/.mwmrc\fP file (or, on SGIs, a \fI~/.4Dwmrc\fP file;
-or, with twm, a \fI~/.twmrc\fP file) then create one by making a copy of
-the \fI/usr/lib/X11/system.mwmrc\fP 
-file (or \fI/usr/lib/X11/twm/system.twmrc\fP, and so on.)
-.TP 3
-\fB2. Add a menu definition.\fP
-Something like this:
-.EX
-menu XScreenSaver
-{
- "Blank Screen Now" !"sleep 3; xscreensaver-command -activate"
- "Lock Screen Now"  !"sleep 3; xscreensaver-command -lock"
- "Screen Saver Demo"         !"xscreensaver-demo"
- "Screen Saver Preferences"  !"xscreensaver-demo -prefs"
- "Reinitialize Screen Saver" !"xscreensaver-command -restart"
- "Kill Screen Saver"         !"xscreensaver-command -exit"
- "Launch Screen Saver"       !"xscreensaver &"
-}
-.EE
-.TP 3
-\fB3. Add the menu\fP
-For
-.BR mwm (1)
-and
-.BR 4Dwm (1),
-find the section of the file that says \fIMenu DefaultRootMenu\fP.
-For
-.BR twm (1),
-it will probably be \fImenu "defops"\fP.  If you add a line somewhere 
-in that menu definition that reads
-.EX
-  "XScreenSaver"        f.menu XScreenSaver
-.EE
-then this will add an XScreenSaver sub-menu to your default root-window
-popup menu.  Alternately, you could just put the xscreensaver menu items
-directly into the root menu.
-.RE
-
-Other window managers are guaranteed to do things gratuitously differently.
-.SH BUGS
-Bugs?  There are no bugs.  Ok, well, maybe.  If you find one, please let
-me know.  http://www.jwz.org/xscreensaver/bugs.html explains how to
-construct the most useful bug reports.
-.TP 8
-.B Locking and XDM
-If xscreensaver has been launched from 
-.BR xdm (1)
-before anyone has logged in, you will need to kill and then restart the
-xscreensaver daemon after you have logged in, or you will be confused by
-the results.  (For example, locking won't work, and your \fI~/.xscreensaver\fP
-file will be ignored.)
-
-When you are logged in, you want the \fIxscreensaver\fP daemon to be 
-running under \fIyour\fP user id, not as root or some other user.
-
-If it has already been started by \fIxdm\fP, you can kill it by sending
-it the \fBexit\fP command, and then re-launching it as you, by putting
-something like the following in your personal X startup script:
-.EX
-xscreensaver-command -exit
-xscreensaver &
-.EE
-The ``\fIUsing XDM(1)\fP'' section, above, goes into more detail, and explains
-how to configure the system to do this for all users automatically.
-.TP 8
-.B Locking and root logins
-In order for it to be safe for xscreensaver to be launched by \fIxdm\fP,
-certain precautions had to be taken, among them that xscreensaver never
-runs as \fIroot\fP.  In particular, if it is launched as root (as \fIxdm\fP
-is likely to do), xscreensaver will disavow its privileges, and switch 
-itself to a safe user id (such as \fInobody\fP.)
-
-An implication of this is that if you log in as \fIroot\fP on the console, 
-xscreensaver will refuse to lock the screen (because it can't tell
-the difference between \fIroot\fP being logged in on the console, and a
-normal user being logged in on the console but xscreensaver having been 
-launched by the
-.BR xdm (1)
-.I Xsetup
-file.)
-
-The solution to this is simple: you shouldn't be logging in on the console
-as \fIroot\fP in the first place!  (What, are you crazy or something?)  
-
-Proper Unix hygiene dictates that you should log in as yourself, and
-.BR su (1)
-to \fIroot\fP as necessary.  People who spend their day logged in
-as \fIroot\fP are just begging for disaster.
-.TP 8
-.B XAUTH and XDM
-For xscreensaver to work when launched by
-.BR xdm (1),
-programs running on the local machine as user \fI"nobody"\fP must be
-able to connect to the X server.  This means that if you want to run
-xscreensaver on the console while nobody is logged in, you may need
-to disable cookie-based access control (and allow all users who can log
-in to the local machine to connect to the display.)  
-
-You should be sure that this is an acceptable thing to do in your
-environment before doing it.  See the ``\fIUsing XDM(1)\fP'' section, 
-above, for more details.
-
-If anyone has suggestions on how xscreensaver could be made to work with
-.BR xdm (1)
-without first turning off \fI.Xauthority\fP-based access control, please
-let me know.
-.TP 8
-.B Passwords
-If you get an error message at startup like ``couldn't get password
-of \fIuser\fP'' then this probably means that you're on a system in which 
-the
-.BR getpwent (3)
-library routine can only be effectively used by root.  If this is the case, 
-then \fIxscreensaver\fP must be installed as setuid to root in order for
-locking to work.  Care has been taken to make this a safe thing to do.  
-
-It also may mean that your system uses shadow passwords instead of the standard
-.BR getpwent (3)
-interface; in that case, you may need to change some options 
-with \fIconfigure\fP and recompile.
-
-If you change your password after xscreensaver has been launched, it will
-continue using your old password to unlock the screen until xscreensaver
-is restarted.  So, after you change your password, you'll have to do
-.EX
-xscreensaver-command -restart
-.EE
-to make \fIxscreensaver\fP notice.
-.TP 8
-.B PAM Passwords
-If your system uses PAM (Pluggable Authentication Modules), then in order
-for xscreensaver to use PAM properly, PAM must be told about xscreensaver.
-The xscreensaver installation process should update the PAM data (on Linux,
-by creating the file \fI/etc/pam.d/xscreensaver\fP for you, and on Solaris, 
-by telling you what lines to add to the \fI/etc/pam.conf\fP file.)  
-
-If the PAM configuration files do not know about xscreensaver, then 
-you \fImight\fP be in a situation where xscreensaver will refuse to ever
-unlock the screen.
-
-This is a design flaw in PAM (there is no way for a client to tell the
-difference between PAM responding ``I have never heard of your module,''
-and responding, ``you typed the wrong password.'')  As far as I can tell,
-there is no way for xscreensaver to automatically work around this, or
-detect the problem in advance, so if you have PAM, make sure it is
-configured correctly!
-.TP 8
-.B Colormap lossage: TWM
-The \fBinstallColormap\fP option doesn't work very well with the
-.BR twm (1)
-window manager and its descendants.  
-
-There is a race condition between the screensaver and this window manager,
-which can result in the screensaver's colormap not getting installed
-properly, meaning the graphics hacks will appear in essentially random
-colors.  (If the screen goes white instead of black, this is probably why.)
-
-The
-.BR mwm (1)
-and
-.BR olwm (1)
-window managers don't have this problem.  The race condition exists
-because X (really, ICCCM) does not provide a way for an OverrideRedirect 
-window to have its own colormap, short of grabbing the server (which is 
-neither a good idea, nor really possible with the current design.)  What 
-happens is that, as soon as xscreensaver installs its colormap, \fBtwm\fP 
-responds to the resultant \fBColormapNotify\fP event by re-instaling the 
-default colormap.  Apparently, \fBtwm\fP doesn't \fIalways\fP do this; it 
-seems to do it regularly if the screensaver is activated from a menu item, 
-but seems to not do it if the screensaver comes on of its own volition, or 
-is activated from another console.  
-.RS 8
-.TP 4
-.B Attention, window manager authors!
-You should only call
-.BR XInstallColormap (3)
-in response to user events.  That is, it is appropriate to install a colormap
-in response to \fBFocusIn\fP, \fBFocusOut\fP, \fBEnterNotify\fP, 
-and \fBLeaveNotify\fP events; but it is not appropriate to call it in
-response to \fBColormapNotify\fP events.  If you install colormaps in
-response to \fIapplication\fP actions as well as in response to \fIuser\fP
-actions, then you create the situation where it is impossible for 
-override-redirect applications (such as xscreensaver) to display their
-windows in the proper colors.
-.RE
-.TP 8
-.B Colormap lossage: XV, XAnim, XEarth
-Some programs don't operate properly on visuals other than the default one,
-or with colormaps other than the default one.  See the discussion of the
-magic "default-n" visual name in the description of the \fBprograms\fP 
-resource in the \fIConfiguration\fP section.  When programs only work with
-the default colormap, you need to use a syntax like this:
-.EX
-   default-n: xv -root image-1.gif -quit  \\n\\
-   default-n: xearth -nostars -wait 0     \\n\\
-.EE
-It would also work to turn off the \fBinstallColormap\fP option altogether,
-but that would deny extra colors to those programs that \fIcan\fP take
-advantage of them.
-.TP 8
-.B Machine Load
-Although this program ``nices'' the subprocesses that it starts, 
-graphics-intensive subprograms can still overload the machine by causing
-the X server process itself (which is not ``niced'') to suck a lot of 
-cycles.  Care should be taken to slow down programs intended for use as 
-screensavers by inserting strategic calls to
-.BR sleep (3)
-or
-.BR usleep (3)
-(or making liberal use of any \fI\-delay\fP options which the programs 
-may provide.)
-
-Note that the OpenGL-based graphics demos are real pigs on machines that
-don't have texture hardware.
-
-Also, an active screensaver will cause your X server to be pretty much 
-permanently swapped in; but the same is true of any program that draws
-periodically, like 
-.BR xclock (1)
-or
-.BR xload (1).
-.TP 8
-.B Latency and Responsiveness
-If the subprocess is drawing too quickly and the connection to the X
-server is a slow one (such as an X terminal running over a phone line) then 
-the screensaver might not turn off right away when the user becomes active
-again (the
-.BR ico (1)
-demo has this problem if being run in full-speed mode).  This can be
-alleviated by inserting strategic calls to
-.BR XSync (3)
-in code intended for use as a screensaver.  This prevents too much graphics
-activity from being buffered up.
-.TP 8
-.B XFree86's Magic Keystrokes
-The XFree86 X server traps certain magic keystrokes before client programs ever
-see them.  Two that are of note are Ctrl+Alt+Backspace, which causes 
-the X server to exit; and Ctrl+Alt+F\fIn\fP, which switches virtual consoles.
-The X server will respond to these keystrokes even if xscreensaver has the
-screen locked.  Depending on your setup, you might consider this a problem.
-
-Unfortunately, there is no way for xscreensaver itself to override the
-interpretation of these keys.  If you want to disable Ctrl+Alt+Backspace
-globally, you need to set the \fIDontZap\fP flag in 
-your \fI/etc/X11/XF86Config\fP file.  See the
-.BR XF86Config (5)
-manual for details.
-
-There is no way (as far as I can tell) to disable the VT-switching keystrokes.
-
-Some Linux systems come with a VT_LOCKSWITCH ioctl, that one could 
-theoretically use to prevent VT-switching while the screen is locked; 
-but unfortunately, this ioctl can only be used by root, which means
-that xscreensaver can't use it (since xscreensaver disavows its privileges
-shortly after startup, for security reasons.)
-
-Any suggestions for other solutions to this problem are welcome.
-.TP 8
-.B XView Clients
-Apparently there are some problems with XView programs getting confused
-and thinking that the screensaver window is the real root window even when
-the screensaver is not active: ClientMessages intended for the window manager
-are sent to the screensaver window instead.  This could be solved by making
-xscreensaver forward all unrecognised ClientMessages to the real root window,
-but there may be other problems as well.  If anyone has any insight on the
-cause of this problem, please let me know.  (XView is an X11 toolkit that 
-implements the (quite abominable) Sun OpenLook look-and-feel.)
-.TP 8
-.B MIT Extension and Fading
-The \fBMIT-SCREEN-SAVER\fP extension is junk.  Don't use it.
-
-When using the \fBMIT-SCREEN-SAVER\fP extension in conjunction with 
-the \fBfade\fP option, you'll notice an unattractive flicker just before 
-the fade begins.  This is because the server maps a black window just before 
-it tells the \fIxscreensaver\fP process to activate.  The \fIxscreensaver\fP 
-process immediately unmaps that window, but this results in a flicker.  I 
-haven't figured a way  to get around this; it seems to be a fundamental
-property of the (mis-) design of this server extension.
-
-It sure would be nice if someone would implement the \fBSGI SCREEN_SAVER\fP
-extension in XFree86; it's dead simple, and works far better than the
-overengineered and broken \fBMIT-SCREEN-SAVER\fP extension.
-.TP 8
-.B SGI Power Saver
-If you're running Irix 6.3, you might find that your monitor is powering down
-after an hour or two even if you've told it not to.  This is fixed by SGI
-patches 2447 and 2537.
-
-If you're running Irix 6.5, this bug is back.  I don't know a fix.
-.TP 8
-.B MesaGL and Voodoo Cards
-If you have a 3Dfx/Voodoo card, the default settings for xscreensaver will
-run the GL-based graphics demos in such a way that they will not take 
-advantage of the 3D acceleration hardware.  The solution is to change
-the \fBprograms\fP entries for the GL hacks from this:
-.EX
-       gears -root                        \\n\\
-.EE
-to this:
-.EX
-       MESA_GLX_FX=fullscreen  gears      \\n\\
-.EE
-That is, make sure that \fB$MESA_GLX_FX\fP is set to \fIfullscreen\fP, and
-don't tell the program to draw on the root window.  This may seem strange,
-but the setup used by Mesa and these kinds of cards \fIis\fP strange!
-
-For those who don't know, these cards work by sitting between your normal
-video card and the monitor, and seizing control of the monitor when it's 
-time to do 3D.  But this means that accelerated 3D only happens in full-screen
-mode (you can't do it in a window, and you can't see the output of 3D and 2D
-programs simultaniously), and that 3D will probably drive your monitor at a
-lower resolution, as well.  It's bizarre.
-
-If you find that GL programs only work properly when run as root, and not
-as normal users, then the problem is that your \fI/dev/3dfx\fP file is not
-configured properly.  Check the Linux 3Dfx FAQ.
-.TP 8
-.B Keyboard LEDs
-If \fIprocInterrupts\fP is on (which is the default on Linux systems) and
-you're using some program that toggles the state of your keyboard LEDs,
-xscreensaver won't work right: turning those LEDs on or off causes a 
-keyboard interrupt, which xscreensaver will interpret as user activity.
-So if you're using such a program, set the \fIprocInterrupts\fP resource
-to False.
-.TP 8
-.B Extensions
-If you are not making use of one of the server extensions (\fBXIDLE\fP,
-\fBSGI SCREEN_SAVER\fP, or \fBMIT-SCREEN-SAVER\fP), then it is possible, in 
-rare situations, for \fIxscreensaver\fP to interfere with event propagation 
-and make another X program malfunction.  For this to occur, that other
-application would need to \fInot\fP select \fBKeyPress\fP events on its 
-non-leaf windows within the first 30 seconds of their existence, but then 
-select for them later.  In this case, that client \fImight\fP fail to receive 
-those events.  This isn't very likely, since programs generally select a
-constant set of events immediately after creating their windows and then 
-don't change them, but this is the reason that it's a good idea to install 
-and use one of the server extensions instead, to work around this shortcoming
-in the X protocol.
-
-In all these years, I've not heard of even a single case of this happening,
-but it is theoretically possible, so I'm mentioning it for completeness...
-.TP 8
-.B Red Hot Lava
-There need to be a lot more graphics hacks.  In particular, there should be
-a simulation of a Lavalite (tm).
-.SH ENVIRONMENT
-.PP
-.TP 8
-.B DISPLAY
-to get the default host and display number, and to inform the sub-programs
-of the screen on which to draw.
-.TP 8
-.B PATH
-to find the sub-programs to run.
-.TP 8
-.B HOME
-for the directory in which to read and write the \fI.xscreensaver\fP file.
-.TP 8
-.B XENVIRONMENT
-to get the name of a resource file that overrides the global resources
-stored in the RESOURCE_MANAGER property.
-.SH UPGRADES
-The latest version can always be found at 
-http://www.jwz.org/xscreensaver/
-.SH SEE ALSO
-.BR X (1),
-.BR xscreensaver\-demo (1),
-.BR xscreensaver\-command (1),
-.BR xdm (1),
-.BR xset (1),
-.BR Xsecurity (1),
-.BR xauth (1),
-.BR xhost (1).
-.BR ant (1),
-.BR atlantis (1),
-.BR attraction (1),
-.BR blitspin (1),
-.BR bouboule (1),
-.BR braid (1),
-.BR bsod (1),
-.BR bubble3d (1),
-.BR bubbles (1),
-.BR cage (1),
-.BR compass (1),
-.BR coral (1),
-.BR critical (1),
-.BR crystal (1),
-.BR cynosure (1),
-.BR decayscreen (1),
-.BR deco (1),
-.BR deluxe (1),
-.BR demon (1),
-.BR discrete (1),
-.BR distort (1),
-.BR drift (1),
-.BR epicycle (1),
-.BR fadeplot (1),
-.BR flag (1),
-.BR flame (1),
-.BR flow (1),
-.BR forest (1),
-.BR galaxy (1),
-.BR gears (1),
-.BR glplanet (1),
-.BR goop (1),
-.BR grav (1),
-.BR greynetic (1),
-.BR halo (1),
-.BR helix (1),
-.BR hopalong (1),
-.BR hypercube (1),
-.BR ifs (1),
-.BR imsmap (1),
-.BR interference (1),
-.BR jigsaw (1),
-.BR julia (1),
-.BR kaleidescope (1),
-.BR kumppa (1),
-.BR lament (1),
-.BR laser (1),
-.BR lightning (1),
-.BR lisa (1),
-.BR lissie (1),
-.BR lmorph (1),
-.BR loop (1),
-.BR maze (1),
-.BR moebius (1),
-.BR moire (1),
-.BR moire2 (1),
-.BR morph3d (1),
-.BR mountain (1),
-.BR munch (1),
-.BR noseguy (1),
-.BR pedal (1),
-.BR penetrate (1),
-.BR penrose (1),
-.BR petri (1),
-.BR phosphor (1),
-.BR pipes (1),
-.BR pulsar (1),
-.BR pyro (1),
-.BR qix (1),
-.BR rd-bomb (1),
-.BR rocks (1),
-.BR rorschach (1),
-.BR rotor (1),
-.BR rubik (1),
-.BR sierpinski (1),
-.BR slidescreen (1),
-.BR slip (1),
-.BR sonar (1),
-.BR sphere (1),
-.BR spiral (1),
-.BR spotlight (1),
-.BR sproingies (1),
-.BR squiral (1),
-.BR stairs (1),
-.BR starfish (1),
-.BR strange (1),
-.BR superquadrics (1),
-.BR swirl (1),
-.BR t3d (1),
-.BR triangle (1),
-.BR truchet (1),
-.BR vines (1),
-.BR wander (1),
-.BR worm (1),
-.BR xflame (1),
-.BR xjack (1),
-.BR xlyap (1),
-.BR xmatrix (1),
-.BR xroger (1),
-.BR bongo (1),
-.BR ico (1),
-.BR xaos (1),
-.BR xbouncebits (1),
-.BR xcthugha (1),
-.BR xdaliclock (1),
-.BR xfishtank (1),
-.BR xmountains (1),
-.BR xsplinefun (1),
-.BR xswarm (1),
-.BR xtacy (1),
-.BR xv (1),
-.BR xwave (1).
-.SH COPYRIGHT
-Copyright \(co 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999
-by Jamie Zawinski.  Permission to use, copy, modify, distribute, and sell
-this software 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.  No representations are made about the suitability of this
-software for any purpose.  It is provided "as is" without express or implied
-warranty.
-.SH AUTHOR
-Jamie Zawinski <jwz@jwz.org>.  Written in late 1991; first posted
-to comp.sources.x on 13-Aug-1992.
-
-Please let me know if you find any bugs or make any improvements.
-.SH ACKNOWLEDGEMENTS
-Thanks to the many people who have contributed graphics demos to the package.
-
-Thanks to David Wojtowicz for implementing \fIlockTimeout\fP.
-
-Thanks to Martin Kraemer for adding support for shadow passwords and
-locking-disabled diagnostics.
-
-Thanks to Patrick Moreau for the VMS port.
-
-Thanks to Mark Bowyer for figuring out how to hook it up to CDE.
-
-Thanks to Nat Lanza for the Kerberos support.
-
-Thanks to Bill Nottingham for the initial PAM support.
-
-And thanks to Jon A. Christopher for implementing the Athena dialog
-support, back in the days before Lesstif or Gtk were viable alternatives
-to Motif.
diff --git a/makevms.com b/makevms.com
new file mode 100644 (file)
index 0000000..213cc0c
--- /dev/null
@@ -0,0 +1,57 @@
+$! Build Xscreensaver under OpenVMS V 6.x system  with DEC C 5.x compiler
+$!
+$ copy /log CONFIG.H-VMS CONFIG.H
+$!
+$! Architecture type test (VAX < 1024 <= Alpha AXP)
+$!
+$ if f$getsyi("HW_MODEL").ge.1024
+$ then
+$! 
+$! Alpha AXP
+$! build Utils library
+$!
+$   set def [.UTILS]
+$   @COMPILE_AXP
+$   set def [-]
+$!
+$! build graphics hacks
+$!
+$   set def [.HACKS]
+$   @COMPILE_AXP
+$   @LINK_AXP
+$   set def [-]
+$!
+$! Build Xscreensaver & Xscreensaver-command
+$!
+$   set def [.DRIVER]
+$   @COMPILE_AXP
+$   @LINK_AXP
+$   set def [-]
+$ else
+$! 
+$! Good old VAX
+$! build Utils library
+$!
+$   set def [.UTILS]
+$   @COMPILE_DECC
+$   set def [-]
+$!
+$! build graphics hacks
+$!
+$   set def [.HACKS]
+$   @COMPILE_DECC
+$   @LINK_DECC
+$   set def [-]
+$!
+$! Build Xscreensaver & Xscreensaver-command
+$!
+$   set def [.DRIVER]
+$   @COMPILE_DECC
+$   @LINK_DECC
+$   set def [-]
+$ endif
+$!
+$! DCL symbols definition 
+$!
+$ @SETUP
+$ exit
diff --git a/screenblank.txt b/screenblank.txt
new file mode 100644 (file)
index 0000000..1762158
--- /dev/null
@@ -0,0 +1,46 @@
+From mrapple@quack.kfu.com Mon Apr 26 18:31:07 1993
+Newsgroups: alt.hackers
+From: mrapple@quack.kfu.com (Nick Sayer)
+Subject: screenblank and xautolock living in harmony
+Organization: The Duck Pond public unix: +1 408 249 9630, log in as 'guest'.
+Date: 23 Apr 1993 19:26:57 UTC
+
+
+I have a Sun and use xinit to start X. This presented a problem.
+If I use xautolock or xscreensaver to save the screen, then after
+a period of inactivity screenblank would turn the video off despite
+'xset s off'. If I didn't run screenblank, then who would take care of
+the display when X wasn't running?
+
+The hack that saved the day was to include this in .xinitrc:
+
+(
+
+while true ; do
+sleep 360
+touch /dev/console
+done
+
+) &
+killblank=$!
+
+[start up all the clients, etc, etc. Wait for the window manager
+to die, then ]
+
+kill $killblank
+
+The result is that screenblank is kept safely out of the way when X
+is running and left to do its job otherwise.
+
+Yes, I know using XDM would solve this problem.
+
+No, I'm probably not the first to think of this.
+
+You're welcome.
+
+-- 
+Nick Sayer <mrapple@quack.kfu.com>   | "Dear Sexy Nickers. I don't half fancy
+N6QQQ @ N0ARY.#NOCAL.CA.USA.NOAM     | you. Meet me at the lift at 5:30 and
++1 408 249 9630, log in as 'guest'   | we'll get it together."
+PGP 2.2 public key via finger        |               -- Mr. Lucas
+
diff --git a/setup.com b/setup.com
new file mode 100644 (file)
index 0000000..b6c545e
--- /dev/null
+++ b/setup.com
@@ -0,0 +1,97 @@
+$! Xscreensaver - definition of various DCL symbols
+$ set NOON
+$ set def [.HACKS]
+$ mydisk = f$trnlmn("SYS$DISK")
+$ mydir  = mydisk+f$directory()
+$ ant          :== $'mydir'ant
+$ attraction   :== $'mydir'attraction
+$ blitspin     :== $'mydir'blitspin
+$ bouboule     :== $'mydir'bouboule
+$ braid                :== $'mydir'braid
+$ bsod         :== $'mydir'bsod
+$ bubbles      :== $'mydir'bubbles
+$ compass      :== $'mydir'compass
+$ coral                :== $'mydir'coral
+$ critical     :== $'mydir'critical
+$ crystal      :== $'mydir'crystal
+$ cynosure     :== $'mydir'cynosure
+$ decayscreen  :== $'mydir'decayscreen
+$ deco         :== $'mydir'deco
+$ deluxe       :== $'mydir'deluxe
+$ demon                :== $'mydir'demon
+$ discrete     :== $'mydir'discrete
+$ distort      :== $'mydir'distort
+$ drift                :== $'mydir'drift
+$ epicycle     :== $'mydir'epicycle
+$ fadeplot     :== $'mydir'fadeplot
+$ flag         :== $'mydir'flag
+$ flame                :== $'mydir'flame
+$ flow         :== $'mydir'flow
+$ forest       :== $'mydir'forest
+$ galaxy       :== $'mydir'galaxy
+$ goop         :== $'mydir'goop
+$ grav         :== $'mydir'grav
+$ greynetic    :== $'mydir'greynetic
+$ halo         :== $'mydir'halo
+$ helix                :== $'mydir'helix
+$ hopalong     :== $'mydir'hopalong
+$ hypercube    :== $'mydir'hypercube
+$ ifs          :== $'mydir'ifs
+$ imsmap       :== $'mydir'imsmap
+$ interference :== $'mydir'interference
+$ jigsaw       :== $'mydir'jigsaw
+$ julia                :== $'mydir'julia
+$ kaleidescope :== $'mydir'kaleidescope
+$ kumppa       :== $'mydir'kumppa
+$ laser                :== $'mydir'laser
+$ lightning    :== $'mydir'lightning
+$ lisa         :== $'mydir'lisa
+$ lissie       :== $'mydir'lissie
+$ lmorph       :== $'mydir'lmorph
+$ loop         :== $'mydir'loop
+$ maze         :== $'mydir'maze
+$ moire                :== $'mydir'moire
+$ moire2       :== $'mydir'moire2
+$ mountain     :== $'mydir'mountain
+$ munch                :== $'mydir'munch
+$ noseguy      :== $'mydir'noseguy
+$ pedal                :== $'mydir'pedal
+$ penetrate    :== $'mydir'penetrate
+$ penrose      :== $'mydir'penrose
+$ petri                :== $'mydir'petri
+$ phosphor     :== $'mydir'phosphor
+$ pyro         :== $'mydir'pyro
+$ qix          :== $'mydir'qix
+$ rd-bomb      :== $'mydir'rd-bomb
+$ rocks                :== $'mydir'rocks
+$ rorschach    :== $'mydir'rorschach
+$ rotor                :== $'mydir'rotor
+$ shadebobs    :== $'mydir'shadebobs
+$ sierpinski   :== $'mydir'sierpinski
+$ slidescreen  :== $'mydir'slidescreen
+$ slip         :== $'mydir'slip
+$ sonar                :== $'mydir'sonar
+$ sphere       :== $'mydir'sphere
+$ spiral       :== $'mydir'spiral
+$ spotlight    :== $'mydir'spotlight
+$ squiral      :== $'mydir'squiral
+$ starfish     :== $'mydir'starfish
+$ strange      :== $'mydir'strange
+$ swirl                :== $'mydir'swirl
+$ t3d          :== $'mydir't3d
+$ triangle     :== $'mydir'triangle
+$ truchet      :== $'mydir'truchet
+$ vines                :== $'mydir'vines
+$ wander       :== $'mydir'wander
+$ worm         :== $'mydir'worm
+$ xflame       :== $'mydir'xflame
+$ xjack                :== $'mydir'xjack
+$ xlyap                :== $'mydir'xlyap
+$ xmatrix      :== $'mydir'xmatrix
+$ xroger       :== $'mydir'xroger
+$ set def [-.DRIVER]
+$ mydir  = mydisk+f$directory()
+$ xscreensaver :== $'mydir'xscreensaver
+$ xscreen*command :== $'mydir'xscreensaver-command
+$ set def [-]
+$ exit
diff --git a/utils/Makefile.in b/utils/Makefile.in
new file mode 100644 (file)
index 0000000..858c4d5
--- /dev/null
@@ -0,0 +1,280 @@
+# utils/Makefile.in --- xscreensaver, Copyright (c) 1997 Jamie Zawinski.
+# the `../configure' script generates `utils/Makefile' from this file.
+
+
+# The utilities in this directory are used mostly by the demos in ../hacks/.
+# The Makefile in that directory builds executables by simply referencing
+# the .o files in this directory.
+
+
+##############################################################################
+#
+# Some rambling about dynamic libraries follows, ignore it if you don't care
+# (which is almost assuredly the case.)
+#
+#
+# It would probably be sensible to just build a single .a file in this
+# directory, and link the hacks against that (statically.)  I haven't done
+# that for two reasons: first, it works now, and why fix what ain't broke;
+# second, it wouldn't actually improve anything for the end user (it would
+# just make the Makefiles be a little smaller.)
+#
+# People sometimes suggest that the stuff in this directory should be in a
+# dynamic library, and that the hacks should be linked dynamically against
+# it.  I haven't done this for a number of reasons:
+#
+#  *  First, the only thing that would improve would be disk space, in that
+#     the executable files themselves would be smaller.  That's it.  Many other
+#     things would get worse if we used a dynamic library:
+#
+#  *  Complication of installation procedures: suddenly, before any of the
+#     hacks will work, you need to have a dynamic library installed, and
+#     the system configured to use it.  This is, basically, rocket science.
+#     Most people don't know how to do this, it's a huge pain, and on many
+#     systems, it requires root access.
+#
+#  *  Complication of the Makefile: every system builds dynamic libraries
+#     differently.  Every compiler takes different flags.  I don't want to
+#     do the hand-holding for the scores of Unix systems and compilers on 
+#     which people try to build this program.
+#
+#  *  Reduction of maintainability: gdb is remarkably bad at dealing with
+#     debug info in dynamic libraries, and when debugging a hack, one would
+#     constantly be fighting the linker and the debugger (or linking
+#     statically when debugging.)
+#
+#  *  Version skew: when things are statically linked, it's perfectly ok to
+#     make incompatible changes to the APIs defined in this directory, so long
+#     as the current version in ../hacks/ is in sync.  Much more care would 
+#     need to be taken with such things if dynamic libraries were involved,
+#     to make sure that the major and minor versions of the library changed
+#     at the appropriate time.  This isn't too hard, but it's more work, and
+#     yet another opportunity to screw up.
+#
+#  *  Runtime memory usage goes *up*.  That's right, up!  When a program
+#     links in a dynamic library, the whole library is brought into the 
+#     address space, not just the files that are actually used.  Normally,
+#     this is ok, because if several programs are using (for example)
+#     libX11.so, chances are that the savings outweighs the overhead.  But
+#     the nature of xscreensaver is that only one of the hacks ever runs at
+#     a time -- so there would never be a second program using the utils/
+#     dynamic library with which things could be shared.
+#
+#  *  Runtime speed decreases slightly, since dynamic code is marginally
+#     slower.  On modern machines, this probably doesn't make a perceptible
+#     difference, however.
+#
+# So basically, I just don't think using libraries would be a win, and it would
+# definitely cause more of a maintenance and portability headache.  However,
+# if someone else wants to do the work to make it be an option to configure,
+# and verifies that it works on several (more than three) different Unixes,
+# I'd be happy to take the patches.
+#                                                           -- jwz, 30-Jun-98
+#
+##############################################################################
+
+
+@SET_MAKE@
+.SUFFIXES:
+.SUFFIXES: .c .o
+
+srcdir         = @srcdir@
+VPATH          = @srcdir@
+prefix         = @prefix@
+
+CC             = @CC@
+CFLAGS         = @CFLAGS@
+DEFS           = @DEFS@
+
+DEPEND         = @DEPEND@
+DEPEND_FLAGS   = @DEPEND_FLAGS@
+DEPEND_DEFINES = @DEPEND_DEFINES@
+
+SHELL          = /bin/sh
+INSTALL                = @INSTALL@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_DATA   = @INSTALL_DATA@
+INSTALL_DIRS   = @INSTALL_DIRS@
+
+X_CFLAGS       = @X_CFLAGS@
+
+INCLUDES       = -I$(srcdir) -I.. @INCLUDES@
+
+SRCS           = alpha.c colors.c fade.c grabscreen.c hsv.c overlay.c \
+                 resources.c spline.c usleep.c visual.c visual-gl.c xmu.c \
+                 xroger.c yarandom.c erase.c sgivideo.c xshm.c xdbe.c
+OBJS           = alpha.o colors.o fade.o grabscreen.o hsv.o overlay.o \
+                 resources.o spline.o usleep.o visual.o visual-gl.o xmu.o \
+                 xroger.o yarandom.o erase.o sgivideo.o xshm.o xdbe.o
+HDRS           = alpha.h colors.h fade.h grabscreen.h hsv.h resources.h \
+                 spline.h usleep.h utils.h version.h visual.h vroot.h xmu.h \
+                 yarandom.h erase.h sgivideo.h xshm.h xdbe.h
+EXTRAS         = README Makefile.in ad2c
+VMSFILES       = compile_axp.com compile_decc.com vms-gtod.c vms-gtod.h \
+                 vms-strdup.c
+
+TARFILES       = $(EXTRAS) $(VMSFILES) $(SRCS) $(HDRS)
+
+
+default: all
+all: $(OBJS)
+
+install:   install-program   install-man
+uninstall: uninstall-program uninstall-man
+
+install-strip:
+       $(MAKE) INSTALL_PROGRAM='$(INSTALL_PROGRAM) -s' install
+
+install-program:
+install-man:
+uninstall-program:
+uninstall-man:
+
+clean:
+       -rm -f *.o a.out core
+
+distclean: clean
+       -rm -f Makefile TAGS *~ "#"*
+
+# Adds all current dependencies to Makefile
+depend:
+       $(DEPEND) -s '# DO NOT DELETE: updated by make depend'              \
+       $(DEPEND_FLAGS) --                                                  \
+       $(INCLUDES) $(DEFS) $(DEPEND_DEFINES) $(CFLAGS) $(X_CFLAGS) --      \
+       $(SRCS)
+
+# Adds some dependencies to Makefile.in -- not totally accurate, but pretty
+# close.  This excludes dependencies on files in /usr/include, etc.  It tries
+# to include only dependencies on files which are themselves a part of this
+# package.
+distdepend::
+       @echo updating dependencies in `pwd`/Makefile.in... ;               \
+       $(DEPEND) -w 0 -f -                                                 \
+       -s '# DO NOT DELETE: updated by make distdepend' $(DEPEND_FLAGS) -- \
+       $(INCLUDES) $(DEFS) $(DEPEND_DEFINES) $(CFLAGS) $(X_CFLAGS) --      \
+       $(SRCS) |                                                           \
+       (                                                                   \
+         awk '/^# .*Makefile.in ---/,/^# DO .*distdepend/' < Makefile.in ; \
+         sed -e 's@ \./@ @g;s@ /[^ ]*@@g;/^.*:$$/d'                        \
+             -e 's@ \([^$$]\)@ $$(srcdir)/\1@g'                            \
+             -e 's@ $$(srcdir)/\(.*config.h\)@ \1@g' ;                     \
+         echo ''                                                           \
+       ) > /tmp/distdepend.$$$$ &&                                         \
+       mv Makefile.in Makefile.in.bak &&                                   \
+       mv /tmp/distdepend.$$$$ Makefile.in
+
+TAGS: tags
+tags:
+       find $(srcdir) -name '*.[chly]' -print | xargs etags -a
+
+echo_tarfiles:
+       @echo $(TARFILES)
+
+
+# How we build object files in this directory.
+.c.o:
+       $(CC) -c $(INCLUDES) $(DEFS) $(CFLAGS) $(X_CFLAGS) $<
+
+
+# Rules for generating the VMS makefiles on Unix, so that it doesn't have to
+# be done by hand...
+#
+VMS_AXP_COMPILE=$$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-])
+
+compile_axp.com: Makefile.in
+       @echo generating $@ from $<...  ;                                   \
+       ( ( for c in $(SRCS) vms-*.c ; do                                   \
+             c=`echo $$c | tr a-z A-Z` ;                                   \
+             echo "$(VMS_AXP_COMPILE) $$c" ;                               \
+            done ;                                                         \
+         ) | sort ;                                                        \
+          echo '$$ lib/cre utils.olb_axp' ;                                \
+         echo '$$ lib utils.olb_axp *.obj' ;                               \
+         echo '$$! delete/noconf *.obj;' ;                                 \
+        ) > $@
+
+compile_decc.com: compile_axp.com
+       @echo generating $@ from $<...  ;                                   \
+       sed 's/axp/decc/g' < $< > $@
+
+distdepend:: compile_axp.com compile_decc.com
+
+
+##############################################################################
+#
+# DO NOT DELETE: updated by make distdepend
+# $(srcdir)/DO $(srcdir)/NOT $(srcdir)/DELETE: $(srcdir)/updated $(srcdir)/by $(srcdir)/make $(srcdir)/distdepend
+
+alpha.o: $(srcdir)/utils.h
+alpha.o: ../config.h
+alpha.o: $(srcdir)/alpha.h
+alpha.o: $(srcdir)/visual.h
+alpha.o: $(srcdir)/hsv.h
+alpha.o: $(srcdir)/yarandom.h
+alpha.o: $(srcdir)/resources.h
+colors.o: $(srcdir)/utils.h
+colors.o: ../config.h
+colors.o: $(srcdir)/hsv.h
+colors.o: $(srcdir)/yarandom.h
+colors.o: $(srcdir)/visual.h
+colors.o: $(srcdir)/colors.h
+fade.o: $(srcdir)/utils.h
+fade.o: ../config.h
+fade.o: $(srcdir)/visual.h
+fade.o: $(srcdir)/usleep.h
+fade.o: $(srcdir)/fade.h
+grabscreen.o: $(srcdir)/utils.h
+grabscreen.o: ../config.h
+grabscreen.o: $(srcdir)/yarandom.h
+grabscreen.o: $(srcdir)/usleep.h
+grabscreen.o: $(srcdir)/colors.h
+grabscreen.o: $(srcdir)/grabscreen.h
+grabscreen.o: $(srcdir)/sgivideo.h
+grabscreen.o: $(srcdir)/visual.h
+grabscreen.o: $(srcdir)/resources.h
+grabscreen.o: $(srcdir)/vroot.h
+hsv.o: $(srcdir)/utils.h
+hsv.o: ../config.h
+hsv.o: $(srcdir)/hsv.h
+overlay.o: $(srcdir)/utils.h
+overlay.o: ../config.h
+overlay.o: $(srcdir)/visual.h
+resources.o: $(srcdir)/utils.h
+resources.o: ../config.h
+resources.o: $(srcdir)/resources.h
+spline.o: $(srcdir)/utils.h
+spline.o: ../config.h
+spline.o: $(srcdir)/spline.h
+usleep.o: ../config.h
+visual.o: $(srcdir)/utils.h
+visual.o: ../config.h
+visual.o: $(srcdir)/resources.h
+visual.o: $(srcdir)/visual.h
+visual-gl.o: $(srcdir)/utils.h
+visual-gl.o: ../config.h
+visual-gl.o: $(srcdir)/visual.h
+xmu.o: ../config.h
+xroger.o: $(srcdir)/utils.h
+xroger.o: ../config.h
+xroger.o: $(srcdir)/spline.h
+yarandom.o: ../config.h
+yarandom.o: $(srcdir)/yarandom.h
+erase.o: $(srcdir)/utils.h
+erase.o: ../config.h
+erase.o: $(srcdir)/yarandom.h
+erase.o: $(srcdir)/usleep.h
+erase.o: $(srcdir)/resources.h
+sgivideo.o: $(srcdir)/utils.h
+sgivideo.o: ../config.h
+sgivideo.o: $(srcdir)/sgivideo.h
+sgivideo.o: $(srcdir)/resources.h
+sgivideo.o: $(srcdir)/visual.h
+xshm.o: $(srcdir)/utils.h
+xshm.o: ../config.h
+xshm.o: $(srcdir)/xshm.h
+xshm.o: $(srcdir)/resources.h
+xdbe.o: $(srcdir)/utils.h
+xdbe.o: ../config.h
+xdbe.o: $(srcdir)/xdbe.h
+xdbe.o: $(srcdir)/resources.h
+
diff --git a/utils/README b/utils/README
new file mode 100644 (file)
index 0000000..2f5bc11
--- /dev/null
@@ -0,0 +1,6 @@
+
+This directory contains various utilities that are used both by the 
+screensaver driver and by the demo programs; for example, a portable
+implementation of usleep(), and code for manipulating color maps.
+
+If you have compilation problems, check the parameters in ../config.h.
diff --git a/utils/ad2c b/utils/ad2c
new file mode 100755 (executable)
index 0000000..1435e55
--- /dev/null
@@ -0,0 +1,38 @@
+#!/bin/sh
+#
+#      ad2c : Convert app-defaults file to C strings decls.
+#
+#      George Ferguson, ferguson@cs.rcohester.edu, 12 Nov 1990.
+#      19 Mar 1991 : gf
+#              Made it self-contained.
+#      6 Jan 1992 : mycroft@gnu.ai.mit.edu (Charles Hannum)
+#              Removed use of "-n" and ":read" label since Gnu and
+#              IBM sed print pattern space on "n" command. Still works
+#              with Sun sed, of course.
+#      7 Jan 1992: matthew@sunpix.East.Sun.COM (Matthew Stier)
+#              Escape quotes after escaping backslashes.
+#
+
+sed '
+/^!/d
+/^$/d
+s/\\/\\\\/g
+s/\\$//g
+s/"/\\"/g
+s/^/"/
+: test
+/\\$/b slash
+s/$/",/
+p
+d
+: slash
+n
+/^!/d
+/^$/d
+s/"/\\"/g
+s/\\\\/\\/g
+s/\\n/\\\\n/g
+s/\\t/\\\\t/g
+s/\\f/\\\\f/g
+s/\\b/\\\\b/g
+b test' "$@"
diff --git a/utils/alpha.c b/utils/alpha.c
new file mode 100644 (file)
index 0000000..22504fc
--- /dev/null
@@ -0,0 +1,215 @@
+/* xscreensaver, Copyright (c) 1992, 1995, 1996, 1997
+ *  Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software 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.  No representations are made about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or 
+ * implied warranty.
+ */
+
+/* Beauty is only skin deep, unless you've got an alpha channel. */
+
+
+#include "utils.h"
+#include "alpha.h"
+#include "visual.h"
+#include "hsv.h"
+#include "yarandom.h"
+#include "resources.h"
+
+#include <X11/Xutil.h>
+
+#ifndef countof
+# define countof(x) (sizeof(*(x))/sizeof((x)))
+#endif
+
+
+/* I don't believe this fucking language doesn't have builtin exponentiation.
+   I further can't believe that the fucking ^ character means fucking XOR!! */
+static int 
+i_exp (int i, int j)
+{
+  int k = 1;
+  while (j--) k *= i;
+  return k;
+}
+
+
+static void
+merge_colors (int argc, XColor **argv, XColor *into_color, int mask,
+             Bool additive_p)
+{
+  int j;
+  *into_color = *argv [0];
+  into_color->pixel |= mask;
+
+  for (j = 1; j < argc; j++)
+    {
+# define SHORT_INC(x,y) (x = ((((x)+(y)) > 0xFFFF) ? 0xFFFF : ((x)+(y))))
+# define SHORT_DEC(x,y) (x = ((((x)-(y)) < 0)      ? 0      : ((x)-(y))))
+      if (additive_p)
+       {
+         SHORT_INC (into_color->red,   argv[j]->red);
+         SHORT_INC (into_color->green, argv[j]->green);
+         SHORT_INC (into_color->blue,  argv[j]->blue);
+       }
+      else
+       {
+         SHORT_DEC (into_color->red,   argv[j]->red);
+         SHORT_DEC (into_color->green, argv[j]->green);
+         SHORT_DEC (into_color->blue,  argv[j]->blue);
+       }
+# undef SHORT_INC
+# undef SHORT_DEC
+    }
+}
+
+static void
+permute_colors (XColor *pcolors, XColor *colors,
+               int count,
+               unsigned long *plane_masks,
+               Bool additive_p)
+{
+  int out = 0;
+  int max = i_exp (2, count);
+  if (count > 31) abort ();
+  for (out = 1; out < max; out++)
+    {
+      XColor *argv [32];
+      int this_mask = 0;
+      int argc = 0;
+      int bit;
+      for (bit = 0; bit < 32; bit++)
+       if (out & (1<<bit))
+         {
+           argv [argc++] = &pcolors [bit];
+           this_mask |= plane_masks [bit];
+         }
+      merge_colors (argc, argv, &colors [out-1], this_mask, additive_p);
+    }
+}
+
+
+static int
+allocate_color_planes (Display *dpy, Colormap cmap,
+                      int nplanes, unsigned long *plane_masks,
+                      unsigned long *base_pixel_ret)
+{
+  while (nplanes > 1 &&
+        !XAllocColorCells (dpy, cmap, False, plane_masks, nplanes,
+                           base_pixel_ret, 1))
+    nplanes--;
+
+  return nplanes;
+}
+                      
+
+static void
+initialize_transparency_colormap (Display *dpy, Colormap cmap,
+                                 int nplanes,
+                                 unsigned long base_pixel,
+                                 unsigned long *plane_masks,
+                                 XColor *colors,
+                                 Bool additive_p)
+{
+  int i;
+  int total_colors = i_exp (2, nplanes);
+  XColor *all_colors = (XColor *) calloc (total_colors, sizeof (XColor));
+
+  for (i = 0; i < nplanes; i++)
+    colors[i].pixel = base_pixel | plane_masks [i];
+  permute_colors (colors, all_colors, nplanes, plane_masks, additive_p);
+
+  /* clone the default background of the window into our "base" pixel */
+  all_colors [total_colors - 1].pixel =
+    get_pixel_resource ("background", "Background", dpy, cmap);
+  XQueryColor (dpy, cmap, &all_colors [total_colors - 1]);
+  all_colors [total_colors - 1].pixel = base_pixel;
+
+  for (i = 0; i < total_colors; i++)
+    all_colors[i].flags = DoRed|DoGreen|DoBlue;
+  XStoreColors (dpy, cmap, all_colors, total_colors);
+  XFree ((XPointer) all_colors);
+}
+
+
+Bool
+allocate_alpha_colors (Screen *screen, Visual *visual, Colormap cmap,
+                      int *nplanesP, Bool additive_p,
+                      unsigned long **plane_masks,
+                      unsigned long *base_pixelP)
+{
+  Display *dpy = DisplayOfScreen (screen);
+  XColor *colors;
+  int nplanes = *nplanesP;
+  int i;
+
+  if (!has_writable_cells (screen, visual))
+    cmap = 0;
+
+  if (!cmap)            /* A TrueColor visual, or similar. */
+    {
+      int depth = visual_depth (screen, visual);
+      unsigned long masks;
+      XVisualInfo vi_in, *vi_out;
+
+      /* Find out which bits the R, G, and B components actually occupy
+         on this visual. */
+      vi_in.screen = screen_number (screen);
+      vi_in.visualid = XVisualIDFromVisual (visual);
+      vi_out = XGetVisualInfo (dpy, VisualScreenMask|VisualIDMask,
+                               &vi_in, &i);
+      if (! vi_out) abort ();
+      masks = vi_out[0].red_mask | vi_out[0].green_mask | vi_out[0].blue_mask;
+      XFree ((char *) vi_out);
+
+      if (nplanes > depth)
+        nplanes = depth;
+      *nplanesP = nplanes;
+      *base_pixelP = 0;
+      *plane_masks = (unsigned long *) calloc(sizeof(unsigned long), nplanes);
+
+      /* Pick the planar values randomly, but constrain them to fall within
+         the bit positions of the R, G, and B fields. */
+      for (i = 0; i < nplanes; i++)
+        (*plane_masks)[i] = random() & masks;
+
+    }
+  else                  /* A PseudoColor visual, or similar. */
+    {
+      if (nplanes > 31) nplanes = 31;
+      *plane_masks = (unsigned long *) malloc(sizeof(unsigned long) * nplanes);
+
+      nplanes = allocate_color_planes (dpy, cmap, nplanes, *plane_masks,
+                                  base_pixelP);
+      *nplanesP = nplanes;
+
+      if (nplanes <= 1)
+        {
+          free(*plane_masks);
+          *plane_masks = 0;
+          return False;
+        }
+
+      colors = (XColor *) calloc (nplanes, sizeof (XColor));
+      for (i = 0; i < nplanes; i++)
+        {
+          /* pick the base colors. If we are in subtractive mode, pick higher
+             intensities. */
+          hsv_to_rgb (random () % 360,
+                      frand (1.0),
+                      frand (0.5) + (additive_p ? 0.2 : 0.5),
+                      &colors[i].red,
+                      &colors[i].green,
+                      &colors[i].blue);
+        }
+      initialize_transparency_colormap (dpy, cmap, nplanes,
+                                        *base_pixelP, *plane_masks, colors,
+                                        additive_p);
+      XFree ((XPointer) colors);
+    }
+  return True;
+}
diff --git a/utils/alpha.h b/utils/alpha.h
new file mode 100644 (file)
index 0000000..4ff9903
--- /dev/null
@@ -0,0 +1,22 @@
+/* xscreensaver, Copyright (c) 1992, 1995, 1996, 1997
+ *  Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software 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.  No representations are made about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or 
+ * implied warranty.
+ */
+
+#ifndef __XSCREENSAVER_ALPHA_H__
+#define __XSCREENSAVER_ALPHA_H__
+
+extern Bool allocate_alpha_colors (Screen *screen, Visual *visual,
+                                   Colormap cmap,
+                                   int *nplanesP, Bool additive_p,
+                                   unsigned long **plane_masks,
+                                   unsigned long *base_pixelP);
+
+#endif /* __XSCREENSAVER_ALPHA_H__ */
diff --git a/utils/colors.c b/utils/colors.c
new file mode 100644 (file)
index 0000000..a7953c1
--- /dev/null
@@ -0,0 +1,694 @@
+/* xscreensaver, Copyright (c) 1997 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software 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.  No representations are made about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or 
+ * implied warranty.
+ */
+
+/* This file contains some utility routines for randomly picking the colors
+   to hack the screen with.
+ */
+
+#include "utils.h"
+#include "hsv.h"
+#include "yarandom.h"
+#include "visual.h"
+#include "colors.h"
+
+extern char *progname;
+
+void
+free_colors(Display *dpy, Colormap cmap, XColor *colors, int ncolors)
+{
+  int i;
+  if (ncolors > 0)
+    {
+      unsigned long *pixels = (unsigned long *)
+       malloc(sizeof(*pixels) * ncolors);
+      for (i = 0; i < ncolors; i++)
+       pixels[i] = colors[i].pixel;
+      XFreeColors (dpy, cmap, pixels, ncolors, 0L);
+      free(pixels);
+    }
+}
+
+
+void
+allocate_writable_colors (Display *dpy, Colormap cmap,
+                         unsigned long *pixels, int *ncolorsP)
+{
+  int desired = *ncolorsP;
+  int got = 0;
+  int requested = desired;
+  unsigned long *new_pixels = pixels;
+
+  *ncolorsP = 0;
+  while (got < desired
+        && requested > 0)
+    {
+      if (desired - got < requested)
+       requested = desired - got;
+
+      if (XAllocColorCells (dpy, cmap, False, 0, 0, new_pixels, requested))
+       {
+         /* Got all the pixels we asked for. */
+         new_pixels += requested;
+         got += requested;
+       }
+      else
+       {
+         /* We didn't get all/any of the pixels we asked for.  This time, ask
+            for half as many.  (If we do get all that we ask for, we ask for
+            the same number again next time, so we only do O(log(n)) server
+            roundtrips.)
+         */
+         requested = requested / 2;
+       }
+    }
+  *ncolorsP += got;
+}
+
+
+static void
+complain (int wanted_colors, int got_colors,
+         Bool wanted_writable, Bool got_writable)
+{
+  if (wanted_writable && !got_writable)
+    fprintf(stderr,
+           "%s: wanted %d writable colors; got %d read-only colors.\n",
+           progname, wanted_colors, got_colors);
+
+  else if (wanted_colors > (got_colors + 10))
+    /* don't bother complaining if we're within ten pixels. */
+    fprintf(stderr, "%s: wanted %d%s colors; got %d.\n",
+           progname, wanted_colors, (got_writable ? " writable" : ""),
+           got_colors);
+}
+
+
+
+void
+make_color_ramp (Display *dpy, Colormap cmap,
+                int h1, double s1, double v1,   /* 0-360, 0-1.0, 0-1.0 */
+                int h2, double s2, double v2,   /* 0-360, 0-1.0, 0-1.0 */
+                XColor *colors, int *ncolorsP,
+                Bool closed_p,
+                Bool allocate_p,
+                Bool writable_p)
+{
+  Bool verbose_p = True;  /* argh. */
+  int i;
+  int ncolors = *ncolorsP;
+  int wanted = ncolors;
+  Bool wanted_writable = (allocate_p && writable_p);
+  double dh, ds, dv;           /* deltas */
+
+ AGAIN:
+
+  memset (colors, 0, (*ncolorsP) * sizeof(*colors));
+
+  if (closed_p)
+    ncolors = (ncolors / 2) + 1;
+
+  /* Note: unlike other routines in this module, this function assumes that
+     if h1 and h2 are more than 180 degrees apart, then the desired direction
+     is always from h1 to h2 (rather than the shorter path.)  make_uniform
+     depends on this.
+   */
+  dh = ((double)h2 - (double)h1) / ncolors;
+  ds = (s2 - s1) / ncolors;
+  dv = (v2 - v1) / ncolors;
+
+  for (i = 0; i < ncolors; i++)
+    {
+      colors[i].flags = DoRed|DoGreen|DoBlue;
+      hsv_to_rgb ((int) (h1 + (i*dh)), (s1 + (i*ds)), (v1 + (i*dv)),
+                 &colors[i].red, &colors[i].green, &colors[i].blue);
+    }
+
+  if (closed_p)
+    for (i = ncolors; i < *ncolorsP; i++)
+      colors[i] = colors[(*ncolorsP)-i];
+
+  if (!allocate_p)
+    return;
+
+  if (writable_p)
+    {
+      unsigned long *pixels = (unsigned long *)
+       malloc(sizeof(*pixels) * ((*ncolorsP) + 1));
+
+      /* allocate_writable_colors() won't do here, because we need exactly this
+        number of cells, or the color sequence we've chosen won't fit. */
+      if (! XAllocColorCells(dpy, cmap, False, 0, 0, pixels, *ncolorsP))
+       {
+         free(pixels);
+         goto FAIL;
+       }
+
+      for (i = 0; i < *ncolorsP; i++)
+       colors[i].pixel = pixels[i];
+      free (pixels);
+
+      XStoreColors (dpy, cmap, colors, *ncolorsP);
+    }
+  else
+    {
+      for (i = 0; i < *ncolorsP; i++)
+       {
+         XColor color;
+         color = colors[i];
+         if (XAllocColor (dpy, cmap, &color))
+           {
+             colors[i].pixel = color.pixel;
+           }
+         else
+           {
+             free_colors (dpy, cmap, colors, i);
+             goto FAIL;
+           }
+       }
+    }
+
+  goto WARN;
+
+ FAIL:
+  /* we weren't able to allocate all the colors we wanted;
+     decrease the requested number and try again.
+   */
+  ncolors = (ncolors > 170 ? ncolors - 20 :
+            ncolors > 100 ? ncolors - 10 :
+            ncolors >  75 ? ncolors -  5 :
+            ncolors >  25 ? ncolors -  3 :
+            ncolors >  10 ? ncolors -  2 :
+            ncolors >   2 ? ncolors -  1 :
+            0);
+  *ncolorsP = ncolors;
+  if (ncolors > 0)
+    goto AGAIN;
+
+ WARN:
+  
+  if (verbose_p)
+    complain (wanted, ncolors, wanted_writable, wanted_writable && writable_p);
+}
+
+
+#define MAXPOINTS 50   /* yeah, so I'm lazy */
+
+
+static void
+make_color_path (Display *dpy, Colormap cmap,
+                int npoints, int *h, double *s, double *v,
+                XColor *colors, int *ncolorsP,
+                Bool allocate_p,
+                Bool writable_p)
+{
+  int i, j, k;
+  int total_ncolors = *ncolorsP;
+
+  int ncolors[MAXPOINTS];  /* number of pixels per edge */
+  double dh[MAXPOINTS];    /* distance between pixels, per edge (0 - 360.0) */
+  double ds[MAXPOINTS];    /* distance between pixels, per edge (0 - 1.0) */
+  double dv[MAXPOINTS];    /* distance between pixels, per edge (0 - 1.0) */
+
+  if (npoints == 0)
+    {
+      *ncolorsP = 0;
+      return;
+    }
+  else if (npoints == 2)       /* using make_color_ramp() will be faster */
+    {
+      make_color_ramp (dpy, cmap,
+                      h[0], s[0], v[0], h[1], s[1], v[1],
+                      colors, ncolorsP,
+                      True,  /* closed_p */
+                      allocate_p, writable_p);
+      return;
+    }
+  else if (npoints >= MAXPOINTS)
+    {
+      npoints = MAXPOINTS-1;
+    }
+
+ AGAIN:
+
+  {
+    double DH[MAXPOINTS];      /* Distance between H values in the shortest
+                                  direction around the circle, that is, the
+                                  distance between 10 and 350 is 20.
+                                  (Range is 0 - 360.0.)
+                               */
+    double edge[MAXPOINTS];    /* lengths of edges in unit HSV space. */
+    double ratio[MAXPOINTS];   /* proportions of the edges (total 1.0) */
+    double circum = 0;
+    double one_point_oh = 0;   /* (debug) */
+
+    for (i = 0; i < npoints; i++)
+      {
+       int j = (i+1) % npoints;
+       double d = ((double) (h[i] - h[j])) / 360;
+       if (d < 0) d = -d;
+       if (d > 0.5) d = 0.5 - (d - 0.5);
+       DH[i] = d;
+      }
+
+    for (i = 0; i < npoints; i++)
+      {
+       int j = (i+1) % npoints;
+       edge[i] = sqrt((DH[i] * DH[j]) +
+                      ((s[j] - s[i]) * (s[j] - s[i])) +
+                      ((v[j] - v[i]) * (v[j] - v[i])));
+       circum += edge[i];
+      }
+
+#ifdef DEBUG
+    fprintf(stderr, "\ncolors:");
+    for (i=0; i < npoints; i++)
+      fprintf(stderr, " (%d, %.3f, %.3f)", h[i], s[i], v[i]);
+    fprintf(stderr, "\nlengths:");
+    for (i=0; i < npoints; i++)
+      fprintf(stderr, " %.3f", edge[i]);
+#endif /* DEBUG */
+
+    if (circum < 0.0001)
+      goto FAIL;
+
+    for (i = 0; i < npoints; i++)
+      {
+       ratio[i] = edge[i] / circum;
+       one_point_oh += ratio[i];
+      }
+
+#ifdef DEBUG
+    fprintf(stderr, "\nratios:");
+    for (i=0; i < npoints; i++)
+      fprintf(stderr, " %.3f", ratio[i]);
+#endif /* DEBUG */
+
+    if (one_point_oh < 0.99999 || one_point_oh > 1.00001)
+      abort();
+
+    /* space the colors evenly along the circumference -- that means that the
+       number of pixels on a edge is proportional to the length of that edge
+       (relative to the lengths of the other edges.)
+     */
+    for (i = 0; i < npoints; i++)
+      ncolors[i] = total_ncolors * ratio[i];
+
+
+#ifdef DEBUG
+    fprintf(stderr, "\npixels:");
+    for (i=0; i < npoints; i++)
+      fprintf(stderr, " %d", ncolors[i]);
+    fprintf(stderr, "  (%d)\n", total_ncolors);
+#endif /* DEBUG */
+
+    for (i = 0; i < npoints; i++)
+      {
+       int j = (i+1) % npoints;
+
+       if (ncolors[i] > 0)
+         {
+           dh[i] = 360 * (DH[i] / ncolors[i]);
+           ds[i] = (s[j] - s[i]) / ncolors[i];
+           dv[i] = (v[j] - v[i]) / ncolors[i];
+         }
+      }
+  }
+
+  memset (colors, 0, (*ncolorsP) * sizeof(*colors));
+
+  k = 0;
+  for (i = 0; i < npoints; i++)
+    {
+      int distance, direction;
+      distance = h[(i+1) % npoints] - h[i];
+      direction = (distance >= 0 ? -1 : 1);
+
+      if (distance > 180)
+       distance = 180 - (distance - 180);
+      else if (distance < -180)
+       distance = -(180 - ((-distance) - 180));
+      else
+       direction = -direction;
+
+#ifdef DEBUG
+      fprintf (stderr, "point %d: %3d %.2f %.2f\n",
+              i, h[i], s[i], v[i]);
+      fprintf(stderr, "  h[i]=%d  dh[i]=%.2f  ncolors[i]=%d\n",
+             h[i], dh[i], ncolors[i]);
+#endif /* DEBUG */
+      for (j = 0; j < ncolors[i]; j++, k++)
+       {
+         double hh = (h[i] + (j * dh[i] * direction));
+         if (hh < 0) hh += 360;
+         else if (hh > 360) hh -= 0;
+         colors[k].flags = DoRed|DoGreen|DoBlue;
+         hsv_to_rgb ((int)
+                     hh,
+                     (s[i] + (j * ds[i])),
+                     (v[i] + (j * dv[i])),
+                     &colors[k].red, &colors[k].green, &colors[k].blue);
+#ifdef DEBUG
+         fprintf (stderr, "point %d+%d: %.2f %.2f %.2f  %04X %04X %04X\n",
+                  i, j,
+                  hh,
+                  (s[i] + (j * ds[i])),
+                  (v[i] + (j * dv[i])),
+                  colors[k].red, colors[k].green, colors[k].blue);
+#endif /* DEBUG */
+       }
+    }
+
+  /* Floating-point round-off can make us decide to use fewer colors. */
+  if (k < *ncolorsP)
+    {
+      *ncolorsP = k;
+      if (k <= 0)
+       return;
+    }
+
+  if (!allocate_p)
+    return;
+
+  if (writable_p)
+    {
+      unsigned long *pixels = (unsigned long *)
+       malloc(sizeof(*pixels) * ((*ncolorsP) + 1));
+
+      /* allocate_writable_colors() won't do here, because we need exactly this
+        number of cells, or the color sequence we've chosen won't fit. */
+      if (! XAllocColorCells(dpy, cmap, False, 0, 0, pixels, *ncolorsP))
+       {
+         free(pixels);
+         goto FAIL;
+       }
+
+      for (i = 0; i < *ncolorsP; i++)
+       colors[i].pixel = pixels[i];
+      free (pixels);
+
+      XStoreColors (dpy, cmap, colors, *ncolorsP);
+    }
+  else
+    {
+      for (i = 0; i < *ncolorsP; i++)
+       {
+         XColor color;
+         color = colors[i];
+         if (XAllocColor (dpy, cmap, &color))
+           {
+             colors[i].pixel = color.pixel;
+           }
+         else
+           {
+             free_colors (dpy, cmap, colors, i);
+             goto FAIL;
+           }
+       }
+    }
+
+  return;
+
+ FAIL:
+  /* we weren't able to allocate all the colors we wanted;
+     decrease the requested number and try again.
+   */
+  total_ncolors = (total_ncolors > 170 ? total_ncolors - 20 :
+                  total_ncolors > 100 ? total_ncolors - 10 :
+                  total_ncolors >  75 ? total_ncolors -  5 :
+                  total_ncolors >  25 ? total_ncolors -  3 :
+                  total_ncolors >  10 ? total_ncolors -  2 :
+                  total_ncolors >   2 ? total_ncolors -  1 :
+                  0);
+  *ncolorsP = total_ncolors;
+  if (total_ncolors > 0)
+    goto AGAIN;
+}
+
+
+void
+make_color_loop (Display *dpy, Colormap cmap,
+                int h0, double s0, double v0,   /* 0-360, 0-1.0, 0-1.0 */
+                int h1, double s1, double v1,   /* 0-360, 0-1.0, 0-1.0 */
+                int h2, double s2, double v2,   /* 0-360, 0-1.0, 0-1.0 */
+                XColor *colors, int *ncolorsP,
+                Bool allocate_p,
+                Bool writable_p)
+{
+  int h[3];
+  double s[3], v[3];
+  h[0] = h0; h[1] = h1; h[2] = h2;
+  s[0] = s0; s[1] = s1; s[2] = s2;
+  v[0] = v0; v[1] = v1; v[2] = v2;
+  make_color_path(dpy, cmap,
+                 3, h, s, v,
+                 colors, ncolorsP,
+                 allocate_p, writable_p);
+}
+
+
+void
+make_smooth_colormap (Display *dpy, Visual *visual, Colormap cmap,
+                     XColor *colors, int *ncolorsP,
+                     Bool allocate_p,
+                     Bool *writable_pP,
+                     Bool verbose_p)
+{
+  int npoints;
+  int ncolors = *ncolorsP;
+  Bool wanted_writable = (allocate_p && writable_pP && *writable_pP);
+  int i;
+  int h[MAXPOINTS];
+  double s[MAXPOINTS];
+  double v[MAXPOINTS];
+  double total_s = 0;
+  double total_v = 0;
+  Screen *screen = DefaultScreenOfDisplay(dpy); /* #### WRONG! */
+
+  if (*ncolorsP <= 0) return;
+
+  {
+    int n = random() % 20;
+    if      (n <= 5)  npoints = 2;     /* 30% of the time */
+    else if (n <= 15) npoints = 3;     /* 50% of the time */
+    else if (n <= 18) npoints = 4;     /* 15% of the time */
+    else             npoints = 5;      /*  5% of the time */
+  }
+
+ REPICK_ALL_COLORS:
+  for (i = 0; i < npoints; i++)
+    {
+    REPICK_THIS_COLOR:
+      h[i] = random() % 360;
+      s[i] = frand(1.0);
+      v[i] = frand(0.8) + 0.2;
+
+      /* Make sure that no two adjascent colors are *too* close together.
+        If they are, try again.
+       */
+      if (i > 0)
+       {
+         int j = (i+1 == npoints) ? 0 : (i-1);
+         double hi = ((double) h[i]) / 360;
+         double hj = ((double) h[j]) / 360;
+         double dh = hj - hi;
+         double distance;
+         if (dh < 0) dh = -dh;
+         if (dh > 0.5) dh = 0.5 - (dh - 0.5);
+         distance = sqrt ((dh * dh) +
+                          ((s[j] - s[i]) * (s[j] - s[i])) +
+                          ((v[j] - v[i]) * (v[j] - v[i])));
+         if (distance < 0.2)
+           goto REPICK_THIS_COLOR;
+       }
+      total_s += s[i];
+      total_v += v[i];
+    }
+
+  /* If the average saturation or intensity are too low, repick the colors,
+     so that we don't end up with a black-and-white or too-dark map.
+   */
+  if (total_s / npoints < 0.2)
+    goto REPICK_ALL_COLORS;
+  if (total_v / npoints < 0.3)
+    goto REPICK_ALL_COLORS;
+
+  /* If this visual doesn't support writable cells, don't bother trying.
+   */
+  if (wanted_writable && !has_writable_cells(screen, visual))
+    *writable_pP = False;
+
+ RETRY_NON_WRITABLE:
+  make_color_path (dpy, cmap, npoints, h, s, v, colors, &ncolors,
+                  allocate_p, (writable_pP && *writable_pP));
+
+  /* If we tried for writable cells and got none, try for non-writable. */
+  if (allocate_p && *ncolorsP == 0 && *writable_pP)
+    {
+      *writable_pP = False;
+      goto RETRY_NON_WRITABLE;
+    }
+
+  if (verbose_p)
+    complain(*ncolorsP, ncolors, wanted_writable,
+            wanted_writable && *writable_pP);
+
+  *ncolorsP = ncolors;
+}
+
+
+void
+make_uniform_colormap (Display *dpy, Visual *visual, Colormap cmap,
+                      XColor *colors, int *ncolorsP,
+                      Bool allocate_p,
+                      Bool *writable_pP,
+                      Bool verbose_p)
+{
+  int ncolors = *ncolorsP;
+  Bool wanted_writable = (allocate_p && writable_pP && *writable_pP);
+  Screen *screen = DefaultScreenOfDisplay(dpy); /* #### WRONG! */
+
+  double S = ((double) (random() % 34) + 66) / 100.0;  /* range 66%-100% */
+  double V = ((double) (random() % 34) + 66) / 100.0;  /* range 66%-100% */
+
+  if (*ncolorsP <= 0) return;
+
+  /* If this visual doesn't support writable cells, don't bother trying. */
+  if (wanted_writable && !has_writable_cells(screen, visual))
+    *writable_pP = False;
+
+ RETRY_NON_WRITABLE:
+  make_color_ramp(dpy, cmap,
+                 0,   S, V,
+                 359, S, V,
+                 colors, &ncolors,
+                 False, True,
+                  (writable_pP && *writable_pP));
+
+  /* If we tried for writable cells and got none, try for non-writable. */
+  if (allocate_p && *ncolorsP == 0 && writable_pP && *writable_pP)
+    {
+      ncolors = *ncolorsP;
+      *writable_pP = False;
+      goto RETRY_NON_WRITABLE;
+    }
+
+  if (verbose_p)
+    complain(*ncolorsP, ncolors, wanted_writable,
+            wanted_writable && *writable_pP);
+
+  *ncolorsP = ncolors;
+}
+
+
+void
+make_random_colormap (Display *dpy, Visual *visual, Colormap cmap,
+                     XColor *colors, int *ncolorsP,
+                     Bool bright_p,
+                     Bool allocate_p,
+                     Bool *writable_pP,
+                     Bool verbose_p)
+{
+  Bool wanted_writable = (allocate_p && writable_pP && *writable_pP);
+  int ncolors = *ncolorsP;
+  int i;
+  Screen *screen = DefaultScreenOfDisplay(dpy); /* #### WRONG! */
+
+  if (*ncolorsP <= 0) return;
+
+  /* If this visual doesn't support writable cells, don't bother trying. */
+  if (wanted_writable && !has_writable_cells(screen, visual))
+    *writable_pP = False;
+
+  for (i = 0; i < ncolors; i++)
+    {
+      colors[i].flags = DoRed|DoGreen|DoBlue;
+      if (bright_p)
+       {
+         int H = random() % 360;                          /* range 0-360    */
+         double S = ((double) (random()%70) + 30)/100.0;  /* range 30%-100% */
+         double V = ((double) (random()%34) + 66)/100.0;  /* range 66%-100% */
+         hsv_to_rgb (H, S, V,
+                     &colors[i].red, &colors[i].green, &colors[i].blue);
+       }
+      else
+       {
+         colors[i].red   = random() % 0xFFFF;
+         colors[i].green = random() % 0xFFFF;
+         colors[i].blue  = random() % 0xFFFF;
+       }
+    }
+
+  if (!allocate_p)
+    return;
+
+ RETRY_NON_WRITABLE:
+  if (writable_pP && *writable_pP)
+    {
+      unsigned long *pixels = (unsigned long *)
+       malloc(sizeof(*pixels) * (ncolors + 1));
+
+      allocate_writable_colors (dpy, cmap, pixels, &ncolors);
+      if (ncolors > 0)
+       for (i = 0; i < ncolors; i++)
+         colors[i].pixel = pixels[i];
+      free (pixels);
+      if (ncolors > 0)
+       XStoreColors (dpy, cmap, colors, ncolors);
+    }
+  else
+    {
+      for (i = 0; i < ncolors; i++)
+       {
+         XColor color;
+         color = colors[i];
+         if (!XAllocColor (dpy, cmap, &color))
+           break;
+         colors[i].pixel = color.pixel;
+       }
+      ncolors = i;
+    }
+
+  /* If we tried for writable cells and got none, try for non-writable. */
+  if (allocate_p && ncolors == 0 && writable_pP && *writable_pP)
+    {
+      ncolors = *ncolorsP;
+      *writable_pP = False;
+      goto RETRY_NON_WRITABLE;
+    }
+
+  if (verbose_p)
+    complain(*ncolorsP, ncolors, wanted_writable,
+            wanted_writable && *writable_pP);
+
+  *ncolorsP = ncolors;
+}
+
+
+void
+rotate_colors (Display *dpy, Colormap cmap,
+              XColor *colors, int ncolors, int distance)
+{
+  int i;
+  XColor *colors2 = (XColor *) malloc(sizeof(*colors2) * ncolors);
+  if (ncolors < 2) return;
+  distance = distance % ncolors;
+  for (i = 0; i < ncolors; i++)
+    {
+      int j = i - distance;
+      if (j >= ncolors) j -= ncolors;
+      if (j < 0) j += ncolors;
+      colors2[i] = colors[j];
+      colors2[i].pixel = colors[i].pixel;
+    }
+  XStoreColors (dpy, cmap, colors2, ncolors);
+  XFlush(dpy);
+  memcpy(colors, colors2, sizeof(*colors) * ncolors);
+  free(colors2);
+}
diff --git a/utils/colors.h b/utils/colors.h
new file mode 100644 (file)
index 0000000..61421cf
--- /dev/null
@@ -0,0 +1,140 @@
+/* xscreensaver, Copyright (c) 1992, 1997 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software 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.  No representations are made about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or 
+ * implied warranty.
+ */
+
+#ifndef __COLORS_H__
+#define __COLORS_H__
+
+/* Like XFreeColors, but works on `XColor *' instead of `unsigned long *'
+ */
+extern void free_colors (Display *, Colormap, XColor *, int ncolors);
+
+
+/* Allocates writable, non-contiguous color cells.  The number requested is
+   passed in *ncolorsP, and the number actually allocated is returned there.
+   (Unlike XAllocColorCells(), this will allocate as many as it can, instead
+   of failing if they can't all be allocated.)
+ */
+extern void allocate_writable_colors (Display *dpy, Colormap cmap,
+                                     unsigned long *pixels, int *ncolorsP);
+
+
+/* Generates a sequence of colors evenly spaced between the given pair
+   of HSV coordinates.
+
+   If closed_p is true, the colors will go from the first point to the
+   second then back to the first.
+
+   If allocate_p is true, the colors will be allocated from the map;
+   if enough colors can't be allocated, we will try for less, and the
+   result will be returned to ncolorsP.
+
+   If writable_p is true, writable color cells will be allocated;
+   otherwise, read-only cells will be allocated.
+ */
+extern void make_color_ramp (Display *dpy, Colormap cmap,
+                            int h1, double s1, double v1,
+                            int h2, double s2, double v2,
+                            XColor *colors, int *ncolorsP,
+                            Bool closed_p,
+                            Bool allocate_p,
+                            Bool writable_p);
+
+/* Generates a sequence of colors evenly spaced around the triangle
+   indicated by the thee HSV coordinates.
+
+   If allocate_p is true, the colors will be allocated from the map;
+   if enough colors can't be allocated, we will try for less, and the
+   result will be returned to ncolorsP.
+
+   If writable_p is true, writable color cells will be allocated;
+   otherwise, read-only cells will be allocated.
+ */
+extern void make_color_loop (Display *, Colormap,
+                            int h1, double s1, double v1,
+                            int h2, double s2, double v2,
+                            int h3, double s3, double v3,
+                            XColor *colors, int *ncolorsP,
+                            Bool allocate_p,
+                            Bool writable_p);
+
+
+/* Allocates a hopefully-interesting colormap, which will be a closed loop
+   without any sudden transitions.
+
+   If allocate_p is true, the colors will be allocated from the map;
+   if enough colors can't be allocated, we will try for less, and the
+   result will be returned to ncolorsP.  An error message will be
+   printed on stderr (if verbose_p).
+
+   If *writable_pP is true, writable color cells will be allocated;
+   otherwise, read-only cells will be allocated.  If no writable cells
+   cannot be allocated, we will try to allocate unwritable cells
+   instead, and print a message on stderr to that effect (if verbose_p).
+ */
+extern void make_smooth_colormap (Display *dpy, Visual *visual,
+                                 Colormap cmap,
+                                 XColor *colors, int *ncolorsP,
+                                 Bool allocate_p,
+                                 Bool *writable_pP,
+                                 Bool verbose_p);
+
+/* Allocates a uniform colormap which touches each hue of the spectrum,
+   evenly spaced.  The saturation and intensity are chosen randomly, but
+   will be high enough to be visible.
+
+   If allocate_p is true, the colors will be allocated from the map;
+   if enough colors can't be allocated, we will try for less, and the
+   result will be returned to ncolorsP.  An error message will be
+   printed on stderr (if verbose_p).
+
+   If *writable_pP is true, writable color cells will be allocated;
+   otherwise, read-only cells will be allocated.  If no writable cells
+   cannot be allocated, we will try to allocate unwritable cells
+   instead, and print a message on stderr to that effect (if verbose_p).
+ */
+extern void make_uniform_colormap (Display *dpy, Visual *visual,
+                                  Colormap cmap,
+                                  XColor *colors, int *ncolorsP,
+                                  Bool allocate_p,
+                                  Bool *writable_pP,
+                                  Bool verbose_p);
+
+/* Allocates a random colormap (the colors are unrelated to one another.)
+   If `bright_p' is false, the colors will be completely random; if it is
+   true, all of the colors will be bright enough to see on a black background.
+
+   If allocate_p is true, the colors will be allocated from the map;
+   if enough colors can't be allocated, we will try for less, and the
+   result will be returned to ncolorsP.  An error message will be
+   printed on stderr (if verbose_p).
+
+   If *writable_pP is true, writable color cells will be allocated;
+   otherwise, read-only cells will be allocated.  If no writable cells
+   cannot be allocated, we will try to allocate unwritable cells
+   instead, and print a message on stderr to that effect (if verbose_p).
+ */
+extern void make_random_colormap (Display *dpy, Visual *visual,
+                                 Colormap cmap,
+                                 XColor *colors, int *ncolorsP,
+                                 Bool bright_p,
+                                 Bool allocate_p,
+                                 Bool *writable_pP,
+                                 Bool verbose_p);
+
+
+/* Assuming that the array of colors indicates the current state of a set
+   of writable color cells, this rotates the contents of the array by
+   `distance' steps, moving the colors of cell N to cell (N - distance).
+ */
+extern void rotate_colors (Display *, Colormap,
+                          XColor *, int ncolors, int distance);
+
+#endif /* __COLORS_H__ */
diff --git a/utils/compile_axp.com b/utils/compile_axp.com
new file mode 100644 (file)
index 0000000..78fa5f4
--- /dev/null
@@ -0,0 +1,23 @@
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-]) ALPHA.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-]) COLORS.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-]) ERASE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-]) FADE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-]) GRABSCREEN.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-]) HSV.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-]) OVERLAY.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-]) RESOURCES.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-]) SGIVIDEO.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-]) SPLINE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-]) USLEEP.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-]) VISUAL-GL.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-]) VISUAL.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-]) VMS-GTOD.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-]) VMS-STRDUP.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-]) XDBE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-]) XMU.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-]) XROGER.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-]) XSHM.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-]) YARANDOM.C
+$ lib/cre utils.olb_axp
+$ lib utils.olb_axp *.obj
+$! delete/noconf *.obj;
diff --git a/utils/compile_decc.com b/utils/compile_decc.com
new file mode 100644 (file)
index 0000000..7310767
--- /dev/null
@@ -0,0 +1,23 @@
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-]) ALPHA.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-]) COLORS.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-]) ERASE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-]) FADE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-]) GRABSCREEN.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-]) HSV.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-]) OVERLAY.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-]) RESOURCES.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-]) SGIVIDEO.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-]) SPLINE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-]) USLEEP.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-]) VISUAL-GL.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-]) VISUAL.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-]) VMS-GTOD.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-]) VMS-STRDUP.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-]) XDBE.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-]) XMU.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-]) XROGER.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-]) XSHM.C
+$ CC/DECC/PREFIX=ALL/DEFINE=(VMS,HAVE_CONFIG_H)/INCL=([],[-]) YARANDOM.C
+$ lib/cre utils.olb_decc
+$ lib utils.olb_decc *.obj
+$! delete/noconf *.obj;
diff --git a/utils/erase.c b/utils/erase.c
new file mode 100644 (file)
index 0000000..c2c8de7
--- /dev/null
@@ -0,0 +1,586 @@
+/* erase.c: Erase the screen in various more or less interesting ways.
+ * (c) 1997 by Johannes Keukelaar <johannes@nada.kth.se>
+ * Permission to use in any way granted. Provided "as is" without expressed
+ * or implied warranty. NO WARRANTY, NO EXPRESSION OF SUITABILITY FOR ANY
+ * PURPOSE. (I.e.: Use in any way, but at your own risk!)
+ */
+
+#include "utils.h"
+#include "yarandom.h"
+#include "usleep.h"
+#include "resources.h"
+
+#undef countof
+#define countof(x) (sizeof(x)/sizeof(*(x)))
+
+typedef void (*Eraser) (Display *dpy, Window window, GC gc,
+                       int width, int height, int delay, int granularity);
+
+
+static void
+random_lines (Display *dpy, Window window, GC gc,
+             int width, int height, int delay, int granularity)
+{
+  Bool horiz_p = (random() & 1);
+  int max = (horiz_p ? height : width);
+  int *lines = (int *) calloc(max, sizeof(*lines));
+  int i;
+
+  for (i = 0; i < max; i++)
+    lines[i] = i;
+
+  for (i = 0; i < max; i++)
+    {
+      int t, r;
+      t = lines[i];
+      r = random() % max;
+      lines[i] = lines[r];
+      lines[r] = t;
+    }
+
+  for (i = 0; i < max; i++)
+    { 
+      if (horiz_p)
+       XDrawLine (dpy, window, gc, 0, lines[i], width, lines[i]);
+      else
+       XDrawLine (dpy, window, gc, lines[i], 0, lines[i], height);
+
+      XSync (dpy, False);
+      if (delay > 0 && ((i % granularity) == 0))
+       usleep (delay * granularity);
+    }
+  free(lines);
+}
+
+
+static void
+venetian (Display *dpy, Window window, GC gc,
+         int width, int height, int delay, int granularity)
+{
+  Bool horiz_p = (random() & 1);
+  Bool flip_p = (random() & 1);
+  int max = (horiz_p ? height : width);
+  int *lines = (int *) calloc(max, sizeof(*lines));
+  int i, j;
+
+  granularity /= 6;
+
+  j = 0;
+  for (i = 0; i < max*2; i++)
+    {
+      int line = ((i / 16) * 16) - ((i % 16) * 15);
+      if (line >= 0 && line < max)
+       lines[j++] = (flip_p ? max - line : line);
+    }
+
+  for (i = 0; i < max; i++)
+    { 
+      if (horiz_p)
+       XDrawLine (dpy, window, gc, 0, lines[i], width, lines[i]);
+      else
+       XDrawLine (dpy, window, gc, lines[i], 0, lines[i], height);
+
+      XSync (dpy, False);
+      if (delay > 0 && ((i % granularity) == 0))
+       usleep (delay * granularity);
+    }
+  free(lines);
+}
+
+
+static void
+triple_wipe (Display *dpy, Window window, GC gc,
+            int width, int height, int delay, int granularity)
+{
+  Bool flip_x = random() & 1;
+  Bool flip_y = random() & 1;
+  int max = width + (height / 2);
+  int *lines = (int *)calloc(max, sizeof(int));
+  int i;
+
+  for(i = 0; i < width/2; i++)
+    lines[i] = i*2+height;
+  for(i = 0; i < height/2; i++)
+    lines[i+width/2] = i*2;
+  for(i = 0; i < width/2; i++)
+    lines[i+width/2+height/2] = width-i*2-(width%2?0:1)+height;
+
+  granularity /= 6;
+
+  for (i = 0; i < max; i++)
+    { 
+      int x, y, x2, y2;
+      if (lines[i] < height)
+       x = 0, y = lines[i], x2 = width, y2 = y;
+      else
+       x = lines[i]-height, y = 0, x2 = x, y2 = height;
+
+      if (flip_x)
+       x = width-x, x2 = width-x2;
+      if (flip_y)
+       y = height-y, y2 = height-y2;
+
+      XDrawLine (dpy, window, gc, x, y, x2, y2);
+      XSync (dpy, False);
+      if (delay > 0 && ((i % granularity) == 0))
+       usleep (delay*granularity);
+    }
+  free(lines);
+}
+
+
+static void
+quad_wipe (Display *dpy, Window window, GC gc,
+          int width, int height, int delay, int granularity)
+{
+  Bool flip_x = random() & 1;
+  Bool flip_y = random() & 1;
+  int max = width + height;
+  int *lines = (int *)calloc(max, sizeof(int));
+  int i;
+
+  granularity /= 3;
+
+  for (i = 0; i < max/4; i++)
+    {
+      lines[i*4]   = i*2;
+      lines[i*4+1] = height-i*2-(height%2?0:1);
+      lines[i*4+2] = height+i*2;
+      lines[i*4+3] = height+width-i*2-(width%2?0:1);
+    }
+
+  for (i = 0; i < max; i++)
+    { 
+      int x, y, x2, y2;
+      if (lines[i] < height)
+       x = 0, y = lines[i], x2 = width, y2 = y;
+      else
+       x = lines[i]-height, y = 0, x2 = x, y2 = height;
+
+      if (flip_x)
+       x = width-x, x2 = width-x2;
+      if (flip_y)
+       y = height-y, y2 = height-y2;
+
+      XDrawLine (dpy, window, gc, x, y, x2, y2);
+      XSync (dpy, False);
+      if (delay > 0 && ((i % granularity) == 0))
+       usleep (delay*granularity);
+    }
+  free(lines);
+}
+
+
+
+static void
+circle_wipe (Display *dpy, Window window, GC gc,
+            int width, int height, int delay, int granularity)
+{
+  int full = 360 * 64;
+  int inc = full / 64;
+  int start = random() % full;
+  int rad = (width > height ? width : height);
+  int i;
+  if (random() & 1)
+    inc = -inc;
+  for (i = (inc > 0 ? 0 : full);
+       (inc > 0 ? i < full : i > 0);
+       i += inc)
+    {
+      XFillArc(dpy, window, gc,
+              (width/2)-rad, (height/2)-rad, rad*2, rad*2,
+              (i+start) % full, inc);
+      XFlush (dpy);
+      usleep (delay*granularity);
+    }
+}
+
+
+static void
+three_circle_wipe (Display *dpy, Window window, GC gc,
+                  int width, int height, int delay, int granularity)
+{
+  int i;
+  int full = 360 * 64;
+  int q = full / 6;
+  int q2 = q * 2;
+  int inc = full / 240;
+  int start = random() % q;
+  int rad = (width > height ? width : height);
+
+  for (i = 0; i < q; i += inc)
+    {
+      XFillArc(dpy, window, gc, (width/2)-rad, (height/2)-rad, rad*2, rad*2,
+              (start+i) % full, inc);
+      XFillArc(dpy, window, gc, (width/2)-rad, (height/2)-rad, rad*2, rad*2,
+              (start-i) % full, -inc);
+
+      XFillArc(dpy, window, gc, (width/2)-rad, (height/2)-rad, rad*2, rad*2,
+              (start+q2+i) % full, inc);
+      XFillArc(dpy, window, gc, (width/2)-rad, (height/2)-rad, rad*2, rad*2,
+              (start+q2-i) % full, -inc);
+
+      XFillArc(dpy, window, gc, (width/2)-rad, (height/2)-rad, rad*2, rad*2,
+              (start+q2+q2+i) % full, inc);
+      XFillArc(dpy, window, gc, (width/2)-rad, (height/2)-rad, rad*2, rad*2,
+              (start+q2+q2-i) % full, -inc);
+
+      XSync (dpy, False);
+      usleep (delay*granularity);
+    }
+}
+
+
+static void
+squaretate (Display *dpy, Window window, GC gc,
+           int width, int height, int delay, int granularity)
+{
+  int steps = (((width > height ? width : width) * 2) / granularity);
+  int i;
+  Bool flip = random() & 1;
+
+#define DRAW() \
+      if (flip) { \
+       points[0].x = width-points[0].x; \
+       points[1].x = width-points[1].x; \
+        points[2].x = width-points[2].x; } \
+      XFillPolygon (dpy, window, gc, points, 3, Convex, CoordModeOrigin)
+
+  for (i = 0; i < steps; i++)
+    {
+      XPoint points [3];
+      points[0].x = 0;
+      points[0].y = 0;
+      points[1].x = width;
+      points[1].y = 0;
+      points[2].x = 0;
+      points[2].y = points[0].y + ((i * height) / steps);
+      DRAW();
+
+      points[0].x = 0;
+      points[0].y = 0;
+      points[1].x = 0;
+      points[1].y = height;
+      points[2].x = ((i * width) / steps);
+      points[2].y = height;
+      DRAW();
+
+      points[0].x = width;
+      points[0].y = height;
+      points[1].x = 0;
+      points[1].y = height;
+      points[2].x = width;
+      points[2].y = height - ((i * height) / steps);
+      DRAW();
+
+      points[0].x = width;
+      points[0].y = height;
+      points[1].x = width;
+      points[1].y = 0;
+      points[2].x = width - ((i * width) / steps);
+      points[2].y = 0;
+      DRAW();
+
+      XSync (dpy, True);
+      if (delay > 0)
+       usleep (delay * granularity);
+   }
+#undef DRAW
+}
+
+
+/* from Frederick Roeber <roeber@netscape.com> */
+static void
+fizzle (Display *dpy, Window window, GC gc,
+           int width, int height, int delay, int granularity)
+{
+  /* These dimensions must be prime numbers.  They should be roughly the
+     square root of the width and height. */
+# define BX 31
+# define BY 31
+# define SIZE (BX*BY)
+
+  int array[SIZE];
+  int i, j;
+  XPoint *skews;
+  int nx, ny;
+
+  /* Distribute the numbers [0,SIZE) randomly in the array */
+  {
+    int indices[SIZE];
+
+    for( i = 0; i < SIZE; i++ ) {
+      array[i] = -1;
+      indices[i] = i;
+    } 
+
+    for( i = 0; i < SIZE; i++ ) {
+      j = random()%(SIZE-i);
+      array[indices[j]] = i;
+      indices[j] = indices[SIZE-i-1];
+    }
+  }
+
+  /* nx, ny are the number of cells across and down, rounded up */
+  nx = width  / BX + (0 == (width %BX) ? 0 : 1);
+  ny = height / BY + (0 == (height%BY) ? 0 : 1);
+  skews = (XPoint *)malloc(sizeof(XPoint) * (nx*ny));
+  if( (XPoint *)0 != skews ) {
+    for( i = 0; i < nx; i++ ) {
+      for( j = 0; j < ny; j++ ) {
+        skews[j * nx + i].x = random()%BX;
+        skews[j * nx + i].y = random()%BY;
+      }
+    }
+  }
+
+# define SKEWX(cx, cy) (((XPoint *)0 == skews)?0:skews[cy*nx + cx].x)
+# define SKEWY(cx, cy) (((XPoint *)0 == skews)?0:skews[cy*nx + cx].y)
+
+  for( i = 0; i < SIZE; i++ ) {
+    int x = array[i] % BX;
+    int y = array[i] / BX;
+
+    {
+      int iy, cy;
+      for( iy = 0, cy = 0; iy < height; iy += BY, cy++ ) {
+        int ix, cx;
+        for( ix = 0, cx = 0; ix < width; ix += BX, cx++ ) {
+          int xx = ix + (SKEWX(cx, cy) + x*((cx%(BX-1))+1))%BX;
+          int yy = iy + (SKEWY(cx, cy) + y*((cy%(BY-1))+1))%BY;
+          XDrawPoint(dpy, window, gc, xx, yy);
+        }
+      }
+    }
+
+    if( (BX-1) == (i%BX) ) {
+      XSync (dpy, False);
+      usleep (delay*granularity);
+    }
+  }
+
+# undef SKEWX
+# undef SKEWY
+
+  if( (XPoint *)0 != skews ) {
+    free(skews);
+  }
+
+# undef BX
+# undef BY
+# undef SIZE
+}
+
+
+/* from Rick Campbell <rick@campbellcentral.org> */
+static void
+spiral (Display *display, Window window, GC context,
+        int width, int height, int delay, int granularity)
+{
+# define SPIRAL_ERASE_PI_2 (M_PI + M_PI)
+# define SPIRAL_ERASE_LOOP_COUNT (10)
+# define SPIRAL_ERASE_ARC_COUNT (360.0)
+# define SPIRAL_ERASE_ANGLE_INCREMENT (SPIRAL_ERASE_PI_2 /     \
+SPIRAL_ERASE_ARC_COUNT)
+# define SPIRAL_ERASE_DELAY (0)
+
+  double angle;
+  int arc_limit;
+  int arc_max_limit;
+  int length_step;
+  XPoint points [3];
+
+  angle = 0.0;
+  arc_limit = 1;
+  arc_max_limit = (int) (ceil (sqrt ((width * width) + (height * height)))
+                         / 2.0);
+  length_step = ((arc_max_limit + SPIRAL_ERASE_LOOP_COUNT - 1) /
+                 SPIRAL_ERASE_LOOP_COUNT);
+  arc_max_limit += length_step;
+  points [0].x = width / 2;
+  points [0].y = height / 2;
+  points [1].x = points [0].x + length_step;
+  points [1].y = points [0].y;
+  points [2].x = points [1].x;
+  points [2].y = points [1].y;
+
+  for (arc_limit = length_step;
+       arc_limit < arc_max_limit;
+       arc_limit += length_step)
+    {
+      int arc_length = length_step;
+      int length_base = arc_limit;
+      for (angle = 0.0; angle < SPIRAL_ERASE_PI_2;
+           angle += SPIRAL_ERASE_ANGLE_INCREMENT)
+        {
+          arc_length = length_base + ((length_step * angle) /
+                                      SPIRAL_ERASE_PI_2);
+          points [1].x = points [2].x;
+          points [1].y = points [2].y;
+          points [2].x = points [0].x + (int)(cos (angle) * arc_length);
+          points [2].y = points [0].y + (int)(sin (angle) * arc_length);
+          XFillPolygon (display, window, context, points, 3, Convex,
+                        CoordModeOrigin);
+# if (SPIRAL_ERASE_DELAY != 0)
+          usleep (SPIRAL_ERASE_DELAY);
+# endif /* (SPIRAL_ERASE_DELAY != 0) */
+        }
+    }
+# undef SPIRAL_ERASE_DELAY
+# undef SPIRAL_ERASE_ANGLE_INCREMENT
+# undef SPIRAL_ERASE_ARC_COUNT
+# undef SPIRAL_ERASE_LOOP_COUNT
+# undef SPIRAL_ERASE_PI_2
+}
+
+
+#undef MAX
+#undef MIN
+#define MAX(a,b) ((a)>(b)?(a):(b))
+#define MIN(a,b) ((a)<(b)?(a):(b))
+
+/* from David Bagley <bagleyd@tux.org> */
+static void
+random_squares(Display * dpy, Window window, GC gc,
+               int width, int height, int delay, int granularity)
+{
+  int randsize = MAX(1, MIN(width, height) / (16 + (random() % 32)));
+  int max = (height / randsize + 1) * (width / randsize + 1);
+  int *squares = (int *) calloc(max, sizeof (*squares));
+  int i;
+  int columns = width / randsize + 1;  /* Add an extra for roundoff */
+
+  for (i = 0; i < max; i++)
+    squares[i] = i;
+
+  for (i = 0; i < max; i++)
+    {
+      int t, r;
+      t = squares[i];
+      r = random() % max;
+      squares[i] = squares[r];
+      squares[r] = t;
+    }
+
+  for (i = 0; i < max; i++)
+    {
+      XFillRectangle(dpy, window, gc,
+                    (squares[i] % columns) * randsize,
+                    (squares[i] / columns) * randsize,
+                    randsize, randsize);
+
+      XSync(dpy, False);
+      if (delay > 0 && ((i % granularity) == 0))
+      usleep(delay * granularity);
+    }
+  free(squares);
+}
+
+
+static Eraser erasers[] = {
+  random_lines,
+  venetian,
+  triple_wipe,
+  quad_wipe,
+  circle_wipe,
+  three_circle_wipe,
+  squaretate,
+  fizzle,
+  random_squares,
+  spiral,
+};
+
+
+void
+erase_window(Display *dpy, Window window, GC gc,
+            int width, int height, int mode, int delay)
+{
+  int granularity = 25;
+
+  if (mode < 0 || mode >= countof(erasers))
+    mode = random() % countof(erasers);
+  (*(erasers[mode])) (dpy, window, gc, width, height, delay, granularity);
+  XClearWindow (dpy, window);
+  XSync(dpy, False);
+}
+
+
+void
+erase_full_window(Display *dpy, Window window)
+{
+  XWindowAttributes xgwa;
+  XGCValues gcv;
+  GC erase_gc;
+  XColor black;
+  int erase_speed, erase_mode;
+  char *s;
+
+  s = get_string_resource("eraseSpeed", "Integer");
+  if (s && *s)
+    erase_speed = get_integer_resource("eraseSpeed", "Integer");
+  else
+    erase_speed = 400;
+  if (s) free(s);
+
+  s = get_string_resource("eraseMode", "Integer");
+  if (s && *s)
+    erase_mode = get_integer_resource("eraseMode", "Integer");
+  else
+    erase_mode = -1;
+  if (s) free(s);
+
+  XGetWindowAttributes (dpy, window, &xgwa);
+  black.flags = DoRed|DoGreen|DoBlue;
+  black.red = black.green = black.blue = 0;
+  XAllocColor(dpy, xgwa.colormap, &black);
+  gcv.foreground = black.pixel;
+  erase_gc = XCreateGC (dpy, window, GCForeground, &gcv);
+  erase_window (dpy, window, erase_gc, xgwa.width, xgwa.height,
+               erase_mode, erase_speed);
+  XFreeColors(dpy, xgwa.colormap, &black.pixel, 1, 0);
+  XFreeGC(dpy, erase_gc);
+}
+
+
+\f
+#if 0
+#include "screenhack.h"
+
+char *progclass = "Erase";
+char *defaults [] = {
+  0
+};
+
+XrmOptionDescRec options [] = {{0}};
+int options_size = 0;
+
+void
+screenhack (dpy, window)
+     Display *dpy;
+     Window window;
+{
+  int delay = 500000;
+  XGCValues gcv;
+  GC gc;
+  XColor white;
+  XWindowAttributes xgwa;
+  XGetWindowAttributes (dpy, window, &xgwa);
+  white.flags = DoRed|DoGreen|DoBlue;
+  white.red = white.green = white.blue = 0xFFFF;
+  XAllocColor(dpy, xgwa.colormap, &white);
+  gcv.foreground = white.pixel;
+  gc = XCreateGC (dpy, window, GCForeground, &gcv);
+
+  while (1)
+    {
+      XFillRectangle(dpy, window, gc, 0, 0, 1280, 1024);
+      XSync (dpy, False);
+      usleep (delay);
+      erase_full_window(dpy, window);
+      XSync (dpy, False);
+      usleep (delay);
+
+    }
+}
+
+#endif
diff --git a/utils/erase.h b/utils/erase.h
new file mode 100644 (file)
index 0000000..2f00d3e
--- /dev/null
@@ -0,0 +1,15 @@
+/* erase.c: Erase the screen in various more or less interesting ways.
+ * (c) 1997 by Johannes Keukelaar <johannes@nada.kth.se>
+ * Permission to use in any way granted. Provided "as is" without expressed
+ * or implied warranty. NO WARRANTY, NO EXPRESSION OF SUITABILITY FOR ANY
+ * PURPOSE. (I.e.: Use in any way, but at your own risk!)
+ */
+
+#ifndef __XSCREENSAVER_ERASE_H__
+#define __XSCREENSAVER_ERASE_H__
+
+extern void erase_window(Display *dpy, Window window, GC gc,
+                        int width, int height, int mode, int delay);
+extern void erase_full_window(Display *dpy, Window window);
+
+#endif /* __XSCREENSAVER_ERASE_H__ */
diff --git a/utils/fade.c b/utils/fade.c
new file mode 100644 (file)
index 0000000..186bc89
--- /dev/null
@@ -0,0 +1,621 @@
+/* xscreensaver, Copyright (c) 1992-1998 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software 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.  No representations are made about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or 
+ * implied warranty.
+ */
+
+#include "utils.h"
+
+#include <sys/time.h> /* for gettimeofday() */
+
+#ifdef VMS
+# include "vms-gtod.h"
+#endif /* VMS */
+
+#include "visual.h"
+#include "usleep.h"
+#include "fade.h"
+
+
+Colormap
+copy_colormap (Screen *screen, Visual *visual,
+              Colormap cmap, Colormap into_cmap)
+{
+  int i;
+  Display *dpy = DisplayOfScreen (screen);
+  Window window = RootWindowOfScreen (screen);
+  int ncolors = CellsOfScreen (screen);
+  XColor *colors = 0;
+
+  /* If this is a colormap on a mono visual, or one with insanely many
+     color cells, bug out. */
+  if (ncolors <= 2 || ncolors > 4096)
+    return 0;
+  /* If this is a non-writable visual, bug out. */
+  if (!has_writable_cells (screen, visual))
+    return 0;
+
+  if (! into_cmap)
+    into_cmap = XCreateColormap (dpy, window, visual, AllocAll);
+  if (! cmap)
+    cmap = DefaultColormapOfScreen (screen);
+
+  colors = (XColor *) calloc(sizeof(XColor), ncolors);
+  for (i = 0; i < ncolors; i++)
+    colors [i].pixel = i;
+  XQueryColors (dpy, cmap, colors, ncolors);
+  XStoreColors (dpy, into_cmap, colors, ncolors);
+  free (colors);
+  return into_cmap;
+}
+
+
+void
+blacken_colormap (Screen *screen, Colormap cmap)
+{
+  Display *dpy = DisplayOfScreen (screen);
+  int ncolors = CellsOfScreen (screen);
+  XColor *colors;
+  int i;
+  if (ncolors > 4096)
+    return;
+  colors = (XColor *) calloc(sizeof(XColor), ncolors);
+  for (i = 0; i < ncolors; i++)
+    colors[i].pixel = i;
+  XStoreColors (dpy, cmap, colors, ncolors);
+  free (colors);
+}
+
+
+
+static void fade_screens_1 (Display *dpy, Colormap *cmaps,
+                           Window *black_windows, int seconds, int ticks,
+                           Bool out_p, Bool clear_windows);
+#ifdef HAVE_SGI_VC_EXTENSION
+static int sgi_gamma_fade (Display *dpy,
+                          Window *black_windows, int seconds, int ticks,
+                          Bool out_p, Bool clear_windows);
+#endif /* HAVE_SGI_VC_EXTENSION */
+
+
+
+void
+fade_screens (Display *dpy, Colormap *cmaps, Window *black_windows,
+             int seconds, int ticks,
+             Bool out_p, Bool clear_windows)
+{
+  int oseconds = seconds;
+  Bool was_in_p = !out_p;
+
+  /* When we're asked to fade in, first fade out, then fade in.
+     That way all the transitions are smooth -- from what's on the
+     screen, to black, to the desktop.
+   */
+  if (was_in_p)
+    {
+      clear_windows = True;
+      out_p = True;
+      seconds /= 3;
+      if (seconds == 0)
+       seconds = 1;
+    }
+
+ AGAIN:
+
+#ifdef HAVE_SGI_VC_EXTENSION
+  /* First try to do it by fading the gamma in an SGI-specific way... */
+  if (0 != sgi_gamma_fade(dpy, black_windows, seconds, ticks, out_p,
+                         clear_windows))
+#endif /* HAVE_SGI_VC_EXTENSION */
+    /* Else, do it the old-fashioned way, which (somewhat) loses if
+       there are TrueColor windows visible. */
+    fade_screens_1 (dpy, cmaps, black_windows, seconds, ticks,
+                   out_p, clear_windows);
+
+  /* If we were supposed to be fading in, do so now (we just faded out,
+     so now fade back in.)
+   */
+  if (was_in_p)
+    {
+      was_in_p = False;
+      out_p = False;
+      seconds = oseconds * 2 / 3;
+      if (seconds == 0)
+       seconds = 1;
+      goto AGAIN;
+    }
+}
+
+
+/* The business with `cmaps_per_screen' is to fake out the SGI 8-bit video
+   hardware, which is capable of installing multiple (4) colormaps
+   simultaniously.  We have to install multiple copies of the same set of
+   colors in order to fill up all the available slots in the hardware color
+   lookup table, so we install an extra N colormaps per screen to make sure
+   that all screens really go black.
+
+   I'm told that this trick also works with XInside's AcceleratedX when using
+   the Matrox Millennium card (which also allows multiple PseudoColor and
+   TrueColor visuals to co-exist and display properly at the same time.)  
+
+   This trick works ok on the 24-bit Indy video hardware, but doesn't work at
+   all on the O2 24-bit hardware.  I guess the higher-end hardware is too
+   "good" for this to work (dammit.)  So... I figured out the "right" way to
+   do this on SGIs, which is to ramp the monitor's gamma down to 0.  That's
+   what is implemented in sgi_gamma_fade(), so we use that if we can.
+ */
+static void
+fade_screens_1 (Display *dpy, Colormap *cmaps, Window *black_windows,
+               int seconds, int ticks,
+               Bool out_p, Bool clear_windows)
+{
+  int i, j, k;
+  int steps = seconds * ticks;
+  long usecs_per_step = (long)(seconds * 1000000) / (long)steps;
+  XEvent dummy_event;
+  int cmaps_per_screen = 5;
+  int nscreens = ScreenCount(dpy);
+  int ncmaps = nscreens * cmaps_per_screen;
+  Colormap *fade_cmaps = 0;
+  Bool installed = False;
+  int total_ncolors;
+  XColor *orig_colors, *current_colors, *screen_colors, *orig_screen_colors;
+  struct timeval then, now;
+#ifdef GETTIMEOFDAY_TWO_ARGS
+  struct timezone tzp;
+#endif
+
+  total_ncolors = 0;
+  for (i = 0; i < nscreens; i++)
+    total_ncolors += CellsOfScreen (ScreenOfDisplay(dpy, i));
+
+  orig_colors    = (XColor *) calloc(sizeof(XColor), total_ncolors);
+  current_colors = (XColor *) calloc(sizeof(XColor), total_ncolors);
+
+  /* Get the contents of the colormap we are fading from or to. */
+  screen_colors = orig_colors;
+  for (i = 0; i < nscreens; i++)
+    {
+      int ncolors = CellsOfScreen (ScreenOfDisplay (dpy, i));
+      Colormap cmap = (cmaps ? cmaps[i] : 0);
+      if (!cmap) cmap = DefaultColormap(dpy, i);
+
+      for (j = 0; j < ncolors; j++)
+       screen_colors[j].pixel = j;
+      XQueryColors (dpy, cmap, screen_colors, ncolors);
+
+      screen_colors += ncolors;
+    }
+
+  memcpy (current_colors, orig_colors, total_ncolors * sizeof (XColor));
+
+
+  /* Make the writable colormaps (we keep these around and reuse them.) */
+  if (!fade_cmaps)
+    {
+      fade_cmaps = (Colormap *) calloc(sizeof(Colormap), ncmaps);
+      for (i = 0; i < nscreens; i++)
+       {
+         Visual *v = DefaultVisual(dpy, i);
+         Screen *s = ScreenOfDisplay(dpy, i);
+         if (has_writable_cells (s, v))
+           for (j = 0; j < cmaps_per_screen; j++)
+             fade_cmaps[(i * cmaps_per_screen) + j] =
+               XCreateColormap (dpy, RootWindowOfScreen (s), v, AllocAll);
+       }
+    }
+
+#ifdef GETTIMEOFDAY_TWO_ARGS
+  gettimeofday(&then, &tzp);
+#else
+  gettimeofday(&then);
+#endif
+
+  /* Iterate by steps of the animation... */
+  for (i = (out_p ? steps : 0);
+       (out_p ? i > 0 : i < steps);
+       (out_p ? i-- : i++))
+    {
+
+      /* For each screen, compute the current value of each color...
+       */
+      orig_screen_colors = orig_colors;
+      screen_colors = current_colors;
+      for (j = 0; j < nscreens; j++)
+       {
+         int ncolors = CellsOfScreen (ScreenOfDisplay (dpy, j));
+         for (k = 0; k < ncolors; k++)
+           {
+             /* This doesn't take into account the relative luminance of the
+                RGB components (0.299, 0.587, and 0.114 at gamma 2.2) but
+                the difference is imperceptible for this application... */
+             screen_colors[k].red   = orig_screen_colors[k].red   * i / steps;
+             screen_colors[k].green = orig_screen_colors[k].green * i / steps;
+             screen_colors[k].blue  = orig_screen_colors[k].blue  * i / steps;
+           }
+         screen_colors      += ncolors;
+         orig_screen_colors += ncolors;
+       }
+
+      /* Put the colors into the maps...
+       */
+      screen_colors = current_colors;
+      for (j = 0; j < nscreens; j++)
+       {
+         int ncolors = CellsOfScreen (ScreenOfDisplay (dpy, j));
+         for (k = 0; k < cmaps_per_screen; k++)
+           {
+             Colormap c = fade_cmaps[j * cmaps_per_screen + k];
+             if (c)
+               XStoreColors (dpy, c, screen_colors, ncolors);
+           }
+         screen_colors += ncolors;
+       }
+
+      /* Put the maps on the screens, and then take the windows off the screen.
+        (only need to do this the first time through the loop.)
+       */
+      if (!installed)
+       {
+         for (j = 0; j < ncmaps; j++)
+           if (fade_cmaps[j])
+             XInstallColormap (dpy, fade_cmaps[j]);
+         installed = True;
+
+         if (black_windows && !out_p)
+           for (j = 0; j < nscreens; j++)
+             if (black_windows[j])
+               {
+                 XUnmapWindow (dpy, black_windows[j]);
+                 XClearWindow (dpy, black_windows[j]);
+               }
+       }
+
+      XSync (dpy, False);
+
+      /* If there is user activity, bug out.  (Bug out on keypresses or
+        mouse presses, but not motion, and not release events.  Bugging
+        out on motion made the unfade hack be totally useless, I think.)
+
+        We put the event back so that the calling code can notice it too.
+        It would be better to not remove it at all, but that's harder
+        because Xlib has such a non-design for this kind of crap, and
+        in this application it doesn't matter if the events end up out
+        of order, so in the grand unix tradition we say "fuck it" and
+        do something that mostly works for the time being.
+       */
+      if (XCheckMaskEvent (dpy, (KeyPressMask|ButtonPressMask), &dummy_event))
+       {
+         XPutBackEvent (dpy, &dummy_event);
+         goto DONE;
+       }
+
+#ifdef GETTIMEOFDAY_TWO_ARGS
+      gettimeofday(&now, &tzp);
+#else
+      gettimeofday(&now);
+#endif
+
+      /* If we haven't already used up our alotted time, sleep to avoid
+        changing the colormap too fast. */
+      {
+       long diff = (((now.tv_sec - then.tv_sec) * 1000000) +
+                    now.tv_usec - then.tv_usec);
+       then.tv_sec = now.tv_sec;
+       then.tv_usec = now.tv_usec;
+       if (usecs_per_step > diff)
+         usleep (usecs_per_step - diff);
+      }
+    }
+
+ DONE:
+
+  if (orig_colors)    free (orig_colors);
+  if (current_colors) free (current_colors);
+
+  /* If we've been given windows to raise after blackout, raise them before
+     releasing the colormaps.
+   */
+  if (out_p && black_windows)
+    {
+      for (i = 0; i < nscreens; i++)
+       {
+         if (clear_windows)
+           XClearWindow (dpy, black_windows[i]);
+         XMapRaised (dpy, black_windows[i]);
+       }
+      XSync(dpy, False);
+    }
+
+  /* Now put the target maps back.
+     If we're fading out, use the given cmap (or the default cmap, if none.)
+     If we're fading in, always use the default cmap.
+   */
+  for (i = 0; i < nscreens; i++)
+    {
+      Colormap cmap = (cmaps ? cmaps[i] : 0);
+      if (!cmap || !out_p)
+       cmap = DefaultColormap(dpy, i);
+      XInstallColormap (dpy, cmap);
+    }
+
+  /* The fade (in or out) is complete, so we don't need the black maps on
+     stage any more.
+   */
+  for (i = 0; i < ncmaps; i++)
+    if (fade_cmaps[i])
+      {
+       XUninstallColormap(dpy, fade_cmaps[i]);
+       XFreeColormap(dpy, fade_cmaps[i]);
+       fade_cmaps[i] = 0;
+      }
+  free(fade_cmaps);
+  fade_cmaps = 0;
+}
+
+
+#ifdef HAVE_SGI_VC_EXTENSION
+
+# include <X11/extensions/XSGIvc.h>
+
+struct screen_gamma_info {
+  int gamma_map;  /* ??? always using 0 */
+  int nred, ngreen, nblue;
+  unsigned short *red1, *green1, *blue1;
+  unsigned short *red2, *green2, *blue2;
+  int gamma_size;
+  int gamma_precision;
+  Bool alpha_p;
+};
+
+
+static void whack_gamma(Display *dpy, int screen,
+                       struct screen_gamma_info *info, float ratio);
+
+static int
+sgi_gamma_fade (Display *dpy,
+               Window *black_windows, int seconds, int ticks,
+               Bool out_p, Bool clear_windows)
+{
+  int steps = seconds * ticks;
+  long usecs_per_step = (long)(seconds * 1000000) / (long)steps;
+  XEvent dummy_event;
+  int nscreens = ScreenCount(dpy);
+  struct timeval then, now;
+#ifdef GETTIMEOFDAY_TWO_ARGS
+  struct timezone tzp;
+#endif
+  int i, screen;
+  int status = -1;
+  struct screen_gamma_info *info = (struct screen_gamma_info *)
+    calloc(nscreens, sizeof(*info));
+
+  /* Get the current gamma maps for all screens.
+     Bug out and return -1 if we can't get them for some screen.
+   */
+  for (screen = 0; screen < nscreens; screen++)
+    {
+      if (!XSGIvcQueryGammaMap(dpy, screen, info[screen].gamma_map,
+                              &info[screen].gamma_size,
+                              &info[screen].gamma_precision,
+                              &info[screen].alpha_p))
+       goto FAIL;
+
+      if (!XSGIvcQueryGammaColors(dpy, screen, info[screen].gamma_map,
+                                 XSGIVC_COMPONENT_RED,
+                                 &info[screen].nred, &info[screen].red1))
+       goto FAIL;
+      if (! XSGIvcQueryGammaColors(dpy, screen, info[screen].gamma_map,
+                                  XSGIVC_COMPONENT_GREEN,
+                                  &info[screen].ngreen, &info[screen].green1))
+       goto FAIL;
+      if (!XSGIvcQueryGammaColors(dpy, screen, info[screen].gamma_map,
+                                 XSGIVC_COMPONENT_BLUE,
+                                 &info[screen].nblue, &info[screen].blue1))
+       goto FAIL;
+
+      if (info[screen].gamma_precision == 8)    /* Scale it up to 16 bits. */
+       {
+         int j;
+         for(j = 0; j < info[screen].nred; j++)
+           info[screen].red1[j]   =
+             ((info[screen].red1[j]   << 8) | info[screen].red1[j]);
+         for(j = 0; j < info[screen].ngreen; j++)
+           info[screen].green1[j] =
+             ((info[screen].green1[j] << 8) | info[screen].green1[j]);
+         for(j = 0; j < info[screen].nblue; j++)
+           info[screen].blue1[j]  =
+             ((info[screen].blue1[j]  << 8) | info[screen].blue1[j]);
+       }
+
+      info[screen].red2   = (unsigned short *)
+       malloc(sizeof(*info[screen].red2)   * (info[screen].nred+1));
+      info[screen].green2 = (unsigned short *)
+       malloc(sizeof(*info[screen].green2) * (info[screen].ngreen+1));
+      info[screen].blue2  = (unsigned short *)
+       malloc(sizeof(*info[screen].blue2)  * (info[screen].nblue+1));
+    }
+
+#ifdef GETTIMEOFDAY_TWO_ARGS
+  gettimeofday(&then, &tzp);
+#else
+  gettimeofday(&then);
+#endif
+
+  /* If we're fading in (from black), then first crank the gamma all the
+     way down to 0, then take the windows off the screen.
+   */
+  if (!out_p)
+    for (screen = 0; screen < nscreens; screen++)
+      {
+       whack_gamma(dpy, screen, &info[screen], 0.0);
+       if (black_windows && black_windows[screen])
+         {
+           XUnmapWindow (dpy, black_windows[screen]);
+           XClearWindow (dpy, black_windows[screen]);
+           XSync(dpy, False);
+         }
+      }
+
+
+  /* Iterate by steps of the animation... */
+  for (i = (out_p ? steps : 0);
+       (out_p ? i > 0 : i < steps);
+       (out_p ? i-- : i++))
+    {
+      for (screen = 0; screen < nscreens; screen++)
+       {
+         whack_gamma(dpy, screen, &info[screen],
+                     (((float)i) / ((float)steps)));
+
+         /* If there is user activity, bug out.  (Bug out on keypresses or
+            mouse presses, but not motion, and not release events.  Bugging
+            out on motion made the unfade hack be totally useless, I think.)
+
+            We put the event back so that the calling code can notice it too.
+            It would be better to not remove it at all, but that's harder
+            because Xlib has such a non-design for this kind of crap, and
+            in this application it doesn't matter if the events end up out
+            of order, so in the grand unix tradition we say "fuck it" and
+            do something that mostly works for the time being.
+          */
+         if (XCheckMaskEvent (dpy, (KeyPressMask|ButtonPressMask),
+                              &dummy_event))
+           {
+             XPutBackEvent (dpy, &dummy_event);
+             goto DONE;
+           }
+
+#ifdef GETTIMEOFDAY_TWO_ARGS
+         gettimeofday(&now, &tzp);
+#else
+         gettimeofday(&now);
+#endif
+
+         /* If we haven't already used up our alotted time, sleep to avoid
+            changing the colormap too fast. */
+         {
+           long diff = (((now.tv_sec - then.tv_sec) * 1000000) +
+                        now.tv_usec - then.tv_usec);
+           then.tv_sec = now.tv_sec;
+           then.tv_usec = now.tv_usec;
+           if (usecs_per_step > diff)
+             usleep (usecs_per_step - diff);
+         }
+       }
+    }
+  
+
+ DONE:
+
+  if (out_p && black_windows)
+    {
+      for (screen = 0; screen < nscreens; screen++)
+       {
+         if (clear_windows)
+           XClearWindow (dpy, black_windows[screen]);
+         XMapRaised (dpy, black_windows[screen]);
+       }
+      XSync(dpy, False);
+    }
+
+  /* I can't explain this; without this delay, we get a flicker.
+     I suppose there's some lossage with stale bits being in the
+     hardware frame buffer or something, and this delay gives it
+     time to flush out.  This sucks! */
+  usleep(100000);  /* 1/10th second */
+
+  for (screen = 0; screen < nscreens; screen++)
+    whack_gamma(dpy, screen, &info[screen], 1.0);
+  XSync(dpy, False);
+
+  status = 0;
+
+ FAIL:
+  for (screen = 0; screen < nscreens; screen++)
+    {
+      if (info[screen].red1)   free (info[screen].red1);
+      if (info[screen].green1) free (info[screen].green1);
+      if (info[screen].blue1)  free (info[screen].blue1);
+      if (info[screen].red2)   free (info[screen].red2);
+      if (info[screen].green2) free (info[screen].green2);
+      if (info[screen].blue2)  free (info[screen].blue2);
+    }
+  free(info);
+
+  return status;
+}
+
+static void
+whack_gamma(Display *dpy, int screen, struct screen_gamma_info *info,
+           float ratio)
+{
+  int k;
+
+  if (ratio < 0) ratio = 0;
+  if (ratio > 1) ratio = 1;
+  for (k = 0; k < info->gamma_size; k++)
+    {
+      info->red2[k]   = info->red1[k]   * ratio;
+      info->green2[k] = info->green1[k] * ratio;
+      info->blue2[k]  = info->blue1[k]  * ratio;
+    }
+
+  XSGIvcStoreGammaColors16(dpy, screen, info->gamma_map, info->nred,
+                          XSGIVC_MComponentRed, info->red2);
+  XSGIvcStoreGammaColors16(dpy, screen, info->gamma_map, info->ngreen,
+                          XSGIVC_MComponentGreen, info->green2);
+  XSGIvcStoreGammaColors16(dpy, screen, info->gamma_map, info->nblue,
+                          XSGIVC_MComponentBlue, info->blue2);
+  XSync(dpy, False);
+}
+
+#endif /* HAVE_SGI_VC_EXTENSION */
+
+
+
+\f
+#if 0
+#include "screenhack.h"
+
+char *progclass = "foo";
+char *defaults [] = {
+  0
+};
+
+XrmOptionDescRec options [] = {0};
+int options_size = 0;
+
+void
+screenhack (dpy, w)
+     Display *dpy;
+     Window w;
+{
+  int seconds = 3;
+  int ticks = 20;
+  int delay = 1;
+
+  while (1)
+    {
+      XSync (dpy, False);
+
+      fprintf(stderr,"out..."); fflush(stderr);
+      fade_screens (dpy, 0, seconds, ticks, True);
+      fprintf(stderr, "done.\n"); fflush(stderr);
+
+      if (delay) sleep (delay);
+
+      fprintf(stderr,"in..."); fflush(stderr);
+      fade_screens (dpy, 0, seconds, ticks, False);
+      fprintf(stderr, "done.\n"); fflush(stderr);
+
+      if (delay) sleep (delay);
+    }
+}
+
+#endif
diff --git a/utils/fade.h b/utils/fade.h
new file mode 100644 (file)
index 0000000..bbe1c9b
--- /dev/null
@@ -0,0 +1,21 @@
+/* xscreensaver, Copyright (c) 1992-1997 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software 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.  No representations are made about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or 
+ * implied warranty.
+ */
+
+#ifndef __FADE_H__
+#define __FADE_H__
+
+extern Colormap copy_colormap (Screen *, Visual *, Colormap from, Colormap to);
+extern void blacken_colormap (Screen *, Colormap cmap);
+extern void fade_screens (Display *dpy,
+                         Colormap *cmaps, Window *black_windows,
+                         int seconds, int ticks,
+                         Bool out_p, Bool clear_windows);
+#endif /* __FADE_H__ */
diff --git a/utils/grabscreen.c b/utils/grabscreen.c
new file mode 100644 (file)
index 0000000..3919457
--- /dev/null
@@ -0,0 +1,726 @@
+/* xscreensaver, Copyright (c) 1992, 1993, 1994, 1997, 1998
+ *  Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software 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.  No representations are made about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or 
+ * implied warranty.
+ */
+
+/* This file contains code for grabbing an image of the screen to hack its
+   bits.  This is a little tricky, since doing this involves the need to tell
+   the difference between drawing on the actual root window, and on the fake
+   root window used by the screensaver, since at this level the illusion 
+   breaks down...
+ */
+
+#include "utils.h"
+#include "yarandom.h"
+
+#include <X11/Xatom.h>
+#include <X11/Xutil.h>
+
+#ifdef HAVE_XMU
+# ifndef VMS
+#  include <X11/Xmu/WinUtil.h>
+# else  /* VMS */
+#  include <Xmu/WinUtil.h>
+# endif /* VMS */
+#endif
+
+#include "usleep.h"
+#include "colors.h"
+#include "grabscreen.h"
+#include "sgivideo.h"
+#include "visual.h"
+#include "resources.h"
+
+#include "vroot.h"
+#undef RootWindowOfScreen
+#undef RootWindow
+#undef DefaultRootWindow
+
+
+#ifdef HAVE_READ_DISPLAY_EXTENSION
+# include <X11/extensions/readdisplay.h>
+  static Bool read_display (Screen *, Window, Pixmap, Bool);
+#endif /* HAVE_READ_DISPLAY_EXTENSION */
+
+
+static void copy_default_colormap_contents (Screen *, Colormap, Visual *);
+
+#if defined(HAVE_READ_DISPLAY_EXTENSION) || defined(HAVE_SGI_VIDEO)
+static void make_cubic_colormap (Screen *, Window, Visual *);
+#endif
+
+
+static Bool
+MapNotify_event_p (Display *dpy, XEvent *event, XPointer window)
+{
+  return (event->xany.type == MapNotify &&
+         event->xvisibility.window == (Window) window);
+}
+
+#ifdef DEBUG
+extern char *progname;
+#endif /* DEBUG */
+
+
+static void
+raise_window(Display *dpy, Window window, Bool dont_wait)
+{
+#ifdef DEBUG
+  fprintf(stderr, "%s: raising window 0x%08lX (%s)\n",
+         progname, (unsigned long) window,
+         (dont_wait ? "not waiting" : "waiting"));
+#endif /* DEBUG */
+
+  if (! dont_wait)
+    {
+      XWindowAttributes xgwa;
+      XSizeHints hints;
+      long supplied = 0;
+      memset(&hints, 0, sizeof(hints));
+      XGetWMNormalHints(dpy, window, &hints, &supplied);
+      XGetWindowAttributes (dpy, window, &xgwa);
+      hints.x = xgwa.x;
+      hints.y = xgwa.y;
+      hints.width = xgwa.width;
+      hints.height = xgwa.height;
+      hints.flags |= (PPosition|USPosition|PSize|USSize);
+      XSetWMNormalHints(dpy, window, &hints);
+    }
+
+  XMapRaised(dpy, window);
+
+  if (! dont_wait)
+    {
+      XEvent event;
+      XIfEvent (dpy, &event, MapNotify_event_p, (XPointer) window);
+      XSync (dpy, True);
+    }
+}
+
+
+static Bool
+xscreensaver_window_p (Display *dpy, Window window)
+{
+  Atom type;
+  int format;
+  unsigned long nitems, bytesafter;
+  char *version;
+  if (XGetWindowProperty (dpy, window,
+                         XInternAtom (dpy, "_SCREENSAVER_VERSION", False),
+                         0, 1, False, XA_STRING,
+                         &type, &format, &nitems, &bytesafter,
+                         (unsigned char **) &version)
+      == Success
+      && type != None)
+    return True;
+  return False;
+}
+
+
+
+static XErrorHandler old_ehandler = 0;
+static int
+BadWindow_ehandler (Display *dpy, XErrorEvent *error)
+{
+  if (error->error_code == BadWindow || error->error_code == BadDrawable)
+    return 0;
+  else if (!old_ehandler)
+    {
+      abort();
+      return 0;
+    }
+  else
+    return (*old_ehandler) (dpy, error);
+}
+
+
+/* XCopyArea seems not to work right on SGI O2s if you draw in SubwindowMode
+   on a window whose depth is not the maximal depth of the screen?  Or
+   something.  Anyway, things don't work unless we: use SubwindowMode for
+   the real root window (or a legitimate virtual root window); but do not
+   use SubwindowMode for the xscreensaver window.  I make no attempt to
+   explain.
+ */
+Bool
+use_subwindow_mode_p(Screen *screen, Window window)
+{
+  if (window != VirtualRootWindowOfScreen(screen))
+    return False;
+  else if (xscreensaver_window_p(DisplayOfScreen(screen), window))
+    return False;
+  else
+    return True;
+}
+
+
+/* Install the colormaps of all visible windows, deepest first.
+   This should leave the colormaps of the topmost windows installed
+   (if only N colormaps can be installed at a time, then only the
+   topmost N windows will be shown in the right colors.)
+ */
+static void
+install_screen_colormaps (Screen *screen)
+{
+  int i;
+  Display *dpy = DisplayOfScreen (screen);
+  Window vroot, real_root;
+  Window parent, *kids = 0;
+  unsigned int nkids = 0;
+
+  XSync (dpy, False);
+  old_ehandler = XSetErrorHandler (BadWindow_ehandler);
+
+  vroot = VirtualRootWindowOfScreen (screen);
+  if (XQueryTree (dpy, vroot, &real_root, &parent, &kids, &nkids))
+    for (i = 0; i < nkids; i++)
+      {
+       XWindowAttributes xgwa;
+       Window client;
+#ifdef HAVE_XMU
+       /* #### need to put XmuClientWindow() in xmu.c, sigh... */
+       if (! (client = XmuClientWindow (dpy, kids[i])))
+#endif
+         client = kids[i];
+       xgwa.colormap = 0;
+       XGetWindowAttributes (dpy, client, &xgwa);
+       if (xgwa.colormap && xgwa.map_state == IsViewable)
+         XInstallColormap (dpy, xgwa.colormap);
+      }
+  XInstallColormap (dpy, DefaultColormapOfScreen (screen));
+  XSync (dpy, False);
+  XSetErrorHandler (old_ehandler);
+  XSync (dpy, False);
+
+  if (kids)
+    XFree ((char *) kids);
+}
+
+
+static void
+grab_screen_image_1 (Screen *screen, Window window)
+{
+  Display *dpy = DisplayOfScreen (screen);
+  XWindowAttributes xgwa;
+  Window real_root = XRootWindowOfScreen (screen);  /* not vroot */
+  Bool root_p = (window == real_root);
+  Bool saver_p = xscreensaver_window_p (dpy, window);
+  Bool grab_mouse_p = False;
+  int unmap_time = 0;
+
+  if (saver_p)
+    /* I think this is redundant, but just to be safe... */
+    root_p = False;
+
+  if (saver_p)
+    /* The only time grabbing the mouse is important is if this program
+       is being run while the saver is locking the screen. */
+    grab_mouse_p = True;
+
+  if (!root_p)
+    {
+      double unmap = 0;
+      if (saver_p)
+       {
+         unmap = get_float_resource("grabRootDelay", "Seconds");
+         if (unmap <= 0.00001 || unmap > 20) unmap = 2.5;
+       }
+      else
+       {
+         unmap = get_float_resource("grabWindowDelay", "Seconds");
+         if (unmap <= 0.00001 || unmap > 20) unmap = 0.66;
+       }
+      unmap_time = unmap * 100000;
+    }
+
+#ifdef DEBUG
+  fprintf(stderr,
+         "\n%s: window 0x%08lX root: %d saver: %d grab: %d wait: %.1f\n",
+         progname, (unsigned long) window,
+         root_p, saver_p, grab_mouse_p, ((double)unmap_time)/1000000.0);
+  {
+    XWindowAttributes xgwa2;
+    XGetWindowAttributes (dpy, window, &xgwa2);
+    fprintf(stderr, "%s: ", progname);
+    describe_visual(stderr, screen, xgwa2.visual, ####);
+    fprintf (stderr, "\n");
+  }
+#endif /* DEBUG */
+
+  if (!root_p)
+    XSetWindowBackgroundPixmap (dpy, window, None);
+
+  if (grab_mouse_p)
+    {
+      /* prevent random viewer of the screen saver (locker) from messing
+        with windows.   We don't check whether it succeeded, because what
+        are our options, really... */
+      XGrabPointer (dpy, real_root, True, ButtonPressMask|ButtonReleaseMask,
+                   GrabModeAsync, GrabModeAsync, None, None, CurrentTime);
+      XGrabKeyboard (dpy, real_root, True, GrabModeSync, GrabModeAsync,
+                    CurrentTime);
+    }
+
+  if (unmap_time > 0)
+    {
+      XUnmapWindow (dpy, window);
+      install_screen_colormaps (screen);
+      XSync (dpy, True);
+      usleep(unmap_time); /* wait for everyone to swap in and handle exposes */
+    }
+
+  XGetWindowAttributes (dpy, window, &xgwa);
+
+  if (!root_p)
+    {
+#ifdef HAVE_READ_DISPLAY_EXTENSION
+      if (! read_display(screen, window, 0, saver_p))
+#endif /* HAVE_READ_DISPLAY_EXTENSION */
+       {
+#if defined(HAVE_READ_DISPLAY_EXTENSION) && defined(DEBUG)
+         fprintf(stderr, "%s: read_display() failed\n", progname);
+#endif /* DEBUG */
+         copy_default_colormap_contents (screen, xgwa.colormap, xgwa.visual);
+         raise_window(dpy, window, saver_p);
+       }
+    }
+  else  /* root_p */
+    {
+      Pixmap pixmap;
+      XWindowAttributes xgwa;
+      XGetWindowAttributes(dpy, window, &xgwa);
+      pixmap = XCreatePixmap(dpy, window, xgwa.width, xgwa.height, xgwa.depth);
+
+#ifdef HAVE_READ_DISPLAY_EXTENSION
+      if (! read_display(screen, window, pixmap, True))
+#endif
+       {
+         Window real_root = XRootWindowOfScreen (xgwa.screen); /* not vroot */
+         XGCValues gcv;
+         GC gc;
+
+#if defined(HAVE_READ_DISPLAY_EXTENSION) && defined(DEBUG)
+         fprintf(stderr, "%s: read_display() failed\n", progname);
+#endif /* DEBUG */
+
+         copy_default_colormap_contents (screen, xgwa.colormap, xgwa.visual);
+
+         gcv.function = GXcopy;
+         gcv.subwindow_mode = IncludeInferiors;
+         gc = XCreateGC (dpy, window, GCFunction | GCSubwindowMode, &gcv);
+         XCopyArea (dpy, real_root, pixmap, gc,
+                    xgwa.x, xgwa.y, xgwa.width, xgwa.height, 0, 0);
+         XFreeGC (dpy, gc);
+       }
+      XSetWindowBackgroundPixmap (dpy, window, pixmap);
+      XFreePixmap (dpy, pixmap);
+    }
+
+  if (grab_mouse_p)
+    {
+      XUngrabPointer (dpy, CurrentTime);
+      XUngrabKeyboard (dpy, CurrentTime);
+    }
+
+  XSync (dpy, True);
+}
+
+void
+grab_screen_image (Screen *screen, Window window)
+{
+#ifdef HAVE_SGI_VIDEO
+  char c, *s = get_string_resource("grabVideoProbability", "Float");
+  double prob = -1;
+  if (!s ||
+      (1 != sscanf (s, " %lf %c", &prob, &c)) ||
+      prob < 0 ||
+      prob > 1)
+    prob = 0.5;
+
+  if ((random() % 100) < ((int) (100 * prob)))
+    {
+      XWindowAttributes xgwa;
+      Display *dpy = DisplayOfScreen (screen);
+      XGetWindowAttributes (dpy, window, &xgwa);
+# ifdef DEBUG
+      fprintf(stderr, "%s: trying to grab from video...\n", progname);
+# endif /* DEBUG */
+      if (grab_video_frame (screen, xgwa.visual, window))
+       {
+         if (xgwa.depth < 24)
+           {
+             int class = visual_class (screen, xgwa.visual);
+             if (class == PseudoColor || class == DirectColor)
+               make_cubic_colormap (screen, window, xgwa.visual);
+           }
+         return;
+       }
+    }
+#endif /* HAVE_SGI_VIDEO */
+
+  grab_screen_image_1 (screen, window);
+}
+
+
+/* When we are grabbing and manipulating a screen image, it's important that
+   we use the same colormap it originally had.  So, if the screensaver was
+   started with -install, we need to copy the contents of the default colormap
+   into the screensaver's colormap.
+ */
+static void
+copy_default_colormap_contents (Screen *screen,
+                               Colormap to_cmap,
+                               Visual *to_visual)
+{
+  Display *dpy = DisplayOfScreen (screen);
+  Visual *from_visual = DefaultVisualOfScreen (screen);
+  Colormap from_cmap = XDefaultColormapOfScreen (screen);
+
+  XColor *old_colors, *new_colors;
+  unsigned long *pixels;
+  XVisualInfo vi_in, *vi_out;
+  int out_count;
+  int from_cells, to_cells, max_cells, got_cells;
+  int i;
+
+  if (from_cmap == to_cmap)
+    return;
+
+  vi_in.screen = XScreenNumberOfScreen (screen);
+  vi_in.visualid = XVisualIDFromVisual (from_visual);
+  vi_out = XGetVisualInfo (dpy, VisualScreenMask|VisualIDMask,
+                          &vi_in, &out_count);
+  if (! vi_out) abort ();
+  from_cells = vi_out [0].colormap_size;
+  XFree ((char *) vi_out);
+
+  vi_in.screen = XScreenNumberOfScreen (screen);
+  vi_in.visualid = XVisualIDFromVisual (to_visual);
+  vi_out = XGetVisualInfo (dpy, VisualScreenMask|VisualIDMask,
+                          &vi_in, &out_count);
+  if (! vi_out) abort ();
+  to_cells = vi_out [0].colormap_size;
+  XFree ((char *) vi_out);
+
+  max_cells = (from_cells > to_cells ? to_cells : from_cells);
+
+  old_colors = (XColor *) calloc (sizeof (XColor), max_cells);
+  new_colors = (XColor *) calloc (sizeof (XColor), max_cells);
+  pixels = (unsigned long *) calloc (sizeof (unsigned long), max_cells);
+  for (i = 0; i < max_cells; i++)
+    old_colors[i].pixel = i;
+  XQueryColors (dpy, from_cmap, old_colors, max_cells);
+
+  got_cells = max_cells;
+  allocate_writable_colors (dpy, to_cmap, pixels, &got_cells);
+
+#ifdef DEBUG
+  if (got_cells != max_cells)
+    fprintf(stderr, "%s: got only %d of %d cells\n", progname,
+           got_cells, max_cells);
+#endif /* DEBUG */
+
+  if (got_cells <= 0)                                   /* we're screwed */
+    ;
+  else if (got_cells == max_cells &&                    /* we're golden */
+          from_cells == to_cells)
+    XStoreColors (dpy, to_cmap, old_colors, got_cells);
+  else                                                  /* try to cope... */
+    {
+      for (i = 0; i < got_cells; i++)
+       {
+         XColor *c = old_colors + i;
+         int j;
+         for (j = 0; j < got_cells; j++)
+           if (pixels[j] == c->pixel)
+             {
+               /* only store this color value if this is one of the pixels
+                  we were able to allocate. */
+               XStoreColors (dpy, to_cmap, c, 1);
+               break;
+             }
+       }
+    }
+
+
+#ifdef DEBUG
+  fprintf(stderr, "%s: installing copy of default colormap\n", progname);
+#endif /* DEBUG */
+
+  free (old_colors);
+  free (new_colors);
+  free (pixels);
+}
+
+
+\f
+/* The SGI ReadDisplay extension.
+   This extension lets you get back a 24-bit image of the screen, taking into
+   account the colors with which all windows are *currently* displayed, even
+   if those windows have different visuals.  Without this extension, presence
+   of windows with different visuals or colormaps will result in technicolor
+   when one tries to grab the screen image.
+ */
+
+#ifdef HAVE_READ_DISPLAY_EXTENSION
+
+static Bool
+read_display (Screen *screen, Window window, Pixmap into_pixmap,
+             Bool dont_wait)
+{
+  Display *dpy = DisplayOfScreen (screen);
+  XWindowAttributes xgwa;
+  int rd_event_base = 0;
+  int rd_error_base = 0;
+  unsigned long hints = 0;
+  XImage *image = 0;
+  XGCValues gcv;
+  int class;
+  GC gc;
+  Bool install_p = False;
+
+  /* Check to see if the server supports the extension, and bug out if not.
+   */
+  if (! XReadDisplayQueryExtension (dpy, &rd_event_base, &rd_error_base))
+    return False;
+
+  /* If this isn't a visual we know how to handle, bug out.  We handle:
+      = TrueColor in depths 8, 12, 16, and 32;
+      = PseudoColor and DirectColor in depths 8 and 12.
+   */
+  XGetWindowAttributes(dpy, window, &xgwa);
+  class = visual_class (screen, xgwa.visual);
+  if (class == TrueColor)
+    {
+      if (xgwa.depth != 8  && xgwa.depth != 12 && xgwa.depth != 16 &&
+         xgwa.depth != 24 && xgwa.depth != 32)
+       return False;
+    }
+  else if (class == PseudoColor || class == DirectColor)
+    {
+      if (xgwa.depth != 8 && xgwa.depth != 12)
+       return False;
+      else
+       /* Install a colormap that makes this visual behave like
+          a TrueColor visual of the same depth. */
+       install_p = True;
+    }
+
+
+  /* Try and read the screen.
+   */
+  hints = (XRD_TRANSPARENT | XRD_READ_POINTER);
+  image = XReadDisplay (dpy, window, xgwa.x, xgwa.y, xgwa.width, xgwa.height,
+                       hints, &hints);
+  if (!image)
+    return False;
+  if (!image->data)
+    {
+      XDestroyImage(image);
+      return False;
+    }
+
+  /* XReadDisplay tends to LIE about the depth of the image it read.
+     It is returning an XImage which has `depth' and `bits_per_pixel'
+     confused!
+
+     That is, on a 24-bit display, where all visuals claim depth 24, and
+     where XGetImage would return an XImage with depth 24, and where
+     XPutImage will get a BadMatch with images that are not depth 24,
+     XReadDisplay is returning images with depth 32!  Fuckwits!
+
+     So if the visual is of depth 24, but the image came back as depth 32,
+     hack it to be 24 lest we get a BadMatch from XPutImage.
+
+     I wonder what happens on an 8-bit SGI...  Probably it still returns
+     an image claiming depth 32?  Certainly it can't be 8.  So, let's just
+     smash it to 32...
+   */
+  if (image->depth == 32 /* && xgwa.depth == 24 */ )
+    image->depth = 24;
+
+  /* If the visual of the window/pixmap into which we're going to draw is
+     less deep than the screen itself, then we need to convert the grabbed bits
+     to match the depth by clipping off the less significant bit-planes of each
+     color component.
+   */
+  if (image->depth > xgwa.depth)
+    {
+      int x, y;
+      /* We use the same image->data in both images -- that's ok, because
+        since we're reading from B and writing to A, and B uses more bytes
+        per pixel than A, the write pointer won't overrun the read pointer.
+       */
+      XImage *image2 = XCreateImage (dpy, xgwa.visual, xgwa.depth,
+                                    ZPixmap, 0, image->data,
+                                    xgwa.width, xgwa.height,
+                                    8, 0);
+      if (!image2)
+       return False;
+
+#ifdef DEBUG
+      fprintf(stderr, "%s: converting from depth %d to depth %d\n",
+             progname, image->depth, xgwa.depth);
+#endif /* DEBUG */
+
+      for (y = 0; y < image->height; y++)
+       for (x = 0; x < image->width; x++)
+         {
+           /* #### really these shift values should be determined from the
+              mask values -- but that's a pain in the ass, and anyway,
+              this is an SGI-specific extension so hardcoding assumptions
+              about the SGI server's behavior isn't *too* heinous... */
+           unsigned long pixel = XGetPixel(image, x, y);
+           unsigned int r = (pixel & image->red_mask);
+           unsigned int g = (pixel & image->green_mask) >> 8;
+           unsigned int b = (pixel & image->blue_mask) >> 16;
+
+           if (xgwa.depth == 8)
+             pixel = ((r >> 5) | ((g >> 5) << 3) | ((b >> 6) << 6));
+           else if (xgwa.depth == 12)
+             pixel = ((r >> 4) | ((g >> 4) << 4) | ((b >> 4) << 8));
+           else if (xgwa.depth == 16)
+             pixel = ((r >> 3) | ((g >> 3) << 5) | ((b >> 3) << 10));
+           else
+             abort();
+
+           XPutPixel(image2, x, y, pixel);
+         }
+      image->data = 0;
+      XDestroyImage(image);
+      image = image2;
+    }
+
+
+  /* Now actually put the bits into the window or pixmap -- note the design
+     bogosity of this extension, where we've been forced to take 24 bit data
+     from the server to the client, and then push it back from the client to
+     the server, *without alteration*.  We should have just been able to tell
+     the server, "put a screen image in this drawable", instead of having to
+     go through the intermediate step of converting it to an Image.  Geez.
+     (Assuming that the window is of screen depth; we happen to handle less
+     deep windows, but that's beside the point.)
+   */
+  gcv.function = GXcopy;
+  gc = XCreateGC (dpy, window, GCFunction, &gcv);
+
+  if (into_pixmap)
+    {
+      gcv.function = GXcopy;
+      gc = XCreateGC (dpy, into_pixmap, GCFunction, &gcv);
+      XPutImage (dpy, into_pixmap, gc, image, 0, 0, 0, 0,
+                xgwa.width, xgwa.height);
+    }
+  else
+    {
+      gcv.function = GXcopy;
+      gc = XCreateGC (dpy, window, GCFunction, &gcv);
+
+      /* Ok, now we'll be needing that window on the screen... */
+      raise_window(dpy, window, dont_wait);
+
+      /* Plop down the bits... */
+      XPutImage (dpy, window, gc, image, 0, 0, 0, 0, xgwa.width, xgwa.height);
+    }
+  XFreeGC (dpy, gc);
+
+  if (image->data)
+    {
+      free(image->data);
+      image->data = 0;
+    }
+  XDestroyImage(image);
+
+  if (install_p)
+    make_cubic_colormap (screen, window, xgwa.visual);
+
+  return True;
+}
+#endif /* HAVE_READ_DISPLAY_EXTENSION */
+
+
+#if defined(HAVE_READ_DISPLAY_EXTENSION) || defined(HAVE_SGI_VIDEO)
+
+/* Makes and installs a colormap that makes a PseudoColor or DirectColor
+   visual behave like a TrueColor visual of the same depth.
+ */
+static void
+make_cubic_colormap (Screen *screen, Window window, Visual *visual)
+{
+  Display *dpy = DisplayOfScreen (screen);
+  Colormap cmap = XCreateColormap(dpy, window, visual, AllocAll);
+  int nr, ng, nb, cells;
+  int r, g, b;
+  int depth;
+  XColor colors[4097];
+  int i;
+
+  depth = visual_depth(screen, visual);
+  switch (depth)
+    {
+    case 8:  nr = 3; ng = 3; nb = 2; cells = 256;  break;
+    case 12: nr = 4; ng = 4; nb = 4; cells = 4096; break;
+    default: abort(); break;
+    }
+
+  memset(colors, 0, sizeof(colors));
+  for (i = 0; i < cells; i++)
+    {
+      colors[i].flags = DoRed|DoGreen|DoBlue;
+      colors[i].red = colors[i].green = colors[i].blue = 0;
+    }
+
+  for (r = 0; r < (1 << nr); r++)
+    for (g = 0; g < (1 << ng); g++)
+      for (b = 0; b < (1 << nb); b++)
+       {
+         i = (r | (g << nr) | (b << (nr + ng)));
+         colors[i].pixel = i;
+         if (depth == 8)
+           {
+             colors[i].red   = ((r << 13) | (r << 10) | (r << 7) |
+                                (r <<  4) | (r <<  1));
+             colors[i].green = ((g << 13) | (g << 10) | (g << 7) |
+                                (g <<  4) | (g <<  1));
+             colors[i].blue  = ((b << 14) | (b << 12) | (b << 10) |
+                                (b <<  8) | (b <<  6) | (b <<  4) |
+                                (b <<  2) | b);
+           }
+         else
+           {
+             colors[i].red   = (r << 12) | (r << 8) | (r << 4) | r;
+             colors[i].green = (g << 12) | (g << 8) | (g << 4) | g;
+             colors[i].blue  = (b << 12) | (b << 8) | (b << 4) | b;
+           }
+       }
+
+#ifdef DEBUG
+  fprintf(stderr, "%s: installing cubic colormap\n", progname);
+#endif /* DEBUG */
+
+  XStoreColors (dpy, cmap, colors, cells);
+  XSetWindowColormap (dpy, window, cmap);
+
+  /* Gag, install the colormap.
+     This is definitely right in the `if xscreensaver_window_p' case, since
+     it will never get installed otherwise.  But, if we don't do it
+     unconditionally, then the new colormap won't get installed until the
+     window (re-)gains focus.  It's generally very antisocial to install
+     the colormap of a non-OverrideRedirect window (that task belongs to
+     the WM) and if we were being kosher, we would only install this cmap
+     if the old cmap was already installed (or perhaps, if the window had
+     focus.)  But, since this extension only exists on SGIs, and since SGIs
+     can handle four colormaps at once, let's go ahead and install it all
+     the time, so that even if the window pops up and has never had focus,
+     it will still display in the proper colors.
+   */
+  XInstallColormap (dpy, cmap);
+}
+
+#endif /* HAVE_READ_DISPLAY_EXTENSION || HAVE_SGI_VIDEO */
diff --git a/utils/grabscreen.h b/utils/grabscreen.h
new file mode 100644 (file)
index 0000000..6d2503a
--- /dev/null
@@ -0,0 +1,27 @@
+/* xscreensaver, Copyright (c) 1992, 1993, 1994, 1997
+ *  Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software 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.  No representations are made about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or 
+ * implied warranty.
+ */
+
+#ifndef __GRABSCREEN_H__
+#define __GRABSCREEN_H__
+
+/* This will write a snapshot of the screen image into the given window.
+   Beware that the colormap of the window may also be changed (to match
+   the bits that were drawn.)
+ */
+extern void grab_screen_image (Screen *, Window);
+
+/* Whether one should use GCSubwindowMode when drawing on this window
+   (assuming a screen image has been grabbed onto it.)  Yes, this is a
+   total kludge. */
+extern Bool use_subwindow_mode_p(Screen *screen, Window window);
+
+#endif /* __GRABSCREEN_H__ */
diff --git a/utils/hsv.c b/utils/hsv.c
new file mode 100644 (file)
index 0000000..cf1cc8d
--- /dev/null
@@ -0,0 +1,81 @@
+/* xscreensaver, Copyright (c) 1992, 1997 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software 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.  No representations are made about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or 
+ * implied warranty.
+ */
+
+/* This file contains some utility routines for randomly picking the colors
+   to hack the screen with.
+ */
+
+#include "utils.h"
+#include "hsv.h"
+
+void
+hsv_to_rgb (int h, double s, double v,
+           unsigned short *r, unsigned short *g, unsigned short *b)
+{
+  double H, S, V, R, G, B;
+  double p1, p2, p3;
+  double f;
+  int i;
+
+  if (s < 0) s = 0;
+  if (v < 0) v = 0;
+  if (s > 1) s = 1;
+  if (v > 1) v = 1;
+
+  S = s; V = v;
+  H = (h % 360) / 60.0;
+  i = H;
+  f = H - i;
+  p1 = V * (1 - S);
+  p2 = V * (1 - (S * f));
+  p3 = V * (1 - (S * (1 - f)));
+  if     (i == 0) { R = V;  G = p3; B = p1; }
+  else if (i == 1) { R = p2; G = V;  B = p1; }
+  else if (i == 2) { R = p1; G = V;  B = p3; }
+  else if (i == 3) { R = p1; G = p2; B = V;  }
+  else if (i == 4) { R = p3; G = p1; B = V;  }
+  else            { R = V;  G = p1; B = p2; }
+  *r = R * 65535;
+  *g = G * 65535;
+  *b = B * 65535;
+}
+
+void
+rgb_to_hsv (unsigned short r, unsigned short g, unsigned short b,
+           int *h, double *s, double *v)
+{
+  double R, G, B, H, S, V;
+  double cmax, cmin;
+  double cmm;
+  int imax;
+  R = ((double) r) / 65535.0;
+  G = ((double) g) / 65535.0;
+  B = ((double) b) / 65535.0;
+  cmax = R; cmin = G; imax = 1;
+  if  ( cmax < G ) { cmax = G; cmin = R; imax = 2; }
+  if  ( cmax < B ) { cmax = B; imax = 3; }
+  if  ( cmin > B ) { cmin = B; }
+  cmm = cmax - cmin;
+  V = cmax;
+  if (cmm == 0)
+    S = H = 0;
+  else
+    {
+      S = cmm / cmax;
+      if       (imax == 1)    H =       (G - B) / cmm;
+      else  if (imax == 2)    H = 2.0 + (B - R) / cmm;
+      else /*if (imax == 3)*/ H = 4.0 + (R - G) / cmm;
+      if (H < 0) H += 6.0;
+    }
+  *h = (H * 60.0);
+  *s = S;
+  *v = V;
+}
diff --git a/utils/hsv.h b/utils/hsv.h
new file mode 100644 (file)
index 0000000..e0fdfb0
--- /dev/null
@@ -0,0 +1,27 @@
+/* xscreensaver, Copyright (c) 1992, 1997 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software 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.  No representations are made about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or 
+ * implied warranty.
+ */
+
+#ifndef __HSV_H__
+#define __HSV_H__
+
+/* Converts between RGB and HSV color spaces.
+   R, G, and B are in the range 0 - 65535;
+   H is in the range 0 - 360;
+   S and V are in the range 0.0 - 1.0.
+ */
+extern void hsv_to_rgb (int h, double s, double v,
+                       unsigned short *r,
+                       unsigned short *g,
+                       unsigned short *b);
+extern void rgb_to_hsv (unsigned short r, unsigned short g, unsigned short b,
+                       int *h, double *s, double *v);
+
+#endif /* __HSV_H__ */
diff --git a/utils/overlay.c b/utils/overlay.c
new file mode 100644 (file)
index 0000000..7277fd0
--- /dev/null
@@ -0,0 +1,133 @@
+/* xscreensaver, Copyright (c) 1997 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software 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.  No representations are made about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or 
+ * implied warranty.
+ */
+
+/* If the server's root window contains a SERVER_OVERLAY_VISUALS property,
+   then that identifies the visuals which correspond to the video hardware's
+   overlay planes.  Windows created in these kinds of visuals have the
+   property that one particular pixel value is transparent.
+
+   On my Indy, there are two transparent visuals, one of which is at layer 1,
+   and one of which is at layer 2.  This is apparently the ordering in which
+   they are overlayed (1 being topmost.)  The other difference between them
+   is that the topmost one only has 2 planes, while the next one has 8.
+
+   Rumor has it that SGI, HP, DEC, and IBM all use the same mechanism.
+   Does Sun?
+
+   This code selects the topmost one, regardless of depth.  Maybe that's not
+   the right thing.  Well, in XScreenSaver, we only need to allocate two
+   colors from it (it's only used to display the stderr output, so that the
+   text can overlay the graphics without being obliterated by it.)
+
+   Documentation, such as it is, on SERVER_OVERLAY_VISUALS found on the web:
+
+     http://www.hp.com/xwindow/sharedInfo/Whitepapers/Visuals/server_overlay_visuals.html
+    http://www.xig.com/Pages/Ed-Overlays.html
+
+ */
+
+
+#include "utils.h"
+
+#include <X11/Xutil.h>
+#include <X11/Xproto.h>
+
+#include "visual.h"
+
+
+struct overlay_data
+{
+  CARD32 visual_id;
+  CARD32 transparency; /* 0: none; 1: pixel; 2: mask (?) */
+  CARD32 value;                /* the transparent pixel */
+  CARD32 layer;                /* -1: underlay; 0: normal; 1: popup; 2: overlay */
+};
+
+static int
+get_overlay_prop (Screen *screen, struct overlay_data **data_ret)
+{
+  int result;
+  Atom actual_type;
+  int actual_format;
+  unsigned long nitems, bytes_after;
+  struct overlay_data *data = 0;
+  Display *dpy = DisplayOfScreen(screen);
+  Window window = RootWindowOfScreen(screen);
+  Atom XA_SERVER_OVERLAY_VISUALS =
+    XInternAtom (dpy, "SERVER_OVERLAY_VISUALS", False);
+
+  *data_ret = 0;
+  result = XGetWindowProperty (dpy, window, XA_SERVER_OVERLAY_VISUALS,
+                              0, (65536 / sizeof (long)), False, 
+                              XA_SERVER_OVERLAY_VISUALS,
+                              &actual_type, &actual_format,
+                              &nitems, &bytes_after,
+                              (unsigned char **) &data);
+  if (result != Success ||
+      actual_type != XA_SERVER_OVERLAY_VISUALS ||
+      actual_format != 32 ||
+      nitems < 1)
+    {
+      if (data) XFree(data);
+      return 0;
+    }
+  else
+    {
+      *data_ret = data;
+      return nitems / (sizeof(*data) / sizeof(CARD32));
+    }
+}
+
+
+Visual *
+get_overlay_visual (Screen *screen, unsigned long *transparent_pixel_ret)
+{
+  struct overlay_data *data = 0;
+  int n_visuals = get_overlay_prop (screen, &data);
+  Visual *visual = 0;
+  int depth = 0;
+  unsigned long pixel = 0;
+  unsigned int layer = 0;
+  int i;
+
+  if (data)
+    for (i = 0; i < n_visuals; i++)
+
+      /* Only accept ones that have a transparent pixel. */
+      if (data[i].transparency == 1)
+       {
+         XVisualInfo vi_in, *vi_out;
+         int out_count;
+         vi_in.visualid = data[i].visual_id;
+         vi_out = XGetVisualInfo (DisplayOfScreen(screen), VisualIDMask,
+                                  &vi_in, &out_count);
+         if (vi_out)
+           {
+             /* Prefer the one at the topmost layer; after that, prefer
+                the one with the greatest depth (most colors.) */
+             if (layer < data[i].layer ||
+                 (layer == data[i].layer &&
+                  depth < vi_out[0].depth))
+               {
+                 visual = vi_out[0].visual;
+                 depth  = vi_out[0].depth;
+                 layer  = data[i].layer;
+                 pixel  = data[i].value;
+               }
+             XFree(vi_out);
+           }
+       }
+
+  if (data) XFree(data);
+  if (visual && transparent_pixel_ret)
+    *transparent_pixel_ret = pixel;
+  return visual;
+}
diff --git a/utils/resources.c b/utils/resources.c
new file mode 100644 (file)
index 0000000..5bcd2c2
--- /dev/null
@@ -0,0 +1,231 @@
+/* xscreensaver, Copyright (c) 1992, 1997, 1998
+ *  Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software 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.  No representations are made about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or 
+ * implied warranty.
+ */
+
+#include "utils.h"
+#include "resources.h"
+#include <X11/Xresource.h>
+
+
+/* Resource functions.  Assumes: */
+
+extern char *progname;
+extern char *progclass;
+extern XrmDatabase db;
+
+static unsigned int get_time_resource (char *res_name, char *res_class,
+                                      Bool sec_p);
+
+#ifndef isupper
+# define isupper(c)  ((c) >= 'A' && (c) <= 'Z')
+#endif
+#ifndef _tolower
+# define _tolower(c)  ((c) - 'A' + 'a')
+#endif
+
+char *
+get_string_resource (char *res_name, char *res_class)
+{
+  XrmValue value;
+  char *type;
+  char full_name [1024], full_class [1024];
+  strcpy (full_name, progname);
+  strcat (full_name, ".");
+  strcat (full_name, res_name);
+  strcpy (full_class, progclass);
+  strcat (full_class, ".");
+  strcat (full_class, res_class);
+  if (XrmGetResource (db, full_name, full_class, &type, &value))
+    {
+      char *str = (char *) malloc (value.size + 1);
+      strncpy (str, (char *) value.addr, value.size);
+      str [value.size] = 0;
+      return str;
+    }
+  return 0;
+}
+
+Bool 
+get_boolean_resource (char *res_name, char *res_class)
+{
+  char *tmp, buf [100];
+  char *s = get_string_resource (res_name, res_class);
+  char *os = s;
+  if (! s) return 0;
+  for (tmp = buf; *s; s++)
+    *tmp++ = isupper (*s) ? _tolower (*s) : *s;
+  *tmp = 0;
+  free (os);
+
+  while (*buf &&
+        (buf[strlen(buf)-1] == ' ' ||
+         buf[strlen(buf)-1] == '\t'))
+    buf[strlen(buf)-1] = 0;
+
+  if (!strcmp (buf, "on") || !strcmp (buf, "true") || !strcmp (buf, "yes"))
+    return 1;
+  if (!strcmp (buf,"off") || !strcmp (buf, "false") || !strcmp (buf,"no"))
+    return 0;
+  fprintf (stderr, "%s: %s must be boolean, not %s.\n",
+          progname, res_name, buf);
+  return 0;
+}
+
+int 
+get_integer_resource (char *res_name, char *res_class)
+{
+  int val;
+  char c, *s = get_string_resource (res_name, res_class);
+  char *ss = s;
+  if (!s) return 0;
+
+  while (*ss && *ss <= ' ') ss++;                      /* skip whitespace */
+
+  if (ss[0] == '0' && (ss[1] == 'x' || ss[1] == 'X'))  /* 0x: parse as hex */
+    {
+      if (1 == sscanf (ss+2, "%x %c", &val, &c))
+       {
+         free (s);
+         return val;
+       }
+    }
+  else                                                 /* else parse as dec */
+    {
+      if (1 == sscanf (ss, "%d %c", &val, &c))
+       {
+         free (s);
+         return val;
+       }
+    }
+
+  fprintf (stderr, "%s: %s must be an integer, not %s.\n",
+          progname, res_name, s);
+  free (s);
+  return 0;
+}
+
+double
+get_float_resource (char *res_name, char *res_class)
+{
+  double val;
+  char c, *s = get_string_resource (res_name, res_class);
+  if (! s) return 0.0;
+  if (1 == sscanf (s, " %lf %c", &val, &c))
+    {
+      free (s);
+      return val;
+    }
+  fprintf (stderr, "%s: %s must be a float, not %s.\n",
+          progname, res_name, s);
+  free (s);
+  return 0.0;
+}
+
+
+unsigned int
+get_pixel_resource (char *res_name, char *res_class,
+                   Display *dpy, Colormap cmap)
+{
+  XColor color;
+  char *s = get_string_resource (res_name, res_class);
+  char *s2;
+  if (!s) goto DEFAULT;
+
+  for (s2 = s + strlen(s) - 1; s2 > s; s2--)
+    if (*s2 == ' ' || *s2 == '\t')
+      *s2 = 0;
+    else
+      break;
+
+  if (! XParseColor (dpy, cmap, s, &color))
+    {
+      fprintf (stderr, "%s: can't parse color %s\n", progname, s);
+      goto DEFAULT;
+    }
+  if (! XAllocColor (dpy, cmap, &color))
+    {
+      fprintf (stderr, "%s: couldn't allocate color %s\n", progname, s);
+      goto DEFAULT;
+    }
+  free (s);
+  return color.pixel;
+ DEFAULT:
+  if (s) free (s);
+  return ((strlen(res_class) >= 10 &&
+          !strcmp ("Background", res_class + strlen(res_class) - 10))
+         ? BlackPixel (dpy, DefaultScreen (dpy))
+         : WhitePixel (dpy, DefaultScreen (dpy)));
+}
+
+
+int
+parse_time (char *string, Bool seconds_default_p, Bool silent_p)
+{
+  unsigned int h, m, s;
+  char c;
+  if (3 == sscanf (string,   " %u : %2u : %2u %c", &h, &m, &s, &c))
+    ;
+  else if (2 == sscanf (string, " : %2u : %2u %c", &m, &s, &c) ||
+          2 == sscanf (string,    " %u : %2u %c", &m, &s, &c))
+    h = 0;
+  else if (1 == sscanf (string,       " : %2u %c", &s, &c))
+    h = m = 0;
+  else if (1 == sscanf (string,          " %u %c",
+                       (seconds_default_p ? &s : &m), &c))
+    {
+      h = 0;
+      if (seconds_default_p) m = 0;
+      else s = 0;
+    }
+  else
+    {
+      if (! silent_p)
+       fprintf (stderr, "%s: invalid time interval specification \"%s\".\n",
+                progname, string);
+      return -1;
+    }
+  if (s >= 60 && (h != 0 || m != 0))
+    {
+      if (! silent_p)
+       fprintf (stderr, "%s: seconds > 59 in \"%s\".\n", progname, string);
+      return -1;
+    }
+  if (m >= 60 && h > 0)
+    {
+      if (! silent_p)
+       fprintf (stderr, "%s: minutes > 59 in \"%s\".\n", progname, string);
+      return -1;
+    }
+  return ((h * 60 * 60) + (m * 60) + s);
+}
+
+static unsigned int 
+get_time_resource (char *res_name, char *res_class, Bool sec_p)
+{
+  int val;
+  char *s = get_string_resource (res_name, res_class);
+  if (!s) return 0;
+  val = parse_time (s, sec_p, False);
+  free (s);
+  return (val < 0 ? 0 : val);
+}
+
+unsigned int 
+get_seconds_resource (char *res_name, char *res_class)
+{
+  return get_time_resource (res_name, res_class, True);
+}
+
+unsigned int 
+get_minutes_resource (char *res_name, char *res_class)
+{
+  return get_time_resource (res_name, res_class, False);
+}
diff --git a/utils/resources.h b/utils/resources.h
new file mode 100644 (file)
index 0000000..14ce1ac
--- /dev/null
@@ -0,0 +1,24 @@
+/* xscreensaver, Copyright (c) 1992, 1997 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software 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.  No representations are made about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or 
+ * implied warranty.
+ */
+
+#ifndef __XSCREENSAVER_RESOURCES_H__
+#define __XSCREENSAVER_RESOURCES_H__
+
+extern char *get_string_resource (char*,char*);
+extern Bool get_boolean_resource (char*,char*);
+extern int get_integer_resource (char*,char*);
+extern double get_float_resource (char*,char*);
+extern unsigned int get_pixel_resource (char*,char*,Display*,Colormap);
+extern unsigned int get_minutes_resource (char*,char*);
+extern unsigned int get_seconds_resource (char*,char*);
+extern int parse_time (char *string, Bool seconds_default_p, Bool silent_p);
+
+#endif /* __XSCREENSAVER_RESOURCES_H__ */
diff --git a/utils/sgivideo.c b/utils/sgivideo.c
new file mode 100644 (file)
index 0000000..9fc0b78
--- /dev/null
@@ -0,0 +1,502 @@
+/* xscreensaver, Copyright (c) 1997, 1998 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software 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.  No representations are made about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or 
+ * implied warranty.
+ */
+
+/* This file contains code for grabbing a frame from one of the video inputs
+   on an SGI.  It returns it on a Drawable where it can be hacked at will.
+   This code checks all available video devices for the first one with a
+   non-blank signal.
+
+   It checks the deviced whose number comes from the `videoDevice' resource
+   first, then the default video device, then all the devices in order.
+
+   The intensity of the video signal is increased by the value of the
+   `videoGain' resource (a float) defaulting to 2.2, since NTSC video tends
+   to appear kind of dim on computer screens.
+
+   The video image is expanded to fit the window (while preserving the aspect
+   ratio.)  This is done by simply replicating pixels, not dithering.  That
+   turns out to look good enough most of the time.
+
+   If the target window is not TrueColor, the grabbed image will be quantized
+   to fit.  This also is done without dithering, but in this case, dithering
+   would help a lot, because it looks like crap.  So use TrueColor if you care.
+ */
+
+#include "utils.h"
+#include "sgivideo.h"
+#include "resources.h"
+#include "visual.h"
+
+#ifdef HAVE_SGI_VIDEO  /* whole file */
+
+#include "usleep.h"
+
+#include <X11/Xutil.h>
+
+#ifdef DEBUG
+extern char *progname;
+#endif /* DEBUG */
+
+
+# include <dmedia/vl.h>
+
+static Bool dark_image_p(unsigned long *image, int width, int height);
+static Bool install_video_frame(unsigned long *image, int width, int height,
+                               Screen *screen, Visual *visual, Drawable dest);
+
+#ifdef DEBUG
+static void
+describe_input(const char *prefix, VLServer server, int camera)
+{
+  VLDevList dl;
+  int i, j;
+
+  if (camera == VL_ANY)
+    {
+      printf("%s: %s VL_ANY\n", progname, prefix);
+      return;
+    }
+
+  vlGetDeviceList(server, &dl);
+  for (i = 0; i < dl.numDevices; i++)
+    {
+      VLDevice *d = &dl.devices[i];
+      for (j = 0; j < d->numNodes; j++)
+       if (d->nodes[j].number == camera)
+         {
+           printf("%s: %s %d, \"%s\"\n", progname, prefix,
+                  d->nodes[j].number,
+                  d->nodes[j].name);
+           return;
+         }
+    }
+
+  /* else... */
+  printf("%s: %s %d (???)\n", progname, prefix, camera);
+}
+#endif /* DEBUG */
+
+
+static Bool
+grab_frame_1(Screen *screen, Visual *visual, Drawable dest, int camera)
+{
+  Bool status = False;
+  int width = 0;
+  int height = 0;
+  VLServer server = 0;
+  VLNode input = -1;
+  VLNode output = -1;
+  VLPath path = 0;
+  VLBuffer buffer = 0;
+  VLControlValue ctl;
+  VLInfoPtr info;
+  VLTransferDescriptor trans;
+  unsigned long *image = 0;
+
+  server = vlOpenVideo (NULL);
+  if (!server)
+    {
+#ifdef DEBUG
+      fprintf (stderr, "%s: unable to open video server\n", progname);
+#endif /* DEBUG */
+      goto DONE;
+    }
+
+#ifdef DEBUG
+  describe_input("trying device", server, camera);
+#endif /* DEBUG */
+
+  input  = vlGetNode (server, VL_SRC, VL_VIDEO, camera);
+  output = vlGetNode (server, VL_DRN, VL_MEM, VL_ANY);
+
+  if (input == -1 || output == -1)
+    {
+#ifdef DEBUG
+      fprintf (stderr, "%s: unable to get video I/O nodes: %d\n",
+              progname, vlErrno);
+#endif /* DEBUG */
+      goto DONE;
+    }
+
+  path = vlCreatePath (server, VL_ANY, input, output);
+  if (path == -1)
+    {
+#ifdef DEBUG
+      fprintf (stderr, "%s: unable to get video path: %d\n",
+              progname, vlErrno);
+#endif /* DEBUG */
+      goto DONE;
+    }
+
+  if (vlSetupPaths (server, (VLPathList) &path, 1, VL_SHARE, VL_SHARE) == -1)
+    {
+#ifdef DEBUG
+      fprintf (stderr, "%s: unable to set up video path: %d\n",
+              progname, vlErrno);
+#endif /* DEBUG */
+      goto DONE;
+    }
+
+  ctl.intVal = VL_CAPTURE_INTERLEAVED;
+  if (vlSetControl (server, path, output, VL_CAP_TYPE, &ctl) == -1)
+    {
+#ifdef DEBUG
+      fprintf (stderr,
+              "%s: unable to set video capture type to interleaved: %d\n",
+              progname, vlErrno);
+#endif /* DEBUG */
+      goto DONE;
+    }
+
+  ctl.intVal = VL_PACKING_RGBA_8;
+  if (vlSetControl (server, path, output, VL_PACKING, &ctl) == -1)
+    {
+#ifdef DEBUG
+      fprintf (stderr, "%s: unable to set video packing to RGB8: %d\n",
+              progname, vlErrno);
+#endif /* DEBUG */
+      goto DONE;
+    }
+
+  buffer = vlCreateBuffer (server, path, output, 3);
+  if (!buffer)
+    {
+#ifdef DEBUG
+      fprintf (stderr, "%s: unable to create video buffer: %d\n",
+              progname, vlErrno);
+#endif /* DEBUG */
+      goto DONE;
+    }
+
+  vlRegisterBuffer (server, path, output, buffer);
+
+  memset(&trans, 0, sizeof(trans));
+  trans.trigger = VLTriggerImmediate;
+  trans.mode = VL_TRANSFER_MODE_DISCRETE;
+  trans.delay = 0;
+  trans.count = 1;
+  if (vlBeginTransfer (server, path, 1, &trans) == -1)
+    {
+#ifdef DEBUG
+      fprintf (stderr, "%s: unable to begin video transfer: %d\n",
+              progname, vlErrno);
+#endif /* DEBUG */
+      goto DONE;
+    }
+    
+  
+  /* try to get a frame; don't try more than a zillion times.
+     I strongly suspect this isn't the best way to do this...
+   */
+  {
+    int i;
+    for (i = 0; i < 1000; i++)
+      {
+       info = vlGetLatestValid (server, buffer);
+       if (info) break;
+       usleep(10000);  /* 1/100th second (a bit more than half a field) */
+      }
+  }
+
+  if (!info)
+    {
+#ifdef DEBUG
+      fprintf (stderr, "%s: unable to get video info: %d\n",
+              progname, vlErrno);
+#endif /* DEBUG */
+      goto DONE;
+    }
+
+  image = vlGetActiveRegion (server, buffer, info);
+  if (!image)
+    {
+#ifdef DEBUG
+      fprintf (stderr, "%s: unable to grab video frame: %d\n",
+              progname, vlErrno);
+#endif /* DEBUG */
+      goto DONE;
+    }
+
+  if (vlGetControl (server, path, input, VL_SIZE, &ctl) != -1)
+    {
+      width  = ctl.xyVal.x;
+      height = ctl.xyVal.y;
+    }
+  else
+    {
+#ifdef DEBUG
+      fprintf (stderr, "%s: unable to get video image size: %d\n",
+              progname, vlErrno);
+#endif /* DEBUG */
+      goto DONE;
+    }
+
+#ifdef DEBUG
+  describe_input("read device", server, camera);
+#endif /* DEBUG */
+
+  if (dark_image_p(image, width, height))
+    goto DONE;
+
+  status = install_video_frame(image, width, height, screen, visual, dest);
+
+ DONE:
+
+  /* I think `image' is freed as a result of destroying buffer. */
+
+  if (buffer)
+    vlDestroyBuffer(server, buffer);
+  if (path)
+    vlDestroyPath(server, path);
+  if (server)
+    vlCloseVideo (server);
+
+  return status;
+}
+
+
+static Bool
+dark_image_p(unsigned long *image, int width, int height)
+{
+  double max = 0.02;
+  double total = 0.0;
+  int i;
+  int pixels = (width * height);
+#ifdef DEBUG
+  int mr = 0, mg = 0, mb = 0;
+#endif /* DEBUG */
+  for (i = pixels-1; i >= 0; i--)
+    {
+      unsigned long pixel = image[i];
+      unsigned int r = (pixel & 0x0000FF);
+      unsigned int g = (pixel & 0x00FF00) >> 8;
+      unsigned int b = (pixel & 0xFF0000) >> 16;
+#ifdef DEBUG
+      if (r > mr) mr = r;
+      if (g > mg) mg = g;
+      if (b > mb) mb = b;
+#endif /* DEBUG */
+      total += ((r * (0.3086 / 0xFF)) +       /* gamma 1.0 intensity values */
+               (g * (0.6094 / 0xFF)) +
+               (b * (0.0820 / 0xFF)));
+    }
+  total /= pixels;
+#ifdef DEBUG
+  fprintf(stderr, "%s: %sdark %f (max rgb: %d %d %d)\n", progname,
+         (total < max ? "" : "not "),
+         total, mr, mg, mb);
+#endif /* DEBUG */
+  return (total < max);
+}
+
+
+Bool
+grab_video_frame(Screen *screen, Visual *visual, Drawable dest)
+{
+  char *def_camera = get_string_resource("videoDevice", "Integer");
+  if (def_camera && *def_camera)
+    {
+      int cam;
+      char c;
+      int ok = (1 == sscanf(def_camera, " %d %c", &cam, &c));
+      free (def_camera);
+      if (ok && grab_frame_1(screen, visual, dest, cam))
+       return True;
+    }
+
+  if (grab_frame_1(screen, visual, dest, VL_ANY))
+    return True;
+  else
+    {
+      int i;
+      VLServer server = vlOpenVideo (NULL);
+      for (i = 0; i < 5; i++)  /* if we get all black images, retry up to
+                                  five times. */
+       {
+         VLDevList dl;
+         int j;
+         vlGetDeviceList(server, &dl);
+         vlCloseVideo(server);
+         for (j = 0; j < dl.numDevices; j++)
+           {
+             VLDevice *d = &dl.devices[j];
+             int k;
+             for (k = 0; k < d->numNodes; k++)
+               if (d->nodes[k].type == VL_SRC &&
+                   d->nodes[k].kind == VL_VIDEO)
+                 if (grab_frame_1(screen, visual, dest, d->nodes[k].number))
+                   return True;
+             /* nothing yet?  go around and try again... */
+           }
+       }
+    }
+#ifdef DEBUG
+  fprintf (stderr, "%s: images on all video feeds are too dark.\n",
+          progname);
+#endif /* DEBUG */
+  return False;
+}
+
+
+static Bool
+install_video_frame(unsigned long *image, int width, int height,
+                   Screen *screen, Visual *visual, Drawable dest)
+{
+  Display *dpy = DisplayOfScreen(screen);
+  int x, y;
+  unsigned int w, h, b, d;
+  Window root;
+  XGCValues gcv;
+  GC gc;
+  XImage *ximage = 0;
+  int image_depth;
+  Bool free_data = False;
+  int vblank_kludge = 3;       /* lose the closed-captioning blips... */
+
+  double gain;
+  char c, *G = get_string_resource("videoGain", "Float");
+  if (!G || (1 != sscanf (G, " %lf %c", &gain, &c)))
+    /* default to the usual NTSC gamma value.  Is this the right thing to do?
+       (Yeah, "gain" isn't quite "gamma", but it's close enough...) */
+    gain = 2.2;
+  if (G) free (G);
+
+  XGetGeometry(dpy, dest, &root, &x, &y, &w, &h, &b, &d);
+  
+  gcv.function = GXcopy;
+  gcv.foreground = BlackPixelOfScreen(screen);
+  gc = XCreateGC (dpy, dest, GCFunction|GCForeground, &gcv);
+
+  image_depth = visual_depth(screen, visual);
+  if (image_depth < 24)
+    image_depth = 24;  /* We'll dither */
+
+  ximage = XCreateImage (dpy, visual, image_depth, ZPixmap, 0, (char *) image,
+                        width, height, 8, 0);
+  XInitImage(ximage);
+  if (!ximage)
+    return False;
+
+  if (gain > 0.0)      /* Pump up the volume */
+    {
+      unsigned char *end = (unsigned char *) (image + (width * height));
+      unsigned char *s = (unsigned char *) image;
+      while (s < end)
+       {
+         unsigned int r = s[1] * gain;
+         unsigned int g = s[2] * gain;
+         unsigned int b = s[3] * gain;
+         s[1] = (r > 255 ? 255 : r);
+         s[2] = (g > 255 ? 255 : g);
+         s[3] = (b > 255 ? 255 : b);
+         s += 4;
+       }
+    }
+
+  /* If the drawable is not of truecolor depth, we need to convert the
+     grabbed bits to match the depth by clipping off the less significant
+     bit-planes of each color component.
+  */
+  if (d != 24 && d != 32)
+    {
+      int x, y;
+      /* We use the same ximage->data in both images -- that's ok, because
+        since we're reading from B and writing to A, and B uses more bytes
+        per pixel than A, the write pointer won't overrun the read pointer.
+      */
+      XImage *ximage2 = XCreateImage (dpy, visual, d, ZPixmap, 0,
+                                     (char *) image,
+                                     width, height, 8, 0);
+      XInitImage(ximage2);
+      if (!ximage2)
+       {
+         XDestroyImage(ximage);
+         return False;
+       }
+
+#ifdef DEBUG
+      fprintf(stderr, "%s: converting from depth %d to depth %d\n",
+             progname, ximage->depth, ximage2->depth);
+#endif /* DEBUG */
+
+      for (y = 0; y < ximage->height; y++)
+       for (x = 0; x < ximage->width; x++)
+         {
+           unsigned long pixel = XGetPixel(ximage, x, y);
+           unsigned int r = (pixel & 0x0000FF);
+           unsigned int g = (pixel & 0x00FF00) >> 8;
+           unsigned int b = (pixel & 0xFF0000) >> 16;
+
+           if (d == 8)
+             pixel = ((r >> 5) | ((g >> 5) << 3) | ((b >> 6) << 6));
+           else if (d == 12)
+             pixel = ((r >> 4) | ((g >> 4) << 4) | ((b >> 4) << 8));
+           else if (d == 16)
+             pixel = ((r >> 3) | ((g >> 3) << 5) | ((b >> 3) << 10));
+           else
+             abort();
+
+           XPutPixel(ximage2, x, y, pixel);
+         }
+      ximage->data = 0;
+      XDestroyImage(ximage);
+      ximage = ximage2;
+    }
+
+  if (width < w && height < h)      /* Stretch the image to fit the window. */
+    {
+      double dw = (((double) w) / ((double) width));
+      double dh = (((double) h) / ((double) height));
+      double d = (dw > dh ? dh : dw);
+      int width2  = d * width;
+      int height2 = d * height;
+      int x, y;
+      XImage *ximage2 = XCreateImage (dpy, visual, ximage->depth, ZPixmap,
+                                     0, NULL,
+                                     width2, height2, 8, 0);
+      if (!ximage2->data)
+       ximage2->data = (char *) malloc(width2 * height2 * 4);
+      free_data = True;
+      XInitImage(ximage2);
+#ifdef DEBUG
+      fprintf(stderr, "%s: stretching video image by %f (%d %d -> %d %d)\n",
+             progname, d, width, height, width2, height2);
+#endif /* DEBUG */
+      for (y = 0; y < height2; y++)
+       {
+         int y2 = (int) (y / d);
+         for (x = 0; x < width2; x++)
+           XPutPixel(ximage2, x, y, XGetPixel(ximage, (int) (x / d), y2));
+       }
+      ximage->data = 0;
+      XDestroyImage(ximage);
+      ximage = ximage2;
+      width = width2;
+      height = height2;
+      vblank_kludge *= d;
+    }
+
+  XFillRectangle(dpy, dest, gc, 0, 0, w, h);
+  XPutImage(dpy, dest, gc, ximage, 0, vblank_kludge,
+           (w - width) / 2,
+           (h - height) / 2,
+           width, height - vblank_kludge);
+  XSync(dpy, False);
+
+  if (free_data)
+    free(ximage->data);
+  ximage->data = 0;
+  XDestroyImage(ximage);
+  XFreeGC (dpy, gc);
+  return True;
+}
+
+#endif /* HAVE_SGI_VIDEO */
diff --git a/utils/sgivideo.h b/utils/sgivideo.h
new file mode 100644 (file)
index 0000000..794fde6
--- /dev/null
@@ -0,0 +1,18 @@
+/* xscreensaver, Copyright (c) 1997 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software 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.  No representations are made about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or 
+ * implied warranty.
+ */
+
+#ifndef __SGIVIDEO_H__
+# ifdef HAVE_SGI_VIDEO
+
+Bool grab_video_frame(Screen *screen, Visual *visual, Drawable dest);
+
+# endif /* HAVE_SGI_VIDEO */
+#endif /* __SGIVIDEO_H__ */
diff --git a/utils/spline.c b/utils/spline.c
new file mode 100644 (file)
index 0000000..ed3d31c
--- /dev/null
@@ -0,0 +1,330 @@
+/*
+ * Copyright (c) 1987, 1988, 1989 Stanford University
+ *
+ * Permission to use, copy, modify, distribute, and sell this software 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 Stanford not be used in advertising or
+ * publicity pertaining to distribution of the software without specific,
+ * written prior permission.  Stanford makes no representations about
+ * the suitability of this software for any purpose.  It is provided "as is"
+ * without express or implied warranty.
+ *
+ * STANFORD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS.
+ * IN NO EVENT SHALL STANFORD 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.
+ */
+
+/* This code came with the InterViews distribution, and was translated
+   from C++ to C by Matthieu Devin <devin@lucid.com> some time in 1992.
+ */
+
+#include "utils.h"
+#include "spline.h"
+
+#define SMOOTHNESS 1.0
+
+static void no_more_memory (void);
+static void grow_spline_points (spline* s);
+static void mid_point (double x0, double y0, double x1, double y1,
+                      double *mx, double *my);
+static int can_approx_with_line (double x0, double y0, double x2,
+                                double y2, double x3, double y3);
+static void add_line (spline* s, double x0, double y0, double x1, double y1);
+static void add_bezier_arc (spline* s,
+                           double x0, double y0, double x1, double y1,
+                           double x2, double y2, double x3, double y3);
+static void third_point (double x0, double y0, double x1, double y1,
+                        double *tx, double *ty);
+static void calc_section (spline* s, double cminus1x, double cminus1y,
+                         double cx, double cy, double cplus1x, double cplus1y,
+                         double cplus2x, double cplus2y);
+
+static void
+no_more_memory (void)
+{
+  fprintf (stderr, "No more memory\n");
+  exit (1);
+}
+
+spline*
+make_spline (unsigned int size)
+{
+  spline* s = (spline*)calloc (1, sizeof (spline));
+  if (!s)
+    no_more_memory ();
+  s->n_controls = size;
+  s->control_x = (double*)calloc (s->n_controls, sizeof (double));
+  s->control_y = (double*)calloc (s->n_controls, sizeof (double));
+
+  s->n_points = 0;
+  s->allocated_points = s->n_controls;
+  s->points = (XPoint*)calloc (s->allocated_points, sizeof (XPoint));
+
+  if (!s->control_x || !s->control_y || !s->points)
+    no_more_memory ();
+
+  return s;
+}
+
+static void
+grow_spline_points (spline *s)
+{
+  s->allocated_points *= 2;
+  s->points =
+    (XPoint*)realloc (s->points, s->allocated_points * sizeof (XPoint));
+
+  if (!s->points)
+    no_more_memory ();
+}
+
+static void 
+mid_point (double x0, double y0,
+          double x1, double y1,
+          double *mx, double *my)
+{
+  *mx = (x0 + x1) / 2.0;
+  *my = (y0 + y1) / 2.0;
+}
+
+static void 
+third_point (double x0, double y0,
+            double x1, double y1,
+            double *tx, double *ty)
+{
+  *tx = (2 * x0 + x1) / 3.0;
+  *ty = (2 * y0 + y1) / 3.0;
+}
+
+static int
+can_approx_with_line (double x0, double y0,
+                     double x2, double y2,
+                     double x3, double y3)
+{
+  double triangle_area, side_squared, dx, dy;
+  
+  triangle_area = x0 * y2 - x2 * y0 + x2 * y3 - x3 * y2 + x3 * y0 - x0 * y3;
+  /* actually 4 times the area. */
+  triangle_area *= triangle_area;
+  dx = x3 - x0;
+  dy = y3 - y0;
+  side_squared = dx * dx + dy * dy;
+  return triangle_area <= SMOOTHNESS * side_squared;
+}
+
+static void
+add_line (spline *s,
+         double x0, double y0,
+         double x1, double y1)
+{
+  if (s->n_points >= s->allocated_points)
+    grow_spline_points (s);
+
+  if (s->n_points == 0)
+    {
+      s->points [s->n_points].x = x0;
+      s->points [s->n_points].y = y0;
+      s->n_points += 1;
+    }
+  s->points [s->n_points].x = x1;
+  s->points [s->n_points].y = y1;
+  s->n_points += 1;
+}
+
+static void 
+add_bezier_arc (spline *s,
+               double x0, double y0,
+               double x1, double y1,
+               double x2, double y2,
+               double x3, double y3)
+{
+  double midx01, midx12, midx23, midlsegx, midrsegx, cx,
+  midy01, midy12, midy23, midlsegy, midrsegy, cy;
+    
+  mid_point (x0, y0, x1, y1, &midx01, &midy01);
+  mid_point (x1, y1, x2, y2, &midx12, &midy12);
+  mid_point (x2, y2, x3, y3, &midx23, &midy23);
+  mid_point (midx01, midy01, midx12, midy12, &midlsegx, &midlsegy);
+  mid_point (midx12, midy12, midx23, midy23, &midrsegx, &midrsegy);
+  mid_point (midlsegx, midlsegy, midrsegx, midrsegy, &cx, &cy);    
+
+  if (can_approx_with_line (x0, y0, midlsegx, midlsegy, cx, cy))
+    add_line (s, x0, y0, cx, cy);
+  else if ((midx01 != x1) || (midy01 != y1) || (midlsegx != x2)
+          || (midlsegy != y2) || (cx != x3) || (cy != y3))
+    add_bezier_arc (s, x0, y0, midx01, midy01, midlsegx, midlsegy, cx, cy);
+
+  if (can_approx_with_line (cx, cy, midx23, midy23, x3, y3))
+    add_line (s, cx, cy, x3, y3);
+  else if ((cx != x0) || (cy != y0) || (midrsegx != x1) || (midrsegy != y1)
+          || (midx23 != x2) || (midy23 != y2))  
+    add_bezier_arc (s, cx, cy, midrsegx, midrsegy, midx23, midy23, x3, y3);
+}
+
+static void
+calc_section (spline *s,
+             double cminus1x, double cminus1y,
+             double cx, double cy,
+             double cplus1x, double cplus1y,
+             double cplus2x, double cplus2y)
+{
+  double p0x, p1x, p2x, p3x, tempx,
+  p0y, p1y, p2y, p3y, tempy;
+  
+  third_point (cx, cy, cplus1x, cplus1y, &p1x, &p1y);
+  third_point (cplus1x, cplus1y, cx, cy, &p2x, &p2y);
+  third_point (cx, cy, cminus1x, cminus1y, &tempx, &tempy);
+  mid_point (tempx, tempy, p1x, p1y, &p0x, &p0y);
+  third_point (cplus1x, cplus1y, cplus2x, cplus2y, &tempx, &tempy);
+  mid_point (tempx, tempy, p2x, p2y, &p3x, &p3y);
+  add_bezier_arc (s, p0x, p0y, p1x, p1y, p2x, p2y, p3x, p3y);
+}
+
+void
+compute_spline (spline *s)
+{
+  int i;
+  s->n_points = 0;
+  
+  if (s->n_controls < 3)
+    return;
+
+  calc_section (s, s->control_x [0], s->control_y [0], s->control_x [0],
+               s->control_y [0], s->control_x [0], s->control_y [0],
+               s->control_x [1], s->control_y [1]);
+  calc_section (s, s->control_x [0], s->control_y [0], s->control_x [0],
+               s->control_y [0], s->control_x [1], s->control_y [1],
+               s->control_x [2], s->control_y [2]);
+
+  for (i = 1; i < s->n_controls - 2; i++)
+    calc_section (s, s->control_x [i - 1], s->control_y [i - 1],
+                 s->control_x [i], s->control_y [i],
+                 s->control_x [i + 1], s->control_y [i + 1],
+                 s->control_x [i + 2], s->control_y [i + 2]);
+  
+  calc_section (s, s->control_x [i - 1], s->control_y [i - 1],
+               s->control_x [i], s->control_y [i],
+               s->control_x [i + 1], s->control_y [i + 1],
+               s->control_x [i + 1], s->control_y [i + 1]);
+  calc_section (s, s->control_x [i], s->control_y [i],
+               s->control_x [i + 1], s->control_y [i + 1],
+               s->control_x [i + 1], s->control_y [i + 1],
+               s->control_x [i + 1], s->control_y [i + 1]);
+}
+
+void 
+compute_closed_spline (spline *s)
+{
+  int i;
+  s->n_points = 0;
+
+  if (s->n_controls < 3) 
+    return;
+
+  calc_section (s,
+               s->control_x [s->n_controls - 1],
+               s->control_y [s->n_controls - 1],
+               s->control_x [0], s->control_y [0],
+               s->control_x [1], s->control_y [1],
+               s->control_x [2], s->control_y [2]);
+
+  for (i = 1; i < s->n_controls - 2; i++)
+    calc_section (s, s->control_x [i - 1], s->control_y [i - 1],
+                 s->control_x [i], s->control_y [i],
+                 s->control_x [i + 1], s->control_y [i + 1],
+                 s->control_x [i + 2], s->control_y [i + 2]);
+      
+  calc_section (s, s->control_x [i - 1], s->control_y [i - 1],
+               s->control_x [i], s->control_y [i],
+               s->control_x [i + 1], s->control_y [i + 1],
+               s->control_x [0], s->control_y [0]);
+  calc_section (s, s->control_x [i], s->control_y [i],
+               s->control_x [i + 1], s->control_y [i + 1],
+               s->control_x [0], s->control_y [0],
+               s->control_x [1], s->control_y [1]);
+}
+
+void
+just_fill_spline (spline *s)
+{
+  int i;
+
+  while (s->allocated_points < s->n_controls + 1)
+    grow_spline_points (s);
+    
+  for (i = 0; i < s->n_controls; i++)
+    {
+      s->points [i].x = s->control_x [i];
+      s->points [i].y = s->control_y [i];
+    }
+  s->points [s->n_controls].x = s->control_x [0];
+  s->points [s->n_controls].y = s->control_y [0];
+  s->n_points = s->n_controls + 1;
+}
+
+void
+append_spline_points (spline *s1, spline *s2)
+{
+  int i;
+  while (s1->allocated_points < s1->n_points + s2->n_points)
+    grow_spline_points (s1);
+  for (i = s1->n_points; i < s1->n_points + s2->n_points; i++)
+    {
+      s1->points [i].x = s2->points [i - s1->n_points].x;
+      s1->points [i].y = s2->points [i - s1->n_points].y;
+    }
+  s1->n_points = s1->n_points + s2->n_points;
+}
+
+void
+spline_bounding_box (spline *s, XRectangle *rectangle_out)
+{
+  int min_x;
+  int max_x;
+  int min_y;
+  int max_y;
+  int i;
+
+  if (s->n_points == 0)
+    {
+      rectangle_out->x = 0;
+      rectangle_out->y = 0;
+      rectangle_out->width = 0;
+      rectangle_out->height = 0;
+    }
+
+  min_x = s->points [0].x;
+  max_x = min_x;
+  min_y = s->points [0].y;
+  max_y = min_y;
+
+  for (i = 1; i < s->n_points; i++)
+    {
+      if (s->points [i].x < min_x)
+       min_x = s->points [i].x;
+      if (s->points [i].x > max_x)
+       max_x = s->points [i].x;
+      if (s->points [i].y < min_y)
+       min_y = s->points [i].y;
+      if (s->points [i].y > max_y)
+       max_y = s->points [i].y;
+    }
+  rectangle_out->x = min_x;
+  rectangle_out->y = min_y;
+  rectangle_out->width = max_x - min_x;
+  rectangle_out->height = max_y - min_y;
+}
+
+void
+free_spline(spline * s)
+{
+  free ((void *) s->control_x);
+  free ((void *) s->control_y);
+  free ((void *) s->points);
+  free ((void *) s);
+}
diff --git a/utils/spline.h b/utils/spline.h
new file mode 100644 (file)
index 0000000..a5a366c
--- /dev/null
@@ -0,0 +1,51 @@
+/*
+ * Copyright (c) 1987, 1988, 1989 Stanford University
+ *
+ * Permission to use, copy, modify, distribute, and sell this software 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 Stanford not be used in advertising or
+ * publicity pertaining to distribution of the software without specific,
+ * written prior permission.  Stanford makes no representations about
+ * the suitability of this software for any purpose.  It is provided "as is"
+ * without express or implied warranty.
+ *
+ * STANFORD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS.
+ * IN NO EVENT SHALL STANFORD 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.
+ */
+
+/* This code came with the InterViews distribution, and was translated
+   from C++ to C by Matthieu Devin <devin@lucid.com> some time in 1992.
+ */
+
+#ifndef _SPLINE_H_
+#define _SPLINE_H_
+
+typedef struct _spline
+{
+  /* input */
+  unsigned int n_controls;
+  double*      control_x;
+  double*      control_y;
+
+  /* output */
+  unsigned int         n_points;
+  XPoint*      points;
+  unsigned int         allocated_points;
+} spline;
+
+spline* make_spline (unsigned int size);
+void compute_spline (spline* s);
+void compute_closed_spline (spline* s);
+void just_fill_spline (spline* s);
+void append_spline_points (spline* s1, spline* s2);
+void spline_bounding_box (spline* s, XRectangle* rectangle_out);
+void free_spline(spline *s);
+
+#endif /* _SPLINE_H_ */
diff --git a/utils/usleep.c b/utils/usleep.c
new file mode 100644 (file)
index 0000000..7066759
--- /dev/null
@@ -0,0 +1,58 @@
+/* xscreensaver, Copyright (c) 1992, 1996, 1997
+ *  Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software 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.  No representations are made about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or 
+ * implied warranty.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#else  /* !HAVE_CONFIG_H */
+# ifndef NO_SELECT
+#  define HAVE_SELECT
+# endif
+#endif /* !HAVE_CONFIG_H */
+
+#ifdef __STDC__
+# include <stdlib.h>
+#endif
+
+#if defined(VMS)
+# include <descrip.h>
+# include <stdio.h>
+# include <lib$routines.h>
+#elif defined(HAVE_SELECT)
+# include <sys/time.h>         /* for struct timeval */
+#endif
+
+
+#ifdef __SCREENHACK_USLEEP_H__
+ERROR, do not include that here
+#endif
+
+void
+screenhack_usleep (unsigned long usecs)
+{
+# if defined(VMS)
+  float seconds = ((float) usecs)/1000000.0;
+  unsigned long int statvms = lib$wait(&seconds);
+
+#elif defined(HAVE_SELECT)
+  /* usleep() doesn't exist everywhere, and select() is faster anyway. */
+  struct timeval tv;
+  tv.tv_sec  = usecs / 1000000L;
+  tv.tv_usec = usecs % 1000000L;
+  (void) select (0, 0, 0, 0, &tv);
+
+#else /* !VMS && !HAVE_SELECT */
+  /* If you don't have select() or usleep(), I guess you lose...
+     Maybe you have napms() instead?  Let me know. */
+  usleep (usecs);
+
+#endif /* !VMS && !HAVE_SELECT */
+}
diff --git a/utils/usleep.h b/utils/usleep.h
new file mode 100644 (file)
index 0000000..c40363e
--- /dev/null
@@ -0,0 +1,20 @@
+/* xscreensaver, Copyright (c) 1992, 1996 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software 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.  No representations are made about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or 
+ * implied warranty.
+ */
+
+#ifndef __SCREENHACK_USLEEP_H__
+#define __SCREENHACK_USLEEP_H__
+
+extern void screenhack_usleep (unsigned long usecs);
+
+#undef usleep
+#define usleep(usecs) screenhack_usleep(usecs)
+
+#endif /* __SCREENHACK_USLEEP_H__ */
diff --git a/utils/utils.h b/utils/utils.h
new file mode 100644 (file)
index 0000000..284bb86
--- /dev/null
@@ -0,0 +1,22 @@
+/* xscreensaver, Copyright (c) 1997 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software 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.  No representations are made about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or 
+ * implied warranty.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <math.h>
+
+#include <X11/Xlib.h>
+#include <X11/Xos.h>
diff --git a/utils/version.h b/utils/version.h
new file mode 100644 (file)
index 0000000..51cf9ad
--- /dev/null
@@ -0,0 +1,2 @@
+static const char screensaver_id[] =
+       "@(#)xscreensaver 3.16 (23-Jun-99), by Jamie Zawinski (jwz@jwz.org)";
diff --git a/utils/visual-gl.c b/utils/visual-gl.c
new file mode 100644 (file)
index 0000000..fb83fe4
--- /dev/null
@@ -0,0 +1,99 @@
+/* xscreensaver, Copyright (c) 1999 by Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software 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.  No representations are made about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or 
+ * implied warranty.
+ */
+
+/* This file contains code for picking the best visual for GL programs by
+   actually asking the GL library to figure it out for us.  The code in
+   visual.c might do a good job of this on most systems, but not, in
+   particular, on SGIs.
+
+   Why?  Because with the SGI O2 X server is weird.
+
+   GL programs tend to work best on a visual that is *half* as deep as the
+   depth of the screen, since that way, they can do double-buffering.  So
+   generally, if the screen is 24 bits deep, but a 12-bit TrueColor visual
+   is available, then that's the visual you should use.
+
+   But on the server that runs on the O2 (a machine that has serious hardware
+   support for GL) the 12-bit PseudoColor visual looks awful (you get a black
+   and white, flickery image.)  On these machines, the visual you want turns
+   out to be 0x31 -- this is but one of the eight 15-bit TrueColor visuals
+   (yes, 8, and yes, 15) that O2s provide.  This is the only visual that works
+   properly -- as far as `xdpyinfo' is concerned, all of the 15-bit TrueColor
+   visuals are identical, but some flicker like mad, and some have deeply
+   weird artifacts (hidden surfaces show through!)  I suppose these other
+   visuals must be tied to some arcane hardware feature...
+
+   So the bottom line is, there exists information about visuals which is
+   available to GL, but which is not available via Xlib calls.  So the only
+   way to know which visual to use (other than impirically) is to actually
+   call GLX routines.
+ */
+
+#include "utils.h"
+#include "visual.h"
+
+#ifdef HAVE_GL
+# include <GL/gl.h>
+# include <GL/glx.h>
+#endif /* HAVE_GL */
+
+Visual *
+get_gl_visual (Screen *screen)
+{
+#ifdef HAVE_GL
+  XVisualInfo *vi = 0;
+  Display *dpy = DisplayOfScreen (screen);
+  int screen_num = screen_number (screen);
+  int attrs[20];
+  int i = 0;
+
+  attrs[i++] = GLX_RGBA;
+  attrs[i++] = GLX_RED_SIZE;     attrs[i++] = 1;
+  attrs[i++] = GLX_GREEN_SIZE;   attrs[i++] = 1;
+  attrs[i++] = GLX_BLUE_SIZE;    attrs[i++] = 1;
+  attrs[i++] = GLX_DEPTH_SIZE;   attrs[i++] = 1;
+  attrs[i++] = GLX_DOUBLEBUFFER;
+  attrs[i++] = 0;
+
+  vi = glXChooseVisual (dpy, screen_num, attrs);
+
+  if (!vi)                             /* Try without double-buffering. */
+    {
+      attrs[i-1] = 0;
+      vi = glXChooseVisual (dpy, screen_num, attrs);
+    }
+
+  if (!vi)                             /* Try mono. */
+    {
+      i = 0;
+      attrs[i++] = GLX_DOUBLEBUFFER;
+      attrs[i++] = 0;
+      vi = glXChooseVisual (dpy, screen_num, attrs);
+    }
+
+  if (!vi)                             /* Try mono without double-buffer. */
+    {
+      attrs[0] = 0;
+      vi = glXChooseVisual (dpy, screen_num, attrs);
+    }
+
+  if (!vi)
+    return 0;
+  else
+    {
+      Visual *v = vi->visual;
+      XFree (vi);
+      return v;
+    }
+#else  /* !HAVE_GL */
+  return 0;
+#endif /* !HAVE_GL */
+}
diff --git a/utils/visual.c b/utils/visual.c
new file mode 100644 (file)
index 0000000..195ef79
--- /dev/null
@@ -0,0 +1,543 @@
+/* xscreensaver, Copyright (c) 1993, 1994, 1995, 1996, 1997, 1998, 1999
+ *  by Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software 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.  No representations are made about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or 
+ * implied warranty.
+ */
+
+/* This file contains some code for intelligently picking the best visual
+   (where "best" is biased in the direction of either: high color counts;
+   or: having writable color cells...)
+ */
+
+#include "utils.h"
+#include "resources.h"  /* for get_string_resource() */
+#include "visual.h"
+
+#include <X11/Xutil.h>
+
+extern char *progname;
+
+
+#ifndef isupper
+# define isupper(c)  ((c) >= 'A' && (c) <= 'Z')
+#endif
+#ifndef _tolower
+# define _tolower(c)  ((c) - 'A' + 'a')
+#endif
+
+
+static Visual *pick_best_visual (Screen *, Bool, Bool);
+static Visual *pick_mono_visual (Screen *);
+static Visual *pick_best_visual_of_class (Screen *, int);
+static Visual *pick_best_gl_visual (Screen *);
+static Visual *id_to_visual (Screen *, int);
+static Visual *id_to_visual (Screen *screen, int id);
+
+
+#define DEFAULT_VISUAL -1
+#define BEST_VISUAL    -2
+#define MONO_VISUAL    -3
+#define GRAY_VISUAL    -4
+#define COLOR_VISUAL   -5
+#define GL_VISUAL      -6
+#define SPECIFIC_VISUAL        -7
+
+Visual *
+get_visual (Screen *screen, const char *string, Bool prefer_writable_cells,
+           Bool verbose_p)
+{
+  char *v = (string ? strdup(string) : 0);
+  char c, *tmp;
+  int vclass;
+  unsigned long id;
+  Visual *result = 0;
+
+  if (v)
+    for (tmp = v; *tmp; tmp++)
+      if (isupper (*tmp)) *tmp = _tolower (*tmp);
+
+  if (!v)                                        vclass = BEST_VISUAL;
+  else if (!strcmp (v, "default"))               vclass = DEFAULT_VISUAL;
+  else if (!strcmp (v, "best"))                  vclass = BEST_VISUAL;
+  else if (!strcmp (v, "mono"))                  vclass = MONO_VISUAL;
+  else if (!strcmp (v, "monochrome"))            vclass = MONO_VISUAL;
+  else if (!strcmp (v, "gray"))                  vclass = GRAY_VISUAL;
+  else if (!strcmp (v, "grey"))                  vclass = GRAY_VISUAL;
+  else if (!strcmp (v, "color"))                 vclass = COLOR_VISUAL;
+  else if (!strcmp (v, "gl"))                    vclass = GL_VISUAL;
+  else if (!strcmp (v, "staticgray"))            vclass = StaticGray;
+  else if (!strcmp (v, "staticcolor"))           vclass = StaticColor;
+  else if (!strcmp (v, "truecolor"))             vclass = TrueColor;
+  else if (!strcmp (v, "grayscale"))             vclass = GrayScale;
+  else if (!strcmp (v, "greyscale"))             vclass = GrayScale;
+  else if (!strcmp (v, "pseudocolor"))           vclass = PseudoColor;
+  else if (!strcmp (v, "directcolor"))           vclass = DirectColor;
+  else if (1 == sscanf (v, " %ld %c", &id, &c))          vclass = SPECIFIC_VISUAL;
+  else if (1 == sscanf (v, " 0x%lx %c", &id, &c)) vclass = SPECIFIC_VISUAL;
+  else
+    {
+      fprintf (stderr, "%s: unrecognized visual \"%s\".\n", progname, v);
+      vclass = DEFAULT_VISUAL;
+    }
+
+  if (vclass == DEFAULT_VISUAL)
+    result = DefaultVisualOfScreen (screen);
+  else if (vclass == BEST_VISUAL)
+    result = pick_best_visual (screen, prefer_writable_cells, False);
+  else if (vclass == MONO_VISUAL)
+    {
+      result = pick_mono_visual (screen);
+      if (!result && verbose_p)
+       fprintf (stderr, "%s: no monochrome visuals.\n", progname);
+    }
+  else if (vclass == GRAY_VISUAL)
+    {
+      if (prefer_writable_cells)
+       result = pick_best_visual_of_class (screen, GrayScale);
+      if (!result)
+       result = pick_best_visual_of_class (screen, StaticGray);
+      if (!result)
+       result = pick_best_visual_of_class (screen, GrayScale);
+      if (!result && verbose_p)
+       fprintf (stderr, "%s: no GrayScale or StaticGray visuals.\n",
+                progname);
+    }
+  else if (vclass == COLOR_VISUAL)
+    {
+      int class;
+      /* First see if the default visual will do. */
+      result = DefaultVisualOfScreen (screen);
+      class = visual_class(screen, result);
+      if (class != TrueColor &&
+         class != PseudoColor &&
+         class != DirectColor &&
+         class != StaticColor)
+       result = 0;
+      if (result && visual_depth(screen, result) <= 1)
+       result = 0;
+
+      /* Else, find the best non-default color visual */
+      if (!result)
+       result = pick_best_visual (screen, prefer_writable_cells, True);
+
+      if (!result && verbose_p)
+       fprintf (stderr, "%s: no color visuals.\n", progname);
+    }
+  else if (vclass == GL_VISUAL)
+    {
+      Visual *visual = pick_best_gl_visual (screen);
+      if (visual)
+       result = visual;
+      else if (verbose_p)
+       fprintf (stderr, "%s: no visual suitable for GL.\n", progname, v);
+    }
+  else if (vclass == SPECIFIC_VISUAL)
+    {
+      result = id_to_visual (screen, id);
+      if (!result && verbose_p)
+       fprintf (stderr, "%s: no visual with id 0x%x.\n", progname,
+                (unsigned int) id);
+    }
+  else
+    {
+      Visual *visual = pick_best_visual_of_class (screen, vclass);
+      if (visual)
+       result = visual;
+      else if (verbose_p)
+       fprintf (stderr, "%s: no visual of class %s.\n", progname, v);
+    }
+
+  if (v) free (v);
+  return result;
+}
+
+Visual *
+get_visual_resource (Screen *screen, char *name, char *class,
+                    Bool prefer_writable_cells)
+{
+  char *string = get_string_resource (name, class);
+  Visual *v = get_visual (screen, string, prefer_writable_cells, True);
+  if (string)
+    free(string);
+  if (v)
+    return v;
+  else
+    return DefaultVisualOfScreen (screen);
+}
+
+
+static Visual *
+pick_best_visual (Screen *screen, Bool prefer_writable_cells, Bool color_only)
+{
+  Visual *visual;
+
+  if (!prefer_writable_cells)
+    {
+      /* If we don't prefer writable cells, then the "best" visual is the one
+        on which we can allocate the largest range and number of colors.
+
+        Therefore, a TrueColor visual which is at least 16 bits deep is best.
+        (The assumption here being that a TrueColor of less than 16 bits is
+        really just a PseudoColor visual with a pre-allocated color cube.)
+
+        The next best thing is a PseudoColor visual of any type.  After that
+        come the non-colormappable visuals, and non-color visuals.
+       */
+      if ((visual = pick_best_visual_of_class (screen, TrueColor)) &&
+         visual_depth (screen, visual) >= 16)
+       return visual;
+    }
+
+#define TRY_CLASS(CLASS) \
+  if ((visual = pick_best_visual_of_class (screen, CLASS)) && \
+      (!color_only || visual_depth(screen, visual) > 1)) \
+    return visual
+  TRY_CLASS(PseudoColor);
+  TRY_CLASS(TrueColor);
+  TRY_CLASS(DirectColor);
+  TRY_CLASS(StaticColor);
+  if (!color_only)
+    {
+      TRY_CLASS(GrayScale);
+      TRY_CLASS(StaticGray);
+    }
+#undef TRY_CLASS
+
+  visual = DefaultVisualOfScreen (screen);
+  if (!color_only || visual_depth(screen, visual) > 1)
+    return visual;
+  else
+    return 0;
+}
+
+static Visual *
+pick_mono_visual (Screen *screen)
+{
+  Display *dpy = DisplayOfScreen (screen);
+  XVisualInfo vi_in, *vi_out;
+  int out_count;
+
+  vi_in.depth = 1;
+  vi_in.screen = screen_number (screen);
+  vi_out = XGetVisualInfo (dpy, (VisualDepthMask | VisualScreenMask),
+                          &vi_in, &out_count);
+  if (vi_out)
+    {
+      Visual *v = (out_count > 0 ? vi_out [0].visual : 0);
+      if (v && vi_out[0].depth != 1)
+       v = 0;
+      XFree ((char *) vi_out);
+      return v;
+    }
+  else
+    return 0;
+}
+
+
+static Visual *
+pick_best_visual_of_class (Screen *screen, int visual_class)
+{
+  /* The best visual of a class is the one which on which we can allocate
+     the largest range and number of colors, which means the one with the
+     greatest depth and number of cells.
+
+     (But actually, for XDaliClock, all visuals of the same class are
+     probably equivalent - either we have writable cells or we don't.)
+   */
+  Display *dpy = DisplayOfScreen (screen);
+  XVisualInfo vi_in, *vi_out;
+  int out_count;
+
+  vi_in.class = visual_class;
+  vi_in.screen = screen_number (screen);
+  vi_out = XGetVisualInfo (dpy, (VisualClassMask | VisualScreenMask),
+                          &vi_in, &out_count);
+  if (vi_out)
+    {
+      /* choose the 'best' one, if multiple */
+      int i, best;
+      Visual *visual;
+      for (i = 0, best = 0; i < out_count; i++)
+       /* It's better if it's deeper, or if it's the same depth with
+          more cells (does that ever happen?  Well, it could...) */
+       if ((vi_out [i].depth > vi_out [best].depth) ||
+           ((vi_out [i].depth == vi_out [best].depth) &&
+            (vi_out [i].colormap_size > vi_out [best].colormap_size)))
+         best = i;
+      visual = (best < out_count ? vi_out [best].visual : 0);
+      XFree ((char *) vi_out);
+      return visual;
+    }
+  else
+    return 0;
+}
+
+static Visual *
+pick_best_gl_visual (Screen *screen)
+{
+  /* The best visual for GL is a TrueColor visual that is half as deep as
+     the screen.  If such a thing doesn't exist, then TrueColor is best.
+     Failing that, the deepest available color visual is best.
+
+     Compare this function to get_gl_visual() in visual-gl.c.
+     This function tries to find the best GL visual using Xlib calls,
+     whereas that function does the same thing using GLX calls.
+   */
+  Display *dpy = DisplayOfScreen (screen);
+  XVisualInfo vi_in, *vi_out;
+  int out_count;
+  Visual *result = 0;
+
+  int ndepths = 0;
+  int *depths = XListDepths (dpy, screen_number (screen), &ndepths);
+  int screen_depth = depths[ndepths];
+  XFree (depths);
+
+  vi_in.class = TrueColor;
+  vi_in.screen = screen_number (screen);
+  vi_in.depth = screen_depth / 2;
+  vi_out = XGetVisualInfo (dpy, (VisualClassMask | VisualScreenMask |
+                                 VisualDepthMask),
+                          &vi_in, &out_count);
+  if (out_count > 0)
+    result = vi_out[0].visual;
+
+  if (vi_out)
+    XFree ((char *) vi_out);
+
+  if (!result && screen_depth > 24)
+    {
+      /* If it's a 32-deep screen and we didn't find a depth-16 visual,
+         see if there's a depth-12 visual. */
+      vi_in.class = TrueColor;
+      vi_in.screen = screen_number (screen);
+      vi_in.depth = 12;
+      vi_out = XGetVisualInfo (dpy, (VisualClassMask | VisualScreenMask |
+                                     VisualDepthMask),
+                               &vi_in, &out_count);
+      if (out_count > 0)
+        result = vi_out[0].visual;
+    }
+
+  if (result)
+    /* No half-depth TrueColor?  Ok, try for any TrueColor (the deepest.) */
+    result = pick_best_visual_of_class (screen, TrueColor);
+
+  if (!result)
+    /* No TrueColor?  Ok, try for anything. */
+    result = pick_best_visual (screen, False, False);
+
+  return result;
+}
+
+
+static Visual *
+id_to_visual (Screen *screen, int id)
+{
+  Display *dpy = DisplayOfScreen (screen);
+  XVisualInfo vi_in, *vi_out;
+  int out_count;
+  vi_in.screen = screen_number (screen);
+  vi_in.visualid = id;
+  vi_out = XGetVisualInfo (dpy, (VisualScreenMask | VisualIDMask),
+                          &vi_in, &out_count);
+  if (vi_out)
+    {
+      Visual *v = vi_out[0].visual;
+      XFree ((char *) vi_out);
+      return v;
+    }
+  return 0;
+}
+
+int
+visual_depth (Screen *screen, Visual *visual)
+{
+  Display *dpy = DisplayOfScreen (screen);
+  XVisualInfo vi_in, *vi_out;
+  int out_count, d;
+  vi_in.screen = screen_number (screen);
+  vi_in.visualid = XVisualIDFromVisual (visual);
+  vi_out = XGetVisualInfo (dpy, VisualScreenMask|VisualIDMask,
+                          &vi_in, &out_count);
+  if (! vi_out) abort ();
+  d = vi_out [0].depth;
+  XFree ((char *) vi_out);
+  return d;
+}
+
+
+#if 0
+/* You very probably don't want to be using this.
+   Pixmap depth doesn't refer to the depths of pixmaps, but rather, to
+   the depth of protocol-level on-the-wire pixmap data, that is, XImages.
+   To get this info, you should be looking at XImage->bits_per_pixel
+   instead.  (And allocating the data for your XImage structures by
+   multiplying ximage->bytes_per_line by ximage->height.)
+ */
+int
+visual_pixmap_depth (Screen *screen, Visual *visual)
+{
+  Display *dpy = DisplayOfScreen (screen);
+  int vdepth = visual_depth (screen, visual);
+  int pdepth = vdepth;
+  int i, pfvc = 0;
+  XPixmapFormatValues *pfv = XListPixmapFormats (dpy, &pfvc);
+
+  /* Return the first matching depth in the pixmap formats.  If there are no
+     matching pixmap formats (which shouldn't be able to happen at all) then
+     return the visual depth instead. */
+  for (i = 0; i < pfvc; i++)
+    if (pfv[i].depth == vdepth)
+      {
+       pdepth = pfv[i].bits_per_pixel;
+       break;
+      }
+  if (pfv)
+    XFree (pfv);
+  return pdepth;
+}
+#endif /* 0 */
+
+
+int
+visual_class (Screen *screen, Visual *visual)
+{
+  Display *dpy = DisplayOfScreen (screen);
+  XVisualInfo vi_in, *vi_out;
+  int out_count, c;
+  vi_in.screen = screen_number (screen);
+  vi_in.visualid = XVisualIDFromVisual (visual);
+  vi_out = XGetVisualInfo (dpy, VisualScreenMask|VisualIDMask,
+                          &vi_in, &out_count);
+  if (! vi_out) abort ();
+  c = vi_out [0].class;
+  XFree ((char *) vi_out);
+  return c;
+}
+
+Bool
+has_writable_cells (Screen *screen, Visual *visual)
+{
+  switch (visual_class (screen, visual))
+    {
+    case GrayScale:    /* Mappable grays. */
+    case PseudoColor:  /* Mappable colors. */
+      return True;
+    case StaticGray:   /* Fixed grays. */
+    case TrueColor:    /* Fixed colors. */
+    case StaticColor:  /* (What's the difference again?) */
+    case DirectColor:  /* DirectColor visuals are like TrueColor, but have
+                          three colormaps - one for each component of RGB.
+                          Screw it. */
+      return False;
+    default:
+      abort();
+      return False;
+    }
+}
+
+void
+describe_visual (FILE *f, Screen *screen, Visual *visual, Bool private_cmap_p)
+{
+  char n[10];
+  Display *dpy = DisplayOfScreen (screen);
+  XVisualInfo vi_in, *vi_out;
+  int out_count;
+  vi_in.screen = screen_number (screen);
+  vi_in.visualid = XVisualIDFromVisual (visual);
+  vi_out = XGetVisualInfo (dpy, (VisualScreenMask | VisualIDMask),
+                          &vi_in, &out_count);
+  if (! vi_out) abort ();
+  if (private_cmap_p)
+    sprintf(n, "%3d", vi_out->colormap_size);
+  else
+    strcpy(n, "default");
+
+  fprintf (f, "0x%02x (%s depth: %2d, cmap: %s)\n",
+          (unsigned int) vi_out->visualid,
+          (vi_out->class == StaticGray  ? "StaticGray, " :
+           vi_out->class == StaticColor ? "StaticColor," :
+           vi_out->class == TrueColor   ? "TrueColor,  " :
+           vi_out->class == GrayScale   ? "GrayScale,  " :
+           vi_out->class == PseudoColor ? "PseudoColor," :
+           vi_out->class == DirectColor ? "DirectColor," :
+                                          "UNKNOWN:    "),
+          vi_out->depth, n);
+  XFree ((char *) vi_out);
+}
+
+int
+screen_number (Screen *screen)
+{
+  Display *dpy = DisplayOfScreen (screen);
+  int i;
+  for (i = 0; i < ScreenCount (dpy); i++)
+    if (ScreenOfDisplay (dpy, i) == screen)
+      return i;
+  abort ();
+  return 0;
+}
+
+int
+visual_cells (Screen *screen, Visual *visual)
+{
+  Display *dpy = DisplayOfScreen (screen);
+  XVisualInfo vi_in, *vi_out;
+  int out_count, c;
+  vi_in.screen = screen_number (screen);
+  vi_in.visualid = XVisualIDFromVisual (visual);
+  vi_out = XGetVisualInfo (dpy, VisualScreenMask|VisualIDMask,
+                          &vi_in, &out_count);
+  if (! vi_out) abort ();
+  c = vi_out [0].colormap_size;
+  XFree ((char *) vi_out);
+  return c;
+}
+
+Visual *
+find_similar_visual(Screen *screen, Visual *old_visual)
+{
+  Display *dpy = DisplayOfScreen (screen);
+  XVisualInfo vi_in, *vi_out;
+  Visual *result = 0;
+  int out_count;
+
+  vi_in.screen = screen_number (screen);
+  vi_in.class  = visual_class (screen, old_visual);
+  vi_in.depth  = visual_depth (screen, old_visual);
+
+  /* Look for a visual of the same class and depth.
+   */
+  vi_out = XGetVisualInfo (dpy, (VisualScreenMask | VisualClassMask |
+                                VisualDepthMask),
+                          &vi_in, &out_count);
+  if (vi_out && out_count > 0)
+    result = vi_out[0].visual;
+  if (vi_out) XFree (vi_out);
+  vi_out = 0;
+
+  /* Failing that, look for a visual of the same class.
+   */
+  if (!result)
+    {
+      vi_out = XGetVisualInfo (dpy, (VisualScreenMask | VisualClassMask),
+                              &vi_in, &out_count);
+      if (vi_out && out_count > 0)
+       result = vi_out[0].visual;
+      if (vi_out) XFree (vi_out);
+      vi_out = 0;
+    }
+
+  /* Failing that, return the default visual. */
+  if (!result)
+    result = DefaultVisualOfScreen (screen);
+
+  return result;
+}
diff --git a/utils/visual.h b/utils/visual.h
new file mode 100644 (file)
index 0000000..dd45708
--- /dev/null
@@ -0,0 +1,29 @@
+/* xscreensaver, Copyright (c) 1993-1999 by Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software 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.  No representations are made about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or 
+ * implied warranty.
+ */
+
+#ifndef __VISUAL_H__
+#define __VISUAL_H__
+
+extern Visual *get_visual (Screen *, const char *name, Bool, Bool);
+extern Visual *get_visual_resource (Screen *, char *, char *, Bool);
+extern int visual_depth (Screen *, Visual *);
+/* extern int visual_pixmap_depth (Screen *, Visual *); */
+extern int visual_class (Screen *, Visual *);
+extern int visual_cells (Screen *, Visual *);
+extern int screen_number (Screen *);
+extern Visual *find_similar_visual (Screen *, Visual *old);
+extern void describe_visual (FILE *f, Screen *, Visual *, Bool private_cmap_p);
+extern Visual *get_overlay_visual (Screen *, unsigned long *pixel_return);
+extern Bool has_writable_cells (Screen *screen, Visual *visual);
+
+Visual *get_gl_visual (Screen *screen);
+
+#endif /* __VISUAL_H__ */
diff --git a/utils/vms-gtod.c b/utils/vms-gtod.c
new file mode 100644 (file)
index 0000000..7b1df5a
--- /dev/null
@@ -0,0 +1,31 @@
+/*
+ *     UNIX-style Time Functions, by pmoreau@cena.dgac.fr <Patrick MOREAU>
+ *      (picked up from XVMSUTILS unix emulation routines for VMS by
+ *       Trevor Taylor, Patrick Mahans and Martin P.J. Zinser)
+ *
+ * Permission to use, copy, modify, distribute, and sell this software 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.  No representations are made about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or 
+ * implied warranty.
+ */
+#include <stdio.h>
+#include <signal.h>
+#include <time.h>
+#include "vms-gtod.h"
+
+/*
+ *     gettimeofday(2) - Returns the current time
+ */
+
+int gettimeofday(tv)
+struct timeval  *tv;
+{
+    timeb_t tmp_time;
+    ftime(&tmp_time);
+    tv->tv_sec  = tmp_time.time;
+    tv->tv_usec = tmp_time.millitm * 1000;
+    return (0);
+}
diff --git a/utils/vms-gtod.h b/utils/vms-gtod.h
new file mode 100644 (file)
index 0000000..ffd6586
--- /dev/null
@@ -0,0 +1,85 @@
+/*     @(#)time.h 2.9 87/01/17 SMI; from UCB 7.1 6/4/86        */
+
+/*
+       Definitions of various structures used on UNIX for
+       time-related syscalls.
+*/
+
+/*
+ * Copyright (c) 1982, 1986 Regents of the University of California.
+ * All rights reserved.  The Berkeley software License Agreement
+ * specifies the terms and conditions for redistribution.
+ */
+
+#ifndef _VMS_GTOD_
+#define _VMS_GTOD_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * Structure returned by gettimeofday(2) system call,
+ * and used in other calls.
+ */
+#ifndef __DECC
+struct timeval
+{
+       long    tv_sec;         /* seconds */
+       long    tv_usec;        /* and microseconds */
+};
+#else
+#if __DECC_VER < 50200000
+struct timeval
+{
+       long    tv_sec;         /* seconds */
+       long    tv_usec;        /* and microseconds */
+};
+#endif /* __DECC_VER */
+#endif /* __DECC */
+
+/*
+ * Operations on timevals.
+ *
+ * NB: timercmp does not work for >= or <=.
+ */
+#define        timerisset(tvp)         ((tvp)->tv_sec || (tvp)->tv_usec)
+#define        timercmp(tvp, uvp, cmp) \
+       ((tvp)->tv_sec cmp (uvp)->tv_sec || \
+        (tvp)->tv_sec == (uvp)->tv_sec && (tvp)->tv_usec cmp (uvp)->tv_usec)
+#define        timerclear(tvp)         (tvp)->tv_sec = (tvp)->tv_usec = 0
+
+/*
+ * Names of the interval timers, and structure
+ * defining a timer setting.
+ */
+#define        ITIMER_REAL     0
+#define        ITIMER_VIRTUAL  1
+#define        ITIMER_PROF     2
+
+#ifndef __DECC
+struct itimerval
+{
+       struct  timeval it_interval;    /* timer interval */
+       struct  timeval it_value;       /* current value */
+};
+#else
+#if __DECC_VER < 50200000
+struct itimerval
+{
+       struct  timeval it_interval;    /* timer interval */
+       struct  timeval it_value;       /* current value */
+};
+#endif /* __DECC_VER */
+#endif /* __DECC */
+
+#ifndef KERNEL
+#include <time.h>
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*!_VMS_GTOD_*/
+
diff --git a/utils/vms-strdup.c b/utils/vms-strdup.c
new file mode 100644 (file)
index 0000000..1afc257
--- /dev/null
@@ -0,0 +1,25 @@
+/*
+ * strdup.c
+ *
+ * Simple version of strdup for machines without it (ie DEC Ultrix 4.2)
+ * Apparently VMS only got strdup in 1995 (v5.2...)
+ *
+ * By David Chatterton
+ * 29 July 1993
+ *
+ * You can do anything you like to this... :)
+ * I've stolen it from xpilot and added it to the xvmstuils MPJZ ;-)
+ */
+
+#if (__VMS_VER < 70000000)
+#include <stdlib.h>
+#include <string.h>
+
+char* strdup (const char* s1)
+{
+       char* s2;
+       if (s2 = (char*)malloc(strlen(s1)+1))
+               strcpy(s2,s1);
+       return s2;
+}
+#endif
diff --git a/utils/vroot.h b/utils/vroot.h
new file mode 100644 (file)
index 0000000..ba3e5d2
--- /dev/null
@@ -0,0 +1,126 @@
+/*****************************************************************************/
+/**                   Copyright 1991 by Andreas Stolcke                     **/
+/**               Copyright 1990 by Solbourne Computer Inc.                 **/
+/**                          Longmont, Colorado                             **/
+/**                                                                         **/
+/**                           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    **/
+/**    name of Solbourne not be used in advertising                         **/
+/**    in publicity pertaining to distribution of the  software  without    **/
+/**    specific, written prior permission.                                  **/
+/**                                                                         **/
+/**    ANDREAS STOLCKE AND SOLBOURNE COMPUTER INC. DISCLAIMS ALL WARRANTIES **/
+/**    WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF    **/
+/**    MERCHANTABILITY  AND  FITNESS,  IN  NO  EVENT SHALL ANDREAS STOLCKE  **/
+/**    OR SOLBOURNE 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.                                     **/
+/*****************************************************************************/
+/*
+ * vroot.h -- Virtual Root Window handling header file
+ *
+ * This header file redefines the X11 macros RootWindow and DefaultRootWindow,
+ * making them look for a virtual root window as provided by certain `virtual'
+ * window managers like swm and tvtwm. If none is found, the ordinary root
+ * window is returned, thus retaining backward compatibility with standard
+ * window managers.
+ * The function implementing the virtual root lookup remembers the result of
+ * its last invocation to avoid overhead in the case of repeated calls
+ * on the same display and screen arguments. 
+ * The lookup code itself is taken from Tom LaStrange's ssetroot program.
+ *
+ * Most simple root window changing X programs can be converted to using
+ * virtual roots by just including
+ *
+ * #include <X11/vroot.h>
+ *
+ * after all the X11 header files.  It has been tested on such popular
+ * X clients as xphoon, xfroot, xloadimage, and xaqua.
+ * It also works with the core clients xprop, xwininfo, xwd, and editres
+ * (and is necessary to get those clients working under tvtwm).
+ * It does NOT work with xsetroot; get the xsetroot replacement included in
+ * the tvtwm distribution instead.
+ *
+ * Andreas Stolcke <stolcke@ICSI.Berkeley.EDU>, 9/7/90
+ * - replaced all NULL's with properly cast 0's, 5/6/91
+ * - free children list (suggested by Mark Martin <mmm@cetia.fr>), 5/16/91
+ * - include X11/Xlib.h and support RootWindowOfScreen, too 9/17/91
+ */
+
+#ifndef _VROOT_H_
+#define _VROOT_H_
+
+#if !defined(lint) && !defined(SABER)
+static const char vroot_rcsid[] = "#Id: vroot.h,v 1.4 1991/09/30 19:23:16 stolcke Exp stolcke #";
+#endif
+
+#include <X11/X.h>
+#include <X11/Xatom.h>
+#include <X11/Xlib.h>
+
+static Window
+#ifdef __STDC__ /* ANSIfication added by jwz, to avoid superfluous warnings. */
+VirtualRootWindowOfScreen(Screen *screen)
+#else /* !__STDC__ */
+VirtualRootWindowOfScreen(screen) Screen *screen;
+#endif /* !__STDC__ */
+{
+       static Screen *save_screen = (Screen *)0;
+       static Window root = (Window)0;
+
+       if (screen != save_screen) {
+               Display *dpy = DisplayOfScreen(screen);
+               Atom __SWM_VROOT = None;
+               int i;
+               Window rootReturn, parentReturn, *children;
+               unsigned int numChildren;
+
+               root = RootWindowOfScreen(screen);
+
+               /* go look for a virtual root */
+               __SWM_VROOT = XInternAtom(dpy, "__SWM_VROOT", False);
+               if (XQueryTree(dpy, root, &rootReturn, &parentReturn,
+                                &children, &numChildren)) {
+                       for (i = 0; i < numChildren; i++) {
+                               Atom actual_type;
+                               int actual_format;
+                               unsigned long nitems, bytesafter;
+                               Window *newRoot = (Window *)0;
+
+                               if (XGetWindowProperty(dpy, children[i],
+                                       __SWM_VROOT, 0, 1, False, XA_WINDOW,
+                                       &actual_type, &actual_format,
+                                       &nitems, &bytesafter,
+                                       (unsigned char **) &newRoot) == Success
+                                   && newRoot) {
+                                   root = *newRoot;
+                                   break;
+                               }
+                       }
+                       if (children)
+                               XFree((char *)children);
+               }
+
+               save_screen = screen;
+       }
+
+       return root;
+}
+
+#undef RootWindowOfScreen
+#define RootWindowOfScreen(s) VirtualRootWindowOfScreen(s)
+
+#undef RootWindow
+#define RootWindow(dpy,screen) VirtualRootWindowOfScreen(ScreenOfDisplay(dpy,screen))
+
+#undef DefaultRootWindow
+#define DefaultRootWindow(dpy) VirtualRootWindowOfScreen(DefaultScreenOfDisplay(dpy))
+
+#endif /* _VROOT_H_ */
diff --git a/utils/xdbe.c b/utils/xdbe.c
new file mode 100644 (file)
index 0000000..af0ba3a
--- /dev/null
@@ -0,0 +1,74 @@
+/* xscreensaver, Copyright (c) 1998, 1999 by Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software 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.  No representations are made about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or 
+ * implied warranty.
+ */
+
+/* The XDBE (Double Buffering) extension is pretty tricky to use, since you
+   can get X errors at inconvenient times during initialization.  This file
+   contains a utility routine to make it easier to deal with.
+ */
+
+#include "utils.h"
+#include "xdbe.h"
+#include "resources.h"         /* for get_string_resource() */
+
+/* #define DEBUG */
+
+#ifdef DEBUG
+# include <X11/Xmu/Error.h>
+#endif
+
+extern char *progname;
+
+#ifdef HAVE_DOUBLE_BUFFER_EXTENSION    /* whole file */
+
+static Bool xdbe_got_x_error = False;
+static int
+xdbe_ehandler (Display *dpy, XErrorEvent *error)
+{
+  xdbe_got_x_error = True;
+
+#ifdef DEBUG
+  fprintf (stderr, "\n%s: ignoring X error from DOUBLE-BUFFER:\n", progname);
+  XmuPrintDefaultErrorMessage (dpy, error, stderr);
+  fprintf (stderr, "\n");
+#endif
+
+  return 0;
+}
+
+
+XdbeBackBuffer 
+xdbe_get_backbuffer (Display *dpy, Window window,
+                     XdbeSwapAction action)
+{
+  XdbeBackBuffer b;
+  XErrorHandler old_handler;
+  int maj, min;
+
+  if (!get_boolean_resource("useDBE", "Boolean"))
+    return 0;
+
+  if (!XdbeQueryExtension (dpy, &maj, &min))
+    return 0;
+
+  XSync (dpy, False);
+  xdbe_got_x_error = False;
+  old_handler = XSetErrorHandler (xdbe_ehandler);
+  b = XdbeAllocateBackBufferName(dpy, window, XdbeUndefined);
+  XSync (dpy, False);
+  XSetErrorHandler (old_handler);
+
+  if (xdbe_got_x_error)
+    return 0;
+
+  return b;
+}
+
+#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
diff --git a/utils/xdbe.h b/utils/xdbe.h
new file mode 100644 (file)
index 0000000..26f2de8
--- /dev/null
@@ -0,0 +1,27 @@
+/* xscreensaver, Copyright (c) 1998, 1999 by Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software 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.  No representations are made about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or 
+ * implied warranty.
+ */
+
+/* The XDBE (Double Buffering) extension is pretty tricky to use, since you
+   can get X errors at inconvenient times during initialization.  This file
+   contains a utility routine to make it easier to deal with.
+ */
+
+#ifndef __XSCREENSAVER_XDBE_H__
+
+#ifdef HAVE_DOUBLE_BUFFER_EXTENSION
+
+# include <X11/extensions/Xdbe.h>
+
+extern XdbeBackBuffer xdbe_get_backbuffer (Display *, Window, XdbeSwapAction);
+
+#endif /* HAVE_DOUBLE_BUFFER_EXTENSION */
+
+#endif /* __XSCREENSAVER_XDBE_H__ */
diff --git a/utils/xmu.c b/utils/xmu.c
new file mode 100644 (file)
index 0000000..6cd6f46
--- /dev/null
@@ -0,0 +1,176 @@
+/* This file contains compatibility routines for systems without Xmu.
+ * You would be better served by installing Xmu on your machine or
+ * yelling at your vendor to ship it.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#ifndef HAVE_XMU
+/*
+ * 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.
+ */
+
+#include "xmu.h"
+
+#ifndef NEED_EVENTS
+# define NEED_EVENTS           /* to make Xproto.h define xEvent */
+#endif
+#ifndef VMS
+# include <X11/Xproto.h>       /* for xEvent (used by Xlibint.h) */
+# include <X11/Xlibint.h>      /* for _XExtension */
+#else /* VMS */
+# include <X11/Xlib.h>
+#endif /* VMS */
+#include <X11/Intrinsic.h>     /* for XtSpecificationRelease */
+
+/*
+ * XmuPrintDefaultErrorMessage - print a nice error that looks like the usual 
+ * message.  Returns 1 if the caller should consider exitting else 0.
+ */
+int XmuPrintDefaultErrorMessage (Display *dpy, XErrorEvent *event, FILE *fp)
+{
+    char buffer[BUFSIZ];
+    char mesg[BUFSIZ];
+    char number[32];
+    char *mtype = "XlibMessage";
+    _XExtension *ext = (_XExtension *)NULL;
+    XGetErrorText(dpy, event->error_code, buffer, BUFSIZ);
+    XGetErrorDatabaseText(dpy, mtype, "XError", "X Error", mesg, BUFSIZ);
+    (void) fprintf(fp, "%s:  %s\n  ", mesg, buffer);
+    XGetErrorDatabaseText(dpy, mtype, "MajorCode", "Request Major code %d", 
+       mesg, BUFSIZ);
+    (void) fprintf(fp, mesg, event->request_code);
+    if (event->request_code < 128) {
+       sprintf(number, "%d", event->request_code);
+       XGetErrorDatabaseText(dpy, "XRequest", number, "", buffer, BUFSIZ);
+    } else {
+       /* XXX this is non-portable */
+       for (ext = dpy->ext_procs;
+            ext && (ext->codes.major_opcode != event->request_code);
+            ext = ext->next)
+         ;
+       if (ext)
+           strcpy(buffer, ext->name);
+       else
+           buffer[0] = '\0';
+    }
+    (void) fprintf(fp, " (%s)", buffer);
+    fputs("\n  ", fp);
+#if (XtSpecificationRelease >= 5)
+    if (event->request_code >= 128) {
+       XGetErrorDatabaseText(dpy, mtype, "MinorCode", "Request Minor code %d",
+                             mesg, BUFSIZ);
+       (void) fprintf(fp, mesg, event->minor_code);
+       if (ext) {
+           sprintf(mesg, "%s.%d", ext->name, event->minor_code);
+           XGetErrorDatabaseText(dpy, "XRequest", mesg, "", buffer, BUFSIZ);
+           (void) fprintf(fp, " (%s)", buffer);
+       }
+       fputs("\n  ", fp);
+    }
+    if (event->error_code >= 128) {
+       /* let extensions try to print the values */
+       /* XXX this is non-portable code */
+       for (ext = dpy->ext_procs; ext; ext = ext->next) {
+           if (ext->error_values)
+               (*ext->error_values)(dpy, event, fp);
+       }
+       /* the rest is a fallback, providing a simple default */
+       /* kludge, try to find the extension that caused it */
+       buffer[0] = '\0';
+       for (ext = dpy->ext_procs; ext; ext = ext->next) {
+           if (ext->error_string) 
+               (*ext->error_string)(dpy, event->error_code, &ext->codes,
+                                    buffer, BUFSIZ);
+           if (buffer[0])
+               break;
+       }    
+       if (buffer[0])
+           sprintf(buffer, "%s.%d", ext->name,
+                   event->error_code - ext->codes.first_error);
+       else
+           strcpy(buffer, "Value");
+       XGetErrorDatabaseText(dpy, mtype, buffer, "", mesg, BUFSIZ);
+       if (*mesg) {
+           (void) fprintf(fp, mesg, event->resourceid);
+           fputs("\n  ", fp);
+       }
+    } else if ((event->error_code == BadWindow) ||
+              (event->error_code == BadPixmap) ||
+              (event->error_code == BadCursor) ||
+              (event->error_code == BadFont) ||
+              (event->error_code == BadDrawable) ||
+              (event->error_code == BadColor) ||
+              (event->error_code == BadGC) ||
+              (event->error_code == BadIDChoice) ||
+              (event->error_code == BadValue) ||
+              (event->error_code == BadAtom)) {
+       if (event->error_code == BadValue)
+           XGetErrorDatabaseText(dpy, mtype, "Value", "Value 0x%x",
+                                 mesg, BUFSIZ);
+       else if (event->error_code == BadAtom)
+           XGetErrorDatabaseText(dpy, mtype, "AtomID", "AtomID 0x%x",
+                                 mesg, BUFSIZ);
+       else
+           XGetErrorDatabaseText(dpy, mtype, "ResourceID", "ResourceID 0x%x",
+                                 mesg, BUFSIZ);
+       (void) fprintf(fp, mesg, event->resourceid);
+       fputs("\n  ", fp);
+    }
+#elif (XtSpecificationRelease == 4)
+    XGetErrorDatabaseText(dpy, mtype, "MinorCode", "Request Minor code %d",
+                         mesg, BUFSIZ);
+    (void) fprintf(fp, mesg, event->minor_code);
+    fputs("\n  ", fp);
+    if (ext) {
+      sprintf(mesg, "%s.%d", ext->name, event->minor_code);
+      XGetErrorDatabaseText(dpy, "XRequest", mesg, "", buffer, BUFSIZ);
+      (void) fprintf(fp, " (%s)", buffer);
+    }
+    XGetErrorDatabaseText(dpy, mtype, "ResourceID", "ResourceID 0x%x",
+                         mesg, BUFSIZ);
+    (void) fprintf(fp, mesg, event->resourceid);
+    fputs("\n  ", fp);
+#else
+ERROR! Unsupported release of X11
+#endif
+    XGetErrorDatabaseText(dpy, mtype, "ErrorSerial", "Error Serial #%d", 
+       mesg, BUFSIZ);
+    (void) fprintf(fp, mesg, event->serial);
+    fputs("\n  ", fp);
+    XGetErrorDatabaseText(dpy, mtype, "CurrentSerial", "Current Serial #%d",
+       mesg, BUFSIZ);
+    (void) fprintf(fp, mesg, NextRequest(dpy)-1);
+    fputs("\n", fp);
+    if (event->error_code == BadImplementation) return 0;
+    return 1;
+}
+
+#else  /* HAVE_XMU */
+
+# ifdef __osf__
+  /* Stupid alpha 3.2 compiler returns a FAILURE exit code if compiling
+     an empty file.  Fake it out with a file-private variable. */
+  static const int digital_unix_compiler_sucks;
+# endif /* __osf__ */
+
+#endif /* HAVE_XMU */
diff --git a/utils/xmu.h b/utils/xmu.h
new file mode 100644 (file)
index 0000000..48084f7
--- /dev/null
@@ -0,0 +1,14 @@
+/* This file contains compatibility routines for systems without Xmu.
+ * You would be better served by installing Xmu on your machine or
+ * yelling at your vendor to ship it.
+ */
+
+#ifndef __XMU_H__
+#define __XMU_H__
+
+#include <X11/Xlib.h>
+#include <stdio.h>
+
+int XmuPrintDefaultErrorMessage (Display *dpy, XErrorEvent *event, FILE *fp);
+
+#endif /* __XMU_H__ */
diff --git a/utils/xroger.c b/utils/xroger.c
new file mode 100644 (file)
index 0000000..adbf3aa
--- /dev/null
@@ -0,0 +1,134 @@
+/* xscreensaver, Copyright (c) 1991-1998 Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software 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.  No representations are made about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or 
+ * implied warranty.
+ */
+
+#include "utils.h"
+
+static void
+crossbones (Display *dpy, Window window, GC draw_gc,
+           int x, int y, int w, int h)
+{
+  double xscale = w / 440.0;
+  double yscale = h / 216.0;
+  XPoint points [6];
+  points[0].x = x + xscale * 20;  points[0].y = y + yscale * 10;
+  points[1].x = x + xscale * 120; points[1].y = y + yscale * 10;
+  points[2].x = x + xscale * 243; points[2].y = y + yscale * 93;
+  points[3].x = x + xscale * 57;  points[3].y = y + yscale * 210;
+  points[4].x = x + xscale * 20;  points[4].y = y + yscale * 210;
+  points[5].x = x + xscale * 175; points[5].y = y + yscale * 113;
+  XFillPolygon (dpy, window, draw_gc, points, 6, Complex, CoordModeOrigin);
+  points[0].x = x + xscale * 202; points[0].y = y + yscale * 132;
+  points[1].x = x + xscale * 384; points[1].y = y + yscale * 10;
+  points[2].x = x + xscale * 420; points[2].y = y + yscale * 10;
+  points[3].x = x + xscale * 270; points[3].y = y + yscale * 113;
+  points[4].x = x + xscale * 420; points[4].y = y + yscale * 210;
+  points[5].x = x + xscale * 320; points[5].y = y + yscale * 210;
+  XFillPolygon (dpy, window, draw_gc, points, 6, Complex, CoordModeOrigin);
+}
+
+
+#include "spline.h"
+
+void
+skull (Display *dpy, Window window, GC draw_gc, GC erase_gc,
+       int x, int y, int w, int h)
+{
+  spline s;
+  float w100, h100;
+  XPoint points [20];
+  double sx[20], sy[20];
+  int i;
+
+  memset(&s, 0, sizeof(s));
+  s.control_x = sx;
+  s.control_y = sy;
+
+  y -= (w * 0.025);
+
+  crossbones (dpy, window, draw_gc, x, y+(h/2), w, (h / 3));
+
+  x += (w * 0.27);
+  y += (h * 0.25);
+  w *= 0.6;
+  h *= 0.6;
+
+  w100 = w / 100.0;
+  h100 = h / 100.0;
+
+  points[ 0].x = x + (0   * w100); points[ 0].y = y + (10 * h100);
+  points[ 1].x = x + (10  * w100); points[ 1].y = y + (0  * h100);
+  points[ 2].x = x + (90  * w100); points[ 2].y = y + (0  * h100);
+  points[ 3].x = x + (100 * w100); points[ 3].y = y + (10 * h100);
+  points[ 4].x = x + (100 * w100); points[ 4].y = y + (30 * h100);
+  points[ 5].x = x + (90  * w100); points[ 5].y = y + (40 * h100);
+  points[ 6].x = x + (70  * w100); points[ 6].y = y + (40 * h100);
+  points[ 7].x = x + (70  * w100); points[ 7].y = y + (50 * h100);
+  points[ 8].x = x + (30  * w100); points[ 8].y = y + (50 * h100);
+  points[ 9].x = x + (30  * w100); points[ 9].y = y + (40 * h100);
+  points[10].x = x + (10  * w100); points[10].y = y + (40 * h100);
+  points[11].x = x + (0   * w100); points[11].y = y + (30 * h100);
+
+  for (i = 0; i < 12; i++)
+    sx[i] = points[i].x, sy[i] = points[i].y;
+  s.n_controls = i;
+  s.allocated_points = i;
+  s.points = (XPoint *) calloc (i, sizeof (*s.points));
+  compute_closed_spline(&s);
+
+  XFillPolygon (dpy, window, draw_gc, points+6, 4, Complex, CoordModeOrigin);
+  XFillPolygon (dpy, window, draw_gc, s.points, s.n_points,
+               Complex, CoordModeOrigin);
+
+  points[0].x = x + (20  * w100); points[0].y = y + (18 * h100);
+  points[1].x = x + (25  * w100); points[1].y = y + (15 * h100);
+  points[2].x = x + (43  * w100); points[2].y = y + (15 * h100);
+  points[3].x = x + (45  * w100); points[3].y = y + (17 * h100);
+  points[4].x = x + (45  * w100); points[4].y = y + (25 * h100);
+  points[5].x = x + (40  * w100); points[5].y = y + (30 * h100);
+  points[6].x = x + (30  * w100); points[6].y = y + (30 * h100);
+  points[7].x = x + (20  * w100); points[7].y = y + (23 * h100);
+  for (i = 0; i < 8; i++)
+    sx[i] = points[i].x, sy[i] = points[i].y;
+  s.n_controls = i;
+  compute_closed_spline(&s);
+  XFillPolygon (dpy, window, erase_gc, s.points, s.n_points,
+               Complex, CoordModeOrigin);
+
+  points[0].x = x + (80  * w100); points[0].y = y + (18 * h100);
+  points[1].x = x + (75  * w100); points[1].y = y + (15 * h100);
+  points[2].x = x + (57  * w100); points[2].y = y + (15 * h100);
+  points[3].x = x + (55  * w100); points[3].y = y + (17 * h100);
+  points[4].x = x + (55  * w100); points[4].y = y + (25 * h100);
+  points[5].x = x + (60  * w100); points[5].y = y + (30 * h100);
+  points[6].x = x + (70  * w100); points[6].y = y + (30 * h100);
+  points[7].x = x + (80  * w100); points[7].y = y + (23 * h100);
+  for (i = 0; i < 8; i++)
+    sx[i] = points[i].x, sy[i] = points[i].y;
+  s.n_controls = i;
+  compute_closed_spline(&s);
+  XFillPolygon (dpy, window, erase_gc, s.points, s.n_points,
+               Complex, CoordModeOrigin);
+
+  points[ 0].x = x + (48  * w100); points[ 0].y = y + (30 * h100);
+  points[ 1].x = x + (52  * w100); points[ 1].y = y + (30 * h100);
+  points[ 2].x = x + (56  * w100); points[ 2].y = y + (42 * h100);
+  points[ 3].x = x + (52  * w100); points[ 3].y = y + (45 * h100);
+  points[ 4].x = x + (48  * w100); points[ 4].y = y + (45 * h100);
+  points[ 5].x = x + (44  * w100); points[ 5].y = y + (42 * h100);
+  for (i = 0; i < 6; i++)
+    sx[i] = points[i].x, sy[i] = points[i].y;
+  s.n_controls = i;
+  compute_closed_spline(&s);
+  XFillPolygon (dpy, window, erase_gc, s.points, s.n_points,
+               Complex, CoordModeOrigin);
+
+  free(s.points);
+}
diff --git a/utils/xshm.c b/utils/xshm.c
new file mode 100644 (file)
index 0000000..c9498e5
--- /dev/null
@@ -0,0 +1,192 @@
+/* xscreensaver, Copyright (c) 1993, 1994, 1995, 1996, 1997, 1998
+ *  by Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software 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.  No representations are made about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or 
+ * implied warranty.
+ */
+
+/* The MIT-SHM (Shared Memory) extension is pretty tricky to use.
+   This file contains the common boiler-plate for creating a shared
+   XImage structure, and for making sure that the shared memory segments
+   get allocated and shut down cleanly.
+
+   This code currently deals only with shared XImages, not with shared Pixmaps.
+   It also doesn't use "completion events", but so far that doesn't seem to
+   be a problem (and I'm not entirely clear on when they would actually be
+   needed, anyway.)
+
+   If you don't have man pages for this extension, see
+   http://www.physik.uni-regensburg.de/~scs22156/sofie-0.2/mit-shm.html
+   or in the R6 sources as "xc/doc/specs/Xext/mit-shm.ms", for example,
+   ftp://ftp.x.org/pub/R6.4/xc/doc/specs/Xext/mit-shm.ms
+
+   (This document seems not to ever remain available on the web in one place
+   for very long; you can search for it by the title, "MIT-SHM -- The MIT
+   Shared Memory Extension".)
+
+   To monitor the system's shared memory segments, run "ipcs -m".
+  */
+
+#include "utils.h"
+
+#ifdef HAVE_XSHM_EXTENSION     /* whole file */
+
+/* #define DEBUG */
+
+#include <errno.h>             /* for perror() */
+#include <X11/Xutil.h>         /* for XDestroyImage() */
+
+#include "xshm.h"
+#include "resources.h"         /* for get_string_resource() */
+
+#ifdef DEBUG
+# include <X11/Xmu/Error.h>
+#endif
+
+extern char *progname;
+
+
+/* The documentation for the XSHM extension implies that if the server
+   supports XSHM but is not the local machine, the XShm calls will return
+   False; but this turns out not to be the case.  Instead, the server
+   throws a BadAccess error.  So, we need to catch X errors around all
+   of our XSHM calls, sigh.
+ */
+
+static Bool shm_got_x_error = False;
+XErrorHandler old_handler = 0;
+static int
+shm_ehandler (Display *dpy, XErrorEvent *error)
+{
+  shm_got_x_error = True;
+
+#ifdef DEBUG
+  fprintf (stderr, "\n%s: ignoring X error from XSHM:\n", progname);
+  XmuPrintDefaultErrorMessage (dpy, error, stderr);
+  fprintf (stderr, "\n");
+#endif
+
+  return 0;
+}
+
+
+#define CATCH_X_ERROR(DPY) do {                                \
+  XSync((DPY), False);                                         \
+  shm_got_x_error = False;                             \
+  if (old_handler != shm_ehandler)                     \
+    old_handler = XSetErrorHandler (shm_ehandler);     \
+} while(0)
+
+#define UNCATCH_X_ERROR(DPY) do {                      \
+  XSync((DPY), False);                                         \
+  if (old_handler)                                     \
+    XSetErrorHandler (old_handler);                    \
+    old_handler = 0;                                   \
+} while(0)
+
+
+XImage *
+create_xshm_image (Display *dpy, Visual *visual,
+                  unsigned int depth,
+                  int format, char *data,
+                  XShmSegmentInfo *shm_info,
+                  unsigned int width, unsigned int height)
+{
+  Status status;
+  XImage *image = 0;
+  if (!get_boolean_resource("useSHM", "Boolean"))
+    return 0;
+
+  if (!XShmQueryExtension (dpy))
+    return 0;
+
+  CATCH_X_ERROR(dpy);
+  image = XShmCreateImage(dpy, visual, depth,
+                         format, data, shm_info, width, height);
+  UNCATCH_X_ERROR(dpy);
+  if (shm_got_x_error)
+    return 0;
+
+#ifdef DEBUG
+  fprintf(stderr, "\n%s: XShmCreateImage(... %d, %d)\n", progname,
+         width, height);
+#endif
+
+  shm_info->shmid = shmget(IPC_PRIVATE,
+                          image->bytes_per_line * image->height,
+                          IPC_CREAT | 0777);
+#ifdef DEBUG
+  fprintf(stderr, "%s: shmget(IPC_PRIVATE, %d, IPC_CREAT | 0777) ==> %d\n",
+         progname, image->bytes_per_line * image->height, shm_info->shmid);
+#endif
+
+  if (shm_info->shmid == -1)
+    {
+      char buf[1024];
+      sprintf (buf, "%s: shmget failed", progname);
+      perror(buf);
+      XDestroyImage (image);
+      image = 0;
+      XSync(dpy, False);
+    }
+  else
+    {
+      shm_info->readOnly = False;
+      image->data = shm_info->shmaddr = shmat(shm_info->shmid, 0, 0);
+
+#ifdef DEBUG
+      fprintf(stderr, "%s: shmat(%d, 0, 0) ==> %d\n", progname,
+             shm_info->shmid, (int) image->data);
+#endif
+
+      CATCH_X_ERROR(dpy);
+      status = XShmAttach(dpy, shm_info);
+      UNCATCH_X_ERROR(dpy);
+      if (shm_got_x_error)
+       status = False;
+
+      if (!status)
+       {
+         fprintf (stderr, "%s: XShmAttach failed!\n", progname);
+         XDestroyImage (image);
+         XSync(dpy, False);
+         shmdt (shm_info->shmaddr);
+         image = 0;
+       }
+#ifdef DEBUG
+      else
+        fprintf(stderr, "%s: XShmAttach(dpy, shm_info) ==> True\n", progname);
+#endif
+
+      XSync(dpy, False);
+
+      /* Delete the shared segment right now; the segment won't actually
+        go away until both the client and server have deleted it.  The
+        server will delete it as soon as the client disconnects, so we
+        should delete our side early in case of abnormal termination.
+        (And note that, in the context of xscreensaver, abnormal
+        termination is the rule rather than the exception, so this would
+        leak like a sieve if we didn't do this...)
+
+        #### Are we leaking anyway?  Perhaps because of the window of
+        opportunity between here and the XShmAttach call above, during
+        which we might be killed?  Do we need to establish a signal
+        handler for this case?
+       */
+      shmctl (shm_info->shmid, IPC_RMID, 0);
+
+#ifdef DEBUG
+      fprintf(stderr, "%s: shmctl(%d, IPC_RMID, 0)\n\n", progname,
+             shm_info->shmid);
+#endif
+    }
+
+  return image;
+}
+
+#endif /* HAVE_XSHM_EXTENSION */
diff --git a/utils/xshm.h b/utils/xshm.h
new file mode 100644 (file)
index 0000000..54e492e
--- /dev/null
@@ -0,0 +1,35 @@
+/* xscreensaver, Copyright (c) 1993, 1994, 1995, 1996, 1997, 1998
+ *  by Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software 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.  No representations are made about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or 
+ * implied warranty.
+ */
+
+/* The MIT-SHM (Shared Memory) extension is pretty tricky to use.
+   This file contains the common boiler-plate for creating a shared
+   XImage structure, and for making sure that the shared memory segments
+   get allocated and shut down cleanly.
+ */
+
+#ifndef __XSCREENSAVER_XSHM_H__
+
+#ifdef HAVE_XSHM_EXTENSION
+
+# include <sys/ipc.h>
+# include <sys/shm.h>
+# include <X11/extensions/XShm.h>
+
+extern XImage *create_xshm_image (Display *dpy, Visual *visual,
+                                 unsigned int depth,
+                                 int format, char *data,
+                                 XShmSegmentInfo *shm_info,
+                                 unsigned int width, unsigned int height);
+
+#endif /* HAVE_XSHM_EXTENSION */
+
+#endif /* __XSCREENSAVER_XSHM_H__ */
diff --git a/utils/yarandom.c b/utils/yarandom.c
new file mode 100644 (file)
index 0000000..63958e2
--- /dev/null
@@ -0,0 +1,114 @@
+/* yarandom.c -- Yet Another Random Number Generator.
+
+   The unportable mess that is rand(), random(), drand48() and friends led me
+   to ask Phil Karlton <karlton@netscape.com> what the Right Thing to Do was.
+   He responded with this.  It is non-cryptographically secure, reasonably
+   random (more so than anything that is in any C library), and very fast.
+
+   I don't understand how it works at all, but he says "look at Knuth,
+   Vol. 2 (original edition), page 26, Algorithm A.  In this case n=55,
+   k=20 and m=2^32."
+
+   So there you have it.
+
+   ---------------------------
+   Note: xlockmore 4.03a10 uses this very simple RNG:
+
+       if ((seed = seed % 44488 * 48271 - seed / 44488 * 3399) < 0)
+         seed += 2147483647;
+       return seed-1;
+
+   of which it says
+
+       ``Dr. Park's algorithm published in the Oct. '88 ACM  "Random Number
+         Generators: Good Ones Are Hard To Find" His version available at
+         ftp://cs.wm.edu/pub/rngs.tar Present form by many authors.''
+
+   Karlton says: ``the usual problem with that kind of RNG turns out to
+   be unexepected short cycles for some word lengths.''
+
+   Karlton's RNG is faster, since it does three adds and two stores, while the
+   xlockmore RNG does two multiplies, two divides, three adds, and one store.
+
+   Compiler optimizations make a big difference here:
+       gcc -O:     difference is 1.2x.
+       gcc -O2:    difference is 1.4x.
+       gcc -O3:    difference is 1.5x.
+       SGI cc -O:  difference is 2.4x.
+       SGI cc -O2: difference is 2.4x.
+       SGI cc -O3: difference is 5.1x.
+   Irix 6.2; Indy r5k; SGI cc version 6; gcc version 2.7.2.1.
+ */
+
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>  /* for getpid() */
+#endif
+#include <sys/time.h> /* for gettimeofday() */
+
+#include "yarandom.h"
+
+
+/* The following 'random' numbers are taken from CRC, 18th Edition, page 622.
+   Each array element was taken from the corresponding line in the table,
+   except that a[0] was from line 100. 8s and 9s in the table were simply
+   skipped. The high order digit was taken mod 4.
+ */
+#define VectorSize 55
+static unsigned int a[VectorSize] = {
+ 035340171546, 010401501101, 022364657325, 024130436022, 002167303062, /*  5 */
+ 037570375137, 037210607110, 016272055420, 023011770546, 017143426366, /* 10 */
+ 014753657433, 021657231332, 023553406142, 004236526362, 010365611275, /* 14 */
+ 007117336710, 011051276551, 002362132524, 001011540233, 012162531646, /* 20 */
+ 007056762337, 006631245521, 014164542224, 032633236305, 023342700176, /* 25 */
+ 002433062234, 015257225043, 026762051606, 000742573230, 005366042132, /* 30 */
+ 012126416411, 000520471171, 000725646277, 020116577576, 025765742604, /* 35 */
+ 007633473735, 015674255275, 017555634041, 006503154145, 021576344247, /* 40 */
+ 014577627653, 002707523333, 034146376720, 030060227734, 013765414060, /* 45 */
+ 036072251540, 007255221037, 024364674123, 006200353166, 010126373326, /* 50 */
+ 015664104320, 016401041535, 016215305520, 033115351014, 017411670323  /* 55 */
+};
+
+static int i1, i2;
+
+unsigned int
+ya_random (void)
+{
+  register int ret = a[i1] + a[i2];
+  a[i1] = ret;
+  if (++i1 >= VectorSize) i1 = 0;
+  if (++i2 >= VectorSize) i2 = 0;
+  return ret;
+}
+
+void
+ya_rand_init(unsigned int seed)
+{
+  int i;
+  if (seed == 0)
+    {
+      struct timeval tp;
+#ifdef GETTIMEOFDAY_TWO_ARGS
+      struct timezone tzp;
+      gettimeofday(&tp, &tzp);
+#else
+      gettimeofday(&tp);
+#endif
+      /* ignore overflow */
+      seed = (999*tp.tv_sec) + (1001*tp.tv_usec) + (1003 * getpid());
+    }
+
+  a[0] += seed;
+  for (i = 1; i < VectorSize; i++)
+    {
+      seed = a[i-1]*1001 + seed*999;
+      a[i] += seed;
+    }
+
+  i1 = a[0] % VectorSize;
+  i2 = (i1 + 024) % VectorSize;
+}
diff --git a/utils/yarandom.h b/utils/yarandom.h
new file mode 100644 (file)
index 0000000..abea226
--- /dev/null
@@ -0,0 +1,54 @@
+/* xscreensaver, Copyright (c) 1997, 1998 by Jamie Zawinski <jwz@jwz.org>
+ *
+ * Permission to use, copy, modify, distribute, and sell this software 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.  No representations are made about the suitability of this
+ * software for any purpose.  It is provided "as is" without express or 
+ * implied warranty.
+ */
+
+#ifndef __YARANDOM_H__
+#define __YARANDOM_H__
+
+#undef random
+#undef rand
+#undef drand48
+#undef srandom
+#undef srand
+#undef srand48
+#undef frand
+#undef RAND_MAX
+
+#ifdef VMS
+# include "vms-gtod.h"
+#endif
+
+#define random()   ya_random()
+#define srandom(i) ya_rand_init(0)
+#define RAND_MAX   0x7FFFFFFF
+
+extern unsigned int ya_random (void);
+extern void ya_rand_init (unsigned int);
+
+
+#if defined (__GNUC__) && (__GNUC__ >= 2)
+ /* Implement frand using GCC's statement-expression extension. */
+
+# define frand(f)                                                      \
+  ({ double tmp = (((double) random()) /                               \
+                  (((double) ((unsigned int)~0)) / ((double) (f))));   \
+     tmp < 0 ? (-tmp) : tmp; })
+
+#else /* not GCC2 - implement frand using a global variable.*/
+
+static double _frand_tmp_;
+# define frand(f)                                                      \
+  (_frand_tmp_ = (((double) random()) /                                \
+                 (((double) ((unsigned int)~0)) / ((double) (f)))),    \
+   _frand_tmp_ < 0 ? (-_frand_tmp_) : _frand_tmp_)
+
+#endif /* not GCC2 */
+
+#endif /* __YARANDOM_H__ */
diff --git a/xscreensaver.lsm b/xscreensaver.lsm
new file mode 100644 (file)
index 0000000..6400300
--- /dev/null
@@ -0,0 +1,31 @@
+Begin3
+Title:          xscreensaver
+Version:        3.16
+Entered-date:   23JUN99
+Description:    A modular screen saver and locker for the X Window System.
+                Highly customizable: allows the use of any program that
+                can draw on the root window as a display mode.
+                Comes with more than 100 display modes.
+Keywords:       screen saver, screen lock, lock, xlock, X11
+Author:         jwz@jwz.org (Jamie Zawinski)
+Maintained-by:  jwz@jwz.org (Jamie Zawinski)
+Primary-site:   http://www.jwz.org/xscreensaver/
+                1135K xscreensaver-3.16.tar.gz
+                35K  xscreensaver.README
+                1K   xscreensaver.lsm
+Alternate-site: sunsite.unc.edu /pub/Linux/X11/screensavers/
+                1135K xscreensaver-3.16.tar.gz
+                35K  xscreensaver.README
+                1K   xscreensaver.lsm
+Alternate-site: ftp.x.org /contrib/applications/
+                1135K xscreensaver-3.16.tar.gz
+                35K  xscreensaver.README
+                1K   xscreensaver.lsm
+Platforms:      Linux, Irix, SunOS, Solaris, HPUX, AIX, FreeBSD, NetBSD,
+                BSDI, SCO, OSF1, Ultrix, VMS.
+                Requires X11 and ANSI C.
+                Works with Motif or Athena.
+                Shadow passwords, Kerberos, and OpenGL optionally supported.
+                Multi-headed machines supported.
+Copying-policy: BSD
+End
diff --git a/xscreensaver.lsm.sh b/xscreensaver.lsm.sh
new file mode 100755 (executable)
index 0000000..b3126f0
--- /dev/null
@@ -0,0 +1,56 @@
+#!/bin/sh
+#
+# generate an lsm file (http://sunsite.unc.edu/pub/Linux/Incoming/LSM-TEMPLATE)
+# that is more-or-less correct for the current version of xscreensaver.
+# jwz, 18-Jan-98
+
+size() {
+    ls -l $* |
+    tail -1 |
+    sed 's/.* \([0-9][0-9][0-9][0-9][0-9]*\) .*/\1/' |
+    sed 's/[0-9][0-9][0-9]$/K/'
+}
+
+TAR_SIZE=`size xscreensaver-*.gz`
+README_SIZE=`size README`
+#LSM_SIZE=`size xscreensaver.lsm`
+LSM_SIZE="1K"
+
+VERSION=`sed -n 's/.*\([0-9][0-9]*\.[0-9]*\).*/\1/p' < utils/version.h`
+DATE=`date '+%d%b%y' | tr a-z A-Z`
+
+#URL=`sed -n 's/\(http:[^ ]*\)/\1/p' < README | sed 's/[^a-zA-Z/]$//'`
+
+echo "Begin3
+Title:          xscreensaver
+Version:        $VERSION
+Entered-date:   $DATE
+Description:    A modular screen saver and locker for the X Window System.
+                Highly customizable: allows the use of any program that
+                can draw on the root window as a display mode.
+                Comes with more than 100 display modes.
+Keywords:       screen saver, screen lock, lock, xlock, X11
+Author:         jwz@jwz.org (Jamie Zawinski)
+Maintained-by:  jwz@jwz.org (Jamie Zawinski)
+Primary-site:   http://www.jwz.org/xscreensaver/
+                $TAR_SIZE xscreensaver-$VERSION.tar.gz
+                $README_SIZE  xscreensaver.README
+                $LSM_SIZE   xscreensaver.lsm
+Alternate-site: sunsite.unc.edu /pub/Linux/X11/screensavers/
+                $TAR_SIZE xscreensaver-$VERSION.tar.gz
+                $README_SIZE  xscreensaver.README
+                $LSM_SIZE   xscreensaver.lsm
+Alternate-site: ftp.x.org /contrib/applications/
+                $TAR_SIZE xscreensaver-$VERSION.tar.gz
+                $README_SIZE  xscreensaver.README
+                $LSM_SIZE   xscreensaver.lsm
+Platforms:      Linux, Irix, SunOS, Solaris, HPUX, AIX, FreeBSD, NetBSD,
+                BSDI, SCO, OSF1, Ultrix, VMS.
+                Requires X11 and ANSI C.
+                Works with Motif or Athena.
+                Shadow passwords, Kerberos, and OpenGL optionally supported.
+                Multi-headed machines supported.
+Copying-policy: BSD
+End"
+
+exit 0
diff --git a/xscreensaver.spec b/xscreensaver.spec
new file mode 100644 (file)
index 0000000..e3085f4
--- /dev/null
@@ -0,0 +1,110 @@
+Name: xscreensaver
+Summary: X screen saver and locker
+Vendor: Jamie Zawinski <jwz@jwz.org>
+Version: 3.16
+Release: 1
+URL: http://www.jwz.org/xscreensaver/
+Source: xscreensaver-%{version}.tar.gz
+Copyright: BSD
+Group: X11/Utilities
+Buildroot: /var/tmp/xscreensaver-root
+
+%description
+A modular screen saver and locker for the X Window System.
+Highly customizable: allows the use of any program that
+can draw on the root window as a display mode.
+More than 100 display modes are included in this package.
+
+%prep
+
+%setup -q
+
+%build
+
+./configure --prefix=/usr/X11R6 \
+     --enable-subdir=/usr/X11R6/lib/xscreensaver
+make all
+
+%install
+
+# This is the only directory that "make install" won't make as needed
+# (since Linux uses /etc/pam.d/* and Solaris uses /etc/pam.conf).
+#
+mkdir -p $RPM_BUILD_ROOT/etc/pam.d
+
+make  prefix=$RPM_BUILD_ROOT/usr/X11R6 \
+      AD_DIR=$RPM_BUILD_ROOT/usr/X11R6/lib/X11/app-defaults \
+     HACKDIR=$RPM_BUILD_ROOT/usr/X11R6/lib/xscreensaver \
+     PAM_DIR=$RPM_BUILD_ROOT/etc/pam.d \
+     install-strip
+
+# This line is redundant, except that it causes the "xscreensaver"
+# executable to be installed unstripped (while all others are stripped.)
+# You should install it this way so that jwz gets useful bug reports.
+#
+install -m 4755 driver/xscreensaver $RPM_BUILD_ROOT/usr/X11R6/bin
+
+# Even if we weren't compiled with PAM support, make sure to include
+# the PAM module file in the RPM anyway, just in case.
+#
+( cd driver; make PAM_DIR=$RPM_BUILD_ROOT/etc/pam.d install-pam )
+
+# If we built multiple versions of xscreensaver-demo (because multiple
+# toolkits were available) then install them all.
+#
+( cd driver;
+  exes=`echo xscreensaver-demo-*`
+  count=`echo $exes | wc -w`
+  if [ $count -gt 1 ]; then
+    for exe in $exes; do
+      install -c -s $exe $RPM_BUILD_ROOT/usr/X11R6/bin
+    done
+    cd $RPM_BUILD_ROOT/usr/X11R6/bin
+    if [ -x xscreensaver-demo-Xaw3d ]; then target=Xaw3d; fi
+    if [ -x xscreensaver-demo-Xaw   ]; then target=Xaw;   fi
+    if [ -x xscreensaver-demo-Gtk   ]; then target=Gtk;   fi
+    if [ -x xscreensaver-demo-Xm    ]; then target=Xm;    fi
+    rm -f xscreensaver-demo
+    ln -s xscreensaver-demo-$target xscreensaver-demo
+  fi
+ )
+
+
+# This is for wmconfig, a tool that generates init files for window managers.
+#
+mkdir -p $RPM_BUILD_ROOT/etc/X11/wmconfig
+cat > $RPM_BUILD_ROOT/etc/X11/wmconfig/xscreensaver <<EOF
+xscreensaver name "xscreensaver (1min timeout)"
+xscreensaver description "xscreensaver"
+xscreensaver group "Amusements/Screen Savers"
+xscreensaver exec "xscreensaver -timeout 1 -cycle 1 &"
+EOF
+
+# This is for the GNOME desktop:
+#
+mkdir -p "$RPM_BUILD_ROOT/usr/share/apps/Amusements/Screen Savers"
+cat > "$RPM_BUILD_ROOT/usr/share/apps/Amusements/Screen Savers/xscreensaver.desktop" <<EOF
+[Desktop Entry]
+Name=xscreensaver (1min timeout)
+Description=xscreensaver
+Exec=xscreensaver -timeout 1 -cycle 1
+EOF
+
+# Make sure all files are readable by all, and writable only by owner.
+#
+chmod -R a+r,u+w,og-w $RPM_BUILD_ROOT
+
+%clean
+rm -rf $RPM_BUILD_ROOT
+
+%files
+%defattr(-,root,root)
+
+%doc                README README.debugging
+                    /usr/X11R6/bin/*
+                    /usr/X11R6/lib/xscreensaver/*
+%config             /usr/X11R6/lib/X11/app-defaults/*
+                    /usr/X11R6/man/man1/*
+                    /etc/pam.d/*
+%config(missingok)  /etc/X11/wmconfig/*
+%config(missingok)  "/usr/share/apps/Amusements/Screen Savers/*"